footprintjs 9.44.0 → 9.44.2

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 (38) hide show
  1. package/CLAUDE.md +6 -5
  2. package/dist/esm/lib/capture/freeze.d.ts +51 -7
  3. package/dist/esm/lib/capture/freeze.js +289 -24
  4. package/dist/esm/lib/capture/valueKinds.d.ts +57 -0
  5. package/dist/esm/lib/capture/valueKinds.js +142 -0
  6. package/dist/esm/lib/memory/EventLog.d.ts +24 -6
  7. package/dist/esm/lib/memory/EventLog.js +30 -10
  8. package/dist/esm/lib/memory/admission.js +4 -3
  9. package/dist/esm/lib/memory/borrowedMutation.js +2 -2
  10. package/dist/esm/lib/memory/equality.d.ts +55 -19
  11. package/dist/esm/lib/memory/equality.js +154 -51
  12. package/dist/esm/lib/memory/logModel.js +11 -4
  13. package/dist/esm/lib/memory/redaction.d.ts +21 -0
  14. package/dist/esm/lib/memory/redaction.js +64 -7
  15. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +4 -1
  16. package/dist/esm/lib/runner/ExecutionRuntime.js +15 -10
  17. package/dist/esm/lib/runner/snapshot.js +17 -3
  18. package/dist/esm/lib/slice/elementProvenance.js +2 -2
  19. package/dist/esm/lib/time-travel/chain.js +28 -26
  20. package/dist/lib/capture/freeze.js +292 -25
  21. package/dist/lib/capture/valueKinds.js +146 -0
  22. package/dist/lib/memory/EventLog.js +29 -9
  23. package/dist/lib/memory/admission.js +4 -3
  24. package/dist/lib/memory/borrowedMutation.js +2 -2
  25. package/dist/lib/memory/equality.js +154 -51
  26. package/dist/lib/memory/logModel.js +11 -4
  27. package/dist/lib/memory/redaction.js +66 -8
  28. package/dist/lib/runner/ExecutionRuntime.js +14 -9
  29. package/dist/lib/runner/snapshot.js +16 -2
  30. package/dist/lib/slice/elementProvenance.js +2 -2
  31. package/dist/lib/time-travel/chain.js +27 -25
  32. package/dist/types/lib/capture/freeze.d.ts +51 -7
  33. package/dist/types/lib/capture/valueKinds.d.ts +57 -0
  34. package/dist/types/lib/memory/EventLog.d.ts +24 -6
  35. package/dist/types/lib/memory/equality.d.ts +55 -19
  36. package/dist/types/lib/memory/redaction.d.ts +21 -0
  37. package/dist/types/lib/runner/ExecutionRuntime.d.ts +4 -1
  38. package/package.json +2 -1
@@ -226,7 +226,7 @@ export class LogModel {
226
226
  commit = touch.commitIdx;
227
227
  start = before;
228
228
  }
229
- verdict.set(commit, !deepEqual(start, after));
229
+ verdict.set(commit, !deepEqual(start, after, 'copies'));
230
230
  },
231
231
  });
232
232
  changes = [...verdict].filter(([, changed]) => changed).map(([c]) => c);
@@ -255,7 +255,7 @@ export class LogModel {
255
255
  queryWork.units += candidates.length;
256
256
  return candidates.filter((c) => {
257
257
  const g = h.kept.get(c);
258
- return g !== undefined && !deepEqual(nativeGet(g.before, rest), nativeGet(g.after, rest));
258
+ return g !== undefined && !deepEqual(nativeGet(g.before, rest), nativeGet(g.after, rest), 'copies');
259
259
  });
260
260
  }
261
261
  // ── the writer rule ──────────────────────────────────────────────────────
@@ -339,12 +339,19 @@ export class LogModel {
339
339
  const kept = lastBefore(h.keptAt, idx + 1);
340
340
  if (kept !== -1) {
341
341
  const after = rows.filter((row) => row.commitIdx > kept);
342
- return foldKey(after, segs, { anchored: true, start: h.kept.get(kept)?.after });
342
+ // Folded FROM the kept generation, the answer can BE it (no row after it) or share its parts, and
343
+ // the memo answers every later question: detach it, as the value rule promises (until 9.44.2 an
344
+ // edit of one answer changed the next).
345
+ return detached(foldKey(after, segs, { anchored: true, start: h.kept.get(kept)?.after }));
343
346
  }
344
347
  }
345
348
  return foldKey(rows, segs, { anchored: true });
346
349
  }
347
350
  }
351
+ /** A value the caller owns: a container is cloned, a primitive is itself. */
352
+ function detached(value) {
353
+ return value !== null && typeof value === 'object' ? structuredClone(value) : value;
354
+ }
348
355
  /** Is the last `set` / `delete` row ON `key` in this commit a `set`? */
349
356
  function lastTotalIsSet(bundle, key) {
350
357
  for (let i = bundle.trace.length - 1; i >= 0; i--) {
@@ -354,4 +361,4 @@ function lastTotalIsSet(bundle, key) {
354
361
  }
355
362
  return false;
356
363
  }
357
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nTW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9sb2dNb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFHSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFHTCxhQUFhLEVBQ2IsY0FBYyxFQUNkLE9BQU8sRUFDUCxnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLE1BQU0sRUFDTixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRW5DLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBbUIzRSxNQUFNLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBcUMsQ0FBQztBQUVoRSxxR0FBcUc7QUFDckcsU0FBUyxXQUFXLENBQUMsR0FBNEI7SUFDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDeEMsZ0dBQWdHO0lBQ2hHLG9GQUFvRjtJQUNwRixLQUFLLE1BQU0sTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDN0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FB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QUFDO1FBQ2xELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQztJQUMzRixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBsb2dNb2RlbC50cyDigJQgdGhlIHJlYWQgbW9kZWwgb2YgT05FIGNvbW1pdCBsb2c6IHRoZSB3cml0ZXIgcnVsZSBhbmQgdGhlIHZhbHVlIHJ1bGUgb2YgYGtleVBhdGhzLnRzYCxcbiAqIGFuc3dlcmVkIGF0IGEgY29zdCBwcm9wb3J0aW9uYWwgdG8gdGhlIGFuc3dlciwgbm90IHRvIHRoZSBsb2cgKEYzLCA5LjMzLjApLlxuICpcbiAqIFdIWSBUSElTIEZJTEUgRVhJU1RTLiBUaGUgcnVsZXMgYXJlIHNpbXBsZSB0byBzdGF0ZSBhbmQgZXhwZW5zaXZlIHRvIGFwcGx5IG5haXZlbHk6IGEga2V5J3Mgd3JpdGVyc1xuICogaW5jbHVkZSB0aGUgY29tbWl0cyBBUk9VTkQgaXQgd2hvc2UgY2hhbmdlIHJlYWNoZWQgaXQsIGFuZCBkZWNpZGluZyB0aGF0IG5lZWRzIHRoZSB2YWx1ZSBhdCB0aGUga2V5XG4gKiBiZWZvcmUgYW5kIGFmdGVyIHN1Y2ggYSBjb21taXQg4oCUIGEgZm9sZCBvZiBpdHMgdG9wLWxldmVsIGtleS4gRm9sZGluZyBvbmNlIHBlciBLRVkgbWFkZSBhIGNhdXNhbCB3YWxrXG4gKiBvdmVyIG5lc3RlZCBrZXlzIGN1YmljIGluIHRoZSBsb2cgKGV2ZXJ5IGtleSByZS1zY2FubmVkIHRoZSBsb2cgYW5kIHJlLWZvbGRlZCBpdHMgcm9vdCkuIEhlcmU6XG4gKlxuICogICAtIHRoZSBsb2cgaXMgaW5kZXhlZCBPTkNFIChga2V5UGF0aHMgwrcgYnVpbGRXcml0ZXJJbmRleGAsIGEgcGF0aCB0cmllKTogYSBrZXkncyBjYW5kaWRhdGVzIGNvc3RcbiAqICAgICBPKGRlcHRoICsgbWF0Y2hlcykg4oCUIGl0cyBub2RlLCBpdHMgYW5jZXN0b3JzLCBpdHMgc3VidHJlZSDigJQgYW5kIHRoZSByb3dzIHVuZGVyIGEgdG9wLWxldmVsIGtleSBhcmVcbiAqICAgICByZWFjaGVkIHRocm91Z2ggdGhlIGluZGV4LCBuZXZlciBhIHNjYW47XG4gKiAgIC0gZWFjaCB0b3AtbGV2ZWwga2V5IGlzIGZvbGRlZCBPTkNFIChgdmVyYnMgwrcgZm9sZEtleWAsIGNvcHktb24td3JpdGUpLCBrZWVwaW5nIGl0cyB2YWx1ZSBiZWZvcmUgYW5kXG4gKiAgICAgYWZ0ZXIgZXZlcnkgY29tbWl0IGEgdmVyZGljdCBjYW4gYXNrIGFib3V0OiBhIGNvbW1pdCB3aXRoIGEgcm93IG9uIGEgcGF0aCB0aGF0IGhhcyB3cml0dGVuIHBhdGhzXG4gKiAgICAgYmVsb3cgaXQgKGl0IGNhbiBiZSBBUk9VTkQgYSB3cml0dGVuIGtleSksIGFuZCBhIGNvbW1pdCB0aGF0IHdyaXRlcyBUSFJPVUdIIGEgc3RyaW5nLXZhbHVlZFxuICogICAgIGNvbnRhaW5lciAoYG5hdGl2ZVNldGAgcmVwbGFjZXMgdGhlIHN0cmluZywgYW5kIHRoZSBjaGFyYWN0ZXJzIGEga2V5IHJlYWQgZnJvbSBpdCB2YW5pc2gg4oCUIHRoZSBvbmVcbiAqICAgICB3YXkgYSByb3cgQkVTSURFIGEga2V5IG1vdmVzIGl0KS4gQSBrZXkncyB2ZXJkaWN0IGlzIHRoZW4gdHdvIGBuYXRpdmVHZXRgcyBhbmQgYSBgZGVlcEVxdWFsYDtcbiAqICAgLSB0aGUgbGFzdCB3cml0ZXIgYmVmb3JlIGEgcG9pbnQgaXMgZm91bmQgTEFaSUxZOiB0aGUgbGFzdCB3cml0ZSBvbiBvciBpbnNpZGUgdGhlIGtleSwgdGhlbiBvbmx5IHRoZVxuICogICAgIGFyb3VuZC1jYW5kaWRhdGVzIGFmdGVyIGl0IOKAlCBtb3N0IHF1ZXN0aW9ucyBuZWVkIG5vIHZlcmRpY3QgYXQgYWxsLlxuICpcbiAqIE9uZSBzaGFwZSBrZWVwcyBhIHBlci1rZXkgZm9sZCAobWVtb2lzZWQgcGVyIGtleSk6IGEga2V5IHRoYXQgd2FzIG5ldmVyIHdyaXR0ZW4sIHVuZGVyIGEgY29udGFpbmVyIHRoYXRcbiAqIHdhcyBvbmx5IGV2ZXIgd3JpdHRlbiBXSE9MRSAoaXRzIG5vZGUgaGFzIG5vIHdyaXR0ZW4gY2hpbGRyZW4sIHNvIG5vIGdlbmVyYXRpb24gaXMga2VwdCB0aGVyZSkuXG4gKlxuICogQSBtb2RlbCBvZiBhIEZST1pFTiBsb2cgKGV2ZXJ5IGVuZ2luZSBsb2cgc2luY2UgRjM6IGBFdmVudExvZyDCtyByZWNvcmRgIGZyZWV6ZXMgZWFjaCBidW5kbGUgYW5kXG4gKiBgZ2V0U25hcHNob3RgIGZyZWV6ZXMgdGhlIGFycmF5KSBpcyBtZW1vaXNlZCBvbiB0aGUgbG9nIOKAlCB0aGUgcmVjb3JkIGNhbm5vdCBjaGFuZ2UgdW5kZXIgaXQuIEEgbG9nIHRoYXRcbiAqIGlzIG5vdCBmcm96ZW4gKGhhbmQtYnVpbHQsIHBhcnNlZCBmcm9tIEpTT04pIGdldHMgYSBmcmVzaCBtb2RlbCBwZXIgcXVlc3Rpb24uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb21taXRJZHggfSBmcm9tICcuLi9pZHMvcnVudGltZVN0YWdlSWQuanMnO1xuaW1wb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnLi9lcXVhbGl0eS5qcyc7XG5pbXBvcnQge1xuICB0eXBlIFBhdGhOb2RlLFxuICB0eXBlIFdyaXRlckluZGV4LFxuICBhbmNlc3Rvck5vZGVzLFxuICBhc2NlbmRpbmdVbmlvbixcbiAgYmV0d2VlbixcbiAgYnVpbGRXcml0ZXJJbmRleCxcbiAgbGFzdEJlZm9yZSxcbiAgbm9kZUF0LFxuICBxdWVyeVdvcmssXG4gIHJlbGF0aW9uLFxuICByb290T2YsXG4gIHN1YnRyZWVQb3NpdGlvbnMsXG59IGZyb20gJy4va2V5UGF0aHMuanMnO1xuaW1wb3J0IHsgbmF0aXZlR2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IERFTElNIH0gZnJvbSAnLi9wYXRocy5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgdHlwZSBUb3VjaCwgZm9sZEtleSwgaXNWZXJiLCBVbmtub3duVmVyYkVycm9yIH0gZnJvbSAnLi92ZXJicy5qcyc7XG5cbi8qKiBUaGUgcm93cyB1bmRlciBvbmUgdG9wLWxldmVsIGtleSwgaW4gY29tbWl0IG9yZGVyIOKAlCB1cCB0byB0aGUgZmlyc3Qgcm93IHRoZSB2ZXJiIGxhdyByZWZ1c2VzLiAqL1xuaW50ZXJmYWNlIFJvb3RSb3dzIHtcbiAgcmVhZG9ubHkgcm93czogVG91Y2hbXTtcbiAgLyoqIFRoZSBmaXJzdCByb3cgdW5kZXIgdGhlIGtleSB3aG9zZSB2ZXJiIGlzIG5vbmUgb2YgdGhlIGZvdXIg4oCUIGV2ZXJ5IGFuc3dlciB0aGF0IHJlYWNoZXMgaXQgaXMgcmVmdXNlZC4gKi9cbiAgcmVhZG9ubHkgcmVmdXNlZD86IFVua25vd25WZXJiRXJyb3I7XG4gIHJlYWRvbmx5IHJlZnVzZWRBdDogbnVtYmVyO1xufVxuXG4vKiogT25lIHRvcC1sZXZlbCBrZXkgZm9sZGVkIG9uY2U6IGl0cyB2YWx1ZSBiZWZvcmUgYW5kIGFmdGVyIGV2ZXJ5IGNvbW1pdCBhIHZlcmRpY3QgY2FuIGFzayBhYm91dC4gKi9cbmludGVyZmFjZSBSb290SGlzdG9yeSB7XG4gIHJlYWRvbmx5IGtlcHQ6IE1hcDxudW1iZXIsIHsgcmVhZG9ubHkgYmVmb3JlOiB1bmtub3duOyByZWFkb25seSBhZnRlcjogdW5rbm93biB9PjtcbiAgLyoqIFRoZSBrZXB0IGNvbW1pdHMsIGFzY2VuZGluZy4gKi9cbiAgcmVhZG9ubHkga2VwdEF0OiByZWFkb25seSBudW1iZXJbXTtcbiAgLyoqIENvbW1pdHMgdGhhdCB3cm90ZSBUSFJPVUdIIGEgc3RyaW5nLXZhbHVlZCBjb250YWluZXIsIGJ5IHRoZSBub2RlIG9mIHRoYXQgY29udGFpbmVyLiAqL1xuICByZWFkb25seSByZXBsYWNlZDogTWFwPFBhdGhOb2RlLCBudW1iZXJbXT47XG59XG5cbmNvbnN0IE1PREVMUyA9IG5ldyBXZWFrTWFwPHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdLCBMb2dNb2RlbD4oKTtcblxuLyoqIElzIHRoZSBsb2cgaW1tdXRhYmxlIOKAlCB0aGUgYXJyYXkgYW5kIGV2ZXJ5IGJ1bmRsZSBhbmQgdHJhY2UgZnJvemVuIChhbiBlbmdpbmUgc25hcHNob3QncyBsb2cpPyAqL1xuZnVuY3Rpb24gaXNGcm96ZW5Mb2cobG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSk6IGJvb2xlYW4ge1xuICBpZiAoIU9iamVjdC5pc0Zyb3plbihsb2cpKSByZXR1cm4gZmFsc2U7XG4gIC8vIFRoZSBzaGFwZSBgRXZlbnRMb2cgwrcgcmVjb3JkYCBsZWF2ZXM6IHRoZSBidW5kbGUsIGl0cyBwYXlsb2FkcyBhbmQgaXRzIHJvd3MuIEEgaGFuZC1idWlsdCBsb2dcbiAgLy8gZnJvemVuIGxlc3MgZGVlcGx5IHRoYW4gdGhhdCBjb3VsZCBjaGFuZ2UgYWZ0ZXIgYSBxdWVyeSwgc28gaXQgaXMgbmV2ZXIgbWVtb2lzZWQuXG4gIGZvciAoY29uc3QgYnVuZGxlIG9mIGxvZykge1xuICAgIGlmICghT2JqZWN0LmlzRnJvemVuKGJ1bmRsZSkgfHwgIU9iamVjdC5pc0Zyb3plbihidW5kbGUudHJhY2UpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFPYmplY3QuaXNGcm96ZW4oYnVuZGxlLm92ZXJ3cml0ZSkgfHwgIU9iamVjdC5pc0Zyb3plbihidW5kbGUudXBkYXRlcykpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIWJ1bmRsZS50cmFjZS5ldmVyeSgocm93KSA9PiBPYmplY3QuaXNGcm96ZW4ocm93KSkpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIFRoZSByZWFkIG1vZGVsIG9mIGBsb2dgIOKAlCBtZW1vaXNlZCB3aGVuIHRoZSBsb2cgaXMgZnJvemVuLCBmcmVzaCBvdGhlcndpc2UuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nTW9kZWwobG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSk6IExvZ01vZGVsIHtcbiAgY29uc3QgbWVtbyA9IE1PREVMUy5nZXQobG9nKTtcbiAgaWYgKG1lbW8gIT09IHVuZGVmaW5lZCkgcmV0dXJuIG1lbW87XG4gIGNvbnN0IG1vZGVsID0gbmV3IExvZ01vZGVsKGxvZyk7XG4gIGlmIChpc0Zyb3plbkxvZyhsb2cpKSBNT0RFTFMuc2V0KGxvZywgbW9kZWwpO1xuICByZXR1cm4gbW9kZWw7XG59XG5cbi8qKiBUaGUgbWVtb2lzZWQgbW9kZWwgb2YgYSBmcm96ZW4gbG9nIChidWlsdCBvbiBmaXJzdCBhc2spLCBvciB1bmRlZmluZWQgZm9yIGEgbG9nIHRoYXQgaXMgbm90IGZyb3plbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1vaXNlZE1vZGVsKGxvZzogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW10pOiBMb2dNb2RlbCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBNT0RFTFMuZ2V0KGxvZykgPz8gKGlzRnJvemVuTG9nKGxvZykgPyBsb2dNb2RlbChsb2cpIDogdW5kZWZpbmVkKTtcbn1cblxuLyoqIERvZXMgdGhlIGNvbW1pdCBob2xkIGEgbm9uLWBkZWxldGVgIHJvdyBvbiBga2V5YCBvciBpbnNpZGUgaXQ/IChBIGBkZWxldGVgIGNhbm5vdCByZXBsYWNlIGEgc3RyaW5nIGNvbnRhaW5lci4pICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVzQXRPckluc2lkZShidW5kbGU6IENvbW1pdEJ1bmRsZSwga2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCB0IG9mIGJ1bmRsZS50cmFjZSkge1xuICAgIGlmICh0LnZlcmIgPT09ICdkZWxldGUnKSBjb250aW51ZTtcbiAgICBjb25zdCByID0gcmVsYXRpb24odC5wYXRoLCBrZXkpO1xuICAgIGlmIChyID09PSAnZXhhY3QnIHx8IHIgPT09ICdpbnNpZGUnKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2FuIHRoaXMgY29tbWl0IGxlYXZlIGEgU1RSSU5HLXZhbHVlZCBjb250YWluZXIgYWJvdmUgYGtleWAg4oCUIGEgcm93IGFyb3VuZCB0aGUga2V5IHdob3NlIHJlY29yZGVkIHZhbHVlXG4gKiBob2xkcyBhIHN0cmluZyBhdCB0aGUgcm93J3MgcGF0aCBvciBhbnl3aGVyZSBiZXR3ZWVuIGl0IGFuZCB0aGUga2V5PyBPbmx5IHRoZW4gY2FuIGEgbGF0ZXIgd3JpdGUgYmVzaWRlIHRoZVxuICoga2V5IG1vdmUgaXQgKGBuYXRpdmVTZXRgIHJlcGxhY2VzIHRoZSBzdHJpbmcpLiBBIGNvbnNlcnZhdGl2ZSwgcGF5bG9hZC1vbmx5IGNoZWNrOiBubyBmb2xkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGVhdmVzU3RyaW5nQWJvdmUoYnVuZGxlOiBDb21taXRCdW5kbGUsIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGtleVNlZ3MgPSBrZXkuc3BsaXQoREVMSU0pO1xuICBmb3IgKGNvbnN0IHQgb2YgYnVuZGxlLnRyYWNlKSB7XG4gICAgaWYgKHQudmVyYiA9PT0gJ2RlbGV0ZScgfHwgcmVsYXRpb24odC5wYXRoLCBrZXkpICE9PSAnYXJvdW5kJykgY29udGludWU7XG4gICAgY29uc3Qgc2VncyA9IHQucGF0aC5zcGxpdChERUxJTSk7XG4gICAgbGV0IHZhbHVlOiB1bmtub3duID0gbmF0aXZlR2V0KHQudmVyYiA9PT0gJ21lcmdlJyA/IGJ1bmRsZS51cGRhdGVzIDogYnVuZGxlLm92ZXJ3cml0ZSwgc2Vncyk7XG4gICAgZm9yIChsZXQgZGVwdGggPSBzZWdzLmxlbmd0aDsgZGVwdGggPCBrZXlTZWdzLmxlbmd0aDsgZGVwdGgrKykge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIGJyZWFrO1xuICAgICAgdmFsdWUgPSBuYXRpdmVHZXQodmFsdWUsIFtrZXlTZWdzW2RlcHRoXV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBjbGFzcyBMb2dNb2RlbCB7XG4gIHJlYWRvbmx5IGluZGV4OiBXcml0ZXJJbmRleDtcbiAgcHJpdmF0ZSByZWFkb25seSByb290cyA9IG5ldyBNYXA8c3RyaW5nLCBSb290Um93cz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBoaXN0b3JpZXMgPSBuZXcgTWFwPHN0cmluZywgUm9vdEhpc3Rvcnk+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhbmdlc0J5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcltdPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHdyaXRlcnNCeUtleSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKTtcblxuICBjb25zdHJ1Y3RvcihyZWFkb25seSBsb2c6IHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdKSB7XG4gICAgdGhpcy5pbmRleCA9IGJ1aWxkV3JpdGVySW5kZXgobG9nKTtcbiAgICBmb3IgKGNvbnN0IGJ1bmRsZSBvZiBsb2cpIHF1ZXJ5V29yay51bml0cyArPSBidW5kbGUudHJhY2UubGVuZ3RoO1xuICB9XG5cbiAgLy8g4pSA4pSAIHJvd3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSByb290Um93cyhyb290OiBzdHJpbmcpOiBSb290Um93cyB7XG4gICAgbGV0IGVudHJ5ID0gdGhpcy5yb290cy5nZXQocm9vdCk7XG4gICAgaWYgKGVudHJ5ICE9PSB1bmRlZmluZWQpIHJldHVybiBlbnRyeTtcbiAgICBjb25zdCBub2RlID0gdGhpcy5pbmRleC5yb290cy5nZXQocm9vdCk7XG4gICAgY29uc3Qgcm93czogVG91Y2hbXSA9IFtdO1xuICAgIGxldCByZWZ1c2VkOiBVbmtub3duVmVyYkVycm9yIHwgdW5kZWZpbmVkO1xuICAgIGxldCByZWZ1c2VkQXQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgaWYgKG5vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChjb25zdCBjIG9mIHN1YnRyZWVQb3NpdGlvbnMobm9kZSkpIHtcbiAgICAgICAgY29uc3QgdHJhY2UgPSB0aGlzLmxvZ1tjXS50cmFjZTtcbiAgICAgICAgcXVlcnlXb3JrLnVuaXRzICs9IHRyYWNlLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgdHJhY2UubGVuZ3RoICYmIHJlZnVzZWQgPT09IHVuZGVmaW5lZDsgcm93KyspIHtcbiAgICAgICAgICBjb25zdCB7IHBhdGgsIHZlcmIgfSA9IHRyYWNlW3Jvd107XG4gICAgICAgICAgaWYgKHBhdGggIT09IHJvb3QgJiYgcmVsYXRpb24ocGF0aCwgcm9vdCkgIT09ICdpbnNpZGUnKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAoIWlzVmVyYih2ZXJiKSkge1xuICAgICAgICAgICAgcmVmdXNlZCA9IG5ldyBVbmtub3duVmVyYkVycm9yKHZlcmIsIHsgcGF0aCwgcm93LCBjb21taXQ6IGMgfSk7XG4gICAgICAgICAgICByZWZ1c2VkQXQgPSBjO1xuICAgICAgICAgICAgLy8gdGhlIHJlZnVzZWQgY29tbWl0IGFuZCBldmVyeXRoaW5nIGFmdGVyIGl0IGFyZSBsZWZ0IG91dDogYW4gYW5zd2VyIHRoYXQgcmVhY2hlcyB0aGVtIGlzIHJlZnVzZWRcbiAgICAgICAgICAgIHdoaWxlIChyb3dzLmxlbmd0aCA+IDAgJiYgcm93c1tyb3dzLmxlbmd0aCAtIDFdLmNvbW1pdElkeCA9PT0gYykgcm93cy5wb3AoKTtcbiAgICAgICAgICB9IGVsc2Ugcm93cy5wdXNoKHsgdmVyYiwgYnVuZGxlOiB0aGlzLmxvZ1tjXSwgY29tbWl0SWR4OiBjIGFzIENvbW1pdElkeCwgcGF0aCB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVmdXNlZCAhPT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgZW50cnkgPSB7IHJvd3MsIC4uLihyZWZ1c2VkICE9PSB1bmRlZmluZWQgJiYgeyByZWZ1c2VkIH0pLCByZWZ1c2VkQXQgfTtcbiAgICB0aGlzLnJvb3RzLnNldChyb290LCBlbnRyeSk7XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgLyoqIFJlZnVzZSBhbiBhbnN3ZXIgdGhhdCByZWFjaGVzIGEgcm93IHdob3NlIHZlcmIgdGhlIGxhdyBkb2VzIG5vdCBrbm93IChvbmUgaW4gY29tbWl0cyBgYWZ0ZXJgIDwgYyDiiaQgYGVuZGApLiAqL1xuICBwcml2YXRlIHJlZnVzZVRocm91Z2gocm9vdDogc3RyaW5nLCBlbmQ6IG51bWJlciwgYWZ0ZXIgPSAtMSk6IFJvb3RSb3dzIHtcbiAgICBjb25zdCByciA9IHRoaXMucm9vdFJvd3Mocm9vdCk7XG4gICAgaWYgKHJyLnJlZnVzZWQgIT09IHVuZGVmaW5lZCAmJiByci5yZWZ1c2VkQXQgPD0gZW5kICYmIHJyLnJlZnVzZWRBdCA+IGFmdGVyKSB0aHJvdyByci5yZWZ1c2VkO1xuICAgIHJldHVybiBycjtcbiAgfVxuXG4gIC8qKiBFdmVyeSByb3cgdW5kZXIgYGtleWAncyB0b3AtbGV2ZWwga2V5IHVwIHRvIGBlbmRgLCB3aXRoIGl0cyByZWxhdGlvbiB0byBga2V5YCDigJQgdGhyb3VnaCB0aGUgaW5kZXguICovXG4gIHJvd3NVbmRlclJvb3Qoa2V5OiBzdHJpbmcsIGVuZDogbnVtYmVyKTogVG91Y2hbXSB7XG4gICAgY29uc3QgcnIgPSB0aGlzLnJlZnVzZVRocm91Z2gocm9vdE9mKGtleSksIGVuZCk7XG4gICAgY29uc3Qgb3V0OiBUb3VjaFtdID0gW107XG4gICAgZm9yIChjb25zdCB0IG9mIHJyLnJvd3MpIHtcbiAgICAgIGlmICh0LmNvbW1pdElkeCA+IGVuZCkgYnJlYWs7XG4gICAgICBjb25zdCByID0gcmVsYXRpb24odC5wYXRoLCBrZXkpO1xuICAgICAgb3V0LnB1c2gociA9PT0gdW5kZWZpbmVkID8gdCA6IHsgLi4udCwgcmVsYXRpb246IHIgfSk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvLyDilIDilIAgdGhlIHJvb3QgZm9sZCwgb25jZSBwZXIgdG9wLWxldmVsIGtleSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIGhpc3Rvcnkocm9vdDogc3RyaW5nKTogUm9vdEhpc3Rvcnkge1xuICAgIGxldCBoID0gdGhpcy5oaXN0b3JpZXMuZ2V0KHJvb3QpO1xuICAgIGlmIChoICE9PSB1bmRlZmluZWQpIHJldHVybiBoO1xuICAgIGNvbnN0IGtlcHQgPSBuZXcgTWFwPG51bWJlciwgeyBiZWZvcmU6IHVua25vd247IGFmdGVyOiB1bmtub3duIH0+KCk7XG4gICAgY29uc3QgcmVwbGFjZWQgPSBuZXcgTWFwPFBhdGhOb2RlLCBudW1iZXJbXT4oKTtcbiAgICBjb25zdCByciA9IHRoaXMucm9vdFJvd3Mocm9vdCk7XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IHJyLnJvd3MubGVuZ3RoO1xuICAgIGZvbGRLZXkocnIucm93cywgW3Jvb3RdLCB7XG4gICAgICBnZW5lcmF0aW9uczoge1xuICAgICAgICBhdDogKGMsIHN0YXRlKSA9PiB7XG4gICAgICAgICAgbGV0IGtlZXAgPSBmYWxzZTtcbiAgICAgICAgICBxdWVyeVdvcmsudW5pdHMgKz0gdGhpcy5sb2dbY10udHJhY2UubGVuZ3RoO1xuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLmxvZ1tjXS50cmFjZSkge1xuICAgICAgICAgICAgaWYgKHQucGF0aCAhPT0gcm9vdCAmJiByZWxhdGlvbih0LnBhdGgsIHJvb3QpICE9PSAnaW5zaWRlJykgY29udGludWU7XG4gICAgICAgICAgICBpZiAoKG5vZGVBdCh0aGlzLmluZGV4LCB0LnBhdGgpPy5jaGlsZHJlbi5zaXplID8/IDApID4gMCkga2VlcCA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBzZWdzID0gdC5wYXRoLnNwbGl0KERFTElNKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAxOyBqIDwgc2Vncy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIG5hdGl2ZUdldChzdGF0ZSwgc2Vncy5zbGljZSgwLCBqKSkgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gbm9kZUF0KHRoaXMuaW5kZXgsIHNlZ3Muc2xpY2UoMCwgaikuam9pbihERUxJTSkpO1xuICAgICAgICAgICAgICBpZiAoY29udGFpbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0ID0gcmVwbGFjZWQuZ2V0KGNvbnRhaW5lcikgPz8gW107XG4gICAgICAgICAgICAgICAgaWYgKGxpc3RbbGlzdC5sZW5ndGggLSAxXSAhPT0gYykgbGlzdC5wdXNoKGMpO1xuICAgICAgICAgICAgICAgIHJlcGxhY2VkLnNldChjb250YWluZXIsIGxpc3QpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGtlZXAgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ga2VlcDtcbiAgICAgICAgfSxcbiAgICAgICAga2VlcDogKGMsIGJlZm9yZSwgYWZ0ZXIpID0+IHtcbiAgICAgICAgICBrZXB0LnNldChjLCB7IGJlZm9yZSwgYWZ0ZXIgfSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGggPSB7IGtlcHQsIGtlcHRBdDogWy4uLmtlcHQua2V5cygpXS5zb3J0KChhLCBiKSA9PiBhIC0gYiksIHJlcGxhY2VkIH07XG4gICAgdGhpcy5oaXN0b3JpZXMuc2V0KHJvb3QsIGgpO1xuICAgIHJldHVybiBoO1xuICB9XG5cbiAgLyoqIEEga2V5IG5ldmVyIHdyaXR0ZW4sIHVuZGVyIGEgY29udGFpbmVyIG9ubHkgZXZlciB3cml0dGVuIHdob2xlOiBubyBnZW5lcmF0aW9uIGlzIGtlcHQgZm9yIGl0LiAqL1xuICBwcml2YXRlIG5lZWRzT3duRm9sZChrZXk6IHN0cmluZywgYW5jZXN0b3JzOiByZWFkb25seSBQYXRoTm9kZVtdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG5vZGVBdCh0aGlzLmluZGV4LCBrZXkpID09PSB1bmRlZmluZWQgJiYgYW5jZXN0b3JzW2FuY2VzdG9ycy5sZW5ndGggLSAxXS5jaGlsZHJlbi5zaXplID09PSAwO1xuICB9XG5cbiAgLyoqIEV2ZXJ5IGNvbW1pdCBhY3Jvc3Mgd2hpY2ggdGhlIHZhbHVlIGF0IGBrZXlgIGNoYW5nZWQg4oCUIG9uZSBmb2xkIGZvciB0aGlzIGtleSAodGhlIGZhbGxiYWNrIHNoYXBlKS4gKi9cbiAgcHJpdmF0ZSBvd25DaGFuZ2VzKGtleTogc3RyaW5nKTogbnVtYmVyW10ge1xuICAgIGxldCBjaGFuZ2VzID0gdGhpcy5jaGFuZ2VzQnlLZXkuZ2V0KGtleSk7XG4gICAgaWYgKGNoYW5nZXMgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGNoYW5nZXM7XG4gICAgY29uc3Qgc2VncyA9IGtleS5zcGxpdChERUxJTSk7XG4gICAgY29uc3QgdmVyZGljdCA9IG5ldyBNYXA8bnVtYmVyLCBib29sZWFuPigpO1xuICAgIGxldCBjb21taXQgPSAtMTtcbiAgICBsZXQgc3RhcnQ6IHVua25vd247XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IHRoaXMucm9vdFJvd3Moc2Vnc1swXSkucm93cy5sZW5ndGg7XG4gICAgZm9sZEtleSh0aGlzLnJvb3RSb3dzKHNlZ3NbMF0pLnJvd3MsIHNlZ3MsIHtcbiAgICAgIGV2ZXJ5Um93OiB0cnVlLFxuICAgICAgb2JzZXJ2ZTogKHRvdWNoLCBiZWZvcmUsIGFmdGVyKSA9PiB7XG4gICAgICAgIGlmICh0b3VjaC5jb21taXRJZHggIT09IGNvbW1pdCkge1xuICAgICAgICAgIGNvbW1pdCA9IHRvdWNoLmNvbW1pdElkeDtcbiAgICAgICAgICBzdGFydCA9IGJlZm9yZTtcbiAgICAgICAgfVxuICAgICAgICB2ZXJkaWN0LnNldChjb21taXQsICFkZWVwRXF1YWwoc3RhcnQsIGFmdGVyKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIGNoYW5nZXMgPSBbLi4udmVyZGljdF0uZmlsdGVyKChbLCBjaGFuZ2VkXSkgPT4gY2hhbmdlZCkubWFwKChbY10pID0+IGMpO1xuICAgIHRoaXMuY2hhbmdlc0J5S2V5LnNldChrZXksIGNoYW5nZXMpO1xuICAgIHJldHVybiBjaGFuZ2VzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjb21taXRzIGluIHRoZSBPUEVOIHJhbmdlIChgYWZ0ZXJgLCBgYmVmb3JlYCkgd2l0aCBubyByb3cgb24gb3IgaW5zaWRlIGBrZXlgIGFjcm9zcyB3aGljaCB0aGUgdmFsdWVcbiAgICogYXQgYGtleWAgY2hhbmdlZCDigJQgdGhlIEFST1VORCBoYWxmIG9mIHRoZSB3cml0ZXIgcnVsZSAoYW5kIHRoZSBzdHJpbmctY29udGFpbmVyIGNhc2UgYmVzaWRlIGl0KS5cbiAgICovXG4gIHByaXZhdGUgY2hhbmdlZEFyb3VuZChrZXk6IHN0cmluZywgYWZ0ZXI6IG51bWJlciwgYmVmb3JlOiBudW1iZXIpOiByZWFkb25seSBudW1iZXJbXSB7XG4gICAgY29uc3QgYW5jZXN0b3JzID0gYW5jZXN0b3JOb2Rlcyh0aGlzLmluZGV4LCBrZXkpO1xuICAgIGlmIChhbmNlc3RvcnMubGVuZ3RoID09PSAwIHx8IGFuY2VzdG9ycy5ldmVyeSgoYSkgPT4gYS5wb3NpdGlvbnMubGVuZ3RoID09PSAwKSkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IHJvb3QgPSBhbmNlc3RvcnNbMF0ucGF0aDtcbiAgICAvLyBUaGUgYW5zd2VyIHJlYWRzIHRoZSByb3dzIG9mIHRoZSB3aW5kb3c6IHJlZnVzZSBpdCB3aGVuIG9uZSBvZiB0aGVtIGlzIGEgdmVyYiB0aGUgbGF3IGRvZXMgbm90IGtub3cuXG4gICAgdGhpcy5yZWZ1c2VUaHJvdWdoKHJvb3QsIGJlZm9yZSAtIDEsIGFmdGVyKTtcbiAgICBpZiAodGhpcy5uZWVkc093bkZvbGQoa2V5LCBhbmNlc3RvcnMpKSByZXR1cm4gYmV0d2Vlbih0aGlzLm93bkNoYW5nZXMoa2V5KSwgYWZ0ZXIsIGJlZm9yZSk7XG4gICAgY29uc3QgaCA9IHRoaXMuaGlzdG9yeShyb290KTtcbiAgICBjb25zdCBjYW5kaWRhdGVzID0gYXNjZW5kaW5nVW5pb24oW1xuICAgICAgLi4uYW5jZXN0b3JzLm1hcCgoYSkgPT4gYmV0d2VlbihhLnBvc2l0aW9ucywgYWZ0ZXIsIGJlZm9yZSkpLFxuICAgICAgLi4uYW5jZXN0b3JzLm1hcCgoYSkgPT4gYmV0d2VlbihoLnJlcGxhY2VkLmdldChhKSA/PyBbXSwgYWZ0ZXIsIGJlZm9yZSkpLFxuICAgIF0pO1xuICAgIGNvbnN0IHJlc3QgPSBrZXkuc3BsaXQoREVMSU0pLnNsaWNlKDEpO1xuICAgIHF1ZXJ5V29yay51bml0cyArPSBjYW5kaWRhdGVzLmxlbmd0aDtcbiAgICByZXR1cm4gY2FuZGlkYXRlcy5maWx0ZXIoKGMpID0+IHtcbiAgICAgIGNvbnN0IGcgPSBoLmtlcHQuZ2V0KGMpO1xuICAgICAgcmV0dXJuIGcgIT09IHVuZGVmaW5lZCAmJiAhZGVlcEVxdWFsKG5hdGl2ZUdldChnLmJlZm9yZSwgcmVzdCksIG5hdGl2ZUdldChnLmFmdGVyLCByZXN0KSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyDilIDilIAgdGhlIHdyaXRlciBydWxlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBFdmVyeSBjb21taXQgdGhhdCBXUk9URSBga2V5YCwgYXNjZW5kaW5nIChtZW1vaXNlZCBwZXIga2V5KS4gKi9cbiAgd3JpdGVyc09mKGtleTogc3RyaW5nKTogcmVhZG9ubHkgbnVtYmVyW10ge1xuICAgIGxldCB3cml0ZXJzID0gdGhpcy53cml0ZXJzQnlLZXkuZ2V0KGtleSk7XG4gICAgaWYgKHdyaXRlcnMgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHdyaXRlcnM7XG4gICAgY29uc3Qgbm9kZSA9IG5vZGVBdCh0aGlzLmluZGV4LCBrZXkpO1xuICAgIGNvbnN0IGF0T3JJbnNpZGUgPSBub2RlID09PSB1bmRlZmluZWQgPyBbXSA6IHN1YnRyZWVQb3NpdGlvbnMobm9kZSk7XG4gICAgY29uc3QgYXJvdW5kID0gdGhpcy5jaGFuZ2VkQXJvdW5kKGtleSwgLTEsIE51bWJlci5QT1NJVElWRV9JTkZJTklUWSk7XG4gICAgd3JpdGVycyA9IGFyb3VuZC5sZW5ndGggPT09IDAgPyBhdE9ySW5zaWRlLnNsaWNlKCkgOiBhc2NlbmRpbmdVbmlvbihbYXRPckluc2lkZSwgYXJvdW5kXSk7XG4gICAgdGhpcy53cml0ZXJzQnlLZXkuc2V0KGtleSwgd3JpdGVycyk7XG4gICAgcmV0dXJuIHdyaXRlcnM7XG4gIH1cblxuICAvKiogVGhlIEFSUkFZIHBvc2l0aW9uIG9mIHRoZSBsYXN0IGNvbW1pdCBiZWZvcmUgYGJlZm9yZWAgdGhhdCB3cm90ZSBga2V5YCwgb3IgLTEuICovXG4gIGxhc3RXcml0ZXJCZWZvcmUoa2V5OiBzdHJpbmcsIGJlZm9yZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBxdWVyeVdvcmsudW5pdHMgKz0gMTtcbiAgICBjb25zdCBub2RlID0gbm9kZUF0KHRoaXMuaW5kZXgsIGtleSk7XG4gICAgY29uc3QgbGFzdEFJID0gbm9kZSA9PT0gdW5kZWZpbmVkID8gLTEgOiBsYXN0QmVmb3JlKHN1YnRyZWVQb3NpdGlvbnMobm9kZSksIGJlZm9yZSk7XG4gICAgY29uc3QgYW5jZXN0b3JzID0gYW5jZXN0b3JOb2Rlcyh0aGlzLmluZGV4LCBrZXkpO1xuICAgIHF1ZXJ5V29yay51bml0cyArPSBhbmNlc3RvcnMubGVuZ3RoOyAvLyB0aGUgc2NhbnMgb3ZlciB0aGVtIGJlbG93XG4gICAgaWYgKGFuY2VzdG9ycy5sZW5ndGggPT09IDApIHJldHVybiBsYXN0QUk7XG4gICAgLy8gQSByb3cgYXJvdW5kIHRoZSBrZXkgaW4gdGhlIGxhc3Qgd3JpdGUncyBPV04gY29tbWl0IGNvdW50cyB3aGVuIGl0IGNhbiBsZWF2ZSBhIHN0cmluZyBjb250YWluZXIgYWJvdmVcbiAgICAvLyB0aGUga2V5IChhIGxhdGVyIHdyaXRlIGJlc2lkZSB0aGUga2V5IHRoZW4gcmVwbGFjZXMgaXQpLlxuICAgIGNvbnN0IGFyb3VuZEluV2luZG93ID1cbiAgICAgIGFuY2VzdG9ycy5zb21lKChhKSA9PiBiZXR3ZWVuKGEucG9zaXRpb25zLCBsYXN0QUksIGJlZm9yZSkubGVuZ3RoID4gMCkgfHxcbiAgICAgIChsYXN0QUkgIT09IC0xICYmIGxlYXZlc1N0cmluZ0Fib3ZlKHRoaXMubG9nW2xhc3RBSV0sIGtleSkpO1xuICAgIC8vIEEgYGRlbGV0ZWAgY2Fubm90IHJlcGxhY2UgYSBzdHJpbmcgY29udGFpbmVyLCBzbyBhIGNoYXJhY3RlciByZWFkIHRocm91Z2ggb25lIGNhbiBzdGlsbCBtb3ZlIGFmdGVyIGl0LlxuICAgIGNvbnN0IGRlbGV0ZU9ubHkgPSBsYXN0QUkgIT09IC0xICYmICF3cml0ZXNBdE9ySW5zaWRlKHRoaXMubG9nW2xhc3RBSV0sIGtleSk7XG4gICAgaWYgKCFhcm91bmRJbldpbmRvdyAmJiAhKGRlbGV0ZU9ubHkgJiYgYW5jZXN0b3JzLnNvbWUoKGEpID0+IGEucG9zaXRpb25zLmxlbmd0aCA+IDApKSkgcmV0dXJuIGxhc3RBSTtcbiAgICBjb25zdCBjaGFuZ2VkID0gdGhpcy5jaGFuZ2VkQXJvdW5kKGtleSwgbGFzdEFJLCBiZWZvcmUpO1xuICAgIHJldHVybiBjaGFuZ2VkLmxlbmd0aCA+IDAgPyBjaGFuZ2VkW2NoYW5nZWQubGVuZ3RoIC0gMV0gOiBsYXN0QUk7XG4gIH1cblxuICAvLyDilIDilIAgdGhlIHZhbHVlIHJ1bGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiBga2V5YCBhZnRlciBjb21taXQgYGlkeGAgKGluY2x1c2l2ZSkuIFRoZSBmb2xkIG9mIHRoZSByb3dzIHVuZGVyIGl0cyB0b3AtbGV2ZWwga2V5IOKAlCBidXRcbiAgICogd2hlbiBpdHMgbGFzdCB0b3RhbCByb3cgdXAgdG8gYGlkeGAgaXMgYSBgc2V0YCBPTiB0aGUga2V5IGFuZCBub3RoaW5nIGFyb3VuZCBpdCB3YXMgd3JpdHRlbiBzaW5jZSwgb25seVxuICAgKiB0aGUgcm93cyBvbiBhbmQgaW5zaWRlIHRoZSBrZXkgZnJvbSB0aGF0IGBzZXRgIG9uIGNhbiBtb3ZlIGl0LCBhbmQgb25seSB0aGV5IGFyZSBmb2xkZWQuXG4gICAqL1xuICB2YWx1ZUF0KGtleTogc3RyaW5nLCBpZHg6IG51bWJlcik6IHVua25vd24ge1xuICAgIGNvbnN0IHNlZ3MgPSBrZXkuc3BsaXQoREVMSU0pO1xuICAgIHRoaXMucmVmdXNlVGhyb3VnaChzZWdzWzBdLCBpZHgpO1xuICAgIGNvbnN0IG5vZGUgPSBub2RlQXQodGhpcy5pbmRleCwga2V5KTtcbiAgICBjb25zdCBhbmNlc3RvcnMgPSBhbmNlc3Rvck5vZGVzKHRoaXMuaW5kZXgsIGtleSk7XG4gICAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCAmJiBhbmNlc3RvcnMubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmIChub2RlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGFuY2hvciA9IGxhc3RCZWZvcmUobm9kZS50b3RhbHMsIGlkeCArIDEpO1xuICAgICAgaWYgKFxuICAgICAgICBhbmNob3IgIT09IC0xICYmXG4gICAgICAgIGxhc3RUb3RhbElzU2V0KHRoaXMubG9nW2FuY2hvcl0sIGtleSkgJiZcbiAgICAgICAgYW5jZXN0b3JzLmV2ZXJ5KChhKSA9PiBiZXR3ZWVuKGEucG9zaXRpb25zLCBhbmNob3IgLSAxLCBpZHggKyAxKS5sZW5ndGggPT09IDApXG4gICAgICApIHtcbiAgICAgICAgY29uc3Qgcm93czogVG91Y2hbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGMgb2YgYmV0d2VlbihzdWJ0cmVlUG9zaXRpb25zKG5vZGUpLCBhbmNob3IgLSAxLCBpZHggKyAxKSkge1xuICAgICAgICAgIGNvbnN0IHRyYWNlID0gdGhpcy5sb2dbY10udHJhY2U7XG4gICAgICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgdHJhY2UubGVuZ3RoOyByb3crKykge1xuICAgICAgICAgICAgY29uc3QgciA9IHJlbGF0aW9uKHRyYWNlW3Jvd10ucGF0aCwga2V5KTtcbiAgICAgICAgICAgIGlmIChyID09PSAnZXhhY3QnIHx8IHIgPT09ICdpbnNpZGUnKSB7XG4gICAgICAgICAgICAgIHJvd3MucHVzaCh7XG4gICAgICAgICAgICAgICAgdmVyYjogdHJhY2Vbcm93XS52ZXJiIGFzIFRvdWNoWyd2ZXJiJ10sXG4gICAgICAgICAgICAgICAgYnVuZGxlOiB0aGlzLmxvZ1tjXSxcbiAgICAgICAgICAgICAgICBjb21taXRJZHg6IGMgYXMgQ29tbWl0SWR4LFxuICAgICAgICAgICAgICAgIHBhdGg6IHRyYWNlW3Jvd10ucGF0aCxcbiAgICAgICAgICAgICAgICByZWxhdGlvbjogcixcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXJ5V29yay51bml0cyArPSByb3dzLmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIGZvbGRLZXkocm93cywgc2Vncyk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLnJvd3NVbmRlclJvb3Qoa2V5LCBpZHgpO1xuICAgIHF1ZXJ5V29yay51bml0cyArPSByb3dzLmxlbmd0aDtcbiAgICBpZiAoIXJvd3Muc29tZSgocm93KSA9PiByb3cucmVsYXRpb24gIT09IHVuZGVmaW5lZCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgLy8gQSBtZW1vaXNlZCBtb2RlbCBmb2xkcyBmcm9tIHRoZSBsYXN0IGdlbmVyYXRpb24gaXQga2VlcHMgYXQgb3IgYmVmb3JlIGBpZHhgIOKAlCB0aGUgcm93cyBhZnRlciBpdCBvbmx5LlxuICAgIGlmIChNT0RFTFMuZ2V0KHRoaXMubG9nKSA9PT0gdGhpcykge1xuICAgICAgY29uc3QgaCA9IHRoaXMuaGlzdG9yeShzZWdzWzBdKTtcbiAgICAgIGNvbnN0IGtlcHQgPSBsYXN0QmVmb3JlKGgua2VwdEF0LCBpZHggKyAxKTtcbiAgICAgIGlmIChrZXB0ICE9PSAtMSkge1xuICAgICAgICBjb25zdCBhZnRlciA9IHJvd3MuZmlsdGVyKChyb3cpID0+IHJvdy5jb21taXRJZHggPiBrZXB0KTtcbiAgICAgICAgcmV0dXJuIGZvbGRLZXkoYWZ0ZXIsIHNlZ3MsIHsgYW5jaG9yZWQ6IHRydWUsIHN0YXJ0OiBoLmtlcHQuZ2V0KGtlcHQpPy5hZnRlciB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvbGRLZXkocm93cywgc2VncywgeyBhbmNob3JlZDogdHJ1ZSB9KTtcbiAgfVxufVxuXG4vKiogSXMgdGhlIGxhc3QgYHNldGAgLyBgZGVsZXRlYCByb3cgT04gYGtleWAgaW4gdGhpcyBjb21taXQgYSBgc2V0YD8gKi9cbmZ1bmN0aW9uIGxhc3RUb3RhbElzU2V0KGJ1bmRsZTogQ29tbWl0QnVuZGxlLCBrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBmb3IgKGxldCBpID0gYnVuZGxlLnRyYWNlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgY29uc3QgdCA9IGJ1bmRsZS50cmFjZVtpXTtcbiAgICBpZiAodC5wYXRoID09PSBrZXkgJiYgKHQudmVyYiA9PT0gJ3NldCcgfHwgdC52ZXJiID09PSAnZGVsZXRlJykpIHJldHVybiB0LnZlcmIgPT09ICdzZXQnO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbiJdfQ==
364
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nTW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL21lbW9yeS9sb2dNb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQkc7QUFHSCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFHTCxhQUFhLEVBQ2IsY0FBYyxFQUNkLE9BQU8sRUFDUCxnQkFBZ0IsRUFDaEIsVUFBVSxFQUNWLE1BQU0sRUFDTixTQUFTLEVBQ1QsUUFBUSxFQUNSLE1BQU0sRUFDTixnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBRW5DLE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBbUIzRSxNQUFNLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBcUMsQ0FBQztBQUVoRSxxR0FBcUc7QUFDckcsU0FBUyxXQUFXLENBQUMsR0FBNEI7SUFDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDeEMsZ0dBQWdHO0lBQ2hHLG9GQUFvRjtJQUNwRixLQUFLLE1BQU0sTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDN0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FB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S0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDdEYsQ0FBQztBQUVELHdFQUF3RTtBQUN4RSxTQUFTLGNBQWMsQ0FBQyxNQUFvQixFQUFFLEdBQVc7SUFDdkQsS0FBSyxJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2xELE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDO1lBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxLQUFLLEtBQUssQ0FBQztJQUMzRixDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBsb2dNb2RlbC50cyDigJQgdGhlIHJlYWQgbW9kZWwgb2YgT05FIGNvbW1pdCBsb2c6IHRoZSB3cml0ZXIgcnVsZSBhbmQgdGhlIHZhbHVlIHJ1bGUgb2YgYGtleVBhdGhzLnRzYCxcbiAqIGFuc3dlcmVkIGF0IGEgY29zdCBwcm9wb3J0aW9uYWwgdG8gdGhlIGFuc3dlciwgbm90IHRvIHRoZSBsb2cgKEYzLCA5LjMzLjApLlxuICpcbiAqIFdIWSBUSElTIEZJTEUgRVhJU1RTLiBUaGUgcnVsZXMgYXJlIHNpbXBsZSB0byBzdGF0ZSBhbmQgZXhwZW5zaXZlIHRvIGFwcGx5IG5haXZlbHk6IGEga2V5J3Mgd3JpdGVyc1xuICogaW5jbHVkZSB0aGUgY29tbWl0cyBBUk9VTkQgaXQgd2hvc2UgY2hhbmdlIHJlYWNoZWQgaXQsIGFuZCBkZWNpZGluZyB0aGF0IG5lZWRzIHRoZSB2YWx1ZSBhdCB0aGUga2V5XG4gKiBiZWZvcmUgYW5kIGFmdGVyIHN1Y2ggYSBjb21taXQg4oCUIGEgZm9sZCBvZiBpdHMgdG9wLWxldmVsIGtleS4gRm9sZGluZyBvbmNlIHBlciBLRVkgbWFkZSBhIGNhdXNhbCB3YWxrXG4gKiBvdmVyIG5lc3RlZCBrZXlzIGN1YmljIGluIHRoZSBsb2cgKGV2ZXJ5IGtleSByZS1zY2FubmVkIHRoZSBsb2cgYW5kIHJlLWZvbGRlZCBpdHMgcm9vdCkuIEhlcmU6XG4gKlxuICogICAtIHRoZSBsb2cgaXMgaW5kZXhlZCBPTkNFIChga2V5UGF0aHMgwrcgYnVpbGRXcml0ZXJJbmRleGAsIGEgcGF0aCB0cmllKTogYSBrZXkncyBjYW5kaWRhdGVzIGNvc3RcbiAqICAgICBPKGRlcHRoICsgbWF0Y2hlcykg4oCUIGl0cyBub2RlLCBpdHMgYW5jZXN0b3JzLCBpdHMgc3VidHJlZSDigJQgYW5kIHRoZSByb3dzIHVuZGVyIGEgdG9wLWxldmVsIGtleSBhcmVcbiAqICAgICByZWFjaGVkIHRocm91Z2ggdGhlIGluZGV4LCBuZXZlciBhIHNjYW47XG4gKiAgIC0gZWFjaCB0b3AtbGV2ZWwga2V5IGlzIGZvbGRlZCBPTkNFIChgdmVyYnMgwrcgZm9sZEtleWAsIGNvcHktb24td3JpdGUpLCBrZWVwaW5nIGl0cyB2YWx1ZSBiZWZvcmUgYW5kXG4gKiAgICAgYWZ0ZXIgZXZlcnkgY29tbWl0IGEgdmVyZGljdCBjYW4gYXNrIGFib3V0OiBhIGNvbW1pdCB3aXRoIGEgcm93IG9uIGEgcGF0aCB0aGF0IGhhcyB3cml0dGVuIHBhdGhzXG4gKiAgICAgYmVsb3cgaXQgKGl0IGNhbiBiZSBBUk9VTkQgYSB3cml0dGVuIGtleSksIGFuZCBhIGNvbW1pdCB0aGF0IHdyaXRlcyBUSFJPVUdIIGEgc3RyaW5nLXZhbHVlZFxuICogICAgIGNvbnRhaW5lciAoYG5hdGl2ZVNldGAgcmVwbGFjZXMgdGhlIHN0cmluZywgYW5kIHRoZSBjaGFyYWN0ZXJzIGEga2V5IHJlYWQgZnJvbSBpdCB2YW5pc2gg4oCUIHRoZSBvbmVcbiAqICAgICB3YXkgYSByb3cgQkVTSURFIGEga2V5IG1vdmVzIGl0KS4gQSBrZXkncyB2ZXJkaWN0IGlzIHRoZW4gdHdvIGBuYXRpdmVHZXRgcyBhbmQgYSBgZGVlcEVxdWFsYDtcbiAqICAgLSB0aGUgbGFzdCB3cml0ZXIgYmVmb3JlIGEgcG9pbnQgaXMgZm91bmQgTEFaSUxZOiB0aGUgbGFzdCB3cml0ZSBvbiBvciBpbnNpZGUgdGhlIGtleSwgdGhlbiBvbmx5IHRoZVxuICogICAgIGFyb3VuZC1jYW5kaWRhdGVzIGFmdGVyIGl0IOKAlCBtb3N0IHF1ZXN0aW9ucyBuZWVkIG5vIHZlcmRpY3QgYXQgYWxsLlxuICpcbiAqIE9uZSBzaGFwZSBrZWVwcyBhIHBlci1rZXkgZm9sZCAobWVtb2lzZWQgcGVyIGtleSk6IGEga2V5IHRoYXQgd2FzIG5ldmVyIHdyaXR0ZW4sIHVuZGVyIGEgY29udGFpbmVyIHRoYXRcbiAqIHdhcyBvbmx5IGV2ZXIgd3JpdHRlbiBXSE9MRSAoaXRzIG5vZGUgaGFzIG5vIHdyaXR0ZW4gY2hpbGRyZW4sIHNvIG5vIGdlbmVyYXRpb24gaXMga2VwdCB0aGVyZSkuXG4gKlxuICogQSBtb2RlbCBvZiBhIEZST1pFTiBsb2cgKGV2ZXJ5IGVuZ2luZSBsb2cgc2luY2UgRjM6IGBFdmVudExvZyDCtyByZWNvcmRgIGZyZWV6ZXMgZWFjaCBidW5kbGUgYW5kXG4gKiBgZ2V0U25hcHNob3RgIGZyZWV6ZXMgdGhlIGFycmF5KSBpcyBtZW1vaXNlZCBvbiB0aGUgbG9nIOKAlCB0aGUgcmVjb3JkIGNhbm5vdCBjaGFuZ2UgdW5kZXIgaXQuIEEgbG9nIHRoYXRcbiAqIGlzIG5vdCBmcm96ZW4gKGhhbmQtYnVpbHQsIHBhcnNlZCBmcm9tIEpTT04pIGdldHMgYSBmcmVzaCBtb2RlbCBwZXIgcXVlc3Rpb24uXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDb21taXRJZHggfSBmcm9tICcuLi9pZHMvcnVudGltZVN0YWdlSWQuanMnO1xuaW1wb3J0IHsgZGVlcEVxdWFsIH0gZnJvbSAnLi9lcXVhbGl0eS5qcyc7XG5pbXBvcnQge1xuICB0eXBlIFBhdGhOb2RlLFxuICB0eXBlIFdyaXRlckluZGV4LFxuICBhbmNlc3Rvck5vZGVzLFxuICBhc2NlbmRpbmdVbmlvbixcbiAgYmV0d2VlbixcbiAgYnVpbGRXcml0ZXJJbmRleCxcbiAgbGFzdEJlZm9yZSxcbiAgbm9kZUF0LFxuICBxdWVyeVdvcmssXG4gIHJlbGF0aW9uLFxuICByb290T2YsXG4gIHN1YnRyZWVQb3NpdGlvbnMsXG59IGZyb20gJy4va2V5UGF0aHMuanMnO1xuaW1wb3J0IHsgbmF0aXZlR2V0IH0gZnJvbSAnLi9wYXRoT3BzLmpzJztcbmltcG9ydCB7IERFTElNIH0gZnJvbSAnLi9wYXRocy5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSB9IGZyb20gJy4vdHlwZXMuanMnO1xuaW1wb3J0IHsgdHlwZSBUb3VjaCwgZm9sZEtleSwgaXNWZXJiLCBVbmtub3duVmVyYkVycm9yIH0gZnJvbSAnLi92ZXJicy5qcyc7XG5cbi8qKiBUaGUgcm93cyB1bmRlciBvbmUgdG9wLWxldmVsIGtleSwgaW4gY29tbWl0IG9yZGVyIOKAlCB1cCB0byB0aGUgZmlyc3Qgcm93IHRoZSB2ZXJiIGxhdyByZWZ1c2VzLiAqL1xuaW50ZXJmYWNlIFJvb3RSb3dzIHtcbiAgcmVhZG9ubHkgcm93czogVG91Y2hbXTtcbiAgLyoqIFRoZSBmaXJzdCByb3cgdW5kZXIgdGhlIGtleSB3aG9zZSB2ZXJiIGlzIG5vbmUgb2YgdGhlIGZvdXIg4oCUIGV2ZXJ5IGFuc3dlciB0aGF0IHJlYWNoZXMgaXQgaXMgcmVmdXNlZC4gKi9cbiAgcmVhZG9ubHkgcmVmdXNlZD86IFVua25vd25WZXJiRXJyb3I7XG4gIHJlYWRvbmx5IHJlZnVzZWRBdDogbnVtYmVyO1xufVxuXG4vKiogT25lIHRvcC1sZXZlbCBrZXkgZm9sZGVkIG9uY2U6IGl0cyB2YWx1ZSBiZWZvcmUgYW5kIGFmdGVyIGV2ZXJ5IGNvbW1pdCBhIHZlcmRpY3QgY2FuIGFzayBhYm91dC4gKi9cbmludGVyZmFjZSBSb290SGlzdG9yeSB7XG4gIHJlYWRvbmx5IGtlcHQ6IE1hcDxudW1iZXIsIHsgcmVhZG9ubHkgYmVmb3JlOiB1bmtub3duOyByZWFkb25seSBhZnRlcjogdW5rbm93biB9PjtcbiAgLyoqIFRoZSBrZXB0IGNvbW1pdHMsIGFzY2VuZGluZy4gKi9cbiAgcmVhZG9ubHkga2VwdEF0OiByZWFkb25seSBudW1iZXJbXTtcbiAgLyoqIENvbW1pdHMgdGhhdCB3cm90ZSBUSFJPVUdIIGEgc3RyaW5nLXZhbHVlZCBjb250YWluZXIsIGJ5IHRoZSBub2RlIG9mIHRoYXQgY29udGFpbmVyLiAqL1xuICByZWFkb25seSByZXBsYWNlZDogTWFwPFBhdGhOb2RlLCBudW1iZXJbXT47XG59XG5cbmNvbnN0IE1PREVMUyA9IG5ldyBXZWFrTWFwPHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdLCBMb2dNb2RlbD4oKTtcblxuLyoqIElzIHRoZSBsb2cgaW1tdXRhYmxlIOKAlCB0aGUgYXJyYXkgYW5kIGV2ZXJ5IGJ1bmRsZSBhbmQgdHJhY2UgZnJvemVuIChhbiBlbmdpbmUgc25hcHNob3QncyBsb2cpPyAqL1xuZnVuY3Rpb24gaXNGcm96ZW5Mb2cobG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSk6IGJvb2xlYW4ge1xuICBpZiAoIU9iamVjdC5pc0Zyb3plbihsb2cpKSByZXR1cm4gZmFsc2U7XG4gIC8vIFRoZSBzaGFwZSBgRXZlbnRMb2cgwrcgcmVjb3JkYCBsZWF2ZXM6IHRoZSBidW5kbGUsIGl0cyBwYXlsb2FkcyBhbmQgaXRzIHJvd3MuIEEgaGFuZC1idWlsdCBsb2dcbiAgLy8gZnJvemVuIGxlc3MgZGVlcGx5IHRoYW4gdGhhdCBjb3VsZCBjaGFuZ2UgYWZ0ZXIgYSBxdWVyeSwgc28gaXQgaXMgbmV2ZXIgbWVtb2lzZWQuXG4gIGZvciAoY29uc3QgYnVuZGxlIG9mIGxvZykge1xuICAgIGlmICghT2JqZWN0LmlzRnJvemVuKGJ1bmRsZSkgfHwgIU9iamVjdC5pc0Zyb3plbihidW5kbGUudHJhY2UpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFPYmplY3QuaXNGcm96ZW4oYnVuZGxlLm92ZXJ3cml0ZSkgfHwgIU9iamVjdC5pc0Zyb3plbihidW5kbGUudXBkYXRlcykpIHJldHVybiBmYWxzZTtcbiAgICBpZiAoIWJ1bmRsZS50cmFjZS5ldmVyeSgocm93KSA9PiBPYmplY3QuaXNGcm96ZW4ocm93KSkpIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIFRoZSByZWFkIG1vZGVsIG9mIGBsb2dgIOKAlCBtZW1vaXNlZCB3aGVuIHRoZSBsb2cgaXMgZnJvemVuLCBmcmVzaCBvdGhlcndpc2UuICovXG5leHBvcnQgZnVuY3Rpb24gbG9nTW9kZWwobG9nOiByZWFkb25seSBDb21taXRCdW5kbGVbXSk6IExvZ01vZGVsIHtcbiAgY29uc3QgbWVtbyA9IE1PREVMUy5nZXQobG9nKTtcbiAgaWYgKG1lbW8gIT09IHVuZGVmaW5lZCkgcmV0dXJuIG1lbW87XG4gIGNvbnN0IG1vZGVsID0gbmV3IExvZ01vZGVsKGxvZyk7XG4gIGlmIChpc0Zyb3plbkxvZyhsb2cpKSBNT0RFTFMuc2V0KGxvZywgbW9kZWwpO1xuICByZXR1cm4gbW9kZWw7XG59XG5cbi8qKiBUaGUgbWVtb2lzZWQgbW9kZWwgb2YgYSBmcm96ZW4gbG9nIChidWlsdCBvbiBmaXJzdCBhc2spLCBvciB1bmRlZmluZWQgZm9yIGEgbG9nIHRoYXQgaXMgbm90IGZyb3plbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZW1vaXNlZE1vZGVsKGxvZzogcmVhZG9ubHkgQ29tbWl0QnVuZGxlW10pOiBMb2dNb2RlbCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBNT0RFTFMuZ2V0KGxvZykgPz8gKGlzRnJvemVuTG9nKGxvZykgPyBsb2dNb2RlbChsb2cpIDogdW5kZWZpbmVkKTtcbn1cblxuLyoqIERvZXMgdGhlIGNvbW1pdCBob2xkIGEgbm9uLWBkZWxldGVgIHJvdyBvbiBga2V5YCBvciBpbnNpZGUgaXQ/IChBIGBkZWxldGVgIGNhbm5vdCByZXBsYWNlIGEgc3RyaW5nIGNvbnRhaW5lci4pICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVzQXRPckluc2lkZShidW5kbGU6IENvbW1pdEJ1bmRsZSwga2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCB0IG9mIGJ1bmRsZS50cmFjZSkge1xuICAgIGlmICh0LnZlcmIgPT09ICdkZWxldGUnKSBjb250aW51ZTtcbiAgICBjb25zdCByID0gcmVsYXRpb24odC5wYXRoLCBrZXkpO1xuICAgIGlmIChyID09PSAnZXhhY3QnIHx8IHIgPT09ICdpbnNpZGUnKSByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2FuIHRoaXMgY29tbWl0IGxlYXZlIGEgU1RSSU5HLXZhbHVlZCBjb250YWluZXIgYWJvdmUgYGtleWAg4oCUIGEgcm93IGFyb3VuZCB0aGUga2V5IHdob3NlIHJlY29yZGVkIHZhbHVlXG4gKiBob2xkcyBhIHN0cmluZyBhdCB0aGUgcm93J3MgcGF0aCBvciBhbnl3aGVyZSBiZXR3ZWVuIGl0IGFuZCB0aGUga2V5PyBPbmx5IHRoZW4gY2FuIGEgbGF0ZXIgd3JpdGUgYmVzaWRlIHRoZVxuICoga2V5IG1vdmUgaXQgKGBuYXRpdmVTZXRgIHJlcGxhY2VzIHRoZSBzdHJpbmcpLiBBIGNvbnNlcnZhdGl2ZSwgcGF5bG9hZC1vbmx5IGNoZWNrOiBubyBmb2xkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGVhdmVzU3RyaW5nQWJvdmUoYnVuZGxlOiBDb21taXRCdW5kbGUsIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGtleVNlZ3MgPSBrZXkuc3BsaXQoREVMSU0pO1xuICBmb3IgKGNvbnN0IHQgb2YgYnVuZGxlLnRyYWNlKSB7XG4gICAgaWYgKHQudmVyYiA9PT0gJ2RlbGV0ZScgfHwgcmVsYXRpb24odC5wYXRoLCBrZXkpICE9PSAnYXJvdW5kJykgY29udGludWU7XG4gICAgY29uc3Qgc2VncyA9IHQucGF0aC5zcGxpdChERUxJTSk7XG4gICAgbGV0IHZhbHVlOiB1bmtub3duID0gbmF0aXZlR2V0KHQudmVyYiA9PT0gJ21lcmdlJyA/IGJ1bmRsZS51cGRhdGVzIDogYnVuZGxlLm92ZXJ3cml0ZSwgc2Vncyk7XG4gICAgZm9yIChsZXQgZGVwdGggPSBzZWdzLmxlbmd0aDsgZGVwdGggPCBrZXlTZWdzLmxlbmd0aDsgZGVwdGgrKykge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB0cnVlO1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIGJyZWFrO1xuICAgICAgdmFsdWUgPSBuYXRpdmVHZXQodmFsdWUsIFtrZXlTZWdzW2RlcHRoXV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBjbGFzcyBMb2dNb2RlbCB7XG4gIHJlYWRvbmx5IGluZGV4OiBXcml0ZXJJbmRleDtcbiAgcHJpdmF0ZSByZWFkb25seSByb290cyA9IG5ldyBNYXA8c3RyaW5nLCBSb290Um93cz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBoaXN0b3JpZXMgPSBuZXcgTWFwPHN0cmluZywgUm9vdEhpc3Rvcnk+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hhbmdlc0J5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcltdPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHdyaXRlcnNCeUtleSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKTtcblxuICBjb25zdHJ1Y3RvcihyZWFkb25seSBsb2c6IHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdKSB7XG4gICAgdGhpcy5pbmRleCA9IGJ1aWxkV3JpdGVySW5kZXgobG9nKTtcbiAgICBmb3IgKGNvbnN0IGJ1bmRsZSBvZiBsb2cpIHF1ZXJ5V29yay51bml0cyArPSBidW5kbGUudHJhY2UubGVuZ3RoO1xuICB9XG5cbiAgLy8g4pSA4pSAIHJvd3Mg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgcHJpdmF0ZSByb290Um93cyhyb290OiBzdHJpbmcpOiBSb290Um93cyB7XG4gICAgbGV0IGVudHJ5ID0gdGhpcy5yb290cy5nZXQocm9vdCk7XG4gICAgaWYgKGVudHJ5ICE9PSB1bmRlZmluZWQpIHJldHVybiBlbnRyeTtcbiAgICBjb25zdCBub2RlID0gdGhpcy5pbmRleC5yb290cy5nZXQocm9vdCk7XG4gICAgY29uc3Qgcm93czogVG91Y2hbXSA9IFtdO1xuICAgIGxldCByZWZ1c2VkOiBVbmtub3duVmVyYkVycm9yIHwgdW5kZWZpbmVkO1xuICAgIGxldCByZWZ1c2VkQXQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gICAgaWYgKG5vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChjb25zdCBjIG9mIHN1YnRyZWVQb3NpdGlvbnMobm9kZSkpIHtcbiAgICAgICAgY29uc3QgdHJhY2UgPSB0aGlzLmxvZ1tjXS50cmFjZTtcbiAgICAgICAgcXVlcnlXb3JrLnVuaXRzICs9IHRyYWNlLmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgdHJhY2UubGVuZ3RoICYmIHJlZnVzZWQgPT09IHVuZGVmaW5lZDsgcm93KyspIHtcbiAgICAgICAgICBjb25zdCB7IHBhdGgsIHZlcmIgfSA9IHRyYWNlW3Jvd107XG4gICAgICAgICAgaWYgKHBhdGggIT09IHJvb3QgJiYgcmVsYXRpb24ocGF0aCwgcm9vdCkgIT09ICdpbnNpZGUnKSBjb250aW51ZTtcbiAgICAgICAgICBpZiAoIWlzVmVyYih2ZXJiKSkge1xuICAgICAgICAgICAgcmVmdXNlZCA9IG5ldyBVbmtub3duVmVyYkVycm9yKHZlcmIsIHsgcGF0aCwgcm93LCBjb21taXQ6IGMgfSk7XG4gICAgICAgICAgICByZWZ1c2VkQXQgPSBjO1xuICAgICAgICAgICAgLy8gdGhlIHJlZnVzZWQgY29tbWl0IGFuZCBldmVyeXRoaW5nIGFmdGVyIGl0IGFyZSBsZWZ0IG91dDogYW4gYW5zd2VyIHRoYXQgcmVhY2hlcyB0aGVtIGlzIHJlZnVzZWRcbiAgICAgICAgICAgIHdoaWxlIChyb3dzLmxlbmd0aCA+IDAgJiYgcm93c1tyb3dzLmxlbmd0aCAtIDFdLmNvbW1pdElkeCA9PT0gYykgcm93cy5wb3AoKTtcbiAgICAgICAgICB9IGVsc2Ugcm93cy5wdXNoKHsgdmVyYiwgYnVuZGxlOiB0aGlzLmxvZ1tjXSwgY29tbWl0SWR4OiBjIGFzIENvbW1pdElkeCwgcGF0aCB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVmdXNlZCAhPT0gdW5kZWZpbmVkKSBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgZW50cnkgPSB7IHJvd3MsIC4uLihyZWZ1c2VkICE9PSB1bmRlZmluZWQgJiYgeyByZWZ1c2VkIH0pLCByZWZ1c2VkQXQgfTtcbiAgICB0aGlzLnJvb3RzLnNldChyb290LCBlbnRyeSk7XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgLyoqIFJlZnVzZSBhbiBhbnN3ZXIgdGhhdCByZWFjaGVzIGEgcm93IHdob3NlIHZlcmIgdGhlIGxhdyBkb2VzIG5vdCBrbm93IChvbmUgaW4gY29tbWl0cyBgYWZ0ZXJgIDwgYyDiiaQgYGVuZGApLiAqL1xuICBwcml2YXRlIHJlZnVzZVRocm91Z2gocm9vdDogc3RyaW5nLCBlbmQ6IG51bWJlciwgYWZ0ZXIgPSAtMSk6IFJvb3RSb3dzIHtcbiAgICBjb25zdCByciA9IHRoaXMucm9vdFJvd3Mocm9vdCk7XG4gICAgaWYgKHJyLnJlZnVzZWQgIT09IHVuZGVmaW5lZCAmJiByci5yZWZ1c2VkQXQgPD0gZW5kICYmIHJyLnJlZnVzZWRBdCA+IGFmdGVyKSB0aHJvdyByci5yZWZ1c2VkO1xuICAgIHJldHVybiBycjtcbiAgfVxuXG4gIC8qKiBFdmVyeSByb3cgdW5kZXIgYGtleWAncyB0b3AtbGV2ZWwga2V5IHVwIHRvIGBlbmRgLCB3aXRoIGl0cyByZWxhdGlvbiB0byBga2V5YCDigJQgdGhyb3VnaCB0aGUgaW5kZXguICovXG4gIHJvd3NVbmRlclJvb3Qoa2V5OiBzdHJpbmcsIGVuZDogbnVtYmVyKTogVG91Y2hbXSB7XG4gICAgY29uc3QgcnIgPSB0aGlzLnJlZnVzZVRocm91Z2gocm9vdE9mKGtleSksIGVuZCk7XG4gICAgY29uc3Qgb3V0OiBUb3VjaFtdID0gW107XG4gICAgZm9yIChjb25zdCB0IG9mIHJyLnJvd3MpIHtcbiAgICAgIGlmICh0LmNvbW1pdElkeCA+IGVuZCkgYnJlYWs7XG4gICAgICBjb25zdCByID0gcmVsYXRpb24odC5wYXRoLCBrZXkpO1xuICAgICAgb3V0LnB1c2gociA9PT0gdW5kZWZpbmVkID8gdCA6IHsgLi4udCwgcmVsYXRpb246IHIgfSk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvLyDilIDilIAgdGhlIHJvb3QgZm9sZCwgb25jZSBwZXIgdG9wLWxldmVsIGtleSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBwcml2YXRlIGhpc3Rvcnkocm9vdDogc3RyaW5nKTogUm9vdEhpc3Rvcnkge1xuICAgIGxldCBoID0gdGhpcy5oaXN0b3JpZXMuZ2V0KHJvb3QpO1xuICAgIGlmIChoICE9PSB1bmRlZmluZWQpIHJldHVybiBoO1xuICAgIGNvbnN0IGtlcHQgPSBuZXcgTWFwPG51bWJlciwgeyBiZWZvcmU6IHVua25vd247IGFmdGVyOiB1bmtub3duIH0+KCk7XG4gICAgY29uc3QgcmVwbGFjZWQgPSBuZXcgTWFwPFBhdGhOb2RlLCBudW1iZXJbXT4oKTtcbiAgICBjb25zdCByciA9IHRoaXMucm9vdFJvd3Mocm9vdCk7XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IHJyLnJvd3MubGVuZ3RoO1xuICAgIGZvbGRLZXkocnIucm93cywgW3Jvb3RdLCB7XG4gICAgICBnZW5lcmF0aW9uczoge1xuICAgICAgICBhdDogKGMsIHN0YXRlKSA9PiB7XG4gICAgICAgICAgbGV0IGtlZXAgPSBmYWxzZTtcbiAgICAgICAgICBxdWVyeVdvcmsudW5pdHMgKz0gdGhpcy5sb2dbY10udHJhY2UubGVuZ3RoO1xuICAgICAgICAgIGZvciAoY29uc3QgdCBvZiB0aGlzLmxvZ1tjXS50cmFjZSkge1xuICAgICAgICAgICAgaWYgKHQucGF0aCAhPT0gcm9vdCAmJiByZWxhdGlvbih0LnBhdGgsIHJvb3QpICE9PSAnaW5zaWRlJykgY29udGludWU7XG4gICAgICAgICAgICBpZiAoKG5vZGVBdCh0aGlzLmluZGV4LCB0LnBhdGgpPy5jaGlsZHJlbi5zaXplID8/IDApID4gMCkga2VlcCA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCBzZWdzID0gdC5wYXRoLnNwbGl0KERFTElNKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAxOyBqIDwgc2Vncy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIG5hdGl2ZUdldChzdGF0ZSwgc2Vncy5zbGljZSgwLCBqKSkgIT09ICdzdHJpbmcnKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gbm9kZUF0KHRoaXMuaW5kZXgsIHNlZ3Muc2xpY2UoMCwgaikuam9pbihERUxJTSkpO1xuICAgICAgICAgICAgICBpZiAoY29udGFpbmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0ID0gcmVwbGFjZWQuZ2V0KGNvbnRhaW5lcikgPz8gW107XG4gICAgICAgICAgICAgICAgaWYgKGxpc3RbbGlzdC5sZW5ndGggLSAxXSAhPT0gYykgbGlzdC5wdXNoKGMpO1xuICAgICAgICAgICAgICAgIHJlcGxhY2VkLnNldChjb250YWluZXIsIGxpc3QpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGtlZXAgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ga2VlcDtcbiAgICAgICAgfSxcbiAgICAgICAga2VlcDogKGMsIGJlZm9yZSwgYWZ0ZXIpID0+IHtcbiAgICAgICAgICBrZXB0LnNldChjLCB7IGJlZm9yZSwgYWZ0ZXIgfSk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGggPSB7IGtlcHQsIGtlcHRBdDogWy4uLmtlcHQua2V5cygpXS5zb3J0KChhLCBiKSA9PiBhIC0gYiksIHJlcGxhY2VkIH07XG4gICAgdGhpcy5oaXN0b3JpZXMuc2V0KHJvb3QsIGgpO1xuICAgIHJldHVybiBoO1xuICB9XG5cbiAgLyoqIEEga2V5IG5ldmVyIHdyaXR0ZW4sIHVuZGVyIGEgY29udGFpbmVyIG9ubHkgZXZlciB3cml0dGVuIHdob2xlOiBubyBnZW5lcmF0aW9uIGlzIGtlcHQgZm9yIGl0LiAqL1xuICBwcml2YXRlIG5lZWRzT3duRm9sZChrZXk6IHN0cmluZywgYW5jZXN0b3JzOiByZWFkb25seSBQYXRoTm9kZVtdKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG5vZGVBdCh0aGlzLmluZGV4LCBrZXkpID09PSB1bmRlZmluZWQgJiYgYW5jZXN0b3JzW2FuY2VzdG9ycy5sZW5ndGggLSAxXS5jaGlsZHJlbi5zaXplID09PSAwO1xuICB9XG5cbiAgLyoqIEV2ZXJ5IGNvbW1pdCBhY3Jvc3Mgd2hpY2ggdGhlIHZhbHVlIGF0IGBrZXlgIGNoYW5nZWQg4oCUIG9uZSBmb2xkIGZvciB0aGlzIGtleSAodGhlIGZhbGxiYWNrIHNoYXBlKS4gKi9cbiAgcHJpdmF0ZSBvd25DaGFuZ2VzKGtleTogc3RyaW5nKTogbnVtYmVyW10ge1xuICAgIGxldCBjaGFuZ2VzID0gdGhpcy5jaGFuZ2VzQnlLZXkuZ2V0KGtleSk7XG4gICAgaWYgKGNoYW5nZXMgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGNoYW5nZXM7XG4gICAgY29uc3Qgc2VncyA9IGtleS5zcGxpdChERUxJTSk7XG4gICAgY29uc3QgdmVyZGljdCA9IG5ldyBNYXA8bnVtYmVyLCBib29sZWFuPigpO1xuICAgIGxldCBjb21taXQgPSAtMTtcbiAgICBsZXQgc3RhcnQ6IHVua25vd247XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IHRoaXMucm9vdFJvd3Moc2Vnc1swXSkucm93cy5sZW5ndGg7XG4gICAgZm9sZEtleSh0aGlzLnJvb3RSb3dzKHNlZ3NbMF0pLnJvd3MsIHNlZ3MsIHtcbiAgICAgIGV2ZXJ5Um93OiB0cnVlLFxuICAgICAgb2JzZXJ2ZTogKHRvdWNoLCBiZWZvcmUsIGFmdGVyKSA9PiB7XG4gICAgICAgIGlmICh0b3VjaC5jb21taXRJZHggIT09IGNvbW1pdCkge1xuICAgICAgICAgIGNvbW1pdCA9IHRvdWNoLmNvbW1pdElkeDtcbiAgICAgICAgICBzdGFydCA9IGJlZm9yZTtcbiAgICAgICAgfVxuICAgICAgICB2ZXJkaWN0LnNldChjb21taXQsICFkZWVwRXF1YWwoc3RhcnQsIGFmdGVyLCAnY29waWVzJykpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICBjaGFuZ2VzID0gWy4uLnZlcmRpY3RdLmZpbHRlcigoWywgY2hhbmdlZF0pID0+IGNoYW5nZWQpLm1hcCgoW2NdKSA9PiBjKTtcbiAgICB0aGlzLmNoYW5nZXNCeUtleS5zZXQoa2V5LCBjaGFuZ2VzKTtcbiAgICByZXR1cm4gY2hhbmdlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29tbWl0cyBpbiB0aGUgT1BFTiByYW5nZSAoYGFmdGVyYCwgYGJlZm9yZWApIHdpdGggbm8gcm93IG9uIG9yIGluc2lkZSBga2V5YCBhY3Jvc3Mgd2hpY2ggdGhlIHZhbHVlXG4gICAqIGF0IGBrZXlgIGNoYW5nZWQg4oCUIHRoZSBBUk9VTkQgaGFsZiBvZiB0aGUgd3JpdGVyIHJ1bGUgKGFuZCB0aGUgc3RyaW5nLWNvbnRhaW5lciBjYXNlIGJlc2lkZSBpdCkuXG4gICAqL1xuICBwcml2YXRlIGNoYW5nZWRBcm91bmQoa2V5OiBzdHJpbmcsIGFmdGVyOiBudW1iZXIsIGJlZm9yZTogbnVtYmVyKTogcmVhZG9ubHkgbnVtYmVyW10ge1xuICAgIGNvbnN0IGFuY2VzdG9ycyA9IGFuY2VzdG9yTm9kZXModGhpcy5pbmRleCwga2V5KTtcbiAgICBpZiAoYW5jZXN0b3JzLmxlbmd0aCA9PT0gMCB8fCBhbmNlc3RvcnMuZXZlcnkoKGEpID0+IGEucG9zaXRpb25zLmxlbmd0aCA9PT0gMCkpIHJldHVybiBbXTtcbiAgICBjb25zdCByb290ID0gYW5jZXN0b3JzWzBdLnBhdGg7XG4gICAgLy8gVGhlIGFuc3dlciByZWFkcyB0aGUgcm93cyBvZiB0aGUgd2luZG93OiByZWZ1c2UgaXQgd2hlbiBvbmUgb2YgdGhlbSBpcyBhIHZlcmIgdGhlIGxhdyBkb2VzIG5vdCBrbm93LlxuICAgIHRoaXMucmVmdXNlVGhyb3VnaChyb290LCBiZWZvcmUgLSAxLCBhZnRlcik7XG4gICAgaWYgKHRoaXMubmVlZHNPd25Gb2xkKGtleSwgYW5jZXN0b3JzKSkgcmV0dXJuIGJldHdlZW4odGhpcy5vd25DaGFuZ2VzKGtleSksIGFmdGVyLCBiZWZvcmUpO1xuICAgIGNvbnN0IGggPSB0aGlzLmhpc3Rvcnkocm9vdCk7XG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IGFzY2VuZGluZ1VuaW9uKFtcbiAgICAgIC4uLmFuY2VzdG9ycy5tYXAoKGEpID0+IGJldHdlZW4oYS5wb3NpdGlvbnMsIGFmdGVyLCBiZWZvcmUpKSxcbiAgICAgIC4uLmFuY2VzdG9ycy5tYXAoKGEpID0+IGJldHdlZW4oaC5yZXBsYWNlZC5nZXQoYSkgPz8gW10sIGFmdGVyLCBiZWZvcmUpKSxcbiAgICBdKTtcbiAgICBjb25zdCByZXN0ID0ga2V5LnNwbGl0KERFTElNKS5zbGljZSgxKTtcbiAgICBxdWVyeVdvcmsudW5pdHMgKz0gY2FuZGlkYXRlcy5sZW5ndGg7XG4gICAgcmV0dXJuIGNhbmRpZGF0ZXMuZmlsdGVyKChjKSA9PiB7XG4gICAgICBjb25zdCBnID0gaC5rZXB0LmdldChjKTtcbiAgICAgIHJldHVybiBnICE9PSB1bmRlZmluZWQgJiYgIWRlZXBFcXVhbChuYXRpdmVHZXQoZy5iZWZvcmUsIHJlc3QpLCBuYXRpdmVHZXQoZy5hZnRlciwgcmVzdCksICdjb3BpZXMnKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCB0aGUgd3JpdGVyIHJ1bGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqIEV2ZXJ5IGNvbW1pdCB0aGF0IFdST1RFIGBrZXlgLCBhc2NlbmRpbmcgKG1lbW9pc2VkIHBlciBrZXkpLiAqL1xuICB3cml0ZXJzT2Yoa2V5OiBzdHJpbmcpOiByZWFkb25seSBudW1iZXJbXSB7XG4gICAgbGV0IHdyaXRlcnMgPSB0aGlzLndyaXRlcnNCeUtleS5nZXQoa2V5KTtcbiAgICBpZiAod3JpdGVycyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gd3JpdGVycztcbiAgICBjb25zdCBub2RlID0gbm9kZUF0KHRoaXMuaW5kZXgsIGtleSk7XG4gICAgY29uc3QgYXRPckluc2lkZSA9IG5vZGUgPT09IHVuZGVmaW5lZCA/IFtdIDogc3VidHJlZVBvc2l0aW9ucyhub2RlKTtcbiAgICBjb25zdCBhcm91bmQgPSB0aGlzLmNoYW5nZWRBcm91bmQoa2V5LCAtMSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtcbiAgICB3cml0ZXJzID0gYXJvdW5kLmxlbmd0aCA9PT0gMCA/IGF0T3JJbnNpZGUuc2xpY2UoKSA6IGFzY2VuZGluZ1VuaW9uKFthdE9ySW5zaWRlLCBhcm91bmRdKTtcbiAgICB0aGlzLndyaXRlcnNCeUtleS5zZXQoa2V5LCB3cml0ZXJzKTtcbiAgICByZXR1cm4gd3JpdGVycztcbiAgfVxuXG4gIC8qKiBUaGUgQVJSQVkgcG9zaXRpb24gb2YgdGhlIGxhc3QgY29tbWl0IGJlZm9yZSBgYmVmb3JlYCB0aGF0IHdyb3RlIGBrZXlgLCBvciAtMS4gKi9cbiAgbGFzdFdyaXRlckJlZm9yZShrZXk6IHN0cmluZywgYmVmb3JlOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHF1ZXJ5V29yay51bml0cyArPSAxO1xuICAgIGNvbnN0IG5vZGUgPSBub2RlQXQodGhpcy5pbmRleCwga2V5KTtcbiAgICBjb25zdCBsYXN0QUkgPSBub2RlID09PSB1bmRlZmluZWQgPyAtMSA6IGxhc3RCZWZvcmUoc3VidHJlZVBvc2l0aW9ucyhub2RlKSwgYmVmb3JlKTtcbiAgICBjb25zdCBhbmNlc3RvcnMgPSBhbmNlc3Rvck5vZGVzKHRoaXMuaW5kZXgsIGtleSk7XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IGFuY2VzdG9ycy5sZW5ndGg7IC8vIHRoZSBzY2FucyBvdmVyIHRoZW0gYmVsb3dcbiAgICBpZiAoYW5jZXN0b3JzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGxhc3RBSTtcbiAgICAvLyBBIHJvdyBhcm91bmQgdGhlIGtleSBpbiB0aGUgbGFzdCB3cml0ZSdzIE9XTiBjb21taXQgY291bnRzIHdoZW4gaXQgY2FuIGxlYXZlIGEgc3RyaW5nIGNvbnRhaW5lciBhYm92ZVxuICAgIC8vIHRoZSBrZXkgKGEgbGF0ZXIgd3JpdGUgYmVzaWRlIHRoZSBrZXkgdGhlbiByZXBsYWNlcyBpdCkuXG4gICAgY29uc3QgYXJvdW5kSW5XaW5kb3cgPVxuICAgICAgYW5jZXN0b3JzLnNvbWUoKGEpID0+IGJldHdlZW4oYS5wb3NpdGlvbnMsIGxhc3RBSSwgYmVmb3JlKS5sZW5ndGggPiAwKSB8fFxuICAgICAgKGxhc3RBSSAhPT0gLTEgJiYgbGVhdmVzU3RyaW5nQWJvdmUodGhpcy5sb2dbbGFzdEFJXSwga2V5KSk7XG4gICAgLy8gQSBgZGVsZXRlYCBjYW5ub3QgcmVwbGFjZSBhIHN0cmluZyBjb250YWluZXIsIHNvIGEgY2hhcmFjdGVyIHJlYWQgdGhyb3VnaCBvbmUgY2FuIHN0aWxsIG1vdmUgYWZ0ZXIgaXQuXG4gICAgY29uc3QgZGVsZXRlT25seSA9IGxhc3RBSSAhPT0gLTEgJiYgIXdyaXRlc0F0T3JJbnNpZGUodGhpcy5sb2dbbGFzdEFJXSwga2V5KTtcbiAgICBpZiAoIWFyb3VuZEluV2luZG93ICYmICEoZGVsZXRlT25seSAmJiBhbmNlc3RvcnMuc29tZSgoYSkgPT4gYS5wb3NpdGlvbnMubGVuZ3RoID4gMCkpKSByZXR1cm4gbGFzdEFJO1xuICAgIGNvbnN0IGNoYW5nZWQgPSB0aGlzLmNoYW5nZWRBcm91bmQoa2V5LCBsYXN0QUksIGJlZm9yZSk7XG4gICAgcmV0dXJuIGNoYW5nZWQubGVuZ3RoID4gMCA/IGNoYW5nZWRbY2hhbmdlZC5sZW5ndGggLSAxXSA6IGxhc3RBSTtcbiAgfVxuXG4gIC8vIOKUgOKUgCB0aGUgdmFsdWUgcnVsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIGBrZXlgIGFmdGVyIGNvbW1pdCBgaWR4YCAoaW5jbHVzaXZlKS4gVGhlIGZvbGQgb2YgdGhlIHJvd3MgdW5kZXIgaXRzIHRvcC1sZXZlbCBrZXkg4oCUIGJ1dFxuICAgKiB3aGVuIGl0cyBsYXN0IHRvdGFsIHJvdyB1cCB0byBgaWR4YCBpcyBhIGBzZXRgIE9OIHRoZSBrZXkgYW5kIG5vdGhpbmcgYXJvdW5kIGl0IHdhcyB3cml0dGVuIHNpbmNlLCBvbmx5XG4gICAqIHRoZSByb3dzIG9uIGFuZCBpbnNpZGUgdGhlIGtleSBmcm9tIHRoYXQgYHNldGAgb24gY2FuIG1vdmUgaXQsIGFuZCBvbmx5IHRoZXkgYXJlIGZvbGRlZC5cbiAgICovXG4gIHZhbHVlQXQoa2V5OiBzdHJpbmcsIGlkeDogbnVtYmVyKTogdW5rbm93biB7XG4gICAgY29uc3Qgc2VncyA9IGtleS5zcGxpdChERUxJTSk7XG4gICAgdGhpcy5yZWZ1c2VUaHJvdWdoKHNlZ3NbMF0sIGlkeCk7XG4gICAgY29uc3Qgbm9kZSA9IG5vZGVBdCh0aGlzLmluZGV4LCBrZXkpO1xuICAgIGNvbnN0IGFuY2VzdG9ycyA9IGFuY2VzdG9yTm9kZXModGhpcy5pbmRleCwga2V5KTtcbiAgICBpZiAobm9kZSA9PT0gdW5kZWZpbmVkICYmIGFuY2VzdG9ycy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKG5vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgYW5jaG9yID0gbGFzdEJlZm9yZShub2RlLnRvdGFscywgaWR4ICsgMSk7XG4gICAgICBpZiAoXG4gICAgICAgIGFuY2hvciAhPT0gLTEgJiZcbiAgICAgICAgbGFzdFRvdGFsSXNTZXQodGhpcy5sb2dbYW5jaG9yXSwga2V5KSAmJlxuICAgICAgICBhbmNlc3RvcnMuZXZlcnkoKGEpID0+IGJldHdlZW4oYS5wb3NpdGlvbnMsIGFuY2hvciAtIDEsIGlkeCArIDEpLmxlbmd0aCA9PT0gMClcbiAgICAgICkge1xuICAgICAgICBjb25zdCByb3dzOiBUb3VjaFtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgYyBvZiBiZXR3ZWVuKHN1YnRyZWVQb3NpdGlvbnMobm9kZSksIGFuY2hvciAtIDEsIGlkeCArIDEpKSB7XG4gICAgICAgICAgY29uc3QgdHJhY2UgPSB0aGlzLmxvZ1tjXS50cmFjZTtcbiAgICAgICAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCB0cmFjZS5sZW5ndGg7IHJvdysrKSB7XG4gICAgICAgICAgICBjb25zdCByID0gcmVsYXRpb24odHJhY2Vbcm93XS5wYXRoLCBrZXkpO1xuICAgICAgICAgICAgaWYgKHIgPT09ICdleGFjdCcgfHwgciA9PT0gJ2luc2lkZScpIHtcbiAgICAgICAgICAgICAgcm93cy5wdXNoKHtcbiAgICAgICAgICAgICAgICB2ZXJiOiB0cmFjZVtyb3ddLnZlcmIgYXMgVG91Y2hbJ3ZlcmInXSxcbiAgICAgICAgICAgICAgICBidW5kbGU6IHRoaXMubG9nW2NdLFxuICAgICAgICAgICAgICAgIGNvbW1pdElkeDogYyBhcyBDb21taXRJZHgsXG4gICAgICAgICAgICAgICAgcGF0aDogdHJhY2Vbcm93XS5wYXRoLFxuICAgICAgICAgICAgICAgIHJlbGF0aW9uOiByLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVlcnlXb3JrLnVuaXRzICs9IHJvd3MubGVuZ3RoO1xuICAgICAgICByZXR1cm4gZm9sZEtleShyb3dzLCBzZWdzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgcm93cyA9IHRoaXMucm93c1VuZGVyUm9vdChrZXksIGlkeCk7XG4gICAgcXVlcnlXb3JrLnVuaXRzICs9IHJvd3MubGVuZ3RoO1xuICAgIGlmICghcm93cy5zb21lKChyb3cpID0+IHJvdy5yZWxhdGlvbiAhPT0gdW5kZWZpbmVkKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAvLyBBIG1lbW9pc2VkIG1vZGVsIGZvbGRzIGZyb20gdGhlIGxhc3QgZ2VuZXJhdGlvbiBpdCBrZWVwcyBhdCBvciBiZWZvcmUgYGlkeGAg4oCUIHRoZSByb3dzIGFmdGVyIGl0IG9ubHkuXG4gICAgaWYgKE1PREVMUy5nZXQodGhpcy5sb2cpID09PSB0aGlzKSB7XG4gICAgICBjb25zdCBoID0gdGhpcy5oaXN0b3J5KHNlZ3NbMF0pO1xuICAgICAgY29uc3Qga2VwdCA9IGxhc3RCZWZvcmUoaC5rZXB0QXQsIGlkeCArIDEpO1xuICAgICAgaWYgKGtlcHQgIT09IC0xKSB7XG4gICAgICAgIGNvbnN0IGFmdGVyID0gcm93cy5maWx0ZXIoKHJvdykgPT4gcm93LmNvbW1pdElkeCA+IGtlcHQpO1xuICAgICAgICAvLyBGb2xkZWQgRlJPTSB0aGUga2VwdCBnZW5lcmF0aW9uLCB0aGUgYW5zd2VyIGNhbiBCRSBpdCAobm8gcm93IGFmdGVyIGl0KSBvciBzaGFyZSBpdHMgcGFydHMsIGFuZFxuICAgICAgICAvLyB0aGUgbWVtbyBhbnN3ZXJzIGV2ZXJ5IGxhdGVyIHF1ZXN0aW9uOiBkZXRhY2ggaXQsIGFzIHRoZSB2YWx1ZSBydWxlIHByb21pc2VzICh1bnRpbCA5LjQ0LjIgYW5cbiAgICAgICAgLy8gZWRpdCBvZiBvbmUgYW5zd2VyIGNoYW5nZWQgdGhlIG5leHQpLlxuICAgICAgICByZXR1cm4gZGV0YWNoZWQoZm9sZEtleShhZnRlciwgc2VncywgeyBhbmNob3JlZDogdHJ1ZSwgc3RhcnQ6IGgua2VwdC5nZXQoa2VwdCk/LmFmdGVyIH0pKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvbGRLZXkocm93cywgc2VncywgeyBhbmNob3JlZDogdHJ1ZSB9KTtcbiAgfVxufVxuXG4vKiogQSB2YWx1ZSB0aGUgY2FsbGVyIG93bnM6IGEgY29udGFpbmVyIGlzIGNsb25lZCwgYSBwcmltaXRpdmUgaXMgaXRzZWxmLiAqL1xuZnVuY3Rpb24gZGV0YWNoZWQodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgPyBzdHJ1Y3R1cmVkQ2xvbmUodmFsdWUpIDogdmFsdWU7XG59XG5cbi8qKiBJcyB0aGUgbGFzdCBgc2V0YCAvIGBkZWxldGVgIHJvdyBPTiBga2V5YCBpbiB0aGlzIGNvbW1pdCBhIGBzZXRgPyAqL1xuZnVuY3Rpb24gbGFzdFRvdGFsSXNTZXQoYnVuZGxlOiBDb21taXRCdW5kbGUsIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGkgPSBidW5kbGUudHJhY2UubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCB0ID0gYnVuZGxlLnRyYWNlW2ldO1xuICAgIGlmICh0LnBhdGggPT09IGtleSAmJiAodC52ZXJiID09PSAnc2V0JyB8fCB0LnZlcmIgPT09ICdkZWxldGUnKSkgcmV0dXJuIHQudmVyYiA9PT0gJ3NldCc7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuIl19
@@ -402,8 +402,29 @@ export declare function useWalkLimit(limit: number): () => void;
402
402
  * inside one segment — and an ancestor whose NAME matches is masked whole
403
403
  * before the walk goes below it, so the name decides. Conservative: `true`
404
404
  * whenever in doubt.
405
+ *
406
+ * Linear in the length of `pattern.source`: every scan here is one forward
407
+ * pass ({@link classBodies}) or a regex that does constant work per position.
405
408
  */
406
409
  export declare function needsPath(pattern: RegExp): boolean;
410
+ /**
411
+ * The body of each character class in `source`, left to right: the text
412
+ * between a `[` and the first `]` after it that no `\` escapes (a `\` takes
413
+ * the character after it along). ONE forward pass.
414
+ *
415
+ * It replaces `source.matchAll(/\[((?:\\[\s\S]|[^\]\\])*)\]/g)` and gives the
416
+ * same bodies for every string (pinned against that regex as the control,
417
+ * test/lib/memory/security/needs-path-linear.security.test.ts). The regex was
418
+ * quadratic: after a `[` that never closed it retried at every later `[`,
419
+ * each retry rescanning to the end — `\[` repeated 32,000 times took 0.7 s,
420
+ * and `setPolicy` runs once per stage's scope (CodeQL js/polynomial-redos).
421
+ * The pass stops at the first `[` that never closes instead: a later `[`
422
+ * starts its body where the failed scan was also between two tokens, so it
423
+ * reads the same tail the same way and closes nowhere either.
424
+ *
425
+ * @internal Exported for that test only — not on any public door.
426
+ */
427
+ export declare function classBodies(source: string): string[];
407
428
  /**
408
429
  * THE TAINT RULE at a subflow mapper boundary (an `inputMapper` seeding a
409
430
  * subflow, an `outputMapper` merging it back): a key the mapper writes