simpo-component-library 3.6.934 → 3.6.935

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.
@@ -20,6 +20,8 @@ export class StorageServiceService {
20
20
  this.totalCartItems = 0;
21
21
  this.getCartTotalAmount = 0;
22
22
  this.totalWishlistItems = 0;
23
+ /** Combined count across HOME_VISIT_CART + VIDEO_CALL_CART, for the header Bookings badge. */
24
+ this.totalBookingItems = 0;
23
25
  this.databaseName = "USER";
24
26
  // Bumped 1 -> 2 to add the two booking-cart stores below. IndexedDB only creates new object
25
27
  // stores inside onupgradeneeded, which only fires on a version bump - without this, the new
@@ -60,6 +62,31 @@ export class StorageServiceService {
60
62
  this.totalWishlistItems = 0;
61
63
  return this.totalWishlistItems;
62
64
  }
65
+ get getTotalBookingItems() {
66
+ if (this.totalBookingItems < 0)
67
+ this.totalBookingItems = 0;
68
+ return this.totalBookingItems;
69
+ }
70
+ calculateBookingCartTotals() {
71
+ if (!this.database)
72
+ return;
73
+ try {
74
+ const modes = ['HOME_VISIT', 'VIDEO_CALL'];
75
+ const counts = [0, 0];
76
+ modes.forEach((mode, i) => {
77
+ const storeName = this.bookingCartStoreName(mode);
78
+ const transaction = this.database.transaction(storeName, "readonly");
79
+ const request = transaction.objectStore(storeName).getAll();
80
+ request.onsuccess = (event) => {
81
+ counts[i] = (event.target.result || []).length;
82
+ this.totalBookingItems = counts.reduce((a, b) => a + b, 0);
83
+ };
84
+ });
85
+ }
86
+ catch (e) {
87
+ console.warn("Error calculating booking cart totals:", e);
88
+ }
89
+ }
63
90
  calculateCartTotals() {
64
91
  if (!this.database)
65
92
  return;
@@ -106,6 +133,7 @@ export class StorageServiceService {
106
133
  this.eventService.showLoadingScreen.emit(false);
107
134
  this.calculateCartTotals();
108
135
  this.calculateWishlistTotals();
136
+ this.calculateBookingCartTotals();
109
137
  resolve(); // ✅ VERY IMPORTANT
110
138
  };
111
139
  request.onupgradeneeded = (event) => {
@@ -322,18 +350,21 @@ export class StorageServiceService {
322
350
  await this.dbReady;
323
351
  const storeName = this.bookingCartStoreName(mode);
324
352
  const transaction = this.database.transaction(storeName, "readwrite");
353
+ transaction.oncomplete = () => this.calculateBookingCartTotals();
325
354
  return transaction.objectStore(storeName).put(product);
326
355
  }
327
356
  async removeProductFromBookingCart(mode, productId) {
328
357
  await this.dbReady;
329
358
  const storeName = this.bookingCartStoreName(mode);
330
359
  const transaction = this.database.transaction(storeName, "readwrite");
360
+ transaction.oncomplete = () => this.calculateBookingCartTotals();
331
361
  return transaction.objectStore(storeName).delete(productId);
332
362
  }
333
363
  async clearBookingCart(mode) {
334
364
  await this.dbReady;
335
365
  const storeName = this.bookingCartStoreName(mode);
336
366
  const transaction = this.database.transaction(storeName, "readwrite");
367
+ transaction.oncomplete = () => this.calculateBookingCartTotals();
337
368
  return transaction.objectStore(storeName).clear();
338
369
  }
339
370
  // USER SERVICE
@@ -390,4 +421,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
390
421
  type: Inject,
391
422
  args: [PLATFORM_ID]
392
423
  }] }] });
393
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9zZXJ2aWNlcy9zdG9yYWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUtuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWhDLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFbEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFcEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7Ozs7QUFPaEUsTUFBTSxPQUFPLHFCQUFxQjtJQUtoQyxZQUNtQixZQUEyQixFQUMzQixhQUE0QixFQUM1QixXQUF3QixFQUNWLE9BQW9CLEVBQzNDLE1BQWMsRUFDTyxVQUFrQjtRQUw5QixpQkFBWSxHQUFaLFlBQVksQ0FBZTtRQUMzQixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUNWLFlBQU8sR0FBUCxPQUFPLENBQWE7UUFDM0MsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNPLGVBQVUsR0FBVixVQUFVLENBQVE7UUFXekMsbUJBQWMsR0FBVyxDQUFDLENBQUM7UUFDbkMsdUJBQWtCLEdBQVcsQ0FBQyxDQUFDO1FBUXZCLHVCQUFrQixHQUFXLENBQUMsQ0FBQztRQW9DdkMsaUJBQVksR0FBVyxNQUFNLENBQUM7UUFDOUIsNEZBQTRGO1FBQzVGLDRGQUE0RjtRQUM1RixvRkFBb0Y7UUFDcEYsb0JBQWUsR0FBVyxDQUFDLENBQUM7UUFDNUIsdUJBQWtCLEdBQVcsV0FBVyxDQUFD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LFFBQVEsQ0FBQyxDQUFDO1FBQ2hGLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7K0dBMVpVLHFCQUFxQix1R0FTdEIsYUFBYSxtQ0FFYixXQUFXO21IQVhWLHFCQUFxQixjQUZwQixNQUFNOzs0RkFFUCxxQkFBcUI7a0JBSGpDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFVSSxNQUFNOzJCQUFDLGFBQWE7OzBCQUVwQixNQUFNOzJCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT3JkZXJlZEl0ZW1zIH0gZnJvbSAnLi4vZWNvbW1lcmNlL3N0eWxlcy9PcmRlcmVkSXRlbXMubW9kYWwnO1xyXG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vZWNvbW1lcmNlL3N0eWxlcy91c2VyLm1vZGFsJztcclxuaW1wb3J0IHsgRXZlbnRzU2VydmljZSB9IGZyb20gJy4vZXZlbnRzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb29raWVTZXJ2aWNlIH0gZnJvbSAnbmd4LWNvb2tpZS1zZXJ2aWNlJztcclxuaW1wb3J0IHsgZm9ya0pvaW4gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgUmVzdFNlcnZpY2UgfSBmcm9tICcuL3Jlc3Quc2VydmljZSc7XHJcbmltcG9ydCB7IENhcnQsIGNhcnRUeXBlIH0gZnJvbSAnLi8uLi9lY29tbWVyY2Uvc3R5bGVzL2NhcnQubW9kYWwnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBJbmplY3QsIFBMQVRGT1JNX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN0b3JhZ2VMaWtlIH0gZnJvbSAnLi4vc2VydmljZXMvc3RvcmFnZS1saWtlJztcclxuaW1wb3J0IHsgTE9DQUxfU1RPUkFHRSB9IGZyb20gJy4uL3NlcnZpY2VzL2xvY2FsLXN0b3JhZ2UudG9rZW4nO1xyXG5cclxuXHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTdG9yYWdlU2VydmljZVNlcnZpY2Uge1xyXG5cclxuXHJcbiAgcHJpdmF0ZSBkYlJlYWR5ITogUHJvbWlzZTx2b2lkPjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50U2VydmljZTogRXZlbnRzU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29va2llU2VydmljZTogQ29va2llU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzdFNlcnZpY2U6IFJlc3RTZXJ2aWNlLFxyXG4gICAgQEluamVjdChMT0NBTF9TVE9SQUdFKSBwcml2YXRlIHN0b3JhZ2U6IFN0b3JhZ2VMaWtlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogT2JqZWN0XHJcbiAgKSB7XHJcbiAgICB0aGlzLmNyZWF0ZURhdGFCYXNlKCk7XHJcbiAgICBjb25zdCB1c2VyRGV0YWlscyA9IHRoaXMuZ2V0VXNlcigpO1xyXG4gICAgaWYgKCEhdXNlckRldGFpbHMpIHtcclxuICAgICAgdGhpcy5yZXN0U2VydmljZS5nZXRVc2VySW5mbyh1c2VyRGV0YWlscy51c2VySWQpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2V0VXNlcihyZXNwb25zZS5kYXRhKTtcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG90YWxDYXJ0SXRlbXM6IG51bWJlciA9IDA7XHJcbiAgZ2V0Q2FydFRvdGFsQW1vdW50OiBudW1iZXIgPSAwO1xyXG4gIGdldCBnZXRUb3RhbENhcnRJdGVtcygpIHtcclxuICAgIGlmICh0aGlzLnRvdGFsQ2FydEl0ZW1zIDwgMClcclxuICAgICAgdGhpcy50b3RhbENhcnRJdGVtcyA9IDA7XHJcbiAgICAvLyB0aGlzLmV2ZW50U2VydmljZS5zaG93QmFnSWNvbi5lbWl0KHRoaXMudG90YWxDYXJ0SXRlbXMgPiAwKTtcclxuICAgIHJldHVybiB0aGlzLnRvdGFsQ2FydEl0ZW1zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0b3RhbFdpc2hsaXN0SXRlbXM6IG51bWJlciA9IDA7XHJcbiAgZ2V0IGdldFRvdGFsV2lzaGxpc3RJdGVtcygpIHtcclxuICAgIGlmICh0aGlzLnRvdGFsV2lzaGxpc3RJdGVtcyA8IDApXHJcbiAgICAgIHRoaXMudG90YWxXaXNobGlzdEl0ZW1zID0gMDtcclxuICAgIHJldHVybiB0aGlzLnRvdGFsV2lzaGxpc3RJdGVtcztcclxuICB9XHJcblxyXG4gIGNhbGN1bGF0ZUNhcnRUb3RhbHMoKSB7XHJcbiAgICBpZiAoIXRoaXMuZGF0YWJhc2UpIHJldHVybjtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGNhcnRUcmFuc2FjdGlvbiA9IHRoaXMuZGF0YWJhc2UudHJhbnNhY3Rpb24odGhpcy5jYXJ0Q29sbGVjdGlvbk5hbWUsIFwicmVhZG9ubHlcIik7XHJcbiAgICAgIGNvbnN0IGNhcnRSZXF1ZXN0ID0gY2FydFRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHRoaXMuY2FydENvbGxlY3Rpb25OYW1lKS5nZXRBbGwoKTtcclxuICAgICAgY2FydFJlcXVlc3Qub25zdWNjZXNzID0gKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBpdGVtcyA9IGV2ZW50LnRhcmdldC5yZXN1bHQgfHwgW107XHJcbiAgICAgICAgdGhpcy50b3RhbENhcnRJdGVtcyA9IGl0ZW1zLmxlbmd0aDtcclxuICAgICAgICB0aGlzLmdldENhcnRUb3RhbEFtb3VudCA9IGl0ZW1zLnJlZHVjZSgoYWNjOiBudW1iZXIsIGl0ZW06IGFueSkgPT4gYWNjICsgKChpdGVtLnNlbGxpbmdQcmljZSB8fCAwKSAqIChpdGVtLnF1YW50aXR5IHx8IDEpKSwgMCk7XHJcbiAgICAgIH07XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcIkVycm9yIGNhbGN1bGF0aW5nIGNhcnQgdG90YWxzOlwiLCBlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhbGN1bGF0ZVdpc2hsaXN0VG90YWxzKCkge1xyXG4gICAgaWYgKCF0aGlzLmRhdGFiYXNlKSByZXR1cm47XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCB3aXNobGlzdFRyYW5zYWN0aW9uID0gdGhpcy5kYXRhYmFzZS50cmFuc2FjdGlvbih0aGlzLmZhdm91cml0ZUNvbGxlY3Rpb25OYW1lLCBcInJlYWRvbmx5XCIpO1xyXG4gICAgICBjb25zdCB3aXNobGlzdFJlcXVlc3QgPSB3aXNobGlzdFRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHRoaXMuZmF2b3VyaXRlQ29sbGVjdGlvbk5hbWUpLmdldEFsbCgpO1xyXG4gICAgICB3aXNobGlzdFJlcXVlc3Qub25zdWNjZXNzID0gKGV2ZW50OiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBpdGVtcyA9IGV2ZW50LnRhcmdldC5yZXN1bHQgfHwgW107XHJcbiAgICAgICAgdGhpcy50b3RhbFdpc2hsaXN0SXRlbXMgPSBpdGVtcy5sZW5ndGg7XHJcbiAgICAgIH07XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcIkVycm9yIGNhbGN1bGF0aW5nIHdpc2hsaXN0IHRvdGFsczpcIiwgZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBkYXRhYmFzZU5hbWU6IHN0cmluZyA9IFwiVVNFUlwiO1xyXG4gIC8vIEJ1bXBlZCAxIC0+IDIgdG8gYWRkIHRoZSB0d28gYm9va2luZy1jYXJ0IHN0b3JlcyBiZWxvdy4gSW5kZXhlZERCIG9ubHkgY3JlYXRlcyBuZXcgb2JqZWN0XHJcbiAgLy8gc3RvcmVzIGluc2lkZSBvbnVwZ3JhZGVuZWVkZWQsIHdoaWNoIG9ubHkgZmlyZXMgb24gYSB2ZXJzaW9uIGJ1bXAgLSB3aXRob3V0IHRoaXMsIHRoZSBuZXdcclxuICAvLyBzdG9yZXMgd291bGQgc2lsZW50bHkgbmV2ZXIgZ2V0IGNyZWF0ZWQgZm9yIGFueW9uZSB3aG8gYWxyZWFkeSBoYXMgYSB2MSBkYXRhYmFzZS5cclxuICBkYXRhYmFzZVZlcnNpb246IG51bWJlciA9IDI7XHJcbiAgY2FydENvbGxlY3Rpb25OYW1lOiBzdHJpbmcgPSBcIlVTRVJfQ0FSVFwiO1xyXG4gIGZhdm91cml0ZUNvbGxlY3Rpb25OYW1lOiBzdHJpbmcgPSBcIlVTRVJfRkFWT1VSSVRFXCI7XHJcbiAgdHJpYWxDYXJ0Q29sbGVjdGlvbk5hbWU6IHN0cmluZyA9ICdUUklBTF9DQVJUJ1xyXG4gIHVzZXJDb2xsZWN0aW9uTmFtZTogc3RyaW5nID0gXCJVU0VSXCI7XHJcbiAgLyoqXHJcbiAgICogT25lIGJ1Y2tldCBwZXIgYm9va2luZyBtb2RlIChIb21lIFZpc2l0IC8gVmlkZW8gQ2FsbCksIGxvY2FsLW9ubHksIG5vIHNlcnZlciBzeW5jIC0gdW5saWtlXHJcbiAgICogVFJJQUxfQ0FSVCwgdGhlIG5ldyBncm91cC9jYXJ0IGJvb2tpbmcgQVBJIHRha2VzIHByb2R1Y3QgbGluZXMgZGlyZWN0bHkgaW4gdGhlIGhvbGQgcmVxdWVzdCxcclxuICAgKiBzbyB0aGVyZSdzIG5vIHNlcnZlci1zaWRlIGNhcnQgdG8ga2VlcCB0aGVzZSBpbiBzeW5jIHdpdGguIEtlcHQgc2VwYXJhdGUgZnJvbSBlYWNoIG90aGVyIHNvXHJcbiAgICogYSBjdXN0b21lciBjYW4gaG9sZCBhIHBlbmRpbmcgY2FydCBmb3IgZWFjaCBtb2RlIGF0IG9uY2UuXHJcbiAgICovXHJcbiAgaG9tZVZpc2l0Q2FydENvbGxlY3Rpb25OYW1lOiBzdHJpbmcgPSAnSE9NRV9WSVNJVF9DQVJUJztcclxuICB2aWRlb0NhbGxDYXJ0Q29sbGVjdGlvbk5hbWU6IHN0cmluZyA9ICdWSURFT19DQUxMX0NBUlQnO1xyXG4gIGRhdGFiYXNlITogSURCRGF0YWJhc2U7XHJcblxyXG4gIGNhcnRDb2xsZWN0aW9uUmVmOiBJREJPYmplY3RTdG9yZSB8IG51bGwgPSBudWxsO1xyXG4gIGZhdm91cml0ZUNvbGxlY3Rpb25SZWY6IElEQk9iamVjdFN0b3JlIHwgbnVsbCA9IG51bGw7XHJcbiAgdXNlckNvbGxlY3Rpb25SZWY6IElEQk9iamVjdFN0b3JlIHwgbnVsbCA9IG51bGw7XHJcbiAgdHJpYWxDYXJ0Q29sbGVjdGlvblJlZjogSURCT2JqZWN0U3RvcmUgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY3JlYXRlRGF0YUJhc2UoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmRiUmVhZHkgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcblxyXG4gICAgICBpZiAoaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5wbGF0Zm9ybUlkKSAmJiB3aW5kb3cuaW5kZXhlZERCKSB7XHJcbiAgICAgICAgY29uc3QgcmVxdWVzdDogSURCT3BlbkRCUmVxdWVzdCA9IHdpbmRvdy5pbmRleGVkREIub3Blbih0aGlzLmRhdGFiYXNlTmFtZSwgdGhpcy5kYXRhYmFzZVZlcnNpb24pO1xyXG5cclxuICAgICAgICB0aGlzLmV2ZW50U2VydmljZS5zaG93TG9hZGluZ1NjcmVlbi5lbWl0KHRydWUpO1xyXG5cclxuICAgICAgICByZXF1ZXN0Lm9uZXJyb3IgPSAoKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdbSW5kZXhlZERCXSBGYWlsZWQgdG8gb3BlbiBkYXRhYmFzZScpO1xyXG4gICAgICAgICAgdGhpcy5ldmVudFNlcnZpY2Uuc2hvd0xvYWRpbmdTY3JlZW4uZW1pdChmYWxzZSk7XHJcbiAgICAgICAgICByZWplY3QoKTtcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXF1ZXN0Lm9uc3VjY2VzcyA9IGFzeW5jIChldmVudCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXRhYmFzZSA9IChldmVudC50YXJnZXQgYXMgSURCT3BlbkRCUmVxdWVzdCkucmVzdWx0O1xyXG4gICAgICAgICAgdGhpcy5ldmVudFNlcnZpY2Uuc2hvd0xvYWRpbmdTY3JlZW4uZW1pdChmYWxzZSk7XHJcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZUNhcnRUb3RhbHMoKTtcclxuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlV2lzaGxpc3RUb3RhbHMoKTtcclxuICAgICAgICAgIHJlc29sdmUoKTsgLy8g4pyFIFZFUlkgSU1QT1JUQU5UXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSAoZXZlbnQpID0+IHtcclxuICAgICAgICAgIHRoaXMuZGF0YWJhc2UgPSAoZXZlbnQudGFyZ2V0IGFzIElEQk9wZW5EQlJlcXVlc3QpLnJlc3VsdDtcclxuXHJcbiAgICAgICAgICBpZiAoIXRoaXMuZGF0YWJhc2Uub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyh0aGlzLmNhcnRDb2xsZWN0aW9uTmFtZSkpIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhYmFzZS5jcmVhdGVPYmplY3RTdG9yZSh0aGlzLmNhcnRDb2xsZWN0aW9uTmFtZSwgeyBrZXlQYXRoOiBcInZhcmllbnRJZFwiIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKCF0aGlzLmRhdGFiYXNlLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnModGhpcy50cmlhbENhcnRDb2xsZWN0aW9uTmFtZSkpIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhYmFzZS5jcmVhdGVPYmplY3RTdG9yZSh0aGlzLnRyaWFsQ2FydENvbGxlY3Rpb25OYW1lLCB7IGtleVBhdGg6IFwidmFyaWVudElkXCIgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoIXRoaXMuZGF0YWJhc2Uub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyh0aGlzLmZhdm91cml0ZUNvbGxlY3Rpb25OYW1lKSkge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlLmNyZWF0ZU9iamVjdFN0b3JlKHRoaXMuZmF2b3VyaXRlQ29sbGVjdGlvbk5hbWUsIHsga2V5UGF0aDogXCJ2YXJpZW50SWRcIiB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICghdGhpcy5kYXRhYmFzZS5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKHRoaXMudXNlckNvbGxlY3Rpb25OYW1lKSkge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlLmNyZWF0ZU9iamVjdFN0b3JlKHRoaXMudXNlckNvbGxlY3Rpb25OYW1lLCB7IGtleVBhdGg6IFwidXNlcklkXCIgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoIXRoaXMuZGF0YWJhc2Uub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyh0aGlzLmhvbWVWaXNpdENhcnRDb2xsZWN0aW9uTmFtZSkpIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhYmFzZS5jcmVhdGVPYmplY3RTdG9yZSh0aGlzLmhvbWVWaXNpdENhcnRDb2xsZWN0aW9uTmFtZSwgeyBrZXlQYXRoOiBcInZhcmllbnRJZFwiIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKCF0aGlzLmRhdGFiYXNlLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnModGhpcy52aWRlb0NhbGxDYXJ0Q29sbGVjdGlvbk5hbWUpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UuY3JlYXRlT2JqZWN0U3RvcmUodGhpcy52aWRlb0NhbGxDYXJ0Q29sbGVjdGlvbk5hbWUsIHsga2V5UGF0aDogXCJ2YXJpZW50SWRcIiB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9O1xyXG5cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zb2xlLndhcm4oJ1tTU1JdIEluZGV4ZWREQiBub3QgYXZhaWxhYmxlJyk7XHJcbiAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuZGJSZWFkeTtcclxuICB9XHJcblxyXG4gIHNldFRva2VuKHRva2VuOiBhbnkpIHtcclxuICAgIHRoaXMuY29va2llU2VydmljZS5zZXQoXCJwYXNzQm9va1Rva2VuXCIsIHRva2VuKVxyXG4gICAgLy8gbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJwYXNzQm9va1Rva2VuXCIsIHRva2VuKTtcclxuICAgIHRoaXMuc3RvcmFnZS5zZXRJdGVtKFwicGFzc0Jvb2tUb2tlblwiLCB0b2tlbik7XHJcbiAgfVxyXG5cclxuICBnZXRUb2tlbigpIHtcclxuICAgIGxldCB0b2tlbjogYW55ID0gdGhpcy5jb29raWVTZXJ2aWNlLmdldCgncGFzc0Jvb2tUb2tlbicpXHJcbiAgICBpZiAoIXRva2VuKVxyXG4gICAgICB0b2tlbiA9IHRoaXMuc3RvcmFnZS5nZXRJdGVtKCdwYXNzQm9va1Rva2VuJykgfHwgXCJcIlxyXG4gICAgcmV0dXJuIHRva2VuO1xyXG4gIH1cclxuXHJcblxyXG4gIHNldFJlZmVycmFsRGV0YWlscyhkZXRhaWxzOiBhbnkpIHtcclxuICAgIHRoaXMuY29va2llU2VydmljZS5zZXQoXCJyZWZlcnJhbERldGFpbHNcIiwgSlNPTi5zdHJpbmdpZnkoZGV0YWlscykpXHJcbiAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbShcInJlZmVycmFsRGV0YWlsc1wiLCBKU09OLnN0cmluZ2lmeShkZXRhaWxzKSk7XHJcbiAgfVxyXG5cclxuICBnZXRSZWZlcnJhbERldGFpbHMoKSB7XHJcbiAgICBsZXQgcmVmZXJyYWxEZXRhaWxzOiBhbnkgPSB0aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KCdyZWZlcnJhbERldGFpbHMnKVxyXG4gICAgaWYgKCFyZWZlcnJhbERldGFpbHMpIHtcclxuICAgICAgcmVmZXJyYWxEZXRhaWxzID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0oXCJyZWZlcnJhbERldGFpbHNcIik7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVmZXJyYWxEZXRhaWxzO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlQWxsRGF0YSgpIHtcclxuICAgIGlmICh0aGlzLnJvdXRlci51cmwuaW5jbHVkZXMoJ2NhcnQnKSlcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGNvbnN0IHVzZXJEZXRhaWxzID0gdGhpcy5nZXRVc2VyKCk7XHJcbiAgICBpZiAoISF1c2VyRGV0YWlscykge1xyXG4gICAgICB0aGlzLmV2ZW50U2VydmljZS5zaG93TG9hZGluZ1NjcmVlbi5lbWl0KHRydWUpO1xyXG4gICAgICBjb25zdCByZXF1ZXN0ID0gZm9ya0pvaW4oW1xyXG4gICAgICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0VXNlckl0ZW1zKHVzZXJEZXRhaWxzLnVzZXJJZCwgXCJDQVJUXCIpLFxyXG4gICAgICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0VXNlckl0ZW1zKHVzZXJEZXRhaWxzLnVzZXJJZCwgXCJXSVNITElTVFwiKVxyXG4gICAgICBdKTtcclxuICAgICAgcmVxdWVzdC5zdWJzY3JpYmUoKGNhcnRSZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgdXNlckRldGFpbHMgPSB0aGlzLmdldFVzZXIoKSBhcyBVc2VyO1xyXG4gICAgICAgIGNvbnN0IHVzZXJDYXJ0OiBDYXJ0ID0gY2FydFJlc3BvbnNlPy5bMF0uZGF0YVswXSA/IGNhcnRSZXNwb25zZT8uWzBdLmRhdGFbMF0gYXMgQ2FydCA6IG5ldyBDYXJ0KHsgJ2NhcnRUeXBlJzogY2FydFR5cGUuQ0FSVCwgJ3VzZXJEZXRhaWxzJzogdXNlckRldGFpbHMsICdwbGF0Zm9ybSc6ICdXRUInIH0pO1xyXG5cclxuICAgICAgICBpZiAodXNlckNhcnQ/LmNhcnRJZClcclxuICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwiY2FydElkXCIsIHVzZXJDYXJ0Py5jYXJ0SWQpO1xyXG4gICAgICAgIHRoaXMuZ2V0VXNlckNhcnQoKS50aGVuKCh1c2VyQ2FydFJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICB1c2VyQ2FydFJlc3BvbnNlLm9uc3VjY2VzcyA9ICh1c2VyQ2FydEluZGV4REI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICB1c2VyQ2FydC5vcmRlcmVkSXRlbXMgPSB0aGlzLm1lcmdlQWxsSXRlbXModXNlckNhcnRJbmRleERCLnRhcmdldC5yZXN1bHQgPz8gW10sIHVzZXJDYXJ0Py5vcmRlcmVkSXRlbXMgPz8gW10pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5hZGRBbGxQcm9kdWN0c1RvQ2FydCh1c2VyQ2FydC5vcmRlcmVkSXRlbXMpO1xyXG4gICAgICAgICAgICAvLyB0aGlzLnJlc3RTZXJ2aWNlLmFkZEl0ZW1Ub0RCKHVzZXJDYXJ0KS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIC8vICAgaWYocmVzPy5kYXRhPy5jYXJ0SWQgJiYgIWxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYXJ0SWQnKSlcclxuICAgICAgICAgICAgLy8gICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYXJ0SWQnLCByZXMuZGF0YS5jYXJ0SWQpO1xyXG4gICAgICAgICAgICAvLyB9KVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIGNvbnN0IHVzZXJXaXNobGlzdDogQ2FydCA9IGNhcnRSZXNwb25zZT8uWzFdLmRhdGEgYXMgQ2FydDtcclxuICAgICAgICBpZiAodXNlcldpc2hsaXN0LmNhcnRJZClcclxuICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwid2lzaGxpc3RJZFwiLCB1c2VyV2lzaGxpc3QuY2FydElkKTtcclxuICAgICAgICB0aGlzLmdldFVzZXJXaGlzaGxpc3QoKS50aGVuKCh1c2VyV2lzaGxpc3RSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgdXNlcldpc2hsaXN0UmVzcG9uc2Uub25zdWNjZXNzID0gKHVzZXJXaXNobGlzdEluZGV4REI6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICB1c2VyV2lzaGxpc3Qub3JkZXJlZEl0ZW1zID0gWy4uLih1c2VyV2lzaGxpc3RJbmRleERCLnRhcmdldC5yZXN1bHQgPz8gW10pLCAuLi4odXNlcldpc2hsaXN0Lm9yZGVyZWRJdGVtcyA/PyBbXSldO1xyXG4gICAgICAgICAgICB0aGlzLmFkZEFsbFByb2R1Y3RUb1dpc2hsaXN0KHVzZXJXaXNobGlzdC5vcmRlcmVkSXRlbXMpO1xyXG4gICAgICAgICAgICB0aGlzLnJlc3RTZXJ2aWNlLmFkZEl0ZW1Ub0RCKHVzZXJXaXNobGlzdCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgdGhpcy5ldmVudFNlcnZpY2Uuc2hvd0xvYWRpbmdTY3JlZW4uZW1pdChmYWxzZSk7XHJcbiAgICAgIH0pXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyB0aGlzLnN0b3JlRGF0YVRvSlNPTigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbWVyZ2VBbGxJdGVtcyh1blN5bmNlZEl0ZW06IGFueVtdLCBzeW5jZWRJdGVtOiBhbnlbXSkge1xyXG4gICAgZm9yIChsZXQgcHJvZHVjdCBvZiBzeW5jZWRJdGVtKSB7XHJcbiAgICAgIGxldCBpdGVtRm91bmQgPSBmYWxzZTtcclxuICAgICAgZm9yIChsZXQgY2FydEl0ZW0gb2YgdW5TeW5jZWRJdGVtKSB7XHJcbiAgICAgICAgaWYgKGNhcnRJdGVtLnZhcmllbnRJZCA9PT0gcHJvZHVjdC52YXJpZW50SWQpIHtcclxuICAgICAgICAgIGl0ZW1Gb3VuZCA9IHRydWU7XHJcbiAgICAgICAgICAvLyBjYXJ0SXRlbS5xdWFudGl0eSA9IHByb2R1Y3QucXVhbnRpdHk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICghaXRlbUZvdW5kKSB7XHJcbiAgICAgICAgdW5TeW5jZWRJdGVtLnB1c2gocHJvZHVjdCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB1blN5bmNlZEl0ZW07XHJcbiAgfVxyXG5cclxuICAvLyBDQVJUIFNFUlZJQ0VcclxuICBhc3luYyBnZXRVc2VyQ2FydCgpOiBQcm9taXNlPElEQlJlcXVlc3Q8T3JkZXJlZEl0ZW1zW10+PiB7XHJcbiAgICBhd2FpdCB0aGlzLmRiUmVhZHk7XHJcblxyXG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRhdGFiYXNlPy50cmFuc2FjdGlvbih0aGlzLmNhcnRDb2xsZWN0aW9uTmFtZSA/PyBcIlVTRVJfQ0FSVFwiLCBcInJlYWR3cml0ZVwiKTtcclxuICAgIHJldHVybiB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZSh0aGlzLmNhcnRDb2xsZWN0aW9uTmFtZSkuZ2V0QWxsKCk7XHJcbiAgfVxyXG5cclxuICBhZGRQcm9kdWN0VG9DYXJ0KHByb2R1Y3Q6IE9yZGVyZWRJdGVtcykge1xyXG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRhdGFiYXNlPy50cmFuc2FjdGlvbih0aGlzLmNhcnRDb2xsZWN0aW9uTmFtZSA/PyBcIlVTRVJfQ0FSVFwiLCBcInJlYWR3cml0ZVwiKTtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZSh0aGlzLmNhcnRDb2xsZWN0aW9uTmFtZSkucHV0KHByb2R1Y3QpO1xyXG4gICAgdHJhbnNhY3Rpb24ub25jb21wbGV0ZSA9ICgpID0+IHtcclxuICAgICAgdGhpcy5jYWxjdWxhdGVDYXJ0VG90YWxzKCk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHJlcXVlc3Q7XHJcbiAgfVxyXG5cclxuICBhZGRBbGxQcm9kdWN0VG9XaXNobGlzdChwcm9kdWN0czogT3JkZXJlZEl0ZW1zW10pOiBJREJUcmFuc2FjdGlvbiB7XHJcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGF0YWJhc2U/LnRyYW5zYWN0aW9uKHRoaXMuZmF2b3VyaXRlQ29sbGVjdGlvbk5hbWUgPz8gXCJVU0VSX0ZBVk9VUklURVwiLCBcInJlYWR3cml0ZVwiKTtcclxuICAgIHByb2R1Y3RzLmZvckVhY2goKHByb2R1Y3QpID0+IHtcclxuICAgICAgdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUodGhpcy5mYXZvdXJpdGVDb2xsZWN0aW9uTmFtZSkucHV0KHByb2R1Y3QpO1xyXG4gICAgfSlcclxuICAgIHRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSAoKSA9PiB7XHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlV2lzaGxpc3RUb3RhbHMoKTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gdHJhbnNhY3Rpb247XHJcbiAgfVxyXG4gIGFkZEFsbFByb2R1Y3RzVG9DYXJ0KHByb2R1Y3RzOiBPcmRlcmVkSXRlbXNbXSk6IElEQlRyYW5zYWN0aW9uIHtcclxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYXRhYmFzZT8udHJhbnNhY3Rpb24odGhpcy5jYXJ0Q29sbGVjdGlvbk5hbWUgPz8gXCJVU0VSX0NBUlRcIiwgXCJyZWFkd3JpdGVcIik7XHJcbiAgICBwcm9kdWN0cy5mb3JFYWNoKChwcm9kdWN0KSA9PiB7XHJcbiAgICAgIHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHRoaXMuY2FydENvbGxlY3Rpb25OYW1lKS5wdXQocHJvZHVjdCk7XHJcbiAgICB9KVxyXG4gICAgdHJhbnNhY3Rpb24ub25jb21wbGV0ZSA9ICgpID0+IHtcclxuICAgICAgdGhpcy5jYWxjdWxhdGVDYXJ0VG90YWxzKCk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uO1xyXG4gIH1cclxuICByZW1vdmVQcm9kdWN0RnJvbUNhcnQocHJvZHVjdElkOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYXRhYmFzZT8udHJhbnNhY3Rpb24odGhpcy5jYXJ0Q29sbGVjdGlvbk5hbWUgPz8gXCJVU0VSX0NBUlRcIiwgXCJyZWFkd3JpdGVcIik7XHJcbiAgICBjb25zdCByZXF1ZXN0ID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUodGhpcy5jYXJ0Q29sbGVjdGlvbk5hbWUpLmRlbGV0ZShwcm9kdWN0SWQpO1xyXG4gICAgdHJhbnNhY3Rpb24ub25jb21wbGV0ZSA9ICgpID0+IHtcclxuICAgICAgdGhpcy5jYWxjdWxhdGVDYXJ0VG90YWxzKCk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHJlcXVlc3Q7XHJcbiAgfVxyXG4gIGFzeW5jIGdldFByb2R1Y3RGcm9tQ2FydChwcm9kdWN0SWQ6IHN0cmluZykge1xyXG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRhdGFiYXNlPy50cmFuc2FjdGlvbih0aGlzLmNhcnRDb2xsZWN0aW9uTmFtZSA/PyBcIlVTRVJfQ0FSVFwiLCBcInJlYWR3cml0ZVwiKTtcclxuICAgIHJldHVybiBhd2FpdCB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZSh0aGlzLmNhcnRDb2xsZWN0aW9uTmFtZSkuZ2V0KHByb2R1Y3RJZCk7XHJcbiAgfVxyXG5cclxuICAvLyBXSVNITElTVCBTRVJWSUNFXHJcbiAgYXN5bmMgZ2V0VXNlcldoaXNobGlzdCgpOiBQcm9taXNlPElEQlJlcXVlc3Q8T3JkZXJlZEl0ZW1zW10+PiB7XHJcblxyXG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRhdGFiYXNlLnRyYW5zYWN0aW9uKHRoaXMuZmF2b3VyaXRlQ29sbGVjdGlvbk5hbWUsIFwicmVhZHdyaXRlXCIpO1xyXG4gICAgcmV0dXJuIGF3YWl0IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHRoaXMuZmF2b3VyaXRlQ29sbGVjdGlvbk5hbWUpLmdldEFsbCgpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0VHJpYWxDYXJ0KCk6IFByb21pc2U8SURCUmVxdWVzdDxPcmRlcmVkSXRlbXNbXT4+IHtcclxuXHJcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGF0YWJhc2UudHJhbnNhY3Rpb24odGhpcy50cmlhbENhcnRDb2xsZWN0aW9uTmFtZSwgXCJyZWFkd3JpdGVcIik7XHJcbiAgICByZXR1cm4gYXdhaXQgdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUodGhpcy50cmlhbENhcnRDb2xsZWN0aW9uTmFtZSkuZ2V0QWxsKCk7XHJcbiAgfVxyXG5cclxuICBhZGRQcm9kdWN0VG9XaXNobGlzdChwcm9kdWN0OiBPcmRlcmVkSXRlbXMpIHtcclxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYXRhYmFzZS50cmFuc2FjdGlvbih0aGlzLmZhdm91cml0ZUNvbGxlY3Rpb25OYW1lLCBcInJlYWR3cml0ZVwiKTtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZSh0aGlzLmZhdm91cml0ZUNvbGxlY3Rpb25OYW1lKS5wdXQocHJvZHVjdCk7XHJcbiAgICB0cmFuc2FjdGlvbi5vbmNvbXBsZXRlID0gKCkgPT4ge1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZVdpc2hsaXN0VG90YWxzKCk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHJlcXVlc3Q7XHJcbiAgfVxyXG4gIGFkZFByb2R1Y3RUb1RyaWFsKHByb2R1Y3Q6IE9yZGVyZWRJdGVtcykge1xyXG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRhdGFiYXNlLnRyYW5zYWN0aW9uKHRoaXMudHJpYWxDYXJ0Q29sbGVjdGlvbk5hbWUsIFwicmVhZHdyaXRlXCIpO1xyXG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHRoaXMudHJpYWxDYXJ0Q29sbGVjdGlvbk5hbWUpLnB1dChwcm9kdWN0KTtcclxuICB9XHJcbiAgcmVtb3ZlUHJvZHVjdEZyb21XaXNobGlzdChwcm9kdWN0SWQ6IHN0cmluZykge1xyXG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRhdGFiYXNlLnRyYW5zYWN0aW9uKHRoaXMuZmF2b3VyaXRlQ29sbGVjdGlvbk5hbWUsIFwicmVhZHdyaXRlXCIpO1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHRoaXMuZmF2b3VyaXRlQ29sbGVjdGlvbk5hbWUpLmRlbGV0ZShwcm9kdWN0SWQpO1xyXG4gICAgdHJhbnNhY3Rpb24ub25jb21wbGV0ZSA9ICgpID0+IHtcclxuICAgICAgdGhpcy5jYWxjdWxhdGVXaXNobGlzdFRvdGFscygpO1xyXG4gICAgfTtcclxuICAgIHJldHVybiByZXF1ZXN0O1xyXG4gIH1cclxuXHJcbiAgY2xlYXJVc2VyQ2FydCgpIHtcclxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYXRhYmFzZT8udHJhbnNhY3Rpb24odGhpcy5jYXJ0Q29sbGVjdGlvbk5hbWUgPz8gXCJVU0VSX0NBUlRcIiwgXCJyZWFkd3JpdGVcIik7XHJcbiAgICBjb25zdCByZXF1ZXN0ID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUodGhpcy5jYXJ0Q29sbGVjdGlvbk5hbWUpLmNsZWFyKCk7XHJcbiAgICB0cmFuc2FjdGlvbi5vbmNvbXBsZXRlID0gKCkgPT4ge1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZUNhcnRUb3RhbHMoKTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gcmVxdWVzdDtcclxuICB9XHJcblxyXG4gIGNsZWFyVHJpYWxDYXJ0KCkge1xyXG4gICAgdGhpcy50b3RhbENhcnRJdGVtcyA9IDA7XHJcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGF0YWJhc2U/LnRyYW5zYWN0aW9uKHRoaXMudHJpYWxDYXJ0Q29sbGVjdGlvbk5hbWUsIFwicmVhZHdyaXRlXCIpO1xyXG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHRoaXMudHJpYWxDYXJ0Q29sbGVjdGlvbk5hbWUpLmNsZWFyKCk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVQcm9kdWN0RnJvbVRyaWFsQ2FydChwcm9kdWN0SWQ6IHN0cmluZykge1xyXG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRhdGFiYXNlLnRyYW5zYWN0aW9uKHRoaXMudHJpYWxDYXJ0Q29sbGVjdGlvbk5hbWUsIFwicmVhZHdyaXRlXCIpO1xyXG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHRoaXMudHJpYWxDYXJ0Q29sbGVjdGlvbk5hbWUpLmRlbGV0ZShwcm9kdWN0SWQpO1xyXG4gIH1cclxuXHJcbiAgLy8gQk9PS0lORyBQUk9EVUNUIENBUlRTIChIb21lIFZpc2l0IC8gVmlkZW8gQ2FsbCkg4oCUIGxvY2FsLW9ubHksIHNlZSBmaWVsZCBjb21tZW50cyBhYm92ZS5cclxuICBwcml2YXRlIGJvb2tpbmdDYXJ0U3RvcmVOYW1lKG1vZGU6ICdIT01FX1ZJU0lUJyB8ICdWSURFT19DQUxMJyk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gbW9kZSA9PT0gJ0hPTUVfVklTSVQnID8gdGhpcy5ob21lVmlzaXRDYXJ0Q29sbGVjdGlvbk5hbWUgOiB0aGlzLnZpZGVvQ2FsbENhcnRDb2xsZWN0aW9uTmFtZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldEJvb2tpbmdDYXJ0KG1vZGU6ICdIT01FX1ZJU0lUJyB8ICdWSURFT19DQUxMJyk6IFByb21pc2U8SURCUmVxdWVzdDxPcmRlcmVkSXRlbXNbXT4+IHtcclxuICAgIGF3YWl0IHRoaXMuZGJSZWFkeTtcclxuICAgIGNvbnN0IHN0b3JlTmFtZSA9IHRoaXMuYm9va2luZ0NhcnRTdG9yZU5hbWUobW9kZSk7XHJcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGF0YWJhc2UudHJhbnNhY3Rpb24oc3RvcmVOYW1lLCBcInJlYWR3cml0ZVwiKTtcclxuICAgIHJldHVybiB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzdG9yZU5hbWUpLmdldEFsbCgpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWRkUHJvZHVjdFRvQm9va2luZ0NhcnQobW9kZTogJ0hPTUVfVklTSVQnIHwgJ1ZJREVPX0NBTEwnLCBwcm9kdWN0OiBPcmRlcmVkSXRlbXMpIHtcclxuICAgIGF3YWl0IHRoaXMuZGJSZWFkeTtcclxuICAgIGNvbnN0IHN0b3JlTmFtZSA9IHRoaXMuYm9va2luZ0NhcnRTdG9yZU5hbWUobW9kZSk7XHJcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGF0YWJhc2UudHJhbnNhY3Rpb24oc3RvcmVOYW1lLCBcInJlYWR3cml0ZVwiKTtcclxuICAgIHJldHVybiB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzdG9yZU5hbWUpLnB1dChwcm9kdWN0KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHJlbW92ZVByb2R1Y3RGcm9tQm9va2luZ0NhcnQobW9kZTogJ0hPTUVfVklTSVQnIHwgJ1ZJREVPX0NBTEwnLCBwcm9kdWN0SWQ6IHN0cmluZykge1xyXG4gICAgYXdhaXQgdGhpcy5kYlJlYWR5O1xyXG4gICAgY29uc3Qgc3RvcmVOYW1lID0gdGhpcy5ib29raW5nQ2FydFN0b3JlTmFtZShtb2RlKTtcclxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYXRhYmFzZS50cmFuc2FjdGlvbihzdG9yZU5hbWUsIFwicmVhZHdyaXRlXCIpO1xyXG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHN0b3JlTmFtZSkuZGVsZXRlKHByb2R1Y3RJZCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBjbGVhckJvb2tpbmdDYXJ0KG1vZGU6ICdIT01FX1ZJU0lUJyB8ICdWSURFT19DQUxMJykge1xyXG4gICAgYXdhaXQgdGhpcy5kYlJlYWR5O1xyXG4gICAgY29uc3Qgc3RvcmVOYW1lID0gdGhpcy5ib29raW5nQ2FydFN0b3JlTmFtZShtb2RlKTtcclxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYXRhYmFzZS50cmFuc2FjdGlvbihzdG9yZU5hbWUsIFwicmVhZHdyaXRlXCIpO1xyXG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHN0b3JlTmFtZSkuY2xlYXIoKTtcclxuICB9XHJcblxyXG4gIC8vIFVTRVIgU0VSVklDRVxyXG4gIHNldFVzZXIodXNlcjogVXNlcik6IFVzZXIge1xyXG4gICAgdGhpcy5jb29raWVTZXJ2aWNlLnNldChcInVzZXJcIiwgSlNPTi5zdHJpbmdpZnkodXNlciA/PyBcInt9XCIpLCA3KTtcclxuICAgIC8vIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFwidXNlclwiLCBKU09OLnN0cmluZ2lmeSh1c2VyID8/IFwie31cIikpO1xyXG4gICAgdGhpcy5zdG9yYWdlLnNldEl0ZW0oXCJ1c2VyXCIsIEpTT04uc3RyaW5naWZ5KHVzZXIgPz8gXCJ7fVwiKSk7XHJcbiAgICByZXR1cm4gdXNlcjtcclxuICB9XHJcbiAgZ2V0VXNlcigpOiBVc2VyIHwgbnVsbCB7XHJcbiAgICB0cnkge1xyXG4gICAgICBsZXQgdXNlclN0ciA9IHRoaXMuY29va2llU2VydmljZS5nZXQoXCJ1c2VyXCIpO1xyXG4gICAgICBpZiAoIXVzZXJTdHIpIHtcclxuICAgICAgICB1c2VyU3RyID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0oXCJ1c2VyXCIpIHx8IFwiXCI7IC8vIOKchSBmYWxsYmFja1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghdXNlclN0cikgcmV0dXJuIG51bGw7XHJcbiAgICAgIGNvbnN0IHVzZXI6IFVzZXIgPSBKU09OLnBhcnNlKHVzZXJTdHIpO1xyXG4gICAgICBpZiAoIXVzZXI/LnVzZXJJZCkgcmV0dXJuIG51bGw7XHJcbiAgICAgIHRoaXMuc3RvcmFnZS5zZXRJdGVtKFwicGVySWRcIiwgdXNlci51c2VySWQpO1xyXG4gICAgICByZXR1cm4gdXNlcjtcclxuXHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3RhYmxlIHBlci1icm93c2VyIGlkLCBwZXJzaXN0ZWQgcmVnYXJkbGVzcyBvZiBsb2dpbiBzdGF0ZSwgc28gYmVoYXZpb3IgY2FuIGJlIHRyYWNrZWRcclxuICAgKiBiZWZvcmUgYSB2aXNpdG9yIGxvZ3MgaW4uIE1pcnJvcnMgc2V0VXNlcigpJ3MgZHVhbCBjb29raWUrc3RvcmFnZSB3cml0ZSBzbyBpdCBzdXJ2aXZlc1xyXG4gICAqIHRoZSBzYW1lIHdheS4gTWVyZ2VkIG9udG8gdGhlIHJlYWwgdXNlcklkIHNlcnZlci1zaWRlIG9uY2UgdGhleSBsb2cgaW4gKEFuYWx5dGljc1NlcnZpY2UubWVyZ2VBbm9ueW1vdXNVc2VyKS5cclxuICAgKi9cclxuICBnZXRBbm9ueW1vdXNJZCgpOiBzdHJpbmcge1xyXG4gICAgbGV0IGFub25JZCA9IHRoaXMuY29va2llU2VydmljZS5nZXQoXCJhbm9uSWRcIikgfHwgdGhpcy5zdG9yYWdlLmdldEl0ZW0oXCJhbm9uSWRcIik7XHJcbiAgICBpZiAoIWFub25JZCkge1xyXG4gICAgICBhbm9uSWQgPSBjcnlwdG8ucmFuZG9tVVVJRCgpO1xyXG4gICAgICB0aGlzLmNvb2tpZVNlcnZpY2Uuc2V0KFwiYW5vbklkXCIsIGFub25JZCwgMzY1KTtcclxuICAgICAgdGhpcy5zdG9yYWdlLnNldEl0ZW0oXCJhbm9uSWRcIiwgYW5vbklkKTtcclxuICAgIH1cclxuICAgIHJldHVybiBhbm9uSWQ7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=
424
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9zZXJ2aWNlcy9zdG9yYWdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUtuRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWhDLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFbEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFcEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDOzs7Ozs7QUFPaEUsTUFBTSxPQUFPLHFCQUFxQjtJQUtoQyxZQUNtQixZQUEyQixFQUMzQixhQUE0QixFQUM1QixXQUF3QixFQUNWLE9BQW9CLEVBQzNDLE1BQWMsRUFDTyxVQUFrQjtRQUw5QixpQkFBWSxHQUFaLFlBQVksQ0FBZTtRQUMzQixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUNWLFlBQU8sR0FBUCxPQUFPLENBQWE7UUFDM0MsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNPLGVBQVUsR0FBVixVQUFVLENBQVE7UUFXekMsbUJBQWMsR0FBVyxDQUFDLENBQUM7UUFDbkMsdUJBQWtCLEdBQVcsQ0FBQyxDQUFDO1FBUXZCLHVCQUFrQixHQUFXLENBQUMsQ0FBQztRQU92Qyw4RkFBOEY7UUFDdEYsc0JBQWlCLEdBQVcsQ0FBQyxDQUFDO1FBdUR0QyxpQkFBWSxHQUFXLE1BQU0sQ0FBQztRQUM5Qiw0RkFBNEY7UUFDNUYsNEZBQTRGO1FBQzVGLG9GQUFvRjtRQUNwRixvQkFBZSxH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QUMsT0FBTyxDQUFDLENBQUM7WUFDdkMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNO2dCQUFFLE9BQU8sSUFBSSxDQUFDO1lBQy9CLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDM0MsT0FBTyxJQUFJLENBQUM7UUFFZCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsY0FBYztRQUNaLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hGLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDekMsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7K0dBemJVLHFCQUFxQix1R0FTdEIsYUFBYSxtQ0FFYixXQUFXO21IQVhWLHFCQUFxQixjQUZwQixNQUFNOzs0RkFFUCxxQkFBcUI7a0JBSGpDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25COzswQkFVSSxNQUFNOzJCQUFDLGFBQWE7OzBCQUVwQixNQUFNOzJCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgT3JkZXJlZEl0ZW1zIH0gZnJvbSAnLi4vZWNvbW1lcmNlL3N0eWxlcy9PcmRlcmVkSXRlbXMubW9kYWwnO1xyXG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vZWNvbW1lcmNlL3N0eWxlcy91c2VyLm1vZGFsJztcclxuaW1wb3J0IHsgRXZlbnRzU2VydmljZSB9IGZyb20gJy4vZXZlbnRzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb29raWVTZXJ2aWNlIH0gZnJvbSAnbmd4LWNvb2tpZS1zZXJ2aWNlJztcclxuaW1wb3J0IHsgZm9ya0pvaW4gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgUmVzdFNlcnZpY2UgfSBmcm9tICcuL3Jlc3Quc2VydmljZSc7XHJcbmltcG9ydCB7IENhcnQsIGNhcnRUeXBlIH0gZnJvbSAnLi8uLi9lY29tbWVyY2Uvc3R5bGVzL2NhcnQubW9kYWwnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgaXNQbGF0Zm9ybUJyb3dzZXIgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBJbmplY3QsIFBMQVRGT1JNX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFN0b3JhZ2VMaWtlIH0gZnJvbSAnLi4vc2VydmljZXMvc3RvcmFnZS1saWtlJztcclxuaW1wb3J0IHsgTE9DQUxfU1RPUkFHRSB9IGZyb20gJy4uL3NlcnZpY2VzL2xvY2FsLXN0b3JhZ2UudG9rZW4nO1xyXG5cclxuXHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTdG9yYWdlU2VydmljZVNlcnZpY2Uge1xyXG5cclxuXHJcbiAgcHJpdmF0ZSBkYlJlYWR5ITogUHJvbWlzZTx2b2lkPjtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50U2VydmljZTogRXZlbnRzU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29va2llU2VydmljZTogQ29va2llU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzdFNlcnZpY2U6IFJlc3RTZXJ2aWNlLFxyXG4gICAgQEluamVjdChMT0NBTF9TVE9SQUdFKSBwcml2YXRlIHN0b3JhZ2U6IFN0b3JhZ2VMaWtlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIEBJbmplY3QoUExBVEZPUk1fSUQpIHByaXZhdGUgcGxhdGZvcm1JZDogT2JqZWN0XHJcbiAgKSB7XHJcbiAgICB0aGlzLmNyZWF0ZURhdGFCYXNlKCk7XHJcbiAgICBjb25zdCB1c2VyRGV0YWlscyA9IHRoaXMuZ2V0VXNlcigpO1xyXG4gICAgaWYgKCEhdXNlckRldGFpbHMpIHtcclxuICAgICAgdGhpcy5yZXN0U2VydmljZS5nZXRVc2VySW5mbyh1c2VyRGV0YWlscy51c2VySWQpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2V0VXNlcihyZXNwb25zZS5kYXRhKTtcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdG90YWxDYXJ0SXRlbXM6IG51bWJlciA9IDA7XHJcbiAgZ2V0Q2FydFRvdGFsQW1vdW50OiBudW1iZXIgPSAwO1xyXG4gIGdldCBnZXRUb3RhbENhcnRJdGVtcygpIHtcclxuICAgIGlmICh0aGlzLnRvdGFsQ2FydEl0ZW1zIDwgMClcclxuICAgICAgdGhpcy50b3RhbENhcnRJdGVtcyA9IDA7XHJcbiAgICAvLyB0aGlzLmV2ZW50U2VydmljZS5zaG93QmFnSWNvbi5lbWl0KHRoaXMudG90YWxDYXJ0SXRlbXMgPiAwKTtcclxuICAgIHJldHVybiB0aGlzLnRvdGFsQ2FydEl0ZW1zO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0b3RhbFdpc2hsaXN0SXRlbXM6IG51bWJlciA9IDA7XHJcbiAgZ2V0IGdldFRvdGFsV2lzaGxpc3RJdGVtcygpIHtcclxuICAgIGlmICh0aGlzLnRvdGFsV2lzaGxpc3RJdGVtcyA8IDApXHJcbiAgICAgIHRoaXMudG90YWxXaXNobGlzdEl0ZW1zID0gMDtcclxuICAgIHJldHVybiB0aGlzLnRvdGFsV2lzaGxpc3RJdGVtcztcclxuICB9XHJcblxyXG4gIC8qKiBDb21iaW5lZCBjb3VudCBhY3Jvc3MgSE9NRV9WSVNJVF9DQVJUICsgVklERU9fQ0FMTF9DQVJULCBmb3IgdGhlIGhlYWRlciBCb29raW5ncyBiYWRnZS4gKi9cclxuICBwcml2YXRlIHRvdGFsQm9va2luZ0l0ZW1zOiBudW1iZXIgPSAwO1xyXG4gIGdldCBnZXRUb3RhbEJvb2tpbmdJdGVtcygpIHtcclxuICAgIGlmICh0aGlzLnRvdGFsQm9va2luZ0l0ZW1zIDwgMClcclxuICAgICAgdGhpcy50b3RhbEJvb2tpbmdJdGVtcyA9IDA7XHJcbiAgICByZXR1cm4gdGhpcy50b3RhbEJvb2tpbmdJdGVtcztcclxuICB9XHJcblxyXG4gIGNhbGN1bGF0ZUJvb2tpbmdDYXJ0VG90YWxzKCkge1xyXG4gICAgaWYgKCF0aGlzLmRhdGFiYXNlKSByZXR1cm47XHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBtb2RlczogKCdIT01FX1ZJU0lUJyB8ICdWSURFT19DQUxMJylbXSA9IFsnSE9NRV9WSVNJVCcsICdWSURFT19DQUxMJ107XHJcbiAgICAgIGNvbnN0IGNvdW50czogbnVtYmVyW10gPSBbMCwgMF07XHJcbiAgICAgIG1vZGVzLmZvckVhY2goKG1vZGUsIGkpID0+IHtcclxuICAgICAgICBjb25zdCBzdG9yZU5hbWUgPSB0aGlzLmJvb2tpbmdDYXJ0U3RvcmVOYW1lKG1vZGUpO1xyXG4gICAgICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYXRhYmFzZS50cmFuc2FjdGlvbihzdG9yZU5hbWUsIFwicmVhZG9ubHlcIik7XHJcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHN0b3JlTmFtZSkuZ2V0QWxsKCk7XHJcbiAgICAgICAgcmVxdWVzdC5vbnN1Y2Nlc3MgPSAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY291bnRzW2ldID0gKGV2ZW50LnRhcmdldC5yZXN1bHQgfHwgW10pLmxlbmd0aDtcclxuICAgICAgICAgIHRoaXMudG90YWxCb29raW5nSXRlbXMgPSBjb3VudHMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XHJcbiAgICAgICAgfTtcclxuICAgICAgfSk7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcIkVycm9yIGNhbGN1bGF0aW5nIGJvb2tpbmcgY2FydCB0b3RhbHM6XCIsIGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FsY3VsYXRlQ2FydFRvdGFscygpIHtcclxuICAgIGlmICghdGhpcy5kYXRhYmFzZSkgcmV0dXJuO1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgY2FydFRyYW5zYWN0aW9uID0gdGhpcy5kYXRhYmFzZS50cmFuc2FjdGlvbih0aGlzLmNhcnRDb2xsZWN0aW9uTmFtZSwgXCJyZWFkb25seVwiKTtcclxuICAgICAgY29uc3QgY2FydFJlcXVlc3QgPSBjYXJ0VHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUodGhpcy5jYXJ0Q29sbGVjdGlvbk5hbWUpLmdldEFsbCgpO1xyXG4gICAgICBjYXJ0UmVxdWVzdC5vbnN1Y2Nlc3MgPSAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZXZlbnQudGFyZ2V0LnJlc3VsdCB8fCBbXTtcclxuICAgICAgICB0aGlzLnRvdGFsQ2FydEl0ZW1zID0gaXRlbXMubGVuZ3RoO1xyXG4gICAgICAgIHRoaXMuZ2V0Q2FydFRvdGFsQW1vdW50ID0gaXRlbXMucmVkdWNlKChhY2M6IG51bWJlciwgaXRlbTogYW55KSA9PiBhY2MgKyAoKGl0ZW0uc2VsbGluZ1ByaWNlIHx8IDApICogKGl0ZW0ucXVhbnRpdHkgfHwgMSkpLCAwKTtcclxuICAgICAgfTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiRXJyb3IgY2FsY3VsYXRpbmcgY2FydCB0b3RhbHM6XCIsIGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FsY3VsYXRlV2lzaGxpc3RUb3RhbHMoKSB7XHJcbiAgICBpZiAoIXRoaXMuZGF0YWJhc2UpIHJldHVybjtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHdpc2hsaXN0VHJhbnNhY3Rpb24gPSB0aGlzLmRhdGFiYXNlLnRyYW5zYWN0aW9uKHRoaXMuZmF2b3VyaXRlQ29sbGVjdGlvbk5hbWUsIFwicmVhZG9ubHlcIik7XHJcbiAgICAgIGNvbnN0IHdpc2hsaXN0UmVxdWVzdCA9IHdpc2hsaXN0VHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUodGhpcy5mYXZvdXJpdGVDb2xsZWN0aW9uTmFtZSkuZ2V0QWxsKCk7XHJcbiAgICAgIHdpc2hsaXN0UmVxdWVzdC5vbnN1Y2Nlc3MgPSAoZXZlbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZXZlbnQudGFyZ2V0LnJlc3VsdCB8fCBbXTtcclxuICAgICAgICB0aGlzLnRvdGFsV2lzaGxpc3RJdGVtcyA9IGl0ZW1zLmxlbmd0aDtcclxuICAgICAgfTtcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgY29uc29sZS53YXJuKFwiRXJyb3IgY2FsY3VsYXRpbmcgd2lzaGxpc3QgdG90YWxzOlwiLCBlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRhdGFiYXNlTmFtZTogc3RyaW5nID0gXCJVU0VSXCI7XHJcbiAgLy8gQnVtcGVkIDEgLT4gMiB0byBhZGQgdGhlIHR3byBib29raW5nLWNhcnQgc3RvcmVzIGJlbG93LiBJbmRleGVkREIgb25seSBjcmVhdGVzIG5ldyBvYmplY3RcclxuICAvLyBzdG9yZXMgaW5zaWRlIG9udXBncmFkZW5lZWRlZCwgd2hpY2ggb25seSBmaXJlcyBvbiBhIHZlcnNpb24gYnVtcCAtIHdpdGhvdXQgdGhpcywgdGhlIG5ld1xyXG4gIC8vIHN0b3JlcyB3b3VsZCBzaWxlbnRseSBuZXZlciBnZXQgY3JlYXRlZCBmb3IgYW55b25lIHdobyBhbHJlYWR5IGhhcyBhIHYxIGRhdGFiYXNlLlxyXG4gIGRhdGFiYXNlVmVyc2lvbjogbnVtYmVyID0gMjtcclxuICBjYXJ0Q29sbGVjdGlvbk5hbWU6IHN0cmluZyA9IFwiVVNFUl9DQVJUXCI7XHJcbiAgZmF2b3VyaXRlQ29sbGVjdGlvbk5hbWU6IHN0cmluZyA9IFwiVVNFUl9GQVZPVVJJVEVcIjtcclxuICB0cmlhbENhcnRDb2xsZWN0aW9uTmFtZTogc3RyaW5nID0gJ1RSSUFMX0NBUlQnXHJcbiAgdXNlckNvbGxlY3Rpb25OYW1lOiBzdHJpbmcgPSBcIlVTRVJcIjtcclxuICAvKipcclxuICAgKiBPbmUgYnVja2V0IHBlciBib29raW5nIG1vZGUgKEhvbWUgVmlzaXQgLyBWaWRlbyBDYWxsKSwgbG9jYWwtb25seSwgbm8gc2VydmVyIHN5bmMgLSB1bmxpa2VcclxuICAgKiBUUklBTF9DQVJULCB0aGUgbmV3IGdyb3VwL2NhcnQgYm9va2luZyBBUEkgdGFrZXMgcHJvZHVjdCBsaW5lcyBkaXJlY3RseSBpbiB0aGUgaG9sZCByZXF1ZXN0LFxyXG4gICAqIHNvIHRoZXJlJ3Mgbm8gc2VydmVyLXNpZGUgY2FydCB0byBrZWVwIHRoZXNlIGluIHN5bmMgd2l0aC4gS2VwdCBzZXBhcmF0ZSBmcm9tIGVhY2ggb3RoZXIgc29cclxuICAgKiBhIGN1c3RvbWVyIGNhbiBob2xkIGEgcGVuZGluZyBjYXJ0IGZvciBlYWNoIG1vZGUgYXQgb25jZS5cclxuICAgKi9cclxuICBob21lVmlzaXRDYXJ0Q29sbGVjdGlvbk5hbWU6IHN0cmluZyA9ICdIT01FX1ZJU0lUX0NBUlQnO1xyXG4gIHZpZGVvQ2FsbENhcnRDb2xsZWN0aW9uTmFtZTogc3RyaW5nID0gJ1ZJREVPX0NBTExfQ0FSVCc7XHJcbiAgZGF0YWJhc2UhOiBJREJEYXRhYmFzZTtcclxuXHJcbiAgY2FydENvbGxlY3Rpb25SZWY6IElEQk9iamVjdFN0b3JlIHwgbnVsbCA9IG51bGw7XHJcbiAgZmF2b3VyaXRlQ29sbGVjdGlvblJlZjogSURCT2JqZWN0U3RvcmUgfCBudWxsID0gbnVsbDtcclxuICB1c2VyQ29sbGVjdGlvblJlZjogSURCT2JqZWN0U3RvcmUgfCBudWxsID0gbnVsbDtcclxuICB0cmlhbENhcnRDb2xsZWN0aW9uUmVmOiBJREJPYmplY3RTdG9yZSB8IG51bGwgPSBudWxsO1xyXG5cclxuICBjcmVhdGVEYXRhQmFzZSgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuZGJSZWFkeSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuXHJcbiAgICAgIGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpICYmIHdpbmRvdy5pbmRleGVkREIpIHtcclxuICAgICAgICBjb25zdCByZXF1ZXN0OiBJREJPcGVuREJSZXF1ZXN0ID0gd2luZG93LmluZGV4ZWREQi5vcGVuKHRoaXMuZGF0YWJhc2VOYW1lLCB0aGlzLmRhdGFiYXNlVmVyc2lvbik7XHJcblxyXG4gICAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLnNob3dMb2FkaW5nU2NyZWVuLmVtaXQodHJ1ZSk7XHJcblxyXG4gICAgICAgIHJlcXVlc3Qub25lcnJvciA9ICgpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tJbmRleGVkREJdIEZhaWxlZCB0byBvcGVuIGRhdGFiYXNlJyk7XHJcbiAgICAgICAgICB0aGlzLmV2ZW50U2VydmljZS5zaG93TG9hZGluZ1NjcmVlbi5lbWl0KGZhbHNlKTtcclxuICAgICAgICAgIHJlamVjdCgpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHJlcXVlc3Qub25zdWNjZXNzID0gYXN5bmMgKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFiYXNlID0gKGV2ZW50LnRhcmdldCBhcyBJREJPcGVuREJSZXF1ZXN0KS5yZXN1bHQ7XHJcbiAgICAgICAgICB0aGlzLmV2ZW50U2VydmljZS5zaG93TG9hZGluZ1NjcmVlbi5lbWl0KGZhbHNlKTtcclxuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlQ2FydFRvdGFscygpO1xyXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVXaXNobGlzdFRvdGFscygpO1xyXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVCb29raW5nQ2FydFRvdGFscygpO1xyXG4gICAgICAgICAgcmVzb2x2ZSgpOyAvLyDinIUgVkVSWSBJTVBPUlRBTlRcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICByZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9IChldmVudCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXRhYmFzZSA9IChldmVudC50YXJnZXQgYXMgSURCT3BlbkRCUmVxdWVzdCkucmVzdWx0O1xyXG5cclxuICAgICAgICAgIGlmICghdGhpcy5kYXRhYmFzZS5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKHRoaXMuY2FydENvbGxlY3Rpb25OYW1lKSkge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlLmNyZWF0ZU9iamVjdFN0b3JlKHRoaXMuY2FydENvbGxlY3Rpb25OYW1lLCB7IGtleVBhdGg6IFwidmFyaWVudElkXCIgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoIXRoaXMuZGF0YWJhc2Uub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyh0aGlzLnRyaWFsQ2FydENvbGxlY3Rpb25OYW1lKSkge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlLmNyZWF0ZU9iamVjdFN0b3JlKHRoaXMudHJpYWxDYXJ0Q29sbGVjdGlvbk5hbWUsIHsga2V5UGF0aDogXCJ2YXJpZW50SWRcIiB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICghdGhpcy5kYXRhYmFzZS5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKHRoaXMuZmF2b3VyaXRlQ29sbGVjdGlvbk5hbWUpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UuY3JlYXRlT2JqZWN0U3RvcmUodGhpcy5mYXZvdXJpdGVDb2xsZWN0aW9uTmFtZSwgeyBrZXlQYXRoOiBcInZhcmllbnRJZFwiIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKCF0aGlzLmRhdGFiYXNlLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnModGhpcy51c2VyQ29sbGVjdGlvbk5hbWUpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YWJhc2UuY3JlYXRlT2JqZWN0U3RvcmUodGhpcy51c2VyQ29sbGVjdGlvbk5hbWUsIHsga2V5UGF0aDogXCJ1c2VySWRcIiB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICghdGhpcy5kYXRhYmFzZS5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKHRoaXMuaG9tZVZpc2l0Q2FydENvbGxlY3Rpb25OYW1lKSkge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGFiYXNlLmNyZWF0ZU9iamVjdFN0b3JlKHRoaXMuaG9tZVZpc2l0Q2FydENvbGxlY3Rpb25OYW1lLCB7IGtleVBhdGg6IFwidmFyaWVudElkXCIgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoIXRoaXMuZGF0YWJhc2Uub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyh0aGlzLnZpZGVvQ2FsbENhcnRDb2xsZWN0aW9uTmFtZSkpIHtcclxuICAgICAgICAgICAgdGhpcy5kYXRhYmFzZS5jcmVhdGVPYmplY3RTdG9yZSh0aGlzLnZpZGVvQ2FsbENhcnRDb2xsZWN0aW9uTmFtZSwgeyBrZXlQYXRoOiBcInZhcmllbnRJZFwiIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignW1NTUl0gSW5kZXhlZERCIG5vdCBhdmFpbGFibGUnKTtcclxuICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5kYlJlYWR5O1xyXG4gIH1cclxuXHJcbiAgc2V0VG9rZW4odG9rZW46IGFueSkge1xyXG4gICAgdGhpcy5jb29raWVTZXJ2aWNlLnNldChcInBhc3NCb29rVG9rZW5cIiwgdG9rZW4pXHJcbiAgICAvLyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcInBhc3NCb29rVG9rZW5cIiwgdG9rZW4pO1xyXG4gICAgdGhpcy5zdG9yYWdlLnNldEl0ZW0oXCJwYXNzQm9va1Rva2VuXCIsIHRva2VuKTtcclxuICB9XHJcblxyXG4gIGdldFRva2VuKCkge1xyXG4gICAgbGV0IHRva2VuOiBhbnkgPSB0aGlzLmNvb2tpZVNlcnZpY2UuZ2V0KCdwYXNzQm9va1Rva2VuJylcclxuICAgIGlmICghdG9rZW4pXHJcbiAgICAgIHRva2VuID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0oJ3Bhc3NCb29rVG9rZW4nKSB8fCBcIlwiXHJcbiAgICByZXR1cm4gdG9rZW47XHJcbiAgfVxyXG5cclxuXHJcbiAgc2V0UmVmZXJyYWxEZXRhaWxzKGRldGFpbHM6IGFueSkge1xyXG4gICAgdGhpcy5jb29raWVTZXJ2aWNlLnNldChcInJlZmVycmFsRGV0YWlsc1wiLCBKU09OLnN0cmluZ2lmeShkZXRhaWxzKSlcclxuICAgIHRoaXMuc3RvcmFnZS5zZXRJdGVtKFwicmVmZXJyYWxEZXRhaWxzXCIsIEpTT04uc3RyaW5naWZ5KGRldGFpbHMpKTtcclxuICB9XHJcblxyXG4gIGdldFJlZmVycmFsRGV0YWlscygpIHtcclxuICAgIGxldCByZWZlcnJhbERldGFpbHM6IGFueSA9IHRoaXMuY29va2llU2VydmljZS5nZXQoJ3JlZmVycmFsRGV0YWlscycpXHJcbiAgICBpZiAoIXJlZmVycmFsRGV0YWlscykge1xyXG4gICAgICByZWZlcnJhbERldGFpbHMgPSB0aGlzLnN0b3JhZ2UuZ2V0SXRlbShcInJlZmVycmFsRGV0YWlsc1wiKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZWZlcnJhbERldGFpbHM7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVBbGxEYXRhKCkge1xyXG4gICAgaWYgKHRoaXMucm91dGVyLnVybC5pbmNsdWRlcygnY2FydCcpKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgY29uc3QgdXNlckRldGFpbHMgPSB0aGlzLmdldFVzZXIoKTtcclxuICAgIGlmICghIXVzZXJEZXRhaWxzKSB7XHJcbiAgICAgIHRoaXMuZXZlbnRTZXJ2aWNlLnNob3dMb2FkaW5nU2NyZWVuLmVtaXQodHJ1ZSk7XHJcbiAgICAgIGNvbnN0IHJlcXVlc3QgPSBmb3JrSm9pbihbXHJcbiAgICAgICAgdGhpcy5yZXN0U2VydmljZS5nZXRVc2VySXRlbXModXNlckRldGFpbHMudXNlcklkLCBcIkNBUlRcIiksXHJcbiAgICAgICAgdGhpcy5yZXN0U2VydmljZS5nZXRVc2VySXRlbXModXNlckRldGFpbHMudXNlcklkLCBcIldJU0hMSVNUXCIpXHJcbiAgICAgIF0pO1xyXG4gICAgICByZXF1ZXN0LnN1YnNjcmliZSgoY2FydFJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCB1c2VyRGV0YWlscyA9IHRoaXMuZ2V0VXNlcigpIGFzIFVzZXI7XHJcbiAgICAgICAgY29uc3QgdXNlckNhcnQ6IENhcnQgPSBjYXJ0UmVzcG9uc2U/LlswXS5kYXRhWzBdID8gY2FydFJlc3BvbnNlPy5bMF0uZGF0YVswXSBhcyBDYXJ0IDogbmV3IENhcnQoeyAnY2FydFR5cGUnOiBjYXJ0VHlwZS5DQVJULCAndXNlckRldGFpbHMnOiB1c2VyRGV0YWlscywgJ3BsYXRmb3JtJzogJ1dFQicgfSk7XHJcblxyXG4gICAgICAgIGlmICh1c2VyQ2FydD8uY2FydElkKVxyXG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJjYXJ0SWRcIiwgdXNlckNhcnQ/LmNhcnRJZCk7XHJcbiAgICAgICAgdGhpcy5nZXRVc2VyQ2FydCgpLnRoZW4oKHVzZXJDYXJ0UmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIHVzZXJDYXJ0UmVzcG9uc2Uub25zdWNjZXNzID0gKHVzZXJDYXJ0SW5kZXhEQjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHVzZXJDYXJ0Lm9yZGVyZWRJdGVtcyA9IHRoaXMubWVyZ2VBbGxJdGVtcyh1c2VyQ2FydEluZGV4REIudGFyZ2V0LnJlc3VsdCA/PyBbXSwgdXNlckNhcnQ/Lm9yZGVyZWRJdGVtcyA/PyBbXSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmFkZEFsbFByb2R1Y3RzVG9DYXJ0KHVzZXJDYXJ0Lm9yZGVyZWRJdGVtcyk7XHJcbiAgICAgICAgICAgIC8vIHRoaXMucmVzdFNlcnZpY2UuYWRkSXRlbVRvREIodXNlckNhcnQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgLy8gICBpZihyZXM/LmRhdGE/LmNhcnRJZCAmJiAhbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhcnRJZCcpKVxyXG4gICAgICAgICAgICAvLyAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2NhcnRJZCcsIHJlcy5kYXRhLmNhcnRJZCk7XHJcbiAgICAgICAgICAgIC8vIH0pXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuXHJcbiAgICAgICAgY29uc3QgdXNlcldpc2hsaXN0OiBDYXJ0ID0gY2FydFJlc3BvbnNlPy5bMV0uZGF0YSBhcyBDYXJ0O1xyXG4gICAgICAgIGlmICh1c2VyV2lzaGxpc3QuY2FydElkKVxyXG4gICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJ3aXNobGlzdElkXCIsIHVzZXJXaXNobGlzdC5jYXJ0SWQpO1xyXG4gICAgICAgIHRoaXMuZ2V0VXNlcldoaXNobGlzdCgpLnRoZW4oKHVzZXJXaXNobGlzdFJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICB1c2VyV2lzaGxpc3RSZXNwb25zZS5vbnN1Y2Nlc3MgPSAodXNlcldpc2hsaXN0SW5kZXhEQjogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHVzZXJXaXNobGlzdC5vcmRlcmVkSXRlbXMgPSBbLi4uKHVzZXJXaXNobGlzdEluZGV4REIudGFyZ2V0LnJlc3VsdCA/PyBbXSksIC4uLih1c2VyV2lzaGxpc3Qub3JkZXJlZEl0ZW1zID8/IFtdKV07XHJcbiAgICAgICAgICAgIHRoaXMuYWRkQWxsUHJvZHVjdFRvV2lzaGxpc3QodXNlcldpc2hsaXN0Lm9yZGVyZWRJdGVtcyk7XHJcbiAgICAgICAgICAgIHRoaXMucmVzdFNlcnZpY2UuYWRkSXRlbVRvREIodXNlcldpc2hsaXN0KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICB0aGlzLmV2ZW50U2VydmljZS5zaG93TG9hZGluZ1NjcmVlbi5lbWl0KGZhbHNlKTtcclxuICAgICAgfSlcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIHRoaXMuc3RvcmVEYXRhVG9KU09OKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBtZXJnZUFsbEl0ZW1zKHVuU3luY2VkSXRlbTogYW55W10sIHN5bmNlZEl0ZW06IGFueVtdKSB7XHJcbiAgICBmb3IgKGxldCBwcm9kdWN0IG9mIHN5bmNlZEl0ZW0pIHtcclxuICAgICAgbGV0IGl0ZW1Gb3VuZCA9IGZhbHNlO1xyXG4gICAgICBmb3IgKGxldCBjYXJ0SXRlbSBvZiB1blN5bmNlZEl0ZW0pIHtcclxuICAgICAgICBpZiAoY2FydEl0ZW0udmFyaWVudElkID09PSBwcm9kdWN0LnZhcmllbnRJZCkge1xyXG4gICAgICAgICAgaXRlbUZvdW5kID0gdHJ1ZTtcclxuICAgICAgICAgIC8vIGNhcnRJdGVtLnF1YW50aXR5ID0gcHJvZHVjdC5xdWFudGl0eTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFpdGVtRm91bmQpIHtcclxuICAgICAgICB1blN5bmNlZEl0ZW0ucHVzaChwcm9kdWN0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVuU3luY2VkSXRlbTtcclxuICB9XHJcblxyXG4gIC8vIENBUlQgU0VSVklDRVxyXG4gIGFzeW5jIGdldFVzZXJDYXJ0KCk6IFByb21pc2U8SURCUmVxdWVzdDxPcmRlcmVkSXRlbXNbXT4+IHtcclxuICAgIGF3YWl0IHRoaXMuZGJSZWFkeTtcclxuXHJcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGF0YWJhc2U/LnRyYW5zYWN0aW9uKHRoaXMuY2FydENvbGxlY3Rpb25OYW1lID8/IFwiVVNFUl9DQVJUXCIsIFwicmVhZHdyaXRlXCIpO1xyXG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHRoaXMuY2FydENvbGxlY3Rpb25OYW1lKS5nZXRBbGwoKTtcclxuICB9XHJcblxyXG4gIGFkZFByb2R1Y3RUb0NhcnQocHJvZHVjdDogT3JkZXJlZEl0ZW1zKSB7XHJcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGF0YWJhc2U/LnRyYW5zYWN0aW9uKHRoaXMuY2FydENvbGxlY3Rpb25OYW1lID8/IFwiVVNFUl9DQVJUXCIsIFwicmVhZHdyaXRlXCIpO1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHRoaXMuY2FydENvbGxlY3Rpb25OYW1lKS5wdXQocHJvZHVjdCk7XHJcbiAgICB0cmFuc2FjdGlvbi5vbmNvbXBsZXRlID0gKCkgPT4ge1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZUNhcnRUb3RhbHMoKTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gcmVxdWVzdDtcclxuICB9XHJcblxyXG4gIGFkZEFsbFByb2R1Y3RUb1dpc2hsaXN0KHByb2R1Y3RzOiBPcmRlcmVkSXRlbXNbXSk6IElEQlRyYW5zYWN0aW9uIHtcclxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYXRhYmFzZT8udHJhbnNhY3Rpb24odGhpcy5mYXZvdXJpdGVDb2xsZWN0aW9uTmFtZSA/PyBcIlVTRVJfRkFWT1VSSVRFXCIsIFwicmVhZHdyaXRlXCIpO1xyXG4gICAgcHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdCkgPT4ge1xyXG4gICAgICB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZSh0aGlzLmZhdm91cml0ZUNvbGxlY3Rpb25OYW1lKS5wdXQocHJvZHVjdCk7XHJcbiAgICB9KVxyXG4gICAgdHJhbnNhY3Rpb24ub25jb21wbGV0ZSA9ICgpID0+IHtcclxuICAgICAgdGhpcy5jYWxjdWxhdGVXaXNobGlzdFRvdGFscygpO1xyXG4gICAgfTtcclxuICAgIHJldHVybiB0cmFuc2FjdGlvbjtcclxuICB9XHJcbiAgYWRkQWxsUHJvZHVjdHNUb0NhcnQocHJvZHVjdHM6IE9yZGVyZWRJdGVtc1tdKTogSURCVHJhbnNhY3Rpb24ge1xyXG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRhdGFiYXNlPy50cmFuc2FjdGlvbih0aGlzLmNhcnRDb2xsZWN0aW9uTmFtZSA/PyBcIlVTRVJfQ0FSVFwiLCBcInJlYWR3cml0ZVwiKTtcclxuICAgIHByb2R1Y3RzLmZvckVhY2goKHByb2R1Y3QpID0+IHtcclxuICAgICAgdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUodGhpcy5jYXJ0Q29sbGVjdGlvbk5hbWUpLnB1dChwcm9kdWN0KTtcclxuICAgIH0pXHJcbiAgICB0cmFuc2FjdGlvbi5vbmNvbXBsZXRlID0gKCkgPT4ge1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZUNhcnRUb3RhbHMoKTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gdHJhbnNhY3Rpb247XHJcbiAgfVxyXG4gIHJlbW92ZVByb2R1Y3RGcm9tQ2FydChwcm9kdWN0SWQ6IHN0cmluZykge1xyXG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRhdGFiYXNlPy50cmFuc2FjdGlvbih0aGlzLmNhcnRDb2xsZWN0aW9uTmFtZSA/PyBcIlVTRVJfQ0FSVFwiLCBcInJlYWR3cml0ZVwiKTtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZSh0aGlzLmNhcnRDb2xsZWN0aW9uTmFtZSkuZGVsZXRlKHByb2R1Y3RJZCk7XHJcbiAgICB0cmFuc2FjdGlvbi5vbmNvbXBsZXRlID0gKCkgPT4ge1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZUNhcnRUb3RhbHMoKTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gcmVxdWVzdDtcclxuICB9XHJcbiAgYXN5bmMgZ2V0UHJvZHVjdEZyb21DYXJ0KHByb2R1Y3RJZDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGF0YWJhc2U/LnRyYW5zYWN0aW9uKHRoaXMuY2FydENvbGxlY3Rpb25OYW1lID8/IFwiVVNFUl9DQVJUXCIsIFwicmVhZHdyaXRlXCIpO1xyXG4gICAgcmV0dXJuIGF3YWl0IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHRoaXMuY2FydENvbGxlY3Rpb25OYW1lKS5nZXQocHJvZHVjdElkKTtcclxuICB9XHJcblxyXG4gIC8vIFdJU0hMSVNUIFNFUlZJQ0VcclxuICBhc3luYyBnZXRVc2VyV2hpc2hsaXN0KCk6IFByb21pc2U8SURCUmVxdWVzdDxPcmRlcmVkSXRlbXNbXT4+IHtcclxuXHJcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGF0YWJhc2UudHJhbnNhY3Rpb24odGhpcy5mYXZvdXJpdGVDb2xsZWN0aW9uTmFtZSwgXCJyZWFkd3JpdGVcIik7XHJcbiAgICByZXR1cm4gYXdhaXQgdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUodGhpcy5mYXZvdXJpdGVDb2xsZWN0aW9uTmFtZSkuZ2V0QWxsKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRUcmlhbENhcnQoKTogUHJvbWlzZTxJREJSZXF1ZXN0PE9yZGVyZWRJdGVtc1tdPj4ge1xyXG5cclxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYXRhYmFzZS50cmFuc2FjdGlvbih0aGlzLnRyaWFsQ2FydENvbGxlY3Rpb25OYW1lLCBcInJlYWR3cml0ZVwiKTtcclxuICAgIHJldHVybiBhd2FpdCB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZSh0aGlzLnRyaWFsQ2FydENvbGxlY3Rpb25OYW1lKS5nZXRBbGwoKTtcclxuICB9XHJcblxyXG4gIGFkZFByb2R1Y3RUb1dpc2hsaXN0KHByb2R1Y3Q6IE9yZGVyZWRJdGVtcykge1xyXG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRhdGFiYXNlLnRyYW5zYWN0aW9uKHRoaXMuZmF2b3VyaXRlQ29sbGVjdGlvbk5hbWUsIFwicmVhZHdyaXRlXCIpO1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHRoaXMuZmF2b3VyaXRlQ29sbGVjdGlvbk5hbWUpLnB1dChwcm9kdWN0KTtcclxuICAgIHRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSAoKSA9PiB7XHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlV2lzaGxpc3RUb3RhbHMoKTtcclxuICAgIH07XHJcbiAgICByZXR1cm4gcmVxdWVzdDtcclxuICB9XHJcbiAgYWRkUHJvZHVjdFRvVHJpYWwocHJvZHVjdDogT3JkZXJlZEl0ZW1zKSB7XHJcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGF0YWJhc2UudHJhbnNhY3Rpb24odGhpcy50cmlhbENhcnRDb2xsZWN0aW9uTmFtZSwgXCJyZWFkd3JpdGVcIik7XHJcbiAgICByZXR1cm4gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUodGhpcy50cmlhbENhcnRDb2xsZWN0aW9uTmFtZSkucHV0KHByb2R1Y3QpO1xyXG4gIH1cclxuICByZW1vdmVQcm9kdWN0RnJvbVdpc2hsaXN0KHByb2R1Y3RJZDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGF0YWJhc2UudHJhbnNhY3Rpb24odGhpcy5mYXZvdXJpdGVDb2xsZWN0aW9uTmFtZSwgXCJyZWFkd3JpdGVcIik7XHJcbiAgICBjb25zdCByZXF1ZXN0ID0gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUodGhpcy5mYXZvdXJpdGVDb2xsZWN0aW9uTmFtZSkuZGVsZXRlKHByb2R1Y3RJZCk7XHJcbiAgICB0cmFuc2FjdGlvbi5vbmNvbXBsZXRlID0gKCkgPT4ge1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZVdpc2hsaXN0VG90YWxzKCk7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHJlcXVlc3Q7XHJcbiAgfVxyXG5cclxuICBjbGVhclVzZXJDYXJ0KCkge1xyXG4gICAgY29uc3QgdHJhbnNhY3Rpb24gPSB0aGlzLmRhdGFiYXNlPy50cmFuc2FjdGlvbih0aGlzLmNhcnRDb2xsZWN0aW9uTmFtZSA/PyBcIlVTRVJfQ0FSVFwiLCBcInJlYWR3cml0ZVwiKTtcclxuICAgIGNvbnN0IHJlcXVlc3QgPSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZSh0aGlzLmNhcnRDb2xsZWN0aW9uTmFtZSkuY2xlYXIoKTtcclxuICAgIHRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSAoKSA9PiB7XHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlQ2FydFRvdGFscygpO1xyXG4gICAgfTtcclxuICAgIHJldHVybiByZXF1ZXN0O1xyXG4gIH1cclxuXHJcbiAgY2xlYXJUcmlhbENhcnQoKSB7XHJcbiAgICB0aGlzLnRvdGFsQ2FydEl0ZW1zID0gMDtcclxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYXRhYmFzZT8udHJhbnNhY3Rpb24odGhpcy50cmlhbENhcnRDb2xsZWN0aW9uTmFtZSwgXCJyZWFkd3JpdGVcIik7XHJcbiAgICByZXR1cm4gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUodGhpcy50cmlhbENhcnRDb2xsZWN0aW9uTmFtZSkuY2xlYXIoKTtcclxuICB9XHJcblxyXG4gIHJlbW92ZVByb2R1Y3RGcm9tVHJpYWxDYXJ0KHByb2R1Y3RJZDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGF0YWJhc2UudHJhbnNhY3Rpb24odGhpcy50cmlhbENhcnRDb2xsZWN0aW9uTmFtZSwgXCJyZWFkd3JpdGVcIik7XHJcbiAgICByZXR1cm4gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUodGhpcy50cmlhbENhcnRDb2xsZWN0aW9uTmFtZSkuZGVsZXRlKHByb2R1Y3RJZCk7XHJcbiAgfVxyXG5cclxuICAvLyBCT09LSU5HIFBST0RVQ1QgQ0FSVFMgKEhvbWUgVmlzaXQgLyBWaWRlbyBDYWxsKSDigJQgbG9jYWwtb25seSwgc2VlIGZpZWxkIGNvbW1lbnRzIGFib3ZlLlxyXG4gIHByaXZhdGUgYm9va2luZ0NhcnRTdG9yZU5hbWUobW9kZTogJ0hPTUVfVklTSVQnIHwgJ1ZJREVPX0NBTEwnKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBtb2RlID09PSAnSE9NRV9WSVNJVCcgPyB0aGlzLmhvbWVWaXNpdENhcnRDb2xsZWN0aW9uTmFtZSA6IHRoaXMudmlkZW9DYWxsQ2FydENvbGxlY3Rpb25OYW1lO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgZ2V0Qm9va2luZ0NhcnQobW9kZTogJ0hPTUVfVklTSVQnIHwgJ1ZJREVPX0NBTEwnKTogUHJvbWlzZTxJREJSZXF1ZXN0PE9yZGVyZWRJdGVtc1tdPj4ge1xyXG4gICAgYXdhaXQgdGhpcy5kYlJlYWR5O1xyXG4gICAgY29uc3Qgc3RvcmVOYW1lID0gdGhpcy5ib29raW5nQ2FydFN0b3JlTmFtZShtb2RlKTtcclxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYXRhYmFzZS50cmFuc2FjdGlvbihzdG9yZU5hbWUsIFwicmVhZHdyaXRlXCIpO1xyXG4gICAgcmV0dXJuIHRyYW5zYWN0aW9uLm9iamVjdFN0b3JlKHN0b3JlTmFtZSkuZ2V0QWxsKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBhZGRQcm9kdWN0VG9Cb29raW5nQ2FydChtb2RlOiAnSE9NRV9WSVNJVCcgfCAnVklERU9fQ0FMTCcsIHByb2R1Y3Q6IE9yZGVyZWRJdGVtcykge1xyXG4gICAgYXdhaXQgdGhpcy5kYlJlYWR5O1xyXG4gICAgY29uc3Qgc3RvcmVOYW1lID0gdGhpcy5ib29raW5nQ2FydFN0b3JlTmFtZShtb2RlKTtcclxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYXRhYmFzZS50cmFuc2FjdGlvbihzdG9yZU5hbWUsIFwicmVhZHdyaXRlXCIpO1xyXG4gICAgdHJhbnNhY3Rpb24ub25jb21wbGV0ZSA9ICgpID0+IHRoaXMuY2FsY3VsYXRlQm9va2luZ0NhcnRUb3RhbHMoKTtcclxuICAgIHJldHVybiB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzdG9yZU5hbWUpLnB1dChwcm9kdWN0KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHJlbW92ZVByb2R1Y3RGcm9tQm9va2luZ0NhcnQobW9kZTogJ0hPTUVfVklTSVQnIHwgJ1ZJREVPX0NBTEwnLCBwcm9kdWN0SWQ6IHN0cmluZykge1xyXG4gICAgYXdhaXQgdGhpcy5kYlJlYWR5O1xyXG4gICAgY29uc3Qgc3RvcmVOYW1lID0gdGhpcy5ib29raW5nQ2FydFN0b3JlTmFtZShtb2RlKTtcclxuICAgIGNvbnN0IHRyYW5zYWN0aW9uID0gdGhpcy5kYXRhYmFzZS50cmFuc2FjdGlvbihzdG9yZU5hbWUsIFwicmVhZHdyaXRlXCIpO1xyXG4gICAgdHJhbnNhY3Rpb24ub25jb21wbGV0ZSA9ICgpID0+IHRoaXMuY2FsY3VsYXRlQm9va2luZ0NhcnRUb3RhbHMoKTtcclxuICAgIHJldHVybiB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZShzdG9yZU5hbWUpLmRlbGV0ZShwcm9kdWN0SWQpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgY2xlYXJCb29raW5nQ2FydChtb2RlOiAnSE9NRV9WSVNJVCcgfCAnVklERU9fQ0FMTCcpIHtcclxuICAgIGF3YWl0IHRoaXMuZGJSZWFkeTtcclxuICAgIGNvbnN0IHN0b3JlTmFtZSA9IHRoaXMuYm9va2luZ0NhcnRTdG9yZU5hbWUobW9kZSk7XHJcbiAgICBjb25zdCB0cmFuc2FjdGlvbiA9IHRoaXMuZGF0YWJhc2UudHJhbnNhY3Rpb24oc3RvcmVOYW1lLCBcInJlYWR3cml0ZVwiKTtcclxuICAgIHRyYW5zYWN0aW9uLm9uY29tcGxldGUgPSAoKSA9PiB0aGlzLmNhbGN1bGF0ZUJvb2tpbmdDYXJ0VG90YWxzKCk7XHJcbiAgICByZXR1cm4gdHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoc3RvcmVOYW1lKS5jbGVhcigpO1xyXG4gIH1cclxuXHJcbiAgLy8gVVNFUiBTRVJWSUNFXHJcbiAgc2V0VXNlcih1c2VyOiBVc2VyKTogVXNlciB7XHJcbiAgICB0aGlzLmNvb2tpZVNlcnZpY2Uuc2V0KFwidXNlclwiLCBKU09OLnN0cmluZ2lmeSh1c2VyID8/IFwie31cIiksIDcpO1xyXG4gICAgLy8gbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJ1c2VyXCIsIEpTT04uc3RyaW5naWZ5KHVzZXIgPz8gXCJ7fVwiKSk7XHJcbiAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbShcInVzZXJcIiwgSlNPTi5zdHJpbmdpZnkodXNlciA/PyBcInt9XCIpKTtcclxuICAgIHJldHVybiB1c2VyO1xyXG4gIH1cclxuICBnZXRVc2VyKCk6IFVzZXIgfCBudWxsIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGxldCB1c2VyU3RyID0gdGhpcy5jb29raWVTZXJ2aWNlLmdldChcInVzZXJcIik7XHJcbiAgICAgIGlmICghdXNlclN0cikge1xyXG4gICAgICAgIHVzZXJTdHIgPSB0aGlzLnN0b3JhZ2UuZ2V0SXRlbShcInVzZXJcIikgfHwgXCJcIjsgLy8g4pyFIGZhbGxiYWNrXHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF1c2VyU3RyKSByZXR1cm4gbnVsbDtcclxuICAgICAgY29uc3QgdXNlcjogVXNlciA9IEpTT04ucGFyc2UodXNlclN0cik7XHJcbiAgICAgIGlmICghdXNlcj8udXNlcklkKSByZXR1cm4gbnVsbDtcclxuICAgICAgdGhpcy5zdG9yYWdlLnNldEl0ZW0oXCJwZXJJZFwiLCB1c2VyLnVzZXJJZCk7XHJcbiAgICAgIHJldHVybiB1c2VyO1xyXG5cclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTdGFibGUgcGVyLWJyb3dzZXIgaWQsIHBlcnNpc3RlZCByZWdhcmRsZXNzIG9mIGxvZ2luIHN0YXRlLCBzbyBiZWhhdmlvciBjYW4gYmUgdHJhY2tlZFxyXG4gICAqIGJlZm9yZSBhIHZpc2l0b3IgbG9ncyBpbi4gTWlycm9ycyBzZXRVc2VyKCkncyBkdWFsIGNvb2tpZStzdG9yYWdlIHdyaXRlIHNvIGl0IHN1cnZpdmVzXHJcbiAgICogdGhlIHNhbWUgd2F5LiBNZXJnZWQgb250byB0aGUgcmVhbCB1c2VySWQgc2VydmVyLXNpZGUgb25jZSB0aGV5IGxvZyBpbiAoQW5hbHl0aWNzU2VydmljZS5tZXJnZUFub255bW91c1VzZXIpLlxyXG4gICAqL1xyXG4gIGdldEFub255bW91c0lkKCk6IHN0cmluZyB7XHJcbiAgICBsZXQgYW5vbklkID0gdGhpcy5jb29raWVTZXJ2aWNlLmdldChcImFub25JZFwiKSB8fCB0aGlzLnN0b3JhZ2UuZ2V0SXRlbShcImFub25JZFwiKTtcclxuICAgIGlmICghYW5vbklkKSB7XHJcbiAgICAgIGFub25JZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7XHJcbiAgICAgIHRoaXMuY29va2llU2VydmljZS5zZXQoXCJhbm9uSWRcIiwgYW5vbklkLCAzNjUpO1xyXG4gICAgICB0aGlzLnN0b3JhZ2Uuc2V0SXRlbShcImFub25JZFwiLCBhbm9uSWQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFub25JZDtcclxuICB9XHJcblxyXG59XHJcbiJdfQ==