@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,282 @@
|
|
|
1
|
+
import { INFERNO_LUT } from 'napari-js/colormaps';
|
|
2
|
+
import { lutFor, spatialContinuousLut } from './spatial-encoding';
|
|
3
|
+
import { TRANSCRIPT_GLYPHS, glyphOutline } from './spatial-tiles';
|
|
4
|
+
/** A gene name as a dropdown option. Objects rather than bare strings because the
|
|
5
|
+
* dropdown filters on a named field (`filterBy="label"`), which a string has not. */
|
|
6
|
+
export function geneOption(name) {
|
|
7
|
+
return { label: name, value: name };
|
|
8
|
+
}
|
|
9
|
+
/** Glyph choices with an SVG `points` string for the preview. */
|
|
10
|
+
export const GLYPH_OPTIONS = TRANSCRIPT_GLYPHS.map((g) => {
|
|
11
|
+
const o = glyphOutline(g);
|
|
12
|
+
const pts = [];
|
|
13
|
+
for (let i = 0; i < o.length; i += 2)
|
|
14
|
+
pts.push(`${o[i].toFixed(3)},${o[i + 1].toFixed(3)}`);
|
|
15
|
+
return { label: g.replace('-', ' '), value: g, points: pts.join(' ') };
|
|
16
|
+
});
|
|
17
|
+
/** The preview outline of `glyph`, or `''` for an unknown one. */
|
|
18
|
+
export function glyphPoints(glyph) {
|
|
19
|
+
return GLYPH_OPTIONS.find((o) => o.value === glyph)?.points ?? '';
|
|
20
|
+
}
|
|
21
|
+
/** Outlier clipping presets, as `[lo, hi]` percentile fractions. */
|
|
22
|
+
export const CLIP_OPTIONS = [
|
|
23
|
+
{ label: 'None', value: [0, 1] },
|
|
24
|
+
{ label: '1%', value: [0.01, 0.99] },
|
|
25
|
+
{ label: '2%', value: [0.02, 0.98] },
|
|
26
|
+
{ label: '5%', value: [0.05, 0.95] },
|
|
27
|
+
];
|
|
28
|
+
/**
|
|
29
|
+
* `group,gene` rows (CSV or TSV, header optional) → gene groups, in file order.
|
|
30
|
+
*/
|
|
31
|
+
export function parseGeneGroups(text) {
|
|
32
|
+
const groups = new Map();
|
|
33
|
+
for (const line of text.split(/\r?\n/)) {
|
|
34
|
+
const [a, b] = line.split(/,|\t/).map((f) => f.trim().replace(/^"|"$/g, ''));
|
|
35
|
+
if (!a || !b || (/^(group|cell_?type|name)$/i.test(a) && /^(gene|genes|feature)$/i.test(b)))
|
|
36
|
+
continue;
|
|
37
|
+
const list = groups.get(a) ?? [];
|
|
38
|
+
if (!list.includes(b))
|
|
39
|
+
list.push(b);
|
|
40
|
+
groups.set(a, list);
|
|
41
|
+
}
|
|
42
|
+
return [...groups].map(([name, genes]) => ({ name, genes }));
|
|
43
|
+
}
|
|
44
|
+
/** `name — 2 categories` / `name — counts`: a column as the pickers list it. */
|
|
45
|
+
export function columnLabel(c) {
|
|
46
|
+
const kind = c.kind === 'categorical'
|
|
47
|
+
? `${c.categories.length} categories`
|
|
48
|
+
: (c.unit ?? 'continuous');
|
|
49
|
+
return `${c.name} — ${kind}`;
|
|
50
|
+
}
|
|
51
|
+
/** A categorical column's label in the group pickers: its description where it is a
|
|
52
|
+
* sectioned (derived) grouping, its name and size otherwise. */
|
|
53
|
+
function groupLabel(c) {
|
|
54
|
+
return c.description && c.section ? c.description : columnLabel(c);
|
|
55
|
+
}
|
|
56
|
+
/** Colour-by column choices — "None" plus every column the dataset declares. */
|
|
57
|
+
export function columnOptions(ds) {
|
|
58
|
+
return [
|
|
59
|
+
{ label: 'None (flat colour)', value: null },
|
|
60
|
+
...(ds?.columns ?? []).map((c) => ({ label: columnLabel(c), value: c.name })),
|
|
61
|
+
];
|
|
62
|
+
}
|
|
63
|
+
/** {@link TileOptions} for `ds`: short labels, cell set first, "Both" when there are two —
|
|
64
|
+
* as Xenium Explorer. */
|
|
65
|
+
export function tileOptions(ds) {
|
|
66
|
+
const sets = [...(ds?.polygonTiles?.sets ?? [])].sort((a, b) => a.name === 'cell' ? -1 : b.name === 'cell' ? 1 : 0);
|
|
67
|
+
const has = (name) => !!ds?.columns.some((c) => c.name === name);
|
|
68
|
+
return {
|
|
69
|
+
cellSetOptions: [
|
|
70
|
+
...sets.map((s) => ({ label: s.label.replace(/\s*boundar(y|ies)$/i, ''), value: s.name })),
|
|
71
|
+
...(sets.length > 1 ? [{ label: 'Both', value: 'both' }] : []),
|
|
72
|
+
],
|
|
73
|
+
transcriptModeOptions: [
|
|
74
|
+
...(ds?.transcriptTiles
|
|
75
|
+
? [
|
|
76
|
+
{ label: 'Points', value: 'circles' },
|
|
77
|
+
{ label: 'Icons', value: 'glyphs' },
|
|
78
|
+
]
|
|
79
|
+
: []),
|
|
80
|
+
...(ds?.density ? [{ label: 'Density Map', value: 'density' }] : []),
|
|
81
|
+
],
|
|
82
|
+
cellColorOptions: [
|
|
83
|
+
{ label: 'Group Affiliation', value: 'group' },
|
|
84
|
+
...(ds?.features ? [{ label: 'Gene Expression', value: 'gene' }] : []),
|
|
85
|
+
...(has('transcript_density')
|
|
86
|
+
? [{ label: 'Transcript Density Map', value: 'transcriptDensity' }]
|
|
87
|
+
: []),
|
|
88
|
+
{ label: 'Single Color', value: 'single' },
|
|
89
|
+
...(has('segmentation_method') ? [{ label: 'Segmentation Method', value: 'segmentation' }] : []),
|
|
90
|
+
],
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/** The value the group picker uses for a family of columns. */
|
|
94
|
+
export const FAMILY_PREFIX = 'family:';
|
|
95
|
+
/**
|
|
96
|
+
* The group picker: categorical columns under their section heading, a family of
|
|
97
|
+
* variants (k-means at k = 2…10) listed once. Values are a column name, or
|
|
98
|
+
* `family:<id>` for a family. The segmentation method is not a grouping of cells.
|
|
99
|
+
*/
|
|
100
|
+
export function groupOptions(ds) {
|
|
101
|
+
const sections = new Map();
|
|
102
|
+
const seenFamilies = new Set();
|
|
103
|
+
for (const c of ds?.columns ?? []) {
|
|
104
|
+
if (c.kind !== 'categorical' || c.name === 'segmentation_method')
|
|
105
|
+
continue;
|
|
106
|
+
const section = c.section ?? 'Groups';
|
|
107
|
+
const list = sections.get(section) ?? [];
|
|
108
|
+
if (c.family) {
|
|
109
|
+
if (seenFamilies.has(c.family.id))
|
|
110
|
+
continue;
|
|
111
|
+
seenFamilies.add(c.family.id);
|
|
112
|
+
list.push({ label: c.family.label, value: `${FAMILY_PREFIX}${c.family.id}` });
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
list.push({ label: groupLabel(c), value: c.name });
|
|
116
|
+
}
|
|
117
|
+
sections.set(section, list);
|
|
118
|
+
}
|
|
119
|
+
return [...sections].map(([label, items]) => ({ label, items }));
|
|
120
|
+
}
|
|
121
|
+
function categoricalMeta(ds, name) {
|
|
122
|
+
const meta = name ? ds?.columns.find((c) => c.name === name) : undefined;
|
|
123
|
+
return meta?.kind === 'categorical' ? meta : undefined;
|
|
124
|
+
}
|
|
125
|
+
/** The group picker's value for the active group column: its family's entry, or itself. */
|
|
126
|
+
export function groupEntryFor(ds, column) {
|
|
127
|
+
const family = categoricalMeta(ds, column)?.family;
|
|
128
|
+
return family ? `${FAMILY_PREFIX}${family.id}` : column;
|
|
129
|
+
}
|
|
130
|
+
/** The columns of family `id`, in dataset order. */
|
|
131
|
+
export function familyMembers(ds, id) {
|
|
132
|
+
return (ds?.columns ?? []).filter((c) => c.kind === 'categorical' && c.family?.id === id);
|
|
133
|
+
}
|
|
134
|
+
/** Variants of the active column's family (k = 2…10), or none when it has no family. */
|
|
135
|
+
export function groupVariantOptions(ds, column) {
|
|
136
|
+
const family = categoricalMeta(ds, column)?.family;
|
|
137
|
+
return family ? familyMembers(ds, family.id).map((c) => ({ label: c.family.variant, value: c.name })) : [];
|
|
138
|
+
}
|
|
139
|
+
/** A grouping's categories with colours and cell counts, largest first, and their total. */
|
|
140
|
+
export function countGroupRows(v) {
|
|
141
|
+
const counts = new Uint32Array(v.categories.length);
|
|
142
|
+
for (const c of v.codes)
|
|
143
|
+
if (c < counts.length)
|
|
144
|
+
counts[c]++;
|
|
145
|
+
const rows = v.categories
|
|
146
|
+
.map((label, i) => ({ label, color: v.colors[i] ?? '#999', count: counts[i] }))
|
|
147
|
+
.sort((a, b) => b.count - a.count);
|
|
148
|
+
return { rows, total: rows.reduce((n, r) => n + r.count, 0) };
|
|
149
|
+
}
|
|
150
|
+
/** `list` with `items` removed (`on`) or added (`!on`) — a hidden-set toggle. */
|
|
151
|
+
export function toggleHidden(list, items, on) {
|
|
152
|
+
const hidden = new Set(list);
|
|
153
|
+
for (const item of items) {
|
|
154
|
+
if (on)
|
|
155
|
+
hidden.delete(item);
|
|
156
|
+
else
|
|
157
|
+
hidden.add(item);
|
|
158
|
+
}
|
|
159
|
+
return [...hidden];
|
|
160
|
+
}
|
|
161
|
+
/** The selected genes as Explorer's tree: named groups, then the ungrouped ones. */
|
|
162
|
+
export function buildGeneTree(selected, groups) {
|
|
163
|
+
const chosen = new Set(selected);
|
|
164
|
+
const grouped = new Set();
|
|
165
|
+
const out = [];
|
|
166
|
+
for (const g of groups) {
|
|
167
|
+
const genes = g.genes.filter((x) => chosen.has(x));
|
|
168
|
+
if (!genes.length)
|
|
169
|
+
continue;
|
|
170
|
+
genes.forEach((x) => grouped.add(x));
|
|
171
|
+
out.push({ name: g.name, genes });
|
|
172
|
+
}
|
|
173
|
+
const rest = selected.filter((x) => !grouped.has(x));
|
|
174
|
+
if (rest.length)
|
|
175
|
+
out.push({ name: null, genes: rest });
|
|
176
|
+
return out;
|
|
177
|
+
}
|
|
178
|
+
/** Every categorical column but the segmentation method, which says nothing about genes. */
|
|
179
|
+
export function markerColumnOptions(columns) {
|
|
180
|
+
return (columns ?? [])
|
|
181
|
+
.filter((c) => c.kind === 'categorical' && c.name !== 'segmentation_method')
|
|
182
|
+
.map((c) => ({ label: groupLabel(c), value: c.name }));
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Each picked cluster's marker genes as a gene group named after it. A gene that marks
|
|
186
|
+
* several clusters goes to the one it scores highest in, so the tree lists it once;
|
|
187
|
+
* clusters left with no gene are dropped.
|
|
188
|
+
*/
|
|
189
|
+
export function markerGeneGroups(result, picked) {
|
|
190
|
+
const best = new Map();
|
|
191
|
+
for (const g of result.groups) {
|
|
192
|
+
if (!picked.has(g.name))
|
|
193
|
+
continue;
|
|
194
|
+
for (const gene of g.genes) {
|
|
195
|
+
const prev = best.get(gene.name);
|
|
196
|
+
if (!prev || gene.score > prev.score)
|
|
197
|
+
best.set(gene.name, { group: g.name, score: gene.score });
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return result.groups
|
|
201
|
+
.filter((g) => picked.has(g.name))
|
|
202
|
+
.map((g) => ({
|
|
203
|
+
name: g.name,
|
|
204
|
+
genes: g.genes.map((x) => x.name).filter((n) => best.get(n)?.group === g.name),
|
|
205
|
+
}))
|
|
206
|
+
.filter((g) => g.genes.length);
|
|
207
|
+
}
|
|
208
|
+
/** `groups` merged into the view's gene groups (replacing any of the same name). */
|
|
209
|
+
export function withGeneGroups(view, groups) {
|
|
210
|
+
const names = new Set(groups.map((g) => g.name));
|
|
211
|
+
return [...view.transcriptGeneGroups.filter((g) => !names.has(g.name)), ...groups];
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* The patch that adds marker groups: the groups, their genes appended to the selection,
|
|
215
|
+
* transcripts coloured by cluster (as their cells are), and switched on when off.
|
|
216
|
+
*/
|
|
217
|
+
export function markerGenesPatch(view, groups) {
|
|
218
|
+
const genes = [...view.transcriptGenes];
|
|
219
|
+
for (const g of groups)
|
|
220
|
+
for (const n of g.genes)
|
|
221
|
+
if (!genes.includes(n))
|
|
222
|
+
genes.push(n);
|
|
223
|
+
return {
|
|
224
|
+
transcriptGeneGroups: withGeneGroups(view, groups),
|
|
225
|
+
transcriptGenes: genes,
|
|
226
|
+
transcriptColorBy: 'cluster',
|
|
227
|
+
...(view.transcriptMode === 'off' ? { transcriptMode: 'circles' } : {}),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
/** The patch that imports gene groups: the groups, and their genes added to the selection. */
|
|
231
|
+
export function importGeneGroupsPatch(view, groups) {
|
|
232
|
+
return {
|
|
233
|
+
transcriptGeneGroups: withGeneGroups(view, groups),
|
|
234
|
+
transcriptGenes: [...new Set([...view.transcriptGenes, ...groups.flatMap((g) => g.genes)])],
|
|
235
|
+
transcriptAllGenes: false,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
/** `linear-gradient(...)` sampling `lut` at `steps + 1` evenly spaced stops. */
|
|
239
|
+
export function gradientCss(lut, steps = 16) {
|
|
240
|
+
const stops = [];
|
|
241
|
+
for (let i = 0; i <= steps; i++) {
|
|
242
|
+
const [r, g, b] = lut[Math.round((i / steps) * (lut.length - 1))];
|
|
243
|
+
stops.push(`rgb(${r},${g},${b}) ${((i / steps) * 100).toFixed(0)}%`);
|
|
244
|
+
}
|
|
245
|
+
return `linear-gradient(to right, ${stops.join(', ')})`;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* The continuous colour bar, resolved exactly the way the renderer resolves its colours —
|
|
249
|
+
* the same override, the same grey fallback. Built from `lutFor` alone, this bar showed a
|
|
250
|
+
* black-to-white ramp while the canvas drew Viridis, which makes the key worse than none.
|
|
251
|
+
*/
|
|
252
|
+
export function continuousColorBarCss(colormap, reverse, override) {
|
|
253
|
+
return gradientCss(spatialContinuousLut(colormap, reverse, override));
|
|
254
|
+
}
|
|
255
|
+
/** The density map's colour bar: its own colormap, Inferno by default. */
|
|
256
|
+
export function densityColorBarCss(colormap) {
|
|
257
|
+
return gradientCss(lutFor(colormap ?? INFERNO_LUT));
|
|
258
|
+
}
|
|
259
|
+
/** The middle of a section stack: where a "one section" picker opens, rather than on the
|
|
260
|
+
* first section, which for a brain is a nearly empty olfactory-bulb slide. */
|
|
261
|
+
export function middleSection(sections) {
|
|
262
|
+
return sections ? Math.floor((sections.length - 1) / 2) : 0;
|
|
263
|
+
}
|
|
264
|
+
/** "12 of 53" — 1-based, because the sections are slides, not array slots; `''` with none. */
|
|
265
|
+
export function sectionLabel(sections, at) {
|
|
266
|
+
const total = sections?.length ?? 0;
|
|
267
|
+
if (!total)
|
|
268
|
+
return '';
|
|
269
|
+
const i = Math.max(0, Math.min(total - 1, at ?? 0));
|
|
270
|
+
return `${i + 1} of ${total}`;
|
|
271
|
+
}
|
|
272
|
+
/** Why "All genes" is not offered yet, while the server builds its pyramid; null otherwise. */
|
|
273
|
+
export function allGenesPreparingNote(ds) {
|
|
274
|
+
const st = ds?.transcriptBinsStatus;
|
|
275
|
+
if (!st || ds?.transcriptBins)
|
|
276
|
+
return null;
|
|
277
|
+
if (st.state === 'failed')
|
|
278
|
+
return `"All genes" is unavailable: preparing it failed (${st.message ?? 'unknown error'}).`;
|
|
279
|
+
const pct = st.total ? ` — ${Math.floor((100 * (st.done ?? 0)) / st.total)}% when this dataset was opened` : '';
|
|
280
|
+
return `"All genes" is being prepared on the server${pct}; reopen the dataset once it is done.`;
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1wYW5lbC1tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC9zcGF0aWFsLXBhbmVsLW1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQVdsRCxPQUFPLEVBQUUsTUFBTSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBY2xFO3NGQUNzRjtBQUN0RixNQUFNLFVBQVUsVUFBVSxDQUFDLElBQVk7SUFDckMsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQ3RDLENBQUM7QUFPRCxpRUFBaUU7QUFDakUsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFrQixpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtJQUN0RSxNQUFNLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUIsTUFBTSxHQUFHLEdBQWEsRUFBRSxDQUFDO0lBQ3pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDO1FBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVGLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQXdCLEVB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QUUsRUFBRSxvQkFBb0IsQ0FBQztJQUNwQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxjQUFjO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDM0MsSUFBSSxFQUFFLENBQUMsS0FBSyxLQUFLLFFBQVE7UUFDdkIsT0FBTyxvREFBb0QsRUFBRSxDQUFDLE9BQU8sSUFBSSxlQUFlLElBQUksQ0FBQztJQUMvRixNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ2hILE9BQU8sOENBQThDLEdBQUcsdUNBQXVDLENBQUM7QUFDbEcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElORkVSTk9fTFVUIH0gZnJvbSAnbmFwYXJpLWpzL2NvbG9ybWFwcyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgQ2F0ZWdvcmljYWxDb2x1bW5NZXRhLFxuICBTcGF0aWFsQ29sdW1uTWV0YSxcbiAgU3BhdGlhbERhdGFzZXQsXG4gIFNwYXRpYWxNYXJrZXJHZW5lcyxcbn0gZnJvbSAnLi4vY29udHJhY3RzL3NwYXRpYWwtZGF0YXNldC5jb250cmFjdCc7XG5pbXBvcnQgdHlwZSB7IFNwYXRpYWxDYXRlZ29yaWNhbFZpZXcgfSBmcm9tICcuLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgdHlwZSB7IENvbG9ybWFwVmFsdWUsIFNwYXRpYWxWaWV3U3RhdGUsIFRyYW5zY3JpcHRHbHlwaE5hbWUgfSBmcm9tICcuLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgdHlwZSB7IFJnYiB9IGZyb20gJy4uL2NvbnRyYWN0cy9jb2xvcm1hcC1sdXQnO1xuaW1wb3J0IHsgbHV0Rm9yLCBzcGF0aWFsQ29udGludW91c0x1dCB9IGZyb20gJy4vc3BhdGlhbC1lbmNvZGluZyc7XG5pbXBvcnQgeyBUUkFOU0NSSVBUX0dMWVBIUywgZ2x5cGhPdXRsaW5lIH0gZnJvbSAnLi9zcGF0aWFsLXRpbGVzJztcblxuLyoqXG4gKiBQdXJlIG1vZGVsIG9mIHRoZSBzcGF0aWFsLW9taWNzIHBhbmVsOiB0aGUgb3B0aW9uIGxpc3RzLCByb3dzIGFuZCBwYXRjaGVzIGl0cyBjb250cm9sc1xuICogc2hvdyBhbmQgd3JpdGUsIGFzIGZ1bmN0aW9ucyBvZiB0aGUgZGF0YXNldCBhbmQgdGhlIHZpZXcuIE5vIEFuZ3VsYXIgYW5kIG5vIHN0YXRlLCBzb1xuICogZXZlcnkgcnVsZSBoZXJlIGlzIHVuaXQtdGVzdGVkIHdpdGhvdXQgYSBUZXN0QmVkIGFuZCBzaGFyZWQgYnkgd2hpY2hldmVyIHBhbmVsIHNob3dzIGl0LlxuICovXG5cbi8qKiBBIGxhYmVsbGVkIGRyb3Bkb3duIG9wdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFuZWxPcHRpb248VD4ge1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogVDtcbn1cblxuLyoqIEEgZ2VuZSBuYW1lIGFzIGEgZHJvcGRvd24gb3B0aW9uLiBPYmplY3RzIHJhdGhlciB0aGFuIGJhcmUgc3RyaW5ncyBiZWNhdXNlIHRoZVxuICogIGRyb3Bkb3duIGZpbHRlcnMgb24gYSBuYW1lZCBmaWVsZCAoYGZpbHRlckJ5PVwibGFiZWxcImApLCB3aGljaCBhIHN0cmluZyBoYXMgbm90LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdlbmVPcHRpb24obmFtZTogc3RyaW5nKTogUGFuZWxPcHRpb248c3RyaW5nPiB7XG4gIHJldHVybiB7IGxhYmVsOiBuYW1lLCB2YWx1ZTogbmFtZSB9O1xufVxuXG4vKiogQSB0cmFuc2NyaXB0IGdseXBoIGNob2ljZSwgd2l0aCBhbiBTVkcgYHBvaW50c2Agc3RyaW5nIGZvciBpdHMgcHJldmlldy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2x5cGhPcHRpb24gZXh0ZW5kcyBQYW5lbE9wdGlvbjxUcmFuc2NyaXB0R2x5cGhOYW1lPiB7XG4gIHBvaW50czogc3RyaW5nO1xufVxuXG4vKiogR2x5cGggY2hvaWNlcyB3aXRoIGFuIFNWRyBgcG9pbnRzYCBzdHJpbmcgZm9yIHRoZSBwcmV2aWV3LiAqL1xuZXhwb3J0IGNvbnN0IEdMWVBIX09QVElPTlM6IEdseXBoT3B0aW9uW10gPSBUUkFOU0NSSVBUX0dMWVBIUy5tYXAoKGcpID0+IHtcbiAgY29uc3QgbyA9IGdseXBoT3V0bGluZShnKTtcbiAgY29uc3QgcHRzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG8ubGVuZ3RoOyBpICs9IDIpIHB0cy5wdXNoKGAke29baV0udG9GaXhlZCgzKX0sJHtvW2kgKyAxXS50b0ZpeGVkKDMpfWApO1xuICByZXR1cm4geyBsYWJlbDogZy5yZXBsYWNlKCctJywgJyAnKSwgdmFsdWU6IGcgYXMgVHJhbnNjcmlwdEdseXBoTmFtZSwgcG9pbnRzOiBwdHMuam9pbignICcpIH07XG59KTtcblxuLyoqIFRoZSBwcmV2aWV3IG91dGxpbmUgb2YgYGdseXBoYCwgb3IgYCcnYCBmb3IgYW4gdW5rbm93biBvbmUuICovXG5leHBvcnQgZnVuY3Rpb24gZ2x5cGhQb2ludHMoZ2x5cGg6IFRyYW5zY3JpcHRHbHlwaE5hbWUpOiBzdHJpbmcge1xuICByZXR1cm4gR0xZUEhfT1BUSU9OUy5maW5kKChvKSA9PiBvLnZhbHVlID09PSBnbHlwaCk/LnBvaW50cyA/PyAnJztcbn1cblxuLyoqIE91dGxpZXIgY2xpcHBpbmcgcHJlc2V0cywgYXMgYFtsbywgaGldYCBwZXJjZW50aWxlIGZyYWN0aW9ucy4gKi9cbmV4cG9ydCBjb25zdCBDTElQX09QVElPTlM6IFBhbmVsT3B0aW9uPFtudW1iZXIsIG51bWJlcl0+W10gPSBbXG4gIHsgbGFiZWw6ICdOb25lJywgdmFsdWU6IFswLCAxXSB9LFxuICB7IGxhYmVsOiAnMSUnLCB2YWx1ZTogWzAuMDEsIDAuOTldIH0sXG4gIHsgbGFiZWw6ICcyJScsIHZhbHVlOiBbMC4wMiwgMC45OF0gfSxcbiAgeyBsYWJlbDogJzUlJywgdmFsdWU6IFswLjA1LCAwLjk1XSB9LFxuXTtcblxuLyoqXG4gKiBgZ3JvdXAsZ2VuZWAgcm93cyAoQ1NWIG9yIFRTViwgaGVhZGVyIG9wdGlvbmFsKSDihpIgZ2VuZSBncm91cHMsIGluIGZpbGUgb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUdlbmVHcm91cHModGV4dDogc3RyaW5nKTogeyBuYW1lOiBzdHJpbmc7IGdlbmVzOiBzdHJpbmdbXSB9W10ge1xuICBjb25zdCBncm91cHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gIGZvciAoY29uc3QgbGluZSBvZiB0ZXh0LnNwbGl0KC9cXHI/XFxuLykpIHtcbiAgICBjb25zdCBbYSwgYl0gPSBsaW5lLnNwbGl0KC8sfFxcdC8pLm1hcCgoZikgPT4gZi50cmltKCkucmVwbGFjZSgvXlwifFwiJC9nLCAnJykpO1xuICAgIGlmICghYSB8fCAhYiB8fCAoL14oZ3JvdXB8Y2VsbF8/dHlwZXxuYW1lKSQvaS50ZXN0KGEpICYmIC9eKGdlbmV8Z2VuZXN8ZmVhdHVyZSkkL2kudGVzdChiKSkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGxpc3QgPSBncm91cHMuZ2V0KGEpID8/IFtdO1xuICAgIGlmICghbGlzdC5pbmNsdWRlcyhiKSkgbGlzdC5wdXNoKGIpO1xuICAgIGdyb3Vwcy5zZXQoYSwgbGlzdCk7XG4gIH1cbiAgcmV0dXJuIFsuLi5ncm91cHNdLm1hcCgoW25hbWUsIGdlbmVzXSkgPT4gKHsgbmFtZSwgZ2VuZXMgfSkpO1xufVxuXG4vKiogYG5hbWUg4oCUIDIgY2F0ZWdvcmllc2AgLyBgbmFtZSDigJQgY291bnRzYDogYSBjb2x1bW4gYXMgdGhlIHBpY2tlcnMgbGlzdCBpdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2x1bW5MYWJlbChjOiBTcGF0aWFsQ29sdW1uTWV0YSk6IHN0cmluZyB7XG4gIGNvbnN0IGtpbmQgPVxuICAgIGMua2luZCA9PT0gJ2NhdGVnb3JpY2FsJ1xuICAgICAgPyBgJHsoYyBhcyBDYXRlZ29yaWNhbENvbHVtbk1ldGEpLmNhdGVnb3JpZXMubGVuZ3RofSBjYXRlZ29yaWVzYFxuICAgICAgOiAoYy51bml0ID8/ICdjb250aW51b3VzJyk7XG4gIHJldHVybiBgJHtjLm5hbWV9IOKAlCAke2tpbmR9YDtcbn1cblxuLyoqIEEgY2F0ZWdvcmljYWwgY29sdW1uJ3MgbGFiZWwgaW4gdGhlIGdyb3VwIHBpY2tlcnM6IGl0cyBkZXNjcmlwdGlvbiB3aGVyZSBpdCBpcyBhXG4gKiAgc2VjdGlvbmVkIChkZXJpdmVkKSBncm91cGluZywgaXRzIG5hbWUgYW5kIHNpemUgb3RoZXJ3aXNlLiAqL1xuZnVuY3Rpb24gZ3JvdXBMYWJlbChjOiBDYXRlZ29yaWNhbENvbHVtbk1ldGEpOiBzdHJpbmcge1xuICByZXR1cm4gYy5kZXNjcmlwdGlvbiAmJiBjLnNlY3Rpb24gPyBjLmRlc2NyaXB0aW9uIDogY29sdW1uTGFiZWwoYyk7XG59XG5cbi8qKiBDb2xvdXItYnkgY29sdW1uIGNob2ljZXMg4oCUIFwiTm9uZVwiIHBsdXMgZXZlcnkgY29sdW1uIHRoZSBkYXRhc2V0IGRlY2xhcmVzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbHVtbk9wdGlvbnMoZHM6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCk6IFBhbmVsT3B0aW9uPHN0cmluZyB8IG51bGw+W10ge1xuICByZXR1cm4gW1xuICAgIHsgbGFiZWw6ICdOb25lIChmbGF0IGNvbG91ciknLCB2YWx1ZTogbnVsbCB9LFxuICAgIC4uLihkcz8uY29sdW1ucyA/PyBbXSkubWFwKChjKSA9PiAoeyBsYWJlbDogY29sdW1uTGFiZWwoYyksIHZhbHVlOiBjLm5hbWUgfSkpLFxuICBdO1xufVxuXG4vKiogVGhlIG9wdGlvbiBsaXN0cyBvZiB0aGUgY2VsbCBhbmQgdHJhbnNjcmlwdCBjb250cm9scywgd2hpY2ggZGVwZW5kIG9uIHRoZSBkYXRhc2V0IG9ubHkuICovXG5leHBvcnQgaW50ZXJmYWNlIFRpbGVPcHRpb25zIHtcbiAgY2VsbFNldE9wdGlvbnM6IFBhbmVsT3B0aW9uPHN0cmluZz5bXTtcbiAgdHJhbnNjcmlwdE1vZGVPcHRpb25zOiBQYW5lbE9wdGlvbjxTcGF0aWFsVmlld1N0YXRlWyd0cmFuc2NyaXB0TW9kZSddPltdO1xuICBjZWxsQ29sb3JPcHRpb25zOiBQYW5lbE9wdGlvbjxTcGF0aWFsVmlld1N0YXRlWydjZWxsQ29sb3JNb2RlJ10+W107XG59XG5cbi8qKiB7QGxpbmsgVGlsZU9wdGlvbnN9IGZvciBgZHNgOiBzaG9ydCBsYWJlbHMsIGNlbGwgc2V0IGZpcnN0LCBcIkJvdGhcIiB3aGVuIHRoZXJlIGFyZSB0d28g4oCUXG4gKiAgYXMgWGVuaXVtIEV4cGxvcmVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRpbGVPcHRpb25zKGRzOiBTcGF0aWFsRGF0YXNldCB8IG51bGwpOiBUaWxlT3B0aW9ucyB7XG4gIGNvbnN0IHNldHMgPSBbLi4uKGRzPy5wb2x5Z29uVGlsZXM/LnNldHMgPz8gW10pXS5zb3J0KChhLCBiKSA9PlxuICAgIGEubmFtZSA9PT0gJ2NlbGwnID8gLTEgOiBiLm5hbWUgPT09ICdjZWxsJyA/IDEgOiAwLFxuICApO1xuICBjb25zdCBoYXMgPSAobmFtZTogc3RyaW5nKSA9PiAhIWRzPy5jb2x1bW5zLnNvbWUoKGMpID0+IGMubmFtZSA9PT0gbmFtZSk7XG4gIHJldHVybiB7XG4gICAgY2VsbFNldE9wdGlvbnM6IFtcbiAgICAgIC4uLnNldHMubWFwKChzKSA9PiAoeyBsYWJlbDogcy5sYWJlbC5yZXBsYWNlKC9cXHMqYm91bmRhcih5fGllcykkL2ksICcnKSwgdmFsdWU6IHMubmFtZSB9KSksXG4gICAgICAuLi4oc2V0cy5sZW5ndGggPiAxID8gW3sgbGFiZWw6ICdCb3RoJywgdmFsdWU6ICdib3RoJyB9XSA6IFtdKSxcbiAgICBdLFxuICAgIHRyYW5zY3JpcHRNb2RlT3B0aW9uczogW1xuICAgICAgLi4uKGRzPy50cmFuc2NyaXB0VGlsZXNcbiAgICAgICAgPyBbXG4gICAgICAgICAgICB7IGxhYmVsOiAnUG9pbnRzJywgdmFsdWU6ICdjaXJjbGVzJyBhcyBjb25zdCB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ0ljb25zJywgdmFsdWU6ICdnbHlwaHMnIGFzIGNvbnN0IH0sXG4gICAgICAgICAgXVxuICAgICAgICA6IFtdKSxcbiAgICAgIC4uLihkcz8uZGVuc2l0eSA/IFt7IGxhYmVsOiAnRGVuc2l0eSBNYXAnLCB2YWx1ZTogJ2RlbnNpdHknIGFzIGNvbnN0IH1dIDogW10pLFxuICAgIF0sXG4gICAgY2VsbENvbG9yT3B0aW9uczogW1xuICAgICAgeyBsYWJlbDogJ0dyb3VwIEFmZmlsaWF0aW9uJywgdmFsdWU6ICdncm91cCcgfSxcbiAgICAgIC4uLihkcz8uZmVhdHVyZXMgPyBbeyBsYWJlbDogJ0dlbmUgRXhwcmVzc2lvbicsIHZhbHVlOiAnZ2VuZScgYXMgY29uc3QgfV0gOiBbXSksXG4gICAgICAuLi4oaGFzKCd0cmFuc2NyaXB0X2RlbnNpdHknKVxuICAgICAgICA/IFt7IGxhYmVsOiAnVHJhbnNjcmlwdCBEZW5zaXR5IE1hcCcsIHZhbHVlOiAndHJhbnNjcmlwdERlbnNpdHknIGFzIGNvbnN0IH1dXG4gICAgICAgIDogW10pLFxuICAgICAgeyBsYWJlbDogJ1NpbmdsZSBDb2xvcicsIHZhbHVlOiAnc2luZ2xlJyB9LFxuICAgICAgLi4uKGhhcygnc2VnbWVudGF0aW9uX21ldGhvZCcpID8gW3sgbGFiZWw6ICdTZWdtZW50YXRpb24gTWV0aG9kJywgdmFsdWU6ICdzZWdtZW50YXRpb24nIGFzIGNvbnN0IH1dIDogW10pLFxuICAgIF0sXG4gIH07XG59XG5cbi8qKiBBIHNlY3Rpb24gb2YgdGhlIGdyb3VwIHBpY2tlci4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR3JvdXBPcHRpb25TZWN0aW9uIHtcbiAgbGFiZWw6IHN0cmluZztcbiAgaXRlbXM6IFBhbmVsT3B0aW9uPHN0cmluZz5bXTtcbn1cblxuLyoqIFRoZSB2YWx1ZSB0aGUgZ3JvdXAgcGlja2VyIHVzZXMgZm9yIGEgZmFtaWx5IG9mIGNvbHVtbnMuICovXG5leHBvcnQgY29uc3QgRkFNSUxZX1BSRUZJWCA9ICdmYW1pbHk6JztcblxuLyoqXG4gKiBUaGUgZ3JvdXAgcGlja2VyOiBjYXRlZ29yaWNhbCBjb2x1bW5zIHVuZGVyIHRoZWlyIHNlY3Rpb24gaGVhZGluZywgYSBmYW1pbHkgb2ZcbiAqIHZhcmlhbnRzIChrLW1lYW5zIGF0IGsgPSAy4oCmMTApIGxpc3RlZCBvbmNlLiBWYWx1ZXMgYXJlIGEgY29sdW1uIG5hbWUsIG9yXG4gKiBgZmFtaWx5OjxpZD5gIGZvciBhIGZhbWlseS4gVGhlIHNlZ21lbnRhdGlvbiBtZXRob2QgaXMgbm90IGEgZ3JvdXBpbmcgb2YgY2VsbHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncm91cE9wdGlvbnMoZHM6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCk6IEdyb3VwT3B0aW9uU2VjdGlvbltdIHtcbiAgY29uc3Qgc2VjdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgUGFuZWxPcHRpb248c3RyaW5nPltdPigpO1xuICBjb25zdCBzZWVuRmFtaWxpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBjIG9mIGRzPy5jb2x1bW5zID8/IFtdKSB7XG4gICAgaWYgKGMua2luZCAhPT0gJ2NhdGVnb3JpY2FsJyB8fCBjLm5hbWUgPT09ICdzZWdtZW50YXRpb25fbWV0aG9kJykgY29udGludWU7XG4gICAgY29uc3Qgc2VjdGlvbiA9IGMuc2VjdGlvbiA/PyAnR3JvdXBzJztcbiAgICBjb25zdCBsaXN0ID0gc2VjdGlvbnMuZ2V0KHNlY3Rpb24pID8/IFtdO1xuICAgIGlmIChjLmZhbWlseSkge1xuICAgICAgaWYgKHNlZW5GYW1pbGllcy5oYXMoYy5mYW1pbHkuaWQpKSBjb250aW51ZTtcbiAgICAgIHNlZW5GYW1pbGllcy5hZGQoYy5mYW1pbHkuaWQpO1xuICAgICAgbGlzdC5wdXNoKHsgbGFiZWw6IGMuZmFtaWx5LmxhYmVsLCB2YWx1ZTogYCR7RkFNSUxZX1BSRUZJWH0ke2MuZmFtaWx5LmlkfWAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpc3QucHVzaCh7IGxhYmVsOiBncm91cExhYmVsKGMpLCB2YWx1ZTogYy5uYW1lIH0pO1xuICAgIH1cbiAgICBzZWN0aW9ucy5zZXQoc2VjdGlvbiwgbGlzdCk7XG4gIH1cbiAgcmV0dXJuIFsuLi5zZWN0aW9uc10ubWFwKChbbGFiZWwsIGl0ZW1zXSkgPT4gKHsgbGFiZWwsIGl0ZW1zIH0pKTtcbn1cblxuZnVuY3Rpb24gY2F0ZWdvcmljYWxNZXRhKGRzOiBTcGF0aWFsRGF0YXNldCB8IG51bGwsIG5hbWU6IHN0cmluZyB8IG51bGwpOiBDYXRlZ29yaWNhbENvbHVtbk1ldGEgfCB1bmRlZmluZWQge1xuICBjb25zdCBtZXRhID0gbmFtZSA/IGRzPy5jb2x1bW5zLmZpbmQoKGMpID0+IGMubmFtZSA9PT0gbmFtZSkgOiB1bmRlZmluZWQ7XG4gIHJldHVybiBtZXRhPy5raW5kID09PSAnY2F0ZWdvcmljYWwnID8gbWV0YSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIFRoZSBncm91cCBwaWNrZXIncyB2YWx1ZSBmb3IgdGhlIGFjdGl2ZSBncm91cCBjb2x1bW46IGl0cyBmYW1pbHkncyBlbnRyeSwgb3IgaXRzZWxmLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwRW50cnlGb3IoZHM6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCwgY29sdW1uOiBzdHJpbmcgfCBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGZhbWlseSA9IGNhdGVnb3JpY2FsTWV0YShkcywgY29sdW1uKT8uZmFtaWx5O1xuICByZXR1cm4gZmFtaWx5ID8gYCR7RkFNSUxZX1BSRUZJWH0ke2ZhbWlseS5pZH1gIDogY29sdW1uO1xufVxuXG4vKiogVGhlIGNvbHVtbnMgb2YgZmFtaWx5IGBpZGAsIGluIGRhdGFzZXQgb3JkZXIuICovXG5leHBvcnQgZnVuY3Rpb24gZmFtaWx5TWVtYmVycyhkczogU3BhdGlhbERhdGFzZXQgfCBudWxsLCBpZDogc3RyaW5nKTogQ2F0ZWdvcmljYWxDb2x1bW5NZXRhW10ge1xuICByZXR1cm4gKGRzPy5jb2x1bW5zID8/IFtdKS5maWx0ZXIoXG4gICAgKGMpOiBjIGlzIENhdGVnb3JpY2FsQ29sdW1uTWV0YSA9PiBjLmtpbmQgPT09ICdjYXRlZ29yaWNhbCcgJiYgYy5mYW1pbHk/LmlkID09PSBpZCxcbiAgKTtcbn1cblxuLyoqIFZhcmlhbnRzIG9mIHRoZSBhY3RpdmUgY29sdW1uJ3MgZmFtaWx5IChrID0gMuKApjEwKSwgb3Igbm9uZSB3aGVuIGl0IGhhcyBubyBmYW1pbHkuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBWYXJpYW50T3B0aW9ucyhkczogU3BhdGlhbERhdGFzZXQgfCBudWxsLCBjb2x1bW46IHN0cmluZyB8IG51bGwpOiBQYW5lbE9wdGlvbjxzdHJpbmc+W10ge1xuICBjb25zdCBmYW1pbHkgPSBjYXRlZ29yaWNhbE1ldGEoZHMsIGNvbHVtbik/LmZhbWlseTtcbiAgcmV0dXJuIGZhbWlseSA/IGZhbWlseU1lbWJlcnMoZHMsIGZhbWlseS5pZCkubWFwKChjKSA9PiAoeyBsYWJlbDogYy5mYW1pbHkhLnZhcmlhbnQsIHZhbHVlOiBjLm5hbWUgfSkpIDogW107XG59XG5cbi8qKiBPbmUgcm93IG9mIHRoZSBncm91cHMgbGlzdDogYSBjYXRlZ29yeSB3aXRoIGl0cyBjb2xvdXIgYW5kIGNlbGwgY291bnQuICovXG5leHBvcnQgaW50ZXJmYWNlIEdyb3VwUm93IHtcbiAgbGFiZWw6IHN0cmluZztcbiAgY29sb3I6IHN0cmluZztcbiAgY291bnQ6IG51bWJlcjtcbn1cblxuLyoqIEEgZ3JvdXBpbmcncyBjYXRlZ29yaWVzIHdpdGggY29sb3VycyBhbmQgY2VsbCBjb3VudHMsIGxhcmdlc3QgZmlyc3QsIGFuZCB0aGVpciB0b3RhbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3VudEdyb3VwUm93cyh2OiBQaWNrPFNwYXRpYWxDYXRlZ29yaWNhbFZpZXcsICdjYXRlZ29yaWVzJyB8ICdjb2xvcnMnIHwgJ2NvZGVzJz4pOiB7XG4gIHJvd3M6IEdyb3VwUm93W107XG4gIHRvdGFsOiBudW1iZXI7XG59IHtcbiAgY29uc3QgY291bnRzID0gbmV3IFVpbnQzMkFycmF5KHYuY2F0ZWdvcmllcy5sZW5ndGgpO1xuICBmb3IgKGNvbnN0IGMgb2Ygdi5jb2RlcykgaWYgKGMgPCBjb3VudHMubGVuZ3RoKSBjb3VudHNbY10rKztcbiAgY29uc3Qgcm93cyA9IHYuY2F0ZWdvcmllc1xuICAgIC5tYXAoKGxhYmVsLCBpKSA9PiAoeyBsYWJlbCwgY29sb3I6IHYuY29sb3JzW2ldID8/ICcjOTk5JywgY291bnQ6IGNvdW50c1tpXSB9KSlcbiAgICAuc29ydCgoYSwgYikgPT4gYi5jb3VudCAtIGEuY291bnQpO1xuICByZXR1cm4geyByb3dzLCB0b3RhbDogcm93cy5yZWR1Y2UoKG4sIHIpID0+IG4gKyByLmNvdW50LCAwKSB9O1xufVxuXG4vKiogYGxpc3RgIHdpdGggYGl0ZW1zYCByZW1vdmVkIChgb25gKSBvciBhZGRlZCAoYCFvbmApIOKAlCBhIGhpZGRlbi1zZXQgdG9nZ2xlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvZ2dsZUhpZGRlbihsaXN0OiByZWFkb25seSBzdHJpbmdbXSwgaXRlbXM6IHJlYWRvbmx5IHN0cmluZ1tdLCBvbjogYm9vbGVhbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgaGlkZGVuID0gbmV3IFNldChsaXN0KTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XG4gICAgaWYgKG9uKSBoaWRkZW4uZGVsZXRlKGl0ZW0pO1xuICAgIGVsc2UgaGlkZGVuLmFkZChpdGVtKTtcbiAgfVxuICByZXR1cm4gWy4uLmhpZGRlbl07XG59XG5cbi8qKiBPbmUgbm9kZSBvZiB0aGUgc2VsZWN0ZWQtZ2VuZXMgdHJlZTogYSBuYW1lZCBnZW5lIGdyb3VwLCBvciB0aGUgdW5ncm91cGVkIHJlc3QgKGBudWxsYCkuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVUcmVlTm9kZSB7XG4gIG5hbWU6IHN0cmluZyB8IG51bGw7XG4gIGdlbmVzOiBzdHJpbmdbXTtcbn1cblxuLyoqIFRoZSBzZWxlY3RlZCBnZW5lcyBhcyBFeHBsb3JlcidzIHRyZWU6IG5hbWVkIGdyb3VwcywgdGhlbiB0aGUgdW5ncm91cGVkIG9uZXMuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRHZW5lVHJlZShcbiAgc2VsZWN0ZWQ6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBncm91cHM6IHJlYWRvbmx5IHsgbmFtZTogc3RyaW5nOyBnZW5lczogcmVhZG9ubHkgc3RyaW5nW10gfVtdLFxuKTogR2VuZVRyZWVOb2RlW10ge1xuICBjb25zdCBjaG9zZW4gPSBuZXcgU2V0KHNlbGVjdGVkKTtcbiAgY29uc3QgZ3JvdXBlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBvdXQ6IEdlbmVUcmVlTm9kZVtdID0gW107XG4gIGZvciAoY29uc3QgZyBvZiBncm91cHMpIHtcbiAgICBjb25zdCBnZW5lcyA9IGcuZ2VuZXMuZmlsdGVyKCh4KSA9PiBjaG9zZW4uaGFzKHgpKTtcbiAgICBpZiAoIWdlbmVzLmxlbmd0aCkgY29udGludWU7XG4gICAgZ2VuZXMuZm9yRWFjaCgoeCkgPT4gZ3JvdXBlZC5hZGQoeCkpO1xuICAgIG91dC5wdXNoKHsgbmFtZTogZy5uYW1lLCBnZW5lcyB9KTtcbiAgfVxuICBjb25zdCByZXN0ID0gc2VsZWN0ZWQuZmlsdGVyKCh4KSA9PiAhZ3JvdXBlZC5oYXMoeCkpO1xuICBpZiAocmVzdC5sZW5ndGgpIG91dC5wdXNoKHsgbmFtZTogbnVsbCwgZ2VuZXM6IHJlc3QgfSk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBFdmVyeSBjYXRlZ29yaWNhbCBjb2x1bW4gYnV0IHRoZSBzZWdtZW50YXRpb24gbWV0aG9kLCB3aGljaCBzYXlzIG5vdGhpbmcgYWJvdXQgZ2VuZXMuICovXG5leHBvcnQgZnVuY3Rpb24gbWFya2VyQ29sdW1uT3B0aW9ucyhjb2x1bW5zOiByZWFkb25seSBTcGF0aWFsQ29sdW1uTWV0YVtdIHwgdW5kZWZpbmVkKTogUGFuZWxPcHRpb248c3RyaW5nPltdIHtcbiAgcmV0dXJuIChjb2x1bW5zID8/IFtdKVxuICAgIC5maWx0ZXIoKGMpOiBjIGlzIENhdGVnb3JpY2FsQ29sdW1uTWV0YSA9PiBjLmtpbmQgPT09ICdjYXRlZ29yaWNhbCcgJiYgYy5uYW1lICE9PSAnc2VnbWVudGF0aW9uX21ldGhvZCcpXG4gICAgLm1hcCgoYykgPT4gKHsgbGFiZWw6IGdyb3VwTGFiZWwoYyksIHZhbHVlOiBjLm5hbWUgfSkpO1xufVxuXG4vKipcbiAqIEVhY2ggcGlja2VkIGNsdXN0ZXIncyBtYXJrZXIgZ2VuZXMgYXMgYSBnZW5lIGdyb3VwIG5hbWVkIGFmdGVyIGl0LiBBIGdlbmUgdGhhdCBtYXJrc1xuICogc2V2ZXJhbCBjbHVzdGVycyBnb2VzIHRvIHRoZSBvbmUgaXQgc2NvcmVzIGhpZ2hlc3QgaW4sIHNvIHRoZSB0cmVlIGxpc3RzIGl0IG9uY2U7XG4gKiBjbHVzdGVycyBsZWZ0IHdpdGggbm8gZ2VuZSBhcmUgZHJvcHBlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtlckdlbmVHcm91cHMoXG4gIHJlc3VsdDogUGljazxTcGF0aWFsTWFya2VyR2VuZXMsICdncm91cHMnPixcbiAgcGlja2VkOiBSZWFkb25seVNldDxzdHJpbmc+LFxuKTogeyBuYW1lOiBzdHJpbmc7IGdlbmVzOiBzdHJpbmdbXSB9W10ge1xuICBjb25zdCBiZXN0ID0gbmV3IE1hcDxzdHJpbmcsIHsgZ3JvdXA6IHN0cmluZzsgc2NvcmU6IG51bWJlciB9PigpO1xuICBmb3IgKGNvbnN0IGcgb2YgcmVzdWx0Lmdyb3Vwcykge1xuICAgIGlmICghcGlja2VkLmhhcyhnLm5hbWUpKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IGdlbmUgb2YgZy5nZW5lcykge1xuICAgICAgY29uc3QgcHJldiA9IGJlc3QuZ2V0KGdlbmUubmFtZSk7XG4gICAgICBpZiAoIXByZXYgfHwgZ2VuZS5zY29yZSA+IHByZXYuc2NvcmUpIGJlc3Quc2V0KGdlbmUubmFtZSwgeyBncm91cDogZy5uYW1lLCBzY29yZTogZ2VuZS5zY29yZSB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdC5ncm91cHNcbiAgICAuZmlsdGVyKChnKSA9PiBwaWNrZWQuaGFzKGcubmFtZSkpXG4gICAgLm1hcCgoZykgPT4gKHtcbiAgICAgIG5hbWU6IGcubmFtZSxcbiAgICAgIGdlbmVzOiBnLmdlbmVzLm1hcCgoeCkgPT4geC5uYW1lKS5maWx0ZXIoKG4pID0+IGJlc3QuZ2V0KG4pPy5ncm91cCA9PT0gZy5uYW1lKSxcbiAgICB9KSlcbiAgICAuZmlsdGVyKChnKSA9PiBnLmdlbmVzLmxlbmd0aCk7XG59XG5cbi8qKiBgZ3JvdXBzYCBtZXJnZWQgaW50byB0aGUgdmlldydzIGdlbmUgZ3JvdXBzIChyZXBsYWNpbmcgYW55IG9mIHRoZSBzYW1lIG5hbWUpLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhHZW5lR3JvdXBzKFxuICB2aWV3OiBQaWNrPFNwYXRpYWxWaWV3U3RhdGUsICd0cmFuc2NyaXB0R2VuZUdyb3Vwcyc+LFxuICBncm91cHM6IHsgbmFtZTogc3RyaW5nOyBnZW5lczogc3RyaW5nW10gfVtdLFxuKTogU3BhdGlhbFZpZXdTdGF0ZVsndHJhbnNjcmlwdEdlbmVHcm91cHMnXSB7XG4gIGNvbnN0IG5hbWVzID0gbmV3IFNldChncm91cHMubWFwKChnKSA9PiBnLm5hbWUpKTtcbiAgcmV0dXJuIFsuLi52aWV3LnRyYW5zY3JpcHRHZW5lR3JvdXBzLmZpbHRlcigoZykgPT4gIW5hbWVzLmhhcyhnLm5hbWUpKSwgLi4uZ3JvdXBzXTtcbn1cblxuLyoqXG4gKiBUaGUgcGF0Y2ggdGhhdCBhZGRzIG1hcmtlciBncm91cHM6IHRoZSBncm91cHMsIHRoZWlyIGdlbmVzIGFwcGVuZGVkIHRvIHRoZSBzZWxlY3Rpb24sXG4gKiB0cmFuc2NyaXB0cyBjb2xvdXJlZCBieSBjbHVzdGVyIChhcyB0aGVpciBjZWxscyBhcmUpLCBhbmQgc3dpdGNoZWQgb24gd2hlbiBvZmYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrZXJHZW5lc1BhdGNoKFxuICB2aWV3OiBQaWNrPFNwYXRpYWxWaWV3U3RhdGUsICd0cmFuc2NyaXB0R2VuZUdyb3VwcycgfCAndHJhbnNjcmlwdEdlbmVzJyB8ICd0cmFuc2NyaXB0TW9kZSc+LFxuICBncm91cHM6IHsgbmFtZTogc3RyaW5nOyBnZW5lczogc3RyaW5nW10gfVtdLFxuKTogUGFydGlhbDxTcGF0aWFsVmlld1N0YXRlPiB7XG4gIGNvbnN0IGdlbmVzID0gWy4uLnZpZXcudHJhbnNjcmlwdEdlbmVzXTtcbiAgZm9yIChjb25zdCBnIG9mIGdyb3VwcykgZm9yIChjb25zdCBuIG9mIGcuZ2VuZXMpIGlmICghZ2VuZXMuaW5jbHVkZXMobikpIGdlbmVzLnB1c2gobik7XG4gIHJldHVybiB7XG4gICAgdHJhbnNjcmlwdEdlbmVHcm91cHM6IHdpdGhHZW5lR3JvdXBzKHZpZXcsIGdyb3VwcyksXG4gICAgdHJhbnNjcmlwdEdlbmVzOiBnZW5lcyxcbiAgICB0cmFuc2NyaXB0Q29sb3JCeTogJ2NsdXN0ZXInLFxuICAgIC4uLih2aWV3LnRyYW5zY3JpcHRNb2RlID09PSAnb2ZmJyA/IHsgdHJhbnNjcmlwdE1vZGU6ICdjaXJjbGVzJyBhcyBjb25zdCB9IDoge30pLFxuICB9O1xufVxuXG4vKiogVGhlIHBhdGNoIHRoYXQgaW1wb3J0cyBnZW5lIGdyb3VwczogdGhlIGdyb3VwcywgYW5kIHRoZWlyIGdlbmVzIGFkZGVkIHRvIHRoZSBzZWxlY3Rpb24uICovXG5leHBvcnQgZnVuY3Rpb24gaW1wb3J0R2VuZUdyb3Vwc1BhdGNoKFxuICB2aWV3OiBQaWNrPFNwYXRpYWxWaWV3U3RhdGUsICd0cmFuc2NyaXB0R2VuZUdyb3VwcycgfCAndHJhbnNjcmlwdEdlbmVzJz4sXG4gIGdyb3VwczogeyBuYW1lOiBzdHJpbmc7IGdlbmVzOiBzdHJpbmdbXSB9W10sXG4pOiBQYXJ0aWFsPFNwYXRpYWxWaWV3U3RhdGU+IHtcbiAgcmV0dXJuIHtcbiAgICB0cmFuc2NyaXB0R2VuZUdyb3Vwczogd2l0aEdlbmVHcm91cHModmlldywgZ3JvdXBzKSxcbiAgICB0cmFuc2NyaXB0R2VuZXM6IFsuLi5uZXcgU2V0KFsuLi52aWV3LnRyYW5zY3JpcHRHZW5lcywgLi4uZ3JvdXBzLmZsYXRNYXAoKGcpID0+IGcuZ2VuZXMpXSldLFxuICAgIHRyYW5zY3JpcHRBbGxHZW5lczogZmFsc2UsXG4gIH07XG59XG5cbi8qKiBgbGluZWFyLWdyYWRpZW50KC4uLilgIHNhbXBsaW5nIGBsdXRgIGF0IGBzdGVwcyArIDFgIGV2ZW5seSBzcGFjZWQgc3RvcHMuICovXG5leHBvcnQgZnVuY3Rpb24gZ3JhZGllbnRDc3MobHV0OiByZWFkb25seSBSZ2JbXSwgc3RlcHMgPSAxNik6IHN0cmluZyB7XG4gIGNvbnN0IHN0b3BzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8PSBzdGVwczsgaSsrKSB7XG4gICAgY29uc3QgW3IsIGcsIGJdID0gbHV0W01hdGgucm91bmQoKGkgLyBzdGVwcykgKiAobHV0Lmxlbmd0aCAtIDEpKV07XG4gICAgc3RvcHMucHVzaChgcmdiKCR7cn0sJHtnfSwke2J9KSAkeygoaSAvIHN0ZXBzKSAqIDEwMCkudG9GaXhlZCgwKX0lYCk7XG4gIH1cbiAgcmV0dXJuIGBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICR7c3RvcHMuam9pbignLCAnKX0pYDtcbn1cblxuLyoqXG4gKiBUaGUgY29udGludW91cyBjb2xvdXIgYmFyLCByZXNvbHZlZCBleGFjdGx5IHRoZSB3YXkgdGhlIHJlbmRlcmVyIHJlc29sdmVzIGl0cyBjb2xvdXJzIOKAlFxuICogdGhlIHNhbWUgb3ZlcnJpZGUsIHRoZSBzYW1lIGdyZXkgZmFsbGJhY2suIEJ1aWx0IGZyb20gYGx1dEZvcmAgYWxvbmUsIHRoaXMgYmFyIHNob3dlZCBhXG4gKiBibGFjay10by13aGl0ZSByYW1wIHdoaWxlIHRoZSBjYW52YXMgZHJldyBWaXJpZGlzLCB3aGljaCBtYWtlcyB0aGUga2V5IHdvcnNlIHRoYW4gbm9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnRpbnVvdXNDb2xvckJhckNzcyhcbiAgY29sb3JtYXA6IHVua25vd24sXG4gIHJldmVyc2U6IGJvb2xlYW4sXG4gIG92ZXJyaWRlOiBDb2xvcm1hcFZhbHVlIHwgbnVsbCxcbik6IHN0cmluZyB7XG4gIHJldHVybiBncmFkaWVudENzcyhzcGF0aWFsQ29udGludW91c0x1dChjb2xvcm1hcCwgcmV2ZXJzZSwgb3ZlcnJpZGUpKTtcbn1cblxuLyoqIFRoZSBkZW5zaXR5IG1hcCdzIGNvbG91ciBiYXI6IGl0cyBvd24gY29sb3JtYXAsIEluZmVybm8gYnkgZGVmYXVsdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZW5zaXR5Q29sb3JCYXJDc3MoY29sb3JtYXA6IFNwYXRpYWxWaWV3U3RhdGVbJ2RlbnNpdHlDb2xvcm1hcCddKTogc3RyaW5nIHtcbiAgcmV0dXJuIGdyYWRpZW50Q3NzKGx1dEZvcihjb2xvcm1hcCA/PyBJTkZFUk5PX0xVVCkpO1xufVxuXG4vKiogVGhlIG1pZGRsZSBvZiBhIHNlY3Rpb24gc3RhY2s6IHdoZXJlIGEgXCJvbmUgc2VjdGlvblwiIHBpY2tlciBvcGVucywgcmF0aGVyIHRoYW4gb24gdGhlXG4gKiAgZmlyc3Qgc2VjdGlvbiwgd2hpY2ggZm9yIGEgYnJhaW4gaXMgYSBuZWFybHkgZW1wdHkgb2xmYWN0b3J5LWJ1bGIgc2xpZGUuICovXG5leHBvcnQgZnVuY3Rpb24gbWlkZGxlU2VjdGlvbihzZWN0aW9uczogQXJyYXlMaWtlPG51bWJlcj4gfCBudWxsKTogbnVtYmVyIHtcbiAgcmV0dXJuIHNlY3Rpb25zID8gTWF0aC5mbG9vcigoc2VjdGlvbnMubGVuZ3RoIC0gMSkgLyAyKSA6IDA7XG59XG5cbi8qKiBcIjEyIG9mIDUzXCIg4oCUIDEtYmFzZWQsIGJlY2F1c2UgdGhlIHNlY3Rpb25zIGFyZSBzbGlkZXMsIG5vdCBhcnJheSBzbG90czsgYCcnYCB3aXRoIG5vbmUuICovXG5leHBvcnQgZnVuY3Rpb24gc2VjdGlvbkxhYmVsKHNlY3Rpb25zOiBBcnJheUxpa2U8bnVtYmVyPiB8IG51bGwsIGF0OiBudW1iZXIgfCBudWxsKTogc3RyaW5nIHtcbiAgY29uc3QgdG90YWwgPSBzZWN0aW9ucz8ubGVuZ3RoID8/IDA7XG4gIGlmICghdG90YWwpIHJldHVybiAnJztcbiAgY29uc3QgaSA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRvdGFsIC0gMSwgYXQgPz8gMCkpO1xuICByZXR1cm4gYCR7aSArIDF9IG9mICR7dG90YWx9YDtcbn1cblxuLyoqIFdoeSBcIkFsbCBnZW5lc1wiIGlzIG5vdCBvZmZlcmVkIHlldCwgd2hpbGUgdGhlIHNlcnZlciBidWlsZHMgaXRzIHB5cmFtaWQ7IG51bGwgb3RoZXJ3aXNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFsbEdlbmVzUHJlcGFyaW5nTm90ZShkczogU3BhdGlhbERhdGFzZXQgfCBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHN0ID0gZHM/LnRyYW5zY3JpcHRCaW5zU3RhdHVzO1xuICBpZiAoIXN0IHx8IGRzPy50cmFuc2NyaXB0QmlucykgcmV0dXJuIG51bGw7XG4gIGlmIChzdC5zdGF0ZSA9PT0gJ2ZhaWxlZCcpXG4gICAgcmV0dXJuIGBcIkFsbCBnZW5lc1wiIGlzIHVuYXZhaWxhYmxlOiBwcmVwYXJpbmcgaXQgZmFpbGVkICgke3N0Lm1lc3NhZ2UgPz8gJ3Vua25vd24gZXJyb3InfSkuYDtcbiAgY29uc3QgcGN0ID0gc3QudG90YWwgPyBgIOKAlCAke01hdGguZmxvb3IoKDEwMCAqIChzdC5kb25lID8/IDApKSAvIHN0LnRvdGFsKX0lIHdoZW4gdGhpcyBkYXRhc2V0IHdhcyBvcGVuZWRgIDogJyc7XG4gIHJldHVybiBgXCJBbGwgZ2VuZXNcIiBpcyBiZWluZyBwcmVwYXJlZCBvbiB0aGUgc2VydmVyJHtwY3R9OyByZW9wZW4gdGhlIGRhdGFzZXQgb25jZSBpdCBpcyBkb25lLmA7XG59XG4iXX0=
|
|
@@ -93,4 +93,4 @@ export function sectionsOf(obs) {
|
|
|
93
93
|
memo.set(obs, sections);
|
|
94
94
|
return sections;
|
|
95
95
|
}
|
|
96
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
96
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhdGlhbC1zZWN0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3BhdGlhbC9zcGF0aWFsLXNlY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUVIOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxDQUFDO0FBRXhDOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsR0FBd0IsRUFBRSxHQUFHLEdBQUcsb0JBQW9CO0lBQ2xGLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEIsSUFBSSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsS0FBSyxLQUFLLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUV2QyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQy9CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDbkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2YsOEVBQThFO1FBQzlFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUFFLFNBQVM7UUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNaLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHO1lBQUUsT0FBTyxJQUFJLENBQUM7SUFDbkMsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDakMsT0FBTyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQ3hDLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQUMsR0FBd0IsRUFBRSxDQUFTO0lBQ3ZFLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDakIsSUFBSSxDQUFDLEVBQUU7UUFBRSxPQUFPLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25DLE1BQU0sR0FBRyxHQUFHLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ25DLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUVELGdFQUFnRTtBQUNoRSxNQUFNLElBQUksR0FBRyxJQUFJLE9BQU8sRUFBNEMsQ0FBQztBQUVyRTs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUFDLEdBQXdCO0lBQ2pELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUIsSUFBSSxHQUFHLEtBQUssU0FBUztRQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ2xDLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN4QixPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3BhdGlhbE9ic2VydmF0aW9ucyB9IGZyb20gJy4uL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuXG4vKipcbiAqIFRoZSBwbGFuZXMgYSAqKnNlcmlhbGx5IHNlY3Rpb25lZCoqIGRhdGFzZXQgd2FzIGFjdHVhbGx5IGltYWdlZCBhdC5cbiAqXG4gKiBBIDNEIHNwYXRpYWwtb21pY3MgZGF0YXNldCBvZiB0aGlzIGtpbmQgaXMgbm90IGEgY2xvdWQgdGhhdCBoYXBwZW5zIHRvIGhhdmUgYSB6OlxuICogaXQgaXMgYSBzdGFjayBvZiB0aGluIHNlY3Rpb25zLCBodW5kcmVkcyBvZiBtaWNyb25zIGFwYXJ0LCBlYWNoIG9uZSBhIHNlcGFyYXRlXG4gKiBzbGlkZS4gRXZlcnkgb2JzZXJ2YXRpb24gb24gYSBnaXZlbiBzbGlkZSBzaGFyZXMgdGhhdCBzbGlkZSdzIHJlZ2lzdGVyZWQgelxuICogZXhhY3RseSwgc28gdGhlIGRpc3RpbmN0IHogdmFsdWVzIEFSRSB0aGUgc2VjdGlvbnMg4oCUIG5vIGJpbm5pbmcsIG5vIHRvbGVyYW5jZSxcbiAqIGFuZCBubyBuZWVkIGZvciBhIGRhdGFzZXQtc3BlY2lmaWMgc2VjdGlvbi1sYWJlbCBjb2x1bW4uXG4gKlxuICogVGhhdCBtYXR0ZXJzIGZvciB0aGUgM0Qgdmlldywgd2hlcmUgdGhlIGNsb3VkIHJlYWRzIGFzIGEgc3RhY2sgb2YgZGlzY3MgYW5kIHRoZVxuICogZGlzY3MgaGlkZSB0aGUgZGVuc2l0eSB2b2x1bWVzIGRyYXduIGJldHdlZW4gdGhlbS4gQmVpbmcgYWJsZSB0byBzaG93IG9uZVxuICogc2VjdGlvbidzIGNlbGxzIGFnYWluc3QgdGhlIGVzdGltYXRlZCBmaWVsZCBpcyBob3cgeW91IGNoZWNrIHRoZSBlc3RpbWF0ZSBhZ2FpbnN0XG4gKiB0aGUgbWVhc3VyZW1lbnQ7IGJlaW5nIGFibGUgdG8gaGlkZSB0aGVtIGlzIGhvdyB5b3Ugc2VlIHRoZSBmaWVsZCBhdCBhbGwuXG4gKlxuICogRGVsaWJlcmF0ZWx5IE5PVCBhIGJpbm5pbmcgb2YgYSBjb250aW51b3VzIHogKHRoYXQgaXNcbiAqIGBvYnNlcnZhdGlvbnNJblNsaWNlYCdzIGpvYiwgYWdhaW5zdCBhIHZvbHVtZSdzIHZveGVsIHBsYW5lcykuIElmIHRoZSB6IGlzXG4gKiBjb250aW51b3VzIHJhdGhlciB0aGFuIHNlY3Rpb25lZCB0aGVyZSBhcmUgbm8gc2VjdGlvbnMgdG8gb2ZmZXIsIGFuZFxuICoge0BsaW5rIHNhbXBsZWRTZWN0aW9uc30gc2F5cyBzbyBieSByZXR1cm5pbmcgbnVsbCByYXRoZXIgdGhhbiBpbnZlbnRpbmcgc29tZS5cbiAqXG4gKiBQdXJlIOKAlCBubyBBbmd1bGFyLCBubyBHUFUg4oCUIGxpa2UgYHNwYXRpYWwtZGVuc2l0eS50c2AsIGFuZCB0ZXN0ZWQgdGhlIHNhbWUgd2F5LlxuICovXG5cbi8qKlxuICogRGlzdGluY3QgeiB2YWx1ZXMgYmV5b25kIHdoaWNoIHRoZSBkYXRhIGlzIHRyZWF0ZWQgYXMgY29udGludW91cyByYXRoZXIgdGhhblxuICogc2VjdGlvbmVkLiBTZXJpYWwgc2VjdGlvbmluZyBydW5zIHRvIHRlbnMgb3IgbG93IGh1bmRyZWRzIG9mIHNsaWRlcyAoNTMgZm9yIHRoZVxuICogQUJDIHdob2xlLWJyYWluIE1FUkZJU0ggYXRsYXMpOyBhIHogdGhhdCBrZWVwcyBwcm9kdWNpbmcgbmV3IHZhbHVlcyBpcyBhXG4gKiBtZWFzdXJlbWVudCBheGlzLCBhbmQgYSBcInBpY2sgb25lIHNlY3Rpb25cIiBjb250cm9sIG92ZXIgaXQgd291bGQgYmUgYSBsaWUuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVhfU0FNUExFRF9TRUNUSU9OUyA9IDUxMjtcblxuLyoqXG4gKiBUaGUgZGF0YXNldCdzIHNhbXBsZWQgc2VjdGlvbiBwb3NpdGlvbnMsIGFzY2VuZGluZyDigJQgb3IgbnVsbCB3aGVuIGl0IGhhcyBubyB6LFxuICogbm8gb2JzZXJ2YXRpb25zLCBvciBhIHogdG9vIGZpbmVseSBkaXZpZGVkIHRvIGJlIHNlY3Rpb25zIGF0IGFsbC5cbiAqXG4gKiBCYWlscyBvdXQgYXMgc29vbiBhcyB0aGUgZGlzdGluY3QgY291bnQgcGFzc2VzIGBtYXhgLCBzbyBhIGNvbnRpbnVvdXMgeiBjb3N0cyBvbmVcbiAqIHBhcnRpYWwgcGFzcyByYXRoZXIgdGhhbiBhIHNldCB3aXRoIG9uZSBlbnRyeSBwZXIgb2JzZXJ2YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW1wbGVkU2VjdGlvbnMob2JzOiBTcGF0aWFsT2JzZXJ2YXRpb25zLCBtYXggPSBNQVhfU0FNUExFRF9TRUNUSU9OUyk6IEZsb2F0MzJBcnJheSB8IG51bGwge1xuICBjb25zdCB6ID0gb2JzLno7XG4gIGlmICgheiB8fCBvYnMuY291bnQgPT09IDApIHJldHVybiBudWxsO1xuXG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYnMuY291bnQ7IGkrKykge1xuICAgIGNvbnN0IHYgPSB6W2ldO1xuICAgIC8vIEEgbm9uLWZpbml0ZSB6IHBsYWNlcyBhbiBvYnNlcnZhdGlvbiBvbiBubyBzZWN0aW9uOyBpdCBtdXN0IG5vdCBiZWNvbWUgb25lLlxuICAgIGlmICghTnVtYmVyLmlzRmluaXRlKHYpKSBjb250aW51ZTtcbiAgICBzZWVuLmFkZCh2KTtcbiAgICBpZiAoc2Vlbi5zaXplID4gbWF4KSByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoc2Vlbi5zaXplID09PSAwKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIEZsb2F0MzJBcnJheS5mcm9tKHNlZW4pLnNvcnQoKTtcbn1cblxuLyoqXG4gKiBJbmRpY2VzIG9mIHRoZSBvYnNlcnZhdGlvbnMgbHlpbmcgb24gb25lIHNhbXBsZWQgc2VjdGlvbi5cbiAqXG4gKiBFeGFjdCBlcXVhbGl0eSBvbiBwdXJwb3NlOiBgemAgY29tZXMgZnJvbSB7QGxpbmsgc2FtcGxlZFNlY3Rpb25zfSwgd2hpY2ggcmVhZCB0aGVcbiAqIHZhbHVlcyBvdXQgb2YgdGhpcyBzYW1lIGFycmF5LCBzbyB0aGUgY29tcGFyaXNvbiBjYW5ub3QgZHJpZnQuIFBhc3NpbmcgYSB6IHRoYXRcbiAqIGlzIG5vdCBvbmUgb2YgdGhlIHNhbXBsZWQgcG9zaXRpb25zIHlpZWxkcyBub3RoaW5nLCB3aGljaCBpcyB0aGUgaG9uZXN0IGFuc3dlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9ic2VydmF0aW9uc0luU2VjdGlvbihvYnM6IFNwYXRpYWxPYnNlcnZhdGlvbnMsIHo6IG51bWJlcik6IFVpbnQzMkFycmF5IHtcbiAgY29uc3QgenMgPSBvYnMuejtcbiAgaWYgKCF6cykgcmV0dXJuIG5ldyBVaW50MzJBcnJheSgwKTtcbiAgY29uc3Qgb3V0ID0gbmV3IFVpbnQzMkFycmF5KG9icy5jb3VudCk7XG4gIGxldCBuID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYnMuY291bnQ7IGkrKykge1xuICAgIGlmICh6c1tpXSA9PT0geikgb3V0W24rK10gPSBpO1xuICB9XG4gIHJldHVybiBvdXQuc3ViYXJyYXkoMCwgbik7XG59XG5cbi8qKiBNZW1vaXplZCBwZXIgb2JzZXJ2YXRpb25zIG9iamVjdDsgc2VlIHtAbGluayBzZWN0aW9uc09mfS4gKi9cbmNvbnN0IG1lbW8gPSBuZXcgV2Vha01hcDxTcGF0aWFsT2JzZXJ2YXRpb25zLCBGbG9hdDMyQXJyYXkgfCBudWxsPigpO1xuXG4vKipcbiAqIHtAbGluayBzYW1wbGVkU2VjdGlvbnN9IGZvciBhIGRhdGFzZXQncyBvYnNlcnZhdGlvbnMsIGNvbXB1dGVkIG9uY2UuXG4gKlxuICogQm90aCB0aGUgcmVuZGVyZXIgKHdoaWNoIGZpbHRlcnMgdGhlIGNsb3VkJ3MgZ2VvbWV0cnkgdG8gb25lIHNlY3Rpb24pIGFuZCB0aGVcbiAqIGNvbnRyb2wgcGFuZWwgKHdoaWNoIG9mZmVycyB0aGUgc2VjdGlvbnMgdG8gcGljayBmcm9tKSBuZWVkIHRoaXMgbGlzdCwgYW5kIHRoZVxuICogc2NhbiByZWFkcyB0aGUgeiBvZiB1cCB0byAzLjdNIG9ic2VydmF0aW9ucyDigJQgc28gaXQgaXMgbWVtb2l6ZWQgb24gdGhlXG4gKiBvYnNlcnZhdGlvbnMgb2JqZWN0IGl0c2VsZiByYXRoZXIgdGhhbiBlYWNoIGNhbGxlciBrZWVwaW5nIGl0cyBvd24gY29weSBrZXllZCBieVxuICogYSBkYXRhc2V0IGlkIGl0IGhhcyB0byByZW1lbWJlciB0byBpbnZhbGlkYXRlLiBTdGlsbCByZWZlcmVudGlhbGx5IHRyYW5zcGFyZW50OlxuICogdGhlIHNhbWUgb2JzZXJ2YXRpb25zIGFsd2F5cyBnaXZlIHRoZSBzYW1lIHNlY3Rpb25zLlxuICpcbiAqIERlZmF1bHQgYG1heGAgb25seTsgYSBjYWxsZXIgd2FudGluZyBhIGRpZmZlcmVudCBjYXAgc2hvdWxkIGNhbGxcbiAqIHtAbGluayBzYW1wbGVkU2VjdGlvbnN9IGRpcmVjdGx5IGFuZCBjYWNoZSBpdCBpdHNlbGYuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZWN0aW9uc09mKG9iczogU3BhdGlhbE9ic2VydmF0aW9ucyk6IEZsb2F0MzJBcnJheSB8IG51bGwge1xuICBjb25zdCBoaXQgPSBtZW1vLmdldChvYnMpO1xuICBpZiAoaGl0ICE9PSB1bmRlZmluZWQpIHJldHVybiBoaXQ7XG4gIGNvbnN0IHNlY3Rpb25zID0gc2FtcGxlZFNlY3Rpb25zKG9icyk7XG4gIG1lbW8uc2V0KG9icywgc2VjdGlvbnMpO1xuICByZXR1cm4gc2VjdGlvbnM7XG59XG4iXX0=
|