diff --git a/.gitignore b/.gitignore index d95cbb6..18807d4 100644 --- a/.gitignore +++ b/.gitignore @@ -41,6 +41,7 @@ node_modules* tethysapp/nrds/public/frontend/ reactapp/config/production.env coverage +reactapp/wdyr.js # singularity diff --git a/package-lock.json b/package-lock.json index 6cfe0c7..593e19d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,6 +27,7 @@ "css-loader": "^6.5.1", "d3-array": "^3.2.4", "d3-time-format": "^4.1.0", + "deck.gl": "^9.2.5", "dotenv": "^16.0.1", "eslint-config-react-app": "^7.0.1", "file-loader": "^6.2.0", @@ -59,6 +60,7 @@ "@testing-library/jest-dom": "^5.16.4", "@testing-library/react": "^13.2.0", "@testing-library/user-event": "^14.2.0", + "@welldone-software/why-did-you-render": "^8.0.3", "babel-jest": "^28.1.0", "babel-loader": "^8.2.5", "babel-plugin-prismjs": "^2.1.0", @@ -80,6 +82,80 @@ "webpack-cli": "^6.0.1" } }, + "node_modules/@amcharts/amcharts5": { + "version": "5.14.4", + "resolved": "https://registry.npmjs.org/@amcharts/amcharts5/-/amcharts5-5.14.4.tgz", + "integrity": "sha512-Tl7wQLWvsvyWVtlCIm1yhZtJviSDYjuNTnlUkO0D49GyByoK0nb9fr0DK4rUw4DVgyLcySxWBsb2lzTJm5Rd9Q==", + "license": "SEE LICENSE IN LICENSE", + "peer": true, + "dependencies": { + "@types/d3": "^7.0.0", + "@types/d3-chord": "^3.0.0", + "@types/d3-hierarchy": "3.1.1", + "@types/d3-sankey": "^0.11.1", + "@types/d3-shape": "^3.0.0", + "@types/geojson": "^7946.0.8", + "@types/polylabel": "^1.0.5", + "@types/svg-arc-to-cubic-bezier": "^3.2.0", + "d3": "^7.0.0", + "d3-chord": "^3.0.0", + "d3-force": "^3.0.0", + "d3-geo": "^3.0.0", + "d3-hierarchy": "^3.0.0", + "d3-sankey": "^0.12.3", + "d3-selection": "^3.0.0", + "d3-shape": "^3.0.0", + "d3-transition": "^3.0.0", + "d3-voronoi-treemap": "^1.1.2", + "flatpickr": "^4.6.13", + "markerjs2": "^2.29.4", + "pdfmake": "^0.2.2", + "polylabel": "^1.1.0", + "seedrandom": "^3.0.5", + "svg-arc-to-cubic-bezier": "^3.2.0", + "tslib": "^2.2.0" + } + }, + "node_modules/@amcharts/amcharts5/node_modules/@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@amcharts/amcharts5/node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@amcharts/amcharts5/node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@amcharts/amcharts5/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "peer": true + }, "node_modules/@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", @@ -92,6 +168,76 @@ "node": ">=6.0.0" } }, + "node_modules/@arcgis/core": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@arcgis/core/-/core-4.34.8.tgz", + "integrity": "sha512-UrEBTjXpSA9fhmmnAENBzz9GG81xALTezQFMXUs2iMB+tiOckmJyBbhATI/W4lIQyUfNEK7Zm/46EP2PhDga/A==", + "license": "SEE LICENSE IN copyright.txt", + "peer": true, + "dependencies": { + "@amcharts/amcharts5": "~5.14.1", + "@arcgis/toolkit": "^4.34.0", + "@esri/arcgis-html-sanitizer": "~4.1.0", + "@esri/calcite-components": "^3.3.2", + "@vaadin/grid": "~24.9.1", + "@zip.js/zip.js": "~2.8.7", + "luxon": "~3.7.2", + "marked": "~16.3.0", + "tslib": "^2.8.1" + } + }, + "node_modules/@arcgis/core/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "peer": true + }, + "node_modules/@arcgis/lumina": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@arcgis/lumina/-/lumina-4.34.9.tgz", + "integrity": "sha512-efqO+SwR+1IYf29AATh1l2FUeypRyRINTBNkaJY+KkaFe+8gqSJ45qOmputhyzF5WTRDb7WhOYgnChjp6VYPpA==", + "license": "SEE LICENSE IN LICENSE.md", + "peer": true, + "dependencies": { + "@arcgis/toolkit": "~4.34.9", + "csstype": "^3.1.3", + "tslib": "^2.8.1" + }, + "peerDependencies": { + "@lit/context": "^1.1.5", + "lit": "^3.3.0" + }, + "peerDependenciesMeta": { + "@lit/context": { + "optional": true + } + } + }, + "node_modules/@arcgis/lumina/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "peer": true + }, + "node_modules/@arcgis/toolkit": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@arcgis/toolkit/-/toolkit-4.34.9.tgz", + "integrity": "sha512-wFST+eVnCwmg9NyICVyn9bsBnR+TlWklsGqG3L7xqSTgfXo6TuCThE7wtTb8xWxsTBkGvImqMUgpgLuwQuTQ1g==", + "license": "SEE LICENSE IN LICENSE.md", + "peer": true, + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/@arcgis/toolkit/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "peer": true + }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -1867,6 +2013,326 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@carto/api-client": { + "version": "0.5.23", + "resolved": "https://registry.npmjs.org/@carto/api-client/-/api-client-0.5.23.tgz", + "integrity": "sha512-LexUjRLO7MzFerbXznH7b7udLSOSitDF1KO2uzeMkNUeLN3sCt4s34GS0C+eAwao56wmxWvqHegUPDf1b0+zVQ==", + "license": "MIT", + "dependencies": { + "@loaders.gl/schema": "^4.3.3", + "@types/geojson": "^7946.0.16", + "d3-format": "^3.1.0", + "d3-scale": "^4.0.2", + "h3-js": "^4.1.0", + "jsep": "^1.4.0", + "quadbin": "^0.4.1-alpha.0" + } + }, + "node_modules/@deck.gl/aggregation-layers": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@deck.gl/aggregation-layers/-/aggregation-layers-9.2.5.tgz", + "integrity": "sha512-WHb3W2IhpdppHA7YAco/s6VL3hH1S+TCIMB9S+KtGGfC557eBGycuJvqJEEPeuRz9vVNchEevwuY+0SXL+4dOw==", + "license": "MIT", + "dependencies": { + "@luma.gl/constants": "^9.2.4", + "@luma.gl/shadertools": "^9.2.4", + "@math.gl/core": "^4.1.0", + "@math.gl/web-mercator": "^4.1.0", + "d3-hexbin": "^0.2.1" + }, + "peerDependencies": { + "@deck.gl/core": "~9.2.0", + "@deck.gl/layers": "~9.2.0", + "@luma.gl/core": "~9.2.4", + "@luma.gl/engine": "~9.2.4" + } + }, + "node_modules/@deck.gl/arcgis": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@deck.gl/arcgis/-/arcgis-9.2.5.tgz", + "integrity": "sha512-smIwk+V342gQZrt95aqYpgIx+kpNaW2aCYAnVDuHyZAVKV1s9+fD9sLtGKAM4VSq1WeZzrHo/oZjArf8QoiLZg==", + "license": "MIT", + "dependencies": { + "@luma.gl/constants": "^9.2.4", + "esri-loader": "^3.7.0" + }, + "peerDependencies": { + "@arcgis/core": "^4.0.0", + "@deck.gl/core": "~9.2.0", + "@luma.gl/core": "~9.2.4", + "@luma.gl/engine": "~9.2.4", + "@luma.gl/webgl": "~9.2.4" + } + }, + "node_modules/@deck.gl/carto": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@deck.gl/carto/-/carto-9.2.5.tgz", + "integrity": "sha512-urP6HSP762GYx87rEYEF+0gvSKlKV11jqWzhjaw3R396KDy6qHk4V2or2XlTUjvBGYoMO+07PX926prsfdLogg==", + "license": "MIT", + "dependencies": { + "@carto/api-client": "^0.5.19", + "@loaders.gl/compression": "^4.2.0", + "@loaders.gl/gis": "^4.2.0", + "@loaders.gl/loader-utils": "^4.2.0", + "@loaders.gl/mvt": "^4.2.0", + "@loaders.gl/schema": "^4.2.0", + "@loaders.gl/tiles": "^4.2.0", + "@luma.gl/core": "^9.2.4", + "@luma.gl/shadertools": "^9.2.4", + "@math.gl/web-mercator": "^4.1.0", + "@types/d3-array": "^3.0.2", + "@types/d3-color": "^1.4.2", + "@types/d3-scale": "^3.0.0", + "cartocolor": "^5.0.2", + "d3-array": "^3.2.0", + "d3-color": "^3.1.0", + "d3-format": "^3.1.0", + "d3-scale": "^4.0.0", + "earcut": "^2.2.4", + "h3-js": "^4.1.0", + "moment-timezone": "^0.5.33", + "pbf": "^3.2.1", + "quadbin": "^0.4.0" + }, + "peerDependencies": { + "@deck.gl/aggregation-layers": "~9.2.0", + "@deck.gl/core": "~9.2.0", + "@deck.gl/extensions": "~9.2.0", + "@deck.gl/geo-layers": "~9.2.0", + "@deck.gl/layers": "~9.2.0", + "@loaders.gl/core": "^4.2.0", + "@luma.gl/core": "~9.2.4" + } + }, + "node_modules/@deck.gl/carto/node_modules/@types/d3-color": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-1.4.5.tgz", + "integrity": "sha512-5sNP3DmtSnSozxcjqmzQKsDOuVJXZkceo1KJScDc1982kk/TS9mTPc6lpli1gTu1MIBF1YWutpHpjucNWcIj5g==", + "license": "MIT" + }, + "node_modules/@deck.gl/carto/node_modules/@types/d3-scale": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-3.3.5.tgz", + "integrity": "sha512-YOpKj0kIEusRf7ofeJcSZQsvKbnTwpe1DUF+P2qsotqG53kEsjm7EzzliqQxMkAWdkZcHrg5rRhB4JiDOQPX+A==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "^2" + } + }, + "node_modules/@deck.gl/carto/node_modules/@types/d3-time": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-2.1.4.tgz", + "integrity": "sha512-BTfLsxTeo7yFxI/haOOf1ZwJ6xKgQLT9dCp+EcmQv87Gox6X+oKl4mLKfO6fnWm3P22+A6DknMNEZany8ql2Rw==", + "license": "MIT" + }, + "node_modules/@deck.gl/carto/node_modules/earcut": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", + "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==", + "license": "ISC" + }, + "node_modules/@deck.gl/core": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@deck.gl/core/-/core-9.2.5.tgz", + "integrity": "sha512-/PGNX4Wd7rEahYi6ivC4WExJ3U6Hqgl42R83guNzTL6gM2+02PUQRoQG9QdFagj5d6kWYVN0LVJME2a5WQmzOg==", + "license": "MIT", + "dependencies": { + "@loaders.gl/core": "^4.2.0", + "@loaders.gl/images": "^4.2.0", + "@luma.gl/constants": "^9.2.4", + "@luma.gl/core": "^9.2.4", + "@luma.gl/engine": "^9.2.4", + "@luma.gl/shadertools": "^9.2.4", + "@luma.gl/webgl": "^9.2.4", + "@math.gl/core": "^4.1.0", + "@math.gl/sun": "^4.1.0", + "@math.gl/types": "^4.1.0", + "@math.gl/web-mercator": "^4.1.0", + "@probe.gl/env": "^4.1.0", + "@probe.gl/log": "^4.1.0", + "@probe.gl/stats": "^4.1.0", + "@types/offscreencanvas": "^2019.6.4", + "gl-matrix": "^3.0.0", + "mjolnir.js": "^3.0.0" + } + }, + "node_modules/@deck.gl/extensions": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@deck.gl/extensions/-/extensions-9.2.5.tgz", + "integrity": "sha512-GJRPmG+GD1tdblpplQlb4jlNywRb8aQYPEowPLKxglXSGRzgpOrqJYI1PcJhCowdL7/S8bCY1ay8nkXE3gRsgw==", + "license": "MIT", + "dependencies": { + "@luma.gl/constants": "^9.2.4", + "@luma.gl/shadertools": "^9.2.4", + "@math.gl/core": "^4.1.0" + }, + "peerDependencies": { + "@deck.gl/core": "~9.2.0", + "@luma.gl/core": "~9.2.4", + "@luma.gl/engine": "~9.2.4" + } + }, + "node_modules/@deck.gl/geo-layers": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@deck.gl/geo-layers/-/geo-layers-9.2.5.tgz", + "integrity": "sha512-QVjLwHEAtNqRdjBuYJwztCAwSTmgWujPT0geGWaFhr7ZvyigAqi3l2ETys5YqjjJ87bKnUBwd6iOyw1xkXbsCw==", + "license": "MIT", + "dependencies": { + "@loaders.gl/3d-tiles": "^4.2.0", + "@loaders.gl/gis": "^4.2.0", + "@loaders.gl/loader-utils": "^4.2.0", + "@loaders.gl/mvt": "^4.2.0", + "@loaders.gl/schema": "^4.2.0", + "@loaders.gl/terrain": "^4.2.0", + "@loaders.gl/tiles": "^4.2.0", + "@loaders.gl/wms": "^4.2.0", + "@luma.gl/gltf": "^9.2.4", + "@luma.gl/shadertools": "^9.2.4", + "@math.gl/core": "^4.1.0", + "@math.gl/culling": "^4.1.0", + "@math.gl/web-mercator": "^4.1.0", + "@types/geojson": "^7946.0.8", + "a5-js": "^0.5.0", + "h3-js": "^4.1.0", + "long": "^3.2.0" + }, + "peerDependencies": { + "@deck.gl/core": "~9.2.0", + "@deck.gl/extensions": "~9.2.0", + "@deck.gl/layers": "~9.2.0", + "@deck.gl/mesh-layers": "~9.2.0", + "@loaders.gl/core": "^4.2.0", + "@luma.gl/core": "~9.2.4", + "@luma.gl/engine": "~9.2.4" + } + }, + "node_modules/@deck.gl/google-maps": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@deck.gl/google-maps/-/google-maps-9.2.5.tgz", + "integrity": "sha512-HnlTJZum9garvMrjNBf4MUTleuYVTDlS3Fk7VsB8vKApVx901o9apEZqfJtcdrfc7gPS7MoCFbT5lL5J7cxO7g==", + "license": "MIT", + "dependencies": { + "@luma.gl/constants": "^9.2.4", + "@luma.gl/webgl": "^9.2.4", + "@math.gl/core": "^4.1.0", + "@types/google.maps": "^3.48.6" + }, + "peerDependencies": { + "@deck.gl/core": "~9.2.0", + "@luma.gl/constants": "~9.2.4", + "@luma.gl/core": "~9.2.4", + "@luma.gl/webgl": "~9.2.4" + } + }, + "node_modules/@deck.gl/json": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@deck.gl/json/-/json-9.2.5.tgz", + "integrity": "sha512-DER3A31hM9+Qq9taIUOUYHKKJAv3ztnRV+WMY83+XjGg2bQWPqNu5cpBHZgtICTdAZur2Sn3COiVNCORy0s6ew==", + "license": "MIT", + "dependencies": { + "jsep": "^0.3.0" + }, + "peerDependencies": { + "@deck.gl/core": "~9.2.0" + } + }, + "node_modules/@deck.gl/json/node_modules/jsep": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/jsep/-/jsep-0.3.5.tgz", + "integrity": "sha512-AoRLBDc6JNnKjNcmonituEABS5bcfqDhQAWWXNTFrqu6nVXBpBAGfcoTGZMFlIrh9FjmE1CQyX9CTNwZrXMMDA==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/@deck.gl/layers": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@deck.gl/layers/-/layers-9.2.5.tgz", + "integrity": "sha512-a48zWxeHknSX67ZeIzWeLXuOVJkEnQjnLIC27Uv3zHjKlvaoraWPOgScUNyteB0UIIzhzE+D8lF+ViHeIdkNSA==", + "license": "MIT", + "dependencies": { + "@loaders.gl/images": "^4.2.0", + "@loaders.gl/schema": "^4.2.0", + "@luma.gl/shadertools": "^9.2.4", + "@mapbox/tiny-sdf": "^2.0.5", + "@math.gl/core": "^4.1.0", + "@math.gl/polygon": "^4.1.0", + "@math.gl/web-mercator": "^4.1.0", + "earcut": "^2.2.4" + }, + "peerDependencies": { + "@deck.gl/core": "~9.2.0", + "@loaders.gl/core": "^4.2.0", + "@luma.gl/core": "~9.2.4", + "@luma.gl/engine": "~9.2.4" + } + }, + "node_modules/@deck.gl/layers/node_modules/earcut": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", + "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==", + "license": "ISC" + }, + "node_modules/@deck.gl/mapbox": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@deck.gl/mapbox/-/mapbox-9.2.5.tgz", + "integrity": "sha512-VQPV/JMVNKjLbbfq+0CL7Fvf78x9k7zvXqnhMicT/clLWzHdc7r7yfadLVPaRwEGh0VpMKTUUOrdszUTkW95wA==", + "license": "MIT", + "dependencies": { + "@luma.gl/constants": "^9.2.4", + "@math.gl/web-mercator": "^4.1.0" + }, + "peerDependencies": { + "@deck.gl/core": "~9.2.0", + "@luma.gl/constants": "~9.2.4", + "@luma.gl/core": "~9.2.4", + "@math.gl/web-mercator": "^4.1.0" + } + }, + "node_modules/@deck.gl/mesh-layers": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@deck.gl/mesh-layers/-/mesh-layers-9.2.5.tgz", + "integrity": "sha512-OJ7Nx6xhp7+bQ4S4asUUp7PdGwcfmQpQhe5SHDGy1UBZ0yZE+ojOo9uvVfXvGBnqq4Zpg9avV+WRN1/BffBsOw==", + "license": "MIT", + "dependencies": { + "@loaders.gl/gltf": "^4.2.0", + "@loaders.gl/schema": "^4.2.0", + "@luma.gl/gltf": "^9.2.4", + "@luma.gl/shadertools": "^9.2.4" + }, + "peerDependencies": { + "@deck.gl/core": "~9.2.0", + "@luma.gl/core": "~9.2.4", + "@luma.gl/engine": "~9.2.4", + "@luma.gl/gltf": "~9.2.4", + "@luma.gl/shadertools": "~9.2.4" + } + }, + "node_modules/@deck.gl/react": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@deck.gl/react/-/react-9.2.5.tgz", + "integrity": "sha512-pkb7kR1CppvRI5KTnMVTYNZx6f/L4OmuWpyACjRBlVjUlmSd9PddKF3LX1o8435yHDKACAfMYb8N2Fc3HRNMcA==", + "license": "MIT", + "peerDependencies": { + "@deck.gl/core": "~9.2.0", + "@deck.gl/widgets": "~9.2.0", + "react": ">=16.3.0", + "react-dom": ">=16.3.0" + } + }, + "node_modules/@deck.gl/widgets": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@deck.gl/widgets/-/widgets-9.2.5.tgz", + "integrity": "sha512-nzukGcyaVag6XRT8aP3A8Ul2bSdb/TyFmenbDNRhrYop0OdmDl9Bx0U9wZlVlY6vxpB3kssfBXAv+MTdRr2JfA==", + "license": "MIT", + "dependencies": { + "preact": "^10.17.0" + }, + "peerDependencies": { + "@deck.gl/core": "~9.2.0", + "@luma.gl/core": "~9.2.4" + } + }, "node_modules/@duckdb/duckdb-wasm": { "version": "1.30.0", "resolved": "https://registry.npmjs.org/@duckdb/duckdb-wasm/-/duckdb-wasm-1.30.0.tgz", @@ -2167,27 +2633,146 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@esri/arcgis-html-sanitizer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@esri/arcgis-html-sanitizer/-/arcgis-html-sanitizer-4.1.0.tgz", + "integrity": "sha512-einEveDJ/k1180NOp78PB/4Hje9eBy3dyOGLLtLn6bSkizpUfCwuYBIXOA7Y3F/k/BsTQXgKqUVwQ0eiscWMdA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "xss": "1.0.13" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@esri/calcite-components": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@esri/calcite-components/-/calcite-components-3.3.3.tgz", + "integrity": "sha512-tw+EfJ3pb+Odj71W6E9GUkm8rMbNxfW1KeiI8GgsKDzhr39hMKwY+zYYFFYuO0FONxWGvAB+B8yqB0NvH7WeHw==", + "license": "SEE LICENSE.md", + "peer": true, + "dependencies": { + "@arcgis/lumina": ">=4.34.0-next.158 <4.35.0", + "@arcgis/toolkit": ">=4.34.0-next.158 <4.35.0", + "@esri/calcite-ui-icons": "4.3.0", + "@floating-ui/dom": "^1.6.12", + "@floating-ui/utils": "^0.2.8", + "@types/sortablejs": "^1.15.8", + "color": "^5.0.0", + "composed-offset-position": "^0.0.6", + "es-toolkit": "^1.39.8", + "focus-trap": "^7.6.5", + "interactjs": "^1.10.27", + "lit": "^3.3.0", + "sortablejs": "^1.15.6", + "timezone-groups": "^0.10.4", + "type-fest": "^4.30.1" + } + }, + "node_modules/@esri/calcite-components/node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "peer": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@esri/calcite-ui-icons": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@esri/calcite-ui-icons/-/calcite-ui-icons-4.3.0.tgz", + "integrity": "sha512-iOOuRurpjFxFVw6+aXW2JpSkRBrdOpBcbdibfPOmSPqMd1aoHBtYmYXetKoH9vfrXoBiPyO2PkDnczhsu/N9IA==", + "license": "SEE LICENSE.md", + "peer": true, + "bin": { + "spriter": "bin/spriter.js" + } + }, "node_modules/@floating-ui/core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", - "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", + "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "license": "MIT", "dependencies": { - "@floating-ui/utils": "^0.2.1" + "@floating-ui/utils": "^0.2.10" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", - "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", + "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "license": "MIT", "dependencies": { - "@floating-ui/core": "^1.0.0", - "@floating-ui/utils": "^0.2.0" + "@floating-ui/core": "^1.7.3", + "@floating-ui/utils": "^0.2.10" } }, "node_modules/@floating-ui/utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", - "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "license": "MIT" + }, + "node_modules/@foliojs-fork/fontkit": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@foliojs-fork/fontkit/-/fontkit-1.9.2.tgz", + "integrity": "sha512-IfB5EiIb+GZk+77TRB86AHroVaqfq8JRFlUbz0WEwsInyCG0epX2tCPOy+UfaWPju30DeVoUAXfzWXmhn753KA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@foliojs-fork/restructure": "^2.0.2", + "brotli": "^1.2.0", + "clone": "^1.0.4", + "deep-equal": "^1.0.0", + "dfa": "^1.2.0", + "tiny-inflate": "^1.0.2", + "unicode-properties": "^1.2.2", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/@foliojs-fork/linebreak": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@foliojs-fork/linebreak/-/linebreak-1.1.2.tgz", + "integrity": "sha512-ZPohpxxbuKNE0l/5iBJnOAfUaMACwvUIKCvqtWGKIMv1lPYoNjYXRfhi9FeeV9McBkBLxsMFWTVVhHJA8cyzvg==", + "license": "MIT", + "peer": true, + "dependencies": { + "base64-js": "1.3.1", + "unicode-trie": "^2.0.0" + } + }, + "node_modules/@foliojs-fork/linebreak/node_modules/base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "license": "MIT", + "peer": true + }, + "node_modules/@foliojs-fork/pdfkit": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/@foliojs-fork/pdfkit/-/pdfkit-0.15.3.tgz", + "integrity": "sha512-Obc0Wmy3bm7BINFVvPhcl2rnSSK61DQrlHU8aXnAqDk9LCjWdUOPwhgD8Ywz5VtuFjRxmVOM/kQ/XLIBjDvltw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@foliojs-fork/fontkit": "^1.9.2", + "@foliojs-fork/linebreak": "^1.1.1", + "crypto-js": "^4.2.0", + "jpeg-exif": "^1.1.4", + "png-js": "^1.0.0" + } + }, + "node_modules/@foliojs-fork/restructure": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@foliojs-fork/restructure/-/restructure-2.0.2.tgz", + "integrity": "sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA==", + "license": "MIT", + "peer": true }, "node_modules/@humanwhocodes/config-array": { "version": "0.9.5", @@ -2316,6 +2901,13 @@ } } }, + "node_modules/@interactjs/types": { + "version": "1.10.27", + "resolved": "https://registry.npmjs.org/@interactjs/types/-/types-1.10.27.tgz", + "integrity": "sha512-BUdv0cvs4H5ODuwft2Xp4eL8Vmi3LcihK42z0Ft/FbVJZoRioBsxH+LlsBdK4tAie7PqlKGy+1oyOncu1nQ6eA==", + "license": "MIT", + "peer": true + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -2722,37 +3314,454 @@ "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" }, - "node_modules/@mapbox/geojson-rewind": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", - "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", - "license": "ISC", + "node_modules/@lit-labs/ssr-dom-shim": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.5.1.tgz", + "integrity": "sha512-Aou5UdlSpr5whQe8AA/bZG0jMj96CoJIWbGfZ91qieWu5AWUMKw8VR/pAkQkJYvBNhmCcWnZlyyk5oze8JIqYA==", + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/@lit/reactive-element": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.1.2.tgz", + "integrity": "sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==", + "license": "BSD-3-Clause", + "peer": true, "dependencies": { - "get-stream": "^6.0.1", - "minimist": "^1.2.6" - }, - "bin": { - "geojson-rewind": "geojson-rewind" + "@lit-labs/ssr-dom-shim": "^1.5.0" } }, - "node_modules/@mapbox/jsonlint-lines-primitives": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", - "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==", - "engines": { - "node": ">= 0.6" + "node_modules/@loaders.gl/3d-tiles": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/3d-tiles/-/3d-tiles-4.3.4.tgz", + "integrity": "sha512-JQ3y3p/KlZP7lfobwON5t7H9WinXEYTvuo3SRQM8TBKhM+koEYZhvI2GwzoXx54MbBbY+s3fm1dq5UAAmaTsZw==", + "license": "MIT", + "dependencies": { + "@loaders.gl/compression": "4.3.4", + "@loaders.gl/crypto": "4.3.4", + "@loaders.gl/draco": "4.3.4", + "@loaders.gl/gltf": "4.3.4", + "@loaders.gl/images": "4.3.4", + "@loaders.gl/loader-utils": "4.3.4", + "@loaders.gl/math": "4.3.4", + "@loaders.gl/tiles": "4.3.4", + "@loaders.gl/zip": "4.3.4", + "@math.gl/core": "^4.1.0", + "@math.gl/culling": "^4.1.0", + "@math.gl/geospatial": "^4.1.0", + "@probe.gl/log": "^4.0.4", + "long": "^5.2.1" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.3.0" } }, - "node_modules/@mapbox/point-geometry": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", - "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" - }, - "node_modules/@mapbox/tiny-sdf": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.0.6.tgz", - "integrity": "sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA==", - "license": "BSD-2-Clause" + "node_modules/@loaders.gl/3d-tiles/node_modules/long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", + "license": "Apache-2.0" + }, + "node_modules/@loaders.gl/compression": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/compression/-/compression-4.3.4.tgz", + "integrity": "sha512-+o+5JqL9Sx8UCwdc2MTtjQiUHYQGJALHbYY/3CT+b9g/Emzwzez2Ggk9U9waRfdHiBCzEgRBivpWZEOAtkimXQ==", + "license": "MIT", + "dependencies": { + "@loaders.gl/loader-utils": "4.3.4", + "@loaders.gl/worker-utils": "4.3.4", + "@types/brotli": "^1.3.0", + "@types/pako": "^1.0.1", + "fflate": "0.7.4", + "lzo-wasm": "^0.0.4", + "pako": "1.0.11", + "snappyjs": "^0.6.1" + }, + "optionalDependencies": { + "brotli": "^1.3.2", + "lz4js": "^0.2.0", + "zstd-codec": "^0.1" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.3.0" + } + }, + "node_modules/@loaders.gl/compression/node_modules/fflate": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.4.tgz", + "integrity": "sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==", + "license": "MIT" + }, + "node_modules/@loaders.gl/core": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/core/-/core-4.3.4.tgz", + "integrity": "sha512-cG0C5fMZ1jyW6WCsf4LoHGvaIAJCEVA/ioqKoYRwoSfXkOf+17KupK1OUQyUCw5XoRn+oWA1FulJQOYlXnb9Gw==", + "license": "MIT", + "dependencies": { + "@loaders.gl/loader-utils": "4.3.4", + "@loaders.gl/schema": "4.3.4", + "@loaders.gl/worker-utils": "4.3.4", + "@probe.gl/log": "^4.0.2" + } + }, + "node_modules/@loaders.gl/crypto": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/crypto/-/crypto-4.3.4.tgz", + "integrity": "sha512-3VS5FgB44nLOlAB9Q82VOQnT1IltwfRa1miE0mpHCe1prYu1M/dMnEyynusbrsp+eDs3EKbxpguIS9HUsFu5dQ==", + "license": "MIT", + "dependencies": { + "@loaders.gl/loader-utils": "4.3.4", + "@loaders.gl/worker-utils": "4.3.4", + "@types/crypto-js": "^4.0.2" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.3.0" + } + }, + "node_modules/@loaders.gl/draco": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/draco/-/draco-4.3.4.tgz", + "integrity": "sha512-4Lx0rKmYENGspvcgV5XDpFD9o+NamXoazSSl9Oa3pjVVjo+HJuzCgrxTQYD/3JvRrolW/QRehZeWD/L/cEC6mw==", + "license": "MIT", + "dependencies": { + "@loaders.gl/loader-utils": "4.3.4", + "@loaders.gl/schema": "4.3.4", + "@loaders.gl/worker-utils": "4.3.4", + "draco3d": "1.5.7" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.3.0" + } + }, + "node_modules/@loaders.gl/gis": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/gis/-/gis-4.3.4.tgz", + "integrity": "sha512-8xub38lSWW7+ZXWuUcggk7agRHJUy6RdipLNKZ90eE0ZzLNGDstGD1qiBwkvqH0AkG+uz4B7Kkiptyl7w2Oa6g==", + "license": "MIT", + "dependencies": { + "@loaders.gl/loader-utils": "4.3.4", + "@loaders.gl/schema": "4.3.4", + "@mapbox/vector-tile": "^1.3.1", + "@math.gl/polygon": "^4.1.0", + "pbf": "^3.2.1" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.3.0" + } + }, + "node_modules/@loaders.gl/gltf": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/gltf/-/gltf-4.3.4.tgz", + "integrity": "sha512-EiUTiLGMfukLd9W98wMpKmw+hVRhQ0dJ37wdlXK98XPeGGB+zTQxCcQY+/BaMhsSpYt/OOJleHhTfwNr8RgzRg==", + "license": "MIT", + "dependencies": { + "@loaders.gl/draco": "4.3.4", + "@loaders.gl/images": "4.3.4", + "@loaders.gl/loader-utils": "4.3.4", + "@loaders.gl/schema": "4.3.4", + "@loaders.gl/textures": "4.3.4", + "@math.gl/core": "^4.1.0" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.3.0" + } + }, + "node_modules/@loaders.gl/images": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/images/-/images-4.3.4.tgz", + "integrity": "sha512-qgc33BaNsqN9cWa/xvcGvQ50wGDONgQQdzHCKDDKhV2w/uptZoR5iofJfuG8UUV2vUMMd82Uk9zbopRx2rS4Ag==", + "license": "MIT", + "dependencies": { + "@loaders.gl/loader-utils": "4.3.4" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.3.0" + } + }, + "node_modules/@loaders.gl/loader-utils": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/loader-utils/-/loader-utils-4.3.4.tgz", + "integrity": "sha512-tjMZvlKQSaMl2qmYTAxg+ySR6zd6hQn5n3XaU8+Ehp90TD3WzxvDKOMNDqOa72fFmIV+KgPhcmIJTpq4lAdC4Q==", + "license": "MIT", + "dependencies": { + "@loaders.gl/schema": "4.3.4", + "@loaders.gl/worker-utils": "4.3.4", + "@probe.gl/log": "^4.0.2", + "@probe.gl/stats": "^4.0.2" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.3.0" + } + }, + "node_modules/@loaders.gl/math": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/math/-/math-4.3.4.tgz", + "integrity": "sha512-UJrlHys1fp9EUO4UMnqTCqvKvUjJVCbYZ2qAKD7tdGzHJYT8w/nsP7f/ZOYFc//JlfC3nq+5ogvmdpq2pyu3TA==", + "license": "MIT", + "dependencies": { + "@loaders.gl/images": "4.3.4", + "@loaders.gl/loader-utils": "4.3.4", + "@math.gl/core": "^4.1.0" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.3.0" + } + }, + "node_modules/@loaders.gl/mvt": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/mvt/-/mvt-4.3.4.tgz", + "integrity": "sha512-9DrJX8RQf14htNtxsPIYvTso5dUce9WaJCWCIY/79KYE80Be6dhcEYMknxBS4w3+PAuImaAe66S5xo9B7Erm5A==", + "license": "MIT", + "dependencies": { + "@loaders.gl/gis": "4.3.4", + "@loaders.gl/images": "4.3.4", + "@loaders.gl/loader-utils": "4.3.4", + "@loaders.gl/schema": "4.3.4", + "@math.gl/polygon": "^4.1.0", + "@probe.gl/stats": "^4.0.0", + "pbf": "^3.2.1" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.3.0" + } + }, + "node_modules/@loaders.gl/schema": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/schema/-/schema-4.3.4.tgz", + "integrity": "sha512-1YTYoatgzr/6JTxqBLwDiD3AVGwQZheYiQwAimWdRBVB0JAzych7s1yBuE0CVEzj4JDPKOzVAz8KnU1TiBvJGw==", + "license": "MIT", + "dependencies": { + "@types/geojson": "^7946.0.7" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.3.0" + } + }, + "node_modules/@loaders.gl/terrain": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/terrain/-/terrain-4.3.4.tgz", + "integrity": "sha512-JszbRJGnxL5Fh82uA2U8HgjlsIpzYoCNNjy3cFsgCaxi4/dvjz3BkLlBilR7JlbX8Ka+zlb4GAbDDChiXLMJ/g==", + "license": "MIT", + "dependencies": { + "@loaders.gl/images": "4.3.4", + "@loaders.gl/loader-utils": "4.3.4", + "@loaders.gl/schema": "4.3.4", + "@mapbox/martini": "^0.2.0" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.3.0" + } + }, + "node_modules/@loaders.gl/textures": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/textures/-/textures-4.3.4.tgz", + "integrity": "sha512-arWIDjlE7JaDS6v9by7juLfxPGGnjT9JjleaXx3wq/PTp+psLOpGUywHXm38BNECos3MFEQK3/GFShWI+/dWPw==", + "license": "MIT", + "dependencies": { + "@loaders.gl/images": "4.3.4", + "@loaders.gl/loader-utils": "4.3.4", + "@loaders.gl/schema": "4.3.4", + "@loaders.gl/worker-utils": "4.3.4", + "@math.gl/types": "^4.1.0", + "ktx-parse": "^0.7.0", + "texture-compressor": "^1.0.2" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.3.0" + } + }, + "node_modules/@loaders.gl/tiles": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/tiles/-/tiles-4.3.4.tgz", + "integrity": "sha512-oC0zJfyvGox6Ag9ABF8fxOkx9yEFVyzTa9ryHXl2BqLiQoR1v3p+0tIJcEbh5cnzHfoTZzUis1TEAZluPRsHBQ==", + "license": "MIT", + "dependencies": { + "@loaders.gl/loader-utils": "4.3.4", + "@loaders.gl/math": "4.3.4", + "@math.gl/core": "^4.1.0", + "@math.gl/culling": "^4.1.0", + "@math.gl/geospatial": "^4.1.0", + "@math.gl/web-mercator": "^4.1.0", + "@probe.gl/stats": "^4.0.2" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.3.0" + } + }, + "node_modules/@loaders.gl/wms": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/wms/-/wms-4.3.4.tgz", + "integrity": "sha512-yXF0wuYzJUdzAJQrhLIua6DnjOiBJusaY1j8gpvuH1VYs3mzvWlIRuZKeUd9mduQZKK88H2IzHZbj2RGOauq4w==", + "license": "MIT", + "dependencies": { + "@loaders.gl/images": "4.3.4", + "@loaders.gl/loader-utils": "4.3.4", + "@loaders.gl/schema": "4.3.4", + "@loaders.gl/xml": "4.3.4", + "@turf/rewind": "^5.1.5", + "deep-strict-equal": "^0.2.0" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.3.0" + } + }, + "node_modules/@loaders.gl/worker-utils": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/worker-utils/-/worker-utils-4.3.4.tgz", + "integrity": "sha512-EbsszrASgT85GH3B7jkx7YXfQyIYo/rlobwMx6V3ewETapPUwdSAInv+89flnk5n2eu2Lpdeh+2zS6PvqbL2RA==", + "license": "MIT", + "peerDependencies": { + "@loaders.gl/core": "^4.3.0" + } + }, + "node_modules/@loaders.gl/xml": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/xml/-/xml-4.3.4.tgz", + "integrity": "sha512-p+y/KskajsvyM3a01BwUgjons/j/dUhniqd5y1p6keLOuwoHlY/TfTKd+XluqfyP14vFrdAHCZTnFCWLblN10w==", + "license": "MIT", + "dependencies": { + "@loaders.gl/loader-utils": "4.3.4", + "@loaders.gl/schema": "4.3.4", + "fast-xml-parser": "^4.2.5" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.3.0" + } + }, + "node_modules/@loaders.gl/zip": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/zip/-/zip-4.3.4.tgz", + "integrity": "sha512-bHY4XdKYJm3vl9087GMoxnUqSURwTxPPh6DlAGOmz6X9Mp3JyWuA2gk3tQ1UIuInfjXKph3WAUfGe6XRIs1sfw==", + "license": "MIT", + "dependencies": { + "@loaders.gl/compression": "4.3.4", + "@loaders.gl/crypto": "4.3.4", + "@loaders.gl/loader-utils": "4.3.4", + "jszip": "^3.1.5", + "md5": "^2.3.0" + }, + "peerDependencies": { + "@loaders.gl/core": "^4.3.0" + } + }, + "node_modules/@luma.gl/constants": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@luma.gl/constants/-/constants-9.2.5.tgz", + "integrity": "sha512-Z+DC7LIw+kPcIthGJdSoquIc92kkUlTOINMuJtssPsvOgFYtlsRn29h95K9y8ehjh234q2+73ExjfDQFE64f5Q==", + "license": "MIT" + }, + "node_modules/@luma.gl/core": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@luma.gl/core/-/core-9.2.5.tgz", + "integrity": "sha512-7tQ6wTTtQV6iWZxjMr+BDzS2o814EvaNW5efKtdzdvbbNyDWkDQZkyHkPvgGBB1o/+N2cbZS7GWyxOljCCH5uA==", + "license": "MIT", + "dependencies": { + "@math.gl/types": "^4.1.0", + "@probe.gl/env": "^4.0.8", + "@probe.gl/log": "^4.0.8", + "@probe.gl/stats": "^4.0.8", + "@types/offscreencanvas": "^2019.6.4" + } + }, + "node_modules/@luma.gl/engine": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@luma.gl/engine/-/engine-9.2.5.tgz", + "integrity": "sha512-swM+4VO+ab4DU58TB+cdSdby/MGLLWA9ez6BmaZ0HZwLN1HNdYwbQmT71Frtw+6lJpmBZHr78KOQi66Zx5+SOg==", + "license": "MIT", + "dependencies": { + "@math.gl/core": "^4.1.0", + "@math.gl/types": "^4.1.0", + "@probe.gl/log": "^4.0.8", + "@probe.gl/stats": "^4.0.8" + }, + "peerDependencies": { + "@luma.gl/core": "~9.2.0", + "@luma.gl/shadertools": "~9.2.0" + } + }, + "node_modules/@luma.gl/gltf": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@luma.gl/gltf/-/gltf-9.2.5.tgz", + "integrity": "sha512-hQFwtgKK4Vnd6t2bqlKVX+Z+Q5gCimq3V9LCiQmQ6An3t4KbbcXltBaBajSzkL9YEaozszSbcOUaFDXkav8CeQ==", + "license": "MIT", + "dependencies": { + "@loaders.gl/core": "^4.2.0", + "@loaders.gl/gltf": "^4.2.0", + "@loaders.gl/textures": "^4.2.0", + "@math.gl/core": "^4.1.0" + }, + "peerDependencies": { + "@luma.gl/constants": "~9.2.0", + "@luma.gl/core": "~9.2.0", + "@luma.gl/engine": "~9.2.0", + "@luma.gl/shadertools": "~9.2.0" + } + }, + "node_modules/@luma.gl/shadertools": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@luma.gl/shadertools/-/shadertools-9.2.5.tgz", + "integrity": "sha512-9upnT6r5exwotM1atc7Nwa7P69MKx+FavXWlabjk+nrRjeIJwzQ/3sXg9UfdDLavN/cDwGvnWz05UlbyABMmJg==", + "license": "MIT", + "dependencies": { + "@math.gl/core": "^4.1.0", + "@math.gl/types": "^4.1.0", + "wgsl_reflect": "^1.2.0" + }, + "peerDependencies": { + "@luma.gl/core": "~9.2.0" + } + }, + "node_modules/@luma.gl/webgl": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@luma.gl/webgl/-/webgl-9.2.5.tgz", + "integrity": "sha512-FW5e+zxPuMI6gOJI6az5UnACrRwitzcghyUCVJBQq6/ZK/Z7bjBP5JQgd287DmFXrhLUrNBJ5NYRLmfbraGdDw==", + "license": "MIT", + "dependencies": { + "@luma.gl/constants": "9.2.5", + "@math.gl/types": "^4.1.0", + "@probe.gl/env": "^4.0.8" + }, + "peerDependencies": { + "@luma.gl/core": "~9.2.0" + } + }, + "node_modules/@mapbox/geojson-rewind": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", + "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", + "license": "ISC", + "dependencies": { + "get-stream": "^6.0.1", + "minimist": "^1.2.6" + }, + "bin": { + "geojson-rewind": "geojson-rewind" + } + }, + "node_modules/@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", + "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@mapbox/martini": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@mapbox/martini/-/martini-0.2.0.tgz", + "integrity": "sha512-7hFhtkb0KTLEls+TRw/rWayq5EeHtTaErgm/NskVoXmtgAQu/9D299aeyj6mzAR/6XUnYRp2lU+4IcrYRFjVsQ==", + "license": "ISC" + }, + "node_modules/@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==" + }, + "node_modules/@mapbox/tiny-sdf": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-2.0.6.tgz", + "integrity": "sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA==", + "license": "BSD-2-Clause" }, "node_modules/@mapbox/vector-tile": { "version": "1.3.1", @@ -2804,6 +3813,65 @@ "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==", "license": "MIT" }, + "node_modules/@math.gl/core": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@math.gl/core/-/core-4.1.0.tgz", + "integrity": "sha512-FrdHBCVG3QdrworwrUSzXIaK+/9OCRLscxI2OUy6sLOHyHgBMyfnEGs99/m3KNvs+95BsnQLWklVfpKfQzfwKA==", + "license": "MIT", + "dependencies": { + "@math.gl/types": "4.1.0" + } + }, + "node_modules/@math.gl/culling": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@math.gl/culling/-/culling-4.1.0.tgz", + "integrity": "sha512-jFmjFEACnP9kVl8qhZxFNhCyd47qPfSVmSvvjR0/dIL6R9oD5zhR1ub2gN16eKDO/UM7JF9OHKU3EBIfeR7gtg==", + "license": "MIT", + "dependencies": { + "@math.gl/core": "4.1.0", + "@math.gl/types": "4.1.0" + } + }, + "node_modules/@math.gl/geospatial": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@math.gl/geospatial/-/geospatial-4.1.0.tgz", + "integrity": "sha512-BzsUhpVvnmleyYF6qdqJIip6FtIzJmnWuPTGhlBuPzh7VBHLonCFSPtQpbkRuoyAlbSyaGXcVt6p6lm9eK2vtg==", + "license": "MIT", + "dependencies": { + "@math.gl/core": "4.1.0", + "@math.gl/types": "4.1.0" + } + }, + "node_modules/@math.gl/polygon": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@math.gl/polygon/-/polygon-4.1.0.tgz", + "integrity": "sha512-YA/9PzaCRHbIP5/0E9uTYrqe+jsYTQoqoDWhf6/b0Ixz8bPZBaGDEafLg3z7ffBomZLacUty9U3TlPjqMtzPjA==", + "license": "MIT", + "dependencies": { + "@math.gl/core": "4.1.0" + } + }, + "node_modules/@math.gl/sun": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@math.gl/sun/-/sun-4.1.0.tgz", + "integrity": "sha512-i3q6OCBLSZ5wgZVhXg+X7gsjY/TUtuFW/2KBiq/U1ypLso3S4sEykoU/MGjxUv1xiiGtr+v8TeMbO1OBIh/HmA==", + "license": "MIT" + }, + "node_modules/@math.gl/types": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@math.gl/types/-/types-4.1.0.tgz", + "integrity": "sha512-clYZdHcmRvMzVK5fjeDkQlHUzXQSNdZ7s4xOqC3nJPgz4C/TZkUecTo9YS4PruZqtDda/ag4erndP0MIn40dGA==", + "license": "MIT" + }, + "node_modules/@math.gl/web-mercator": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@math.gl/web-mercator/-/web-mercator-4.1.0.tgz", + "integrity": "sha512-HZo3vO5GCMkXJThxRJ5/QYUYRr3XumfT8CzNNCwoJfinxy5NtKUd7dusNTXn7yJ40UoB8FMIwkVwNlqaiRZZAw==", + "license": "MIT", + "dependencies": { + "@math.gl/core": "4.1.0" + } + }, "node_modules/@mswjs/interceptors": { "version": "0.40.0", "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.40.0.tgz", @@ -2875,6 +3943,23 @@ "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", "dev": true }, + "node_modules/@open-wc/dedupe-mixin": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@open-wc/dedupe-mixin/-/dedupe-mixin-1.4.0.tgz", + "integrity": "sha512-Sj7gKl1TLcDbF7B6KUhtvr+1UCxdhMbNY5KxdU5IfMFWqL8oy1ZeAcCANjoB1TL0AJTcPmcCFsCbHf8X2jGDUA==", + "license": "MIT", + "peer": true + }, + "node_modules/@polymer/polymer": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@polymer/polymer/-/polymer-3.5.2.tgz", + "integrity": "sha512-fWwImY/UH4bb2534DVSaX+Azs2yKg8slkMBHOyGeU2kKx7Xmxp6Lee0jP8p6B3d7c1gFUPB2Z976dTUtX81pQA==", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@webcomponents/shadycss": "^1.9.1" + } + }, "node_modules/@popperjs/core": { "version": "2.11.5", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", @@ -2884,6 +3969,27 @@ "url": "https://opencollective.com/popperjs" } }, + "node_modules/@probe.gl/env": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@probe.gl/env/-/env-4.1.0.tgz", + "integrity": "sha512-5ac2Jm2K72VCs4eSMsM7ykVRrV47w32xOGMvcgqn8vQdEMF9PRXyBGYEV9YbqRKWNKpNKmQJVi4AHM/fkCxs9w==", + "license": "MIT" + }, + "node_modules/@probe.gl/log": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@probe.gl/log/-/log-4.1.0.tgz", + "integrity": "sha512-r4gRReNY6f+OZEMgfWEXrAE2qJEt8rX0HsDJQXUBMoc+5H47bdB7f/5HBHAmapK8UydwPKL9wCDoS22rJ0yq7Q==", + "license": "MIT", + "dependencies": { + "@probe.gl/env": "4.1.0" + } + }, + "node_modules/@probe.gl/stats": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@probe.gl/stats/-/stats-4.1.0.tgz", + "integrity": "sha512-EI413MkWKBDVNIfLdqbeNSJTs7ToBz/KVGkwi3D+dQrSIkRI2IYbWGAU3xX+D6+CI4ls8ehxMhNpUVMaZggDvQ==", + "license": "MIT" + }, "node_modules/@react-aria/ssr": { "version": "3.9.7", "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.7.tgz", @@ -3121,6 +4227,62 @@ "node": ">= 10" } }, + "node_modules/@turf/boolean-clockwise": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/boolean-clockwise/-/boolean-clockwise-5.1.5.tgz", + "integrity": "sha512-FqbmEEOJ4rU4/2t7FKx0HUWmjFEVqR+NJrFP7ymGSjja2SQ7Q91nnBihGuT+yuHHl6ElMjQ3ttsB/eTmyCycxA==", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5" + } + }, + "node_modules/@turf/clone": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/clone/-/clone-5.1.5.tgz", + "integrity": "sha512-//pITsQ8xUdcQ9pVb4JqXiSqG4dos5Q9N4sYFoWghX21tfOV2dhc5TGqYOhnHrQS7RiKQL1vQ48kIK34gQ5oRg==", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^5.1.5" + } + }, + "node_modules/@turf/helpers": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-5.1.5.tgz", + "integrity": "sha512-/lF+JR+qNDHZ8bF9d+Cp58nxtZWJ3sqFe6n3u3Vpj+/0cqkjk4nXKYBSY0azm+GIYB5mWKxUXvuP/m0ZnKj1bw==", + "license": "MIT" + }, + "node_modules/@turf/invariant": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-5.2.0.tgz", + "integrity": "sha512-28RCBGvCYsajVkw2EydpzLdcYyhSA77LovuOvgCJplJWaNVyJYH6BOR3HR9w50MEkPqb/Vc/jdo6I6ermlRtQA==", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^5.1.5" + } + }, + "node_modules/@turf/meta": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-5.2.0.tgz", + "integrity": "sha512-ZjQ3Ii62X9FjnK4hhdsbT+64AYRpaI8XMBMcyftEOGSmPMUVnkbvuv3C9geuElAXfQU7Zk1oWGOcrGOD9zr78Q==", + "license": "MIT", + "dependencies": { + "@turf/helpers": "^5.1.5" + } + }, + "node_modules/@turf/rewind": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/rewind/-/rewind-5.1.5.tgz", + "integrity": "sha512-Gdem7JXNu+G4hMllQHXRFRihJl3+pNl7qY+l4qhQFxq+hiU1cQoVFnyoleIqWKIrdK/i2YubaSwc3SCM7N5mMw==", + "license": "MIT", + "dependencies": { + "@turf/boolean-clockwise": "^5.1.5", + "@turf/clone": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, "node_modules/@types/aria-query": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", @@ -3185,9 +4347,18 @@ "@types/node": "*" } }, - "node_modules/@types/command-line-args": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.3.tgz", + "node_modules/@types/brotli": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/brotli/-/brotli-1.3.4.tgz", + "integrity": "sha512-cKYjgaS2DMdCKF7R0F5cgx1nfBYObN2ihIuPGQ4/dlIY6RpV7OWNwe9L8V4tTVKL2eZqOkNM9FM/rgTvLf4oXw==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/command-line-args": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.3.tgz", "integrity": "sha512-uv0aG6R0Y8WHZLTamZwtfsDLVRnOa+n+n5rEvFWL5Na5gZ8V2Teab/duDPFzIIIhs9qizDpcavCusCLJZu62Kw==", "license": "MIT" }, @@ -3214,24 +4385,155 @@ "@types/node": "*" } }, + "node_modules/@types/crypto-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.2.2.tgz", + "integrity": "sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==", + "license": "MIT" + }, + "node_modules/@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, "node_modules/@types/d3-array": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.3.tgz", "integrity": "sha512-Reoy+pKnvsksN0lQUlcH6dOGjRZ/3WRwXR//m+/8lt1BXeI4xyaUZoqULNjyXXRuh0Mj4LNpkCvhUpQlY3X5xQ==", "license": "MIT" }, + "node_modules/@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "license": "MIT", + "peer": true + }, "node_modules/@types/d3-color": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==", "license": "MIT" }, + "node_modules/@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, "node_modules/@types/d3-delaunay": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.1.tgz", "integrity": "sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==", "license": "MIT" }, + "node_modules/@types/d3-dispatch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-dsv": "*" + } + }, + "node_modules/@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "license": "MIT", + "peer": true + }, "node_modules/@types/d3-format": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.1.tgz", @@ -3247,6 +4549,13 @@ "@types/geojson": "*" } }, + "node_modules/@types/d3-hierarchy": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.1.tgz", + "integrity": "sha512-QwjxA3+YCKH3N1Rs3uSiSy1bdxlLB1uUiENXeJudBoAFvtDuswUxLcanoOaR2JYn1melDTuIXR8VhnVyI3yG/A==", + "license": "MIT", + "peer": true + }, "node_modules/@types/d3-interpolate": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", @@ -3262,6 +4571,37 @@ "integrity": "sha512-4pQMp8ldf7UaB/gR8Fvvy69psNHkTpD/pVw3vmEi8iZAB9EPMBruB1JvHO4BIq9QkUUd2lV1F5YXpMNj7JPBpw==", "license": "MIT" }, + "node_modules/@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-sankey": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/@types/d3-sankey/-/d3-sankey-0.11.2.tgz", + "integrity": "sha512-U6SrTWUERSlOhnpSrgvMX64WblX1AxX6nEjI2t3mLK2USpQrnbwYYK+AS9SwiE7wgYmOsSSKoSdr8aoKBH0HgQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-shape": "^1" + } + }, "node_modules/@types/d3-scale": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.2.tgz", @@ -3271,6 +4611,20 @@ "@types/d3-time": "*" } }, + "node_modules/@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT", + "peer": true + }, "node_modules/@types/d3-shape": { "version": "1.3.12", "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.12.tgz", @@ -3292,6 +4646,34 @@ "integrity": "sha512-/myT3I7EwlukNOX2xVdMzb8FRgNzRMpsZddwst9Ld/VFe6LyJyRp0s32l/V9XoUzk+Gqu56F/oGk6507+8BxrA==", "license": "MIT" }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT", + "peer": true + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, "node_modules/@types/eslint": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", @@ -3338,9 +4720,9 @@ } }, "node_modules/@types/geojson": { - "version": "7946.0.14", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", - "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==", + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==", "license": "MIT" }, "node_modules/@types/geojson-vt": { @@ -3352,6 +4734,12 @@ "@types/geojson": "*" } }, + "node_modules/@types/google.maps": { + "version": "3.58.1", + "resolved": "https://registry.npmjs.org/@types/google.maps/-/google.maps-3.58.1.tgz", + "integrity": "sha512-X9QTSvGJ0nCfMzYOnaVs/k6/4L+7F5uCS+4iUmkLEls6J9S/Phv+m/i3mDeyc49ZBgwab3EFO1HEoBY7k98EGQ==", + "license": "MIT" + }, "node_modules/@types/graceful-fs": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", @@ -3571,6 +4959,18 @@ "@types/node": "*" } }, + "node_modules/@types/offscreencanvas": { + "version": "2019.7.3", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", + "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==", + "license": "MIT" + }, + "node_modules/@types/pako": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/pako/-/pako-1.0.7.tgz", + "integrity": "sha512-YBtzT2ztNF6R/9+UXj2wTGFnC9NklAnASt3sC0h2m1bbH7G6FyBIkt4AN8ThZpNfxUo1b2iMVO0UawiJymEt8A==", + "license": "MIT" + }, "node_modules/@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", @@ -3588,6 +4988,13 @@ "integrity": "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==", "license": "MIT" }, + "node_modules/@types/polylabel": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@types/polylabel/-/polylabel-1.1.3.tgz", + "integrity": "sha512-9Zw2KoDpi+T4PZz2G6pO2xArE0m/GSMTW1MIxF2s8ZY8x9XDO6fv9um0ydRGvcbkFLlaq8yNK6eZxnmMZtDgWQ==", + "license": "MIT", + "peer": true + }, "node_modules/@types/prettier": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.1.tgz", @@ -3688,6 +5095,13 @@ "@types/node": "*" } }, + "node_modules/@types/sortablejs": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/@types/sortablejs/-/sortablejs-1.15.9.tgz", + "integrity": "sha512-7HP+rZGE2p886PKV9c9OJzLBI6BBJu1O7lJGYnPyG3fS4/duUCcngkNCjsLwIMV+WMqANe3tt4irrXHSIe68OQ==", + "license": "MIT", + "peer": true + }, "node_modules/@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", @@ -3709,6 +5123,13 @@ "@types/geojson": "*" } }, + "node_modules/@types/svg-arc-to-cubic-bezier": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@types/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.3.tgz", + "integrity": "sha512-UNOnbTtl0nVTm8hwKaz5R5VZRvSulFMGojO5+Q7yucKxBoCaTtS4ibSQVRHo5VW5AaRo145U8p1Vfg5KrYe9Bg==", + "license": "MIT", + "peer": true + }, "node_modules/@types/testing-library__jest-dom": { "version": "5.14.3", "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.3.tgz", @@ -3724,6 +5145,13 @@ "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", "dev": true }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "peer": true + }, "node_modules/@types/warning": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", @@ -4006,6 +5434,202 @@ "react": ">= 16.8.0" } }, + "node_modules/@vaadin/a11y-base": { + "version": "24.9.8", + "resolved": "https://registry.npmjs.org/@vaadin/a11y-base/-/a11y-base-24.9.8.tgz", + "integrity": "sha512-8+4XALzrTwBAI3ARFApLOa4MlaPn9lHtA7JaZxd7hlqeit0LsKkJ1LhNP7GS5BhvyOfn3MUo1oR09v7SUOPixw==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@open-wc/dedupe-mixin": "^1.3.0", + "@polymer/polymer": "^3.0.0", + "@vaadin/component-base": "~24.9.8", + "lit": "^3.0.0" + } + }, + "node_modules/@vaadin/checkbox": { + "version": "24.9.8", + "resolved": "https://registry.npmjs.org/@vaadin/checkbox/-/checkbox-24.9.8.tgz", + "integrity": "sha512-G4KVnP7K/OWGlVjSAVRCn4cZNIY+4PHmjijBzYUoChiIHnlDnnKU7Bzb215FT3j5JquVHKdeO957ALusN/UYVQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@open-wc/dedupe-mixin": "^1.3.0", + "@polymer/polymer": "^3.0.0", + "@vaadin/a11y-base": "~24.9.8", + "@vaadin/component-base": "~24.9.8", + "@vaadin/field-base": "~24.9.8", + "@vaadin/vaadin-lumo-styles": "~24.9.8", + "@vaadin/vaadin-material-styles": "~24.9.8", + "@vaadin/vaadin-themable-mixin": "~24.9.8", + "lit": "^3.0.0" + } + }, + "node_modules/@vaadin/component-base": { + "version": "24.9.8", + "resolved": "https://registry.npmjs.org/@vaadin/component-base/-/component-base-24.9.8.tgz", + "integrity": "sha512-KOSJy9mXfbc1nW+LVSRV/jPC6s1K0lo6LeNZOuYjCYxSqsxIKGFrPrHsISPLIbHcfKtV/76OA4c0u5vgPeWkbA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@open-wc/dedupe-mixin": "^1.3.0", + "@polymer/polymer": "^3.0.0", + "@vaadin/vaadin-development-mode-detector": "^2.0.0", + "@vaadin/vaadin-usage-statistics": "^2.1.0", + "lit": "^3.0.0" + } + }, + "node_modules/@vaadin/field-base": { + "version": "24.9.8", + "resolved": "https://registry.npmjs.org/@vaadin/field-base/-/field-base-24.9.8.tgz", + "integrity": "sha512-KyTIDv9wsEA0kyul8OrD3S0vxKV58WYNERCwiT5iNll9qVXolAR8Zsu/SQDzzPsAQiCNE79T/pFeRjL6F59oig==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@open-wc/dedupe-mixin": "^1.3.0", + "@polymer/polymer": "^3.0.0", + "@vaadin/a11y-base": "~24.9.8", + "@vaadin/component-base": "~24.9.8", + "lit": "^3.0.0" + } + }, + "node_modules/@vaadin/grid": { + "version": "24.9.8", + "resolved": "https://registry.npmjs.org/@vaadin/grid/-/grid-24.9.8.tgz", + "integrity": "sha512-jpzw/JuHfQxIU5ffKkwaQx2Bsvrlcb9frQxRP82UoMD5n7+Y8hcTxLBTtMfeP5851zN7vAOltegaBpciONDkKg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@open-wc/dedupe-mixin": "^1.3.0", + "@polymer/polymer": "^3.0.0", + "@vaadin/a11y-base": "~24.9.8", + "@vaadin/checkbox": "~24.9.8", + "@vaadin/component-base": "~24.9.8", + "@vaadin/lit-renderer": "~24.9.8", + "@vaadin/text-field": "~24.9.8", + "@vaadin/vaadin-lumo-styles": "~24.9.8", + "@vaadin/vaadin-material-styles": "~24.9.8", + "@vaadin/vaadin-themable-mixin": "~24.9.8", + "lit": "^3.0.0" + } + }, + "node_modules/@vaadin/icon": { + "version": "24.9.8", + "resolved": "https://registry.npmjs.org/@vaadin/icon/-/icon-24.9.8.tgz", + "integrity": "sha512-LzxBcosBqJaT/gqSvXAUEnie3tOOI2aBjnWhOEm+MN4Xo6Qz2t1nfz6B0M0/vcd6WYPWzELboe9o3e0p5R/tmA==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@open-wc/dedupe-mixin": "^1.3.0", + "@polymer/polymer": "^3.0.0", + "@vaadin/component-base": "~24.9.8", + "@vaadin/vaadin-lumo-styles": "~24.9.8", + "@vaadin/vaadin-themable-mixin": "~24.9.8", + "lit": "^3.0.0" + } + }, + "node_modules/@vaadin/input-container": { + "version": "24.9.8", + "resolved": "https://registry.npmjs.org/@vaadin/input-container/-/input-container-24.9.8.tgz", + "integrity": "sha512-YWU2yaXkdt7dLkngHKoeEif9m0fT9lIAPYpngX5WlzoZi5dDwJjHMOWFvRV2TkUAdWMx8t1W6O9m7t/jrzwy8Q==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@polymer/polymer": "^3.0.0", + "@vaadin/component-base": "~24.9.8", + "@vaadin/vaadin-lumo-styles": "~24.9.8", + "@vaadin/vaadin-material-styles": "~24.9.8", + "@vaadin/vaadin-themable-mixin": "~24.9.8", + "lit": "^3.0.0" + } + }, + "node_modules/@vaadin/lit-renderer": { + "version": "24.9.8", + "resolved": "https://registry.npmjs.org/@vaadin/lit-renderer/-/lit-renderer-24.9.8.tgz", + "integrity": "sha512-fhOdpFv2U2vnDMlUlBKjnOoDHJnkw9Kwh5MGPDb46a6gkd09C9gKBHpNREqtyP8OQ289DteBV5eCNWxaAQgNMQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "lit": "^3.0.0" + } + }, + "node_modules/@vaadin/text-field": { + "version": "24.9.8", + "resolved": "https://registry.npmjs.org/@vaadin/text-field/-/text-field-24.9.8.tgz", + "integrity": "sha512-fjE9xA+jd2d69/vE3/1cz5WNtQgN/zz9YbPUcL06ET9SFn4MB0Td834h5v3FvC7gv993TPpnHfLLZVzzBQa1Ww==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@open-wc/dedupe-mixin": "^1.3.0", + "@polymer/polymer": "^3.0.0", + "@vaadin/a11y-base": "~24.9.8", + "@vaadin/component-base": "~24.9.8", + "@vaadin/field-base": "~24.9.8", + "@vaadin/input-container": "~24.9.8", + "@vaadin/vaadin-lumo-styles": "~24.9.8", + "@vaadin/vaadin-material-styles": "~24.9.8", + "@vaadin/vaadin-themable-mixin": "~24.9.8", + "lit": "^3.0.0" + } + }, + "node_modules/@vaadin/vaadin-development-mode-detector": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-development-mode-detector/-/vaadin-development-mode-detector-2.0.7.tgz", + "integrity": "sha512-9FhVhr0ynSR3X2ao+vaIEttcNU5XfzCbxtmYOV8uIRnUCtNgbvMOIcyGBvntsX9I5kvIP2dV3cFAOG9SILJzEA==", + "license": "Apache-2.0", + "peer": true + }, + "node_modules/@vaadin/vaadin-lumo-styles": { + "version": "24.9.8", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-lumo-styles/-/vaadin-lumo-styles-24.9.8.tgz", + "integrity": "sha512-ilQkJbIDh02EjbAEOEOUPFmktJaZlGafEHvCsGooYLV29v20w70MWQ+iftGKLFQ1DlLi8+sACNREYHsA9yZzSQ==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@polymer/polymer": "^3.0.0", + "@vaadin/component-base": "~24.9.8", + "@vaadin/icon": "~24.9.8", + "@vaadin/vaadin-themable-mixin": "~24.9.8" + } + }, + "node_modules/@vaadin/vaadin-material-styles": { + "version": "24.9.8", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-material-styles/-/vaadin-material-styles-24.9.8.tgz", + "integrity": "sha512-/WC4gZBmIRHk4sy3Vpj0LtanuNvL+zGNLRoH/rDYf0Ybcj4CdonL3Y0lMoF9/Mo4BdVmC4ynvYz6oR0xr/BkZg==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@polymer/polymer": "^3.0.0", + "@vaadin/component-base": "~24.9.8", + "@vaadin/vaadin-themable-mixin": "~24.9.8" + } + }, + "node_modules/@vaadin/vaadin-themable-mixin": { + "version": "24.9.8", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-themable-mixin/-/vaadin-themable-mixin-24.9.8.tgz", + "integrity": "sha512-RlQ6q7yJKsHJIpsUk+RReMJSngaRwH2dfh7QO9/8F7pWRs6baKMAS1abPMmugdyldl3JxX6mX+7UQ+ghRZUNug==", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@open-wc/dedupe-mixin": "^1.3.0", + "lit": "^3.0.0", + "style-observer": "^0.0.8" + } + }, + "node_modules/@vaadin/vaadin-usage-statistics": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-usage-statistics/-/vaadin-usage-statistics-2.1.3.tgz", + "integrity": "sha512-8r4TNknD7OJQADe3VygeofFR7UNAXZ2/jjBFP5dgI8+2uMfnuGYgbuHivasKr9WSQ64sPej6m8rDoM1uSllXjQ==", + "hasInstallScript": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@vaadin/vaadin-development-mode-detector": "^2.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, "node_modules/@visx/axis": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/@visx/axis/-/axis-3.12.0.tgz", @@ -4395,6 +6019,13 @@ "@xtuc/long": "4.2.2" } }, + "node_modules/@webcomponents/shadycss": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.11.2.tgz", + "integrity": "sha512-vRq+GniJAYSBmTRnhCYPAPq6THYqovJ/gzGThWbgEZUQaBccndGTi1hdiUP15HzEco0I6t4RCtXyX0rsSmwgPw==", + "license": "BSD-3-Clause", + "peer": true + }, "node_modules/@webpack-cli/configtest": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-3.0.1.tgz", @@ -4442,6 +6073,19 @@ } } }, + "node_modules/@welldone-software/why-did-you-render": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@welldone-software/why-did-you-render/-/why-did-you-render-8.0.3.tgz", + "integrity": "sha512-bb5bKPMStYnocyTBVBu4UTegZdBqzV1mPhxc0UIV/S43KFUSRflux9gvzJfu2aM4EWLJ3egTvdjOi+viK+LKGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4" + }, + "peerDependencies": { + "react": "^18" + } + }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -4452,6 +6096,27 @@ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, + "node_modules/@zip.js/zip.js": { + "version": "2.8.14", + "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.8.14.tgz", + "integrity": "sha512-BZ7OyJLA5cjYwf2jVjvZCK10swzIc6sDOLpkPjJXfXgx/IHF5y61PyL3Ko5/q3bUU5GvIhk6tzKDUcDJ7rhzbg==", + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "bun": ">=0.7.0", + "deno": ">=1.0.0", + "node": ">=18.0.0" + } + }, + "node_modules/a5-js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/a5-js/-/a5-js-0.5.0.tgz", + "integrity": "sha512-VAw19sWdYadhdovb0ViOIi1SdKx6H6LwcGMRFKwMfgL5gcmL/1fKJHfgsNgNaJ7xC/eEyjs6VK+VVd4N0a+peg==", + "license": "Apache-2.0", + "dependencies": { + "gl-matrix": "^3.4.3" + } + }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", @@ -5075,6 +6740,26 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/baseline-browser-mapping": { "version": "2.8.28", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.28.tgz", @@ -5181,6 +6866,15 @@ "node": ">=8" } }, + "node_modules/brotli": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", + "license": "MIT", + "dependencies": { + "base64-js": "^1.1.2" + } + }, "node_modules/browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", @@ -5228,6 +6922,15 @@ "node-int64": "^0.4.0" } }, + "node_modules/buf-compare": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buf-compare/-/buf-compare-1.0.1.tgz", + "integrity": "sha512-Bvx4xH00qweepGc43xFvMs5BKASXTbHaHm6+kDYIK9p/4iFwjATQkmPKHQSgJZzKbAymhztRbXUf1Nqhzl73/Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -5360,6 +7063,15 @@ } ] }, + "node_modules/cartocolor": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/cartocolor/-/cartocolor-5.0.2.tgz", + "integrity": "sha512-Ihb/wU5V6BVbHwapd8l/zg7bnhZ4YPFVfa7quSpL86lfkPJSf4YuNBT+EvesPRP5vSqhl6vZVsQJwCR8alBooQ==", + "license": "CC-BY-4.0", + "dependencies": { + "colorbrewer": "1.5.6" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -5429,6 +7141,15 @@ "node": ">=6" } }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -5511,7 +7232,17 @@ "node": ">=12" } }, - "node_modules/clone-deep": { + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", @@ -5551,6 +7282,20 @@ "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", "dev": true }, + "node_modules/color": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", + "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", + "license": "MIT", + "peer": true, + "dependencies": { + "color-convert": "^3.1.3", + "color-string": "^2.1.3" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -5567,6 +7312,63 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/color-string": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", + "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/color-string/node_modules/color-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/color/node_modules/color-convert": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", + "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", + "license": "MIT", + "peer": true, + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=14.6" + } + }, + "node_modules/color/node_modules/color-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/colorbrewer": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/colorbrewer/-/colorbrewer-1.5.6.tgz", + "integrity": "sha512-fONg2pGXyID8zNgKHBlagW8sb/AMShGzj4rRJfz5biZ7iuHQZYquSCLE/Co1oSQFmt/vvwjyezJCejQl7FG/tg==", + "license": [ + { + "type": "Apache-Style", + "url": "https://github.com/saikocat/colorbrewer/blob/master/LICENSE.txt" + } + ] + }, "node_modules/colorette": { "version": "2.0.16", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", @@ -5621,12 +7423,32 @@ "node": ">=12.20.0" } }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">= 10" + } + }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, + "node_modules/composed-offset-position": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/composed-offset-position/-/composed-offset-position-0.0.6.tgz", + "integrity": "sha512-Q7dLompI6lUwd7LWyIcP66r4WcS9u7AL2h8HaeipiRfCRPLMWqRx8fYsjb4OHi6UQFifO7XtNC2IlEJ1ozIFxw==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "@floating-ui/utils": "^0.2.5" + } + }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -5772,6 +7594,19 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "node_modules/core-assert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/core-assert/-/core-assert-0.2.1.tgz", + "integrity": "sha512-IG97qShIP+nrJCXMCgkNZgH7jZQ4n8RpPyPeXX++T6avR/KhLhgLiHKoEn5Rc1KjfycSfA9DMa6m+4C4eguHhw==", + "license": "MIT", + "dependencies": { + "buf-compare": "^1.0.0", + "is-error": "^2.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/core-js": { "version": "3.22.8", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.8.tgz", @@ -5838,6 +7673,22 @@ "node": ">= 8" } }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT", + "peer": true + }, "node_modules/css": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", @@ -5920,6 +7771,13 @@ "node": ">=4" } }, + "node_modules/cssfilter": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", + "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==", + "license": "MIT", + "peer": true + }, "node_modules/cssom": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", @@ -5945,9 +7803,52 @@ "dev": true }, "node_modules/csstype": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" + } }, "node_modules/d3-array": { "version": "3.2.4", @@ -5961,6 +7862,46 @@ "node": ">=12" } }, + "node_modules/d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/d3-color": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", @@ -5970,6 +7911,19 @@ "node": ">=12" } }, + "node_modules/d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/d3-delaunay": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", @@ -5982,6 +7936,107 @@ "node": ">=12" } }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "peer": true, + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "peer": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/d3-format": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", @@ -5991,80 +8046,327 @@ "node": ">=12" } }, - "node_modules/d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", - "license": "ISC", + "node_modules/d3-geo": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-hexbin": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/d3-hexbin/-/d3-hexbin-0.2.2.tgz", + "integrity": "sha512-KS3fUT2ReD4RlGCjvCEm1RgMtp2NFZumdMu4DBzQK8AZv3fXRM6Xm8I4fSU07UXvH4xxg03NwWKWdvxfS/yc4w==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", + "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", + "license": "BSD-3-Clause" + }, + "node_modules/d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + } + }, + "node_modules/d3-sankey/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/d3-sankey/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "license": "ISC", + "peer": true + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", + "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "1" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "peer": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "peer": true, + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-voronoi-map": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-voronoi-map/-/d3-voronoi-map-2.1.1.tgz", + "integrity": "sha512-mCXfz/kD9IQxjHaU2IMjkO8fSo4J6oysPR2iL+omDsCy1i1Qn6BQ/e4hEAW8C6ms2kfuHwqtbNom80Hih94YsA==", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "d3-dispatch": "2.*", + "d3-polygon": "2.*", + "d3-timer": "2.*", + "d3-weighted-voronoi": "1.*" + } + }, + "node_modules/d3-voronoi-map/node_modules/d3-dispatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-2.0.0.tgz", + "integrity": "sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==", + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/d3-voronoi-map/node_modules/d3-polygon": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-2.0.0.tgz", + "integrity": "sha512-MsexrCK38cTGermELs0cO1d79DcTsQRN7IWMJKczD/2kBjzNXxLUWP33qRF6VDpiLV/4EI4r6Gs0DAWQkE8pSQ==", + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/d3-voronoi-map/node_modules/d3-timer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-2.0.0.tgz", + "integrity": "sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA==", + "license": "BSD-3-Clause", + "peer": true + }, + "node_modules/d3-voronoi-treemap": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-voronoi-treemap/-/d3-voronoi-treemap-1.1.2.tgz", + "integrity": "sha512-7odu9HdG/yLPWwzDteJq4yd9Q/NwgQV7IE/u36VQtcCK7k1sZwDqbkHCeMKNTBsq5mQjDwolTsrXcU0j8ZEMCA==", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "d3-voronoi-map": "2.*" + } + }, + "node_modules/d3-weighted-voronoi": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/d3-weighted-voronoi/-/d3-weighted-voronoi-1.1.3.tgz", + "integrity": "sha512-C3WdvSKl9aqhAy+f3QT3PPsQG6V+ajDfYO3BSclQDSD+araW2xDBFIH67aKzsSuuuKaX8K2y2dGq1fq/dWTVig==", + "license": "BSD-3-Clause", + "peer": true, "dependencies": { - "d3-array": "2.5.0 - 3" - }, - "engines": { - "node": ">=12" + "d3-array": "2", + "d3-polygon": "2" } }, - "node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "license": "ISC", + "node_modules/d3-weighted-voronoi/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "license": "BSD-3-Clause", + "peer": true, "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" + "internmap": "^1.0.0" } }, - "node_modules/d3-path": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", - "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==", - "license": "BSD-3-Clause" + "node_modules/d3-weighted-voronoi/node_modules/d3-polygon": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-2.0.0.tgz", + "integrity": "sha512-MsexrCK38cTGermELs0cO1d79DcTsQRN7IWMJKczD/2kBjzNXxLUWP33qRF6VDpiLV/4EI4r6Gs0DAWQkE8pSQ==", + "license": "BSD-3-Clause", + "peer": true }, - "node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "node_modules/d3-weighted-voronoi/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "license": "ISC", + "peer": true + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", "license": "ISC", + "peer": true, "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" }, "engines": { "node": ">=12" } }, - "node_modules/d3-shape": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", - "integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==", - "license": "BSD-3-Clause", - "dependencies": { - "d3-path": "1" - } - }, - "node_modules/d3-time": { + "node_modules/d3/node_modules/d3-path": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", "license": "ISC", - "dependencies": { - "d3-array": "2 - 3" - }, + "peer": true, "engines": { "node": ">=12" } }, - "node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "node_modules/d3/node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", "license": "ISC", + "peer": true, "dependencies": { - "d3-time": "1 - 3" + "d3-path": "^3.1.0" }, "engines": { "node": ">=12" @@ -6150,6 +8452,46 @@ "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", "dev": true }, + "node_modules/deck.gl": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/deck.gl/-/deck.gl-9.2.5.tgz", + "integrity": "sha512-z64COJdbwwe73bqMGTS7Y56imWwvF0TELUzcL5avG6QlEJrZ7M9Wo9ycrCBKWVgARXRAcVBiC5NdknOoFTyXBA==", + "license": "MIT", + "dependencies": { + "@deck.gl/aggregation-layers": "9.2.5", + "@deck.gl/arcgis": "9.2.5", + "@deck.gl/carto": "9.2.5", + "@deck.gl/core": "9.2.5", + "@deck.gl/extensions": "9.2.5", + "@deck.gl/geo-layers": "9.2.5", + "@deck.gl/google-maps": "9.2.5", + "@deck.gl/json": "9.2.5", + "@deck.gl/layers": "9.2.5", + "@deck.gl/mapbox": "9.2.5", + "@deck.gl/mesh-layers": "9.2.5", + "@deck.gl/react": "9.2.5", + "@deck.gl/widgets": "9.2.5", + "@loaders.gl/core": "^4.2.0", + "@luma.gl/core": "^9.2.4", + "@luma.gl/engine": "^9.2.4" + }, + "peerDependencies": { + "@arcgis/core": "^4.0.0", + "react": ">=16.3.0", + "react-dom": ">=16.3.0" + }, + "peerDependenciesMeta": { + "@arcgis/core": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, "node_modules/decode-uri-component": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", @@ -6165,11 +8507,44 @@ "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", "dev": true }, + "node_modules/deep-equal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", + "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", + "license": "MIT", + "peer": true, + "dependencies": { + "is-arguments": "^1.1.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.5.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, + "node_modules/deep-strict-equal": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/deep-strict-equal/-/deep-strict-equal-0.2.0.tgz", + "integrity": "sha512-3daSWyvZ/zwJvuMGlzG1O+Ow0YSadGfb3jsh9xoCutv2tWyB9dA4YvR9L9/fSdDZa2dByYQe+TqapSGUrjnkoA==", + "license": "MIT", + "dependencies": { + "core-assert": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -6305,6 +8680,13 @@ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" }, + "node_modules/dfa": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", + "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==", + "license": "MIT", + "peer": true + }, "node_modules/diff-sequences": { "version": "28.0.2", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.0.2.tgz", @@ -6424,6 +8806,12 @@ "webpack": "^4 || ^5" } }, + "node_modules/draco3d": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", + "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==", + "license": "Apache-2.0" + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -6626,6 +9014,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-toolkit": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.43.0.tgz", + "integrity": "sha512-SKCT8AsWvYzBBuUqMk4NPwFlSdqLpJwmy6AP322ERn8W2YLIB6JBXnwMI2Qsh2gfphT3q7EKAxKb23cvFHFwKA==", + "license": "MIT", + "peer": true, + "workspaces": [ + "docs", + "benchmarks" + ] + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -7197,6 +9596,13 @@ "node": ">=4.0" } }, + "node_modules/esri-loader": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/esri-loader/-/esri-loader-3.7.0.tgz", + "integrity": "sha512-cB1Sw9EQjtW4mtT7eFBjn/6VaaIWNTjmTd2asnnEyuZk1xVSFRMCfLZSBSjZM7ZarDcVu5WIjOP0t0MYVu4hVQ==", + "deprecated": "Use @arcgis/core instead.", + "license": "Apache-2.0" + }, "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", @@ -7427,6 +9833,24 @@ } ] }, + "node_modules/fast-xml-parser": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz", + "integrity": "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "strnum": "^1.1.1" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, "node_modules/fastest-levenshtein": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", @@ -7635,11 +10059,28 @@ "integrity": "sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==", "license": "Apache-2.0" }, + "node_modules/flatpickr": { + "version": "4.6.13", + "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.13.tgz", + "integrity": "sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw==", + "license": "MIT", + "peer": true + }, "node_modules/flatted": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==" }, + "node_modules/focus-trap": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.8.0.tgz", + "integrity": "sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==", + "license": "MIT", + "peer": true, + "dependencies": { + "tabbable": "^6.4.0" + } + }, "node_modules/follow-redirects": { "version": "1.15.6", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", @@ -7979,6 +10420,17 @@ "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } }, + "node_modules/h3-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/h3-js/-/h3-js-4.4.0.tgz", + "integrity": "sha512-DvJh07MhGgY2KcC4OeZc8SSyA+ZXpdvoh6uCzGpoKvWtZxJB+g6VXXC1+eWYkaMIsLz7J/ErhOalHCpcs1KYog==", + "license": "Apache-2.0", + "engines": { + "node": ">=4", + "npm": ">=3", + "yarn": ">=1.3.0" + } + }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -8286,6 +10738,24 @@ "node": ">= 4" } }, + "node_modules/image-size": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.7.5.tgz", + "integrity": "sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g==", + "license": "MIT", + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "license": "MIT" + }, "node_modules/immutable": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", @@ -8365,6 +10835,16 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/interactjs": { + "version": "1.10.27", + "resolved": "https://registry.npmjs.org/interactjs/-/interactjs-1.10.27.tgz", + "integrity": "sha512-y/8RcCftGAF24gSp76X2JS3XpHiUvDQyhF8i7ujemBz77hwiHDuJzftHx7thY8cxGogwGiPJ+o97kWB6eAXnsA==", + "license": "MIT", + "peer": true, + "dependencies": { + "@interactjs/types": "1.10.27" + } + }, "node_modules/internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", @@ -8413,6 +10893,23 @@ "node": ">= 10" } }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "license": "MIT", + "peer": true, + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -8455,6 +10952,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "license": "MIT" + }, "node_modules/is-callable": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", @@ -8505,6 +11008,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-error": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.2.tgz", + "integrity": "sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==", + "license": "MIT" + }, "node_modules/is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -9608,6 +12117,14 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jpeg-exif": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/jpeg-exif/-/jpeg-exif-1.1.4.tgz", + "integrity": "sha512-a+bKEcCjtuW5WTdgeXFzswSrdqi0jk4XlEtZlx5A94wCoBpFjfFTbo/Tra5SpNCl/YFZPvcV1dJc+TAYeg6ROQ==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "license": "MIT", + "peer": true + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -9705,6 +12222,15 @@ "node": ">=12" } }, + "node_modules/jsep": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", + "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==", + "license": "MIT", + "engines": { + "node": ">= 10.16.0" + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -9762,6 +12288,18 @@ "node": ">=4.0" } }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, "node_modules/kdbush": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz", @@ -9793,6 +12331,12 @@ "node": ">= 8" } }, + "node_modules/ktx-parse": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ktx-parse/-/ktx-parse-0.7.1.tgz", + "integrity": "sha512-FeA3g56ksdFNwjXJJsc1CCc7co+AJYDp6ipIp878zZ2bU8kWROatLYf39TQEd4/XRSUvBXovQ8gaVKWPXsCLEQ==", + "license": "MIT" + }, "node_modules/language-subtag-registry": { "version": "0.3.21", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", @@ -9836,11 +12380,54 @@ "node": ">= 0.8.0" } }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, + "node_modules/lit": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.2.tgz", + "integrity": "sha512-NF9zbsP79l4ao2SNrH3NkfmFgN/hBYSQo90saIVI1o5GpjAdCPVstVzO1MrLOakHoEhYkrtRjPK6Ob521aoYWQ==", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@lit/reactive-element": "^2.1.0", + "lit-element": "^4.2.0", + "lit-html": "^3.3.0" + } + }, + "node_modules/lit-element": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.2.2.tgz", + "integrity": "sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.5.0", + "@lit/reactive-element": "^2.1.0", + "lit-html": "^3.3.0" + } + }, + "node_modules/lit-html": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.2.tgz", + "integrity": "sha512-Qy9hU88zcmaxBXcc10ZpdK7cOLXvXpRoBxERdtqV9QOrfpMZZ6pSYP91LhpPtap3sFMUiL7Tw2RImbe0Al2/kw==", + "license": "BSD-3-Clause", + "peer": true, + "dependencies": { + "@types/trusted-types": "^2.0.2" + } + }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -9895,6 +12482,15 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, + "node_modules/long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.6" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -9906,6 +12502,16 @@ "loose-envify": "cli.js" } }, + "node_modules/luxon": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", + "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + } + }, "node_modules/lz-string": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", @@ -9915,6 +12521,19 @@ "lz-string": "bin/bin.js" } }, + "node_modules/lz4js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/lz4js/-/lz4js-0.2.0.tgz", + "integrity": "sha512-gY2Ia9Lm7Ep8qMiuGRhvUq0Q7qUereeldZPP1PMEJxPtEWHJLqw9pgX68oHajBH0nzJK4MaZEA/YNV3jT8u8Bg==", + "license": "ISC", + "optional": true + }, + "node_modules/lzo-wasm": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/lzo-wasm/-/lzo-wasm-0.0.4.tgz", + "integrity": "sha512-VKlnoJRFrB8SdJhlVKvW5vI1gGwcZ+mvChEXcSX6r2xDNc/Q2FD9esfBmGCuPZdrJ1feO+YcVFd2PTk0c137Gw==", + "license": "BSD-2-Clause" + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -10005,6 +12624,26 @@ "integrity": "sha512-XdjUArbK4Bm5fLLvlm5KpTFOiOThgfWWI4axAZDWg4E/0mKdZyI9tNEfds27qCi1ze/vwTR16kvmmGhRra3c2g==", "license": "ISC" }, + "node_modules/marked": { + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.3.0.tgz", + "integrity": "sha512-K3UxuKu6l6bmA5FUwYho8CfJBlsUWAooKtdGgMcERSpF7gcBUrCGsLH7wDaaNOzwq18JzSUDyoEb/YsrqMac3w==", + "license": "MIT", + "peer": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 20" + } + }, + "node_modules/markerjs2": { + "version": "2.32.7", + "resolved": "https://registry.npmjs.org/markerjs2/-/markerjs2-2.32.7.tgz", + "integrity": "sha512-HeFRZjmc43DOG3lSQp92z49cq2oCYpYn2pX++SkJAW1Dij4xJtRquVRf+cXeSZQWDX3ufns1Ry/bGk+zveP7rA==", + "license": "SEE LICENSE IN LICENSE", + "peer": true + }, "node_modules/math-expression-evaluator": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.4.0.tgz", @@ -10019,6 +12658,17 @@ "node": ">= 0.4" } }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "license": "BSD-3-Clause", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -10321,6 +12971,33 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/mjolnir.js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mjolnir.js/-/mjolnir.js-3.0.0.tgz", + "integrity": "sha512-siX3YCG7N2HnmN1xMH3cK4JkUZJhbkhRFJL+G5N1vH0mh1t5088rJknIoqDFWDIU6NPGvRRgLnYW3ZHjSMEBLA==", + "license": "MIT" + }, + "node_modules/moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.48.tgz", + "integrity": "sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==", + "license": "MIT", + "dependencies": { + "moment": "^2.29.4" + }, + "engines": { + "node": "*" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -10545,6 +13222,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -10765,6 +13459,12 @@ "node": ">=6" } }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "license": "(MIT AND Zlib)" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -10862,6 +13562,39 @@ "pbf": "bin/pbf" } }, + "node_modules/pdfmake": { + "version": "0.2.22", + "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.2.22.tgz", + "integrity": "sha512-nY0tvBlBCAfefFzXkWGHzW7OQeWKsGKL8M1I8o+fFhLBDtYesSA2G/KxfOF8jn+l53kzCLSTAdmTyPV2EM/v9g==", + "license": "MIT", + "peer": true, + "dependencies": { + "@foliojs-fork/linebreak": "^1.1.2", + "@foliojs-fork/pdfkit": "^0.15.3", + "iconv-lite": "^0.7.1", + "xmldoc": "^2.0.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/pdfmake/node_modules/iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "license": "MIT", + "peer": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -10915,6 +13648,29 @@ "fflate": "^0.8.0" } }, + "node_modules/png-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz", + "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g==", + "peer": true + }, + "node_modules/polylabel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/polylabel/-/polylabel-1.1.0.tgz", + "integrity": "sha512-bxaGcA40sL3d6M4hH72Z4NdLqxpXRsCFk8AITYg6x1rn1Ei3izf00UMLklerBZTO49aPA3CYrIwVulx2Bce2pA==", + "license": "ISC", + "peer": true, + "dependencies": { + "tinyqueue": "^2.0.3" + } + }, + "node_modules/polylabel/node_modules/tinyqueue": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", + "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==", + "license": "ISC", + "peer": true + }, "node_modules/postcss": { "version": "8.4.38", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", @@ -11020,6 +13776,16 @@ "integrity": "sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw==", "license": "ISC" }, + "node_modules/preact": { + "version": "10.28.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.2.tgz", + "integrity": "sha512-lbteaWGzGHdlIuiJ0l2Jq454m6kcpI1zNje6d8MlGAFlYvP2GO4ibnat7P74Esfz4sPTdM6UxtTwh/d3pwM9JA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -11180,6 +13946,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/quadbin": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/quadbin/-/quadbin-0.4.2.tgz", + "integrity": "sha512-1NFzjFVM23Um51/ttD6lFDqGtUHNS5Ky1slZHk3YPwMbC+7Jl3ULLb4QvDo6+Nerv8b8SgUV+ysOhziUh4B5cQ==", + "license": "MIT", + "dependencies": { + "@math.gl/web-mercator": "^4.1.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -11948,6 +14726,16 @@ } } }, + "node_modules/sax": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz", + "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", + "license": "BlueOak-1.0.0", + "peer": true, + "engines": { + "node": ">=11.0.0" + } + }, "node_modules/saxes": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", @@ -11986,6 +14774,13 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/seedrandom": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", + "license": "MIT", + "peer": true + }, "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -12192,6 +14987,12 @@ "node": ">=0.10.0" } }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "license": "MIT" + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -12333,6 +15134,12 @@ "node": ">=8" } }, + "node_modules/snappyjs": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/snappyjs/-/snappyjs-0.6.1.tgz", + "integrity": "sha512-YIK6I2lsH072UE0aOFxxY1dPDCS43I5ktqHpeAsuLNYWkE5pGxRGWfDM4/vSUfNzXjC1Ivzt3qx31PCLmc9yqg==", + "license": "MIT" + }, "node_modules/sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -12343,6 +15150,13 @@ "websocket-driver": "^0.7.4" } }, + "node_modules/sortablejs": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.6.tgz", + "integrity": "sha512-aNfiuwMEpfBM/CN6LY0ibyhxPfPbyFeBTYJKCvzkJ2GkUpazIt3H+QIPAMHwqQ7tMKaHz1Qj+rJJCqljnf4p3A==", + "license": "MIT", + "peer": true + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -12461,8 +15275,7 @@ "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "node_modules/stack-utils": { "version": "2.0.5", @@ -12635,6 +15448,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strnum": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", + "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, "node_modules/style-loader": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", @@ -12650,6 +15475,23 @@ "webpack": "^5.0.0" } }, + "node_modules/style-observer": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/style-observer/-/style-observer-0.0.8.tgz", + "integrity": "sha512-UaIPn33Sx4BJ+goia51Q++VFWoplWK1995VdxQYzwwbFa+FUNLKlG+aiIdG2Vw7VyzIUBi8tqu8mTyg0Ppu6Yg==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/LeaVerou" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/leaverou" + } + ], + "license": "MIT", + "peer": true + }, "node_modules/styled-components": { "version": "5.3.5", "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.5.tgz", @@ -12750,12 +15592,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/svg-arc-to-cubic-bezier": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz", + "integrity": "sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==", + "license": "ISC", + "peer": true + }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, + "node_modules/tabbable": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", + "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", + "license": "MIT", + "peer": true + }, "node_modules/table-layout": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-4.1.1.tgz", @@ -12964,6 +15820,28 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" }, + "node_modules/texture-compressor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/texture-compressor/-/texture-compressor-1.0.2.tgz", + "integrity": "sha512-dStVgoaQ11mA5htJ+RzZ51ZxIZqNOgWKAIvtjLrW1AliQQLCmrDqNzQZ8Jh91YealQ95DXt4MEduLzJmbs6lig==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.10", + "image-size": "^0.7.4" + }, + "bin": { + "texture-compressor": "bin/texture-compressor.js" + } + }, + "node_modules/texture-compressor/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, "node_modules/throat": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", @@ -12975,6 +15853,23 @@ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, + "node_modules/timezone-groups": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/timezone-groups/-/timezone-groups-0.10.4.tgz", + "integrity": "sha512-AnkJYrbb7uPkDCEqGeVJiawZNiwVlSkkeX4jZg1gTEguClhyX+/Ezn07KB6DT29tG3UN418ldmS/W6KqGOTDjg==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "license": "MIT", + "peer": true + }, "node_modules/tinyqueue": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", @@ -13230,6 +16125,17 @@ "node": ">=4" } }, + "node_modules/unicode-properties": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", + "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", + "license": "MIT", + "peer": true, + "dependencies": { + "base64-js": "^1.3.0", + "unicode-trie": "^2.0.0" + } + }, "node_modules/unicode-property-aliases-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", @@ -13238,6 +16144,24 @@ "node": ">=4" } }, + "node_modules/unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + } + }, + "node_modules/unicode-trie/node_modules/pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "license": "MIT", + "peer": true + }, "node_modules/union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -13880,6 +16804,12 @@ "node": ">=0.8.0" } }, + "node_modules/wgsl_reflect": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/wgsl_reflect/-/wgsl_reflect-1.2.3.tgz", + "integrity": "sha512-BQWBIsOn411M+ffBxmA6QRLvAOVbuz3Uk4NusxnqC1H7aeQcVLhdA3k2k/EFFFtqVjhz3z7JOOZF1a9hj2tv4Q==", + "license": "MIT" + }, "node_modules/whatwg-encoding": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", @@ -14056,6 +16986,43 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, + "node_modules/xmldoc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-2.0.3.tgz", + "integrity": "sha512-6gRk4NY/Jvg67xn7OzJuxLRsGgiXBaPUQplVJ/9l99uIugxh4FTOewYz5ic8WScj7Xx/2WvhENiQKwkK9RpE4w==", + "license": "MIT", + "peer": true, + "dependencies": { + "sax": "^1.4.3" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/xss": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.13.tgz", + "integrity": "sha512-clu7dxTm1e8Mo5fz3n/oW3UCXBfV89xZ72jM8yzo1vR/pIS0w3sgB3XV2H8Vm6zfGnHL0FzvLJPJEBhd86/z4Q==", + "license": "MIT", + "peer": true, + "dependencies": { + "commander": "^2.20.3", + "cssfilter": "0.0.10" + }, + "bin": { + "xss": "bin/xss" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/xss/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT", + "peer": true + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -14112,6 +17079,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/zstd-codec": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/zstd-codec/-/zstd-codec-0.1.5.tgz", + "integrity": "sha512-v3fyjpK8S/dpY/X5WxqTK3IoCnp/ZOLxn144GZVlNUjtwAchzrVo03h+oMATFhCIiJ5KTr4V3vDQQYz4RU684g==", + "license": "MIT", + "optional": true + }, "node_modules/zustand": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.8.tgz", @@ -14143,6 +17117,71 @@ } }, "dependencies": { + "@amcharts/amcharts5": { + "version": "5.14.4", + "resolved": "https://registry.npmjs.org/@amcharts/amcharts5/-/amcharts5-5.14.4.tgz", + "integrity": "sha512-Tl7wQLWvsvyWVtlCIm1yhZtJviSDYjuNTnlUkO0D49GyByoK0nb9fr0DK4rUw4DVgyLcySxWBsb2lzTJm5Rd9Q==", + "peer": true, + "requires": { + "@types/d3": "^7.0.0", + "@types/d3-chord": "^3.0.0", + "@types/d3-hierarchy": "3.1.1", + "@types/d3-sankey": "^0.11.1", + "@types/d3-shape": "^3.0.0", + "@types/geojson": "^7946.0.8", + "@types/polylabel": "^1.0.5", + "@types/svg-arc-to-cubic-bezier": "^3.2.0", + "d3": "^7.0.0", + "d3-chord": "^3.0.0", + "d3-force": "^3.0.0", + "d3-geo": "^3.0.0", + "d3-hierarchy": "^3.0.0", + "d3-sankey": "^0.12.3", + "d3-selection": "^3.0.0", + "d3-shape": "^3.0.0", + "d3-transition": "^3.0.0", + "d3-voronoi-treemap": "^1.1.2", + "flatpickr": "^4.6.13", + "markerjs2": "^2.29.4", + "pdfmake": "^0.2.2", + "polylabel": "^1.1.0", + "seedrandom": "^3.0.5", + "svg-arc-to-cubic-bezier": "^3.2.0", + "tslib": "^2.2.0" + }, + "dependencies": { + "@types/d3-shape": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.7.tgz", + "integrity": "sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==", + "peer": true, + "requires": { + "@types/d3-path": "*" + } + }, + "d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "peer": true + }, + "d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "peer": true, + "requires": { + "d3-path": "^3.1.0" + } + }, + "tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "peer": true + } + } + }, "@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", @@ -14152,6 +17191,67 @@ "@jridgewell/trace-mapping": "^0.3.9" } }, + "@arcgis/core": { + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@arcgis/core/-/core-4.34.8.tgz", + "integrity": "sha512-UrEBTjXpSA9fhmmnAENBzz9GG81xALTezQFMXUs2iMB+tiOckmJyBbhATI/W4lIQyUfNEK7Zm/46EP2PhDga/A==", + "peer": true, + "requires": { + "@amcharts/amcharts5": "~5.14.1", + "@arcgis/toolkit": "^4.34.0", + "@esri/arcgis-html-sanitizer": "~4.1.0", + "@esri/calcite-components": "^3.3.2", + "@vaadin/grid": "~24.9.1", + "@zip.js/zip.js": "~2.8.7", + "luxon": "~3.7.2", + "marked": "~16.3.0", + "tslib": "^2.8.1" + }, + "dependencies": { + "tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "peer": true + } + } + }, + "@arcgis/lumina": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@arcgis/lumina/-/lumina-4.34.9.tgz", + "integrity": "sha512-efqO+SwR+1IYf29AATh1l2FUeypRyRINTBNkaJY+KkaFe+8gqSJ45qOmputhyzF5WTRDb7WhOYgnChjp6VYPpA==", + "peer": true, + "requires": { + "@arcgis/toolkit": "~4.34.9", + "csstype": "^3.1.3", + "tslib": "^2.8.1" + }, + "dependencies": { + "tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "peer": true + } + } + }, + "@arcgis/toolkit": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@arcgis/toolkit/-/toolkit-4.34.9.tgz", + "integrity": "sha512-wFST+eVnCwmg9NyICVyn9bsBnR+TlWklsGqG3L7xqSTgfXo6TuCThE7wtTb8xWxsTBkGvImqMUgpgLuwQuTQ1g==", + "peer": true, + "requires": { + "tslib": "^2.8.1" + }, + "dependencies": { + "tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "peer": true + } + } + }, "@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -15326,20 +18426,250 @@ "globals": "^11.1.0" } }, - "@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "requires": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@carto/api-client": { + "version": "0.5.23", + "resolved": "https://registry.npmjs.org/@carto/api-client/-/api-client-0.5.23.tgz", + "integrity": "sha512-LexUjRLO7MzFerbXznH7b7udLSOSitDF1KO2uzeMkNUeLN3sCt4s34GS0C+eAwao56wmxWvqHegUPDf1b0+zVQ==", + "requires": { + "@loaders.gl/schema": "^4.3.3", + "@types/geojson": "^7946.0.16", + "d3-format": "^3.1.0", + "d3-scale": "^4.0.2", + "h3-js": "^4.1.0", + "jsep": "^1.4.0", + "quadbin": "^0.4.1-alpha.0" + } + }, + "@deck.gl/aggregation-layers": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@deck.gl/aggregation-layers/-/aggregation-layers-9.2.5.tgz", + "integrity": "sha512-WHb3W2IhpdppHA7YAco/s6VL3hH1S+TCIMB9S+KtGGfC557eBGycuJvqJEEPeuRz9vVNchEevwuY+0SXL+4dOw==", + "requires": { + "@luma.gl/constants": "^9.2.4", + "@luma.gl/shadertools": "^9.2.4", + "@math.gl/core": "^4.1.0", + "@math.gl/web-mercator": "^4.1.0", + "d3-hexbin": "^0.2.1" + } + }, + "@deck.gl/arcgis": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@deck.gl/arcgis/-/arcgis-9.2.5.tgz", + "integrity": "sha512-smIwk+V342gQZrt95aqYpgIx+kpNaW2aCYAnVDuHyZAVKV1s9+fD9sLtGKAM4VSq1WeZzrHo/oZjArf8QoiLZg==", + "requires": { + "@luma.gl/constants": "^9.2.4", + "esri-loader": "^3.7.0" + } + }, + "@deck.gl/carto": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@deck.gl/carto/-/carto-9.2.5.tgz", + "integrity": "sha512-urP6HSP762GYx87rEYEF+0gvSKlKV11jqWzhjaw3R396KDy6qHk4V2or2XlTUjvBGYoMO+07PX926prsfdLogg==", + "requires": { + "@carto/api-client": "^0.5.19", + "@loaders.gl/compression": "^4.2.0", + "@loaders.gl/gis": "^4.2.0", + "@loaders.gl/loader-utils": "^4.2.0", + "@loaders.gl/mvt": "^4.2.0", + "@loaders.gl/schema": "^4.2.0", + "@loaders.gl/tiles": "^4.2.0", + "@luma.gl/core": "^9.2.4", + "@luma.gl/shadertools": "^9.2.4", + "@math.gl/web-mercator": "^4.1.0", + "@types/d3-array": "^3.0.2", + "@types/d3-color": "^1.4.2", + "@types/d3-scale": "^3.0.0", + "cartocolor": "^5.0.2", + "d3-array": "^3.2.0", + "d3-color": "^3.1.0", + "d3-format": "^3.1.0", + "d3-scale": "^4.0.0", + "earcut": "^2.2.4", + "h3-js": "^4.1.0", + "moment-timezone": "^0.5.33", + "pbf": "^3.2.1", + "quadbin": "^0.4.0" + }, + "dependencies": { + "@types/d3-color": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-1.4.5.tgz", + "integrity": "sha512-5sNP3DmtSnSozxcjqmzQKsDOuVJXZkceo1KJScDc1982kk/TS9mTPc6lpli1gTu1MIBF1YWutpHpjucNWcIj5g==" + }, + "@types/d3-scale": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-3.3.5.tgz", + "integrity": "sha512-YOpKj0kIEusRf7ofeJcSZQsvKbnTwpe1DUF+P2qsotqG53kEsjm7EzzliqQxMkAWdkZcHrg5rRhB4JiDOQPX+A==", + "requires": { + "@types/d3-time": "^2" + } + }, + "@types/d3-time": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-2.1.4.tgz", + "integrity": "sha512-BTfLsxTeo7yFxI/haOOf1ZwJ6xKgQLT9dCp+EcmQv87Gox6X+oKl4mLKfO6fnWm3P22+A6DknMNEZany8ql2Rw==" + }, + "earcut": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", + "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" + } + } + }, + "@deck.gl/core": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@deck.gl/core/-/core-9.2.5.tgz", + "integrity": "sha512-/PGNX4Wd7rEahYi6ivC4WExJ3U6Hqgl42R83guNzTL6gM2+02PUQRoQG9QdFagj5d6kWYVN0LVJME2a5WQmzOg==", + "requires": { + "@loaders.gl/core": "^4.2.0", + "@loaders.gl/images": "^4.2.0", + "@luma.gl/constants": "^9.2.4", + "@luma.gl/core": "^9.2.4", + "@luma.gl/engine": "^9.2.4", + "@luma.gl/shadertools": "^9.2.4", + "@luma.gl/webgl": "^9.2.4", + "@math.gl/core": "^4.1.0", + "@math.gl/sun": "^4.1.0", + "@math.gl/types": "^4.1.0", + "@math.gl/web-mercator": "^4.1.0", + "@probe.gl/env": "^4.1.0", + "@probe.gl/log": "^4.1.0", + "@probe.gl/stats": "^4.1.0", + "@types/offscreencanvas": "^2019.6.4", + "gl-matrix": "^3.0.0", + "mjolnir.js": "^3.0.0" + } + }, + "@deck.gl/extensions": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@deck.gl/extensions/-/extensions-9.2.5.tgz", + "integrity": "sha512-GJRPmG+GD1tdblpplQlb4jlNywRb8aQYPEowPLKxglXSGRzgpOrqJYI1PcJhCowdL7/S8bCY1ay8nkXE3gRsgw==", + "requires": { + "@luma.gl/constants": "^9.2.4", + "@luma.gl/shadertools": "^9.2.4", + "@math.gl/core": "^4.1.0" + } + }, + "@deck.gl/geo-layers": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@deck.gl/geo-layers/-/geo-layers-9.2.5.tgz", + "integrity": "sha512-QVjLwHEAtNqRdjBuYJwztCAwSTmgWujPT0geGWaFhr7ZvyigAqi3l2ETys5YqjjJ87bKnUBwd6iOyw1xkXbsCw==", + "requires": { + "@loaders.gl/3d-tiles": "^4.2.0", + "@loaders.gl/gis": "^4.2.0", + "@loaders.gl/loader-utils": "^4.2.0", + "@loaders.gl/mvt": "^4.2.0", + "@loaders.gl/schema": "^4.2.0", + "@loaders.gl/terrain": "^4.2.0", + "@loaders.gl/tiles": "^4.2.0", + "@loaders.gl/wms": "^4.2.0", + "@luma.gl/gltf": "^9.2.4", + "@luma.gl/shadertools": "^9.2.4", + "@math.gl/core": "^4.1.0", + "@math.gl/culling": "^4.1.0", + "@math.gl/web-mercator": "^4.1.0", + "@types/geojson": "^7946.0.8", + "a5-js": "^0.5.0", + "h3-js": "^4.1.0", + "long": "^3.2.0" + } + }, + "@deck.gl/google-maps": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@deck.gl/google-maps/-/google-maps-9.2.5.tgz", + "integrity": "sha512-HnlTJZum9garvMrjNBf4MUTleuYVTDlS3Fk7VsB8vKApVx901o9apEZqfJtcdrfc7gPS7MoCFbT5lL5J7cxO7g==", + "requires": { + "@luma.gl/constants": "^9.2.4", + "@luma.gl/webgl": "^9.2.4", + "@math.gl/core": "^4.1.0", + "@types/google.maps": "^3.48.6" + } + }, + "@deck.gl/json": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@deck.gl/json/-/json-9.2.5.tgz", + "integrity": "sha512-DER3A31hM9+Qq9taIUOUYHKKJAv3ztnRV+WMY83+XjGg2bQWPqNu5cpBHZgtICTdAZur2Sn3COiVNCORy0s6ew==", + "requires": { + "jsep": "^0.3.0" + }, + "dependencies": { + "jsep": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/jsep/-/jsep-0.3.5.tgz", + "integrity": "sha512-AoRLBDc6JNnKjNcmonituEABS5bcfqDhQAWWXNTFrqu6nVXBpBAGfcoTGZMFlIrh9FjmE1CQyX9CTNwZrXMMDA==" + } + } + }, + "@deck.gl/layers": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@deck.gl/layers/-/layers-9.2.5.tgz", + "integrity": "sha512-a48zWxeHknSX67ZeIzWeLXuOVJkEnQjnLIC27Uv3zHjKlvaoraWPOgScUNyteB0UIIzhzE+D8lF+ViHeIdkNSA==", "requires": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@loaders.gl/images": "^4.2.0", + "@loaders.gl/schema": "^4.2.0", + "@luma.gl/shadertools": "^9.2.4", + "@mapbox/tiny-sdf": "^2.0.5", + "@math.gl/core": "^4.1.0", + "@math.gl/polygon": "^4.1.0", + "@math.gl/web-mercator": "^4.1.0", + "earcut": "^2.2.4" + }, + "dependencies": { + "earcut": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", + "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==" + } } }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true + "@deck.gl/mapbox": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@deck.gl/mapbox/-/mapbox-9.2.5.tgz", + "integrity": "sha512-VQPV/JMVNKjLbbfq+0CL7Fvf78x9k7zvXqnhMicT/clLWzHdc7r7yfadLVPaRwEGh0VpMKTUUOrdszUTkW95wA==", + "requires": { + "@luma.gl/constants": "^9.2.4", + "@math.gl/web-mercator": "^4.1.0" + } + }, + "@deck.gl/mesh-layers": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@deck.gl/mesh-layers/-/mesh-layers-9.2.5.tgz", + "integrity": "sha512-OJ7Nx6xhp7+bQ4S4asUUp7PdGwcfmQpQhe5SHDGy1UBZ0yZE+ojOo9uvVfXvGBnqq4Zpg9avV+WRN1/BffBsOw==", + "requires": { + "@loaders.gl/gltf": "^4.2.0", + "@loaders.gl/schema": "^4.2.0", + "@luma.gl/gltf": "^9.2.4", + "@luma.gl/shadertools": "^9.2.4" + } + }, + "@deck.gl/react": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@deck.gl/react/-/react-9.2.5.tgz", + "integrity": "sha512-pkb7kR1CppvRI5KTnMVTYNZx6f/L4OmuWpyACjRBlVjUlmSd9PddKF3LX1o8435yHDKACAfMYb8N2Fc3HRNMcA==", + "requires": {} + }, + "@deck.gl/widgets": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@deck.gl/widgets/-/widgets-9.2.5.tgz", + "integrity": "sha512-nzukGcyaVag6XRT8aP3A8Ul2bSdb/TyFmenbDNRhrYop0OdmDl9Bx0U9wZlVlY6vxpB3kssfBXAv+MTdRr2JfA==", + "requires": { + "preact": "^10.17.0" + } }, "@duckdb/duckdb-wasm": { "version": "1.30.0", @@ -15592,27 +18922,126 @@ } } }, + "@esri/arcgis-html-sanitizer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@esri/arcgis-html-sanitizer/-/arcgis-html-sanitizer-4.1.0.tgz", + "integrity": "sha512-einEveDJ/k1180NOp78PB/4Hje9eBy3dyOGLLtLn6bSkizpUfCwuYBIXOA7Y3F/k/BsTQXgKqUVwQ0eiscWMdA==", + "peer": true, + "requires": { + "xss": "1.0.13" + } + }, + "@esri/calcite-components": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@esri/calcite-components/-/calcite-components-3.3.3.tgz", + "integrity": "sha512-tw+EfJ3pb+Odj71W6E9GUkm8rMbNxfW1KeiI8GgsKDzhr39hMKwY+zYYFFYuO0FONxWGvAB+B8yqB0NvH7WeHw==", + "peer": true, + "requires": { + "@arcgis/lumina": ">=4.34.0-next.158 <4.35.0", + "@arcgis/toolkit": ">=4.34.0-next.158 <4.35.0", + "@esri/calcite-ui-icons": "4.3.0", + "@floating-ui/dom": "^1.6.12", + "@floating-ui/utils": "^0.2.8", + "@types/sortablejs": "^1.15.8", + "color": "^5.0.0", + "composed-offset-position": "^0.0.6", + "es-toolkit": "^1.39.8", + "focus-trap": "^7.6.5", + "interactjs": "^1.10.27", + "lit": "^3.3.0", + "sortablejs": "^1.15.6", + "timezone-groups": "^0.10.4", + "type-fest": "^4.30.1" + }, + "dependencies": { + "type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "peer": true + } + } + }, + "@esri/calcite-ui-icons": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@esri/calcite-ui-icons/-/calcite-ui-icons-4.3.0.tgz", + "integrity": "sha512-iOOuRurpjFxFVw6+aXW2JpSkRBrdOpBcbdibfPOmSPqMd1aoHBtYmYXetKoH9vfrXoBiPyO2PkDnczhsu/N9IA==", + "peer": true + }, "@floating-ui/core": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", - "integrity": "sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", + "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", "requires": { - "@floating-ui/utils": "^0.2.1" + "@floating-ui/utils": "^0.2.10" } }, "@floating-ui/dom": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.3.tgz", - "integrity": "sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", + "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", "requires": { - "@floating-ui/core": "^1.0.0", - "@floating-ui/utils": "^0.2.0" + "@floating-ui/core": "^1.7.3", + "@floating-ui/utils": "^0.2.10" } }, "@floating-ui/utils": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz", - "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==" + }, + "@foliojs-fork/fontkit": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@foliojs-fork/fontkit/-/fontkit-1.9.2.tgz", + "integrity": "sha512-IfB5EiIb+GZk+77TRB86AHroVaqfq8JRFlUbz0WEwsInyCG0epX2tCPOy+UfaWPju30DeVoUAXfzWXmhn753KA==", + "peer": true, + "requires": { + "@foliojs-fork/restructure": "^2.0.2", + "brotli": "^1.2.0", + "clone": "^1.0.4", + "deep-equal": "^1.0.0", + "dfa": "^1.2.0", + "tiny-inflate": "^1.0.2", + "unicode-properties": "^1.2.2", + "unicode-trie": "^2.0.0" + } + }, + "@foliojs-fork/linebreak": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@foliojs-fork/linebreak/-/linebreak-1.1.2.tgz", + "integrity": "sha512-ZPohpxxbuKNE0l/5iBJnOAfUaMACwvUIKCvqtWGKIMv1lPYoNjYXRfhi9FeeV9McBkBLxsMFWTVVhHJA8cyzvg==", + "peer": true, + "requires": { + "base64-js": "1.3.1", + "unicode-trie": "^2.0.0" + }, + "dependencies": { + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "peer": true + } + } + }, + "@foliojs-fork/pdfkit": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/@foliojs-fork/pdfkit/-/pdfkit-0.15.3.tgz", + "integrity": "sha512-Obc0Wmy3bm7BINFVvPhcl2rnSSK61DQrlHU8aXnAqDk9LCjWdUOPwhgD8Ywz5VtuFjRxmVOM/kQ/XLIBjDvltw==", + "peer": true, + "requires": { + "@foliojs-fork/fontkit": "^1.9.2", + "@foliojs-fork/linebreak": "^1.1.1", + "crypto-js": "^4.2.0", + "jpeg-exif": "^1.1.4", + "png-js": "^1.0.0" + } + }, + "@foliojs-fork/restructure": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@foliojs-fork/restructure/-/restructure-2.0.2.tgz", + "integrity": "sha512-59SgoZ3EXbkfSX7b63tsou/SDGzwUEK6MuB5sKqgVK1/XE0fxmpsOb9DQI8LXW3KfGnAjImCGhhEb7uPPAUVNA==", + "peer": true }, "@humanwhocodes/config-array": { "version": "0.9.5", @@ -15693,6 +19122,12 @@ "dev": true, "requires": {} }, + "@interactjs/types": { + "version": "1.10.27", + "resolved": "https://registry.npmjs.org/@interactjs/types/-/types-1.10.27.tgz", + "integrity": "sha512-BUdv0cvs4H5ODuwft2Xp4eL8Vmi3LcihK42z0Ft/FbVJZoRioBsxH+LlsBdK4tAie7PqlKGy+1oyOncu1nQ6eA==", + "peer": true + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -16023,6 +19458,321 @@ "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" }, + "@lit-labs/ssr-dom-shim": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.5.1.tgz", + "integrity": "sha512-Aou5UdlSpr5whQe8AA/bZG0jMj96CoJIWbGfZ91qieWu5AWUMKw8VR/pAkQkJYvBNhmCcWnZlyyk5oze8JIqYA==", + "peer": true + }, + "@lit/reactive-element": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-2.1.2.tgz", + "integrity": "sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==", + "peer": true, + "requires": { + "@lit-labs/ssr-dom-shim": "^1.5.0" + } + }, + "@loaders.gl/3d-tiles": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/3d-tiles/-/3d-tiles-4.3.4.tgz", + "integrity": "sha512-JQ3y3p/KlZP7lfobwON5t7H9WinXEYTvuo3SRQM8TBKhM+koEYZhvI2GwzoXx54MbBbY+s3fm1dq5UAAmaTsZw==", + "requires": { + "@loaders.gl/compression": "4.3.4", + "@loaders.gl/crypto": "4.3.4", + "@loaders.gl/draco": "4.3.4", + "@loaders.gl/gltf": "4.3.4", + "@loaders.gl/images": "4.3.4", + "@loaders.gl/loader-utils": "4.3.4", + "@loaders.gl/math": "4.3.4", + "@loaders.gl/tiles": "4.3.4", + "@loaders.gl/zip": "4.3.4", + "@math.gl/core": "^4.1.0", + "@math.gl/culling": "^4.1.0", + "@math.gl/geospatial": "^4.1.0", + "@probe.gl/log": "^4.0.4", + "long": "^5.2.1" + }, + "dependencies": { + "long": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", + "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==" + } + } + }, + "@loaders.gl/compression": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/compression/-/compression-4.3.4.tgz", + "integrity": "sha512-+o+5JqL9Sx8UCwdc2MTtjQiUHYQGJALHbYY/3CT+b9g/Emzwzez2Ggk9U9waRfdHiBCzEgRBivpWZEOAtkimXQ==", + "requires": { + "@loaders.gl/loader-utils": "4.3.4", + "@loaders.gl/worker-utils": "4.3.4", + "@types/brotli": "^1.3.0", + "@types/pako": "^1.0.1", + "brotli": "^1.3.2", + "fflate": "0.7.4", + "lz4js": "^0.2.0", + "lzo-wasm": "^0.0.4", + "pako": "1.0.11", + "snappyjs": "^0.6.1", + "zstd-codec": "^0.1" + }, + "dependencies": { + "fflate": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.7.4.tgz", + "integrity": "sha512-5u2V/CDW15QM1XbbgS+0DfPxVB+jUKhWEKuuFuHncbk3tEEqzmoXL+2KyOFuKGqOnmdIy0/davWF1CkuwtibCw==" + } + } + }, + "@loaders.gl/core": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/core/-/core-4.3.4.tgz", + "integrity": "sha512-cG0C5fMZ1jyW6WCsf4LoHGvaIAJCEVA/ioqKoYRwoSfXkOf+17KupK1OUQyUCw5XoRn+oWA1FulJQOYlXnb9Gw==", + "requires": { + "@loaders.gl/loader-utils": "4.3.4", + "@loaders.gl/schema": "4.3.4", + "@loaders.gl/worker-utils": "4.3.4", + "@probe.gl/log": "^4.0.2" + } + }, + "@loaders.gl/crypto": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/crypto/-/crypto-4.3.4.tgz", + "integrity": "sha512-3VS5FgB44nLOlAB9Q82VOQnT1IltwfRa1miE0mpHCe1prYu1M/dMnEyynusbrsp+eDs3EKbxpguIS9HUsFu5dQ==", + "requires": { + "@loaders.gl/loader-utils": "4.3.4", + "@loaders.gl/worker-utils": "4.3.4", + "@types/crypto-js": "^4.0.2" + } + }, + "@loaders.gl/draco": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/draco/-/draco-4.3.4.tgz", + "integrity": "sha512-4Lx0rKmYENGspvcgV5XDpFD9o+NamXoazSSl9Oa3pjVVjo+HJuzCgrxTQYD/3JvRrolW/QRehZeWD/L/cEC6mw==", + "requires": { + "@loaders.gl/loader-utils": "4.3.4", + "@loaders.gl/schema": "4.3.4", + "@loaders.gl/worker-utils": "4.3.4", + "draco3d": "1.5.7" + } + }, + "@loaders.gl/gis": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/gis/-/gis-4.3.4.tgz", + "integrity": "sha512-8xub38lSWW7+ZXWuUcggk7agRHJUy6RdipLNKZ90eE0ZzLNGDstGD1qiBwkvqH0AkG+uz4B7Kkiptyl7w2Oa6g==", + "requires": { + "@loaders.gl/loader-utils": "4.3.4", + "@loaders.gl/schema": "4.3.4", + "@mapbox/vector-tile": "^1.3.1", + "@math.gl/polygon": "^4.1.0", + "pbf": "^3.2.1" + } + }, + "@loaders.gl/gltf": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/gltf/-/gltf-4.3.4.tgz", + "integrity": "sha512-EiUTiLGMfukLd9W98wMpKmw+hVRhQ0dJ37wdlXK98XPeGGB+zTQxCcQY+/BaMhsSpYt/OOJleHhTfwNr8RgzRg==", + "requires": { + "@loaders.gl/draco": "4.3.4", + "@loaders.gl/images": "4.3.4", + "@loaders.gl/loader-utils": "4.3.4", + "@loaders.gl/schema": "4.3.4", + "@loaders.gl/textures": "4.3.4", + "@math.gl/core": "^4.1.0" + } + }, + "@loaders.gl/images": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/images/-/images-4.3.4.tgz", + "integrity": "sha512-qgc33BaNsqN9cWa/xvcGvQ50wGDONgQQdzHCKDDKhV2w/uptZoR5iofJfuG8UUV2vUMMd82Uk9zbopRx2rS4Ag==", + "requires": { + "@loaders.gl/loader-utils": "4.3.4" + } + }, + "@loaders.gl/loader-utils": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/loader-utils/-/loader-utils-4.3.4.tgz", + "integrity": "sha512-tjMZvlKQSaMl2qmYTAxg+ySR6zd6hQn5n3XaU8+Ehp90TD3WzxvDKOMNDqOa72fFmIV+KgPhcmIJTpq4lAdC4Q==", + "requires": { + "@loaders.gl/schema": "4.3.4", + "@loaders.gl/worker-utils": "4.3.4", + "@probe.gl/log": "^4.0.2", + "@probe.gl/stats": "^4.0.2" + } + }, + "@loaders.gl/math": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/math/-/math-4.3.4.tgz", + "integrity": "sha512-UJrlHys1fp9EUO4UMnqTCqvKvUjJVCbYZ2qAKD7tdGzHJYT8w/nsP7f/ZOYFc//JlfC3nq+5ogvmdpq2pyu3TA==", + "requires": { + "@loaders.gl/images": "4.3.4", + "@loaders.gl/loader-utils": "4.3.4", + "@math.gl/core": "^4.1.0" + } + }, + "@loaders.gl/mvt": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/mvt/-/mvt-4.3.4.tgz", + "integrity": "sha512-9DrJX8RQf14htNtxsPIYvTso5dUce9WaJCWCIY/79KYE80Be6dhcEYMknxBS4w3+PAuImaAe66S5xo9B7Erm5A==", + "requires": { + "@loaders.gl/gis": "4.3.4", + "@loaders.gl/images": "4.3.4", + "@loaders.gl/loader-utils": "4.3.4", + "@loaders.gl/schema": "4.3.4", + "@math.gl/polygon": "^4.1.0", + "@probe.gl/stats": "^4.0.0", + "pbf": "^3.2.1" + } + }, + "@loaders.gl/schema": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/schema/-/schema-4.3.4.tgz", + "integrity": "sha512-1YTYoatgzr/6JTxqBLwDiD3AVGwQZheYiQwAimWdRBVB0JAzych7s1yBuE0CVEzj4JDPKOzVAz8KnU1TiBvJGw==", + "requires": { + "@types/geojson": "^7946.0.7" + } + }, + "@loaders.gl/terrain": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/terrain/-/terrain-4.3.4.tgz", + "integrity": "sha512-JszbRJGnxL5Fh82uA2U8HgjlsIpzYoCNNjy3cFsgCaxi4/dvjz3BkLlBilR7JlbX8Ka+zlb4GAbDDChiXLMJ/g==", + "requires": { + "@loaders.gl/images": "4.3.4", + "@loaders.gl/loader-utils": "4.3.4", + "@loaders.gl/schema": "4.3.4", + "@mapbox/martini": "^0.2.0" + } + }, + "@loaders.gl/textures": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/textures/-/textures-4.3.4.tgz", + "integrity": "sha512-arWIDjlE7JaDS6v9by7juLfxPGGnjT9JjleaXx3wq/PTp+psLOpGUywHXm38BNECos3MFEQK3/GFShWI+/dWPw==", + "requires": { + "@loaders.gl/images": "4.3.4", + "@loaders.gl/loader-utils": "4.3.4", + "@loaders.gl/schema": "4.3.4", + "@loaders.gl/worker-utils": "4.3.4", + "@math.gl/types": "^4.1.0", + "ktx-parse": "^0.7.0", + "texture-compressor": "^1.0.2" + } + }, + "@loaders.gl/tiles": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/tiles/-/tiles-4.3.4.tgz", + "integrity": "sha512-oC0zJfyvGox6Ag9ABF8fxOkx9yEFVyzTa9ryHXl2BqLiQoR1v3p+0tIJcEbh5cnzHfoTZzUis1TEAZluPRsHBQ==", + "requires": { + "@loaders.gl/loader-utils": "4.3.4", + "@loaders.gl/math": "4.3.4", + "@math.gl/core": "^4.1.0", + "@math.gl/culling": "^4.1.0", + "@math.gl/geospatial": "^4.1.0", + "@math.gl/web-mercator": "^4.1.0", + "@probe.gl/stats": "^4.0.2" + } + }, + "@loaders.gl/wms": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/wms/-/wms-4.3.4.tgz", + "integrity": "sha512-yXF0wuYzJUdzAJQrhLIua6DnjOiBJusaY1j8gpvuH1VYs3mzvWlIRuZKeUd9mduQZKK88H2IzHZbj2RGOauq4w==", + "requires": { + "@loaders.gl/images": "4.3.4", + "@loaders.gl/loader-utils": "4.3.4", + "@loaders.gl/schema": "4.3.4", + "@loaders.gl/xml": "4.3.4", + "@turf/rewind": "^5.1.5", + "deep-strict-equal": "^0.2.0" + } + }, + "@loaders.gl/worker-utils": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/worker-utils/-/worker-utils-4.3.4.tgz", + "integrity": "sha512-EbsszrASgT85GH3B7jkx7YXfQyIYo/rlobwMx6V3ewETapPUwdSAInv+89flnk5n2eu2Lpdeh+2zS6PvqbL2RA==", + "requires": {} + }, + "@loaders.gl/xml": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/xml/-/xml-4.3.4.tgz", + "integrity": "sha512-p+y/KskajsvyM3a01BwUgjons/j/dUhniqd5y1p6keLOuwoHlY/TfTKd+XluqfyP14vFrdAHCZTnFCWLblN10w==", + "requires": { + "@loaders.gl/loader-utils": "4.3.4", + "@loaders.gl/schema": "4.3.4", + "fast-xml-parser": "^4.2.5" + } + }, + "@loaders.gl/zip": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@loaders.gl/zip/-/zip-4.3.4.tgz", + "integrity": "sha512-bHY4XdKYJm3vl9087GMoxnUqSURwTxPPh6DlAGOmz6X9Mp3JyWuA2gk3tQ1UIuInfjXKph3WAUfGe6XRIs1sfw==", + "requires": { + "@loaders.gl/compression": "4.3.4", + "@loaders.gl/crypto": "4.3.4", + "@loaders.gl/loader-utils": "4.3.4", + "jszip": "^3.1.5", + "md5": "^2.3.0" + } + }, + "@luma.gl/constants": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@luma.gl/constants/-/constants-9.2.5.tgz", + "integrity": "sha512-Z+DC7LIw+kPcIthGJdSoquIc92kkUlTOINMuJtssPsvOgFYtlsRn29h95K9y8ehjh234q2+73ExjfDQFE64f5Q==" + }, + "@luma.gl/core": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@luma.gl/core/-/core-9.2.5.tgz", + "integrity": "sha512-7tQ6wTTtQV6iWZxjMr+BDzS2o814EvaNW5efKtdzdvbbNyDWkDQZkyHkPvgGBB1o/+N2cbZS7GWyxOljCCH5uA==", + "requires": { + "@math.gl/types": "^4.1.0", + "@probe.gl/env": "^4.0.8", + "@probe.gl/log": "^4.0.8", + "@probe.gl/stats": "^4.0.8", + "@types/offscreencanvas": "^2019.6.4" + } + }, + "@luma.gl/engine": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@luma.gl/engine/-/engine-9.2.5.tgz", + "integrity": "sha512-swM+4VO+ab4DU58TB+cdSdby/MGLLWA9ez6BmaZ0HZwLN1HNdYwbQmT71Frtw+6lJpmBZHr78KOQi66Zx5+SOg==", + "requires": { + "@math.gl/core": "^4.1.0", + "@math.gl/types": "^4.1.0", + "@probe.gl/log": "^4.0.8", + "@probe.gl/stats": "^4.0.8" + } + }, + "@luma.gl/gltf": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@luma.gl/gltf/-/gltf-9.2.5.tgz", + "integrity": "sha512-hQFwtgKK4Vnd6t2bqlKVX+Z+Q5gCimq3V9LCiQmQ6An3t4KbbcXltBaBajSzkL9YEaozszSbcOUaFDXkav8CeQ==", + "requires": { + "@loaders.gl/core": "^4.2.0", + "@loaders.gl/gltf": "^4.2.0", + "@loaders.gl/textures": "^4.2.0", + "@math.gl/core": "^4.1.0" + } + }, + "@luma.gl/shadertools": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@luma.gl/shadertools/-/shadertools-9.2.5.tgz", + "integrity": "sha512-9upnT6r5exwotM1atc7Nwa7P69MKx+FavXWlabjk+nrRjeIJwzQ/3sXg9UfdDLavN/cDwGvnWz05UlbyABMmJg==", + "requires": { + "@math.gl/core": "^4.1.0", + "@math.gl/types": "^4.1.0", + "wgsl_reflect": "^1.2.0" + } + }, + "@luma.gl/webgl": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/@luma.gl/webgl/-/webgl-9.2.5.tgz", + "integrity": "sha512-FW5e+zxPuMI6gOJI6az5UnACrRwitzcghyUCVJBQq6/ZK/Z7bjBP5JQgd287DmFXrhLUrNBJ5NYRLmfbraGdDw==", + "requires": { + "@luma.gl/constants": "9.2.5", + "@math.gl/types": "^4.1.0", + "@probe.gl/env": "^4.0.8" + } + }, "@mapbox/geojson-rewind": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", @@ -16037,6 +19787,11 @@ "resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==" }, + "@mapbox/martini": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@mapbox/martini/-/martini-0.2.0.tgz", + "integrity": "sha512-7hFhtkb0KTLEls+TRw/rWayq5EeHtTaErgm/NskVoXmtgAQu/9D299aeyj6mzAR/6XUnYRp2lU+4IcrYRFjVsQ==" + }, "@mapbox/point-geometry": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", @@ -16086,6 +19841,58 @@ } } }, + "@math.gl/core": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@math.gl/core/-/core-4.1.0.tgz", + "integrity": "sha512-FrdHBCVG3QdrworwrUSzXIaK+/9OCRLscxI2OUy6sLOHyHgBMyfnEGs99/m3KNvs+95BsnQLWklVfpKfQzfwKA==", + "requires": { + "@math.gl/types": "4.1.0" + } + }, + "@math.gl/culling": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@math.gl/culling/-/culling-4.1.0.tgz", + "integrity": "sha512-jFmjFEACnP9kVl8qhZxFNhCyd47qPfSVmSvvjR0/dIL6R9oD5zhR1ub2gN16eKDO/UM7JF9OHKU3EBIfeR7gtg==", + "requires": { + "@math.gl/core": "4.1.0", + "@math.gl/types": "4.1.0" + } + }, + "@math.gl/geospatial": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@math.gl/geospatial/-/geospatial-4.1.0.tgz", + "integrity": "sha512-BzsUhpVvnmleyYF6qdqJIip6FtIzJmnWuPTGhlBuPzh7VBHLonCFSPtQpbkRuoyAlbSyaGXcVt6p6lm9eK2vtg==", + "requires": { + "@math.gl/core": "4.1.0", + "@math.gl/types": "4.1.0" + } + }, + "@math.gl/polygon": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@math.gl/polygon/-/polygon-4.1.0.tgz", + "integrity": "sha512-YA/9PzaCRHbIP5/0E9uTYrqe+jsYTQoqoDWhf6/b0Ixz8bPZBaGDEafLg3z7ffBomZLacUty9U3TlPjqMtzPjA==", + "requires": { + "@math.gl/core": "4.1.0" + } + }, + "@math.gl/sun": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@math.gl/sun/-/sun-4.1.0.tgz", + "integrity": "sha512-i3q6OCBLSZ5wgZVhXg+X7gsjY/TUtuFW/2KBiq/U1ypLso3S4sEykoU/MGjxUv1xiiGtr+v8TeMbO1OBIh/HmA==" + }, + "@math.gl/types": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@math.gl/types/-/types-4.1.0.tgz", + "integrity": "sha512-clYZdHcmRvMzVK5fjeDkQlHUzXQSNdZ7s4xOqC3nJPgz4C/TZkUecTo9YS4PruZqtDda/ag4erndP0MIn40dGA==" + }, + "@math.gl/web-mercator": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@math.gl/web-mercator/-/web-mercator-4.1.0.tgz", + "integrity": "sha512-HZo3vO5GCMkXJThxRJ5/QYUYRr3XumfT8CzNNCwoJfinxy5NtKUd7dusNTXn7yJ40UoB8FMIwkVwNlqaiRZZAw==", + "requires": { + "@math.gl/core": "4.1.0" + } + }, "@mswjs/interceptors": { "version": "0.40.0", "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.40.0.tgz", @@ -16145,11 +19952,44 @@ "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", "dev": true }, + "@open-wc/dedupe-mixin": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@open-wc/dedupe-mixin/-/dedupe-mixin-1.4.0.tgz", + "integrity": "sha512-Sj7gKl1TLcDbF7B6KUhtvr+1UCxdhMbNY5KxdU5IfMFWqL8oy1ZeAcCANjoB1TL0AJTcPmcCFsCbHf8X2jGDUA==", + "peer": true + }, + "@polymer/polymer": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@polymer/polymer/-/polymer-3.5.2.tgz", + "integrity": "sha512-fWwImY/UH4bb2534DVSaX+Azs2yKg8slkMBHOyGeU2kKx7Xmxp6Lee0jP8p6B3d7c1gFUPB2Z976dTUtX81pQA==", + "peer": true, + "requires": { + "@webcomponents/shadycss": "^1.9.1" + } + }, "@popperjs/core": { "version": "2.11.5", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.5.tgz", "integrity": "sha512-9X2obfABZuDVLCgPK9aX0a/x4jaOEweTTWE2+9sr0Qqqevj2Uv5XorvusThmc9XGYpS9yI+fhh8RTafBtGposw==" }, + "@probe.gl/env": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@probe.gl/env/-/env-4.1.0.tgz", + "integrity": "sha512-5ac2Jm2K72VCs4eSMsM7ykVRrV47w32xOGMvcgqn8vQdEMF9PRXyBGYEV9YbqRKWNKpNKmQJVi4AHM/fkCxs9w==" + }, + "@probe.gl/log": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@probe.gl/log/-/log-4.1.0.tgz", + "integrity": "sha512-r4gRReNY6f+OZEMgfWEXrAE2qJEt8rX0HsDJQXUBMoc+5H47bdB7f/5HBHAmapK8UydwPKL9wCDoS22rJ0yq7Q==", + "requires": { + "@probe.gl/env": "4.1.0" + } + }, + "@probe.gl/stats": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@probe.gl/stats/-/stats-4.1.0.tgz", + "integrity": "sha512-EI413MkWKBDVNIfLdqbeNSJTs7ToBz/KVGkwi3D+dQrSIkRI2IYbWGAU3xX+D6+CI4ls8ehxMhNpUVMaZggDvQ==" + }, "@react-aria/ssr": { "version": "3.9.7", "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.7.tgz", @@ -16337,6 +20177,56 @@ "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true }, + "@turf/boolean-clockwise": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/boolean-clockwise/-/boolean-clockwise-5.1.5.tgz", + "integrity": "sha512-FqbmEEOJ4rU4/2t7FKx0HUWmjFEVqR+NJrFP7ymGSjja2SQ7Q91nnBihGuT+yuHHl6ElMjQ3ttsB/eTmyCycxA==", + "requires": { + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5" + } + }, + "@turf/clone": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/clone/-/clone-5.1.5.tgz", + "integrity": "sha512-//pITsQ8xUdcQ9pVb4JqXiSqG4dos5Q9N4sYFoWghX21tfOV2dhc5TGqYOhnHrQS7RiKQL1vQ48kIK34gQ5oRg==", + "requires": { + "@turf/helpers": "^5.1.5" + } + }, + "@turf/helpers": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-5.1.5.tgz", + "integrity": "sha512-/lF+JR+qNDHZ8bF9d+Cp58nxtZWJ3sqFe6n3u3Vpj+/0cqkjk4nXKYBSY0azm+GIYB5mWKxUXvuP/m0ZnKj1bw==" + }, + "@turf/invariant": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-5.2.0.tgz", + "integrity": "sha512-28RCBGvCYsajVkw2EydpzLdcYyhSA77LovuOvgCJplJWaNVyJYH6BOR3HR9w50MEkPqb/Vc/jdo6I6ermlRtQA==", + "requires": { + "@turf/helpers": "^5.1.5" + } + }, + "@turf/meta": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-5.2.0.tgz", + "integrity": "sha512-ZjQ3Ii62X9FjnK4hhdsbT+64AYRpaI8XMBMcyftEOGSmPMUVnkbvuv3C9geuElAXfQU7Zk1oWGOcrGOD9zr78Q==", + "requires": { + "@turf/helpers": "^5.1.5" + } + }, + "@turf/rewind": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@turf/rewind/-/rewind-5.1.5.tgz", + "integrity": "sha512-Gdem7JXNu+G4hMllQHXRFRihJl3+pNl7qY+l4qhQFxq+hiU1cQoVFnyoleIqWKIrdK/i2YubaSwc3SCM7N5mMw==", + "requires": { + "@turf/boolean-clockwise": "^5.1.5", + "@turf/clone": "^5.1.5", + "@turf/helpers": "^5.1.5", + "@turf/invariant": "^5.1.5", + "@turf/meta": "^5.1.5" + } + }, "@types/aria-query": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", @@ -16401,6 +20291,14 @@ "@types/node": "*" } }, + "@types/brotli": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@types/brotli/-/brotli-1.3.4.tgz", + "integrity": "sha512-cKYjgaS2DMdCKF7R0F5cgx1nfBYObN2ihIuPGQ4/dlIY6RpV7OWNwe9L8V4tTVKL2eZqOkNM9FM/rgTvLf4oXw==", + "requires": { + "@types/node": "*" + } + }, "@types/command-line-args": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.2.3.tgz", @@ -16428,21 +20326,140 @@ "@types/node": "*" } }, + "@types/crypto-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@types/crypto-js/-/crypto-js-4.2.2.tgz", + "integrity": "sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ==" + }, + "@types/d3": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz", + "integrity": "sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==", + "peer": true, + "requires": { + "@types/d3-array": "*", + "@types/d3-axis": "*", + "@types/d3-brush": "*", + "@types/d3-chord": "*", + "@types/d3-color": "*", + "@types/d3-contour": "*", + "@types/d3-delaunay": "*", + "@types/d3-dispatch": "*", + "@types/d3-drag": "*", + "@types/d3-dsv": "*", + "@types/d3-ease": "*", + "@types/d3-fetch": "*", + "@types/d3-force": "*", + "@types/d3-format": "*", + "@types/d3-geo": "*", + "@types/d3-hierarchy": "*", + "@types/d3-interpolate": "*", + "@types/d3-path": "*", + "@types/d3-polygon": "*", + "@types/d3-quadtree": "*", + "@types/d3-random": "*", + "@types/d3-scale": "*", + "@types/d3-scale-chromatic": "*", + "@types/d3-selection": "*", + "@types/d3-shape": "*", + "@types/d3-time": "*", + "@types/d3-time-format": "*", + "@types/d3-timer": "*", + "@types/d3-transition": "*", + "@types/d3-zoom": "*" + } + }, "@types/d3-array": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.3.tgz", "integrity": "sha512-Reoy+pKnvsksN0lQUlcH6dOGjRZ/3WRwXR//m+/8lt1BXeI4xyaUZoqULNjyXXRuh0Mj4LNpkCvhUpQlY3X5xQ==" }, + "@types/d3-axis": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-axis/-/d3-axis-3.0.6.tgz", + "integrity": "sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==", + "peer": true, + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-brush": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-brush/-/d3-brush-3.0.6.tgz", + "integrity": "sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==", + "peer": true, + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-chord": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-chord/-/d3-chord-3.0.6.tgz", + "integrity": "sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==", + "peer": true + }, "@types/d3-color": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==" }, + "@types/d3-contour": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz", + "integrity": "sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==", + "peer": true, + "requires": { + "@types/d3-array": "*", + "@types/geojson": "*" + } + }, "@types/d3-delaunay": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/@types/d3-delaunay/-/d3-delaunay-6.0.1.tgz", "integrity": "sha512-tLxQ2sfT0p6sxdG75c6f/ekqxjyYR0+LwPrsO1mbC9YDBzPJhs2HbJJRrn8Ez1DBoHRo2yx7YEATI+8V1nGMnQ==" }, + "@types/d3-dispatch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dispatch/-/d3-dispatch-3.0.7.tgz", + "integrity": "sha512-5o9OIAdKkhN1QItV2oqaE5KMIiXAvDWBDPrD85e58Qlz1c1kI/J0NcqbEG88CoTwJrYe7ntUCVfeUl2UJKbWgA==", + "peer": true + }, + "@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "peer": true, + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-dsv": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-dsv/-/d3-dsv-3.0.7.tgz", + "integrity": "sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==", + "peer": true + }, + "@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "peer": true + }, + "@types/d3-fetch": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-fetch/-/d3-fetch-3.0.7.tgz", + "integrity": "sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==", + "peer": true, + "requires": { + "@types/d3-dsv": "*" + } + }, + "@types/d3-force": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/d3-force/-/d3-force-3.0.10.tgz", + "integrity": "sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==", + "peer": true + }, "@types/d3-format": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/d3-format/-/d3-format-3.0.1.tgz", @@ -16456,6 +20473,12 @@ "@types/geojson": "*" } }, + "@types/d3-hierarchy": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-hierarchy/-/d3-hierarchy-3.1.1.tgz", + "integrity": "sha512-QwjxA3+YCKH3N1Rs3uSiSy1bdxlLB1uUiENXeJudBoAFvtDuswUxLcanoOaR2JYn1melDTuIXR8VhnVyI3yG/A==", + "peer": true + }, "@types/d3-interpolate": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", @@ -16469,6 +20492,33 @@ "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.11.tgz", "integrity": "sha512-4pQMp8ldf7UaB/gR8Fvvy69psNHkTpD/pVw3vmEi8iZAB9EPMBruB1JvHO4BIq9QkUUd2lV1F5YXpMNj7JPBpw==" }, + "@types/d3-polygon": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-polygon/-/d3-polygon-3.0.2.tgz", + "integrity": "sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==", + "peer": true + }, + "@types/d3-quadtree": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz", + "integrity": "sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==", + "peer": true + }, + "@types/d3-random": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-random/-/d3-random-3.0.3.tgz", + "integrity": "sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==", + "peer": true + }, + "@types/d3-sankey": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/@types/d3-sankey/-/d3-sankey-0.11.2.tgz", + "integrity": "sha512-U6SrTWUERSlOhnpSrgvMX64WblX1AxX6nEjI2t3mLK2USpQrnbwYYK+AS9SwiE7wgYmOsSSKoSdr8aoKBH0HgQ==", + "peer": true, + "requires": { + "@types/d3-shape": "^1" + } + }, "@types/d3-scale": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.2.tgz", @@ -16477,6 +20527,18 @@ "@types/d3-time": "*" } }, + "@types/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ==", + "peer": true + }, + "@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "peer": true + }, "@types/d3-shape": { "version": "1.3.12", "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.12.tgz", @@ -16495,6 +20557,31 @@ "resolved": "https://registry.npmjs.org/@types/d3-time-format/-/d3-time-format-2.1.0.tgz", "integrity": "sha512-/myT3I7EwlukNOX2xVdMzb8FRgNzRMpsZddwst9Ld/VFe6LyJyRp0s32l/V9XoUzk+Gqu56F/oGk6507+8BxrA==" }, + "@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "peer": true + }, + "@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "peer": true, + "requires": { + "@types/d3-selection": "*" + } + }, + "@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "peer": true, + "requires": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, "@types/eslint": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", @@ -16541,9 +20628,9 @@ } }, "@types/geojson": { - "version": "7946.0.14", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", - "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==" + "version": "7946.0.16", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz", + "integrity": "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==" }, "@types/geojson-vt": { "version": "3.2.5", @@ -16553,6 +20640,11 @@ "@types/geojson": "*" } }, + "@types/google.maps": { + "version": "3.58.1", + "resolved": "https://registry.npmjs.org/@types/google.maps/-/google.maps-3.58.1.tgz", + "integrity": "sha512-X9QTSvGJ0nCfMzYOnaVs/k6/4L+7F5uCS+4iUmkLEls6J9S/Phv+m/i3mDeyc49ZBgwab3EFO1HEoBY7k98EGQ==" + }, "@types/graceful-fs": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz", @@ -16750,6 +20842,16 @@ "@types/node": "*" } }, + "@types/offscreencanvas": { + "version": "2019.7.3", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.3.tgz", + "integrity": "sha512-ieXiYmgSRXUDeOntE1InxjWyvEelZGP63M+cGuquuRLuIKKT1osnkXjxev9B7d1nXSug5vpunx+gNlbVxMlC9A==" + }, + "@types/pako": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/pako/-/pako-1.0.7.tgz", + "integrity": "sha512-YBtzT2ztNF6R/9+UXj2wTGFnC9NklAnASt3sC0h2m1bbH7G6FyBIkt4AN8ThZpNfxUo1b2iMVO0UawiJymEt8A==" + }, "@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", @@ -16766,6 +20868,12 @@ "resolved": "https://registry.npmjs.org/@types/pbf/-/pbf-3.0.5.tgz", "integrity": "sha512-j3pOPiEcWZ34R6a6mN07mUkM4o4Lwf6hPNt8eilOeZhTFbxFXmKhvXl9Y28jotFPaI1bpPDJsbCprUoNke6OrA==" }, + "@types/polylabel": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@types/polylabel/-/polylabel-1.1.3.tgz", + "integrity": "sha512-9Zw2KoDpi+T4PZz2G6pO2xArE0m/GSMTW1MIxF2s8ZY8x9XDO6fv9um0ydRGvcbkFLlaq8yNK6eZxnmMZtDgWQ==", + "peer": true + }, "@types/prettier": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.1.tgz", @@ -16868,6 +20976,12 @@ "@types/node": "*" } }, + "@types/sortablejs": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/@types/sortablejs/-/sortablejs-1.15.9.tgz", + "integrity": "sha512-7HP+rZGE2p886PKV9c9OJzLBI6BBJu1O7lJGYnPyG3fS4/duUCcngkNCjsLwIMV+WMqANe3tt4irrXHSIe68OQ==", + "peer": true + }, "@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", @@ -16888,6 +21002,12 @@ "@types/geojson": "*" } }, + "@types/svg-arc-to-cubic-bezier": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/@types/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.3.tgz", + "integrity": "sha512-UNOnbTtl0nVTm8hwKaz5R5VZRvSulFMGojO5+Q7yucKxBoCaTtS4ibSQVRHo5VW5AaRo145U8p1Vfg5KrYe9Bg==", + "peer": true + }, "@types/testing-library__jest-dom": { "version": "5.14.3", "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.3.tgz", @@ -16903,6 +21023,12 @@ "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", "dev": true }, + "@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "peer": true + }, "@types/warning": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz", @@ -17069,6 +21195,184 @@ "@use-gesture/core": "10.3.1" } }, + "@vaadin/a11y-base": { + "version": "24.9.8", + "resolved": "https://registry.npmjs.org/@vaadin/a11y-base/-/a11y-base-24.9.8.tgz", + "integrity": "sha512-8+4XALzrTwBAI3ARFApLOa4MlaPn9lHtA7JaZxd7hlqeit0LsKkJ1LhNP7GS5BhvyOfn3MUo1oR09v7SUOPixw==", + "peer": true, + "requires": { + "@open-wc/dedupe-mixin": "^1.3.0", + "@polymer/polymer": "^3.0.0", + "@vaadin/component-base": "~24.9.8", + "lit": "^3.0.0" + } + }, + "@vaadin/checkbox": { + "version": "24.9.8", + "resolved": "https://registry.npmjs.org/@vaadin/checkbox/-/checkbox-24.9.8.tgz", + "integrity": "sha512-G4KVnP7K/OWGlVjSAVRCn4cZNIY+4PHmjijBzYUoChiIHnlDnnKU7Bzb215FT3j5JquVHKdeO957ALusN/UYVQ==", + "peer": true, + "requires": { + "@open-wc/dedupe-mixin": "^1.3.0", + "@polymer/polymer": "^3.0.0", + "@vaadin/a11y-base": "~24.9.8", + "@vaadin/component-base": "~24.9.8", + "@vaadin/field-base": "~24.9.8", + "@vaadin/vaadin-lumo-styles": "~24.9.8", + "@vaadin/vaadin-material-styles": "~24.9.8", + "@vaadin/vaadin-themable-mixin": "~24.9.8", + "lit": "^3.0.0" + } + }, + "@vaadin/component-base": { + "version": "24.9.8", + "resolved": "https://registry.npmjs.org/@vaadin/component-base/-/component-base-24.9.8.tgz", + "integrity": "sha512-KOSJy9mXfbc1nW+LVSRV/jPC6s1K0lo6LeNZOuYjCYxSqsxIKGFrPrHsISPLIbHcfKtV/76OA4c0u5vgPeWkbA==", + "peer": true, + "requires": { + "@open-wc/dedupe-mixin": "^1.3.0", + "@polymer/polymer": "^3.0.0", + "@vaadin/vaadin-development-mode-detector": "^2.0.0", + "@vaadin/vaadin-usage-statistics": "^2.1.0", + "lit": "^3.0.0" + } + }, + "@vaadin/field-base": { + "version": "24.9.8", + "resolved": "https://registry.npmjs.org/@vaadin/field-base/-/field-base-24.9.8.tgz", + "integrity": "sha512-KyTIDv9wsEA0kyul8OrD3S0vxKV58WYNERCwiT5iNll9qVXolAR8Zsu/SQDzzPsAQiCNE79T/pFeRjL6F59oig==", + "peer": true, + "requires": { + "@open-wc/dedupe-mixin": "^1.3.0", + "@polymer/polymer": "^3.0.0", + "@vaadin/a11y-base": "~24.9.8", + "@vaadin/component-base": "~24.9.8", + "lit": "^3.0.0" + } + }, + "@vaadin/grid": { + "version": "24.9.8", + "resolved": "https://registry.npmjs.org/@vaadin/grid/-/grid-24.9.8.tgz", + "integrity": "sha512-jpzw/JuHfQxIU5ffKkwaQx2Bsvrlcb9frQxRP82UoMD5n7+Y8hcTxLBTtMfeP5851zN7vAOltegaBpciONDkKg==", + "peer": true, + "requires": { + "@open-wc/dedupe-mixin": "^1.3.0", + "@polymer/polymer": "^3.0.0", + "@vaadin/a11y-base": "~24.9.8", + "@vaadin/checkbox": "~24.9.8", + "@vaadin/component-base": "~24.9.8", + "@vaadin/lit-renderer": "~24.9.8", + "@vaadin/text-field": "~24.9.8", + "@vaadin/vaadin-lumo-styles": "~24.9.8", + "@vaadin/vaadin-material-styles": "~24.9.8", + "@vaadin/vaadin-themable-mixin": "~24.9.8", + "lit": "^3.0.0" + } + }, + "@vaadin/icon": { + "version": "24.9.8", + "resolved": "https://registry.npmjs.org/@vaadin/icon/-/icon-24.9.8.tgz", + "integrity": "sha512-LzxBcosBqJaT/gqSvXAUEnie3tOOI2aBjnWhOEm+MN4Xo6Qz2t1nfz6B0M0/vcd6WYPWzELboe9o3e0p5R/tmA==", + "peer": true, + "requires": { + "@open-wc/dedupe-mixin": "^1.3.0", + "@polymer/polymer": "^3.0.0", + "@vaadin/component-base": "~24.9.8", + "@vaadin/vaadin-lumo-styles": "~24.9.8", + "@vaadin/vaadin-themable-mixin": "~24.9.8", + "lit": "^3.0.0" + } + }, + "@vaadin/input-container": { + "version": "24.9.8", + "resolved": "https://registry.npmjs.org/@vaadin/input-container/-/input-container-24.9.8.tgz", + "integrity": "sha512-YWU2yaXkdt7dLkngHKoeEif9m0fT9lIAPYpngX5WlzoZi5dDwJjHMOWFvRV2TkUAdWMx8t1W6O9m7t/jrzwy8Q==", + "peer": true, + "requires": { + "@polymer/polymer": "^3.0.0", + "@vaadin/component-base": "~24.9.8", + "@vaadin/vaadin-lumo-styles": "~24.9.8", + "@vaadin/vaadin-material-styles": "~24.9.8", + "@vaadin/vaadin-themable-mixin": "~24.9.8", + "lit": "^3.0.0" + } + }, + "@vaadin/lit-renderer": { + "version": "24.9.8", + "resolved": "https://registry.npmjs.org/@vaadin/lit-renderer/-/lit-renderer-24.9.8.tgz", + "integrity": "sha512-fhOdpFv2U2vnDMlUlBKjnOoDHJnkw9Kwh5MGPDb46a6gkd09C9gKBHpNREqtyP8OQ289DteBV5eCNWxaAQgNMQ==", + "peer": true, + "requires": { + "lit": "^3.0.0" + } + }, + "@vaadin/text-field": { + "version": "24.9.8", + "resolved": "https://registry.npmjs.org/@vaadin/text-field/-/text-field-24.9.8.tgz", + "integrity": "sha512-fjE9xA+jd2d69/vE3/1cz5WNtQgN/zz9YbPUcL06ET9SFn4MB0Td834h5v3FvC7gv993TPpnHfLLZVzzBQa1Ww==", + "peer": true, + "requires": { + "@open-wc/dedupe-mixin": "^1.3.0", + "@polymer/polymer": "^3.0.0", + "@vaadin/a11y-base": "~24.9.8", + "@vaadin/component-base": "~24.9.8", + "@vaadin/field-base": "~24.9.8", + "@vaadin/input-container": "~24.9.8", + "@vaadin/vaadin-lumo-styles": "~24.9.8", + "@vaadin/vaadin-material-styles": "~24.9.8", + "@vaadin/vaadin-themable-mixin": "~24.9.8", + "lit": "^3.0.0" + } + }, + "@vaadin/vaadin-development-mode-detector": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-development-mode-detector/-/vaadin-development-mode-detector-2.0.7.tgz", + "integrity": "sha512-9FhVhr0ynSR3X2ao+vaIEttcNU5XfzCbxtmYOV8uIRnUCtNgbvMOIcyGBvntsX9I5kvIP2dV3cFAOG9SILJzEA==", + "peer": true + }, + "@vaadin/vaadin-lumo-styles": { + "version": "24.9.8", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-lumo-styles/-/vaadin-lumo-styles-24.9.8.tgz", + "integrity": "sha512-ilQkJbIDh02EjbAEOEOUPFmktJaZlGafEHvCsGooYLV29v20w70MWQ+iftGKLFQ1DlLi8+sACNREYHsA9yZzSQ==", + "peer": true, + "requires": { + "@polymer/polymer": "^3.0.0", + "@vaadin/component-base": "~24.9.8", + "@vaadin/icon": "~24.9.8", + "@vaadin/vaadin-themable-mixin": "~24.9.8" + } + }, + "@vaadin/vaadin-material-styles": { + "version": "24.9.8", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-material-styles/-/vaadin-material-styles-24.9.8.tgz", + "integrity": "sha512-/WC4gZBmIRHk4sy3Vpj0LtanuNvL+zGNLRoH/rDYf0Ybcj4CdonL3Y0lMoF9/Mo4BdVmC4ynvYz6oR0xr/BkZg==", + "peer": true, + "requires": { + "@polymer/polymer": "^3.0.0", + "@vaadin/component-base": "~24.9.8", + "@vaadin/vaadin-themable-mixin": "~24.9.8" + } + }, + "@vaadin/vaadin-themable-mixin": { + "version": "24.9.8", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-themable-mixin/-/vaadin-themable-mixin-24.9.8.tgz", + "integrity": "sha512-RlQ6q7yJKsHJIpsUk+RReMJSngaRwH2dfh7QO9/8F7pWRs6baKMAS1abPMmugdyldl3JxX6mX+7UQ+ghRZUNug==", + "peer": true, + "requires": { + "@open-wc/dedupe-mixin": "^1.3.0", + "lit": "^3.0.0", + "style-observer": "^0.0.8" + } + }, + "@vaadin/vaadin-usage-statistics": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@vaadin/vaadin-usage-statistics/-/vaadin-usage-statistics-2.1.3.tgz", + "integrity": "sha512-8r4TNknD7OJQADe3VygeofFR7UNAXZ2/jjBFP5dgI8+2uMfnuGYgbuHivasKr9WSQ64sPej6m8rDoM1uSllXjQ==", + "peer": true, + "requires": { + "@vaadin/vaadin-development-mode-detector": "^2.0.0" + } + }, "@visx/axis": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/@visx/axis/-/axis-3.12.0.tgz", @@ -17405,6 +21709,12 @@ "@xtuc/long": "4.2.2" } }, + "@webcomponents/shadycss": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.11.2.tgz", + "integrity": "sha512-vRq+GniJAYSBmTRnhCYPAPq6THYqovJ/gzGThWbgEZUQaBccndGTi1hdiUP15HzEco0I6t4RCtXyX0rsSmwgPw==", + "peer": true + }, "@webpack-cli/configtest": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-3.0.1.tgz", @@ -17426,6 +21736,15 @@ "dev": true, "requires": {} }, + "@welldone-software/why-did-you-render": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@welldone-software/why-did-you-render/-/why-did-you-render-8.0.3.tgz", + "integrity": "sha512-bb5bKPMStYnocyTBVBu4UTegZdBqzV1mPhxc0UIV/S43KFUSRflux9gvzJfu2aM4EWLJ3egTvdjOi+viK+LKGA==", + "dev": true, + "requires": { + "lodash": "^4" + } + }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -17436,6 +21755,20 @@ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, + "@zip.js/zip.js": { + "version": "2.8.14", + "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.8.14.tgz", + "integrity": "sha512-BZ7OyJLA5cjYwf2jVjvZCK10swzIc6sDOLpkPjJXfXgx/IHF5y61PyL3Ko5/q3bUU5GvIhk6tzKDUcDJ7rhzbg==", + "peer": true + }, + "a5-js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/a5-js/-/a5-js-0.5.0.tgz", + "integrity": "sha512-VAw19sWdYadhdovb0ViOIi1SdKx6H6LwcGMRFKwMfgL5gcmL/1fKJHfgsNgNaJ7xC/eEyjs6VK+VVd4N0a+peg==", + "requires": { + "gl-matrix": "^3.4.3" + } + }, "abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", @@ -17899,6 +22232,11 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, "baseline-browser-mapping": { "version": "2.8.28", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.28.tgz", @@ -17985,6 +22323,14 @@ "fill-range": "^7.1.1" } }, + "brotli": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz", + "integrity": "sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==", + "requires": { + "base64-js": "^1.1.2" + } + }, "browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", @@ -18012,6 +22358,11 @@ "node-int64": "^0.4.0" } }, + "buf-compare": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buf-compare/-/buf-compare-1.0.1.tgz", + "integrity": "sha512-Bvx4xH00qweepGc43xFvMs5BKASXTbHaHm6+kDYIK9p/4iFwjATQkmPKHQSgJZzKbAymhztRbXUf1Nqhzl73/Q==" + }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -18098,6 +22449,14 @@ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001754.tgz", "integrity": "sha512-x6OeBXueoAceOmotzx3PO4Zpt4rzpeIFsSr6AAePTZxSkXiYDUmpypEl7e2+8NCd9bD7bXjqyef8CJYPC1jfxg==" }, + "cartocolor": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/cartocolor/-/cartocolor-5.0.2.tgz", + "integrity": "sha512-Ihb/wU5V6BVbHwapd8l/zg7bnhZ4YPFVfa7quSpL86lfkPJSf4YuNBT+EvesPRP5vSqhl6vZVsQJwCR8alBooQ==", + "requires": { + "colorbrewer": "1.5.6" + } + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -18141,6 +22500,11 @@ "resolved": "https://registry.npmjs.org/charcodes/-/charcodes-0.2.0.tgz", "integrity": "sha512-Y4kiDb+AM4Ecy58YkuZrrSRJBDQdQ2L+NyS1vHHFtNtUjgutcZfx3yp1dAONI/oPaPmyGfCLx5CxL+zauIMyKQ==" }, + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==" + }, "chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -18205,6 +22569,12 @@ "wrap-ansi": "^7.0.0" } }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "peer": true + }, "clone-deep": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", @@ -18233,6 +22603,33 @@ "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", "dev": true }, + "color": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", + "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", + "peer": true, + "requires": { + "color-convert": "^3.1.3", + "color-string": "^2.1.3" + }, + "dependencies": { + "color-convert": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", + "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", + "peer": true, + "requires": { + "color-name": "^2.0.0" + } + }, + "color-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", + "peer": true + } + } + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -18246,6 +22643,28 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "color-string": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", + "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", + "peer": true, + "requires": { + "color-name": "^2.0.0" + }, + "dependencies": { + "color-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", + "peer": true + } + } + }, + "colorbrewer": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/colorbrewer/-/colorbrewer-1.5.6.tgz", + "integrity": "sha512-fONg2pGXyID8zNgKHBlagW8sb/AMShGzj4rRJfz5biZ7iuHQZYquSCLE/Co1oSQFmt/vvwjyezJCejQl7FG/tg==" + }, "colorette": { "version": "2.0.16", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", @@ -18281,12 +22700,25 @@ "typical": "^7.1.1" } }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "peer": true + }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, + "composed-offset-position": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/composed-offset-position/-/composed-offset-position-0.0.6.tgz", + "integrity": "sha512-Q7dLompI6lUwd7LWyIcP66r4WcS9u7AL2h8HaeipiRfCRPLMWqRx8fYsjb4OHi6UQFifO7XtNC2IlEJ1ozIFxw==", + "peer": true, + "requires": {} + }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -18387,6 +22819,15 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, + "core-assert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/core-assert/-/core-assert-0.2.1.tgz", + "integrity": "sha512-IG97qShIP+nrJCXMCgkNZgH7jZQ4n8RpPyPeXX++T6avR/KhLhgLiHKoEn5Rc1KjfycSfA9DMa6m+4C4eguHhw==", + "requires": { + "buf-compare": "^1.0.0", + "is-error": "^2.2.0" + } + }, "core-js": { "version": "3.22.8", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.8.tgz", @@ -18433,6 +22874,17 @@ "which": "^2.0.1" } }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==" + }, + "crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "peer": true + }, "css": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", @@ -18492,6 +22944,12 @@ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" }, + "cssfilter": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/cssfilter/-/cssfilter-0.0.10.tgz", + "integrity": "sha512-FAaLDaplstoRsDR8XGYH51znUN0UY7nMc6Z9/fvE8EXGwvJE9hu7W2vHwx1+bd6gCYnln9nLbzxFTrcO9YQDZw==", + "peer": true + }, "cssom": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", @@ -18516,9 +22974,64 @@ } }, "csstype": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==" + }, + "d3": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", + "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", + "peer": true, + "requires": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "dependencies": { + "d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "peer": true + }, + "d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "peer": true, + "requires": { + "d3-path": "^3.1.0" + } + } + } }, "d3-array": { "version": "3.2.4", @@ -18528,11 +23041,48 @@ "internmap": "1 - 2" } }, + "d3-axis": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "peer": true + }, + "d3-brush": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "peer": true, + "requires": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + } + }, + "d3-chord": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "peer": true, + "requires": { + "d3-path": "1 - 3" + } + }, "d3-color": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==" }, + "d3-contour": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", + "peer": true, + "requires": { + "d3-array": "^3.2.0" + } + }, "d3-delaunay": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", @@ -18541,6 +23091,70 @@ "delaunator": "5" } }, + "d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "peer": true + }, + "d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "peer": true, + "requires": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + } + }, + "d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "peer": true, + "requires": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "peer": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "peer": true + }, + "d3-fetch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "peer": true, + "requires": { + "d3-dsv": "1 - 3" + } + }, + "d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "peer": true, + "requires": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + } + }, "d3-format": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", @@ -18554,6 +23168,17 @@ "d3-array": "2.5.0 - 3" } }, + "d3-hexbin": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/d3-hexbin/-/d3-hexbin-0.2.2.tgz", + "integrity": "sha512-KS3fUT2ReD4RlGCjvCEm1RgMtp2NFZumdMu4DBzQK8AZv3fXRM6Xm8I4fSU07UXvH4xxg03NwWKWdvxfS/yc4w==" + }, + "d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "peer": true + }, "d3-interpolate": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", @@ -18567,6 +23192,51 @@ "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz", "integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==" }, + "d3-polygon": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "peer": true + }, + "d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "peer": true + }, + "d3-random": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "peer": true + }, + "d3-sankey": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/d3-sankey/-/d3-sankey-0.12.3.tgz", + "integrity": "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==", + "peer": true, + "requires": { + "d3-array": "1 - 2", + "d3-shape": "^1.2.0" + }, + "dependencies": { + "d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "peer": true, + "requires": { + "internmap": "^1.0.0" + } + }, + "internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "peer": true + } + } + }, "d3-scale": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", @@ -18579,6 +23249,22 @@ "d3-time-format": "2 - 4" } }, + "d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "peer": true, + "requires": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + } + }, + "d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "peer": true + }, "d3-shape": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz", @@ -18603,6 +23289,112 @@ "d3-time": "1 - 3" } }, + "d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "peer": true + }, + "d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "peer": true, + "requires": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + } + }, + "d3-voronoi-map": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-voronoi-map/-/d3-voronoi-map-2.1.1.tgz", + "integrity": "sha512-mCXfz/kD9IQxjHaU2IMjkO8fSo4J6oysPR2iL+omDsCy1i1Qn6BQ/e4hEAW8C6ms2kfuHwqtbNom80Hih94YsA==", + "peer": true, + "requires": { + "d3-dispatch": "2.*", + "d3-polygon": "2.*", + "d3-timer": "2.*", + "d3-weighted-voronoi": "1.*" + }, + "dependencies": { + "d3-dispatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-2.0.0.tgz", + "integrity": "sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==", + "peer": true + }, + "d3-polygon": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-2.0.0.tgz", + "integrity": "sha512-MsexrCK38cTGermELs0cO1d79DcTsQRN7IWMJKczD/2kBjzNXxLUWP33qRF6VDpiLV/4EI4r6Gs0DAWQkE8pSQ==", + "peer": true + }, + "d3-timer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-2.0.0.tgz", + "integrity": "sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA==", + "peer": true + } + } + }, + "d3-voronoi-treemap": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/d3-voronoi-treemap/-/d3-voronoi-treemap-1.1.2.tgz", + "integrity": "sha512-7odu9HdG/yLPWwzDteJq4yd9Q/NwgQV7IE/u36VQtcCK7k1sZwDqbkHCeMKNTBsq5mQjDwolTsrXcU0j8ZEMCA==", + "peer": true, + "requires": { + "d3-voronoi-map": "2.*" + } + }, + "d3-weighted-voronoi": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/d3-weighted-voronoi/-/d3-weighted-voronoi-1.1.3.tgz", + "integrity": "sha512-C3WdvSKl9aqhAy+f3QT3PPsQG6V+ajDfYO3BSclQDSD+araW2xDBFIH67aKzsSuuuKaX8K2y2dGq1fq/dWTVig==", + "peer": true, + "requires": { + "d3-array": "2", + "d3-polygon": "2" + }, + "dependencies": { + "d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "peer": true, + "requires": { + "internmap": "^1.0.0" + } + }, + "d3-polygon": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-2.0.0.tgz", + "integrity": "sha512-MsexrCK38cTGermELs0cO1d79DcTsQRN7IWMJKczD/2kBjzNXxLUWP33qRF6VDpiLV/4EI4r6Gs0DAWQkE8pSQ==", + "peer": true + }, + "internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==", + "peer": true + } + } + }, + "d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "peer": true, + "requires": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + } + }, "damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -18665,6 +23457,29 @@ "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==", "dev": true }, + "deck.gl": { + "version": "9.2.5", + "resolved": "https://registry.npmjs.org/deck.gl/-/deck.gl-9.2.5.tgz", + "integrity": "sha512-z64COJdbwwe73bqMGTS7Y56imWwvF0TELUzcL5avG6QlEJrZ7M9Wo9ycrCBKWVgARXRAcVBiC5NdknOoFTyXBA==", + "requires": { + "@deck.gl/aggregation-layers": "9.2.5", + "@deck.gl/arcgis": "9.2.5", + "@deck.gl/carto": "9.2.5", + "@deck.gl/core": "9.2.5", + "@deck.gl/extensions": "9.2.5", + "@deck.gl/geo-layers": "9.2.5", + "@deck.gl/google-maps": "9.2.5", + "@deck.gl/json": "9.2.5", + "@deck.gl/layers": "9.2.5", + "@deck.gl/mapbox": "9.2.5", + "@deck.gl/mesh-layers": "9.2.5", + "@deck.gl/react": "9.2.5", + "@deck.gl/widgets": "9.2.5", + "@loaders.gl/core": "^4.2.0", + "@luma.gl/core": "^9.2.4", + "@luma.gl/engine": "^9.2.4" + } + }, "decode-uri-component": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", @@ -18677,11 +23492,33 @@ "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", "dev": true }, + "deep-equal": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", + "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", + "peer": true, + "requires": { + "is-arguments": "^1.1.1", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.5.1" + } + }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, + "deep-strict-equal": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/deep-strict-equal/-/deep-strict-equal-0.2.0.tgz", + "integrity": "sha512-3daSWyvZ/zwJvuMGlzG1O+Ow0YSadGfb3jsh9xoCutv2tWyB9dA4YvR9L9/fSdDZa2dByYQe+TqapSGUrjnkoA==", + "requires": { + "core-assert": "^0.2.0" + } + }, "deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -18766,6 +23603,12 @@ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" }, + "dfa": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/dfa/-/dfa-1.2.0.tgz", + "integrity": "sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==", + "peer": true + }, "diff-sequences": { "version": "28.0.2", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.0.2.tgz", @@ -18859,6 +23702,11 @@ "dotenv-defaults": "^2.0.2" } }, + "draco3d": { + "version": "1.5.7", + "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", + "integrity": "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ==" + }, "dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -19011,6 +23859,12 @@ "is-symbol": "^1.0.2" } }, + "es-toolkit": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/es-toolkit/-/es-toolkit-1.43.0.tgz", + "integrity": "sha512-SKCT8AsWvYzBBuUqMk4NPwFlSdqLpJwmy6AP322ERn8W2YLIB6JBXnwMI2Qsh2gfphT3q7EKAxKb23cvFHFwKA==", + "peer": true + }, "escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -19418,6 +24272,11 @@ "estraverse": "^5.2.0" } }, + "esri-loader": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/esri-loader/-/esri-loader-3.7.0.tgz", + "integrity": "sha512-cB1Sw9EQjtW4mtT7eFBjn/6VaaIWNTjmTd2asnnEyuZk1xVSFRMCfLZSBSjZM7ZarDcVu5WIjOP0t0MYVu4hVQ==" + }, "estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", @@ -19587,6 +24446,14 @@ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==" }, + "fast-xml-parser": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz", + "integrity": "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==", + "requires": { + "strnum": "^1.1.1" + } + }, "fastest-levenshtein": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", @@ -19741,11 +24608,26 @@ "resolved": "https://registry.npmjs.org/flatbuffers/-/flatbuffers-25.9.23.tgz", "integrity": "sha512-MI1qs7Lo4Syw0EOzUl0xjs2lsoeqFku44KpngfIduHBYvzm8h2+7K8YMQh1JtVVVrUvhLpNwqVi4DERegUJhPQ==" }, + "flatpickr": { + "version": "4.6.13", + "resolved": "https://registry.npmjs.org/flatpickr/-/flatpickr-4.6.13.tgz", + "integrity": "sha512-97PMG/aywoYpB4IvbvUJi0RQi8vearvU0oov1WW3k0WZPBMrTQVqekSX5CjSG/M4Q3i6A/0FKXC7RyAoAUUSPw==", + "peer": true + }, "flatted": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==" }, + "focus-trap": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.8.0.tgz", + "integrity": "sha512-/yNdlIkpWbM0ptxno3ONTuf+2g318kh2ez3KSeZN5dZ8YC6AAmgeWz+GasYYiBJPFaYcSAPeu4GfhUaChzIJXA==", + "peer": true, + "requires": { + "tabbable": "^6.4.0" + } + }, "follow-redirects": { "version": "1.15.6", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", @@ -19967,6 +24849,11 @@ "integrity": "sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==", "dev": true }, + "h3-js": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/h3-js/-/h3-js-4.4.0.tgz", + "integrity": "sha512-DvJh07MhGgY2KcC4OeZc8SSyA+ZXpdvoh6uCzGpoKvWtZxJB+g6VXXC1+eWYkaMIsLz7J/ErhOalHCpcs1KYog==" + }, "handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -20189,6 +25076,16 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==" }, + "image-size": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.7.5.tgz", + "integrity": "sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g==" + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, "immutable": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", @@ -20243,6 +25140,15 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==" }, + "interactjs": { + "version": "1.10.27", + "resolved": "https://registry.npmjs.org/interactjs/-/interactjs-1.10.27.tgz", + "integrity": "sha512-y/8RcCftGAF24gSp76X2JS3XpHiUvDQyhF8i7ujemBz77hwiHDuJzftHx7thY8cxGogwGiPJ+o97kWB6eAXnsA==", + "peer": true, + "requires": { + "@interactjs/types": "1.10.27" + } + }, "internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", @@ -20277,6 +25183,16 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==" }, + "is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "peer": true, + "requires": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -20307,6 +25223,11 @@ "has-tostringtag": "^1.0.0" } }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, "is-callable": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", @@ -20333,6 +25254,11 @@ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==" }, + "is-error": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.2.tgz", + "integrity": "sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==" + }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -21136,6 +26062,12 @@ } } }, + "jpeg-exif": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/jpeg-exif/-/jpeg-exif-1.1.4.tgz", + "integrity": "sha512-a+bKEcCjtuW5WTdgeXFzswSrdqi0jk4XlEtZlx5A94wCoBpFjfFTbo/Tra5SpNCl/YFZPvcV1dJc+TAYeg6ROQ==", + "peer": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -21211,6 +26143,11 @@ } } }, + "jsep": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz", + "integrity": "sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==" + }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -21250,6 +26187,17 @@ "object.assign": "^4.1.2" } }, + "jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, "kdbush": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/kdbush/-/kdbush-4.0.2.tgz", @@ -21271,6 +26219,11 @@ "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==" }, + "ktx-parse": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ktx-parse/-/ktx-parse-0.7.1.tgz", + "integrity": "sha512-FeA3g56ksdFNwjXJJsc1CCc7co+AJYDp6ipIp878zZ2bU8kWROatLYf39TQEd4/XRSUvBXovQ8gaVKWPXsCLEQ==" + }, "language-subtag-registry": { "version": "0.3.21", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.21.tgz", @@ -21308,11 +26261,50 @@ "type-check": "~0.4.0" } }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "requires": { + "immediate": "~3.0.5" + } + }, "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, + "lit": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lit/-/lit-3.3.2.tgz", + "integrity": "sha512-NF9zbsP79l4ao2SNrH3NkfmFgN/hBYSQo90saIVI1o5GpjAdCPVstVzO1MrLOakHoEhYkrtRjPK6Ob521aoYWQ==", + "peer": true, + "requires": { + "@lit/reactive-element": "^2.1.0", + "lit-element": "^4.2.0", + "lit-html": "^3.3.0" + } + }, + "lit-element": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-4.2.2.tgz", + "integrity": "sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==", + "peer": true, + "requires": { + "@lit-labs/ssr-dom-shim": "^1.5.0", + "@lit/reactive-element": "^2.1.0", + "lit-html": "^3.3.0" + } + }, + "lit-html": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-3.3.2.tgz", + "integrity": "sha512-Qy9hU88zcmaxBXcc10ZpdK7cOLXvXpRoBxERdtqV9QOrfpMZZ6pSYP91LhpPtap3sFMUiL7Tw2RImbe0Al2/kw==", + "peer": true, + "requires": { + "@types/trusted-types": "^2.0.2" + } + }, "loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -21357,6 +26349,11 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, + "long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha512-ZYvPPOMqUwPoDsbJaR10iQJYnMuZhRTvHYl62ErLIEX7RgFlziSBUUvrt3OVfc47QlHHpzPZYP17g3Fv7oeJkg==" + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -21365,12 +26362,29 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "luxon": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", + "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", + "peer": true + }, "lz-string": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=", "dev": true }, + "lz4js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/lz4js/-/lz4js-0.2.0.tgz", + "integrity": "sha512-gY2Ia9Lm7Ep8qMiuGRhvUq0Q7qUereeldZPP1PMEJxPtEWHJLqw9pgX68oHajBH0nzJK4MaZEA/YNV3jT8u8Bg==", + "optional": true + }, + "lzo-wasm": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/lzo-wasm/-/lzo-wasm-0.0.4.tgz", + "integrity": "sha512-VKlnoJRFrB8SdJhlVKvW5vI1gGwcZ+mvChEXcSX6r2xDNc/Q2FD9esfBmGCuPZdrJ1feO+YcVFd2PTk0c137Gw==" + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -21443,6 +26457,18 @@ } } }, + "marked": { + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-16.3.0.tgz", + "integrity": "sha512-K3UxuKu6l6bmA5FUwYho8CfJBlsUWAooKtdGgMcERSpF7gcBUrCGsLH7wDaaNOzwq18JzSUDyoEb/YsrqMac3w==", + "peer": true + }, + "markerjs2": { + "version": "2.32.7", + "resolved": "https://registry.npmjs.org/markerjs2/-/markerjs2-2.32.7.tgz", + "integrity": "sha512-HeFRZjmc43DOG3lSQp92z49cq2oCYpYn2pX++SkJAW1Dij4xJtRquVRf+cXeSZQWDX3ufns1Ry/bGk+zveP7rA==", + "peer": true + }, "math-expression-evaluator": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.4.0.tgz", @@ -21453,6 +26479,16 @@ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" }, + "md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "requires": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -21629,6 +26665,24 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, + "mjolnir.js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mjolnir.js/-/mjolnir.js-3.0.0.tgz", + "integrity": "sha512-siX3YCG7N2HnmN1xMH3cK4JkUZJhbkhRFJL+G5N1vH0mh1t5088rJknIoqDFWDIU6NPGvRRgLnYW3ZHjSMEBLA==" + }, + "moment": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==" + }, + "moment-timezone": { + "version": "0.5.48", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.48.tgz", + "integrity": "sha512-f22b8LV1gbTO2ms2j2z13MuPogNoh5UzxL3nzNAYKGraILnbGc9NEE6dyiiiLv46DGRb8A4kg8UKWLjPthxBHw==", + "requires": { + "moment": "^2.29.4" + } + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -21781,6 +26835,16 @@ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==" }, + "object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "peer": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + } + }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -21935,6 +26999,11 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -22005,6 +27074,29 @@ "resolve-protobuf-schema": "^2.1.0" } }, + "pdfmake": { + "version": "0.2.22", + "resolved": "https://registry.npmjs.org/pdfmake/-/pdfmake-0.2.22.tgz", + "integrity": "sha512-nY0tvBlBCAfefFzXkWGHzW7OQeWKsGKL8M1I8o+fFhLBDtYesSA2G/KxfOF8jn+l53kzCLSTAdmTyPV2EM/v9g==", + "peer": true, + "requires": { + "@foliojs-fork/linebreak": "^1.1.2", + "@foliojs-fork/pdfkit": "^0.15.3", + "iconv-lite": "^0.7.1", + "xmldoc": "^2.0.3" + }, + "dependencies": { + "iconv-lite": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", + "peer": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -22045,6 +27137,29 @@ "fflate": "^0.8.0" } }, + "png-js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/png-js/-/png-js-1.0.0.tgz", + "integrity": "sha512-k+YsbhpA9e+EFfKjTCH3VW6aoKlyNYI6NYdTfDL4CIvFnvsuO84ttonmZE7rc+v23SLTH8XX+5w/Ak9v0xGY4g==", + "peer": true + }, + "polylabel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/polylabel/-/polylabel-1.1.0.tgz", + "integrity": "sha512-bxaGcA40sL3d6M4hH72Z4NdLqxpXRsCFk8AITYg6x1rn1Ei3izf00UMLklerBZTO49aPA3CYrIwVulx2Bce2pA==", + "peer": true, + "requires": { + "tinyqueue": "^2.0.3" + }, + "dependencies": { + "tinyqueue": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz", + "integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA==", + "peer": true + } + } + }, "postcss": { "version": "8.4.38", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", @@ -22106,6 +27221,11 @@ "resolved": "https://registry.npmjs.org/potpack/-/potpack-2.0.0.tgz", "integrity": "sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw==" }, + "preact": { + "version": "10.28.2", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.28.2.tgz", + "integrity": "sha512-lbteaWGzGHdlIuiJ0l2Jq454m6kcpI1zNje6d8MlGAFlYvP2GO4ibnat7P74Esfz4sPTdM6UxtTwh/d3pwM9JA==" + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -22238,6 +27358,14 @@ "side-channel": "^1.0.6" } }, + "quadbin": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/quadbin/-/quadbin-0.4.2.tgz", + "integrity": "sha512-1NFzjFVM23Um51/ttD6lFDqGtUHNS5Ky1slZHk3YPwMbC+7Jl3ULLb4QvDo6+Nerv8b8SgUV+ysOhziUh4B5cQ==", + "requires": { + "@math.gl/web-mercator": "^4.1.0" + } + }, "querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", @@ -22774,6 +27902,12 @@ "neo-async": "^2.6.2" } }, + "sax": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz", + "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", + "peer": true + }, "saxes": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", @@ -22802,6 +27936,12 @@ "ajv-keywords": "^3.5.2" } }, + "seedrandom": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", + "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==", + "peer": true + }, "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -22977,6 +28117,11 @@ "split-string": "^3.0.1" } }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -23075,6 +28220,11 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" }, + "snappyjs": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/snappyjs/-/snappyjs-0.6.1.tgz", + "integrity": "sha512-YIK6I2lsH072UE0aOFxxY1dPDCS43I5ktqHpeAsuLNYWkE5pGxRGWfDM4/vSUfNzXjC1Ivzt3qx31PCLmc9yqg==" + }, "sockjs": { "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", @@ -23085,6 +28235,12 @@ "websocket-driver": "^0.7.4" } }, + "sortablejs": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.6.tgz", + "integrity": "sha512-aNfiuwMEpfBM/CN6LY0ibyhxPfPbyFeBTYJKCvzkJ2GkUpazIt3H+QIPAMHwqQ7tMKaHz1Qj+rJJCqljnf4p3A==", + "peer": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -23182,8 +28338,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "stack-utils": { "version": "2.0.5", @@ -23316,12 +28471,23 @@ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, + "strnum": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", + "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==" + }, "style-loader": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", "requires": {} }, + "style-observer": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/style-observer/-/style-observer-0.0.8.tgz", + "integrity": "sha512-UaIPn33Sx4BJ+goia51Q++VFWoplWK1995VdxQYzwwbFa+FUNLKlG+aiIdG2Vw7VyzIUBi8tqu8mTyg0Ppu6Yg==", + "peer": true + }, "styled-components": { "version": "5.3.5", "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-5.3.5.tgz", @@ -23392,12 +28558,24 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, + "svg-arc-to-cubic-bezier": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.2.0.tgz", + "integrity": "sha512-djbJ/vZKZO+gPoSDThGNpKDO+o+bAeA4XQKovvkNCqnIS2t+S4qnLAGQhyyrulhCFRl1WWzAp0wUDV8PpTVU3g==", + "peer": true + }, "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, + "tabbable": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", + "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", + "peer": true + }, "table-layout": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-4.1.1.tgz", @@ -23537,6 +28715,25 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" }, + "texture-compressor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/texture-compressor/-/texture-compressor-1.0.2.tgz", + "integrity": "sha512-dStVgoaQ11mA5htJ+RzZ51ZxIZqNOgWKAIvtjLrW1AliQQLCmrDqNzQZ8Jh91YealQ95DXt4MEduLzJmbs6lig==", + "requires": { + "argparse": "^1.0.10", + "image-size": "^0.7.4" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + } + } + }, "throat": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz", @@ -23548,6 +28745,18 @@ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, + "timezone-groups": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/timezone-groups/-/timezone-groups-0.10.4.tgz", + "integrity": "sha512-AnkJYrbb7uPkDCEqGeVJiawZNiwVlSkkeX4jZg1gTEguClhyX+/Ezn07KB6DT29tG3UN418ldmS/W6KqGOTDjg==", + "peer": true + }, + "tiny-inflate": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", + "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==", + "peer": true + }, "tinyqueue": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-3.0.0.tgz", @@ -23737,11 +28946,39 @@ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==" }, + "unicode-properties": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unicode-properties/-/unicode-properties-1.4.1.tgz", + "integrity": "sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==", + "peer": true, + "requires": { + "base64-js": "^1.3.0", + "unicode-trie": "^2.0.0" + } + }, "unicode-property-aliases-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==" }, + "unicode-trie": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-2.0.0.tgz", + "integrity": "sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==", + "peer": true, + "requires": { + "pako": "^0.2.5", + "tiny-inflate": "^1.0.0" + }, + "dependencies": { + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", + "peer": true + } + } + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -24185,6 +29422,11 @@ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" }, + "wgsl_reflect": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/wgsl_reflect/-/wgsl_reflect-1.2.3.tgz", + "integrity": "sha512-BQWBIsOn411M+ffBxmA6QRLvAOVbuz3Uk4NusxnqC1H7aeQcVLhdA3k2k/EFFFtqVjhz3z7JOOZF1a9hj2tv4Q==" + }, "whatwg-encoding": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", @@ -24305,6 +29547,33 @@ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, + "xmldoc": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-2.0.3.tgz", + "integrity": "sha512-6gRk4NY/Jvg67xn7OzJuxLRsGgiXBaPUQplVJ/9l99uIugxh4FTOewYz5ic8WScj7Xx/2WvhENiQKwkK9RpE4w==", + "peer": true, + "requires": { + "sax": "^1.4.3" + } + }, + "xss": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/xss/-/xss-1.0.13.tgz", + "integrity": "sha512-clu7dxTm1e8Mo5fz3n/oW3UCXBfV89xZ72jM8yzo1vR/pIS0w3sgB3XV2H8Vm6zfGnHL0FzvLJPJEBhd86/z4Q==", + "peer": true, + "requires": { + "commander": "^2.20.3", + "cssfilter": "0.0.10" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "peer": true + } + } + }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -24343,6 +29612,12 @@ "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", "dev": true }, + "zstd-codec": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/zstd-codec/-/zstd-codec-0.1.5.tgz", + "integrity": "sha512-v3fyjpK8S/dpY/X5WxqTK3IoCnp/ZOLxn144GZVlNUjtwAchzrVo03h+oMATFhCIiJ5KTr4V3vDQQYz4RU684g==", + "optional": true + }, "zustand": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.8.tgz", diff --git a/package.json b/package.json index 719e70e..dafae1d 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "css-loader": "^6.5.1", "d3-array": "^3.2.4", "d3-time-format": "^4.1.0", + "deck.gl": "^9.2.5", "dotenv": "^16.0.1", "eslint-config-react-app": "^7.0.1", "file-loader": "^6.2.0", @@ -63,6 +64,7 @@ "@testing-library/jest-dom": "^5.16.4", "@testing-library/react": "^13.2.0", "@testing-library/user-event": "^14.2.0", + "@welldone-software/why-did-you-render": "^8.0.3", "babel-jest": "^28.1.0", "babel-loader": "^8.2.5", "babel-plugin-prismjs": "^2.1.0", diff --git a/reactapp/App.scss b/reactapp/App.scss index eee4733..b609462 100644 --- a/reactapp/App.scss +++ b/reactapp/App.scss @@ -71,7 +71,7 @@ $theme-colors: ( /* extras used in components */ --panel-background: #{$primary}; --panel-border-color: #{$primary}; - --muted-text: #9ca3af; + --muted-text: #212121; --offcanvas-bg: #ffffff; --offcanvas-border-color: #dee2e6; @@ -169,7 +169,7 @@ $theme-colors: ( --panel-background: #{$secondary}; --panel-border-color: #{$secondary}; - --muted-text: #9ca3af; + --muted-text: #ffff; --offcanvas-bg: #2c3e50; --offcanvas-border-color: #333333; diff --git a/reactapp/config/development.env b/reactapp/config/development.env index 0328744..56d0e2d 100644 --- a/reactapp/config/development.env +++ b/reactapp/config/development.env @@ -3,4 +3,5 @@ TETHYS_APP_ID = nrds TETHYS_APP_PACKAGE = nrds TETHYS_APP_ROOT_URL = /apps/nrds/ TETHYS_LOADER_DELAY = 500 -TETHYS_PORTAL_HOST = "" \ No newline at end of file +TETHYS_PORTAL_HOST = "" +NODE_ENV = development \ No newline at end of file diff --git a/reactapp/config/webpack.config.js b/reactapp/config/webpack.config.js index 0bdcfe0..e0be549 100644 --- a/reactapp/config/webpack.config.js +++ b/reactapp/config/webpack.config.js @@ -1,8 +1,6 @@ const path = require('path'); const webpack = require('webpack'); -// const WebpackBundleAnalyzer = require("webpack-bundle-analyzer").BundleAnalyzerPlugin; // Uncomment to analyze bundle size const Dotenv = require('dotenv-webpack'); -// const TerserPlugin = require("terser-webpack-plugin"); module.exports = (env, argv) => { const dotEnvPath = `./reactapp/config/${argv.mode}.env`; @@ -78,6 +76,25 @@ module.exports = (env, argv) => { }, ], }, + { + test: /\.(js|jsx)$/, + exclude: /node_modules/, + use: + { + loader: 'babel-loader', + options: { + presets: [ + ['@babel/preset-env'], + ['@babel/preset-react', { + runtime: 'automatic', + development: argv.mode === 'development', + importSource: '@welldone-software/why-did-you-render', + }], + ], + }, + }, + } + ], }, optimization: { @@ -94,15 +111,6 @@ module.exports = (env, argv) => { ], open: true, } - - // devServer: { - // proxy: { - // '!/static/nrds/frontend/**': { - // target: 'http://127.0.0.1:8000', // points to django dev server - // changeOrigin: true, - // }, - // }, - // open: true, - // }, + } }; diff --git a/reactapp/features/DataStream/components/MenuList.js b/reactapp/features/DataStream/components/MenuList.js new file mode 100644 index 0000000..7170c1d --- /dev/null +++ b/reactapp/features/DataStream/components/MenuList.js @@ -0,0 +1,77 @@ +import React, { useMemo, useContext } from "react"; +import { FixedSizeList as List } from "react-window"; + +const ROW_HEIGHT = 28; + +// Context used to pass react-select's innerProps to the react-window outer element +const OuterElementContext = React.createContext({}); + +const OuterElementType = React.forwardRef(function OuterElementType(props, ref) { + const outerProps = useContext(OuterElementContext); + return
; +}); + +const Row = React.memo(function Row({ index, style, data }) { + // data is an array of react-select option elements + return
{data[index]}
; +}); + +function MenuListInner (props) { + const { options, children, maxHeight, getValue, innerRef, innerProps } = props; + + const childArray = useMemo(() => React.Children.toArray(children), [children]); + const itemCount = childArray.length; + + // compute initial scroll offset + const initialOffset = useMemo(() => { + const [value] = getValue(); + const selected = value?.value; + const idx = Math.max(0, options.findIndex((o) => o.value === selected)); + return idx * ROW_HEIGHT; + }, [getValue, options]); + + const height = useMemo( + () => Math.min(itemCount * ROW_HEIGHT, maxHeight), + [itemCount, maxHeight] + ); + + return ( + + + {Row} + + + ); +} + + +const areEqualMenuList = (prev, next) => { + // compare list geometry/content drivers + if (prev.maxHeight !== next.maxHeight) return false; + if (prev.options !== next.options) return false; // assumes optionsList is stable ref (recommended) + if (React.Children.count(prev.children) !== React.Children.count(next.children)) return false; + + const prevSel = prev.getValue?.()?.[0]?.value; + const nextSel = next.getValue?.()?.[0]?.value; + if (prevSel !== nextSel) return false; + + // compare only stable a11y fields from innerProps (ignore function identity churn) + const p = prev.innerProps || {}; + const n = next.innerProps || {}; + return ( + p.id === n.id && + p.role === n.role && + p["aria-multiselectable"] === n["aria-multiselectable"] + ); +}; + +export const MenuList = React.memo(MenuListInner, areEqualMenuList); diff --git a/reactapp/features/DataStream/components/Modals.js b/reactapp/features/DataStream/components/Modals.js index 796c7e2..8f5ef73 100644 --- a/reactapp/features/DataStream/components/Modals.js +++ b/reactapp/features/DataStream/components/Modals.js @@ -105,7 +105,7 @@ export const DataInfoModel = (props) => { {' '} and represent the dates, models, and forecast for which data are available.

-

Note: Data are only available for certain dates based on the chosen model and forecast per individual VPU. Please verify a date’s availability before you proceed.

+

Note: Data are only available for certain dates based on the chosen model and forecast per individual VPU. Please verify a date's availability before you proceed.

diff --git a/reactapp/features/DataStream/components/SelectComponent.js b/reactapp/features/DataStream/components/SelectComponent.js index 062aa3f..27921a9 100644 --- a/reactapp/features/DataStream/components/SelectComponent.js +++ b/reactapp/features/DataStream/components/SelectComponent.js @@ -1,137 +1,49 @@ -import React, { Component, useCallback } from 'react'; +import React, { Component, useMemo } from 'react'; import Select, { createFilter } from 'react-select'; import { FixedSizeList as List } from 'react-window'; -// import useTheme from 'hooks/useTheme'; -const height = 28; +const ROW_HEIGHT = 28; +const LIST_STYLE = { overflowX: "hidden" }; -class MenuList extends Component { - render() { - const { options, children, maxHeight, getValue } = this.props; - const [value] = getValue(); - const initialOffset = options.indexOf(value) * height; - - const adjustedHeight = Math.min(children.length * height, maxHeight); - - return ( - - {({ index, style }) =>
{children[index]}
} -
- ); - } -} - -// // theme-aware styles -// const customStyles = (theme, width = 150) => { -// // const isDark = theme === 'dark'; - -// const controlBg = isDark ? '#2c3e50' : '#ffffff'; -// const controlBorder = isDark ? '#4f5b67' : '#cccccc'; -// const textColor = isDark ? '#ecf0f1' : '#000000'; -// const placeholderColor = isDark ? '#b0bec5' : '#666666'; -// const menuBg = isDark ? '#2c3e50' : '#ffffff'; -// const optionHoverBg = isDark ? '#34495e' : 'rgba(38,132,255,0.1)'; -// const optionSelectedBg = isDark ? '#1abc9c' : '#2684ff'; - -// return { -// container: (base) => ({ -// ...base, -// width, -// fontSize: 12, -// }), - -// control: (base, state) => ({ -// ...base, -// minHeight: 28, -// height: 28, -// fontSize: 12, -// borderRadius: 4, -// paddingTop: 0, -// paddingBottom: 0, -// backgroundColor: controlBg, -// borderColor: state.isFocused ? '#2684ff' : controlBorder, -// boxShadow: state.isFocused ? '0 0 0 1px #2684ff' : 'none', -// '&:hover': { -// borderColor: '#2684ff', -// }, -// }), +const Row = React.memo(function Row({ index, style, data }) { + return
{data.children[index]}
; +}); -// valueContainer: (base) => ({ -// ...base, -// padding: '0 6px', -// }), +const MenuList = React.memo(function MenuList(props) { + const { options, children, maxHeight, getValue } = props; -// indicatorsContainer: (base) => ({ -// ...base, -// height: 28, -// }), -// dropdownIndicator: (base) => ({ -// ...base, -// padding: '0 4px', -// }), -// clearIndicator: (base) => ({ -// ...base, -// padding: '0 4px', -// }), + const childArray = useMemo(() => React.Children.toArray(children), [children]); + const itemCount = childArray.length; -// singleValue: (base) => ({ -// ...base, -// color: textColor, -// maxWidth: '100%', -// whiteSpace: 'nowrap', -// overflow: 'hidden', -// textOverflow: 'ellipsis', -// }), - -// input: (base) => ({ -// ...base, -// color: textColor, -// margin: 0, -// padding: 0, -// }), + // Compute initial scroll offset based on selected option + const initialOffset = useMemo(() => { + const [value] = getValue(); + const selected = value?.value; + const idx = Math.max(0, options.findIndex((o) => o.value === selected)); + return idx * ROW_HEIGHT; + }, [getValue, options]); + + const adjustedHeight = useMemo( + () => Math.min(itemCount * ROW_HEIGHT, maxHeight), + [itemCount, maxHeight] + ); -// placeholder: (base) => ({ -// ...base, -// fontSize: 12, -// color: placeholderColor, -// }), + const itemData = useMemo(() => ({ children: childArray }), [childArray]); -// menuPortal: (base) => ({ ...base, zIndex: 9999 }), -// menu: (base) => ({ -// ...base, -// overflowY: 'auto', -// fontSize: 12, -// backgroundColor: menuBg, -// }), -// menuList: (base) => ({ -// ...base, -// paddingTop: 0, -// paddingBottom: 0, -// }), + return ( + + {Row} + + ); +}); -// option: (base, state) => ({ -// ...base, -// fontSize: 12, -// padding: '4px 8px', -// width: '100%', -// whiteSpace: 'nowrap', -// overflow: 'hidden', -// textOverflow: 'ellipsis', -// color: state.isSelected ? '#ffffff' : textColor, -// backgroundColor: state.isSelected -// ? optionSelectedBg -// : state.isFocused -// ? optionHoverBg -// : menuBg, -// }), -// }; -// }; const customStyles = (width = 150) => { return { container: (base) => ({ @@ -228,22 +140,25 @@ const SelectComponent = ({ width = 150, }) => { + const components = useMemo(() => ({ MenuList }), []); - const handleChange = useCallback( - (option) => { - onChangeHandler([option]); - }, + const styles = useMemo(() => customStyles(width), [width]); + const filterOption = useMemo( + () => createFilter({ ignoreAccents: false }), + [] + ); + const onChange = React.useCallback( + (opt) => onChangeHandler(opt), [onChangeHandler] ); - return ( + + +
+ + + + + +
+ +
+ + + {playSpeed}x +
+ + ); +}); diff --git a/reactapp/features/DataStream/components/forecast/TimeseriesCard.js b/reactapp/features/DataStream/components/forecast/TimeseriesCard.js index aea4b03..7d57142 100644 --- a/reactapp/features/DataStream/components/forecast/TimeseriesCard.js +++ b/reactapp/features/DataStream/components/forecast/TimeseriesCard.js @@ -1,15 +1,35 @@ -import { Fragment, Suspense } from 'react'; +import { Fragment, Suspense, useMemo, useCallback } from 'react'; import { TimeSeriesContainer } from '../styles/Styles'; import useTimeSeriesStore from 'features/DataStream/store/Timeseries'; import LoadingAnimation from 'features/Tethys/components/loader/LoadingAnimation'; import ParentSize from '@visx/responsive/lib/components/ParentSize'; import LineChart from 'features/DataStream/components/forecast/Plot'; +import { useShallow } from 'zustand/react/shallow'; const TimeSeriesCard = () => { - const series = useTimeSeriesStore((state) => state.series); - const variable = useTimeSeriesStore((state) => state.variable); - const layout = useTimeSeriesStore((state) => state.layout); + const { series, variable, layout } = useTimeSeriesStore(useShallow((state) => ({ + series: state.series, + variable: state.variable, + layout: state.layout, + }))); + + const chartData = useMemo(() => { + return [ + { + label: variable, + data: series, + }, + ]; + }, [series, variable]); + + const renderChart = useCallback( + ({ width, height }) => ( + + ), + [chartData, layout] + ); + return ( @@ -17,26 +37,9 @@ const TimeSeriesCard = () => { }> - {({ width, height }) => - ( - - ) - } + {renderChart} - } diff --git a/reactapp/features/DataStream/components/forecast/cacheHandler.js b/reactapp/features/DataStream/components/forecast/cacheHandler.js deleted file mode 100644 index e35187d..0000000 --- a/reactapp/features/DataStream/components/forecast/cacheHandler.js +++ /dev/null @@ -1,60 +0,0 @@ -// ResetDataButton.js -import React, { useState } from 'react'; -import { StyledButton } from 'features/Tethys/components/Styles'; -import { dropAllVpuDataTables } from 'features/DataStream/lib/queryData'; -import { resetDatabase } from 'features/DataStream/lib/duckdbClient'; -import { DeleteDataIcon } from 'features/DataStream/lib/layers'; -const ResetDataButton = () => { - const [isResetting, setIsResetting] = useState(false); - const [error, setError] = useState(null); - - const handleResetClick = async () => { - const confirmed = window.confirm( - 'This will drop all VPU data tables and reset the in-memory DuckDB database.\n\n' + - 'The index_data_table will be preserved.\n\n' + - 'Do you want to continue?' - ); - - if (!confirmed) return; - - setIsResetting(true); - setError(null); - - try { - await dropAllVpuDataTables(); - await resetDatabase(); - console.log('Data reset complete.'); - } catch (err) { - console.error('Error while resetting data:', err); - setError('Failed to reset data. Check the console for details.'); - } finally { - setIsResetting(false); - } - }; - - return ( -
- - {isResetting ? 'Resetting…' : } - - - {error && ( - - {error} - - )} -
- ); -}; - -export default ResetDataButton; diff --git a/reactapp/features/DataStream/components/forecast/cacheTable.js b/reactapp/features/DataStream/components/forecast/cacheTable.js new file mode 100644 index 0000000..f6af2d4 --- /dev/null +++ b/reactapp/features/DataStream/components/forecast/cacheTable.js @@ -0,0 +1,96 @@ +import React, { Fragment, useCallback } from 'react'; +import { IoFolderOpenOutline, IoClose, IoSkullOutline } from "react-icons/io5"; +import { IconLabel, Title, SButton } from '../styles/Styles'; +import { useCacheTablesStore } from 'features/DataStream/store/CacheTables'; + +export const CacheTable = React.memo(({tables}) => { + const deleteCacheTable = useCacheTablesStore((state) => state.delete_cacheTable); + const resetCacheTables = useCacheTablesStore((state) => state.reset); + + const deleteSingleCache = useCallback( + async (tableId) => { + console.log("Delete cache table:", tableId); + deleteCacheTable(tableId); + }, + [deleteCacheTable] + ); + + const deleteAllCache = useCallback(async () => { + console.log("Delete all cache tables"); + resetCacheTables(); + }, [resetCacheTables]); + + + return ( + + + + Files Loaded + deleteAllCache()} > + + + + + + {tables && tables.length > 0 ? ( + + + + + + + + + + {tables.map((table, index) => ( + + + + + + ))} + +
FileSize
+ { + deleteSingleCache(table.id); + }}> + + + + {table.name || 'Unknown'} + + {table.size || 'N/A'} +
+ ) : ( +
No cached tables available.
+ )} +
+ ); +}); diff --git a/reactapp/features/DataStream/components/forecast/dataMenu.js b/reactapp/features/DataStream/components/forecast/dataMenu.js new file mode 100644 index 0000000..1e4658d --- /dev/null +++ b/reactapp/features/DataStream/components/forecast/dataMenu.js @@ -0,0 +1,530 @@ +// DataMenu.js +import React, { Fragment, useMemo } from 'react'; +import { Spinner } from 'react-bootstrap'; +import { XButton, LoadingMessage, Row, IconLabel } from '../styles/Styles'; +import SelectComponent from '../SelectComponent'; +import { getOptionsFromURL, makePrefix } from 'features/DataStream/lib/s3Utils'; +import { getCacheKey } from 'features/DataStream/lib/opfsCache'; +import useTimeSeriesStore from 'features/DataStream/store/Timeseries'; +import useDataStreamStore from 'features/DataStream/store/Datastream'; +import useS3DataStreamBucketStore from 'features/DataStream/store/s3Store'; +import { useShallow } from 'zustand/react/shallow'; +import { + ModelIcon, + DateIcon, + ForecastIcon, + CycleIcon, + EnsembleIcon, + FileIcon +} from 'features/DataStream/lib/layers'; + +// -------------------- helpers -------------------- +const firstOpt = (v) => (Array.isArray(v) ? v[0] : v); + +function useEvent(fn) { + const ref = React.useRef(fn); + React.useLayoutEffect(() => { + ref.current = fn; + }); + return React.useCallback((...args) => ref.current(...args), []); +} + +const DataMenuLoading = React.memo(function DataMenuLoading() { + const { loading, loadingText } = useTimeSeriesStore( + useShallow((s) => ({ + loading: s.loading, + loadingText: s.loadingText, + })) + ); + + return ( + + {loading && ( + <> + + ); +}); + +const DataMenuControls = React.memo(function DataMenuControls() { + const { vpu, date, forecast, ensemble, cycle, model, outputFile } = + useDataStreamStore( + useShallow((state) => ({ + vpu: state.vpu, + date: state.date, + forecast: state.forecast, + ensemble: state.ensemble, + cycle: state.cycle, + model: state.model, + outputFile: state.outputFile, + })) + ); + + // setters + const { + set_date, + set_forecast, + set_ensemble, + set_cycle, + set_model, + set_outputFile, + set_cache_key, + } = useDataStreamStore( + useShallow((state) => ({ + set_date: state.set_date, + set_forecast: state.set_forecast, + set_ensemble: state.set_ensemble, + set_cycle: state.set_cycle, + set_model: state.set_model, + set_outputFile: state.set_outputFile, + set_cache_key: state.set_cache_key, + })) + ); + + const feature_id = useTimeSeriesStore((s) => s.feature_id); + + const { + availableModelsList, + availableDatesList, + availableForecastList, + availableCyclesList, + availableEnsembleList, + availableOutputFiles, + } = useS3DataStreamBucketStore( + useShallow((state) => ({ + availableModelsList: state.models, + availableDatesList: state.dates, + availableForecastList: state.forecasts, + availableCyclesList: state.cycles, + availableEnsembleList: state.ensembles, + availableOutputFiles: state.outputFiles, + })) + ); + + const { + set_prefix, + setForecastOptions, + setAvailableDatesList, + setAvailableCyclesList, + setAvailableEnsembleList, + setAvailableOutputFiles, + } = useS3DataStreamBucketStore( + useShallow((state) => ({ + set_prefix: state.set_prefix, + setForecastOptions: state.set_forecasts, + setAvailableDatesList: state.set_dates, + setAvailableCyclesList: state.set_cycles, + setAvailableEnsembleList: state.set_ensembles, + setAvailableOutputFiles: state.set_outputFiles, + })) + ); + + const handleVisulization = useEvent(async () => { + const { loading, set_loading_text } = useTimeSeriesStore.getState(); + if (!feature_id || !vpu) { + set_loading_text('Please select a feature on the map first'); + set_loading_text(''); + return; + } + if (!outputFile) { + set_loading_text('No Output File selected'); + set_loading_text(''); + return; + } + if (loading) { + set_loading_text('Data is already loading, please wait...'); + set_loading_text(''); + return; + } + + const cacheKey = getCacheKey(model, date, forecast, cycle, ensemble, vpu, outputFile); + set_cache_key(cacheKey); + + const _prefix = makePrefix(model, date, forecast, cycle, ensemble, vpu, outputFile); + set_prefix(_prefix); + }); + + const handleChangeModel = useEvent(async (v) => { + const opt = firstOpt(v); + if (!opt) return; + + set_model(opt.value); + + const datesOptions = await getOptionsFromURL(`outputs/${opt.value}/v2.2_hydrofabric/`); + const nextDate = datesOptions[0]?.value ?? ''; + setAvailableDatesList(datesOptions); + set_date(nextDate); + + + const forecastOptions = await getOptionsFromURL(`outputs/${opt.value}/v2.2_hydrofabric/${nextDate}/`); + const nextForecast = forecastOptions[0]?.value ?? ''; + setForecastOptions(forecastOptions); + set_forecast(nextForecast); + + const cycleOptions = await getOptionsFromURL( + `outputs/${opt.value}/v2.2_hydrofabric/${nextDate}/${nextForecast}/` + ); + setAvailableCyclesList(cycleOptions); + + const nextCycle = cycleOptions[0]?.value ?? ''; + set_cycle(nextCycle); + + if (nextForecast === 'medium_range') { + const ensembleOptions = await getOptionsFromURL( + `outputs/${opt.value}/v2.2_hydrofabric/${nextDate}/${nextForecast}/${nextCycle}/` + ); + setAvailableEnsembleList(ensembleOptions); + const nextEns = ensembleOptions[0]?.value ?? ''; + set_ensemble(nextEns); + + const outputFileOptions = await getOptionsFromURL( + `outputs/${opt.value}/v2.2_hydrofabric/${nextDate}/${nextForecast}/${nextCycle}/${nextEns}/${vpu}/ngen-run/outputs/troute/` + ); + setAvailableOutputFiles(outputFileOptions); + set_outputFile(outputFileOptions[0]?.value ?? ''); + } else { + setAvailableEnsembleList([]); + set_ensemble(''); + + const outputFileOptions = await getOptionsFromURL( + `outputs/${opt.value}/v2.2_hydrofabric/${nextDate}/${nextForecast}/${nextCycle}/${vpu}/ngen-run/outputs/troute/` + ); + setAvailableOutputFiles(outputFileOptions); + set_outputFile(outputFileOptions[0]?.value ?? ''); + } + + }); + + const handleChangeDate = useEvent(async (v) => { + const opt = firstOpt(v); + if (!opt) return; + + set_date(opt.value); + + const forecastOptions = await getOptionsFromURL(`outputs/${model}/v2.2_hydrofabric/${opt.value}/`); + const nextForecast = forecastOptions[0]?.value ?? ''; + setForecastOptions(forecastOptions); + set_forecast(nextForecast); + + const cycleOptions = await getOptionsFromURL( + `outputs/${model}/v2.2_hydrofabric/${opt.value}/${nextForecast}/` + ); + setAvailableCyclesList(cycleOptions); + + const nextCycle = cycleOptions[0]?.value ?? ''; + set_cycle(nextCycle); + + if (nextForecast === 'medium_range') { + const ensembleOptions = await getOptionsFromURL( + `outputs/${model}/v2.2_hydrofabric/${opt.value}/${nextForecast}/${nextCycle}/` + ); + setAvailableEnsembleList(ensembleOptions); + const nextEns = ensembleOptions[0]?.value ?? ''; + set_ensemble(nextEns); + + const outputFileOptions = await getOptionsFromURL( + `outputs/${model}/v2.2_hydrofabric/${opt.value}/${nextForecast}/${nextCycle}/${nextEns}/${vpu}/ngen-run/outputs/troute/` + ); + setAvailableOutputFiles(outputFileOptions); + set_outputFile(outputFileOptions[0]?.value ?? ''); + } else { + setAvailableEnsembleList([]); + set_ensemble(''); + + const outputFileOptions = await getOptionsFromURL( + `outputs/${model}/v2.2_hydrofabric/${opt.value}/${nextForecast}/${nextCycle}/${vpu}/ngen-run/outputs/troute/` + ); + setAvailableOutputFiles(outputFileOptions); + set_outputFile(outputFileOptions[0]?.value ?? ''); + } + + }); + + const handleChangeForecast = useEvent(async (v) => { + const opt = firstOpt(v); + if (!opt) return; + + set_forecast(opt.value); + + const cycleOptions = await getOptionsFromURL( + `outputs/${model}/v2.2_hydrofabric/${date}/${opt.value}/` + ); + setAvailableCyclesList(cycleOptions); + const nextCycle = cycleOptions[0]?.value ?? ''; + set_cycle(nextCycle); + + if (opt.value === 'medium_range') { + const ensembleOptions = await getOptionsFromURL( + `outputs/${model}/v2.2_hydrofabric/${date}/${opt.value}/${nextCycle}/` + ); + setAvailableEnsembleList(ensembleOptions); + const nextEns = ensembleOptions[0]?.value ?? ''; + set_ensemble(nextEns); + + const outputFileOptions = await getOptionsFromURL( + `outputs/${model}/v2.2_hydrofabric/${date}/${opt.value}/${nextCycle}/${nextEns}/${vpu}/ngen-run/outputs/troute/` + ); + setAvailableOutputFiles(outputFileOptions); + set_outputFile(outputFileOptions[0]?.value ?? ''); + } else { + setAvailableEnsembleList([]); + set_ensemble(''); + + const outputFileOptions = await getOptionsFromURL( + `outputs/${model}/v2.2_hydrofabric/${date}/${opt.value}/${nextCycle}/${vpu}/ngen-run/outputs/troute/` + ); + setAvailableOutputFiles(outputFileOptions); + set_outputFile(outputFileOptions[0]?.value ?? ''); + } + }); + + const handleChangeCycle = useEvent(async (v) => { + const opt = firstOpt(v); + if (!opt) return; + + set_cycle(opt.value); + + if (forecast === 'medium_range') { + const ensembleOptions = await getOptionsFromURL( + `outputs/${model}/v2.2_hydrofabric/${date}/${forecast}/${opt.value}/` + ); + setAvailableEnsembleList(ensembleOptions); + const nextEns = ensembleOptions[0]?.value ?? ''; + set_ensemble(nextEns); + + const outputFileOptions = await getOptionsFromURL( + `outputs/${model}/v2.2_hydrofabric/${date}/${forecast}/${opt.value}/${nextEns}/${vpu}/ngen-run/outputs/troute/` + ); + setAvailableOutputFiles(outputFileOptions); + set_outputFile(outputFileOptions[0]?.value ?? ''); + } else { + setAvailableEnsembleList([]); + set_ensemble(''); + + const outputFileOptions = await getOptionsFromURL( + `outputs/${model}/v2.2_hydrofabric/${date}/${forecast}/${opt.value}/${vpu}/ngen-run/outputs/troute/` + ); + setAvailableOutputFiles(outputFileOptions); + set_outputFile(outputFileOptions[0]?.value ?? ''); + } + }); + + const handleChangeEnsemble = useEvent(async (v) => { + const opt = firstOpt(v); + if (!opt) return; + + set_ensemble(opt.value); + + const outputFileOptions = await getOptionsFromURL( + `outputs/${model}/v2.2_hydrofabric/${date}/${forecast}/${cycle}/${opt.value}/${vpu}/ngen-run/outputs/troute/` + ); + setAvailableOutputFiles(outputFileOptions); + set_outputFile(outputFileOptions[0]?.value ?? ''); + }); + + const handleChangeOutputFile = useEvent((v) => { + const opt = firstOpt(v); + if (!opt) return; + set_outputFile(opt.value); + }); + + // -------------------- selected values -------------------- + const selectedDateOption = useMemo( + () => + availableDatesList.find((opt) => opt.value === date) ?? + availableDatesList[0] ?? + null, + [date, availableDatesList] + ); + + const selectedForecastOption = useMemo( + () => + availableForecastList.find((opt) => opt.value === forecast) ?? + availableForecastList[0] ?? + null, + [forecast, availableForecastList] + ); + + const selectedModelOption = useMemo( + () => + availableModelsList.find((opt) => opt.value === model) ?? + availableModelsList[0] ?? + null, + [model, availableModelsList] + ); + + const selectedCycleOption = useMemo( + () => + availableCyclesList.find((opt) => opt.value === cycle) ?? + availableCyclesList[0] ?? + null, + [availableCyclesList, cycle] + ); + + const selectedEnsembleOption = useMemo( + () => + availableEnsembleList.find((opt) => opt.value === ensemble) ?? + availableEnsembleList[0] ?? + null, + [availableEnsembleList, ensemble] + ); + + const selectedOutputFileOption = useMemo( + () => + availableOutputFiles.find((opt) => opt.value === outputFile) ?? + availableOutputFiles[0] ?? + null, + [availableOutputFiles, outputFile] + ); + + const rows = useMemo(() => { + const out = []; + + if (availableModelsList?.length > 0) { + out.push({ + key: 'model', + label: ( + <> + Model + + ), + options: availableModelsList, + value: selectedModelOption, + onChange: handleChangeModel, + }); + } + + if (availableDatesList?.length > 0) { + out.push({ + key: 'date', + label: ( + <> + Date + + ), + options: availableDatesList, + value: selectedDateOption, + onChange: handleChangeDate, + }); + } + + if (availableForecastList?.length > 0) { + out.push({ + key: 'forecast', + label: ( + <> + Forecast + + ), + options: availableForecastList, + value: selectedForecastOption, + onChange: handleChangeForecast, + }); + } + + if (availableCyclesList?.length > 0) { + out.push({ + key: 'cycle', + label: ( + <> + Cycle + + ), + options: availableCyclesList, + value: selectedCycleOption, + onChange: handleChangeCycle, + }); + } + + if (availableEnsembleList?.length > 0) { + out.push({ + key: 'ensemble', + label: ( + <> + Ensembles + + ), + options: availableEnsembleList, + value: selectedEnsembleOption, + onChange: handleChangeEnsemble, + }); + } + + if (availableOutputFiles?.length > 0) { + out.push({ + key: 'outputFile', + label: ( + <> + Output File + + ), + options: availableOutputFiles, + value: selectedOutputFileOption, + onChange: handleChangeOutputFile, + }); + } + + return out; + }, [ + availableModelsList, + availableDatesList, + availableForecastList, + availableCyclesList, + availableEnsembleList, + availableOutputFiles, + selectedModelOption, + selectedDateOption, + selectedForecastOption, + selectedCycleOption, + selectedEnsembleOption, + selectedOutputFileOption, + handleChangeModel, + handleChangeDate, + handleChangeForecast, + handleChangeCycle, + handleChangeEnsemble, + handleChangeOutputFile, + ]); + + return ( + + {rows.map((r) => ( + + {r.label} + + + ))} + + {availableOutputFiles?.length > 0 ? null :

No Outputs Available

} + +
+ Update +
+
+ ); +}); + + +function DataMenu() { + return ( + <> + + + + ); +} + +export default React.memo(DataMenu); diff --git a/reactapp/features/DataStream/components/forecast/variablesMenu.js b/reactapp/features/DataStream/components/forecast/variablesMenu.js new file mode 100644 index 0000000..2f1c273 --- /dev/null +++ b/reactapp/features/DataStream/components/forecast/variablesMenu.js @@ -0,0 +1,77 @@ +import React, { useMemo, Fragment, useCallback } from 'react'; +import { Row, IconLabel } from '../styles/Styles'; +import SelectComponent from '../SelectComponent'; +import { getTimeseries} from 'features/DataStream/lib/queryData'; +import useTimeSeriesStore from 'features/DataStream/store/Timeseries'; +import useDataStreamStore from 'features/DataStream/store/Datastream'; +import { useShallow } from 'zustand/react/shallow'; +import { makeTitle } from 'features/DataStream/lib/utils'; +import { + VariableIcon, +} from 'features/DataStream/lib/layers'; + +function VariablesMenu() { + + const{ forecast, variables, cacheKey } = useDataStreamStore( + useShallow((state) => ({ + forecast: state.forecast, + variables: state.variables, + cacheKey: state.cache_key, + })) + ); + + const { variable, set_variable, set_series, set_layout, feature_id } = useTimeSeriesStore( + useShallow((state) => ({ + variable: state.variable, + set_variable: state.set_variable, + set_series: state.set_series, + set_layout: state.set_layout, + feature_id: state.feature_id, + })) + ); + + const availableVariablesList = useMemo(() => { + return variables.map((v) => ({ value: v, label: v })); + }, [variables]); + + const selectedVariableOption = useMemo(() => { + const opts = availableVariablesList || []; + return opts.find((opt) => opt.value === variable) ?? null; + } + , [variables, variable]); + + const handleChangeVariable = useCallback(async (evt) => { + const opt = evt || availableVariablesList?.[0]; + if (opt) set_variable(opt.value); + const id = feature_id.split('-')[1]; + const series = await getTimeseries(id, cacheKey, opt.value); + const xy = series.map((d) => ({ + x: new Date(d.time), + y: d[opt.value], + })); + set_series(xy); + set_layout({ + 'yaxis': opt.value, + 'xaxis': "Time", + 'title': makeTitle(forecast, feature_id), + }); + }, [availableVariablesList]); + + return ( + + { availableVariablesList.length > 0 && ( + + Variable + + + )} + + ); +} + + +export default React.memo(VariablesMenu); \ No newline at end of file diff --git a/reactapp/features/DataStream/components/map/LayersControl.js b/reactapp/features/DataStream/components/map/LayersControl.js index b4d71b8..b598f7c 100644 --- a/reactapp/features/DataStream/components/map/LayersControl.js +++ b/reactapp/features/DataStream/components/map/LayersControl.js @@ -3,7 +3,7 @@ import { Fragment, useMemo, useState } from 'react'; import { Switch } from '../styles/Styles'; import { IoLayers } from "react-icons/io5"; import { MdInfoOutline } from "react-icons/md"; -import { IconLabel, Row, Title, SButton, Content } from '../styles/Styles'; +import { IconLabel, Row, Title, SButton} from '../styles/Styles'; import { NexusSymbol, CatchmentSymbol, FlowPathSymbol, GaugeSymbol, symbologyColors, CursorSymbol } from '../../lib/layers'; import useTheme from 'hooks/useTheme'; import { LayerInfoModal } from '../Modals'; diff --git a/reactapp/features/DataStream/components/map/MapLayers.js b/reactapp/features/DataStream/components/map/MapLayers.js index 8d4be59..7b0d383 100644 --- a/reactapp/features/DataStream/components/map/MapLayers.js +++ b/reactapp/features/DataStream/components/map/MapLayers.js @@ -69,6 +69,7 @@ export function useFlowPathsLayer({ isFlowPathsVisible, flowpathsLineColor }) { if (!isFlowPathsVisible) return null; return ( + // null diff --git a/reactapp/features/DataStream/components/map/Mapg.js b/reactapp/features/DataStream/components/map/Mapg.js index 56f0694..9ba3a21 100644 --- a/reactapp/features/DataStream/components/map/Mapg.js +++ b/reactapp/features/DataStream/components/map/Mapg.js @@ -1,21 +1,33 @@ -// MapComponent.js -import React, { useEffect, useCallback, useRef, useMemo } from 'react'; +import React, { useEffect, useCallback, useRef, useMemo, useState } from 'react'; +import { useShallow } from 'zustand/react/shallow'; import maplibregl from 'maplibre-gl'; -import Map, { Source, Popup } from 'react-map-gl/maplibre'; +import { MapboxOverlay } from "@deck.gl/mapbox"; +import { PathLayer } from "@deck.gl/layers"; +import Map, { Source, useControl } from 'react-map-gl/maplibre'; import { Protocol } from 'pmtiles'; -import { makeGpkgUrl } from '../../lib/s3Utils'; -import { getCacheKey } from '../../lib/opfsCache'; -import { loadVpuData, getVariables, getTimeseries } from 'features/DataStream/lib/queryData'; import useTimeSeriesStore from '../../store/Timeseries'; import useDataStreamStore from '../../store/Datastream'; +import { useVPUStore } from '../../store/Layers'; import { useLayersStore, useFeatureStore } from '../../store/Layers'; -import { PopupContent } from '../styles/Styles'; -import { reorderLayers } from '../../lib/layers'; -import { makeTitle, layerIdToFeatureType } from '../../lib/utils'; -import { getCentroid } from '../../lib/layers'; -import { toast } from 'react-toastify'; +import CustomPopUp from './Popup'; +import { + dividesOutlineColor, + dividesHighlightFillColor, + dividesHighlightOutlineColor, + flowpathsLineColor, + gaugesCircleColor, + nexusCircleColor, + nexusStrokeColor, + nexusHighlightCircleColor, + reorderLayers, + computeBounds, + convertFeaturesToPaths, + valueToColor, + getValueAtTimeFlat +} from '../../lib/layers'; +import { layerIdToFeatureType } from '../../lib/utils'; +import { getCentroid, flowpathsSignature } from '../../lib/layers'; -// NEW: layer hooks import { useCatchmentLayers, useFlowPathsLayer, @@ -23,122 +35,168 @@ import { useNexusLayers, } from './MapLayers'; -const onMapLoad = (event) => { - const map = event.target; - const hoverLayers = ['divides', 'nexus-points']; - hoverLayers.forEach((layer) => { - map.on('mouseenter', layer, () => { - map.getCanvas().style.cursor = 'pointer'; - }); - map.on('mouseleave', layer, () => { - map.getCanvas().style.cursor = ''; - }); - }); - - reorderLayers(map); -}; -const MapComponent = () => { - const isNexusVisible = useLayersStore((state) => state.nexus.visible); - const isCatchmentsVisible = useLayersStore((state) => state.catchments.visible); - const isFlowPathsVisible = useLayersStore((state) => state.flowpaths.visible); - const isConusGaugesVisible = useLayersStore((state) => state.conus_gauges.visible); - const enabledHovering = useLayersStore((state) => state.hovered_enabled); +function DeckGLOverlay(props) { + const overlay = useControl(() => new MapboxOverlay(props)); + overlay.setProps(props); + return null; +} + +const MainMap = () => { + const { + isNexusVisible, + isCatchmentsVisible, + isFlowPathsVisible, + isConusGaugesVisible, + enabledHovering + } = useLayersStore( + useShallow((s) => ({ + isNexusVisible: s.nexus.visible, + isCatchmentsVisible: s.catchments.visible, + isFlowPathsVisible: s.flowpaths.visible, + isConusGaugesVisible: s.conus_gauges.visible, + enabledHovering: s.hovered_enabled, + })) + ); const selectedFeatureId = useTimeSeriesStore((state) => state.feature_id); const loading = useTimeSeriesStore((state) => state.loading); - const setLoading = useTimeSeriesStore((state) => state.set_loading); - const set_series = useTimeSeriesStore((state) => state.set_series); + const set_loading_text = useTimeSeriesStore((state) => state.set_loading_text); const set_feature_id = useTimeSeriesStore((state) => state.set_feature_id); - const set_variable = useTimeSeriesStore((state) => state.set_variable); - const set_table = useTimeSeriesStore((state) => state.set_table); - const set_layout = useTimeSeriesStore((state) => state.set_layout); const reset = useTimeSeriesStore((state) => state.reset); const nexus_pmtiles = useDataStreamStore((state) => state.nexus_pmtiles); const conus_pmtiles = useDataStreamStore((state) => state.community_pmtiles); - const date = useDataStreamStore((state) => state.date); - const model = useDataStreamStore((state) => state.model); - const forecast = useDataStreamStore((state) => state.forecast); - const time = useDataStreamStore((state) => state.time); - const cycle = useDataStreamStore((state) => state.cycle); - const set_vpu = useDataStreamStore((state) => state.set_vpu); - const set_variables = useDataStreamStore((state) => state.set_variables); + const set_vpu = useDataStreamStore((state) => state.set_vpu); const set_hovered_feature = useFeatureStore((state) => state.set_hovered_feature); const hovered_feature = useFeatureStore((state) => state.hovered_feature); const set_selected_feature = useFeatureStore((state) => state.set_selected_feature); const selectedMapFeature = useFeatureStore((state) => state.selected_feature); + + const { currentTimeIndex, variable } = useTimeSeriesStore( + useShallow((s) => ({ + currentTimeIndex: s.currentTimeIndex, + variable: s.variable, + })) + ); + + const { featureIdToIndex, timesArr, valuesByVar } = useVPUStore( + useShallow((s) => ({ + featureIdToIndex: s.featureIdToIndex, + timesArr: s.times, + valuesByVar: s.valuesByVar?.[variable], + })) + ); + + const EMPTY_LAYERS = useMemo(() => [], []); + const mapRef = useRef(null); + const lastSigRef = useRef(""); + const pathDataRef = useRef([]); + + const [pathTick, setPathTick] = useState(0); + const mapStyleUrl = getComputedStyle(document.documentElement).getPropertyValue('--map-style-url').trim(); + + + const deckLayers = useMemo(() => { + if (!isFlowPathsVisible) return EMPTY_LAYERS; + + const varData = valuesByVar; + const numTimes = timesArr?.length || 0; + + const pathData = pathDataRef.current; + + if (!varData || !numTimes || !pathData?.length) return EMPTY_LAYERS; + const bounds = computeBounds(varData); + return [ + new PathLayer({ + id: "flowpaths-anim", + data: pathData, + getPath: (d) => d.path, + getColor: (d) => { + const v = getValueAtTimeFlat(varData, numTimes, d.featureIndex, currentTimeIndex); + return valueToColor(v, bounds); + }, + getWidth: (d) => { + const v = getValueAtTimeFlat(varData, numTimes, d.featureIndex, currentTimeIndex); + if (v === null || v <= -9998) return 2; + const t = Math.max(0, Math.min(1, (v - bounds.min) / (bounds.max - bounds.min))); + return 3 + t * 8; + }, + widthUnits: "pixels", + widthMinPixels: 2, + widthMaxPixels: 12, + capRounded: true, + jointRounded: true, + pickable: false, + updateTriggers: { + getColor: [currentTimeIndex, variable, pathTick], + getWidth: [currentTimeIndex, variable, pathTick], + }, + }), + ]; + }, [ + isFlowPathsVisible, + valuesByVar, + variable, + timesArr, + currentTimeIndex, + pathTick, + ]); - // --- Read CSS variables for map styles/colors --- - const rootStyles = getComputedStyle(document.documentElement); - - const mapStyleUrl = - rootStyles.getPropertyValue('--map-style-url').trim() || - 'https://communityhydrofabric.s3.us-east-1.amazonaws.com/map/styles/light-style.json'; - - const dividesOutlineColor = - rootStyles.getPropertyValue('--map-divides-outline-color').trim() || - 'rgba(91, 44, 111, 0.5)'; - const dividesHighlightFillColor = - rootStyles.getPropertyValue('--map-divides-highlight-fill').trim() || - 'rgba(5, 49, 243, 0.32)'; - const dividesHighlightOutlineColor = - rootStyles.getPropertyValue('--map-divides-highlight-outline').trim() || - 'rgba(253, 0, 253, 0.7)'; - - const flowpathsLineColor = - rootStyles.getPropertyValue('--map-flowpaths-color').trim() || '#000000'; - - const gaugesCircleColor = - rootStyles.getPropertyValue('--map-gauges-color').trim() || '#646464'; - - const nexusCircleColor = - rootStyles.getPropertyValue('--map-nexus-circle-color').trim() || '#1f78b4'; - const nexusStrokeColor = - rootStyles.getPropertyValue('--map-nexus-stroke-color').trim() || '#ffffff'; - const nexusHighlightCircleColor = - rootStyles.getPropertyValue('--map-nexus-highlight-circle-color').trim() || - nexusCircleColor; - - const onHover = useCallback( - (event) => { - if (!enabledHovering) { - set_hovered_feature({}); - return; - } - const { features, lngLat } = event; - - if (!features || features.length === 0) { - set_hovered_feature({}); - return; - } - - const feature = features[0]; - const layerId = feature.layer.id; - let id = - layerId === 'divides' - ? feature.properties?.divide_id - : feature.properties?.id; + const handleMapLoad = useCallback((event) => { + const map = event.target; + + // keep your existing onMapLoad behavior + const hoverLayers = ["divides", "nexus-points"]; + hoverLayers.forEach((layer) => { + map.on("mouseenter", layer, () => (map.getCanvas().style.cursor = "pointer")); + map.on("mouseleave", layer, () => (map.getCanvas().style.cursor = "")); + }); + reorderLayers(map); - if (!id) { - set_hovered_feature({}); - return; - } + }, []); + const onHover = useCallback((event) => { + if (!enabledHovering) return; + + const { features, lngLat } = event; + + const prev = useFeatureStore.getState().hovered_feature; + + if (!features?.length) { + if (prev !== null) set_hovered_feature(null); + return; + } + + const feature = features[0]; + const layerId = feature.layer.id; + + const hoverId = + layerId === "divides" + ? feature.properties?.divide_id + : feature.properties?.id; + + if (!hoverId) { + if (prev !== null) set_hovered_feature(null); + return; + } + + if (prev?.hoverId === hoverId) return; + + const next = { + ...feature.properties, + hoverId, + longitude: lngLat.lng, + latitude: lngLat.lat, + }; + + set_hovered_feature(next); + }, [enabledHovering, set_hovered_feature]); - set_hovered_feature({ - longitude: lngLat.lng, - latitude: lngLat.lat, - ...feature.properties, - }); - }, - [set_hovered_feature, enabledHovering] - ); - // --- Use extracted layer hooks --- const catchmentLayer = useCatchmentLayers({ isCatchmentsVisible, selectedFeatureId, @@ -168,6 +226,10 @@ const MapComponent = () => { useEffect(() => { const protocol = new Protocol({ metadata: true }); maplibregl.addProtocol('pmtiles', protocol.tile); + + const map = mapRef.current && mapRef.current.getMap ? mapRef.current.getMap() : mapRef.current; + if (!map) return; + return () => { maplibregl.removeProtocol('pmtiles'); }; @@ -184,8 +246,55 @@ const MapComponent = () => { reorderLayers(map); }, [isNexusVisible, isCatchmentsVisible, isFlowPathsVisible, isConusGaugesVisible]); + + useEffect(() => { + const map = mapRef.current?.getMap?.() ?? mapRef.current; + if (!map) return; + + const hasIndex = featureIdToIndex && Object.keys(featureIdToIndex).length > 0; + if (!hasIndex) return; + + let raf = null; + + const run = () => { + if (raf) cancelAnimationFrame(raf); + + raf = requestAnimationFrame(() => { + if (!isFlowPathsVisible) return; + + const feats = map.queryRenderedFeatures({ layers: ["flowpaths"] }); + + const matched = feats.filter( + (f) => featureIdToIndex[f.properties?.id] !== undefined + ); + + const sig = flowpathsSignature(matched); + if (sig === lastSigRef.current) { + raf = null; + return; + } + lastSigRef.current = sig; + + pathDataRef.current = convertFeaturesToPaths(matched, featureIdToIndex); + setPathTick((t) => t + 1); + + raf = null; + }); + }; + + map.once("idle", run); + map.on("moveend", run); + map.on("zoomend", run); + + return () => { + if (raf) cancelAnimationFrame(raf); + map.off("moveend", run); + map.off("zoomend", run); + }; + }, [featureIdToIndex, isFlowPathsVisible]); + + useEffect(() => { - console.log('Selected feature changed:', selectedMapFeature); if (!selectedMapFeature) return; const map = @@ -204,6 +313,7 @@ const MapComponent = () => { }); }, [selectedMapFeature]); + const layersToQuery = useMemo(() => { const layers = []; if (isNexusVisible) layers.push('nexus-points'); @@ -212,13 +322,11 @@ const MapComponent = () => { }, [isNexusVisible, isCatchmentsVisible]); const handleMapClick = async (event) => { - if (loading) { - toast.info('Data is already loading, please wait...', { autoClose: 300 }); + if (loading) { return; } - setLoading(true); - // set_feature_id(null); - reset(); + // reset(); + const map = event.target; if (layersToQuery.length === 0) return; @@ -230,77 +338,17 @@ const MapComponent = () => { for (const feature of features) { const layerId = feature.layer.id; - console.log('Clicked feature on layer:', layerId, feature); const {lon, lat} = getCentroid(feature); set_selected_feature({ latitude: lat, longitude: lon, ...feature.properties, }); - const featureIdProperty = layerIdToFeatureType(layerId); const unbiased_id = feature.properties[featureIdProperty]; - const id = unbiased_id.split('-')[1]; + set_feature_id(unbiased_id); const vpu_str = `VPU_${feature.properties.vpuid}`; - const vpu_gpkg = makeGpkgUrl(vpu_str); - const cacheKey = getCacheKey(model, date, forecast, cycle, time, vpu_str); - const toastId = toast.loading(`Loading data for id: ${id}...`, { - closeOnClick: false, - draggable: false, - }); - try { - await loadVpuData(model, date, forecast, cycle, time, vpu_str, vpu_gpkg); - } catch (err) { - toast.update(toastId, { - render: `No data for id: ${id}`, - type: 'warning', - isLoading: false, - autoClose: 500, - closeOnClick: true, - }); - console.error('No data for VPU', vpu_str, err); - setLoading(false); - continue; - } - try { - const variables = await getVariables({ cacheKey }); - const series = await getTimeseries(id, cacheKey, variables[0]); - const xy = series.map((d) => ({ - x: new Date(d.time), - y: d.flow, - })); - const textToat = `Loaded ${xy.length} points for id: ${id}`; - - set_feature_id(unbiased_id); - set_table(cacheKey); - set_vpu(vpu_str); - set_variables(variables); - set_variable(variables[0]); - set_series(xy); - set_layout({ - yaxis: variables[0], - xaxis: '', - title: makeTitle(forecast, unbiased_id), - }); - toast.update(toastId, { - render: `${textToat}`, - type: 'success', - isLoading: false, - autoClose: 3000, - closeOnClick: true, - }); - setLoading(false); - } catch (err) { - toast.update(toastId, { - render: `Failed to load data for id: ${id}`, - type: 'error', - isLoading: false, - autoClose: 5000, - closeOnClick: true, - }); - setLoading(false); - console.error('Failed to load timeseries for', id, err); - } + set_vpu(vpu_str); break; } }; @@ -313,7 +361,7 @@ const MapComponent = () => { mapLib={maplibregl} mapStyle={mapStyleUrl} onClick={handleMapClick} - onLoad={onMapLoad} + onLoad={handleMapLoad} onMouseMove={onHover} interactiveLayerIds={['divides', 'nexus-points', 'flowpaths', 'conus-gauges']} > @@ -326,28 +374,14 @@ const MapComponent = () => { {nexusLayers} - - {hovered_feature?.id && ( - - -
Feature
- {Object.keys(hovered_feature).map((key) => ( -
- {key} - {hovered_feature[key]} -
- ))} -
-
- )} + + ); }; + +const MapComponent = React.memo(MainMap); + export default MapComponent; diff --git a/reactapp/features/DataStream/components/map/Popup.js b/reactapp/features/DataStream/components/map/Popup.js new file mode 100644 index 0000000..dfec09d --- /dev/null +++ b/reactapp/features/DataStream/components/map/Popup.js @@ -0,0 +1,32 @@ +import React,{ useMemo } from 'react'; +import { Popup } from 'react-map-gl/maplibre'; +import { PopupContent } from '../styles/Styles'; +const CustomPopUp = React.memo(({ hovered_feature, enabledHovering }) => { + const rows = useMemo(() => { + if (!hovered_feature ) return []; + return Object.entries(hovered_feature); + }, [hovered_feature]); + + if (!enabledHovering || !hovered_feature?.hoverId) return null; + + return ( + + +
Feature
+ {rows.map(([k, v]) => ( +
+ {k} + {String(v)} +
+ ))} +
+
+ ); +}); + +export default CustomPopUp; \ No newline at end of file diff --git a/reactapp/features/DataStream/components/map/SearchBar.js b/reactapp/features/DataStream/components/map/SearchBar.js index dad4cc8..c4cefaa 100644 --- a/reactapp/features/DataStream/components/map/SearchBar.js +++ b/reactapp/features/DataStream/components/map/SearchBar.js @@ -1,122 +1,30 @@ -import React, {useState, useEffect } from 'react'; +import React, {useEffect} from 'react'; import { SearchBarWrapper, SearchIcon, SearchInput } from '../styles/Styles'; import { loadIndexData, getFeatureProperties } from 'features/DataStream/lib/queryData'; import useTimeSeriesStore from 'features/DataStream/store/Timeseries'; import useDataStreamStore from 'features/DataStream/store/Datastream'; import {useFeatureStore} from 'features/DataStream/store/Layers'; -import { getTimeseries, getVariables, checkForTable, loadVpuData } from 'features/DataStream/lib/queryData'; -import { makeTitle } from 'features/DataStream/lib/utils'; -import { getCacheKey } from 'features/DataStream/lib/opfsCache'; -import { makeGpkgUrl } from 'features/DataStream/lib/s3Utils'; -import ResetDataButton from '../forecast/cacheHandler'; -import { toast } from 'react-toastify'; const SearchBar = ({ placeholder = 'Search for an id' }) => { - // const [searchInput, setSearchInput] = useState(''); + const hydrofabric_index_url = useDataStreamStore((state) => state.hydrofabric_index); - const forecast = useDataStreamStore((state) => state.forecast); - const model = useDataStreamStore((state) => state.model); - const date = useDataStreamStore((state) => state.date); - const cycle = useDataStreamStore((state) => state.cycle); - const time = useDataStreamStore((state) => state.time); - const vpu = useDataStreamStore((state) => state.vpu); - const set_variables = useDataStreamStore((state) => state.set_variables); - - const set_table = useTimeSeriesStore((state) => state.set_table); - const variable = useTimeSeriesStore((state) => state.variable); - const set_series = useTimeSeriesStore((state) => state.set_series); - const set_layout = useTimeSeriesStore((state) => state.set_layout); - const set_variable = useTimeSeriesStore((state) => state.set_variable); + const set_vpu = useDataStreamStore((state) => state.set_vpu); + const feature_id = useTimeSeriesStore((state) => state.feature_id); const set_feature_id = useTimeSeriesStore((state) => state.set_feature_id); - const loading = useTimeSeriesStore((state) => state.loading); - const setLoading = useTimeSeriesStore((state) => state.set_loading); const set_selected_feature = useFeatureStore((state) => state.set_selected_feature); const handleChange = async (e) => { - if (loading) { - toast.info('Data is already loading, please wait...', { autoClose: 300 }); - return - }; - setLoading(true); const unbiased_id = e.target.value; + const features = await getFeatureProperties({ cacheKey: 'index_data_table', feature_id: unbiased_id }); + if (features.length === 0) { + return + }; + const feature = features.length > 0 ? features[0] : null; + set_selected_feature(feature || null); + const vpu_str = `VPU_${feature.vpuid}`; + set_vpu(vpu_str); set_feature_id(unbiased_id); - const id = unbiased_id.split('-')[1]; - const toastId = toast.loading(`Loading data for id: ${id}...`, { - closeOnClick: false, - draggable: false, - }); - try{ - const features = await getFeatureProperties({ cacheKey: 'index_data_table', feature_id: unbiased_id }); - if (features.length === 0) { - setLoading(false); - return - }; - const feature = features.length > 0 ? features[0] : null; - set_selected_feature(feature || null); - const vpu_str = `VPU_${feature.vpuid}`; - const cacheKey = getCacheKey( - model, - date, - forecast, - cycle, - time, - vpu_str - ); - - const tableExists = await checkForTable(cacheKey); - if (!tableExists) { - await loadVpuData( - model, - date, - forecast, - cycle, - time, - vpu_str, - makeGpkgUrl(vpu) - ); - } else { - console.log(`Table ${cacheKey} already exists.`); - } - const variables = await getVariables({cacheKey}); - const _variable = variable ? variable : variables[0]; - console.log("Using variable:", _variable); - const series = await getTimeseries(id, cacheKey, _variable); - const xy = series.map((d) => ({ - x: new Date(d.time), - y: d[variables[0]], - })); - const textToat = `Loaded ${xy.length} points for id: ${id}`; - set_series(xy); - set_table(cacheKey); - set_variables(variables); - set_variable(_variable); - set_layout({ - 'yaxis': _variable, - 'xaxis': "Time", - 'title': makeTitle(forecast, unbiased_id), - }); - toast.update(toastId, { - render: `${textToat}`, - type: 'success', - isLoading: false, - autoClose: 3000, - closeOnClick: true, - }); - } - catch (error) { - console.error('Error fetching data for feature id:', unbiased_id, error); - toast.update(toastId, { - render: `No data for id: ${id}`, - type: 'warning', - isLoading: false, - autoClose: 500, - closeOnClick: true, - }); - } finally { - setLoading(false); - } - } useEffect(() => { @@ -130,7 +38,7 @@ const SearchBar = ({ placeholder = 'Search for an id' }) => { loadSearchData(); return () => { }; - }, []); // dependencies array + }, []); return ( <> @@ -144,7 +52,6 @@ const SearchBar = ({ placeholder = 'Search for an id' }) => { aria-label={placeholder} /> - ); }; diff --git a/reactapp/features/DataStream/components/menus/CacheMenu.js b/reactapp/features/DataStream/components/menus/CacheMenu.js new file mode 100644 index 0000000..2f62d62 --- /dev/null +++ b/reactapp/features/DataStream/components/menus/CacheMenu.js @@ -0,0 +1,44 @@ +import React, { Fragment, useState, useEffect } from 'react'; +import { CacheTable } from '../forecast/cacheTable'; +import { CacheTableContainer, CacheButton } from '../styles/Styles'; +import { IoFolderOpenOutline, IoClose } from "react-icons/io5"; +import { useCacheTablesStore } from 'features/DataStream/store/CacheTables'; +import { getFilesFromCache } from 'features/DataStream/lib/opfsCache'; + +export const CacheMenu = () => { + const [open, setIsOpen] = useState(false); + const tables = useCacheTablesStore((state) => state.cacheTables); + const set_cacheTables = useCacheTablesStore((state) => state.set_cacheTables); + useEffect(() => { + const fetchCacheTables = async () => { + const files = await getFilesFromCache() + console.log("Fetched cache tables:", files); + set_cacheTables(files); + }; + fetchCacheTables(); + }, []); + + return ( + + {open ? ( + <> + setIsOpen(prev => !prev)} + > + + + + + + + + ) : ( + setIsOpen(prev => !prev)}> + + + )} + + ); +}; + diff --git a/reactapp/features/DataStream/components/menus/ForecastMenu.js b/reactapp/features/DataStream/components/menus/ForecastMenu.js index e66b57a..642170b 100644 --- a/reactapp/features/DataStream/components/menus/ForecastMenu.js +++ b/reactapp/features/DataStream/components/menus/ForecastMenu.js @@ -1,35 +1,46 @@ -import React, { Fragment, useMemo } from 'react'; -import DataMenu from '../forecast/DataMenu'; +import React, { Fragment, useMemo, useCallback } from 'react'; +import DataMenu from '../forecast/dataMenu'; +import VariablesMenu from '../forecast/variablesMenu'; import { Content, Container } from '../styles/Styles'; import TimeSeriesCard from '../forecast/TimeseriesCard'; import useTimeSeriesStore from 'features/DataStream/store/Timeseries'; +import { useVPUStore } from 'features/DataStream/store/Layers'; import { ForecastHeader } from '../forecast/ForecastHeader'; import { FeatureInformation } from '../forecast/FeatureInformation'; +import { TimeSlider } from '../forecast/TimeSlider'; +import { useShallow } from 'zustand/react/shallow'; const ForecastMenu = () => { + const { feature_id, layout, reset } = useTimeSeriesStore( + useShallow((state) => ({ + feature_id: state.feature_id, + layout: state.layout, + reset: state.reset, + })) + ); + const { resetVPU } = useVPUStore( + useShallow((state) => ({ + resetVPU: state.resetVPU, + })) + ); - // const feature_id = useTimeSeriesStore((state) => state.feature_id); - const series = useTimeSeriesStore((state) => state.series); - const layout = useTimeSeriesStore((state) => state.layout); - const reset_ts_store = useTimeSeriesStore((state) => state.reset); const isopen = useMemo(() => { - // return feature_id ? true : false; - return series.length > 0; - // }, [feature_id]); - }, [series]); - - // const set_feature_id = useTimeSeriesStore((state) => state.set_feature_id); + return feature_id != null; + }, [feature_id]); + const onReset = useCallback(() => { + reset(); + resetVPU(); + }, [reset, resetVPU]); + return ( - - +
{layout?.title && ( {set_feature_id(null)}} - onClick={()=> {reset_ts_store()}} + onClick={onReset} /> )}
@@ -39,8 +50,12 @@ const ForecastMenu = () => { - + + + + +
diff --git a/reactapp/features/DataStream/components/menus/LayersMenu.js b/reactapp/features/DataStream/components/menus/LayersMenu.js index cf5ba02..5beed11 100644 --- a/reactapp/features/DataStream/components/menus/LayersMenu.js +++ b/reactapp/features/DataStream/components/menus/LayersMenu.js @@ -1,10 +1,11 @@ -import React, { Fragment, useState } from 'react'; +import React, { Fragment, useCallback, useState } from 'react'; import { LayerControl } from '../map/LayersControl'; import { LayersContainer, LayerButton } from '../styles/Styles'; import { IoLayers, IoClose } from "react-icons/io5"; export const LayersMenu = () => { const [open, setIsOpen] = useState(false); + const toggle = useCallback(() => setIsOpen(o => !o), []); return ( @@ -12,7 +13,7 @@ export const LayersMenu = () => { <> setIsOpen(prev => !prev)} + onClick={toggle} > diff --git a/reactapp/features/DataStream/components/menus/MainMenu.js b/reactapp/features/DataStream/components/menus/MainMenu.js index b8f2de3..83bee43 100644 --- a/reactapp/features/DataStream/components/menus/MainMenu.js +++ b/reactapp/features/DataStream/components/menus/MainMenu.js @@ -1,13 +1,14 @@ import React, { Fragment } from 'react'; import ForecastMenu from 'features/DataStream/components/menus/ForecastMenu'; import { LayersMenu } from './LayersMenu'; - +import { CacheMenu } from './CacheMenu'; const MainMenu = () => { return ( + ); }; diff --git a/reactapp/features/DataStream/components/styles/Styles.js b/reactapp/features/DataStream/components/styles/Styles.js index 38b0e56..251e8ef 100644 --- a/reactapp/features/DataStream/components/styles/Styles.js +++ b/reactapp/features/DataStream/components/styles/Styles.js @@ -10,7 +10,7 @@ export const TimeSeriesContainer = styled.div` background-color: var(--panel-background); `; -// Themed Modal wrapper – now fully CSS-variable based +// Themed Modal wrapper - now fully CSS-variable based export const ThemedModal = styled(Modal)` .modal-content { background-color: var(--modal-bg); @@ -122,6 +122,51 @@ export const LayersContainer = styled.div` } `; +export const CacheTableContainer = styled.div` + position: absolute; + top: calc(var(--ts-header-height) + 300px); + right: 10px; + // height: 300px; + overflow-y: scroll; + width: 250px; + padding: 15px; + background-color: var(--map-panel-bg); + color: var(--map-panel-text); + z-index: 1000; + border-radius: 8px; + font-size: 13px; + transition: all 0.25s cubic-bezier(0.4, 0, 0.2, 1); + -ms-overflow-style: none; + scrollbar-width: none; + @media (max-width: 768px) { + width: 100%; + border-radius: 0; + } +`; +export const CacheButton = styled(Button)` + top: 360px; + right: 1%; + position: absolute; + margin-top: 10px; + transition: transform 0.3s ease; + + background-color: ${({ $bgColor = 'var(--button-primary-bg)' }) => + $bgColor}; + border: none; + color: var(--accent-text); + border-radius: 20px; + padding: 7px 8px; + z-index: 1001; + + &:hover, + &:focus { + color: var(--hover-text); + background-color: ${({ $bgColor = 'var(--button-primary-bg)' }) => $bgColor}; + border: none; + box-shadow: none; + } +`; + export const LayerButton = styled(Button)` top: 60px; right: 1%; @@ -147,16 +192,14 @@ export const LayerButton = styled(Button)` `; export const XButton = styled(Button)` - background-color: var(--button-primary-bg); - color: var(--accent-text); - border-radius: 8px; + background: var(--accent-text, #0a0e14); + border: 1px solid var(--border-color, #2a3a4a); + border-radius: var(--radius-sm, 4px); + color: var(--primary-color); padding: 7px 8px; width: 100%; z-index: 1001; box-shadow: none; - border-radius: 20px; - border-color: transparent; - border: none; &:hover, &:focus { background-color: var(--button-primary-hover-bg); diff --git a/reactapp/features/DataStream/lib/data.js b/reactapp/features/DataStream/lib/data.js index a58f5f5..4406a2b 100644 --- a/reactapp/features/DataStream/lib/data.js +++ b/reactapp/features/DataStream/lib/data.js @@ -1,56 +1,3 @@ - -export const availableModelsList = [ - { value: 'cfe_nom', label: 'cfe_nom' }, - { value: 'lstm', label: 'lstm' }, -]; -export const availableForecastList = [ - { value: 'short_range', label: 'short_range' }, - // { value: 'medium_range', label: 'medium_range' }, - { value: 'analysis_assim_extend', label: 'analysis_assim_extend' }, -]; - -export const availableCyclesList = { - short_range: [ - { value: '00', label: '00' }, - { value: '01', label: '01' }, - { value: '02', label: '02' }, - { value: '03', label: '03' }, - { value: '04', label: '04' }, - { value: '05', label: '05' }, - { value: '06', label: '06' }, - { value: '07', label: '07' }, - { value: '08', label: '08' }, - { value: '09', label: '09' }, - { value: '10', label: '10' }, - { value: '11', label: '11' }, - { value: '12', label: '12' }, - { value: '13', label: '13' }, - { value: '14', label: '14' }, - { value: '15', label: '15' }, - { value: '16', label: '16' }, - { value: '17', label: '17' }, - { value: '18', label: '18' }, - { value: '19', label: '19' }, - { value: '20', label: '20' }, - { value: '21', label: '21' }, - { value: '22', label: '22' }, - { value: '23', label: '23' } - ], - medium_range: [ - { value: '00', label: '00' }, - { value: '06', label: '06' }, - { value: '12', label: '12' }, - { value: '18', label: '18' } - ], - analysis_assim_extend: [{ value: '16', label: '16' }], -}; - -export const availableEnsembleList = { - short_range: [], - medium_range: [{ value: '1', label: '1' }], - analysis_assim_extend: [], -}; - export const FEATURE_PROPERTIES = { 'tot_drainage_areasqkm': 'Total Drainage Area (km2)', 'areasqkm': 'Area (km2)', diff --git a/reactapp/features/DataStream/lib/layers.js b/reactapp/features/DataStream/lib/layers.js index 5b4dc1b..e3d1f1c 100644 --- a/reactapp/features/DataStream/lib/layers.js +++ b/reactapp/features/DataStream/lib/layers.js @@ -1,3 +1,34 @@ +// --- Read CSS variables for map styles/colors --- +const rootStyles = getComputedStyle(document.documentElement); + +export const mapStyleUrl = + rootStyles.getPropertyValue('--map-style-url').trim() || + 'https://communityhydrofabric.s3.us-east-1.amazonaws.com/map/styles/light-style.json'; + +export const dividesOutlineColor = + rootStyles.getPropertyValue('--map-divides-outline-color').trim() || + 'rgba(91, 44, 111, 0.5)'; +export const dividesHighlightFillColor = + rootStyles.getPropertyValue('--map-divides-highlight-fill').trim() || + 'rgba(5, 49, 243, 0.32)'; +export const dividesHighlightOutlineColor = + rootStyles.getPropertyValue('--map-divides-highlight-outline').trim() || + 'rgba(253, 0, 253, 0.7)'; + +export const flowpathsLineColor = + rootStyles.getPropertyValue('--map-flowpaths-color').trim() || '#000000'; + +export const gaugesCircleColor = + rootStyles.getPropertyValue('--map-gauges-color').trim() || '#646464'; + +export const nexusCircleColor = + rootStyles.getPropertyValue('--map-nexus-circle-color').trim() || '#1f78b4'; +export const nexusStrokeColor = + rootStyles.getPropertyValue('--map-nexus-stroke-color').trim() || '#ffffff'; +export const nexusHighlightCircleColor = + rootStyles.getPropertyValue('--map-nexus-highlight-circle-color').trim() || + nexusCircleColor; + export const reorderLayers = (map) => { if (!map) return; // Draw order from bottom → top @@ -373,6 +404,23 @@ export const EnsembleIcon = (props) => ( ); +export const FileIcon = (props) => ( + + + + +); + // Variable: axes + curve export const VariableIcon = (props) => ( @@ -398,4 +446,95 @@ export const VariableIcon = (props) => ( strokeLinejoin="round" /> -); \ No newline at end of file +); + +export function getValueAtTimeFlat(varData, numTimes, featureIndex, timeIndex) { + if (!varData || featureIndex === undefined || featureIndex === null) return null; + const idx = featureIndex * numTimes + timeIndex; + if (idx < 0 || idx >= varData.length) return null; + return varData[idx]; +} + +export function valueToColor(value, bounds) { + const colorScale = [ + [0, 119, 187], + [0, 180, 216], + [144, 224, 239], + [255, 186, 8], + [255, 107, 53], + [208, 0, 0], + ]; + if (value === null || value === undefined || value <= -9998) return [100, 100, 100, 150]; + if (!bounds || bounds.max === bounds.min) return colorScale[0]; + + const t = Math.max(0, Math.min(1, (value - bounds.min) / (bounds.max - bounds.min))); + const idx = t * (colorScale.length - 1); + const lower = Math.floor(idx); + const upper = Math.ceil(idx); + const frac = idx - lower; + if (lower === upper) return colorScale[lower]; + return colorScale[lower].map((c, i) => Math.round(c + (colorScale[upper][i] - c) * frac)); +} + +export function computeBounds(varData) { + let min = Infinity, max = -Infinity; + for (let i = 0; i < varData.length; i++) { + const v = varData[i]; + if (v <= -9998) continue; + if (v < min) min = v; + if (v > max) max = v; + } + if (!isFinite(min) || !isFinite(max)) return { min: 0, max: 1 }; + return { min, max }; +} + + +export function convertFeaturesToPaths(features, featureIdToIndex) { + const out = []; + + for (const f of features) { + const rawId = f.id ?? f.properties?.id; + if (rawId == null) continue; + + const id = String(rawId); + const featureIndex = featureIdToIndex[id]; + if (featureIndex === undefined) continue; + + const geom = f.geometry; + if (!geom) continue; + + if (geom.type === "LineString") { + out.push({ id, featureIndex, path: geom.coordinates, properties: f.properties }); + } else if (geom.type === "MultiLineString") { + geom.coordinates.forEach((line, i) => { + out.push({ id: `${id}-${i}`, featureIndex, path: line, properties: f.properties }); + }); + } + } + + return out; +} + +export function flowpathsSignature(features) { + const parts = []; + + for (const f of features) { + const rawId = f.id ?? f.properties?.id; + if (rawId == null) continue; + + const id = String(rawId); + const g = f.geometry; + if (!g) continue; + + if (g.type === "LineString") { + parts.push(`${id}:L:${g.coordinates.length}`); + } else if (g.type === "MultiLineString") { + const lines = g.coordinates.length; + const totalPts = g.coordinates.reduce((sum, line) => sum + line.length, 0); + parts.push(`${id}:M:${lines}:${totalPts}`); + } + } + + parts.sort(); // make stable regardless of render order + return parts.join("|"); +} diff --git a/reactapp/features/DataStream/lib/opfsCache.js b/reactapp/features/DataStream/lib/opfsCache.js index 7c3fbc3..0795b85 100644 --- a/reactapp/features/DataStream/lib/opfsCache.js +++ b/reactapp/features/DataStream/lib/opfsCache.js @@ -1,5 +1,12 @@ const CACHE_DIR = "nrds-arrow-cache"; - +function formatBytes(bytes, decimals = 2) { + if (bytes === 0) return '0 Bytes'; + const k = 1024; + const dm = decimals < 0 ? 0 : decimals; + const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; +} async function getCacheDir() { if (!("storage" in navigator) || !navigator.storage.getDirectory) { // OPFS not supported (e.g., non-Chromium / http) @@ -34,6 +41,8 @@ export async function saveArrowToCache(key, buffer) { await writable.write(dataToWrite); await writable.close(); + const file = await fileHandle.getFile(); + return formatBytes(file.size); } export async function loadArrowFromCache(key) { @@ -50,10 +59,57 @@ export async function loadArrowFromCache(key) { } } +async function* getFilesRecursively(entry) { + if (entry.kind === "file") { + const file = await entry.getFile(); + if (file !== null) { + yield file; + } + } else if (entry.kind === "directory") { + for await (const handle of entry.values()) { + yield* getFilesRecursively(handle); + } + } +} + + +export async function getFilesFromCache() { + const dir = await getCacheDir(); + if (!dir) return null; + const files = []; + const fileHandlers = await getFilesRecursively(dir); + + for await (const file of fileHandlers) { + const id = decodeURIComponent(file.name.replace(".arrow", "")); + files.push({id: id, name: id.replaceAll("_", "/"), size: formatBytes(file.size)}); + } + return files; +} + +export async function deleteFileFromCache(key) { + const dir = await getCacheDir(); + if (!dir) return; + const safeName = encodeURIComponent(key) + ".arrow"; + try { + await dir.removeEntry(safeName); + return true; + } catch (e) { + console.error("Error deleting file from cache:", e); + return false; + } +} + +export async function clearCache() { + const dir = await getCacheDir(); + if (!dir) return; + for await (const handle of dir.values()) { + await dir.removeEntry(handle.name); + } +} -export function getCacheKey(model, date, forecast, cycle, time, vpu) { - if (!time){ - return `${model}_${date}_${forecast}_${cycle}_${vpu}`.replace(/\./g,'_').replace(/\//g,'_'); +export function getCacheKey(model, date, forecast, cycle, ensemble, vpu, outputFile) { + if (!ensemble){ + return `${model}_${date}_${forecast}_${cycle}_${vpu}_${outputFile}`.replace(/\./g,'_').replace(/\//g,'_'); } - return `${model}_${date}_${forecast}_${cycle}_${time}_${vpu}`.replace(/\./g,'_').replace(/\//g,'_'); + return `${model}_${date}_${forecast}_${cycle}_${ensemble}_${vpu}_${outputFile}`.replace(/\./g,'_').replace(/\//g,'_'); } diff --git a/reactapp/features/DataStream/lib/queryData.js b/reactapp/features/DataStream/lib/queryData.js index 10be185..ad26c41 100644 --- a/reactapp/features/DataStream/lib/queryData.js +++ b/reactapp/features/DataStream/lib/queryData.js @@ -1,7 +1,7 @@ // // nexusTimeseries.js import { tableFromIPC } from "apache-arrow"; import appAPI from "features/Tethys/services/api/app"; -import { saveArrowToCache, loadArrowFromCache, getCacheKey } from "./opfsCache"; +import { saveArrowToCache, loadArrowFromCache } from "./opfsCache"; import { getConnection } from "./duckdbClient"; import { getNCFiles } from "./s3Utils"; @@ -15,6 +15,12 @@ export async function getTimeseries(id, cacheKey, variable) { WHERE feature_id = ${id} ORDER BY time `); + console.log("Query executed:", ` + SELECT time, ${variable} + FROM ${cacheKey} + WHERE feature_id = ${id} + ORDER BY time + `); const rows = q.toArray().map(Object.fromEntries); rows.columns = q.schema.fields.map((d) => d.name); @@ -24,11 +30,32 @@ export async function getTimeseries(id, cacheKey, variable) { ); return rows; } finally { - // 🔑 make sure the connection is always closed await conn.close(); } } +export async function getFeatureIDs(cacheKey) { + console.log("getFeatureIDs called with cacheKey:", cacheKey); + + const conn = await getConnection(); + + try { + const q = await conn.query(` + SELECT feature_id + FROM "${cacheKey}" + `); + + const rows = q.toArray().map(Object.fromEntries); + rows.columns = q.schema.fields.map((d) => d.name); + + console.log( + `[updateDataInfo] (literal) rows=${rows.length}` + ); + return rows; + } finally { + await conn.close(); + } +} export async function loadIndexData({ remoteUrl }) { const cacheKey = "index_data_table"; @@ -95,30 +122,22 @@ export async function getFeatureProperties({ cacheKey, feature_id }) { export async function loadVpuData( - model, - date, - forecast, - cycle, - time, - vpu, + cacheKey, + prefix, vpu_gpkg ) { - const cacheKey = getCacheKey(model, date, forecast, cycle, time, vpu); console.log("loadVpuData called with cacheKey:", cacheKey); let buffer = await loadArrowFromCache(cacheKey); - + let fileSize; if (!buffer) { - const nc_files = await getNCFiles(model, date, forecast, cycle, time, vpu); - if (nc_files.length === 0) { - throw new Error(`No NC files found for VPU ${vpu} with prefix.`); - } + const ncFile = getNCFiles(prefix); const res = await appAPI.getParquetPerVpu({ - nc_files, + ncFile, vpu_gpkg, }); buffer = res; // ArrayBuffer from axios - await saveArrowToCache(cacheKey, buffer); + fileSize = await saveArrowToCache(cacheKey, buffer); } const arrowTable = tableFromIPC(new Uint8Array(buffer)); @@ -144,6 +163,7 @@ export async function loadVpuData( } } finally { await conn.close(); + return fileSize; } } @@ -162,6 +182,19 @@ export async function checkForTable(cacheKey) { await conn.close(); } } + +export async function deleteTable(tableName){ + const conn = await getConnection(); + try { + await conn.query(` + DROP TABLE IF EXISTS "${tableName}" + `); + console.log(`Table ${tableName} has been deleted.`); + } finally { + await conn.close(); + } +} + export async function dropAllVpuDataTables() { const conn = await getConnection(); @@ -223,3 +256,55 @@ export async function getVariables({ cacheKey }) { } +function rowsToObjects(q) { + // matches your pattern: q.toArray().map(Object.fromEntries) + return q.toArray().map(Object.fromEntries); +} + +export async function getDistinctFeatureIds(cacheKey) { + const conn = await getConnection(); + try { + const q = await conn.query(` + SELECT DISTINCT feature_id + FROM "${cacheKey}" + ORDER BY feature_id + `); + const rows = rowsToObjects(q); + return rows.map((r) => r.feature_id); + } finally { + await conn.close(); + } +} + +export async function getDistinctTimes(cacheKey) { + const conn = await getConnection(); + try { + const q = await conn.query(` + SELECT DISTINCT time + FROM "${cacheKey}" + ORDER BY time + `); + const rows = rowsToObjects(q); + return rows.map((r) => r.time); + } finally { + await conn.close(); + } +} + +// Returns a flattened array ordered by (feature_id, time) +export async function getVpuVariableFlat(cacheKey, variable) { + const conn = await getConnection(); + try { + const q = await conn.query(` + SELECT ${variable} AS v + FROM "${cacheKey}" + ORDER BY feature_id, time + `); + const rows = rowsToObjects(q); + return Float32Array.from(rows.map((r) => Number(r.v))); + } finally { + await conn.close(); + } +} + + diff --git a/reactapp/features/DataStream/lib/s3Utils.js b/reactapp/features/DataStream/lib/s3Utils.js index d721143..da485ce 100644 --- a/reactapp/features/DataStream/lib/s3Utils.js +++ b/reactapp/features/DataStream/lib/s3Utils.js @@ -1,18 +1,16 @@ -import { getCacheKey, loadArrowFromCache } from "./opfsCache"; - -export async function listPublicS3Directories(prefix = "v2.2/") { +export async function listPublicS3Directories(prefix = "v2.2/", { signal } = {}) { const bucket = "ciroh-community-ngen-datastream"; // Ensure trailing slash const normalizedPrefix = prefix.endsWith("/") ? prefix : `${prefix}/`; - // S3 ListObjectsV2 with delimiter to get “folders” + // S3 ListObjectsV2 with delimiter to get "folders" const url = `https://${bucket}.s3.us-east-1.amazonaws.com/` + `?list-type=2&prefix=${encodeURIComponent(normalizedPrefix)}` + `&delimiter=/`; - const resp = await fetch(url); + const resp = await fetch(url, { signal }); if (!resp.ok) { throw new Error(`S3 list error: ${resp.status} ${resp.statusText}`); } @@ -40,42 +38,88 @@ export async function listPublicS3Directories(prefix = "v2.2/") { return { fullPrefixes, childNames }; } -export async function listPublicS3Files(prefix = "v2.2/") { +export async function listPublicS3Files(prefix = "v2.2/", { signal } = {}) { const bucket = "ciroh-community-ngen-datastream"; const url = `https://${bucket}.s3.us-east-1.amazonaws.com` + `/?list-type=2&prefix=${encodeURIComponent(prefix)}`; - const resp = await fetch(url); + const resp = await fetch(url,{ signal }); + if (!resp.ok) { + throw new Error(`S3 list error: ${resp.status} ${resp.statusText}`); + } const xml = await resp.text(); // parse XML -> extract elements const parser = new DOMParser(); const doc = parser.parseFromString(xml, "application/xml"); const contents = [...doc.getElementsByTagName("Contents")]; - return contents.map(node => node.getElementsByTagName("Key")[0].textContent); } -export const makePrefix = (model, avail_date,ngen_forecast,ngen_cycle, ngen_time, ngen_vpu) => { +export async function getOptionsFromURL(url, { signal } = {}) { + try{ + if (url.split('/').includes('troute')){ + const files = await listPublicS3Files(url, { signal }); + const ncFiles = files.filter(f => f.endsWith('.nc')); + // const ncFilesParsed = ncFiles.map(f => `s3://ciroh-community-ngen-datastream/${f}`); + const options = ncFiles.map((d) => ({ value: d.split('/').pop(), label: d.split('/').pop() })); + const sortedOptions = Array.from(options).sort().reverse(); + return sortedOptions; + } + const { childNames } = await listPublicS3Directories(url, { signal }); + const options = childNames.map((d) => ({ value: d, label: d })); + const sortedOptions = Array.from(options).sort(); + return sortedOptions; + }catch(error){ + return []; + } + +} + +export const makePrefix = (model, avail_date,ngen_forecast,ngen_cycle, ngen_ensemble, ngen_vpu, outputFile) => { let prefix_path = `outputs/${model}/v2.2_hydrofabric/${avail_date}/${ngen_forecast}/${ngen_cycle}` - let time_path = ngen_time ? `${ngen_time}/` : ''; - prefix_path = `${prefix_path}/${time_path}${ngen_vpu}/ngen-run/outputs/troute/`; + let ensemble_path = ngen_ensemble ? `${ngen_ensemble}/` : ''; + prefix_path = `${prefix_path}/${ensemble_path}${ngen_vpu}/ngen-run/outputs/troute/${outputFile}`; return prefix_path; } -export async function getNCFiles(model, date, forecast, cycle, time, vpu, buffer) { - if (buffer){ return []; } - const prefix = makePrefix(model, date, forecast, cycle, time, vpu); - const filesPrefix = await listPublicS3Files(prefix); - console.log("files_prefix", filesPrefix); - const ncFiles = filesPrefix.filter(f => f.endsWith('.nc')); - const ncFilesParsed = ncFiles.map(f => `s3://ciroh-community-ngen-datastream/${f}`); - return ncFilesParsed; +// export function getNCFiles(model, date, forecast, cycle, time, vpu, outputFile) { +export function getNCFiles(prefix) { + // const prefix = makePrefix(model, date, forecast, cycle, time, vpu); + // const ncFileParsed = `s3://ciroh-community-ngen-datastream/${prefix}${outputFile}`; + const ncFileParsed = `s3://ciroh-community-ngen-datastream/${prefix}`; + return ncFileParsed } export const makeGpkgUrl = (vpu) => { const vpu_gpkg = `s3://ciroh-community-ngen-datastream/v2.2_resources/${vpu}/config/nextgen_${vpu}.gpkg`; return vpu_gpkg; -} \ No newline at end of file +} + +export const initialS3Data = async(vpu, { signal } = {}) => { + let _models = await getOptionsFromURL(`outputs`, { signal }); + if (_models.length === 0){ + return {models: [], dates: [], forecasts: [], cycles: [], outputFiles: []}; + } + const models = _models.filter(m => m.value !== 'test'); + const dates = (await getOptionsFromURL(`outputs/${models[0]?.value}/v2.2_hydrofabric/`, { signal })).reverse(); + if (dates.length === 0){ + return {models, dates: [], forecasts: [], cycles: [], outputFiles: []}; + } + const forecasts = (await getOptionsFromURL(`outputs/${models[0]?.value}/v2.2_hydrofabric/${dates[1]?.value}/`, { signal })).reverse(); + if (forecasts.length === 0){ + return {models, dates, forecasts: [], cycles: [], outputFiles: []}; + } + const cycles = await getOptionsFromURL(`outputs/${models[0]?.value}/v2.2_hydrofabric/${dates[1]?.value}/${forecasts[0]?.value}/`, { signal }); + if (cycles.length === 0){ + return {models, dates, forecasts, cycles: [], outputFiles: []}; + } + if (!vpu) { + return {models, dates, forecasts, cycles, outputFiles: []}; + } + const outputFiles = await getOptionsFromURL(`outputs/${models[0]?.value}/v2.2_hydrofabric/${dates[1]?.value}/${forecasts[0]?.value}/${cycles[0]?.value}/${vpu}/ngen-run/outputs/troute/`, { signal }); + return {models, dates, forecasts, cycles, outputFiles}; +} + diff --git a/reactapp/features/DataStream/store/CacheTables.js b/reactapp/features/DataStream/store/CacheTables.js new file mode 100644 index 0000000..4d777bb --- /dev/null +++ b/reactapp/features/DataStream/store/CacheTables.js @@ -0,0 +1,31 @@ +import {create} from 'zustand'; +import { deleteFileFromCache, clearCache } from '../lib/opfsCache'; +import { deleteTable, dropAllVpuDataTables } from '../lib/queryData'; + +const EMPTY_TABLE = [] + +export const useCacheTablesStore = create((set) => ({ + cacheTables: EMPTY_TABLE, + add_cacheTable: (newCacheTable) => set((state) => ({ + cacheTables: [...state.cacheTables, newCacheTable], + })), + delete_cacheTable: async (tableId) => + { + await deleteFileFromCache(tableId); + await deleteTable(tableId); + set( + (state) => ({ + cacheTables: state.cacheTables.filter( + (table) => table.id !== tableId + ), + }) + ) + }, + reset: async () => { + await dropAllVpuDataTables(); + await clearCache(); + set({ cacheTables: EMPTY_TABLE }); + }, + + set_cacheTables: (newCacheTables) => set({ cacheTables: newCacheTables }), +})); \ No newline at end of file diff --git a/reactapp/features/DataStream/store/Datastream.js b/reactapp/features/DataStream/store/Datastream.js index 1e498e4..503c4bf 100644 --- a/reactapp/features/DataStream/store/Datastream.js +++ b/reactapp/features/DataStream/store/Datastream.js @@ -1,50 +1,70 @@ import { create } from 'zustand'; import { getYesterdayDateString } from '../lib/utils'; -// Define the store +const DEFAULTS = { + bucket: "ciroh-community-ngen-datastream", + nexus_pmtiles: "https://communityhydrofabric.s3.us-east-1.amazonaws.com/map/nexus.pmtiles", + community_pmtiles: "https://communityhydrofabric.s3.us-east-1.amazonaws.com/map/merged.pmtiles", + hydrofabric_index: "https://communityhydrofabric.s3.us-east-1.amazonaws.com/map/hydrofabric_index.parquet", + cache_key: null, + vpu: null, + model: "cfe_nom", + date: `ngen.${getYesterdayDateString()}`, + forecast: "analysis_assim_extend", + ensemble: null, + cycle: "00", + outputFile: null, + variables: [], +}; + +const sameArrayValues = (a, b) => { + if (a === b) return true; + if (!Array.isArray(a) || !Array.isArray(b)) return false; + if (a.length !== b.length) return false; + for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false; + return true; +}; + const useDataStreamStore = create((set) => ({ - bucket: 'ciroh-community-ngen-datastream', - nexus_pmtiles: 'https://communityhydrofabric.s3.us-east-1.amazonaws.com/map/nexus.pmtiles', - community_pmtiles: 'https://communityhydrofabric.s3.us-east-1.amazonaws.com/map/merged.pmtiles', - hydrofabric_index: 'https://communityhydrofabric.s3.us-east-1.amazonaws.com/map/hydrofabric_index.parquet', - cache_key: null, - vpu: `VPU_01`, - model: 'cfe_nom', - date: `ngen.${getYesterdayDateString()}`, - dates: [], - forecast: 'short_range', - time: null, - cycle: '00', - variables: [], + ...DEFAULTS, + set_bucket: (bucket) => set((s) => (s.bucket === bucket ? s : { bucket })), + set_cache_key: (cache_key) => set((s) => (s.cache_key === cache_key ? s : { cache_key })), + set_vpu: (vpu) => set((s) => (s.vpu === vpu ? s : { vpu })), + set_date: (date) => set((s) => (s.date === date ? s : { date })), + set_forecast: (forecast) => set((s) => (s.forecast === forecast ? s : { forecast })), + set_ensemble: (ensemble) => set((s) => (s.ensemble === ensemble ? s : { ensemble })), + set_cycle: (cycle) => set((s) => (s.cycle === cycle ? s : { cycle })), + set_model: (model) => set((s) => (s.model === model ? s : { model })), + set_outputFile: (outputFile) => + set((s) => (s.outputFile === outputFile ? s : { outputFile })), + set_nexus_pmtiles: (nexus_pmtiles) => + set((s) => (s.nexus_pmtiles === nexus_pmtiles ? s : { nexus_pmtiles })), + set_community_pmtiles: (community_pmtiles) => + set((s) => (s.community_pmtiles === community_pmtiles ? s : { community_pmtiles })), + set_hydrofabric_index: (hydrofabric_index) => + set((s) => (s.hydrofabric_index === hydrofabric_index ? s : { hydrofabric_index })), + set_variables: (variables) => + set((s) => (sameArrayValues(s.variables, variables) ? s : { variables })), + reset: () => + set((s) => { + const already = + s.bucket === DEFAULTS.bucket && + s.nexus_pmtiles === DEFAULTS.nexus_pmtiles && + s.community_pmtiles === DEFAULTS.community_pmtiles && + s.hydrofabric_index === DEFAULTS.hydrofabric_index && + s.cache_key === DEFAULTS.cache_key && + s.vpu === DEFAULTS.vpu && + s.model === DEFAULTS.model && + s.date === DEFAULTS.date && + s.forecast === DEFAULTS.forecast && + s.ensemble === DEFAULTS.ensemble && + s.cycle === DEFAULTS.cycle && + s.outputFile === DEFAULTS.outputFile && + sameArrayValues(s.variables, DEFAULTS.variables); - set_bucket: (newBucket) => set({ bucket: newBucket }), - set_cache_key: (newCacheKey) => set({ cache_key: newCacheKey }), - set_vpu: (newVpu) => set({ vpu: newVpu }), - set_date: (newDate) => set({ date: newDate }), - set_forecast: (newForecast) => set({ forecast: newForecast }), - set_time: (newTime) => set({ time: newTime }), - set_cycle: (newCycle) => set({ cycle: newCycle }), - set_model: (newModel) => set({ model: newModel }), - set_nexus_pmtiles: (newNexusPmtiles) => set({ nexus_pmtiles: newNexusPmtiles }), - set_community_pmtiles: (newCommunityPmtiles) => set({ community_pmtiles: newCommunityPmtiles }), - set_hydrofabric_index: (newHydrofabricIndex) => set({ hydrofabric_index: newHydrofabricIndex }), - set_variables: (newVariables) => set({ variables: newVariables }), - set_dates: (newDates) => set({ dates: newDates }), - reset: () => set({ - bucket: 'ciroh-community-ngen-datastream', - nexus_pmtiles: 'https://communityhydrofabric.s3.us-east-1.amazonaws.com/map/nexus.pmtiles', - community_pmtiles: 'https://communityhydrofabric.s3.us-east-1.amazonaws.com/map/merged.pmtiles', - hydrofabric_index: 'https://communityhydrofabric.s3.us-east-1.amazonaws.com/map/hydrofabric_index.parquet', - model: 'cfe_nom', - cache_key: null, - vpu: `VPU_01`, - date: 'ngen.20251125', - forecast: 'short_range', - time: null, - cycle: '00', - variables: [], - dates: [], - }), + return already ? s : { ...DEFAULTS }; + }), })); + export default useDataStreamStore; \ No newline at end of file diff --git a/reactapp/features/DataStream/store/Layers.js b/reactapp/features/DataStream/store/Layers.js index b4ab6b0..933c6c8 100644 --- a/reactapp/features/DataStream/store/Layers.js +++ b/reactapp/features/DataStream/store/Layers.js @@ -1,59 +1,188 @@ import { create } from 'zustand'; +import { subscribeWithSelector } from "zustand/middleware"; -export const useLayersStore = create((set) => ({ - nexus: { - visible: true, - }, - catchments: { - visible: true, - }, - flowpaths: { - visible: true - }, - conus_gauges: { - visible: false +const sameArrayRefOrValues = (a, b) => + a === b || + (!!a && + !!b && + a.length === b.length && + a.every((v, i) => v === b[i])); + +const shallowEqualObj = (a, b) => { + if (a === b) return true; + if (!a || !b) return false; + const aKeys = Object.keys(a); + const bKeys = Object.keys(b); + if (aKeys.length !== bKeys.length) return false; + for (const k of aKeys) { + if (a[k] !== b[k]) return false; + } + return true; +}; + +const buildFeatureIdToIndex = (featureIds) => { + const m = {}; + for (let idx = 0; idx < featureIds.length; idx++) { + const id = featureIds[idx]; + m[id] = idx; + m[`wb-${id}`] = idx; + } + return m; +}; + +const featureKey = (f) => + f?.id ?? f?.properties?.id ?? f?.properties?.feature_id ?? null; + +export const useLayersStore = create( + subscribeWithSelector((set, get) => ({ + nexus: { visible: false }, + catchments: { visible: true }, + flowpaths: { visible: true }, + conus_gauges: { visible: false }, + + colorBounds: { + flow: { min: 0, max: 100 }, + velocity: { min: 0, max: 5 }, + depth: { min: 0, max: 3 }, }, + hovered_enabled: false, - set_hovered_enabled: (isEnabled) => set({ hovered_enabled: isEnabled }), + + // ---- getters (fine to keep, but note: using get() doesn't subscribe) ---- get_nexus_visibility: () => get().nexus.visible, get_catchments_visibility: () => get().catchments.visible, - set_nexus_visibility: (isVisible) => set((state) => ({ - nexus: { - ...state.nexus, - visible: isVisible, - }, - })), - set_catchments_visibility: (isVisible) => set((state) => ({ - catchments: { - ...state.catchments, - visible: isVisible, - }, - })), - set_flowpaths_visibility: (isVisible) => set((state) => ({ - flowpaths: { - ...state.flowpaths, - visible: isVisible - } - })), - set_conus_gauges_visibility: (isVisible) => set((state) => ({ - conus_gauges: { - ...state.conus_gauges, - visible: isVisible - } - })) -})); + + // ---- setters with guards ---- + set_hovered_enabled: (isEnabled) => + set((s) => (s.hovered_enabled === isEnabled ? s : { hovered_enabled: isEnabled })), + + set_nexus_visibility: (isVisible) => + set((s) => (s.nexus.visible === isVisible ? s : { nexus: { ...s.nexus, visible: isVisible } })), + + set_catchments_visibility: (isVisible) => + set((s) => + s.catchments.visible === isVisible ? s : { catchments: { ...s.catchments, visible: isVisible } } + ), + + set_flowpaths_visibility: (isVisible) => + set((s) => + s.flowpaths.visible === isVisible ? s : { flowpaths: { ...s.flowpaths, visible: isVisible } } + ), + + set_conus_gauges_visibility: (isVisible) => + set((s) => + s.conus_gauges.visible === isVisible + ? s + : { conus_gauges: { ...s.conus_gauges, visible: isVisible } } + ), + + set_colorBounds: (key, bounds) => + set((s) => { + const prev = s.colorBounds?.[key]; + if (!prev) return s; + if (prev.min === bounds.min && prev.max === bounds.max) return s; + return { + colorBounds: { + ...s.colorBounds, + [key]: { ...prev, ...bounds }, + }, + }; + }), + })) +); + export const useFeatureStore = create((set) => ({ - hovered_feature: null, - selected_feature: null, - - set_selected_feature: (feature) => - set(() => ({ - selected_feature: feature, - })), - set_hovered_feature: (feature) => - set(() => ({ - hovered_feature: feature, - })), -})); \ No newline at end of file + hovered_feature: null, + selected_feature: null, + + set_selected_feature: (feature) => + set((s) => { + // same reference OR same id => no update + if (s.selected_feature === feature) return s; + if (featureKey(s.selected_feature) === featureKey(feature)) return s; + return { selected_feature: feature }; + }), + + set_hovered_feature: (feature) => + set((s) => { + if (s.hovered_feature === feature) return s; + if (featureKey(s.hovered_feature) === featureKey(feature)) return s; + return { hovered_feature: feature }; + }), +})); + + +export const useVPUStore = create( + subscribeWithSelector((set, get) => ({ + featureIds: [], + featureIdToIndex: {}, + times: [], + valuesByVar: {}, + + // Optional convenience getters + getVarData: (variable) => get().valuesByVar?.[variable], + set_feature_ids: (featureIds) => + set((s) => { + if (sameArrayRefOrValues(s.featureIds, featureIds)) return s; + return { featureIds }; + }), + + /** + * Sets featureIds + times + featureIdToIndex + * - avoids rebuilding objects if inputs are identical + * - avoids replacing featureIdToIndex if it would be identical by value + */ + setAnimationIndex: (featureIds, times) => + set((s) => { + const sameIds = sameArrayRefOrValues(s.featureIds, featureIds); + const sameTimes = sameArrayRefOrValues(s.times, times); + + // if both are same, do nothing + if (sameIds && sameTimes) return s; + + // Only rebuild mapping if featureIds changed + let nextMap = s.featureIdToIndex; + if (!sameIds) { + const built = buildFeatureIdToIndex(featureIds); + nextMap = shallowEqualObj(s.featureIdToIndex, built) ? s.featureIdToIndex : built; + } + + return { + featureIds: sameIds ? s.featureIds : featureIds, + times: sameTimes ? s.times : times, + featureIdToIndex: nextMap, + }; + }), + + + setVarData: (variable, flatValues) => + set((s) => { + const prev = s.valuesByVar?.[variable]; + + // if same reference, no update (most important guard) + if (prev === flatValues) return s; + + const nextValuesByVar = { ...s.valuesByVar, [variable]: flatValues }; + + if (shallowEqualObj(s.valuesByVar, nextValuesByVar)) return s; + + return { valuesByVar: nextValuesByVar }; + }), + + resetVPU: () => + set((s) => { + const emptyObj = {}; + if ( + s.featureIds.length === 0 && + s.times.length === 0 && + Object.keys(s.featureIdToIndex).length === 0 && + Object.keys(s.valuesByVar).length === 0 + ) { + return s; + } + return { featureIds: [], times: [], featureIdToIndex: emptyObj, valuesByVar: emptyObj }; + }), + })) +); \ No newline at end of file diff --git a/reactapp/features/DataStream/store/Timeseries.js b/reactapp/features/DataStream/store/Timeseries.js index e3e4bdf..2362403 100644 --- a/reactapp/features/DataStream/store/Timeseries.js +++ b/reactapp/features/DataStream/store/Timeseries.js @@ -1,34 +1,130 @@ import { create } from 'zustand'; -// Define the store -const useTimeSeriesStore = create((set) => ({ - series: [], - feature_id: null, - variable: '', - layout: { - "yaxis": "Streamflow", - "xaxis": "Simulation Time Period (YYYY-MM-DD)", - "title": "TimeSeries", - }, - table: '', - loading: false, - set_loading: (isLoading) => set({ loading: isLoading }), - set_table: (newTable) => set({table: newTable}), - set_feature_id: (newFeatureId) => set({ feature_id: newFeatureId }), - set_series: (newSeries) => set({ series: newSeries }), - set_chart_layout: (newLayout) => set({ chart_layout: newLayout }), - set_variable: (newVariable) => set({ variable: newVariable }), - set_layout: (newLayout) => set({layout: newLayout }), - reset_series: () => set({ series: [] }), - reset: () => set({ - series: [], - feature_id: null, - variable: '', - layout: { - "yaxis": "Streamflow", - "xaxis": "Simulation Time Period (YYYY-MM-DD)", - "title": "TimeSeries", - }, - table: '', - }), -})); +import { subscribeWithSelector } from 'zustand/middleware'; + +const clamp = (n, min, max) => Math.max(min, Math.min(max, n)); + +const EMPTY_SERIES = []; +const DEFAULT_LAYOUT = Object.freeze({ + yaxis: 'Streamflow', + xaxis: 'Simulation Time Period (YYYY-MM-DD)', + title: 'TimeSeries', +}); + +function seriesFingerprint(arr) { + if (!Array.isArray(arr) || arr.length === 0) return 'empty'; + const first = arr[0]; + const last = arr[arr.length - 1]; + const fx = first?.x instanceof Date ? first.x.getTime() : first?.x; + const lx = last?.x instanceof Date ? last.x.getTime() : last?.x; + return `${arr.length}|${fx}|${first?.y}|${lx}|${last?.y}`; +} + +const useTimeSeriesStore = create( + subscribeWithSelector((set, get ) => ({ + series: EMPTY_SERIES, + feature_id: null, + variable: '', + layout: DEFAULT_LAYOUT, + + loading: false, + loadingText: '' , + currentTimeIndex: 0, + + isPlaying: false, + playSpeed: 10, + baseFrameMs: 2500, + set_series: (nextSeries) => { + set((s) => { + const prev = s.series; + + // same ref => no update + if (prev === nextSeries) return s; + + // both empty => no update (this is the one your screenshot screams about) + const prevEmpty = !prev || prev.length === 0; + const nextEmpty = !nextSeries || nextSeries.length === 0; + if (prevEmpty && nextEmpty) return s; + + // "equal by value" guard (cheap) + if (seriesFingerprint(prev) === seriesFingerprint(nextSeries)) return s; + + return { series: nextSeries }; + }); + }, + set_layout: (next) => + set((s) => { + const prev = s.layout; + if ( + prev?.title === next?.title && + prev?.xaxis === next?.xaxis && + prev?.yaxis === next?.yaxis + ) { + return s; + } + return { layout: next }; + }), + setCurrentTimeIndex: (idx) => { + set((s) => { + const maxIdx = Math.max(0, (s.series?.length || 0) - 1); + const next = clamp(Number(idx) || 0, 0, maxIdx); + if (next === s.currentTimeIndex) return s; // IMPORTANT + return { currentTimeIndex: next }; + }); + }, + + setPlaySpeed: (speed) => { + const s = clamp(Number(speed) || 1, 1, 20); + set({ playSpeed: s }); + }, + + toggleIsPlaying: () => set((s) => ({ isPlaying: !s.isPlaying })), + + // --- stepping used by back/forward buttons + autoplay --- + stepForward: () => { + const { series, currentTimeIndex } = get(); + const maxIdx = series.length - 1; + if (maxIdx < 0) return; + set({ currentTimeIndex: (currentTimeIndex + 1) % (maxIdx + 1) }); + }, + + stepBackward: () => { + const { series, currentTimeIndex } = get(); + const maxIdx = series.length - 1; + if (maxIdx < 0) return; + set({ currentTimeIndex: currentTimeIndex === 0 ? maxIdx : currentTimeIndex - 1 }); + }, + + // returns "T+Nh" assuming 1-hour timesteps; + getCurrentTimeLabel: () => { + const { series, currentTimeIndex } = get(); + const t0 = series?.[0]?.time; + const t = series?.[currentTimeIndex]?.time; + if (typeof t0 !== "number" || typeof t !== "number") return "T+0h"; + const hours = Math.round((t - t0) / 3600000); // ms -> hours + return `T+${hours}h`; + }, + set_loading: (isLoading) => set({ loading: isLoading }), + set_loading_text: (newLoadingText) => set({ loadingText: newLoadingText }), + set_feature_id: (newFeatureId) => set({ feature_id: newFeatureId }), + + set_chart_layout: (newLayout) => set({ chart_layout: newLayout }), + set_variable: (newVariable) => set({ variable: newVariable }), + reset_series: () => + set((s) => { + if (s.series === EMPTY_SERIES && s.currentTimeIndex === 0 && s.isPlaying === false) return s; + return { series: EMPTY_SERIES, currentTimeIndex: 0, isPlaying: false }; + }), + + reset: () => + set((s) => ({ + ...s, + series: EMPTY_SERIES, + feature_id: null, + variable: '', + layout: DEFAULT_LAYOUT, + currentTimeIndex: 0, + isPlaying: false, + })), + })) +); export default useTimeSeriesStore; \ No newline at end of file diff --git a/reactapp/features/DataStream/store/s3Store.js b/reactapp/features/DataStream/store/s3Store.js new file mode 100644 index 0000000..92b518e --- /dev/null +++ b/reactapp/features/DataStream/store/s3Store.js @@ -0,0 +1,151 @@ +import { create } from "zustand"; + +const DEFAULT_BUCKET = "ciroh-community-ngen-datastream"; + +/** + * Compare arrays of option objects by value. + * Assumes items look like: { value: string, label?: string, ... } + * If your arrays are big, this is still O(n) but avoids lots of re-renders. + */ +function sameOptionsByValue(a, b) { + if (a === b) return true; + if (!Array.isArray(a) || !Array.isArray(b)) return false; + if (a.length !== b.length) return false; + + for (let i = 0; i < a.length; i++) { + const ai = a[i]; + const bi = b[i]; + // stable "identity" for options + if (ai?.value !== bi?.value) return false; + // optionally also compare label if you want + } + return true; +} + +/** + * Compare primitive/strings safely. + */ +function samePrimitive(a, b) { + return a === b; +} + +const useS3DataStreamBucketStore = create((set, get) => ({ + bucket: DEFAULT_BUCKET, + models: [], + dates: [], + forecasts: [], + cycles: [], + ensembles: [], + outputFiles: [], + prefix: "", + + set_bucket: (newBucket) => + set((s) => (samePrimitive(s.bucket, newBucket) ? s : { bucket: newBucket })), + + set_prefix: (newPrefix) => + set((s) => (samePrimitive(s.prefix, newPrefix) ? s : { prefix: newPrefix })), + + set_models: (newModels) => + set((s) => (sameOptionsByValue(s.models, newModels) ? s : { models: newModels })), + + set_dates: (newDates) => + set((s) => (sameOptionsByValue(s.dates, newDates) ? s : { dates: newDates })), + + set_forecasts: (newForecasts) => + set((s) => + sameOptionsByValue(s.forecasts, newForecasts) ? s : { forecasts: newForecasts } + ), + + set_cycles: (newCycles) => + set((s) => (sameOptionsByValue(s.cycles, newCycles) ? s : { cycles: newCycles })), + + set_ensembles: (newEnsembles) => + set((s) => + sameOptionsByValue(s.ensembles, newEnsembles) ? s : { ensembles: newEnsembles } + ), + + set_outputFiles: (newOutputFiles) => + set((s) => + sameOptionsByValue(s.outputFiles, newOutputFiles) ? s : { outputFiles: newOutputFiles } + ), + + /** + * Only update fields that truly changed. + * Also keeps your "ensembles: []" default behavior unless explicitly provided. + */ + setInitialData: (next) => + set((s) => { + const patch = {}; + let changed = false; + + const nextBucket = next.bucket ?? DEFAULT_BUCKET; + if (!samePrimitive(s.bucket, nextBucket)) { + patch.bucket = nextBucket; + changed = true; + } + + if (next.models && !sameOptionsByValue(s.models, next.models)) { + patch.models = next.models; + changed = true; + } + if (next.dates && !sameOptionsByValue(s.dates, next.dates)) { + patch.dates = next.dates; + changed = true; + } + if (next.forecasts && !sameOptionsByValue(s.forecasts, next.forecasts)) { + patch.forecasts = next.forecasts; + changed = true; + } + if (next.cycles && !sameOptionsByValue(s.cycles, next.cycles)) { + patch.cycles = next.cycles; + changed = true; + } + + // Your original behavior: default ensembles to [] unless given. + const nextEnsembles = next.ensembles ?? []; + if (!sameOptionsByValue(s.ensembles, nextEnsembles)) { + patch.ensembles = nextEnsembles; + changed = true; + } + + if (next.outputFiles && !sameOptionsByValue(s.outputFiles, next.outputFiles)) { + patch.outputFiles = next.outputFiles; + changed = true; + } + + if (typeof next.prefix === "string" && !samePrimitive(s.prefix, next.prefix)) { + patch.prefix = next.prefix; + changed = true; + } + + return changed ? patch : s; + }), + + reset: () => + set((s) => { + const alreadyDefault = + s.bucket === DEFAULT_BUCKET && + s.prefix === "" && + s.models.length === 0 && + s.dates.length === 0 && + s.forecasts.length === 0 && + s.cycles.length === 0 && + s.ensembles.length === 0 && + s.outputFiles.length === 0; + + return alreadyDefault + ? s + : { + bucket: DEFAULT_BUCKET, + models: [], + dates: [], + forecasts: [], + cycles: [], + ensembles: [], + outputFiles: [], + prefix: "", + }; + }), +})); + +export default useS3DataStreamBucketStore; diff --git a/reactapp/features/DataStream/views/DatastreamView.js b/reactapp/features/DataStream/views/DatastreamView.js index fa5e6fa..a88aa15 100644 --- a/reactapp/features/DataStream/views/DatastreamView.js +++ b/reactapp/features/DataStream/views/DatastreamView.js @@ -1,23 +1,251 @@ -import React from 'react'; +import React,{ useEffect} from 'react'; import { MapContainer, ViewContainer } from 'features/DataStream/components/styles/Styles'; import { ToastContainer } from 'react-toastify'; import MapComponent from 'features/DataStream/components/map/Mapg.js'; import MainMenu from 'features/DataStream/components/menus/MainMenu'; +import useDataStreamStore from 'features/DataStream/store/Datastream'; +import useTimeSeriesStore from '../store/Timeseries'; +import { useCacheTablesStore } from '../store/CacheTables'; +import { useVPUStore } from '../store/Layers'; +import useS3DataStreamBucketStore from 'features/DataStream/store/s3Store'; +import { initialS3Data, makePrefix, makeGpkgUrl } from 'features/DataStream/lib/s3Utils'; +import { getCacheKey } from 'features/DataStream/lib/opfsCache'; +import { checkForTable, + getTimeseries, + loadVpuData, + getFeatureIDs, + getDistinctFeatureIds, + getDistinctTimes, + getVpuVariableFlat, + getVariables +} from 'features/DataStream/lib/queryData'; +import { makeTitle } from 'features/DataStream/lib/utils'; import 'maplibre-gl/dist/maplibre-gl.css'; +import { useShallow } from "zustand/react/shallow"; +function InitialS3Loader() { + // const { vpu, ensemble, setAllState } = useDataStreamStore( + // useShallow((s) => ({ + // vpu: s.vpu, + // ensemble: s.ensemble, + // setAllState: s.setAllState, + // })) + // ); + const { vpu, ensemble } = useDataStreamStore( + useShallow((s) => ({ + vpu: s.vpu, + ensemble: s.ensemble, + })) + ); -const DataStreamView = () => { + const { set_model, set_forecast, set_cycle, set_outputFile, set_date, set_ensemble, set_cache_key } = useDataStreamStore( + useShallow((s) => ({ + set_model: s.set_model, + set_forecast: s.set_forecast, + set_cycle: s.set_cycle, + set_outputFile: s.set_outputFile, + set_date: s.set_date, + set_ensemble: s.set_ensemble, + set_cache_key: s.set_cache_key, + })) + ); + const { setInitialData } = useS3DataStreamBucketStore( + useShallow((s) => ({ setInitialData: s.setInitialData })) + ); + + useEffect(() => { + const controller = new AbortController(); + let alive = true; + + async function fetchInitialData() { + if (!vpu) return; + try { + const { models, dates, forecasts, cycles, outputFiles } = + await initialS3Data(vpu, { signal: controller.signal }); + + if (!alive) return; // <- prevents any setState after unmount/dep change + + const _models = models.filter(m => m.value !== 'test'); + + const cacheKey = getCacheKey( + _models[0]?.value, + dates[1]?.value, + forecasts[0]?.value, + cycles[0]?.value, + ensemble, + vpu, + outputFiles[0]?.value + ); + + set_model(_models[0]?.value); + set_forecast(forecasts[0]?.value); + set_cycle(cycles[0]?.value); + set_outputFile(outputFiles[0]?.value); + set_date(dates[1]?.value); + set_ensemble(ensemble); + set_cache_key(cacheKey); + // setAllState({ + // model: _models[0]?.value, + // date: dates[1]?.value, + // forecast: forecasts[0]?.value, + // cycle: cycles[0]?.value, + // ensemble: null, + // outputFile: outputFiles[0]?.value, + // cache_key: cacheKey, + // }); + + const _prefix = makePrefix( + _models[0]?.value, + dates[1]?.value, + forecasts[0]?.value, + cycles[0]?.value, + ensemble, + vpu, + outputFiles[0]?.value + ); + + setInitialData({ + models: _models, + dates: dates, + forecasts: forecasts, + cycles: cycles, + outputFiles: outputFiles, + prefix: _prefix, + }); + + } catch (error) { + // fetch abort throws DOMException with name AbortError + if (error?.name === 'AbortError') return; + console.error('Error fetching initial S3 data:', error); + } + } + + fetchInitialData(); + + return () => { + alive = false; + controller.abort(); + }; + }, [vpu]); + + return null; +} + +function TimeseriesLoader() { + const { cacheKey, outputFile, forecast, vpu, set_variables } = useDataStreamStore( + useShallow((s) => ({ + cacheKey: s.cache_key, + outputFile: s.outputFile, + forecast: s.forecast, + vpu: s.vpu, + set_variables: s.set_variables, + })) + ); + const { add_cacheTable } = useCacheTablesStore( + useShallow((s) => ({ + add_cacheTable: s.add_cacheTable, + })) + ); + const { prefix } = useS3DataStreamBucketStore( + useShallow((s) => ({ prefix: s.prefix })) + ); + + const { feature_id, loading, variable, set_variable, set_loading_text, set_series, set_layout, set_loading } = useTimeSeriesStore( + useShallow((s) => ({ + feature_id: s.feature_id, + loading: s.loading, + variable: s.variable, + set_variable: s.set_variable, + set_loading_text: s.set_loading_text, + set_series: s.set_series, + set_layout: s.set_layout, + set_loading: s.set_loading, + })) + ); + const { set_feature_ids, setVarData, setAnimationIndex } = useVPUStore( + useShallow((s) => ({ + set_feature_ids: s.set_feature_ids, + setVarData: s.setVarData, + setAnimationIndex: s.setAnimationIndex, + })) + ); + + useEffect( () => { + async function getData(){ + if (!outputFile || loading || !feature_id ) return; + const vpu_gpkg = makeGpkgUrl(vpu); + const id = feature_id.split('-')[1]; + set_loading(true); + set_loading_text('Loading feature properties...'); + let currentVariable = variable; + try { + const tableExists = await checkForTable(cacheKey); + if (!tableExists) { + try{ + const fileSize = await loadVpuData(cacheKey, prefix, vpu_gpkg); + add_cacheTable({id: cacheKey, name: cacheKey.replaceAll('_',' '), size: fileSize}); + }catch(err){ + console.error('No data for VPU', vpu, err); + set_loading_text('No data available for selected VPU'); + set_loading(false); + } + const featureIDs = await getFeatureIDs(cacheKey); + set_feature_ids(featureIDs); + const variables = await getVariables({ cacheKey }); + set_variables(variables); + set_variable(variables[0]); + currentVariable = variables[0]; + const [featureIds, times, flat] = await Promise.all([ + getDistinctFeatureIds(cacheKey), + getDistinctTimes(cacheKey), + getVpuVariableFlat(cacheKey, currentVariable), + ]); + setAnimationIndex(featureIds, times); + setVarData(currentVariable, flat); + } + const series = await getTimeseries(id, cacheKey, currentVariable); + const xy = series.map((d) => ({ + x: new Date(d.time), + y: d[currentVariable], + })); + set_loading_text(`Loaded ${xy.length} points for id: ${id}`); + set_series(xy); + set_layout({ + yaxis: currentVariable, + xaxis: '', + title: makeTitle(forecast, feature_id), + }); + set_loading_text(''); + set_loading(false); + } + catch (err) { + set_loading_text(`Failed to load timeseries for id: ${id}`); + set_loading(false); + console.error('Failed to load timeseries for', id, err); + } + } + getData(); + + }, [cacheKey, feature_id]); + + + return null; +} + + +const DataStreamView = () => { return ( - - - - - + + + + + + + ); }; - export default DataStreamView; diff --git a/reactapp/index.js b/reactapp/index.js index 1bb55af..9e5797c 100644 --- a/reactapp/index.js +++ b/reactapp/index.js @@ -1,3 +1,5 @@ +// import './wdyr' + import { BrowserRouter } from 'react-router-dom'; import { StrictMode } from 'react'; import { createRoot } from 'react-dom/client'; diff --git a/reactapp/wdyr.js b/reactapp/wdyr.js new file mode 100644 index 0000000..c22e626 --- /dev/null +++ b/reactapp/wdyr.js @@ -0,0 +1,9 @@ +import React from 'react'; + +if (process.env.NODE_ENV === 'development') { + console.log("WDYR enabled"); + const whyDidYouRender = require('@welldone-software/why-did-you-render'); + whyDidYouRender(React, { + trackAllPureComponents: true, + }); +} \ No newline at end of file diff --git a/tethysapp/nrds/controllers.py b/tethysapp/nrds/controllers.py index 17df987..c1b3c2b 100644 --- a/tethysapp/nrds/controllers.py +++ b/tethysapp/nrds/controllers.py @@ -25,23 +25,21 @@ @controller def home(request): """Controller for the app home page.""" - # The index.html template loads the React frontend return App.render(request, "index.html") @controller def getParquetPerVpu(request): print("Getting parquet file per vpu...") - file_prefix_list = json.loads(request.body.decode("utf-8"))['nc_files'] + + file_prefix = json.loads(request.body.decode("utf-8"))['ncFile'] vpu_gpkg = json.loads(request.body.decode("utf-8"))['vpu_gpkg'] - dfs = [] - for file_prefix in file_prefix_list: - df = convert_nc_2_df( - s3_nc_url=file_prefix, - s3_gpkg_url=vpu_gpkg, - ) - dfs.append(df) - complete_df = pd.concat(dfs, ignore_index=True) + print("file_prefix", file_prefix) + print("vpu_gpkg", vpu_gpkg) + complete_df = convert_nc_2_df( + s3_nc_url=file_prefix, + s3_gpkg_url=vpu_gpkg, + ) table = pa.Table.from_pandas(complete_df) buf = io.BytesIO()