@jax-data-science/sci-image-visualizer 0.8.3 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +201 -460
- package/esm2022/index.mjs +34 -15
- package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +163 -91
- package/esm2022/lib/contracts/capabilities.contract.mjs +4 -3
- package/esm2022/lib/contracts/cell-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +5 -1
- package/esm2022/lib/contracts/color.mjs +60 -0
- package/esm2022/lib/contracts/colormap-lut.mjs +213 -57
- package/esm2022/lib/contracts/coordinate-transform.contract.mjs +1 -1
- package/esm2022/lib/contracts/display-types.mjs +11 -1
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/intensity.mjs +48 -5
- package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
- package/esm2022/lib/contracts/plot-type.mjs +134 -17
- package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
- package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
- package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
- package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
- package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
- package/esm2022/lib/contracts/sam.contract.mjs +1 -1
- package/esm2022/lib/contracts/section-view.contract.mjs +2 -0
- package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
- package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/contracts/viz-config.mjs +2 -1
- package/esm2022/lib/geometry/contour.mjs +63 -0
- package/esm2022/lib/geometry/loft.mjs +128 -0
- package/esm2022/lib/geometry/polylabel.mjs +156 -0
- package/esm2022/lib/geometry/raster.mjs +98 -0
- package/esm2022/lib/geometry/reconstruct.mjs +315 -0
- package/esm2022/lib/geometry/reslice-image.mjs +57 -0
- package/esm2022/lib/geometry/ring.mjs +201 -0
- package/esm2022/lib/geometry/section.mjs +215 -0
- package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
- package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
- package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
- package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
- package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
- package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
- package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +12 -9
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +83 -0
- package/esm2022/lib/implementations/napari-js/napari-region-mesh-pointer.mjs +100 -0
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +180 -591
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +270 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
- package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
- package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
- package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
- package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +347 -0
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +427 -4207
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +129 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +550 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-slice-planes.mjs +103 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
- package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +194 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
- package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
- package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
- package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
- package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
- package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
- package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
- package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
- package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
- package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +164 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +213 -716
- package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
- package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
- package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
- package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
- package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
- package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
- package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
- package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
- package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
- package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
- package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
- package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
- package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
- package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
- package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
- package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
- package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
- package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
- package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
- package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
- package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
- package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
- package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
- package/esm2022/lib/implementations/region-centroids.mjs +47 -0
- package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
- package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
- package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
- package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
- package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
- package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
- package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
- package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
- package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
- package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
- package/esm2022/lib/models/bezier.mjs +1 -11
- package/esm2022/lib/models/class-preset.mjs +41 -3
- package/esm2022/lib/models/geometry.mjs +27 -164
- package/esm2022/lib/models/polygon-edit.mjs +254 -0
- package/esm2022/lib/models/polygon-factory.mjs +134 -0
- package/esm2022/lib/models/region-clone.mjs +68 -0
- package/esm2022/lib/models/region-geojson.mjs +411 -0
- package/esm2022/lib/models/region.mjs +34 -33
- package/esm2022/lib/models/shape.mjs +18 -16
- package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
- package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
- package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
- package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
- package/esm2022/lib/plot.utilities.mjs +296 -473
- package/esm2022/lib/processing/image-crop.mjs +1 -1
- package/esm2022/lib/processing/processing-image.mjs +28 -15
- package/esm2022/lib/provide-visualization.mjs +40 -14
- package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +156 -0
- package/esm2022/lib/region-editor/class-tree/class-tree.mjs +108 -0
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +163 -0
- package/esm2022/lib/region-editor/file-stem.mjs +13 -0
- package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
- package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
- package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
- package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
- package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
- package/esm2022/lib/region-editor/region-editor.component.mjs +896 -660
- package/esm2022/lib/region-editor/region-metrics.mjs +86 -0
- package/esm2022/lib/region-editor/region-persistence.service.mjs +160 -0
- package/esm2022/lib/region-editor/region-table/region-table.component.mjs +169 -0
- package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
- package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
- package/esm2022/lib/region-ops.service.mjs +28 -70
- package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
- package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
- package/esm2022/lib/region-overlay/region-source-layer.mjs +378 -0
- package/esm2022/lib/region-overlay/region-style.mjs +97 -0
- package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
- package/esm2022/lib/region-source/http-region-source.mjs +104 -0
- package/esm2022/lib/region-source/region-source-ops.mjs +53 -0
- package/esm2022/lib/region-source/region-source-worker.mjs +10 -0
- package/esm2022/lib/region-source/region-source.mjs +67 -0
- package/esm2022/lib/region-source/region-tiles.mjs +708 -0
- package/esm2022/lib/region-source/worker-region-source.mjs +229 -0
- package/esm2022/lib/render-orchestrator.mjs +14 -11
- package/esm2022/lib/render-session.mjs +207 -0
- package/esm2022/lib/routing-visualizer.service.mjs +858 -414
- package/esm2022/lib/section-pane/section-pane.component.mjs +299 -0
- package/esm2022/lib/spatial/density-raster.mjs +14 -0
- package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
- package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
- package/esm2022/lib/spatial/gene-search.mjs +1 -1
- package/esm2022/lib/spatial/glyphs.mjs +97 -0
- package/esm2022/lib/spatial/lod.mjs +187 -0
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
- package/esm2022/lib/spatial/spatial-density.mjs +25 -16
- package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
- package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
- package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
- package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
- package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
- package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
- package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
- package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
- package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
- package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
- package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
- package/esm2022/lib/spatial/stats.mjs +71 -0
- package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
- package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
- package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
- package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
- package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
- package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
- package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
- package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
- package/esm2022/lib/store/class-color.util.mjs +53 -5
- package/esm2022/lib/store/class-signatures.mjs +63 -0
- package/esm2022/lib/store/region-history.mjs +146 -0
- package/esm2022/lib/store/region-scope-cache.mjs +144 -0
- package/esm2022/lib/store/region-selection.mjs +82 -0
- package/esm2022/lib/store/region-source-scope.mjs +171 -0
- package/esm2022/lib/store/region-store.service.mjs +986 -670
- package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
- package/esm2022/lib/store/visualizer-store.service.mjs +81 -76
- package/esm2022/lib/toast-outlets.mjs +5 -4
- package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
- package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
- package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
- package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
- package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
- package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +120 -0
- package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
- package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
- package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
- package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
- package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
- package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
- package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
- package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
- package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
- package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
- package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
- package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
- package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
- package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +121 -0
- package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
- package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
- package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
- package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
- package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
- package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
- package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
- package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
- package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
- package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
- package/esm2022/lib/toolbar/toolbar.component.mjs +84 -119
- package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
- package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
- package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
- package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
- package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
- package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
- package/esm2022/lib/util/mark-for-check.mjs +17 -0
- package/esm2022/lib/util/supersede.mjs +56 -0
- package/esm2022/lib/visualization.module.mjs +39 -141
- package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
- package/esm2022/lib/visualizer/region-actions.mjs +149 -0
- package/esm2022/lib/visualizer/region-load.mjs +123 -0
- package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
- package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
- package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
- package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
- package/esm2022/lib/visualizer/volume-sections.mjs +175 -0
- package/esm2022/lib/visualizer.component.mjs +602 -1902
- package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
- package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
- package/esm2022/lib/workers/spatial-math.mjs +190 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs +47169 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs +238 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34467
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/fesm2022/mask.worker.js +36 -917
- package/fesm2022/onnx-sam.worker.js +52 -16
- package/fesm2022/region-source.worker.js +1067 -0
- package/fesm2022/spatial-math.worker.js +471 -0
- package/fesm2022/tsne.worker.js +32 -15
- package/index.d.ts +19 -10
- package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
- package/lib/contracts/capabilities.contract.d.ts +4 -2
- package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
- package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
- package/lib/contracts/color.d.ts +27 -0
- package/lib/contracts/colormap-lut.d.ts +19 -4
- package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
- package/lib/contracts/display-types.d.ts +21 -0
- package/lib/contracts/image.contract.d.ts +4 -0
- package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
- package/lib/contracts/intensity.d.ts +13 -2
- package/lib/contracts/plot-type.d.ts +3 -1
- package/lib/contracts/ports/image-state.port.d.ts +6 -2
- package/lib/contracts/ports/preferences.port.d.ts +4 -0
- package/lib/contracts/ports/region-io.port.d.ts +1 -0
- package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
- package/lib/contracts/ports/tile-access.port.d.ts +1 -0
- package/lib/contracts/region-editor-api.contract.d.ts +85 -1
- package/lib/contracts/region-overlay.contract.d.ts +5 -0
- package/lib/contracts/region-store.contract.d.ts +22 -0
- package/lib/contracts/sam.contract.d.ts +7 -0
- package/lib/contracts/section-view.contract.d.ts +44 -0
- package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
- package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
- package/lib/contracts/visualizer.contract.d.ts +231 -54
- package/lib/contracts/viz-config.d.ts +9 -0
- package/lib/geometry/contour.d.ts +24 -0
- package/lib/geometry/loft.d.ts +22 -0
- package/lib/geometry/polylabel.d.ts +23 -0
- package/lib/geometry/raster.d.ts +42 -0
- package/lib/geometry/reconstruct.d.ts +54 -0
- package/lib/geometry/reslice-image.d.ts +33 -0
- package/lib/geometry/ring.d.ts +67 -0
- package/lib/geometry/section.d.ts +52 -0
- package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
- package/lib/implementations/base-store-visualizer.d.ts +61 -15
- package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
- package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
- package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
- package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
- package/lib/implementations/napari-js/napari-loading-badge.d.ts +4 -3
- package/lib/implementations/napari-js/napari-loading-state.d.ts +37 -0
- package/lib/implementations/napari-js/napari-region-mesh-pointer.d.ts +32 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +68 -71
- package/lib/implementations/napari-js/napari-scene.d.ts +126 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
- package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
- package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
- package/lib/implementations/napari-js/napari-spatial-hover.d.ts +91 -0
- package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
- package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
- package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
- package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
- package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
- package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +169 -883
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +66 -0
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +148 -0
- package/lib/implementations/napari-js/napari-volume-slice-planes.d.ts +43 -0
- package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
- package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
- package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
- package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
- package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
- package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
- package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
- package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
- package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
- package/lib/implementations/osd/display-pipeline.d.ts +38 -9
- package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
- package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
- package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
- package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
- package/lib/implementations/osd/osd-coords.d.ts +6 -4
- package/lib/implementations/osd/osd-export.d.ts +36 -0
- package/lib/implementations/osd/osd-lib.d.ts +7 -0
- package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
- package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
- package/lib/implementations/osd/osd-region-overlay-draw.d.ts +38 -0
- package/lib/implementations/osd/osd-region-overlay.d.ts +46 -51
- package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
- package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
- package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
- package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
- package/lib/implementations/osd/osd-viewport.d.ts +77 -0
- package/lib/implementations/osd/osd-zoom.d.ts +6 -0
- package/lib/implementations/osd/simple-source.d.ts +161 -0
- package/lib/implementations/osd/slice-cache.d.ts +12 -3
- package/lib/implementations/osd/tile-client.d.ts +11 -14
- package/lib/implementations/osd/tile-recolor.d.ts +141 -0
- package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
- package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
- package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
- package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
- package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
- package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
- package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
- package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
- package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
- package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
- package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
- package/lib/implementations/plotly/plotly.service.d.ts +136 -401
- package/lib/implementations/region-centroids.d.ts +14 -0
- package/lib/implementations/simple-slice-access.service.d.ts +7 -4
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
- package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
- package/lib/implementations/tile-server/index.d.ts +5 -0
- package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
- package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
- package/lib/implementations/tile-server/tile-protocol.d.ts +83 -0
- package/lib/implementations/tile-server/transport.d.ts +62 -0
- package/lib/intensity/intensity-profile.d.ts +66 -0
- package/lib/intensity/intensity-profile.service.d.ts +108 -0
- package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
- package/lib/models/bezier.d.ts +0 -5
- package/lib/models/class-preset.d.ts +25 -0
- package/lib/models/geometry.d.ts +14 -48
- package/lib/models/polygon-edit.d.ts +72 -0
- package/lib/models/polygon-factory.d.ts +45 -0
- package/lib/models/region-clone.d.ts +20 -0
- package/lib/models/region-geojson.d.ts +57 -0
- package/lib/models/region.d.ts +59 -4
- package/lib/models/shape.d.ts +8 -0
- package/lib/plot-mode/contribution-host.d.ts +125 -0
- package/lib/plot-mode/plot-type-menu.d.ts +60 -0
- package/lib/plot-mode/tool-params-model.d.ts +49 -0
- package/lib/plot.utilities.d.ts +19 -30
- package/lib/processing/processing-image.d.ts +5 -2
- package/lib/provide-visualization.d.ts +19 -2
- package/lib/region-editor/class-tree/class-tree.component.d.ts +78 -0
- package/lib/region-editor/class-tree/class-tree.d.ts +31 -0
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +86 -0
- package/lib/region-editor/file-stem.d.ts +7 -0
- package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
- package/lib/region-editor/mask-export.service.d.ts +54 -0
- package/lib/region-editor/mask-raster.d.ts +2 -8
- package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
- package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
- package/lib/region-editor/region-editor.component.d.ts +283 -200
- package/lib/region-editor/region-metrics.d.ts +34 -0
- package/lib/region-editor/region-persistence.service.d.ts +77 -0
- package/lib/region-editor/region-table/region-table.component.d.ts +89 -0
- package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
- package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
- package/lib/region-ops.service.d.ts +1 -7
- package/lib/region-overlay/region-geometry.d.ts +158 -0
- package/lib/region-overlay/region-hit-test.d.ts +38 -0
- package/lib/region-overlay/region-source-layer.d.ts +96 -0
- package/lib/region-overlay/region-style.d.ts +52 -0
- package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
- package/lib/region-source/http-region-source.d.ts +45 -0
- package/lib/region-source/region-source-ops.d.ts +89 -0
- package/lib/region-source/region-source-worker.d.ts +7 -0
- package/lib/region-source/region-source.d.ts +82 -0
- package/lib/region-source/region-tiles.d.ts +289 -0
- package/lib/region-source/worker-region-source.d.ts +65 -0
- package/lib/render-orchestrator.d.ts +6 -2
- package/lib/render-session.d.ts +75 -0
- package/lib/routing-visualizer.service.d.ts +248 -59
- package/lib/section-pane/section-pane.component.d.ts +47 -0
- package/lib/spatial/density-raster.d.ts +6 -0
- package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
- package/lib/spatial/embedding-compute.d.ts +21 -2
- package/lib/spatial/glyphs.d.ts +16 -0
- package/lib/spatial/lod.d.ts +94 -0
- package/lib/spatial/spatial-controls.facade.d.ts +64 -0
- package/lib/spatial/spatial-density.d.ts +15 -5
- package/lib/spatial/spatial-encoding.d.ts +11 -44
- package/lib/spatial/spatial-expression.d.ts +40 -22
- package/lib/spatial/spatial-framing.d.ts +1 -0
- package/lib/spatial/spatial-heatmap.d.ts +2 -0
- package/lib/spatial/spatial-hover.d.ts +4 -16
- package/lib/spatial/spatial-panel-model.d.ts +135 -0
- package/lib/spatial/spatial-selection.d.ts +21 -26
- package/lib/spatial/spatial-tile-merge.d.ts +41 -0
- package/lib/spatial/spatial-tiles.d.ts +9 -256
- package/lib/spatial/stats.d.ts +38 -0
- package/lib/spatial/transcript-grouping.d.ts +119 -0
- package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
- package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
- package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
- package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
- package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
- package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
- package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
- package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
- package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
- package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
- package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
- package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
- package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
- package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
- package/lib/store/class-color.util.d.ts +39 -2
- package/lib/store/class-signatures.d.ts +11 -0
- package/lib/store/region-history.d.ts +66 -0
- package/lib/store/region-scope-cache.d.ts +65 -0
- package/lib/store/region-selection.d.ts +36 -0
- package/lib/store/region-source-scope.d.ts +68 -0
- package/lib/store/region-store.service.d.ts +312 -116
- package/lib/store/visualizer-store.service.d.ts +32 -33
- package/lib/toast-outlets.d.ts +4 -3
- package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
- package/lib/toolbar/canvas-tools.d.ts +20 -0
- package/lib/toolbar/crop/slide-crop.d.ts +10 -4
- package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
- package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
- package/lib/toolbar/region-tools/region-tools.component.d.ts +62 -0
- package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
- package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
- package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
- package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
- package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
- package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
- package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
- package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
- package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
- package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
- package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
- package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
- package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
- package/lib/toolbar/stack-controls/stack-controls.component.d.ts +51 -0
- package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
- package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
- package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
- package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
- package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
- package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
- package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
- package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
- package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
- package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
- package/lib/toolbar/toolbar.component.d.ts +55 -84
- package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
- package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
- package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
- package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
- package/lib/toolbar/wand/wand.service.d.ts +22 -116
- package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
- package/lib/util/mark-for-check.d.ts +11 -0
- package/lib/util/supersede.d.ts +53 -0
- package/lib/visualization.module.d.ts +18 -39
- package/lib/visualizer/floating-drag.directive.d.ts +30 -0
- package/lib/visualizer/region-actions.d.ts +54 -0
- package/lib/visualizer/region-load.d.ts +46 -0
- package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
- package/lib/visualizer/tool-modes.d.ts +49 -0
- package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
- package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
- package/lib/visualizer/volume-sections.d.ts +64 -0
- package/lib/visualizer.component.d.ts +232 -447
- package/lib/workers/spatial-math-ops.d.ts +65 -0
- package/lib/workers/spatial-math-worker.d.ts +7 -0
- package/lib/workers/spatial-math.d.ts +74 -0
- package/package.json +12 -3
- package/src/lib/assets/slice.svg +23 -0
- package/src/lib/styles/_viz-icons-rules.scss +73 -0
- package/src/lib/styles/viz-icons.scss +14 -0
- package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
- package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
- package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
- package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
- package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
- package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
- package/src/lib/assets/cell-detection.svg +0 -37
- package/src/lib/assets/click.svg +0 -1
- package/src/lib/assets/colormap-luts.json +0 -1
- package/src/lib/assets/edit-selection-white.svg +0 -47
- package/src/lib/assets/icons/colormap-earth.png +0 -0
- package/src/lib/assets/icons/colormap-placeholder.png +0 -0
- package/src/lib/assets/icons/colormap-pubu.png +0 -0
- package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
- package/src/lib/assets/picture-segmentation.svg +0 -43
- package/src/lib/assets/test/download-379.svg +0 -1
- package/src/lib/assets/test/download-98.svg +0 -1
- package/src/lib/assets/test/json-1.svg +0 -1
- package/src/lib/assets/test/load-53.svg +0 -1
- package/src/lib/assets/test/mask-44.svg +0 -1
- package/src/lib/assets/test/mask-download-44.svg +0 -15
- package/src/lib/assets/test/mask-save-44.svg +0 -11
- package/src/lib/assets/test/overlay-1.svg +0 -1
- package/src/lib/assets/test/overlay-4.svg +0 -1
- package/src/lib/assets/test/region-26.svg +0 -1
- package/src/lib/assets/test/save-56.svg +0 -1
- package/src/lib/assets/test/upload-43.svg +0 -1
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, Inject, Input, NgZone, signal, } from '@angular/core';
|
|
2
|
+
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
3
|
+
import { CommonModule } from '@angular/common';
|
|
4
|
+
import { VISUALIZER } from '../contracts/visualizer.contract';
|
|
5
|
+
import { FloatingDragDirective } from '../visualizer/floating-drag.directive';
|
|
6
|
+
import * as i0 from "@angular/core";
|
|
7
|
+
import * as i1 from "@angular/common";
|
|
8
|
+
/**
|
|
9
|
+
* The floating, draggable intensity-profile inset: shown while any intensity line
|
|
10
|
+
* exists, charting one trace per line as lines are added, moved or removed.
|
|
11
|
+
*
|
|
12
|
+
* Owns the profile and viewport-change subscriptions, the window-resize reflow, the
|
|
13
|
+
* drag and the per-instance chart div id it is given. The chart itself is drawn by the
|
|
14
|
+
* backend (`IVisualizer.renderIntensityInset`) so this never reaches a charting
|
|
15
|
+
* library. Fixed to the viewport, outside the plot div, so it is not clipped to the
|
|
16
|
+
* canvas.
|
|
17
|
+
*
|
|
18
|
+
* OnPush, with its view state in signals: the profile stream may fire outside the zone.
|
|
19
|
+
*/
|
|
20
|
+
export class IntensityInsetComponent {
|
|
21
|
+
constructor(visualizer, cdr, zone, destroyRef) {
|
|
22
|
+
this.visualizer = visualizer;
|
|
23
|
+
this.cdr = cdr;
|
|
24
|
+
this.zone = zone;
|
|
25
|
+
this.destroyRef = destroyRef;
|
|
26
|
+
/** Id of the chart div — unique per viewer: the backend resolves it by id. */
|
|
27
|
+
this.divId = '';
|
|
28
|
+
/** Id of the viewer's plot div: the inset parks near its top-right corner. */
|
|
29
|
+
this.plotDivName = '';
|
|
30
|
+
/** The displayed slice, re-sampled at when the view settles. */
|
|
31
|
+
this.zIndex = 0;
|
|
32
|
+
/** The Image view (OSD), whose line sampling is fed from preview frames. */
|
|
33
|
+
this.imageView = false;
|
|
34
|
+
/** True whenever any intensity-profile line exists (whatever the plot type). */
|
|
35
|
+
this.hasProfiles = signal(false);
|
|
36
|
+
this.pos = signal({ x: 20, y: 70 });
|
|
37
|
+
/** Where a header drag starts from. */
|
|
38
|
+
this.dragOrigin = () => this.pos();
|
|
39
|
+
this.profiles = [];
|
|
40
|
+
this.onResize = () => {
|
|
41
|
+
// Reflow to the (fixed) panel size once layout has settled: a mid-reflow resize
|
|
42
|
+
// can leave the chart at a stale or zero size.
|
|
43
|
+
if (this.hasProfiles())
|
|
44
|
+
requestAnimationFrame(() => this.render());
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
ngOnInit() {
|
|
48
|
+
this.visualizer
|
|
49
|
+
.getIntensityProfile$()
|
|
50
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
51
|
+
.subscribe((profiles) => {
|
|
52
|
+
this.profiles = profiles;
|
|
53
|
+
this.hasProfiles.set(profiles.length > 0);
|
|
54
|
+
// The panel is behind *ngIf. detectChanges() materializes it synchronously (the
|
|
55
|
+
// stream may fire outside the zone, e.g. from an OSD drag). Render on the next
|
|
56
|
+
// frame, AFTER layout: drawn synchronously, Plotly sizes a fresh chart to a zero
|
|
57
|
+
// box and keeps it, so the inset stays blank.
|
|
58
|
+
this.cdr.detectChanges();
|
|
59
|
+
requestAnimationFrame(() => this.render());
|
|
60
|
+
});
|
|
61
|
+
// When the OSD view settles at a new zoom/pan, re-sample from a crop of the
|
|
62
|
+
// visible region so the inset reflects the zoom-level resolution (Plotly's own
|
|
63
|
+
// high-def zoom updates the sampling cache inline).
|
|
64
|
+
this.visualizer
|
|
65
|
+
.getViewportChange$()
|
|
66
|
+
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
67
|
+
.subscribe((roi) => {
|
|
68
|
+
if (this.hasProfiles() && this.imageView) {
|
|
69
|
+
this.visualizer.refreshIntensitySamplingForRoi(roi.x, roi.y, roi.width, roi.height, this.zIndex);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
this.zone.runOutsideAngular(() => window.addEventListener('resize', this.onResize));
|
|
73
|
+
}
|
|
74
|
+
/** Removes the window resize listener; the streams end through `takeUntilDestroyed`. */
|
|
75
|
+
ngOnDestroy() {
|
|
76
|
+
window.removeEventListener('resize', this.onResize);
|
|
77
|
+
}
|
|
78
|
+
/** The canvas was resized: reflow the chart a tick later, once the panel has settled. */
|
|
79
|
+
reflow() {
|
|
80
|
+
if (this.hasProfiles())
|
|
81
|
+
setTimeout(() => this.render(), 0);
|
|
82
|
+
}
|
|
83
|
+
/** A slice was committed: keep the lines sampled from it (Image view). */
|
|
84
|
+
sliceCommitted(z) {
|
|
85
|
+
if (this.hasProfiles() && this.imageView && this.imageInfo) {
|
|
86
|
+
void this.visualizer.ensureIntensitySampling(this.imageInfo, z);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Add another line ROI (next bright colour) and select it on the active backend so
|
|
91
|
+
* it is ready to move or delete. The first line parks the inset near the plot's
|
|
92
|
+
* top-right. Resolves the new line, or null when no image extent is known yet.
|
|
93
|
+
*/
|
|
94
|
+
async addProfileLine() {
|
|
95
|
+
if (!this.hasProfiles()) {
|
|
96
|
+
const rect = document.getElementById(this.plotDivName)?.getBoundingClientRect();
|
|
97
|
+
this.pos.set(rect ? { x: Math.max(10, rect.right - 300), y: rect.top + 10 } : { x: 20, y: 70 });
|
|
98
|
+
}
|
|
99
|
+
// Image (OSD) view: Plotly never rendered, so it has no pixel cache / extent. Load
|
|
100
|
+
// the current slice's frames for sampling + line placement first.
|
|
101
|
+
if (this.imageView && this.imageInfo) {
|
|
102
|
+
await this.visualizer.ensureIntensitySampling(this.imageInfo, this.zIndex);
|
|
103
|
+
}
|
|
104
|
+
const region = this.visualizer.getIntensityControls()?.addProfileLine() ?? null;
|
|
105
|
+
if (region)
|
|
106
|
+
this.visualizer.selectRegion(region);
|
|
107
|
+
return region;
|
|
108
|
+
}
|
|
109
|
+
render() {
|
|
110
|
+
if (this.hasProfiles())
|
|
111
|
+
this.visualizer.renderIntensityInset(this.divId, this.profiles);
|
|
112
|
+
}
|
|
113
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: IntensityInsetComponent, deps: [{ token: VISUALIZER }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
114
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: IntensityInsetComponent, isStandalone: true, selector: "viz-intensity-inset", inputs: { divId: "divId", plotDivName: "plotDivName", zIndex: "zIndex", imageView: "imageView", imageInfo: "imageInfo" }, ngImport: i0, template: "<div *ngIf=\"hasProfiles()\" class=\"intensity-panel\" [style.left.px]=\"pos().x\" [style.top.px]=\"pos().y\">\n <div class=\"intensity-panel-header\" [vizFloatingDrag]=\"dragOrigin\" (vizFloatingDragMove)=\"pos.set($event)\">\n <span>Intensity profile</span>\n <i class=\"pi pi-arrows-alt\"></i>\n </div>\n <div [id]=\"divId\" class=\"intensity-panel-plot\"></div>\n</div>\n", styles: [".intensity-panel{position:fixed;z-index:1100;width:280px;height:180px;background:#191919e6;border:1px solid var(--primary-color, #3399ff);border-radius:6px;box-shadow:0 4px 14px #00000073;display:flex;flex-direction:column;overflow:hidden}.intensity-panel-header{display:flex;align-items:center;justify-content:space-between;padding:.25rem .5rem;cursor:move;-webkit-user-select:none;user-select:none;background:#ffffff14;color:#eee;font-size:.75rem;font-weight:600}.intensity-panel-header i{opacity:.6;font-size:.7rem}.intensity-panel-plot{flex:1 1 auto;width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: FloatingDragDirective, selector: "[vizFloatingDrag]", inputs: ["vizFloatingDrag"], outputs: ["vizFloatingDragMove"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
115
|
+
}
|
|
116
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: IntensityInsetComponent, decorators: [{
|
|
117
|
+
type: Component,
|
|
118
|
+
args: [{ selector: 'viz-intensity-inset', standalone: true, imports: [CommonModule, FloatingDragDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div *ngIf=\"hasProfiles()\" class=\"intensity-panel\" [style.left.px]=\"pos().x\" [style.top.px]=\"pos().y\">\n <div class=\"intensity-panel-header\" [vizFloatingDrag]=\"dragOrigin\" (vizFloatingDragMove)=\"pos.set($event)\">\n <span>Intensity profile</span>\n <i class=\"pi pi-arrows-alt\"></i>\n </div>\n <div [id]=\"divId\" class=\"intensity-panel-plot\"></div>\n</div>\n", styles: [".intensity-panel{position:fixed;z-index:1100;width:280px;height:180px;background:#191919e6;border:1px solid var(--primary-color, #3399ff);border-radius:6px;box-shadow:0 4px 14px #00000073;display:flex;flex-direction:column;overflow:hidden}.intensity-panel-header{display:flex;align-items:center;justify-content:space-between;padding:.25rem .5rem;cursor:move;-webkit-user-select:none;user-select:none;background:#ffffff14;color:#eee;font-size:.75rem;font-weight:600}.intensity-panel-header i{opacity:.6;font-size:.7rem}.intensity-panel-plot{flex:1 1 auto;width:100%}\n"] }]
|
|
119
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
120
|
+
type: Inject,
|
|
121
|
+
args: [VISUALIZER]
|
|
122
|
+
}] }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i0.DestroyRef }], propDecorators: { divId: [{
|
|
123
|
+
type: Input
|
|
124
|
+
}], plotDivName: [{
|
|
125
|
+
type: Input
|
|
126
|
+
}], zIndex: [{
|
|
127
|
+
type: Input
|
|
128
|
+
}], imageView: [{
|
|
129
|
+
type: Input
|
|
130
|
+
}], imageInfo: [{
|
|
131
|
+
type: Input
|
|
132
|
+
}] } });
|
|
133
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZW5zaXR5LWluc2V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvaW50ZW5zaXR5LWluc2V0L2ludGVuc2l0eS1pbnNldC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL2ludGVuc2l0eS1pbnNldC9pbnRlbnNpdHktaW5zZXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFHTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBaUMsVUFBVSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFN0YsT0FBTyxFQUFFLHFCQUFxQixFQUFlLE1BQU0sdUNBQXVDLENBQUM7OztBQUUzRjs7Ozs7Ozs7Ozs7R0FXRztBQVNILE1BQU0sT0FBTyx1QkFBdUI7SUF5QmxDLFlBQ3VDLFVBQXVCLEVBQzNDLEdBQXNCLEVBQ3RCLElBQVksRUFDWixVQUFzQjtRQUhGLGVBQVUsR0FBVixVQUFVLENBQWE7UUFDM0MsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUNaLGVBQVUsR0FBVixVQUFVLENBQVk7UUE1QnpDLDhFQUE4RTtRQUNyRSxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLDhFQUE4RTtRQUNyRSxnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUMxQixnRUFBZ0U7UUFDdkQsV0FBTSxHQUFHLENBQUMsQ0FBQztRQUNwQiw0RUFBNEU7UUFDbkUsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUkzQixnRkFB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R1UsdUJBQXVCLGtCQTBCeEIsVUFBVTtrR0ExQlQsdUJBQXVCLHlNQ3hDcEMsa1lBT0EsZ25CRDRCWSxZQUFZLG1JQUFFLHFCQUFxQjs7MkZBS2xDLHVCQUF1QjtrQkFSbkMsU0FBUzsrQkFDRSxxQkFBcUIsY0FDbkIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLHFCQUFxQixDQUFDLG1CQUM3Qix1QkFBdUIsQ0FBQyxNQUFNOzswQkE4QjVDLE1BQU07MkJBQUMsVUFBVTt1SEF4QlgsS0FBSztzQkFBYixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsTUFBTTtzQkFBZCxLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBEZXN0cm95UmVmLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBzaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuaW1wb3J0IHsgSUltYWdlSW5mbyB9IGZyb20gJy4uL2NvbnRyYWN0cy9pbWFnZS5jb250cmFjdCc7XG5pbXBvcnQgeyBJbnRlbnNpdHlQcm9maWxlLCBJVmlzdWFsaXplciwgVklTVUFMSVpFUiB9IGZyb20gJy4uL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7IFJlZ2lvbiB9IGZyb20gJy4uL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHsgRmxvYXRpbmdEcmFnRGlyZWN0aXZlLCBGbG9hdGluZ1BvcyB9IGZyb20gJy4uL3Zpc3VhbGl6ZXIvZmxvYXRpbmctZHJhZy5kaXJlY3RpdmUnO1xuXG4vKipcbiAqIFRoZSBmbG9hdGluZywgZHJhZ2dhYmxlIGludGVuc2l0eS1wcm9maWxlIGluc2V0OiBzaG93biB3aGlsZSBhbnkgaW50ZW5zaXR5IGxpbmVcbiAqIGV4aXN0cywgY2hhcnRpbmcgb25lIHRyYWNlIHBlciBsaW5lIGFzIGxpbmVzIGFyZSBhZGRlZCwgbW92ZWQgb3IgcmVtb3ZlZC5cbiAqXG4gKiBPd25zIHRoZSBwcm9maWxlIGFuZCB2aWV3cG9ydC1jaGFuZ2Ugc3Vic2NyaXB0aW9ucywgdGhlIHdpbmRvdy1yZXNpemUgcmVmbG93LCB0aGVcbiAqIGRyYWcgYW5kIHRoZSBwZXItaW5zdGFuY2UgY2hhcnQgZGl2IGlkIGl0IGlzIGdpdmVuLiBUaGUgY2hhcnQgaXRzZWxmIGlzIGRyYXduIGJ5IHRoZVxuICogYmFja2VuZCAoYElWaXN1YWxpemVyLnJlbmRlckludGVuc2l0eUluc2V0YCkgc28gdGhpcyBuZXZlciByZWFjaGVzIGEgY2hhcnRpbmdcbiAqIGxpYnJhcnkuIEZpeGVkIHRvIHRoZSB2aWV3cG9ydCwgb3V0c2lkZSB0aGUgcGxvdCBkaXYsIHNvIGl0IGlzIG5vdCBjbGlwcGVkIHRvIHRoZVxuICogY2FudmFzLlxuICpcbiAqIE9uUHVzaCwgd2l0aCBpdHMgdmlldyBzdGF0ZSBpbiBzaWduYWxzOiB0aGUgcHJvZmlsZSBzdHJlYW0gbWF5IGZpcmUgb3V0c2lkZSB0aGUgem9uZS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndml6LWludGVuc2l0eS1pbnNldCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZsb2F0aW5nRHJhZ0RpcmVjdGl2ZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZVVybDogJy4vaW50ZW5zaXR5LWluc2V0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaW50ZW5zaXR5LWluc2V0LmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEludGVuc2l0eUluc2V0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICAvKiogSWQgb2YgdGhlIGNoYXJ0IGRpdiDigJQgdW5pcXVlIHBlciB2aWV3ZXI6IHRoZSBiYWNrZW5kIHJlc29sdmVzIGl0IGJ5IGlkLiAqL1xuICBASW5wdXQoKSBkaXZJZCA9ICcnO1xuICAvKiogSWQgb2YgdGhlIHZpZXdlcidzIHBsb3QgZGl2OiB0aGUgaW5zZXQgcGFya3MgbmVhciBpdHMgdG9wLXJpZ2h0IGNvcm5lci4gKi9cbiAgQElucHV0KCkgcGxvdERpdk5hbWUgPSAnJztcbiAgLyoqIFRoZSBkaXNwbGF5ZWQgc2xpY2UsIHJlLXNhbXBsZWQgYXQgd2hlbiB0aGUgdmlldyBzZXR0bGVzLiAqL1xuICBASW5wdXQoKSB6SW5kZXggPSAwO1xuICAvKiogVGhlIEltYWdlIHZpZXcgKE9TRCksIHdob3NlIGxpbmUgc2FtcGxpbmcgaXMgZmVkIGZyb20gcHJldmlldyBmcmFtZXMuICovXG4gIEBJbnB1dCgpIGltYWdlVmlldyA9IGZhbHNlO1xuICAvKiogVGhlIGltYWdlIHNob3duICh0aGUgSW1hZ2UgdmlldyBzYW1wbGVzIGl0cyBsaW5lcyBmcm9tIGl0KS4gKi9cbiAgQElucHV0KCkgaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvIHwgdW5kZWZpbmVkO1xuXG4gIC8qKiBUcnVlIHdoZW5ldmVyIGFueSBpbnRlbnNpdHktcHJvZmlsZSBsaW5lIGV4aXN0cyAod2hhdGV2ZXIgdGhlIHBsb3QgdHlwZSkuICovXG4gIHByb3RlY3RlZCByZWFkb25seSBoYXNQcm9maWxlcyA9IHNpZ25hbChmYWxzZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBwb3MgPSBzaWduYWw8RmxvYXRpbmdQb3M+KHsgeDogMjAsIHk6IDcwIH0pO1xuICAvKiogV2hlcmUgYSBoZWFkZXIgZHJhZyBzdGFydHMgZnJvbS4gKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRyYWdPcmlnaW4gPSAoKTogRmxvYXRpbmdQb3MgPT4gdGhpcy5wb3MoKTtcblxuICBwcml2YXRlIHByb2ZpbGVzOiBJbnRlbnNpdHlQcm9maWxlW10gPSBbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBvblJlc2l6ZSA9ICgpID0+IHtcbiAgICAvLyBSZWZsb3cgdG8gdGhlIChmaXhlZCkgcGFuZWwgc2l6ZSBvbmNlIGxheW91dCBoYXMgc2V0dGxlZDogYSBtaWQtcmVmbG93IHJlc2l6ZVxuICAgIC8vIGNhbiBsZWF2ZSB0aGUgY2hhcnQgYXQgYSBzdGFsZSBvciB6ZXJvIHNpemUuXG4gICAgaWYgKHRoaXMuaGFzUHJvZmlsZXMoKSkgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMucmVuZGVyKCkpO1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoVklTVUFMSVpFUikgcHJpdmF0ZSByZWFkb25seSB2aXN1YWxpemVyOiBJVmlzdWFsaXplcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSByZWFkb25seSB6b25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmOiBEZXN0cm95UmVmLFxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy52aXN1YWxpemVyXG4gICAgICAuZ2V0SW50ZW5zaXR5UHJvZmlsZSQoKVxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKChwcm9maWxlcykgPT4ge1xuICAgICAgICB0aGlzLnByb2ZpbGVzID0gcHJvZmlsZXM7XG4gICAgICAgIHRoaXMuaGFzUHJvZmlsZXMuc2V0KHByb2ZpbGVzLmxlbmd0aCA+IDApO1xuICAgICAgICAvLyBUaGUgcGFuZWwgaXMgYmVoaW5kICpuZ0lmLiBkZXRlY3RDaGFuZ2VzKCkgbWF0ZXJpYWxpemVzIGl0IHN5bmNocm9ub3VzbHkgKHRoZVxuICAgICAgICAvLyBzdHJlYW0gbWF5IGZpcmUgb3V0c2lkZSB0aGUgem9uZSwgZS5nLiBmcm9tIGFuIE9TRCBkcmFnKS4gUmVuZGVyIG9uIHRoZSBuZXh0XG4gICAgICAgIC8vIGZyYW1lLCBBRlRFUiBsYXlvdXQ6IGRyYXduIHN5bmNocm9ub3VzbHksIFBsb3RseSBzaXplcyBhIGZyZXNoIGNoYXJ0IHRvIGEgemVyb1xuICAgICAgICAvLyBib3ggYW5kIGtlZXBzIGl0LCBzbyB0aGUgaW5zZXQgc3RheXMgYmxhbmsuXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMucmVuZGVyKCkpO1xuICAgICAgfSk7XG4gICAgLy8gV2hlbiB0aGUgT1NEIHZpZXcgc2V0dGxlcyBhdCBhIG5ldyB6b29tL3BhbiwgcmUtc2FtcGxlIGZyb20gYSBjcm9wIG9mIHRoZVxuICAgIC8vIHZpc2libGUgcmVnaW9uIHNvIHRoZSBpbnNldCByZWZsZWN0cyB0aGUgem9vbS1sZXZlbCByZXNvbHV0aW9uIChQbG90bHkncyBvd25cbiAgICAvLyBoaWdoLWRlZiB6b29tIHVwZGF0ZXMgdGhlIHNhbXBsaW5nIGNhY2hlIGlubGluZSkuXG4gICAgdGhpcy52aXN1YWxpemVyXG4gICAgICAuZ2V0Vmlld3BvcnRDaGFuZ2UkKClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSgocm9pKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmhhc1Byb2ZpbGVzKCkgJiYgdGhpcy5pbWFnZVZpZXcpIHtcbiAgICAgICAgICB0aGlzLnZpc3VhbGl6ZXIucmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKHJvaS54LCByb2kueSwgcm9pLndpZHRoLCByb2kuaGVpZ2h0LCB0aGlzLnpJbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5vblJlc2l6ZSkpO1xuICB9XG5cbiAgLyoqIFJlbW92ZXMgdGhlIHdpbmRvdyByZXNpemUgbGlzdGVuZXI7IHRoZSBzdHJlYW1zIGVuZCB0aHJvdWdoIGB0YWtlVW50aWxEZXN0cm95ZWRgLiAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5vblJlc2l6ZSk7XG4gIH1cblxuICAvKiogVGhlIGNhbnZhcyB3YXMgcmVzaXplZDogcmVmbG93IHRoZSBjaGFydCBhIHRpY2sgbGF0ZXIsIG9uY2UgdGhlIHBhbmVsIGhhcyBzZXR0bGVkLiAqL1xuICByZWZsb3coKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFzUHJvZmlsZXMoKSkgc2V0VGltZW91dCgoKSA9PiB0aGlzLnJlbmRlcigpLCAwKTtcbiAgfVxuXG4gIC8qKiBBIHNsaWNlIHdhcyBjb21taXR0ZWQ6IGtlZXAgdGhlIGxpbmVzIHNhbXBsZWQgZnJvbSBpdCAoSW1hZ2UgdmlldykuICovXG4gIHNsaWNlQ29tbWl0dGVkKHo6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmhhc1Byb2ZpbGVzKCkgJiYgdGhpcy5pbWFnZVZpZXcgJiYgdGhpcy5pbWFnZUluZm8pIHtcbiAgICAgIHZvaWQgdGhpcy52aXN1YWxpemVyLmVuc3VyZUludGVuc2l0eVNhbXBsaW5nKHRoaXMuaW1hZ2VJbmZvLCB6KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFub3RoZXIgbGluZSBST0kgKG5leHQgYnJpZ2h0IGNvbG91cikgYW5kIHNlbGVjdCBpdCBvbiB0aGUgYWN0aXZlIGJhY2tlbmQgc29cbiAgICogaXQgaXMgcmVhZHkgdG8gbW92ZSBvciBkZWxldGUuIFRoZSBmaXJzdCBsaW5lIHBhcmtzIHRoZSBpbnNldCBuZWFyIHRoZSBwbG90J3NcbiAgICogdG9wLXJpZ2h0LiBSZXNvbHZlcyB0aGUgbmV3IGxpbmUsIG9yIG51bGwgd2hlbiBubyBpbWFnZSBleHRlbnQgaXMga25vd24geWV0LlxuICAgKi9cbiAgYXN5bmMgYWRkUHJvZmlsZUxpbmUoKTogUHJvbWlzZTxSZWdpb24gfCBudWxsPiB7XG4gICAgaWYgKCF0aGlzLmhhc1Byb2ZpbGVzKCkpIHtcbiAgICAgIGNvbnN0IHJlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnBsb3REaXZOYW1lKT8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB0aGlzLnBvcy5zZXQocmVjdCA/IHsgeDogTWF0aC5tYXgoMTAsIHJlY3QucmlnaHQgLSAzMDApLCB5OiByZWN0LnRvcCArIDEwIH0gOiB7IHg6IDIwLCB5OiA3MCB9KTtcbiAgICB9XG4gICAgLy8gSW1hZ2UgKE9TRCkgdmlldzogUGxvdGx5IG5ldmVyIHJlbmRlcmVkLCBzbyBpdCBoYXMgbm8gcGl4ZWwgY2FjaGUgLyBleHRlbnQuIExvYWRcbiAgICAvLyB0aGUgY3VycmVudCBzbGljZSdzIGZyYW1lcyBmb3Igc2FtcGxpbmcgKyBsaW5lIHBsYWNlbWVudCBmaXJzdC5cbiAgICBpZiAodGhpcy5pbWFnZVZpZXcgJiYgdGhpcy5pbWFnZUluZm8pIHtcbiAgICAgIGF3YWl0IHRoaXMudmlzdWFsaXplci5lbnN1cmVJbnRlbnNpdHlTYW1wbGluZyh0aGlzLmltYWdlSW5mbywgdGhpcy56SW5kZXgpO1xuICAgIH1cbiAgICBjb25zdCByZWdpb24gPSB0aGlzLnZpc3VhbGl6ZXIuZ2V0SW50ZW5zaXR5Q29udHJvbHMoKT8uYWRkUHJvZmlsZUxpbmUoKSA/PyBudWxsO1xuICAgIGlmIChyZWdpb24pIHRoaXMudmlzdWFsaXplci5zZWxlY3RSZWdpb24ocmVnaW9uKTtcbiAgICByZXR1cm4gcmVnaW9uO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaGFzUHJvZmlsZXMoKSkgdGhpcy52aXN1YWxpemVyLnJlbmRlckludGVuc2l0eUluc2V0KHRoaXMuZGl2SWQsIHRoaXMucHJvZmlsZXMpO1xuICB9XG59XG4iLCI8ZGl2ICpuZ0lmPVwiaGFzUHJvZmlsZXMoKVwiIGNsYXNzPVwiaW50ZW5zaXR5LXBhbmVsXCIgW3N0eWxlLmxlZnQucHhdPVwicG9zKCkueFwiIFtzdHlsZS50b3AucHhdPVwicG9zKCkueVwiPlxuICA8ZGl2IGNsYXNzPVwiaW50ZW5zaXR5LXBhbmVsLWhlYWRlclwiIFt2aXpGbG9hdGluZ0RyYWddPVwiZHJhZ09yaWdpblwiICh2aXpGbG9hdGluZ0RyYWdNb3ZlKT1cInBvcy5zZXQoJGV2ZW50KVwiPlxuICAgIDxzcGFuPkludGVuc2l0eSBwcm9maWxlPC9zcGFuPlxuICAgIDxpIGNsYXNzPVwicGkgcGktYXJyb3dzLWFsdFwiPjwvaT5cbiAgPC9kaXY+XG4gIDxkaXYgW2lkXT1cImRpdklkXCIgY2xhc3M9XCJpbnRlbnNpdHktcGFuZWwtcGxvdFwiPjwvZGl2PlxuPC9kaXY+XG4iXX0=
|
|
@@ -107,14 +107,4 @@ export function bezierCurveFromHandles(xs, ys, handles, closed) {
|
|
|
107
107
|
}
|
|
108
108
|
return { xs: outX, ys: outY };
|
|
109
109
|
}
|
|
110
|
-
/**
|
|
111
|
-
* Flatten the smooth Catmull-Rom bezier through the anchors (no custom handles).
|
|
112
|
-
* Falls back to the anchors when there are too few to form a curve.
|
|
113
|
-
*/
|
|
114
|
-
export function bezierCurve(xs, ys, closed) {
|
|
115
|
-
const n = Math.min(xs.length, ys.length);
|
|
116
|
-
if (n < 3)
|
|
117
|
-
return { xs: xs.slice(), ys: ys.slice() };
|
|
118
|
-
return bezierCurveFromHandles(xs, ys, bezierAnchorHandles(xs, ys, closed), closed);
|
|
119
|
-
}
|
|
120
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmV6aWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tb2RlbHMvYmV6aWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQWdCSCw4RUFBOEU7QUFDOUUsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLENBQUM7QUFFL0I7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsRUFBWSxFQUFFLEVBQVksRUFBRSxNQUFlO0lBQzdFLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekMsTUFBTSxHQUFHLEdBQW1CLEVBQUUsQ0FBQztJQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDM0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDM0QsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUks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LEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDOUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLG1CQUFtQixFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDN0MsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLG1CQUFtQixDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3RSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztZQUN6RCxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUMzRCxDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksTUFBTSxFQUFFLENBQUM7UUFDWCxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQyxDQUFDO1NBQU0sQ0FBQztRQUNOLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUNELE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNoQyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxFQUFZLEVBQUUsRUFBWSxFQUFFLE1BQWU7SUFDckUsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6QyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDO0lBQ3JELE9BQU8sc0JBQXNCLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3JGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJlemllci1jdXJ2ZSBoZWxwZXJzIChubyBleHRlcm5hbCBkZXBlbmRlbmN5KS5cbiAqXG4gKiBKSVQgc3VwcG9ydHMgdHJ1ZSBiZXppZXIgcmVnaW9uczogYSBwb2x5Z29uJ3MgdmVydGljZXMgYXJlIHRoZSBlZGl0YWJsZVxuICogKmFuY2hvcnMqLCBhbmQgdGhlIHNtb290aCBjdXJ2ZSB0aHJvdWdoIHRoZW0gaXMgZGVyaXZlZCBoZXJlIHdpdGggdGhlXG4gKiBDYXRtdWxsLVJvbSBjb25zdHJ1Y3Rpb24g4oCUIHRoZSBzYW1lIGFsZ29yaXRobSBwYXBlci5qcyB1c2VzIGluXG4gKiBgcGF0aC5zbW9vdGgoKWAuIFRoZSBjdXJ2ZSBpbnRlcnBvbGF0ZXMgZXZlcnkgYW5jaG9yIGFuZFxuICogZWFjaCBhbmNob3IncyB0d28gaGFuZGxlcyBhcmUgY29saW5lYXIgKGEgc21vb3RoIHRhbmdlbnQpLlxuICpcbiAqIFRoZSBPU0Qgb3ZlcmxheSByZW5kZXJzIHRoZSBjdXJ2ZSBhcyBhIHRydWUgY3ViaWMgU1ZHIHBhdGggKyBkcmFnZ2FibGUgaGFuZGxlc1xuICogKHNlZSB7QGxpbmsgYmV6aWVyQW5jaG9ySGFuZGxlc30pOyBHZW9KU09OIGV4cG9ydCBmbGF0dGVucyB0aGUgKnNhbWUqIGN1Ymljc1xuICogaW50byBhIGRlbnNlIHBvaW50IGxpc3QgKHNlZSB7QGxpbmsgYmV6aWVyQ3VydmV9KSBzbyBhIHZpZXdlciB3aXRob3V0IGJlemllclxuICogc3VwcG9ydCAoZS5nLiBRdVBhdGgsIHdoaWNoIGp1c3QgZHJhd3MgdGhlIGNvb3JkaW5hdGUgbGlzdCkgc3RpbGwgc2hvd3MgdGhlXG4gKiBzbW9vdGggc2hhcGUuIFVzaW5nIG9uZSBhbGdvcml0aG0gZm9yIGJvdGgga2VlcHMgd2hhdCBKSVQgZHJhd3MgaWRlbnRpY2FsIHRvXG4gKiB3aGF0IGl0IGV4cG9ydHMuXG4gKlxuICogUHVyZSBmdW5jdGlvbnM6IG5vIERPTSwgbm8gc2VydmljZSBzdGF0ZS4gQ29vcmRpbmF0ZXMgYXJlIGltYWdlIHBpeGVscy5cbiAqL1xuXG5leHBvcnQgaW50ZXJmYWNlIEN1cnZlUG9pbnRzIHtcbiAgeHM6IG51bWJlcltdO1xuICB5czogbnVtYmVyW107XG59XG5cbi8qKiBBIHZlcnRleCdzIHR3byBjdWJpYy1iZXppZXIgY29udHJvbCBwb2ludHMgKGFic29sdXRlIGNvb3JkcykgcGx1cyB3aGV0aGVyXG4gKiAgZWFjaCBzaWRlIGhhcyBhIGhhbmRsZSAob3Blbi1wYXRoIGVuZHBvaW50cyBoYXZlIG9ubHkgb25lKS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW5jaG9ySGFuZGxlIHtcbiAgaW46IFtudW1iZXIsIG51bWJlcl07XG4gIG91dDogW251bWJlciwgbnVtYmVyXTtcbiAgaGFzSW46IGJvb2xlYW47XG4gIGhhc091dDogYm9vbGVhbjtcbn1cblxuLyoqIEhvdyBtYW55IHBvaW50cyB0byBzYW1wbGUgcGVyIGN1YmljIHNlZ21lbnQgd2hlbiBmbGF0dGVuaW5nIGZvciBleHBvcnQuICovXG5jb25zdCBTQU1QTEVTX1BFUl9TRUdNRU5UID0gMTY7XG5cbi8qKlxuICogUGVyLWFuY2hvciBjdWJpYy1iZXppZXIgY29udHJvbCBwb2ludHMgdXNpbmcgdGhlIENhdG11bGwtUm9tIGNvbnN0cnVjdGlvblxuICogKHRlbnNpb24gMTogY29udHJvbCA9IGFuY2hvciDCsSAobmV4dCDiiJIgcHJldikgLyA2KS4gTWF0Y2hlcyBwYXBlci5qc1xuICogYHBhdGguc21vb3RoKClgOiB0aGUgcmVzdWx0aW5nIGN1YmljIGludGVycG9sYXRlcyBldmVyeSBhbmNob3IgYW5kIHRoZSB0d29cbiAqIGhhbmRsZXMgb2YgZWFjaCBhbmNob3IgYXJlIGNvbGluZWFyLiBDb29yZGluYXRlcyBhcmUgaW4gdGhlIGlucHV0IHNwYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmV6aWVyQW5jaG9ySGFuZGxlcyh4czogbnVtYmVyW10sIHlzOiBudW1iZXJbXSwgY2xvc2VkOiBib29sZWFuKTogQW5jaG9ySGFuZGxlW10ge1xuICBjb25zdCBuID0gTWF0aC5taW4oeHMubGVuZ3RoLCB5cy5sZW5ndGgpO1xuICBjb25zdCBvdXQ6IEFuY2hvckhhbmRsZVtdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XG4gICAgY29uc3QgcHJldiA9IGNsb3NlZCA/IChpIC0gMSArIG4pICUgbiA6IE1hdGgubWF4KDAsIGkgLSAxKTtcbiAgICBjb25zdCBuZXh0ID0gY2xvc2VkID8gKGkgKyAxKSAlIG4gOiBNYXRoLm1pbihuIC0gMSwgaSArIDEpO1xuICAgIGNvbnN0IHR4ID0gKHhzW25leHRdIC0geHNbcHJldl0pIC8gNjtcbiAgICBjb25zdCB0eSA9ICh5c1tuZXh0XSAtIHlzW3ByZXZdKSAvIDY7XG4gICAgb3V0LnB1c2goe1xuICAgICAgb3V0OiBbeHNbaV0gKyB0eCwgeXNbaV0gKyB0eV0sXG4gICAgICBpbjogW3hzW2ldIC0gdHgsIHlzW2ldIC0gdHldLFxuICAgICAgaGFzT3V0OiBjbG9zZWQgfHwgaSA8IG4gLSAxLFxuICAgICAgaGFzSW46IGNsb3NlZCB8fCBpID4gMCxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKiogVGhlIENhdG11bGwtUm9tIGhhbmRsZXMgYXMgKipyZWxhdGl2ZSoqIG9mZnNldHMgYFtkeCwgZHldYCBwZXIgYW5jaG9yIOKAlCB1c2VkXG4gKiAgdG8gaW5pdGlhbGlzZSBhIHJlZ2lvbidzIGVkaXRhYmxlIGhhbmRsZXMgd2hlbiBiZXppZXIgaXMgdHVybmVkIG9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRIYW5kbGVPZmZzZXRzKHhzOiBudW1iZXJbXSwgeXM6IG51bWJlcltdLCBjbG9zZWQ6IGJvb2xlYW4pOlxuICB7IGluOiBudW1iZXJbXVtdOyBvdXQ6IG51bWJlcltdW10gfSB7XG4gIGNvbnN0IGggPSBiZXppZXJBbmNob3JIYW5kbGVzKHhzLCB5cywgY2xvc2VkKTtcbiAgcmV0dXJuIHtcbiAgICBpbjogaC5tYXAoKGEsIGkpID0+IFthLmluWzBdIC0geHNbaV0sIGEuaW5bMV0gLSB5c1tpXV0pLFxuICAgIG91dDogaC5tYXAoKGEsIGkpID0+IFthLm91dFswXSAtIHhzW2ldLCBhLm91dFsxXSAtIHlzW2ldXSksXG4gIH07XG59XG5cbi8qKiBBYnNvbHV0ZSBoYW5kbGVzIGZyb20gc3RvcmVkIHJlbGF0aXZlIG9mZnNldHMgKGFuY2hvciArIG9mZnNldCkuICovXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlc0Zyb21PZmZzZXRzKHhzOiBudW1iZXJbXSwgeXM6IG51bWJlcltdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk9mZjogbnVtYmVyW11bXSwgb3V0T2ZmOiBudW1iZXJbXVtdLCBjbG9zZWQ6IGJvb2xlYW4pOiBBbmNob3JIYW5kbGVbXSB7XG4gIGNvbnN0IG4gPSBNYXRoLm1pbih4cy5sZW5ndGgsIHlzLmxlbmd0aCk7XG4gIGNvbnN0IG91dDogQW5jaG9ySGFuZGxlW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBvdXQucHVzaCh7XG4gICAgICBpbjogW3hzW2ldICsgKGluT2ZmW2ldPy5bMF0gPz8gMCksIHlzW2ldICsgKGluT2ZmW2ldPy5bMV0gPz8gMCldLFxuICAgICAgb3V0OiBbeHNbaV0gKyAob3V0T2ZmW2ldPy5bMF0gPz8gMCksIHlzW2ldICsgKG91dE9mZltpXT8uWzFdID8/IDApXSxcbiAgICAgIGhhc091dDogY2xvc2VkIHx8IGkgPCBuIC0gMSxcbiAgICAgIGhhc0luOiBjbG9zZWQgfHwgaSA+IDAsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqIEEgcmVnaW9uJ3MgaGFuZGxlczogZnJvbSBpdHMgc3RvcmVkIChlZGl0YWJsZSkgb2Zmc2V0cyB3aGVuIHByZXNlbnQsIGVsc2UgdGhlXG4gKiAgQ2F0bXVsbC1Sb20gZGVmYXVsdC4gVGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIGJvdGggcmVuZGVyaW5nIGFuZCBleHBvcnQuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUhhbmRsZXMoeHM6IG51bWJlcltdLCB5czogbnVtYmVyW10sIGNsb3NlZDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk9mZj86IG51bWJlcltdW10sIG91dE9mZj86IG51bWJlcltdW10pOiBBbmNob3JIYW5kbGVbXSB7XG4gIGlmIChpbk9mZiAmJiBvdXRPZmYgJiYgaW5PZmYubGVuZ3RoID09PSB4cy5sZW5ndGggJiYgb3V0T2ZmLmxlbmd0aCA9PT0geHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGhhbmRsZXNGcm9tT2Zmc2V0cyh4cywgeXMsIGluT2ZmLCBvdXRPZmYsIGNsb3NlZCk7XG4gIH1cbiAgcmV0dXJuIGJlemllckFuY2hvckhhbmRsZXMoeHMsIHlzLCBjbG9zZWQpO1xufVxuXG4vKipcbiAqIEZsYXR0ZW4gYSBjdWJpYyBiZXppZXIgKGRlZmluZWQgYnkgZXhwbGljaXQgcGVyLWFuY2hvciBoYW5kbGVzKSBpbnRvIGEgZGVuc2VcbiAqIHBvaW50IGxpc3QgYnkgc2FtcGxpbmcgZWFjaCBzZWdtZW50LiBUaGUgY3VydmUgcGFzc2VzIHRocm91Z2ggZXZlcnkgYW5jaG9yOyBhXG4gKiBjbG9zZWQgcmluZyByZXR1cm5zIHRvIGl0cyBmaXJzdCBwb2ludC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlemllckN1cnZlRnJvbUhhbmRsZXMoeHM6IG51bWJlcltdLCB5czogbnVtYmVyW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVzOiBBbmNob3JIYW5kbGVbXSwgY2xvc2VkOiBib29sZWFuKTogQ3VydmVQb2ludHMge1xuICBjb25zdCBuID0gTWF0aC5taW4oeHMubGVuZ3RoLCB5cy5sZW5ndGgpO1xuICBpZiAobiA8IDMpIHJldHVybiB7IHhzOiB4cy5zbGljZSgpLCB5czogeXMuc2xpY2UoKSB9O1xuXG4gIGNvbnN0IG91dFg6IG51bWJlcltdID0gW107XG4gIGNvbnN0IG91dFk6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHNlZ3MgPSBjbG9zZWQgPyBuIDogbiAtIDE7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2VnczsgaSsrKSB7XG4gICAgY29uc3QgaiA9IChpICsgMSkgJSBuO1xuICAgIGNvbnN0IHAweCA9IHhzW2ldLCBwMHkgPSB5c1tpXTtcbiAgICBjb25zdCBjMSA9IGhhbmRsZXNbaV0ub3V0LCBjMiA9IGhhbmRsZXNbal0uaW47XG4gICAgY29uc3QgcDN4ID0geHNbal0sIHAzeSA9IHlzW2pdO1xuICAgIGZvciAobGV0IHMgPSAwOyBzIDwgU0FNUExFU19QRVJfU0VHTUVOVDsgcysrKSB7XG4gICAgICBjb25zdCB0ID0gcyAvIFNBTVBMRVNfUEVSX1NFR01FTlQ7XG4gICAgICBjb25zdCB1ID0gMSAtIHQ7XG4gICAgICBjb25zdCB3MCA9IHUgKiB1ICogdSwgdzEgPSAzICogdSAqIHUgKiB0LCB3MiA9IDMgKiB1ICogdCAqIHQsIHczID0gdCAqIHQgKiB0O1xuICAgICAgb3V0WC5wdXNoKHcwICogcDB4ICsgdzEgKiBjMVswXSArIHcyICogYzJbMF0gKyB3MyAqIHAzeCk7XG4gICAgICBvdXRZLnB1c2godzAgKiBwMHkgKyB3MSAqIGMxWzFdICsgdzIgKiBjMlsxXSArIHczICogcDN5KTtcbiAgICB9XG4gIH1cbiAgaWYgKGNsb3NlZCkge1xuICAgIG91dFgucHVzaCh4c1swXSk7IG91dFkucHVzaCh5c1swXSk7XG4gIH0gZWxzZSB7XG4gICAgb3V0WC5wdXNoKHhzW24gLSAxXSk7IG91dFkucHVzaCh5c1tuIC0gMV0pO1xuICB9XG4gIHJldHVybiB7IHhzOiBvdXRYLCB5czogb3V0WSB9O1xufVxuXG4vKipcbiAqIEZsYXR0ZW4gdGhlIHNtb290aCBDYXRtdWxsLVJvbSBiZXppZXIgdGhyb3VnaCB0aGUgYW5jaG9ycyAobm8gY3VzdG9tIGhhbmRsZXMpLlxuICogRmFsbHMgYmFjayB0byB0aGUgYW5jaG9ycyB3aGVuIHRoZXJlIGFyZSB0b28gZmV3IHRvIGZvcm0gYSBjdXJ2ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlemllckN1cnZlKHhzOiBudW1iZXJbXSwgeXM6IG51bWJlcltdLCBjbG9zZWQ6IGJvb2xlYW4pOiBDdXJ2ZVBvaW50cyB7XG4gIGNvbnN0IG4gPSBNYXRoLm1pbih4cy5sZW5ndGgsIHlzLmxlbmd0aCk7XG4gIGlmIChuIDwgMykgcmV0dXJuIHsgeHM6IHhzLnNsaWNlKCksIHlzOiB5cy5zbGljZSgpIH07XG4gIHJldHVybiBiZXppZXJDdXJ2ZUZyb21IYW5kbGVzKHhzLCB5cywgYmV6aWVyQW5jaG9ySGFuZGxlcyh4cywgeXMsIGNsb3NlZCksIGNsb3NlZCk7XG59XG4iXX0=
|
|
110
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmV6aWVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tb2RlbHMvYmV6aWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQWdCSCw4RUFBOEU7QUFDOUUsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLENBQUM7QUFFL0I7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsRUFBWSxFQUFFLEVBQVksRUFBRSxNQUFlO0lBQzdFLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekMsTUFBTSxHQUFHLEdBQW1CLEVBQUUsQ0FBQztJQUMvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDM0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDM0QsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDM0QsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUks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QUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDM0QsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25CLENBQUM7U0FBTSxDQUFDO1FBQ04sSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUNELE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNoQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCZXppZXItY3VydmUgaGVscGVycyAobm8gZXh0ZXJuYWwgZGVwZW5kZW5jeSkuXG4gKlxuICogSklUIHN1cHBvcnRzIHRydWUgYmV6aWVyIHJlZ2lvbnM6IGEgcG9seWdvbidzIHZlcnRpY2VzIGFyZSB0aGUgZWRpdGFibGVcbiAqICphbmNob3JzKiwgYW5kIHRoZSBzbW9vdGggY3VydmUgdGhyb3VnaCB0aGVtIGlzIGRlcml2ZWQgaGVyZSB3aXRoIHRoZVxuICogQ2F0bXVsbC1Sb20gY29uc3RydWN0aW9uIOKAlCB0aGUgc2FtZSBhbGdvcml0aG0gcGFwZXIuanMgdXNlcyBpblxuICogYHBhdGguc21vb3RoKClgLiBUaGUgY3VydmUgaW50ZXJwb2xhdGVzIGV2ZXJ5IGFuY2hvciBhbmRcbiAqIGVhY2ggYW5jaG9yJ3MgdHdvIGhhbmRsZXMgYXJlIGNvbGluZWFyIChhIHNtb290aCB0YW5nZW50KS5cbiAqXG4gKiBUaGUgT1NEIG92ZXJsYXkgcmVuZGVycyB0aGUgY3VydmUgYXMgYSB0cnVlIGN1YmljIFNWRyBwYXRoICsgZHJhZ2dhYmxlIGhhbmRsZXNcbiAqIChzZWUge0BsaW5rIGJlemllckFuY2hvckhhbmRsZXN9KTsgR2VvSlNPTiBleHBvcnQgZmxhdHRlbnMgdGhlICpzYW1lKiBjdWJpY3NcbiAqIGludG8gYSBkZW5zZSBwb2ludCBsaXN0IChzZWUge0BsaW5rIGJlemllckN1cnZlfSkgc28gYSB2aWV3ZXIgd2l0aG91dCBiZXppZXJcbiAqIHN1cHBvcnQgKGUuZy4gUXVQYXRoLCB3aGljaCBqdXN0IGRyYXdzIHRoZSBjb29yZGluYXRlIGxpc3QpIHN0aWxsIHNob3dzIHRoZVxuICogc21vb3RoIHNoYXBlLiBVc2luZyBvbmUgYWxnb3JpdGhtIGZvciBib3RoIGtlZXBzIHdoYXQgSklUIGRyYXdzIGlkZW50aWNhbCB0b1xuICogd2hhdCBpdCBleHBvcnRzLlxuICpcbiAqIFB1cmUgZnVuY3Rpb25zOiBubyBET00sIG5vIHNlcnZpY2Ugc3RhdGUuIENvb3JkaW5hdGVzIGFyZSBpbWFnZSBwaXhlbHMuXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBDdXJ2ZVBvaW50cyB7XG4gIHhzOiBudW1iZXJbXTtcbiAgeXM6IG51bWJlcltdO1xufVxuXG4vKiogQSB2ZXJ0ZXgncyB0d28gY3ViaWMtYmV6aWVyIGNvbnRyb2wgcG9pbnRzIChhYnNvbHV0ZSBjb29yZHMpIHBsdXMgd2hldGhlclxuICogIGVhY2ggc2lkZSBoYXMgYSBoYW5kbGUgKG9wZW4tcGF0aCBlbmRwb2ludHMgaGF2ZSBvbmx5IG9uZSkuICovXG5leHBvcnQgaW50ZXJmYWNlIEFuY2hvckhhbmRsZSB7XG4gIGluOiBbbnVtYmVyLCBudW1iZXJdO1xuICBvdXQ6IFtudW1iZXIsIG51bWJlcl07XG4gIGhhc0luOiBib29sZWFuO1xuICBoYXNPdXQ6IGJvb2xlYW47XG59XG5cbi8qKiBIb3cgbWFueSBwb2ludHMgdG8gc2FtcGxlIHBlciBjdWJpYyBzZWdtZW50IHdoZW4gZmxhdHRlbmluZyBmb3IgZXhwb3J0LiAqL1xuY29uc3QgU0FNUExFU19QRVJfU0VHTUVOVCA9IDE2O1xuXG4vKipcbiAqIFBlci1hbmNob3IgY3ViaWMtYmV6aWVyIGNvbnRyb2wgcG9pbnRzIHVzaW5nIHRoZSBDYXRtdWxsLVJvbSBjb25zdHJ1Y3Rpb25cbiAqICh0ZW5zaW9uIDE6IGNvbnRyb2wgPSBhbmNob3IgwrEgKG5leHQg4oiSIHByZXYpIC8gNikuIE1hdGNoZXMgcGFwZXIuanNcbiAqIGBwYXRoLnNtb290aCgpYDogdGhlIHJlc3VsdGluZyBjdWJpYyBpbnRlcnBvbGF0ZXMgZXZlcnkgYW5jaG9yIGFuZCB0aGUgdHdvXG4gKiBoYW5kbGVzIG9mIGVhY2ggYW5jaG9yIGFyZSBjb2xpbmVhci4gQ29vcmRpbmF0ZXMgYXJlIGluIHRoZSBpbnB1dCBzcGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlemllckFuY2hvckhhbmRsZXMoeHM6IG51bWJlcltdLCB5czogbnVtYmVyW10sIGNsb3NlZDogYm9vbGVhbik6IEFuY2hvckhhbmRsZVtdIHtcbiAgY29uc3QgbiA9IE1hdGgubWluKHhzLmxlbmd0aCwgeXMubGVuZ3RoKTtcbiAgY29uc3Qgb3V0OiBBbmNob3JIYW5kbGVbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIGNvbnN0IHByZXYgPSBjbG9zZWQgPyAoaSAtIDEgKyBuKSAlIG4gOiBNYXRoLm1heCgwLCBpIC0gMSk7XG4gICAgY29uc3QgbmV4dCA9IGNsb3NlZCA/IChpICsgMSkgJSBuIDogTWF0aC5taW4obiAtIDEsIGkgKyAxKTtcbiAgICBjb25zdCB0eCA9ICh4c1tuZXh0XSAtIHhzW3ByZXZdKSAvIDY7XG4gICAgY29uc3QgdHkgPSAoeXNbbmV4dF0gLSB5c1twcmV2XSkgLyA2O1xuICAgIG91dC5wdXNoKHtcbiAgICAgIG91dDogW3hzW2ldICsgdHgsIHlzW2ldICsgdHldLFxuICAgICAgaW46IFt4c1tpXSAtIHR4LCB5c1tpXSAtIHR5XSxcbiAgICAgIGhhc091dDogY2xvc2VkIHx8IGkgPCBuIC0gMSxcbiAgICAgIGhhc0luOiBjbG9zZWQgfHwgaSA+IDAsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqIFRoZSBDYXRtdWxsLVJvbSBoYW5kbGVzIGFzICoqcmVsYXRpdmUqKiBvZmZzZXRzIGBbZHgsIGR5XWAgcGVyIGFuY2hvciDigJQgdXNlZFxuICogIHRvIGluaXRpYWxpc2UgYSByZWdpb24ncyBlZGl0YWJsZSBoYW5kbGVzIHdoZW4gYmV6aWVyIGlzIHR1cm5lZCBvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0SGFuZGxlT2Zmc2V0cyhcbiAgeHM6IG51bWJlcltdLFxuICB5czogbnVtYmVyW10sXG4gIGNsb3NlZDogYm9vbGVhbixcbik6IHsgaW46IG51bWJlcltdW107IG91dDogbnVtYmVyW11bXSB9IHtcbiAgY29uc3QgaCA9IGJlemllckFuY2hvckhhbmRsZXMoeHMsIHlzLCBjbG9zZWQpO1xuICByZXR1cm4ge1xuICAgIGluOiBoLm1hcCgoYSwgaSkgPT4gW2EuaW5bMF0gLSB4c1tpXSwgYS5pblsxXSAtIHlzW2ldXSksXG4gICAgb3V0OiBoLm1hcCgoYSwgaSkgPT4gW2Eub3V0WzBdIC0geHNbaV0sIGEub3V0WzFdIC0geXNbaV1dKSxcbiAgfTtcbn1cblxuLyoqIEFic29sdXRlIGhhbmRsZXMgZnJvbSBzdG9yZWQgcmVsYXRpdmUgb2Zmc2V0cyAoYW5jaG9yICsgb2Zmc2V0KS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVzRnJvbU9mZnNldHMoXG4gIHhzOiBudW1iZXJbXSxcbiAgeXM6IG51bWJlcltdLFxuICBpbk9mZjogbnVtYmVyW11bXSxcbiAgb3V0T2ZmOiBudW1iZXJbXVtdLFxuICBjbG9zZWQ6IGJvb2xlYW4sXG4pOiBBbmNob3JIYW5kbGVbXSB7XG4gIGNvbnN0IG4gPSBNYXRoLm1pbih4cy5sZW5ndGgsIHlzLmxlbmd0aCk7XG4gIGNvbnN0IG91dDogQW5jaG9ySGFuZGxlW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBvdXQucHVzaCh7XG4gICAgICBpbjogW3hzW2ldICsgKGluT2ZmW2ldPy5bMF0gPz8gMCksIHlzW2ldICsgKGluT2ZmW2ldPy5bMV0gPz8gMCldLFxuICAgICAgb3V0OiBbeHNbaV0gKyAob3V0T2ZmW2ldPy5bMF0gPz8gMCksIHlzW2ldICsgKG91dE9mZltpXT8uWzFdID8/IDApXSxcbiAgICAgIGhhc091dDogY2xvc2VkIHx8IGkgPCBuIC0gMSxcbiAgICAgIGhhc0luOiBjbG9zZWQgfHwgaSA+IDAsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqIEEgcmVnaW9uJ3MgaGFuZGxlczogZnJvbSBpdHMgc3RvcmVkIChlZGl0YWJsZSkgb2Zmc2V0cyB3aGVuIHByZXNlbnQsIGVsc2UgdGhlXG4gKiAgQ2F0bXVsbC1Sb20gZGVmYXVsdC4gVGhlIHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIGJvdGggcmVuZGVyaW5nIGFuZCBleHBvcnQuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUhhbmRsZXMoXG4gIHhzOiBudW1iZXJbXSxcbiAgeXM6IG51bWJlcltdLFxuICBjbG9zZWQ6IGJvb2xlYW4sXG4gIGluT2ZmPzogbnVtYmVyW11bXSxcbiAgb3V0T2ZmPzogbnVtYmVyW11bXSxcbik6IEFuY2hvckhhbmRsZVtdIHtcbiAgaWYgKGluT2ZmICYmIG91dE9mZiAmJiBpbk9mZi5sZW5ndGggPT09IHhzLmxlbmd0aCAmJiBvdXRPZmYubGVuZ3RoID09PSB4cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gaGFuZGxlc0Zyb21PZmZzZXRzKHhzLCB5cywgaW5PZmYsIG91dE9mZiwgY2xvc2VkKTtcbiAgfVxuICByZXR1cm4gYmV6aWVyQW5jaG9ySGFuZGxlcyh4cywgeXMsIGNsb3NlZCk7XG59XG5cbi8qKlxuICogRmxhdHRlbiBhIGN1YmljIGJlemllciAoZGVmaW5lZCBieSBleHBsaWNpdCBwZXItYW5jaG9yIGhhbmRsZXMpIGludG8gYSBkZW5zZVxuICogcG9pbnQgbGlzdCBieSBzYW1wbGluZyBlYWNoIHNlZ21lbnQuIFRoZSBjdXJ2ZSBwYXNzZXMgdGhyb3VnaCBldmVyeSBhbmNob3I7IGFcbiAqIGNsb3NlZCByaW5nIHJldHVybnMgdG8gaXRzIGZpcnN0IHBvaW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmV6aWVyQ3VydmVGcm9tSGFuZGxlcyhcbiAgeHM6IG51bWJlcltdLFxuICB5czogbnVtYmVyW10sXG4gIGhhbmRsZXM6IEFuY2hvckhhbmRsZVtdLFxuICBjbG9zZWQ6IGJvb2xlYW4sXG4pOiBDdXJ2ZVBvaW50cyB7XG4gIGNvbnN0IG4gPSBNYXRoLm1pbih4cy5sZW5ndGgsIHlzLmxlbmd0aCk7XG4gIGlmIChuIDwgMykgcmV0dXJuIHsgeHM6IHhzLnNsaWNlKCksIHlzOiB5cy5zbGljZSgpIH07XG5cbiAgY29uc3Qgb3V0WDogbnVtYmVyW10gPSBbXTtcbiAgY29uc3Qgb3V0WTogbnVtYmVyW10gPSBbXTtcbiAgY29uc3Qgc2VncyA9IGNsb3NlZCA/IG4gOiBuIC0gMTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdzOyBpKyspIHtcbiAgICBjb25zdCBqID0gKGkgKyAxKSAlIG47XG4gICAgY29uc3QgcDB4ID0geHNbaV0sXG4gICAgICBwMHkgPSB5c1tpXTtcbiAgICBjb25zdCBjMSA9IGhhbmRsZXNbaV0ub3V0LFxuICAgICAgYzIgPSBoYW5kbGVzW2pdLmluO1xuICAgIGNvbnN0IHAzeCA9IHhzW2pdLFxuICAgICAgcDN5ID0geXNbal07XG4gICAgZm9yIChsZXQgcyA9IDA7IHMgPCBTQU1QTEVTX1BFUl9TRUdNRU5UOyBzKyspIHtcbiAgICAgIGNvbnN0IHQgPSBzIC8gU0FNUExFU19QRVJfU0VHTUVOVDtcbiAgICAgIGNvbnN0IHUgPSAxIC0gdDtcbiAgICAgIGNvbnN0IHcwID0gdSAqIHUgKiB1LFxuICAgICAgICB3MSA9IDMgKiB1ICogdSAqIHQsXG4gICAgICAgIHcyID0gMyAqIHUgKiB0ICogdCxcbiAgICAgICAgdzMgPSB0ICogdCAqIHQ7XG4gICAgICBvdXRYLnB1c2godzAgKiBwMHggKyB3MSAqIGMxWzBdICsgdzIgKiBjMlswXSArIHczICogcDN4KTtcbiAgICAgIG91dFkucHVzaCh3MCAqIHAweSArIHcxICogYzFbMV0gKyB3MiAqIGMyWzFdICsgdzMgKiBwM3kpO1xuICAgIH1cbiAgfVxuICBpZiAoY2xvc2VkKSB7XG4gICAgb3V0WC5wdXNoKHhzWzBdKTtcbiAgICBvdXRZLnB1c2goeXNbMF0pO1xuICB9IGVsc2Uge1xuICAgIG91dFgucHVzaCh4c1tuIC0gMV0pO1xuICAgIG91dFkucHVzaCh5c1tuIC0gMV0pO1xuICB9XG4gIHJldHVybiB7IHhzOiBvdXRYLCB5czogb3V0WSB9O1xufVxuIl19
|
|
@@ -11,8 +11,16 @@
|
|
|
11
11
|
* gets the same colour with no stored state.
|
|
12
12
|
*/
|
|
13
13
|
export const DEFAULT_FALLBACK_PALETTE = [
|
|
14
|
-
'#6C8EBF',
|
|
15
|
-
'#
|
|
14
|
+
'#6C8EBF',
|
|
15
|
+
'#82B366',
|
|
16
|
+
'#B85450',
|
|
17
|
+
'#9673A6',
|
|
18
|
+
'#D79B00',
|
|
19
|
+
'#3C948B',
|
|
20
|
+
'#A64CA6',
|
|
21
|
+
'#CC6677',
|
|
22
|
+
'#4477AA',
|
|
23
|
+
'#228833',
|
|
16
24
|
];
|
|
17
25
|
/** Seed classes — mirrors the historical hard-coded `classificationColors` map. */
|
|
18
26
|
const DEFAULT_CLASSES = [
|
|
@@ -43,4 +51,34 @@ export function defaultPresetSet() {
|
|
|
43
51
|
export function isEmptyPresetSet(set) {
|
|
44
52
|
return !set || !Array.isArray(set.classes) || set.classes.length === 0;
|
|
45
53
|
}
|
|
46
|
-
|
|
54
|
+
/**
|
|
55
|
+
* Validate an untrusted value (e.g. an imported JSON file) as a preset set.
|
|
56
|
+
* Returns a clean copy — only well-formed `{ name, color }` classes, defaults
|
|
57
|
+
* for missing optional fields — or null when it has no usable classes.
|
|
58
|
+
*/
|
|
59
|
+
export function parsePresetSet(value) {
|
|
60
|
+
if (!value || typeof value !== 'object')
|
|
61
|
+
return null;
|
|
62
|
+
const raw = value;
|
|
63
|
+
if (!Array.isArray(raw.classes))
|
|
64
|
+
return null;
|
|
65
|
+
const classes = [];
|
|
66
|
+
for (const c of raw.classes) {
|
|
67
|
+
const entry = c;
|
|
68
|
+
if (!entry || typeof entry.name !== 'string' || typeof entry.color !== 'string')
|
|
69
|
+
continue;
|
|
70
|
+
classes.push({ ...entry, name: entry.name, color: entry.color });
|
|
71
|
+
}
|
|
72
|
+
if (classes.length === 0)
|
|
73
|
+
return null;
|
|
74
|
+
const palette = Array.isArray(raw.fallbackPalette)
|
|
75
|
+
? raw.fallbackPalette.filter((c) => typeof c === 'string')
|
|
76
|
+
: [];
|
|
77
|
+
return {
|
|
78
|
+
classes,
|
|
79
|
+
fallbackPalette: palette.length ? palette : [...DEFAULT_FALLBACK_PALETTE],
|
|
80
|
+
autoPromote: raw.autoPromote === true,
|
|
81
|
+
matchMode: raw.matchMode === 'normalized' ? 'normalized' : 'exact',
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3MtcHJlc2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tb2RlbHMvY2xhc3MtcHJlc2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQStDSDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQWE7SUFDaEQsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztDQUNWLENBQUM7QUFFRixtRkFBbUY7QUFDbkYsTUFBTSxlQUFlLEdBQWtCO0lBQ3JDLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRTtJQUNsRSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFO0lBQzdELEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRTtJQUNoRSxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUU7SUFDaEUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRTtJQUN4RCxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFO0lBQ3RELEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUU7SUFDdkQsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxF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QUFZLENBQUMsQ0FBQyxDQUFDLE9BQU87S0FDbkUsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFByZXNldCBhbm5vdGF0aW9uIGNsYXNzZXMgKGppdC11aSM3MCkuXG4gKlxuICogQSBjbGFzcyBpcyBhIGZsYXQgYHsgbmFtZSwgY29sb3IgfWAgcGFpciAodjE6IG5vIGhpZXJhcmNoeSwgbm8gc3BlY2lhbC1jbGFzcyBzZW1hbnRpY3MpLlxuICogVGhlIGBQcmVzZXRTZXRgIGlzIHRoZSBwZXItdXNlciwgc2VydmVyLXBlcnNpc3RlZCBzb3VyY2Ugb2YgdHJ1dGggZm9yIHJlZ2lvbiBjb2xvdXJzO1xuICogc2VlIGBjbGFzcy1jb2xvci51dGlsLnRzYCBmb3IgdGhlIGRldGVybWluaXN0aWMgY29sb3VyLXJlc29sdXRpb24gZW5naW5lLlxuICovXG5cbi8qKiBXaGVyZSBhIHByZXNldCBjbGFzcyBjYW1lIGZyb206IGFkZGVkIGJ5IHRoZSB1c2VyLCBvbmUgb2YgdGhlIGJ1aWx0LWluXG4gKiAgZGVmYXVsdHMsIG9yIGF1dG8tcHJvbW90ZWQgZnJvbSBhbiB1bmtub3duIHJlZ2lvbiBsYWJlbC4gKi9cbmV4cG9ydCB0eXBlIFByZXNldFNvdXJjZSA9ICd1c2VyJyB8ICdkZWZhdWx0JyB8ICdhdXRvJztcblxuLyoqIE9uZSBhbm5vdGF0aW9uIGNsYXNzIGFuZCBpdHMgY29sb3VyOiByZWdpb25zIHdob3NlIGBsYWJlbGAgbWF0Y2hlc1xuICogIGBuYW1lYCAocGVyIHRoZSBzZXQncyB7QGxpbmsgTWF0Y2hNb2RlfSkgZHJhdyBpbiBgY29sb3JgIHVubGVzcyB0aGVpciBjb2xvdXJcbiAqICB3YXMgb3ZlcnJpZGRlbiBieSBoYW5kLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGFzc1ByZXNldCB7XG4gIC8qKiBUaGUgY2xhc3MgbmFtZSDigJQgbWF0Y2hlZCBhZ2FpbnN0IGBSZWdpb24ubGFiZWxgLiAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKiBIZXggY29sb3VyLCBgI1JSR0dCQmAuICovXG4gIGNvbG9yOiBzdHJpbmc7XG4gIC8qKiBSZXNlcnZlZCBmb3IgYSBmdXR1cmUgcGVyLWNsYXNzIG92ZXJsYXktdmlzaWJpbGl0eSB0b2dnbGUuICovXG4gIHZpc2libGU/OiBib29sZWFuO1xuICAvKiogUHJvdmVuYW5jZTsgYCdhdXRvJ2AgPSBhZGRlZCBieSBvcHQtaW4gZmFsbGJhY2sgcHJvbW90aW9uLiAqL1xuICBzb3VyY2U/OiBQcmVzZXRTb3VyY2U7XG59XG5cbi8qKiBIb3cgYSByZWdpb24gbGFiZWwgaXMgbWF0Y2hlZCB0byBhIHByZXNldCBuYW1lOiBgJ2V4YWN0J2AgY29tcGFyZXMgdGhlXG4gKiAgc3RyaW5ncyBhcyBpczsgYCdub3JtYWxpemVkJ2AgdHJpbXMgYW5kIGxvd2VyLWNhc2VzIGJvdGggZmlyc3QuICovXG5leHBvcnQgdHlwZSBNYXRjaE1vZGUgPSAnZXhhY3QnIHwgJ25vcm1hbGl6ZWQnO1xuXG4vKipcbiAqIFRoZSBwZXItdXNlciBjbGFzcy1jb2xvdXIgY29uZmlndXJhdGlvbiAoc2VydmVyLXBlcnNpc3RlZCB0aHJvdWdoIHRoZVxuICogcHJlZmVyZW5jZXMgcG9ydCk6IHRoZSBwcmVzZXQgY2xhc3NlcywgdGhlIHBhbGV0dGUgZm9yIGxhYmVscyBvdXRzaWRlIHRoZW0sXG4gKiBhbmQgdGhlIG1hdGNoaW5nIHJ1bGVzLiBSZXNvbHZlZCBpbnRvIHJlZ2lvbiBjb2xvdXJzIGJ5IGBjbGFzcy1jb2xvci51dGlsLnRzYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVzZXRTZXQge1xuICAvKiogT3JkZXJlZCBsaXN0IG9mIHByZXNldCBjbGFzc2VzLiAqL1xuICBjbGFzc2VzOiBDbGFzc1ByZXNldFtdO1xuICAvKiogQ29sb3VycyB1c2VkIGZvciBjbGFzc2VzIG5vdCBpbiBgY2xhc3Nlc2AgKGFzc2lnbmVkIGRldGVybWluaXN0aWNhbGx5KS4gKi9cbiAgZmFsbGJhY2tQYWxldHRlOiBzdHJpbmdbXTtcbiAgLyoqIE9wdC1pbiAoZGVmYXVsdCBmYWxzZSk6IGFkZCBhbiB1bmtub3duIGNsYXNzIHRvIGBjbGFzc2VzYCB0aGUgZmlyc3QgdGltZSBpdCBpcyBzZWVuLiAqL1xuICBhdXRvUHJvbW90ZTogYm9vbGVhbjtcbiAgLyoqIExhYmVsIG1hdGNoaW5nIGFnYWluc3QgYFJlZ2lvbi5sYWJlbGAgKGRlZmF1bHQgYCdleGFjdCdgKS4gKi9cbiAgbWF0Y2hNb2RlOiBNYXRjaE1vZGU7XG4gIC8qKlxuICAgKiBDbGFzcyBjb2xvdXJzIHRoYXQgaW1wb3J0ZWQgR2VvSlNPTiBjYXJyaWVkIGZvciBjbGFzc2VzIHdpdGggbm8gcHJlc2V0LCBrZXllZCBieSB0aGVcbiAgICogbWF0Y2ggbW9kZSdzIGtleSAoc2VlIGBwcmVzZXRLZXlgKS4gVGhleSBjb21lIGJlZm9yZSB0aGUgZmFsbGJhY2sgcGFsZXR0ZSwgc28gYW4gaW1wb3J0ZWRcbiAgICogZmlsZSBrZWVwcyBpdHMgb3duIGNvbG91cnMuIFNlc3Npb24tb25seTogbmV2ZXIgcGVyc2lzdGVkLCBhbmQgYWJzZW50IGZyb20gYSBzZXQgYSBjYWxsZXJcbiAgICogc2F2ZXMgb3IgZXhwb3J0cy5cbiAgICovXG4gIGltcG9ydGVkQ29sb3JzPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG59XG5cbi8qKlxuICogRmFsbGJhY2sgcGFsZXR0ZSBmb3IgY2xhc3NlcyBub3QgcHJlc2VudCBpbiB0aGUgcHJlc2V0IHNldCDigJQgcmVhc29uYWJseSBkaXN0aW5jdCBodWVzLlxuICogQ29sb3VycyBhcmUgYXNzaWduZWQgYnkgYSBzdGFibGUgaGFzaCBvZiB0aGUgY2xhc3MgbmFtZSwgc28gdGhlIHNhbWUgdW5rbm93biBjbGFzcyBhbHdheXNcbiAqIGdldHMgdGhlIHNhbWUgY29sb3VyIHdpdGggbm8gc3RvcmVkIHN0YXRlLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9GQUxMQkFDS19QQUxFVFRFOiBzdHJpbmdbXSA9IFtcbiAgJyM2QzhFQkYnLFxuICAnIzgyQjM2NicsXG4gICcjQjg1NDUwJyxcbiAgJyM5NjczQTYnLFxuICAnI0Q3OUIwMCcsXG4gICcjM0M5NDhCJyxcbiAgJyNBNjRDQTYnLFxuICAnI0NDNjY3NycsXG4gICcjNDQ3N0FBJyxcbiAgJyMyMjg4MzMnLFxuXTtcblxuLyoqIFNlZWQgY2xhc3NlcyDigJQgbWlycm9ycyB0aGUgaGlzdG9yaWNhbCBoYXJkLWNvZGVkIGBjbGFzc2lmaWNhdGlvbkNvbG9yc2AgbWFwLiAqL1xuY29uc3QgREVGQVVMVF9DTEFTU0VTOiBDbGFzc1ByZXNldFtdID0gW1xuICB7IG5hbWU6ICdGcmFnbWVudGVkLWVtYnJ5bycsIGNvbG9yOiAnI0ZGOEMwMCcsIHNvdXJjZTogJ2RlZmF1bHQnIH0sXG4gIHsgbmFtZTogJ0R5aW5nLWVtYnJ5bycsIGNvbG9yOiAnI0ZGMzMzMycsIHNvdXJjZTogJ2RlZmF1bHQnIH0sXG4gIHsgbmFtZTogJ1R3by1jZWxsLWVtYnJ5bycsIGNvbG9yOiAnIzMzQ0M2NicsIHNvdXJjZTogJ2RlZmF1bHQnIH0sXG4gIHsgbmFtZTogJ09uZS1jZWxsLWVtYnJ5bycsIGNvbG9yOiAnIzMzOTlGRicsIHNvdXJjZTogJ2RlZmF1bHQnIH0sXG4gIHsgbmFtZTogJ1Vua25vd24nLCBjb2xvcjogJyM4ODg4ODgnLCBzb3VyY2U6ICdkZWZhdWx0JyB9LFxuICB7IG5hbWU6ICdUdW1vcicsIGNvbG9yOiAnI0ZGNDQ0NCcsIHNvdXJjZTogJ2RlZmF1bHQnIH0sXG4gIHsgbmFtZTogJ1N0cm9tYScsIGNvbG9yOiAnIzQ0QUFGRicsIHNvdXJjZTogJ2RlZmF1bHQnIH0sXG4gIHsgbmFtZTogJ0ltbXVuZSBjZWxscycsIGNvbG9yOiAnI0ZGREQwMCcsIHNvdXJjZTogJ2RlZmF1bHQnIH0sXG4gIHsgbmFtZTogJ05lY3Jvc2lzJywgY29sb3I6ICcjQUE2NjMzJywgc291cmNlOiAnZGVmYXVsdCcgfSxcbiAgeyBuYW1lOiAnUmVnaW9uJywgY29sb3I6ICcjMDBGRkZGJywgc291cmNlOiAnZGVmYXVsdCcgfSxcbiAgeyBuYW1lOiAnSWdub3JlJywgY29sb3I6ICcjQUFBQUFBJywgc291cmNlOiAnZGVmYXVsdCcgfSxcbiAgeyBuYW1lOiAnUG9zaXRpdmUnLCBjb2xvcjogJyMwMENDNDQnLCBzb3VyY2U6ICdkZWZhdWx0JyB9LFxuICB7IG5hbWU6ICdOZWdhdGl2ZScsIGNvbG9yOiAnI0NDMDAwMCcsIHNvdXJjZTogJ2RlZmF1bHQnIH0sXG5dO1xuXG4vKiogQSBmcmVzaCBkZWZhdWx0IHByZXNldCBzZXQgKGRlZXAtY29waWVkIHNvIGNhbGxlcnMgY2FuIG11dGF0ZSBzYWZlbHkpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmF1bHRQcmVzZXRTZXQoKTogUHJlc2V0U2V0IHtcbiAgcmV0dXJuIHtcbiAgICBjbGFzc2VzOiBERUZBVUxUX0NMQVNTRVMubWFwKChjKSA9PiAoeyAuLi5jIH0pKSxcbiAgICBmYWxsYmFja1BhbGV0dGU6IFsuLi5ERUZBVUxUX0ZBTExCQUNLX1BBTEVUVEVdLFxuICAgIGF1dG9Qcm9tb3RlOiBmYWxzZSxcbiAgICBtYXRjaE1vZGU6ICdleGFjdCcsXG4gIH07XG59XG5cbi8qKiBUcnVlIHdoZW4gdGhlIHNldCBoYXMgbm8gdXNhYmxlIGNsYXNzZXMgKGUuZy4gdGhlIHNlcnZlciByZXR1cm5lZCBhbiBlbXB0eS9ibGFuayByZWNvcmQpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHlQcmVzZXRTZXQoc2V0OiBQcmVzZXRTZXQgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiAhc2V0IHx8ICFBcnJheS5pc0FycmF5KHNldC5jbGFzc2VzKSB8fCBzZXQuY2xhc3Nlcy5sZW5ndGggPT09IDA7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgYW4gdW50cnVzdGVkIHZhbHVlIChlLmcuIGFuIGltcG9ydGVkIEpTT04gZmlsZSkgYXMgYSBwcmVzZXQgc2V0LlxuICogUmV0dXJucyBhIGNsZWFuIGNvcHkg4oCUIG9ubHkgd2VsbC1mb3JtZWQgYHsgbmFtZSwgY29sb3IgfWAgY2xhc3NlcywgZGVmYXVsdHNcbiAqIGZvciBtaXNzaW5nIG9wdGlvbmFsIGZpZWxkcyDigJQgb3IgbnVsbCB3aGVuIGl0IGhhcyBubyB1c2FibGUgY2xhc3Nlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUHJlc2V0U2V0KHZhbHVlOiB1bmtub3duKTogUHJlc2V0U2V0IHwgbnVsbCB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHJhdyA9IHZhbHVlIGFzIFBhcnRpYWw8UmVjb3JkPGtleW9mIFByZXNldFNldCwgdW5rbm93bj4+O1xuICBpZiAoIUFycmF5LmlzQXJyYXkocmF3LmNsYXNzZXMpKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgY2xhc3NlczogQ2xhc3NQcmVzZXRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGMgb2YgcmF3LmNsYXNzZXMgYXMgdW5rbm93bltdKSB7XG4gICAgY29uc3QgZW50cnkgPSBjIGFzIFBhcnRpYWw8Q2xhc3NQcmVzZXQ+IHwgbnVsbDtcbiAgICBpZiAoIWVudHJ5IHx8IHR5cGVvZiBlbnRyeS5uYW1lICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgZW50cnkuY29sb3IgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICBjbGFzc2VzLnB1c2goeyAuLi5lbnRyeSwgbmFtZTogZW50cnkubmFtZSwgY29sb3I6IGVudHJ5LmNvbG9yIH0pO1xuICB9XG4gIGlmIChjbGFzc2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHBhbGV0dGUgPSBBcnJheS5pc0FycmF5KHJhdy5mYWxsYmFja1BhbGV0dGUpXG4gICAgPyAocmF3LmZhbGxiYWNrUGFsZXR0ZSBhcyB1bmtub3duW10pLmZpbHRlcigoYyk6IGMgaXMgc3RyaW5nID0+IHR5cGVvZiBjID09PSAnc3RyaW5nJylcbiAgICA6IFtdO1xuICByZXR1cm4ge1xuICAgIGNsYXNzZXMsXG4gICAgZmFsbGJhY2tQYWxldHRlOiBwYWxldHRlLmxlbmd0aCA/IHBhbGV0dGUgOiBbLi4uREVGQVVMVF9GQUxMQkFDS19QQUxFVFRFXSxcbiAgICBhdXRvUHJvbW90ZTogcmF3LmF1dG9Qcm9tb3RlID09PSB0cnVlLFxuICAgIG1hdGNoTW9kZTogcmF3Lm1hdGNoTW9kZSA9PT0gJ25vcm1hbGl6ZWQnID8gJ25vcm1hbGl6ZWQnIDogJ2V4YWN0JyxcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -1,56 +1,46 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Pure
|
|
2
|
+
* Pure SVG-path helpers (build and parse a vertex ring as a Plotly path).
|
|
3
3
|
*
|
|
4
|
-
* No DOM access, no service state, no `this
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* share. If a helper grows a `this.shapes` reference, it doesn't belong here.
|
|
4
|
+
* No DOM access, no service state, no `this`. Mask and ring geometry (the
|
|
5
|
+
* rasterizer, mask set operations, point-in-ring, simplification, contour
|
|
6
|
+
* tracing) lives in `src/lib/geometry/`.
|
|
8
7
|
*/
|
|
9
8
|
// ── SVG path parsing / building ──────────────────────────────────────
|
|
10
9
|
/**
|
|
11
|
-
*
|
|
10
|
+
* Split a single-subpath `M x,y L x,y ... [Z]` path into vertex arrays, plus
|
|
11
|
+
* whether it is closed (ends in `Z`). No validation: a coordinate that doesn't
|
|
12
|
+
* parse comes back as NaN. See {@link parseSvgPathPolygon} for the checked form.
|
|
13
|
+
*/
|
|
14
|
+
export function parseSvgPath(path) {
|
|
15
|
+
const closed = path.endsWith('Z');
|
|
16
|
+
const body = closed ? path.slice(1, -1) : path.slice(1); // drop M and optionally Z
|
|
17
|
+
const xpoints = [];
|
|
18
|
+
const ypoints = [];
|
|
19
|
+
for (const seg of body.split('L')) {
|
|
20
|
+
const [sx, sy] = seg.split(',');
|
|
21
|
+
xpoints.push(parseFloat(sx));
|
|
22
|
+
ypoints.push(parseFloat(sy));
|
|
23
|
+
}
|
|
24
|
+
return { xpoints, ypoints, closed };
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Parse a single-subpath `M x,y L x,y ... [Z]` path into vertex arrays.
|
|
12
28
|
*
|
|
13
29
|
* Returns null for paths we can't safely round-trip (multi-subpath, curves,
|
|
14
|
-
* fewer than three vertices).
|
|
15
|
-
* that Plotly's drawclosedpath produces, both of which are single-subpath
|
|
16
|
-
* polygons.
|
|
30
|
+
* non-numeric coordinates, fewer than three vertices).
|
|
17
31
|
*/
|
|
18
32
|
export function parseSvgPathPolygon(path) {
|
|
19
33
|
if (!path || path[0] !== 'M')
|
|
20
34
|
return null;
|
|
21
35
|
if (path.indexOf('M', 1) !== -1)
|
|
22
36
|
return null; // multi-subpath
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const ypoints = [];
|
|
27
|
-
for (const seg of segs) {
|
|
28
|
-
const [sx, sy] = seg.split(',');
|
|
29
|
-
const x = parseFloat(sx);
|
|
30
|
-
const y = parseFloat(sy);
|
|
31
|
-
if (!Number.isFinite(x) || !Number.isFinite(y))
|
|
32
|
-
return null;
|
|
33
|
-
xpoints.push(x);
|
|
34
|
-
ypoints.push(y);
|
|
35
|
-
}
|
|
37
|
+
const { xpoints, ypoints } = parseSvgPath(path);
|
|
38
|
+
if (xpoints.some((x, i) => !Number.isFinite(x) || !Number.isFinite(ypoints[i])))
|
|
39
|
+
return null;
|
|
36
40
|
if (xpoints.length < 3)
|
|
37
41
|
return null;
|
|
38
42
|
return { xpoints, ypoints };
|
|
39
43
|
}
|
|
40
|
-
/**
|
|
41
|
-
* Build a closed SVG path string `M x,y L x,y L ... Z` from vertex arrays.
|
|
42
|
-
* Returns '' for fewer than three vertices (degenerate).
|
|
43
|
-
*/
|
|
44
|
-
export function polygonToSvgPath(xpoints, ypoints) {
|
|
45
|
-
if (xpoints.length < 3)
|
|
46
|
-
return '';
|
|
47
|
-
let path = 'M';
|
|
48
|
-
for (let i = 0; i < xpoints.length; i++) {
|
|
49
|
-
path += `${xpoints[i]},${ypoints[i]}`;
|
|
50
|
-
path += i < xpoints.length - 1 ? 'L' : 'Z';
|
|
51
|
-
}
|
|
52
|
-
return path;
|
|
53
|
-
}
|
|
54
44
|
/**
|
|
55
45
|
* Build an SVG path string from vertex arrays. Closed polygons end with `Z`,
|
|
56
46
|
* open polylines do not. Returns '' for fewer than two vertices (degenerate).
|
|
@@ -68,131 +58,4 @@ export function verticesToSvgPath(xs, ys, closed) {
|
|
|
68
58
|
path += 'Z';
|
|
69
59
|
return path;
|
|
70
60
|
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Compare two Plotly shape objects for "same region" — used by the wand to
|
|
74
|
-
* avoid appending duplicates when the user pushes the same find result more
|
|
75
|
-
* than once. Polygons compare by SVG path string, rectangles compare by
|
|
76
|
-
* (x0, y0, x1, y1).
|
|
77
|
-
*/
|
|
78
|
-
export function shapesEqual(a, b) {
|
|
79
|
-
if (a.path && b.path) {
|
|
80
|
-
return a.path === b.path;
|
|
81
|
-
}
|
|
82
|
-
if (a.x0 !== undefined && a.y0 !== undefined &&
|
|
83
|
-
a.x1 !== undefined && a.y1 !== undefined &&
|
|
84
|
-
b.x0 !== undefined && b.y0 !== undefined &&
|
|
85
|
-
b.x1 !== undefined && b.y1 !== undefined) {
|
|
86
|
-
return a.x0 === b.x0 &&
|
|
87
|
-
a.y0 === b.y0 &&
|
|
88
|
-
a.x1 === b.x1 &&
|
|
89
|
-
a.y1 === b.y1;
|
|
90
|
-
}
|
|
91
|
-
return false;
|
|
92
|
-
}
|
|
93
|
-
// ── BBox-mask operations (used by the wand stroke accumulator) ───────
|
|
94
|
-
/** Returns true if the two bbox-relative masks share at least one set pixel. */
|
|
95
|
-
export function masksOverlap(a, b) {
|
|
96
|
-
const ix0 = Math.max(a.bx, b.bx);
|
|
97
|
-
const iy0 = Math.max(a.by, b.by);
|
|
98
|
-
const ix1 = Math.min(a.bx + a.bw, b.bx + b.bw);
|
|
99
|
-
const iy1 = Math.min(a.by + a.bh, b.by + b.bh);
|
|
100
|
-
if (ix0 >= ix1 || iy0 >= iy1)
|
|
101
|
-
return false;
|
|
102
|
-
for (let y = iy0; y < iy1; y++) {
|
|
103
|
-
const ar = (y - a.by) * a.bw;
|
|
104
|
-
const br = (y - b.by) * b.bw;
|
|
105
|
-
for (let x = ix0; x < ix1; x++) {
|
|
106
|
-
if (a.mask[ar + (x - a.bx)] && b.mask[br + (x - b.bx)])
|
|
107
|
-
return true;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
return false;
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Allocate a fresh accumulator covering both masks and OR them in. The
|
|
114
|
-
* resulting mask's bbox is the smallest rectangle containing both inputs.
|
|
115
|
-
*/
|
|
116
|
-
export function unionMasks(a, b) {
|
|
117
|
-
const ux0 = Math.min(a.bx, b.bx);
|
|
118
|
-
const uy0 = Math.min(a.by, b.by);
|
|
119
|
-
const ux1 = Math.max(a.bx + a.bw, b.bx + b.bw);
|
|
120
|
-
const uy1 = Math.max(a.by + a.bh, b.by + b.bh);
|
|
121
|
-
const ubw = ux1 - ux0;
|
|
122
|
-
const ubh = uy1 - uy0;
|
|
123
|
-
const umask = new Uint8Array(ubw * ubh);
|
|
124
|
-
const dax = a.bx - ux0;
|
|
125
|
-
const day = a.by - uy0;
|
|
126
|
-
for (let row = 0; row < a.bh; row++) {
|
|
127
|
-
const src = row * a.bw;
|
|
128
|
-
const dst = (row + day) * ubw + dax;
|
|
129
|
-
umask.set(a.mask.subarray(src, src + a.bw), dst);
|
|
130
|
-
}
|
|
131
|
-
const dbx = b.bx - ux0;
|
|
132
|
-
const dby = b.by - uy0;
|
|
133
|
-
for (let row = 0; row < b.bh; row++) {
|
|
134
|
-
const srcRow = row * b.bw;
|
|
135
|
-
const dstRow = (row + dby) * ubw;
|
|
136
|
-
for (let col = 0; col < b.bw; col++) {
|
|
137
|
-
if (b.mask[srcRow + col])
|
|
138
|
-
umask[dstRow + (dbx + col)] = 1;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
return { bx: ux0, by: uy0, bw: ubw, bh: ubh, mask: umask };
|
|
142
|
-
}
|
|
143
|
-
// ── Ring simplification (Douglas–Peucker) ───────────────────────────────
|
|
144
|
-
/** Perpendicular distance from (px,py) to the segment (ax,ay)–(bx,by). */
|
|
145
|
-
function perpDistance(px, py, ax, ay, bx, by) {
|
|
146
|
-
const dx = bx - ax, dy = by - ay;
|
|
147
|
-
const len2 = dx * dx + dy * dy;
|
|
148
|
-
if (len2 === 0)
|
|
149
|
-
return Math.hypot(px - ax, py - ay);
|
|
150
|
-
let t = ((px - ax) * dx + (py - ay) * dy) / len2;
|
|
151
|
-
t = Math.max(0, Math.min(1, t));
|
|
152
|
-
return Math.hypot(px - (ax + t * dx), py - (ay + t * dy));
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* Simplify a closed ring with the Douglas–Peucker algorithm (jit-ui#85):
|
|
156
|
-
* drop every vertex that lies within `epsilon` pixels (the "altitude
|
|
157
|
-
* threshold") of the line between its kept neighbours. Anchored at vertex 0
|
|
158
|
-
* (the ring is closed by appending it). Rings of ≤ 3 vertices, or a
|
|
159
|
-
* non-positive epsilon, are returned unchanged. Output keeps the closed-ring
|
|
160
|
-
* convention (no repeated closing point).
|
|
161
|
-
*/
|
|
162
|
-
export function simplifyRing(xs, ys, epsilon) {
|
|
163
|
-
const n = xs.length;
|
|
164
|
-
if (n <= 3 || !(epsilon > 0))
|
|
165
|
-
return { xs: xs.slice(), ys: ys.slice() };
|
|
166
|
-
// Close the ring so both endpoints of the DP run are vertex 0.
|
|
167
|
-
const px = [...xs, xs[0]];
|
|
168
|
-
const py = [...ys, ys[0]];
|
|
169
|
-
const m = px.length;
|
|
170
|
-
const keep = new Array(m).fill(false);
|
|
171
|
-
keep[0] = true;
|
|
172
|
-
keep[m - 1] = true;
|
|
173
|
-
const stack = [[0, m - 1]];
|
|
174
|
-
while (stack.length) {
|
|
175
|
-
const [a, b] = stack.pop();
|
|
176
|
-
let maxD = -1, idx = -1;
|
|
177
|
-
for (let i = a + 1; i < b; i++) {
|
|
178
|
-
const d = perpDistance(px[i], py[i], px[a], py[a], px[b], py[b]);
|
|
179
|
-
if (d > maxD) {
|
|
180
|
-
maxD = d;
|
|
181
|
-
idx = i;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
if (maxD > epsilon && idx > a) {
|
|
185
|
-
keep[idx] = true;
|
|
186
|
-
stack.push([a, idx], [idx, b]);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
const outX = [], outY = [];
|
|
190
|
-
for (let i = 0; i < m - 1; i++) { // drop the duplicated closing vertex
|
|
191
|
-
if (keep[i]) {
|
|
192
|
-
outX.push(px[i]);
|
|
193
|
-
outY.push(py[i]);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
return { xs: outX, ys: outY };
|
|
197
|
-
}
|
|
198
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvbWV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21vZGVscy9nZW9tZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBaUJILHdFQUF3RTtBQUV4RTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLElBQVk7SUFDOUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxnQkFBZ0I7SUFDOUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sT0FBTyxHQUFhLEVBQUUsQ0FBQztJQUM3QixNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7SUFDN0IsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN2QixNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEMsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3pCLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FB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O0lBQ3ZCLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO0lBQ3ZCLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDcEMsTUFBTSxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDdkIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNwQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFDRCxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztJQUN2QixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztJQUN2QixLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQ3BDLE1BQU0sTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFCLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUNqQyxLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO2dCQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUQs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WyIvKipcbiAqIFB1cmUgZ2VvbWV0cnkgaGVscGVycyBleHRyYWN0ZWQgZnJvbSBQbG90bHlTZXJ2aWNlLlxuICpcbiAqIE5vIERPTSBhY2Nlc3MsIG5vIHNlcnZpY2Ugc3RhdGUsIG5vIGB0aGlzYCDigJQgZXZlcnkgZnVuY3Rpb24gaXMgdGVzdGFibGVcbiAqIGluIGlzb2xhdGlvbi4gS2VlcCBpdCB0aGF0IHdheTogdGhpcyBtb2R1bGUgaXMgdGhlIGR1bXBpbmcgZ3JvdW5kIGZvclxuICogc2hhcGUvbWFzay9TVkctcGF0aCB1dGlsaXRpZXMgdGhlIHdhbmQsIHZlcnRleCBlcmFzZXIsIGFuZCByZWdpb24gZWRpdG9yXG4gKiBzaGFyZS4gSWYgYSBoZWxwZXIgZ3Jvd3MgYSBgdGhpcy5zaGFwZXNgIHJlZmVyZW5jZSwgaXQgZG9lc24ndCBiZWxvbmcgaGVyZS5cbiAqL1xuXG4vKiogQSBiYm94LXJlbGF0aXZlIGJpbmFyeSBtYXNrICgxID0gZmlsbGVkLCAwID0gZW1wdHkpLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCQm94TWFzayB7XG4gIGJ4OiBudW1iZXI7XG4gIGJ5OiBudW1iZXI7XG4gIGJ3OiBudW1iZXI7XG4gIGJoOiBudW1iZXI7XG4gIG1hc2s6IFVpbnQ4QXJyYXk7XG59XG5cbi8qKiBQYXJzZWQgc2luZ2xlLXN1YnBhdGggcG9seWdvbiB2ZXJ0aWNlcy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUG9seWdvblZlcnRpY2VzIHtcbiAgeHBvaW50czogbnVtYmVyW107XG4gIHlwb2ludHM6IG51bWJlcltdO1xufVxuXG4vLyDilIDilIAgU1ZHIHBhdGggcGFyc2luZyAvIGJ1aWxkaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFBhcnNlIGEgc2luZ2xlLXN1YnBhdGggYE0geCx5IEwgeCx5IC4uLiBaYCBwYXRoIGludG8gdmVydGV4IGFycmF5cy5cbiAqXG4gKiBSZXR1cm5zIG51bGwgZm9yIHBhdGhzIHdlIGNhbid0IHNhZmVseSByb3VuZC10cmlwIChtdWx0aS1zdWJwYXRoLCBjdXJ2ZXMsXG4gKiBmZXdlciB0aGFuIHRocmVlIHZlcnRpY2VzKS4gVGhlIHdhbmQgb25seSBhZG9wdHMgc2hhcGVzIGl0IHByb2R1Y2VkIG9yXG4gKiB0aGF0IFBsb3RseSdzIGRyYXdjbG9zZWRwYXRoIHByb2R1Y2VzLCBib3RoIG9mIHdoaWNoIGFyZSBzaW5nbGUtc3VicGF0aFxuICogcG9seWdvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVN2Z1BhdGhQb2x5Z29uKHBhdGg6IHN0cmluZyk6IFBvbHlnb25WZXJ0aWNlcyB8IG51bGwge1xuICBpZiAoIXBhdGggfHwgcGF0aFswXSAhPT0gJ00nKSByZXR1cm4gbnVsbDtcbiAgaWYgKHBhdGguaW5kZXhPZignTScsIDEpICE9PSAtMSkgcmV0dXJuIG51bGw7IC8vIG11bHRpLXN1YnBhdGhcbiAgY29uc3QgdHJpbW1lZCA9IHBhdGguZW5kc1dpdGgoJ1onKSA/IHBhdGguc2xpY2UoMSwgLTEpIDogcGF0aC5zbGljZSgxKTtcbiAgY29uc3Qgc2VncyA9IHRyaW1tZWQuc3BsaXQoJ0wnKTtcbiAgY29uc3QgeHBvaW50czogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgeXBvaW50czogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChjb25zdCBzZWcgb2Ygc2Vncykge1xuICAgIGNvbnN0IFtzeCwgc3ldID0gc2VnLnNwbGl0KCcsJyk7XG4gICAgY29uc3QgeCA9IHBhcnNlRmxvYXQoc3gpO1xuICAgIGNvbnN0IHkgPSBwYXJzZUZsb2F0KHN5KTtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh4KSB8fCAhTnVtYmVyLmlzRmluaXRlKHkpKSByZXR1cm4gbnVsbDtcbiAgICB4cG9pbnRzLnB1c2goeCk7XG4gICAgeXBvaW50cy5wdXNoKHkpO1xuICB9XG4gIGlmICh4cG9pbnRzLmxlbmd0aCA8IDMpIHJldHVybiBudWxsO1xuICByZXR1cm4geyB4cG9pbnRzLCB5cG9pbnRzIH07XG59XG5cbi8qKlxuICogQnVpbGQgYSBjbG9zZWQgU1ZHIHBhdGggc3RyaW5nIGBNIHgseSBMIHgseSBMIC4uLiBaYCBmcm9tIHZlcnRleCBhcnJheXMuXG4gKiBSZXR1cm5zICcnIGZvciBmZXdlciB0aGFuIHRocmVlIHZlcnRpY2VzIChkZWdlbmVyYXRlKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvbHlnb25Ub1N2Z1BhdGgoeHBvaW50czogbnVtYmVyW10sIHlwb2ludHM6IG51bWJlcltdKTogc3RyaW5nIHtcbiAgaWYgKHhwb2ludHMubGVuZ3RoIDwgMykgcmV0dXJuICcnO1xuICBsZXQgcGF0aCA9ICdNJztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB4cG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgcGF0aCArPSBgJHt4cG9pbnRzW2ldfSwke3lwb2ludHNbaV19YDtcbiAgICBwYXRoICs9IGkgPCB4cG9pbnRzLmxlbmd0aCAtIDEgPyAnTCcgOiAnWic7XG4gIH1cbiAgcmV0dXJuIHBhdGg7XG59XG5cbi8qKlxuICogQnVpbGQgYW4gU1ZHIHBhdGggc3RyaW5nIGZyb20gdmVydGV4IGFycmF5cy4gQ2xvc2VkIHBvbHlnb25zIGVuZCB3aXRoIGBaYCxcbiAqIG9wZW4gcG9seWxpbmVzIGRvIG5vdC4gUmV0dXJucyAnJyBmb3IgZmV3ZXIgdGhhbiB0d28gdmVydGljZXMgKGRlZ2VuZXJhdGUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmVydGljZXNUb1N2Z1BhdGgoeHM6IG51bWJlcltdLCB5czogbnVtYmVyW10sIGNsb3NlZDogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmICh4cy5sZW5ndGggPCAyKSByZXR1cm4gJyc7XG4gIGxldCBwYXRoID0gJ00nO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgcGF0aCArPSBgJHt4c1tpXX0sJHt5c1tpXX1gO1xuICAgIGlmIChpIDwgeHMubGVuZ3RoIC0gMSkgcGF0aCArPSAnTCc7XG4gIH1cbiAgaWYgKGNsb3NlZCkgcGF0aCArPSAnWic7XG4gIHJldHVybiBwYXRoO1xufVxuXG4vLyDilIDilIAgUmVnaW9uIGVxdWFsaXR5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIENvbXBhcmUgdHdvIFBsb3RseSBzaGFwZSBvYmplY3RzIGZvciBcInNhbWUgcmVnaW9uXCIg4oCUIHVzZWQgYnkgdGhlIHdhbmQgdG9cbiAqIGF2b2lkIGFwcGVuZGluZyBkdXBsaWNhdGVzIHdoZW4gdGhlIHVzZXIgcHVzaGVzIHRoZSBzYW1lIGZpbmQgcmVzdWx0IG1vcmVcbiAqIHRoYW4gb25jZS4gUG9seWdvbnMgY29tcGFyZSBieSBTVkcgcGF0aCBzdHJpbmcsIHJlY3RhbmdsZXMgY29tcGFyZSBieVxuICogKHgwLCB5MCwgeDEsIHkxKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNoYXBlc0VxdWFsKGE6IGFueSwgYjogYW55KTogYm9vbGVhbiB7XG4gIGlmIChhLnBhdGggJiYgYi5wYXRoKSB7XG4gICAgcmV0dXJuIGEucGF0aCA9PT0gYi5wYXRoO1xuICB9XG4gIGlmIChcbiAgICBhLngwICE9PSB1bmRlZmluZWQgJiYgYS55MCAhPT0gdW5kZWZpbmVkICYmXG4gICAgYS54MSAhPT0gdW5kZWZpbmVkICYmIGEueTEgIT09IHVuZGVmaW5lZCAmJlxuICAgIGIueDAgIT09IHVuZGVmaW5lZCAmJiBiLnkwICE9PSB1bmRlZmluZWQgJiZcbiAgICBiLngxICE9PSB1bmRlZmluZWQgJiYgYi55MSAhPT0gdW5kZWZpbmVkXG4gICkge1xuICAgIHJldHVybiBhLngwID09PSBiLngwICYmXG4gICAgICAgICAgIGEueTAgPT09IGIueTAgJiZcbiAgICAgICAgICAgYS54MSA9PT0gYi54MSAmJlxuICAgICAgICAgICBhLnkxID09PSBiLnkxO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLy8g4pSA4pSAIEJCb3gtbWFzayBvcGVyYXRpb25zICh1c2VkIGJ5IHRoZSB3YW5kIHN0cm9rZSBhY2N1bXVsYXRvcikg4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIHR3byBiYm94LXJlbGF0aXZlIG1hc2tzIHNoYXJlIGF0IGxlYXN0IG9uZSBzZXQgcGl4ZWwuICovXG5leHBvcnQgZnVuY3Rpb24gbWFza3NPdmVybGFwKGE6IEJCb3hNYXNrLCBiOiBCQm94TWFzayk6IGJvb2xlYW4ge1xuICBjb25zdCBpeDAgPSBNYXRoLm1heChhLmJ4LCBiLmJ4KTtcbiAgY29uc3QgaXkwID0gTWF0aC5tYXgoYS5ieSwgYi5ieSk7XG4gIGNvbnN0IGl4MSA9IE1hdGgubWluKGEuYnggKyBhLmJ3LCBiLmJ4ICsgYi5idyk7XG4gIGNvbnN0IGl5MSA9IE1hdGgubWluKGEuYnkgKyBhLmJoLCBiLmJ5ICsgYi5iaCk7XG4gIGlmIChpeDAgPj0gaXgxIHx8IGl5MCA+PSBpeTEpIHJldHVybiBmYWxzZTtcbiAgZm9yIChsZXQgeSA9IGl5MDsgeSA8IGl5MTsgeSsrKSB7XG4gICAgY29uc3QgYXIgPSAoeSAtIGEuYnkpICogYS5idztcbiAgICBjb25zdCBiciA9ICh5IC0gYi5ieSkgKiBiLmJ3O1xuICAgIGZvciAobGV0IHggPSBpeDA7IHggPCBpeDE7IHgrKykge1xuICAgICAgaWYgKGEubWFza1thciArICh4IC0gYS5ieCldICYmIGIubWFza1ticiArICh4IC0gYi5ieCldKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIEFsbG9jYXRlIGEgZnJlc2ggYWNjdW11bGF0b3IgY292ZXJpbmcgYm90aCBtYXNrcyBhbmQgT1IgdGhlbSBpbi4gVGhlXG4gKiByZXN1bHRpbmcgbWFzaydzIGJib3ggaXMgdGhlIHNtYWxsZXN0IHJlY3RhbmdsZSBjb250YWluaW5nIGJvdGggaW5wdXRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5pb25NYXNrcyhhOiBCQm94TWFzaywgYjogQkJveE1hc2spOiBCQm94TWFzayB7XG4gIGNvbnN0IHV4MCA9IE1hdGgubWluKGEuYngsIGIuYngpO1xuICBjb25zdCB1eTAgPSBNYXRoLm1pbihhLmJ5LCBiLmJ5KTtcbiAgY29uc3QgdXgxID0gTWF0aC5tYXgoYS5ieCArIGEuYncsIGIuYnggKyBiLmJ3KTtcbiAgY29uc3QgdXkxID0gTWF0aC5tYXgoYS5ieSArIGEuYmgsIGIuYnkgKyBiLmJoKTtcbiAgY29uc3QgdWJ3ID0gdXgxIC0gdXgwO1xuICBjb25zdCB1YmggPSB1eTEgLSB1eTA7XG4gIGNvbnN0IHVtYXNrID0gbmV3IFVpbnQ4QXJyYXkodWJ3ICogdWJoKTtcblxuICBjb25zdCBkYXggPSBhLmJ4IC0gdXgwO1xuICBjb25zdCBkYXkgPSBhLmJ5IC0gdXkwO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBhLmJoOyByb3crKykge1xuICAgIGNvbnN0IHNyYyA9IHJvdyAqIGEuYnc7XG4gICAgY29uc3QgZHN0ID0gKHJvdyArIGRheSkgKiB1YncgKyBkYXg7XG4gICAgdW1hc2suc2V0KGEubWFzay5zdWJhcnJheShzcmMsIHNyYyArIGEuYncpLCBkc3QpO1xuICB9XG4gIGNvbnN0IGRieCA9IGIuYnggLSB1eDA7XG4gIGNvbnN0IGRieSA9IGIuYnkgLSB1eTA7XG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGIuYmg7IHJvdysrKSB7XG4gICAgY29uc3Qgc3JjUm93ID0gcm93ICogYi5idztcbiAgICBjb25zdCBkc3RSb3cgPSAocm93ICsgZGJ5KSAqIHVidztcbiAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBiLmJ3OyBjb2wrKykge1xuICAgICAgaWYgKGIubWFza1tzcmNSb3cgKyBjb2xdKSB1bWFza1tkc3RSb3cgKyAoZGJ4ICsgY29sKV0gPSAxO1xuICAgIH1cbiAgfVxuICByZXR1cm4geyBieDogdXgwLCBieTogdXkwLCBidzogdWJ3LCBiaDogdWJoLCBtYXNrOiB1bWFzayB9O1xufVxuXG4vLyDilIDilIAgUmluZyBzaW1wbGlmaWNhdGlvbiAoRG91Z2xhc+KAk1BldWNrZXIpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogUGVycGVuZGljdWxhciBkaXN0YW5jZSBmcm9tIChweCxweSkgdG8gdGhlIHNlZ21lbnQgKGF4LGF5KeKAkyhieCxieSkuICovXG5mdW5jdGlvbiBwZXJwRGlzdGFuY2UocHg6IG51bWJlciwgcHk6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICBheDogbnVtYmVyLCBheTogbnVtYmVyLCBieDogbnVtYmVyLCBieTogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgZHggPSBieCAtIGF4LCBkeSA9IGJ5IC0gYXk7XG4gIGNvbnN0IGxlbjIgPSBkeCAqIGR4ICsgZHkgKiBkeTtcbiAgaWYgKGxlbjIgPT09IDApIHJldHVybiBNYXRoLmh5cG90KHB4IC0gYXgsIHB5IC0gYXkpO1xuICBsZXQgdCA9ICgocHggLSBheCkgKiBkeCArIChweSAtIGF5KSAqIGR5KSAvIGxlbjI7XG4gIHQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB0KSk7XG4gIHJldHVybiBNYXRoLmh5cG90KHB4IC0gKGF4ICsgdCAqIGR4KSwgcHkgLSAoYXkgKyB0ICogZHkpKTtcbn1cblxuLyoqXG4gKiBTaW1wbGlmeSBhIGNsb3NlZCByaW5nIHdpdGggdGhlIERvdWdsYXPigJNQZXVja2VyIGFsZ29yaXRobSAoaml0LXVpIzg1KTpcbiAqIGRyb3AgZXZlcnkgdmVydGV4IHRoYXQgbGllcyB3aXRoaW4gYGVwc2lsb25gIHBpeGVscyAodGhlIFwiYWx0aXR1ZGVcbiAqIHRocmVzaG9sZFwiKSBvZiB0aGUgbGluZSBiZXR3ZWVuIGl0cyBrZXB0IG5laWdoYm91cnMuIEFuY2hvcmVkIGF0IHZlcnRleCAwXG4gKiAodGhlIHJpbmcgaXMgY2xvc2VkIGJ5IGFwcGVuZGluZyBpdCkuIFJpbmdzIG9mIOKJpCAzIHZlcnRpY2VzLCBvciBhXG4gKiBub24tcG9zaXRpdmUgZXBzaWxvbiwgYXJlIHJldHVybmVkIHVuY2hhbmdlZC4gT3V0cHV0IGtlZXBzIHRoZSBjbG9zZWQtcmluZ1xuICogY29udmVudGlvbiAobm8gcmVwZWF0ZWQgY2xvc2luZyBwb2ludCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaW1wbGlmeVJpbmcoeHM6IG51bWJlcltdLCB5czogbnVtYmVyW10sIGVwc2lsb246IG51bWJlcilcbiAgOiB7IHhzOiBudW1iZXJbXTsgeXM6IG51bWJlcltdIH0ge1xuICBjb25zdCBuID0geHMubGVuZ3RoO1xuICBpZiAobiA8PSAzIHx8ICEoZXBzaWxvbiA+IDApKSByZXR1cm4geyB4czogeHMuc2xpY2UoKSwgeXM6IHlzLnNsaWNlKCkgfTtcblxuICAvLyBDbG9zZSB0aGUgcmluZyBzbyBib3RoIGVuZHBvaW50cyBvZiB0aGUgRFAgcnVuIGFyZSB2ZXJ0ZXggMC5cbiAgY29uc3QgcHggPSBbLi4ueHMsIHhzWzBdXTtcbiAgY29uc3QgcHkgPSBbLi4ueXMsIHlzWzBdXTtcbiAgY29uc3QgbSA9IHB4Lmxlbmd0aDtcbiAgY29uc3Qga2VlcCA9IG5ldyBBcnJheTxib29sZWFuPihtKS5maWxsKGZhbHNlKTtcbiAga2VlcFswXSA9IHRydWU7XG4gIGtlZXBbbSAtIDFdID0gdHJ1ZTtcblxuICBjb25zdCBzdGFjazogQXJyYXk8W251bWJlciwgbnVtYmVyXT4gPSBbWzAsIG0gLSAxXV07XG4gIHdoaWxlIChzdGFjay5sZW5ndGgpIHtcbiAgICBjb25zdCBbYSwgYl0gPSBzdGFjay5wb3AoKSBhcyBbbnVtYmVyLCBudW1iZXJdO1xuICAgIGxldCBtYXhEID0gLTEsIGlkeCA9IC0xO1xuICAgIGZvciAobGV0IGkgPSBhICsgMTsgaSA8IGI7IGkrKykge1xuICAgICAgY29uc3QgZCA9IHBlcnBEaXN0YW5jZShweFtpXSwgcHlbaV0sIHB4W2FdLCBweVthXSwgcHhbYl0sIHB5W2JdKTtcbiAgICAgIGlmIChkID4gbWF4RCkgeyBtYXhEID0gZDsgaWR4ID0gaTsgfVxuICAgIH1cbiAgICBpZiAobWF4RCA+IGVwc2lsb24gJiYgaWR4ID4gYSkge1xuICAgICAga2VlcFtpZHhdID0gdHJ1ZTtcbiAgICAgIHN0YWNrLnB1c2goW2EsIGlkeF0sIFtpZHgsIGJdKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBvdXRYOiBudW1iZXJbXSA9IFtdLCBvdXRZOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG0gLSAxOyBpKyspIHsgICAgICAvLyBkcm9wIHRoZSBkdXBsaWNhdGVkIGNsb3NpbmcgdmVydGV4XG4gICAgaWYgKGtlZXBbaV0pIHsgb3V0WC5wdXNoKHB4W2ldKTsgb3V0WS5wdXNoKHB5W2ldKTsgfVxuICB9XG4gIHJldHVybiB7IHhzOiBvdXRYLCB5czogb3V0WSB9O1xufVxuIl19
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvbWV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21vZGVscy9nZW9tZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFRSCx3RUFBd0U7QUFFeEU7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsSUFBWTtJQUN2QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLDBCQUEwQjtJQUNuRixNQUFNLE9BQU8sR0FBYSxFQUFFLENBQUM7SUFDN0IsTUFBTSxPQUFPLEdBQWEsRUFBRSxDQUFDO0lBQzdCLEtBQUssTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdCLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUNELE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO0FBQ3RDLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxJQUFZO0lBQzlDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUc7UUFBRSxPQUFPLElBQUksQ0FBQztJQUMxQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDLENBQUMsZ0JBQWdCO0lBQzlELE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hELElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUM3RixJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3BDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDOUIsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxFQUFZLEVBQUUsRUFBWSxFQUFFLE1BQWU7SUFDM0UsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUM3QixJQUFJLElBQUksR0FBRyxHQUFHLENBQUM7SUFDZixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ25DLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUM7WUFBRSxJQUFJLElBQUksR0FBRyxDQUFDO0lBQ3JDLENBQUM7SUFDRCxJQUFJLE1BQU07UUFBRSxJQUFJLElBQUksR0FBRyxDQUFDO0lBQ3hCLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUHVyZSBTVkctcGF0aCBoZWxwZXJzIChidWlsZCBhbmQgcGFyc2UgYSB2ZXJ0ZXggcmluZyBhcyBhIFBsb3RseSBwYXRoKS5cbiAqXG4gKiBObyBET00gYWNjZXNzLCBubyBzZXJ2aWNlIHN0YXRlLCBubyBgdGhpc2AuIE1hc2sgYW5kIHJpbmcgZ2VvbWV0cnkgKHRoZVxuICogcmFzdGVyaXplciwgbWFzayBzZXQgb3BlcmF0aW9ucywgcG9pbnQtaW4tcmluZywgc2ltcGxpZmljYXRpb24sIGNvbnRvdXJcbiAqIHRyYWNpbmcpIGxpdmVzIGluIGBzcmMvbGliL2dlb21ldHJ5L2AuXG4gKi9cblxuLyoqIFBhcnNlZCBzaW5nbGUtc3VicGF0aCBwb2x5Z29uIHZlcnRpY2VzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQb2x5Z29uVmVydGljZXMge1xuICB4cG9pbnRzOiBudW1iZXJbXTtcbiAgeXBvaW50czogbnVtYmVyW107XG59XG5cbi8vIOKUgOKUgCBTVkcgcGF0aCBwYXJzaW5nIC8gYnVpbGRpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogU3BsaXQgYSBzaW5nbGUtc3VicGF0aCBgTSB4LHkgTCB4LHkgLi4uIFtaXWAgcGF0aCBpbnRvIHZlcnRleCBhcnJheXMsIHBsdXNcbiAqIHdoZXRoZXIgaXQgaXMgY2xvc2VkIChlbmRzIGluIGBaYCkuIE5vIHZhbGlkYXRpb246IGEgY29vcmRpbmF0ZSB0aGF0IGRvZXNuJ3RcbiAqIHBhcnNlIGNvbWVzIGJhY2sgYXMgTmFOLiBTZWUge0BsaW5rIHBhcnNlU3ZnUGF0aFBvbHlnb259IGZvciB0aGUgY2hlY2tlZCBmb3JtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTdmdQYXRoKHBhdGg6IHN0cmluZyk6IFBvbHlnb25WZXJ0aWNlcyAmIHsgY2xvc2VkOiBib29sZWFuIH0ge1xuICBjb25zdCBjbG9zZWQgPSBwYXRoLmVuZHNXaXRoKCdaJyk7XG4gIGNvbnN0IGJvZHkgPSBjbG9zZWQgPyBwYXRoLnNsaWNlKDEsIC0xKSA6IHBhdGguc2xpY2UoMSk7IC8vIGRyb3AgTSBhbmQgb3B0aW9uYWxseSBaXG4gIGNvbnN0IHhwb2ludHM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IHlwb2ludHM6IG51bWJlcltdID0gW107XG4gIGZvciAoY29uc3Qgc2VnIG9mIGJvZHkuc3BsaXQoJ0wnKSkge1xuICAgIGNvbnN0IFtzeCwgc3ldID0gc2VnLnNwbGl0KCcsJyk7XG4gICAgeHBvaW50cy5wdXNoKHBhcnNlRmxvYXQoc3gpKTtcbiAgICB5cG9pbnRzLnB1c2gocGFyc2VGbG9hdChzeSkpO1xuICB9XG4gIHJldHVybiB7IHhwb2ludHMsIHlwb2ludHMsIGNsb3NlZCB9O1xufVxuXG4vKipcbiAqIFBhcnNlIGEgc2luZ2xlLXN1YnBhdGggYE0geCx5IEwgeCx5IC4uLiBbWl1gIHBhdGggaW50byB2ZXJ0ZXggYXJyYXlzLlxuICpcbiAqIFJldHVybnMgbnVsbCBmb3IgcGF0aHMgd2UgY2FuJ3Qgc2FmZWx5IHJvdW5kLXRyaXAgKG11bHRpLXN1YnBhdGgsIGN1cnZlcyxcbiAqIG5vbi1udW1lcmljIGNvb3JkaW5hdGVzLCBmZXdlciB0aGFuIHRocmVlIHZlcnRpY2VzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlU3ZnUGF0aFBvbHlnb24ocGF0aDogc3RyaW5nKTogUG9seWdvblZlcnRpY2VzIHwgbnVsbCB7XG4gIGlmICghcGF0aCB8fCBwYXRoWzBdICE9PSAnTScpIHJldHVybiBudWxsO1xuICBpZiAocGF0aC5pbmRleE9mKCdNJywgMSkgIT09IC0xKSByZXR1cm4gbnVsbDsgLy8gbXVsdGktc3VicGF0aFxuICBjb25zdCB7IHhwb2ludHMsIHlwb2ludHMgfSA9IHBhcnNlU3ZnUGF0aChwYXRoKTtcbiAgaWYgKHhwb2ludHMuc29tZSgoeCwgaSkgPT4gIU51bWJlci5pc0Zpbml0ZSh4KSB8fCAhTnVtYmVyLmlzRmluaXRlKHlwb2ludHNbaV0pKSkgcmV0dXJuIG51bGw7XG4gIGlmICh4cG9pbnRzLmxlbmd0aCA8IDMpIHJldHVybiBudWxsO1xuICByZXR1cm4geyB4cG9pbnRzLCB5cG9pbnRzIH07XG59XG5cbi8qKlxuICogQnVpbGQgYW4gU1ZHIHBhdGggc3RyaW5nIGZyb20gdmVydGV4IGFycmF5cy4gQ2xvc2VkIHBvbHlnb25zIGVuZCB3aXRoIGBaYCxcbiAqIG9wZW4gcG9seWxpbmVzIGRvIG5vdC4gUmV0dXJucyAnJyBmb3IgZmV3ZXIgdGhhbiB0d28gdmVydGljZXMgKGRlZ2VuZXJhdGUpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmVydGljZXNUb1N2Z1BhdGgoeHM6IG51bWJlcltdLCB5czogbnVtYmVyW10sIGNsb3NlZDogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmICh4cy5sZW5ndGggPCAyKSByZXR1cm4gJyc7XG4gIGxldCBwYXRoID0gJ00nO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgcGF0aCArPSBgJHt4c1tpXX0sJHt5c1tpXX1gO1xuICAgIGlmIChpIDwgeHMubGVuZ3RoIC0gMSkgcGF0aCArPSAnTCc7XG4gIH1cbiAgaWYgKGNsb3NlZCkgcGF0aCArPSAnWic7XG4gIHJldHVybiBwYXRoO1xufVxuIl19
|