velocious 1.0.663 → 1.0.664

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.
Files changed (50) hide show
  1. package/README.md +2 -2
  2. package/build/background-jobs/client.js +36 -6
  3. package/build/configuration-types.js +3 -3
  4. package/build/database/query/alter-table-base.js +11 -1
  5. package/build/src/background-jobs/client.d.ts.map +1 -1
  6. package/build/src/background-jobs/client.js +35 -6
  7. package/build/src/configuration-types.d.ts +8 -4
  8. package/build/src/configuration-types.d.ts.map +1 -1
  9. package/build/src/configuration-types.js +4 -4
  10. package/build/src/database/query/alter-table-base.d.ts.map +1 -1
  11. package/build/src/database/query/alter-table-base.js +12 -2
  12. package/build/src/sync/sync-api-client.d.ts +36 -10
  13. package/build/src/sync/sync-api-client.d.ts.map +1 -1
  14. package/build/src/sync/sync-api-client.js +58 -14
  15. package/build/src/sync/sync-client-types.d.ts +41 -2
  16. package/build/src/sync/sync-client-types.d.ts.map +1 -1
  17. package/build/src/sync/sync-client-types.js +20 -3
  18. package/build/src/sync/sync-client.d.ts +112 -3
  19. package/build/src/sync/sync-client.d.ts.map +1 -1
  20. package/build/src/sync/sync-client.js +306 -60
  21. package/build/src/sync/sync-publisher-types.d.ts +36 -3
  22. package/build/src/sync/sync-publisher-types.d.ts.map +1 -1
  23. package/build/src/sync/sync-publisher-types.js +16 -2
  24. package/build/src/sync/sync-publisher.d.ts +12 -0
  25. package/build/src/sync/sync-publisher.d.ts.map +1 -1
  26. package/build/src/sync/sync-publisher.js +68 -4
  27. package/build/src/sync/sync-realtime-bridge.d.ts +11 -5
  28. package/build/src/sync/sync-realtime-bridge.d.ts.map +1 -1
  29. package/build/src/sync/sync-realtime-bridge.js +37 -13
  30. package/build/src/sync/sync-scope-store.d.ts +32 -0
  31. package/build/src/sync/sync-scope-store.d.ts.map +1 -1
  32. package/build/src/sync/sync-scope-store.js +74 -4
  33. package/build/sync/sync-api-client.js +58 -13
  34. package/build/sync/sync-client-types.js +22 -2
  35. package/build/sync/sync-client.js +333 -63
  36. package/build/sync/sync-publisher-types.js +17 -1
  37. package/build/sync/sync-publisher.js +79 -3
  38. package/build/sync/sync-realtime-bridge.js +37 -12
  39. package/build/sync/sync-scope-store.js +79 -3
  40. package/package.json +1 -1
  41. package/src/background-jobs/client.js +36 -6
  42. package/src/configuration-types.js +3 -3
  43. package/src/database/query/alter-table-base.js +11 -1
  44. package/src/sync/sync-api-client.js +58 -13
  45. package/src/sync/sync-client-types.js +22 -2
  46. package/src/sync/sync-client.js +333 -63
  47. package/src/sync/sync-publisher-types.js +17 -1
  48. package/src/sync/sync-publisher.js +79 -3
  49. package/src/sync/sync-realtime-bridge.js +37 -12
  50. package/src/sync/sync-scope-store.js +79 -3
@@ -65,15 +65,18 @@ export default class SyncApiClient {
65
65
  * @param {string} args.authenticationToken - Authentication token.
66
66
  * @param {number} [args.batchSize] - Batch size.
67
67
  * @param {import("./sync-client-types.js").SyncClientConflictTrackingConfig} args.conflictTracking - Tracking configuration.
68
- * @param {(payload: {authenticationToken: string, syncs: Array<Record<string, ReturnType<typeof JSON.parse>>>}) => Promise<SyncReplayResponse>} args.postReplay - Transport boundary.
68
+ * @param {(payload: {authenticationToken: string, syncs: Array<Record<string, ReturnType<typeof JSON.parse>>>}, options?: {signal?: AbortSignal}) => Promise<SyncReplayResponse>} args.postReplay - Transport boundary.
69
69
  * @param {(identity: string) => number} args.remoteGeneration - Current remote generation.
70
70
  * @param {string} args.resourceType - Resource whose log records should drain.
71
+ * @param {AbortSignal} [args.signal] - Lifecycle cancellation signal.
71
72
  * @returns {Promise<void>} Resolves when no ready intent remains.
72
73
  */
73
- static async replayConflictTrackedSyncs({ authenticationToken, batchSize, conflictTracking, postReplay, remoteGeneration, resourceType }) {
74
+ static async replayConflictTrackedSyncs({ authenticationToken, batchSize, conflictTracking, postReplay, remoteGeneration, resourceType, signal }) {
74
75
  const maxBatchSize = this.normalizedBatchSize(batchSize);
75
76
  while (true) {
77
+ throwIfSyncAborted(signal);
76
78
  const records = await conflictTracking.mutationLog.records();
79
+ throwIfSyncAborted(signal);
77
80
  const statuses = new Map(records.map((record) => [record.mutation.clientMutationId, record.status]));
78
81
  const pending = records.filter((record) => record.status === "pending" && record.mutation.model === resourceType);
79
82
  const ready = pending.filter((record) => record.dependencies.every((dependency) => statuses.get(dependency.clientMutationId) === "synced"));
@@ -84,10 +87,12 @@ export default class SyncApiClient {
84
87
  const response = await postReplay({
85
88
  authenticationToken,
86
89
  syncs: groups.map((group) => this.conflictReplayPayload(group))
87
- });
90
+ }, { signal });
91
+ throwIfSyncAborted(signal);
88
92
  this.ensureSuccessfulResponse(response);
89
93
  const responsesById = new Map((response.syncs || []).map((result) => [String(result.id), result]));
90
94
  for (const group of groups) {
95
+ throwIfSyncAborted(signal);
91
96
  const result = responsesById.get(group[0].mutation.clientMutationId);
92
97
  if (!result)
93
98
  throw new Error(`Sync response missing result for mutation ${group[0].mutation.clientMutationId}`);
@@ -96,11 +101,13 @@ export default class SyncApiClient {
96
101
  }
97
102
  for (const record of group) {
98
103
  await applySyncReplayResultToLocalMutationLog({ mutationLog: conflictTracking.mutationLog, record, result: /** @type {Record<string, ReturnType<typeof JSON.parse>>} */ (result) });
104
+ throwIfSyncAborted(signal);
99
105
  }
100
106
  if (["successful", "duplicate"].includes(result.syncState) && result.serverVersion !== undefined) {
101
107
  const identity = this.conflictRecordIdentity(group[0]);
102
108
  if (remoteGeneration(identity) === generations.get(group[0].mutation.clientMutationId)) {
103
109
  await this.rebaseConflictSuccessor({ conflictTracking, predecessor: group[group.length - 1], serverVersion: result.serverVersion });
110
+ throwIfSyncAborted(signal);
104
111
  }
105
112
  }
106
113
  }
@@ -237,6 +244,7 @@ export default class SyncApiClient {
237
244
  * @param {(payload: SyncChangesRequest) => Promise<SyncChangesResponse>} args.postChanges - Posts one changes request.
238
245
  * @param {Record<string, SyncResourceConfig>} args.resources - Resource policies.
239
246
  * @param {(progress: import("./sync-api-client-types.js").SyncPullProgress) => void} [args.onProgress] - Progress callback.
247
+ * @param {AbortSignal} [args.signal] - Lifecycle cancellation signal.
240
248
  * @returns {Promise<SyncChangesResult>} Pull result.
241
249
  */
242
250
  static async pullChangesWithCursor(args) {
@@ -247,7 +255,8 @@ export default class SyncApiClient {
247
255
  saveCursor: async (cursor) => await this.saveSyncCursor({ cursor, cursorKey: args.cursorKey, cursorModel: args.cursorModel }),
248
256
  postChanges: args.postChanges,
249
257
  applySync: this.resourceApplier(args.resources),
250
- onProgress: args.onProgress
258
+ onProgress: args.onProgress,
259
+ signal: args.signal
251
260
  });
252
261
  }
253
262
  /**
@@ -281,12 +290,14 @@ export default class SyncApiClient {
281
290
  * @param {number} [args.batchSize] - Max syncs per request. Defaults to 100.
282
291
  * @param {() => Promise<SyncCursor | string | null | undefined>} args.loadCursor - Loads the persisted local cursor.
283
292
  * @param {(cursor: SyncCursor) => Promise<void>} args.saveCursor - Persists the final acknowledged cursor.
284
- * @param {(payload: SyncChangesRequest) => Promise<SyncChangesResponse>} args.postChanges - Posts one changes request.
293
+ * @param {(payload: SyncChangesRequest, options?: {signal?: AbortSignal}) => Promise<SyncChangesResponse>} args.postChanges - Posts one changes request.
285
294
  * @param {(sync: SyncChangeEnvelope) => Promise<SyncChangeApplyResult>} args.applySync - Applies one normalized sync row locally.
286
295
  * @param {(progress: import("./sync-api-client-types.js").SyncPullProgress) => void} [args.onProgress] - Progress callback invoked per applied page (and once for an empty pull) with the applied counts and the stable server total.
296
+ * @param {AbortSignal} [args.signal] - Lifecycle cancellation signal.
287
297
  * @returns {Promise<SyncChangesResult>} Pull result.
288
298
  */
289
299
  static async pullChanges(args) {
300
+ throwIfSyncAborted(args.signal);
290
301
  let afterCursor = this.syncCursorFromPayload(await args.loadCursor());
291
302
  let upToCursor = null;
292
303
  let pages = 0;
@@ -297,7 +308,9 @@ export default class SyncApiClient {
297
308
  const resourceChanged = /** @type {Record<string, boolean>} */ ({});
298
309
  const batchSize = this.normalizedBatchSize(args.batchSize);
299
310
  while (true) {
311
+ throwIfSyncAborted(args.signal);
300
312
  const changesResponse = await this.changesPage({ ...args, afterCursor, batchSize, upToCursor });
313
+ throwIfSyncAborted(args.signal);
301
314
  const syncs = changesResponse.syncs;
302
315
  if (!upToCursor)
303
316
  upToCursor = changesResponse.upToCursor;
@@ -311,6 +324,7 @@ export default class SyncApiClient {
311
324
  if (syncs.length === 0) {
312
325
  // Report the terminal progress once for an entirely empty pull so consumers observe
313
326
  // total 0; a pull that already applied pages reported its final counts on its last page.
327
+ throwIfSyncAborted(args.signal);
314
328
  if (pages === 0 && args.onProgress)
315
329
  args.onProgress({ pages, syncedCount, total });
316
330
  break;
@@ -322,7 +336,9 @@ export default class SyncApiClient {
322
336
  // waiting for the rest of the pull.
323
337
  await recordChanges.batch(async () => {
324
338
  for (const sync of syncs) {
339
+ throwIfSyncAborted(args.signal);
325
340
  const applyResult = await args.applySync(sync);
341
+ throwIfSyncAborted(args.signal);
326
342
  const resourceType = applyResult.resourceType ?? sync.resourceType();
327
343
  changed ||= applyResult.changed === true;
328
344
  syncedCount += 1;
@@ -333,13 +349,16 @@ export default class SyncApiClient {
333
349
  }
334
350
  });
335
351
  afterCursor = changesResponse.nextCursor;
352
+ throwIfSyncAborted(args.signal);
336
353
  if (args.onProgress)
337
354
  args.onProgress({ pages, syncedCount, total });
338
355
  if (syncs.length < batchSize)
339
356
  break;
340
357
  }
358
+ throwIfSyncAborted(args.signal);
341
359
  if (afterCursor)
342
360
  await args.saveCursor(afterCursor);
361
+ throwIfSyncAborted(args.signal);
343
362
  return { changed, pages, resourceChanged, resourceCounts, syncedCount, total };
344
363
  }
345
364
  /**
@@ -348,17 +367,20 @@ export default class SyncApiClient {
348
367
  * @param {SyncCursor} args.afterCursor - Last acknowledged cursor.
349
368
  * @param {string} args.authenticationToken - Auth token.
350
369
  * @param {number} args.batchSize - Page size.
351
- * @param {(payload: SyncChangesRequest) => Promise<SyncChangesResponse>} args.postChanges - Changes poster.
370
+ * @param {(payload: SyncChangesRequest, options?: {signal?: AbortSignal}) => Promise<SyncChangesResponse>} args.postChanges - Changes poster.
371
+ * @param {AbortSignal} [args.signal] - Lifecycle cancellation signal.
352
372
  * @param {SyncCursor} args.upToCursor - Snapshot upper-bound cursor.
353
373
  * @returns {Promise<{nextCursor: SyncCursor, syncs: SyncChangeEnvelope[], total: number | null, upToCursor: SyncCursor}>} Normalized changes page.
354
374
  */
355
- static async changesPage({ afterCursor, authenticationToken, batchSize, postChanges, upToCursor }) {
375
+ static async changesPage({ afterCursor, authenticationToken, batchSize, postChanges, signal, upToCursor }) {
376
+ throwIfSyncAborted(signal);
356
377
  const response = await postChanges({
357
378
  authenticationToken,
358
379
  limit: batchSize,
359
380
  ...this.cursorPayload("after", afterCursor),
360
381
  ...this.cursorPayload("upTo", upToCursor)
361
- });
382
+ }, { signal });
383
+ throwIfSyncAborted(signal);
362
384
  this.ensureSuccessfulChangesResponse(response);
363
385
  const syncs = /** @type {unknown[]} */ (response.syncs);
364
386
  return {
@@ -525,7 +547,8 @@ export default class SyncApiClient {
525
547
  * @param {string} args.authenticationToken - Auth token to send with replay requests.
526
548
  * @param {number} [args.batchSize] - Max syncs per request.
527
549
  * @param {ReturnType<typeof JSON.parse>} args.syncModel - Local Sync model class.
528
- * @param {(payload: {authenticationToken: string, syncs: Array<Record<string, ReturnType<typeof JSON.parse>>>}) => Promise<SyncReplayResponse>} args.postReplay - Replay poster.
550
+ * @param {(payload: {authenticationToken: string, syncs: Array<Record<string, ReturnType<typeof JSON.parse>>>}, options?: {signal?: AbortSignal}) => Promise<SyncReplayResponse>} args.postReplay - Replay poster.
551
+ * @param {AbortSignal} [args.signal] - Lifecycle cancellation signal.
529
552
  * @returns {Promise<void>}
530
553
  */
531
554
  static async replayLocalSyncs(args) {
@@ -548,6 +571,7 @@ export default class SyncApiClient {
548
571
  },
549
572
  pendingSyncs: async () => await args.syncModel.preload({ resource: true }).where({ state: "pending" }).order("created_at").toArray(),
550
573
  postReplay: args.postReplay,
574
+ signal: args.signal,
551
575
  syncId: (sync) => /** @type {{id: () => string | number | null | undefined}} */ (sync).id(),
552
576
  syncPayload: (sync) => {
553
577
  postedSnapshotsBySyncId.set(String(/** @type {{id: () => string | number | null | undefined}} */ (sync).id()), this.localSyncReplaySnapshot(sync));
@@ -739,14 +763,18 @@ export default class SyncApiClient {
739
763
  * @param {() => Promise<Array<unknown>>} args.pendingSyncs - Loads pending local sync rows in replay order.
740
764
  * @param {(sync: unknown) => string | number | null | undefined} args.syncId - Returns the local sync id.
741
765
  * @param {(sync: unknown) => Record<string, ReturnType<typeof JSON.parse>>} args.syncPayload - Builds the API sync envelope.
742
- * @param {(payload: {authenticationToken: string, syncs: Array<Record<string, ReturnType<typeof JSON.parse>>>}) => Promise<SyncReplayResponse>} args.postReplay - Posts one replay request.
766
+ * @param {(payload: {authenticationToken: string, syncs: Array<Record<string, ReturnType<typeof JSON.parse>>>}, options?: {signal?: AbortSignal}) => Promise<SyncReplayResponse>} args.postReplay - Posts one replay request.
743
767
  * @param {(sync: unknown, response: SyncReplayItem) => Promise<void>} args.markSuccessful - Marks one sync as successful locally.
768
+ * @param {AbortSignal} [args.signal] - Lifecycle cancellation signal.
744
769
  * @returns {Promise<void>} Resolves after all batches are replayed.
745
770
  */
746
771
  static async replayPending(args) {
772
+ throwIfSyncAborted(args.signal);
747
773
  const pendingSyncs = await args.pendingSyncs();
774
+ throwIfSyncAborted(args.signal);
748
775
  const batchSize = this.normalizedBatchSize(args.batchSize);
749
776
  for (let offset = 0; offset < pendingSyncs.length; offset += batchSize) {
777
+ throwIfSyncAborted(args.signal);
750
778
  await this.replayBatch({ ...args, pendingSyncs: pendingSyncs.slice(offset, offset + batchSize) });
751
779
  }
752
780
  }
@@ -757,14 +785,16 @@ export default class SyncApiClient {
757
785
  * @param {Array<unknown>} args.pendingSyncs - Batch syncs.
758
786
  * @param {(sync: unknown) => string | number | null | undefined} args.syncId - Sync id getter.
759
787
  * @param {(sync: unknown) => Record<string, ReturnType<typeof JSON.parse>>} args.syncPayload - Payload builder.
760
- * @param {(payload: {authenticationToken: string, syncs: Array<Record<string, ReturnType<typeof JSON.parse>>>}) => Promise<SyncReplayResponse>} args.postReplay - Replay poster.
788
+ * @param {(payload: {authenticationToken: string, syncs: Array<Record<string, ReturnType<typeof JSON.parse>>>}, options?: {signal?: AbortSignal}) => Promise<SyncReplayResponse>} args.postReplay - Replay poster.
761
789
  * @param {(sync: unknown, response: SyncReplayItem) => Promise<void>} args.markSuccessful - Success hook.
790
+ * @param {AbortSignal} [args.signal] - Lifecycle cancellation signal.
762
791
  * @returns {Promise<void>} Resolves after the batch is acknowledged.
763
792
  */
764
793
  static async replayBatch(args) {
765
- const { authenticationToken, markSuccessful, pendingSyncs, postReplay, syncId, syncPayload } = args;
794
+ const { authenticationToken, markSuccessful, pendingSyncs, postReplay, signal, syncId, syncPayload } = args;
766
795
  if (pendingSyncs.length === 0)
767
796
  return;
797
+ throwIfSyncAborted(signal);
768
798
  const syncsById = new Map();
769
799
  for (const sync of pendingSyncs) {
770
800
  const id = syncId(sync);
@@ -774,9 +804,11 @@ export default class SyncApiClient {
774
804
  const response = await postReplay({
775
805
  authenticationToken,
776
806
  syncs: pendingSyncs.map((sync) => syncPayload(sync))
777
- });
807
+ }, { signal });
808
+ throwIfSyncAborted(signal);
778
809
  this.ensureSuccessfulResponse(response);
779
810
  for (const syncResponse of response.syncs || []) {
811
+ throwIfSyncAborted(signal);
780
812
  const sync = syncsById.get(String(syncResponse.id));
781
813
  if (!sync)
782
814
  continue;
@@ -784,6 +816,7 @@ export default class SyncApiClient {
784
816
  throw new Error(`Invalid sync state returned for sync ${String(syncResponse.id)}: ${String(syncResponse.syncState)}`);
785
817
  }
786
818
  await markSuccessful(sync, syncResponse);
819
+ throwIfSyncAborted(signal);
787
820
  }
788
821
  }
789
822
  /**
@@ -808,4 +841,15 @@ export default class SyncApiClient {
808
841
  return Math.floor(batchSize);
809
842
  }
810
843
  }
811
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1hcGktY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc3luYy1hcGktY2xpZW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsZUFBZSxFQUFFLGVBQWUsRUFBQyxNQUFNLFNBQVMsQ0FBQTtBQUV4RCxPQUFPLGFBQWEsTUFBTSwrQkFBK0IsQ0FBQTtBQUN6RCxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQTtBQUN4RSxPQUFPLEVBQUMsdUNBQXVDLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQTtBQUU5RSxrR0FBa0c7QUFDbEcsNEZBQTRGO0FBQzVGLDRGQUE0RjtBQUM1Riw4RkFBOEY7QUFDOUYsMEZBQTBGO0FBQzFGLDRFQUE0RTtBQUM1RSxvRkFBb0Y7QUFDcEYsNEZBQTRGO0FBQzVGLDRGQUE0RjtBQUM1RixNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7QUFFbEM7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sYUFBYTtJQUNoQzs7Ozs7Ozs7Ozs7T0FXRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsRUFBQyxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBQztRQUN0SCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsMEJBQTBCLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLDZCQUE2QixZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDakgsTUFBTSxPQUFPLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDNUQsTUFBTSxXQUFXLEdBQUcsT0FBTzthQUN4QixNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENB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QUFRO1FBQ3RDLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxPQUFPO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxJQUFJLGFBQWEsQ0FBQyxDQUFBO1FBQ3hGLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUE7SUFDcEYsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsbUJBQW1CLENBQUMsU0FBUztRQUNsQyxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxHQUFHLENBQUM7WUFBRSxPQUFPLEdBQUcsQ0FBQTtRQUU3RixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDOUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7b3B0aW9uYWxCb29sZWFuLCBvcHRpb25hbEludGVnZXJ9IGZyb20gXCJ0eXBhbmljXCJcblxuaW1wb3J0IHJlY29yZENoYW5nZXMgZnJvbSBcIi4uL2RhdGFiYXNlL3JlY29yZC1jaGFuZ2VzLmpzXCJcbmltcG9ydCB7c2NhbGFyTW9kZWxQcmltYXJ5S2V5VmFsdWV9IGZyb20gXCIuLi91dGlscy9tb2RlbC1wcmltYXJ5LWtleS5qc1wiXG5pbXBvcnQge2FwcGx5U3luY1JlcGxheVJlc3VsdFRvTG9jYWxNdXRhdGlvbkxvZ30gZnJvbSBcIi4vY29uZmxpY3Qtc3RyYXRlZ3kuanNcIlxuXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDaGFuZ2VBcHBseVJlc3VsdH0gU3luY0NoYW5nZUFwcGx5UmVzdWx0ICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDaGFuZ2VFbnZlbG9wZX0gU3luY0NoYW5nZUVudmVsb3BlICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDaGFuZ2VzUmVxdWVzdH0gU3luY0NoYW5nZXNSZXF1ZXN0ICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDaGFuZ2VzUmVzcG9uc2V9IFN5bmNDaGFuZ2VzUmVzcG9uc2UgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0NoYW5nZXNSZXN1bHR9IFN5bmNDaGFuZ2VzUmVzdWx0ICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDdXJzb3J9IFN5bmNDdXJzb3IgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1JlcGxheUl0ZW19IFN5bmNSZXBsYXlJdGVtICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNSZXBsYXlSZXNwb25zZX0gU3luY1JlcGxheVJlc3BvbnNlICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNSZXNvdXJjZUNvbmZpZ30gU3luY1Jlc291cmNlQ29uZmlnICovXG5jb25zdCBzeW5jVGFza1Byb21pc2VzID0gbmV3IE1hcCgpXG5cbi8qKlxuICogR2VuZXJpYyBjbGllbnQtc2lkZSBoZWxwZXIgZm9yIHJlcGxheWluZyBwZW5kaW5nIHN5bmMgZW52ZWxvcGVzIHRocm91Z2ggdGhlXG4gKiBmcmFtZXdvcmstb3duZWQgYC92ZWxvY2lvdXMvc3luYy9yZXBsYXlgIGVuZHBvaW50LiBBcHBzIHByb3ZpZGUgb25seSBsb2NhbFxuICogcGVyc2lzdGVuY2UvYXV0aCBob29rcy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3luY0FwaUNsaWVudCB7XG4gIC8qKlxuICAgKiBBcHBlbmRzIG9uZSBjb25mbGljdC10cmFja2VkIGludGVudCB0byB0aGUgZXhpc3RpbmcgZHVyYWJsZSBtdXRhdGlvbiBsb2cuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gUXVldWUgYXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlciB8IG51bGx9IGFyZ3MuYmFzZVZlcnNpb24gLSBBdXRob3JpdGF0aXZlIHZlcnNpb24gb2JzZXJ2ZWQgYmVmb3JlIHRoZSBsb2NhbCBtdXRhdGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRDb25mbGljdFRyYWNraW5nQ29uZmlnfSBhcmdzLmNvbmZsaWN0VHJhY2tpbmcgLSBEdXJhYmxlIHRyYWNraW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IGFyZ3MuZGF0YSAtIEJhY2tlbmQtc2FmZSBtdXRhdGlvbiBhdHRyaWJ1dGVzLlxuICAgKiBAcGFyYW0ge1wiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCJ9IGFyZ3Mub3BlcmF0aW9uIC0gTG9jYWwgb3BlcmF0aW9uLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBhcmdzLnJlc291cmNlIC0gTG9jYWwgcmVzb3VyY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnJlc291cmNlVHlwZSAtIFJlc291cmNlIHR5cGUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnN5bmNUeXBlIC0gV2lyZSBvcGVyYXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGltcG9ydChcIi4vbG9jYWwtbXV0YXRpb24tbG9nLmpzXCIpLkxvY2FsTXV0YXRpb25Mb2dSZWNvcmQ+fSBBcHBlbmRlZCBpbnRlbnQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcXVldWVDb25mbGljdFRyYWNrZWRTeW5jKHtiYXNlVmVyc2lvbiwgY29uZmxpY3RUcmFja2luZywgZGF0YSwgb3BlcmF0aW9uLCByZXNvdXJjZSwgcmVzb3VyY2VUeXBlLCBzeW5jVHlwZX0pIHtcbiAgICBjb25zdCByZXNvdXJjZUlkID0gU3RyaW5nKHNjYWxhck1vZGVsUHJpbWFyeUtleVZhbHVlKHJlc291cmNlLmlkKCksIGBDb25mbGljdC10cmFja2VkIHN5bmMgZm9yICR7cmVzb3VyY2VUeXBlfWApKVxuICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCBjb25mbGljdFRyYWNraW5nLm11dGF0aW9uTG9nLnJlY29yZHMoKVxuICAgIGNvbnN0IHByZWRlY2Vzc29yID0gcmVjb3Jkc1xuICAgICAgLmZpbHRlcigocmVjb3JkKSA9PiByZWNvcmQubXV0YXRpb24ubW9kZWwgPT09IHJlc291cmNlVHlwZSAmJiByZWNvcmQubXV0YXRpb24ucGF5bG9hZD8ucmVzb3VyY2VJZCA9PT0gcmVzb3VyY2VJZClcbiAgICAgIC5hdCgtMSlcbiAgICBjb25zdCBjbGllbnRNdXRhdGlvbklkID0gY29uZmxpY3RUcmFja2luZy5jbGllbnRNdXRhdGlvbklkKClcbiAgICBjb25zdCBub3cgPSBjb25mbGljdFRyYWNraW5nLm5vdyA/IGNvbmZsaWN0VHJhY2tpbmcubm93KCkgOiBuZXcgRGF0ZSgpXG4gICAgY29uc3QgcHJlZGVjZXNzb3JUaW1lID0gcHJlZGVjZXNzb3IgPyBuZXcgRGF0ZShwcmVkZWNlc3Nvci5tdXRhdGlvbi5vY2N1cnJlZEF0KS5nZXRUaW1lKCkgOiBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFlcbiAgICBjb25zdCBvY2N1cnJlZEF0ID0gbmV3IERhdGUoTWF0aC5tYXgobm93LmdldFRpbWUoKSwgcHJlZGVjZXNzb3JUaW1lICsgMSkpLnRvSVNPU3RyaW5nKClcblxuICAgIHJldHVybiBhd2FpdCBjb25mbGljdFRyYWNraW5nLm11dGF0aW9uTG9nLmFwcGVuZCh7XG4gICAgICBkZXBlbmRlbmNpZXM6IHByZWRlY2Vzc29yID8gW3tjbGllbnRNdXRhdGlvbklkOiBwcmVkZWNlc3Nvci5tdXRhdGlvbi5jbGllbnRNdXRhdGlvbklkLCBtb2RlbDogcmVzb3VyY2VUeXBlfV0gOiBbXSxcbiAgICAgIG11dGF0aW9uOiB7XG4gICAgICAgIGFjdG9yRGV2aWNlSWQ6IGNvbmZsaWN0VHJhY2tpbmcuYWN0b3JEZXZpY2VJZCxcbiAgICAgICAgYWN0b3JVc2VySWQ6IGNvbmZsaWN0VHJhY2tpbmcuYWN0b3JVc2VySWQsXG4gICAgICAgIGF0dHJpYnV0ZXM6IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT59ICovIChkYXRhKSxcbiAgICAgICAgYmFzZVZlcnNpb24sXG4gICAgICAgIGNsaWVudE11dGF0aW9uSWQsXG4gICAgICAgIG1vZGVsOiByZXNvdXJjZVR5cGUsXG4gICAgICAgIG9jY3VycmVkQXQsXG4gICAgICAgIG9mZmxpbmVHcmFudElkOiBjb25mbGljdFRyYWNraW5nLm9mZmxpbmVHcmFudElkLFxuICAgICAgICBvcGVyYXRpb24sXG4gICAgICAgIHBheWxvYWQ6IHtyZXNvdXJjZUlkLCBzeW5jVHlwZX0sXG4gICAgICAgIHBvbGljeUhhc2g6IGNvbmZsaWN0VHJhY2tpbmcucG9saWN5SGFzaFxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogRHJhaW5zIHRoZSBleGlzdGluZyBtdXRhdGlvbiBsb2cgaW4gcHJlZGVjZXNzb3Igb3JkZXIuIEluZGVwZW5kZW50IHJlY29yZHNcbiAgICogY29udGludWUgYWZ0ZXIgZHVyYWJsZSBjb25mbGljdHMvcmVqZWN0aW9uczsgc3VjY2Vzc29ycyBzdGF5IGJsb2NrZWQuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gUmVwbGF5IGFyZ3VtZW50cy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXV0aGVudGljYXRpb25Ub2tlbiAtIEF1dGhlbnRpY2F0aW9uIHRva2VuLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuYmF0Y2hTaXplXSAtIEJhdGNoIHNpemUuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9zeW5jLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2xpZW50Q29uZmxpY3RUcmFja2luZ0NvbmZpZ30gYXJncy5jb25mbGljdFRyYWNraW5nIC0gVHJhY2tpbmcgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHsocGF5bG9hZDoge2F1dGhlbnRpY2F0aW9uVG9rZW46IHN0cmluZywgc3luY3M6IEFycmF5PFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pj59KSA9PiBQcm9taXNlPFN5bmNSZXBsYXlSZXNwb25zZT59IGFyZ3MucG9zdFJlcGxheSAtIFRyYW5zcG9ydCBib3VuZGFyeS5cbiAgICogQHBhcmFtIHsoaWRlbnRpdHk6IHN0cmluZykgPT4gbnVtYmVyfSBhcmdzLnJlbW90ZUdlbmVyYXRpb24gLSBDdXJyZW50IHJlbW90ZSBnZW5lcmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5yZXNvdXJjZVR5cGUgLSBSZXNvdXJjZSB3aG9zZSBsb2cgcmVjb3JkcyBzaG91bGQgZHJhaW4uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyB3aGVuIG5vIHJlYWR5IGludGVudCByZW1haW5zLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHJlcGxheUNvbmZsaWN0VHJhY2tlZFN5bmNzKHthdXRoZW50aWNhdGlvblRva2VuLCBiYXRjaFNpemUsIGNvbmZsaWN0VHJhY2tpbmcsIHBvc3RSZXBsYXksIHJlbW90ZUdlbmVyYXRpb24sIHJlc291cmNlVHlwZX0pIHtcbiAgICBjb25zdCBtYXhCYXRjaFNpemUgPSB0aGlzLm5vcm1hbGl6ZWRCYXRjaFNpemUoYmF0Y2hTaXplKVxuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCBjb25mbGljdFRyYWNraW5nLm11dGF0aW9uTG9nLnJlY29yZHMoKVxuICAgICAgY29uc3Qgc3RhdHVzZXMgPSBuZXcgTWFwKHJlY29yZHMubWFwKChyZWNvcmQpID0+IFtyZWNvcmQubXV0YXRpb24uY2xpZW50TXV0YXRpb25JZCwgcmVjb3JkLnN0YXR1c10pKVxuICAgICAgY29uc3QgcGVuZGluZyA9IHJlY29yZHMuZmlsdGVyKChyZWNvcmQpID0+IHJlY29yZC5zdGF0dXMgPT09IFwicGVuZGluZ1wiICYmIHJlY29yZC5tdXRhdGlvbi5tb2RlbCA9PT0gcmVzb3VyY2VUeXBlKVxuICAgICAgY29uc3QgcmVhZHkgPSBwZW5kaW5nLmZpbHRlcigocmVjb3JkKSA9PiByZWNvcmQuZGVwZW5kZW5jaWVzLmV2ZXJ5KChkZXBlbmRlbmN5KSA9PiBzdGF0dXNlcy5nZXQoZGVwZW5kZW5jeS5jbGllbnRNdXRhdGlvbklkKSA9PT0gXCJzeW5jZWRcIikpXG5cbiAgICAgIGlmIChyZWFkeS5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgICBjb25zdCBncm91cHMgPSB0aGlzLmNvbmZsaWN0UmVwbGF5R3JvdXBzKHtwZW5kaW5nLCByZWFkeX0pLnNsaWNlKDAsIG1heEJhdGNoU2l6ZSlcbiAgICAgIGNvbnN0IGdlbmVyYXRpb25zID0gbmV3IE1hcChncm91cHMubWFwKChncm91cCkgPT4gW2dyb3VwWzBdLm11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQsIHJlbW90ZUdlbmVyYXRpb24odGhpcy5jb25mbGljdFJlY29yZElkZW50aXR5KGdyb3VwWzBdKSldKSlcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdFJlcGxheSh7XG4gICAgICAgIGF1dGhlbnRpY2F0aW9uVG9rZW4sXG4gICAgICAgIHN5bmNzOiBncm91cHMubWFwKChncm91cCkgPT4gdGhpcy5jb25mbGljdFJlcGxheVBheWxvYWQoZ3JvdXApKVxuICAgICAgfSlcblxuICAgICAgdGhpcy5lbnN1cmVTdWNjZXNzZnVsUmVzcG9uc2UocmVzcG9uc2UpXG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlc0J5SWQgPSBuZXcgTWFwKChyZXNwb25zZS5zeW5jcyB8fCBbXSkubWFwKChyZXN1bHQpID0+IFtTdHJpbmcocmVzdWx0LmlkKSwgcmVzdWx0XSkpXG5cbiAgICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgZ3JvdXBzKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlc0J5SWQuZ2V0KGdyb3VwWzBdLm11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQpXG5cbiAgICAgICAgaWYgKCFyZXN1bHQpIHRocm93IG5ldyBFcnJvcihgU3luYyByZXNwb25zZSBtaXNzaW5nIHJlc3VsdCBmb3IgbXV0YXRpb24gJHtncm91cFswXS5tdXRhdGlvbi5jbGllbnRNdXRhdGlvbklkfWApXG4gICAgICAgIGlmICghW1wic3VjY2Vzc2Z1bFwiLCBcImR1cGxpY2F0ZVwiLCBcImNvbmZsaWN0XCIsIFwiZmFpbGVkXCIsIFwicmVqZWN0ZWRcIl0uaW5jbHVkZXMocmVzdWx0LnN5bmNTdGF0ZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc3luYyBzdGF0ZSByZXR1cm5lZCBmb3IgbXV0YXRpb24gJHtncm91cFswXS5tdXRhdGlvbi5jbGllbnRNdXRhdGlvbklkfTogJHtyZXN1bHQuc3luY1N0YXRlfWApXG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiBncm91cCkge1xuICAgICAgICAgIGF3YWl0IGFwcGx5U3luY1JlcGxheVJlc3VsdFRvTG9jYWxNdXRhdGlvbkxvZyh7bXV0YXRpb25Mb2c6IGNvbmZsaWN0VHJhY2tpbmcubXV0YXRpb25Mb2csIHJlY29yZCwgcmVzdWx0OiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gKHJlc3VsdCl9KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFtcInN1Y2Nlc3NmdWxcIiwgXCJkdXBsaWNhdGVcIl0uaW5jbHVkZXMocmVzdWx0LnN5bmNTdGF0ZSkgJiYgcmVzdWx0LnNlcnZlclZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IGlkZW50aXR5ID0gdGhpcy5jb25mbGljdFJlY29yZElkZW50aXR5KGdyb3VwWzBdKVxuXG4gICAgICAgICAgaWYgKHJlbW90ZUdlbmVyYXRpb24oaWRlbnRpdHkpID09PSBnZW5lcmF0aW9ucy5nZXQoZ3JvdXBbMF0ubXV0YXRpb24uY2xpZW50TXV0YXRpb25JZCkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmViYXNlQ29uZmxpY3RTdWNjZXNzb3Ioe2NvbmZsaWN0VHJhY2tpbmcsIHByZWRlY2Vzc29yOiBncm91cFtncm91cC5sZW5ndGggLSAxXSwgc2VydmVyVmVyc2lvbjogcmVzdWx0LnNlcnZlclZlcnNpb259KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgc2FmZSB0cmFuc3BvcnQgZ3JvdXBzIGZyb20gcm9vdC1yZWFkeSByZWNvcmRzIGFuZCB0aGVpciBzdWNjZXNzb3JzLlxuICAgKiBAcGFyYW0ge3twZW5kaW5nOiBBcnJheTxpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5Mb2NhbE11dGF0aW9uTG9nUmVjb3JkPiwgcmVhZHk6IEFycmF5PGltcG9ydChcIi4vbG9jYWwtbXV0YXRpb24tbG9nLmpzXCIpLkxvY2FsTXV0YXRpb25Mb2dSZWNvcmQ+fX0gYXJncyAtIFBlbmRpbmcgYW5kIHJvb3QtcmVhZHkgcmVjb3Jkcy5cbiAgICogQHJldHVybnMge0FycmF5PEFycmF5PGltcG9ydChcIi4vbG9jYWwtbXV0YXRpb24tbG9nLmpzXCIpLkxvY2FsTXV0YXRpb25Mb2dSZWNvcmQ+Pn0gU2FmZSB0cmFuc3BvcnQgZ3JvdXBzLlxuICAgKi9cbiAgc3RhdGljIGNvbmZsaWN0UmVwbGF5R3JvdXBzKHtwZW5kaW5nLCByZWFkeX0pIHtcbiAgICBjb25zdCBncm91cHMgPSBbXVxuICAgIGNvbnN0IHNlbGVjdGVkSWRlbnRpdGllcyA9IG5ldyBTZXQoKVxuXG4gICAgZm9yIChjb25zdCByZWNvcmQgb2YgcmVhZHkpIHtcbiAgICAgIGNvbnN0IGlkZW50aXR5ID0gdGhpcy5jb25mbGljdFJlY29yZElkZW50aXR5KHJlY29yZClcblxuICAgICAgaWYgKHNlbGVjdGVkSWRlbnRpdGllcy5oYXMoaWRlbnRpdHkpKSBjb250aW51ZVxuXG4gICAgICBjb25zdCBncm91cCA9IFtyZWNvcmRdXG4gICAgICBsZXQgdGFpbCA9IHJlY29yZFxuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBjb25zdCBzdWNjZXNzb3IgPSBwZW5kaW5nLmZpbmQoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmRlcGVuZGVuY2llcy5zb21lKChkZXBlbmRlbmN5KSA9PiBkZXBlbmRlbmN5LmNsaWVudE11dGF0aW9uSWQgPT09IHRhaWwubXV0YXRpb24uY2xpZW50TXV0YXRpb25JZCkpXG5cbiAgICAgICAgaWYgKCFzdWNjZXNzb3IgfHwgIXRoaXMuY2FuQ29hbGVzY2VDb25mbGljdFJlY29yZHModGFpbCwgc3VjY2Vzc29yKSkgYnJlYWtcbiAgICAgICAgZ3JvdXAucHVzaChzdWNjZXNzb3IpXG4gICAgICAgIHRhaWwgPSBzdWNjZXNzb3JcbiAgICAgIH1cblxuICAgICAgZ3JvdXBzLnB1c2goZ3JvdXApXG4gICAgICBzZWxlY3RlZElkZW50aXRpZXMuYWRkKGlkZW50aXR5KVxuICAgIH1cblxuICAgIHJldHVybiBncm91cHNcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0d28gZHVyYWJsZSBpbnRlbnRzIGNhbiBzaGFyZSBvbmUgdHJhbnNwb3J0IG11dGF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vbG9jYWwtbXV0YXRpb24tbG9nLmpzXCIpLkxvY2FsTXV0YXRpb25Mb2dSZWNvcmR9IGxlZnQgLSBFYXJsaWVyIGludGVudC5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5Mb2NhbE11dGF0aW9uTG9nUmVjb3JkfSByaWdodCAtIExhdGVyIGludGVudC5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgc2NhbGFyIHVwZGF0ZXMgY2FuIHNoYXJlIG9uZSB0cmFuc3BvcnQgbXV0YXRpb24uXG4gICAqL1xuICBzdGF0aWMgY2FuQ29hbGVzY2VDb25mbGljdFJlY29yZHMobGVmdCwgcmlnaHQpIHtcbiAgICBpZiAobGVmdC5tdXRhdGlvbi5vcGVyYXRpb24gIT09IFwidXBkYXRlXCIgfHwgcmlnaHQubXV0YXRpb24ub3BlcmF0aW9uICE9PSBcInVwZGF0ZVwiKSByZXR1cm4gZmFsc2VcbiAgICBpZiAodGhpcy5jb25mbGljdFJlY29yZElkZW50aXR5KGxlZnQpICE9PSB0aGlzLmNvbmZsaWN0UmVjb3JkSWRlbnRpdHkocmlnaHQpKSByZXR1cm4gZmFsc2VcbiAgICBpZiAobGVmdC5tdXRhdGlvbi5iYXNlVmVyc2lvbiAhPT0gcmlnaHQubXV0YXRpb24uYmFzZVZlcnNpb24pIHJldHVybiBmYWxzZVxuICAgIGlmICghdGhpcy5zY2FsYXJTeW5jQXR0cmlidXRlcyhsZWZ0Lm11dGF0aW9uLmF0dHJpYnV0ZXMpIHx8ICF0aGlzLnNjYWxhclN5bmNBdHRyaWJ1dGVzKHJpZ2h0Lm11dGF0aW9uLmF0dHJpYnV0ZXMpKSByZXR1cm4gZmFsc2VcblxuICAgIHJldHVybiAhT2JqZWN0LmtleXMobGVmdC5tdXRhdGlvbi5hdHRyaWJ1dGVzIHx8IHt9KS5zb21lKChrZXkpID0+IE9iamVjdC5oYXNPd24ocmlnaHQubXV0YXRpb24uYXR0cmlidXRlcyB8fCB7fSwga2V5KSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhdHRyaWJ1dGVzIGNvbnRhaW4gc2NhbGFyIEpTT04gdmFsdWVzIG9ubHkuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgaW1wb3J0KFwiLi4vY29uZmlndXJhdGlvbi10eXBlcy5qc1wiKS5Gcm9udGVuZE1vZGVsU3luY0pzb25WYWx1ZT4gfCB1bmRlZmluZWR9IGF0dHJpYnV0ZXMgLSBBdHRyaWJ1dGVzLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBldmVyeSB2YWx1ZSBpcyBzY2FsYXIuXG4gICAqL1xuICBzdGF0aWMgc2NhbGFyU3luY0F0dHJpYnV0ZXMoYXR0cmlidXRlcykge1xuICAgIHJldHVybiBCb29sZWFuKGF0dHJpYnV0ZXMpICYmIE9iamVjdC52YWx1ZXMoYXR0cmlidXRlcyB8fCB7fSkuZXZlcnkoKHZhbHVlKSA9PiB2YWx1ZSA9PT0gbnVsbCB8fCBbXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJib29sZWFuXCJdLmluY2x1ZGVzKHR5cGVvZiB2YWx1ZSkpXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIG9uZSByZXBsYXkgZW52ZWxvcGUgZm9yIGEgc2FmZSB0cmFuc3BvcnQgZ3JvdXAuXG4gICAqIEBwYXJhbSB7QXJyYXk8aW1wb3J0KFwiLi9sb2NhbC1tdXRhdGlvbi1sb2cuanNcIikuTG9jYWxNdXRhdGlvbkxvZ1JlY29yZD59IGdyb3VwIC0gVHJhbnNwb3J0IGdyb3VwLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBSZXBsYXkgZW52ZWxvcGUuXG4gICAqL1xuICBzdGF0aWMgY29uZmxpY3RSZXBsYXlQYXlsb2FkKGdyb3VwKSB7XG4gICAgY29uc3QgZmlyc3QgPSBncm91cFswXVxuICAgIGNvbnN0IHBheWxvYWQgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gKHtcbiAgICAgIGJhc2VWZXJzaW9uOiBmaXJzdC5tdXRhdGlvbi5iYXNlVmVyc2lvbixcbiAgICAgIGNsaWVudFVwZGF0ZWRBdDogZmlyc3QubXV0YXRpb24ub2NjdXJyZWRBdCxcbiAgICAgIGRhdGE6IE9iamVjdC5hc3NpZ24oe30sIC4uLmdyb3VwLm1hcCgocmVjb3JkKSA9PiByZWNvcmQubXV0YXRpb24uYXR0cmlidXRlcyB8fCB7fSkpLFxuICAgICAgaWQ6IGZpcnN0Lm11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQsXG4gICAgICByZXNvdXJjZUlkOiBmaXJzdC5tdXRhdGlvbi5wYXlsb2FkPy5yZXNvdXJjZUlkLFxuICAgICAgcmVzb3VyY2VUeXBlOiBmaXJzdC5tdXRhdGlvbi5tb2RlbCxcbiAgICAgIHN5bmNUeXBlOiBmaXJzdC5tdXRhdGlvbi5wYXlsb2FkPy5zeW5jVHlwZVxuICAgIH0pXG5cbiAgICByZXR1cm4gcGF5bG9hZFxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHN0YWJsZSByZXNvdXJjZSBpZGVudGl0eSBmb3Igb3JkZXJpbmcgYW5kIHJlbW90ZSBnZW5lcmF0aW9ucy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5Mb2NhbE11dGF0aW9uTG9nUmVjb3JkfSByZWNvcmQgLSBSZWNvcmQuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFJlc291cmNlIGlkZW50aXR5LlxuICAgKi9cbiAgc3RhdGljIGNvbmZsaWN0UmVjb3JkSWRlbnRpdHkocmVjb3JkKSB7XG4gICAgcmV0dXJuIGAke3JlY29yZC5tdXRhdGlvbi5tb2RlbH06JHtTdHJpbmcocmVjb3JkLm11dGF0aW9uLnBheWxvYWQ/LnJlc291cmNlSWQpfWBcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWJhc2VzIHRoZSBkaXJlY3QgcGVuZGluZyBzdWNjZXNzb3IgZnJvbSBhbiBhdXRob3JpdGF0aXZlIGFja25vd2xlZGdlbWVudC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBSZWJhc2UgYXJncy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRDb25mbGljdFRyYWNraW5nQ29uZmlnfSBhcmdzLmNvbmZsaWN0VHJhY2tpbmcgLSBUcmFja2luZyBjb25maWcuXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9sb2NhbC1tdXRhdGlvbi1sb2cuanNcIikuTG9jYWxNdXRhdGlvbkxvZ1JlY29yZH0gYXJncy5wcmVkZWNlc3NvciAtIEFja25vd2xlZGdlZCBwcmVkZWNlc3Nvci5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBudW1iZXIgfCBudWxsfSBhcmdzLnNlcnZlclZlcnNpb24gLSBBdXRob3JpdGF0aXZlIHNlcnZlciB2ZXJzaW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIHN0YXRpYyBhc3luYyByZWJhc2VDb25mbGljdFN1Y2Nlc3Nvcih7Y29uZmxpY3RUcmFja2luZywgcHJlZGVjZXNzb3IsIHNlcnZlclZlcnNpb259KSB7XG4gICAgY29uc3Qgc3VjY2Vzc29yID0gKGF3YWl0IGNvbmZsaWN0VHJhY2tpbmcubXV0YXRpb25Mb2cucGVuZGluZ1JlY29yZHMoKSlcbiAgICAgIC5maW5kKChyZWNvcmQpID0+IHJlY29yZC5kZXBlbmRlbmNpZXMuc29tZSgoZGVwZW5kZW5jeSkgPT4gZGVwZW5kZW5jeS5jbGllbnRNdXRhdGlvbklkID09PSBwcmVkZWNlc3Nvci5tdXRhdGlvbi5jbGllbnRNdXRhdGlvbklkKSlcblxuICAgIGlmICghc3VjY2Vzc29yKSByZXR1cm5cblxuICAgIGF3YWl0IGNvbmZsaWN0VHJhY2tpbmcubXV0YXRpb25Mb2cudXBkYXRlTXV0YXRpb24oe1xuICAgICAgaWQ6IHN1Y2Nlc3Nvci5pZCxcbiAgICAgIG11dGF0aW9uOiB7Li4uc3VjY2Vzc29yLm11dGF0aW9uLCBiYXNlVmVyc2lvbjogc2VydmVyVmVyc2lvbn1cbiAgICB9KVxuICB9XG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIHN5bmMgd29yayB3aXRoIHRoZSBzYW1lIGtleSBzbyBjYWxsZXJzIGRvIG5vdCBoYXZlIHRvIGtlZXAgYXBwLWxvY2FsIGxvY2tzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gTG9jayBrZXkuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gY2FsbGJhY2sgLSBXb3JrIHRvIHJ1biBvbmNlIHByZXZpb3VzIHdvcmsgZmluaXNoZWQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHNpbmdsZUZsaWdodChrZXksIGNhbGxiYWNrKSB7XG4gICAgd2hpbGUgKHN5bmNUYXNrUHJvbWlzZXMuaGFzKGtleSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHN5bmNUYXNrUHJvbWlzZXMuZ2V0KGtleSlcbiAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgICAvLyBUaGUgZmFpbGVkIGZsaWdodCdzIG93biBjYWxsZXIgb2JzZXJ2ZXMgdGhhdCByZWplY3Rpb247IGNhbGxlcnMgcXVldWVkXG4gICAgICAgIC8vIGJlaGluZCBpdCBzdGlsbCBydW4gdGhlaXIgb3duIHdvcmsgc28gcGVuZGluZyByb3dzIHJldHJ5IGFmdGVyIHRoZSBsb2NrIGNsZWFycy5cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlID0gY2FsbGJhY2soKVxuICAgIHN5bmNUYXNrUHJvbWlzZXMuc2V0KGtleSwgcHJvbWlzZSlcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBwcm9taXNlXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChzeW5jVGFza1Byb21pc2VzLmdldChrZXkpID09PSBwcm9taXNlKSBzeW5jVGFza1Byb21pc2VzLmRlbGV0ZShrZXkpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFB1bGxzIGJhY2tlbmQgc3luYyBjaGFuZ2VzIHdpdGggYSBmcmFtZXdvcmstbWFuYWdlZCBjdXJzb3Igcm93LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFB1bGwgYXJncy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXV0aGVudGljYXRpb25Ub2tlbiAtIEF1dGggdG9rZW4gdG8gc2VuZCB3aXRoIGNoYW5nZSByZXF1ZXN0cy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmJhdGNoU2l6ZV0gLSBNYXggc3luY3MgcGVyIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGFyZ3MuY3Vyc29yTW9kZWwgLSBNb2RlbCB0aGF0IHJlc3BvbmRzIHRvIGZpbmRCeS9maW5kT3JJbml0aWFsaXplQnkgZm9yIGN1cnNvciBwZXJzaXN0ZW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuY3Vyc29yS2V5IC0gQ3Vyc29yIG9wdGlvbiBrZXkuXG4gICAqIEBwYXJhbSB7KHBheWxvYWQ6IFN5bmNDaGFuZ2VzUmVxdWVzdCkgPT4gUHJvbWlzZTxTeW5jQ2hhbmdlc1Jlc3BvbnNlPn0gYXJncy5wb3N0Q2hhbmdlcyAtIFBvc3RzIG9uZSBjaGFuZ2VzIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgU3luY1Jlc291cmNlQ29uZmlnPn0gYXJncy5yZXNvdXJjZXMgLSBSZXNvdXJjZSBwb2xpY2llcy5cbiAgICogQHBhcmFtIHsocHJvZ3Jlc3M6IGltcG9ydChcIi4vc3luYy1hcGktY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNQdWxsUHJvZ3Jlc3MpID0+IHZvaWR9IFthcmdzLm9uUHJvZ3Jlc3NdIC0gUHJvZ3Jlc3MgY2FsbGJhY2suXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFN5bmNDaGFuZ2VzUmVzdWx0Pn0gUHVsbCByZXN1bHQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcHVsbENoYW5nZXNXaXRoQ3Vyc29yKGFyZ3MpIHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wdWxsQ2hhbmdlcyh7XG4gICAgICBhdXRoZW50aWNhdGlvblRva2VuOiBhcmdzLmF1dGhlbnRpY2F0aW9uVG9rZW4sXG4gICAgICBiYXRjaFNpemU6IGFyZ3MuYmF0Y2hTaXplLFxuICAgICAgbG9hZEN1cnNvcjogYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5sb2FkU3luY0N1cnNvcih7Y3Vyc29yS2V5OiBhcmdzLmN1cnNvcktleSwgY3Vyc29yTW9kZWw6IGFyZ3MuY3Vyc29yTW9kZWx9KSxcbiAgICAgIHNhdmVDdXJzb3I6IGFzeW5jIChjdXJzb3IpID0+IGF3YWl0IHRoaXMuc2F2ZVN5bmNDdXJzb3Ioe2N1cnNvciwgY3Vyc29yS2V5OiBhcmdzLmN1cnNvcktleSwgY3Vyc29yTW9kZWw6IGFyZ3MuY3Vyc29yTW9kZWx9KSxcbiAgICAgIHBvc3RDaGFuZ2VzOiBhcmdzLnBvc3RDaGFuZ2VzLFxuICAgICAgYXBwbHlTeW5jOiB0aGlzLnJlc291cmNlQXBwbGllcihhcmdzLnJlc291cmNlcyksXG4gICAgICBvblByb2dyZXNzOiBhcmdzLm9uUHJvZ3Jlc3NcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIGEgcGVyc2lzdGVkIHN5bmMgY3Vyc29yIGZyb20gYSBtb2RlbCByb3cgd2l0aCBhIHZhbHVlIGNvbHVtbi5cbiAgICogQHBhcmFtIHt7Y3Vyc29yS2V5OiBzdHJpbmcsIGN1cnNvck1vZGVsOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn19IGFyZ3MgLSBDdXJzb3IgYXJncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgbnVsbD59IFBlcnNpc3RlZCBjdXJzb3IgcGF5bG9hZC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBsb2FkU3luY0N1cnNvcih7Y3Vyc29yS2V5LCBjdXJzb3JNb2RlbH0pIHtcbiAgICBjb25zdCBvcHRpb24gPSBhd2FpdCBjdXJzb3JNb2RlbC5maW5kQnkoe2tleTogY3Vyc29yS2V5fSlcblxuICAgIHJldHVybiBvcHRpb24gPyBvcHRpb24udmFsdWUoKSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyBhIHBlcnNpc3RlZCBzeW5jIGN1cnNvciB0byBhIG1vZGVsIHJvdyB3aXRoIGEgdmFsdWUgY29sdW1uLlxuICAgKiBAcGFyYW0ge3tjdXJzb3I6IFN5bmNDdXJzb3IsIGN1cnNvcktleTogc3RyaW5nLCBjdXJzb3JNb2RlbDogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59fSBhcmdzIC0gQ3Vyc29yIGFyZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHNhdmVTeW5jQ3Vyc29yKHtjdXJzb3IsIGN1cnNvcktleSwgY3Vyc29yTW9kZWx9KSB7XG4gICAgaWYgKCFjdXJzb3IpIHJldHVyblxuXG4gICAgY29uc3Qgb3B0aW9uID0gYXdhaXQgY3Vyc29yTW9kZWwuZmluZE9ySW5pdGlhbGl6ZUJ5KHtrZXk6IGN1cnNvcktleX0pXG5cbiAgICBvcHRpb24uYXNzaWduKHt2YWx1ZTogSlNPTi5zdHJpbmdpZnkoY3Vyc29yKX0pXG4gICAgaWYgKG9wdGlvbi5pc0NoYW5nZWQoKSkgYXdhaXQgb3B0aW9uLnNhdmUoKVxuICB9XG5cbiAgLyoqXG4gICAqIFB1bGxzIGJhY2tlbmQgc3luYyBjaGFuZ2VzIGluIHN0YWJsZSBwYWdlcywgYXBwbGllcyB0aGVtIGxvY2FsbHksIGFuZCBzdG9yZXNcbiAgICogdGhlIGFja25vd2xlZGdlZCBjdXJzb3IuIEFwcHMgcHJvdmlkZSBvbmx5IGF1dGgsIHBlcnNpc3RlbmNlLCB0cmFuc3BvcnQsIGFuZFxuICAgKiByZXNvdXJjZSBwb2xpY3kgaG9va3MuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gUHVsbCBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdXRoZW50aWNhdGlvblRva2VuIC0gQXV0aCB0b2tlbiB0byBzZW5kIHdpdGggY2hhbmdlIHJlcXVlc3RzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuYmF0Y2hTaXplXSAtIE1heCBzeW5jcyBwZXIgcmVxdWVzdC4gRGVmYXVsdHMgdG8gMTAwLlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8U3luY0N1cnNvciB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQ+fSBhcmdzLmxvYWRDdXJzb3IgLSBMb2FkcyB0aGUgcGVyc2lzdGVkIGxvY2FsIGN1cnNvci5cbiAgICogQHBhcmFtIHsoY3Vyc29yOiBTeW5jQ3Vyc29yKSA9PiBQcm9taXNlPHZvaWQ+fSBhcmdzLnNhdmVDdXJzb3IgLSBQZXJzaXN0cyB0aGUgZmluYWwgYWNrbm93bGVkZ2VkIGN1cnNvci5cbiAgICogQHBhcmFtIHsocGF5bG9hZDogU3luY0NoYW5nZXNSZXF1ZXN0KSA9PiBQcm9taXNlPFN5bmNDaGFuZ2VzUmVzcG9uc2U+fSBhcmdzLnBvc3RDaGFuZ2VzIC0gUG9zdHMgb25lIGNoYW5nZXMgcmVxdWVzdC5cbiAgICogQHBhcmFtIHsoc3luYzogU3luY0NoYW5nZUVudmVsb3BlKSA9PiBQcm9taXNlPFN5bmNDaGFuZ2VBcHBseVJlc3VsdD59IGFyZ3MuYXBwbHlTeW5jIC0gQXBwbGllcyBvbmUgbm9ybWFsaXplZCBzeW5jIHJvdyBsb2NhbGx5LlxuICAgKiBAcGFyYW0geyhwcm9ncmVzczogaW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1B1bGxQcm9ncmVzcykgPT4gdm9pZH0gW2FyZ3Mub25Qcm9ncmVzc10gLSBQcm9ncmVzcyBjYWxsYmFjayBpbnZva2VkIHBlciBhcHBsaWVkIHBhZ2UgKGFuZCBvbmNlIGZvciBhbiBlbXB0eSBwdWxsKSB3aXRoIHRoZSBhcHBsaWVkIGNvdW50cyBhbmQgdGhlIHN0YWJsZSBzZXJ2ZXIgdG90YWwuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFN5bmNDaGFuZ2VzUmVzdWx0Pn0gUHVsbCByZXN1bHQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcHVsbENoYW5nZXMoYXJncykge1xuICAgIGxldCBhZnRlckN1cnNvciA9IHRoaXMuc3luY0N1cnNvckZyb21QYXlsb2FkKGF3YWl0IGFyZ3MubG9hZEN1cnNvcigpKVxuICAgIGxldCB1cFRvQ3Vyc29yID0gbnVsbFxuICAgIGxldCBwYWdlcyA9IDBcbiAgICBsZXQgc3luY2VkQ291bnQgPSAwXG4gICAgbGV0IHRvdGFsID0gMFxuICAgIGxldCBjaGFuZ2VkID0gZmFsc2VcbiAgICBjb25zdCByZXNvdXJjZUNvdW50cyA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgbnVtYmVyPn0gKi8gKHt9KVxuICAgIGNvbnN0IHJlc291cmNlQ2hhbmdlZCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYm9vbGVhbj59ICovICh7fSlcbiAgICBjb25zdCBiYXRjaFNpemUgPSB0aGlzLm5vcm1hbGl6ZWRCYXRjaFNpemUoYXJncy5iYXRjaFNpemUpXG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgY29uc3QgY2hhbmdlc1Jlc3BvbnNlID0gYXdhaXQgdGhpcy5jaGFuZ2VzUGFnZSh7Li4uYXJncywgYWZ0ZXJDdXJzb3IsIGJhdGNoU2l6ZSwgdXBUb0N1cnNvcn0pXG4gICAgICBjb25zdCBzeW5jcyA9IGNoYW5nZXNSZXNwb25zZS5zeW5jc1xuXG4gICAgICBpZiAoIXVwVG9DdXJzb3IpIHVwVG9DdXJzb3IgPSBjaGFuZ2VzUmVzcG9uc2UudXBUb0N1cnNvclxuXG4gICAgICAvLyBUaGUgc2VydmVyIGNvdW50cyBwZW5kaW5nIHJvd3MgZnJvbSB0aGlzIHJlcXVlc3QncyBjdXJzb3IsIHNvIGFscmVhZHktYXBwbGllZFxuICAgICAgLy8gcGFnZXMgcGx1cyB0aGlzIHJlcXVlc3QncyBjb3VudCBzdGF5cyB0aGUgc2FtZSB0b3RhbCBhY3Jvc3MgZXZlcnkgcGFnZTogYSBzdGFibGVcbiAgICAgIC8vIFwib2YgWVwiIGRlbm9taW5hdG9yIGV2ZW4gYXMgdGhlIGN1cnNvciBhZHZhbmNlcy4gQSBzZXJ2ZXIgdGhhdCBkb2Vzbid0IHJlcG9ydCB0aGVcbiAgICAgIC8vIGNvdW50IGF0IGFsbCBsZWF2ZXMgdGhlIHRvdGFsIGF0IDAgZm9yIGV2ZXJ5IHBhZ2UgcmF0aGVyIHRoYW4gZHJpZnRpbmcgdXB3YXJkc1xuICAgICAgLy8gd2l0aCB0aGUgYXBwbGllZCByb3dzLlxuICAgICAgaWYgKGNoYW5nZXNSZXNwb25zZS50b3RhbCAhPT0gbnVsbCkgdG90YWwgPSBzeW5jZWRDb3VudCArIGNoYW5nZXNSZXNwb25zZS50b3RhbFxuXG4gICAgICBpZiAoc3luY3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIFJlcG9ydCB0aGUgdGVybWluYWwgcHJvZ3Jlc3Mgb25jZSBmb3IgYW4gZW50aXJlbHkgZW1wdHkgcHVsbCBzbyBjb25zdW1lcnMgb2JzZXJ2ZVxuICAgICAgICAvLyB0b3RhbCAwOyBhIHB1bGwgdGhhdCBhbHJlYWR5IGFwcGxpZWQgcGFnZXMgcmVwb3J0ZWQgaXRzIGZpbmFsIGNvdW50cyBvbiBpdHMgbGFzdCBwYWdlLlxuICAgICAgICBpZiAocGFnZXMgPT09IDAgJiYgYXJncy5vblByb2dyZXNzKSBhcmdzLm9uUHJvZ3Jlc3Moe3BhZ2VzLCBzeW5jZWRDb3VudCwgdG90YWx9KVxuXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIHBhZ2VzICs9IDFcblxuICAgICAgLy8gQ29hbGVzY2UgcmVjb3JkLWNoYW5nZSBldmVudHMgYWNyb3NzIHRoaXMgcGFnZSdzIGFwcGxpZXMgc28gTiBhcHBsaWVkIHJvd3MgdHJpZ2dlciBvbmVcbiAgICAgIC8vIGxpdmUtcXVlcnkgcmUtcnVuLiBPbmx5IHRoZSBhcHBseSBsb29wIGlzIGJhdGNoZWQ6IHRoZSBuZXR3b3JrIHBhZ2UgZmV0Y2ggYWJvdmUgYW5kIHRoZVxuICAgICAgLy8gY3Vyc29yIHNhdmUgYmVsb3cgc3RheSBvdXRzaWRlLCBzbyBsaXZlIHF1ZXJpZXMgZmx1c2ggcmlnaHQgYWZ0ZXIgdGhlIGFwcGxpZXMgaW5zdGVhZCBvZlxuICAgICAgLy8gd2FpdGluZyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHB1bGwuXG4gICAgICBhd2FpdCByZWNvcmRDaGFuZ2VzLmJhdGNoKGFzeW5jICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBzeW5jIG9mIHN5bmNzKSB7XG4gICAgICAgICAgY29uc3QgYXBwbHlSZXN1bHQgPSBhd2FpdCBhcmdzLmFwcGx5U3luYyhzeW5jKVxuICAgICAgICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IGFwcGx5UmVzdWx0LnJlc291cmNlVHlwZSA/PyBzeW5jLnJlc291cmNlVHlwZSgpXG5cbiAgICAgICAgICBjaGFuZ2VkIHx8PSBhcHBseVJlc3VsdC5jaGFuZ2VkID09PSB0cnVlXG4gICAgICAgICAgc3luY2VkQ291bnQgKz0gMVxuXG4gICAgICAgICAgaWYgKHJlc291cmNlVHlwZSkge1xuICAgICAgICAgICAgcmVzb3VyY2VDb3VudHNbcmVzb3VyY2VUeXBlXSA9IChyZXNvdXJjZUNvdW50c1tyZXNvdXJjZVR5cGVdIHx8IDApICsgMVxuICAgICAgICAgICAgcmVzb3VyY2VDaGFuZ2VkW3Jlc291cmNlVHlwZV0gfHw9IGFwcGx5UmVzdWx0LmNoYW5nZWQgPT09IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG5cbiAgICAgIGFmdGVyQ3Vyc29yID0gY2hhbmdlc1Jlc3BvbnNlLm5leHRDdXJzb3JcblxuICAgICAgaWYgKGFyZ3Mub25Qcm9ncmVzcykgYXJncy5vblByb2dyZXNzKHtwYWdlcywgc3luY2VkQ291bnQsIHRvdGFsfSlcbiAgICAgIGlmIChzeW5jcy5sZW5ndGggPCBiYXRjaFNpemUpIGJyZWFrXG4gICAgfVxuXG4gICAgaWYgKGFmdGVyQ3Vyc29yKSBhd2FpdCBhcmdzLnNhdmVDdXJzb3IoYWZ0ZXJDdXJzb3IpXG5cbiAgICByZXR1cm4ge2NoYW5nZWQsIHBhZ2VzLCByZXNvdXJjZUNoYW5nZWQsIHJlc291cmNlQ291bnRzLCBzeW5jZWRDb3VudCwgdG90YWx9XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBhbmQgdmFsaWRhdGVzIG9uZSBiYWNrZW5kIHN5bmMgY2hhbmdlcyBwYWdlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFBhZ2UgYXJncy5cbiAgICogQHBhcmFtIHtTeW5jQ3Vyc29yfSBhcmdzLmFmdGVyQ3Vyc29yIC0gTGFzdCBhY2tub3dsZWRnZWQgY3Vyc29yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdXRoZW50aWNhdGlvblRva2VuIC0gQXV0aCB0b2tlbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuYmF0Y2hTaXplIC0gUGFnZSBzaXplLlxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiBTeW5jQ2hhbmdlc1JlcXVlc3QpID0+IFByb21pc2U8U3luY0NoYW5nZXNSZXNwb25zZT59IGFyZ3MucG9zdENoYW5nZXMgLSBDaGFuZ2VzIHBvc3Rlci5cbiAgICogQHBhcmFtIHtTeW5jQ3Vyc29yfSBhcmdzLnVwVG9DdXJzb3IgLSBTbmFwc2hvdCB1cHBlci1ib3VuZCBjdXJzb3IuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtuZXh0Q3Vyc29yOiBTeW5jQ3Vyc29yLCBzeW5jczogU3luY0NoYW5nZUVudmVsb3BlW10sIHRvdGFsOiBudW1iZXIgfCBudWxsLCB1cFRvQ3Vyc29yOiBTeW5jQ3Vyc29yfT59IE5vcm1hbGl6ZWQgY2hhbmdlcyBwYWdlLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGNoYW5nZXNQYWdlKHthZnRlckN1cnNvciwgYXV0aGVudGljYXRpb25Ub2tlbiwgYmF0Y2hTaXplLCBwb3N0Q2hhbmdlcywgdXBUb0N1cnNvcn0pIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHBvc3RDaGFuZ2VzKHtcbiAgICAgIGF1dGhlbnRpY2F0aW9uVG9rZW4sXG4gICAgICBsaW1pdDogYmF0Y2hTaXplLFxuICAgICAgLi4udGhpcy5jdXJzb3JQYXlsb2FkKFwiYWZ0ZXJcIiwgYWZ0ZXJDdXJzb3IpLFxuICAgICAgLi4udGhpcy5jdXJzb3JQYXlsb2FkKFwidXBUb1wiLCB1cFRvQ3Vyc29yKVxuICAgIH0pXG5cbiAgICB0aGlzLmVuc3VyZVN1Y2Nlc3NmdWxDaGFuZ2VzUmVzcG9uc2UocmVzcG9uc2UpXG5cbiAgICBjb25zdCBzeW5jcyA9IC8qKiBAdHlwZSB7dW5rbm93bltdfSAqLyAocmVzcG9uc2Uuc3luY3MpXG5cbiAgICByZXR1cm4ge1xuICAgICAgbmV4dEN1cnNvcjogdGhpcy5zeW5jQ3Vyc29yRnJvbVBheWxvYWQocmVzcG9uc2UubmV4dEN1cnNvciA/PyBudWxsKSxcbiAgICAgIHN5bmNzOiBzeW5jcy5tYXAoKHN5bmNQYXlsb2FkKSA9PiB0aGlzLnN5bmNFbnZlbG9wZUZyb21QYXlsb2FkKHN5bmNQYXlsb2FkKSksXG4gICAgICB0b3RhbDogb3B0aW9uYWxJbnRlZ2VyKHJlc3BvbnNlLnRvdGFsKSxcbiAgICAgIHVwVG9DdXJzb3I6IHRoaXMuc3luY0N1cnNvckZyb21QYXlsb2FkKHJlc3BvbnNlLnVwVG9DdXJzb3IgPz8gbnVsbClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIEFQSSByZXNwb25zZSBzdGF0dXMgYW5kIHNoYXBlIGZvciBjaGFuZ2UtZmVlZCBwdWxscy5cbiAgICogQHBhcmFtIHtTeW5jQ2hhbmdlc1Jlc3BvbnNlfSByZXNwb25zZSAtIENoYW5nZXMgcmVzcG9uc2UuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIGVuc3VyZVN1Y2Nlc3NmdWxDaGFuZ2VzUmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSBcImVycm9yXCIpIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5lcnJvck1lc3NhZ2UgfHwgXCJTeW5jIGNoYW5nZXMgZmFpbGVkXCIpXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJlc3BvbnNlLnN5bmNzKSkgdGhyb3cgbmV3IEVycm9yKFwiU3luYyBjaGFuZ2VzIHJlc3BvbnNlIG1pc3Npbmcgc3luY3NcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGN1cnNvciBpbnRvIHJlcXVlc3QgcGFyYW1zIHdpdGggdGhlIGdpdmVuIHByZWZpeC5cbiAgICogQHBhcmFtIHtcImFmdGVyXCIgfCBcInVwVG9cIn0gcHJlZml4IC0gUmVxdWVzdCBmaWVsZCBwcmVmaXguXG4gICAqIEBwYXJhbSB7U3luY0N1cnNvcn0gY3Vyc29yIC0gQ3Vyc29yIHRvIHNlcmlhbGl6ZS5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlciB8IG51bGw+fSBSZXF1ZXN0IHBhcmFtcy5cbiAgICovXG4gIHN0YXRpYyBjdXJzb3JQYXlsb2FkKHByZWZpeCwgY3Vyc29yKSB7XG4gICAgaWYgKCFjdXJzb3IpIHJldHVybiB7fVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIFtgJHtwcmVmaXh9SWRgXTogY3Vyc29yLmlkLFxuICAgICAgLi4uKGN1cnNvci5zZXJ2ZXJTZXF1ZW5jZSA/IHtbYCR7cHJlZml4fVNlcnZlclNlcXVlbmNlYF06IGN1cnNvci5zZXJ2ZXJTZXF1ZW5jZX0gOiB7fSksXG4gICAgICBbYCR7cHJlZml4fVVwZGF0ZWRBdGBdOiBjdXJzb3IudXBkYXRlZEF0XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhIHBlcnNpc3RlZCBvciByZXNwb25zZSBjdXJzb3IgcGF5bG9hZC5cbiAgICogQHBhcmFtIHtTeW5jQ3Vyc29yIHwgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+IHwgbnVsbCB8IHVuZGVmaW5lZH0gcGF5bG9hZCAtIEN1cnNvciBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7U3luY0N1cnNvcn0gUGFyc2VkIGN1cnNvci5cbiAgICovXG4gIHN0YXRpYyBzeW5jQ3Vyc29yRnJvbVBheWxvYWQocGF5bG9hZCkge1xuICAgIGlmICghcGF5bG9hZCkgcmV0dXJuIG51bGxcblxuICAgIGlmICh0eXBlb2YgcGF5bG9hZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luY0N1cnNvckZyb21QYXlsb2FkKEpTT04ucGFyc2UocGF5bG9hZCkpXG4gICAgICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHtpZDogbnVsbCwgc2VydmVyU2VxdWVuY2U6IG51bGwsIHVwZGF0ZWRBdDogcGF5bG9hZH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHBheWxvYWQgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShwYXlsb2FkKSkgcmV0dXJuIG51bGxcblxuICAgIGNvbnN0IHVwZGF0ZWRBdCA9IHR5cGVvZiBwYXlsb2FkLnVwZGF0ZWRBdCA9PT0gXCJzdHJpbmdcIiA/IHBheWxvYWQudXBkYXRlZEF0IDogbnVsbFxuXG4gICAgaWYgKCF1cGRhdGVkQXQpIHJldHVybiBudWxsXG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHBheWxvYWQuaWQgPT09IG51bGwgfHwgcGF5bG9hZC5pZCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IFN0cmluZyhwYXlsb2FkLmlkKSxcbiAgICAgIHNlcnZlclNlcXVlbmNlOiBvcHRpb25hbEludGVnZXIocGF5bG9hZC5zZXJ2ZXJTZXF1ZW5jZSA9PT0gXCJcIiA/IG51bGwgOiBwYXlsb2FkLnNlcnZlclNlcXVlbmNlKSxcbiAgICAgIHVwZGF0ZWRBdFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBub3JtYWxpemVkIHN5bmMgcm93IGFkYXB0ZXIuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHBheWxvYWQgLSBSYXcgc3luYyBwYXlsb2FkLlxuICAgKiBAcmV0dXJucyB7U3luY0NoYW5nZUVudmVsb3BlfSBTeW5jIHJvdyBhZGFwdGVyLlxuICAgKi9cbiAgc3RhdGljIHN5bmNFbnZlbG9wZUZyb21QYXlsb2FkKHBheWxvYWQpIHtcbiAgICBpZiAoIXBheWxvYWQgfHwgdHlwZW9mIHBheWxvYWQgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShwYXlsb2FkKSkgdGhyb3cgbmV3IEVycm9yKFwiU3luYyBjaGFuZ2VzIGVudHJ5IG11c3QgYmUgYW4gb2JqZWN0XCIpXG5cbiAgICBjb25zdCBzeW5jUGF5bG9hZCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqLyAocGF5bG9hZClcblxuICAgIHJldHVybiB7XG4gICAgICBkYXRhOiAoKSA9PiBzeW5jUGF5bG9hZC5kYXRhLFxuICAgICAgaWQ6ICgpID0+IHN5bmNQYXlsb2FkLmlkLFxuICAgICAgcmVzb3VyY2VJZDogKCkgPT4gc3luY1BheWxvYWQucmVzb3VyY2VJZCxcbiAgICAgIHJlc291cmNlVHlwZTogKCkgPT4gc3luY1BheWxvYWQucmVzb3VyY2VUeXBlID09PSBudWxsIHx8IHN5bmNQYXlsb2FkLnJlc291cmNlVHlwZSA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IFN0cmluZyhzeW5jUGF5bG9hZC5yZXNvdXJjZVR5cGUpLFxuICAgICAgc3luY1R5cGU6ICgpID0+IHN5bmNQYXlsb2FkLnN5bmNUeXBlID09PSBudWxsIHx8IHN5bmNQYXlsb2FkLnN5bmNUeXBlID09PSB1bmRlZmluZWQgPyBcIlwiIDogU3RyaW5nKHN5bmNQYXlsb2FkLnN5bmNUeXBlKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYW4gYXBwLWNvbmZpZ3VyZWQgcmVzb3VyY2UgYXBwbGllciBmb3IgcHVsbGVkIHN5bmMgcm93cy4gVGhlIHN5bmNcbiAgICogbWVjaGFuaWNzIHN0YXkgaGVyZTsgYXBwcyBvbmx5IGRlY2xhcmUgd2hpY2ggbW9kZWxzL2F0dHJpYnV0ZXMvaG9va3MgYXJlXG4gICAqIGFsbG93ZWQgZm9yIGVhY2ggcmVzb3VyY2UgdHlwZS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBTeW5jUmVzb3VyY2VDb25maWc+fSByZXNvdXJjZXMgLSBSZXNvdXJjZSBwb2xpY3kgbWFwLlxuICAgKiBAcGFyYW0geyhyZWNvcmQ6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+KSA9PiAoKSA9PiB2b2lkfSBbb25SZWNvcmRdIC0gQ2FsbGVkIHdpdGggZWFjaCByZWNvcmQgYWJvdXQgdG8gYmUgd3JpdHRlbjsgcmV0dXJucyBhIHJlbGVhc2UgY2FsbGJhY2sgaW52b2tlZCBhZnRlciB0aGUgd3JpdGUgKHVzZWQgZm9yIGVjaG8gc3VwcHJlc3Npb24pLlxuICAgKiBAcmV0dXJucyB7KHN5bmM6IFN5bmNDaGFuZ2VFbnZlbG9wZSkgPT4gUHJvbWlzZTxTeW5jQ2hhbmdlQXBwbHlSZXN1bHQ+fSBTeW5jIGFwcGx5IGNhbGxiYWNrLlxuICAgKi9cbiAgc3RhdGljIHJlc291cmNlQXBwbGllcihyZXNvdXJjZXMsIG9uUmVjb3JkKSB7XG4gICAgcmV0dXJuIGFzeW5jIChzeW5jKSA9PiBhd2FpdCB0aGlzLmFwcGx5UmVzb3VyY2VTeW5jKHtvblJlY29yZCwgcmVzb3VyY2VzLCBzeW5jfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIG9uZSBzeW5jIHJvdyB1c2luZyBkZWNsYXJhdGl2ZSByZXNvdXJjZSBwb2xpY3kuXG4gICAqIEBwYXJhbSB7e3Jlc291cmNlczogUmVjb3JkPHN0cmluZywgU3luY1Jlc291cmNlQ29uZmlnPiwgc3luYzogU3luY0NoYW5nZUVudmVsb3BlLCBvblJlY29yZD86IChyZWNvcmQ6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+KSA9PiAoKSA9PiB2b2lkfX0gYXJncyAtIEFwcGx5IGFyZ3MuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFN5bmNDaGFuZ2VBcHBseVJlc3VsdD59IEFwcGx5IHJlc3VsdC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBhcHBseVJlc291cmNlU3luYyh7b25SZWNvcmQsIHJlc291cmNlcywgc3luY30pIHtcbiAgICBjb25zdCByZXNvdXJjZVR5cGUgPSBzeW5jLnJlc291cmNlVHlwZSgpXG4gICAgY29uc3QgcmVzb3VyY2UgPSByZXNvdXJjZVR5cGUgPyByZXNvdXJjZXNbcmVzb3VyY2VUeXBlXSA6IHVuZGVmaW5lZFxuXG4gICAgaWYgKCFyZXNvdXJjZSB8fCAhcmVzb3VyY2UuZW5hYmxlZCkgcmV0dXJuIHtjaGFuZ2VkOiBmYWxzZSwgcmVzb3VyY2VUeXBlfVxuXG4gICAgaWYgKHN5bmMuc3luY1R5cGUoKSA9PT0gXCJkZWxldGVcIikge1xuICAgICAgcmV0dXJuIHtjaGFuZ2VkOiBhd2FpdCB0aGlzLmRlc3Ryb3lTeW5jZWRSZXNvdXJjZSh7b25SZWNvcmQsIHJlc291cmNlLCBzeW5jfSksIHJlc291cmNlVHlwZX1cbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gdGhpcy5zeW5jRGF0YShzeW5jKVxuICAgIGNvbnN0IHJlY29yZCA9IHJlc291cmNlLmZpbmRSZWNvcmQgPyBhd2FpdCByZXNvdXJjZS5maW5kUmVjb3JkKHtkYXRhLCByZXNvdXJjZUlkOiBzeW5jLnJlc291cmNlSWQoKSwgc3luY30pIDogYXdhaXQgcmVzb3VyY2UubW9kZWxDbGFzcy5maW5kT3JJbml0aWFsaXplQnkoe2lkOiBkYXRhLmlkID8/IHN5bmMucmVzb3VyY2VJZCgpfSlcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gYXdhaXQgcmVzb3VyY2UuYXR0cmlidXRlcyh7ZGF0YSwgcmVjb3JkLCBzeW5jfSlcbiAgICBjb25zdCByZWxlYXNlUmVjb3JkID0gb25SZWNvcmQgPyBvblJlY29yZChyZWNvcmQpIDogbnVsbFxuICAgIGxldCBjaGFuZ2VkID0gZmFsc2VcblxuICAgIHRyeSB7XG4gICAgICByZWNvcmQuYXNzaWduKGF0dHJpYnV0ZXMpXG5cbiAgICAgIGlmIChyZWNvcmQuaXNDaGFuZ2VkKCkpIHtcbiAgICAgICAgYXdhaXQgcmVjb3JkLnNhdmUoKVxuICAgICAgICBjaGFuZ2VkID0gdHJ1ZVxuICAgICAgfVxuXG4gICAgICBpZiAocmVzb3VyY2UuYWZ0ZXJBcHBseSkge1xuICAgICAgICBjb25zdCBob29rQ2hhbmdlZCA9IGF3YWl0IHJlc291cmNlLmFmdGVyQXBwbHkoe2F0dHJpYnV0ZXMsIGRhdGEsIHJlY29yZCwgc3luY30pXG5cbiAgICAgICAgY2hhbmdlZCB8fD0gaG9va0NoYW5nZWQgPT09IHRydWVcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHJlbGVhc2VSZWNvcmQpIHJlbGVhc2VSZWNvcmQoKVxuICAgIH1cblxuICAgIHJldHVybiB7Y2hhbmdlZCwgcmVzb3VyY2VUeXBlfVxuICB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIGEgc3luY2VkIHJlc291cmNlIHZpYSBpdHMgZGVjbGFyZWQgbW9kZWwgcG9saWN5LlxuICAgKiBAcGFyYW0ge3tyZXNvdXJjZTogU3luY1Jlc291cmNlQ29uZmlnLCBzeW5jOiBTeW5jQ2hhbmdlRW52ZWxvcGUsIG9uUmVjb3JkPzogKHJlY29yZDogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4pID0+ICgpID0+IHZvaWR9fSBhcmdzIC0gRGVzdHJveSBhcmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gV2hldGhlciBhIGxvY2FsIHJvdyB3YXMgZGVzdHJveWVkLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGRlc3Ryb3lTeW5jZWRSZXNvdXJjZSh7b25SZWNvcmQsIHJlc291cmNlLCBzeW5jfSkge1xuICAgIGNvbnN0IGlkID0gc3luYy5yZXNvdXJjZUlkKClcbiAgICBjb25zdCByZWNvcmQgPSByZXNvdXJjZS5maW5kUmVjb3JkRm9yRGVsZXRlID8gYXdhaXQgcmVzb3VyY2UuZmluZFJlY29yZEZvckRlbGV0ZSh7cmVzb3VyY2VJZDogaWQsIHN5bmN9KSA6IGF3YWl0IHJlc291cmNlLm1vZGVsQ2xhc3MuZmluZEJ5KHtpZH0pXG5cbiAgICBpZiAoIXJlY29yZCkgcmV0dXJuIGZhbHNlXG5cbiAgICBjb25zdCByZWxlYXNlUmVjb3JkID0gb25SZWNvcmQgPyBvblJlY29yZChyZWNvcmQpIDogbnVsbFxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJlY29yZC5kZXN0cm95KClcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHJlbGVhc2VSZWNvcmQpIHJlbGVhc2VSZWNvcmQoKVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIHRoZSBlbWJlZGRlZCBzeW5jIGRhdGEgSlNPTi9vYmplY3QuXG4gICAqIEBwYXJhbSB7U3luY0NoYW5nZUVudmVsb3BlfSBzeW5jIC0gU3luYyByb3cuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gU3luYyBkYXRhIG9iamVjdC5cbiAgICovXG4gIHN0YXRpYyBzeW5jRGF0YShzeW5jKSB7XG4gICAgY29uc3QgZGF0YSA9IHN5bmMuZGF0YSgpXG5cbiAgICBpZiAoIWRhdGEpIHRocm93IG5ldyBFcnJvcihgU3luYyAke3N5bmMuaWQoKX0gaXMgbWlzc2luZyBkYXRhYClcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIpIHJldHVybiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoSlNPTi5wYXJzZShkYXRhKSlcbiAgICBpZiAodHlwZW9mIGRhdGEgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoZGF0YSkpIHJldHVybiAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoZGF0YSlcblxuICAgIHRocm93IG5ldyBFcnJvcihgU3luYyAke3N5bmMuaWQoKX0gaGFzIGludmFsaWQgZGF0YWApXG4gIH1cblxuICAvKipcbiAgICogRHJhaW5zIHBlbmRpbmcgc3luYyByZWNvcmRzIGZyb20gYSBsb2NhbCBWZWxvY2lvdXMgbW9kZWwgaW4gc3RhYmxlIG9yZGVyLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFJlcGxheSBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdXRoZW50aWNhdGlvblRva2VuIC0gQXV0aCB0b2tlbiB0byBzZW5kIHdpdGggcmVwbGF5IHJlcXVlc3RzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuYmF0Y2hTaXplXSAtIE1heCBzeW5jcyBwZXIgcmVxdWVzdC5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gYXJncy5zeW5jTW9kZWwgLSBMb2NhbCBTeW5jIG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiB7YXV0aGVudGljYXRpb25Ub2tlbjogc3RyaW5nLCBzeW5jczogQXJyYXk8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pn0pID0+IFByb21pc2U8U3luY1JlcGxheVJlc3BvbnNlPn0gYXJncy5wb3N0UmVwbGF5IC0gUmVwbGF5IHBvc3Rlci5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcmVwbGF5TG9jYWxTeW5jcyhhcmdzKSB7XG4gICAgY29uc3QgcG9zdGVkU25hcHNob3RzQnlTeW5jSWQgPSBuZXcgTWFwKClcblxuICAgIGF3YWl0IHRoaXMucmVwbGF5UGVuZGluZyh7XG4gICAgICBhdXRoZW50aWNhdGlvblRva2VuOiBhcmdzLmF1dGhlbnRpY2F0aW9uVG9rZW4sXG4gICAgICBiYXRjaFNpemU6IGFyZ3MuYmF0Y2hTaXplLFxuICAgICAgbWFya1N1Y2Nlc3NmdWw6IGFzeW5jIChzeW5jKSA9PiB7XG4gICAgICAgIGNvbnN0IHN5bmNJZCA9ICgvKiogQHR5cGUge3tpZDogKCkgPT4gc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH19ICovIChzeW5jKSkuaWQoKVxuICAgICAgICAvLyBSZWxvYWQgd2l0aCB0aGUgcmVzb3VyY2UgcHJlbG9hZGVkIHNvIHJvd3MgcmVseWluZyBvbiB0aGUgcmVzb3VyY2UtYXR0cmlidXRlc1xuICAgICAgICAvLyBmYWxsYmFjayBpbiBsb2NhbFN5bmNEYXRhIGNvbXBhcmUgYWdhaW5zdCB0aGUgc2FtZSBzbmFwc2hvdCB0aGV5IHBvc3RlZC5cbiAgICAgICAgY29uc3QgY3VycmVudFN5bmMgPSBhd2FpdCBhcmdzLnN5bmNNb2RlbC5wcmVsb2FkKHtyZXNvdXJjZTogdHJ1ZX0pLndoZXJlKHtpZDogc3luY0lkfSkuZmlyc3QoKVxuXG4gICAgICAgIGlmICghY3VycmVudFN5bmMpIHJldHVyblxuICAgICAgICAvLyBBIHJvdyBlZGl0ZWQgd2hpbGUgaXRzIG9sZCBwYXlsb2FkIHdhcyBpbiBmbGlnaHQgc3RheXMgcGVuZGluZywgc28gdGhlXG4gICAgICAgIC8vIG5ld2VyIGxvY2FsIGNoYW5nZSByZXBsYXlzIG9uIHRoZSBuZXh0IGRyYWluIGluc3RlYWQgb2YgYmVpbmcgbG9zdC5cbiAgICAgICAgaWYgKHRoaXMubG9jYWxTeW5jUmVwbGF5U25hcHNob3QoY3VycmVudFN5bmMpICE9PSBwb3N0ZWRTbmFwc2hvdHNCeVN5bmNJZC5nZXQoU3RyaW5nKHN5bmNJZCkpKSByZXR1cm5cblxuICAgICAgICBhd2FpdCBjdXJyZW50U3luYy51cGRhdGUoe3N0YXRlOiBcInN1Y2Nlc3NcIn0pXG4gICAgICB9LFxuICAgICAgcGVuZGluZ1N5bmNzOiBhc3luYyAoKSA9PiBhd2FpdCBhcmdzLnN5bmNNb2RlbC5wcmVsb2FkKHtyZXNvdXJjZTogdHJ1ZX0pLndoZXJlKHtzdGF0ZTogXCJwZW5kaW5nXCJ9KS5vcmRlcihcImNyZWF0ZWRfYXRcIikudG9BcnJheSgpLFxuICAgICAgcG9zdFJlcGxheTogYXJncy5wb3N0UmVwbGF5LFxuICAgICAgc3luY0lkOiAoc3luYykgPT4gKC8qKiBAdHlwZSB7e2lkOiAoKSA9PiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfX0gKi8gKHN5bmMpKS5pZCgpLFxuICAgICAgc3luY1BheWxvYWQ6IChzeW5jKSA9PiB7XG4gICAgICAgIHBvc3RlZFNuYXBzaG90c0J5U3luY0lkLnNldChTdHJpbmcoKC8qKiBAdHlwZSB7e2lkOiAoKSA9PiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfX0gKi8gKHN5bmMpKS5pZCgpKSwgdGhpcy5sb2NhbFN5bmNSZXBsYXlTbmFwc2hvdChzeW5jKSlcblxuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbFN5bmNQYXlsb2FkKHN5bmMpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIHRoZSByZXBsYXktcmVsZXZhbnQgc3RhdGUgb2YgYSBsb2NhbCBzeW5jIHJvdyBmb3IgaW4tZmxpZ2h0IGNvbXBhcmlzb25zLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBzeW5jIC0gTG9jYWwgc3luYyByb3cuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFN0YWJsZSBzbmFwc2hvdCBvZiB0aGUgcm93J3MgcmVwbGF5ZWQgcGF5bG9hZC5cbiAgICovXG4gIHN0YXRpYyBsb2NhbFN5bmNSZXBsYXlTbmFwc2hvdChzeW5jKSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtkYXRhOiB0aGlzLmxvY2FsU3luY0RhdGEoc3luYyksIHN5bmNUeXBlOiBzeW5jLnN5bmNUeXBlKCl9KVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBvbmUgcmVwbGF5IGVudmVsb3BlIGZyb20gYSBsb2NhbCBzeW5jIHJvdy5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gc3luYyAtIExvY2FsIHN5bmMgcm93LlxuICAgKiBAcmV0dXJucyB7e2NsaWVudFVwZGF0ZWRBdD86IHN0cmluZywgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGlkOiBudW1iZXIsIHJlc291cmNlSWQ6IHN0cmluZywgcmVzb3VyY2VUeXBlOiBzdHJpbmcsIHN5bmNUeXBlOiBzdHJpbmd9fSBTeW5jIHJlcGxheSBlbnZlbG9wZS5cbiAgICovXG4gIHN0YXRpYyBsb2NhbFN5bmNQYXlsb2FkKHN5bmMpIHtcbiAgICBjb25zdCBjbGllbnRVcGRhdGVkQXQgPSBzeW5jLnVwZGF0ZWRBdCgpIHx8IHN5bmMuY3JlYXRlZEF0KClcblxuICAgIHJldHVybiB7XG4gICAgICBjbGllbnRVcGRhdGVkQXQ6IGNsaWVudFVwZGF0ZWRBdCA/IGNsaWVudFVwZGF0ZWRBdC50b0lTT1N0cmluZygpIDogdW5kZWZpbmVkLFxuICAgICAgZGF0YTogdGhpcy5sb2NhbFN5bmNEYXRhKHN5bmMpLFxuICAgICAgaWQ6IC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoc3luYy5pZCgpKSksXG4gICAgICByZXNvdXJjZUlkOiBTdHJpbmcoc3luYy5yZXNvdXJjZUlkKCkpLFxuICAgICAgcmVzb3VyY2VUeXBlOiBzeW5jLnJlc291cmNlVHlwZSgpIHx8IFwiXCIsXG4gICAgICBzeW5jVHlwZTogc3luYy5zeW5jVHlwZSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIG9uZSBsb2NhbCBzeW5jIHJvdyBwYXlsb2FkLCBmYWxsaW5nIGJhY2sgdG8gcHJlbG9hZGVkIHJlc291cmNlIGF0dHJpYnV0ZXMuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHN5bmMgLSBMb2NhbCBzeW5jIHJvdy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBTeW5jIGRhdGEuXG4gICAqL1xuICBzdGF0aWMgbG9jYWxTeW5jRGF0YShzeW5jKSB7XG4gICAgbGV0IHN5bmNEYXRhID0gLyoqIEB0eXBlIHtzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHN5bmMuZGF0YSgpIHx8IHt9KVxuXG4gICAgaWYgKHR5cGVvZiBzeW5jRGF0YSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3luY0RhdGEgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoSlNPTi5wYXJzZShzeW5jRGF0YSkpXG4gICAgICB9IGNhdGNoIChfZXJyb3IpIHtcbiAgICAgICAgc3luY0RhdGEgPSB7fVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChPYmplY3Qua2V5cyhzeW5jRGF0YSkubGVuZ3RoID4gMCkgcmV0dXJuIHN5bmNEYXRhXG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChzeW5jLnJlc291cmNlKCkuYXR0cmlidXRlcygpKVxuICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFF1ZXVlcyBhIGxvY2FsIHN5bmMgcm93IGZvciBhIFZlbG9jaW91cyBtb2RlbCByZXNvdXJjZS5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBRdWV1ZSBhcmdzLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBhcmdzLnJlc291cmNlIC0gUmVzb3VyY2UgYmVpbmcgc3luY2VkLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBhcmdzLnN5bmNNb2RlbCAtIExvY2FsIFN5bmMgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFthcmdzLmRhdGFdIC0gRXhwbGljaXQgc3luYyBkYXRhLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2FyZ3Muc3luY1R5cGVdIC0gU3luYyBvcGVyYXRpb24gdHlwZS5cbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gW2FyZ3MubG9jYWxPbmx5QXR0cmlidXRlc10gLSBBdHRyaWJ1dGVzIHRvIHN0cmlwIGZyb20gcXVldWVkIHBheWxvYWRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJncy5ib29sZWFuQXR0cmlidXRlc10gLSBBdHRyaWJ1dGVzIHRvIGNvZXJjZSB0aHJvdWdoIHN5bmMgYm9vbGVhbiBwYXJzaW5nLlxuICAgKiBAcGFyYW0geyhkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj59IFthcmdzLm5vcm1hbGl6ZURhdGFdIC0gQXBwLXNwZWNpZmljIGRhdGEgbm9ybWFsaXplci5cbiAgICogQHJldHVybnMge1Byb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBMb2NhbCBzeW5jIHJvdy5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBxdWV1ZUxvY2FsU3luYyhhcmdzKSB7XG4gICAgY29uc3QgcmVzb3VyY2VSZWNvcmRJZCA9IHNjYWxhck1vZGVsUHJpbWFyeUtleVZhbHVlKGFyZ3MucmVzb3VyY2UuaWQoKSwgXCJMb2NhbCBzeW5jIHF1ZXVlaW5nXCIpXG4gICAgY29uc3QgbW9kZWxDbGFzcyA9IGFyZ3MucmVzb3VyY2UuY29uc3RydWN0b3JcblxuICAgIGlmICh0eXBlb2YgbW9kZWxDbGFzcy5nZXRNb2RlbE5hbWUgIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIHJlc291cmNlIG1vZGVsIGNsYXNzIG11c3QgaW1wbGVtZW50IHN0YXRpYyBnZXRNb2RlbE5hbWUoKSB0byBxdWV1ZSBzeW5jIGRhdGEgLSBjbGFzcyBuYW1lcyBhcmUgbm90IHN0YWJsZSBhY3Jvc3MgZXhwbGljaXQgbW9kZWwgbmFtZXMgYW5kIG1pbmlmaWVkIGJ1bmRsZXNcIilcbiAgICB9XG5cbiAgICBjb25zdCByZXNvdXJjZVR5cGUgPSBtb2RlbENsYXNzLmdldE1vZGVsTmFtZSgpXG4gICAgY29uc3Qgc3luY0RhdGEgPSB0aGlzLnF1ZXVlZFN5bmNEYXRhKGFyZ3MpXG4gICAgY29uc3Qgc3luY1R5cGUgPSBhcmdzLnN5bmNUeXBlIHx8IFwidXBkYXRlXCJcblxuICAgIGlmICghcmVzb3VyY2VSZWNvcmRJZCkgdGhyb3cgbmV3IEVycm9yKFwicmVzb3VyY2UuaWQoKSBpcyByZXF1aXJlZCB0byBxdWV1ZSBzeW5jIGRhdGFcIilcblxuICAgIGNvbnN0IHJlc291cmNlSWQgPSBTdHJpbmcocmVzb3VyY2VSZWNvcmRJZClcbiAgICBjb25zdCBleGlzdGluZ1N5bmMgPSBhd2FpdCBhcmdzLnN5bmNNb2RlbC5maW5kQnkoe3Jlc291cmNlSWQsIHJlc291cmNlVHlwZX0pXG5cbiAgICBpZiAoZXhpc3RpbmdTeW5jKSB7XG4gICAgICBhd2FpdCBleGlzdGluZ1N5bmMudXBkYXRlKHtcbiAgICAgICAgZGF0YTogc3luY0RhdGEsXG4gICAgICAgIHN0YXRlOiBcInBlbmRpbmdcIixcbiAgICAgICAgc3luY1R5cGVcbiAgICAgIH0pXG5cbiAgICAgIHJldHVybiBleGlzdGluZ1N5bmNcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgYXJncy5zeW5jTW9kZWwuY3JlYXRlKHtcbiAgICAgIGRhdGE6IHN5bmNEYXRhLFxuICAgICAgcmVzb3VyY2VJZCxcbiAgICAgIHJlc291cmNlVHlwZSxcbiAgICAgIHN0YXRlOiBcInBlbmRpbmdcIixcbiAgICAgIHN5bmNUeXBlXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYmFja2VuZC1zYWZlIHF1ZXVlZCBzeW5jIGRhdGEgd2l0aG91dCBtdXRhdGluZyBjYWxsZXIgZGF0YS4gVGhlIGRlZmF1bHRcbiAgICogKG5vIGV4cGxpY2l0IGBkYXRhYCkgaXMgdGhlIHJlc291cmNlJ3MgYXR0cmlidXRlcyBtaW51cyBsb2NhbC1vbmx5IGF0dHJpYnV0ZXMsXG4gICAqIHdpdGggYm9vbGVhbnMgY29lcmNlZCBhbmQgRGF0ZSB2YWx1ZXMgc2VyaWFsaXplZCB0byBJU08gc3RyaW5ncywgc28gYXBwcyBkb24ndFxuICAgKiBuZWVkIHBlci1tb2RlbCB0cmFja2VkLXBheWxvYWQgYnVpbGRlcnMuXG4gICAqIEBwYXJhbSB7e3Jlc291cmNlOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBsb2NhbE9ubHlBdHRyaWJ1dGVzPzogc3RyaW5nW10sIGJvb2xlYW5BdHRyaWJ1dGVzPzogc3RyaW5nW10sIG5vcm1hbGl6ZURhdGE/OiAoZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+fX0gYXJncyAtIERhdGEgYXJncy5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBRdWV1ZWQgZGF0YS5cbiAgICovXG4gIHN0YXRpYyBxdWV1ZWRTeW5jRGF0YShhcmdzKSB7XG4gICAgY29uc3QgaW5wdXREYXRhID0gYXJncy5kYXRhID8/IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChhcmdzLnJlc291cmNlLmF0dHJpYnV0ZXMoKSlcbiAgICBjb25zdCBub3JtYWxpemVkRGF0YSA9IGFyZ3Mubm9ybWFsaXplRGF0YSA/IGFyZ3Mubm9ybWFsaXplRGF0YShpbnB1dERhdGEpIDogaW5wdXREYXRhXG4gICAgY29uc3Qgc3luY0RhdGEgPSB7Li4ubm9ybWFsaXplZERhdGF9XG5cbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgb2YgYXJncy5sb2NhbE9ubHlBdHRyaWJ1dGVzIHx8IFtdKSBkZWxldGUgc3luY0RhdGFbYXR0cmlidXRlTmFtZV1cbiAgICBmb3IgKGNvbnN0IGF0dHJpYnV0ZU5hbWUgb2YgYXJncy5ib29sZWFuQXR0cmlidXRlcyB8fCBbXSkge1xuICAgICAgaWYgKE9iamVjdC5oYXNPd24oc3luY0RhdGEsIGF0dHJpYnV0ZU5hbWUpKSBzeW5jRGF0YVthdHRyaWJ1dGVOYW1lXSA9IHRoaXMub3B0aW9uYWxCb29sZWFuU3luY1ZhbHVlKHN5bmNEYXRhW2F0dHJpYnV0ZU5hbWVdLCBhdHRyaWJ1dGVOYW1lKVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IFthdHRyaWJ1dGVOYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc3luY0RhdGEpKSB7XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSBzeW5jRGF0YVthdHRyaWJ1dGVOYW1lXSA9IHZhbHVlLnRvSVNPU3RyaW5nKClcbiAgICB9XG5cbiAgICByZXR1cm4gc3luY0RhdGFcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBzbWFsbCBhcHAtZmFjaW5nIGxvY2FsIHN5bmMgcXVldWUgZmFjYWRlIGZyb20gZGVjbGFyYXRpdmUgbW9kZWwgY29uZmlnLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFF1ZXVlIGNvbmZpZy5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gYXJncy5zeW5jTW9kZWwgLSBMb2NhbCBTeW5jIG1vZGVsIGNsYXNzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5zaW5nbGVGbGlnaHRLZXkgLSBLZXkgdXNlZCB0byBzZXJpYWxpemUgYmFja2VuZCByZXBsYXkuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gYXJncy5zeW5jUGVuZGluZyAtIEJhY2tlbmQgcmVwbGF5IGNhbGxiYWNrLlxuICAgKiBAcGFyYW0geyhyZXNvdXJjZTogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4pID0+IHN0cmluZ1tdfSBbYXJncy5sb2NhbE9ubHlBdHRyaWJ1dGVzXSAtIFJlc291cmNlLXNwZWNpZmljIGxvY2FsLW9ubHkgYXR0cmlidXRlcy5cbiAgICogQHBhcmFtIHsocmVzb3VyY2U6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+KSA9PiBzdHJpbmdbXX0gW2FyZ3MuYm9vbGVhbkF0dHJpYnV0ZXNdIC0gUmVzb3VyY2Utc3BlY2lmaWMgU1FMaXRlIGJvb2xlYW4gYXR0cmlidXRlcy5cbiAgICogQHJldHVybnMge3txdWV1ZTogKHF1ZXVlQXJnczoge3Jlc291cmNlOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPiwgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBzeW5jVHlwZT86IHN0cmluZ30pID0+IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+LCBzeW5jUGVuZGluZzogKCkgPT4gUHJvbWlzZTx2b2lkPn19IENvbmZpZ3VyZWQgbG9jYWwgc3luYyBxdWV1ZS5cbiAgICovXG4gIHN0YXRpYyBsb2NhbFN5bmNRdWV1ZShhcmdzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHF1ZXVlOiBhc3luYyAocXVldWVBcmdzKSA9PiBhd2FpdCB0aGlzLnF1ZXVlTG9jYWxTeW5jKHtcbiAgICAgICAgLi4ucXVldWVBcmdzLFxuICAgICAgICBib29sZWFuQXR0cmlidXRlczogYXJncy5ib29sZWFuQXR0cmlidXRlcyA/IGFyZ3MuYm9vbGVhbkF0dHJpYnV0ZXMocXVldWVBcmdzLnJlc291cmNlKSA6IFtdLFxuICAgICAgICBsb2NhbE9ubHlBdHRyaWJ1dGVzOiBhcmdzLmxvY2FsT25seUF0dHJpYnV0ZXMgPyBhcmdzLmxvY2FsT25seUF0dHJpYnV0ZXMocXVldWVBcmdzLnJlc291cmNlKSA6IFtdLFxuICAgICAgICBzeW5jTW9kZWw6IGFyZ3Muc3luY01vZGVsXG4gICAgICB9KSxcbiAgICAgIHN5bmNQZW5kaW5nOiBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLnNpbmdsZUZsaWdodChhcmdzLnNpbmdsZUZsaWdodEtleSwgYXJncy5zeW5jUGVuZGluZylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2VzIGJvb2xlYW5zIGNvbW1vbmx5IHVzZWQgYnkgU1FMaXRlL29mZmxpbmUgc3luYyBwYXlsb2Fkcy5cbiAgICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFN5bmMgZGVjaXNpb24gdmFsdWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZGVzY3JpcHRpb25dIC0gRXJyb3IgY29udGV4dC5cbiAgICogQHJldHVybnMge2Jvb2xlYW4gfCBudWxsfSBQYXJzZWQgYm9vbGVhbi1saWtlIGJhY2tlbmQvbG9jYWwgdmFsdWUuXG4gICAqL1xuICBzdGF0aWMgb3B0aW9uYWxCb29sZWFuU3luY1ZhbHVlKHZhbHVlLCBkZXNjcmlwdGlvbiA9IFwic3luYyBib29sZWFuXCIpIHtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIG51bGxcbiAgICBpZiAodmFsdWUgPT09IDEpIHJldHVybiB0cnVlXG4gICAgaWYgKHZhbHVlID09PSAwKSByZXR1cm4gZmFsc2VcblxuICAgIHJldHVybiBvcHRpb25hbEJvb2xlYW4odmFsdWUsIGRlc2NyaXB0aW9uKVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgYm9vbGVhbiBzeW5jIHZhbHVlIHRvIFNRTGl0ZSBib29sZWFuIHN0b3JhZ2UuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbiB8IG51bGx9IHZhbHVlIC0gU3luYyBib29sZWFuIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7MCB8IDF9IFNRTGl0ZS1jb21wYXRpYmxlIGJvb2xlYW4gdmFsdWUuXG4gICAqL1xuICBzdGF0aWMgc3FsaXRlQm9vbGVhblN5bmNWYWx1ZSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSA/IDEgOiAwXG4gIH1cblxuICAvKipcbiAgICogUHJvamVjdHMgZ2VuZXJpYyBzeW5jIGNvdW50ZXJzIGludG8gYXBwLXNwZWNpZmljIHJlc3VsdCBrZXlzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFJlc3VsdCBhcmdzLlxuICAgKiBAcGFyYW0ge1N5bmNDaGFuZ2VzUmVzdWx0fSBhcmdzLnJlc3VsdCAtIEdlbmVyaWMgVmVsb2Npb3VzIHN5bmMgcmVzdWx0LlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHtjaGFuZ2VkS2V5OiBzdHJpbmcsIGNvdW50S2V5OiBzdHJpbmd9Pn0gYXJncy5yZXNvdXJjZXMgLSBSZXNvdXJjZSByZXN1bHQga2V5IG1hcC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBQcm9qZWN0ZWQgcmVzdWx0LlxuICAgKi9cbiAgc3RhdGljIHN5bmNSZXN1bHRGb3JSZXNvdXJjZXMoe3Jlc3VsdCwgcmVzb3VyY2VzfSkge1xuICAgIGNvbnN0IHN5bmNSZXN1bHQgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoe1xuICAgICAgY2hhbmdlZDogcmVzdWx0LmNoYW5nZWQsXG4gICAgICBwYWdlczogcmVzdWx0LnBhZ2VzLFxuICAgICAgc3luY2VkQ291bnQ6IHJlc3VsdC5zeW5jZWRDb3VudFxuICAgIH0pXG5cbiAgICBmb3IgKGNvbnN0IFtyZXNvdXJjZVR5cGUsIGtleXNdIG9mIE9iamVjdC5lbnRyaWVzKHJlc291cmNlcykpIHtcbiAgICAgIHN5bmNSZXN1bHRba2V5cy5jb3VudEtleV0gPSByZXN1bHQucmVzb3VyY2VDb3VudHNbcmVzb3VyY2VUeXBlXSB8fCAwXG4gICAgICBzeW5jUmVzdWx0W2tleXMuY2hhbmdlZEtleV0gPSByZXN1bHQucmVzb3VyY2VDaGFuZ2VkW3Jlc291cmNlVHlwZV0gfHwgZmFsc2VcbiAgICB9XG5cbiAgICByZXR1cm4gc3luY1Jlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIERyYWlucyBwZW5kaW5nIHN5bmMgcmVjb3JkcyBpbiBzdGFibGUgb3JkZXIgYW5kIG1hcmtzIGFja25vd2xlZGdlZCByb3dzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFJlcGxheSBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdXRoZW50aWNhdGlvblRva2VuIC0gQXV0aCB0b2tlbiB0byBzZW5kIHdpdGggcmVwbGF5IHJlcXVlc3RzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuYmF0Y2hTaXplXSAtIE1heCBzeW5jcyBwZXIgcmVxdWVzdC4gRGVmYXVsdHMgdG8gMTAwLlxuICAgKiBAcGFyYW0geygpID0+IFByb21pc2U8QXJyYXk8dW5rbm93bj4+fSBhcmdzLnBlbmRpbmdTeW5jcyAtIExvYWRzIHBlbmRpbmcgbG9jYWwgc3luYyByb3dzIGluIHJlcGxheSBvcmRlci5cbiAgICogQHBhcmFtIHsoc3luYzogdW5rbm93bikgPT4gc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXJncy5zeW5jSWQgLSBSZXR1cm5zIHRoZSBsb2NhbCBzeW5jIGlkLlxuICAgKiBAcGFyYW0geyhzeW5jOiB1bmtub3duKSA9PiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IGFyZ3Muc3luY1BheWxvYWQgLSBCdWlsZHMgdGhlIEFQSSBzeW5jIGVudmVsb3BlLlxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiB7YXV0aGVudGljYXRpb25Ub2tlbjogc3RyaW5nLCBzeW5jczogQXJyYXk8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pn0pID0+IFByb21pc2U8U3luY1JlcGxheVJlc3BvbnNlPn0gYXJncy5wb3N0UmVwbGF5IC0gUG9zdHMgb25lIHJlcGxheSByZXF1ZXN0LlxuICAgKiBAcGFyYW0geyhzeW5jOiB1bmtub3duLCByZXNwb25zZTogU3luY1JlcGxheUl0ZW0pID0+IFByb21pc2U8dm9pZD59IGFyZ3MubWFya1N1Y2Nlc3NmdWwgLSBNYXJrcyBvbmUgc3luYyBhcyBzdWNjZXNzZnVsIGxvY2FsbHkuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBSZXNvbHZlcyBhZnRlciBhbGwgYmF0Y2hlcyBhcmUgcmVwbGF5ZWQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcmVwbGF5UGVuZGluZyhhcmdzKSB7XG4gICAgY29uc3QgcGVuZGluZ1N5bmNzID0gYXdhaXQgYXJncy5wZW5kaW5nU3luY3MoKVxuICAgIGNvbnN0IGJhdGNoU2l6ZSA9IHRoaXMubm9ybWFsaXplZEJhdGNoU2l6ZShhcmdzLmJhdGNoU2l6ZSlcblxuICAgIGZvciAobGV0IG9mZnNldCA9IDA7IG9mZnNldCA8IHBlbmRpbmdTeW5jcy5sZW5ndGg7IG9mZnNldCArPSBiYXRjaFNpemUpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVwbGF5QmF0Y2goey4uLmFyZ3MsIHBlbmRpbmdTeW5jczogcGVuZGluZ1N5bmNzLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgYmF0Y2hTaXplKX0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxheXMgb25lIGJhdGNoIG9mIHN5bmNzLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFJlcGxheSBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdXRoZW50aWNhdGlvblRva2VuIC0gQXV0aCB0b2tlbi5cbiAgICogQHBhcmFtIHtBcnJheTx1bmtub3duPn0gYXJncy5wZW5kaW5nU3luY3MgLSBCYXRjaCBzeW5jcy5cbiAgICogQHBhcmFtIHsoc3luYzogdW5rbm93bikgPT4gc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZH0gYXJncy5zeW5jSWQgLSBTeW5jIGlkIGdldHRlci5cbiAgICogQHBhcmFtIHsoc3luYzogdW5rbm93bikgPT4gUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSBhcmdzLnN5bmNQYXlsb2FkIC0gUGF5bG9hZCBidWlsZGVyLlxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiB7YXV0aGVudGljYXRpb25Ub2tlbjogc3RyaW5nLCBzeW5jczogQXJyYXk8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pn0pID0+IFByb21pc2U8U3luY1JlcGxheVJlc3BvbnNlPn0gYXJncy5wb3N0UmVwbGF5IC0gUmVwbGF5IHBvc3Rlci5cbiAgICogQHBhcmFtIHsoc3luYzogdW5rbm93biwgcmVzcG9uc2U6IFN5bmNSZXBsYXlJdGVtKSA9PiBQcm9taXNlPHZvaWQ+fSBhcmdzLm1hcmtTdWNjZXNzZnVsIC0gU3VjY2VzcyBob29rLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gUmVzb2x2ZXMgYWZ0ZXIgdGhlIGJhdGNoIGlzIGFja25vd2xlZGdlZC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyByZXBsYXlCYXRjaChhcmdzKSB7XG4gICAgY29uc3Qge2F1dGhlbnRpY2F0aW9uVG9rZW4sIG1hcmtTdWNjZXNzZnVsLCBwZW5kaW5nU3luY3MsIHBvc3RSZXBsYXksIHN5bmNJZCwgc3luY1BheWxvYWR9ID0gYXJnc1xuXG4gICAgaWYgKHBlbmRpbmdTeW5jcy5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgY29uc3Qgc3luY3NCeUlkID0gbmV3IE1hcCgpXG5cbiAgICBmb3IgKGNvbnN0IHN5bmMgb2YgcGVuZGluZ1N5bmNzKSB7XG4gICAgICBjb25zdCBpZCA9IHN5bmNJZChzeW5jKVxuXG4gICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCAmJiBpZCAhPT0gbnVsbCkgc3luY3NCeUlkLnNldChTdHJpbmcoaWQpLCBzeW5jKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdFJlcGxheSh7XG4gICAgICBhdXRoZW50aWNhdGlvblRva2VuLFxuICAgICAgc3luY3M6IHBlbmRpbmdTeW5jcy5tYXAoKHN5bmMpID0+IHN5bmNQYXlsb2FkKHN5bmMpKVxuICAgIH0pXG5cbiAgICB0aGlzLmVuc3VyZVN1Y2Nlc3NmdWxSZXNwb25zZShyZXNwb25zZSlcblxuICAgIGZvciAoY29uc3Qgc3luY1Jlc3BvbnNlIG9mIHJlc3BvbnNlLnN5bmNzIHx8IFtdKSB7XG4gICAgICBjb25zdCBzeW5jID0gc3luY3NCeUlkLmdldChTdHJpbmcoc3luY1Jlc3BvbnNlLmlkKSlcblxuICAgICAgaWYgKCFzeW5jKSBjb250aW51ZVxuICAgICAgaWYgKHN5bmNSZXNwb25zZS5zeW5jU3RhdGUgIT09IFwic3VjY2Vzc2Z1bFwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzeW5jIHN0YXRlIHJldHVybmVkIGZvciBzeW5jICR7U3RyaW5nKHN5bmNSZXNwb25zZS5pZCl9OiAke1N0cmluZyhzeW5jUmVzcG9uc2Uuc3luY1N0YXRlKX1gKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBtYXJrU3VjY2Vzc2Z1bChzeW5jLCBzeW5jUmVzcG9uc2UpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBBUEkgcmVzcG9uc2Ugc3RhdHVzIGFuZCBzaGFwZS5cbiAgICogQHBhcmFtIHtTeW5jUmVwbGF5UmVzcG9uc2V9IHJlc3BvbnNlIC0gUmVwbGF5IHJlc3BvbnNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBlbnN1cmVTdWNjZXNzZnVsUmVzcG9uc2UocmVzcG9uc2UpIHtcbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSBcImVycm9yXCIpIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5lcnJvck1lc3NhZ2UgfHwgXCJTeW5jIGZhaWxlZFwiKVxuICAgIGlmICghQXJyYXkuaXNBcnJheShyZXNwb25zZS5zeW5jcykpIHRocm93IG5ldyBFcnJvcihcIlN5bmMgcmVzcG9uc2UgbWlzc2luZyBzeW5jc1wiKVxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZXMgYSBwb3NpdGl2ZSBiYXRjaCBzaXplLlxuICAgKiBAcGFyYW0ge251bWJlciB8IHVuZGVmaW5lZH0gYmF0Y2hTaXplIC0gQmF0Y2ggc2l6ZS5cbiAgICogQHJldHVybnMge251bWJlcn0gUG9zaXRpdmUgYmF0Y2ggc2l6ZS5cbiAgICovXG4gIHN0YXRpYyBub3JtYWxpemVkQmF0Y2hTaXplKGJhdGNoU2l6ZSkge1xuICAgIGlmICh0eXBlb2YgYmF0Y2hTaXplICE9PSBcIm51bWJlclwiIHx8ICFOdW1iZXIuaXNGaW5pdGUoYmF0Y2hTaXplKSB8fCBiYXRjaFNpemUgPCAxKSByZXR1cm4gMTAwXG5cbiAgICByZXR1cm4gTWF0aC5mbG9vcihiYXRjaFNpemUpXG4gIH1cbn1cbiJdfQ==
844
+ /**
845
+ * Throws the exact abort reason at lifecycle boundaries so callers can
846
+ * distinguish an expected cooperative stop from transport or apply failures.
847
+ * @param {AbortSignal | undefined} signal - Lifecycle signal.
848
+ * @returns {void}
849
+ */
850
+ function throwIfSyncAborted(signal) {
851
+ if (!signal?.aborted)
852
+ return;
853
+ throw signal.reason instanceof Error ? signal.reason : new Error("Sync operation aborted");
854
+ }
855
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1hcGktY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc3luYy1hcGktY2xpZW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsZUFBZSxFQUFFLGVBQWUsRUFBQyxNQUFNLFNBQVMsQ0FBQTtBQUV4RCxPQUFPLGFBQWEsTUFBTSwrQkFBK0IsQ0FBQTtBQUN6RCxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQTtBQUN4RSxPQUFPLEVBQUMsdUNBQXVDLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQTtBQUU5RSxrR0FBa0c7QUFDbEcsNEZBQTRGO0FBQzVGLDRGQUE0RjtBQUM1Riw4RkFBOEY7QUFDOUYsMEZBQTBGO0FBQzFGLDRFQUE0RTtBQUM1RSxvRkFBb0Y7QUFDcEYsNEZBQTRGO0FBQzVGLDRGQUE0RjtBQUM1RixNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7QUFFbEM7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxPQUFPLE9BQU8sYUFBYTtJQUNoQzs7Ozs7Ozs7Ozs7T0FXRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUMsd0JBQXdCLENBQUMsRUFBQyxXQUFXLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBQztRQUN0SCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsMEJBQTBCLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLDZCQUE2QixZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDakgsTUFBTSxPQUFPLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDNUQsTUFBTSxXQUFXLEdBQUcsT0FBTzthQUN4QixNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENB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LFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUN2SCxDQUFDO1lBRUQsTUFBTSxjQUFjLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFBO1lBQ3hDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRO1FBQ3RDLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxPQUFPO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsWUFBWSxJQUFJLGFBQWEsQ0FBQyxDQUFBO1FBQ3hGLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUE7SUFDcEYsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsbUJBQW1CLENBQUMsU0FBUztRQUNsQyxJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxHQUFHLENBQUM7WUFBRSxPQUFPLEdBQUcsQ0FBQTtRQUU3RixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDOUIsQ0FBQztDQUNGO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGtCQUFrQixDQUFDLE1BQU07SUFDaEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPO1FBQUUsT0FBTTtJQUU1QixNQUFNLE1BQU0sQ0FBQyxNQUFNLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO0FBQzVGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtvcHRpb25hbEJvb2xlYW4sIG9wdGlvbmFsSW50ZWdlcn0gZnJvbSBcInR5cGFuaWNcIlxuXG5pbXBvcnQgcmVjb3JkQ2hhbmdlcyBmcm9tIFwiLi4vZGF0YWJhc2UvcmVjb3JkLWNoYW5nZXMuanNcIlxuaW1wb3J0IHtzY2FsYXJNb2RlbFByaW1hcnlLZXlWYWx1ZX0gZnJvbSBcIi4uL3V0aWxzL21vZGVsLXByaW1hcnkta2V5LmpzXCJcbmltcG9ydCB7YXBwbHlTeW5jUmVwbGF5UmVzdWx0VG9Mb2NhbE11dGF0aW9uTG9nfSBmcm9tIFwiLi9jb25mbGljdC1zdHJhdGVneS5qc1wiXG5cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0NoYW5nZUFwcGx5UmVzdWx0fSBTeW5jQ2hhbmdlQXBwbHlSZXN1bHQgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0NoYW5nZUVudmVsb3BlfSBTeW5jQ2hhbmdlRW52ZWxvcGUgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0NoYW5nZXNSZXF1ZXN0fSBTeW5jQ2hhbmdlc1JlcXVlc3QgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0NoYW5nZXNSZXNwb25zZX0gU3luY0NoYW5nZXNSZXNwb25zZSAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jQ2hhbmdlc1Jlc3VsdH0gU3luY0NoYW5nZXNSZXN1bHQgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY0N1cnNvcn0gU3luY0N1cnNvciAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuL3N5bmMtYXBpLWNsaWVudC10eXBlcy5qc1wiKS5TeW5jUmVwbGF5SXRlbX0gU3luY1JlcGxheUl0ZW0gKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1JlcGxheVJlc3BvbnNlfSBTeW5jUmVwbGF5UmVzcG9uc2UgKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1Jlc291cmNlQ29uZmlnfSBTeW5jUmVzb3VyY2VDb25maWcgKi9cbmNvbnN0IHN5bmNUYXNrUHJvbWlzZXMgPSBuZXcgTWFwKClcblxuLyoqXG4gKiBHZW5lcmljIGNsaWVudC1zaWRlIGhlbHBlciBmb3IgcmVwbGF5aW5nIHBlbmRpbmcgc3luYyBlbnZlbG9wZXMgdGhyb3VnaCB0aGVcbiAqIGZyYW1ld29yay1vd25lZCBgL3ZlbG9jaW91cy9zeW5jL3JlcGxheWAgZW5kcG9pbnQuIEFwcHMgcHJvdmlkZSBvbmx5IGxvY2FsXG4gKiBwZXJzaXN0ZW5jZS9hdXRoIGhvb2tzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTeW5jQXBpQ2xpZW50IHtcbiAgLyoqXG4gICAqIEFwcGVuZHMgb25lIGNvbmZsaWN0LXRyYWNrZWQgaW50ZW50IHRvIHRoZSBleGlzdGluZyBkdXJhYmxlIG11dGF0aW9uIGxvZy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBRdWV1ZSBhcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgbnVtYmVyIHwgbnVsbH0gYXJncy5iYXNlVmVyc2lvbiAtIEF1dGhvcml0YXRpdmUgdmVyc2lvbiBvYnNlcnZlZCBiZWZvcmUgdGhlIGxvY2FsIG11dGF0aW9uLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudENvbmZsaWN0VHJhY2tpbmdDb25maWd9IGFyZ3MuY29uZmxpY3RUcmFja2luZyAtIER1cmFibGUgdHJhY2tpbmcgY29uZmlndXJhdGlvbi5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gYXJncy5kYXRhIC0gQmFja2VuZC1zYWZlIG11dGF0aW9uIGF0dHJpYnV0ZXMuXG4gICAqIEBwYXJhbSB7XCJjcmVhdGVcIiB8IFwidXBkYXRlXCIgfCBcImRlc3Ryb3lcIn0gYXJncy5vcGVyYXRpb24gLSBMb2NhbCBvcGVyYXRpb24uXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGFyZ3MucmVzb3VyY2UgLSBMb2NhbCByZXNvdXJjZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MucmVzb3VyY2VUeXBlIC0gUmVzb3VyY2UgdHlwZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3Muc3luY1R5cGUgLSBXaXJlIG9wZXJhdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8aW1wb3J0KFwiLi9sb2NhbC1tdXRhdGlvbi1sb2cuanNcIikuTG9jYWxNdXRhdGlvbkxvZ1JlY29yZD59IEFwcGVuZGVkIGludGVudC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBxdWV1ZUNvbmZsaWN0VHJhY2tlZFN5bmMoe2Jhc2VWZXJzaW9uLCBjb25mbGljdFRyYWNraW5nLCBkYXRhLCBvcGVyYXRpb24sIHJlc291cmNlLCByZXNvdXJjZVR5cGUsIHN5bmNUeXBlfSkge1xuICAgIGNvbnN0IHJlc291cmNlSWQgPSBTdHJpbmcoc2NhbGFyTW9kZWxQcmltYXJ5S2V5VmFsdWUocmVzb3VyY2UuaWQoKSwgYENvbmZsaWN0LXRyYWNrZWQgc3luYyBmb3IgJHtyZXNvdXJjZVR5cGV9YCkpXG4gICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IGNvbmZsaWN0VHJhY2tpbmcubXV0YXRpb25Mb2cucmVjb3JkcygpXG4gICAgY29uc3QgcHJlZGVjZXNzb3IgPSByZWNvcmRzXG4gICAgICAuZmlsdGVyKChyZWNvcmQpID0+IHJlY29yZC5tdXRhdGlvbi5tb2RlbCA9PT0gcmVzb3VyY2VUeXBlICYmIHJlY29yZC5tdXRhdGlvbi5wYXlsb2FkPy5yZXNvdXJjZUlkID09PSByZXNvdXJjZUlkKVxuICAgICAgLmF0KC0xKVxuICAgIGNvbnN0IGNsaWVudE11dGF0aW9uSWQgPSBjb25mbGljdFRyYWNraW5nLmNsaWVudE11dGF0aW9uSWQoKVxuICAgIGNvbnN0IG5vdyA9IGNvbmZsaWN0VHJhY2tpbmcubm93ID8gY29uZmxpY3RUcmFja2luZy5ub3coKSA6IG5ldyBEYXRlKClcbiAgICBjb25zdCBwcmVkZWNlc3NvclRpbWUgPSBwcmVkZWNlc3NvciA/IG5ldyBEYXRlKHByZWRlY2Vzc29yLm11dGF0aW9uLm9jY3VycmVkQXQpLmdldFRpbWUoKSA6IE51bWJlci5ORUdBVElWRV9JTkZJTklUWVxuICAgIGNvbnN0IG9jY3VycmVkQXQgPSBuZXcgRGF0ZShNYXRoLm1heChub3cuZ2V0VGltZSgpLCBwcmVkZWNlc3NvclRpbWUgKyAxKSkudG9JU09TdHJpbmcoKVxuXG4gICAgcmV0dXJuIGF3YWl0IGNvbmZsaWN0VHJhY2tpbmcubXV0YXRpb25Mb2cuYXBwZW5kKHtcbiAgICAgIGRlcGVuZGVuY2llczogcHJlZGVjZXNzb3IgPyBbe2NsaWVudE11dGF0aW9uSWQ6IHByZWRlY2Vzc29yLm11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQsIG1vZGVsOiByZXNvdXJjZVR5cGV9XSA6IFtdLFxuICAgICAgbXV0YXRpb246IHtcbiAgICAgICAgYWN0b3JEZXZpY2VJZDogY29uZmxpY3RUcmFja2luZy5hY3RvckRldmljZUlkLFxuICAgICAgICBhY3RvclVzZXJJZDogY29uZmxpY3RUcmFja2luZy5hY3RvclVzZXJJZCxcbiAgICAgICAgYXR0cmlidXRlczogLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPn0gKi8gKGRhdGEpLFxuICAgICAgICBiYXNlVmVyc2lvbixcbiAgICAgICAgY2xpZW50TXV0YXRpb25JZCxcbiAgICAgICAgbW9kZWw6IHJlc291cmNlVHlwZSxcbiAgICAgICAgb2NjdXJyZWRBdCxcbiAgICAgICAgb2ZmbGluZUdyYW50SWQ6IGNvbmZsaWN0VHJhY2tpbmcub2ZmbGluZUdyYW50SWQsXG4gICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgcGF5bG9hZDoge3Jlc291cmNlSWQsIHN5bmNUeXBlfSxcbiAgICAgICAgcG9saWN5SGFzaDogY29uZmxpY3RUcmFja2luZy5wb2xpY3lIYXNoXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBEcmFpbnMgdGhlIGV4aXN0aW5nIG11dGF0aW9uIGxvZyBpbiBwcmVkZWNlc3NvciBvcmRlci4gSW5kZXBlbmRlbnQgcmVjb3Jkc1xuICAgKiBjb250aW51ZSBhZnRlciBkdXJhYmxlIGNvbmZsaWN0cy9yZWplY3Rpb25zOyBzdWNjZXNzb3JzIHN0YXkgYmxvY2tlZC5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBSZXBsYXkgYXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdXRoZW50aWNhdGlvblRva2VuIC0gQXV0aGVudGljYXRpb24gdG9rZW4uXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5iYXRjaFNpemVdIC0gQmF0Y2ggc2l6ZS5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL3N5bmMtY2xpZW50LXR5cGVzLmpzXCIpLlN5bmNDbGllbnRDb25mbGljdFRyYWNraW5nQ29uZmlnfSBhcmdzLmNvbmZsaWN0VHJhY2tpbmcgLSBUcmFja2luZyBjb25maWd1cmF0aW9uLlxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiB7YXV0aGVudGljYXRpb25Ub2tlbjogc3RyaW5nLCBzeW5jczogQXJyYXk8UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+Pn0sIG9wdGlvbnM/OiB7c2lnbmFsPzogQWJvcnRTaWduYWx9KSA9PiBQcm9taXNlPFN5bmNSZXBsYXlSZXNwb25zZT59IGFyZ3MucG9zdFJlcGxheSAtIFRyYW5zcG9ydCBib3VuZGFyeS5cbiAgICogQHBhcmFtIHsoaWRlbnRpdHk6IHN0cmluZykgPT4gbnVtYmVyfSBhcmdzLnJlbW90ZUdlbmVyYXRpb24gLSBDdXJyZW50IHJlbW90ZSBnZW5lcmF0aW9uLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5yZXNvdXJjZVR5cGUgLSBSZXNvdXJjZSB3aG9zZSBsb2cgcmVjb3JkcyBzaG91bGQgZHJhaW4uXG4gICAqIEBwYXJhbSB7QWJvcnRTaWduYWx9IFthcmdzLnNpZ25hbF0gLSBMaWZlY3ljbGUgY2FuY2VsbGF0aW9uIHNpZ25hbC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIHdoZW4gbm8gcmVhZHkgaW50ZW50IHJlbWFpbnMuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcmVwbGF5Q29uZmxpY3RUcmFja2VkU3luY3Moe2F1dGhlbnRpY2F0aW9uVG9rZW4sIGJhdGNoU2l6ZSwgY29uZmxpY3RUcmFja2luZywgcG9zdFJlcGxheSwgcmVtb3RlR2VuZXJhdGlvbiwgcmVzb3VyY2VUeXBlLCBzaWduYWx9KSB7XG4gICAgY29uc3QgbWF4QmF0Y2hTaXplID0gdGhpcy5ub3JtYWxpemVkQmF0Y2hTaXplKGJhdGNoU2l6ZSlcblxuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB0aHJvd0lmU3luY0Fib3J0ZWQoc2lnbmFsKVxuICAgICAgY29uc3QgcmVjb3JkcyA9IGF3YWl0IGNvbmZsaWN0VHJhY2tpbmcubXV0YXRpb25Mb2cucmVjb3JkcygpXG4gICAgICB0aHJvd0lmU3luY0Fib3J0ZWQoc2lnbmFsKVxuICAgICAgY29uc3Qgc3RhdHVzZXMgPSBuZXcgTWFwKHJlY29yZHMubWFwKChyZWNvcmQpID0+IFtyZWNvcmQubXV0YXRpb24uY2xpZW50TXV0YXRpb25JZCwgcmVjb3JkLnN0YXR1c10pKVxuICAgICAgY29uc3QgcGVuZGluZyA9IHJlY29yZHMuZmlsdGVyKChyZWNvcmQpID0+IHJlY29yZC5zdGF0dXMgPT09IFwicGVuZGluZ1wiICYmIHJlY29yZC5tdXRhdGlvbi5tb2RlbCA9PT0gcmVzb3VyY2VUeXBlKVxuICAgICAgY29uc3QgcmVhZHkgPSBwZW5kaW5nLmZpbHRlcigocmVjb3JkKSA9PiByZWNvcmQuZGVwZW5kZW5jaWVzLmV2ZXJ5KChkZXBlbmRlbmN5KSA9PiBzdGF0dXNlcy5nZXQoZGVwZW5kZW5jeS5jbGllbnRNdXRhdGlvbklkKSA9PT0gXCJzeW5jZWRcIikpXG5cbiAgICAgIGlmIChyZWFkeS5sZW5ndGggPT09IDApIHJldHVyblxuXG4gICAgICBjb25zdCBncm91cHMgPSB0aGlzLmNvbmZsaWN0UmVwbGF5R3JvdXBzKHtwZW5kaW5nLCByZWFkeX0pLnNsaWNlKDAsIG1heEJhdGNoU2l6ZSlcbiAgICAgIGNvbnN0IGdlbmVyYXRpb25zID0gbmV3IE1hcChncm91cHMubWFwKChncm91cCkgPT4gW2dyb3VwWzBdLm11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQsIHJlbW90ZUdlbmVyYXRpb24odGhpcy5jb25mbGljdFJlY29yZElkZW50aXR5KGdyb3VwWzBdKSldKSlcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgcG9zdFJlcGxheSh7XG4gICAgICAgIGF1dGhlbnRpY2F0aW9uVG9rZW4sXG4gICAgICAgIHN5bmNzOiBncm91cHMubWFwKChncm91cCkgPT4gdGhpcy5jb25mbGljdFJlcGxheVBheWxvYWQoZ3JvdXApKVxuICAgICAgfSwge3NpZ25hbH0pXG5cbiAgICAgIHRocm93SWZTeW5jQWJvcnRlZChzaWduYWwpXG4gICAgICB0aGlzLmVuc3VyZVN1Y2Nlc3NmdWxSZXNwb25zZShyZXNwb25zZSlcblxuICAgICAgY29uc3QgcmVzcG9uc2VzQnlJZCA9IG5ldyBNYXAoKHJlc3BvbnNlLnN5bmNzIHx8IFtdKS5tYXAoKHJlc3VsdCkgPT4gW1N0cmluZyhyZXN1bHQuaWQpLCByZXN1bHRdKSlcblxuICAgICAgZm9yIChjb25zdCBncm91cCBvZiBncm91cHMpIHtcbiAgICAgICAgdGhyb3dJZlN5bmNBYm9ydGVkKHNpZ25hbClcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2VzQnlJZC5nZXQoZ3JvdXBbMF0ubXV0YXRpb24uY2xpZW50TXV0YXRpb25JZClcblxuICAgICAgICBpZiAoIXJlc3VsdCkgdGhyb3cgbmV3IEVycm9yKGBTeW5jIHJlc3BvbnNlIG1pc3NpbmcgcmVzdWx0IGZvciBtdXRhdGlvbiAke2dyb3VwWzBdLm11dGF0aW9uLmNsaWVudE11dGF0aW9uSWR9YClcbiAgICAgICAgaWYgKCFbXCJzdWNjZXNzZnVsXCIsIFwiZHVwbGljYXRlXCIsIFwiY29uZmxpY3RcIiwgXCJmYWlsZWRcIiwgXCJyZWplY3RlZFwiXS5pbmNsdWRlcyhyZXN1bHQuc3luY1N0YXRlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzeW5jIHN0YXRlIHJldHVybmVkIGZvciBtdXRhdGlvbiAke2dyb3VwWzBdLm11dGF0aW9uLmNsaWVudE11dGF0aW9uSWR9OiAke3Jlc3VsdC5zeW5jU3RhdGV9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIGdyb3VwKSB7XG4gICAgICAgICAgYXdhaXQgYXBwbHlTeW5jUmVwbGF5UmVzdWx0VG9Mb2NhbE11dGF0aW9uTG9nKHttdXRhdGlvbkxvZzogY29uZmxpY3RUcmFja2luZy5tdXRhdGlvbkxvZywgcmVjb3JkLCByZXN1bHQ6IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqLyAocmVzdWx0KX0pXG4gICAgICAgICAgdGhyb3dJZlN5bmNBYm9ydGVkKHNpZ25hbClcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChbXCJzdWNjZXNzZnVsXCIsIFwiZHVwbGljYXRlXCJdLmluY2x1ZGVzKHJlc3VsdC5zeW5jU3RhdGUpICYmIHJlc3VsdC5zZXJ2ZXJWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBpZGVudGl0eSA9IHRoaXMuY29uZmxpY3RSZWNvcmRJZGVudGl0eShncm91cFswXSlcblxuICAgICAgICAgIGlmIChyZW1vdGVHZW5lcmF0aW9uKGlkZW50aXR5KSA9PT0gZ2VuZXJhdGlvbnMuZ2V0KGdyb3VwWzBdLm11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlYmFzZUNvbmZsaWN0U3VjY2Vzc29yKHtjb25mbGljdFRyYWNraW5nLCBwcmVkZWNlc3NvcjogZ3JvdXBbZ3JvdXAubGVuZ3RoIC0gMV0sIHNlcnZlclZlcnNpb246IHJlc3VsdC5zZXJ2ZXJWZXJzaW9ufSlcbiAgICAgICAgICAgIHRocm93SWZTeW5jQWJvcnRlZChzaWduYWwpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBzYWZlIHRyYW5zcG9ydCBncm91cHMgZnJvbSByb290LXJlYWR5IHJlY29yZHMgYW5kIHRoZWlyIHN1Y2Nlc3NvcnMuXG4gICAqIEBwYXJhbSB7e3BlbmRpbmc6IEFycmF5PGltcG9ydChcIi4vbG9jYWwtbXV0YXRpb24tbG9nLmpzXCIpLkxvY2FsTXV0YXRpb25Mb2dSZWNvcmQ+LCByZWFkeTogQXJyYXk8aW1wb3J0KFwiLi9sb2NhbC1tdXRhdGlvbi1sb2cuanNcIikuTG9jYWxNdXRhdGlvbkxvZ1JlY29yZD59fSBhcmdzIC0gUGVuZGluZyBhbmQgcm9vdC1yZWFkeSByZWNvcmRzLlxuICAgKiBAcmV0dXJucyB7QXJyYXk8QXJyYXk8aW1wb3J0KFwiLi9sb2NhbC1tdXRhdGlvbi1sb2cuanNcIikuTG9jYWxNdXRhdGlvbkxvZ1JlY29yZD4+fSBTYWZlIHRyYW5zcG9ydCBncm91cHMuXG4gICAqL1xuICBzdGF0aWMgY29uZmxpY3RSZXBsYXlHcm91cHMoe3BlbmRpbmcsIHJlYWR5fSkge1xuICAgIGNvbnN0IGdyb3VwcyA9IFtdXG4gICAgY29uc3Qgc2VsZWN0ZWRJZGVudGl0aWVzID0gbmV3IFNldCgpXG5cbiAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiByZWFkeSkge1xuICAgICAgY29uc3QgaWRlbnRpdHkgPSB0aGlzLmNvbmZsaWN0UmVjb3JkSWRlbnRpdHkocmVjb3JkKVxuXG4gICAgICBpZiAoc2VsZWN0ZWRJZGVudGl0aWVzLmhhcyhpZGVudGl0eSkpIGNvbnRpbnVlXG5cbiAgICAgIGNvbnN0IGdyb3VwID0gW3JlY29yZF1cbiAgICAgIGxldCB0YWlsID0gcmVjb3JkXG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIGNvbnN0IHN1Y2Nlc3NvciA9IHBlbmRpbmcuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuZGVwZW5kZW5jaWVzLnNvbWUoKGRlcGVuZGVuY3kpID0+IGRlcGVuZGVuY3kuY2xpZW50TXV0YXRpb25JZCA9PT0gdGFpbC5tdXRhdGlvbi5jbGllbnRNdXRhdGlvbklkKSlcblxuICAgICAgICBpZiAoIXN1Y2Nlc3NvciB8fCAhdGhpcy5jYW5Db2FsZXNjZUNvbmZsaWN0UmVjb3Jkcyh0YWlsLCBzdWNjZXNzb3IpKSBicmVha1xuICAgICAgICBncm91cC5wdXNoKHN1Y2Nlc3NvcilcbiAgICAgICAgdGFpbCA9IHN1Y2Nlc3NvclxuICAgICAgfVxuXG4gICAgICBncm91cHMucHVzaChncm91cClcbiAgICAgIHNlbGVjdGVkSWRlbnRpdGllcy5hZGQoaWRlbnRpdHkpXG4gICAgfVxuXG4gICAgcmV0dXJuIGdyb3Vwc1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHR3byBkdXJhYmxlIGludGVudHMgY2FuIHNoYXJlIG9uZSB0cmFuc3BvcnQgbXV0YXRpb24uXG4gICAqIEBwYXJhbSB7aW1wb3J0KFwiLi9sb2NhbC1tdXRhdGlvbi1sb2cuanNcIikuTG9jYWxNdXRhdGlvbkxvZ1JlY29yZH0gbGVmdCAtIEVhcmxpZXIgaW50ZW50LlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vbG9jYWwtbXV0YXRpb24tbG9nLmpzXCIpLkxvY2FsTXV0YXRpb25Mb2dSZWNvcmR9IHJpZ2h0IC0gTGF0ZXIgaW50ZW50LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBzY2FsYXIgdXBkYXRlcyBjYW4gc2hhcmUgb25lIHRyYW5zcG9ydCBtdXRhdGlvbi5cbiAgICovXG4gIHN0YXRpYyBjYW5Db2FsZXNjZUNvbmZsaWN0UmVjb3JkcyhsZWZ0LCByaWdodCkge1xuICAgIGlmIChsZWZ0Lm11dGF0aW9uLm9wZXJhdGlvbiAhPT0gXCJ1cGRhdGVcIiB8fCByaWdodC5tdXRhdGlvbi5vcGVyYXRpb24gIT09IFwidXBkYXRlXCIpIHJldHVybiBmYWxzZVxuICAgIGlmICh0aGlzLmNvbmZsaWN0UmVjb3JkSWRlbnRpdHkobGVmdCkgIT09IHRoaXMuY29uZmxpY3RSZWNvcmRJZGVudGl0eShyaWdodCkpIHJldHVybiBmYWxzZVxuICAgIGlmIChsZWZ0Lm11dGF0aW9uLmJhc2VWZXJzaW9uICE9PSByaWdodC5tdXRhdGlvbi5iYXNlVmVyc2lvbikgcmV0dXJuIGZhbHNlXG4gICAgaWYgKCF0aGlzLnNjYWxhclN5bmNBdHRyaWJ1dGVzKGxlZnQubXV0YXRpb24uYXR0cmlidXRlcykgfHwgIXRoaXMuc2NhbGFyU3luY0F0dHJpYnV0ZXMocmlnaHQubXV0YXRpb24uYXR0cmlidXRlcykpIHJldHVybiBmYWxzZVxuXG4gICAgcmV0dXJuICFPYmplY3Qua2V5cyhsZWZ0Lm11dGF0aW9uLmF0dHJpYnV0ZXMgfHwge30pLnNvbWUoKGtleSkgPT4gT2JqZWN0Lmhhc093bihyaWdodC5tdXRhdGlvbi5hdHRyaWJ1dGVzIHx8IHt9LCBrZXkpKVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGF0dHJpYnV0ZXMgY29udGFpbiBzY2FsYXIgSlNPTiB2YWx1ZXMgb25seS5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLXR5cGVzLmpzXCIpLkZyb250ZW5kTW9kZWxTeW5jSnNvblZhbHVlPiB8IHVuZGVmaW5lZH0gYXR0cmlidXRlcyAtIEF0dHJpYnV0ZXMuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGV2ZXJ5IHZhbHVlIGlzIHNjYWxhci5cbiAgICovXG4gIHN0YXRpYyBzY2FsYXJTeW5jQXR0cmlidXRlcyhhdHRyaWJ1dGVzKSB7XG4gICAgcmV0dXJuIEJvb2xlYW4oYXR0cmlidXRlcykgJiYgT2JqZWN0LnZhbHVlcyhhdHRyaWJ1dGVzIHx8IHt9KS5ldmVyeSgodmFsdWUpID0+IHZhbHVlID09PSBudWxsIHx8IFtcInN0cmluZ1wiLCBcIm51bWJlclwiLCBcImJvb2xlYW5cIl0uaW5jbHVkZXModHlwZW9mIHZhbHVlKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgb25lIHJlcGxheSBlbnZlbG9wZSBmb3IgYSBzYWZlIHRyYW5zcG9ydCBncm91cC5cbiAgICogQHBhcmFtIHtBcnJheTxpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5Mb2NhbE11dGF0aW9uTG9nUmVjb3JkPn0gZ3JvdXAgLSBUcmFuc3BvcnQgZ3JvdXAuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IFJlcGxheSBlbnZlbG9wZS5cbiAgICovXG4gIHN0YXRpYyBjb25mbGljdFJlcGxheVBheWxvYWQoZ3JvdXApIHtcbiAgICBjb25zdCBmaXJzdCA9IGdyb3VwWzBdXG4gICAgY29uc3QgcGF5bG9hZCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4+fSAqLyAoe1xuICAgICAgYmFzZVZlcnNpb246IGZpcnN0Lm11dGF0aW9uLmJhc2VWZXJzaW9uLFxuICAgICAgY2xpZW50VXBkYXRlZEF0OiBmaXJzdC5tdXRhdGlvbi5vY2N1cnJlZEF0LFxuICAgICAgZGF0YTogT2JqZWN0LmFzc2lnbih7fSwgLi4uZ3JvdXAubWFwKChyZWNvcmQpID0+IHJlY29yZC5tdXRhdGlvbi5hdHRyaWJ1dGVzIHx8IHt9KSksXG4gICAgICBpZDogZmlyc3QubXV0YXRpb24uY2xpZW50TXV0YXRpb25JZCxcbiAgICAgIHJlc291cmNlSWQ6IGZpcnN0Lm11dGF0aW9uLnBheWxvYWQ/LnJlc291cmNlSWQsXG4gICAgICByZXNvdXJjZVR5cGU6IGZpcnN0Lm11dGF0aW9uLm1vZGVsLFxuICAgICAgc3luY1R5cGU6IGZpcnN0Lm11dGF0aW9uLnBheWxvYWQ/LnN5bmNUeXBlXG4gICAgfSlcblxuICAgIHJldHVybiBwYXlsb2FkXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgc3RhYmxlIHJlc291cmNlIGlkZW50aXR5IGZvciBvcmRlcmluZyBhbmQgcmVtb3RlIGdlbmVyYXRpb25zLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vbG9jYWwtbXV0YXRpb24tbG9nLmpzXCIpLkxvY2FsTXV0YXRpb25Mb2dSZWNvcmR9IHJlY29yZCAtIFJlY29yZC5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmVzb3VyY2UgaWRlbnRpdHkuXG4gICAqL1xuICBzdGF0aWMgY29uZmxpY3RSZWNvcmRJZGVudGl0eShyZWNvcmQpIHtcbiAgICByZXR1cm4gYCR7cmVjb3JkLm11dGF0aW9uLm1vZGVsfToke1N0cmluZyhyZWNvcmQubXV0YXRpb24ucGF5bG9hZD8ucmVzb3VyY2VJZCl9YFxuICB9XG5cbiAgLyoqXG4gICAqIFJlYmFzZXMgdGhlIGRpcmVjdCBwZW5kaW5nIHN1Y2Nlc3NvciBmcm9tIGFuIGF1dGhvcml0YXRpdmUgYWNrbm93bGVkZ2VtZW50LlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFJlYmFzZSBhcmdzLlxuICAgKiBAcGFyYW0ge2ltcG9ydChcIi4vc3luYy1jbGllbnQtdHlwZXMuanNcIikuU3luY0NsaWVudENvbmZsaWN0VHJhY2tpbmdDb25maWd9IGFyZ3MuY29uZmxpY3RUcmFja2luZyAtIFRyYWNraW5nIGNvbmZpZy5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuL2xvY2FsLW11dGF0aW9uLWxvZy5qc1wiKS5Mb2NhbE11dGF0aW9uTG9nUmVjb3JkfSBhcmdzLnByZWRlY2Vzc29yIC0gQWNrbm93bGVkZ2VkIHByZWRlY2Vzc29yLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bWJlciB8IG51bGx9IGFyZ3Muc2VydmVyVmVyc2lvbiAtIEF1dGhvcml0YXRpdmUgc2VydmVyIHZlcnNpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHJlYmFzZUNvbmZsaWN0U3VjY2Vzc29yKHtjb25mbGljdFRyYWNraW5nLCBwcmVkZWNlc3Nvciwgc2VydmVyVmVyc2lvbn0pIHtcbiAgICBjb25zdCBzdWNjZXNzb3IgPSAoYXdhaXQgY29uZmxpY3RUcmFja2luZy5tdXRhdGlvbkxvZy5wZW5kaW5nUmVjb3JkcygpKVxuICAgICAgLmZpbmQoKHJlY29yZCkgPT4gcmVjb3JkLmRlcGVuZGVuY2llcy5zb21lKChkZXBlbmRlbmN5KSA9PiBkZXBlbmRlbmN5LmNsaWVudE11dGF0aW9uSWQgPT09IHByZWRlY2Vzc29yLm11dGF0aW9uLmNsaWVudE11dGF0aW9uSWQpKVxuXG4gICAgaWYgKCFzdWNjZXNzb3IpIHJldHVyblxuXG4gICAgYXdhaXQgY29uZmxpY3RUcmFja2luZy5tdXRhdGlvbkxvZy51cGRhdGVNdXRhdGlvbih7XG4gICAgICBpZDogc3VjY2Vzc29yLmlkLFxuICAgICAgbXV0YXRpb246IHsuLi5zdWNjZXNzb3IubXV0YXRpb24sIGJhc2VWZXJzaW9uOiBzZXJ2ZXJWZXJzaW9ufVxuICAgIH0pXG4gIH1cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgc3luYyB3b3JrIHdpdGggdGhlIHNhbWUga2V5IHNvIGNhbGxlcnMgZG8gbm90IGhhdmUgdG8ga2VlcCBhcHAtbG9jYWwgbG9ja3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBMb2NrIGtleS5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBjYWxsYmFjayAtIFdvcmsgdG8gcnVuIG9uY2UgcHJldmlvdXMgd29yayBmaW5pc2hlZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgc2luZ2xlRmxpZ2h0KGtleSwgY2FsbGJhY2spIHtcbiAgICB3aGlsZSAoc3luY1Rhc2tQcm9taXNlcy5oYXMoa2V5KSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgc3luY1Rhc2tQcm9taXNlcy5nZXQoa2V5KVxuICAgICAgfSBjYXRjaCAoX2Vycm9yKSB7XG4gICAgICAgIC8vIFRoZSBmYWlsZWQgZmxpZ2h0J3Mgb3duIGNhbGxlciBvYnNlcnZlcyB0aGF0IHJlamVjdGlvbjsgY2FsbGVycyBxdWV1ZWRcbiAgICAgICAgLy8gYmVoaW5kIGl0IHN0aWxsIHJ1biB0aGVpciBvd24gd29yayBzbyBwZW5kaW5nIHJvd3MgcmV0cnkgYWZ0ZXIgdGhlIGxvY2sgY2xlYXJzLlxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHByb21pc2UgPSBjYWxsYmFjaygpXG4gICAgc3luY1Rhc2tQcm9taXNlcy5zZXQoa2V5LCBwcm9taXNlKVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHByb21pc2VcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKHN5bmNUYXNrUHJvbWlzZXMuZ2V0KGtleSkgPT09IHByb21pc2UpIHN5bmNUYXNrUHJvbWlzZXMuZGVsZXRlKGtleSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUHVsbHMgYmFja2VuZCBzeW5jIGNoYW5nZXMgd2l0aCBhIGZyYW1ld29yay1tYW5hZ2VkIGN1cnNvciByb3cuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gUHVsbCBhcmdzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdXRoZW50aWNhdGlvblRva2VuIC0gQXV0aCB0b2tlbiB0byBzZW5kIHdpdGggY2hhbmdlIHJlcXVlc3RzLlxuICAgKiBAcGFyYW0ge251bWJlcn0gW2FyZ3MuYmF0Y2hTaXplXSAtIE1heCBzeW5jcyBwZXIgcmVxdWVzdC5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gYXJncy5jdXJzb3JNb2RlbCAtIE1vZGVsIHRoYXQgcmVzcG9uZHMgdG8gZmluZEJ5L2ZpbmRPckluaXRpYWxpemVCeSBmb3IgY3Vyc29yIHBlcnNpc3RlbmNlLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5jdXJzb3JLZXkgLSBDdXJzb3Igb3B0aW9uIGtleS5cbiAgICogQHBhcmFtIHsocGF5bG9hZDogU3luY0NoYW5nZXNSZXF1ZXN0KSA9PiBQcm9taXNlPFN5bmNDaGFuZ2VzUmVzcG9uc2U+fSBhcmdzLnBvc3RDaGFuZ2VzIC0gUG9zdHMgb25lIGNoYW5nZXMgcmVxdWVzdC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBTeW5jUmVzb3VyY2VDb25maWc+fSBhcmdzLnJlc291cmNlcyAtIFJlc291cmNlIHBvbGljaWVzLlxuICAgKiBAcGFyYW0geyhwcm9ncmVzczogaW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1B1bGxQcm9ncmVzcykgPT4gdm9pZH0gW2FyZ3Mub25Qcm9ncmVzc10gLSBQcm9ncmVzcyBjYWxsYmFjay5cbiAgICogQHBhcmFtIHtBYm9ydFNpZ25hbH0gW2FyZ3Muc2lnbmFsXSAtIExpZmVjeWNsZSBjYW5jZWxsYXRpb24gc2lnbmFsLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTeW5jQ2hhbmdlc1Jlc3VsdD59IFB1bGwgcmVzdWx0LlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHB1bGxDaGFuZ2VzV2l0aEN1cnNvcihhcmdzKSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMucHVsbENoYW5nZXMoe1xuICAgICAgYXV0aGVudGljYXRpb25Ub2tlbjogYXJncy5hdXRoZW50aWNhdGlvblRva2VuLFxuICAgICAgYmF0Y2hTaXplOiBhcmdzLmJhdGNoU2l6ZSxcbiAgICAgIGxvYWRDdXJzb3I6IGFzeW5jICgpID0+IGF3YWl0IHRoaXMubG9hZFN5bmNDdXJzb3Ioe2N1cnNvcktleTogYXJncy5jdXJzb3JLZXksIGN1cnNvck1vZGVsOiBhcmdzLmN1cnNvck1vZGVsfSksXG4gICAgICBzYXZlQ3Vyc29yOiBhc3luYyAoY3Vyc29yKSA9PiBhd2FpdCB0aGlzLnNhdmVTeW5jQ3Vyc29yKHtjdXJzb3IsIGN1cnNvcktleTogYXJncy5jdXJzb3JLZXksIGN1cnNvck1vZGVsOiBhcmdzLmN1cnNvck1vZGVsfSksXG4gICAgICBwb3N0Q2hhbmdlczogYXJncy5wb3N0Q2hhbmdlcyxcbiAgICAgIGFwcGx5U3luYzogdGhpcy5yZXNvdXJjZUFwcGxpZXIoYXJncy5yZXNvdXJjZXMpLFxuICAgICAgb25Qcm9ncmVzczogYXJncy5vblByb2dyZXNzLFxuICAgICAgc2lnbmFsOiBhcmdzLnNpZ25hbFxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgYSBwZXJzaXN0ZWQgc3luYyBjdXJzb3IgZnJvbSBhIG1vZGVsIHJvdyB3aXRoIGEgdmFsdWUgY29sdW1uLlxuICAgKiBAcGFyYW0ge3tjdXJzb3JLZXk6IHN0cmluZywgY3Vyc29yTW9kZWw6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fX0gYXJncyAtIEN1cnNvciBhcmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmcgfCBudWxsPn0gUGVyc2lzdGVkIGN1cnNvciBwYXlsb2FkLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGxvYWRTeW5jQ3Vyc29yKHtjdXJzb3JLZXksIGN1cnNvck1vZGVsfSkge1xuICAgIGNvbnN0IG9wdGlvbiA9IGF3YWl0IGN1cnNvck1vZGVsLmZpbmRCeSh7a2V5OiBjdXJzb3JLZXl9KVxuXG4gICAgcmV0dXJuIG9wdGlvbiA/IG9wdGlvbi52YWx1ZSgpIDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIGEgcGVyc2lzdGVkIHN5bmMgY3Vyc29yIHRvIGEgbW9kZWwgcm93IHdpdGggYSB2YWx1ZSBjb2x1bW4uXG4gICAqIEBwYXJhbSB7e2N1cnNvcjogU3luY0N1cnNvciwgY3Vyc29yS2V5OiBzdHJpbmcsIGN1cnNvck1vZGVsOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn19IGFyZ3MgLSBDdXJzb3IgYXJncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBzdGF0aWMgYXN5bmMgc2F2ZVN5bmNDdXJzb3Ioe2N1cnNvciwgY3Vyc29yS2V5LCBjdXJzb3JNb2RlbH0pIHtcbiAgICBpZiAoIWN1cnNvcikgcmV0dXJuXG5cbiAgICBjb25zdCBvcHRpb24gPSBhd2FpdCBjdXJzb3JNb2RlbC5maW5kT3JJbml0aWFsaXplQnkoe2tleTogY3Vyc29yS2V5fSlcblxuICAgIG9wdGlvbi5hc3NpZ24oe3ZhbHVlOiBKU09OLnN0cmluZ2lmeShjdXJzb3IpfSlcbiAgICBpZiAob3B0aW9uLmlzQ2hhbmdlZCgpKSBhd2FpdCBvcHRpb24uc2F2ZSgpXG4gIH1cblxuICAvKipcbiAgICogUHVsbHMgYmFja2VuZCBzeW5jIGNoYW5nZXMgaW4gc3RhYmxlIHBhZ2VzLCBhcHBsaWVzIHRoZW0gbG9jYWxseSwgYW5kIHN0b3Jlc1xuICAgKiB0aGUgYWNrbm93bGVkZ2VkIGN1cnNvci4gQXBwcyBwcm92aWRlIG9ubHkgYXV0aCwgcGVyc2lzdGVuY2UsIHRyYW5zcG9ydCwgYW5kXG4gICAqIHJlc291cmNlIHBvbGljeSBob29rcy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBQdWxsIGFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF1dGhlbnRpY2F0aW9uVG9rZW4gLSBBdXRoIHRva2VuIHRvIHNlbmQgd2l0aCBjaGFuZ2UgcmVxdWVzdHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5iYXRjaFNpemVdIC0gTWF4IHN5bmNzIHBlciByZXF1ZXN0LiBEZWZhdWx0cyB0byAxMDAuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxTeW5jQ3Vyc29yIHwgc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZD59IGFyZ3MubG9hZEN1cnNvciAtIExvYWRzIHRoZSBwZXJzaXN0ZWQgbG9jYWwgY3Vyc29yLlxuICAgKiBAcGFyYW0geyhjdXJzb3I6IFN5bmNDdXJzb3IpID0+IFByb21pc2U8dm9pZD59IGFyZ3Muc2F2ZUN1cnNvciAtIFBlcnNpc3RzIHRoZSBmaW5hbCBhY2tub3dsZWRnZWQgY3Vyc29yLlxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiBTeW5jQ2hhbmdlc1JlcXVlc3QsIG9wdGlvbnM/OiB7c2lnbmFsPzogQWJvcnRTaWduYWx9KSA9PiBQcm9taXNlPFN5bmNDaGFuZ2VzUmVzcG9uc2U+fSBhcmdzLnBvc3RDaGFuZ2VzIC0gUG9zdHMgb25lIGNoYW5nZXMgcmVxdWVzdC5cbiAgICogQHBhcmFtIHsoc3luYzogU3luY0NoYW5nZUVudmVsb3BlKSA9PiBQcm9taXNlPFN5bmNDaGFuZ2VBcHBseVJlc3VsdD59IGFyZ3MuYXBwbHlTeW5jIC0gQXBwbGllcyBvbmUgbm9ybWFsaXplZCBzeW5jIHJvdyBsb2NhbGx5LlxuICAgKiBAcGFyYW0geyhwcm9ncmVzczogaW1wb3J0KFwiLi9zeW5jLWFwaS1jbGllbnQtdHlwZXMuanNcIikuU3luY1B1bGxQcm9ncmVzcykgPT4gdm9pZH0gW2FyZ3Mub25Qcm9ncmVzc10gLSBQcm9ncmVzcyBjYWxsYmFjayBpbnZva2VkIHBlciBhcHBsaWVkIHBhZ2UgKGFuZCBvbmNlIGZvciBhbiBlbXB0eSBwdWxsKSB3aXRoIHRoZSBhcHBsaWVkIGNvdW50cyBhbmQgdGhlIHN0YWJsZSBzZXJ2ZXIgdG90YWwuXG4gICAqIEBwYXJhbSB7QWJvcnRTaWduYWx9IFthcmdzLnNpZ25hbF0gLSBMaWZlY3ljbGUgY2FuY2VsbGF0aW9uIHNpZ25hbC5cbiAgICogQHJldHVybnMge1Byb21pc2U8U3luY0NoYW5nZXNSZXN1bHQ+fSBQdWxsIHJlc3VsdC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBwdWxsQ2hhbmdlcyhhcmdzKSB7XG4gICAgdGhyb3dJZlN5bmNBYm9ydGVkKGFyZ3Muc2lnbmFsKVxuICAgIGxldCBhZnRlckN1cnNvciA9IHRoaXMuc3luY0N1cnNvckZyb21QYXlsb2FkKGF3YWl0IGFyZ3MubG9hZEN1cnNvcigpKVxuICAgIGxldCB1cFRvQ3Vyc29yID0gbnVsbFxuICAgIGxldCBwYWdlcyA9IDBcbiAgICBsZXQgc3luY2VkQ291bnQgPSAwXG4gICAgbGV0IHRvdGFsID0gMFxuICAgIGxldCBjaGFuZ2VkID0gZmFsc2VcbiAgICBjb25zdCByZXNvdXJjZUNvdW50cyA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgbnVtYmVyPn0gKi8gKHt9KVxuICAgIGNvbnN0IHJlc291cmNlQ2hhbmdlZCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgYm9vbGVhbj59ICovICh7fSlcbiAgICBjb25zdCBiYXRjaFNpemUgPSB0aGlzLm5vcm1hbGl6ZWRCYXRjaFNpemUoYXJncy5iYXRjaFNpemUpXG5cbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgdGhyb3dJZlN5bmNBYm9ydGVkKGFyZ3Muc2lnbmFsKVxuICAgICAgY29uc3QgY2hhbmdlc1Jlc3BvbnNlID0gYXdhaXQgdGhpcy5jaGFuZ2VzUGFnZSh7Li4uYXJncywgYWZ0ZXJDdXJzb3IsIGJhdGNoU2l6ZSwgdXBUb0N1cnNvcn0pXG4gICAgICB0aHJvd0lmU3luY0Fib3J0ZWQoYXJncy5zaWduYWwpXG4gICAgICBjb25zdCBzeW5jcyA9IGNoYW5nZXNSZXNwb25zZS5zeW5jc1xuXG4gICAgICBpZiAoIXVwVG9DdXJzb3IpIHVwVG9DdXJzb3IgPSBjaGFuZ2VzUmVzcG9uc2UudXBUb0N1cnNvclxuXG4gICAgICAvLyBUaGUgc2VydmVyIGNvdW50cyBwZW5kaW5nIHJvd3MgZnJvbSB0aGlzIHJlcXVlc3QncyBjdXJzb3IsIHNvIGFscmVhZHktYXBwbGllZFxuICAgICAgLy8gcGFnZXMgcGx1cyB0aGlzIHJlcXVlc3QncyBjb3VudCBzdGF5cyB0aGUgc2FtZSB0b3RhbCBhY3Jvc3MgZXZlcnkgcGFnZTogYSBzdGFibGVcbiAgICAgIC8vIFwib2YgWVwiIGRlbm9taW5hdG9yIGV2ZW4gYXMgdGhlIGN1cnNvciBhZHZhbmNlcy4gQSBzZXJ2ZXIgdGhhdCBkb2Vzbid0IHJlcG9ydCB0aGVcbiAgICAgIC8vIGNvdW50IGF0IGFsbCBsZWF2ZXMgdGhlIHRvdGFsIGF0IDAgZm9yIGV2ZXJ5IHBhZ2UgcmF0aGVyIHRoYW4gZHJpZnRpbmcgdXB3YXJkc1xuICAgICAgLy8gd2l0aCB0aGUgYXBwbGllZCByb3dzLlxuICAgICAgaWYgKGNoYW5nZXNSZXNwb25zZS50b3RhbCAhPT0gbnVsbCkgdG90YWwgPSBzeW5jZWRDb3VudCArIGNoYW5nZXNSZXNwb25zZS50b3RhbFxuXG4gICAgICBpZiAoc3luY3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIFJlcG9ydCB0aGUgdGVybWluYWwgcHJvZ3Jlc3Mgb25jZSBmb3IgYW4gZW50aXJlbHkgZW1wdHkgcHVsbCBzbyBjb25zdW1lcnMgb2JzZXJ2ZVxuICAgICAgICAvLyB0b3RhbCAwOyBhIHB1bGwgdGhhdCBhbHJlYWR5IGFwcGxpZWQgcGFnZXMgcmVwb3J0ZWQgaXRzIGZpbmFsIGNvdW50cyBvbiBpdHMgbGFzdCBwYWdlLlxuICAgICAgICB0aHJvd0lmU3luY0Fib3J0ZWQoYXJncy5zaWduYWwpXG4gICAgICAgIGlmIChwYWdlcyA9PT0gMCAmJiBhcmdzLm9uUHJvZ3Jlc3MpIGFyZ3Mub25Qcm9ncmVzcyh7cGFnZXMsIHN5bmNlZENvdW50LCB0b3RhbH0pXG5cbiAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgcGFnZXMgKz0gMVxuXG4gICAgICAvLyBDb2FsZXNjZSByZWNvcmQtY2hhbmdlIGV2ZW50cyBhY3Jvc3MgdGhpcyBwYWdlJ3MgYXBwbGllcyBzbyBOIGFwcGxpZWQgcm93cyB0cmlnZ2VyIG9uZVxuICAgICAgLy8gbGl2ZS1xdWVyeSByZS1ydW4uIE9ubHkgdGhlIGFwcGx5IGxvb3AgaXMgYmF0Y2hlZDogdGhlIG5ldHdvcmsgcGFnZSBmZXRjaCBhYm92ZSBhbmQgdGhlXG4gICAgICAvLyBjdXJzb3Igc2F2ZSBiZWxvdyBzdGF5IG91dHNpZGUsIHNvIGxpdmUgcXVlcmllcyBmbHVzaCByaWdodCBhZnRlciB0aGUgYXBwbGllcyBpbnN0ZWFkIG9mXG4gICAgICAvLyB3YWl0aW5nIGZvciB0aGUgcmVzdCBvZiB0aGUgcHVsbC5cbiAgICAgIGF3YWl0IHJlY29yZENoYW5nZXMuYmF0Y2goYXN5bmMgKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHN5bmMgb2Ygc3luY3MpIHtcbiAgICAgICAgICB0aHJvd0lmU3luY0Fib3J0ZWQoYXJncy5zaWduYWwpXG4gICAgICAgICAgY29uc3QgYXBwbHlSZXN1bHQgPSBhd2FpdCBhcmdzLmFwcGx5U3luYyhzeW5jKVxuICAgICAgICAgIHRocm93SWZTeW5jQWJvcnRlZChhcmdzLnNpZ25hbClcbiAgICAgICAgICBjb25zdCByZXNvdXJjZVR5cGUgPSBhcHBseVJlc3VsdC5yZXNvdXJjZVR5cGUgPz8gc3luYy5yZXNvdXJjZVR5cGUoKVxuXG4gICAgICAgICAgY2hhbmdlZCB8fD0gYXBwbHlSZXN1bHQuY2hhbmdlZCA9PT0gdHJ1ZVxuICAgICAgICAgIHN5bmNlZENvdW50ICs9IDFcblxuICAgICAgICAgIGlmIChyZXNvdXJjZVR5cGUpIHtcbiAgICAgICAgICAgIHJlc291cmNlQ291bnRzW3Jlc291cmNlVHlwZV0gPSAocmVzb3VyY2VDb3VudHNbcmVzb3VyY2VUeXBlXSB8fCAwKSArIDFcbiAgICAgICAgICAgIHJlc291cmNlQ2hhbmdlZFtyZXNvdXJjZVR5cGVdIHx8PSBhcHBseVJlc3VsdC5jaGFuZ2VkID09PSB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBhZnRlckN1cnNvciA9IGNoYW5nZXNSZXNwb25zZS5uZXh0Q3Vyc29yXG5cbiAgICAgIHRocm93SWZTeW5jQWJvcnRlZChhcmdzLnNpZ25hbClcbiAgICAgIGlmIChhcmdzLm9uUHJvZ3Jlc3MpIGFyZ3Mub25Qcm9ncmVzcyh7cGFnZXMsIHN5bmNlZENvdW50LCB0b3RhbH0pXG4gICAgICBpZiAoc3luY3MubGVuZ3RoIDwgYmF0Y2hTaXplKSBicmVha1xuICAgIH1cblxuICAgIHRocm93SWZTeW5jQWJvcnRlZChhcmdzLnNpZ25hbClcbiAgICBpZiAoYWZ0ZXJDdXJzb3IpIGF3YWl0IGFyZ3Muc2F2ZUN1cnNvcihhZnRlckN1cnNvcilcbiAgICB0aHJvd0lmU3luY0Fib3J0ZWQoYXJncy5zaWduYWwpXG5cbiAgICByZXR1cm4ge2NoYW5nZWQsIHBhZ2VzLCByZXNvdXJjZUNoYW5nZWQsIHJlc291cmNlQ291bnRzLCBzeW5jZWRDb3VudCwgdG90YWx9XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBhbmQgdmFsaWRhdGVzIG9uZSBiYWNrZW5kIHN5bmMgY2hhbmdlcyBwYWdlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFBhZ2UgYXJncy5cbiAgICogQHBhcmFtIHtTeW5jQ3Vyc29yfSBhcmdzLmFmdGVyQ3Vyc29yIC0gTGFzdCBhY2tub3dsZWRnZWQgY3Vyc29yLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXJncy5hdXRoZW50aWNhdGlvblRva2VuIC0gQXV0aCB0b2tlbi5cbiAgICogQHBhcmFtIHtudW1iZXJ9IGFyZ3MuYmF0Y2hTaXplIC0gUGFnZSBzaXplLlxuICAgKiBAcGFyYW0geyhwYXlsb2FkOiBTeW5jQ2hhbmdlc1JlcXVlc3QsIG9wdGlvbnM/OiB7c2lnbmFsPzogQWJvcnRTaWduYWx9KSA9PiBQcm9taXNlPFN5bmNDaGFuZ2VzUmVzcG9uc2U+fSBhcmdzLnBvc3RDaGFuZ2VzIC0gQ2hhbmdlcyBwb3N0ZXIuXG4gICAqIEBwYXJhbSB7QWJvcnRTaWduYWx9IFthcmdzLnNpZ25hbF0gLSBMaWZlY3ljbGUgY2FuY2VsbGF0aW9uIHNpZ25hbC5cbiAgICogQHBhcmFtIHtTeW5jQ3Vyc29yfSBhcmdzLnVwVG9DdXJzb3IgLSBTbmFwc2hvdCB1cHBlci1ib3VuZCBjdXJzb3IuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtuZXh0Q3Vyc29yOiBTeW5jQ3Vyc29yLCBzeW5jczogU3luY0NoYW5nZUVudmVsb3BlW10sIHRvdGFsOiBudW1iZXIgfCBudWxsLCB1cFRvQ3Vyc29yOiBTeW5jQ3Vyc29yfT59IE5vcm1hbGl6ZWQgY2hhbmdlcyBwYWdlLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGNoYW5nZXNQYWdlKHthZnRlckN1cnNvciwgYXV0aGVudGljYXRpb25Ub2tlbiwgYmF0Y2hTaXplLCBwb3N0Q2hhbmdlcywgc2lnbmFsLCB1cFRvQ3Vyc29yfSkge1xuICAgIHRocm93SWZTeW5jQWJvcnRlZChzaWduYWwpXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwb3N0Q2hhbmdlcyh7XG4gICAgICBhdXRoZW50aWNhdGlvblRva2VuLFxuICAgICAgbGltaXQ6IGJhdGNoU2l6ZSxcbiAgICAgIC4uLnRoaXMuY3Vyc29yUGF5bG9hZChcImFmdGVyXCIsIGFmdGVyQ3Vyc29yKSxcbiAgICAgIC4uLnRoaXMuY3Vyc29yUGF5bG9hZChcInVwVG9cIiwgdXBUb0N1cnNvcilcbiAgICB9LCB7c2lnbmFsfSlcblxuICAgIHRocm93SWZTeW5jQWJvcnRlZChzaWduYWwpXG4gICAgdGhpcy5lbnN1cmVTdWNjZXNzZnVsQ2hhbmdlc1Jlc3BvbnNlKHJlc3BvbnNlKVxuXG4gICAgY29uc3Qgc3luY3MgPSAvKiogQHR5cGUge3Vua25vd25bXX0gKi8gKHJlc3BvbnNlLnN5bmNzKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5leHRDdXJzb3I6IHRoaXMuc3luY0N1cnNvckZyb21QYXlsb2FkKHJlc3BvbnNlLm5leHRDdXJzb3IgPz8gbnVsbCksXG4gICAgICBzeW5jczogc3luY3MubWFwKChzeW5jUGF5bG9hZCkgPT4gdGhpcy5zeW5jRW52ZWxvcGVGcm9tUGF5bG9hZChzeW5jUGF5bG9hZCkpLFxuICAgICAgdG90YWw6IG9wdGlvbmFsSW50ZWdlcihyZXNwb25zZS50b3RhbCksXG4gICAgICB1cFRvQ3Vyc29yOiB0aGlzLnN5bmNDdXJzb3JGcm9tUGF5bG9hZChyZXNwb25zZS51cFRvQ3Vyc29yID8/IG51bGwpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBBUEkgcmVzcG9uc2Ugc3RhdHVzIGFuZCBzaGFwZSBmb3IgY2hhbmdlLWZlZWQgcHVsbHMuXG4gICAqIEBwYXJhbSB7U3luY0NoYW5nZXNSZXNwb25zZX0gcmVzcG9uc2UgLSBDaGFuZ2VzIHJlc3BvbnNlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBlbnN1cmVTdWNjZXNzZnVsQ2hhbmdlc1Jlc3BvbnNlKHJlc3BvbnNlKSB7XG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gXCJlcnJvclwiKSB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2UuZXJyb3JNZXNzYWdlIHx8IFwiU3luYyBjaGFuZ2VzIGZhaWxlZFwiKVxuICAgIGlmICghQXJyYXkuaXNBcnJheShyZXNwb25zZS5zeW5jcykpIHRocm93IG5ldyBFcnJvcihcIlN5bmMgY2hhbmdlcyByZXNwb25zZSBtaXNzaW5nIHN5bmNzXCIpXG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBjdXJzb3IgaW50byByZXF1ZXN0IHBhcmFtcyB3aXRoIHRoZSBnaXZlbiBwcmVmaXguXG4gICAqIEBwYXJhbSB7XCJhZnRlclwiIHwgXCJ1cFRvXCJ9IHByZWZpeCAtIFJlcXVlc3QgZmllbGQgcHJlZml4LlxuICAgKiBAcGFyYW0ge1N5bmNDdXJzb3J9IGN1cnNvciAtIEN1cnNvciB0byBzZXJpYWxpemUuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXIgfCBudWxsPn0gUmVxdWVzdCBwYXJhbXMuXG4gICAqL1xuICBzdGF0aWMgY3Vyc29yUGF5bG9hZChwcmVmaXgsIGN1cnNvcikge1xuICAgIGlmICghY3Vyc29yKSByZXR1cm4ge31cblxuICAgIHJldHVybiB7XG4gICAgICBbYCR7cHJlZml4fUlkYF06IGN1cnNvci5pZCxcbiAgICAgIC4uLihjdXJzb3Iuc2VydmVyU2VxdWVuY2UgPyB7W2Ake3ByZWZpeH1TZXJ2ZXJTZXF1ZW5jZWBdOiBjdXJzb3Iuc2VydmVyU2VxdWVuY2V9IDoge30pLFxuICAgICAgW2Ake3ByZWZpeH1VcGRhdGVkQXRgXTogY3Vyc29yLnVwZGF0ZWRBdFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYSBwZXJzaXN0ZWQgb3IgcmVzcG9uc2UgY3Vyc29yIHBheWxvYWQuXG4gICAqIEBwYXJhbSB7U3luY0N1cnNvciB8IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+PiB8IG51bGwgfCB1bmRlZmluZWR9IHBheWxvYWQgLSBDdXJzb3IgcGF5bG9hZC5cbiAgICogQHJldHVybnMge1N5bmNDdXJzb3J9IFBhcnNlZCBjdXJzb3IuXG4gICAqL1xuICBzdGF0aWMgc3luY0N1cnNvckZyb21QYXlsb2FkKHBheWxvYWQpIHtcbiAgICBpZiAoIXBheWxvYWQpIHJldHVybiBudWxsXG5cbiAgICBpZiAodHlwZW9mIHBheWxvYWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmNDdXJzb3JGcm9tUGF5bG9hZChKU09OLnBhcnNlKHBheWxvYWQpKVxuICAgICAgfSBjYXRjaCAoX2Vycm9yKSB7XG4gICAgICAgIHJldHVybiB7aWQ6IG51bGwsIHNlcnZlclNlcXVlbmNlOiBudWxsLCB1cGRhdGVkQXQ6IHBheWxvYWR9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBwYXlsb2FkICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkocGF5bG9hZCkpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCB1cGRhdGVkQXQgPSB0eXBlb2YgcGF5bG9hZC51cGRhdGVkQXQgPT09IFwic3RyaW5nXCIgPyBwYXlsb2FkLnVwZGF0ZWRBdCA6IG51bGxcblxuICAgIGlmICghdXBkYXRlZEF0KSByZXR1cm4gbnVsbFxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBwYXlsb2FkLmlkID09PSBudWxsIHx8IHBheWxvYWQuaWQgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBTdHJpbmcocGF5bG9hZC5pZCksXG4gICAgICBzZXJ2ZXJTZXF1ZW5jZTogb3B0aW9uYWxJbnRlZ2VyKHBheWxvYWQuc2VydmVyU2VxdWVuY2UgPT09IFwiXCIgPyBudWxsIDogcGF5bG9hZC5zZXJ2ZXJTZXF1ZW5jZSksXG4gICAgICB1cGRhdGVkQXRcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGEgbm9ybWFsaXplZCBzeW5jIHJvdyBhZGFwdGVyLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBwYXlsb2FkIC0gUmF3IHN5bmMgcGF5bG9hZC5cbiAgICogQHJldHVybnMge1N5bmNDaGFuZ2VFbnZlbG9wZX0gU3luYyByb3cgYWRhcHRlci5cbiAgICovXG4gIHN0YXRpYyBzeW5jRW52ZWxvcGVGcm9tUGF5bG9hZChwYXlsb2FkKSB7XG4gICAgaWYgKCFwYXlsb2FkIHx8IHR5cGVvZiBwYXlsb2FkICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkocGF5bG9hZCkpIHRocm93IG5ldyBFcnJvcihcIlN5bmMgY2hhbmdlcyBlbnRyeSBtdXN0IGJlIGFuIG9iamVjdFwiKVxuXG4gICAgY29uc3Qgc3luY1BheWxvYWQgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gKi8gKHBheWxvYWQpXG5cbiAgICByZXR1cm4ge1xuICAgICAgZGF0YTogKCkgPT4gc3luY1BheWxvYWQuZGF0YSxcbiAgICAgIGlkOiAoKSA9PiBzeW5jUGF5bG9hZC5pZCxcbiAgICAgIHJlc291cmNlSWQ6ICgpID0+IHN5bmNQYXlsb2FkLnJlc291cmNlSWQsXG4gICAgICByZXNvdXJjZVR5cGU6ICgpID0+IHN5bmNQYXlsb2FkLnJlc291cmNlVHlwZSA9PT0gbnVsbCB8fCBzeW5jUGF5bG9hZC5yZXNvdXJjZVR5cGUgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBTdHJpbmcoc3luY1BheWxvYWQucmVzb3VyY2VUeXBlKSxcbiAgICAgIHN5bmNUeXBlOiAoKSA9PiBzeW5jUGF5bG9hZC5zeW5jVHlwZSA9PT0gbnVsbCB8fCBzeW5jUGF5bG9hZC5zeW5jVHlwZSA9PT0gdW5kZWZpbmVkID8gXCJcIiA6IFN0cmluZyhzeW5jUGF5bG9hZC5zeW5jVHlwZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGFuIGFwcC1jb25maWd1cmVkIHJlc291cmNlIGFwcGxpZXIgZm9yIHB1bGxlZCBzeW5jIHJvd3MuIFRoZSBzeW5jXG4gICAqIG1lY2hhbmljcyBzdGF5IGhlcmU7IGFwcHMgb25seSBkZWNsYXJlIHdoaWNoIG1vZGVscy9hdHRyaWJ1dGVzL2hvb2tzIGFyZVxuICAgKiBhbGxvd2VkIGZvciBlYWNoIHJlc291cmNlIHR5cGUuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgU3luY1Jlc291cmNlQ29uZmlnPn0gcmVzb3VyY2VzIC0gUmVzb3VyY2UgcG9saWN5IG1hcC5cbiAgICogQHBhcmFtIHsocmVjb3JkOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPikgPT4gKCkgPT4gdm9pZH0gW29uUmVjb3JkXSAtIENhbGxlZCB3aXRoIGVhY2ggcmVjb3JkIGFib3V0IHRvIGJlIHdyaXR0ZW47IHJldHVybnMgYSByZWxlYXNlIGNhbGxiYWNrIGludm9rZWQgYWZ0ZXIgdGhlIHdyaXRlICh1c2VkIGZvciBlY2hvIHN1cHByZXNzaW9uKS5cbiAgICogQHJldHVybnMgeyhzeW5jOiBTeW5jQ2hhbmdlRW52ZWxvcGUpID0+IFByb21pc2U8U3luY0NoYW5nZUFwcGx5UmVzdWx0Pn0gU3luYyBhcHBseSBjYWxsYmFjay5cbiAgICovXG4gIHN0YXRpYyByZXNvdXJjZUFwcGxpZXIocmVzb3VyY2VzLCBvblJlY29yZCkge1xuICAgIHJldHVybiBhc3luYyAoc3luYykgPT4gYXdhaXQgdGhpcy5hcHBseVJlc291cmNlU3luYyh7b25SZWNvcmQsIHJlc291cmNlcywgc3luY30pXG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBvbmUgc3luYyByb3cgdXNpbmcgZGVjbGFyYXRpdmUgcmVzb3VyY2UgcG9saWN5LlxuICAgKiBAcGFyYW0ge3tyZXNvdXJjZXM6IFJlY29yZDxzdHJpbmcsIFN5bmNSZXNvdXJjZUNvbmZpZz4sIHN5bmM6IFN5bmNDaGFuZ2VFbnZlbG9wZSwgb25SZWNvcmQ/OiAocmVjb3JkOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPikgPT4gKCkgPT4gdm9pZH19IGFyZ3MgLSBBcHBseSBhcmdzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTeW5jQ2hhbmdlQXBwbHlSZXN1bHQ+fSBBcHBseSByZXN1bHQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgYXBwbHlSZXNvdXJjZVN5bmMoe29uUmVjb3JkLCByZXNvdXJjZXMsIHN5bmN9KSB7XG4gICAgY29uc3QgcmVzb3VyY2VUeXBlID0gc3luYy5yZXNvdXJjZVR5cGUoKVxuICAgIGNvbnN0IHJlc291cmNlID0gcmVzb3VyY2VUeXBlID8gcmVzb3VyY2VzW3Jlc291cmNlVHlwZV0gOiB1bmRlZmluZWRcblxuICAgIGlmICghcmVzb3VyY2UgfHwgIXJlc291cmNlLmVuYWJsZWQpIHJldHVybiB7Y2hhbmdlZDogZmFsc2UsIHJlc291cmNlVHlwZX1cblxuICAgIGlmIChzeW5jLnN5bmNUeXBlKCkgPT09IFwiZGVsZXRlXCIpIHtcbiAgICAgIHJldHVybiB7Y2hhbmdlZDogYXdhaXQgdGhpcy5kZXN0cm95U3luY2VkUmVzb3VyY2Uoe29uUmVjb3JkLCByZXNvdXJjZSwgc3luY30pLCByZXNvdXJjZVR5cGV9XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IHRoaXMuc3luY0RhdGEoc3luYylcbiAgICBjb25zdCByZWNvcmQgPSByZXNvdXJjZS5maW5kUmVjb3JkID8gYXdhaXQgcmVzb3VyY2UuZmluZFJlY29yZCh7ZGF0YSwgcmVzb3VyY2VJZDogc3luYy5yZXNvdXJjZUlkKCksIHN5bmN9KSA6IGF3YWl0IHJlc291cmNlLm1vZGVsQ2xhc3MuZmluZE9ySW5pdGlhbGl6ZUJ5KHtpZDogZGF0YS5pZCA/PyBzeW5jLnJlc291cmNlSWQoKX0pXG4gICAgY29uc3QgYXR0cmlidXRlcyA9IGF3YWl0IHJlc291cmNlLmF0dHJpYnV0ZXMoe2RhdGEsIHJlY29yZCwgc3luY30pXG4gICAgY29uc3QgcmVsZWFzZVJlY29yZCA9IG9uUmVjb3JkID8gb25SZWNvcmQocmVjb3JkKSA6IG51bGxcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlXG5cbiAgICB0cnkge1xuICAgICAgcmVjb3JkLmFzc2lnbihhdHRyaWJ1dGVzKVxuXG4gICAgICBpZiAocmVjb3JkLmlzQ2hhbmdlZCgpKSB7XG4gICAgICAgIGF3YWl0IHJlY29yZC5zYXZlKClcbiAgICAgICAgY2hhbmdlZCA9IHRydWVcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc291cmNlLmFmdGVyQXBwbHkpIHtcbiAgICAgICAgY29uc3QgaG9va0NoYW5nZWQgPSBhd2FpdCByZXNvdXJjZS5hZnRlckFwcGx5KHthdHRyaWJ1dGVzLCBkYXRhLCByZWNvcmQsIHN5bmN9KVxuXG4gICAgICAgIGNoYW5nZWQgfHw9IGhvb2tDaGFuZ2VkID09PSB0cnVlXG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChyZWxlYXNlUmVjb3JkKSByZWxlYXNlUmVjb3JkKClcbiAgICB9XG5cbiAgICByZXR1cm4ge2NoYW5nZWQsIHJlc291cmNlVHlwZX1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyBhIHN5bmNlZCByZXNvdXJjZSB2aWEgaXRzIGRlY2xhcmVkIG1vZGVsIHBvbGljeS5cbiAgICogQHBhcmFtIHt7cmVzb3VyY2U6IFN5bmNSZXNvdXJjZUNvbmZpZywgc3luYzogU3luY0NoYW5nZUVudmVsb3BlLCBvblJlY29yZD86IChyZWNvcmQ6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+KSA9PiAoKSA9PiB2b2lkfX0gYXJncyAtIERlc3Ryb3kgYXJncy5cbiAgICogQHJldHVybnMge1Byb21pc2U8Ym9vbGVhbj59IFdoZXRoZXIgYSBsb2NhbCByb3cgd2FzIGRlc3Ryb3llZC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBkZXN0cm95U3luY2VkUmVzb3VyY2Uoe29uUmVjb3JkLCByZXNvdXJjZSwgc3luY30pIHtcbiAgICBjb25zdCBpZCA9IHN5bmMucmVzb3VyY2VJZCgpXG4gICAgY29uc3QgcmVjb3JkID0gcmVzb3VyY2UuZmluZFJlY29yZEZvckRlbGV0ZSA/IGF3YWl0IHJlc291cmNlLmZpbmRSZWNvcmRGb3JEZWxldGUoe3Jlc291cmNlSWQ6IGlkLCBzeW5jfSkgOiBhd2FpdCByZXNvdXJjZS5tb2RlbENsYXNzLmZpbmRCeSh7aWR9KVxuXG4gICAgaWYgKCFyZWNvcmQpIHJldHVybiBmYWxzZVxuXG4gICAgY29uc3QgcmVsZWFzZVJlY29yZCA9IG9uUmVjb3JkID8gb25SZWNvcmQocmVjb3JkKSA6IG51bGxcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCByZWNvcmQuZGVzdHJveSgpXG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChyZWxlYXNlUmVjb3JkKSByZWxlYXNlUmVjb3JkKClcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyB0aGUgZW1iZWRkZWQgc3luYyBkYXRhIEpTT04vb2JqZWN0LlxuICAgKiBAcGFyYW0ge1N5bmNDaGFuZ2VFbnZlbG9wZX0gc3luYyAtIFN5bmMgcm93LlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFN5bmMgZGF0YSBvYmplY3QuXG4gICAqL1xuICBzdGF0aWMgc3luY0RhdGEoc3luYykge1xuICAgIGNvbnN0IGRhdGEgPSBzeW5jLmRhdGEoKVxuXG4gICAgaWYgKCFkYXRhKSB0aHJvdyBuZXcgRXJyb3IoYFN5bmMgJHtzeW5jLmlkKCl9IGlzIG1pc3NpbmcgZGF0YWApXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiKSByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKEpTT04ucGFyc2UoZGF0YSkpXG4gICAgaWYgKHR5cGVvZiBkYXRhID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KGRhdGEpKSByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKGRhdGEpXG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFN5bmMgJHtzeW5jLmlkKCl9IGhhcyBpbnZhbGlkIGRhdGFgKVxuICB9XG5cbiAgLyoqXG4gICAqIERyYWlucyBwZW5kaW5nIHN5bmMgcmVjb3JkcyBmcm9tIGEgbG9jYWwgVmVsb2Npb3VzIG1vZGVsIGluIHN0YWJsZSBvcmRlci5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBSZXBsYXkgYXJncy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXV0aGVudGljYXRpb25Ub2tlbiAtIEF1dGggdG9rZW4gdG8gc2VuZCB3aXRoIHJlcGxheSByZXF1ZXN0cy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmJhdGNoU2l6ZV0gLSBNYXggc3luY3MgcGVyIHJlcXVlc3QuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGFyZ3Muc3luY01vZGVsIC0gTG9jYWwgU3luYyBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHsocGF5bG9hZDoge2F1dGhlbnRpY2F0aW9uVG9rZW46IHN0cmluZywgc3luY3M6IEFycmF5PFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pj59LCBvcHRpb25zPzoge3NpZ25hbD86IEFib3J0U2lnbmFsfSkgPT4gUHJvbWlzZTxTeW5jUmVwbGF5UmVzcG9uc2U+fSBhcmdzLnBvc3RSZXBsYXkgLSBSZXBsYXkgcG9zdGVyLlxuICAgKiBAcGFyYW0ge0Fib3J0U2lnbmFsfSBbYXJncy5zaWduYWxdIC0gTGlmZWN5Y2xlIGNhbmNlbGxhdGlvbiBzaWduYWwuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHJlcGxheUxvY2FsU3luY3MoYXJncykge1xuICAgIGNvbnN0IHBvc3RlZFNuYXBzaG90c0J5U3luY0lkID0gbmV3IE1hcCgpXG5cbiAgICBhd2FpdCB0aGlzLnJlcGxheVBlbmRpbmcoe1xuICAgICAgYXV0aGVudGljYXRpb25Ub2tlbjogYXJncy5hdXRoZW50aWNhdGlvblRva2VuLFxuICAgICAgYmF0Y2hTaXplOiBhcmdzLmJhdGNoU2l6ZSxcbiAgICAgIG1hcmtTdWNjZXNzZnVsOiBhc3luYyAoc3luYykgPT4ge1xuICAgICAgICBjb25zdCBzeW5jSWQgPSAoLyoqIEB0eXBlIHt7aWQ6ICgpID0+IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWR9fSAqLyAoc3luYykpLmlkKClcbiAgICAgICAgLy8gUmVsb2FkIHdpdGggdGhlIHJlc291cmNlIHByZWxvYWRlZCBzbyByb3dzIHJlbHlpbmcgb24gdGhlIHJlc291cmNlLWF0dHJpYnV0ZXNcbiAgICAgICAgLy8gZmFsbGJhY2sgaW4gbG9jYWxTeW5jRGF0YSBjb21wYXJlIGFnYWluc3QgdGhlIHNhbWUgc25hcHNob3QgdGhleSBwb3N0ZWQuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTeW5jID0gYXdhaXQgYXJncy5zeW5jTW9kZWwucHJlbG9hZCh7cmVzb3VyY2U6IHRydWV9KS53aGVyZSh7aWQ6IHN5bmNJZH0pLmZpcnN0KClcblxuICAgICAgICBpZiAoIWN1cnJlbnRTeW5jKSByZXR1cm5cbiAgICAgICAgLy8gQSByb3cgZWRpdGVkIHdoaWxlIGl0cyBvbGQgcGF5bG9hZCB3YXMgaW4gZmxpZ2h0IHN0YXlzIHBlbmRpbmcsIHNvIHRoZVxuICAgICAgICAvLyBuZXdlciBsb2NhbCBjaGFuZ2UgcmVwbGF5cyBvbiB0aGUgbmV4dCBkcmFpbiBpbnN0ZWFkIG9mIGJlaW5nIGxvc3QuXG4gICAgICAgIGlmICh0aGlzLmxvY2FsU3luY1JlcGxheVNuYXBzaG90KGN1cnJlbnRTeW5jKSAhPT0gcG9zdGVkU25hcHNob3RzQnlTeW5jSWQuZ2V0KFN0cmluZyhzeW5jSWQpKSkgcmV0dXJuXG5cbiAgICAgICAgYXdhaXQgY3VycmVudFN5bmMudXBkYXRlKHtzdGF0ZTogXCJzdWNjZXNzXCJ9KVxuICAgICAgfSxcbiAgICAgIHBlbmRpbmdTeW5jczogYXN5bmMgKCkgPT4gYXdhaXQgYXJncy5zeW5jTW9kZWwucHJlbG9hZCh7cmVzb3VyY2U6IHRydWV9KS53aGVyZSh7c3RhdGU6IFwicGVuZGluZ1wifSkub3JkZXIoXCJjcmVhdGVkX2F0XCIpLnRvQXJyYXkoKSxcbiAgICAgIHBvc3RSZXBsYXk6IGFyZ3MucG9zdFJlcGxheSxcbiAgICAgIHNpZ25hbDogYXJncy5zaWduYWwsXG4gICAgICBzeW5jSWQ6IChzeW5jKSA9PiAoLyoqIEB0eXBlIHt7aWQ6ICgpID0+IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWR9fSAqLyAoc3luYykpLmlkKCksXG4gICAgICBzeW5jUGF5bG9hZDogKHN5bmMpID0+IHtcbiAgICAgICAgcG9zdGVkU25hcHNob3RzQnlTeW5jSWQuc2V0KFN0cmluZygoLyoqIEB0eXBlIHt7aWQ6ICgpID0+IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWR9fSAqLyAoc3luYykpLmlkKCkpLCB0aGlzLmxvY2FsU3luY1JlcGxheVNuYXBzaG90KHN5bmMpKVxuXG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsU3luY1BheWxvYWQoc3luYylcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgdGhlIHJlcGxheS1yZWxldmFudCBzdGF0ZSBvZiBhIGxvY2FsIHN5bmMgcm93IGZvciBpbi1mbGlnaHQgY29tcGFyaXNvbnMuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IHN5bmMgLSBMb2NhbCBzeW5jIHJvdy5cbiAgICogQHJldHVybnMge3N0cmluZ30gU3RhYmxlIHNuYXBzaG90IG9mIHRoZSByb3cncyByZXBsYXllZCBwYXlsb2FkLlxuICAgKi9cbiAgc3RhdGljIGxvY2FsU3luY1JlcGxheVNuYXBzaG90KHN5bmMpIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe2RhdGE6IHRoaXMubG9jYWxTeW5jRGF0YShzeW5jKSwgc3luY1R5cGU6IHN5bmMuc3luY1R5cGUoKX0pXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIG9uZSByZXBsYXkgZW52ZWxvcGUgZnJvbSBhIGxvY2FsIHN5bmMgcm93LlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBzeW5jIC0gTG9jYWwgc3luYyByb3cuXG4gICAqIEByZXR1cm5zIHt7Y2xpZW50VXBkYXRlZEF0Pzogc3RyaW5nLCBkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgaWQ6IG51bWJlciwgcmVzb3VyY2VJZDogc3RyaW5nLCByZXNvdXJjZVR5cGU6IHN0cmluZywgc3luY1R5cGU6IHN0cmluZ319IFN5bmMgcmVwbGF5IGVudmVsb3BlLlxuICAgKi9cbiAgc3RhdGljIGxvY2FsU3luY1BheWxvYWQoc3luYykge1xuICAgIGNvbnN0IGNsaWVudFVwZGF0ZWRBdCA9IHN5bmMudXBkYXRlZEF0KCkgfHwgc3luYy5jcmVhdGVkQXQoKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNsaWVudFVwZGF0ZWRBdDogY2xpZW50VXBkYXRlZEF0ID8gY2xpZW50VXBkYXRlZEF0LnRvSVNPU3RyaW5nKCkgOiB1bmRlZmluZWQsXG4gICAgICBkYXRhOiB0aGlzLmxvY2FsU3luY0RhdGEoc3luYyksXG4gICAgICBpZDogLyoqIEB0eXBlIHtudW1iZXJ9ICovICgvKiogQHR5cGUge3Vua25vd259ICovIChzeW5jLmlkKCkpKSxcbiAgICAgIHJlc291cmNlSWQ6IFN0cmluZyhzeW5jLnJlc291cmNlSWQoKSksXG4gICAgICByZXNvdXJjZVR5cGU6IHN5bmMucmVzb3VyY2VUeXBlKCkgfHwgXCJcIixcbiAgICAgIHN5bmNUeXBlOiBzeW5jLnN5bmNUeXBlKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgb25lIGxvY2FsIHN5bmMgcm93IHBheWxvYWQsIGZhbGxpbmcgYmFjayB0byBwcmVsb2FkZWQgcmVzb3VyY2UgYXR0cmlidXRlcy5cbiAgICogQHBhcmFtIHtSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPn0gc3luYyAtIExvY2FsIHN5bmMgcm93LlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFN5bmMgZGF0YS5cbiAgICovXG4gIHN0YXRpYyBsb2NhbFN5bmNEYXRhKHN5bmMpIHtcbiAgICBsZXQgc3luY0RhdGEgPSAvKiogQHR5cGUge3N0cmluZyB8IFJlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAoc3luYy5kYXRhKCkgfHwge30pXG5cbiAgICBpZiAodHlwZW9mIHN5bmNEYXRhID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzeW5jRGF0YSA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovIChKU09OLnBhcnNlKHN5bmNEYXRhKSlcbiAgICAgIH0gY2F0Y2ggKF9lcnJvcikge1xuICAgICAgICBzeW5jRGF0YSA9IHt9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKHN5bmNEYXRhKS5sZW5ndGggPiAwKSByZXR1cm4gc3luY0RhdGFcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHN5bmMucmVzb3VyY2UoKS5hdHRyaWJ1dGVzKCkpXG4gICAgfSBjYXRjaCAoX2Vycm9yKSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUXVldWVzIGEgbG9jYWwgc3luYyByb3cgZm9yIGEgVmVsb2Npb3VzIG1vZGVsIHJlc291cmNlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFF1ZXVlIGFyZ3MuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGFyZ3MucmVzb3VyY2UgLSBSZXNvdXJjZSBiZWluZyBzeW5jZWQuXG4gICAqIEBwYXJhbSB7UmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT59IGFyZ3Muc3luY01vZGVsIC0gTG9jYWwgU3luYyBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gW2FyZ3MuZGF0YV0gLSBFeHBsaWNpdCBzeW5jIGRhdGEuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbYXJncy5zeW5jVHlwZV0gLSBTeW5jIG9wZXJhdGlvbiB0eXBlLlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBbYXJncy5sb2NhbE9ubHlBdHRyaWJ1dGVzXSAtIEF0dHJpYnV0ZXMgdG8gc3RyaXAgZnJvbSBxdWV1ZWQgcGF5bG9hZHMuXG4gICAqIEBwYXJhbSB7c3RyaW5nW119IFthcmdzLmJvb2xlYW5BdHRyaWJ1dGVzXSAtIEF0dHJpYnV0ZXMgdG8gY29lcmNlIHRocm91Z2ggc3luYyBib29sZWFuIHBhcnNpbmcuXG4gICAqIEBwYXJhbSB7KGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gW2FyZ3Mubm9ybWFsaXplRGF0YV0gLSBBcHAtc3BlY2lmaWMgZGF0YSBub3JtYWxpemVyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj59IExvY2FsIHN5bmMgcm93LlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIHF1ZXVlTG9jYWxTeW5jKGFyZ3MpIHtcbiAgICBjb25zdCByZXNvdXJjZVJlY29yZElkID0gc2NhbGFyTW9kZWxQcmltYXJ5S2V5VmFsdWUoYXJncy5yZXNvdXJjZS5pZCgpLCBcIkxvY2FsIHN5bmMgcXVldWVpbmdcIilcbiAgICBjb25zdCBtb2RlbENsYXNzID0gYXJncy5yZXNvdXJjZS5jb25zdHJ1Y3RvclxuXG4gICAgaWYgKHR5cGVvZiBtb2RlbENsYXNzLmdldE1vZGVsTmFtZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgcmVzb3VyY2UgbW9kZWwgY2xhc3MgbXVzdCBpbXBsZW1lbnQgc3RhdGljIGdldE1vZGVsTmFtZSgpIHRvIHF1ZXVlIHN5bmMgZGF0YSAtIGNsYXNzIG5hbWVzIGFyZSBub3Qgc3RhYmxlIGFjcm9zcyBleHBsaWNpdCBtb2RlbCBuYW1lcyBhbmQgbWluaWZpZWQgYnVuZGxlc1wiKVxuICAgIH1cblxuICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IG1vZGVsQ2xhc3MuZ2V0TW9kZWxOYW1lKClcbiAgICBjb25zdCBzeW5jRGF0YSA9IHRoaXMucXVldWVkU3luY0RhdGEoYXJncylcbiAgICBjb25zdCBzeW5jVHlwZSA9IGFyZ3Muc3luY1R5cGUgfHwgXCJ1cGRhdGVcIlxuXG4gICAgaWYgKCFyZXNvdXJjZVJlY29yZElkKSB0aHJvdyBuZXcgRXJyb3IoXCJyZXNvdXJjZS5pZCgpIGlzIHJlcXVpcmVkIHRvIHF1ZXVlIHN5bmMgZGF0YVwiKVxuXG4gICAgY29uc3QgcmVzb3VyY2VJZCA9IFN0cmluZyhyZXNvdXJjZVJlY29yZElkKVxuICAgIGNvbnN0IGV4aXN0aW5nU3luYyA9IGF3YWl0IGFyZ3Muc3luY01vZGVsLmZpbmRCeSh7cmVzb3VyY2VJZCwgcmVzb3VyY2VUeXBlfSlcblxuICAgIGlmIChleGlzdGluZ1N5bmMpIHtcbiAgICAgIGF3YWl0IGV4aXN0aW5nU3luYy51cGRhdGUoe1xuICAgICAgICBkYXRhOiBzeW5jRGF0YSxcbiAgICAgICAgc3RhdGU6IFwicGVuZGluZ1wiLFxuICAgICAgICBzeW5jVHlwZVxuICAgICAgfSlcblxuICAgICAgcmV0dXJuIGV4aXN0aW5nU3luY1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBhcmdzLnN5bmNNb2RlbC5jcmVhdGUoe1xuICAgICAgZGF0YTogc3luY0RhdGEsXG4gICAgICByZXNvdXJjZUlkLFxuICAgICAgcmVzb3VyY2VUeXBlLFxuICAgICAgc3RhdGU6IFwicGVuZGluZ1wiLFxuICAgICAgc3luY1R5cGVcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBiYWNrZW5kLXNhZmUgcXVldWVkIHN5bmMgZGF0YSB3aXRob3V0IG11dGF0aW5nIGNhbGxlciBkYXRhLiBUaGUgZGVmYXVsdFxuICAgKiAobm8gZXhwbGljaXQgYGRhdGFgKSBpcyB0aGUgcmVzb3VyY2UncyBhdHRyaWJ1dGVzIG1pbnVzIGxvY2FsLW9ubHkgYXR0cmlidXRlcyxcbiAgICogd2l0aCBib29sZWFucyBjb2VyY2VkIGFuZCBEYXRlIHZhbHVlcyBzZXJpYWxpemVkIHRvIElTTyBzdHJpbmdzLCBzbyBhcHBzIGRvbid0XG4gICAqIG5lZWQgcGVyLW1vZGVsIHRyYWNrZWQtcGF5bG9hZCBidWlsZGVycy5cbiAgICogQHBhcmFtIHt7cmVzb3VyY2U6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGxvY2FsT25seUF0dHJpYnV0ZXM/OiBzdHJpbmdbXSwgYm9vbGVhbkF0dHJpYnV0ZXM/OiBzdHJpbmdbXSwgbm9ybWFsaXplRGF0YT86IChkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj59fSBhcmdzIC0gRGF0YSBhcmdzLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFF1ZXVlZCBkYXRhLlxuICAgKi9cbiAgc3RhdGljIHF1ZXVlZFN5bmNEYXRhKGFyZ3MpIHtcbiAgICBjb25zdCBpbnB1dERhdGEgPSBhcmdzLmRhdGEgPz8gLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKGFyZ3MucmVzb3VyY2UuYXR0cmlidXRlcygpKVxuICAgIGNvbnN0IG5vcm1hbGl6ZWREYXRhID0gYXJncy5ub3JtYWxpemVEYXRhID8gYXJncy5ub3JtYWxpemVEYXRhKGlucHV0RGF0YSkgOiBpbnB1dERhdGFcbiAgICBjb25zdCBzeW5jRGF0YSA9IHsuLi5ub3JtYWxpemVkRGF0YX1cblxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBhcmdzLmxvY2FsT25seUF0dHJpYnV0ZXMgfHwgW10pIGRlbGV0ZSBzeW5jRGF0YVthdHRyaWJ1dGVOYW1lXVxuICAgIGZvciAoY29uc3QgYXR0cmlidXRlTmFtZSBvZiBhcmdzLmJvb2xlYW5BdHRyaWJ1dGVzIHx8IFtdKSB7XG4gICAgICBpZiAoT2JqZWN0Lmhhc093bihzeW5jRGF0YSwgYXR0cmlidXRlTmFtZSkpIHN5bmNEYXRhW2F0dHJpYnV0ZU5hbWVdID0gdGhpcy5vcHRpb25hbEJvb2xlYW5TeW5jVmFsdWUoc3luY0RhdGFbYXR0cmlidXRlTmFtZV0sIGF0dHJpYnV0ZU5hbWUpXG4gICAgfVxuICAgIGZvciAoY29uc3QgW2F0dHJpYnV0ZU5hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzeW5jRGF0YSkpIHtcbiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHN5bmNEYXRhW2F0dHJpYnV0ZU5hbWVdID0gdmFsdWUudG9JU09TdHJpbmcoKVxuICAgIH1cblxuICAgIHJldHVybiBzeW5jRGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHNtYWxsIGFwcC1mYWNpbmcgbG9jYWwgc3luYyBxdWV1ZSBmYWNhZGUgZnJvbSBkZWNsYXJhdGl2ZSBtb2RlbCBjb25maWcuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gUXVldWUgY29uZmlnLlxuICAgKiBAcGFyYW0ge1JldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+fSBhcmdzLnN5bmNNb2RlbCAtIExvY2FsIFN5bmMgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLnNpbmdsZUZsaWdodEtleSAtIEtleSB1c2VkIHRvIHNlcmlhbGl6ZSBiYWNrZW5kIHJlcGxheS5cbiAgICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPHZvaWQ+fSBhcmdzLnN5bmNQZW5kaW5nIC0gQmFja2VuZCByZXBsYXkgY2FsbGJhY2suXG4gICAqIEBwYXJhbSB7KHJlc291cmNlOiBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPikgPT4gc3RyaW5nW119IFthcmdzLmxvY2FsT25seUF0dHJpYnV0ZXNdIC0gUmVzb3VyY2Utc3BlY2lmaWMgbG9jYWwtb25seSBhdHRyaWJ1dGVzLlxuICAgKiBAcGFyYW0geyhyZXNvdXJjZTogUmV0dXJuVHlwZTx0eXBlb2YgSlNPTi5wYXJzZT4pID0+IHN0cmluZ1tdfSBbYXJncy5ib29sZWFuQXR0cmlidXRlc10gLSBSZXNvdXJjZS1zcGVjaWZpYyBTUUxpdGUgYm9vbGVhbiBhdHRyaWJ1dGVzLlxuICAgKiBAcmV0dXJucyB7e3F1ZXVlOiAocXVldWVBcmdzOiB7cmVzb3VyY2U6IFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+LCBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHN5bmNUeXBlPzogc3RyaW5nfSkgPT4gUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4sIHN5bmNQZW5kaW5nOiAoKSA9PiBQcm9taXNlPHZvaWQ+fX0gQ29uZmlndXJlZCBsb2NhbCBzeW5jIHF1ZXVlLlxuICAgKi9cbiAgc3RhdGljIGxvY2FsU3luY1F1ZXVlKGFyZ3MpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcXVldWU6IGFzeW5jIChxdWV1ZUFyZ3MpID0+IGF3YWl0IHRoaXMucXVldWVMb2NhbFN5bmMoe1xuICAgICAgICAuLi5xdWV1ZUFyZ3MsXG4gICAgICAgIGJvb2xlYW5BdHRyaWJ1dGVzOiBhcmdzLmJvb2xlYW5BdHRyaWJ1dGVzID8gYXJncy5ib29sZWFuQXR0cmlidXRlcyhxdWV1ZUFyZ3MucmVzb3VyY2UpIDogW10sXG4gICAgICAgIGxvY2FsT25seUF0dHJpYnV0ZXM6IGFyZ3MubG9jYWxPbmx5QXR0cmlidXRlcyA/IGFyZ3MubG9jYWxPbmx5QXR0cmlidXRlcyhxdWV1ZUFyZ3MucmVzb3VyY2UpIDogW10sXG4gICAgICAgIHN5bmNNb2RlbDogYXJncy5zeW5jTW9kZWxcbiAgICAgIH0pLFxuICAgICAgc3luY1BlbmRpbmc6IGFzeW5jICgpID0+IGF3YWl0IHRoaXMuc2luZ2xlRmxpZ2h0KGFyZ3Muc2luZ2xlRmxpZ2h0S2V5LCBhcmdzLnN5bmNQZW5kaW5nKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYm9vbGVhbnMgY29tbW9ubHkgdXNlZCBieSBTUUxpdGUvb2ZmbGluZSBzeW5jIHBheWxvYWRzLlxuICAgKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gU3luYyBkZWNpc2lvbiB2YWx1ZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXNjcmlwdGlvbl0gLSBFcnJvciBjb250ZXh0LlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbiB8IG51bGx9IFBhcnNlZCBib29sZWFuLWxpa2UgYmFja2VuZC9sb2NhbCB2YWx1ZS5cbiAgICovXG4gIHN0YXRpYyBvcHRpb25hbEJvb2xlYW5TeW5jVmFsdWUodmFsdWUsIGRlc2NyaXB0aW9uID0gXCJzeW5jIGJvb2xlYW5cIikge1xuICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gbnVsbFxuICAgIGlmICh2YWx1ZSA9PT0gMSkgcmV0dXJuIHRydWVcbiAgICBpZiAodmFsdWUgPT09IDApIHJldHVybiBmYWxzZVxuXG4gICAgcmV0dXJuIG9wdGlvbmFsQm9vbGVhbih2YWx1ZSwgZGVzY3JpcHRpb24pXG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgYSBib29sZWFuIHN5bmMgdmFsdWUgdG8gU1FMaXRlIGJvb2xlYW4gc3RvcmFnZS5cbiAgICogQHBhcmFtIHtib29sZWFuIHwgbnVsbH0gdmFsdWUgLSBTeW5jIGJvb2xlYW4gdmFsdWUuXG4gICAqIEByZXR1cm5zIHswIHwgMX0gU1FMaXRlLWNvbXBhdGlibGUgYm9vbGVhbiB2YWx1ZS5cbiAgICovXG4gIHN0YXRpYyBzcWxpdGVCb29sZWFuU3luY1ZhbHVlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB0cnVlID8gMSA6IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9qZWN0cyBnZW5lcmljIHN5bmMgY291bnRlcnMgaW50byBhcHAtc3BlY2lmaWMgcmVzdWx0IGtleXMuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gUmVzdWx0IGFyZ3MuXG4gICAqIEBwYXJhbSB7U3luY0NoYW5nZXNSZXN1bHR9IGFyZ3MucmVzdWx0IC0gR2VuZXJpYyBWZWxvY2lvdXMgc3luYyByZXN1bHQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywge2NoYW5nZWRLZXk6IHN0cmluZywgY291bnRLZXk6IHN0cmluZ30+fSBhcmdzLnJlc291cmNlcyAtIFJlc291cmNlIHJlc3VsdCBrZXkgbWFwLlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFByb2plY3RlZCByZXN1bHQuXG4gICAqL1xuICBzdGF0aWMgc3luY1Jlc3VsdEZvclJlc291cmNlcyh7cmVzdWx0LCByZXNvdXJjZXN9KSB7XG4gICAgY29uc3Qgc3luY1Jlc3VsdCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovICh7XG4gICAgICBjaGFuZ2VkOiByZXN1bHQuY2hhbmdlZCxcbiAgICAgIHBhZ2VzOiByZXN1bHQucGFnZXMsXG4gICAgICBzeW5jZWRDb3VudDogcmVzdWx0LnN5bmNlZENvdW50XG4gICAgfSlcblxuICAgIGZvciAoY29uc3QgW3Jlc291cmNlVHlwZSwga2V5c10gb2YgT2JqZWN0LmVudHJpZXMocmVzb3VyY2VzKSkge1xuICAgICAgc3luY1Jlc3VsdFtrZXlzLmNvdW50S2V5XSA9IHJlc3VsdC5yZXNvdXJjZUNvdW50c1tyZXNvdXJjZVR5cGVdIHx8IDBcbiAgICAgIHN5bmNSZXN1bHRba2V5cy5jaGFuZ2VkS2V5XSA9IHJlc3VsdC5yZXNvdXJjZUNoYW5nZWRbcmVzb3VyY2VUeXBlXSB8fCBmYWxzZVxuICAgIH1cblxuICAgIHJldHVybiBzeW5jUmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogRHJhaW5zIHBlbmRpbmcgc3luYyByZWNvcmRzIGluIHN0YWJsZSBvcmRlciBhbmQgbWFya3MgYWNrbm93bGVkZ2VkIHJvd3MuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gUmVwbGF5IGFyZ3MuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhcmdzLmF1dGhlbnRpY2F0aW9uVG9rZW4gLSBBdXRoIHRva2VuIHRvIHNlbmQgd2l0aCByZXBsYXkgcmVxdWVzdHMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5iYXRjaFNpemVdIC0gTWF4IHN5bmNzIHBlciByZXF1ZXN0LiBEZWZhdWx0cyB0byAxMDAuXG4gICAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxBcnJheTx1bmtub3duPj59IGFyZ3MucGVuZGluZ1N5bmNzIC0gTG9hZHMgcGVuZGluZyBsb2NhbCBzeW5jIHJvd3MgaW4gcmVwbGF5IG9yZGVyLlxuICAgKiBAcGFyYW0geyhzeW5jOiB1bmtub3duKSA9PiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkfSBhcmdzLnN5bmNJZCAtIFJldHVybnMgdGhlIGxvY2FsIHN5bmMgaWQuXG4gICAqIEBwYXJhbSB7KHN5bmM6IHVua25vd24pID0+IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncy5zeW5jUGF5bG9hZCAtIEJ1aWxkcyB0aGUgQVBJIHN5bmMgZW52ZWxvcGUuXG4gICAqIEBwYXJhbSB7KHBheWxvYWQ6IHthdXRoZW50aWNhdGlvblRva2VuOiBzdHJpbmcsIHN5bmNzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBKU09OLnBhcnNlPj4+fSwgb3B0aW9ucz86IHtzaWduYWw/OiBBYm9ydFNpZ25hbH0pID0+IFByb21pc2U8U3luY1JlcGxheVJlc3BvbnNlPn0gYXJncy5wb3N0UmVwbGF5IC0gUG9zdHMgb25lIHJlcGxheSByZXF1ZXN0LlxuICAgKiBAcGFyYW0geyhzeW5jOiB1bmtub3duLCByZXNwb25zZTogU3luY1JlcGxheUl0ZW0pID0+IFByb21pc2U8dm9pZD59IGFyZ3MubWFya1N1Y2Nlc3NmdWwgLSBNYXJrcyBvbmUgc3luYyBhcyBzdWNjZXNzZnVsIGxvY2FsbHkuXG4gICAqIEBwYXJhbSB7QWJvcnRTaWduYWx9IFthcmdzLnNpZ25hbF0gLSBMaWZlY3ljbGUgY2FuY2VsbGF0aW9uIHNpZ25hbC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIGFmdGVyIGFsbCBiYXRjaGVzIGFyZSByZXBsYXllZC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyByZXBsYXlQZW5kaW5nKGFyZ3MpIHtcbiAgICB0aHJvd0lmU3luY0Fib3J0ZWQoYXJncy5zaWduYWwpXG4gICAgY29uc3QgcGVuZGluZ1N5bmNzID0gYXdhaXQgYXJncy5wZW5kaW5nU3luY3MoKVxuICAgIHRocm93SWZTeW5jQWJvcnRlZChhcmdzLnNpZ25hbClcbiAgICBjb25zdCBiYXRjaFNpemUgPSB0aGlzLm5vcm1hbGl6ZWRCYXRjaFNpemUoYXJncy5iYXRjaFNpemUpXG5cbiAgICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBwZW5kaW5nU3luY3MubGVuZ3RoOyBvZmZzZXQgKz0gYmF0Y2hTaXplKSB7XG4gICAgICB0aHJvd0lmU3luY0Fib3J0ZWQoYXJncy5zaWduYWwpXG4gICAgICBhd2FpdCB0aGlzLnJlcGxheUJhdGNoKHsuLi5hcmdzLCBwZW5kaW5nU3luY3M6IHBlbmRpbmdTeW5jcy5zbGljZShvZmZzZXQsIG9mZnNldCArIGJhdGNoU2l6ZSl9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYXlzIG9uZSBiYXRjaCBvZiBzeW5jcy5cbiAgICogQHBhcmFtIHtvYmplY3R9IGFyZ3MgLSBSZXBsYXkgYXJncy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGFyZ3MuYXV0aGVudGljYXRpb25Ub2tlbiAtIEF1dGggdG9rZW4uXG4gICAqIEBwYXJhbSB7QXJyYXk8dW5rbm93bj59IGFyZ3MucGVuZGluZ1N5bmNzIC0gQmF0Y2ggc3luY3MuXG4gICAqIEBwYXJhbSB7KHN5bmM6IHVua25vd24pID0+IHN0cmluZyB8IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWR9IGFyZ3Muc3luY0lkIC0gU3luYyBpZCBnZXR0ZXIuXG4gICAqIEBwYXJhbSB7KHN5bmM6IHVua25vd24pID0+IFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pn0gYXJncy5zeW5jUGF5bG9hZCAtIFBheWxvYWQgYnVpbGRlci5cbiAgICogQHBhcmFtIHsocGF5bG9hZDoge2F1dGhlbnRpY2F0aW9uVG9rZW46IHN0cmluZywgc3luY3M6IEFycmF5PFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIEpTT04ucGFyc2U+Pj59LCBvcHRpb25zPzoge3NpZ25hbD86IEFib3J0U2lnbmFsfSkgPT4gUHJvbWlzZTxTeW5jUmVwbGF5UmVzcG9uc2U+fSBhcmdzLnBvc3RSZXBsYXkgLSBSZXBsYXkgcG9zdGVyLlxuICAgKiBAcGFyYW0geyhzeW5jOiB1bmtub3duLCByZXNwb25zZTogU3luY1JlcGxheUl0ZW0pID0+IFByb21pc2U8dm9pZD59IGFyZ3MubWFya1N1Y2Nlc3NmdWwgLSBTdWNjZXNzIGhvb2suXG4gICAqIEBwYXJhbSB7QWJvcnRTaWduYWx9IFthcmdzLnNpZ25hbF0gLSBMaWZlY3ljbGUgY2FuY2VsbGF0aW9uIHNpZ25hbC5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIGFmdGVyIHRoZSBiYXRjaCBpcyBhY2tub3dsZWRnZWQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgcmVwbGF5QmF0Y2goYXJncykge1xuICAgIGNvbnN0IHthdXRoZW50aWNhdGlvblRva2VuLCBtYXJrU3VjY2Vzc2Z1bCwgcGVuZGluZ1N5bmNzLCBwb3N0UmVwbGF5LCBzaWduYWwsIHN5bmNJZCwgc3luY1BheWxvYWR9ID0gYXJnc1xuXG4gICAgaWYgKHBlbmRpbmdTeW5jcy5sZW5ndGggPT09IDApIHJldHVyblxuICAgIHRocm93SWZTeW5jQWJvcnRlZChzaWduYWwpXG5cbiAgICBjb25zdCBzeW5jc0J5SWQgPSBuZXcgTWFwKClcblxuICAgIGZvciAoY29uc3Qgc3luYyBvZiBwZW5kaW5nU3luY3MpIHtcbiAgICAgIGNvbnN0IGlkID0gc3luY0lkKHN5bmMpXG5cbiAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkICYmIGlkICE9PSBudWxsKSBzeW5jc0J5SWQuc2V0KFN0cmluZyhpZCksIHN5bmMpXG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBwb3N0UmVwbGF5KHtcbiAgICAgIGF1dGhlbnRpY2F0aW9uVG9rZW4sXG4gICAgICBzeW5jczogcGVuZGluZ1N5bmNzLm1hcCgoc3luYykgPT4gc3luY1BheWxvYWQoc3luYykpXG4gICAgfSwge3NpZ25hbH0pXG5cbiAgICB0aHJvd0lmU3luY0Fib3J0ZWQoc2lnbmFsKVxuICAgIHRoaXMuZW5zdXJlU3VjY2Vzc2Z1bFJlc3BvbnNlKHJlc3BvbnNlKVxuXG4gICAgZm9yIChjb25zdCBzeW5jUmVzcG9uc2Ugb2YgcmVzcG9uc2Uuc3luY3MgfHwgW10pIHtcbiAgICAgIHRocm93SWZTeW5jQWJvcnRlZChzaWduYWwpXG4gICAgICBjb25zdCBzeW5jID0gc3luY3NCeUlkLmdldChTdHJpbmcoc3luY1Jlc3BvbnNlLmlkKSlcblxuICAgICAgaWYgKCFzeW5jKSBjb250aW51ZVxuICAgICAgaWYgKHN5bmNSZXNwb25zZS5zeW5jU3RhdGUgIT09IFwic3VjY2Vzc2Z1bFwiKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBzeW5jIHN0YXRlIHJldHVybmVkIGZvciBzeW5jICR7U3RyaW5nKHN5bmNSZXNwb25zZS5pZCl9OiAke1N0cmluZyhzeW5jUmVzcG9uc2Uuc3luY1N0YXRlKX1gKVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBtYXJrU3VjY2Vzc2Z1bChzeW5jLCBzeW5jUmVzcG9uc2UpXG4gICAgICB0aHJvd0lmU3luY0Fib3J0ZWQoc2lnbmFsKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgQVBJIHJlc3BvbnNlIHN0YXR1cyBhbmQgc2hhcGUuXG4gICAqIEBwYXJhbSB7U3luY1JlcGxheVJlc3BvbnNlfSByZXNwb25zZSAtIFJlcGxheSByZXNwb25zZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgZW5zdXJlU3VjY2Vzc2Z1bFJlc3BvbnNlKHJlc3BvbnNlKSB7XG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gXCJlcnJvclwiKSB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2UuZXJyb3JNZXNzYWdlIHx8IFwiU3luYyBmYWlsZWRcIilcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVzcG9uc2Uuc3luY3MpKSB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jIHJlc3BvbnNlIG1pc3Npbmcgc3luY3NcIilcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVzIGEgcG9zaXRpdmUgYmF0Y2ggc2l6ZS5cbiAgICogQHBhcmFtIHtudW1iZXIgfCB1bmRlZmluZWR9IGJhdGNoU2l6ZSAtIEJhdGNoIHNpemUuXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFBvc2l0aXZlIGJhdGNoIHNpemUuXG4gICAqL1xuICBzdGF0aWMgbm9ybWFsaXplZEJhdGNoU2l6ZShiYXRjaFNpemUpIHtcbiAgICBpZiAodHlwZW9mIGJhdGNoU2l6ZSAhPT0gXCJudW1iZXJcIiB8fCAhTnVtYmVyLmlzRmluaXRlKGJhdGNoU2l6ZSkgfHwgYmF0Y2hTaXplIDwgMSkgcmV0dXJuIDEwMFxuXG4gICAgcmV0dXJuIE1hdGguZmxvb3IoYmF0Y2hTaXplKVxuICB9XG59XG5cbi8qKlxuICogVGhyb3dzIHRoZSBleGFjdCBhYm9ydCByZWFzb24gYXQgbGlmZWN5Y2xlIGJvdW5kYXJpZXMgc28gY2FsbGVycyBjYW5cbiAqIGRpc3Rpbmd1aXNoIGFuIGV4cGVjdGVkIGNvb3BlcmF0aXZlIHN0b3AgZnJvbSB0cmFuc3BvcnQgb3IgYXBwbHkgZmFpbHVyZXMuXG4gKiBAcGFyYW0ge0Fib3J0U2lnbmFsIHwgdW5kZWZpbmVkfSBzaWduYWwgLSBMaWZlY3ljbGUgc2lnbmFsLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHRocm93SWZTeW5jQWJvcnRlZChzaWduYWwpIHtcbiAgaWYgKCFzaWduYWw/LmFib3J0ZWQpIHJldHVyblxuXG4gIHRocm93IHNpZ25hbC5yZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHNpZ25hbC5yZWFzb24gOiBuZXcgRXJyb3IoXCJTeW5jIG9wZXJhdGlvbiBhYm9ydGVkXCIpXG59XG4iXX0=