From 50077746f0179602cb7a43380df97ea791256bb8 Mon Sep 17 00:00:00 2001 From: Kilian Hofmann Date: Tue, 15 Jul 2025 11:02:25 +0200 Subject: [PATCH] Prettier Refactor overfly fix --- .vscode/launch.json | 3 +- TODO.md | 16 + browser/.prettierrc.cjs | 9 + browser/eslint.config.js | 20 +- browser/package.json | 2 + browser/pnpm-lock.yaml | 957 +++++++++++------- browser/src/App.tsx | 78 +- browser/src/main.tsx | 12 +- browser/src/parser/node.ts | 17 +- browser/src/parser/parser.ts | 227 ++--- .../parser/pathGenerators/generateAFArc.ts | 14 +- .../pathGenerators/generateOverflyArc.ts | 44 + .../pathGenerators/generatePerformanceArc.ts | 14 +- .../parser/pathGenerators/generateRFArc.ts | 32 +- .../pathGenerators/generateTangentArc.ts | 36 +- .../parser/pathGenerators/handleTurnAtFix.ts | 25 +- browser/src/parser/terminators/AF.ts | 6 +- browser/src/parser/terminators/CA.ts | 40 +- browser/src/parser/terminators/CD.ts | 43 +- browser/src/parser/terminators/CF.ts | 5 +- browser/src/parser/terminators/CI.ts | 25 +- browser/src/parser/terminators/CR.ts | 36 +- browser/src/parser/terminators/DF.ts | 36 +- browser/src/parser/terminators/FA.ts | 40 +- browser/src/parser/terminators/FC.ts | 22 +- browser/src/parser/terminators/FD.ts | 43 +- browser/src/parser/terminators/FM.ts | 12 +- browser/src/parser/terminators/IF.ts | 7 +- browser/src/parser/terminators/RF.ts | 6 +- browser/src/parser/terminators/TF.ts | 23 +- browser/src/parser/terminators/VA.ts | 40 +- browser/src/parser/terminators/VD.ts | 43 +- browser/src/parser/terminators/VI.ts | 20 +- browser/src/parser/terminators/VM.ts | 12 +- browser/src/parser/terminators/VR.ts | 35 +- .../src/parser/utils/computeIntersection.ts | 44 +- browser/src/parser/utils/computeSpeed.ts | 2 +- browser/src/parser/utils/extensions.ts | 6 +- .../utils/getCourseAndFixForIntercepts.ts | 15 +- browser/src/types/geojson.d.ts | 2 +- browser/src/types/leaflet.d.ts | 24 +- browser/src/types/magvar.d.ts | 2 +- browser/src/types/terminators/AF.d.ts | 11 +- browser/src/types/terminators/CA.d.ts | 3 +- browser/src/types/terminators/CD.d.ts | 4 +- browser/src/types/terminators/CF.d.ts | 11 +- browser/src/types/terminators/CI.d.ts | 3 +- browser/src/types/terminators/CR.d.ts | 4 +- browser/src/types/terminators/DF.d.ts | 5 +- browser/src/types/terminators/FA.d.ts | 11 +- browser/src/types/terminators/FC.d.ts | 22 +- browser/src/types/terminators/FD.d.ts | 11 +- browser/src/types/terminators/FM.d.ts | 10 +- browser/src/types/terminators/IF.d.ts | 5 +- browser/src/types/terminators/RF.d.ts | 20 +- browser/src/types/terminators/TF.d.ts | 5 +- browser/src/types/terminators/VA.d.ts | 3 +- browser/src/types/terminators/VD.d.ts | 4 +- browser/src/types/terminators/VI.d.ts | 3 +- browser/src/types/terminators/VM.d.ts | 3 +- browser/src/types/terminators/VR.d.ts | 4 +- browser/src/types/types.d.ts | 50 +- browser/tsconfig.json | 5 +- browser/vite.config.ts | 6 +- 64 files changed, 1093 insertions(+), 1205 deletions(-) create mode 100644 browser/.prettierrc.cjs create mode 100644 browser/src/parser/pathGenerators/generateOverflyArc.ts diff --git a/.vscode/launch.json b/.vscode/launch.json index 795f5d7..5d1283b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -14,7 +14,8 @@ "${workspaceFolder}\\browser\\src\\parser\\node.ts" ], "cwd": "${workspaceFolder}\\browser\\", - "outFiles": ["${workspaceFolder}/**/*.js"] + "outFiles": ["${workspaceFolder}/**/*.js"], + "console": "integratedTerminal" } ] } diff --git a/TODO.md b/TODO.md index e69de29..3e81768 100644 --- a/TODO.md +++ b/TODO.md @@ -0,0 +1,16 @@ +How to use: + +- Select Airport by ICAO +- List runways for selected airport +- List SID for selected runway + - List transitions for selected SID + - Parse SID and transition + - Display +- List STAR for selected runway + - List transitions for selected STAR + - Parse STAR and transition + - Display +- List IAPs for selected runway + - List transitions for selected IAP + - Parse IAP and transition + - Display \ No newline at end of file diff --git a/browser/.prettierrc.cjs b/browser/.prettierrc.cjs new file mode 100644 index 0000000..c295da3 --- /dev/null +++ b/browser/.prettierrc.cjs @@ -0,0 +1,9 @@ +module.exports = { + printWidth: 120, + tabWidth: 2, + semi: true, + trailingComma: "es5", + singleQuote: true, + arrowParens: "always", + plugins: ["prettier-plugin-organize-imports"], +}; diff --git a/browser/eslint.config.js b/browser/eslint.config.js index 8ef2186..931e224 100644 --- a/browser/eslint.config.js +++ b/browser/eslint.config.js @@ -1,18 +1,18 @@ -import js from "@eslint/js"; -import globals from "globals"; -import reactHooks from "eslint-plugin-react-hooks"; -import reactRefresh from "eslint-plugin-react-refresh"; -import tseslint from "typescript-eslint"; -import { globalIgnores } from "eslint/config"; +import js from '@eslint/js'; +import reactHooks from 'eslint-plugin-react-hooks'; +import reactRefresh from 'eslint-plugin-react-refresh'; +import { globalIgnores } from 'eslint/config'; +import globals from 'globals'; +import tseslint from 'typescript-eslint'; export default tseslint.config([ - globalIgnores(["dist"]), + globalIgnores(['dist']), { - files: ["**/*.{ts,tsx}"], + files: ['**/*.{ts,tsx}'], extends: [ js.configs.recommended, tseslint.configs.recommended, - reactHooks.configs["recommended-latest"], + reactHooks.configs['recommended-latest'], reactRefresh.configs.vite, ], languageOptions: { @@ -20,7 +20,7 @@ export default tseslint.config([ globals: globals.browser, }, rules: { - "@typescript-eslint/no-shadow": "error", + '@typescript-eslint/no-shadow': 'error', }, }, ]); diff --git a/browser/package.json b/browser/package.json index 00fed62..8fb7fc9 100644 --- a/browser/package.json +++ b/browser/package.json @@ -33,6 +33,8 @@ "eslint-plugin-react-refresh": "^0.4.20", "globals": "^16.3.0", "object-hash": "^3.0.0", + "prettier": "^3.6.2", + "prettier-plugin-organize-imports": "^4.1.0", "typescript": "~5.8.3", "typescript-eslint": "^8.36.0", "vite": "^7.0.4" diff --git a/browser/pnpm-lock.yaml b/browser/pnpm-lock.yaml index 5271c6a..7e6af5c 100644 --- a/browser/pnpm-lock.yaml +++ b/browser/pnpm-lock.yaml @@ -5,7 +5,6 @@ settings: excludeLinksFromLockfile: false importers: - .: dependencies: geojson: @@ -69,6 +68,12 @@ importers: object-hash: specifier: ^3.0.0 version: 3.0.0 + prettier: + specifier: ^3.6.2 + version: 3.6.2 + prettier-plugin-organize-imports: + specifier: ^4.1.0 + version: 4.1.0(prettier@3.6.2)(typescript@5.8.3) typescript: specifier: ~5.8.3 version: 5.8.3 @@ -80,406 +85,481 @@ importers: version: 7.0.4(@types/node@24.0.13) packages: - '@esbuild/aix-ppc64@0.25.6': - resolution: {integrity: sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw== } + engines: { node: '>=18' } cpu: [ppc64] os: [aix] '@esbuild/android-arm64@0.25.6': - resolution: {integrity: sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA== } + engines: { node: '>=18' } cpu: [arm64] os: [android] '@esbuild/android-arm@0.25.6': - resolution: {integrity: sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg== } + engines: { node: '>=18' } cpu: [arm] os: [android] '@esbuild/android-x64@0.25.6': - resolution: {integrity: sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A== } + engines: { node: '>=18' } cpu: [x64] os: [android] '@esbuild/darwin-arm64@0.25.6': - resolution: {integrity: sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA== } + engines: { node: '>=18' } cpu: [arm64] os: [darwin] '@esbuild/darwin-x64@0.25.6': - resolution: {integrity: sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg== } + engines: { node: '>=18' } cpu: [x64] os: [darwin] '@esbuild/freebsd-arm64@0.25.6': - resolution: {integrity: sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg== } + engines: { node: '>=18' } cpu: [arm64] os: [freebsd] '@esbuild/freebsd-x64@0.25.6': - resolution: {integrity: sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ== } + engines: { node: '>=18' } cpu: [x64] os: [freebsd] '@esbuild/linux-arm64@0.25.6': - resolution: {integrity: sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ== } + engines: { node: '>=18' } cpu: [arm64] os: [linux] '@esbuild/linux-arm@0.25.6': - resolution: {integrity: sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw== } + engines: { node: '>=18' } cpu: [arm] os: [linux] '@esbuild/linux-ia32@0.25.6': - resolution: {integrity: sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw== } + engines: { node: '>=18' } cpu: [ia32] os: [linux] '@esbuild/linux-loong64@0.25.6': - resolution: {integrity: sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg== } + engines: { node: '>=18' } cpu: [loong64] os: [linux] '@esbuild/linux-mips64el@0.25.6': - resolution: {integrity: sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw== } + engines: { node: '>=18' } cpu: [mips64el] os: [linux] '@esbuild/linux-ppc64@0.25.6': - resolution: {integrity: sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw== } + engines: { node: '>=18' } cpu: [ppc64] os: [linux] '@esbuild/linux-riscv64@0.25.6': - resolution: {integrity: sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w== } + engines: { node: '>=18' } cpu: [riscv64] os: [linux] '@esbuild/linux-s390x@0.25.6': - resolution: {integrity: sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw== } + engines: { node: '>=18' } cpu: [s390x] os: [linux] '@esbuild/linux-x64@0.25.6': - resolution: {integrity: sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig== } + engines: { node: '>=18' } cpu: [x64] os: [linux] '@esbuild/netbsd-arm64@0.25.6': - resolution: {integrity: sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q== } + engines: { node: '>=18' } cpu: [arm64] os: [netbsd] '@esbuild/netbsd-x64@0.25.6': - resolution: {integrity: sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g== } + engines: { node: '>=18' } cpu: [x64] os: [netbsd] '@esbuild/openbsd-arm64@0.25.6': - resolution: {integrity: sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg== } + engines: { node: '>=18' } cpu: [arm64] os: [openbsd] '@esbuild/openbsd-x64@0.25.6': - resolution: {integrity: sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw== } + engines: { node: '>=18' } cpu: [x64] os: [openbsd] '@esbuild/openharmony-arm64@0.25.6': - resolution: {integrity: sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA== } + engines: { node: '>=18' } cpu: [arm64] os: [openharmony] '@esbuild/sunos-x64@0.25.6': - resolution: {integrity: sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA== } + engines: { node: '>=18' } cpu: [x64] os: [sunos] '@esbuild/win32-arm64@0.25.6': - resolution: {integrity: sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q== } + engines: { node: '>=18' } cpu: [arm64] os: [win32] '@esbuild/win32-ia32@0.25.6': - resolution: {integrity: sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ== } + engines: { node: '>=18' } cpu: [ia32] os: [win32] '@esbuild/win32-x64@0.25.6': - resolution: {integrity: sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA== } + engines: { node: '>=18' } cpu: [x64] os: [win32] '@eslint-community/eslint-utils@4.7.0': - resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + resolution: + { integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } '@eslint/config-array@0.21.0': - resolution: {integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@eslint/config-helpers@0.3.0': - resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@eslint/core@0.15.1': - resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@eslint/eslintrc@3.3.1': - resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@eslint/js@9.31.0': - resolution: {integrity: sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@eslint/object-schema@2.1.6': - resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@eslint/plugin-kit@0.3.3': - resolution: {integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} - engines: {node: '>=18.18.0'} + resolution: + { integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== } + engines: { node: '>=18.18.0' } '@humanfs/node@0.16.6': - resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} - engines: {node: '>=18.18.0'} + resolution: + { integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== } + engines: { node: '>=18.18.0' } '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} + resolution: + { integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== } + engines: { node: '>=12.22' } '@humanwhocodes/retry@0.3.1': - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} - engines: {node: '>=18.18'} + resolution: + { integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== } + engines: { node: '>=18.18' } '@humanwhocodes/retry@0.4.3': - resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} - engines: {node: '>=18.18'} + resolution: + { integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== } + engines: { node: '>=18.18' } '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== } + engines: { node: '>= 8' } '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== } + engines: { node: '>= 8' } '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== } + engines: { node: '>= 8' } '@react-leaflet/core@3.0.0': - resolution: {integrity: sha512-3EWmekh4Nz+pGcr+xjf0KNyYfC3U2JjnkWsh0zcqaexYqmmB5ZhH37kz41JXGmKzpaMZCnPofBBm64i+YrEvGQ==} + resolution: + { integrity: sha512-3EWmekh4Nz+pGcr+xjf0KNyYfC3U2JjnkWsh0zcqaexYqmmB5ZhH37kz41JXGmKzpaMZCnPofBBm64i+YrEvGQ== } peerDependencies: leaflet: ^1.9.0 react: ^19.0.0 react-dom: ^19.0.0 '@rolldown/pluginutils@1.0.0-beta.11': - resolution: {integrity: sha512-L/gAA/hyCSuzTF1ftlzUSI/IKr2POHsv1Dd78GfqkR83KMNuswWD61JxGV2L7nRwBBBSDr6R1gCkdTmoN7W4ag==} + resolution: + { integrity: sha512-L/gAA/hyCSuzTF1ftlzUSI/IKr2POHsv1Dd78GfqkR83KMNuswWD61JxGV2L7nRwBBBSDr6R1gCkdTmoN7W4ag== } '@rollup/rollup-android-arm-eabi@4.45.0': - resolution: {integrity: sha512-2o/FgACbji4tW1dzXOqAV15Eu7DdgbKsF2QKcxfG4xbh5iwU7yr5RRP5/U+0asQliSYv5M4o7BevlGIoSL0LXg==} + resolution: + { integrity: sha512-2o/FgACbji4tW1dzXOqAV15Eu7DdgbKsF2QKcxfG4xbh5iwU7yr5RRP5/U+0asQliSYv5M4o7BevlGIoSL0LXg== } cpu: [arm] os: [android] '@rollup/rollup-android-arm64@4.45.0': - resolution: {integrity: sha512-PSZ0SvMOjEAxwZeTx32eI/j5xSYtDCRxGu5k9zvzoY77xUNssZM+WV6HYBLROpY5CkXsbQjvz40fBb7WPwDqtQ==} + resolution: + { integrity: sha512-PSZ0SvMOjEAxwZeTx32eI/j5xSYtDCRxGu5k9zvzoY77xUNssZM+WV6HYBLROpY5CkXsbQjvz40fBb7WPwDqtQ== } cpu: [arm64] os: [android] '@rollup/rollup-darwin-arm64@4.45.0': - resolution: {integrity: sha512-BA4yPIPssPB2aRAWzmqzQ3y2/KotkLyZukVB7j3psK/U3nVJdceo6qr9pLM2xN6iRP/wKfxEbOb1yrlZH6sYZg==} + resolution: + { integrity: sha512-BA4yPIPssPB2aRAWzmqzQ3y2/KotkLyZukVB7j3psK/U3nVJdceo6qr9pLM2xN6iRP/wKfxEbOb1yrlZH6sYZg== } cpu: [arm64] os: [darwin] '@rollup/rollup-darwin-x64@4.45.0': - resolution: {integrity: sha512-Pr2o0lvTwsiG4HCr43Zy9xXrHspyMvsvEw4FwKYqhli4FuLE5FjcZzuQ4cfPe0iUFCvSQG6lACI0xj74FDZKRA==} + resolution: + { integrity: sha512-Pr2o0lvTwsiG4HCr43Zy9xXrHspyMvsvEw4FwKYqhli4FuLE5FjcZzuQ4cfPe0iUFCvSQG6lACI0xj74FDZKRA== } cpu: [x64] os: [darwin] '@rollup/rollup-freebsd-arm64@4.45.0': - resolution: {integrity: sha512-lYE8LkE5h4a/+6VnnLiL14zWMPnx6wNbDG23GcYFpRW1V9hYWHAw9lBZ6ZUIrOaoK7NliF1sdwYGiVmziUF4vA==} + resolution: + { integrity: sha512-lYE8LkE5h4a/+6VnnLiL14zWMPnx6wNbDG23GcYFpRW1V9hYWHAw9lBZ6ZUIrOaoK7NliF1sdwYGiVmziUF4vA== } cpu: [arm64] os: [freebsd] '@rollup/rollup-freebsd-x64@4.45.0': - resolution: {integrity: sha512-PVQWZK9sbzpvqC9Q0GlehNNSVHR+4m7+wET+7FgSnKG3ci5nAMgGmr9mGBXzAuE5SvguCKJ6mHL6vq1JaJ/gvw==} + resolution: + { integrity: sha512-PVQWZK9sbzpvqC9Q0GlehNNSVHR+4m7+wET+7FgSnKG3ci5nAMgGmr9mGBXzAuE5SvguCKJ6mHL6vq1JaJ/gvw== } cpu: [x64] os: [freebsd] '@rollup/rollup-linux-arm-gnueabihf@4.45.0': - resolution: {integrity: sha512-hLrmRl53prCcD+YXTfNvXd776HTxNh8wPAMllusQ+amcQmtgo3V5i/nkhPN6FakW+QVLoUUr2AsbtIRPFU3xIA==} + resolution: + { integrity: sha512-hLrmRl53prCcD+YXTfNvXd776HTxNh8wPAMllusQ+amcQmtgo3V5i/nkhPN6FakW+QVLoUUr2AsbtIRPFU3xIA== } cpu: [arm] os: [linux] '@rollup/rollup-linux-arm-musleabihf@4.45.0': - resolution: {integrity: sha512-XBKGSYcrkdiRRjl+8XvrUR3AosXU0NvF7VuqMsm7s5nRy+nt58ZMB19Jdp1RdqewLcaYnpk8zeVs/4MlLZEJxw==} + resolution: + { integrity: sha512-XBKGSYcrkdiRRjl+8XvrUR3AosXU0NvF7VuqMsm7s5nRy+nt58ZMB19Jdp1RdqewLcaYnpk8zeVs/4MlLZEJxw== } cpu: [arm] os: [linux] '@rollup/rollup-linux-arm64-gnu@4.45.0': - resolution: {integrity: sha512-fRvZZPUiBz7NztBE/2QnCS5AtqLVhXmUOPj9IHlfGEXkapgImf4W9+FSkL8cWqoAjozyUzqFmSc4zh2ooaeF6g==} + resolution: + { integrity: sha512-fRvZZPUiBz7NztBE/2QnCS5AtqLVhXmUOPj9IHlfGEXkapgImf4W9+FSkL8cWqoAjozyUzqFmSc4zh2ooaeF6g== } cpu: [arm64] os: [linux] '@rollup/rollup-linux-arm64-musl@4.45.0': - resolution: {integrity: sha512-Btv2WRZOcUGi8XU80XwIvzTg4U6+l6D0V6sZTrZx214nrwxw5nAi8hysaXj/mctyClWgesyuxbeLylCBNauimg==} + resolution: + { integrity: sha512-Btv2WRZOcUGi8XU80XwIvzTg4U6+l6D0V6sZTrZx214nrwxw5nAi8hysaXj/mctyClWgesyuxbeLylCBNauimg== } cpu: [arm64] os: [linux] '@rollup/rollup-linux-loongarch64-gnu@4.45.0': - resolution: {integrity: sha512-Li0emNnwtUZdLwHjQPBxn4VWztcrw/h7mgLyHiEI5Z0MhpeFGlzaiBHpSNVOMB/xucjXTTcO+dhv469Djr16KA==} + resolution: + { integrity: sha512-Li0emNnwtUZdLwHjQPBxn4VWztcrw/h7mgLyHiEI5Z0MhpeFGlzaiBHpSNVOMB/xucjXTTcO+dhv469Djr16KA== } cpu: [loong64] os: [linux] '@rollup/rollup-linux-powerpc64le-gnu@4.45.0': - resolution: {integrity: sha512-sB8+pfkYx2kvpDCfd63d5ScYT0Fz1LO6jIb2zLZvmK9ob2D8DeVqrmBDE0iDK8KlBVmsTNzrjr3G1xV4eUZhSw==} + resolution: + { integrity: sha512-sB8+pfkYx2kvpDCfd63d5ScYT0Fz1LO6jIb2zLZvmK9ob2D8DeVqrmBDE0iDK8KlBVmsTNzrjr3G1xV4eUZhSw== } cpu: [ppc64] os: [linux] '@rollup/rollup-linux-riscv64-gnu@4.45.0': - resolution: {integrity: sha512-5GQ6PFhh7E6jQm70p1aW05G2cap5zMOvO0se5JMecHeAdj5ZhWEHbJ4hiKpfi1nnnEdTauDXxPgXae/mqjow9w==} + resolution: + { integrity: sha512-5GQ6PFhh7E6jQm70p1aW05G2cap5zMOvO0se5JMecHeAdj5ZhWEHbJ4hiKpfi1nnnEdTauDXxPgXae/mqjow9w== } cpu: [riscv64] os: [linux] '@rollup/rollup-linux-riscv64-musl@4.45.0': - resolution: {integrity: sha512-N/euLsBd1rekWcuduakTo/dJw6U6sBP3eUq+RXM9RNfPuWTvG2w/WObDkIvJ2KChy6oxZmOSC08Ak2OJA0UiAA==} + resolution: + { integrity: sha512-N/euLsBd1rekWcuduakTo/dJw6U6sBP3eUq+RXM9RNfPuWTvG2w/WObDkIvJ2KChy6oxZmOSC08Ak2OJA0UiAA== } cpu: [riscv64] os: [linux] '@rollup/rollup-linux-s390x-gnu@4.45.0': - resolution: {integrity: sha512-2l9sA7d7QdikL0xQwNMO3xURBUNEWyHVHfAsHsUdq+E/pgLTUcCE+gih5PCdmyHmfTDeXUWVhqL0WZzg0nua3g==} + resolution: + { integrity: sha512-2l9sA7d7QdikL0xQwNMO3xURBUNEWyHVHfAsHsUdq+E/pgLTUcCE+gih5PCdmyHmfTDeXUWVhqL0WZzg0nua3g== } cpu: [s390x] os: [linux] '@rollup/rollup-linux-x64-gnu@4.45.0': - resolution: {integrity: sha512-XZdD3fEEQcwG2KrJDdEQu7NrHonPxxaV0/w2HpvINBdcqebz1aL+0vM2WFJq4DeiAVT6F5SUQas65HY5JDqoPw==} + resolution: + { integrity: sha512-XZdD3fEEQcwG2KrJDdEQu7NrHonPxxaV0/w2HpvINBdcqebz1aL+0vM2WFJq4DeiAVT6F5SUQas65HY5JDqoPw== } cpu: [x64] os: [linux] '@rollup/rollup-linux-x64-musl@4.45.0': - resolution: {integrity: sha512-7ayfgvtmmWgKWBkCGg5+xTQ0r5V1owVm67zTrsEY1008L5ro7mCyGYORomARt/OquB9KY7LpxVBZes+oSniAAQ==} + resolution: + { integrity: sha512-7ayfgvtmmWgKWBkCGg5+xTQ0r5V1owVm67zTrsEY1008L5ro7mCyGYORomARt/OquB9KY7LpxVBZes+oSniAAQ== } cpu: [x64] os: [linux] '@rollup/rollup-win32-arm64-msvc@4.45.0': - resolution: {integrity: sha512-B+IJgcBnE2bm93jEW5kHisqvPITs4ddLOROAcOc/diBgrEiQJJ6Qcjby75rFSmH5eMGrqJryUgJDhrfj942apQ==} + resolution: + { integrity: sha512-B+IJgcBnE2bm93jEW5kHisqvPITs4ddLOROAcOc/diBgrEiQJJ6Qcjby75rFSmH5eMGrqJryUgJDhrfj942apQ== } cpu: [arm64] os: [win32] '@rollup/rollup-win32-ia32-msvc@4.45.0': - resolution: {integrity: sha512-+CXwwG66g0/FpWOnP/v1HnrGVSOygK/osUbu3wPRy8ECXjoYKjRAyfxYpDQOfghC5qPJYLPH0oN4MCOjwgdMug==} + resolution: + { integrity: sha512-+CXwwG66g0/FpWOnP/v1HnrGVSOygK/osUbu3wPRy8ECXjoYKjRAyfxYpDQOfghC5qPJYLPH0oN4MCOjwgdMug== } cpu: [ia32] os: [win32] '@rollup/rollup-win32-x64-msvc@4.45.0': - resolution: {integrity: sha512-SRf1cytG7wqcHVLrBc9VtPK4pU5wxiB/lNIkNmW2ApKXIg+RpqwHfsaEK+e7eH4A1BpI6BX/aBWXxZCIrJg3uA==} + resolution: + { integrity: sha512-SRf1cytG7wqcHVLrBc9VtPK4pU5wxiB/lNIkNmW2ApKXIg+RpqwHfsaEK+e7eH4A1BpI6BX/aBWXxZCIrJg3uA== } cpu: [x64] os: [win32] '@swc/core-darwin-arm64@1.12.11': - resolution: {integrity: sha512-J19Jj9Y5x/N0loExH7W0OI9OwwoVyxutDdkyq1o/kgXyBqmmzV7Y/Q9QekI2Fm/qc5mNeAdP7aj4boY4AY/JPw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-J19Jj9Y5x/N0loExH7W0OI9OwwoVyxutDdkyq1o/kgXyBqmmzV7Y/Q9QekI2Fm/qc5mNeAdP7aj4boY4AY/JPw== } + engines: { node: '>=10' } cpu: [arm64] os: [darwin] '@swc/core-darwin-x64@1.12.11': - resolution: {integrity: sha512-PTuUQrfStQ6cjW+uprGO2lpQHy84/l0v+GqRqq8s/jdK55rFRjMfCeyf6FAR0l6saO5oNOQl+zWR1aNpj8pMQw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-PTuUQrfStQ6cjW+uprGO2lpQHy84/l0v+GqRqq8s/jdK55rFRjMfCeyf6FAR0l6saO5oNOQl+zWR1aNpj8pMQw== } + engines: { node: '>=10' } cpu: [x64] os: [darwin] '@swc/core-linux-arm-gnueabihf@1.12.11': - resolution: {integrity: sha512-poxBq152HsupOtnZilenvHmxZ9a8SRj4LtfxUnkMDNOGrZR9oxbQNwEzNKfi3RXEcXz+P8c0Rai1ubBazXv8oQ==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-poxBq152HsupOtnZilenvHmxZ9a8SRj4LtfxUnkMDNOGrZR9oxbQNwEzNKfi3RXEcXz+P8c0Rai1ubBazXv8oQ== } + engines: { node: '>=10' } cpu: [arm] os: [linux] '@swc/core-linux-arm64-gnu@1.12.11': - resolution: {integrity: sha512-y1HNamR/D0Hc8xIE910ysyLe269UYiGaQPoLjQS0phzWFfWdMj9bHM++oydVXZ4RSWycO7KyJ3uvw4NilvyMKQ==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-y1HNamR/D0Hc8xIE910ysyLe269UYiGaQPoLjQS0phzWFfWdMj9bHM++oydVXZ4RSWycO7KyJ3uvw4NilvyMKQ== } + engines: { node: '>=10' } cpu: [arm64] os: [linux] '@swc/core-linux-arm64-musl@1.12.11': - resolution: {integrity: sha512-LlBxPh/32pyQsu2emMEOFRm7poEFLsw12Y1mPY7FWZiZeptomKSOSHRzKDz9EolMiV4qhK1caP1lvW4vminYgQ==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-LlBxPh/32pyQsu2emMEOFRm7poEFLsw12Y1mPY7FWZiZeptomKSOSHRzKDz9EolMiV4qhK1caP1lvW4vminYgQ== } + engines: { node: '>=10' } cpu: [arm64] os: [linux] '@swc/core-linux-x64-gnu@1.12.11': - resolution: {integrity: sha512-bOjiZB8O/1AzHkzjge1jqX62HGRIpOHqFUrGPfAln/NC6NR+Z2A78u3ixV7k5KesWZFhCV0YVGJL+qToL27myA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-bOjiZB8O/1AzHkzjge1jqX62HGRIpOHqFUrGPfAln/NC6NR+Z2A78u3ixV7k5KesWZFhCV0YVGJL+qToL27myA== } + engines: { node: '>=10' } cpu: [x64] os: [linux] '@swc/core-linux-x64-musl@1.12.11': - resolution: {integrity: sha512-4dzAtbT/m3/UjF045+33gLiHd8aSXJDoqof7gTtu4q0ZyAf7XJ3HHspz+/AvOJLVo4FHHdFcdXhmo/zi1nFn8A==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-4dzAtbT/m3/UjF045+33gLiHd8aSXJDoqof7gTtu4q0ZyAf7XJ3HHspz+/AvOJLVo4FHHdFcdXhmo/zi1nFn8A== } + engines: { node: '>=10' } cpu: [x64] os: [linux] '@swc/core-win32-arm64-msvc@1.12.11': - resolution: {integrity: sha512-h8HiwBZErKvCAmjW92JvQp0iOqm6bncU4ac5jxBGkRApabpUenNJcj3h2g5O6GL5K6T9/WhnXE5gyq/s1fhPQg==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-h8HiwBZErKvCAmjW92JvQp0iOqm6bncU4ac5jxBGkRApabpUenNJcj3h2g5O6GL5K6T9/WhnXE5gyq/s1fhPQg== } + engines: { node: '>=10' } cpu: [arm64] os: [win32] '@swc/core-win32-ia32-msvc@1.12.11': - resolution: {integrity: sha512-1pwr325mXRNUhxTtXmx1IokV5SiRL+6iDvnt3FRXj+X5UvXXKtg2zeyftk+03u8v8v8WUr5I32hIypVJPTNxNg==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-1pwr325mXRNUhxTtXmx1IokV5SiRL+6iDvnt3FRXj+X5UvXXKtg2zeyftk+03u8v8v8WUr5I32hIypVJPTNxNg== } + engines: { node: '>=10' } cpu: [ia32] os: [win32] '@swc/core-win32-x64-msvc@1.12.11': - resolution: {integrity: sha512-5gggWo690Gvs7XiPxAmb5tHwzB9RTVXUV7AWoGb6bmyUd1OXYaebQF0HAOtade5jIoNhfQMQJ7QReRgt/d2jAA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-5gggWo690Gvs7XiPxAmb5tHwzB9RTVXUV7AWoGb6bmyUd1OXYaebQF0HAOtade5jIoNhfQMQJ7QReRgt/d2jAA== } + engines: { node: '>=10' } cpu: [x64] os: [win32] '@swc/core@1.12.11': - resolution: {integrity: sha512-P3GM+0lqjFctcp5HhR9mOcvLSX3SptI9L1aux0Fuvgt8oH4f92rCUrkodAa0U2ktmdjcyIiG37xg2mb/dSCYSA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-P3GM+0lqjFctcp5HhR9mOcvLSX3SptI9L1aux0Fuvgt8oH4f92rCUrkodAa0U2ktmdjcyIiG37xg2mb/dSCYSA== } + engines: { node: '>=10' } peerDependencies: '@swc/helpers': '>=0.5.17' peerDependenciesMeta: @@ -487,162 +567,200 @@ packages: optional: true '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + resolution: + { integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== } '@swc/types@0.1.23': - resolution: {integrity: sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw==} + resolution: + { integrity: sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw== } '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + resolution: + { integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== } '@types/geojson@7946.0.16': - resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} + resolution: + { integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg== } '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + resolution: + { integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== } '@types/leaflet@1.9.20': - resolution: {integrity: sha512-rooalPMlk61LCaLOvBF2VIf9M47HgMQqi5xQ9QRi7c8PkdIe0WrIi5IxXUXQjAdL0c+vcQ01mYWbthzmp9GHWw==} + resolution: + { integrity: sha512-rooalPMlk61LCaLOvBF2VIf9M47HgMQqi5xQ9QRi7c8PkdIe0WrIi5IxXUXQjAdL0c+vcQ01mYWbthzmp9GHWw== } '@types/node@24.0.13': - resolution: {integrity: sha512-Qm9OYVOFHFYg3wJoTSrz80hoec5Lia/dPp84do3X7dZvLikQvM1YpmvTBEdIr/e+U8HTkFjLHLnl78K/qjf+jQ==} + resolution: + { integrity: sha512-Qm9OYVOFHFYg3wJoTSrz80hoec5Lia/dPp84do3X7dZvLikQvM1YpmvTBEdIr/e+U8HTkFjLHLnl78K/qjf+jQ== } '@types/object-hash@3.0.6': - resolution: {integrity: sha512-fOBV8C1FIu2ELinoILQ+ApxcUKz4ngq+IWUYrxSGjXzzjUALijilampwkMgEtJ+h2njAW3pi853QpzNVCHB73w==} + resolution: + { integrity: sha512-fOBV8C1FIu2ELinoILQ+ApxcUKz4ngq+IWUYrxSGjXzzjUALijilampwkMgEtJ+h2njAW3pi853QpzNVCHB73w== } '@types/react-dom@19.1.6': - resolution: {integrity: sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==} + resolution: + { integrity: sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw== } peerDependencies: '@types/react': ^19.0.0 '@types/react@19.1.8': - resolution: {integrity: sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g==} + resolution: + { integrity: sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g== } '@typescript-eslint/eslint-plugin@8.36.0': - resolution: {integrity: sha512-lZNihHUVB6ZZiPBNgOQGSxUASI7UJWhT8nHyUGCnaQ28XFCw98IfrMCG3rUl1uwUWoAvodJQby2KTs79UTcrAg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-lZNihHUVB6ZZiPBNgOQGSxUASI7UJWhT8nHyUGCnaQ28XFCw98IfrMCG3rUl1uwUWoAvodJQby2KTs79UTcrAg== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: '@typescript-eslint/parser': ^8.36.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/parser@8.36.0': - resolution: {integrity: sha512-FuYgkHwZLuPbZjQHzJXrtXreJdFMKl16BFYyRrLxDhWr6Qr7Kbcu2s1Yhu8tsiMXw1S0W1pjfFfYEt+R604s+Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-FuYgkHwZLuPbZjQHzJXrtXreJdFMKl16BFYyRrLxDhWr6Qr7Kbcu2s1Yhu8tsiMXw1S0W1pjfFfYEt+R604s+Q== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/project-service@8.36.0': - resolution: {integrity: sha512-JAhQFIABkWccQYeLMrHadu/fhpzmSQ1F1KXkpzqiVxA/iYI6UnRt2trqXHt1sYEcw1mxLnB9rKMsOxXPxowN/g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-JAhQFIABkWccQYeLMrHadu/fhpzmSQ1F1KXkpzqiVxA/iYI6UnRt2trqXHt1sYEcw1mxLnB9rKMsOxXPxowN/g== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/scope-manager@8.36.0': - resolution: {integrity: sha512-wCnapIKnDkN62fYtTGv2+RY8FlnBYA3tNm0fm91kc2BjPhV2vIjwwozJ7LToaLAyb1ca8BxrS7vT+Pvvf7RvqA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-wCnapIKnDkN62fYtTGv2+RY8FlnBYA3tNm0fm91kc2BjPhV2vIjwwozJ7LToaLAyb1ca8BxrS7vT+Pvvf7RvqA== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@typescript-eslint/tsconfig-utils@8.36.0': - resolution: {integrity: sha512-Nhh3TIEgN18mNbdXpd5Q8mSCBnrZQeY9V7Ca3dqYvNDStNIGRmJA6dmrIPMJ0kow3C7gcQbpsG2rPzy1Ks/AnA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-Nhh3TIEgN18mNbdXpd5Q8mSCBnrZQeY9V7Ca3dqYvNDStNIGRmJA6dmrIPMJ0kow3C7gcQbpsG2rPzy1Ks/AnA== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/type-utils@8.36.0': - resolution: {integrity: sha512-5aaGYG8cVDd6cxfk/ynpYzxBRZJk7w/ymto6uiyUFtdCozQIsQWh7M28/6r57Fwkbweng8qAzoMCPwSJfWlmsg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-5aaGYG8cVDd6cxfk/ynpYzxBRZJk7w/ymto6uiyUFtdCozQIsQWh7M28/6r57Fwkbweng8qAzoMCPwSJfWlmsg== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/types@8.36.0': - resolution: {integrity: sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@typescript-eslint/typescript-estree@8.36.0': - resolution: {integrity: sha512-JaS8bDVrfVJX4av0jLpe4ye0BpAaUW7+tnS4Y4ETa3q7NoZgzYbN9zDQTJ8kPb5fQ4n0hliAt9tA4Pfs2zA2Hg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-JaS8bDVrfVJX4av0jLpe4ye0BpAaUW7+tnS4Y4ETa3q7NoZgzYbN9zDQTJ8kPb5fQ4n0hliAt9tA4Pfs2zA2Hg== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/utils@8.36.0': - resolution: {integrity: sha512-VOqmHu42aEMT+P2qYjylw6zP/3E/HvptRwdn/PZxyV27KhZg2IOszXod4NcXisWzPAGSS4trE/g4moNj6XmH2g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-VOqmHu42aEMT+P2qYjylw6zP/3E/HvptRwdn/PZxyV27KhZg2IOszXod4NcXisWzPAGSS4trE/g4moNj6XmH2g== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/visitor-keys@8.36.0': - resolution: {integrity: sha512-vZrhV2lRPWDuGoxcmrzRZyxAggPL+qp3WzUrlZD+slFueDiYHxeBa34dUXPuC0RmGKzl4lS5kFJYvKCq9cnNDA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-vZrhV2lRPWDuGoxcmrzRZyxAggPL+qp3WzUrlZD+slFueDiYHxeBa34dUXPuC0RmGKzl4lS5kFJYvKCq9cnNDA== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } '@vitejs/plugin-react-swc@3.10.2': - resolution: {integrity: sha512-xD3Rdvrt5LgANug7WekBn1KhcvLn1H3jNBfJRL3reeOIua/WnZOEV5qi5qIBq5T8R0jUDmRtxuvk4bPhzGHDWw==} + resolution: + { integrity: sha512-xD3Rdvrt5LgANug7WekBn1KhcvLn1H3jNBfJRL3reeOIua/WnZOEV5qi5qIBq5T8R0jUDmRtxuvk4bPhzGHDWw== } peerDependencies: vite: ^4 || ^5 || ^6 || ^7.0.0-beta.0 acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + resolution: + { integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== } peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} - engines: {node: '>=0.4.0'} + resolution: + { integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== } + engines: { node: '>=0.4.0' } hasBin: true ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + resolution: + { integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== } ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== } + engines: { node: '>=8' } argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + resolution: + { integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== } balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + resolution: + { integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== } brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + resolution: + { integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg== } brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + resolution: + { integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== } braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== } + engines: { node: '>=8' } callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== } + engines: { node: '>=6' } chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== } + engines: { node: '>=10' } color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + resolution: + { integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== } + engines: { node: '>=7.0.0' } color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + resolution: + { integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== } concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + resolution: + { integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== } cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== } + engines: { node: '>= 8' } csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + resolution: + { integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== } debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} - engines: {node: '>=6.0'} + resolution: + { integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== } + engines: { node: '>=6.0' } peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -650,43 +768,52 @@ packages: optional: true deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + resolution: + { integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== } esbuild@0.25.6: - resolution: {integrity: sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg== } + engines: { node: '>=18' } hasBin: true escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== } + engines: { node: '>=10' } eslint-plugin-react-hooks@5.2.0: - resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg== } + engines: { node: '>=10' } peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 eslint-plugin-react-refresh@0.4.20: - resolution: {integrity: sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==} + resolution: + { integrity: sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA== } peerDependencies: eslint: '>=8.40' eslint-scope@8.4.0: - resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } eslint-visitor-keys@4.2.1: - resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } eslint@9.31.0: - resolution: {integrity: sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } hasBin: true peerDependencies: jiti: '*' @@ -695,43 +822,54 @@ packages: optional: true espree@10.4.0: - resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} + resolution: + { integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== } + engines: { node: '>=0.10' } esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + resolution: + { integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== } + engines: { node: '>=4.0' } estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} + resolution: + { integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== } + engines: { node: '>=4.0' } esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== } + engines: { node: '>=0.10.0' } fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + resolution: + { integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== } fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} + resolution: + { integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg== } + engines: { node: '>=8.6.0' } fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + resolution: + { integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== } fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + resolution: + { integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== } fastq@1.19.1: - resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} + resolution: + { integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ== } fdir@6.4.6: - resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} + resolution: + { integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w== } peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -739,305 +877,399 @@ packages: optional: true file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} + resolution: + { integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== } + engines: { node: '>=16.0.0' } fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== } + engines: { node: '>=8' } find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== } + engines: { node: '>=10' } flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} + resolution: + { integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== } + engines: { node: '>=16' } flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + resolution: + { integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== } fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + resolution: + { integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } os: [darwin] geojson@0.5.0: - resolution: {integrity: sha512-/Bx5lEn+qRF4TfQ5aLu6NH+UKtvIv7Lhc487y/c8BdludrCTpiWf9wyI0RTyqg49MFefIAvFDuEi5Dfd/zgNxQ==} - engines: {node: '>= 0.10'} + resolution: + { integrity: sha512-/Bx5lEn+qRF4TfQ5aLu6NH+UKtvIv7Lhc487y/c8BdludrCTpiWf9wyI0RTyqg49MFefIAvFDuEi5Dfd/zgNxQ== } + engines: { node: '>= 0.10' } geolib@3.3.4: - resolution: {integrity: sha512-EicrlLLL3S42gE9/wde+11uiaYAaeSVDwCUIv2uMIoRBfNJCn8EsSI+6nS3r4TCKDO6+RQNM9ayLq2at+oZQWQ==} + resolution: + { integrity: sha512-EicrlLLL3S42gE9/wde+11uiaYAaeSVDwCUIv2uMIoRBfNJCn8EsSI+6nS3r4TCKDO6+RQNM9ayLq2at+oZQWQ== } glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + resolution: + { integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== } + engines: { node: '>= 6' } glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + resolution: + { integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== } + engines: { node: '>=10.13.0' } globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== } + engines: { node: '>=18' } globals@16.3.0: - resolution: {integrity: sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ== } + engines: { node: '>=18' } graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + resolution: + { integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== } has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== } + engines: { node: '>=8' } ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} + resolution: + { integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== } + engines: { node: '>= 4' } ignore@7.0.5: - resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} - engines: {node: '>= 4'} + resolution: + { integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== } + engines: { node: '>= 4' } import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ== } + engines: { node: '>=6' } imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + resolution: + { integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== } + engines: { node: '>=0.8.19' } is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== } + engines: { node: '>=0.10.0' } is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== } + engines: { node: '>=0.10.0' } is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + resolution: + { integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== } + engines: { node: '>=0.12.0' } isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + resolution: + { integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== } js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + resolution: + { integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== } hasBin: true json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + resolution: + { integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== } json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + resolution: + { integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== } json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + resolution: + { integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== } keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + resolution: + { integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== } leaflet-svg-shape-markers@1.4.0: - resolution: {integrity: sha512-vUBwso51+4ZVGcLZbhdBGxz+xrbul5jDYxool2yTKbIjAC6rvOMLjr8YBTQbLaa1LBRBQIaWUbmCafdXm17pxw==} + resolution: + { integrity: sha512-vUBwso51+4ZVGcLZbhdBGxz+xrbul5jDYxool2yTKbIjAC6rvOMLjr8YBTQbLaa1LBRBQIaWUbmCafdXm17pxw== } leaflet@1.9.4: - resolution: {integrity: sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==} + resolution: + { integrity: sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA== } levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== } + engines: { node: '>= 0.8.0' } locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== } + engines: { node: '>=10' } lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + resolution: + { integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== } magvar@2.0.0: - resolution: {integrity: sha512-00LpSwEJZcnyX3VsdCM2CHSCvB+M6sVQTawLCB3J9oK7eEueNltNx9GFL4YR+/HIkLM+l8rFKiY77JTKnOf0jw==} + resolution: + { integrity: sha512-00LpSwEJZcnyX3VsdCM2CHSCvB+M6sVQTawLCB3J9oK7eEueNltNx9GFL4YR+/HIkLM+l8rFKiY77JTKnOf0jw== } merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== } + engines: { node: '>= 8' } micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} + resolution: + { integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== } + engines: { node: '>=8.6' } minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + resolution: + { integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== } minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== } + engines: { node: '>=16 || 14 >=14.17' } ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + resolution: + { integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== } nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + resolution: + { integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + resolution: + { integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== } object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} + resolution: + { integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== } + engines: { node: '>= 6' } optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== } + engines: { node: '>= 0.8.0' } p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== } + engines: { node: '>=10' } p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== } + engines: { node: '>=10' } parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== } + engines: { node: '>=6' } path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== } + engines: { node: '>=8' } path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== } + engines: { node: '>=8' } picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + resolution: + { integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== } picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + resolution: + { integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== } + engines: { node: '>=8.6' } picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== } + engines: { node: '>=12' } postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} - engines: {node: ^10 || ^12 || >=14} + resolution: + { integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== } + engines: { node: ^10 || ^12 || >=14 } prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== } + engines: { node: '>= 0.8.0' } + + prettier-plugin-organize-imports@4.1.0: + resolution: + { integrity: sha512-5aWRdCgv645xaa58X8lOxzZoiHAldAPChljr/MT0crXVOWTZ+Svl4hIWlz+niYSlO6ikE5UXkN1JrRvIP2ut0A== } + peerDependencies: + prettier: '>=2.0' + typescript: '>=2.9' + vue-tsc: ^2.1.0 + peerDependenciesMeta: + vue-tsc: + optional: true + + prettier@3.6.2: + resolution: + { integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ== } + engines: { node: '>=14' } + hasBin: true punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== } + engines: { node: '>=6' } queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + resolution: + { integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== } react-dom@19.1.0: - resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} + resolution: + { integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g== } peerDependencies: react: ^19.1.0 react-leaflet@5.0.0: - resolution: {integrity: sha512-CWbTpr5vcHw5bt9i4zSlPEVQdTVcML390TjeDG0cK59z1ylexpqC6M1PJFjV8jD7CF+ACBFsLIDs6DRMoLEofw==} + resolution: + { integrity: sha512-CWbTpr5vcHw5bt9i4zSlPEVQdTVcML390TjeDG0cK59z1ylexpqC6M1PJFjV8jD7CF+ACBFsLIDs6DRMoLEofw== } peerDependencies: leaflet: ^1.9.0 react: ^19.0.0 react-dom: ^19.0.0 react@19.1.0: - resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg== } + engines: { node: '>=0.10.0' } resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== } + engines: { node: '>=4' } reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + resolution: + { integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw== } + engines: { iojs: '>=1.0.0', node: '>=0.10.0' } rollup@4.45.0: - resolution: {integrity: sha512-WLjEcJRIo7i3WDDgOIJqVI2d+lAC3EwvOGy+Xfq6hs+GQuAA4Di/H72xmXkOhrIWFg2PFYSKZYfH0f4vfKXN4A==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} + resolution: + { integrity: sha512-WLjEcJRIo7i3WDDgOIJqVI2d+lAC3EwvOGy+Xfq6hs+GQuAA4Di/H72xmXkOhrIWFg2PFYSKZYfH0f4vfKXN4A== } + engines: { node: '>=18.0.0', npm: '>=8.0.0' } hasBin: true run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + resolution: + { integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== } scheduler@0.26.0: - resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + resolution: + { integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA== } semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== } + engines: { node: '>=10' } hasBin: true shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== } + engines: { node: '>=8' } shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== } + engines: { node: '>=8' } source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== } + engines: { node: '>=0.10.0' } strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== } + engines: { node: '>=8' } supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== } + engines: { node: '>=8' } tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} - engines: {node: '>=12.0.0'} + resolution: + { integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ== } + engines: { node: '>=12.0.0' } to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + resolution: + { integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== } + engines: { node: '>=8.0' } ts-api-utils@2.1.0: - resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} - engines: {node: '>=18.12'} + resolution: + { integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ== } + engines: { node: '>=18.12' } peerDependencies: typescript: '>=4.8.4' type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== } + engines: { node: '>= 0.8.0' } typescript-eslint@8.36.0: - resolution: {integrity: sha512-fTCqxthY+h9QbEgSIBfL9iV6CvKDFuoxg6bHPNpJ9HIUzS+jy2lCEyCmGyZRWEBSaykqcDPf1SJ+BfCI8DRopA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + resolution: + { integrity: sha512-fTCqxthY+h9QbEgSIBfL9iV6CvKDFuoxg6bHPNpJ9HIUzS+jy2lCEyCmGyZRWEBSaykqcDPf1SJ+BfCI8DRopA== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' typescript@5.8.3: - resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} - engines: {node: '>=14.17'} + resolution: + { integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== } + engines: { node: '>=14.17' } hasBin: true undici-types@7.8.0: - resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} + resolution: + { integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw== } uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + resolution: + { integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== } vite@7.0.4: - resolution: {integrity: sha512-SkaSguuS7nnmV7mfJ8l81JGBFV7Gvzp8IzgE8A8t23+AxuNX61Q5H1Tpz5efduSN7NHC8nQXD3sKQKZAu5mNEA==} - engines: {node: ^20.19.0 || >=22.12.0} + resolution: + { integrity: sha512-SkaSguuS7nnmV7mfJ8l81JGBFV7Gvzp8IzgE8A8t23+AxuNX61Q5H1Tpz5efduSN7NHC8nQXD3sKQKZAu5mNEA== } + engines: { node: ^20.19.0 || >=22.12.0 } hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 @@ -1076,20 +1308,22 @@ packages: optional: true which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== } + engines: { node: '>= 8' } hasBin: true word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== } + engines: { node: '>=0.10.0' } yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== } + engines: { node: '>=10' } snapshots: - '@esbuild/aix-ppc64@0.25.6': optional: true @@ -1829,6 +2063,13 @@ snapshots: prelude-ls@1.2.1: {} + prettier-plugin-organize-imports@4.1.0(prettier@3.6.2)(typescript@5.8.3): + dependencies: + prettier: 3.6.2 + typescript: 5.8.3 + + prettier@3.6.2: {} + punycode@2.3.1: {} queue-microtask@1.2.3: {} diff --git a/browser/src/App.tsx b/browser/src/App.tsx index 44b575e..3750fe8 100644 --- a/browser/src/App.tsx +++ b/browser/src/App.tsx @@ -1,17 +1,13 @@ -import { MapContainer, GeoJSON, TileLayer } from "react-leaflet"; -import Parser from "./parser/parser"; -import { createRef, useEffect, useState } from "react"; -import hash from "object-hash"; -import Leaflet from "leaflet"; -import "leaflet-svg-shape-markers"; -import L from "leaflet"; +import { default as L, default as Leaflet } from 'leaflet'; +import 'leaflet-svg-shape-markers'; +import hash from 'object-hash'; +import { createRef, useEffect, useState } from 'react'; +import { GeoJSON, MapContainer, TileLayer } from 'react-leaflet'; +import Parser from './parser/parser'; const parser = await Parser.instance(); -const terminals = [ - 10394, 10395, 10475, 10480, 10482, 10485, 10653, 10654, 10657, 10659, 10679, - 11798, 11909, 12765, -]; +const terminals = [10394, 10395, 10475, 10480, 10482, 10485, 10653, 10654, 10657, 10659, 10679, 11798, 11909, 12765]; function App() { const [selectedTerminal, setSelectedTerminal] = useState(terminals[0]); @@ -36,14 +32,14 @@ function App() { }); return ( -
+
( <> ({ - color: "#ff00ff", + color: '#ff00ff', stroke: true, weight: 5, opacity: 1, - dashArray: properties.isManual ? "20, 20" : undefined, + dashArray: properties.isManual ? '20, 20' : undefined, })} - filter={(feature) => feature.geometry.type !== "Point"} + filter={(feature) => feature.geometry.type !== 'Point'} ref={layerRef} /> { if (properties.isFlyOver) return L.shapeMarker(latlng, { - shape: "triangle", + shape: 'triangle', radius: 6, }); - if (properties.isIntersection) - return L.circleMarker(latlng, { radius: 6 }); + if (properties.isIntersection) return L.circleMarker(latlng, { radius: 6 }); return L.shapeMarker(latlng, { - shape: "star-4", + shape: 'star-4', radius: 10, rotation: 45, }); }} onEachFeature={({ geometry, properties }, layer) => { - if (geometry.type === "Point") { + if (geometry.type === 'Point') { layer.bindPopup( `${properties.name}
${properties.altitude} ft
${properties.speed} kts
CNSTR: - ${properties.altitudeConstraint ?? ""} - ${properties.speedConstraint ?? ""}
` + ${properties.altitudeConstraint ?? ''} + ${properties.speedConstraint ?? ''}
` ); } }} - filter={(feature) => feature.geometry.type === "Point"} + filter={(feature) => feature.geometry.type === 'Point'} /> ))}
{terminals.map((terminal) => (
setSelectedTerminal(terminal)} > - + {(() => { const t = parser.terminals.find(({ ID }) => ID === terminal); return `${t?.ICAO} - ${t?.FullName}`; diff --git a/browser/src/main.tsx b/browser/src/main.tsx index 2af21e3..ccc7e2b 100644 --- a/browser/src/main.tsx +++ b/browser/src/main.tsx @@ -1,11 +1,11 @@ -import { StrictMode } from "react"; -import { createRoot } from "react-dom/client"; -import App from "./App.tsx"; +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; +import App from './App.tsx'; -import "./index.css"; -import "leaflet/dist/leaflet.css"; +import 'leaflet/dist/leaflet.css'; +import './index.css'; -createRoot(document.getElementById("root")!).render( +createRoot(document.getElementById('root')!).render( diff --git a/browser/src/parser/node.ts b/browser/src/parser/node.ts index f495111..fcee854 100644 --- a/browser/src/parser/node.ts +++ b/browser/src/parser/node.ts @@ -1,17 +1,24 @@ -import Parser from "./parser.ts"; +import readline from 'readline'; +import Parser from './parser.ts'; // mutate fetch to be local // @ts-expect-error Global override // eslint-disable-next-line no-global-assign fetch = async (path: string) => { - const fs = await import("fs"); + const fs = await import('fs'); return { - json: () => - JSON.parse(fs.readFileSync(`public/${path}`) as unknown as string), + json: () => JSON.parse(fs.readFileSync(`public/${path}`) as unknown as string), }; }; const parser = await Parser.instance(); -console.log(JSON.stringify(await parser.parse(12765))); +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, +}); +rl.question(`Terminal ID? `, async (id) => { + console.log(JSON.stringify(await parser.parse(Number.parseInt(id)))); + rl.close(); +}); diff --git a/browser/src/parser/parser.ts b/browser/src/parser/parser.ts index eeadbdb..60b84d6 100644 --- a/browser/src/parser/parser.ts +++ b/browser/src/parser/parser.ts @@ -1,25 +1,25 @@ -import "./utils/extensions.ts"; -import * as geolib from "geolib"; -import geojson from "geojson"; -import { TerminatorsCF } from "./terminators/CF.ts"; -import { TerminatorsAF } from "./terminators/AF.ts"; -import { TerminatorsCR } from "./terminators/CR.ts"; -import { TerminatorsVM } from "./terminators/VM.ts"; -import { TerminatorsFM } from "./terminators/FM.ts"; -import { TerminatorsCI } from "./terminators/CI.ts"; -import { TerminatorsVA } from "./terminators/VA.ts"; -import { TerminatorsTF } from "./terminators/TF.ts"; -import { TerminatorsVI } from "./terminators/VI.ts"; -import { TerminatorsVD } from "./terminators/VD.ts"; -import { TerminatorsRF } from "./terminators/RF.ts"; -import { TerminatorsCA } from "./terminators/CA.ts"; -import { TerminatorsDF } from "./terminators/DF.ts"; -import { TerminatorsFD } from "./terminators/FD.ts"; -import { TerminatorsFA } from "./terminators/FA.ts"; -import { TerminatorsCD } from "./terminators/CD.ts"; -import { TerminatorsVR } from "./terminators/VR.ts"; -import { TerminatorsIF } from "./terminators/IF.ts"; -import { TerminatorsFC } from "./terminators/FC.ts"; +import geojson from 'geojson'; +import * as geolib from 'geolib'; +import { TerminatorsAF } from './terminators/AF.ts'; +import { TerminatorsCA } from './terminators/CA.ts'; +import { TerminatorsCD } from './terminators/CD.ts'; +import { TerminatorsCF } from './terminators/CF.ts'; +import { TerminatorsCI } from './terminators/CI.ts'; +import { TerminatorsCR } from './terminators/CR.ts'; +import { TerminatorsDF } from './terminators/DF.ts'; +import { TerminatorsFA } from './terminators/FA.ts'; +import { TerminatorsFC } from './terminators/FC.ts'; +import { TerminatorsFD } from './terminators/FD.ts'; +import { TerminatorsFM } from './terminators/FM.ts'; +import { TerminatorsIF } from './terminators/IF.ts'; +import { TerminatorsRF } from './terminators/RF.ts'; +import { TerminatorsTF } from './terminators/TF.ts'; +import { TerminatorsVA } from './terminators/VA.ts'; +import { TerminatorsVD } from './terminators/VD.ts'; +import { TerminatorsVI } from './terminators/VI.ts'; +import { TerminatorsVM } from './terminators/VM.ts'; +import { TerminatorsVR } from './terminators/VR.ts'; +import './utils/extensions.ts'; /* Runway IDs for LIED @@ -38,11 +38,7 @@ class Parser { public static AC_BANK = 30; public static AC_VS = 1400; - private constructor( - waypoints: Waypoint[], - runways: Runway[], - terminals: Terminal[] - ) { + private constructor(waypoints: Waypoint[], runways: Runway[], terminals: Terminal[]) { this._waypoints = waypoints; this._runways = runways; this._terminals = terminals; @@ -50,9 +46,9 @@ class Parser { public static instance = async () => { if (!Parser._instance) { - const waypoints = await (await fetch("NavData/Waypoints.json")).json(); - const runways = await (await fetch("NavData/Runways.json")).json(); - const terminals = await (await fetch("NavData/Terminals.json")).json(); + const waypoints = await (await fetch('NavData/Waypoints.json')).json(); + const runways = await (await fetch('NavData/Runways.json')).json(); + const terminals = await (await fetch('NavData/Terminals.json')).json(); Parser._instance = new Parser(waypoints, runways, terminals); } @@ -73,22 +69,20 @@ class Parser { public parse = async (terminalID: number) => { // Get Procedure main const terminal = this.terminals.find(({ ID }) => ID === terminalID); - if (!terminal) throw new Error("Procedure does not exists"); + if (!terminal) throw new Error('Procedure does not exists'); // Get runway this procedure is for let runway = this.runways.find(({ ID }) => ID === terminal.RwyID); if (!runway) { let id = 26156; - if (typeof prompt !== "undefined") + if (typeof prompt !== 'undefined') // throw new Error("Prompt not defined, cannot continue"); - id = Number.parseInt(prompt("Runway ID") ?? ""); + id = Number.parseInt(prompt('Runway ID') ?? ''); runway = this.runways.find(({ ID }) => ID === id); - if (!runway) throw new Error("Procedure links to non existent Runway"); + if (!runway) throw new Error('Procedure links to non existent Runway'); } // Load procedure - const procedures = (await ( - await fetch(`NavData/TermID_${terminalID}.json`) - ).json()) as TerminalEntry[]; + const procedures = (await (await fetch(`NavData/TermID_${terminalID}.json`)).json()) as TerminalEntry[]; // Split into transitions const transitions = new Set(procedures.map((proc) => proc.Transition)); @@ -118,11 +112,7 @@ class Parser { * @param line New line * @param options Options for line rendering */ - const update = ( - fix?: NavFix, - line?: LineSegment[], - options?: Record - ) => { + const update = (fix?: NavFix, line?: LineSegment[], options?: Record) => { if (fix) navFixes.push(fix); if (line) { lineSegments.push({ line, ...options }); @@ -144,53 +134,34 @@ class Parser { }); let lastCourse = runway.TrueHeading; - const procedure = procedures.filter( - (proc) => proc.Transition === transition - ); + const procedure = procedures.filter((proc) => proc.Transition === transition); for (let index = 0; index < procedure.length; index++) { const leg = procedure[index]; const previousFix = navFixes.at(-1)!; const waypoint = this.waypoints.filter(({ ID }) => ID === leg.WptID)[0]; switch (leg.TrackCode) { - case "AF": { - const [fixToAdd, lineToAdd] = TerminatorsAF( - leg as AFTerminalEntry, - previousFix, - waypoint - ); + case 'AF': { + const [fixToAdd, lineToAdd] = TerminatorsAF(leg as AFTerminalEntry, previousFix, waypoint); update(fixToAdd, lineToAdd); break; } - case "CA": { - const [fixToAdd, lineToAdd] = TerminatorsCA( - leg as CATerminalEntry, - previousFix, - lastCourse - ); + case 'CA': { + const [fixToAdd, lineToAdd] = TerminatorsCA(leg as CATerminalEntry, previousFix, lastCourse); update(fixToAdd, lineToAdd); break; } - case "CD": { - const [fixToAdd, lineToAdd] = TerminatorsCD( - leg as CDTerminalEntry, - previousFix, - lastCourse - ); + case 'CD': { + const [fixToAdd, lineToAdd] = TerminatorsCD(leg as CDTerminalEntry, previousFix, lastCourse); update(fixToAdd, lineToAdd); break; } - case "CF": { - const [fixToAdd, lineToAdd] = TerminatorsCF( - leg as CFTerminalEntry, - previousFix, - lastCourse, - waypoint - ); + case 'CF': { + const [fixToAdd, lineToAdd] = TerminatorsCF(leg as CFTerminalEntry, previousFix, lastCourse, waypoint); update(fixToAdd, lineToAdd); break; } - case "CI": { + case 'CI': { const [fixToAdd, lineToAdd] = TerminatorsCI( leg as CITerminalEntry, procedure[index + 1], @@ -200,76 +171,51 @@ class Parser { update(fixToAdd, lineToAdd); break; } - case "CR": { - const [fixToAdd, lineToAdd] = TerminatorsCR( - leg as CRTerminalEntry, - previousFix, - lastCourse - ); + case 'CR': { + const [fixToAdd, lineToAdd] = TerminatorsCR(leg as CRTerminalEntry, previousFix, lastCourse); update(fixToAdd, lineToAdd); break; } - case "DF": { - const [fixToAdd, lineToAdd] = TerminatorsDF( - leg as DFTerminalEntry, - previousFix, - lastCourse, - waypoint - ); + case 'DF': { + const [fixToAdd, lineToAdd] = TerminatorsDF(leg as DFTerminalEntry, previousFix, lastCourse, waypoint); update(fixToAdd, lineToAdd); break; } - case "FA": { - const [fixToAdd, lineToAdd] = TerminatorsFA( - leg as FATerminalEntry, - previousFix, - lastCourse - ); + case 'FA': { + const [fixToAdd, lineToAdd] = TerminatorsFA(leg as FATerminalEntry, previousFix, lastCourse); update(fixToAdd, lineToAdd); break; } - case "FC": { - const [fixToAdd, lineToAdd] = TerminatorsFC( - leg as FCTerminalEntry, - previousFix, - lastCourse - ); + case 'FC': { + const [fixToAdd, lineToAdd] = TerminatorsFC(leg as FCTerminalEntry, previousFix, lastCourse); update(fixToAdd, lineToAdd); break; } - case "FD": { - const [fixToAdd, lineToAdd] = TerminatorsFD( - leg as FDTerminalEntry, - previousFix, - lastCourse - ); + case 'FD': { + const [fixToAdd, lineToAdd] = TerminatorsFD(leg as FDTerminalEntry, previousFix, lastCourse); update(fixToAdd, lineToAdd); break; } - case "FM": { - const [fixToAdd, lineToAdd] = TerminatorsFM( - leg as FMTerminalEntry, - previousFix, - lastCourse - ); + case 'FM': { + const [fixToAdd, lineToAdd] = TerminatorsFM(leg as FMTerminalEntry, previousFix, lastCourse); update(fixToAdd, lineToAdd, { isManual: true }); break; } - case "HA": - case "HF": - case "HM": - console.error("Unknown TrackCode", leg.TrackCode); + case 'HA': + case 'HF': + case 'HM': + console.error('Unknown TrackCode', leg.TrackCode); break; - case "IF": { + case 'IF': { const fixToAdd = TerminatorsIF(leg as RFTerminalEntry, waypoint); navFixes.length = 0; navFixes.push(fixToAdd); break; } - case "PI": - console.error("Unknown TrackCode", leg.TrackCode); + case 'PI': + console.error('Unknown TrackCode', leg.TrackCode); break; - case "RF": { + case 'RF': { const [fixToAdd, lineToAdd] = TerminatorsRF( leg as RFTerminalEntry, procedure[index + 1], @@ -280,35 +226,22 @@ class Parser { update(fixToAdd, lineToAdd); break; } - case "TF": { - const [fixToAdd, lineToAdd] = TerminatorsTF( - leg as TFTerminalEntry, - previousFix, - lastCourse, - waypoint - ); + case 'TF': { + const [fixToAdd, lineToAdd] = TerminatorsTF(leg as TFTerminalEntry, previousFix, lastCourse, waypoint); update(fixToAdd, lineToAdd); break; } - case "VA": { - const [fixToAdd, lineToAdd] = TerminatorsVA( - leg as VATerminalEntry, - previousFix, - lastCourse - ); + case 'VA': { + const [fixToAdd, lineToAdd] = TerminatorsVA(leg as VATerminalEntry, previousFix, lastCourse); update(fixToAdd, lineToAdd); break; } - case "VD": { - const [fixToAdd, lineToAdd] = TerminatorsVD( - leg as VDTerminalEntry, - previousFix, - lastCourse - ); + case 'VD': { + const [fixToAdd, lineToAdd] = TerminatorsVD(leg as VDTerminalEntry, previousFix, lastCourse); update(fixToAdd, lineToAdd); break; } - case "VI": { + case 'VI': { const [fixToAdd, lineToAdd] = TerminatorsVI( leg as VITerminalEntry, procedure[index + 1], @@ -318,34 +251,26 @@ class Parser { update(fixToAdd, lineToAdd); break; } - case "VM": { - const [fixToAdd, lineToAdd] = TerminatorsVM( - leg as VMTerminalEntry, - previousFix, - lastCourse - ); + case 'VM': { + const [fixToAdd, lineToAdd] = TerminatorsVM(leg as VMTerminalEntry, previousFix, lastCourse); update(fixToAdd, lineToAdd, { isManual: true }); break; } - case "VR": { - const [fixToAdd, lineToAdd] = TerminatorsVR( - leg as VRTerminalEntry, - previousFix, - lastCourse - ); + case 'VR': { + const [fixToAdd, lineToAdd] = TerminatorsVR(leg as VRTerminalEntry, previousFix, lastCourse); update(fixToAdd, lineToAdd); break; } default: - console.error("Unknown TrackCode", leg.TrackCode); + console.error('Unknown TrackCode', leg.TrackCode); break; } } output.push( geojson.parse([...navFixes, ...lineSegments], { - LineString: "line", - Point: ["latitude", "longitude"], + LineString: 'line', + Point: ['latitude', 'longitude'], }) ); }); diff --git a/browser/src/parser/pathGenerators/generateAFArc.ts b/browser/src/parser/pathGenerators/generateAFArc.ts index d8fc2b8..78c1cc4 100644 --- a/browser/src/parser/pathGenerators/generateAFArc.ts +++ b/browser/src/parser/pathGenerators/generateAFArc.ts @@ -1,4 +1,4 @@ -import * as geolib from "geolib"; +import * as geolib from 'geolib'; /** * @param crsIntoEndpoint Course into arc endpoint @@ -21,14 +21,14 @@ export const generateAFArc = ( if (crsIntoEndpoint !== crsFromOrigin) { // Turn Dir - if (!turnDir || turnDir === "E") { + if (!turnDir || turnDir === 'E') { let prov = crsFromOrigin - crsIntoEndpoint; prov = prov > 180 ? prov - 360 : prov <= -180 ? prov + 360 : prov; - turnDir = prov > 0 ? "L" : "R"; + turnDir = prov > 0 ? 'L' : 'R'; } while (crsFromOrigin !== crsIntoEndpoint) { - if (turnDir === "R") { + if (turnDir === 'R') { const delta = (crsIntoEndpoint - crsFromOrigin).normaliseDegrees(); crsFromOrigin += delta < 1 ? delta : 1; crsFromOrigin = crsFromOrigin.normaliseDegrees(); @@ -39,11 +39,7 @@ export const generateAFArc = ( } if (crsFromOrigin === crsIntoEndpoint) break; - const arcFix = geolib.computeDestinationPoint( - center, - radius.toMetre(), - crsFromOrigin - ); + const arcFix = geolib.computeDestinationPoint(center, radius.toMetre(), crsFromOrigin); line.push([arcFix.longitude, arcFix.latitude]); } diff --git a/browser/src/parser/pathGenerators/generateOverflyArc.ts b/browser/src/parser/pathGenerators/generateOverflyArc.ts new file mode 100644 index 0000000..bc266c9 --- /dev/null +++ b/browser/src/parser/pathGenerators/generateOverflyArc.ts @@ -0,0 +1,44 @@ +import * as geolib from 'geolib'; +import { generatePerformanceArc } from './generatePerformanceArc.ts'; + +/** + * @param crsIntoEndpoint Course into arc endpoint + * @param crsFromOrigin Course from arc origin point + * @param start Arc origin point + * @param speed Speed within arc + * @param turnDir Turn direction + * @returns Line segments, arc endpoint, course into arc endpoint + */ +export const generateOverflyArc = ( + crsIntoEndpoint: number, + crsFromOrigin: number, + start: NavFix, + speed: number, + turnDir?: TurnDirection, + force360?: boolean +): [LineSegment[], NavFix, number] => { + let line: LineSegment[] = []; + + // Compute overfly arc + if (start.isFlyOver) { + line = generatePerformanceArc(crsIntoEndpoint, crsFromOrigin, start, speed, turnDir, force360); + } + // Compute procedural arc + else { + line.push([start.longitude, start.latitude]); + } + + // Get arc endpoint and crs into arc endpoint + const arcEnd = { latitude: line.at(-1)![1], longitude: line.at(-1)![0] }; + if (line.length > 1) { + crsFromOrigin = geolib.getGreatCircleBearing( + { + latitude: line.at(-2)![1], + longitude: line.at(-2)![0], + }, + arcEnd + ); + } + + return [line, arcEnd, crsFromOrigin]; +}; diff --git a/browser/src/parser/pathGenerators/generatePerformanceArc.ts b/browser/src/parser/pathGenerators/generatePerformanceArc.ts index 2870fc1..af56a02 100644 --- a/browser/src/parser/pathGenerators/generatePerformanceArc.ts +++ b/browser/src/parser/pathGenerators/generatePerformanceArc.ts @@ -1,6 +1,6 @@ -import * as geolib from "geolib"; -import Parser from "../parser.ts"; -import { computeTurnRate } from "../utils/computeTurnRate.ts"; +import * as geolib from 'geolib'; +import Parser from '../parser.ts'; +import { computeTurnRate } from '../utils/computeTurnRate.ts'; /** * @param crsIntoEndpoint Course into arc endpoint @@ -27,16 +27,16 @@ export const generatePerformanceArc = ( // Check if there even is an arc if (force360 || !crsFromOrigin.equal(crsIntoEndpoint)) { // Turn Dir - if (!turnDir || turnDir === "E") { + if (!turnDir || turnDir === 'E') { let prov = crsFromOrigin - crsIntoEndpoint; prov = prov > 180 ? prov - 360 : prov <= -180 ? prov + 360 : prov; - turnDir = prov > 0 ? "L" : "R"; + turnDir = prov > 0 ? 'L' : 'R'; } // Generate arc while (!crsFromOrigin.equal(crsIntoEndpoint)) { let time = 0; - if (turnDir === "R") { + if (turnDir === 'R') { const delta = (crsIntoEndpoint - crsFromOrigin).normaliseDegrees(); const increment = delta < 1 ? delta : 1; crsFromOrigin = (crsFromOrigin + increment).normaliseDegrees(); @@ -68,7 +68,7 @@ export const generatePerformanceArc = ( while (!crsFromOrigin.equal(crsIntoEndpoint)) { let time = 0; - if (turnDir === "R") { + if (turnDir === 'R') { const delta = (crsIntoEndpoint - crsFromOrigin).normaliseDegrees(); const increment = delta < 1 ? delta : 1; crsFromOrigin = (crsFromOrigin + increment).normaliseDegrees(); diff --git a/browser/src/parser/pathGenerators/generateRFArc.ts b/browser/src/parser/pathGenerators/generateRFArc.ts index 62ba2d5..4eeabca 100644 --- a/browser/src/parser/pathGenerators/generateRFArc.ts +++ b/browser/src/parser/pathGenerators/generateRFArc.ts @@ -1,4 +1,4 @@ -import * as geolib from "geolib"; +import * as geolib from 'geolib'; /** * @param crsIntoEndpoint Course into arc endpoint @@ -19,15 +19,15 @@ export const generateRFArc = ( if (crsIntoEndpoint !== crsIntoOrigin) { // Turn Dir - if (!turnDir || turnDir === "E") { + if (!turnDir || turnDir === 'E') { let prov = crsIntoOrigin - crsIntoEndpoint; prov = prov > 180 ? prov - 360 : prov <= -180 ? prov + 360 : prov; - turnDir = prov > 0 ? "L" : "R"; + turnDir = prov > 0 ? 'L' : 'R'; } let crsOrthogonalOnOrigin; let crsOrthogonalOnEndpoint; - if (turnDir === "R") { + if (turnDir === 'R') { crsOrthogonalOnOrigin = (crsIntoOrigin + 90).normaliseDegrees(); crsOrthogonalOnEndpoint = (crsIntoEndpoint + 90).normaliseDegrees(); } else { @@ -40,34 +40,24 @@ export const generateRFArc = ( crsOrthogonalOnOrigin = crsOrthogonalOnOrigin.reciprocalCourse(); crsOrthogonalOnEndpoint = crsOrthogonalOnEndpoint.reciprocalCourse(); // Start turn immediately - if (turnDir === "R") { - crsOrthogonalOnOrigin += - crsOrthogonalOnOrigin < 1 ? crsOrthogonalOnOrigin : 1; + if (turnDir === 'R') { + crsOrthogonalOnOrigin += crsOrthogonalOnOrigin < 1 ? crsOrthogonalOnOrigin : 1; } else { - crsOrthogonalOnOrigin -= - crsOrthogonalOnOrigin < 1 ? crsOrthogonalOnOrigin : 1; + crsOrthogonalOnOrigin -= crsOrthogonalOnOrigin < 1 ? crsOrthogonalOnOrigin : 1; } while (crsOrthogonalOnOrigin !== crsOrthogonalOnEndpoint) { - if (turnDir === "R") { - const delta = ( - crsOrthogonalOnEndpoint - crsOrthogonalOnOrigin - ).normaliseDegrees(); + if (turnDir === 'R') { + const delta = (crsOrthogonalOnEndpoint - crsOrthogonalOnOrigin).normaliseDegrees(); crsOrthogonalOnOrigin += delta < 1 ? delta : 1; crsOrthogonalOnOrigin = crsOrthogonalOnOrigin.normaliseDegrees(); } else { - const delta = ( - crsOrthogonalOnOrigin - crsOrthogonalOnEndpoint - ).normaliseDegrees(); + const delta = (crsOrthogonalOnOrigin - crsOrthogonalOnEndpoint).normaliseDegrees(); crsOrthogonalOnOrigin -= delta < 1 ? delta : 1; crsOrthogonalOnOrigin = crsOrthogonalOnOrigin.normaliseDegrees(); } - const arcFix = geolib.computeDestinationPoint( - center, - arcRad, - crsOrthogonalOnOrigin - ); + const arcFix = geolib.computeDestinationPoint(center, arcRad, crsOrthogonalOnOrigin); line.push([arcFix.longitude, arcFix.latitude]); } diff --git a/browser/src/parser/pathGenerators/generateTangentArc.ts b/browser/src/parser/pathGenerators/generateTangentArc.ts index d5b5568..15d17e7 100644 --- a/browser/src/parser/pathGenerators/generateTangentArc.ts +++ b/browser/src/parser/pathGenerators/generateTangentArc.ts @@ -1,5 +1,5 @@ -import * as geolib from "geolib"; -import { computeIntersection } from "../utils/computeIntersection.ts"; +import * as geolib from 'geolib'; +import { computeIntersection } from '../utils/computeIntersection.ts'; /** * @param crsIntoEndpoint Course into arc endpoint @@ -22,12 +22,12 @@ export const generateTangentArc = ( if (!crsFromOrigin.equal(crsIntoEndpoint)) { // Course to the end of the arc let crsFromStartToEnd; - if (!turnDir || turnDir === "E") { + if (!turnDir || turnDir === 'E') { let prov = crsFromOrigin - crsIntoEndpoint; prov = prov > 180 ? prov - 360 : prov <= -180 ? prov + 360 : prov; - turnDir = prov > 0 ? "L" : "R"; + turnDir = prov > 0 ? 'L' : 'R'; } - if (turnDir === "R") { + if (turnDir === 'R') { const delta = (360 - crsFromOrigin + crsIntoEndpoint).normaliseDegrees(); crsFromStartToEnd = (crsFromOrigin + delta / 2).normaliseDegrees(); } else { @@ -46,7 +46,7 @@ export const generateTangentArc = ( let crsOrthogonalOnOrigin; let crsOrthogonalOnEndpoint; - if (turnDir === "R") { + if (turnDir === 'R') { crsOrthogonalOnOrigin = (crsFromOrigin + 90).normaliseDegrees(); crsOrthogonalOnEndpoint = (crsIntoEndpoint + 90).normaliseDegrees(); } else { @@ -67,34 +67,24 @@ export const generateTangentArc = ( crsOrthogonalOnOrigin = crsOrthogonalOnOrigin.reciprocalCourse(); crsOrthogonalOnEndpoint = crsOrthogonalOnEndpoint.reciprocalCourse(); // Start turn immediately - if (turnDir === "R") { - crsOrthogonalOnOrigin += - crsOrthogonalOnOrigin < 1 ? crsOrthogonalOnOrigin : 1; + if (turnDir === 'R') { + crsOrthogonalOnOrigin += crsOrthogonalOnOrigin < 1 ? crsOrthogonalOnOrigin : 1; } else { - crsOrthogonalOnOrigin -= - crsOrthogonalOnOrigin < 1 ? crsOrthogonalOnOrigin : 1; + crsOrthogonalOnOrigin -= crsOrthogonalOnOrigin < 1 ? crsOrthogonalOnOrigin : 1; } while (!crsOrthogonalOnOrigin.equal(crsOrthogonalOnEndpoint)) { - if (turnDir === "R") { - const delta = ( - crsOrthogonalOnEndpoint - crsOrthogonalOnOrigin - ).normaliseDegrees(); + if (turnDir === 'R') { + const delta = (crsOrthogonalOnEndpoint - crsOrthogonalOnOrigin).normaliseDegrees(); crsOrthogonalOnOrigin += delta < 1 ? delta : 1; crsOrthogonalOnOrigin = crsOrthogonalOnOrigin.normaliseDegrees(); } else { - const delta = ( - crsOrthogonalOnOrigin - crsOrthogonalOnEndpoint - ).normaliseDegrees(); + const delta = (crsOrthogonalOnOrigin - crsOrthogonalOnEndpoint).normaliseDegrees(); crsOrthogonalOnOrigin -= delta < 1 ? delta : 1; crsOrthogonalOnOrigin = crsOrthogonalOnOrigin.normaliseDegrees(); } - const arcFix = geolib.computeDestinationPoint( - arcCenter, - arcRad, - crsOrthogonalOnOrigin - ); + const arcFix = geolib.computeDestinationPoint(arcCenter, arcRad, crsOrthogonalOnOrigin); line.push([arcFix.longitude, arcFix.latitude]); } diff --git a/browser/src/parser/pathGenerators/handleTurnAtFix.ts b/browser/src/parser/pathGenerators/handleTurnAtFix.ts index 9f6878a..d9b7d5a 100644 --- a/browser/src/parser/pathGenerators/handleTurnAtFix.ts +++ b/browser/src/parser/pathGenerators/handleTurnAtFix.ts @@ -1,6 +1,6 @@ -import * as geolib from "geolib"; -import { generateTangentArc } from "./generateTangentArc.ts"; -import { generatePerformanceArc } from "./generatePerformanceArc.ts"; +import * as geolib from 'geolib'; +import { generatePerformanceArc } from './generatePerformanceArc.ts'; +import { generateTangentArc } from './generateTangentArc.ts'; /** * @param crsIntoEndpoint Course into endpoint @@ -25,21 +25,9 @@ export const handleTurnAtFix = ( // Overfly turn if (start.isFlyOver) { - const arc1 = generateTangentArc( - crsIntoEndpoint, - crsFromOrigin, - start, - end, - turnDir - ); + const arc1 = generateTangentArc(crsIntoEndpoint, crsFromOrigin, start, end, turnDir); - const arc2 = generatePerformanceArc( - crsIntoIntercept, - crsFromOrigin, - start, - speed, - turnDir - ); + const arc2 = generatePerformanceArc(crsIntoIntercept, crsFromOrigin, start, speed, turnDir); // Decide on arc let arc; @@ -52,8 +40,7 @@ export const handleTurnAtFix = ( end ); - if (endCrs <= crsIntoEndpoint + 1 && endCrs >= crsIntoEndpoint - 1) - arc = arc1; + if (endCrs <= crsIntoEndpoint + 1 && endCrs >= crsIntoEndpoint - 1) arc = arc1; else arc = arc2; } else { arc = arc2; diff --git a/browser/src/parser/terminators/AF.ts b/browser/src/parser/terminators/AF.ts index 2ef3159..35d4362 100644 --- a/browser/src/parser/terminators/AF.ts +++ b/browser/src/parser/terminators/AF.ts @@ -1,6 +1,6 @@ -import * as geolib from "geolib"; -import { generateAFArc } from "../pathGenerators/generateAFArc.ts"; -import { computeSpeed } from "../utils/computeSpeed.ts"; +import * as geolib from 'geolib'; +import { generateAFArc } from '../pathGenerators/generateAFArc.ts'; +import { computeSpeed } from '../utils/computeSpeed.ts'; export const TerminatorsAF = ( leg: AFTerminalEntry, diff --git a/browser/src/parser/terminators/CA.ts b/browser/src/parser/terminators/CA.ts index af9ffa3..620c97e 100644 --- a/browser/src/parser/terminators/CA.ts +++ b/browser/src/parser/terminators/CA.ts @@ -1,7 +1,7 @@ -import * as geolib from "geolib"; -import Parser from "../parser.ts"; -import { computeSpeed } from "../utils/computeSpeed.ts"; -import { generatePerformanceArc } from "../pathGenerators/generatePerformanceArc.ts"; +import * as geolib from 'geolib'; +import Parser from '../parser.ts'; +import { generateOverflyArc } from '../pathGenerators/generateOverflyArc.ts'; +import { computeSpeed } from '../utils/computeSpeed.ts'; export const TerminatorsCA = ( leg: CATerminalEntry, @@ -11,37 +11,16 @@ export const TerminatorsCA = ( const speed = computeSpeed(leg, previousFix); const crsIntoEndpoint = leg.Course.toTrue(previousFix); - let line: LineSegment[] = []; - - if (previousFix.isFlyOver) { - line = generatePerformanceArc( - crsIntoEndpoint, - lastCourse, - previousFix, - speed, - leg.TurnDir - ); - } else { - line.push([previousFix.longitude, previousFix.latitude]); - } - - const arcEnd = { latitude: line.at(-1)![1], longitude: line.at(-1)![0] }; - if (line.length > 1) { - lastCourse = geolib.getGreatCircleBearing( - { - latitude: line.at(-2)![1], - longitude: line.at(-2)![0], - }, - arcEnd - ); - } + // Compute overfly + const [line, arcEnd, _lastCourse] = generateOverflyArc(crsIntoEndpoint, lastCourse, previousFix, speed, leg.TurnDir); + lastCourse = _lastCourse; + // Compute intercept of crs from arc end and expected altitude const targetFix: NavFix = { ...geolib.computeDestinationPoint( arcEnd, ( - ((leg.Alt.parseAltitude() - (previousFix.altitude ?? 0)) / - Parser.AC_VS) * + ((leg.Alt.parseAltitude() - (previousFix.altitude ?? 0)) / Parser.AC_VS) * ((previousFix.speed ? previousFix.speed : Parser.AC_SPEED) / 60) ).toMetre(), crsIntoEndpoint @@ -53,7 +32,6 @@ export const TerminatorsCA = ( speedConstraint: leg.SpeedLimit, altitudeConstraint: leg.Alt, }; - line.push([targetFix.longitude, targetFix.latitude]); return [targetFix, line]; diff --git a/browser/src/parser/terminators/CD.ts b/browser/src/parser/terminators/CD.ts index 26a460c..df03108 100644 --- a/browser/src/parser/terminators/CD.ts +++ b/browser/src/parser/terminators/CD.ts @@ -1,6 +1,6 @@ -import * as geolib from "geolib"; -import { computeSpeed } from "../utils/computeSpeed.ts"; -import { generatePerformanceArc } from "../pathGenerators/generatePerformanceArc.ts"; +import * as geolib from 'geolib'; +import { generateOverflyArc } from '../pathGenerators/generateOverflyArc.ts'; +import { computeSpeed } from '../utils/computeSpeed.ts'; // NOTE: Distance not adjusted for altitude in this demo export const TerminatorsCD = ( @@ -12,35 +12,14 @@ export const TerminatorsCD = ( latitude: leg.NavLat, longitude: leg.NavLon, }; + const crsIntoEndpoint = leg.Course.toTrue(previousFix); const speed = computeSpeed(leg, previousFix); - let line: LineSegment[] = []; - - if (previousFix.isFlyOver) { - const crsIntoEndpoint = leg.Course.toTrue(previousFix); - - line = generatePerformanceArc( - crsIntoEndpoint, - lastCourse, - previousFix, - speed, - leg.TurnDir - ); - } else { - line.push([previousFix.longitude, previousFix.latitude]); - } - - const arcEnd = { latitude: line.at(-1)![1], longitude: line.at(-1)![0] }; - if (line.length > 1) { - lastCourse = geolib.getGreatCircleBearing( - { - latitude: line.at(-2)![1], - longitude: line.at(-2)![0], - }, - arcEnd - ); - } + // Compute overfly + const [line, arcEnd, _lastCourse] = generateOverflyArc(crsIntoEndpoint, lastCourse, previousFix, speed, leg.TurnDir); + lastCourse = _lastCourse; + // Compute distance to fly from arc end const crsToNavaid = geolib.getGreatCircleBearing(arcEnd, navaid); const distToNavaid = geolib.getDistance(arcEnd, navaid); let remainingDistance = leg.Distance.toMetre(); @@ -51,9 +30,10 @@ export const TerminatorsCD = ( // Navaid in front of us else { // Navaid will not be passed before distance is hit - if (distToNavaid > remainingDistance) - remainingDistance = distToNavaid - remainingDistance; + if (distToNavaid > remainingDistance) remainingDistance = distToNavaid - remainingDistance; } + + // Compute intercept of crs from arc end and distance const targetFix: NavFix = { ...geolib.computeDestinationPoint(arcEnd, remainingDistance, lastCourse), name: leg.Distance.toString(), @@ -63,7 +43,6 @@ export const TerminatorsCD = ( speedConstraint: leg.SpeedLimit, altitudeConstraint: leg.Alt, }; - line.push([targetFix.longitude, targetFix.latitude]); return [targetFix, line]; diff --git a/browser/src/parser/terminators/CF.ts b/browser/src/parser/terminators/CF.ts index adf64a5..e8b426d 100644 --- a/browser/src/parser/terminators/CF.ts +++ b/browser/src/parser/terminators/CF.ts @@ -1,5 +1,5 @@ -import { handleTurnAtFix } from "../pathGenerators/handleTurnAtFix.ts"; -import { computeSpeed } from "../utils/computeSpeed.ts"; +import { handleTurnAtFix } from '../pathGenerators/handleTurnAtFix.ts'; +import { computeSpeed } from '../utils/computeSpeed.ts'; export const TerminatorsCF = ( leg: CFTerminalEntry, @@ -20,6 +20,7 @@ export const TerminatorsCF = ( altitudeConstraint: leg.Alt, }; + // Compute arc const line = handleTurnAtFix( leg.Course.toTrue(previousFix), leg.Course.toTrue(previousFix), diff --git a/browser/src/parser/terminators/CI.ts b/browser/src/parser/terminators/CI.ts index 6196df7..388da6c 100644 --- a/browser/src/parser/terminators/CI.ts +++ b/browser/src/parser/terminators/CI.ts @@ -1,7 +1,7 @@ -import { handleTurnAtFix } from "../pathGenerators/handleTurnAtFix.ts"; -import { computeIntersection } from "../utils/computeIntersection.ts"; -import { computeSpeed } from "../utils/computeSpeed.ts"; -import { getCourseAndFixForIntercepts } from "../utils/getCourseAndFixForIntercepts.ts"; +import { handleTurnAtFix } from '../pathGenerators/handleTurnAtFix.ts'; +import { computeIntersection } from '../utils/computeIntersection.ts'; +import { computeSpeed } from '../utils/computeSpeed.ts'; +import { getCourseAndFixForIntercepts } from '../utils/getCourseAndFixForIntercepts.ts'; export const TerminatorsCI = ( leg: CITerminalEntry, @@ -12,14 +12,9 @@ export const TerminatorsCI = ( const [crs, nextFix] = getCourseAndFixForIntercepts(nextLeg, previousFix); const speed = computeSpeed(leg, previousFix); - // Compute INTC + // Compute intercept fix const interceptFix: NavFix = { - ...computeIntersection( - previousFix, - leg.Course.toTrue(nextFix), - nextFix, - crs - )!, + ...computeIntersection(previousFix, leg.Course.toTrue(nextFix), nextFix, crs)!, isFlyOver: leg.IsFlyOver, altitude: leg.Alt ? leg.Alt.parseAltitude() : previousFix.altitude, speed: speed, @@ -27,6 +22,7 @@ export const TerminatorsCI = ( altitudeConstraint: leg.Alt, }; + // Compute arc const line = handleTurnAtFix( crs, leg.Course.toTrue(nextFix), @@ -37,7 +33,7 @@ export const TerminatorsCI = ( leg.TurnDir ); - // Intercept based on previous intercept + // Recompute intercept const interceptPoint2 = computeIntersection( { latitude: line.at(-2)![1], longitude: line.at(-2)![0] }, leg.Course.toTrue(nextFix), @@ -47,10 +43,7 @@ export const TerminatorsCI = ( if (interceptPoint2) return [ { ...interceptFix, ...interceptPoint2 }, - [ - ...line.slice(0, -1), - [interceptPoint2.longitude, interceptPoint2.latitude], - ], + [...line.slice(0, -1), [interceptPoint2.longitude, interceptPoint2.latitude]], ]; return [interceptFix, line]; diff --git a/browser/src/parser/terminators/CR.ts b/browser/src/parser/terminators/CR.ts index 9dd6e7d..e9756b2 100644 --- a/browser/src/parser/terminators/CR.ts +++ b/browser/src/parser/terminators/CR.ts @@ -1,7 +1,6 @@ -import * as geolib from "geolib"; -import { computeIntersection } from "../utils/computeIntersection.ts"; -import { computeSpeed } from "../utils/computeSpeed.ts"; -import { generatePerformanceArc } from "../pathGenerators/generatePerformanceArc.ts"; +import { generateOverflyArc } from '../pathGenerators/generateOverflyArc.ts'; +import { computeIntersection } from '../utils/computeIntersection.ts'; +import { computeSpeed } from '../utils/computeSpeed.ts'; export const TerminatorsCR = ( leg: CRTerminalEntry, @@ -16,31 +15,11 @@ export const TerminatorsCR = ( const crsIntoEndpoint = leg.NavBear.toTrue(navaid); const speed = computeSpeed(leg, previousFix); - let line: LineSegment[] = []; - - if (previousFix.isFlyOver) { - line = generatePerformanceArc( - crsFromEndpoint, - lastCourse, - previousFix, - speed, - leg.TurnDir - ); - } else { - line.push([previousFix.longitude, previousFix.latitude]); - } - - const arcEnd = { latitude: line.at(-1)![1], longitude: line.at(-1)![0] }; - if (line.length > 1) { - lastCourse = geolib.getGreatCircleBearing( - { - latitude: line.at(-2)![1], - longitude: line.at(-2)![0], - }, - arcEnd - ); - } + // Compute overfly + const [line, arcEnd, _lastCourse] = generateOverflyArc(crsFromEndpoint, lastCourse, previousFix, speed, leg.TurnDir); + lastCourse = _lastCourse; + // Compute intercept of crs from arc end and radial const interceptFix: NavFix = { ...computeIntersection(arcEnd, crsFromEndpoint, navaid, crsIntoEndpoint)!, isFlyOver: leg.IsFlyOver, @@ -49,7 +28,6 @@ export const TerminatorsCR = ( speedConstraint: leg.SpeedLimit, altitudeConstraint: leg.Alt, }; - line.push([interceptFix.longitude, interceptFix.latitude]); return [interceptFix, line]; diff --git a/browser/src/parser/terminators/DF.ts b/browser/src/parser/terminators/DF.ts index c87dfa1..e7b27ba 100644 --- a/browser/src/parser/terminators/DF.ts +++ b/browser/src/parser/terminators/DF.ts @@ -1,6 +1,6 @@ -import * as geolib from "geolib"; -import { computeSpeed } from "../utils/computeSpeed.ts"; -import { generatePerformanceArc } from "../pathGenerators/generatePerformanceArc.ts"; +import * as geolib from 'geolib'; +import { generateOverflyArc } from '../pathGenerators/generateOverflyArc.ts'; +import { computeSpeed } from '../utils/computeSpeed.ts'; export const TerminatorsDF = ( leg: DFTerminalEntry, @@ -21,26 +21,18 @@ export const TerminatorsDF = ( altitudeConstraint: leg.Alt, }; - let line: LineSegment[] = []; + const crsIntoEndpoint = geolib.getGreatCircleBearing(previousFix, targetFix); - if (previousFix.isFlyOver) { - const crsIntoEndpoint = geolib.getGreatCircleBearing( - previousFix, - targetFix - ); - - line = generatePerformanceArc( - crsIntoEndpoint, - lastCourse, - previousFix, - speed, - leg.TurnDir, - previousFix.latitude.equal(targetFix.latitude) && - previousFix.longitude.equal(targetFix.longitude) - ); - } else { - line.push([previousFix.longitude, previousFix.latitude]); - } + // Compute overfly + const [line, _, _lastCourse] = generateOverflyArc( + crsIntoEndpoint, + lastCourse, + previousFix, + speed, + leg.TurnDir, + previousFix.latitude.equal(targetFix.latitude) && previousFix.longitude.equal(targetFix.longitude) + ); + lastCourse = _lastCourse; line.push([targetFix.longitude, targetFix.latitude]); diff --git a/browser/src/parser/terminators/FA.ts b/browser/src/parser/terminators/FA.ts index 9ef3123..c83c9f3 100644 --- a/browser/src/parser/terminators/FA.ts +++ b/browser/src/parser/terminators/FA.ts @@ -1,7 +1,7 @@ -import * as geolib from "geolib"; -import { computeSpeed } from "../utils/computeSpeed.ts"; -import Parser from "../parser.ts"; -import { generatePerformanceArc } from "../pathGenerators/generatePerformanceArc.ts"; +import * as geolib from 'geolib'; +import Parser from '../parser.ts'; +import { generateOverflyArc } from '../pathGenerators/generateOverflyArc.ts'; +import { computeSpeed } from '../utils/computeSpeed.ts'; export const TerminatorsFA = ( leg: FATerminalEntry, @@ -15,37 +15,16 @@ export const TerminatorsFA = ( const speed = computeSpeed(leg, previousFix); const crsIntoEndpoint = leg.Course.toTrue(refFix); - let line: LineSegment[] = []; - - if (previousFix.isFlyOver) { - line = generatePerformanceArc( - crsIntoEndpoint, - lastCourse, - previousFix, - speed, - leg.TurnDir - ); - } else { - line.push([previousFix.longitude, previousFix.latitude]); - } - - const arcEnd = { latitude: line.at(-1)![1], longitude: line.at(-1)![0] }; - if (line.length > 1) { - lastCourse = geolib.getGreatCircleBearing( - { - latitude: line.at(-2)![1], - longitude: line.at(-2)![0], - }, - arcEnd - ); - } + // Compute overfly + const [line, arcEnd, _lastCourse] = generateOverflyArc(crsIntoEndpoint, lastCourse, previousFix, speed, leg.TurnDir); + lastCourse = _lastCourse; + // Compute intercept of crs from arc end and expected altitude const targetFix: NavFix = { ...geolib.computeDestinationPoint( arcEnd, ( - ((leg.Alt.parseAltitude() - (previousFix.altitude ?? 0)) / - Parser.AC_VS) * + ((leg.Alt.parseAltitude() - (previousFix.altitude ?? 0)) / Parser.AC_VS) * ((previousFix.speed ? previousFix.speed : Parser.AC_SPEED) / 60) ).toMetre(), crsIntoEndpoint @@ -57,7 +36,6 @@ export const TerminatorsFA = ( speedConstraint: leg.SpeedLimit, altitudeConstraint: leg.Alt, }; - line.push([targetFix.longitude, targetFix.latitude]); return [targetFix, line]; diff --git a/browser/src/parser/terminators/FC.ts b/browser/src/parser/terminators/FC.ts index 545773f..4678df1 100644 --- a/browser/src/parser/terminators/FC.ts +++ b/browser/src/parser/terminators/FC.ts @@ -1,7 +1,7 @@ -import * as geolib from "geolib"; -import { computeSpeed } from "../utils/computeSpeed.ts"; -import Parser from "../parser.ts"; -import { computeTurnRate } from "../utils/computeTurnRate.ts"; +import * as geolib from 'geolib'; +import Parser from '../parser.ts'; +import { computeSpeed } from '../utils/computeSpeed.ts'; +import { computeTurnRate } from '../utils/computeTurnRate.ts'; // NOTE: Distance not adjusted for altitude in this demo export const TerminatorsFC = ( @@ -25,17 +25,17 @@ export const TerminatorsFC = ( // Check if there even is an arc if (!crsIntoEndpoint.equal(lastCourse)) { // Turn Dir - if (!leg.TurnDir || leg.TurnDir === "E") { + if (!leg.TurnDir || leg.TurnDir === 'E') { let prov = lastCourse - crsIntoEndpoint; prov = prov > 180 ? prov - 360 : prov <= -180 ? prov + 360 : prov; - leg.TurnDir = prov > 0 ? "L" : "R"; + leg.TurnDir = prov > 0 ? 'L' : 'R'; } // Generate arc let condition = false; do { let time = 0; - if (leg.TurnDir === "R") { + if (leg.TurnDir === 'R') { const delta = (crsIntoEndpoint - lastCourse).normaliseDegrees(); const increment = delta < 1 ? delta : 1; lastCourse = (lastCourse + increment).normaliseDegrees(); @@ -58,7 +58,7 @@ export const TerminatorsFC = ( line.push([arcFix.longitude, arcFix.latitude]); - if (leg.TurnDir === "R") { + if (leg.TurnDir === 'R') { condition = lastCourse > trackIntoEndpoint; } else { condition = lastCourse < trackIntoEndpoint; @@ -79,11 +79,7 @@ export const TerminatorsFC = ( } const targetFix: NavFix = { - ...geolib.computeDestinationPoint( - arcEnd, - leg.Distance.toMetre(), - lastCourse - ), + ...geolib.computeDestinationPoint(arcEnd, leg.Distance.toMetre(), lastCourse), name: leg.Distance.toString(), isFlyOver: true, altitude: leg.Alt ? leg.Alt.parseAltitude() : previousFix.altitude, diff --git a/browser/src/parser/terminators/FD.ts b/browser/src/parser/terminators/FD.ts index d3648be..0a7e618 100644 --- a/browser/src/parser/terminators/FD.ts +++ b/browser/src/parser/terminators/FD.ts @@ -1,6 +1,6 @@ -import * as geolib from "geolib"; -import { computeSpeed } from "../utils/computeSpeed.ts"; -import { generatePerformanceArc } from "../pathGenerators/generatePerformanceArc.ts"; +import * as geolib from 'geolib'; +import { generateOverflyArc } from '../pathGenerators/generateOverflyArc.ts'; +import { computeSpeed } from '../utils/computeSpeed.ts'; // NOTE: Distance not adjusted for altitude in this demo export const TerminatorsFD = ( @@ -16,35 +16,14 @@ export const TerminatorsFD = ( latitude: leg.NavLat, longitude: leg.NavLon, }; + const crsIntoEndpoint = leg.Course.toTrue(refFix); const speed = computeSpeed(leg, previousFix); - let line: LineSegment[] = []; - - if (previousFix.isFlyOver) { - const crsIntoEndpoint = leg.Course.toTrue(refFix); - - line = generatePerformanceArc( - crsIntoEndpoint, - lastCourse, - previousFix, - speed, - leg.TurnDir - ); - } else { - line.push([previousFix.longitude, previousFix.latitude]); - } - - const arcEnd = { latitude: line.at(-1)![1], longitude: line.at(-1)![0] }; - if (line.length > 1) { - lastCourse = geolib.getGreatCircleBearing( - { - latitude: line.at(-2)![1], - longitude: line.at(-2)![0], - }, - arcEnd - ); - } + // Compute overfly + const [line, arcEnd, _lastCourse] = generateOverflyArc(crsIntoEndpoint, lastCourse, previousFix, speed, leg.TurnDir); + lastCourse = _lastCourse; + // Compute distance to fly from arc end const crsToNavaid = geolib.getGreatCircleBearing(arcEnd, navaid); const distToNavaid = geolib.getDistance(arcEnd, navaid); let remainingDistance = leg.Distance.toMetre(); @@ -55,9 +34,10 @@ export const TerminatorsFD = ( // Navaid in front of us else { // Navaid will not be passed before distance is hit - if (distToNavaid > remainingDistance) - remainingDistance = distToNavaid - remainingDistance; + if (distToNavaid > remainingDistance) remainingDistance = distToNavaid - remainingDistance; } + + // Compute intercept of crs from arc end and distance const targetFix: NavFix = { ...geolib.computeDestinationPoint(arcEnd, remainingDistance, lastCourse), name: leg.Distance.toString(), @@ -67,7 +47,6 @@ export const TerminatorsFD = ( speedConstraint: leg.SpeedLimit, altitudeConstraint: leg.Alt, }; - line.push([targetFix.longitude, targetFix.latitude]); return [targetFix, line]; diff --git a/browser/src/parser/terminators/FM.ts b/browser/src/parser/terminators/FM.ts index b6d3a22..9d0f7cf 100644 --- a/browser/src/parser/terminators/FM.ts +++ b/browser/src/parser/terminators/FM.ts @@ -1,6 +1,6 @@ -import * as geolib from "geolib"; -import { handleTurnAtFix } from "../pathGenerators/handleTurnAtFix.ts"; -import { computeSpeed } from "../utils/computeSpeed.ts"; +import * as geolib from 'geolib'; +import { handleTurnAtFix } from '../pathGenerators/handleTurnAtFix.ts'; +import { computeSpeed } from '../utils/computeSpeed.ts'; export const TerminatorsFM = ( leg: FMTerminalEntry, @@ -9,11 +9,7 @@ export const TerminatorsFM = ( ): [NavFix?, LineSegment[]?] => { const speed = computeSpeed(leg, previousFix); - const endpoint = geolib.computeDestinationPoint( - previousFix, - (10).toMetre(), - leg.Course.toTrue(previousFix) - ); + const endpoint = geolib.computeDestinationPoint(previousFix, (10).toMetre(), leg.Course.toTrue(previousFix)); const line = handleTurnAtFix( leg.Course.toTrue(previousFix), diff --git a/browser/src/parser/terminators/IF.ts b/browser/src/parser/terminators/IF.ts index 2e74d64..bcd0559 100644 --- a/browser/src/parser/terminators/IF.ts +++ b/browser/src/parser/terminators/IF.ts @@ -1,9 +1,6 @@ -import Parser from "../parser.ts"; +import Parser from '../parser.ts'; -export const TerminatorsIF = ( - leg: IFTerminalEntry, - waypoint?: Waypoint -): NavFix => { +export const TerminatorsIF = (leg: IFTerminalEntry, waypoint?: Waypoint): NavFix => { const targetFix: NavFix = { latitude: leg.WptLat, longitude: leg.WptLon, diff --git a/browser/src/parser/terminators/RF.ts b/browser/src/parser/terminators/RF.ts index a423811..42def2c 100644 --- a/browser/src/parser/terminators/RF.ts +++ b/browser/src/parser/terminators/RF.ts @@ -1,6 +1,6 @@ -import { getCourseAndFixForIntercepts } from "../utils/getCourseAndFixForIntercepts.ts"; -import { generateRFArc } from "../pathGenerators/generateRFArc.ts"; -import { computeSpeed } from "../utils/computeSpeed.ts"; +import { generateRFArc } from '../pathGenerators/generateRFArc.ts'; +import { computeSpeed } from '../utils/computeSpeed.ts'; +import { getCourseAndFixForIntercepts } from '../utils/getCourseAndFixForIntercepts.ts'; export const TerminatorsRF = ( leg: RFTerminalEntry, diff --git a/browser/src/parser/terminators/TF.ts b/browser/src/parser/terminators/TF.ts index 153b546..656e509 100644 --- a/browser/src/parser/terminators/TF.ts +++ b/browser/src/parser/terminators/TF.ts @@ -1,6 +1,6 @@ -import * as geolib from "geolib"; -import { computeSpeed } from "../utils/computeSpeed.ts"; -import Parser from "../parser.ts"; +import * as geolib from 'geolib'; +import Parser from '../parser.ts'; +import { computeSpeed } from '../utils/computeSpeed.ts'; export const TerminatorsTF = ( leg: TFTerminalEntry, @@ -21,10 +21,7 @@ export const TerminatorsTF = ( const line: LineSegment[] = [[previousFix.longitude, previousFix.latitude]]; - const trackIntoEndpoint = geolib.getGreatCircleBearing( - previousFix, - targetFix - ); + const trackIntoEndpoint = geolib.getGreatCircleBearing(previousFix, targetFix); if (previousFix.isFlyOver) { let crsIntoEndpoint = trackIntoEndpoint; @@ -32,16 +29,16 @@ export const TerminatorsTF = ( // Check if there even is an arc if (crsIntoEndpoint !== lastCourse) { // Turn Dir - if (!leg.TurnDir || leg.TurnDir === "E") { + if (!leg.TurnDir || leg.TurnDir === 'E') { let prov = lastCourse - crsIntoEndpoint; prov = prov > 180 ? prov - 360 : prov <= -180 ? prov + 360 : prov; - leg.TurnDir = prov > 0 ? "L" : "R"; + leg.TurnDir = prov > 0 ? 'L' : 'R'; } // Generate arc let condition = false; do { - if (leg.TurnDir === "R") { + if (leg.TurnDir === 'R') { const delta = (crsIntoEndpoint - lastCourse).normaliseDegrees(); lastCourse += delta < 1 ? delta : 1; lastCourse = lastCourse.normaliseDegrees(); @@ -56,9 +53,7 @@ export const TerminatorsTF = ( latitude: line.at(-1)![1], longitude: line.at(-1)![0], }, - ( - (previousFix.speed ? previousFix.speed : Parser.AC_SPEED) / 3600 - ).toMetre(), + ((previousFix.speed ? previousFix.speed : Parser.AC_SPEED) / 3600).toMetre(), lastCourse ); @@ -66,7 +61,7 @@ export const TerminatorsTF = ( crsIntoEndpoint = geolib.getGreatCircleBearing(arcFix, targetFix); - if (leg.TurnDir === "R") { + if (leg.TurnDir === 'R') { condition = crsIntoEndpoint > trackIntoEndpoint; } else { condition = crsIntoEndpoint < trackIntoEndpoint; diff --git a/browser/src/parser/terminators/VA.ts b/browser/src/parser/terminators/VA.ts index f054e6e..e9b2e55 100644 --- a/browser/src/parser/terminators/VA.ts +++ b/browser/src/parser/terminators/VA.ts @@ -1,7 +1,7 @@ -import * as geolib from "geolib"; -import Parser from "../parser.ts"; -import { computeSpeed } from "../utils/computeSpeed.ts"; -import { generatePerformanceArc } from "../pathGenerators/generatePerformanceArc.ts"; +import * as geolib from 'geolib'; +import Parser from '../parser.ts'; +import { generateOverflyArc } from '../pathGenerators/generateOverflyArc.ts'; +import { computeSpeed } from '../utils/computeSpeed.ts'; // NOTE: No wind adjustments to be made, no clue how *that* would draw export const TerminatorsVA = ( @@ -12,37 +12,16 @@ export const TerminatorsVA = ( const speed = computeSpeed(leg, previousFix); const crsIntoEndpoint = leg.Course.toTrue(previousFix); - let line: LineSegment[] = []; - - if (previousFix.isFlyOver) { - line = generatePerformanceArc( - crsIntoEndpoint, - lastCourse, - previousFix, - speed, - leg.TurnDir - ); - } else { - line.push([previousFix.longitude, previousFix.latitude]); - } - - const arcEnd = { latitude: line.at(-1)![1], longitude: line.at(-1)![0] }; - if (line.length > 1) { - lastCourse = geolib.getGreatCircleBearing( - { - latitude: line.at(-2)![1], - longitude: line.at(-2)![0], - }, - arcEnd - ); - } + // Compute overfly + const [line, arcEnd, _lastCourse] = generateOverflyArc(crsIntoEndpoint, lastCourse, previousFix, speed, leg.TurnDir); + lastCourse = _lastCourse; + // Compute intercept of crs from arc end and expected altitude const targetFix: NavFix = { ...geolib.computeDestinationPoint( arcEnd, ( - ((leg.Alt.parseAltitude() - (previousFix.altitude ?? 0)) / - Parser.AC_VS) * + ((leg.Alt.parseAltitude() - (previousFix.altitude ?? 0)) / Parser.AC_VS) * ((previousFix.speed ? previousFix.speed : Parser.AC_SPEED) / 60) ).toMetre(), crsIntoEndpoint @@ -54,7 +33,6 @@ export const TerminatorsVA = ( speedConstraint: leg.SpeedLimit, altitudeConstraint: leg.Alt, }; - line.push([targetFix.longitude, targetFix.latitude]); return [targetFix, line]; diff --git a/browser/src/parser/terminators/VD.ts b/browser/src/parser/terminators/VD.ts index a104df3..1906bb8 100644 --- a/browser/src/parser/terminators/VD.ts +++ b/browser/src/parser/terminators/VD.ts @@ -1,6 +1,6 @@ -import * as geolib from "geolib"; -import { computeSpeed } from "../utils/computeSpeed.ts"; -import { generatePerformanceArc } from "../pathGenerators/generatePerformanceArc.ts"; +import * as geolib from 'geolib'; +import { generateOverflyArc } from '../pathGenerators/generateOverflyArc.ts'; +import { computeSpeed } from '../utils/computeSpeed.ts'; // NOTE: No wind adjustments to be made, no clue how *that* would draw // NOTE: Distance not adjusted for altitude in this demo @@ -13,35 +13,14 @@ export const TerminatorsVD = ( latitude: leg.NavLat, longitude: leg.NavLon, }; + const crsIntoEndpoint = leg.Course.toTrue(previousFix); const speed = computeSpeed(leg, previousFix); - let line: LineSegment[] = []; - - if (previousFix.isFlyOver) { - const crsIntoEndpoint = leg.Course.toTrue(previousFix); - - line = generatePerformanceArc( - crsIntoEndpoint, - lastCourse, - previousFix, - speed, - leg.TurnDir - ); - } else { - line.push([previousFix.longitude, previousFix.latitude]); - } - - const arcEnd = { latitude: line.at(-1)![1], longitude: line.at(-1)![0] }; - if (line.length > 1) { - lastCourse = geolib.getGreatCircleBearing( - { - latitude: line.at(-2)![1], - longitude: line.at(-2)![0], - }, - arcEnd - ); - } + // Compute overfly + const [line, arcEnd, _lastCourse] = generateOverflyArc(crsIntoEndpoint, lastCourse, previousFix, speed, leg.TurnDir); + lastCourse = _lastCourse; + // Compute distance to fly from arc end const crsToNavaid = geolib.getGreatCircleBearing(arcEnd, navaid); const distToNavaid = geolib.getDistance(arcEnd, navaid); let remainingDistance = leg.Distance.toMetre(); @@ -52,9 +31,10 @@ export const TerminatorsVD = ( // Navaid in front of us else { // Navaid will not be passed before distance is hit - if (distToNavaid > remainingDistance) - remainingDistance = distToNavaid - remainingDistance; + if (distToNavaid > remainingDistance) remainingDistance = distToNavaid - remainingDistance; } + + // Compute intercept of crs from arc end and distance const targetFix: NavFix = { ...geolib.computeDestinationPoint(arcEnd, remainingDistance, lastCourse), name: leg.Distance.toString(), @@ -64,7 +44,6 @@ export const TerminatorsVD = ( speedConstraint: leg.SpeedLimit, altitudeConstraint: leg.Alt, }; - line.push([targetFix.longitude, targetFix.latitude]); return [targetFix, line]; diff --git a/browser/src/parser/terminators/VI.ts b/browser/src/parser/terminators/VI.ts index f33c0fc..f051df6 100644 --- a/browser/src/parser/terminators/VI.ts +++ b/browser/src/parser/terminators/VI.ts @@ -1,7 +1,7 @@ -import { handleTurnAtFix } from "../pathGenerators/handleTurnAtFix.ts"; -import { computeIntersection } from "../utils/computeIntersection.ts"; -import { computeSpeed } from "../utils/computeSpeed.ts"; -import { getCourseAndFixForIntercepts } from "../utils/getCourseAndFixForIntercepts.ts"; +import { handleTurnAtFix } from '../pathGenerators/handleTurnAtFix.ts'; +import { computeIntersection } from '../utils/computeIntersection.ts'; +import { computeSpeed } from '../utils/computeSpeed.ts'; +import { getCourseAndFixForIntercepts } from '../utils/getCourseAndFixForIntercepts.ts'; // NOTE: No wind adjustments to be made, no clue how *that* would draw export const TerminatorsVI = ( @@ -15,12 +15,7 @@ export const TerminatorsVI = ( // Compute INTC const interceptFix: NavFix = { - ...computeIntersection( - previousFix, - leg.Course.toTrue(nextFix), - nextFix, - crs - )!, + ...computeIntersection(previousFix, leg.Course.toTrue(nextFix), nextFix, crs)!, isFlyOver: leg.IsFlyOver, altitude: leg.Alt ? leg.Alt.parseAltitude() : previousFix.altitude, speed: speed, @@ -48,10 +43,7 @@ export const TerminatorsVI = ( if (interceptPoint2) return [ { ...interceptFix, ...interceptPoint2 }, - [ - ...line.slice(0, -1), - [interceptPoint2.longitude, interceptPoint2.latitude], - ], + [...line.slice(0, -1), [interceptPoint2.longitude, interceptPoint2.latitude]], ]; return [interceptFix, line]; diff --git a/browser/src/parser/terminators/VM.ts b/browser/src/parser/terminators/VM.ts index 0082dab..a0498ff 100644 --- a/browser/src/parser/terminators/VM.ts +++ b/browser/src/parser/terminators/VM.ts @@ -1,6 +1,6 @@ -import * as geolib from "geolib"; -import { handleTurnAtFix } from "../pathGenerators/handleTurnAtFix.ts"; -import { computeSpeed } from "../utils/computeSpeed.ts"; +import * as geolib from 'geolib'; +import { handleTurnAtFix } from '../pathGenerators/handleTurnAtFix.ts'; +import { computeSpeed } from '../utils/computeSpeed.ts'; // NOTE: No wind adjustments to be made, no clue how *that* would draw export const TerminatorsVM = ( @@ -10,11 +10,7 @@ export const TerminatorsVM = ( ): [NavFix?, LineSegment[]?] => { const speed = computeSpeed(leg, previousFix); - const endpoint = geolib.computeDestinationPoint( - previousFix, - (10).toMetre(), - leg.Course.toTrue(previousFix) - ); + const endpoint = geolib.computeDestinationPoint(previousFix, (10).toMetre(), leg.Course.toTrue(previousFix)); const line = handleTurnAtFix( leg.Course.toTrue(previousFix), diff --git a/browser/src/parser/terminators/VR.ts b/browser/src/parser/terminators/VR.ts index 84adb2d..df9abd7 100644 --- a/browser/src/parser/terminators/VR.ts +++ b/browser/src/parser/terminators/VR.ts @@ -1,7 +1,6 @@ -import * as geolib from "geolib"; -import { computeIntersection } from "../utils/computeIntersection.ts"; -import { computeSpeed } from "../utils/computeSpeed.ts"; -import { generatePerformanceArc } from "../pathGenerators/generatePerformanceArc.ts"; +import { generateOverflyArc } from '../pathGenerators/generateOverflyArc.ts'; +import { computeIntersection } from '../utils/computeIntersection.ts'; +import { computeSpeed } from '../utils/computeSpeed.ts'; // NOTE: No wind adjustments to be made, no clue how *that* would draw export const TerminatorsVR = ( @@ -17,31 +16,11 @@ export const TerminatorsVR = ( const crsIntoEndpoint = leg.NavBear.toTrue(navaid); const speed = computeSpeed(leg, previousFix); - let line: LineSegment[] = []; - - if (previousFix.isFlyOver) { - line = generatePerformanceArc( - crsFromEndpoint, - lastCourse, - previousFix, - speed, - leg.TurnDir - ); - } else { - line.push([previousFix.longitude, previousFix.latitude]); - } - - const arcEnd = { latitude: line.at(-1)![1], longitude: line.at(-1)![0] }; - if (line.length > 1) { - lastCourse = geolib.getGreatCircleBearing( - { - latitude: line.at(-2)![1], - longitude: line.at(-2)![0], - }, - arcEnd - ); - } + // Compute overfly + const [line, arcEnd, _lastCourse] = generateOverflyArc(crsFromEndpoint, lastCourse, previousFix, speed, leg.TurnDir); + lastCourse = _lastCourse; + // Compute intercept of crs from arc end and radial const interceptFix: NavFix = { ...computeIntersection(arcEnd, crsFromEndpoint, navaid, crsIntoEndpoint)!, isFlyOver: leg.IsFlyOver, diff --git a/browser/src/parser/utils/computeIntersection.ts b/browser/src/parser/utils/computeIntersection.ts index 69439de..5589622 100644 --- a/browser/src/parser/utils/computeIntersection.ts +++ b/browser/src/parser/utils/computeIntersection.ts @@ -5,12 +5,7 @@ * @param brng2 bearing from Point 2 * @returns Intersection point */ -export const computeIntersection = ( - p1: NavFix, - brng1: number, - p2: NavFix, - brng2: number -): NavFix | undefined => { +export const computeIntersection = (p1: NavFix, brng1: number, p2: NavFix, brng2: number): NavFix | undefined => { if (isNaN(brng1)) throw new TypeError(`invalid brng1 ${brng1}`); if (isNaN(brng2)) throw new TypeError(`invalid brng2 ${brng2}`); @@ -31,20 +26,13 @@ export const computeIntersection = ( const δ12 = 2 * Math.asin( - Math.sqrt( - Math.sin(Δφ / 2) * Math.sin(Δφ / 2) + - Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) * Math.sin(Δλ / 2) - ) + Math.sqrt(Math.sin(Δφ / 2) * Math.sin(Δφ / 2) + Math.cos(φ1) * Math.cos(φ2) * Math.sin(Δλ / 2) * Math.sin(Δλ / 2)) ); if (Math.abs(δ12) < Number.EPSILON) return p1; // coincident points // initial/final bearings between points - const cosθa = - (Math.sin(φ2) - Math.sin(φ1) * Math.cos(δ12)) / - (Math.sin(δ12) * Math.cos(φ1)); - const cosθb = - (Math.sin(φ1) - Math.sin(φ2) * Math.cos(δ12)) / - (Math.sin(δ12) * Math.cos(φ2)); + const cosθa = (Math.sin(φ2) - Math.sin(φ1) * Math.cos(δ12)) / (Math.sin(δ12) * Math.cos(φ1)); + const cosθb = (Math.sin(φ1) - Math.sin(φ2) * Math.cos(δ12)) / (Math.sin(δ12) * Math.cos(φ2)); const θa = Math.acos(Math.min(Math.max(cosθa, -1), 1)); // protect against rounding errors const θb = Math.acos(Math.min(Math.max(cosθb, -1), 1)); // protect against rounding errors @@ -57,29 +45,15 @@ export const computeIntersection = ( if (Math.sin(α1) == 0 && Math.sin(α2) == 0) return undefined; // infinite intersections if (Math.sin(α1) * Math.sin(α2) < 0) return undefined; // ambiguous intersection (antipodal/360°) - const cosα3 = - -Math.cos(α1) * Math.cos(α2) + Math.sin(α1) * Math.sin(α2) * Math.cos(δ12); + const cosα3 = -Math.cos(α1) * Math.cos(α2) + Math.sin(α1) * Math.sin(α2) * Math.cos(δ12); - const δ13 = Math.atan2( - Math.sin(δ12) * Math.sin(α1) * Math.sin(α2), - Math.cos(α2) + Math.cos(α1) * cosα3 - ); + const δ13 = Math.atan2(Math.sin(δ12) * Math.sin(α1) * Math.sin(α2), Math.cos(α2) + Math.cos(α1) * cosα3); const φ3 = Math.asin( - Math.min( - Math.max( - Math.sin(φ1) * Math.cos(δ13) + - Math.cos(φ1) * Math.sin(δ13) * Math.cos(θ13), - -1 - ), - 1 - ) + Math.min(Math.max(Math.sin(φ1) * Math.cos(δ13) + Math.cos(φ1) * Math.sin(δ13) * Math.cos(θ13), -1), 1) ); - const Δλ13 = Math.atan2( - Math.sin(θ13) * Math.sin(δ13) * Math.cos(φ1), - Math.cos(δ13) - Math.sin(φ1) * Math.sin(φ3) - ); + const Δλ13 = Math.atan2(Math.sin(θ13) * Math.sin(δ13) * Math.cos(φ1), Math.cos(δ13) - Math.sin(φ1) * Math.sin(φ3)); const λ3 = λ1 + Δλ13; const lat = φ3.toDegrees(); @@ -89,7 +63,7 @@ export const computeIntersection = ( ...p1, latitude: lat, longitude: lon, - name: "INTC", + name: 'INTC', isIntersection: true, }; }; diff --git a/browser/src/parser/utils/computeSpeed.ts b/browser/src/parser/utils/computeSpeed.ts index 744e61e..292d0fb 100644 --- a/browser/src/parser/utils/computeSpeed.ts +++ b/browser/src/parser/utils/computeSpeed.ts @@ -1,4 +1,4 @@ -import Parser from "../parser.ts"; +import Parser from '../parser.ts'; export const computeSpeed = (leg: TerminalEntry, previousFix: NavFix) => { if (leg.SpeedLimit) return leg.SpeedLimit; diff --git a/browser/src/parser/utils/extensions.ts b/browser/src/parser/utils/extensions.ts index fdddfed..acc7b6f 100644 --- a/browser/src/parser/utils/extensions.ts +++ b/browser/src/parser/utils/extensions.ts @@ -1,4 +1,4 @@ -import { magvar } from "magvar"; +import { magvar } from 'magvar'; Number.prototype.toRadians = function () { return ((this as number) * Math.PI) / 180; @@ -15,8 +15,8 @@ Number.prototype.normaliseDegrees = function () { return (this as number) >= 360 ? (this as number) - 360 : (this as number) < 0 - ? (this as number) + 360 - : (this as number); + ? (this as number) + 360 + : (this as number); }; Number.prototype.toTrue = function (fix) { const _magvar = magvar(fix.latitude, fix.longitude); //Magvar is returned + for East diff --git a/browser/src/parser/utils/getCourseAndFixForIntercepts.ts b/browser/src/parser/utils/getCourseAndFixForIntercepts.ts index 9ee1004..4512180 100644 --- a/browser/src/parser/utils/getCourseAndFixForIntercepts.ts +++ b/browser/src/parser/utils/getCourseAndFixForIntercepts.ts @@ -1,26 +1,23 @@ -import * as geolib from "geolib"; +import * as geolib from 'geolib'; /** * @param leg Leg to examine * @param origin Origin of current leg * @returns Adjusted course and fix */ -export const getCourseAndFixForIntercepts = ( - leg: TerminalEntry, - origin: NavFix -): [number, NavFix] => { +export const getCourseAndFixForIntercepts = (leg: TerminalEntry, origin: NavFix): [number, NavFix] => { switch (leg.TrackCode) { - case "CF": { + case 'CF': { const _leg = leg as CFTerminalEntry; const fix = { latitude: _leg.WptLat, longitude: _leg.WptLon }; return [_leg.Course.reciprocalCourse().toTrue(fix), fix]; } - case "FM": { + case 'FM': { const _leg = leg as FMTerminalEntry; const fix = { latitude: _leg.WptLat, longitude: _leg.WptLon }; return [_leg.Course.toTrue(fix), fix]; } - case "TF": { + case 'TF': { const _leg = leg as FMTerminalEntry; return [ geolib.getGreatCircleBearing(origin, { @@ -30,7 +27,7 @@ export const getCourseAndFixForIntercepts = ( { latitude: _leg.WptLat, longitude: _leg.WptLon }, ]; } - case "AF": { + case 'AF': { const _leg = leg as AFTerminalEntry; const fix = { latitude: _leg.WptLat, longitude: _leg.WptLon }; return [_leg.Course.reciprocalCourse().toTrue(fix), fix]; diff --git a/browser/src/types/geojson.d.ts b/browser/src/types/geojson.d.ts index 506b421..791f3c9 100644 --- a/browser/src/types/geojson.d.ts +++ b/browser/src/types/geojson.d.ts @@ -1,3 +1,3 @@ -declare module "geojson" { +declare module 'geojson' { export const parse: (data: object, format: object) => object; } diff --git a/browser/src/types/leaflet.d.ts b/browser/src/types/leaflet.d.ts index 4eb174b..ecd5877 100644 --- a/browser/src/types/leaflet.d.ts +++ b/browser/src/types/leaflet.d.ts @@ -1,21 +1,21 @@ //eslint-disable-next-line @typescript-eslint/no-unused-vars -import * as L from "leaflet"; +import 'leaflet'; -declare module "leaflet" { +declare module 'leaflet' { export function shapeMarker( latlng: LatLngExpression, options?: PathOptions & { shape?: - | "diamond" - | "square" - | "triangle" - | "triangle-up" - | "triangle-down" - | "arrowhead" - | "arrowhead-up" - | "arrowhead-down" - | "circle" - | "x" + | 'diamond' + | 'square' + | 'triangle' + | 'triangle-up' + | 'triangle-down' + | 'arrowhead' + | 'arrowhead-up' + | 'arrowhead-down' + | 'circle' + | 'x' | string; radius?: number; rotation?: number; diff --git a/browser/src/types/magvar.d.ts b/browser/src/types/magvar.d.ts index 2b06a95..f394d11 100644 --- a/browser/src/types/magvar.d.ts +++ b/browser/src/types/magvar.d.ts @@ -1,3 +1,3 @@ -declare module "magvar" { +declare module 'magvar' { export const magvar: (latitude: number, longitude: number) => number; } diff --git a/browser/src/types/terminators/AF.d.ts b/browser/src/types/terminators/AF.d.ts index 8f78119..479f0ff 100644 --- a/browser/src/types/terminators/AF.d.ts +++ b/browser/src/types/terminators/AF.d.ts @@ -2,16 +2,7 @@ export declare global { type AFTerminalEntry = Required< Pick< TerminalEntry, - | "WptID" - | "WptLat" - | "WptLon" - | "TurnDir" - | "NavID" - | "NavLat" - | "NavLon" - | "NavBear" - | "NavDist" - | "Course" + 'WptID' | 'WptLat' | 'WptLon' | 'TurnDir' | 'NavID' | 'NavLat' | 'NavLon' | 'NavBear' | 'NavDist' | 'Course' > > & TerminalEntry; diff --git a/browser/src/types/terminators/CA.d.ts b/browser/src/types/terminators/CA.d.ts index 59dc60f..200b7a3 100644 --- a/browser/src/types/terminators/CA.d.ts +++ b/browser/src/types/terminators/CA.d.ts @@ -1,4 +1,3 @@ export declare global { - type CATerminalEntry = Required> & - TerminalEntry; + type CATerminalEntry = Required> & TerminalEntry; } diff --git a/browser/src/types/terminators/CD.d.ts b/browser/src/types/terminators/CD.d.ts index 081c4be..04a88ef 100644 --- a/browser/src/types/terminators/CD.d.ts +++ b/browser/src/types/terminators/CD.d.ts @@ -1,6 +1,4 @@ export declare global { - type CDTerminalEntry = Required< - Pick - > & + type CDTerminalEntry = Required> & TerminalEntry; } diff --git a/browser/src/types/terminators/CF.d.ts b/browser/src/types/terminators/CF.d.ts index d6fefae..973abde 100644 --- a/browser/src/types/terminators/CF.d.ts +++ b/browser/src/types/terminators/CF.d.ts @@ -2,16 +2,7 @@ export declare global { type CFTerminalEntry = Required< Pick< TerminalEntry, - | "WptID" - | "WptLat" - | "WptLon" - | "NavID" - | "NavLat" - | "NavLon" - | "NavBear" - | "NavDist" - | "Course" - | "Distance" + 'WptID' | 'WptLat' | 'WptLon' | 'NavID' | 'NavLat' | 'NavLon' | 'NavBear' | 'NavDist' | 'Course' | 'Distance' > > & TerminalEntry; diff --git a/browser/src/types/terminators/CI.d.ts b/browser/src/types/terminators/CI.d.ts index 510a743..f00cc8f 100644 --- a/browser/src/types/terminators/CI.d.ts +++ b/browser/src/types/terminators/CI.d.ts @@ -1,4 +1,3 @@ export declare global { - type CITerminalEntry = Required> & - TerminalEntry; + type CITerminalEntry = Required> & TerminalEntry; } diff --git a/browser/src/types/terminators/CR.d.ts b/browser/src/types/terminators/CR.d.ts index e2246d1..a2fc033 100644 --- a/browser/src/types/terminators/CR.d.ts +++ b/browser/src/types/terminators/CR.d.ts @@ -1,6 +1,4 @@ export declare global { - type CRTerminalEntry = Required< - Pick - > & + type CRTerminalEntry = Required> & TerminalEntry; } diff --git a/browser/src/types/terminators/DF.d.ts b/browser/src/types/terminators/DF.d.ts index a869b5d..003e86e 100644 --- a/browser/src/types/terminators/DF.d.ts +++ b/browser/src/types/terminators/DF.d.ts @@ -1,6 +1,3 @@ export declare global { - type DFTerminalEntry = Required< - Pick - > & - TerminalEntry; + type DFTerminalEntry = Required> & TerminalEntry; } diff --git a/browser/src/types/terminators/FA.d.ts b/browser/src/types/terminators/FA.d.ts index 8e20c78..713a1f2 100644 --- a/browser/src/types/terminators/FA.d.ts +++ b/browser/src/types/terminators/FA.d.ts @@ -2,16 +2,7 @@ export declare global { type FATerminalEntry = Required< Pick< TerminalEntry, - | "WptID" - | "WptLat" - | "WptLon" - | "NavID" - | "NavLat" - | "NavLon" - | "NavBear" - | "NavDist" - | "Course" - | "Alt" + 'WptID' | 'WptLat' | 'WptLon' | 'NavID' | 'NavLat' | 'NavLon' | 'NavBear' | 'NavDist' | 'Course' | 'Alt' > > & TerminalEntry; diff --git a/browser/src/types/terminators/FC.d.ts b/browser/src/types/terminators/FC.d.ts index aa83e47..1450f4d 100644 --- a/browser/src/types/terminators/FC.d.ts +++ b/browser/src/types/terminators/FC.d.ts @@ -2,17 +2,17 @@ export declare global { type FCTerminalEntry = Required< Pick< TerminalEntry, - | "WptID" - | "WptLat" - | "WptLon" - | "IsFlyOver" - | "NavID" - | "NavLat" - | "NavLon" - | "NavBear" - | "NavDist" - | "Course" - | "Distance" + | 'WptID' + | 'WptLat' + | 'WptLon' + | 'IsFlyOver' + | 'NavID' + | 'NavLat' + | 'NavLon' + | 'NavBear' + | 'NavDist' + | 'Course' + | 'Distance' > > & TerminalEntry; diff --git a/browser/src/types/terminators/FD.d.ts b/browser/src/types/terminators/FD.d.ts index 84e5f4a..e9128b6 100644 --- a/browser/src/types/terminators/FD.d.ts +++ b/browser/src/types/terminators/FD.d.ts @@ -2,16 +2,7 @@ export declare global { type FDTerminalEntry = Required< Pick< TerminalEntry, - | "WptID" - | "WptLat" - | "WptLon" - | "NavID" - | "NavLat" - | "NavLon" - | "NavBear" - | "NavDist" - | "Course" - | "Distance" + 'WptID' | 'WptLat' | 'WptLon' | 'NavID' | 'NavLat' | 'NavLon' | 'NavBear' | 'NavDist' | 'Course' | 'Distance' > > & TerminalEntry; diff --git a/browser/src/types/terminators/FM.d.ts b/browser/src/types/terminators/FM.d.ts index 91969ff..dca88ad 100644 --- a/browser/src/types/terminators/FM.d.ts +++ b/browser/src/types/terminators/FM.d.ts @@ -2,15 +2,7 @@ export declare global { type FMTerminalEntry = Required< Pick< TerminalEntry, - | "WptID" - | "WptLat" - | "WptLon" - | "NavID" - | "NavLat" - | "NavLon" - | "NavBear" - | "NavDist" - | "Course" + 'WptID' | 'WptLat' | 'WptLon' | 'NavID' | 'NavLat' | 'NavLon' | 'NavBear' | 'NavDist' | 'Course' > > & TerminalEntry; diff --git a/browser/src/types/terminators/IF.d.ts b/browser/src/types/terminators/IF.d.ts index e33a797..554627a 100644 --- a/browser/src/types/terminators/IF.d.ts +++ b/browser/src/types/terminators/IF.d.ts @@ -1,6 +1,3 @@ export declare global { - type IFTerminalEntry = Required< - Pick - > & - TerminalEntry; + type IFTerminalEntry = Required> & TerminalEntry; } diff --git a/browser/src/types/terminators/RF.d.ts b/browser/src/types/terminators/RF.d.ts index dde74a5..dab6178 100644 --- a/browser/src/types/terminators/RF.d.ts +++ b/browser/src/types/terminators/RF.d.ts @@ -2,16 +2,16 @@ export declare global { type RFTerminalEntry = Required< Pick< TerminalEntry, - | "WptID" - | "WptLat" - | "WptLon" - | "TurnDir" - | "NavBear" - | "Course" - | "Distance" - | "CenterID" - | "CenterLat" - | "CenterLon" + | 'WptID' + | 'WptLat' + | 'WptLon' + | 'TurnDir' + | 'NavBear' + | 'Course' + | 'Distance' + | 'CenterID' + | 'CenterLat' + | 'CenterLon' > > & TerminalEntry; diff --git a/browser/src/types/terminators/TF.d.ts b/browser/src/types/terminators/TF.d.ts index 710e3be..b806208 100644 --- a/browser/src/types/terminators/TF.d.ts +++ b/browser/src/types/terminators/TF.d.ts @@ -1,6 +1,3 @@ export declare global { - type TFTerminalEntry = Required< - Pick - > & - TerminalEntry; + type TFTerminalEntry = Required> & TerminalEntry; } diff --git a/browser/src/types/terminators/VA.d.ts b/browser/src/types/terminators/VA.d.ts index 2c512f9..a2fed54 100644 --- a/browser/src/types/terminators/VA.d.ts +++ b/browser/src/types/terminators/VA.d.ts @@ -1,4 +1,3 @@ export declare global { - type VATerminalEntry = Required> & - TerminalEntry; + type VATerminalEntry = Required> & TerminalEntry; } diff --git a/browser/src/types/terminators/VD.d.ts b/browser/src/types/terminators/VD.d.ts index 7304543..2611c19 100644 --- a/browser/src/types/terminators/VD.d.ts +++ b/browser/src/types/terminators/VD.d.ts @@ -1,6 +1,4 @@ export declare global { - type VDTerminalEntry = Required< - Pick - > & + type VDTerminalEntry = Required> & TerminalEntry; } diff --git a/browser/src/types/terminators/VI.d.ts b/browser/src/types/terminators/VI.d.ts index 5827ef5..bef0fdd 100644 --- a/browser/src/types/terminators/VI.d.ts +++ b/browser/src/types/terminators/VI.d.ts @@ -1,4 +1,3 @@ export declare global { - type VITerminalEntry = Required> & - TerminalEntry; + type VITerminalEntry = Required> & TerminalEntry; } diff --git a/browser/src/types/terminators/VM.d.ts b/browser/src/types/terminators/VM.d.ts index 701b793..d1ff539 100644 --- a/browser/src/types/terminators/VM.d.ts +++ b/browser/src/types/terminators/VM.d.ts @@ -1,4 +1,3 @@ export declare global { - type VMTerminalEntry = Required> & - TerminalEntry; + type VMTerminalEntry = Required> & TerminalEntry; } diff --git a/browser/src/types/terminators/VR.d.ts b/browser/src/types/terminators/VR.d.ts index cdcb36b..224a68c 100644 --- a/browser/src/types/terminators/VR.d.ts +++ b/browser/src/types/terminators/VR.d.ts @@ -1,6 +1,4 @@ export declare global { - type VRTerminalEntry = Required< - Pick - > & + type VRTerminalEntry = Required> & TerminalEntry; } diff --git a/browser/src/types/types.d.ts b/browser/src/types/types.d.ts index f8aab34..3599a00 100644 --- a/browser/src/types/types.d.ts +++ b/browser/src/types/types.d.ts @@ -14,31 +14,31 @@ export declare global { }; type TrackCode = - | "AF" - | "CA" - | "CD" - | "CF" - | "CI" - | "CR" - | "DF" - | "FA" - | "FC" - | "FD" - | "FM" - | "HA" - | "HF" - | "HM" - | "IF" - | "PI" - | "RF" - | "TF" - | "VA" - | "VD" - | "VI" - | "VM" - | "VR"; + | 'AF' + | 'CA' + | 'CD' + | 'CF' + | 'CI' + | 'CR' + | 'DF' + | 'FA' + | 'FC' + | 'FD' + | 'FM' + | 'HA' + | 'HF' + | 'HM' + | 'IF' + | 'PI' + | 'RF' + | 'TF' + | 'VA' + | 'VD' + | 'VI' + | 'VM' + | 'VR'; - type TurnDirection = "E" | "L" | "R"; + type TurnDirection = 'E' | 'L' | 'R'; type TerminalEntry = { ID: number; @@ -82,7 +82,7 @@ export declare global { speed?: number; name?: string; isFlyOver?: boolean; - "marker-color"?: string; + 'marker-color'?: string; altitudeConstraint?: string; speedConstraint?: number; // For map diff --git a/browser/tsconfig.json b/browser/tsconfig.json index 1ffef60..d32ff68 100644 --- a/browser/tsconfig.json +++ b/browser/tsconfig.json @@ -1,7 +1,4 @@ { "files": [], - "references": [ - { "path": "./tsconfig.app.json" }, - { "path": "./tsconfig.node.json" } - ] + "references": [{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" }] } diff --git a/browser/vite.config.ts b/browser/vite.config.ts index 2328e17..26f4e71 100644 --- a/browser/vite.config.ts +++ b/browser/vite.config.ts @@ -1,7 +1,7 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react-swc' +import react from '@vitejs/plugin-react-swc'; +import { defineConfig } from 'vite'; // https://vite.dev/config/ export default defineConfig({ plugins: [react()], -}) +});