@smarterplan/ngx-smarterplan-core 1.4.12 → 1.4.13
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/matterport-tag.service.mjs +169 -60
- package/esm2022/lib/services/matterport.service.mjs +222 -39
- package/esm2022/lib/services/viewer.service.mjs +8 -1
- package/esm2022/lib/types.service.mjs +9 -1
- package/fesm2022/smarterplan-ngx-smarterplan-core.mjs +404 -97
- package/fesm2022/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
- package/lib/services/matterport-tag.service.d.ts +61 -7
- package/lib/services/matterport.service.d.ts +56 -1
- package/lib/types.service.d.ts +18 -0
- package/package.json +1 -1
|
@@ -3,7 +3,7 @@ import { MATTERPORT_SDK_KEY } from '../tokens/matterport-sdk-key.token';
|
|
|
3
3
|
import { Subject } from 'rxjs';
|
|
4
4
|
import { poiTypeToString, wait } from '../helpers.service';
|
|
5
5
|
import { MattertagData } from '../mattertagData';
|
|
6
|
-
import { FeatureType, MattertagActionMode, PoiType, SpModule, ViewerInteractions, } from '../types.service';
|
|
6
|
+
import { FeatureType, MattertagActionMode, MatterportViewType, PoiType, SpModule, ViewerInteractions, } from '../types.service';
|
|
7
7
|
import * as i0 from "@angular/core";
|
|
8
8
|
import * as i1 from "@angular/router";
|
|
9
9
|
import * as i2 from "./baseVisibility.service";
|
|
@@ -112,6 +112,15 @@ export class MatterportService {
|
|
|
112
112
|
this.navigationService.forbiddenSweeps = value;
|
|
113
113
|
}
|
|
114
114
|
tagAction = new Subject();
|
|
115
|
+
/** Views (furnished, defurnished...) exposed by the SDK for the current space. */
|
|
116
|
+
viewsByType = new Map();
|
|
117
|
+
currentView = null;
|
|
118
|
+
viewSubscriptions = [];
|
|
119
|
+
/** Emits the active view every time the user switches between furnished/defurnished. */
|
|
120
|
+
onViewChanged = new Subject();
|
|
121
|
+
/** Delay left to the SDK to rebuild the layer's tags after a view switch. */
|
|
122
|
+
static VIEW_SWITCH_REFRESH_DELAY_MS = 800;
|
|
123
|
+
viewSwitchRestoreTimer = null;
|
|
115
124
|
get mattertagToFollow() {
|
|
116
125
|
return this.matterportTagService.mattertagToFollow;
|
|
117
126
|
}
|
|
@@ -267,7 +276,9 @@ export class MatterportService {
|
|
|
267
276
|
default:
|
|
268
277
|
break;
|
|
269
278
|
}
|
|
270
|
-
this.sdk.Asset.registerTexture('icon-position', this.config.my_config.icon_position)
|
|
279
|
+
this.sdk.Asset.registerTexture('icon-position', this.config.my_config.icon_position)
|
|
280
|
+
.catch((e) => { if (isDevMode())
|
|
281
|
+
console.warn('icon-position texture registration failed', e); });
|
|
271
282
|
// Current Room (used for getting bounding box and eventually lazy load mattertag or object3D inside current Room)
|
|
272
283
|
this.sdk.Room.current.subscribe((currentRoom) => {
|
|
273
284
|
const rooms = Array.isArray(currentRoom) ? currentRoom : (currentRoom ? [currentRoom] : []);
|
|
@@ -365,8 +376,9 @@ export class MatterportService {
|
|
|
365
376
|
if (!this.sdk || sid === this.mattertagToFollow)
|
|
366
377
|
return; // ignore when we are in positioning mode
|
|
367
378
|
try {
|
|
368
|
-
|
|
369
|
-
|
|
379
|
+
const tagModule = this.matterportTagService.getTagModule(this.sdk, sid);
|
|
380
|
+
if (tagModule?.allowAction) {
|
|
381
|
+
tagModule.allowAction(sid, { opening: true, navigating: true, docking: false });
|
|
370
382
|
}
|
|
371
383
|
}
|
|
372
384
|
catch (e) {
|
|
@@ -378,7 +390,11 @@ export class MatterportService {
|
|
|
378
390
|
};
|
|
379
391
|
// Wait for the application to reach PLAYING phase
|
|
380
392
|
if (this.sdk.App && this.sdk.App.state) {
|
|
381
|
-
this.sdk.App.state.waitUntil((s) => s.phase === this.sdk.App.Phase.PLAYING).then(() => {
|
|
393
|
+
this.sdk.App.state.waitUntil((s) => s.phase === this.sdk.App.Phase.PLAYING).then(async () => {
|
|
394
|
+
// Create the common layer holding every tag before any tag is added, so that
|
|
395
|
+
// tags are shared between the furnished and the defurnished views.
|
|
396
|
+
await this.matterportTagService.ensureSharedTagLayer(this.sdk);
|
|
397
|
+
this.initViews();
|
|
382
398
|
this.sdk.Camera.pose.subscribe((pose) => {
|
|
383
399
|
this.poseCamera = pose;
|
|
384
400
|
this.matterportTagService.updateTagsVisibilityForContext(this.sdk, this.sweepCollection, this.navigationService.currentCameraMode, this.mattertagToFollow, this.navigationService.currentFloorSequence, this.navigationService.currentRooms);
|
|
@@ -518,7 +534,7 @@ export class MatterportService {
|
|
|
518
534
|
*/
|
|
519
535
|
enable_following_tag(mattertag) {
|
|
520
536
|
const OFFSET = 0.0001; // quasi-invisible mais suffit à éviter l'interception
|
|
521
|
-
this.sdk.
|
|
537
|
+
this.matterportTagService.getTagModule(this.sdk, mattertag).editPosition(mattertag, {
|
|
522
538
|
anchorPosition: {
|
|
523
539
|
x: this.poseMatterport.position.x + OFFSET,
|
|
524
540
|
y: this.poseMatterport.position.y,
|
|
@@ -545,28 +561,42 @@ export class MatterportService {
|
|
|
545
561
|
//
|
|
546
562
|
/** Creates a temporary Mattertag that follows the user's cursor for positioning. */
|
|
547
563
|
async addCursorMattertag(mattertagData) {
|
|
564
|
+
if (!this.poseMatterport && this.poseCamera) {
|
|
565
|
+
this.poseMatterport = {
|
|
566
|
+
position: { ...this.poseCamera.position },
|
|
567
|
+
normal: { x: 0, y: -0.15, z: 0 },
|
|
568
|
+
time: new Date().getTime()
|
|
569
|
+
};
|
|
570
|
+
}
|
|
548
571
|
if (!this.poseMatterport)
|
|
549
572
|
return;
|
|
550
573
|
this.mattertagToFollow = await this.addMattertagToViewer(mattertagData);
|
|
574
|
+
if (!this.mattertagToFollow) {
|
|
575
|
+
if (isDevMode())
|
|
576
|
+
console.warn('addCursorMattertag: tag creation failed, mattertagToFollow is null');
|
|
577
|
+
return;
|
|
578
|
+
}
|
|
551
579
|
await wait(50);
|
|
552
|
-
this.
|
|
553
|
-
this.sdk.Tag.editOpacity(this.mattertagToFollow, 1);
|
|
554
|
-
this.sdk.Tag.editPosition(this.mattertagToFollow, {
|
|
555
|
-
anchorPosition: { ...this.poseMatterport.position },
|
|
556
|
-
stemVector: {
|
|
557
|
-
x: this.poseMatterport.normal.x * 0.3,
|
|
558
|
-
y: this.poseMatterport.normal.y * 0.3,
|
|
559
|
-
z: this.poseMatterport.normal.z * 0.3,
|
|
560
|
-
}
|
|
561
|
-
});
|
|
580
|
+
const tagModule = this.matterportTagService.getTagModule(this.sdk, this.mattertagToFollow);
|
|
562
581
|
try {
|
|
563
|
-
await
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
582
|
+
await tagModule.editIcon(this.mattertagToFollow, 'icon-position');
|
|
583
|
+
await tagModule.editOpacity(this.mattertagToFollow, 1);
|
|
584
|
+
await tagModule.editPosition(this.mattertagToFollow, {
|
|
585
|
+
anchorPosition: { ...this.poseMatterport.position },
|
|
586
|
+
stemVector: {
|
|
587
|
+
x: (this.poseMatterport.normal?.x ?? 0) * 0.3,
|
|
588
|
+
y: (this.poseMatterport.normal?.y ?? -0.15) * 0.3,
|
|
589
|
+
z: (this.poseMatterport.normal?.z ?? 0) * 0.3,
|
|
590
|
+
}
|
|
591
|
+
});
|
|
592
|
+
await tagModule.allowAction(this.mattertagToFollow, {
|
|
593
|
+
opening: true, navigating: false, docking: false
|
|
567
594
|
});
|
|
568
595
|
}
|
|
569
|
-
catch (e) {
|
|
596
|
+
catch (e) {
|
|
597
|
+
if (isDevMode())
|
|
598
|
+
console.warn('addCursorMattertag: error configuring cursor tag', e);
|
|
599
|
+
}
|
|
570
600
|
}
|
|
571
601
|
get tagAddQueue() {
|
|
572
602
|
return this.matterportTagService.tagAddQueue;
|
|
@@ -595,7 +625,7 @@ export class MatterportService {
|
|
|
595
625
|
/** Applies a pre-registered icon to a Mattertag. */
|
|
596
626
|
async setRegistredIconForTag(mattertagID, iconName) {
|
|
597
627
|
try {
|
|
598
|
-
this.sdk.
|
|
628
|
+
this.matterportTagService.getTagModule(this.sdk, mattertagID).editIcon(mattertagID, iconName);
|
|
599
629
|
}
|
|
600
630
|
catch (e) {
|
|
601
631
|
if (isDevMode())
|
|
@@ -613,7 +643,7 @@ export class MatterportService {
|
|
|
613
643
|
else {
|
|
614
644
|
iconName = `${iconName}_unavailable`;
|
|
615
645
|
}
|
|
616
|
-
this.
|
|
646
|
+
await this.editTagIcon(mattertagID, iconName);
|
|
617
647
|
return;
|
|
618
648
|
}
|
|
619
649
|
const stringTagType = poiTypeToString(mattertagData.getType());
|
|
@@ -645,11 +675,19 @@ export class MatterportService {
|
|
|
645
675
|
opacity = tagIcon.opacity;
|
|
646
676
|
}
|
|
647
677
|
}
|
|
678
|
+
await this.editTagIcon(mattertagID, iconName);
|
|
679
|
+
}
|
|
680
|
+
/**
|
|
681
|
+
* Applies an icon to a tag. The call is awaited and its rejection reported: a
|
|
682
|
+
* silently dropped promise here leaves the pin with its default white look.
|
|
683
|
+
*/
|
|
684
|
+
async editTagIcon(mattertagID, iconName) {
|
|
648
685
|
try {
|
|
649
|
-
this.sdk.
|
|
686
|
+
await this.matterportTagService.getTagModule(this.sdk, mattertagID).editIcon(mattertagID, iconName);
|
|
650
687
|
}
|
|
651
688
|
catch (error) {
|
|
652
|
-
|
|
689
|
+
if (isDevMode())
|
|
690
|
+
console.warn('[MatterportService] editIcon failed for', mattertagID, iconName, error);
|
|
653
691
|
}
|
|
654
692
|
}
|
|
655
693
|
/** Navigates the camera to the most recently created tag. */
|
|
@@ -670,12 +708,9 @@ export class MatterportService {
|
|
|
670
708
|
await this.sdk.Camera.lookAt(position, {
|
|
671
709
|
transition: this.sdk.Camera.TransitionType.FLY
|
|
672
710
|
});
|
|
673
|
-
await this.sdk.Tag.open(mattertagID);
|
|
674
|
-
}
|
|
675
|
-
else {
|
|
676
|
-
// Fallback for cases where we don't have local data yet
|
|
677
|
-
await this.sdk.Tag.open(mattertagID);
|
|
678
711
|
}
|
|
712
|
+
// `open` only exists on the global Tag module, never on a layer-scoped one.
|
|
713
|
+
await this.sdk.Tag.open(mattertagID);
|
|
679
714
|
}
|
|
680
715
|
catch (error) {
|
|
681
716
|
if (isDevMode())
|
|
@@ -759,6 +794,9 @@ export class MatterportService {
|
|
|
759
794
|
.logo-link,
|
|
760
795
|
.footer-logo,
|
|
761
796
|
.bottom-ui,
|
|
797
|
+
img.logo-image,
|
|
798
|
+
img[class^="logo-image"],
|
|
799
|
+
img[class*=" logo-image"],
|
|
762
800
|
[data-testid="showcase-footer"] {
|
|
763
801
|
opacity: 0 !important;
|
|
764
802
|
visibility: hidden !important;
|
|
@@ -785,7 +823,7 @@ export class MatterportService {
|
|
|
785
823
|
*/
|
|
786
824
|
async updateMatterTagContentForTagID(mattertagID, object = null, tagType = null) {
|
|
787
825
|
if (this.sdk) {
|
|
788
|
-
await this.sdk.
|
|
826
|
+
await this.matterportTagService.getTagModule(this.sdk, mattertagID).editBillboard(mattertagID, this.dictionnaryTags.get(mattertagID).getData());
|
|
789
827
|
}
|
|
790
828
|
// Mise à jour de l'icône immédiate
|
|
791
829
|
await this.matterportTagService.updateMatterTagContentForTagID(this.sdk, mattertagID, object, tagType, this.setTagIconAndOpacity.bind(this),
|
|
@@ -828,7 +866,7 @@ export class MatterportService {
|
|
|
828
866
|
* @returns
|
|
829
867
|
*/
|
|
830
868
|
async createMattertagFromPOI(tagType, object, poi) {
|
|
831
|
-
return this.matterportTagService.createMattertagFromPOI(this.sdk, tagType, object, poi, this.
|
|
869
|
+
return this.matterportTagService.createMattertagFromPOI(this.sdk, tagType, object, poi, this.getTagFromElementId.bind(this), this.setTagIconAndOpacity.bind(this), this.injectHtmlInTag.bind(this));
|
|
832
870
|
}
|
|
833
871
|
/**
|
|
834
872
|
* Inject custom HTML as Mattertag content
|
|
@@ -893,6 +931,10 @@ export class MatterportService {
|
|
|
893
931
|
const mattertagData = new MattertagData(poiType);
|
|
894
932
|
mattertagData.setSweepID(this.navigationService.resolveSweepUuid(this.poseCamera.sweep));
|
|
895
933
|
mattertagData.setRotation(this.poseCamera.rotation);
|
|
934
|
+
const initialPosition = this.poseMatterport?.position ?? this.poseCamera.position;
|
|
935
|
+
const initialNormal = this.poseMatterport?.normal ?? { x: 0, y: -0.15, z: 0 };
|
|
936
|
+
mattertagData.setPosition({ ...initialPosition });
|
|
937
|
+
mattertagData.setNormal({ ...initialNormal });
|
|
896
938
|
this.setInteractionMode(ViewerInteractions.ADDING);
|
|
897
939
|
await this.addCursorMattertag(mattertagData);
|
|
898
940
|
}
|
|
@@ -1010,8 +1052,14 @@ export class MatterportService {
|
|
|
1010
1052
|
}
|
|
1011
1053
|
}
|
|
1012
1054
|
async updateMatterTagPosInSdkViewer(mattertagID, object, poiType, poi = null) {
|
|
1013
|
-
|
|
1014
|
-
|
|
1055
|
+
if (!poi || !poi.coordinate) {
|
|
1056
|
+
console.warn('updateMatterTagPosInSdkViewer: poi or poi.coordinate is missing', poi);
|
|
1057
|
+
return;
|
|
1058
|
+
}
|
|
1059
|
+
const IndexToUpdate = object.pois?.items ? object.pois.items.findIndex((u) => u?.id === poi.id) : -1;
|
|
1060
|
+
if (IndexToUpdate !== -1 && object.pois?.items) {
|
|
1061
|
+
object.pois.items[IndexToUpdate] = poi;
|
|
1062
|
+
}
|
|
1015
1063
|
const { x, y, z } = JSON.parse(poi.coordinate);
|
|
1016
1064
|
const newPosition = {
|
|
1017
1065
|
anchorPosition: {
|
|
@@ -1026,8 +1074,7 @@ export class MatterportService {
|
|
|
1026
1074
|
z: 0,
|
|
1027
1075
|
},
|
|
1028
1076
|
};
|
|
1029
|
-
|
|
1030
|
-
this.sdk.Tag.editPosition(mattertagID, newPosition);
|
|
1077
|
+
this.matterportTagService.getTagModule(this.sdk, mattertagID).editPosition(mattertagID, newPosition);
|
|
1031
1078
|
this.dictionnaryTags
|
|
1032
1079
|
.get(mattertagID)
|
|
1033
1080
|
.setPosition(newPosition.anchorPosition);
|
|
@@ -1037,8 +1084,7 @@ export class MatterportService {
|
|
|
1037
1084
|
continue;
|
|
1038
1085
|
}
|
|
1039
1086
|
if (currentTag.elementID === object.id && tagId !== mattertagID) {
|
|
1040
|
-
this.
|
|
1041
|
-
this.sdk.Tag.remove(tagId);
|
|
1087
|
+
await this.matterportTagService.deleteMattertagFromId(this.sdk, tagId);
|
|
1042
1088
|
break;
|
|
1043
1089
|
}
|
|
1044
1090
|
}
|
|
@@ -1080,6 +1126,140 @@ export class MatterportService {
|
|
|
1080
1126
|
return null;
|
|
1081
1127
|
}
|
|
1082
1128
|
//
|
|
1129
|
+
// ---------- Views (furnished / defurnished) ----------
|
|
1130
|
+
//
|
|
1131
|
+
/**
|
|
1132
|
+
* Subscribes to the SDK View API to keep track of the views available for the space
|
|
1133
|
+
* and of the active one. Tags live in a shared common layer, so a view change only
|
|
1134
|
+
* requires re-applying their visibility, never re-creating them.
|
|
1135
|
+
*/
|
|
1136
|
+
initViews() {
|
|
1137
|
+
this.clearViewSubscriptions();
|
|
1138
|
+
this.viewsByType.clear();
|
|
1139
|
+
this.currentView = null;
|
|
1140
|
+
if (!this.sdk?.View?.views) {
|
|
1141
|
+
if (isDevMode())
|
|
1142
|
+
console.warn('[MatterportService] View API unavailable on this SDK version');
|
|
1143
|
+
return;
|
|
1144
|
+
}
|
|
1145
|
+
this.viewSubscriptions.push(this.sdk.View.views.subscribe({
|
|
1146
|
+
onCollectionUpdated: (collection) => {
|
|
1147
|
+
// SDK callbacks run outside Angular: re-enter the zone so the views made
|
|
1148
|
+
// available here (defurnish button...) are picked up by change detection.
|
|
1149
|
+
this.ngZone.run(() => {
|
|
1150
|
+
this.viewsByType.clear();
|
|
1151
|
+
for (const view of Object.values(collection)) {
|
|
1152
|
+
this.viewsByType.set(view.type, view);
|
|
1153
|
+
}
|
|
1154
|
+
});
|
|
1155
|
+
// Views are discovered progressively: make sure each one carries the shared
|
|
1156
|
+
// tag layer, otherwise its tags would not exist in that view.
|
|
1157
|
+
this.matterportTagService.attachSharedTagLayerToViews(this.sdk, Object.values(collection));
|
|
1158
|
+
},
|
|
1159
|
+
}));
|
|
1160
|
+
this.viewSubscriptions.push(this.sdk.View.current.subscribe((view) => {
|
|
1161
|
+
const changed = this.currentView?.id !== view?.id;
|
|
1162
|
+
this.currentView = view;
|
|
1163
|
+
if (!changed)
|
|
1164
|
+
return;
|
|
1165
|
+
this.restoreTagsForActiveView(view);
|
|
1166
|
+
this.ngZone.run(() => this.onViewChanged.next(view));
|
|
1167
|
+
}));
|
|
1168
|
+
}
|
|
1169
|
+
/**
|
|
1170
|
+
* Forces the opacity/enabled state to be pushed again to every tag. The SDK
|
|
1171
|
+
* re-renders the shared layer's tags on a view swap, and the memoized values would
|
|
1172
|
+
* otherwise make updateTagsVisibilityForContext() skip them, leaving tags invisible.
|
|
1173
|
+
*/
|
|
1174
|
+
reapplyTagsVisibility() {
|
|
1175
|
+
this.matterportTagService.resetVisibilityCache();
|
|
1176
|
+
this.refreshTagsVisibility();
|
|
1177
|
+
}
|
|
1178
|
+
/**
|
|
1179
|
+
* Puts the tags back in shape in the view that just became active.
|
|
1180
|
+
*
|
|
1181
|
+
* Activating a view re-materializes the shared layer's tags from the descriptors
|
|
1182
|
+
* recorded when they were added, so everything applied to a tag *afterwards* through
|
|
1183
|
+
* the global Tag module is dropped along the way: the custom icon (the pin falls back
|
|
1184
|
+
* to the descriptor's white) and the sandbox carrying the hover content. They have to
|
|
1185
|
+
* be applied again on the freshly rebuilt tags.
|
|
1186
|
+
*
|
|
1187
|
+
* Visibility is refreshed straight away so the tags show up without waiting, then
|
|
1188
|
+
* content is re-applied once the transition is over — re-applying it too early would
|
|
1189
|
+
* target tags the SDK has not rebuilt yet.
|
|
1190
|
+
*/
|
|
1191
|
+
restoreTagsForActiveView(view) {
|
|
1192
|
+
// A view only materializes its layers once activated: (re)attach the shared one.
|
|
1193
|
+
this.matterportTagService.attachSharedTagLayerToViews(this.sdk, [view])
|
|
1194
|
+
.then(() => this.reapplyTagsVisibility());
|
|
1195
|
+
this.reapplyTagsVisibility();
|
|
1196
|
+
clearTimeout(this.viewSwitchRestoreTimer);
|
|
1197
|
+
this.viewSwitchRestoreTimer = setTimeout(() => {
|
|
1198
|
+
this.refreshTagsContent()
|
|
1199
|
+
.catch((e) => {
|
|
1200
|
+
if (isDevMode())
|
|
1201
|
+
console.warn('[MatterportService] Cannot restore tags for view', view?.id, e);
|
|
1202
|
+
})
|
|
1203
|
+
.then(() => this.reapplyTagsVisibility());
|
|
1204
|
+
}, MatterportService.VIEW_SWITCH_REFRESH_DELAY_MS);
|
|
1205
|
+
}
|
|
1206
|
+
/**
|
|
1207
|
+
* Re-applies the icon and the injected HTML of every tag we own. Used after a view
|
|
1208
|
+
* switch, see restoreTagsForActiveView().
|
|
1209
|
+
*/
|
|
1210
|
+
async refreshTagsContent() {
|
|
1211
|
+
if (!this.sdk)
|
|
1212
|
+
return;
|
|
1213
|
+
// Snapshot: the dictionary can be mutated while the awaits below are pending.
|
|
1214
|
+
for (const [sid, mattertagData] of [...this.dictionnaryTags]) {
|
|
1215
|
+
if (sid === this.mattertagToFollow)
|
|
1216
|
+
continue;
|
|
1217
|
+
await this.setTagIconAndOpacity(sid, mattertagData);
|
|
1218
|
+
this.injectHtmlInTag(mattertagData.getType(), mattertagData.getObject(), sid)
|
|
1219
|
+
.catch((err) => {
|
|
1220
|
+
if (isDevMode())
|
|
1221
|
+
console.warn('[MatterportService] HTML re-injection failed for', sid, err);
|
|
1222
|
+
});
|
|
1223
|
+
}
|
|
1224
|
+
}
|
|
1225
|
+
clearViewSubscriptions() {
|
|
1226
|
+
clearTimeout(this.viewSwitchRestoreTimer);
|
|
1227
|
+
this.viewSwitchRestoreTimer = null;
|
|
1228
|
+
for (const subscription of this.viewSubscriptions) {
|
|
1229
|
+
try {
|
|
1230
|
+
subscription.cancel();
|
|
1231
|
+
}
|
|
1232
|
+
catch (e) {
|
|
1233
|
+
if (isDevMode())
|
|
1234
|
+
console.warn('[MatterportService] Cannot cancel view subscription', e);
|
|
1235
|
+
}
|
|
1236
|
+
}
|
|
1237
|
+
this.viewSubscriptions = [];
|
|
1238
|
+
}
|
|
1239
|
+
/** True when the space provides a defurnished view. */
|
|
1240
|
+
get hasDefurnishView() {
|
|
1241
|
+
return this.viewsByType.has(MatterportViewType.DEFURNISH);
|
|
1242
|
+
}
|
|
1243
|
+
/** True when the defurnished view is the active one. */
|
|
1244
|
+
get isDefurnishedView() {
|
|
1245
|
+
return this.currentView?.type === MatterportViewType.DEFURNISH;
|
|
1246
|
+
}
|
|
1247
|
+
/**
|
|
1248
|
+
* Switches between the defurnished view and the furnished one.
|
|
1249
|
+
* @param returnToStart Move the camera back to the view's start location.
|
|
1250
|
+
*/
|
|
1251
|
+
async toggleDefurnishView(returnToStart = false) {
|
|
1252
|
+
const target = this.isDefurnishedView
|
|
1253
|
+
? this.viewsByType.get(MatterportViewType.LAYERED_BASE) ?? this.viewsByType.get(MatterportViewType.BASE)
|
|
1254
|
+
: this.viewsByType.get(MatterportViewType.DEFURNISH);
|
|
1255
|
+
if (!target) {
|
|
1256
|
+
if (isDevMode())
|
|
1257
|
+
console.warn('[MatterportService] No target view to switch to');
|
|
1258
|
+
return;
|
|
1259
|
+
}
|
|
1260
|
+
await target.setActive(returnToStart);
|
|
1261
|
+
}
|
|
1262
|
+
//
|
|
1083
1263
|
// ---------- Viewer related (switch views, go to) ----------
|
|
1084
1264
|
//
|
|
1085
1265
|
async action_toolbox_floorplan() {
|
|
@@ -1131,6 +1311,9 @@ export class MatterportService {
|
|
|
1131
1311
|
*/
|
|
1132
1312
|
async clearAll() {
|
|
1133
1313
|
console.log('removing viewer');
|
|
1314
|
+
this.clearViewSubscriptions();
|
|
1315
|
+
this.viewsByType.clear();
|
|
1316
|
+
this.currentView = null;
|
|
1134
1317
|
await this.action_delete_all_mattertags();
|
|
1135
1318
|
this.floors = null;
|
|
1136
1319
|
this.sweeps = null;
|
|
@@ -1193,4 +1376,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
1193
1376
|
type: Inject,
|
|
1194
1377
|
args: [MATTERPORT_SDK_KEY]
|
|
1195
1378
|
}] }, { type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.BaseVisibilityService }, { type: i0.NgZone }, { type: i3.MatterportMeasurementService }, { type: i4.MatterportNavigationService }, { type: i5.MatterportPointerService }, { type: i6.MatterportObject3DService }, { type: i7.MatterportTagService }] });
|
|
1196
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0dGVycG9ydC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9tYXR0ZXJwb3J0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXhFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUNMLGVBQWUsRUFDZixJQUFJLEVBQ0wsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUVMLFdBQVcsRUFFWCxtQkFBbUIsRUFFbkIsT0FBTyxFQUNQLFFBQVEsRUFDUixrQkFBa0IsR0FDbkIsTUFBTSxrQkFBa0IsQ0FBQzs7Ozs7Ozs7OztBQStCMUIsTUFBTSxPQUFPLGlCQUFpQjtJQXNObUI7SUFDckM7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBN05ILEdBQUcsQ0FBTTtJQUVSLFNBQVMsQ0FBTTtJQUV2QixrQkFBa0I7SUFDVixjQUFjLENBQU07SUFFckIsVUFBVSxDQUErQztJQUV6RCxrQkFBa0IsR0FBUSxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFFcEQsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUV4QixlQUFlLEdBQVcsa0JBQWtCLENBQUMsT0FBTyxDQUFDO0lBRXJELFVBQVUsR0FBVyxRQUFRLENBQUM7SUFFdEMsSUFBVyxZQUFZO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFD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Q3ZCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQ25DLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQ3BDLENBQUM7SUFDSixDQUFDO0lBRUQsMEJBQTBCLENBQUMsSUFBWTtRQUNyQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELEtBQUssQ0FBQyxvQkFBb0I7UUFDeEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQsS0FBSyxDQUFDLDRCQUE0QixDQUNoQyxTQUFjLEVBQ2QsV0FBZ0IsRUFDaEIsSUFBc0MsRUFDdEMsT0FBZ0IsRUFDaEIsV0FBb0I7UUFFcEIsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3pILENBQUM7SUFFRCx5QkFBeUI7UUFDdkIsSUFBSSxDQUFDLGVBQWUsQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO0lBQ25ELENBQUM7SUFFRCxpQkFBaUI7UUFDZixJQUFJLENBQUMsZUFBZSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0MsQ0FBQzt3R0F2K0NVLGlCQUFpQixrQkFxTmxCLFFBQVEsYUFDUixrQkFBa0I7NEdBdE5qQixpQkFBaUIsY0FGaEIsTUFBTTs7NEZBRVAsaUJBQWlCO2tCQUg3QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBc05JLE1BQU07MkJBQUMsUUFBUTs7MEJBQ2YsTUFBTTsyQkFBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE5nWm9uZSwgaXNEZXZNb2RlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1BVFRFUlBPUlRfU0RLX0tFWSB9IGZyb20gJy4uL3Rva2Vucy9tYXR0ZXJwb3J0LXNkay1rZXkudG9rZW4nO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge1xyXG4gIHBvaVR5cGVUb1N0cmluZyxcclxuICB3YWl0XHJcbn0gZnJvbSAnLi4vaGVscGVycy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWF0dGVydGFnRGF0YSB9IGZyb20gJy4uL21hdHRlcnRhZ0RhdGEnO1xyXG5pbXBvcnQge1xyXG4gIERiT2JqZWN0VHlwZSxcclxuICBGZWF0dXJlVHlwZSxcclxuICBJT2JqZWN0M0QsXHJcbiAgTWF0dGVydGFnQWN0aW9uTW9kZSxcclxuICBQT0ksXHJcbiAgUG9pVHlwZSxcclxuICBTcE1vZHVsZSxcclxuICBWaWV3ZXJJbnRlcmFjdGlvbnMsXHJcbn0gZnJvbSAnLi4vdHlwZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VUYWdTZXJ2aWNlIH0gZnJvbSAnLi90YWcuc2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VWaXNpYmlsaXR5U2VydmljZSB9IGZyb20gJy4vYmFzZVZpc2liaWxpdHkuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZyc7XHJcbmltcG9ydCB7IENhbWVyYU1vZGUgfSBmcm9tICcuLi90eXBlcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWF0dGVycG9ydE1lYXN1cmVtZW50U2VydmljZSB9IGZyb20gJy4vbWF0dGVycG9ydC1tZWFzdXJlbWVudC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWF0dGVycG9ydE5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9tYXR0ZXJwb3J0LW5hdmlnYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IE1hdHRlcnBvcnRQb2ludGVyU2VydmljZSB9IGZyb20gJy4vbWF0dGVycG9ydC1wb2ludGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNYXR0ZXJwb3J0T2JqZWN0M0RTZXJ2aWNlIH0gZnJvbSAnLi9tYXR0ZXJwb3J0LW9iamVjdDNkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNYXR0ZXJwb3J0VGFnU2VydmljZSB9IGZyb20gJy4vbWF0dGVycG9ydC10YWcuc2VydmljZSc7XHJcblxyXG4vKipcclxuICogQ3VzdG9tIFRocmVlanMgT2JqZWN0IDNEIGludGVyZmFjZVxyXG4gKi9cclxuaW50ZXJmYWNlIFRocmVlSlNPYmplY3QzRCB7XHJcbiAgaWQ6IHN0cmluZztcclxuICB1dWlkPzogc3RyaW5nO1xyXG4gIHBvc2l0aW9uPzogeyB4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyIH1cclxuICByb3RhdGlvbj86IHsgeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlciB9XHJcbiAgc2NhbGU/OiB7IHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIgfVxyXG59XHJcblxyXG5kZWNsYXJlIGdsb2JhbCB7XHJcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XHJcbiAgICBNUF9TREs6IHsgY29ubmVjdDogRnVuY3Rpb24gfTtcclxuICB9XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYXR0ZXJwb3J0U2VydmljZSB7XHJcblxyXG4gIHB1YmxpYyBzZGs6IGFueTtcclxuXHJcbiAgcHJpdmF0ZSBjb250YWluZXI6IGFueTtcclxuXHJcbiAgLy8gUG9zaXRpb24gY2FtZXJhXHJcbiAgcHJpdmF0ZSBwb3NlTWF0dGVycG9ydDogYW55O1xyXG5cclxuICBwdWJsaWMgcG9zZUNhbWVyYTogeyByb3RhdGlvbjogYW55OyBwb3NpdGlvbjogYW55OyBzd2VlcDogYW55IH07XHJcblxyXG4gIHB1YmxpYyBsYXN0Q2FtZXJhUG9zaXRpb246IGFueSA9IHsgeDogMC4wLCB5OiAwLjAsIHo6IDAuMCB9O1xyXG5cclxuICBwcml2YXRlIGlzTWVhc3VyZU1vZGVPbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIGludGVyYWN0aW9uTW9kZTogbnVtYmVyID0gVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFQ7XHJcblxyXG4gIHByaXZhdGUgY2FtZXJhTW9kZTogc3RyaW5nID0gJ0lOU0lERSc7XHJcblxyXG4gIHB1YmxpYyBnZXQgbWF0dGVydGFnSURzKCk6IEFycmF5PHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UubWF0dGVydGFnSURzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBtYXR0ZXJ0YWdJRHModmFsdWU6IEFycmF5PHN0cmluZz4pIHtcclxuICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UubWF0dGVydGFnSURzID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGRpY3Rpb25uYXJ5VGFncygpOiBNYXA8c3RyaW5nLCBNYXR0ZXJ0YWdEYXRhPiB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5kaWN0aW9ubmFyeVRhZ3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGRpY3Rpb25uYXJ5T2JqZWN0czNEKCk6IE1hcDxzdHJpbmcsIGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmRpY3Rpb25uYXJ5T2JqZWN0czNEO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBkaWN0aW9ubmFyeVNjZW5lT2JqZWN0czNEKCk6IE1hcDxzdHJpbmcsIGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmRpY3Rpb25uYXJ5U2NlbmVPYmplY3RzM0Q7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHRocmVlSlNTY2VuZSgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLnRocmVlSlNTY2VuZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgdGhyZWVKU1NjZW5lKHZhbHVlOiBhbnkpIHtcclxuICAgIHRoaXMub2JqZWN0M0RTZXJ2aWNlLnRocmVlSlNTY2VuZSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBhemltdXRoYWxDcm93bigpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmF6aW11dGhhbENyb3duO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBhemltdXRoYWxDcm93bih2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLm9iamVjdDNEU2VydmljZS5hemltdXRoYWxDcm93biA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCB0YWdzQXR0YWNobWVudHMoKTogT2JqZWN0IHtcclxuICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLnRhZ3NBdHRhY2htZW50cztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgc3dlZXBzKCk6IEFycmF5PHN0cmluZz4gfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnN3ZWVwcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgc3dlZXBzKHZhbHVlOiBBcnJheTxzdHJpbmc+IHwgbnVsbCkge1xyXG4gICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5zd2VlcHMgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgc3dlZXBDb2xsZWN0aW9uKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5zd2VlcENvbGxlY3Rpb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHN3ZWVwQ29sbGVjdGlvbih2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnN3ZWVwQ29sbGVjdGlvbiA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjdXJyZW50U3dlZXAoKTogU3ViamVjdDxzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRTd2VlcDtcclxuICB9XHJcblxyXG4gIC8vY2FtZXJhIHBvc2l0aW9uIHdpdGggcm90YXRpb25cclxuICBwdWJsaWMgY3VycmVudENhbWVyYVBvc2U6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIHB1YmxpYyBnZXQgZmxvb3JzKCk6IEFycmF5PHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBzZXF1ZW5jZTogbnVtYmVyIH0+IHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5mbG9vcnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGZsb29ycyh2YWx1ZTogQXJyYXk8eyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHNlcXVlbmNlOiBudW1iZXIgfT4gfCBudWxsKSB7XHJcbiAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmZsb29ycyA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3VycmVudFNwYWNlSUQ6IHN0cmluZztcclxuXHJcbiAgcHVibGljIGdldCBsYXN0T2JqZWN0M0QoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5sYXN0T2JqZWN0M0Q7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGxhc3RPYmplY3QzRCh2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLm9iamVjdDNEU2VydmljZS5sYXN0T2JqZWN0M0QgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudFJvb21zKCk6IGFueVtdIHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRSb29tcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgY3VycmVudFJvb21zKHZhbHVlOiBhbnlbXSkge1xyXG4gICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Um9vbXMgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudFNwYWNlSUQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50U3BhY2VJRDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgY3VycmVudFNwYWNlSUQodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fY3VycmVudFNwYWNlSUQgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgZm9yYmlkZGVuU3dlZXBzKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmZvcmJpZGRlblN3ZWVwcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgZm9yYmlkZGVuU3dlZXBzKHZhbHVlOiBzdHJpbmdbXSkge1xyXG4gICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5mb3JiaWRkZW5Td2VlcHMgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0YWdBY3Rpb246IFN1YmplY3Q8eyBhY3Rpb246IHN0cmluZzsgZGF0YTogc3RyaW5nIH0+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgcHVibGljIGdldCBtYXR0ZXJ0YWdUb0ZvbGxvdygpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLm1hdHRlcnRhZ1RvRm9sbG93O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBtYXR0ZXJ0YWdUb0ZvbGxvdyh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xyXG4gICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5tYXR0ZXJ0YWdUb0ZvbGxvdyA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBpblRyYW5zaXRpb25Nb2RlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuaW5UcmFuc2l0aW9uTW9kZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgaW5UcmFuc2l0aW9uTW9kZSh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5pblRyYW5zaXRpb25Nb2RlID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGluVHJhbnNpdGlvblN3ZWVwKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuaW5UcmFuc2l0aW9uU3dlZXA7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGluVHJhbnNpdGlvblN3ZWVwKHZhbHVlOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmluVHJhbnNpdGlvblN3ZWVwID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG5vTGlnaHRGb3JPYmplY3RzID0gdHJ1ZTtcclxuXHJcbiAgcHVibGljIGdldCBjdXJyZW50Q2FtZXJhTW9kZSgpOiBDYW1lcmFNb2RlIHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRDYW1lcmFNb2RlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBjdXJyZW50Q2FtZXJhTW9kZSh2YWx1ZTogQ2FtZXJhTW9kZSkge1xyXG4gICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Q2FtZXJhTW9kZSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBvbkNhbWVyYU1vZGVDaGFuZ2VkKCk6IFN1YmplY3Q8Q2FtZXJhTW9kZT4ge1xyXG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2Uub25DYW1lcmFNb2RlQ2hhbmdlZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgb25Sb29tQ2hhbmdlZCgpOiBTdWJqZWN0PGFueVtdPiB7XHJcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5vblJvb21DaGFuZ2VkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBvbkdvVG9UYWcoKTogU3ViamVjdDxzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLm9uR29Ub1RhZztcclxuICB9XHJcblxyXG4gIHRhZ1NlcnZpY2U6IEJhc2VUYWdTZXJ2aWNlO1xyXG5cclxuICBjb25maWc6IENvbmZpZztcclxuXHJcbiAgU1BNb2R1bGU6IFNwTW9kdWxlO1xyXG5cclxuICBwdWJsaWMgZ2V0IG9iamVjdENvbnRyb2woKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5vYmplY3RDb250cm9sO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBzZWN1cml0eUNhbWVyYUFuaW1hdG9yKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2Uuc2VjdXJpdHlDYW1lcmFBbmltYXRvcjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFjdGlvbnMgb24gbGVmdCBjbGljayB3aGVuIHBvc2l0aW9uaW5nIG1hdHRlcnRhZyBpbiB2aXNpdFxyXG4gICAqL1xyXG4gIHBvaW50ZXJMZWZ0Q2xpY2tIYW5kbGVyID0gKGV2dDogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgaWYgKHRoaXMubWF0dGVydGFnVG9Gb2xsb3cpIHtcclxuICAgICAgY29uc3QgbWF0dGVydGFnRGF0YSA9IHRoaXMuZGljdGlvbm5hcnlUYWdzLmdldCh0aGlzLm1hdHRlcnRhZ1RvRm9sbG93KTtcclxuICAgICAgaWYgKG1hdHRlcnRhZ0RhdGEpIHtcclxuICAgICAgICBtYXR0ZXJ0YWdEYXRhLnNldFBvc2l0aW9uKHsgLi4udGhpcy5wb3NlTWF0dGVycG9ydC5wb3NpdGlvbiB9KTtcclxuICAgICAgICBtYXR0ZXJ0YWdEYXRhLnNldE5vcm1hbCh7IC4uLnRoaXMucG9zZU1hdHRlcnBvcnQubm9ybWFsIH0pO1xyXG4gICAgICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLnNldCh0aGlzLm1hdHRlcnRhZ1RvRm9sbG93LCBtYXR0ZXJ0YWdEYXRhKTtcclxuICAgICAgICB0aGlzLnVwZGF0ZU1hdHRlclRhZ0NvbnRlbnRGb3JUYWdJRCh0aGlzLm1hdHRlcnRhZ1RvRm9sbG93KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5vblZhbGlkYXRlZE1hdHRlcnRhZygpO1xyXG4gIH07XHJcblxyXG4gIHBvaW50ZXJSaWdodENsaWNrSGFuZGxlciA9IChlKSA9PiB7XHJcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLmNhbmNlbEZvbGxvd2luZ0N1cnNvcigpO1xyXG4gICAgYWxlcnQoJ2FjdGlvbiBjYW5jZWxsZWQnKTtcclxuICB9O1xyXG5cclxuICBwb2ludGVyTWlkZGxlQ2xpY2tIYW5kbGVyID0gKGUpID0+IHtcclxuICAgIHRoaXMucG9pbnRlclNlcnZpY2UudXBkYXRlQ3Vyc29yRGlzcGxheSh0aGlzLnBvc2VNYXR0ZXJwb3J0KTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgQEluamVjdCgnY29uZmlnJykgY29uZmlnOiBDb25maWcsXHJcbiAgICBASW5qZWN0KE1BVFRFUlBPUlRfU0RLX0tFWSkgcHJpdmF0ZSByZWFkb25seSBzZGtLZXk6IHN0cmluZyxcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIGFjdGl2ZVJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgdmlzaWJpbGl0eVNlcnZpY2U6IEJhc2VWaXNpYmlsaXR5U2VydmljZSxcclxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXHJcbiAgICBwcml2YXRlIG1lYXN1cmVtZW50U2VydmljZTogTWF0dGVycG9ydE1lYXN1cmVtZW50U2VydmljZSxcclxuICAgIHByaXZhdGUgbmF2aWdhdGlvblNlcnZpY2U6IE1hdHRlcnBvcnROYXZpZ2F0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgcG9pbnRlclNlcnZpY2U6IE1hdHRlcnBvcnRQb2ludGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgb2JqZWN0M0RTZXJ2aWNlOiBNYXR0ZXJwb3J0T2JqZWN0M0RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBtYXR0ZXJwb3J0VGFnU2VydmljZTogTWF0dGVycG9ydFRhZ1NlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5pdGlhbGl6ZXMgdGhlIE1hdHRlcnBvcnQgU0RLLCBzZXRzIHVwIGV2ZW50IGxpc3RlbmVycywgYW5kIGNvbmZpZ3VyZXMgYXNzZXRzLlxyXG4gICAqIEBwYXJhbSB0YWdTZXJ2aWNlIFNlcnZpY2UgdXNlZCB0byBnZW5lcmF0ZSBhbmQgaW5qZWN0IEhUTUwgaW50byB0YWdzLlxyXG4gICAqIEBwYXJhbSBtb2R1bGUgQXBwbGljYXRpb24gbW9kdWxlIChlLmcuLCBJTU1PLCBNVVNFVU0pIHRvIGVuYWJsZSBzcGVjaWZpYyBmZWF0dXJlcy5cclxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0cnVlIHdoZW4gaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGUuXHJcbiAgICovXHJcbiAgYXN5bmMgaW5pdFNkayhcclxuICAgIHRhZ1NlcnZpY2U6IEJhc2VUYWdTZXJ2aWNlLFxyXG4gICAgbW9kdWxlOiBTcE1vZHVsZSA9IFNwTW9kdWxlLklNTU9cclxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIGlmICh0aGlzLnNkaykge1xyXG4gICAgICAvLyBjbGVhbiBpZiBzZGsgaXMgcnVubmluZyBhbHJlYWR5XHJcbiAgICAgIGF3YWl0IHRoaXMuYWN0aW9uX2RlbGV0ZV9hbGxfbWF0dGVydGFncygpO1xyXG4gICAgfVxyXG4gICAgdGhpcy50YWdTZXJ2aWNlID0gdGFnU2VydmljZTtcclxuICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2Uuc2V0VGFnU2VydmljZSh0YWdTZXJ2aWNlKTtcclxuICAgIHRoaXMuU1BNb2R1bGUgPSBtb2R1bGU7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAvLyBSZXRyaWV2ZSBET00gZWxlbWVudHNcclxuICAgICAgY29uc3QgcG9pbnRlckJ0biA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICAgJyN2aWV3ZXItcG9pbnRlci10cmljaydcclxuICAgICAgKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgdGhpcy5jb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdmlld2VyLW1vZHVsZScpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxyXG4gICAgICAgICcjdmlld2VyLW1vZHVsZSdcclxuICAgICAgKSBhcyBIVE1MSUZyYW1lRWxlbWVudDtcclxuICAgICAgaWYgKCFpZnJhbWUpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgY3Vyc29yQnRuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcclxuICAgICAgICAnI2J1dHRvbidcclxuICAgICAgKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgY29uc3QgdGV4dFBhbmVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcclxuICAgICAgICAnI3RleHQnXHJcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XHJcblxyXG4gICAgICB0aGlzLnBvaW50ZXJTZXJ2aWNlLmluaXQodGhpcy5jb250YWluZXIsIHBvaW50ZXJCdG4sIGN1cnNvckJ0biwgdGV4dFBhbmVsLCB7XHJcbiAgICAgICAgb25MZWZ0Q2xpY2s6IHRoaXMucG9pbnRlckxlZnRDbGlja0hhbmRsZXIuYmluZCh0aGlzKSxcclxuICAgICAgICBvblJpZ2h0Q2xpY2s6IHRoaXMucG9pbnRlclJpZ2h0Q2xpY2tIYW5kbGVyLmJpbmQodGhpcyksXHJcbiAgICAgICAgb25NaWRkbGVDbGljazogdGhpcy5wb2ludGVyTWlkZGxlQ2xpY2tIYW5kbGVyLmJpbmQodGhpcyksXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gTG9hZCBTREtcclxuICAgICAgY29uc3Qgc2hvd2Nhc2VXaW5kb3cgPSBpZnJhbWUuY29udGVudFdpbmRvdztcclxuICAgICAgaWZyYW1lLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHRoaXMuc2RrID0gYXdhaXQgKHNob3djYXNlV2luZG93IGFzIGFueSkuTVBfU0RLLmNvbm5lY3QoXHJcbiAgICAgICAgICAgIHNob3djYXNlV2luZG93LFxyXG4gICAgICAgICAgICB0aGlzLnNka0tleSxcclxuICAgICAgICAgICAgJydcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5hZGRDdXN0b21Dc3MoKTtcclxuXHJcbiAgICAgICAgdGhpcy5wb2ludGVyU2VydmljZS5zdGFydEFkbWluQ3Vyc29yVHJhY2tlcihcclxuICAgICAgICAgIHRoaXMuc2RrLFxyXG4gICAgICAgICAgdGhpcy5jb250YWluZXIsXHJcbiAgICAgICAgICAoKSA9PiB0aGlzLnBvc2VNYXR0ZXJwb3J0LFxyXG4gICAgICAgICAgKCkgPT4gdGhpcy5wb3NlQ2FtZXJhXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gTG9hZCBNYXR0ZXJ0YWcgaWNvbnMgYW5kIGN1c3RvbSBzdWJzY3JpcHRpb25zXHJcbiAgICAgICAgc3dpdGNoIChtb2R1bGUpIHtcclxuICAgICAgICAgIGNhc2UgU3BNb2R1bGUuSU1NTzpcclxuICAgICAgICAgICAgdGhpcy5zZGsuQXNzZXQucmVnaXN0ZXJUZXh0dXJlKFxyXG4gICAgICAgICAgICAgICdpY29uLXRpY2tldCcsXHJcbiAgICAgICAgICAgICAgdGhpcy5jb25maWcubXlfY29uZmlnLmljb25fdGlja2V0XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMuc2RrLkFzc2V0LnJlZ2lzdGVyVGV4dHVyZShcclxuICAgICAgICAgICAgICAnaWNvbi1lcXVpcG1lbnQnLFxyXG4gICAgICAgICAgICAgIHRoaXMuY29uZmlnLm15X2NvbmZpZy5pY29uX2VxdWlwbWVudFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLnNkay5Bc3NldC5yZWdpc3RlclRleHR1cmUoXHJcbiAgICAgICAgICAgICAgJ2ljb24tbWVhc3VyZScsXHJcbiAgICAgICAgICAgICAgdGhpcy5jb25maWcubXlfY29uZmlnLmljb25fbWVhc3VyZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLnNkay5Bc3NldC5yZWdpc3RlclRleHR1cmUoXHJcbiAgICAgICAgICAgICAgJ2ljb24tZGF0YScsXHJcbiAgICAgICAgICAgICAgdGhpcy5jb25maWcubXlfY29uZmlnLmljb25fZGF0YVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLnNkay5Bc3NldC5yZWdpc3RlclRleHR1cmUoXHJcbiAgICAgICAgICAgICAgJ2ljb24tb2JqZWN0M2QnLFxyXG4gICAgICAgICAgICAgIHRoaXMuY29uZmlnLm15X2NvbmZpZy5pY29uX29iamVjdDNkXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnNkay5NZWFzdXJlbWVudHMuZGF0YS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgIG9uQWRkZWQ6IGZ1bmN0aW9uIChcclxuICAgICAgICAgICAgICAgIGluZGV4OiBhbnksXHJcbiAgICAgICAgICAgICAgICBpdGVtOiB7IHBvaW50czogYW55IH0sXHJcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uOiBhbnlcclxuICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVhc3VyZW1lbnRTZXJ2aWNlLnNldExhc3RNZWFzdXJlKGl0ZW0ucG9pbnRzKTtcclxuICAgICAgICAgICAgICB9LmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgICAgb25Db2xsZWN0aW9uVXBkYXRlZDogZnVuY3Rpb24gKGNvbGxlY3Rpb246IGFueSkge1xyXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ3RoZSBlbnRpcmUgdXAtdG8tZGF0ZSBjb2xsZWN0aW9uJywgY29sbGVjdGlvbik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lYXN1cmVtZW50U2VydmljZS5nZXREaXN0YW5jZUZvckxhc3RNZWFzdXJlbWVudCh0aGlzLnNkaywgdGhpcy5jdXJyZW50U3BhY2VJRCk7XHJcbiAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5zZGsuTWVhc3VyZW1lbnRzLm1vZGUuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICAgIGZ1bmN0aW9uIChtZWFzdXJlbWVudE1vZGVTdGF0ZTogeyBhY3RpdmU6IGFueSB9KSB7XHJcbiAgICAgICAgICAgICAgICAvLyBtZWFzdXJlbWVudCBtb2RlIHN0YXRlIGhhcyBjaGFuZ2VkXHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzTWVhc3VyZU1vZGVPbiA9IG1lYXN1cmVtZW50TW9kZVN0YXRlLmFjdGl2ZTtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdJcyBtZWFzdXJlbWVudCBtb2RlIGN1cnJlbnRseSBhY3RpdmU/ICcsIG1lYXN1cmVtZW50TW9kZVN0YXRlLmFjdGl2ZSk7XHJcbiAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBTcE1vZHVsZS5NVVNFVU06XHJcbiAgICAgICAgICAgIHRoaXMuc2RrLkFzc2V0LnJlZ2lzdGVyVGV4dHVyZShcclxuICAgICAgICAgICAgICAnaWNvbi1kYXRhJyxcclxuICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5teV9jb25maWcuaWNvbl9kYXRhXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgY2FzZSBTcE1vZHVsZS5IT1RFTDpcclxuICAgICAgICAgICAgdGhpcy5zZGsuQXNzZXQucmVnaXN0ZXJUZXh0dXJlKFxyXG4gICAgICAgICAgICAgICdpY29uX3Jvb21fYXZhaWxhYmxlJyxcclxuICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5teV9jb25maWcuaWNvbl9yb29tX2F2YWlsYWJsZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLnNkay5Bc3NldC5yZWdpc3RlclRleHR1cmUoXHJcbiAgICAgICAgICAgICAgJ2ljb25fcm9vbV91bmF2YWlsYWJsZScsXHJcbiAgICAgICAgICAgICAgdGhpcy5jb25maWcubXlfY29uZmlnLmljb25fcm9vbV91bmF2YWlsYWJsZVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLnNkay5Bc3NldC5yZWdpc3RlclRleHR1cmUoXHJcbiAgICAgICAgICAgICAgJ2ljb25fcm9vbV9jaG9zZW4nLFxyXG4gICAgICAgICAgICAgIHRoaXMuY29uZmlnLm15X2NvbmZpZy5pY29uX3Jvb21fY2hvc2VuXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMuc2RrLkFzc2V0LnJlZ2lzdGVyVGV4dHVyZShcclxuICAgICAgICAgICAgICAnaWNvbl9yb29tX3ZpZXdlZCcsXHJcbiAgICAgICAgICAgICAgdGhpcy5jb25maWcubXlfY29uZmlnLmljb25fcm9vbV92aWV3ZWRcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuc2RrLkFzc2V0LnJlZ2lzdGVyVGV4dHVyZShcclxuICAgICAgICAgICdpY29uLXBvc2l0aW9uJyxcclxuICAgICAgICAgIHRoaXMuY29uZmlnLm15X2NvbmZpZy5pY29uX3Bvc2l0aW9uXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLy8gQ3VycmVudCBSb29tICh1c2VkIGZvciBnZXR0aW5nIGJvdW5kaW5nIGJveCBhbmQgZXZlbnR1YWxseSBsYXp5IGxvYWQgbWF0dGVydGFnIG9yIG9iamVjdDNEIGluc2lkZSBjdXJyZW50IFJvb20pXHJcbiAgICAgICAgdGhpcy5zZGsuUm9vbS5jdXJyZW50LnN1YnNjcmliZSgoY3VycmVudFJvb20pID0+IHtcclxuICAgICAgICAgIGNvbnN0IHJvb21zID0gQXJyYXkuaXNBcnJheShjdXJyZW50Um9vbSkgPyBjdXJyZW50Um9vbSA6IChjdXJyZW50Um9vbSA/IFtjdXJyZW50Um9vbV0gOiBbXSk7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRSb29tcyA9IHJvb21zO1xyXG4gICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5vblJvb21DaGFuZ2VkLm5leHQocm9vbXMpO1xyXG4gICAgICAgICAgLy8gUmVmcmVzaCB0YWcgdmlzaWJpbGl0eSB3aGVuZXZlciB0aGUgcm9vbSBjb250ZXh0IGNoYW5nZXNcclxuICAgICAgICAgIHRoaXMucmVmcmVzaFRhZ3NWaXNpYmlsaXR5KCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIDNEIHBvc2l0aW9uJ3MgcG9pbnRlclxyXG4gICAgICAgIHRoaXMuc2RrLlBvaW50ZXIuaW50ZXJzZWN0aW9uLnN1YnNjcmliZShcclxuICAgICAgICAgIGZ1bmN0aW9uIChpbnRlcnNlY3Rpb246IGFueSkge1xyXG4gICAgICAgICAgICB0aGlzLnBvc2VNYXR0ZXJwb3J0ID0gaW50ZXJzZWN0aW9uO1xyXG4gICAgICAgICAgICB0aGlzLnBvc2VNYXR0ZXJwb3J0LnRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLm9sZFBvc2VNYXR0ZXJwb3J0UG9zaXRpb24pIHtcclxuICAgICAgICAgICAgICB0aGlzLm9sZFBvc2VNYXR0ZXJwb3J0UG9zaXRpb24gPSB7XHJcbiAgICAgICAgICAgICAgICB4OiAwLFxyXG4gICAgICAgICAgICAgICAgeTogMCxcclxuICAgICAgICAgICAgICAgIHo6IDAsXHJcbiAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJhY3Rpb25Nb2RlICE9PSBWaWV3ZXJJbnRlcmFjdGlvbnMuREVGQVVMVCAmJiB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93KSB7XHJcbiAgICAgICAgICAgICAgLy8gZm9sbG93IHRoZSBwb2ludGVyIGFuZCBjaGFuZ2VzIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGFzdCB0YWdcclxuICAgICAgICAgICAgICAvLyAod2UgYXJlIGFib3V0IHRvIHZhbGlkYXRlLCBidXQgaXQgZXhpc3RzIGluIHNkayBhbHJlYWR5KVxyXG4gICAgICAgICAgICAgIHRoaXMuZW5hYmxlX2ZvbGxvd2luZ190YWcodGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBvaW50ZXJTZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5wb2ludGVyU2VydmljZS5zZXRDdXJzb3JQb3NpdGlvbkJ1dHRvbkRpc3BsYXllZChmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vQ2FtZXJhIG1vZGVcclxuICAgICAgICB0aGlzLnNkay5Nb2RlLmN1cnJlbnQuc3Vic2NyaWJlKChtb2RlKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5jYW1lcmFNb2RlICE9PSBtb2RlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2Uuc2V0Q2FtZXJhTW9kZShtb2RlKTtcclxuICAgICAgICAgICAgLy8gUmVmcmVzaCB0YWcgdmlzaWJpbGl0eSBvbiBldmVyeSBtb2RlIGNoYW5nZSAoSU5TSURFIHZzIERPTExIT1VTRSB2cyBGTE9PUlBMQU4pXHJcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaFRhZ3NWaXNpYmlsaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FtZXJhTW9kZSA9IG1vZGU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2RrICYmIHRoaXMucG9zZUNhbWVyYSkge1xyXG4gICAgICAgICAgICB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLnVwZGF0ZVRhZ3NWaXNpYmlsaXR5Rm9yQ29udGV4dChcclxuICAgICAgICAgICAgICB0aGlzLnNkayxcclxuICAgICAgICAgICAgICB0aGlzLnN3ZWVwQ29sbGVjdGlvbixcclxuICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRDYW1lcmFNb2RlLFxyXG4gICAgICAgICAgICAgIHRoaXMubWF0dGVydGFnVG9Gb2xsb3csXHJcbiAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Rmxvb3JTZXF1ZW5jZSxcclxuICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRSb29tc1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIDEwMDApO1xyXG5cclxuICAgICAgICAvLyBzdWJzY3JpYmUgdG8gc3dlZXBzXHJcbiAgICAgICAgdGhpcy5zZGsuU3dlZXAuZGF0YS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgb25Db2xsZWN0aW9uVXBkYXRlZDogZnVuY3Rpb24gc3Vic2NyKGNvbGxlY3Rpb246IHt9KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3dlZXBzID0gT2JqZWN0LmtleXMoY29sbGVjdGlvbik7XHJcbiAgICAgICAgICAgIHRoaXMuc3dlZXBDb2xsZWN0aW9uID0gY29sbGVjdGlvbjtcclxuICAgICAgICAgICAgLy8gUmVidWlsZCBzaWQg4oaUIHV1aWQgbWFwcyB3aGVuZXZlciB0aGUgY29sbGVjdGlvbiB1cGRhdGVzXHJcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuYnVpbGRTd2VlcElkTWFwcyhjb2xsZWN0aW9uKTtcclxuICAgICAgICAgIH0uYmluZCh0aGlzKSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gc3Vic2NyaWJlIHRvIGN1cnJlbnQgc3dlZXAg4oCTIGVtaXQgdXVpZCAoREIgZm9ybWF0KSBpbnN0ZWFkIG9mIHJhdyBzaWRcclxuICAgICAgICB0aGlzLnNkay5Td2VlcC5jdXJyZW50LnN1YnNjcmliZShcclxuICAgICAgICAgIGZ1bmN0aW9uIHN1YnNjcihjdXJyZW50U3dlZXA6IHsgc2lkOiBzdHJpbmcgfSkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudFN3ZWVwLnNpZCA9PT0gJycpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3QgdXVpZCA9IHRoaXMubmF2aWdhdGlvblNlcnZpY2UucmVzb2x2ZVN3ZWVwVXVpZChjdXJyZW50U3dlZXAuc2lkKTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3dlZXAubmV4dCh1dWlkKTtcclxuICAgICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIFN1YnNjcmliZSB0byBGbG9vciBkYXRhXHJcbiAgICAgICAgdGhpcy5zZGsuRmxvb3IuZGF0YS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgb25Db2xsZWN0aW9uVXBkYXRlZDogZnVuY3Rpb24gdXBkKHRoaXM6IGFueSwgY29sbGVjdGlvbjogYW55KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmxvb3JzID0gT2JqZWN0LnZhbHVlcyhjb2xsZWN0aW9uKTtcclxuICAgICAgICAgIH0uYmluZCh0aGlzKSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gU3Vic2NyaWJlIHRvIGN1cnJlbnQgZmxvb3Ig4oCTIGF1dGhvcml0YXRpdmUgc291cmNlIGZvciBtdWx0aS1mbG9vciBmaWx0ZXJpbmdcclxuICAgICAgICB0aGlzLnNkay5GbG9vci5jdXJyZW50LnN1YnNjcmliZSgoY3VycmVudEZsb29yOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHNlcSA9IGN1cnJlbnRGbG9vcj8uc2VxdWVuY2UgPz8gbnVsbDtcclxuICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudEZsb29yU2VxdWVuY2UgPSBzZXE7XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ1tGbG9vci5jdXJyZW50XSBzZXF1ZW5jZSA9Jywgc2VxLCAnfCBmdWxsID0nLCBjdXJyZW50Rmxvb3IpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5yZWZyZXNoVGFnc1Zpc2liaWxpdHkoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gR2VuZXJpYyBoYW5kbGVyIGZvciB0YWcgc2VsZWN0aW9uIGV2ZW50c1xyXG4gICAgICAgIGNvbnN0IGhhbmRsZVRhZ1NlbGVjdGlvbiA9IGFzeW5jIChzaWQ6IHN0cmluZywgc291cmNlOiBzdHJpbmcsIGV2dD86IGFueSkgPT4ge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgbWF0dGVydGFnRGF0YSA9IHRoaXMuZGljdGlvbm5hcnlUYWdzLmdldChzaWQpO1xyXG4gICAgICAgICAgICBpZiAoIW1hdHRlcnRhZ0RhdGEpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3QgdXJsID0gdGFnU2VydmljZS5nZXRVcmxGb3JTZWVEZXRhaWxzKFxyXG4gICAgICAgICAgICAgIG1hdHRlcnRhZ0RhdGEuZ2V0T2JqZWN0KCksXHJcbiAgICAgICAgICAgICAgbWF0dGVydGFnRGF0YS5nZXRUeXBlKClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgaWYgKHVybCAhPT0gJycpIHtcclxuICAgICAgICAgICAgICB0aGlzLnZpc2liaWxpdHlTZXJ2aWNlLmRldGFpbFNob3dpbmcubmV4dCh0cnVlKTtcclxuICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3VybF0pO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignQ2Fubm90IHNob3cgZGV0YWlscyBmb3IgdGFnJywgZXJyb3IpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8vIERpc2FibGUgbmF0aXZlIE1hdHRlcnBvcnQgYWN0aW9uc1xyXG4gICAgICAgIGNvbnN0IGRpc2FibGVOYXRpdmVBY3Rpb25zID0gKHNpZDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuc2RrIHx8IHNpZCA9PT0gdGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdykgcmV0dXJuOyAvLyBpZ25vcmUgd2hlbiB3ZSBhcmUgaW4gcG9zaXRpb25pbmcgbW9kZVxyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2RrLlRhZz8uYWxsb3dBY3Rpb24pIHtcclxuICAgICAgICAgICAgICB0aGlzLnNkay5UYWcuYWxsb3dBY3Rpb24oc2lkLCB7IG9wZW5pbmc6IHRydWUsIG5hdmlnYXRpbmc6IHRydWUsIGRvY2tpbmc6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgICAgICAgLy8gc2lsZW50bHkgaWdub3JlIGFscmVhZHkgcmVtb3ZlZCB0YWdzXHJcbiAgICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSAmJiAhZT8ubWVzc2FnZT8uaW5jbHVkZXMoJ25vdCBmb3VuZCcpKSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdNYXR0ZXJwb3J0U2VydmljZTogRXJyb3IgZGlzYWJsaW5nIGFjdGlvbnMgZm9yJywgc2lkLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8vIFdhaXQgZm9yIHRoZSBhcHBsaWNhdGlvbiB0byByZWFjaCBQTEFZSU5HIHBoYXNlXHJcbiAgICAgICAgaWYgKHRoaXMuc2RrLkFwcCAmJiB0aGlzLnNkay5BcHAuc3RhdGUpIHtcclxuICAgICAgICAgIHRoaXMuc2RrLkFwcC5zdGF0ZS53YWl0VW50aWwoKHM6IGFueSkgPT4gcy5waGFzZSA9PT0gdGhpcy5zZGsuQXBwLlBoYXNlLlBMQVlJTkcpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNkay5DYW1lcmEucG9zZS5zdWJzY3JpYmUoKHBvc2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMucG9zZUNhbWVyYSA9IHBvc2U7XHJcbiAgICAgICAgICAgICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS51cGRhdGVUYWdzVmlzaWJpbGl0eUZvckNvbnRleHQoXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNkayxcclxuICAgICAgICAgICAgICAgIHRoaXMuc3dlZXBDb2xsZWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Q2FtZXJhTW9kZSxcclxuICAgICAgICAgICAgICAgIHRoaXMubWF0dGVydGFnVG9Gb2xsb3csXHJcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRGbG9vclNlcXVlbmNlLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Um9vbXNcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UudXBkYXRlVGFnc1Zpc2liaWxpdHlGb3JDb250ZXh0KFxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZGssXHJcbiAgICAgICAgICAgICAgICB0aGlzLnN3ZWVwQ29sbGVjdGlvbixcclxuICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudENhbWVyYU1vZGUsXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93LFxyXG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Rmxvb3JTZXF1ZW5jZSxcclxuICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudFJvb21zXHJcbiAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSwgMTUwMCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5pbnRlcmFjdGlvbk1vZGUgPT09IFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5hY3Rpb25fdG9vbGJveF9pbnNpZGVfdmlldyh0aGlzLnNkayk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNkay5UYWcgJiYgdGhpcy5zZGsuVGFnLmRhdGEpIHtcclxuICAgICAgICAgICAgICB0aGlzLnNkay5UYWcuZGF0YS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgICAgb25BZGRlZDogKHNpZDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGRpc2FibGVOYXRpdmVBY3Rpb25zKHNpZCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgb25VcGRhdGVkOiAoc2lkOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgICAgZGlzYWJsZU5hdGl2ZUFjdGlvbnMoc2lkKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBvbkNvbGxlY3Rpb25VcGRhdGVkOiAoY29sbGVjdGlvbjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGNvbGxlY3Rpb24pLmZvckVhY2goKHNpZCkgPT4gZGlzYWJsZU5hdGl2ZUFjdGlvbnMoc2lkKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gRmFsbGJhY2sgcG91ciBsJ8OpdsOpbmVtZW50IGdsb2JhbCB0YWcuY2xpY2tcclxuICAgICAgICB0aGlzLnNkay5vbigndGFnLmNsaWNrJywgKHNpZDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYFtNYXR0ZXJwb3J0U2VydmljZV0gc2RrLm9uKCd0YWcuY2xpY2snKSByZWNlaXZlZCBmb3Igc2lkOiAke3NpZH1gKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGhhbmRsZVRhZ1NlbGVjdGlvbihzaWQsICdnbG9iYWwudGFnLmNsaWNrJyk7XHJcbiAgICAgICAgICBkaXNhYmxlTmF0aXZlQWN0aW9ucyhzaWQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIC8vIFBvaW50ZXIgdHJpY2tcclxuICAgICAgICAvLyBDcmVhdGUgYSBkaXYgdGhhdCB3aWxsIGFwcGVhciB3aGVuIHRoZSBjdXJzb3IgaXMgc3RpbGxcclxuICAgICAgICAvLyBJdCB3aWxsIGludGVyY2VwdCB0aGUgY2xpY2sgb2YgdGhlIG1vdXNlIGJlZm9yZSBpdCB0cmlnZXJyaW5nIHRoZSBNYXR0ZXJwb3J0J3MgdG91ciBuYXZpZ2F0aW9uXHJcbiAgICAgICAgdGhpcy5wb2ludGVyU2VydmljZS5zdGFydFBvaW50ZXJUcmljayhcclxuICAgICAgICAgIHRoaXMuc2RrLFxyXG4gICAgICAgICAgdGhpcy5jb250YWluZXIsXHJcbiAgICAgICAgICAoKSA9PiB0aGlzLnBvc2VNYXR0ZXJwb3J0LFxyXG4gICAgICAgICAgKCkgPT4gdGhpcy5wb3NlQ2FtZXJhLFxyXG4gICAgICAgICAgKCkgPT4gdGhpcy5pbnRlcmFjdGlvbk1vZGUsXHJcbiAgICAgICAgICAoKSA9PiB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgLyoqXHJcbiAgICAgICAgKiBUcmFuc2l0aW9uc1xyXG4gICAgICAgICovXHJcbiAgICAgICAgdGhpcy5zZGsub24oXHJcbiAgICAgICAgICAndmlld21vZGUuY2hhbmdlc3RhcnQnLFxyXG4gICAgICAgICAgZnVuY3Rpb24gKHRvLCBmcm9tKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ1N0YXJ0aW5nIHRvIG1vdmUgdG8gJyArIHRvICsgJyBmcm9tICcgKyBmcm9tKTtcclxuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5pblRyYW5zaXRpb25Nb2RlID0gdHJ1ZTtcclxuICAgICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5zZGsub24oXHJcbiAgICAgICAgICAndmlld21vZGUuY2hhbmdlZW5kJyxcclxuICAgICAgICAgIGZ1bmN0aW9uIChvbGRNb2RlLCBuZXdNb2RlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ0VuZGVkIHRvIG1vdmUgdG8gJyArIG5ld01vZGUgKyAnIGZyb20gJyArIG9sZE1vZGUpO1xyXG4gICAgICAgICAgICBpZiAobmV3TW9kZSAhPT0gJ21vZGUudHJhbnNpdGlvbmluZycpIHtcclxuICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmluVHJhbnNpdGlvbk1vZGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnNkay5vbihcclxuICAgICAgICAgIHRoaXMuc2RrLlN3ZWVwLkV2ZW50LkVOVEVSLFxyXG4gICAgICAgICAgZnVuY3Rpb24gKG9sZFN3ZWVwLCBuZXdTd2VlcCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdMZWF2aW5nIHN3ZWVwICcgKyBvbGRTd2VlcCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ0VudGVyaW5nIHN3ZWVwICcgKyBuZXdTd2VlcCk7XHJcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuaW5UcmFuc2l0aW9uU3dlZXAgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5kaXNwbGF5QXppbXV0YWxDcm93bigpO1xyXG4gICAgICAgICAgICAvLyBSZWZyZXNoIG9uIHN3ZWVwIGlzIHJlbW92ZWQgYmVjYXVzZSB3ZSBvbmx5IHVwZGF0ZSBvbiByb29tIG9yIGZsb29yIGNoYW5nZXMgbm93LlxyXG4gICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnNkay5vbihcclxuICAgICAgICAgIHRoaXMuc2RrLlN3ZWVwLkV2ZW50LkVYSVQsXHJcbiAgICAgICAgICBmdW5jdGlvbiAoZnJvbVN3ZWVwLCB0b1N3ZWVwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ0xlYXZpbmcgc3dlZXAgJyArIGZyb21Td2VlcCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ1RyYW5zaXRpb25pbmcgdG8gc3dlZXAgJyArIHRvU3dlZXApO1xyXG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmluVHJhbnNpdGlvblN3ZWVwID0gdHJ1ZTtcclxuICAgICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0M0RPYmplY3RWaWV3ZXIoKTtcclxuXHJcbiAgICAgICAgcmVzb2x2ZSh0cnVlKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEBkZXByZWNhdGVkIFVzZSBuYXZpZ2F0aW9uU2VydmljZS5yZXNvbHZlU3dlZXBVdWlkKCkgaW5zdGVhZC5cclxuICAgKiBLZXB0IHRlbXBvcmFyaWx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cclxuICAgKi9cclxuICBnZXRTd2VlcFVVSURGb3JTaWQoc2lkOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnJlc29sdmVTd2VlcFV1aWQoc2lkKSAhPT0gc2lkXHJcbiAgICAgID8gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5yZXNvbHZlU3dlZXBVdWlkKHNpZClcclxuICAgICAgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgc2V0TGlnaHRpbmdPZmYoKSB7XHJcbiAgICB0aGlzLm5vTGlnaHRGb3JPYmplY3RzID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGdldERpc3RhbmNlRm9yTGFzdE1lYXN1cmVtZW50KCkge1xyXG4gICAgdGhpcy5tZWFzdXJlbWVudFNlcnZpY2UuZ2V0RGlzdGFuY2VGb3JMYXN0TWVhc3VyZW1lbnQodGhpcy5zZGssIHRoaXMuY3VycmVudFNwYWNlSUQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0TGFzdERpc3RhbmNlcygpIHtcclxuICAgIHJldHVybiB0aGlzLm1lYXN1cmVtZW50U2VydmljZS5nZXRMYXN0RGlzdGFuY2VzKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUYWtlcyBzY3JlZW5zaG90IGFuZCBzYXZlcyBiYXNlNjQgaW4gbGFzdFNjcmVlbnNob3RVcmlcclxuICAgKiBAcmV0dXJucyBQcm9taXNlXHJcbiAgICovXHJcbiAgdGFrZVNjcmVlblNob3QoKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLm1lYXN1cmVtZW50U2VydmljZS50YWtlU2NyZWVuU2hvdCh0aGlzLnNkayk7XHJcbiAgfVxyXG5cclxuICBnZXRTY3JlZW5TaG90VXJpKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubWVhc3VyZW1lbnRTZXJ2aWNlLmdldFNjcmVlblNob3RVcmkoKTtcclxuICB9XHJcblxyXG4gIGdldExhc3RNZWFzdXJlbWVudCgpOiBPYmplY3Qge1xyXG4gICAgcmV0dXJuIHRoaXMubWVhc3VyZW1lbnRTZXJ2aWNlLmdldExhc3RNZWFzdXJlbWVudCh0aGlzLnBvc2VDYW1lcmEpO1xyXG4gIH1cclxuXHJcbiAgLy9cclxuICAvLyAtLS0tLS0tLS0tIFV0aWxzIC0tLS0tLS0tLS1cclxuICAvL1xyXG4gIHByaXZhdGUgZ2V0Rmxvb3JJZEZvclRhZyhtYXR0ZXJ0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5nZXRGbG9vcklkRm9yVGFnKG1hdHRlcnRhZ0RhdGEsIHRoaXMuc3dlZXBDb2xsZWN0aW9uKTtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogU3R5bGluZyBvZiBwb2ludGVyXHJcbiAgICovXHJcbiAgdXBkYXRlUG9pbnRlclRyaWNrKCkge1xyXG4gICAgdGhpcy5wb2ludGVyU2VydmljZS51cGRhdGVQb2ludGVyVHJpY2sodGhpcy5zZGssIHRoaXMuY29udGFpbmVyLCB0aGlzLnBvc2VNYXR0ZXJwb3J0LCB0aGlzLnBvc2VDYW1lcmEsIHRoaXMuaW50ZXJhY3Rpb25Nb2RlLCB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyaWdnZXJzIGEgdGFnIHZpc2liaWxpdHkgcmVmcmVzaCBiYXNlZCBvbiBjdXJyZW50IGNhbWVyYSBtb2RlLCBmbG9vciBhbmQgc3dlZXAuXHJcbiAgICogRGVsZWdhdGVzIGFsbCBsb2dpYyB0byBNYXR0ZXJwb3J0VGFnU2VydmljZS51cGRhdGVUYWdzVmlzaWJpbGl0eUZvckNvbnRleHQoKS5cclxuICAgKiBDYWxsZWQgYXV0b21hdGljYWxseSBvbiBNb2RlLCBTd2VlcCwgRmxvb3IgYW5kIFJvb20gY2hhbmdlcy5cclxuICAgKi9cclxuICBwdWJsaWMgcmVmcmVzaFRhZ3NWaXNpYmlsaXR5KCk6IHZvaWQge1xyXG4gICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XHJcbiAgICAgIGlmIChpc0Rldk1vZGUoKSAmJiB0aGlzLnN3ZWVwQ29sbGVjdGlvbiAmJiB0aGlzLnBvc2VDYW1lcmE/LnN3ZWVwKSB7XHJcbiAgICAgICAgY29uc3Qgc3dlZXBEYXRhID0gdGhpcy5zd2VlcENvbGxlY3Rpb25bdGhpcy5wb3NlQ2FtZXJhLnN3ZWVwXTtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKCdbcmVmcmVzaFRhZ3NWaXNpYmlsaXR5XSBzd2VlcERhdGEgZm9yIGN1cnJlbnQgc3dlZXA6JywgSlNPTi5zdHJpbmdpZnkoc3dlZXBEYXRhKSk7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnW3JlZnJlc2hUYWdzVmlzaWJpbGl0eV0gY3VycmVudEZsb29yU2VxdWVuY2U6JywgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Rmxvb3JTZXF1ZW5jZSk7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnW3JlZnJlc2hUYWdzVmlzaWJpbGl0eV0gY3VycmVudENhbWVyYU1vZGU6JywgdGhpcy5jdXJyZW50Q2FtZXJhTW9kZSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS51cGRhdGVUYWdzVmlzaWJpbGl0eUZvckNvbnRleHQoXHJcbiAgICAgICAgdGhpcy5zZGssXHJcbiAgICAgICAgdGhpcy5zd2VlcENvbGxlY3Rpb24sXHJcbiAgICAgICAgdGhpcy5jdXJyZW50Q2FtZXJhTW9kZSxcclxuICAgICAgICB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93LFxyXG4gICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudEZsb29yU2VxdWVuY2UsXHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Um9vbXNcclxuICAgICAgKS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFNlcnZpY2VdIHJlZnJlc2hUYWdzVmlzaWJpbGl0eSBlcnJvcicsIGVycik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWFsdGltZSBtYXR0ZXJ0YWcgZm9sbG93aW5nIHRoZSBjdXJzb3JcclxuICAgKiBAcGFyYW0gbWF0dGVydGFnIHN0cmluZ1xyXG4gICAqL1xyXG4gIGVuYWJsZV9mb2xsb3dpbmdfdGFnKG1hdHRlcnRhZzogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBPRkZTRVQgPSAwLjAwMDE7IC8vIHF1YXNpLWludmlzaWJsZSBtYWlzIHN1ZmZpdCDDoCDDqXZpdGVyIGwnaW50ZXJjZXB0aW9uXHJcbiAgICB0aGlzLnNkay5UYWcuZWRpdFBvc2l0aW9uKG1hdHRlcnRhZywge1xyXG4gICAgICBhbmNob3JQb3NpdGlvbjoge1xyXG4gICAgICAgIHg6IHRoaXMucG9zZU1hdHRlcnBvcnQucG9zaXRpb24ueCArIE9GRlNFVCxcclxuICAgICAgICB5OiB0aGlzLnBvc2VNYXR0ZXJwb3J0LnBvc2l0aW9uLnksXHJcbiAgICAgICAgejogdGhpcy5wb3NlTWF0dGVycG9ydC5wb3NpdGlvbi56ICsgT0ZGU0VULFxyXG4gICAgICB9LFxyXG4gICAgICBzdGVtVmVjdG9yOiB7XHJcbiAgICAgICAgeDogdGhpcy5wb3NlTWF0dGVycG9ydC5ub3JtYWwueCAqIDAuMyxcclxuICAgICAgICB5OiB0aGlzLnBvc2VNYXR0ZXJwb3J0Lm5vcm1hbC55ICogMC4zLFxyXG4gICAgICAgIHo6IHRoaXMucG9zZU1hdHRlcnBvcnQubm9ybWFsLnogKiAwLjMsXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0IHRoZSBkaXN0YW5jZSBiZXR3d2VlbiB0d28gM0QgcG9zaXRpb25zXHJcbiAgICogVXNlZCBpbiBvcmRlciB0byBzZWUgaG93IG11Y2ggdGhlIGN1cnNvciBoYXMgbW92ZWQgZnJvbSB0aGUgcHJldmlvdXMgcG9zaXRpb25cclxuICAgKiBAcGFyYW0gcG9zMVxyXG4gICAqIEBwYXJhbSBwb3MyXHJcbiAgICovXHJcbiAgZ2V0RGlzdFBvc2l0aW9uKHBvczE6IGFueSwgcG9zMjogYW55KSB7XHJcbiAgICByZXR1cm4gdGhpcy5wb2ludGVyU2VydmljZS5nZXREaXN0UG9zaXRpb24odGhpcy5zZGssIHRoaXMuY29udGFpbmVyLCB0aGlzLnBvc2VDYW1lcmEsIHBvczEsIHBvczIpO1xyXG4gIH1cclxuXHJcbiAgLy9cclxuICAvLyAtLS0tLS0tLS0tIE1hdHRlcnRhZyByZWxhdGVkIC0tLS0tLS0tLS1cclxuICAvL1xyXG4gIC8qKiBDcmVhdGVzIGEgdGVtcG9yYXJ5IE1hdHRlcnRhZyB0aGF0IGZvbGxvd3MgdGhlIHVzZXIncyBjdXJzb3IgZm9yIHBvc2l0aW9uaW5nLiAqL1xyXG4gIGFzeW5jIGFkZEN1cnNvck1hdHRlcnRhZyhtYXR0ZXJ0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhKSB7XHJcbiAgICBpZiAoIXRoaXMucG9zZU1hdHRlcnBvcnQpIHJldHVybjtcclxuICAgIHRoaXMubWF0dGVydGFnVG9Gb2xsb3cgPSBhd2FpdCB0aGlzLmFkZE1hdHRlcnRhZ1RvVmlld2VyKG1hdHRlcnRhZ0RhdGEpO1xyXG4gICAgYXdhaXQgd2FpdCg1MCk7XHJcbiAgICB0aGlzLnNkay5UYWcuZWRpdEljb24odGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdywgJ2ljb24tcG9zaXRpb24nKTtcclxuICAgIHRoaXMuc2RrLlRhZy5lZGl0T3BhY2l0eSh0aGlzLm1hdHRlcnRhZ1RvRm9sbG93LCAxKTtcclxuXHJcbiAgICB0aGlzLnNkay5UYWcuZWRpdFBvc2l0aW9uKHRoaXMubWF0dGVydGFnVG9Gb2xsb3csIHtcclxuICAgICAgYW5jaG9yUG9zaXRpb246IHsgLi4udGhpcy5wb3NlTWF0dGVycG9ydC5wb3NpdGlvbiB9LFxyXG4gICAgICBzdGVtVmVjdG9yOiB7XHJcbiAgICAgICAgeDogdGhpcy5wb3NlTWF0dGVycG9ydC5ub3JtYWwueCAqIDAuMyxcclxuICAgICAgICB5OiB0aGlzLnBvc2VNYXR0ZXJwb3J0Lm5vcm1hbC55ICogMC4zLFxyXG4gICAgICAgIHo6IHRoaXMucG9zZU1hdHRlcnBvcnQubm9ybWFsLnogKiAwLjMsXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuc2RrLlRhZy5hbGxvd0FjdGlvbih0aGlzLm1hdHRlcnRhZ1RvRm9sbG93LCB7XHJcbiAgICAgICAgb3BlbmluZzogdHJ1ZSxcclxuICAgICAgICBuYXZpZ2F0aW5nOiBmYWxzZSxcclxuICAgICAgICBkb2NraW5nOiBmYWxzZVxyXG4gICAgICB9KTtcclxuICAgIH0gY2F0Y2ggKGUpIHsgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCB0YWdBZGRRdWV1ZSgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UudGFnQWRkUXVldWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHRhZ0FkZFF1ZXVlKHZhbHVlOiBQcm9taXNlPGFueT4pIHtcclxuICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UudGFnQWRkUXVldWUgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGFkZE1hdHRlcnRhZ1RvVmlld2VyKG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcclxuICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmFkZE1hdHRlcnRhZ1RvVmlld2VyKHRoaXMuc2RrLCBtYXR0ZXJ0YWdEYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKiBUcmlnZ2VycyBjYWxsYmFjayBhY3Rpb25zIGFmdGVyIGEgdGFnJ3MgcG9zaXRpb24gaXMgdmFsaWRhdGVkIGJ5IGEgbGVmdCBjbGljay4gKi9cclxuICBvblZhbGlkYXRlZE1hdHRlcnRhZygpIHtcclxuICAgIHRoaXMuc2V0SW50ZXJhY3Rpb25Nb2RlKFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUKTtcclxuICAgIGNvbnN0IGxhc3RUYWcgPSB0aGlzLmdldExhc3RUYWcoKTtcclxuICAgIGlmIChsYXN0VGFnKSB7XHJcbiAgICAgIGNvbnN0IGNhbGxiYWNrTW9kZSA9IHRoaXMuZGljdGlvbm5hcnlUYWdzXHJcbiAgICAgICAgLmdldChsYXN0VGFnKVxyXG4gICAgICAgIC5nZXRDYWxsYmFja0FjdGlvbk1vZGUoKTtcclxuICAgICAgdGhpcy5jYWxsYmFja0FmdGVyTWF0dGVydGFnVmFsaWRhdGlvbihjYWxsYmFja01vZGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFJlZ2lzdGVycyBhIG5ldyBpY29uIHRleHR1cmUgYW5kIGFwcGxpZXMgaXQgdG8gYSBzcGVjaWZpYyBNYXR0ZXJ0YWcuICovXHJcbiAgYXN5bmMgYWRkTmV3SWNvbkFuZFNldEZvclRhZyhtYXR0ZXJ0YWdJRDogc3RyaW5nLCBpY29uUGF0aDogc3RyaW5nKSB7XHJcbiAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmFkZE5ld0ljb25BbmRTZXRGb3JUYWcoXHJcbiAgICAgIHRoaXMuc2RrLFxyXG4gICAgICBtYXR0ZXJ0YWdJRCxcclxuICAgICAgaWNvblBhdGgsXHJcbiAgICAgIGZhbHNlLFxyXG4gICAgICAxXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqIEFwcGxpZXMgYSBwcmUtcmVnaXN0ZXJlZCBpY29uIHRvIGEgTWF0dGVydGFnLiAqL1xyXG4gIGFzeW5jIHNldFJlZ2lzdHJlZEljb25Gb3JUYWcobWF0dGVydGFnSUQ6IHN0cmluZywgaWNvbk5hbWU6IHN0cmluZykge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5zZGsuVGFnLmVkaXRJY29uKG1hdHRlcnRhZ0lELCBpY29uTmFtZSk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdDb3VsZCBub3QgZWRpdCBpY29uJywgaWNvbk5hbWUsIGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFNldHMgdGhlIGFwcHJvcHJpYXRlIGljb24gYW5kIG9wYWNpdHkgZm9yIGEgdGFnIGJhc2VkIG9uIGl0cyB0eXBlIGFuZCBQT0kgbWV0YWRhdGEuICovXHJcbiAgYXN5bmMgc2V0VGFnSWNvbkFuZE9wYWNpdHkoXHJcbiAgICBtYXR0ZXJ0YWdJRDogc3RyaW5nLFxyXG4gICAgbWF0dGVydGFnRGF0YTogTWF0dGVydGFnRGF0YVxyXG4gICkge1xyXG4gICAgaWYgKHRoaXMuU1BNb2R1bGUgPT09IFNwTW9kdWxlLkhPVEVMKSB7XHJcbiAgICAgIGNvbnN0IHJvb20gPSBtYXR0ZXJ0YWdEYXRhLmdldE9iamVjdCgpO1xyXG4gICAgICBsZXQgaWNvbk5hbWUgPSBgaWNvbl9yb29tYDtcclxuICAgICAgaWYgKHJvb20uYXZhaWxhYmxlKSB7XHJcbiAgICAgICAgaWNvbk5hbWUgPSBgJHtpY29uTmFtZX1fYXZhaWxhYmxlYDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpY29uTmFtZSA9IGAke2ljb25OYW1lfV91bmF2YWlsYWJsZWA7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZGsuVGFnLmVkaXRJY29uKG1hdHRlcnRhZ0lELCBpY29uTmFtZSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHN0cmluZ1RhZ1R5cGUgPSBwb2lUeXBlVG9TdHJpbmcobWF0dGVydGFnRGF0YS5nZXRUeXBlKCkpO1xyXG4gICAgbGV0IG9wYWNpdHkgPSB0aGlzLmNvbmZpZy5teV9jb25maWcuREVGQVVMVF9PUEFDSVRZX1RBRztcclxuICAgIGxldCBpY29uTmFtZSA9IGBpY29uLSR7c3RyaW5nVGFnVHlwZX1gO1xyXG4gICAgY29uc3QgcG9pID0gbWF0dGVydGFnRGF0YS5nZXRQb2koKTtcclxuICAgIGlmIChwb2kgJiYgcG9pLnRhZ0ljb24pIHtcclxuICAgICAgY29uc3QgdGFnSWNvbiA9IEpTT04ucGFyc2UocG9pLnRhZ0ljb24pO1xyXG4gICAgICBpZiAobWF0dGVydGFnRGF0YS5nZXRUeXBlKCkgPT09IFBvaVR5cGUuREFUQSkge1xyXG4gICAgICAgIGNvbnN0IGZlYXR1cmUgPSBtYXR0ZXJ0YWdEYXRhLmdldE9iamVjdCgpO1xyXG4gICAgICAgIGlmIChmZWF0dXJlLnR5cGUgPT09IEZlYXR1cmVUeXBlLklORElDQVRPUl9URU1QKSB7XHJcbiAgICAgICAgICB0YWdJY29uLnNyYyA9IHRoaXMudGFnU2VydmljZS5nZXRJY29uVGFnSW1hZ2VGb3JGZWF0dXJlKGZlYXR1cmUsIHBvaSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICh0YWdJY29uLnNyYykge1xyXG4gICAgICAgIGNvbnN0IHBhdGhTaWduZWQgPSBhd2FpdCB0aGlzLnRhZ1NlcnZpY2UuZ2V0U2lnbmVkVGFnSWNvblNvdXJjZShcclxuICAgICAgICAgIHRhZ0ljb24uc3JjXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAocGF0aFNpZ25lZCkge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWNvbk5hbWUgPSBgaWNvbi0ke3N0cmluZ1RhZ1R5cGV9LSR7bWF0dGVydGFnSUR9LSR7bWF0dGVydGFnRGF0YS5jdXN0b21JY29uSW5kZXh9YDtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zZGsuQXNzZXQucmVnaXN0ZXJUZXh0dXJlKGljb25OYW1lLCBwYXRoU2lnbmVkKTtcclxuICAgICAgICAgICAgbWF0dGVydGFnRGF0YS5jdXN0b21JY29uSW5kZXggKz0gMTtcclxuICAgICAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3IgcmVnaXN0ZXJJY29uJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICh0YWdJY29uLm9wYWNpdHkpIHtcclxuICAgICAgICBvcGFjaXR5ID0gdGFnSWNvbi5vcGFjaXR5O1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLnNkay5UYWcuZWRpdEljb24obWF0dGVydGFnSUQsIGljb25OYW1lKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBlZGl0SWNvbiBvciBvcGFjaXR5JywgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIE5hdmlnYXRlcyB0aGUgY2FtZXJhIHRvIHRoZSBtb3N0IHJlY2VudGx5IGNyZWF0ZWQgdGFnLiAqL1xyXG4gIGFzeW5jIGdvVG9MYXN0VGFnKCkge1xyXG4gICAgYXdhaXQgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5nb1RvTGFzdFRhZyh0aGlzLnNkayk7XHJcbiAgfVxyXG5cclxuICAvKiogTmF2aWdhdGVzIHRoZSBjYW1lcmEgdG8gYSBzcGVjaWZpYyBNYXR0ZXJ0YWcgYnkgaXRzIElELiAqL1xyXG4gIGFzeW5jIGdvVG9UYWcobWF0dGVydGFnSUQ6IHN0cmluZykge1xyXG4gICAgaWYgKCFtYXR0ZXJ0YWdJRC8qIHx8IHRoaXMuaW5UcmFuc2l0aW9uU3dlZXAqLykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLm9uR29Ub1RhZy5uZXh0KG1hdHRlcnRhZ0lEKTtcclxuICAgICAgYXdhaXQgdGhpcy5zZGsuU3dlZXAuY3VycmVudC53YWl0VW50aWwoXHJcbiAgICAgICAgKGN1cnJlbnRTd2VlcCkgPT4gY3VycmVudFN3ZWVwICE9PSAnJ1xyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBtdERhdGEgPSB0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQobWF0dGVydGFnSUQpO1xyXG4gICAgICBpZiAobXREYXRhKSB7XHJcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBtdERhdGEuZ2V0UG9zaXRpb24oKTtcclxuICAgICAgICBhd2FpdCB0aGlzLnNkay5DYW1lcmEubG9va0F0KHBvc2l0aW9uLCB7XHJcbiAgICAgICAgICB0cmFuc2l0aW9uOiB0aGlzLnNkay5DYW1lcmEuVHJhbnNpdGlvblR5cGUuRkxZXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZGsuVGFnLm9wZW4obWF0dGVydGFnSUQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIEZhbGxiYWNrIGZvciBjYXNlcyB3aGVyZSB3ZSBkb24ndCBoYXZlIGxvY2FsIGRhdGEgeWV0XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZGsuVGFnLm9wZW4obWF0dGVydGFnSUQpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignQ2Fubm90IG5hdmlnYXRlIHRvIHRhZycsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1vdmUgdGhlIHZpZXdlciBjYW1lcmEgdG8gYSBzcGVjaWZpYyAzRCBwb3NpdGlvbiBhbmQgYXBwbHkgYSByb3RhdGlvbi5cclxuICAgKiBEZWxlZ2F0ZXMgdGhlIGhlYXZ5IGxpZnRpbmcgdG8gTWF0dGVycG9ydE5hdmlnYXRpb25TZXJ2aWNlLm1vdmVfdG9fcG9zaXRpb24uXHJcbiAgICogLSBwb3NpdGlvbjogeyB4LCB5LCB6IH1cclxuICAgKiAtIHJvdGF0aW9uOiB7IHlhdywgcGl0Y2g/LCByb2xsPyB9IGluIGRlZ3JlZXMgYnkgZGVmYXVsdFxyXG4gICAqIC0gb3B0aW9uczogb3B0aW9uYWwgdHJhbnNpdGlvbiBhbmQgY29udmVyc2lvbiBzZXR0aW5ncyAoc2VlIG5hdmlnYXRpb24gc2VydmljZSlcclxuICAgKi9cclxuICBwdWJsaWMgYXN5bmMgZ29Ub1Bvc2l0aW9uKFxyXG4gICAgcG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9LFxyXG4gICAgcm90YXRpb246IHsgeWF3OiBudW1iZXI7IHBpdGNoPzogbnVtYmVyOyByb2xsPzogbnVtYmVyIH0gfCBudWxsID0gbnVsbCxcclxuICAgIG9wdGlvbnM/OiB7XHJcbiAgICAgIHRyYW5zaXRpb24/OiAnRkxZJyB8ICdJTlNUQU5UJyB8ICdJTU1FRElBVEUnO1xyXG4gICAgICBkdXJhdGlvbk1zPzogbnVtYmVyO1xyXG4gICAgICBhbmdsZXNJbkRlZ3JlZXM/OiBib29sZWFuO1xyXG4gICAgICBvZmZzZXQ/OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfTtcclxuICAgIH1cclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIEVuc3VyZSBTREsgaXMgaW5pdGlhbGl6ZWRcclxuICAgIGlmICghdGhpcy5zZGspIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYXR0ZXJwb3J0IFNESyBpcyBub3QgaW5pdGlhbGl6ZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBQcmV2ZW50IGNvbmN1cnJlbnQgbmF2aWdhdGlvbiBpZiBhbHJlYWR5IGluIGEgc3dlZXAvbW9kZSB0cmFuc2l0aW9uXHJcbiAgICBpZiAodGhpcy5pblRyYW5zaXRpb25Nb2RlIHx8IHRoaXMuaW5UcmFuc2l0aW9uU3dlZXApIHtcclxuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLmRlYnVnKCdnb1RvUG9zaXRpb24gYWJvcnRlZDogdmlld2VyIGlzIGluIHRyYW5zaXRpb24nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIE1hcmsgdHJhbnNpdGlvbiBzdGF0ZSBvbiBuYXZpZ2F0aW9uIHNlcnZpY2UgKG1vdmVfdG9fcG9zaXRpb24gd2lsbCBhbHNvIG1hbmFnZSBmbGFncylcclxuICAgICAgdGhpcy5pblRyYW5zaXRpb25Nb2RlID0gdHJ1ZTtcclxuXHJcbiAgICAgIC8vIERlbGVnYXRlIHRvIG5hdmlnYXRpb24gc2VydmljZSB3aGljaCBjb250YWlucyB0aGUgcm9idXN0IG1vdmVfdG9fcG9zaXRpb24gaW1wbGVtZW50YXRpb25cclxuICAgICAgYXdhaXQgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5tb3ZlX3RvX3Bvc2l0aW9uKHRoaXMuc2RrLCBwb3NpdGlvbiwgcm90YXRpb24sIG9wdGlvbnMpO1xyXG5cclxuICAgICAgLy8gVXBkYXRlIGxvY2FsIGNhY2hlZCBjYW1lcmEgaW5mb1xyXG4gICAgICB0aGlzLmxhc3RDYW1lcmFQb3NpdGlvbiA9IHsgLi4ucG9zaXRpb24gfTtcclxuICAgICAgLy8gRW1pdCBhIHNpbXBsaWZpZWQgY3VycmVudCBjYW1lcmEgcG9zZSBmb3Igc3Vic2NyaWJlcnNcclxuICAgICAgdGhpcy5jdXJyZW50Q2FtZXJhUG9zZS5uZXh0KHtcclxuICAgICAgICBwb3NpdGlvbjogeyAuLi5wb3NpdGlvbiB9LFxyXG4gICAgICAgIHJvdGF0aW9uOiByb3RhdGlvbiA/IHsgLi4ucm90YXRpb24gfSA6IG51bGwsXHJcbiAgICAgICAgc3dlZXA6IHRoaXMucG9zZUNhbWVyYT8uc3dlZXAgPz8gbnVsbFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcoJ2dvVG9Qb3NpdGlvbiBjb21wbGV0ZWQnLCB7IHBvc2l0aW9uLCByb3RhdGlvbiwgb3B0aW9ucyB9KTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS5lcnJvcignZ29Ub1Bvc2l0aW9uIGVycm9yJywgZXJyKTtcclxuICAgICAgdGhyb3cgZXJyO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgLy8gRW5zdXJlIHRyYW5zaXRpb24gZmxhZyBpcyBjbGVhcmVkIChuYXZpZ2F0aW9uIHNlcnZpY2UgbWF5IGFsc28gY2xlYXIgaXQpXHJcbiAgICAgIHRoaXMuaW5UcmFuc2l0aW9uTW9kZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICAqIENvbXB1dGVzIHRoZSBjb250ZXh0LWF3YXJlIG9wYWNpdHkgZm9yIGEgc2luZ2xlIHRhZyBhdCB0aGUgbW9tZW50IGl0IGlzIHJlbmRlcmVkLlxyXG4gICAgKiAtIEN1cnNvciB0YWc6IGFsd2F5cyB1c2UgcHJvdmlkZWQgZGVmYXVsdE9wYWNpdHkuXHJcbiAgICAqIC0gRE9MTEhPVVNFIC8gRkxPT1JQTEFOOiAwIChoaWRkZW4pLlxyXG4gICAgKiAtIElOU0lERTogZmxvb3ItZmlsdGVyZWQgcHJveGltaXR5IG9wYWNpdHkgdmlhIE1hdHRlcnBvcnRUYWdTZXJ2aWNlLlxyXG4gICAgKiAtIE90aGVyIC8gdW5rbm93bjogZGVmYXVsdE9wYWNpdHkuXHJcbiAgICAqL1xyXG4gIC8qcHJpdmF0ZSBfY29tcHV0ZUNvbnRleHRPcGFjaXR5Rm9yVGFnKFxyXG4gICAgbWF0dGVydGFnSUQ6IHN0cmluZyxcclxuICAgIG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEsXHJcbiAgICBkZWZhdWx0T3BhY2l0eTogbnVtYmVyXHJcbiAgKTogbnVtYmVyIHtcclxuICAgIGlmIChtYXR0ZXJ0YWdJRCA9PT0gdGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdykge1xyXG4gICAgICByZXR1cm4gZGVmYXVsdE9wYWNpdHk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5jb21wdXRlU2luZ2xlVGFnQ29udGV4dE9wYWNpdHkoXHJcbiAgICAgIG1hdHRlcnRhZ0RhdGEsXHJcbiAgICAgIHRoaXMucG9zZUNhbWVyYSxcclxuICAgICAgdGhpcy5zd2VlcENvbGxlY3Rpb24sXHJcbiAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudEZsb29yU2VxdWVuY2UsXHJcbiAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudFJvb21zXHJcbiAgICApO1xyXG4gIH0qL1xyXG5cclxuICBwcml2YXRlIGFkZEN1c3RvbUNzcygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGNzcyA9IGBcclxuICAgICAgLmZvb3Rlci11aSxcclxuICAgICAgLnNob3djYXNlLWZvb3RlcixcclxuICAgICAgLm1wLW5vdmEtYnRuLWdyb3VwLFxyXG4gICAgICAuZm9vdGVyLWRpdmlkZXIsXHJcbiAgICAgIC5sb2dvLWxpbmssXHJcbiAgICAgIC5mb290ZXItbG9nbyxcclxuICAgICAgLmJvdHRvbS11aSxcclxuICAgICAgW2RhdGEtdGVzdGlkPVwic2hvd2Nhc2UtZm9vdGVyXCJdIHtcclxuICAgICAgICBvcGFjaXR5OiAwICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuICFpbXBvcnRhbnQ7XHJcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmUgIWltcG9ydGFudDtcclxuICAgICAgfVxyXG4gICAgYDtcclxuXHJcbiAgICAvLyAxc3QgbWV0aG9kOiBWaWEgU2NlbmUgU0RLXHJcbiAgICBpZiAodGhpcy5zZGs/LlNjZW5lPy5hZGRTdHlsZSkge1xyXG4gICAgICB0aGlzLnNkay5TY2VuZS5hZGRTdHlsZShjc3MpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDJuZCBtZXRob2Q6IERpcmVjdCBpbmplY3Rpb24gaW4gaUZyYW1lIERPTSAoRmFsbGJhY2spXHJcbiAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdmlld2VyLW1vZHVsZScpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xyXG4gICAgaWYgKGlmcmFtZT8uY29udGVudFdpbmRvdz8uZG9jdW1lbnQpIHtcclxuICAgICAgY29uc3Qgc3R5bGUgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xyXG4gICAgICBzdHlsZS50ZXh0Q29udGVudCA9IGNzcztcclxuICAgICAgaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIGNvbnRlbnQgb2YgTWF0dGVydGFnIHdpdGggbWF0dGVydGFnSUQgKGJpbGxib2FyZCwgaW5qZWN0ZWQgaHRtbCwgdGFnIGljb24pXHJcbiAgICogQHBhcmFtIG1hdHRlcnRhZ0lEIHN0cmluZ1xyXG4gICAqIEBwYXJhbSBvYmplY3QgVGlja2V0LCBFcXVpcG1lbnQsIEZlYXR1cmUsIGV0Y1xyXG4gICAqIEBwYXJhbSB0YWdUeXBlIFBvaVR5cGVcclxuICAgKi9cclxuICBhc3luYyB1cGRhdGVNYXR0ZXJUYWdDb250ZW50Rm9yVGFnSUQoXHJcbiAgICBtYXR0ZXJ0YWdJRDogc3RyaW5nLFxyXG4gICAgb2JqZWN0OiBEYk9iamVjdFR5cGUgPSBudWxsLFxyXG4gICAgdGFnVHlwZTogUG9pVHlwZSA9IG51bGxcclxuICApIHtcclxuICAgIGlmICh0aGlzLnNkaykge1xyXG4gICAgICBhd2FpdCB0aGlzLnNkay5UYWcuZWRpdEJpbGxib2FyZChcclxuICAgICAgICBtYXR0ZXJ0YWdJRCxcclxuICAgICAgICB0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQobWF0dGVydGFnSUQpLmdldERhdGEoKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE1pc2Ugw6Agam91ciBkZSBsJ2ljw7RuZSBpbW3DqWRpYXRlXHJcbiAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLnVwZGF0ZU1hdHRlclRhZ0NvbnRlbnRGb3JUYWdJRChcclxuICAgICAgdGhpcy5zZGssXHJcbiAgICAgIG1hdHRlcnRhZ0lELFxyXG4gICAgICBvYmplY3QsXHJcbiAgICAgIHRhZ1R5cGUsXHJcbiAgICAgIHRoaXMuc2V0VGFnSWNvbkFuZE9wYWNpdHkuYmluZCh0aGlzKSxcclxuICAgICAgLy8gT24gcGFzc2UgdW5lIGZvbmN0aW9uIHdyYXBwZXIgcXVpIGV4w6ljdXRlIGwnaW5qZWN0aW9uIEhUTUwgc2FucyBibG9xdWVyXHJcbiAgICAgIGFzeW5jICh0eXBlLCBvYmosIHNpZCkgPT4ge1xyXG4gICAgICAgIHRoaXMuaW5qZWN0SHRtbEluVGFnKHR5cGUsIG9iaiwgc2lkKS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0FzeW5jIEhUTUwgdXBkYXRlIGZhaWxlZCBmb3InLCBzaWQsIGVycik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIGluamVjdGVkIGh0bWwgZm9yIE1hdHRlcnRhZ1xyXG4gICAqIEBwYXJhbSBtYXR0ZXJ0YWdJRCBzdHJpbmdcclxuICAgKiBAcGFyYW0gb2JqZWN0IFRpY2tldCwgRXF1aXBtZW50LCBGZWF0dXJlLCBldGNcclxuICAgKiBAcGFyYW0gdGFnVHlwZSBQb2lUeXBlXHJcbiAgICovXHJcbiAgYXN5bmMgdXBkYXRlSW5qZWN0ZWRIdG1sRm9yVGFnSUQoXHJcbiAgICBtYXR0ZXJ0YWdJRDogc3RyaW5nLFxyXG4gICAgb2JqZWN0OiBhbnksXHJcbiAgICB0YWdUeXBlOiBQb2lUeXBlXHJcbiAgKSB7XHJcbiAgICBhd2FpdCB0aGlzLmluamVjdEh0bWxJblRhZyh0YWdUeXBlLCBvYmplY3QsIG1hdHRlcnRhZ0lEKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZXMgTWF0dGVydGFnIGZyb20gVmlld2VyIGJ5IGl0cyBJRFxyXG4gICAqIEBwYXJhbSBtYXR0ZXJ0YWdJRCBzdHJpbmdcclxuICAgKi9cclxuICBkZWxldGVNYXR0ZXJ0YWdGcm9tSWQobWF0dGVydGFnSUQ6IHN0cmluZykge1xyXG4gICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5kZWxldGVNYXR0ZXJ0YWdGcm9tSWQodGhpcy5zZGssIG1hdHRlcnRhZ0lEKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZXMgbGF0ZXN0IGNyZWF0ZWQgbWF0dGVydGFnXHJcbiAgICovXHJcbiAgYXN5bmMgZGVsZXRlTGFzdE1hdHRlcnRhZygpIHtcclxuICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZGVsZXRlTGFzdE1hdHRlcnRhZyh0aGlzLnNkayk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMZWdhY3k6IHVzZWQgdG8gYmUgY2FsbGVkIGFjdGlvbl9hZGRfbWF0dGVydGFnX2Zyb21fUE9JXHJcbiAgICogQWRkcyBhbmQgY29uZmlndXJlcyBNYXR0ZXJ0YWcgZm9yIGFuIG9iamVjdCAoVGlja2V0LCBFcXVpcG1lbnQsIEZlYXR1cmUsIGV0YykgdGhhdCBjb3JyZXNwb25kcyB0byBQT0kgKGNvb3JkaW5hdGVzLCB0YWdJY29uKVxyXG4gICAqIEBwYXJhbSB0YWdUeXBlIFBvaVR5cGVcclxuICAgKiBAcGFyYW0gb2JqZWN0IFRpY2tldCwgRXF1aXBtZW50LCBGZWF0dXJlLi4uXHJcbiAgICogQHBhcmFtIHBvaSBQT0lcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIGFzeW5jIGNyZWF0ZU1hdHRlcnRhZ0Zyb21QT0koXHJcbiAgICB0YWdUeXBlOiBQb2lUeXBlLFxyXG4gICAgb2JqZWN0OiBEYk9iamVjdFR5cGUsXHJcbiAgICBwb2k6IFBPSVxyXG4gICk6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5jcmVhdGVNYXR0ZXJ0YWdGcm9tUE9JKFxyXG4gICAgICB0aGlzLnNkayxcclxuICAgICAgdGFnVHlwZSxcclxuICAgICAgb2JqZWN0LFxyXG4gICAgICBwb2ksXHJcbiAgICAgIHRoaXMucG9zZUNhbWVyYSxcclxuICAgICAgdGhpcy5nZXRUYWdGcm9tRWxlbWVudElkLmJpbmQodGhpcyksXHJcbiAgICAgIHRoaXMuc2V0VGFnSWNvbkFuZE9wYWNpdHkuYmluZCh0aGlzKSxcclxuICAgICAgdGhpcy5pbmplY3RIdG1sSW5UYWcuYmluZCh0aGlzKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluamVjdCBjdXN0b20gSFRNTCBhcyBNYXR0ZXJ0YWcgY29udGVudFxyXG4gICAqIEBwYXJhbSB0YWdUeXBlIFBvaVR5cGVcclxuICAgKiBAcGFyYW0gb2JqZWN0IFRpY2tldCwgRXF1aXBtZW50LCBGZWF0dXJlIGV0Y1xyXG4gICAqIEBwYXJhbSB0YWdJRCBzdHJpbmdcclxuICAgKi9cclxuICBhc3luYyBpbmplY3RIdG1sSW5UYWcodGFnVHlwZTogUG9pVHlwZSwgb2JqZWN0OiBEYk9iamVjdFR5cGUsIHRhZ0lEOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmluamVjdEh0bWxJblRhZyh0aGlzLnNkaywgdGFnVHlwZSwgb2JqZWN0LCB0YWdJRCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgYXN5bmMgYWN0aW9uX2RlbGV0ZV9hbGxfbWF0dGVydGFncygpIHtcclxuICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuYWN0aW9uX2RlbGV0ZV9hbGxfbWF0dGVydGFncyh0aGlzLnNkayk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWxldGVzIE1hdHRlcnRhZyBmcm9tIHZpc2l0IGFzc29jaWF0ZWQgd2l0aCBvYmplY3QgSUQgKHRpY2tldElELCBldGMpXHJcbiAgICogQHBhcmFtIGVsZW1lbnRJRCBzdHJpbmdcclxuICAgKi9cclxuICBhc3luYyBkZWxldGVNYXR0ZXJ0YWdGb3JPYmplY3QoZWxlbWVudElEOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IG1hdHRlclRhZ0lEID0gdGhpcy5nZXRUYWdGcm9tRWxlbWVudElkKGVsZW1lbnRJRCkudGFnO1xyXG4gICAgaWYgKG1hdHRlclRhZ0lEKSB7XHJcbiAgICAgIHRoaXMudGFnQWRkUXVldWUgPSB0aGlzLnRhZ0FkZFF1ZXVlLnRoZW4oYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZGVsZXRlTWF0dGVydGFnRnJvbUlkKHRoaXMuc2RrLCBtYXR0ZXJUYWdJRCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMudGFnQWRkUXVldWU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiB1dWlkIGZyb20gdGhyZWVqc1xyXG4gICAqIEBwYXJhbSB1dWlkXHJcbiAgICovXHJcbiAgYXN5bmMgZGVsZXRlT2JqZWN0M0QodXVpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UuZGVsZXRlT2JqZWN0M0QodXVpZCk7XHJcbiAgfVxyXG5cclxuICBnZXRPYmplY3QzRE1vZGVsTm9kZUZyb21EaWN0aW9ubmFyeSh1dWlkOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmdldE9iamVjdDNETW9kZWxOb2RlRnJvbURpY3Rpb25uYXJ5KHV1aWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyAgTWF0dGVydGFnRGF0YSBhbmQgc3RhcnQgcmVwb3NpdGlvbmluZyAoY3JlYXRlcyB0ZW1wb3JhcnkgbWF0dGVydGFnIHRoYXQgZm9sbG93cyB0aGUgY3Vyc29yKVxyXG4gICAqIEBwYXJhbSBwb2lUeXBlIFBvaVR5cGVcclxuICAgKiBAcGFyYW0gZWxlbWVudCBUaWNrZXQsIEVxdWlwbWVudCwgRmVhdHVyZSwgZXRjXHJcbiAgICovXHJcbiAgYXN5bmMgYWRkTWF0dGVydGFnV2hlblJlcG9zaXRpb25pbmcocG9pVHlwZTogUG9pVHlwZSwgZWxlbWVudDogRGJPYmplY3RUeXBlKSB7XHJcbiAgICBjb25zdCBtYXR0ZXJ0YWdEYXRhID0gbmV3IE1hdHRlcnRhZ0RhdGEocG9pVHlwZSk7XHJcbiAgICAvLyBzZXQgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBleGlzdGluZyB0YWdcclxuICAgIGNvbnN0IFtwb2ldID0gZWxlbWVudC5wb2lzLml0ZW1zO1xyXG4gICAgaWYgKHBvaSAmJiBwb2kuY29vcmRpbmF0ZSkge1xyXG4gICAgICBtYXR0ZXJ0YWdEYXRhLnNldFBvc2l0aW9uKEpTT04ucGFyc2UocG9pLmNvb3JkaW5hdGUpKTtcclxuICAgICAgbWF0dGVydGFnRGF0YS5zZXRQb2kocG9pKTsgLy8gdG8ga2VlcCBjdXN0b20gdGFnSWNvbiBhbmQgb3BhY2l0eVxyXG4gICAgfVxyXG4gICAgbWF0dGVydGFnRGF0YS5zZXRTd2VlcElEKHRoaXMubmF2aWdhdGlvblNlcnZpY2UucmVzb2x2ZVN3ZWVwVXVpZCh0aGlzLnBvc2VDYW1lcmEuc3dlZXApKTtcclxuICAgIG1hdHRlcnRhZ0RhdGEuc2V0Um90YXRpb24odGhpcy5wb3NlQ2FtZXJhLnJvdGF0aW9uKTtcclxuICAgIG1hdHRlcnRhZ0RhdGEuc2V0T2JqZWN0KGVsZW1lbnQsIHBvaVR5cGUpO1xyXG4gICAgdGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdyA9IGF3YWl0IHRoaXMuYWRkTWF0dGVydGFnVG9WaWV3ZXIobWF0dGVydGFnRGF0YSk7XHJcblxyXG4gICAgdGhpcy5zZXRJbnRlcmFjdGlvbk1vZGUoVmlld2VySW50ZXJhY3Rpb25zLlBPU0lUSU9OSU5HKTtcclxuICAgIGF3YWl0IHRoaXMuYWRkQ3Vyc29yTWF0dGVydGFnKG1hdHRlcnRhZ0RhdGEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBNYXR0ZXJ0YWdEYXRhIGFuZCBtYXR0ZXJ0YWcgdGhhdCBmb2xsb3dzIHRoZSBjdXJzb3Igd2hlbiBjaG9vc2luZyBwb3NpdGlvbiBmb3IgYSBuZXcgb2JqZWN0XHJcbiAgICogQHBhcmFtIHBvaVR5cGVcclxuICAgKi9cclxuICBhc3luYyBhZGRNYXR0ZXJ0YWdXaGVuQWRkaW5nKHBvaVR5cGU6IFBvaVR5cGUpIHtcclxuICAgIGNvbnN0IG1hdHRlcnRhZ0RhdGEgPSBuZXcgTWF0dGVydGFnRGF0YShwb2lUeXBlKTtcclxuICAgIG1hdHRlcnRhZ0RhdGEuc2V0U3dlZXBJRCh0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnJlc29sdmVTd2VlcFV1aWQodGhpcy5wb3NlQ2FtZXJhLnN3ZWVwKSk7XHJcbiAgICBtYXR0ZXJ0YWdEYXRhLnNldFJvdGF0aW9uKHRoaXMucG9zZUNhbWVyYS5yb3RhdGlvbik7XHJcbiAgICB0aGlzLnNldEludGVyYWN0aW9uTW9kZShWaWV3ZXJJbnRlcmFjdGlvbnMuQURESU5HKTtcclxuICAgIGF3YWl0IHRoaXMuYWRkQ3Vyc29yTWF0dGVydGFnKG1hdHRlcnRhZ0RhdGEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FuY2VscyBmb2xsb3dpbmcgb2YgY3Vyc29yIChtZWFuaW5nIGRlbGV0aW5nIGxhc3QgTWF0dGVydGFnKVxyXG4gICAqL1xyXG4gIGNhbmNlbEZvbGxvd2luZ0N1cnNvcigpIHtcclxuICAgIHRoaXMuZGVsZXRlTGFzdE1hdHRlcnRhZygpO1xyXG4gICAgdGhpcy5zZXRJbnRlcmFjdGlvbk1vZGUoVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFQpO1xyXG4gIH1cclxuXHJcbiAgc2V0TGFzdE9iamVjdDNEKGxhc3RPYmplY3QzRDogVGhyZWVKU09iamVjdDNEKSB7XHJcbiAgICB0aGlzLm9iamVjdDNEU2VydmljZS5sYXN0T2JqZWN0M0QgPSBsYXN0T2JqZWN0M0Q7XHJcbiAgfVxyXG5cclxuICBnZXRMYXN0T2JqZWN0M0QoKTogVGhyZWVKU09iamVjdDNEIHtcclxuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5sYXN0T2JqZWN0M0Q7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQZXJmb3JtcyBjYWxsYmFjayBhZnRlciBtYXR0ZXJ0YWcgcG9zaXRpb24gd2FzIHZhbGlkYXRlZCAoY3JlYXRpb24gb2Ygb2JqZWN0IG9yIHJlcG9zaXRpb25pbmcpXHJcbiAgICogQHBhcmFtIG1vZGUgTWF0dGVydGFnQWN0aW9uTW9kZVxyXG4gICAqL1xyXG4gIGNhbGxiYWNrQWZ0ZXJNYXR0ZXJ0YWdWYWxpZGF0aW9uKG1vZGU6IE1hdHRlcnRhZ0FjdGlvbk1vZGUpIHtcclxuICAgIHRoaXMudmlzaWJpbGl0eVNlcnZpY2UuZGV0YWlsU2hvd2luZy5uZXh0KHRydWUpO1xyXG4gICAgY29uc3QgbGFzdFRhZyA9IHRoaXMuZ2V0TGFzdFRhZygpO1xyXG4gICAgc3dpdGNoIChtb2RlKSB7XHJcbiAgICAgIGNhc2UgTWF0dGVydGFnQWN0aW9uTW9kZS5BRERfRVFVSVBNRU5UOlxyXG4gICAgICAgIHRoaXMuZ29Ub0xhc3RUYWcoKTtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYHZpc2l0LyR7dGhpcy5jdXJyZW50U3BhY2VJRH0vYWRkX2VxdWlwYF0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIE1hdHRlcnRhZ0FjdGlvbk1vZGUuQUREX1RJQ0tFVDpcclxuICAgICAgICB0aGlzLmdvVG9MYXN0VGFnKCk7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2B2aXNpdC8ke3RoaXMuY3VycmVudFNwYWNlSUR9L2FkZF90aWNrZXRgXSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTWF0dGVydGFnQWN0aW9uTW9kZS5BRERfT0JKRUNUM0Q6XHJcbiAgICAgICAgdGhpcy5nb1RvTGFzdFRhZygpO1xyXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgdmlzaXQvJHt0aGlzLmN1cnJlbnRTcGFjZUlEfS9hZGRfb2JqZWN0M2RgXSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTWF0dGVydGFnQWN0aW9uTW9kZS5BRERfREFUQTpcclxuICAgICAgICB0aGlzLmdvVG9MYXN0VGFnKCk7XHJcbiAgICAgICAgbGV0IHVybDogc3RyaW5nO1xyXG4gICAgICAgIGlmICh0aGlzLnJvdXRlci51cmwuaW5jbHVkZXMoJz8nKSkge1xyXG4gICAgICAgICAgdXJsID0gdGhpcy5yb3V0ZXIudXJsLnN1YnN0cmluZygwLCB0aGlzLnJvdXRlci51cmwuaW5kZXhPZignPycpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdXJsID0gdGhpcy5yb3V0ZXIudXJsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYCR7dXJsfS9hZGRfZmVhdHVyZWBdKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBNYXR0ZXJ0YWdBY3Rpb25Nb2RlLkFERF9ERVNLOlxyXG4gICAgICAgIHRoaXMuZ29Ub0xhc3RUYWcoKTtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYHZpc2l0LyR7dGhpcy5jdXJyZW50U3BhY2VJRH0vYWRkX2ZlYXR1cmVgXSwge1xyXG4gICAgICAgICAgcXVlcnlQYXJhbXM6IHsgaXNEZXNrOiB0cnVlIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTWF0dGVydGFnQWN0aW9uTW9kZS5BRERfUk9PTTpcclxuICAgICAgICB0aGlzLmdvVG9MYXN0VGFnKCk7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2B2aXNpdC8ke3RoaXMuY3VycmVudFNwYWNlSUR9L2FkZF9yb29tYF0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIE1hdHRlcnRhZ0FjdGlvbk1vZGUuUE9TSVRJT05fT0JKRUNUM0Q6XHJcbiAgICAgICAgaWYgKGxhc3RUYWcpIHtcclxuICAgICAgICAgIC8vIERPIE5vdGhpbmcgKHJvdXRpbmcpLCBqdXN0XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShcclxuICAgICAgICAgICAgW2B2aXNpdC8ke3RoaXMuY3VycmVudFNwYWNlSUR9L29iamVjdDNkLyR7dGhpcy5sYXN0T2JqZWN0M0QuaWR9YF0sXHJcbiAgICAgICAgICAgIHsgcXVlcnlQYXJhbXM6IHsgcG9zaXRpb25pbmc6IHRydWUgfSB9XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBNYXR0ZXJ0YWdBY3Rpb25Nb2RlLlBPU0lUSU9OX1RJQ0tFVDpcclxuICAgICAgICBpZiAobGFzdFRhZykge1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoXHJcbiAgICAgICAgICAgIFtcclxuICAgICAgICAgICAgICBgdmlzaXQvJHt0aGlzLmN1cnJlbnRTcGFjZUlEfS9kZXRhaWwvJHt0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQobGFzdFRhZykuZWxlbWVudElEXHJcbiAgICAgICAgICAgICAgfWAsXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgIHsgcXVlcnlQYXJhbXM6IHsgcG9zaXRpb25pbmc6IHRydWUgfSB9XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBNYXR0ZXJ0YWdBY3Rpb25Nb2RlLlBPU0lUSU9OX0VRVUlQTUVOVDpcclxuICAgICAgICBpZiAobGFzdFRhZykge1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoXHJcbiAgICAgICAgICAgIFtcclxuICAgICAgICAgICAgICBgdmlzaXQvJHt0aGlzLmN1cnJlbnRTcGFjZUlEfS9lcXVpcC8ke3RoaXMuZGljdGlvbm5hcnlUYWdzLmdldChsYXN0VGFnKS5lbGVtZW50SURcclxuICAgICAgICAgICAgICB9YCxcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgeyBxdWVyeVBhcmFtczogeyBwb3NpdGlvbmluZzogdHJ1ZSB9IH1cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIE1hdHRlcnRhZ0FjdGlvbk1vZGUuUE9TSVRJT05fREFUQTpcclxuICAgICAgICBpZiAobGFzdFRhZykge1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHtcclxuICAgICAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5hY3RpdmVSb3V0ZSxcclxuICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHsgcG9zaXRpb25pbmc6IHRydWUgfSwgcXVlcnlQYXJhbXNIYW5kbGluZzogXCJtZXJnZVwiXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTWF0dGVydGFnQWN0aW9uTW9kZS5QT1NJVElPTl9ST09NOlxyXG4gICAgICAgIGlmIChsYXN0VGFnKSB7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwge1xyXG4gICAgICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLmFjdGl2ZVJvdXRlLFxyXG4gICAgICAgICAgICBxdWVyeVBhcmFtczogeyBwb3NpdGlvbmluZzogdHJ1ZSB9LCBxdWVyeVBhcmFtc0hhbmRsaW5nOiBcIm1lcmdlXCJcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZ1bGx5IHVwZGF0ZXMgZXhpc3RpbmcgTWF0dGVydGFnIGNvbnRlbnQgd2l0aCBkYXRhIG9mIG9iamVjdCAoVGlja2V0LCBFcXVpcG1lbnQsIERlc2spXHJcbiAgICogQHBhcmFtIG1hdHRlcnRhZ0lEIHN0cmluZ1xyXG4gICAqIEBwYXJhbSBvYmplY3QgVGlja2V0LCBFcXVpcG1lbnQsIEZlYXR1cmUsIERlc2tcclxuICAgKiBAcGFyYW0gcG9pVHlwZSBQb2lUeXBlXHJcbiAgICogQHBhcmFtIHBvaSBQT0lcclxuICAgKi9cclxuICBhc3luYyBzZXRPYmplY3RBbmRQb2lJblRhZyhcclxuICAgIG1hdHRlcnRhZ0lEOiBzdHJpbmcsXHJcbiAgICBvYmplY3Q6IERiT2JqZWN0VHlwZSxcclxuICAgIHBvaVR5cGU6IFBvaVR5cGUsXHJcbiAgICBwb2k6IFBPSSB8IG51bGwgPSBudWxsXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQobWF0dGVydGFnSUQpLnNldE9iamVjdChvYmplY3QsIHBvaVR5cGUpO1xyXG4gICAgaWYgKHBvaSkge1xyXG4gICAgICB0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQobWF0dGVydGFnSUQpLnNldFBvaShwb2kpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3MuZ2V0KG1hdHRlcnRhZ0lEKS5lbGVtZW50SUQgPSBvYmplY3QuaWQ7XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZU1hdHRlclRhZ0NvbnRlbnRGb3JUYWdJRChtYXR0ZXJ0YWdJRCwgb2JqZWN0LCBwb2lUeXBlKTtcclxuICAgICAgYXdhaXQgdGhpcy51cGRhdGVNYXR0ZXJUYWdQb3NJblNka1ZpZXdlcihcclxuICAgICAgICBtYXR0ZXJ0YWdJRCxcclxuICAgICAgICBvYmplY3QsXHJcbiAgICAgICAgcG9pVHlwZSxcclxuICAgICAgICBwb2lcclxuICAgICAgKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgY29uc29sZS5sb2coYGVycm9yIGluIHNldE9iamVjdEFuZFBvaUluVGFnOiAke2V9YCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyB1cGRhdGVNYXR0ZXJUYWdQb3NJblNka1ZpZXdlcihcclxuICAgIG1hdHRlcnRhZ0lEOiBzdHJpbmcsXHJcbiAgICBvYmplY3Q6IERiT2JqZWN0VHlwZSxcclxuICAgIHBvaVR5cGU6IFBvaVR5cGUsXHJcbiAgICBwb2k6IFBPSSB8IG51bGwgPSBudWxsXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBJbmRleFRvVXBkYXRlID0gb2JqZWN0LnBvaXMuaXRlbXMuZmluZEluZGV4KCh1KSA9PiB1LmlkID09PSBwb2kuaWQpO1xyXG4gICAgb2JqZWN0LnBvaXMuaXRlbXNbSW5kZXhUb1VwZGF0ZV0gPSBwb2k7XHJcbiAgICBjb25zdCB7IHgsIHksIHogfSA9IEpTT04ucGFyc2UocG9pLmNvb3JkaW5hdGUpO1xyXG4gICAgY29uc3QgbmV3UG9zaXRpb24gPSB7XHJcbiAgICAgIGFuY2hvclBvc2l0aW9uOiB7XHJcbiAgICAgICAgeDogeCxcclxuICAgICAgICB5OiB5LFxyXG4gICAgICAgIHo6IHosXHJcbiAgICAgIH0sXHJcbiAgICAgIHN0ZW1WZWN0b3I6IHtcclxuICAgICAgICAvLyBtYWtlIHRoZSBUYWcgc3RpY2sgc3RyYWlnaHQgdXAgYW5kIG1ha2UgaXQgMC4zMCBtZXRlcnMgKH4xIGZvb3QpIHRhbGxcclxuICAgICAgICB4OiAwLFxyXG4gICAgICAgIHk6IDAuMyxcclxuICAgICAgICB6OiAwLFxyXG4gICAgICB9LFxyXG4gICAgfTtcclxuICAgIC8vdGhpcy5zZGsuTWF0dGVydGFnLmVkaXRQb3NpdGlvbihtYXR0ZXJ0YWdJRCwgbmV3UG9zaXRpb24pO1xyXG4gICAgdGhpcy5zZGsuVGFnLmVkaXRQb3NpdGlvbihtYXR0ZXJ0YWdJRCwgbmV3UG9zaXRpb24pO1xyXG4gICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3NcclxuICAgICAgLmdldChtYXR0ZXJ0YWdJRClcclxuICAgICAgLnNldFBvc2l0aW9uKG5ld1Bvc2l0aW9uLmFuY2hvclBvc2l0aW9uKTtcclxuXHJcbiAgICBmb3IgKGxldCB0YWdJZCBvZiB0aGlzLm1hdHRlcnRhZ0lEcykge1xyXG4gICAgICBjb25zdCBjdXJyZW50VGFnID0gdGhpcy5kaWN0aW9ubmFyeVRhZ3MuZ2V0KHRhZ0lkKTtcclxuICAgICAgaWYgKCFjdXJyZW50VGFnKSB7XHJcbiAgICAgICAgY29udGludWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGN1cnJlbnRUYWcuZWxlbWVudElEID09PSBvYmplY3QuaWQgJiYgdGFnSWQgIT09IG1hdHRlcnRhZ0lEKSB7XHJcbiAgICAgICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3MuZGVsZXRlKHRhZ0lkKTtcclxuICAgICAgICB0aGlzLnNkay5UYWcucmVtb3ZlKHRhZ0lkKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyBtYXR0ZXJUYWdJRCBhbmQgaXRzIHN3ZWVwIGZvciBhbiBvYmplY3QgSUQgKHRpY2tldCBJRCwgZXRjKVxyXG4gICAqIEBwYXJhbSBlbGVtZW50SUQgc3RyaW5nXHJcbiAgICogQHJldHVybnMge3RhZzogc3RyaW5nIHwgbnVsbCwgc3dlZXA6IHN0cmluZyB8IG51bGx9XHJcbiAgICovXHJcbiAgcHVibGljIGdldFRhZ0Zyb21FbGVtZW50SWQoZWxlbWVudElEOiBzdHJpbmcpOiB7IHRhZzogc3RyaW5nIHwgbnVsbDsgc3dlZXA6IHN0cmluZyB8IG51bGwgfSB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5nZXRUYWdGcm9tRWxlbWVudElkKGVsZW1lbnRJRCwgdGhpcy5zd2VlcHMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyBsYXRlc3QgdGFnIGNyZWF0ZWQgaW4gdGhlIHZpc2l0ICh3aGVuIGZvbGxvd2luZyB0aGUgY3Vyc29yIHRvIHBvc2l0aW9uKVxyXG4gICAqIEByZXR1cm5zIHN0cmluZyBtYXR0ZXJ0YWdJRFxyXG4gICAqL1xyXG4gIGdldExhc3RUYWcoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBpZiAodGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdykge1xyXG4gICAgICByZXR1cm4gdGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdztcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLm1hdHRlcnRhZ0lEcy5sZW5ndGggPT09IDBcclxuICAgICAgICA/IG51bGxcclxuICAgICAgICA6IHRoaXMubWF0dGVydGFnSURzW3RoaXMubWF0dGVydGFnSURzLmxlbmd0aCAtIDFdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogR2V0cyBNYXR0ZXJ0YWdEYXRhIGZvciBNYXR0ZXJ0YWcgKHJlcGxhY2VzIGdldFRhZ0RhdGFGcm9tSWQpXHJcbiAgICogQHBhcmFtIG1hdHRlcnRhZ0lEXHJcbiAgICogQHJldHVybnMgTWF0dGVydGFnRGF0YVxyXG4gICAqL1xyXG4gIGdldE1hdHRlclRhZ0RhdGFGb3JNYXR0ZXJ0YWcobWF0dGVydGFnSUQ6IHN0cmluZyk6IE1hdHRlcnRhZ0RhdGEgfCBudWxsIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQobWF0dGVydGFnSUQpO1xyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdjYW5ub3QgcmV0cmlldmUgbWF0dGVydGFnRGF0YSBmb3IgdGFnJywgbWF0dGVydGFnSUQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvL1xyXG4gIC8vIC0tLS0tLS0tLS0gVmlld2VyIHJlbGF0ZWQgKHN3aXRjaCB2aWV3cywgZ28gdG8pIC0tLS0tLS0tLS1cclxuICAvL1xyXG4gIGFzeW5jIGFjdGlvbl90b29sYm94X2Zsb29ycGxhbigpIHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmFjdGlvbl90b29sYm94X2Zsb29ycGxhbih0aGlzLnNkayk7XHJcbiAgfVxyXG5cclxuICBhY3Rpb25fdG9vbGJveF9pbnNpZGVfdmlldygpIHtcclxuICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuYWN0aW9uX3Rvb2xib3hfaW5zaWRlX3ZpZXcodGhpcy5zZGspO1xyXG4gIH1cclxuXHJcbiAgYWN0aW9uU2hvd0FsbEZsb29ycygpIHtcclxuICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuYWN0aW9uU2hvd0FsbEZsb29ycyh0aGlzLnNkayk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBhY3Rpb25fdG9vbGJveF9kb2xsaG91c2UoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5hY3Rpb25fdG9vbGJveF9kb2xsaG91c2UodGhpcy5zZGspO1xyXG4gIH1cclxuXHJcbiAgYWN0aW9uX3Rvb2xib3hfbWVzdXJlKCkge1xyXG4gICAgY29uc3QgbmV3U3RhdGUgPSAhdGhpcy5pc01lYXN1cmVNb2RlT247XHJcbiAgICB0aGlzLnNkay5NZWFzdXJlbWVudHMudG9nZ2xlTW9kZShuZXdTdGF0ZSkudGhlbigoKSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICAgIGBNZWFzdXJlbWVudCBtb2RlIGlzIG5vdyAke25ld1N0YXRlID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJ31gXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFjdGlvbl90b29sYm94X2NhbmNlbF9tZXN1cmUoKSB7XHJcbiAgICBpZiAodGhpcy5pc01lYXN1cmVNb2RlT24pIHtcclxuICAgICAgdGhpcy5hY3Rpb25fdG9vbGJveF9tZXN1cmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGFjdGlvbl9nb190b19mbG9vcihcclxuICAgIGZsb29yTmFtZTogc3RyaW5nLFxyXG4gICAgbWF0dGVycG9ydEZsb29yU2VxdWVuY2U6IG51bWJlciA9IG51bGxcclxuICApIHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmFjdGlvbl9nb190b19mbG9vcih0aGlzLnNkaywgZmxvb3JOYW1lLCBtYXR0ZXJwb3J0Rmxvb3JTZXF1ZW5jZSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBhY3Rpb25fZ29fdG9fc3dlZXAoc3dlZXA6IHN0cmluZywgcm90YXRpb24/OiB7IHg6IG51bWJlciwgeTogbnVtYmVyIH0gfCBudWxsKSB7XHJcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5hY3Rpb25fZ29fdG9fc3dlZXAodGhpcy5zZGssIHN3ZWVwLCByb3RhdGlvbik7XHJcbiAgfVxyXG5cclxuICBnZXRDdXJyZW50U3dlZXAoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5nZXRDdXJyZW50U3dlZXAodGhpcy5wb3NlQ2FtZXJhKTtcclxuICB9XHJcblxyXG4gIGdldEN1cnJlbnRDYW1lcmFQb3NpdGlvbigpOiB7XHJcbiAgICByb3RhdGlvbjogYW55O1xyXG4gICAgcG9zaXRpb246IGFueTtcclxuICAgIHN3ZWVwOiBhbnk7XHJcbiAgfSB8IG51bGwge1xyXG4gICAgaWYgKHRoaXMucG9zZUNhbWVyYSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5wb3NlQ2FtZXJhO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBzZXRJbnRlcmFjdGlvbk1vZGUoaW50ZXJhY3Rpb25Nb2RlOiBudW1iZXIpIHtcclxuICAgIHRoaXMuaW50ZXJhY3Rpb25Nb2RlID0gaW50ZXJhY3Rpb25Nb2RlO1xyXG4gIH1cclxuXHJcbiAgZ2V0SW50ZXJhY3Rpb25Nb2RlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaW50ZXJhY3Rpb25Nb2RlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgYWxsIHZhcmlhYmxlcywgZGVsZXRlcyBhbGwgdGFncyAod2hlbiB2aWV3ZXIgaXMgcmVtb3ZlciBvciBtb2RlbCBjaGFuZ2VkPXJlbG9hZCBuZWVkZWQpXHJcbiAgICovXHJcbiAgYXN5bmMgY2xlYXJBbGwoKSB7XHJcbiAgICBjb25zb2xlLmxvZygncmVtb3Zpbmcgdmlld2VyJyk7XHJcbiAgICBhd2FpdCB0aGlzLmFjdGlvbl9kZWxldGVfYWxsX21hdHRlcnRhZ3MoKTtcclxuICAgIHRoaXMuZmxvb3JzID0gbnVsbDtcclxuICAgIHRoaXMuc3dlZXBzID0gbnVsbDtcclxuICAgIHRoaXMuc2RrID0gbnVsbDtcclxuXHJcbiAgICB0aGlzLnBvaW50ZXJTZXJ2aWNlLmNsZWFyKHtcclxuICAgICAgb25MZWZ0Q2xpY2s6IHRoaXMucG9pbnRlckxlZnRDbGlja0hhbmRsZXIuYmluZCh0aGlzKSxcclxuICAgICAgb25SaWdodENsaWNrOiB0aGlzLnBvaW50ZXJSaWdodENsaWNrSGFuZGxlci5iaW5kKHRoaXMpLFxyXG4gICAgICBvbk1pZGRsZUNsaWNrOiB0aGlzLnBvaW50ZXJNaWRkbGVDbGlja0hhbmRsZXIuYmluZCh0aGlzKSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZm9yYmlkZGVuU3dlZXBzID0gW107XHJcbiAgfVxyXG5cclxuICBhc3luYyByZW1vdmVGb3JiaWRkZW5Td2VlcHMoZm9yYmlkZGVuU3dlZXBzOiBzdHJpbmdbXSkge1xyXG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UucmVtb3ZlRm9yYmlkZGVuU3dlZXBzKHRoaXMuc2RrLCBmb3JiaWRkZW5Td2VlcHMpO1xyXG4gIH1cclxuXHJcbiAgLy9cclxuICAvLyAtLS0tLS0tLS0tIDNEIG9iamVjdHMgKFNESyBCdW5kbGUgb25seSkgLS0tLS0tLS0tLVxyXG4gIC8vXHJcbiAgYXN5bmMgaW5pdDNET2JqZWN0Vmlld2VyKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmluaXQzRE9iamVjdFZpZXdlcih0aGlzLnNkayk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBhZGQzRE9iamVjdChcclxuICAgIG9iajogSU9iamVjdDNELFxyXG4gICAgbW9kZT86ICd0cmFuc2xhdGUnIHwgJ3JvdGF0ZSdcclxuICApOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmFkZDNET2JqZWN0KHRoaXMuc2RrLCBvYmosIG1vZGUpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlT2JqZWN0VmlzaWJpbGl0eShvYmplY3RJZDogYW55KSB7XHJcbiAgICB0aGlzLm9iamVjdDNEU2VydmljZS50b2dnbGVPYmplY3RWaXNpYmlsaXR5KG9iamVjdElkKTtcclxuICB9XHJcblxyXG4gIGlzT2JqZWN0VmlzaWJsZShvYmplY3RJZDogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UuaXNPYmplY3RWaXNpYmxlKG9iamVjdElkKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHBvaW50Q2FtZXJhVG8zRE9iamVjdChvYmplY3RJZDogYW55KSB7XHJcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UucG9pbnRDYW1lcmFUbzNET2JqZWN0KFxyXG4gICAgICB0aGlzLnNkayxcclxuICAgICAgb2JqZWN0SWQsXHJcbiAgICAgIHRoaXMuY3JlYXRlTWF0dGVydGFnRnJvbVBPSS5iaW5kKHRoaXMpLFxyXG4gICAgICB0aGlzLmdvVG9UYWcuYmluZCh0aGlzKSxcclxuICAgICAgdGhpcy5kZWxldGVMYXN0TWF0dGVydGFnLmJpbmQodGhpcyksXHJcbiAgICAgIHRoaXMuZ2V0VGFnRnJvbUVsZW1lbnRJZC5iaW5kKHRoaXMpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2NlbmVOb2RlRnJvbU9iamVjdDNESWQodXVpZDogc3RyaW5nKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5nZXRTY2VuZU5vZGVGcm9tT2JqZWN0M0RJZCh1dWlkKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGRpc3BsYXlBemltdXRhbENyb3duKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmRpc3BsYXlBemltdXRhbENyb3duKHRoaXMucG9zZUNhbWVyYSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBhdHRhY2hHaXptb0NvbnRyb2xUbzNET2JqZWN0KFxyXG4gICAgbW9kZWxOb2RlOiBhbnksXHJcbiAgICBzY2VuZU9iamVjdDogYW55LFxyXG4gICAgbW9kZTogJ3RyYW5zbGF0ZScgfCAncm90YXRlJyB8ICdzY2FsZScsXHJcbiAgICB2aXNpYmxlOiBib29sZWFuLFxyXG4gICAgaXNOZXdPYmplY3Q6IGJvb2xlYW5cclxuICApOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmF0dGFjaEdpem1vQ29udHJvbFRvM0RPYmplY3QodGhpcy5zZGssIG1vZGVsTm9kZSwgc2NlbmVPYmplY3QsIG1vZGUsIHZpc2libGUsIGlzTmV3T2JqZWN0KTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUdpem1vRnJvbUxhc3RPYmplY3QoKTogdm9pZCB7XHJcbiAgICB0aGlzLm9iamVjdDNEU2VydmljZS5yZW1vdmVHaXptb0Zyb21MYXN0T2JqZWN0KCk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVWaWV3RnJ1c3R1bSgpOiB2b2lkIHtcclxuICAgIHRoaXMub2JqZWN0M0RTZXJ2aWNlLnRvZ2dsZVZpZXdGcnVzdHVtKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
1379
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0dGVycG9ydC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy9tYXR0ZXJwb3J0LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQVUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRXhFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUNMLGVBQWUsRUFDZixJQUFJLEVBQ0wsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakQsT0FBTyxFQUVMLFdBQVcsRUFFWCxtQkFBbUIsRUFJbkIsa0JBQWtCLEVBRWxCLE9BQU8sRUFDUCxRQUFRLEVBQ1Isa0JBQWtCLEdBQ25CLE1BQU0sa0JBQWtCLENBQUM7Ozs7Ozs7Ozs7QUErQjFCLE1BQU0sT0FBTyxpQkFBaUI7SUFxT21CO0lBQ3JDO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQTVPSCxHQUFHLENBQU07SUFFUixTQUFTLENBQU07SUFFdkIsa0JBQWtCO0lBQ1YsY0FBYyxDQUFNO0lBRXJCLFVBQVUsQ0FBK0M7SUFFekQsa0JBQWtCLEdBQVEsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBRXBELGVBQWUsR0FBRyxLQUFLLENBQUM7SUFFeEIsZUFBZSxHQUFXLGtCQUFrQixDQUFDLE9BQU8sQ0FBQztJQUVyRCxVQUFVLEdBQVcsUUFBUSxDQUFDO0lBRXRDLElBQVcsWUFBWTtRQUNyQixPQUFPLElBQUksQ0FB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QUMzQyxDQUFDO3dHQTVxRFUsaUJBQWlCLGtCQW9PbEIsUUFBUSxhQUNSLGtCQUFrQjs0R0FyT2pCLGlCQUFpQixjQUZoQixNQUFNOzs0RkFFUCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFxT0ksTUFBTTsyQkFBQyxRQUFROzswQkFDZixNQUFNOzJCQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgTmdab25lLCBpc0Rldk1vZGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTUFUVEVSUE9SVF9TREtfS0VZIH0gZnJvbSAnLi4vdG9rZW5zL21hdHRlcnBvcnQtc2RrLWtleS50b2tlbic7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7XHJcbiAgcG9pVHlwZVRvU3RyaW5nLFxyXG4gIHdhaXRcclxufSBmcm9tICcuLi9oZWxwZXJzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNYXR0ZXJ0YWdEYXRhIH0gZnJvbSAnLi4vbWF0dGVydGFnRGF0YSc7XHJcbmltcG9ydCB7XHJcbiAgRGJPYmplY3RUeXBlLFxyXG4gIEZlYXR1cmVUeXBlLFxyXG4gIElPYmplY3QzRCxcclxuICBNYXR0ZXJ0YWdBY3Rpb25Nb2RlLFxyXG4gIE1hdHRlcnBvcnRTdWJzY3JpcHRpb24sXHJcbiAgTWF0dGVycG9ydFZpZXcsXHJcbiAgTWF0dGVycG9ydFZpZXdDb2xsZWN0aW9uLFxyXG4gIE1hdHRlcnBvcnRWaWV3VHlwZSxcclxuICBQT0ksXHJcbiAgUG9pVHlwZSxcclxuICBTcE1vZHVsZSxcclxuICBWaWV3ZXJJbnRlcmFjdGlvbnMsXHJcbn0gZnJvbSAnLi4vdHlwZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VUYWdTZXJ2aWNlIH0gZnJvbSAnLi90YWcuc2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VWaXNpYmlsaXR5U2VydmljZSB9IGZyb20gJy4vYmFzZVZpc2liaWxpdHkuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZyc7XHJcbmltcG9ydCB7IENhbWVyYU1vZGUgfSBmcm9tICcuLi90eXBlcy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWF0dGVycG9ydE1lYXN1cmVtZW50U2VydmljZSB9IGZyb20gJy4vbWF0dGVycG9ydC1tZWFzdXJlbWVudC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTWF0dGVycG9ydE5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9tYXR0ZXJwb3J0LW5hdmlnYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IE1hdHRlcnBvcnRQb2ludGVyU2VydmljZSB9IGZyb20gJy4vbWF0dGVycG9ydC1wb2ludGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNYXR0ZXJwb3J0T2JqZWN0M0RTZXJ2aWNlIH0gZnJvbSAnLi9tYXR0ZXJwb3J0LW9iamVjdDNkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNYXR0ZXJwb3J0VGFnU2VydmljZSB9IGZyb20gJy4vbWF0dGVycG9ydC10YWcuc2VydmljZSc7XHJcblxyXG4vKipcclxuICogQ3VzdG9tIFRocmVlanMgT2JqZWN0IDNEIGludGVyZmFjZVxyXG4gKi9cclxuaW50ZXJmYWNlIFRocmVlSlNPYmplY3QzRCB7XHJcbiAgaWQ6IHN0cmluZztcclxuICB1dWlkPzogc3RyaW5nO1xyXG4gIHBvc2l0aW9uPzogeyB4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyIH1cclxuICByb3RhdGlvbj86IHsgeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlciB9XHJcbiAgc2NhbGU/OiB7IHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIgfVxyXG59XHJcblxyXG5kZWNsYXJlIGdsb2JhbCB7XHJcbiAgaW50ZXJmYWNlIFdpbmRvdyB7XHJcbiAgICBNUF9TREs6IHsgY29ubmVjdDogRnVuY3Rpb24gfTtcclxuICB9XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYXR0ZXJwb3J0U2VydmljZSB7XHJcblxyXG4gIHB1YmxpYyBzZGs6IGFueTtcclxuXHJcbiAgcHJpdmF0ZSBjb250YWluZXI6IGFueTtcclxuXHJcbiAgLy8gUG9zaXRpb24gY2FtZXJhXHJcbiAgcHJpdmF0ZSBwb3NlTWF0dGVycG9ydDogYW55O1xyXG5cclxuICBwdWJsaWMgcG9zZUNhbWVyYTogeyByb3RhdGlvbjogYW55OyBwb3NpdGlvbjogYW55OyBzd2VlcDogYW55IH07XHJcblxyXG4gIHB1YmxpYyBsYXN0Q2FtZXJhUG9zaXRpb246IGFueSA9IHsgeDogMC4wLCB5OiAwLjAsIHo6IDAuMCB9O1xyXG5cclxuICBwcml2YXRlIGlzTWVhc3VyZU1vZGVPbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIGludGVyYWN0aW9uTW9kZTogbnVtYmVyID0gVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFQ7XHJcblxyXG4gIHByaXZhdGUgY2FtZXJhTW9kZTogc3RyaW5nID0gJ0lOU0lERSc7XHJcblxyXG4gIHB1YmxpYyBnZXQgbWF0dGVydGFnSURzKCk6IEFycmF5PHN0cmluZz4ge1xyXG4gICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UubWF0dGVydGFnSURzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBtYXR0ZXJ0YWdJRHModmFsdWU6IEFycmF5PHN0cmluZz4pIHtcclxuICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UubWF0dGVydGFnSURzID0gdmFsdWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGRpY3Rpb25uYXJ5VGFncygpOiBNYXA8c3RyaW5nLCBNYXR0ZXJ0YWdEYXRhPiB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5kaWN0aW9ubmFyeVRhZ3M7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGRpY3Rpb25uYXJ5T2JqZWN0czNEKCk6IE1hcDxzdHJpbmcsIGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmRpY3Rpb25uYXJ5T2JqZWN0czNEO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBkaWN0aW9ubmFyeVNjZW5lT2JqZWN0czNEKCk6IE1hcDxzdHJpbmcsIGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmRpY3Rpb25uYXJ5U2NlbmVPYmplY3RzM0Q7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IHRocmVlSlNTY2VuZSgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLnRocmVlSlNTY2VuZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgdGhyZWVKU1NjZW5lKHZhbHVlOiBhbnkpIHtcclxuICAgIHRoaXMub2JqZWN0M0RTZXJ2aWNlLnRocmVlSlNTY2VuZSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBhemltdXRoYWxDcm93bigpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmF6aW11dGhhbENyb3duO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBhemltdXRoYWxDcm93bih2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLm9iamVjdDNEU2VydmljZS5hemltdXRoYWxDcm93biA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCB0YWdzQXR0YWNobWVudHMoKTogT2JqZWN0IHtcclxuICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLnRhZ3NBdHRhY2htZW50cztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgc3dlZXBzKCk6IEFycmF5PHN0cmluZz4gfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnN3ZWVwcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgc3dlZXBzKHZhbHVlOiBBcnJheTxzdHJpbmc+IHwgbnVsbCkge1xyXG4gICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5zd2VlcHMgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgc3dlZXBDb2xsZWN0aW9uKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5zd2VlcENvbGxlY3Rpb247XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHN3ZWVwQ29sbGVjdGlvbih2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnN3ZWVwQ29sbGVjdGlvbiA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjdXJyZW50U3dlZXAoKTogU3ViamVjdDxzdHJpbmc+IHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRTd2VlcDtcclxuICB9XHJcblxyXG4gIC8vY2FtZXJhIHBvc2l0aW9uIHdpdGggcm90YXRpb25cclxuICBwdWJsaWMgY3VycmVudENhbWVyYVBvc2U6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gIHB1YmxpYyBnZXQgZmxvb3JzKCk6IEFycmF5PHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBzZXF1ZW5jZTogbnVtYmVyIH0+IHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5mbG9vcnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGZsb29ycyh2YWx1ZTogQXJyYXk8eyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IHNlcXVlbmNlOiBudW1iZXIgfT4gfCBudWxsKSB7XHJcbiAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmZsb29ycyA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY3VycmVudFNwYWNlSUQ6IHN0cmluZztcclxuXHJcbiAgcHVibGljIGdldCBsYXN0T2JqZWN0M0QoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5sYXN0T2JqZWN0M0Q7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGxhc3RPYmplY3QzRCh2YWx1ZTogYW55KSB7XHJcbiAgICB0aGlzLm9iamVjdDNEU2VydmljZS5sYXN0T2JqZWN0M0QgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudFJvb21zKCk6IGFueVtdIHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRSb29tcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgY3VycmVudFJvb21zKHZhbHVlOiBhbnlbXSkge1xyXG4gICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Um9vbXMgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudFNwYWNlSUQoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50U3BhY2VJRDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgY3VycmVudFNwYWNlSUQodmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5fY3VycmVudFNwYWNlSUQgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgZm9yYmlkZGVuU3dlZXBzKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmZvcmJpZGRlblN3ZWVwcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgZm9yYmlkZGVuU3dlZXBzKHZhbHVlOiBzdHJpbmdbXSkge1xyXG4gICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5mb3JiaWRkZW5Td2VlcHMgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0YWdBY3Rpb246IFN1YmplY3Q8eyBhY3Rpb246IHN0cmluZzsgZGF0YTogc3RyaW5nIH0+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgLyoqIFZpZXdzIChmdXJuaXNoZWQsIGRlZnVybmlzaGVkLi4uKSBleHBvc2VkIGJ5IHRoZSBTREsgZm9yIHRoZSBjdXJyZW50IHNwYWNlLiAqL1xyXG4gIHByaXZhdGUgdmlld3NCeVR5cGU6IE1hcDxNYXR0ZXJwb3J0Vmlld1R5cGUsIE1hdHRlcnBvcnRWaWV3PiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgcHJpdmF0ZSBjdXJyZW50VmlldzogTWF0dGVycG9ydFZpZXcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSB2aWV3U3Vic2NyaXB0aW9uczogTWF0dGVycG9ydFN1YnNjcmlwdGlvbltdID0gW107XHJcblxyXG4gIC8qKiBFbWl0cyB0aGUgYWN0aXZlIHZpZXcgZXZlcnkgdGltZSB0aGUgdXNlciBzd2l0Y2hlcyBiZXR3ZWVuIGZ1cm5pc2hlZC9kZWZ1cm5pc2hlZC4gKi9cclxuICBwdWJsaWMgb25WaWV3Q2hhbmdlZDogU3ViamVjdDxNYXR0ZXJwb3J0VmlldyB8IG51bGw+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgLyoqIERlbGF5IGxlZnQgdG8gdGhlIFNESyB0byByZWJ1aWxkIHRoZSBsYXllcidzIHRhZ3MgYWZ0ZXIgYSB2aWV3IHN3aXRjaC4gKi9cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBWSUVXX1NXSVRDSF9SRUZSRVNIX0RFTEFZX01TID0gODAwO1xyXG5cclxuICBwcml2YXRlIHZpZXdTd2l0Y2hSZXN0b3JlVGltZXI6IGFueSA9IG51bGw7XHJcblxyXG4gIHB1YmxpYyBnZXQgbWF0dGVydGFnVG9Gb2xsb3coKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5tYXR0ZXJ0YWdUb0ZvbGxvdztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgbWF0dGVydGFnVG9Gb2xsb3codmFsdWU6IHN0cmluZyB8IG51bGwpIHtcclxuICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UubWF0dGVydGFnVG9Gb2xsb3cgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgaW5UcmFuc2l0aW9uTW9kZSgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmluVHJhbnNpdGlvbk1vZGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGluVHJhbnNpdGlvbk1vZGUodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuaW5UcmFuc2l0aW9uTW9kZSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBpblRyYW5zaXRpb25Td2VlcCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmluVHJhbnNpdGlvblN3ZWVwO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBpblRyYW5zaXRpb25Td2VlcCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5pblRyYW5zaXRpb25Td2VlcCA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBub0xpZ2h0Rm9yT2JqZWN0cyA9IHRydWU7XHJcblxyXG4gIHB1YmxpYyBnZXQgY3VycmVudENhbWVyYU1vZGUoKTogQ2FtZXJhTW9kZSB7XHJcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Q2FtZXJhTW9kZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgY3VycmVudENhbWVyYU1vZGUodmFsdWU6IENhbWVyYU1vZGUpIHtcclxuICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudENhbWVyYU1vZGUgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgb25DYW1lcmFNb2RlQ2hhbmdlZCgpOiBTdWJqZWN0PENhbWVyYU1vZGU+IHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLm9uQ2FtZXJhTW9kZUNoYW5nZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IG9uUm9vbUNoYW5nZWQoKTogU3ViamVjdDxhbnlbXT4ge1xyXG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2Uub25Sb29tQ2hhbmdlZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgb25Hb1RvVGFnKCk6IFN1YmplY3Q8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5vbkdvVG9UYWc7XHJcbiAgfVxyXG5cclxuICB0YWdTZXJ2aWNlOiBCYXNlVGFnU2VydmljZTtcclxuXHJcbiAgY29uZmlnOiBDb25maWc7XHJcblxyXG4gIFNQTW9kdWxlOiBTcE1vZHVsZTtcclxuXHJcbiAgcHVibGljIGdldCBvYmplY3RDb250cm9sKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2Uub2JqZWN0Q29udHJvbDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgc2VjdXJpdHlDYW1lcmFBbmltYXRvcigpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLnNlY3VyaXR5Q2FtZXJhQW5pbWF0b3I7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBY3Rpb25zIG9uIGxlZnQgY2xpY2sgd2hlbiBwb3NpdGlvbmluZyBtYXR0ZXJ0YWcgaW4gdmlzaXRcclxuICAgKi9cclxuICBwb2ludGVyTGVmdENsaWNrSGFuZGxlciA9IChldnQ6IE1vdXNlRXZlbnQpID0+IHtcclxuICAgIGlmICh0aGlzLm1hdHRlcnRhZ1RvRm9sbG93KSB7XHJcbiAgICAgIGNvbnN0IG1hdHRlcnRhZ0RhdGEgPSB0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQodGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdyk7XHJcbiAgICAgIGlmIChtYXR0ZXJ0YWdEYXRhKSB7XHJcbiAgICAgICAgbWF0dGVydGFnRGF0YS5zZXRQb3NpdGlvbih7IC4uLnRoaXMucG9zZU1hdHRlcnBvcnQucG9zaXRpb24gfSk7XHJcbiAgICAgICAgbWF0dGVydGFnRGF0YS5zZXROb3JtYWwoeyAuLi50aGlzLnBvc2VNYXR0ZXJwb3J0Lm5vcm1hbCB9KTtcclxuICAgICAgICB0aGlzLmRpY3Rpb25uYXJ5VGFncy5zZXQodGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdywgbWF0dGVydGFnRGF0YSk7XHJcbiAgICAgICAgdGhpcy51cGRhdGVNYXR0ZXJUYWdDb250ZW50Rm9yVGFnSUQodGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMub25WYWxpZGF0ZWRNYXR0ZXJ0YWcoKTtcclxuICB9O1xyXG5cclxuICBwb2ludGVyUmlnaHRDbGlja0hhbmRsZXIgPSAoZSkgPT4ge1xyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgdGhpcy5jYW5jZWxGb2xsb3dpbmdDdXJzb3IoKTtcclxuICAgIGFsZXJ0KCdhY3Rpb24gY2FuY2VsbGVkJyk7XHJcbiAgfTtcclxuXHJcbiAgcG9pbnRlck1pZGRsZUNsaWNrSGFuZGxlciA9IChlKSA9PiB7XHJcbiAgICB0aGlzLnBvaW50ZXJTZXJ2aWNlLnVwZGF0ZUN1cnNvckRpc3BsYXkodGhpcy5wb3NlTWF0dGVycG9ydCk7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBJbmplY3QoJ2NvbmZpZycpIGNvbmZpZzogQ29uZmlnLFxyXG4gICAgQEluamVjdChNQVRURVJQT1JUX1NES19LRVkpIHByaXZhdGUgcmVhZG9ubHkgc2RrS2V5OiBzdHJpbmcsXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBhY3RpdmVSb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIHZpc2liaWxpdHlTZXJ2aWNlOiBCYXNlVmlzaWJpbGl0eVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxyXG4gICAgcHJpdmF0ZSBtZWFzdXJlbWVudFNlcnZpY2U6IE1hdHRlcnBvcnRNZWFzdXJlbWVudFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG5hdmlnYXRpb25TZXJ2aWNlOiBNYXR0ZXJwb3J0TmF2aWdhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHBvaW50ZXJTZXJ2aWNlOiBNYXR0ZXJwb3J0UG9pbnRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG9iamVjdDNEU2VydmljZTogTWF0dGVycG9ydE9iamVjdDNEU2VydmljZSxcclxuICAgIHByaXZhdGUgbWF0dGVycG9ydFRhZ1NlcnZpY2U6IE1hdHRlcnBvcnRUYWdTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluaXRpYWxpemVzIHRoZSBNYXR0ZXJwb3J0IFNESywgc2V0cyB1cCBldmVudCBsaXN0ZW5lcnMsIGFuZCBjb25maWd1cmVzIGFzc2V0cy5cclxuICAgKiBAcGFyYW0gdGFnU2VydmljZSBTZXJ2aWNlIHVzZWQgdG8gZ2VuZXJhdGUgYW5kIGluamVjdCBIVE1MIGludG8gdGFncy5cclxuICAgKiBAcGFyYW0gbW9kdWxlIEFwcGxpY2F0aW9uIG1vZHVsZSAoZS5nLiwgSU1NTywgTVVTRVVNKSB0byBlbmFibGUgc3BlY2lmaWMgZmVhdHVyZXMuXHJcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdHJ1ZSB3aGVuIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlLlxyXG4gICAqL1xyXG4gIGFzeW5jIGluaXRTZGsoXHJcbiAgICB0YWdTZXJ2aWNlOiBCYXNlVGFnU2VydmljZSxcclxuICAgIG1vZHVsZTogU3BNb2R1bGUgPSBTcE1vZHVsZS5JTU1PXHJcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICBpZiAodGhpcy5zZGspIHtcclxuICAgICAgLy8gY2xlYW4gaWYgc2RrIGlzIHJ1bm5pbmcgYWxyZWFkeVxyXG4gICAgICBhd2FpdCB0aGlzLmFjdGlvbl9kZWxldGVfYWxsX21hdHRlcnRhZ3MoKTtcclxuICAgIH1cclxuICAgIHRoaXMudGFnU2VydmljZSA9IHRhZ1NlcnZpY2U7XHJcbiAgICB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLnNldFRhZ1NlcnZpY2UodGFnU2VydmljZSk7XHJcbiAgICB0aGlzLlNQTW9kdWxlID0gbW9kdWxlO1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgLy8gUmV0cmlldmUgRE9NIGVsZW1lbnRzXHJcbiAgICAgIGNvbnN0IHBvaW50ZXJCdG4gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxyXG4gICAgICAgICcjdmlld2VyLXBvaW50ZXItdHJpY2snXHJcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgIHRoaXMuY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3ZpZXdlci1tb2R1bGUnKSBhcyBIVE1MRWxlbWVudDtcclxuICAgICAgY29uc3QgaWZyYW1lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcclxuICAgICAgICAnI3ZpZXdlci1tb2R1bGUnXHJcbiAgICAgICkgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XHJcbiAgICAgIGlmICghaWZyYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGN1cnNvckJ0biA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICAgJyNidXR0b24nXHJcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgIGNvbnN0IHRleHRQYW5lbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXHJcbiAgICAgICAgJyN0ZXh0J1xyXG4gICAgICApIGFzIEhUTUxFbGVtZW50O1xyXG5cclxuICAgICAgdGhpcy5wb2ludGVyU2VydmljZS5pbml0KHRoaXMuY29udGFpbmVyLCBwb2ludGVyQnRuLCBjdXJzb3JCdG4sIHRleHRQYW5lbCwge1xyXG4gICAgICAgIG9uTGVmdENsaWNrOiB0aGlzLnBvaW50ZXJMZWZ0Q2xpY2tIYW5kbGVyLmJpbmQodGhpcyksXHJcbiAgICAgICAgb25SaWdodENsaWNrOiB0aGlzLnBvaW50ZXJSaWdodENsaWNrSGFuZGxlci5iaW5kKHRoaXMpLFxyXG4gICAgICAgIG9uTWlkZGxlQ2xpY2s6IHRoaXMucG9pbnRlck1pZGRsZUNsaWNrSGFuZGxlci5iaW5kKHRoaXMpLFxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIC8vIExvYWQgU0RLXHJcbiAgICAgIGNvbnN0IHNob3djYXNlV2luZG93ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3c7XHJcbiAgICAgIGlmcmFtZS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICB0aGlzLnNkayA9IGF3YWl0IChzaG93Y2FzZVdpbmRvdyBhcyBhbnkpLk1QX1NESy5jb25uZWN0KFxyXG4gICAgICAgICAgICBzaG93Y2FzZVdpbmRvdyxcclxuICAgICAgICAgICAgdGhpcy5zZGtLZXksXHJcbiAgICAgICAgICAgICcnXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYWRkQ3VzdG9tQ3NzKCk7XHJcblxyXG4gICAgICAgIHRoaXMucG9pbnRlclNlcnZpY2Uuc3RhcnRBZG1pbkN1cnNvclRyYWNrZXIoXHJcbiAgICAgICAgICB0aGlzLnNkayxcclxuICAgICAgICAgIHRoaXMuY29udGFpbmVyLFxyXG4gICAgICAgICAgKCkgPT4gdGhpcy5wb3NlTWF0dGVycG9ydCxcclxuICAgICAgICAgICgpID0+IHRoaXMucG9zZUNhbWVyYVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIExvYWQgTWF0dGVydGFnIGljb25zIGFuZCBjdXN0b20gc3Vic2NyaXB0aW9uc1xyXG4gICAgICAgIHN3aXRjaCAobW9kdWxlKSB7XHJcbiAgICAgICAgICBjYXNlIFNwTW9kdWxlLklNTU86XHJcbiAgICAgICAgICAgIHRoaXMuc2RrLkFzc2V0LnJlZ2lzdGVyVGV4dHVyZShcclxuICAgICAgICAgICAgICAnaWNvbi10aWNrZXQnLFxyXG4gICAgICAgICAgICAgIHRoaXMuY29uZmlnLm15X2NvbmZpZy5pY29uX3RpY2tldFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLnNkay5Bc3NldC5yZWdpc3RlclRleHR1cmUoXHJcbiAgICAgICAgICAgICAgJ2ljb24tZXF1aXBtZW50JyxcclxuICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5teV9jb25maWcuaWNvbl9lcXVpcG1lbnRcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5zZGsuQXNzZXQucmVnaXN0ZXJUZXh0dXJlKFxyXG4gICAgICAgICAgICAgICdpY29uLW1lYXN1cmUnLFxyXG4gICAgICAgICAgICAgIHRoaXMuY29uZmlnLm15X2NvbmZpZy5pY29uX21lYXN1cmVcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5zZGsuQXNzZXQucmVnaXN0ZXJUZXh0dXJlKFxyXG4gICAgICAgICAgICAgICdpY29uLWRhdGEnLFxyXG4gICAgICAgICAgICAgIHRoaXMuY29uZmlnLm15X2NvbmZpZy5pY29uX2RhdGFcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5zZGsuQXNzZXQucmVnaXN0ZXJUZXh0dXJlKFxyXG4gICAgICAgICAgICAgICdpY29uLW9iamVjdDNkJyxcclxuICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5teV9jb25maWcuaWNvbl9vYmplY3QzZFxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZGsuTWVhc3VyZW1lbnRzLmRhdGEuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICBvbkFkZGVkOiBmdW5jdGlvbiAoXHJcbiAgICAgICAgICAgICAgICBpbmRleDogYW55LFxyXG4gICAgICAgICAgICAgICAgaXRlbTogeyBwb2ludHM6IGFueSB9LFxyXG4gICAgICAgICAgICAgICAgY29sbGVjdGlvbjogYW55XHJcbiAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lYXN1cmVtZW50U2VydmljZS5zZXRMYXN0TWVhc3VyZShpdGVtLnBvaW50cyk7XHJcbiAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICAgIG9uQ29sbGVjdGlvblVwZGF0ZWQ6IGZ1bmN0aW9uIChjb2xsZWN0aW9uOiBhbnkpIHtcclxuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCd0aGUgZW50aXJlIHVwLXRvLWRhdGUgY29sbGVjdGlvbicsIGNvbGxlY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tZWFzdXJlbWVudFNlcnZpY2UuZ2V0RGlzdGFuY2VGb3JMYXN0TWVhc3VyZW1lbnQodGhpcy5zZGssIHRoaXMuY3VycmVudFNwYWNlSUQpO1xyXG4gICAgICAgICAgICAgIH0uYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuc2RrLk1lYXN1cmVtZW50cy5tb2RlLnN1YnNjcmliZShcclxuICAgICAgICAgICAgICBmdW5jdGlvbiAobWVhc3VyZW1lbnRNb2RlU3RhdGU6IHsgYWN0aXZlOiBhbnkgfSkge1xyXG4gICAgICAgICAgICAgICAgLy8gbWVhc3VyZW1lbnQgbW9kZSBzdGF0ZSBoYXMgY2hhbmdlZFxyXG4gICAgICAgICAgICAgICAgdGhpcy5pc01lYXN1cmVNb2RlT24gPSBtZWFzdXJlbWVudE1vZGVTdGF0ZS5hY3RpdmU7XHJcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnSXMgbWVhc3VyZW1lbnQgbW9kZSBjdXJyZW50bHkgYWN0aXZlPyAnLCBtZWFzdXJlbWVudE1vZGVTdGF0ZS5hY3RpdmUpO1xyXG4gICAgICAgICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgU3BNb2R1bGUuTVVTRVVNOlxyXG4gICAgICAgICAgICB0aGlzLnNkay5Bc3NldC5yZWdpc3RlclRleHR1cmUoXHJcbiAgICAgICAgICAgICAgJ2ljb24tZGF0YScsXHJcbiAgICAgICAgICAgICAgdGhpcy5jb25maWcubXlfY29uZmlnLmljb25fZGF0YVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGNhc2UgU3BNb2R1bGUuSE9URUw6XHJcbiAgICAgICAgICAgIHRoaXMuc2RrLkFzc2V0LnJlZ2lzdGVyVGV4dHVyZShcclxuICAgICAgICAgICAgICAnaWNvbl9yb29tX2F2YWlsYWJsZScsXHJcbiAgICAgICAgICAgICAgdGhpcy5jb25maWcubXlfY29uZmlnLmljb25fcm9vbV9hdmFpbGFibGVcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5zZGsuQXNzZXQucmVnaXN0ZXJUZXh0dXJlKFxyXG4gICAgICAgICAgICAgICdpY29uX3Jvb21fdW5hdmFpbGFibGUnLFxyXG4gICAgICAgICAgICAgIHRoaXMuY29uZmlnLm15X2NvbmZpZy5pY29uX3Jvb21fdW5hdmFpbGFibGVcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5zZGsuQXNzZXQucmVnaXN0ZXJUZXh0dXJlKFxyXG4gICAgICAgICAgICAgICdpY29uX3Jvb21fY2hvc2VuJyxcclxuICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5teV9jb25maWcuaWNvbl9yb29tX2Nob3NlblxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB0aGlzLnNkay5Bc3NldC5yZWdpc3RlclRleHR1cmUoXHJcbiAgICAgICAgICAgICAgJ2ljb25fcm9vbV92aWV3ZWQnLFxyXG4gICAgICAgICAgICAgIHRoaXMuY29uZmlnLm15X2NvbmZpZy5pY29uX3Jvb21fdmlld2VkXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNkay5Bc3NldC5yZWdpc3RlclRleHR1cmUoJ2ljb24tcG9zaXRpb24nLCB0aGlzLmNvbmZpZy5teV9jb25maWcuaWNvbl9wb3NpdGlvbilcclxuICAgICAgICAgIC5jYXRjaCgoZTogYW55KSA9PiB7IGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdpY29uLXBvc2l0aW9uIHRleHR1cmUgcmVnaXN0cmF0aW9uIGZhaWxlZCcsIGUpOyB9KTtcclxuXHJcbiAgICAgICAgLy8gQ3VycmVudCBSb29tICh1c2VkIGZvciBnZXR0aW5nIGJvdW5kaW5nIGJveCBhbmQgZXZlbnR1YWxseSBsYXp5IGxvYWQgbWF0dGVydGFnIG9yIG9iamVjdDNEIGluc2lkZSBjdXJyZW50IFJvb20pXHJcbiAgICAgICAgdGhpcy5zZGsuUm9vbS5jdXJyZW50LnN1YnNjcmliZSgoY3VycmVudFJvb20pID0+IHtcclxuICAgICAgICAgIGNvbnN0IHJvb21zID0gQXJyYXkuaXNBcnJheShjdXJyZW50Um9vbSkgPyBjdXJyZW50Um9vbSA6IChjdXJyZW50Um9vbSA/IFtjdXJyZW50Um9vbV0gOiBbXSk7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRSb29tcyA9IHJvb21zO1xyXG4gICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5vblJvb21DaGFuZ2VkLm5leHQocm9vbXMpO1xyXG4gICAgICAgICAgLy8gUmVmcmVzaCB0YWcgdmlzaWJpbGl0eSB3aGVuZXZlciB0aGUgcm9vbSBjb250ZXh0IGNoYW5nZXNcclxuICAgICAgICAgIHRoaXMucmVmcmVzaFRhZ3NWaXNpYmlsaXR5KCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIC8vIDNEIHBvc2l0aW9uJ3MgcG9pbnRlclxyXG4gICAgICAgIHRoaXMuc2RrLlBvaW50ZXIuaW50ZXJzZWN0aW9uLnN1YnNjcmliZShcclxuICAgICAgICAgIGZ1bmN0aW9uIChpbnRlcnNlY3Rpb246IGFueSkge1xyXG4gICAgICAgICAgICB0aGlzLnBvc2VNYXR0ZXJwb3J0ID0gaW50ZXJzZWN0aW9uO1xyXG4gICAgICAgICAgICB0aGlzLnBvc2VNYXR0ZXJwb3J0LnRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLm9sZFBvc2VNYXR0ZXJwb3J0UG9zaXRpb24pIHtcclxuICAgICAgICAgICAgICB0aGlzLm9sZFBvc2VNYXR0ZXJwb3J0UG9zaXRpb24gPSB7XHJcbiAgICAgICAgICAgICAgICB4OiAwLFxyXG4gICAgICAgICAgICAgICAgeTogMCxcclxuICAgICAgICAgICAgICAgIHo6IDAsXHJcbiAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJhY3Rpb25Nb2RlICE9PSBWaWV3ZXJJbnRlcmFjdGlvbnMuREVGQVVMVCAmJiB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93KSB7XHJcbiAgICAgICAgICAgICAgLy8gZm9sbG93IHRoZSBwb2ludGVyIGFuZCBjaGFuZ2VzIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGFzdCB0YWdcclxuICAgICAgICAgICAgICAvLyAod2UgYXJlIGFib3V0IHRvIHZhbGlkYXRlLCBidXQgaXQgZXhpc3RzIGluIHNkayBhbHJlYWR5KVxyXG4gICAgICAgICAgICAgIHRoaXMuZW5hYmxlX2ZvbGxvd2luZ190YWcodGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBvaW50ZXJTZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5wb2ludGVyU2VydmljZS5zZXRDdXJzb3JQb3NpdGlvbkJ1dHRvbkRpc3BsYXllZChmYWxzZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vQ2FtZXJhIG1vZGVcclxuICAgICAgICB0aGlzLnNkay5Nb2RlLmN1cnJlbnQuc3Vic2NyaWJlKChtb2RlKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5jYW1lcmFNb2RlICE9PSBtb2RlKSB7XHJcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2Uuc2V0Q2FtZXJhTW9kZShtb2RlKTtcclxuICAgICAgICAgICAgLy8gUmVmcmVzaCB0YWcgdmlzaWJpbGl0eSBvbiBldmVyeSBtb2RlIGNoYW5nZSAoSU5TSURFIHZzIERPTExIT1VTRSB2cyBGTE9PUlBMQU4pXHJcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaFRhZ3NWaXNpYmlsaXR5KCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FtZXJhTW9kZSA9IG1vZGU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2RrICYmIHRoaXMucG9zZUNhbWVyYSkge1xyXG4gICAgICAgICAgICB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLnVwZGF0ZVRhZ3NWaXNpYmlsaXR5Rm9yQ29udGV4dChcclxuICAgICAgICAgICAgICB0aGlzLnNkayxcclxuICAgICAgICAgICAgICB0aGlzLnN3ZWVwQ29sbGVjdGlvbixcclxuICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRDYW1lcmFNb2RlLFxyXG4gICAgICAgICAgICAgIHRoaXMubWF0dGVydGFnVG9Gb2xsb3csXHJcbiAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Rmxvb3JTZXF1ZW5jZSxcclxuICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRSb29tc1xyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIDEwMDApO1xyXG5cclxuICAgICAgICAvLyBzdWJzY3JpYmUgdG8gc3dlZXBzXHJcbiAgICAgICAgdGhpcy5zZGsuU3dlZXAuZGF0YS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgb25Db2xsZWN0aW9uVXBkYXRlZDogZnVuY3Rpb24gc3Vic2NyKGNvbGxlY3Rpb246IHt9KSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3dlZXBzID0gT2JqZWN0LmtleXMoY29sbGVjdGlvbik7XHJcbiAgICAgICAgICAgIHRoaXMuc3dlZXBDb2xsZWN0aW9uID0gY29sbGVjdGlvbjtcclxuICAgICAgICAgICAgLy8gUmVidWlsZCBzaWQg4oaUIHV1aWQgbWFwcyB3aGVuZXZlciB0aGUgY29sbGVjdGlvbiB1cGRhdGVzXHJcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuYnVpbGRTd2VlcElkTWFwcyhjb2xsZWN0aW9uKTtcclxuICAgICAgICAgIH0uYmluZCh0aGlzKSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gc3Vic2NyaWJlIHRvIGN1cnJlbnQgc3dlZXAg4oCTIGVtaXQgdXVpZCAoREIgZm9ybWF0KSBpbnN0ZWFkIG9mIHJhdyBzaWRcclxuICAgICAgICB0aGlzLnNkay5Td2VlcC5jdXJyZW50LnN1YnNjcmliZShcclxuICAgICAgICAgIGZ1bmN0aW9uIHN1YnNjcihjdXJyZW50U3dlZXA6IHsgc2lkOiBzdHJpbmcgfSkge1xyXG4gICAgICAgICAgICBpZiAoY3VycmVudFN3ZWVwLnNpZCA9PT0gJycpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3QgdXVpZCA9IHRoaXMubmF2aWdhdGlvblNlcnZpY2UucmVzb2x2ZVN3ZWVwVXVpZChjdXJyZW50U3dlZXAuc2lkKTtcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3dlZXAubmV4dCh1dWlkKTtcclxuICAgICAgICAgIH0uYmluZCh0aGlzKVxyXG4gICAgICAgICk7XHJcblxyXG4gICAgICAgIC8vIFN1YnNjcmliZSB0byBGbG9vciBkYXRhXHJcbiAgICAgICAgdGhpcy5zZGsuRmxvb3IuZGF0YS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgb25Db2xsZWN0aW9uVXBkYXRlZDogZnVuY3Rpb24gdXBkKHRoaXM6IGFueSwgY29sbGVjdGlvbjogYW55KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZmxvb3JzID0gT2JqZWN0LnZhbHVlcyhjb2xsZWN0aW9uKTtcclxuICAgICAgICAgIH0uYmluZCh0aGlzKSxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gU3Vic2NyaWJlIHRvIGN1cnJlbnQgZmxvb3Ig4oCTIGF1dGhvcml0YXRpdmUgc291cmNlIGZvciBtdWx0aS1mbG9vciBmaWx0ZXJpbmdcclxuICAgICAgICB0aGlzLnNkay5GbG9vci5jdXJyZW50LnN1YnNjcmliZSgoY3VycmVudEZsb29yOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHNlcSA9IGN1cnJlbnRGbG9vcj8uc2VxdWVuY2UgPz8gbnVsbDtcclxuICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudEZsb29yU2VxdWVuY2UgPSBzZXE7XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ1tGbG9vci5jdXJyZW50XSBzZXF1ZW5jZSA9Jywgc2VxLCAnfCBmdWxsID0nLCBjdXJyZW50Rmxvb3IpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5yZWZyZXNoVGFnc1Zpc2liaWxpdHkoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gR2VuZXJpYyBoYW5kbGVyIGZvciB0YWcgc2VsZWN0aW9uIGV2ZW50c1xyXG4gICAgICAgIGNvbnN0IGhhbmRsZVRhZ1NlbGVjdGlvbiA9IGFzeW5jIChzaWQ6IHN0cmluZywgc291cmNlOiBzdHJpbmcsIGV2dD86IGFueSkgPT4ge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgbWF0dGVydGFnRGF0YSA9IHRoaXMuZGljdGlvbm5hcnlUYWdzLmdldChzaWQpO1xyXG4gICAgICAgICAgICBpZiAoIW1hdHRlcnRhZ0RhdGEpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3QgdXJsID0gdGFnU2VydmljZS5nZXRVcmxGb3JTZWVEZXRhaWxzKFxyXG4gICAgICAgICAgICAgIG1hdHRlcnRhZ0RhdGEuZ2V0T2JqZWN0KCksXHJcbiAgICAgICAgICAgICAgbWF0dGVydGFnRGF0YS5nZXRUeXBlKClcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgaWYgKHVybCAhPT0gJycpIHtcclxuICAgICAgICAgICAgICB0aGlzLnZpc2liaWxpdHlTZXJ2aWNlLmRldGFpbFNob3dpbmcubmV4dCh0cnVlKTtcclxuICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3VybF0pO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignQ2Fubm90IHNob3cgZGV0YWlscyBmb3IgdGFnJywgZXJyb3IpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8vIERpc2FibGUgbmF0aXZlIE1hdHRlcnBvcnQgYWN0aW9uc1xyXG4gICAgICAgIGNvbnN0IGRpc2FibGVOYXRpdmVBY3Rpb25zID0gKHNpZDogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuc2RrIHx8IHNpZCA9PT0gdGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdykgcmV0dXJuOyAvLyBpZ25vcmUgd2hlbiB3ZSBhcmUgaW4gcG9zaXRpb25pbmcgbW9kZVxyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgdGFnTW9kdWxlID0gdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5nZXRUYWdNb2R1bGUodGhpcy5zZGssIHNpZCk7XHJcbiAgICAgICAgICAgIGlmICh0YWdNb2R1bGU/LmFsbG93QWN0aW9uKSB7XHJcbiAgICAgICAgICAgICAgdGFnTW9kdWxlLmFsbG93QWN0aW9uKHNpZCwgeyBvcGVuaW5nOiB0cnVlLCBuYXZpZ2F0aW5nOiB0cnVlLCBkb2NraW5nOiBmYWxzZSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XHJcbiAgICAgICAgICAgIC8vIHNpbGVudGx5IGlnbm9yZSBhbHJlYWR5IHJlbW92ZWQgdGFnc1xyXG4gICAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkgJiYgIWU/Lm1lc3NhZ2U/LmluY2x1ZGVzKCdub3QgZm91bmQnKSkge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybignTWF0dGVycG9ydFNlcnZpY2U6IEVycm9yIGRpc2FibGluZyBhY3Rpb25zIGZvcicsIHNpZCwgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyBXYWl0IGZvciB0aGUgYXBwbGljYXRpb24gdG8gcmVhY2ggUExBWUlORyBwaGFzZVxyXG4gICAgICAgIGlmICh0aGlzLnNkay5BcHAgJiYgdGhpcy5zZGsuQXBwLnN0YXRlKSB7XHJcbiAgICAgICAgICB0aGlzLnNkay5BcHAuc3RhdGUud2FpdFVudGlsKChzOiBhbnkpID0+IHMucGhhc2UgPT09IHRoaXMuc2RrLkFwcC5QaGFzZS5QTEFZSU5HKS50aGVuKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBjb21tb24gbGF5ZXIgaG9sZGluZyBldmVyeSB0YWcgYmVmb3JlIGFueSB0YWcgaXMgYWRkZWQsIHNvIHRoYXRcclxuICAgICAgICAgICAgLy8gdGFncyBhcmUgc2hhcmVkIGJldHdlZW4gdGhlIGZ1cm5pc2hlZCBhbmQgdGhlIGRlZnVybmlzaGVkIHZpZXdzLlxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmVuc3VyZVNoYXJlZFRhZ0xheWVyKHRoaXMuc2RrKTtcclxuICAgICAgICAgICAgdGhpcy5pbml0Vmlld3MoKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2RrLkNhbWVyYS5wb3NlLnN1YnNjcmliZSgocG9zZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5wb3NlQ2FtZXJhID0gcG9zZTtcclxuICAgICAgICAgICAgICB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLnVwZGF0ZVRhZ3NWaXNpYmlsaXR5Rm9yQ29udGV4dChcclxuICAgICAgICAgICAgICAgIHRoaXMuc2RrLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5zd2VlcENvbGxlY3Rpb24sXHJcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRDYW1lcmFNb2RlLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdyxcclxuICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuY3VycmVudEZsb29yU2VxdWVuY2UsXHJcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRSb29tc1xyXG4gICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS51cGRhdGVUYWdzVmlzaWJpbGl0eUZvckNvbnRleHQoXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNkayxcclxuICAgICAgICAgICAgICAgIHRoaXMuc3dlZXBDb2xsZWN0aW9uLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Q2FtZXJhTW9kZSxcclxuICAgICAgICAgICAgICAgIHRoaXMubWF0dGVydGFnVG9Gb2xsb3csXHJcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRGbG9vclNlcXVlbmNlLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Um9vbXNcclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9LCAxNTAwKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmludGVyYWN0aW9uTW9kZSA9PT0gVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFQpIHtcclxuICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmFjdGlvbl90b29sYm94X2luc2lkZV92aWV3KHRoaXMuc2RrKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuc2RrLlRhZyAmJiB0aGlzLnNkay5UYWcuZGF0YSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2RrLlRhZy5kYXRhLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgICBvbkFkZGVkOiAoc2lkOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgICAgICAgICAgZGlzYWJsZU5hdGl2ZUFjdGlvbnMoc2lkKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBvblVwZGF0ZWQ6IChzaWQ6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBkaXNhYmxlTmF0aXZlQWN0aW9ucyhzaWQpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIG9uQ29sbGVjdGlvblVwZGF0ZWQ6IChjb2xsZWN0aW9uOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoY29sbGVjdGlvbikuZm9yRWFjaCgoc2lkKSA9PiBkaXNhYmxlTmF0aXZlQWN0aW9ucyhzaWQpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBGYWxsYmFjayBwb3VyIGwnw6l2w6luZW1lbnQgZ2xvYmFsIHRhZy5jbGlja1xyXG4gICAgICAgIHRoaXMuc2RrLm9uKCd0YWcuY2xpY2snLCAoc2lkOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgW01hdHRlcnBvcnRTZXJ2aWNlXSBzZGsub24oJ3RhZy5jbGljaycpIHJlY2VpdmVkIGZvciBzaWQ6ICR7c2lkfWApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaGFuZGxlVGFnU2VsZWN0aW9uKHNpZCwgJ2dsb2JhbC50YWcuY2xpY2snKTtcclxuICAgICAgICAgIGRpc2FibGVOYXRpdmVBY3Rpb25zKHNpZCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgLy8gUG9pbnRlciB0cmlja1xyXG4gICAgICAgIC8vIENyZWF0ZSBhIGRpdiB0aGF0IHdpbGwgYXBwZWFyIHdoZW4gdGhlIGN1cnNvciBpcyBzdGlsbFxyXG4gICAgICAgIC8vIEl0IHdpbGwgaW50ZXJjZXB0IHRoZSBjbGljayBvZiB0aGUgbW91c2UgYmVmb3JlIGl0IHRyaWdlcnJpbmcgdGhlIE1hdHRlcnBvcnQncyB0b3VyIG5hdmlnYXRpb25cclxuICAgICAgICB0aGlzLnBvaW50ZXJTZXJ2aWNlLnN0YXJ0UG9pbnRlclRyaWNrKFxyXG4gICAgICAgICAgdGhpcy5zZGssXHJcbiAgICAgICAgICB0aGlzLmNvbnRhaW5lcixcclxuICAgICAgICAgICgpID0+IHRoaXMucG9zZU1hdHRlcnBvcnQsXHJcbiAgICAgICAgICAoKSA9PiB0aGlzLnBvc2VDYW1lcmEsXHJcbiAgICAgICAgICAoKSA9PiB0aGlzLmludGVyYWN0aW9uTW9kZSxcclxuICAgICAgICAgICgpID0+IHRoaXMubWF0dGVydGFnVG9Gb2xsb3dcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAqIFRyYW5zaXRpb25zXHJcbiAgICAgICAgKi9cclxuICAgICAgICB0aGlzLnNkay5vbihcclxuICAgICAgICAgICd2aWV3bW9kZS5jaGFuZ2VzdGFydCcsXHJcbiAgICAgICAgICBmdW5jdGlvbiAodG8sIGZyb20pIHtcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZygnU3RhcnRpbmcgdG8gbW92ZSB0byAnICsgdG8gKyAnIGZyb20gJyArIGZyb20pO1xyXG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmluVHJhbnNpdGlvbk1vZGUgPSB0cnVlO1xyXG4gICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnNkay5vbihcclxuICAgICAgICAgICd2aWV3bW9kZS5jaGFuZ2VlbmQnLFxyXG4gICAgICAgICAgZnVuY3Rpb24gKG9sZE1vZGUsIG5ld01vZGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZygnRW5kZWQgdG8gbW92ZSB0byAnICsgbmV3TW9kZSArICcgZnJvbSAnICsgb2xkTW9kZSk7XHJcbiAgICAgICAgICAgIGlmIChuZXdNb2RlICE9PSAnbW9kZS50cmFuc2l0aW9uaW5nJykge1xyXG4gICAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuaW5UcmFuc2l0aW9uTW9kZSA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LmJpbmQodGhpcylcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuc2RrLm9uKFxyXG4gICAgICAgICAgdGhpcy5zZGsuU3dlZXAuRXZlbnQuRU5URVIsXHJcbiAgICAgICAgICBmdW5jdGlvbiAob2xkU3dlZXAsIG5ld1N3ZWVwKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ0xlYXZpbmcgc3dlZXAgJyArIG9sZFN3ZWVwKTtcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZygnRW50ZXJpbmcgc3dlZXAgJyArIG5ld1N3ZWVwKTtcclxuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5pblRyYW5zaXRpb25Td2VlcCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmRpc3BsYXlBemltdXRhbENyb3duKCk7XHJcbiAgICAgICAgICAgIC8vIFJlZnJlc2ggb24gc3dlZXAgaXMgcmVtb3ZlZCBiZWNhdXNlIHdlIG9ubHkgdXBkYXRlIG9uIHJvb20gb3IgZmxvb3IgY2hhbmdlcyBub3cuXHJcbiAgICAgICAgICB9LmJpbmQodGhpcylcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuc2RrLm9uKFxyXG4gICAgICAgICAgdGhpcy5zZGsuU3dlZXAuRXZlbnQuRVhJVCxcclxuICAgICAgICAgIGZ1bmN0aW9uIChmcm9tU3dlZXAsIHRvU3dlZXApIHtcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZygnTGVhdmluZyBzd2VlcCAnICsgZnJvbVN3ZWVwKTtcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZygnVHJhbnNpdGlvbmluZyB0byBzd2VlcCAnICsgdG9Td2VlcCk7XHJcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuaW5UcmFuc2l0aW9uU3dlZXAgPSB0cnVlO1xyXG4gICAgICAgICAgfS5iaW5kKHRoaXMpXHJcbiAgICAgICAgKTtcclxuICAgICAgICBhd2FpdCB0aGlzLmluaXQzRE9iamVjdFZpZXdlcigpO1xyXG5cclxuICAgICAgICByZXNvbHZlKHRydWUpO1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlcHJlY2F0ZWQgVXNlIG5hdmlnYXRpb25TZXJ2aWNlLnJlc29sdmVTd2VlcFV1aWQoKSBpbnN0ZWFkLlxyXG4gICAqIEtlcHQgdGVtcG9yYXJpbHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxyXG4gICAqL1xyXG4gIGdldFN3ZWVwVVVJREZvclNpZChzaWQ6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UucmVzb2x2ZVN3ZWVwVXVpZChzaWQpICE9PSBzaWRcclxuICAgICAgPyB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnJlc29sdmVTd2VlcFV1aWQoc2lkKVxyXG4gICAgICA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBzZXRMaWdodGluZ09mZigpIHtcclxuICAgIHRoaXMubm9MaWdodEZvck9iamVjdHMgPSB0cnVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGlzdGFuY2VGb3JMYXN0TWVhc3VyZW1lbnQoKSB7XHJcbiAgICB0aGlzLm1lYXN1cmVtZW50U2VydmljZS5nZXREaXN0YW5jZUZvckxhc3RNZWFzdXJlbWVudCh0aGlzLnNkaywgdGhpcy5jdXJyZW50U3BhY2VJRCk7XHJcbiAgfVxyXG5cclxuICBnZXRMYXN0RGlzdGFuY2VzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubWVhc3VyZW1lbnRTZXJ2aWNlLmdldExhc3REaXN0YW5jZXMoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRha2VzIHNjcmVlbnNob3QgYW5kIHNhdmVzIGJhc2U2NCBpbiBsYXN0U2NyZWVuc2hvdFVyaVxyXG4gICAqIEByZXR1cm5zIFByb21pc2VcclxuICAgKi9cclxuICB0YWtlU2NyZWVuU2hvdCgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMubWVhc3VyZW1lbnRTZXJ2aWNlLnRha2VTY3JlZW5TaG90KHRoaXMuc2RrKTtcclxuICB9XHJcblxyXG4gIGdldFNjcmVlblNob3RVcmkoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5tZWFzdXJlbWVudFNlcnZpY2UuZ2V0U2NyZWVuU2hvdFVyaSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0TGFzdE1lYXN1cmVtZW50KCk6IE9iamVjdCB7XHJcbiAgICByZXR1cm4gdGhpcy5tZWFzdXJlbWVudFNlcnZpY2UuZ2V0TGFzdE1lYXN1cmVtZW50KHRoaXMucG9zZUNhbWVyYSk7XHJcbiAgfVxyXG5cclxuICAvL1xyXG4gIC8vIC0tLS0tLS0tLS0gVXRpbHMgLS0tLS0tLS0tLVxyXG4gIC8vXHJcbiAgcHJpdmF0ZSBnZXRGbG9vcklkRm9yVGFnKG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmdldEZsb29ySWRGb3JUYWcobWF0dGVydGFnRGF0YSwgdGhpcy5zd2VlcENvbGxlY3Rpb24pO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBTdHlsaW5nIG9mIHBvaW50ZXJcclxuICAgKi9cclxuICB1cGRhdGVQb2ludGVyVHJpY2soKSB7XHJcbiAgICB0aGlzLnBvaW50ZXJTZXJ2aWNlLnVwZGF0ZVBvaW50ZXJUcmljayh0aGlzLnNkaywgdGhpcy5jb250YWluZXIsIHRoaXMucG9zZU1hdHRlcnBvcnQsIHRoaXMucG9zZUNhbWVyYSwgdGhpcy5pbnRlcmFjdGlvbk1vZGUsIHRoaXMubWF0dGVydGFnVG9Gb2xsb3cpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJpZ2dlcnMgYSB0YWcgdmlzaWJpbGl0eSByZWZyZXNoIGJhc2VkIG9uIGN1cnJlbnQgY2FtZXJhIG1vZGUsIGZsb29yIGFuZCBzd2VlcC5cclxuICAgKiBEZWxlZ2F0ZXMgYWxsIGxvZ2ljIHRvIE1hdHRlcnBvcnRUYWdTZXJ2aWNlLnVwZGF0ZVRhZ3NWaXNpYmlsaXR5Rm9yQ29udGV4dCgpLlxyXG4gICAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IG9uIE1vZGUsIFN3ZWVwLCBGbG9vciBhbmQgUm9vbSBjaGFuZ2VzLlxyXG4gICAqL1xyXG4gIHB1YmxpYyByZWZyZXNoVGFnc1Zpc2liaWxpdHkoKTogdm9pZCB7XHJcbiAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHtcclxuICAgICAgaWYgKGlzRGV2TW9kZSgpICYmIHRoaXMuc3dlZXBDb2xsZWN0aW9uICYmIHRoaXMucG9zZUNhbWVyYT8uc3dlZXApIHtcclxuICAgICAgICBjb25zdCBzd2VlcERhdGEgPSB0aGlzLnN3ZWVwQ29sbGVjdGlvblt0aGlzLnBvc2VDYW1lcmEuc3dlZXBdO1xyXG4gICAgICAgIGNvbnNvbGUuZGVidWcoJ1tyZWZyZXNoVGFnc1Zpc2liaWxpdHldIHN3ZWVwRGF0YSBmb3IgY3VycmVudCBzd2VlcDonLCBKU09OLnN0cmluZ2lmeShzd2VlcERhdGEpKTtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKCdbcmVmcmVzaFRhZ3NWaXNpYmlsaXR5XSBjdXJyZW50Rmxvb3JTZXF1ZW5jZTonLCB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRGbG9vclNlcXVlbmNlKTtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKCdbcmVmcmVzaFRhZ3NWaXNpYmlsaXR5XSBjdXJyZW50Q2FtZXJhTW9kZTonLCB0aGlzLmN1cnJlbnRDYW1lcmFNb2RlKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLnVwZGF0ZVRhZ3NWaXNpYmlsaXR5Rm9yQ29udGV4dChcclxuICAgICAgICB0aGlzLnNkayxcclxuICAgICAgICB0aGlzLnN3ZWVwQ29sbGVjdGlvbixcclxuICAgICAgICB0aGlzLmN1cnJlbnRDYW1lcmFNb2RlLFxyXG4gICAgICAgIHRoaXMubWF0dGVydGFnVG9Gb2xsb3csXHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Rmxvb3JTZXF1ZW5jZSxcclxuICAgICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRSb29tc1xyXG4gICAgICApLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ1tNYXR0ZXJwb3J0U2VydmljZV0gcmVmcmVzaFRhZ3NWaXNpYmlsaXR5IGVycm9yJywgZXJyKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlYWx0aW1lIG1hdHRlcnRhZyBmb2xsb3dpbmcgdGhlIGN1cnNvclxyXG4gICAqIEBwYXJhbSBtYXR0ZXJ0YWcgc3RyaW5nXHJcbiAgICovXHJcbiAgZW5hYmxlX2ZvbGxvd2luZ190YWcobWF0dGVydGFnOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IE9GRlNFVCA9IDAuMDAwMTsgLy8gcXVhc2ktaW52aXNpYmxlIG1haXMgc3VmZml0IMOgIMOpdml0ZXIgbCdpbnRlcmNlcHRpb25cclxuICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZ2V0VGFnTW9kdWxlKHRoaXMuc2RrLCBtYXR0ZXJ0YWcpLmVkaXRQb3NpdGlvbihtYXR0ZXJ0YWcsIHtcclxuICAgICAgYW5jaG9yUG9zaXRpb246IHtcclxuICAgICAgICB4OiB0aGlzLnBvc2VNYXR0ZXJwb3J0LnBvc2l0aW9uLnggKyBPRkZTRVQsXHJcbiAgICAgICAgeTogdGhpcy5wb3NlTWF0dGVycG9ydC5wb3NpdGlvbi55LFxyXG4gICAgICAgIHo6IHRoaXMucG9zZU1hdHRlcnBvcnQucG9zaXRpb24ueiArIE9GRlNFVCxcclxuICAgICAgfSxcclxuICAgICAgc3RlbVZlY3Rvcjoge1xyXG4gICAgICAgIHg6IHRoaXMucG9zZU1hdHRlcnBvcnQubm9ybWFsLnggKiAwLjMsXHJcbiAgICAgICAgeTogdGhpcy5wb3NlTWF0dGVycG9ydC5ub3JtYWwueSAqIDAuMyxcclxuICAgICAgICB6OiB0aGlzLnBvc2VNYXR0ZXJwb3J0Lm5vcm1hbC56ICogMC4zLFxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgZGlzdGFuY2UgYmV0d3dlZW4gdHdvIDNEIHBvc2l0aW9uc1xyXG4gICAqIFVzZWQgaW4gb3JkZXIgdG8gc2VlIGhvdyBtdWNoIHRoZSBjdXJzb3IgaGFzIG1vdmVkIGZyb20gdGhlIHByZXZpb3VzIHBvc2l0aW9uXHJcbiAgICogQHBhcmFtIHBvczFcclxuICAgKiBAcGFyYW0gcG9zMlxyXG4gICAqL1xyXG4gIGdldERpc3RQb3NpdGlvbihwb3MxOiBhbnksIHBvczI6IGFueSkge1xyXG4gICAgcmV0dXJuIHRoaXMucG9pbnRlclNlcnZpY2UuZ2V0RGlzdFBvc2l0aW9uKHRoaXMuc2RrLCB0aGlzLmNvbnRhaW5lciwgdGhpcy5wb3NlQ2FtZXJhLCBwb3MxLCBwb3MyKTtcclxuICB9XHJcblxyXG4gIC8vXHJcbiAgLy8gLS0tLS0tLS0tLSBNYXR0ZXJ0YWcgcmVsYXRlZCAtLS0tLS0tLS0tXHJcbiAgLy9cclxuICAvKiogQ3JlYXRlcyBhIHRlbXBvcmFyeSBNYXR0ZXJ0YWcgdGhhdCBmb2xsb3dzIHRoZSB1c2VyJ3MgY3Vyc29yIGZvciBwb3NpdGlvbmluZy4gKi9cclxuICBhc3luYyBhZGRDdXJzb3JNYXR0ZXJ0YWcobWF0dGVydGFnRGF0YTogTWF0dGVydGFnRGF0YSkge1xyXG4gICAgaWYgKCF0aGlzLnBvc2VNYXR0ZXJwb3J0ICYmIHRoaXMucG9zZUNhbWVyYSkge1xyXG4gICAgICB0aGlzLnBvc2VNYXR0ZXJwb3J0ID0ge1xyXG4gICAgICAgIHBvc2l0aW9uOiB7IC4uLnRoaXMucG9zZUNhbWVyYS5wb3NpdGlvbiB9LFxyXG4gICAgICAgIG5vcm1hbDogeyB4OiAwLCB5OiAtMC4xNSwgejogMCB9LFxyXG4gICAgICAgIHRpbWU6IG5ldyBEYXRlKCkuZ2V0VGltZSgpXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMucG9zZU1hdHRlcnBvcnQpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93ID0gYXdhaXQgdGhpcy5hZGRNYXR0ZXJ0YWdUb1ZpZXdlcihtYXR0ZXJ0YWdEYXRhKTtcclxuXHJcbiAgICBpZiAoIXRoaXMubWF0dGVydGFnVG9Gb2xsb3cpIHtcclxuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ2FkZEN1cnNvck1hdHRlcnRhZzogdGFnIGNyZWF0aW9uIGZhaWxlZCwgbWF0dGVydGFnVG9Gb2xsb3cgaXMgbnVsbCcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgYXdhaXQgd2FpdCg1MCk7XHJcbiAgICBjb25zdCB0YWdNb2R1bGUgPSB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmdldFRhZ01vZHVsZSh0aGlzLnNkaywgdGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdyk7XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0YWdNb2R1bGUuZWRpdEljb24odGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdywgJ2ljb24tcG9zaXRpb24nKTtcclxuICAgICAgYXdhaXQgdGFnTW9kdWxlLmVkaXRPcGFjaXR5KHRoaXMubWF0dGVydGFnVG9Gb2xsb3csIDEpO1xyXG4gICAgICBhd2FpdCB0YWdNb2R1bGUuZWRpdFBvc2l0aW9uKHRoaXMubWF0dGVydGFnVG9Gb2xsb3csIHtcclxuICAgICAgICBhbmNob3JQb3NpdGlvbjogeyAuLi50aGlzLnBvc2VNYXR0ZXJwb3J0LnBvc2l0aW9uIH0sXHJcbiAgICAgICAgc3RlbVZlY3Rvcjoge1xyXG4gICAgICAgICAgeDogKHRoaXMucG9zZU1hdHRlcnBvcnQubm9ybWFsPy54ID8/IDApICogMC4zLFxyXG4gICAgICAgICAgeTogKHRoaXMucG9zZU1hdHRlcnBvcnQubm9ybWFsPy55ID8/IC0wLjE1KSAqIDAuMyxcclxuICAgICAgICAgIHo6ICh0aGlzLnBvc2VNYXR0ZXJwb3J0Lm5vcm1hbD8ueiA/PyAwKSAqIDAuMyxcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICBhd2FpdCB0YWdNb2R1bGUuYWxsb3dBY3Rpb24odGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdywge1xyXG4gICAgICAgIG9wZW5pbmc6IHRydWUsIG5hdmlnYXRpbmc6IGZhbHNlLCBkb2NraW5nOiBmYWxzZVxyXG4gICAgICB9KTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ2FkZEN1cnNvck1hdHRlcnRhZzogZXJyb3IgY29uZmlndXJpbmcgY3Vyc29yIHRhZycsIGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCB0YWdBZGRRdWV1ZSgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UudGFnQWRkUXVldWU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHRhZ0FkZFF1ZXVlKHZhbHVlOiBQcm9taXNlPGFueT4pIHtcclxuICAgIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UudGFnQWRkUXVldWUgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGFkZE1hdHRlcnRhZ1RvVmlld2VyKG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcclxuICAgIHJldHVybiB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmFkZE1hdHRlcnRhZ1RvVmlld2VyKHRoaXMuc2RrLCBtYXR0ZXJ0YWdEYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKiBUcmlnZ2VycyBjYWxsYmFjayBhY3Rpb25zIGFmdGVyIGEgdGFnJ3MgcG9zaXRpb24gaXMgdmFsaWRhdGVkIGJ5IGEgbGVmdCBjbGljay4gKi9cclxuICBvblZhbGlkYXRlZE1hdHRlcnRhZygpIHtcclxuICAgIHRoaXMuc2V0SW50ZXJhY3Rpb25Nb2RlKFZpZXdlckludGVyYWN0aW9ucy5ERUZBVUxUKTtcclxuICAgIGNvbnN0IGxhc3RUYWcgPSB0aGlzLmdldExhc3RUYWcoKTtcclxuICAgIGlmIChsYXN0VGFnKSB7XHJcbiAgICAgIGNvbnN0IGNhbGxiYWNrTW9kZSA9IHRoaXMuZGljdGlvbm5hcnlUYWdzXHJcbiAgICAgICAgLmdldChsYXN0VGFnKVxyXG4gICAgICAgIC5nZXRDYWxsYmFja0FjdGlvbk1vZGUoKTtcclxuICAgICAgdGhpcy5jYWxsYmFja0FmdGVyTWF0dGVydGFnVmFsaWRhdGlvbihjYWxsYmFja01vZGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFJlZ2lzdGVycyBhIG5ldyBpY29uIHRleHR1cmUgYW5kIGFwcGxpZXMgaXQgdG8gYSBzcGVjaWZpYyBNYXR0ZXJ0YWcuICovXHJcbiAgYXN5bmMgYWRkTmV3SWNvbkFuZFNldEZvclRhZyhtYXR0ZXJ0YWdJRDogc3RyaW5nLCBpY29uUGF0aDogc3RyaW5nKSB7XHJcbiAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmFkZE5ld0ljb25BbmRTZXRGb3JUYWcoXHJcbiAgICAgIHRoaXMuc2RrLFxyXG4gICAgICBtYXR0ZXJ0YWdJRCxcclxuICAgICAgaWNvblBhdGgsXHJcbiAgICAgIGZhbHNlLFxyXG4gICAgICAxXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgLyoqIEFwcGxpZXMgYSBwcmUtcmVnaXN0ZXJlZCBpY29uIHRvIGEgTWF0dGVydGFnLiAqL1xyXG4gIGFzeW5jIHNldFJlZ2lzdHJlZEljb25Gb3JUYWcobWF0dGVydGFnSUQ6IHN0cmluZywgaWNvbk5hbWU6IHN0cmluZykge1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5nZXRUYWdNb2R1bGUodGhpcy5zZGssIG1hdHRlcnRhZ0lEKS5lZGl0SWNvbihtYXR0ZXJ0YWdJRCwgaWNvbk5hbWUpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignQ291bGQgbm90IGVkaXQgaWNvbicsIGljb25OYW1lLCBlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBTZXRzIHRoZSBhcHByb3ByaWF0ZSBpY29uIGFuZCBvcGFjaXR5IGZvciBhIHRhZyBiYXNlZCBvbiBpdHMgdHlwZSBhbmQgUE9JIG1ldGFkYXRhLiAqL1xyXG4gIGFzeW5jIHNldFRhZ0ljb25BbmRPcGFjaXR5KFxyXG4gICAgbWF0dGVydGFnSUQ6IHN0cmluZyxcclxuICAgIG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGFcclxuICApIHtcclxuICAgIGlmICh0aGlzLlNQTW9kdWxlID09PSBTcE1vZHVsZS5IT1RFTCkge1xyXG4gICAgICBjb25zdCByb29tID0gbWF0dGVydGFnRGF0YS5nZXRPYmplY3QoKTtcclxuICAgICAgbGV0IGljb25OYW1lID0gYGljb25fcm9vbWA7XHJcbiAgICAgIGlmIChyb29tLmF2YWlsYWJsZSkge1xyXG4gICAgICAgIGljb25OYW1lID0gYCR7aWNvbk5hbWV9X2F2YWlsYWJsZWA7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWNvbk5hbWUgPSBgJHtpY29uTmFtZX1fdW5hdmFpbGFibGVgO1xyXG4gICAgICB9XHJcbiAgICAgIGF3YWl0IHRoaXMuZWRpdFRhZ0ljb24obWF0dGVydGFnSUQsIGljb25OYW1lKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3Qgc3RyaW5nVGFnVHlwZSA9IHBvaVR5cGVUb1N0cmluZyhtYXR0ZXJ0YWdEYXRhLmdldFR5cGUoKSk7XHJcbiAgICBsZXQgb3BhY2l0eSA9IHRoaXMuY29uZmlnLm15X2NvbmZpZy5ERUZBVUxUX09QQUNJVFlfVEFHO1xyXG4gICAgbGV0IGljb25OYW1lID0gYGljb24tJHtzdHJpbmdUYWdUeXBlfWA7XHJcbiAgICBjb25zdCBwb2kgPSBtYXR0ZXJ0YWdEYXRhLmdldFBvaSgpO1xyXG4gICAgaWYgKHBvaSAmJiBwb2kudGFnSWNvbikge1xyXG4gICAgICBjb25zdCB0YWdJY29uID0gSlNPTi5wYXJzZShwb2kudGFnSWNvbik7XHJcbiAgICAgIGlmIChtYXR0ZXJ0YWdEYXRhLmdldFR5cGUoKSA9PT0gUG9pVHlwZS5EQVRBKSB7XHJcbiAgICAgICAgY29uc3QgZmVhdHVyZSA9IG1hdHRlcnRhZ0RhdGEuZ2V0T2JqZWN0KCk7XHJcbiAgICAgICAgaWYgKGZlYXR1cmUudHlwZSA9PT0gRmVhdHVyZVR5cGUuSU5ESUNBVE9SX1RFTVApIHtcclxuICAgICAgICAgIHRhZ0ljb24uc3JjID0gdGhpcy50YWdTZXJ2aWNlLmdldEljb25UYWdJbWFnZUZvckZlYXR1cmUoZmVhdHVyZSwgcG9pKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRhZ0ljb24uc3JjKSB7XHJcbiAgICAgICAgY29uc3QgcGF0aFNpZ25lZCA9IGF3YWl0IHRoaXMudGFnU2VydmljZS5nZXRTaWduZWRUYWdJY29uU291cmNlKFxyXG4gICAgICAgICAgdGFnSWNvbi5zcmNcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChwYXRoU2lnbmVkKSB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpY29uTmFtZSA9IGBpY29uLSR7c3RyaW5nVGFnVHlwZX0tJHttYXR0ZXJ0YWdJRH0tJHttYXR0ZXJ0YWdEYXRhLmN1c3RvbUljb25JbmRleH1gO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNkay5Bc3NldC5yZWdpc3RlclRleHR1cmUoaWNvbk5hbWUsIHBhdGhTaWduZWQpO1xyXG4gICAgICAgICAgICBtYXR0ZXJ0YWdEYXRhLmN1c3RvbUljb25JbmRleCArPSAxO1xyXG4gICAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciByZWdpc3Rlckljb24nKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRhZ0ljb24ub3BhY2l0eSkge1xyXG4gICAgICAgIG9wYWNpdHkgPSB0YWdJY29uLm9wYWNpdHk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMuZWRpdFRhZ0ljb24obWF0dGVydGFnSUQsIGljb25OYW1lKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFwcGxpZXMgYW4gaWNvbiB0byBhIHRhZy4gVGhlIGNhbGwgaXMgYXdhaXRlZCBhbmQgaXRzIHJlamVjdGlvbiByZXBvcnRlZDogYVxyXG4gICAqIHNpbGVudGx5IGRyb3BwZWQgcHJvbWlzZSBoZXJlIGxlYXZlcyB0aGUgcGluIHdpdGggaXRzIGRlZmF1bHQgd2hpdGUgbG9vay5cclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGVkaXRUYWdJY29uKG1hdHRlcnRhZ0lEOiBzdHJpbmcsIGljb25OYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZ2V0VGFnTW9kdWxlKHRoaXMuc2RrLCBtYXR0ZXJ0YWdJRCkuZWRpdEljb24obWF0dGVydGFnSUQsIGljb25OYW1lKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFNlcnZpY2VdIGVkaXRJY29uIGZhaWxlZCBmb3InLCBtYXR0ZXJ0YWdJRCwgaWNvbk5hbWUsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBOYXZpZ2F0ZXMgdGhlIGNhbWVyYSB0byB0aGUgbW9zdCByZWNlbnRseSBjcmVhdGVkIHRhZy4gKi9cclxuICBhc3luYyBnb1RvTGFzdFRhZygpIHtcclxuICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZ29Ub0xhc3RUYWcodGhpcy5zZGspO1xyXG4gIH1cclxuXHJcbiAgLyoqIE5hdmlnYXRlcyB0aGUgY2FtZXJhIHRvIGEgc3BlY2lmaWMgTWF0dGVydGFnIGJ5IGl0cyBJRC4gKi9cclxuICBhc3luYyBnb1RvVGFnKG1hdHRlcnRhZ0lEOiBzdHJpbmcpIHtcclxuICAgIGlmICghbWF0dGVydGFnSUQvKiB8fCB0aGlzLmluVHJhbnNpdGlvblN3ZWVwKi8pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5vbkdvVG9UYWcubmV4dChtYXR0ZXJ0YWdJRCk7XHJcbiAgICAgIGF3YWl0IHRoaXMuc2RrLlN3ZWVwLmN1cnJlbnQud2FpdFVudGlsKFxyXG4gICAgICAgIChjdXJyZW50U3dlZXApID0+IGN1cnJlbnRTd2VlcCAhPT0gJydcclxuICAgICAgKTtcclxuICAgICAgY29uc3QgbXREYXRhID0gdGhpcy5kaWN0aW9ubmFyeVRhZ3MuZ2V0KG1hdHRlcnRhZ0lEKTtcclxuICAgICAgaWYgKG10RGF0YSkge1xyXG4gICAgICAgIGNvbnN0IHBvc2l0aW9uID0gbXREYXRhLmdldFBvc2l0aW9uKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zZGsuQ2FtZXJhLmxvb2tBdChwb3NpdGlvbiwge1xyXG4gICAgICAgICAgdHJhbnNpdGlvbjogdGhpcy5zZGsuQ2FtZXJhLlRyYW5zaXRpb25UeXBlLkZMWVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGBvcGVuYCBvbmx5IGV4aXN0cyBvbiB0aGUgZ2xvYmFsIFRhZyBtb2R1bGUsIG5ldmVyIG9uIGEgbGF5ZXItc2NvcGVkIG9uZS5cclxuICAgICAgYXdhaXQgdGhpcy5zZGsuVGFnLm9wZW4obWF0dGVydGFnSUQpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0Nhbm5vdCBuYXZpZ2F0ZSB0byB0YWcnLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNb3ZlIHRoZSB2aWV3ZXIgY2FtZXJhIHRvIGEgc3BlY2lmaWMgM0QgcG9zaXRpb24gYW5kIGFwcGx5IGEgcm90YXRpb24uXHJcbiAgICogRGVsZWdhdGVzIHRoZSBoZWF2eSBsaWZ0aW5nIHRvIE1hdHRlcnBvcnROYXZpZ2F0aW9uU2VydmljZS5tb3ZlX3RvX3Bvc2l0aW9uLlxyXG4gICAqIC0gcG9zaXRpb246IHsgeCwgeSwgeiB9XHJcbiAgICogLSByb3RhdGlvbjogeyB5YXcsIHBpdGNoPywgcm9sbD8gfSBpbiBkZWdyZWVzIGJ5IGRlZmF1bHRcclxuICAgKiAtIG9wdGlvbnM6IG9wdGlvbmFsIHRyYW5zaXRpb24gYW5kIGNvbnZlcnNpb24gc2V0dGluZ3MgKHNlZSBuYXZpZ2F0aW9uIHNlcnZpY2UpXHJcbiAgICovXHJcbiAgcHVibGljIGFzeW5jIGdvVG9Qb3NpdGlvbihcclxuICAgIHBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfSxcclxuICAgIHJvdGF0aW9uOiB7IHlhdzogbnVtYmVyOyBwaXRjaD86IG51bWJlcjsgcm9sbD86IG51bWJlciB9IHwgbnVsbCA9IG51bGwsXHJcbiAgICBvcHRpb25zPzoge1xyXG4gICAgICB0cmFuc2l0aW9uPzogJ0ZMWScgfCAnSU5TVEFOVCcgfCAnSU1NRURJQVRFJztcclxuICAgICAgZHVyYXRpb25Ncz86IG51bWJlcjtcclxuICAgICAgYW5nbGVzSW5EZWdyZWVzPzogYm9vbGVhbjtcclxuICAgICAgb2Zmc2V0PzogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XHJcbiAgICB9XHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyBFbnN1cmUgU0RLIGlzIGluaXRpYWxpemVkXHJcbiAgICBpZiAoIXRoaXMuc2RrKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWF0dGVycG9ydCBTREsgaXMgbm90IGluaXRpYWxpemVkJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUHJldmVudCBjb25jdXJyZW50IG5hdmlnYXRpb24gaWYgYWxyZWFkeSBpbiBhIHN3ZWVwL21vZGUgdHJhbnNpdGlvblxyXG4gICAgaWYgKHRoaXMuaW5UcmFuc2l0aW9uTW9kZSB8fCB0aGlzLmluVHJhbnNpdGlvblN3ZWVwKSB7XHJcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS5kZWJ1ZygnZ29Ub1Bvc2l0aW9uIGFib3J0ZWQ6IHZpZXdlciBpcyBpbiB0cmFuc2l0aW9uJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICAvLyBNYXJrIHRyYW5zaXRpb24gc3RhdGUgb24gbmF2aWdhdGlvbiBzZXJ2aWNlIChtb3ZlX3RvX3Bvc2l0aW9uIHdpbGwgYWxzbyBtYW5hZ2UgZmxhZ3MpXHJcbiAgICAgIHRoaXMuaW5UcmFuc2l0aW9uTW9kZSA9IHRydWU7XHJcblxyXG4gICAgICAvLyBEZWxlZ2F0ZSB0byBuYXZpZ2F0aW9uIHNlcnZpY2Ugd2hpY2ggY29udGFpbnMgdGhlIHJvYnVzdCBtb3ZlX3RvX3Bvc2l0aW9uIGltcGxlbWVudGF0aW9uXHJcbiAgICAgIGF3YWl0IHRoaXMubmF2aWdhdGlvblNlcnZpY2UubW92ZV90b19wb3NpdGlvbih0aGlzLnNkaywgcG9zaXRpb24sIHJvdGF0aW9uLCBvcHRpb25zKTtcclxuXHJcbiAgICAgIC8vIFVwZGF0ZSBsb2NhbCBjYWNoZWQgY2FtZXJhIGluZm9cclxuICAgICAgdGhpcy5sYXN0Q2FtZXJhUG9zaXRpb24gPSB7IC4uLnBvc2l0aW9uIH07XHJcbiAgICAgIC8vIEVtaXQgYSBzaW1wbGlmaWVkIGN1cnJlbnQgY2FtZXJhIHBvc2UgZm9yIHN1YnNjcmliZXJzXHJcbiAgICAgIHRoaXMuY3VycmVudENhbWVyYVBvc2UubmV4dCh7XHJcbiAgICAgICAgcG9zaXRpb246IHsgLi4ucG9zaXRpb24gfSxcclxuICAgICAgICByb3RhdGlvbjogcm90YXRpb24gPyB7IC4uLnJvdGF0aW9uIH0gOiBudWxsLFxyXG4gICAgICAgIHN3ZWVwOiB0aGlzLnBvc2VDYW1lcmE/LnN3ZWVwID8/IG51bGxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKCdnb1RvUG9zaXRpb24gY29tcGxldGVkJywgeyBwb3NpdGlvbiwgcm90YXRpb24sIG9wdGlvbnMgfSk7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUuZXJyb3IoJ2dvVG9Qb3NpdGlvbiBlcnJvcicsIGVycik7XHJcbiAgICAgIHRocm93IGVycjtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIC8vIEVuc3VyZSB0cmFuc2l0aW9uIGZsYWcgaXMgY2xlYXJlZCAobmF2aWdhdGlvbiBzZXJ2aWNlIG1heSBhbHNvIGNsZWFyIGl0KVxyXG4gICAgICB0aGlzLmluVHJhbnNpdGlvbk1vZGUgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgKiBDb21wdXRlcyB0aGUgY29udGV4dC1hd2FyZSBvcGFjaXR5IGZvciBhIHNpbmdsZSB0YWcgYXQgdGhlIG1vbWVudCBpdCBpcyByZW5kZXJlZC5cclxuICAgICogLSBDdXJzb3IgdGFnOiBhbHdheXMgdXNlIHByb3ZpZGVkIGRlZmF1bHRPcGFjaXR5LlxyXG4gICAgKiAtIERPTExIT1VTRSAvIEZMT09SUExBTjogMCAoaGlkZGVuKS5cclxuICAgICogLSBJTlNJREU6IGZsb29yLWZpbHRlcmVkIHByb3hpbWl0eSBvcGFjaXR5IHZpYSBNYXR0ZXJwb3J0VGFnU2VydmljZS5cclxuICAgICogLSBPdGhlciAvIHVua25vd246IGRlZmF1bHRPcGFjaXR5LlxyXG4gICAgKi9cclxuICAvKnByaXZhdGUgX2NvbXB1dGVDb250ZXh0T3BhY2l0eUZvclRhZyhcclxuICAgIG1hdHRlcnRhZ0lEOiBzdHJpbmcsXHJcbiAgICBtYXR0ZXJ0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhLFxyXG4gICAgZGVmYXVsdE9wYWNpdHk6IG51bWJlclxyXG4gICk6IG51bWJlciB7XHJcbiAgICBpZiAobWF0dGVydGFnSUQgPT09IHRoaXMubWF0dGVydGFnVG9Gb2xsb3cpIHtcclxuICAgICAgcmV0dXJuIGRlZmF1bHRPcGFjaXR5O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuY29tcHV0ZVNpbmdsZVRhZ0NvbnRleHRPcGFjaXR5KFxyXG4gICAgICBtYXR0ZXJ0YWdEYXRhLFxyXG4gICAgICB0aGlzLnBvc2VDYW1lcmEsXHJcbiAgICAgIHRoaXMuc3dlZXBDb2xsZWN0aW9uLFxyXG4gICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRGbG9vclNlcXVlbmNlLFxyXG4gICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmN1cnJlbnRSb29tc1xyXG4gICAgKTtcclxuICB9Ki9cclxuXHJcbiAgcHJpdmF0ZSBhZGRDdXN0b21Dc3MoKTogdm9pZCB7XHJcbiAgICBjb25zdCBjc3MgPSBgXHJcbiAgICAgIC5mb290ZXItdWksXHJcbiAgICAgIC5zaG93Y2FzZS1mb290ZXIsXHJcbiAgICAgIC5tcC1ub3ZhLWJ0bi1ncm91cCxcclxuICAgICAgLmZvb3Rlci1kaXZpZGVyLFxyXG4gICAgICAubG9nby1saW5rLFxyXG4gICAgICAuZm9vdGVyLWxvZ28sXHJcbiAgICAgIC5ib3R0b20tdWksXHJcbiAgICAgIGltZy5sb2dvLWltYWdlLFxyXG4gICAgICBpbWdbY2xhc3NePVwibG9nby1pbWFnZVwiXSxcclxuICAgICAgaW1nW2NsYXNzKj1cIiBsb2dvLWltYWdlXCJdLFxyXG4gICAgICBbZGF0YS10ZXN0aWQ9XCJzaG93Y2FzZS1mb290ZXJcIl0ge1xyXG4gICAgICAgIG9wYWNpdHk6IDAgIWltcG9ydGFudDtcclxuICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDtcclxuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZSAhaW1wb3J0YW50O1xyXG4gICAgICB9XHJcbiAgICBgO1xyXG5cclxuICAgIC8vIDFzdCBtZXRob2Q6IFZpYSBTY2VuZSBTREtcclxuICAgIGlmICh0aGlzLnNkaz8uU2NlbmU/LmFkZFN0eWxlKSB7XHJcbiAgICAgIHRoaXMuc2RrLlNjZW5lLmFkZFN0eWxlKGNzcyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gMm5kIG1ldGhvZDogRGlyZWN0IGluamVjdGlvbiBpbiBpRnJhbWUgRE9NIChGYWxsYmFjaylcclxuICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyN2aWV3ZXItbW9kdWxlJykgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XHJcbiAgICBpZiAoaWZyYW1lPy5jb250ZW50V2luZG93Py5kb2N1bWVudCkge1xyXG4gICAgICBjb25zdCBzdHlsZSA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XHJcbiAgICAgIHN0eWxlLnRleHRDb250ZW50ID0gY3NzO1xyXG4gICAgICBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZXMgY29udGVudCBvZiBNYXR0ZXJ0YWcgd2l0aCBtYXR0ZXJ0YWdJRCAoYmlsbGJvYXJkLCBpbmplY3RlZCBodG1sLCB0YWcgaWNvbilcclxuICAgKiBAcGFyYW0gbWF0dGVydGFnSUQgc3RyaW5nXHJcbiAgICogQHBhcmFtIG9iamVjdCBUaWNrZXQsIEVxdWlwbWVudCwgRmVhdHVyZSwgZXRjXHJcbiAgICogQHBhcmFtIHRhZ1R5cGUgUG9pVHlwZVxyXG4gICAqL1xyXG4gIGFzeW5jIHVwZGF0ZU1hdHRlclRhZ0NvbnRlbnRGb3JUYWdJRChcclxuICAgIG1hdHRlcnRhZ0lEOiBzdHJpbmcsXHJcbiAgICBvYmplY3Q6IERiT2JqZWN0VHlwZSA9IG51bGwsXHJcbiAgICB0YWdUeXBlOiBQb2lUeXBlID0gbnVsbFxyXG4gICkge1xyXG4gICAgaWYgKHRoaXMuc2RrKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZ2V0VGFnTW9kdWxlKHRoaXMuc2RrLCBtYXR0ZXJ0YWdJRCkuZWRpdEJpbGxib2FyZChcclxuICAgICAgICBtYXR0ZXJ0YWdJRCxcclxuICAgICAgICB0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQobWF0dGVydGFnSUQpLmdldERhdGEoKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIE1pc2Ugw6Agam91ciBkZSBsJ2ljw7RuZSBpbW3DqWRpYXRlXHJcbiAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLnVwZGF0ZU1hdHRlclRhZ0NvbnRlbnRGb3JUYWdJRChcclxuICAgICAgdGhpcy5zZGssXHJcbiAgICAgIG1hdHRlcnRhZ0lELFxyXG4gICAgICBvYmplY3QsXHJcbiAgICAgIHRhZ1R5cGUsXHJcbiAgICAgIHRoaXMuc2V0VGFnSWNvbkFuZE9wYWNpdHkuYmluZCh0aGlzKSxcclxuICAgICAgLy8gT24gcGFzc2UgdW5lIGZvbmN0aW9uIHdyYXBwZXIgcXVpIGV4w6ljdXRlIGwnaW5qZWN0aW9uIEhUTUwgc2FucyBibG9xdWVyXHJcbiAgICAgIGFzeW5jICh0eXBlLCBvYmosIHNpZCkgPT4ge1xyXG4gICAgICAgIHRoaXMuaW5qZWN0SHRtbEluVGFnKHR5cGUsIG9iaiwgc2lkKS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0FzeW5jIEhUTUwgdXBkYXRlIGZhaWxlZCBmb3InLCBzaWQsIGVycik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIGluamVjdGVkIGh0bWwgZm9yIE1hdHRlcnRhZ1xyXG4gICAqIEBwYXJhbSBtYXR0ZXJ0YWdJRCBzdHJpbmdcclxuICAgKiBAcGFyYW0gb2JqZWN0IFRpY2tldCwgRXF1aXBtZW50LCBGZWF0dXJlLCBldGNcclxuICAgKiBAcGFyYW0gdGFnVHlwZSBQb2lUeXBlXHJcbiAgICovXHJcbiAgYXN5bmMgdXBkYXRlSW5qZWN0ZWRIdG1sRm9yVGFnSUQoXHJcbiAgICBtYXR0ZXJ0YWdJRDogc3RyaW5nLFxyXG4gICAgb2JqZWN0OiBhbnksXHJcbiAgICB0YWdUeXBlOiBQb2lUeXBlXHJcbiAgKSB7XHJcbiAgICBhd2FpdCB0aGlzLmluamVjdEh0bWxJblRhZyh0YWdUeXBlLCBvYmplY3QsIG1hdHRlcnRhZ0lEKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZXMgTWF0dGVydGFnIGZyb20gVmlld2VyIGJ5IGl0cyBJRFxyXG4gICAqIEBwYXJhbSBtYXR0ZXJ0YWdJRCBzdHJpbmdcclxuICAgKi9cclxuICBkZWxldGVNYXR0ZXJ0YWdGcm9tSWQobWF0dGVydGFnSUQ6IHN0cmluZykge1xyXG4gICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5kZWxldGVNYXR0ZXJ0YWdGcm9tSWQodGhpcy5zZGssIG1hdHRlcnRhZ0lEKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlbGV0ZXMgbGF0ZXN0IGNyZWF0ZWQgbWF0dGVydGFnXHJcbiAgICovXHJcbiAgYXN5bmMgZGVsZXRlTGFzdE1hdHRlcnRhZygpIHtcclxuICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZGVsZXRlTGFzdE1hdHRlcnRhZyh0aGlzLnNkayk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMZWdhY3k6IHVzZWQgdG8gYmUgY2FsbGVkIGFjdGlvbl9hZGRfbWF0dGVydGFnX2Zyb21fUE9JXHJcbiAgICogQWRkcyBhbmQgY29uZmlndXJlcyBNYXR0ZXJ0YWcgZm9yIGFuIG9iamVjdCAoVGlja2V0LCBFcXVpcG1lbnQsIEZlYXR1cmUsIGV0YykgdGhhdCBjb3JyZXNwb25kcyB0byBQT0kgKGNvb3JkaW5hdGVzLCB0YWdJY29uKVxyXG4gICAqIEBwYXJhbSB0YWdUeXBlIFBvaVR5cGVcclxuICAgKiBAcGFyYW0gb2JqZWN0IFRpY2tldCwgRXF1aXBtZW50LCBGZWF0dXJlLi4uXHJcbiAgICogQHBhcmFtIHBvaSBQT0lcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIGFzeW5jIGNyZWF0ZU1hdHRlcnRhZ0Zyb21QT0koXHJcbiAgICB0YWdUeXBlOiBQb2lUeXBlLFxyXG4gICAgb2JqZWN0OiBEYk9iamVjdFR5cGUsXHJcbiAgICBwb2k6IFBPSVxyXG4gICk6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5jcmVhdGVNYXR0ZXJ0YWdGcm9tUE9JKFxyXG4gICAgICB0aGlzLnNkayxcclxuICAgICAgdGFnVHlwZSxcclxuICAgICAgb2JqZWN0LFxyXG4gICAgICBwb2ksXHJcbiAgICAgIHRoaXMuZ2V0VGFnRnJvbUVsZW1lbnRJZC5iaW5kKHRoaXMpLFxyXG4gICAgICB0aGlzLnNldFRhZ0ljb25BbmRPcGFjaXR5LmJpbmQodGhpcyksXHJcbiAgICAgIHRoaXMuaW5qZWN0SHRtbEluVGFnLmJpbmQodGhpcylcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBJbmplY3QgY3VzdG9tIEhUTUwgYXMgTWF0dGVydGFnIGNvbnRlbnRcclxuICAgKiBAcGFyYW0gdGFnVHlwZSBQb2lUeXBlXHJcbiAgICogQHBhcmFtIG9iamVjdCBUaWNrZXQsIEVxdWlwbWVudCwgRmVhdHVyZSBldGNcclxuICAgKiBAcGFyYW0gdGFnSUQgc3RyaW5nXHJcbiAgICovXHJcbiAgYXN5bmMgaW5qZWN0SHRtbEluVGFnKHRhZ1R5cGU6IFBvaVR5cGUsIG9iamVjdDogRGJPYmplY3RUeXBlLCB0YWdJRDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5pbmplY3RIdG1sSW5UYWcodGhpcy5zZGssIHRhZ1R5cGUsIG9iamVjdCwgdGFnSUQpO1xyXG4gIH1cclxuXHJcblxyXG4gIGFzeW5jIGFjdGlvbl9kZWxldGVfYWxsX21hdHRlcnRhZ3MoKSB7XHJcbiAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmFjdGlvbl9kZWxldGVfYWxsX21hdHRlcnRhZ3ModGhpcy5zZGspO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVsZXRlcyBNYXR0ZXJ0YWcgZnJvbSB2aXNpdCBhc3NvY2lhdGVkIHdpdGggb2JqZWN0IElEICh0aWNrZXRJRCwgZXRjKVxyXG4gICAqIEBwYXJhbSBlbGVtZW50SUQgc3RyaW5nXHJcbiAgICovXHJcbiAgYXN5bmMgZGVsZXRlTWF0dGVydGFnRm9yT2JqZWN0KGVsZW1lbnRJRDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBtYXR0ZXJUYWdJRCA9IHRoaXMuZ2V0VGFnRnJvbUVsZW1lbnRJZChlbGVtZW50SUQpLnRhZztcclxuICAgIGlmIChtYXR0ZXJUYWdJRCkge1xyXG4gICAgICB0aGlzLnRhZ0FkZFF1ZXVlID0gdGhpcy50YWdBZGRRdWV1ZS50aGVuKGFzeW5jICgpID0+IHtcclxuICAgICAgICBhd2FpdCB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmRlbGV0ZU1hdHRlcnRhZ0Zyb21JZCh0aGlzLnNkaywgbWF0dGVyVGFnSUQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnRhZ0FkZFF1ZXVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogdXVpZCBmcm9tIHRocmVlanNcclxuICAgKiBAcGFyYW0gdXVpZFxyXG4gICAqL1xyXG4gIGFzeW5jIGRlbGV0ZU9iamVjdDNEKHV1aWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmRlbGV0ZU9iamVjdDNEKHV1aWQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0T2JqZWN0M0RNb2RlbE5vZGVGcm9tRGljdGlvbm5hcnkodXVpZDogc3RyaW5nKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5nZXRPYmplY3QzRE1vZGVsTm9kZUZyb21EaWN0aW9ubmFyeSh1dWlkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgIE1hdHRlcnRhZ0RhdGEgYW5kIHN0YXJ0IHJlcG9zaXRpb25pbmcgKGNyZWF0ZXMgdGVtcG9yYXJ5IG1hdHRlcnRhZyB0aGF0IGZvbGxvd3MgdGhlIGN1cnNvcilcclxuICAgKiBAcGFyYW0gcG9pVHlwZSBQb2lUeXBlXHJcbiAgICogQHBhcmFtIGVsZW1lbnQgVGlja2V0LCBFcXVpcG1lbnQsIEZlYXR1cmUsIGV0Y1xyXG4gICAqL1xyXG4gIGFzeW5jIGFkZE1hdHRlcnRhZ1doZW5SZXBvc2l0aW9uaW5nKHBvaVR5cGU6IFBvaVR5cGUsIGVsZW1lbnQ6IERiT2JqZWN0VHlwZSkge1xyXG4gICAgY29uc3QgbWF0dGVydGFnRGF0YSA9IG5ldyBNYXR0ZXJ0YWdEYXRhKHBvaVR5cGUpO1xyXG4gICAgLy8gc2V0IHRoZSBjb29yZGluYXRlcyBvZiB0aGUgZXhpc3RpbmcgdGFnXHJcbiAgICBjb25zdCBbcG9pXSA9IGVsZW1lbnQucG9pcy5pdGVtcztcclxuICAgIGlmIChwb2kgJiYgcG9pLmNvb3JkaW5hdGUpIHtcclxuICAgICAgbWF0dGVydGFnRGF0YS5zZXRQb3NpdGlvbihKU09OLnBhcnNlKHBvaS5jb29yZGluYXRlKSk7XHJcbiAgICAgIG1hdHRlcnRhZ0RhdGEuc2V0UG9pKHBvaSk7IC8vIHRvIGtlZXAgY3VzdG9tIHRhZ0ljb24gYW5kIG9wYWNpdHlcclxuICAgIH1cclxuICAgIG1hdHRlcnRhZ0RhdGEuc2V0U3dlZXBJRCh0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLnJlc29sdmVTd2VlcFV1aWQodGhpcy5wb3NlQ2FtZXJhLnN3ZWVwKSk7XHJcbiAgICBtYXR0ZXJ0YWdEYXRhLnNldFJvdGF0aW9uKHRoaXMucG9zZUNhbWVyYS5yb3RhdGlvbik7XHJcbiAgICBtYXR0ZXJ0YWdEYXRhLnNldE9iamVjdChlbGVtZW50LCBwb2lUeXBlKTtcclxuICAgIHRoaXMubWF0dGVydGFnVG9Gb2xsb3cgPSBhd2FpdCB0aGlzLmFkZE1hdHRlcnRhZ1RvVmlld2VyKG1hdHRlcnRhZ0RhdGEpO1xyXG5cclxuICAgIHRoaXMuc2V0SW50ZXJhY3Rpb25Nb2RlKFZpZXdlckludGVyYWN0aW9ucy5QT1NJVElPTklORyk7XHJcbiAgICBhd2FpdCB0aGlzLmFkZEN1cnNvck1hdHRlcnRhZyhtYXR0ZXJ0YWdEYXRhKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgTWF0dGVydGFnRGF0YSBhbmQgbWF0dGVydGFnIHRoYXQgZm9sbG93cyB0aGUgY3Vyc29yIHdoZW4gY2hvb3NpbmcgcG9zaXRpb24gZm9yIGEgbmV3IG9iamVjdFxyXG4gICAqIEBwYXJhbSBwb2lUeXBlXHJcbiAgICovXHJcbiAgYXN5bmMgYWRkTWF0dGVydGFnV2hlbkFkZGluZyhwb2lUeXBlOiBQb2lUeXBlKSB7XHJcbiAgICBjb25zdCBtYXR0ZXJ0YWdEYXRhID0gbmV3IE1hdHRlcnRhZ0RhdGEocG9pVHlwZSk7XHJcbiAgICBtYXR0ZXJ0YWdEYXRhLnNldFN3ZWVwSUQodGhpcy5uYXZpZ2F0aW9uU2VydmljZS5yZXNvbHZlU3dlZXBVdWlkKHRoaXMucG9zZUNhbWVyYS5zd2VlcCkpO1xyXG4gICAgbWF0dGVydGFnRGF0YS5zZXRSb3RhdGlvbih0aGlzLnBvc2VDYW1lcmEucm90YXRpb24pO1xyXG5cclxuICAgIGNvbnN0IGluaXRpYWxQb3NpdGlvbiA9IHRoaXMucG9zZU1hdHRlcnBvcnQ/LnBvc2l0aW9uID8/IHRoaXMucG9zZUNhbWVyYS5wb3NpdGlvbjtcclxuICAgIGNvbnN0IGluaXRpYWxOb3JtYWwgPSB0aGlzLnBvc2VNYXR0ZXJwb3J0Py5ub3JtYWwgPz8geyB4OiAwLCB5OiAtMC4xNSwgejogMCB9O1xyXG4gICAgbWF0dGVydGFnRGF0YS5zZXRQb3NpdGlvbih7IC4uLmluaXRpYWxQb3NpdGlvbiB9KTtcclxuICAgIG1hdHRlcnRhZ0RhdGEuc2V0Tm9ybWFsKHsgLi4uaW5pdGlhbE5vcm1hbCB9KTtcclxuXHJcbiAgICB0aGlzLnNldEludGVyYWN0aW9uTW9kZShWaWV3ZXJJbnRlcmFjdGlvbnMuQURESU5HKTtcclxuICAgIGF3YWl0IHRoaXMuYWRkQ3Vyc29yTWF0dGVydGFnKG1hdHRlcnRhZ0RhdGEpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2FuY2VscyBmb2xsb3dpbmcgb2YgY3Vyc29yIChtZWFuaW5nIGRlbGV0aW5nIGxhc3QgTWF0dGVydGFnKVxyXG4gICAqL1xyXG4gIGNhbmNlbEZvbGxvd2luZ0N1cnNvcigpIHtcclxuICAgIHRoaXMuZGVsZXRlTGFzdE1hdHRlcnRhZygpO1xyXG4gICAgdGhpcy5zZXRJbnRlcmFjdGlvbk1vZGUoVmlld2VySW50ZXJhY3Rpb25zLkRFRkFVTFQpO1xyXG4gIH1cclxuXHJcbiAgc2V0TGFzdE9iamVjdDNEKGxhc3RPYmplY3QzRDogVGhyZWVKU09iamVjdDNEKSB7XHJcbiAgICB0aGlzLm9iamVjdDNEU2VydmljZS5sYXN0T2JqZWN0M0QgPSBsYXN0T2JqZWN0M0Q7XHJcbiAgfVxyXG5cclxuICBnZXRMYXN0T2JqZWN0M0QoKTogVGhyZWVKU09iamVjdDNEIHtcclxuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5sYXN0T2JqZWN0M0Q7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQZXJmb3JtcyBjYWxsYmFjayBhZnRlciBtYXR0ZXJ0YWcgcG9zaXRpb24gd2FzIHZhbGlkYXRlZCAoY3JlYXRpb24gb2Ygb2JqZWN0IG9yIHJlcG9zaXRpb25pbmcpXHJcbiAgICogQHBhcmFtIG1vZGUgTWF0dGVydGFnQWN0aW9uTW9kZVxyXG4gICAqL1xyXG4gIGNhbGxiYWNrQWZ0ZXJNYXR0ZXJ0YWdWYWxpZGF0aW9uKG1vZGU6IE1hdHRlcnRhZ0FjdGlvbk1vZGUpIHtcclxuICAgIHRoaXMudmlzaWJpbGl0eVNlcnZpY2UuZGV0YWlsU2hvd2luZy5uZXh0KHRydWUpO1xyXG4gICAgY29uc3QgbGFzdFRhZyA9IHRoaXMuZ2V0TGFzdFRhZygpO1xyXG4gICAgc3dpdGNoIChtb2RlKSB7XHJcbiAgICAgIGNhc2UgTWF0dGVydGFnQWN0aW9uTW9kZS5BRERfRVFVSVBNRU5UOlxyXG4gICAgICAgIHRoaXMuZ29Ub0xhc3RUYWcoKTtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYHZpc2l0LyR7dGhpcy5jdXJyZW50U3BhY2VJRH0vYWRkX2VxdWlwYF0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIE1hdHRlcnRhZ0FjdGlvbk1vZGUuQUREX1RJQ0tFVDpcclxuICAgICAgICB0aGlzLmdvVG9MYXN0VGFnKCk7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2B2aXNpdC8ke3RoaXMuY3VycmVudFNwYWNlSUR9L2FkZF90aWNrZXRgXSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTWF0dGVydGFnQWN0aW9uTW9kZS5BRERfT0JKRUNUM0Q6XHJcbiAgICAgICAgdGhpcy5nb1RvTGFzdFRhZygpO1xyXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgdmlzaXQvJHt0aGlzLmN1cnJlbnRTcGFjZUlEfS9hZGRfb2JqZWN0M2RgXSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTWF0dGVydGFnQWN0aW9uTW9kZS5BRERfREFUQTpcclxuICAgICAgICB0aGlzLmdvVG9MYXN0VGFnKCk7XHJcbiAgICAgICAgbGV0IHVybDogc3RyaW5nO1xyXG4gICAgICAgIGlmICh0aGlzLnJvdXRlci51cmwuaW5jbHVkZXMoJz8nKSkge1xyXG4gICAgICAgICAgdXJsID0gdGhpcy5yb3V0ZXIudXJsLnN1YnN0cmluZygwLCB0aGlzLnJvdXRlci51cmwuaW5kZXhPZignPycpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdXJsID0gdGhpcy5yb3V0ZXIudXJsO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYCR7dXJsfS9hZGRfZmVhdHVyZWBdKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBNYXR0ZXJ0YWdBY3Rpb25Nb2RlLkFERF9ERVNLOlxyXG4gICAgICAgIHRoaXMuZ29Ub0xhc3RUYWcoKTtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYHZpc2l0LyR7dGhpcy5jdXJyZW50U3BhY2VJRH0vYWRkX2ZlYXR1cmVgXSwge1xyXG4gICAgICAgICAgcXVlcnlQYXJhbXM6IHsgaXNEZXNrOiB0cnVlIH0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTWF0dGVydGFnQWN0aW9uTW9kZS5BRERfUk9PTTpcclxuICAgICAgICB0aGlzLmdvVG9MYXN0VGFnKCk7XHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2B2aXNpdC8ke3RoaXMuY3VycmVudFNwYWNlSUR9L2FkZF9yb29tYF0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIE1hdHRlcnRhZ0FjdGlvbk1vZGUuUE9TSVRJT05fT0JKRUNUM0Q6XHJcbiAgICAgICAgaWYgKGxhc3RUYWcpIHtcclxuICAgICAgICAgIC8vIERPIE5vdGhpbmcgKHJvdXRpbmcpLCBqdXN0XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShcclxuICAgICAgICAgICAgW2B2aXNpdC8ke3RoaXMuY3VycmVudFNwYWNlSUR9L29iamVjdDNkLyR7dGhpcy5sYXN0T2JqZWN0M0QuaWR9YF0sXHJcbiAgICAgICAgICAgIHsgcXVlcnlQYXJhbXM6IHsgcG9zaXRpb25pbmc6IHRydWUgfSB9XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBNYXR0ZXJ0YWdBY3Rpb25Nb2RlLlBPU0lUSU9OX1RJQ0tFVDpcclxuICAgICAgICBpZiAobGFzdFRhZykge1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoXHJcbiAgICAgICAgICAgIFtcclxuICAgICAgICAgICAgICBgdmlzaXQvJHt0aGlzLmN1cnJlbnRTcGFjZUlEfS9kZXRhaWwvJHt0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQobGFzdFRhZykuZWxlbWVudElEXHJcbiAgICAgICAgICAgICAgfWAsXHJcbiAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgIHsgcXVlcnlQYXJhbXM6IHsgcG9zaXRpb25pbmc6IHRydWUgfSB9XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBNYXR0ZXJ0YWdBY3Rpb25Nb2RlLlBPU0lUSU9OX0VRVUlQTUVOVDpcclxuICAgICAgICBpZiAobGFzdFRhZykge1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoXHJcbiAgICAgICAgICAgIFtcclxuICAgICAgICAgICAgICBgdmlzaXQvJHt0aGlzLmN1cnJlbnRTcGFjZUlEfS9lcXVpcC8ke3RoaXMuZGljdGlvbm5hcnlUYWdzLmdldChsYXN0VGFnKS5lbGVtZW50SURcclxuICAgICAgICAgICAgICB9YCxcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgeyBxdWVyeVBhcmFtczogeyBwb3NpdGlvbmluZzogdHJ1ZSB9IH1cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIE1hdHRlcnRhZ0FjdGlvbk1vZGUuUE9TSVRJT05fREFUQTpcclxuICAgICAgICBpZiAobGFzdFRhZykge1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHtcclxuICAgICAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5hY3RpdmVSb3V0ZSxcclxuICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHsgcG9zaXRpb25pbmc6IHRydWUgfSwgcXVlcnlQYXJhbXNIYW5kbGluZzogXCJtZXJnZVwiXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgTWF0dGVydGFnQWN0aW9uTW9kZS5QT1NJVElPTl9ST09NOlxyXG4gICAgICAgIGlmIChsYXN0VGFnKSB7XHJcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwge1xyXG4gICAgICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLmFjdGl2ZVJvdXRlLFxyXG4gICAgICAgICAgICBxdWVyeVBhcmFtczogeyBwb3NpdGlvbmluZzogdHJ1ZSB9LCBxdWVyeVBhcmFtc0hhbmRsaW5nOiBcIm1lcmdlXCJcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZ1bGx5IHVwZGF0ZXMgZXhpc3RpbmcgTWF0dGVydGFnIGNvbnRlbnQgd2l0aCBkYXRhIG9mIG9iamVjdCAoVGlja2V0LCBFcXVpcG1lbnQsIERlc2spXHJcbiAgICogQHBhcmFtIG1hdHRlcnRhZ0lEIHN0cmluZ1xyXG4gICAqIEBwYXJhbSBvYmplY3QgVGlja2V0LCBFcXVpcG1lbnQsIEZlYXR1cmUsIERlc2tcclxuICAgKiBAcGFyYW0gcG9pVHlwZSBQb2lUeXBlXHJcbiAgICogQHBhcmFtIHBvaSBQT0lcclxuICAgKi9cclxuICBhc3luYyBzZXRPYmplY3RBbmRQb2lJblRhZyhcclxuICAgIG1hdHRlcnRhZ0lEOiBzdHJpbmcsXHJcbiAgICBvYmplY3Q6IERiT2JqZWN0VHlwZSxcclxuICAgIHBvaVR5cGU6IFBvaVR5cGUsXHJcbiAgICBwb2k6IFBPSSB8IG51bGwgPSBudWxsXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQobWF0dGVydGFnSUQpLnNldE9iamVjdChvYmplY3QsIHBvaVR5cGUpO1xyXG4gICAgaWYgKHBvaSkge1xyXG4gICAgICB0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQobWF0dGVydGFnSUQpLnNldFBvaShwb2kpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3MuZ2V0KG1hdHRlcnRhZ0lEKS5lbGVtZW50SUQgPSBvYmplY3QuaWQ7XHJcbiAgICB0cnkge1xyXG4gICAgICBhd2FpdCB0aGlzLnVwZGF0ZU1hdHRlclRhZ0NvbnRlbnRGb3JUYWdJRChtYXR0ZXJ0YWdJRCwgb2JqZWN0LCBwb2lUeXBlKTtcclxuICAgICAgYXdhaXQgdGhpcy51cGRhdGVNYXR0ZXJUYWdQb3NJblNka1ZpZXdlcihcclxuICAgICAgICBtYXR0ZXJ0YWdJRCxcclxuICAgICAgICBvYmplY3QsXHJcbiAgICAgICAgcG9pVHlwZSxcclxuICAgICAgICBwb2lcclxuICAgICAgKTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgY29uc29sZS5sb2coYGVycm9yIGluIHNldE9iamVjdEFuZFBvaUluVGFnOiAke2V9YCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyB1cGRhdGVNYXR0ZXJUYWdQb3NJblNka1ZpZXdlcihcclxuICAgIG1hdHRlcnRhZ0lEOiBzdHJpbmcsXHJcbiAgICBvYmplY3Q6IERiT2JqZWN0VHlwZSxcclxuICAgIHBvaVR5cGU6IFBvaVR5cGUsXHJcbiAgICBwb2k6IFBPSSB8IG51bGwgPSBudWxsXHJcbiAgKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIXBvaSB8fCAhcG9pLmNvb3JkaW5hdGUpIHtcclxuICAgICAgY29uc29sZS53YXJuKCd1cGRhdGVNYXR0ZXJUYWdQb3NJblNka1ZpZXdlcjogcG9pIG9yIHBvaS5jb29yZGluYXRlIGlzIG1pc3NpbmcnLCBwb2kpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBJbmRleFRvVXBkYXRlID0gb2JqZWN0LnBvaXM/Lml0ZW1zID8gb2JqZWN0LnBvaXMuaXRlbXMuZmluZEluZGV4KCh1KSA9PiB1Py5pZCA9PT0gcG9pLmlkKSA6IC0xO1xyXG4gICAgaWYgKEluZGV4VG9VcGRhdGUgIT09IC0xICYmIG9iamVjdC5wb2lzPy5pdGVtcykge1xyXG4gICAgICBvYmplY3QucG9pcy5pdGVtc1tJbmRleFRvVXBkYXRlXSA9IHBvaTtcclxuICAgIH1cclxuICAgIGNvbnN0IHsgeCwgeSwgeiB9ID0gSlNPTi5wYXJzZShwb2kuY29vcmRpbmF0ZSk7XHJcbiAgICBjb25zdCBuZXdQb3NpdGlvbiA9IHtcclxuICAgICAgYW5jaG9yUG9zaXRpb246IHtcclxuICAgICAgICB4OiB4LFxyXG4gICAgICAgIHk6IHksXHJcbiAgICAgICAgejogeixcclxuICAgICAgfSxcclxuICAgICAgc3RlbVZlY3Rvcjoge1xyXG4gICAgICAgIC8vIG1ha2UgdGhlIFRhZyBzdGljayBzdHJhaWdodCB1cCBhbmQgbWFrZSBpdCAwLjMwIG1ldGVycyAofjEgZm9vdCkgdGFsbFxyXG4gICAgICAgIHg6IDAsXHJcbiAgICAgICAgeTogMC4zLFxyXG4gICAgICAgIHo6IDAsXHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5nZXRUYWdNb2R1bGUodGhpcy5zZGssIG1hdHRlcnRhZ0lEKS5lZGl0UG9zaXRpb24obWF0dGVydGFnSUQsIG5ld1Bvc2l0aW9uKTtcclxuICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzXHJcbiAgICAgIC5nZXQobWF0dGVydGFnSUQpXHJcbiAgICAgIC5zZXRQb3NpdGlvbihuZXdQb3NpdGlvbi5hbmNob3JQb3NpdGlvbik7XHJcblxyXG4gICAgZm9yIChsZXQgdGFnSWQgb2YgdGhpcy5tYXR0ZXJ0YWdJRHMpIHtcclxuICAgICAgY29uc3QgY3VycmVudFRhZyA9IHRoaXMuZGljdGlvbm5hcnlUYWdzLmdldCh0YWdJZCk7XHJcbiAgICAgIGlmICghY3VycmVudFRhZykge1xyXG4gICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChjdXJyZW50VGFnLmVsZW1lbnRJRCA9PT0gb2JqZWN0LmlkICYmIHRhZ0lkICE9PSBtYXR0ZXJ0YWdJRCkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZGVsZXRlTWF0dGVydGFnRnJvbUlkKHRoaXMuc2RrLCB0YWdJZCk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgbWF0dGVyVGFnSUQgYW5kIGl0cyBzd2VlcCBmb3IgYW4gb2JqZWN0IElEICh0aWNrZXQgSUQsIGV0YylcclxuICAgKiBAcGFyYW0gZWxlbWVudElEIHN0cmluZ1xyXG4gICAqIEByZXR1cm5zIHt0YWc6IHN0cmluZyB8IG51bGwsIHN3ZWVwOiBzdHJpbmcgfCBudWxsfVxyXG4gICAqL1xyXG4gIHB1YmxpYyBnZXRUYWdGcm9tRWxlbWVudElkKGVsZW1lbnRJRDogc3RyaW5nKTogeyB0YWc6IHN0cmluZyB8IG51bGw7IHN3ZWVwOiBzdHJpbmcgfCBudWxsIH0ge1xyXG4gICAgcmV0dXJuIHRoaXMubWF0dGVycG9ydFRhZ1NlcnZpY2UuZ2V0VGFnRnJvbUVsZW1lbnRJZChlbGVtZW50SUQsIHRoaXMuc3dlZXBzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgbGF0ZXN0IHRhZyBjcmVhdGVkIGluIHRoZSB2aXNpdCAod2hlbiBmb2xsb3dpbmcgdGhlIGN1cnNvciB0byBwb3NpdGlvbilcclxuICAgKiBAcmV0dXJucyBzdHJpbmcgbWF0dGVydGFnSURcclxuICAgKi9cclxuICBnZXRMYXN0VGFnKCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgaWYgKHRoaXMubWF0dGVydGFnVG9Gb2xsb3cpIHtcclxuICAgICAgcmV0dXJuIHRoaXMubWF0dGVydGFnVG9Gb2xsb3c7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5tYXR0ZXJ0YWdJRHMubGVuZ3RoID09PSAwXHJcbiAgICAgICAgPyBudWxsXHJcbiAgICAgICAgOiB0aGlzLm1hdHRlcnRhZ0lEc1t0aGlzLm1hdHRlcnRhZ0lEcy5sZW5ndGggLSAxXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgTWF0dGVydGFnRGF0YSBmb3IgTWF0dGVydGFnIChyZXBsYWNlcyBnZXRUYWdEYXRhRnJvbUlkKVxyXG4gICAqIEBwYXJhbSBtYXR0ZXJ0YWdJRFxyXG4gICAqIEByZXR1cm5zIE1hdHRlcnRhZ0RhdGFcclxuICAgKi9cclxuICBnZXRNYXR0ZXJUYWdEYXRhRm9yTWF0dGVydGFnKG1hdHRlcnRhZ0lEOiBzdHJpbmcpOiBNYXR0ZXJ0YWdEYXRhIHwgbnVsbCB7XHJcbiAgICB0cnkge1xyXG4gICAgICByZXR1cm4gdGhpcy5kaWN0aW9ubmFyeVRhZ3MuZ2V0KG1hdHRlcnRhZ0lEKTtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICBjb25zb2xlLmxvZygnY2Fubm90IHJldHJpZXZlIG1hdHRlcnRhZ0RhdGEgZm9yIHRhZycsIG1hdHRlcnRhZ0lEKTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy9cclxuICAvLyAtLS0tLS0tLS0tIFZpZXdzIChmdXJuaXNoZWQgLyBkZWZ1cm5pc2hlZCkgLS0tLS0tLS0tLVxyXG4gIC8vXHJcblxyXG4gIC8qKlxyXG4gICAqIFN1YnNjcmliZXMgdG8gdGhlIFNESyBWaWV3IEFQSSB0byBrZWVwIHRyYWNrIG9mIHRoZSB2aWV3cyBhdmFpbGFibGUgZm9yIHRoZSBzcGFjZVxyXG4gICAqIGFuZCBvZiB0aGUgYWN0aXZlIG9uZS4gVGFncyBsaXZlIGluIGEgc2hhcmVkIGNvbW1vbiBsYXllciwgc28gYSB2aWV3IGNoYW5nZSBvbmx5XHJcbiAgICogcmVxdWlyZXMgcmUtYXBwbHlpbmcgdGhlaXIgdmlzaWJpbGl0eSwgbmV2ZXIgcmUtY3JlYXRpbmcgdGhlbS5cclxuICAgKi9cclxuICBwcml2YXRlIGluaXRWaWV3cygpOiB2b2lkIHtcclxuICAgIHRoaXMuY2xlYXJWaWV3U3Vic2NyaXB0aW9ucygpO1xyXG4gICAgdGhpcy52aWV3c0J5VHlwZS5jbGVhcigpO1xyXG4gICAgdGhpcy5jdXJyZW50VmlldyA9IG51bGw7XHJcblxyXG4gICAgaWYgKCF0aGlzLnNkaz8uVmlldz8udmlld3MpIHtcclxuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ1tNYXR0ZXJwb3J0U2VydmljZV0gVmlldyBBUEkgdW5hdmFpbGFibGUgb24gdGhpcyBTREsgdmVyc2lvbicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy52aWV3U3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICB0aGlzLnNkay5WaWV3LnZpZXdzLnN1YnNjcmliZSh7XHJcbiAgICAgICAgb25Db2xsZWN0aW9uVXBkYXRlZDogKGNvbGxlY3Rpb246IE1hdHRlcnBvcnRWaWV3Q29sbGVjdGlvbikgPT4ge1xyXG4gICAgICAgICAgLy8gU0RLIGNhbGxiYWNrcyBydW4gb3V0c2lkZSBBbmd1bGFyOiByZS1lbnRlciB0aGUgem9uZSBzbyB0aGUgdmlld3MgbWFkZVxyXG4gICAgICAgICAgLy8gYXZhaWxhYmxlIGhlcmUgKGRlZnVybmlzaCBidXR0b24uLi4pIGFyZSBwaWNrZWQgdXAgYnkgY2hhbmdlIGRldGVjdGlvbi5cclxuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMudmlld3NCeVR5cGUuY2xlYXIoKTtcclxuICAgICAgICAgICAgZm9yIChjb25zdCB2aWV3IG9mIE9iamVjdC52YWx1ZXMoY29sbGVjdGlvbikpIHtcclxuICAgICAgICAgICAgICB0aGlzLnZpZXdzQnlUeXBlLnNldCh2aWV3LnR5cGUsIHZpZXcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIC8vIFZpZXdzIGFyZSBkaXNjb3ZlcmVkIHByb2dyZXNzaXZlbHk6IG1ha2Ugc3VyZSBlYWNoIG9uZSBjYXJyaWVzIHRoZSBzaGFyZWRcclxuICAgICAgICAgIC8vIHRhZyBsYXllciwgb3RoZXJ3aXNlIGl0cyB0YWdzIHdvdWxkIG5vdCBleGlzdCBpbiB0aGF0IHZpZXcuXHJcbiAgICAgICAgICB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLmF0dGFjaFNoYXJlZFRhZ0xheWVyVG9WaWV3cyh0aGlzLnNkaywgT2JqZWN0LnZhbHVlcyhjb2xsZWN0aW9uKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy52aWV3U3Vic2NyaXB0aW9ucy5wdXNoKFxyXG4gICAgICB0aGlzLnNkay5WaWV3LmN1cnJlbnQuc3Vic2NyaWJlKCh2aWV3OiBNYXR0ZXJwb3J0VmlldykgPT4ge1xyXG4gICAgICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLmN1cnJlbnRWaWV3Py5pZCAhPT0gdmlldz8uaWQ7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VmlldyA9IHZpZXc7XHJcbiAgICAgICAgaWYgKCFjaGFuZ2VkKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5yZXN0b3JlVGFnc0ZvckFjdGl2ZVZpZXcodmlldyk7XHJcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMub25WaWV3Q2hhbmdlZC5uZXh0KHZpZXcpKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGb3JjZXMgdGhlIG9wYWNpdHkvZW5hYmxlZCBzdGF0ZSB0byBiZSBwdXNoZWQgYWdhaW4gdG8gZXZlcnkgdGFnLiBUaGUgU0RLXHJcbiAgICogcmUtcmVuZGVycyB0aGUgc2hhcmVkIGxheWVyJ3MgdGFncyBvbiBhIHZpZXcgc3dhcCwgYW5kIHRoZSBtZW1vaXplZCB2YWx1ZXMgd291bGRcclxuICAgKiBvdGhlcndpc2UgbWFrZSB1cGRhdGVUYWdzVmlzaWJpbGl0eUZvckNvbnRleHQoKSBza2lwIHRoZW0sIGxlYXZpbmcgdGFncyBpbnZpc2libGUuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZWFwcGx5VGFnc1Zpc2liaWxpdHkoKTogdm9pZCB7XHJcbiAgICB0aGlzLm1hdHRlcnBvcnRUYWdTZXJ2aWNlLnJlc2V0VmlzaWJpbGl0eUNhY2hlKCk7XHJcbiAgICB0aGlzLnJlZnJlc2hUYWdzVmlzaWJpbGl0eSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHV0cyB0aGUgdGFncyBiYWNrIGluIHNoYXBlIGluIHRoZSB2aWV3IHRoYXQganVzdCBiZWNhbWUgYWN0aXZlLlxyXG4gICAqXHJcbiAgICogQWN0aXZhdGluZyBhIHZpZXcgcmUtbWF0ZXJpYWxpemVzIHRoZSBzaGFyZWQgbGF5ZXIncyB0YWdzIGZyb20gdGhlIGRlc2NyaXB0b3JzXHJcbiAgICogcmVjb3JkZWQgd2hlbiB0aGV5IHdlcmUgYWRkZWQsIHNvIGV2ZXJ5dGhpbmcgYXBwbGllZCB0byBhIHRhZyAqYWZ0ZXJ3YXJkcyogdGhyb3VnaFxyXG4gICAqIHRoZSBnbG9iYWwgVGFnIG1vZHVsZSBpcyBkcm9wcGVkIGFsb25nIHRoZSB3YXk6IHRoZSBjdXN0b20gaWNvbiAodGhlIHBpbiBmYWxscyBiYWNrXHJcbiAgICogdG8gdGhlIGRlc2NyaXB0b3IncyB3aGl0ZSkgYW5kIHRoZSBzYW5kYm94IGNhcnJ5aW5nIHRoZSBob3ZlciBjb250ZW50LiBUaGV5IGhhdmUgdG9cclxuICAgKiBiZSBhcHBsaWVkIGFnYWluIG9uIHRoZSBmcmVzaGx5IHJlYnVpbHQgdGFncy5cclxuICAgKlxyXG4gICAqIFZpc2liaWxpdHkgaXMgcmVmcmVzaGVkIHN0cmFpZ2h0IGF3YXkgc28gdGhlIHRhZ3Mgc2hvdyB1cCB3aXRob3V0IHdhaXRpbmcsIHRoZW5cclxuICAgKiBjb250ZW50IGlzIHJlLWFwcGxpZWQgb25jZSB0aGUgdHJhbnNpdGlvbiBpcyBvdmVyIOKAlCByZS1hcHBseWluZyBpdCB0b28gZWFybHkgd291bGRcclxuICAgKiB0YXJnZXQgdGFncyB0aGUgU0RLIGhhcyBub3QgcmVidWlsdCB5ZXQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZXN0b3JlVGFnc0ZvckFjdGl2ZVZpZXcodmlldzogTWF0dGVycG9ydFZpZXcpOiB2b2lkIHtcclxuICAgIC8vIEEgdmlldyBvbmx5IG1hdGVyaWFsaXplcyBpdHMgbGF5ZXJzIG9uY2UgYWN0aXZhdGVkOiAocmUpYXR0YWNoIHRoZSBzaGFyZWQgb25lLlxyXG4gICAgdGhpcy5tYXR0ZXJwb3J0VGFnU2VydmljZS5hdHRhY2hTaGFyZWRUYWdMYXllclRvVmlld3ModGhpcy5zZGssIFt2aWV3XSlcclxuICAgICAgLnRoZW4oKCkgPT4gdGhpcy5yZWFwcGx5VGFnc1Zpc2liaWxpdHkoKSk7XHJcbiAgICB0aGlzLnJlYXBwbHlUYWdzVmlzaWJpbGl0eSgpO1xyXG5cclxuICAgIGNsZWFyVGltZW91dCh0aGlzLnZpZXdTd2l0Y2hSZXN0b3JlVGltZXIpO1xyXG4gICAgdGhpcy52aWV3U3dpdGNoUmVzdG9yZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMucmVmcmVzaFRhZ3NDb250ZW50KClcclxuICAgICAgICAuY2F0Y2goKGUpID0+IHtcclxuICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFNlcnZpY2VdIENhbm5vdCByZXN0b3JlIHRhZ3MgZm9yIHZpZXcnLCB2aWV3Py5pZCwgZSk7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLnJlYXBwbHlUYWdzVmlzaWJpbGl0eSgpKTtcclxuICAgIH0sIE1hdHRlcnBvcnRTZXJ2aWNlLlZJRVdfU1dJVENIX1JFRlJFU0hfREVMQVlfTVMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmUtYXBwbGllcyB0aGUgaWNvbiBhbmQgdGhlIGluamVjdGVkIEhUTUwgb2YgZXZlcnkgdGFnIHdlIG93bi4gVXNlZCBhZnRlciBhIHZpZXdcclxuICAgKiBzd2l0Y2gsIHNlZSByZXN0b3JlVGFnc0ZvckFjdGl2ZVZpZXcoKS5cclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIHJlZnJlc2hUYWdzQ29udGVudCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghdGhpcy5zZGspIHJldHVybjtcclxuXHJcbiAgICAvLyBTbmFwc2hvdDogdGhlIGRpY3Rpb25hcnkgY2FuIGJlIG11dGF0ZWQgd2hpbGUgdGhlIGF3YWl0cyBiZWxvdyBhcmUgcGVuZGluZy5cclxuICAgIGZvciAoY29uc3QgW3NpZCwgbWF0dGVydGFnRGF0YV0gb2YgWy4uLnRoaXMuZGljdGlvbm5hcnlUYWdzXSkge1xyXG4gICAgICBpZiAoc2lkID09PSB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93KSBjb250aW51ZTtcclxuICAgICAgYXdhaXQgdGhpcy5zZXRUYWdJY29uQW5kT3BhY2l0eShzaWQsIG1hdHRlcnRhZ0RhdGEpO1xyXG4gICAgICB0aGlzLmluamVjdEh0bWxJblRhZyhtYXR0ZXJ0YWdEYXRhLmdldFR5cGUoKSwgbWF0dGVydGFnRGF0YS5nZXRPYmplY3QoKSwgc2lkKVxyXG4gICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignW01hdHRlcnBvcnRTZXJ2aWNlXSBIVE1MIHJlLWluamVjdGlvbiBmYWlsZWQgZm9yJywgc2lkLCBlcnIpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGVhclZpZXdTdWJzY3JpcHRpb25zKCk6IHZvaWQge1xyXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudmlld1N3aXRjaFJlc3RvcmVUaW1lcik7XHJcbiAgICB0aGlzLnZpZXdTd2l0Y2hSZXN0b3JlVGltZXIgPSBudWxsO1xyXG4gICAgZm9yIChjb25zdCBzdWJzY3JpcHRpb24gb2YgdGhpcy52aWV3U3Vic2NyaXB0aW9ucykge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIHN1YnNjcmlwdGlvbi5jYW5jZWwoKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFNlcnZpY2VdIENhbm5vdCBjYW5jZWwgdmlldyBzdWJzY3JpcHRpb24nLCBlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy52aWV3U3Vic2NyaXB0aW9ucyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRydWUgd2hlbiB0aGUgc3BhY2UgcHJvdmlkZXMgYSBkZWZ1cm5pc2hlZCB2aWV3LiAqL1xyXG4gIGdldCBoYXNEZWZ1cm5pc2hWaWV3KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudmlld3NCeVR5cGUuaGFzKE1hdHRlcnBvcnRWaWV3VHlwZS5ERUZVUk5JU0gpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRydWUgd2hlbiB0aGUgZGVmdXJuaXNoZWQgdmlldyBpcyB0aGUgYWN0aXZlIG9uZS4gKi9cclxuICBnZXQgaXNEZWZ1cm5pc2hlZFZpZXcoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50Vmlldz8udHlwZSA9PT0gTWF0dGVycG9ydFZpZXdUeXBlLkRFRlVSTklTSDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN3aXRjaGVzIGJldHdlZW4gdGhlIGRlZnVybmlzaGVkIHZpZXcgYW5kIHRoZSBmdXJuaXNoZWQgb25lLlxyXG4gICAqIEBwYXJhbSByZXR1cm5Ub1N0YXJ0IE1vdmUgdGhlIGNhbWVyYSBiYWNrIHRvIHRoZSB2aWV3J3Mgc3RhcnQgbG9jYXRpb24uXHJcbiAgICovXHJcbiAgYXN5bmMgdG9nZ2xlRGVmdXJuaXNoVmlldyhyZXR1cm5Ub1N0YXJ0OiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuaXNEZWZ1cm5pc2hlZFZpZXdcclxuICAgICAgPyB0aGlzLnZpZXdzQnlUeXBlLmdldChNYXR0ZXJwb3J0Vmlld1R5cGUuTEFZRVJFRF9CQVNFKSA/PyB0aGlzLnZpZXdzQnlUeXBlLmdldChNYXR0ZXJwb3J0Vmlld1R5cGUuQkFTRSlcclxuICAgICAgOiB0aGlzLnZpZXdzQnlUeXBlLmdldChNYXR0ZXJwb3J0Vmlld1R5cGUuREVGVVJOSVNIKTtcclxuXHJcbiAgICBpZiAoIXRhcmdldCkge1xyXG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignW01hdHRlcnBvcnRTZXJ2aWNlXSBObyB0YXJnZXQgdmlldyB0byBzd2l0Y2ggdG8nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgYXdhaXQgdGFyZ2V0LnNldEFjdGl2ZShyZXR1cm5Ub1N0YXJ0KTtcclxuICB9XHJcblxyXG4gIC8vXHJcbiAgLy8gLS0tLS0tLS0tLSBWaWV3ZXIgcmVsYXRlZCAoc3dpdGNoIHZpZXdzLCBnbyB0bykgLS0tLS0tLS0tLVxyXG4gIC8vXHJcbiAgYXN5bmMgYWN0aW9uX3Rvb2xib3hfZmxvb3JwbGFuKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuYWN0aW9uX3Rvb2xib3hfZmxvb3JwbGFuKHRoaXMuc2RrKTtcclxuICB9XHJcblxyXG4gIGFjdGlvbl90b29sYm94X2luc2lkZV92aWV3KCkge1xyXG4gICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5hY3Rpb25fdG9vbGJveF9pbnNpZGVfdmlldyh0aGlzLnNkayk7XHJcbiAgfVxyXG5cclxuICBhY3Rpb25TaG93QWxsRmxvb3JzKCkge1xyXG4gICAgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5hY3Rpb25TaG93QWxsRmxvb3JzKHRoaXMuc2RrKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGFjdGlvbl90b29sYm94X2RvbGxob3VzZSgpIHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmFjdGlvbl90b29sYm94X2RvbGxob3VzZSh0aGlzLnNkayk7XHJcbiAgfVxyXG5cclxuICBhY3Rpb25fdG9vbGJveF9tZXN1cmUoKSB7XHJcbiAgICBjb25zdCBuZXdTdGF0ZSA9ICF0aGlzLmlzTWVhc3VyZU1vZGVPbjtcclxuICAgIHRoaXMuc2RrLk1lYXN1cmVtZW50cy50b2dnbGVNb2RlKG5ld1N0YXRlKS50aGVuKCgpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgYE1lYXN1cmVtZW50IG1vZGUgaXMgbm93ICR7bmV3U3RhdGUgPyAnZW5hYmxlZCcgOiAnZGlzYWJsZWQnfWBcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYWN0aW9uX3Rvb2xib3hfY2FuY2VsX21lc3VyZSgpIHtcclxuICAgIGlmICh0aGlzLmlzTWVhc3VyZU1vZGVPbikge1xyXG4gICAgICB0aGlzLmFjdGlvbl90b29sYm94X21lc3VyZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWN0aW9uX2dvX3RvX2Zsb29yKFxyXG4gICAgZmxvb3JOYW1lOiBzdHJpbmcsXHJcbiAgICBtYXR0ZXJwb3J0Rmxvb3JTZXF1ZW5jZTogbnVtYmVyID0gbnVsbFxyXG4gICkge1xyXG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UuYWN0aW9uX2dvX3RvX2Zsb29yKHRoaXMuc2RrLCBmbG9vck5hbWUsIG1hdHRlcnBvcnRGbG9vclNlcXVlbmNlKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGFjdGlvbl9nb190b19zd2VlcChzd2VlcDogc3RyaW5nLCByb3RhdGlvbj86IHsgeDogbnVtYmVyLCB5OiBudW1iZXIgfSB8IG51bGwpIHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmFjdGlvbl9nb190b19zd2VlcCh0aGlzLnNkaywgc3dlZXAsIHJvdGF0aW9uKTtcclxuICB9XHJcblxyXG4gIGdldEN1cnJlbnRTd2VlcCgpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmdldEN1cnJlbnRTd2VlcCh0aGlzLnBvc2VDYW1lcmEpO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q3VycmVudENhbWVyYVBvc2l0aW9uKCk6IHtcclxuICAgIHJvdGF0aW9uOiBhbnk7XHJcbiAgICBwb3NpdGlvbjogYW55O1xyXG4gICAgc3dlZXA6IGFueTtcclxuICB9IHwgbnVsbCB7XHJcbiAgICBpZiAodGhpcy5wb3NlQ2FtZXJhKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnBvc2VDYW1lcmE7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHNldEludGVyYWN0aW9uTW9kZShpbnRlcmFjdGlvbk1vZGU6IG51bWJlcikge1xyXG4gICAgdGhpcy5pbnRlcmFjdGlvbk1vZGUgPSBpbnRlcmFjdGlvbk1vZGU7XHJcbiAgfVxyXG5cclxuICBnZXRJbnRlcmFjdGlvbk1vZGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5pbnRlcmFjdGlvbk1vZGU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciBhbGwgdmFyaWFibGVzLCBkZWxldGVzIGFsbCB0YWdzICh3aGVuIHZpZXdlciBpcyByZW1vdmVyIG9yIG1vZGVsIGNoYW5nZWQ9cmVsb2FkIG5lZWRlZClcclxuICAgKi9cclxuICBhc3luYyBjbGVhckFsbCgpIHtcclxuICAgIGNvbnNvbGUubG9nKCdyZW1vdmluZyB2aWV3ZXInKTtcclxuICAgIHRoaXMuY2xlYXJWaWV3U3Vic2NyaXB0aW9ucygpO1xyXG4gICAgdGhpcy52aWV3c0J5VHlwZS5jbGVhcigpO1xyXG4gICAgdGhpcy5jdXJyZW50VmlldyA9IG51bGw7XHJcbiAgICBhd2FpdCB0aGlzLmFjdGlvbl9kZWxldGVfYWxsX21hdHRlcnRhZ3MoKTtcclxuICAgIHRoaXMuZmxvb3JzID0gbnVsbDtcclxuICAgIHRoaXMuc3dlZXBzID0gbnVsbDtcclxuICAgIHRoaXMuc2RrID0gbnVsbDtcclxuXHJcbiAgICB0aGlzLnBvaW50ZXJTZXJ2aWNlLmNsZWFyKHtcclxuICAgICAgb25MZWZ0Q2xpY2s6IHRoaXMucG9pbnRlckxlZnRDbGlja0hhbmRsZXIuYmluZCh0aGlzKSxcclxuICAgICAgb25SaWdodENsaWNrOiB0aGlzLnBvaW50ZXJSaWdodENsaWNrSGFuZGxlci5iaW5kKHRoaXMpLFxyXG4gICAgICBvbk1pZGRsZUNsaWNrOiB0aGlzLnBvaW50ZXJNaWRkbGVDbGlja0hhbmRsZXIuYmluZCh0aGlzKSxcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZm9yYmlkZGVuU3dlZXBzID0gW107XHJcbiAgfVxyXG5cclxuICBhc3luYyByZW1vdmVGb3JiaWRkZW5Td2VlcHMoZm9yYmlkZGVuU3dlZXBzOiBzdHJpbmdbXSkge1xyXG4gICAgcmV0dXJuIHRoaXMubmF2aWdhdGlvblNlcnZpY2UucmVtb3ZlRm9yYmlkZGVuU3dlZXBzKHRoaXMuc2RrLCBmb3JiaWRkZW5Td2VlcHMpO1xyXG4gIH1cclxuXHJcbiAgLy9cclxuICAvLyAtLS0tLS0tLS0tIDNEIG9iamVjdHMgKFNESyBCdW5kbGUgb25seSkgLS0tLS0tLS0tLVxyXG4gIC8vXHJcbiAgYXN5bmMgaW5pdDNET2JqZWN0Vmlld2VyKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmluaXQzRE9iamVjdFZpZXdlcih0aGlzLnNkayk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBhZGQzRE9iamVjdChcclxuICAgIG9iajogSU9iamVjdDNELFxyXG4gICAgbW9kZT86ICd0cmFuc2xhdGUnIHwgJ3JvdGF0ZSdcclxuICApOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmFkZDNET2JqZWN0KHRoaXMuc2RrLCBvYmosIG1vZGUpO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlT2JqZWN0VmlzaWJpbGl0eShvYmplY3RJZDogYW55KSB7XHJcbiAgICB0aGlzLm9iamVjdDNEU2VydmljZS50b2dnbGVPYmplY3RWaXNpYmlsaXR5KG9iamVjdElkKTtcclxuICB9XHJcblxyXG4gIGlzT2JqZWN0VmlzaWJsZShvYmplY3RJZDogYW55KTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UuaXNPYmplY3RWaXNpYmxlKG9iamVjdElkKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHBvaW50Q2FtZXJhVG8zRE9iamVjdChvYmplY3RJZDogYW55KSB7XHJcbiAgICByZXR1cm4gdGhpcy5vYmplY3QzRFNlcnZpY2UucG9pbnRDYW1lcmFUbzNET2JqZWN0KFxyXG4gICAgICB0aGlzLnNkayxcclxuICAgICAgb2JqZWN0SWQsXHJcbiAgICAgIHRoaXMuY3JlYXRlTWF0dGVydGFnRnJvbVBPSS5iaW5kKHRoaXMpLFxyXG4gICAgICB0aGlzLmdvVG9UYWcuYmluZCh0aGlzKSxcclxuICAgICAgdGhpcy5kZWxldGVMYXN0TWF0dGVydGFnLmJpbmQodGhpcyksXHJcbiAgICAgIHRoaXMuZ2V0VGFnRnJvbUVsZW1lbnRJZC5iaW5kKHRoaXMpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0U2NlbmVOb2RlRnJvbU9iamVjdDNESWQodXVpZDogc3RyaW5nKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLm9iamVjdDNEU2VydmljZS5nZXRTY2VuZU5vZGVGcm9tT2JqZWN0M0RJZCh1dWlkKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGRpc3BsYXlBemltdXRhbENyb3duKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmRpc3BsYXlBemltdXRhbENyb3duKHRoaXMucG9zZUNhbWVyYSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBhdHRhY2hHaXptb0NvbnRyb2xUbzNET2JqZWN0KFxyXG4gICAgbW9kZWxOb2RlOiBhbnksXHJcbiAgICBzY2VuZU9iamVjdDogYW55LFxyXG4gICAgbW9kZTogJ3RyYW5zbGF0ZScgfCAncm90YXRlJyB8ICdzY2FsZScsXHJcbiAgICB2aXNpYmxlOiBib29sZWFuLFxyXG4gICAgaXNOZXdPYmplY3Q6IGJvb2xlYW5cclxuICApOiBQcm9taXNlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMub2JqZWN0M0RTZXJ2aWNlLmF0dGFjaEdpem1vQ29udHJvbFRvM0RPYmplY3QodGhpcy5zZGssIG1vZGVsTm9kZSwgc2NlbmVPYmplY3QsIG1vZGUsIHZpc2libGUsIGlzTmV3T2JqZWN0KTtcclxuICB9XHJcblxyXG4gIHJlbW92ZUdpem1vRnJvbUxhc3RPYmplY3QoKTogdm9pZCB7XHJcbiAgICB0aGlzLm9iamVjdDNEU2VydmljZS5yZW1vdmVHaXptb0Zyb21MYXN0T2JqZWN0KCk7XHJcbiAgfVxyXG5cclxuICB0b2dnbGVWaWV3RnJ1c3R1bSgpOiB2b2lkIHtcclxuICAgIHRoaXMub2JqZWN0M0RTZXJ2aWNlLnRvZ2dsZVZpZXdGcnVzdHVtKCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|