@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.
@@ -7,6 +7,8 @@ import * as i0 from "@angular/core";
7
7
  import * as i1 from "./matterport-navigation.service";
8
8
  export class MatterportTagService {
9
9
  navigationService;
10
+ /** Name of the common layer every Smarterplan tag is created in. */
11
+ static SHARED_TAG_LAYER_NAME = 'smarterplan-shared-tags';
10
12
  dictionnaryTags = new Map();
11
13
  tagAddQueue = Promise.resolve();
12
14
  mattertagToFollow = null;
@@ -17,6 +19,22 @@ export class MatterportTagService {
17
19
  tagService = null;
18
20
  tagsCurrentOpacity = new Map();
19
21
  tagsCurrentEnabled = new Map();
22
+ /**
23
+ * Single layer holding every Smarterplan tag, added to every view of the space so a
24
+ * tag stays in place — same sid, same content — when the user switches between the
25
+ * furnished and the Defurnished view. Tags added to the global sdk.Tag (or to a
26
+ * view's own layer) belong to that view only, which is what made them pop in and out
27
+ * on every view change.
28
+ *
29
+ * Deliberately NOT created with `{ common: true }`: in SDK 26.7.5 a common layer is
30
+ * pushed into `getOrderedModelViews()` at creation time, and that call defaults to
31
+ * `includeDefurnish: false`, so the Defurnished view never receives it — while
32
+ * `View.addLayer()` refuses to repair it ("Layer is common. No need to add."). A
33
+ * plain layer we attach to each view ourselves reaches every view, Defurnished
34
+ * included. See attachSharedTagLayerToViews().
35
+ */
36
+ sharedTagLayer = null;
37
+ sharedTagLayerPromise = null;
20
38
  constructor(navigationService) {
21
39
  this.navigationService = navigationService;
22
40
  }
@@ -29,6 +47,7 @@ export class MatterportTagService {
29
47
  return;
30
48
  try {
31
49
  this.onGoToTag.next(sid);
50
+ // `open` only exists on the global Tag module, never on a layer-scoped one.
32
51
  await sdk.Tag.open(sid);
33
52
  }
34
53
  catch (e) {
@@ -36,6 +55,102 @@ export class MatterportTagService {
36
55
  console.warn('Cannot open tag', sid, e);
37
56
  }
38
57
  }
58
+ /**
59
+ * Returns the SDK Tag module to use for an operation addressing an existing tag by ID
60
+ * (icon, opacity, position, attachments, removal...): always the global sdk.Tag.
61
+ *
62
+ * A layer-scoped Tag module only exposes the *replayable* mutations, meant to build
63
+ * the layer's own content; applying them to an already-created tag silently does
64
+ * nothing — which is what left every pin white instead of carrying its icon. Only
65
+ * `add` has to go through the layer, see getTagCreationModule().
66
+ */
67
+ getTagModule(sdk, tagId) {
68
+ return sdk?.Tag;
69
+ }
70
+ /**
71
+ * Returns the Tag module every new tag must be created through: the shared layer
72
+ * when the View API is available, the global sdk.Tag otherwise.
73
+ */
74
+ async getTagCreationModule(sdk) {
75
+ const layer = await this.ensureSharedTagLayer(sdk);
76
+ return layer?.Tag || sdk?.Tag;
77
+ }
78
+ /**
79
+ * Creates (once per SDK session) and returns the shared tag layer.
80
+ * Resolves to null when the View API is unavailable, so callers transparently fall
81
+ * back to the global sdk.Tag.
82
+ */
83
+ async ensureSharedTagLayer(sdk) {
84
+ if (this.sharedTagLayer)
85
+ return this.sharedTagLayer;
86
+ if (!sdk?.View?.createLayer)
87
+ return null;
88
+ if (!this.sharedTagLayerPromise) {
89
+ this.sharedTagLayerPromise = Promise.resolve(sdk.View.createLayer(MatterportTagService.SHARED_TAG_LAYER_NAME))
90
+ .then(async (layer) => {
91
+ this.sharedTagLayer = layer;
92
+ // A freshly created layer can come back toggled off, which hides its tags.
93
+ if (layer && layer.toggled === false) {
94
+ await layer.toggle(true).catch(() => { });
95
+ }
96
+ return layer;
97
+ })
98
+ .catch((e) => {
99
+ // Allow a later retry (e.g. the SDK was not fully ready yet).
100
+ this.sharedTagLayerPromise = null;
101
+ if (isDevMode())
102
+ console.warn('[MatterportTagService] Could not create the shared tag layer', e);
103
+ return null;
104
+ });
105
+ }
106
+ return this.sharedTagLayerPromise;
107
+ }
108
+ /**
109
+ * Makes sure the shared layer is part of every view of the space, Defurnished
110
+ * included. This is what actually shares the tags across views, and the reason the
111
+ * layer must not be a common one: the SDK only performs the attachment for
112
+ * non-common layers. Idempotent, so it can run on every view collection update.
113
+ */
114
+ async attachSharedTagLayerToViews(sdk, views) {
115
+ const layer = await this.ensureSharedTagLayer(sdk);
116
+ if (!layer)
117
+ return;
118
+ for (const view of views) {
119
+ if (!view?.addLayer || view.hasLayer?.(layer))
120
+ continue;
121
+ try {
122
+ await view.addLayer(layer);
123
+ }
124
+ catch (e) {
125
+ if (isDevMode())
126
+ console.warn('[MatterportTagService] Cannot add the shared tag layer to view', view?.id, e);
127
+ }
128
+ }
129
+ }
130
+ /**
131
+ * Adds a tag through the shared layer so it exists in every view. Falls back
132
+ * to the global sdk.Tag when the View API is unavailable; that call is raced against
133
+ * a timeout as a safety net, since it never resolves while a Defurnished view is
134
+ * active.
135
+ */
136
+ async addTagToSdk(sdk, descriptor) {
137
+ const sharedTagModule = await this.getTagCreationModule(sdk);
138
+ try {
139
+ const sidList = (await Promise.race([
140
+ sharedTagModule.add(descriptor),
141
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Tag.add timed out')), 4000)),
142
+ ]));
143
+ if (sidList?.length)
144
+ return sidList[0];
145
+ }
146
+ catch (error) {
147
+ if (error?.message?.includes('already in use'))
148
+ throw error;
149
+ if (isDevMode())
150
+ console.warn('[MatterportTagService] Tag.add failed/timed out', error?.message);
151
+ }
152
+ return null;
153
+ }
39
154
  /** Opens the most recently created tag in the viewer. */
40
155
  async goToLastTag(sdk) {
41
156
  if (!sdk || this.mattertagIDs.length === 0)
@@ -50,36 +165,40 @@ export class MatterportTagService {
50
165
  async addMattertagToViewer(sdk, mattertagData) {
51
166
  if (!sdk)
52
167
  return null;
53
- console.log('---------------');
54
- console.log('element id ' + mattertagData.elementID);
55
- console.log('position: ', mattertagData.getPosition());
56
- console.log('rotation: ', mattertagData.getRotation());
57
- console.log('sweep id: ', mattertagData.getSweepID());
58
- console.log('---------------');
59
- this.tagAddQueue = this.tagAddQueue.then(async () => {
60
- const data = mattertagData.getData();
61
- const existingId = data?.id || null;
168
+ this.tagAddQueue = this.tagAddQueue
169
+ .then(async () => {
170
+ const descriptor = mattertagData.getMattertagDescriptor()[0];
171
+ const existingId = descriptor?.id || null;
62
172
  try {
63
- const sidList = await sdk.Tag.add(data);
64
- if (sidList && sidList.length > 0) {
65
- const mattertagID = sidList[0];
66
- this.mattertagIDs.push(mattertagID);
67
- this.dictionnaryTags.set(mattertagID, mattertagData);
68
- return mattertagID;
173
+ const sid = await this.addTagToSdk(sdk, descriptor);
174
+ if (sid) {
175
+ mattertagData.setMatterportSid(sid);
176
+ if (!this.mattertagIDs.includes(sid)) {
177
+ this.mattertagIDs.push(sid);
178
+ }
179
+ this.dictionnaryTags.set(sid, mattertagData);
180
+ return sid;
69
181
  }
182
+ if (isDevMode())
183
+ console.warn('[MatterportTagService] Tag.add returned no sid', descriptor);
70
184
  }
71
185
  catch (error) {
72
186
  if (error?.message?.includes('already in use') && existingId) {
73
187
  if (!this.dictionnaryTags.has(existingId)) {
74
188
  this.mattertagIDs.push(existingId);
75
- this.dictionnaryTags.set(existingId, mattertagData);
76
189
  }
190
+ this.dictionnaryTags.set(existingId, mattertagData);
77
191
  return existingId;
78
192
  }
79
193
  if (isDevMode())
80
- console.warn('Failed to add tag to viewer', error);
194
+ console.warn('[MatterportTagService] addMattertagToViewer failed', error);
81
195
  }
82
196
  return null;
197
+ })
198
+ .catch((e) => {
199
+ if (isDevMode())
200
+ console.warn('[MatterportTagService] tagAddQueue rejected', e);
201
+ return null;
83
202
  });
84
203
  return this.tagAddQueue;
85
204
  }
@@ -98,7 +217,8 @@ export class MatterportTagService {
98
217
  }
99
218
  this.tagAddQueue = this.tagAddQueue.then(async () => {
100
219
  try {
101
- const [createdSid] = await sdk.Tag.add(...descriptor);
220
+ const tagModule = await this.getTagCreationModule(sdk);
221
+ const [createdSid] = await tagModule.add(...descriptor);
102
222
  this.mattertagIDs.push(createdSid);
103
223
  this.dictionnaryTags.set(createdSid, mattertagData);
104
224
  await wait(100);
@@ -145,36 +265,6 @@ export class MatterportTagService {
145
265
  tagPos.z >= min.z - margin && tagPos.z <= max.z + margin);
146
266
  });
147
267
  }
148
- /**
149
- * Computes the final context-aware opacity for a single tag.
150
- * @param currentFloorSequence Authoritative current floor sequence from sdk.Floor.current
151
- * (null = single-floor model or unknown).
152
- * @param currentRooms Array of active rooms the camera is in.
153
- */
154
- /*computeSingleTagContextOpacity(
155
- mattertagData: MattertagData,
156
- poseCamera: any,
157
- sweepCollection: any,
158
- currentFloorSequence: number | null,
159
- currentRooms: any[]
160
- ): number {
161
- const mode = this.navigationService.currentCameraMode;
162
-
163
- // 1. Check Floor
164
- const tagFloorId = this.getFloorIdForTag(mattertagData, sweepCollection);
165
- const currentFloorId = currentFloorSequence?.toString();
166
- if (tagFloorId && currentFloorId && tagFloorId !== currentFloorId) {
167
- return 0;
168
- }
169
-
170
- // 2. Si Dollhouse -> Pleine opacité
171
- //if (mode !== CameraMode.INSIDE) return 1;
172
-
173
- // 3. Si Inside -> Check pièce + Distance progressive
174
- //if (!this.isTagInRooms(mattertagData, currentRooms)) return 0;
175
-
176
- return 1;
177
- }*/
178
268
  /** Returns the ID of the most recently added tag. */
179
269
  getLastTag() {
180
270
  if (this.mattertagIDs.length === 0)
@@ -224,10 +314,11 @@ export class MatterportTagService {
224
314
  }
225
315
  // Apply changes
226
316
  // Tooltip and click management
317
+ const tagModule = this.getTagModule(sdk, tagId);
227
318
  const lastEnabled = this.tagsCurrentEnabled.get(tagId);
228
319
  if (lastEnabled !== shouldBeEnabled) {
229
320
  this.tagsCurrentEnabled.set(tagId, shouldBeEnabled);
230
- promises.push(sdk.Tag.allowAction(tagId, {
321
+ promises.push(tagModule.allowAction(tagId, {
231
322
  opening: shouldBeEnabled,
232
323
  navigating: shouldBeEnabled,
233
324
  docking: false
@@ -237,16 +328,26 @@ export class MatterportTagService {
237
328
  const lastOpacity = this.tagsCurrentOpacity.get(tagId) ?? -1;
238
329
  if (Math.abs(lastOpacity - targetOpacity) > 0.05) {
239
330
  this.tagsCurrentOpacity.set(tagId, targetOpacity);
240
- promises.push(sdk.Tag.editOpacity(tagId, targetOpacity).catch(() => { }));
331
+ promises.push(tagModule.editOpacity(tagId, targetOpacity).catch(() => { }));
241
332
  }
242
333
  }
243
334
  await Promise.all(promises);
244
335
  }
336
+ /**
337
+ * Drops the memoized opacity/enabled state so the next visibility pass re-applies it
338
+ * to every tag. Needed after a view switch (furnished <-> defurnished): the SDK
339
+ * re-renders the shared layer's tags and the cached values would otherwise make
340
+ * updateTagsVisibilityForContext() skip them, leaving tags stuck invisible.
341
+ */
342
+ resetVisibilityCache() {
343
+ this.tagsCurrentOpacity.clear();
344
+ this.tagsCurrentEnabled.clear();
345
+ }
245
346
  /** Removes a specific tag from the viewer and local dictionaries. */
246
347
  async deleteMattertagFromId(sdk, mattertagID) {
247
348
  try {
248
349
  if (sdk)
249
- await sdk.Tag.remove(mattertagID);
350
+ await this.getTagModule(sdk, mattertagID).remove(mattertagID);
250
351
  this.dictionnaryTags.delete(mattertagID);
251
352
  const index = this.mattertagIDs.indexOf(mattertagID);
252
353
  if (index > -1)
@@ -269,7 +370,7 @@ export class MatterportTagService {
269
370
  const sidsToRemove = [...this.mattertagIDs];
270
371
  for (const sid of sidsToRemove) {
271
372
  try {
272
- await sdk.Tag.remove(sid);
373
+ await this.getTagModule(sdk, sid).remove(sid);
273
374
  }
274
375
  catch (e) { }
275
376
  }
@@ -280,7 +381,7 @@ export class MatterportTagService {
280
381
  * Creates and configures a Mattertag from a POI, handling coordinates, normals, and sweep ID.
281
382
  * Skips creation if a tag for the object already exists.
282
383
  */
283
- async createMattertagFromPOI(sdk, tagType, object, poi, poseCamera, getTagFromElementId, setTagIconAndOpacity, injectHtmlInTag) {
384
+ async createMattertagFromPOI(sdk, tagType, object, poi, getTagFromElementId, setTagIconAndOpacity, injectHtmlInTag) {
284
385
  const { tag } = getTagFromElementId(object.id);
285
386
  if (tag)
286
387
  return;
@@ -342,10 +443,11 @@ export class MatterportTagService {
342
443
  return;
343
444
  try {
344
445
  const iconName = `custom-icon-${mattertagID}`;
446
+ const tagModule = this.getTagModule(sdk, mattertagID);
345
447
  await sdk.Asset.registerTexture(iconName, iconPath);
346
- await sdk.Tag.editIcon(mattertagID, iconName);
448
+ await tagModule.editIcon(mattertagID, iconName);
347
449
  if (applyOpacity) {
348
- await sdk.Tag.editOpacity(mattertagID, opacity);
450
+ await tagModule.editOpacity(mattertagID, opacity);
349
451
  }
350
452
  }
351
453
  catch (error) {
@@ -409,16 +511,17 @@ export class MatterportTagService {
409
511
  if (html && html.trim().length > 0 && sdk) {
410
512
  const scriptTag = this.tagService.getScriptForTag(object, tagType);
411
513
  html += `${scriptTag}`;
514
+ const tagModule = this.getTagModule(sdk, tagID);
412
515
  const [sandboxId, messenger] = await sdk.Tag.registerSandbox(html);
413
516
  const attachmentID = this.tagsAttachments[tagID];
414
517
  if (attachmentID) {
415
518
  try {
416
- await sdk.Tag.detach(tagID, attachmentID);
519
+ await tagModule.detach(tagID, attachmentID);
417
520
  }
418
521
  catch (e) { }
419
522
  }
420
523
  this.tagsAttachments[tagID] = sandboxId;
421
- await sdk.Tag.attach(tagID, sandboxId);
524
+ await tagModule.attach(tagID, sandboxId);
422
525
  // Attach the "View informations" handler in tooltip
423
526
  messenger.on(TagAction.DETAIL_CLICK, this.tagService.onActionDetailClick.bind(this.tagService));
424
527
  messenger.on(TagAction.TICKET_CLICK, this.tagService.onActionDetailClick.bind(this.tagService));
@@ -431,11 +534,12 @@ export class MatterportTagService {
431
534
  else if (sdk) {
432
535
  const { comment, tagDescription } = this.tagService.getBillboardMediaToEmbed(object);
433
536
  if (comment) {
537
+ const tagModule = this.getTagModule(sdk, tagID);
434
538
  // 1) Register the media attachment by passing the URL string(s).
435
539
  // registerAttachment returns an array of attachment IDs.
436
540
  const [attachmentID] = await sdk.Tag.registerAttachment(comment.externalLink);
437
541
  // 2) Attach the registered media to the tag.
438
- await sdk.Tag.attach(tagID, attachmentID);
542
+ await tagModule.attach(tagID, attachmentID);
439
543
  // 3) Determine media type for the billboard (PHOTO or VIDEO).
440
544
  // Use a simple heuristic: YouTube/Vimeo -> VIDEO, otherwise PHOTO.
441
545
  // The SDK exposes MediaType on the Tag namespace.
@@ -443,7 +547,7 @@ export class MatterportTagService {
443
547
  const mediaType = isVideo ? sdk.Mattertag.MediaType.VIDEO : sdk.Mattertag.MediaType.PHOTO;
444
548
  // 4) Update the billboard text and media using editBillboard.
445
549
  // editBillboard accepts Partial<Tag.EditableProperties> such as label, description, media.
446
- await sdk.Tag.editBillboard(tagID, {
550
+ await tagModule.editBillboard(tagID, {
447
551
  label: object.title || 'Media',
448
552
  description: tagDescription || '',
449
553
  media: {
@@ -469,9 +573,14 @@ export class MatterportTagService {
469
573
  /** Clears all local tag data and resets the addition queue. */
470
574
  clear() {
471
575
  this.dictionnaryTags.clear();
576
+ this.tagsCurrentOpacity.clear();
577
+ this.tagsCurrentEnabled.clear();
472
578
  this.tagAddQueue = Promise.resolve();
473
579
  this.mattertagToFollow = null;
474
580
  this.mattertagIDs = [];
581
+ // A new space means a new SDK session, hence a new shared layer to create.
582
+ this.sharedTagLayer = null;
583
+ this.sharedTagLayerPromise = null;
475
584
  }
476
585
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MatterportTagService, deps: [{ token: i1.MatterportNavigationService }], target: i0.ɵɵFactoryTarget.Injectable });
477
586
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MatterportTagService, providedIn: 'root' });
@@ -482,4 +591,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
482
591
  providedIn: 'root',
483
592
  }]
484
593
  }], ctorParameters: () => [{ type: i1.MatterportNavigationService }] });
485
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0dGVycG9ydC10YWcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvc2VydmljZXMvbWF0dGVycG9ydC10YWcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQWtELFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV6RyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7OztBQU0xQyxNQUFNLE9BQU8sb0JBQW9CO0lBYXJCO0lBWkgsZUFBZSxHQUErQixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ3hELFdBQVcsR0FBaUIsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzlDLGlCQUFpQixHQUFrQixJQUFJLENBQUM7SUFDeEMsU0FBUyxHQUFHLElBQUksT0FBTyxFQUFVLENBQUM7SUFDbEMsWUFBWSxHQUFrQixFQUFFLENBQUM7SUFDakMsZUFBZSxHQUFXLEVBQUUsQ0FBQztJQUM3QixjQUFjLEdBQVksS0FBSyxDQUFDO0lBQ2hDLFVBQVUsR0FBMEIsSUFBSSxDQUFDO0lBQ3hDLGtCQUFrQixHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ3BELGtCQUFrQixHQUF5QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBRTdELFlBQ1UsaUJBQThDO1FBQTlDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBNkI7SUFDcEQsQ0FBQztJQUVMLGFBQWEsQ0FBQyxPQUF1QjtRQUNuQyxJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQztJQUM1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QUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHO3dCQUM1QixZQUFZO3dCQUNaLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxJQUFJLE9BQU87d0JBQzlCLFdBQVcsRUFBRSxjQUFjLElBQUksRUFBRTt3QkFDakMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxZQUFZO3dCQUM5QixTQUFTO3FCQUNWLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0RBQWtELEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0UsQ0FBQztJQUNILENBQUM7SUFFRCwrREFBK0Q7SUFDL0QsS0FBSztRQUNILElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztJQUN6QixDQUFDO3dHQXJoQlUsb0JBQW9COzRHQUFwQixvQkFBb0IsY0FGbkIsTUFBTTs7NEZBRVAsb0JBQW9CO2tCQUhoQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzRGV2TW9kZSwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE1hdHRlcnRhZ0RhdGEgfSBmcm9tICcuLi9tYXR0ZXJ0YWdEYXRhJztcclxuaW1wb3J0IHsgUG9pVHlwZSwgRGJPYmplY3RUeXBlLCBQT0ksIFZpZXdlckludGVyYWN0aW9ucywgVGFnQWN0aW9uLCBDYW1lcmFNb2RlIH0gZnJvbSAnLi4vdHlwZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hdHRlcnBvcnROYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4vbWF0dGVycG9ydC1uYXZpZ2F0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyB3YWl0IH0gZnJvbSAnLi4vaGVscGVycy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFzZVRhZ1NlcnZpY2UgfSBmcm9tICcuL3RhZy5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYXR0ZXJwb3J0VGFnU2VydmljZSB7XHJcbiAgcHVibGljIGRpY3Rpb25uYXJ5VGFnczogTWFwPHN0cmluZywgTWF0dGVydGFnRGF0YT4gPSBuZXcgTWFwKCk7XHJcbiAgcHVibGljIHRhZ0FkZFF1ZXVlOiBQcm9taXNlPGFueT4gPSBQcm9taXNlLnJlc29sdmUoKTtcclxuICBwdWJsaWMgbWF0dGVydGFnVG9Gb2xsb3c6IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gIHB1YmxpYyBvbkdvVG9UYWcgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XHJcbiAgcHVibGljIG1hdHRlcnRhZ0lEczogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG4gIHB1YmxpYyB0YWdzQXR0YWNobWVudHM6IE9iamVjdCA9IHt9O1xyXG4gIHB1YmxpYyB0YWdNZXNzZW5nZXJPbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyB0YWdTZXJ2aWNlOiBCYXNlVGFnU2VydmljZSB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgdGFnc0N1cnJlbnRPcGFjaXR5OiBNYXA8c3RyaW5nLCBudW1iZXI+ID0gbmV3IE1hcCgpO1xyXG4gIHByaXZhdGUgdGFnc0N1cnJlbnRFbmFibGVkOiBNYXA8c3RyaW5nLCBib29sZWFuPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIG5hdmlnYXRpb25TZXJ2aWNlOiBNYXR0ZXJwb3J0TmF2aWdhdGlvblNlcnZpY2VcclxuICApIHsgfVxyXG5cclxuICBzZXRUYWdTZXJ2aWNlKHNlcnZpY2U6IEJhc2VUYWdTZXJ2aWNlKTogdm9pZCB7XHJcbiAgICB0aGlzLnRhZ1NlcnZpY2UgPSBzZXJ2aWNlO1xyXG4gIH1cclxuXHJcbiAgLyoqIE9wZW5zIGEgc3BlY2lmaWMgdGFnIGluIHRoZSBNYXR0ZXJwb3J0IHZpZXdlciBieSBpdHMgSUQuICovXHJcbiAgYXN5bmMgZ29Ub1RhZyhzZGs6IGFueSwgc2lkOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgaWYgKCFzZGspIHJldHVybjtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMub25Hb1RvVGFnLm5leHQoc2lkKTtcclxuICAgICAgYXdhaXQgc2RrLlRhZy5vcGVuKHNpZCk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdDYW5ub3Qgb3BlbiB0YWcnLCBzaWQsIGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIE9wZW5zIHRoZSBtb3N0IHJlY2VudGx5IGNyZWF0ZWQgdGFnIGluIHRoZSB2aWV3ZXIuICovXHJcbiAgYXN5bmMgZ29Ub0xhc3RUYWcoc2RrOiBhbnkpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgaWYgKCFzZGsgfHwgdGhpcy5tYXR0ZXJ0YWdJRHMubGVuZ3RoID09PSAwKSByZXR1cm47XHJcbiAgICBjb25zdCBsYXN0U2lkID0gdGhpcy5tYXR0ZXJ0YWdJRHNbdGhpcy5tYXR0ZXJ0YWdJRHMubGVuZ3RoIC0gMV07XHJcbiAgICByZXR1cm4gdGhpcy5nb1RvVGFnKHNkaywgbGFzdFNpZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGRzIGEgTWF0dGVydGFnIHRvIHRoZSB2aWV3ZXIsIHNlcmlhbGl6aW5nIGNhbGxzIHRvIHByZXZlbnQgU0RLIHJhY2UgY29uZGl0aW9ucy5cclxuICAgKiBSZXVzZXMgZXhpc3RpbmcgSURzIGlmIHRoZSB0YWcgaXMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBzZXNzaW9uLlxyXG4gICAqL1xyXG4gIGFzeW5jIGFkZE1hdHRlcnRhZ1RvVmlld2VyKHNkazogYW55LCBtYXR0ZXJ0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XHJcbiAgICBpZiAoIXNkaykgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLScpO1xyXG4gICAgY29uc29sZS5sb2coJ2VsZW1lbnQgaWQgJyArIG1hdHRlcnRhZ0RhdGEuZWxlbWVudElEKTtcclxuICAgIGNvbnNvbGUubG9nKCdwb3NpdGlvbjogJywgbWF0dGVydGFnRGF0YS5nZXRQb3NpdGlvbigpKTtcclxuICAgIGNvbnNvbGUubG9nKCdyb3RhdGlvbjogJywgbWF0dGVydGFnRGF0YS5nZXRSb3RhdGlvbigpKTtcclxuICAgIGNvbnNvbGUubG9nKCdzd2VlcCBpZDogJywgbWF0dGVydGFnRGF0YS5nZXRTd2VlcElEKCkpO1xyXG4gICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLScpO1xyXG5cclxuICAgIHRoaXMudGFnQWRkUXVldWUgPSB0aGlzLnRhZ0FkZFF1ZXVlLnRoZW4oYXN5bmMgKCkgPT4ge1xyXG4gICAgICBjb25zdCBkYXRhID0gbWF0dGVydGFnRGF0YS5nZXREYXRhKCkgYXMgYW55O1xyXG4gICAgICBjb25zdCBleGlzdGluZ0lkID0gZGF0YT8uaWQgfHwgbnVsbDtcclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3Qgc2lkTGlzdCA9IGF3YWl0IHNkay5UYWcuYWRkKGRhdGEpO1xyXG4gICAgICAgIGlmIChzaWRMaXN0ICYmIHNpZExpc3QubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgY29uc3QgbWF0dGVydGFnSUQgPSBzaWRMaXN0WzBdO1xyXG4gICAgICAgICAgdGhpcy5tYXR0ZXJ0YWdJRHMucHVzaChtYXR0ZXJ0YWdJRCk7XHJcbiAgICAgICAgICB0aGlzLmRpY3Rpb25uYXJ5VGFncy5zZXQobWF0dGVydGFnSUQsIG1hdHRlcnRhZ0RhdGEpO1xyXG4gICAgICAgICAgcmV0dXJuIG1hdHRlcnRhZ0lEO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICAgIGlmIChlcnJvcj8ubWVzc2FnZT8uaW5jbHVkZXMoJ2FscmVhZHkgaW4gdXNlJykgJiYgZXhpc3RpbmdJZCkge1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmRpY3Rpb25uYXJ5VGFncy5oYXMoZXhpc3RpbmdJZCkpIHtcclxuICAgICAgICAgICAgdGhpcy5tYXR0ZXJ0YWdJRHMucHVzaChleGlzdGluZ0lkKTtcclxuICAgICAgICAgICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3Muc2V0KGV4aXN0aW5nSWQsIG1hdHRlcnRhZ0RhdGEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIGV4aXN0aW5nSWQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gYWRkIHRhZyB0byB2aWV3ZXInLCBlcnJvcik7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy50YWdBZGRRdWV1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEludGVybmFsIG1ldGhvZCB0byBhZGQgYW5kIGNvbmZpZ3VyZSBhIE1hdHRlcnRhZyB3aXRoIGljb24sIG9wYWNpdHksIGFuZCBIVE1MIGNvbnRlbnQuXHJcbiAgICogSGFuZGxlcyBleGlzdGluZyB0YWdzIGdyYWNlZnVsbHkgYW5kIHF1ZXVlcyBvcGVyYXRpb25zIHRvIGF2b2lkIFNESyBjb25mbGljdHMuXHJcbiAgICovXHJcbiAgYXN5bmMgX2RvQWRkTWF0dGVydGFnKFxyXG4gICAgc2RrOiBhbnksXHJcbiAgICBtYXR0ZXJ0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhLFxyXG4gICAgc2V0VGFnSWNvbkFuZE9wYWNpdHk6IChzaWQ6IHN0cmluZywgbXQ6IE1hdHRlcnRhZ0RhdGEpID0+IFByb21pc2U8dm9pZD4sXHJcbiAgICBpbmplY3RIdG1sSW5UYWc6ICh0eXBlOiBQb2lUeXBlLCBvYmo6IERiT2JqZWN0VHlwZSwgc2lkOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cclxuICApOiBQcm9taXNlPHN0cmluZz4ge1xyXG4gICAgY29uc3QgZGVzY3JpcHRvciA9IG1hdHRlcnRhZ0RhdGEuZ2V0TWF0dGVydGFnRGVzY3JpcHRvcigpO1xyXG4gICAgLy9jb25zb2xlLmxvZygnZGVzY3JpcHRvcicsIGRlc2NyaXB0b3IpO1xyXG4gICAgY29uc3Qgc2lkID0gZGVzY3JpcHRvclswXVsnaWQnXTtcclxuXHJcbiAgICBpZiAoc2lkICYmIHRoaXMuZGljdGlvbm5hcnlUYWdzLmhhcyhzaWQpKSB7XHJcbiAgICAgIGF3YWl0IHNldFRhZ0ljb25BbmRPcGFjaXR5KHNpZCwgbWF0dGVydGFnRGF0YSk7XHJcbiAgICAgIGF3YWl0IGluamVjdEh0bWxJblRhZyhtYXR0ZXJ0YWdEYXRhLmdldFR5cGUoKSwgbWF0dGVydGFnRGF0YS5nZXRPYmplY3QoKSwgc2lkKTtcclxuICAgICAgcmV0dXJuIHNpZDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnRhZ0FkZFF1ZXVlID0gdGhpcy50YWdBZGRRdWV1ZS50aGVuKGFzeW5jICgpID0+IHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBbY3JlYXRlZFNpZF0gPSBhd2FpdCBzZGsuVGFnLmFkZCguLi5kZXNjcmlwdG9yKTtcclxuICAgICAgICB0aGlzLm1hdHRlcnRhZ0lEcy5wdXNoKGNyZWF0ZWRTaWQpO1xyXG4gICAgICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLnNldChjcmVhdGVkU2lkLCBtYXR0ZXJ0YWdEYXRhKTtcclxuXHJcbiAgICAgICAgYXdhaXQgd2FpdCgxMDApO1xyXG4gICAgICAgIGF3YWl0IHNldFRhZ0ljb25BbmRPcGFjaXR5KGNyZWF0ZWRTaWQsIG1hdHRlcnRhZ0RhdGEpO1xyXG5cclxuICAgICAgICBpbmplY3RIdG1sSW5UYWcobWF0dGVydGFnRGF0YS5nZXRUeXBlKCksIG1hdHRlcnRhZ0RhdGEuZ2V0T2JqZWN0KCksIGNyZWF0ZWRTaWQpLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignSFRNTCBpbmplY3Rpb24gZmFpbGVkIGZvcicsIGNyZWF0ZWRTaWQsIGVycik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBjcmVhdGVkU2lkO1xyXG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgICBpZiAoZT8ubWVzc2FnZT8uaW5jbHVkZXMoJ2FscmVhZHkgaW4gdXNlJykgJiYgc2lkKSB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuZGljdGlvbm5hcnlUYWdzLmhhcyhzaWQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF0dGVydGFnSURzLnB1c2goc2lkKTtcclxuICAgICAgICAgICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3Muc2V0KHNpZCwgbWF0dGVydGFnRGF0YSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhd2FpdCBzZXRUYWdJY29uQW5kT3BhY2l0eShzaWQsIG1hdHRlcnRhZ0RhdGEpO1xyXG4gICAgICAgICAgYXdhaXQgaW5qZWN0SHRtbEluVGFnKG1hdHRlcnRhZ0RhdGEuZ2V0VHlwZSgpLCBtYXR0ZXJ0YWdEYXRhLmdldE9iamVjdCgpLCBzaWQpO1xyXG4gICAgICAgICAgcmV0dXJuIHNpZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMudGFnQWRkUXVldWU7XHJcbiAgfVxyXG5cclxuICBnZXREaXN0YW5jZShwMTogYW55LCBwMjogYW55KTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3cocDIueCAtIHAxLngsIDIpICsgTWF0aC5wb3cocDIueSAtIHAxLnksIDIpICsgTWF0aC5wb3cocDIueiAtIHAxLnosIDIpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrcyBpZiBhIHRhZyBpcyB3aXRoaW4gdGhlIGJvdW5kaW5nIGJveCBvZiBhbnkgYWN0aXZlIHJvb20gKGFkZGluZyBhIHNsaWdodCBtYXJnaW4gdG8gYWNjb3VudCBmb3Igd2FsbC1tb3VudGVkIHRhZ3MpLlxyXG4gICAqIElmIHRoZXJlIGFyZSBubyBhY3RpdmUgcm9vbXMgKGUuZy4sIGhhbGx3YXkpLCBmYWxscyBiYWNrIHRvIHJldHVybmluZyB0cnVlLlxyXG4gICAqL1xyXG4gIGlzVGFnSW5Sb29tcyhtYXR0ZXJ0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhLCByb29tczogYW55W10pOiBib29sZWFuIHtcclxuICAgIGlmICghcm9vbXMgfHwgcm9vbXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgdGFnUG9zID0gbWF0dGVydGFnRGF0YS5nZXRQb3NpdGlvbigpO1xyXG4gICAgY29uc3QgbWFyZ2luID0gMS41O1xyXG5cclxuICAgIHJldHVybiByb29tcy5zb21lKChyb29tKSA9PiB7XHJcbiAgICAgIGlmICghcm9vbS5ib3VuZHMpIHJldHVybiBmYWxzZTtcclxuICAgICAgY29uc3QgeyBtaW4sIG1heCB9ID0gcm9vbS5ib3VuZHM7XHJcblxyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIHRhZ1Bvcy54ID49IG1pbi54IC0gbWFyZ2luICYmIHRhZ1Bvcy54IDw9IG1heC54ICsgbWFyZ2luICYmXHJcbiAgICAgICAgdGFnUG9zLnkgPj0gbWluLnkgLSBtYXJnaW4gJiYgdGFnUG9zLnkgPD0gbWF4LnkgKyBtYXJnaW4gJiZcclxuICAgICAgICB0YWdQb3MueiA+PSBtaW4ueiAtIG1hcmdpbiAmJiB0YWdQb3MueiA8PSBtYXgueiArIG1hcmdpblxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb21wdXRlcyB0aGUgZmluYWwgY29udGV4dC1hd2FyZSBvcGFjaXR5IGZvciBhIHNpbmdsZSB0YWcuXHJcbiAgICogQHBhcmFtIGN1cnJlbnRGbG9vclNlcXVlbmNlICBBdXRob3JpdGF0aXZlIGN1cnJlbnQgZmxvb3Igc2VxdWVuY2UgZnJvbSBzZGsuRmxvb3IuY3VycmVudFxyXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bGwgPSBzaW5nbGUtZmxvb3IgbW9kZWwgb3IgdW5rbm93bikuXHJcbiAgICogQHBhcmFtIGN1cnJlbnRSb29tcyAgICAgICAgICBBcnJheSBvZiBhY3RpdmUgcm9vbXMgdGhlIGNhbWVyYSBpcyBpbi5cclxuICAgKi9cclxuICAvKmNvbXB1dGVTaW5nbGVUYWdDb250ZXh0T3BhY2l0eShcclxuICAgIG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEsXHJcbiAgICBwb3NlQ2FtZXJhOiBhbnksXHJcbiAgICBzd2VlcENvbGxlY3Rpb246IGFueSxcclxuICAgIGN1cnJlbnRGbG9vclNlcXVlbmNlOiBudW1iZXIgfCBudWxsLFxyXG4gICAgY3VycmVudFJvb21zOiBhbnlbXVxyXG4gICk6IG51bWJlciB7XHJcbiAgICBjb25zdCBtb2RlID0gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5jdXJyZW50Q2FtZXJhTW9kZTtcclxuXHJcbiAgICAvLyAxLiBDaGVjayBGbG9vclxyXG4gICAgY29uc3QgdGFnRmxvb3JJZCA9IHRoaXMuZ2V0Rmxvb3JJZEZvclRhZyhtYXR0ZXJ0YWdEYXRhLCBzd2VlcENvbGxlY3Rpb24pO1xyXG4gICAgY29uc3QgY3VycmVudEZsb29ySWQgPSBjdXJyZW50Rmxvb3JTZXF1ZW5jZT8udG9TdHJpbmcoKTtcclxuICAgIGlmICh0YWdGbG9vcklkICYmIGN1cnJlbnRGbG9vcklkICYmIHRhZ0Zsb29ySWQgIT09IGN1cnJlbnRGbG9vcklkKSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIDIuIFNpIERvbGxob3VzZSAtPiBQbGVpbmUgb3BhY2l0w6lcclxuICAgIC8vaWYgKG1vZGUgIT09IENhbWVyYU1vZGUuSU5TSURFKSByZXR1cm4gMTtcclxuXHJcbiAgICAvLyAzLiBTaSBJbnNpZGUgLT4gQ2hlY2sgcGnDqGNlICsgRGlzdGFuY2UgcHJvZ3Jlc3NpdmVcclxuICAgIC8vaWYgKCF0aGlzLmlzVGFnSW5Sb29tcyhtYXR0ZXJ0YWdEYXRhLCBjdXJyZW50Um9vbXMpKSByZXR1cm4gMDtcclxuXHJcbiAgICByZXR1cm4gMTtcclxuICB9Ki9cclxuXHJcbiAgLyoqIFJldHVybnMgdGhlIElEIG9mIHRoZSBtb3N0IHJlY2VudGx5IGFkZGVkIHRhZy4gKi9cclxuICBnZXRMYXN0VGFnKCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgaWYgKHRoaXMubWF0dGVydGFnSURzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XHJcbiAgICByZXR1cm4gdGhpcy5tYXR0ZXJ0YWdJRHNbdGhpcy5tYXR0ZXJ0YWdJRHMubGVuZ3RoIC0gMV07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBVcGRhdGVzIHRoZSB2aXNpYmlsaXR5IChvcGFjaXR5KSBvZiBhbGwgdGFncyBiYXNlZCBvbiB0aGUgY3VycmVudCBjYW1lcmEgbW9kZSxcclxuICAgKiBmbG9vciBhbmQgcm9vbSBjb250ZXh0LiBNdXN0IGJlIGNhbGxlZCBhZnRlciBlYWNoIHN3ZWVwLCBmbG9vciBvciBtb2RlIGNoYW5nZS5cclxuICAgKlxyXG4gICAqIFJ1bGVzOlxyXG4gICAqICAtIERPTExIT1VTRSAvIEZMT09SUExBTiDihpIgYWxsIHRhZ3MgaGlkZGVuIChvcGFjaXR5IDApLlxyXG4gICAqICAtIElOU0lERSDihpIgb25seSB0YWdzIHdob3NlIHN3ZWVwIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnQgZmxvb3IgYXJlIHNob3duO1xyXG4gICAqICAgIHByb3hpbWl0eS1iYXNlZCBvcGFjaXR5IGlzIGFwcGxpZWQgdmlhIGNvbXB1dGVUYWdPcGFjaXR5KCkuXHJcbiAgICogICAgVGFncyBvbiBvdGhlciBmbG9vcnMgYXJlIGhpZGRlbiAob3BhY2l0eSAwKS5cclxuICAgKiAgLSBUUkFOU0lUSU9OSU5HIOKGkiBubyBjaGFuZ2UgKHNraXAgdXBkYXRlIHRvIGF2b2lkIGZsaWNrZXJpbmcpLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHNkayAgICAgICAgICBNYXR0ZXJwb3J0IFNESyBpbnN0YW5jZS5cclxuICAgKiBAcGFyYW0gcG9zZUNhbWVyYSAgIEN1cnJlbnQgY2FtZXJhIHBvc2UuXHJcbiAgICogQHBhcmFtIHN3ZWVwQ29sbGVjdGlvbiAgRnVsbCBjb2xsZWN0aW9uIG9mIHN3ZWVwcy5cclxuICAgKiBAcGFyYW0gY3VycmVudENhbWVyYU1vZGUgIEN1cnJlbnQgY2FtZXJhIG1vZGUuXHJcbiAgICogQHBhcmFtIG1hdHRlcnRhZ1RvRm9sbG93ICBJRCBvZiB0aGUgY3Vyc29yIHRhZyAobmV2ZXIgdG91Y2hlZCkuXHJcbiAgICovXHJcbiAgYXN5bmMgdXBkYXRlVGFnc1Zpc2liaWxpdHlGb3JDb250ZXh0KFxyXG4gICAgc2RrOiBhbnksXHJcbiAgICBzd2VlcENvbGxlY3Rpb246IGFueSxcclxuICAgIGN1cnJlbnRDYW1lcmFNb2RlOiBDYW1lcmFNb2RlLFxyXG4gICAgbWF0dGVydGFnVG9Gb2xsb3c6IHN0cmluZyB8IG51bGwsXHJcbiAgICBjdXJyZW50Rmxvb3JTZXF1ZW5jZTogbnVtYmVyIHwgbnVsbCA9IG51bGwsXHJcbiAgICBjdXJyZW50Um9vbXM6IGFueVtdID0gW11cclxuICApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICghc2RrIHx8IHRoaXMuZGljdGlvbm5hcnlUYWdzLnNpemUgPT09IDApIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBpc0ludGVyaW9yTW9kZSA9IGN1cnJlbnRDYW1lcmFNb2RlID09PSBDYW1lcmFNb2RlLklOU0lERTtcclxuICAgIGNvbnN0IGN1cnJlbnRGbG9vcklkID0gY3VycmVudEZsb29yU2VxdWVuY2UgIT09IG51bGwgPyBjdXJyZW50Rmxvb3JTZXF1ZW5jZS50b1N0cmluZygpIDogbnVsbDtcclxuICAgIGNvbnN0IHByb21pc2VzID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCBbdGFnSWQsIG1hdHRlcnRhZ0RhdGFdIG9mIHRoaXMuZGljdGlvbm5hcnlUYWdzKSB7XHJcbiAgICAgIGlmICh0YWdJZCA9PT0gbWF0dGVydGFnVG9Gb2xsb3cpIGNvbnRpbnVlO1xyXG5cclxuICAgICAgY29uc3QgdGFnRmxvb3JJZCA9IHRoaXMuZ2V0Rmxvb3JJZEZvclRhZyhtYXR0ZXJ0YWdEYXRhLCBzd2VlcENvbGxlY3Rpb24pO1xyXG4gICAgICBjb25zdCBpc09uQ3VycmVudEZsb29yID0gIXRhZ0Zsb29ySWQgfHwgIWN1cnJlbnRGbG9vcklkIHx8IHRhZ0Zsb29ySWQgPT09IGN1cnJlbnRGbG9vcklkO1xyXG5cclxuICAgICAgbGV0IHRhcmdldE9wYWNpdHkgPSAwO1xyXG4gICAgICBsZXQgc2hvdWxkQmVFbmFibGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAvLyBDYWxjdWxhdGlvbiBvZiBvcGFjaXR5IGFuZCBlbmFibGUgc3RhdHVzXHJcbiAgICAgIGlmIChpc09uQ3VycmVudEZsb29yKSB7XHJcbiAgICAgICAgaWYgKCFpc0ludGVyaW9yTW9kZSkge1xyXG4gICAgICAgICAgdGFyZ2V0T3BhY2l0eSA9IDE7XHJcbiAgICAgICAgICBzaG91bGRCZUVuYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0YXJnZXRPcGFjaXR5ID0gMC45O1xyXG4gICAgICAgICAgc2hvdWxkQmVFbmFibGVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgLy8gQXBwbHkgY2hhbmdlc1xyXG5cclxuICAgICAgLy8gVG9vbHRpcCBhbmQgY2xpY2sgbWFuYWdlbWVudFxyXG4gICAgICBjb25zdCBsYXN0RW5hYmxlZCA9IHRoaXMudGFnc0N1cnJlbnRFbmFibGVkLmdldCh0YWdJZCk7XHJcbiAgICAgIGlmIChsYXN0RW5hYmxlZCAhPT0gc2hvdWxkQmVFbmFibGVkKSB7XHJcbiAgICAgICAgdGhpcy50YWdzQ3VycmVudEVuYWJsZWQuc2V0KHRhZ0lkLCBzaG91bGRCZUVuYWJsZWQpO1xyXG4gICAgICAgIHByb21pc2VzLnB1c2goc2RrLlRhZy5hbGxvd0FjdGlvbih0YWdJZCwge1xyXG4gICAgICAgICAgb3BlbmluZzogc2hvdWxkQmVFbmFibGVkLFxyXG4gICAgICAgICAgbmF2aWdhdGluZzogc2hvdWxkQmVFbmFibGVkLFxyXG4gICAgICAgICAgZG9ja2luZzogZmFsc2VcclxuICAgICAgICB9KS5jYXRjaCgoKSA9PiB7IH0pKTtcclxuICAgICAgfVxyXG4gICAgICAvLyBPcGFjaXR5IG1hbmFnZW1lbnRcclxuICAgICAgY29uc3QgbGFzdE9wYWNpdHkgPSB0aGlzLnRhZ3NDdXJyZW50T3BhY2l0eS5nZXQodGFnSWQpID8/IC0xO1xyXG4gICAgICBpZiAoTWF0aC5hYnMobGFzdE9wYWNpdHkgLSB0YXJnZXRPcGFjaXR5KSA+IDAuMDUpIHtcclxuICAgICAgICB0aGlzLnRhZ3NDdXJyZW50T3BhY2l0eS5zZXQodGFnSWQsIHRhcmdldE9wYWNpdHkpO1xyXG4gICAgICAgIHByb21pc2VzLnB1c2goc2RrLlRhZy5lZGl0T3BhY2l0eSh0YWdJZCwgdGFyZ2V0T3BhY2l0eSkuY2F0Y2goKCkgPT4geyB9KSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XHJcbiAgfVxyXG5cclxuICAvKiogUmVtb3ZlcyBhIHNwZWNpZmljIHRhZyBmcm9tIHRoZSB2aWV3ZXIgYW5kIGxvY2FsIGRpY3Rpb25hcmllcy4gKi9cclxuICBhc3luYyBkZWxldGVNYXR0ZXJ0YWdGcm9tSWQoc2RrOiBhbnksIG1hdHRlcnRhZ0lEOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChzZGspIGF3YWl0IHNkay5UYWcucmVtb3ZlKG1hdHRlcnRhZ0lEKTtcclxuICAgICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3MuZGVsZXRlKG1hdHRlcnRhZ0lEKTtcclxuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLm1hdHRlcnRhZ0lEcy5pbmRleE9mKG1hdHRlcnRhZ0lEKTtcclxuICAgICAgaWYgKGluZGV4ID4gLTEpIHRoaXMubWF0dGVydGFnSURzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0Nhbm5vdCBkZWxldGUgdGFnJywgbWF0dGVydGFnSUQsIGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFJlbW92ZXMgdGhlIGxhc3QgYWRkZWQgdGFnIGZyb20gdGhlIHZpZXdlci4gKi9cclxuICBhc3luYyBkZWxldGVMYXN0TWF0dGVydGFnKHNkazogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBsYXN0U2lkID0gdGhpcy5nZXRMYXN0VGFnKCk7XHJcbiAgICBpZiAobGFzdFNpZCkgYXdhaXQgdGhpcy5kZWxldGVNYXR0ZXJ0YWdGcm9tSWQoc2RrLCBsYXN0U2lkKTtcclxuICB9XHJcblxyXG4gIC8qKiBDbGVhcnMgYWxsIHRhZ3MgZnJvbSB0aGUgdmlld2VyIGFuZCByZXNldHMgbG9jYWwgc3RhdGUuICovXHJcbiAgYXN5bmMgYWN0aW9uX2RlbGV0ZV9hbGxfbWF0dGVydGFncyhzZGs6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHNkaykge1xyXG4gICAgICBjb25zdCBzaWRzVG9SZW1vdmUgPSBbLi4udGhpcy5tYXR0ZXJ0YWdJRHNdO1xyXG4gICAgICBmb3IgKGNvbnN0IHNpZCBvZiBzaWRzVG9SZW1vdmUpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgYXdhaXQgc2RrLlRhZy5yZW1vdmUoc2lkKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5jbGVhcigpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ3JlYXRlcyBhbmQgY29uZmlndXJlcyBhIE1hdHRlcnRhZyBmcm9tIGEgUE9JLCBoYW5kbGluZyBjb29yZGluYXRlcywgbm9ybWFscywgYW5kIHN3ZWVwIElELlxyXG4gICAqIFNraXBzIGNyZWF0aW9uIGlmIGEgdGFnIGZvciB0aGUgb2JqZWN0IGFscmVhZHkgZXhpc3RzLlxyXG4gICAqL1xyXG4gIGFzeW5jIGNyZWF0ZU1hdHRlcnRhZ0Zyb21QT0koXHJcbiAgICBzZGs6IGFueSxcclxuICAgIHRhZ1R5cGU6IFBvaVR5cGUsXHJcbiAgICBvYmplY3Q6IERiT2JqZWN0VHlwZSxcclxuICAgIHBvaTogUE9JLFxyXG4gICAgcG9zZUNhbWVyYTogYW55LFxyXG4gICAgZ2V0VGFnRnJvbUVsZW1lbnRJZDogKGlkOiBzdHJpbmcpID0+IHsgdGFnOiBzdHJpbmc7IHN3ZWVwOiBzdHJpbmcgfSxcclxuICAgIHNldFRhZ0ljb25BbmRPcGFjaXR5OiAoc2lkOiBzdHJpbmcsIG10OiBNYXR0ZXJ0YWdEYXRhKSA9PiBQcm9taXNlPHZvaWQ+LFxyXG4gICAgaW5qZWN0SHRtbEluVGFnOiAodHlwZTogUG9pVHlwZSwgb2JqOiBEYk9iamVjdFR5cGUsIHNpZDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XHJcbiAgKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IHsgdGFnIH0gPSBnZXRUYWdGcm9tRWxlbWVudElkKG9iamVjdC5pZCk7XHJcbiAgICBpZiAodGFnKSByZXR1cm47XHJcblxyXG4gICAgY29uc3QgbWF0dGVydGFnRGF0YTogTWF0dGVydGFnRGF0YSA9IG5ldyBNYXR0ZXJ0YWdEYXRhKHRhZ1R5cGUpO1xyXG4gICAgbWF0dGVydGFnRGF0YS5zZXRPYmplY3Qob2JqZWN0LCB0YWdUeXBlKTtcclxuXHJcbiAgICBpZiAocG9pLmNvb3JkaW5hdGUpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBtYXR0ZXJ0YWdEYXRhLnNldFBvc2l0aW9uKEpTT04ucGFyc2UocG9pLmNvb3JkaW5hdGUpKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdFcnJvciBwYXJzaW5nIFBPSSBjb29yZGluYXRlcycsIHBvaS5jb29yZGluYXRlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChwb2kubWV0YWRhdGEpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCB0YWdNZXRhZGF0YSA9IEpTT04ucGFyc2UocG9pLm1ldGFkYXRhKTtcclxuICAgICAgICBtYXR0ZXJ0YWdEYXRhLnNldE5vcm1hbCh0YWdNZXRhZGF0YS5ub3JtYWwgfHwgeyB4OiAwLCB5OiAtMC4xNSwgejogMCB9KTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIG1hdHRlcnRhZ0RhdGEuc2V0Tm9ybWFsKHsgeDogMCwgeTogLTAuMTUsIHo6IDAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAocG9pLm1hdHRlcnBvcnRTd2VlcElEKSB7XHJcbiAgICAgIG1hdHRlcnRhZ0RhdGEuc2V0U3dlZXBJRChwb2kubWF0dGVycG9ydFN3ZWVwSUQpO1xyXG4gICAgfVxyXG4gICAgbWF0dGVydGFnRGF0YS5zZXRQb2kocG9pKTtcclxuXHJcbiAgICBjb25zdCBjcmVhdGVkVGFnSUQgPSBhd2FpdCB0aGlzLmFkZE1hdHRlcnRhZ1RvVmlld2VyKHNkaywgbWF0dGVydGFnRGF0YSk7XHJcblxyXG4gICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLScpO1xyXG4gICAgY29uc29sZS5sb2coJ2VsZW1lbnQgaWQgJyArIG1hdHRlcnRhZ0RhdGEuZWxlbWVudElEKTtcclxuICAgIGNvbnNvbGUubG9nKCdwb3NpdGlvbjogJywgbWF0dGVydGFnRGF0YS5nZXRQb3NpdGlvbigpKTtcclxuICAgIGNvbnNvbGUubG9nKCdyb3RhdGlvbjogJywgbWF0dGVydGFnRGF0YS5nZXRSb3RhdGlvbigpKTtcclxuICAgIGNvbnNvbGUubG9nKCdzd2VlcCBpZDogJywgbWF0dGVydGFnRGF0YS5nZXRTd2VlcElEKCkpO1xyXG4gICAgY29uc29sZS5sb2coJy0tLS0tLS0tLS0tLS0tLScpO1xyXG5cclxuXHJcbiAgICBpZiAoY3JlYXRlZFRhZ0lEICYmIHNkaykge1xyXG4gICAgICBhd2FpdCB3YWl0KDEwMCk7XHJcbiAgICAgIGF3YWl0IHNldFRhZ0ljb25BbmRPcGFjaXR5KGNyZWF0ZWRUYWdJRCwgbWF0dGVydGFnRGF0YSk7XHJcbiAgICAgIGluamVjdEh0bWxJblRhZyh0YWdUeXBlLCBvYmplY3QsIGNyZWF0ZWRUYWdJRCkuY2F0Y2goZXJyID0+IHtcclxuICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignSFRNTCBpbmplY3Rpb24gZmFpbGVkIGZvcicsIGNyZWF0ZWRUYWdJRCwgZXJyKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNyZWF0ZWRUYWdJRDtcclxuICB9XHJcblxyXG4gIC8qKiBVcGRhdGVzIHRoZSBpY29uLCBvcGFjaXR5LCBhbmQgSFRNTCBjb250ZW50IG9mIGFuIGV4aXN0aW5nIHRhZy4gKi9cclxuICBhc3luYyB1cGRhdGVNYXR0ZXJUYWdDb250ZW50Rm9yVGFnSUQoXHJcbiAgICBzZGs6IGFueSxcclxuICAgIG1hdHRlcnRhZ0lEOiBzdHJpbmcsXHJcbiAgICBvYmplY3Q6IERiT2JqZWN0VHlwZSxcclxuICAgIHBvaVR5cGU6IFBvaVR5cGUsXHJcbiAgICBzZXRUYWdJY29uQW5kT3BhY2l0eTogKHNpZDogc3RyaW5nLCBtdDogTWF0dGVydGFnRGF0YSkgPT4gUHJvbWlzZTx2b2lkPixcclxuICAgIGluamVjdEh0bWxJblRhZzogKHR5cGU6IFBvaVR5cGUsIG9iajogRGJPYmplY3RUeXBlLCBzaWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxyXG4gICk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCBtYXR0ZXJ0YWdEYXRhID0gdGhpcy5kaWN0aW9ubmFyeVRhZ3MuZ2V0KG1hdHRlcnRhZ0lEKTtcclxuICAgIGlmICghbWF0dGVydGFnRGF0YSkgcmV0dXJuO1xyXG5cclxuICAgIGlmIChvYmplY3QpIHtcclxuICAgICAgbWF0dGVydGFnRGF0YS5zZXRPYmplY3Qob2JqZWN0LCBwb2lUeXBlKTtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCBzZXRUYWdJY29uQW5kT3BhY2l0eShtYXR0ZXJ0YWdJRCwgbWF0dGVydGFnRGF0YSk7XHJcbiAgICBhd2FpdCBpbmplY3RIdG1sSW5UYWcocG9pVHlwZSwgb2JqZWN0LCBtYXR0ZXJ0YWdJRCk7XHJcbiAgfVxyXG5cclxuICAvKiogUmVnaXN0ZXJzIGEgY3VzdG9tIHRleHR1cmUgYW5kIGFwcGxpZXMgaXQgdG8gYSB0YWcsIG9wdGlvbmFsbHkgYWRqdXN0aW5nIG9wYWNpdHkuICovXHJcbiAgYXN5bmMgYWRkTmV3SWNvbkFuZFNldEZvclRhZyhcclxuICAgIHNkazogYW55LFxyXG4gICAgbWF0dGVydGFnSUQ6IHN0cmluZyxcclxuICAgIGljb25QYXRoOiBzdHJpbmcsXHJcbiAgICBhcHBseU9wYWNpdHk6IGJvb2xlYW4sXHJcbiAgICBvcGFjaXR5OiBudW1iZXJcclxuICApIHtcclxuICAgIGlmICghc2RrKSByZXR1cm47XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBpY29uTmFtZSA9IGBjdXN0b20taWNvbi0ke21hdHRlcnRhZ0lEfWA7XHJcbiAgICAgIGF3YWl0IHNkay5Bc3NldC5yZWdpc3RlclRleHR1cmUoaWNvbk5hbWUsIGljb25QYXRoKTtcclxuICAgICAgYXdhaXQgc2RrLlRhZy5lZGl0SWNvbihtYXR0ZXJ0YWdJRCwgaWNvbk5hbWUpO1xyXG5cclxuICAgICAgaWYgKGFwcGx5T3BhY2l0eSkge1xyXG4gICAgICAgIGF3YWl0IHNkay5UYWcuZWRpdE9wYWNpdHkobWF0dGVydGFnSUQsIG9wYWNpdHkpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignRXJyb3Igc2V0dGluZyBjdXN0b20gaWNvbiBvciBvcGFjaXR5JywgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIEZpbmRzIHRoZSB0YWcgSUQgYW5kIHN3ZWVwIElEIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIGVsZW1lbnQgSUQuICovXHJcbiAgZ2V0VGFnRnJvbUVsZW1lbnRJZChlbGVtZW50SUQ6IHN0cmluZywgc3dlZXBzOiBzdHJpbmdbXSB8IG51bGwpOiB7IHRhZzogc3RyaW5nIHwgbnVsbDsgc3dlZXA6IHN0cmluZyB8IG51bGwgfSB7XHJcbiAgICBsZXQgdGFnSUQgPSBudWxsO1xyXG4gICAgbGV0IHN3ZWVwSUQgPSBudWxsO1xyXG4gICAgZm9yIChsZXQgW21hdHRlcnRhZ0lELCBtYXR0ZXJ0YWdEYXRhXSBvZiB0aGlzLmRpY3Rpb25uYXJ5VGFncykge1xyXG4gICAgICBpZiAobWF0dGVydGFnRGF0YS5lbGVtZW50SUQgPT09IGVsZW1lbnRJRCkge1xyXG4gICAgICAgIHRhZ0lEID0gbWF0dGVydGFnSUQ7XHJcbiAgICAgICAgY29uc3Qgc3dlZXAgPSBtYXR0ZXJ0YWdEYXRhLmdldFN3ZWVwSUQoKTtcclxuICAgICAgICBpZiAoc3dlZXAgJiYgc3dlZXBzKSB7XHJcbiAgICAgICAgICAvLyBzd2VlcCBpcyBhIHV1aWQ7IHN3ZWVwcyBhcnJheSBjb250YWlucyBzaWRzIOKAkyBjaGVjayBib3RoIGZvcm1hdHNcclxuICAgICAgICAgIGNvbnN0IHJlc29sdmVkU2lkID0gdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5yZXNvbHZlU3dlZXBTaWQoc3dlZXApO1xyXG4gICAgICAgICAgaWYgKHN3ZWVwcy5pbmNsdWRlcyhzd2VlcCkgfHwgc3dlZXBzLmluY2x1ZGVzKHJlc29sdmVkU2lkKSkge1xyXG4gICAgICAgICAgICBzd2VlcElEID0gc3dlZXA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4geyB0YWc6IHRhZ0lELCBzd2VlcDogc3dlZXBJRCB9O1xyXG4gIH1cclxuXHJcbiAgLyoqIFJldHJpZXZlcyB0aGUgZmxvb3IgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggYSB0YWcgYmFzZWQgb24gaXRzIHN3ZWVwIGRhdGEuXHJcbiAgICogIEhhbmRsZXMgYm90aCB0aGUgb2JqZWN0IGZvcm0gKHsgZmxvb3JJbmZvOiB7IGlkLCBzZXF1ZW5jZSB9LCBmbG9vcjogeyBpZCB9IH0pXHJcbiAgICogIGFuZCB0aGUgcHJpbWl0aXZlIGZvcm0gKGZsb29yOiBudW1iZXIpIHVzZWQgYnkgTWF0dGVycG9ydCBTREsgdjMuXHJcbiAgICovXHJcbiAgZ2V0Rmxvb3JJZEZvclRhZyhtYXR0ZXJ0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhLCBzd2VlcENvbGxlY3Rpb246IGFueSk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgY29uc3Qgc3dlZXBJZCA9IG1hdHRlcnRhZ0RhdGEuZ2V0U3dlZXBJRCgpO1xyXG4gICAgaWYgKCFzd2VlcElkIHx8ICFzd2VlcENvbGxlY3Rpb24pIHJldHVybiBudWxsO1xyXG5cclxuICAgIGNvbnN0IHN3ZWVwRGF0YSA9IHN3ZWVwQ29sbGVjdGlvbltzd2VlcElkXTtcclxuICAgIGlmICghc3dlZXBEYXRhKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAvLyBTREsgdjM6IHN3ZWVwLmZsb29yIGlzIGEgcHJpbWl0aXZlIG51bWJlciAodGhlIHNlcXVlbmNlIGluZGV4KVxyXG4gICAgaWYgKHR5cGVvZiBzd2VlcERhdGEuZmxvb3IgPT09ICdudW1iZXInKSB7XHJcbiAgICAgIHJldHVybiBzd2VlcERhdGEuZmxvb3IudG9TdHJpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBPbGRlciAvIGV4dGVuZGVkIGZvcm1hdHNcclxuICAgIHJldHVybiBzd2VlcERhdGE/LmZsb29ySW5mbz8uaWRcclxuICAgICAgPz8gc3dlZXBEYXRhPy5mbG9vckluZm8/LnNlcXVlbmNlPy50b1N0cmluZygpXHJcbiAgICAgID8/IHN3ZWVwRGF0YT8uZmxvb3JJZFxyXG4gICAgICA/PyBzd2VlcERhdGE/LmZsb29yPy5pZFxyXG4gICAgICA/PyBzd2VlcERhdGE/LmZsb29yPy5zZXF1ZW5jZT8udG9TdHJpbmcoKVxyXG4gICAgICA/PyBudWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW5qZWN0cyBjdXN0b20gSFRNTCBvciBmYWxsYmFjayBiaWxsYm9hcmQgbWVkaWEgaW50byBhIE1hdHRlcnRhZyBzYW5kYm94LlxyXG4gICAqIEF0dGFjaGVzIGV2ZW50IGxpc3RlbmVycyBmb3IgaW50ZXJhY3RpdmUgZWxlbWVudHMgd2l0aGluIHRoZSB0YWcuXHJcbiAgICovXHJcbiAgYXN5bmMgaW5qZWN0SHRtbEluVGFnKHNkazogYW55LCB0YWdUeXBlOiBQb2lUeXBlLCBvYmplY3Q6IERiT2JqZWN0VHlwZSwgdGFnSUQ6IHN0cmluZykge1xyXG4gICAgaWYgKCF0aGlzLnRhZ1NlcnZpY2UpIHtcclxuICAgICAgY29uc29sZS5lcnJvcignW01hdHRlcnBvcnRUYWdTZXJ2aWNlXSB0YWdTZXJ2aWNlIGlzIG5vdCBpbml0aWFsaXplZC4nKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGh0bWwgPSBhd2FpdCB0aGlzLnRhZ1NlcnZpY2UuZ2V0SHRtbFRvSW5qZWN0KHRhZ1R5cGUsIG9iamVjdCk7XHJcblxyXG4gICAgICBpZiAoaHRtbCAmJiBodG1sLnRyaW0oKS5sZW5ndGggPiAwICYmIHNkaykge1xyXG4gICAgICAgIGNvbnN0IHNjcmlwdFRhZyA9IHRoaXMudGFnU2VydmljZS5nZXRTY3JpcHRGb3JUYWcob2JqZWN0LCB0YWdUeXBlKTtcclxuICAgICAgICBodG1sICs9IGAke3NjcmlwdFRhZ31gO1xyXG5cclxuICAgICAgICBjb25zdCBbc2FuZGJveElkLCBtZXNzZW5nZXJdID0gYXdhaXQgc2RrLlRhZy5yZWdpc3RlclNhbmRib3goaHRtbCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGF0dGFjaG1lbnRJRCA9IHRoaXMudGFnc0F0dGFjaG1lbnRzW3RhZ0lEXTtcclxuICAgICAgICBpZiAoYXR0YWNobWVudElEKSB7XHJcbiAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCBzZGsuVGFnLmRldGFjaCh0YWdJRCwgYXR0YWNobWVudElEKTtcclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy50YWdzQXR0YWNobWVudHNbdGFnSURdID0gc2FuZGJveElkO1xyXG4gICAgICAgIGF3YWl0IHNkay5UYWcuYXR0YWNoKHRhZ0lELCBzYW5kYm94SWQpO1xyXG5cclxuICAgICAgICAvLyBBdHRhY2ggdGhlIFwiVmlldyBpbmZvcm1hdGlvbnNcIiBoYW5kbGVyIGluIHRvb2x0aXBcclxuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLkRFVEFJTF9DTElDSywgdGhpcy50YWdTZXJ2aWNlLm9uQWN0aW9uRGV0YWlsQ2xpY2suYmluZCh0aGlzLnRhZ1NlcnZpY2UpKTtcclxuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLlRJQ0tFVF9DTElDSywgdGhpcy50YWdTZXJ2aWNlLm9uQWN0aW9uRGV0YWlsQ2xpY2suYmluZCh0aGlzLnRhZ1NlcnZpY2UpKTtcclxuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLkFVRElPX0NMSUNLLCAoYXVkaW9Db21tZW50SUQ6IHN0cmluZykgPT4gdGhpcy50YWdTZXJ2aWNlLm9uQWN0aW9uQXVkaW9DbGljayhhdWRpb0NvbW1lbnRJRCkpO1xyXG4gICAgICAgIG1lc3Nlbmdlci5vbihUYWdBY3Rpb24uVklERU9fQ0xJQ0ssICh2aWRlb1VybDogc3RyaW5nKSA9PiB0aGlzLnRhZ1NlcnZpY2Uub25BY3Rpb25WaWRlb0NsaWNrKHZpZGVvVXJsKSk7XHJcbiAgICAgICAgbWVzc2VuZ2VyLm9uKFRhZ0FjdGlvbi5JTUFHRV9DTElDSywgKGltYWdlQ29tbWVudElEOiBzdHJpbmcpID0+IHRoaXMudGFnU2VydmljZS5vbkFjdGlvbkltYWdlQ2xpY2soaW1hZ2VDb21tZW50SUQpKTtcclxuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLkRPQ19DTElDSywgKGRvY1VybDogc3RyaW5nKSA9PiB0aGlzLnRhZ1NlcnZpY2Uub25BY3Rpb25Eb2NDbGljayhkb2NVcmwpKTtcclxuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLllPVVRVQkVfQ0xJQ0ssICh5b3V0dWJlVXJsOiBzdHJpbmcpID0+IHRoaXMudGFnU2VydmljZS5vbkFjdGlvbllvdXR1YmVDbGljayh5b3V0dWJlVXJsKSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoc2RrKSB7XHJcbiAgICAgICAgY29uc3QgeyBjb21tZW50LCB0YWdEZXNjcmlwdGlvbiB9ID0gdGhpcy50YWdTZXJ2aWNlLmdldEJpbGxib2FyZE1lZGlhVG9FbWJlZChvYmplY3QpO1xyXG5cclxuICAgICAgICBpZiAoY29tbWVudCkge1xyXG4gICAgICAgICAgLy8gMSkgUmVnaXN0ZXIgdGhlIG1lZGlhIGF0dGFjaG1lbnQgYnkgcGFzc2luZyB0aGUgVVJMIHN0cmluZyhzKS5cclxuICAgICAgICAgIC8vICAgIHJlZ2lzdGVyQXR0YWNobWVudCByZXR1cm5zIGFuIGFycmF5IG9mIGF0dGFjaG1lbnQgSURzLlxyXG4gICAgICAgICAgY29uc3QgW2F0dGFjaG1lbnRJRF0gPSBhd2FpdCBzZGsuVGFnLnJlZ2lzdGVyQXR0YWNobWVudChjb21tZW50LmV4dGVybmFsTGluayk7XHJcblxyXG4gICAgICAgICAgLy8gMikgQXR0YWNoIHRoZSByZWdpc3RlcmVkIG1lZGlhIHRvIHRoZSB0YWcuXHJcbiAgICAgICAgICBhd2FpdCBzZGsuVGFnLmF0dGFjaCh0YWdJRCwgYXR0YWNobWVudElEKTtcclxuXHJcbiAgICAgICAgICAvLyAzKSBEZXRlcm1pbmUgbWVkaWEgdHlwZSBmb3IgdGhlIGJpbGxib2FyZCAoUEhPVE8gb3IgVklERU8pLlxyXG4gICAgICAgICAgLy8gICAgVXNlIGEgc2ltcGxlIGhldXJpc3RpYzogWW91VHViZS9WaW1lbyAtPiBWSURFTywgb3RoZXJ3aXNlIFBIT1RPLlxyXG4gICAgICAgICAgLy8gICAgVGhlIFNESyBleHBvc2VzIE1lZGlhVHlwZSBvbiB0aGUgVGFnIG5hbWVzcGFjZS5cclxuICAgICAgICAgIGNvbnN0IGlzVmlkZW8gPSAveW91dHViZVxcLmNvbXx5b3V0dVxcLmJlfHZpbWVvXFwuY29tL2kudGVzdChjb21tZW50LmV4dGVybmFsTGluayk7XHJcbiAgICAgICAgICBjb25zdCBtZWRpYVR5cGUgPSBpc1ZpZGVvID8gc2RrLk1hdHRlcnRhZy5NZWRpYVR5cGUuVklERU8gOiBzZGsuTWF0dGVydGFnLk1lZGlhVHlwZS5QSE9UTztcclxuXHJcbiAgICAgICAgICAvLyA0KSBVcGRhdGUgdGhlIGJpbGxib2FyZCB0ZXh0IGFuZCBtZWRpYSB1c2luZyBlZGl0QmlsbGJvYXJkLlxyXG4gICAgICAgICAgLy8gICAgZWRpdEJpbGxib2FyZCBhY2NlcHRzIFBhcnRpYWw8VGFnLkVkaXRhYmxlUHJvcGVydGllcz4gc3VjaCBhcyBsYWJlbCwgZGVzY3JpcHRpb24sIG1lZGlhLlxyXG4gICAgICAgICAgYXdhaXQgc2RrLlRhZy5lZGl0QmlsbGJvYXJkKHRhZ0lELCB7XHJcbiAgICAgICAgICAgIGxhYmVsOiBvYmplY3QudGl0bGUgfHwgJ01lZGlhJyxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHRhZ0Rlc2NyaXB0aW9uIHx8ICcnLFxyXG4gICAgICAgICAgICBtZWRpYToge1xyXG4gICAgICAgICAgICAgIHR5cGU6IG1lZGlhVHlwZSxcclxuICAgICAgICAgICAgICBzcmM6IGNvbW1lbnQuZXh0ZXJuYWxMaW5rLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgLy8gNSkgS2VlcCBhIGxvY2FsIHJlZmVyZW5jZVxyXG4gICAgICAgICAgdGhpcy50YWdzQXR0YWNobWVudHNbdGFnSURdID0ge1xyXG4gICAgICAgICAgICBhdHRhY2htZW50SUQsXHJcbiAgICAgICAgICAgIHRpdGxlOiBvYmplY3QudGl0bGUgfHwgJ01lZGlhJyxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246IHRhZ0Rlc2NyaXB0aW9uIHx8ICcnLFxyXG4gICAgICAgICAgICBtZWRpYVNyYzogY29tbWVudC5leHRlcm5hbExpbmssXHJcbiAgICAgICAgICAgIG1lZGlhVHlwZSxcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIEVycm9yIGluIGluamVjdEh0bWxJblRhZzonLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogQ2xlYXJzIGFsbCBsb2NhbCB0YWcgZGF0YSBhbmQgcmVzZXRzIHRoZSBhZGRpdGlvbiBxdWV1ZS4gKi9cclxuICBjbGVhcigpIHtcclxuICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLmNsZWFyKCk7XHJcbiAgICB0aGlzLnRhZ0FkZFF1ZXVlID0gUHJvbWlzZS5yZXNvbHZlKCk7XHJcbiAgICB0aGlzLm1hdHRlcnRhZ1RvRm9sbG93ID0gbnVsbDtcclxuICAgIHRoaXMubWF0dGVydGFnSURzID0gW107XHJcbiAgfVxyXG59XHJcbiJdfQ==
594
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0dGVycG9ydC10YWcuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1jb3JlL3NyYy9saWIvc2VydmljZXMvbWF0dGVycG9ydC10YWcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQWtELFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV6RyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7OztBQU0xQyxNQUFNLE9BQU8sb0JBQW9CO0lBZ0NyQjtJQS9CVixvRUFBb0U7SUFDNUQsTUFBTSxDQUFVLHFCQUFxQixHQUFHLHlCQUF5QixDQUFDO0lBRW5FLGVBQWUsR0FBK0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUN4RCxXQUFXLEdBQWlCLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM5QyxpQkFBaUIsR0FBa0IsSUFBSSxDQUFDO0lBQ3hDLFNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO0lBQ2xDLFlBQVksR0FBa0IsRUFBRSxDQUFDO0lBQ2pDLGVBQWUsR0FBVyxFQUFFLENBQUM7SUFDN0IsY0FBYyxHQUFZLEtBQUssQ0FBQztJQUNoQyxVQUFVLEdBQTBCLElBQUksQ0FBQztJQUN4QyxrQkFBa0IsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNwRCxrQkFBa0IsR0FBeUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUM3RDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0ssY0FBYyxHQUFRLElBQUksQ0FBQztJQUMzQixxQkFBcUIsR0FBd0Is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Q0FBQyxDQUFDO29CQUVILDRCQUE0QjtvQkFDNUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsR0FBRzt3QkFDNUIsWUFBWTt3QkFDWixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssSUFBSSxPQUFPO3dCQUM5QixXQUFXLEVBQUUsY0FBYyxJQUFJLEVBQUU7d0JBQ2pDLFFBQVEsRUFBRSxPQUFPLENBQUMsWUFBWTt3QkFDOUIsU0FBUztxQkFDVixDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLGtEQUFrRCxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNFLENBQUM7SUFDSCxDQUFDO0lBRUQsK0RBQStEO0lBQy9ELEtBQUs7UUFDSCxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN2QiwyRUFBMkU7UUFDM0UsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztJQUNwQyxDQUFDO3dHQW5vQlUsb0JBQW9COzRHQUFwQixvQkFBb0IsY0FGbkIsTUFBTTs7NEZBRVAsb0JBQW9CO2tCQUhoQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzRGV2TW9kZSwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE1hdHRlcnRhZ0RhdGEgfSBmcm9tICcuLi9tYXR0ZXJ0YWdEYXRhJztcclxuaW1wb3J0IHsgUG9pVHlwZSwgRGJPYmplY3RUeXBlLCBQT0ksIFZpZXdlckludGVyYWN0aW9ucywgVGFnQWN0aW9uLCBDYW1lcmFNb2RlIH0gZnJvbSAnLi4vdHlwZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IE1hdHRlcnBvcnROYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4vbWF0dGVycG9ydC1uYXZpZ2F0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyB3YWl0IH0gZnJvbSAnLi4vaGVscGVycy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQmFzZVRhZ1NlcnZpY2UgfSBmcm9tICcuL3RhZy5zZXJ2aWNlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNYXR0ZXJwb3J0VGFnU2VydmljZSB7XHJcbiAgLyoqIE5hbWUgb2YgdGhlIGNvbW1vbiBsYXllciBldmVyeSBTbWFydGVycGxhbiB0YWcgaXMgY3JlYXRlZCBpbi4gKi9cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTSEFSRURfVEFHX0xBWUVSX05BTUUgPSAnc21hcnRlcnBsYW4tc2hhcmVkLXRhZ3MnO1xyXG5cclxuICBwdWJsaWMgZGljdGlvbm5hcnlUYWdzOiBNYXA8c3RyaW5nLCBNYXR0ZXJ0YWdEYXRhPiA9IG5ldyBNYXAoKTtcclxuICBwdWJsaWMgdGFnQWRkUXVldWU6IFByb21pc2U8YW55PiA9IFByb21pc2UucmVzb2x2ZSgpO1xyXG4gIHB1YmxpYyBtYXR0ZXJ0YWdUb0ZvbGxvdzogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcbiAgcHVibGljIG9uR29Ub1RhZyA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcclxuICBwdWJsaWMgbWF0dGVydGFnSURzOiBBcnJheTxzdHJpbmc+ID0gW107XHJcbiAgcHVibGljIHRhZ3NBdHRhY2htZW50czogT2JqZWN0ID0ge307XHJcbiAgcHVibGljIHRhZ01lc3Nlbmdlck9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHRhZ1NlcnZpY2U6IEJhc2VUYWdTZXJ2aWNlIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSB0YWdzQ3VycmVudE9wYWNpdHk6IE1hcDxzdHJpbmcsIG51bWJlcj4gPSBuZXcgTWFwKCk7XHJcbiAgcHJpdmF0ZSB0YWdzQ3VycmVudEVuYWJsZWQ6IE1hcDxzdHJpbmcsIGJvb2xlYW4+ID0gbmV3IE1hcCgpO1xyXG4gIC8qKlxyXG4gICAqIFNpbmdsZSBsYXllciBob2xkaW5nIGV2ZXJ5IFNtYXJ0ZXJwbGFuIHRhZywgYWRkZWQgdG8gZXZlcnkgdmlldyBvZiB0aGUgc3BhY2Ugc28gYVxyXG4gICAqIHRhZyBzdGF5cyBpbiBwbGFjZSDigJQgc2FtZSBzaWQsIHNhbWUgY29udGVudCDigJQgd2hlbiB0aGUgdXNlciBzd2l0Y2hlcyBiZXR3ZWVuIHRoZVxyXG4gICAqIGZ1cm5pc2hlZCBhbmQgdGhlIERlZnVybmlzaGVkIHZpZXcuIFRhZ3MgYWRkZWQgdG8gdGhlIGdsb2JhbCBzZGsuVGFnIChvciB0byBhXHJcbiAgICogdmlldydzIG93biBsYXllcikgYmVsb25nIHRvIHRoYXQgdmlldyBvbmx5LCB3aGljaCBpcyB3aGF0IG1hZGUgdGhlbSBwb3AgaW4gYW5kIG91dFxyXG4gICAqIG9uIGV2ZXJ5IHZpZXcgY2hhbmdlLlxyXG4gICAqXHJcbiAgICogRGVsaWJlcmF0ZWx5IE5PVCBjcmVhdGVkIHdpdGggYHsgY29tbW9uOiB0cnVlIH1gOiBpbiBTREsgMjYuNy41IGEgY29tbW9uIGxheWVyIGlzXHJcbiAgICogcHVzaGVkIGludG8gYGdldE9yZGVyZWRNb2RlbFZpZXdzKClgIGF0IGNyZWF0aW9uIHRpbWUsIGFuZCB0aGF0IGNhbGwgZGVmYXVsdHMgdG9cclxuICAgKiBgaW5jbHVkZURlZnVybmlzaDogZmFsc2VgLCBzbyB0aGUgRGVmdXJuaXNoZWQgdmlldyBuZXZlciByZWNlaXZlcyBpdCDigJQgd2hpbGVcclxuICAgKiBgVmlldy5hZGRMYXllcigpYCByZWZ1c2VzIHRvIHJlcGFpciBpdCAoXCJMYXllciBpcyBjb21tb24uIE5vIG5lZWQgdG8gYWRkLlwiKS4gQVxyXG4gICAqIHBsYWluIGxheWVyIHdlIGF0dGFjaCB0byBlYWNoIHZpZXcgb3Vyc2VsdmVzIHJlYWNoZXMgZXZlcnkgdmlldywgRGVmdXJuaXNoZWRcclxuICAgKiBpbmNsdWRlZC4gU2VlIGF0dGFjaFNoYXJlZFRhZ0xheWVyVG9WaWV3cygpLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2hhcmVkVGFnTGF5ZXI6IGFueSA9IG51bGw7XHJcbiAgcHJpdmF0ZSBzaGFyZWRUYWdMYXllclByb21pc2U6IFByb21pc2U8YW55PiB8IG51bGwgPSBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgbmF2aWdhdGlvblNlcnZpY2U6IE1hdHRlcnBvcnROYXZpZ2F0aW9uU2VydmljZVxyXG4gICkgeyB9XHJcblxyXG4gIHNldFRhZ1NlcnZpY2Uoc2VydmljZTogQmFzZVRhZ1NlcnZpY2UpOiB2b2lkIHtcclxuICAgIHRoaXMudGFnU2VydmljZSA9IHNlcnZpY2U7XHJcbiAgfVxyXG5cclxuICAvKiogT3BlbnMgYSBzcGVjaWZpYyB0YWcgaW4gdGhlIE1hdHRlcnBvcnQgdmlld2VyIGJ5IGl0cyBJRC4gKi9cclxuICBhc3luYyBnb1RvVGFnKHNkazogYW55LCBzaWQ6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XHJcbiAgICBpZiAoIXNkaykgcmV0dXJuO1xyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5vbkdvVG9UYWcubmV4dChzaWQpO1xyXG4gICAgICAvLyBgb3BlbmAgb25seSBleGlzdHMgb24gdGhlIGdsb2JhbCBUYWcgbW9kdWxlLCBuZXZlciBvbiBhIGxheWVyLXNjb3BlZCBvbmUuXHJcbiAgICAgIGF3YWl0IHNkay5UYWcub3BlbihzaWQpO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignQ2Fubm90IG9wZW4gdGFnJywgc2lkLCBlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgdGhlIFNESyBUYWcgbW9kdWxlIHRvIHVzZSBmb3IgYW4gb3BlcmF0aW9uIGFkZHJlc3NpbmcgYW4gZXhpc3RpbmcgdGFnIGJ5IElEXHJcbiAgICogKGljb24sIG9wYWNpdHksIHBvc2l0aW9uLCBhdHRhY2htZW50cywgcmVtb3ZhbC4uLik6IGFsd2F5cyB0aGUgZ2xvYmFsIHNkay5UYWcuXHJcbiAgICpcclxuICAgKiBBIGxheWVyLXNjb3BlZCBUYWcgbW9kdWxlIG9ubHkgZXhwb3NlcyB0aGUgKnJlcGxheWFibGUqIG11dGF0aW9ucywgbWVhbnQgdG8gYnVpbGRcclxuICAgKiB0aGUgbGF5ZXIncyBvd24gY29udGVudDsgYXBwbHlpbmcgdGhlbSB0byBhbiBhbHJlYWR5LWNyZWF0ZWQgdGFnIHNpbGVudGx5IGRvZXNcclxuICAgKiBub3RoaW5nIOKAlCB3aGljaCBpcyB3aGF0IGxlZnQgZXZlcnkgcGluIHdoaXRlIGluc3RlYWQgb2YgY2FycnlpbmcgaXRzIGljb24uIE9ubHlcclxuICAgKiBgYWRkYCBoYXMgdG8gZ28gdGhyb3VnaCB0aGUgbGF5ZXIsIHNlZSBnZXRUYWdDcmVhdGlvbk1vZHVsZSgpLlxyXG4gICAqL1xyXG4gIGdldFRhZ01vZHVsZShzZGs6IGFueSwgdGFnSWQ6IHN0cmluZyk6IGFueSB7XHJcbiAgICByZXR1cm4gc2RrPy5UYWc7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBUYWcgbW9kdWxlIGV2ZXJ5IG5ldyB0YWcgbXVzdCBiZSBjcmVhdGVkIHRocm91Z2g6IHRoZSBzaGFyZWQgbGF5ZXJcclxuICAgKiB3aGVuIHRoZSBWaWV3IEFQSSBpcyBhdmFpbGFibGUsIHRoZSBnbG9iYWwgc2RrLlRhZyBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgYXN5bmMgZ2V0VGFnQ3JlYXRpb25Nb2R1bGUoc2RrOiBhbnkpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgbGF5ZXIgPSBhd2FpdCB0aGlzLmVuc3VyZVNoYXJlZFRhZ0xheWVyKHNkayk7XHJcbiAgICByZXR1cm4gbGF5ZXI/LlRhZyB8fCBzZGs/LlRhZztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZXMgKG9uY2UgcGVyIFNESyBzZXNzaW9uKSBhbmQgcmV0dXJucyB0aGUgc2hhcmVkIHRhZyBsYXllci5cclxuICAgKiBSZXNvbHZlcyB0byBudWxsIHdoZW4gdGhlIFZpZXcgQVBJIGlzIHVuYXZhaWxhYmxlLCBzbyBjYWxsZXJzIHRyYW5zcGFyZW50bHkgZmFsbFxyXG4gICAqIGJhY2sgdG8gdGhlIGdsb2JhbCBzZGsuVGFnLlxyXG4gICAqL1xyXG4gIGFzeW5jIGVuc3VyZVNoYXJlZFRhZ0xheWVyKHNkazogYW55KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGlmICh0aGlzLnNoYXJlZFRhZ0xheWVyKSByZXR1cm4gdGhpcy5zaGFyZWRUYWdMYXllcjtcclxuICAgIGlmICghc2RrPy5WaWV3Py5jcmVhdGVMYXllcikgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgaWYgKCF0aGlzLnNoYXJlZFRhZ0xheWVyUHJvbWlzZSkge1xyXG4gICAgICB0aGlzLnNoYXJlZFRhZ0xheWVyUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShcclxuICAgICAgICBzZGsuVmlldy5jcmVhdGVMYXllcihNYXR0ZXJwb3J0VGFnU2VydmljZS5TSEFSRURfVEFHX0xBWUVSX05BTUUpXHJcbiAgICAgIClcclxuICAgICAgICAudGhlbihhc3luYyAobGF5ZXI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zaGFyZWRUYWdMYXllciA9IGxheWVyO1xyXG4gICAgICAgICAgLy8gQSBmcmVzaGx5IGNyZWF0ZWQgbGF5ZXIgY2FuIGNvbWUgYmFjayB0b2dnbGVkIG9mZiwgd2hpY2ggaGlkZXMgaXRzIHRhZ3MuXHJcbiAgICAgICAgICBpZiAobGF5ZXIgJiYgbGF5ZXIudG9nZ2xlZCA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgYXdhaXQgbGF5ZXIudG9nZ2xlKHRydWUpLmNhdGNoKCgpID0+IHsgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gbGF5ZXI7XHJcbiAgICAgICAgfSlcclxuICAgICAgICAuY2F0Y2goKGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgLy8gQWxsb3cgYSBsYXRlciByZXRyeSAoZS5nLiB0aGUgU0RLIHdhcyBub3QgZnVsbHkgcmVhZHkgeWV0KS5cclxuICAgICAgICAgIHRoaXMuc2hhcmVkVGFnTGF5ZXJQcm9taXNlID0gbnVsbDtcclxuICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIENvdWxkIG5vdCBjcmVhdGUgdGhlIHNoYXJlZCB0YWcgbGF5ZXInLCBlKTtcclxuICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLnNoYXJlZFRhZ0xheWVyUHJvbWlzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ha2VzIHN1cmUgdGhlIHNoYXJlZCBsYXllciBpcyBwYXJ0IG9mIGV2ZXJ5IHZpZXcgb2YgdGhlIHNwYWNlLCBEZWZ1cm5pc2hlZFxyXG4gICAqIGluY2x1ZGVkLiBUaGlzIGlzIHdoYXQgYWN0dWFsbHkgc2hhcmVzIHRoZSB0YWdzIGFjcm9zcyB2aWV3cywgYW5kIHRoZSByZWFzb24gdGhlXHJcbiAgICogbGF5ZXIgbXVzdCBub3QgYmUgYSBjb21tb24gb25lOiB0aGUgU0RLIG9ubHkgcGVyZm9ybXMgdGhlIGF0dGFjaG1lbnQgZm9yXHJcbiAgICogbm9uLWNvbW1vbiBsYXllcnMuIElkZW1wb3RlbnQsIHNvIGl0IGNhbiBydW4gb24gZXZlcnkgdmlldyBjb2xsZWN0aW9uIHVwZGF0ZS5cclxuICAgKi9cclxuICBhc3luYyBhdHRhY2hTaGFyZWRUYWdMYXllclRvVmlld3Moc2RrOiBhbnksIHZpZXdzOiBJdGVyYWJsZTxhbnk+KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBsYXllciA9IGF3YWl0IHRoaXMuZW5zdXJlU2hhcmVkVGFnTGF5ZXIoc2RrKTtcclxuICAgIGlmICghbGF5ZXIpIHJldHVybjtcclxuXHJcbiAgICBmb3IgKGNvbnN0IHZpZXcgb2Ygdmlld3MpIHtcclxuICAgICAgaWYgKCF2aWV3Py5hZGRMYXllciB8fCB2aWV3Lmhhc0xheWVyPy4obGF5ZXIpKSBjb250aW51ZTtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBhd2FpdCB2aWV3LmFkZExheWVyKGxheWVyKTtcclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIENhbm5vdCBhZGQgdGhlIHNoYXJlZCB0YWcgbGF5ZXIgdG8gdmlldycsIHZpZXc/LmlkLCBlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkcyBhIHRhZyB0aHJvdWdoIHRoZSBzaGFyZWQgbGF5ZXIgc28gaXQgZXhpc3RzIGluIGV2ZXJ5IHZpZXcuIEZhbGxzIGJhY2tcclxuICAgKiB0byB0aGUgZ2xvYmFsIHNkay5UYWcgd2hlbiB0aGUgVmlldyBBUEkgaXMgdW5hdmFpbGFibGU7IHRoYXQgY2FsbCBpcyByYWNlZCBhZ2FpbnN0XHJcbiAgICogYSB0aW1lb3V0IGFzIGEgc2FmZXR5IG5ldCwgc2luY2UgaXQgbmV2ZXIgcmVzb2x2ZXMgd2hpbGUgYSBEZWZ1cm5pc2hlZCB2aWV3IGlzXHJcbiAgICogYWN0aXZlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXN5bmMgYWRkVGFnVG9TZGsoc2RrOiBhbnksIGRlc2NyaXB0b3I6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcclxuICAgIGNvbnN0IHNoYXJlZFRhZ01vZHVsZSA9IGF3YWl0IHRoaXMuZ2V0VGFnQ3JlYXRpb25Nb2R1bGUoc2RrKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBzaWRMaXN0ID0gKGF3YWl0IFByb21pc2UucmFjZShbXHJcbiAgICAgICAgc2hhcmVkVGFnTW9kdWxlLmFkZChkZXNjcmlwdG9yKSxcclxuICAgICAgICBuZXcgUHJvbWlzZTxuZXZlcj4oKF8sIHJlamVjdCkgPT5cclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcignVGFnLmFkZCB0aW1lZCBvdXQnKSksIDQwMDApXHJcbiAgICAgICAgKSxcclxuICAgICAgXSkpIGFzIHN0cmluZ1tdO1xyXG4gICAgICBpZiAoc2lkTGlzdD8ubGVuZ3RoKSByZXR1cm4gc2lkTGlzdFswXTtcclxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuICAgICAgaWYgKGVycm9yPy5tZXNzYWdlPy5pbmNsdWRlcygnYWxyZWFkeSBpbiB1c2UnKSkgdGhyb3cgZXJyb3I7XHJcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIFRhZy5hZGQgZmFpbGVkL3RpbWVkIG91dCcsIGVycm9yPy5tZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKiBPcGVucyB0aGUgbW9zdCByZWNlbnRseSBjcmVhdGVkIHRhZyBpbiB0aGUgdmlld2VyLiAqL1xyXG4gIGFzeW5jIGdvVG9MYXN0VGFnKHNkazogYW55KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGlmICghc2RrIHx8IHRoaXMubWF0dGVydGFnSURzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xyXG4gICAgY29uc3QgbGFzdFNpZCA9IHRoaXMubWF0dGVydGFnSURzW3RoaXMubWF0dGVydGFnSURzLmxlbmd0aCAtIDFdO1xyXG4gICAgcmV0dXJuIHRoaXMuZ29Ub1RhZyhzZGssIGxhc3RTaWQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkcyBhIE1hdHRlcnRhZyB0byB0aGUgdmlld2VyLCBzZXJpYWxpemluZyBjYWxscyB0byBwcmV2ZW50IFNESyByYWNlIGNvbmRpdGlvbnMuXHJcbiAgICogUmV1c2VzIGV4aXN0aW5nIElEcyBpZiB0aGUgdGFnIGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgc2Vzc2lvbi5cclxuICAgKi9cclxuICBhc3luYyBhZGRNYXR0ZXJ0YWdUb1ZpZXdlcihzZGs6IGFueSwgbWF0dGVydGFnRGF0YTogTWF0dGVydGFnRGF0YSk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xyXG4gICAgaWYgKCFzZGspIHJldHVybiBudWxsO1xyXG5cclxuICAgIHRoaXMudGFnQWRkUXVldWUgPSB0aGlzLnRhZ0FkZFF1ZXVlXHJcbiAgICAgIC50aGVuKGFzeW5jICgpID0+IHtcclxuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gbWF0dGVydGFnRGF0YS5nZXRNYXR0ZXJ0YWdEZXNjcmlwdG9yKClbMF07XHJcbiAgICAgICAgY29uc3QgZXhpc3RpbmdJZCA9IGRlc2NyaXB0b3I/LmlkIHx8IG51bGw7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCBzaWQgPSBhd2FpdCB0aGlzLmFkZFRhZ1RvU2RrKHNkaywgZGVzY3JpcHRvcik7XHJcbiAgICAgICAgICBpZiAoc2lkKSB7XHJcbiAgICAgICAgICAgIG1hdHRlcnRhZ0RhdGEuc2V0TWF0dGVycG9ydFNpZChzaWQpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMubWF0dGVydGFnSURzLmluY2x1ZGVzKHNpZCkpIHtcclxuICAgICAgICAgICAgICB0aGlzLm1hdHRlcnRhZ0lEcy5wdXNoKHNpZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3Muc2V0KHNpZCwgbWF0dGVydGFnRGF0YSk7XHJcbiAgICAgICAgICAgIHJldHVybiBzaWQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignW01hdHRlcnBvcnRUYWdTZXJ2aWNlXSBUYWcuYWRkIHJldHVybmVkIG5vIHNpZCcsIGRlc2NyaXB0b3IpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuICAgICAgICAgIGlmIChlcnJvcj8ubWVzc2FnZT8uaW5jbHVkZXMoJ2FscmVhZHkgaW4gdXNlJykgJiYgZXhpc3RpbmdJZCkge1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuZGljdGlvbm5hcnlUYWdzLmhhcyhleGlzdGluZ0lkKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMubWF0dGVydGFnSURzLnB1c2goZXhpc3RpbmdJZCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3Muc2V0KGV4aXN0aW5nSWQsIG1hdHRlcnRhZ0RhdGEpO1xyXG4gICAgICAgICAgICByZXR1cm4gZXhpc3RpbmdJZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIGFkZE1hdHRlcnRhZ1RvVmlld2VyIGZhaWxlZCcsIGVycm9yKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaCgoZSkgPT4ge1xyXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdbTWF0dGVycG9ydFRhZ1NlcnZpY2VdIHRhZ0FkZFF1ZXVlIHJlamVjdGVkJywgZSk7XHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0aGlzLnRhZ0FkZFF1ZXVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW50ZXJuYWwgbWV0aG9kIHRvIGFkZCBhbmQgY29uZmlndXJlIGEgTWF0dGVydGFnIHdpdGggaWNvbiwgb3BhY2l0eSwgYW5kIEhUTUwgY29udGVudC5cclxuICAgKiBIYW5kbGVzIGV4aXN0aW5nIHRhZ3MgZ3JhY2VmdWxseSBhbmQgcXVldWVzIG9wZXJhdGlvbnMgdG8gYXZvaWQgU0RLIGNvbmZsaWN0cy5cclxuICAgKi9cclxuICBhc3luYyBfZG9BZGRNYXR0ZXJ0YWcoXHJcbiAgICBzZGs6IGFueSxcclxuICAgIG1hdHRlcnRhZ0RhdGE6IE1hdHRlcnRhZ0RhdGEsXHJcbiAgICBzZXRUYWdJY29uQW5kT3BhY2l0eTogKHNpZDogc3RyaW5nLCBtdDogTWF0dGVydGFnRGF0YSkgPT4gUHJvbWlzZTx2b2lkPixcclxuICAgIGluamVjdEh0bWxJblRhZzogKHR5cGU6IFBvaVR5cGUsIG9iajogRGJPYmplY3RUeXBlLCBzaWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPlxyXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICBjb25zdCBkZXNjcmlwdG9yID0gbWF0dGVydGFnRGF0YS5nZXRNYXR0ZXJ0YWdEZXNjcmlwdG9yKCk7XHJcbiAgICAvL2NvbnNvbGUubG9nKCdkZXNjcmlwdG9yJywgZGVzY3JpcHRvcik7XHJcbiAgICBjb25zdCBzaWQgPSBkZXNjcmlwdG9yWzBdWydpZCddO1xyXG5cclxuICAgIGlmIChzaWQgJiYgdGhpcy5kaWN0aW9ubmFyeVRhZ3MuaGFzKHNpZCkpIHtcclxuICAgICAgYXdhaXQgc2V0VGFnSWNvbkFuZE9wYWNpdHkoc2lkLCBtYXR0ZXJ0YWdEYXRhKTtcclxuICAgICAgYXdhaXQgaW5qZWN0SHRtbEluVGFnKG1hdHRlcnRhZ0RhdGEuZ2V0VHlwZSgpLCBtYXR0ZXJ0YWdEYXRhLmdldE9iamVjdCgpLCBzaWQpO1xyXG4gICAgICByZXR1cm4gc2lkO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudGFnQWRkUXVldWUgPSB0aGlzLnRhZ0FkZFF1ZXVlLnRoZW4oYXN5bmMgKCkgPT4ge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHRhZ01vZHVsZSA9IGF3YWl0IHRoaXMuZ2V0VGFnQ3JlYXRpb25Nb2R1bGUoc2RrKTtcclxuICAgICAgICBjb25zdCBbY3JlYXRlZFNpZF0gPSBhd2FpdCB0YWdNb2R1bGUuYWRkKC4uLmRlc2NyaXB0b3IpO1xyXG5cclxuICAgICAgICB0aGlzLm1hdHRlcnRhZ0lEcy5wdXNoKGNyZWF0ZWRTaWQpO1xyXG4gICAgICAgIHRoaXMuZGljdGlvbm5hcnlUYWdzLnNldChjcmVhdGVkU2lkLCBtYXR0ZXJ0YWdEYXRhKTtcclxuXHJcbiAgICAgICAgYXdhaXQgd2FpdCgxMDApO1xyXG4gICAgICAgIGF3YWl0IHNldFRhZ0ljb25BbmRPcGFjaXR5KGNyZWF0ZWRTaWQsIG1hdHRlcnRhZ0RhdGEpO1xyXG5cclxuICAgICAgICBpbmplY3RIdG1sSW5UYWcobWF0dGVydGFnRGF0YS5nZXRUeXBlKCksIG1hdHRlcnRhZ0RhdGEuZ2V0T2JqZWN0KCksIGNyZWF0ZWRTaWQpLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIGNvbnNvbGUud2FybignSFRNTCBpbmplY3Rpb24gZmFpbGVkIGZvcicsIGNyZWF0ZWRTaWQsIGVycik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBjcmVhdGVkU2lkO1xyXG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgICBpZiAoZT8ubWVzc2FnZT8uaW5jbHVkZXMoJ2FscmVhZHkgaW4gdXNlJykgJiYgc2lkKSB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuZGljdGlvbm5hcnlUYWdzLmhhcyhzaWQpKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWF0dGVydGFnSURzLnB1c2goc2lkKTtcclxuICAgICAgICAgICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3Muc2V0KHNpZCwgbWF0dGVydGFnRGF0YSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBhd2FpdCBzZXRUYWdJY29uQW5kT3BhY2l0eShzaWQsIG1hdHRlcnRhZ0RhdGEpO1xyXG4gICAgICAgICAgYXdhaXQgaW5qZWN0SHRtbEluVGFnKG1hdHRlcnRhZ0RhdGEuZ2V0VHlwZSgpLCBtYXR0ZXJ0YWdEYXRhLmdldE9iamVjdCgpLCBzaWQpO1xyXG4gICAgICAgICAgcmV0dXJuIHNpZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMudGFnQWRkUXVldWU7XHJcbiAgfVxyXG5cclxuICBnZXREaXN0YW5jZShwMTogYW55LCBwMjogYW55KTogbnVtYmVyIHtcclxuICAgIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3cocDIueCAtIHAxLngsIDIpICsgTWF0aC5wb3cocDIueSAtIHAxLnksIDIpICsgTWF0aC5wb3cocDIueiAtIHAxLnosIDIpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrcyBpZiBhIHRhZyBpcyB3aXRoaW4gdGhlIGJvdW5kaW5nIGJveCBvZiBhbnkgYWN0aXZlIHJvb20gKGFkZGluZyBhIHNsaWdodCBtYXJnaW4gdG8gYWNjb3VudCBmb3Igd2FsbC1tb3VudGVkIHRhZ3MpLlxyXG4gICAqIElmIHRoZXJlIGFyZSBubyBhY3RpdmUgcm9vbXMgKGUuZy4sIGhhbGx3YXkpLCBmYWxscyBiYWNrIHRvIHJldHVybmluZyB0cnVlLlxyXG4gICAqL1xyXG4gIGlzVGFnSW5Sb29tcyhtYXR0ZXJ0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhLCByb29tczogYW55W10pOiBib29sZWFuIHtcclxuICAgIGlmICghcm9vbXMgfHwgcm9vbXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgY29uc3QgdGFnUG9zID0gbWF0dGVydGFnRGF0YS5nZXRQb3NpdGlvbigpO1xyXG4gICAgY29uc3QgbWFyZ2luID0gMS41O1xyXG5cclxuICAgIHJldHVybiByb29tcy5zb21lKChyb29tKSA9PiB7XHJcbiAgICAgIGlmICghcm9vbS5ib3VuZHMpIHJldHVybiBmYWxzZTtcclxuICAgICAgY29uc3QgeyBtaW4sIG1heCB9ID0gcm9vbS5ib3VuZHM7XHJcblxyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIHRhZ1Bvcy54ID49IG1pbi54IC0gbWFyZ2luICYmIHRhZ1Bvcy54IDw9IG1heC54ICsgbWFyZ2luICYmXHJcbiAgICAgICAgdGFnUG9zLnkgPj0gbWluLnkgLSBtYXJnaW4gJiYgdGFnUG9zLnkgPD0gbWF4LnkgKyBtYXJnaW4gJiZcclxuICAgICAgICB0YWdQb3MueiA+PSBtaW4ueiAtIG1hcmdpbiAmJiB0YWdQb3MueiA8PSBtYXgueiArIG1hcmdpblxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogUmV0dXJucyB0aGUgSUQgb2YgdGhlIG1vc3QgcmVjZW50bHkgYWRkZWQgdGFnLiAqL1xyXG4gIGdldExhc3RUYWcoKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICBpZiAodGhpcy5tYXR0ZXJ0YWdJRHMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcclxuICAgIHJldHVybiB0aGlzLm1hdHRlcnRhZ0lEc1t0aGlzLm1hdHRlcnRhZ0lEcy5sZW5ndGggLSAxXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZXMgdGhlIHZpc2liaWxpdHkgKG9wYWNpdHkpIG9mIGFsbCB0YWdzIGJhc2VkIG9uIHRoZSBjdXJyZW50IGNhbWVyYSBtb2RlLFxyXG4gICAqIGZsb29yIGFuZCByb29tIGNvbnRleHQuIE11c3QgYmUgY2FsbGVkIGFmdGVyIGVhY2ggc3dlZXAsIGZsb29yIG9yIG1vZGUgY2hhbmdlLlxyXG4gICAqXHJcbiAgICogUnVsZXM6XHJcbiAgICogIC0gRE9MTEhPVVNFIC8gRkxPT1JQTEFOIOKGkiBhbGwgdGFncyBoaWRkZW4gKG9wYWNpdHkgMCkuXHJcbiAgICogIC0gSU5TSURFIOKGkiBvbmx5IHRhZ3Mgd2hvc2Ugc3dlZXAgYmVsb25ncyB0byB0aGUgY3VycmVudCBmbG9vciBhcmUgc2hvd247XHJcbiAgICogICAgcHJveGltaXR5LWJhc2VkIG9wYWNpdHkgaXMgYXBwbGllZCB2aWEgY29tcHV0ZVRhZ09wYWNpdHkoKS5cclxuICAgKiAgICBUYWdzIG9uIG90aGVyIGZsb29ycyBhcmUgaGlkZGVuIChvcGFjaXR5IDApLlxyXG4gICAqICAtIFRSQU5TSVRJT05JTkcg4oaSIG5vIGNoYW5nZSAoc2tpcCB1cGRhdGUgdG8gYXZvaWQgZmxpY2tlcmluZykuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gc2RrICAgICAgICAgIE1hdHRlcnBvcnQgU0RLIGluc3RhbmNlLlxyXG4gICAqIEBwYXJhbSBwb3NlQ2FtZXJhICAgQ3VycmVudCBjYW1lcmEgcG9zZS5cclxuICAgKiBAcGFyYW0gc3dlZXBDb2xsZWN0aW9uICBGdWxsIGNvbGxlY3Rpb24gb2Ygc3dlZXBzLlxyXG4gICAqIEBwYXJhbSBjdXJyZW50Q2FtZXJhTW9kZSAgQ3VycmVudCBjYW1lcmEgbW9kZS5cclxuICAgKiBAcGFyYW0gbWF0dGVydGFnVG9Gb2xsb3cgIElEIG9mIHRoZSBjdXJzb3IgdGFnIChuZXZlciB0b3VjaGVkKS5cclxuICAgKi9cclxuICBhc3luYyB1cGRhdGVUYWdzVmlzaWJpbGl0eUZvckNvbnRleHQoXHJcbiAgICBzZGs6IGFueSxcclxuICAgIHN3ZWVwQ29sbGVjdGlvbjogYW55LFxyXG4gICAgY3VycmVudENhbWVyYU1vZGU6IENhbWVyYU1vZGUsXHJcbiAgICBtYXR0ZXJ0YWdUb0ZvbGxvdzogc3RyaW5nIHwgbnVsbCxcclxuICAgIGN1cnJlbnRGbG9vclNlcXVlbmNlOiBudW1iZXIgfCBudWxsID0gbnVsbCxcclxuICAgIGN1cnJlbnRSb29tczogYW55W10gPSBbXVxyXG4gICk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKCFzZGsgfHwgdGhpcy5kaWN0aW9ubmFyeVRhZ3Muc2l6ZSA9PT0gMCkgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IGlzSW50ZXJpb3JNb2RlID0gY3VycmVudENhbWVyYU1vZGUgPT09IENhbWVyYU1vZGUuSU5TSURFO1xyXG4gICAgY29uc3QgY3VycmVudEZsb29ySWQgPSBjdXJyZW50Rmxvb3JTZXF1ZW5jZSAhPT0gbnVsbCA/IGN1cnJlbnRGbG9vclNlcXVlbmNlLnRvU3RyaW5nKCkgOiBudWxsO1xyXG4gICAgY29uc3QgcHJvbWlzZXMgPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IFt0YWdJZCwgbWF0dGVydGFnRGF0YV0gb2YgdGhpcy5kaWN0aW9ubmFyeVRhZ3MpIHtcclxuICAgICAgaWYgKHRhZ0lkID09PSBtYXR0ZXJ0YWdUb0ZvbGxvdykgY29udGludWU7XHJcblxyXG4gICAgICBjb25zdCB0YWdGbG9vcklkID0gdGhpcy5nZXRGbG9vcklkRm9yVGFnKG1hdHRlcnRhZ0RhdGEsIHN3ZWVwQ29sbGVjdGlvbik7XHJcbiAgICAgIGNvbnN0IGlzT25DdXJyZW50Rmxvb3IgPSAhdGFnRmxvb3JJZCB8fCAhY3VycmVudEZsb29ySWQgfHwgdGFnRmxvb3JJZCA9PT0gY3VycmVudEZsb29ySWQ7XHJcblxyXG4gICAgICBsZXQgdGFyZ2V0T3BhY2l0eSA9IDA7XHJcbiAgICAgIGxldCBzaG91bGRCZUVuYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgIC8vIENhbGN1bGF0aW9uIG9mIG9wYWNpdHkgYW5kIGVuYWJsZSBzdGF0dXNcclxuICAgICAgaWYgKGlzT25DdXJyZW50Rmxvb3IpIHtcclxuICAgICAgICBpZiAoIWlzSW50ZXJpb3JNb2RlKSB7XHJcbiAgICAgICAgICB0YXJnZXRPcGFjaXR5ID0gMTtcclxuICAgICAgICAgIHNob3VsZEJlRW5hYmxlZCA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRhcmdldE9wYWNpdHkgPSAwLjk7XHJcbiAgICAgICAgICBzaG91bGRCZUVuYWJsZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvLyBBcHBseSBjaGFuZ2VzXHJcblxyXG4gICAgICAvLyBUb29sdGlwIGFuZCBjbGljayBtYW5hZ2VtZW50XHJcbiAgICAgIGNvbnN0IHRhZ01vZHVsZSA9IHRoaXMuZ2V0VGFnTW9kdWxlKHNkaywgdGFnSWQpO1xyXG4gICAgICBjb25zdCBsYXN0RW5hYmxlZCA9IHRoaXMudGFnc0N1cnJlbnRFbmFibGVkLmdldCh0YWdJZCk7XHJcbiAgICAgIGlmIChsYXN0RW5hYmxlZCAhPT0gc2hvdWxkQmVFbmFibGVkKSB7XHJcbiAgICAgICAgdGhpcy50YWdzQ3VycmVudEVuYWJsZWQuc2V0KHRhZ0lkLCBzaG91bGRCZUVuYWJsZWQpO1xyXG4gICAgICAgIHByb21pc2VzLnB1c2godGFnTW9kdWxlLmFsbG93QWN0aW9uKHRhZ0lkLCB7XHJcbiAgICAgICAgICBvcGVuaW5nOiBzaG91bGRCZUVuYWJsZWQsXHJcbiAgICAgICAgICBuYXZpZ2F0aW5nOiBzaG91bGRCZUVuYWJsZWQsXHJcbiAgICAgICAgICBkb2NraW5nOiBmYWxzZVxyXG4gICAgICAgIH0pLmNhdGNoKCgpID0+IHsgfSkpO1xyXG4gICAgICB9XHJcbiAgICAgIC8vIE9wYWNpdHkgbWFuYWdlbWVudFxyXG4gICAgICBjb25zdCBsYXN0T3BhY2l0eSA9IHRoaXMudGFnc0N1cnJlbnRPcGFjaXR5LmdldCh0YWdJZCkgPz8gLTE7XHJcbiAgICAgIGlmIChNYXRoLmFicyhsYXN0T3BhY2l0eSAtIHRhcmdldE9wYWNpdHkpID4gMC4wNSkge1xyXG4gICAgICAgIHRoaXMudGFnc0N1cnJlbnRPcGFjaXR5LnNldCh0YWdJZCwgdGFyZ2V0T3BhY2l0eSk7XHJcbiAgICAgICAgcHJvbWlzZXMucHVzaCh0YWdNb2R1bGUuZWRpdE9wYWNpdHkodGFnSWQsIHRhcmdldE9wYWNpdHkpLmNhdGNoKCgpID0+IHsgfSkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRHJvcHMgdGhlIG1lbW9pemVkIG9wYWNpdHkvZW5hYmxlZCBzdGF0ZSBzbyB0aGUgbmV4dCB2aXNpYmlsaXR5IHBhc3MgcmUtYXBwbGllcyBpdFxyXG4gICAqIHRvIGV2ZXJ5IHRhZy4gTmVlZGVkIGFmdGVyIGEgdmlldyBzd2l0Y2ggKGZ1cm5pc2hlZCA8LT4gZGVmdXJuaXNoZWQpOiB0aGUgU0RLXHJcbiAgICogcmUtcmVuZGVycyB0aGUgc2hhcmVkIGxheWVyJ3MgdGFncyBhbmQgdGhlIGNhY2hlZCB2YWx1ZXMgd291bGQgb3RoZXJ3aXNlIG1ha2VcclxuICAgKiB1cGRhdGVUYWdzVmlzaWJpbGl0eUZvckNvbnRleHQoKSBza2lwIHRoZW0sIGxlYXZpbmcgdGFncyBzdHVjayBpbnZpc2libGUuXHJcbiAgICovXHJcbiAgcmVzZXRWaXNpYmlsaXR5Q2FjaGUoKTogdm9pZCB7XHJcbiAgICB0aGlzLnRhZ3NDdXJyZW50T3BhY2l0eS5jbGVhcigpO1xyXG4gICAgdGhpcy50YWdzQ3VycmVudEVuYWJsZWQuY2xlYXIoKTtcclxuICB9XHJcblxyXG4gIC8qKiBSZW1vdmVzIGEgc3BlY2lmaWMgdGFnIGZyb20gdGhlIHZpZXdlciBhbmQgbG9jYWwgZGljdGlvbmFyaWVzLiAqL1xyXG4gIGFzeW5jIGRlbGV0ZU1hdHRlcnRhZ0Zyb21JZChzZGs6IGFueSwgbWF0dGVydGFnSUQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKHNkaykgYXdhaXQgdGhpcy5nZXRUYWdNb2R1bGUoc2RrLCBtYXR0ZXJ0YWdJRCkucmVtb3ZlKG1hdHRlcnRhZ0lEKTtcclxuICAgICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3MuZGVsZXRlKG1hdHRlcnRhZ0lEKTtcclxuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLm1hdHRlcnRhZ0lEcy5pbmRleE9mKG1hdHRlcnRhZ0lEKTtcclxuICAgICAgaWYgKGluZGV4ID4gLTEpIHRoaXMubWF0dGVydGFnSURzLnNwbGljZShpbmRleCwgMSk7XHJcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcclxuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0Nhbm5vdCBkZWxldGUgdGFnJywgbWF0dGVydGFnSUQsIGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFJlbW92ZXMgdGhlIGxhc3QgYWRkZWQgdGFnIGZyb20gdGhlIHZpZXdlci4gKi9cclxuICBhc3luYyBkZWxldGVMYXN0TWF0dGVydGFnKHNkazogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBjb25zdCBsYXN0U2lkID0gdGhpcy5nZXRMYXN0VGFnKCk7XHJcbiAgICBpZiAobGFzdFNpZCkgYXdhaXQgdGhpcy5kZWxldGVNYXR0ZXJ0YWdGcm9tSWQoc2RrLCBsYXN0U2lkKTtcclxuICB9XHJcblxyXG4gIC8qKiBDbGVhcnMgYWxsIHRhZ3MgZnJvbSB0aGUgdmlld2VyIGFuZCByZXNldHMgbG9jYWwgc3RhdGUuICovXHJcbiAgYXN5bmMgYWN0aW9uX2RlbGV0ZV9hbGxfbWF0dGVydGFncyhzZGs6IGFueSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKHNkaykge1xyXG4gICAgICBjb25zdCBzaWRzVG9SZW1vdmUgPSBbLi4udGhpcy5tYXR0ZXJ0YWdJRHNdO1xyXG4gICAgICBmb3IgKGNvbnN0IHNpZCBvZiBzaWRzVG9SZW1vdmUpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgYXdhaXQgdGhpcy5nZXRUYWdNb2R1bGUoc2RrLCBzaWQpLnJlbW92ZShzaWQpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmNsZWFyKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDcmVhdGVzIGFuZCBjb25maWd1cmVzIGEgTWF0dGVydGFnIGZyb20gYSBQT0ksIGhhbmRsaW5nIGNvb3JkaW5hdGVzLCBub3JtYWxzLCBhbmQgc3dlZXAgSUQuXHJcbiAgICogU2tpcHMgY3JlYXRpb24gaWYgYSB0YWcgZm9yIHRoZSBvYmplY3QgYWxyZWFkeSBleGlzdHMuXHJcbiAgICovXHJcbiAgYXN5bmMgY3JlYXRlTWF0dGVydGFnRnJvbVBPSShcclxuICAgIHNkazogYW55LFxyXG4gICAgdGFnVHlwZTogUG9pVHlwZSxcclxuICAgIG9iamVjdDogRGJPYmplY3RUeXBlLFxyXG4gICAgcG9pOiBQT0ksXHJcbiAgICBnZXRUYWdGcm9tRWxlbWVudElkOiAoaWQ6IHN0cmluZykgPT4geyB0YWc6IHN0cmluZzsgc3dlZXA6IHN0cmluZyB9LFxyXG4gICAgc2V0VGFnSWNvbkFuZE9wYWNpdHk6IChzaWQ6IHN0cmluZywgbXQ6IE1hdHRlcnRhZ0RhdGEpID0+IFByb21pc2U8dm9pZD4sXHJcbiAgICBpbmplY3RIdG1sSW5UYWc6ICh0eXBlOiBQb2lUeXBlLCBvYmo6IERiT2JqZWN0VHlwZSwgc2lkOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD5cclxuICApOiBQcm9taXNlPGFueT4ge1xyXG4gICAgY29uc3QgeyB0YWcgfSA9IGdldFRhZ0Zyb21FbGVtZW50SWQob2JqZWN0LmlkKTtcclxuICAgIGlmICh0YWcpIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBtYXR0ZXJ0YWdEYXRhOiBNYXR0ZXJ0YWdEYXRhID0gbmV3IE1hdHRlcnRhZ0RhdGEodGFnVHlwZSk7XHJcbiAgICBtYXR0ZXJ0YWdEYXRhLnNldE9iamVjdChvYmplY3QsIHRhZ1R5cGUpO1xyXG5cclxuICAgIGlmIChwb2kuY29vcmRpbmF0ZSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIG1hdHRlcnRhZ0RhdGEuc2V0UG9zaXRpb24oSlNPTi5wYXJzZShwb2kuY29vcmRpbmF0ZSkpO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0Vycm9yIHBhcnNpbmcgUE9JIGNvb3JkaW5hdGVzJywgcG9pLmNvb3JkaW5hdGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHBvaS5tZXRhZGF0YSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IHRhZ01ldGFkYXRhID0gSlNPTi5wYXJzZShwb2kubWV0YWRhdGEpO1xyXG4gICAgICAgIG1hdHRlcnRhZ0RhdGEuc2V0Tm9ybWFsKHRhZ01ldGFkYXRhLm5vcm1hbCB8fCB7IHg6IDAsIHk6IC0wLjE1LCB6OiAwIH0pO1xyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgbWF0dGVydGFnRGF0YS5zZXROb3JtYWwoeyB4OiAwLCB5OiAtMC4xNSwgejogMCB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmIChwb2kubWF0dGVycG9ydFN3ZWVwSUQpIHtcclxuICAgICAgbWF0dGVydGFnRGF0YS5zZXRTd2VlcElEKHBvaS5tYXR0ZXJwb3J0U3dlZXBJRCk7XHJcbiAgICB9XHJcbiAgICBtYXR0ZXJ0YWdEYXRhLnNldFBvaShwb2kpO1xyXG5cclxuICAgIGNvbnN0IGNyZWF0ZWRUYWdJRCA9IGF3YWl0IHRoaXMuYWRkTWF0dGVydGFnVG9WaWV3ZXIoc2RrLCBtYXR0ZXJ0YWdEYXRhKTtcclxuXHJcbiAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tJyk7XHJcbiAgICBjb25zb2xlLmxvZygnZWxlbWVudCBpZCAnICsgbWF0dGVydGFnRGF0YS5lbGVtZW50SUQpO1xyXG4gICAgY29uc29sZS5sb2coJ3Bvc2l0aW9uOiAnLCBtYXR0ZXJ0YWdEYXRhLmdldFBvc2l0aW9uKCkpO1xyXG4gICAgY29uc29sZS5sb2coJ3JvdGF0aW9uOiAnLCBtYXR0ZXJ0YWdEYXRhLmdldFJvdGF0aW9uKCkpO1xyXG4gICAgY29uc29sZS5sb2coJ3N3ZWVwIGlkOiAnLCBtYXR0ZXJ0YWdEYXRhLmdldFN3ZWVwSUQoKSk7XHJcbiAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLS0tJyk7XHJcblxyXG5cclxuICAgIGlmIChjcmVhdGVkVGFnSUQgJiYgc2RrKSB7XHJcbiAgICAgIGF3YWl0IHdhaXQoMTAwKTtcclxuICAgICAgYXdhaXQgc2V0VGFnSWNvbkFuZE9wYWNpdHkoY3JlYXRlZFRhZ0lELCBtYXR0ZXJ0YWdEYXRhKTtcclxuICAgICAgaW5qZWN0SHRtbEluVGFnKHRhZ1R5cGUsIG9iamVjdCwgY3JlYXRlZFRhZ0lEKS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgIGlmIChpc0Rldk1vZGUoKSkgY29uc29sZS53YXJuKCdIVE1MIGluamVjdGlvbiBmYWlsZWQgZm9yJywgY3JlYXRlZFRhZ0lELCBlcnIpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY3JlYXRlZFRhZ0lEO1xyXG4gIH1cclxuXHJcbiAgLyoqIFVwZGF0ZXMgdGhlIGljb24sIG9wYWNpdHksIGFuZCBIVE1MIGNvbnRlbnQgb2YgYW4gZXhpc3RpbmcgdGFnLiAqL1xyXG4gIGFzeW5jIHVwZGF0ZU1hdHRlclRhZ0NvbnRlbnRGb3JUYWdJRChcclxuICAgIHNkazogYW55LFxyXG4gICAgbWF0dGVydGFnSUQ6IHN0cmluZyxcclxuICAgIG9iamVjdDogRGJPYmplY3RUeXBlLFxyXG4gICAgcG9pVHlwZTogUG9pVHlwZSxcclxuICAgIHNldFRhZ0ljb25BbmRPcGFjaXR5OiAoc2lkOiBzdHJpbmcsIG10OiBNYXR0ZXJ0YWdEYXRhKSA9PiBQcm9taXNlPHZvaWQ+LFxyXG4gICAgaW5qZWN0SHRtbEluVGFnOiAodHlwZTogUG9pVHlwZSwgb2JqOiBEYk9iamVjdFR5cGUsIHNpZDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+XHJcbiAgKTogUHJvbWlzZTxhbnk+IHtcclxuICAgIGNvbnN0IG1hdHRlcnRhZ0RhdGEgPSB0aGlzLmRpY3Rpb25uYXJ5VGFncy5nZXQobWF0dGVydGFnSUQpO1xyXG4gICAgaWYgKCFtYXR0ZXJ0YWdEYXRhKSByZXR1cm47XHJcblxyXG4gICAgaWYgKG9iamVjdCkge1xyXG4gICAgICBtYXR0ZXJ0YWdEYXRhLnNldE9iamVjdChvYmplY3QsIHBvaVR5cGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGF3YWl0IHNldFRhZ0ljb25BbmRPcGFjaXR5KG1hdHRlcnRhZ0lELCBtYXR0ZXJ0YWdEYXRhKTtcclxuICAgIGF3YWl0IGluamVjdEh0bWxJblRhZyhwb2lUeXBlLCBvYmplY3QsIG1hdHRlcnRhZ0lEKTtcclxuICB9XHJcblxyXG4gIC8qKiBSZWdpc3RlcnMgYSBjdXN0b20gdGV4dHVyZSBhbmQgYXBwbGllcyBpdCB0byBhIHRhZywgb3B0aW9uYWxseSBhZGp1c3Rpbmcgb3BhY2l0eS4gKi9cclxuICBhc3luYyBhZGROZXdJY29uQW5kU2V0Rm9yVGFnKFxyXG4gICAgc2RrOiBhbnksXHJcbiAgICBtYXR0ZXJ0YWdJRDogc3RyaW5nLFxyXG4gICAgaWNvblBhdGg6IHN0cmluZyxcclxuICAgIGFwcGx5T3BhY2l0eTogYm9vbGVhbixcclxuICAgIG9wYWNpdHk6IG51bWJlclxyXG4gICkge1xyXG4gICAgaWYgKCFzZGspIHJldHVybjtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGljb25OYW1lID0gYGN1c3RvbS1pY29uLSR7bWF0dGVydGFnSUR9YDtcclxuICAgICAgY29uc3QgdGFnTW9kdWxlID0gdGhpcy5nZXRUYWdNb2R1bGUoc2RrLCBtYXR0ZXJ0YWdJRCk7XHJcbiAgICAgIGF3YWl0IHNkay5Bc3NldC5yZWdpc3RlclRleHR1cmUoaWNvbk5hbWUsIGljb25QYXRoKTtcclxuICAgICAgYXdhaXQgdGFnTW9kdWxlLmVkaXRJY29uKG1hdHRlcnRhZ0lELCBpY29uTmFtZSk7XHJcblxyXG4gICAgICBpZiAoYXBwbHlPcGFjaXR5KSB7XHJcbiAgICAgICAgYXdhaXQgdGFnTW9kdWxlLmVkaXRPcGFjaXR5KG1hdHRlcnRhZ0lELCBvcGFjaXR5KTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgaWYgKGlzRGV2TW9kZSgpKSBjb25zb2xlLndhcm4oJ0Vycm9yIHNldHRpbmcgY3VzdG9tIGljb24gb3Igb3BhY2l0eScsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBGaW5kcyB0aGUgdGFnIElEIGFuZCBzd2VlcCBJRCBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyBlbGVtZW50IElELiAqL1xyXG4gIGdldFRhZ0Zyb21FbGVtZW50SWQoZWxlbWVudElEOiBzdHJpbmcsIHN3ZWVwczogc3RyaW5nW10gfCBudWxsKTogeyB0YWc6IHN0cmluZyB8IG51bGw7IHN3ZWVwOiBzdHJpbmcgfCBudWxsIH0ge1xyXG4gICAgbGV0IHRhZ0lEID0gbnVsbDtcclxuICAgIGxldCBzd2VlcElEID0gbnVsbDtcclxuICAgIGZvciAobGV0IFttYXR0ZXJ0YWdJRCwgbWF0dGVydGFnRGF0YV0gb2YgdGhpcy5kaWN0aW9ubmFyeVRhZ3MpIHtcclxuICAgICAgaWYgKG1hdHRlcnRhZ0RhdGEuZWxlbWVudElEID09PSBlbGVtZW50SUQpIHtcclxuICAgICAgICB0YWdJRCA9IG1hdHRlcnRhZ0lEO1xyXG4gICAgICAgIGNvbnN0IHN3ZWVwID0gbWF0dGVydGFnRGF0YS5nZXRTd2VlcElEKCk7XHJcbiAgICAgICAgaWYgKHN3ZWVwICYmIHN3ZWVwcykge1xyXG4gICAgICAgICAgLy8gc3dlZXAgaXMgYSB1dWlkOyBzd2VlcHMgYXJyYXkgY29udGFpbnMgc2lkcyDigJMgY2hlY2sgYm90aCBmb3JtYXRzXHJcbiAgICAgICAgICBjb25zdCByZXNvbHZlZFNpZCA9IHRoaXMubmF2aWdhdGlvblNlcnZpY2UucmVzb2x2ZVN3ZWVwU2lkKHN3ZWVwKTtcclxuICAgICAgICAgIGlmIChzd2VlcHMuaW5jbHVkZXMoc3dlZXApIHx8IHN3ZWVwcy5pbmNsdWRlcyhyZXNvbHZlZFNpZCkpIHtcclxuICAgICAgICAgICAgc3dlZXBJRCA9IHN3ZWVwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHsgdGFnOiB0YWdJRCwgc3dlZXA6IHN3ZWVwSUQgfTtcclxuICB9XHJcblxyXG4gIC8qKiBSZXRyaWV2ZXMgdGhlIGZsb29yIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIGEgdGFnIGJhc2VkIG9uIGl0cyBzd2VlcCBkYXRhLlxyXG4gICAqICBIYW5kbGVzIGJvdGggdGhlIG9iamVjdCBmb3JtICh7IGZsb29ySW5mbzogeyBpZCwgc2VxdWVuY2UgfSwgZmxvb3I6IHsgaWQgfSB9KVxyXG4gICAqICBhbmQgdGhlIHByaW1pdGl2ZSBmb3JtIChmbG9vcjogbnVtYmVyKSB1c2VkIGJ5IE1hdHRlcnBvcnQgU0RLIHYzLlxyXG4gICAqL1xyXG4gIGdldEZsb29ySWRGb3JUYWcobWF0dGVydGFnRGF0YTogTWF0dGVydGFnRGF0YSwgc3dlZXBDb2xsZWN0aW9uOiBhbnkpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGNvbnN0IHN3ZWVwSWQgPSBtYXR0ZXJ0YWdEYXRhLmdldFN3ZWVwSUQoKTtcclxuICAgIGlmICghc3dlZXBJZCB8fCAhc3dlZXBDb2xsZWN0aW9uKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBjb25zdCBzd2VlcERhdGEgPSBzd2VlcENvbGxlY3Rpb25bc3dlZXBJZF07XHJcbiAgICBpZiAoIXN3ZWVwRGF0YSkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgLy8gU0RLIHYzOiBzd2VlcC5mbG9vciBpcyBhIHByaW1pdGl2ZSBudW1iZXIgKHRoZSBzZXF1ZW5jZSBpbmRleClcclxuICAgIGlmICh0eXBlb2Ygc3dlZXBEYXRhLmZsb29yID09PSAnbnVtYmVyJykge1xyXG4gICAgICByZXR1cm4gc3dlZXBEYXRhLmZsb29yLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gT2xkZXIgLyBleHRlbmRlZCBmb3JtYXRzXHJcbiAgICByZXR1cm4gc3dlZXBEYXRhPy5mbG9vckluZm8/LmlkXHJcbiAgICAgID8/IHN3ZWVwRGF0YT8uZmxvb3JJbmZvPy5zZXF1ZW5jZT8udG9TdHJpbmcoKVxyXG4gICAgICA/PyBzd2VlcERhdGE/LmZsb29ySWRcclxuICAgICAgPz8gc3dlZXBEYXRhPy5mbG9vcj8uaWRcclxuICAgICAgPz8gc3dlZXBEYXRhPy5mbG9vcj8uc2VxdWVuY2U/LnRvU3RyaW5nKClcclxuICAgICAgPz8gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEluamVjdHMgY3VzdG9tIEhUTUwgb3IgZmFsbGJhY2sgYmlsbGJvYXJkIG1lZGlhIGludG8gYSBNYXR0ZXJ0YWcgc2FuZGJveC5cclxuICAgKiBBdHRhY2hlcyBldmVudCBsaXN0ZW5lcnMgZm9yIGludGVyYWN0aXZlIGVsZW1lbnRzIHdpdGhpbiB0aGUgdGFnLlxyXG4gICAqL1xyXG4gIGFzeW5jIGluamVjdEh0bWxJblRhZyhzZGs6IGFueSwgdGFnVHlwZTogUG9pVHlwZSwgb2JqZWN0OiBEYk9iamVjdFR5cGUsIHRhZ0lEOiBzdHJpbmcpIHtcclxuICAgIGlmICghdGhpcy50YWdTZXJ2aWNlKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tNYXR0ZXJwb3J0VGFnU2VydmljZV0gdGFnU2VydmljZSBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgIGxldCBodG1sID0gYXdhaXQgdGhpcy50YWdTZXJ2aWNlLmdldEh0bWxUb0luamVjdCh0YWdUeXBlLCBvYmplY3QpO1xyXG5cclxuICAgICAgaWYgKGh0bWwgJiYgaHRtbC50cmltKCkubGVuZ3RoID4gMCAmJiBzZGspIHtcclxuICAgICAgICBjb25zdCBzY3JpcHRUYWcgPSB0aGlzLnRhZ1NlcnZpY2UuZ2V0U2NyaXB0Rm9yVGFnKG9iamVjdCwgdGFnVHlwZSk7XHJcbiAgICAgICAgaHRtbCArPSBgJHtzY3JpcHRUYWd9YDtcclxuXHJcbiAgICAgICAgY29uc3QgdGFnTW9kdWxlID0gdGhpcy5nZXRUYWdNb2R1bGUoc2RrLCB0YWdJRCk7XHJcbiAgICAgICAgY29uc3QgW3NhbmRib3hJZCwgbWVzc2VuZ2VyXSA9IGF3YWl0IHNkay5UYWcucmVnaXN0ZXJTYW5kYm94KGh0bWwpO1xyXG5cclxuICAgICAgICBjb25zdCBhdHRhY2htZW50SUQgPSB0aGlzLnRhZ3NBdHRhY2htZW50c1t0YWdJRF07XHJcbiAgICAgICAgaWYgKGF0dGFjaG1lbnRJRCkge1xyXG4gICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGFnTW9kdWxlLmRldGFjaCh0YWdJRCwgYXR0YWNobWVudElEKTtcclxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy50YWdzQXR0YWNobWVudHNbdGFnSURdID0gc2FuZGJveElkO1xyXG4gICAgICAgIGF3YWl0IHRhZ01vZHVsZS5hdHRhY2godGFnSUQsIHNhbmRib3hJZCk7XHJcblxyXG4gICAgICAgIC8vIEF0dGFjaCB0aGUgXCJWaWV3IGluZm9ybWF0aW9uc1wiIGhhbmRsZXIgaW4gdG9vbHRpcFxyXG4gICAgICAgIG1lc3Nlbmdlci5vbihUYWdBY3Rpb24uREVUQUlMX0NMSUNLLCB0aGlzLnRhZ1NlcnZpY2Uub25BY3Rpb25EZXRhaWxDbGljay5iaW5kKHRoaXMudGFnU2VydmljZSkpO1xyXG4gICAgICAgIG1lc3Nlbmdlci5vbihUYWdBY3Rpb24uVElDS0VUX0NMSUNLLCB0aGlzLnRhZ1NlcnZpY2Uub25BY3Rpb25EZXRhaWxDbGljay5iaW5kKHRoaXMudGFnU2VydmljZSkpO1xyXG4gICAgICAgIG1lc3Nlbmdlci5vbihUYWdBY3Rpb24uQVVESU9fQ0xJQ0ssIChhdWRpb0NvbW1lbnRJRDogc3RyaW5nKSA9PiB0aGlzLnRhZ1NlcnZpY2Uub25BY3Rpb25BdWRpb0NsaWNrKGF1ZGlvQ29tbWVudElEKSk7XHJcbiAgICAgICAgbWVzc2VuZ2VyLm9uKFRhZ0FjdGlvbi5WSURFT19DTElDSywgKHZpZGVvVXJsOiBzdHJpbmcpID0+IHRoaXMudGFnU2VydmljZS5vbkFjdGlvblZpZGVvQ2xpY2sodmlkZW9VcmwpKTtcclxuICAgICAgICBtZXNzZW5nZXIub24oVGFnQWN0aW9uLklNQUdFX0NMSUNLLCAoaW1hZ2VDb21tZW50SUQ6IHN0cmluZykgPT4gdGhpcy50YWdTZXJ2aWNlLm9uQWN0aW9uSW1hZ2VDbGljayhpbWFnZUNvbW1lbnRJRCkpO1xyXG4gICAgICAgIG1lc3Nlbmdlci5vbihUYWdBY3Rpb24uRE9DX0NMSUNLLCAoZG9jVXJsOiBzdHJpbmcpID0+IHRoaXMudGFnU2VydmljZS5vbkFjdGlvbkRvY0NsaWNrKGRvY1VybCkpO1xyXG4gICAgICAgIG1lc3Nlbmdlci5vbihUYWdBY3Rpb24uWU9VVFVCRV9DTElDSywgKHlvdXR1YmVVcmw6IHN0cmluZykgPT4gdGhpcy50YWdTZXJ2aWNlLm9uQWN0aW9uWW91dHViZUNsaWNrKHlvdXR1YmVVcmwpKTtcclxuICAgICAgfSBlbHNlIGlmIChzZGspIHtcclxuICAgICAgICBjb25zdCB7IGNvbW1lbnQsIHRhZ0Rlc2NyaXB0aW9uIH0gPSB0aGlzLnRhZ1NlcnZpY2UuZ2V0QmlsbGJvYXJkTWVkaWFUb0VtYmVkKG9iamVjdCk7XHJcblxyXG4gICAgICAgIGlmIChjb21tZW50KSB7XHJcbiAgICAgICAgICBjb25zdCB0YWdNb2R1bGUgPSB0aGlzLmdldFRhZ01vZHVsZShzZGssIHRhZ0lEKTtcclxuICAgICAgICAgIC8vIDEpIFJlZ2lzdGVyIHRoZSBtZWRpYSBhdHRhY2htZW50IGJ5IHBhc3NpbmcgdGhlIFVSTCBzdHJpbmcocykuXHJcbiAgICAgICAgICAvLyAgICByZWdpc3RlckF0dGFjaG1lbnQgcmV0dXJucyBhbiBhcnJheSBvZiBhdHRhY2htZW50IElEcy5cclxuICAgICAgICAgIGNvbnN0IFthdHRhY2htZW50SURdID0gYXdhaXQgc2RrLlRhZy5yZWdpc3RlckF0dGFjaG1lbnQoY29tbWVudC5leHRlcm5hbExpbmspO1xyXG5cclxuICAgICAgICAgIC8vIDIpIEF0dGFjaCB0aGUgcmVnaXN0ZXJlZCBtZWRpYSB0byB0aGUgdGFnLlxyXG4gICAgICAgICAgYXdhaXQgdGFnTW9kdWxlLmF0dGFjaCh0YWdJRCwgYXR0YWNobWVudElEKTtcclxuXHJcbiAgICAgICAgICAvLyAzKSBEZXRlcm1pbmUgbWVkaWEgdHlwZSBmb3IgdGhlIGJpbGxib2FyZCAoUEhPVE8gb3IgVklERU8pLlxyXG4gICAgICAgICAgLy8gICAgVXNlIGEgc2ltcGxlIGhldXJpc3RpYzogWW91VHViZS9WaW1lbyAtPiBWSURFTywgb3RoZXJ3aXNlIFBIT1RPLlxyXG4gICAgICAgICAgLy8gICAgVGhlIFNESyBleHBvc2VzIE1lZGlhVHlwZSBvbiB0aGUgVGFnIG5hbWVzcGFjZS5cclxuICAgICAgICAgIGNvbnN0IGlzVmlkZW8gPSAveW91dHViZVxcLmNvbXx5b3V0dVxcLmJlfHZpbWVvXFwuY29tL2kudGVzdChjb21tZW50LmV4dGVybmFsTGluayk7XHJcbiAgICAgICAgICBjb25zdCBtZWRpYVR5cGUgPSBpc1ZpZGVvID8gc2RrLk1hdHRlcnRhZy5NZWRpYVR5cGUuVklERU8gOiBzZGsuTWF0dGVydGFnLk1lZGlhVHlwZS5QSE9UTztcclxuXHJcbiAgICAgICAgICAvLyA0KSBVcGRhdGUgdGhlIGJpbGxib2FyZCB0ZXh0IGFuZCBtZWRpYSB1c2luZyBlZGl0QmlsbGJvYXJkLlxyXG4gICAgICAgICAgLy8gICAgZWRpdEJpbGxib2FyZCBhY2NlcHRzIFBhcnRpYWw8VGFnLkVkaXRhYmxlUHJvcGVydGllcz4gc3VjaCBhcyBsYWJlbCwgZGVzY3JpcHRpb24sIG1lZGlhLlxyXG4gICAgICAgICAgYXdhaXQgdGFnTW9kdWxlLmVkaXRCaWxsYm9hcmQodGFnSUQsIHtcclxuICAgICAgICAgICAgbGFiZWw6IG9iamVjdC50aXRsZSB8fCAnTWVkaWEnLFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdGFnRGVzY3JpcHRpb24gfHwgJycsXHJcbiAgICAgICAgICAgIG1lZGlhOiB7XHJcbiAgICAgICAgICAgICAgdHlwZTogbWVkaWFUeXBlLFxyXG4gICAgICAgICAgICAgIHNyYzogY29tbWVudC5leHRlcm5hbExpbmssXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAvLyA1KSBLZWVwIGEgbG9jYWwgcmVmZXJlbmNlXHJcbiAgICAgICAgICB0aGlzLnRhZ3NBdHRhY2htZW50c1t0YWdJRF0gPSB7XHJcbiAgICAgICAgICAgIGF0dGFjaG1lbnRJRCxcclxuICAgICAgICAgICAgdGl0bGU6IG9iamVjdC50aXRsZSB8fCAnTWVkaWEnLFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdGFnRGVzY3JpcHRpb24gfHwgJycsXHJcbiAgICAgICAgICAgIG1lZGlhU3JjOiBjb21tZW50LmV4dGVybmFsTGluayxcclxuICAgICAgICAgICAgbWVkaWFUeXBlLFxyXG4gICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tNYXR0ZXJwb3J0VGFnU2VydmljZV0gRXJyb3IgaW4gaW5qZWN0SHRtbEluVGFnOicsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBDbGVhcnMgYWxsIGxvY2FsIHRhZyBkYXRhIGFuZCByZXNldHMgdGhlIGFkZGl0aW9uIHF1ZXVlLiAqL1xyXG4gIGNsZWFyKCkge1xyXG4gICAgdGhpcy5kaWN0aW9ubmFyeVRhZ3MuY2xlYXIoKTtcclxuICAgIHRoaXMudGFnc0N1cnJlbnRPcGFjaXR5LmNsZWFyKCk7XHJcbiAgICB0aGlzLnRhZ3NDdXJyZW50RW5hYmxlZC5jbGVhcigpO1xyXG4gICAgdGhpcy50YWdBZGRRdWV1ZSA9IFByb21pc2UucmVzb2x2ZSgpO1xyXG4gICAgdGhpcy5tYXR0ZXJ0YWdUb0ZvbGxvdyA9IG51bGw7XHJcbiAgICB0aGlzLm1hdHRlcnRhZ0lEcyA9IFtdO1xyXG4gICAgLy8gQSBuZXcgc3BhY2UgbWVhbnMgYSBuZXcgU0RLIHNlc3Npb24sIGhlbmNlIGEgbmV3IHNoYXJlZCBsYXllciB0byBjcmVhdGUuXHJcbiAgICB0aGlzLnNoYXJlZFRhZ0xheWVyID0gbnVsbDtcclxuICAgIHRoaXMuc2hhcmVkVGFnTGF5ZXJQcm9taXNlID0gbnVsbDtcclxuICB9XHJcbn1cclxuIl19