@jax-data-science/sci-image-visualizer 0.9.0 → 0.11.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/esm2022/index.mjs +10 -1
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/ports/region-io.port.mjs +1 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
- package/esm2022/lib/contracts/section-view.contract.mjs +2 -0
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/contracts/viz-config.mjs +1 -1
- package/esm2022/lib/geometry/loft.mjs +128 -0
- package/esm2022/lib/geometry/polylabel.mjs +156 -0
- package/esm2022/lib/geometry/reconstruct.mjs +315 -0
- package/esm2022/lib/geometry/reslice-image.mjs +57 -0
- package/esm2022/lib/geometry/section.mjs +215 -0
- package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +11 -7
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +20 -3
- package/esm2022/lib/implementations/napari-js/napari-region-mesh-pointer.mjs +100 -0
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +28 -5
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +9 -2
- package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +5 -2
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +81 -1
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +129 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +115 -4
- package/esm2022/lib/implementations/napari-js/napari-volume-slice-planes.mjs +103 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +15 -3
- package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +18 -2
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +9 -1
- package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +18 -7
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +38 -8
- package/esm2022/lib/implementations/osd/osd-tile-loading.mjs +71 -0
- package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +1 -1
- package/esm2022/lib/implementations/osd/slice-cache.mjs +35 -6
- package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +1 -1
- package/esm2022/lib/models/class-preset.mjs +1 -1
- package/esm2022/lib/models/polygon-factory.mjs +17 -1
- package/esm2022/lib/models/region-geojson.mjs +44 -6
- package/esm2022/lib/models/region.mjs +1 -1
- 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 +77 -13
- package/esm2022/lib/region-editor/region-editor.component.mjs +670 -42
- package/esm2022/lib/region-editor/region-metrics.mjs +20 -2
- package/esm2022/lib/region-editor/region-persistence.service.mjs +44 -10
- package/esm2022/lib/region-editor/region-table/region-table.component.mjs +24 -8
- package/esm2022/lib/region-import/label-classes.mjs +149 -0
- package/esm2022/lib/region-import/label-volume.mjs +194 -0
- package/esm2022/lib/region-import/region-import.mjs +71 -0
- package/esm2022/lib/region-overlay/region-geometry.mjs +3 -3
- 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-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/routing-visualizer.service.mjs +510 -22
- package/esm2022/lib/section-pane/section-pane.component.mjs +299 -0
- package/esm2022/lib/store/class-color.util.mjs +10 -5
- package/esm2022/lib/store/class-signatures.mjs +63 -0
- package/esm2022/lib/store/region-scope-cache.mjs +5 -1
- package/esm2022/lib/store/region-source-scope.mjs +186 -0
- package/esm2022/lib/store/region-store.service.mjs +774 -12
- package/esm2022/lib/store/visualizer-store.service.mjs +33 -6
- package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +8 -2
- package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +55 -15
- package/esm2022/lib/toolbar/toolbar.component.mjs +19 -5
- package/esm2022/lib/visualizer/region-load.mjs +67 -4
- package/esm2022/lib/visualizer/volume-sections.mjs +175 -0
- package/esm2022/lib/visualizer.component.mjs +155 -7
- package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BELcx0jv.mjs} +9851 -2904
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BELcx0jv.mjs.map +1 -0
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-DEDSm_NL.mjs} +4 -4
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-DEDSm_NL.mjs.map} +1 -1
- 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.mjs +3 -3
- package/fesm2022/region-source.worker.js +1067 -0
- package/index.d.ts +12 -0
- package/lib/contracts/image.contract.d.ts +4 -0
- package/lib/contracts/ports/region-io.port.d.ts +24 -0
- package/lib/contracts/region-editor-api.contract.d.ts +102 -0
- package/lib/contracts/region-store.contract.d.ts +22 -0
- package/lib/contracts/section-view.contract.d.ts +44 -0
- package/lib/contracts/visualizer.contract.d.ts +10 -0
- package/lib/contracts/viz-config.d.ts +8 -0
- package/lib/geometry/loft.d.ts +22 -0
- package/lib/geometry/polylabel.d.ts +23 -0
- package/lib/geometry/reconstruct.d.ts +54 -0
- package/lib/geometry/reslice-image.d.ts +33 -0
- package/lib/geometry/section.d.ts +52 -0
- package/lib/implementations/napari-js/napari-loading-badge.d.ts +4 -2
- package/lib/implementations/napari-js/napari-loading-state.d.ts +8 -1
- package/lib/implementations/napari-js/napari-region-mesh-pointer.d.ts +32 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +6 -1
- package/lib/implementations/napari-js/napari-scene.d.ts +33 -0
- package/lib/implementations/napari-js/napari-spatial-hover.d.ts +3 -1
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +48 -0
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +66 -0
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +45 -1
- package/lib/implementations/napari-js/napari-volume-slice-planes.d.ts +43 -0
- package/lib/implementations/osd/openseadragon-viewer-options.d.ts +2 -0
- package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +2 -0
- package/lib/implementations/osd/osd-region-overlay-draw.d.ts +4 -3
- package/lib/implementations/osd/osd-region-overlay.d.ts +10 -3
- package/lib/implementations/osd/osd-tile-loading.d.ts +43 -0
- package/lib/implementations/osd/osd-viewer-like.d.ts +14 -0
- package/lib/implementations/osd/slice-cache.d.ts +13 -3
- package/lib/implementations/tile-server/tile-protocol.d.ts +3 -0
- package/lib/models/class-preset.d.ts +7 -0
- package/lib/models/polygon-factory.d.ts +5 -0
- package/lib/models/region-geojson.d.ts +40 -0
- package/lib/models/region.d.ts +19 -0
- 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 +36 -6
- package/lib/region-editor/region-editor.component.d.ts +159 -17
- package/lib/region-editor/region-metrics.d.ts +8 -0
- package/lib/region-editor/region-persistence.service.d.ts +17 -5
- package/lib/region-editor/region-table/region-table.component.d.ts +10 -4
- package/lib/region-import/label-classes.d.ts +39 -0
- package/lib/region-import/label-volume.d.ts +31 -0
- package/lib/region-import/region-import.d.ts +46 -0
- package/lib/region-overlay/region-geometry.d.ts +4 -3
- package/lib/region-overlay/region-source-layer.d.ts +96 -0
- package/lib/region-overlay/region-style.d.ts +52 -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/routing-visualizer.service.d.ts +168 -1
- package/lib/section-pane/section-pane.component.d.ts +47 -0
- package/lib/store/class-color.util.d.ts +6 -3
- package/lib/store/class-signatures.d.ts +11 -0
- package/lib/store/region-scope-cache.d.ts +2 -0
- package/lib/store/region-source-scope.d.ts +74 -0
- package/lib/store/region-store.service.d.ts +216 -2
- package/lib/store/visualizer-store.service.d.ts +10 -0
- package/lib/toolbar/region-tools/region-tools.component.d.ts +3 -1
- package/lib/toolbar/stack-controls/stack-controls.component.d.ts +20 -9
- package/lib/toolbar/toolbar.component.d.ts +9 -2
- package/lib/visualizer/region-load.d.ts +23 -4
- package/lib/visualizer/volume-sections.d.ts +64 -0
- package/lib/visualizer.component.d.ts +40 -0
- package/package.json +2 -2
- package/src/lib/assets/slice.svg +23 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +0 -1
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Input, NgZone, Output, ViewChild, } from '@angular/core';
|
|
2
|
+
import { CommonModule } from '@angular/common';
|
|
3
|
+
import { SLICE_PLANE_COLORS } from '../implementations/napari-js/napari-volume-slice-planes';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/common";
|
|
6
|
+
/** A press that moves farther than this (px) pans; a shorter one is a click. */
|
|
7
|
+
const CLICK_SLOP_PX = 4;
|
|
8
|
+
/** How much a wheel notch zooms. */
|
|
9
|
+
const WHEEL_ZOOM = 1.0015;
|
|
10
|
+
/** The section's share of the pane when fitted. */
|
|
11
|
+
const FIT_MARGIN = 0.94;
|
|
12
|
+
/** The regions' fill opacity, as the 2D view's default. */
|
|
13
|
+
const FILL_ALPHA = 0.25;
|
|
14
|
+
export class SectionPaneComponent {
|
|
15
|
+
constructor(zone) {
|
|
16
|
+
this.zone = zone;
|
|
17
|
+
this.view = null;
|
|
18
|
+
/** A point clicked, in section coordinates (u across, v down). */
|
|
19
|
+
this.pick = new EventEmitter();
|
|
20
|
+
this.zoom = 1;
|
|
21
|
+
this.pan = { x: 0, y: 0 };
|
|
22
|
+
this.press = null;
|
|
23
|
+
this.image = null;
|
|
24
|
+
this.frame = null;
|
|
25
|
+
}
|
|
26
|
+
get axisColor() {
|
|
27
|
+
return SLICE_PLANE_COLORS[this.axis];
|
|
28
|
+
}
|
|
29
|
+
get label() {
|
|
30
|
+
const at = this.view ? ` · ${Math.round(this.view.at)} px` : '';
|
|
31
|
+
return `${this.axis.toUpperCase()}${at}`;
|
|
32
|
+
}
|
|
33
|
+
ngAfterViewInit() {
|
|
34
|
+
if (typeof ResizeObserver !== 'undefined') {
|
|
35
|
+
this.zone.runOutsideAngular(() => {
|
|
36
|
+
this.resize?.disconnect();
|
|
37
|
+
this.resize = new ResizeObserver(() => this.draw());
|
|
38
|
+
this.resize.observe(this.canvasRef.nativeElement);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
this.draw();
|
|
42
|
+
}
|
|
43
|
+
ngOnChanges() {
|
|
44
|
+
this.draw();
|
|
45
|
+
}
|
|
46
|
+
ngOnDestroy() {
|
|
47
|
+
this.resize?.disconnect();
|
|
48
|
+
if (this.frame !== null)
|
|
49
|
+
cancelAnimationFrame(this.frame);
|
|
50
|
+
}
|
|
51
|
+
/** Back to the whole section, centred. */
|
|
52
|
+
fit() {
|
|
53
|
+
this.zoom = 1;
|
|
54
|
+
this.pan = { x: 0, y: 0 };
|
|
55
|
+
this.draw();
|
|
56
|
+
}
|
|
57
|
+
onWheel(e) {
|
|
58
|
+
if (!this.view)
|
|
59
|
+
return;
|
|
60
|
+
e.preventDefault();
|
|
61
|
+
const [cx, cy] = this.local(e);
|
|
62
|
+
const factor = Math.pow(WHEEL_ZOOM, -e.deltaY);
|
|
63
|
+
const next = Math.min(50, Math.max(0.2, this.zoom * factor));
|
|
64
|
+
const k = next / this.zoom;
|
|
65
|
+
// Keep the point under the pointer still.
|
|
66
|
+
const { width, height } = this.canvasRef.nativeElement.getBoundingClientRect();
|
|
67
|
+
this.pan.x = (cx - width / 2) * (1 - k) + this.pan.x * k;
|
|
68
|
+
this.pan.y = (cy - height / 2) * (1 - k) + this.pan.y * k;
|
|
69
|
+
this.zoom = next;
|
|
70
|
+
this.draw();
|
|
71
|
+
}
|
|
72
|
+
onDown(e) {
|
|
73
|
+
if (e.button !== 0)
|
|
74
|
+
return;
|
|
75
|
+
this.press = {
|
|
76
|
+
x: e.clientX,
|
|
77
|
+
y: e.clientY,
|
|
78
|
+
panX: this.pan.x,
|
|
79
|
+
panY: this.pan.y,
|
|
80
|
+
moved: false,
|
|
81
|
+
pointer: e.pointerId,
|
|
82
|
+
};
|
|
83
|
+
this.canvasRef.nativeElement.setPointerCapture?.(e.pointerId);
|
|
84
|
+
}
|
|
85
|
+
onMove(e) {
|
|
86
|
+
const p = this.press;
|
|
87
|
+
if (!p || e.pointerId !== p.pointer)
|
|
88
|
+
return;
|
|
89
|
+
const dx = e.clientX - p.x;
|
|
90
|
+
const dy = e.clientY - p.y;
|
|
91
|
+
if (!p.moved && Math.hypot(dx, dy) <= CLICK_SLOP_PX)
|
|
92
|
+
return;
|
|
93
|
+
p.moved = true;
|
|
94
|
+
this.pan = { x: p.panX + dx, y: p.panY + dy };
|
|
95
|
+
this.draw();
|
|
96
|
+
}
|
|
97
|
+
onUp(e) {
|
|
98
|
+
const p = this.press;
|
|
99
|
+
if (!p || e.pointerId !== p.pointer)
|
|
100
|
+
return;
|
|
101
|
+
this.press = null;
|
|
102
|
+
const canvas = this.canvasRef.nativeElement;
|
|
103
|
+
if (canvas.hasPointerCapture?.(e.pointerId))
|
|
104
|
+
canvas.releasePointerCapture?.(e.pointerId);
|
|
105
|
+
if (p.moved || !this.view)
|
|
106
|
+
return;
|
|
107
|
+
const at = this.toSection(...this.local(e));
|
|
108
|
+
if (!at)
|
|
109
|
+
return;
|
|
110
|
+
const [U, V] = this.view.size;
|
|
111
|
+
if (at.u < 0 || at.v < 0 || at.u > U || at.v > V)
|
|
112
|
+
return;
|
|
113
|
+
this.pick.emit(at);
|
|
114
|
+
}
|
|
115
|
+
local(e) {
|
|
116
|
+
const r = this.canvasRef.nativeElement.getBoundingClientRect();
|
|
117
|
+
return [e.clientX - r.left, e.clientY - r.top];
|
|
118
|
+
}
|
|
119
|
+
/** Section units → CSS px in the pane: scale per unit across and down, and the origin. */
|
|
120
|
+
transform(width, height) {
|
|
121
|
+
const view = this.view;
|
|
122
|
+
if (!view || width <= 0 || height <= 0)
|
|
123
|
+
return null;
|
|
124
|
+
const [U, V] = view.size;
|
|
125
|
+
const worldW = U * view.scale[0];
|
|
126
|
+
const worldH = V * view.scale[1];
|
|
127
|
+
if (!(worldW > 0 && worldH > 0))
|
|
128
|
+
return null;
|
|
129
|
+
const k = Math.min(width / worldW, height / worldH) * FIT_MARGIN * this.zoom;
|
|
130
|
+
const sx = view.scale[0] * k;
|
|
131
|
+
const sy = view.scale[1] * k;
|
|
132
|
+
return { sx, sy, ox: width / 2 + this.pan.x - (U / 2) * sx, oy: height / 2 + this.pan.y - (V / 2) * sy };
|
|
133
|
+
}
|
|
134
|
+
toSection(x, y) {
|
|
135
|
+
const { width, height } = this.canvasRef.nativeElement.getBoundingClientRect();
|
|
136
|
+
const t = this.transform(width, height);
|
|
137
|
+
return t ? { u: (x - t.ox) / t.sx, v: (y - t.oy) / t.sy } : null;
|
|
138
|
+
}
|
|
139
|
+
/** Redraw on the next frame (outside Angular: a canvas paint needs no change detection). */
|
|
140
|
+
draw() {
|
|
141
|
+
if (this.frame !== null || typeof requestAnimationFrame === 'undefined')
|
|
142
|
+
return;
|
|
143
|
+
this.zone.runOutsideAngular(() => {
|
|
144
|
+
this.frame = requestAnimationFrame(() => {
|
|
145
|
+
this.frame = null;
|
|
146
|
+
this.paint();
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
paint() {
|
|
151
|
+
const canvas = this.canvasRef.nativeElement;
|
|
152
|
+
const { width, height } = canvas.getBoundingClientRect();
|
|
153
|
+
const dpr = window.devicePixelRatio || 1;
|
|
154
|
+
canvas.width = Math.max(1, Math.round(width * dpr));
|
|
155
|
+
canvas.height = Math.max(1, Math.round(height * dpr));
|
|
156
|
+
const ctx = canvas.getContext('2d');
|
|
157
|
+
if (!ctx)
|
|
158
|
+
return;
|
|
159
|
+
ctx.setTransform(dpr, 0, 0, dpr, 0, 0);
|
|
160
|
+
ctx.clearRect(0, 0, width, height);
|
|
161
|
+
const view = this.view;
|
|
162
|
+
const t = this.transform(width, height);
|
|
163
|
+
if (!view || !t)
|
|
164
|
+
return;
|
|
165
|
+
const [U, V] = view.size;
|
|
166
|
+
ctx.imageSmoothingEnabled = true;
|
|
167
|
+
ctx.drawImage(this.imageCanvas(view.image), t.ox, t.oy, U * t.sx, V * t.sy);
|
|
168
|
+
const px = (u, v) => [t.ox + u * t.sx, t.oy + v * t.sy];
|
|
169
|
+
this.paintRegions(ctx, view, px);
|
|
170
|
+
this.paintCrosshair(ctx, view, t, px);
|
|
171
|
+
}
|
|
172
|
+
/** Each class's cut: its outlines filled and stroked, its lines drawn (a dot for one point). */
|
|
173
|
+
paintRegions(ctx, view, px) {
|
|
174
|
+
for (const r of view.regions) {
|
|
175
|
+
if (r.rings.length) {
|
|
176
|
+
ctx.beginPath();
|
|
177
|
+
for (const ring of r.rings) {
|
|
178
|
+
for (let i = 0; i + 1 < ring.length; i += 2) {
|
|
179
|
+
const [x, y] = px(ring[i], ring[i + 1]);
|
|
180
|
+
if (i === 0)
|
|
181
|
+
ctx.moveTo(x, y);
|
|
182
|
+
else
|
|
183
|
+
ctx.lineTo(x, y);
|
|
184
|
+
}
|
|
185
|
+
ctx.closePath();
|
|
186
|
+
}
|
|
187
|
+
ctx.globalAlpha = FILL_ALPHA;
|
|
188
|
+
ctx.fillStyle = r.color;
|
|
189
|
+
ctx.fill('evenodd');
|
|
190
|
+
ctx.globalAlpha = 1;
|
|
191
|
+
ctx.strokeStyle = r.color;
|
|
192
|
+
ctx.lineWidth = 1.25;
|
|
193
|
+
ctx.stroke();
|
|
194
|
+
}
|
|
195
|
+
ctx.strokeStyle = r.color;
|
|
196
|
+
ctx.fillStyle = r.color;
|
|
197
|
+
ctx.lineWidth = 2;
|
|
198
|
+
for (const line of r.lines) {
|
|
199
|
+
if (line.length === 2) {
|
|
200
|
+
const [x, y] = px(line[0], line[1]);
|
|
201
|
+
ctx.beginPath();
|
|
202
|
+
ctx.arc(x, y, 2.5, 0, Math.PI * 2);
|
|
203
|
+
ctx.fill();
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
ctx.beginPath();
|
|
207
|
+
for (let i = 0; i + 1 < line.length; i += 2) {
|
|
208
|
+
const [x, y] = px(line[i], line[i + 1]);
|
|
209
|
+
if (i === 0)
|
|
210
|
+
ctx.moveTo(x, y);
|
|
211
|
+
else
|
|
212
|
+
ctx.lineTo(x, y);
|
|
213
|
+
}
|
|
214
|
+
ctx.stroke();
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/** The other planes: across (u) and down (v), dashed in their axis colours. */
|
|
219
|
+
paintCrosshair(ctx, view, t, px) {
|
|
220
|
+
const [U, V] = view.size;
|
|
221
|
+
const across = this.axis === 'x' ? 'z' : 'x';
|
|
222
|
+
const down = this.axis === 'x' ? 'y' : 'z';
|
|
223
|
+
ctx.setLineDash([6, 4]);
|
|
224
|
+
ctx.lineWidth = 1.25;
|
|
225
|
+
if (view.crosshair.u !== null) {
|
|
226
|
+
const [x] = px(view.crosshair.u, 0);
|
|
227
|
+
ctx.strokeStyle = SLICE_PLANE_COLORS[across];
|
|
228
|
+
ctx.beginPath();
|
|
229
|
+
ctx.moveTo(x, t.oy);
|
|
230
|
+
ctx.lineTo(x, t.oy + V * t.sy);
|
|
231
|
+
ctx.stroke();
|
|
232
|
+
}
|
|
233
|
+
if (view.crosshair.v !== null) {
|
|
234
|
+
const [, y] = px(0, view.crosshair.v);
|
|
235
|
+
ctx.strokeStyle = SLICE_PLANE_COLORS[down];
|
|
236
|
+
ctx.beginPath();
|
|
237
|
+
ctx.moveTo(t.ox, y);
|
|
238
|
+
ctx.lineTo(t.ox + U * t.sx, y);
|
|
239
|
+
ctx.stroke();
|
|
240
|
+
}
|
|
241
|
+
ctx.setLineDash([]);
|
|
242
|
+
}
|
|
243
|
+
/** The section's image on a canvas of its own size (made again only for a new image). */
|
|
244
|
+
imageCanvas(image) {
|
|
245
|
+
if (this.image?.source === image)
|
|
246
|
+
return this.image.canvas;
|
|
247
|
+
const canvas = document.createElement('canvas');
|
|
248
|
+
canvas.width = image.width;
|
|
249
|
+
canvas.height = image.height;
|
|
250
|
+
canvas.getContext('2d')?.putImageData(new ImageData(image.data, image.width, image.height), 0, 0);
|
|
251
|
+
this.image = { source: image, canvas };
|
|
252
|
+
return canvas;
|
|
253
|
+
}
|
|
254
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SectionPaneComponent, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
255
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.9", type: SectionPaneComponent, isStandalone: true, selector: "viz-section-pane", inputs: { axis: "axis", view: "view" }, outputs: { pick: "pick" }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["canvas"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: `
|
|
256
|
+
<canvas
|
|
257
|
+
#canvas
|
|
258
|
+
class="section-canvas"
|
|
259
|
+
[attr.aria-label]="label"
|
|
260
|
+
(wheel)="onWheel($event)"
|
|
261
|
+
(pointerdown)="onDown($event)"
|
|
262
|
+
(pointermove)="onMove($event)"
|
|
263
|
+
(pointerup)="onUp($event)"
|
|
264
|
+
(pointercancel)="onUp($event)"
|
|
265
|
+
(dblclick)="fit()"
|
|
266
|
+
></canvas>
|
|
267
|
+
<span class="section-badge" [style.background]="axisColor">{{ label }}</span>
|
|
268
|
+
<span *ngIf="!view" class="section-empty">Waiting for the volume…</span>
|
|
269
|
+
`, isInline: true, styles: [":host{position:absolute;inset:0;display:block;overflow:hidden;background:#111}.section-canvas{width:100%;height:100%;display:block;cursor:crosshair;touch-action:none}.section-badge{position:absolute;top:6px;left:6px;padding:1px 8px;border-radius:4px;color:#fff;font:600 12px/1.6 system-ui,sans-serif;pointer-events:none}.section-empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#aaa;font:13px system-ui,sans-serif;pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
270
|
+
}
|
|
271
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: SectionPaneComponent, decorators: [{
|
|
272
|
+
type: Component,
|
|
273
|
+
args: [{ selector: 'viz-section-pane', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
274
|
+
<canvas
|
|
275
|
+
#canvas
|
|
276
|
+
class="section-canvas"
|
|
277
|
+
[attr.aria-label]="label"
|
|
278
|
+
(wheel)="onWheel($event)"
|
|
279
|
+
(pointerdown)="onDown($event)"
|
|
280
|
+
(pointermove)="onMove($event)"
|
|
281
|
+
(pointerup)="onUp($event)"
|
|
282
|
+
(pointercancel)="onUp($event)"
|
|
283
|
+
(dblclick)="fit()"
|
|
284
|
+
></canvas>
|
|
285
|
+
<span class="section-badge" [style.background]="axisColor">{{ label }}</span>
|
|
286
|
+
<span *ngIf="!view" class="section-empty">Waiting for the volume…</span>
|
|
287
|
+
`, styles: [":host{position:absolute;inset:0;display:block;overflow:hidden;background:#111}.section-canvas{width:100%;height:100%;display:block;cursor:crosshair;touch-action:none}.section-badge{position:absolute;top:6px;left:6px;padding:1px 8px;border-radius:4px;color:#fff;font:600 12px/1.6 system-ui,sans-serif;pointer-events:none}.section-empty{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#aaa;font:13px system-ui,sans-serif;pointer-events:none}\n"] }]
|
|
288
|
+
}], ctorParameters: () => [{ type: i0.NgZone }], propDecorators: { axis: [{
|
|
289
|
+
type: Input,
|
|
290
|
+
args: [{ required: true }]
|
|
291
|
+
}], view: [{
|
|
292
|
+
type: Input
|
|
293
|
+
}], pick: [{
|
|
294
|
+
type: Output
|
|
295
|
+
}], canvasRef: [{
|
|
296
|
+
type: ViewChild,
|
|
297
|
+
args: ['canvas', { static: true }]
|
|
298
|
+
}] } });
|
|
299
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdGlvbi1wYW5lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc2VjdGlvbi1wYW5lL3NlY3Rpb24tcGFuZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUdOLE1BQU0sRUFDTixTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlEQUF5RCxDQUFDOzs7QUFFN0YsZ0ZBQWdGO0FBQ2hGLE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQztBQUN4QixvQ0FBb0M7QUFDcEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDO0FBQzFCLG1EQUFtRDtBQUNuRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUM7QUFDeEIsMkRBQTJEO0FBQzNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQztBQTJFeEIsTUFBTSxPQUFPLG9CQUFvQjtJQWdCL0IsWUFBNkIsSUFBWTtRQUFaLFNBQUksR0FBSixJQUFJLENBQVE7UUFkaEMsU0FBSSxHQUF1QixJQUFJLENBQUM7UUFDekMsa0VBQWtFO1FBQy9DLFNBQUksR0FBRyxJQUFJLFlBQVksRUFBNEIsQ0FBQztRQUkvRCxTQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ1QsUUFBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7UUFDckIsVUFBSyxHQUNYLElBQUksQ0FBQztRQUNDLFVBQUssR0FBdUUsSUFBSSxDQUFDO1FBRWpGLFVBQUssR0FBa0IsSUFBSSxDQUFDO0lBRVEsQ0FBQztJQUU3QyxJQUFjLFNBQVM7UUFDckIsT0FBTyxrQkFBa0IsQ0FB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QUFJO3NCQUFaLEtBQUs7Z0JBRWEsSUFBSTtzQkFBdEIsTUFBTTtnQkFFd0MsU0FBUztzQkFBdkQsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuaW1wb3J0IHR5cGUgeyBTZWN0aW9uQXhpcywgU2VjdGlvblZpZXcgfSBmcm9tICcuLi9jb250cmFjdHMvc2VjdGlvbi12aWV3LmNvbnRyYWN0JztcbmltcG9ydCB7IFNMSUNFX1BMQU5FX0NPTE9SUyB9IGZyb20gJy4uL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLXZvbHVtZS1zbGljZS1wbGFuZXMnO1xuXG4vKiogQSBwcmVzcyB0aGF0IG1vdmVzIGZhcnRoZXIgdGhhbiB0aGlzIChweCkgcGFuczsgYSBzaG9ydGVyIG9uZSBpcyBhIGNsaWNrLiAqL1xuY29uc3QgQ0xJQ0tfU0xPUF9QWCA9IDQ7XG4vKiogSG93IG11Y2ggYSB3aGVlbCBub3RjaCB6b29tcy4gKi9cbmNvbnN0IFdIRUVMX1pPT00gPSAxLjAwMTU7XG4vKiogVGhlIHNlY3Rpb24ncyBzaGFyZSBvZiB0aGUgcGFuZSB3aGVuIGZpdHRlZC4gKi9cbmNvbnN0IEZJVF9NQVJHSU4gPSAwLjk0O1xuLyoqIFRoZSByZWdpb25zJyBmaWxsIG9wYWNpdHksIGFzIHRoZSAyRCB2aWV3J3MgZGVmYXVsdC4gKi9cbmNvbnN0IEZJTExfQUxQSEEgPSAwLjI1O1xuXG4vKipcbiAqIE9uZSBzZWN0aW9uIGJlc2lkZSBhIHNwbGl0IHZvbHVtZSB2aWV3ICh0aGUgcGxhbmUgeCA9IGNvbnN0IG9yIHkgPSBjb25zdCB0aHJvdWdoIHRoZSBzdGFjayk6XG4gKiBpdHMgaW1hZ2UgaW4gdGhlIHZvbHVtZSdzIHByb3BvcnRpb25zLCB0aGUgcmVnaW9ucyBjdXQgYnkgdGhlIHBsYW5lLCBhbmQgdGhlIG90aGVyIHR3byBwbGFuZXNcbiAqIGFzIGEgY3Jvc3NoYWlyIGluIHRoZWlyIGF4aXMgY29sb3Vycy4gVGhlIHdoZWVsIHpvb21zIGFib3V0IHRoZSBwb2ludGVyLCBhIGRyYWcgcGFucywgYVxuICogZG91YmxlLWNsaWNrIGZpdHM7IGEgY2xpY2sgcGlja3MgdGhhdCBwb2ludCAoYHBpY2tgLCBpbiBzZWN0aW9uIGNvb3JkaW5hdGVzKSDigJQgdGhlIGhvc3QgbW92ZXNcbiAqIHRoZSBvdGhlciBwbGFuZXMgdGhlcmUuXG4gKi9cbi8qKiBTZWN0aW9uIGNvb3JkaW5hdGVzICh1LCB2KSDihpIgY2FudmFzIHB4LiAqL1xudHlwZSBUb0NhbnZhcyA9ICh1OiBudW1iZXIsIHY6IG51bWJlcikgPT4gW251bWJlciwgbnVtYmVyXTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndml6LXNlY3Rpb24tcGFuZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8Y2FudmFzXG4gICAgICAjY2FudmFzXG4gICAgICBjbGFzcz1cInNlY3Rpb24tY2FudmFzXCJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwibGFiZWxcIlxuICAgICAgKHdoZWVsKT1cIm9uV2hlZWwoJGV2ZW50KVwiXG4gICAgICAocG9pbnRlcmRvd24pPVwib25Eb3duKCRldmVudClcIlxuICAgICAgKHBvaW50ZXJtb3ZlKT1cIm9uTW92ZSgkZXZlbnQpXCJcbiAgICAgIChwb2ludGVydXApPVwib25VcCgkZXZlbnQpXCJcbiAgICAgIChwb2ludGVyY2FuY2VsKT1cIm9uVXAoJGV2ZW50KVwiXG4gICAgICAoZGJsY2xpY2spPVwiZml0KClcIlxuICAgID48L2NhbnZhcz5cbiAgICA8c3BhbiBjbGFzcz1cInNlY3Rpb24tYmFkZ2VcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJheGlzQ29sb3JcIj57eyBsYWJlbCB9fTwvc3Bhbj5cbiAgICA8c3BhbiAqbmdJZj1cIiF2aWV3XCIgY2xhc3M9XCJzZWN0aW9uLWVtcHR5XCI+V2FpdGluZyBmb3IgdGhlIHZvbHVtZeKApjwvc3Bhbj5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGluc2V0OiAwO1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgYmFja2dyb3VuZDogIzExMTtcbiAgICAgIH1cbiAgICAgIC5zZWN0aW9uLWNhbnZhcyB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBjdXJzb3I6IGNyb3NzaGFpcjtcbiAgICAgICAgdG91Y2gtYWN0aW9uOiBub25lO1xuICAgICAgfVxuICAgICAgLnNlY3Rpb24tYmFkZ2Uge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHRvcDogNnB4O1xuICAgICAgICBsZWZ0OiA2cHg7XG4gICAgICAgIHBhZGRpbmc6IDFweCA4cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgICAgY29sb3I6ICNmZmY7XG4gICAgICAgIGZvbnQ6XG4gICAgICAgICAgNjAwIDEycHgvMS42IHN5c3RlbS11aSxcbiAgICAgICAgICBzYW5zLXNlcmlmO1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIH1cbiAgICAgIC5zZWN0aW9uLWVtcHR5IHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBpbnNldDogMDtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIGNvbG9yOiAjYWFhO1xuICAgICAgICBmb250OlxuICAgICAgICAgIDEzcHggc3lzdGVtLXVpLFxuICAgICAgICAgIHNhbnMtc2VyaWY7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFNlY3Rpb25QYW5lQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBheGlzITogU2VjdGlvbkF4aXM7XG4gIEBJbnB1dCgpIHZpZXc6IFNlY3Rpb25WaWV3IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBBIHBvaW50IGNsaWNrZWQsIGluIHNlY3Rpb24gY29vcmRpbmF0ZXMgKHUgYWNyb3NzLCB2IGRvd24pLiAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgcGljayA9IG5ldyBFdmVudEVtaXR0ZXI8eyB1OiBudW1iZXI7IHY6IG51bWJlciB9PigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2NhbnZhcycsIHsgc3RhdGljOiB0cnVlIH0pIHByaXZhdGUgY2FudmFzUmVmITogRWxlbWVudFJlZjxIVE1MQ2FudmFzRWxlbWVudD47XG5cbiAgcHJpdmF0ZSB6b29tID0gMTtcbiAgcHJpdmF0ZSBwYW4gPSB7IHg6IDAsIHk6IDAgfTtcbiAgcHJpdmF0ZSBwcmVzczogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgcGFuWDogbnVtYmVyOyBwYW5ZOiBudW1iZXI7IG1vdmVkOiBib29sZWFuOyBwb2ludGVyOiBudW1iZXIgfSB8IG51bGwgPVxuICAgIG51bGw7XG4gIHByaXZhdGUgaW1hZ2U6IHsgc291cmNlOiBTZWN0aW9uVmlld1snaW1hZ2UnXTsgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB9IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcmVzaXplPzogUmVzaXplT2JzZXJ2ZXI7XG4gIHByaXZhdGUgZnJhbWU6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgem9uZTogTmdab25lKSB7fVxuXG4gIHByb3RlY3RlZCBnZXQgYXhpc0NvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNMSUNFX1BMQU5FX0NPTE9SU1t0aGlzLmF4aXNdO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBsYWJlbCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGF0ID0gdGhpcy52aWV3ID8gYCDCtyAke01hdGgucm91bmQodGhpcy52aWV3LmF0KX0gcHhgIDogJyc7XG4gICAgcmV0dXJuIGAke3RoaXMuYXhpcy50b1VwcGVyQ2FzZSgpfSR7YXR9YDtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodHlwZW9mIFJlc2l6ZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZXNpemU/LmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgdGhpcy5yZXNpemUgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdGhpcy5kcmF3KCkpO1xuICAgICAgICB0aGlzLnJlc2l6ZS5vYnNlcnZlKHRoaXMuY2FudmFzUmVmLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuZHJhdygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5kcmF3KCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlc2l6ZT8uZGlzY29ubmVjdCgpO1xuICAgIGlmICh0aGlzLmZyYW1lICE9PSBudWxsKSBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmZyYW1lKTtcbiAgfVxuXG4gIC8qKiBCYWNrIHRvIHRoZSB3aG9sZSBzZWN0aW9uLCBjZW50cmVkLiAqL1xuICBmaXQoKTogdm9pZCB7XG4gICAgdGhpcy56b29tID0gMTtcbiAgICB0aGlzLnBhbiA9IHsgeDogMCwgeTogMCB9O1xuICAgIHRoaXMuZHJhdygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uV2hlZWwoZTogV2hlZWxFdmVudCk6IHZvaWQge1xuICAgIGlmICghdGhpcy52aWV3KSByZXR1cm47XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IFtjeCwgY3ldID0gdGhpcy5sb2NhbChlKTtcbiAgICBjb25zdCBmYWN0b3IgPSBNYXRoLnBvdyhXSEVFTF9aT09NLCAtZS5kZWx0YVkpO1xuICAgIGNvbnN0IG5leHQgPSBNYXRoLm1pbig1MCwgTWF0aC5tYXgoMC4yLCB0aGlzLnpvb20gKiBmYWN0b3IpKTtcbiAgICBjb25zdCBrID0gbmV4dCAvIHRoaXMuem9vbTtcbiAgICAvLyBLZWVwIHRoZSBwb2ludCB1bmRlciB0aGUgcG9pbnRlciBzdGlsbC5cbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IHRoaXMuY2FudmFzUmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdGhpcy5wYW4ueCA9IChjeCAtIHdpZHRoIC8gMikgKiAoMSAtIGspICsgdGhpcy5wYW4ueCAqIGs7XG4gICAgdGhpcy5wYW4ueSA9IChjeSAtIGhlaWdodCAvIDIpICogKDEgLSBrKSArIHRoaXMucGFuLnkgKiBrO1xuICAgIHRoaXMuem9vbSA9IG5leHQ7XG4gICAgdGhpcy5kcmF3KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25Eb3duKGU6IFBvaW50ZXJFdmVudCk6IHZvaWQge1xuICAgIGlmIChlLmJ1dHRvbiAhPT0gMCkgcmV0dXJuO1xuICAgIHRoaXMucHJlc3MgPSB7XG4gICAgICB4OiBlLmNsaWVudFgsXG4gICAgICB5OiBlLmNsaWVudFksXG4gICAgICBwYW5YOiB0aGlzLnBhbi54LFxuICAgICAgcGFuWTogdGhpcy5wYW4ueSxcbiAgICAgIG1vdmVkOiBmYWxzZSxcbiAgICAgIHBvaW50ZXI6IGUucG9pbnRlcklkLFxuICAgIH07XG4gICAgdGhpcy5jYW52YXNSZWYubmF0aXZlRWxlbWVudC5zZXRQb2ludGVyQ2FwdHVyZT8uKGUucG9pbnRlcklkKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbk1vdmUoZTogUG9pbnRlckV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgcCA9IHRoaXMucHJlc3M7XG4gICAgaWYgKCFwIHx8IGUucG9pbnRlcklkICE9PSBwLnBvaW50ZXIpIHJldHVybjtcbiAgICBjb25zdCBkeCA9IGUuY2xpZW50WCAtIHAueDtcbiAgICBjb25zdCBkeSA9IGUuY2xpZW50WSAtIHAueTtcbiAgICBpZiAoIXAubW92ZWQgJiYgTWF0aC5oeXBvdChkeCwgZHkpIDw9IENMSUNLX1NMT1BfUFgpIHJldHVybjtcbiAgICBwLm1vdmVkID0gdHJ1ZTtcbiAgICB0aGlzLnBhbiA9IHsgeDogcC5wYW5YICsgZHgsIHk6IHAucGFuWSArIGR5IH07XG4gICAgdGhpcy5kcmF3KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25VcChlOiBQb2ludGVyRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBwID0gdGhpcy5wcmVzcztcbiAgICBpZiAoIXAgfHwgZS5wb2ludGVySWQgIT09IHAucG9pbnRlcikgcmV0dXJuO1xuICAgIHRoaXMucHJlc3MgPSBudWxsO1xuICAgIGNvbnN0IGNhbnZhcyA9IHRoaXMuY2FudmFzUmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKGNhbnZhcy5oYXNQb2ludGVyQ2FwdHVyZT8uKGUucG9pbnRlcklkKSkgY2FudmFzLnJlbGVhc2VQb2ludGVyQ2FwdHVyZT8uKGUucG9pbnRlcklkKTtcbiAgICBpZiAocC5tb3ZlZCB8fCAhdGhpcy52aWV3KSByZXR1cm47XG4gICAgY29uc3QgYXQgPSB0aGlzLnRvU2VjdGlvbiguLi50aGlzLmxvY2FsKGUpKTtcbiAgICBpZiAoIWF0KSByZXR1cm47XG4gICAgY29uc3QgW1UsIFZdID0gdGhpcy52aWV3LnNpemU7XG4gICAgaWYgKGF0LnUgPCAwIHx8IGF0LnYgPCAwIHx8IGF0LnUgPiBVIHx8IGF0LnYgPiBWKSByZXR1cm47XG4gICAgdGhpcy5waWNrLmVtaXQoYXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2NhbChlOiBNb3VzZUV2ZW50KTogW251bWJlciwgbnVtYmVyXSB7XG4gICAgY29uc3QgciA9IHRoaXMuY2FudmFzUmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIFtlLmNsaWVudFggLSByLmxlZnQsIGUuY2xpZW50WSAtIHIudG9wXTtcbiAgfVxuXG4gIC8qKiBTZWN0aW9uIHVuaXRzIOKGkiBDU1MgcHggaW4gdGhlIHBhbmU6IHNjYWxlIHBlciB1bml0IGFjcm9zcyBhbmQgZG93biwgYW5kIHRoZSBvcmlnaW4uICovXG4gIHByaXZhdGUgdHJhbnNmb3JtKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogeyBzeDogbnVtYmVyOyBzeTogbnVtYmVyOyBveDogbnVtYmVyOyBveTogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3O1xuICAgIGlmICghdmlldyB8fCB3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBbVSwgVl0gPSB2aWV3LnNpemU7XG4gICAgY29uc3Qgd29ybGRXID0gVSAqIHZpZXcuc2NhbGVbMF07XG4gICAgY29uc3Qgd29ybGRIID0gViAqIHZpZXcuc2NhbGVbMV07XG4gICAgaWYgKCEod29ybGRXID4gMCAmJiB3b3JsZEggPiAwKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgayA9IE1hdGgubWluKHdpZHRoIC8gd29ybGRXLCBoZWlnaHQgLyB3b3JsZEgpICogRklUX01BUkdJTiAqIHRoaXMuem9vbTtcbiAgICBjb25zdCBzeCA9IHZpZXcuc2NhbGVbMF0gKiBrO1xuICAgIGNvbnN0IHN5ID0gdmlldy5zY2FsZVsxXSAqIGs7XG4gICAgcmV0dXJuIHsgc3gsIHN5LCBveDogd2lkdGggLyAyICsgdGhpcy5wYW4ueCAtIChVIC8gMikgKiBzeCwgb3k6IGhlaWdodCAvIDIgKyB0aGlzLnBhbi55IC0gKFYgLyAyKSAqIHN5IH07XG4gIH1cblxuICBwcml2YXRlIHRvU2VjdGlvbih4OiBudW1iZXIsIHk6IG51bWJlcik6IHsgdTogbnVtYmVyOyB2OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGhpcy5jYW52YXNSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB0ID0gdGhpcy50cmFuc2Zvcm0od2lkdGgsIGhlaWdodCk7XG4gICAgcmV0dXJuIHQgPyB7IHU6ICh4IC0gdC5veCkgLyB0LnN4LCB2OiAoeSAtIHQub3kpIC8gdC5zeSB9IDogbnVsbDtcbiAgfVxuXG4gIC8qKiBSZWRyYXcgb24gdGhlIG5leHQgZnJhbWUgKG91dHNpZGUgQW5ndWxhcjogYSBjYW52YXMgcGFpbnQgbmVlZHMgbm8gY2hhbmdlIGRldGVjdGlvbikuICovXG4gIHByaXZhdGUgZHJhdygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mcmFtZSAhPT0gbnVsbCB8fCB0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID09PSAndW5kZWZpbmVkJykgcmV0dXJuO1xuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgdGhpcy5mcmFtZSA9IG51bGw7XG4gICAgICAgIHRoaXMucGFpbnQoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBwYWludCgpOiB2b2lkIHtcbiAgICBjb25zdCBjYW52YXMgPSB0aGlzLmNhbnZhc1JlZi5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gY2FudmFzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IGRwciA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gICAgY2FudmFzLndpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZCh3aWR0aCAqIGRwcikpO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKGhlaWdodCAqIGRwcikpO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGlmICghY3R4KSByZXR1cm47XG4gICAgY3R4LnNldFRyYW5zZm9ybShkcHIsIDAsIDAsIGRwciwgMCwgMCk7XG4gICAgY3R4LmNsZWFyUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3O1xuICAgIGNvbnN0IHQgPSB0aGlzLnRyYW5zZm9ybSh3aWR0aCwgaGVpZ2h0KTtcbiAgICBpZiAoIXZpZXcgfHwgIXQpIHJldHVybjtcbiAgICBjb25zdCBbVSwgVl0gPSB2aWV3LnNpemU7XG4gICAgY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IHRydWU7XG4gICAgY3R4LmRyYXdJbWFnZSh0aGlzLmltYWdlQ2FudmFzKHZpZXcuaW1hZ2UpLCB0Lm94LCB0Lm95LCBVICogdC5zeCwgViAqIHQuc3kpO1xuXG4gICAgY29uc3QgcHggPSAodTogbnVtYmVyLCB2OiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdID0+IFt0Lm94ICsgdSAqIHQuc3gsIHQub3kgKyB2ICogdC5zeV07XG4gICAgdGhpcy5wYWludFJlZ2lvbnMoY3R4LCB2aWV3LCBweCk7XG4gICAgdGhpcy5wYWludENyb3NzaGFpcihjdHgsIHZpZXcsIHQsIHB4KTtcbiAgfVxuXG4gIC8qKiBFYWNoIGNsYXNzJ3MgY3V0OiBpdHMgb3V0bGluZXMgZmlsbGVkIGFuZCBzdHJva2VkLCBpdHMgbGluZXMgZHJhd24gKGEgZG90IGZvciBvbmUgcG9pbnQpLiAqL1xuICBwcml2YXRlIHBhaW50UmVnaW9ucyhjdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgdmlldzogU2VjdGlvblZpZXcsIHB4OiBUb0NhbnZhcyk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgciBvZiB2aWV3LnJlZ2lvbnMpIHtcbiAgICAgIGlmIChyLnJpbmdzLmxlbmd0aCkge1xuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGZvciAoY29uc3QgcmluZyBvZiByLnJpbmdzKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgKyAxIDwgcmluZy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICAgICAgY29uc3QgW3gsIHldID0gcHgocmluZ1tpXSwgcmluZ1tpICsgMV0pO1xuICAgICAgICAgICAgaWYgKGkgPT09IDApIGN0eC5tb3ZlVG8oeCwgeSk7XG4gICAgICAgICAgICBlbHNlIGN0eC5saW5lVG8oeCwgeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN0eC5jbG9zZVBhdGgoKTtcbiAgICAgICAgfVxuICAgICAgICBjdHguZ2xvYmFsQWxwaGEgPSBGSUxMX0FMUEhBO1xuICAgICAgICBjdHguZmlsbFN0eWxlID0gci5jb2xvcjtcbiAgICAgICAgY3R4LmZpbGwoJ2V2ZW5vZGQnKTtcbiAgICAgICAgY3R4Lmdsb2JhbEFscGhhID0gMTtcbiAgICAgICAgY3R4LnN0cm9rZVN0eWxlID0gci5jb2xvcjtcbiAgICAgICAgY3R4LmxpbmVXaWR0aCA9IDEuMjU7XG4gICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgIH1cbiAgICAgIGN0eC5zdHJva2VTdHlsZSA9IHIuY29sb3I7XG4gICAgICBjdHguZmlsbFN0eWxlID0gci5jb2xvcjtcbiAgICAgIGN0eC5saW5lV2lkdGggPSAyO1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIHIubGluZXMpIHtcbiAgICAgICAgaWYgKGxpbmUubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgY29uc3QgW3gsIHldID0gcHgobGluZVswXSwgbGluZVsxXSk7XG4gICAgICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgICAgIGN0eC5hcmMoeCwgeSwgMi41LCAwLCBNYXRoLlBJICogMik7XG4gICAgICAgICAgY3R4LmZpbGwoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpICsgMSA8IGxpbmUubGVuZ3RoOyBpICs9IDIpIHtcbiAgICAgICAgICBjb25zdCBbeCwgeV0gPSBweChsaW5lW2ldLCBsaW5lW2kgKyAxXSk7XG4gICAgICAgICAgaWYgKGkgPT09IDApIGN0eC5tb3ZlVG8oeCwgeSk7XG4gICAgICAgICAgZWxzZSBjdHgubGluZVRvKHgsIHkpO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5zdHJva2UoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogVGhlIG90aGVyIHBsYW5lczogYWNyb3NzICh1KSBhbmQgZG93biAodiksIGRhc2hlZCBpbiB0aGVpciBheGlzIGNvbG91cnMuICovXG4gIHByaXZhdGUgcGFpbnRDcm9zc2hhaXIoXG4gICAgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsXG4gICAgdmlldzogU2VjdGlvblZpZXcsXG4gICAgdDogeyBveDogbnVtYmVyOyBveTogbnVtYmVyOyBzeDogbnVtYmVyOyBzeTogbnVtYmVyIH0sXG4gICAgcHg6IFRvQ2FudmFzLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBbVSwgVl0gPSB2aWV3LnNpemU7XG4gICAgY29uc3QgYWNyb3NzOiBrZXlvZiB0eXBlb2YgU0xJQ0VfUExBTkVfQ09MT1JTID0gdGhpcy5heGlzID09PSAneCcgPyAneicgOiAneCc7XG4gICAgY29uc3QgZG93bjoga2V5b2YgdHlwZW9mIFNMSUNFX1BMQU5FX0NPTE9SUyA9IHRoaXMuYXhpcyA9PT0gJ3gnID8gJ3knIDogJ3onO1xuICAgIGN0eC5zZXRMaW5lRGFzaChbNiwgNF0pO1xuICAgIGN0eC5saW5lV2lkdGggPSAxLjI1O1xuICAgIGlmICh2aWV3LmNyb3NzaGFpci51ICE9PSBudWxsKSB7XG4gICAgICBjb25zdCBbeF0gPSBweCh2aWV3LmNyb3NzaGFpci51LCAwKTtcbiAgICAgIGN0eC5zdHJva2VTdHlsZSA9IFNMSUNFX1BMQU5FX0NPTE9SU1thY3Jvc3NdO1xuICAgICAgY3R4LmJlZ2luUGF0aCgpO1xuICAgICAgY3R4Lm1vdmVUbyh4LCB0Lm95KTtcbiAgICAgIGN0eC5saW5lVG8oeCwgdC5veSArIFYgKiB0LnN5KTtcbiAgICAgIGN0eC5zdHJva2UoKTtcbiAgICB9XG4gICAgaWYgKHZpZXcuY3Jvc3NoYWlyLnYgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IFssIHldID0gcHgoMCwgdmlldy5jcm9zc2hhaXIudik7XG4gICAgICBjdHguc3Ryb2tlU3R5bGUgPSBTTElDRV9QTEFORV9DT0xPUlNbZG93bl07XG4gICAgICBjdHguYmVnaW5QYXRoKCk7XG4gICAgICBjdHgubW92ZVRvKHQub3gsIHkpO1xuICAgICAgY3R4LmxpbmVUbyh0Lm94ICsgVSAqIHQuc3gsIHkpO1xuICAgICAgY3R4LnN0cm9rZSgpO1xuICAgIH1cbiAgICBjdHguc2V0TGluZURhc2goW10pO1xuICB9XG5cbiAgLyoqIFRoZSBzZWN0aW9uJ3MgaW1hZ2Ugb24gYSBjYW52YXMgb2YgaXRzIG93biBzaXplIChtYWRlIGFnYWluIG9ubHkgZm9yIGEgbmV3IGltYWdlKS4gKi9cbiAgcHJpdmF0ZSBpbWFnZUNhbnZhcyhpbWFnZTogU2VjdGlvblZpZXdbJ2ltYWdlJ10pOiBIVE1MQ2FudmFzRWxlbWVudCB7XG4gICAgaWYgKHRoaXMuaW1hZ2U/LnNvdXJjZSA9PT0gaW1hZ2UpIHJldHVybiB0aGlzLmltYWdlLmNhbnZhcztcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSBpbWFnZS53aWR0aDtcbiAgICBjYW52YXMuaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0O1xuICAgIGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpPy5wdXRJbWFnZURhdGEobmV3IEltYWdlRGF0YShpbWFnZS5kYXRhLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0KSwgMCwgMCk7XG4gICAgdGhpcy5pbWFnZSA9IHsgc291cmNlOiBpbWFnZSwgY2FudmFzIH07XG4gICAgcmV0dXJuIGNhbnZhcztcbiAgfVxufVxuIl19
|
|
@@ -55,16 +55,21 @@ export function fallbackColorFor(label, palette) {
|
|
|
55
55
|
const hue = (hashString(key) * 137.508) % 360;
|
|
56
56
|
return hslToHex(hue, 65, 50);
|
|
57
57
|
}
|
|
58
|
-
/**
|
|
58
|
+
/**
|
|
59
|
+
* Resolve a colour for `label`: a matching preset's colour, else the colour an imported file
|
|
60
|
+
* gave the class, else the deterministic fallback.
|
|
61
|
+
*/
|
|
59
62
|
export function colorForLabel(label, set) {
|
|
60
63
|
const preset = findPreset(label, set);
|
|
61
|
-
|
|
64
|
+
if (preset)
|
|
65
|
+
return preset.color;
|
|
66
|
+
return set.importedColors?.[presetKey(set, label)] ?? fallbackColorFor(label, set.fallbackPalette);
|
|
62
67
|
}
|
|
63
68
|
/**
|
|
64
69
|
* Resolve each labelled region's colour from the preset set (jit-ui#70). The
|
|
65
70
|
* presets are the source of truth: a matching preset gives the class colour,
|
|
66
|
-
* an unknown class
|
|
67
|
-
*
|
|
71
|
+
* an unknown class the colour an imported file gave it (`importedColors`) or else
|
|
72
|
+
* its deterministic fallback, **overriding any colour already on the region**. Unlabelled regions and
|
|
68
73
|
* ones the user recoloured (`colorOverridden`) are left untouched. Unknown
|
|
69
74
|
* classes are reported through `onPromote` when `autoPromote` is on.
|
|
70
75
|
*
|
|
@@ -92,4 +97,4 @@ export function applyPresetColors(regions, set, opts = {}) {
|
|
|
92
97
|
return region;
|
|
93
98
|
});
|
|
94
99
|
}
|
|
95
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3MtY29sb3IudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3RvcmUvY2xhc3MtY29sb3IudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFjQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFekQsTUFBTSxVQUFVLGNBQWMsQ0FBQyxDQUFTO0lBQ3RDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDeEMsQ0FBQztBQUVELG9GQUFvRjtBQUNwRixNQUFNLFVBQVUsVUFBVSxDQUFDLENBQVM7SUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNsQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDRCx1RUFBdUU7SUFDdkUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLEdBQWlDLEVBQUUsS0FBYTtJQUN4RSxPQUFPLEdBQUcsRUFBRSxTQUFTLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUN6RSxDQUFDO0FBRUQsK0ZBQStGO0FBQy9GLE1BQU0sVUFBVSxRQUFRLENBQUMsSUFBWSxFQUFFLElBQVksRUFBRSxJ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QUFPLE1BQU0sQ0FBQztRQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUFFLE9BQU8sZUFBZSxDQUFDLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDdkUsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDckIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEZXRlcm1pbmlzdGljIGNvbG91ciBlbmdpbmUgZm9yIHByZXNldCBhbm5vdGF0aW9uIGNsYXNzZXMgKGppdC11aSM3MCkuXG4gKlxuICogUmVzb2x1dGlvbiBvcmRlciBmb3IgYSByZWdpb24gYGxhYmVsYDpcbiAqICAgMS4gYSBtYXRjaGluZyBwcmVzZXQgKGV4YWN0IGJ5IGRlZmF1bHQsIG9yIG5vcm1hbGl6ZWQgaWYgdGhlIHNldCdzIG1hdGNoTW9kZSBzYXlzIHNvKVxuICogICAgICAtPiB0aGUgcHJlc2V0J3MgY29sb3VyO1xuICogICAyLiBvdGhlcndpc2UgYSBkZXRlcm1pbmlzdGljIGZhbGxiYWNrIGNvbG91ciBkZXJpdmVkIGZyb20gYSBzdGFibGUgaGFzaCBvZiB0aGUgbmFtZSxcbiAqICAgICAgc28gdGhlIHNhbWUgdW5rbm93biBjbGFzcyBhbHdheXMgZ2V0cyB0aGUgc2FtZSBjb2xvdXIgd2l0aCBubyBzdG9yZWQgc3RhdGUuXG4gKlxuICogVGhlc2UgZnVuY3Rpb25zIGFyZSBwdXJlIChubyBtdXRhdGlvbik7IG9wdC1pbiBwcm9tb3Rpb24gb2YgdW5rbm93biBjbGFzc2VzIGludG8gdGhlXG4gKiBzZXQgaXMgcmVwb3J0ZWQgdG8gdGhlIGNhbGxlciAoc2VlIHtAbGluayBhcHBseVByZXNldENvbG9yc30pLCB3aGljaCBvd25zIHBlcnNpc3RlbmNlLlxuICovXG5pbXBvcnQgeyBDbGFzc1ByZXNldCwgUHJlc2V0U2V0IH0gZnJvbSAnLi4vbW9kZWxzL2NsYXNzLXByZXNldCc7XG5pbXBvcnQgeyBSZWdpb24gfSBmcm9tICcuLi9tb2RlbHMvcmVnaW9uJztcbmltcG9ydCB7IHdpdGhSZWdpb25QYXRjaCB9IGZyb20gJy4uL21vZGVscy9yZWdpb24tY2xvbmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplTGFiZWwoczogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIChzID8/ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbn1cblxuLyoqIFN0YWJsZSwgbm9uLW5lZ2F0aXZlIDMyLWJpdCBzdHJpbmcgaGFzaCAoaWRlbnRpY2FsIGFjcm9zcyBydW5zIGFuZCBtYWNoaW5lcykuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaFN0cmluZyhzOiBzdHJpbmcpOiBudW1iZXIge1xuICBsZXQgaCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcy5sZW5ndGg7IGkrKykge1xuICAgIGggPSAoTWF0aC5pbXVsKDMxLCBoKSArIHMuY2hhckNvZGVBdChpKSkgfCAwO1xuICB9XG4gIC8vIEZvbGQgdG8gbm9uLW5lZ2F0aXZlIHdpdGhvdXQgdGhlIE1hdGguYWJzKElOVF9NSU4pIG92ZXJmbG93IHBpdGZhbGwuXG4gIHJldHVybiBoIDwgMCA/IH5oIDogaDtcbn1cblxuLyoqXG4gKiBUaGUga2V5IHR3byBjbGFzcyBuYW1lcyBhcmUgY29tcGFyZWQgYnkgdW5kZXIgdGhlIHNldCdzIG1hdGNoIG1vZGU6IHRoZSBuYW1lXG4gKiBpdHNlbGYgZm9yIGBleGFjdGAsIHRyaW1tZWQgYW5kIGxvd2VyLWNhc2VkIGZvciBgbm9ybWFsaXplZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVzZXRLZXkoc2V0OiBQaWNrPFByZXNldFNldCwgJ21hdGNoTW9kZSc+LCBsYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNldD8ubWF0Y2hNb2RlID09PSAnbm9ybWFsaXplZCcgPyBub3JtYWxpemVMYWJlbChsYWJlbCkgOiBsYWJlbDtcbn1cblxuLyoqIGAjUlJHR0JCYCAodXBwZXItY2FzZSkgZm9yIGFuIEhTTCBjb2xvdXI6IGh1ZSBpbiBkZWdyZWVzLCBzYXR1cmF0aW9uIGFuZCBsaWdodG5lc3MgaW4gJS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoc2xUb0hleChoRGVnOiBudW1iZXIsIHNQY3Q6IG51bWJlciwgbFBjdDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgcyA9IHNQY3QgLyAxMDA7XG4gIGNvbnN0IGwgPSBsUGN0IC8gMTAwO1xuICBjb25zdCBrID0gKG46IG51bWJlcikgPT4gKG4gKyBoRGVnIC8gMzApICUgMTI7XG4gIGNvbnN0IGEgPSBzICogTWF0aC5taW4obCwgMSAtIGwpO1xuICBjb25zdCBjaGFubmVsID0gKG46IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IHYgPSBsIC0gYSAqIE1hdGgubWF4KC0xLCBNYXRoLm1pbihrKG4pIC0gMywgOSAtIGsobiksIDEpKTtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCgyNTUgKiB2KVxuICAgICAgLnRvU3RyaW5nKDE2KVxuICAgICAgLnBhZFN0YXJ0KDIsICcwJyk7XG4gIH07XG4gIHJldHVybiBgIyR7Y2hhbm5lbCgwKX0ke2NoYW5uZWwoOCl9JHtjaGFubmVsKDQpfWAudG9VcHBlckNhc2UoKTtcbn1cblxuLyoqIEZpbmQgdGhlIHByZXNldCBtYXRjaGluZyBgbGFiZWxgIHVuZGVyIHRoZSBzZXQncyBtYXRjaCBtb2RlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRQcmVzZXQobGFiZWw6IHN0cmluZywgc2V0OiBQcmVzZXRTZXQpOiBDbGFzc1ByZXNldCB8IHVuZGVmaW5lZCB7XG4gIGlmICghbGFiZWwgfHwgIXNldD8uY2xhc3NlcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHNldC5tYXRjaE1vZGUgPT09ICdub3JtYWxpemVkJykge1xuICAgIGNvbnN0IG4gPSBub3JtYWxpemVMYWJlbChsYWJlbCk7XG4gICAgcmV0dXJuIHNldC5jbGFzc2VzLmZpbmQoKGMpID0+IG5vcm1hbGl6ZUxhYmVsKGMubmFtZSkgPT09IG4pO1xuICB9XG4gIHJldHVybiBzZXQuY2xhc3Nlcy5maW5kKChjKSA9PiBjLm5hbWUgPT09IGxhYmVsKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmlzdGljIGZhbGxiYWNrIGNvbG91ciBmb3IgYW4gdW5rbm93biBjbGFzcyBuYW1lOiBpbmRleCBpbnRvIHRoZSBwYWxldHRlIGJ5IGFcbiAqIHN0YWJsZSBoYXNoIG9mIHRoZSAobm9ybWFsaXplZCkgbmFtZTsgaWYgdGhlIHBhbGV0dGUgaXMgZW1wdHksIGdlbmVyYXRlIGEgZ29sZGVuLWFuZ2xlXG4gKiBIU0wgaHVlLiBTYW1lIG5hbWUgLT4gc2FtZSBjb2xvdXIsIGV2ZXJ5IHJ1bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZhbGxiYWNrQ29sb3JGb3IobGFiZWw6IHN0cmluZywgcGFsZXR0ZTogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBrZXkgPSBub3JtYWxpemVMYWJlbChsYWJlbCk7XG4gIGlmIChwYWxldHRlICYmIHBhbGV0dGUubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBwYWxldHRlW2hhc2hTdHJpbmcoa2V5KSAlIHBhbGV0dGUubGVuZ3RoXTtcbiAgfVxuICBjb25zdCBodWUgPSAoaGFzaFN0cmluZyhrZXkpICogMTM3LjUwOCkgJSAzNjA7XG4gIHJldHVybiBoc2xUb0hleChodWUsIDY1LCA1MCk7XG59XG5cbi8qKiBSZXNvbHZlIGEgY29sb3VyIGZvciBgbGFiZWxgOiBhIG1hdGNoaW5nIHByZXNldCdzIGNvbG91ciwgZWxzZSB0aGUgZGV0ZXJtaW5pc3RpYyBmYWxsYmFjay4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xvckZvckxhYmVsKGxhYmVsOiBzdHJpbmcsIHNldDogUHJlc2V0U2V0KTogc3RyaW5nIHtcbiAgY29uc3QgcHJlc2V0ID0gZmluZFByZXNldChsYWJlbCwgc2V0KTtcbiAgcmV0dXJuIHByZXNldCA/IHByZXNldC5jb2xvciA6IGZhbGxiYWNrQ29sb3JGb3IobGFiZWwsIHNldC5mYWxsYmFja1BhbGV0dGUpO1xufVxuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIGFwcGx5UHJlc2V0Q29sb3JzfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbHlQcmVzZXRDb2xvcnNPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRydWUgZm9yIGEgcmVnaW9uIHRoZSBjYWxsZXIgb3ducyBvdXRyaWdodCAoZnJlc2gsIG5vdCB5ZXQgc3RvcmVkLCBzbyBpbiBub1xuICAgKiB1bmRvIHNuYXBzaG90KTogaXRzIGNvbG91ciBpcyBzZXQgaW4gcGxhY2UuIEV2ZXJ5IG90aGVyIHJlZ2lvbiB3aG9zZVxuICAgKiBjb2xvdXIgY2hhbmdlcyBpcyBjb3BpZWQuIERlZmF1bHQ6IG5ldmVyIGluIHBsYWNlLlxuICAgKi9cbiAgaW5QbGFjZT86IChyOiBSZWdpb24pID0+IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDYWxsZWQgb25jZSBwZXIgdW5rbm93biBjbGFzcyB3aGVuIGBzZXQuYXV0b1Byb21vdGVgIGlzIG9uLCB3aXRoIHRoZVxuICAgKiBwcmVzZXQgdG8gYWRkIChuYW1lIHRyaW1tZWQgaW4gYG5vcm1hbGl6ZWRgIG1hdGNoIG1vZGUsIGBzb3VyY2U6ICdhdXRvJ2ApLlxuICAgKi9cbiAgb25Qcm9tb3RlPzogKHByZXNldDogQ2xhc3NQcmVzZXQpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBlYWNoIGxhYmVsbGVkIHJlZ2lvbidzIGNvbG91ciBmcm9tIHRoZSBwcmVzZXQgc2V0IChqaXQtdWkjNzApLiBUaGVcbiAqIHByZXNldHMgYXJlIHRoZSBzb3VyY2Ugb2YgdHJ1dGg6IGEgbWF0Y2hpbmcgcHJlc2V0IGdpdmVzIHRoZSBjbGFzcyBjb2xvdXIsXG4gKiBhbiB1bmtub3duIGNsYXNzIGl0cyBkZXRlcm1pbmlzdGljIGZhbGxiYWNrLCAqKm92ZXJyaWRpbmcgYW55IGNvbG91ciBhbHJlYWR5XG4gKiBvbiB0aGUgcmVnaW9uKiogKGUuZy4gZW1iZWRkZWQgaW4gaW1wb3J0ZWQgR2VvSlNPTikuIFVubGFiZWxsZWQgcmVnaW9ucyBhbmRcbiAqIG9uZXMgdGhlIHVzZXIgcmVjb2xvdXJlZCAoYGNvbG9yT3ZlcnJpZGRlbmApIGFyZSBsZWZ0IHVudG91Y2hlZC4gVW5rbm93blxuICogY2xhc3NlcyBhcmUgcmVwb3J0ZWQgdGhyb3VnaCBgb25Qcm9tb3RlYCB3aGVuIGBhdXRvUHJvbW90ZWAgaXMgb24uXG4gKlxuICogUmV0dXJucyBhIG5ldyBhcnJheTsgcmVnaW9ucyB3aG9zZSBjb2xvdXIgaXMgYWxyZWFkeSByaWdodCBhcmUgdGhlIHNhbWVcbiAqIGluc3RhbmNlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UHJlc2V0Q29sb3JzKFxuICByZWdpb25zOiBSZWdpb25bXSxcbiAgc2V0OiBQcmVzZXRTZXQsXG4gIG9wdHM6IEFwcGx5UHJlc2V0Q29sb3JzT3B0aW9ucyA9IHt9LFxuKTogUmVnaW9uW10ge1xuICBjb25zdCBrbm93biA9IG5ldyBTZXQoc2V0LmNsYXNzZXMubWFwKChjKSA9PiBwcmVzZXRLZXkoc2V0LCBjLm5hbWUpKSk7XG4gIHJldHVybiByZWdpb25zLm1hcCgocmVnaW9uKSA9PiB7XG4gICAgaWYgKCFyZWdpb24ubGFiZWwgfHwgcmVnaW9uLmNvbG9yT3ZlcnJpZGRlbikgcmV0dXJuIHJlZ2lvbjtcbiAgICBjb25zdCBjb2xvciA9IGNvbG9yRm9yTGFiZWwocmVnaW9uLmxhYmVsLCBzZXQpO1xuICAgIGlmIChzZXQuYXV0b1Byb21vdGUgJiYgIWtub3duLmhhcyhwcmVzZXRLZXkoc2V0LCByZWdpb24ubGFiZWwpKSkge1xuICAgICAga25vd24uYWRkKHByZXNldEtleShzZXQsIHJlZ2lvbi5sYWJlbCkpO1xuICAgICAgLy8gSW4gbm9ybWFsaXplZCBtb2RlLCB0cmltIHRoZSBwcm9tb3RlZCBuYW1lIHNvIGxlYWRpbmcvdHJhaWxpbmdcbiAgICAgIC8vIHdoaXRlc3BhY2UgZG9lc24ndCBjcmVhdGUgaW52aXNpYmxlIGR1cGxpY2F0ZXMgb3Igb2RkIGRpc3BsYXkgbmFtZXMuXG4gICAgICBjb25zdCBuYW1lID0gc2V0Lm1hdGNoTW9kZSA9PT0gJ25vcm1hbGl6ZWQnID8gcmVnaW9uLmxhYmVsLnRyaW0oKSA6IHJlZ2lvbi5sYWJlbDtcbiAgICAgIG9wdHMub25Qcm9tb3RlPy4oeyBuYW1lLCBjb2xvciwgc291cmNlOiAnYXV0bycgfSk7XG4gICAgfVxuICAgIGlmIChyZWdpb24uY29sb3IgPT09IGNvbG9yKSByZXR1cm4gcmVnaW9uO1xuICAgIGlmICghb3B0cy5pblBsYWNlPy4ocmVnaW9uKSkgcmV0dXJuIHdpdGhSZWdpb25QYXRjaChyZWdpb24sIHsgY29sb3IgfSk7XG4gICAgcmVnaW9uLmNvbG9yID0gY29sb3I7XG4gICAgcmV0dXJuIHJlZ2lvbjtcbiAgfSk7XG59XG4iXX0=
|
|
100
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3MtY29sb3IudXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3RvcmUvY2xhc3MtY29sb3IudXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFjQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFekQsTUFBTSxVQUFVLGNBQWMsQ0FBQyxDQUFTO0lBQ3RDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDeEMsQ0FBQztBQUVELG9GQUFvRjtBQUNwRixNQUFNLFVBQVUsVUFBVSxDQUFDLENBQVM7SUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ1YsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNsQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFDRCx1RUFBdUU7SUFDdkUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLEdBQWlDLEVBQUUsS0FBYTtJQUN4RSxPQUFPLEdBQUcsRUFBRSxTQUFTLEtBQUssWUFBWSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUN6RSxDQUFDO0FBRUQsK0ZBQStGO0FBQy9GLE1BQU0sVUFBVSxRQUFRLENBQUMsSUFBWSxFQUFFLElBQVksRUFBRSxJ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QUMsQ0FBQztRQUNwRCxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsS0FBSyxLQUFLLEtBQUs7WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUMxQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUFFLE9BQU8sZUFBZSxDQUFDLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDdkUsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDckIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBEZXRlcm1pbmlzdGljIGNvbG91ciBlbmdpbmUgZm9yIHByZXNldCBhbm5vdGF0aW9uIGNsYXNzZXMgKGppdC11aSM3MCkuXG4gKlxuICogUmVzb2x1dGlvbiBvcmRlciBmb3IgYSByZWdpb24gYGxhYmVsYDpcbiAqICAgMS4gYSBtYXRjaGluZyBwcmVzZXQgKGV4YWN0IGJ5IGRlZmF1bHQsIG9yIG5vcm1hbGl6ZWQgaWYgdGhlIHNldCdzIG1hdGNoTW9kZSBzYXlzIHNvKVxuICogICAgICAtPiB0aGUgcHJlc2V0J3MgY29sb3VyO1xuICogICAyLiBvdGhlcndpc2UgYSBkZXRlcm1pbmlzdGljIGZhbGxiYWNrIGNvbG91ciBkZXJpdmVkIGZyb20gYSBzdGFibGUgaGFzaCBvZiB0aGUgbmFtZSxcbiAqICAgICAgc28gdGhlIHNhbWUgdW5rbm93biBjbGFzcyBhbHdheXMgZ2V0cyB0aGUgc2FtZSBjb2xvdXIgd2l0aCBubyBzdG9yZWQgc3RhdGUuXG4gKlxuICogVGhlc2UgZnVuY3Rpb25zIGFyZSBwdXJlIChubyBtdXRhdGlvbik7IG9wdC1pbiBwcm9tb3Rpb24gb2YgdW5rbm93biBjbGFzc2VzIGludG8gdGhlXG4gKiBzZXQgaXMgcmVwb3J0ZWQgdG8gdGhlIGNhbGxlciAoc2VlIHtAbGluayBhcHBseVByZXNldENvbG9yc30pLCB3aGljaCBvd25zIHBlcnNpc3RlbmNlLlxuICovXG5pbXBvcnQgeyBDbGFzc1ByZXNldCwgUHJlc2V0U2V0IH0gZnJvbSAnLi4vbW9kZWxzL2NsYXNzLXByZXNldCc7XG5pbXBvcnQgeyBSZWdpb24gfSBmcm9tICcuLi9tb2RlbHMvcmVnaW9uJztcbmltcG9ydCB7IHdpdGhSZWdpb25QYXRjaCB9IGZyb20gJy4uL21vZGVscy9yZWdpb24tY2xvbmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplTGFiZWwoczogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIChzID8/ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbn1cblxuLyoqIFN0YWJsZSwgbm9uLW5lZ2F0aXZlIDMyLWJpdCBzdHJpbmcgaGFzaCAoaWRlbnRpY2FsIGFjcm9zcyBydW5zIGFuZCBtYWNoaW5lcykuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaFN0cmluZyhzOiBzdHJpbmcpOiBudW1iZXIge1xuICBsZXQgaCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcy5sZW5ndGg7IGkrKykge1xuICAgIGggPSAoTWF0aC5pbXVsKDMxLCBoKSArIHMuY2hhckNvZGVBdChpKSkgfCAwO1xuICB9XG4gIC8vIEZvbGQgdG8gbm9uLW5lZ2F0aXZlIHdpdGhvdXQgdGhlIE1hdGguYWJzKElOVF9NSU4pIG92ZXJmbG93IHBpdGZhbGwuXG4gIHJldHVybiBoIDwgMCA/IH5oIDogaDtcbn1cblxuLyoqXG4gKiBUaGUga2V5IHR3byBjbGFzcyBuYW1lcyBhcmUgY29tcGFyZWQgYnkgdW5kZXIgdGhlIHNldCdzIG1hdGNoIG1vZGU6IHRoZSBuYW1lXG4gKiBpdHNlbGYgZm9yIGBleGFjdGAsIHRyaW1tZWQgYW5kIGxvd2VyLWNhc2VkIGZvciBgbm9ybWFsaXplZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmVzZXRLZXkoc2V0OiBQaWNrPFByZXNldFNldCwgJ21hdGNoTW9kZSc+LCBsYWJlbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNldD8ubWF0Y2hNb2RlID09PSAnbm9ybWFsaXplZCcgPyBub3JtYWxpemVMYWJlbChsYWJlbCkgOiBsYWJlbDtcbn1cblxuLyoqIGAjUlJHR0JCYCAodXBwZXItY2FzZSkgZm9yIGFuIEhTTCBjb2xvdXI6IGh1ZSBpbiBkZWdyZWVzLCBzYXR1cmF0aW9uIGFuZCBsaWdodG5lc3MgaW4gJS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoc2xUb0hleChoRGVnOiBudW1iZXIsIHNQY3Q6IG51bWJlciwgbFBjdDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgcyA9IHNQY3QgLyAxMDA7XG4gIGNvbnN0IGwgPSBsUGN0IC8gMTAwO1xuICBjb25zdCBrID0gKG46IG51bWJlcikgPT4gKG4gKyBoRGVnIC8gMzApICUgMTI7XG4gIGNvbnN0IGEgPSBzICogTWF0aC5taW4obCwgMSAtIGwpO1xuICBjb25zdCBjaGFubmVsID0gKG46IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IHYgPSBsIC0gYSAqIE1hdGgubWF4KC0xLCBNYXRoLm1pbihrKG4pIC0gMywgOSAtIGsobiksIDEpKTtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCgyNTUgKiB2KVxuICAgICAgLnRvU3RyaW5nKDE2KVxuICAgICAgLnBhZFN0YXJ0KDIsICcwJyk7XG4gIH07XG4gIHJldHVybiBgIyR7Y2hhbm5lbCgwKX0ke2NoYW5uZWwoOCl9JHtjaGFubmVsKDQpfWAudG9VcHBlckNhc2UoKTtcbn1cblxuLyoqIEZpbmQgdGhlIHByZXNldCBtYXRjaGluZyBgbGFiZWxgIHVuZGVyIHRoZSBzZXQncyBtYXRjaCBtb2RlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRQcmVzZXQobGFiZWw6IHN0cmluZywgc2V0OiBQcmVzZXRTZXQpOiBDbGFzc1ByZXNldCB8IHVuZGVmaW5lZCB7XG4gIGlmICghbGFiZWwgfHwgIXNldD8uY2xhc3NlcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHNldC5tYXRjaE1vZGUgPT09ICdub3JtYWxpemVkJykge1xuICAgIGNvbnN0IG4gPSBub3JtYWxpemVMYWJlbChsYWJlbCk7XG4gICAgcmV0dXJuIHNldC5jbGFzc2VzLmZpbmQoKGMpID0+IG5vcm1hbGl6ZUxhYmVsKGMubmFtZSkgPT09IG4pO1xuICB9XG4gIHJldHVybiBzZXQuY2xhc3Nlcy5maW5kKChjKSA9PiBjLm5hbWUgPT09IGxhYmVsKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmlzdGljIGZhbGxiYWNrIGNvbG91ciBmb3IgYW4gdW5rbm93biBjbGFzcyBuYW1lOiBpbmRleCBpbnRvIHRoZSBwYWxldHRlIGJ5IGFcbiAqIHN0YWJsZSBoYXNoIG9mIHRoZSAobm9ybWFsaXplZCkgbmFtZTsgaWYgdGhlIHBhbGV0dGUgaXMgZW1wdHksIGdlbmVyYXRlIGEgZ29sZGVuLWFuZ2xlXG4gKiBIU0wgaHVlLiBTYW1lIG5hbWUgLT4gc2FtZSBjb2xvdXIsIGV2ZXJ5IHJ1bi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZhbGxiYWNrQ29sb3JGb3IobGFiZWw6IHN0cmluZywgcGFsZXR0ZTogc3RyaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBrZXkgPSBub3JtYWxpemVMYWJlbChsYWJlbCk7XG4gIGlmIChwYWxldHRlICYmIHBhbGV0dGUubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBwYWxldHRlW2hhc2hTdHJpbmcoa2V5KSAlIHBhbGV0dGUubGVuZ3RoXTtcbiAgfVxuICBjb25zdCBodWUgPSAoaGFzaFN0cmluZyhrZXkpICogMTM3LjUwOCkgJSAzNjA7XG4gIHJldHVybiBoc2xUb0hleChodWUsIDY1LCA1MCk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGNvbG91ciBmb3IgYGxhYmVsYDogYSBtYXRjaGluZyBwcmVzZXQncyBjb2xvdXIsIGVsc2UgdGhlIGNvbG91ciBhbiBpbXBvcnRlZCBmaWxlXG4gKiBnYXZlIHRoZSBjbGFzcywgZWxzZSB0aGUgZGV0ZXJtaW5pc3RpYyBmYWxsYmFjay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbG9yRm9yTGFiZWwobGFiZWw6IHN0cmluZywgc2V0OiBQcmVzZXRTZXQpOiBzdHJpbmcge1xuICBjb25zdCBwcmVzZXQgPSBmaW5kUHJlc2V0KGxhYmVsLCBzZXQpO1xuICBpZiAocHJlc2V0KSByZXR1cm4gcHJlc2V0LmNvbG9yO1xuICByZXR1cm4gc2V0LmltcG9ydGVkQ29sb3JzPy5bcHJlc2V0S2V5KHNldCwgbGFiZWwpXSA/PyBmYWxsYmFja0NvbG9yRm9yKGxhYmVsLCBzZXQuZmFsbGJhY2tQYWxldHRlKTtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBhcHBseVByZXNldENvbG9yc30uICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcGx5UHJlc2V0Q29sb3JzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUcnVlIGZvciBhIHJlZ2lvbiB0aGUgY2FsbGVyIG93bnMgb3V0cmlnaHQgKGZyZXNoLCBub3QgeWV0IHN0b3JlZCwgc28gaW4gbm9cbiAgICogdW5kbyBzbmFwc2hvdCk6IGl0cyBjb2xvdXIgaXMgc2V0IGluIHBsYWNlLiBFdmVyeSBvdGhlciByZWdpb24gd2hvc2VcbiAgICogY29sb3VyIGNoYW5nZXMgaXMgY29waWVkLiBEZWZhdWx0OiBuZXZlciBpbiBwbGFjZS5cbiAgICovXG4gIGluUGxhY2U/OiAocjogUmVnaW9uKSA9PiBib29sZWFuO1xuICAvKipcbiAgICogQ2FsbGVkIG9uY2UgcGVyIHVua25vd24gY2xhc3Mgd2hlbiBgc2V0LmF1dG9Qcm9tb3RlYCBpcyBvbiwgd2l0aCB0aGVcbiAgICogcHJlc2V0IHRvIGFkZCAobmFtZSB0cmltbWVkIGluIGBub3JtYWxpemVkYCBtYXRjaCBtb2RlLCBgc291cmNlOiAnYXV0bydgKS5cbiAgICovXG4gIG9uUHJvbW90ZT86IChwcmVzZXQ6IENsYXNzUHJlc2V0KSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFJlc29sdmUgZWFjaCBsYWJlbGxlZCByZWdpb24ncyBjb2xvdXIgZnJvbSB0aGUgcHJlc2V0IHNldCAoaml0LXVpIzcwKS4gVGhlXG4gKiBwcmVzZXRzIGFyZSB0aGUgc291cmNlIG9mIHRydXRoOiBhIG1hdGNoaW5nIHByZXNldCBnaXZlcyB0aGUgY2xhc3MgY29sb3VyLFxuICogYW4gdW5rbm93biBjbGFzcyB0aGUgY29sb3VyIGFuIGltcG9ydGVkIGZpbGUgZ2F2ZSBpdCAoYGltcG9ydGVkQ29sb3JzYCkgb3IgZWxzZVxuICogaXRzIGRldGVybWluaXN0aWMgZmFsbGJhY2ssICoqb3ZlcnJpZGluZyBhbnkgY29sb3VyIGFscmVhZHkgb24gdGhlIHJlZ2lvbioqLiBVbmxhYmVsbGVkIHJlZ2lvbnMgYW5kXG4gKiBvbmVzIHRoZSB1c2VyIHJlY29sb3VyZWQgKGBjb2xvck92ZXJyaWRkZW5gKSBhcmUgbGVmdCB1bnRvdWNoZWQuIFVua25vd25cbiAqIGNsYXNzZXMgYXJlIHJlcG9ydGVkIHRocm91Z2ggYG9uUHJvbW90ZWAgd2hlbiBgYXV0b1Byb21vdGVgIGlzIG9uLlxuICpcbiAqIFJldHVybnMgYSBuZXcgYXJyYXk7IHJlZ2lvbnMgd2hvc2UgY29sb3VyIGlzIGFscmVhZHkgcmlnaHQgYXJlIHRoZSBzYW1lXG4gKiBpbnN0YW5jZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseVByZXNldENvbG9ycyhcbiAgcmVnaW9uczogUmVnaW9uW10sXG4gIHNldDogUHJlc2V0U2V0LFxuICBvcHRzOiBBcHBseVByZXNldENvbG9yc09wdGlvbnMgPSB7fSxcbik6IFJlZ2lvbltdIHtcbiAgY29uc3Qga25vd24gPSBuZXcgU2V0KHNldC5jbGFzc2VzLm1hcCgoYykgPT4gcHJlc2V0S2V5KHNldCwgYy5uYW1lKSkpO1xuICByZXR1cm4gcmVnaW9ucy5tYXAoKHJlZ2lvbikgPT4ge1xuICAgIGlmICghcmVnaW9uLmxhYmVsIHx8IHJlZ2lvbi5jb2xvck92ZXJyaWRkZW4pIHJldHVybiByZWdpb247XG4gICAgY29uc3QgY29sb3IgPSBjb2xvckZvckxhYmVsKHJlZ2lvbi5sYWJlbCwgc2V0KTtcbiAgICBpZiAoc2V0LmF1dG9Qcm9tb3RlICYmICFrbm93bi5oYXMocHJlc2V0S2V5KHNldCwgcmVnaW9uLmxhYmVsKSkpIHtcbiAgICAgIGtub3duLmFkZChwcmVzZXRLZXkoc2V0LCByZWdpb24ubGFiZWwpKTtcbiAgICAgIC8vIEluIG5vcm1hbGl6ZWQgbW9kZSwgdHJpbSB0aGUgcHJvbW90ZWQgbmFtZSBzbyBsZWFkaW5nL3RyYWlsaW5nXG4gICAgICAvLyB3aGl0ZXNwYWNlIGRvZXNuJ3QgY3JlYXRlIGludmlzaWJsZSBkdXBsaWNhdGVzIG9yIG9kZCBkaXNwbGF5IG5hbWVzLlxuICAgICAgY29uc3QgbmFtZSA9IHNldC5tYXRjaE1vZGUgPT09ICdub3JtYWxpemVkJyA/IHJlZ2lvbi5sYWJlbC50cmltKCkgOiByZWdpb24ubGFiZWw7XG4gICAgICBvcHRzLm9uUHJvbW90ZT8uKHsgbmFtZSwgY29sb3IsIHNvdXJjZTogJ2F1dG8nIH0pO1xuICAgIH1cbiAgICBpZiAocmVnaW9uLmNvbG9yID09PSBjb2xvcikgcmV0dXJuIHJlZ2lvbjtcbiAgICBpZiAoIW9wdHMuaW5QbGFjZT8uKHJlZ2lvbikpIHJldHVybiB3aXRoUmVnaW9uUGF0Y2gocmVnaW9uLCB7IGNvbG9yIH0pO1xuICAgIHJlZ2lvbi5jb2xvciA9IGNvbG9yO1xuICAgIHJldHVybiByZWdpb247XG4gIH0pO1xufVxuIl19
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { MultiPolygon, Polygon, Rectangle } from '../models/region';
|
|
2
|
+
/**
|
|
3
|
+
* A fingerprint of each class's regions (by label): their ids and geometry folded into one number
|
|
4
|
+
* per class. Two sets give the same fingerprint for a class when its regions did not change, so
|
|
5
|
+
* comparing a slice's fingerprints before and after an edit names the classes the edit touched
|
|
6
|
+
* (a recoloured or relabelled region touches its old class and its new one). Profile lines and
|
|
7
|
+
* unlabelled regions are left out: they are in no class.
|
|
8
|
+
*/
|
|
9
|
+
export function classSignatures(regions) {
|
|
10
|
+
const out = new Map();
|
|
11
|
+
for (const r of regions) {
|
|
12
|
+
if (!r.label || r.isProfile?.())
|
|
13
|
+
continue;
|
|
14
|
+
out.set(r.label, mix(out.get(r.label) ?? 0, regionHash(r)));
|
|
15
|
+
}
|
|
16
|
+
return out;
|
|
17
|
+
}
|
|
18
|
+
/** The classes whose fingerprints differ between `before` and `after` (added and removed included). */
|
|
19
|
+
export function changedClasses(before, after) {
|
|
20
|
+
const out = new Set();
|
|
21
|
+
for (const [label, sig] of after)
|
|
22
|
+
if (before.get(label) !== sig)
|
|
23
|
+
out.add(label);
|
|
24
|
+
for (const label of before.keys())
|
|
25
|
+
if (!after.has(label))
|
|
26
|
+
out.add(label);
|
|
27
|
+
return out;
|
|
28
|
+
}
|
|
29
|
+
/** Order-independent within a class (summed), so reordering regions changes nothing. */
|
|
30
|
+
function mix(acc, h) {
|
|
31
|
+
return (acc + h) % 4294967296;
|
|
32
|
+
}
|
|
33
|
+
function regionHash(r) {
|
|
34
|
+
let h = hashString(String(r.id ?? ''));
|
|
35
|
+
const b = r.bounds;
|
|
36
|
+
if (b instanceof Rectangle)
|
|
37
|
+
return fold(fold(fold(fold(h, b.x), b.y), b.width), b.height);
|
|
38
|
+
const polygons = b instanceof MultiPolygon ? b.polygons : b instanceof Polygon ? [b] : [];
|
|
39
|
+
for (const p of polygons) {
|
|
40
|
+
h = fold(h, p.closed === false ? 1 : 2);
|
|
41
|
+
for (let i = 0; i < p.xpoints.length; i++)
|
|
42
|
+
h = fold(fold(h, p.xpoints[i]), p.ypoints[i]);
|
|
43
|
+
for (const hole of p.holes ?? [])
|
|
44
|
+
for (const [x, y] of hole)
|
|
45
|
+
h = fold(fold(h, x), y);
|
|
46
|
+
// A bézier region's curve moves with its handles, not only its anchors.
|
|
47
|
+
if (p.bezier)
|
|
48
|
+
for (const [dx, dy] of [...(p.handlesIn ?? []), ...(p.handlesOut ?? [])])
|
|
49
|
+
h = fold(fold(h, dx), dy);
|
|
50
|
+
}
|
|
51
|
+
return h;
|
|
52
|
+
}
|
|
53
|
+
/** FNV-style step over a coordinate (kept to 1/1000 px, which no edit is finer than). */
|
|
54
|
+
function fold(h, v) {
|
|
55
|
+
return Math.imul(h ^ (Math.round(v * 1000) | 0), 16777619) >>> 0;
|
|
56
|
+
}
|
|
57
|
+
function hashString(s) {
|
|
58
|
+
let h = 2166136261;
|
|
59
|
+
for (let i = 0; i < s.length; i++)
|
|
60
|
+
h = Math.imul(h ^ s.charCodeAt(i), 16777619) >>> 0;
|
|
61
|
+
return h;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Mtc2lnbmF0dXJlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvc3RvcmUvY2xhc3Mtc2lnbmF0dXJlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxrQkFBa0IsQ0FBQztBQUU1RTs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLE9BQTBCO0lBQ3hELE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO0lBQ3RDLEtBQUssTUFBTSxDQUFDLElBQUksT0FBTyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQUUsU0FBUztRQUMxQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCx1R0FBdUc7QUFDdkcsTUFBTSxVQUFVLGNBQWMsQ0FDNUIsTUFBbUMsRUFDbkMsS0FBa0M7SUFFbEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUM5QixLQUFLLE1BQU0sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLElBQUksS0FBSztRQUFFLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHO1lBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoRixLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUU7UUFBRSxJQUFJLENBQUMsS0FBSyxDQUFD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QUFFLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtRQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0RixPQUFPLENBQUMsQ0FBQztBQUNYLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNdWx0aVBvbHlnb24sIFBvbHlnb24sIFJlY3RhbmdsZSwgUmVnaW9uIH0gZnJvbSAnLi4vbW9kZWxzL3JlZ2lvbic7XG5cbi8qKlxuICogQSBmaW5nZXJwcmludCBvZiBlYWNoIGNsYXNzJ3MgcmVnaW9ucyAoYnkgbGFiZWwpOiB0aGVpciBpZHMgYW5kIGdlb21ldHJ5IGZvbGRlZCBpbnRvIG9uZSBudW1iZXJcbiAqIHBlciBjbGFzcy4gVHdvIHNldHMgZ2l2ZSB0aGUgc2FtZSBmaW5nZXJwcmludCBmb3IgYSBjbGFzcyB3aGVuIGl0cyByZWdpb25zIGRpZCBub3QgY2hhbmdlLCBzb1xuICogY29tcGFyaW5nIGEgc2xpY2UncyBmaW5nZXJwcmludHMgYmVmb3JlIGFuZCBhZnRlciBhbiBlZGl0IG5hbWVzIHRoZSBjbGFzc2VzIHRoZSBlZGl0IHRvdWNoZWRcbiAqIChhIHJlY29sb3VyZWQgb3IgcmVsYWJlbGxlZCByZWdpb24gdG91Y2hlcyBpdHMgb2xkIGNsYXNzIGFuZCBpdHMgbmV3IG9uZSkuIFByb2ZpbGUgbGluZXMgYW5kXG4gKiB1bmxhYmVsbGVkIHJlZ2lvbnMgYXJlIGxlZnQgb3V0OiB0aGV5IGFyZSBpbiBubyBjbGFzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzU2lnbmF0dXJlcyhyZWdpb25zOiByZWFkb25seSBSZWdpb25bXSk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICBjb25zdCBvdXQgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICBmb3IgKGNvbnN0IHIgb2YgcmVnaW9ucykge1xuICAgIGlmICghci5sYWJlbCB8fCByLmlzUHJvZmlsZT8uKCkpIGNvbnRpbnVlO1xuICAgIG91dC5zZXQoci5sYWJlbCwgbWl4KG91dC5nZXQoci5sYWJlbCkgPz8gMCwgcmVnaW9uSGFzaChyKSkpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBUaGUgY2xhc3NlcyB3aG9zZSBmaW5nZXJwcmludHMgZGlmZmVyIGJldHdlZW4gYGJlZm9yZWAgYW5kIGBhZnRlcmAgKGFkZGVkIGFuZCByZW1vdmVkIGluY2x1ZGVkKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGFuZ2VkQ2xhc3NlcyhcbiAgYmVmb3JlOiBSZWFkb25seU1hcDxzdHJpbmcsIG51bWJlcj4sXG4gIGFmdGVyOiBSZWFkb25seU1hcDxzdHJpbmcsIG51bWJlcj4sXG4pOiBTZXQ8c3RyaW5nPiB7XG4gIGNvbnN0IG91dCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IFtsYWJlbCwgc2lnXSBvZiBhZnRlcikgaWYgKGJlZm9yZS5nZXQobGFiZWwpICE9PSBzaWcpIG91dC5hZGQobGFiZWwpO1xuICBmb3IgKGNvbnN0IGxhYmVsIG9mIGJlZm9yZS5rZXlzKCkpIGlmICghYWZ0ZXIuaGFzKGxhYmVsKSkgb3V0LmFkZChsYWJlbCk7XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBPcmRlci1pbmRlcGVuZGVudCB3aXRoaW4gYSBjbGFzcyAoc3VtbWVkKSwgc28gcmVvcmRlcmluZyByZWdpb25zIGNoYW5nZXMgbm90aGluZy4gKi9cbmZ1bmN0aW9uIG1peChhY2M6IG51bWJlciwgaDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIChhY2MgKyBoKSAlIDQyOTQ5NjcyOTY7XG59XG5cbmZ1bmN0aW9uIHJlZ2lvbkhhc2gocjogUmVnaW9uKTogbnVtYmVyIHtcbiAgbGV0IGggPSBoYXNoU3RyaW5nKFN0cmluZyhyLmlkID8/ICcnKSk7XG4gIGNvbnN0IGIgPSByLmJvdW5kcztcbiAgaWYgKGIgaW5zdGFuY2VvZiBSZWN0YW5nbGUpIHJldHVybiBmb2xkKGZvbGQoZm9sZChmb2xkKGgsIGIueCksIGIueSksIGIud2lkdGgpLCBiLmhlaWdodCk7XG4gIGNvbnN0IHBvbHlnb25zID0gYiBpbnN0YW5jZW9mIE11bHRpUG9seWdvbiA/IGIucG9seWdvbnMgOiBiIGluc3RhbmNlb2YgUG9seWdvbiA/IFtiXSA6IFtdO1xuICBmb3IgKGNvbnN0IHAgb2YgcG9seWdvbnMpIHtcbiAgICBoID0gZm9sZChoLCBwLmNsb3NlZCA9PT0gZmFsc2UgPyAxIDogMik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwLnhwb2ludHMubGVuZ3RoOyBpKyspIGggPSBmb2xkKGZvbGQoaCwgcC54cG9pbnRzW2ldKSwgcC55cG9pbnRzW2ldKTtcbiAgICBmb3IgKGNvbnN0IGhvbGUgb2YgcC5ob2xlcyA/PyBbXSkgZm9yIChjb25zdCBbeCwgeV0gb2YgaG9sZSkgaCA9IGZvbGQoZm9sZChoLCB4KSwgeSk7XG4gICAgLy8gQSBiw6l6aWVyIHJlZ2lvbidzIGN1cnZlIG1vdmVzIHdpdGggaXRzIGhhbmRsZXMsIG5vdCBvbmx5IGl0cyBhbmNob3JzLlxuICAgIGlmIChwLmJlemllcilcbiAgICAgIGZvciAoY29uc3QgW2R4LCBkeV0gb2YgWy4uLihwLmhhbmRsZXNJbiA/PyBbXSksIC4uLihwLmhhbmRsZXNPdXQgPz8gW10pXSkgaCA9IGZvbGQoZm9sZChoLCBkeCksIGR5KTtcbiAgfVxuICByZXR1cm4gaDtcbn1cblxuLyoqIEZOVi1zdHlsZSBzdGVwIG92ZXIgYSBjb29yZGluYXRlIChrZXB0IHRvIDEvMTAwMCBweCwgd2hpY2ggbm8gZWRpdCBpcyBmaW5lciB0aGFuKS4gKi9cbmZ1bmN0aW9uIGZvbGQoaDogbnVtYmVyLCB2OiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5pbXVsKGggXiAoTWF0aC5yb3VuZCh2ICogMTAwMCkgfCAwKSwgMTY3Nzc2MTkpID4+PiAwO1xufVxuXG5mdW5jdGlvbiBoYXNoU3RyaW5nKHM6IHN0cmluZyk6IG51bWJlciB7XG4gIGxldCBoID0gMjE2NjEzNjI2MTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSBoID0gTWF0aC5pbXVsKGggXiBzLmNoYXJDb2RlQXQoaSksIDE2Nzc3NjE5KSA+Pj4gMDtcbiAgcmV0dXJuIGg7XG59XG4iXX0=
|
|
@@ -29,6 +29,10 @@ export class RegionScopeCache {
|
|
|
29
29
|
}
|
|
30
30
|
return imageInfo.fileName || undefined;
|
|
31
31
|
}
|
|
32
|
+
/** The active image's cache key (see {@link imageKey}). */
|
|
33
|
+
get activeImage() {
|
|
34
|
+
return this.imageKey;
|
|
35
|
+
}
|
|
32
36
|
/** True while a z-stack is loaded and regions are held per slice. */
|
|
33
37
|
get stackMode() {
|
|
34
38
|
return this.stack;
|
|
@@ -137,4 +141,4 @@ export class RegionScopeCache {
|
|
|
137
141
|
return out;
|
|
138
142
|
}
|
|
139
143
|
}
|
|
140
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLXNjb3BlLWNhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zdG9yZS9yZWdpb24tc2NvcGUtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBT3JEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sT0FBTyxnQkFBZ0I7SUFBN0I7UUFDVSxZQUFPLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUM7UUFHdEMsWUFBTyxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO1FBQ3RDLFVBQUssR0FBRyxLQUFLLENBQUM7UUFDZCxXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsV0FBTSxHQUFvQixVQUFVLENBQUM7UUFDN0M7NkVBQ3FFO1FBQzdELG9CQUFlLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQXVIOUMsQ0FBQztJQXJIQyxxRUFBcUU7SUFDckUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFpQztRQUMvQyxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQ2pDLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JFLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUMsUUFBUSxJQUFJLFNBQVMsQ0FBQztJQUN6QyxDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsK0VBQStFO0lBQy9FLElBQUksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQsc0VBQXNF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QztRQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sRUFBRSxHQUFHLElBQUksR0FBRyxDQUFTLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNqRCxLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU87WUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNO2dCQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakUsS0FBSyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JELEdBQUcsQ0FBQyxHQUFHLENBQ0wsQ0FBQyxFQUNELENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQzFELENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJSW1hZ2VJbmZvIH0gZnJvbSAnLi4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IFJlZ2lvbiB9IGZyb20gJy4uL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHsgd2l0aFJlZ2lvblogfSBmcm9tICcuLi9tb2RlbHMvcmVnaW9uLWNsb25lJztcblxuLyoqIEhvdyBhIHN0YWNrJ3MgcmVnaW9ucyByb3VuZC10cmlwIHRvIGRpc2sgKGppdC11aSM5Myk6IGBjb21iaW5lZGAgd3JpdGVzIG9uZVxuICogIHotaW5kZXhlZCBnZW9qc29uIChzaW5nbGUtZmlsZSB6LXN0YWNrLCBRdVBhdGggc2NoZW1hKTsgYHBlci1zbGljZS1maWxlYFxuICogIHdyaXRlcyBvbmUgZ2VvanNvbiBwZXIgc2xpY2UtZmlsZSAoYSBmb2xkZXIgb2YgbnVtYmVyZWQgaW1hZ2VzKS4gKi9cbmV4cG9ydCB0eXBlIFN0YWNrU2F2ZUxheW91dCA9ICdjb21iaW5lZCcgfCAncGVyLXNsaWNlLWZpbGUnO1xuXG4vKipcbiAqIFdoZXJlIHRoZSByZWdpb24gc3RvcmUncyAqbGl2ZSogc2V0IGNvbWVzIGZyb20gYW5kIGdvZXMgYmFjayB0bzogYSBwZXItaW1hZ2VcbiAqIGNhY2hlIChrZXllZCBieSB0aGUgaW1hZ2UncyBmaXJzdCBVUkwsIGVsc2UgaXRzIGZpbGUgbmFtZSkgYW5kLCB3aGlsZSBhXG4gKiB6LXN0YWNrIGlzIGxvYWRlZCwgYSBwZXItc2xpY2UgbWFwIGZvciB0aGUgY3VycmVudCBpbWFnZSAoaml0LXVpIzkzKS5cbiAqXG4gKiBUaGUgb3duZXIgaG9sZHMgdGhlIGxpdmUgYXJyYXk7IGV2ZXJ5IG1ldGhvZCB0aGF0IGNhbiBjaGFuZ2Ugc2NvcGUgdGFrZXNcbiAqIHRoZSBjdXJyZW50IGxpdmUgYXJyYXkgKHRvIGNhcHR1cmUgaXRzIGVkaXRzKSBhbmQgcmV0dXJucyB0aGUgaW5jb21pbmdcbiAqIGxpdmUgc2V0LCBvciBudWxsIHdoZW4gbm90aGluZyBjaGFuZ2VzLiBJdCBuZXZlciBjaGFuZ2VzIGEgcmVnaW9uOiBzbGljZVxuICogdGFncyBhcmUgYXBwbGllZCB0byBjb3BpZXMgKHtAbGluayB3aXRoUmVnaW9uWn0pLlxuICovXG5leHBvcnQgY2xhc3MgUmVnaW9uU2NvcGVDYWNoZSB7XG4gIHByaXZhdGUgYnlJbWFnZSA9IG5ldyBNYXA8c3RyaW5nLCBSZWdpb25bXT4oKTtcbiAgcHJpdmF0ZSBpbWFnZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgYnlTbGljZSA9IG5ldyBNYXA8bnVtYmVyLCBSZWdpb25bXT4oKTtcbiAgcHJpdmF0ZSBzdGFjayA9IGZhbHNlO1xuICBwcml2YXRlIHNsaWNlWiA9IDA7XG4gIHByaXZhdGUgbGF5b3V0OiBTdGFja1NhdmVMYXlvdXQgPSAnY29tYmluZWQnO1xuICAvKiogU2xpY2VzIGxvYWRlZCB3aXRoIHJlZ2lvbnM6IGEgcGVyLXNsaWNlLWZpbGUgc2F2ZSByZS13cml0ZXMgdGhlbSBldmVuIHdoZW5cbiAgICogIG5vdyBlbXB0eSwgc28gY2xlYXJpbmcgYSBzbGljZSBhbmQgc2F2aW5nIHJlbW92ZXMgaXRzIGdlb2pzb24uICovXG4gIHByaXZhdGUgaW5pdGlhbE5vbkVtcHR5ID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgLyoqIFRoZSBjYWNoZSBrZXkgZm9yIGFuIGltYWdlOiBpdHMgZmlyc3QgVVJMLCBlbHNlIGl0cyBmaWxlIG5hbWUuICovXG4gIHN0YXRpYyBpbWFnZUtleShpbWFnZUluZm86IElJbWFnZUluZm8gfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghaW1hZ2VJbmZvKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChpbWFnZUluZm8udXJscyAmJiBpbWFnZUluZm8udXJscy5sZW5ndGggPiAwICYmIGltYWdlSW5mby51cmxzWzBdKSB7XG4gICAgICByZXR1cm4gaW1hZ2VJbmZvLnVybHNbMF07XG4gICAgfVxuICAgIHJldHVybiBpbWFnZUluZm8uZmlsZU5hbWUgfHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFRydWUgd2hpbGUgYSB6LXN0YWNrIGlzIGxvYWRlZCBhbmQgcmVnaW9ucyBhcmUgaGVsZCBwZXIgc2xpY2UuICovXG4gIGdldCBzdGFja01vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RhY2s7XG4gIH1cblxuICAvKiogVGhlIGN1cnJlbnQgZGlzcGxheSBzbGljZSAoemVyby1iYXNlZDsgMCBvdXRzaWRlIHN0YWNrIG1vZGUgdW5sZXNzIHNldCkuICovXG4gIGdldCBkaXNwbGF5U2xpY2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5zbGljZVo7XG4gIH1cblxuICAvKiogSG93IHRoZSBjdXJyZW50IHN0YWNrIHBlcnNpc3RzOyBtZWFuaW5nbGVzcyBvdXRzaWRlIHN0YWNrIG1vZGUuICovXG4gIGdldCBzYXZlTGF5b3V0KCk6IFN0YWNrU2F2ZUxheW91dCB7XG4gICAgcmV0dXJuIHRoaXMubGF5b3V0O1xuICB9XG5cbiAgLyoqIFJlY29yZCBgbGl2ZWAgYXMgdGhlIGN1cnJlbnQgaW1hZ2UncyByZWdpb25zLiAqL1xuICBzeW5jKGxpdmU6IFJlZ2lvbltdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaW1hZ2VLZXkpIHRoaXMuYnlJbWFnZS5zZXQodGhpcy5pbWFnZUtleSwgbGl2ZS5zbGljZSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIGBrZXlgIHRoZSBhY3RpdmUgaW1hZ2U6IGVuZHMgc3RhY2sgbW9kZSwgY2FjaGVzIGBsaXZlYCB1bmRlciB0aGVcbiAgICogb3V0Z29pbmcgaW1hZ2UsIGFuZCByZXR1cm5zIHRoZSBpbmNvbWluZyBpbWFnZSdzIHJlZ2lvbnMgKG9yIFtdKS4gTnVsbCB3aGVuXG4gICAqIGBrZXlgIGFscmVhZHkgaXMgdGhlIGFjdGl2ZSBpbWFnZSAocmVwZWF0ZWQgcmVwbG90cyBrZWVwIHRoZWlyIHJlZ2lvbnMpLlxuICAgKi9cbiAgc3dpdGNoSW1hZ2Uoa2V5OiBzdHJpbmcgfCB1bmRlZmluZWQsIGxpdmU6IFJlZ2lvbltdKTogUmVnaW9uW10gfCBudWxsIHtcbiAgICBpZiAodGhpcy5pbWFnZUtleSA9PT0ga2V5KSByZXR1cm4gbnVsbDtcbiAgICAvLyBUaGUgbG9hZGVyIHJlLWVudGVycyBzdGFjayBtb2RlIGFmdGVyd2FyZHMgaWYgdGhlIG5ldyBpbWFnZSBpcyBhIHotc3RhY2suXG4gICAgdGhpcy5leGl0U3RhY2soKTtcbiAgICBpZiAodGhpcy5pbWFnZUtleSkgdGhpcy5ieUltYWdlLnNldCh0aGlzLmltYWdlS2V5LCBsaXZlLnNsaWNlKCkpO1xuICAgIHRoaXMuaW1hZ2VLZXkgPSBrZXk7XG4gICAgY29uc3QgY2FjaGVkID0ga2V5ID8gdGhpcy5ieUltYWdlLmdldChrZXkpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiBjYWNoZWQgPyBjYWNoZWQuc2xpY2UoKSA6IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEVudGVyIHBlci1zbGljZSBtb2RlIHdpdGggYHNsaWNlc2AgKGFscmVhZHkgYWRtaXR0ZWQgYnkgdGhlIHN0b3JlLCBlYWNoXG4gICAqIHJlZ2lvbiB0YWdnZWQgd2l0aCBpdHMgc2xpY2UpIGFuZCByZXR1cm4gYGluaXRpYWxaYCdzIHNsaWNlIGFzIHRoZSBsaXZlIHNldC5cbiAgICovXG4gIGVudGVyU3RhY2soc2xpY2VzOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4sIGluaXRpYWxaOiBudW1iZXIsIGxheW91dDogU3RhY2tTYXZlTGF5b3V0KTogUmVnaW9uW10ge1xuICAgIHRoaXMuc3RhY2sgPSB0cnVlO1xuICAgIHRoaXMubGF5b3V0ID0gbGF5b3V0O1xuICAgIHRoaXMuc2xpY2VaID0gaW5pdGlhbFogfHwgMDtcbiAgICB0aGlzLmJ5U2xpY2UgPSBuZXcgTWFwPG51bWJlciwgUmVnaW9uW10+KCk7XG4gICAgdGhpcy5pbml0aWFsTm9uRW1wdHkgPSBuZXcgU2V0PG51bWJlcj4oKTtcbiAgICBmb3IgKGNvbnN0IFt6LCByZWdzXSBvZiBzbGljZXMpIHtcbiAgICAgIHRoaXMuYnlTbGljZS5zZXQoeiwgcmVncyk7XG4gICAgICBpZiAocmVncy5sZW5ndGgpIHRoaXMuaW5pdGlhbE5vbkVtcHR5LmFkZCh6KTtcbiAgICB9XG4gICAgcmV0dXJuICh0aGlzLmJ5U2xpY2UuZ2V0KHRoaXMuc2xpY2VaKSA/PyBbXSkuc2xpY2UoKTtcbiAgfVxuXG4gIC8qKiBMZWF2ZSBzdGFjayBtb2RlOyBhIG5vLW9wIG91dHNpZGUgaXQuICovXG4gIGV4aXRTdGFjaygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3RhY2spIHJldHVybjtcbiAgICB0aGlzLnN0YWNrID0gZmFsc2U7XG4gICAgdGhpcy5zbGljZVogPSAwO1xuICAgIHRoaXMuYnlTbGljZSA9IG5ldyBNYXA8bnVtYmVyLCBSZWdpb25bXT4oKTtcbiAgICB0aGlzLmluaXRpYWxOb25FbXB0eSA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNob3cgc2xpY2UgYHpgOiBjYXB0dXJlIGBsaXZlYCBpbnRvIHRoZSBjdXJyZW50IHNsaWNlIGFuZCByZXR1cm4gc2xpY2VcbiAgICogYHpgJ3MgcmVnaW9ucy4gTnVsbCB3aGVuIG5vdGhpbmcgc3dhcHMg4oCUIHRoZSBzYW1lIHNsaWNlLCBvciBvdXRzaWRlIHN0YWNrXG4gICAqIG1vZGUgKHdoZXJlIHRoZSBpbmRleCBpcyBvbmx5IHJlY29yZGVkKS5cbiAgICovXG4gIHNob3dTbGljZSh6OiBudW1iZXIsIGxpdmU6IFJlZ2lvbltdKTogUmVnaW9uW10gfCBudWxsIHtcbiAgICBjb25zdCBuZXh0ID0geiB8fCAwO1xuICAgIGlmICghdGhpcy5zdGFjaykge1xuICAgICAgdGhpcy5zbGljZVogPSBuZXh0O1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLnNsaWNlWiA9PT0gbmV4dCkgcmV0dXJuIG51bGw7XG4gICAgdGhpcy5ieVNsaWNlLnNldCh0aGlzLnNsaWNlWiwgbGl2ZS5zbGljZSgpKTtcbiAgICB0aGlzLnNsaWNlWiA9IG5leHQ7XG4gICAgcmV0dXJuICh0aGlzLmJ5U2xpY2UuZ2V0KG5leHQpID8/IFtdKS5zbGljZSgpO1xuICB9XG5cbiAgLyoqIEV2ZXJ5IHNsaWNlJ3MgcmVnaW9ucyAoY3VycmVudCBvbmUgZnJvbSBgbGl2ZWApLCBlYWNoIHRhZ2dlZCB3aXRoIGl0cyB6LFxuICAgKiAgaW4gc2xpY2Ugb3JkZXI7IGBsaXZlYCBpdHNlbGYgb3V0c2lkZSBzdGFjayBtb2RlLiAqL1xuICBzbGljZVJlZ2lvbnMobGl2ZTogUmVnaW9uW10pOiBSZWdpb25bXSB7XG4gICAgaWYgKCF0aGlzLnN0YWNrKSByZXR1cm4gbGl2ZS5zbGljZSgpO1xuICAgIHRoaXMuYnlTbGljZS5zZXQodGhpcy5zbGljZVosIGxpdmUuc2xpY2UoKSk7XG4gICAgY29uc3Qgb3V0OiBSZWdpb25bXSA9IFtdO1xuICAgIGNvbnN0IHpzID0gQXJyYXkuZnJvbSh0aGlzLmJ5U2xpY2Uua2V5cygpKS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gICAgZm9yIChjb25zdCB6IG9mIHpzKSB7XG4gICAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5ieVNsaWNlLmdldCh6KSBhcyBSZWdpb25bXSkgb3V0LnB1c2god2l0aFJlZ2lvbloociwgeikpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqIFNsaWNlcyB0byB3cml0ZSBvbiBhIHBlci1zbGljZS1maWxlIHNhdmU6IGV2ZXJ5IHNsaWNlIHdpdGggcmVnaW9ucyBwbHVzXG4gICAqICBldmVyeSBzbGljZSBsb2FkZWQgbm9uLWVtcHR5IChyZS13cml0dGVuIGVtcHR5IHdoZW4gY2xlYXJlZCkuIEVtcHR5XG4gICAqICBvdXRzaWRlIHN0YWNrIG1vZGUuICovXG4gIHN0YWNrU2F2ZVNsaWNlcyhsaXZlOiBSZWdpb25bXSk6IE1hcDxudW1iZXIsIFJlZ2lvbltdPiB7XG4gICAgY29uc3Qgb3V0ID0gbmV3IE1hcDxudW1iZXIsIFJlZ2lvbltdPigpO1xuICAgIGlmICghdGhpcy5zdGFjaykgcmV0dXJuIG91dDtcbiAgICB0aGlzLmJ5U2xpY2Uuc2V0KHRoaXMuc2xpY2VaLCBsaXZlLnNsaWNlKCkpO1xuICAgIGNvbnN0IHpzID0gbmV3IFNldDxudW1iZXI+KHRoaXMuaW5pdGlhbE5vbkVtcHR5KTtcbiAgICBmb3IgKGNvbnN0IFt6LCByZWdzXSBvZiB0aGlzLmJ5U2xpY2UpIGlmIChyZWdzLmxlbmd0aCkgenMuYWRkKHopO1xuICAgIGZvciAoY29uc3QgeiBvZiBBcnJheS5mcm9tKHpzKS5zb3J0KChhLCBiKSA9PiBhIC0gYikpIHtcbiAgICAgIG91dC5zZXQoXG4gICAgICAgIHosXG4gICAgICAgICh0aGlzLmJ5U2xpY2UuZ2V0KHopID8/IFtdKS5tYXAoKHIpID0+IHdpdGhSZWdpb25aKHIsIHopKSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cbn1cbiJdfQ==
|
|
144
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaW9uLXNjb3BlLWNhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9zdG9yZS9yZWdpb24tc2NvcGUtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBT3JEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sT0FBTyxnQkFBZ0I7SUFBN0I7UUFDVSxZQUFPLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUM7UUFHdEMsWUFBTyxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO1FBQ3RDLFVBQUssR0FBRyxLQUFLLENBQUM7UUFDZCxXQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsV0FBTSxHQUFvQixVQUFVLENBQUM7UUFDN0M7NkVBQ3FFO1FBQzdELG9CQUFlLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQTRIOUMsQ0FBQztJQTFIQyxxRUFBcUU7SUFDckUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFpQztRQUMvQyxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQ2pDLElBQUksU0FBUyxDQUFDLElBQUksSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JFLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUMsUUFBUSxJQUFJLFNBQVMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsMkRBQTJEO0lBQzNELElBQUksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQsK0VBQStF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QUFJLEdBQUcsRUFBb0IsQ0FBQztRQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLEdBQUcsQ0FBQztRQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sRUFBRSxHQUFHLElBQUksR0FBRyxDQUFTLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNqRCxLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU87WUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNO2dCQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakUsS0FBSyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JELEdBQUcsQ0FBQyxHQUFHLENBQ0wsQ0FBQyxFQUNELENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQzFELENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJSW1hZ2VJbmZvIH0gZnJvbSAnLi4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IFJlZ2lvbiB9IGZyb20gJy4uL21vZGVscy9yZWdpb24nO1xuaW1wb3J0IHsgd2l0aFJlZ2lvblogfSBmcm9tICcuLi9tb2RlbHMvcmVnaW9uLWNsb25lJztcblxuLyoqIEhvdyBhIHN0YWNrJ3MgcmVnaW9ucyByb3VuZC10cmlwIHRvIGRpc2sgKGppdC11aSM5Myk6IGBjb21iaW5lZGAgd3JpdGVzIG9uZVxuICogIHotaW5kZXhlZCBnZW9qc29uIChzaW5nbGUtZmlsZSB6LXN0YWNrLCBRdVBhdGggc2NoZW1hKTsgYHBlci1zbGljZS1maWxlYFxuICogIHdyaXRlcyBvbmUgZ2VvanNvbiBwZXIgc2xpY2UtZmlsZSAoYSBmb2xkZXIgb2YgbnVtYmVyZWQgaW1hZ2VzKS4gKi9cbmV4cG9ydCB0eXBlIFN0YWNrU2F2ZUxheW91dCA9ICdjb21iaW5lZCcgfCAncGVyLXNsaWNlLWZpbGUnO1xuXG4vKipcbiAqIFdoZXJlIHRoZSByZWdpb24gc3RvcmUncyAqbGl2ZSogc2V0IGNvbWVzIGZyb20gYW5kIGdvZXMgYmFjayB0bzogYSBwZXItaW1hZ2VcbiAqIGNhY2hlIChrZXllZCBieSB0aGUgaW1hZ2UncyBmaXJzdCBVUkwsIGVsc2UgaXRzIGZpbGUgbmFtZSkgYW5kLCB3aGlsZSBhXG4gKiB6LXN0YWNrIGlzIGxvYWRlZCwgYSBwZXItc2xpY2UgbWFwIGZvciB0aGUgY3VycmVudCBpbWFnZSAoaml0LXVpIzkzKS5cbiAqXG4gKiBUaGUgb3duZXIgaG9sZHMgdGhlIGxpdmUgYXJyYXk7IGV2ZXJ5IG1ldGhvZCB0aGF0IGNhbiBjaGFuZ2Ugc2NvcGUgdGFrZXNcbiAqIHRoZSBjdXJyZW50IGxpdmUgYXJyYXkgKHRvIGNhcHR1cmUgaXRzIGVkaXRzKSBhbmQgcmV0dXJucyB0aGUgaW5jb21pbmdcbiAqIGxpdmUgc2V0LCBvciBudWxsIHdoZW4gbm90aGluZyBjaGFuZ2VzLiBJdCBuZXZlciBjaGFuZ2VzIGEgcmVnaW9uOiBzbGljZVxuICogdGFncyBhcmUgYXBwbGllZCB0byBjb3BpZXMgKHtAbGluayB3aXRoUmVnaW9uWn0pLlxuICovXG5leHBvcnQgY2xhc3MgUmVnaW9uU2NvcGVDYWNoZSB7XG4gIHByaXZhdGUgYnlJbWFnZSA9IG5ldyBNYXA8c3RyaW5nLCBSZWdpb25bXT4oKTtcbiAgcHJpdmF0ZSBpbWFnZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgYnlTbGljZSA9IG5ldyBNYXA8bnVtYmVyLCBSZWdpb25bXT4oKTtcbiAgcHJpdmF0ZSBzdGFjayA9IGZhbHNlO1xuICBwcml2YXRlIHNsaWNlWiA9IDA7XG4gIHByaXZhdGUgbGF5b3V0OiBTdGFja1NhdmVMYXlvdXQgPSAnY29tYmluZWQnO1xuICAvKiogU2xpY2VzIGxvYWRlZCB3aXRoIHJlZ2lvbnM6IGEgcGVyLXNsaWNlLWZpbGUgc2F2ZSByZS13cml0ZXMgdGhlbSBldmVuIHdoZW5cbiAgICogIG5vdyBlbXB0eSwgc28gY2xlYXJpbmcgYSBzbGljZSBhbmQgc2F2aW5nIHJlbW92ZXMgaXRzIGdlb2pzb24uICovXG4gIHByaXZhdGUgaW5pdGlhbE5vbkVtcHR5ID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgLyoqIFRoZSBjYWNoZSBrZXkgZm9yIGFuIGltYWdlOiBpdHMgZmlyc3QgVVJMLCBlbHNlIGl0cyBmaWxlIG5hbWUuICovXG4gIHN0YXRpYyBpbWFnZUtleShpbWFnZUluZm86IElJbWFnZUluZm8gfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghaW1hZ2VJbmZvKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChpbWFnZUluZm8udXJscyAmJiBpbWFnZUluZm8udXJscy5sZW5ndGggPiAwICYmIGltYWdlSW5mby51cmxzWzBdKSB7XG4gICAgICByZXR1cm4gaW1hZ2VJbmZvLnVybHNbMF07XG4gICAgfVxuICAgIHJldHVybiBpbWFnZUluZm8uZmlsZU5hbWUgfHwgdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFRoZSBhY3RpdmUgaW1hZ2UncyBjYWNoZSBrZXkgKHNlZSB7QGxpbmsgaW1hZ2VLZXl9KS4gKi9cbiAgZ2V0IGFjdGl2ZUltYWdlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuaW1hZ2VLZXk7XG4gIH1cblxuICAvKiogVHJ1ZSB3aGlsZSBhIHotc3RhY2sgaXMgbG9hZGVkIGFuZCByZWdpb25zIGFyZSBoZWxkIHBlciBzbGljZS4gKi9cbiAgZ2V0IHN0YWNrTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGFjaztcbiAgfVxuXG4gIC8qKiBUaGUgY3VycmVudCBkaXNwbGF5IHNsaWNlICh6ZXJvLWJhc2VkOyAwIG91dHNpZGUgc3RhY2sgbW9kZSB1bmxlc3Mgc2V0KS4gKi9cbiAgZ2V0IGRpc3BsYXlTbGljZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNsaWNlWjtcbiAgfVxuXG4gIC8qKiBIb3cgdGhlIGN1cnJlbnQgc3RhY2sgcGVyc2lzdHM7IG1lYW5pbmdsZXNzIG91dHNpZGUgc3RhY2sgbW9kZS4gKi9cbiAgZ2V0IHNhdmVMYXlvdXQoKTogU3RhY2tTYXZlTGF5b3V0IHtcbiAgICByZXR1cm4gdGhpcy5sYXlvdXQ7XG4gIH1cblxuICAvKiogUmVjb3JkIGBsaXZlYCBhcyB0aGUgY3VycmVudCBpbWFnZSdzIHJlZ2lvbnMuICovXG4gIHN5bmMobGl2ZTogUmVnaW9uW10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pbWFnZUtleSkgdGhpcy5ieUltYWdlLnNldCh0aGlzLmltYWdlS2V5LCBsaXZlLnNsaWNlKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYGtleWAgdGhlIGFjdGl2ZSBpbWFnZTogZW5kcyBzdGFjayBtb2RlLCBjYWNoZXMgYGxpdmVgIHVuZGVyIHRoZVxuICAgKiBvdXRnb2luZyBpbWFnZSwgYW5kIHJldHVybnMgdGhlIGluY29taW5nIGltYWdlJ3MgcmVnaW9ucyAob3IgW10pLiBOdWxsIHdoZW5cbiAgICogYGtleWAgYWxyZWFkeSBpcyB0aGUgYWN0aXZlIGltYWdlIChyZXBlYXRlZCByZXBsb3RzIGtlZXAgdGhlaXIgcmVnaW9ucykuXG4gICAqL1xuICBzd2l0Y2hJbWFnZShrZXk6IHN0cmluZyB8IHVuZGVmaW5lZCwgbGl2ZTogUmVnaW9uW10pOiBSZWdpb25bXSB8IG51bGwge1xuICAgIGlmICh0aGlzLmltYWdlS2V5ID09PSBrZXkpIHJldHVybiBudWxsO1xuICAgIC8vIFRoZSBsb2FkZXIgcmUtZW50ZXJzIHN0YWNrIG1vZGUgYWZ0ZXJ3YXJkcyBpZiB0aGUgbmV3IGltYWdlIGlzIGEgei1zdGFjay5cbiAgICB0aGlzLmV4aXRTdGFjaygpO1xuICAgIGlmICh0aGlzLmltYWdlS2V5KSB0aGlzLmJ5SW1hZ2Uuc2V0KHRoaXMuaW1hZ2VLZXksIGxpdmUuc2xpY2UoKSk7XG4gICAgdGhpcy5pbWFnZUtleSA9IGtleTtcbiAgICBjb25zdCBjYWNoZWQgPSBrZXkgPyB0aGlzLmJ5SW1hZ2UuZ2V0KGtleSkgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGNhY2hlZCA/IGNhY2hlZC5zbGljZSgpIDogW107XG4gIH1cblxuICAvKipcbiAgICogRW50ZXIgcGVyLXNsaWNlIG1vZGUgd2l0aCBgc2xpY2VzYCAoYWxyZWFkeSBhZG1pdHRlZCBieSB0aGUgc3RvcmUsIGVhY2hcbiAgICogcmVnaW9uIHRhZ2dlZCB3aXRoIGl0cyBzbGljZSkgYW5kIHJldHVybiBgaW5pdGlhbFpgJ3Mgc2xpY2UgYXMgdGhlIGxpdmUgc2V0LlxuICAgKi9cbiAgZW50ZXJTdGFjayhzbGljZXM6IE1hcDxudW1iZXIsIFJlZ2lvbltdPiwgaW5pdGlhbFo6IG51bWJlciwgbGF5b3V0OiBTdGFja1NhdmVMYXlvdXQpOiBSZWdpb25bXSB7XG4gICAgdGhpcy5zdGFjayA9IHRydWU7XG4gICAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7XG4gICAgdGhpcy5zbGljZVogPSBpbml0aWFsWiB8fCAwO1xuICAgIHRoaXMuYnlTbGljZSA9IG5ldyBNYXA8bnVtYmVyLCBSZWdpb25bXT4oKTtcbiAgICB0aGlzLmluaXRpYWxOb25FbXB0eSA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgIGZvciAoY29uc3QgW3osIHJlZ3NdIG9mIHNsaWNlcykge1xuICAgICAgdGhpcy5ieVNsaWNlLnNldCh6LCByZWdzKTtcbiAgICAgIGlmIChyZWdzLmxlbmd0aCkgdGhpcy5pbml0aWFsTm9uRW1wdHkuYWRkKHopO1xuICAgIH1cbiAgICByZXR1cm4gKHRoaXMuYnlTbGljZS5nZXQodGhpcy5zbGljZVopID8/IFtdKS5zbGljZSgpO1xuICB9XG5cbiAgLyoqIExlYXZlIHN0YWNrIG1vZGU7IGEgbm8tb3Agb3V0c2lkZSBpdC4gKi9cbiAgZXhpdFN0YWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdGFjaykgcmV0dXJuO1xuICAgIHRoaXMuc3RhY2sgPSBmYWxzZTtcbiAgICB0aGlzLnNsaWNlWiA9IDA7XG4gICAgdGhpcy5ieVNsaWNlID0gbmV3IE1hcDxudW1iZXIsIFJlZ2lvbltdPigpO1xuICAgIHRoaXMuaW5pdGlhbE5vbkVtcHR5ID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIH1cblxuICAvKipcbiAgICogU2hvdyBzbGljZSBgemA6IGNhcHR1cmUgYGxpdmVgIGludG8gdGhlIGN1cnJlbnQgc2xpY2UgYW5kIHJldHVybiBzbGljZVxuICAgKiBgemAncyByZWdpb25zLiBOdWxsIHdoZW4gbm90aGluZyBzd2FwcyDigJQgdGhlIHNhbWUgc2xpY2UsIG9yIG91dHNpZGUgc3RhY2tcbiAgICogbW9kZSAod2hlcmUgdGhlIGluZGV4IGlzIG9ubHkgcmVjb3JkZWQpLlxuICAgKi9cbiAgc2hvd1NsaWNlKHo6IG51bWJlciwgbGl2ZTogUmVnaW9uW10pOiBSZWdpb25bXSB8IG51bGwge1xuICAgIGNvbnN0IG5leHQgPSB6IHx8IDA7XG4gICAgaWYgKCF0aGlzLnN0YWNrKSB7XG4gICAgICB0aGlzLnNsaWNlWiA9IG5leHQ7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuc2xpY2VaID09PSBuZXh0KSByZXR1cm4gbnVsbDtcbiAgICB0aGlzLmJ5U2xpY2Uuc2V0KHRoaXMuc2xpY2VaLCBsaXZlLnNsaWNlKCkpO1xuICAgIHRoaXMuc2xpY2VaID0gbmV4dDtcbiAgICByZXR1cm4gKHRoaXMuYnlTbGljZS5nZXQobmV4dCkgPz8gW10pLnNsaWNlKCk7XG4gIH1cblxuICAvKiogRXZlcnkgc2xpY2UncyByZWdpb25zIChjdXJyZW50IG9uZSBmcm9tIGBsaXZlYCksIGVhY2ggdGFnZ2VkIHdpdGggaXRzIHosXG4gICAqICBpbiBzbGljZSBvcmRlcjsgYGxpdmVgIGl0c2VsZiBvdXRzaWRlIHN0YWNrIG1vZGUuICovXG4gIHNsaWNlUmVnaW9ucyhsaXZlOiBSZWdpb25bXSk6IFJlZ2lvbltdIHtcbiAgICBpZiAoIXRoaXMuc3RhY2spIHJldHVybiBsaXZlLnNsaWNlKCk7XG4gICAgdGhpcy5ieVNsaWNlLnNldCh0aGlzLnNsaWNlWiwgbGl2ZS5zbGljZSgpKTtcbiAgICBjb25zdCBvdXQ6IFJlZ2lvbltdID0gW107XG4gICAgY29uc3QgenMgPSBBcnJheS5mcm9tKHRoaXMuYnlTbGljZS5rZXlzKCkpLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICBmb3IgKGNvbnN0IHogb2YgenMpIHtcbiAgICAgIGZvciAoY29uc3QgciBvZiB0aGlzLmJ5U2xpY2UuZ2V0KHopIGFzIFJlZ2lvbltdKSBvdXQucHVzaCh3aXRoUmVnaW9uWihyLCB6KSk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKiogU2xpY2VzIHRvIHdyaXRlIG9uIGEgcGVyLXNsaWNlLWZpbGUgc2F2ZTogZXZlcnkgc2xpY2Ugd2l0aCByZWdpb25zIHBsdXNcbiAgICogIGV2ZXJ5IHNsaWNlIGxvYWRlZCBub24tZW1wdHkgKHJlLXdyaXR0ZW4gZW1wdHkgd2hlbiBjbGVhcmVkKS4gRW1wdHlcbiAgICogIG91dHNpZGUgc3RhY2sgbW9kZS4gKi9cbiAgc3RhY2tTYXZlU2xpY2VzKGxpdmU6IFJlZ2lvbltdKTogTWFwPG51bWJlciwgUmVnaW9uW10+IHtcbiAgICBjb25zdCBvdXQgPSBuZXcgTWFwPG51bWJlciwgUmVnaW9uW10+KCk7XG4gICAgaWYgKCF0aGlzLnN0YWNrKSByZXR1cm4gb3V0O1xuICAgIHRoaXMuYnlTbGljZS5zZXQodGhpcy5zbGljZVosIGxpdmUuc2xpY2UoKSk7XG4gICAgY29uc3QgenMgPSBuZXcgU2V0PG51bWJlcj4odGhpcy5pbml0aWFsTm9uRW1wdHkpO1xuICAgIGZvciAoY29uc3QgW3osIHJlZ3NdIG9mIHRoaXMuYnlTbGljZSkgaWYgKHJlZ3MubGVuZ3RoKSB6cy5hZGQoeik7XG4gICAgZm9yIChjb25zdCB6IG9mIEFycmF5LmZyb20oenMpLnNvcnQoKGEsIGIpID0+IGEgLSBiKSkge1xuICAgICAgb3V0LnNldChcbiAgICAgICAgeixcbiAgICAgICAgKHRoaXMuYnlTbGljZS5nZXQoeikgPz8gW10pLm1hcCgocikgPT4gd2l0aFJlZ2lvbloociwgeikpLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfVxufVxuIl19
|