@smarterplan/ngx-smarterplan-core 1.4.16 → 1.4.17
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/services/filter.service.mjs +11 -1
- package/esm2022/lib/services/matterport.service.mjs +13 -2
- package/esm2022/lib/services/models/base-object.service.mjs +31 -4
- package/esm2022/lib/services/models/equipment.service.mjs +14 -13
- package/esm2022/lib/services/models/feature.service.mjs +8 -7
- package/esm2022/lib/services/models/space.service.mjs +25 -2
- package/esm2022/lib/services/models/ticket.service.mjs +27 -8
- package/esm2022/lib/services/navigator.service.mjs +14 -1
- package/esm2022/lib/services/threejs.service.mjs +316 -35
- package/esm2022/lib/services/viewer.service.mjs +147 -8
- package/esm2022/lib/services/zoneChange.service.mjs +10 -1
- package/esm2022/lib/types.service.mjs +1 -1
- package/fesm2022/smarterplan-ngx-smarterplan-core.mjs +4376 -3848
- package/fesm2022/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
- package/lib/services/models/base-object.service.d.ts +11 -1
- package/lib/services/models/equipment.service.d.ts +2 -1
- package/lib/services/models/feature.service.d.ts +2 -1
- package/lib/services/models/space.service.d.ts +7 -0
- package/lib/services/models/ticket.service.d.ts +4 -1
- package/lib/services/threejs.service.d.ts +103 -5
- package/lib/services/viewer.service.d.ts +39 -1
- package/lib/services/zoneChange.service.d.ts +9 -0
- package/lib/types.service.d.ts +8 -0
- package/package.json +1 -1
|
@@ -14,8 +14,10 @@ import * as i0 from "@angular/core";
|
|
|
14
14
|
import * as i1 from "./models/poi.service";
|
|
15
15
|
import * as i2 from "./matterport.service";
|
|
16
16
|
import * as i3 from "./threejs.service";
|
|
17
|
+
import * as i4 from "../config";
|
|
17
18
|
export class ViewerService {
|
|
18
19
|
sdkKey;
|
|
20
|
+
config;
|
|
19
21
|
poiService;
|
|
20
22
|
matterportService;
|
|
21
23
|
threeJsService;
|
|
@@ -26,6 +28,14 @@ export class ViewerService {
|
|
|
26
28
|
dataIsLoaded = new Subject();
|
|
27
29
|
isLoaded = false;
|
|
28
30
|
showingViewer = false;
|
|
31
|
+
/**
|
|
32
|
+
* The space being viewed, whichever viewer is showing it.
|
|
33
|
+
*
|
|
34
|
+
* MatterportService carries its own copy, set while its SDK connects - which never happens in
|
|
35
|
+
* Three.js mode. Anything that reads only that one silently does nothing for a 3D model, and the
|
|
36
|
+
* lists that feed tags are exactly that.
|
|
37
|
+
*/
|
|
38
|
+
currentSpaceID = null;
|
|
29
39
|
sweepToMove;
|
|
30
40
|
rotationToMove;
|
|
31
41
|
goToTriggered = new Subject();
|
|
@@ -54,8 +64,9 @@ export class ViewerService {
|
|
|
54
64
|
},
|
|
55
65
|
};
|
|
56
66
|
isObjectLoaded = false;
|
|
57
|
-
constructor(sdkKey, poiService, matterportService, threeJsService) {
|
|
67
|
+
constructor(sdkKey, config, poiService, matterportService, threeJsService) {
|
|
58
68
|
this.sdkKey = sdkKey;
|
|
69
|
+
this.config = config;
|
|
59
70
|
this.poiService = poiService;
|
|
60
71
|
this.matterportService = matterportService;
|
|
61
72
|
this.threeJsService = threeJsService;
|
|
@@ -139,6 +150,16 @@ export class ViewerService {
|
|
|
139
150
|
// this.rotationToMove = null;
|
|
140
151
|
if (this.checkMode('threejs')) {
|
|
141
152
|
this.threeJsService.destroy();
|
|
153
|
+
this.showingViewer = false;
|
|
154
|
+
this.isLoaded = false;
|
|
155
|
+
// Mirrors the Matterport branch: the space is no longer on screen, so whatever was loaded
|
|
156
|
+
// for it has to be dropped before another visit opens.
|
|
157
|
+
this.viewerIsOn.next({
|
|
158
|
+
spaceID: null,
|
|
159
|
+
model3D: null,
|
|
160
|
+
sweep: null,
|
|
161
|
+
rotation: null,
|
|
162
|
+
});
|
|
142
163
|
}
|
|
143
164
|
else if (this.checkMode('Matterport')) {
|
|
144
165
|
this.showingViewer = false;
|
|
@@ -193,6 +214,13 @@ export class ViewerService {
|
|
|
193
214
|
}
|
|
194
215
|
return false;
|
|
195
216
|
}
|
|
217
|
+
// Without this the caller falls through to getModel3dAndSweep, which resolves a visit from the
|
|
218
|
+
// POI's sweep - a Three.js POI has none, so it fails and reports the model as unreachable even
|
|
219
|
+
// though the tag is on screen.
|
|
220
|
+
if (this.checkMode('threejs') && this.threeJsService.hasTag(elementId)) {
|
|
221
|
+
this.threeJsService.goToTag(elementId);
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
196
224
|
return false;
|
|
197
225
|
}
|
|
198
226
|
/**
|
|
@@ -251,9 +279,59 @@ export class ViewerService {
|
|
|
251
279
|
id: object.id,
|
|
252
280
|
position,
|
|
253
281
|
poiType: poi.type,
|
|
254
|
-
|
|
282
|
+
label: object.name ?? object.title ?? null,
|
|
283
|
+
iconUrl: await this.resolveTagIconUrl(poi),
|
|
255
284
|
});
|
|
256
285
|
}
|
|
286
|
+
/**
|
|
287
|
+
* The image to draw a tag with, mirroring what Matterport shows for the same POI.
|
|
288
|
+
*
|
|
289
|
+
* Matterport registers one texture per type (`icon-ticket`, `icon-equipment`...) from the same
|
|
290
|
+
* config entries used here, and overrides it with the POI's own icon when it has one. Reading the
|
|
291
|
+
* same two sources is what keeps a tag looking like itself across the two viewers.
|
|
292
|
+
*/
|
|
293
|
+
async resolveTagIconUrl(poi) {
|
|
294
|
+
if (poi.tagIcon) {
|
|
295
|
+
// Stored as JSON ({ src, opacity }) by the Matterport path, but older records are a bare key.
|
|
296
|
+
let source = null;
|
|
297
|
+
try {
|
|
298
|
+
const parsed = JSON.parse(poi.tagIcon);
|
|
299
|
+
source = typeof parsed === 'string' ? parsed : parsed?.src ?? null;
|
|
300
|
+
}
|
|
301
|
+
catch {
|
|
302
|
+
source = poi.tagIcon;
|
|
303
|
+
}
|
|
304
|
+
if (source) {
|
|
305
|
+
const signed = await getSignedFile(source);
|
|
306
|
+
if (signed) {
|
|
307
|
+
return signed;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
return this.defaultTagIconUrl(poi.type);
|
|
312
|
+
}
|
|
313
|
+
/** The configured icon for a POI type, or null when that type has none. */
|
|
314
|
+
defaultTagIconUrl(poiType) {
|
|
315
|
+
const icons = this.config?.my_config;
|
|
316
|
+
if (!icons) {
|
|
317
|
+
return null;
|
|
318
|
+
}
|
|
319
|
+
switch (poiType) {
|
|
320
|
+
case PoiType.TICKET:
|
|
321
|
+
return icons.icon_ticket ?? null;
|
|
322
|
+
case PoiType.EQUIPMENT:
|
|
323
|
+
return icons.icon_equipment ?? null;
|
|
324
|
+
case PoiType.MEASURE:
|
|
325
|
+
return icons.icon_measure ?? null;
|
|
326
|
+
case PoiType.OBJECT3D:
|
|
327
|
+
return icons.icon_object3d ?? null;
|
|
328
|
+
case PoiType.DATA:
|
|
329
|
+
case PoiType.DESK:
|
|
330
|
+
return icons.icon_data ?? null;
|
|
331
|
+
default:
|
|
332
|
+
return null;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
257
335
|
/** Moves the Three.js camera to frame a tag, mirroring Matterport's goToTag. */
|
|
258
336
|
goToThreeJsTag(elementId) {
|
|
259
337
|
if (this.checkMode('threejs')) {
|
|
@@ -333,6 +411,10 @@ export class ViewerService {
|
|
|
333
411
|
this.threeJsService.cancelModelLoad();
|
|
334
412
|
}
|
|
335
413
|
}
|
|
414
|
+
/** Emits a tag's label while the pointer is over it in the Three.js scene. */
|
|
415
|
+
get threeJsTagHovered$() {
|
|
416
|
+
return this.threeJsService.tagHovered$;
|
|
417
|
+
}
|
|
336
418
|
/** Emits the element id of a tag clicked in the Three.js scene. */
|
|
337
419
|
get threeJsTagClicked$() {
|
|
338
420
|
return this.threeJsService.tagClicked$;
|
|
@@ -360,7 +442,7 @@ export class ViewerService {
|
|
|
360
442
|
await this.matterportService.addMattertagWhenAdding(poiType);
|
|
361
443
|
}
|
|
362
444
|
if (this.checkMode('threejs')) {
|
|
363
|
-
this.threeJsService.startTagPlacement();
|
|
445
|
+
this.threeJsService.startTagPlacement(poiType);
|
|
364
446
|
}
|
|
365
447
|
}
|
|
366
448
|
/**
|
|
@@ -503,10 +585,45 @@ export class ViewerService {
|
|
|
503
585
|
this.threeJsService.cancelTagPlacement();
|
|
504
586
|
return updatedPoi;
|
|
505
587
|
}
|
|
588
|
+
/**
|
|
589
|
+
* Creates the POI for an element just placed in the Three.js scene.
|
|
590
|
+
*
|
|
591
|
+
* The Matterport path reaches the same result through its tag dictionary - the tag exists first
|
|
592
|
+
* and carries the coordinates. Three.js has no such object, so the placement captured at click
|
|
593
|
+
* time is the only record of where the user pointed, and it has to become a POI here or it is
|
|
594
|
+
* lost when the form closes.
|
|
595
|
+
*
|
|
596
|
+
* Returns null when there is no pending placement, which is the normal case in Matterport mode.
|
|
597
|
+
*/
|
|
598
|
+
async createPoiForThreeJsPlacement(element, poiType) {
|
|
599
|
+
if (!this.checkMode('threejs')) {
|
|
600
|
+
return null;
|
|
601
|
+
}
|
|
602
|
+
const placement = this.threeJsService.getPendingTagPlacement();
|
|
603
|
+
if (!placement || !element?.id) {
|
|
604
|
+
return null;
|
|
605
|
+
}
|
|
606
|
+
const poi = await this.poiService.createPOIForSpaceID({
|
|
607
|
+
coordinate: JSON.stringify(placement.position),
|
|
608
|
+
type: poiType,
|
|
609
|
+
elementID: element.id,
|
|
610
|
+
metadata: JSON.stringify({ normal: placement.normal }),
|
|
611
|
+
});
|
|
612
|
+
// Draw it straight away rather than waiting for the next refresh, so the user sees where the
|
|
613
|
+
// thing they just created ended up. Through the same path the refresh uses, so it arrives with
|
|
614
|
+
// the type's icon instead of the bare marker - the difference was visible until the next reload.
|
|
615
|
+
await this.addThreeJsTagFromPOI(element, poi);
|
|
616
|
+
this.threeJsService.cancelTagPlacement();
|
|
617
|
+
return poi;
|
|
618
|
+
}
|
|
506
619
|
/** Emits when a tag is dropped on the model in the Three.js scene. */
|
|
507
620
|
get threeJsTagPlaced$() {
|
|
508
621
|
return this.threeJsService.tagPlaced$;
|
|
509
622
|
}
|
|
623
|
+
/** Emits when the calibration walkthrough is abandoned, including via Escape. */
|
|
624
|
+
get threeJsAlignmentCancelled$() {
|
|
625
|
+
return this.threeJsService.alignmentCancelled$;
|
|
626
|
+
}
|
|
510
627
|
/** Leaves Three.js tag placement mode without placing anything. */
|
|
511
628
|
cancelThreeJsTagPlacement() {
|
|
512
629
|
if (this.checkMode('threejs')) {
|
|
@@ -565,8 +682,25 @@ export class ViewerService {
|
|
|
565
682
|
https://matterport.github.io/showcase-sdk/docs/sdk/reference/current/modules/mattertag.html#remove
|
|
566
683
|
-----------------------------------------------------------------------------------------------------------------*/
|
|
567
684
|
initThreeJs(canvas) {
|
|
568
|
-
if (this.checkMode('threejs')) {
|
|
569
|
-
|
|
685
|
+
if (!this.checkMode('threejs')) {
|
|
686
|
+
return;
|
|
687
|
+
}
|
|
688
|
+
this.threeJsService.init(canvas);
|
|
689
|
+
// The tag pipeline is gated on this flag, which until now only the Matterport SDK set. A
|
|
690
|
+
// Three.js visit never reaches that code, so every tag was dropped before it could be drawn.
|
|
691
|
+
this.showingViewer = true;
|
|
692
|
+
// Everything that loads data for a space - tickets, equipments, features, measurements - hangs
|
|
693
|
+
// off this event, which Matterport raises once its SDK starts playing. A Three.js visit never
|
|
694
|
+
// touches the SDK, so nothing ever announced the space and every list came back empty.
|
|
695
|
+
if (this.currentSpaceID) {
|
|
696
|
+
this.viewerIsOn.next({
|
|
697
|
+
spaceID: this.currentSpaceID,
|
|
698
|
+
model3D: null,
|
|
699
|
+
sweep: null,
|
|
700
|
+
rotation: null,
|
|
701
|
+
});
|
|
702
|
+
this.dataIsLoaded.next(true);
|
|
703
|
+
this.isLoaded = true;
|
|
570
704
|
}
|
|
571
705
|
}
|
|
572
706
|
/**
|
|
@@ -601,7 +735,9 @@ export class ViewerService {
|
|
|
601
735
|
return;
|
|
602
736
|
}
|
|
603
737
|
const placement = parseThreeJsPlacement(placementMetadata);
|
|
604
|
-
|
|
738
|
+
// The key, not the signed URL, is what identifies the model across loads - the signature makes
|
|
739
|
+
// every URL unique, which is exactly why the browser's own cache never helps here.
|
|
740
|
+
this.threeJsService.loadGLTFModel(url, placement?.cameraPosition, placement?.rotation, key);
|
|
605
741
|
}
|
|
606
742
|
/**
|
|
607
743
|
* Loads a 3D model into the Three.js scene (OBJ).
|
|
@@ -696,7 +832,7 @@ export class ViewerService {
|
|
|
696
832
|
isObject3DLoadedInPosition() {
|
|
697
833
|
return this.isObjectLoaded;
|
|
698
834
|
}
|
|
699
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ViewerService, deps: [{ token: MATTERPORT_SDK_KEY }, { token: i1.PoiService }, { token: i2.MatterportService }, { token: i3.ThreeJsService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
835
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ViewerService, deps: [{ token: MATTERPORT_SDK_KEY }, { token: 'config' }, { token: i1.PoiService }, { token: i2.MatterportService }, { token: i3.ThreeJsService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
700
836
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ViewerService, providedIn: 'root' });
|
|
701
837
|
}
|
|
702
838
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ViewerService, decorators: [{
|
|
@@ -707,5 +843,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
707
843
|
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
708
844
|
type: Inject,
|
|
709
845
|
args: [MATTERPORT_SDK_KEY]
|
|
846
|
+
}] }, { type: i4.Config, decorators: [{
|
|
847
|
+
type: Inject,
|
|
848
|
+
args: ['config']
|
|
710
849
|
}] }, { type: i1.PoiService }, { type: i2.MatterportService }, { type: i3.ThreeJsService }] });
|
|
711
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tY29yZS9zcmMvbGliL3NlcnZpY2VzL3ZpZXdlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFDQUFxQztBQUNyQyw4QkFBOEI7QUFDOUIseUNBQXlDO0FBQ3pDLDJDQUEyQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSS9CLE9BQU8sRUFHTCxrQkFBa0IsRUFDbEIsT0FBTyxFQUtQLFFBQVEsR0FDVCxNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlEQUF5RCxDQUFDO0FBQ2pILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDREQUE0RCxDQUFDO0FBRXRILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7O0FBSzNELE1BQU0sT0FBTyxhQUFhO0lBcUR1QjtJQUNyQztJQUNBO0lBQ0E7SUF2REYsVUFBVSxHQUFXLFlBQVksQ0FBQztJQUVuQyxjQUFjLENBQVM7SUFFdEIsT0FBTyxDQUFTO0lBRWpCLFVBQVUsR0FLWixJQUFJLE9BQU8sRUFBRSxDQUFDO0lBRVosWUFBWSxHQUFxQixJQUFJLE9BQU8sRUFBRSxDQUFDO0lBRS9DLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFFakIsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUV0QixXQUFXLENBQWdCO0lBRTNCLGNBQWMsQ0FBbUM7SUFFakQsYUFB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QU8sRUFBRSxDQUFDO1lBQzNCLENBQUM7WUFDRCxPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxlQUF5QjtRQUM3QyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsaUJBQWlCLENBQUMscUJBQXFCLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDaEUsQ0FBQztJQUNILENBQUM7SUFFRCwyQkFBMkIsQ0FBQyxZQUFxQjtRQUMvQyxJQUFJLENBQUMsY0FBYyxHQUFHLFlBQVksQ0FBQztJQUNyQyxDQUFDO0lBRUQsMEJBQTBCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO3dHQXgxQlUsYUFBYSxrQkFxRGQsa0JBQWtCOzRHQXJEakIsYUFBYSxjQUZaLE1BQU07OzRGQUVQLGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFzREksTUFBTTsyQkFBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1hd2FpdC1pbi1sb29wICovXG4vKiBlc2xpbnQtZGlzYWJsZSBjYW1lbGNhc2UgKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVyc2NvcmUtZGFuZ2xlICovXG4vKiBlc2xpbnQtZGlzYWJsZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzICovXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1BVFRFUlBPUlRfU0RLX0tFWSB9IGZyb20gJy4uL3Rva2Vucy9tYXR0ZXJwb3J0LXNkay1rZXkudG9rZW4nO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTWF0dGVycG9ydFNlcnZpY2UgfSBmcm9tICcuL21hdHRlcnBvcnQuc2VydmljZSc7XG5pbXBvcnQgeyBUaHJlZUpzU2VydmljZSB9IGZyb20gJy4vdGhyZWVqcy5zZXJ2aWNlJztcbmltcG9ydCB7IEJhc2VUYWdTZXJ2aWNlIH0gZnJvbSAnLi90YWcuc2VydmljZSc7XG5pbXBvcnQge1xuICBEYk9iamVjdFR5cGUsXG4gIFBPSSxcbiAgVmlld2VySW50ZXJhY3Rpb25zLFxuICBQb2lUeXBlLFxuICBDb21tZW50LFxuICBFcXVpcG1lbnQsXG4gIFRpY2tldCxcbiAgRmVhdHVyZSxcbiAgU3BNb2R1bGUsXG59IGZyb20gJy4uL3R5cGVzLnNlcnZpY2UnO1xuaW1wb3J0IHsgUG9pU2VydmljZSB9IGZyb20gJy4vbW9kZWxzL3BvaS5zZXJ2aWNlJztcbmltcG9ydCB7IG1ha2VTZWN1cml0eUNhbWVyYSwgc2VjdXJpdHlDYW1lcmFUeXBlIH0gZnJvbSBcIi4uL21hdHRlcnBvcnQtZXh0ZW5zaW9ucy9zZWN1cml0eS1jYW1lcmEvU2VjdXJpdHlDYW1lcmFcIjtcbmltcG9ydCB7IFZpZXdGcnVzdHVtTWVzaFR5cGUsIG1ha2VWaWV3RnJ1c3R1bU1lc2ggfSBmcm9tIFwiLi4vbWF0dGVycG9ydC1leHRlbnNpb25zL3ZpZXctZnJ1c3R1bS1tZXNoL1ZpZXdGcnVzdHVtTWVzaFwiO1xuaW1wb3J0IHsgTmF2aWdhdG9yU2VydmljZSB9IGZyb20gJy4vbmF2aWdhdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgZ2V0U2lnbmVkRmlsZSB9IGZyb20gJy4vczMuc2VydmljZSc7XG5pbXBvcnQgeyBwYXJzZVRocmVlSnNQbGFjZW1lbnQgfSBmcm9tICcuLi9oZWxwZXJzLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgVmlld2VyU2VydmljZSB7XG4gIHByaXZhdGUgdmlld2VyTW9kZTogc3RyaW5nID0gJ01hdHRlcnBvcnQnO1xuXG4gIHB1YmxpYyBjdXJyZW50TW9kZWwzRDogc3RyaW5nO1xuXG4gIHByaXZhdGUgdG91clVybDogc3RyaW5nO1xuXG4gIHB1YmxpYyB2aWV3ZXJJc09uOiBTdWJqZWN0PHtcbiAgICBzcGFjZUlEOiBzdHJpbmcgfCBudWxsO1xuICAgIG1vZGVsM0Q6IHN0cmluZyB8IG51bGw7XG4gICAgc3dlZXA6IHN0cmluZyB8IG51bGw7XG4gICAgcm90YXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IH0gfCBudWxsO1xuICB9PiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHVibGljIGRhdGFJc0xvYWRlZDogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHVibGljIGlzTG9hZGVkID0gZmFsc2U7XG5cbiAgcHVibGljIHNob3dpbmdWaWV3ZXIgPSBmYWxzZTtcblxuICBwdWJsaWMgc3dlZXBUb01vdmU6IHN0cmluZyB8IG51bGw7XG5cbiAgcHVibGljIHJvdGF0aW9uVG9Nb3ZlOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB9IHwgbnVsbDtcblxuICBwdWJsaWMgZ29Ub1RyaWdnZXJlZDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHVibGljIHRvb2xib3hTdGF0ZXMgPSB7XG4gICAgZG9sbGhvdXNlOiB7XG4gICAgICBzdGF0OiBmYWxzZSxcbiAgICAgIGljb25JZDogJ3VpLWRvbGxob3VzZScsXG4gICAgICBzaG93KCkge1xuICAgICAgfSxcbiAgICAgIGhpZGUoKSB7XG4gICAgICB9LFxuICAgIH0sXG4gICAgZmxvb3JwbGFuOiB7XG4gICAgICBzdGF0OiBmYWxzZSxcbiAgICB9LFxuICAgIG1lc3VyZToge1xuICAgICAgc3RhdDogZmFsc2UsXG4gICAgICBpY29uSWQ6ICd1aS1tZXN1cmUnLFxuICAgICAgc2hvdygpIHtcbiAgICAgIH0sXG4gICAgICBoaWRlKCkge1xuICAgICAgfSxcbiAgICB9LFxuICAgIGZpbHRlcjoge1xuICAgICAgc3RhdDogZmFsc2UsXG4gICAgfSxcbiAgfTtcbiAgcHJpdmF0ZSBpc09iamVjdExvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoTUFUVEVSUE9SVF9TREtfS0VZKSBwcml2YXRlIHJlYWRvbmx5IHNka0tleTogc3RyaW5nLFxuICAgIHByaXZhdGUgcG9pU2VydmljZTogUG9pU2VydmljZSxcbiAgICBwcml2YXRlIG1hdHRlcnBvcnRTZXJ2aWNlOiBNYXR0ZXJwb3J0U2VydmljZSxcbiAgICBwcml2YXRlIHRocmVlSnNTZXJ2aWNlOiBUaHJlZUpzU2VydmljZSxcbiAgKSB7XG4gICAgdGhpcy5zZXRNb2RlKCdNYXR0ZXJwb3J0Jyk7XG4gIH1cblxuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICBVdGlsc1xuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICBjaGVja01vZGUoaW5kZXhNb2RlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy52aWV3ZXJNb2RlID09PSBpbmRleE1vZGU7XG4gIH1cblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgU2V0dGVyc1xuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICBzZXRNb2RlKGluZGV4TW9kZTogc3RyaW5nKSB7XG4gICAgLy8gTGVhdmluZyBUaHJlZS5qcyBtZWFucyBubyBUaHJlZS5qcyB3b3JrIHNob3VsZCBzdGlsbCBiZSBydW5uaW5nLiBUaGUgc2VydmljZSBiZWhpbmQgaXQgaXMgYVxuICAgIC8vIHNpbmdsZXRvbiBhbmQgb3V0bGl2ZXMgdGhlIGNvbXBvbmVudCwgc28gYSBkb3dubG9hZCBzdGFydGVkIGZvciBhIG1vZGVsIHRoZSB1c2VyIGhhcyBuYXZpZ2F0ZWRcbiAgICAvLyBhd2F5IGZyb20gd291bGQgb3RoZXJ3aXNlIGZpbmlzaCAtIGFuZCBpdHMgcGFyc2Ugd291bGQgaG9sZCB0aGUgbWFpbiB0aHJlYWQgZm9yIHNlY29uZHMsXG4gICAgLy8gc3RhbGxpbmcgd2hhdGV2ZXIgdmlld2VyIHRoZXkgYWN0dWFsbHkgb3BlbmVkLlxuICAgIGlmICh0aGlzLnZpZXdlck1vZGUgPT09ICd0aHJlZWpzJyAmJiBpbmRleE1vZGUgIT09ICd0aHJlZWpzJykge1xuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5kZXN0cm95KCk7XG4gICAgfVxuICAgIHRoaXMudmlld2VyTW9kZSA9IGluZGV4TW9kZTtcbiAgfVxuXG4gIHNldFRvdXJVcmwob3B0aW9uczoge1xuICAgIG1vZGVsM2Q6IHN0cmluZyxcbiAgICBzaG93SWNvblBsYW4/OiBib29sZWFuLFxuICAgIHNob3dJY29uRG9sbGhvdXNlPzogYm9vbGVhbixcbiAgICBzaG93SWNvbkZsb29ycz86IGJvb2xlYW4sXG4gICAgc2hvd1F1aWNrU3RhcnQ/OiBib29sZWFuLFxuICAgIHNob3dGdWxsc2NyZWVuPzogYm9vbGVhbixcbiAgICBzaG93R3VpZGVkVG91cj86IGJvb2xlYW4sXG4gICAgc2hvd0hpZ2hsaWdodFJlZWw/OiBib29sZWFuLFxuICAgIHNob3dEZWZ1cm5pc2g/OiBib29sZWFuLFxuICAgIHNob3dSb29tTWVhc3VyZW1lbnRzPzogYm9vbGVhblxuICB9KSB7XG4gICAgY29uc3Qge1xuICAgICAgbW9kZWwzZCxcbiAgICAgIHNob3dJY29uUGxhbiA9IHRydWUsXG4gICAgICBzaG93SWNvbkRvbGxob3VzZSA9IHRydWUsXG4gICAgICBzaG93SWNvbkZsb29ycyA9IHRydWUsXG4gICAgICBzaG93UXVpY2tTdGFydCA9IHRydWUsXG4gICAgICBzaG93RnVsbHNjcmVlbiA9IHRydWUsXG4gICAgICBzaG93R3VpZGVkVG91ciA9IHRydWUsXG4gICAgICBzaG93SGlnaGxpZ2h0UmVlbCA9IHRydWUsXG4gICAgICBzaG93RGVmdXJuaXNoID0gdHJ1ZSxcbiAgICAgIHNob3dSb29tTWVhc3VyZW1lbnRzID0gdHJ1ZVxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3QgYmFzZVVybCA9IGAvYXNzZXRzL2J1bmRsZS9zaG93Y2FzZS5odG1sYDtcblxuICAgIGNvbnN0IHBhcmFtczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIE1vZMOobGVcbiAgICBwYXJhbXMucHVzaChgbT0ke21vZGVsM2R9YCk7XG5cbiAgICAvLyBDb21wb3J0ZW1lbnQgZ8OpbsOpcmFsXG4gICAgcGFyYW1zLnB1c2goYHBsYXk9MWApO1xuICAgIHBhcmFtcy5wdXNoKGB1aT0xYCk7XG4gICAgcGFyYW1zLnB1c2goYHRpdGxlPTBgKTtcbiAgICBwYXJhbXMucHVzaChgbG9nPTBgKTtcbiAgICBwYXJhbXMucHVzaChgYnJhbmQ9MGApO1xuICAgIHBhcmFtcy5wdXNoKGBzZWFyY2g9MGApO1xuICAgIHBhcmFtcy5wdXNoKGBhcHBsaWNhdGlvbktleT0ke3RoaXMuc2RrS2V5fWApO1xuICAgIHBhcmFtcy5wdXNoKGBtZHM9MGApO1xuXG4gICAgLy8gUXVpY2sgc3RhcnRcbiAgICBpZiAoc2hvd1F1aWNrU3RhcnQpIHtcbiAgICAgIHBhcmFtcy5wdXNoKGBxcz0xYCk7XG4gICAgfVxuXG4gICAgLy8gRmxvb3JwbGFuIChwbGFuKVxuICAgIGlmICghc2hvd0ljb25QbGFuKSB7XG4gICAgICBwYXJhbXMucHVzaChgZnA9MGApO1xuICAgIH1cblxuICAgIC8vIERvbGxob3VzZSAobWFpc29uL3BvdXDDqWUpXG4gICAgaWYgKCFzaG93SWNvbkRvbGxob3VzZSkge1xuICAgICAgcGFyYW1zLnB1c2goYGRoPTBgKTtcbiAgICB9XG5cbiAgICAvLyBTw6lsZWN0ZXVyIGTigJnDqXRhZ2VzXG4gICAgaWYgKCFzaG93SWNvbkZsb29ycykge1xuICAgICAgcGFyYW1zLnB1c2goYHNmPTBgKTtcbiAgICB9XG5cbiAgICAvLyBHdWlkZWQgdG91clxuICAgIGlmICghc2hvd0d1aWRlZFRvdXIpIHtcbiAgICAgIHBhcmFtcy5wdXNoKGBndD0wYCk7XG4gICAgfVxuXG4gICAgLy8gSGlnaGxpZ2h0IHJlZWwgKGJhbmRlIGR1IGJhcylcbiAgICBpZiAoIXNob3dIaWdobGlnaHRSZWVsKSB7XG4gICAgICAvLyBTZWxvbiB0b24gYnVuZGxlIDogaHI9MSBvdSBocj0wIG1hc3F1ZVxuICAgICAgcGFyYW1zLnB1c2goYGhyPTFgKTtcbiAgICB9XG5cbiAgICAvLyBQbGVpbiDDqWNyYW5cbiAgICBpZiAoIXNob3dGdWxsc2NyZWVuKSB7XG4gICAgICBwYXJhbXMucHVzaChgZnM9MGApO1xuICAgIH1cblxuICAgIC8vIERlZnVybmlzaFxuICAgIGlmIChzaG93RGVmdXJuaXNoKSB7XG4gICAgICBwYXJhbXMucHVzaChgYWQ9MWApO1xuICAgIH1cblxuICAgIC8vIFJvb20gTWVhc3VyZW1lbnRzXG4gICAgaWYgKHNob3dSb29tTWVhc3VyZW1lbnRzKSB7XG4gICAgICBwYXJhbXMucHVzaChgbWVhc3VyZW1lbnRzPTFgKTtcbiAgICB9XG5cbiAgICB0aGlzLnRvdXJVcmwgPSBgJHtiYXNlVXJsfT8ke3BhcmFtcy5qb2luKFwiJlwiKX1gO1xuICB9XG5cbiAgYXN5bmMgY2xlYXJBbGwoKSB7XG4gICAgLy8gdGhpcy5zd2VlcFRvTW92ZSA9IG51bGw7XG4gICAgLy8gdGhpcy5yb3RhdGlvblRvTW92ZSA9IG51bGw7XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2UuZGVzdHJveSgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xuICAgICAgdGhpcy5zaG93aW5nVmlld2VyID0gZmFsc2U7XG4gICAgICB0aGlzLmlzTG9hZGVkID0gZmFsc2U7XG4gICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmNsZWFyQWxsKCk7XG4gICAgICB0aGlzLnZpZXdlcklzT24ubmV4dCh7XG4gICAgICAgIHNwYWNlSUQ6IG51bGwsXG4gICAgICAgIG1vZGVsM0Q6IG51bGwsXG4gICAgICAgIHN3ZWVwOiBudWxsLFxuICAgICAgICByb3RhdGlvbjogbnVsbCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICBHZXR0ZXJzXG4gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gIGdldE1vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMudmlld2VyTW9kZTtcbiAgfVxuXG4gIGdldFZpZXdlclNlbGVjdGVkU2VydmljZSgpIHtcbiAgICAvLyBNYXR0ZXJwb3J0XG4gICAgLy8gaWYgKHRoaXMuY2hlY2tNb2RlKFwiTWF0dGVycG9ydFwiKSkge1xuICAgIC8vICAgICByZXR1cm4gdGhpcy5nZXRNYXR0ZXJwb3J0U2VydmljZSgpO1xuICAgIC8vIH1cbiAgICByZXR1cm4gdGhpcy5nZXRNYXR0ZXJwb3J0U2VydmljZSgpO1xuICB9XG5cbiAgZ2V0VG91clVybCgpIHtcbiAgICByZXR1cm4gdGhpcy50b3VyVXJsO1xuICB9XG5cbiAgZ2V0TWF0dGVycG9ydFNlcnZpY2UoKSB7XG4gICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFNlcnZpY2U7XG4gIH1cblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgR2VuZXJpYyBNYWluIGFjdGlvbiBmdW5jdGlvbnNcbiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG4gIHNldFN3ZWVwVG9Nb3ZlKHN3ZWVwOiBzdHJpbmcpIHtcbiAgICB0aGlzLnN3ZWVwVG9Nb3ZlID0gc3dlZXA7XG4gIH1cblxuICBzZXRSb3RhdGlvblRvTW92ZShyb3RhdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgfSkge1xuICAgIHRoaXMucm90YXRpb25Ub01vdmUgPSByb3RhdGlvbjtcbiAgfVxuXG5cbiAgYXN5bmMgYWN0aW9uX21vdmVfdG9fdGFnKGVsZW1lbnRJZDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gTWF0dGVycG9ydFxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldFRhZ0Zyb21FbGVtZW50SWQoZWxlbWVudElkKTtcbiAgICAgIGlmIChyZXN1bHQudGFnKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ29Ub1RhZyhyZXN1bHQudGFnKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAocmVzdWx0LnN3ZWVwKSB7XG4gICAgICAgIHRoaXMuc3dlZXBUb01vdmUgPSByZXN1bHQuc3dlZXA7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIE1hdHRlcnRhZ3MgdG8gVmlld2VyXG4gICAqIEBwYXJhbSBvYmplY3RzIExpc3Qgb2Ygb2JqZWN0cyAodGlja2V0cywgZXF1aXBtZW50cykgZXRjIHRvIGJlIGFkZGVkIGFzIE1hdHRlcnRhZ3NcbiAgICovXG4gIGFzeW5jIGFkZE9iamVjdFRhZ3NUb1ZpZXdlcihvYmplY3RzOiBEYk9iamVjdFR5cGVbXSkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgb2JqZWN0cy5tYXAoYXN5bmMgKG9iamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBwb2kgPSBhd2FpdCB0aGlzLnBvaVNlcnZpY2UuZ2V0UG9pQnlFbGVtZW50SWQob2JqZWN0LmlkISk7XG4gICAgICAgIGlmIChwb2kgJiYgcG9pLmNvb3JkaW5hdGUpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmFjdGlvbkFkZE9iamVjdEZyb21QT0kob2JqZWN0LCBwb2kpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gICAgLy8gTmV3bHkgY3JlYXRlZCB0YWdzIGhhdmUgbm8gb3BhY2l0eS9hbGxvd0FjdGlvbiBhcHBsaWVkIHlldCAob25seSBzZXQgYnlcbiAgICAvLyB1cGRhdGVUYWdzVmlzaWJpbGl0eUZvckNvbnRleHQsIHdoaWNoIHJ1bnMgb24gTW9kZS9Td2VlcC9GbG9vci9Sb29tL0NhbWVyYVxuICAgIC8vIGV2ZW50cykuIElmIHRoaXMgYmF0Y2ggbG9hZGVkIGFmdGVyIHRob3NlIGZpcmVkLCB0aGUgdGFncyBzdGF5IGluIHdoYXRldmVyXG4gICAgLy8gZGVmYXVsdCBzdGF0ZSB0aGUgU0RLIGdhdmUgdGhlbSB1bnRpbCBzb21ldGhpbmcgZWxzZSBudWRnZXMgYSByZWZyZXNoLlxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLnJlZnJlc2hUYWdzVmlzaWJpbGl0eSgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFjdGlvbkFkZE9iamVjdEZyb21QT0kob2JqZWN0OiBEYk9iamVjdFR5cGUsIHBvaTogUE9JKSB7XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcbiAgICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmNyZWF0ZU1hdHRlcnRhZ0Zyb21QT0koXG4gICAgICAgIHBvaS50eXBlISxcbiAgICAgICAgb2JqZWN0LFxuICAgICAgICBwb2lcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XG4gICAgICByZXR1cm4gdGhpcy5hZGRUaHJlZUpzVGFnRnJvbVBPSShvYmplY3QsIHBvaSk7XG4gICAgfVxuICAgIC8vIEN1cGl4XG4gICAgLy8gVE9ET1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmF3cyBhIFBPSSBhcyBhIHRhZyBpbiB0aGUgVGhyZWUuanMgc2NlbmUuXG4gICAqXG4gICAqIEJvdGggdmlld2VycyBhcmUgZmVkIGJ5IHRoZSBzYW1lIHN1YnNjcmlwdGlvbnMgb24gdGhlIHNhbWUgUE9JIHJlY29yZHMsIHNvIGEgdGFnIGNyZWF0ZWQgaW5cbiAgICogZWl0aGVyIG9uZSBzaG93cyB1cCBpbiB0aGUgb3RoZXIgd2l0aG91dCBhbnkgc3luY2luZyBvZiBpdHMgb3duIC0gdGhpcyBpcyBqdXN0IHRoZSBUaHJlZS5qcyBlbmRcbiAgICogb2YgdGhlIHBpcGVsaW5lIHRoYXQgYWxyZWFkeSBkcml2ZXMgTWF0dGVycG9ydC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYWRkVGhyZWVKc1RhZ0Zyb21QT0kob2JqZWN0OiBEYk9iamVjdFR5cGUsIHBvaTogUE9JKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFwb2kuY29vcmRpbmF0ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgcG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xuICAgIHRyeSB7XG4gICAgICBwb3NpdGlvbiA9IEpTT04ucGFyc2UocG9pLmNvb3JkaW5hdGUpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgY29uc29sZS53YXJuKGBWaWV3ZXJTZXJ2aWNlOiB1bnBhcnNlYWJsZSBQT0kgY29vcmRpbmF0ZSBmb3IgZWxlbWVudCAke29iamVjdC5pZH06YCwgcG9pLmNvb3JkaW5hdGUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIVtwb3NpdGlvbj8ueCwgcG9zaXRpb24/LnksIHBvc2l0aW9uPy56XS5ldmVyeSgodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy50aHJlZUpzU2VydmljZS51cHNlcnRUYWcoe1xuICAgICAgaWQ6IG9iamVjdC5pZCxcbiAgICAgIHBvc2l0aW9uLFxuICAgICAgcG9pVHlwZTogcG9pLnR5cGUsXG4gICAgICBpY29uVXJsOiBwb2kudGFnSWNvbiA/IGF3YWl0IGdldFNpZ25lZEZpbGUocG9pLnRhZ0ljb24pIDogbnVsbCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBNb3ZlcyB0aGUgVGhyZWUuanMgY2FtZXJhIHRvIGZyYW1lIGEgdGFnLCBtaXJyb3JpbmcgTWF0dGVycG9ydCdzIGdvVG9UYWcuICovXG4gIGdvVG9UaHJlZUpzVGFnKGVsZW1lbnRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2UuZ29Ub1RhZyhlbGVtZW50SWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTaG93cyBvbmx5IHRhZ3Mgb2YgdGhlIGdpdmVuIFBPSSB0eXBlczsgbnVsbCBjbGVhcnMgdGhlIGZpbHRlci4gKi9cbiAgc2V0VmlzaWJsZVRocmVlSnNUYWdUeXBlcyh0eXBlczogUG9pVHlwZVtdIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLnNldFZpc2libGVUYWdUeXBlcyh0eXBlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFsaWdubWVudCB3YWxrdGhyb3VnaDogcGljayBhIHRhZywgdGhlbiBjbGljayB3aGVyZSBpdCByZWFsbHkgc2l0cywgdGhyZWUgdGltZXMgb3Zlci5cbiAgICpcbiAgICogVXNlcyB0YWdzIHRoYXQgYWxyZWFkeSBleGlzdCwgc28gbm90aGluZyBpcyBjcmVhdGVkIGFuZCBub3RoaW5nIGlzIHdyaXR0ZW4gdW50aWwgdGhlIGNhbGxlclxuICAgKiBzYXZlcyB0aGUgcmVzdWx0LiBTZWUgdGhyZWVKc0FsaWdubWVudFByb2dyZXNzJCBmb3Igd2hhdCB0aGUgVUkgc2hvdWxkIGJlIGFza2luZyBmb3IuXG4gICAqL1xuICBzdGFydFRocmVlSnNUYWdBbGlnbm1lbnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2Uuc3RhcnRUYWdBbGlnbm1lbnQoKTtcbiAgICB9XG4gIH1cblxuICBjYW5jZWxUaHJlZUpzVGFnQWxpZ25tZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmNhbmNlbFRhZ0FsaWdubWVudCgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCB0aHJlZUpzQWxpZ25tZW50UHJvZ3Jlc3MkKCkge1xuICAgIHJldHVybiB0aGlzLnRocmVlSnNTZXJ2aWNlLmFsaWdubWVudFByb2dyZXNzJDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb2x2ZXMgdGhlIGFsaWdubWVudCBhbmQgYXBwbGllcyBpdCB0byB0aGUgc2NlbmUsIHJldHVybmluZyBpdCBhcyB0aGUgSlNPTiB0byBzdG9yZSBpbiB0aGVcbiAgICogY2FwdHVyZSdzIG1ldGFkYXRhLiBOdWxsIG1lYW5zIHRoZSB0aHJlZSB0YWdzIHdlcmUgY29sbGluZWFyIGFuZCBub3RoaW5nIHdhcyBhcHBsaWVkLlxuICAgKi9cbiAgc29sdmVUaHJlZUpzVGFnQWxpZ25tZW50KGV4aXN0aW5nTWV0YWRhdGE/OiBzdHJpbmcpOiB7IGFsaWdubWVudDogYW55OyBtZXRhZGF0YTogc3RyaW5nIH0gfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBhbGlnbm1lbnQgPSB0aGlzLnRocmVlSnNTZXJ2aWNlLnNvbHZlQWxpZ25tZW50RnJvbVBhaXJzKCk7XG4gICAgaWYgKCFhbGlnbm1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvLyBNZXJnZWQgaW50byB3aGF0ZXZlciB0aGUgY2FwdHVyZSBhbHJlYWR5IHN0b3Jlcywgc28gYW4gZXhpc3RpbmcgY2FtZXJhIHBsYWNlbWVudCBzdXJ2aXZlcy5cbiAgICBsZXQgc3RvcmVkOiBhbnkgPSB7fTtcbiAgICB0cnkge1xuICAgICAgc3RvcmVkID0gZXhpc3RpbmdNZXRhZGF0YSA/IEpTT04ucGFyc2UoZXhpc3RpbmdNZXRhZGF0YSkgOiB7fTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHN0b3JlZCA9IHt9O1xuICAgIH1cbiAgICBzdG9yZWQuYWxpZ25tZW50ID0gYWxpZ25tZW50O1xuICAgIHJldHVybiB7IGFsaWdubWVudCwgbWV0YWRhdGE6IEpTT04uc3RyaW5naWZ5KHN0b3JlZCkgfTtcbiAgfVxuXG4gIC8qKiBTaG93cyBvciBoaWRlcyBhIHNpbmdsZSBUaHJlZS5qcyB0YWcuICovXG4gIHNldFRocmVlSnNUYWdWaXNpYmlsaXR5KGVsZW1lbnRJZDogc3RyaW5nLCB2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2Uuc2V0VGFnVmlzaWJpbGl0eShlbGVtZW50SWQsIHZpc2libGUpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFjdGlvbl9kZWxldGVfZWxlbWVudChlbGVtZW50OiBEYk9iamVjdFR5cGUpIHtcbiAgICAvLyBNYXR0ZXJwb3J0XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcbiAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZGVsZXRlTWF0dGVydGFnRm9yT2JqZWN0KGVsZW1lbnQuaWQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5yZW1vdmVUYWcoZWxlbWVudC5pZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEVtaXRzIHdoZW4gYSBUaHJlZS5qcyBtb2RlbCBsb2FkIGFjdHVhbGx5IHN0b3BwZWQgc2hvcnQsIHJhdGhlciB0aGFuIG1lcmVseSBiZWluZyBhc2tlZCB0by4gKi9cbiAgZ2V0IHRocmVlSnNNb2RlbExvYWRDYW5jZWxsZWQkKCkge1xuICAgIHJldHVybiB0aGlzLnRocmVlSnNTZXJ2aWNlLm1vZGVsTG9hZENhbmNlbGxlZCQ7XG4gIH1cblxuICAvKiogU3RvcHMgdGhlIFRocmVlLmpzIG1vZGVsIGRvd25sb2FkIGluIHByb2dyZXNzLiAqL1xuICBjYW5jZWxUaHJlZUpzTW9kZWxMb2FkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmNhbmNlbE1vZGVsTG9hZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBFbWl0cyB0aGUgZWxlbWVudCBpZCBvZiBhIHRhZyBjbGlja2VkIGluIHRoZSBUaHJlZS5qcyBzY2VuZS4gKi9cbiAgZ2V0IHRocmVlSnNUYWdDbGlja2VkJCgpIHtcbiAgICByZXR1cm4gdGhpcy50aHJlZUpzU2VydmljZS50YWdDbGlja2VkJDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHRoZSB2aXNpdCdzIHN0b3JlZCB0YWcgYWxpZ25tZW50LCBtYXBwaW5nIGNhcHR1cmVkIHRhZyBjb29yZGluYXRlcyBvbnRvIHRoaXMgbW9kZWwuXG4gICAqXG4gICAqIFNhZmUgdG8gY2FsbCBiZWZvcmUgdGhlIG1vZGVsIG9yIGFueSB0YWcgZXhpc3RzOiBpdCBpcyBhIHRyYW5zZm9ybSBvbiB0aGUgZ3JvdXAgYm90aCBlbmQgdXBcbiAgICogdW5kZXIsIHNvIGl0IGFwcGxpZXMgdG8gd2hhdGV2ZXIgYXJyaXZlcyBsYXRlci5cbiAgICovXG4gIHNldFRocmVlSnNUYWdBbGlnbm1lbnRGcm9tTWV0YWRhdGEobWV0YWRhdGE6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLnNldFRhZ0FsaWdubWVudChwYXJzZVRocmVlSnNQbGFjZW1lbnQobWV0YWRhdGEpPy5hbGlnbm1lbnQgPz8gbnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlIHRhZyBwbGFjZW1lbnQgbWVudSB0byBhZGQgYSBuZXcgZWxlbWVudCBkZXBlbmRpbmcgb24gaXRzIHR5cGUgKFRJQ0tFVCwgREFUQSwgRVFVSVBNRU5UIGV0YylcbiAgICovXG4gIGFzeW5jIGFjdGlvbkFkZE5ld0VsZW1lbnRUb1ZpZXdlcihwb2lUeXBlOiBQb2lUeXBlKSB7XG4gICAgdGhpcy5hY3Rpb25fdG9vbGJveF9pbnNpZGVfdmlldygpO1xuXG4gICAgLy8gTWF0dGVycG9ydFxuICAgIGlmIChcbiAgICAgIHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykgJiZcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0SW50ZXJhY3Rpb25Nb2RlKCkgPT09IFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUXG4gICAgKSB7XG4gICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmFkZE1hdHRlcnRhZ1doZW5BZGRpbmcocG9pVHlwZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLnN0YXJ0VGFnUGxhY2VtZW50KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExhdW5jaGVzIHRoZSByZXBvc2l0aW9uaW5nIG9mIGFuIGV4aXN0aW5nIE1hdHRlcnRhZyByZWxhdGVkIHRvIHBhcmFtZXRlciBvYmplY3RcbiAgICogQHBhcmFtIGVsZW1lbnQgb2JqZWN0IChUSUNLRVQsIEVRVUlQTUVOVCwgRkVBVFVSRSwgZXRjKVxuICAgKiBAcGFyYW0gcG9pVHlwZSB0eXBlIG9mIG9iamVjdFxuICAgKi9cbiAgYXN5bmMgYWN0aW9uUmVwb3NpdGlvbkVsZW1lbnRJblZpZXdlcihcbiAgICBlbGVtZW50OiBEYk9iamVjdFR5cGUsXG4gICAgcG9pVHlwZTogUG9pVHlwZVxuICApIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpICYmXG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldEludGVyYWN0aW9uTW9kZSgpID09PSBWaWV3ZXJJbnRlcmFjdGlvbnMuREVGQVVMVFxuICAgICkge1xuICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5hZGRNYXR0ZXJ0YWdXaGVuUmVwb3NpdGlvbmluZyhwb2lUeXBlLCBlbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlIHRpY2tldCBwbGFjZW1lbnQgbWVudSB0byBhZGQgYSBuZXcgdGlja2V0XG4gICAqL1xuICBhY3Rpb25fY2FuY2VsZWQoKSB7XG4gICAgLy8gTWF0dGVycG9ydFxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmNhbmNlbEZvbGxvd2luZ0N1cnNvcigpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5jYW5jZWxUYWdQbGFjZW1lbnQoKTtcbiAgICB9XG4gIH1cblxuICBhY3Rpb25fdG9vbGJveF9pbnNpZGVfdmlldygpIHtcbiAgICAvLyBNYXR0ZXJwb3J0XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuYWN0aW9uX3Rvb2xib3hfaW5zaWRlX3ZpZXcoKTtcbiAgICB9XG4gIH1cblxuICBhY3Rpb25TaG93QWxsRmxvb3JzKCkge1xuICAgIC8vIE1hdHRlcnBvcnRcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5hY3Rpb25TaG93QWxsRmxvb3JzKCk7XG4gICAgfVxuICB9XG5cbiAgYWN0aW9uX3Rvb2xib3hfZG9sbGhvdXNlKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0SW50ZXJhY3Rpb25Nb2RlKCkgIT09IFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUXG4gICAgKSB7XG4gICAgICB0aGlzLmFjdGlvbl9jYW5jZWxlZCgpO1xuICAgIH1cblxuICAgIHRoaXMuYWN0aW9uX3Rvb2xib3hfY2FuY2VsX21lc3VyZSgpO1xuICAgIC8vIE1hdHRlcnBvcnRcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5hY3Rpb25fdG9vbGJveF9kb2xsaG91c2UoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhY3Rpb25fZmxvb3JwbGFuKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0SW50ZXJhY3Rpb25Nb2RlKCkgIT09IFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUXG4gICAgKSB7XG4gICAgICB0aGlzLmFjdGlvbl9jYW5jZWxlZCgpO1xuICAgIH1cbiAgICAvLyBNYXR0ZXJwb3J0XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcbiAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuYWN0aW9uX3Rvb2xib3hfZmxvb3JwbGFuKCk7XG4gICAgfVxuICB9XG5cbiAgYWN0aW9uX3Rvb2xib3hfbWVzdXJlKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0SW50ZXJhY3Rpb25Nb2RlKCkgIT09IFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUXG4gICAgKSB7XG4gICAgICB0aGlzLmFjdGlvbl9jYW5jZWxlZCgpO1xuICAgIH1cblxuICAgIHRoaXMuYWN0aW9uX3Rvb2xib3hfaW5zaWRlX3ZpZXcoKTtcbiAgICAvLyBNYXR0ZXJwb3J0XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuYWN0aW9uX3Rvb2xib3hfbWVzdXJlKCk7XG4gICAgfVxuICB9XG5cbiAgYWN0aW9uX3Rvb2xib3hfY2FuY2VsX21lc3VyZSgpIHtcbiAgICAvLyBNYXR0ZXJwb3J0XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuYWN0aW9uX3Rvb2xib3hfY2FuY2VsX21lc3VyZSgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFjdGlvbl91cGRhdGVfcG9pKFxuICAgIHBvaTogUE9JLFxuICAgIGlzVmFsaWQ6IGJvb2xlYW4sXG4gICAgZWxlbWVudDogRGJPYmplY3RUeXBlXG4gICk6IFByb21pc2U8UE9JPiB7XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcbiAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgIGNvbnN0IGxhc3RUYWcgPSB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLm1hdHRlcnRhZ1RvRm9sbG93XG4gICAgICAgICAgPyB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLm1hdHRlcnRhZ1RvRm9sbG93XG4gICAgICAgICAgOiB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldExhc3RUYWcoKTtcbiAgICAgICAgaWYgKCFsYXN0VGFnKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwb2kpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhZ0RhdGEgPSB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldE1hdHRlclRhZ0RhdGFGb3JNYXR0ZXJ0YWcobGFzdFRhZyk7XG4gICAgICAgIGlmICghdGFnRGF0YSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocG9pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBvaU1ldGFkYXRhID0gKCEhcG9pICYmIHBvaS5tZXRhZGF0YSkgPyBKU09OLnBhcnNlKHBvaS5tZXRhZGF0YSkgOiB7fTtcbiAgICAgICAgcG9pTWV0YWRhdGEubm9ybWFsID0gdGFnRGF0YS5nZXROb3JtYWwoKTtcbiAgICAgICAgaWYgKCFwb2kpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwb2lJbnB1dCA9IHtcbiAgICAgICAgICBpZDogcG9pLmlkLFxuICAgICAgICAgIGNvb3JkaW5hdGU6IHRhZ0RhdGEuZ2V0Q29vcmRpbmF0ZVN0cmluZygpLFxuICAgICAgICAgIG1hdHRlcnBvcnRTd2VlcElEOiB0YWdEYXRhLmdldFN3ZWVwSUQoKSxcbiAgICAgICAgICBtZXRhZGF0YTogSlNPTi5zdHJpbmdpZnkocG9pTWV0YWRhdGEpLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB1cGRhdGVkUG9pOiBQT0kgPSBhd2FpdCB0aGlzLnBvaVNlcnZpY2UudXBkYXRlUG9pKHBvaUlucHV0KTtcbiAgICAgICAgdGFnRGF0YS5zZXRQb2kodXBkYXRlZFBvaSk7XG4gICAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFNlcnZpY2Uuc2V0T2JqZWN0QW5kUG9pSW5UYWcobGFzdFRhZywgZWxlbWVudCwgUG9pVHlwZS5ERVNLLCB1cGRhdGVkUG9pKTtcbiAgICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5pbmplY3RIdG1sSW5UYWcoXG4gICAgICAgICAgcG9pLnR5cGUhLFxuICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgbGFzdFRhZ1xuICAgICAgICApO1xuICAgICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLnNldFRhZ0ljb25BbmRPcGFjaXR5KGxhc3RUYWcsIHRhZ0RhdGEpO1xuICAgICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdvVG9UYWcobGFzdFRhZyk7XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1cGRhdGVkUG9pKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZGVsZXRlTGFzdE1hdHRlcnRhZygpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwb2kpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21taXRUaHJlZUpzVGFnUGxhY2VtZW50KHBvaSwgaXNWYWxpZCwgZWxlbWVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwb2kpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyB0aGUgc3BvdCBwaWNrZWQgaW4gdGhlIFRocmVlLmpzIHNjZW5lIGludG8gdGhlIFBPSSwgbWlycm9yaW5nIHRoZSBNYXR0ZXJwb3J0IGJyYW5jaC5cbiAgICpcbiAgICogVGhlIGNvb3JkaW5hdGUgZ29lcyBpbiB0aGUgc2FtZSBmaWVsZCBhbmQgdGhlIHNhbWUgc3BhY2UgTWF0dGVycG9ydCB3cml0ZXMsIHdoaWNoIGlzIHdoYXQgbWFrZXNcbiAgICogYSB0YWcgY3JlYXRlZCBoZXJlIHNob3cgdXAgaW4gdGhlIHJpZ2h0IHBsYWNlIHRoZXJlIC0gYW5kIHRoZSBvdGhlciB3YXkgcm91bmQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNvbW1pdFRocmVlSnNUYWdQbGFjZW1lbnQoXG4gICAgcG9pOiBQT0ksXG4gICAgaXNWYWxpZDogYm9vbGVhbixcbiAgICBlbGVtZW50OiBEYk9iamVjdFR5cGVcbiAgKTogUHJvbWlzZTxQT0k+IHtcbiAgICBjb25zdCBwbGFjZW1lbnQgPSB0aGlzLnRocmVlSnNTZXJ2aWNlLmdldFBlbmRpbmdUYWdQbGFjZW1lbnQoKTtcbiAgICBpZiAoIWlzVmFsaWQgfHwgIXBsYWNlbWVudCB8fCAhcG9pKSB7XG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmNhbmNlbFRhZ1BsYWNlbWVudCgpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwb2kpO1xuICAgIH1cblxuICAgIGNvbnN0IHBvaU1ldGFkYXRhID0gcG9pLm1ldGFkYXRhID8gSlNPTi5wYXJzZShwb2kubWV0YWRhdGEpIDoge307XG4gICAgcG9pTWV0YWRhdGEubm9ybWFsID0gcGxhY2VtZW50Lm5vcm1hbDtcblxuICAgIGNvbnN0IHVwZGF0ZWRQb2kgPSBhd2FpdCB0aGlzLnBvaVNlcnZpY2UudXBkYXRlUG9pKHtcbiAgICAgIGlkOiBwb2kuaWQsXG4gICAgICBjb29yZGluYXRlOiBKU09OLnN0cmluZ2lmeShwbGFjZW1lbnQucG9zaXRpb24pLFxuICAgICAgbWV0YWRhdGE6IEpTT04uc3RyaW5naWZ5KHBvaU1ldGFkYXRhKSxcbiAgICAgIC8vIG1hdHRlcnBvcnRTd2VlcElEIGlzIGxlZnQgYXMgaXQgd2FzOiB0aGlzIHZpZXdlciBoYXMgbm8gc3dlZXBzLCBhbmQgTWF0dGVycG9ydCBmaWx0ZXJzIHRhZ1xuICAgICAgLy8gdmlzaWJpbGl0eSBieSB0aGVtLCBzbyBjbGVhcmluZyBpdCB3b3VsZCBoaWRlIHRoZSB0YWcgb3ZlciB0aGVyZS5cbiAgICB9KTtcblxuICAgIHRoaXMudGhyZWVKc1NlcnZpY2UudXBzZXJ0VGFnKHtcbiAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgcG9zaXRpb246IHBsYWNlbWVudC5wb3NpdGlvbixcbiAgICAgIHBvaVR5cGU6IHVwZGF0ZWRQb2k/LnR5cGUgPz8gcG9pLnR5cGUsXG4gICAgICBpY29uVXJsOiB1cGRhdGVkUG9pPy50YWdJY29uID8gYXdhaXQgZ2V0U2lnbmVkRmlsZSh1cGRhdGVkUG9pLnRhZ0ljb24pIDogbnVsbCxcbiAgICB9KTtcbiAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmNhbmNlbFRhZ1BsYWNlbWVudCgpO1xuXG4gICAgcmV0dXJuIHVwZGF0ZWRQb2k7XG4gIH1cblxuICAvKiogRW1pdHMgd2hlbiBhIHRhZyBpcyBkcm9wcGVkIG9uIHRoZSBtb2RlbCBpbiB0aGUgVGhyZWUuanMgc2NlbmUuICovXG4gIGdldCB0aHJlZUpzVGFnUGxhY2VkJCgpIHtcbiAgICByZXR1cm4gdGhpcy50aHJlZUpzU2VydmljZS50YWdQbGFjZWQkO1xuICB9XG5cbiAgLyoqIExlYXZlcyBUaHJlZS5qcyB0YWcgcGxhY2VtZW50IG1vZGUgd2l0aG91dCBwbGFjaW5nIGFueXRoaW5nLiAqL1xuICBjYW5jZWxUaHJlZUpzVGFnUGxhY2VtZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmNhbmNlbFRhZ1BsYWNlbWVudCgpO1xuICAgIH1cbiAgfVxuXG4gIGVkaXRPbmx5VGFnU3R5bGVGb3JQb2kocG9pOiBQT0ksIG9iamVjdDogRGJPYmplY3RUeXBlKSB7XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcbiAgICAgIGNvbnN0IHRhZ0RhdGEgPSB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldFRhZ0Zyb21FbGVtZW50SWQocG9pLmVsZW1lbnRJRCk7XG4gICAgICBpZiAodGFnRGF0YS50YWcpIHtcbiAgICAgICAgY29uc3QgbWF0dGVydGFnRGF0YSA9IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0TWF0dGVyVGFnRGF0YUZvck1hdHRlcnRhZyhcbiAgICAgICAgICB0YWdEYXRhLnRhZ1xuICAgICAgICApO1xuICAgICAgICBtYXR0ZXJ0YWdEYXRhLnNldE9iamVjdChvYmplY3QsIFBvaVR5cGUuUk9PTSk7XG4gICAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2Uuc2V0VGFnSWNvbkFuZE9wYWNpdHkodGFnRGF0YS50YWcsIG1hdHRlcnRhZ0RhdGEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFkZEljb25BbmRTZXRGb3JQb2kocG9pOiBQT0ksIGljb25QYXRoOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xuICAgICAgY29uc3QgdGFnRGF0YSA9IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0VGFnRnJvbUVsZW1lbnRJZChwb2kuZWxlbWVudElEKTtcbiAgICAgIGlmICh0YWdEYXRhLnRhZykge1xuICAgICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmFkZE5ld0ljb25BbmRTZXRGb3JUYWcodGFnRGF0YS50YWcsIGljb25QYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjaGFuZ2VUb1JlZ2lzdHJlZEljb25Gb3JQb2kocG9pOiBQT0ksIGljb25OYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xuICAgICAgY29uc3QgdGFnRGF0YSA9IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0VGFnRnJvbUVsZW1lbnRJZChwb2kuZWxlbWVudElEKTtcbiAgICAgIGlmICh0YWdEYXRhLnRhZykge1xuICAgICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLnNldFJlZ2lzdHJlZEljb25Gb3JUYWcodGFnRGF0YS50YWcsIGljb25OYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBhc3luYyB1cGRhdGVIdG1sVGFnRm9yUG9pV2l0aE9iamVjdChwb2k6IFBPSSwgb2JqZWN0OiBEYk9iamVjdFR5cGUpIHtcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xuICAgICAgY29uc3QgdGFnRGF0YSA9IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0VGFnRnJvbUVsZW1lbnRJZChwb2kuZWxlbWVudElEKTtcbiAgICAgIGlmICh0YWdEYXRhLnRhZykge1xuICAgICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLnVwZGF0ZUluamVjdGVkSHRtbEZvclRhZ0lEKFxuICAgICAgICAgIHRhZ0RhdGEudGFnLFxuICAgICAgICAgIG9iamVjdCxcbiAgICAgICAgICBwb2kudHlwZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIGFuIGV4aXN0aW5nIHBvaSBpbiBNYXR0ZXJwb3J0XG4gICAqIEBwYXJhbSBwb2lcbiAgICogQHBhcmFtIGVsZW1lbnRcbiAgICovXG4gIGFzeW5jIGFjdGlvbl9tb3ZlX3BvaV92aXN1YWxseShcbiAgICBwb2k6IFBPSSxcbiAgICBlbGVtZW50OiBUaWNrZXQgfCBGZWF0dXJlIHwgRXF1aXBtZW50IHwgQ29tbWVudFxuICApIHtcbiAgICBhd2FpdCB0aGlzLmFjdGlvbl9kZWxldGVfZWxlbWVudChlbGVtZW50KTtcbiAgICBhd2FpdCB0aGlzLmFjdGlvbkFkZE9iamVjdEZyb21QT0koZWxlbWVudCwgcG9pKTtcbiAgfVxuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBDdXBpeFxuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgTWF0dGVycG9ydFxuICAgIGh0dHBzOi8vbWF0dGVycG9ydC5naXRodWIuaW8vc2hvd2Nhc2Utc2RrL2RvY3Mvc2RrL3JlZmVyZW5jZS9jdXJyZW50L21vZHVsZXMvbWF0dGVydGFnLmh0bWwjYWRkXG4gICAgaHR0cHM6Ly9tYXR0ZXJwb3J0LmdpdGh1Yi5pby9zaG93Y2FzZS1zZGsvZG9jcy9zZGsvcmVmZXJlbmNlL2N1cnJlbnQvbW9kdWxlcy9tYXR0ZXJ0YWcuaHRtbCNyZW1vdmVcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICBpbml0VGhyZWVKcyhjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2UuaW5pdChjYW52YXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhIDNEIG1vZGVsIGludG8gdGhlIFRocmVlLmpzIHNjZW5lIChHTFRGKS5cbiAgICogT25seSB3b3JrcyB3aGVuIHRoZSB2aWV3ZXIgaXMgaW4gJ3RocmVlanMnIG1vZGUuXG4gICAqL1xuICBsb2FkR0xURk1vZGVsKHVybDogc3RyaW5nLCBjYW1lcmFQb3NpdGlvbj86IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSwgcm90YXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5sb2FkR0xURk1vZGVsKHVybCwgY2FtZXJhUG9zaXRpb24sIHJvdGF0aW9uKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgYSBHTEIgc3RvcmVkIGluIFMzLCBnaXZlbiBpdHMga2V5IChlLmcuIGB2aXNpdHMvPGlkPi9tb2RlbC5nbGJgKS5cbiAgICpcbiAgICogUmVzb2x2ZXMgdGhlIGtleSB0byBhIHNpZ25lZCBVUkwgZmlyc3QsIHRoZW4gbG9hZHMgaXQgbGlrZSBhbnkgb3RoZXIuIFRoZSBzaWduZWQgVVJMIG9ubHlcbiAgICogY292ZXJzIGF1dGhlbnRpY2F0aW9uIC0gdGhlIGJ1Y2tldCBzdGlsbCBuZWVkcyBhIENPUlMgcnVsZSBhbGxvd2luZyBHRVQgZnJvbSB0aGUgYXBwJ3Mgb3JpZ2luLFxuICAgKiBvciB0aGUgYnJvd3NlciBibG9ja3MgdGhlIGRvd25sb2FkIGJlZm9yZSBpdCBzdGFydHMuXG4gICAqXG4gICAqIGBwbGFjZW1lbnRNZXRhZGF0YWAgaXMgdGhlIGNhcHR1cmUncyBzdG9yZWQgcGxhY2VtZW50OyB3aGVuIGFic2VudCBvciB1bnVzYWJsZSB0aGUgdmlld2VyIGZhbGxzXG4gICAqIGJhY2sgdG8gZnJhbWluZyB0aGUgbW9kZWwgYXV0b21hdGljYWxseS5cbiAgICovXG4gIGFzeW5jIGxvYWRHTFRGTW9kZWxGcm9tUzMoa2V5OiBzdHJpbmcsIHBsYWNlbWVudE1ldGFkYXRhPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEEga2V5IHVuZGVyIGFzc2V0cy8gaXMgc2VydmVkIGJ5IHRoZSBhcHAgaXRzZWxmLCBzbyBpdCBuZWVkcyBubyBzaWduaW5nLiBUaGlzIGlzIHdoYXQgbGV0cyBhXG4gICAgLy8gbW9kZWwgYnVuZGxlZCB3aXRoIHRoZSBidWlsZCBzdGFuZCBpbiBmb3Igb25lIGluIFMzIHdoaWxlIHRoZSB0d28gYXJlIG90aGVyd2lzZSBpZGVudGljYWwuXG4gICAgY29uc3QgaXNMb2NhbEFzc2V0ID0ga2V5LnN0YXJ0c1dpdGgoJ2Fzc2V0cy8nKTtcbiAgICBjb25zdCB1cmwgPSBpc0xvY2FsQXNzZXQgPyBrZXkgOiBhd2FpdCBnZXRTaWduZWRGaWxlKGtleSk7XG4gICAgaWYgKCF1cmwpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFZpZXdlclNlcnZpY2U6IGNvdWxkIG5vdCByZXNvbHZlIGEgc2lnbmVkIFVSTCBmb3IgdGhlIDNEIG1vZGVsIGF0IFwiJHtrZXl9XCIuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBsYWNlbWVudCA9IHBhcnNlVGhyZWVKc1BsYWNlbWVudChwbGFjZW1lbnRNZXRhZGF0YSk7XG4gICAgdGhpcy50aHJlZUpzU2VydmljZS5sb2FkR0xURk1vZGVsKHVybCwgcGxhY2VtZW50Py5jYW1lcmFQb3NpdGlvbiwgcGxhY2VtZW50Py5yb3RhdGlvbik7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgYSAzRCBtb2RlbCBpbnRvIHRoZSBUaHJlZS5qcyBzY2VuZSAoT0JKKS5cbiAgICovXG4gIGxvYWRPYmpNb2RlbChtdGxVcmw6IHN0cmluZywgb2JqVXJsOiBzdHJpbmcsIGNhbWVyYVBvc2l0aW9uPzoge3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJ9LCByb3RhdGlvbj86IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmxvYWRPYmpNb2RlbChtdGxVcmwsIG9ialVybCwgY2FtZXJhUG9zaXRpb24sIHJvdGF0aW9uKTtcbiAgICB9XG4gIH1cblxuICBnZXQgdGhyZWVKc09iamVjdEhvdmVyZWQkKCkge1xuICAgIHJldHVybiB0aGlzLnRocmVlSnNTZXJ2aWNlLm9iamVjdEhvdmVyZWQkO1xuICB9XG5cbiAgZ2V0IHRocmVlSnNPYmplY3RDbGlja2VkJCgpIHtcbiAgICByZXR1cm4gdGhpcy50aHJlZUpzU2VydmljZS5vYmplY3RDbGlja2VkJDtcbiAgfVxuXG4gIC8qKiBFbWl0cyB0cnVlIHdoaWxlIGEgaGVhdnkgLm9iaiBmaWxlIGlzIGJlaW5nIHBhcnNlZCAoaW4gYSB3b3JrZXIsIHdoZW4gYXZhaWxhYmxlKSwgZmFsc2Ugb25jZSBkb25lLiAqL1xuICBnZXQgdGhyZWVKc01vZGVsTG9hZGluZyQoKSB7XG4gICAgcmV0dXJuIHRoaXMudGhyZWVKc1NlcnZpY2UubW9kZWxMb2FkaW5nJDtcbiAgfVxuXG4gIC8qKiBEb3dubG9hZCBwcm9ncmVzcyBmb3IgR0xCIG1vZGVscyBhcyBhIDAtMSBmcmFjdGlvbiwgb3IgbnVsbCB3aGVuIHRoZSBzaXplIGlzbid0IGtub3duIHVwZnJvbnQuICovXG4gIGdldCB0aHJlZUpzTW9kZWxMb2FkUHJvZ3Jlc3MkKCkge1xuICAgIHJldHVybiB0aGlzLnRocmVlSnNTZXJ2aWNlLm1vZGVsTG9hZFByb2dyZXNzJDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgdGhlIFdlYiBXb3JrZXIgdXNlZCB0byBwYXJzZSBoZWF2eSAub2JqIGZpbGVzIG9mZiB0aGUgbWFpbiB0aHJlYWQuXG4gICAqIE11c3QgYmUgY3JlYXRlZCBieSB0aGUgYXBwIChzZWUgb2JqLXBhcnNlci53b3JrZXIudHMpLCBzaW5jZSB0aGlzIGxpYnJhcnkgY2FuJ3QgYnVuZGxlIHdvcmtlciBmaWxlcy5cbiAgICovXG4gIHNldE9ialBhcnNlcldvcmtlcih3b3JrZXI6IFdvcmtlcik6IHZvaWQge1xuICAgIHRoaXMudGhyZWVKc1NlcnZpY2Uuc2V0T2JqUGFyc2VyV29ya2VyKHdvcmtlcik7XG4gIH1cblxuICBhZGRUaHJlZUpzT2JqZWN0cyhvYmpzOiBhbnlbXSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLnVwZGF0ZU9ianNUb1NjZW5lKG9ianMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGluaXRNYXR0ZXJwb3J0U2RrKFxuICAgIHNwYWNlSUQ6IHN0cmluZyxcbiAgICBtb2RlbDNEOiBzdHJpbmcsXG4gICAgdGFnU2VydmljZTogQmFzZVRhZ1NlcnZpY2UsXG4gICAgbW9kdWxlOiBTcE1vZHVsZSA9IFNwTW9kdWxlLklNTU9cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5pc0xvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuY3VycmVudFNwYWNlSUQgPSBzcGFjZUlEO1xuICAgIGlmICh0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLnNkaykge1xuICAgICAgYXdhaXQgdGhpcy5jbGVhckFsbCgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0U2VydmljZVxuICAgICAgLmluaXRTZGsodGFnU2VydmljZSwgbW9kdWxlKVxuICAgICAgLnRoZW4oYXN5bmMgKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgY29uc3QgeyBzZGsgfSA9IHRoaXMubWF0dGVycG9ydFNlcnZpY2U7XG5cbiAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICBzZGsuU2NlbmUucmVnaXN0ZXIoc2VjdXJpdHlDYW1lcmFUeXBlLCBtYWtlU2VjdXJpdHlDYW1lcmEuYmluZChzZGsuU2NlbmUpKSxcbiAgICAgICAgICAgIHNkay5TY2VuZS5yZWdpc3RlcihWaWV3RnJ1c3R1bU1lc2hUeXBlLCBtYWtlVmlld0ZydXN0dW1NZXNoLmJpbmQoc2RrLlNjZW5lKSlcbiAgICAgICAgICBdKTtcblxuICAgICAgICAgIHRoaXMuc2hvd2luZ1ZpZXdlciA9IHRydWU7XG5cbiAgICAgICAgICBzZGsuQXBwLnN0YXRlLnN1YnNjcmliZShcbiAgICAgICAgICAgIGZ1bmN0aW9uIChhcHBTdGF0ZSkge1xuICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdUaGUgY3VycmVudCBwaGFzZTogJywgYXBwU3RhdGUucGhhc2UpO1xuICAgICAgICAgICAgICBpZiAoYXBwU3RhdGUucGhhc2UgPT09IHNkay5BcHAuUGhhc2UuUExBWUlORykge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdUaGUgYXBwIGlzIHBsYXlpbmcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dpbmdWaWV3ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMudmlld2VySXNPbi5uZXh0KHtcbiAgICAgICAgICAgICAgICAgIHNwYWNlSUQsXG4gICAgICAgICAgICAgICAgICBtb2RlbDNELFxuICAgICAgICAgICAgICAgICAgc3dlZXA6IHRoaXMuc3dlZXBUb01vdmUsXG4gICAgICAgICAgICAgICAgICByb3RhdGlvbjogdGhpcy5yb3RhdGlvblRvTW92ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFJc0xvYWRlZC5uZXh0KHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHRoaXMuc3dlZXBUb01vdmUgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMucm90YXRpb25Ub01vdmUgPSBudWxsO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LmJpbmQodGhpcylcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgdGhpcy52aWV3ZXJJc09uLm5leHQoe1xuICAgICAgICAgICAgc3BhY2VJRCxcbiAgICAgICAgICAgIG1vZGVsM0QsXG4gICAgICAgICAgICBzd2VlcDogdGhpcy5zd2VlcFRvTW92ZSxcbiAgICAgICAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uVG9Nb3ZlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuZGF0YUlzTG9hZGVkLm5leHQodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5pc0xvYWRlZCA9IHRydWU7XG4gICAgICAgICAgdGhpcy5zd2VlcFRvTW92ZSA9IG51bGw7XG4gICAgICAgICAgdGhpcy5yb3RhdGlvblRvTW92ZSA9IG51bGw7XG5cbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHJlbW92ZUZvcmJpZGRlblN3ZWVwcyhmb3JiaWRkZW5Td2VlcHM6IHN0cmluZ1tdKSB7XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UucmVtb3ZlRm9yYmlkZGVuU3dlZXBzKGZvcmJpZGRlblN3ZWVwcyk7XG4gICAgfVxuICB9XG5cbiAgc2V0T2JqZWN0M0RMb2FkZWRJblBvc2l0aW9uKG9iamVjdExvYWRlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuaXNPYmplY3RMb2FkZWQgPSBvYmplY3RMb2FkZWQ7XG4gIH1cblxuICBpc09iamVjdDNETG9hZGVkSW5Qb3NpdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc09iamVjdExvYWRlZDtcbiAgfVxufVxuIl19
|
|
850
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tY29yZS9zcmMvbGliL3NlcnZpY2VzL3ZpZXdlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFDQUFxQztBQUNyQyw4QkFBOEI7QUFDOUIseUNBQXlDO0FBQ3pDLDJDQUEyQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSS9CLE9BQU8sRUFHTCxrQkFBa0IsRUFDbEIsT0FBTyxFQUtQLFFBQVEsR0FDVCxNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHlEQUF5RCxDQUFDO0FBQ2pILE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDREQUE0RCxDQUFDO0FBRXRILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDN0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7OztBQU0zRCxNQUFNLE9BQU8sYUFBYTtJQThEdUI7SUFDVjtJQUMzQjtJQUNBO0lBQ0E7SUFqRUYsVUFBVSxHQUFXLFlBQVksQ0FBQztJQUVuQyxjQUFjLENBQVM7SUFFdEIsT0FBTyxDQUFTO0lBRWpCLFVBQVUsR0FLWixJQUFJLE9BQU8sRUFBRSxDQUFDO0lBRVosWUFBWSxHQUFxQixJQUFJLE9BQU8sRUFBRSxDQUFDO0lBRS9DLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFFakIsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUU3Qjs7Ozs7O09BTUc7SUFDSSxjQUFjLEdBQWtCLElBQUks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UUFBUSIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWF3YWl0LWluLWxvb3AgKi9cbi8qIGVzbGludC1kaXNhYmxlIGNhbWVsY2FzZSAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tdW5kZXJzY29yZS1kYW5nbGUgKi9cbi8qIGVzbGludC1kaXNhYmxlIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXMgKi9cbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTUFUVEVSUE9SVF9TREtfS0VZIH0gZnJvbSAnLi4vdG9rZW5zL21hdHRlcnBvcnQtc2RrLWtleS50b2tlbic7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBNYXR0ZXJwb3J0U2VydmljZSB9IGZyb20gJy4vbWF0dGVycG9ydC5zZXJ2aWNlJztcbmltcG9ydCB7IFRocmVlSnNTZXJ2aWNlIH0gZnJvbSAnLi90aHJlZWpzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQmFzZVRhZ1NlcnZpY2UgfSBmcm9tICcuL3RhZy5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIERiT2JqZWN0VHlwZSxcbiAgUE9JLFxuICBWaWV3ZXJJbnRlcmFjdGlvbnMsXG4gIFBvaVR5cGUsXG4gIENvbW1lbnQsXG4gIEVxdWlwbWVudCxcbiAgVGlja2V0LFxuICBGZWF0dXJlLFxuICBTcE1vZHVsZSxcbn0gZnJvbSAnLi4vdHlwZXMuc2VydmljZSc7XG5pbXBvcnQgeyBQb2lTZXJ2aWNlIH0gZnJvbSAnLi9tb2RlbHMvcG9pLnNlcnZpY2UnO1xuaW1wb3J0IHsgbWFrZVNlY3VyaXR5Q2FtZXJhLCBzZWN1cml0eUNhbWVyYVR5cGUgfSBmcm9tIFwiLi4vbWF0dGVycG9ydC1leHRlbnNpb25zL3NlY3VyaXR5LWNhbWVyYS9TZWN1cml0eUNhbWVyYVwiO1xuaW1wb3J0IHsgVmlld0ZydXN0dW1NZXNoVHlwZSwgbWFrZVZpZXdGcnVzdHVtTWVzaCB9IGZyb20gXCIuLi9tYXR0ZXJwb3J0LWV4dGVuc2lvbnMvdmlldy1mcnVzdHVtLW1lc2gvVmlld0ZydXN0dW1NZXNoXCI7XG5pbXBvcnQgeyBOYXZpZ2F0b3JTZXJ2aWNlIH0gZnJvbSAnLi9uYXZpZ2F0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBnZXRTaWduZWRGaWxlIH0gZnJvbSAnLi9zMy5zZXJ2aWNlJztcbmltcG9ydCB7IHBhcnNlVGhyZWVKc1BsYWNlbWVudCB9IGZyb20gJy4uL2hlbHBlcnMuc2VydmljZSc7XG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuLi9jb25maWcnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgVmlld2VyU2VydmljZSB7XG4gIHByaXZhdGUgdmlld2VyTW9kZTogc3RyaW5nID0gJ01hdHRlcnBvcnQnO1xuXG4gIHB1YmxpYyBjdXJyZW50TW9kZWwzRDogc3RyaW5nO1xuXG4gIHByaXZhdGUgdG91clVybDogc3RyaW5nO1xuXG4gIHB1YmxpYyB2aWV3ZXJJc09uOiBTdWJqZWN0PHtcbiAgICBzcGFjZUlEOiBzdHJpbmcgfCBudWxsO1xuICAgIG1vZGVsM0Q6IHN0cmluZyB8IG51bGw7XG4gICAgc3dlZXA6IHN0cmluZyB8IG51bGw7XG4gICAgcm90YXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IH0gfCBudWxsO1xuICB9PiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHVibGljIGRhdGFJc0xvYWRlZDogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHVibGljIGlzTG9hZGVkID0gZmFsc2U7XG5cbiAgcHVibGljIHNob3dpbmdWaWV3ZXIgPSBmYWxzZTtcblxuICAvKipcbiAgICogVGhlIHNwYWNlIGJlaW5nIHZpZXdlZCwgd2hpY2hldmVyIHZpZXdlciBpcyBzaG93aW5nIGl0LlxuICAgKlxuICAgKiBNYXR0ZXJwb3J0U2VydmljZSBjYXJyaWVzIGl0cyBvd24gY29weSwgc2V0IHdoaWxlIGl0cyBTREsgY29ubmVjdHMgLSB3aGljaCBuZXZlciBoYXBwZW5zIGluXG4gICAqIFRocmVlLmpzIG1vZGUuIEFueXRoaW5nIHRoYXQgcmVhZHMgb25seSB0aGF0IG9uZSBzaWxlbnRseSBkb2VzIG5vdGhpbmcgZm9yIGEgM0QgbW9kZWwsIGFuZCB0aGVcbiAgICogbGlzdHMgdGhhdCBmZWVkIHRhZ3MgYXJlIGV4YWN0bHkgdGhhdC5cbiAgICovXG4gIHB1YmxpYyBjdXJyZW50U3BhY2VJRDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgcHVibGljIHN3ZWVwVG9Nb3ZlOiBzdHJpbmcgfCBudWxsO1xuXG4gIHB1YmxpYyByb3RhdGlvblRvTW92ZTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgfSB8IG51bGw7XG5cbiAgcHVibGljIGdvVG9UcmlnZ2VyZWQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xuXG4gIHB1YmxpYyB0b29sYm94U3RhdGVzID0ge1xuICAgIGRvbGxob3VzZToge1xuICAgICAgc3RhdDogZmFsc2UsXG4gICAgICBpY29uSWQ6ICd1aS1kb2xsaG91c2UnLFxuICAgICAgc2hvdygpIHtcbiAgICAgIH0sXG4gICAgICBoaWRlKCkge1xuICAgICAgfSxcbiAgICB9LFxuICAgIGZsb29ycGxhbjoge1xuICAgICAgc3RhdDogZmFsc2UsXG4gICAgfSxcbiAgICBtZXN1cmU6IHtcbiAgICAgIHN0YXQ6IGZhbHNlLFxuICAgICAgaWNvbklkOiAndWktbWVzdXJlJyxcbiAgICAgIHNob3coKSB7XG4gICAgICB9LFxuICAgICAgaGlkZSgpIHtcbiAgICAgIH0sXG4gICAgfSxcbiAgICBmaWx0ZXI6IHtcbiAgICAgIHN0YXQ6IGZhbHNlLFxuICAgIH0sXG4gIH07XG4gIHByaXZhdGUgaXNPYmplY3RMb2FkZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KE1BVFRFUlBPUlRfU0RLX0tFWSkgcHJpdmF0ZSByZWFkb25seSBzZGtLZXk6IHN0cmluZyxcbiAgICBASW5qZWN0KCdjb25maWcnKSBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogQ29uZmlnLFxuICAgIHByaXZhdGUgcG9pU2VydmljZTogUG9pU2VydmljZSxcbiAgICBwcml2YXRlIG1hdHRlcnBvcnRTZXJ2aWNlOiBNYXR0ZXJwb3J0U2VydmljZSxcbiAgICBwcml2YXRlIHRocmVlSnNTZXJ2aWNlOiBUaHJlZUpzU2VydmljZSxcbiAgKSB7XG4gICAgdGhpcy5zZXRNb2RlKCdNYXR0ZXJwb3J0Jyk7XG4gIH1cblxuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICBVdGlsc1xuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICBjaGVja01vZGUoaW5kZXhNb2RlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy52aWV3ZXJNb2RlID09PSBpbmRleE1vZGU7XG4gIH1cblxuICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICAgU2V0dGVyc1xuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuICBzZXRNb2RlKGluZGV4TW9kZTogc3RyaW5nKSB7XG4gICAgLy8gTGVhdmluZyBUaHJlZS5qcyBtZWFucyBubyBUaHJlZS5qcyB3b3JrIHNob3VsZCBzdGlsbCBiZSBydW5uaW5nLiBUaGUgc2VydmljZSBiZWhpbmQgaXQgaXMgYVxuICAgIC8vIHNpbmdsZXRvbiBhbmQgb3V0bGl2ZXMgdGhlIGNvbXBvbmVudCwgc28gYSBkb3dubG9hZCBzdGFydGVkIGZvciBhIG1vZGVsIHRoZSB1c2VyIGhhcyBuYXZpZ2F0ZWRcbiAgICAvLyBhd2F5IGZyb20gd291bGQgb3RoZXJ3aXNlIGZpbmlzaCAtIGFuZCBpdHMgcGFyc2Ugd291bGQgaG9sZCB0aGUgbWFpbiB0aHJlYWQgZm9yIHNlY29uZHMsXG4gICAgLy8gc3RhbGxpbmcgd2hhdGV2ZXIgdmlld2VyIHRoZXkgYWN0dWFsbHkgb3BlbmVkLlxuICAgIGlmICh0aGlzLnZpZXdlck1vZGUgPT09ICd0aHJlZWpzJyAmJiBpbmRleE1vZGUgIT09ICd0aHJlZWpzJykge1xuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5kZXN0cm95KCk7XG4gICAgfVxuICAgIHRoaXMudmlld2VyTW9kZSA9IGluZGV4TW9kZTtcbiAgfVxuXG4gIHNldFRvdXJVcmwob3B0aW9uczoge1xuICAgIG1vZGVsM2Q6IHN0cmluZyxcbiAgICBzaG93SWNvblBsYW4/OiBib29sZWFuLFxuICAgIHNob3dJY29uRG9sbGhvdXNlPzogYm9vbGVhbixcbiAgICBzaG93SWNvbkZsb29ycz86IGJvb2xlYW4sXG4gICAgc2hvd1F1aWNrU3RhcnQ/OiBib29sZWFuLFxuICAgIHNob3dGdWxsc2NyZWVuPzogYm9vbGVhbixcbiAgICBzaG93R3VpZGVkVG91cj86IGJvb2xlYW4sXG4gICAgc2hvd0hpZ2hsaWdodFJlZWw/OiBib29sZWFuLFxuICAgIHNob3dEZWZ1cm5pc2g/OiBib29sZWFuLFxuICAgIHNob3dSb29tTWVhc3VyZW1lbnRzPzogYm9vbGVhblxuICB9KSB7XG4gICAgY29uc3Qge1xuICAgICAgbW9kZWwzZCxcbiAgICAgIHNob3dJY29uUGxhbiA9IHRydWUsXG4gICAgICBzaG93SWNvbkRvbGxob3VzZSA9IHRydWUsXG4gICAgICBzaG93SWNvbkZsb29ycyA9IHRydWUsXG4gICAgICBzaG93UXVpY2tTdGFydCA9IHRydWUsXG4gICAgICBzaG93RnVsbHNjcmVlbiA9IHRydWUsXG4gICAgICBzaG93R3VpZGVkVG91ciA9IHRydWUsXG4gICAgICBzaG93SGlnaGxpZ2h0UmVlbCA9IHRydWUsXG4gICAgICBzaG93RGVmdXJuaXNoID0gdHJ1ZSxcbiAgICAgIHNob3dSb29tTWVhc3VyZW1lbnRzID0gdHJ1ZVxuICAgIH0gPSBvcHRpb25zO1xuXG4gICAgY29uc3QgYmFzZVVybCA9IGAvYXNzZXRzL2J1bmRsZS9zaG93Y2FzZS5odG1sYDtcblxuICAgIGNvbnN0IHBhcmFtczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIE1vZMOobGVcbiAgICBwYXJhbXMucHVzaChgbT0ke21vZGVsM2R9YCk7XG5cbiAgICAvLyBDb21wb3J0ZW1lbnQgZ8OpbsOpcmFsXG4gICAgcGFyYW1zLnB1c2goYHBsYXk9MWApO1xuICAgIHBhcmFtcy5wdXNoKGB1aT0xYCk7XG4gICAgcGFyYW1zLnB1c2goYHRpdGxlPTBgKTtcbiAgICBwYXJhbXMucHVzaChgbG9nPTBgKTtcbiAgICBwYXJhbXMucHVzaChgYnJhbmQ9MGApO1xuICAgIHBhcmFtcy5wdXNoKGBzZWFyY2g9MGApO1xuICAgIHBhcmFtcy5wdXNoKGBhcHBsaWNhdGlvbktleT0ke3RoaXMuc2RrS2V5fWApO1xuICAgIHBhcmFtcy5wdXNoKGBtZHM9MGApO1xuXG4gICAgLy8gUXVpY2sgc3RhcnRcbiAgICBpZiAoc2hvd1F1aWNrU3RhcnQpIHtcbiAgICAgIHBhcmFtcy5wdXNoKGBxcz0xYCk7XG4gICAgfVxuXG4gICAgLy8gRmxvb3JwbGFuIChwbGFuKVxuICAgIGlmICghc2hvd0ljb25QbGFuKSB7XG4gICAgICBwYXJhbXMucHVzaChgZnA9MGApO1xuICAgIH1cblxuICAgIC8vIERvbGxob3VzZSAobWFpc29uL3BvdXDDqWUpXG4gICAgaWYgKCFzaG93SWNvbkRvbGxob3VzZSkge1xuICAgICAgcGFyYW1zLnB1c2goYGRoPTBgKTtcbiAgICB9XG5cbiAgICAvLyBTw6lsZWN0ZXVyIGTigJnDqXRhZ2VzXG4gICAgaWYgKCFzaG93SWNvbkZsb29ycykge1xuICAgICAgcGFyYW1zLnB1c2goYHNmPTBgKTtcbiAgICB9XG5cbiAgICAvLyBHdWlkZWQgdG91clxuICAgIGlmICghc2hvd0d1aWRlZFRvdXIpIHtcbiAgICAgIHBhcmFtcy5wdXNoKGBndD0wYCk7XG4gICAgfVxuXG4gICAgLy8gSGlnaGxpZ2h0IHJlZWwgKGJhbmRlIGR1IGJhcylcbiAgICBpZiAoIXNob3dIaWdobGlnaHRSZWVsKSB7XG4gICAgICAvLyBTZWxvbiB0b24gYnVuZGxlIDogaHI9MSBvdSBocj0wIG1hc3F1ZVxuICAgICAgcGFyYW1zLnB1c2goYGhyPTFgKTtcbiAgICB9XG5cbiAgICAvLyBQbGVpbiDDqWNyYW5cbiAgICBpZiAoIXNob3dGdWxsc2NyZWVuKSB7XG4gICAgICBwYXJhbXMucHVzaChgZnM9MGApO1xuICAgIH1cblxuICAgIC8vIERlZnVybmlzaFxuICAgIGlmIChzaG93RGVmdXJuaXNoKSB7XG4gICAgICBwYXJhbXMucHVzaChgYWQ9MWApO1xuICAgIH1cblxuICAgIC8vIFJvb20gTWVhc3VyZW1lbnRzXG4gICAgaWYgKHNob3dSb29tTWVhc3VyZW1lbnRzKSB7XG4gICAgICBwYXJhbXMucHVzaChgbWVhc3VyZW1lbnRzPTFgKTtcbiAgICB9XG5cbiAgICB0aGlzLnRvdXJVcmwgPSBgJHtiYXNlVXJsfT8ke3BhcmFtcy5qb2luKFwiJlwiKX1gO1xuICB9XG5cbiAgYXN5bmMgY2xlYXJBbGwoKSB7XG4gICAgLy8gdGhpcy5zd2VlcFRvTW92ZSA9IG51bGw7XG4gICAgLy8gdGhpcy5yb3RhdGlvblRvTW92ZSA9IG51bGw7XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2UuZGVzdHJveSgpO1xuICAgICAgdGhpcy5zaG93aW5nVmlld2VyID0gZmFsc2U7XG4gICAgICB0aGlzLmlzTG9hZGVkID0gZmFsc2U7XG4gICAgICAvLyBNaXJyb3JzIHRoZSBNYXR0ZXJwb3J0IGJyYW5jaDogdGhlIHNwYWNlIGlzIG5vIGxvbmdlciBvbiBzY3JlZW4sIHNvIHdoYXRldmVyIHdhcyBsb2FkZWRcbiAgICAgIC8vIGZvciBpdCBoYXMgdG8gYmUgZHJvcHBlZCBiZWZvcmUgYW5vdGhlciB2aXNpdCBvcGVucy5cbiAgICAgIHRoaXMudmlld2VySXNPbi5uZXh0KHtcbiAgICAgICAgc3BhY2VJRDogbnVsbCxcbiAgICAgICAgbW9kZWwzRDogbnVsbCxcbiAgICAgICAgc3dlZXA6IG51bGwsXG4gICAgICAgIHJvdGF0aW9uOiBudWxsLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XG4gICAgICB0aGlzLnNob3dpbmdWaWV3ZXIgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNMb2FkZWQgPSBmYWxzZTtcbiAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuY2xlYXJBbGwoKTtcbiAgICAgIHRoaXMudmlld2VySXNPbi5uZXh0KHtcbiAgICAgICAgc3BhY2VJRDogbnVsbCxcbiAgICAgICAgbW9kZWwzRDogbnVsbCxcbiAgICAgICAgc3dlZXA6IG51bGwsXG4gICAgICAgIHJvdGF0aW9uOiBudWxsLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgIEdldHRlcnNcbiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cbiAgZ2V0TW9kZSgpIHtcbiAgICByZXR1cm4gdGhpcy52aWV3ZXJNb2RlO1xuICB9XG5cbiAgZ2V0Vmlld2VyU2VsZWN0ZWRTZXJ2aWNlKCkge1xuICAgIC8vIE1hdHRlcnBvcnRcbiAgICAvLyBpZiAodGhpcy5jaGVja01vZGUoXCJNYXR0ZXJwb3J0XCIpKSB7XG4gICAgLy8gICAgIHJldHVybiB0aGlzLmdldE1hdHRlcnBvcnRTZXJ2aWNlKCk7XG4gICAgLy8gfVxuICAgIHJldHVybiB0aGlzLmdldE1hdHRlcnBvcnRTZXJ2aWNlKCk7XG4gIH1cblxuICBnZXRUb3VyVXJsKCkge1xuICAgIHJldHVybiB0aGlzLnRvdXJVcmw7XG4gIH1cblxuICBnZXRNYXR0ZXJwb3J0U2VydmljZSgpIHtcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0U2VydmljZTtcbiAgfVxuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICBHZW5lcmljIE1haW4gYWN0aW9uIGZ1bmN0aW9uc1xuICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cbiAgc2V0U3dlZXBUb01vdmUoc3dlZXA6IHN0cmluZykge1xuICAgIHRoaXMuc3dlZXBUb01vdmUgPSBzd2VlcDtcbiAgfVxuXG4gIHNldFJvdGF0aW9uVG9Nb3ZlKHJvdGF0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB9KSB7XG4gICAgdGhpcy5yb3RhdGlvblRvTW92ZSA9IHJvdGF0aW9uO1xuICB9XG5cblxuICBhc3luYyBhY3Rpb25fbW92ZV90b190YWcoZWxlbWVudElkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBNYXR0ZXJwb3J0XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0VGFnRnJvbUVsZW1lbnRJZChlbGVtZW50SWQpO1xuICAgICAgaWYgKHJlc3VsdC50YWcpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nb1RvVGFnKHJlc3VsdC50YWcpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChyZXN1bHQuc3dlZXApIHtcbiAgICAgICAgdGhpcy5zd2VlcFRvTW92ZSA9IHJlc3VsdC5zd2VlcDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgLy8gV2l0aG91dCB0aGlzIHRoZSBjYWxsZXIgZmFsbHMgdGhyb3VnaCB0byBnZXRNb2RlbDNkQW5kU3dlZXAsIHdoaWNoIHJlc29sdmVzIGEgdmlzaXQgZnJvbSB0aGVcbiAgICAvLyBQT0kncyBzd2VlcCAtIGEgVGhyZWUuanMgUE9JIGhhcyBub25lLCBzbyBpdCBmYWlscyBhbmQgcmVwb3J0cyB0aGUgbW9kZWwgYXMgdW5yZWFjaGFibGUgZXZlblxuICAgIC8vIHRob3VnaCB0aGUgdGFnIGlzIG9uIHNjcmVlbi5cbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSAmJiB0aGlzLnRocmVlSnNTZXJ2aWNlLmhhc1RhZyhlbGVtZW50SWQpKSB7XG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmdvVG9UYWcoZWxlbWVudElkKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBNYXR0ZXJ0YWdzIHRvIFZpZXdlclxuICAgKiBAcGFyYW0gb2JqZWN0cyBMaXN0IG9mIG9iamVjdHMgKHRpY2tldHMsIGVxdWlwbWVudHMpIGV0YyB0byBiZSBhZGRlZCBhcyBNYXR0ZXJ0YWdzXG4gICAqL1xuICBhc3luYyBhZGRPYmplY3RUYWdzVG9WaWV3ZXIob2JqZWN0czogRGJPYmplY3RUeXBlW10pIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG9iamVjdHMubWFwKGFzeW5jIChvYmplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcG9pID0gYXdhaXQgdGhpcy5wb2lTZXJ2aWNlLmdldFBvaUJ5RWxlbWVudElkKG9iamVjdC5pZCEpO1xuICAgICAgICBpZiAocG9pICYmIHBvaS5jb29yZGluYXRlKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5hY3Rpb25BZGRPYmplY3RGcm9tUE9JKG9iamVjdCwgcG9pKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICAgIC8vIE5ld2x5IGNyZWF0ZWQgdGFncyBoYXZlIG5vIG9wYWNpdHkvYWxsb3dBY3Rpb24gYXBwbGllZCB5ZXQgKG9ubHkgc2V0IGJ5XG4gICAgLy8gdXBkYXRlVGFnc1Zpc2liaWxpdHlGb3JDb250ZXh0LCB3aGljaCBydW5zIG9uIE1vZGUvU3dlZXAvRmxvb3IvUm9vbS9DYW1lcmFcbiAgICAvLyBldmVudHMpLiBJZiB0aGlzIGJhdGNoIGxvYWRlZCBhZnRlciB0aG9zZSBmaXJlZCwgdGhlIHRhZ3Mgc3RheSBpbiB3aGF0ZXZlclxuICAgIC8vIGRlZmF1bHQgc3RhdGUgdGhlIFNESyBnYXZlIHRoZW0gdW50aWwgc29tZXRoaW5nIGVsc2UgbnVkZ2VzIGEgcmVmcmVzaC5cbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5yZWZyZXNoVGFnc1Zpc2liaWxpdHkoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhY3Rpb25BZGRPYmplY3RGcm9tUE9JKG9iamVjdDogRGJPYmplY3RUeXBlLCBwb2k6IFBPSSkge1xuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5jcmVhdGVNYXR0ZXJ0YWdGcm9tUE9JKFxuICAgICAgICBwb2kudHlwZSEsXG4gICAgICAgIG9iamVjdCxcbiAgICAgICAgcG9pXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xuICAgICAgcmV0dXJuIHRoaXMuYWRkVGhyZWVKc1RhZ0Zyb21QT0kob2JqZWN0LCBwb2kpO1xuICAgIH1cbiAgICAvLyBDdXBpeFxuICAgIC8vIFRPRE9cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICAvKipcbiAgICogRHJhd3MgYSBQT0kgYXMgYSB0YWcgaW4gdGhlIFRocmVlLmpzIHNjZW5lLlxuICAgKlxuICAgKiBCb3RoIHZpZXdlcnMgYXJlIGZlZCBieSB0aGUgc2FtZSBzdWJzY3JpcHRpb25zIG9uIHRoZSBzYW1lIFBPSSByZWNvcmRzLCBzbyBhIHRhZyBjcmVhdGVkIGluXG4gICAqIGVpdGhlciBvbmUgc2hvd3MgdXAgaW4gdGhlIG90aGVyIHdpdGhvdXQgYW55IHN5bmNpbmcgb2YgaXRzIG93biAtIHRoaXMgaXMganVzdCB0aGUgVGhyZWUuanMgZW5kXG4gICAqIG9mIHRoZSBwaXBlbGluZSB0aGF0IGFscmVhZHkgZHJpdmVzIE1hdHRlcnBvcnQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGFkZFRocmVlSnNUYWdGcm9tUE9JKG9iamVjdDogRGJPYmplY3RUeXBlLCBwb2k6IFBPSSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghcG9pLmNvb3JkaW5hdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfTtcbiAgICB0cnkge1xuICAgICAgcG9zaXRpb24gPSBKU09OLnBhcnNlKHBvaS5jb29yZGluYXRlKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGNvbnNvbGUud2FybihgVmlld2VyU2VydmljZTogdW5wYXJzZWFibGUgUE9JIGNvb3JkaW5hdGUgZm9yIGVsZW1lbnQgJHtvYmplY3QuaWR9OmAsIHBvaS5jb29yZGluYXRlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFbcG9zaXRpb24/LngsIHBvc2l0aW9uPy55LCBwb3NpdGlvbj8uel0uZXZlcnkoKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudGhyZWVKc1NlcnZpY2UudXBzZXJ0VGFnKHtcbiAgICAgIGlkOiBvYmplY3QuaWQsXG4gICAgICBwb3NpdGlvbixcbiAgICAgIHBvaVR5cGU6IHBvaS50eXBlLFxuICAgICAgbGFiZWw6IG9iamVjdC5uYW1lID8/IG9iamVjdC50aXRsZSA/PyBudWxsLFxuICAgICAgaWNvblVybDogYXdhaXQgdGhpcy5yZXNvbHZlVGFnSWNvblVybChwb2kpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBpbWFnZSB0byBkcmF3IGEgdGFnIHdpdGgsIG1pcnJvcmluZyB3aGF0IE1hdHRlcnBvcnQgc2hvd3MgZm9yIHRoZSBzYW1lIFBPSS5cbiAgICpcbiAgICogTWF0dGVycG9ydCByZWdpc3RlcnMgb25lIHRleHR1cmUgcGVyIHR5cGUgKGBpY29uLXRpY2tldGAsIGBpY29uLWVxdWlwbWVudGAuLi4pIGZyb20gdGhlIHNhbWVcbiAgICogY29uZmlnIGVudHJpZXMgdXNlZCBoZXJlLCBhbmQgb3ZlcnJpZGVzIGl0IHdpdGggdGhlIFBPSSdzIG93biBpY29uIHdoZW4gaXQgaGFzIG9uZS4gUmVhZGluZyB0aGVcbiAgICogc2FtZSB0d28gc291cmNlcyBpcyB3aGF0IGtlZXBzIGEgdGFnIGxvb2tpbmcgbGlrZSBpdHNlbGYgYWNyb3NzIHRoZSB0d28gdmlld2Vycy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVRhZ0ljb25VcmwocG9pOiBQT0kpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgICBpZiAocG9pLnRhZ0ljb24pIHtcbiAgICAgIC8vIFN0b3JlZCBhcyBKU09OICh7IHNyYywgb3BhY2l0eSB9KSBieSB0aGUgTWF0dGVycG9ydCBwYXRoLCBidXQgb2xkZXIgcmVjb3JkcyBhcmUgYSBiYXJlIGtleS5cbiAgICAgIGxldCBzb3VyY2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShwb2kudGFnSWNvbik7XG4gICAgICAgIHNvdXJjZSA9IHR5cGVvZiBwYXJzZWQgPT09ICdzdHJpbmcnID8gcGFyc2VkIDogcGFyc2VkPy5zcmMgPz8gbnVsbDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBzb3VyY2UgPSBwb2kudGFnSWNvbjtcbiAgICAgIH1cbiAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgY29uc3Qgc2lnbmVkID0gYXdhaXQgZ2V0U2lnbmVkRmlsZShzb3VyY2UpO1xuICAgICAgICBpZiAoc2lnbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIHNpZ25lZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0VGFnSWNvblVybChwb2kudHlwZSk7XG4gIH1cblxuICAvKiogVGhlIGNvbmZpZ3VyZWQgaWNvbiBmb3IgYSBQT0kgdHlwZSwgb3IgbnVsbCB3aGVuIHRoYXQgdHlwZSBoYXMgbm9uZS4gKi9cbiAgcHJpdmF0ZSBkZWZhdWx0VGFnSWNvblVybChwb2lUeXBlOiBQb2lUeXBlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xuICAgIGNvbnN0IGljb25zID0gdGhpcy5jb25maWc/Lm15X2NvbmZpZztcbiAgICBpZiAoIWljb25zKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgc3dpdGNoIChwb2lUeXBlKSB7XG4gICAgICBjYXNlIFBvaVR5cGUuVElDS0VUOlxuICAgICAgICByZXR1cm4gaWNvbnMuaWNvbl90aWNrZXQgPz8gbnVsbDtcbiAgICAgIGNhc2UgUG9pVHlwZS5FUVVJUE1FTlQ6XG4gICAgICAgIHJldHVybiBpY29ucy5pY29uX2VxdWlwbWVudCA/PyBudWxsO1xuICAgICAgY2FzZSBQb2lUeXBlLk1FQVNVUkU6XG4gICAgICAgIHJldHVybiBpY29ucy5pY29uX21lYXN1cmUgPz8gbnVsbDtcbiAgICAgIGNhc2UgUG9pVHlwZS5PQkpFQ1QzRDpcbiAgICAgICAgcmV0dXJuIGljb25zLmljb25fb2JqZWN0M2QgPz8gbnVsbDtcbiAgICAgIGNhc2UgUG9pVHlwZS5EQVRBOlxuICAgICAgY2FzZSBQb2lUeXBlLkRFU0s6XG4gICAgICAgIHJldHVybiBpY29ucy5pY29uX2RhdGEgPz8gbnVsbDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBNb3ZlcyB0aGUgVGhyZWUuanMgY2FtZXJhIHRvIGZyYW1lIGEgdGFnLCBtaXJyb3JpbmcgTWF0dGVycG9ydCdzIGdvVG9UYWcuICovXG4gIGdvVG9UaHJlZUpzVGFnKGVsZW1lbnRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2UuZ29Ub1RhZyhlbGVtZW50SWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTaG93cyBvbmx5IHRhZ3Mgb2YgdGhlIGdpdmVuIFBPSSB0eXBlczsgbnVsbCBjbGVhcnMgdGhlIGZpbHRlci4gKi9cbiAgc2V0VmlzaWJsZVRocmVlSnNUYWdUeXBlcyh0eXBlczogUG9pVHlwZVtdIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLnNldFZpc2libGVUYWdUeXBlcyh0eXBlcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFsaWdubWVudCB3YWxrdGhyb3VnaDogcGljayBhIHRhZywgdGhlbiBjbGljayB3aGVyZSBpdCByZWFsbHkgc2l0cywgdGhyZWUgdGltZXMgb3Zlci5cbiAgICpcbiAgICogVXNlcyB0YWdzIHRoYXQgYWxyZWFkeSBleGlzdCwgc28gbm90aGluZyBpcyBjcmVhdGVkIGFuZCBub3RoaW5nIGlzIHdyaXR0ZW4gdW50aWwgdGhlIGNhbGxlclxuICAgKiBzYXZlcyB0aGUgcmVzdWx0LiBTZWUgdGhyZWVKc0FsaWdubWVudFByb2dyZXNzJCBmb3Igd2hhdCB0aGUgVUkgc2hvdWxkIGJlIGFza2luZyBmb3IuXG4gICAqL1xuICBzdGFydFRocmVlSnNUYWdBbGlnbm1lbnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2Uuc3RhcnRUYWdBbGlnbm1lbnQoKTtcbiAgICB9XG4gIH1cblxuICBjYW5jZWxUaHJlZUpzVGFnQWxpZ25tZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmNhbmNlbFRhZ0FsaWdubWVudCgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCB0aHJlZUpzQWxpZ25tZW50UHJvZ3Jlc3MkKCkge1xuICAgIHJldHVybiB0aGlzLnRocmVlSnNTZXJ2aWNlLmFsaWdubWVudFByb2dyZXNzJDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb2x2ZXMgdGhlIGFsaWdubWVudCBhbmQgYXBwbGllcyBpdCB0byB0aGUgc2NlbmUsIHJldHVybmluZyBpdCBhcyB0aGUgSlNPTiB0byBzdG9yZSBpbiB0aGVcbiAgICogY2FwdHVyZSdzIG1ldGFkYXRhLiBOdWxsIG1lYW5zIHRoZSB0aHJlZSB0YWdzIHdlcmUgY29sbGluZWFyIGFuZCBub3RoaW5nIHdhcyBhcHBsaWVkLlxuICAgKi9cbiAgc29sdmVUaHJlZUpzVGFnQWxpZ25tZW50KGV4aXN0aW5nTWV0YWRhdGE/OiBzdHJpbmcpOiB7IGFsaWdubWVudDogYW55OyBtZXRhZGF0YTogc3RyaW5nIH0gfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBhbGlnbm1lbnQgPSB0aGlzLnRocmVlSnNTZXJ2aWNlLnNvbHZlQWxpZ25tZW50RnJvbVBhaXJzKCk7XG4gICAgaWYgKCFhbGlnbm1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICAvLyBNZXJnZWQgaW50byB3aGF0ZXZlciB0aGUgY2FwdHVyZSBhbHJlYWR5IHN0b3Jlcywgc28gYW4gZXhpc3RpbmcgY2FtZXJhIHBsYWNlbWVudCBzdXJ2aXZlcy5cbiAgICBsZXQgc3RvcmVkOiBhbnkgPSB7fTtcbiAgICB0cnkge1xuICAgICAgc3RvcmVkID0gZXhpc3RpbmdNZXRhZGF0YSA/IEpTT04ucGFyc2UoZXhpc3RpbmdNZXRhZGF0YSkgOiB7fTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHN0b3JlZCA9IHt9O1xuICAgIH1cbiAgICBzdG9yZWQuYWxpZ25tZW50ID0gYWxpZ25tZW50O1xuICAgIHJldHVybiB7IGFsaWdubWVudCwgbWV0YWRhdGE6IEpTT04uc3RyaW5naWZ5KHN0b3JlZCkgfTtcbiAgfVxuXG4gIC8qKiBTaG93cyBvciBoaWRlcyBhIHNpbmdsZSBUaHJlZS5qcyB0YWcuICovXG4gIHNldFRocmVlSnNUYWdWaXNpYmlsaXR5KGVsZW1lbnRJZDogc3RyaW5nLCB2aXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2Uuc2V0VGFnVmlzaWJpbGl0eShlbGVtZW50SWQsIHZpc2libGUpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFjdGlvbl9kZWxldGVfZWxlbWVudChlbGVtZW50OiBEYk9iamVjdFR5cGUpIHtcbiAgICAvLyBNYXR0ZXJwb3J0XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcbiAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZGVsZXRlTWF0dGVydGFnRm9yT2JqZWN0KGVsZW1lbnQuaWQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5yZW1vdmVUYWcoZWxlbWVudC5pZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEVtaXRzIHdoZW4gYSBUaHJlZS5qcyBtb2RlbCBsb2FkIGFjdHVhbGx5IHN0b3BwZWQgc2hvcnQsIHJhdGhlciB0aGFuIG1lcmVseSBiZWluZyBhc2tlZCB0by4gKi9cbiAgZ2V0IHRocmVlSnNNb2RlbExvYWRDYW5jZWxsZWQkKCkge1xuICAgIHJldHVybiB0aGlzLnRocmVlSnNTZXJ2aWNlLm1vZGVsTG9hZENhbmNlbGxlZCQ7XG4gIH1cblxuICAvKiogU3RvcHMgdGhlIFRocmVlLmpzIG1vZGVsIGRvd25sb2FkIGluIHByb2dyZXNzLiAqL1xuICBjYW5jZWxUaHJlZUpzTW9kZWxMb2FkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmNhbmNlbE1vZGVsTG9hZCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBFbWl0cyBhIHRhZydzIGxhYmVsIHdoaWxlIHRoZSBwb2ludGVyIGlzIG92ZXIgaXQgaW4gdGhlIFRocmVlLmpzIHNjZW5lLiAqL1xuICBnZXQgdGhyZWVKc1RhZ0hvdmVyZWQkKCkge1xuICAgIHJldHVybiB0aGlzLnRocmVlSnNTZXJ2aWNlLnRhZ0hvdmVyZWQkO1xuICB9XG5cbiAgLyoqIEVtaXRzIHRoZSBlbGVtZW50IGlkIG9mIGEgdGFnIGNsaWNrZWQgaW4gdGhlIFRocmVlLmpzIHNjZW5lLiAqL1xuICBnZXQgdGhyZWVKc1RhZ0NsaWNrZWQkKCkge1xuICAgIHJldHVybiB0aGlzLnRocmVlSnNTZXJ2aWNlLnRhZ0NsaWNrZWQkO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgdGhlIHZpc2l0J3Mgc3RvcmVkIHRhZyBhbGlnbm1lbnQsIG1hcHBpbmcgY2FwdHVyZWQgdGFnIGNvb3JkaW5hdGVzIG9udG8gdGhpcyBtb2RlbC5cbiAgICpcbiAgICogU2FmZSB0byBjYWxsIGJlZm9yZSB0aGUgbW9kZWwgb3IgYW55IHRhZyBleGlzdHM6IGl0IGlzIGEgdHJhbnNmb3JtIG9uIHRoZSBncm91cCBib3RoIGVuZCB1cFxuICAgKiB1bmRlciwgc28gaXQgYXBwbGllcyB0byB3aGF0ZXZlciBhcnJpdmVzIGxhdGVyLlxuICAgKi9cbiAgc2V0VGhyZWVKc1RhZ0FsaWdubWVudEZyb21NZXRhZGF0YShtZXRhZGF0YTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudGhyZWVKc1NlcnZpY2Uuc2V0VGFnQWxpZ25tZW50KHBhcnNlVGhyZWVKc1BsYWNlbWVudChtZXRhZGF0YSk/LmFsaWdubWVudCA/PyBudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmFibGUgdGFnIHBsYWNlbWVudCBtZW51IHRvIGFkZCBhIG5ldyBlbGVtZW50IGRlcGVuZGluZyBvbiBpdHMgdHlwZSAoVElDS0VULCBEQVRBLCBFUVVJUE1FTlQgZXRjKVxuICAgKi9cbiAgYXN5bmMgYWN0aW9uQWRkTmV3RWxlbWVudFRvVmlld2VyKHBvaVR5cGU6IFBvaVR5cGUpIHtcbiAgICB0aGlzLmFjdGlvbl90b29sYm94X2luc2lkZV92aWV3KCk7XG5cbiAgICAvLyBNYXR0ZXJwb3J0XG4gICAgaWYgKFxuICAgICAgdGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSAmJlxuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRJbnRlcmFjdGlvbk1vZGUoKSA9PT0gVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFRcbiAgICApIHtcbiAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuYWRkTWF0dGVydGFnV2hlbkFkZGluZyhwb2lUeXBlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2Uuc3RhcnRUYWdQbGFjZW1lbnQocG9pVHlwZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExhdW5jaGVzIHRoZSByZXBvc2l0aW9uaW5nIG9mIGFuIGV4aXN0aW5nIE1hdHRlcnRhZyByZWxhdGVkIHRvIHBhcmFtZXRlciBvYmplY3RcbiAgICogQHBhcmFtIGVsZW1lbnQgb2JqZWN0IChUSUNLRVQsIEVRVUlQTUVOVCwgRkVBVFVSRSwgZXRjKVxuICAgKiBAcGFyYW0gcG9pVHlwZSB0eXBlIG9mIG9iamVjdFxuICAgKi9cbiAgYXN5bmMgYWN0aW9uUmVwb3NpdGlvbkVsZW1lbnRJblZpZXdlcihcbiAgICBlbGVtZW50OiBEYk9iamVjdFR5cGUsXG4gICAgcG9pVHlwZTogUG9pVHlwZVxuICApIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpICYmXG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldEludGVyYWN0aW9uTW9kZSgpID09PSBWaWV3ZXJJbnRlcmFjdGlvbnMuREVGQVVMVFxuICAgICkge1xuICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5hZGRNYXR0ZXJ0YWdXaGVuUmVwb3NpdGlvbmluZyhwb2lUeXBlLCBlbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW5hYmxlIHRpY2tldCBwbGFjZW1lbnQgbWVudSB0byBhZGQgYSBuZXcgdGlja2V0XG4gICAqL1xuICBhY3Rpb25fY2FuY2VsZWQoKSB7XG4gICAgLy8gTWF0dGVycG9ydFxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XG4gICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmNhbmNlbEZvbGxvd2luZ0N1cnNvcigpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xuICAgICAgdGhpcy50aHJlZUpzU2VydmljZS5jYW5jZWxUYWdQbGFjZW1lbnQoKTtcbiAgICB9XG4gIH1cblxuICBhY3Rpb25fdG9vbGJveF9pbnNpZGVfdmlldygpIHtcbiAgICAvLyBNYXR0ZXJwb3J0XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuYWN0aW9uX3Rvb2xib3hfaW5zaWRlX3ZpZXcoKTtcbiAgICB9XG4gIH1cblxuICBhY3Rpb25TaG93QWxsRmxvb3JzKCkge1xuICAgIC8vIE1hdHRlcnBvcnRcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5hY3Rpb25TaG93QWxsRmxvb3JzKCk7XG4gICAgfVxuICB9XG5cbiAgYWN0aW9uX3Rvb2xib3hfZG9sbGhvdXNlKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0SW50ZXJhY3Rpb25Nb2RlKCkgIT09IFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUXG4gICAgKSB7XG4gICAgICB0aGlzLmFjdGlvbl9jYW5jZWxlZCgpO1xuICAgIH1cblxuICAgIHRoaXMuYWN0aW9uX3Rvb2xib3hfY2FuY2VsX21lc3VyZSgpO1xuICAgIC8vIE1hdHRlcnBvcnRcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5hY3Rpb25fdG9vbGJveF9kb2xsaG91c2UoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhY3Rpb25fZmxvb3JwbGFuKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0SW50ZXJhY3Rpb25Nb2RlKCkgIT09IFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUXG4gICAgKSB7XG4gICAgICB0aGlzLmFjdGlvbl9jYW5jZWxlZCgpO1xuICAgIH1cbiAgICAvLyBNYXR0ZXJwb3J0XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcbiAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuYWN0aW9uX3Rvb2xib3hfZmxvb3JwbGFuKCk7XG4gICAgfVxuICB9XG5cbiAgYWN0aW9uX3Rvb2xib3hfbWVzdXJlKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0SW50ZXJhY3Rpb25Nb2RlKCkgIT09IFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUXG4gICAgKSB7XG4gICAgICB0aGlzLmFjdGlvbl9jYW5jZWxlZCgpO1xuICAgIH1cblxuICAgIHRoaXMuYWN0aW9uX3Rvb2xib3hfaW5zaWRlX3ZpZXcoKTtcbiAgICAvLyBNYXR0ZXJwb3J0XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuYWN0aW9uX3Rvb2xib3hfbWVzdXJlKCk7XG4gICAgfVxuICB9XG5cbiAgYWN0aW9uX3Rvb2xib3hfY2FuY2VsX21lc3VyZSgpIHtcbiAgICAvLyBNYXR0ZXJwb3J0XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuYWN0aW9uX3Rvb2xib3hfY2FuY2VsX21lc3VyZSgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGFjdGlvbl91cGRhdGVfcG9pKFxuICAgIHBvaTogUE9JLFxuICAgIGlzVmFsaWQ6IGJvb2xlYW4sXG4gICAgZWxlbWVudDogRGJPYmplY3RUeXBlXG4gICk6IFByb21pc2U8UE9JPiB7XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCdNYXR0ZXJwb3J0JykpIHtcbiAgICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAgIGNvbnN0IGxhc3RUYWcgPSB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLm1hdHRlcnRhZ1RvRm9sbG93XG4gICAgICAgICAgPyB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLm1hdHRlcnRhZ1RvRm9sbG93XG4gICAgICAgICAgOiB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldExhc3RUYWcoKTtcbiAgICAgICAgaWYgKCFsYXN0VGFnKSB7XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwb2kpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhZ0RhdGEgPSB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdldE1hdHRlclRhZ0RhdGFGb3JNYXR0ZXJ0YWcobGFzdFRhZyk7XG4gICAgICAgIGlmICghdGFnRGF0YSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocG9pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBvaU1ldGFkYXRhID0gKCEhcG9pICYmIHBvaS5tZXRhZGF0YSkgPyBKU09OLnBhcnNlKHBvaS5tZXRhZGF0YSkgOiB7fTtcbiAgICAgICAgcG9pTWV0YWRhdGEubm9ybWFsID0gdGFnRGF0YS5nZXROb3JtYWwoKTtcbiAgICAgICAgaWYgKCFwb2kpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwb2lJbnB1dCA9IHtcbiAgICAgICAgICBpZDogcG9pLmlkLFxuICAgICAgICAgIGNvb3JkaW5hdGU6IHRhZ0RhdGEuZ2V0Q29vcmRpbmF0ZVN0cmluZygpLFxuICAgICAgICAgIG1hdHRlcnBvcnRTd2VlcElEOiB0YWdEYXRhLmdldFN3ZWVwSUQoKSxcbiAgICAgICAgICBtZXRhZGF0YTogSlNPTi5zdHJpbmdpZnkocG9pTWV0YWRhdGEpLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB1cGRhdGVkUG9pOiBQT0kgPSBhd2FpdCB0aGlzLnBvaVNlcnZpY2UudXBkYXRlUG9pKHBvaUlucHV0KTtcbiAgICAgICAgdGFnRGF0YS5zZXRQb2kodXBkYXRlZFBvaSk7XG4gICAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFNlcnZpY2Uuc2V0T2JqZWN0QW5kUG9pSW5UYWcobGFzdFRhZywgZWxlbWVudCwgUG9pVHlwZS5ERVNLLCB1cGRhdGVkUG9pKTtcbiAgICAgICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5pbmplY3RIdG1sSW5UYWcoXG4gICAgICAgICAgcG9pLnR5cGUhLFxuICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgbGFzdFRhZ1xuICAgICAgICApO1xuICAgICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLnNldFRhZ0ljb25BbmRPcGFjaXR5KGxhc3RUYWcsIHRhZ0RhdGEpO1xuICAgICAgICB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlLmdvVG9UYWcobGFzdFRhZyk7XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh1cGRhdGVkUG9pKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZGVsZXRlTGFzdE1hdHRlcnRhZygpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwb2kpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21taXRUaHJlZUpzVGFnUGxhY2VtZW50KHBvaSwgaXNWYWxpZCwgZWxlbWVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwb2kpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlcyB0aGUgc3BvdCBwaWNrZWQgaW4gdGhlIFRocmVlLmpzIHNjZW5lIGludG8gdGhlIFBPSSwgbWlycm9yaW5nIHRoZSBNYXR0ZXJwb3J0IGJyYW5jaC5cbiAgICpcbiAgICogVGhlIGNvb3JkaW5hdGUgZ29lcyBpbiB0aGUgc2FtZSBmaWVsZCBhbmQgdGhlIHNhbWUgc3BhY2UgTWF0dGVycG9ydCB3cml0ZXMsIHdoaWNoIGlzIHdoYXQgbWFrZXNcbiAgICogYSB0YWcgY3JlYXRlZCBoZXJlIHNob3cgdXAgaW4gdGhlIHJpZ2h0IHBsYWNlIHRoZXJlIC0gYW5kIHRoZSBvdGhlciB3YXkgcm91bmQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNvbW1pdFRocmVlSnNUYWdQbGFjZW1lbnQoXG4gICAgcG9pOiBQT0ksXG4gICAgaXNWYWxpZDogYm9vbGVhbixcbiAgICBlbGVtZW50OiBEYk9iamVjdFR5cGVcbiAgKTogUHJvbWlzZTxQT0k+IHtcbiAgICBjb25zdCBwbGFjZW1lbnQgPSB0aGlzLnRocmVlSnNTZXJ2aWNlLmdldFBlbmRpbmdUYWdQbGFjZW1lbnQoKTtcbiAgICBpZiAoIWlzVmFsaWQgfHwgIXBsYWNlbWVudCB8fCAhcG9pKSB7XG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmNhbmNlbFRhZ1BsYWNlbWVudCgpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShwb2kpO1xuICAgIH1cblxuICAgIGNvbnN0IHBvaU1ldGFkYXRhID0gcG9pLm1ldGFkYXRhID8gSlNPTi5wYXJzZShwb2kubWV0YWRhdGEpIDoge307XG4gICAgcG9pTWV0YWRhdGEubm9ybWFsID0gcGxhY2VtZW50Lm5vcm1hbDtcblxuICAgIGNvbnN0IHVwZGF0ZWRQb2kgPSBhd2FpdCB0aGlzLnBvaVNlcnZpY2UudXBkYXRlUG9pKHtcbiAgICAgIGlkOiBwb2kuaWQsXG4gICAgICBjb29yZGluYXRlOiBKU09OLnN0cmluZ2lmeShwbGFjZW1lbnQucG9zaXRpb24pLFxuICAgICAgbWV0YWRhdGE6IEpTT04uc3RyaW5naWZ5KHBvaU1ldGFkYXRhKSxcbiAgICAgIC8vIG1hdHRlcnBvcnRTd2VlcElEIGlzIGxlZnQgYXMgaXQgd2FzOiB0aGlzIHZpZXdlciBoYXMgbm8gc3dlZXBzLCBhbmQgTWF0dGVycG9ydCBmaWx0ZXJzIHRhZ1xuICAgICAgLy8gdmlzaWJpbGl0eSBieSB0aGVtLCBzbyBjbGVhcmluZyBpdCB3b3VsZCBoaWRlIHRoZSB0YWcgb3ZlciB0aGVyZS5cbiAgICB9KTtcblxuICAgIHRoaXMudGhyZWVKc1NlcnZpY2UudXBzZXJ0VGFnKHtcbiAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgcG9zaXRpb246IHBsYWNlbWVudC5wb3NpdGlvbixcbiAgICAgIHBvaVR5cGU6IHVwZGF0ZWRQb2k/LnR5cGUgPz8gcG9pLnR5cGUsXG4gICAgICBpY29uVXJsOiB1cGRhdGVkUG9pPy50YWdJY29uID8gYXdhaXQgZ2V0U2lnbmVkRmlsZSh1cGRhdGVkUG9pLnRhZ0ljb24pIDogbnVsbCxcbiAgICB9KTtcbiAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmNhbmNlbFRhZ1BsYWNlbWVudCgpO1xuXG4gICAgcmV0dXJuIHVwZGF0ZWRQb2k7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgUE9JIGZvciBhbiBlbGVtZW50IGp1c3QgcGxhY2VkIGluIHRoZSBUaHJlZS5qcyBzY2VuZS5cbiAgICpcbiAgICogVGhlIE1hdHRlcnBvcnQgcGF0aCByZWFjaGVzIHRoZSBzYW1lIHJlc3VsdCB0aHJvdWdoIGl0cyB0YWcgZGljdGlvbmFyeSAtIHRoZSB0YWcgZXhpc3RzIGZpcnN0XG4gICAqIGFuZCBjYXJyaWVzIHRoZSBjb29yZGluYXRlcy4gVGhyZWUuanMgaGFzIG5vIHN1Y2ggb2JqZWN0LCBzbyB0aGUgcGxhY2VtZW50IGNhcHR1cmVkIGF0IGNsaWNrXG4gICAqIHRpbWUgaXMgdGhlIG9ubHkgcmVjb3JkIG9mIHdoZXJlIHRoZSB1c2VyIHBvaW50ZWQsIGFuZCBpdCBoYXMgdG8gYmVjb21lIGEgUE9JIGhlcmUgb3IgaXQgaXNcbiAgICogbG9zdCB3aGVuIHRoZSBmb3JtIGNsb3Nlcy5cbiAgICpcbiAgICogUmV0dXJucyBudWxsIHdoZW4gdGhlcmUgaXMgbm8gcGVuZGluZyBwbGFjZW1lbnQsIHdoaWNoIGlzIHRoZSBub3JtYWwgY2FzZSBpbiBNYXR0ZXJwb3J0IG1vZGUuXG4gICAqL1xuICBhc3luYyBjcmVhdGVQb2lGb3JUaHJlZUpzUGxhY2VtZW50KGVsZW1lbnQ6IERiT2JqZWN0VHlwZSwgcG9pVHlwZTogUG9pVHlwZSk6IFByb21pc2U8UE9JIHwgbnVsbD4ge1xuICAgIGlmICghdGhpcy5jaGVja01vZGUoJ3RocmVlanMnKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHBsYWNlbWVudCA9IHRoaXMudGhyZWVKc1NlcnZpY2UuZ2V0UGVuZGluZ1RhZ1BsYWNlbWVudCgpO1xuICAgIGlmICghcGxhY2VtZW50IHx8ICFlbGVtZW50Py5pZCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcG9pID0gYXdhaXQgdGhpcy5wb2lTZXJ2aWNlLmNyZWF0ZVBPSUZvclNwYWNlSUQoe1xuICAgICAgY29vcmRpbmF0ZTogSlNPTi5zdHJpbmdpZnkocGxhY2VtZW50LnBvc2l0aW9uKSxcbiAgICAgIHR5cGU6IHBvaVR5cGUsXG4gICAgICBlbGVtZW50SUQ6IGVsZW1lbnQuaWQsXG4gICAgICBtZXRhZGF0YTogSlNPTi5zdHJpbmdpZnkoeyBub3JtYWw6IHBsYWNlbWVudC5ub3JtYWwgfSksXG4gICAgfSBhcyBQT0kpO1xuXG4gICAgLy8gRHJhdyBpdCBzdHJhaWdodCBhd2F5IHJhdGhlciB0aGFuIHdhaXRpbmcgZm9yIHRoZSBuZXh0IHJlZnJlc2gsIHNvIHRoZSB1c2VyIHNlZXMgd2hlcmUgdGhlXG4gICAgLy8gdGhpbmcgdGhleSBqdXN0IGNyZWF0ZWQgZW5kZWQgdXAuIFRocm91Z2ggdGhlIHNhbWUgcGF0aCB0aGUgcmVmcmVzaCB1c2VzLCBzbyBpdCBhcnJpdmVzIHdpdGhcbiAgICAvLyB0aGUgdHlwZSdzIGljb24gaW5zdGVhZCBvZiB0aGUgYmFyZSBtYXJrZXIgLSB0aGUgZGlmZmVyZW5jZSB3YXMgdmlzaWJsZSB1bnRpbCB0aGUgbmV4dCByZWxvYWQuXG4gICAgYXdhaXQgdGhpcy5hZGRUaHJlZUpzVGFnRnJvbVBPSShlbGVtZW50LCBwb2kpO1xuICAgIHRoaXMudGhyZWVKc1NlcnZpY2UuY2FuY2VsVGFnUGxhY2VtZW50KCk7XG4gICAgcmV0dXJuIHBvaTtcbiAgfVxuXG4gIC8qKiBFbWl0cyB3aGVuIGEgdGFnIGlzIGRyb3BwZWQgb24gdGhlIG1vZGVsIGluIHRoZSBUaHJlZS5qcyBzY2VuZS4gKi9cbiAgZ2V0IHRocmVlSnNUYWdQbGFjZWQkKCkge1xuICAgIHJldHVybiB0aGlzLnRocmVlSnNTZXJ2aWNlLnRhZ1BsYWNlZCQ7XG4gIH1cblxuICAvKiogRW1pdHMgd2hlbiB0aGUgY2FsaWJyYXRpb24gd2Fsa3Rocm91Z2ggaXMgYWJhbmRvbmVkLCBpbmNsdWRpbmcgdmlhIEVzY2FwZS4gKi9cbiAgZ2V0IHRocmVlSnNBbGlnbm1lbnRDYW5jZWxsZWQkKCkge1xuICAgIHJldHVybiB0aGlzLnRocmVlSnNTZXJ2aWNlLmFsaWdubWVudENhbmNlbGxlZCQ7XG4gIH1cblxuICAvKiogTGVhdmVzIFRocmVlLmpzIHRhZyBwbGFjZW1lbnQgbW9kZSB3aXRob3V0IHBsYWNpbmcgYW55dGhpbmcuICovXG4gIGNhbmNlbFRocmVlSnNUYWdQbGFjZW1lbnQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2UuY2FuY2VsVGFnUGxhY2VtZW50KCk7XG4gICAgfVxuICB9XG5cbiAgZWRpdE9ubHlUYWdTdHlsZUZvclBvaShwb2k6IFBPSSwgb2JqZWN0OiBEYk9iamVjdFR5cGUpIHtcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xuICAgICAgY29uc3QgdGFnRGF0YSA9IHRoaXMubWF0dGVycG9ydFNlcnZpY2UuZ2V0VGFnRnJvbUVsZW1lbnRJZChwb2kuZWxlbWVudElEKTtcbiAgICAgIGlmICh0YWdEYXRhLnRhZykge1xuICAgICAgICBjb25zdCBtYXR0ZXJ0YWdEYXRhID0gdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRNYXR0ZXJUYWdEYXRhRm9yTWF0dGVydGFnKFxuICAgICAgICAgIHRhZ0RhdGEudGFnXG4gICAgICAgICk7XG4gICAgICAgIG1hdHRlcnRhZ0RhdGEuc2V0T2JqZWN0KG9iamVjdCwgUG9pVHlwZS5ST09NKTtcbiAgICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5zZXRUYWdJY29uQW5kT3BhY2l0eSh0YWdEYXRhLnRhZywgbWF0dGVydGFnRGF0YSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkSWNvbkFuZFNldEZvclBvaShwb2k6IFBPSSwgaWNvblBhdGg6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XG4gICAgICBjb25zdCB0YWdEYXRhID0gdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRUYWdGcm9tRWxlbWVudElkKHBvaS5lbGVtZW50SUQpO1xuICAgICAgaWYgKHRhZ0RhdGEudGFnKSB7XG4gICAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2UuYWRkTmV3SWNvbkFuZFNldEZvclRhZyh0YWdEYXRhLnRhZywgaWNvblBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNoYW5nZVRvUmVnaXN0cmVkSWNvbkZvclBvaShwb2k6IFBPSSwgaWNvbk5hbWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XG4gICAgICBjb25zdCB0YWdEYXRhID0gdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRUYWdGcm9tRWxlbWVudElkKHBvaS5lbGVtZW50SUQpO1xuICAgICAgaWYgKHRhZ0RhdGEudGFnKSB7XG4gICAgICAgIHRoaXMubWF0dGVycG9ydFNlcnZpY2Uuc2V0UmVnaXN0cmVkSWNvbkZvclRhZyh0YWdEYXRhLnRhZywgaWNvbk5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUh0bWxUYWdGb3JQb2lXaXRoT2JqZWN0KHBvaTogUE9JLCBvYmplY3Q6IERiT2JqZWN0VHlwZSkge1xuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgnTWF0dGVycG9ydCcpKSB7XG4gICAgICBjb25zdCB0YWdEYXRhID0gdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5nZXRUYWdGcm9tRWxlbWVudElkKHBvaS5lbGVtZW50SUQpO1xuICAgICAgaWYgKHRhZ0RhdGEudGFnKSB7XG4gICAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFNlcnZpY2UudXBkYXRlSW5qZWN0ZWRIdG1sRm9yVGFnSUQoXG4gICAgICAgICAgdGFnRGF0YS50YWcsXG4gICAgICAgICAgb2JqZWN0LFxuICAgICAgICAgIHBvaS50eXBlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgYW4gZXhpc3RpbmcgcG9pIGluIE1hdHRlcnBvcnRcbiAgICogQHBhcmFtIHBvaVxuICAgKiBAcGFyYW0gZWxlbWVudFxuICAgKi9cbiAgYXN5bmMgYWN0aW9uX21vdmVfcG9pX3Zpc3VhbGx5KFxuICAgIHBvaTogUE9JLFxuICAgIGVsZW1lbnQ6IFRpY2tldCB8IEZlYXR1cmUgfCBFcXVpcG1lbnQgfCBDb21tZW50XG4gICkge1xuICAgIGF3YWl0IHRoaXMuYWN0aW9uX2RlbGV0ZV9lbGVtZW50KGVsZW1lbnQpO1xuICAgIGF3YWl0IHRoaXMuYWN0aW9uQWRkT2JqZWN0RnJvbVBPSShlbGVtZW50LCBwb2kpO1xuICB9XG5cbiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIEN1cGl4XG4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBNYXR0ZXJwb3J0XG4gICAgaHR0cHM6Ly9tYXR0ZXJwb3J0LmdpdGh1Yi5pby9zaG93Y2FzZS1zZGsvZG9jcy9zZGsvcmVmZXJlbmNlL2N1cnJlbnQvbW9kdWxlcy9tYXR0ZXJ0YWcuaHRtbCNhZGRcbiAgICBodHRwczovL21hdHRlcnBvcnQuZ2l0aHViLmlvL3Nob3djYXNlLXNkay9kb2NzL3Nkay9yZWZlcmVuY2UvY3VycmVudC9tb2R1bGVzL21hdHRlcnRhZy5odG1sI3JlbW92ZVxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuXG4gIGluaXRUaHJlZUpzKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy50aHJlZUpzU2VydmljZS5pbml0KGNhbnZhcyk7XG4gICAgLy8gVGhlIHRhZyBwaXBlbGluZSBpcyBnYXRlZCBvbiB0aGlzIGZsYWcsIHdoaWNoIHVudGlsIG5vdyBvbmx5IHRoZSBNYXR0ZXJwb3J0IFNESyBzZXQuIEFcbiAgICAvLyBUaHJlZS5qcyB2aXNpdCBuZXZlciByZWFjaGVzIHRoYXQgY29kZSwgc28gZXZlcnkgdGFnIHdhcyBkcm9wcGVkIGJlZm9yZSBpdCBjb3VsZCBiZSBkcmF3bi5cbiAgICB0aGlzLnNob3dpbmdWaWV3ZXIgPSB0cnVlO1xuXG4gICAgLy8gRXZlcnl0aGluZyB0aGF0IGxvYWRzIGRhdGEgZm9yIGEgc3BhY2UgLSB0aWNrZXRzLCBlcXVpcG1lbnRzLCBmZWF0dXJlcywgbWVhc3VyZW1lbnRzIC0gaGFuZ3NcbiAgICAvLyBvZmYgdGhpcyBldmVudCwgd2hpY2ggTWF0dGVycG9ydCByYWlzZXMgb25jZSBpdHMgU0RLIHN0YXJ0cyBwbGF5aW5nLiBBIFRocmVlLmpzIHZpc2l0IG5ldmVyXG4gICAgLy8gdG91Y2hlcyB0aGUgU0RLLCBzbyBub3RoaW5nIGV2ZXIgYW5ub3VuY2VkIHRoZSBzcGFjZSBhbmQgZXZlcnkgbGlzdCBjYW1lIGJhY2sgZW1wdHkuXG4gICAgaWYgKHRoaXMuY3VycmVudFNwYWNlSUQpIHtcbiAgICAgIHRoaXMudmlld2VySXNPbi5uZXh0KHtcbiAgICAgICAgc3BhY2VJRDogdGhpcy5jdXJyZW50U3BhY2VJRCxcbiAgICAgICAgbW9kZWwzRDogbnVsbCxcbiAgICAgICAgc3dlZXA6IG51bGwsXG4gICAgICAgIHJvdGF0aW9uOiBudWxsLFxuICAgICAgfSk7XG4gICAgICB0aGlzLmRhdGFJc0xvYWRlZC5uZXh0KHRydWUpO1xuICAgICAgdGhpcy5pc0xvYWRlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIGEgM0QgbW9kZWwgaW50byB0aGUgVGhyZWUuanMgc2NlbmUgKEdMVEYpLlxuICAgKiBPbmx5IHdvcmtzIHdoZW4gdGhlIHZpZXdlciBpcyBpbiAndGhyZWVqcycgbW9kZS5cbiAgICovXG4gIGxvYWRHTFRGTW9kZWwodXJsOiBzdHJpbmcsIGNhbWVyYVBvc2l0aW9uPzoge3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJ9LCByb3RhdGlvbj86IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoZWNrTW9kZSgndGhyZWVqcycpKSB7XG4gICAgICB0aGlzLnRocmVlSnNTZXJ2aWNlLmxvYWRHTFRGTW9kZWwodXJsLCBjYW1lcmFQb3NpdGlvbiwgcm90YXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhIEdMQiBzdG9yZWQgaW4gUzMsIGdpdmVuIGl0cyBrZXkgKGUuZy4gYHZpc2l0cy88aWQ+L21vZGVsLmdsYmApLlxuICAgKlxuICAgKiBSZXNvbHZlcyB0aGUga2V5IHRvIGEgc2lnbmVkIFVSTCBmaXJzdCwgdGhlbiBsb2FkcyBpdCBsaWtlIGFueSBvdGhlci4gVGhlIHNpZ25lZCBVUkwgb25seVxuICAgKiBjb3ZlcnMgYXV0aGVudGljYXRpb24gLSB0aGUgYnVja2V0IHN0aWxsIG5lZWRzIGEgQ09SUyBydWxlIGFsbG93aW5nIEdFVCBmcm9tIHRoZSBhcHAncyBvcmlnaW4sXG4gICAqIG9yIHRoZSBicm93c2VyIGJsb2NrcyB0aGUgZG93bmxvYWQgYmVmb3JlIGl0IHN0YXJ0cy5cbiAgICpcbiAgICogYHBsYWNlbWVudE1ldGFkYXRhYCBpcyB0aGUgY2FwdHVyZSdzIHN0b3JlZCBwbGFjZW1lbnQ7IHdoZW4gYWJzZW50IG9yIHVudXNhYmxlIHRoZSB2aWV3ZXIgZmFsbHNcbiAgICogYmFjayB0byBmcmFtaW5nIHRoZSBtb2RlbCBhdXRvbWF0aWNhbGx5LlxuICAgKi9cbiAgYXN5bmMgbG9hZEdMVEZNb2RlbEZyb21TMyhrZXk6IHN0cmluZywgcGxhY2VtZW50TWV0YWRhdGE/OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQSBrZXkgdW5kZXIgYXNzZXRzLyBpcyBzZXJ2ZWQgYnkgdGhlIGFwcCBpdHNlbGYsIHNvIGl0IG5lZWRzIG5vIHNpZ25pbmcuIFRoaXMgaXMgd2hhdCBsZXRzIGFcbiAgICAvLyBtb2RlbCBidW5kbGVkIHdpdGggdGhlIGJ1aWxkIHN0YW5kIGluIGZvciBvbmUgaW4gUzMgd2hpbGUgdGhlIHR3byBhcmUgb3RoZXJ3aXNlIGlkZW50aWNhbC5cbiAgICBjb25zdCBpc0xvY2FsQXNzZXQgPSBrZXkuc3RhcnRzV2l0aCgnYXNzZXRzLycpO1xuICAgIGNvbnN0IHVybCA9IGlzTG9jYWxBc3NldCA/IGtleSA6IGF3YWl0IGdldFNpZ25lZEZpbGUoa2V5KTtcbiAgICBpZiAoIXVybCkge1xuICAgICAgY29uc29sZS5lcnJvcihgVmlld2VyU2VydmljZTogY291bGQgbm90IHJlc29sdmUgYSBzaWduZWQgVVJMIGZvciB0aGUgM0QgbW9kZWwgYXQgXCIke2tleX1cIi5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcGxhY2VtZW50ID0gcGFyc2VUaHJlZUpzUGxhY2VtZW50KHBsYWNlbWVudE1ldGFkYXRhKTtcbiAgICAvLyBUaGUga2V5LCBub3QgdGhlIHNpZ25lZCBVUkwsIGlzIHdoYXQgaWRlbnRpZmllcyB0aGUgbW9kZWwgYWNyb3NzIGxvYWRzIC0gdGhlIHNpZ25hdHVyZSBtYWtlc1xuICAgIC8vIGV2ZXJ5IFVSTCB1bmlxdWUsIHdoaWNoIGlzIGV4YWN0bHkgd2h5IHRoZSBicm93c2VyJ3Mgb3duIGNhY2hlIG5ldmVyIGhlbHBzIGhlcmUuXG4gICAgdGhpcy50aHJlZUpzU2VydmljZS5sb2FkR0xURk1vZGVsKHVybCwgcGxhY2VtZW50Py5jYW1lcmFQb3NpdGlvbiwgcGxhY2VtZW50Py5yb3RhdGlvbiwga2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhIDNEIG1vZGVsIGludG8gdGhlIFRocmVlLmpzIHNjZW5lIChPQkopLlxuICAgKi9cbiAgbG9hZE9iak1vZGVsKG10bFVybDogc3RyaW5nLCBvYmpVcmw6IHN0cmluZywgY2FtZXJhUG9zaXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0sIHJvdGF0aW9uPzoge3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJ9KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2UubG9hZE9iak1vZGVsKG10bFVybCwgb2JqVXJsLCBjYW1lcmFQb3NpdGlvbiwgcm90YXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIGdldCB0aHJlZUpzT2JqZWN0SG92ZXJlZCQoKSB7XG4gICAgcmV0dXJuIHRoaXMudGhyZWVKc1NlcnZpY2Uub2JqZWN0SG92ZXJlZCQ7XG4gIH1cblxuICBnZXQgdGhyZWVKc09iamVjdENsaWNrZWQkKCkge1xuICAgIHJldHVybiB0aGlzLnRocmVlSnNTZXJ2aWNlLm9iamVjdENsaWNrZWQkO1xuICB9XG5cbiAgLyoqIEVtaXRzIHRydWUgd2hpbGUgYSBoZWF2eSAub2JqIGZpbGUgaXMgYmVpbmcgcGFyc2VkIChpbiBhIHdvcmtlciwgd2hlbiBhdmFpbGFibGUpLCBmYWxzZSBvbmNlIGRvbmUuICovXG4gIGdldCB0aHJlZUpzTW9kZWxMb2FkaW5nJCgpIHtcbiAgICByZXR1cm4gdGhpcy50aHJlZUpzU2VydmljZS5tb2RlbExvYWRpbmckO1xuICB9XG5cbiAgLyoqIERvd25sb2FkIHByb2dyZXNzIGZvciBHTEIgbW9kZWxzIGFzIGEgMC0xIGZyYWN0aW9uLCBvciBudWxsIHdoZW4gdGhlIHNpemUgaXNuJ3Qga25vd24gdXBmcm9udC4gKi9cbiAgZ2V0IHRocmVlSnNNb2RlbExvYWRQcm9ncmVzcyQoKSB7XG4gICAgcmV0dXJuIHRoaXMudGhyZWVKc1NlcnZpY2UubW9kZWxMb2FkUHJvZ3Jlc3MkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyB0aGUgV2ViIFdvcmtlciB1c2VkIHRvIHBhcnNlIGhlYXZ5IC5vYmogZmlsZXMgb2ZmIHRoZSBtYWluIHRocmVhZC5cbiAgICogTXVzdCBiZSBjcmVhdGVkIGJ5IHRoZSBhcHAgKHNlZSBvYmotcGFyc2VyLndvcmtlci50cyksIHNpbmNlIHRoaXMgbGlicmFyeSBjYW4ndCBidW5kbGUgd29ya2VyIGZpbGVzLlxuICAgKi9cbiAgc2V0T2JqUGFyc2VyV29ya2VyKHdvcmtlcjogV29ya2VyKTogdm9pZCB7XG4gICAgdGhpcy50aHJlZUpzU2VydmljZS5zZXRPYmpQYXJzZXJXb3JrZXIod29ya2VyKTtcbiAgfVxuXG4gIGFkZFRocmVlSnNPYmplY3RzKG9ianM6IGFueVtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hlY2tNb2RlKCd0aHJlZWpzJykpIHtcbiAgICAgIHRoaXMudGhyZWVKc1NlcnZpY2UudXBkYXRlT2Jqc1RvU2NlbmUob2Jqcyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaW5pdE1hdHRlcnBvcnRTZGsoXG4gICAgc3BhY2VJRDogc3RyaW5nLFxuICAgIG1vZGVsM0Q6IHN0cmluZyxcbiAgICB0YWdTZXJ2aWNlOiBCYXNlVGFnU2VydmljZSxcbiAgICBtb2R1bGU6IFNwTW9kdWxlID0gU3BNb2R1bGUuSU1NT1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmlzTG9hZGVkID0gZmFsc2U7XG4gICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5jdXJyZW50U3BhY2VJRCA9IHNwYWNlSUQ7XG4gICAgaWYgKHRoaXMubWF0dGVycG9ydFNlcnZpY2Uuc2RrKSB7XG4gICAgICBhd2FpdCB0aGlzLmNsZWFyQWxsKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRTZXJ2aWNlXG4gICAgICAuaW5pdFNkayh0YWdTZXJ2aWNlLCBtb2R1bGUpXG4gICAgICAudGhlbihhc3luYyAocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBjb25zdCB7IHNkayB9ID0gdGhpcy5tYXR0ZXJwb3J0U2VydmljZTtcblxuICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIHNkay5TY2VuZS5yZWdpc3RlcihzZWN1cml0eUNhbWVyYVR5cGUsIG1ha2VTZWN1cml0eUNhbWVyYS5iaW5kKHNkay5TY2VuZSkpLFxuICAgICAgICAgICAgc2RrLlNjZW5lLnJlZ2lzdGVyKFZpZXdGcnVzdHVtTWVzaFR5cGUsIG1ha2VWaWV3RnJ1c3R1bU1lc2guYmluZChzZGsuU2NlbmUpKVxuICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgdGhpcy5zaG93aW5nVmlld2VyID0gdHJ1ZTtcblxuICAgICAgICAgIHNkay5BcHAuc3RhdGUuc3Vic2NyaWJlKFxuICAgICAgICAgICAgZnVuY3Rpb24gKGFwcFN0YXRlKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ1RoZSBjdXJyZW50IHBoYXNlOiAnLCBhcHBTdGF0ZS5waGFzZSk7XG4gICAgICAgICAgICAgIGlmIChhcHBTdGF0ZS5waGFzZSA9PT0gc2RrLkFwcC5QaGFzZS5QTEFZSU5HKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1RoZSBhcHAgaXMgcGxheWluZycpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd2luZ1ZpZXdlciA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy52aWV3ZXJJc09uLm5leHQoe1xuICAgICAgICAgICAgICAgICAgc3BhY2VJRCxcbiAgICAgICAgICAgICAgICAgIG1vZGVsM0QsXG4gICAgICAgICAgICAgICAgICBzd2VlcDogdGhpcy5zd2VlcFRvTW92ZSxcbiAgICAgICAgICAgICAgICAgIHJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uVG9Nb3ZlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YUlzTG9hZGVkLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0xvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5zd2VlcFRvTW92ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5yb3RhdGlvblRvTW92ZSA9IG51bGw7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0uYmluZCh0aGlzKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB0aGlzLnZpZXdlcklzT24ubmV4dCh7XG4gICAgICAgICAgICBzcGFjZUlELFxuICAgICAgICAgICAgbW9kZWwzRCxcbiAgICAgICAgICAgIHN3ZWVwOiB0aGlzLnN3ZWVwVG9Nb3ZlLFxuICAgICAgICAgICAgcm90YXRpb246IHRoaXMucm90YXRpb25Ub01vdmUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy5kYXRhSXNMb2FkZWQubmV4dCh0cnVlKTtcbiAgICAgICAgICB0aGlzLmlzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICB0aGlzLnN3ZWVwVG9Nb3ZlID0gbnVsbDtcbiAgICAgICAgICB0aGlzLnJvdGF0aW9uVG9Nb3ZlID0gbnVsbDtcblxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlRm9yYmlkZGVuU3dlZXBzKGZvcmJpZGRlblN3ZWVwczogc3RyaW5nW10pIHtcbiAgICBpZiAodGhpcy5jaGVja01vZGUoJ01hdHRlcnBvcnQnKSkge1xuICAgICAgdGhpcy5tYXR0ZXJwb3J0U2VydmljZS5yZW1vdmVGb3JiaWRkZW5Td2VlcHMoZm9yYmlkZGVuU3dlZXBzKTtcbiAgICB9XG4gIH1cblxuICBzZXRPYmplY3QzRExvYWRlZEluUG9zaXRpb24ob2JqZWN0TG9hZGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pc09iamVjdExvYWRlZCA9IG9iamVjdExvYWRlZDtcbiAgfVxuXG4gIGlzT2JqZWN0M0RMb2FkZWRJblBvc2l0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzT2JqZWN0TG9hZGVkO1xuICB9XG59XG4iXX0=
|
|
@@ -7,6 +7,15 @@ import * as i0 from "@angular/core";
|
|
|
7
7
|
export class ZoneChangeService {
|
|
8
8
|
zoneChange = new Subject();
|
|
9
9
|
zonesForUserChange = new Subject();
|
|
10
|
+
/**
|
|
11
|
+
* Emits the space opened by a viewer that has no zone navigation (Three.js), or null when it
|
|
12
|
+
* closes.
|
|
13
|
+
*
|
|
14
|
+
* Zones are defined by the sweeps they contain, so they only mean something in a Matterport tour.
|
|
15
|
+
* A 3D model has no sweeps: it shows the whole space at once, and the services that load data
|
|
16
|
+
* listen here instead of to `zoneChange` to know which space they are looking at.
|
|
17
|
+
*/
|
|
18
|
+
spaceWithoutZones = new Subject();
|
|
10
19
|
currentZone;
|
|
11
20
|
currentZones;
|
|
12
21
|
floorHasChanged = new EventEmitter();
|
|
@@ -29,4 +38,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
29
38
|
providedIn: 'root',
|
|
30
39
|
}]
|
|
31
40
|
}], ctorParameters: () => [] });
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9uZUNoYW5nZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy96b25lQ2hhbmdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFHL0I7O0dBRUc7QUFJSCxNQUFNLE9BQU8saUJBQWlCO0lBRTVCLFVBQVUsR0FBeUIsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUNqRCxrQkFBa0IsR0FBMkIsSUFBSSxPQUFPLEVBQUUsQ0FBQztJQUUzRDs7Ozs7OztPQU9HO0lBQ0gsaUJBQWlCLEdBQTJCLElBQUksT0FBTyxFQUFFLENBQUM7SUFFbEQsV0FBVyxDQUFPO0lBQ2xCLFlBQVksQ0FBUztJQUV0QixlQUFlLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7SUFFdEU7UUFDRSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2pDLGtEQUFrRDtZQUNsRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUMxQixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUMxQyxvREFBb0Q7WUFDcEQsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO3dHQTlCVSxpQkFBaUI7NEdBQWpCLGlCQUFpQixjQUZoQixNQUFNOzs0RkFFUCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRXZlbnRFbWl0dGVyLCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBab25lIH0gZnJvbSAnLi4vdHlwZXMuc2VydmljZSc7XG5cbi8qKlxuICogQXRvbWljIHpvbmUgY2hhbmdlIHNlcnZpY2UgdG8gYnJlYWsgY3ljbGljIGRlcGVuZGVuY2llcyBpc3N1ZVxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgWm9uZUNoYW5nZVNlcnZpY2Uge1xuXG4gIHpvbmVDaGFuZ2U6IFN1YmplY3Q8Wm9uZSB8IG51bGw+ID0gbmV3IFN1YmplY3QoKTtcbiAgem9uZXNGb3JVc2VyQ2hhbmdlOiBTdWJqZWN0PFpvbmVbXSB8IG51bGw+ID0gbmV3IFN1YmplY3QoKTtcblxuICAvKipcbiAgICogRW1pdHMgdGhlIHNwYWNlIG9wZW5lZCBieSBhIHZpZXdlciB0aGF0IGhhcyBubyB6b25lIG5hdmlnYXRpb24gKFRocmVlLmpzKSwgb3IgbnVsbCB3aGVuIGl0XG4gICAqIGNsb3Nlcy5cbiAgICpcbiAgICogWm9uZXMgYXJlIGRlZmluZWQgYnkgdGhlIHN3ZWVwcyB0aGV5IGNvbnRhaW4sIHNvIHRoZXkgb25seSBtZWFuIHNvbWV0aGluZyBpbiBhIE1hdHRlcnBvcnQgdG91ci5cbiAgICogQSAzRCBtb2RlbCBoYXMgbm8gc3dlZXBzOiBpdCBzaG93cyB0aGUgd2hvbGUgc3BhY2UgYXQgb25jZSwgYW5kIHRoZSBzZXJ2aWNlcyB0aGF0IGxvYWQgZGF0YVxuICAgKiBsaXN0ZW4gaGVyZSBpbnN0ZWFkIG9mIHRvIGB6b25lQ2hhbmdlYCB0byBrbm93IHdoaWNoIHNwYWNlIHRoZXkgYXJlIGxvb2tpbmcgYXQuXG4gICAqL1xuICBzcGFjZVdpdGhvdXRab25lczogU3ViamVjdDxzdHJpbmcgfCBudWxsPiA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHJpdmF0ZSBjdXJyZW50Wm9uZTogWm9uZTtcbiAgcHJpdmF0ZSBjdXJyZW50Wm9uZXM6IFpvbmVbXTtcblxuICBwdWJsaWMgZmxvb3JIYXNDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8Wm9uZT4gPSBuZXcgRXZlbnRFbWl0dGVyPFpvbmU+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy56b25lQ2hhbmdlLnN1YnNjcmliZSgoem9uZSkgPT4ge1xuICAgICAgLy9jb25zb2xlLmxvZyhgbmV3IHpvbmUgJHtKU09OLnN0cmluZ2lmeSh6b25lKX1gKTtcbiAgICAgIHRoaXMuY3VycmVudFpvbmUgPSB6b25lO1xuICAgIH0pO1xuXG4gICAgdGhpcy56b25lc0ZvclVzZXJDaGFuZ2Uuc3Vic2NyaWJlKCh6b25lcykgPT4ge1xuICAgICAgLy9jb25zb2xlLmxvZyhgbmV3IHpvbmVzICR7SlNPTi5zdHJpbmdpZnkoem9uZXMpfWApO1xuICAgICAgdGhpcy5jdXJyZW50Wm9uZXMgPSB6b25lcztcbiAgICB9KTtcbiAgfVxuXG59XG4iXX0=
|