@jax-data-science/sci-image-visualizer 0.17.0 → 0.18.1
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/lib/contracts/display-types.mjs +3 -2
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/ports/spatial-data.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/spatial-dataset.contract.mjs +1 -1
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/geometry/cell-meshes.mjs +37 -0
- package/esm2022/lib/geometry/place.mjs +47 -0
- package/esm2022/lib/implementations/napari-js/napari-camera-depth.mjs +93 -0
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +2 -2
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +1 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +81 -15
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-cells.mjs +746 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +325 -18
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-transcripts.mjs +182 -24
- package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +95 -5
- package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +15 -1
- package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +30 -2
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +40 -1
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +111 -28
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +14 -2
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +180 -48
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +28 -8
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +2 -2
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +10 -1
- package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +30 -3
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +15 -3
- package/esm2022/lib/region-editor/region-editor.component.mjs +24 -4
- package/esm2022/lib/region-source/region-source-ops.mjs +7 -1
- package/esm2022/lib/region-source/region-tiles.mjs +1 -1
- package/esm2022/lib/region-source/worker-region-source.mjs +24 -1
- package/esm2022/lib/routing-visualizer.service.mjs +404 -7
- package/esm2022/lib/spatial/observations-in-selection.mjs +83 -0
- package/esm2022/lib/spatial/plane-cells.mjs +119 -0
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +298 -5
- package/esm2022/lib/spatial/spatial-encoding.mjs +35 -3
- package/esm2022/lib/spatial/spatial-hover.mjs +34 -1
- package/esm2022/lib/spatial/spatial-planes.mjs +49 -0
- package/esm2022/lib/spatial/spatial-selection.mjs +2 -2
- package/esm2022/lib/spatial/spatial-tile-merge.mjs +38 -1
- package/esm2022/lib/spatial/transcripts-in-selection.mjs +208 -0
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +42 -65
- package/esm2022/lib/spatial-controls/spatial-color-by/spatial-color-by.component.mjs +187 -0
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +47 -12
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +38 -10
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +3 -3
- package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +79 -57
- package/esm2022/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.mjs +101 -0
- package/esm2022/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.mjs +94 -0
- package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +9 -3
- package/esm2022/lib/store/region-source-scope.mjs +10 -1
- package/esm2022/lib/store/region-store.service.mjs +33 -2
- package/esm2022/lib/toolbar/toolbar.component.mjs +10 -3
- package/esm2022/lib/visualizer/spatial-region-set.mjs +95 -0
- package/esm2022/lib/visualizer.component.mjs +40 -4
- package/fesm2022/{jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs → jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-YrNqv8wH.mjs} +4521 -759
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-YrNqv8wH.mjs.map +1 -0
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-CKEUwNta.mjs → jax-data-science-sci-image-visualizer-onnx-sam-session-Dph35S7m.mjs} +2 -2
- package/fesm2022/{jax-data-science-sci-image-visualizer-onnx-sam-session-CKEUwNta.mjs.map → jax-data-science-sci-image-visualizer-onnx-sam-session-Dph35S7m.mjs.map} +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +1 -1
- package/fesm2022/region-source.worker.js +84 -2
- package/lib/contracts/display-types.d.ts +90 -4
- package/lib/contracts/image.contract.d.ts +6 -0
- package/lib/contracts/ports/spatial-data.port.d.ts +7 -0
- package/lib/contracts/region-editor-api.contract.d.ts +9 -0
- package/lib/contracts/region-store.contract.d.ts +6 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +7 -1
- package/lib/contracts/visualizer.contract.d.ts +43 -1
- package/lib/geometry/cell-meshes.d.ts +27 -0
- package/lib/geometry/place.d.ts +45 -0
- package/lib/implementations/napari-js/napari-camera-depth.d.ts +23 -0
- package/lib/implementations/napari-js/napari-loading-state.d.ts +1 -1
- package/lib/implementations/napari-js/napari-scene.d.ts +12 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +19 -3
- package/lib/implementations/napari-js/napari-spatial-3d-cells.d.ts +141 -0
- package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +87 -0
- package/lib/implementations/napari-js/napari-spatial-3d-transcripts.d.ts +49 -8
- package/lib/implementations/napari-js/napari-spatial-hover.d.ts +22 -0
- package/lib/implementations/napari-js/napari-spatial-scene.d.ts +12 -0
- package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +15 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +27 -1
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +38 -19
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +2 -0
- package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +53 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +11 -2
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +7 -0
- package/lib/region-editor/class-tree/class-tree.component.d.ts +16 -1
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +10 -1
- package/lib/region-editor/region-editor.component.d.ts +4 -0
- package/lib/region-source/region-source-ops.d.ts +12 -0
- package/lib/region-source/region-tiles.d.ts +8 -0
- package/lib/region-source/worker-region-source.d.ts +18 -0
- package/lib/routing-visualizer.service.d.ts +140 -1
- package/lib/spatial/observations-in-selection.d.ts +43 -0
- package/lib/spatial/plane-cells.d.ts +37 -0
- package/lib/spatial/spatial-controls.facade.d.ts +59 -0
- package/lib/spatial/spatial-encoding.d.ts +14 -1
- package/lib/spatial/spatial-hover.d.ts +23 -0
- package/lib/spatial/spatial-planes.d.ts +22 -0
- package/lib/spatial/spatial-selection.d.ts +2 -1
- package/lib/spatial/spatial-tile-merge.d.ts +9 -0
- package/lib/spatial/transcripts-in-selection.d.ts +95 -0
- package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +19 -28
- package/lib/spatial-controls/spatial-color-by/spatial-color-by.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +17 -2
- package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +16 -6
- package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +26 -23
- package/lib/spatial-controls/spatial-selection-observations/spatial-selection-observations.component.d.ts +48 -0
- package/lib/spatial-controls/spatial-selection-transcripts/spatial-selection-transcripts.component.d.ts +43 -0
- package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +3 -1
- package/lib/store/region-source-scope.d.ts +4 -0
- package/lib/store/region-store.service.d.ts +21 -0
- package/lib/toolbar/toolbar.component.d.ts +6 -1
- package/lib/visualizer/spatial-region-set.d.ts +55 -0
- package/lib/visualizer.component.d.ts +14 -0
- package/package.json +1 -1
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-DHrHO2ay.mjs.map +0 -1
|
@@ -6,6 +6,7 @@ import { PlotlyService } from './implementations/plotly/plotly.service';
|
|
|
6
6
|
import { OpenSeadragonVisualizerService } from './implementations/osd/openseadragon-visualizer.service';
|
|
7
7
|
import { PlotType, isNapari3d, isNapariScatter, isSpatialOmics, isSpatialOmics3d, isNapariIsosurface, isNapariVolume, } from './contracts/plot-type';
|
|
8
8
|
import { SPATIAL_DATA_PORT } from './contracts/ports/spatial-data.port';
|
|
9
|
+
import { drawnCellSets } from './spatial/lod';
|
|
9
10
|
import { SpatialControlsFacade } from './spatial/spatial-controls.facade';
|
|
10
11
|
import { RegionStore } from './store/region-store.service';
|
|
11
12
|
import { RegionScopeCache } from './store/region-scope-cache';
|
|
@@ -102,6 +103,36 @@ export class RoutingVisualizerService {
|
|
|
102
103
|
this.meshRequest = 0;
|
|
103
104
|
/** The class groups shown in 3D, and the image they belong to. */
|
|
104
105
|
this.classes3d$ = new BehaviorSubject([]);
|
|
106
|
+
/**
|
|
107
|
+
* The spatial dataset's region set attached to its image (see attachDatasetRegionSet): the image
|
|
108
|
+
* (its region scope key), the set's key, and where its slices are when it says (its `sliceZ`),
|
|
109
|
+
* which places its surfaces in spatial 3D on an image of one plane. `shown3d` once its classes
|
|
110
|
+
* were shown in 3D by themselves, which happens once per image.
|
|
111
|
+
*/
|
|
112
|
+
this.datasetRegionSet = null;
|
|
113
|
+
/**
|
|
114
|
+
* Each image's attached region set, kept across image switches: coming back to the image finds
|
|
115
|
+
* its source still in the store (with what was taken from it, or deleted) and restores the set
|
|
116
|
+
* rather than attaching it again, which would start the source afresh.
|
|
117
|
+
*/
|
|
118
|
+
this.attachedRegionSets = new Map();
|
|
119
|
+
/** The spatial dataset on offer (the port's), for the boundary set its region set is. */
|
|
120
|
+
this.spatialDataset = null;
|
|
121
|
+
/**
|
|
122
|
+
* Whether the Annotations switch last hid every class in a spatial view (see syncAnnotations), so
|
|
123
|
+
* a change of it, not every view emission, hides or shows them.
|
|
124
|
+
*/
|
|
125
|
+
this.annotationsHidden = false;
|
|
126
|
+
/** The 3D view's global cells switch as last applied (see updateCells3d). */
|
|
127
|
+
this.cells3dMode = 'types';
|
|
128
|
+
/** Classes set the other way than the global switch in the Region Editor. */
|
|
129
|
+
this.cells3dOverrides = new Map();
|
|
130
|
+
/** The classes drawn as individual cells in spatial 3D, as last applied. */
|
|
131
|
+
this.individual3d$ = new BehaviorSubject(new Set());
|
|
132
|
+
/** The classes that can be drawn as individual cells now (see getCellableClasses3d$). */
|
|
133
|
+
this.cellable3d$ = new BehaviorSubject(new Set());
|
|
134
|
+
/** The dataset region set's planes while they slice the plotted image (see getDatasetPlanes$). */
|
|
135
|
+
this.datasetPlanes$ = new BehaviorSubject(null);
|
|
105
136
|
/** The groups last asked for in 3D, with their colours: what an edit's rebuild shows again. */
|
|
106
137
|
this.shown3d = [];
|
|
107
138
|
/**
|
|
@@ -142,6 +173,8 @@ export class RoutingVisualizerService {
|
|
|
142
173
|
/** Displayed slice. Only a volume-backed spatial dataset reads it, to keep a
|
|
143
174
|
* region drawn over one section from selecting the whole depth behind it. */
|
|
144
175
|
this.currentZIndex = 0;
|
|
176
|
+
/** The slice shown, the plot type or the dataset's planes changed (the spatial controls recount). */
|
|
177
|
+
this.spatialViewChanged$ = new Subject();
|
|
145
178
|
this.intensitySampling = {
|
|
146
179
|
// Load the displayed slice's pixels for a backend that has no frames of its own
|
|
147
180
|
// (OpenSeadragon, napari-js; Plotly feeds its frames to the service when it plots).
|
|
@@ -157,6 +190,14 @@ export class RoutingVisualizerService {
|
|
|
157
190
|
getViewportChange$: () => merge(...this.backends().map((b) => b.getIntensitySampling()?.getViewportChange$() ?? EMPTY)),
|
|
158
191
|
};
|
|
159
192
|
this.regionUpdates = this.regionStore.getRegionUpdateEvent().subscribe(() => this.onRegionsChanged());
|
|
193
|
+
this.planeCellsSub = this.spatialData
|
|
194
|
+
? combineLatest([this.spatialData.getDataset$(), this.store.getSpatialView$()]).subscribe(([dataset]) => {
|
|
195
|
+
this.spatialDataset = dataset ?? null;
|
|
196
|
+
this.updatePlaneCells();
|
|
197
|
+
this.syncAnnotations();
|
|
198
|
+
this.updateCells3d();
|
|
199
|
+
})
|
|
200
|
+
: null;
|
|
160
201
|
this.sections = new VolumeSections({
|
|
161
202
|
volume: () => this.napari.volumeVoxels(),
|
|
162
203
|
image: () => this.plottedFileName,
|
|
@@ -276,6 +317,8 @@ export class RoutingVisualizerService {
|
|
|
276
317
|
// A stack can open away from slice 0 (`initialZIndex` — a volume opens
|
|
277
318
|
// mid-specimen), and that arrives here rather than through setZIndex.
|
|
278
319
|
this.currentZIndex = zIndex;
|
|
320
|
+
this.spatialViewChanged$.next();
|
|
321
|
+
zIndex = this.imageSlice(zIndex, imageInfo);
|
|
279
322
|
const backend = this.imageBackend();
|
|
280
323
|
if (backend === this.napari) {
|
|
281
324
|
try {
|
|
@@ -317,6 +360,7 @@ export class RoutingVisualizerService {
|
|
|
317
360
|
}
|
|
318
361
|
plot(plotDiv, imageLoaded, imageInfo, screenHeight, plotType, inPlace) {
|
|
319
362
|
this.currentPlotType = plotType;
|
|
363
|
+
this.spatialViewChanged$.next();
|
|
320
364
|
this.plottedFileName = imageInfo?.fileName;
|
|
321
365
|
this.plottedInfo = imageInfo ?? null;
|
|
322
366
|
this.plottedHeight = screenHeight;
|
|
@@ -328,6 +372,19 @@ export class RoutingVisualizerService {
|
|
|
328
372
|
// Region surfaces belong to the image they were built from: another image drops them.
|
|
329
373
|
if (this.classes3d$.value.length && this.plottedFileName !== this.classes3dImage)
|
|
330
374
|
this.clearRegionClasses3d();
|
|
375
|
+
// So does a dataset's region set: where its planes are is no other image's. Its attachment is
|
|
376
|
+
// kept (attachedRegionSets), to be restored when its image is back.
|
|
377
|
+
if (this.datasetRegionSet && this.datasetRegionSet.image !== this.importImageKey()) {
|
|
378
|
+
this.datasetRegionSet = null;
|
|
379
|
+
this.napari.setRegionPlanes(null);
|
|
380
|
+
this.datasetPlanes$.next(null);
|
|
381
|
+
this.spatialViewChanged$.next();
|
|
382
|
+
this.updateVolumeView(plotType);
|
|
383
|
+
this.updateCells3d();
|
|
384
|
+
}
|
|
385
|
+
this.updatePlaneCells();
|
|
386
|
+
this.syncAnnotations();
|
|
387
|
+
this.updateCells3d();
|
|
331
388
|
this.plotDiv = plotDiv;
|
|
332
389
|
// Apply the per-image region cache (snapshot old regions, restore the new
|
|
333
390
|
// image's, clear selection) for whichever backend renders — Plotly does
|
|
@@ -345,7 +402,15 @@ export class RoutingVisualizerService {
|
|
|
345
402
|
this.lastRendered.reset();
|
|
346
403
|
}
|
|
347
404
|
this.lastRendered = next;
|
|
348
|
-
const
|
|
405
|
+
const drawn = next.plot(plotDiv, imageLoaded, imageInfo, screenHeight, plotType, inPlace);
|
|
406
|
+
// A dataset's region set is shown in 3D once the cloud's scene is up: its voxel step is the scene's.
|
|
407
|
+
const plotted = this.datasetRegionSet?.planes
|
|
408
|
+
? drawn.then((ok) => {
|
|
409
|
+
if (ok)
|
|
410
|
+
this.showDatasetRegionSet3d();
|
|
411
|
+
return ok;
|
|
412
|
+
})
|
|
413
|
+
: drawn;
|
|
349
414
|
if (!this.sliceDiv || !this.imageVolumeView)
|
|
350
415
|
return plotted;
|
|
351
416
|
// The split volume view: the slice pane follows the image (a new one, or its sharper pass).
|
|
@@ -474,12 +539,32 @@ export class RoutingVisualizerService {
|
|
|
474
539
|
}
|
|
475
540
|
setZIndex(zIndex) {
|
|
476
541
|
this.currentZIndex = zIndex;
|
|
477
|
-
this.
|
|
542
|
+
this.spatialViewChanged$.next();
|
|
543
|
+
const slice = this.imageSlice(zIndex);
|
|
544
|
+
this.renderer().setZIndex(slice);
|
|
545
|
+
if (this.datasetRegionSet?.planes)
|
|
546
|
+
this.napari.setRegionPlane(zIndex);
|
|
478
547
|
if (this.sliceMounted) {
|
|
479
|
-
this.osd.setZIndex(
|
|
548
|
+
this.osd.setZIndex(slice);
|
|
480
549
|
this.sections.schedule();
|
|
481
550
|
}
|
|
482
551
|
}
|
|
552
|
+
/**
|
|
553
|
+
* The image's own slice for slider position `z`: 0 while the dataset region set's planes slice an
|
|
554
|
+
* image of one plane (the slider then picks the plane, see getDatasetPlanes$), else `z`.
|
|
555
|
+
*/
|
|
556
|
+
imageSlice(z, info = this.plottedInfo) {
|
|
557
|
+
return this.datasetRegionSet?.planes && !info?.isStack ? 0 : z;
|
|
558
|
+
}
|
|
559
|
+
/**
|
|
560
|
+
* The planes of the spatial dataset's region set (its `sliceZ`, in observation units) while they
|
|
561
|
+
* slice the plotted image, an image of one plane; null otherwise. The host's slice slider then
|
|
562
|
+
* runs over them: each position shows that plane's regions and, in the 2D spatial view, the
|
|
563
|
+
* observations and transcripts nearest it, over the same image.
|
|
564
|
+
*/
|
|
565
|
+
getDatasetPlanes$() {
|
|
566
|
+
return this.datasetPlanes$.asObservable();
|
|
567
|
+
}
|
|
483
568
|
getTrueImageSize() {
|
|
484
569
|
return this.renderer().getTrueImageSize();
|
|
485
570
|
}
|
|
@@ -500,7 +585,11 @@ export class RoutingVisualizerService {
|
|
|
500
585
|
}
|
|
501
586
|
setPlotType(plotType) {
|
|
502
587
|
this.currentPlotType = plotType;
|
|
588
|
+
this.spatialViewChanged$.next();
|
|
503
589
|
this.updateVolumeView(plotType);
|
|
590
|
+
this.updatePlaneCells();
|
|
591
|
+
this.syncAnnotations();
|
|
592
|
+
this.updateCells3d();
|
|
504
593
|
this.plotly.setPlotType(plotType);
|
|
505
594
|
}
|
|
506
595
|
/** @deprecated Use `getSurface3dControls()`. */
|
|
@@ -775,6 +864,278 @@ export class RoutingVisualizerService {
|
|
|
775
864
|
this.regionStore.attachRegionSource(reuse, { slice: this.regionStore.getDisplaySlice() }, true);
|
|
776
865
|
return true;
|
|
777
866
|
}
|
|
867
|
+
/**
|
|
868
|
+
* Attach a spatial dataset's region set (a 3D segmentation's cells, outlined on every plane they
|
|
869
|
+
* span) to its image, the image plotted now, as the image's own regions are: over every slice
|
|
870
|
+
* from the set's planes (`'planes'`), not marked imported (it is the dataset's, nothing to save),
|
|
871
|
+
* leaving the image's drawn regions as they are. Once per image and set: called again (the
|
|
872
|
+
* dataset re-emitted, the image re-plotted) it changes nothing. Where the set's slices are (its
|
|
873
|
+
* `sliceZ`) places its surfaces among the observations in spatial 3D, where the region editor then
|
|
874
|
+
* offers its classes in 3D; there, every class is shown once by itself (see showDatasetRegionSet3d).
|
|
875
|
+
* Back on an image the set was attached to, with its source still the store's, it is restored as
|
|
876
|
+
* it was (what was taken from the source, or deleted, stays so), not attached again.
|
|
877
|
+
* Resolves false, changing nothing (the source disposed), when another image was plotted or
|
|
878
|
+
* another set attached while it opened, it could not be opened, or the image has region sources
|
|
879
|
+
* of its own (which it would replace, see keepsOwnSources).
|
|
880
|
+
*/
|
|
881
|
+
async attachDatasetRegionSet(open, key) {
|
|
882
|
+
const image = this.importImageKey();
|
|
883
|
+
if (!image)
|
|
884
|
+
return false;
|
|
885
|
+
const current = this.datasetRegionSet;
|
|
886
|
+
if (current?.image === image && current.key === key) {
|
|
887
|
+
this.showDatasetRegionSet3d();
|
|
888
|
+
return true;
|
|
889
|
+
}
|
|
890
|
+
// Back on an image whose set is attached: its source is still the store's, with what was taken
|
|
891
|
+
// from it. Restored, not attached again.
|
|
892
|
+
const known = this.attachedRegionSets.get(image);
|
|
893
|
+
if (known?.key === key && known.opener && known.opener === this.regionStore.getPlanesSourceOpener()) {
|
|
894
|
+
this.useDatasetRegionSet(known);
|
|
895
|
+
return true;
|
|
896
|
+
}
|
|
897
|
+
if (this.keepsOwnSources(key))
|
|
898
|
+
return false;
|
|
899
|
+
// Claimed before the source opens: a second call meanwhile changes nothing.
|
|
900
|
+
const claim = { image, key, planes: null, groups: [], shown3d: false, opener: null };
|
|
901
|
+
this.datasetRegionSet = claim;
|
|
902
|
+
let first;
|
|
903
|
+
try {
|
|
904
|
+
first = await open();
|
|
905
|
+
}
|
|
906
|
+
catch (err) {
|
|
907
|
+
if (this.datasetRegionSet === claim)
|
|
908
|
+
this.datasetRegionSet = null;
|
|
909
|
+
console.warn("[visualizer] the dataset's region set could not be opened", err);
|
|
910
|
+
return false;
|
|
911
|
+
}
|
|
912
|
+
if (this.datasetRegionSet !== claim || this.importImageKey() !== image || this.keepsOwnSources(key)) {
|
|
913
|
+
if (this.datasetRegionSet === claim)
|
|
914
|
+
this.datasetRegionSet = null;
|
|
915
|
+
first.dispose();
|
|
916
|
+
return false;
|
|
917
|
+
}
|
|
918
|
+
const info = first.info;
|
|
919
|
+
const reuse = () => {
|
|
920
|
+
const source = first;
|
|
921
|
+
first = null;
|
|
922
|
+
return source ? Promise.resolve(source) : open();
|
|
923
|
+
};
|
|
924
|
+
const planes = info.sliceZ?.length && info.sliceZ.length === info.planes.length ? info.sliceZ : null;
|
|
925
|
+
// Sliced by its planes, the image's regions are held per plane (see useDatasetRegionSet): stack
|
|
926
|
+
// mode first, so the source is laid out on the plane shown.
|
|
927
|
+
if (planes && planes.length > 1 && !this.plottedInfo?.isStack && !this.regionStore.isStackMode()) {
|
|
928
|
+
const z = this.currentZIndex < planes.length ? this.currentZIndex : 0;
|
|
929
|
+
this.regionStore.enterStackMode(new Map([[z, this.regionStore.getRegions()]]), z, 'combined');
|
|
930
|
+
}
|
|
931
|
+
this.regionStore.attachRegionSource(reuse, 'planes');
|
|
932
|
+
const set = { ...claim, planes, groups: regionSetGroups(info), opener: reuse };
|
|
933
|
+
this.attachedRegionSets.set(image, set);
|
|
934
|
+
this.useDatasetRegionSet(set);
|
|
935
|
+
return true;
|
|
936
|
+
}
|
|
937
|
+
/**
|
|
938
|
+
* Whether the plotted image has region sources of its own (a served set, large saved ROIs, an
|
|
939
|
+
* annotation folder's slices), which attaching the dataset's set over every plane would replace,
|
|
940
|
+
* dropping them and what was taken from them: they are kept, and the set is not attached.
|
|
941
|
+
*/
|
|
942
|
+
keepsOwnSources(key) {
|
|
943
|
+
if (!this.regionStore.hasAnyRegionSource())
|
|
944
|
+
return false;
|
|
945
|
+
console.warn(`[visualizer] the image has region sources of its own: the dataset's region set (${key}) is not attached over them`);
|
|
946
|
+
return true;
|
|
947
|
+
}
|
|
948
|
+
/**
|
|
949
|
+
* Make `set` the plotted image's region set: its planes slice the image (its regions per plane,
|
|
950
|
+
* as a stack's per slice: those drawn before go to the plane shown), place its surfaces in
|
|
951
|
+
* spatial 3D and drive the slider.
|
|
952
|
+
*/
|
|
953
|
+
useDatasetRegionSet(set) {
|
|
954
|
+
this.datasetRegionSet = set;
|
|
955
|
+
const planes = set.planes;
|
|
956
|
+
const sliced = !!planes && planes.length > 1 && !this.plottedInfo?.isStack;
|
|
957
|
+
if (sliced && !this.regionStore.isStackMode()) {
|
|
958
|
+
const z = this.currentZIndex < planes.length ? this.currentZIndex : 0;
|
|
959
|
+
this.regionStore.enterStackMode(new Map([[z, this.regionStore.getRegions()]]), z, 'combined');
|
|
960
|
+
}
|
|
961
|
+
this.napari.setRegionPlanes(planes);
|
|
962
|
+
if (planes)
|
|
963
|
+
this.napari.setRegionPlane(this.currentZIndex);
|
|
964
|
+
this.datasetPlanes$.next(sliced ? planes : null);
|
|
965
|
+
this.spatialViewChanged$.next();
|
|
966
|
+
// Regions switched off in a spatial view before the set came: its classes are hidden as the
|
|
967
|
+
// rest are.
|
|
968
|
+
if (this.annotationsHidden &&
|
|
969
|
+
(isSpatialOmics(this.currentPlotType) || isSpatialOmics3d(this.currentPlotType))) {
|
|
970
|
+
this.setClassesHidden(set.groups.flatMap((g) => g.classes), true);
|
|
971
|
+
}
|
|
972
|
+
this.updateVolumeView(this.currentPlotType);
|
|
973
|
+
this.showDatasetRegionSet3d();
|
|
974
|
+
this.updatePlaneCells();
|
|
975
|
+
this.updateCells3d();
|
|
976
|
+
}
|
|
977
|
+
/**
|
|
978
|
+
* The dataset no longer names the attached set while its image is still plotted (see
|
|
979
|
+
* IVisualizer.releaseDatasetRegionSet): its planes, its surfaces and cells in 3D go, as on another
|
|
980
|
+
* image. Its attachment is kept (attachedRegionSets): the same set asked for again is restored.
|
|
981
|
+
*/
|
|
982
|
+
releaseDatasetRegionSet(keep) {
|
|
983
|
+
const set = this.datasetRegionSet;
|
|
984
|
+
if (!set || set.key === keep)
|
|
985
|
+
return;
|
|
986
|
+
// One still opening (the claim) is dropped when it opens.
|
|
987
|
+
this.datasetRegionSet = null;
|
|
988
|
+
if (set.planes && this.classes3d$.value.length && this.classes3dImage === this.plottedFileName) {
|
|
989
|
+
this.clearRegionClasses3d();
|
|
990
|
+
}
|
|
991
|
+
this.napari.setRegionPlanes(null);
|
|
992
|
+
this.datasetPlanes$.next(null);
|
|
993
|
+
this.spatialViewChanged$.next();
|
|
994
|
+
this.updateVolumeView(this.currentPlotType);
|
|
995
|
+
this.updateCells3d();
|
|
996
|
+
this.updatePlaneCells();
|
|
997
|
+
}
|
|
998
|
+
/** The dataset region set's classes while in spatial 3D: those that can be drawn as cells. */
|
|
999
|
+
getCellableClasses3d$() {
|
|
1000
|
+
return this.cellable3d$.asObservable();
|
|
1001
|
+
}
|
|
1002
|
+
/** The classes the spatial 3D view draws as individual cells (see updateCells3d). */
|
|
1003
|
+
getIndividualClasses3d$() {
|
|
1004
|
+
return this.individual3d$.asObservable();
|
|
1005
|
+
}
|
|
1006
|
+
/** Draw these classes as individual cells in spatial 3D, or merged again (the global switch aside). */
|
|
1007
|
+
setClassesIndividual3d(classes, individual) {
|
|
1008
|
+
const global = this.cells3dMode === 'cells';
|
|
1009
|
+
for (const c of classes) {
|
|
1010
|
+
if (individual === global)
|
|
1011
|
+
this.cells3dOverrides.delete(c);
|
|
1012
|
+
else
|
|
1013
|
+
this.cells3dOverrides.set(c, individual);
|
|
1014
|
+
}
|
|
1015
|
+
this.updateCells3d(true);
|
|
1016
|
+
}
|
|
1017
|
+
/**
|
|
1018
|
+
* Which of the dataset region set's classes the spatial 3D view draws as individual cells: every
|
|
1019
|
+
* one with the panel's global switch on "cells", none on "types", each class the Region Editor
|
|
1020
|
+
* set the other way excepted. Turning the global switch resets those. The individual classes'
|
|
1021
|
+
* merged surfaces are left out (see showRegionClasses3d); their cells are drawn instead.
|
|
1022
|
+
*/
|
|
1023
|
+
updateCells3d(force = false) {
|
|
1024
|
+
const mode = this.store.currentSpatialView().cells3d ?? 'types';
|
|
1025
|
+
if (mode !== this.cells3dMode) {
|
|
1026
|
+
this.cells3dMode = mode;
|
|
1027
|
+
this.cells3dOverrides.clear();
|
|
1028
|
+
force = true;
|
|
1029
|
+
}
|
|
1030
|
+
const classes = new Set();
|
|
1031
|
+
for (const g of this.datasetRegionSet?.planes ? this.datasetRegionSet.groups : []) {
|
|
1032
|
+
for (const c of g.classes) {
|
|
1033
|
+
if (this.cells3dOverrides.get(c) ?? mode === 'cells')
|
|
1034
|
+
classes.add(c);
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
const cellable = new Set(isSpatialOmics3d(this.currentPlotType) && this.datasetRegionSet?.planes
|
|
1038
|
+
? this.datasetRegionSet.groups.flatMap((g) => g.classes)
|
|
1039
|
+
: []);
|
|
1040
|
+
const had = this.cellable3d$.value;
|
|
1041
|
+
if (had.size !== cellable.size || [...cellable].some((c) => !had.has(c)))
|
|
1042
|
+
this.cellable3d$.next(cellable);
|
|
1043
|
+
const before = this.individual3d$.value;
|
|
1044
|
+
const same = before.size === classes.size && [...classes].every((c) => before.has(c));
|
|
1045
|
+
if (same && !force)
|
|
1046
|
+
return;
|
|
1047
|
+
if (!same)
|
|
1048
|
+
this.individual3d$.next(classes);
|
|
1049
|
+
this.napari.setRegionCells(classes.size ? [...classes] : null);
|
|
1050
|
+
// The merged surfaces follow: an individual class's leaves them, a merged one's comes back.
|
|
1051
|
+
if (!same && this.shown3d.length && this.classes3dImage === this.plottedFileName) {
|
|
1052
|
+
void this.showRegionClasses3d(this.shown3d);
|
|
1053
|
+
}
|
|
1054
|
+
}
|
|
1055
|
+
/**
|
|
1056
|
+
* In the spatial views (2D and 3D), the spatial panel's Regions switch (`showAnnotations`, off by
|
|
1057
|
+
* default) is every class's in the Region Editor's list, as their eyes are: off, every class is
|
|
1058
|
+
* hidden (the drawn regions' and the dataset region set's cell types alike: their regions in 2D,
|
|
1059
|
+
* their surfaces in 3D, and the eyes show it); on again, every class is shown. Applied when the
|
|
1060
|
+
* switch changes, or on entering a spatial view with it off (so by default), so a class hidden or
|
|
1061
|
+
* shown by its own eye meanwhile stays as it was set.
|
|
1062
|
+
*/
|
|
1063
|
+
syncAnnotations() {
|
|
1064
|
+
if (!isSpatialOmics(this.currentPlotType) && !isSpatialOmics3d(this.currentPlotType))
|
|
1065
|
+
return;
|
|
1066
|
+
const hide = this.store.currentSpatialView().showAnnotations === false;
|
|
1067
|
+
if (hide === this.annotationsHidden)
|
|
1068
|
+
return;
|
|
1069
|
+
this.annotationsHidden = hide;
|
|
1070
|
+
const classes = this.knownClasses();
|
|
1071
|
+
if (classes.length)
|
|
1072
|
+
this.setClassesHidden(classes, hide);
|
|
1073
|
+
}
|
|
1074
|
+
/**
|
|
1075
|
+
* Every class the Region Editor lists for the image: the dataset region set's, those shown in 3D,
|
|
1076
|
+
* the drawn regions', and any hidden now.
|
|
1077
|
+
*/
|
|
1078
|
+
knownClasses() {
|
|
1079
|
+
const out = new Set(this.regionStore.getHiddenClasses());
|
|
1080
|
+
for (const g of this.datasetRegionSet?.groups ?? [])
|
|
1081
|
+
g.classes.forEach((c) => out.add(c));
|
|
1082
|
+
for (const g of this.shown3d)
|
|
1083
|
+
g.classes.forEach((c) => out.add(c));
|
|
1084
|
+
for (const r of this.regionStore.getRegions())
|
|
1085
|
+
if (r.label)
|
|
1086
|
+
out.add(r.label);
|
|
1087
|
+
return [...out];
|
|
1088
|
+
}
|
|
1089
|
+
/**
|
|
1090
|
+
* The Cells panel's boundary set that is the dataset's region set (the one naming it as its
|
|
1091
|
+
* `regionSource`), while its planes are shown on the plotted image with its source still the
|
|
1092
|
+
* store's; null otherwise.
|
|
1093
|
+
*/
|
|
1094
|
+
planeCellSet() {
|
|
1095
|
+
const set = this.datasetRegionSet;
|
|
1096
|
+
if (!set?.planes || !set.opener || set.opener !== this.regionStore.getPlanesSourceOpener())
|
|
1097
|
+
return null;
|
|
1098
|
+
return this.spatialDataset?.polygonTiles?.sets.find((s) => s.regionSource === set.key)?.name ?? null;
|
|
1099
|
+
}
|
|
1100
|
+
/**
|
|
1101
|
+
* While the dataset region set's planes are shown, the Cells panel draws each plane's cells from
|
|
1102
|
+
* it (its boundary set, see `CellLayers.setPlane`):
|
|
1103
|
+
* - that set is the panel's boundaries by default: a view that has not chosen a set (none yet, or
|
|
1104
|
+
* after a reset) is given it;
|
|
1105
|
+
* - in the 2D spatial view, while the panel draws them, the overlays do not draw the same
|
|
1106
|
+
* outlines a second time (`RegionStore.setRegionSourceDrawn`). They stay listed and editable
|
|
1107
|
+
* in the Region Editor, and are drawn by the overlays everywhere else.
|
|
1108
|
+
*/
|
|
1109
|
+
updatePlaneCells() {
|
|
1110
|
+
const name = this.planeCellSet();
|
|
1111
|
+
const view = this.store.currentSpatialView();
|
|
1112
|
+
if (name && view.cellSet == null) {
|
|
1113
|
+
// Emits the view, which comes back here with the set chosen.
|
|
1114
|
+
this.store.setSpatialView({ cellSet: name });
|
|
1115
|
+
return;
|
|
1116
|
+
}
|
|
1117
|
+
const drawn = drawnCellSets(this.spatialDataset?.polygonTiles, view.cellSet);
|
|
1118
|
+
const byCells = !!name &&
|
|
1119
|
+
isSpatialOmics(this.currentPlotType) &&
|
|
1120
|
+
(view.showCells ?? true) &&
|
|
1121
|
+
drawn?.set === name &&
|
|
1122
|
+
!drawn.nucleusSet;
|
|
1123
|
+
this.regionStore.setRegionSourceDrawn(!byCells);
|
|
1124
|
+
}
|
|
1125
|
+
/**
|
|
1126
|
+
* In spatial 3D, with the dataset's region set placed there: show each of its classes in 3D, in
|
|
1127
|
+
* its colour, once per image, unless classes are shown already (the region editor's choice
|
|
1128
|
+
* stands, and hiding them all stays hidden).
|
|
1129
|
+
*/
|
|
1130
|
+
showDatasetRegionSet3d() {
|
|
1131
|
+
const set = this.datasetRegionSet;
|
|
1132
|
+
if (!set?.planes || set.shown3d || !set.groups.length)
|
|
1133
|
+
return;
|
|
1134
|
+
if (!isSpatialOmics3d(this.currentPlotType) || this.classes3d$.value.length)
|
|
1135
|
+
return;
|
|
1136
|
+
set.shown3d = true;
|
|
1137
|
+
this.showRegionClasses3d(set.groups).catch((err) => console.warn('[visualizer] the cells could not be shown in 3D', err));
|
|
1138
|
+
}
|
|
778
1139
|
/** Empty every slice of a stack (its regions and undo history) for regions imported over it. */
|
|
779
1140
|
enterImportedStack(info) {
|
|
780
1141
|
const layout = this.regionStore.isStackMode()
|
|
@@ -806,7 +1167,9 @@ export class RoutingVisualizerService {
|
|
|
806
1167
|
/** Recompute which 3D view is on screen for `plotType` (see {@link volumeView$}). */
|
|
807
1168
|
updateVolumeView(plotType) {
|
|
808
1169
|
this.imageVolumeView = isNapariVolume(plotType) || isNapariIsosurface(plotType);
|
|
809
|
-
|
|
1170
|
+
// The spatial cloud places the surfaces of a stack's slices, or of a region set's planes.
|
|
1171
|
+
const placed = !!this.plottedInfo?.isStack || !!this.datasetRegionSet?.planes;
|
|
1172
|
+
const regions3d = this.imageVolumeView || (isSpatialOmics3d(plotType) && placed);
|
|
810
1173
|
// Every plot, as before: the Region Editor drops its per-class volumes on each (a new image).
|
|
811
1174
|
this.volumeView$.next(regions3d);
|
|
812
1175
|
}
|
|
@@ -870,7 +1233,10 @@ export class RoutingVisualizerService {
|
|
|
870
1233
|
const step = this.napari.regionVoxelStep() ?? Math.max(1, width / 256);
|
|
871
1234
|
const image = this.plottedFileName ?? '';
|
|
872
1235
|
const cacheKey = (g) => `${image}|${step.toFixed(3)}|${g.classes.join(',')}`;
|
|
873
|
-
|
|
1236
|
+
// A group of classes drawn as individual cells has no merged surface (its cells are drawn).
|
|
1237
|
+
const individual = this.individual3d$.value;
|
|
1238
|
+
const merged = groups.filter((g) => !g.classes.length || !g.classes.every((c) => individual.has(c)));
|
|
1239
|
+
const missing = merged.filter((g) => !this.meshCache.has(cacheKey(g)));
|
|
874
1240
|
if (missing.length) {
|
|
875
1241
|
const names = missing.map((g) => g.key);
|
|
876
1242
|
const what = names.length > 3 ? `${names.length} regions` : names.join(', ');
|
|
@@ -887,7 +1253,7 @@ export class RoutingVisualizerService {
|
|
|
887
1253
|
}
|
|
888
1254
|
if (request !== this.meshRequest)
|
|
889
1255
|
return;
|
|
890
|
-
this.napari.setRegionMeshes(
|
|
1256
|
+
this.napari.setRegionMeshes(merged.map((g) => {
|
|
891
1257
|
const mesh = this.meshCache.get(cacheKey(g)).mesh;
|
|
892
1258
|
return { key: g.key, color: g.color, label: g.label, vertices: mesh.vertices, faces: mesh.faces };
|
|
893
1259
|
}), this.plottedFileName);
|
|
@@ -1237,6 +1603,9 @@ export class RoutingVisualizerService {
|
|
|
1237
1603
|
napari: this.napari,
|
|
1238
1604
|
plotType: () => this.currentPlotType,
|
|
1239
1605
|
zIndex: () => this.currentZIndex,
|
|
1606
|
+
planes: () => (this.plottedInfo?.isStack ? null : (this.datasetRegionSet?.planes ?? null)),
|
|
1607
|
+
slicePlanes: () => this.datasetRegionSet?.planes ?? null,
|
|
1608
|
+
viewChanged$: this.spatialViewChanged$.asObservable(),
|
|
1240
1609
|
});
|
|
1241
1610
|
return this.spatialFacade.controls;
|
|
1242
1611
|
}
|
|
@@ -1248,6 +1617,7 @@ export class RoutingVisualizerService {
|
|
|
1248
1617
|
this.spatialFacade?.dispose();
|
|
1249
1618
|
this.spatialFacade = null;
|
|
1250
1619
|
this.regionUpdates.unsubscribe();
|
|
1620
|
+
this.planeCellsSub?.unsubscribe();
|
|
1251
1621
|
this.sectionSubs.unsubscribe();
|
|
1252
1622
|
this.sections.stop();
|
|
1253
1623
|
if (this.rebuildTimer)
|
|
@@ -1312,4 +1682,31 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
|
|
|
1312
1682
|
type: Inject,
|
|
1313
1683
|
args: [SPATIAL_DATA_PORT]
|
|
1314
1684
|
}] }] });
|
|
1315
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGluZy12aXN1YWxpemVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JvdXRpbmctdmlzdWFsaXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFhLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQUUsS0FBSyxFQUFjLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkcsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFLNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQ3hHLE9BQU8sRUFDTCxRQUFRLEVBRVIsVUFBVSxFQUNWLGVBQWUsRUFDZixjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQixjQUFjLEdBQ2YsTUFBTSx1QkFBdUIsQ0FBQztBQWUvQixPQUFPLEVBQUUsaUJBQWlCLEVBQW1CLE1BQU0scUNBQXFDLENBQUM7QUFFekYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDMUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzlELE9BQU8sRUFBRSx1QkFBdUIsRUFBa0MsTUFBTSwrQkFBK0IsQ0FBQztBQUl4RyxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUUvRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztB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LE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDckQsQ0FBQztJQUVELGlGQUFpRjtJQUNqRiw4QkFBOEIsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLEtBQWEsRUFBRSxNQUFjLEVBQUUsTUFBYztRQUNoRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsOEJBQThCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3JGLENBQUM7SUFFRDs7OzZGQUd5RjtJQUN6RixNQUFNO1FBQ0osSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDM0IsQ0FBQztJQUVELHNDQUFzQztJQUN0QyxXQUFXO1FBQ1QsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2hCLENBQUM7OEdBL3lDVSx3QkFBd0IsbUtBMEV6QixVQUFVLG9IQU9WLGlCQUFpQjtrSEFqRmhCLHdCQUF3QixjQURYLE1BQU07OzJGQUNuQix3QkFBd0I7a0JBRHBDLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkEyRTdCLE1BQU07MkJBQUMsVUFBVTs7MEJBTWpCLFFBQVE7OzBCQUNSLE1BQU07MkJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFTVBUWSwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBjb21iaW5lTGF0ZXN0LCBtZXJnZSwgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJbWFnZSB9IGZyb20gJ2ltYWdlLWpzJztcbmltcG9ydCB7IHJlc29sdmVDb2xvcm1hcCB9IGZyb20gJ25hcGFyaS1qcyc7XG5cbmltcG9ydCB7IElJbWFnZUluZm8sIElJbWFnZU1ldGFkYXRhIH0gZnJvbSAnLi9jb250cmFjdHMvaW1hZ2UuY29udHJhY3QnO1xuaW1wb3J0IHsgUG9seWdvbiwgUmVnaW9uIH0gZnJvbSAnLi9tb2RlbHMvcmVnaW9uJztcbmltcG9ydCB7IENsYXNzUHJlc2V0LCBQcmVzZXRTZXQgfSBmcm9tICcuL21vZGVscy9jbGFzcy1wcmVzZXQnO1xuaW1wb3J0IHsgUGxvdGx5U2VydmljZSB9IGZyb20gJy4vaW1wbGVtZW50YXRpb25zL3Bsb3RseS9wbG90bHkuc2VydmljZSc7XG5pbXBvcnQgeyBPcGVuU2VhZHJhZ29uVmlzdWFsaXplclNlcnZpY2UgfSBmcm9tICcuL2ltcGxlbWVudGF0aW9ucy9vc2Qvb3BlbnNlYWRyYWdvbi12aXN1YWxpemVyLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgUGxvdFR5cGUsXG4gIFBsb3RUeXBlRGVzY3JpcHRvcixcbiAgaXNOYXBhcmkzZCxcbiAgaXNOYXBhcmlTY2F0dGVyLFxuICBpc1NwYXRpYWxPbWljcyxcbiAgaXNTcGF0aWFsT21pY3MzZCxcbiAgaXNOYXBhcmlJc29zdXJmYWNlLFxuICBpc05hcGFyaVZvbHVtZSxcbn0gZnJvbSAnLi9jb250cmFjdHMvcGxvdC10eXBlJztcbmltcG9ydCB7XG4gIElWaWV3ZXJCYWNrZW5kLFxuICBJVmlzdWFsaXplcixcbiAgTG9hZGVkSW1hZ2UsXG4gIFBpeGVsRGF0YSxcbiAgSW50ZW5zaXR5UHJvZmlsZSxcbiAgSUlzb3N1cmZhY2VDb250cm9scyxcbiAgSUludGVuc2l0eUNvbnRyb2xzLFxuICBJU3VyZmFjZTNkQ29udHJvbHMsXG4gIElTcGF0aWFsQ29udHJvbHMsXG4gIElJbnRlbnNpdHlTYW1wbGluZyxcbiAgSU9zZFZpZXdPcHRpb25zLFxuICBJVm9sdW1lUmVzb2x1dGlvbixcbn0gZnJvbSAnLi9jb250cmFjdHMvdmlzdWFsaXplci5jb250cmFjdCc7XG5pbXBvcnQgeyBTUEFUSUFMX0RBVEFfUE9SVCwgU3BhdGlhbERhdGFQb3J0IH0gZnJvbSAnLi9jb250cmFjdHMvcG9ydHMvc3BhdGlhbC1kYXRhLnBvcnQnO1xuaW1wb3J0IHsgQ2FudmFzVG9vbE9wdGlvbnMsIENvbG9ybWFwTm9kZSwgSUJydXNoT3B0aW9ucywgSVdhbmRPcHRpb25zIH0gZnJvbSAnLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBTcGF0aWFsQ29udHJvbHNGYWNhZGUgfSBmcm9tICcuL3NwYXRpYWwvc3BhdGlhbC1jb250cm9scy5mYWNhZGUnO1xuaW1wb3J0IHsgUmVnaW9uU3RvcmUgfSBmcm9tICcuL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlZ2lvblNjb3BlQ2FjaGUgfSBmcm9tICcuL3N0b3JlL3JlZ2lvbi1zY29wZS1jYWNoZSc7XG5pbXBvcnQgeyBSRUdJT05fU09VUkNFX01JTl9DSEFSUywgUmVnaW9uU291cmNlLCBSZWdpb25Tb3VyY2VWaWV3IH0gZnJvbSAnLi9yZWdpb24tc291cmNlL3JlZ2lvbi1zb3VyY2UnO1xuaW1wb3J0IHR5cGUgeyBSZWdpb25JbmRleFBhZ2UsIFJlZ2lvbkluZGV4UXVlcnkgfSBmcm9tICcuL3JlZ2lvbi1zb3VyY2UvcmVnaW9uLXRpbGVzJztcbmltcG9ydCB0eXBlIHsgUmVnaW9uU3R5bGUgfSBmcm9tICcuL3JlZ2lvbi1vdmVybGF5L3JlZ2lvbi1zdHlsZSc7XG5pbXBvcnQgdHlwZSB7IE1lc2ggfSBmcm9tICduYXBhcmktanMvZ2VvbWV0cnknO1xuaW1wb3J0IHsgb3Blbkdlb0pzb25SZWdpb25Tb3VyY2UgfSBmcm9tICcuL3JlZ2lvbi1zb3VyY2Uvd29ya2VyLXJlZ2lvbi1zb3VyY2UnO1xuaW1wb3J0IHR5cGUgeyBSZWdpb25Tb3VyY2VPcGVuZXIsIFJlZ2lvblNvdXJjZVNsaWNlcyB9IGZyb20gJy4vc3RvcmUvcmVnaW9uLXNvdXJjZS1zY29wZSc7XG5pbXBvcnQgeyBTcGF0aWFsU2VsZWN0aW9uU3RvcmUgfSBmcm9tICcuL3N0b3JlL3NwYXRpYWwtc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmlld2VyQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi9jb250cmFjdHMvY2FwYWJpbGl0aWVzLmNvbnRyYWN0JztcbmltcG9ydCB7IElSZWdpb25PdmVybGF5IH0gZnJvbSAnLi9jb250cmFjdHMvcmVnaW9uLW92ZXJsYXkuY29udHJhY3QnO1xuaW1wb3J0IHsgSVJlZ2lvbkVkaXRvckFwaSB9IGZyb20gJy4vY29udHJhY3RzL3JlZ2lvbi1lZGl0b3ItYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IElDaGFubmVsSGlzdG9ncmFtQXBpLCBJQ2hhbm5lbFN0YXRlLCBJSGlzdG9ncmFtIH0gZnJvbSAnLi9jb250cmFjdHMvY2hhbm5lbC1oaXN0b2dyYW0tYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IGF1dG9XaW5kb3dGcm9tSGlzdG9ncmFtIH0gZnJvbSAnLi9jb250cmFjdHMvaW50ZW5zaXR5JztcbmltcG9ydCB7IFZpc3VhbGl6ZXJTdG9yZSB9IGZyb20gJy4vc3RvcmUvdmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlIH0gZnJvbSAnLi9pbXBsZW1lbnRhdGlvbnMvbmFwYXJpLWpzL25hcGFyaS12aXN1YWxpemVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgY2hhbm5lbFRpbnRDb2xvcm1hcCwgdm9sdW1lQ29sb3JtYXAgfSBmcm9tICcuL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLWRpc3BsYXktc3RhdGUnO1xuaW1wb3J0IHsgVklaX0NPTkZJRywgVml6Q29uZmlnIH0gZnJvbSAnLi9jb250cmFjdHMvdml6LWNvbmZpZyc7XG5pbXBvcnQgeyBQbG90TW9kZVZpZXdwb3J0IH0gZnJvbSAnLi9jb250cmFjdHMvcGxvdC10eXBlLWNvbnRyaWJ1dGlvbi5jb250cmFjdCc7XG5pbXBvcnQgeyBJbnRlbnNpdHlQcm9maWxlU2VydmljZSB9IGZyb20gJy4vaW50ZW5zaXR5L2ludGVuc2l0eS1wcm9maWxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgY2hhbmdlZENsYXNzZXMsIGNsYXNzU2lnbmF0dXJlcyB9IGZyb20gJy4vc3RvcmUvY2xhc3Mtc2lnbmF0dXJlcyc7XG5pbXBvcnQgeyBWb2x1bWVTZWN0aW9ucyB9IGZyb20gJy4vdmlzdWFsaXplci92b2x1bWUtc2VjdGlvbnMnO1xuaW1wb3J0IHR5cGUgeyBTZWN0aW9uQXhpcywgU2VjdGlvblZpZXdzIH0gZnJvbSAnLi9jb250cmFjdHMvc2VjdGlvbi12aWV3LmNvbnRyYWN0JztcblxuLyoqIEhvdyBsb25nIGFmdGVyIHRoZSBsYXN0IGVkaXQgdGhlIHN1cmZhY2VzIG9mIHRoZSBjbGFzc2VzIGl0IHRvdWNoZWQgYXJlIHJlYnVpbHQgKG1zKS4gKi9cbmV4cG9ydCBjb25zdCBSRUdJT05fU1VSRkFDRV9SRUJVSUxEX01TID0gNjAwO1xuXG4vKiogSW50ZW5zaXR5LXByb2ZpbGUgbGluZSBST0lzIGFyZSBvd25lZCBieSB0aGUgaW50ZW5zaXR5IHRvb2wsIG5vdCB0aGUgZWRpdG9yLlxuICogIFBhY2thZ2UtaW50ZXJuYWwgcHJlZGljYXRlIChwcm9wZXJ0eS1iYXNlZCBzbyBpdCBhbHNvIG1hdGNoZXMgcGxhaW4gb2JqZWN0c1xuICogIGFmdGVyIGEgZHJhZyByb3VuZC10cmlwKS4gKi9cbmZ1bmN0aW9uIGlzUHJvZmlsZVJlZ2lvbihyOiB7IGtpbmQ/OiBzdHJpbmcgfSB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHI/LmtpbmQgPT09ICdwcm9maWxlJztcbn1cblxuLyoqXG4gKiBUaGUgdmlzdWFsaXplciBjaGFpbidzIGZyb250IGRvb3I6IGltcGxlbWVudHMgYElWaXN1YWxpemVyYCwgYElSZWdpb25FZGl0b3JBcGlgXG4gKiBhbmQgYElDaGFubmVsSGlzdG9ncmFtQXBpYCAoYm91bmQgdG8gdGhlIGBWSVNVQUxJWkVSYCAvIGBSRUdJT05fRURJVE9SX0FQSWAgL1xuICogYENIQU5ORUxfSElTVE9HUkFNX0FQSWAgdG9rZW5zKSBvdmVyIHRocmVlIHJlbmRlcmluZyBiYWNrZW5kcywgY2hvc2VuIHBlciBwbG90IHR5cGU6XG4gKiAgLSAqKkltYWdlKiogcmVuZGVycyB0aHJvdWdoIE9wZW5TZWFkcmFnb24gKG5hdGl2ZWx5IHRpbGVkLCByZWdpb24gdG9vbHMsXG4gKiAgICBjbGllbnQtc2lkZSBjb2xvcm1hcCksIG9yIHRocm91Z2ggbmFwYXJpLWpzIHdoZW4gYFZpekNvbmZpZy51c2VOYXBhcmlSZW5kZXJlcmBcbiAqICAgIG9wdHMgaW47IHRoZSBuYXBhcmkgaW1hZ2UgdHlwZXMgYW5kIHRoZSAyRCBzcGF0aWFsLW9taWNzIG1vZGUgcmVuZGVyIHRocm91Z2hcbiAqICAgIG5hcGFyaS1qcy4gQSBmYWlsZWQgbG9hZCBmYWxscyBiYWNrIG5hcGFyaS1qcyDihpIgT1NEIOKGkiBQbG90bHkgZm9yIHRoYXQgaW1hZ2Ugb25seVxuICogICAgKHNlZSBgbmFwYXJpRmVsbEJhY2tgIC8gYG9zZEZlbGxCYWNrYCwgY2xlYXJlZCBieSBgcmVzZXQoKWApLlxuICogIC0gdGhlIG5hcGFyaSAzRCB0eXBlcyAodm9sdW1lLCBpc29zdXJmYWNlLCBzdXJmYWNlLCAzRCBzY2F0dGVyLCB0aGUgM0Qgc3BhdGlhbFxuICogICAgY2xvdWQpIHJlbmRlciB0aHJvdWdoIG5hcGFyaS1qcywgZmFsbGluZyBiYWNrIHRvIFBsb3RseS5cbiAqICAtIGV2ZXJ5IG90aGVyIHBsb3QgdHlwZSAoaGVhdG1hcCwgY29udG91ciwgc3VyZmFjZSwgc2NhdHRlciwgbGluZSwg4oCmKSByZW5kZXJzXG4gKiAgICB0aHJvdWdoIFBsb3RseS5cbiAqXG4gKiBPbmx5IHJlbmRlcmluZyBhbmQgdGhlIHZpZXdwb3J0IGFyZSByb3V0ZWQgdG8gdGhlIGJhY2tlbmQgb24gc2NyZWVuLiBSZWdpb24gc3RhdGVcbiAqIGxpdmVzIGluIHRoZSBzaGFyZWQgYFJlZ2lvblN0b3JlYCBhbmQgZGlzcGxheSBzdGF0ZSAoY29sb3JtYXAsIGNoYW5uZWxzLCBwcmVzZXRzLFxuICogc3BhdGlhbCB2aWV3KSBpbiB0aGUgc2hhcmVkIGBWaXN1YWxpemVyU3RvcmVgLCBzbyBldmVyeSBiYWNrZW5kIHNlZXMgdGhlIHNhbWVcbiAqIHZhbHVlczsgdGhlIGJhY2tlbmRzIHN1YnNjcmliZSB0byB0aGVtIHRvIHJlZHJhdy5cbiAqXG4gKiBQYWNrYWdlLWludGVybmFsOiBob3N0cyBkZXBlbmQgb24gdGhlIHRva2Vucywgbm90IG9uIHRoaXMgY2xhc3MuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgUm91dGluZ1Zpc3VhbGl6ZXJTZXJ2aWNlIGltcGxlbWVudHMgSVZpc3VhbGl6ZXIsIElSZWdpb25FZGl0b3JBcGksIElDaGFubmVsSGlzdG9ncmFtQXBpLCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIGN1cnJlbnRQbG90VHlwZTogUGxvdFR5cGUgPSBQbG90VHlwZS5JTUFHRTtcbiAgcHJpdmF0ZSBsYXN0UmVuZGVyZWQ6IElWaWV3ZXJCYWNrZW5kIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBPU0QgZmFpbGVkIGZvciB0aGUgKmN1cnJlbnQqIHJlbmRlciBjeWNsZSAoZS5nLiBhIGZyZXNoIGZpbGUgc3RpbGwgY2FjaGluZ1xuICAgKiAgcGFzdCB0aGUgZGVhZGxpbmUpIOKGkiBmYWxsIGJhY2sgdG8gUGxvdGx5IGZvciB0aGlzIGltYWdlIG9ubHkuIFJlc2V0IGJ5XG4gICAqICByZXNldCgpIGF0IHRoZSBzdGFydCBvZiBldmVyeSByZW5kZXIgY3ljbGUsIHNvIHRoZSBuZXh0IGZpbGUg4oCUIG9yIGFcbiAgICogIHJlLXNlbGVjdCBvbmNlIHRoZSBmaWxlIGlzIGNhY2hlZCDigJQgcmV0cmllcyBPU0QuIChXYXMgYSBwZXJtYW5lbnQgZmxhZyxcbiAgICogIHdoaWNoIGxlZnQgdGhlIHdob2xlIHNlc3Npb24gc3R1Y2sgb24gUGxvdGx5IGFmdGVyIG9uZSBzbG93IGxvYWQuKSAqL1xuICBwcml2YXRlIG9zZEZlbGxCYWNrID0gZmFsc2U7XG4gIC8qKiBuYXBhcmktanMgZmFpbGVkIGZvciB0aGUgY3VycmVudCByZW5kZXIgY3ljbGUg4oaSIGZhbGwgYmFjayB0byBPU0QgKHRoZW4gUGxvdGx5KS5cbiAgICogIFJlc2V0IGJ5IHJlc2V0KCkgYXQgdGhlIHN0YXJ0IG9mIGV2ZXJ5IGN5Y2xlLCBsaWtlIHtAbGluayBvc2RGZWxsQmFja30uICovXG4gIHByaXZhdGUgbmFwYXJpRmVsbEJhY2sgPSBmYWxzZTtcbiAgLyoqIFRoZSBmaWxlIG5hbWUgb2YgdGhlIGltYWdlIGxhc3QgcGxvdHRlZCAobmFtZXMgYSBHZW9KU09OIGV4cG9ydCkuICovXG4gIHByaXZhdGUgcGxvdHRlZEZpbGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGUgZGl2IHRoZSBiYWNrZW5kcyByZW5kZXIgaW50byAoZXZlcnkgYmFja2VuZCBzaGFyZXMgaXQpOyAnJyBiZWZvcmUgdGhlIGZpcnN0IHBsb3QuICovXG4gIHByaXZhdGUgcGxvdERpdiA9ICcnO1xuICAvKipcbiAgICogV2hldGhlciByZWdpb25zIGNhbiBiZSBzaG93biBpbiAzRCBvbiBzY3JlZW46IGEgbmFwYXJpIHZvbHVtZSAob3IgaXNvc3VyZmFjZSkgdmlldywgb3IgdGhlIDNEXG4gICAqIHNwYXRpYWwgY2xvdWQgb3ZlciBhIHN0YWNrIGltYWdlIChpdHMgcmVmZXJlbmNlIHZvbHVtZSdzLCBzZWUgc2hvd1ZvbHVtZUFzSW1hZ2UpLiBCb3RoIGRyYXcgdGhlXG4gICAqIHJlZ2lvbiByZWNvbnN0cnVjdGlvbnMgdGhlIHNhbWUgd2F5IChWb2x1bWVSZWdpb25NZXNoZXMpLCBpbiB0aGUgdm9sdW1lJ3MgYm94LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSB2b2x1bWVWaWV3JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKiogV2hldGhlciBhIG5hcGFyaSB2b2x1bWUgKG9yIGlzb3N1cmZhY2UpIHZpZXcgaXMgdGhlIGN1cnJlbnQgcGxvdCB0eXBlOiB0aGUgc2xpY2UgcGFuZSdzLiAqL1xuICBwcml2YXRlIGltYWdlVm9sdW1lVmlldyA9IGZhbHNlO1xuICAvKiogV2hldGhlciB0aGUgdm9sdW1lIHZpZXcncyBzbGljZSBwYW5lIGlzIHdhbnRlZCAoc2VlIHtAbGluayBzZXRTbGljZUVkaXRvcn0pLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNsaWNlRWRpdG9yJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKiogV2hldGhlciB0aGUgdm9sdW1lIHZpZXcgZHJhd3MgdGhlIHJlZ2lvbiByZWNvbnN0cnVjdGlvbnMgdGhyb3VnaCB0aGUgdm9sdW1lLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lvbnNUaHJvdWdoVm9sdW1lJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKiogUmVnaW9uIHJlY29uc3RydWN0aW9ucyBidWlsdCBzbyBmYXIsIGJ5IGltYWdlLCByZXNvbHV0aW9uIGFuZCBjbGFzc2VzICh3aXRoIHRob3NlIGNsYXNzZXMpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG1lc2hDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCB7IG1lc2g6IE1lc2g7IGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdIH0+KCk7XG4gIC8qKiBCdW1wZWQgcGVyIHtAbGluayBzaG93UmVnaW9uQ2xhc3NlczNkfSAoYW5kIHBlciBuZXcgaW1hZ2UpLCBzbyBvbmx5IHRoZSBsYXRlc3Qgb25lIHNob3dzLiAqL1xuICBwcml2YXRlIG1lc2hSZXF1ZXN0ID0gMDtcbiAgLyoqIFRoZSBjbGFzcyBncm91cHMgc2hvd24gaW4gM0QsIGFuZCB0aGUgaW1hZ2UgdGhleSBiZWxvbmcgdG8uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY2xhc3NlczNkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UmVhZG9ubHlBcnJheTx7IGtleTogc3RyaW5nOyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSB9Pj4oXG4gICAgW10sXG4gICk7XG4gIHByaXZhdGUgY2xhc3NlczNkSW1hZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIFRoZSBncm91cHMgbGFzdCBhc2tlZCBmb3IgaW4gM0QsIHdpdGggdGhlaXIgY29sb3Vyczogd2hhdCBhbiBlZGl0J3MgcmVidWlsZCBzaG93cyBhZ2Fpbi4gKi9cbiAgcHJpdmF0ZSBzaG93bjNkOiBSZWFkb25seUFycmF5PHsga2V5OiBzdHJpbmc7IGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdOyBjb2xvcjogc3RyaW5nOyBsYWJlbD86IHN0cmluZyB9PiA9IFtdO1xuICAvKipcbiAgICogRWFjaCBjbGFzcydzIGZpbmdlcnByaW50IG9uIHRoZSBsaXZlIHNsaWNlIChzZWUgY2xhc3NTaWduYXR1cmVzKSwgd2hpY2ggaW1hZ2UgYW5kIHNsaWNlLCBhbmRcbiAgICogd2hhdCB0aGUgcmVnaW9uIHNvdXJjZXMgaG9sZCAoc2VlIFJlZ2lvblN0b3JlLmdldFNvdXJjZVN0YXRlS2V5KS4gTnVsbCB3aGlsZSBub3RoaW5nIGZvbGxvd3NcbiAgICogdGhlIGVkaXRzIChubyBzdXJmYWNlIGJ1aWx0LCBubyBzZWN0aW9ucykuXG4gICAqL1xuICBwcml2YXRlIGxpdmVDbGFzc2VzOiB7IGF0OiBzdHJpbmc7IHNpZ25hdHVyZXM6IE1hcDxzdHJpbmcsIG51bWJlcj47IHNvdXJjZXM6IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XG4gIC8qKiBUaGUgcGVuZGluZyByZWJ1aWxkIG9mIHRoZSBzdXJmYWNlcyBhbiBlZGl0IHRvdWNoZWQuICovXG4gIHByaXZhdGUgcmVidWlsZFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lvblVwZGF0ZXM6IFN1YnNjcmlwdGlvbjtcblxuICAvLyDilIDilIAgVGhlIHNsaWNlIHBhbmUgKHRoZSB2b2x1bWUgdmlldydzIHNwbGl0KTogT1NEIGVkaXRpbmcgb25lIHNsaWNlIGJlc2lkZSB0aGUgM0QgdmlldyDilIDilIBcbiAgLyoqIFRoZSBkaXYgdGhlIHNsaWNlIHBhbmUgcmVuZGVycyBpbnRvIHdoaWxlIGl0IGlzIHdhbnRlZCAobnVsbDogbm8gc3BsaXQpLiAqL1xuICBwcml2YXRlIHNsaWNlRGl2OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgLyoqIFdoZXRoZXIgT1NEIGlzIG1vdW50ZWQgaW4gdGhlIHNsaWNlIHBhbmU6IHJlZ2lvbiwgdG9vbCBhbmQgb3ZlcmxheSBjYWxscyBnbyB0byBpdC4gKi9cbiAgcHJpdmF0ZSBzbGljZU1vdW50ZWQgPSBmYWxzZTtcbiAgLyoqIFRoZSBpbWFnZSB0aGUgc2xpY2UgcGFuZSBzaG93cy4gKi9cbiAgcHJpdmF0ZSBzbGljZUZpbGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIEJ1bXBlZCBwZXIgc2xpY2UtcGFuZSBtb3VudCBvciB0ZWFyZG93biwgc28gb25seSB0aGUgbGF0ZXN0IG9uZSBsYW5kcy4gKi9cbiAgcHJpdmF0ZSBzbGljZVJlcXVlc3QgPSAwO1xuICAvKiogVGhlIHNlY3Rpb25zIGJlc2lkZSB0aGUgc3BsaXQgdm9sdW1lIHZpZXcgKHRoZSBwbGFuZXMgeCBhbmQgeSB0aHJvdWdoIHRoZSBzdGFjaykuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VjdGlvbnM6IFZvbHVtZVNlY3Rpb25zO1xuICAvKiogVGhlIHogcGxhbmUgZHJhZ2dlZCBpbiB0aGUgdm9sdW1lOiB0aGUgc2xpY2UgdG8gc2hvdyAoc2VlIHtAbGluayBnZXRTbGljZURyYWckfSkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2xpY2VEcmFnJCA9IG5ldyBTdWJqZWN0PG51bWJlcj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZWN0aW9uU3VicyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgLyoqIFRoZSBpbWFnZSBpbmZvIGFuZCBzY3JlZW4gaGVpZ2h0IG9mIHRoZSBsYXN0IHBsb3QgKHdoYXQgdGhlIHNsaWNlIHBhbmUgbW91bnRzKS4gKi9cbiAgcHJpdmF0ZSBwbG90dGVkSW5mbzogSUltYWdlSW5mbyB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIGN1cnJlbnQgcmVnaW9uIGltcG9ydCAoc2VlIHJlZ2lvbkltcG9ydFRpY2tldCk6IGl0cyBpZCBhbmQgdGhlIGltYWdlIGl0IHdhcyB0YWtlbiBmb3IuICovXG4gIHByaXZhdGUgaW1wb3J0VGlja2V0OiB7IGlkOiBudW1iZXI7IGltYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQgfSA9IHsgaWQ6IDAsIGltYWdlOiB1bmRlZmluZWQgfTtcbiAgcHJpdmF0ZSBwbG90dGVkSGVpZ2h0ID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHBsb3RseTogUGxvdGx5U2VydmljZSxcbiAgICBwcml2YXRlIG9zZDogT3BlblNlYWRyYWdvblZpc3VhbGl6ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgbmFwYXJpOiBOYXBhcmlWaXN1YWxpemVyU2VydmljZSxcbiAgICBwcml2YXRlIHN0b3JlOiBWaXN1YWxpemVyU3RvcmUsXG4gICAgQEluamVjdChWSVpfQ09ORklHKSBwcml2YXRlIGNvbmZpZzogVml6Q29uZmlnLFxuICAgIC8vIE9wdGlvbmFsOiBhIGhvc3QgdGhhdCBzZXJ2ZXMgbm8gc3BhdGlhbC1vbWljcyBkYXRhIGJpbmRzIG5vdGhpbmcsXG4gICAgLy8gYW5kIGBnZXRTcGF0aWFsQ29udHJvbHMoKWAgdGhlbiByZXR1cm5zIG51bGwuXG4gICAgcHJpdmF0ZSByZWdpb25TdG9yZTogUmVnaW9uU3RvcmUsXG4gICAgcHJpdmF0ZSBzZWxlY3Rpb25TdG9yZTogU3BhdGlhbFNlbGVjdGlvblN0b3JlLFxuICAgIHByaXZhdGUgaW50ZW5zaXR5OiBJbnRlbnNpdHlQcm9maWxlU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKVxuICAgIEBJbmplY3QoU1BBVElBTF9EQVRBX1BPUlQpXG4gICAgcHJpdmF0ZSBzcGF0aWFsRGF0YTogU3BhdGlhbERhdGFQb3J0IHwgbnVsbCA9IG51bGwsXG4gICkge1xuICAgIHRoaXMucmVnaW9uVXBkYXRlcyA9IHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vblJlZ2lvbnNDaGFuZ2VkKCkpO1xuICAgIHRoaXMuc2VjdGlvbnMgPSBuZXcgVm9sdW1lU2VjdGlvbnMoe1xuICAgICAgdm9sdW1lOiAoKSA9PiB0aGlzLm5hcGFyaS52b2x1bWVWb3hlbHMoKSxcbiAgICAgIGltYWdlOiAoKSA9PiB0aGlzLnBsb3R0ZWRGaWxlTmFtZSxcbiAgICAgIHNob3dQbGFuZXM6IChwbGFuZXMpID0+IHRoaXMubmFwYXJpLnNldFNsaWNlUGxhbmVzKHBsYW5lcyksXG4gICAgICBvdXRsaW5lc0J5Q2xhc3M6IChsZXZlbCkgPT4gdGhpcy5yZWdpb25TdG9yZS5vdXRsaW5lc0J5Q2xhc3MobGV2ZWwpLFxuICAgICAgaXNDbGFzc0hpZGRlbjogKGxhYmVsKSA9PiB0aGlzLnJlZ2lvblN0b3JlLmlzQ2xhc3NIaWRkZW4obGFiZWwpLFxuICAgICAgY29sb3JPZjogKGxhYmVsKSA9PiB0aGlzLmNsYXNzQ29sb3IobGFiZWwpLFxuICAgICAgY2hhbm5lbFN0YXRlczogKCkgPT4gdGhpcy5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpLFxuICAgICAgY29sb3JtYXA6IChzdCwgbXVsdGljaGFubmVsKSA9PiB7XG4gICAgICAgIC8vIEFzIHRoZSB2b2x1bWUgc2NlbmUgY29sb3VycyB0aGUgY2hhbm5lbCAoaW52ZXJ0IGlzIGFwcGxpZWQgYmVmb3JlIHRoZSBjb2xvcm1hcCkuXG4gICAgICAgIGNvbnN0IGRpc3BsYXkgPSB7XG4gICAgICAgICAgY29sb3JtYXA6IHRoaXMuc3RvcmUuY3VycmVudENvbG9ybWFwKCksXG4gICAgICAgICAgcmV2ZXJzZTogdGhpcy5zdG9yZS5jdXJyZW50UmV2ZXJzZVNjYWxlKCksXG4gICAgICAgICAgaW52ZXJ0OiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVDb2xvcm1hcChcbiAgICAgICAgICBtdWx0aWNoYW5uZWwgPyBjaGFubmVsVGludENvbG9ybWFwKHN0Py5jb2xvciA/PyAnI2ZmZmZmZicsIGRpc3BsYXkpIDogdm9sdW1lQ29sb3JtYXAoc3QsIGRpc3BsYXkpLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGludmVydDogKCkgPT4gdGhpcy5zdG9yZS5jdXJyZW50SW52ZXJ0KCksXG4gICAgICBzbGljZTogKCkgPT4gdGhpcy5jdXJyZW50WkluZGV4LFxuICAgIH0pO1xuICAgIC8vIEEgcGxhbmUgZHJhZ2dlZCBpbiB0aGUgdm9sdW1lOiB0aGUgeiBwbGFuZSBwaWNrcyB0aGUgc2xpY2UgKHRocm91Z2ggdGhlIGhvc3QncyBzbGlkZXIsIHNvXG4gICAgLy8gdGhlIHN0b3JlIGFuZCB0aGUgc2xpY2UgcGFuZSBmb2xsb3cpLCB0aGUgb3RoZXJzIG1vdmUgdGhlaXIgc2VjdGlvbi5cbiAgICB0aGlzLnNlY3Rpb25TdWJzLmFkZChcbiAgICAgIHRoaXMubmFwYXJpLmdldFNsaWNlUGxhbmVNb3ZlJCgpLnN1YnNjcmliZSgoeyBheGlzLCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgIGlmIChheGlzID09PSAneicpIHRoaXMuc2xpY2VEcmFnJC5uZXh0KE1hdGgucm91bmQodmFsdWUpKTtcbiAgICAgICAgZWxzZSB0aGlzLnNlY3Rpb25zLnNldFBsYW5lKGF4aXMsIHZhbHVlKTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgdGhpcy5zZWN0aW9uU3Vicy5hZGQodGhpcy5zdG9yZS5nZXRDaGFubmVsU3RhdGVzKCkuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKSkpO1xuICAgIHRoaXMuc2VjdGlvblN1YnMuYWRkKHRoaXMuc3RvcmUuZ2V0SW52ZXJ0KCkuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKSkpO1xuICAgIHRoaXMuc2VjdGlvblN1YnMuYWRkKHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zZWN0aW9ucy5zY2hlZHVsZSgpKSk7XG4gICAgdGhpcy5zZWN0aW9uU3Vicy5hZGQodGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zZWN0aW9ucy5zY2hlZHVsZSgpKSk7XG4gIH1cblxuICAvKiogQSBjbGFzcydzIGNvbG91cjogaXRzIGNsYXNzaWZpY2F0aW9uIGNvbG91ciwgZWxzZSBpdHMgcmVnaW9uIHNvdXJjZSdzLCBlbHNlIGEgZGVmYXVsdC4gKi9cbiAgcHJpdmF0ZSBjbGFzc0NvbG9yKGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnN0b3JlLmdldENsYXNzaWZpY2F0aW9uQ29sb3JzKCkuZ2V0KGxhYmVsKSA/P1xuICAgICAgdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25Tb3VyY2VWaWV3KCk/LmNvbG9yT2YoeyBsYWJlbCwgY29sb3I6IG51bGwgfSkgPz9cbiAgICAgICcjZmZjYzAwJ1xuICAgICk7XG4gIH1cblxuICAvKiogVGhlIHNlY3Rpb25zIGJlc2lkZSB0aGUgc3BsaXQgdm9sdW1lIHZpZXcgKG51bGxzIHdoaWxlIGl0IGlzIG5vdCBzcGxpdCkuICovXG4gIGdldFNlY3Rpb25WaWV3cyQoKTogT2JzZXJ2YWJsZTxTZWN0aW9uVmlld3M+IHtcbiAgICByZXR1cm4gdGhpcy5zZWN0aW9ucy5nZXRWaWV3cyQoKTtcbiAgfVxuXG4gIC8qKiBNb3ZlIGEgc2VjdGlvbidzIHBsYW5lIHRvIGBhdGAgKGltYWdlIHB4KS4gKi9cbiAgc2V0U2VjdGlvblBsYW5lKGF4aXM6IFNlY3Rpb25BeGlzLCBhdDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZWN0aW9ucy5zZXRQbGFuZShheGlzLCBhdCk7XG4gIH1cblxuICAvKiogVGhlIHNsaWNlIHBpY2tlZCBieSBkcmFnZ2luZyB0aGUgeiBwbGFuZSBpbiB0aGUgdm9sdW1lOiB0aGUgaG9zdCBzaG93cyBpdCAoaXRzIHNsaWRlcikuICovXG4gIGdldFNsaWNlRHJhZyQoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5zbGljZURyYWckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0ltYWdlVHlwZSh0OiBQbG90VHlwZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0ID09PSBQbG90VHlwZS5JTUFHRTtcbiAgfVxuXG4gIC8qKiBUaGUgMkQgbmFwYXJpIHR5cGVzIChpbWFnZSwgcmVnaW9uLWNlbnRyb2lkIHNjYXR0ZXIsIHNwYXRpYWwgb21pY3MpIOKAlCBhIDJEIGZhbGxiYWNrIGNoYWluXG4gICAqICAoT1NELCB0aGVuIFBsb3RseSkuXG4gICAqXG4gICAqICBOT1RFIGZvciBTUEFUSUFMX09NSUNTOiBvbmx5IG5hcGFyaS1qcyBkcmF3cyB0aGUgb2JzZXJ2YXRpb24gbWFya2Vycy4gSWYgaXQgZmFpbHMgKG5vIFdlYkdQVSxcbiAgICogIGRldmljZSBsb3NzKSB0aGUgZmFsbGJhY2sgcmVuZGVycyB0aGUgdGlzc3VlIGltYWdlIEFMT05FIOKAlCB0aGUgc3BhdGlhbCBsYXllciBpcyBhYnNlbnQsIG5vdFxuICAgKiAgZGVncmFkZWQuIFRoYXQgaXMgZGVsaWJlcmF0ZSBmb3Igbm93OiBzaG93aW5nIHRoZSBzbGlkZSBiZWF0cyBzaG93aW5nIG5vdGhpbmcsIGFuZCBhIFBsb3RseVxuICAgKiAgYHNjYXR0ZXJnbGAgc3BhdGlhbCBtb2RlIGlzIHRoZSBwbGFubmVkIHJlYWwgZmFsbGJhY2sgKHNlZSB0aGUgcGxvdC1tb2RlIGRlc2lnbiBkb2MpLiAqL1xuICBwcml2YXRlIGlzTmFwYXJpSW1hZ2VUeXBlKHQ6IFBsb3RUeXBlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHQgPT09IFBsb3RUeXBlLk5BUEFSSV9JTUFHRSB8fCBpc05hcGFyaVNjYXR0ZXIodCkgfHwgaXNTcGF0aWFsT21pY3ModCk7XG4gIH1cblxuICAvKiogVGhlIDNEIG5hcGFyaSB0eXBlcyAodm9sdW1lL2lzb3N1cmZhY2Uvc3VyZmFjZS9zY2F0dGVyLCBwbHVzIHRoZSAzRCBzcGF0aWFsIGNsb3VkKSDigJQgbm8gMkRcbiAgICogIGZhbGxiYWNrIGV4aXN0cyAoT1NEIGlzIGltYWdlLW9ubHkpLCBzbyB0aGV5IGZhbGwgc3RyYWlnaHQgdG8gUGxvdGx5LiAqL1xuICBwcml2YXRlIGlzTmFwYXJpM2RUeXBlKHQ6IFBsb3RUeXBlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzTmFwYXJpM2QodCkgfHwgaXNTcGF0aWFsT21pY3MzZCh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCYWNrZW5kIHRvIGF0dGVtcHQgZm9yIHRoZSBjdXJyZW50IHBsb3QgdHlwZSB0aGlzIHJlbmRlci4gVGhlIGZhbGxiYWNrIGNoYWlucyBiZWxvdyBhcmVcbiAgICogbWlycm9yZWQgZXhhY3RseSBieSB7QGxpbmsgbG9hZH0gc28gdGhlIGhhbmRsZSBgcGxvdCgpYCByZWNlaXZlcyBhbHdheXMgY29tZXMgZnJvbSB0aGVcbiAgICogYmFja2VuZCBgcGxvdCgpYCBzZWxlY3RzIChubyBsb2FkL3Bsb3QgYmFja2VuZCBtaXNtYXRjaCk6XG4gICAqICAtIDJEIGltYWdlIChleHBsaWNpdCBgTkFQQVJJX0lNQUdFYCwgb3IgYElNQUdFYCB3aXRoIHRoZSBXZWJHUFUgb3B0LWluKTogbmFwYXJpLWpzIOKGkiBPU0Qg4oaSIFBsb3RseS5cbiAgICogIC0gcGxhaW4gYElNQUdFYCAobm8gb3B0LWluKTogT1NEIOKGkiBQbG90bHkuXG4gICAqICAtIDNEIG5hcGFyaSAoYE5BUEFSSV9WT0xVTUVgL2BOQVBBUklfSVNPU1VSRkFDRWApOiBuYXBhcmktanMg4oaSIFBsb3RseSAoT1NEIGNhbid0IHJlbmRlciAzRCkuXG4gICAqL1xuICBwcml2YXRlIGltYWdlQmFja2VuZCgpOiBJVmlld2VyQmFja2VuZCB7XG4gICAgY29uc3QgdCA9IHRoaXMuY3VycmVudFBsb3RUeXBlO1xuICAgIC8vIDJEIGltYWdlIHdpdGggYSBuYXBhcmktanMgYXR0ZW1wdCAoZXhwbGljaXQgbmFwYXJpIGltYWdlLCBvciBvcHQtaW4gb24gdGhlIEltYWdlIHR5cGUpLlxuICAgIGlmICh0aGlzLmlzTmFwYXJpSW1hZ2VUeXBlKHQpIHx8ICh0aGlzLmlzSW1hZ2VUeXBlKHQpICYmIHRoaXMuY29uZmlnLnVzZU5hcGFyaVJlbmRlcmVyKSkge1xuICAgICAgaWYgKCF0aGlzLm5hcGFyaUZlbGxCYWNrKSByZXR1cm4gdGhpcy5uYXBhcmk7XG4gICAgICBpZiAoIXRoaXMub3NkRmVsbEJhY2spIHJldHVybiB0aGlzLm9zZDtcbiAgICAgIHJldHVybiB0aGlzLnBsb3RseTtcbiAgICB9XG4gICAgLy8gUGxhaW4gSW1hZ2UgdHlwZSAobm8gbmFwYXJpIG9wdC1pbik6IE9TRCwgdGhlbiBQbG90bHkuXG4gICAgaWYgKHRoaXMuaXNJbWFnZVR5cGUodCkpIHtcbiAgICAgIHJldHVybiB0aGlzLm9zZEZlbGxCYWNrID8gdGhpcy5wbG90bHkgOiB0aGlzLm9zZDtcbiAgICB9XG4gICAgLy8gM0QgbmFwYXJpIHR5cGVzOiBuYXBhcmktanMsIHdpdGggUGxvdGx5IGFzIHRoZSBvbmx5IHZpYWJsZSBmYWxsYmFjay5cbiAgICBpZiAodGhpcy5pc05hcGFyaTNkVHlwZSh0KSkge1xuICAgICAgcmV0dXJuIHRoaXMubmFwYXJpRmVsbEJhY2sgPyB0aGlzLnBsb3RseSA6IHRoaXMubmFwYXJpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wbG90bHk7XG4gIH1cblxuICAvKiogQmFja2VuZCBjdXJyZW50bHkgb24gc2NyZWVuIOKAlCB3aGF0IG9uZ29pbmcgem9vbS90b29sL3JlZ2lvbiBvcHMgYWN0IG9uLiAqL1xuICBwcml2YXRlIHJlbmRlcmVyKCk6IElWaWV3ZXJCYWNrZW5kIHtcbiAgICByZXR1cm4gdGhpcy5sYXN0UmVuZGVyZWQgPz8gdGhpcy5wbG90bHk7XG4gIH1cblxuICAvKipcbiAgICogQmFja2VuZCByZWdpb24sIHRvb2wgYW5kIG92ZXJsYXkgY2FsbHMgYWN0IG9uOiB0aGUgc2xpY2UgcGFuZSdzIE9TRCB3aGlsZSB0aGUgdm9sdW1lIHZpZXcgaXNcbiAgICogc3BsaXQgKHJlZ2lvbnMgYXJlIGVkaXRlZCB0aGVyZSksIGVsc2UgdGhlIGJhY2tlbmQgb24gc2NyZWVuLiBWaWV3IGNhbGxzICh6b29tLCBmaXQsIGNvbG91cixcbiAgICogZXhwb3J0KSBzdGF5IHdpdGgge0BsaW5rIHJlbmRlcmVyfS5cbiAgICovXG4gIHByaXZhdGUgcmVnaW9uQmFja2VuZCgpOiBJVmlld2VyQmFja2VuZCB7XG4gICAgcmV0dXJuIHRoaXMuc2xpY2VNb3VudGVkID8gdGhpcy5vc2QgOiB0aGlzLnJlbmRlcmVyKCk7XG4gIH1cblxuICAvLyBTeXN0ZW0gY2FwYWJpbGl0aWVzIGFyZSBQbG90bHkncyAodGhlIGZ1bGwtZmVhdHVyZWQgYmFja2VuZCkgc28gdGhlIFVJXG4gIC8vIGtlZXBzIG9mZmVyaW5nIGV2ZXJ5IHBsb3QgdHlwZSByZWdhcmRsZXNzIG9mIHdoaWNoIG9uZSBpcyBvbiBzY3JlZW4uXG4gIGdldCBjYXBhYmlsaXRpZXMoKTogVmlld2VyQ2FwYWJpbGl0aWVzIHtcbiAgICByZXR1cm4gdGhpcy5wbG90bHkuY2FwYWJpbGl0aWVzO1xuICB9XG5cbiAgLy8g4pSA4pSAIHJlbmRlciAvIHZpZXdwb3J0IOKGkiBhY3RpdmUgcmVuZGVyZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGFzeW5jIGxvYWQoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlciwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPExvYWRlZEltYWdlPiB7XG4gICAgLy8gQSBzdGFjayBjYW4gb3BlbiBhd2F5IGZyb20gc2xpY2UgMCAoYGluaXRpYWxaSW5kZXhgIOKAlCBhIHZvbHVtZSBvcGVuc1xuICAgIC8vIG1pZC1zcGVjaW1lbiksIGFuZCB0aGF0IGFycml2ZXMgaGVyZSByYXRoZXIgdGhhbiB0aHJvdWdoIHNldFpJbmRleC5cbiAgICB0aGlzLmN1cnJlbnRaSW5kZXggPSB6SW5kZXg7XG4gICAgY29uc3QgYmFja2VuZCA9IHRoaXMuaW1hZ2VCYWNrZW5kKCk7XG4gICAgaWYgKGJhY2tlbmQgPT09IHRoaXMubmFwYXJpKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5uYXBhcmkubG9hZChpbWFnZUluZm8sIHpJbmRleCwgc2lnbmFsKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBBYm9ydGVkOiBub2JvZHkgd2FudHMgdGhpcyBpbWFnZSBhbnkgbW9yZSwgc28gZG9uJ3QgZ28gb24gdG8gbG9hZCBpdCBlbHNld2hlcmUuXG4gICAgICAgIGlmIChzaWduYWw/LmFib3J0ZWQpIHRocm93IGVycjtcbiAgICAgICAgdGhpcy5uYXBhcmlGZWxsQmFjayA9IHRydWU7XG4gICAgICAgIC8vIE1pcnJvciBpbWFnZUJhY2tlbmQoKSdzIGZhbGxiYWNrIHNvIGxvYWQgKyBwbG90IHBpY2sgdGhlIHNhbWUgYmFja2VuZDpcbiAgICAgICAgLy8gIC0gM0QgbmFwYXJpIHR5cGVzIGhhdmUgbm8gMkQgZmFsbGJhY2sg4oaSIHN0cmFpZ2h0IHRvIFBsb3RseS5cbiAgICAgICAgLy8gIC0gMkQgaW1hZ2Ug4oaSIE9TRCwgdGhlbiBQbG90bHkuXG4gICAgICAgIGlmICh0aGlzLmlzTmFwYXJpM2RUeXBlKHRoaXMuY3VycmVudFBsb3RUeXBlKSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybignW3Zpc3VhbGl6ZXJdIG5hcGFyaS1qcyBsb2FkIGZhaWxlZCDigJQgZmFsbGluZyBiYWNrIHRvIFBsb3RseS4nLCBlcnIpO1xuICAgICAgICAgIHJldHVybiB0aGlzLnBsb3RseS5sb2FkKGltYWdlSW5mbywgekluZGV4LCBzaWduYWwpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUud2FybignW3Zpc3VhbGl6ZXJdIG5hcGFyaS1qcyBsb2FkIGZhaWxlZCDigJQgZmFsbGluZyBiYWNrIHRvIE9wZW5TZWFkcmFnb24uJywgZXJyKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZFZpYU9zZFRoZW5QbG90bHkoaW1hZ2VJbmZvLCB6SW5kZXgsIHNpZ25hbCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChiYWNrZW5kID09PSB0aGlzLm9zZCkge1xuICAgICAgcmV0dXJuIHRoaXMubG9hZFZpYU9zZFRoZW5QbG90bHkoaW1hZ2VJbmZvLCB6SW5kZXgsIHNpZ25hbCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBsb3RseS5sb2FkKGltYWdlSW5mbywgekluZGV4LCBzaWduYWwpO1xuICB9XG5cbiAgLyoqIFRyeSBPU0Q7IG9uIGZhaWx1cmUgZmFsbCBiYWNrIHRvIFBsb3RseSBmb3IgdGhpcyBpbWFnZSAobm90IHBlcm1hbmVudCDigJQgc2VlIHJlc2V0KCkpLiAqL1xuICBwcml2YXRlIGFzeW5jIGxvYWRWaWFPc2RUaGVuUGxvdGx5KFxuICAgIGltYWdlSW5mbzogSUltYWdlSW5mbyxcbiAgICB6SW5kZXg6IG51bWJlcixcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxMb2FkZWRJbWFnZT4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5vc2QubG9hZChpbWFnZUluZm8sIHpJbmRleCwgc2lnbmFsKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChzaWduYWw/LmFib3J0ZWQpIHRocm93IGVycjtcbiAgICAgIGNvbnNvbGUud2FybignW3Zpc3VhbGl6ZXJdIE9wZW5TZWFkcmFnb24gbG9hZCBmYWlsZWQg4oCUIGZhbGxpbmcgYmFjayB0byBQbG90bHkgZm9yIHRoaXMgaW1hZ2UuJywgZXJyKTtcbiAgICAgIHRoaXMub3NkRmVsbEJhY2sgPSB0cnVlO1xuICAgICAgcmV0dXJuIHRoaXMucGxvdGx5LmxvYWQoaW1hZ2VJbmZvLCB6SW5kZXgsIHNpZ25hbCk7XG4gICAgfVxuICB9XG4gIHBsb3QoXG4gICAgcGxvdERpdjogc3RyaW5nLFxuICAgIGltYWdlTG9hZGVkOiB1bmtub3duLFxuICAgIGltYWdlSW5mbzogSUltYWdlSW5mbyxcbiAgICBzY3JlZW5IZWlnaHQ6IG51bWJlcixcbiAgICBwbG90VHlwZTogUGxvdFR5cGUsXG4gICAgaW5QbGFjZT86IGJvb2xlYW4sXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRoaXMuY3VycmVudFBsb3RUeXBlID0gcGxvdFR5cGU7XG4gICAgdGhpcy5wbG90dGVkRmlsZU5hbWUgPSBpbWFnZUluZm8/LmZpbGVOYW1lO1xuICAgIHRoaXMucGxvdHRlZEluZm8gPSBpbWFnZUluZm8gPz8gbnVsbDtcbiAgICB0aGlzLnBsb3R0ZWRIZWlnaHQgPSBzY3JlZW5IZWlnaHQ7XG4gICAgdGhpcy51cGRhdGVWb2x1bWVWaWV3KHBsb3RUeXBlKTtcbiAgICAvLyBUaGUgc2xpY2UgcGFuZSBiZWxvbmdzIHRvIHRoZSB2b2x1bWUgdmlldzogYW5vdGhlciBwbG90IHR5cGUgdGFrZXMgaXQgZG93biAoT1NEIG1heSBiZVxuICAgIC8vIGFib3V0IHRvIGRyYXcgdGhlIG1haW4gdmlldywgd2hpY2ggbXVzdCBub3QgZmluZCB0aGUgcGFuZSdzIHZpZXdlciBzdGlsbCBtb3VudGVkKS5cbiAgICBpZiAoIXRoaXMuaW1hZ2VWb2x1bWVWaWV3KSB0aGlzLnVubW91bnRTbGljZSgpO1xuICAgIC8vIFJlZ2lvbiBzdXJmYWNlcyBiZWxvbmcgdG8gdGhlIGltYWdlIHRoZXkgd2VyZSBidWlsdCBmcm9tOiBhbm90aGVyIGltYWdlIGRyb3BzIHRoZW0uXG4gICAgaWYgKHRoaXMuY2xhc3NlczNkJC52YWx1ZS5sZW5ndGggJiYgdGhpcy5wbG90dGVkRmlsZU5hbWUgIT09IHRoaXMuY2xhc3NlczNkSW1hZ2UpIHRoaXMuY2xlYXJSZWdpb25DbGFzc2VzM2QoKTtcbiAgICB0aGlzLnBsb3REaXYgPSBwbG90RGl2O1xuICAgIC8vIEFwcGx5IHRoZSBwZXItaW1hZ2UgcmVnaW9uIGNhY2hlIChzbmFwc2hvdCBvbGQgcmVnaW9ucywgcmVzdG9yZSB0aGUgbmV3XG4gICAgLy8gaW1hZ2UncywgY2xlYXIgc2VsZWN0aW9uKSBmb3Igd2hpY2hldmVyIGJhY2tlbmQgcmVuZGVycyDigJQgUGxvdGx5IGRvZXNcbiAgICAvLyB0aGlzIGluc2lkZSBpdHMgb3duIHBsb3QoKSwgYnV0IE9TRCBkb2Vzbid0LCBzbyBkcml2ZSBpdCBoZXJlLiBJZGVtcG90ZW50XG4gICAgLy8gZm9yIHRoZSBzYW1lIGltYWdlLCBzbyBpdCdzIHNhZmUgdG8gY2FsbCBvbiBldmVyeSAocmUpcGxvdC5cbiAgICB0aGlzLnBsb3RseS5zZXRBY3RpdmVJbWFnZShpbWFnZUluZm8pO1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLmltYWdlQmFja2VuZCgpO1xuICAgIC8vIEJvdGggYmFja2VuZHMgc2hhcmUgdGhlIHNhbWUgZGl2IOKAlCB0ZWFyIGRvd24gdGhlIG91dGdvaW5nIG9uZSBvbiBzd2l0Y2guXG4gICAgLy8gUGxvdGx5IG11c3QgYmUgKnB1cmdlZCogKG5vdCByZXNldCwgd2hpY2ggcmUtZHJhd3MgZW1wdHkgYXhlcykgYmVmb3JlIE9TRFxuICAgIC8vIHRha2VzIHRoZSBkaXYuXG4gICAgaWYgKHRoaXMubGFzdFJlbmRlcmVkICYmIHRoaXMubGFzdFJlbmRlcmVkICE9PSBuZXh0KSB7XG4gICAgICBpZiAodGhpcy5sYXN0UmVuZGVyZWQgPT09IHRoaXMucGxvdGx5KSB0aGlzLnBsb3RseS5wdXJnZVBsb3QoKTtcbiAgICAgIGVsc2UgdGhpcy5sYXN0UmVuZGVyZWQucmVzZXQoKTtcbiAgICB9XG4gICAgdGhpcy5sYXN0UmVuZGVyZWQgPSBuZXh0O1xuICAgIGNvbnN0IHBsb3R0ZWQgPSBuZXh0LnBsb3QocGxvdERpdiwgaW1hZ2VMb2FkZWQsIGltYWdlSW5mbywgc2NyZWVuSGVpZ2h0LCBwbG90VHlwZSwgaW5QbGFjZSk7XG4gICAgaWYgKCF0aGlzLnNsaWNlRGl2IHx8ICF0aGlzLmltYWdlVm9sdW1lVmlldykgcmV0dXJuIHBsb3R0ZWQ7XG4gICAgLy8gVGhlIHNwbGl0IHZvbHVtZSB2aWV3OiB0aGUgc2xpY2UgcGFuZSBmb2xsb3dzIHRoZSBpbWFnZSAoYSBuZXcgb25lLCBvciBpdHMgc2hhcnBlciBwYXNzKS5cbiAgICByZXR1cm4gcGxvdHRlZC50aGVuKChvaykgPT4ge1xuICAgICAgaWYgKG9rICYmICghdGhpcy5zbGljZU1vdW50ZWQgfHwgdGhpcy5zbGljZUZpbGUgIT09IGltYWdlSW5mbz8uZmlsZU5hbWUgfHwgaW5QbGFjZSkpIHtcbiAgICAgICAgdm9pZCB0aGlzLm1vdW50U2xpY2UoISFpblBsYWNlICYmIHRoaXMuc2xpY2VNb3VudGVkICYmIHRoaXMuc2xpY2VGaWxlID09PSBpbWFnZUluZm8/LmZpbGVOYW1lKTtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSB2b2x1bWUgd2FzIGFzc2VtYmxlZCBhZ2FpbiAoYW5vdGhlciBpbWFnZSwgb3IgcmVzb2x1dGlvbik6IGN1dCB0aGUgc2VjdGlvbnMgZnJvbSBpdC5cbiAgICAgIGlmIChvaykgdGhpcy5zZWN0aW9ucy5zY2hlZHVsZSgpO1xuICAgICAgcmV0dXJuIG9rO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0IHRoZSB2b2x1bWUgdmlldzogc2hvdyB0aGUgc2xpY2UgYmVpbmcgZWRpdGVkIGluIGBkaXZgIChPcGVuU2VhZHJhZ29uLCB3aXRoIGV2ZXJ5IHJlZ2lvblxuICAgKiB0b29sKSBiZXNpZGUgdGhlIDNEIHZpZXcsIG9yIHN0b3AgKG51bGwpLiBLZXB0IGFjcm9zcyByZS1wbG90cyBvZiBhIHZvbHVtZSB2aWV3OyBhbm90aGVyIHBsb3RcbiAgICogdHlwZSB0YWtlcyB0aGUgcGFuZSBkb3duIGFuZCBhIHZvbHVtZSB2aWV3IGJyaW5ncyBpdCBiYWNrLiBSZXNvbHZlcyB3aGV0aGVyIHRoZSBwYW5lIHNob3dzLlxuICAgKi9cbiAgYXN5bmMgc2V0U2xpY2VFZGl0b3IoZGl2OiBzdHJpbmcgfCBudWxsKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdGhpcy5zbGljZURpdiA9IGRpdjtcbiAgICBpZiAodGhpcy5zbGljZUVkaXRvciQudmFsdWUgIT09ICEhZGl2KSB0aGlzLnNsaWNlRWRpdG9yJC5uZXh0KCEhZGl2KTtcbiAgICBpZiAoIWRpdikge1xuICAgICAgdGhpcy51bm1vdW50U2xpY2UoKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubW91bnRTbGljZShmYWxzZSk7XG4gIH1cblxuICAvKiogTW91bnQgKG9yIHJlZnJlc2ggaW4gcGxhY2UpIE9TRCBpbiB0aGUgc2xpY2UgcGFuZSBvbiB0aGUgZGlzcGxheWVkIHNsaWNlLiAqL1xuICBwcml2YXRlIGFzeW5jIG1vdW50U2xpY2UoaW5QbGFjZTogYm9vbGVhbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGRpdiA9IHRoaXMuc2xpY2VEaXY7XG4gICAgY29uc3QgaW5mbyA9IHRoaXMucGxvdHRlZEluZm87XG4gICAgaWYgKCFkaXYgfHwgIWluZm8/LnVybHM/Lmxlbmd0aCB8fCAhdGhpcy5pbWFnZVZvbHVtZVZpZXcpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCByZXF1ZXN0ID0gKyt0aGlzLnNsaWNlUmVxdWVzdDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbG9hZGVkID0gYXdhaXQgdGhpcy5vc2QubG9hZChpbmZvLCB0aGlzLmN1cnJlbnRaSW5kZXgpO1xuICAgICAgaWYgKHJlcXVlc3QgIT09IHRoaXMuc2xpY2VSZXF1ZXN0KSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBvayA9IGF3YWl0IHRoaXMub3NkLnBsb3QoZGl2LCBsb2FkZWQsIGluZm8sIHRoaXMucGxvdHRlZEhlaWdodCwgUGxvdFR5cGUuSU1BR0UsIGluUGxhY2UpO1xuICAgICAgaWYgKHJlcXVlc3QgIT09IHRoaXMuc2xpY2VSZXF1ZXN0KSByZXR1cm4gZmFsc2U7XG4gICAgICB0aGlzLnNsaWNlTW91bnRlZCA9IG9rO1xuICAgICAgdGhpcy5zbGljZUZpbGUgPSBpbmZvLmZpbGVOYW1lO1xuICAgICAgaWYgKG9rKSB7XG4gICAgICAgIC8vIFRoZSBzbGljZSBtYXkgaGF2ZSBtb3ZlZCB3aGlsZSB0aGUgcGFuZSBsb2FkZWQuXG4gICAgICAgIHRoaXMub3NkLnNldFpJbmRleCh0aGlzLmN1cnJlbnRaSW5kZXgpO1xuICAgICAgICB0aGlzLnRyYWNrTGl2ZUNsYXNzZXMoKTtcbiAgICAgICAgdGhpcy5zZWN0aW9ucy5zdGFydCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9rO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgaWYgKHJlcXVlc3QgPT09IHRoaXMuc2xpY2VSZXF1ZXN0KVxuICAgICAgICBjb25zb2xlLndhcm4oJ1t2aXN1YWxpemVyXSBUaGUgc2xpY2UgcGFuZSBjb3VsZCBub3Qgc2hvdyB0aGUgaW1hZ2UuJywgZXJyKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKiogVGFrZSB0aGUgc2xpY2UgcGFuZSdzIHZpZXdlciBkb3duICh0aGUgc3BsaXQgc3RheXMgd2FudGVkIHdoaWxlIHtAbGluayBzbGljZURpdn0gaXMgc2V0KS4gKi9cbiAgcHJpdmF0ZSB1bm1vdW50U2xpY2UoKTogdm9pZCB7XG4gICAgdGhpcy5zbGljZVJlcXVlc3QrKztcbiAgICBpZiAodGhpcy5zbGljZU1vdW50ZWQpIHtcbiAgICAgIHRoaXMub3NkLnJlc2V0KCk7XG4gICAgICB0aGlzLnNlY3Rpb25zLnN0b3AoKTtcbiAgICB9XG4gICAgdGhpcy5zbGljZU1vdW50ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnNsaWNlRmlsZSA9IHVuZGVmaW5lZDtcbiAgfVxuICByZWxvYWRBbmRQbG90KCk6IHZvaWQge1xuICAgIHRoaXMucGxvdGx5LnJlbG9hZEFuZFBsb3QoKTtcbiAgfVxuICByZXNldCgpOiB2b2lkIHtcbiAgICAvLyBTdGFydCBvZiBhIHJlbmRlciBjeWNsZTogcmUtZW5hYmxlIG5hcGFyaS1qcy9PU0QgYXR0ZW1wdHMgKGNsZWFyIGFueSBwcmlvclxuICAgIC8vIHBlci1pbWFnZSBmYWxsYmFjaykgYW5kIHRlYXIgZG93biB3aGF0ZXZlcidzIG9uIHNjcmVlbi5cbiAgICB0aGlzLm9zZEZlbGxCYWNrID0gZmFsc2U7XG4gICAgdGhpcy5uYXBhcmlGZWxsQmFjayA9IGZhbHNlO1xuICAgIHRoaXMucmVuZGVyZXIoKS5yZXNldCgpO1xuICB9XG4gIHJlbGF5b3V0KHRydWVJbWFnZVNpemU/OiBudW1iZXJbXSk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS5yZWxheW91dCh0cnVlSW1hZ2VTaXplKTtcbiAgfVxuICByZXNldEF4ZXMoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLnJlc2V0QXhlcygpO1xuICB9XG4gIGZpdFRvVmlldygpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuZml0VG9WaWV3KCk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgZml0VG9WaWV3fS4gKi9cbiAgYXV0b3NjYWxlKCk6IHZvaWQge1xuICAgIHRoaXMuZml0VG9WaWV3KCk7XG4gIH1cbiAgem9vbUluKCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS56b29tSW4oKTtcbiAgfVxuICB6b29tT3V0KCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS56b29tT3V0KCk7XG4gIH1cbiAgc2V0RHJhZ01vZGUobW9kZTogc3RyaW5nIHwgZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuc2V0RHJhZ01vZGUobW9kZSk7XG4gICAgaWYgKHRoaXMuc2xpY2VNb3VudGVkKSB0aGlzLm9zZC5zZXREcmFnTW9kZShtb2RlKTtcbiAgfVxuICAvKiogRXZlcnkgYmFja2VuZCwgb24gc2NyZWVuIG9yIG5vdC4gKi9cbiAgcHJpdmF0ZSBiYWNrZW5kcygpOiBJVmlld2VyQmFja2VuZFtdIHtcbiAgICByZXR1cm4gW3RoaXMucGxvdGx5LCB0aGlzLm9zZCwgdGhpcy5uYXBhcmldO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBuYXZpZ2F0b3IgLyBzbW9vdGhpbmcgb3B0aW9ucywgYXBwbGllZCB0byBFVkVSWSBiYWNrZW5kIHRoYXQgaGFzIHRoZW0gKG5vdFxuICAgKiBqdXN0IHRoZSBhY3RpdmUgcmVuZGVyZXIpOiBjb25zdW1lcnMgc2V0IHRoZW0gYmVmb3JlIHRoZSBmaXJzdCByZW5kZXIsIHdoZW5cbiAgICogYHJlbmRlcmVyKClgIGlzIHN0aWxsIHRoZSBQbG90bHkgZGVmYXVsdCwgYW5kIE9TRC9uYXBhcmktanMgbXVzdCByZWNlaXZlIHRoZW1cbiAgICogdG8gaG9ub3VyIHRoZW0gYXQgdmlld2VyIGNyZWF0aW9uLlxuICAgKi9cbiAgZ2V0T3NkVmlld09wdGlvbnMoKTogSU9zZFZpZXdPcHRpb25zIHtcbiAgICByZXR1cm4gdGhpcy52aWV3T3B0aW9ucztcbiAgfVxuICBwcml2YXRlIHJlYWRvbmx5IHZpZXdPcHRpb25zOiBJT3NkVmlld09wdGlvbnMgPSB7XG4gICAgc2V0TmF2aWdhdG9yVmlzaWJsZTogKHZpc2libGUpID0+IHtcbiAgICAgIGZvciAoY29uc3QgYiBvZiB0aGlzLmJhY2tlbmRzKCkpIGIuZ2V0T3NkVmlld09wdGlvbnMoKT8uc2V0TmF2aWdhdG9yVmlzaWJsZSh2aXNpYmxlKTtcbiAgICB9LFxuICAgIHNldEltYWdlU21vb3RoaW5nRW5hYmxlZDogKGVuYWJsZWQpID0+IHtcbiAgICAgIGZvciAoY29uc3QgYiBvZiB0aGlzLmJhY2tlbmRzKCkpIGIuZ2V0T3NkVmlld09wdGlvbnMoKT8uc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQpO1xuICAgIH0sXG4gIH07XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldE9zZFZpZXdPcHRpb25zKCkuc2V0TmF2aWdhdG9yVmlzaWJsZSgpYC4gKi9cbiAgc2V0TmF2aWdhdG9yVmlzaWJsZSh2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy52aWV3T3B0aW9ucy5zZXROYXZpZ2F0b3JWaXNpYmxlKHZpc2libGUpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldE9zZFZpZXdPcHRpb25zKCkuc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKClgLiAqL1xuICBzZXRJbWFnZVNtb290aGluZ0VuYWJsZWQoZW5hYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMudmlld09wdGlvbnMuc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQpO1xuICB9XG4gIHNldFNob3dTdGFjayhzaG93c3RhY2s6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuc2V0U2hvd1N0YWNrKHNob3dzdGFjayk7XG4gIH1cbiAgc2V0WkluZGV4KHpJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50WkluZGV4ID0gekluZGV4O1xuICAgIHRoaXMucmVuZGVyZXIoKS5zZXRaSW5kZXgoekluZGV4KTtcbiAgICBpZiAodGhpcy5zbGljZU1vdW50ZWQpIHtcbiAgICAgIHRoaXMub3NkLnNldFpJbmRleCh6SW5kZXgpO1xuICAgICAgdGhpcy5zZWN0aW9ucy5zY2hlZHVsZSgpO1xuICAgIH1cbiAgfVxuICBnZXRUcnVlSW1hZ2VTaXplKCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0VHJ1ZUltYWdlU2l6ZSgpO1xuICB9XG4gIGdldEN1cnJlbnRJbWFnZSgpOiBQcm9taXNlPEltYWdlIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0Q3VycmVudEltYWdlKCk7XG4gIH1cbiAgZ2V0RGlzcGxheWVkUGl4ZWxEYXRhKCk6IFBpeGVsRGF0YSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0RGlzcGxheWVkUGl4ZWxEYXRhKCk7XG4gIH1cbiAgZ2V0RGlzcGxheWVkU291cmNlUmVjdCgpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXREaXNwbGF5ZWRTb3VyY2VSZWN0KCk7XG4gIH1cbiAgZG93bmxvYWRJbWFnZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuZG93bmxvYWRJbWFnZSgpO1xuICB9XG4gIGV4cG9ydENvbXBvc2l0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuZXhwb3J0Q29tcG9zaXRlKCk7XG4gIH1cblxuICBzZXRQbG90VHlwZShwbG90VHlwZTogUGxvdFR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRQbG90VHlwZSA9IHBsb3RUeXBlO1xuICAgIHRoaXMudXBkYXRlVm9sdW1lVmlldyhwbG90VHlwZSk7XG4gICAgdGhpcy5wbG90bHkuc2V0UGxvdFR5cGUocGxvdFR5cGUpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldFN1cmZhY2UzZENvbnRyb2xzKClgLiAqL1xuICBzZXRTdXJmYWNlRHJhZ01vZGUobW9kZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5nZXRTdXJmYWNlM2RDb250cm9scygpPy5zZXRTdXJmYWNlRHJhZ01vZGUobW9kZSk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKWAuICovXG4gIHJlc2V0U3VyZmFjZUNhbWVyYSgpOiB2b2lkIHtcbiAgICB0aGlzLmdldFN1cmZhY2UzZENvbnRyb2xzKCk/LnJlc2V0U3VyZmFjZUNhbWVyYSgpO1xuICB9XG4gIC8qKiBUaGUgM0QgZGVjaW1hdGUgZmFjdG9yIG9mIHRoZSBiYWNrZW5kIG9uIHNjcmVlbiAobmFwYXJpLWpzKSwgZWxzZSBudWxsLiAqL1xuICBnZXRWb2x1bWVSZXNvbHV0aW9uKCk6IElWb2x1bWVSZXNvbHV0aW9uIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRWb2x1bWVSZXNvbHV0aW9uKCk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpPy5zZXQoKWAuICovXG4gIHNldFJlc29sdXRpb25TY2FsZShzY2FsZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5nZXRWb2x1bWVSZXNvbHV0aW9uKCk/LnNldChzY2FsZSk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpPy5nZXQoKWAuICovXG4gIGdldFJlc29sdXRpb25TY2FsZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFZvbHVtZVJlc29sdXRpb24oKT8uZ2V0KCkgPz8gMTtcbiAgfVxuICAvKiogVGhlIHZpZXdwb3J0IG9mIHRoZSBiYWNrZW5kIG9uIHNjcmVlbiwgZm9yIGEgY29udHJpYnV0ZWQgcGxvdCBtb2RlLiBOdWxsXG4gICAqICB3aGVuIHRoYXQgYmFja2VuZCBjYW5ub3QgcHJvdmlkZSBvbmUgKGUuZy4gT1NEIGZlbGwgYmFjayB0byBQbG90bHkpLiAqL1xuICBnZXRQbG90TW9kZVZpZXdwb3J0KCk6IFBsb3RNb2RlVmlld3BvcnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldFBsb3RNb2RlVmlld3BvcnQ/LigpID8/IG51bGw7XG4gIH1cbiAgZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpOiBQbG90VHlwZURlc2NyaXB0b3JbXSB7XG4gICAgLy8gUGxvdGx5IGVudW1lcmF0ZXMgdGhlIGZ1bGwgUExPVF9UWVBFX0RFU0NSSVBUT1JTIG1hcCwgd2hpY2ggYWxyZWFkeSBpbmNsdWRlcyB0aGVcbiAgICAvLyBuYXBhcmktanMgV2ViR1BVIHR5cGVzIChqaXQtdWkjMTAyKSDigJQgc28gdGhpcyBzaW5nbGUgc291cmNlIGNvdmVycyB0aGVtIChubyBkdXBsaWNhdGVzKS5cbiAgICByZXR1cm4gdGhpcy5wbG90bHkuZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpO1xuICB9XG5cbiAgLy8g4pSA4pSAIGxvbmctbGl2ZWQgb2JzZXJ2YWJsZXMgKyBzdGFjayBmbGFncyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgc2V0U3RhY2tMb2FkaW5nKGI6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnBsb3RseS5zZXRTdGFja0xvYWRpbmcoYik7XG4gIH1cbiAgLy8gQ2FuY2VsIGluLWZsaWdodCBsb2FkaW5nIG9uIGV2ZXJ5IGJhY2tlbmQg4oCUIHRoZSB1c2VyJ3MgQ2FuY2VsIHNob3VsZG4ndCBkZXBlbmQgb24gd2hpY2ggb25lIGlzXG4gIC8vIGFjdGl2ZS4gT25seSBiYWNrZW5kcyB0aGF0IHN0cmVhbSBmcmFtZXMgKG5hcGFyaS1qcykgZG8gcmVhbCB3b3JrOyB0aGUgcmVzdCBuby1vcC4gVGhlIGNvbmNyZXRlXG4gIC8vIGJhY2tlbmQgY2xhc3NlcyBkb24ndCBhbGwgZGVjbGFyZSB0aGUgb3B0aW9uYWwgY29udHJhY3QgbWV0aG9kLCBzbyBjYWxsIGl0IHZpYSBJVmlld2VyQmFja2VuZC5cbiAgY2FuY2VsTG9hZGluZygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGJhY2tlbmQgb2YgW3RoaXMucGxvdGx5LCB0aGlzLm9zZCwgdGhpcy5uYXBhcmldIGFzIElWaWV3ZXJCYWNrZW5kW10pIHtcbiAgICAgIGJhY2tlbmQuY2FuY2VsTG9hZGluZz8uKCk7XG4gICAgfVxuICB9XG4gIC8vIExvYWRpbmcgc3RhdGUgaXMgc3VyZmFjZWQgZnJvbSB3aGljaGV2ZXIgYmFja2VuZCBpcyBkb2luZyB0aGUgd29yazogT1NEIGFuZCBuYXBhcmktanMgKHZvbHVtZVxuICAvLyBhc3NlbWJseSkgZHJpdmUgdGhlaXIgb3duIHN1YmplY3RzLCBzbyBtZXJnZSBhbGwgdGhyZWUgaW50byBvbmUgc3RhYmxlIHN0cmVhbSB0aGUgaG9zdFxuICAvLyBzdWJzY3JpYmVzIHRvIG9uY2UuIChQcmV2aW91c2x5IGhhcmRjb2RlZCB0byBQbG90bHksIHNvIG5hcGFyaS9PU0QgcHJvZ3Jlc3MgbmV2ZXIgc2hvd2VkLilcbiAgaXNTdGFja0xvYWRpbmcoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5wbG90bHkuaXNTdGFja0xvYWRpbmcoKSxcbiAgICAgIHRoaXMub3NkLmlzU3RhY2tMb2FkaW5nKCksXG4gICAgICB0aGlzLm5hcGFyaS5pc1N0YWNrTG9hZGluZygpLFxuICAgIF0pLnBpcGUobWFwKChmbGFncykgPT4gZmxhZ3Muc29tZShCb29sZWFuKSkpO1xuICB9XG4gIGdldFN0YWNrTG9hZGluZ1Byb2dyZXNzKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgLy8gUmVwb3J0IHRoZSBwcm9ncmVzcyBvZiB3aGljaGV2ZXIgYmFja2VuZCBpcyBBQ1RJVkVMWSBsb2FkaW5nIChtYXggYWNyb3NzIGFjdGl2ZSBvbmVzKS4gQSBwbGFpblxuICAgIC8vIG1lcmdlIGxldCBhbiBpZGxlIGJhY2tlbmQncyBzdGFsZSB2YWx1ZSB3aW4gdGhlIHN0cmVhbSBvbiBhIHJlLWxvYWQg4oCUIGxlYXZpbmcgdGhlIGJhciBiZWxvdyB0aGVcbiAgICAvLyBhY3RpdmUgYmFja2VuZCdzIHJlYWwgcHJvZ3Jlc3MgKGUuZy4gc3R1Y2sgfuKFkyB3aGlsZSB0aGUgJSByZWFkIDEwMCkuIEdhdGluZyBieSB0aGUgbG9hZGluZyBmbGFnXG4gICAgLy8gaWdub3JlcyBpZGxlIGJhY2tlbmRzLCBzbyB0aGUgYmFyIHRyYWNrcyB0aGUgb25lIGRvaW5nIHRoZSB3b3JrIGFuZCByZWFjaGVzIDEwMCUuXG4gICAgY29uc3QgdHJhY2sgPSAodjogSVZpZXdlckJhY2tlbmQpOiBPYnNlcnZhYmxlPFtudW1iZXIsIGJvb2xlYW5dPiA9PlxuICAgICAgY29tYmluZUxhdGVzdChbdi5nZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpLCB2LmlzU3RhY2tMb2FkaW5nKCldKTtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbdHJhY2sodGhpcy5wbG90bHkpLCB0cmFjayh0aGlzLm9zZCksIHRyYWNrKHRoaXMubmFwYXJpKV0pLnBpcGUoXG4gICAgICBtYXAoKHBhaXJzKSA9PiB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZSA9IHBhaXJzLmZpbHRlcigoWywgbG9hZGluZ10pID0+IGxvYWRpbmcpLm1hcCgoW3BdKSA9PiBwKTtcbiAgICAgICAgcmV0dXJuIGFjdGl2ZS5sZW5ndGggPyBNYXRoLm1heCguLi5hY3RpdmUpIDogMDtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cbiAgLy8gRXZlcnkgYmFja2VuZCBmaXRzIHRvIHZpZXcgb24gaXRzIG93biAoUGxvdGx5J3MgYXV0b3NjYWxlLCBPU0QncyBnb0hvbWUsIG5hcGFyaSdzIGNhbWVyYVxuICAvLyBmaXQpIGFuZCBlYWNoIGVtaXRzIGZyb20gaXRzIG93biBzdWJqZWN0LCBzbyBtZXJnZSBhbGwgdGhyZWU6IGxpc3RlbmluZyB0byBQbG90bHkgYWxvbmVcbiAgLy8gbWlzc2VkIHRoZSBjb250ZXh0LW1lbnUgQXV0b3NjYWxlIG9uIHRoZSBJbWFnZSBhbmQgbmFwYXJpIHZpZXdzLlxuICBnZXRBdXRvc2NhbGVFdmVudCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gbWVyZ2UoXG4gICAgICB0aGlzLnBsb3RseS5nZXRBdXRvc2NhbGVFdmVudCgpLFxuICAgICAgdGhpcy5vc2QuZ2V0QXV0b3NjYWxlRXZlbnQoKSxcbiAgICAgIHRoaXMubmFwYXJpLmdldEF1dG9zY2FsZUV2ZW50KCksXG4gICAgKS5waXBlKG1hcCgoKSA9PiB1bmRlZmluZWQpKTtcbiAgfVxuICAvKiogVGhlIGxpbmUtUk9JIHByb2ZpbGVzOiBzYW1wbGVkIGJ5IHRoZSBiYWNrZW5kLW5ldXRyYWwgSW50ZW5zaXR5UHJvZmlsZVNlcnZpY2UuICovXG4gIGdldEludGVuc2l0eVByb2ZpbGUkKCk6IE9ic2VydmFibGU8SW50ZW5zaXR5UHJvZmlsZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5LmdldEludGVuc2l0eVByb2ZpbGUkKCk7XG4gIH1cbiAgLy8gVGhlIGludGVuc2l0eSBpbnNldCBpcyBhIFBsb3RseSBMSU5FIGNoYXJ0IOKAlCByZW5kZXIgaXQgdGhyb3VnaCBQbG90bHkgd2hpY2hldmVyXG4gIC8vIGJhY2tlbmQgZHJhd3MgdGhlIG1haW4gaW1hZ2UuXG4gIHJlbmRlckludGVuc2l0eUluc2V0KGRpdklkOiBzdHJpbmcsIHByb2ZpbGVzOiBJbnRlbnNpdHlQcm9maWxlW10pOiB2b2lkIHtcbiAgICB0aGlzLnBsb3RseS5yZW5kZXJJbnRlbnNpdHlJbnNldChkaXZJZCwgcHJvZmlsZXMpO1xuICB9XG5cbiAgLy8g4pSA4pSAIHJlZ2lvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFJlZ2lvbiBzdGF0ZSBsaXZlcyBpbiB0aGUgc2hhcmVkIFJlZ2lvblN0b3JlLCBzbyBldmVyeSByZWFkIGFuZCB3cml0ZSBnb2VzXG4gIC8vIHN0cmFpZ2h0IHRvIGl0LiBFdmVyeSBiYWNrZW5kIGRyYXdzIGZyb20gdGhlIHN0b3JlJ3MgZXZlbnRzOiB0aGUgT1NEIGFuZFxuICAvLyBuYXBhcmktanMgb3ZlcmxheXMgYW5kIFBsb3RseSdzIHNoYXBlIHByb2plY3Rpb24gcmVkcmF3IG9uIGl0cyByZWdpb24tdXBkYXRlXG4gIC8vIGFuZCBzZWxlY3Rpb24gc3RyZWFtcywgYW5kIHRoZSBjYW52YXMgdG9vbHMgcmVzZXQgb24gZ2V0UmVnaW9uU2V0UmVwbGFjZWQkXG4gIC8vICh1bmRvLCByZWRvLCBhIHNsaWNlIHN3aXRjaCkuXG4gIHNldFJlZ2lvbnMoXG4gICAgcmVnaW9uczogUmVnaW9uW10sXG4gICAgc2hvd1JlZ2lvbkxhYmVsPzogYm9vbGVhbixcbiAgICBpc1JlZ2lvblNhdmVPbj86IGJvb2xlYW4sXG4gICAgZmlsbENvbG9yPzogc3RyaW5nLFxuICAgIGFwcGVuZD86IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuc2V0UmVnaW9ucyhyZWdpb25zLCBzaG93UmVnaW9uTGFiZWwsIGlzUmVnaW9uU2F2ZU9uLCBmaWxsQ29sb3IsIGFwcGVuZCk7XG4gIH1cbiAgZ2V0UmVnaW9ucygpOiBSZWdpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpO1xuICB9XG4gIGdldFJlZ2lvblBvbHlnb25zKCk6IFBvbHlnb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uUG9seWdvbnMoKTtcbiAgfVxuICBnZXRSZWdpb25VcGRhdGVFdmVudCgpOiBPYnNlcnZhYmxlPFJlZ2lvbltdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKTtcbiAgfVxuICBzZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyhpbmRpY2VzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoaW5kaWNlcyk7XG4gIH1cbiAgc2VsZWN0UmVnaW9uKHJlZ2lvbjogUmVnaW9uKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5zZWxlY3RSZWdpb24ocmVnaW9uKTtcbiAgfVxuICBnZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyQoKTogT2JzZXJ2YWJsZTxudW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFNlbGVjdGVkU2hhcGVJbmRpY2VzJCgpO1xuICB9XG4gIGRlbGV0ZUFjdGl2ZVNoYXBlKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuZGVsZXRlQWN0aXZlU2hhcGUoKTtcbiAgfVxuICBnZXRTaG93U2hhcGVMYWJlbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTaG93U2hhcGVMYWJlbCgpO1xuICB9XG4gIGdldFNoYXBlQ29sb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTaGFwZUNvbG9yKCk7XG4gIH1cbiAgZ2V0RmlsbENvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0RmlsbENvbG9yKCk7XG4gIH1cbiAgZ2V0Q2xhc3NpZmljYXRpb25Db2xvcnMoKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0Q2xhc3NpZmljYXRpb25Db2xvcnMoKTtcbiAgfVxuICBzZXRDbGFzc2lmaWNhdGlvbkNvbG9yKGxhYmVsOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnNldENsYXNzaWZpY2F0aW9uQ29sb3IobGFiZWwsIGNvbG9yKTtcbiAgfVxuICAvLyBBbm5vdGF0aW9uLWNsYXNzIHByZXNldHMgbGl2ZSBpbiB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZSAoYmFja2VuZC1uZXV0cmFsXG4gIC8vIHNlc3Npb24gc3RhdGUpLCBzbyByb3V0ZSBzdHJhaWdodCB0byBpdCByYXRoZXIgdGhhbiB0aHJvdWdoIHJlbmRlcmVyKCkuIChqaXQtdWkjNzApXG4gIGdldFByZXNldFNldCgpOiBQcmVzZXRTZXQge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldFByZXNldFNldCgpO1xuICB9XG4gIGdldFByZXNldFNldCQoKTogT2JzZXJ2YWJsZTxQcmVzZXRTZXQ+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRQcmVzZXRTZXQkKCk7XG4gIH1cbiAgc2V0UHJlc2V0U2V0KHNldDogUHJlc2V0U2V0KTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zZXRQcmVzZXRTZXQoc2V0KTtcbiAgfVxuICB1cHNlcnRDbGFzcyhwcmVzZXQ6IENsYXNzUHJlc2V0KTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS51cHNlcnRDbGFzcyhwcmVzZXQpO1xuICB9XG4gIHJlbW92ZUNsYXNzKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUucmVtb3ZlQ2xhc3MobmFtZSk7XG4gIH1cbiAgcmVzZXRQcmVzZXRzKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUucmVzZXRQcmVzZXRzKCk7XG4gIH1cbiAgdW5kbygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnVuZG8oKTtcbiAgfVxuICByZWRvKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUucmVkbygpO1xuICB9XG4gIGNhblVuZG8oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuY2FuVW5kbygpO1xuICB9XG4gIGNhblJlZG8oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuY2FuUmVkbygpO1xuICB9XG4gIGdldENhblVuZG8kKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldENhblVuZG8kKCk7XG4gIH1cbiAgZ2V0Q2FuUmVkbyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0Q2FuUmVkbyQoKTtcbiAgfVxuICByZXNldFVuZG9IaXN0b3J5KCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUucmVzZXRVbmRvSGlzdG9yeSgpO1xuICB9XG4gIGltcG9ydFJlZ2lvbnMoZ2VvSnNvblN0cjogc3RyaW5nKTogUmVnaW9uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmltcG9ydFJlZ2lvbnMoZ2VvSnNvblN0cik7XG4gIH1cbiAgLyoqIERvd25sb2FkIGByZWdpb25zYCBhcyBHZW9KU09OLCBuYW1lZCBhZnRlciB0aGUgaW1hZ2UgbGFzdCBwbG90dGVkLiAqL1xuICBleHBvcnRSZWdpb25zKHJlZ2lvbnM6IFJlZ2lvbltdKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5leHBvcnRSZWdpb25zKHJlZ2lvbnMsIHRoaXMucGxvdHRlZEZpbGVOYW1lKTtcbiAgfVxuICBnZXRHZW9Kc29uU3RyaW5nKHJlZ2lvbnM6IFJlZ2lvbltdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRHZW9Kc29uU3RyaW5nKHJlZ2lvbnMpO1xuICB9XG5cbiAgLyoqIEhvbGQgYSBsYXJnZSByZWdpb24gc2V0IGFzIGEgdGlsZWQgcmVnaW9uIHNvdXJjZSAoc2VlIFJlZ2lvblN0b3JlLmF0dGFjaFJlZ2lvblNvdXJjZSkuICovXG4gIGF0dGFjaFJlZ2lvblNvdXJjZShzb3VyY2U6IFJlZ2lvblNvdXJjZSB8IFJlZ2lvblNvdXJjZU9wZW5lciwgc2xpY2VzPzogUmVnaW9uU291cmNlU2xpY2VzKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5hdHRhY2hSZWdpb25Tb3VyY2Uoc291cmNlLCBzbGljZXMpO1xuICB9XG4gIGFzeW5jIGltcG9ydFJlZ2lvblNvdXJjZShnZW9Kc29uU3RyOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoZ2VvSnNvblN0ci5sZW5ndGggPCAodGhpcy5jb25maWc/LnJlZ2lvblNvdXJjZU1pbkNoYXJzID8/IFJFR0lPTl9TT1VSQ0VfTUlOX0NIQVJTKSkgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBvcGVuZWQ6IFJlZ2lvblNvdXJjZSB8IG51bGwgPSBhd2FpdCBvcGVuR2VvSnNvblJlZ2lvblNvdXJjZShnZW9Kc29uU3RyKTtcbiAgICAvLyBUaGUgZmlyc3Qgb3BlbiBpcyB0aGUgb25lIGp1c3QgbWFkZTsgYSBzb3VyY2UgY2xvc2VkIHRvIHNhdmUgbWVtb3J5IHBhcnNlcyBhZ2Fpbi5cbiAgICB0aGlzLnJlZ2lvblN0b3JlLmF0dGFjaFJlZ2lvblNvdXJjZSgoKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBvcGVuZWQ7XG4gICAgICBvcGVuZWQgPSBudWxsO1xuICAgICAgcmV0dXJuIHNvdXJjZSA/IFByb21pc2UucmVzb2x2ZShzb3VyY2UpIDogb3Blbkdlb0pzb25SZWdpb25Tb3VyY2UoZ2VvSnNvblN0cik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZHJvcFJlZ2lvblNvdXJjZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5kcm9wU2xpY2VSZWdpb25Tb3VyY2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHRpY2tldCBmb3IgYSByZWdpb24gaW1wb3J0IHRoYXQgaXMgYWJvdXQgdG8gcmVhZCBvciBkZWNvZGUgaXRzIGZpbGVzOiB0aGUgaW1wb3J0IG1ldGhvZHNcbiAgICogZ2l2ZW4gaXQgY2hhbmdlIG5vdGhpbmcgb25jZSBpdCBpcyBzdGFsZSDigJQgYW5vdGhlciBpbXBvcnQgdG9vayBhIHRpY2tldCBzaW5jZSwgYW5vdGhlciBpbWFnZVxuICAgKiB3YXMgcGxvdHRlZCwgb3IgdGhlIHNlcnZpY2Ugd2FzIGRlc3Ryb3llZCDigJQgc28gYW4gaW1wb3J0IHRoYXQgZmluaXNoZXMgbGF0ZSBuZXZlciBsYW5kcyBvbiBhblxuICAgKiBpbWFnZSBpdCB3YXMgbm90IHN0YXJ0ZWQgZm9yLlxuICAgKi9cbiAgcmVnaW9uSW1wb3J0VGlja2V0KCk6IG51bWJlciB7XG4gICAgdGhpcy5pbXBvcnRUaWNrZXQgPSB7IGlkOiB0aGlzLmltcG9ydFRpY2tldC5pZCArIDEsIGltYWdlOiB0aGlzLmltcG9ydEltYWdlS2V5KCkgfTtcbiAgICByZXR1cm4gdGhpcy5pbXBvcnRUaWNrZXQuaWQ7XG4gIH1cblxuICAvKiogV2hldGhlciBgdGlja2V0YCBpcyBzdGlsbCB0aGUgY3VycmVudCBpbXBvcnQncywgb24gdGhlIGltYWdlIGl0IHdhcyB0YWtlbiBmb3IuICovXG4gIHByaXZhdGUgaW1wb3J0VGlja2V0VmFsaWQodGlja2V0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGlja2V0ID09PSB0aGlzLmltcG9ydFRpY2tldC5pZCAmJiB0aGlzLmltcG9ydFRpY2tldC5pbWFnZSA9PT0gdGhpcy5pbXBvcnRJbWFnZUtleSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbXBvcnRJbWFnZUtleSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBSZWdpb25TY29wZUNhY2hlLmltYWdlS2V5KHRoaXMucGxvdHRlZEluZm8gPz8gdW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIHRoZSBpbWFnZSdzIHJlZ2lvbnMgYW5kIHJlZ2lvbiBzb3VyY2VzIHdpdGggb25lIHNvdXJjZSBwZXIgc2xpY2UsIGFzIGFuIGltcG9ydGVkIGxhYmVsXG4gICAqIHZvbHVtZSBvciBmb2xkZXIgb2YgcGVyLXNsaWNlIHJlZ2lvbiBmaWxlcyBnaXZlcyB0aGVtOiBgb3BlbmVyc2AgYnkgc2xpY2UgaW5kZXgsIGVhY2ggb3BlbmVkXG4gICAqIHRoZSBmaXJzdCB0aW1lIGl0cyBzbGljZSBpcyBzaG93bi4gQSBzaW5nbGUgaW1hZ2UgdGFrZXMgc2xpY2UgMCdzLiBSZXR1cm5zIGhvdyBtYW55IHNsaWNlc1xuICAgKiBoYXZlIGEgc291cmNlLCBvciBudWxsIChjaGFuZ2luZyBub3RoaW5nKSB3aGVuIGB0aWNrZXRgIGlzIHN0YWxlIChzZWVcbiAgICoge0BsaW5rIHJlZ2lvbkltcG9ydFRpY2tldH0pLiBUaGUgc291cmNlcyBhcmUgbWFya2VkIGltcG9ydGVkLCBzbyBhIHNhdmUgd3JpdGVzIGV2ZXJ5IHNsaWNlLlxuICAgKi9cbiAgaW1wb3J0U2xpY2VSZWdpb25Tb3VyY2VzKG9wZW5lcnM6IFJlYWRvbmx5TWFwPG51bWJlciwgUmVnaW9uU291cmNlT3BlbmVyPiwgdGlja2V0PzogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgaWYgKHRpY2tldCAhPT0gdW5kZWZpbmVkICYmICF0aGlzLmltcG9ydFRpY2tldFZhbGlkKHRpY2tldCkpIHJldHVybiBudWxsO1xuICAgIHRoaXMucmVnaW9uSW1wb3J0VGlja2V0KCk7IC8vIHN1cGVyc2VkZXMgYW55IGltcG9ydCBzdGlsbCBpbiBmbGlnaHRcbiAgICBjb25zdCBpbmZvID0gdGhpcy5wbG90dGVkSW5mbztcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmRldGFjaFJlZ2lvblNvdXJjZXMoKTtcbiAgICBpZiAoIWluZm8/LmlzU3RhY2spIHtcbiAgICAgIGNvbnN0IGZpcnN0ID0gb3BlbmVycy5nZXQoMCkgPz8gb3BlbmVycy52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFJlZ2lvbnMoW10pO1xuICAgICAgdGhpcy5yZWdpb25TdG9yZS5yZXNldFVuZG9IaXN0b3J5KCk7XG4gICAgICBpZiAoIWZpcnN0KSByZXR1cm4gMDtcbiAgICAgIHRoaXMucmVnaW9uU3RvcmUuYXR0YWNoUmVnaW9uU291cmNlKGZpcnN0LCB7IHNsaWNlOiAwIH0sIHRydWUpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHRoaXMuZW50ZXJJbXBvcnRlZFN0YWNrKGluZm8pO1xuICAgIGZvciAoY29uc3QgW3osIG9wZW5dIG9mIG9wZW5lcnMpIHRoaXMucmVnaW9uU3RvcmUuYXR0YWNoUmVnaW9uU291cmNlKG9wZW4sIHsgc2xpY2U6IHogfSwgdHJ1ZSk7XG4gICAgcmV0dXJuIG9wZW5lcnMuc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIHRoZSBpbWFnZSdzIHJlZ2lvbnMgYW5kIHJlZ2lvbiBzb3VyY2VzIHdpdGggb25lIGltcG9ydGVkIHNvdXJjZSAoYSByZWdpb24gc2V0IHRoZVxuICAgKiBob3N0J3Mgc2VydmVyIHNlcnZlcyk6IG92ZXIgZXZlcnkgc2xpY2Ugb2YgYSBzdGFjayB3aGVuIGl0IGlzIHotaW5kZXhlZCwgZWxzZSBvbiB0aGUgc2xpY2VcbiAgICogc2hvd24sIGFzIHtAbGluayBhcHBseUltYWdlUm9pc30gbGF5cyBvdXQgYW4gaW1hZ2UncyBvd24uIFJlc29sdmVzIGZhbHNlLCBjaGFuZ2luZyBub3RoaW5nXG4gICAqIChhbmQgZGlzcG9zaW5nIHRoZSBzb3VyY2UpLCB3aGVuIHRoZSBpbXBvcnQgd2VudCBzdGFsZSB3aGlsZSBpdCBvcGVuZWQ6IGFub3RoZXIgaW1wb3J0LCBvclxuICAgKiBhbm90aGVyIGltYWdlIChzZWUge0BsaW5rIHJlZ2lvbkltcG9ydFRpY2tldH07IG9uZSBpcyB0YWtlbiBoZXJlIHdoZW4gYHRpY2tldGAgaXMgbm90IGdpdmVuKS5cbiAgICovXG4gIGFzeW5jIGltcG9ydFJlZ2lvblNvdXJjZU9wZW5lcihvcGVuOiBSZWdpb25Tb3VyY2VPcGVuZXIsIHRpY2tldD86IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IG1pbmUgPSB0aWNrZXQgPz8gdGhpcy5yZWdpb25JbXBvcnRUaWNrZXQoKTtcbiAgICBpZiAoIXRoaXMuaW1wb3J0VGlja2V0VmFsaWQobWluZSkpIHJldHVybiBmYWxzZTtcbiAgICBsZXQgZmlyc3Q6IFJlZ2lvblNvdXJjZSB8IG51bGwgPSBhd2FpdCBvcGVuKCk7XG4gICAgaWYgKCF0aGlzLmltcG9ydFRpY2tldFZhbGlkKG1pbmUpKSB7XG4gICAgICBmaXJzdC5kaXNwb3NlKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHJldXNlOiBSZWdpb25Tb3VyY2VPcGVuZXIgPSAoKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBmaXJzdDtcbiAgICAgIGZpcnN0ID0gbnVsbDtcbiAgICAgIHJldHVybiBzb3VyY2UgPyBQcm9taXNlLnJlc29sdmUoc291cmNlKSA6IG9wZW4oKTtcbiAgICB9O1xuICAgIGNvbnN0IGluZm8gPSB0aGlzLnBsb3R0ZWRJbmZvO1xuICAgIGNvbnN0IHBsYW5lcyA9IGZpcnN0LmluZm8ucGxhbmVzO1xuICAgIGNvbnN0IHpJbmRleGVkID0gISFpbmZvPy5pc1N0YWNrICYmIHBsYW5lcy5zb21lKChwKSA9PiBwICE9PSAwKTtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmRldGFjaFJlZ2lvblNvdXJjZXMoKTtcbiAgICBpZiAoekluZGV4ZWQpIHtcbiAgICAgIHRoaXMuZW50ZXJJbXBvcnRlZFN0YWNrKGluZm8gYXMgSUltYWdlSW5mbyk7XG4gICAgICB0aGlzLnJlZ2lvblN0b3JlLmF0dGFjaFJlZ2lvblNvdXJjZShyZXVzZSwgJ3BsYW5lcycsIFsuLi5wbGFuZXNdKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFJlZ2lvbnMoW10pO1xuICAgIHRoaXMucmVnaW9uU3RvcmUucmVzZXRVbmRvSGlzdG9yeSgpO1xuICAgIHRoaXMucmVnaW9uU3RvcmUuYXR0YWNoUmVnaW9uU291cmNlKHJldXNlLCB7IHNsaWNlOiB0aGlzLnJlZ2lvblN0b3JlLmdldERpc3BsYXlTbGljZSgpIH0sIHRydWUpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqIEVtcHR5IGV2ZXJ5IHNsaWNlIG9mIGEgc3RhY2sgKGl0cyByZWdpb25zIGFuZCB1bmRvIGhpc3RvcnkpIGZvciByZWdpb25zIGltcG9ydGVkIG92ZXIgaXQuICovXG4gIHByaXZhdGUgZW50ZXJJbXBvcnRlZFN0YWNrKGluZm86IElJbWFnZUluZm8pOiB2b2lkIHtcbiAgICBjb25zdCBsYXlvdXQgPSB0aGlzLnJlZ2lvblN0b3JlLmlzU3RhY2tNb2RlKClcbiAgICAgID8gdGhpcy5yZWdpb25TdG9yZS5nZXRTdGFja1NhdmVMYXlvdXQoKVxuICAgICAgOiBpbmZvLnRpbGVkID09PSBmYWxzZVxuICAgICAgICA/ICdwZXItc2xpY2UtZmlsZSdcbiAgICAgICAgOiAnY29tYmluZWQnO1xuICAgIHRoaXMucmVnaW9uU3RvcmUuZW50ZXJTdGFja01vZGUobmV3IE1hcCgpLCB0aGlzLnJlZ2lvblN0b3JlLmdldERpc3BsYXlTbGljZSgpLCBsYXlvdXQpO1xuICB9XG4gIGdldFJlZ2lvblNvdXJjZVZpZXckKCk6IE9ic2VydmFibGU8UmVnaW9uU291cmNlVmlldyB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25Tb3VyY2VWaWV3JCgpO1xuICB9XG4gIGdldFJlZ2lvblNvdXJjZUluZGV4KHF1ZXJ5OiBPbWl0PFJlZ2lvbkluZGV4UXVlcnksICdleGNsdWRlJz4pOiBQcm9taXNlPFJlZ2lvbkluZGV4UGFnZT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblNvdXJjZUluZGV4KHF1ZXJ5KTtcbiAgfVxuICBzZWxlY3RTb3VyY2VGZWF0dXJlcyhpZHM6IHJlYWRvbmx5IHN0cmluZ1tdLCBhZGRpdGl2ZT86IGJvb2xlYW4pOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuc2VsZWN0U291cmNlRmVhdHVyZXMoaWRzLCBhZGRpdGl2ZSk7XG4gIH1cbiAgZGVsZXRlU291cmNlRmVhdHVyZXMoaWRzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuZGVsZXRlU291cmNlRmVhdHVyZXMoaWRzKTtcbiAgfVxuICBnZXRSZWdpb25TdHlsZSQoKTogT2JzZXJ2YWJsZTxSZWdpb25TdHlsZT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblN0eWxlJCgpO1xuICB9XG4gIHNldFJlZ2lvblN0eWxlKHBhdGNoOiBQYXJ0aWFsPFJlZ2lvblN0eWxlPik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuc2V0UmVnaW9uU3R5bGUocGF0Y2gpO1xuICB9XG4gIC8vIOKUgOKUgCBSZWdpb25zIGluIDNEOiB0aGVpciByZWNvbnN0cnVjdGlvbnMgc2hvd24gaW4gdGhlIHZvbHVtZSB2aWV3IOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBSZWNvbXB1dGUgd2hpY2ggM0QgdmlldyBpcyBvbiBzY3JlZW4gZm9yIGBwbG90VHlwZWAgKHNlZSB7QGxpbmsgdm9sdW1lVmlldyR9KS4gKi9cbiAgcHJpdmF0ZSB1cGRhdGVWb2x1bWVWaWV3KHBsb3RUeXBlOiBQbG90VHlwZSk6IHZvaWQge1xuICAgIHRoaXMuaW1hZ2VWb2x1bWVWaWV3ID0gaXNOYXBhcmlWb2x1bWUocGxvdFR5cGUpIHx8IGlzTmFwYXJpSXNvc3VyZmFjZShwbG90VHlwZSk7XG4gICAgY29uc3QgcmVnaW9uczNkID0gdGhpcy5pbWFnZVZvbHVtZVZpZXcgfHwgKGlzU3BhdGlhbE9taWNzM2QocGxvdFR5cGUpICYmICEhdGhpcy5wbG90dGVkSW5mbz8uaXNTdGFjayk7XG4gICAgLy8gRXZlcnkgcGxvdCwgYXMgYmVmb3JlOiB0aGUgUmVnaW9uIEVkaXRvciBkcm9wcyBpdHMgcGVyLWNsYXNzIHZvbHVtZXMgb24gZWFjaCAoYSBuZXcgaW1hZ2UpLlxuICAgIHRoaXMudm9sdW1lVmlldyQubmV4dChyZWdpb25zM2QpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYSBuYXBhcmkgdm9sdW1lIChvciBpc29zdXJmYWNlKSB2aWV3IGlzIG9uIHNjcmVlbjogcmVnaW9ucyBjYW4gYmUgc2hvd24gaW4gM0QuICovXG4gIGdldFZvbHVtZVZpZXckKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnZvbHVtZVZpZXckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHZvbHVtZSB2aWV3J3Mgc2xpY2UgcGFuZSBpcyB3YW50ZWQgKGl0IHNob3dzIHdoaWxlIGEgdm9sdW1lIHZpZXcgaXMgb24gc2NyZWVuKS4gKi9cbiAgZ2V0U2xpY2VFZGl0b3IkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnNsaWNlRWRpdG9yJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSB2b2x1bWUgdmlldyBkcmF3cyB0aGUgcmVnaW9uIHJlY29uc3RydWN0aW9ucyB0aHJvdWdoIHRoZSB2b2x1bWUuICovXG4gIGdldFJlZ2lvbnNUaHJvdWdoVm9sdW1lJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25zVGhyb3VnaFZvbHVtZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogRHJhdyB0aGUgcmVnaW9uIHJlY29uc3RydWN0aW9ucyB0aHJvdWdoIHRoZSB2b2x1bWUgKGl0IGhpZGVzIG5vbmUgb2YgdGhlbTogc3VyZmFjZXMgaW5zaWRlIGl0c1xuICAgKiBicmlnaHQgc3RydWN0dXJlcywgYW4gT0NUJ3MgbGF5ZXIgYm91bmRhcmllcykgb3IgaGlkZGVuIGJlaGluZCB3aGF0IGl0IHNob3dzICh0aGUgZGVmYXVsdCkuXG4gICAqL1xuICBzZXRSZWdpb25zVGhyb3VnaFZvbHVtZSh0aHJvdWdoOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVnaW9uc1Rocm91Z2hWb2x1bWUkLnZhbHVlID09PSB0aHJvdWdoKSByZXR1cm47XG4gICAgdGhpcy5yZWdpb25zVGhyb3VnaFZvbHVtZSQubmV4dCh0aHJvdWdoKTtcbiAgICB0aGlzLm5hcGFyaS5zZXRSZWdpb25zVGhyb3VnaFZvbHVtZSh0aHJvdWdoKTtcbiAgfVxuXG4gIC8qKiBUaGUgY2xhc3MgZ3JvdXBzIHNob3duIGluIDNEIG9uIHRoaXMgaW1hZ2UgKFtdIGFmdGVyIGEgc3dpdGNoIHRvIGFub3RoZXIgaW1hZ2UpLiAqL1xuICBnZXRSZWdpb25DbGFzc2VzM2QkKCk6IE9ic2VydmFibGU8UmVhZG9ubHlBcnJheTx7IGtleTogc3RyaW5nOyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSB9Pj4ge1xuICAgIHJldHVybiB0aGlzLmNsYXNzZXMzZCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKiogSGlkZSBldmVyeSByZWdpb24gc3VyZmFjZSBhbmQgZm9yZ2V0IHRoZW0gKGEgYnVpbGQgc3RpbGwgcnVubmluZyBpcyBkcm9wcGVkKS4gKi9cbiAgcHJpdmF0ZSBjbGVhclJlZ2lvbkNsYXNzZXMzZCgpOiB2b2lkIHtcbiAgICB0aGlzLm1lc2hSZXF1ZXN0Kys7XG4gICAgdGhpcy5zaG93bjNkID0gW107XG4gICAgdGhpcy5jbGFzc2VzM2QkLm5leHQoW10pO1xuICAgIHRoaXMuY2xhc3NlczNkSW1hZ2UgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5uYXBhcmkuc2V0UmVnaW9uTWVzaGVzKFtdLCB1bmRlZmluZWQpO1xuICAgIHRoaXMubmFwYXJpLnNldFJlZ2lvbkhpZ2hsaWdodChbXSk7XG4gIH1cblxuICAvKiogSGlnaGxpZ2h0IHRoZSBzdXJmYWNlcyBvZiB0aGVzZSBncm91cCBrZXlzIGluIHRoZSB2b2x1bWUgdmlldyAobm9uZTogYWxsIGFzIHVzdWFsKS4gKi9cbiAgaGlnaGxpZ2h0UmVnaW9uQ2xhc3NlczNkKGtleXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5uYXBhcmkuc2V0UmVnaW9uSGlnaGxpZ2h0KGtleXMpO1xuICB9XG5cbiAgLyoqIEEgc3VyZmFjZSBjbGlja2VkIGluIHRoZSB2b2x1bWUgdmlldyB3aXRoIHRoZSBzZWxlY3Rpb24gdG9vbCAoaXRzIGdyb3VwIGtleSksIG9yIG5vbmUgKG51bGwpLiAqL1xuICBnZXRSZWdpb25QaWNrZWQzZCQoKTogT2JzZXJ2YWJsZTx7IGtleTogc3RyaW5nIHwgbnVsbDsgYWRkaXRpdmU6IGJvb2xlYW4gfT4ge1xuICAgIHJldHVybiB0aGlzLm5hcGFyaS5nZXRSZWdpb25NZXNoUGljayQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IHRoZXNlIGdyb3VwcyBvZiBjbGFzc2VzIGluIHRoZSB2b2x1bWUgdmlldyBhcyAzRCByZWNvbnN0cnVjdGlvbnMgKGVhY2ggZ3JvdXAgb25lIHN1cmZhY2VcbiAgICogaW4gaXRzIGNvbG91cjogYW4gYXRsYXMgc3RydWN0dXJlIHdpdGggaXRzIHN1YnN0cnVjdHVyZXMpLCBhbmQgb25seSB0aGVzZTsgW10gaGlkZXMgdGhlbS5cbiAgICogUmVjb25zdHJ1Y3RlZCBmcm9tIGV2ZXJ5IHNsaWNlJ3Mgb3V0bGluZXMgYXQgdGhlIHZvbHVtZSdzIHJlc29sdXRpb24sIGNhY2hlZCBwZXIgaW1hZ2UuXG4gICAqL1xuICBhc3luYyBzaG93UmVnaW9uQ2xhc3NlczNkKFxuICAgIGdyb3VwczogUmVhZG9ubHlBcnJheTx7IGtleTogc3RyaW5nOyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXTsgY29sb3I6IHN0cmluZzsgbGFiZWw/OiBzdHJpbmcgfT4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSArK3RoaXMubWVzaFJlcXVlc3Q7XG4gICAgdGhpcy5jbGFzc2VzM2RJbWFnZSA9IHRoaXMucGxvdHRlZEZpbGVOYW1lO1xuICAgIHRoaXMuc2hvd24zZCA9IGdyb3VwcztcbiAgICAvLyBXaGF0IGFuIGVkaXQgZnJvbSBub3cgb24gaXMgY29tcGFyZWQgd2l0aCAodGhlIGxpdmUgc2xpY2UgbWF5IG5vdCBoYXZlIGNoYW5nZWQgeWV0KS5cbiAgICB0aGlzLmxpdmVDbGFzc2VzID0gbnVsbDtcbiAgICB0aGlzLnRyYWNrTGl2ZUNsYXNzZXMoKTtcbiAgICB0aGlzLmNsYXNzZXMzZCQubmV4dChncm91cHMubWFwKChnKSA9PiAoeyBrZXk6IGcua2V5LCBjbGFzc2VzOiBnLmNsYXNzZXMgfSkpKTtcbiAgICBjb25zdCB3aWR0aCA9IHRoaXMuZ2V0VHJ1ZUltYWdlU2l6ZSgpPy53aWR0aCA/PyAxMDI0O1xuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLm5hcGFyaS5yZWdpb25Wb3hlbFN0ZXAoKSA/PyBNYXRoLm1heCgxLCB3aWR0aCAvIDI1Nik7XG4gICAgY29uc3QgaW1hZ2UgPSB0aGlzLnBsb3R0ZWRGaWxlTmFtZSA/PyAnJztcbiAgICBjb25zdCBjYWNoZUtleSA9IChnOiB7IGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdIH0pID0+IGAke2ltYWdlfXwke3N0ZXAudG9GaXhlZCgzKX18JHtnLmNsYXNzZXMuam9pbignLCcpfWA7XG4gICAgY29uc3QgbWlzc2luZyA9IGdyb3Vwcy5maWx0ZXIoKGcpID0+ICF0aGlzLm1lc2hDYWNoZS5oYXMoY2FjaGVLZXkoZykpKTtcbiAgICBpZiAobWlzc2luZy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG5hbWVzID0gbWlzc2luZy5tYXAoKGcpID0+IGcua2V5KTtcbiAgICAgIGNvbnN0IHdoYXQgPSBuYW1lcy5sZW5ndGggPiAzID8gYCR7bmFtZXMubGVuZ3RofSByZWdpb25zYCA6IG5hbWVzLmpvaW4oJywgJyk7XG4gICAgICBjb25zdCBkb25lID0gdGhpcy5uYXBhcmkuYmVnaW5UYXNrKGBCdWlsZGluZyAke3doYXR9IGluIDNE4oCmYCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBidWlsdCA9IGF3YWl0IHRoaXMucmVnaW9uU3RvcmUucmVjb25zdHJ1Y3RDbGFzc2VzKFxuICAgICAgICAgIG1pc3NpbmcubWFwKChnKSA9PiAoeyBrZXk6IGNhY2hlS2V5KGcpLCBjbGFzc2VzOiBnLmNsYXNzZXMgfSkpLFxuICAgICAgICAgIHN0ZXAsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGNsYXNzZXNPZiA9IG5ldyBNYXAobWlzc2luZy5tYXAoKGcpID0+IFtjYWNoZUtleShnKSwgZy5jbGFzc2VzXSkpO1xuICAgICAgICBmb3IgKGNvbnN0IGIgb2YgYnVpbHQpIHRoaXMubWVzaENhY2hlLnNldChiLmtleSwgeyBtZXNoOiBiLm1lc2gsIGNsYXNzZXM6IGNsYXNzZXNPZi5nZXQoYi5rZXkpID8/IFtdIH0pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVxdWVzdCAhPT0gdGhpcy5tZXNoUmVxdWVzdCkgcmV0dXJuO1xuICAgIHRoaXMubmFwYXJpLnNldFJlZ2lvbk1lc2hlcyhcbiAgICAgIGdyb3Vwcy5tYXAoKGcpID0+IHtcbiAgICAgICAgY29uc3QgbWVzaCA9IHRoaXMubWVzaENhY2hlLmdldChjYWNoZUtleShnKSkhLm1lc2g7XG4gICAgICAgIHJldHVybiB7IGtleTogZy5rZXksIGNvbG9yOiBnLmNvbG9yLCBsYWJlbDogZy5sYWJlbCwgdmVydGljZXM6IG1lc2gudmVydGljZXMsIGZhY2VzOiBtZXNoLmZhY2VzIH07XG4gICAgICB9KSxcbiAgICAgIHRoaXMucGxvdHRlZEZpbGVOYW1lLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlZ2lvbnMgY2hhbmdlZDogd2hlbiB0aGUgbGl2ZSBzbGljZSdzIHJlZ2lvbnMgb2Ygc29tZSBjbGFzc2VzIGRpZCAoYW4gZWRpdCwgYW4gdW5kbywgbm90XG4gICAqIGEgc2xpY2Ugb3IgaW1hZ2Ugc3dpdGNoKSwgdGhlaXIgcmVjb25zdHJ1Y3Rpb25zIGFyZSBzdGFsZS4gVGhleSBhcmUgZHJvcHBlZCwgYW5kIHRob3NlIHNob3duXG4gICAqIGluIDNEIGFyZSByZWJ1aWx0IG9uY2UgdGhlIGVkaXRzIHBhdXNlLlxuICAgKi9cbiAgcHJpdmF0ZSBvblJlZ2lvbnNDaGFuZ2VkKCk6IHZvaWQge1xuICAgIC8vIE5vdGhpbmcgZm9sbG93cyB0aGUgZWRpdHMgKG5vIHN1cmZhY2UgYnVpbHQgb3Igc2hvd24sIG5vIHNlY3Rpb25zKTogc2tpcCB0aGUgZmluZ2VycHJpbnRzLlxuICAgIGlmICghdGhpcy5zbGljZU1vdW50ZWQgJiYgIXRoaXMuc2hvd24zZC5sZW5ndGggJiYgIXRoaXMubWVzaENhY2hlLnNpemUpIHtcbiAgICAgIHRoaXMubGl2ZUNsYXNzZXMgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBiZWZvcmUgPSB0aGlzLmxpdmVDbGFzc2VzO1xuICAgIHRoaXMubGl2ZUNsYXNzZXMgPSBudWxsO1xuICAgIGNvbnN0IG5vdyA9IHRoaXMudHJhY2tMaXZlQ2xhc3NlcygpO1xuICAgIC8vIEFub3RoZXIgc2xpY2Ugb3IgaW1hZ2UgY2FtZSB1cDogbm8gcmVnaW9uIGNoYW5nZWQgKHRoZSBzZWN0aW9ucyByZWN1dCBmb3IgdGhlIHNsaWNlKS5cbiAgICBpZiAoIWJlZm9yZSB8fCBiZWZvcmUuYXQgIT09IG5vdy5hdCkgcmV0dXJuO1xuICAgIGNvbnN0IGNoYW5nZWQgPSBjaGFuZ2VkQ2xhc3NlcyhiZWZvcmUuc2lnbmF0dXJlcywgbm93LnNpZ25hdHVyZXMpO1xuICAgIC8vIFNvdXJjZSBmZWF0dXJlcyBkZWxldGVkIChvciB0aGF0IHVuZG9uZSkgY2hhbmdlIG5vIGxpdmUgcmVnaW9uLCBhbmQgd2hpY2ggY2xhc3NlcyB0aGV5IHdlcmVcbiAgICAvLyBpcyBub3Qga25vd24gaGVyZTogZXZlcnkgY2xhc3MgaXMgc3RhbGUuIEEgZmVhdHVyZSB0YWtlbiBzaG93cyBhcyBpdHMgY2xhc3MncyBjaGFuZ2UuXG4gICAgY29uc3QgZXZlcnlDbGFzcyA9ICFjaGFuZ2VkLnNpemUgJiYgYmVmb3JlLnNvdXJjZXMgIT09IG5vdy5zb3VyY2VzO1xuICAgIGlmICghY2hhbmdlZC5zaXplICYmICFldmVyeUNsYXNzKSByZXR1cm47XG4gICAgY29uc3QgdG91Y2hlZCA9IChjOiBzdHJpbmcpID0+IGV2ZXJ5Q2xhc3MgfHwgY2hhbmdlZC5oYXMoYyk7XG4gICAgaWYgKHRoaXMuc2xpY2VNb3VudGVkKSB0aGlzLnNlY3Rpb25zLnJlZ2lvbnNDaGFuZ2VkKCk7XG4gICAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgWy4uLnRoaXMubWVzaENhY2hlXSkge1xuICAgICAgaWYgKGVudHJ5LmNsYXNzZXMuc29tZSh0b3VjaGVkKSkgdGhpcy5tZXNoQ2FjaGUuZGVsZXRlKGtleSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5zaG93bjNkLnNvbWUoKGcpID0+IGcuY2xhc3Nlcy5zb21lKHRvdWNoZWQpKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnJlYnVpbGRUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMucmVidWlsZFRpbWVyKTtcbiAgICB0aGlzLnJlYnVpbGRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5yZWJ1aWxkVGltZXIgPSBudWxsO1xuICAgICAgaWYgKHRoaXMuc2hvd24zZC5sZW5ndGggJiYgdGhpcy5jbGFzc2VzM2RJbWFnZSA9PT0gdGhpcy5wbG90dGVkRmlsZU5hbWUpIHtcbiAgICAgICAgdm9pZCB0aGlzLnNob3dSZWdpb25DbGFzc2VzM2QodGhpcy5zaG93bjNkKTtcbiAgICAgIH1cbiAgICB9LCBSRUdJT05fU1VSRkFDRV9SRUJVSUxEX01TKTtcbiAgfVxuXG4gIC8qKiBGaW5nZXJwcmludCB0aGUgbGl2ZSBzbGljZSdzIGNsYXNzZXMsIHVubGVzcyBhbHJlYWR5OiB3aGF0IHRoZSBuZXh0IGVkaXQgaXMgY29tcGFyZWQgd2l0aC4gKi9cbiAgcHJpdmF0ZSB0cmFja0xpdmVDbGFzc2VzKCk6IHsgYXQ6IHN0cmluZzsgc2lnbmF0dXJlczogTWFwPHN0cmluZywgbnVtYmVyPjsgc291cmNlczogc3RyaW5nIH0ge1xuICAgIHRoaXMubGl2ZUNsYXNzZXMgPz89IHtcbiAgICAgIGF0OiB0aGlzLmxpdmVTbGljZUtleSgpLFxuICAgICAgc2lnbmF0dXJlczogY2xhc3NTaWduYXR1cmVzKHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpKSxcbiAgICAgIHNvdXJjZXM6IHRoaXMucmVnaW9uU3RvcmUuZ2V0U291cmNlU3RhdGVLZXkoKSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmxpdmVDbGFzc2VzO1xuICB9XG5cbiAgLyoqIFdoaWNoIHNsaWNlIG9mIHdoaWNoIGltYWdlIHRoZSBsaXZlIHJlZ2lvbnMgYXJlLiAqL1xuICBwcml2YXRlIGxpdmVTbGljZUtleSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnJlZ2lvblN0b3JlLmdldERpc3BsYXlTbGljZSgpfVxcbiR7dGhpcy5wbG90dGVkRmlsZU5hbWUgPz8gJyd9YDtcbiAgfVxuXG4gIC8qKiBFYWNoIGNsYXNzJ3Mgdm9sdW1lIG92ZXIgdGhlIHdob2xlIHN0YWNrLCBpbiBweMKyIMOXIHNsaWNlcyAoc2VlIFJlZ2lvblN0b3JlLmNsYXNzVm9sdW1lcykuICovXG4gIGFzeW5jIGdldENsYXNzVm9sdW1lcyhjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4ge1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoYXdhaXQgdGhpcy5yZWdpb25TdG9yZS5jbGFzc1ZvbHVtZXMoY2xhc3NlcykpO1xuICB9XG5cbiAgZ2V0UmVnaW9uU291cmNlQ2xhc3NDb3VudHMoc3RhY2s/OiBib29sZWFuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uU291cmNlQ2xhc3NDb3VudHMoc3RhY2spO1xuICB9XG4gIGdldEhpZGRlbkNsYXNzZXMkKCk6IE9ic2VydmFibGU8UmVhZG9ubHlTZXQ8c3RyaW5nPj4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldEhpZGRlbkNsYXNzZXMkKCk7XG4gIH1cbiAgc2V0Q2xhc3Nlc0hpZGRlbihjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSwgaGlkZGVuOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5zZXRDbGFzc2VzSGlkZGVuKGNsYXNzZXMsIGhpZGRlbik7XG4gICAgLy8gQSBzdXJmYWNlIGlzIGl0cyBjbGFzcydzIChpdHMgZ3JvdXAga2V5IGlzIHRoZSBjbGFzcyBuYW1lKS5cbiAgICB0aGlzLm5hcGFyaS5zZXRSZWdpb25IaWRkZW4oWy4uLnRoaXMucmVnaW9uU3RvcmUuZ2V0SGlkZGVuQ2xhc3NlcygpXSk7XG4gICAgdGhpcy5zZWN0aW9ucy5zY2hlZHVsZSgpO1xuICB9XG4gIGFzeW5jIHNlbGVjdFJlZ2lvbkNsYXNzZXMoY2xhc3NlczogcmVhZG9ubHkgc3RyaW5nW10sIGFkZGl0aXZlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucmVnaW9uU3RvcmUuc2VsZWN0Q2xhc3NlcyhjbGFzc2VzLCBhZGRpdGl2ZSk7XG4gIH1cbiAgZ2V0UGlja2VkUmVnaW9uQ2xhc3NlcyQoKTogT2JzZXJ2YWJsZTxyZWFkb25seSBzdHJpbmdbXT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFBpY2tlZENsYXNzZXMkKCk7XG4gIH1cbiAgZ2V0R2VvSnNvblN0cmluZ1dpdGhTb3VyY2UocmVnaW9uczogUmVnaW9uW10sIHNsaWNlPzogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRHZW9Kc29uV2l0aFNvdXJjZShyZWdpb25zLCBzbGljZSk7XG4gIH1cblxuICAvLyDilIDilIAgUGVyLXNsaWNlIHotc3RhY2sgcmVnaW9ucyAoaml0LXVpIzkzKSwgZnJvbSB0aGUgc2hhcmVkIFJlZ2lvblN0b3JlLiDilIDilIBcbiAgZW50ZXJTdGFja01vZGUoXG4gICAgc2xpY2VzOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4sXG4gICAgaW5pdGlhbFo/OiBudW1iZXIsXG4gICAgc2F2ZUxheW91dD86ICdjb21iaW5lZCcgfCAncGVyLXNsaWNlLWZpbGUnLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmVudGVyU3RhY2tNb2RlKHNsaWNlcywgaW5pdGlhbFosIHNhdmVMYXlvdXQpO1xuICB9XG4gIGV4aXRTdGFja01vZGUoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5leGl0U3RhY2tNb2RlKCk7XG4gIH1cbiAgaXNTdGFja01vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuaXNTdGFja01vZGUoKTtcbiAgfVxuICAvKiogVGhlIHNsaWNlIHRoZSByZWdpb25zIGFyZSBzaG93biBmb3IgKHJlY29yZGVkIG91dHNpZGUgc3RhY2sgbW9kZSB0b28pLiAqL1xuICBnZXREaXNwbGF5U2xpY2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXREaXNwbGF5U2xpY2UoKTtcbiAgfVxuICBnZXRTdGFja1NhdmVMYXlvdXQoKTogJ2NvbWJpbmVkJyB8ICdwZXItc2xpY2UtZmlsZScge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFN0YWNrU2F2ZUxheW91dCgpO1xuICB9XG4gIHNldERpc3BsYXlTbGljZSh6OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldERpc3BsYXlTbGljZSh6KTtcbiAgfVxuICBnZXRTbGljZVJlZ2lvbnMoKTogUmVnaW9uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFNsaWNlUmVnaW9ucygpO1xuICB9XG4gIGdldFN0YWNrU2F2ZVNsaWNlcygpOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFN0YWNrU2F2ZVNsaWNlcygpO1xuICB9XG4gIC8qKiBBbGwgc2xpY2VzJyBBTk5PVEFUSU9OIHJlZ2lvbnMgZm9yIGEgei1zdGFjayBzYXZlIChqaXQtdWkjOTMpLCBlYWNoIHRhZ2dlZFxuICAgKiAgd2l0aCBpdHMgemVyby1iYXNlZCBSZWdpb24uejsgcHJvZmlsZSBsaW5lcyBleGNsdWRlZC4gRmxhdCBhbm5vdGF0aW9uIHNldFxuICAgKiAgb3V0c2lkZSBzdGFjayBtb2RlLiAqL1xuICBnZXRTbGljZUFubm90YXRpb25SZWdpb25zKCk6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTbGljZVJlZ2lvbnMoKS5maWx0ZXIoKHIpID0+ICFpc1Byb2ZpbGVSZWdpb24ocikpO1xuICB9XG4gIC8qKiBQZXItc2xpY2UgYW5ub3RhdGlvbiByZWdpb25zIHRvIHdyaXRlIG9uIGEgZm9sZGVyLXN0YWNrIHNhdmUgKGppdC11aSM5Myk6XG4gICAqICBzbGljZSBpbmRleCDihpIgdGhhdCBzbGljZSdzIGFubm90YXRpb24gcmVnaW9ucyAocHJvZmlsZSBsaW5lcyBleGNsdWRlZCksXG4gICAqICBpbmNsdWRpbmcgbm93LWVtcHR5IHNsaWNlcyB0aGF0IHdlcmUgbG9hZGVkIG5vbi1lbXB0eSAoc28gdGhleSBvdmVyd3JpdGUpLiAqL1xuICBnZXRTdGFja1NhdmVBbm5vdGF0aW9uU2xpY2VzKCk6IE1hcDxudW1iZXIsIFJlZ2lvbltdPiB7XG4gICAgY29uc3Qgb3V0ID0gbmV3IE1hcDxudW1iZXIsIFJlZ2lvbltdPigpO1xuICAgIGZvciAoY29uc3QgW3osIHJlZ3NdIG9mIHRoaXMucmVnaW9uU3RvcmUuZ2V0U3RhY2tTYXZlU2xpY2VzKCkpIHtcbiAgICAgIG91dC5zZXQoXG4gICAgICAgIHosXG4gICAgICAgIHJlZ3MuZmlsdGVyKChyKSA9PiAhaXNQcm9maWxlUmVnaW9uKHIpKSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKiogQXV0aG9yaXRhdGl2ZSBmdWxsLXJlc29sdXRpb24gaW1hZ2Ugc2l6ZSBmb3IgbWFzayBleHBvcnQuIFByZWZlcnMgdGhlXG4gICAqICBhY3RpdmUgcmVuZGVyZXIncyByZXBvcnRlZCBzaXplLCBmYWxsaW5nIGJhY2sgdG8gdGhlIGltYWdlIG1ldGFkYXRhICh4L3lcbiAgICogIGFyZSB0aGUgZnVsbC1yZXMgcGl4ZWwgZGltZW5zaW9ucyB1c2VkIGFjcm9zcyB0aGUgYXBwKS4gUmVqZWN0cyBub24tZmluaXRlXG4gICAqICBvciBub24tcG9zaXRpdmUgc2l6ZXMg4oCUIHRoZSBQbG90bHkgYm91bmRzIGNhbiB5aWVsZCBOYU4gYmVmb3JlIGEgcGxvdCBpc1xuICAgKiAgZnVsbHkgbGFpZCBvdXQsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBjcmFzaCBtYXNrIGNyZWF0aW9uLiAqL1xuICBnZXRNYXNrSW1hZ2VTaXplKCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IHZhbGlkID0gKHM6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwgfCB1bmRlZmluZWQpID0+XG4gICAgICBzICYmIE51bWJlci5pc0Zpbml0ZShzLndpZHRoKSAmJiBOdW1iZXIuaXNGaW5pdGUocy5oZWlnaHQpICYmIHMud2lkdGggPj0gMSAmJiBzLmhlaWdodCA+PSAxXG4gICAgICAgID8geyB3aWR0aDogTWF0aC5yb3VuZChzLndpZHRoKSwgaGVpZ2h0OiBNYXRoLnJvdW5kKHMuaGVpZ2h0KSB9XG4gICAgICAgIDogbnVsbDtcblxuICAgIGNvbnN0IGZyb21SZW5kZXJlciA9IHZhbGlkKHRoaXMuZ2V0VHJ1ZUltYWdlU2l6ZSgpKTtcbiAgICBpZiAoZnJvbVJlbmRlcmVyKSByZXR1cm4gZnJvbVJlbmRlcmVyO1xuXG4gICAgbGV0IG1ldGE6IElJbWFnZU1ldGFkYXRhW10gPSBbXTtcbiAgICB0aGlzLmdldEltYWdlTWV0YSgpXG4gICAgICAuc3Vic2NyaWJlKChtKSA9PiAobWV0YSA9IG0pKVxuICAgICAgLnVuc3Vic2NyaWJlKCk7XG4gICAgY29uc3QgbTAgPSBtZXRhPy5bMF07XG4gICAgcmV0dXJuIG0wID8gdmFsaWQoeyB3aWR0aDogbTAueCwgaGVpZ2h0OiBtMC55IH0pIDogbnVsbDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJUmVnaW9uRWRpdG9yQXBpOiBhbm5vdGF0aW9uLW9ubHkgc3VyZmFjZSBmb3IgdGhlIFJlZ2lvbiBFZGl0b3Ig4pSA4pSA4pSAXG4gIC8vIEludGVuc2l0eS1wcm9maWxlIGxpbmVzIChraW5kPSdwcm9maWxlJykgYmVsb25nIHRvIHRoZSBpbnRlbnNpdHkgdG9vbCwgbm90XG4gIC8vIHRoZSBlZGl0b3IuIFRoZXNlIG1ldGhvZHMgZ2l2ZSBleHRlcm5hbCBjb25zdW1lcnMgYW4gYW5ub3RhdGlvbi1vbmx5IHZpZXdcbiAgLy8gYW5kIGd1YXJhbnRlZSBwcm9maWxlIGxpbmVzIGFyZSBwcmVzZXJ2ZWQuIFRoZSB3cml0ZXMgbGFuZCBpbiB0aGUgc3RvcmUgbGlrZVxuICAvLyBhbnkgb3RoZXIsIGFuZCBldmVyeSBiYWNrZW5kIHJlZHJhd3MgZnJvbSBpdHMgZXZlbnRzLlxuXG4gIGdldEFubm90YXRpb25SZWdpb25zKCk6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCkuZmlsdGVyKChyKSA9PiAhaXNQcm9maWxlUmVnaW9uKHIpKTtcbiAgfVxuICBzZXRBbm5vdGF0aW9uUmVnaW9ucyhcbiAgICByZWdpb25zOiBSZWdpb25bXSxcbiAgICBzaG93UmVnaW9uTGFiZWw/OiBib29sZWFuLFxuICAgIGlzUmVnaW9uU2F2ZU9uPzogYm9vbGVhbixcbiAgICBmaWxsQ29sb3I/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIC8vIFJlLWFwcGVuZCB0aGUgc3RvcmUncyBwcm9maWxlIGxpbmVzIHNvIGFuIGVkaXRvciBzYXZlL2RlbGV0ZSBjYW4ndCBkcm9wIHRoZW0uXG4gICAgY29uc3QgcHJvZmlsZXMgPSB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKS5maWx0ZXIoKHIpID0+IGlzUHJvZmlsZVJlZ2lvbihyKSk7XG4gICAgY29uc3QgYW5ub3RhdGlvbnMgPSAocmVnaW9ucyB8fCBbXSkuZmlsdGVyKChyKSA9PiAhaXNQcm9maWxlUmVnaW9uKHIpKTtcbiAgICB0aGlzLnNldFJlZ2lvbnMoWy4uLmFubm90YXRpb25zLCAuLi5wcm9maWxlc10sIHNob3dSZWdpb25MYWJlbCwgaXNSZWdpb25TYXZlT24sIGZpbGxDb2xvciwgZmFsc2UpO1xuICB9XG4gIGdldFNlbGVjdGVkUmVnaW9ucyQoKTogT2JzZXJ2YWJsZTxSZWdpb25bXT4ge1xuICAgIC8vIE1hcCB0aGUgaW50ZXJuYWwgaW5kZXgtYmFzZWQgc2VsZWN0aW9uIHRvIHRoZSBzZWxlY3RlZCBhbm5vdGF0aW9uIHJlZ2lvbnMuXG4gICAgcmV0dXJuIHRoaXMuZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMkKCkucGlwZShcbiAgICAgIG1hcCgoaWR4cykgPT4ge1xuICAgICAgICBjb25zdCByZWdzID0gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCk7XG4gICAgICAgIHJldHVybiBpZHhzLm1hcCgoaSkgPT4gcmVnc1tpXSkuZmlsdGVyKChyKTogciBpcyBSZWdpb24gPT4gISFyICYmICFpc1Byb2ZpbGVSZWdpb24ocikpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuICBzZXRTZWxlY3RlZFJlZ2lvbnMocmVnaW9uczogUmVnaW9uW10pOiB2b2lkIHtcbiAgICBjb25zdCByZWdzID0gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCk7XG4gICAgY29uc3QgaW5kaWNlcyA9IChyZWdpb25zIHx8IFtdKS5tYXAoKHIpID0+IHJlZ3MuZmluZEluZGV4KCh4KSA9PiB4LmlkID09PSByLmlkKSkuZmlsdGVyKChpKSA9PiBpID49IDApO1xuICAgIHRoaXMuc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoaW5kaWNlcyk7XG4gIH1cblxuICAvLyDilIDilIAgdG9vbHMg4oaSIGFjdGl2ZSByZW5kZXJlciAocnVuIG9uIGVpdGhlciBiYWNrZW5kKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gVGhlIHdhbmQsIHZlcnRleCBlcmFzZXIgYW5kIHpvb20tdG8tYm94IGFyZSBpbXBsZW1lbnRlZCBvbiBib3RoIGJhY2tlbmRzXG4gIC8vIHZpYSBJQ29vcmRpbmF0ZVRyYW5zZm9ybSAoKyBhIHZpZXdwb3J0IHBpeGVsIHJlYWRiYWNrIGZvciB0aGUgd2FuZCksIHNvIHRoZXlcbiAgLy8gZm9sbG93IHRoZSBhY3RpdmUgcmVuZGVyZXIg4oCUIHRoZSBzbGljZSBwYW5lJ3Mgd2hpbGUgdGhlIHZvbHVtZSB2aWV3IGlzIHNwbGl0LlxuICBzZXRBY3RpdmVUb29sKGlkOiBzdHJpbmcgfCBudWxsLCBvcHRpb25zPzogQ2FudmFzVG9vbE9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRBY3RpdmVUb29sKGlkLCBvcHRpb25zKTtcbiAgfVxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBzZXRBY3RpdmVUb29sfS4gKi9cbiAgc2V0V2FuZE1vZGUoYWN0aXZlOiBib29sZWFuLCBvcHRpb25zPzogSVdhbmRPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuc2V0V2FuZE1vZGUoYWN0aXZlLCBvcHRpb25zKTtcbiAgfVxuICBzZXRXYW5kT3B0aW9ucyhvcHRpb25zOiBJV2FuZE9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRXYW5kT3B0aW9ucyhvcHRpb25zKTtcbiAgfVxuICBjbGVhckFjdGl2ZVdhbmRSZWdpb24oKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuY2xlYXJBY3RpdmVXYW5kUmVnaW9uKCk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2V0QWN0aXZlVG9vbH0uICovXG4gIHNldEJydXNoTW9kZShhY3RpdmU6IGJvb2xlYW4sIG9wdGlvbnM/OiBJQnJ1c2hPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuc2V0QnJ1c2hNb2RlKGFjdGl2ZSwgb3B0aW9ucyk7XG4gIH1cbiAgc2V0QnJ1c2hPcHRpb25zKG9wdGlvbnM6IElCcnVzaE9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRCcnVzaE9wdGlvbnMob3B0aW9ucyk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2V0QWN0aXZlVG9vbH0uICovXG4gIHNldFZlcnRleEVyYXNlck1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuc2V0VmVydGV4RXJhc2VyTW9kZShhY3RpdmUpO1xuICB9XG4gIHNldFZlcnRleEVyYXNlclJhZGl1cyhyYWRpdXM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLnNldFZlcnRleEVyYXNlclJhZGl1cyhyYWRpdXMpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNldEFjdGl2ZVRvb2x9LiAqL1xuICBzZXRab29tVG9Cb3hNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLnNldFpvb21Ub0JveE1vZGUoYWN0aXZlKTtcbiAgfVxuICBzZWdtZW50UmVjdGFuZ2xlcygpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZWdtZW50UmVjdGFuZ2xlcygpO1xuICB9XG4gIHNlZ21lbnRSZWN0YW5nbGVzQ2VsbHBvc2UoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25CYWNrZW5kKCkuc2VnbWVudFJlY3RhbmdsZXNDZWxscG9zZSgpO1xuICB9XG4gIHNldFNhbU1vZGVsKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRTYW1Nb2RlbChpZCk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2V0QWN0aXZlVG9vbH0uICovXG4gIHNldFNhbVBvaW50TW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRTYW1Qb2ludE1vZGUoYWN0aXZlKTtcbiAgfVxuICBjb21taXRTYW1Qb2ludHMoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuY29tbWl0U2FtUG9pbnRzKCk7XG4gIH1cbiAgY2xlYXJTYW1Qb2ludHMoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuY2xlYXJTYW1Qb2ludHMoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBkaXNwbGF5IG9wdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFN0YXRlIGxpdmVzIGluIHRoZSBzaGFyZWQgVmlzdWFsaXplclN0b3JlIOKAlCByZWFkcyBnbyBzdHJhaWdodCB0byBpdC5cbiAgLy8gVGhlIHR3byBTRVRURVJTIHN0aWxsIHJvdXRlIHRocm91Z2ggUGxvdGx5IGJlY2F1c2UgaXRzIGltcGxlbWVudGF0aW9uc1xuICAvLyBjYXJyeSByZW5kZXIgZ2x1ZSBiZXlvbmQgdGhlIHN0b3JlIHdyaXRlIChhIGxpdmUgUGxvdGx5LnJlc3R5bGUgb2ZcbiAgLy8gY29sb3JzY2FsZS9yZXZlcnNlc2NhbGUgb24gdGhlIG1vdW50ZWQgaGVhdG1hcCk7IE9TRCByZWNvbG9ycyB2aWEgaXRzIG93blxuICAvLyBzdG9yZSBzdWJzY3JpcHRpb24gZWl0aGVyIHdheS5cbiAgZ2V0Q29sb3JtYXAoKTogT2JzZXJ2YWJsZTxDb2xvcm1hcE5vZGUgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKTtcbiAgfVxuICBzZXRDb2xvcm1hcChjb2xvcm1hcDogQ29sb3JtYXBOb2RlKTogdm9pZCB7XG4gICAgdGhpcy5wbG90bHkuc2V0Q29sb3JtYXAoY29sb3JtYXApO1xuICB9XG4gIGdldENvbG9ybWFwT3B0aW9ucygpOiBDb2xvcm1hcE5vZGVbXSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXBPcHRpb25zKCk7XG4gIH1cbiAgZ2V0UmV2ZXJzZVNjYWxlKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldFJldmVyc2VTY2FsZSgpO1xuICB9XG4gIHNldFJldmVyc2VTY2FsZShyZXZlcnNlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5wbG90bHkuc2V0UmV2ZXJzZVNjYWxlKHJldmVyc2UpO1xuICB9XG4gIHNldEltYWdlTWV0YShpbWFnZU1ldGE6IElJbWFnZU1ldGFkYXRhW10sIGltYWdlS2V5Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zZXRJbWFnZU1ldGEoaW1hZ2VNZXRhLCBpbWFnZUtleSk7XG4gIH1cbiAgZ2V0SW1hZ2VNZXRhKCk6IE9ic2VydmFibGU8SUltYWdlTWV0YWRhdGFbXT4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldEltYWdlTWV0YSgpO1xuICB9XG5cbiAgLy8g4pSA4pSAIElDaGFubmVsSGlzdG9ncmFtQXBpOiBDaGFubmVscyAmIEhpc3RvZ3JhbSBwYW5lIHN1cmZhY2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIENoYW5uZWwvZ3JheXNjYWxlL2ludmVydCBzdGF0ZSBsaXZlcyBpbiB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZTsgYm90aFxuICAvLyBiYWNrZW5kcyBzdWJzY3JpYmUgYW5kIHJlY29sb3IgbGl2ZSwgc28gc2V0dGVycyBqdXN0IHdyaXRlIHRoZSBzdG9yZS4gVGhlXG4gIC8vIGhpc3RvZ3JhbSBjb21lcyBmcm9tIHdoaWNoZXZlciBiYWNrZW5kIGlzIG9uIHNjcmVlbiAoaXRzIG5hdGl2ZSBwaXhlbHMpLlxuICBnZXRIaXN0b2dyYW0oY2hhbm5lbEluZGV4OiBudW1iZXIsIGJpbnM6IG51bWJlcik6IElIaXN0b2dyYW0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXgsIGJpbnMpO1xuICB9XG4gIGdldEhpc3RvZ3JhbSQoY2hhbm5lbEluZGV4OiBudW1iZXIsIGJpbnM6IG51bWJlcik6IE9ic2VydmFibGU8SUhpc3RvZ3JhbSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldEhpc3RvZ3JhbSQoY2hhbm5lbEluZGV4LCBiaW5zKTtcbiAgfVxuICAvKiogRXhwb3J0IHRoZSB1bmRlcmx5aW5nIGRhdGEgKDE2LWJpdCBtdWx0aS1iYW5kIFRJRkYpIHZpYSB0aGUgYWN0aXZlIGJhY2tlbmQuICovXG4gIGV4cG9ydERhdGEoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLmV4cG9ydERhdGEoKTtcbiAgfVxuICBnZXRDaGFubmVscyQoKTogT2JzZXJ2YWJsZTxJQ2hhbm5lbFN0YXRlW10+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRDaGFubmVsU3RhdGVzKCk7XG4gIH1cbiAgc2V0U2VsZWN0ZWRDaGFubmVsKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnNldFNlbGVjdGVkQ2hhbm5lbChpbmRleCk7XG4gIH1cbiAgc2V0Q2hhbm5lbFN0YXRlKGluZGV4OiBudW1iZXIsIHBhcnRpYWw6IFBhcnRpYWw8SUNoYW5uZWxTdGF0ZT4pOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnNldENoYW5uZWxTdGF0ZShpbmRleCwgcGFydGlhbCk7XG4gIH1cbiAgcmVzZXRDb250cmFzdChpbmRpY2VzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIC8vIEZ1bGwgcmVzZXQ6IHdpbmRvdyAoMC4uMjU1KSwgZ2FtbWEgKDEpIEFORCB0aGUgY2hhbm5lbCdzIGRlZmF1bHQgdGludC5cbiAgICBmb3IgKGNvbnN0IGkgb2YgaW5kaWNlcykgdGhpcy5zdG9yZS5yZXNldENoYW5uZWxTdGF0ZShpKTtcbiAgfVxuICAvKiogQXV0by13aW5kb3cgZWFjaCBjaGFubmVsIGJ5IHNhdHVyYXRpbmcgYHNhdHVyYXRpb25gICgwLi4xKSBvZiBwaXhlbHMgYXQgZWFjaFxuICAgKiAgZW5kIG9mIGl0cyBoaXN0b2dyYW0gKHNraXBwaW5nIG91dGxpZXIgZmlyc3QvbGFzdCBiaW5zKS4gKi9cbiAgYXV0b0NvbnRyYXN0KGluZGljZXM6IG51bWJlcltdLCBzYXR1cmF0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGkgb2YgaW5kaWNlcykge1xuICAgICAgY29uc3QgaCA9IHRoaXMucmVuZGVyZXIoKS5nZXRIaXN0b2dyYW0oaSwgMjU2KTtcbiAgICAgIGlmICghaCkgY29udGludWU7XG4gICAgICBjb25zdCBbbWluLCBtYXhdID0gYXV0b1dpbmRvd0Zyb21IaXN0b2dyYW0oaCwgc2F0dXJhdGlvbiwgWzAsIDI1NV0pO1xuICAgICAgaWYgKG1heCA+IG1pbikgdGhpcy5zdG9yZS5zZXRDaGFubmVsU3RhdGUoaSwgeyBtaW4sIG1heCB9KTtcbiAgICB9XG4gIH1cbiAgZ2V0R3JheXNjYWxlJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRHcmF5c2NhbGUoKTtcbiAgfVxuICBzZXRHcmF5c2NhbGUob246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnNldEdyYXlzY2FsZShvbik7XG4gIH1cbiAgZ2V0SW52ZXJ0JCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRJbnZlcnQoKTtcbiAgfVxuICBzZXRJbnZlcnQob246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnNldEludmVydChvbik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGFjdGl2ZSBiYWNrZW5kJ3MgcmVnaW9uIG92ZXJsYXkgKHRoZSBzbGljZSBwYW5lJ3Mgd2hpbGUgdGhlIHZvbHVtZSB2aWV3IGlzIHNwbGl0KS4gRmFsbHNcbiAgICogYmFjayB0byBQbG90bHkncyB3aGVuIHRoZSBhY3RpdmUgYmFja2VuZFxuICAgKiAoT1NEIG9yIG5hcGFyaS1qcykgaXMgc2VsZWN0ZWQgYnV0IGEgcGxvdCBpc24ndCBtb3VudGVkIHlldCwgc28gY2FsbGVycyBhbHdheXMgZ2V0IGFcbiAgICogdXNhYmxlIG92ZXJsYXkuXG4gICAqL1xuICBnZXRSZWdpb25PdmVybGF5KCk6IElSZWdpb25PdmVybGF5IHtcbiAgICBjb25zdCByID0gdGhpcy5yZWdpb25CYWNrZW5kKCk7XG4gICAgaWYgKHIgPT09IHRoaXMub3NkKSB7XG4gICAgICByZXR1cm4gdGhpcy5vc2QuZ2V0UmVnaW9uT3ZlcmxheSgpID8/IHRoaXMucGxvdGx5LmdldFJlZ2lvbk92ZXJsYXkoKTtcbiAgICB9XG4gICAgaWYgKHIgPT09IHRoaXMubmFwYXJpKSB7XG4gICAgICByZXR1cm4gdGhpcy5uYXBhcmkuZ2V0UmVnaW9uT3ZlcmxheSgpID8/IHRoaXMucGxvdGx5LmdldFJlZ2lvbk92ZXJsYXkoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGxvdGx5LmdldFJlZ2lvbk92ZXJsYXkoKTtcbiAgfVxuXG4gIC8qKiBJc29zdXJmYWNlIGNvbnRyb2xzIG9mIHRoZSBiYWNrZW5kIG9uIHNjcmVlbiwgd2hlbiBpdCByZW5kZXJzIGlzb3N1cmZhY2VzLiAqL1xuICBnZXRJc29zdXJmYWNlQ29udHJvbHMoKTogSUlzb3N1cmZhY2VDb250cm9scyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk7XG4gIH1cblxuICAvKiogM0Qgc2NlbmUgY29udHJvbHMgb2YgdGhlIGJhY2tlbmQgb24gc2NyZWVuIChQbG90bHkgb3IgbmFwYXJpLWpzKSwgb3IgbnVsbCBvbiBhXG4gICAqICAyRC1vbmx5IG9uZS4gKi9cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRTdXJmYWNlM2RDb250cm9scygpO1xuICB9XG5cbiAgLyoqIEludGVuc2l0eSAobGluZS1ST0kpIGNvbnRyb2xzLCB3aGljaGV2ZXIgYmFja2VuZCBkcmF3cyB0aGUgaW1hZ2U6IHRoZVxuICAgKiAgSW50ZW5zaXR5UHJvZmlsZVNlcnZpY2UgYWRkcyB0aGUgbGluZSB0byB0aGUgc3RvcmUsIGFuZCBldmVyeSBiYWNrZW5kXG4gICAqICAoUGxvdGx5IGluY2x1ZGVkKSBkcmF3cyBpdCBmcm9tIHRoZSBzdG9yZSdzIHVwZGF0ZSBldmVudC4gKi9cbiAgZ2V0SW50ZW5zaXR5Q29udHJvbHMoKTogSUludGVuc2l0eUNvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIFNwYXRpYWwtb21pY3MgY29udHJvbHMsIG9yIG51bGwgd2hlbiBubyBgU1BBVElBTF9EQVRBX1BPUlRgIGlzIGJvdW5kLiBTZXJ2ZWQgYnkgYVxuICAgKiBiYWNrZW5kLW5ldXRyYWwge0BsaW5rIFNwYXRpYWxDb250cm9sc0ZhY2FkZX0gKHN0YXRlIGluIHRoZSBzaGFyZWQgc3RvcmVzKSwgc28gdGhlXG4gICAqIGNvbnRyb2xzIHdvcmsgYWNyb3NzIGEgcGxvdC10eXBlIHN3aXRjaCBhbmQgYmVmb3JlIGFueSBiYWNrZW5kIGhhcyBtb3VudGVkLlxuICAgKi9cbiAgZ2V0U3BhdGlhbENvbnRyb2xzKCk6IElTcGF0aWFsQ29udHJvbHMgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuc3BhdGlhbERhdGEpIHJldHVybiBudWxsO1xuICAgIHRoaXMuc3BhdGlhbEZhY2FkZSA/Pz0gbmV3IFNwYXRpYWxDb250cm9sc0ZhY2FkZSh0aGlzLnNwYXRpYWxEYXRhLCB7XG4gICAgICBzdG9yZTogdGhpcy5zdG9yZSxcbiAgICAgIHJlZ2lvblN0b3JlOiB0aGlzLnJlZ2lvblN0b3JlLFxuICAgICAgc2VsZWN0aW9uU3RvcmU6IHRoaXMuc2VsZWN0aW9uU3RvcmUsXG4gICAgICBuYXBhcmk6IHRoaXMubmFwYXJpLFxuICAgICAgcGxvdFR5cGU6ICgpID0+IHRoaXMuY3VycmVudFBsb3RUeXBlLFxuICAgICAgekluZGV4OiAoKSA9PiB0aGlzLmN1cnJlbnRaSW5kZXgsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuc3BhdGlhbEZhY2FkZS5jb250cm9scztcbiAgfVxuXG4gIC8qKiBDcmVhdGVkIG9uIGZpcnN0IHVzZTsgb3ducyB0aGUgZGF0YXNldCBzdWJzY3JpcHRpb24uICovXG4gIHByaXZhdGUgc3BhdGlhbEZhY2FkZTogU3BhdGlhbENvbnRyb2xzRmFjYWRlIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBEaXNwbGF5ZWQgc2xpY2UuIE9ubHkgYSB2b2x1bWUtYmFja2VkIHNwYXRpYWwgZGF0YXNldCByZWFkcyBpdCwgdG8ga2VlcCBhXG4gICAqICByZWdpb24gZHJhd24gb3ZlciBvbmUgc2VjdGlvbiBmcm9tIHNlbGVjdGluZyB0aGUgd2hvbGUgZGVwdGggYmVoaW5kIGl0LiAqL1xuICBwcml2YXRlIGN1cnJlbnRaSW5kZXggPSAwO1xuXG4gIC8qKiBBbmd1bGFyIGNhbGxzIHRoaXMgd2hlbiB0aGUgaW5qZWN0b3IgcHJvdmlkaW5nIHRoZSByb3V0ZXIgaXMgZGVzdHJveWVkIOKAlCB0aGUgaG9zdFxuICAgKiAgY29tcG9uZW50IGZvciBhIGBwcm92aWRlVmlzdWFsaXphdGlvbigpYCBjaGFpbi4gVGhlIGRhdGFzZXQgc3Vic2NyaXB0aW9uIHdvdWxkXG4gICAqICBvdGhlcndpc2Uga2VlcCB0aGUgd2hvbGUgaXNvbGF0ZWQgY2hhaW4gcmVhY2hhYmxlIGZyb20gdGhlIHJvb3QgZGF0YSBwb3J0LiAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmltcG9ydFRpY2tldCA9IHsgaWQ6IHRoaXMuaW1wb3J0VGlja2V0LmlkICsgMSwgaW1hZ2U6IHVuZGVmaW5lZCB9OyAvLyBhIGxhdGUgaW1wb3J0IGNoYW5nZXMgbm90aGluZ1xuICAgIHRoaXMuc3BhdGlhbEZhY2FkZT8uZGlzcG9zZSgpO1xuICAgIHRoaXMuc3BhdGlhbEZhY2FkZSA9IG51bGw7XG4gICAgdGhpcy5yZWdpb25VcGRhdGVzLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zZWN0aW9uU3Vicy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuc2VjdGlvbnMuc3RvcCgpO1xuICAgIGlmICh0aGlzLnJlYnVpbGRUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMucmVidWlsZFRpbWVyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlbnNpdHktcHJvZmlsZSBzYW1wbGluZywgd2hpY2hldmVyIGJhY2tlbmQgaXMgb24gc2NyZWVuOiB0aGUgc2FtcGxpbmcgaXMgdGhlXG4gICAqIGJhY2tlbmQtbmV1dHJhbCBJbnRlbnNpdHlQcm9maWxlU2VydmljZSdzOyB0aGUgdmlld3BvcnQgY2hhbmdlcyBjb21lIGZyb20gZXZlcnlcbiAgICogYmFja2VuZCB0aGF0IHJlcG9ydHMgdGhlbSAoT3BlblNlYWRyYWdvbiwgbmFwYXJpLWpzKSwgbWVyZ2VkIGludG8gb25lIHN0YWJsZVxuICAgKiBzdHJlYW0gdGhlIGluc2V0IHN1YnNjcmliZXMgdG8gb25jZS5cbiAgICovXG4gIGdldEludGVuc2l0eVNhbXBsaW5nKCk6IElJbnRlbnNpdHlTYW1wbGluZyB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5U2FtcGxpbmc7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSBpbnRlbnNpdHlTYW1wbGluZzogSUludGVuc2l0eVNhbXBsaW5nID0ge1xuICAgIC8vIExvYWQgdGhlIGRpc3BsYXllZCBzbGljZSdzIHBpeGVscyBmb3IgYSBiYWNrZW5kIHRoYXQgaGFzIG5vIGZyYW1lcyBvZiBpdHMgb3duXG4gICAgLy8gKE9wZW5TZWFkcmFnb24sIG5hcGFyaS1qczsgUGxvdGx5IGZlZWRzIGl0cyBmcmFtZXMgdG8gdGhlIHNlcnZpY2Ugd2hlbiBpdCBwbG90cykuXG4gICAgZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmc6IChpbWFnZUluZm8sIHpJbmRleCkgPT4ge1xuICAgICAgdGhpcy5wb2ludFNhbXBsaW5nQXRQbG90KCk7XG4gICAgICByZXR1cm4gdGhpcy5pbnRlbnNpdHkuZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoaW1hZ2VJbmZvLCB6SW5kZXgpO1xuICAgIH0sXG4gICAgLy8gUmUtc2FtcGxlIGZyb20gYSBmcmVzaCBjcm9wIG9mIHRoZSBpbWFnZS1waXhlbCBST0kgYXQgZGlzcGxheSByZXNvbHV0aW9uLlxuICAgIHJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaTogKHgsIHksIHdpZHRoLCBoZWlnaHQsIHpJbmRleCkgPT4ge1xuICAgICAgdGhpcy5wb2ludFNhbXBsaW5nQXRQbG90KCk7XG4gICAgICB0aGlzLmludGVuc2l0eS5yZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koeCwgeSwgd2lkdGgsIGhlaWdodCwgekluZGV4KTtcbiAgICB9LFxuICAgIGdldFZpZXdwb3J0Q2hhbmdlJDogKCkgPT5cbiAgICAgIG1lcmdlKC4uLnRoaXMuYmFja2VuZHMoKS5tYXAoKGIpID0+IGIuZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKT8uZ2V0Vmlld3BvcnRDaGFuZ2UkKCkgPz8gRU1QVFkpKSxcbiAgfTtcbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKS5lbnN1cmVJbnRlbnNpdHlTYW1wbGluZygpYC4gKi9cbiAgZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmludGVuc2l0eVNhbXBsaW5nLmVuc3VyZUludGVuc2l0eVNhbXBsaW5nKGltYWdlSW5mbywgekluZGV4KTtcbiAgfVxuXG4gIC8qKiBDcm9wcyBmb3Igc2FtcGxpbmcgYXJlIHNpemVkIGZyb20gdGhlIHBsb3QgZGl2ICh3aGljaGV2ZXIgYmFja2VuZCByZW5kZXJzIGludG8gaXQpLiAqL1xuICBwcml2YXRlIHBvaW50U2FtcGxpbmdBdFBsb3QoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGxvdERpdikgdGhpcy5pbnRlbnNpdHkuc2V0U2FtcGxpbmdFbGVtZW50KHRoaXMucGxvdERpdik7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRJbnRlbnNpdHlTYW1wbGluZygpLmdldFZpZXdwb3J0Q2hhbmdlJCgpYC4gKi9cbiAgZ2V0Vmlld3BvcnRDaGFuZ2UkKCk6IE9ic2VydmFibGU8eyB4OiBudW1iZXI7IHk6IG51bWJlcjsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfT4ge1xuICAgIHJldHVybiB0aGlzLmludGVuc2l0eVNhbXBsaW5nLmdldFZpZXdwb3J0Q2hhbmdlJCgpO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKS5yZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koKWAuICovXG4gIHJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaSh4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIHpJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5pbnRlbnNpdHlTYW1wbGluZy5yZWZyZXNoSW50ZW5zaXR5U2FtcGxpbmdGb3JSb2koeCwgeSwgd2lkdGgsIGhlaWdodCwgekluZGV4KTtcbiAgfVxuXG4gIC8qKiBUaGUgdmlzdWFsaXplciB2aWV3IGlzIGdvaW5nIGF3YXk6IGRldGFjaCBldmVyeSBiYWNrZW5kIOKAlCBkcm9wcGluZyB0aGVpciB2aWV3LWJvdW5kXG4gICAqICBzdWJzY3JpcHRpb25zIGFuZCBkaXNwb3NpbmcgdGhlIG5hcGFyaS1qcyB2aWV3ZXIsIHdob3NlIGNhbnZhcywgcmVuZGVyIGxvb3AgYW5kIEdQVVxuICAgKiAgYnVmZmVycyB3b3VsZCBvdGhlcndpc2Ugb3V0bGl2ZSB0aGUgdmlldyAoZm9yIGEgY29tcG9uZW50LXNjb3BlZCBjaGFpbiwgZm9yZXZlcikuXG4gICAqICBOb3RoaW5nIGlzIG9uIHNjcmVlbiBhZnRlcndhcmRzLCBzbyB0aGUgbmV4dCBwbG90IHN0YXJ0cyBmcm9tIHRoZSBkZWZhdWx0IGJhY2tlbmQuICovXG4gIGRldGFjaCgpOiB2b2lkIHtcbiAgICB0aGlzLnNsaWNlUmVxdWVzdCsrO1xuICAgIHRoaXMuc2VjdGlvbnMuc3RvcCgpO1xuICAgIHRoaXMuc2xpY2VNb3VudGVkID0gZmFsc2U7XG4gICAgdGhpcy5zbGljZURpdiA9IG51bGw7XG4gICAgdGhpcy5wbG90bHkuZGV0YWNoKCk7XG4gICAgdGhpcy5vc2QuZGV0YWNoKCk7XG4gICAgdGhpcy5uYXBhcmkuZGV0YWNoKCk7XG4gICAgdGhpcy5sYXN0UmVuZGVyZWQgPSBudWxsO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgZGV0YWNofS4gKi9cbiAgdW5zdWJzY3JpYmUoKTogdm9pZCB7XG4gICAgdGhpcy5kZXRhY2goKTtcbiAgfVxufVxuIl19
|
|
1685
|
+
/**
|
|
1686
|
+
* A region set's classes as 3D groups, as the region editor's class tree shows them: one per root of
|
|
1687
|
+
* its hierarchy with every class under it (one per class of a flat one), in the hierarchy's order;
|
|
1688
|
+
* without a hierarchy, one per class its features have. Each in the colour the set gives it (its
|
|
1689
|
+
* hierarchy's, else its features').
|
|
1690
|
+
*/
|
|
1691
|
+
export function regionSetGroups(info) {
|
|
1692
|
+
const colors = new Map(Object.entries(info.classColors ?? {}));
|
|
1693
|
+
const nodes = [...(info.hierarchy ?? [])].sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
|
|
1694
|
+
if (!nodes.length) {
|
|
1695
|
+
return [...colors.entries()].map(([name, color]) => ({ key: name, classes: [name], color }));
|
|
1696
|
+
}
|
|
1697
|
+
for (const n of nodes)
|
|
1698
|
+
if (n.color)
|
|
1699
|
+
colors.set(n.name, n.color);
|
|
1700
|
+
const names = new Set(nodes.map((n) => n.name));
|
|
1701
|
+
const children = new Map();
|
|
1702
|
+
for (const n of nodes) {
|
|
1703
|
+
if (!n.parent || !names.has(n.parent))
|
|
1704
|
+
continue;
|
|
1705
|
+
children.set(n.parent, [...(children.get(n.parent) ?? []), n.name]);
|
|
1706
|
+
}
|
|
1707
|
+
const subtree = (name) => [name, ...(children.get(name) ?? []).flatMap(subtree)];
|
|
1708
|
+
return nodes
|
|
1709
|
+
.filter((n) => !n.parent || !names.has(n.parent))
|
|
1710
|
+
.map((n) => ({ key: n.name, classes: subtree(n.name), color: colors.get(n.name) ?? '#cccccc' }));
|
|
1711
|
+
}
|
|
1712
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGluZy12aXN1YWxpemVyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3JvdXRpbmctdmlzdWFsaXplci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFhLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQUUsS0FBSyxFQUFjLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkcsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFLNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBQ3hHLE9BQU8sRUFDTCxRQUFRLEVBRVIsVUFBVSxFQUNWLGVBQWUsRUFDZixjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQixjQUFjLEdBQ2YsTUFBTSx1QkFBdUIsQ0FBQztBQWUvQixPQUFPLEVBQUUsaUJBQWlCLEVBQW1CLE1BQU0scUNBQXFDLENBQUM7QUFFekYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU5QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDOUQsT0FBTyxFQUFFLHVCQUF1QixFQUFrQyxNQUFNLCtCQUErQixDQUFDO0FBSXhHLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRS9F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QUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNuRyxPQUFPLEtBQUs7U0FDVCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ2hELEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDckcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT25EZXN0cm95LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRU1QVFksIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgY29tYmluZUxhdGVzdCwgbWVyZ2UsIEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgSW1hZ2UgfSBmcm9tICdpbWFnZS1qcyc7XG5pbXBvcnQgeyByZXNvbHZlQ29sb3JtYXAgfSBmcm9tICduYXBhcmktanMnO1xuXG5pbXBvcnQgeyBJSW1hZ2VJbmZvLCBJSW1hZ2VNZXRhZGF0YSB9IGZyb20gJy4vY29udHJhY3RzL2ltYWdlLmNvbnRyYWN0JztcbmltcG9ydCB7IFBvbHlnb24sIFJlZ2lvbiB9IGZyb20gJy4vbW9kZWxzL3JlZ2lvbic7XG5pbXBvcnQgeyBDbGFzc1ByZXNldCwgUHJlc2V0U2V0IH0gZnJvbSAnLi9tb2RlbHMvY2xhc3MtcHJlc2V0JztcbmltcG9ydCB7IFBsb3RseVNlcnZpY2UgfSBmcm9tICcuL2ltcGxlbWVudGF0aW9ucy9wbG90bHkvcGxvdGx5LnNlcnZpY2UnO1xuaW1wb3J0IHsgT3BlblNlYWRyYWdvblZpc3VhbGl6ZXJTZXJ2aWNlIH0gZnJvbSAnLi9pbXBsZW1lbnRhdGlvbnMvb3NkL29wZW5zZWFkcmFnb24tdmlzdWFsaXplci5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFBsb3RUeXBlLFxuICBQbG90VHlwZURlc2NyaXB0b3IsXG4gIGlzTmFwYXJpM2QsXG4gIGlzTmFwYXJpU2NhdHRlcixcbiAgaXNTcGF0aWFsT21pY3MsXG4gIGlzU3BhdGlhbE9taWNzM2QsXG4gIGlzTmFwYXJpSXNvc3VyZmFjZSxcbiAgaXNOYXBhcmlWb2x1bWUsXG59IGZyb20gJy4vY29udHJhY3RzL3Bsb3QtdHlwZSc7XG5pbXBvcnQge1xuICBJVmlld2VyQmFja2VuZCxcbiAgSVZpc3VhbGl6ZXIsXG4gIExvYWRlZEltYWdlLFxuICBQaXhlbERhdGEsXG4gIEludGVuc2l0eVByb2ZpbGUsXG4gIElJc29zdXJmYWNlQ29udHJvbHMsXG4gIElJbnRlbnNpdHlDb250cm9scyxcbiAgSVN1cmZhY2UzZENvbnRyb2xzLFxuICBJU3BhdGlhbENvbnRyb2xzLFxuICBJSW50ZW5zaXR5U2FtcGxpbmcsXG4gIElPc2RWaWV3T3B0aW9ucyxcbiAgSVZvbHVtZVJlc29sdXRpb24sXG59IGZyb20gJy4vY29udHJhY3RzL3Zpc3VhbGl6ZXIuY29udHJhY3QnO1xuaW1wb3J0IHsgU1BBVElBTF9EQVRBX1BPUlQsIFNwYXRpYWxEYXRhUG9ydCB9IGZyb20gJy4vY29udHJhY3RzL3BvcnRzL3NwYXRpYWwtZGF0YS5wb3J0JztcbmltcG9ydCB0eXBlIHsgU3BhdGlhbERhdGFzZXQgfSBmcm9tICcuL2NvbnRyYWN0cy9zcGF0aWFsLWRhdGFzZXQuY29udHJhY3QnO1xuaW1wb3J0IHsgZHJhd25DZWxsU2V0cyB9IGZyb20gJy4vc3BhdGlhbC9sb2QnO1xuaW1wb3J0IHsgQ2FudmFzVG9vbE9wdGlvbnMsIENvbG9ybWFwTm9kZSwgSUJydXNoT3B0aW9ucywgSVdhbmRPcHRpb25zIH0gZnJvbSAnLi9jb250cmFjdHMvZGlzcGxheS10eXBlcyc7XG5pbXBvcnQgeyBTcGF0aWFsQ29udHJvbHNGYWNhZGUgfSBmcm9tICcuL3NwYXRpYWwvc3BhdGlhbC1jb250cm9scy5mYWNhZGUnO1xuaW1wb3J0IHsgUmVnaW9uU3RvcmUgfSBmcm9tICcuL3N0b3JlL3JlZ2lvbi1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJlZ2lvblNjb3BlQ2FjaGUgfSBmcm9tICcuL3N0b3JlL3JlZ2lvbi1zY29wZS1jYWNoZSc7XG5pbXBvcnQgeyBSRUdJT05fU09VUkNFX01JTl9DSEFSUywgUmVnaW9uU291cmNlLCBSZWdpb25Tb3VyY2VWaWV3IH0gZnJvbSAnLi9yZWdpb24tc291cmNlL3JlZ2lvbi1zb3VyY2UnO1xuaW1wb3J0IHR5cGUgeyBSZWdpb25JbmRleFBhZ2UsIFJlZ2lvbkluZGV4UXVlcnksIFJlZ2lvblNvdXJjZUluZm8gfSBmcm9tICcuL3JlZ2lvbi1zb3VyY2UvcmVnaW9uLXRpbGVzJztcbmltcG9ydCB0eXBlIHsgUmVnaW9uU3R5bGUgfSBmcm9tICcuL3JlZ2lvbi1vdmVybGF5L3JlZ2lvbi1zdHlsZSc7XG5pbXBvcnQgdHlwZSB7IE1lc2ggfSBmcm9tICduYXBhcmktanMvZ2VvbWV0cnknO1xuaW1wb3J0IHsgb3Blbkdlb0pzb25SZWdpb25Tb3VyY2UgfSBmcm9tICcuL3JlZ2lvbi1zb3VyY2Uvd29ya2VyLXJlZ2lvbi1zb3VyY2UnO1xuaW1wb3J0IHR5cGUgeyBSZWdpb25Tb3VyY2VPcGVuZXIsIFJlZ2lvblNvdXJjZVNsaWNlcyB9IGZyb20gJy4vc3RvcmUvcmVnaW9uLXNvdXJjZS1zY29wZSc7XG5pbXBvcnQgeyBTcGF0aWFsU2VsZWN0aW9uU3RvcmUgfSBmcm9tICcuL3N0b3JlL3NwYXRpYWwtc2VsZWN0aW9uLnNlcnZpY2UnO1xuaW1wb3J0IHsgVmlld2VyQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi9jb250cmFjdHMvY2FwYWJpbGl0aWVzLmNvbnRyYWN0JztcbmltcG9ydCB7IElSZWdpb25PdmVybGF5IH0gZnJvbSAnLi9jb250cmFjdHMvcmVnaW9uLW92ZXJsYXkuY29udHJhY3QnO1xuaW1wb3J0IHsgSVJlZ2lvbkVkaXRvckFwaSB9IGZyb20gJy4vY29udHJhY3RzL3JlZ2lvbi1lZGl0b3ItYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IElDaGFubmVsSGlzdG9ncmFtQXBpLCBJQ2hhbm5lbFN0YXRlLCBJSGlzdG9ncmFtIH0gZnJvbSAnLi9jb250cmFjdHMvY2hhbm5lbC1oaXN0b2dyYW0tYXBpLmNvbnRyYWN0JztcbmltcG9ydCB7IGF1dG9XaW5kb3dGcm9tSGlzdG9ncmFtIH0gZnJvbSAnLi9jb250cmFjdHMvaW50ZW5zaXR5JztcbmltcG9ydCB7IFZpc3VhbGl6ZXJTdG9yZSB9IGZyb20gJy4vc3RvcmUvdmlzdWFsaXplci1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IE5hcGFyaVZpc3VhbGl6ZXJTZXJ2aWNlIH0gZnJvbSAnLi9pbXBsZW1lbnRhdGlvbnMvbmFwYXJpLWpzL25hcGFyaS12aXN1YWxpemVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgY2hhbm5lbFRpbnRDb2xvcm1hcCwgdm9sdW1lQ29sb3JtYXAgfSBmcm9tICcuL2ltcGxlbWVudGF0aW9ucy9uYXBhcmktanMvbmFwYXJpLWRpc3BsYXktc3RhdGUnO1xuaW1wb3J0IHsgVklaX0NPTkZJRywgVml6Q29uZmlnIH0gZnJvbSAnLi9jb250cmFjdHMvdml6LWNvbmZpZyc7XG5pbXBvcnQgeyBQbG90TW9kZVZpZXdwb3J0IH0gZnJvbSAnLi9jb250cmFjdHMvcGxvdC10eXBlLWNvbnRyaWJ1dGlvbi5jb250cmFjdCc7XG5pbXBvcnQgeyBJbnRlbnNpdHlQcm9maWxlU2VydmljZSB9IGZyb20gJy4vaW50ZW5zaXR5L2ludGVuc2l0eS1wcm9maWxlLnNlcnZpY2UnO1xuaW1wb3J0IHsgY2hhbmdlZENsYXNzZXMsIGNsYXNzU2lnbmF0dXJlcyB9IGZyb20gJy4vc3RvcmUvY2xhc3Mtc2lnbmF0dXJlcyc7XG5pbXBvcnQgeyBWb2x1bWVTZWN0aW9ucyB9IGZyb20gJy4vdmlzdWFsaXplci92b2x1bWUtc2VjdGlvbnMnO1xuaW1wb3J0IHR5cGUgeyBTZWN0aW9uQXhpcywgU2VjdGlvblZpZXdzIH0gZnJvbSAnLi9jb250cmFjdHMvc2VjdGlvbi12aWV3LmNvbnRyYWN0JztcblxuLyoqIEhvdyBsb25nIGFmdGVyIHRoZSBsYXN0IGVkaXQgdGhlIHN1cmZhY2VzIG9mIHRoZSBjbGFzc2VzIGl0IHRvdWNoZWQgYXJlIHJlYnVpbHQgKG1zKS4gKi9cbmV4cG9ydCBjb25zdCBSRUdJT05fU1VSRkFDRV9SRUJVSUxEX01TID0gNjAwO1xuXG4vKiogSW50ZW5zaXR5LXByb2ZpbGUgbGluZSBST0lzIGFyZSBvd25lZCBieSB0aGUgaW50ZW5zaXR5IHRvb2wsIG5vdCB0aGUgZWRpdG9yLlxuICogIFBhY2thZ2UtaW50ZXJuYWwgcHJlZGljYXRlIChwcm9wZXJ0eS1iYXNlZCBzbyBpdCBhbHNvIG1hdGNoZXMgcGxhaW4gb2JqZWN0c1xuICogIGFmdGVyIGEgZHJhZyByb3VuZC10cmlwKS4gKi9cbmZ1bmN0aW9uIGlzUHJvZmlsZVJlZ2lvbihyOiB7IGtpbmQ/OiBzdHJpbmcgfSB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHI/LmtpbmQgPT09ICdwcm9maWxlJztcbn1cblxuLyoqXG4gKiBUaGUgdmlzdWFsaXplciBjaGFpbidzIGZyb250IGRvb3I6IGltcGxlbWVudHMgYElWaXN1YWxpemVyYCwgYElSZWdpb25FZGl0b3JBcGlgXG4gKiBhbmQgYElDaGFubmVsSGlzdG9ncmFtQXBpYCAoYm91bmQgdG8gdGhlIGBWSVNVQUxJWkVSYCAvIGBSRUdJT05fRURJVE9SX0FQSWAgL1xuICogYENIQU5ORUxfSElTVE9HUkFNX0FQSWAgdG9rZW5zKSBvdmVyIHRocmVlIHJlbmRlcmluZyBiYWNrZW5kcywgY2hvc2VuIHBlciBwbG90IHR5cGU6XG4gKiAgLSAqKkltYWdlKiogcmVuZGVycyB0aHJvdWdoIE9wZW5TZWFkcmFnb24gKG5hdGl2ZWx5IHRpbGVkLCByZWdpb24gdG9vbHMsXG4gKiAgICBjbGllbnQtc2lkZSBjb2xvcm1hcCksIG9yIHRocm91Z2ggbmFwYXJpLWpzIHdoZW4gYFZpekNvbmZpZy51c2VOYXBhcmlSZW5kZXJlcmBcbiAqICAgIG9wdHMgaW47IHRoZSBuYXBhcmkgaW1hZ2UgdHlwZXMgYW5kIHRoZSAyRCBzcGF0aWFsLW9taWNzIG1vZGUgcmVuZGVyIHRocm91Z2hcbiAqICAgIG5hcGFyaS1qcy4gQSBmYWlsZWQgbG9hZCBmYWxscyBiYWNrIG5hcGFyaS1qcyDihpIgT1NEIOKGkiBQbG90bHkgZm9yIHRoYXQgaW1hZ2Ugb25seVxuICogICAgKHNlZSBgbmFwYXJpRmVsbEJhY2tgIC8gYG9zZEZlbGxCYWNrYCwgY2xlYXJlZCBieSBgcmVzZXQoKWApLlxuICogIC0gdGhlIG5hcGFyaSAzRCB0eXBlcyAodm9sdW1lLCBpc29zdXJmYWNlLCBzdXJmYWNlLCAzRCBzY2F0dGVyLCB0aGUgM0Qgc3BhdGlhbFxuICogICAgY2xvdWQpIHJlbmRlciB0aHJvdWdoIG5hcGFyaS1qcywgZmFsbGluZyBiYWNrIHRvIFBsb3RseS5cbiAqICAtIGV2ZXJ5IG90aGVyIHBsb3QgdHlwZSAoaGVhdG1hcCwgY29udG91ciwgc3VyZmFjZSwgc2NhdHRlciwgbGluZSwg4oCmKSByZW5kZXJzXG4gKiAgICB0aHJvdWdoIFBsb3RseS5cbiAqXG4gKiBPbmx5IHJlbmRlcmluZyBhbmQgdGhlIHZpZXdwb3J0IGFyZSByb3V0ZWQgdG8gdGhlIGJhY2tlbmQgb24gc2NyZWVuLiBSZWdpb24gc3RhdGVcbiAqIGxpdmVzIGluIHRoZSBzaGFyZWQgYFJlZ2lvblN0b3JlYCBhbmQgZGlzcGxheSBzdGF0ZSAoY29sb3JtYXAsIGNoYW5uZWxzLCBwcmVzZXRzLFxuICogc3BhdGlhbCB2aWV3KSBpbiB0aGUgc2hhcmVkIGBWaXN1YWxpemVyU3RvcmVgLCBzbyBldmVyeSBiYWNrZW5kIHNlZXMgdGhlIHNhbWVcbiAqIHZhbHVlczsgdGhlIGJhY2tlbmRzIHN1YnNjcmliZSB0byB0aGVtIHRvIHJlZHJhdy5cbiAqXG4gKiBQYWNrYWdlLWludGVybmFsOiBob3N0cyBkZXBlbmQgb24gdGhlIHRva2Vucywgbm90IG9uIHRoaXMgY2xhc3MuXG4gKi9cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgUm91dGluZ1Zpc3VhbGl6ZXJTZXJ2aWNlIGltcGxlbWVudHMgSVZpc3VhbGl6ZXIsIElSZWdpb25FZGl0b3JBcGksIElDaGFubmVsSGlzdG9ncmFtQXBpLCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIGN1cnJlbnRQbG90VHlwZTogUGxvdFR5cGUgPSBQbG90VHlwZS5JTUFHRTtcbiAgcHJpdmF0ZSBsYXN0UmVuZGVyZWQ6IElWaWV3ZXJCYWNrZW5kIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBPU0QgZmFpbGVkIGZvciB0aGUgKmN1cnJlbnQqIHJlbmRlciBjeWNsZSAoZS5nLiBhIGZyZXNoIGZpbGUgc3RpbGwgY2FjaGluZ1xuICAgKiAgcGFzdCB0aGUgZGVhZGxpbmUpIOKGkiBmYWxsIGJhY2sgdG8gUGxvdGx5IGZvciB0aGlzIGltYWdlIG9ubHkuIFJlc2V0IGJ5XG4gICAqICByZXNldCgpIGF0IHRoZSBzdGFydCBvZiBldmVyeSByZW5kZXIgY3ljbGUsIHNvIHRoZSBuZXh0IGZpbGUg4oCUIG9yIGFcbiAgICogIHJlLXNlbGVjdCBvbmNlIHRoZSBmaWxlIGlzIGNhY2hlZCDigJQgcmV0cmllcyBPU0QuIChXYXMgYSBwZXJtYW5lbnQgZmxhZyxcbiAgICogIHdoaWNoIGxlZnQgdGhlIHdob2xlIHNlc3Npb24gc3R1Y2sgb24gUGxvdGx5IGFmdGVyIG9uZSBzbG93IGxvYWQuKSAqL1xuICBwcml2YXRlIG9zZEZlbGxCYWNrID0gZmFsc2U7XG4gIC8qKiBuYXBhcmktanMgZmFpbGVkIGZvciB0aGUgY3VycmVudCByZW5kZXIgY3ljbGUg4oaSIGZhbGwgYmFjayB0byBPU0QgKHRoZW4gUGxvdGx5KS5cbiAgICogIFJlc2V0IGJ5IHJlc2V0KCkgYXQgdGhlIHN0YXJ0IG9mIGV2ZXJ5IGN5Y2xlLCBsaWtlIHtAbGluayBvc2RGZWxsQmFja30uICovXG4gIHByaXZhdGUgbmFwYXJpRmVsbEJhY2sgPSBmYWxzZTtcbiAgLyoqIFRoZSBmaWxlIG5hbWUgb2YgdGhlIGltYWdlIGxhc3QgcGxvdHRlZCAobmFtZXMgYSBHZW9KU09OIGV4cG9ydCkuICovXG4gIHByaXZhdGUgcGxvdHRlZEZpbGVOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGUgZGl2IHRoZSBiYWNrZW5kcyByZW5kZXIgaW50byAoZXZlcnkgYmFja2VuZCBzaGFyZXMgaXQpOyAnJyBiZWZvcmUgdGhlIGZpcnN0IHBsb3QuICovXG4gIHByaXZhdGUgcGxvdERpdiA9ICcnO1xuICAvKipcbiAgICogV2hldGhlciByZWdpb25zIGNhbiBiZSBzaG93biBpbiAzRCBvbiBzY3JlZW46IGEgbmFwYXJpIHZvbHVtZSAob3IgaXNvc3VyZmFjZSkgdmlldywgb3IgdGhlIDNEXG4gICAqIHNwYXRpYWwgY2xvdWQgb3ZlciBhIHN0YWNrIGltYWdlIChpdHMgcmVmZXJlbmNlIHZvbHVtZSdzLCBzZWUgc2hvd1ZvbHVtZUFzSW1hZ2UpLiBCb3RoIGRyYXcgdGhlXG4gICAqIHJlZ2lvbiByZWNvbnN0cnVjdGlvbnMgdGhlIHNhbWUgd2F5IChWb2x1bWVSZWdpb25NZXNoZXMpLCBpbiB0aGUgdm9sdW1lJ3MgYm94LlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSB2b2x1bWVWaWV3JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKiogV2hldGhlciBhIG5hcGFyaSB2b2x1bWUgKG9yIGlzb3N1cmZhY2UpIHZpZXcgaXMgdGhlIGN1cnJlbnQgcGxvdCB0eXBlOiB0aGUgc2xpY2UgcGFuZSdzLiAqL1xuICBwcml2YXRlIGltYWdlVm9sdW1lVmlldyA9IGZhbHNlO1xuICAvKiogV2hldGhlciB0aGUgdm9sdW1lIHZpZXcncyBzbGljZSBwYW5lIGlzIHdhbnRlZCAoc2VlIHtAbGluayBzZXRTbGljZUVkaXRvcn0pLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNsaWNlRWRpdG9yJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKiogV2hldGhlciB0aGUgdm9sdW1lIHZpZXcgZHJhd3MgdGhlIHJlZ2lvbiByZWNvbnN0cnVjdGlvbnMgdGhyb3VnaCB0aGUgdm9sdW1lLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lvbnNUaHJvdWdoVm9sdW1lJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICAvKiogUmVnaW9uIHJlY29uc3RydWN0aW9ucyBidWlsdCBzbyBmYXIsIGJ5IGltYWdlLCByZXNvbHV0aW9uIGFuZCBjbGFzc2VzICh3aXRoIHRob3NlIGNsYXNzZXMpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IG1lc2hDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCB7IG1lc2g6IE1lc2g7IGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdIH0+KCk7XG4gIC8qKiBCdW1wZWQgcGVyIHtAbGluayBzaG93UmVnaW9uQ2xhc3NlczNkfSAoYW5kIHBlciBuZXcgaW1hZ2UpLCBzbyBvbmx5IHRoZSBsYXRlc3Qgb25lIHNob3dzLiAqL1xuICBwcml2YXRlIG1lc2hSZXF1ZXN0ID0gMDtcbiAgLyoqIFRoZSBjbGFzcyBncm91cHMgc2hvd24gaW4gM0QsIGFuZCB0aGUgaW1hZ2UgdGhleSBiZWxvbmcgdG8uICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY2xhc3NlczNkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UmVhZG9ubHlBcnJheTx7IGtleTogc3RyaW5nOyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSB9Pj4oXG4gICAgW10sXG4gICk7XG4gIHByaXZhdGUgY2xhc3NlczNkSW1hZ2U6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFRoZSBzcGF0aWFsIGRhdGFzZXQncyByZWdpb24gc2V0IGF0dGFjaGVkIHRvIGl0cyBpbWFnZSAoc2VlIGF0dGFjaERhdGFzZXRSZWdpb25TZXQpOiB0aGUgaW1hZ2VcbiAgICogKGl0cyByZWdpb24gc2NvcGUga2V5KSwgdGhlIHNldCdzIGtleSwgYW5kIHdoZXJlIGl0cyBzbGljZXMgYXJlIHdoZW4gaXQgc2F5cyAoaXRzIGBzbGljZVpgKSxcbiAgICogd2hpY2ggcGxhY2VzIGl0cyBzdXJmYWNlcyBpbiBzcGF0aWFsIDNEIG9uIGFuIGltYWdlIG9mIG9uZSBwbGFuZS4gYHNob3duM2RgIG9uY2UgaXRzIGNsYXNzZXNcbiAgICogd2VyZSBzaG93biBpbiAzRCBieSB0aGVtc2VsdmVzLCB3aGljaCBoYXBwZW5zIG9uY2UgcGVyIGltYWdlLlxuICAgKi9cbiAgcHJpdmF0ZSBkYXRhc2V0UmVnaW9uU2V0OiBEYXRhc2V0UmVnaW9uU2V0U3RhdGUgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIEVhY2ggaW1hZ2UncyBhdHRhY2hlZCByZWdpb24gc2V0LCBrZXB0IGFjcm9zcyBpbWFnZSBzd2l0Y2hlczogY29taW5nIGJhY2sgdG8gdGhlIGltYWdlIGZpbmRzXG4gICAqIGl0cyBzb3VyY2Ugc3RpbGwgaW4gdGhlIHN0b3JlICh3aXRoIHdoYXQgd2FzIHRha2VuIGZyb20gaXQsIG9yIGRlbGV0ZWQpIGFuZCByZXN0b3JlcyB0aGUgc2V0XG4gICAqIHJhdGhlciB0aGFuIGF0dGFjaGluZyBpdCBhZ2Fpbiwgd2hpY2ggd291bGQgc3RhcnQgdGhlIHNvdXJjZSBhZnJlc2guXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGF0dGFjaGVkUmVnaW9uU2V0cyA9IG5ldyBNYXA8c3RyaW5nLCBEYXRhc2V0UmVnaW9uU2V0U3RhdGU+KCk7XG4gIC8qKiBUaGUgc3BhdGlhbCBkYXRhc2V0IG9uIG9mZmVyICh0aGUgcG9ydCdzKSwgZm9yIHRoZSBib3VuZGFyeSBzZXQgaXRzIHJlZ2lvbiBzZXQgaXMuICovXG4gIHByaXZhdGUgc3BhdGlhbERhdGFzZXQ6IFNwYXRpYWxEYXRhc2V0IHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBBbm5vdGF0aW9ucyBzd2l0Y2ggbGFzdCBoaWQgZXZlcnkgY2xhc3MgaW4gYSBzcGF0aWFsIHZpZXcgKHNlZSBzeW5jQW5ub3RhdGlvbnMpLCBzb1xuICAgKiBhIGNoYW5nZSBvZiBpdCwgbm90IGV2ZXJ5IHZpZXcgZW1pc3Npb24sIGhpZGVzIG9yIHNob3dzIHRoZW0uXG4gICAqL1xuICBwcml2YXRlIGFubm90YXRpb25zSGlkZGVuID0gZmFsc2U7XG4gIC8qKiBUaGUgM0QgdmlldydzIGdsb2JhbCBjZWxscyBzd2l0Y2ggYXMgbGFzdCBhcHBsaWVkIChzZWUgdXBkYXRlQ2VsbHMzZCkuICovXG4gIHByaXZhdGUgY2VsbHMzZE1vZGU6ICd0eXBlcycgfCAnY2VsbHMnID0gJ3R5cGVzJztcbiAgLyoqIENsYXNzZXMgc2V0IHRoZSBvdGhlciB3YXkgdGhhbiB0aGUgZ2xvYmFsIHN3aXRjaCBpbiB0aGUgUmVnaW9uIEVkaXRvci4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBjZWxsczNkT3ZlcnJpZGVzID0gbmV3IE1hcDxzdHJpbmcsIGJvb2xlYW4+KCk7XG4gIC8qKiBUaGUgY2xhc3NlcyBkcmF3biBhcyBpbmRpdmlkdWFsIGNlbGxzIGluIHNwYXRpYWwgM0QsIGFzIGxhc3QgYXBwbGllZC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBpbmRpdmlkdWFsM2QkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSZWFkb25seVNldDxzdHJpbmc+PihuZXcgU2V0KCkpO1xuICAvKiogVGhlIGNsYXNzZXMgdGhhdCBjYW4gYmUgZHJhd24gYXMgaW5kaXZpZHVhbCBjZWxscyBub3cgKHNlZSBnZXRDZWxsYWJsZUNsYXNzZXMzZCQpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGNlbGxhYmxlM2QkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSZWFkb25seVNldDxzdHJpbmc+PihuZXcgU2V0KCkpO1xuICAvKiogRm9sbG93cyB0aGUgZGF0YXNldCBhbmQgdGhlIHNwYXRpYWwgdmlldyBmb3Ige0BsaW5rIHVwZGF0ZVBsYW5lQ2VsbHN9LiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHBsYW5lQ2VsbHNTdWI6IFN1YnNjcmlwdGlvbiB8IG51bGw7XG4gIC8qKiBUaGUgZGF0YXNldCByZWdpb24gc2V0J3MgcGxhbmVzIHdoaWxlIHRoZXkgc2xpY2UgdGhlIHBsb3R0ZWQgaW1hZ2UgKHNlZSBnZXREYXRhc2V0UGxhbmVzJCkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgZGF0YXNldFBsYW5lcyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHJlYWRvbmx5IG51bWJlcltdIHwgbnVsbD4obnVsbCk7XG4gIC8qKiBUaGUgZ3JvdXBzIGxhc3QgYXNrZWQgZm9yIGluIDNELCB3aXRoIHRoZWlyIGNvbG91cnM6IHdoYXQgYW4gZWRpdCdzIHJlYnVpbGQgc2hvd3MgYWdhaW4uICovXG4gIHByaXZhdGUgc2hvd24zZDogUmVhZG9ubHlBcnJheTx7IGtleTogc3RyaW5nOyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXTsgY29sb3I6IHN0cmluZzsgbGFiZWw/OiBzdHJpbmcgfT4gPSBbXTtcbiAgLyoqXG4gICAqIEVhY2ggY2xhc3MncyBmaW5nZXJwcmludCBvbiB0aGUgbGl2ZSBzbGljZSAoc2VlIGNsYXNzU2lnbmF0dXJlcyksIHdoaWNoIGltYWdlIGFuZCBzbGljZSwgYW5kXG4gICAqIHdoYXQgdGhlIHJlZ2lvbiBzb3VyY2VzIGhvbGQgKHNlZSBSZWdpb25TdG9yZS5nZXRTb3VyY2VTdGF0ZUtleSkuIE51bGwgd2hpbGUgbm90aGluZyBmb2xsb3dzXG4gICAqIHRoZSBlZGl0cyAobm8gc3VyZmFjZSBidWlsdCwgbm8gc2VjdGlvbnMpLlxuICAgKi9cbiAgcHJpdmF0ZSBsaXZlQ2xhc3NlczogeyBhdDogc3RyaW5nOyBzaWduYXR1cmVzOiBNYXA8c3RyaW5nLCBudW1iZXI+OyBzb3VyY2VzOiBzdHJpbmcgfSB8IG51bGwgPSBudWxsO1xuICAvKiogVGhlIHBlbmRpbmcgcmVidWlsZCBvZiB0aGUgc3VyZmFjZXMgYW4gZWRpdCB0b3VjaGVkLiAqL1xuICBwcml2YXRlIHJlYnVpbGRUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpb25VcGRhdGVzOiBTdWJzY3JpcHRpb247XG5cbiAgLy8g4pSA4pSAIFRoZSBzbGljZSBwYW5lICh0aGUgdm9sdW1lIHZpZXcncyBzcGxpdCk6IE9TRCBlZGl0aW5nIG9uZSBzbGljZSBiZXNpZGUgdGhlIDNEIHZpZXcg4pSA4pSAXG4gIC8qKiBUaGUgZGl2IHRoZSBzbGljZSBwYW5lIHJlbmRlcnMgaW50byB3aGlsZSBpdCBpcyB3YW50ZWQgKG51bGw6IG5vIHNwbGl0KS4gKi9cbiAgcHJpdmF0ZSBzbGljZURpdjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBXaGV0aGVyIE9TRCBpcyBtb3VudGVkIGluIHRoZSBzbGljZSBwYW5lOiByZWdpb24sIHRvb2wgYW5kIG92ZXJsYXkgY2FsbHMgZ28gdG8gaXQuICovXG4gIHByaXZhdGUgc2xpY2VNb3VudGVkID0gZmFsc2U7XG4gIC8qKiBUaGUgaW1hZ2UgdGhlIHNsaWNlIHBhbmUgc2hvd3MuICovXG4gIHByaXZhdGUgc2xpY2VGaWxlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIC8qKiBCdW1wZWQgcGVyIHNsaWNlLXBhbmUgbW91bnQgb3IgdGVhcmRvd24sIHNvIG9ubHkgdGhlIGxhdGVzdCBvbmUgbGFuZHMuICovXG4gIHByaXZhdGUgc2xpY2VSZXF1ZXN0ID0gMDtcbiAgLyoqIFRoZSBzZWN0aW9ucyBiZXNpZGUgdGhlIHNwbGl0IHZvbHVtZSB2aWV3ICh0aGUgcGxhbmVzIHggYW5kIHkgdGhyb3VnaCB0aGUgc3RhY2spLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNlY3Rpb25zOiBWb2x1bWVTZWN0aW9ucztcbiAgLyoqIFRoZSB6IHBsYW5lIGRyYWdnZWQgaW4gdGhlIHZvbHVtZTogdGhlIHNsaWNlIHRvIHNob3cgKHNlZSB7QGxpbmsgZ2V0U2xpY2VEcmFnJH0pLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNsaWNlRHJhZyQgPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2VjdGlvblN1YnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIC8qKiBUaGUgaW1hZ2UgaW5mbyBhbmQgc2NyZWVuIGhlaWdodCBvZiB0aGUgbGFzdCBwbG90ICh3aGF0IHRoZSBzbGljZSBwYW5lIG1vdW50cykuICovXG4gIHByaXZhdGUgcGxvdHRlZEluZm86IElJbWFnZUluZm8gfCBudWxsID0gbnVsbDtcbiAgLyoqIFRoZSBjdXJyZW50IHJlZ2lvbiBpbXBvcnQgKHNlZSByZWdpb25JbXBvcnRUaWNrZXQpOiBpdHMgaWQgYW5kIHRoZSBpbWFnZSBpdCB3YXMgdGFrZW4gZm9yLiAqL1xuICBwcml2YXRlIGltcG9ydFRpY2tldDogeyBpZDogbnVtYmVyOyBpbWFnZTogc3RyaW5nIHwgdW5kZWZpbmVkIH0gPSB7IGlkOiAwLCBpbWFnZTogdW5kZWZpbmVkIH07XG4gIHByaXZhdGUgcGxvdHRlZEhlaWdodCA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwbG90bHk6IFBsb3RseVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBvc2Q6IE9wZW5TZWFkcmFnb25WaXN1YWxpemVyU2VydmljZSxcbiAgICBwcml2YXRlIG5hcGFyaTogTmFwYXJpVmlzdWFsaXplclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzdG9yZTogVmlzdWFsaXplclN0b3JlLFxuICAgIEBJbmplY3QoVklaX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IFZpekNvbmZpZyxcbiAgICAvLyBPcHRpb25hbDogYSBob3N0IHRoYXQgc2VydmVzIG5vIHNwYXRpYWwtb21pY3MgZGF0YSBiaW5kcyBub3RoaW5nLFxuICAgIC8vIGFuZCBgZ2V0U3BhdGlhbENvbnRyb2xzKClgIHRoZW4gcmV0dXJucyBudWxsLlxuICAgIHByaXZhdGUgcmVnaW9uU3RvcmU6IFJlZ2lvblN0b3JlLFxuICAgIHByaXZhdGUgc2VsZWN0aW9uU3RvcmU6IFNwYXRpYWxTZWxlY3Rpb25TdG9yZSxcbiAgICBwcml2YXRlIGludGVuc2l0eTogSW50ZW5zaXR5UHJvZmlsZVNlcnZpY2UsXG4gICAgQE9wdGlvbmFsKClcbiAgICBASW5qZWN0KFNQQVRJQUxfREFUQV9QT1JUKVxuICAgIHByaXZhdGUgc3BhdGlhbERhdGE6IFNwYXRpYWxEYXRhUG9ydCB8IG51bGwgPSBudWxsLFxuICApIHtcbiAgICB0aGlzLnJlZ2lvblVwZGF0ZXMgPSB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblVwZGF0ZUV2ZW50KCkuc3Vic2NyaWJlKCgpID0+IHRoaXMub25SZWdpb25zQ2hhbmdlZCgpKTtcbiAgICB0aGlzLnBsYW5lQ2VsbHNTdWIgPSB0aGlzLnNwYXRpYWxEYXRhXG4gICAgICA/IGNvbWJpbmVMYXRlc3QoW3RoaXMuc3BhdGlhbERhdGEuZ2V0RGF0YXNldCQoKSwgdGhpcy5zdG9yZS5nZXRTcGF0aWFsVmlldyQoKV0pLnN1YnNjcmliZSgoW2RhdGFzZXRdKSA9PiB7XG4gICAgICAgICAgdGhpcy5zcGF0aWFsRGF0YXNldCA9IGRhdGFzZXQgPz8gbnVsbDtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVBsYW5lQ2VsbHMoKTtcbiAgICAgICAgICB0aGlzLnN5bmNBbm5vdGF0aW9ucygpO1xuICAgICAgICAgIHRoaXMudXBkYXRlQ2VsbHMzZCgpO1xuICAgICAgICB9KVxuICAgICAgOiBudWxsO1xuICAgIHRoaXMuc2VjdGlvbnMgPSBuZXcgVm9sdW1lU2VjdGlvbnMoe1xuICAgICAgdm9sdW1lOiAoKSA9PiB0aGlzLm5hcGFyaS52b2x1bWVWb3hlbHMoKSxcbiAgICAgIGltYWdlOiAoKSA9PiB0aGlzLnBsb3R0ZWRGaWxlTmFtZSxcbiAgICAgIHNob3dQbGFuZXM6IChwbGFuZXMpID0+IHRoaXMubmFwYXJpLnNldFNsaWNlUGxhbmVzKHBsYW5lcyksXG4gICAgICBvdXRsaW5lc0J5Q2xhc3M6IChsZXZlbCkgPT4gdGhpcy5yZWdpb25TdG9yZS5vdXRsaW5lc0J5Q2xhc3MobGV2ZWwpLFxuICAgICAgaXNDbGFzc0hpZGRlbjogKGxhYmVsKSA9PiB0aGlzLnJlZ2lvblN0b3JlLmlzQ2xhc3NIaWRkZW4obGFiZWwpLFxuICAgICAgY29sb3JPZjogKGxhYmVsKSA9PiB0aGlzLmNsYXNzQ29sb3IobGFiZWwpLFxuICAgICAgY2hhbm5lbFN0YXRlczogKCkgPT4gdGhpcy5zdG9yZS5jdXJyZW50Q2hhbm5lbFN0YXRlcygpLFxuICAgICAgY29sb3JtYXA6IChzdCwgbXVsdGljaGFubmVsKSA9PiB7XG4gICAgICAgIC8vIEFzIHRoZSB2b2x1bWUgc2NlbmUgY29sb3VycyB0aGUgY2hhbm5lbCAoaW52ZXJ0IGlzIGFwcGxpZWQgYmVmb3JlIHRoZSBjb2xvcm1hcCkuXG4gICAgICAgIGNvbnN0IGRpc3BsYXkgPSB7XG4gICAgICAgICAgY29sb3JtYXA6IHRoaXMuc3RvcmUuY3VycmVudENvbG9ybWFwKCksXG4gICAgICAgICAgcmV2ZXJzZTogdGhpcy5zdG9yZS5jdXJyZW50UmV2ZXJzZVNjYWxlKCksXG4gICAgICAgICAgaW52ZXJ0OiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHJlc29sdmVDb2xvcm1hcChcbiAgICAgICAgICBtdWx0aWNoYW5uZWwgPyBjaGFubmVsVGludENvbG9ybWFwKHN0Py5jb2xvciA/PyAnI2ZmZmZmZicsIGRpc3BsYXkpIDogdm9sdW1lQ29sb3JtYXAoc3QsIGRpc3BsYXkpLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIGludmVydDogKCkgPT4gdGhpcy5zdG9yZS5jdXJyZW50SW52ZXJ0KCksXG4gICAgICBzbGljZTogKCkgPT4gdGhpcy5jdXJyZW50WkluZGV4LFxuICAgIH0pO1xuICAgIC8vIEEgcGxhbmUgZHJhZ2dlZCBpbiB0aGUgdm9sdW1lOiB0aGUgeiBwbGFuZSBwaWNrcyB0aGUgc2xpY2UgKHRocm91Z2ggdGhlIGhvc3QncyBzbGlkZXIsIHNvXG4gICAgLy8gdGhlIHN0b3JlIGFuZCB0aGUgc2xpY2UgcGFuZSBmb2xsb3cpLCB0aGUgb3RoZXJzIG1vdmUgdGhlaXIgc2VjdGlvbi5cbiAgICB0aGlzLnNlY3Rpb25TdWJzLmFkZChcbiAgICAgIHRoaXMubmFwYXJpLmdldFNsaWNlUGxhbmVNb3ZlJCgpLnN1YnNjcmliZSgoeyBheGlzLCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgIGlmIChheGlzID09PSAneicpIHRoaXMuc2xpY2VEcmFnJC5uZXh0KE1hdGgucm91bmQodmFsdWUpKTtcbiAgICAgICAgZWxzZSB0aGlzLnNlY3Rpb25zLnNldFBsYW5lKGF4aXMsIHZhbHVlKTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgdGhpcy5zZWN0aW9uU3Vicy5hZGQodGhpcy5zdG9yZS5nZXRDaGFubmVsU3RhdGVzKCkuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKSkpO1xuICAgIHRoaXMuc2VjdGlvblN1YnMuYWRkKHRoaXMuc3RvcmUuZ2V0SW52ZXJ0KCkuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKSkpO1xuICAgIHRoaXMuc2VjdGlvblN1YnMuYWRkKHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zZWN0aW9ucy5zY2hlZHVsZSgpKSk7XG4gICAgdGhpcy5zZWN0aW9uU3Vicy5hZGQodGhpcy5zdG9yZS5nZXRSZXZlcnNlU2NhbGUoKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zZWN0aW9ucy5zY2hlZHVsZSgpKSk7XG4gIH1cblxuICAvKiogQSBjbGFzcydzIGNvbG91cjogaXRzIGNsYXNzaWZpY2F0aW9uIGNvbG91ciwgZWxzZSBpdHMgcmVnaW9uIHNvdXJjZSdzLCBlbHNlIGEgZGVmYXVsdC4gKi9cbiAgcHJpdmF0ZSBjbGFzc0NvbG9yKGxhYmVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnN0b3JlLmdldENsYXNzaWZpY2F0aW9uQ29sb3JzKCkuZ2V0KGxhYmVsKSA/P1xuICAgICAgdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25Tb3VyY2VWaWV3KCk/LmNvbG9yT2YoeyBsYWJlbCwgY29sb3I6IG51bGwgfSkgPz9cbiAgICAgICcjZmZjYzAwJ1xuICAgICk7XG4gIH1cblxuICAvKiogVGhlIHNlY3Rpb25zIGJlc2lkZSB0aGUgc3BsaXQgdm9sdW1lIHZpZXcgKG51bGxzIHdoaWxlIGl0IGlzIG5vdCBzcGxpdCkuICovXG4gIGdldFNlY3Rpb25WaWV3cyQoKTogT2JzZXJ2YWJsZTxTZWN0aW9uVmlld3M+IHtcbiAgICByZXR1cm4gdGhpcy5zZWN0aW9ucy5nZXRWaWV3cyQoKTtcbiAgfVxuXG4gIC8qKiBNb3ZlIGEgc2VjdGlvbidzIHBsYW5lIHRvIGBhdGAgKGltYWdlIHB4KS4gKi9cbiAgc2V0U2VjdGlvblBsYW5lKGF4aXM6IFNlY3Rpb25BeGlzLCBhdDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZWN0aW9ucy5zZXRQbGFuZShheGlzLCBhdCk7XG4gIH1cblxuICAvKiogVGhlIHNsaWNlIHBpY2tlZCBieSBkcmFnZ2luZyB0aGUgeiBwbGFuZSBpbiB0aGUgdm9sdW1lOiB0aGUgaG9zdCBzaG93cyBpdCAoaXRzIHNsaWRlcikuICovXG4gIGdldFNsaWNlRHJhZyQoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5zbGljZURyYWckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0ltYWdlVHlwZSh0OiBQbG90VHlwZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0ID09PSBQbG90VHlwZS5JTUFHRTtcbiAgfVxuXG4gIC8qKiBUaGUgMkQgbmFwYXJpIHR5cGVzIChpbWFnZSwgcmVnaW9uLWNlbnRyb2lkIHNjYXR0ZXIsIHNwYXRpYWwgb21pY3MpIOKAlCBhIDJEIGZhbGxiYWNrIGNoYWluXG4gICAqICAoT1NELCB0aGVuIFBsb3RseSkuXG4gICAqXG4gICAqICBOT1RFIGZvciBTUEFUSUFMX09NSUNTOiBvbmx5IG5hcGFyaS1qcyBkcmF3cyB0aGUgb2JzZXJ2YXRpb24gbWFya2Vycy4gSWYgaXQgZmFpbHMgKG5vIFdlYkdQVSxcbiAgICogIGRldmljZSBsb3NzKSB0aGUgZmFsbGJhY2sgcmVuZGVycyB0aGUgdGlzc3VlIGltYWdlIEFMT05FIOKAlCB0aGUgc3BhdGlhbCBsYXllciBpcyBhYnNlbnQsIG5vdFxuICAgKiAgZGVncmFkZWQuIFRoYXQgaXMgZGVsaWJlcmF0ZSBmb3Igbm93OiBzaG93aW5nIHRoZSBzbGlkZSBiZWF0cyBzaG93aW5nIG5vdGhpbmcsIGFuZCBhIFBsb3RseVxuICAgKiAgYHNjYXR0ZXJnbGAgc3BhdGlhbCBtb2RlIGlzIHRoZSBwbGFubmVkIHJlYWwgZmFsbGJhY2sgKHNlZSB0aGUgcGxvdC1tb2RlIGRlc2lnbiBkb2MpLiAqL1xuICBwcml2YXRlIGlzTmFwYXJpSW1hZ2VUeXBlKHQ6IFBsb3RUeXBlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHQgPT09IFBsb3RUeXBlLk5BUEFSSV9JTUFHRSB8fCBpc05hcGFyaVNjYXR0ZXIodCkgfHwgaXNTcGF0aWFsT21pY3ModCk7XG4gIH1cblxuICAvKiogVGhlIDNEIG5hcGFyaSB0eXBlcyAodm9sdW1lL2lzb3N1cmZhY2Uvc3VyZmFjZS9zY2F0dGVyLCBwbHVzIHRoZSAzRCBzcGF0aWFsIGNsb3VkKSDigJQgbm8gMkRcbiAgICogIGZhbGxiYWNrIGV4aXN0cyAoT1NEIGlzIGltYWdlLW9ubHkpLCBzbyB0aGV5IGZhbGwgc3RyYWlnaHQgdG8gUGxvdGx5LiAqL1xuICBwcml2YXRlIGlzTmFwYXJpM2RUeXBlKHQ6IFBsb3RUeXBlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzTmFwYXJpM2QodCkgfHwgaXNTcGF0aWFsT21pY3MzZCh0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCYWNrZW5kIHRvIGF0dGVtcHQgZm9yIHRoZSBjdXJyZW50IHBsb3QgdHlwZSB0aGlzIHJlbmRlci4gVGhlIGZhbGxiYWNrIGNoYWlucyBiZWxvdyBhcmVcbiAgICogbWlycm9yZWQgZXhhY3RseSBieSB7QGxpbmsgbG9hZH0gc28gdGhlIGhhbmRsZSBgcGxvdCgpYCByZWNlaXZlcyBhbHdheXMgY29tZXMgZnJvbSB0aGVcbiAgICogYmFja2VuZCBgcGxvdCgpYCBzZWxlY3RzIChubyBsb2FkL3Bsb3QgYmFja2VuZCBtaXNtYXRjaCk6XG4gICAqICAtIDJEIGltYWdlIChleHBsaWNpdCBgTkFQQVJJX0lNQUdFYCwgb3IgYElNQUdFYCB3aXRoIHRoZSBXZWJHUFUgb3B0LWluKTogbmFwYXJpLWpzIOKGkiBPU0Qg4oaSIFBsb3RseS5cbiAgICogIC0gcGxhaW4gYElNQUdFYCAobm8gb3B0LWluKTogT1NEIOKGkiBQbG90bHkuXG4gICAqICAtIDNEIG5hcGFyaSAoYE5BUEFSSV9WT0xVTUVgL2BOQVBBUklfSVNPU1VSRkFDRWApOiBuYXBhcmktanMg4oaSIFBsb3RseSAoT1NEIGNhbid0IHJlbmRlciAzRCkuXG4gICAqL1xuICBwcml2YXRlIGltYWdlQmFja2VuZCgpOiBJVmlld2VyQmFja2VuZCB7XG4gICAgY29uc3QgdCA9IHRoaXMuY3VycmVudFBsb3RUeXBlO1xuICAgIC8vIDJEIGltYWdlIHdpdGggYSBuYXBhcmktanMgYXR0ZW1wdCAoZXhwbGljaXQgbmFwYXJpIGltYWdlLCBvciBvcHQtaW4gb24gdGhlIEltYWdlIHR5cGUpLlxuICAgIGlmICh0aGlzLmlzTmFwYXJpSW1hZ2VUeXBlKHQpIHx8ICh0aGlzLmlzSW1hZ2VUeXBlKHQpICYmIHRoaXMuY29uZmlnLnVzZU5hcGFyaVJlbmRlcmVyKSkge1xuICAgICAgaWYgKCF0aGlzLm5hcGFyaUZlbGxCYWNrKSByZXR1cm4gdGhpcy5uYXBhcmk7XG4gICAgICBpZiAoIXRoaXMub3NkRmVsbEJhY2spIHJldHVybiB0aGlzLm9zZDtcbiAgICAgIHJldHVybiB0aGlzLnBsb3RseTtcbiAgICB9XG4gICAgLy8gUGxhaW4gSW1hZ2UgdHlwZSAobm8gbmFwYXJpIG9wdC1pbik6IE9TRCwgdGhlbiBQbG90bHkuXG4gICAgaWYgKHRoaXMuaXNJbWFnZVR5cGUodCkpIHtcbiAgICAgIHJldHVybiB0aGlzLm9zZEZlbGxCYWNrID8gdGhpcy5wbG90bHkgOiB0aGlzLm9zZDtcbiAgICB9XG4gICAgLy8gM0QgbmFwYXJpIHR5cGVzOiBuYXBhcmktanMsIHdpdGggUGxvdGx5IGFzIHRoZSBvbmx5IHZpYWJsZSBmYWxsYmFjay5cbiAgICBpZiAodGhpcy5pc05hcGFyaTNkVHlwZSh0KSkge1xuICAgICAgcmV0dXJuIHRoaXMubmFwYXJpRmVsbEJhY2sgPyB0aGlzLnBsb3RseSA6IHRoaXMubmFwYXJpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wbG90bHk7XG4gIH1cblxuICAvKiogQmFja2VuZCBjdXJyZW50bHkgb24gc2NyZWVuIOKAlCB3aGF0IG9uZ29pbmcgem9vbS90b29sL3JlZ2lvbiBvcHMgYWN0IG9uLiAqL1xuICBwcml2YXRlIHJlbmRlcmVyKCk6IElWaWV3ZXJCYWNrZW5kIHtcbiAgICByZXR1cm4gdGhpcy5sYXN0UmVuZGVyZWQgPz8gdGhpcy5wbG90bHk7XG4gIH1cblxuICAvKipcbiAgICogQmFja2VuZCByZWdpb24sIHRvb2wgYW5kIG92ZXJsYXkgY2FsbHMgYWN0IG9uOiB0aGUgc2xpY2UgcGFuZSdzIE9TRCB3aGlsZSB0aGUgdm9sdW1lIHZpZXcgaXNcbiAgICogc3BsaXQgKHJlZ2lvbnMgYXJlIGVkaXRlZCB0aGVyZSksIGVsc2UgdGhlIGJhY2tlbmQgb24gc2NyZWVuLiBWaWV3IGNhbGxzICh6b29tLCBmaXQsIGNvbG91cixcbiAgICogZXhwb3J0KSBzdGF5IHdpdGgge0BsaW5rIHJlbmRlcmVyfS5cbiAgICovXG4gIHByaXZhdGUgcmVnaW9uQmFja2VuZCgpOiBJVmlld2VyQmFja2VuZCB7XG4gICAgcmV0dXJuIHRoaXMuc2xpY2VNb3VudGVkID8gdGhpcy5vc2QgOiB0aGlzLnJlbmRlcmVyKCk7XG4gIH1cblxuICAvLyBTeXN0ZW0gY2FwYWJpbGl0aWVzIGFyZSBQbG90bHkncyAodGhlIGZ1bGwtZmVhdHVyZWQgYmFja2VuZCkgc28gdGhlIFVJXG4gIC8vIGtlZXBzIG9mZmVyaW5nIGV2ZXJ5IHBsb3QgdHlwZSByZWdhcmRsZXNzIG9mIHdoaWNoIG9uZSBpcyBvbiBzY3JlZW4uXG4gIGdldCBjYXBhYmlsaXRpZXMoKTogVmlld2VyQ2FwYWJpbGl0aWVzIHtcbiAgICByZXR1cm4gdGhpcy5wbG90bHkuY2FwYWJpbGl0aWVzO1xuICB9XG5cbiAgLy8g4pSA4pSAIHJlbmRlciAvIHZpZXdwb3J0IOKGkiBhY3RpdmUgcmVuZGVyZXIg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIGFzeW5jIGxvYWQoaW1hZ2VJbmZvOiBJSW1hZ2VJbmZvLCB6SW5kZXg6IG51bWJlciwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPExvYWRlZEltYWdlPiB7XG4gICAgLy8gQSBzdGFjayBjYW4gb3BlbiBhd2F5IGZyb20gc2xpY2UgMCAoYGluaXRpYWxaSW5kZXhgIOKAlCBhIHZvbHVtZSBvcGVuc1xuICAgIC8vIG1pZC1zcGVjaW1lbiksIGFuZCB0aGF0IGFycml2ZXMgaGVyZSByYXRoZXIgdGhhbiB0aHJvdWdoIHNldFpJbmRleC5cbiAgICB0aGlzLmN1cnJlbnRaSW5kZXggPSB6SW5kZXg7XG4gICAgdGhpcy5zcGF0aWFsVmlld0NoYW5nZWQkLm5leHQoKTtcbiAgICB6SW5kZXggPSB0aGlzLmltYWdlU2xpY2UoekluZGV4LCBpbWFnZUluZm8pO1xuICAgIGNvbnN0IGJhY2tlbmQgPSB0aGlzLmltYWdlQmFja2VuZCgpO1xuICAgIGlmIChiYWNrZW5kID09PSB0aGlzLm5hcGFyaSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMubmFwYXJpLmxvYWQoaW1hZ2VJbmZvLCB6SW5kZXgsIHNpZ25hbCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgLy8gQWJvcnRlZDogbm9ib2R5IHdhbnRzIHRoaXMgaW1hZ2UgYW55IG1vcmUsIHNvIGRvbid0IGdvIG9uIHRvIGxvYWQgaXQgZWxzZXdoZXJlLlxuICAgICAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBlcnI7XG4gICAgICAgIHRoaXMubmFwYXJpRmVsbEJhY2sgPSB0cnVlO1xuICAgICAgICAvLyBNaXJyb3IgaW1hZ2VCYWNrZW5kKCkncyBmYWxsYmFjayBzbyBsb2FkICsgcGxvdCBwaWNrIHRoZSBzYW1lIGJhY2tlbmQ6XG4gICAgICAgIC8vICAtIDNEIG5hcGFyaSB0eXBlcyBoYXZlIG5vIDJEIGZhbGxiYWNrIOKGkiBzdHJhaWdodCB0byBQbG90bHkuXG4gICAgICAgIC8vICAtIDJEIGltYWdlIOKGkiBPU0QsIHRoZW4gUGxvdGx5LlxuICAgICAgICBpZiAodGhpcy5pc05hcGFyaTNkVHlwZSh0aGlzLmN1cnJlbnRQbG90VHlwZSkpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1t2aXN1YWxpemVyXSBuYXBhcmktanMgbG9hZCBmYWlsZWQg4oCUIGZhbGxpbmcgYmFjayB0byBQbG90bHkuJywgZXJyKTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5wbG90bHkubG9hZChpbWFnZUluZm8sIHpJbmRleCwgc2lnbmFsKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLndhcm4oJ1t2aXN1YWxpemVyXSBuYXBhcmktanMgbG9hZCBmYWlsZWQg4oCUIGZhbGxpbmcgYmFjayB0byBPcGVuU2VhZHJhZ29uLicsIGVycik7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRWaWFPc2RUaGVuUGxvdGx5KGltYWdlSW5mbywgekluZGV4LCBzaWduYWwpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYmFja2VuZCA9PT0gdGhpcy5vc2QpIHtcbiAgICAgIHJldHVybiB0aGlzLmxvYWRWaWFPc2RUaGVuUGxvdGx5KGltYWdlSW5mbywgekluZGV4LCBzaWduYWwpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wbG90bHkubG9hZChpbWFnZUluZm8sIHpJbmRleCwgc2lnbmFsKTtcbiAgfVxuXG4gIC8qKiBUcnkgT1NEOyBvbiBmYWlsdXJlIGZhbGwgYmFjayB0byBQbG90bHkgZm9yIHRoaXMgaW1hZ2UgKG5vdCBwZXJtYW5lbnQg4oCUIHNlZSByZXNldCgpKS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkVmlhT3NkVGhlblBsb3RseShcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgekluZGV4OiBudW1iZXIsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8TG9hZGVkSW1hZ2U+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMub3NkLmxvYWQoaW1hZ2VJbmZvLCB6SW5kZXgsIHNpZ25hbCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoc2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBlcnI7XG4gICAgICBjb25zb2xlLndhcm4oJ1t2aXN1YWxpemVyXSBPcGVuU2VhZHJhZ29uIGxvYWQgZmFpbGVkIOKAlCBmYWxsaW5nIGJhY2sgdG8gUGxvdGx5IGZvciB0aGlzIGltYWdlLicsIGVycik7XG4gICAgICB0aGlzLm9zZEZlbGxCYWNrID0gdHJ1ZTtcbiAgICAgIHJldHVybiB0aGlzLnBsb3RseS5sb2FkKGltYWdlSW5mbywgekluZGV4LCBzaWduYWwpO1xuICAgIH1cbiAgfVxuICBwbG90KFxuICAgIHBsb3REaXY6IHN0cmluZyxcbiAgICBpbWFnZUxvYWRlZDogdW5rbm93bixcbiAgICBpbWFnZUluZm86IElJbWFnZUluZm8sXG4gICAgc2NyZWVuSGVpZ2h0OiBudW1iZXIsXG4gICAgcGxvdFR5cGU6IFBsb3RUeXBlLFxuICAgIGluUGxhY2U/OiBib29sZWFuLFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0aGlzLmN1cnJlbnRQbG90VHlwZSA9IHBsb3RUeXBlO1xuICAgIHRoaXMuc3BhdGlhbFZpZXdDaGFuZ2VkJC5uZXh0KCk7XG4gICAgdGhpcy5wbG90dGVkRmlsZU5hbWUgPSBpbWFnZUluZm8/LmZpbGVOYW1lO1xuICAgIHRoaXMucGxvdHRlZEluZm8gPSBpbWFnZUluZm8gPz8gbnVsbDtcbiAgICB0aGlzLnBsb3R0ZWRIZWlnaHQgPSBzY3JlZW5IZWlnaHQ7XG4gICAgdGhpcy51cGRhdGVWb2x1bWVWaWV3KHBsb3RUeXBlKTtcbiAgICAvLyBUaGUgc2xpY2UgcGFuZSBiZWxvbmdzIHRvIHRoZSB2b2x1bWUgdmlldzogYW5vdGhlciBwbG90IHR5cGUgdGFrZXMgaXQgZG93biAoT1NEIG1heSBiZVxuICAgIC8vIGFib3V0IHRvIGRyYXcgdGhlIG1haW4gdmlldywgd2hpY2ggbXVzdCBub3QgZmluZCB0aGUgcGFuZSdzIHZpZXdlciBzdGlsbCBtb3VudGVkKS5cbiAgICBpZiAoIXRoaXMuaW1hZ2VWb2x1bWVWaWV3KSB0aGlzLnVubW91bnRTbGljZSgpO1xuICAgIC8vIFJlZ2lvbiBzdXJmYWNlcyBiZWxvbmcgdG8gdGhlIGltYWdlIHRoZXkgd2VyZSBidWlsdCBmcm9tOiBhbm90aGVyIGltYWdlIGRyb3BzIHRoZW0uXG4gICAgaWYgKHRoaXMuY2xhc3NlczNkJC52YWx1ZS5sZW5ndGggJiYgdGhpcy5wbG90dGVkRmlsZU5hbWUgIT09IHRoaXMuY2xhc3NlczNkSW1hZ2UpIHRoaXMuY2xlYXJSZWdpb25DbGFzc2VzM2QoKTtcbiAgICAvLyBTbyBkb2VzIGEgZGF0YXNldCdzIHJlZ2lvbiBzZXQ6IHdoZXJlIGl0cyBwbGFuZXMgYXJlIGlzIG5vIG90aGVyIGltYWdlJ3MuIEl0cyBhdHRhY2htZW50IGlzXG4gICAgLy8ga2VwdCAoYXR0YWNoZWRSZWdpb25TZXRzKSwgdG8gYmUgcmVzdG9yZWQgd2hlbiBpdHMgaW1hZ2UgaXMgYmFjay5cbiAgICBpZiAodGhpcy5kYXRhc2V0UmVnaW9uU2V0ICYmIHRoaXMuZGF0YXNldFJlZ2lvblNldC5pbWFnZSAhPT0gdGhpcy5pbXBvcnRJbWFnZUtleSgpKSB7XG4gICAgICB0aGlzLmRhdGFzZXRSZWdpb25TZXQgPSBudWxsO1xuICAgICAgdGhpcy5uYXBhcmkuc2V0UmVnaW9uUGxhbmVzKG51bGwpO1xuICAgICAgdGhpcy5kYXRhc2V0UGxhbmVzJC5uZXh0KG51bGwpO1xuICAgICAgdGhpcy5zcGF0aWFsVmlld0NoYW5nZWQkLm5leHQoKTtcbiAgICAgIHRoaXMudXBkYXRlVm9sdW1lVmlldyhwbG90VHlwZSk7XG4gICAgICB0aGlzLnVwZGF0ZUNlbGxzM2QoKTtcbiAgICB9XG4gICAgdGhpcy51cGRhdGVQbGFuZUNlbGxzKCk7XG4gICAgdGhpcy5zeW5jQW5ub3RhdGlvbnMoKTtcbiAgICB0aGlzLnVwZGF0ZUNlbGxzM2QoKTtcbiAgICB0aGlzLnBsb3REaXYgPSBwbG90RGl2O1xuICAgIC8vIEFwcGx5IHRoZSBwZXItaW1hZ2UgcmVnaW9uIGNhY2hlIChzbmFwc2hvdCBvbGQgcmVnaW9ucywgcmVzdG9yZSB0aGUgbmV3XG4gICAgLy8gaW1hZ2UncywgY2xlYXIgc2VsZWN0aW9uKSBmb3Igd2hpY2hldmVyIGJhY2tlbmQgcmVuZGVycyDigJQgUGxvdGx5IGRvZXNcbiAgICAvLyB0aGlzIGluc2lkZSBpdHMgb3duIHBsb3QoKSwgYnV0IE9TRCBkb2Vzbid0LCBzbyBkcml2ZSBpdCBoZXJlLiBJZGVtcG90ZW50XG4gICAgLy8gZm9yIHRoZSBzYW1lIGltYWdlLCBzbyBpdCdzIHNhZmUgdG8gY2FsbCBvbiBldmVyeSAocmUpcGxvdC5cbiAgICB0aGlzLnBsb3RseS5zZXRBY3RpdmVJbWFnZShpbWFnZUluZm8pO1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLmltYWdlQmFja2VuZCgpO1xuICAgIC8vIEJvdGggYmFja2VuZHMgc2hhcmUgdGhlIHNhbWUgZGl2IOKAlCB0ZWFyIGRvd24gdGhlIG91dGdvaW5nIG9uZSBvbiBzd2l0Y2guXG4gICAgLy8gUGxvdGx5IG11c3QgYmUgKnB1cmdlZCogKG5vdCByZXNldCwgd2hpY2ggcmUtZHJhd3MgZW1wdHkgYXhlcykgYmVmb3JlIE9TRFxuICAgIC8vIHRha2VzIHRoZSBkaXYuXG4gICAgaWYgKHRoaXMubGFzdFJlbmRlcmVkICYmIHRoaXMubGFzdFJlbmRlcmVkICE9PSBuZXh0KSB7XG4gICAgICBpZiAodGhpcy5sYXN0UmVuZGVyZWQgPT09IHRoaXMucGxvdGx5KSB0aGlzLnBsb3RseS5wdXJnZVBsb3QoKTtcbiAgICAgIGVsc2UgdGhpcy5sYXN0UmVuZGVyZWQucmVzZXQoKTtcbiAgICB9XG4gICAgdGhpcy5sYXN0UmVuZGVyZWQgPSBuZXh0O1xuICAgIGNvbnN0IGRyYXduID0gbmV4dC5wbG90KHBsb3REaXYsIGltYWdlTG9hZGVkLCBpbWFnZUluZm8sIHNjcmVlbkhlaWdodCwgcGxvdFR5cGUsIGluUGxhY2UpO1xuICAgIC8vIEEgZGF0YXNldCdzIHJlZ2lvbiBzZXQgaXMgc2hvd24gaW4gM0Qgb25jZSB0aGUgY2xvdWQncyBzY2VuZSBpcyB1cDogaXRzIHZveGVsIHN0ZXAgaXMgdGhlIHNjZW5lJ3MuXG4gICAgY29uc3QgcGxvdHRlZCA9IHRoaXMuZGF0YXNldFJlZ2lvblNldD8ucGxhbmVzXG4gICAgICA/IGRyYXduLnRoZW4oKG9rKSA9PiB7XG4gICAgICAgICAgaWYgKG9rKSB0aGlzLnNob3dEYXRhc2V0UmVnaW9uU2V0M2QoKTtcbiAgICAgICAgICByZXR1cm4gb2s7XG4gICAgICAgIH0pXG4gICAgICA6IGRyYXduO1xuICAgIGlmICghdGhpcy5zbGljZURpdiB8fCAhdGhpcy5pbWFnZVZvbHVtZVZpZXcpIHJldHVybiBwbG90dGVkO1xuICAgIC8vIFRoZSBzcGxpdCB2b2x1bWUgdmlldzogdGhlIHNsaWNlIHBhbmUgZm9sbG93cyB0aGUgaW1hZ2UgKGEgbmV3IG9uZSwgb3IgaXRzIHNoYXJwZXIgcGFzcykuXG4gICAgcmV0dXJuIHBsb3R0ZWQudGhlbigob2spID0+IHtcbiAgICAgIGlmIChvayAmJiAoIXRoaXMuc2xpY2VNb3VudGVkIHx8IHRoaXMuc2xpY2VGaWxlICE9PSBpbWFnZUluZm8/LmZpbGVOYW1lIHx8IGluUGxhY2UpKSB7XG4gICAgICAgIHZvaWQgdGhpcy5tb3VudFNsaWNlKCEhaW5QbGFjZSAmJiB0aGlzLnNsaWNlTW91bnRlZCAmJiB0aGlzLnNsaWNlRmlsZSA9PT0gaW1hZ2VJbmZvPy5maWxlTmFtZSk7XG4gICAgICB9XG4gICAgICAvLyBUaGUgdm9sdW1lIHdhcyBhc3NlbWJsZWQgYWdhaW4gKGFub3RoZXIgaW1hZ2UsIG9yIHJlc29sdXRpb24pOiBjdXQgdGhlIHNlY3Rpb25zIGZyb20gaXQuXG4gICAgICBpZiAob2spIHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKTtcbiAgICAgIHJldHVybiBvaztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGxpdCB0aGUgdm9sdW1lIHZpZXc6IHNob3cgdGhlIHNsaWNlIGJlaW5nIGVkaXRlZCBpbiBgZGl2YCAoT3BlblNlYWRyYWdvbiwgd2l0aCBldmVyeSByZWdpb25cbiAgICogdG9vbCkgYmVzaWRlIHRoZSAzRCB2aWV3LCBvciBzdG9wIChudWxsKS4gS2VwdCBhY3Jvc3MgcmUtcGxvdHMgb2YgYSB2b2x1bWUgdmlldzsgYW5vdGhlciBwbG90XG4gICAqIHR5cGUgdGFrZXMgdGhlIHBhbmUgZG93biBhbmQgYSB2b2x1bWUgdmlldyBicmluZ3MgaXQgYmFjay4gUmVzb2x2ZXMgd2hldGhlciB0aGUgcGFuZSBzaG93cy5cbiAgICovXG4gIGFzeW5jIHNldFNsaWNlRWRpdG9yKGRpdjogc3RyaW5nIHwgbnVsbCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRoaXMuc2xpY2VEaXYgPSBkaXY7XG4gICAgaWYgKHRoaXMuc2xpY2VFZGl0b3IkLnZhbHVlICE9PSAhIWRpdikgdGhpcy5zbGljZUVkaXRvciQubmV4dCghIWRpdik7XG4gICAgaWYgKCFkaXYpIHtcbiAgICAgIHRoaXMudW5tb3VudFNsaWNlKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1vdW50U2xpY2UoZmFsc2UpO1xuICB9XG5cbiAgLyoqIE1vdW50IChvciByZWZyZXNoIGluIHBsYWNlKSBPU0QgaW4gdGhlIHNsaWNlIHBhbmUgb24gdGhlIGRpc3BsYXllZCBzbGljZS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBtb3VudFNsaWNlKGluUGxhY2U6IGJvb2xlYW4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBkaXYgPSB0aGlzLnNsaWNlRGl2O1xuICAgIGNvbnN0IGluZm8gPSB0aGlzLnBsb3R0ZWRJbmZvO1xuICAgIGlmICghZGl2IHx8ICFpbmZvPy51cmxzPy5sZW5ndGggfHwgIXRoaXMuaW1hZ2VWb2x1bWVWaWV3KSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgcmVxdWVzdCA9ICsrdGhpcy5zbGljZVJlcXVlc3Q7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGxvYWRlZCA9IGF3YWl0IHRoaXMub3NkLmxvYWQoaW5mbywgdGhpcy5jdXJyZW50WkluZGV4KTtcbiAgICAgIGlmIChyZXF1ZXN0ICE9PSB0aGlzLnNsaWNlUmVxdWVzdCkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3Qgb2sgPSBhd2FpdCB0aGlzLm9zZC5wbG90KGRpdiwgbG9hZGVkLCBpbmZvLCB0aGlzLnBsb3R0ZWRIZWlnaHQsIFBsb3RUeXBlLklNQUdFLCBpblBsYWNlKTtcbiAgICAgIGlmIChyZXF1ZXN0ICE9PSB0aGlzLnNsaWNlUmVxdWVzdCkgcmV0dXJuIGZhbHNlO1xuICAgICAgdGhpcy5zbGljZU1vdW50ZWQgPSBvaztcbiAgICAgIHRoaXMuc2xpY2VGaWxlID0gaW5mby5maWxlTmFtZTtcbiAgICAgIGlmIChvaykge1xuICAgICAgICAvLyBUaGUgc2xpY2UgbWF5IGhhdmUgbW92ZWQgd2hpbGUgdGhlIHBhbmUgbG9hZGVkLlxuICAgICAgICB0aGlzLm9zZC5zZXRaSW5kZXgodGhpcy5jdXJyZW50WkluZGV4KTtcbiAgICAgICAgdGhpcy50cmFja0xpdmVDbGFzc2VzKCk7XG4gICAgICAgIHRoaXMuc2VjdGlvbnMuc3RhcnQoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvaztcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChyZXF1ZXN0ID09PSB0aGlzLnNsaWNlUmVxdWVzdClcbiAgICAgICAgY29uc29sZS53YXJuKCdbdmlzdWFsaXplcl0gVGhlIHNsaWNlIHBhbmUgY291bGQgbm90IHNob3cgdGhlIGltYWdlLicsIGVycik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRha2UgdGhlIHNsaWNlIHBhbmUncyB2aWV3ZXIgZG93biAodGhlIHNwbGl0IHN0YXlzIHdhbnRlZCB3aGlsZSB7QGxpbmsgc2xpY2VEaXZ9IGlzIHNldCkuICovXG4gIHByaXZhdGUgdW5tb3VudFNsaWNlKCk6IHZvaWQge1xuICAgIHRoaXMuc2xpY2VSZXF1ZXN0Kys7XG4gICAgaWYgKHRoaXMuc2xpY2VNb3VudGVkKSB7XG4gICAgICB0aGlzLm9zZC5yZXNldCgpO1xuICAgICAgdGhpcy5zZWN0aW9ucy5zdG9wKCk7XG4gICAgfVxuICAgIHRoaXMuc2xpY2VNb3VudGVkID0gZmFsc2U7XG4gICAgdGhpcy5zbGljZUZpbGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgcmVsb2FkQW5kUGxvdCgpOiB2b2lkIHtcbiAgICB0aGlzLnBsb3RseS5yZWxvYWRBbmRQbG90KCk7XG4gIH1cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgLy8gU3RhcnQgb2YgYSByZW5kZXIgY3ljbGU6IHJlLWVuYWJsZSBuYXBhcmktanMvT1NEIGF0dGVtcHRzIChjbGVhciBhbnkgcHJpb3JcbiAgICAvLyBwZXItaW1hZ2UgZmFsbGJhY2spIGFuZCB0ZWFyIGRvd24gd2hhdGV2ZXIncyBvbiBzY3JlZW4uXG4gICAgdGhpcy5vc2RGZWxsQmFjayA9IGZhbHNlO1xuICAgIHRoaXMubmFwYXJpRmVsbEJhY2sgPSBmYWxzZTtcbiAgICB0aGlzLnJlbmRlcmVyKCkucmVzZXQoKTtcbiAgfVxuICByZWxheW91dCh0cnVlSW1hZ2VTaXplPzogbnVtYmVyW10pOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkucmVsYXlvdXQodHJ1ZUltYWdlU2l6ZSk7XG4gIH1cbiAgcmVzZXRBeGVzKCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS5yZXNldEF4ZXMoKTtcbiAgfVxuICBmaXRUb1ZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLmZpdFRvVmlldygpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGZpdFRvVmlld30uICovXG4gIGF1dG9zY2FsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmZpdFRvVmlldygpO1xuICB9XG4gIHpvb21JbigpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuem9vbUluKCk7XG4gIH1cbiAgem9vbU91dCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcmVyKCkuem9vbU91dCgpO1xuICB9XG4gIHNldERyYWdNb2RlKG1vZGU6IHN0cmluZyB8IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLnNldERyYWdNb2RlKG1vZGUpO1xuICAgIGlmICh0aGlzLnNsaWNlTW91bnRlZCkgdGhpcy5vc2Quc2V0RHJhZ01vZGUobW9kZSk7XG4gIH1cbiAgLyoqIEV2ZXJ5IGJhY2tlbmQsIG9uIHNjcmVlbiBvciBub3QuICovXG4gIHByaXZhdGUgYmFja2VuZHMoKTogSVZpZXdlckJhY2tlbmRbXSB7XG4gICAgcmV0dXJuIFt0aGlzLnBsb3RseSwgdGhpcy5vc2QsIHRoaXMubmFwYXJpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbmF2aWdhdG9yIC8gc21vb3RoaW5nIG9wdGlvbnMsIGFwcGxpZWQgdG8gRVZFUlkgYmFja2VuZCB0aGF0IGhhcyB0aGVtIChub3RcbiAgICoganVzdCB0aGUgYWN0aXZlIHJlbmRlcmVyKTogY29uc3VtZXJzIHNldCB0aGVtIGJlZm9yZSB0aGUgZmlyc3QgcmVuZGVyLCB3aGVuXG4gICAqIGByZW5kZXJlcigpYCBpcyBzdGlsbCB0aGUgUGxvdGx5IGRlZmF1bHQsIGFuZCBPU0QvbmFwYXJpLWpzIG11c3QgcmVjZWl2ZSB0aGVtXG4gICAqIHRvIGhvbm91ciB0aGVtIGF0IHZpZXdlciBjcmVhdGlvbi5cbiAgICovXG4gIGdldE9zZFZpZXdPcHRpb25zKCk6IElPc2RWaWV3T3B0aW9ucyB7XG4gICAgcmV0dXJuIHRoaXMudmlld09wdGlvbnM7XG4gIH1cbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3T3B0aW9uczogSU9zZFZpZXdPcHRpb25zID0ge1xuICAgIHNldE5hdmlnYXRvclZpc2libGU6ICh2aXNpYmxlKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGIgb2YgdGhpcy5iYWNrZW5kcygpKSBiLmdldE9zZFZpZXdPcHRpb25zKCk/LnNldE5hdmlnYXRvclZpc2libGUodmlzaWJsZSk7XG4gICAgfSxcbiAgICBzZXRJbWFnZVNtb290aGluZ0VuYWJsZWQ6IChlbmFibGVkKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGIgb2YgdGhpcy5iYWNrZW5kcygpKSBiLmdldE9zZFZpZXdPcHRpb25zKCk/LnNldEltYWdlU21vb3RoaW5nRW5hYmxlZChlbmFibGVkKTtcbiAgICB9LFxuICB9O1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRPc2RWaWV3T3B0aW9ucygpLnNldE5hdmlnYXRvclZpc2libGUoKWAuICovXG4gIHNldE5hdmlnYXRvclZpc2libGUodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMudmlld09wdGlvbnMuc2V0TmF2aWdhdG9yVmlzaWJsZSh2aXNpYmxlKTtcbiAgfVxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRPc2RWaWV3T3B0aW9ucygpLnNldEltYWdlU21vb3RoaW5nRW5hYmxlZCgpYC4gKi9cbiAgc2V0SW1hZ2VTbW9vdGhpbmdFbmFibGVkKGVuYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdPcHRpb25zLnNldEltYWdlU21vb3RoaW5nRW5hYmxlZChlbmFibGVkKTtcbiAgfVxuICBzZXRTaG93U3RhY2soc2hvd3N0YWNrOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLnNldFNob3dTdGFjayhzaG93c3RhY2spO1xuICB9XG4gIHNldFpJbmRleCh6SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFpJbmRleCA9IHpJbmRleDtcbiAgICB0aGlzLnNwYXRpYWxWaWV3Q2hhbmdlZCQubmV4dCgpO1xuICAgIGNvbnN0IHNsaWNlID0gdGhpcy5pbWFnZVNsaWNlKHpJbmRleCk7XG4gICAgdGhpcy5yZW5kZXJlcigpLnNldFpJbmRleChzbGljZSk7XG4gICAgaWYgKHRoaXMuZGF0YXNldFJlZ2lvblNldD8ucGxhbmVzKSB0aGlzLm5hcGFyaS5zZXRSZWdpb25QbGFuZSh6SW5kZXgpO1xuICAgIGlmICh0aGlzLnNsaWNlTW91bnRlZCkge1xuICAgICAgdGhpcy5vc2Quc2V0WkluZGV4KHNsaWNlKTtcbiAgICAgIHRoaXMuc2VjdGlvbnMuc2NoZWR1bGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGltYWdlJ3Mgb3duIHNsaWNlIGZvciBzbGlkZXIgcG9zaXRpb24gYHpgOiAwIHdoaWxlIHRoZSBkYXRhc2V0IHJlZ2lvbiBzZXQncyBwbGFuZXMgc2xpY2UgYW5cbiAgICogaW1hZ2Ugb2Ygb25lIHBsYW5lICh0aGUgc2xpZGVyIHRoZW4gcGlja3MgdGhlIHBsYW5lLCBzZWUgZ2V0RGF0YXNldFBsYW5lcyQpLCBlbHNlIGB6YC5cbiAgICovXG4gIHByaXZhdGUgaW1hZ2VTbGljZSh6OiBudW1iZXIsIGluZm86IElJbWFnZUluZm8gfCBudWxsIHwgdW5kZWZpbmVkID0gdGhpcy5wbG90dGVkSW5mbyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YXNldFJlZ2lvblNldD8ucGxhbmVzICYmICFpbmZvPy5pc1N0YWNrID8gMCA6IHo7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBsYW5lcyBvZiB0aGUgc3BhdGlhbCBkYXRhc2V0J3MgcmVnaW9uIHNldCAoaXRzIGBzbGljZVpgLCBpbiBvYnNlcnZhdGlvbiB1bml0cykgd2hpbGUgdGhleVxuICAgKiBzbGljZSB0aGUgcGxvdHRlZCBpbWFnZSwgYW4gaW1hZ2Ugb2Ygb25lIHBsYW5lOyBudWxsIG90aGVyd2lzZS4gVGhlIGhvc3QncyBzbGljZSBzbGlkZXIgdGhlblxuICAgKiBydW5zIG92ZXIgdGhlbTogZWFjaCBwb3NpdGlvbiBzaG93cyB0aGF0IHBsYW5lJ3MgcmVnaW9ucyBhbmQsIGluIHRoZSAyRCBzcGF0aWFsIHZpZXcsIHRoZVxuICAgKiBvYnNlcnZhdGlvbnMgYW5kIHRyYW5zY3JpcHRzIG5lYXJlc3QgaXQsIG92ZXIgdGhlIHNhbWUgaW1hZ2UuXG4gICAqL1xuICBnZXREYXRhc2V0UGxhbmVzJCgpOiBPYnNlcnZhYmxlPHJlYWRvbmx5IG51bWJlcltdIHwgbnVsbD4ge1xuICAgIHJldHVybiB0aGlzLmRhdGFzZXRQbGFuZXMkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG4gIGdldFRydWVJbWFnZVNpemUoKTogeyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9IHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRUcnVlSW1hZ2VTaXplKCk7XG4gIH1cbiAgZ2V0Q3VycmVudEltYWdlKCk6IFByb21pc2U8SW1hZ2UgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRDdXJyZW50SW1hZ2UoKTtcbiAgfVxuICBnZXREaXNwbGF5ZWRQaXhlbERhdGEoKTogUGl4ZWxEYXRhIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXREaXNwbGF5ZWRQaXhlbERhdGEoKTtcbiAgfVxuICBnZXREaXNwbGF5ZWRTb3VyY2VSZWN0KCk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldERpc3BsYXllZFNvdXJjZVJlY3QoKTtcbiAgfVxuICBkb3dubG9hZEltYWdlKCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS5kb3dubG9hZEltYWdlKCk7XG4gIH1cbiAgZXhwb3J0Q29tcG9zaXRlKCk6IHZvaWQge1xuICAgIHRoaXMucmVuZGVyZXIoKS5leHBvcnRDb21wb3NpdGUoKTtcbiAgfVxuXG4gIHNldFBsb3RUeXBlKHBsb3RUeXBlOiBQbG90VHlwZSk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudFBsb3RUeXBlID0gcGxvdFR5cGU7XG4gICAgdGhpcy5zcGF0aWFsVmlld0NoYW5nZWQkLm5leHQoKTtcbiAgICB0aGlzLnVwZGF0ZVZvbHVtZVZpZXcocGxvdFR5cGUpO1xuICAgIHRoaXMudXBkYXRlUGxhbmVDZWxscygpO1xuICAgIHRoaXMuc3luY0Fubm90YXRpb25zKCk7XG4gICAgdGhpcy51cGRhdGVDZWxsczNkKCk7XG4gICAgdGhpcy5wbG90bHkuc2V0UGxvdFR5cGUocGxvdFR5cGUpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldFN1cmZhY2UzZENvbnRyb2xzKClgLiAqL1xuICBzZXRTdXJmYWNlRHJhZ01vZGUobW9kZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5nZXRTdXJmYWNlM2RDb250cm9scygpPy5zZXRTdXJmYWNlRHJhZ01vZGUobW9kZSk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKWAuICovXG4gIHJlc2V0U3VyZmFjZUNhbWVyYSgpOiB2b2lkIHtcbiAgICB0aGlzLmdldFN1cmZhY2UzZENvbnRyb2xzKCk/LnJlc2V0U3VyZmFjZUNhbWVyYSgpO1xuICB9XG4gIC8qKiBUaGUgM0QgZGVjaW1hdGUgZmFjdG9yIG9mIHRoZSBiYWNrZW5kIG9uIHNjcmVlbiAobmFwYXJpLWpzKSwgZWxzZSBudWxsLiAqL1xuICBnZXRWb2x1bWVSZXNvbHV0aW9uKCk6IElWb2x1bWVSZXNvbHV0aW9uIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRWb2x1bWVSZXNvbHV0aW9uKCk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpPy5zZXQoKWAuICovXG4gIHNldFJlc29sdXRpb25TY2FsZShzY2FsZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5nZXRWb2x1bWVSZXNvbHV0aW9uKCk/LnNldChzY2FsZSk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSBgZ2V0Vm9sdW1lUmVzb2x1dGlvbigpPy5nZXQoKWAuICovXG4gIGdldFJlc29sdXRpb25TY2FsZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFZvbHVtZVJlc29sdXRpb24oKT8uZ2V0KCkgPz8gMTtcbiAgfVxuICAvKiogVGhlIHZpZXdwb3J0IG9mIHRoZSBiYWNrZW5kIG9uIHNjcmVlbiwgZm9yIGEgY29udHJpYnV0ZWQgcGxvdCBtb2RlLiBOdWxsXG4gICAqICB3aGVuIHRoYXQgYmFja2VuZCBjYW5ub3QgcHJvdmlkZSBvbmUgKGUuZy4gT1NEIGZlbGwgYmFjayB0byBQbG90bHkpLiAqL1xuICBnZXRQbG90TW9kZVZpZXdwb3J0KCk6IFBsb3RNb2RlVmlld3BvcnQgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldFBsb3RNb2RlVmlld3BvcnQ/LigpID8/IG51bGw7XG4gIH1cbiAgZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpOiBQbG90VHlwZURlc2NyaXB0b3JbXSB7XG4gICAgLy8gUGxvdGx5IGVudW1lcmF0ZXMgdGhlIGZ1bGwgUExPVF9UWVBFX0RFU0NSSVBUT1JTIG1hcCwgd2hpY2ggYWxyZWFkeSBpbmNsdWRlcyB0aGVcbiAgICAvLyBuYXBhcmktanMgV2ViR1BVIHR5cGVzIChqaXQtdWkjMTAyKSDigJQgc28gdGhpcyBzaW5nbGUgc291cmNlIGNvdmVycyB0aGVtIChubyBkdXBsaWNhdGVzKS5cbiAgICByZXR1cm4gdGhpcy5wbG90bHkuZ2V0UGxvdFR5cGVEZXNjcmlwdG9ycygpO1xuICB9XG5cbiAgLy8g4pSA4pSAIGxvbmctbGl2ZWQgb2JzZXJ2YWJsZXMgKyBzdGFjayBmbGFncyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgc2V0U3RhY2tMb2FkaW5nKGI6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnBsb3RseS5zZXRTdGFja0xvYWRpbmcoYik7XG4gIH1cbiAgLy8gQ2FuY2VsIGluLWZsaWdodCBsb2FkaW5nIG9uIGV2ZXJ5IGJhY2tlbmQg4oCUIHRoZSB1c2VyJ3MgQ2FuY2VsIHNob3VsZG4ndCBkZXBlbmQgb24gd2hpY2ggb25lIGlzXG4gIC8vIGFjdGl2ZS4gT25seSBiYWNrZW5kcyB0aGF0IHN0cmVhbSBmcmFtZXMgKG5hcGFyaS1qcykgZG8gcmVhbCB3b3JrOyB0aGUgcmVzdCBuby1vcC4gVGhlIGNvbmNyZXRlXG4gIC8vIGJhY2tlbmQgY2xhc3NlcyBkb24ndCBhbGwgZGVjbGFyZSB0aGUgb3B0aW9uYWwgY29udHJhY3QgbWV0aG9kLCBzbyBjYWxsIGl0IHZpYSBJVmlld2VyQmFja2VuZC5cbiAgY2FuY2VsTG9hZGluZygpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGJhY2tlbmQgb2YgW3RoaXMucGxvdGx5LCB0aGlzLm9zZCwgdGhpcy5uYXBhcmldIGFzIElWaWV3ZXJCYWNrZW5kW10pIHtcbiAgICAgIGJhY2tlbmQuY2FuY2VsTG9hZGluZz8uKCk7XG4gICAgfVxuICB9XG4gIC8vIExvYWRpbmcgc3RhdGUgaXMgc3VyZmFjZWQgZnJvbSB3aGljaGV2ZXIgYmFja2VuZCBpcyBkb2luZyB0aGUgd29yazogT1NEIGFuZCBuYXBhcmktanMgKHZvbHVtZVxuICAvLyBhc3NlbWJseSkgZHJpdmUgdGhlaXIgb3duIHN1YmplY3RzLCBzbyBtZXJnZSBhbGwgdGhyZWUgaW50byBvbmUgc3RhYmxlIHN0cmVhbSB0aGUgaG9zdFxuICAvLyBzdWJzY3JpYmVzIHRvIG9uY2UuIChQcmV2aW91c2x5IGhhcmRjb2RlZCB0byBQbG90bHksIHNvIG5hcGFyaS9PU0QgcHJvZ3Jlc3MgbmV2ZXIgc2hvd2VkLilcbiAgaXNTdGFja0xvYWRpbmcoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5wbG90bHkuaXNTdGFja0xvYWRpbmcoKSxcbiAgICAgIHRoaXMub3NkLmlzU3RhY2tMb2FkaW5nKCksXG4gICAgICB0aGlzLm5hcGFyaS5pc1N0YWNrTG9hZGluZygpLFxuICAgIF0pLnBpcGUobWFwKChmbGFncykgPT4gZmxhZ3Muc29tZShCb29sZWFuKSkpO1xuICB9XG4gIGdldFN0YWNrTG9hZGluZ1Byb2dyZXNzKCk6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgLy8gUmVwb3J0IHRoZSBwcm9ncmVzcyBvZiB3aGljaGV2ZXIgYmFja2VuZCBpcyBBQ1RJVkVMWSBsb2FkaW5nIChtYXggYWNyb3NzIGFjdGl2ZSBvbmVzKS4gQSBwbGFpblxuICAgIC8vIG1lcmdlIGxldCBhbiBpZGxlIGJhY2tlbmQncyBzdGFsZSB2YWx1ZSB3aW4gdGhlIHN0cmVhbSBvbiBhIHJlLWxvYWQg4oCUIGxlYXZpbmcgdGhlIGJhciBiZWxvdyB0aGVcbiAgICAvLyBhY3RpdmUgYmFja2VuZCdzIHJlYWwgcHJvZ3Jlc3MgKGUuZy4gc3R1Y2sgfuKFkyB3aGlsZSB0aGUgJSByZWFkIDEwMCkuIEdhdGluZyBieSB0aGUgbG9hZGluZyBmbGFnXG4gICAgLy8gaWdub3JlcyBpZGxlIGJhY2tlbmRzLCBzbyB0aGUgYmFyIHRyYWNrcyB0aGUgb25lIGRvaW5nIHRoZSB3b3JrIGFuZCByZWFjaGVzIDEwMCUuXG4gICAgY29uc3QgdHJhY2sgPSAodjogSVZpZXdlckJhY2tlbmQpOiBPYnNlcnZhYmxlPFtudW1iZXIsIGJvb2xlYW5dPiA9PlxuICAgICAgY29tYmluZUxhdGVzdChbdi5nZXRTdGFja0xvYWRpbmdQcm9ncmVzcygpLCB2LmlzU3RhY2tMb2FkaW5nKCldKTtcbiAgICByZXR1cm4gY29tYmluZUxhdGVzdChbdHJhY2sodGhpcy5wbG90bHkpLCB0cmFjayh0aGlzLm9zZCksIHRyYWNrKHRoaXMubmFwYXJpKV0pLnBpcGUoXG4gICAgICBtYXAoKHBhaXJzKSA9PiB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZSA9IHBhaXJzLmZpbHRlcigoWywgbG9hZGluZ10pID0+IGxvYWRpbmcpLm1hcCgoW3BdKSA9PiBwKTtcbiAgICAgICAgcmV0dXJuIGFjdGl2ZS5sZW5ndGggPyBNYXRoLm1heCguLi5hY3RpdmUpIDogMDtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cbiAgLy8gRXZlcnkgYmFja2VuZCBmaXRzIHRvIHZpZXcgb24gaXRzIG93biAoUGxvdGx5J3MgYXV0b3NjYWxlLCBPU0QncyBnb0hvbWUsIG5hcGFyaSdzIGNhbWVyYVxuICAvLyBmaXQpIGFuZCBlYWNoIGVtaXRzIGZyb20gaXRzIG93biBzdWJqZWN0LCBzbyBtZXJnZSBhbGwgdGhyZWU6IGxpc3RlbmluZyB0byBQbG90bHkgYWxvbmVcbiAgLy8gbWlzc2VkIHRoZSBjb250ZXh0LW1lbnUgQXV0b3NjYWxlIG9uIHRoZSBJbWFnZSBhbmQgbmFwYXJpIHZpZXdzLlxuICBnZXRBdXRvc2NhbGVFdmVudCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gbWVyZ2UoXG4gICAgICB0aGlzLnBsb3RseS5nZXRBdXRvc2NhbGVFdmVudCgpLFxuICAgICAgdGhpcy5vc2QuZ2V0QXV0b3NjYWxlRXZlbnQoKSxcbiAgICAgIHRoaXMubmFwYXJpLmdldEF1dG9zY2FsZUV2ZW50KCksXG4gICAgKS5waXBlKG1hcCgoKSA9PiB1bmRlZmluZWQpKTtcbiAgfVxuICAvKiogVGhlIGxpbmUtUk9JIHByb2ZpbGVzOiBzYW1wbGVkIGJ5IHRoZSBiYWNrZW5kLW5ldXRyYWwgSW50ZW5zaXR5UHJvZmlsZVNlcnZpY2UuICovXG4gIGdldEludGVuc2l0eVByb2ZpbGUkKCk6IE9ic2VydmFibGU8SW50ZW5zaXR5UHJvZmlsZVtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5LmdldEludGVuc2l0eVByb2ZpbGUkKCk7XG4gIH1cbiAgLy8gVGhlIGludGVuc2l0eSBpbnNldCBpcyBhIFBsb3RseSBMSU5FIGNoYXJ0IOKAlCByZW5kZXIgaXQgdGhyb3VnaCBQbG90bHkgd2hpY2hldmVyXG4gIC8vIGJhY2tlbmQgZHJhd3MgdGhlIG1haW4gaW1hZ2UuXG4gIHJlbmRlckludGVuc2l0eUluc2V0KGRpdklkOiBzdHJpbmcsIHByb2ZpbGVzOiBJbnRlbnNpdHlQcm9maWxlW10pOiB2b2lkIHtcbiAgICB0aGlzLnBsb3RseS5yZW5kZXJJbnRlbnNpdHlJbnNldChkaXZJZCwgcHJvZmlsZXMpO1xuICB9XG5cbiAgLy8g4pSA4pSAIHJlZ2lvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFJlZ2lvbiBzdGF0ZSBsaXZlcyBpbiB0aGUgc2hhcmVkIFJlZ2lvblN0b3JlLCBzbyBldmVyeSByZWFkIGFuZCB3cml0ZSBnb2VzXG4gIC8vIHN0cmFpZ2h0IHRvIGl0LiBFdmVyeSBiYWNrZW5kIGRyYXdzIGZyb20gdGhlIHN0b3JlJ3MgZXZlbnRzOiB0aGUgT1NEIGFuZFxuICAvLyBuYXBhcmktanMgb3ZlcmxheXMgYW5kIFBsb3RseSdzIHNoYXBlIHByb2plY3Rpb24gcmVkcmF3IG9uIGl0cyByZWdpb24tdXBkYXRlXG4gIC8vIGFuZCBzZWxlY3Rpb24gc3RyZWFtcywgYW5kIHRoZSBjYW52YXMgdG9vbHMgcmVzZXQgb24gZ2V0UmVnaW9uU2V0UmVwbGFjZWQkXG4gIC8vICh1bmRvLCByZWRvLCBhIHNsaWNlIHN3aXRjaCkuXG4gIHNldFJlZ2lvbnMoXG4gICAgcmVnaW9uczogUmVnaW9uW10sXG4gICAgc2hvd1JlZ2lvbkxhYmVsPzogYm9vbGVhbixcbiAgICBpc1JlZ2lvblNhdmVPbj86IGJvb2xlYW4sXG4gICAgZmlsbENvbG9yPzogc3RyaW5nLFxuICAgIGFwcGVuZD86IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuc2V0UmVnaW9ucyhyZWdpb25zLCBzaG93UmVnaW9uTGFiZWwsIGlzUmVnaW9uU2F2ZU9uLCBmaWxsQ29sb3IsIGFwcGVuZCk7XG4gIH1cbiAgZ2V0UmVnaW9ucygpOiBSZWdpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpO1xuICB9XG4gIGdldFJlZ2lvblBvbHlnb25zKCk6IFBvbHlnb25bXSB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uUG9seWdvbnMoKTtcbiAgfVxuICBnZXRSZWdpb25VcGRhdGVFdmVudCgpOiBPYnNlcnZhYmxlPFJlZ2lvbltdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uVXBkYXRlRXZlbnQoKTtcbiAgfVxuICBzZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyhpbmRpY2VzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoaW5kaWNlcyk7XG4gIH1cbiAgc2VsZWN0UmVnaW9uKHJlZ2lvbjogUmVnaW9uKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5zZWxlY3RSZWdpb24ocmVnaW9uKTtcbiAgfVxuICBnZXRTZWxlY3RlZFNoYXBlSW5kaWNlcyQoKTogT2JzZXJ2YWJsZTxudW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFNlbGVjdGVkU2hhcGVJbmRpY2VzJCgpO1xuICB9XG4gIGRlbGV0ZUFjdGl2ZVNoYXBlKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuZGVsZXRlQWN0aXZlU2hhcGUoKTtcbiAgfVxuICBnZXRTaG93U2hhcGVMYWJlbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTaG93U2hhcGVMYWJlbCgpO1xuICB9XG4gIGdldFNoYXBlQ29sb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTaGFwZUNvbG9yKCk7XG4gIH1cbiAgZ2V0RmlsbENvbG9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0RmlsbENvbG9yKCk7XG4gIH1cbiAgZ2V0Q2xhc3NpZmljYXRpb25Db2xvcnMoKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0Q2xhc3NpZmljYXRpb25Db2xvcnMoKTtcbiAgfVxuICBzZXRDbGFzc2lmaWNhdGlvbkNvbG9yKGxhYmVsOiBzdHJpbmcsIGNvbG9yOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnNldENsYXNzaWZpY2F0aW9uQ29sb3IobGFiZWwsIGNvbG9yKTtcbiAgfVxuICAvLyBBbm5vdGF0aW9uLWNsYXNzIHByZXNldHMgbGl2ZSBpbiB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZSAoYmFja2VuZC1uZXV0cmFsXG4gIC8vIHNlc3Npb24gc3RhdGUpLCBzbyByb3V0ZSBzdHJhaWdodCB0byBpdCByYXRoZXIgdGhhbiB0aHJvdWdoIHJlbmRlcmVyKCkuIChqaXQtdWkjNzApXG4gIGdldFByZXNldFNldCgpOiBQcmVzZXRTZXQge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldFByZXNldFNldCgpO1xuICB9XG4gIGdldFByZXNldFNldCQoKTogT2JzZXJ2YWJsZTxQcmVzZXRTZXQ+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRQcmVzZXRTZXQkKCk7XG4gIH1cbiAgc2V0UHJlc2V0U2V0KHNldDogUHJlc2V0U2V0KTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zZXRQcmVzZXRTZXQoc2V0KTtcbiAgfVxuICB1cHNlcnRDbGFzcyhwcmVzZXQ6IENsYXNzUHJlc2V0KTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS51cHNlcnRDbGFzcyhwcmVzZXQpO1xuICB9XG4gIHJlbW92ZUNsYXNzKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUucmVtb3ZlQ2xhc3MobmFtZSk7XG4gIH1cbiAgcmVzZXRQcmVzZXRzKCk6IHZvaWQge1xuICAgIHRoaXMuc3RvcmUucmVzZXRQcmVzZXRzKCk7XG4gIH1cbiAgdW5kbygpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnVuZG8oKTtcbiAgfVxuICByZWRvKCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUucmVkbygpO1xuICB9XG4gIGNhblVuZG8oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuY2FuVW5kbygpO1xuICB9XG4gIGNhblJlZG8oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuY2FuUmVkbygpO1xuICB9XG4gIGdldENhblVuZG8kKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldENhblVuZG8kKCk7XG4gIH1cbiAgZ2V0Q2FuUmVkbyQoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0Q2FuUmVkbyQoKTtcbiAgfVxuICByZXNldFVuZG9IaXN0b3J5KCk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUucmVzZXRVbmRvSGlzdG9yeSgpO1xuICB9XG4gIGltcG9ydFJlZ2lvbnMoZ2VvSnNvblN0cjogc3RyaW5nKTogUmVnaW9uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmltcG9ydFJlZ2lvbnMoZ2VvSnNvblN0cik7XG4gIH1cbiAgLyoqIERvd25sb2FkIGByZWdpb25zYCBhcyBHZW9KU09OLCBuYW1lZCBhZnRlciB0aGUgaW1hZ2UgbGFzdCBwbG90dGVkLiAqL1xuICBleHBvcnRSZWdpb25zKHJlZ2lvbnM6IFJlZ2lvbltdKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5leHBvcnRSZWdpb25zKHJlZ2lvbnMsIHRoaXMucGxvdHRlZEZpbGVOYW1lKTtcbiAgfVxuICBnZXRHZW9Kc29uU3RyaW5nKHJlZ2lvbnM6IFJlZ2lvbltdKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRHZW9Kc29uU3RyaW5nKHJlZ2lvbnMpO1xuICB9XG5cbiAgLyoqIEhvbGQgYSBsYXJnZSByZWdpb24gc2V0IGFzIGEgdGlsZWQgcmVnaW9uIHNvdXJjZSAoc2VlIFJlZ2lvblN0b3JlLmF0dGFjaFJlZ2lvblNvdXJjZSkuICovXG4gIGF0dGFjaFJlZ2lvblNvdXJjZShzb3VyY2U6IFJlZ2lvblNvdXJjZSB8IFJlZ2lvblNvdXJjZU9wZW5lciwgc2xpY2VzPzogUmVnaW9uU291cmNlU2xpY2VzKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5hdHRhY2hSZWdpb25Tb3VyY2Uoc291cmNlLCBzbGljZXMpO1xuICB9XG4gIGFzeW5jIGltcG9ydFJlZ2lvblNvdXJjZShnZW9Kc29uU3RyOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoZ2VvSnNvblN0ci5sZW5ndGggPCAodGhpcy5jb25maWc/LnJlZ2lvblNvdXJjZU1pbkNoYXJzID8/IFJFR0lPTl9TT1VSQ0VfTUlOX0NIQVJTKSkgcmV0dXJuIGZhbHNlO1xuICAgIGxldCBvcGVuZWQ6IFJlZ2lvblNvdXJjZSB8IG51bGwgPSBhd2FpdCBvcGVuR2VvSnNvblJlZ2lvblNvdXJjZShnZW9Kc29uU3RyKTtcbiAgICAvLyBUaGUgZmlyc3Qgb3BlbiBpcyB0aGUgb25lIGp1c3QgbWFkZTsgYSBzb3VyY2UgY2xvc2VkIHRvIHNhdmUgbWVtb3J5IHBhcnNlcyBhZ2Fpbi5cbiAgICB0aGlzLnJlZ2lvblN0b3JlLmF0dGFjaFJlZ2lvblNvdXJjZSgoKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBvcGVuZWQ7XG4gICAgICBvcGVuZWQgPSBudWxsO1xuICAgICAgcmV0dXJuIHNvdXJjZSA/IFByb21pc2UucmVzb2x2ZShzb3VyY2UpIDogb3Blbkdlb0pzb25SZWdpb25Tb3VyY2UoZ2VvSnNvblN0cik7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZHJvcFJlZ2lvblNvdXJjZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5kcm9wU2xpY2VSZWdpb25Tb3VyY2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHRpY2tldCBmb3IgYSByZWdpb24gaW1wb3J0IHRoYXQgaXMgYWJvdXQgdG8gcmVhZCBvciBkZWNvZGUgaXRzIGZpbGVzOiB0aGUgaW1wb3J0IG1ldGhvZHNcbiAgICogZ2l2ZW4gaXQgY2hhbmdlIG5vdGhpbmcgb25jZSBpdCBpcyBzdGFsZSDigJQgYW5vdGhlciBpbXBvcnQgdG9vayBhIHRpY2tldCBzaW5jZSwgYW5vdGhlciBpbWFnZVxuICAgKiB3YXMgcGxvdHRlZCwgb3IgdGhlIHNlcnZpY2Ugd2FzIGRlc3Ryb3llZCDigJQgc28gYW4gaW1wb3J0IHRoYXQgZmluaXNoZXMgbGF0ZSBuZXZlciBsYW5kcyBvbiBhblxuICAgKiBpbWFnZSBpdCB3YXMgbm90IHN0YXJ0ZWQgZm9yLlxuICAgKi9cbiAgcmVnaW9uSW1wb3J0VGlja2V0KCk6IG51bWJlciB7XG4gICAgdGhpcy5pbXBvcnRUaWNrZXQgPSB7IGlkOiB0aGlzLmltcG9ydFRpY2tldC5pZCArIDEsIGltYWdlOiB0aGlzLmltcG9ydEltYWdlS2V5KCkgfTtcbiAgICByZXR1cm4gdGhpcy5pbXBvcnRUaWNrZXQuaWQ7XG4gIH1cblxuICAvKiogV2hldGhlciBgdGlja2V0YCBpcyBzdGlsbCB0aGUgY3VycmVudCBpbXBvcnQncywgb24gdGhlIGltYWdlIGl0IHdhcyB0YWtlbiBmb3IuICovXG4gIHByaXZhdGUgaW1wb3J0VGlja2V0VmFsaWQodGlja2V0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGlja2V0ID09PSB0aGlzLmltcG9ydFRpY2tldC5pZCAmJiB0aGlzLmltcG9ydFRpY2tldC5pbWFnZSA9PT0gdGhpcy5pbXBvcnRJbWFnZUtleSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbXBvcnRJbWFnZUtleSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBSZWdpb25TY29wZUNhY2hlLmltYWdlS2V5KHRoaXMucGxvdHRlZEluZm8gPz8gdW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIHRoZSBpbWFnZSdzIHJlZ2lvbnMgYW5kIHJlZ2lvbiBzb3VyY2VzIHdpdGggb25lIHNvdXJjZSBwZXIgc2xpY2UsIGFzIGFuIGltcG9ydGVkIGxhYmVsXG4gICAqIHZvbHVtZSBvciBmb2xkZXIgb2YgcGVyLXNsaWNlIHJlZ2lvbiBmaWxlcyBnaXZlcyB0aGVtOiBgb3BlbmVyc2AgYnkgc2xpY2UgaW5kZXgsIGVhY2ggb3BlbmVkXG4gICAqIHRoZSBmaXJzdCB0aW1lIGl0cyBzbGljZSBpcyBzaG93bi4gQSBzaW5nbGUgaW1hZ2UgdGFrZXMgc2xpY2UgMCdzLiBSZXR1cm5zIGhvdyBtYW55IHNsaWNlc1xuICAgKiBoYXZlIGEgc291cmNlLCBvciBudWxsIChjaGFuZ2luZyBub3RoaW5nKSB3aGVuIGB0aWNrZXRgIGlzIHN0YWxlIChzZWVcbiAgICoge0BsaW5rIHJlZ2lvbkltcG9ydFRpY2tldH0pLiBUaGUgc291cmNlcyBhcmUgbWFya2VkIGltcG9ydGVkLCBzbyBhIHNhdmUgd3JpdGVzIGV2ZXJ5IHNsaWNlLlxuICAgKi9cbiAgaW1wb3J0U2xpY2VSZWdpb25Tb3VyY2VzKG9wZW5lcnM6IFJlYWRvbmx5TWFwPG51bWJlciwgUmVnaW9uU291cmNlT3BlbmVyPiwgdGlja2V0PzogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgaWYgKHRpY2tldCAhPT0gdW5kZWZpbmVkICYmICF0aGlzLmltcG9ydFRpY2tldFZhbGlkKHRpY2tldCkpIHJldHVybiBudWxsO1xuICAgIHRoaXMucmVnaW9uSW1wb3J0VGlja2V0KCk7IC8vIHN1cGVyc2VkZXMgYW55IGltcG9ydCBzdGlsbCBpbiBmbGlnaHRcbiAgICBjb25zdCBpbmZvID0gdGhpcy5wbG90dGVkSW5mbztcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmRldGFjaFJlZ2lvblNvdXJjZXMoKTtcbiAgICBpZiAoIWluZm8/LmlzU3RhY2spIHtcbiAgICAgIGNvbnN0IGZpcnN0ID0gb3BlbmVycy5nZXQoMCkgPz8gb3BlbmVycy52YWx1ZXMoKS5uZXh0KCkudmFsdWU7XG4gICAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFJlZ2lvbnMoW10pO1xuICAgICAgdGhpcy5yZWdpb25TdG9yZS5yZXNldFVuZG9IaXN0b3J5KCk7XG4gICAgICBpZiAoIWZpcnN0KSByZXR1cm4gMDtcbiAgICAgIHRoaXMucmVnaW9uU3RvcmUuYXR0YWNoUmVnaW9uU291cmNlKGZpcnN0LCB7IHNsaWNlOiAwIH0sIHRydWUpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHRoaXMuZW50ZXJJbXBvcnRlZFN0YWNrKGluZm8pO1xuICAgIGZvciAoY29uc3QgW3osIG9wZW5dIG9mIG9wZW5lcnMpIHRoaXMucmVnaW9uU3RvcmUuYXR0YWNoUmVnaW9uU291cmNlKG9wZW4sIHsgc2xpY2U6IHogfSwgdHJ1ZSk7XG4gICAgcmV0dXJuIG9wZW5lcnMuc2l6ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlIHRoZSBpbWFnZSdzIHJlZ2lvbnMgYW5kIHJlZ2lvbiBzb3VyY2VzIHdpdGggb25lIGltcG9ydGVkIHNvdXJjZSAoYSByZWdpb24gc2V0IHRoZVxuICAgKiBob3N0J3Mgc2VydmVyIHNlcnZlcyk6IG92ZXIgZXZlcnkgc2xpY2Ugb2YgYSBzdGFjayB3aGVuIGl0IGlzIHotaW5kZXhlZCwgZWxzZSBvbiB0aGUgc2xpY2VcbiAgICogc2hvd24sIGFzIHtAbGluayBhcHBseUltYWdlUm9pc30gbGF5cyBvdXQgYW4gaW1hZ2UncyBvd24uIFJlc29sdmVzIGZhbHNlLCBjaGFuZ2luZyBub3RoaW5nXG4gICAqIChhbmQgZGlzcG9zaW5nIHRoZSBzb3VyY2UpLCB3aGVuIHRoZSBpbXBvcnQgd2VudCBzdGFsZSB3aGlsZSBpdCBvcGVuZWQ6IGFub3RoZXIgaW1wb3J0LCBvclxuICAgKiBhbm90aGVyIGltYWdlIChzZWUge0BsaW5rIHJlZ2lvbkltcG9ydFRpY2tldH07IG9uZSBpcyB0YWtlbiBoZXJlIHdoZW4gYHRpY2tldGAgaXMgbm90IGdpdmVuKS5cbiAgICovXG4gIGFzeW5jIGltcG9ydFJlZ2lvblNvdXJjZU9wZW5lcihvcGVuOiBSZWdpb25Tb3VyY2VPcGVuZXIsIHRpY2tldD86IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IG1pbmUgPSB0aWNrZXQgPz8gdGhpcy5yZWdpb25JbXBvcnRUaWNrZXQoKTtcbiAgICBpZiAoIXRoaXMuaW1wb3J0VGlja2V0VmFsaWQobWluZSkpIHJldHVybiBmYWxzZTtcbiAgICBsZXQgZmlyc3Q6IFJlZ2lvblNvdXJjZSB8IG51bGwgPSBhd2FpdCBvcGVuKCk7XG4gICAgaWYgKCF0aGlzLmltcG9ydFRpY2tldFZhbGlkKG1pbmUpKSB7XG4gICAgICBmaXJzdC5kaXNwb3NlKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHJldXNlOiBSZWdpb25Tb3VyY2VPcGVuZXIgPSAoKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBmaXJzdDtcbiAgICAgIGZpcnN0ID0gbnVsbDtcbiAgICAgIHJldHVybiBzb3VyY2UgPyBQcm9taXNlLnJlc29sdmUoc291cmNlKSA6IG9wZW4oKTtcbiAgICB9O1xuICAgIGNvbnN0IGluZm8gPSB0aGlzLnBsb3R0ZWRJbmZvO1xuICAgIGNvbnN0IHBsYW5lcyA9IGZpcnN0LmluZm8ucGxhbmVzO1xuICAgIGNvbnN0IHpJbmRleGVkID0gISFpbmZvPy5pc1N0YWNrICYmIHBsYW5lcy5zb21lKChwKSA9PiBwICE9PSAwKTtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmRldGFjaFJlZ2lvblNvdXJjZXMoKTtcbiAgICBpZiAoekluZGV4ZWQpIHtcbiAgICAgIHRoaXMuZW50ZXJJbXBvcnRlZFN0YWNrKGluZm8gYXMgSUltYWdlSW5mbyk7XG4gICAgICB0aGlzLnJlZ2lvblN0b3JlLmF0dGFjaFJlZ2lvblNvdXJjZShyZXVzZSwgJ3BsYW5lcycsIFsuLi5wbGFuZXNdKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFJlZ2lvbnMoW10pO1xuICAgIHRoaXMucmVnaW9uU3RvcmUucmVzZXRVbmRvSGlzdG9yeSgpO1xuICAgIHRoaXMucmVnaW9uU3RvcmUuYXR0YWNoUmVnaW9uU291cmNlKHJldXNlLCB7IHNsaWNlOiB0aGlzLnJlZ2lvblN0b3JlLmdldERpc3BsYXlTbGljZSgpIH0sIHRydWUpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIHNwYXRpYWwgZGF0YXNldCdzIHJlZ2lvbiBzZXQgKGEgM0Qgc2VnbWVudGF0aW9uJ3MgY2VsbHMsIG91dGxpbmVkIG9uIGV2ZXJ5IHBsYW5lIHRoZXlcbiAgICogc3BhbikgdG8gaXRzIGltYWdlLCB0aGUgaW1hZ2UgcGxvdHRlZCBub3csIGFzIHRoZSBpbWFnZSdzIG93biByZWdpb25zIGFyZTogb3ZlciBldmVyeSBzbGljZVxuICAgKiBmcm9tIHRoZSBzZXQncyBwbGFuZXMgKGAncGxhbmVzJ2ApLCBub3QgbWFya2VkIGltcG9ydGVkIChpdCBpcyB0aGUgZGF0YXNldCdzLCBub3RoaW5nIHRvIHNhdmUpLFxuICAgKiBsZWF2aW5nIHRoZSBpbWFnZSdzIGRyYXduIHJlZ2lvbnMgYXMgdGhleSBhcmUuIE9uY2UgcGVyIGltYWdlIGFuZCBzZXQ6IGNhbGxlZCBhZ2FpbiAodGhlXG4gICAqIGRhdGFzZXQgcmUtZW1pdHRlZCwgdGhlIGltYWdlIHJlLXBsb3R0ZWQpIGl0IGNoYW5nZXMgbm90aGluZy4gV2hlcmUgdGhlIHNldCdzIHNsaWNlcyBhcmUgKGl0c1xuICAgKiBgc2xpY2VaYCkgcGxhY2VzIGl0cyBzdXJmYWNlcyBhbW9uZyB0aGUgb2JzZXJ2YXRpb25zIGluIHNwYXRpYWwgM0QsIHdoZXJlIHRoZSByZWdpb24gZWRpdG9yIHRoZW5cbiAgICogb2ZmZXJzIGl0cyBjbGFzc2VzIGluIDNEOyB0aGVyZSwgZXZlcnkgY2xhc3MgaXMgc2hvd24gb25jZSBieSBpdHNlbGYgKHNlZSBzaG93RGF0YXNldFJlZ2lvblNldDNkKS5cbiAgICogQmFjayBvbiBhbiBpbWFnZSB0aGUgc2V0IHdhcyBhdHRhY2hlZCB0bywgd2l0aCBpdHMgc291cmNlIHN0aWxsIHRoZSBzdG9yZSdzLCBpdCBpcyByZXN0b3JlZCBhc1xuICAgKiBpdCB3YXMgKHdoYXQgd2FzIHRha2VuIGZyb20gdGhlIHNvdXJjZSwgb3IgZGVsZXRlZCwgc3RheXMgc28pLCBub3QgYXR0YWNoZWQgYWdhaW4uXG4gICAqIFJlc29sdmVzIGZhbHNlLCBjaGFuZ2luZyBub3RoaW5nICh0aGUgc291cmNlIGRpc3Bvc2VkKSwgd2hlbiBhbm90aGVyIGltYWdlIHdhcyBwbG90dGVkIG9yXG4gICAqIGFub3RoZXIgc2V0IGF0dGFjaGVkIHdoaWxlIGl0IG9wZW5lZCwgaXQgY291bGQgbm90IGJlIG9wZW5lZCwgb3IgdGhlIGltYWdlIGhhcyByZWdpb24gc291cmNlc1xuICAgKiBvZiBpdHMgb3duICh3aGljaCBpdCB3b3VsZCByZXBsYWNlLCBzZWUga2VlcHNPd25Tb3VyY2VzKS5cbiAgICovXG4gIGFzeW5jIGF0dGFjaERhdGFzZXRSZWdpb25TZXQob3BlbjogUmVnaW9uU291cmNlT3BlbmVyLCBrZXk6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGltYWdlID0gdGhpcy5pbXBvcnRJbWFnZUtleSgpO1xuICAgIGlmICghaW1hZ2UpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5kYXRhc2V0UmVnaW9uU2V0O1xuICAgIGlmIChjdXJyZW50Py5pbWFnZSA9PT0gaW1hZ2UgJiYgY3VycmVudC5rZXkgPT09IGtleSkge1xuICAgICAgdGhpcy5zaG93RGF0YXNldFJlZ2lvblNldDNkKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gQmFjayBvbiBhbiBpbWFnZSB3aG9zZSBzZXQgaXMgYXR0YWNoZWQ6IGl0cyBzb3VyY2UgaXMgc3RpbGwgdGhlIHN0b3JlJ3MsIHdpdGggd2hhdCB3YXMgdGFrZW5cbiAgICAvLyBmcm9tIGl0LiBSZXN0b3JlZCwgbm90IGF0dGFjaGVkIGFnYWluLlxuICAgIGNvbnN0IGtub3duID0gdGhpcy5hdHRhY2hlZFJlZ2lvblNldHMuZ2V0KGltYWdlKTtcbiAgICBpZiAoa25vd24/LmtleSA9PT0ga2V5ICYmIGtub3duLm9wZW5lciAmJiBrbm93bi5vcGVuZXIgPT09IHRoaXMucmVnaW9uU3RvcmUuZ2V0UGxhbmVzU291cmNlT3BlbmVyKCkpIHtcbiAgICAgIHRoaXMudXNlRGF0YXNldFJlZ2lvblNldChrbm93bik7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMua2VlcHNPd25Tb3VyY2VzKGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAvLyBDbGFpbWVkIGJlZm9yZSB0aGUgc291cmNlIG9wZW5zOiBhIHNlY29uZCBjYWxsIG1lYW53aGlsZSBjaGFuZ2VzIG5vdGhpbmcuXG4gICAgY29uc3QgY2xhaW06IERhdGFzZXRSZWdpb25TZXRTdGF0ZSA9IHsgaW1hZ2UsIGtleSwgcGxhbmVzOiBudWxsLCBncm91cHM6IFtdLCBzaG93bjNkOiBmYWxzZSwgb3BlbmVyOiBudWxsIH07XG4gICAgdGhpcy5kYXRhc2V0UmVnaW9uU2V0ID0gY2xhaW07XG4gICAgbGV0IGZpcnN0OiBSZWdpb25Tb3VyY2UgfCBudWxsO1xuICAgIHRyeSB7XG4gICAgICBmaXJzdCA9IGF3YWl0IG9wZW4oKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmICh0aGlzLmRhdGFzZXRSZWdpb25TZXQgPT09IGNsYWltKSB0aGlzLmRhdGFzZXRSZWdpb25TZXQgPSBudWxsO1xuICAgICAgY29uc29sZS53YXJuKFwiW3Zpc3VhbGl6ZXJdIHRoZSBkYXRhc2V0J3MgcmVnaW9uIHNldCBjb3VsZCBub3QgYmUgb3BlbmVkXCIsIGVycik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLmRhdGFzZXRSZWdpb25TZXQgIT09IGNsYWltIHx8IHRoaXMuaW1wb3J0SW1hZ2VLZXkoKSAhPT0gaW1hZ2UgfHwgdGhpcy5rZWVwc093blNvdXJjZXMoa2V5KSkge1xuICAgICAgaWYgKHRoaXMuZGF0YXNldFJlZ2lvblNldCA9PT0gY2xhaW0pIHRoaXMuZGF0YXNldFJlZ2lvblNldCA9IG51bGw7XG4gICAgICBmaXJzdC5kaXNwb3NlKCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGluZm8gPSBmaXJzdC5pbmZvO1xuICAgIGNvbnN0IHJldXNlOiBSZWdpb25Tb3VyY2VPcGVuZXIgPSAoKSA9PiB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBmaXJzdDtcbiAgICAgIGZpcnN0ID0gbnVsbDtcbiAgICAgIHJldHVybiBzb3VyY2UgPyBQcm9taXNlLnJlc29sdmUoc291cmNlKSA6IG9wZW4oKTtcbiAgICB9O1xuICAgIGNvbnN0IHBsYW5lcyA9IGluZm8uc2xpY2VaPy5sZW5ndGggJiYgaW5mby5zbGljZVoubGVuZ3RoID09PSBpbmZvLnBsYW5lcy5sZW5ndGggPyBpbmZvLnNsaWNlWiA6IG51bGw7XG4gICAgLy8gU2xpY2VkIGJ5IGl0cyBwbGFuZXMsIHRoZSBpbWFnZSdzIHJlZ2lvbnMgYXJlIGhlbGQgcGVyIHBsYW5lIChzZWUgdXNlRGF0YXNldFJlZ2lvblNldCk6IHN0YWNrXG4gICAgLy8gbW9kZSBmaXJzdCwgc28gdGhlIHNvdXJjZSBpcyBsYWlkIG91dCBvbiB0aGUgcGxhbmUgc2hvd24uXG4gICAgaWYgKHBsYW5lcyAmJiBwbGFuZXMubGVuZ3RoID4gMSAmJiAhdGhpcy5wbG90dGVkSW5mbz8uaXNTdGFjayAmJiAhdGhpcy5yZWdpb25TdG9yZS5pc1N0YWNrTW9kZSgpKSB7XG4gICAgICBjb25zdCB6ID0gdGhpcy5jdXJyZW50WkluZGV4IDwgcGxhbmVzLmxlbmd0aCA/IHRoaXMuY3VycmVudFpJbmRleCA6IDA7XG4gICAgICB0aGlzLnJlZ2lvblN0b3JlLmVudGVyU3RhY2tNb2RlKG5ldyBNYXAoW1t6LCB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKV1dKSwgeiwgJ2NvbWJpbmVkJyk7XG4gICAgfVxuICAgIHRoaXMucmVnaW9uU3RvcmUuYXR0YWNoUmVnaW9uU291cmNlKHJldXNlLCAncGxhbmVzJyk7XG4gICAgY29uc3Qgc2V0OiBEYXRhc2V0UmVnaW9uU2V0U3RhdGUgPSB7IC4uLmNsYWltLCBwbGFuZXMsIGdyb3VwczogcmVnaW9uU2V0R3JvdXBzKGluZm8pLCBvcGVuZXI6IHJldXNlIH07XG4gICAgdGhpcy5hdHRhY2hlZFJlZ2lvblNldHMuc2V0KGltYWdlLCBzZXQpO1xuICAgIHRoaXMudXNlRGF0YXNldFJlZ2lvblNldChzZXQpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBsb3R0ZWQgaW1hZ2UgaGFzIHJlZ2lvbiBzb3VyY2VzIG9mIGl0cyBvd24gKGEgc2VydmVkIHNldCwgbGFyZ2Ugc2F2ZWQgUk9JcywgYW5cbiAgICogYW5ub3RhdGlvbiBmb2xkZXIncyBzbGljZXMpLCB3aGljaCBhdHRhY2hpbmcgdGhlIGRhdGFzZXQncyBzZXQgb3ZlciBldmVyeSBwbGFuZSB3b3VsZCByZXBsYWNlLFxuICAgKiBkcm9wcGluZyB0aGVtIGFuZCB3aGF0IHdhcyB0YWtlbiBmcm9tIHRoZW06IHRoZXkgYXJlIGtlcHQsIGFuZCB0aGUgc2V0IGlzIG5vdCBhdHRhY2hlZC5cbiAgICovXG4gIHByaXZhdGUga2VlcHNPd25Tb3VyY2VzKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnJlZ2lvblN0b3JlLmhhc0FueVJlZ2lvblNvdXJjZSgpKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYFt2aXN1YWxpemVyXSB0aGUgaW1hZ2UgaGFzIHJlZ2lvbiBzb3VyY2VzIG9mIGl0cyBvd246IHRoZSBkYXRhc2V0J3MgcmVnaW9uIHNldCAoJHtrZXl9KSBpcyBub3QgYXR0YWNoZWQgb3ZlciB0aGVtYCxcbiAgICApO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYHNldGAgdGhlIHBsb3R0ZWQgaW1hZ2UncyByZWdpb24gc2V0OiBpdHMgcGxhbmVzIHNsaWNlIHRoZSBpbWFnZSAoaXRzIHJlZ2lvbnMgcGVyIHBsYW5lLFxuICAgKiBhcyBhIHN0YWNrJ3MgcGVyIHNsaWNlOiB0aG9zZSBkcmF3biBiZWZvcmUgZ28gdG8gdGhlIHBsYW5lIHNob3duKSwgcGxhY2UgaXRzIHN1cmZhY2VzIGluXG4gICAqIHNwYXRpYWwgM0QgYW5kIGRyaXZlIHRoZSBzbGlkZXIuXG4gICAqL1xuICBwcml2YXRlIHVzZURhdGFzZXRSZWdpb25TZXQoc2V0OiBEYXRhc2V0UmVnaW9uU2V0U3RhdGUpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGFzZXRSZWdpb25TZXQgPSBzZXQ7XG4gICAgY29uc3QgcGxhbmVzID0gc2V0LnBsYW5lcztcbiAgICBjb25zdCBzbGljZWQgPSAhIXBsYW5lcyAmJiBwbGFuZXMubGVuZ3RoID4gMSAmJiAhdGhpcy5wbG90dGVkSW5mbz8uaXNTdGFjaztcbiAgICBpZiAoc2xpY2VkICYmICF0aGlzLnJlZ2lvblN0b3JlLmlzU3RhY2tNb2RlKCkpIHtcbiAgICAgIGNvbnN0IHogPSB0aGlzLmN1cnJlbnRaSW5kZXggPCBwbGFuZXMubGVuZ3RoID8gdGhpcy5jdXJyZW50WkluZGV4IDogMDtcbiAgICAgIHRoaXMucmVnaW9uU3RvcmUuZW50ZXJTdGFja01vZGUobmV3IE1hcChbW3osIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpXV0pLCB6LCAnY29tYmluZWQnKTtcbiAgICB9XG4gICAgdGhpcy5uYXBhcmkuc2V0UmVnaW9uUGxhbmVzKHBsYW5lcyk7XG4gICAgaWYgKHBsYW5lcykgdGhpcy5uYXBhcmkuc2V0UmVnaW9uUGxhbmUodGhpcy5jdXJyZW50WkluZGV4KTtcbiAgICB0aGlzLmRhdGFzZXRQbGFuZXMkLm5leHQoc2xpY2VkID8gcGxhbmVzIDogbnVsbCk7XG4gICAgdGhpcy5zcGF0aWFsVmlld0NoYW5nZWQkLm5leHQoKTtcbiAgICAvLyBSZWdpb25zIHN3aXRjaGVkIG9mZiBpbiBhIHNwYXRpYWwgdmlldyBiZWZvcmUgdGhlIHNldCBjYW1lOiBpdHMgY2xhc3NlcyBhcmUgaGlkZGVuIGFzIHRoZVxuICAgIC8vIHJlc3QgYXJlLlxuICAgIGlmIChcbiAgICAgIHRoaXMuYW5ub3RhdGlvbnNIaWRkZW4gJiZcbiAgICAgIChpc1NwYXRpYWxPbWljcyh0aGlzLmN1cnJlbnRQbG90VHlwZSkgfHwgaXNTcGF0aWFsT21pY3MzZCh0aGlzLmN1cnJlbnRQbG90VHlwZSkpXG4gICAgKSB7XG4gICAgICB0aGlzLnNldENsYXNzZXNIaWRkZW4oXG4gICAgICAgIHNldC5ncm91cHMuZmxhdE1hcCgoZykgPT4gZy5jbGFzc2VzKSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlVm9sdW1lVmlldyh0aGlzLmN1cnJlbnRQbG90VHlwZSk7XG4gICAgdGhpcy5zaG93RGF0YXNldFJlZ2lvblNldDNkKCk7XG4gICAgdGhpcy51cGRhdGVQbGFuZUNlbGxzKCk7XG4gICAgdGhpcy51cGRhdGVDZWxsczNkKCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGRhdGFzZXQgbm8gbG9uZ2VyIG5hbWVzIHRoZSBhdHRhY2hlZCBzZXQgd2hpbGUgaXRzIGltYWdlIGlzIHN0aWxsIHBsb3R0ZWQgKHNlZVxuICAgKiBJVmlzdWFsaXplci5yZWxlYXNlRGF0YXNldFJlZ2lvblNldCk6IGl0cyBwbGFuZXMsIGl0cyBzdXJmYWNlcyBhbmQgY2VsbHMgaW4gM0QgZ28sIGFzIG9uIGFub3RoZXJcbiAgICogaW1hZ2UuIEl0cyBhdHRhY2htZW50IGlzIGtlcHQgKGF0dGFjaGVkUmVnaW9uU2V0cyk6IHRoZSBzYW1lIHNldCBhc2tlZCBmb3IgYWdhaW4gaXMgcmVzdG9yZWQuXG4gICAqL1xuICByZWxlYXNlRGF0YXNldFJlZ2lvblNldChrZWVwOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgY29uc3Qgc2V0ID0gdGhpcy5kYXRhc2V0UmVnaW9uU2V0O1xuICAgIGlmICghc2V0IHx8IHNldC5rZXkgPT09IGtlZXApIHJldHVybjtcbiAgICAvLyBPbmUgc3RpbGwgb3BlbmluZyAodGhlIGNsYWltKSBpcyBkcm9wcGVkIHdoZW4gaXQgb3BlbnMuXG4gICAgdGhpcy5kYXRhc2V0UmVnaW9uU2V0ID0gbnVsbDtcbiAgICBpZiAoc2V0LnBsYW5lcyAmJiB0aGlzLmNsYXNzZXMzZCQudmFsdWUubGVuZ3RoICYmIHRoaXMuY2xhc3NlczNkSW1hZ2UgPT09IHRoaXMucGxvdHRlZEZpbGVOYW1lKSB7XG4gICAgICB0aGlzLmNsZWFyUmVnaW9uQ2xhc3NlczNkKCk7XG4gICAgfVxuICAgIHRoaXMubmFwYXJpLnNldFJlZ2lvblBsYW5lcyhudWxsKTtcbiAgICB0aGlzLmRhdGFzZXRQbGFuZXMkLm5leHQobnVsbCk7XG4gICAgdGhpcy5zcGF0aWFsVmlld0NoYW5nZWQkLm5leHQoKTtcbiAgICB0aGlzLnVwZGF0ZVZvbHVtZVZpZXcodGhpcy5jdXJyZW50UGxvdFR5cGUpO1xuICAgIHRoaXMudXBkYXRlQ2VsbHMzZCgpO1xuICAgIHRoaXMudXBkYXRlUGxhbmVDZWxscygpO1xuICB9XG5cbiAgLyoqIFRoZSBkYXRhc2V0IHJlZ2lvbiBzZXQncyBjbGFzc2VzIHdoaWxlIGluIHNwYXRpYWwgM0Q6IHRob3NlIHRoYXQgY2FuIGJlIGRyYXduIGFzIGNlbGxzLiAqL1xuICBnZXRDZWxsYWJsZUNsYXNzZXMzZCQoKTogT2JzZXJ2YWJsZTxSZWFkb25seVNldDxzdHJpbmc+PiB7XG4gICAgcmV0dXJuIHRoaXMuY2VsbGFibGUzZCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKiogVGhlIGNsYXNzZXMgdGhlIHNwYXRpYWwgM0QgdmlldyBkcmF3cyBhcyBpbmRpdmlkdWFsIGNlbGxzIChzZWUgdXBkYXRlQ2VsbHMzZCkuICovXG4gIGdldEluZGl2aWR1YWxDbGFzc2VzM2QkKCk6IE9ic2VydmFibGU8UmVhZG9ubHlTZXQ8c3RyaW5nPj4ge1xuICAgIHJldHVybiB0aGlzLmluZGl2aWR1YWwzZCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKiogRHJhdyB0aGVzZSBjbGFzc2VzIGFzIGluZGl2aWR1YWwgY2VsbHMgaW4gc3BhdGlhbCAzRCwgb3IgbWVyZ2VkIGFnYWluICh0aGUgZ2xvYmFsIHN3aXRjaCBhc2lkZSkuICovXG4gIHNldENsYXNzZXNJbmRpdmlkdWFsM2QoY2xhc3NlczogcmVhZG9ubHkgc3RyaW5nW10sIGluZGl2aWR1YWw6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBnbG9iYWwgPSB0aGlzLmNlbGxzM2RNb2RlID09PSAnY2VsbHMnO1xuICAgIGZvciAoY29uc3QgYyBvZiBjbGFzc2VzKSB7XG4gICAgICBpZiAoaW5kaXZpZHVhbCA9PT0gZ2xvYmFsKSB0aGlzLmNlbGxzM2RPdmVycmlkZXMuZGVsZXRlKGMpO1xuICAgICAgZWxzZSB0aGlzLmNlbGxzM2RPdmVycmlkZXMuc2V0KGMsIGluZGl2aWR1YWwpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZUNlbGxzM2QodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogV2hpY2ggb2YgdGhlIGRhdGFzZXQgcmVnaW9uIHNldCdzIGNsYXNzZXMgdGhlIHNwYXRpYWwgM0QgdmlldyBkcmF3cyBhcyBpbmRpdmlkdWFsIGNlbGxzOiBldmVyeVxuICAgKiBvbmUgd2l0aCB0aGUgcGFuZWwncyBnbG9iYWwgc3dpdGNoIG9uIFwiY2VsbHNcIiwgbm9uZSBvbiBcInR5cGVzXCIsIGVhY2ggY2xhc3MgdGhlIFJlZ2lvbiBFZGl0b3JcbiAgICogc2V0IHRoZSBvdGhlciB3YXkgZXhjZXB0ZWQuIFR1cm5pbmcgdGhlIGdsb2JhbCBzd2l0Y2ggcmVzZXRzIHRob3NlLiBUaGUgaW5kaXZpZHVhbCBjbGFzc2VzJ1xuICAgKiBtZXJnZWQgc3VyZmFjZXMgYXJlIGxlZnQgb3V0IChzZWUgc2hvd1JlZ2lvbkNsYXNzZXMzZCk7IHRoZWlyIGNlbGxzIGFyZSBkcmF3biBpbnN0ZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVDZWxsczNkKGZvcmNlID0gZmFsc2UpOiB2b2lkIHtcbiAgICBjb25zdCBtb2RlID0gdGhpcy5zdG9yZS5jdXJyZW50U3BhdGlhbFZpZXcoKS5jZWxsczNkID8/ICd0eXBlcyc7XG4gICAgaWYgKG1vZGUgIT09IHRoaXMuY2VsbHMzZE1vZGUpIHtcbiAgICAgIHRoaXMuY2VsbHMzZE1vZGUgPSBtb2RlO1xuICAgICAgdGhpcy5jZWxsczNkT3ZlcnJpZGVzLmNsZWFyKCk7XG4gICAgICBmb3JjZSA9IHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGNsYXNzZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGcgb2YgdGhpcy5kYXRhc2V0UmVnaW9uU2V0Py5wbGFuZXMgPyB0aGlzLmRhdGFzZXRSZWdpb25TZXQuZ3JvdXBzIDogW10pIHtcbiAgICAgIGZvciAoY29uc3QgYyBvZiBnLmNsYXNzZXMpIHtcbiAgICAgICAgaWYgKHRoaXMuY2VsbHMzZE92ZXJyaWRlcy5nZXQoYykgPz8gbW9kZSA9PT0gJ2NlbGxzJykgY2xhc3Nlcy5hZGQoYyk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGNlbGxhYmxlID0gbmV3IFNldDxzdHJpbmc+KFxuICAgICAgaXNTcGF0aWFsT21pY3MzZCh0aGlzLmN1cnJlbnRQbG90VHlwZSkgJiYgdGhpcy5kYXRhc2V0UmVnaW9uU2V0Py5wbGFuZXNcbiAgICAgICAgPyB0aGlzLmRhdGFzZXRSZWdpb25TZXQuZ3JvdXBzLmZsYXRNYXAoKGcpID0+IGcuY2xhc3NlcylcbiAgICAgICAgOiBbXSxcbiAgICApO1xuICAgIGNvbnN0IGhhZCA9IHRoaXMuY2VsbGFibGUzZCQudmFsdWU7XG4gICAgaWYgKGhhZC5zaXplICE9PSBjZWxsYWJsZS5zaXplIHx8IFsuLi5jZWxsYWJsZV0uc29tZSgoYykgPT4gIWhhZC5oYXMoYykpKSB0aGlzLmNlbGxhYmxlM2QkLm5leHQoY2VsbGFibGUpO1xuICAgIGNvbnN0IGJlZm9yZSA9IHRoaXMuaW5kaXZpZHVhbDNkJC52YWx1ZTtcbiAgICBjb25zdCBzYW1lID0gYmVmb3JlLnNpemUgPT09IGNsYXNzZXMuc2l6ZSAmJiBbLi4uY2xhc3Nlc10uZXZlcnkoKGMpID0+IGJlZm9yZS5oYXMoYykpO1xuICAgIGlmIChzYW1lICYmICFmb3JjZSkgcmV0dXJuO1xuICAgIGlmICghc2FtZSkgdGhpcy5pbmRpdmlkdWFsM2QkLm5leHQoY2xhc3Nlcyk7XG4gICAgdGhpcy5uYXBhcmkuc2V0UmVnaW9uQ2VsbHMoY2xhc3Nlcy5zaXplID8gWy4uLmNsYXNzZXNdIDogbnVsbCk7XG4gICAgLy8gVGhlIG1lcmdlZCBzdXJmYWNlcyBmb2xsb3c6IGFuIGluZGl2aWR1YWwgY2xhc3MncyBsZWF2ZXMgdGhlbSwgYSBtZXJnZWQgb25lJ3MgY29tZXMgYmFjay5cbiAgICBpZiAoIXNhbWUgJiYgdGhpcy5zaG93bjNkLmxlbmd0aCAmJiB0aGlzLmNsYXNzZXMzZEltYWdlID09PSB0aGlzLnBsb3R0ZWRGaWxlTmFtZSkge1xuICAgICAgdm9pZCB0aGlzLnNob3dSZWdpb25DbGFzc2VzM2QodGhpcy5zaG93bjNkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW4gdGhlIHNwYXRpYWwgdmlld3MgKDJEIGFuZCAzRCksIHRoZSBzcGF0aWFsIHBhbmVsJ3MgUmVnaW9ucyBzd2l0Y2ggKGBzaG93QW5ub3RhdGlvbnNgLCBvZmYgYnlcbiAgICogZGVmYXVsdCkgaXMgZXZlcnkgY2xhc3MncyBpbiB0aGUgUmVnaW9uIEVkaXRvcidzIGxpc3QsIGFzIHRoZWlyIGV5ZXMgYXJlOiBvZmYsIGV2ZXJ5IGNsYXNzIGlzXG4gICAqIGhpZGRlbiAodGhlIGRyYXduIHJlZ2lvbnMnIGFuZCB0aGUgZGF0YXNldCByZWdpb24gc2V0J3MgY2VsbCB0eXBlcyBhbGlrZTogdGhlaXIgcmVnaW9ucyBpbiAyRCxcbiAgICogdGhlaXIgc3VyZmFjZXMgaW4gM0QsIGFuZCB0aGUgZXllcyBzaG93IGl0KTsgb24gYWdhaW4sIGV2ZXJ5IGNsYXNzIGlzIHNob3duLiBBcHBsaWVkIHdoZW4gdGhlXG4gICAqIHN3aXRjaCBjaGFuZ2VzLCBvciBvbiBlbnRlcmluZyBhIHNwYXRpYWwgdmlldyB3aXRoIGl0IG9mZiAoc28gYnkgZGVmYXVsdCksIHNvIGEgY2xhc3MgaGlkZGVuIG9yXG4gICAqIHNob3duIGJ5IGl0cyBvd24gZXllIG1lYW53aGlsZSBzdGF5cyBhcyBpdCB3YXMgc2V0LlxuICAgKi9cbiAgcHJpdmF0ZSBzeW5jQW5ub3RhdGlvbnMoKTogdm9pZCB7XG4gICAgaWYgKCFpc1NwYXRpYWxPbWljcyh0aGlzLmN1cnJlbnRQbG90VHlwZSkgJiYgIWlzU3BhdGlhbE9taWNzM2QodGhpcy5jdXJyZW50UGxvdFR5cGUpKSByZXR1cm47XG4gICAgY29uc3QgaGlkZSA9IHRoaXMuc3RvcmUuY3VycmVudFNwYXRpYWxWaWV3KCkuc2hvd0Fubm90YXRpb25zID09PSBmYWxzZTtcbiAgICBpZiAoaGlkZSA9PT0gdGhpcy5hbm5vdGF0aW9uc0hpZGRlbikgcmV0dXJuO1xuICAgIHRoaXMuYW5ub3RhdGlvbnNIaWRkZW4gPSBoaWRlO1xuICAgIGNvbnN0IGNsYXNzZXMgPSB0aGlzLmtub3duQ2xhc3NlcygpO1xuICAgIGlmIChjbGFzc2VzLmxlbmd0aCkgdGhpcy5zZXRDbGFzc2VzSGlkZGVuKGNsYXNzZXMsIGhpZGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IGNsYXNzIHRoZSBSZWdpb24gRWRpdG9yIGxpc3RzIGZvciB0aGUgaW1hZ2U6IHRoZSBkYXRhc2V0IHJlZ2lvbiBzZXQncywgdGhvc2Ugc2hvd24gaW4gM0QsXG4gICAqIHRoZSBkcmF3biByZWdpb25zJywgYW5kIGFueSBoaWRkZW4gbm93LlxuICAgKi9cbiAgcHJpdmF0ZSBrbm93bkNsYXNzZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IG91dCA9IG5ldyBTZXQ8c3RyaW5nPih0aGlzLnJlZ2lvblN0b3JlLmdldEhpZGRlbkNsYXNzZXMoKSk7XG4gICAgZm9yIChjb25zdCBnIG9mIHRoaXMuZGF0YXNldFJlZ2lvblNldD8uZ3JvdXBzID8/IFtdKSBnLmNsYXNzZXMuZm9yRWFjaCgoYykgPT4gb3V0LmFkZChjKSk7XG4gICAgZm9yIChjb25zdCBnIG9mIHRoaXMuc2hvd24zZCkgZy5jbGFzc2VzLmZvckVhY2goKGMpID0+IG91dC5hZGQoYykpO1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKSkgaWYgKHIubGFiZWwpIG91dC5hZGQoci5sYWJlbCk7XG4gICAgcmV0dXJuIFsuLi5vdXRdO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBDZWxscyBwYW5lbCdzIGJvdW5kYXJ5IHNldCB0aGF0IGlzIHRoZSBkYXRhc2V0J3MgcmVnaW9uIHNldCAodGhlIG9uZSBuYW1pbmcgaXQgYXMgaXRzXG4gICAqIGByZWdpb25Tb3VyY2VgKSwgd2hpbGUgaXRzIHBsYW5lcyBhcmUgc2hvd24gb24gdGhlIHBsb3R0ZWQgaW1hZ2Ugd2l0aCBpdHMgc291cmNlIHN0aWxsIHRoZVxuICAgKiBzdG9yZSdzOyBudWxsIG90aGVyd2lzZS5cbiAgICovXG4gIHByaXZhdGUgcGxhbmVDZWxsU2V0KCk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IHNldCA9IHRoaXMuZGF0YXNldFJlZ2lvblNldDtcbiAgICBpZiAoIXNldD8ucGxhbmVzIHx8ICFzZXQub3BlbmVyIHx8IHNldC5vcGVuZXIgIT09IHRoaXMucmVnaW9uU3RvcmUuZ2V0UGxhbmVzU291cmNlT3BlbmVyKCkpIHJldHVybiBudWxsO1xuICAgIHJldHVybiB0aGlzLnNwYXRpYWxEYXRhc2V0Py5wb2x5Z29uVGlsZXM/LnNldHMuZmluZCgocykgPT4gcy5yZWdpb25Tb3VyY2UgPT09IHNldC5rZXkpPy5uYW1lID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogV2hpbGUgdGhlIGRhdGFzZXQgcmVnaW9uIHNldCdzIHBsYW5lcyBhcmUgc2hvd24sIHRoZSBDZWxscyBwYW5lbCBkcmF3cyBlYWNoIHBsYW5lJ3MgY2VsbHMgZnJvbVxuICAgKiBpdCAoaXRzIGJvdW5kYXJ5IHNldCwgc2VlIGBDZWxsTGF5ZXJzLnNldFBsYW5lYCk6XG4gICAqICAtIHRoYXQgc2V0IGlzIHRoZSBwYW5lbCdzIGJvdW5kYXJpZXMgYnkgZGVmYXVsdDogYSB2aWV3IHRoYXQgaGFzIG5vdCBjaG9zZW4gYSBzZXQgKG5vbmUgeWV0LCBvclxuICAgKiAgICBhZnRlciBhIHJlc2V0KSBpcyBnaXZlbiBpdDtcbiAgICogIC0gaW4gdGhlIDJEIHNwYXRpYWwgdmlldywgd2hpbGUgdGhlIHBhbmVsIGRyYXdzIHRoZW0sIHRoZSBvdmVybGF5cyBkbyBub3QgZHJhdyB0aGUgc2FtZVxuICAgKiAgICBvdXRsaW5lcyBhIHNlY29uZCB0aW1lIChgUmVnaW9uU3RvcmUuc2V0UmVnaW9uU291cmNlRHJhd25gKS4gVGhleSBzdGF5IGxpc3RlZCBhbmQgZWRpdGFibGVcbiAgICogICAgaW4gdGhlIFJlZ2lvbiBFZGl0b3IsIGFuZCBhcmUgZHJhd24gYnkgdGhlIG92ZXJsYXlzIGV2ZXJ5d2hlcmUgZWxzZS5cbiAgICovXG4gIHByaXZhdGUgdXBkYXRlUGxhbmVDZWxscygpOiB2b2lkIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5wbGFuZUNlbGxTZXQoKTtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy5zdG9yZS5jdXJyZW50U3BhdGlhbFZpZXcoKTtcbiAgICBpZiAobmFtZSAmJiB2aWV3LmNlbGxTZXQgPT0gbnVsbCkge1xuICAgICAgLy8gRW1pdHMgdGhlIHZpZXcsIHdoaWNoIGNvbWVzIGJhY2sgaGVyZSB3aXRoIHRoZSBzZXQgY2hvc2VuLlxuICAgICAgdGhpcy5zdG9yZS5zZXRTcGF0aWFsVmlldyh7IGNlbGxTZXQ6IG5hbWUgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRyYXduID0gZHJhd25DZWxsU2V0cyh0aGlzLnNwYXRpYWxEYXRhc2V0Py5wb2x5Z29uVGlsZXMsIHZpZXcuY2VsbFNldCk7XG4gICAgY29uc3QgYnlDZWxscyA9XG4gICAgICAhIW5hbWUgJiZcbiAgICAgIGlzU3BhdGlhbE9taWNzKHRoaXMuY3VycmVudFBsb3RUeXBlKSAmJlxuICAgICAgKHZpZXcuc2hvd0NlbGxzID8/IHRydWUpICYmXG4gICAgICBkcmF3bj8uc2V0ID09PSBuYW1lICYmXG4gICAgICAhZHJhd24ubnVjbGV1c1NldDtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldFJlZ2lvblNvdXJjZURyYXduKCFieUNlbGxzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbiBzcGF0aWFsIDNELCB3aXRoIHRoZSBkYXRhc2V0J3MgcmVnaW9uIHNldCBwbGFjZWQgdGhlcmU6IHNob3cgZWFjaCBvZiBpdHMgY2xhc3NlcyBpbiAzRCwgaW5cbiAgICogaXRzIGNvbG91ciwgb25jZSBwZXIgaW1hZ2UsIHVubGVzcyBjbGFzc2VzIGFyZSBzaG93biBhbHJlYWR5ICh0aGUgcmVnaW9uIGVkaXRvcidzIGNob2ljZVxuICAgKiBzdGFuZHMsIGFuZCBoaWRpbmcgdGhlbSBhbGwgc3RheXMgaGlkZGVuKS5cbiAgICovXG4gIHByaXZhdGUgc2hvd0RhdGFzZXRSZWdpb25TZXQzZCgpOiB2b2lkIHtcbiAgICBjb25zdCBzZXQgPSB0aGlzLmRhdGFzZXRSZWdpb25TZXQ7XG4gICAgaWYgKCFzZXQ/LnBsYW5lcyB8fCBzZXQuc2hvd24zZCB8fCAhc2V0Lmdyb3Vwcy5sZW5ndGgpIHJldHVybjtcbiAgICBpZiAoIWlzU3BhdGlhbE9taWNzM2QodGhpcy5jdXJyZW50UGxvdFR5cGUpIHx8IHRoaXMuY2xhc3NlczNkJC52YWx1ZS5sZW5ndGgpIHJldHVybjtcbiAgICBzZXQuc2hvd24zZCA9IHRydWU7XG4gICAgdGhpcy5zaG93UmVnaW9uQ2xhc3NlczNkKHNldC5ncm91cHMpLmNhdGNoKChlcnIpID0+XG4gICAgICBjb25zb2xlLndhcm4oJ1t2aXN1YWxpemVyXSB0aGUgY2VsbHMgY291bGQgbm90IGJlIHNob3duIGluIDNEJywgZXJyKSxcbiAgICApO1xuICB9XG5cbiAgLyoqIEVtcHR5IGV2ZXJ5IHNsaWNlIG9mIGEgc3RhY2sgKGl0cyByZWdpb25zIGFuZCB1bmRvIGhpc3RvcnkpIGZvciByZWdpb25zIGltcG9ydGVkIG92ZXIgaXQuICovXG4gIHByaXZhdGUgZW50ZXJJbXBvcnRlZFN0YWNrKGluZm86IElJbWFnZUluZm8pOiB2b2lkIHtcbiAgICBjb25zdCBsYXlvdXQgPSB0aGlzLnJlZ2lvblN0b3JlLmlzU3RhY2tNb2RlKClcbiAgICAgID8gdGhpcy5yZWdpb25TdG9yZS5nZXRTdGFja1NhdmVMYXlvdXQoKVxuICAgICAgOiBpbmZvLnRpbGVkID09PSBmYWxzZVxuICAgICAgICA/ICdwZXItc2xpY2UtZmlsZSdcbiAgICAgICAgOiAnY29tYmluZWQnO1xuICAgIHRoaXMucmVnaW9uU3RvcmUuZW50ZXJTdGFja01vZGUobmV3IE1hcCgpLCB0aGlzLnJlZ2lvblN0b3JlLmdldERpc3BsYXlTbGljZSgpLCBsYXlvdXQpO1xuICB9XG4gIGdldFJlZ2lvblNvdXJjZVZpZXckKCk6IE9ic2VydmFibGU8UmVnaW9uU291cmNlVmlldyB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25Tb3VyY2VWaWV3JCgpO1xuICB9XG4gIGdldFJlZ2lvblNvdXJjZUluZGV4KHF1ZXJ5OiBPbWl0PFJlZ2lvbkluZGV4UXVlcnksICdleGNsdWRlJz4pOiBQcm9taXNlPFJlZ2lvbkluZGV4UGFnZT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblNvdXJjZUluZGV4KHF1ZXJ5KTtcbiAgfVxuICBzZWxlY3RTb3VyY2VGZWF0dXJlcyhpZHM6IHJlYWRvbmx5IHN0cmluZ1tdLCBhZGRpdGl2ZT86IGJvb2xlYW4pOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuc2VsZWN0U291cmNlRmVhdHVyZXMoaWRzLCBhZGRpdGl2ZSk7XG4gIH1cbiAgZGVsZXRlU291cmNlRmVhdHVyZXMoaWRzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuZGVsZXRlU291cmNlRmVhdHVyZXMoaWRzKTtcbiAgfVxuICBnZXRSZWdpb25TdHlsZSQoKTogT2JzZXJ2YWJsZTxSZWdpb25TdHlsZT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvblN0eWxlJCgpO1xuICB9XG4gIHNldFJlZ2lvblN0eWxlKHBhdGNoOiBQYXJ0aWFsPFJlZ2lvblN0eWxlPik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uU3RvcmUuc2V0UmVnaW9uU3R5bGUocGF0Y2gpO1xuICB9XG4gIC8vIOKUgOKUgCBSZWdpb25zIGluIDNEOiB0aGVpciByZWNvbnN0cnVjdGlvbnMgc2hvd24gaW4gdGhlIHZvbHVtZSB2aWV3IOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBSZWNvbXB1dGUgd2hpY2ggM0QgdmlldyBpcyBvbiBzY3JlZW4gZm9yIGBwbG90VHlwZWAgKHNlZSB7QGxpbmsgdm9sdW1lVmlldyR9KS4gKi9cbiAgcHJpdmF0ZSB1cGRhdGVWb2x1bWVWaWV3KHBsb3RUeXBlOiBQbG90VHlwZSk6IHZvaWQge1xuICAgIHRoaXMuaW1hZ2VWb2x1bWVWaWV3ID0gaXNOYXBhcmlWb2x1bWUocGxvdFR5cGUpIHx8IGlzTmFwYXJpSXNvc3VyZmFjZShwbG90VHlwZSk7XG4gICAgLy8gVGhlIHNwYXRpYWwgY2xvdWQgcGxhY2VzIHRoZSBzdXJmYWNlcyBvZiBhIHN0YWNrJ3Mgc2xpY2VzLCBvciBvZiBhIHJlZ2lvbiBzZXQncyBwbGFuZXMuXG4gICAgY29uc3QgcGxhY2VkID0gISF0aGlzLnBsb3R0ZWRJbmZvPy5pc1N0YWNrIHx8ICEhdGhpcy5kYXRhc2V0UmVnaW9uU2V0Py5wbGFuZXM7XG4gICAgY29uc3QgcmVnaW9uczNkID0gdGhpcy5pbWFnZVZvbHVtZVZpZXcgfHwgKGlzU3BhdGlhbE9taWNzM2QocGxvdFR5cGUpICYmIHBsYWNlZCk7XG4gICAgLy8gRXZlcnkgcGxvdCwgYXMgYmVmb3JlOiB0aGUgUmVnaW9uIEVkaXRvciBkcm9wcyBpdHMgcGVyLWNsYXNzIHZvbHVtZXMgb24gZWFjaCAoYSBuZXcgaW1hZ2UpLlxuICAgIHRoaXMudm9sdW1lVmlldyQubmV4dChyZWdpb25zM2QpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYSBuYXBhcmkgdm9sdW1lIChvciBpc29zdXJmYWNlKSB2aWV3IGlzIG9uIHNjcmVlbjogcmVnaW9ucyBjYW4gYmUgc2hvd24gaW4gM0QuICovXG4gIGdldFZvbHVtZVZpZXckKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnZvbHVtZVZpZXckLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHZvbHVtZSB2aWV3J3Mgc2xpY2UgcGFuZSBpcyB3YW50ZWQgKGl0IHNob3dzIHdoaWxlIGEgdm9sdW1lIHZpZXcgaXMgb24gc2NyZWVuKS4gKi9cbiAgZ2V0U2xpY2VFZGl0b3IkKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnNsaWNlRWRpdG9yJC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIHRoZSB2b2x1bWUgdmlldyBkcmF3cyB0aGUgcmVnaW9uIHJlY29uc3RydWN0aW9ucyB0aHJvdWdoIHRoZSB2b2x1bWUuICovXG4gIGdldFJlZ2lvbnNUaHJvdWdoVm9sdW1lJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25zVGhyb3VnaFZvbHVtZSQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogRHJhdyB0aGUgcmVnaW9uIHJlY29uc3RydWN0aW9ucyB0aHJvdWdoIHRoZSB2b2x1bWUgKGl0IGhpZGVzIG5vbmUgb2YgdGhlbTogc3VyZmFjZXMgaW5zaWRlIGl0c1xuICAgKiBicmlnaHQgc3RydWN0dXJlcywgYW4gT0NUJ3MgbGF5ZXIgYm91bmRhcmllcykgb3IgaGlkZGVuIGJlaGluZCB3aGF0IGl0IHNob3dzICh0aGUgZGVmYXVsdCkuXG4gICAqL1xuICBzZXRSZWdpb25zVGhyb3VnaFZvbHVtZSh0aHJvdWdoOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVnaW9uc1Rocm91Z2hWb2x1bWUkLnZhbHVlID09PSB0aHJvdWdoKSByZXR1cm47XG4gICAgdGhpcy5yZWdpb25zVGhyb3VnaFZvbHVtZSQubmV4dCh0aHJvdWdoKTtcbiAgICB0aGlzLm5hcGFyaS5zZXRSZWdpb25zVGhyb3VnaFZvbHVtZSh0aHJvdWdoKTtcbiAgfVxuXG4gIC8qKiBUaGUgY2xhc3MgZ3JvdXBzIHNob3duIGluIDNEIG9uIHRoaXMgaW1hZ2UgKFtdIGFmdGVyIGEgc3dpdGNoIHRvIGFub3RoZXIgaW1hZ2UpLiAqL1xuICBnZXRSZWdpb25DbGFzc2VzM2QkKCk6IE9ic2VydmFibGU8UmVhZG9ubHlBcnJheTx7IGtleTogc3RyaW5nOyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSB9Pj4ge1xuICAgIHJldHVybiB0aGlzLmNsYXNzZXMzZCQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKiogSGlkZSBldmVyeSByZWdpb24gc3VyZmFjZSBhbmQgZm9yZ2V0IHRoZW0gKGEgYnVpbGQgc3RpbGwgcnVubmluZyBpcyBkcm9wcGVkKS4gKi9cbiAgcHJpdmF0ZSBjbGVhclJlZ2lvbkNsYXNzZXMzZCgpOiB2b2lkIHtcbiAgICB0aGlzLm1lc2hSZXF1ZXN0Kys7XG4gICAgdGhpcy5zaG93bjNkID0gW107XG4gICAgdGhpcy5jbGFzc2VzM2QkLm5leHQoW10pO1xuICAgIHRoaXMuY2xhc3NlczNkSW1hZ2UgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5uYXBhcmkuc2V0UmVnaW9uTWVzaGVzKFtdLCB1bmRlZmluZWQpO1xuICAgIHRoaXMubmFwYXJpLnNldFJlZ2lvbkhpZ2hsaWdodChbXSk7XG4gIH1cblxuICAvKiogSGlnaGxpZ2h0IHRoZSBzdXJmYWNlcyBvZiB0aGVzZSBncm91cCBrZXlzIGluIHRoZSB2b2x1bWUgdmlldyAobm9uZTogYWxsIGFzIHVzdWFsKS4gKi9cbiAgaGlnaGxpZ2h0UmVnaW9uQ2xhc3NlczNkKGtleXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5uYXBhcmkuc2V0UmVnaW9uSGlnaGxpZ2h0KGtleXMpO1xuICB9XG5cbiAgLyoqIEEgc3VyZmFjZSBjbGlja2VkIGluIHRoZSB2b2x1bWUgdmlldyB3aXRoIHRoZSBzZWxlY3Rpb24gdG9vbCAoaXRzIGdyb3VwIGtleSksIG9yIG5vbmUgKG51bGwpLiAqL1xuICBnZXRSZWdpb25QaWNrZWQzZCQoKTogT2JzZXJ2YWJsZTx7IGtleTogc3RyaW5nIHwgbnVsbDsgYWRkaXRpdmU6IGJvb2xlYW4gfT4ge1xuICAgIHJldHVybiB0aGlzLm5hcGFyaS5nZXRSZWdpb25NZXNoUGljayQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IHRoZXNlIGdyb3VwcyBvZiBjbGFzc2VzIGluIHRoZSB2b2x1bWUgdmlldyBhcyAzRCByZWNvbnN0cnVjdGlvbnMgKGVhY2ggZ3JvdXAgb25lIHN1cmZhY2VcbiAgICogaW4gaXRzIGNvbG91cjogYW4gYXRsYXMgc3RydWN0dXJlIHdpdGggaXRzIHN1YnN0cnVjdHVyZXMpLCBhbmQgb25seSB0aGVzZTsgW10gaGlkZXMgdGhlbS5cbiAgICogUmVjb25zdHJ1Y3RlZCBmcm9tIGV2ZXJ5IHNsaWNlJ3Mgb3V0bGluZXMgYXQgdGhlIHZvbHVtZSdzIHJlc29sdXRpb24sIGNhY2hlZCBwZXIgaW1hZ2UuXG4gICAqL1xuICBhc3luYyBzaG93UmVnaW9uQ2xhc3NlczNkKFxuICAgIGdyb3VwczogUmVhZG9ubHlBcnJheTx7IGtleTogc3RyaW5nOyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXTsgY29sb3I6IHN0cmluZzsgbGFiZWw/OiBzdHJpbmcgfT4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSArK3RoaXMubWVzaFJlcXVlc3Q7XG4gICAgdGhpcy5jbGFzc2VzM2RJbWFnZSA9IHRoaXMucGxvdHRlZEZpbGVOYW1lO1xuICAgIHRoaXMuc2hvd24zZCA9IGdyb3VwcztcbiAgICAvLyBXaGF0IGFuIGVkaXQgZnJvbSBub3cgb24gaXMgY29tcGFyZWQgd2l0aCAodGhlIGxpdmUgc2xpY2UgbWF5IG5vdCBoYXZlIGNoYW5nZWQgeWV0KS5cbiAgICB0aGlzLmxpdmVDbGFzc2VzID0gbnVsbDtcbiAgICB0aGlzLnRyYWNrTGl2ZUNsYXNzZXMoKTtcbiAgICB0aGlzLmNsYXNzZXMzZCQubmV4dChncm91cHMubWFwKChnKSA9PiAoeyBrZXk6IGcua2V5LCBjbGFzc2VzOiBnLmNsYXNzZXMgfSkpKTtcbiAgICBjb25zdCB3aWR0aCA9IHRoaXMuZ2V0VHJ1ZUltYWdlU2l6ZSgpPy53aWR0aCA/PyAxMDI0O1xuICAgIGNvbnN0IHN0ZXAgPSB0aGlzLm5hcGFyaS5yZWdpb25Wb3hlbFN0ZXAoKSA/PyBNYXRoLm1heCgxLCB3aWR0aCAvIDI1Nik7XG4gICAgY29uc3QgaW1hZ2UgPSB0aGlzLnBsb3R0ZWRGaWxlTmFtZSA/PyAnJztcbiAgICBjb25zdCBjYWNoZUtleSA9IChnOiB7IGNsYXNzZXM6IHJlYWRvbmx5IHN0cmluZ1tdIH0pID0+IGAke2ltYWdlfXwke3N0ZXAudG9GaXhlZCgzKX18JHtnLmNsYXNzZXMuam9pbignLCcpfWA7XG4gICAgLy8gQSBncm91cCBvZiBjbGFzc2VzIGRyYXduIGFzIGluZGl2aWR1YWwgY2VsbHMgaGFzIG5vIG1lcmdlZCBzdXJmYWNlIChpdHMgY2VsbHMgYXJlIGRyYXduKS5cbiAgICBjb25zdCBpbmRpdmlkdWFsID0gdGhpcy5pbmRpdmlkdWFsM2QkLnZhbHVlO1xuICAgIGNvbnN0IG1lcmdlZCA9IGdyb3Vwcy5maWx0ZXIoKGcpID0+ICFnLmNsYXNzZXMubGVuZ3RoIHx8ICFnLmNsYXNzZXMuZXZlcnkoKGMpID0+IGluZGl2aWR1YWwuaGFzKGMpKSk7XG4gICAgY29uc3QgbWlzc2luZyA9IG1lcmdlZC5maWx0ZXIoKGcpID0+ICF0aGlzLm1lc2hDYWNoZS5oYXMoY2FjaGVLZXkoZykpKTtcbiAgICBpZiAobWlzc2luZy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IG5hbWVzID0gbWlzc2luZy5tYXAoKGcpID0+IGcua2V5KTtcbiAgICAgIGNvbnN0IHdoYXQgPSBuYW1lcy5sZW5ndGggPiAzID8gYCR7bmFtZXMubGVuZ3RofSByZWdpb25zYCA6IG5hbWVzLmpvaW4oJywgJyk7XG4gICAgICBjb25zdCBkb25lID0gdGhpcy5uYXBhcmkuYmVnaW5UYXNrKGBCdWlsZGluZyAke3doYXR9IGluIDNE4oCmYCk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBidWlsdCA9IGF3YWl0IHRoaXMucmVnaW9uU3RvcmUucmVjb25zdHJ1Y3RDbGFzc2VzKFxuICAgICAgICAgIG1pc3NpbmcubWFwKChnKSA9PiAoeyBrZXk6IGNhY2hlS2V5KGcpLCBjbGFzc2VzOiBnLmNsYXNzZXMgfSkpLFxuICAgICAgICAgIHN0ZXAsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGNsYXNzZXNPZiA9IG5ldyBNYXAobWlzc2luZy5tYXAoKGcpID0+IFtjYWNoZUtleShnKSwgZy5jbGFzc2VzXSkpO1xuICAgICAgICBmb3IgKGNvbnN0IGIgb2YgYnVpbHQpIHRoaXMubWVzaENhY2hlLnNldChiLmtleSwgeyBtZXNoOiBiLm1lc2gsIGNsYXNzZXM6IGNsYXNzZXNPZi5nZXQoYi5rZXkpID8/IFtdIH0pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVxdWVzdCAhPT0gdGhpcy5tZXNoUmVxdWVzdCkgcmV0dXJuO1xuICAgIHRoaXMubmFwYXJpLnNldFJlZ2lvbk1lc2hlcyhcbiAgICAgIG1lcmdlZC5tYXAoKGcpID0+IHtcbiAgICAgICAgY29uc3QgbWVzaCA9IHRoaXMubWVzaENhY2hlLmdldChjYWNoZUtleShnKSkhLm1lc2g7XG4gICAgICAgIHJldHVybiB7IGtleTogZy5rZXksIGNvbG9yOiBnLmNvbG9yLCBsYWJlbDogZy5sYWJlbCwgdmVydGljZXM6IG1lc2gudmVydGljZXMsIGZhY2VzOiBtZXNoLmZhY2VzIH07XG4gICAgICB9KSxcbiAgICAgIHRoaXMucGxvdHRlZEZpbGVOYW1lLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlZ2lvbnMgY2hhbmdlZDogd2hlbiB0aGUgbGl2ZSBzbGljZSdzIHJlZ2lvbnMgb2Ygc29tZSBjbGFzc2VzIGRpZCAoYW4gZWRpdCwgYW4gdW5kbywgbm90XG4gICAqIGEgc2xpY2Ugb3IgaW1hZ2Ugc3dpdGNoKSwgdGhlaXIgcmVjb25zdHJ1Y3Rpb25zIGFyZSBzdGFsZS4gVGhleSBhcmUgZHJvcHBlZCwgYW5kIHRob3NlIHNob3duXG4gICAqIGluIDNEIGFyZSByZWJ1aWx0IG9uY2UgdGhlIGVkaXRzIHBhdXNlLlxuICAgKi9cbiAgcHJpdmF0ZSBvblJlZ2lvbnNDaGFuZ2VkKCk6IHZvaWQge1xuICAgIC8vIE5vdGhpbmcgZm9sbG93cyB0aGUgZWRpdHMgKG5vIHN1cmZhY2UgYnVpbHQgb3Igc2hvd24sIG5vIHNlY3Rpb25zKTogc2tpcCB0aGUgZmluZ2VycHJpbnRzLlxuICAgIGlmICghdGhpcy5zbGljZU1vdW50ZWQgJiYgIXRoaXMuc2hvd24zZC5sZW5ndGggJiYgIXRoaXMubWVzaENhY2hlLnNpemUpIHtcbiAgICAgIHRoaXMubGl2ZUNsYXNzZXMgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBiZWZvcmUgPSB0aGlzLmxpdmVDbGFzc2VzO1xuICAgIHRoaXMubGl2ZUNsYXNzZXMgPSBudWxsO1xuICAgIGNvbnN0IG5vdyA9IHRoaXMudHJhY2tMaXZlQ2xhc3NlcygpO1xuICAgIC8vIEFub3RoZXIgc2xpY2Ugb3IgaW1hZ2UgY2FtZSB1cDogbm8gcmVnaW9uIGNoYW5nZWQgKHRoZSBzZWN0aW9ucyByZWN1dCBmb3IgdGhlIHNsaWNlKS5cbiAgICBpZiAoIWJlZm9yZSB8fCBiZWZvcmUuYXQgIT09IG5vdy5hdCkgcmV0dXJuO1xuICAgIGNvbnN0IGNoYW5nZWQgPSBjaGFuZ2VkQ2xhc3NlcyhiZWZvcmUuc2lnbmF0dXJlcywgbm93LnNpZ25hdHVyZXMpO1xuICAgIC8vIFNvdXJjZSBmZWF0dXJlcyBkZWxldGVkIChvciB0aGF0IHVuZG9uZSkgY2hhbmdlIG5vIGxpdmUgcmVnaW9uLCBhbmQgd2hpY2ggY2xhc3NlcyB0aGV5IHdlcmVcbiAgICAvLyBpcyBub3Qga25vd24gaGVyZTogZXZlcnkgY2xhc3MgaXMgc3RhbGUuIEEgZmVhdHVyZSB0YWtlbiBzaG93cyBhcyBpdHMgY2xhc3MncyBjaGFuZ2UuXG4gICAgY29uc3QgZXZlcnlDbGFzcyA9ICFjaGFuZ2VkLnNpemUgJiYgYmVmb3JlLnNvdXJjZXMgIT09IG5vdy5zb3VyY2VzO1xuICAgIGlmICghY2hhbmdlZC5zaXplICYmICFldmVyeUNsYXNzKSByZXR1cm47XG4gICAgY29uc3QgdG91Y2hlZCA9IChjOiBzdHJpbmcpID0+IGV2ZXJ5Q2xhc3MgfHwgY2hhbmdlZC5oYXMoYyk7XG4gICAgaWYgKHRoaXMuc2xpY2VNb3VudGVkKSB0aGlzLnNlY3Rpb25zLnJlZ2lvbnNDaGFuZ2VkKCk7XG4gICAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgWy4uLnRoaXMubWVzaENhY2hlXSkge1xuICAgICAgaWYgKGVudHJ5LmNsYXNzZXMuc29tZSh0b3VjaGVkKSkgdGhpcy5tZXNoQ2FjaGUuZGVsZXRlKGtleSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5zaG93bjNkLnNvbWUoKGcpID0+IGcuY2xhc3Nlcy5zb21lKHRvdWNoZWQpKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLnJlYnVpbGRUaW1lcikgY2xlYXJUaW1lb3V0KHRoaXMucmVidWlsZFRpbWVyKTtcbiAgICB0aGlzLnJlYnVpbGRUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5yZWJ1aWxkVGltZXIgPSBudWxsO1xuICAgICAgaWYgKHRoaXMuc2hvd24zZC5sZW5ndGggJiYgdGhpcy5jbGFzc2VzM2RJbWFnZSA9PT0gdGhpcy5wbG90dGVkRmlsZU5hbWUpIHtcbiAgICAgICAgdm9pZCB0aGlzLnNob3dSZWdpb25DbGFzc2VzM2QodGhpcy5zaG93bjNkKTtcbiAgICAgIH1cbiAgICB9LCBSRUdJT05fU1VSRkFDRV9SRUJVSUxEX01TKTtcbiAgfVxuXG4gIC8qKiBGaW5nZXJwcmludCB0aGUgbGl2ZSBzbGljZSdzIGNsYXNzZXMsIHVubGVzcyBhbHJlYWR5OiB3aGF0IHRoZSBuZXh0IGVkaXQgaXMgY29tcGFyZWQgd2l0aC4gKi9cbiAgcHJpdmF0ZSB0cmFja0xpdmVDbGFzc2VzKCk6IHsgYXQ6IHN0cmluZzsgc2lnbmF0dXJlczogTWFwPHN0cmluZywgbnVtYmVyPjsgc291cmNlczogc3RyaW5nIH0ge1xuICAgIHRoaXMubGl2ZUNsYXNzZXMgPz89IHtcbiAgICAgIGF0OiB0aGlzLmxpdmVTbGljZUtleSgpLFxuICAgICAgc2lnbmF0dXJlczogY2xhc3NTaWduYXR1cmVzKHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9ucygpKSxcbiAgICAgIHNvdXJjZXM6IHRoaXMucmVnaW9uU3RvcmUuZ2V0U291cmNlU3RhdGVLZXkoKSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmxpdmVDbGFzc2VzO1xuICB9XG5cbiAgLyoqIFdoaWNoIHNsaWNlIG9mIHdoaWNoIGltYWdlIHRoZSBsaXZlIHJlZ2lvbnMgYXJlLiAqL1xuICBwcml2YXRlIGxpdmVTbGljZUtleSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLnJlZ2lvblN0b3JlLmdldERpc3BsYXlTbGljZSgpfVxcbiR7dGhpcy5wbG90dGVkRmlsZU5hbWUgPz8gJyd9YDtcbiAgfVxuXG4gIC8qKiBFYWNoIGNsYXNzJ3Mgdm9sdW1lIG92ZXIgdGhlIHdob2xlIHN0YWNrLCBpbiBweMKyIMOXIHNsaWNlcyAoc2VlIFJlZ2lvblN0b3JlLmNsYXNzVm9sdW1lcykuICovXG4gIGFzeW5jIGdldENsYXNzVm9sdW1lcyhjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4ge1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoYXdhaXQgdGhpcy5yZWdpb25TdG9yZS5jbGFzc1ZvbHVtZXMoY2xhc3NlcykpO1xuICB9XG5cbiAgZ2V0UmVnaW9uU291cmNlQ2xhc3NDb3VudHMoc3RhY2s/OiBib29sZWFuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuZ2V0UmVnaW9uU291cmNlQ2xhc3NDb3VudHMoc3RhY2spO1xuICB9XG4gIGdldEhpZGRlbkNsYXNzZXMkKCk6IE9ic2VydmFibGU8UmVhZG9ubHlTZXQ8c3RyaW5nPj4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldEhpZGRlbkNsYXNzZXMkKCk7XG4gIH1cbiAgc2V0Q2xhc3Nlc0hpZGRlbihjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXSwgaGlkZGVuOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5zZXRDbGFzc2VzSGlkZGVuKGNsYXNzZXMsIGhpZGRlbik7XG4gICAgLy8gQSBzdXJmYWNlIGlzIGl0cyBjbGFzcydzIChpdHMgZ3JvdXAga2V5IGlzIHRoZSBjbGFzcyBuYW1lKS5cbiAgICB0aGlzLm5hcGFyaS5zZXRSZWdpb25IaWRkZW4oWy4uLnRoaXMucmVnaW9uU3RvcmUuZ2V0SGlkZGVuQ2xhc3NlcygpXSk7XG4gICAgdGhpcy5zZWN0aW9ucy5zY2hlZHVsZSgpO1xuICB9XG4gIGFzeW5jIHNlbGVjdFJlZ2lvbkNsYXNzZXMoY2xhc3NlczogcmVhZG9ubHkgc3RyaW5nW10sIGFkZGl0aXZlPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucmVnaW9uU3RvcmUuc2VsZWN0Q2xhc3NlcyhjbGFzc2VzLCBhZGRpdGl2ZSk7XG4gIH1cbiAgZ2V0UGlja2VkUmVnaW9uQ2xhc3NlcyQoKTogT2JzZXJ2YWJsZTxyZWFkb25seSBzdHJpbmdbXT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFBpY2tlZENsYXNzZXMkKCk7XG4gIH1cbiAgZ2V0R2VvSnNvblN0cmluZ1dpdGhTb3VyY2UocmVnaW9uczogUmVnaW9uW10sIHNsaWNlPzogbnVtYmVyKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRHZW9Kc29uV2l0aFNvdXJjZShyZWdpb25zLCBzbGljZSk7XG4gIH1cblxuICAvLyDilIDilIAgUGVyLXNsaWNlIHotc3RhY2sgcmVnaW9ucyAoaml0LXVpIzkzKSwgZnJvbSB0aGUgc2hhcmVkIFJlZ2lvblN0b3JlLiDilIDilIBcbiAgZW50ZXJTdGFja01vZGUoXG4gICAgc2xpY2VzOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4sXG4gICAgaW5pdGlhbFo/OiBudW1iZXIsXG4gICAgc2F2ZUxheW91dD86ICdjb21iaW5lZCcgfCAncGVyLXNsaWNlLWZpbGUnLFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLmVudGVyU3RhY2tNb2RlKHNsaWNlcywgaW5pdGlhbFosIHNhdmVMYXlvdXQpO1xuICB9XG4gIGV4aXRTdGFja01vZGUoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25TdG9yZS5leGl0U3RhY2tNb2RlKCk7XG4gIH1cbiAgaXNTdGFja01vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucmVnaW9uU3RvcmUuaXNTdGFja01vZGUoKTtcbiAgfVxuICAvKiogVGhlIHNsaWNlIHRoZSByZWdpb25zIGFyZSBzaG93biBmb3IgKHJlY29yZGVkIG91dHNpZGUgc3RhY2sgbW9kZSB0b28pLiAqL1xuICBnZXREaXNwbGF5U2xpY2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXREaXNwbGF5U2xpY2UoKTtcbiAgfVxuICBnZXRTdGFja1NhdmVMYXlvdXQoKTogJ2NvbWJpbmVkJyB8ICdwZXItc2xpY2UtZmlsZScge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFN0YWNrU2F2ZUxheW91dCgpO1xuICB9XG4gIHNldERpc3BsYXlTbGljZSh6OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvblN0b3JlLnNldERpc3BsYXlTbGljZSh6KTtcbiAgfVxuICBnZXRTbGljZVJlZ2lvbnMoKTogUmVnaW9uW10ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFNsaWNlUmVnaW9ucygpO1xuICB9XG4gIGdldFN0YWNrU2F2ZVNsaWNlcygpOiBNYXA8bnVtYmVyLCBSZWdpb25bXT4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvblN0b3JlLmdldFN0YWNrU2F2ZVNsaWNlcygpO1xuICB9XG4gIC8qKiBBbGwgc2xpY2VzJyBBTk5PVEFUSU9OIHJlZ2lvbnMgZm9yIGEgei1zdGFjayBzYXZlIChqaXQtdWkjOTMpLCBlYWNoIHRhZ2dlZFxuICAgKiAgd2l0aCBpdHMgemVyby1iYXNlZCBSZWdpb24uejsgcHJvZmlsZSBsaW5lcyBleGNsdWRlZC4gRmxhdCBhbm5vdGF0aW9uIHNldFxuICAgKiAgb3V0c2lkZSBzdGFjayBtb2RlLiAqL1xuICBnZXRTbGljZUFubm90YXRpb25SZWdpb25zKCk6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRTbGljZVJlZ2lvbnMoKS5maWx0ZXIoKHIpID0+ICFpc1Byb2ZpbGVSZWdpb24ocikpO1xuICB9XG4gIC8qKiBQZXItc2xpY2UgYW5ub3RhdGlvbiByZWdpb25zIHRvIHdyaXRlIG9uIGEgZm9sZGVyLXN0YWNrIHNhdmUgKGppdC11aSM5Myk6XG4gICAqICBzbGljZSBpbmRleCDihpIgdGhhdCBzbGljZSdzIGFubm90YXRpb24gcmVnaW9ucyAocHJvZmlsZSBsaW5lcyBleGNsdWRlZCksXG4gICAqICBpbmNsdWRpbmcgbm93LWVtcHR5IHNsaWNlcyB0aGF0IHdlcmUgbG9hZGVkIG5vbi1lbXB0eSAoc28gdGhleSBvdmVyd3JpdGUpLiAqL1xuICBnZXRTdGFja1NhdmVBbm5vdGF0aW9uU2xpY2VzKCk6IE1hcDxudW1iZXIsIFJlZ2lvbltdPiB7XG4gICAgY29uc3Qgb3V0ID0gbmV3IE1hcDxudW1iZXIsIFJlZ2lvbltdPigpO1xuICAgIGZvciAoY29uc3QgW3osIHJlZ3NdIG9mIHRoaXMucmVnaW9uU3RvcmUuZ2V0U3RhY2tTYXZlU2xpY2VzKCkpIHtcbiAgICAgIG91dC5zZXQoXG4gICAgICAgIHosXG4gICAgICAgIHJlZ3MuZmlsdGVyKChyKSA9PiAhaXNQcm9maWxlUmVnaW9uKHIpKSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvKiogQXV0aG9yaXRhdGl2ZSBmdWxsLXJlc29sdXRpb24gaW1hZ2Ugc2l6ZSBmb3IgbWFzayBleHBvcnQuIFByZWZlcnMgdGhlXG4gICAqICBhY3RpdmUgcmVuZGVyZXIncyByZXBvcnRlZCBzaXplLCBmYWxsaW5nIGJhY2sgdG8gdGhlIGltYWdlIG1ldGFkYXRhICh4L3lcbiAgICogIGFyZSB0aGUgZnVsbC1yZXMgcGl4ZWwgZGltZW5zaW9ucyB1c2VkIGFjcm9zcyB0aGUgYXBwKS4gUmVqZWN0cyBub24tZmluaXRlXG4gICAqICBvciBub24tcG9zaXRpdmUgc2l6ZXMg4oCUIHRoZSBQbG90bHkgYm91bmRzIGNhbiB5aWVsZCBOYU4gYmVmb3JlIGEgcGxvdCBpc1xuICAgKiAgZnVsbHkgbGFpZCBvdXQsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBjcmFzaCBtYXNrIGNyZWF0aW9uLiAqL1xuICBnZXRNYXNrSW1hZ2VTaXplKCk6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwge1xuICAgIGNvbnN0IHZhbGlkID0gKHM6IHsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXIgfSB8IG51bGwgfCB1bmRlZmluZWQpID0+XG4gICAgICBzICYmIE51bWJlci5pc0Zpbml0ZShzLndpZHRoKSAmJiBOdW1iZXIuaXNGaW5pdGUocy5oZWlnaHQpICYmIHMud2lkdGggPj0gMSAmJiBzLmhlaWdodCA+PSAxXG4gICAgICAgID8geyB3aWR0aDogTWF0aC5yb3VuZChzLndpZHRoKSwgaGVpZ2h0OiBNYXRoLnJvdW5kKHMuaGVpZ2h0KSB9XG4gICAgICAgIDogbnVsbDtcblxuICAgIGNvbnN0IGZyb21SZW5kZXJlciA9IHZhbGlkKHRoaXMuZ2V0VHJ1ZUltYWdlU2l6ZSgpKTtcbiAgICBpZiAoZnJvbVJlbmRlcmVyKSByZXR1cm4gZnJvbVJlbmRlcmVyO1xuXG4gICAgbGV0IG1ldGE6IElJbWFnZU1ldGFkYXRhW10gPSBbXTtcbiAgICB0aGlzLmdldEltYWdlTWV0YSgpXG4gICAgICAuc3Vic2NyaWJlKChtKSA9PiAobWV0YSA9IG0pKVxuICAgICAgLnVuc3Vic2NyaWJlKCk7XG4gICAgY29uc3QgbTAgPSBtZXRhPy5bMF07XG4gICAgcmV0dXJuIG0wID8gdmFsaWQoeyB3aWR0aDogbTAueCwgaGVpZ2h0OiBtMC55IH0pIDogbnVsbDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBJUmVnaW9uRWRpdG9yQXBpOiBhbm5vdGF0aW9uLW9ubHkgc3VyZmFjZSBmb3IgdGhlIFJlZ2lvbiBFZGl0b3Ig4pSA4pSA4pSAXG4gIC8vIEludGVuc2l0eS1wcm9maWxlIGxpbmVzIChraW5kPSdwcm9maWxlJykgYmVsb25nIHRvIHRoZSBpbnRlbnNpdHkgdG9vbCwgbm90XG4gIC8vIHRoZSBlZGl0b3IuIFRoZXNlIG1ldGhvZHMgZ2l2ZSBleHRlcm5hbCBjb25zdW1lcnMgYW4gYW5ub3RhdGlvbi1vbmx5IHZpZXdcbiAgLy8gYW5kIGd1YXJhbnRlZSBwcm9maWxlIGxpbmVzIGFyZSBwcmVzZXJ2ZWQuIFRoZSB3cml0ZXMgbGFuZCBpbiB0aGUgc3RvcmUgbGlrZVxuICAvLyBhbnkgb3RoZXIsIGFuZCBldmVyeSBiYWNrZW5kIHJlZHJhd3MgZnJvbSBpdHMgZXZlbnRzLlxuXG4gIGdldEFubm90YXRpb25SZWdpb25zKCk6IFJlZ2lvbltdIHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCkuZmlsdGVyKChyKSA9PiAhaXNQcm9maWxlUmVnaW9uKHIpKTtcbiAgfVxuICBzZXRBbm5vdGF0aW9uUmVnaW9ucyhcbiAgICByZWdpb25zOiBSZWdpb25bXSxcbiAgICBzaG93UmVnaW9uTGFiZWw/OiBib29sZWFuLFxuICAgIGlzUmVnaW9uU2F2ZU9uPzogYm9vbGVhbixcbiAgICBmaWxsQ29sb3I/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIC8vIFJlLWFwcGVuZCB0aGUgc3RvcmUncyBwcm9maWxlIGxpbmVzIHNvIGFuIGVkaXRvciBzYXZlL2RlbGV0ZSBjYW4ndCBkcm9wIHRoZW0uXG4gICAgY29uc3QgcHJvZmlsZXMgPSB0aGlzLnJlZ2lvblN0b3JlLmdldFJlZ2lvbnMoKS5maWx0ZXIoKHIpID0+IGlzUHJvZmlsZVJlZ2lvbihyKSk7XG4gICAgY29uc3QgYW5ub3RhdGlvbnMgPSAocmVnaW9ucyB8fCBbXSkuZmlsdGVyKChyKSA9PiAhaXNQcm9maWxlUmVnaW9uKHIpKTtcbiAgICB0aGlzLnNldFJlZ2lvbnMoWy4uLmFubm90YXRpb25zLCAuLi5wcm9maWxlc10sIHNob3dSZWdpb25MYWJlbCwgaXNSZWdpb25TYXZlT24sIGZpbGxDb2xvciwgZmFsc2UpO1xuICB9XG4gIGdldFNlbGVjdGVkUmVnaW9ucyQoKTogT2JzZXJ2YWJsZTxSZWdpb25bXT4ge1xuICAgIC8vIE1hcCB0aGUgaW50ZXJuYWwgaW5kZXgtYmFzZWQgc2VsZWN0aW9uIHRvIHRoZSBzZWxlY3RlZCBhbm5vdGF0aW9uIHJlZ2lvbnMuXG4gICAgcmV0dXJuIHRoaXMuZ2V0U2VsZWN0ZWRTaGFwZUluZGljZXMkKCkucGlwZShcbiAgICAgIG1hcCgoaWR4cykgPT4ge1xuICAgICAgICBjb25zdCByZWdzID0gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCk7XG4gICAgICAgIHJldHVybiBpZHhzLm1hcCgoaSkgPT4gcmVnc1tpXSkuZmlsdGVyKChyKTogciBpcyBSZWdpb24gPT4gISFyICYmICFpc1Byb2ZpbGVSZWdpb24ocikpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuICBzZXRTZWxlY3RlZFJlZ2lvbnMocmVnaW9uczogUmVnaW9uW10pOiB2b2lkIHtcbiAgICBjb25zdCByZWdzID0gdGhpcy5yZWdpb25TdG9yZS5nZXRSZWdpb25zKCk7XG4gICAgY29uc3QgaW5kaWNlcyA9IChyZWdpb25zIHx8IFtdKS5tYXAoKHIpID0+IHJlZ3MuZmluZEluZGV4KCh4KSA9PiB4LmlkID09PSByLmlkKSkuZmlsdGVyKChpKSA9PiBpID49IDApO1xuICAgIHRoaXMuc2V0U2VsZWN0ZWRTaGFwZUluZGljZXMoaW5kaWNlcyk7XG4gIH1cblxuICAvLyDilIDilIAgdG9vbHMg4oaSIGFjdGl2ZSByZW5kZXJlciAocnVuIG9uIGVpdGhlciBiYWNrZW5kKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8gVGhlIHdhbmQsIHZlcnRleCBlcmFzZXIgYW5kIHpvb20tdG8tYm94IGFyZSBpbXBsZW1lbnRlZCBvbiBib3RoIGJhY2tlbmRzXG4gIC8vIHZpYSBJQ29vcmRpbmF0ZVRyYW5zZm9ybSAoKyBhIHZpZXdwb3J0IHBpeGVsIHJlYWRiYWNrIGZvciB0aGUgd2FuZCksIHNvIHRoZXlcbiAgLy8gZm9sbG93IHRoZSBhY3RpdmUgcmVuZGVyZXIg4oCUIHRoZSBzbGljZSBwYW5lJ3Mgd2hpbGUgdGhlIHZvbHVtZSB2aWV3IGlzIHNwbGl0LlxuICBzZXRBY3RpdmVUb29sKGlkOiBzdHJpbmcgfCBudWxsLCBvcHRpb25zPzogQ2FudmFzVG9vbE9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRBY3RpdmVUb29sKGlkLCBvcHRpb25zKTtcbiAgfVxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBzZXRBY3RpdmVUb29sfS4gKi9cbiAgc2V0V2FuZE1vZGUoYWN0aXZlOiBib29sZWFuLCBvcHRpb25zPzogSVdhbmRPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuc2V0V2FuZE1vZGUoYWN0aXZlLCBvcHRpb25zKTtcbiAgfVxuICBzZXRXYW5kT3B0aW9ucyhvcHRpb25zOiBJV2FuZE9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRXYW5kT3B0aW9ucyhvcHRpb25zKTtcbiAgfVxuICBjbGVhckFjdGl2ZVdhbmRSZWdpb24oKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuY2xlYXJBY3RpdmVXYW5kUmVnaW9uKCk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2V0QWN0aXZlVG9vbH0uICovXG4gIHNldEJydXNoTW9kZShhY3RpdmU6IGJvb2xlYW4sIG9wdGlvbnM/OiBJQnJ1c2hPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuc2V0QnJ1c2hNb2RlKGFjdGl2ZSwgb3B0aW9ucyk7XG4gIH1cbiAgc2V0QnJ1c2hPcHRpb25zKG9wdGlvbnM6IElCcnVzaE9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRCcnVzaE9wdGlvbnMob3B0aW9ucyk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2V0QWN0aXZlVG9vbH0uICovXG4gIHNldFZlcnRleEVyYXNlck1vZGUoYWN0aXZlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuc2V0VmVydGV4RXJhc2VyTW9kZShhY3RpdmUpO1xuICB9XG4gIHNldFZlcnRleEVyYXNlclJhZGl1cyhyYWRpdXM6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLnNldFZlcnRleEVyYXNlclJhZGl1cyhyYWRpdXMpO1xuICB9XG4gIC8qKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNldEFjdGl2ZVRvb2x9LiAqL1xuICBzZXRab29tVG9Cb3hNb2RlKGFjdGl2ZTogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMucmVnaW9uQmFja2VuZCgpLnNldFpvb21Ub0JveE1vZGUoYWN0aXZlKTtcbiAgfVxuICBzZWdtZW50UmVjdGFuZ2xlcygpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZWdtZW50UmVjdGFuZ2xlcygpO1xuICB9XG4gIHNlZ21lbnRSZWN0YW5nbGVzQ2VsbHBvc2UoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5yZWdpb25CYWNrZW5kKCkuc2VnbWVudFJlY3RhbmdsZXNDZWxscG9zZSgpO1xuICB9XG4gIHNldFNhbU1vZGVsKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRTYW1Nb2RlbChpZCk7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2V0QWN0aXZlVG9vbH0uICovXG4gIHNldFNhbVBvaW50TW9kZShhY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lvbkJhY2tlbmQoKS5zZXRTYW1Qb2ludE1vZGUoYWN0aXZlKTtcbiAgfVxuICBjb21taXRTYW1Qb2ludHMoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuY29tbWl0U2FtUG9pbnRzKCk7XG4gIH1cbiAgY2xlYXJTYW1Qb2ludHMoKTogdm9pZCB7XG4gICAgdGhpcy5yZWdpb25CYWNrZW5kKCkuY2xlYXJTYW1Qb2ludHMoKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBkaXNwbGF5IG9wdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIFN0YXRlIGxpdmVzIGluIHRoZSBzaGFyZWQgVmlzdWFsaXplclN0b3JlIOKAlCByZWFkcyBnbyBzdHJhaWdodCB0byBpdC5cbiAgLy8gVGhlIHR3byBTRVRURVJTIHN0aWxsIHJvdXRlIHRocm91Z2ggUGxvdGx5IGJlY2F1c2UgaXRzIGltcGxlbWVudGF0aW9uc1xuICAvLyBjYXJyeSByZW5kZXIgZ2x1ZSBiZXlvbmQgdGhlIHN0b3JlIHdyaXRlIChhIGxpdmUgUGxvdGx5LnJlc3R5bGUgb2ZcbiAgLy8gY29sb3JzY2FsZS9yZXZlcnNlc2NhbGUgb24gdGhlIG1vdW50ZWQgaGVhdG1hcCk7IE9TRCByZWNvbG9ycyB2aWEgaXRzIG93blxuICAvLyBzdG9yZSBzdWJzY3JpcHRpb24gZWl0aGVyIHdheS5cbiAgZ2V0Q29sb3JtYXAoKTogT2JzZXJ2YWJsZTxDb2xvcm1hcE5vZGUgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXAoKTtcbiAgfVxuICBzZXRDb2xvcm1hcChjb2xvcm1hcDogQ29sb3JtYXBOb2RlKTogdm9pZCB7XG4gICAgdGhpcy5wbG90bHkuc2V0Q29sb3JtYXAoY29sb3JtYXApO1xuICB9XG4gIGdldENvbG9ybWFwT3B0aW9ucygpOiBDb2xvcm1hcE5vZGVbXSB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmUuZ2V0Q29sb3JtYXBPcHRpb25zKCk7XG4gIH1cbiAgZ2V0UmV2ZXJzZVNjYWxlKCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldFJldmVyc2VTY2FsZSgpO1xuICB9XG4gIHNldFJldmVyc2VTY2FsZShyZXZlcnNlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5wbG90bHkuc2V0UmV2ZXJzZVNjYWxlKHJldmVyc2UpO1xuICB9XG4gIHNldEltYWdlTWV0YShpbWFnZU1ldGE6IElJbWFnZU1ldGFkYXRhW10sIGltYWdlS2V5Pzogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zdG9yZS5zZXRJbWFnZU1ldGEoaW1hZ2VNZXRhLCBpbWFnZUtleSk7XG4gIH1cbiAgZ2V0SW1hZ2VNZXRhKCk6IE9ic2VydmFibGU8SUltYWdlTWV0YWRhdGFbXT4ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlLmdldEltYWdlTWV0YSgpO1xuICB9XG5cbiAgLy8g4pSA4pSAIElDaGFubmVsSGlzdG9ncmFtQXBpOiBDaGFubmVscyAmIEhpc3RvZ3JhbSBwYW5lIHN1cmZhY2Ug4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIC8vIENoYW5uZWwvZ3JheXNjYWxlL2ludmVydCBzdGF0ZSBsaXZlcyBpbiB0aGUgc2hhcmVkIFZpc3VhbGl6ZXJTdG9yZTsgYm90aFxuICAvLyBiYWNrZW5kcyBzdWJzY3JpYmUgYW5kIHJlY29sb3IgbGl2ZSwgc28gc2V0dGVycyBqdXN0IHdyaXRlIHRoZSBzdG9yZS4gVGhlXG4gIC8vIGhpc3RvZ3JhbSBjb21lcyBmcm9tIHdoaWNoZXZlciBiYWNrZW5kIGlzIG9uIHNjcmVlbiAoaXRzIG5hdGl2ZSBwaXhlbHMpLlxuICBnZXRIaXN0b2dyYW0oY2hhbm5lbEluZGV4OiBudW1iZXIsIGJpbnM6IG51bWJlcik6IElIaXN0b2dyYW0gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldEhpc3RvZ3JhbShjaGFubmVsSW5kZXgsIGJpbnMpO1xuICB9XG4gIGdldEhpc3RvZ3JhbSQoY2hhbm5lbEluZGV4OiBudW1iZXIsIGJpbnM6IG51bWJlcik6IE9ic2VydmFibGU8SUhpc3RvZ3JhbSB8IG51bGw+IHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlcigpLmdldEhpc3RvZ3JhbSQoY2hhbm5lbEluZGV4LCBiaW5zKTtcbiAgfVxuICAvKiogRXhwb3J0IHRoZSB1bmRlcmx5aW5nIGRhdGEgKDE2LWJpdCBtdWx0aS1iYW5kIFRJRkYpIHZpYSB0aGUgYWN0aXZlIGJhY2tlbmQuICovXG4gIGV4cG9ydERhdGEoKTogdm9pZCB7XG4gICAgdGhpcy5yZW5kZXJlcigpLmV4cG9ydERhdGEoKTtcbiAgfVxuICBnZXRDaGFubmVscyQoKTogT2JzZXJ2YWJsZTxJQ2hhbm5lbFN0YXRlW10+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRDaGFubmVsU3RhdGVzKCk7XG4gIH1cbiAgc2V0U2VsZWN0ZWRDaGFubmVsKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnNldFNlbGVjdGVkQ2hhbm5lbChpbmRleCk7XG4gIH1cbiAgc2V0Q2hhbm5lbFN0YXRlKGluZGV4OiBudW1iZXIsIHBhcnRpYWw6IFBhcnRpYWw8SUNoYW5uZWxTdGF0ZT4pOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnNldENoYW5uZWxTdGF0ZShpbmRleCwgcGFydGlhbCk7XG4gIH1cbiAgcmVzZXRDb250cmFzdChpbmRpY2VzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIC8vIEZ1bGwgcmVzZXQ6IHdpbmRvdyAoMC4uMjU1KSwgZ2FtbWEgKDEpIEFORCB0aGUgY2hhbm5lbCdzIGRlZmF1bHQgdGludC5cbiAgICBmb3IgKGNvbnN0IGkgb2YgaW5kaWNlcykgdGhpcy5zdG9yZS5yZXNldENoYW5uZWxTdGF0ZShpKTtcbiAgfVxuICAvKiogQXV0by13aW5kb3cgZWFjaCBjaGFubmVsIGJ5IHNhdHVyYXRpbmcgYHNhdHVyYXRpb25gICgwLi4xKSBvZiBwaXhlbHMgYXQgZWFjaFxuICAgKiAgZW5kIG9mIGl0cyBoaXN0b2dyYW0gKHNraXBwaW5nIG91dGxpZXIgZmlyc3QvbGFzdCBiaW5zKS4gKi9cbiAgYXV0b0NvbnRyYXN0KGluZGljZXM6IG51bWJlcltdLCBzYXR1cmF0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGkgb2YgaW5kaWNlcykge1xuICAgICAgY29uc3QgaCA9IHRoaXMucmVuZGVyZXIoKS5nZXRIaXN0b2dyYW0oaSwgMjU2KTtcbiAgICAgIGlmICghaCkgY29udGludWU7XG4gICAgICBjb25zdCBbbWluLCBtYXhdID0gYXV0b1dpbmRvd0Zyb21IaXN0b2dyYW0oaCwgc2F0dXJhdGlvbiwgWzAsIDI1NV0pO1xuICAgICAgaWYgKG1heCA+IG1pbikgdGhpcy5zdG9yZS5zZXRDaGFubmVsU3RhdGUoaSwgeyBtaW4sIG1heCB9KTtcbiAgICB9XG4gIH1cbiAgZ2V0R3JheXNjYWxlJCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRHcmF5c2NhbGUoKTtcbiAgfVxuICBzZXRHcmF5c2NhbGUob246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnNldEdyYXlzY2FsZShvbik7XG4gIH1cbiAgZ2V0SW52ZXJ0JCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXRJbnZlcnQoKTtcbiAgfVxuICBzZXRJbnZlcnQob246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnN0b3JlLnNldEludmVydChvbik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIGFjdGl2ZSBiYWNrZW5kJ3MgcmVnaW9uIG92ZXJsYXkgKHRoZSBzbGljZSBwYW5lJ3Mgd2hpbGUgdGhlIHZvbHVtZSB2aWV3IGlzIHNwbGl0KS4gRmFsbHNcbiAgICogYmFjayB0byBQbG90bHkncyB3aGVuIHRoZSBhY3RpdmUgYmFja2VuZFxuICAgKiAoT1NEIG9yIG5hcGFyaS1qcykgaXMgc2VsZWN0ZWQgYnV0IGEgcGxvdCBpc24ndCBtb3VudGVkIHlldCwgc28gY2FsbGVycyBhbHdheXMgZ2V0IGFcbiAgICogdXNhYmxlIG92ZXJsYXkuXG4gICAqL1xuICBnZXRSZWdpb25PdmVybGF5KCk6IElSZWdpb25PdmVybGF5IHtcbiAgICBjb25zdCByID0gdGhpcy5yZWdpb25CYWNrZW5kKCk7XG4gICAgaWYgKHIgPT09IHRoaXMub3NkKSB7XG4gICAgICByZXR1cm4gdGhpcy5vc2QuZ2V0UmVnaW9uT3ZlcmxheSgpID8/IHRoaXMucGxvdGx5LmdldFJlZ2lvbk92ZXJsYXkoKTtcbiAgICB9XG4gICAgaWYgKHIgPT09IHRoaXMubmFwYXJpKSB7XG4gICAgICByZXR1cm4gdGhpcy5uYXBhcmkuZ2V0UmVnaW9uT3ZlcmxheSgpID8/IHRoaXMucGxvdGx5LmdldFJlZ2lvbk92ZXJsYXkoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGxvdGx5LmdldFJlZ2lvbk92ZXJsYXkoKTtcbiAgfVxuXG4gIC8qKiBJc29zdXJmYWNlIGNvbnRyb2xzIG9mIHRoZSBiYWNrZW5kIG9uIHNjcmVlbiwgd2hlbiBpdCByZW5kZXJzIGlzb3N1cmZhY2VzLiAqL1xuICBnZXRJc29zdXJmYWNlQ29udHJvbHMoKTogSUlzb3N1cmZhY2VDb250cm9scyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlbmRlcmVyKCkuZ2V0SXNvc3VyZmFjZUNvbnRyb2xzKCk7XG4gIH1cblxuICAvKiogM0Qgc2NlbmUgY29udHJvbHMgb2YgdGhlIGJhY2tlbmQgb24gc2NyZWVuIChQbG90bHkgb3IgbmFwYXJpLWpzKSwgb3IgbnVsbCBvbiBhXG4gICAqICAyRC1vbmx5IG9uZS4gKi9cbiAgZ2V0U3VyZmFjZTNkQ29udHJvbHMoKTogSVN1cmZhY2UzZENvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucmVuZGVyZXIoKS5nZXRTdXJmYWNlM2RDb250cm9scygpO1xuICB9XG5cbiAgLyoqIEludGVuc2l0eSAobGluZS1ST0kpIGNvbnRyb2xzLCB3aGljaGV2ZXIgYmFja2VuZCBkcmF3cyB0aGUgaW1hZ2U6IHRoZVxuICAgKiAgSW50ZW5zaXR5UHJvZmlsZVNlcnZpY2UgYWRkcyB0aGUgbGluZSB0byB0aGUgc3RvcmUsIGFuZCBldmVyeSBiYWNrZW5kXG4gICAqICAoUGxvdGx5IGluY2x1ZGVkKSBkcmF3cyBpdCBmcm9tIHRoZSBzdG9yZSdzIHVwZGF0ZSBldmVudC4gKi9cbiAgZ2V0SW50ZW5zaXR5Q29udHJvbHMoKTogSUludGVuc2l0eUNvbnRyb2xzIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5O1xuICB9XG5cbiAgLyoqXG4gICAqIFNwYXRpYWwtb21pY3MgY29udHJvbHMsIG9yIG51bGwgd2hlbiBubyBgU1BBVElBTF9EQVRBX1BPUlRgIGlzIGJvdW5kLiBTZXJ2ZWQgYnkgYVxuICAgKiBiYWNrZW5kLW5ldXRyYWwge0BsaW5rIFNwYXRpYWxDb250cm9sc0ZhY2FkZX0gKHN0YXRlIGluIHRoZSBzaGFyZWQgc3RvcmVzKSwgc28gdGhlXG4gICAqIGNvbnRyb2xzIHdvcmsgYWNyb3NzIGEgcGxvdC10eXBlIHN3aXRjaCBhbmQgYmVmb3JlIGFueSBiYWNrZW5kIGhhcyBtb3VudGVkLlxuICAgKi9cbiAgZ2V0U3BhdGlhbENvbnRyb2xzKCk6IElTcGF0aWFsQ29udHJvbHMgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuc3BhdGlhbERhdGEpIHJldHVybiBudWxsO1xuICAgIHRoaXMuc3BhdGlhbEZhY2FkZSA/Pz0gbmV3IFNwYXRpYWxDb250cm9sc0ZhY2FkZSh0aGlzLnNwYXRpYWxEYXRhLCB7XG4gICAgICBzdG9yZTogdGhpcy5zdG9yZSxcbiAgICAgIHJlZ2lvblN0b3JlOiB0aGlzLnJlZ2lvblN0b3JlLFxuICAgICAgc2VsZWN0aW9uU3RvcmU6IHRoaXMuc2VsZWN0aW9uU3RvcmUsXG4gICAgICBuYXBhcmk6IHRoaXMubmFwYXJpLFxuICAgICAgcGxvdFR5cGU6ICgpID0+IHRoaXMuY3VycmVudFBsb3RUeXBlLFxuICAgICAgekluZGV4OiAoKSA9PiB0aGlzLmN1cnJlbnRaSW5kZXgsXG4gICAgICBwbGFuZXM6ICgpID0+ICh0aGlzLnBsb3R0ZWRJbmZvPy5pc1N0YWNrID8gbnVsbCA6ICh0aGlzLmRhdGFzZXRSZWdpb25TZXQ/LnBsYW5lcyA/PyBudWxsKSksXG4gICAgICBzbGljZVBsYW5lczogKCkgPT4gdGhpcy5kYXRhc2V0UmVnaW9uU2V0Py5wbGFuZXMgPz8gbnVsbCxcbiAgICAgIHZpZXdDaGFuZ2VkJDogdGhpcy5zcGF0aWFsVmlld0NoYW5nZWQkLmFzT2JzZXJ2YWJsZSgpLFxuICAgIH0pO1xuICAgIHJldHVybiB0aGlzLnNwYXRpYWxGYWNhZGUuY29udHJvbHM7XG4gIH1cblxuICAvKiogQ3JlYXRlZCBvbiBmaXJzdCB1c2U7IG93bnMgdGhlIGRhdGFzZXQgc3Vic2NyaXB0aW9uLiAqL1xuICBwcml2YXRlIHNwYXRpYWxGYWNhZGU6IFNwYXRpYWxDb250cm9sc0ZhY2FkZSB8IG51bGwgPSBudWxsO1xuICAvKiogRGlzcGxheWVkIHNsaWNlLiBPbmx5IGEgdm9sdW1lLWJhY2tlZCBzcGF0aWFsIGRhdGFzZXQgcmVhZHMgaXQsIHRvIGtlZXAgYVxuICAgKiAgcmVnaW9uIGRyYXduIG92ZXIgb25lIHNlY3Rpb24gZnJvbSBzZWxlY3RpbmcgdGhlIHdob2xlIGRlcHRoIGJlaGluZCBpdC4gKi9cbiAgcHJpdmF0ZSBjdXJyZW50WkluZGV4ID0gMDtcbiAgLyoqIFRoZSBzbGljZSBzaG93biwgdGhlIHBsb3QgdHlwZSBvciB0aGUgZGF0YXNldCdzIHBsYW5lcyBjaGFuZ2VkICh0aGUgc3BhdGlhbCBjb250cm9scyByZWNvdW50KS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzcGF0aWFsVmlld0NoYW5nZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvKiogQW5ndWxhciBjYWxscyB0aGlzIHdoZW4gdGhlIGluamVjdG9yIHByb3ZpZGluZyB0aGUgcm91dGVyIGlzIGRlc3Ryb3llZCDigJQgdGhlIGhvc3RcbiAgICogIGNvbXBvbmVudCBmb3IgYSBgcHJvdmlkZVZpc3VhbGl6YXRpb24oKWAgY2hhaW4uIFRoZSBkYXRhc2V0IHN1YnNjcmlwdGlvbiB3b3VsZFxuICAgKiAgb3RoZXJ3aXNlIGtlZXAgdGhlIHdob2xlIGlzb2xhdGVkIGNoYWluIHJlYWNoYWJsZSBmcm9tIHRoZSByb290IGRhdGEgcG9ydC4gKi9cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5pbXBvcnRUaWNrZXQgPSB7IGlkOiB0aGlzLmltcG9ydFRpY2tldC5pZCArIDEsIGltYWdlOiB1bmRlZmluZWQgfTsgLy8gYSBsYXRlIGltcG9ydCBjaGFuZ2VzIG5vdGhpbmdcbiAgICB0aGlzLnNwYXRpYWxGYWNhZGU/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLnNwYXRpYWxGYWNhZGUgPSBudWxsO1xuICAgIHRoaXMucmVnaW9uVXBkYXRlcy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMucGxhbmVDZWxsc1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnNlY3Rpb25TdWJzLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5zZWN0aW9ucy5zdG9wKCk7XG4gICAgaWYgKHRoaXMucmVidWlsZFRpbWVyKSBjbGVhclRpbWVvdXQodGhpcy5yZWJ1aWxkVGltZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVuc2l0eS1wcm9maWxlIHNhbXBsaW5nLCB3aGljaGV2ZXIgYmFja2VuZCBpcyBvbiBzY3JlZW46IHRoZSBzYW1wbGluZyBpcyB0aGVcbiAgICogYmFja2VuZC1uZXV0cmFsIEludGVuc2l0eVByb2ZpbGVTZXJ2aWNlJ3M7IHRoZSB2aWV3cG9ydCBjaGFuZ2VzIGNvbWUgZnJvbSBldmVyeVxuICAgKiBiYWNrZW5kIHRoYXQgcmVwb3J0cyB0aGVtIChPcGVuU2VhZHJhZ29uLCBuYXBhcmktanMpLCBtZXJnZWQgaW50byBvbmUgc3RhYmxlXG4gICAqIHN0cmVhbSB0aGUgaW5zZXQgc3Vic2NyaWJlcyB0byBvbmNlLlxuICAgKi9cbiAgZ2V0SW50ZW5zaXR5U2FtcGxpbmcoKTogSUludGVuc2l0eVNhbXBsaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pbnRlbnNpdHlTYW1wbGluZztcbiAgfVxuICBwcml2YXRlIHJlYWRvbmx5IGludGVuc2l0eVNhbXBsaW5nOiBJSW50ZW5zaXR5U2FtcGxpbmcgPSB7XG4gICAgLy8gTG9hZCB0aGUgZGlzcGxheWVkIHNsaWNlJ3MgcGl4ZWxzIGZvciBhIGJhY2tlbmQgdGhhdCBoYXMgbm8gZnJhbWVzIG9mIGl0cyBvd25cbiAgICAvLyAoT3BlblNlYWRyYWdvbiwgbmFwYXJpLWpzOyBQbG90bHkgZmVlZHMgaXRzIGZyYW1lcyB0byB0aGUgc2VydmljZSB3aGVuIGl0IHBsb3RzKS5cbiAgICBlbnN1cmVJbnRlbnNpdHlTYW1wbGluZzogKGltYWdlSW5mbywgekluZGV4KSA9PiB7XG4gICAgICB0aGlzLnBvaW50U2FtcGxpbmdBdFBsb3QoKTtcbiAgICAgIHJldHVybiB0aGlzLmludGVuc2l0eS5lbnN1cmVJbnRlbnNpdHlTYW1wbGluZyhpbWFnZUluZm8sIHpJbmRleCk7XG4gICAgfSxcbiAgICAvLyBSZS1zYW1wbGUgZnJvbSBhIGZyZXNoIGNyb3Agb2YgdGhlIGltYWdlLXBpeGVsIFJPSSBhdCBkaXNwbGF5IHJlc29sdXRpb24uXG4gICAgcmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pOiAoeCwgeSwgd2lkdGgsIGhlaWdodCwgekluZGV4KSA9PiB7XG4gICAgICB0aGlzLnBvaW50U2FtcGxpbmdBdFBsb3QoKTtcbiAgICAgIHRoaXMuaW50ZW5zaXR5LnJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaSh4LCB5LCB3aWR0aCwgaGVpZ2h0LCB6SW5kZXgpO1xuICAgIH0sXG4gICAgZ2V0Vmlld3BvcnRDaGFuZ2UkOiAoKSA9PlxuICAgICAgbWVyZ2UoLi4udGhpcy5iYWNrZW5kcygpLm1hcCgoYikgPT4gYi5nZXRJbnRlbnNpdHlTYW1wbGluZygpPy5nZXRWaWV3cG9ydENoYW5nZSQoKSA/PyBFTVBUWSkpLFxuICB9O1xuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRJbnRlbnNpdHlTYW1wbGluZygpLmVuc3VyZUludGVuc2l0eVNhbXBsaW5nKClgLiAqL1xuICBlbnN1cmVJbnRlbnNpdHlTYW1wbGluZyhpbWFnZUluZm86IElJbWFnZUluZm8sIHpJbmRleDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5U2FtcGxpbmcuZW5zdXJlSW50ZW5zaXR5U2FtcGxpbmcoaW1hZ2VJbmZvLCB6SW5kZXgpO1xuICB9XG5cbiAgLyoqIENyb3BzIGZvciBzYW1wbGluZyBhcmUgc2l6ZWQgZnJvbSB0aGUgcGxvdCBkaXYgKHdoaWNoZXZlciBiYWNrZW5kIHJlbmRlcnMgaW50byBpdCkuICovXG4gIHByaXZhdGUgcG9pbnRTYW1wbGluZ0F0UGxvdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wbG90RGl2KSB0aGlzLmludGVuc2l0eS5zZXRTYW1wbGluZ0VsZW1lbnQodGhpcy5wbG90RGl2KTtcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCBVc2UgYGdldEludGVuc2l0eVNhbXBsaW5nKCkuZ2V0Vmlld3BvcnRDaGFuZ2UkKClgLiAqL1xuICBnZXRWaWV3cG9ydENoYW5nZSQoKTogT2JzZXJ2YWJsZTx7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB3aWR0aDogbnVtYmVyOyBoZWlnaHQ6IG51bWJlciB9PiB7XG4gICAgcmV0dXJuIHRoaXMuaW50ZW5zaXR5U2FtcGxpbmcuZ2V0Vmlld3BvcnRDaGFuZ2UkKCk7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIGBnZXRJbnRlbnNpdHlTYW1wbGluZygpLnJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaSgpYC4gKi9cbiAgcmVmcmVzaEludGVuc2l0eVNhbXBsaW5nRm9yUm9pKHg6IG51bWJlciwgeTogbnVtYmVyLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgekluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmludGVuc2l0eVNhbXBsaW5nLnJlZnJlc2hJbnRlbnNpdHlTYW1wbGluZ0ZvclJvaSh4LCB5LCB3aWR0aCwgaGVpZ2h0LCB6SW5kZXgpO1xuICB9XG5cbiAgLyoqIFRoZSB2aXN1YWxpemVyIHZpZXcgaXMgZ29pbmcgYXdheTogZGV0YWNoIGV2ZXJ5IGJhY2tlbmQg4oCUIGRyb3BwaW5nIHRoZWlyIHZpZXctYm91bmRcbiAgICogIHN1YnNjcmlwdGlvbnMgYW5kIGRpc3Bvc2luZyB0aGUgbmFwYXJpLWpzIHZpZXdlciwgd2hvc2UgY2FudmFzLCByZW5kZXIgbG9vcCBhbmQgR1BVXG4gICAqICBidWZmZXJzIHdvdWxkIG90aGVyd2lzZSBvdXRsaXZlIHRoZSB2aWV3IChmb3IgYSBjb21wb25lbnQtc2NvcGVkIGNoYWluLCBmb3JldmVyKS5cbiAgICogIE5vdGhpbmcgaXMgb24gc2NyZWVuIGFmdGVyd2FyZHMsIHNvIHRoZSBuZXh0IHBsb3Qgc3RhcnRzIGZyb20gdGhlIGRlZmF1bHQgYmFja2VuZC4gKi9cbiAgZGV0YWNoKCk6IHZvaWQge1xuICAgIHRoaXMuc2xpY2VSZXF1ZXN0Kys7XG4gICAgdGhpcy5zZWN0aW9ucy5zdG9wKCk7XG4gICAgdGhpcy5zbGljZU1vdW50ZWQgPSBmYWxzZTtcbiAgICB0aGlzLnNsaWNlRGl2ID0gbnVsbDtcbiAgICB0aGlzLnBsb3RseS5kZXRhY2goKTtcbiAgICB0aGlzLm9zZC5kZXRhY2goKTtcbiAgICB0aGlzLm5hcGFyaS5kZXRhY2goKTtcbiAgICB0aGlzLmxhc3RSZW5kZXJlZCA9IG51bGw7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBkZXRhY2h9LiAqL1xuICB1bnN1YnNjcmliZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRldGFjaCgpO1xuICB9XG59XG5cbi8qKlxuICogQSBzcGF0aWFsIGRhdGFzZXQncyByZWdpb24gc2V0IG9uIGFuIGltYWdlIChzZWUgYGF0dGFjaERhdGFzZXRSZWdpb25TZXRgKTogdGhlIGltYWdlIChpdHMgcmVnaW9uXG4gKiBzY29wZSBrZXkpLCB0aGUgc2V0J3Mga2V5LCBpdHMgcGxhbmVzJyB6IChpdHMgYHNsaWNlWmAsIHdoZW4gaXQgc2F5cyksIGl0cyBjbGFzcyBncm91cHMsIHdoZXRoZXJcbiAqIHRoZXkgd2VyZSBzaG93biBpbiAzRCBieSB0aGVtc2VsdmVzLCBhbmQgdGhlIG9wZW5lciBpdCB3YXMgYXR0YWNoZWQgdG8gdGhlIHN0b3JlIHdpdGggKG51bGwgd2hpbGVcbiAqIGl0IG9wZW5zKTogd2hpbGUgdGhlIHN0b3JlJ3Mgc291cmNlIG92ZXIgZXZlcnkgcGxhbmUgaXMgdGhhdCBvbmUsIHRoZSBzZXQgaXMgc3RpbGwgYXR0YWNoZWQuXG4gKi9cbmludGVyZmFjZSBEYXRhc2V0UmVnaW9uU2V0U3RhdGUge1xuICBpbWFnZTogc3RyaW5nO1xuICBrZXk6IHN0cmluZztcbiAgcGxhbmVzOiByZWFkb25seSBudW1iZXJbXSB8IG51bGw7XG4gIGdyb3VwczogUmVhZG9ubHlBcnJheTx7IGtleTogc3RyaW5nOyBjbGFzc2VzOiByZWFkb25seSBzdHJpbmdbXTsgY29sb3I6IHN0cmluZyB9PjtcbiAgc2hvd24zZDogYm9vbGVhbjtcbiAgb3BlbmVyOiBSZWdpb25Tb3VyY2VPcGVuZXIgfCBudWxsO1xufVxuXG4vKipcbiAqIEEgcmVnaW9uIHNldCdzIGNsYXNzZXMgYXMgM0QgZ3JvdXBzLCBhcyB0aGUgcmVnaW9uIGVkaXRvcidzIGNsYXNzIHRyZWUgc2hvd3MgdGhlbTogb25lIHBlciByb290IG9mXG4gKiBpdHMgaGllcmFyY2h5IHdpdGggZXZlcnkgY2xhc3MgdW5kZXIgaXQgKG9uZSBwZXIgY2xhc3Mgb2YgYSBmbGF0IG9uZSksIGluIHRoZSBoaWVyYXJjaHkncyBvcmRlcjtcbiAqIHdpdGhvdXQgYSBoaWVyYXJjaHksIG9uZSBwZXIgY2xhc3MgaXRzIGZlYXR1cmVzIGhhdmUuIEVhY2ggaW4gdGhlIGNvbG91ciB0aGUgc2V0IGdpdmVzIGl0IChpdHNcbiAqIGhpZXJhcmNoeSdzLCBlbHNlIGl0cyBmZWF0dXJlcycpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaW9uU2V0R3JvdXBzKGluZm86IFJlZ2lvblNvdXJjZUluZm8pOiBBcnJheTx7IGtleTogc3RyaW5nOyBjbGFzc2VzOiBzdHJpbmdbXTsgY29sb3I6IHN0cmluZyB9PiB7XG4gIGNvbnN0IGNvbG9ycyA9IG5ldyBNYXAoT2JqZWN0LmVudHJpZXMoaW5mby5jbGFzc0NvbG9ycyA/PyB7fSkpO1xuICBjb25zdCBub2RlcyA9IFsuLi4oaW5mby5oaWVyYXJjaHkgPz8gW10pXS5zb3J0KChhLCBiKSA9PiAoYS5vcmRlciA/PyAwKSAtIChiLm9yZGVyID8/IDApKTtcbiAgaWYgKCFub2Rlcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gWy4uLmNvbG9ycy5lbnRyaWVzKCldLm1hcCgoW25hbWUsIGNvbG9yXSkgPT4gKHsga2V5OiBuYW1lLCBjbGFzc2VzOiBbbmFtZV0sIGNvbG9yIH0pKTtcbiAgfVxuICBmb3IgKGNvbnN0IG4gb2Ygbm9kZXMpIGlmIChuLmNvbG9yKSBjb2xvcnMuc2V0KG4ubmFtZSwgbi5jb2xvcik7XG4gIGNvbnN0IG5hbWVzID0gbmV3IFNldChub2Rlcy5tYXAoKG4pID0+IG4ubmFtZSkpO1xuICBjb25zdCBjaGlsZHJlbiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgZm9yIChjb25zdCBuIG9mIG5vZGVzKSB7XG4gICAgaWYgKCFuLnBhcmVudCB8fCAhbmFtZXMuaGFzKG4ucGFyZW50KSkgY29udGludWU7XG4gICAgY2hpbGRyZW4uc2V0KG4ucGFyZW50LCBbLi4uKGNoaWxkcmVuLmdldChuLnBhcmVudCkgPz8gW10pLCBuLm5hbWVdKTtcbiAgfVxuICBjb25zdCBzdWJ0cmVlID0gKG5hbWU6IHN0cmluZyk6IHN0cmluZ1tdID0+IFtuYW1lLCAuLi4oY2hpbGRyZW4uZ2V0KG5hbWUpID8/IFtdKS5mbGF0TWFwKHN1YnRyZWUpXTtcbiAgcmV0dXJuIG5vZGVzXG4gICAgLmZpbHRlcigobikgPT4gIW4ucGFyZW50IHx8ICFuYW1lcy5oYXMobi5wYXJlbnQpKVxuICAgIC5tYXAoKG4pID0+ICh7IGtleTogbi5uYW1lLCBjbGFzc2VzOiBzdWJ0cmVlKG4ubmFtZSksIGNvbG9yOiBjb2xvcnMuZ2V0KG4ubmFtZSkgPz8gJyNjY2NjY2MnIH0pKTtcbn1cbiJdfQ==
|