@jax-data-science/sci-image-visualizer 0.8.3 → 0.9.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 +28 -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/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/sam.contract.mjs +1 -1
- 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/raster.mjs +98 -0
- package/esm2022/lib/geometry/ring.mjs +201 -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 +3 -4
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +66 -0
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +157 -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 +263 -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 +344 -0
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +358 -4218
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +439 -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 +182 -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 +153 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +185 -718
- 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 +118 -0
- package/esm2022/lib/models/region-clone.mjs +68 -0
- package/esm2022/lib/models/region-geojson.mjs +373 -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/classes-panel/classes-panel.component.mjs +99 -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 +402 -651
- package/esm2022/lib/region-editor/region-metrics.mjs +68 -0
- package/esm2022/lib/region-editor/region-persistence.service.mjs +134 -0
- package/esm2022/lib/region-editor/region-table/region-table.component.mjs +153 -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/svg-region-renderer.mjs +228 -0
- package/esm2022/lib/render-orchestrator.mjs +14 -11
- package/esm2022/lib/render-session.mjs +207 -0
- package/esm2022/lib/routing-visualizer.service.mjs +459 -411
- 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 +46 -3
- package/esm2022/lib/store/region-history.mjs +146 -0
- package/esm2022/lib/store/region-scope-cache.mjs +140 -0
- package/esm2022/lib/store/region-selection.mjs +82 -0
- package/esm2022/lib/store/region-store.service.mjs +279 -675
- package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
- package/esm2022/lib/store/visualizer-store.service.mjs +49 -71
- 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 +114 -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 +81 -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 +68 -117
- 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 +60 -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.component.mjs +480 -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-Csxlnq7I.mjs +41083 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs +238 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.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/spatial-math.worker.js +471 -0
- package/fesm2022/tsne.worker.js +32 -15
- package/index.d.ts +13 -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/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 +1 -1
- package/lib/contracts/region-overlay.contract.d.ts +5 -0
- package/lib/contracts/sam.contract.d.ts +7 -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 +221 -54
- package/lib/contracts/viz-config.d.ts +1 -0
- package/lib/geometry/contour.d.ts +24 -0
- package/lib/geometry/raster.d.ts +42 -0
- package/lib/geometry/ring.d.ts +67 -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 +0 -1
- package/lib/implementations/napari-js/napari-loading-state.d.ts +30 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +62 -70
- package/lib/implementations/napari-js/napari-scene.d.ts +93 -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 +89 -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 +121 -883
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +104 -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 +37 -0
- package/lib/implementations/osd/osd-region-overlay.d.ts +36 -48
- 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 +80 -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 +18 -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 +40 -0
- package/lib/models/region-clone.d.ts +20 -0
- package/lib/models/region-geojson.d.ts +17 -0
- package/lib/models/region.d.ts +40 -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/classes-panel/classes-panel.component.d.ts +56 -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 +166 -199
- package/lib/region-editor/region-metrics.d.ts +26 -0
- package/lib/region-editor/region-persistence.service.d.ts +69 -0
- package/lib/region-editor/region-table/region-table.component.d.ts +83 -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 +157 -0
- package/lib/region-overlay/region-hit-test.d.ts +38 -0
- package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
- package/lib/render-orchestrator.d.ts +6 -2
- package/lib/render-session.d.ts +75 -0
- package/lib/routing-visualizer.service.d.ts +110 -58
- 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 +35 -1
- package/lib/store/region-history.d.ts +66 -0
- package/lib/store/region-scope-cache.d.ts +63 -0
- package/lib/store/region-selection.d.ts +36 -0
- package/lib/store/region-store.service.d.ts +104 -112
- package/lib/store/visualizer-store.service.d.ts +22 -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 +60 -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 +40 -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 +47 -83
- 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 +27 -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.component.d.ts +201 -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/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,183 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { frameToRgba } from './sam-prompt';
|
|
3
|
+
import { getSamModel, isSamModelReady } from './sam-model-registry';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
/** Lazy-import so onnxruntime-web is never pulled into unit tests or the
|
|
6
|
+
* initial bundle — only when segmentation actually runs. */
|
|
7
|
+
const onnxSessionFactory = async () => {
|
|
8
|
+
const { OnnxSamSession } = await import('./onnx-sam-session');
|
|
9
|
+
return new OnnxSamSession();
|
|
10
|
+
};
|
|
11
|
+
/** Thrown inside a load that a model switch superseded. */
|
|
12
|
+
class SupersededLoad extends Error {
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* The one SAM inference session for the active model, shared by the box- and
|
|
16
|
+
* point-prompt tools (RT-10): one download, one Worker/GPU session and one
|
|
17
|
+
* cached image embedding instead of one per tool.
|
|
18
|
+
*
|
|
19
|
+
* - Concurrent {@link ensureSession} calls share a single load, and each caller
|
|
20
|
+
* receives its download progress.
|
|
21
|
+
* - A load that fails disposes its half-built session (and Worker) and is not
|
|
22
|
+
* cached; the next call retries (RT-7).
|
|
23
|
+
* - {@link setModel} during a load discards that load's session, and the
|
|
24
|
+
* waiting callers get the newly picked model instead (RT-9).
|
|
25
|
+
*
|
|
26
|
+
* Scope: root, on purpose, and deliberately NOT in `provideVisualization()`. The
|
|
27
|
+
* chain-scoped SAM tools of a second viewer (jit-ui's pipeline preview) resolve
|
|
28
|
+
* this root instance, so the model (14–172 MB) is downloaded and its Worker/GPU
|
|
29
|
+
* session built once per app, not once per viewer, and the embedding cache is
|
|
30
|
+
* keyed by image + model so viewers don't confuse each other's images. The cost
|
|
31
|
+
* is that a model picked in one viewer is the model of all of them. A host that
|
|
32
|
+
* wants a session per viewer can provide this service at the viewer's component:
|
|
33
|
+
* {@link ngOnDestroy} then disposes that viewer's session (and Worker) with it.
|
|
34
|
+
*/
|
|
35
|
+
export class SamSessionService {
|
|
36
|
+
constructor() {
|
|
37
|
+
this.model = getSamModel();
|
|
38
|
+
this.session = null;
|
|
39
|
+
this.loading = null;
|
|
40
|
+
/** Bumped on every model switch; a load started under an older value is stale. */
|
|
41
|
+
this.generation = 0;
|
|
42
|
+
this.progressListeners = new Set();
|
|
43
|
+
this.createSession = onnxSessionFactory;
|
|
44
|
+
/** Set by {@link ngOnDestroy}: no session is loaded any more. */
|
|
45
|
+
this.destroyed = false;
|
|
46
|
+
/** Cached encoder embedding + the key (image identity + model) it was computed for. */
|
|
47
|
+
this.embedding = null;
|
|
48
|
+
this.embeddingKey = null;
|
|
49
|
+
}
|
|
50
|
+
/** The model the next run uses. */
|
|
51
|
+
getModel() {
|
|
52
|
+
return this.model;
|
|
53
|
+
}
|
|
54
|
+
/** True when a session is loaded (or injected) for the current model. */
|
|
55
|
+
hasSession() {
|
|
56
|
+
return this.session !== null;
|
|
57
|
+
}
|
|
58
|
+
/** Choose the registered model; drops the loaded session and cached embedding. */
|
|
59
|
+
setModel(id) {
|
|
60
|
+
const next = getSamModel(id);
|
|
61
|
+
if (next.id === this.model.id)
|
|
62
|
+
return;
|
|
63
|
+
this.model = next;
|
|
64
|
+
this.generation++;
|
|
65
|
+
this.loading = null;
|
|
66
|
+
this.invalidateEmbedding();
|
|
67
|
+
this.session?.dispose();
|
|
68
|
+
this.session = null;
|
|
69
|
+
}
|
|
70
|
+
/** Drop the cached embedding (e.g. after the image/slice changes). */
|
|
71
|
+
invalidateEmbedding() {
|
|
72
|
+
this.embedding = null;
|
|
73
|
+
this.embeddingKey = null;
|
|
74
|
+
}
|
|
75
|
+
/** Test seam: use this session (already loaded) for the current model. */
|
|
76
|
+
useSession(session) {
|
|
77
|
+
this.session = session;
|
|
78
|
+
}
|
|
79
|
+
/** Test seam: how sessions are created (default: lazy onnxruntime-web). */
|
|
80
|
+
useSessionFactory(factory) {
|
|
81
|
+
this.createSession = factory;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* The loaded session for the current model, loading it if needed.
|
|
85
|
+
* `onProgress` receives the download fraction while this call waits.
|
|
86
|
+
*/
|
|
87
|
+
async ensureSession(onProgress) {
|
|
88
|
+
if (this.destroyed)
|
|
89
|
+
throw new Error('The SAM session was disposed with its viewer.');
|
|
90
|
+
if (this.session)
|
|
91
|
+
return this.session;
|
|
92
|
+
if (!isSamModelReady(this.model)) {
|
|
93
|
+
throw new Error(`SAM model "${this.model.id}" is not configured yet (no ONNX URLs). ` +
|
|
94
|
+
'Host it and call setSamModelUrls(), then retry.');
|
|
95
|
+
}
|
|
96
|
+
if (onProgress) {
|
|
97
|
+
this.progressListeners.add(onProgress);
|
|
98
|
+
onProgress(0);
|
|
99
|
+
}
|
|
100
|
+
try {
|
|
101
|
+
return await (this.loading ??= this.load());
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
if (err instanceof SupersededLoad)
|
|
105
|
+
return this.ensureSession(onProgress);
|
|
106
|
+
throw err;
|
|
107
|
+
}
|
|
108
|
+
finally {
|
|
109
|
+
if (onProgress)
|
|
110
|
+
this.progressListeners.delete(onProgress);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* The encoder embedding of a cached frame, reused while `key` (the image's
|
|
115
|
+
* identity: file, frame, readback frame) and the model are unchanged.
|
|
116
|
+
* `onEncode` is called only when the encoder actually runs.
|
|
117
|
+
*/
|
|
118
|
+
async embed(session, cached, frameIndex, key, onEncode) {
|
|
119
|
+
const fullKey = `${key}|${this.model.id}`;
|
|
120
|
+
if (this.embedding && this.embeddingKey === fullKey)
|
|
121
|
+
return this.embedding;
|
|
122
|
+
onEncode?.();
|
|
123
|
+
const generation = this.generation;
|
|
124
|
+
const embedding = await session.embed({
|
|
125
|
+
data: frameToRgba(cached, frameIndex),
|
|
126
|
+
width: cached.width,
|
|
127
|
+
height: cached.height,
|
|
128
|
+
});
|
|
129
|
+
if (generation === this.generation) {
|
|
130
|
+
this.embedding = embedding;
|
|
131
|
+
this.embeddingKey = fullKey;
|
|
132
|
+
}
|
|
133
|
+
return embedding;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Dispose the session (and its Worker), drop the embedding and discard an
|
|
137
|
+
* in-flight load. Angular calls this when the injector providing the service
|
|
138
|
+
* is destroyed: the app for the root instance, or a viewer component that
|
|
139
|
+
* provides its own.
|
|
140
|
+
*/
|
|
141
|
+
ngOnDestroy() {
|
|
142
|
+
this.destroyed = true;
|
|
143
|
+
this.generation++; // an in-flight load disposes its session when it lands
|
|
144
|
+
this.loading = null;
|
|
145
|
+
this.invalidateEmbedding();
|
|
146
|
+
this.session?.dispose();
|
|
147
|
+
this.session = null;
|
|
148
|
+
}
|
|
149
|
+
load() {
|
|
150
|
+
const generation = this.generation;
|
|
151
|
+
const model = this.model;
|
|
152
|
+
const load = (async () => {
|
|
153
|
+
const session = await this.createSession();
|
|
154
|
+
try {
|
|
155
|
+
await session.loadModel(model, (f) => this.progressListeners.forEach((l) => l(f)));
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
session.dispose(); // don't leak the half-built session / Worker
|
|
159
|
+
throw err;
|
|
160
|
+
}
|
|
161
|
+
if (generation !== this.generation) {
|
|
162
|
+
session.dispose(); // the user picked another model meanwhile
|
|
163
|
+
throw new SupersededLoad();
|
|
164
|
+
}
|
|
165
|
+
this.session = session;
|
|
166
|
+
return session;
|
|
167
|
+
})();
|
|
168
|
+
load
|
|
169
|
+
.catch(() => undefined)
|
|
170
|
+
.finally(() => {
|
|
171
|
+
if (this.loading === load)
|
|
172
|
+
this.loading = null;
|
|
173
|
+
});
|
|
174
|
+
return load;
|
|
175
|
+
}
|
|
176
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SamSessionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
177
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SamSessionService, providedIn: 'root' }); }
|
|
178
|
+
}
|
|
179
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SamSessionService, decorators: [{
|
|
180
|
+
type: Injectable,
|
|
181
|
+
args: [{ providedIn: 'root' }]
|
|
182
|
+
}] });
|
|
183
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FtLXNlc3Npb24uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXNlc3Npb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBR3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFNcEU7NkRBQzZEO0FBQzdELE1BQU0sa0JBQWtCLEdBQXNCLEtBQUssSUFBSSxFQUFFO0lBQ3ZELE1BQU0sRUFBRSxjQUFjLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQzlELE9BQU8sSUFBSSxjQUFjLEVBQUUsQ0FBQztBQUM5QixDQUFDLENBQUM7QUFFRiwyREFBMkQ7QUFDM0QsTUFBTSxjQUFlLFNBQVEsS0FBSztDQUFHO0FBRXJDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUVILE1BQU0sT0FBTyxpQkFBaUI7SUFEOUI7UUFFVSxVQUFLLEdBQWdCLFdBQVcsRUFBRSxDQUFDO1FBQ25DLFlBQU8sR0FBdUIsSUFBSSxDQUFDO1FBQ25DLFlBQU8sR0FBZ0MsSUFBSSxDQUFDO1FBQ3BELGtGQUFrRjtRQUMxRSxlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ04sc0JBQWlCLEdBQUcsSUFBSSxHQUFHLEVBQThCLENBQUM7UUFDbkUsa0JBQWEsR0FBc0Isa0JBQWtCLENBQUM7UUFFOUQsaUVBQWlFO1FBQ3pELGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFMUIsdUZBQXVGO1FBQy9FLGNBQVMsR0FBd0IsSUFBSSxDQUFDO1FBQ3RDLGlCQUFZLEdBQWtCLElBQUksQ0FBQztLQXVJNUM7SUFySUMsbUNBQW1DO0lBQ25DLFFBQVE7UUFDTixP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LE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRixDQUFDO1lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztnQkFDYixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyw2Q0FBNkM7Z0JBQ2hFLE1BQU0sR0FBRyxDQUFDO1lBQ1osQ0FBQztZQUNELElBQUksVUFBVSxLQUFLLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDbkMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsMENBQTBDO2dCQUM3RCxNQUFNLElBQUksY0FBYyxFQUFFLENBQUM7WUFDN0IsQ0FBQztZQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1lBQ3ZCLE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDTCxJQUFJO2FBQ0QsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQzthQUN0QixPQUFPLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUk7Z0JBQUUsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDakQsQ0FBQyxDQUFDLENBQUM7UUFDTCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7OEdBcEpVLGlCQUFpQjtrSEFBakIsaUJBQWlCLGNBREosTUFBTTs7MkZBQ25CLGlCQUFpQjtrQkFEN0IsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHR5cGUgeyBDYWNoZWRJbWFnZURhdGEgfSBmcm9tICcuLi93YW5kL3dhbmQtdG9vbC5zZXJ2aWNlJztcbmltcG9ydCB7IGZyYW1lVG9SZ2JhIH0gZnJvbSAnLi9zYW0tcHJvbXB0JztcbmltcG9ydCB7IGdldFNhbU1vZGVsLCBpc1NhbU1vZGVsUmVhZHkgfSBmcm9tICcuL3NhbS1tb2RlbC1yZWdpc3RyeSc7XG5pbXBvcnQgeyBJU2FtU2Vzc2lvbiwgU2FtRW1iZWRkaW5nLCBTYW1Nb2RlbERlZiB9IGZyb20gJy4uLy4uL2NvbnRyYWN0cy9zYW0uY29udHJhY3QnO1xuXG4vKiogQ3JlYXRlcyBhbiB1bmxvYWRlZCBpbmZlcmVuY2Ugc2Vzc2lvbi4gKi9cbmV4cG9ydCB0eXBlIFNhbVNlc3Npb25GYWN0b3J5ID0gKCkgPT4gUHJvbWlzZTxJU2FtU2Vzc2lvbj47XG5cbi8qKiBMYXp5LWltcG9ydCBzbyBvbm54cnVudGltZS13ZWIgaXMgbmV2ZXIgcHVsbGVkIGludG8gdW5pdCB0ZXN0cyBvciB0aGVcbiAqICBpbml0aWFsIGJ1bmRsZSDigJQgb25seSB3aGVuIHNlZ21lbnRhdGlvbiBhY3R1YWxseSBydW5zLiAqL1xuY29uc3Qgb25ueFNlc3Npb25GYWN0b3J5OiBTYW1TZXNzaW9uRmFjdG9yeSA9IGFzeW5jICgpID0+IHtcbiAgY29uc3QgeyBPbm54U2FtU2Vzc2lvbiB9ID0gYXdhaXQgaW1wb3J0KCcuL29ubngtc2FtLXNlc3Npb24nKTtcbiAgcmV0dXJuIG5ldyBPbm54U2FtU2Vzc2lvbigpO1xufTtcblxuLyoqIFRocm93biBpbnNpZGUgYSBsb2FkIHRoYXQgYSBtb2RlbCBzd2l0Y2ggc3VwZXJzZWRlZC4gKi9cbmNsYXNzIFN1cGVyc2VkZWRMb2FkIGV4dGVuZHMgRXJyb3Ige31cblxuLyoqXG4gKiBUaGUgb25lIFNBTSBpbmZlcmVuY2Ugc2Vzc2lvbiBmb3IgdGhlIGFjdGl2ZSBtb2RlbCwgc2hhcmVkIGJ5IHRoZSBib3gtIGFuZFxuICogcG9pbnQtcHJvbXB0IHRvb2xzIChSVC0xMCk6IG9uZSBkb3dubG9hZCwgb25lIFdvcmtlci9HUFUgc2Vzc2lvbiBhbmQgb25lXG4gKiBjYWNoZWQgaW1hZ2UgZW1iZWRkaW5nIGluc3RlYWQgb2Ygb25lIHBlciB0b29sLlxuICpcbiAqIC0gQ29uY3VycmVudCB7QGxpbmsgZW5zdXJlU2Vzc2lvbn0gY2FsbHMgc2hhcmUgYSBzaW5nbGUgbG9hZCwgYW5kIGVhY2ggY2FsbGVyXG4gKiAgIHJlY2VpdmVzIGl0cyBkb3dubG9hZCBwcm9ncmVzcy5cbiAqIC0gQSBsb2FkIHRoYXQgZmFpbHMgZGlzcG9zZXMgaXRzIGhhbGYtYnVpbHQgc2Vzc2lvbiAoYW5kIFdvcmtlcikgYW5kIGlzIG5vdFxuICogICBjYWNoZWQ7IHRoZSBuZXh0IGNhbGwgcmV0cmllcyAoUlQtNykuXG4gKiAtIHtAbGluayBzZXRNb2RlbH0gZHVyaW5nIGEgbG9hZCBkaXNjYXJkcyB0aGF0IGxvYWQncyBzZXNzaW9uLCBhbmQgdGhlXG4gKiAgIHdhaXRpbmcgY2FsbGVycyBnZXQgdGhlIG5ld2x5IHBpY2tlZCBtb2RlbCBpbnN0ZWFkIChSVC05KS5cbiAqXG4gKiBTY29wZTogcm9vdCwgb24gcHVycG9zZSwgYW5kIGRlbGliZXJhdGVseSBOT1QgaW4gYHByb3ZpZGVWaXN1YWxpemF0aW9uKClgLiBUaGVcbiAqIGNoYWluLXNjb3BlZCBTQU0gdG9vbHMgb2YgYSBzZWNvbmQgdmlld2VyIChqaXQtdWkncyBwaXBlbGluZSBwcmV2aWV3KSByZXNvbHZlXG4gKiB0aGlzIHJvb3QgaW5zdGFuY2UsIHNvIHRoZSBtb2RlbCAoMTTigJMxNzIgTUIpIGlzIGRvd25sb2FkZWQgYW5kIGl0cyBXb3JrZXIvR1BVXG4gKiBzZXNzaW9uIGJ1aWx0IG9uY2UgcGVyIGFwcCwgbm90IG9uY2UgcGVyIHZpZXdlciwgYW5kIHRoZSBlbWJlZGRpbmcgY2FjaGUgaXNcbiAqIGtleWVkIGJ5IGltYWdlICsgbW9kZWwgc28gdmlld2VycyBkb24ndCBjb25mdXNlIGVhY2ggb3RoZXIncyBpbWFnZXMuIFRoZSBjb3N0XG4gKiBpcyB0aGF0IGEgbW9kZWwgcGlja2VkIGluIG9uZSB2aWV3ZXIgaXMgdGhlIG1vZGVsIG9mIGFsbCBvZiB0aGVtLiBBIGhvc3QgdGhhdFxuICogd2FudHMgYSBzZXNzaW9uIHBlciB2aWV3ZXIgY2FuIHByb3ZpZGUgdGhpcyBzZXJ2aWNlIGF0IHRoZSB2aWV3ZXIncyBjb21wb25lbnQ6XG4gKiB7QGxpbmsgbmdPbkRlc3Ryb3l9IHRoZW4gZGlzcG9zZXMgdGhhdCB2aWV3ZXIncyBzZXNzaW9uIChhbmQgV29ya2VyKSB3aXRoIGl0LlxuICovXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFNhbVNlc3Npb25TZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBtb2RlbDogU2FtTW9kZWxEZWYgPSBnZXRTYW1Nb2RlbCgpO1xuICBwcml2YXRlIHNlc3Npb246IElTYW1TZXNzaW9uIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbG9hZGluZzogUHJvbWlzZTxJU2FtU2Vzc2lvbj4gfCBudWxsID0gbnVsbDtcbiAgLyoqIEJ1bXBlZCBvbiBldmVyeSBtb2RlbCBzd2l0Y2g7IGEgbG9hZCBzdGFydGVkIHVuZGVyIGFuIG9sZGVyIHZhbHVlIGlzIHN0YWxlLiAqL1xuICBwcml2YXRlIGdlbmVyYXRpb24gPSAwO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb2dyZXNzTGlzdGVuZXJzID0gbmV3IFNldDwoZnJhY3Rpb246IG51bWJlcikgPT4gdm9pZD4oKTtcbiAgcHJpdmF0ZSBjcmVhdGVTZXNzaW9uOiBTYW1TZXNzaW9uRmFjdG9yeSA9IG9ubnhTZXNzaW9uRmFjdG9yeTtcblxuICAvKiogU2V0IGJ5IHtAbGluayBuZ09uRGVzdHJveX06IG5vIHNlc3Npb24gaXMgbG9hZGVkIGFueSBtb3JlLiAqL1xuICBwcml2YXRlIGRlc3Ryb3llZCA9IGZhbHNlO1xuXG4gIC8qKiBDYWNoZWQgZW5jb2RlciBlbWJlZGRpbmcgKyB0aGUga2V5IChpbWFnZSBpZGVudGl0eSArIG1vZGVsKSBpdCB3YXMgY29tcHV0ZWQgZm9yLiAqL1xuICBwcml2YXRlIGVtYmVkZGluZzogU2FtRW1iZWRkaW5nIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgZW1iZWRkaW5nS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKiogVGhlIG1vZGVsIHRoZSBuZXh0IHJ1biB1c2VzLiAqL1xuICBnZXRNb2RlbCgpOiBTYW1Nb2RlbERlZiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWw7XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIGEgc2Vzc2lvbiBpcyBsb2FkZWQgKG9yIGluamVjdGVkKSBmb3IgdGhlIGN1cnJlbnQgbW9kZWwuICovXG4gIGhhc1Nlc3Npb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2Vzc2lvbiAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKiBDaG9vc2UgdGhlIHJlZ2lzdGVyZWQgbW9kZWw7IGRyb3BzIHRoZSBsb2FkZWQgc2Vzc2lvbiBhbmQgY2FjaGVkIGVtYmVkZGluZy4gKi9cbiAgc2V0TW9kZWwoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG5leHQgPSBnZXRTYW1Nb2RlbChpZCk7XG4gICAgaWYgKG5leHQuaWQgPT09IHRoaXMubW9kZWwuaWQpIHJldHVybjtcbiAgICB0aGlzLm1vZGVsID0gbmV4dDtcbiAgICB0aGlzLmdlbmVyYXRpb24rKztcbiAgICB0aGlzLmxvYWRpbmcgPSBudWxsO1xuICAgIHRoaXMuaW52YWxpZGF0ZUVtYmVkZGluZygpO1xuICAgIHRoaXMuc2Vzc2lvbj8uZGlzcG9zZSgpO1xuICAgIHRoaXMuc2Vzc2lvbiA9IG51bGw7XG4gIH1cblxuICAvKiogRHJvcCB0aGUgY2FjaGVkIGVtYmVkZGluZyAoZS5nLiBhZnRlciB0aGUgaW1hZ2Uvc2xpY2UgY2hhbmdlcykuICovXG4gIGludmFsaWRhdGVFbWJlZGRpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5lbWJlZGRpbmcgPSBudWxsO1xuICAgIHRoaXMuZW1iZWRkaW5nS2V5ID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBUZXN0IHNlYW06IHVzZSB0aGlzIHNlc3Npb24gKGFscmVhZHkgbG9hZGVkKSBmb3IgdGhlIGN1cnJlbnQgbW9kZWwuICovXG4gIHVzZVNlc3Npb24oc2Vzc2lvbjogSVNhbVNlc3Npb24pOiB2b2lkIHtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICB9XG5cbiAgLyoqIFRlc3Qgc2VhbTogaG93IHNlc3Npb25zIGFyZSBjcmVhdGVkIChkZWZhdWx0OiBsYXp5IG9ubnhydW50aW1lLXdlYikuICovXG4gIHVzZVNlc3Npb25GYWN0b3J5KGZhY3Rvcnk6IFNhbVNlc3Npb25GYWN0b3J5KTogdm9pZCB7XG4gICAgdGhpcy5jcmVhdGVTZXNzaW9uID0gZmFjdG9yeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbG9hZGVkIHNlc3Npb24gZm9yIHRoZSBjdXJyZW50IG1vZGVsLCBsb2FkaW5nIGl0IGlmIG5lZWRlZC5cbiAgICogYG9uUHJvZ3Jlc3NgIHJlY2VpdmVzIHRoZSBkb3dubG9hZCBmcmFjdGlvbiB3aGlsZSB0aGlzIGNhbGwgd2FpdHMuXG4gICAqL1xuICBhc3luYyBlbnN1cmVTZXNzaW9uKG9uUHJvZ3Jlc3M/OiAoZnJhY3Rpb246IG51bWJlcikgPT4gdm9pZCk6IFByb21pc2U8SVNhbVNlc3Npb24+IHtcbiAgICBpZiAodGhpcy5kZXN0cm95ZWQpIHRocm93IG5ldyBFcnJvcignVGhlIFNBTSBzZXNzaW9uIHdhcyBkaXNwb3NlZCB3aXRoIGl0cyB2aWV3ZXIuJyk7XG4gICAgaWYgKHRoaXMuc2Vzc2lvbikgcmV0dXJuIHRoaXMuc2Vzc2lvbjtcbiAgICBpZiAoIWlzU2FtTW9kZWxSZWFkeSh0aGlzLm1vZGVsKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgU0FNIG1vZGVsIFwiJHt0aGlzLm1vZGVsLmlkfVwiIGlzIG5vdCBjb25maWd1cmVkIHlldCAobm8gT05OWCBVUkxzKS4gYCArXG4gICAgICAgICAgJ0hvc3QgaXQgYW5kIGNhbGwgc2V0U2FtTW9kZWxVcmxzKCksIHRoZW4gcmV0cnkuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChvblByb2dyZXNzKSB7XG4gICAgICB0aGlzLnByb2dyZXNzTGlzdGVuZXJzLmFkZChvblByb2dyZXNzKTtcbiAgICAgIG9uUHJvZ3Jlc3MoMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgKHRoaXMubG9hZGluZyA/Pz0gdGhpcy5sb2FkKCkpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFN1cGVyc2VkZWRMb2FkKSByZXR1cm4gdGhpcy5lbnN1cmVTZXNzaW9uKG9uUHJvZ3Jlc3MpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAob25Qcm9ncmVzcykgdGhpcy5wcm9ncmVzc0xpc3RlbmVycy5kZWxldGUob25Qcm9ncmVzcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBlbmNvZGVyIGVtYmVkZGluZyBvZiBhIGNhY2hlZCBmcmFtZSwgcmV1c2VkIHdoaWxlIGBrZXlgICh0aGUgaW1hZ2Unc1xuICAgKiBpZGVudGl0eTogZmlsZSwgZnJhbWUsIHJlYWRiYWNrIGZyYW1lKSBhbmQgdGhlIG1vZGVsIGFyZSB1bmNoYW5nZWQuXG4gICAqIGBvbkVuY29kZWAgaXMgY2FsbGVkIG9ubHkgd2hlbiB0aGUgZW5jb2RlciBhY3R1YWxseSBydW5zLlxuICAgKi9cbiAgYXN5bmMgZW1iZWQoXG4gICAgc2Vzc2lvbjogSVNhbVNlc3Npb24sXG4gICAgY2FjaGVkOiBDYWNoZWRJbWFnZURhdGEsXG4gICAgZnJhbWVJbmRleDogbnVtYmVyLFxuICAgIGtleTogc3RyaW5nLFxuICAgIG9uRW5jb2RlPzogKCkgPT4gdm9pZCxcbiAgKTogUHJvbWlzZTxTYW1FbWJlZGRpbmc+IHtcbiAgICBjb25zdCBmdWxsS2V5ID0gYCR7a2V5fXwke3RoaXMubW9kZWwuaWR9YDtcbiAgICBpZiAodGhpcy5lbWJlZGRpbmcgJiYgdGhpcy5lbWJlZGRpbmdLZXkgPT09IGZ1bGxLZXkpIHJldHVybiB0aGlzLmVtYmVkZGluZztcbiAgICBvbkVuY29kZT8uKCk7XG4gICAgY29uc3QgZ2VuZXJhdGlvbiA9IHRoaXMuZ2VuZXJhdGlvbjtcbiAgICBjb25zdCBlbWJlZGRpbmcgPSBhd2FpdCBzZXNzaW9uLmVtYmVkKHtcbiAgICAgIGRhdGE6IGZyYW1lVG9SZ2JhKGNhY2hlZCwgZnJhbWVJbmRleCksXG4gICAgICB3aWR0aDogY2FjaGVkLndpZHRoLFxuICAgICAgaGVpZ2h0OiBjYWNoZWQuaGVpZ2h0LFxuICAgIH0pO1xuICAgIGlmIChnZW5lcmF0aW9uID09PSB0aGlzLmdlbmVyYXRpb24pIHtcbiAgICAgIHRoaXMuZW1iZWRkaW5nID0gZW1iZWRkaW5nO1xuICAgICAgdGhpcy5lbWJlZGRpbmdLZXkgPSBmdWxsS2V5O1xuICAgIH1cbiAgICByZXR1cm4gZW1iZWRkaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2UgdGhlIHNlc3Npb24gKGFuZCBpdHMgV29ya2VyKSwgZHJvcCB0aGUgZW1iZWRkaW5nIGFuZCBkaXNjYXJkIGFuXG4gICAqIGluLWZsaWdodCBsb2FkLiBBbmd1bGFyIGNhbGxzIHRoaXMgd2hlbiB0aGUgaW5qZWN0b3IgcHJvdmlkaW5nIHRoZSBzZXJ2aWNlXG4gICAqIGlzIGRlc3Ryb3llZDogdGhlIGFwcCBmb3IgdGhlIHJvb3QgaW5zdGFuY2UsIG9yIGEgdmlld2VyIGNvbXBvbmVudCB0aGF0XG4gICAqIHByb3ZpZGVzIGl0cyBvd24uXG4gICAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3llZCA9IHRydWU7XG4gICAgdGhpcy5nZW5lcmF0aW9uKys7IC8vIGFuIGluLWZsaWdodCBsb2FkIGRpc3Bvc2VzIGl0cyBzZXNzaW9uIHdoZW4gaXQgbGFuZHNcbiAgICB0aGlzLmxvYWRpbmcgPSBudWxsO1xuICAgIHRoaXMuaW52YWxpZGF0ZUVtYmVkZGluZygpO1xuICAgIHRoaXMuc2Vzc2lvbj8uZGlzcG9zZSgpO1xuICAgIHRoaXMuc2Vzc2lvbiA9IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGxvYWQoKTogUHJvbWlzZTxJU2FtU2Vzc2lvbj4ge1xuICAgIGNvbnN0IGdlbmVyYXRpb24gPSB0aGlzLmdlbmVyYXRpb247XG4gICAgY29uc3QgbW9kZWwgPSB0aGlzLm1vZGVsO1xuICAgIGNvbnN0IGxvYWQgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IHRoaXMuY3JlYXRlU2Vzc2lvbigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc2Vzc2lvbi5sb2FkTW9kZWwobW9kZWwsIChmKSA9PiB0aGlzLnByb2dyZXNzTGlzdGVuZXJzLmZvckVhY2goKGwpID0+IGwoZikpKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBzZXNzaW9uLmRpc3Bvc2UoKTsgLy8gZG9uJ3QgbGVhayB0aGUgaGFsZi1idWlsdCBzZXNzaW9uIC8gV29ya2VyXG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIGlmIChnZW5lcmF0aW9uICE9PSB0aGlzLmdlbmVyYXRpb24pIHtcbiAgICAgICAgc2Vzc2lvbi5kaXNwb3NlKCk7IC8vIHRoZSB1c2VyIHBpY2tlZCBhbm90aGVyIG1vZGVsIG1lYW53aGlsZVxuICAgICAgICB0aHJvdyBuZXcgU3VwZXJzZWRlZExvYWQoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247XG4gICAgICByZXR1cm4gc2Vzc2lvbjtcbiAgICB9KSgpO1xuICAgIGxvYWRcbiAgICAgIC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpXG4gICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmxvYWRpbmcgPT09IGxvYWQpIHRoaXMubG9hZGluZyA9IG51bGw7XG4gICAgICB9KTtcbiAgICByZXR1cm4gbG9hZDtcbiAgfVxufVxuIl19
|
|
@@ -1,188 +1,133 @@
|
|
|
1
1
|
import { Injectable } from '@angular/core';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
2
|
+
import { SamSessionService } from './sam-session.service';
|
|
3
|
+
import { Region, Rectangle } from '../../models/region';
|
|
4
|
+
import { makePolygon } from '../../models/polygon-factory';
|
|
5
|
+
import { maskToPolygons } from '../../geometry/contour';
|
|
6
|
+
import { MatrixFrame } from '../tool-kit/matrix-frame';
|
|
7
|
+
import { AsyncToolStatus } from '../tool-kit/async-tool-status';
|
|
8
|
+
import { withoutRegions } from './segmentation-commit';
|
|
7
9
|
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "
|
|
10
|
+
import * as i1 from "./sam-session.service";
|
|
9
11
|
/**
|
|
10
12
|
* Box-prompted SAM segmentation tool (jit-ui#90, P0). On `segmentBoxes()` it
|
|
11
13
|
* reads every rectangle region, runs the (cached) encoder once for the image,
|
|
12
|
-
* then runs the decoder per box, traces each mask to a polygon
|
|
13
|
-
*
|
|
14
|
+
* then runs the decoder per box, traces each mask to a polygon and replaces
|
|
15
|
+
* the prompt rectangles with the masks.
|
|
14
16
|
*
|
|
15
|
-
* Inference
|
|
16
|
-
*
|
|
17
|
-
*
|
|
17
|
+
* Inference goes through the shared {@link SamSessionService} (one session and
|
|
18
|
+
* embedding for both SAM tools); tests inject a fake session via
|
|
19
|
+
* {@link useSession}.
|
|
18
20
|
*/
|
|
19
21
|
export class SamToolService {
|
|
20
|
-
constructor(
|
|
21
|
-
this.
|
|
22
|
-
this.
|
|
23
|
-
this.model = getSamModel();
|
|
24
|
-
/** Cached encoder embedding + the key (image identity) it was computed for. */
|
|
25
|
-
this.embedding = null;
|
|
26
|
-
this.embeddingKey = null;
|
|
22
|
+
constructor(sessions = new SamSessionService()) {
|
|
23
|
+
this.sessions = sessions;
|
|
24
|
+
this.state = new AsyncToolStatus();
|
|
27
25
|
/** Status text + busy flag for a spinner / toast in the host. */
|
|
28
|
-
this.status$ =
|
|
29
|
-
this.busy$ =
|
|
26
|
+
this.status$ = this.state.status$;
|
|
27
|
+
this.busy$ = this.state.busy$;
|
|
30
28
|
/** Encoder-download progress: -1 = not downloading, 0..1 = downloading. */
|
|
31
|
-
this.progress$ =
|
|
29
|
+
this.progress$ = this.state.progress$;
|
|
32
30
|
}
|
|
33
|
-
/**
|
|
34
|
-
bindHost(host) {
|
|
35
|
-
this.host = host;
|
|
36
|
-
}
|
|
37
|
-
/** Choose the registered model to use; invalidates any cached embedding. */
|
|
31
|
+
/** Choose the registered model to use (shared with the point tool). */
|
|
38
32
|
setModel(id) {
|
|
39
|
-
|
|
40
|
-
if (next.id === this.model.id)
|
|
41
|
-
return;
|
|
42
|
-
this.model = next;
|
|
43
|
-
this.invalidateEmbedding();
|
|
44
|
-
// Drop the loaded session so the next run reloads the newly-picked model's
|
|
45
|
-
// ONNX pair — ensureSession() returns the cached session as-is, so without
|
|
46
|
-
// this a model switch would keep running the previous model.
|
|
47
|
-
this.session?.dispose();
|
|
48
|
-
this.session = null;
|
|
33
|
+
this.sessions.setModel(id);
|
|
49
34
|
}
|
|
50
35
|
/** Drop the cached embedding (e.g. after the image/slice changes). */
|
|
51
36
|
invalidateEmbedding() {
|
|
52
|
-
this.
|
|
53
|
-
this.embeddingKey = null;
|
|
37
|
+
this.sessions.invalidateEmbedding();
|
|
54
38
|
}
|
|
55
39
|
/** Test seam: inject a fake/alternate inference session. */
|
|
56
40
|
useSession(session) {
|
|
57
|
-
this.session
|
|
41
|
+
this.sessions.useSession(session);
|
|
58
42
|
}
|
|
59
43
|
/**
|
|
60
|
-
* Segment every rectangle region
|
|
61
|
-
*
|
|
44
|
+
* Segment every rectangle region of the backend behind `host` with a box
|
|
45
|
+
* prompt and replace each prompt that produced a mask with the mask's polygon
|
|
46
|
+
* region. Returns how many regions were added; 0 (ignored) while a previous
|
|
47
|
+
* run is still going. The host is passed per run, so no backend's host
|
|
48
|
+
* outlives its call.
|
|
62
49
|
*/
|
|
63
|
-
async segmentBoxes() {
|
|
64
|
-
if (
|
|
65
|
-
return 0;
|
|
66
|
-
// Re-entrancy guard: a second Segment press while the first run is still
|
|
67
|
-
// downloading/encoding would launch a concurrent model download + GPU
|
|
68
|
-
// encode (and can freeze the tab on a heavy WebGPU ViT-B). Ignore it.
|
|
69
|
-
if (this.busy$.value)
|
|
50
|
+
async segmentBoxes(host) {
|
|
51
|
+
if (this.state.busy)
|
|
70
52
|
return 0;
|
|
71
|
-
const cached =
|
|
53
|
+
const cached = host.getCachedImageData();
|
|
72
54
|
if (!cached || cached.frames.length === 0) {
|
|
73
55
|
this.status$.next('No image loaded.');
|
|
74
56
|
return 0;
|
|
75
57
|
}
|
|
76
|
-
const
|
|
77
|
-
const rects = regions.filter((r) => r.bounds instanceof Rectangle);
|
|
58
|
+
const rects = host.getRegions().filter((r) => r.bounds instanceof Rectangle);
|
|
78
59
|
if (rects.length === 0) {
|
|
79
60
|
this.status$.next('Draw one or more rectangles, then press Segment.');
|
|
80
61
|
return 0;
|
|
81
62
|
}
|
|
82
|
-
const
|
|
83
|
-
const
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
session
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
this.busy$.next(false);
|
|
92
|
-
this.status$.next(err instanceof Error ? err.message : 'SAM model unavailable.');
|
|
93
|
-
return 0;
|
|
94
|
-
}
|
|
95
|
-
this.busy$.next(true);
|
|
96
|
-
try {
|
|
97
|
-
// Encode once per image; reuse the embedding across all boxes.
|
|
98
|
-
const key = [
|
|
99
|
-
this.host.getFileName() ?? '',
|
|
100
|
-
this.host.getActiveFrameIndex(),
|
|
101
|
-
`${cached.width}x${cached.height}`,
|
|
102
|
-
`${ox},${oy},${rx}`,
|
|
103
|
-
this.model.id,
|
|
104
|
-
].join('|');
|
|
105
|
-
if (!this.embedding || this.embeddingKey !== key) {
|
|
106
|
-
this.status$.next('Encoding image…');
|
|
107
|
-
const rgba = frameToRgba(cached, this.host.getActiveFrameIndex());
|
|
108
|
-
this.embedding = await session.embed({ data: rgba, width: cached.width, height: cached.height });
|
|
109
|
-
this.embeddingKey = key;
|
|
63
|
+
const frame = MatrixFrame.from(cached);
|
|
64
|
+
const frameIdx = host.getActiveFrameIndex();
|
|
65
|
+
// Busy from here on — including the model download, so a second press
|
|
66
|
+
// can't start a second download/encode (which can freeze the tab on a heavy
|
|
67
|
+
// WebGPU ViT-B).
|
|
68
|
+
const added = await this.state.run(async () => {
|
|
69
|
+
let session;
|
|
70
|
+
try {
|
|
71
|
+
session = await this.sessions.ensureSession((f) => this.progress$.next(f));
|
|
110
72
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
for (let i = 0; i < rects.length; i++) {
|
|
115
|
-
this.status$.next(`Segmenting ${i + 1}/${rects.length}…`);
|
|
116
|
-
const b = rects[i].bounds;
|
|
117
|
-
// Rectangle is in data coords → convert to image (matrix) coords.
|
|
118
|
-
const box = {
|
|
119
|
-
x0: (b.x - ox) / rx,
|
|
120
|
-
y0: (b.y - oy) / ry,
|
|
121
|
-
x1: (b.x + b.width - ox) / rx,
|
|
122
|
-
y1: (b.y + b.height - oy) / ry,
|
|
123
|
-
};
|
|
124
|
-
const res = await session.decode(this.embedding, { box });
|
|
125
|
-
const polys = this.wandService.maskToPolygons(res.mask, res.width, res.height, cached.width, cached.height, 0, 0);
|
|
126
|
-
if (polys.length === 0)
|
|
127
|
-
continue;
|
|
128
|
-
// Keep the largest connected piece (maskToPolygons returns largest-first).
|
|
129
|
-
const poly = polys[0];
|
|
130
|
-
masks.push(this.makeRegion(poly.xpoints.map((x) => ox + x * rx), poly.ypoints.map((y) => oy + y * ry), rects[i].color));
|
|
131
|
-
consumed.add(rects[i]); // this rectangle is now represented by its mask
|
|
132
|
-
added++;
|
|
73
|
+
catch (err) {
|
|
74
|
+
this.status$.next(err instanceof Error ? err.message : 'SAM model unavailable.');
|
|
75
|
+
return 0;
|
|
133
76
|
}
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
// Lazy-import so onnxruntime-web is never pulled into unit tests / the
|
|
173
|
-
// initial bundle — only when segmentation actually runs.
|
|
174
|
-
const { OnnxSamSession } = await import('./onnx-sam-session');
|
|
175
|
-
const session = new OnnxSamSession();
|
|
176
|
-
this.progress$.next(0);
|
|
177
|
-
await session.loadModel(this.model, (f) => this.progress$.next(f));
|
|
178
|
-
this.session = session;
|
|
179
|
-
return session;
|
|
77
|
+
try {
|
|
78
|
+
// Encode once per image; reuse the embedding across all boxes.
|
|
79
|
+
const key = [host.getFileName() ?? '', frameIdx, `${cached.width}x${cached.height}`, frame.sig].join('|');
|
|
80
|
+
const embedding = await this.sessions.embed(session, cached, frameIdx, key, () => this.status$.next('Encoding image…'));
|
|
81
|
+
const masks = [];
|
|
82
|
+
const consumed = []; // prompt rectangles that produced a mask
|
|
83
|
+
for (let i = 0; i < rects.length; i++) {
|
|
84
|
+
this.status$.next(`Segmenting ${i + 1}/${rects.length}…`);
|
|
85
|
+
const b = rects[i].bounds;
|
|
86
|
+
// Rectangle is in data coords → convert to image (matrix) coords.
|
|
87
|
+
const box = {
|
|
88
|
+
x0: frame.toMatrixX(b.x),
|
|
89
|
+
y0: frame.toMatrixY(b.y),
|
|
90
|
+
x1: frame.toMatrixX(b.x + b.width),
|
|
91
|
+
y1: frame.toMatrixY(b.y + b.height),
|
|
92
|
+
};
|
|
93
|
+
const res = await session.decode(embedding, { box });
|
|
94
|
+
// Keep the largest connected piece (maskToPolygons returns largest-first).
|
|
95
|
+
const poly = maskToPolygons(res.mask, res.width, res.height, 0, 0)[0];
|
|
96
|
+
if (!poly)
|
|
97
|
+
continue;
|
|
98
|
+
// Inherit the prompt rectangle's colour.
|
|
99
|
+
masks.push(makeSamRegion(poly, frame, rects[i].color || host.getShapeColor()));
|
|
100
|
+
consumed.push(rects[i]);
|
|
101
|
+
}
|
|
102
|
+
// Commit against the regions as they are NOW: the user may have drawn,
|
|
103
|
+
// edited or deleted regions during the (possibly minutes-long) run.
|
|
104
|
+
// Prompts that produced a mask are replaced; the rest stay for a retry.
|
|
105
|
+
host.setRegions(withoutRegions(host.getRegions(), consumed).concat(masks));
|
|
106
|
+
this.status$.next(masks.length > 0 ? `Added ${masks.length} region(s).` : 'No masks found.');
|
|
107
|
+
return masks.length;
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
this.status$.next(err instanceof Error ? err.message : 'Segmentation failed.');
|
|
111
|
+
return 0;
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
return added ?? 0;
|
|
180
115
|
}
|
|
181
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SamToolService, deps: [{ token: i1.
|
|
116
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SamToolService, deps: [{ token: i1.SamSessionService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
182
117
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SamToolService, providedIn: 'root' }); }
|
|
183
118
|
}
|
|
184
119
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SamToolService, decorators: [{
|
|
185
120
|
type: Injectable,
|
|
186
121
|
args: [{ providedIn: 'root' }]
|
|
187
|
-
}], ctorParameters: () => [{ type: i1.
|
|
188
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FtLXRvb2wuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXRvb2wuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdkMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVwRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7O0FBTWpFOzs7Ozs7Ozs7R0FTRztBQUVILE1BQU0sT0FBTyxjQUFjO0lBZXpCLFlBQW9CLFdBQXdCO1FBQXhCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBYnBDLFlBQU8sR0FBdUIsSUFBSSxDQUFDO1FBQ25DLFVBQUssR0FBZ0IsV0FBVyxFQUFFLENBQUM7UUFFM0MsK0VBQStFO1FBQ3ZFLGNBQVMsR0FBd0IsSUFBSSxDQUFDO1FBQ3RDLGlCQUFZLEdBQWtCLElBQUksQ0FBQztRQUUzQyxpRUFBaUU7UUFDeEQsWUFBTyxHQUFHLElBQUksZUFBZSxDQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQzFDLFVBQUssR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUNyRCwyRUFBMkU7UUFDbEUsY0FBUyxHQUFHLElBQUksZUFBZSxDQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFTixDQUFDO0lBRWhELGdGQUFnRjtJQUNoRixRQUFRLENBQUMsSUFBaUI7UUFDeEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENB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Q0FBQyxFQUFFLDBDQUEwQztnQkFDckUsaURBQWlELENBQ2xELENBQUM7UUFDSixDQUFDO1FBQ0QsdUVBQXVFO1FBQ3ZFLHlEQUF5RDtRQUN6RCxNQUFNLEVBQUUsY0FBYyxFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUM5RCxNQUFNLE9BQU8sR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLE1BQU0sT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7OEdBakxVLGNBQWM7a0hBQWQsY0FBYyxjQURELE1BQU07OzJGQUNuQixjQUFjO2tCQUQxQixVQUFVO21CQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBXYW5kU2VydmljZSB9IGZyb20gJy4uL3dhbmQvd2FuZC5zZXJ2aWNlJztcbmltcG9ydCB7IFdhbmRUb29sSG9zdCB9IGZyb20gJy4uL3dhbmQvd2FuZC10b29sLnNlcnZpY2UnO1xuaW1wb3J0IHsgZnJhbWVUb1JnYmEgfSBmcm9tICcuL3NhbS1wcm9tcHQnO1xuaW1wb3J0IHsgZ2V0U2FtTW9kZWwsIGlzU2FtTW9kZWxSZWFkeSB9IGZyb20gJy4vc2FtLW1vZGVsLXJlZ2lzdHJ5JztcbmltcG9ydCB7IElTYW1TZXNzaW9uLCBTYW1FbWJlZGRpbmcsIFNhbU1vZGVsRGVmIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3NhbS5jb250cmFjdCc7XG5pbXBvcnQgeyBSZWdpb24sIFBvbHlnb24sIFJlY3RhbmdsZSB9IGZyb20gJy4uLy4uL21vZGVscy9yZWdpb24nO1xuXG4vKiogVGhlIFNBTSB0b29sIGJpbmRzIHRvIHRoZSBzYW1lIGhvc3QgdGhlIHdhbmQvYnJ1c2ggdXNlLCBzbyBlYWNoIGJhY2tlbmRcbiAqICByZXVzZXMgaXRzIGV4aXN0aW5nIHBpeGVsIHJlYWRiYWNrICsgY29vcmRpbmF0ZSB0cmFuc2Zvcm0gKyByZWdpb24gc3RvcmUuICovXG5leHBvcnQgdHlwZSBTYW1Ub29sSG9zdCA9IFdhbmRUb29sSG9zdDtcblxuLyoqXG4gKiBCb3gtcHJvbXB0ZWQgU0FNIHNlZ21lbnRhdGlvbiB0b29sIChqaXQtdWkjOTAsIFAwKS4gT24gYHNlZ21lbnRCb3hlcygpYCBpdFxuICogcmVhZHMgZXZlcnkgcmVjdGFuZ2xlIHJlZ2lvbiwgcnVucyB0aGUgKGNhY2hlZCkgZW5jb2RlciBvbmNlIGZvciB0aGUgaW1hZ2UsXG4gKiB0aGVuIHJ1bnMgdGhlIGRlY29kZXIgcGVyIGJveCwgdHJhY2VzIGVhY2ggbWFzayB0byBhIHBvbHlnb24gKHJldXNpbmdcbiAqIFdhbmRTZXJ2aWNlLm1hc2tUb1BvbHlnb25zKSBhbmQgY29tbWl0cyB0aGVtIGFzIHJlZ2lvbnMuXG4gKlxuICogSW5mZXJlbmNlIGlzIGFic3RyYWN0ZWQgYmVoaW5kIHtAbGluayBJU2FtU2Vzc2lvbn06IHByb2R1Y3Rpb24gdXNlcyB0aGVcbiAqIG9ubnhydW50aW1lLXdlYiBzZXNzaW9uIChsYXp5LWltcG9ydGVkIHNvIE9SVCBuZXZlciBsb2FkcyBpbiB1bml0IHRlc3RzKTtcbiAqIHRlc3RzIGluamVjdCBhIGZha2UgdmlhIHtAbGluayB1c2VTZXNzaW9ufS5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBTYW1Ub29sU2VydmljZSB7XG4gIHByaXZhdGUgaG9zdCE6IFNhbVRvb2xIb3N0O1xuICBwcml2YXRlIHNlc3Npb246IElTYW1TZXNzaW9uIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbW9kZWw6IFNhbU1vZGVsRGVmID0gZ2V0U2FtTW9kZWwoKTtcblxuICAvKiogQ2FjaGVkIGVuY29kZXIgZW1iZWRkaW5nICsgdGhlIGtleSAoaW1hZ2UgaWRlbnRpdHkpIGl0IHdhcyBjb21wdXRlZCBmb3IuICovXG4gIHByaXZhdGUgZW1iZWRkaW5nOiBTYW1FbWJlZGRpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBlbWJlZGRpbmdLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBTdGF0dXMgdGV4dCArIGJ1c3kgZmxhZyBmb3IgYSBzcGlubmVyIC8gdG9hc3QgaW4gdGhlIGhvc3QuICovXG4gIHJlYWRvbmx5IHN0YXR1cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4oJycpO1xuICByZWFkb25seSBidXN5JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKiogRW5jb2Rlci1kb3dubG9hZCBwcm9ncmVzczogLTEgPSBub3QgZG93bmxvYWRpbmcsIDAuLjEgPSBkb3dubG9hZGluZy4gKi9cbiAgcmVhZG9ubHkgcHJvZ3Jlc3MkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KC0xKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHdhbmRTZXJ2aWNlOiBXYW5kU2VydmljZSkge31cblxuICAvKiogQmluZCB0byB0aGUgYWN0aXZlIGJhY2tlbmQncyBob3N0IChjYWxsZWQgYnkgdGhlIGJhY2tlbmQsIGxpa2UgdGhlIHdhbmQpLiAqL1xuICBiaW5kSG9zdChob3N0OiBTYW1Ub29sSG9zdCk6IHZvaWQge1xuICAgIHRoaXMuaG9zdCA9IGhvc3Q7XG4gIH1cblxuICAvKiogQ2hvb3NlIHRoZSByZWdpc3RlcmVkIG1vZGVsIHRvIHVzZTsgaW52YWxpZGF0ZXMgYW55IGNhY2hlZCBlbWJlZGRpbmcuICovXG4gIHNldE1vZGVsKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBuZXh0ID0gZ2V0U2FtTW9kZWwoaWQpO1xuICAgIGlmIChuZXh0LmlkID09PSB0aGlzLm1vZGVsLmlkKSByZXR1cm47XG4gICAgdGhpcy5tb2RlbCA9IG5leHQ7XG4gICAgdGhpcy5pbnZhbGlkYXRlRW1iZWRkaW5nKCk7XG4gICAgLy8gRHJvcCB0aGUgbG9hZGVkIHNlc3Npb24gc28gdGhlIG5leHQgcnVuIHJlbG9hZHMgdGhlIG5ld2x5LXBpY2tlZCBtb2RlbCdzXG4gICAgLy8gT05OWCBwYWlyIOKAlCBlbnN1cmVTZXNzaW9uKCkgcmV0dXJucyB0aGUgY2FjaGVkIHNlc3Npb24gYXMtaXMsIHNvIHdpdGhvdXRcbiAgICAvLyB0aGlzIGEgbW9kZWwgc3dpdGNoIHdvdWxkIGtlZXAgcnVubmluZyB0aGUgcHJldmlvdXMgbW9kZWwuXG4gICAgdGhpcy5zZXNzaW9uPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5zZXNzaW9uID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBEcm9wIHRoZSBjYWNoZWQgZW1iZWRkaW5nIChlLmcuIGFmdGVyIHRoZSBpbWFnZS9zbGljZSBjaGFuZ2VzKS4gKi9cbiAgaW52YWxpZGF0ZUVtYmVkZGluZygpOiB2b2lkIHtcbiAgICB0aGlzLmVtYmVkZGluZyA9IG51bGw7XG4gICAgdGhpcy5lbWJlZGRpbmdLZXkgPSBudWxsO1xuICB9XG5cbiAgLyoqIFRlc3Qgc2VhbTogaW5qZWN0IGEgZmFrZS9hbHRlcm5hdGUgaW5mZXJlbmNlIHNlc3Npb24uICovXG4gIHVzZVNlc3Npb24oc2Vzc2lvbjogSVNhbVNlc3Npb24pOiB2b2lkIHtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlZ21lbnQgZXZlcnkgcmVjdGFuZ2xlIHJlZ2lvbiB3aXRoIGEgYm94IHByb21wdCBhbmQgYXBwZW5kIHRoZSByZXN1bHRpbmdcbiAgICogbWFza3MgYXMgbmV3IHBvbHlnb24gcmVnaW9ucy4gUmV0dXJucyBob3cgbWFueSByZWdpb25zIHdlcmUgYWRkZWQuXG4gICAqL1xuICBhc3luYyBzZWdtZW50Qm94ZXMoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAoIXRoaXMuaG9zdCkgcmV0dXJuIDA7XG4gICAgLy8gUmUtZW50cmFuY3kgZ3VhcmQ6IGEgc2Vjb25kIFNlZ21lbnQgcHJlc3Mgd2hpbGUgdGhlIGZpcnN0IHJ1biBpcyBzdGlsbFxuICAgIC8vIGRvd25sb2FkaW5nL2VuY29kaW5nIHdvdWxkIGxhdW5jaCBhIGNvbmN1cnJlbnQgbW9kZWwgZG93bmxvYWQgKyBHUFVcbiAgICAvLyBlbmNvZGUgKGFuZCBjYW4gZnJlZXplIHRoZSB0YWIgb24gYSBoZWF2eSBXZWJHUFUgVmlULUIpLiBJZ25vcmUgaXQuXG4gICAgaWYgKHRoaXMuYnVzeSQudmFsdWUpIHJldHVybiAwO1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMuaG9zdC5nZXRDYWNoZWRJbWFnZURhdGEoKTtcbiAgICBpZiAoIWNhY2hlZCB8fCBjYWNoZWQuZnJhbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5zdGF0dXMkLm5leHQoJ05vIGltYWdlIGxvYWRlZC4nKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IHJlZ2lvbnMgPSB0aGlzLmhvc3QuZ2V0UmVnaW9ucygpO1xuICAgIGNvbnN0IHJlY3RzID0gcmVnaW9ucy5maWx0ZXIoKHIpID0+IHIuYm91bmRzIGluc3RhbmNlb2YgUmVjdGFuZ2xlKTtcbiAgICBpZiAocmVjdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLnN0YXR1cyQubmV4dCgnRHJhdyBvbmUgb3IgbW9yZSByZWN0YW5nbGVzLCB0aGVuIHByZXNzIFNlZ21lbnQuJyk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCByeCA9IGNhY2hlZC5yYXRpb3NbMF0gfHwgMTtcbiAgICBjb25zdCByeSA9IGNhY2hlZC5yYXRpb3NbMF0gfHwgMTtcbiAgICBjb25zdCBveCA9IGNhY2hlZC5vcmlnaW5YID8/IDA7XG4gICAgY29uc3Qgb3kgPSBjYWNoZWQub3JpZ2luWSA/PyAwO1xuXG4gICAgbGV0IHNlc3Npb246IElTYW1TZXNzaW9uO1xuICAgIHRyeSB7XG4gICAgICBzZXNzaW9uID0gYXdhaXQgdGhpcy5lbnN1cmVTZXNzaW9uKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmJ1c3kkLm5leHQoZmFsc2UpO1xuICAgICAgdGhpcy5zdGF0dXMkLm5leHQoZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6ICdTQU0gbW9kZWwgdW5hdmFpbGFibGUuJyk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICB0aGlzLmJ1c3kkLm5leHQodHJ1ZSk7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuY29kZSBvbmNlIHBlciBpbWFnZTsgcmV1c2UgdGhlIGVtYmVkZGluZyBhY3Jvc3MgYWxsIGJveGVzLlxuICAgICAgY29uc3Qga2V5ID0gW1xuICAgICAgICB0aGlzLmhvc3QuZ2V0RmlsZU5hbWUoKSA/PyAnJyxcbiAgICAgICAgdGhpcy5ob3N0LmdldEFjdGl2ZUZyYW1lSW5kZXgoKSxcbiAgICAgICAgYCR7Y2FjaGVkLndpZHRofXgke2NhY2hlZC5oZWlnaHR9YCxcbiAgICAgICAgYCR7b3h9LCR7b3l9LCR7cnh9YCxcbiAgICAgICAgdGhpcy5tb2RlbC5pZCxcbiAgICAgIF0uam9pbignfCcpO1xuICAgICAgaWYgKCF0aGlzLmVtYmVkZGluZyB8fCB0aGlzLmVtYmVkZGluZ0tleSAhPT0ga2V5KSB7XG4gICAgICAgIHRoaXMuc3RhdHVzJC5uZXh0KCdFbmNvZGluZyBpbWFnZeKApicpO1xuICAgICAgICBjb25zdCByZ2JhID0gZnJhbWVUb1JnYmEoY2FjaGVkLCB0aGlzLmhvc3QuZ2V0QWN0aXZlRnJhbWVJbmRleCgpKTtcbiAgICAgICAgdGhpcy5lbWJlZGRpbmcgPSBhd2FpdCBzZXNzaW9uLmVtYmVkKHsgZGF0YTogcmdiYSwgd2lkdGg6IGNhY2hlZC53aWR0aCwgaGVpZ2h0OiBjYWNoZWQuaGVpZ2h0IH0pO1xuICAgICAgICB0aGlzLmVtYmVkZGluZ0tleSA9IGtleTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWFza3M6IFJlZ2lvbltdID0gW107XG4gICAgICBjb25zdCBjb25zdW1lZCA9IG5ldyBTZXQ8UmVnaW9uPigpOyAvLyBwcm9tcHQgcmVjdGFuZ2xlcyB0aGF0IHByb2R1Y2VkIGEgbWFza1xuICAgICAgbGV0IGFkZGVkID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5zdGF0dXMkLm5leHQoYFNlZ21lbnRpbmcgJHtpICsgMX0vJHtyZWN0cy5sZW5ndGh94oCmYCk7XG4gICAgICAgIGNvbnN0IGIgPSByZWN0c1tpXS5ib3VuZHMgYXMgUmVjdGFuZ2xlO1xuICAgICAgICAvLyBSZWN0YW5nbGUgaXMgaW4gZGF0YSBjb29yZHMg4oaSIGNvbnZlcnQgdG8gaW1hZ2UgKG1hdHJpeCkgY29vcmRzLlxuICAgICAgICBjb25zdCBib3ggPSB7XG4gICAgICAgICAgeDA6IChiLnggLSBveCkgLyByeCxcbiAgICAgICAgICB5MDogKGIueSAtIG95KSAvIHJ5LFxuICAgICAgICAgIHgxOiAoYi54ICsgYi53aWR0aCAtIG94KSAvIHJ4LFxuICAgICAgICAgIHkxOiAoYi55ICsgYi5oZWlnaHQgLSBveSkgLyByeSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2Vzc2lvbi5kZWNvZGUodGhpcy5lbWJlZGRpbmcsIHsgYm94IH0pO1xuICAgICAgICBjb25zdCBwb2x5cyA9IHRoaXMud2FuZFNlcnZpY2UubWFza1RvUG9seWdvbnMoXG4gICAgICAgICAgcmVzLm1hc2ssIHJlcy53aWR0aCwgcmVzLmhlaWdodCwgY2FjaGVkLndpZHRoLCBjYWNoZWQuaGVpZ2h0LCAwLCAwLFxuICAgICAgICApO1xuICAgICAgICBpZiAocG9seXMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgLy8gS2VlcCB0aGUgbGFyZ2VzdCBjb25uZWN0ZWQgcGllY2UgKG1hc2tUb1BvbHlnb25zIHJldHVybnMgbGFyZ2VzdC1maXJzdCkuXG4gICAgICAgIGNvbnN0IHBvbHkgPSBwb2x5c1swXTtcbiAgICAgICAgbWFza3MucHVzaCh0aGlzLm1ha2VSZWdpb24oXG4gICAgICAgICAgcG9seS54cG9pbnRzLm1hcCgoeCkgPT4gb3ggKyB4ICogcngpLFxuICAgICAgICAgIHBvbHkueXBvaW50cy5tYXAoKHkpID0+IG95ICsgeSAqIHJ5KSxcbiAgICAgICAgICByZWN0c1tpXS5jb2xvciwgLy8gaW5oZXJpdCB0aGUgcHJvbXB0IHJlY3RhbmdsZSdzIGNvbG9yXG4gICAgICAgICkpO1xuICAgICAgICBjb25zdW1lZC5hZGQocmVjdHNbaV0pOyAvLyB0aGlzIHJlY3RhbmdsZSBpcyBub3cgcmVwcmVzZW50ZWQgYnkgaXRzIG1hc2tcbiAgICAgICAgYWRkZWQrKztcbiAgICAgIH1cblxuICAgICAgLy8gUmVwbGFjZSBlYWNoIHNlZ21lbnRlZCBwcm9tcHQgcmVjdGFuZ2xlIHdpdGggaXRzIG1hc2sgcmVnaW9uOyBrZWVwIGFueVxuICAgICAgLy8gcmVjdGFuZ2xlIHRoYXQgcHJvZHVjZWQgbm8gbWFzayAoc28gaXQgY2FuIGJlIHJldHJpZWQpICsgb3RoZXIgcmVnaW9ucy5cbiAgICAgIGNvbnN0IG91dCA9IHJlZ2lvbnMuZmlsdGVyKChyKSA9PiAhY29uc3VtZWQuaGFzKHIpKS5jb25jYXQobWFza3MpO1xuICAgICAgdGhpcy5ob3N0LnNldFJlZ2lvbnMob3V0KTtcbiAgICAgIHRoaXMuc3RhdHVzJC5uZXh0KGFkZGVkID4gMCA/IGBBZGRlZCAke2FkZGVkfSByZWdpb24ocykuYCA6ICdObyBtYXNrcyBmb3VuZC4nKTtcbiAgICAgIHJldHVybiBhZGRlZDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuc3RhdHVzJC5uZXh0KGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiAnU2VnbWVudGF0aW9uIGZhaWxlZC4nKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmJ1c3kkLm5leHQoZmFsc2UpO1xuICAgICAgdGhpcy5wcm9ncmVzcyQubmV4dCgtMSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtYWtlUmVnaW9uKHhEYXRhOiBudW1iZXJbXSwgeURhdGE6IG51bWJlcltdLCBjb2xvcj86IHN0cmluZyk6IFJlZ2lvbiB7XG4gICAgY29uc3QgcG9seSA9IG5ldyBQb2x5Z29uKCk7XG4gICAgcG9seS5ucG9pbnRzID0geERhdGEubGVuZ3RoO1xuICAgIHBvbHkueHBvaW50cyA9IHhEYXRhO1xuICAgIHBvbHkueXBvaW50cyA9IHlEYXRhO1xuICAgIHBvbHkuY29vcmRpbmF0ZXMgPSB4RGF0YS5tYXAoKHgsIGkpID0+IFt4LCB5RGF0YVtpXV0pO1xuICAgIHBvbHkuY2xvc2VkID0gdHJ1ZTtcblxuICAgIGNvbnN0IHJlZ2lvbiA9IG5ldyBSZWdpb24oKTtcbiAgICByZWdpb24uYm91bmRzID0gcG9seTtcbiAgICAvLyBJbmhlcml0IHRoZSBzb3VyY2UgcHJvbXB0IHJlY3RhbmdsZSdzIGNvbG9yOyBmYWxsIGJhY2sgdG8gdGhlIGhvc3QgZGVmYXVsdC5cbiAgICByZWdpb24uY29sb3IgPSBjb2xvciB8fCB0aGlzLmhvc3QuZ2V0U2hhcGVDb2xvcigpO1xuICAgIC8vIERlZmF1bHQgY2xhc3MvYW5ub3RhdGlvbiBuYW1lLCBtYXRjaGluZyB0aGUgd2FuZC9icnVzaCArIG92ZXJsYXktZHJhd24gcmVnaW9ucy5cbiAgICByZWdpb24ubGFiZWwgPSAnc2FtJztcbiAgICByZXR1cm4gcmVnaW9uO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVTZXNzaW9uKCk6IFByb21pc2U8SVNhbVNlc3Npb24+IHtcbiAgICBpZiAodGhpcy5zZXNzaW9uKSByZXR1cm4gdGhpcy5zZXNzaW9uO1xuICAgIGlmICghaXNTYW1Nb2RlbFJlYWR5KHRoaXMubW9kZWwpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBTQU0gbW9kZWwgXCIke3RoaXMubW9kZWwuaWR9XCIgaXMgbm90IGNvbmZpZ3VyZWQgeWV0IChubyBPTk5YIFVSTHMpLiBgICtcbiAgICAgICAgJ0hvc3QgaXQgYW5kIGNhbGwgc2V0U2FtTW9kZWxVcmxzKCksIHRoZW4gcmV0cnkuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIExhenktaW1wb3J0IHNvIG9ubnhydW50aW1lLXdlYiBpcyBuZXZlciBwdWxsZWQgaW50byB1bml0IHRlc3RzIC8gdGhlXG4gICAgLy8gaW5pdGlhbCBidW5kbGUg4oCUIG9ubHkgd2hlbiBzZWdtZW50YXRpb24gYWN0dWFsbHkgcnVucy5cbiAgICBjb25zdCB7IE9ubnhTYW1TZXNzaW9uIH0gPSBhd2FpdCBpbXBvcnQoJy4vb25ueC1zYW0tc2Vzc2lvbicpO1xuICAgIGNvbnN0IHNlc3Npb24gPSBuZXcgT25ueFNhbVNlc3Npb24oKTtcbiAgICB0aGlzLnByb2dyZXNzJC5uZXh0KDApO1xuICAgIGF3YWl0IHNlc3Npb24ubG9hZE1vZGVsKHRoaXMubW9kZWwsIChmKSA9PiB0aGlzLnByb2dyZXNzJC5uZXh0KGYpKTtcbiAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICAgIHJldHVybiBzZXNzaW9uO1xuICB9XG59XG4iXX0=
|
|
122
|
+
}], ctorParameters: () => [{ type: i1.SamSessionService }] });
|
|
123
|
+
function makeSamRegion(poly, frame, color) {
|
|
124
|
+
const ring = frame.ringToData(poly.xpoints, poly.ypoints);
|
|
125
|
+
const region = new Region();
|
|
126
|
+
region.bounds = makePolygon(ring.xs, ring.ys, { holes: frame.holesToData(poly.holes) });
|
|
127
|
+
// The source prompt rectangle's color, else the host default.
|
|
128
|
+
region.color = color;
|
|
129
|
+
// Default class/annotation name, matching the wand/brush + overlay-drawn regions.
|
|
130
|
+
region.label = 'sam';
|
|
131
|
+
return region;
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FtLXRvb2wuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdG9vbGJhci9zZWdtZW50YXRpb24vc2FtLXRvb2wuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE9BQU8sRUFBRSxNQUFNLEVBQVcsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7O0FBTXZEOzs7Ozs7Ozs7R0FTRztBQUVILE1BQU0sT0FBTyxjQUFjO0lBU3pCLFlBQTZCLFdBQThCLElBQUksaUJBQWlCLEVBQUU7UUFBckQsYUFBUSxHQUFSLFFBQVEsQ0FBNkM7UUFSakUsVUFBSyxHQUFHLElBQUksZUFBZSxFQUFFLENBQUM7UUFFL0MsaUVBQWlFO1FBQ3hELFlBQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUM3QixVQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDbEMsMkVBQTJFO1FBQ2xFLGNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztJQUUyQyxDQUFDO0lBRXRGLHVFQUF1RTtJQUN2RSxRQUFRLENBQUMsRUFBVTtRQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFF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Q0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDeEYsOERBQThEO0lBQzlELE1BQU0sQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLGtGQUFrRjtJQUNsRixNQUFNLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDYW52YXNUb29sSG9zdCB9IGZyb20gJy4uL3Rvb2wta2l0L2NhbnZhcy10b29sJztcbmltcG9ydCB7IFNhbVNlc3Npb25TZXJ2aWNlIH0gZnJvbSAnLi9zYW0tc2Vzc2lvbi5zZXJ2aWNlJztcbmltcG9ydCB7IElTYW1TZXNzaW9uIH0gZnJvbSAnLi4vLi4vY29udHJhY3RzL3NhbS5jb250cmFjdCc7XG5pbXBvcnQgeyBSZWdpb24sIFBvbHlnb24sIFJlY3RhbmdsZSB9IGZyb20gJy4uLy4uL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHsgbWFrZVBvbHlnb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvcG9seWdvbi1mYWN0b3J5JztcbmltcG9ydCB7IG1hc2tUb1BvbHlnb25zIH0gZnJvbSAnLi4vLi4vZ2VvbWV0cnkvY29udG91cic7XG5pbXBvcnQgeyBNYXRyaXhGcmFtZSB9IGZyb20gJy4uL3Rvb2wta2l0L21hdHJpeC1mcmFtZSc7XG5pbXBvcnQgeyBBc3luY1Rvb2xTdGF0dXMgfSBmcm9tICcuLi90b29sLWtpdC9hc3luYy10b29sLXN0YXR1cyc7XG5pbXBvcnQgeyB3aXRob3V0UmVnaW9ucyB9IGZyb20gJy4vc2VnbWVudGF0aW9uLWNvbW1pdCc7XG5cbi8qKiBAZGVwcmVjYXRlZCBUaGUgU0FNIHRvb2wgcnVucyBhZ2FpbnN0IHRoZSBiYWNrZW5kJ3MgY2FudmFzLXRvb2wgaG9zdDpcbiAqICB1c2Uge0BsaW5rIENhbnZhc1Rvb2xIb3N0fS4gKi9cbmV4cG9ydCB0eXBlIFNhbVRvb2xIb3N0ID0gQ2FudmFzVG9vbEhvc3Q7XG5cbi8qKlxuICogQm94LXByb21wdGVkIFNBTSBzZWdtZW50YXRpb24gdG9vbCAoaml0LXVpIzkwLCBQMCkuIE9uIGBzZWdtZW50Qm94ZXMoKWAgaXRcbiAqIHJlYWRzIGV2ZXJ5IHJlY3RhbmdsZSByZWdpb24sIHJ1bnMgdGhlIChjYWNoZWQpIGVuY29kZXIgb25jZSBmb3IgdGhlIGltYWdlLFxuICogdGhlbiBydW5zIHRoZSBkZWNvZGVyIHBlciBib3gsIHRyYWNlcyBlYWNoIG1hc2sgdG8gYSBwb2x5Z29uIGFuZCByZXBsYWNlc1xuICogdGhlIHByb21wdCByZWN0YW5nbGVzIHdpdGggdGhlIG1hc2tzLlxuICpcbiAqIEluZmVyZW5jZSBnb2VzIHRocm91Z2ggdGhlIHNoYXJlZCB7QGxpbmsgU2FtU2Vzc2lvblNlcnZpY2V9IChvbmUgc2Vzc2lvbiBhbmRcbiAqIGVtYmVkZGluZyBmb3IgYm90aCBTQU0gdG9vbHMpOyB0ZXN0cyBpbmplY3QgYSBmYWtlIHNlc3Npb24gdmlhXG4gKiB7QGxpbmsgdXNlU2Vzc2lvbn0uXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgU2FtVG9vbFNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YXRlID0gbmV3IEFzeW5jVG9vbFN0YXR1cygpO1xuXG4gIC8qKiBTdGF0dXMgdGV4dCArIGJ1c3kgZmxhZyBmb3IgYSBzcGlubmVyIC8gdG9hc3QgaW4gdGhlIGhvc3QuICovXG4gIHJlYWRvbmx5IHN0YXR1cyQgPSB0aGlzLnN0YXRlLnN0YXR1cyQ7XG4gIHJlYWRvbmx5IGJ1c3kkID0gdGhpcy5zdGF0ZS5idXN5JDtcbiAgLyoqIEVuY29kZXItZG93bmxvYWQgcHJvZ3Jlc3M6IC0xID0gbm90IGRvd25sb2FkaW5nLCAwLi4xID0gZG93bmxvYWRpbmcuICovXG4gIHJlYWRvbmx5IHByb2dyZXNzJCA9IHRoaXMuc3RhdGUucHJvZ3Jlc3MkO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgc2Vzc2lvbnM6IFNhbVNlc3Npb25TZXJ2aWNlID0gbmV3IFNhbVNlc3Npb25TZXJ2aWNlKCkpIHt9XG5cbiAgLyoqIENob29zZSB0aGUgcmVnaXN0ZXJlZCBtb2RlbCB0byB1c2UgKHNoYXJlZCB3aXRoIHRoZSBwb2ludCB0b29sKS4gKi9cbiAgc2V0TW9kZWwoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2Vzc2lvbnMuc2V0TW9kZWwoaWQpO1xuICB9XG5cbiAgLyoqIERyb3AgdGhlIGNhY2hlZCBlbWJlZGRpbmcgKGUuZy4gYWZ0ZXIgdGhlIGltYWdlL3NsaWNlIGNoYW5nZXMpLiAqL1xuICBpbnZhbGlkYXRlRW1iZWRkaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuc2Vzc2lvbnMuaW52YWxpZGF0ZUVtYmVkZGluZygpO1xuICB9XG5cbiAgLyoqIFRlc3Qgc2VhbTogaW5qZWN0IGEgZmFrZS9hbHRlcm5hdGUgaW5mZXJlbmNlIHNlc3Npb24uICovXG4gIHVzZVNlc3Npb24oc2Vzc2lvbjogSVNhbVNlc3Npb24pOiB2b2lkIHtcbiAgICB0aGlzLnNlc3Npb25zLnVzZVNlc3Npb24oc2Vzc2lvbik7XG4gIH1cblxuICAvKipcbiAgICogU2VnbWVudCBldmVyeSByZWN0YW5nbGUgcmVnaW9uIG9mIHRoZSBiYWNrZW5kIGJlaGluZCBgaG9zdGAgd2l0aCBhIGJveFxuICAgKiBwcm9tcHQgYW5kIHJlcGxhY2UgZWFjaCBwcm9tcHQgdGhhdCBwcm9kdWNlZCBhIG1hc2sgd2l0aCB0aGUgbWFzaydzIHBvbHlnb25cbiAgICogcmVnaW9uLiBSZXR1cm5zIGhvdyBtYW55IHJlZ2lvbnMgd2VyZSBhZGRlZDsgMCAoaWdub3JlZCkgd2hpbGUgYSBwcmV2aW91c1xuICAgKiBydW4gaXMgc3RpbGwgZ29pbmcuIFRoZSBob3N0IGlzIHBhc3NlZCBwZXIgcnVuLCBzbyBubyBiYWNrZW5kJ3MgaG9zdFxuICAgKiBvdXRsaXZlcyBpdHMgY2FsbC5cbiAgICovXG4gIGFzeW5jIHNlZ21lbnRCb3hlcyhob3N0OiBDYW52YXNUb29sSG9zdCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKHRoaXMuc3RhdGUuYnVzeSkgcmV0dXJuIDA7XG4gICAgY29uc3QgY2FjaGVkID0gaG9zdC5nZXRDYWNoZWRJbWFnZURhdGEoKTtcbiAgICBpZiAoIWNhY2hlZCB8fCBjYWNoZWQuZnJhbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5zdGF0dXMkLm5leHQoJ05vIGltYWdlIGxvYWRlZC4nKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCByZWN0cyA9IGhvc3QuZ2V0UmVnaW9ucygpLmZpbHRlcigocikgPT4gci5ib3VuZHMgaW5zdGFuY2VvZiBSZWN0YW5nbGUpO1xuICAgIGlmIChyZWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMuc3RhdHVzJC5uZXh0KCdEcmF3IG9uZSBvciBtb3JlIHJlY3RhbmdsZXMsIHRoZW4gcHJlc3MgU2VnbWVudC4nKTtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCBmcmFtZSA9IE1hdHJpeEZyYW1lLmZyb20oY2FjaGVkKTtcbiAgICBjb25zdCBmcmFtZUlkeCA9IGhvc3QuZ2V0QWN0aXZlRnJhbWVJbmRleCgpO1xuXG4gICAgLy8gQnVzeSBmcm9tIGhlcmUgb24g4oCUIGluY2x1ZGluZyB0aGUgbW9kZWwgZG93bmxvYWQsIHNvIGEgc2Vjb25kIHByZXNzXG4gICAgLy8gY2FuJ3Qgc3RhcnQgYSBzZWNvbmQgZG93bmxvYWQvZW5jb2RlICh3aGljaCBjYW4gZnJlZXplIHRoZSB0YWIgb24gYSBoZWF2eVxuICAgIC8vIFdlYkdQVSBWaVQtQikuXG4gICAgY29uc3QgYWRkZWQgPSBhd2FpdCB0aGlzLnN0YXRlLnJ1bihhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgc2Vzc2lvbjogSVNhbVNlc3Npb247XG4gICAgICB0cnkge1xuICAgICAgICBzZXNzaW9uID0gYXdhaXQgdGhpcy5zZXNzaW9ucy5lbnN1cmVTZXNzaW9uKChmKSA9PiB0aGlzLnByb2dyZXNzJC5uZXh0KGYpKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLnN0YXR1cyQubmV4dChlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ1NBTSBtb2RlbCB1bmF2YWlsYWJsZS4nKTtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICB0cnkge1xuICAgICAgICAvLyBFbmNvZGUgb25jZSBwZXIgaW1hZ2U7IHJldXNlIHRoZSBlbWJlZGRpbmcgYWNyb3NzIGFsbCBib3hlcy5cbiAgICAgICAgY29uc3Qga2V5ID0gW2hvc3QuZ2V0RmlsZU5hbWUoKSA/PyAnJywgZnJhbWVJZHgsIGAke2NhY2hlZC53aWR0aH14JHtjYWNoZWQuaGVpZ2h0fWAsIGZyYW1lLnNpZ10uam9pbignfCcpO1xuICAgICAgICBjb25zdCBlbWJlZGRpbmcgPSBhd2FpdCB0aGlzLnNlc3Npb25zLmVtYmVkKHNlc3Npb24sIGNhY2hlZCwgZnJhbWVJZHgsIGtleSwgKCkgPT5cbiAgICAgICAgICB0aGlzLnN0YXR1cyQubmV4dCgnRW5jb2RpbmcgaW1hZ2XigKYnKSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBtYXNrczogUmVnaW9uW10gPSBbXTtcbiAgICAgICAgY29uc3QgY29uc3VtZWQ6IFJlZ2lvbltdID0gW107IC8vIHByb21wdCByZWN0YW5nbGVzIHRoYXQgcHJvZHVjZWQgYSBtYXNrXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB0aGlzLnN0YXR1cyQubmV4dChgU2VnbWVudGluZyAke2kgKyAxfS8ke3JlY3RzLmxlbmd0aH3igKZgKTtcbiAgICAgICAgICBjb25zdCBiID0gcmVjdHNbaV0uYm91bmRzIGFzIFJlY3RhbmdsZTtcbiAgICAgICAgICAvLyBSZWN0YW5nbGUgaXMgaW4gZGF0YSBjb29yZHMg4oaSIGNvbnZlcnQgdG8gaW1hZ2UgKG1hdHJpeCkgY29vcmRzLlxuICAgICAgICAgIGNvbnN0IGJveCA9IHtcbiAgICAgICAgICAgIHgwOiBmcmFtZS50b01hdHJpeFgoYi54KSxcbiAgICAgICAgICAgIHkwOiBmcmFtZS50b01hdHJpeFkoYi55KSxcbiAgICAgICAgICAgIHgxOiBmcmFtZS50b01hdHJpeFgoYi54ICsgYi53aWR0aCksXG4gICAgICAgICAgICB5MTogZnJhbWUudG9NYXRyaXhZKGIueSArIGIuaGVpZ2h0KSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlc3Npb24uZGVjb2RlKGVtYmVkZGluZywgeyBib3ggfSk7XG4gICAgICAgICAgLy8gS2VlcCB0aGUgbGFyZ2VzdCBjb25uZWN0ZWQgcGllY2UgKG1hc2tUb1BvbHlnb25zIHJldHVybnMgbGFyZ2VzdC1maXJzdCkuXG4gICAgICAgICAgY29uc3QgcG9seSA9IG1hc2tUb1BvbHlnb25zKHJlcy5tYXNrLCByZXMud2lkdGgsIHJlcy5oZWlnaHQsIDAsIDApWzBdO1xuICAgICAgICAgIGlmICghcG9seSkgY29udGludWU7XG4gICAgICAgICAgLy8gSW5oZXJpdCB0aGUgcHJvbXB0IHJlY3RhbmdsZSdzIGNvbG91ci5cbiAgICAgICAgICBtYXNrcy5wdXNoKG1ha2VTYW1SZWdpb24ocG9seSwgZnJhbWUsIHJlY3RzW2ldLmNvbG9yIHx8IGhvc3QuZ2V0U2hhcGVDb2xvcigpKSk7XG4gICAgICAgICAgY29uc3VtZWQucHVzaChyZWN0c1tpXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb21taXQgYWdhaW5zdCB0aGUgcmVnaW9ucyBhcyB0aGV5IGFyZSBOT1c6IHRoZSB1c2VyIG1heSBoYXZlIGRyYXduLFxuICAgICAgICAvLyBlZGl0ZWQgb3IgZGVsZXRlZCByZWdpb25zIGR1cmluZyB0aGUgKHBvc3NpYmx5IG1pbnV0ZXMtbG9uZykgcnVuLlxuICAgICAgICAvLyBQcm9tcHRzIHRoYXQgcHJvZHVjZWQgYSBtYXNrIGFyZSByZXBsYWNlZDsgdGhlIHJlc3Qgc3RheSBmb3IgYSByZXRyeS5cbiAgICAgICAgaG9zdC5zZXRSZWdpb25zKHdpdGhvdXRSZWdpb25zKGhvc3QuZ2V0UmVnaW9ucygpLCBjb25zdW1lZCkuY29uY2F0KG1hc2tzKSk7XG4gICAgICAgIHRoaXMuc3RhdHVzJC5uZXh0KG1hc2tzLmxlbmd0aCA+IDAgPyBgQWRkZWQgJHttYXNrcy5sZW5ndGh9IHJlZ2lvbihzKS5gIDogJ05vIG1hc2tzIGZvdW5kLicpO1xuICAgICAgICByZXR1cm4gbWFza3MubGVuZ3RoO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRoaXMuc3RhdHVzJC5uZXh0KGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiAnU2VnbWVudGF0aW9uIGZhaWxlZC4nKTtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGFkZGVkID8/IDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFrZVNhbVJlZ2lvbihwb2x5OiBQb2x5Z29uLCBmcmFtZTogTWF0cml4RnJhbWUsIGNvbG9yOiBzdHJpbmcpOiBSZWdpb24ge1xuICBjb25zdCByaW5nID0gZnJhbWUucmluZ1RvRGF0YShwb2x5Lnhwb2ludHMsIHBvbHkueXBvaW50cyk7XG4gIGNvbnN0IHJlZ2lvbiA9IG5ldyBSZWdpb24oKTtcbiAgcmVnaW9uLmJvdW5kcyA9IG1ha2VQb2x5Z29uKHJpbmcueHMsIHJpbmcueXMsIHsgaG9sZXM6IGZyYW1lLmhvbGVzVG9EYXRhKHBvbHkuaG9sZXMpIH0pO1xuICAvLyBUaGUgc291cmNlIHByb21wdCByZWN0YW5nbGUncyBjb2xvciwgZWxzZSB0aGUgaG9zdCBkZWZhdWx0LlxuICByZWdpb24uY29sb3IgPSBjb2xvcjtcbiAgLy8gRGVmYXVsdCBjbGFzcy9hbm5vdGF0aW9uIG5hbWUsIG1hdGNoaW5nIHRoZSB3YW5kL2JydXNoICsgb3ZlcmxheS1kcmF3biByZWdpb25zLlxuICByZWdpb24ubGFiZWwgPSAnc2FtJztcbiAgcmV0dXJuIHJlZ2lvbjtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `regions` minus `remove`, matched by id (identity for a region without one).
|
|
3
|
+
* Async tools use it to drop their consumed prompts from the *current* region
|
|
4
|
+
* list at commit time, instead of overwriting the list they read before a long
|
|
5
|
+
* download or inference (RT-6).
|
|
6
|
+
*/
|
|
7
|
+
export function withoutRegions(regions, remove) {
|
|
8
|
+
const ids = new Set(remove.map((r) => r.id).filter((id) => id != null));
|
|
9
|
+
const objs = new Set(remove);
|
|
10
|
+
return regions.filter((r) => !objs.has(r) && !(r.id != null && ids.has(r.id)));
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VnbWVudGF0aW9uLWNvbW1pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdG9vbGJhci9zZWdtZW50YXRpb24vc2VnbWVudGF0aW9uLWNvbW1pdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsT0FBaUIsRUFBRSxNQUFnQjtJQUNoRSxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztJQUN4RSxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QixPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZWdpb24gfSBmcm9tICcuLi8uLi9tb2RlbHMvcmVnaW9uJztcblxuLyoqXG4gKiBgcmVnaW9uc2AgbWludXMgYHJlbW92ZWAsIG1hdGNoZWQgYnkgaWQgKGlkZW50aXR5IGZvciBhIHJlZ2lvbiB3aXRob3V0IG9uZSkuXG4gKiBBc3luYyB0b29scyB1c2UgaXQgdG8gZHJvcCB0aGVpciBjb25zdW1lZCBwcm9tcHRzIGZyb20gdGhlICpjdXJyZW50KiByZWdpb25cbiAqIGxpc3QgYXQgY29tbWl0IHRpbWUsIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmcgdGhlIGxpc3QgdGhleSByZWFkIGJlZm9yZSBhIGxvbmdcbiAqIGRvd25sb2FkIG9yIGluZmVyZW5jZSAoUlQtNikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRob3V0UmVnaW9ucyhyZWdpb25zOiBSZWdpb25bXSwgcmVtb3ZlOiBSZWdpb25bXSk6IFJlZ2lvbltdIHtcbiAgY29uc3QgaWRzID0gbmV3IFNldChyZW1vdmUubWFwKChyKSA9PiByLmlkKS5maWx0ZXIoKGlkKSA9PiBpZCAhPSBudWxsKSk7XG4gIGNvbnN0IG9ianMgPSBuZXcgU2V0KHJlbW92ZSk7XG4gIHJldHVybiByZWdpb25zLmZpbHRlcigocikgPT4gIW9ianMuaGFzKHIpICYmICEoci5pZCAhPSBudWxsICYmIGlkcy5oYXMoci5pZCkpKTtcbn1cbiJdfQ==
|