@jax-data-science/sci-image-visualizer 0.8.3 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +201 -460
- package/esm2022/index.mjs +34 -15
- package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +163 -91
- package/esm2022/lib/contracts/capabilities.contract.mjs +4 -3
- package/esm2022/lib/contracts/cell-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +5 -1
- package/esm2022/lib/contracts/color.mjs +60 -0
- package/esm2022/lib/contracts/colormap-lut.mjs +213 -57
- package/esm2022/lib/contracts/coordinate-transform.contract.mjs +1 -1
- package/esm2022/lib/contracts/display-types.mjs +11 -1
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/intensity.mjs +48 -5
- package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
- package/esm2022/lib/contracts/plot-type.mjs +134 -17
- package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
- package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
- package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
- package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
- package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
- package/esm2022/lib/contracts/sam.contract.mjs +1 -1
- package/esm2022/lib/contracts/section-view.contract.mjs +2 -0
- package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
- package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/contracts/viz-config.mjs +2 -1
- package/esm2022/lib/geometry/contour.mjs +63 -0
- package/esm2022/lib/geometry/loft.mjs +128 -0
- package/esm2022/lib/geometry/polylabel.mjs +156 -0
- package/esm2022/lib/geometry/raster.mjs +98 -0
- package/esm2022/lib/geometry/reconstruct.mjs +315 -0
- package/esm2022/lib/geometry/reslice-image.mjs +57 -0
- package/esm2022/lib/geometry/ring.mjs +201 -0
- package/esm2022/lib/geometry/section.mjs +215 -0
- package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
- package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
- package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
- package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
- package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
- package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
- package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +12 -9
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +83 -0
- package/esm2022/lib/implementations/napari-js/napari-region-mesh-pointer.mjs +100 -0
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +180 -591
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +270 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
- package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
- package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
- package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
- package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +347 -0
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +427 -4207
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +129 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +550 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-slice-planes.mjs +103 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
- package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +194 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
- package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
- package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
- package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
- package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
- package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
- package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
- package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
- package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
- package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +164 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +213 -716
- package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
- package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
- package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
- package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
- package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
- package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
- package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
- package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
- package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
- package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
- package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
- package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
- package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
- package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
- package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
- package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
- package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
- package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
- package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
- package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
- package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
- package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
- package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
- package/esm2022/lib/implementations/region-centroids.mjs +47 -0
- package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
- package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
- package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
- package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
- package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
- package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
- package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
- package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
- package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
- package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
- package/esm2022/lib/models/bezier.mjs +1 -11
- package/esm2022/lib/models/class-preset.mjs +41 -3
- package/esm2022/lib/models/geometry.mjs +27 -164
- package/esm2022/lib/models/polygon-edit.mjs +254 -0
- package/esm2022/lib/models/polygon-factory.mjs +134 -0
- package/esm2022/lib/models/region-clone.mjs +68 -0
- package/esm2022/lib/models/region-geojson.mjs +411 -0
- package/esm2022/lib/models/region.mjs +34 -33
- package/esm2022/lib/models/shape.mjs +18 -16
- package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
- package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
- package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
- package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
- package/esm2022/lib/plot.utilities.mjs +296 -473
- package/esm2022/lib/processing/image-crop.mjs +1 -1
- package/esm2022/lib/processing/processing-image.mjs +28 -15
- package/esm2022/lib/provide-visualization.mjs +40 -14
- package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +156 -0
- package/esm2022/lib/region-editor/class-tree/class-tree.mjs +108 -0
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +163 -0
- package/esm2022/lib/region-editor/file-stem.mjs +13 -0
- package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
- package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
- package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
- package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
- package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
- package/esm2022/lib/region-editor/region-editor.component.mjs +896 -660
- package/esm2022/lib/region-editor/region-metrics.mjs +86 -0
- package/esm2022/lib/region-editor/region-persistence.service.mjs +160 -0
- package/esm2022/lib/region-editor/region-table/region-table.component.mjs +169 -0
- package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
- package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
- package/esm2022/lib/region-ops.service.mjs +28 -70
- package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
- package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
- package/esm2022/lib/region-overlay/region-source-layer.mjs +378 -0
- package/esm2022/lib/region-overlay/region-style.mjs +97 -0
- package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
- package/esm2022/lib/region-source/http-region-source.mjs +104 -0
- package/esm2022/lib/region-source/region-source-ops.mjs +53 -0
- package/esm2022/lib/region-source/region-source-worker.mjs +10 -0
- package/esm2022/lib/region-source/region-source.mjs +67 -0
- package/esm2022/lib/region-source/region-tiles.mjs +708 -0
- package/esm2022/lib/region-source/worker-region-source.mjs +229 -0
- package/esm2022/lib/render-orchestrator.mjs +14 -11
- package/esm2022/lib/render-session.mjs +207 -0
- package/esm2022/lib/routing-visualizer.service.mjs +858 -414
- package/esm2022/lib/section-pane/section-pane.component.mjs +299 -0
- package/esm2022/lib/spatial/density-raster.mjs +14 -0
- package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
- package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
- package/esm2022/lib/spatial/gene-search.mjs +1 -1
- package/esm2022/lib/spatial/glyphs.mjs +97 -0
- package/esm2022/lib/spatial/lod.mjs +187 -0
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
- package/esm2022/lib/spatial/spatial-density.mjs +25 -16
- package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
- package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
- package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
- package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
- package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
- package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
- package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
- package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
- package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
- package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
- package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
- package/esm2022/lib/spatial/stats.mjs +71 -0
- package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
- package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
- package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
- package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
- package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
- package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
- package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
- package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
- package/esm2022/lib/store/class-color.util.mjs +53 -5
- package/esm2022/lib/store/class-signatures.mjs +63 -0
- package/esm2022/lib/store/region-history.mjs +146 -0
- package/esm2022/lib/store/region-scope-cache.mjs +144 -0
- package/esm2022/lib/store/region-selection.mjs +82 -0
- package/esm2022/lib/store/region-source-scope.mjs +171 -0
- package/esm2022/lib/store/region-store.service.mjs +986 -670
- package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
- package/esm2022/lib/store/visualizer-store.service.mjs +81 -76
- package/esm2022/lib/toast-outlets.mjs +5 -4
- package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
- package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
- package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
- package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
- package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
- package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +120 -0
- package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
- package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
- package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
- package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
- package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
- package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
- package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
- package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
- package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
- package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
- package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
- package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
- package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
- package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +121 -0
- package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
- package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
- package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
- package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
- package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
- package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
- package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
- package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
- package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
- package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
- package/esm2022/lib/toolbar/toolbar.component.mjs +84 -119
- package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
- package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
- package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
- package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
- package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
- package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
- package/esm2022/lib/util/mark-for-check.mjs +17 -0
- package/esm2022/lib/util/supersede.mjs +56 -0
- package/esm2022/lib/visualization.module.mjs +39 -141
- package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
- package/esm2022/lib/visualizer/region-actions.mjs +149 -0
- package/esm2022/lib/visualizer/region-load.mjs +123 -0
- package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
- package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
- package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
- package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
- package/esm2022/lib/visualizer/volume-sections.mjs +175 -0
- package/esm2022/lib/visualizer.component.mjs +602 -1902
- package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
- package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
- package/esm2022/lib/workers/spatial-math.mjs +190 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs +47169 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs +238 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34467
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/fesm2022/mask.worker.js +36 -917
- package/fesm2022/onnx-sam.worker.js +52 -16
- package/fesm2022/region-source.worker.js +1067 -0
- package/fesm2022/spatial-math.worker.js +471 -0
- package/fesm2022/tsne.worker.js +32 -15
- package/index.d.ts +19 -10
- package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
- package/lib/contracts/capabilities.contract.d.ts +4 -2
- package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
- package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
- package/lib/contracts/color.d.ts +27 -0
- package/lib/contracts/colormap-lut.d.ts +19 -4
- package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
- package/lib/contracts/display-types.d.ts +21 -0
- package/lib/contracts/image.contract.d.ts +4 -0
- package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
- package/lib/contracts/intensity.d.ts +13 -2
- package/lib/contracts/plot-type.d.ts +3 -1
- package/lib/contracts/ports/image-state.port.d.ts +6 -2
- package/lib/contracts/ports/preferences.port.d.ts +4 -0
- package/lib/contracts/ports/region-io.port.d.ts +1 -0
- package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
- package/lib/contracts/ports/tile-access.port.d.ts +1 -0
- package/lib/contracts/region-editor-api.contract.d.ts +85 -1
- package/lib/contracts/region-overlay.contract.d.ts +5 -0
- package/lib/contracts/region-store.contract.d.ts +22 -0
- package/lib/contracts/sam.contract.d.ts +7 -0
- package/lib/contracts/section-view.contract.d.ts +44 -0
- package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
- package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
- package/lib/contracts/visualizer.contract.d.ts +231 -54
- package/lib/contracts/viz-config.d.ts +9 -0
- package/lib/geometry/contour.d.ts +24 -0
- package/lib/geometry/loft.d.ts +22 -0
- package/lib/geometry/polylabel.d.ts +23 -0
- package/lib/geometry/raster.d.ts +42 -0
- package/lib/geometry/reconstruct.d.ts +54 -0
- package/lib/geometry/reslice-image.d.ts +33 -0
- package/lib/geometry/ring.d.ts +67 -0
- package/lib/geometry/section.d.ts +52 -0
- package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
- package/lib/implementations/base-store-visualizer.d.ts +61 -15
- package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
- package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
- package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
- package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
- package/lib/implementations/napari-js/napari-loading-badge.d.ts +4 -3
- package/lib/implementations/napari-js/napari-loading-state.d.ts +37 -0
- package/lib/implementations/napari-js/napari-region-mesh-pointer.d.ts +32 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +68 -71
- package/lib/implementations/napari-js/napari-scene.d.ts +126 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
- package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
- package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
- package/lib/implementations/napari-js/napari-spatial-hover.d.ts +91 -0
- package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
- package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
- package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
- package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
- package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
- package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +169 -883
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +66 -0
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +148 -0
- package/lib/implementations/napari-js/napari-volume-slice-planes.d.ts +43 -0
- package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
- package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
- package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
- package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
- package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
- package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
- package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
- package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
- package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
- package/lib/implementations/osd/display-pipeline.d.ts +38 -9
- package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
- package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
- package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
- package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
- package/lib/implementations/osd/osd-coords.d.ts +6 -4
- package/lib/implementations/osd/osd-export.d.ts +36 -0
- package/lib/implementations/osd/osd-lib.d.ts +7 -0
- package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
- package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
- package/lib/implementations/osd/osd-region-overlay-draw.d.ts +38 -0
- package/lib/implementations/osd/osd-region-overlay.d.ts +46 -51
- package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
- package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
- package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
- package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
- package/lib/implementations/osd/osd-viewport.d.ts +77 -0
- package/lib/implementations/osd/osd-zoom.d.ts +6 -0
- package/lib/implementations/osd/simple-source.d.ts +161 -0
- package/lib/implementations/osd/slice-cache.d.ts +12 -3
- package/lib/implementations/osd/tile-client.d.ts +11 -14
- package/lib/implementations/osd/tile-recolor.d.ts +141 -0
- package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
- package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
- package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
- package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
- package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
- package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
- package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
- package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
- package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
- package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
- package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
- package/lib/implementations/plotly/plotly.service.d.ts +136 -401
- package/lib/implementations/region-centroids.d.ts +14 -0
- package/lib/implementations/simple-slice-access.service.d.ts +7 -4
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
- package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
- package/lib/implementations/tile-server/index.d.ts +5 -0
- package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
- package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
- package/lib/implementations/tile-server/tile-protocol.d.ts +83 -0
- package/lib/implementations/tile-server/transport.d.ts +62 -0
- package/lib/intensity/intensity-profile.d.ts +66 -0
- package/lib/intensity/intensity-profile.service.d.ts +108 -0
- package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
- package/lib/models/bezier.d.ts +0 -5
- package/lib/models/class-preset.d.ts +25 -0
- package/lib/models/geometry.d.ts +14 -48
- package/lib/models/polygon-edit.d.ts +72 -0
- package/lib/models/polygon-factory.d.ts +45 -0
- package/lib/models/region-clone.d.ts +20 -0
- package/lib/models/region-geojson.d.ts +57 -0
- package/lib/models/region.d.ts +59 -4
- package/lib/models/shape.d.ts +8 -0
- package/lib/plot-mode/contribution-host.d.ts +125 -0
- package/lib/plot-mode/plot-type-menu.d.ts +60 -0
- package/lib/plot-mode/tool-params-model.d.ts +49 -0
- package/lib/plot.utilities.d.ts +19 -30
- package/lib/processing/processing-image.d.ts +5 -2
- package/lib/provide-visualization.d.ts +19 -2
- package/lib/region-editor/class-tree/class-tree.component.d.ts +78 -0
- package/lib/region-editor/class-tree/class-tree.d.ts +31 -0
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +86 -0
- package/lib/region-editor/file-stem.d.ts +7 -0
- package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
- package/lib/region-editor/mask-export.service.d.ts +54 -0
- package/lib/region-editor/mask-raster.d.ts +2 -8
- package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
- package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
- package/lib/region-editor/region-editor.component.d.ts +283 -200
- package/lib/region-editor/region-metrics.d.ts +34 -0
- package/lib/region-editor/region-persistence.service.d.ts +77 -0
- package/lib/region-editor/region-table/region-table.component.d.ts +89 -0
- package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
- package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
- package/lib/region-ops.service.d.ts +1 -7
- package/lib/region-overlay/region-geometry.d.ts +158 -0
- package/lib/region-overlay/region-hit-test.d.ts +38 -0
- package/lib/region-overlay/region-source-layer.d.ts +96 -0
- package/lib/region-overlay/region-style.d.ts +52 -0
- package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
- package/lib/region-source/http-region-source.d.ts +45 -0
- package/lib/region-source/region-source-ops.d.ts +89 -0
- package/lib/region-source/region-source-worker.d.ts +7 -0
- package/lib/region-source/region-source.d.ts +82 -0
- package/lib/region-source/region-tiles.d.ts +289 -0
- package/lib/region-source/worker-region-source.d.ts +65 -0
- package/lib/render-orchestrator.d.ts +6 -2
- package/lib/render-session.d.ts +75 -0
- package/lib/routing-visualizer.service.d.ts +248 -59
- package/lib/section-pane/section-pane.component.d.ts +47 -0
- package/lib/spatial/density-raster.d.ts +6 -0
- package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
- package/lib/spatial/embedding-compute.d.ts +21 -2
- package/lib/spatial/glyphs.d.ts +16 -0
- package/lib/spatial/lod.d.ts +94 -0
- package/lib/spatial/spatial-controls.facade.d.ts +64 -0
- package/lib/spatial/spatial-density.d.ts +15 -5
- package/lib/spatial/spatial-encoding.d.ts +11 -44
- package/lib/spatial/spatial-expression.d.ts +40 -22
- package/lib/spatial/spatial-framing.d.ts +1 -0
- package/lib/spatial/spatial-heatmap.d.ts +2 -0
- package/lib/spatial/spatial-hover.d.ts +4 -16
- package/lib/spatial/spatial-panel-model.d.ts +135 -0
- package/lib/spatial/spatial-selection.d.ts +21 -26
- package/lib/spatial/spatial-tile-merge.d.ts +41 -0
- package/lib/spatial/spatial-tiles.d.ts +9 -256
- package/lib/spatial/stats.d.ts +38 -0
- package/lib/spatial/transcript-grouping.d.ts +119 -0
- package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
- package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
- package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
- package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
- package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
- package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
- package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
- package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
- package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
- package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
- package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
- package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
- package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
- package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
- package/lib/store/class-color.util.d.ts +39 -2
- package/lib/store/class-signatures.d.ts +11 -0
- package/lib/store/region-history.d.ts +66 -0
- package/lib/store/region-scope-cache.d.ts +65 -0
- package/lib/store/region-selection.d.ts +36 -0
- package/lib/store/region-source-scope.d.ts +68 -0
- package/lib/store/region-store.service.d.ts +312 -116
- package/lib/store/visualizer-store.service.d.ts +32 -33
- package/lib/toast-outlets.d.ts +4 -3
- package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
- package/lib/toolbar/canvas-tools.d.ts +20 -0
- package/lib/toolbar/crop/slide-crop.d.ts +10 -4
- package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
- package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
- package/lib/toolbar/region-tools/region-tools.component.d.ts +62 -0
- package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
- package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
- package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
- package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
- package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
- package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
- package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
- package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
- package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
- package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
- package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
- package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
- package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
- package/lib/toolbar/stack-controls/stack-controls.component.d.ts +51 -0
- package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
- package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
- package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
- package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
- package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
- package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
- package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
- package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
- package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
- package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
- package/lib/toolbar/toolbar.component.d.ts +55 -84
- package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
- package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
- package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
- package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
- package/lib/toolbar/wand/wand.service.d.ts +22 -116
- package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
- package/lib/util/mark-for-check.d.ts +11 -0
- package/lib/util/supersede.d.ts +53 -0
- package/lib/visualization.module.d.ts +18 -39
- package/lib/visualizer/floating-drag.directive.d.ts +30 -0
- package/lib/visualizer/region-actions.d.ts +54 -0
- package/lib/visualizer/region-load.d.ts +46 -0
- package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
- package/lib/visualizer/tool-modes.d.ts +49 -0
- package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
- package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
- package/lib/visualizer/volume-sections.d.ts +64 -0
- package/lib/visualizer.component.d.ts +232 -447
- package/lib/workers/spatial-math-ops.d.ts +65 -0
- package/lib/workers/spatial-math-worker.d.ts +7 -0
- package/lib/workers/spatial-math.d.ts +74 -0
- package/package.json +12 -3
- package/src/lib/assets/slice.svg +23 -0
- package/src/lib/styles/_viz-icons-rules.scss +73 -0
- package/src/lib/styles/viz-icons.scss +14 -0
- package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
- package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
- package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
- package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
- package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
- package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
- package/src/lib/assets/cell-detection.svg +0 -37
- package/src/lib/assets/click.svg +0 -1
- package/src/lib/assets/colormap-luts.json +0 -1
- package/src/lib/assets/edit-selection-white.svg +0 -47
- package/src/lib/assets/icons/colormap-earth.png +0 -0
- package/src/lib/assets/icons/colormap-placeholder.png +0 -0
- package/src/lib/assets/icons/colormap-pubu.png +0 -0
- package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
- package/src/lib/assets/picture-segmentation.svg +0 -43
- package/src/lib/assets/test/download-379.svg +0 -1
- package/src/lib/assets/test/download-98.svg +0 -1
- package/src/lib/assets/test/json-1.svg +0 -1
- package/src/lib/assets/test/load-53.svg +0 -1
- package/src/lib/assets/test/mask-44.svg +0 -1
- package/src/lib/assets/test/mask-download-44.svg +0 -15
- package/src/lib/assets/test/mask-save-44.svg +0 -11
- package/src/lib/assets/test/overlay-1.svg +0 -1
- package/src/lib/assets/test/overlay-4.svg +0 -1
- package/src/lib/assets/test/region-26.svg +0 -1
- package/src/lib/assets/test/save-56.svg +0 -1
- package/src/lib/assets/test/upload-43.svg +0 -1
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import { Injector } from '@angular/core';
|
|
2
|
+
import { PlotType } from '../contracts/plot-type';
|
|
3
|
+
import { PLOT_MODE_CONTEXT, PLOT_MODE_SESSION, } from '../contracts/plot-type-contribution.contract';
|
|
4
|
+
import { dialogToolContributions, } from '../contracts/toolbar-tool.contract';
|
|
5
|
+
import { PlotModeController } from './plot-mode-controller';
|
|
6
|
+
/** How many animation frames to wait for a tool dialog to attach its body's host. */
|
|
7
|
+
const TOOL_DIALOG_ATTACH_FRAMES = 60;
|
|
8
|
+
/**
|
|
9
|
+
* Hosts the library's two kinds of contributed sessions over the viewer:
|
|
10
|
+
* - **plot modes** (`PLOT_TYPE_CONTRIBUTIONS`): a selector entry riding on a built-in
|
|
11
|
+
* base type, with an optional side panel;
|
|
12
|
+
* - **dialog tools** (`TOOLBAR_TOOLS`, `kind: 'dialog'`): a floating dialog over the
|
|
13
|
+
* Image view, whose body the tool mounts once the dialog is in the document.
|
|
14
|
+
*
|
|
15
|
+
* Both run through a {@link PlotModeController} (one live session each, isolated from
|
|
16
|
+
* a failing contribution). A session is bound to the base view it drew over, so it
|
|
17
|
+
* ends before anything else draws ({@link endSessions}) and restarts once the next
|
|
18
|
+
* render has landed ({@link activate}).
|
|
19
|
+
*/
|
|
20
|
+
export class ContributionHost {
|
|
21
|
+
constructor(plotTypeContributions, toolContributions, viewer) {
|
|
22
|
+
this.viewer = viewer;
|
|
23
|
+
/** The live mode's panel; null while no contributed session is live. */
|
|
24
|
+
this.plotModePanel = null;
|
|
25
|
+
/** The open dialog tool's live dialog. */
|
|
26
|
+
this.toolDialog = null;
|
|
27
|
+
/** The dialog tool the user has open (its session may be between renders). */
|
|
28
|
+
this.openDialogToolId = null;
|
|
29
|
+
this.destroying = false;
|
|
30
|
+
/** The live dialog body's teardown, and a pending wait for its host to connect. */
|
|
31
|
+
this.toolDialogTeardown = null;
|
|
32
|
+
this.toolDialogFrame = null;
|
|
33
|
+
this.plotModes = new PlotModeController(plotTypeContributions, {
|
|
34
|
+
onActivated: (active) => this.showPlotModePanel(active),
|
|
35
|
+
onDeactivating: () => this.hidePlotModePanel(),
|
|
36
|
+
onFailed: (contribution) => this.fallBackFromPlotMode(contribution),
|
|
37
|
+
});
|
|
38
|
+
this.dialogTools = dialogToolContributions(toolContributions);
|
|
39
|
+
// A dialog tool's session is run by the plot-mode lifecycle, adapted: its "base
|
|
40
|
+
// type" is the Image view it draws over. Its body is NOT a controller panel: the
|
|
41
|
+
// controller would mount into a detached host, and a body must be able to measure
|
|
42
|
+
// itself. The dialog is rendered first and the body mounted once its host is in
|
|
43
|
+
// the document (showToolDialog).
|
|
44
|
+
this.toolDialogs = new PlotModeController(this.dialogTools.map((t) => ({
|
|
45
|
+
descriptor: { type: t.id, label: t.label, dimensions: '2d', baseType: PlotType.IMAGE },
|
|
46
|
+
activate: (ctx) => t.activate(ctx),
|
|
47
|
+
})), {
|
|
48
|
+
onActivated: (active) => this.showToolDialog(active),
|
|
49
|
+
onDeactivating: () => this.hideToolDialog(),
|
|
50
|
+
onFailed: (contribution) => this.dialogToolFailed(contribution.descriptor.type),
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
/** End both sessions: the view they drew over is about to go. An open dialog tool
|
|
54
|
+
* stays open and restarts on the next {@link activate}. */
|
|
55
|
+
endSessions() {
|
|
56
|
+
this.plotModes.deactivate();
|
|
57
|
+
this.toolDialogs.deactivate();
|
|
58
|
+
}
|
|
59
|
+
/** A render landed: start the selected mode's session and the open dialog tool's. */
|
|
60
|
+
activate() {
|
|
61
|
+
this.activateSelectedPlotMode();
|
|
62
|
+
this.activateOpenDialogTool();
|
|
63
|
+
}
|
|
64
|
+
/** The viewer is being destroyed: end both sessions without touching its view. */
|
|
65
|
+
destroy() {
|
|
66
|
+
this.destroying = true;
|
|
67
|
+
this.endSessions();
|
|
68
|
+
}
|
|
69
|
+
/** The toolbar button: open the tool's dialog, or close it if it is open. */
|
|
70
|
+
toggleDialogTool(id) {
|
|
71
|
+
if (this.openDialogToolId === id) {
|
|
72
|
+
this.closeDialogTool();
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
this.closeDialogTool();
|
|
76
|
+
if (!this.dialogTools.some((t) => t.id === id))
|
|
77
|
+
return;
|
|
78
|
+
this.openDialogToolId = id;
|
|
79
|
+
this.toolDialogs.clearCleanupFailures(); // an explicit open gets a fresh attempt
|
|
80
|
+
this.activateOpenDialogTool();
|
|
81
|
+
}
|
|
82
|
+
/** Close the open dialog tool: its body is torn down, then its session ends. */
|
|
83
|
+
closeDialogTool() {
|
|
84
|
+
this.openDialogToolId = null;
|
|
85
|
+
this.toolDialogs.deactivate();
|
|
86
|
+
}
|
|
87
|
+
/** Attach a `mount` panel's host element once the panel dialog renders its slot. */
|
|
88
|
+
attachPanelSlot(slot) {
|
|
89
|
+
const host = this.plotModePanel?.host;
|
|
90
|
+
if (slot && host && host.parentElement !== slot)
|
|
91
|
+
slot.appendChild(host);
|
|
92
|
+
}
|
|
93
|
+
/** Attach the open dialog tool's host element once its dialog renders its slot. */
|
|
94
|
+
attachToolDialogSlot(slot) {
|
|
95
|
+
const host = this.toolDialog?.host;
|
|
96
|
+
if (slot && host && host.parentElement !== slot)
|
|
97
|
+
slot.appendChild(host);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Start the selected contributed mode's session, once its base view has plotted.
|
|
101
|
+
* No-op for a built-in type, or when the base on screen is not the one the mode
|
|
102
|
+
* rides on. A backend that cannot provide a viewport for it (e.g. OSD fell back to
|
|
103
|
+
* Plotly) counts as a failed activation.
|
|
104
|
+
*/
|
|
105
|
+
activateSelectedPlotMode() {
|
|
106
|
+
const contribution = this.plotModes.find(this.viewer.selectedId());
|
|
107
|
+
if (!contribution || this.viewer.renderedType() !== contribution.descriptor.baseType)
|
|
108
|
+
return;
|
|
109
|
+
const ctx = this.context();
|
|
110
|
+
if (!ctx) {
|
|
111
|
+
console.error(`[visualizer] plot-type contribution '${contribution.descriptor.type}': the backend ` +
|
|
112
|
+
'on screen provides no viewport to draw over — falling back.');
|
|
113
|
+
this.fallBackFromPlotMode(contribution);
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
void this.plotModes.activate(contribution, ctx);
|
|
117
|
+
}
|
|
118
|
+
/** Start (or restart, after a re-render) the open dialog tool's session. */
|
|
119
|
+
activateOpenDialogTool() {
|
|
120
|
+
const id = this.openDialogToolId;
|
|
121
|
+
const contribution = id ? this.toolDialogs.find(id) : undefined;
|
|
122
|
+
if (!id || !contribution || this.viewer.renderedType() !== PlotType.IMAGE)
|
|
123
|
+
return;
|
|
124
|
+
if (this.toolDialogs.current?.contribution === contribution || this.toolDialogs.pending)
|
|
125
|
+
return;
|
|
126
|
+
const ctx = this.context();
|
|
127
|
+
if (!ctx) {
|
|
128
|
+
console.error(`[visualizer] dialog tool '${id}': the backend on screen provides no viewport to draw over.`);
|
|
129
|
+
this.dialogToolFailed(id);
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
void this.toolDialogs.activate(contribution, ctx);
|
|
133
|
+
}
|
|
134
|
+
/** A session's context over the backend on screen, or null when it has no viewport. */
|
|
135
|
+
context() {
|
|
136
|
+
const visualizer = this.viewer.visualizer;
|
|
137
|
+
const viewport = visualizer.getPlotModeViewport?.() ?? null;
|
|
138
|
+
if (!viewport)
|
|
139
|
+
return null;
|
|
140
|
+
return { visualizer, viewport, imageInfo$: this.viewer.imageInfo$(), tools: this.viewer.tools };
|
|
141
|
+
}
|
|
142
|
+
/** Render the live mode's panel. Activation can resolve outside Angular (an OSD
|
|
143
|
+
* callback, a contribution's own promise), hence the zone re-entry. */
|
|
144
|
+
showPlotModePanel(active) {
|
|
145
|
+
const panel = active.contribution.panel;
|
|
146
|
+
if (!panel)
|
|
147
|
+
return;
|
|
148
|
+
this.viewer.zone.run(() => {
|
|
149
|
+
if ('component' in panel && panel.component) {
|
|
150
|
+
this.plotModePanel = {
|
|
151
|
+
title: panel.title,
|
|
152
|
+
component: panel.component,
|
|
153
|
+
injector: Injector.create({
|
|
154
|
+
providers: [
|
|
155
|
+
{ provide: PLOT_MODE_CONTEXT, useValue: active.ctx },
|
|
156
|
+
{ provide: PLOT_MODE_SESSION, useValue: active.session },
|
|
157
|
+
],
|
|
158
|
+
parent: this.viewer.injector,
|
|
159
|
+
}),
|
|
160
|
+
host: null,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
else if (active.panelHost) {
|
|
164
|
+
this.plotModePanel = { title: panel.title, component: null, injector: null, host: active.panelHost };
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
// A component panel is created and first rendered right here; if that throws,
|
|
170
|
+
// the mode is not usable — end it and fall back rather than leave it selected.
|
|
171
|
+
const err = this.detectChangesSafely();
|
|
172
|
+
if (err !== null)
|
|
173
|
+
this.plotModes.failActive(err);
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
/** Drop the panel (destroying a component panel) before the session ends. */
|
|
177
|
+
hidePlotModePanel() {
|
|
178
|
+
if (!this.plotModePanel)
|
|
179
|
+
return;
|
|
180
|
+
this.plotModePanel = null;
|
|
181
|
+
this.detectChangesSafely();
|
|
182
|
+
}
|
|
183
|
+
/** A contributed mode could not start. Its base type is already on screen — the base
|
|
184
|
+
* plotted first — so just select it: nothing needs to re-plot. */
|
|
185
|
+
fallBackFromPlotMode(contribution) {
|
|
186
|
+
if (this.destroying || this.viewer.selectedId() !== contribution.descriptor.type)
|
|
187
|
+
return;
|
|
188
|
+
this.viewer.zone.run(() => {
|
|
189
|
+
this.viewer.selectBase(contribution.descriptor.baseType);
|
|
190
|
+
this.viewer.notify({
|
|
191
|
+
severity: 'warn',
|
|
192
|
+
summary: `${contribution.descriptor.productionLabel ?? contribution.descriptor.label} is unavailable`,
|
|
193
|
+
detail: 'The plot mode could not start, so the plain image is shown instead. See the browser console for details.',
|
|
194
|
+
});
|
|
195
|
+
this.detectChangesSafely();
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* The dialog-tool session is live: render the dialog, then mount the tool's body
|
|
200
|
+
* once the host element is in the document, so `mount()` can measure it and start
|
|
201
|
+
* widgets that need a connected element.
|
|
202
|
+
*/
|
|
203
|
+
showToolDialog(active) {
|
|
204
|
+
const tool = this.dialogTools.find((t) => t.id === active.contribution.descriptor.type);
|
|
205
|
+
if (!tool)
|
|
206
|
+
return;
|
|
207
|
+
const host = document.createElement('div');
|
|
208
|
+
host.className = 'tool-dialog-body';
|
|
209
|
+
this.viewer.zone.run(() => {
|
|
210
|
+
this.toolDialog = { title: tool.dialog?.title ?? tool.label, width: tool.dialog?.width ?? '22rem', host };
|
|
211
|
+
const err = this.detectChangesSafely();
|
|
212
|
+
if (err !== null) {
|
|
213
|
+
this.toolDialogs.failActive(err);
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
this.mountToolDialogBody(tool, active, host, 0);
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Mount `tool`'s body into `host` once it is connected (the dialog may attach it a
|
|
221
|
+
* frame later, when it moves itself to `<body>`). If it never connects within
|
|
222
|
+
* {@link TOOL_DIALOG_ATTACH_FRAMES} it is mounted anyway, with a warning, rather than
|
|
223
|
+
* leaving an empty dialog. A throwing `mount()` fails the session like a failed start.
|
|
224
|
+
*/
|
|
225
|
+
mountToolDialogBody(tool, active, host, frames) {
|
|
226
|
+
this.toolDialogFrame = null;
|
|
227
|
+
// The session ended (or was replaced) while waiting: nothing to mount into.
|
|
228
|
+
if (this.toolDialogs.current !== active || this.toolDialog?.host !== host)
|
|
229
|
+
return;
|
|
230
|
+
if (!host.isConnected) {
|
|
231
|
+
if (frames < TOOL_DIALOG_ATTACH_FRAMES) {
|
|
232
|
+
this.toolDialogFrame = requestAnimationFrame(() => this.mountToolDialogBody(tool, active, host, frames + 1));
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
console.warn(`[visualizer] dialog tool '${tool.id}': the dialog body never attached; mounting it detached.`);
|
|
236
|
+
}
|
|
237
|
+
try {
|
|
238
|
+
const teardown = tool.mount(host, active.ctx, active.session);
|
|
239
|
+
this.toolDialogTeardown = typeof teardown === 'function' ? teardown : null;
|
|
240
|
+
}
|
|
241
|
+
catch (err) {
|
|
242
|
+
console.error(`[visualizer] dialog tool '${tool.id}' mount() threw.`, err);
|
|
243
|
+
this.toolDialogs.failActive(err);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/** The dialog-tool session is about to end: tear the body down first, then drop the dialog. */
|
|
247
|
+
hideToolDialog() {
|
|
248
|
+
if (this.toolDialogFrame !== null)
|
|
249
|
+
cancelAnimationFrame(this.toolDialogFrame);
|
|
250
|
+
this.toolDialogFrame = null;
|
|
251
|
+
const teardown = this.toolDialogTeardown;
|
|
252
|
+
this.toolDialogTeardown = null;
|
|
253
|
+
if (teardown) {
|
|
254
|
+
try {
|
|
255
|
+
teardown();
|
|
256
|
+
}
|
|
257
|
+
catch (err) {
|
|
258
|
+
console.error('[visualizer] dialog tool body teardown threw.', err);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
if (!this.toolDialog)
|
|
262
|
+
return;
|
|
263
|
+
this.toolDialog.host.remove();
|
|
264
|
+
this.toolDialog = null;
|
|
265
|
+
if (!this.destroying)
|
|
266
|
+
this.detectChangesSafely();
|
|
267
|
+
}
|
|
268
|
+
/** A dialog tool could not start: close it and say so. */
|
|
269
|
+
dialogToolFailed(id) {
|
|
270
|
+
if (this.destroying || this.openDialogToolId !== id)
|
|
271
|
+
return;
|
|
272
|
+
this.viewer.zone.run(() => {
|
|
273
|
+
this.openDialogToolId = null;
|
|
274
|
+
const tool = this.dialogTools.find((t) => t.id === id);
|
|
275
|
+
this.viewer.notify({
|
|
276
|
+
severity: 'warn',
|
|
277
|
+
summary: `${tool?.label ?? id} is unavailable`,
|
|
278
|
+
detail: 'The tool could not start. See the browser console for details.',
|
|
279
|
+
});
|
|
280
|
+
this.detectChangesSafely();
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
/** Run change detection; returns what it threw (logged), or null. */
|
|
284
|
+
detectChangesSafely() {
|
|
285
|
+
if (this.destroying)
|
|
286
|
+
return null;
|
|
287
|
+
try {
|
|
288
|
+
this.viewer.detectChanges();
|
|
289
|
+
return null;
|
|
290
|
+
}
|
|
291
|
+
catch (err) {
|
|
292
|
+
console.error('[visualizer] change detection failed while updating a contributed plot mode panel.', err);
|
|
293
|
+
return err ?? new Error('change detection failed');
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJpYnV0aW9uLWhvc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Bsb3QtbW9kZS9jb250cmlidXRpb24taG9zdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFnQixNQUFNLGVBQWUsQ0FBQztBQUt2RCxPQUFPLEVBQUUsUUFBUSxFQUFjLE1BQU0sd0JBQXdCLENBQUM7QUFDOUQsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixpQkFBaUIsR0FJbEIsTUFBTSw4Q0FBOEMsQ0FBQztBQUN0RCxPQUFPLEVBSUwsdUJBQXVCLEdBQ3hCLE1BQU0sb0NBQW9DLENBQUM7QUFFNUMsT0FBTyxFQUFrQixrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBc0M1RSxxRkFBcUY7QUFDckYsTUFBTSx5QkFBeUIsR0FBRyxFQUFFLENBQUM7QUFFckM7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBaUIzQixZQUNFLHFCQUF5RSxFQUN6RSxpQkFBb0UsRUFDbkQsTUFBMEI7UUFBMUIsV0FBTSxHQUFOLE1BQU0sQ0FBb0I7UUFmN0Msd0VBQXdFO1FBQ3hFLGtCQUFhLEdBQTZCLElBQUksQ0FBQztRQUMvQywwQ0FBMEM7UUFDMUMsZUFBVSxHQUEwQixJQUFJLENBQUM7UUFDekMsOEVBQThFO1FBQzlFLHFCQUFnQixHQUFrQixJQUFJLENBQUM7UUFFL0IsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUMzQixtRkFBbUY7UUFDM0UsdUJBQWtCLEdBQXdCLElBQUksQ0FBQztRQUMvQyxvQkFBZSxHQUFrQixJQUFJLENBQUM7UUFPNUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLGtCQUFrQixDQUFDLHFCQUFxQixFQUFFO1lBQzdELFdBQVcsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQztZQUN2RCxjQUFj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QUFDO1lBQzVCLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDYixPQUFPLENBQUMsS0FBSyxDQUFDLG9GQUFvRixFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ3pHLE9BQU8sR0FBRyxJQUFJLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDckQsQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdG9yLCBOZ1pvbmUsIFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XG5cbmltcG9ydCB7IElJbWFnZUluZm8gfSBmcm9tICcuLi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuaW1wb3J0IHsgUGxvdFR5cGUsIFBsb3RUeXBlSWQgfSBmcm9tICcuLi9jb250cmFjdHMvcGxvdC10eXBlJztcbmltcG9ydCB7XG4gIFBMT1RfTU9ERV9DT05URVhULFxuICBQTE9UX01PREVfU0VTU0lPTixcbiAgUGxvdE1vZGVDb250ZXh0LFxuICBQbG90TW9kZVRvb2xzLFxuICBQbG90VHlwZUNvbnRyaWJ1dGlvbixcbn0gZnJvbSAnLi4vY29udHJhY3RzL3Bsb3QtdHlwZS1jb250cmlidXRpb24uY29udHJhY3QnO1xuaW1wb3J0IHtcbiAgVG9vbERpYWxvZ0NvbnRleHQsXG4gIFRvb2xiYXJDb250cmlidXRpb24sXG4gIFRvb2xiYXJEaWFsb2dUb29sQ29udHJpYnV0aW9uLFxuICBkaWFsb2dUb29sQ29udHJpYnV0aW9ucyxcbn0gZnJvbSAnLi4vY29udHJhY3RzL3Rvb2xiYXItdG9vbC5jb250cmFjdCc7XG5pbXBvcnQgeyBJVmlzdWFsaXplciB9IGZyb20gJy4uL2NvbnRyYWN0cy92aXN1YWxpemVyLmNvbnRyYWN0JztcbmltcG9ydCB7IEFjdGl2ZVBsb3RNb2RlLCBQbG90TW9kZUNvbnRyb2xsZXIgfSBmcm9tICcuL3Bsb3QtbW9kZS1jb250cm9sbGVyJztcblxuLyoqIFRoZSBsaXZlIGNvbnRyaWJ1dGVkIG1vZGUncyBzaWRlIHBhbmVsLCBhcyB0aGUgdGVtcGxhdGUgcmVuZGVycyBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGxvdE1vZGVQYW5lbFZpZXcge1xuICB0aXRsZTogc3RyaW5nO1xuICAvKiogQW4gQW5ndWxhciBjb21wb25lbnQgcGFuZWwsIHdpdGggaXRzIG93biBpbmplY3RvcuKApiAqL1xuICBjb21wb25lbnQ6IFR5cGU8dW5rbm93bj4gfCBudWxsO1xuICBpbmplY3RvcjogSW5qZWN0b3IgfCBudWxsO1xuICAvKiog4oCmb3IgYSBwbGFpbiBob3N0IGVsZW1lbnQgYSBgbW91bnRgIHBhbmVsIHJlbmRlcmVkIGludG8uICovXG4gIGhvc3Q6IEhUTUxFbGVtZW50IHwgbnVsbDtcbn1cblxuLyoqIFRoZSBvcGVuIGRpYWxvZyB0b29sJ3MgZGlhbG9nLCBhcyB0aGUgdGVtcGxhdGUgcmVuZGVycyBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9vbERpYWxvZ1ZpZXcge1xuICB0aXRsZTogc3RyaW5nO1xuICB3aWR0aDogc3RyaW5nO1xuICBob3N0OiBIVE1MRWxlbWVudDtcbn1cblxuLyoqIFdoYXQgdGhlIGNvbnRyaWJ1dGlvbnMgbmVlZCBmcm9tIHRoZSB2aWV3ZXIgdGhhdCBob3N0cyB0aGVtLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250cmlidXRpb25WaWV3ZXIge1xuICByZWFkb25seSB2aXN1YWxpemVyOiBJVmlzdWFsaXplcjtcbiAgcmVhZG9ubHkgem9uZTogTmdab25lO1xuICAvKiogVGhlIHRvb2xiYXIgdG9vbHMgYSBjb250cmlidXRpb24gbWF5IGFybSAoYFBsb3RNb2RlQ29udGV4dC50b29sc2ApLiAqL1xuICByZWFkb25seSB0b29sczogUGxvdE1vZGVUb29scztcbiAgLyoqIFBhcmVudCBvZiBhIGNvbXBvbmVudCBwYW5lbCdzIGluamVjdG9yLiAqL1xuICByZWFkb25seSBpbmplY3Rvcj86IEluamVjdG9yO1xuICBpbWFnZUluZm8kKCk6IE9ic2VydmFibGU8SUltYWdlSW5mbyB8IG51bGw+O1xuICAvKiogVGhlIHNlbGVjdG9yJ3MgaWQgKGEgYnVpbHQtaW4gdHlwZSBvciBhIGNvbnRyaWJ1dGVkIG1vZGUpLiAqL1xuICBzZWxlY3RlZElkKCk6IFBsb3RUeXBlSWQ7XG4gIC8qKiBUaGUgYnVpbHQtaW4gdHlwZSBiZWluZyByZW5kZXJlZC4gKi9cbiAgcmVuZGVyZWRUeXBlKCk6IFBsb3RUeXBlO1xuICAvKiogQSBjb250cmlidXRlZCBtb2RlIGNvdWxkIG5vdCBzdGFydDogc2VsZWN0IGl0cyBiYXNlIHR5cGUsIGFscmVhZHkgb24gc2NyZWVuLiAqL1xuICBzZWxlY3RCYXNlKHR5cGU6IFBsb3RUeXBlKTogdm9pZDtcbiAgbm90aWZ5KG1lc3NhZ2U6IE1lc3NhZ2UpOiB2b2lkO1xuICBkZXRlY3RDaGFuZ2VzKCk6IHZvaWQ7XG59XG5cbi8qKiBIb3cgbWFueSBhbmltYXRpb24gZnJhbWVzIHRvIHdhaXQgZm9yIGEgdG9vbCBkaWFsb2cgdG8gYXR0YWNoIGl0cyBib2R5J3MgaG9zdC4gKi9cbmNvbnN0IFRPT0xfRElBTE9HX0FUVEFDSF9GUkFNRVMgPSA2MDtcblxuLyoqXG4gKiBIb3N0cyB0aGUgbGlicmFyeSdzIHR3byBraW5kcyBvZiBjb250cmlidXRlZCBzZXNzaW9ucyBvdmVyIHRoZSB2aWV3ZXI6XG4gKiAgLSAqKnBsb3QgbW9kZXMqKiAoYFBMT1RfVFlQRV9DT05UUklCVVRJT05TYCk6IGEgc2VsZWN0b3IgZW50cnkgcmlkaW5nIG9uIGEgYnVpbHQtaW5cbiAqICAgIGJhc2UgdHlwZSwgd2l0aCBhbiBvcHRpb25hbCBzaWRlIHBhbmVsO1xuICogIC0gKipkaWFsb2cgdG9vbHMqKiAoYFRPT0xCQVJfVE9PTFNgLCBga2luZDogJ2RpYWxvZydgKTogYSBmbG9hdGluZyBkaWFsb2cgb3ZlciB0aGVcbiAqICAgIEltYWdlIHZpZXcsIHdob3NlIGJvZHkgdGhlIHRvb2wgbW91bnRzIG9uY2UgdGhlIGRpYWxvZyBpcyBpbiB0aGUgZG9jdW1lbnQuXG4gKlxuICogQm90aCBydW4gdGhyb3VnaCBhIHtAbGluayBQbG90TW9kZUNvbnRyb2xsZXJ9IChvbmUgbGl2ZSBzZXNzaW9uIGVhY2gsIGlzb2xhdGVkIGZyb21cbiAqIGEgZmFpbGluZyBjb250cmlidXRpb24pLiBBIHNlc3Npb24gaXMgYm91bmQgdG8gdGhlIGJhc2UgdmlldyBpdCBkcmV3IG92ZXIsIHNvIGl0XG4gKiBlbmRzIGJlZm9yZSBhbnl0aGluZyBlbHNlIGRyYXdzICh7QGxpbmsgZW5kU2Vzc2lvbnN9KSBhbmQgcmVzdGFydHMgb25jZSB0aGUgbmV4dFxuICogcmVuZGVyIGhhcyBsYW5kZWQgKHtAbGluayBhY3RpdmF0ZX0pLlxuICovXG5leHBvcnQgY2xhc3MgQ29udHJpYnV0aW9uSG9zdCB7XG4gIHJlYWRvbmx5IHBsb3RNb2RlczogUGxvdE1vZGVDb250cm9sbGVyO1xuICByZWFkb25seSB0b29sRGlhbG9nczogUGxvdE1vZGVDb250cm9sbGVyO1xuICAvKiogRGlhbG9nIHRvb2xzLCBzb3J0ZWQ7IHRoZWlyIGJ1dHRvbnMgc2hvdyBpbiB0aGUgSW1hZ2UgdmlldyBvbmx5LiAqL1xuICByZWFkb25seSBkaWFsb2dUb29sczogVG9vbGJhckRpYWxvZ1Rvb2xDb250cmlidXRpb25bXTtcbiAgLyoqIFRoZSBsaXZlIG1vZGUncyBwYW5lbDsgbnVsbCB3aGlsZSBubyBjb250cmlidXRlZCBzZXNzaW9uIGlzIGxpdmUuICovXG4gIHBsb3RNb2RlUGFuZWw6IFBsb3RNb2RlUGFuZWxWaWV3IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgb3BlbiBkaWFsb2cgdG9vbCdzIGxpdmUgZGlhbG9nLiAqL1xuICB0b29sRGlhbG9nOiBUb29sRGlhbG9nVmlldyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGRpYWxvZyB0b29sIHRoZSB1c2VyIGhhcyBvcGVuIChpdHMgc2Vzc2lvbiBtYXkgYmUgYmV0d2VlbiByZW5kZXJzKS4gKi9cbiAgb3BlbkRpYWxvZ1Rvb2xJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBkZXN0cm95aW5nID0gZmFsc2U7XG4gIC8qKiBUaGUgbGl2ZSBkaWFsb2cgYm9keSdzIHRlYXJkb3duLCBhbmQgYSBwZW5kaW5nIHdhaXQgZm9yIGl0cyBob3N0IHRvIGNvbm5lY3QuICovXG4gIHByaXZhdGUgdG9vbERpYWxvZ1RlYXJkb3duOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB0b29sRGlhbG9nRnJhbWU6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHBsb3RUeXBlQ29udHJpYnV0aW9uczogcmVhZG9ubHkgUGxvdFR5cGVDb250cmlidXRpb25bXSB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgdG9vbENvbnRyaWJ1dGlvbnM6IHJlYWRvbmx5IFRvb2xiYXJDb250cmlidXRpb25bXSB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSByZWFkb25seSB2aWV3ZXI6IENvbnRyaWJ1dGlvblZpZXdlcixcbiAgKSB7XG4gICAgdGhpcy5wbG90TW9kZXMgPSBuZXcgUGxvdE1vZGVDb250cm9sbGVyKHBsb3RUeXBlQ29udHJpYnV0aW9ucywge1xuICAgICAgb25BY3RpdmF0ZWQ6IChhY3RpdmUpID0+IHRoaXMuc2hvd1Bsb3RNb2RlUGFuZWwoYWN0aXZlKSxcbiAgICAgIG9uRGVhY3RpdmF0aW5nOiAoKSA9PiB0aGlzLmhpZGVQbG90TW9kZVBhbmVsKCksXG4gICAgICBvbkZhaWxlZDogKGNvbnRyaWJ1dGlvbikgPT4gdGhpcy5mYWxsQmFja0Zyb21QbG90TW9kZShjb250cmlidXRpb24pLFxuICAgIH0pO1xuICAgIHRoaXMuZGlhbG9nVG9vbHMgPSBkaWFsb2dUb29sQ29udHJpYnV0aW9ucyh0b29sQ29udHJpYnV0aW9ucyk7XG4gICAgLy8gQSBkaWFsb2cgdG9vbCdzIHNlc3Npb24gaXMgcnVuIGJ5IHRoZSBwbG90LW1vZGUgbGlmZWN5Y2xlLCBhZGFwdGVkOiBpdHMgXCJiYXNlXG4gICAgLy8gdHlwZVwiIGlzIHRoZSBJbWFnZSB2aWV3IGl0IGRyYXdzIG92ZXIuIEl0cyBib2R5IGlzIE5PVCBhIGNvbnRyb2xsZXIgcGFuZWw6IHRoZVxuICAgIC8vIGNvbnRyb2xsZXIgd291bGQgbW91bnQgaW50byBhIGRldGFjaGVkIGhvc3QsIGFuZCBhIGJvZHkgbXVzdCBiZSBhYmxlIHRvIG1lYXN1cmVcbiAgICAvLyBpdHNlbGYuIFRoZSBkaWFsb2cgaXMgcmVuZGVyZWQgZmlyc3QgYW5kIHRoZSBib2R5IG1vdW50ZWQgb25jZSBpdHMgaG9zdCBpcyBpblxuICAgIC8vIHRoZSBkb2N1bWVudCAoc2hvd1Rvb2xEaWFsb2cpLlxuICAgIHRoaXMudG9vbERpYWxvZ3MgPSBuZXcgUGxvdE1vZGVDb250cm9sbGVyKFxuICAgICAgdGhpcy5kaWFsb2dUb29scy5tYXAoKHQpOiBQbG90VHlwZUNvbnRyaWJ1dGlvbiA9PiAoe1xuICAgICAgICBkZXNjcmlwdG9yOiB7IHR5cGU6IHQuaWQsIGxhYmVsOiB0LmxhYmVsLCBkaW1lbnNpb25zOiAnMmQnLCBiYXNlVHlwZTogUGxvdFR5cGUuSU1BR0UgfSxcbiAgICAgICAgYWN0aXZhdGU6IChjdHgpID0+IHQuYWN0aXZhdGUoY3R4IGFzIFRvb2xEaWFsb2dDb250ZXh0KSxcbiAgICAgIH0pKSxcbiAgICAgIHtcbiAgICAgICAgb25BY3RpdmF0ZWQ6IChhY3RpdmUpID0+IHRoaXMuc2hvd1Rvb2xEaWFsb2coYWN0aXZlKSxcbiAgICAgICAgb25EZWFjdGl2YXRpbmc6ICgpID0+IHRoaXMuaGlkZVRvb2xEaWFsb2coKSxcbiAgICAgICAgb25GYWlsZWQ6IChjb250cmlidXRpb24pID0+IHRoaXMuZGlhbG9nVG9vbEZhaWxlZChjb250cmlidXRpb24uZGVzY3JpcHRvci50eXBlKSxcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBFbmQgYm90aCBzZXNzaW9uczogdGhlIHZpZXcgdGhleSBkcmV3IG92ZXIgaXMgYWJvdXQgdG8gZ28uIEFuIG9wZW4gZGlhbG9nIHRvb2xcbiAgICogIHN0YXlzIG9wZW4gYW5kIHJlc3RhcnRzIG9uIHRoZSBuZXh0IHtAbGluayBhY3RpdmF0ZX0uICovXG4gIGVuZFNlc3Npb25zKCk6IHZvaWQge1xuICAgIHRoaXMucGxvdE1vZGVzLmRlYWN0aXZhdGUoKTtcbiAgICB0aGlzLnRvb2xEaWFsb2dzLmRlYWN0aXZhdGUoKTtcbiAgfVxuXG4gIC8qKiBBIHJlbmRlciBsYW5kZWQ6IHN0YXJ0IHRoZSBzZWxlY3RlZCBtb2RlJ3Mgc2Vzc2lvbiBhbmQgdGhlIG9wZW4gZGlhbG9nIHRvb2wncy4gKi9cbiAgYWN0aXZhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5hY3RpdmF0ZVNlbGVjdGVkUGxvdE1vZGUoKTtcbiAgICB0aGlzLmFjdGl2YXRlT3BlbkRpYWxvZ1Rvb2woKTtcbiAgfVxuXG4gIC8qKiBUaGUgdmlld2VyIGlzIGJlaW5nIGRlc3Ryb3llZDogZW5kIGJvdGggc2Vzc2lvbnMgd2l0aG91dCB0b3VjaGluZyBpdHMgdmlldy4gKi9cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3lpbmcgPSB0cnVlO1xuICAgIHRoaXMuZW5kU2Vzc2lvbnMoKTtcbiAgfVxuXG4gIC8qKiBUaGUgdG9vbGJhciBidXR0b246IG9wZW4gdGhlIHRvb2wncyBkaWFsb2csIG9yIGNsb3NlIGl0IGlmIGl0IGlzIG9wZW4uICovXG4gIHRvZ2dsZURpYWxvZ1Rvb2woaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLm9wZW5EaWFsb2dUb29sSWQgPT09IGlkKSB7XG4gICAgICB0aGlzLmNsb3NlRGlhbG9nVG9vbCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmNsb3NlRGlhbG9nVG9vbCgpO1xuICAgIGlmICghdGhpcy5kaWFsb2dUb29scy5zb21lKCh0KSA9PiB0LmlkID09PSBpZCkpIHJldHVybjtcbiAgICB0aGlzLm9wZW5EaWFsb2dUb29sSWQgPSBpZDtcbiAgICB0aGlzLnRvb2xEaWFsb2dzLmNsZWFyQ2xlYW51cEZhaWx1cmVzKCk7IC8vIGFuIGV4cGxpY2l0IG9wZW4gZ2V0cyBhIGZyZXNoIGF0dGVtcHRcbiAgICB0aGlzLmFjdGl2YXRlT3BlbkRpYWxvZ1Rvb2woKTtcbiAgfVxuXG4gIC8qKiBDbG9zZSB0aGUgb3BlbiBkaWFsb2cgdG9vbDogaXRzIGJvZHkgaXMgdG9ybiBkb3duLCB0aGVuIGl0cyBzZXNzaW9uIGVuZHMuICovXG4gIGNsb3NlRGlhbG9nVG9vbCgpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW5EaWFsb2dUb29sSWQgPSBudWxsO1xuICAgIHRoaXMudG9vbERpYWxvZ3MuZGVhY3RpdmF0ZSgpO1xuICB9XG5cbiAgLyoqIEF0dGFjaCBhIGBtb3VudGAgcGFuZWwncyBob3N0IGVsZW1lbnQgb25jZSB0aGUgcGFuZWwgZGlhbG9nIHJlbmRlcnMgaXRzIHNsb3QuICovXG4gIGF0dGFjaFBhbmVsU2xvdChzbG90OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGNvbnN0IGhvc3QgPSB0aGlzLnBsb3RNb2RlUGFuZWw/Lmhvc3Q7XG4gICAgaWYgKHNsb3QgJiYgaG9zdCAmJiBob3N0LnBhcmVudEVsZW1lbnQgIT09IHNsb3QpIHNsb3QuYXBwZW5kQ2hpbGQoaG9zdCk7XG4gIH1cblxuICAvKiogQXR0YWNoIHRoZSBvcGVuIGRpYWxvZyB0b29sJ3MgaG9zdCBlbGVtZW50IG9uY2UgaXRzIGRpYWxvZyByZW5kZXJzIGl0cyBzbG90LiAqL1xuICBhdHRhY2hUb29sRGlhbG9nU2xvdChzbG90OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGNvbnN0IGhvc3QgPSB0aGlzLnRvb2xEaWFsb2c/Lmhvc3Q7XG4gICAgaWYgKHNsb3QgJiYgaG9zdCAmJiBob3N0LnBhcmVudEVsZW1lbnQgIT09IHNsb3QpIHNsb3QuYXBwZW5kQ2hpbGQoaG9zdCk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnQgdGhlIHNlbGVjdGVkIGNvbnRyaWJ1dGVkIG1vZGUncyBzZXNzaW9uLCBvbmNlIGl0cyBiYXNlIHZpZXcgaGFzIHBsb3R0ZWQuXG4gICAqIE5vLW9wIGZvciBhIGJ1aWx0LWluIHR5cGUsIG9yIHdoZW4gdGhlIGJhc2Ugb24gc2NyZWVuIGlzIG5vdCB0aGUgb25lIHRoZSBtb2RlXG4gICAqIHJpZGVzIG9uLiBBIGJhY2tlbmQgdGhhdCBjYW5ub3QgcHJvdmlkZSBhIHZpZXdwb3J0IGZvciBpdCAoZS5nLiBPU0QgZmVsbCBiYWNrIHRvXG4gICAqIFBsb3RseSkgY291bnRzIGFzIGEgZmFpbGVkIGFjdGl2YXRpb24uXG4gICAqL1xuICBwcml2YXRlIGFjdGl2YXRlU2VsZWN0ZWRQbG90TW9kZSgpOiB2b2lkIHtcbiAgICBjb25zdCBjb250cmlidXRpb24gPSB0aGlzLnBsb3RNb2Rlcy5maW5kKHRoaXMudmlld2VyLnNlbGVjdGVkSWQoKSk7XG4gICAgaWYgKCFjb250cmlidXRpb24gfHwgdGhpcy52aWV3ZXIucmVuZGVyZWRUeXBlKCkgIT09IGNvbnRyaWJ1dGlvbi5kZXNjcmlwdG9yLmJhc2VUeXBlKSByZXR1cm47XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jb250ZXh0KCk7XG4gICAgaWYgKCFjdHgpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBbdmlzdWFsaXplcl0gcGxvdC10eXBlIGNvbnRyaWJ1dGlvbiAnJHtjb250cmlidXRpb24uZGVzY3JpcHRvci50eXBlfSc6IHRoZSBiYWNrZW5kIGAgK1xuICAgICAgICAgICdvbiBzY3JlZW4gcHJvdmlkZXMgbm8gdmlld3BvcnQgdG8gZHJhdyBvdmVyIOKAlCBmYWxsaW5nIGJhY2suJyxcbiAgICAgICk7XG4gICAgICB0aGlzLmZhbGxCYWNrRnJvbVBsb3RNb2RlKGNvbnRyaWJ1dGlvbik7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZvaWQgdGhpcy5wbG90TW9kZXMuYWN0aXZhdGUoY29udHJpYnV0aW9uLCBjdHgpO1xuICB9XG5cbiAgLyoqIFN0YXJ0IChvciByZXN0YXJ0LCBhZnRlciBhIHJlLXJlbmRlcikgdGhlIG9wZW4gZGlhbG9nIHRvb2wncyBzZXNzaW9uLiAqL1xuICBwcml2YXRlIGFjdGl2YXRlT3BlbkRpYWxvZ1Rvb2woKTogdm9pZCB7XG4gICAgY29uc3QgaWQgPSB0aGlzLm9wZW5EaWFsb2dUb29sSWQ7XG4gICAgY29uc3QgY29udHJpYnV0aW9uID0gaWQgPyB0aGlzLnRvb2xEaWFsb2dzLmZpbmQoaWQpIDogdW5kZWZpbmVkO1xuICAgIGlmICghaWQgfHwgIWNvbnRyaWJ1dGlvbiB8fCB0aGlzLnZpZXdlci5yZW5kZXJlZFR5cGUoKSAhPT0gUGxvdFR5cGUuSU1BR0UpIHJldHVybjtcbiAgICBpZiAodGhpcy50b29sRGlhbG9ncy5jdXJyZW50Py5jb250cmlidXRpb24gPT09IGNvbnRyaWJ1dGlvbiB8fCB0aGlzLnRvb2xEaWFsb2dzLnBlbmRpbmcpIHJldHVybjtcbiAgICBjb25zdCBjdHggPSB0aGlzLmNvbnRleHQoKTtcbiAgICBpZiAoIWN0eCkge1xuICAgICAgY29uc29sZS5lcnJvcihgW3Zpc3VhbGl6ZXJdIGRpYWxvZyB0b29sICcke2lkfSc6IHRoZSBiYWNrZW5kIG9uIHNjcmVlbiBwcm92aWRlcyBubyB2aWV3cG9ydCB0byBkcmF3IG92ZXIuYCk7XG4gICAgICB0aGlzLmRpYWxvZ1Rvb2xGYWlsZWQoaWQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2b2lkIHRoaXMudG9vbERpYWxvZ3MuYWN0aXZhdGUoY29udHJpYnV0aW9uLCBjdHgpO1xuICB9XG5cbiAgLyoqIEEgc2Vzc2lvbidzIGNvbnRleHQgb3ZlciB0aGUgYmFja2VuZCBvbiBzY3JlZW4sIG9yIG51bGwgd2hlbiBpdCBoYXMgbm8gdmlld3BvcnQuICovXG4gIHByaXZhdGUgY29udGV4dCgpOiBQbG90TW9kZUNvbnRleHQgfCBudWxsIHtcbiAgICBjb25zdCB2aXN1YWxpemVyID0gdGhpcy52aWV3ZXIudmlzdWFsaXplcjtcbiAgICBjb25zdCB2aWV3cG9ydCA9IHZpc3VhbGl6ZXIuZ2V0UGxvdE1vZGVWaWV3cG9ydD8uKCkgPz8gbnVsbDtcbiAgICBpZiAoIXZpZXdwb3J0KSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4geyB2aXN1YWxpemVyLCB2aWV3cG9ydCwgaW1hZ2VJbmZvJDogdGhpcy52aWV3ZXIuaW1hZ2VJbmZvJCgpLCB0b29sczogdGhpcy52aWV3ZXIudG9vbHMgfTtcbiAgfVxuXG4gIC8qKiBSZW5kZXIgdGhlIGxpdmUgbW9kZSdzIHBhbmVsLiBBY3RpdmF0aW9uIGNhbiByZXNvbHZlIG91dHNpZGUgQW5ndWxhciAoYW4gT1NEXG4gICAqICBjYWxsYmFjaywgYSBjb250cmlidXRpb24ncyBvd24gcHJvbWlzZSksIGhlbmNlIHRoZSB6b25lIHJlLWVudHJ5LiAqL1xuICBwcml2YXRlIHNob3dQbG90TW9kZVBhbmVsKGFjdGl2ZTogQWN0aXZlUGxvdE1vZGUpOiB2b2lkIHtcbiAgICBjb25zdCBwYW5lbCA9IGFjdGl2ZS5jb250cmlidXRpb24ucGFuZWw7XG4gICAgaWYgKCFwYW5lbCkgcmV0dXJuO1xuICAgIHRoaXMudmlld2VyLnpvbmUucnVuKCgpID0+IHtcbiAgICAgIGlmICgnY29tcG9uZW50JyBpbiBwYW5lbCAmJiBwYW5lbC5jb21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5wbG90TW9kZVBhbmVsID0ge1xuICAgICAgICAgIHRpdGxlOiBwYW5lbC50aXRsZSxcbiAgICAgICAgICBjb21wb25lbnQ6IHBhbmVsLmNvbXBvbmVudCxcbiAgICAgICAgICBpbmplY3RvcjogSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgICAgICAgIHByb3ZpZGVyczogW1xuICAgICAgICAgICAgICB7IHByb3ZpZGU6IFBMT1RfTU9ERV9DT05URVhULCB1c2VWYWx1ZTogYWN0aXZlLmN0eCB9LFxuICAgICAgICAgICAgICB7IHByb3ZpZGU6IFBMT1RfTU9ERV9TRVNTSU9OLCB1c2VWYWx1ZTogYWN0aXZlLnNlc3Npb24gfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBwYXJlbnQ6IHRoaXMudmlld2VyLmluamVjdG9yLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGhvc3Q6IG51bGwsXG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKGFjdGl2ZS5wYW5lbEhvc3QpIHtcbiAgICAgICAgdGhpcy5wbG90TW9kZVBhbmVsID0geyB0aXRsZTogcGFuZWwudGl0bGUsIGNvbXBvbmVudDogbnVsbCwgaW5qZWN0b3I6IG51bGwsIGhvc3Q6IGFjdGl2ZS5wYW5lbEhvc3QgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIEEgY29tcG9uZW50IHBhbmVsIGlzIGNyZWF0ZWQgYW5kIGZpcnN0IHJlbmRlcmVkIHJpZ2h0IGhlcmU7IGlmIHRoYXQgdGhyb3dzLFxuICAgICAgLy8gdGhlIG1vZGUgaXMgbm90IHVzYWJsZSDigJQgZW5kIGl0IGFuZCBmYWxsIGJhY2sgcmF0aGVyIHRoYW4gbGVhdmUgaXQgc2VsZWN0ZWQuXG4gICAgICBjb25zdCBlcnIgPSB0aGlzLmRldGVjdENoYW5nZXNTYWZlbHkoKTtcbiAgICAgIGlmIChlcnIgIT09IG51bGwpIHRoaXMucGxvdE1vZGVzLmZhaWxBY3RpdmUoZXJyKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBEcm9wIHRoZSBwYW5lbCAoZGVzdHJveWluZyBhIGNvbXBvbmVudCBwYW5lbCkgYmVmb3JlIHRoZSBzZXNzaW9uIGVuZHMuICovXG4gIHByaXZhdGUgaGlkZVBsb3RNb2RlUGFuZWwoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBsb3RNb2RlUGFuZWwpIHJldHVybjtcbiAgICB0aGlzLnBsb3RNb2RlUGFuZWwgPSBudWxsO1xuICAgIHRoaXMuZGV0ZWN0Q2hhbmdlc1NhZmVseSgpO1xuICB9XG5cbiAgLyoqIEEgY29udHJpYnV0ZWQgbW9kZSBjb3VsZCBub3Qgc3RhcnQuIEl0cyBiYXNlIHR5cGUgaXMgYWxyZWFkeSBvbiBzY3JlZW4g4oCUIHRoZSBiYXNlXG4gICAqICBwbG90dGVkIGZpcnN0IOKAlCBzbyBqdXN0IHNlbGVjdCBpdDogbm90aGluZyBuZWVkcyB0byByZS1wbG90LiAqL1xuICBwcml2YXRlIGZhbGxCYWNrRnJvbVBsb3RNb2RlKGNvbnRyaWJ1dGlvbjogUGxvdFR5cGVDb250cmlidXRpb24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kZXN0cm95aW5nIHx8IHRoaXMudmlld2VyLnNlbGVjdGVkSWQoKSAhPT0gY29udHJpYnV0aW9uLmRlc2NyaXB0b3IudHlwZSkgcmV0dXJuO1xuICAgIHRoaXMudmlld2VyLnpvbmUucnVuKCgpID0+IHtcbiAgICAgIHRoaXMudmlld2VyLnNlbGVjdEJhc2UoY29udHJpYnV0aW9uLmRlc2NyaXB0b3IuYmFzZVR5cGUpO1xuICAgICAgdGhpcy52aWV3ZXIubm90aWZ5KHtcbiAgICAgICAgc2V2ZXJpdHk6ICd3YXJuJyxcbiAgICAgICAgc3VtbWFyeTogYCR7Y29udHJpYnV0aW9uLmRlc2NyaXB0b3IucHJvZHVjdGlvbkxhYmVsID8/IGNvbnRyaWJ1dGlvbi5kZXNjcmlwdG9yLmxhYmVsfSBpcyB1bmF2YWlsYWJsZWAsXG4gICAgICAgIGRldGFpbDpcbiAgICAgICAgICAnVGhlIHBsb3QgbW9kZSBjb3VsZCBub3Qgc3RhcnQsIHNvIHRoZSBwbGFpbiBpbWFnZSBpcyBzaG93biBpbnN0ZWFkLiBTZWUgdGhlIGJyb3dzZXIgY29uc29sZSBmb3IgZGV0YWlscy4nLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmRldGVjdENoYW5nZXNTYWZlbHkoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlhbG9nLXRvb2wgc2Vzc2lvbiBpcyBsaXZlOiByZW5kZXIgdGhlIGRpYWxvZywgdGhlbiBtb3VudCB0aGUgdG9vbCdzIGJvZHlcbiAgICogb25jZSB0aGUgaG9zdCBlbGVtZW50IGlzIGluIHRoZSBkb2N1bWVudCwgc28gYG1vdW50KClgIGNhbiBtZWFzdXJlIGl0IGFuZCBzdGFydFxuICAgKiB3aWRnZXRzIHRoYXQgbmVlZCBhIGNvbm5lY3RlZCBlbGVtZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBzaG93VG9vbERpYWxvZyhhY3RpdmU6IEFjdGl2ZVBsb3RNb2RlKTogdm9pZCB7XG4gICAgY29uc3QgdG9vbCA9IHRoaXMuZGlhbG9nVG9vbHMuZmluZCgodCkgPT4gdC5pZCA9PT0gYWN0aXZlLmNvbnRyaWJ1dGlvbi5kZXNjcmlwdG9yLnR5cGUpO1xuICAgIGlmICghdG9vbCkgcmV0dXJuO1xuICAgIGNvbnN0IGhvc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBob3N0LmNsYXNzTmFtZSA9ICd0b29sLWRpYWxvZy1ib2R5JztcbiAgICB0aGlzLnZpZXdlci56b25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLnRvb2xEaWFsb2cgPSB7IHRpdGxlOiB0b29sLmRpYWxvZz8udGl0bGUgPz8gdG9vbC5sYWJlbCwgd2lkdGg6IHRvb2wuZGlhbG9nPy53aWR0aCA/PyAnMjJyZW0nLCBob3N0IH07XG4gICAgICBjb25zdCBlcnIgPSB0aGlzLmRldGVjdENoYW5nZXNTYWZlbHkoKTtcbiAgICAgIGlmIChlcnIgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy50b29sRGlhbG9ncy5mYWlsQWN0aXZlKGVycik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMubW91bnRUb29sRGlhbG9nQm9keSh0b29sLCBhY3RpdmUsIGhvc3QsIDApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdW50IGB0b29sYCdzIGJvZHkgaW50byBgaG9zdGAgb25jZSBpdCBpcyBjb25uZWN0ZWQgKHRoZSBkaWFsb2cgbWF5IGF0dGFjaCBpdCBhXG4gICAqIGZyYW1lIGxhdGVyLCB3aGVuIGl0IG1vdmVzIGl0c2VsZiB0byBgPGJvZHk+YCkuIElmIGl0IG5ldmVyIGNvbm5lY3RzIHdpdGhpblxuICAgKiB7QGxpbmsgVE9PTF9ESUFMT0dfQVRUQUNIX0ZSQU1FU30gaXQgaXMgbW91bnRlZCBhbnl3YXksIHdpdGggYSB3YXJuaW5nLCByYXRoZXIgdGhhblxuICAgKiBsZWF2aW5nIGFuIGVtcHR5IGRpYWxvZy4gQSB0aHJvd2luZyBgbW91bnQoKWAgZmFpbHMgdGhlIHNlc3Npb24gbGlrZSBhIGZhaWxlZCBzdGFydC5cbiAgICovXG4gIHByaXZhdGUgbW91bnRUb29sRGlhbG9nQm9keShcbiAgICB0b29sOiBUb29sYmFyRGlhbG9nVG9vbENvbnRyaWJ1dGlvbixcbiAgICBhY3RpdmU6IEFjdGl2ZVBsb3RNb2RlLFxuICAgIGhvc3Q6IEhUTUxFbGVtZW50LFxuICAgIGZyYW1lczogbnVtYmVyLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnRvb2xEaWFsb2dGcmFtZSA9IG51bGw7XG4gICAgLy8gVGhlIHNlc3Npb24gZW5kZWQgKG9yIHdhcyByZXBsYWNlZCkgd2hpbGUgd2FpdGluZzogbm90aGluZyB0byBtb3VudCBpbnRvLlxuICAgIGlmICh0aGlzLnRvb2xEaWFsb2dzLmN1cnJlbnQgIT09IGFjdGl2ZSB8fCB0aGlzLnRvb2xEaWFsb2c/Lmhvc3QgIT09IGhvc3QpIHJldHVybjtcbiAgICBpZiAoIWhvc3QuaXNDb25uZWN0ZWQpIHtcbiAgICAgIGlmIChmcmFtZXMgPCBUT09MX0RJQUxPR19BVFRBQ0hfRlJBTUVTKSB7XG4gICAgICAgIHRoaXMudG9vbERpYWxvZ0ZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+XG4gICAgICAgICAgdGhpcy5tb3VudFRvb2xEaWFsb2dCb2R5KHRvb2wsIGFjdGl2ZSwgaG9zdCwgZnJhbWVzICsgMSksXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUud2FybihgW3Zpc3VhbGl6ZXJdIGRpYWxvZyB0b29sICcke3Rvb2wuaWR9JzogdGhlIGRpYWxvZyBib2R5IG5ldmVyIGF0dGFjaGVkOyBtb3VudGluZyBpdCBkZXRhY2hlZC5gKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlYXJkb3duID0gdG9vbC5tb3VudChob3N0LCBhY3RpdmUuY3R4IGFzIFRvb2xEaWFsb2dDb250ZXh0LCBhY3RpdmUuc2Vzc2lvbik7XG4gICAgICB0aGlzLnRvb2xEaWFsb2dUZWFyZG93biA9IHR5cGVvZiB0ZWFyZG93biA9PT0gJ2Z1bmN0aW9uJyA/IHRlYXJkb3duIDogbnVsbDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFt2aXN1YWxpemVyXSBkaWFsb2cgdG9vbCAnJHt0b29sLmlkfScgbW91bnQoKSB0aHJldy5gLCBlcnIpO1xuICAgICAgdGhpcy50b29sRGlhbG9ncy5mYWlsQWN0aXZlKGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRoZSBkaWFsb2ctdG9vbCBzZXNzaW9uIGlzIGFib3V0IHRvIGVuZDogdGVhciB0aGUgYm9keSBkb3duIGZpcnN0LCB0aGVuIGRyb3AgdGhlIGRpYWxvZy4gKi9cbiAgcHJpdmF0ZSBoaWRlVG9vbERpYWxvZygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50b29sRGlhbG9nRnJhbWUgIT09IG51bGwpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMudG9vbERpYWxvZ0ZyYW1lKTtcbiAgICB0aGlzLnRvb2xEaWFsb2dGcmFtZSA9IG51bGw7XG4gICAgY29uc3QgdGVhcmRvd24gPSB0aGlzLnRvb2xEaWFsb2dUZWFyZG93bjtcbiAgICB0aGlzLnRvb2xEaWFsb2dUZWFyZG93biA9IG51bGw7XG4gICAgaWYgKHRlYXJkb3duKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0ZWFyZG93bigpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1t2aXN1YWxpemVyXSBkaWFsb2cgdG9vbCBib2R5IHRlYXJkb3duIHRocmV3LicsIGVycik7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdGhpcy50b29sRGlhbG9nKSByZXR1cm47XG4gICAgdGhpcy50b29sRGlhbG9nLmhvc3QucmVtb3ZlKCk7XG4gICAgdGhpcy50b29sRGlhbG9nID0gbnVsbDtcbiAgICBpZiAoIXRoaXMuZGVzdHJveWluZykgdGhpcy5kZXRlY3RDaGFuZ2VzU2FmZWx5KCk7XG4gIH1cblxuICAvKiogQSBkaWFsb2cgdG9vbCBjb3VsZCBub3Qgc3RhcnQ6IGNsb3NlIGl0IGFuZCBzYXkgc28uICovXG4gIHByaXZhdGUgZGlhbG9nVG9vbEZhaWxlZChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGVzdHJveWluZyB8fCB0aGlzLm9wZW5EaWFsb2dUb29sSWQgIT09IGlkKSByZXR1cm47XG4gICAgdGhpcy52aWV3ZXIuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5vcGVuRGlhbG9nVG9vbElkID0gbnVsbDtcbiAgICAgIGNvbnN0IHRvb2wgPSB0aGlzLmRpYWxvZ1Rvb2xzLmZpbmQoKHQpID0+IHQuaWQgPT09IGlkKTtcbiAgICAgIHRoaXMudmlld2VyLm5vdGlmeSh7XG4gICAgICAgIHNldmVyaXR5OiAnd2FybicsXG4gICAgICAgIHN1bW1hcnk6IGAke3Rvb2w/LmxhYmVsID8/IGlkfSBpcyB1bmF2YWlsYWJsZWAsXG4gICAgICAgIGRldGFpbDogJ1RoZSB0b29sIGNvdWxkIG5vdCBzdGFydC4gU2VlIHRoZSBicm93c2VyIGNvbnNvbGUgZm9yIGRldGFpbHMuJyxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5kZXRlY3RDaGFuZ2VzU2FmZWx5KCk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogUnVuIGNoYW5nZSBkZXRlY3Rpb247IHJldHVybnMgd2hhdCBpdCB0aHJldyAobG9nZ2VkKSwgb3IgbnVsbC4gKi9cbiAgcHJpdmF0ZSBkZXRlY3RDaGFuZ2VzU2FmZWx5KCk6IHVua25vd24gfCBudWxsIHtcbiAgICBpZiAodGhpcy5kZXN0cm95aW5nKSByZXR1cm4gbnVsbDtcbiAgICB0cnkge1xuICAgICAgdGhpcy52aWV3ZXIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbdmlzdWFsaXplcl0gY2hhbmdlIGRldGVjdGlvbiBmYWlsZWQgd2hpbGUgdXBkYXRpbmcgYSBjb250cmlidXRlZCBwbG90IG1vZGUgcGFuZWwuJywgZXJyKTtcbiAgICAgIHJldHVybiBlcnIgPz8gbmV3IEVycm9yKCdjaGFuZ2UgZGV0ZWN0aW9uIGZhaWxlZCcpO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
@@ -33,8 +33,8 @@ export function normalizeContributions(raw, log = console) {
|
|
|
33
33
|
continue;
|
|
34
34
|
}
|
|
35
35
|
if (!SUPPORTED_CONTRIBUTION_BASE_TYPES.includes(d.baseType)) {
|
|
36
|
-
log.warn(`${TAG} '${id}' ignored: baseType '${String(d.baseType)}' is not supported `
|
|
37
|
-
|
|
36
|
+
log.warn(`${TAG} '${id}' ignored: baseType '${String(d.baseType)}' is not supported ` +
|
|
37
|
+
`(supported: ${SUPPORTED_CONTRIBUTION_BASE_TYPES.join(', ')}).`);
|
|
38
38
|
continue;
|
|
39
39
|
}
|
|
40
40
|
seen.add(id);
|
|
@@ -121,7 +121,10 @@ export class PlotModeController {
|
|
|
121
121
|
return resolve();
|
|
122
122
|
}
|
|
123
123
|
if (isThenable(result)) {
|
|
124
|
-
result.then((session) => {
|
|
124
|
+
result.then((session) => {
|
|
125
|
+
this.start(contribution, ctx, session, gen);
|
|
126
|
+
resolve();
|
|
127
|
+
}, (err) => {
|
|
125
128
|
if (gen === this.generation)
|
|
126
129
|
this.fail(contribution, err);
|
|
127
130
|
resolve();
|
|
@@ -223,8 +226,8 @@ export class PlotModeController {
|
|
|
223
226
|
}
|
|
224
227
|
fail(contribution, err) {
|
|
225
228
|
this.pendingId = null;
|
|
226
|
-
this.log.error(`${TAG} '${contribution.descriptor.type}' failed to activate — `
|
|
227
|
-
|
|
229
|
+
this.log.error(`${TAG} '${contribution.descriptor.type}' failed to activate — ` +
|
|
230
|
+
`falling back to '${contribution.descriptor.baseType}'.`, err);
|
|
228
231
|
try {
|
|
229
232
|
this.hooks.onFailed(contribution, err);
|
|
230
233
|
}
|
|
@@ -326,4 +329,4 @@ export class PlotModeController {
|
|
|
326
329
|
function isThenable(v) {
|
|
327
330
|
return !!v && typeof v.then === 'function';
|
|
328
331
|
}
|
|
329
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxvdC1tb2RlLWNvbnRyb2xsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Bsb3QtbW9kZS9wbG90LW1vZGUtY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFjLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFpRGpGLGlFQUFpRTtBQUNqRSxNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBd0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFFdkYsMkVBQTJFO0FBQzNFLE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxDQUFDO0FBRTdCLE1BQU0sR0FBRyxHQUFHLHFDQUFxQyxDQUFDO0FBRWxEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxHQUEwQyxFQUMxQyxNQUFzQixPQUFPO0lBRTdCLE1BQU0sR0FBRyxHQUEyQixFQUFFLENBQUM7SUFDdkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUMvQixNQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RSxLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQThCLEVBQUUsQ0FBQztRQUMvQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsVUFBdUQsQ0FBQztRQUNyRSxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDO1FBQ25CLElBQUksQ0FBQyxDQUFDLElBQUksT0FBTyxFQUFFLEtBQUssUUFBUSxJQUFJLENBQUMsRUFBRSxJQUFJLE9BQU8sQ0FBQyxDQUFDLFFB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UUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDZCxDQUFDO0NBQ0Y7QUFFRCxTQUFTLFVBQVUsQ0FBSSxDQUEyQjtJQUNoRCxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBUSxDQUFnQixDQUFDLElBQUksS0FBSyxVQUFVLENBQUM7QUFDN0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFBsb3RUeXBlLCBQbG90VHlwZUlkLCBpc0J1aWx0aW5QbG90VHlwZSB9IGZyb20gJy4uL2NvbnRyYWN0cy9wbG90LXR5cGUnO1xuaW1wb3J0IHtcbiAgQ29udHJpYnV0ZWRQbG90VHlwZURlc2NyaXB0b3IsXG4gIFBsb3RNb2RlQ29udGV4dCxcbiAgUGxvdE1vZGVTZXNzaW9uLFxuICBQbG90VHlwZUNvbnRyaWJ1dGlvbixcbn0gZnJvbSAnLi4vY29udHJhY3RzL3Bsb3QtdHlwZS1jb250cmlidXRpb24uY29udHJhY3QnO1xuXG4vKipcbiAqIExpZmVjeWNsZSBvZiB0aGUgY29udHJpYnV0ZWQgcGxvdCBtb2RlcyAoe0BsaW5rIFBsb3RUeXBlQ29udHJpYnV0aW9ufSkgZm9yIG9uZVxuICogdmlzdWFsaXplciBpbnN0YW5jZS4gUGFja2FnZS1pbnRlcm5hbDogdGhlIHZpc3VhbGl6ZXIgY29tcG9uZW50IG93bnMgb25lIGFuZFxuICogZHJpdmVzIGl0IGZyb20gaXRzIHJlbmRlciBwaXBlbGluZS5cbiAqXG4gKiBPd25zIHRocmVlIHRoaW5ncyB0aGUgY29tcG9uZW50IHNob3VsZCBub3QgaGF2ZSB0byByZWFzb24gYWJvdXQ6XG4gKiAgLSB3aGljaCBjb250cmlidXRpb25zIGFyZSB1c2FibGUgKHZhbGlkYXRlZCBhbmQgZGUtZHVwbGljYXRlZCBvbmNlKTtcbiAqICAtIHRoZSBzaW5nbGUgbGl2ZSBzZXNzaW9uLCBzbyBgZGVhY3RpdmF0ZSgpYCBydW5zIGV4YWN0bHkgb25jZSBwZXIgc2Vzc2lvblxuICogICAgaG93ZXZlciBtYW55IGV4aXRzIHJhY2UgZWFjaCBvdGhlciAodHlwZSBjaGFuZ2UsIGltYWdlIGNoYW5nZSwgZGVzdHJveSxcbiAqICAgIGEgc3VwZXJzZWRlZCBhc3luYyBhY3RpdmF0aW9uKTtcbiAqICAtIGlzb2xhdGlvbjogbm90aGluZyBhIGNvbnRyaWJ1dGlvbiB0aHJvd3Mgb3IgcmVqZWN0cyBlc2NhcGVzIHRoaXMgY2xhc3MuXG4gKiAgICBBIGZhaWx1cmUgaXMgbG9nZ2VkIGFuZCByZXBvcnRlZCB0aHJvdWdoIGBvbkZhaWxlZGAsIGFuZCB0aGUgY29tcG9uZW50XG4gKiAgICBmYWxscyBiYWNrIHRvIHRoZSBtb2RlJ3MgYmFzZSB0eXBlLlxuICovXG5cbi8qKiBUaGUgbGl2ZSBhY3RpdmF0aW9uIG9mIGEgY29udHJpYnV0ZWQgbW9kZSwgYXMgdGhlIGNvbXBvbmVudCByZW5kZXJzIGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY3RpdmVQbG90TW9kZSB7XG4gIHJlYWRvbmx5IGNvbnRyaWJ1dGlvbjogUGxvdFR5cGVDb250cmlidXRpb247XG4gIHJlYWRvbmx5IGN0eDogUGxvdE1vZGVDb250ZXh0O1xuICByZWFkb25seSBzZXNzaW9uOiBQbG90TW9kZVNlc3Npb247XG4gIC8qKiBIb3N0IGVsZW1lbnQgaGFuZGVkIHRvIGEgYG1vdW50YCBwYW5lbCwgb3IgbnVsbCBmb3IgYSBjb21wb25lbnQgLyBubyBwYW5lbC4gKi9cbiAgcmVhZG9ubHkgcGFuZWxIb3N0OiBIVE1MRWxlbWVudCB8IG51bGw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGxvdE1vZGVDb250cm9sbGVySG9va3Mge1xuICAvKiogQSBzZXNzaW9uIGlzIGxpdmUgKGFuZCBhIGBtb3VudGAgcGFuZWwsIGlmIGFueSwgaGFzIGJlZW4gbW91bnRlZCkuICovXG4gIG9uQWN0aXZhdGVkKGFjdGl2ZTogQWN0aXZlUGxvdE1vZGUpOiB2b2lkO1xuICAvKiogVGhlIGxpdmUgc2Vzc2lvbiBpcyBhYm91dCB0byBlbmQuIENhbGxlZCBCRUZPUkUgYW55IHRlYXJkb3duLCBzbyBhXG4gICAqICBjb21wb25lbnQgcGFuZWwgY2FuIGJlIGRlc3Ryb3llZCB3aGlsZSBpdHMgc2Vzc2lvbiBpcyBzdGlsbCB2YWxpZC4gKi9cbiAgb25EZWFjdGl2YXRpbmcoYWN0aXZlOiBBY3RpdmVQbG90TW9kZSk6IHZvaWQ7XG4gIC8qKiBBY3RpdmF0aW9uIGZhaWxlZCAodGhyZXcsIHJlamVjdGVkLCBuZXZlciBnb3QgYSByZWFkeSB2aWV3cG9ydCwgb3IgaXRzXG4gICAqICBwYW5lbCBmYWlsZWQgdG8gbW91bnQpLiBUaGUgY29tcG9uZW50IGZhbGxzIGJhY2sgdG8gdGhlIGJhc2UgdHlwZS4gKi9cbiAgb25GYWlsZWQoY29udHJpYnV0aW9uOiBQbG90VHlwZUNvbnRyaWJ1dGlvbiwgZXJyb3I6IHVua25vd24pOiB2b2lkO1xufVxuXG4vKiogTWluaW1hbCBsb2dnZXIsIGluamVjdGFibGUgZm9yIHRlc3RzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbG90TW9kZUxvZ2dlciB7XG4gIHdhcm4oLi4uYXJnczogdW5rbm93bltdKTogdm9pZDtcbiAgZXJyb3IoLi4uYXJnczogdW5rbm93bltdKTogdm9pZDtcbn1cblxuLyoqIEJhc2UgdHlwZXMgYSBjb250cmlidXRlZCBtb2RlIGNhbiByaWRlIG9uIGluIHRoaXMgdmVyc2lvbi4gKi9cbmV4cG9ydCBjb25zdCBTVVBQT1JURURfQ09OVFJJQlVUSU9OX0JBU0VfVFlQRVM6IHJlYWRvbmx5IFBsb3RUeXBlW10gPSBbUGxvdFR5cGUuSU1BR0VdO1xuXG4vKiogSG93IG1hbnkgYW5pbWF0aW9uIGZyYW1lcyB0byB3YWl0IGZvciB0aGUgdmlld3BvcnQgYmVmb3JlIGdpdmluZyB1cC4gKi9cbmNvbnN0IE1BWF9SRUFEWV9GUkFNRVMgPSAxODA7XG5cbmNvbnN0IFRBRyA9ICdbdmlzdWFsaXplcl0gcGxvdC10eXBlIGNvbnRyaWJ1dGlvbic7XG5cbi8qKlxuICogVmFsaWRhdGUgd2hhdCBhcnJpdmVkIG9uIGBQTE9UX1RZUEVfQ09OVFJJQlVUSU9OU2AuIEEgbWFsZm9ybWVkIG9yIGNsYXNoaW5nXG4gKiBjb250cmlidXRpb24gaXMgZHJvcHBlZCB3aXRoIGEgd2FybmluZyByYXRoZXIgdGhhbiBicmVha2luZyB0aGUgc2VsZWN0b3I6XG4gKiAgLSBhIG5lc3RlZCBhcnJheSAoYHVzZVZhbHVlOiBbYSwgYl0sIG11bHRpOiB0cnVlYCkgaXMgZmxhdHRlbmVkIG9uZSBsZXZlbDtcbiAqICAtIGB0eXBlYCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZyB0aGF0IGlzIG5vdCBhIGJ1aWx0LWluIGBQbG90VHlwZWAgdmFsdWU7XG4gKiAgLSB0aGUgZmlyc3QgY29udHJpYnV0aW9uIHdpdGggYSBnaXZlbiBgdHlwZWAgd2lucztcbiAqICAtIGBiYXNlVHlwZWAgbXVzdCBiZSBvbmUgb2Yge0BsaW5rIFNVUFBPUlRFRF9DT05UUklCVVRJT05fQkFTRV9UWVBFU307XG4gKiAgLSBgYWN0aXZhdGVgIG11c3QgYmUgYSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUNvbnRyaWJ1dGlvbnMoXG4gIHJhdzogcmVhZG9ubHkgdW5rbm93bltdIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgbG9nOiBQbG90TW9kZUxvZ2dlciA9IGNvbnNvbGUsXG4pOiBQbG90VHlwZUNvbnRyaWJ1dGlvbltdIHtcbiAgY29uc3Qgb3V0OiBQbG90VHlwZUNvbnRyaWJ1dGlvbltdID0gW107XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZmxhdCA9IChyYXcgPz8gW10pLmZsYXRNYXAoKGMpID0+IChBcnJheS5pc0FycmF5KGMpID8gYyA6IFtjXSkpO1xuICBmb3IgKGNvbnN0IGMgb2YgZmxhdCBhcyBQbG90VHlwZUNvbnRyaWJ1dGlvbltdKSB7XG4gICAgY29uc3QgZCA9IGM/LmRlc2NyaXB0b3IgYXMgQ29udHJpYnV0ZWRQbG90VHlwZURlc2NyaXB0b3IgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgaWQgPSBkPy50eXBlO1xuICAgIGlmICghZCB8fCB0eXBlb2YgaWQgIT09ICdzdHJpbmcnIHx8ICFpZCB8fCB0eXBlb2YgYy5hY3RpdmF0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgbG9nLndhcm4oYCR7VEFHfSBpZ25vcmVkOiBpdCBuZWVkcyBhIGRlc2NyaXB0b3Igd2l0aCBhIHN0cmluZyBcXGB0eXBlXFxgIGFuZCBhbiBcXGBhY3RpdmF0ZVxcYCBmdW5jdGlvbi5gLCBjKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoaXNCdWlsdGluUGxvdFR5cGUoaWQpKSB7XG4gICAgICBsb2cud2FybihgJHtUQUd9ICcke2lkfScgaWdub3JlZDogdGhlIGlkIGNsYXNoZXMgd2l0aCBhIGJ1aWx0LWluIHBsb3QgdHlwZS5gKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoc2Vlbi5oYXMoaWQpKSB7XG4gICAgICBsb2cud2FybihgJHtUQUd9ICcke2lkfScgaWdub3JlZDogYW5vdGhlciBjb250cmlidXRpb24gYWxyZWFkeSB1c2VzIHRoYXQgaWQuYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCFTVVBQT1JURURfQ09OVFJJQlVUSU9OX0JBU0VfVFlQRVMuaW5jbHVkZXMoZC5iYXNlVHlwZSkpIHtcbiAgICAgIGxvZy53YXJuKGAke1RBR30gJyR7aWR9JyBpZ25vcmVkOiBiYXNlVHlwZSAnJHtTdHJpbmcoZC5iYXNlVHlwZSl9JyBpcyBub3Qgc3VwcG9ydGVkIGBcbiAgICAgICAgKyBgKHN1cHBvcnRlZDogJHtTVVBQT1JURURfQ09OVFJJQlVUSU9OX0JBU0VfVFlQRVMuam9pbignLCAnKX0pLmApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHNlZW4uYWRkKGlkKTtcbiAgICBvdXQucHVzaChjKTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG5leHBvcnQgY2xhc3MgUGxvdE1vZGVDb250cm9sbGVyIHtcbiAgcmVhZG9ubHkgY29udHJpYnV0aW9uczogcmVhZG9ubHkgUGxvdFR5cGVDb250cmlidXRpb25bXTtcbiAgcHJpdmF0ZSByZWFkb25seSBieUlkOiBSZWFkb25seU1hcDxzdHJpbmcsIFBsb3RUeXBlQ29udHJpYnV0aW9uPjtcblxuICBwcml2YXRlIGFjdGl2ZTogQWN0aXZlUGxvdE1vZGUgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSB0ZWFyZG93bjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBCdW1wZWQgYnkgZXZlcnkgYWN0aXZhdGUvZGVhY3RpdmF0ZSwgc28gYSBwZW5kaW5nIGFzeW5jIGFjdGl2YXRpb24gY2FuXG4gICAqICB0ZWxsIGl0IGhhcyBiZWVuIHN1cGVyc2VkZWQuICovXG4gIHByaXZhdGUgZ2VuZXJhdGlvbiA9IDA7XG4gIHByaXZhdGUgcmVhZHlGcmFtZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBDb250cmlidXRpb25zIHdob3NlIGxhc3QgY2xlYW51cCAocGFuZWwgdGVhcmRvd24gLyBgZGVhY3RpdmF0ZSgpYCkgdGhyZXcgb3JcbiAgICogIHJlamVjdGVkLiBUaGVpciBuZXh0IGF1dG9tYXRpYyByZS1hY3RpdmF0aW9uIChiYXNlIHJlLXJlbmRlciwgaW1hZ2Ugc3dpdGNoKVxuICAgKiAgZmFsbHMgYmFjayB0byB0aGUgYmFzZSB0eXBlIGluc3RlYWQ7IGFuIGV4cGxpY2l0IHNlbGVjdGlvbiBjbGVhcnMgdGhlIG1hcmsuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZmFpbGVkQ2xlYW51cCA9IG5ldyBNYXA8c3RyaW5nLCB1bmtub3duPigpO1xuICBwcml2YXRlIHJlYWR5Q2I6ICgocmVhZHk6IGJvb2xlYW4pID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmF3OiByZWFkb25seSB1bmtub3duW10gfCBudWxsIHwgdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgaG9va3M6IFBsb3RNb2RlQ29udHJvbGxlckhvb2tzLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9nOiBQbG90TW9kZUxvZ2dlciA9IGNvbnNvbGUsXG4gICkge1xuICAgIHRoaXMuY29udHJpYnV0aW9ucyA9IG5vcm1hbGl6ZUNvbnRyaWJ1dGlvbnMocmF3LCBsb2cpO1xuICAgIHRoaXMuYnlJZCA9IG5ldyBNYXAodGhpcy5jb250cmlidXRpb25zLm1hcCgoYykgPT4gW2MuZGVzY3JpcHRvci50eXBlLCBjXSkpO1xuICB9XG5cbiAgLyoqIERlc2NyaXB0b3JzIG9mIHRoZSB1c2FibGUgY29udHJpYnV0aW9ucywgaW4gcmVnaXN0cmF0aW9uIG9yZGVyLiAqL1xuICBkZXNjcmlwdG9ycygpOiBDb250cmlidXRlZFBsb3RUeXBlRGVzY3JpcHRvcltdIHtcbiAgICByZXR1cm4gdGhpcy5jb250cmlidXRpb25zLm1hcCgoYykgPT4gYy5kZXNjcmlwdG9yKTtcbiAgfVxuXG4gIC8qKiBUaGUgY29udHJpYnV0aW9uIGZvciBhIHNlbGVjdG9yIGlkLCBpZiBpdCBpcyBhIGNvbnRyaWJ1dGVkIG1vZGUuICovXG4gIGZpbmQoaWQ6IFBsb3RUeXBlSWQgfCBudWxsIHwgdW5kZWZpbmVkKTogUGxvdFR5cGVDb250cmlidXRpb24gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0eXBlb2YgaWQgPT09ICdzdHJpbmcnID8gdGhpcy5ieUlkLmdldChpZCkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGJ1aWx0LWluIHR5cGUgdGhhdCByZW5kZXJzIGBpZGA6IGEgYnVpbHQtaW4gdHlwZSBpcyBpdHNlbGYsIGFcbiAgICogY29udHJpYnV0ZWQgaWQgaXMgaXRzIGBiYXNlVHlwZWAsIGFuZCBhbiBpZCB0aGF0IGlzIG5laXRoZXIgKGEgc3RhbGVcbiAgICogY29udHJpYnV0ZWQgaWQgd2hvc2UgcHJvdmlkZXIgaXMgZ29uZSkgcmVzb2x2ZXMgdG8gYFBsb3RUeXBlLklNQUdFYCwgdGhlXG4gICAqIGRlZmF1bHQgdmlldy5cbiAgICovXG4gIGJhc2VUeXBlT2YoaWQ6IFBsb3RUeXBlSWQgfCBudWxsIHwgdW5kZWZpbmVkKTogUGxvdFR5cGUge1xuICAgIGlmIChpc0J1aWx0aW5QbG90VHlwZShpZCkpIHJldHVybiBpZDtcbiAgICByZXR1cm4gdGhpcy5maW5kKGlkKT8uZGVzY3JpcHRvci5iYXNlVHlwZSA/PyBQbG90VHlwZS5JTUFHRTtcbiAgfVxuXG4gIC8qKiBUaGUgbGl2ZSBzZXNzaW9uLCBpZiBhbnkuICovXG4gIGdldCBjdXJyZW50KCk6IEFjdGl2ZVBsb3RNb2RlIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuYWN0aXZlO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYW4gYWN0aXZhdGlvbiBpcyB3YWl0aW5nIG9uIHRoZSBjb250cmlidXRpb24gb3IgdGhlIHZpZXdwb3J0LiAqL1xuICBnZXQgcGVuZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wZW5kaW5nSWQgIT09IG51bGw7XG4gIH1cbiAgcHJpdmF0ZSBwZW5kaW5nSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBTdGFydCBhIHNlc3Npb24gZm9yIGBjb250cmlidXRpb25gLiBFbmRzIGFueSBsaXZlIG9uZSBmaXJzdC4gUmVzb2x2ZXMgd2hlblxuICAgKiB0aGUgYXR0ZW1wdCBoYXMgZmluaXNoZWQgKHN1Y2Nlc3NmdWxseSBvciBub3QpOyBpdCBuZXZlciByZWplY3RzLlxuICAgKi9cbiAgYWN0aXZhdGUoY29udHJpYnV0aW9uOiBQbG90VHlwZUNvbnRyaWJ1dGlvbiwgY3R4OiBQbG90TW9kZUNvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmRlYWN0aXZhdGUoKTtcbiAgICBjb25zdCBpZCA9IGNvbnRyaWJ1dGlvbi5kZXNjcmlwdG9yLnR5cGU7XG4gICAgaWYgKHRoaXMuZmFpbGVkQ2xlYW51cC5oYXMoaWQpKSB7XG4gICAgICAvLyBJdHMgcHJldmlvdXMgc2Vzc2lvbiBkaWQgbm90IGVuZCBjbGVhbmx5OyBkbyBub3Qgc3RhY2sgYSBuZXcgb25lIG9uIHRvcC5cbiAgICAgIGNvbnN0IGVyciA9IHRoaXMuZmFpbGVkQ2xlYW51cC5nZXQoaWQpO1xuICAgICAgdGhpcy5mYWlsZWRDbGVhbnVwLmRlbGV0ZShpZCk7XG4gICAgICB0aGlzLmZhaWwoY29udHJpYnV0aW9uLCBlcnIpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cbiAgICBjb25zdCBnZW4gPSArK3RoaXMuZ2VuZXJhdGlvbjtcbiAgICB0aGlzLnBlbmRpbmdJZCA9IGlkO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy53aGVuUmVhZHkoY3R4LCBnZW4sIChyZWFkeSkgPT4ge1xuICAgICAgICBpZiAoZ2VuICE9PSB0aGlzLmdlbmVyYXRpb24pIHJldHVybiByZXNvbHZlKCk7XG4gICAgICAgIGlmICghcmVhZHkpIHtcbiAgICAgICAgICB0aGlzLmZhaWwoY29udHJpYnV0aW9uLCBuZXcgRXJyb3IoJ3RoZSB2aWV3cG9ydCBuZXZlciBiZWNhbWUgcmVhZHknKSk7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzdWx0OiBQbG90TW9kZVNlc3Npb24gfCBQcm9taXNlPFBsb3RNb2RlU2Vzc2lvbj47XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVzdWx0ID0gY29udHJpYnV0aW9uLmFjdGl2YXRlKGN0eCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHRoaXMuZmFpbChjb250cmlidXRpb24sIGVycik7XG4gICAgICAgICAgcmV0dXJuIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNUaGVuYWJsZShyZXN1bHQpKSB7XG4gICAgICAgICAgcmVzdWx0LnRoZW4oXG4gICAgICAgICAgICAoc2Vzc2lvbikgPT4geyB0aGlzLnN0YXJ0KGNvbnRyaWJ1dGlvbiwgY3R4LCBzZXNzaW9uLCBnZW4pOyByZXNvbHZlKCk7IH0sXG4gICAgICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChnZW4gPT09IHRoaXMuZ2VuZXJhdGlvbikgdGhpcy5mYWlsKGNvbnRyaWJ1dGlvbiwgZXJyKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc3RhcnQoY29udHJpYnV0aW9uLCBjdHgsIHJlc3VsdCwgZ2VuKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuZCB0aGUgbGl2ZSBzZXNzaW9uLCBpZiBhbnk6IHRoZSBjb21wb25lbnQgcGFuZWwgaXMgZHJvcHBlZCAodmlhXG4gICAqIGBvbkRlYWN0aXZhdGluZ2ApLCBhIGBtb3VudGAgcGFuZWwncyB0ZWFyZG93biBydW5zLCB0aGVuXG4gICAqIGBzZXNzaW9uLmRlYWN0aXZhdGUoKWAsIHRoZW4gdGhlIG1vdW50IGhvc3QgaXMgcmVtb3ZlZC4gRWFjaCBzdGVwIGlzXG4gICAqIGlzb2xhdGVkLiBBIHBlbmRpbmcgYWN0aXZhdGlvbiBpcyBjYW5jZWxsZWQ7IGlmIGl0IHJlc29sdmVzIGxhdGVyIGl0c1xuICAgKiBzZXNzaW9uIGlzIGRlYWN0aXZhdGVkIG9uIGFycml2YWwuIElkZW1wb3RlbnQuXG4gICAqL1xuICBkZWFjdGl2YXRlKCk6IHZvaWQge1xuICAgIHRoaXMuZ2VuZXJhdGlvbisrO1xuICAgIHRoaXMucGVuZGluZ0lkID0gbnVsbDtcbiAgICB0aGlzLmNhbmNlbFJlYWR5V2FpdCgpO1xuICAgIGNvbnN0IGEgPSB0aGlzLmFjdGl2ZTtcbiAgICBpZiAoIWEpIHJldHVybjtcbiAgICB0aGlzLmFjdGl2ZSA9IG51bGw7XG4gICAgY29uc3QgdGVhcmRvd24gPSB0aGlzLnRlYXJkb3duO1xuICAgIHRoaXMudGVhcmRvd24gPSBudWxsO1xuICAgIGNvbnN0IGlkID0gYS5jb250cmlidXRpb24uZGVzY3JpcHRvci50eXBlO1xuICAgIHRoaXMuZ3VhcmQoYCcke2lkfScgcGFuZWwgcmVtb3ZhbGAsICgpID0+IHRoaXMuaG9va3Mub25EZWFjdGl2YXRpbmcoYSkpO1xuICAgIGlmICh0ZWFyZG93bikgdGhpcy5jbGVhbnVwKGEuY29udHJpYnV0aW9uLCAncGFuZWwgdGVhcmRvd24nLCB0ZWFyZG93bik7XG4gICAgdGhpcy5jbGVhbnVwKGEuY29udHJpYnV0aW9uLCAnZGVhY3RpdmF0ZSgpJywgKCkgPT4gYS5zZXNzaW9uLmRlYWN0aXZhdGUoKSk7XG4gICAgYS5wYW5lbEhvc3Q/LnJlbW92ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcmdldCByZWNvcmRlZCBjbGVhbnVwIGZhaWx1cmVzLiBUaGUgaG9zdCBjYWxscyB0aGlzIHdoZW4gdGhlIFVTRVIgcGlja3MgYVxuICAgKiBwbG90IHR5cGU6IGFuIGV4cGxpY2l0IGNob2ljZSBnZXRzIGEgZnJlc2ggYXR0ZW1wdCwgb25seSBhdXRvbWF0aWNcbiAgICogcmUtYWN0aXZhdGlvbnMgZmFsbCBiYWNrLlxuICAgKi9cbiAgY2xlYXJDbGVhbnVwRmFpbHVyZXMoKTogdm9pZCB7XG4gICAgdGhpcy5mYWlsZWRDbGVhbnVwLmNsZWFyKCk7XG4gIH1cblxuICAvLyDilIDilIAgaW50ZXJuYWxzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIHByaXZhdGUgc3RhcnQoY29udHJpYnV0aW9uOiBQbG90VHlwZUNvbnRyaWJ1dGlvbiwgY3R4OiBQbG90TW9kZUNvbnRleHQsXG4gICAgICAgICAgICAgICAgc2Vzc2lvbjogUGxvdE1vZGVTZXNzaW9uLCBnZW46IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGlkID0gY29udHJpYnV0aW9uLmRlc2NyaXB0b3IudHlwZTtcbiAgICBpZiAoIXNlc3Npb24gfHwgdHlwZW9mIHNlc3Npb24uZGVhY3RpdmF0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKGdlbiA9PT0gdGhpcy5nZW5lcmF0aW9uKSB7XG4gICAgICAgIHRoaXMuZmFpbChjb250cmlidXRpb24sIG5ldyBFcnJvcignYWN0aXZhdGUoKSBkaWQgbm90IHJldHVybiBhIFBsb3RNb2RlU2Vzc2lvbicpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGdlbiAhPT0gdGhpcy5nZW5lcmF0aW9uKSB7XG4gICAgICAvLyBTdXBlcnNlZGVkIHdoaWxlIGFjdGl2YXRlKCkgd2FzIGluIGZsaWdodCDigJQgdGhlIHVzZXIgYWxyZWFkeSBsZWZ0LiBUaGVcbiAgICAgIC8vIHNlc3Npb24gc3RpbGwgZ2V0cyBpdHMgc2luZ2xlIGRlYWN0aXZhdGUoKSwganVzdCBsYXRlLlxuICAgICAgdGhpcy5ndWFyZExvZ2dlZChgJyR7aWR9JyBkZWFjdGl2YXRlKCkgb2YgYSBzdXBlcnNlZGVkIHNlc3Npb25gLCAoKSA9PiBzZXNzaW9uLmRlYWN0aXZhdGUoKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucGVuZGluZ0lkID0gbnVsbDtcbiAgICBjb25zdCBwYW5lbCA9IGNvbnRyaWJ1dGlvbi5wYW5lbDtcbiAgICBsZXQgcGFuZWxIb3N0OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGxldCB0ZWFyZG93bjogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gICAgaWYgKHBhbmVsICYmICdtb3VudCcgaW4gcGFuZWwgJiYgdHlwZW9mIHBhbmVsLm1vdW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBwYW5lbEhvc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIHBhbmVsSG9zdC5jbGFzc05hbWUgPSAncGxvdC1tb2RlLXBhbmVsLWhvc3QnO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdCA9IHBhbmVsLm1vdW50KHBhbmVsSG9zdCwgY3R4LCBzZXNzaW9uKTtcbiAgICAgICAgdGVhcmRvd24gPSB0eXBlb2YgdCA9PT0gJ2Z1bmN0aW9uJyA/IHQgOiBudWxsO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHBhbmVsSG9zdC5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy5ndWFyZExvZ2dlZChgJyR7aWR9JyBkZWFjdGl2YXRlKClgLCAoKSA9PiBzZXNzaW9uLmRlYWN0aXZhdGUoKSk7XG4gICAgICAgIHRoaXMuZmFpbChjb250cmlidXRpb24sIGVycik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hY3RpdmUgPSB7IGNvbnRyaWJ1dGlvbiwgY3R4LCBzZXNzaW9uLCBwYW5lbEhvc3QgfTtcbiAgICB0aGlzLnRlYXJkb3duID0gdGVhcmRvd247XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuaG9va3Mub25BY3RpdmF0ZWQodGhpcy5hY3RpdmUpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gVGhlIGhvc3QgY291bGQgbm90IHNob3cgaXQgKGUuZy4gaXRzIHBhbmVsIGZhaWxlZCB0byByZW5kZXIpOiBub3QgYSB1c2FibGUgbW9kZS5cbiAgICAgIHRoaXMuZmFpbEFjdGl2ZShlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgaG9zdCBjb3VsZCBub3QgbWFrZSB0aGUgbGl2ZSBtb2RlIHVzYWJsZSAoaXRzIHBhbmVsIHRocmV3IHdoaWxlIGJlaW5nXG4gICAqIGNyZWF0ZWQgb3IgZmlyc3QgcmVuZGVyZWQpOiBlbmQgdGhlIHNlc3Npb24gb25jZSwgdGhlbiBmYWxsIGJhY2sgdG8gaXRzIGJhc2UuXG4gICAqIE5vLW9wIHdoZW4gbm90aGluZyBpcyBsaXZlLlxuICAgKi9cbiAgZmFpbEFjdGl2ZShlcnI6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBhID0gdGhpcy5hY3RpdmU7XG4gICAgaWYgKCFhKSByZXR1cm47XG4gICAgdGhpcy5kZWFjdGl2YXRlKCk7XG4gICAgdGhpcy5mYWlsKGEuY29udHJpYnV0aW9uLCBlcnIpO1xuICB9XG5cbiAgcHJpdmF0ZSBmYWlsKGNvbnRyaWJ1dGlvbjogUGxvdFR5cGVDb250cmlidXRpb24sIGVycjogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMucGVuZGluZ0lkID0gbnVsbDtcbiAgICB0aGlzLmxvZy5lcnJvcihgJHtUQUd9ICcke2NvbnRyaWJ1dGlvbi5kZXNjcmlwdG9yLnR5cGV9JyBmYWlsZWQgdG8gYWN0aXZhdGUg4oCUIGBcbiAgICAgICsgYGZhbGxpbmcgYmFjayB0byAnJHtjb250cmlidXRpb24uZGVzY3JpcHRvci5iYXNlVHlwZX0nLmAsIGVycik7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuaG9va3Mub25GYWlsZWQoY29udHJpYnV0aW9uLCBlcnIpO1xuICAgIH0gY2F0Y2ggKGhvb2tFcnIpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yKGAke1RBR30gZmFsbGJhY2sgZmFpbGVkLmAsIGhvb2tFcnIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ3VhcmQod2hhdDogc3RyaW5nLCBmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBmbigpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2cuZXJyb3IoYCR7VEFHfSAke3doYXR9IHRocmV3LmAsIGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqIExpa2UgYGd1YXJkYCwgZm9yIGEgY29udHJpYnV0aW9uIGNhbGxiYWNrIHR5cGVkIGB2b2lkYCB0aGF0IG1heSBzdGlsbCByZXR1cm4gYVxuICAgKiAgcHJvbWlzZTogYSByZWplY3Rpb24gaXMgbG9nZ2VkIGluc3RlYWQgb2YgZXNjYXBpbmcgYXMgYW4gdW5oYW5kbGVkIHJlamVjdGlvbi4gKi9cbiAgcHJpdmF0ZSBndWFyZExvZ2dlZCh3aGF0OiBzdHJpbmcsIGZuOiAoKSA9PiB1bmtub3duKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHIgPSBmbigpO1xuICAgICAgaWYgKGlzVGhlbmFibGUocikpIHIudGhlbih1bmRlZmluZWQsIChlcnIpID0+IHRoaXMubG9nLmVycm9yKGAke1RBR30gJHt3aGF0fSByZWplY3RlZC5gLCBlcnIpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubG9nLmVycm9yKGAke1RBR30gJHt3aGF0fSB0aHJldy5gLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSdW4gYSBsaXZlIHNlc3Npb24ncyBjbGVhbnVwOyBhIHRocm93IE9SIGEgcmVqZWN0aW9uIGdvZXMgdG8gYGNsZWFudXBGYWlsZWRgLiAqL1xuICBwcml2YXRlIGNsZWFudXAoY29udHJpYnV0aW9uOiBQbG90VHlwZUNvbnRyaWJ1dGlvbiwgd2hhdDogc3RyaW5nLCBmbjogKCkgPT4gdW5rbm93bik6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByID0gZm4oKTtcbiAgICAgIGlmIChpc1RoZW5hYmxlKHIpKSByLnRoZW4odW5kZWZpbmVkLCAoZXJyKSA9PiB0aGlzLmNsZWFudXBGYWlsZWQoY29udHJpYnV0aW9uLCB3aGF0LCBlcnIpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuY2xlYW51cEZhaWxlZChjb250cmlidXRpb24sIHdoYXQsIGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgY29udHJpYnV0aW9uJ3MgY2xlYW51cCBmYWlsZWQuIElmIHRoYXQgc2FtZSBjb250cmlidXRpb24gaXMgbGl2ZSBvciBzdGFydGluZ1xuICAgKiBhZ2FpbiAoYSBiYXNlIHJlLXJlbmRlciAvIGltYWdlIHN3aXRjaCByZS1hY3RpdmF0ZWQgaXQg4oCUIG9yLCBmb3IgYW4gYXN5bmNcbiAgICogcmVqZWN0aW9uLCBhbHJlYWR5IGhhcyksIGVuZCBpdCBhbmQgZmFsbCBiYWNrIHRvIGl0cyBiYXNlIHR5cGUuIE90aGVyd2lzZSB0aGVcbiAgICogdXNlciBoYXMgbW92ZWQgb246IHJlbWVtYmVyIGl0LCBzbyB0aGUgbmV4dCBhdXRvbWF0aWMgcmUtYWN0aXZhdGlvbiBmYWxscyBiYWNrLlxuICAgKi9cbiAgcHJpdmF0ZSBjbGVhbnVwRmFpbGVkKGNvbnRyaWJ1dGlvbjogUGxvdFR5cGVDb250cmlidXRpb24sIHdoYXQ6IHN0cmluZywgZXJyOiB1bmtub3duKTogdm9pZCB7XG4gICAgY29uc3QgaWQgPSBjb250cmlidXRpb24uZGVzY3JpcHRvci50eXBlO1xuICAgIHRoaXMubG9nLmVycm9yKGAke1RBR30gJyR7aWR9JyAke3doYXR9IGZhaWxlZC5gLCBlcnIpO1xuICAgIGNvbnN0IGFnYWluID0gdGhpcy5hY3RpdmU/LmNvbnRyaWJ1dGlvbiA9PT0gY29udHJpYnV0aW9uIHx8IHRoaXMucGVuZGluZ0lkID09PSBpZDtcbiAgICBpZiAoYWdhaW4pIHtcbiAgICAgIHRoaXMuZGVhY3RpdmF0ZSgpO1xuICAgICAgdGhpcy5mYWlsKGNvbnRyaWJ1dGlvbiwgZXJyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mYWlsZWRDbGVhbnVwLnNldChpZCwgZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2FsbCBgY2IodHJ1ZSlgIG9uY2UgdGhlIHZpZXdwb3J0IHJlcG9ydHMgcmVhZHkgKG5vdywgb3Igb24gYSBsYXRlclxuICAgKiAgYW5pbWF0aW9uIGZyYW1lKSwgb3IgYGNiKGZhbHNlKWAgYWZ0ZXIge0BsaW5rIE1BWF9SRUFEWV9GUkFNRVN9LiAqL1xuICBwcml2YXRlIHdoZW5SZWFkeShjdHg6IFBsb3RNb2RlQ29udGV4dCwgZ2VuOiBudW1iZXIsIGNiOiAocmVhZHk6IGJvb2xlYW4pID0+IHZvaWQpOiB2b2lkIHtcbiAgICBjb25zdCBpc1JlYWR5ID0gKCkgPT4ge1xuICAgICAgdHJ5IHsgcmV0dXJuIGN0eC52aWV3cG9ydC5pc1JlYWR5KCk7IH0gY2F0Y2ggeyByZXR1cm4gZmFsc2U7IH1cbiAgICB9O1xuICAgIGlmIChpc1JlYWR5KCkpIHJldHVybiBjYih0cnVlKTtcbiAgICBsZXQgZnJhbWVzID0gMDtcbiAgICBjb25zdCBzZXR0bGUgPSAocmVhZHk6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMucmVhZHlGcmFtZSA9IG51bGw7XG4gICAgICB0aGlzLnJlYWR5Q2IgPSBudWxsO1xuICAgICAgY2IocmVhZHkpO1xuICAgIH07XG4gICAgY29uc3QgdGljayA9ICgpID0+IHtcbiAgICAgIHRoaXMucmVhZHlGcmFtZSA9IG51bGw7XG4gICAgICBpZiAoZ2VuICE9PSB0aGlzLmdlbmVyYXRpb24pIHJldHVybiBzZXR0bGUoZmFsc2UpO1xuICAgICAgaWYgKGlzUmVhZHkoKSkgcmV0dXJuIHNldHRsZSh0cnVlKTtcbiAgICAgIGlmICgrK2ZyYW1lcyA+PSBNQVhfUkVBRFlfRlJBTUVTKSByZXR1cm4gc2V0dGxlKGZhbHNlKTtcbiAgICAgIHRoaXMucmVhZHlGcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aWNrKTtcbiAgICB9O1xuICAgIHRoaXMucmVhZHlDYiA9IHNldHRsZTtcbiAgICB0aGlzLnJlYWR5RnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7XG4gIH1cblxuICAvKiogU3RvcCB3YWl0aW5nIGZvciB0aGUgdmlld3BvcnQ7IHRoZSB3YWl0aW5nIGFjdGl2YXRpb24gcmVzb2x2ZXMgYXMgc3VwZXJzZWRlZC4gKi9cbiAgcHJpdmF0ZSBjYW5jZWxSZWFkeVdhaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVhZHlGcmFtZSAhPT0gbnVsbCkgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5yZWFkeUZyYW1lKTtcbiAgICB0aGlzLnJlYWR5RnJhbWUgPSBudWxsO1xuICAgIGNvbnN0IGNiID0gdGhpcy5yZWFkeUNiO1xuICAgIHRoaXMucmVhZHlDYiA9IG51bGw7XG4gICAgY2I/LihmYWxzZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNUaGVuYWJsZTxUPih2OiBUIHwgUHJvbWlzZTxUPiB8IHVua25vd24pOiB2IGlzIFByb21pc2U8VD4ge1xuICByZXR1cm4gISF2ICYmIHR5cGVvZiAodiBhcyBQcm9taXNlPFQ+KS50aGVuID09PSAnZnVuY3Rpb24nO1xufVxuIl19
|
|
332
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxvdC1tb2RlLWNvbnRyb2xsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3Bsb3QtbW9kZS9wbG90LW1vZGUtY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFjLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFpRGpGLGlFQUFpRTtBQUNqRSxNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBd0IsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFFdkYsMkVBQTJFO0FBQzNFLE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxDQUFDO0FBRTdCLE1BQU0sR0FBRyxHQUFHLHFDQUFxQyxDQUFDO0FBRWxEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLHNCQUFzQixDQUNwQyxHQUEwQyxFQUMxQyxNQUFzQixPQUFPO0lBRTdCLE1BQU0sR0FBRyxHQUEyQixFQUFFLENBQUM7SUFDdkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUMvQixNQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RSxLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQThCLEVBQUUsQ0FBQztRQUMvQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsVUFBdUQsQ0FBQztRQUNyRSxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDO1FBQ25CLElBQUksQ0FBQyxDQUFDLElBQUksT0FBTyxFQUFFLEtBQUssUUFBUSxJQUFJLENBQUMsRUFBRSxJQUFJLE9BQU8sQ0FBQyxDQUFDLFFB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QUFDO1FBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2QsQ0FBQztDQUNGO0FBRUQsU0FBUyxVQUFVLENBQUksQ0FBMkI7SUFDaEQsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLE9BQVEsQ0FBZ0IsQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDO0FBQzdELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQbG90VHlwZSwgUGxvdFR5cGVJZCwgaXNCdWlsdGluUGxvdFR5cGUgfSBmcm9tICcuLi9jb250cmFjdHMvcGxvdC10eXBlJztcbmltcG9ydCB7XG4gIENvbnRyaWJ1dGVkUGxvdFR5cGVEZXNjcmlwdG9yLFxuICBQbG90TW9kZUNvbnRleHQsXG4gIFBsb3RNb2RlU2Vzc2lvbixcbiAgUGxvdFR5cGVDb250cmlidXRpb24sXG59IGZyb20gJy4uL2NvbnRyYWN0cy9wbG90LXR5cGUtY29udHJpYnV0aW9uLmNvbnRyYWN0JztcblxuLyoqXG4gKiBMaWZlY3ljbGUgb2YgdGhlIGNvbnRyaWJ1dGVkIHBsb3QgbW9kZXMgKHtAbGluayBQbG90VHlwZUNvbnRyaWJ1dGlvbn0pIGZvciBvbmVcbiAqIHZpc3VhbGl6ZXIgaW5zdGFuY2UuIFBhY2thZ2UtaW50ZXJuYWw6IHRoZSB2aXN1YWxpemVyIGNvbXBvbmVudCBvd25zIG9uZSBhbmRcbiAqIGRyaXZlcyBpdCBmcm9tIGl0cyByZW5kZXIgcGlwZWxpbmUuXG4gKlxuICogT3ducyB0aHJlZSB0aGluZ3MgdGhlIGNvbXBvbmVudCBzaG91bGQgbm90IGhhdmUgdG8gcmVhc29uIGFib3V0OlxuICogIC0gd2hpY2ggY29udHJpYnV0aW9ucyBhcmUgdXNhYmxlICh2YWxpZGF0ZWQgYW5kIGRlLWR1cGxpY2F0ZWQgb25jZSk7XG4gKiAgLSB0aGUgc2luZ2xlIGxpdmUgc2Vzc2lvbiwgc28gYGRlYWN0aXZhdGUoKWAgcnVucyBleGFjdGx5IG9uY2UgcGVyIHNlc3Npb25cbiAqICAgIGhvd2V2ZXIgbWFueSBleGl0cyByYWNlIGVhY2ggb3RoZXIgKHR5cGUgY2hhbmdlLCBpbWFnZSBjaGFuZ2UsIGRlc3Ryb3ksXG4gKiAgICBhIHN1cGVyc2VkZWQgYXN5bmMgYWN0aXZhdGlvbik7XG4gKiAgLSBpc29sYXRpb246IG5vdGhpbmcgYSBjb250cmlidXRpb24gdGhyb3dzIG9yIHJlamVjdHMgZXNjYXBlcyB0aGlzIGNsYXNzLlxuICogICAgQSBmYWlsdXJlIGlzIGxvZ2dlZCBhbmQgcmVwb3J0ZWQgdGhyb3VnaCBgb25GYWlsZWRgLCBhbmQgdGhlIGNvbXBvbmVudFxuICogICAgZmFsbHMgYmFjayB0byB0aGUgbW9kZSdzIGJhc2UgdHlwZS5cbiAqL1xuXG4vKiogVGhlIGxpdmUgYWN0aXZhdGlvbiBvZiBhIGNvbnRyaWJ1dGVkIG1vZGUsIGFzIHRoZSBjb21wb25lbnQgcmVuZGVycyBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZlUGxvdE1vZGUge1xuICByZWFkb25seSBjb250cmlidXRpb246IFBsb3RUeXBlQ29udHJpYnV0aW9uO1xuICByZWFkb25seSBjdHg6IFBsb3RNb2RlQ29udGV4dDtcbiAgcmVhZG9ubHkgc2Vzc2lvbjogUGxvdE1vZGVTZXNzaW9uO1xuICAvKiogSG9zdCBlbGVtZW50IGhhbmRlZCB0byBhIGBtb3VudGAgcGFuZWwsIG9yIG51bGwgZm9yIGEgY29tcG9uZW50IC8gbm8gcGFuZWwuICovXG4gIHJlYWRvbmx5IHBhbmVsSG9zdDogSFRNTEVsZW1lbnQgfCBudWxsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsb3RNb2RlQ29udHJvbGxlckhvb2tzIHtcbiAgLyoqIEEgc2Vzc2lvbiBpcyBsaXZlIChhbmQgYSBgbW91bnRgIHBhbmVsLCBpZiBhbnksIGhhcyBiZWVuIG1vdW50ZWQpLiAqL1xuICBvbkFjdGl2YXRlZChhY3RpdmU6IEFjdGl2ZVBsb3RNb2RlKTogdm9pZDtcbiAgLyoqIFRoZSBsaXZlIHNlc3Npb24gaXMgYWJvdXQgdG8gZW5kLiBDYWxsZWQgQkVGT1JFIGFueSB0ZWFyZG93biwgc28gYVxuICAgKiAgY29tcG9uZW50IHBhbmVsIGNhbiBiZSBkZXN0cm95ZWQgd2hpbGUgaXRzIHNlc3Npb24gaXMgc3RpbGwgdmFsaWQuICovXG4gIG9uRGVhY3RpdmF0aW5nKGFjdGl2ZTogQWN0aXZlUGxvdE1vZGUpOiB2b2lkO1xuICAvKiogQWN0aXZhdGlvbiBmYWlsZWQgKHRocmV3LCByZWplY3RlZCwgbmV2ZXIgZ290IGEgcmVhZHkgdmlld3BvcnQsIG9yIGl0c1xuICAgKiAgcGFuZWwgZmFpbGVkIHRvIG1vdW50KS4gVGhlIGNvbXBvbmVudCBmYWxscyBiYWNrIHRvIHRoZSBiYXNlIHR5cGUuICovXG4gIG9uRmFpbGVkKGNvbnRyaWJ1dGlvbjogUGxvdFR5cGVDb250cmlidXRpb24sIGVycm9yOiB1bmtub3duKTogdm9pZDtcbn1cblxuLyoqIE1pbmltYWwgbG9nZ2VyLCBpbmplY3RhYmxlIGZvciB0ZXN0cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGxvdE1vZGVMb2dnZXIge1xuICB3YXJuKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQ7XG4gIGVycm9yKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQ7XG59XG5cbi8qKiBCYXNlIHR5cGVzIGEgY29udHJpYnV0ZWQgbW9kZSBjYW4gcmlkZSBvbiBpbiB0aGlzIHZlcnNpb24uICovXG5leHBvcnQgY29uc3QgU1VQUE9SVEVEX0NPTlRSSUJVVElPTl9CQVNFX1RZUEVTOiByZWFkb25seSBQbG90VHlwZVtdID0gW1Bsb3RUeXBlLklNQUdFXTtcblxuLyoqIEhvdyBtYW55IGFuaW1hdGlvbiBmcmFtZXMgdG8gd2FpdCBmb3IgdGhlIHZpZXdwb3J0IGJlZm9yZSBnaXZpbmcgdXAuICovXG5jb25zdCBNQVhfUkVBRFlfRlJBTUVTID0gMTgwO1xuXG5jb25zdCBUQUcgPSAnW3Zpc3VhbGl6ZXJdIHBsb3QtdHlwZSBjb250cmlidXRpb24nO1xuXG4vKipcbiAqIFZhbGlkYXRlIHdoYXQgYXJyaXZlZCBvbiBgUExPVF9UWVBFX0NPTlRSSUJVVElPTlNgLiBBIG1hbGZvcm1lZCBvciBjbGFzaGluZ1xuICogY29udHJpYnV0aW9uIGlzIGRyb3BwZWQgd2l0aCBhIHdhcm5pbmcgcmF0aGVyIHRoYW4gYnJlYWtpbmcgdGhlIHNlbGVjdG9yOlxuICogIC0gYSBuZXN0ZWQgYXJyYXkgKGB1c2VWYWx1ZTogW2EsIGJdLCBtdWx0aTogdHJ1ZWApIGlzIGZsYXR0ZW5lZCBvbmUgbGV2ZWw7XG4gKiAgLSBgdHlwZWAgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcgdGhhdCBpcyBub3QgYSBidWlsdC1pbiBgUGxvdFR5cGVgIHZhbHVlO1xuICogIC0gdGhlIGZpcnN0IGNvbnRyaWJ1dGlvbiB3aXRoIGEgZ2l2ZW4gYHR5cGVgIHdpbnM7XG4gKiAgLSBgYmFzZVR5cGVgIG11c3QgYmUgb25lIG9mIHtAbGluayBTVVBQT1JURURfQ09OVFJJQlVUSU9OX0JBU0VfVFlQRVN9O1xuICogIC0gYGFjdGl2YXRlYCBtdXN0IGJlIGEgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVDb250cmlidXRpb25zKFxuICByYXc6IHJlYWRvbmx5IHVua25vd25bXSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGxvZzogUGxvdE1vZGVMb2dnZXIgPSBjb25zb2xlLFxuKTogUGxvdFR5cGVDb250cmlidXRpb25bXSB7XG4gIGNvbnN0IG91dDogUGxvdFR5cGVDb250cmlidXRpb25bXSA9IFtdO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGZsYXQgPSAocmF3ID8/IFtdKS5mbGF0TWFwKChjKSA9PiAoQXJyYXkuaXNBcnJheShjKSA/IGMgOiBbY10pKTtcbiAgZm9yIChjb25zdCBjIG9mIGZsYXQgYXMgUGxvdFR5cGVDb250cmlidXRpb25bXSkge1xuICAgIGNvbnN0IGQgPSBjPy5kZXNjcmlwdG9yIGFzIENvbnRyaWJ1dGVkUGxvdFR5cGVEZXNjcmlwdG9yIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGlkID0gZD8udHlwZTtcbiAgICBpZiAoIWQgfHwgdHlwZW9mIGlkICE9PSAnc3RyaW5nJyB8fCAhaWQgfHwgdHlwZW9mIGMuYWN0aXZhdGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGxvZy53YXJuKGAke1RBR30gaWdub3JlZDogaXQgbmVlZHMgYSBkZXNjcmlwdG9yIHdpdGggYSBzdHJpbmcgXFxgdHlwZVxcYCBhbmQgYW4gXFxgYWN0aXZhdGVcXGAgZnVuY3Rpb24uYCwgYyk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGlzQnVpbHRpblBsb3RUeXBlKGlkKSkge1xuICAgICAgbG9nLndhcm4oYCR7VEFHfSAnJHtpZH0nIGlnbm9yZWQ6IHRoZSBpZCBjbGFzaGVzIHdpdGggYSBidWlsdC1pbiBwbG90IHR5cGUuYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHNlZW4uaGFzKGlkKSkge1xuICAgICAgbG9nLndhcm4oYCR7VEFHfSAnJHtpZH0nIGlnbm9yZWQ6IGFub3RoZXIgY29udHJpYnV0aW9uIGFscmVhZHkgdXNlcyB0aGF0IGlkLmApO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICghU1VQUE9SVEVEX0NPTlRSSUJVVElPTl9CQVNFX1RZUEVTLmluY2x1ZGVzKGQuYmFzZVR5cGUpKSB7XG4gICAgICBsb2cud2FybihcbiAgICAgICAgYCR7VEFHfSAnJHtpZH0nIGlnbm9yZWQ6IGJhc2VUeXBlICcke1N0cmluZyhkLmJhc2VUeXBlKX0nIGlzIG5vdCBzdXBwb3J0ZWQgYCArXG4gICAgICAgICAgYChzdXBwb3J0ZWQ6ICR7U1VQUE9SVEVEX0NPTlRSSUJVVElPTl9CQVNFX1RZUEVTLmpvaW4oJywgJyl9KS5gLFxuICAgICAgKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBzZWVuLmFkZChpZCk7XG4gICAgb3V0LnB1c2goYyk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuZXhwb3J0IGNsYXNzIFBsb3RNb2RlQ29udHJvbGxlciB7XG4gIHJlYWRvbmx5IGNvbnRyaWJ1dGlvbnM6IHJlYWRvbmx5IFBsb3RUeXBlQ29udHJpYnV0aW9uW107XG4gIHByaXZhdGUgcmVhZG9ubHkgYnlJZDogUmVhZG9ubHlNYXA8c3RyaW5nLCBQbG90VHlwZUNvbnRyaWJ1dGlvbj47XG5cbiAgcHJpdmF0ZSBhY3RpdmU6IEFjdGl2ZVBsb3RNb2RlIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgdGVhcmRvd246ICgoKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuICAvKiogQnVtcGVkIGJ5IGV2ZXJ5IGFjdGl2YXRlL2RlYWN0aXZhdGUsIHNvIGEgcGVuZGluZyBhc3luYyBhY3RpdmF0aW9uIGNhblxuICAgKiAgdGVsbCBpdCBoYXMgYmVlbiBzdXBlcnNlZGVkLiAqL1xuICBwcml2YXRlIGdlbmVyYXRpb24gPSAwO1xuICBwcml2YXRlIHJlYWR5RnJhbWU6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAvKiogQ29udHJpYnV0aW9ucyB3aG9zZSBsYXN0IGNsZWFudXAgKHBhbmVsIHRlYXJkb3duIC8gYGRlYWN0aXZhdGUoKWApIHRocmV3IG9yXG4gICAqICByZWplY3RlZC4gVGhlaXIgbmV4dCBhdXRvbWF0aWMgcmUtYWN0aXZhdGlvbiAoYmFzZSByZS1yZW5kZXIsIGltYWdlIHN3aXRjaClcbiAgICogIGZhbGxzIGJhY2sgdG8gdGhlIGJhc2UgdHlwZSBpbnN0ZWFkOyBhbiBleHBsaWNpdCBzZWxlY3Rpb24gY2xlYXJzIHRoZSBtYXJrLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGZhaWxlZENsZWFudXAgPSBuZXcgTWFwPHN0cmluZywgdW5rbm93bj4oKTtcbiAgcHJpdmF0ZSByZWFkeUNiOiAoKHJlYWR5OiBib29sZWFuKSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJhdzogcmVhZG9ubHkgdW5rbm93bltdIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhvb2tzOiBQbG90TW9kZUNvbnRyb2xsZXJIb29rcyxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGxvZzogUGxvdE1vZGVMb2dnZXIgPSBjb25zb2xlLFxuICApIHtcbiAgICB0aGlzLmNvbnRyaWJ1dGlvbnMgPSBub3JtYWxpemVDb250cmlidXRpb25zKHJhdywgbG9nKTtcbiAgICB0aGlzLmJ5SWQgPSBuZXcgTWFwKHRoaXMuY29udHJpYnV0aW9ucy5tYXAoKGMpID0+IFtjLmRlc2NyaXB0b3IudHlwZSwgY10pKTtcbiAgfVxuXG4gIC8qKiBEZXNjcmlwdG9ycyBvZiB0aGUgdXNhYmxlIGNvbnRyaWJ1dGlvbnMsIGluIHJlZ2lzdHJhdGlvbiBvcmRlci4gKi9cbiAgZGVzY3JpcHRvcnMoKTogQ29udHJpYnV0ZWRQbG90VHlwZURlc2NyaXB0b3JbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29udHJpYnV0aW9ucy5tYXAoKGMpID0+IGMuZGVzY3JpcHRvcik7XG4gIH1cblxuICAvKiogVGhlIGNvbnRyaWJ1dGlvbiBmb3IgYSBzZWxlY3RvciBpZCwgaWYgaXQgaXMgYSBjb250cmlidXRlZCBtb2RlLiAqL1xuICBmaW5kKGlkOiBQbG90VHlwZUlkIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFBsb3RUeXBlQ29udHJpYnV0aW9uIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdHlwZW9mIGlkID09PSAnc3RyaW5nJyA/IHRoaXMuYnlJZC5nZXQoaWQpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBidWlsdC1pbiB0eXBlIHRoYXQgcmVuZGVycyBgaWRgOiBhIGJ1aWx0LWluIHR5cGUgaXMgaXRzZWxmLCBhXG4gICAqIGNvbnRyaWJ1dGVkIGlkIGlzIGl0cyBgYmFzZVR5cGVgLCBhbmQgYW4gaWQgdGhhdCBpcyBuZWl0aGVyIChhIHN0YWxlXG4gICAqIGNvbnRyaWJ1dGVkIGlkIHdob3NlIHByb3ZpZGVyIGlzIGdvbmUpIHJlc29sdmVzIHRvIGBQbG90VHlwZS5JTUFHRWAsIHRoZVxuICAgKiBkZWZhdWx0IHZpZXcuXG4gICAqL1xuICBiYXNlVHlwZU9mKGlkOiBQbG90VHlwZUlkIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFBsb3RUeXBlIHtcbiAgICBpZiAoaXNCdWlsdGluUGxvdFR5cGUoaWQpKSByZXR1cm4gaWQ7XG4gICAgcmV0dXJuIHRoaXMuZmluZChpZCk/LmRlc2NyaXB0b3IuYmFzZVR5cGUgPz8gUGxvdFR5cGUuSU1BR0U7XG4gIH1cblxuICAvKiogVGhlIGxpdmUgc2Vzc2lvbiwgaWYgYW55LiAqL1xuICBnZXQgY3VycmVudCgpOiBBY3RpdmVQbG90TW9kZSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmFjdGl2ZTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIGFuIGFjdGl2YXRpb24gaXMgd2FpdGluZyBvbiB0aGUgY29udHJpYnV0aW9uIG9yIHRoZSB2aWV3cG9ydC4gKi9cbiAgZ2V0IHBlbmRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGVuZGluZ0lkICE9PSBudWxsO1xuICB9XG4gIHByaXZhdGUgcGVuZGluZ0lkOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogU3RhcnQgYSBzZXNzaW9uIGZvciBgY29udHJpYnV0aW9uYC4gRW5kcyBhbnkgbGl2ZSBvbmUgZmlyc3QuIFJlc29sdmVzIHdoZW5cbiAgICogdGhlIGF0dGVtcHQgaGFzIGZpbmlzaGVkIChzdWNjZXNzZnVsbHkgb3Igbm90KTsgaXQgbmV2ZXIgcmVqZWN0cy5cbiAgICovXG4gIGFjdGl2YXRlKGNvbnRyaWJ1dGlvbjogUGxvdFR5cGVDb250cmlidXRpb24sIGN0eDogUGxvdE1vZGVDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5kZWFjdGl2YXRlKCk7XG4gICAgY29uc3QgaWQgPSBjb250cmlidXRpb24uZGVzY3JpcHRvci50eXBlO1xuICAgIGlmICh0aGlzLmZhaWxlZENsZWFudXAuaGFzKGlkKSkge1xuICAgICAgLy8gSXRzIHByZXZpb3VzIHNlc3Npb24gZGlkIG5vdCBlbmQgY2xlYW5seTsgZG8gbm90IHN0YWNrIGEgbmV3IG9uZSBvbiB0b3AuXG4gICAgICBjb25zdCBlcnIgPSB0aGlzLmZhaWxlZENsZWFudXAuZ2V0KGlkKTtcbiAgICAgIHRoaXMuZmFpbGVkQ2xlYW51cC5kZWxldGUoaWQpO1xuICAgICAgdGhpcy5mYWlsKGNvbnRyaWJ1dGlvbiwgZXJyKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG4gICAgY29uc3QgZ2VuID0gKyt0aGlzLmdlbmVyYXRpb247XG4gICAgdGhpcy5wZW5kaW5nSWQgPSBpZDtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMud2hlblJlYWR5KGN0eCwgZ2VuLCAocmVhZHkpID0+IHtcbiAgICAgICAgaWYgKGdlbiAhPT0gdGhpcy5nZW5lcmF0aW9uKSByZXR1cm4gcmVzb2x2ZSgpO1xuICAgICAgICBpZiAoIXJlYWR5KSB7XG4gICAgICAgICAgdGhpcy5mYWlsKGNvbnRyaWJ1dGlvbiwgbmV3IEVycm9yKCd0aGUgdmlld3BvcnQgbmV2ZXIgYmVjYW1lIHJlYWR5JykpO1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJlc3VsdDogUGxvdE1vZGVTZXNzaW9uIHwgUHJvbWlzZTxQbG90TW9kZVNlc3Npb24+O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlc3VsdCA9IGNvbnRyaWJ1dGlvbi5hY3RpdmF0ZShjdHgpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICB0aGlzLmZhaWwoY29udHJpYnV0aW9uLCBlcnIpO1xuICAgICAgICAgIHJldHVybiByZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzVGhlbmFibGUocmVzdWx0KSkge1xuICAgICAgICAgIHJlc3VsdC50aGVuKFxuICAgICAgICAgICAgKHNlc3Npb24pID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5zdGFydChjb250cmlidXRpb24sIGN0eCwgc2Vzc2lvbiwgZ2VuKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChlcnIpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGdlbiA9PT0gdGhpcy5nZW5lcmF0aW9uKSB0aGlzLmZhaWwoY29udHJpYnV0aW9uLCBlcnIpO1xuICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zdGFydChjb250cmlidXRpb24sIGN0eCwgcmVzdWx0LCBnZW4pO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW5kIHRoZSBsaXZlIHNlc3Npb24sIGlmIGFueTogdGhlIGNvbXBvbmVudCBwYW5lbCBpcyBkcm9wcGVkICh2aWFcbiAgICogYG9uRGVhY3RpdmF0aW5nYCksIGEgYG1vdW50YCBwYW5lbCdzIHRlYXJkb3duIHJ1bnMsIHRoZW5cbiAgICogYHNlc3Npb24uZGVhY3RpdmF0ZSgpYCwgdGhlbiB0aGUgbW91bnQgaG9zdCBpcyByZW1vdmVkLiBFYWNoIHN0ZXAgaXNcbiAgICogaXNvbGF0ZWQuIEEgcGVuZGluZyBhY3RpdmF0aW9uIGlzIGNhbmNlbGxlZDsgaWYgaXQgcmVzb2x2ZXMgbGF0ZXIgaXRzXG4gICAqIHNlc3Npb24gaXMgZGVhY3RpdmF0ZWQgb24gYXJyaXZhbC4gSWRlbXBvdGVudC5cbiAgICovXG4gIGRlYWN0aXZhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5nZW5lcmF0aW9uKys7XG4gICAgdGhpcy5wZW5kaW5nSWQgPSBudWxsO1xuICAgIHRoaXMuY2FuY2VsUmVhZHlXYWl0KCk7XG4gICAgY29uc3QgYSA9IHRoaXMuYWN0aXZlO1xuICAgIGlmICghYSkgcmV0dXJuO1xuICAgIHRoaXMuYWN0aXZlID0gbnVsbDtcbiAgICBjb25zdCB0ZWFyZG93biA9IHRoaXMudGVhcmRvd247XG4gICAgdGhpcy50ZWFyZG93biA9IG51bGw7XG4gICAgY29uc3QgaWQgPSBhLmNvbnRyaWJ1dGlvbi5kZXNjcmlwdG9yLnR5cGU7XG4gICAgdGhpcy5ndWFyZChgJyR7aWR9JyBwYW5lbCByZW1vdmFsYCwgKCkgPT4gdGhpcy5ob29rcy5vbkRlYWN0aXZhdGluZyhhKSk7XG4gICAgaWYgKHRlYXJkb3duKSB0aGlzLmNsZWFudXAoYS5jb250cmlidXRpb24sICdwYW5lbCB0ZWFyZG93bicsIHRlYXJkb3duKTtcbiAgICB0aGlzLmNsZWFudXAoYS5jb250cmlidXRpb24sICdkZWFjdGl2YXRlKCknLCAoKSA9PiBhLnNlc3Npb24uZGVhY3RpdmF0ZSgpKTtcbiAgICBhLnBhbmVsSG9zdD8ucmVtb3ZlKCk7XG4gIH1cblxuICAvKipcbiAgICogRm9yZ2V0IHJlY29yZGVkIGNsZWFudXAgZmFpbHVyZXMuIFRoZSBob3N0IGNhbGxzIHRoaXMgd2hlbiB0aGUgVVNFUiBwaWNrcyBhXG4gICAqIHBsb3QgdHlwZTogYW4gZXhwbGljaXQgY2hvaWNlIGdldHMgYSBmcmVzaCBhdHRlbXB0LCBvbmx5IGF1dG9tYXRpY1xuICAgKiByZS1hY3RpdmF0aW9ucyBmYWxsIGJhY2suXG4gICAqL1xuICBjbGVhckNsZWFudXBGYWlsdXJlcygpOiB2b2lkIHtcbiAgICB0aGlzLmZhaWxlZENsZWFudXAuY2xlYXIoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBpbnRlcm5hbHMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSBzdGFydChcbiAgICBjb250cmlidXRpb246IFBsb3RUeXBlQ29udHJpYnV0aW9uLFxuICAgIGN0eDogUGxvdE1vZGVDb250ZXh0LFxuICAgIHNlc3Npb246IFBsb3RNb2RlU2Vzc2lvbixcbiAgICBnZW46IG51bWJlcixcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgaWQgPSBjb250cmlidXRpb24uZGVzY3JpcHRvci50eXBlO1xuICAgIGlmICghc2Vzc2lvbiB8fCB0eXBlb2Ygc2Vzc2lvbi5kZWFjdGl2YXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoZ2VuID09PSB0aGlzLmdlbmVyYXRpb24pIHtcbiAgICAgICAgdGhpcy5mYWlsKGNvbnRyaWJ1dGlvbiwgbmV3IEVycm9yKCdhY3RpdmF0ZSgpIGRpZCBub3QgcmV0dXJuIGEgUGxvdE1vZGVTZXNzaW9uJykpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoZ2VuICE9PSB0aGlzLmdlbmVyYXRpb24pIHtcbiAgICAgIC8vIFN1cGVyc2VkZWQgd2hpbGUgYWN0aXZhdGUoKSB3YXMgaW4gZmxpZ2h0IOKAlCB0aGUgdXNlciBhbHJlYWR5IGxlZnQuIFRoZVxuICAgICAgLy8gc2Vzc2lvbiBzdGlsbCBnZXRzIGl0cyBzaW5nbGUgZGVhY3RpdmF0ZSgpLCBqdXN0IGxhdGUuXG4gICAgICB0aGlzLmd1YXJkTG9nZ2VkKGAnJHtpZH0nIGRlYWN0aXZhdGUoKSBvZiBhIHN1cGVyc2VkZWQgc2Vzc2lvbmAsICgpID0+IHNlc3Npb24uZGVhY3RpdmF0ZSgpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wZW5kaW5nSWQgPSBudWxsO1xuICAgIGNvbnN0IHBhbmVsID0gY29udHJpYnV0aW9uLnBhbmVsO1xuICAgIGxldCBwYW5lbEhvc3Q6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHRlYXJkb3duOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcbiAgICBpZiAocGFuZWwgJiYgJ21vdW50JyBpbiBwYW5lbCAmJiB0eXBlb2YgcGFuZWwubW91bnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHBhbmVsSG9zdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgcGFuZWxIb3N0LmNsYXNzTmFtZSA9ICdwbG90LW1vZGUtcGFuZWwtaG9zdCc7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0ID0gcGFuZWwubW91bnQocGFuZWxIb3N0LCBjdHgsIHNlc3Npb24pO1xuICAgICAgICB0ZWFyZG93biA9IHR5cGVvZiB0ID09PSAnZnVuY3Rpb24nID8gdCA6IG51bGw7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcGFuZWxIb3N0LnJlbW92ZSgpO1xuICAgICAgICB0aGlzLmd1YXJkTG9nZ2VkKGAnJHtpZH0nIGRlYWN0aXZhdGUoKWAsICgpID0+IHNlc3Npb24uZGVhY3RpdmF0ZSgpKTtcbiAgICAgICAgdGhpcy5mYWlsKGNvbnRyaWJ1dGlvbiwgZXJyKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmFjdGl2ZSA9IHsgY29udHJpYnV0aW9uLCBjdHgsIHNlc3Npb24sIHBhbmVsSG9zdCB9O1xuICAgIHRoaXMudGVhcmRvd24gPSB0ZWFyZG93bjtcbiAgICB0cnkge1xuICAgICAgdGhpcy5ob29rcy5vbkFjdGl2YXRlZCh0aGlzLmFjdGl2ZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBUaGUgaG9zdCBjb3VsZCBub3Qgc2hvdyBpdCAoZS5nLiBpdHMgcGFuZWwgZmFpbGVkIHRvIHJlbmRlcik6IG5vdCBhIHVzYWJsZSBtb2RlLlxuICAgICAgdGhpcy5mYWlsQWN0aXZlKGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBob3N0IGNvdWxkIG5vdCBtYWtlIHRoZSBsaXZlIG1vZGUgdXNhYmxlIChpdHMgcGFuZWwgdGhyZXcgd2hpbGUgYmVpbmdcbiAgICogY3JlYXRlZCBvciBmaXJzdCByZW5kZXJlZCk6IGVuZCB0aGUgc2Vzc2lvbiBvbmNlLCB0aGVuIGZhbGwgYmFjayB0byBpdHMgYmFzZS5cbiAgICogTm8tb3Agd2hlbiBub3RoaW5nIGlzIGxpdmUuXG4gICAqL1xuICBmYWlsQWN0aXZlKGVycjogdW5rbm93bik6IHZvaWQge1xuICAgIGNvbnN0IGEgPSB0aGlzLmFjdGl2ZTtcbiAgICBpZiAoIWEpIHJldHVybjtcbiAgICB0aGlzLmRlYWN0aXZhdGUoKTtcbiAgICB0aGlzLmZhaWwoYS5jb250cmlidXRpb24sIGVycik7XG4gIH1cblxuICBwcml2YXRlIGZhaWwoY29udHJpYnV0aW9uOiBQbG90VHlwZUNvbnRyaWJ1dGlvbiwgZXJyOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5wZW5kaW5nSWQgPSBudWxsO1xuICAgIHRoaXMubG9nLmVycm9yKFxuICAgICAgYCR7VEFHfSAnJHtjb250cmlidXRpb24uZGVzY3JpcHRvci50eXBlfScgZmFpbGVkIHRvIGFjdGl2YXRlIOKAlCBgICtcbiAgICAgICAgYGZhbGxpbmcgYmFjayB0byAnJHtjb250cmlidXRpb24uZGVzY3JpcHRvci5iYXNlVHlwZX0nLmAsXG4gICAgICBlcnIsXG4gICAgKTtcbiAgICB0cnkge1xuICAgICAgdGhpcy5ob29rcy5vbkZhaWxlZChjb250cmlidXRpb24sIGVycik7XG4gICAgfSBjYXRjaCAoaG9va0Vycikge1xuICAgICAgdGhpcy5sb2cuZXJyb3IoYCR7VEFHfSBmYWxsYmFjayBmYWlsZWQuYCwgaG9va0Vycik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBndWFyZCh3aGF0OiBzdHJpbmcsIGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGZuKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvcihgJHtUQUd9ICR7d2hhdH0gdGhyZXcuYCwgZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKiogTGlrZSBgZ3VhcmRgLCBmb3IgYSBjb250cmlidXRpb24gY2FsbGJhY2sgdHlwZWQgYHZvaWRgIHRoYXQgbWF5IHN0aWxsIHJldHVybiBhXG4gICAqICBwcm9taXNlOiBhIHJlamVjdGlvbiBpcyBsb2dnZWQgaW5zdGVhZCBvZiBlc2NhcGluZyBhcyBhbiB1bmhhbmRsZWQgcmVqZWN0aW9uLiAqL1xuICBwcml2YXRlIGd1YXJkTG9nZ2VkKHdoYXQ6IHN0cmluZywgZm46ICgpID0+IHVua25vd24pOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgciA9IGZuKCk7XG4gICAgICBpZiAoaXNUaGVuYWJsZShyKSkgci50aGVuKHVuZGVmaW5lZCwgKGVycikgPT4gdGhpcy5sb2cuZXJyb3IoYCR7VEFHfSAke3doYXR9IHJlamVjdGVkLmAsIGVycikpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2cuZXJyb3IoYCR7VEFHfSAke3doYXR9IHRocmV3LmAsIGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJ1biBhIGxpdmUgc2Vzc2lvbidzIGNsZWFudXA7IGEgdGhyb3cgT1IgYSByZWplY3Rpb24gZ29lcyB0byBgY2xlYW51cEZhaWxlZGAuICovXG4gIHByaXZhdGUgY2xlYW51cChjb250cmlidXRpb246IFBsb3RUeXBlQ29udHJpYnV0aW9uLCB3aGF0OiBzdHJpbmcsIGZuOiAoKSA9PiB1bmtub3duKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHIgPSBmbigpO1xuICAgICAgaWYgKGlzVGhlbmFibGUocikpIHIudGhlbih1bmRlZmluZWQsIChlcnIpID0+IHRoaXMuY2xlYW51cEZhaWxlZChjb250cmlidXRpb24sIHdoYXQsIGVycikpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5jbGVhbnVwRmFpbGVkKGNvbnRyaWJ1dGlvbiwgd2hhdCwgZXJyKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQSBjb250cmlidXRpb24ncyBjbGVhbnVwIGZhaWxlZC4gSWYgdGhhdCBzYW1lIGNvbnRyaWJ1dGlvbiBpcyBsaXZlIG9yIHN0YXJ0aW5nXG4gICAqIGFnYWluIChhIGJhc2UgcmUtcmVuZGVyIC8gaW1hZ2Ugc3dpdGNoIHJlLWFjdGl2YXRlZCBpdCDigJQgb3IsIGZvciBhbiBhc3luY1xuICAgKiByZWplY3Rpb24sIGFscmVhZHkgaGFzKSwgZW5kIGl0IGFuZCBmYWxsIGJhY2sgdG8gaXRzIGJhc2UgdHlwZS4gT3RoZXJ3aXNlIHRoZVxuICAgKiB1c2VyIGhhcyBtb3ZlZCBvbjogcmVtZW1iZXIgaXQsIHNvIHRoZSBuZXh0IGF1dG9tYXRpYyByZS1hY3RpdmF0aW9uIGZhbGxzIGJhY2suXG4gICAqL1xuICBwcml2YXRlIGNsZWFudXBGYWlsZWQoY29udHJpYnV0aW9uOiBQbG90VHlwZUNvbnRyaWJ1dGlvbiwgd2hhdDogc3RyaW5nLCBlcnI6IHVua25vd24pOiB2b2lkIHtcbiAgICBjb25zdCBpZCA9IGNvbnRyaWJ1dGlvbi5kZXNjcmlwdG9yLnR5cGU7XG4gICAgdGhpcy5sb2cuZXJyb3IoYCR7VEFHfSAnJHtpZH0nICR7d2hhdH0gZmFpbGVkLmAsIGVycik7XG4gICAgY29uc3QgYWdhaW4gPSB0aGlzLmFjdGl2ZT8uY29udHJpYnV0aW9uID09PSBjb250cmlidXRpb24gfHwgdGhpcy5wZW5kaW5nSWQgPT09IGlkO1xuICAgIGlmIChhZ2Fpbikge1xuICAgICAgdGhpcy5kZWFjdGl2YXRlKCk7XG4gICAgICB0aGlzLmZhaWwoY29udHJpYnV0aW9uLCBlcnIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZhaWxlZENsZWFudXAuc2V0KGlkLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDYWxsIGBjYih0cnVlKWAgb25jZSB0aGUgdmlld3BvcnQgcmVwb3J0cyByZWFkeSAobm93LCBvciBvbiBhIGxhdGVyXG4gICAqICBhbmltYXRpb24gZnJhbWUpLCBvciBgY2IoZmFsc2UpYCBhZnRlciB7QGxpbmsgTUFYX1JFQURZX0ZSQU1FU30uICovXG4gIHByaXZhdGUgd2hlblJlYWR5KGN0eDogUGxvdE1vZGVDb250ZXh0LCBnZW46IG51bWJlciwgY2I6IChyZWFkeTogYm9vbGVhbikgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNvbnN0IGlzUmVhZHkgPSAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gY3R4LnZpZXdwb3J0LmlzUmVhZHkoKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfTtcbiAgICBpZiAoaXNSZWFkeSgpKSByZXR1cm4gY2IodHJ1ZSk7XG4gICAgbGV0IGZyYW1lcyA9IDA7XG4gICAgY29uc3Qgc2V0dGxlID0gKHJlYWR5OiBib29sZWFuKSA9PiB7XG4gICAgICB0aGlzLnJlYWR5RnJhbWUgPSBudWxsO1xuICAgICAgdGhpcy5yZWFkeUNiID0gbnVsbDtcbiAgICAgIGNiKHJlYWR5KTtcbiAgICB9O1xuICAgIGNvbnN0IHRpY2sgPSAoKSA9PiB7XG4gICAgICB0aGlzLnJlYWR5RnJhbWUgPSBudWxsO1xuICAgICAgaWYgKGdlbiAhPT0gdGhpcy5nZW5lcmF0aW9uKSByZXR1cm4gc2V0dGxlKGZhbHNlKTtcbiAgICAgIGlmIChpc1JlYWR5KCkpIHJldHVybiBzZXR0bGUodHJ1ZSk7XG4gICAgICBpZiAoKytmcmFtZXMgPj0gTUFYX1JFQURZX0ZSQU1FUykgcmV0dXJuIHNldHRsZShmYWxzZSk7XG4gICAgICB0aGlzLnJlYWR5RnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGljayk7XG4gICAgfTtcbiAgICB0aGlzLnJlYWR5Q2IgPSBzZXR0bGU7XG4gICAgdGhpcy5yZWFkeUZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRpY2spO1xuICB9XG5cbiAgLyoqIFN0b3Agd2FpdGluZyBmb3IgdGhlIHZpZXdwb3J0OyB0aGUgd2FpdGluZyBhY3RpdmF0aW9uIHJlc29sdmVzIGFzIHN1cGVyc2VkZWQuICovXG4gIHByaXZhdGUgY2FuY2VsUmVhZHlXYWl0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlYWR5RnJhbWUgIT09IG51bGwpIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMucmVhZHlGcmFtZSk7XG4gICAgdGhpcy5yZWFkeUZyYW1lID0gbnVsbDtcbiAgICBjb25zdCBjYiA9IHRoaXMucmVhZHlDYjtcbiAgICB0aGlzLnJlYWR5Q2IgPSBudWxsO1xuICAgIGNiPy4oZmFsc2UpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzVGhlbmFibGU8VD4odjogVCB8IFByb21pc2U8VD4gfCB1bmtub3duKTogdiBpcyBQcm9taXNlPFQ+IHtcbiAgcmV0dXJuICEhdiAmJiB0eXBlb2YgKHYgYXMgUHJvbWlzZTxUPikudGhlbiA9PT0gJ2Z1bmN0aW9uJztcbn1cbiJdfQ==
|