footprintjs 10.2.1 → 10.4.0

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 (131) hide show
  1. package/dist/esm/index.d.ts +3 -0
  2. package/dist/esm/index.js +1 -1
  3. package/dist/esm/lib/capture/absentEntries.d.ts +7 -0
  4. package/dist/esm/lib/capture/absentEntries.js +81 -0
  5. package/dist/esm/lib/capture/checkpointCapture.d.ts +11 -0
  6. package/dist/esm/lib/capture/checkpointCapture.js +104 -0
  7. package/dist/esm/lib/capture/historyData.d.ts +9 -0
  8. package/dist/esm/lib/capture/historyData.js +79 -0
  9. package/dist/esm/lib/capture/historyNote.d.ts +4 -0
  10. package/dist/esm/lib/capture/historyNote.js +52 -0
  11. package/dist/esm/lib/capture/historyTarget.d.ts +5 -0
  12. package/dist/esm/lib/capture/historyTarget.js +35 -0
  13. package/dist/esm/lib/capture/historyTypes.d.ts +39 -0
  14. package/dist/esm/lib/capture/historyTypes.js +4 -0
  15. package/dist/esm/lib/capture/nativeCoverage.d.ts +69 -0
  16. package/dist/esm/lib/capture/nativeCoverage.js +140 -0
  17. package/dist/esm/lib/capture/noteShape.d.ts +10 -0
  18. package/dist/esm/lib/capture/noteShape.js +93 -0
  19. package/dist/esm/lib/capture/readSources.d.ts +43 -0
  20. package/dist/esm/lib/capture/readSources.js +78 -0
  21. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +5 -2
  22. package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +1 -0
  23. package/dist/esm/lib/engine/types.d.ts +3 -0
  24. package/dist/esm/lib/engine/types.js +1 -1
  25. package/dist/esm/lib/memory/StageContext.d.ts +13 -0
  26. package/dist/esm/lib/memory/StageContext.js +110 -14
  27. package/dist/esm/lib/memory/attention.d.ts +2 -0
  28. package/dist/esm/lib/memory/attention.js +12 -5
  29. package/dist/esm/lib/memory/runPolicy.d.ts +5 -1
  30. package/dist/esm/lib/memory/runPolicy.js +2 -1
  31. package/dist/esm/lib/pause/record.js +8 -2
  32. package/dist/esm/lib/pause/types.d.ts +2 -0
  33. package/dist/esm/lib/pause/types.js +1 -1
  34. package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +12 -1
  35. package/dist/esm/lib/recorder/ControlDepRecorder.js +23 -1
  36. package/dist/esm/lib/recorder/snapshot.d.ts +1 -1
  37. package/dist/esm/lib/recorder/snapshot.js +7 -2
  38. package/dist/esm/lib/runner/ExecutionRuntime.d.ts +24 -1
  39. package/dist/esm/lib/runner/ExecutionRuntime.js +45 -4
  40. package/dist/esm/lib/runner/FlowChartExecutor.d.ts +5 -0
  41. package/dist/esm/lib/runner/FlowChartExecutor.js +74 -7
  42. package/dist/esm/lib/runner/attach.js +6 -2
  43. package/dist/esm/lib/runner/captureHistory.d.ts +8 -0
  44. package/dist/esm/lib/runner/captureHistory.js +106 -0
  45. package/dist/esm/lib/runner/checkpoint.d.ts +2 -0
  46. package/dist/esm/lib/runner/checkpoint.js +3 -1
  47. package/dist/esm/lib/runner/index.d.ts +1 -0
  48. package/dist/esm/lib/runner/index.js +1 -1
  49. package/dist/esm/lib/runner/options.d.ts +3 -0
  50. package/dist/esm/lib/runner/options.js +46 -3
  51. package/dist/esm/lib/runner/readStoredCapture.d.ts +39 -0
  52. package/dist/esm/lib/runner/readStoredCapture.js +36 -0
  53. package/dist/esm/lib/runner/recordSink.d.ts +11 -0
  54. package/dist/esm/lib/runner/recordSink.js +47 -4
  55. package/dist/esm/lib/runner/snapshot.d.ts +3 -1
  56. package/dist/esm/lib/runner/snapshot.js +35 -4
  57. package/dist/esm/lib/runner/storedCaptureAdmission.d.ts +4 -0
  58. package/dist/esm/lib/runner/storedCaptureAdmission.js +97 -0
  59. package/dist/esm/lib/scope/ScopeFacade.js +4 -2
  60. package/dist/esm/lib/scope/runtime.d.ts +2 -0
  61. package/dist/esm/lib/scope/runtime.js +9 -1
  62. package/dist/esm/lib/sinks/fileSink.d.ts +2 -1
  63. package/dist/esm/lib/sinks/fileSink.js +8 -2
  64. package/dist/esm/trace.d.ts +2 -0
  65. package/dist/esm/trace.js +2 -1
  66. package/dist/index.js +1 -1
  67. package/dist/lib/capture/absentEntries.js +86 -0
  68. package/dist/lib/capture/checkpointCapture.js +110 -0
  69. package/dist/lib/capture/historyData.js +85 -0
  70. package/dist/lib/capture/historyNote.js +56 -0
  71. package/dist/lib/capture/historyTarget.js +40 -0
  72. package/dist/lib/capture/historyTypes.js +7 -0
  73. package/dist/lib/capture/nativeCoverage.js +146 -0
  74. package/dist/lib/capture/noteShape.js +103 -0
  75. package/dist/lib/capture/readSources.js +83 -0
  76. package/dist/lib/engine/handlers/SubflowExecutor.js +5 -2
  77. package/dist/lib/engine/types.js +1 -1
  78. package/dist/lib/memory/StageContext.js +110 -14
  79. package/dist/lib/memory/attention.js +12 -5
  80. package/dist/lib/memory/runPolicy.js +2 -1
  81. package/dist/lib/pause/record.js +8 -2
  82. package/dist/lib/pause/types.js +1 -1
  83. package/dist/lib/recorder/ControlDepRecorder.js +23 -1
  84. package/dist/lib/recorder/snapshot.js +7 -2
  85. package/dist/lib/runner/ExecutionRuntime.js +44 -3
  86. package/dist/lib/runner/FlowChartExecutor.js +77 -10
  87. package/dist/lib/runner/attach.js +5 -1
  88. package/dist/lib/runner/captureHistory.js +110 -0
  89. package/dist/lib/runner/checkpoint.js +3 -1
  90. package/dist/lib/runner/index.js +1 -1
  91. package/dist/lib/runner/options.js +46 -3
  92. package/dist/lib/runner/readStoredCapture.js +40 -0
  93. package/dist/lib/runner/recordSink.js +47 -4
  94. package/dist/lib/runner/snapshot.js +35 -4
  95. package/dist/lib/runner/storedCaptureAdmission.js +101 -0
  96. package/dist/lib/scope/ScopeFacade.js +3 -1
  97. package/dist/lib/scope/runtime.js +12 -2
  98. package/dist/lib/sinks/fileSink.js +8 -2
  99. package/dist/trace.js +4 -2
  100. package/dist/types/index.d.ts +3 -0
  101. package/dist/types/lib/capture/absentEntries.d.ts +7 -0
  102. package/dist/types/lib/capture/checkpointCapture.d.ts +11 -0
  103. package/dist/types/lib/capture/historyData.d.ts +9 -0
  104. package/dist/types/lib/capture/historyNote.d.ts +4 -0
  105. package/dist/types/lib/capture/historyTarget.d.ts +5 -0
  106. package/dist/types/lib/capture/historyTypes.d.ts +39 -0
  107. package/dist/types/lib/capture/nativeCoverage.d.ts +69 -0
  108. package/dist/types/lib/capture/noteShape.d.ts +10 -0
  109. package/dist/types/lib/capture/readSources.d.ts +43 -0
  110. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +1 -0
  111. package/dist/types/lib/engine/types.d.ts +3 -0
  112. package/dist/types/lib/memory/StageContext.d.ts +13 -0
  113. package/dist/types/lib/memory/attention.d.ts +2 -0
  114. package/dist/types/lib/memory/runPolicy.d.ts +5 -1
  115. package/dist/types/lib/pause/types.d.ts +2 -0
  116. package/dist/types/lib/recorder/ControlDepRecorder.d.ts +12 -1
  117. package/dist/types/lib/recorder/snapshot.d.ts +1 -1
  118. package/dist/types/lib/runner/ExecutionRuntime.d.ts +24 -1
  119. package/dist/types/lib/runner/FlowChartExecutor.d.ts +5 -0
  120. package/dist/types/lib/runner/captureHistory.d.ts +8 -0
  121. package/dist/types/lib/runner/checkpoint.d.ts +2 -0
  122. package/dist/types/lib/runner/index.d.ts +1 -0
  123. package/dist/types/lib/runner/options.d.ts +3 -0
  124. package/dist/types/lib/runner/readStoredCapture.d.ts +39 -0
  125. package/dist/types/lib/runner/recordSink.d.ts +11 -0
  126. package/dist/types/lib/runner/snapshot.d.ts +3 -1
  127. package/dist/types/lib/runner/storedCaptureAdmission.d.ts +4 -0
  128. package/dist/types/lib/scope/runtime.d.ts +2 -0
  129. package/dist/types/lib/sinks/fileSink.d.ts +2 -1
  130. package/dist/types/trace.d.ts +2 -0
  131. package/package.json +2 -2
@@ -192,7 +192,7 @@ function fileSink(path, options) {
192
192
  });
193
193
  });
194
194
  };
195
- return {
195
+ const adapter = {
196
196
  path: absolute,
197
197
  get bytes() {
198
198
  return written;
@@ -207,6 +207,11 @@ function fileSink(path, options) {
207
207
  commit: ({ address, at, bundle }) => enqueue({ kind: 'commit', address, at, bundle }),
208
208
  note: ({ address, at, kind, data }) => enqueue({ kind: 'note', address, at, note: kind, data }),
209
209
  closed: ({ address, at, outcome, commits, meta }) => enqueue({ kind: 'closed', address, at, outcome, commits, ...(meta === undefined ? {} : { meta }) }),
210
+ // Explicit file capability: fsync of all preceding entries. This is not assumed for other adapters.
211
+ acknowledge: async (target) => {
212
+ await adapter.flush();
213
+ return Object.freeze({ ...target, durability: 'durable' });
214
+ },
210
215
  flush: () => {
211
216
  if (closing)
212
217
  return Promise.reject(new Error(`fileSink: ${absolute} is closed`));
@@ -247,6 +252,7 @@ function fileSink(path, options) {
247
252
  return whenReleased;
248
253
  },
249
254
  };
255
+ return adapter;
250
256
  }
251
257
  exports.fileSink = fileSink;
252
258
  /**
@@ -389,4 +395,4 @@ function readRecordFile(path, options) {
389
395
  return { entries, unreadable };
390
396
  }
391
397
  exports.readRecordFile = readRecordFile;
392
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZVNpbmsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3NpbmtzL2ZpbGVTaW5rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMENHOzs7QUFFSCxxQ0FBMEc7QUFDMUcseUNBQW1EO0FBQ25ELCtDQUFzQztBQUl0QyxnREFBZ0Q7QUFDbkMsUUFBQSwyQkFBMkIsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUM1RCxrREFBa0Q7QUFDckMsUUFBQSxpQ0FBaUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNqRSxxRUFBcUU7QUFDeEQsUUFBQSxrQ0FBa0MsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNuRSw0Q0FBNEM7QUFDL0IsUUFBQSxrQ0FBa0MsR0FBRyxNQUFNLENBQUM7QUFDekQsOEdBQThHO0FBQzlHLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN0Qyx1REFBdUQ7QUFDdkQsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQTBDakQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBQ0gsU0FBZ0IsUUFBUSxDQUFDLElBQVksRUFBRSxPQUF5QjtJQUM5RCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssRUFBRTtRQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsMkNBQTJDLENBQUMsQ0FBQztJQUM5RyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsbUNBQTJCLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEYsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLGVBQWUsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLHlDQUFp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QUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNsQyxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsbUNBQW1DLEVBQUUsQ0FBQyxDQUFDO1lBQ2hGLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFDakMsQ0FBQztBQWhERCx3Q0FnREMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHNpbmtzL2ZpbGVTaW5rLnRzIOKAlCB0aGUgcmVjb3JkLCBvbmUgSlNPTiBsaW5lIHBlciBlbnRyeSwgaW4gYSBmaWxlIChkZXNpZ24gwqczLjUsIMKnNCwgcGFja2V0IFA2KS4gTk9ERSBPTkxZOiB0aGVcbiAqIG9uZSBmaWxlIGluIGBzcmMvYCB0aGF0IGltcG9ydHMgYSBOb2RlIGJ1aWx0LWluLCByZWFjaGFibGUgb25seSB0aHJvdWdoIHRoZSBgZm9vdHByaW50anMvc2lua3NgIGRvb3IuXG4gKlxuICogV0hZIEEgRklMRSwgV0hZIFRISVMgU0hBUEUuIEEgcnVuJ3MgcmVjb3JkIG11c3Qgb3V0bGl2ZSB0aGUgcHJvY2VzcyB0aGF0IG1hZGUgaXQg4oCUIGEga2lsbGVkIHByb2Nlc3MsIGEgY3Jhc2hlZFxuICogaG9zdCwgYSBzZXJ2ZXJsZXNzIGZyZWV6ZS4gRWFjaCBlbnRyeSB0aGUgbG9nIGhhbmRzIG92ZXIgaXMgZW5jb2RlZCwgY2hlY2tlZCBhbmQgZ2l2ZW4gaXRzIG93biBvZmZzZXQgaW4gdGhlIGZpbGUsXG4gKiBhbmQgaXRzIHdyaXRlIGlzIGhhbmRlZCB0byB0aGUgSS9PIHBvb2wgQVQgT05DRSAoYSBwb3NpdGlvbmFsIHdyaXRlIOKAlCBubyBlbnRyeSB3YWl0cyBmb3IgdGhlIGV2ZW50IGxvb3AgdG8gdHVybik7XG4gKiB0aGUgcG9vbCdzIHRocmVhZHMgcGVyZm9ybSB0aGVtIHdoaWxlIHRoZSBtYWluIHRocmVhZCBydW5zIG9uLiBBIHByb2Nlc3Mga2lsbGVkIGFmdGVyIGEgcG9vbCB0aHJlYWQgd3JvdGUgYW4gZW50cnlcbiAqIGtlZXBzIGl0LiBVbnRpbCB0aGVuIGl0IGlzIG5vdCBvbiBkaXNrOiBtaWNyb3NlY29uZHMgb24gYSBmcmVlIHBvb2wsIGJ1dCB0aGUgcG9vbCAoNCB0aHJlYWRzIGJ5IGRlZmF1bHQpIGlzIHNoYXJlZFxuICogd2l0aCBETlMgbG9va3VwcywgemxpYiwgY3J5cHRvIGFuZCBvdGhlciBmcyB3b3JrLCBzbyB3aGlsZSBpdCBpcyBidXN5IHRoZSB3aW5kb3cgaXMgYXMgbG9uZyBhcyB0aGF0IHdvcmsg4oCUIGFuZCBzaW5jZVxuICogd3JpdGVzIGNvbXBsZXRlIG91dCBvZiBvcmRlciwgYSBraWxsIGNhbiBsb3NlIGFuIGVudHJ5IGluIHRoZSBtaWRkbGUgKHRoZSByZWFkZXIgcmVwb3J0cyB0aGUgaG9sZSkuIGBmbHVzaCgpYCB3YWl0cyBmb3IgZXZlcnkgd3JpdGUgYW5kXG4gKiBgZnN5bmNgcyDigJQgdGhlIHN0ZXAgdGhhdCBhbHNvIHN1cnZpdmVzIHRoZSBtYWNoaW5lIGxvc2luZyBwb3dlciwgYW5kIHRoZSBvbmUgdGhlIGV4ZWN1dG9yIGF3YWl0cyBhZnRlciBlYWNoIHJ1bidzXG4gKiBjbG9zaW5nIGVudHJ5LlxuICpcbiAqIFRIRSBUSFJFQVQgTU9ERUwsIGFzIGNvZGUg4oCUIGV2ZXJ5IHJlc291cmNlIGJvdW5kZWQsIG5vdGhpbmcgdGhhdCBjYW4gc3RhbGwgdGhlIHJ1bjpcbiAqICAgLSBPTkxZIFRIRSBQQVRIIFRIRSBBUFAgR0lWRVMuIFJlc29sdmVkIG9uY2UgYW5kIG9wZW5lZCBvbmNlLCBhdCBgZmlsZVNpbmsocGF0aClgOyBldmVyeSBlbnRyeSBnb2VzIHRvIHRoYXQgb3BlblxuICogICAgIGZpbGUuIEEgc3ltYm9saWMgbGluayBhdCB0aGUgcGF0aCBpcyByZWZ1c2VkIChgT19OT0ZPTExPV2AsIHdoZXJlIHRoZSBwbGF0Zm9ybSBoYXMgaXQpLCBhbmQgc28gaXMgYW55dGhpbmdcbiAqICAgICB0aGF0IGlzIG5vdCBhIHJlZ3VsYXIgZmlsZSwgYSBmaWxlIHdpdGggYW5vdGhlciBoYXJkIGxpbmssIGFub3RoZXIgb3duZXIsIG9yIGdyb3VwL3dvcmxkIHdyaXRlLiBBIGZpbGUgdGhlXG4gKiAgICAgc2luayBjcmVhdGVzIGlzIGAwbzYwMGAuXG4gKiAgIC0gQVRPTUlDIFBFUiBFTlRSWS4gQSBsaW5lIGlzIGVuY29kZWQgaW4gZnVsbCBmaXJzdCDigJQgYW4gZW50cnkgSlNPTiBjYW5ub3Qgd3JpdGUgKGEgYEJpZ0ludGAsIGEgY3ljbGUpIGlzXG4gKiAgICAgcmVmdXNlZCB3aG9sZSDigJQgdGhlbiB3cml0dGVuIGF0IGl0cyBvd24gb2Zmc2V0LiBBIHdyaXRlIHRoYXQgZmFpbHMgcGFydC13YXkgbGVhdmVzIGEgaG9sZSB1cCB0byB0aGUgbmV4dFxuICogICAgIGVudHJ5J3Mgb2Zmc2V0OyB0aGUgcmVhZGVyIHNwbGl0cyBhdCBpdCAoTlVMKSwgc28gYSB0b3JuIGxpbmUgbmV2ZXIgc3dhbGxvd3MgdGhlIG9uZSBhZnRlciBpdCAoYW4gZXhpc3RpbmdcbiAqICAgICBmaWxlIHdpdGggYSB0b3JuIHRhaWwgZ2V0cyBhIG5ld2xpbmUgZmlyc3QpLlxuICogICAtIEJPVU5ERUQ6IGBtYXhFbnRyeUJ5dGVzYCAob25lIGxpbmUsIDggTWlCIOKAlCByZWZ1c2VkIGJ5IG5hbWUsIGJlZm9yZSBpdCBpcyBlbmNvZGVkIHdoZW4gaXRzIGxlbmd0aCBhbHJlYWR5XG4gKiAgICAgc2F5cyBzbyksIGBtYXhRdWV1ZWRCeXRlc2AgKGFjY2VwdGVkLCBub3QgeWV0IHdyaXR0ZW4sIDE2IE1pQiDigJQgcGFzdCBpdCBhbiBlbnRyeSBpcyBEUk9QUEVEIGFuZCBjb3VudGVkLCBuZXZlclxuICogICAgIGJ1ZmZlcmVkIHdpdGhvdXQgbGltaXQpLCBgbWF4Qnl0ZXNgICh0aGUgZmlsZSwgNjQgTWlCIOKAlCBvbmNlIGZ1bGwsIGV2ZXJ5IGZ1cnRoZXIgZW50cnkgaXMgcmVmdXNlZCBhbmQgY291bnRlZDtcbiAqICAgICBhIGNsb3NpbmcgZW50cnkgbWF5IHVzZSBhIDY0IEtpQiByZXNlcnZlIHNvIGEgZnVsbCBmaWxlIGNhbiBzdGlsbCBzYXkgaG93IHRoZSBydW4gZW5kZWQpLCBgZmx1c2hUaW1lb3V0TXNgXG4gKiAgICAgKDEwIHMg4oCUIHRoZW4gYGZsdXNoKClgIHJlamVjdHMpLiBFdmVyeSByZWZ1c2FsIHRocm93cyBmcm9tIHRoZSBzaW5rIG1ldGhvZCwgd2hpY2ggdGhlIGxvZyBjb3VudHNcbiAqICAgICAoYGdldFNuYXBzaG90KCkuc2lua2ApOyBhIHdyaXRlIHRoYXQgZmFpbHMgbGF0ZXIgcmVqZWN0cyB0aGF0IGVudHJ5J3MgcHJvbWlzZSwgY291bnRlZCB0aGUgc2FtZSB3YXkuXG4gKiAgIC0gQVNZTkNIUk9OT1VTIFdSSVRFUyBPTkxZLiBObyBtZXRob2QgYmxvY2tzIG9uIHRoZSBkaXNrOyB0aGUgZmlsZSBpcyByZWxlYXNlZCBhc3luY2hyb25vdXNseSwgYWZ0ZXIgZXZlcnlcbiAqICAgICB3cml0ZSBhbmQgZXZlcnkgc3RhcnRlZCBmc3luYy5cbiAqICAgLSBOTyBTRUNSRVQgT04gRElTSyBpcyB0aGUgRVhFQ1VUT1IncyBsYXcsIGFwcGxpZWQgYmVmb3JlIGFueSBlbnRyeSByZWFjaGVzIGFuIGFkYXB0ZXIgKGBydW5uZXIvcmVjb3JkU2luay50c2ApOlxuICogICAgIHRoaXMgZmlsZSB3cml0ZXMgd2hhdCBpdCBpcyBoYW5kZWQgYW5kIHJlYWRzIG5vdGhpbmcgZWxzZS5cbiAqICAgLSBPTkUgV1JJVEVSIFBFUiBGSUxFLiBBIHNlY29uZCBzaW5rIG9uIGEgZmlsZSB0aGlzIHByb2Nlc3MgaGFzIG9wZW4gaXMgcmVmdXNlZCAoYnkgZGV2aWNlIGFuZCBpbm9kZSwgYWNyb3NzIHRoZVxuICogICAgIENvbW1vbkpTIGFuZCBFU00gYnVpbGRzKS4gQU5PVEhFUiBQUk9DRVNTIHdyaXRpbmcgdGhlIHNhbWUgcGF0aCBpcyBub3Qgc2VlbiBhdCBvcGVuOiBlYWNoIHdyaXRlcyBhdCBpdHMgb3duXG4gKiAgICAgb2Zmc2V0cyBhbmQgd291bGQgb3ZlcndyaXRlIHRoZSBvdGhlci4gYGZsdXNoKClgIGNoZWNrcyB0aGUgZmlsZSdzIHNpemUgYWdhaW5zdCB3aGF0IHRoaXMgc2luayBwbGFjZWQgYW5kIHJlamVjdHNcbiAqICAgICAoYSBsb3NzIHRoZSBydW4gY291bnRzKSB3aGVuIGFub3RoZXIgd3JpdGVyJ3MgYnl0ZXMgcmVhY2ggcGFzdCBpdCDigJQgYmVzdCBlZmZvcnQ6IGFuIG92ZXJ3cml0ZSB0aGlzIHNpbmsncyBvd25cbiAqICAgICBsYXRlciB3cml0ZXMgY292ZXIgaXMgbm90IHNlZW4uIEdpdmUgZWFjaCBwcm9jZXNzIGl0cyBvd24gZmlsZS5cbiAqXG4gKiBXSEFUIEpTT04gS0VFUFMuIEEgbGluZSBob2xkcyB3aGF0IGBKU09OLnN0cmluZ2lmeWAga2VlcHM6IGEgYERhdGVgIGJlY29tZXMgaXRzIElTTyBzdHJpbmcsIGEgYE1hcGAgLyBgU2V0YCBhblxuICogZW1wdHkgb2JqZWN0LCBgdW5kZWZpbmVkYCBkaXNhcHBlYXJzLiBBIHJlY29yZCBvZiBwbGFpbiBKU09OIHZhbHVlcyByZWFkcyBiYWNrIGV4YWN0bHkgKGByZWFkUmVjb3JkRmlsZWAg4oaSXG4gKiBgcmVhZFN0b3JlZFJlY29yZGApOyBmb3IgcmljaGVyIHZhbHVlcywgYnJpbmcgYW4gYWRhcHRlciB3aXRoIGEgcmljaGVyIGVuY29kaW5nLlxuICovXG5cbmltcG9ydCB7IGNsb3NlLCBjbG9zZVN5bmMsIGNvbnN0YW50cywgZnN0YXQsIGZzdGF0U3luYywgZnN5bmMsIG9wZW5TeW5jLCByZWFkU3luYywgd3JpdGUgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IHJlc29sdmUgYXMgcmVzb2x2ZVBhdGggfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZ2V0dWlkIH0gZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBSZWNvcmRFbnRyeSwgUmVjb3JkU2luayB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5cbi8qKiBUaGUgZGVmYXVsdCBjYXAgb24gYSByZWNvcmQgZmlsZTogNjQgTWlCLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRklMRV9TSU5LX01BWF9CWVRFUyA9IDY0ICogMTAyNCAqIDEwMjQ7XG4vKiogVGhlIGRlZmF1bHQgY2FwIG9uIE9ORSBlbnRyeSdzIGxpbmU6IDggTWlCLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRklMRV9TSU5LX01BWF9FTlRSWV9CWVRFUyA9IDggKiAxMDI0ICogMTAyNDtcbi8qKiBUaGUgZGVmYXVsdCBjYXAgb24gYnl0ZXMgYWNjZXB0ZWQgYnV0IG5vdCB5ZXQgd3JpdHRlbjogMTYgTWlCLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRklMRV9TSU5LX01BWF9RVUVVRURfQllURVMgPSAxNiAqIDEwMjQgKiAxMDI0O1xuLyoqIFRoZSBkZWZhdWx0IGJvdW5kIG9uIGBmbHVzaCgpYDogMTAgcy4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0ZJTEVfU0lOS19GTFVTSF9USU1FT1VUX01TID0gMTBfMDAwO1xuLyoqIEhvdyBmYXIgcGFzdCBgbWF4Qnl0ZXNgIGEgQ0xPU0lORyBlbnRyeSBtYXkgc3RpbGwgZ28sIHNvIGEgZnVsbCBmaWxlIGNhbiBzYXkgaG93IHRoZSBydW4gZW5kZWQ6IDY0IEtpQi4gKi9cbmNvbnN0IENMT1NFX1JFU0VSVkVfQllURVMgPSA2NCAqIDEwMjQ7XG4vKiogVGhlIGRlZmF1bHQgY2FwIGByZWFkUmVjb3JkRmlsZWAgcmVhZHM6IDI1NiBNaUIuICovXG5jb25zdCBERUZBVUxUX1JFQURfTUFYX0JZVEVTID0gMjU2ICogMTAyNCAqIDEwMjQ7XG5cbi8qKiBgZmlsZVNpbmtgJ3Mgb3B0aW9ucyDigJQgZXZlcnkgcmVzb3VyY2UgdGhlIHNpbmsgY2FuIHNwZW5kLCBib3VuZGVkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWxlU2lua09wdGlvbnMge1xuICAvKipcbiAgICogVGhlIG1vc3QgYnl0ZXMgdGhlIGZpbGUgbWF5IGhvbGQgKHRoZSBieXRlcyBhbHJlYWR5IGluIGl0IGNvdW50KS4gT25jZSBhbiBlbnRyeSB3b3VsZCBwYXNzIGl0LCB0aGUgZmlsZSBpcyBGVUxMOlxuICAgKiB0aGF0IGVudHJ5IGFuZCBldmVyeSBsYXRlciBvbmUgaXMgcmVmdXNlZCBhbmQgY291bnRlZCBieSB0aGUgcnVuLCBuZXZlciB3cml0dGVuIOKAlCBleGNlcHQgYSBjbG9zaW5nIGVudHJ5LCB3aGljaFxuICAgKiBtYXkgdXNlIDY0IEtpQiBtb3JlIHNvIGEgZnVsbCBmaWxlIGNhbiBzdGlsbCBzYXkgaG93IHRoZSBydW4gZW5kZWQuIERlZmF1bHQgNjQgTWlCLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF4Qnl0ZXM/OiBudW1iZXI7XG4gIC8qKiBUaGUgbGFyZ2VzdCBPTkUgZW50cnkncyBsaW5lIG1heSBiZTsgYSBsYXJnZXIgZW50cnkgaXMgcmVmdXNlZCB3aG9sZSAoYG1heEVudHJ5Qnl0ZXNgIG5hbWVkKS4gRGVmYXVsdCA4IE1pQi4gKi9cbiAgcmVhZG9ubHkgbWF4RW50cnlCeXRlcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFRoZSBtb3N0IGJ5dGVzIGFjY2VwdGVkIGFuZCBub3QgeWV0IG9uIGRpc2suIFdyaXRlcyBhcmUgYXN5bmNocm9ub3VzLCBzbyBhIHNpbmsgc2xvd2VyIHRoYW4gdGhlIHJ1biBxdWV1ZXM7IHBhc3RcbiAgICogdGhpcyBib3VuZCBhbiBlbnRyeSBpcyBEUk9QUEVEIGFuZCBjb3VudGVkIChuZXZlciBidWZmZXJlZCB3aXRob3V0IGxpbWl0LCBuZXZlciBhIHN0YWxsKS4gRGVmYXVsdCAxNiBNaUIuXG4gICAqL1xuICByZWFkb25seSBtYXhRdWV1ZWRCeXRlcz86IG51bWJlcjtcbiAgLyoqIEhvdyBsb25nIGBmbHVzaCgpYCAoZHJhaW4gdGhlIHF1ZXVlLCB0aGVuIGBmc3luY2ApIG1heSB0YWtlIGJlZm9yZSBpdCByZWplY3RzLiBEZWZhdWx0IDEwIHMuICovXG4gIHJlYWRvbmx5IGZsdXNoVGltZW91dE1zPzogbnVtYmVyO1xufVxuXG4vKiogQSByZWNvcmQgc2luayB0aGF0IGFwcGVuZHMgdG8gb25lIGZpbGUg4oCUIGBSZWNvcmRTaW5rYCBwbHVzIHdoYXQgdGhlIGFwcCBuZWVkcyB0byBtYW5hZ2UgdGhlIGZpbGUuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVTaW5rIGV4dGVuZHMgUmVjb3JkU2luayB7XG4gIC8qKiBUaGUgYWJzb2x1dGUgcGF0aCB0aGUgc2luayB3cml0ZXMgdG8g4oCUIHJlc29sdmVkIG9uY2UsIHdoZW4gaXQgd2FzIG1hZGUuICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIEJ5dGVzIHRoaXMgc2luayBrbm93cyBhcmUgb24gZGlzazogdGhlIGZpbGUncyBzaXplIHdoZW4gaXQgb3BlbmVkIHBsdXMgZXZlcnkgYnl0ZSBpdHMgd3JpdGVzIGNvbXBsZXRlZCDigJQgYVxuICAgKiBydW5uaW5nIHN1bSwgbm90IHRoZSBmaWxlJ3MgZW5kICh3cml0ZXMgY29tcGxldGUgb3V0IG9mIG9yZGVyOyBhIGZhaWxlZCBvbmUgbGVhdmVzIGEgaG9sZSkuXG4gICAqL1xuICByZWFkb25seSBieXRlczogbnVtYmVyO1xuICAvKiogQnl0ZXMgYWNjZXB0ZWQgYW5kIG5vdCB5ZXQgd3JpdHRlbi4gKi9cbiAgcmVhZG9ubHkgcXVldWVkQnl0ZXM6IG51bWJlcjtcbiAgLyoqIGB0cnVlYCBvbmNlIGFuIGVudHJ5IHdhcyByZWZ1c2VkIGZvciBgbWF4Qnl0ZXNgOiB0aGUgZmlsZSBpcyBmdWxsLCBhbmQgb25seSBhIGNsb3NpbmcgZW50cnkgbWF5IHN0aWxsIGdvLiAqL1xuICByZWFkb25seSBmdWxsOiBib29sZWFuO1xuICAvKipcbiAgICogUmVsZWFzZSB0aGUgZmlsZS4gSWRlbXBvdGVudC4gRXZlcnkgZW50cnkgYWZ0ZXIgaXQgaXMgcmVmdXNlZCAodGhlIHJ1biBjb3VudHMgaXQpLCBhbmQgYGZsdXNoKClgIHJlamVjdHM7XG4gICAqIGVudHJpZXMgYWxyZWFkeSBhY2NlcHRlZCBhcmUgc3RpbGwgd3JpdHRlbiAoYW5kIGEgZmx1c2ggYWxyZWFkeSBzdGFydGVkIGZpbmlzaGVzKSwgdGhlbiB0aGUgZmlsZSBpcyBjbG9zZWQg4oCUXG4gICAqIHRoZSBwcm9taXNlIHNldHRsZXMgdGhlbi5cbiAgICovXG4gIGNsb3NlKCk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogQSByZWNvcmQgc2luayB0aGF0IGFwcGVuZHMgZWFjaCBlbnRyeSB0byBgcGF0aGAgYXMgb25lIEpTT04gbGluZSDigJQgdGhlIGNyYXNoLXNhZmUgcmVjb3JkIG9uIGEgTm9kZSBob3N0LlxuICpcbiAqIEV2ZXJ5IG1ldGhvZCByZXR1cm5zIGF0IG9uY2U6IHRoZSBsaW5lIGlzIGVuY29kZWQsIGNoZWNrZWQgYWdhaW5zdCBldmVyeSBib3VuZCwgZ2l2ZW4gaXRzIG9mZnNldCBhbmQgaGFuZGVkIHRvXG4gKiB0aGUgSS9PIHBvb2wuIFRoZSBtZXRob2QncyBwcm9taXNlIHNldHRsZXMgd2hlbiB0aGF0IGxpbmUgaXMgd3JpdHRlbjsgYSB3cml0ZSB0aGF0IGZhaWxzIHJlamVjdHMgaXQsIGFuZCB0aGUgcnVuXG4gKiBjb3VudHMgdGhlIGxvc3MuXG4gKlxuICogQHRocm93cyBUeXBlRXJyb3Igd2hlbiBgcGF0aGAgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBkb2VzIG5vdCBuYW1lIGEgcmVndWxhciBmaWxlIHRoZSB3cml0ZXIgb3ducyBhbG9uZTtcbiAqICAgUmFuZ2VFcnJvciBmb3IgYSBib3VuZCB0aGF0IGlzIG5vdCBhIHdob2xlIG51bWJlciDiiaUgMTsgdGhlIG9wZXJhdGluZyBzeXN0ZW0ncyBlcnJvciB3aGVuXG4gKiAgIHRoZSBmaWxlIGNhbm5vdCBiZSBvcGVuZWQgKGEgc3ltYm9saWMgbGluayBhdCBgcGF0aGAgaW5jbHVkZWQpLiBNYWRlIG9uY2UsIGF0IHNldHVwIOKAlCBuZXZlciBkdXJpbmcgYSBydW4uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGZpbGVTaW5rLCByZWFkUmVjb3JkRmlsZSB9IGZyb20gJ2Zvb3RwcmludGpzL3NpbmtzJztcbiAqIGltcG9ydCB7IHJlYWRTdG9yZWRSZWNvcmQgfSBmcm9tICdmb290dHJhY2UnO1xuICpcbiAqIGNvbnN0IHNpbmsgPSBmaWxlU2luaygnL3Zhci9mb290cHJpbnQvb3JkZXJzLmpzb25sJyk7XG4gKiBjb25zdCBleGVjdXRvciA9IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyBzaW5rIH0pO1xuICogYXdhaXQgZXhlY3V0b3IucnVuKHsgaW5wdXQgfSk7XG4gKiAvLyDigKZsYXRlciwgb3IgYWZ0ZXIgYSBjcmFzaDpcbiAqIGNvbnN0IHJlY29yZCA9IHJlYWRTdG9yZWRSZWNvcmQocmVhZFJlY29yZEZpbGUoJy92YXIvZm9vdHByaW50L29yZGVycy5qc29ubCcpLmVudHJpZXMpO1xuICogcmVjb3JkLnJvb3QocnVuSWQpPy5jb21wbGV0ZTsgLy8gZmFsc2UgZm9yIGEgcnVuIHRoYXQgbmV2ZXIgZW5kZWRcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsZVNpbmsocGF0aDogc3RyaW5nLCBvcHRpb25zPzogRmlsZVNpbmtPcHRpb25zKTogRmlsZVNpbmsge1xuICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnIHx8IHBhdGggPT09ICcnKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdmaWxlU2luazogcGF0aCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICBjb25zdCBtYXhCeXRlcyA9IGJvdW5kKCdtYXhCeXRlcycsIG9wdGlvbnM/Lm1heEJ5dGVzLCBERUZBVUxUX0ZJTEVfU0lOS19NQVhfQllURVMsIDEpO1xuICBjb25zdCBtYXhFbnRyeUJ5dGVzID0gYm91bmQoJ21heEVudHJ5Qnl0ZXMnLCBvcHRpb25zPy5tYXhFbnRyeUJ5dGVzLCBERUZBVUxUX0ZJTEVfU0lOS19NQVhfRU5UUllfQllURVMsIDEpO1xuICBjb25zdCBtYXhRdWV1ZWRCeXRlcyA9IGJvdW5kKCdtYXhRdWV1ZWRCeXRlcycsIG9wdGlvbnM/Lm1heFF1ZXVlZEJ5dGVzLCBERUZBVUxUX0ZJTEVfU0lOS19NQVhfUVVFVUVEX0JZVEVTLCAxKTtcbiAgY29uc3QgZmx1c2hUaW1lb3V0TXMgPSBib3VuZCgnZmx1c2hUaW1lb3V0TXMnLCBvcHRpb25zPy5mbHVzaFRpbWVvdXRNcywgREVGQVVMVF9GSUxFX1NJTktfRkxVU0hfVElNRU9VVF9NUywgMSk7XG4gIGNvbnN0IGFic29sdXRlID0gcmVzb2x2ZVBhdGgocGF0aCk7XG4gIC8vIE5PVCBgT19BUFBFTkRgOiBlYWNoIGVudHJ5IGlzIHdyaXR0ZW4gYXQgdGhlIG9mZnNldCBpdCB3YXMgZ2l2ZW4gd2hlbiBpdCB3YXMgcXVldWVkIChhIHBvc2l0aW9uYWwgd3JpdGUpLCBzb1xuICAvLyBldmVyeSBlbnRyeSBpcyBoYW5kZWQgdG8gdGhlIEkvTyBwb29sIHRoZSBtb21lbnQgaXQgaXMgYWNjZXB0ZWQg4oCUIG5vbmUgd2FpdHMgZm9yIHRoZSBldmVudCBsb29wIHRvIHR1cm4uXG4gIGNvbnN0IGZkID0gb3BlblN5bmMoYWJzb2x1dGUsIGNvbnN0YW50cy5PX1JEV1IgfCBjb25zdGFudHMuT19DUkVBVCB8IChjb25zdGFudHMuT19OT0ZPTExPVyA/PyAwKSwgMG82MDApO1xuICBsZXQgaWRlbnRpdHk6IHN0cmluZztcbiAgbGV0IHNpemU6IG51bWJlcjtcbiAgbGV0IG5lZWRzTmV3bGluZTogYm9vbGVhbjsgLy8gdGhlIGZpbGUgZW5kcyB3aXRoIGEgdG9ybiBsaW5lOiB0aGUgZmlyc3QgZW50cnkgc3RhcnRzIGEgbmV3IG9uZVxuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBmc3RhdFN5bmMoZmQpO1xuICAgIGlmICghc3RhdC5pc0ZpbGUoKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgZmlsZVNpbms6ICR7YWJzb2x1dGV9IGlzIG5vdCBhIHJlZ3VsYXIgZmlsZWApO1xuICAgIHJlZnVzZUZvcmVpZ24oYWJzb2x1dGUsIHN0YXQpO1xuICAgIGlkZW50aXR5ID0gYCR7c3RhdC5kZXZ9OiR7c3RhdC5pbm99YDtcbiAgICAvLyBPbmUgd3JpdGVyIHBlciBmaWxlLCBpbiB0aGlzIHByb2Nlc3M6IGEgc2Vjb25kIHNpbmsgd291bGQgcGxhY2UgaXRzIGVudHJpZXMgb3ZlciB0aGUgZmlyc3Qncy5cbiAgICBpZiAoT1BFTl9GSUxFUy5oYXMoaWRlbnRpdHkpKSB0aHJvdyBuZXcgVHlwZUVycm9yKGBmaWxlU2luazogJHthYnNvbHV0ZX0gYWxyZWFkeSBoYXMgYW4gb3BlbiBzaW5rIGluIHRoaXMgcHJvY2Vzc2ApO1xuICAgIHNpemUgPSBzdGF0LnNpemU7XG4gICAgbmVlZHNOZXdsaW5lID0gc2l6ZSA+IDAgJiYgIWVuZHNXaXRoTmV3bGluZShmZCwgc2l6ZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2xvc2VTeW5jKGZkKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuICBPUEVOX0ZJTEVTLmFkZChpZGVudGl0eSk7XG5cbiAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICBsZXQgbmV4dCA9IHNpemU7IC8vIHRoZSBvZmZzZXQgdGhlIG5leHQgYWNjZXB0ZWQgZW50cnkgaXMgd3JpdHRlbiBhdCDigJQgd2hhdCBgbWF4Qnl0ZXNgIGJvdW5kc1xuICBsZXQgd3JpdHRlbiA9IHNpemU7IC8vIGJ5dGVzIGtub3duIG9uIGRpc2tcbiAgbGV0IHF1ZXVlZEJ5dGVzID0gMDsgLy8gYWNjZXB0ZWQsIG5vdCB5ZXQgd3JpdHRlbiAoaW4gdGhlIEkvTyBwb29sJ3MgaGFuZHMpXG4gIGxldCBpbkZsaWdodCA9IDA7XG4gIGxldCBzeW5jaW5nID0gMDtcbiAgbGV0IGZ1bGwgPSBmYWxzZTtcbiAgbGV0IGNsb3NpbmcgPSBmYWxzZTtcbiAgbGV0IHJlbGVhc2VkID0gZmFsc2U7XG4gIGxldCBkcmFpbmVkOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuICBsZXQgY2xvc2VkU2lnbmFsOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHdoZW5SZWxlYXNlZCA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiAoY2xvc2VkU2lnbmFsID0gcmVzb2x2ZSkpO1xuXG4gIC8qKiBSZWxlYXNlIHRoZSBmaWxlIG9uY2Ugbm90aGluZyBpcyBpbiBmbGlnaHQgYW5kIG5vIGZzeW5jIGlzIHBlbmRpbmcg4oCUIGFzeW5jaHJvbm91c2x5OyBhbiBlcnJvciBpcyBpZ25vcmVkLiAqL1xuICBjb25zdCByZWxlYXNlSWZJZGxlID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmICghY2xvc2luZyB8fCByZWxlYXNlZCB8fCBpbkZsaWdodCA+IDAgfHwgc3luY2luZyA+IDApIHJldHVybjtcbiAgICByZWxlYXNlZCA9IHRydWU7XG4gICAgT1BFTl9GSUxFUy5kZWxldGUoaWRlbnRpdHkpO1xuICAgIGNsb3NlKGZkLCAoKSA9PiBjbG9zZWRTaWduYWw/LigpKTtcbiAgfTtcblxuICAvKiogRXZlcnl0aGluZyBhY2NlcHRlZCBpcyB3cml0dGVuOiBzdGFydCBlYWNoIHdhaXRpbmcgZmx1c2gncyBmc3luYywgdGhlbiByZWxlYXNlIGlmIGNsb3NpbmcuICovXG4gIGNvbnN0IHNldHRsZURyYWluZWQgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGluRmxpZ2h0ID4gMCkgcmV0dXJuO1xuICAgIGNvbnN0IHdhaXRpbmcgPSBkcmFpbmVkO1xuICAgIGRyYWluZWQgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHN0YXJ0IG9mIHdhaXRpbmcpIHN0YXJ0KCk7XG4gICAgcmVsZWFzZUlmSWRsZSgpO1xuICB9O1xuXG4gIC8qKiBPbmUgZW50cnk6IHJlZnVzZWQgd2hvbGUgd2l0aCBhIG5hbWVkIGJvdW5kICh0aGUgbG9nIGNvdW50cyBpdCksIG9yIHN1Ym1pdHRlZCDigJQgbmV2ZXIgaW4gcGFydCwgbmV2ZXIgYmxvY2tpbmcuICovXG4gIGNvbnN0IGVucXVldWUgPSAoZW50cnk6IFJlY29yZEVudHJ5KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGNsb3NpbmcpIHRocm93IG5ldyBFcnJvcihgZmlsZVNpbms6ICR7YWJzb2x1dGV9IGlzIGNsb3NlZGApO1xuICAgIC8vIFRoZSBjaGVhcCByZWZ1c2FscyBmaXJzdDogYSBmdWxsIGZpbGUgb3IgYSBmdWxsIHF1ZXVlIGNvc3RzIG5vIGVuY29kaW5nLlxuICAgIGlmIChmdWxsICYmIGVudHJ5LmtpbmQgIT09ICdjbG9zZWQnKSB0aHJvdyBmaWxlRnVsbChhYnNvbHV0ZSwgbWF4Qnl0ZXMsIGVudHJ5LmtpbmQpO1xuICAgIC8vIEEgY2xvc2luZyBlbnRyeSBpcyBleGVtcHQgZnJvbSB0aGUgcXVldWUgYm91bmQgKGFzIGZyb20gYG1heEJ5dGVzYCwgd2l0aGluIGl0cyByZXNlcnZlKTogaG93IGEgbG9nIGVuZGVkIGlzXG4gICAgLy8gdGhlIG9uZSBlbnRyeSBhIGZ1bGwgcXVldWUgbXVzdCBub3QgZHJvcC5cbiAgICBjb25zdCBpc0Nsb3NpbmdFbnRyeSA9IGVudHJ5LmtpbmQgPT09ICdjbG9zZWQnO1xuICAgIGlmICghaXNDbG9zaW5nRW50cnkgJiYgcXVldWVkQnl0ZXMgPj0gbWF4UXVldWVkQnl0ZXMpXG4gICAgICB0aHJvdyBxdWV1ZUZ1bGwoYWJzb2x1dGUsIHF1ZXVlZEJ5dGVzLCBtYXhRdWV1ZWRCeXRlcywgZW50cnkua2luZCk7XG4gICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KGVudHJ5KTsgLy8gYW4gZW50cnkgSlNPTiBjYW5ub3Qgd3JpdGUgKGEgQmlnSW50LCBhIGN5Y2xlKSB0aHJvd3MgaGVyZSwgd2hvbGVcbiAgICAvLyBBIHN0cmluZydzIGxlbmd0aCBuZXZlciBleGNlZWRzIGl0cyBVVEYtOCBzaXplOiBhbiBlbnRyeSBhbHJlYWR5IHRvbyBsb25nIGlzIHJlZnVzZWQgYmVmb3JlIGl0IGlzIGVuY29kZWQuXG4gICAgaWYgKGpzb24ubGVuZ3RoICsgMSA+IG1heEVudHJ5Qnl0ZXMpIHRocm93IHRvb0xhcmdlKGFic29sdXRlLCBlbnRyeS5raW5kLCBtYXhFbnRyeUJ5dGVzKTtcbiAgICBjb25zdCBlbmNvZGVkID0gZW5jb2Rlci5lbmNvZGUoYCR7bmVlZHNOZXdsaW5lID8gJ1xcbicgOiAnJ30ke2pzb259XFxuYCk7XG4gICAgaWYgKGVuY29kZWQubGVuZ3RoID4gbWF4RW50cnlCeXRlcyArIDEpIHRocm93IHRvb0xhcmdlKGFic29sdXRlLCBlbnRyeS5raW5kLCBtYXhFbnRyeUJ5dGVzKTtcbiAgICBjb25zdCBsaW1pdCA9IGVudHJ5LmtpbmQgPT09ICdjbG9zZWQnID8gbWF4Qnl0ZXMgKyBDTE9TRV9SRVNFUlZFX0JZVEVTIDogbWF4Qnl0ZXM7XG4gICAgaWYgKG5leHQgKyBlbmNvZGVkLmxlbmd0aCA+IGxpbWl0KSB7XG4gICAgICBpZiAoZW50cnkua2luZCAhPT0gJ2Nsb3NlZCcpIGZ1bGwgPSB0cnVlO1xuICAgICAgdGhyb3cgZmlsZUZ1bGwoYWJzb2x1dGUsIG1heEJ5dGVzLCBlbnRyeS5raW5kKTtcbiAgICB9XG4gICAgaWYgKCFpc0Nsb3NpbmdFbnRyeSAmJiBxdWV1ZWRCeXRlcyArIGVuY29kZWQubGVuZ3RoID4gbWF4UXVldWVkQnl0ZXMpIHtcbiAgICAgIHRocm93IHF1ZXVlRnVsbChhYnNvbHV0ZSwgcXVldWVkQnl0ZXMsIG1heFF1ZXVlZEJ5dGVzLCBlbnRyeS5raW5kKTtcbiAgICB9XG4gICAgbmVlZHNOZXdsaW5lID0gZmFsc2U7XG4gICAgY29uc3QgYXQgPSBuZXh0O1xuICAgIG5leHQgKz0gZW5jb2RlZC5sZW5ndGg7XG4gICAgcXVldWVkQnl0ZXMgKz0gZW5jb2RlZC5sZW5ndGg7XG4gICAgaW5GbGlnaHQgKz0gMTtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgd3JpdGVBdChmZCwgZW5jb2RlZCwgYXQsIChlcnJvciwgd3JvdGUpID0+IHtcbiAgICAgICAgaW5GbGlnaHQgLT0gMTtcbiAgICAgICAgcXVldWVkQnl0ZXMgLT0gZW5jb2RlZC5sZW5ndGg7XG4gICAgICAgIHdyaXR0ZW4gKz0gd3JvdGU7XG4gICAgICAgIC8vIEEgbGluZSBjdXQgc2hvcnQgbGVhdmVzIGEgaG9sZSB1cCB0byB0aGUgbmV4dCBlbnRyeSdzIG9mZnNldDogdGhlIHJlYWRlciBzcGxpdHMgYXQgaXQgKE5VTCksIHNvIGEgdG9yblxuICAgICAgICAvLyBsaW5lIG5ldmVyIHN3YWxsb3dzIHRoZSBlbnRyeSBhZnRlciBpdC5cbiAgICAgICAgaWYgKGVycm9yKSByZWplY3QoZXJyb3IpO1xuICAgICAgICBlbHNlIHJlc29sdmUoKTtcbiAgICAgICAgc2V0dGxlRHJhaW5lZCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBwYXRoOiBhYnNvbHV0ZSxcbiAgICBnZXQgYnl0ZXMoKSB7XG4gICAgICByZXR1cm4gd3JpdHRlbjtcbiAgICB9LFxuICAgIGdldCBxdWV1ZWRCeXRlcygpIHtcbiAgICAgIHJldHVybiBxdWV1ZWRCeXRlcztcbiAgICB9LFxuICAgIGdldCBmdWxsKCkge1xuICAgICAgcmV0dXJuIGZ1bGw7XG4gICAgfSxcbiAgICBvcGVuZWQ6ICh7IGFkZHJlc3MsIGF0LCBpbml0aWFsU3RhdGUsIG1ldGEgfSkgPT5cbiAgICAgIGVucXVldWUoeyBraW5kOiAnb3BlbmVkJywgYWRkcmVzcywgYXQsIGluaXRpYWxTdGF0ZSwgLi4uKG1ldGEgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBtZXRhIH0pIH0pLFxuICAgIGNvbW1pdDogKHsgYWRkcmVzcywgYXQsIGJ1bmRsZSB9KSA9PiBlbnF1ZXVlKHsga2luZDogJ2NvbW1pdCcsIGFkZHJlc3MsIGF0LCBidW5kbGUgfSksXG4gICAgbm90ZTogKHsgYWRkcmVzcywgYXQsIGtpbmQsIGRhdGEgfSkgPT4gZW5xdWV1ZSh7IGtpbmQ6ICdub3RlJywgYWRkcmVzcywgYXQsIG5vdGU6IGtpbmQsIGRhdGEgfSksXG4gICAgY2xvc2VkOiAoeyBhZGRyZXNzLCBhdCwgb3V0Y29tZSwgY29tbWl0cywgbWV0YSB9KSA9PlxuICAgICAgZW5xdWV1ZSh7IGtpbmQ6ICdjbG9zZWQnLCBhZGRyZXNzLCBhdCwgb3V0Y29tZSwgY29tbWl0cywgLi4uKG1ldGEgPT09IHVuZGVmaW5lZCA/IHt9IDogeyBtZXRhIH0pIH0pLFxuICAgIGZsdXNoOiAoKSA9PiB7XG4gICAgICBpZiAoY2xvc2luZykgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgZmlsZVNpbms6ICR7YWJzb2x1dGV9IGlzIGNsb3NlZGApKTtcbiAgICAgIGNvbnN0IHdvcmsgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGRyYWluZWQucHVzaCgoKSA9PiB7XG4gICAgICAgICAgc3luY2luZyArPSAxO1xuICAgICAgICAgIGZzeW5jKGZkLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICBzeW5jaW5nIC09IDE7XG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgIHJlbGVhc2VJZklkbGUoKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQW5vdGhlciB3cml0ZXIgKGFub3RoZXIgcHJvY2VzcyBvbiB0aGUgc2FtZSBwYXRoKSBncmV3IHRoZSBmaWxlIHBhc3Qgd2hhdCB0aGlzIHNpbmsgcGxhY2VkOiBpdHNcbiAgICAgICAgICAgIC8vIGVudHJpZXMgYW5kIG91cnMgb3ZlcmxhcC4gU2FpZCwgbmV2ZXIgc2lsZW50LlxuICAgICAgICAgICAgZnN0YXQoZmQsIChzdGF0RXJyb3IsIHN0YXQpID0+IHtcbiAgICAgICAgICAgICAgc3luY2luZyAtPSAxO1xuICAgICAgICAgICAgICBpZiAoc3RhdEVycm9yKSByZWplY3Qoc3RhdEVycm9yKTtcbiAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdC5zaXplID4gbmV4dCkge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYGZpbGVTaW5rOiAke2Fic29sdXRlfSB3YXMgd3JpdHRlbiBieSBhbm90aGVyIHdyaXRlciAob25lIHNpbmsgcGVyIGZpbGUpYCkpO1xuICAgICAgICAgICAgICB9IGVsc2UgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICByZWxlYXNlSWZJZGxlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNldHRsZURyYWluZWQoKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHdpdGhUaW1lb3V0KFxuICAgICAgICB3b3JrLFxuICAgICAgICBmbHVzaFRpbWVvdXRNcyxcbiAgICAgICAgYGZpbGVTaW5rOiBmbHVzaCgpIG9mICR7YWJzb2x1dGV9IGRpZCBub3QgZmluaXNoIGluICR7Zmx1c2hUaW1lb3V0TXN9bXNgLFxuICAgICAgKTtcbiAgICB9LFxuICAgIGNsb3NlOiAoKSA9PiB7XG4gICAgICBpZiAoIWNsb3NpbmcpIHtcbiAgICAgICAgY2xvc2luZyA9IHRydWU7XG4gICAgICAgIHJlbGVhc2VJZklkbGUoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3aGVuUmVsZWFzZWQ7XG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBGaWxlcyBhIHNpbmsgb2YgdGhpcyBwcm9jZXNzIGhhcyBvcGVuLCBieSBkZXZpY2UgYW5kIGlub2RlIOKAlCBvbmUgd3JpdGVyIHBlciBmaWxlLiBLZXB0IG9uIHRoZSBnbG9iYWwgb2JqZWN0LCBzb1xuICogdGhlIHBhY2thZ2UncyBDb21tb25KUyBhbmQgRVNNIGJ1aWxkcyAodHdvIG1vZHVsZSBpbnN0YW5jZXMgaW4gb25lIHByb2Nlc3MpIHNoYXJlIGl0LlxuICovXG5jb25zdCBPUEVOX0ZJTEVTOiBTZXQ8c3RyaW5nPiA9ICgoZ2xvYmFsVGhpcyBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbU3ltYm9sLmZvcignZm9vdHByaW50anMuZmlsZVNpbmsub3BlbicpXSA/Pz1cbiAgbmV3IFNldDxzdHJpbmc+KCkpIGFzIFNldDxzdHJpbmc+O1xuXG5mdW5jdGlvbiBmaWxlRnVsbChwYXRoOiBzdHJpbmcsIG1heEJ5dGVzOiBudW1iZXIsIGtpbmQ6IHN0cmluZyk6IFJhbmdlRXJyb3Ige1xuICByZXR1cm4gbmV3IFJhbmdlRXJyb3IoYGZpbGVTaW5rOiAke3BhdGh9IGlzIGZ1bGwgKG1heEJ5dGVzICR7bWF4Qnl0ZXN9KTsgdGhpcyAke2tpbmR9IGVudHJ5IHdhcyBub3Qgd3JpdHRlbmApO1xufVxuXG5mdW5jdGlvbiBxdWV1ZUZ1bGwocGF0aDogc3RyaW5nLCBxdWV1ZWQ6IG51bWJlciwgbWF4UXVldWVkQnl0ZXM6IG51bWJlciwga2luZDogc3RyaW5nKTogUmFuZ2VFcnJvciB7XG4gIHJldHVybiBuZXcgUmFuZ2VFcnJvcihcbiAgICBgZmlsZVNpbms6ICR7cGF0aH0gaGFzICR7cXVldWVkfSBieXRlcyB3YWl0aW5nIChtYXhRdWV1ZWRCeXRlcyAke21heFF1ZXVlZEJ5dGVzfSk7IHRoaXMgJHtraW5kfSBlbnRyeSB3YXMgZHJvcHBlZGAsXG4gICk7XG59XG5cbi8qKiBBIGJvdW5kIHJlYWQgb2ZmIHRoZSBvcHRpb25zOiBhYnNlbnQg4oaSIHRoZSBkZWZhdWx0OyBlbHNlIGEgd2hvbGUgbnVtYmVyIOKJpSBgbWluYCwgb3IgYSBSYW5nZUVycm9yIG5hbWluZyBpdC4gKi9cbmZ1bmN0aW9uIGJvdW5kKG5hbWU6IHN0cmluZywgdmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCwgZmFsbGJhY2s6IG51bWJlciwgbWluOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbGxiYWNrO1xuICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlKSB8fCB2YWx1ZSA8IG1pbikge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBmaWxlU2luazogJHtuYW1lfSBtdXN0IGJlIGEgd2hvbGUgbnVtYmVyLCBhdCBsZWFzdCAke21pbn1gKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHRvb0xhcmdlKHBhdGg6IHN0cmluZywga2luZDogc3RyaW5nLCBtYXhFbnRyeUJ5dGVzOiBudW1iZXIpOiBSYW5nZUVycm9yIHtcbiAgcmV0dXJuIG5ldyBSYW5nZUVycm9yKFxuICAgIGBmaWxlU2luazogYSAke2tpbmR9IGVudHJ5IGxhcmdlciB0aGFuIG1heEVudHJ5Qnl0ZXMgKCR7bWF4RW50cnlCeXRlc30pIHdhcyBub3Qgd3JpdHRlbiB0byAke3BhdGh9YCxcbiAgKTtcbn1cblxuLyoqIFdyaXRlIGFsbCBvZiBgYnVmZmVyYCBhdCBgcG9zaXRpb25gIChhc3luY2hyb25vdXNseSwgYXMgbWFueSB3cml0ZXMgYXMgaXQgdGFrZXMpOyBgd3JvdGVgIGlzIGhvdyBtdWNoIHdlbnQgb3V0LiAqL1xuZnVuY3Rpb24gd3JpdGVBdChcbiAgZmQ6IG51bWJlcixcbiAgYnVmZmVyOiBVaW50OEFycmF5LFxuICBwb3NpdGlvbjogbnVtYmVyLFxuICBkb25lOiAoZXJyb3I6IEVycm9yIHwgbnVsbCwgd3JvdGU6IG51bWJlcikgPT4gdm9pZCxcbik6IHZvaWQge1xuICBjb25zdCBzdGVwID0gKG9mZnNldDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgd3JpdGUoZmQsIGJ1ZmZlciwgb2Zmc2V0LCBidWZmZXIubGVuZ3RoIC0gb2Zmc2V0LCBwb3NpdGlvbiArIG9mZnNldCwgKGVycm9yLCBuKSA9PiB7XG4gICAgICBpZiAoZXJyb3IpIGRvbmUoZXJyb3IsIG9mZnNldCk7XG4gICAgICBlbHNlIGlmIChuID09PSAwKSBkb25lKG5ldyBFcnJvcignZmlsZVNpbms6IHRoZSBkaXNrIHRvb2sgbm8gYnl0ZXMnKSwgb2Zmc2V0KTtcbiAgICAgIGVsc2UgaWYgKG9mZnNldCArIG4gPCBidWZmZXIubGVuZ3RoKSBzdGVwKG9mZnNldCArIG4pO1xuICAgICAgZWxzZSBkb25lKG51bGwsIGJ1ZmZlci5sZW5ndGgpO1xuICAgIH0pO1xuICB9O1xuICBzdGVwKDApO1xufVxuXG4vKiogYHdvcmtgLCBvciBhIHJlamVjdGlvbiBuYW1pbmcgdGhlIGJvdW5kIG9uY2UgYG1zYCBwYXNzZWQg4oCUIHRoZSB3b3JrIGdvZXMgb24sIG5vYm9keSB3YWl0cyBmb3IgaXQuICovXG5mdW5jdGlvbiB3aXRoVGltZW91dCh3b3JrOiBQcm9taXNlPHZvaWQ+LCBtczogbnVtYmVyLCBtZXNzYWdlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihtZXNzYWdlKSksIG1zKTtcbiAgICAvLyBBIHRpbWVyIHRoYXQgb25seSBib3VuZHMgYSB3YWl0IG5ldmVyIGtlZXBzIHRoZSBwcm9jZXNzIGFsaXZlIG9uIGl0cyBvd24uXG4gICAgKHRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICBQcm9taXNlLnByb3RvdHlwZS50aGVuLmNhbGwoXG4gICAgICB3b3JrLFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9LFxuICAgICAgKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9LFxuICAgICk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlZnVzZSBhIGZpbGUgc29tZW9uZSBlbHNlIGNvdWxkIHJlYWQgb3IgcmV3cml0ZSBiZWhpbmQgdGhlIHNpbms6IGEgaGFyZCBsaW5rIChhbm90aGVyIG5hbWUgZm9yIHRoZSBzYW1lIGJ5dGVzIOKAlFxuICogdGhlIHNpbmsgd291bGQgYXBwZW5kIGludG8gaXQpLCBhIGZpbGUgb3duZWQgYnkgYW5vdGhlciB1c2VyLCBvciBvbmUgb3RoZXJzIG1heSB3cml0ZS4gQSBmaWxlIHRoZSBzaW5rIGNyZWF0ZXMgaXNcbiAqIGAwbzYwMGAgYW5kIHBhc3NlczsgYSBwcmUtZXhpc3Rpbmcgb25lIG11c3QgYWxyZWFkeSBiZSBwcml2YXRlIHRvIHRoZSB3cml0ZXIuIChOb3Qgb24gV2luZG93cywgd2hvc2UgbW9kZXMgYW5kXG4gKiBvd25lcnMgZG8gbm90IG1hcDogdGhlcmUgYE9fTk9GT0xMT1dgIGlzIGFic2VudCB0b28g4oCUIHRoZSBndWlkZSBuYW1lcyBib3RoLilcbiAqL1xuZnVuY3Rpb24gcmVmdXNlRm9yZWlnbihwYXRoOiBzdHJpbmcsIHN0YXQ6IHsgcmVhZG9ubHkgbmxpbms6IG51bWJlcjsgcmVhZG9ubHkgdWlkOiBudW1iZXI7IHJlYWRvbmx5IG1vZGU6IG51bWJlciB9KSB7XG4gIGlmIChzdGF0Lm5saW5rID4gMSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgZmlsZVNpbms6ICR7cGF0aH0gaGFzIG90aGVyIGhhcmQgbGlua3Mg4oCUIHJlZnVzaW5nIHRvIHdyaXRlIHRocm91Z2ggb25lYCk7XG4gIGNvbnN0IHVpZCA9IHR5cGVvZiBnZXR1aWQgPT09ICdmdW5jdGlvbicgPyBnZXR1aWQoKSA6IHVuZGVmaW5lZDtcbiAgaWYgKHVpZCAhPT0gdW5kZWZpbmVkICYmIHN0YXQudWlkICE9PSB1aWQpIHRocm93IG5ldyBUeXBlRXJyb3IoYGZpbGVTaW5rOiAke3BhdGh9IGJlbG9uZ3MgdG8gYW5vdGhlciB1c2VyYCk7XG4gIGlmICh1aWQgIT09IHVuZGVmaW5lZCAmJiAoc3RhdC5tb2RlICYgMG8wMjIpICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgZmlsZVNpbms6ICR7cGF0aH0gaXMgd3JpdGFibGUgYnkgb3RoZXJzIOKAlCBtYWtlIGl0IDBvNjAwIChvciByZW1vdmUgaXQpIGZpcnN0YCk7XG4gIH1cbn1cblxuLyoqIFdoZXRoZXIgdGhlIGZpbGUncyBsYXN0IGJ5dGUgaXMgYSBuZXdsaW5lIOKAlCByZWFkIG9uY2UsIHdoZW4gdGhlIHNpbmsgb3BlbnMgYW4gZXhpc3RpbmcgZmlsZS4gKi9cbmZ1bmN0aW9uIGVuZHNXaXRoTmV3bGluZShmZDogbnVtYmVyLCBzaXplOiBudW1iZXIpOiBib29sZWFuIHtcbiAgY29uc3QgbGFzdCA9IG5ldyBVaW50OEFycmF5KDEpO1xuICByZXR1cm4gcmVhZFN5bmMoZmQsIGxhc3QsIDAsIDEsIHNpemUgLSAxKSA9PT0gMSAmJiBsYXN0WzBdID09PSAweDBhO1xufVxuXG4vKiogQSByZWNvcmQgZmlsZSByZWFkIGJhY2s6IGV2ZXJ5IHBhcnNlZCBsaW5lLCBhbmQgZXZlcnkgbGluZSB0aGF0IGNvdWxkIG5vdCBiZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3JkRmlsZSB7XG4gIC8qKiBUaGUgcGFyc2VkIGVudHJpZXMsIGluIGZpbGUgb3JkZXIg4oCUIHVudHJ1c3RlZCBpbnB1dCBmb3IgYHJlYWRTdG9yZWRSZWNvcmRgIChgZm9vdHRyYWNlYCkuICovXG4gIHJlYWRvbmx5IGVudHJpZXM6IHJlYWRvbmx5IHVua25vd25bXTtcbiAgLyoqIEVhY2ggbGluZSB0aGF0IGlzIG5vdCBKU09OIChhIHRvcm4gbGFzdCBsaW5lLCBhIGNvcnJ1cHQgb25lKSwgYnkgaXRzIDEtYmFzZWQgbnVtYmVyLiBCbGFuayBsaW5lcyBhcmUgc2tpcHBlZC4gKi9cbiAgcmVhZG9ubHkgdW5yZWFkYWJsZTogcmVhZG9ubHkgeyByZWFkb25seSBsaW5lOiBudW1iZXI7IHJlYWRvbmx5IHJlYXNvbjogc3RyaW5nIH1bXTtcbn1cblxuLyoqXG4gKiBSZWFkIGEgcmVjb3JkIGZpbGUgYmFjaywgbGluZSBieSBsaW5lIOKAlCB0aGUgZW50cmllcyBmb3IgYHJlYWRTdG9yZWRSZWNvcmRgLCBhbmQgZXZlcnkgbGluZSB0aGF0IGNvdWxkIG5vdCBiZVxuICogcmVhZCwgYnkgbnVtYmVyLCBuZXZlciBhIGZhaWxlZCByZWFkLiBBIHN0b3JlZCBrZXkgbmFtZWQgYF9fcHJvdG9fX2Agc3RheXMgZGF0YSAoYEpTT04ucGFyc2VgIG1ha2VzIGl0IGFuIG93blxuICogcHJvcGVydHkpLiBUaGUgZmlsZSBpcyB1bnRydXN0ZWQ6IGEgZmlsZSBsYXJnZXIgdGhhbiBgbWF4Qnl0ZXNgIChkZWZhdWx0IDI1NiBNaUIpIGlzIHJlZnVzZWQgYmVmb3JlIGl0IGlzIHJlYWQuXG4gKlxuICogQHRocm93cyBSYW5nZUVycm9yIHdoZW4gdGhlIGZpbGUgaXMgbGFyZ2VyIHRoYW4gYG1heEJ5dGVzYDsgdGhlIG9wZXJhdGluZyBzeXN0ZW0ncyBlcnJvciB3aGVuIGl0IGNhbm5vdCBiZSByZWFkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZFJlY29yZEZpbGUocGF0aDogc3RyaW5nLCBvcHRpb25zPzogeyByZWFkb25seSBtYXhCeXRlcz86IG51bWJlciB9KTogUmVjb3JkRmlsZSB7XG4gIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycgfHwgcGF0aCA9PT0gJycpIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlYWRSZWNvcmRGaWxlOiBwYXRoIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gIGNvbnN0IG1heEJ5dGVzID0gYm91bmQoJ21heEJ5dGVzJywgb3B0aW9ucz8ubWF4Qnl0ZXMsIERFRkFVTFRfUkVBRF9NQVhfQllURVMsIDEpO1xuICAvLyBPbmUgZGVzY3JpcHRvciBmb3IgdGhlIGNoZWNrIEFORCB0aGUgcmVhZCAoYSBmaWxlIHRoYXQgZ3Jvd3MgYmV0d2VlbiB0aGVtIGlzIHN0aWxsIGJvdW5kZWQpOyBhIHJlZ3VsYXIgZmlsZVxuICAvLyBvbmx5IChhIEZJRk8gd291bGQgYmxvY2ssIGEgZGV2aWNlIG5ldmVyIGVuZCk7IGF0IG1vc3QgYG1heEJ5dGVzYCByZWFkLlxuICAvLyBPX05PTkJMT0NLOiBhIEZJRk8gYXQgdGhlIHBhdGggbXVzdCBub3QgYmxvY2sgdGhlIG9wZW4gYmVmb3JlIHRoZSByZWd1bGFyLWZpbGUgY2hlY2sgcmVmdXNlcyBpdC5cbiAgY29uc3QgZmQgPSBvcGVuU3luYyhwYXRoLCBjb25zdGFudHMuT19SRE9OTFkgfCAoY29uc3RhbnRzLk9fTk9GT0xMT1cgPz8gMCkgfCAoY29uc3RhbnRzLk9fTk9OQkxPQ0sgPz8gMCkpO1xuICBsZXQgcmF3OiBVaW50OEFycmF5O1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBmc3RhdFN5bmMoZmQpO1xuICAgIGlmICghc3RhdC5pc0ZpbGUoKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgcmVhZFJlY29yZEZpbGU6ICR7cGF0aH0gaXMgbm90IGEgcmVndWxhciBmaWxlYCk7XG4gICAgaWYgKHN0YXQuc2l6ZSA+IG1heEJ5dGVzKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgcmVhZFJlY29yZEZpbGU6ICR7cGF0aH0gaG9sZHMgJHtzdGF0LnNpemV9IGJ5dGVzLCBwYXN0IHRoZSBsaW1pdCBvZiAke21heEJ5dGVzfWApO1xuICAgIH1cbiAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheShNYXRoLm1pbihzdGF0LnNpemUsIG1heEJ5dGVzKSArIDEpO1xuICAgIGxldCByZWFkID0gMDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCBuID0gcmVhZFN5bmMoZmQsIGJ1ZmZlciwgcmVhZCwgYnVmZmVyLmxlbmd0aCAtIHJlYWQsIHJlYWQpO1xuICAgICAgaWYgKG4gPT09IDApIGJyZWFrO1xuICAgICAgcmVhZCArPSBuO1xuICAgICAgaWYgKHJlYWQgPT09IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYHJlYWRSZWNvcmRGaWxlOiAke3BhdGh9IGdyZXcgcGFzdCB0aGUgbGltaXQgb2YgJHttYXhCeXRlc30gYnl0ZXMgd2hpbGUgYmVpbmcgcmVhZGApO1xuICAgICAgfVxuICAgIH1cbiAgICByYXcgPSBidWZmZXIuc3ViYXJyYXkoMCwgcmVhZCk7XG4gIH0gZmluYWxseSB7XG4gICAgY2xvc2VTeW5jKGZkKTtcbiAgfVxuICBjb25zdCB0ZXh0ID0gbmV3IFRleHREZWNvZGVyKCd1dGYtOCcpLmRlY29kZShyYXcpO1xuICBjb25zdCBlbnRyaWVzOiB1bmtub3duW10gPSBbXTtcbiAgY29uc3QgdW5yZWFkYWJsZTogeyBsaW5lOiBudW1iZXI7IHJlYXNvbjogc3RyaW5nIH1bXSA9IFtdO1xuICBjb25zdCBsaW5lcyA9IHRleHQuc3BsaXQoJ1xcbicpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gQSBydW4gb2YgTlVMIGJ5dGVzIGlzIGEgaG9sZSBhIGN1dC1zaG9ydCB3cml0ZSBsZWZ0IGJlZm9yZSB0aGUgbmV4dCBlbnRyeSdzIG9mZnNldDogaXQgZW5kcyB0aGUgdG9ybiBwYXJ0LFxuICAgIC8vIHNvIHRoZSBlbnRyeSBhZnRlciBpdCByZWFkcyBvbiBpdHMgb3duICh0aGUgc2FtZSBsaW5lIG51bWJlciBuYW1lcyBib3RoIHBpZWNlcykuXG4gICAgY29uc3QgbGluZSA9IGxpbmVzW2ldO1xuICAgIC8vIEEgaG9sZSBpcyByZXBvcnRlZCwgbmV2ZXIgc2tpcHBlZDogYnl0ZXMgdGhhdCBuZXZlciByZWFjaGVkIHRoZSBkaXNrIG1heSBiZSBhIHdob2xlIGVudHJ5IGxvc3QgbWlkLWZpbGUuXG4gICAgaWYgKGxpbmUuaW5jbHVkZXMoJ1xcMCcpKSB1bnJlYWRhYmxlLnB1c2goeyBsaW5lOiBpICsgMSwgcmVhc29uOiAnYSBob2xlIOKAlCBieXRlcyB0aGF0IG5ldmVyIHJlYWNoZWQgdGhlIGRpc2snIH0pO1xuICAgIGZvciAoY29uc3QgcGllY2Ugb2YgbGluZS5zcGxpdCgvXFwwKy8pKSB7XG4gICAgICBpZiAocGllY2UudHJpbSgpID09PSAnJykgY29udGludWU7XG4gICAgICB0cnkge1xuICAgICAgICBlbnRyaWVzLnB1c2goSlNPTi5wYXJzZShwaWVjZSkpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHVucmVhZGFibGUucHVzaCh7IGxpbmU6IGkgKyAxLCByZWFzb246ICdub3QgSlNPTiDigJQgYSB0b3JuIG9yIGNvcnJ1cHQgbGluZScgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGVudHJpZXMsIHVucmVhZGFibGUgfTtcbn1cbiJdfQ==
398
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZVNpbmsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3NpbmtzL2ZpbGVTaW5rLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMENHOzs7QUFFSCxxQ0FBMEc7QUFDMUcseUNBQW1EO0FBQ25ELCtDQUFzQztBQU10QyxnREFBZ0Q7QUFDbkMsUUFBQSwyQkFBMkIsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUM1RCxrREFBa0Q7QUFDckMsUUFBQSxpQ0FBaUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNqRSxxRUFBcUU7QUFDeEQsUUFBQSxrQ0FBa0MsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUNuRSw0Q0FBNEM7QUFDL0IsUUFBQSxrQ0FBa0MsR0FBRyxNQUFNLENBQUM7QUFDekQsOEdBQThHO0FBQzlHLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUN0Qyx1REFBdUQ7QUFDdkQsTUFBTSxzQkFBc0IsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQTBDakQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBQ0gsU0FBZ0IsUUFBUSxDQUFDLElBQVksRUFBRSxPQUF5QjtJQUM5RCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxJQUFJLEtBQUssRUFBRTtRQUFFLE1BQU0sSUFBSSxTQUFTLENBQUMsMkNBQTJDLENBQUMsQ0FBQztJQUM5RyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsbUNBQTJCLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEYsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLGVBQWUsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLHlDQUFp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Q0FBQyxFQUFFLE1BQU0sRUFBRSw0Q0FBNEMsRUFBRSxDQUFDLENBQUM7UUFDaEgsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdEMsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtnQkFBRSxTQUFTO1lBQ2xDLElBQUksQ0FBQztnQkFDSCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNsQyxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsbUNBQW1DLEVBQUUsQ0FBQyxDQUFDO1lBQ2hGLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLENBQUM7QUFDakMsQ0FBQztBQWhERCx3Q0FnREMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHNpbmtzL2ZpbGVTaW5rLnRzIOKAlCB0aGUgcmVjb3JkLCBvbmUgSlNPTiBsaW5lIHBlciBlbnRyeSwgaW4gYSBmaWxlIChkZXNpZ24gwqczLjUsIMKnNCwgcGFja2V0IFA2KS4gTk9ERSBPTkxZOiB0aGVcbiAqIG9uZSBmaWxlIGluIGBzcmMvYCB0aGF0IGltcG9ydHMgYSBOb2RlIGJ1aWx0LWluLCByZWFjaGFibGUgb25seSB0aHJvdWdoIHRoZSBgZm9vdHByaW50anMvc2lua3NgIGRvb3IuXG4gKlxuICogV0hZIEEgRklMRSwgV0hZIFRISVMgU0hBUEUuIEEgcnVuJ3MgcmVjb3JkIG11c3Qgb3V0bGl2ZSB0aGUgcHJvY2VzcyB0aGF0IG1hZGUgaXQg4oCUIGEga2lsbGVkIHByb2Nlc3MsIGEgY3Jhc2hlZFxuICogaG9zdCwgYSBzZXJ2ZXJsZXNzIGZyZWV6ZS4gRWFjaCBlbnRyeSB0aGUgbG9nIGhhbmRzIG92ZXIgaXMgZW5jb2RlZCwgY2hlY2tlZCBhbmQgZ2l2ZW4gaXRzIG93biBvZmZzZXQgaW4gdGhlIGZpbGUsXG4gKiBhbmQgaXRzIHdyaXRlIGlzIGhhbmRlZCB0byB0aGUgSS9PIHBvb2wgQVQgT05DRSAoYSBwb3NpdGlvbmFsIHdyaXRlIOKAlCBubyBlbnRyeSB3YWl0cyBmb3IgdGhlIGV2ZW50IGxvb3AgdG8gdHVybik7XG4gKiB0aGUgcG9vbCdzIHRocmVhZHMgcGVyZm9ybSB0aGVtIHdoaWxlIHRoZSBtYWluIHRocmVhZCBydW5zIG9uLiBBIHByb2Nlc3Mga2lsbGVkIGFmdGVyIGEgcG9vbCB0aHJlYWQgd3JvdGUgYW4gZW50cnlcbiAqIGtlZXBzIGl0LiBVbnRpbCB0aGVuIGl0IGlzIG5vdCBvbiBkaXNrOiBtaWNyb3NlY29uZHMgb24gYSBmcmVlIHBvb2wsIGJ1dCB0aGUgcG9vbCAoNCB0aHJlYWRzIGJ5IGRlZmF1bHQpIGlzIHNoYXJlZFxuICogd2l0aCBETlMgbG9va3VwcywgemxpYiwgY3J5cHRvIGFuZCBvdGhlciBmcyB3b3JrLCBzbyB3aGlsZSBpdCBpcyBidXN5IHRoZSB3aW5kb3cgaXMgYXMgbG9uZyBhcyB0aGF0IHdvcmsg4oCUIGFuZCBzaW5jZVxuICogd3JpdGVzIGNvbXBsZXRlIG91dCBvZiBvcmRlciwgYSBraWxsIGNhbiBsb3NlIGFuIGVudHJ5IGluIHRoZSBtaWRkbGUgKHRoZSByZWFkZXIgcmVwb3J0cyB0aGUgaG9sZSkuIGBmbHVzaCgpYCB3YWl0cyBmb3IgZXZlcnkgd3JpdGUgYW5kXG4gKiBgZnN5bmNgcyDigJQgdGhlIHN0ZXAgdGhhdCBhbHNvIHN1cnZpdmVzIHRoZSBtYWNoaW5lIGxvc2luZyBwb3dlciwgYW5kIHRoZSBvbmUgdGhlIGV4ZWN1dG9yIGF3YWl0cyBhZnRlciBlYWNoIHJ1bidzXG4gKiBjbG9zaW5nIGVudHJ5LlxuICpcbiAqIFRIRSBUSFJFQVQgTU9ERUwsIGFzIGNvZGUg4oCUIGV2ZXJ5IHJlc291cmNlIGJvdW5kZWQsIG5vdGhpbmcgdGhhdCBjYW4gc3RhbGwgdGhlIHJ1bjpcbiAqICAgLSBPTkxZIFRIRSBQQVRIIFRIRSBBUFAgR0lWRVMuIFJlc29sdmVkIG9uY2UgYW5kIG9wZW5lZCBvbmNlLCBhdCBgZmlsZVNpbmsocGF0aClgOyBldmVyeSBlbnRyeSBnb2VzIHRvIHRoYXQgb3BlblxuICogICAgIGZpbGUuIEEgc3ltYm9saWMgbGluayBhdCB0aGUgcGF0aCBpcyByZWZ1c2VkIChgT19OT0ZPTExPV2AsIHdoZXJlIHRoZSBwbGF0Zm9ybSBoYXMgaXQpLCBhbmQgc28gaXMgYW55dGhpbmdcbiAqICAgICB0aGF0IGlzIG5vdCBhIHJlZ3VsYXIgZmlsZSwgYSBmaWxlIHdpdGggYW5vdGhlciBoYXJkIGxpbmssIGFub3RoZXIgb3duZXIsIG9yIGdyb3VwL3dvcmxkIHdyaXRlLiBBIGZpbGUgdGhlXG4gKiAgICAgc2luayBjcmVhdGVzIGlzIGAwbzYwMGAuXG4gKiAgIC0gQVRPTUlDIFBFUiBFTlRSWS4gQSBsaW5lIGlzIGVuY29kZWQgaW4gZnVsbCBmaXJzdCDigJQgYW4gZW50cnkgSlNPTiBjYW5ub3Qgd3JpdGUgKGEgYEJpZ0ludGAsIGEgY3ljbGUpIGlzXG4gKiAgICAgcmVmdXNlZCB3aG9sZSDigJQgdGhlbiB3cml0dGVuIGF0IGl0cyBvd24gb2Zmc2V0LiBBIHdyaXRlIHRoYXQgZmFpbHMgcGFydC13YXkgbGVhdmVzIGEgaG9sZSB1cCB0byB0aGUgbmV4dFxuICogICAgIGVudHJ5J3Mgb2Zmc2V0OyB0aGUgcmVhZGVyIHNwbGl0cyBhdCBpdCAoTlVMKSwgc28gYSB0b3JuIGxpbmUgbmV2ZXIgc3dhbGxvd3MgdGhlIG9uZSBhZnRlciBpdCAoYW4gZXhpc3RpbmdcbiAqICAgICBmaWxlIHdpdGggYSB0b3JuIHRhaWwgZ2V0cyBhIG5ld2xpbmUgZmlyc3QpLlxuICogICAtIEJPVU5ERUQ6IGBtYXhFbnRyeUJ5dGVzYCAob25lIGxpbmUsIDggTWlCIOKAlCByZWZ1c2VkIGJ5IG5hbWUsIGJlZm9yZSBpdCBpcyBlbmNvZGVkIHdoZW4gaXRzIGxlbmd0aCBhbHJlYWR5XG4gKiAgICAgc2F5cyBzbyksIGBtYXhRdWV1ZWRCeXRlc2AgKGFjY2VwdGVkLCBub3QgeWV0IHdyaXR0ZW4sIDE2IE1pQiDigJQgcGFzdCBpdCBhbiBlbnRyeSBpcyBEUk9QUEVEIGFuZCBjb3VudGVkLCBuZXZlclxuICogICAgIGJ1ZmZlcmVkIHdpdGhvdXQgbGltaXQpLCBgbWF4Qnl0ZXNgICh0aGUgZmlsZSwgNjQgTWlCIOKAlCBvbmNlIGZ1bGwsIGV2ZXJ5IGZ1cnRoZXIgZW50cnkgaXMgcmVmdXNlZCBhbmQgY291bnRlZDtcbiAqICAgICBhIGNsb3NpbmcgZW50cnkgbWF5IHVzZSBhIDY0IEtpQiByZXNlcnZlIHNvIGEgZnVsbCBmaWxlIGNhbiBzdGlsbCBzYXkgaG93IHRoZSBydW4gZW5kZWQpLCBgZmx1c2hUaW1lb3V0TXNgXG4gKiAgICAgKDEwIHMg4oCUIHRoZW4gYGZsdXNoKClgIHJlamVjdHMpLiBFdmVyeSByZWZ1c2FsIHRocm93cyBmcm9tIHRoZSBzaW5rIG1ldGhvZCwgd2hpY2ggdGhlIGxvZyBjb3VudHNcbiAqICAgICAoYGdldFNuYXBzaG90KCkuc2lua2ApOyBhIHdyaXRlIHRoYXQgZmFpbHMgbGF0ZXIgcmVqZWN0cyB0aGF0IGVudHJ5J3MgcHJvbWlzZSwgY291bnRlZCB0aGUgc2FtZSB3YXkuXG4gKiAgIC0gQVNZTkNIUk9OT1VTIFdSSVRFUyBPTkxZLiBObyBtZXRob2QgYmxvY2tzIG9uIHRoZSBkaXNrOyB0aGUgZmlsZSBpcyByZWxlYXNlZCBhc3luY2hyb25vdXNseSwgYWZ0ZXIgZXZlcnlcbiAqICAgICB3cml0ZSBhbmQgZXZlcnkgc3RhcnRlZCBmc3luYy5cbiAqICAgLSBOTyBTRUNSRVQgT04gRElTSyBpcyB0aGUgRVhFQ1VUT1IncyBsYXcsIGFwcGxpZWQgYmVmb3JlIGFueSBlbnRyeSByZWFjaGVzIGFuIGFkYXB0ZXIgKGBydW5uZXIvcmVjb3JkU2luay50c2ApOlxuICogICAgIHRoaXMgZmlsZSB3cml0ZXMgd2hhdCBpdCBpcyBoYW5kZWQgYW5kIHJlYWRzIG5vdGhpbmcgZWxzZS5cbiAqICAgLSBPTkUgV1JJVEVSIFBFUiBGSUxFLiBBIHNlY29uZCBzaW5rIG9uIGEgZmlsZSB0aGlzIHByb2Nlc3MgaGFzIG9wZW4gaXMgcmVmdXNlZCAoYnkgZGV2aWNlIGFuZCBpbm9kZSwgYWNyb3NzIHRoZVxuICogICAgIENvbW1vbkpTIGFuZCBFU00gYnVpbGRzKS4gQU5PVEhFUiBQUk9DRVNTIHdyaXRpbmcgdGhlIHNhbWUgcGF0aCBpcyBub3Qgc2VlbiBhdCBvcGVuOiBlYWNoIHdyaXRlcyBhdCBpdHMgb3duXG4gKiAgICAgb2Zmc2V0cyBhbmQgd291bGQgb3ZlcndyaXRlIHRoZSBvdGhlci4gYGZsdXNoKClgIGNoZWNrcyB0aGUgZmlsZSdzIHNpemUgYWdhaW5zdCB3aGF0IHRoaXMgc2luayBwbGFjZWQgYW5kIHJlamVjdHNcbiAqICAgICAoYSBsb3NzIHRoZSBydW4gY291bnRzKSB3aGVuIGFub3RoZXIgd3JpdGVyJ3MgYnl0ZXMgcmVhY2ggcGFzdCBpdCDigJQgYmVzdCBlZmZvcnQ6IGFuIG92ZXJ3cml0ZSB0aGlzIHNpbmsncyBvd25cbiAqICAgICBsYXRlciB3cml0ZXMgY292ZXIgaXMgbm90IHNlZW4uIEdpdmUgZWFjaCBwcm9jZXNzIGl0cyBvd24gZmlsZS5cbiAqXG4gKiBXSEFUIEpTT04gS0VFUFMuIEEgbGluZSBob2xkcyB3aGF0IGBKU09OLnN0cmluZ2lmeWAga2VlcHM6IGEgYERhdGVgIGJlY29tZXMgaXRzIElTTyBzdHJpbmcsIGEgYE1hcGAgLyBgU2V0YCBhblxuICogZW1wdHkgb2JqZWN0LCBgdW5kZWZpbmVkYCBkaXNhcHBlYXJzLiBBIHJlY29yZCBvZiBwbGFpbiBKU09OIHZhbHVlcyByZWFkcyBiYWNrIGV4YWN0bHkgKGByZWFkUmVjb3JkRmlsZWAg4oaSXG4gKiBgcmVhZFN0b3JlZFJlY29yZGApOyBmb3IgcmljaGVyIHZhbHVlcywgYnJpbmcgYW4gYWRhcHRlciB3aXRoIGEgcmljaGVyIGVuY29kaW5nLlxuICovXG5cbmltcG9ydCB7IGNsb3NlLCBjbG9zZVN5bmMsIGNvbnN0YW50cywgZnN0YXQsIGZzdGF0U3luYywgZnN5bmMsIG9wZW5TeW5jLCByZWFkU3luYywgd3JpdGUgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IHJlc29sdmUgYXMgcmVzb2x2ZVBhdGggfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZ2V0dWlkIH0gZnJvbSAnbm9kZTpwcm9jZXNzJztcblxuaW1wb3J0IHR5cGUgeyBSZWNvcmRFbnRyeSwgUmVjb3JkU2luayB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5cbmltcG9ydCB0eXBlIHsgQ2FwdHVyZUhpc3RvcnlPcHRpb25zIH0gZnJvbSAnLi4vY2FwdHVyZS9oaXN0b3J5VHlwZXMuanMnO1xuXG4vKiogVGhlIGRlZmF1bHQgY2FwIG9uIGEgcmVjb3JkIGZpbGU6IDY0IE1pQi4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0ZJTEVfU0lOS19NQVhfQllURVMgPSA2NCAqIDEwMjQgKiAxMDI0O1xuLyoqIFRoZSBkZWZhdWx0IGNhcCBvbiBPTkUgZW50cnkncyBsaW5lOiA4IE1pQi4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0ZJTEVfU0lOS19NQVhfRU5UUllfQllURVMgPSA4ICogMTAyNCAqIDEwMjQ7XG4vKiogVGhlIGRlZmF1bHQgY2FwIG9uIGJ5dGVzIGFjY2VwdGVkIGJ1dCBub3QgeWV0IHdyaXR0ZW46IDE2IE1pQi4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0ZJTEVfU0lOS19NQVhfUVVFVUVEX0JZVEVTID0gMTYgKiAxMDI0ICogMTAyNDtcbi8qKiBUaGUgZGVmYXVsdCBib3VuZCBvbiBgZmx1c2goKWA6IDEwIHMuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9GSUxFX1NJTktfRkxVU0hfVElNRU9VVF9NUyA9IDEwXzAwMDtcbi8qKiBIb3cgZmFyIHBhc3QgYG1heEJ5dGVzYCBhIENMT1NJTkcgZW50cnkgbWF5IHN0aWxsIGdvLCBzbyBhIGZ1bGwgZmlsZSBjYW4gc2F5IGhvdyB0aGUgcnVuIGVuZGVkOiA2NCBLaUIuICovXG5jb25zdCBDTE9TRV9SRVNFUlZFX0JZVEVTID0gNjQgKiAxMDI0O1xuLyoqIFRoZSBkZWZhdWx0IGNhcCBgcmVhZFJlY29yZEZpbGVgIHJlYWRzOiAyNTYgTWlCLiAqL1xuY29uc3QgREVGQVVMVF9SRUFEX01BWF9CWVRFUyA9IDI1NiAqIDEwMjQgKiAxMDI0O1xuXG4vKiogYGZpbGVTaW5rYCdzIG9wdGlvbnMg4oCUIGV2ZXJ5IHJlc291cmNlIHRoZSBzaW5rIGNhbiBzcGVuZCwgYm91bmRlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmlsZVNpbmtPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBtb3N0IGJ5dGVzIHRoZSBmaWxlIG1heSBob2xkICh0aGUgYnl0ZXMgYWxyZWFkeSBpbiBpdCBjb3VudCkuIE9uY2UgYW4gZW50cnkgd291bGQgcGFzcyBpdCwgdGhlIGZpbGUgaXMgRlVMTDpcbiAgICogdGhhdCBlbnRyeSBhbmQgZXZlcnkgbGF0ZXIgb25lIGlzIHJlZnVzZWQgYW5kIGNvdW50ZWQgYnkgdGhlIHJ1biwgbmV2ZXIgd3JpdHRlbiDigJQgZXhjZXB0IGEgY2xvc2luZyBlbnRyeSwgd2hpY2hcbiAgICogbWF5IHVzZSA2NCBLaUIgbW9yZSBzbyBhIGZ1bGwgZmlsZSBjYW4gc3RpbGwgc2F5IGhvdyB0aGUgcnVuIGVuZGVkLiBEZWZhdWx0IDY0IE1pQi5cbiAgICovXG4gIHJlYWRvbmx5IG1heEJ5dGVzPzogbnVtYmVyO1xuICAvKiogVGhlIGxhcmdlc3QgT05FIGVudHJ5J3MgbGluZSBtYXkgYmU7IGEgbGFyZ2VyIGVudHJ5IGlzIHJlZnVzZWQgd2hvbGUgKGBtYXhFbnRyeUJ5dGVzYCBuYW1lZCkuIERlZmF1bHQgOCBNaUIuICovXG4gIHJlYWRvbmx5IG1heEVudHJ5Qnl0ZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgbW9zdCBieXRlcyBhY2NlcHRlZCBhbmQgbm90IHlldCBvbiBkaXNrLiBXcml0ZXMgYXJlIGFzeW5jaHJvbm91cywgc28gYSBzaW5rIHNsb3dlciB0aGFuIHRoZSBydW4gcXVldWVzOyBwYXN0XG4gICAqIHRoaXMgYm91bmQgYW4gZW50cnkgaXMgRFJPUFBFRCBhbmQgY291bnRlZCAobmV2ZXIgYnVmZmVyZWQgd2l0aG91dCBsaW1pdCwgbmV2ZXIgYSBzdGFsbCkuIERlZmF1bHQgMTYgTWlCLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF4UXVldWVkQnl0ZXM/OiBudW1iZXI7XG4gIC8qKiBIb3cgbG9uZyBgZmx1c2goKWAgKGRyYWluIHRoZSBxdWV1ZSwgdGhlbiBgZnN5bmNgKSBtYXkgdGFrZSBiZWZvcmUgaXQgcmVqZWN0cy4gRGVmYXVsdCAxMCBzLiAqL1xuICByZWFkb25seSBmbHVzaFRpbWVvdXRNcz86IG51bWJlcjtcbn1cblxuLyoqIEEgcmVjb3JkIHNpbmsgdGhhdCBhcHBlbmRzIHRvIG9uZSBmaWxlIOKAlCBgUmVjb3JkU2lua2AgcGx1cyB3aGF0IHRoZSBhcHAgbmVlZHMgdG8gbWFuYWdlIHRoZSBmaWxlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWxlU2luayBleHRlbmRzIFJlY29yZFNpbmssIFBpY2s8Q2FwdHVyZUhpc3RvcnlPcHRpb25zLCAnYWNrbm93bGVkZ2UnPiB7XG4gIC8qKiBUaGUgYWJzb2x1dGUgcGF0aCB0aGUgc2luayB3cml0ZXMgdG8g4oCUIHJlc29sdmVkIG9uY2UsIHdoZW4gaXQgd2FzIG1hZGUuICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIEJ5dGVzIHRoaXMgc2luayBrbm93cyBhcmUgb24gZGlzazogdGhlIGZpbGUncyBzaXplIHdoZW4gaXQgb3BlbmVkIHBsdXMgZXZlcnkgYnl0ZSBpdHMgd3JpdGVzIGNvbXBsZXRlZCDigJQgYVxuICAgKiBydW5uaW5nIHN1bSwgbm90IHRoZSBmaWxlJ3MgZW5kICh3cml0ZXMgY29tcGxldGUgb3V0IG9mIG9yZGVyOyBhIGZhaWxlZCBvbmUgbGVhdmVzIGEgaG9sZSkuXG4gICAqL1xuICByZWFkb25seSBieXRlczogbnVtYmVyO1xuICAvKiogQnl0ZXMgYWNjZXB0ZWQgYW5kIG5vdCB5ZXQgd3JpdHRlbi4gKi9cbiAgcmVhZG9ubHkgcXVldWVkQnl0ZXM6IG51bWJlcjtcbiAgLyoqIGB0cnVlYCBvbmNlIGFuIGVudHJ5IHdhcyByZWZ1c2VkIGZvciBgbWF4Qnl0ZXNgOiB0aGUgZmlsZSBpcyBmdWxsLCBhbmQgb25seSBhIGNsb3NpbmcgZW50cnkgbWF5IHN0aWxsIGdvLiAqL1xuICByZWFkb25seSBmdWxsOiBib29sZWFuO1xuICAvKipcbiAgICogUmVsZWFzZSB0aGUgZmlsZS4gSWRlbXBvdGVudC4gRXZlcnkgZW50cnkgYWZ0ZXIgaXQgaXMgcmVmdXNlZCAodGhlIHJ1biBjb3VudHMgaXQpLCBhbmQgYGZsdXNoKClgIHJlamVjdHM7XG4gICAqIGVudHJpZXMgYWxyZWFkeSBhY2NlcHRlZCBhcmUgc3RpbGwgd3JpdHRlbiAoYW5kIGEgZmx1c2ggYWxyZWFkeSBzdGFydGVkIGZpbmlzaGVzKSwgdGhlbiB0aGUgZmlsZSBpcyBjbG9zZWQg4oCUXG4gICAqIHRoZSBwcm9taXNlIHNldHRsZXMgdGhlbi5cbiAgICovXG4gIGNsb3NlKCk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogQSByZWNvcmQgc2luayB0aGF0IGFwcGVuZHMgZWFjaCBlbnRyeSB0byBgcGF0aGAgYXMgb25lIEpTT04gbGluZSDigJQgdGhlIGNyYXNoLXNhZmUgcmVjb3JkIG9uIGEgTm9kZSBob3N0LlxuICpcbiAqIEV2ZXJ5IG1ldGhvZCByZXR1cm5zIGF0IG9uY2U6IHRoZSBsaW5lIGlzIGVuY29kZWQsIGNoZWNrZWQgYWdhaW5zdCBldmVyeSBib3VuZCwgZ2l2ZW4gaXRzIG9mZnNldCBhbmQgaGFuZGVkIHRvXG4gKiB0aGUgSS9PIHBvb2wuIFRoZSBtZXRob2QncyBwcm9taXNlIHNldHRsZXMgd2hlbiB0aGF0IGxpbmUgaXMgd3JpdHRlbjsgYSB3cml0ZSB0aGF0IGZhaWxzIHJlamVjdHMgaXQsIGFuZCB0aGUgcnVuXG4gKiBjb3VudHMgdGhlIGxvc3MuXG4gKlxuICogQHRocm93cyBUeXBlRXJyb3Igd2hlbiBgcGF0aGAgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBkb2VzIG5vdCBuYW1lIGEgcmVndWxhciBmaWxlIHRoZSB3cml0ZXIgb3ducyBhbG9uZTtcbiAqICAgUmFuZ2VFcnJvciBmb3IgYSBib3VuZCB0aGF0IGlzIG5vdCBhIHdob2xlIG51bWJlciDiiaUgMTsgdGhlIG9wZXJhdGluZyBzeXN0ZW0ncyBlcnJvciB3aGVuXG4gKiAgIHRoZSBmaWxlIGNhbm5vdCBiZSBvcGVuZWQgKGEgc3ltYm9saWMgbGluayBhdCBgcGF0aGAgaW5jbHVkZWQpLiBNYWRlIG9uY2UsIGF0IHNldHVwIOKAlCBuZXZlciBkdXJpbmcgYSBydW4uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGZpbGVTaW5rLCByZWFkUmVjb3JkRmlsZSB9IGZyb20gJ2Zvb3RwcmludGpzL3NpbmtzJztcbiAqIGltcG9ydCB7IHJlYWRTdG9yZWRSZWNvcmQgfSBmcm9tICdmb290dHJhY2UnO1xuICpcbiAqIGNvbnN0IHNpbmsgPSBmaWxlU2luaygnL3Zhci9mb290cHJpbnQvb3JkZXJzLmpzb25sJyk7XG4gKiBjb25zdCBleGVjdXRvciA9IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyBzaW5rIH0pO1xuICogYXdhaXQgZXhlY3V0b3IucnVuKHsgaW5wdXQgfSk7XG4gKiAvLyDigKZsYXRlciwgb3IgYWZ0ZXIgYSBjcmFzaDpcbiAqIGNvbnN0IHJlY29yZCA9IHJlYWRTdG9yZWRSZWNvcmQocmVhZFJlY29yZEZpbGUoJy92YXIvZm9vdHByaW50L29yZGVycy5qc29ubCcpLmVudHJpZXMpO1xuICogcmVjb3JkLnJvb3QocnVuSWQpPy5jb21wbGV0ZTsgLy8gZmFsc2UgZm9yIGEgcnVuIHRoYXQgbmV2ZXIgZW5kZWRcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsZVNpbmsocGF0aDogc3RyaW5nLCBvcHRpb25zPzogRmlsZVNpbmtPcHRpb25zKTogRmlsZVNpbmsge1xuICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnIHx8IHBhdGggPT09ICcnKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdmaWxlU2luazogcGF0aCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycpO1xuICBjb25zdCBtYXhCeXRlcyA9IGJvdW5kKCdtYXhCeXRlcycsIG9wdGlvbnM/Lm1heEJ5dGVzLCBERUZBVUxUX0ZJTEVfU0lOS19NQVhfQllURVMsIDEpO1xuICBjb25zdCBtYXhFbnRyeUJ5dGVzID0gYm91bmQoJ21heEVudHJ5Qnl0ZXMnLCBvcHRpb25zPy5tYXhFbnRyeUJ5dGVzLCBERUZBVUxUX0ZJTEVfU0lOS19NQVhfRU5UUllfQllURVMsIDEpO1xuICBjb25zdCBtYXhRdWV1ZWRCeXRlcyA9IGJvdW5kKCdtYXhRdWV1ZWRCeXRlcycsIG9wdGlvbnM/Lm1heFF1ZXVlZEJ5dGVzLCBERUZBVUxUX0ZJTEVfU0lOS19NQVhfUVVFVUVEX0JZVEVTLCAxKTtcbiAgY29uc3QgZmx1c2hUaW1lb3V0TXMgPSBib3VuZCgnZmx1c2hUaW1lb3V0TXMnLCBvcHRpb25zPy5mbHVzaFRpbWVvdXRNcywgREVGQVVMVF9GSUxFX1NJTktfRkxVU0hfVElNRU9VVF9NUywgMSk7XG4gIGNvbnN0IGFic29sdXRlID0gcmVzb2x2ZVBhdGgocGF0aCk7XG4gIC8vIE5PVCBgT19BUFBFTkRgOiBlYWNoIGVudHJ5IGlzIHdyaXR0ZW4gYXQgdGhlIG9mZnNldCBpdCB3YXMgZ2l2ZW4gd2hlbiBpdCB3YXMgcXVldWVkIChhIHBvc2l0aW9uYWwgd3JpdGUpLCBzb1xuICAvLyBldmVyeSBlbnRyeSBpcyBoYW5kZWQgdG8gdGhlIEkvTyBwb29sIHRoZSBtb21lbnQgaXQgaXMgYWNjZXB0ZWQg4oCUIG5vbmUgd2FpdHMgZm9yIHRoZSBldmVudCBsb29wIHRvIHR1cm4uXG4gIGNvbnN0IGZkID0gb3BlblN5bmMoYWJzb2x1dGUsIGNvbnN0YW50cy5PX1JEV1IgfCBjb25zdGFudHMuT19DUkVBVCB8IChjb25zdGFudHMuT19OT0ZPTExPVyA/PyAwKSwgMG82MDApO1xuICBsZXQgaWRlbnRpdHk6IHN0cmluZztcbiAgbGV0IHNpemU6IG51bWJlcjtcbiAgbGV0IG5lZWRzTmV3bGluZTogYm9vbGVhbjsgLy8gdGhlIGZpbGUgZW5kcyB3aXRoIGEgdG9ybiBsaW5lOiB0aGUgZmlyc3QgZW50cnkgc3RhcnRzIGEgbmV3IG9uZVxuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBmc3RhdFN5bmMoZmQpO1xuICAgIGlmICghc3RhdC5pc0ZpbGUoKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgZmlsZVNpbms6ICR7YWJzb2x1dGV9IGlzIG5vdCBhIHJlZ3VsYXIgZmlsZWApO1xuICAgIHJlZnVzZUZvcmVpZ24oYWJzb2x1dGUsIHN0YXQpO1xuICAgIGlkZW50aXR5ID0gYCR7c3RhdC5kZXZ9OiR7c3RhdC5pbm99YDtcbiAgICAvLyBPbmUgd3JpdGVyIHBlciBmaWxlLCBpbiB0aGlzIHByb2Nlc3M6IGEgc2Vjb25kIHNpbmsgd291bGQgcGxhY2UgaXRzIGVudHJpZXMgb3ZlciB0aGUgZmlyc3Qncy5cbiAgICBpZiAoT1BFTl9GSUxFUy5oYXMoaWRlbnRpdHkpKSB0aHJvdyBuZXcgVHlwZUVycm9yKGBmaWxlU2luazogJHthYnNvbHV0ZX0gYWxyZWFkeSBoYXMgYW4gb3BlbiBzaW5rIGluIHRoaXMgcHJvY2Vzc2ApO1xuICAgIHNpemUgPSBzdGF0LnNpemU7XG4gICAgbmVlZHNOZXdsaW5lID0gc2l6ZSA+IDAgJiYgIWVuZHNXaXRoTmV3bGluZShmZCwgc2l6ZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY2xvc2VTeW5jKGZkKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxuICBPUEVOX0ZJTEVTLmFkZChpZGVudGl0eSk7XG5cbiAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICBsZXQgbmV4dCA9IHNpemU7IC8vIHRoZSBvZmZzZXQgdGhlIG5leHQgYWNjZXB0ZWQgZW50cnkgaXMgd3JpdHRlbiBhdCDigJQgd2hhdCBgbWF4Qnl0ZXNgIGJvdW5kc1xuICBsZXQgd3JpdHRlbiA9IHNpemU7IC8vIGJ5dGVzIGtub3duIG9uIGRpc2tcbiAgbGV0IHF1ZXVlZEJ5dGVzID0gMDsgLy8gYWNjZXB0ZWQsIG5vdCB5ZXQgd3JpdHRlbiAoaW4gdGhlIEkvTyBwb29sJ3MgaGFuZHMpXG4gIGxldCBpbkZsaWdodCA9IDA7XG4gIGxldCBzeW5jaW5nID0gMDtcbiAgbGV0IGZ1bGwgPSBmYWxzZTtcbiAgbGV0IGNsb3NpbmcgPSBmYWxzZTtcbiAgbGV0IHJlbGVhc2VkID0gZmFsc2U7XG4gIGxldCBkcmFpbmVkOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuICBsZXQgY2xvc2VkU2lnbmFsOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHdoZW5SZWxlYXNlZCA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiAoY2xvc2VkU2lnbmFsID0gcmVzb2x2ZSkpO1xuXG4gIC8qKiBSZWxlYXNlIHRoZSBmaWxlIG9uY2Ugbm90aGluZyBpcyBpbiBmbGlnaHQgYW5kIG5vIGZzeW5jIGlzIHBlbmRpbmcg4oCUIGFzeW5jaHJvbm91c2x5OyBhbiBlcnJvciBpcyBpZ25vcmVkLiAqL1xuICBjb25zdCByZWxlYXNlSWZJZGxlID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmICghY2xvc2luZyB8fCByZWxlYXNlZCB8fCBpbkZsaWdodCA+IDAgfHwgc3luY2luZyA+IDApIHJldHVybjtcbiAgICByZWxlYXNlZCA9IHRydWU7XG4gICAgT1BFTl9GSUxFUy5kZWxldGUoaWRlbnRpdHkpO1xuICAgIGNsb3NlKGZkLCAoKSA9PiBjbG9zZWRTaWduYWw/LigpKTtcbiAgfTtcblxuICAvKiogRXZlcnl0aGluZyBhY2NlcHRlZCBpcyB3cml0dGVuOiBzdGFydCBlYWNoIHdhaXRpbmcgZmx1c2gncyBmc3luYywgdGhlbiByZWxlYXNlIGlmIGNsb3NpbmcuICovXG4gIGNvbnN0IHNldHRsZURyYWluZWQgPSAoKTogdm9pZCA9PiB7XG4gICAgaWYgKGluRmxpZ2h0ID4gMCkgcmV0dXJuO1xuICAgIGNvbnN0IHdhaXRpbmcgPSBkcmFpbmVkO1xuICAgIGRyYWluZWQgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHN0YXJ0IG9mIHdhaXRpbmcpIHN0YXJ0KCk7XG4gICAgcmVsZWFzZUlmSWRsZSgpO1xuICB9O1xuXG4gIC8qKiBPbmUgZW50cnk6IHJlZnVzZWQgd2hvbGUgd2l0aCBhIG5hbWVkIGJvdW5kICh0aGUgbG9nIGNvdW50cyBpdCksIG9yIHN1Ym1pdHRlZCDigJQgbmV2ZXIgaW4gcGFydCwgbmV2ZXIgYmxvY2tpbmcuICovXG4gIGNvbnN0IGVucXVldWUgPSAoZW50cnk6IFJlY29yZEVudHJ5KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKGNsb3NpbmcpIHRocm93IG5ldyBFcnJvcihgZmlsZVNpbms6ICR7YWJzb2x1dGV9IGlzIGNsb3NlZGApO1xuICAgIC8vIFRoZSBjaGVhcCByZWZ1c2FscyBmaXJzdDogYSBmdWxsIGZpbGUgb3IgYSBmdWxsIHF1ZXVlIGNvc3RzIG5vIGVuY29kaW5nLlxuICAgIGlmIChmdWxsICYmIGVudHJ5LmtpbmQgIT09ICdjbG9zZWQnKSB0aHJvdyBmaWxlRnVsbChhYnNvbHV0ZSwgbWF4Qnl0ZXMsIGVudHJ5LmtpbmQpO1xuICAgIC8vIEEgY2xvc2luZyBlbnRyeSBpcyBleGVtcHQgZnJvbSB0aGUgcXVldWUgYm91bmQgKGFzIGZyb20gYG1heEJ5dGVzYCwgd2l0aGluIGl0cyByZXNlcnZlKTogaG93IGEgbG9nIGVuZGVkIGlzXG4gICAgLy8gdGhlIG9uZSBlbnRyeSBhIGZ1bGwgcXVldWUgbXVzdCBub3QgZHJvcC5cbiAgICBjb25zdCBpc0Nsb3NpbmdFbnRyeSA9IGVudHJ5LmtpbmQgPT09ICdjbG9zZWQnO1xuICAgIGlmICghaXNDbG9zaW5nRW50cnkgJiYgcXVldWVkQnl0ZXMgPj0gbWF4UXVldWVkQnl0ZXMpXG4gICAgICB0aHJvdyBxdWV1ZUZ1bGwoYWJzb2x1dGUsIHF1ZXVlZEJ5dGVzLCBtYXhRdWV1ZWRCeXRlcywgZW50cnkua2luZCk7XG4gICAgY29uc3QganNvbiA9IEpTT04uc3RyaW5naWZ5KGVudHJ5KTsgLy8gYW4gZW50cnkgSlNPTiBjYW5ub3Qgd3JpdGUgKGEgQmlnSW50LCBhIGN5Y2xlKSB0aHJvd3MgaGVyZSwgd2hvbGVcbiAgICAvLyBBIHN0cmluZydzIGxlbmd0aCBuZXZlciBleGNlZWRzIGl0cyBVVEYtOCBzaXplOiBhbiBlbnRyeSBhbHJlYWR5IHRvbyBsb25nIGlzIHJlZnVzZWQgYmVmb3JlIGl0IGlzIGVuY29kZWQuXG4gICAgaWYgKGpzb24ubGVuZ3RoICsgMSA+IG1heEVudHJ5Qnl0ZXMpIHRocm93IHRvb0xhcmdlKGFic29sdXRlLCBlbnRyeS5raW5kLCBtYXhFbnRyeUJ5dGVzKTtcbiAgICBjb25zdCBlbmNvZGVkID0gZW5jb2Rlci5lbmNvZGUoYCR7bmVlZHNOZXdsaW5lID8gJ1xcbicgOiAnJ30ke2pzb259XFxuYCk7XG4gICAgaWYgKGVuY29kZWQubGVuZ3RoID4gbWF4RW50cnlCeXRlcyArIDEpIHRocm93IHRvb0xhcmdlKGFic29sdXRlLCBlbnRyeS5raW5kLCBtYXhFbnRyeUJ5dGVzKTtcbiAgICBjb25zdCBsaW1pdCA9IGVudHJ5LmtpbmQgPT09ICdjbG9zZWQnID8gbWF4Qnl0ZXMgKyBDTE9TRV9SRVNFUlZFX0JZVEVTIDogbWF4Qnl0ZXM7XG4gICAgaWYgKG5leHQgKyBlbmNvZGVkLmxlbmd0aCA+IGxpbWl0KSB7XG4gICAgICBpZiAoZW50cnkua2luZCAhPT0gJ2Nsb3NlZCcpIGZ1bGwgPSB0cnVlO1xuICAgICAgdGhyb3cgZmlsZUZ1bGwoYWJzb2x1dGUsIG1heEJ5dGVzLCBlbnRyeS5raW5kKTtcbiAgICB9XG4gICAgaWYgKCFpc0Nsb3NpbmdFbnRyeSAmJiBxdWV1ZWRCeXRlcyArIGVuY29kZWQubGVuZ3RoID4gbWF4UXVldWVkQnl0ZXMpIHtcbiAgICAgIHRocm93IHF1ZXVlRnVsbChhYnNvbHV0ZSwgcXVldWVkQnl0ZXMsIG1heFF1ZXVlZEJ5dGVzLCBlbnRyeS5raW5kKTtcbiAgICB9XG4gICAgbmVlZHNOZXdsaW5lID0gZmFsc2U7XG4gICAgY29uc3QgYXQgPSBuZXh0O1xuICAgIG5leHQgKz0gZW5jb2RlZC5sZW5ndGg7XG4gICAgcXVldWVkQnl0ZXMgKz0gZW5jb2RlZC5sZW5ndGg7XG4gICAgaW5GbGlnaHQgKz0gMTtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgd3JpdGVBdChmZCwgZW5jb2RlZCwgYXQsIChlcnJvciwgd3JvdGUpID0+IHtcbiAgICAgICAgaW5GbGlnaHQgLT0gMTtcbiAgICAgICAgcXVldWVkQnl0ZXMgLT0gZW5jb2RlZC5sZW5ndGg7XG4gICAgICAgIHdyaXR0ZW4gKz0gd3JvdGU7XG4gICAgICAgIC8vIEEgbGluZSBjdXQgc2hvcnQgbGVhdmVzIGEgaG9sZSB1cCB0byB0aGUgbmV4dCBlbnRyeSdzIG9mZnNldDogdGhlIHJlYWRlciBzcGxpdHMgYXQgaXQgKE5VTCksIHNvIGEgdG9yblxuICAgICAgICAvLyBsaW5lIG5ldmVyIHN3YWxsb3dzIHRoZSBlbnRyeSBhZnRlciBpdC5cbiAgICAgICAgaWYgKGVycm9yKSByZWplY3QoZXJyb3IpO1xuICAgICAgICBlbHNlIHJlc29sdmUoKTtcbiAgICAgICAgc2V0dGxlRHJhaW5lZCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgYWRhcHRlcjogRmlsZVNpbmsgPSB7XG4gICAgcGF0aDogYWJzb2x1dGUsXG4gICAgZ2V0IGJ5dGVzKCkge1xuICAgICAgcmV0dXJuIHdyaXR0ZW47XG4gICAgfSxcbiAgICBnZXQgcXVldWVkQnl0ZXMoKSB7XG4gICAgICByZXR1cm4gcXVldWVkQnl0ZXM7XG4gICAgfSxcbiAgICBnZXQgZnVsbCgpIHtcbiAgICAgIHJldHVybiBmdWxsO1xuICAgIH0sXG4gICAgb3BlbmVkOiAoeyBhZGRyZXNzLCBhdCwgaW5pdGlhbFN0YXRlLCBtZXRhIH0pID0+XG4gICAgICBlbnF1ZXVlKHsga2luZDogJ29wZW5lZCcsIGFkZHJlc3MsIGF0LCBpbml0aWFsU3RhdGUsIC4uLihtZXRhID09PSB1bmRlZmluZWQgPyB7fSA6IHsgbWV0YSB9KSB9KSxcbiAgICBjb21taXQ6ICh7IGFkZHJlc3MsIGF0LCBidW5kbGUgfSkgPT4gZW5xdWV1ZSh7IGtpbmQ6ICdjb21taXQnLCBhZGRyZXNzLCBhdCwgYnVuZGxlIH0pLFxuICAgIG5vdGU6ICh7IGFkZHJlc3MsIGF0LCBraW5kLCBkYXRhIH0pID0+IGVucXVldWUoeyBraW5kOiAnbm90ZScsIGFkZHJlc3MsIGF0LCBub3RlOiBraW5kLCBkYXRhIH0pLFxuICAgIGNsb3NlZDogKHsgYWRkcmVzcywgYXQsIG91dGNvbWUsIGNvbW1pdHMsIG1ldGEgfSkgPT5cbiAgICAgIGVucXVldWUoeyBraW5kOiAnY2xvc2VkJywgYWRkcmVzcywgYXQsIG91dGNvbWUsIGNvbW1pdHMsIC4uLihtZXRhID09PSB1bmRlZmluZWQgPyB7fSA6IHsgbWV0YSB9KSB9KSxcbiAgICAvLyBFeHBsaWNpdCBmaWxlIGNhcGFiaWxpdHk6IGZzeW5jIG9mIGFsbCBwcmVjZWRpbmcgZW50cmllcy4gVGhpcyBpcyBub3QgYXNzdW1lZCBmb3Igb3RoZXIgYWRhcHRlcnMuXG4gICAgYWNrbm93bGVkZ2U6IGFzeW5jICh0YXJnZXQpID0+IHtcbiAgICAgIGF3YWl0IGFkYXB0ZXIuZmx1c2ghKCk7XG4gICAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7IC4uLnRhcmdldCwgZHVyYWJpbGl0eTogJ2R1cmFibGUnIH0pO1xuICAgIH0sXG4gICAgZmx1c2g6ICgpID0+IHtcbiAgICAgIGlmIChjbG9zaW5nKSByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBmaWxlU2luazogJHthYnNvbHV0ZX0gaXMgY2xvc2VkYCkpO1xuICAgICAgY29uc3Qgd29yayA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgZHJhaW5lZC5wdXNoKCgpID0+IHtcbiAgICAgICAgICBzeW5jaW5nICs9IDE7XG4gICAgICAgICAgZnN5bmMoZmQsIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgIHN5bmNpbmcgLT0gMTtcbiAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgcmVsZWFzZUlmSWRsZSgpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBbm90aGVyIHdyaXRlciAoYW5vdGhlciBwcm9jZXNzIG9uIHRoZSBzYW1lIHBhdGgpIGdyZXcgdGhlIGZpbGUgcGFzdCB3aGF0IHRoaXMgc2luayBwbGFjZWQ6IGl0c1xuICAgICAgICAgICAgLy8gZW50cmllcyBhbmQgb3VycyBvdmVybGFwLiBTYWlkLCBuZXZlciBzaWxlbnQuXG4gICAgICAgICAgICBmc3RhdChmZCwgKHN0YXRFcnJvciwgc3RhdCkgPT4ge1xuICAgICAgICAgICAgICBzeW5jaW5nIC09IDE7XG4gICAgICAgICAgICAgIGlmIChzdGF0RXJyb3IpIHJlamVjdChzdGF0RXJyb3IpO1xuICAgICAgICAgICAgICBlbHNlIGlmIChzdGF0LnNpemUgPiBuZXh0KSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgZmlsZVNpbms6ICR7YWJzb2x1dGV9IHdhcyB3cml0dGVuIGJ5IGFub3RoZXIgd3JpdGVyIChvbmUgc2luayBwZXIgZmlsZSlgKSk7XG4gICAgICAgICAgICAgIH0gZWxzZSByZXNvbHZlKCk7XG4gICAgICAgICAgICAgIHJlbGVhc2VJZklkbGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgc2V0dGxlRHJhaW5lZCgpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gd2l0aFRpbWVvdXQoXG4gICAgICAgIHdvcmssXG4gICAgICAgIGZsdXNoVGltZW91dE1zLFxuICAgICAgICBgZmlsZVNpbms6IGZsdXNoKCkgb2YgJHthYnNvbHV0ZX0gZGlkIG5vdCBmaW5pc2ggaW4gJHtmbHVzaFRpbWVvdXRNc31tc2AsXG4gICAgICApO1xuICAgIH0sXG4gICAgY2xvc2U6ICgpID0+IHtcbiAgICAgIGlmICghY2xvc2luZykge1xuICAgICAgICBjbG9zaW5nID0gdHJ1ZTtcbiAgICAgICAgcmVsZWFzZUlmSWRsZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdoZW5SZWxlYXNlZDtcbiAgICB9LFxuICB9O1xuICByZXR1cm4gYWRhcHRlcjtcbn1cblxuLyoqXG4gKiBGaWxlcyBhIHNpbmsgb2YgdGhpcyBwcm9jZXNzIGhhcyBvcGVuLCBieSBkZXZpY2UgYW5kIGlub2RlIOKAlCBvbmUgd3JpdGVyIHBlciBmaWxlLiBLZXB0IG9uIHRoZSBnbG9iYWwgb2JqZWN0LCBzb1xuICogdGhlIHBhY2thZ2UncyBDb21tb25KUyBhbmQgRVNNIGJ1aWxkcyAodHdvIG1vZHVsZSBpbnN0YW5jZXMgaW4gb25lIHByb2Nlc3MpIHNoYXJlIGl0LlxuICovXG5jb25zdCBPUEVOX0ZJTEVTOiBTZXQ8c3RyaW5nPiA9ICgoZ2xvYmFsVGhpcyBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbU3ltYm9sLmZvcignZm9vdHByaW50anMuZmlsZVNpbmsub3BlbicpXSA/Pz1cbiAgbmV3IFNldDxzdHJpbmc+KCkpIGFzIFNldDxzdHJpbmc+O1xuXG5mdW5jdGlvbiBmaWxlRnVsbChwYXRoOiBzdHJpbmcsIG1heEJ5dGVzOiBudW1iZXIsIGtpbmQ6IHN0cmluZyk6IFJhbmdlRXJyb3Ige1xuICByZXR1cm4gbmV3IFJhbmdlRXJyb3IoYGZpbGVTaW5rOiAke3BhdGh9IGlzIGZ1bGwgKG1heEJ5dGVzICR7bWF4Qnl0ZXN9KTsgdGhpcyAke2tpbmR9IGVudHJ5IHdhcyBub3Qgd3JpdHRlbmApO1xufVxuXG5mdW5jdGlvbiBxdWV1ZUZ1bGwocGF0aDogc3RyaW5nLCBxdWV1ZWQ6IG51bWJlciwgbWF4UXVldWVkQnl0ZXM6IG51bWJlciwga2luZDogc3RyaW5nKTogUmFuZ2VFcnJvciB7XG4gIHJldHVybiBuZXcgUmFuZ2VFcnJvcihcbiAgICBgZmlsZVNpbms6ICR7cGF0aH0gaGFzICR7cXVldWVkfSBieXRlcyB3YWl0aW5nIChtYXhRdWV1ZWRCeXRlcyAke21heFF1ZXVlZEJ5dGVzfSk7IHRoaXMgJHtraW5kfSBlbnRyeSB3YXMgZHJvcHBlZGAsXG4gICk7XG59XG5cbi8qKiBBIGJvdW5kIHJlYWQgb2ZmIHRoZSBvcHRpb25zOiBhYnNlbnQg4oaSIHRoZSBkZWZhdWx0OyBlbHNlIGEgd2hvbGUgbnVtYmVyIOKJpSBgbWluYCwgb3IgYSBSYW5nZUVycm9yIG5hbWluZyBpdC4gKi9cbmZ1bmN0aW9uIGJvdW5kKG5hbWU6IHN0cmluZywgdmFsdWU6IG51bWJlciB8IHVuZGVmaW5lZCwgZmFsbGJhY2s6IG51bWJlciwgbWluOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZhbGxiYWNrO1xuICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHZhbHVlKSB8fCB2YWx1ZSA8IG1pbikge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBmaWxlU2luazogJHtuYW1lfSBtdXN0IGJlIGEgd2hvbGUgbnVtYmVyLCBhdCBsZWFzdCAke21pbn1gKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHRvb0xhcmdlKHBhdGg6IHN0cmluZywga2luZDogc3RyaW5nLCBtYXhFbnRyeUJ5dGVzOiBudW1iZXIpOiBSYW5nZUVycm9yIHtcbiAgcmV0dXJuIG5ldyBSYW5nZUVycm9yKFxuICAgIGBmaWxlU2luazogYSAke2tpbmR9IGVudHJ5IGxhcmdlciB0aGFuIG1heEVudHJ5Qnl0ZXMgKCR7bWF4RW50cnlCeXRlc30pIHdhcyBub3Qgd3JpdHRlbiB0byAke3BhdGh9YCxcbiAgKTtcbn1cblxuLyoqIFdyaXRlIGFsbCBvZiBgYnVmZmVyYCBhdCBgcG9zaXRpb25gIChhc3luY2hyb25vdXNseSwgYXMgbWFueSB3cml0ZXMgYXMgaXQgdGFrZXMpOyBgd3JvdGVgIGlzIGhvdyBtdWNoIHdlbnQgb3V0LiAqL1xuZnVuY3Rpb24gd3JpdGVBdChcbiAgZmQ6IG51bWJlcixcbiAgYnVmZmVyOiBVaW50OEFycmF5LFxuICBwb3NpdGlvbjogbnVtYmVyLFxuICBkb25lOiAoZXJyb3I6IEVycm9yIHwgbnVsbCwgd3JvdGU6IG51bWJlcikgPT4gdm9pZCxcbik6IHZvaWQge1xuICBjb25zdCBzdGVwID0gKG9mZnNldDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgd3JpdGUoZmQsIGJ1ZmZlciwgb2Zmc2V0LCBidWZmZXIubGVuZ3RoIC0gb2Zmc2V0LCBwb3NpdGlvbiArIG9mZnNldCwgKGVycm9yLCBuKSA9PiB7XG4gICAgICBpZiAoZXJyb3IpIGRvbmUoZXJyb3IsIG9mZnNldCk7XG4gICAgICBlbHNlIGlmIChuID09PSAwKSBkb25lKG5ldyBFcnJvcignZmlsZVNpbms6IHRoZSBkaXNrIHRvb2sgbm8gYnl0ZXMnKSwgb2Zmc2V0KTtcbiAgICAgIGVsc2UgaWYgKG9mZnNldCArIG4gPCBidWZmZXIubGVuZ3RoKSBzdGVwKG9mZnNldCArIG4pO1xuICAgICAgZWxzZSBkb25lKG51bGwsIGJ1ZmZlci5sZW5ndGgpO1xuICAgIH0pO1xuICB9O1xuICBzdGVwKDApO1xufVxuXG4vKiogYHdvcmtgLCBvciBhIHJlamVjdGlvbiBuYW1pbmcgdGhlIGJvdW5kIG9uY2UgYG1zYCBwYXNzZWQg4oCUIHRoZSB3b3JrIGdvZXMgb24sIG5vYm9keSB3YWl0cyBmb3IgaXQuICovXG5mdW5jdGlvbiB3aXRoVGltZW91dCh3b3JrOiBQcm9taXNlPHZvaWQ+LCBtczogbnVtYmVyLCBtZXNzYWdlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihtZXNzYWdlKSksIG1zKTtcbiAgICAvLyBBIHRpbWVyIHRoYXQgb25seSBib3VuZHMgYSB3YWl0IG5ldmVyIGtlZXBzIHRoZSBwcm9jZXNzIGFsaXZlIG9uIGl0cyBvd24uXG4gICAgKHRpbWVyIGFzIHsgdW5yZWY/OiAoKSA9PiB2b2lkIH0pLnVucmVmPy4oKTtcbiAgICBQcm9taXNlLnByb3RvdHlwZS50aGVuLmNhbGwoXG4gICAgICB3b3JrLFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9LFxuICAgICAgKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9LFxuICAgICk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlZnVzZSBhIGZpbGUgc29tZW9uZSBlbHNlIGNvdWxkIHJlYWQgb3IgcmV3cml0ZSBiZWhpbmQgdGhlIHNpbms6IGEgaGFyZCBsaW5rIChhbm90aGVyIG5hbWUgZm9yIHRoZSBzYW1lIGJ5dGVzIOKAlFxuICogdGhlIHNpbmsgd291bGQgYXBwZW5kIGludG8gaXQpLCBhIGZpbGUgb3duZWQgYnkgYW5vdGhlciB1c2VyLCBvciBvbmUgb3RoZXJzIG1heSB3cml0ZS4gQSBmaWxlIHRoZSBzaW5rIGNyZWF0ZXMgaXNcbiAqIGAwbzYwMGAgYW5kIHBhc3NlczsgYSBwcmUtZXhpc3Rpbmcgb25lIG11c3QgYWxyZWFkeSBiZSBwcml2YXRlIHRvIHRoZSB3cml0ZXIuIChOb3Qgb24gV2luZG93cywgd2hvc2UgbW9kZXMgYW5kXG4gKiBvd25lcnMgZG8gbm90IG1hcDogdGhlcmUgYE9fTk9GT0xMT1dgIGlzIGFic2VudCB0b28g4oCUIHRoZSBndWlkZSBuYW1lcyBib3RoLilcbiAqL1xuZnVuY3Rpb24gcmVmdXNlRm9yZWlnbihwYXRoOiBzdHJpbmcsIHN0YXQ6IHsgcmVhZG9ubHkgbmxpbms6IG51bWJlcjsgcmVhZG9ubHkgdWlkOiBudW1iZXI7IHJlYWRvbmx5IG1vZGU6IG51bWJlciB9KSB7XG4gIGlmIChzdGF0Lm5saW5rID4gMSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgZmlsZVNpbms6ICR7cGF0aH0gaGFzIG90aGVyIGhhcmQgbGlua3Mg4oCUIHJlZnVzaW5nIHRvIHdyaXRlIHRocm91Z2ggb25lYCk7XG4gIGNvbnN0IHVpZCA9IHR5cGVvZiBnZXR1aWQgPT09ICdmdW5jdGlvbicgPyBnZXR1aWQoKSA6IHVuZGVmaW5lZDtcbiAgaWYgKHVpZCAhPT0gdW5kZWZpbmVkICYmIHN0YXQudWlkICE9PSB1aWQpIHRocm93IG5ldyBUeXBlRXJyb3IoYGZpbGVTaW5rOiAke3BhdGh9IGJlbG9uZ3MgdG8gYW5vdGhlciB1c2VyYCk7XG4gIGlmICh1aWQgIT09IHVuZGVmaW5lZCAmJiAoc3RhdC5tb2RlICYgMG8wMjIpICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgZmlsZVNpbms6ICR7cGF0aH0gaXMgd3JpdGFibGUgYnkgb3RoZXJzIOKAlCBtYWtlIGl0IDBvNjAwIChvciByZW1vdmUgaXQpIGZpcnN0YCk7XG4gIH1cbn1cblxuLyoqIFdoZXRoZXIgdGhlIGZpbGUncyBsYXN0IGJ5dGUgaXMgYSBuZXdsaW5lIOKAlCByZWFkIG9uY2UsIHdoZW4gdGhlIHNpbmsgb3BlbnMgYW4gZXhpc3RpbmcgZmlsZS4gKi9cbmZ1bmN0aW9uIGVuZHNXaXRoTmV3bGluZShmZDogbnVtYmVyLCBzaXplOiBudW1iZXIpOiBib29sZWFuIHtcbiAgY29uc3QgbGFzdCA9IG5ldyBVaW50OEFycmF5KDEpO1xuICByZXR1cm4gcmVhZFN5bmMoZmQsIGxhc3QsIDAsIDEsIHNpemUgLSAxKSA9PT0gMSAmJiBsYXN0WzBdID09PSAweDBhO1xufVxuXG4vKiogQSByZWNvcmQgZmlsZSByZWFkIGJhY2s6IGV2ZXJ5IHBhcnNlZCBsaW5lLCBhbmQgZXZlcnkgbGluZSB0aGF0IGNvdWxkIG5vdCBiZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3JkRmlsZSB7XG4gIC8qKiBUaGUgcGFyc2VkIGVudHJpZXMsIGluIGZpbGUgb3JkZXIg4oCUIHVudHJ1c3RlZCBpbnB1dCBmb3IgYHJlYWRTdG9yZWRSZWNvcmRgIChgZm9vdHRyYWNlYCkuICovXG4gIHJlYWRvbmx5IGVudHJpZXM6IHJlYWRvbmx5IHVua25vd25bXTtcbiAgLyoqIEVhY2ggbGluZSB0aGF0IGlzIG5vdCBKU09OIChhIHRvcm4gbGFzdCBsaW5lLCBhIGNvcnJ1cHQgb25lKSwgYnkgaXRzIDEtYmFzZWQgbnVtYmVyLiBCbGFuayBsaW5lcyBhcmUgc2tpcHBlZC4gKi9cbiAgcmVhZG9ubHkgdW5yZWFkYWJsZTogcmVhZG9ubHkgeyByZWFkb25seSBsaW5lOiBudW1iZXI7IHJlYWRvbmx5IHJlYXNvbjogc3RyaW5nIH1bXTtcbn1cblxuLyoqXG4gKiBSZWFkIGEgcmVjb3JkIGZpbGUgYmFjaywgbGluZSBieSBsaW5lIOKAlCB0aGUgZW50cmllcyBmb3IgYHJlYWRTdG9yZWRSZWNvcmRgLCBhbmQgZXZlcnkgbGluZSB0aGF0IGNvdWxkIG5vdCBiZVxuICogcmVhZCwgYnkgbnVtYmVyLCBuZXZlciBhIGZhaWxlZCByZWFkLiBBIHN0b3JlZCBrZXkgbmFtZWQgYF9fcHJvdG9fX2Agc3RheXMgZGF0YSAoYEpTT04ucGFyc2VgIG1ha2VzIGl0IGFuIG93blxuICogcHJvcGVydHkpLiBUaGUgZmlsZSBpcyB1bnRydXN0ZWQ6IGEgZmlsZSBsYXJnZXIgdGhhbiBgbWF4Qnl0ZXNgIChkZWZhdWx0IDI1NiBNaUIpIGlzIHJlZnVzZWQgYmVmb3JlIGl0IGlzIHJlYWQuXG4gKlxuICogQHRocm93cyBSYW5nZUVycm9yIHdoZW4gdGhlIGZpbGUgaXMgbGFyZ2VyIHRoYW4gYG1heEJ5dGVzYDsgdGhlIG9wZXJhdGluZyBzeXN0ZW0ncyBlcnJvciB3aGVuIGl0IGNhbm5vdCBiZSByZWFkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZFJlY29yZEZpbGUocGF0aDogc3RyaW5nLCBvcHRpb25zPzogeyByZWFkb25seSBtYXhCeXRlcz86IG51bWJlciB9KTogUmVjb3JkRmlsZSB7XG4gIGlmICh0eXBlb2YgcGF0aCAhPT0gJ3N0cmluZycgfHwgcGF0aCA9PT0gJycpIHRocm93IG5ldyBUeXBlRXJyb3IoJ3JlYWRSZWNvcmRGaWxlOiBwYXRoIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gIGNvbnN0IG1heEJ5dGVzID0gYm91bmQoJ21heEJ5dGVzJywgb3B0aW9ucz8ubWF4Qnl0ZXMsIERFRkFVTFRfUkVBRF9NQVhfQllURVMsIDEpO1xuICAvLyBPbmUgZGVzY3JpcHRvciBmb3IgdGhlIGNoZWNrIEFORCB0aGUgcmVhZCAoYSBmaWxlIHRoYXQgZ3Jvd3MgYmV0d2VlbiB0aGVtIGlzIHN0aWxsIGJvdW5kZWQpOyBhIHJlZ3VsYXIgZmlsZVxuICAvLyBvbmx5IChhIEZJRk8gd291bGQgYmxvY2ssIGEgZGV2aWNlIG5ldmVyIGVuZCk7IGF0IG1vc3QgYG1heEJ5dGVzYCByZWFkLlxuICAvLyBPX05PTkJMT0NLOiBhIEZJRk8gYXQgdGhlIHBhdGggbXVzdCBub3QgYmxvY2sgdGhlIG9wZW4gYmVmb3JlIHRoZSByZWd1bGFyLWZpbGUgY2hlY2sgcmVmdXNlcyBpdC5cbiAgY29uc3QgZmQgPSBvcGVuU3luYyhwYXRoLCBjb25zdGFudHMuT19SRE9OTFkgfCAoY29uc3RhbnRzLk9fTk9GT0xMT1cgPz8gMCkgfCAoY29uc3RhbnRzLk9fTk9OQkxPQ0sgPz8gMCkpO1xuICBsZXQgcmF3OiBVaW50OEFycmF5O1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXQgPSBmc3RhdFN5bmMoZmQpO1xuICAgIGlmICghc3RhdC5pc0ZpbGUoKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihgcmVhZFJlY29yZEZpbGU6ICR7cGF0aH0gaXMgbm90IGEgcmVndWxhciBmaWxlYCk7XG4gICAgaWYgKHN0YXQuc2l6ZSA+IG1heEJ5dGVzKSB7XG4gICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgcmVhZFJlY29yZEZpbGU6ICR7cGF0aH0gaG9sZHMgJHtzdGF0LnNpemV9IGJ5dGVzLCBwYXN0IHRoZSBsaW1pdCBvZiAke21heEJ5dGVzfWApO1xuICAgIH1cbiAgICBjb25zdCBidWZmZXIgPSBuZXcgVWludDhBcnJheShNYXRoLm1pbihzdGF0LnNpemUsIG1heEJ5dGVzKSArIDEpO1xuICAgIGxldCByZWFkID0gMDtcbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCBuID0gcmVhZFN5bmMoZmQsIGJ1ZmZlciwgcmVhZCwgYnVmZmVyLmxlbmd0aCAtIHJlYWQsIHJlYWQpO1xuICAgICAgaWYgKG4gPT09IDApIGJyZWFrO1xuICAgICAgcmVhZCArPSBuO1xuICAgICAgaWYgKHJlYWQgPT09IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYHJlYWRSZWNvcmRGaWxlOiAke3BhdGh9IGdyZXcgcGFzdCB0aGUgbGltaXQgb2YgJHttYXhCeXRlc30gYnl0ZXMgd2hpbGUgYmVpbmcgcmVhZGApO1xuICAgICAgfVxuICAgIH1cbiAgICByYXcgPSBidWZmZXIuc3ViYXJyYXkoMCwgcmVhZCk7XG4gIH0gZmluYWxseSB7XG4gICAgY2xvc2VTeW5jKGZkKTtcbiAgfVxuICBjb25zdCB0ZXh0ID0gbmV3IFRleHREZWNvZGVyKCd1dGYtOCcpLmRlY29kZShyYXcpO1xuICBjb25zdCBlbnRyaWVzOiB1bmtub3duW10gPSBbXTtcbiAgY29uc3QgdW5yZWFkYWJsZTogeyBsaW5lOiBudW1iZXI7IHJlYXNvbjogc3RyaW5nIH1bXSA9IFtdO1xuICBjb25zdCBsaW5lcyA9IHRleHQuc3BsaXQoJ1xcbicpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gQSBydW4gb2YgTlVMIGJ5dGVzIGlzIGEgaG9sZSBhIGN1dC1zaG9ydCB3cml0ZSBsZWZ0IGJlZm9yZSB0aGUgbmV4dCBlbnRyeSdzIG9mZnNldDogaXQgZW5kcyB0aGUgdG9ybiBwYXJ0LFxuICAgIC8vIHNvIHRoZSBlbnRyeSBhZnRlciBpdCByZWFkcyBvbiBpdHMgb3duICh0aGUgc2FtZSBsaW5lIG51bWJlciBuYW1lcyBib3RoIHBpZWNlcykuXG4gICAgY29uc3QgbGluZSA9IGxpbmVzW2ldO1xuICAgIC8vIEEgaG9sZSBpcyByZXBvcnRlZCwgbmV2ZXIgc2tpcHBlZDogYnl0ZXMgdGhhdCBuZXZlciByZWFjaGVkIHRoZSBkaXNrIG1heSBiZSBhIHdob2xlIGVudHJ5IGxvc3QgbWlkLWZpbGUuXG4gICAgaWYgKGxpbmUuaW5jbHVkZXMoJ1xcMCcpKSB1bnJlYWRhYmxlLnB1c2goeyBsaW5lOiBpICsgMSwgcmVhc29uOiAnYSBob2xlIOKAlCBieXRlcyB0aGF0IG5ldmVyIHJlYWNoZWQgdGhlIGRpc2snIH0pO1xuICAgIGZvciAoY29uc3QgcGllY2Ugb2YgbGluZS5zcGxpdCgvXFwwKy8pKSB7XG4gICAgICBpZiAocGllY2UudHJpbSgpID09PSAnJykgY29udGludWU7XG4gICAgICB0cnkge1xuICAgICAgICBlbnRyaWVzLnB1c2goSlNPTi5wYXJzZShwaWVjZSkpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHVucmVhZGFibGUucHVzaCh7IGxpbmU6IGkgKyAxLCByZWFzb246ICdub3QgSlNPTiDigJQgYSB0b3JuIG9yIGNvcnJ1cHQgbGluZScgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7IGVudHJpZXMsIHVucmVhZGFibGUgfTtcbn1cbiJdfQ==
package/dist/trace.js CHANGED
@@ -7,7 +7,7 @@
7
7
  * observer tools. Record symbols are never re-exported across the package boundary.
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.topologyRecorder = exports.TopologyRecorder = exports.SequenceStore = exports.qualityTrace = exports.formatQualityTrace = exports.QualityRecorder = exports.KeyedStore = exports.ROOT_SUBFLOW_ID = exports.ROOT_RUNTIME_STAGE_ID = exports.inOutRecorder = exports.InOutRecorder = exports.controlDepRecorder = exports.ControlDepRecorder = exports.BoundaryStateStore = exports.parseBranchSegment = exports.isBranchSegment = exports.hasBranchSegmentMarker = exports.buildBranchSegment = exports.BRANCH_SEGMENT_MARKER = exports.walkSubflowSpec = void 0;
10
+ exports.readStoredCapture = exports.topologyRecorder = exports.TopologyRecorder = exports.SequenceStore = exports.qualityTrace = exports.formatQualityTrace = exports.QualityRecorder = exports.KeyedStore = exports.ROOT_SUBFLOW_ID = exports.ROOT_RUNTIME_STAGE_ID = exports.inOutRecorder = exports.InOutRecorder = exports.controlDepRecorder = exports.ControlDepRecorder = exports.BoundaryStateStore = exports.parseBranchSegment = exports.isBranchSegment = exports.hasBranchSegmentMarker = exports.buildBranchSegment = exports.BRANCH_SEGMENT_MARKER = exports.walkSubflowSpec = void 0;
11
11
  var walkSubflowSpec_js_1 = require("./lib/engine/walkSubflowSpec.js");
12
12
  Object.defineProperty(exports, "walkSubflowSpec", { enumerable: true, get: function () { return walkSubflowSpec_js_1.walkSubflowSpec; } });
13
13
  var branchSegment_js_1 = require("./lib/ids/branchSegment.js");
@@ -38,4 +38,6 @@ Object.defineProperty(exports, "SequenceStore", { enumerable: true, get: functio
38
38
  var TopologyRecorder_js_1 = require("./lib/recorder/TopologyRecorder.js");
39
39
  Object.defineProperty(exports, "TopologyRecorder", { enumerable: true, get: function () { return TopologyRecorder_js_1.TopologyRecorder; } });
40
40
  Object.defineProperty(exports, "topologyRecorder", { enumerable: true, get: function () { return TopologyRecorder_js_1.topologyRecorder; } });
41
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHJhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7R0FNRzs7O0FBR0gsc0VBQWtFO0FBQXpELHFIQUFBLGVBQWUsT0FBQTtBQUN4QiwrREFNb0M7QUFMbEMseUhBQUEscUJBQXFCLE9BQUE7QUFDckIsc0hBQUEsa0JBQWtCLE9BQUE7QUFDbEIsMEhBQUEsc0JBQXNCLE9BQUE7QUFDdEIsbUhBQUEsZUFBZSxPQUFBO0FBQ2Ysc0hBQUEsa0JBQWtCLE9BQUE7QUFFcEIsOEVBQTBFO0FBQWpFLDJIQUFBLGtCQUFrQixPQUFBO0FBRTNCLDhFQUE4RjtBQUFyRiwySEFBQSxrQkFBa0IsT0FBQTtBQUFFLDJIQUFBLGtCQUFrQixPQUFBO0FBRS9DLG9FQUF1SDtBQUE5RyxpSEFBQSxhQUFhLE9BQUE7QUFBRSxpSEFBQSxhQUFhLE9BQUE7QUFBRSx5SEFBQSxxQkFBcUIsT0FBQTtBQUFFLG1IQUFBLGVBQWUsT0FBQTtBQUM3RSw4REFBMEQ7QUFBakQsMkdBQUEsVUFBVSxPQUFBO0FBRW5CLHdFQUFvRTtBQUEzRCxxSEFBQSxlQUFlLE9BQUE7QUFFeEIsa0VBQWtGO0FBQXpFLHFIQUFBLGtCQUFrQixPQUFBO0FBQUUsK0dBQUEsWUFBWSxPQUFBO0FBQ3pDLG9FQUFnRTtBQUF2RCxpSEFBQSxhQUFhLE9BQUE7QUFTdEIsMEVBQXdGO0FBQS9FLHVIQUFBLGdCQUFnQixPQUFBO0FBQUUsdUhBQUEsZ0JBQWdCLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGZvb3RwcmludGpzL3RyYWNlIOKAlCByZWNvcmRlciBzdG9yZXMsIHRvcG9sb2d5LCBjaGFydCBib3VuZGFyaWVzIGFuZCBjb250cm9sIGRlcGVuZGVuY2llcy5cbiAqXG4gKiBSZWNvcmQgcmVhZGVycywgdHlwZXMgYW5kIHJ1bnRpbWUtSUQgZ3JhbW1hciBiZWxvbmcgdG8gYGZvb3R0cmFjZWA7IHJlY29yZCBwYXRoIGhlbHBlcnMgYmVsb25nXG4gKiB0byBgZm9vdHRyYWNlL3BhdGhzYCwgYW5kIHJlY29yZCB3cml0ZXJzIHRvIGBmb290dHJhY2Uvd3JpdGVgLiBUaGlzIGRvb3IgZXhwb3J0cyBvbmx5IGVuZ2luZS1vd25lZFxuICogb2JzZXJ2ZXIgdG9vbHMuIFJlY29yZCBzeW1ib2xzIGFyZSBuZXZlciByZS1leHBvcnRlZCBhY3Jvc3MgdGhlIHBhY2thZ2UgYm91bmRhcnkuXG4gKi9cblxuZXhwb3J0IHR5cGUgeyBXYWxrZXJJdGVtLCBXYWxrZXJPcHRpb25zIH0gZnJvbSAnLi9saWIvZW5naW5lL3dhbGtTdWJmbG93U3BlYy5qcyc7XG5leHBvcnQgeyB3YWxrU3ViZmxvd1NwZWMgfSBmcm9tICcuL2xpYi9lbmdpbmUvd2Fsa1N1YmZsb3dTcGVjLmpzJztcbmV4cG9ydCB7XG4gIEJSQU5DSF9TRUdNRU5UX01BUktFUixcbiAgYnVpbGRCcmFuY2hTZWdtZW50LFxuICBoYXNCcmFuY2hTZWdtZW50TWFya2VyLFxuICBpc0JyYW5jaFNlZ21lbnQsXG4gIHBhcnNlQnJhbmNoU2VnbWVudCxcbn0gZnJvbSAnLi9saWIvaWRzL2JyYW5jaFNlZ21lbnQuanMnO1xuZXhwb3J0IHsgQm91bmRhcnlTdGF0ZVN0b3JlIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvQm91bmRhcnlTdGF0ZVN0b3JlLmpzJztcbmV4cG9ydCB0eXBlIHsgQ29udHJvbERlY2lzaW9uUmVjb3JkLCBDb250cm9sRGVwUmVjb3JkZXJPcHRpb25zIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvQ29udHJvbERlcFJlY29yZGVyLmpzJztcbmV4cG9ydCB7IENvbnRyb2xEZXBSZWNvcmRlciwgY29udHJvbERlcFJlY29yZGVyIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvQ29udHJvbERlcFJlY29yZGVyLmpzJztcbmV4cG9ydCB0eXBlIHsgSW5PdXRBdHRlbXB0cywgSW5PdXRFbnRyeSwgSW5PdXRQaGFzZSwgSW5PdXRSZWNvcmRlck9wdGlvbnMgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9Jbk91dFJlY29yZGVyLmpzJztcbmV4cG9ydCB7IEluT3V0UmVjb3JkZXIsIGluT3V0UmVjb3JkZXIsIFJPT1RfUlVOVElNRV9TVEFHRV9JRCwgUk9PVF9TVUJGTE9XX0lEIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvSW5PdXRSZWNvcmRlci5qcyc7XG5leHBvcnQgeyBLZXllZFN0b3JlIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvS2V5ZWRTdG9yZS5qcyc7XG5leHBvcnQgdHlwZSB7IFF1YWxpdHlFbnRyeSwgUXVhbGl0eVJlY29yZGVyT3B0aW9ucywgUXVhbGl0eVNjb3JpbmdGbiB9IGZyb20gJy4vbGliL3JlY29yZGVyL1F1YWxpdHlSZWNvcmRlci5qcyc7XG5leHBvcnQgeyBRdWFsaXR5UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9RdWFsaXR5UmVjb3JkZXIuanMnO1xuZXhwb3J0IHR5cGUgeyBRdWFsaXR5RnJhbWUsIFF1YWxpdHlTdGFja1RyYWNlIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvcXVhbGl0eVRyYWNlLmpzJztcbmV4cG9ydCB7IGZvcm1hdFF1YWxpdHlUcmFjZSwgcXVhbGl0eVRyYWNlIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvcXVhbGl0eVRyYWNlLmpzJztcbmV4cG9ydCB7IFNlcXVlbmNlU3RvcmUgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9TZXF1ZW5jZVN0b3JlLmpzJztcbmV4cG9ydCB0eXBlIHtcbiAgVG9wb2xvZ3ksXG4gIFRvcG9sb2d5RWRnZSxcbiAgVG9wb2xvZ3lJbmNvbWluZ0tpbmQsXG4gIFRvcG9sb2d5Tm9kZSxcbiAgVG9wb2xvZ3lOb2RlS2luZCxcbiAgVG9wb2xvZ3lSZWNvcmRlck9wdGlvbnMsXG59IGZyb20gJy4vbGliL3JlY29yZGVyL1RvcG9sb2d5UmVjb3JkZXIuanMnO1xuZXhwb3J0IHsgVG9wb2xvZ3lSZWNvcmRlciwgdG9wb2xvZ3lSZWNvcmRlciB9IGZyb20gJy4vbGliL3JlY29yZGVyL1RvcG9sb2d5UmVjb3JkZXIuanMnO1xuIl19
41
+ var readStoredCapture_js_1 = require("./lib/runner/readStoredCapture.js");
42
+ Object.defineProperty(exports, "readStoredCapture", { enumerable: true, get: function () { return readStoredCapture_js_1.readStoredCapture; } });
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHJhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7R0FNRzs7O0FBR0gsc0VBQWtFO0FBQXpELHFIQUFBLGVBQWUsT0FBQTtBQUN4QiwrREFNb0M7QUFMbEMseUhBQUEscUJBQXFCLE9BQUE7QUFDckIsc0hBQUEsa0JBQWtCLE9BQUE7QUFDbEIsMEhBQUEsc0JBQXNCLE9BQUE7QUFDdEIsbUhBQUEsZUFBZSxPQUFBO0FBQ2Ysc0hBQUEsa0JBQWtCLE9BQUE7QUFFcEIsOEVBQTBFO0FBQWpFLDJIQUFBLGtCQUFrQixPQUFBO0FBRTNCLDhFQUE4RjtBQUFyRiwySEFBQSxrQkFBa0IsT0FBQTtBQUFFLDJIQUFBLGtCQUFrQixPQUFBO0FBRS9DLG9FQUF1SDtBQUE5RyxpSEFBQSxhQUFhLE9BQUE7QUFBRSxpSEFBQSxhQUFhLE9BQUE7QUFBRSx5SEFBQSxxQkFBcUIsT0FBQTtBQUFFLG1IQUFBLGVBQWUsT0FBQTtBQUM3RSw4REFBMEQ7QUFBakQsMkdBQUEsVUFBVSxPQUFBO0FBRW5CLHdFQUFvRTtBQUEzRCxxSEFBQSxlQUFlLE9BQUE7QUFFeEIsa0VBQWtGO0FBQXpFLHFIQUFBLGtCQUFrQixPQUFBO0FBQUUsK0dBQUEsWUFBWSxPQUFBO0FBQ3pDLG9FQUFnRTtBQUF2RCxpSEFBQSxhQUFhLE9BQUE7QUFTdEIsMEVBQXdGO0FBQS9FLHVIQUFBLGdCQUFnQixPQUFBO0FBQUUsdUhBQUEsZ0JBQWdCLE9BQUE7QUFFM0MsMEVBQXNFO0FBQTdELHlIQUFBLGlCQUFpQixPQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBmb290cHJpbnRqcy90cmFjZSDigJQgcmVjb3JkZXIgc3RvcmVzLCB0b3BvbG9neSwgY2hhcnQgYm91bmRhcmllcyBhbmQgY29udHJvbCBkZXBlbmRlbmNpZXMuXG4gKlxuICogUmVjb3JkIHJlYWRlcnMsIHR5cGVzIGFuZCBydW50aW1lLUlEIGdyYW1tYXIgYmVsb25nIHRvIGBmb290dHJhY2VgOyByZWNvcmQgcGF0aCBoZWxwZXJzIGJlbG9uZ1xuICogdG8gYGZvb3R0cmFjZS9wYXRoc2AsIGFuZCByZWNvcmQgd3JpdGVycyB0byBgZm9vdHRyYWNlL3dyaXRlYC4gVGhpcyBkb29yIGV4cG9ydHMgb25seSBlbmdpbmUtb3duZWRcbiAqIG9ic2VydmVyIHRvb2xzLiBSZWNvcmQgc3ltYm9scyBhcmUgbmV2ZXIgcmUtZXhwb3J0ZWQgYWNyb3NzIHRoZSBwYWNrYWdlIGJvdW5kYXJ5LlxuICovXG5cbmV4cG9ydCB0eXBlIHsgV2Fsa2VySXRlbSwgV2Fsa2VyT3B0aW9ucyB9IGZyb20gJy4vbGliL2VuZ2luZS93YWxrU3ViZmxvd1NwZWMuanMnO1xuZXhwb3J0IHsgd2Fsa1N1YmZsb3dTcGVjIH0gZnJvbSAnLi9saWIvZW5naW5lL3dhbGtTdWJmbG93U3BlYy5qcyc7XG5leHBvcnQge1xuICBCUkFOQ0hfU0VHTUVOVF9NQVJLRVIsXG4gIGJ1aWxkQnJhbmNoU2VnbWVudCxcbiAgaGFzQnJhbmNoU2VnbWVudE1hcmtlcixcbiAgaXNCcmFuY2hTZWdtZW50LFxuICBwYXJzZUJyYW5jaFNlZ21lbnQsXG59IGZyb20gJy4vbGliL2lkcy9icmFuY2hTZWdtZW50LmpzJztcbmV4cG9ydCB7IEJvdW5kYXJ5U3RhdGVTdG9yZSB9IGZyb20gJy4vbGliL3JlY29yZGVyL0JvdW5kYXJ5U3RhdGVTdG9yZS5qcyc7XG5leHBvcnQgdHlwZSB7IENvbnRyb2xEZWNpc2lvblJlY29yZCwgQ29udHJvbERlcFJlY29yZGVyT3B0aW9ucyB9IGZyb20gJy4vbGliL3JlY29yZGVyL0NvbnRyb2xEZXBSZWNvcmRlci5qcyc7XG5leHBvcnQgeyBDb250cm9sRGVwUmVjb3JkZXIsIGNvbnRyb2xEZXBSZWNvcmRlciB9IGZyb20gJy4vbGliL3JlY29yZGVyL0NvbnRyb2xEZXBSZWNvcmRlci5qcyc7XG5leHBvcnQgdHlwZSB7IEluT3V0QXR0ZW1wdHMsIEluT3V0RW50cnksIEluT3V0UGhhc2UsIEluT3V0UmVjb3JkZXJPcHRpb25zIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvSW5PdXRSZWNvcmRlci5qcyc7XG5leHBvcnQgeyBJbk91dFJlY29yZGVyLCBpbk91dFJlY29yZGVyLCBST09UX1JVTlRJTUVfU1RBR0VfSUQsIFJPT1RfU1VCRkxPV19JRCB9IGZyb20gJy4vbGliL3JlY29yZGVyL0luT3V0UmVjb3JkZXIuanMnO1xuZXhwb3J0IHsgS2V5ZWRTdG9yZSB9IGZyb20gJy4vbGliL3JlY29yZGVyL0tleWVkU3RvcmUuanMnO1xuZXhwb3J0IHR5cGUgeyBRdWFsaXR5RW50cnksIFF1YWxpdHlSZWNvcmRlck9wdGlvbnMsIFF1YWxpdHlTY29yaW5nRm4gfSBmcm9tICcuL2xpYi9yZWNvcmRlci9RdWFsaXR5UmVjb3JkZXIuanMnO1xuZXhwb3J0IHsgUXVhbGl0eVJlY29yZGVyIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvUXVhbGl0eVJlY29yZGVyLmpzJztcbmV4cG9ydCB0eXBlIHsgUXVhbGl0eUZyYW1lLCBRdWFsaXR5U3RhY2tUcmFjZSB9IGZyb20gJy4vbGliL3JlY29yZGVyL3F1YWxpdHlUcmFjZS5qcyc7XG5leHBvcnQgeyBmb3JtYXRRdWFsaXR5VHJhY2UsIHF1YWxpdHlUcmFjZSB9IGZyb20gJy4vbGliL3JlY29yZGVyL3F1YWxpdHlUcmFjZS5qcyc7XG5leHBvcnQgeyBTZXF1ZW5jZVN0b3JlIH0gZnJvbSAnLi9saWIvcmVjb3JkZXIvU2VxdWVuY2VTdG9yZS5qcyc7XG5leHBvcnQgdHlwZSB7XG4gIFRvcG9sb2d5LFxuICBUb3BvbG9neUVkZ2UsXG4gIFRvcG9sb2d5SW5jb21pbmdLaW5kLFxuICBUb3BvbG9neU5vZGUsXG4gIFRvcG9sb2d5Tm9kZUtpbmQsXG4gIFRvcG9sb2d5UmVjb3JkZXJPcHRpb25zLFxufSBmcm9tICcuL2xpYi9yZWNvcmRlci9Ub3BvbG9neVJlY29yZGVyLmpzJztcbmV4cG9ydCB7IFRvcG9sb2d5UmVjb3JkZXIsIHRvcG9sb2d5UmVjb3JkZXIgfSBmcm9tICcuL2xpYi9yZWNvcmRlci9Ub3BvbG9neVJlY29yZGVyLmpzJztcbmV4cG9ydCB0eXBlIHsgU3RvcmVkQ2FwdHVyZUhpc3RvcnksIFN0b3JlZENhcHR1cmVSZXN1bHQgfSBmcm9tICcuL2xpYi9ydW5uZXIvcmVhZFN0b3JlZENhcHR1cmUuanMnO1xuZXhwb3J0IHsgcmVhZFN0b3JlZENhcHR1cmUgfSBmcm9tICcuL2xpYi9ydW5uZXIvcmVhZFN0b3JlZENhcHR1cmUuanMnO1xuIl19
@@ -89,6 +89,7 @@ export { attempt, AttemptTimeoutError, errorCategory, retryRules, UnknownEffectE
89
89
  export type { ParsedTraceparent, RunCorrelation, TraceparentFields, TraceparentRefusal } from './lib/attempt/index.js';
90
90
  export { formatTraceparent, parseTraceparent, TraceparentError } from './lib/attempt/index.js';
91
91
  /** @category Run */
92
+ export type { CaptureHistoryOptions, CaptureHistoryReceipt, CaptureHistoryStatus, CaptureHistoryTarget, } from './lib/runner/index.js';
92
93
  export type { RunResult } from './lib/runner/index.js';
93
94
  /** @category Run */
94
95
  export type { FlowChartExecutorOptions } from './lib/runner/index.js';
@@ -283,4 +284,6 @@ export { extractErrorInfo, formatErrorInfo } from './lib/engine/index.js';
283
284
  export { disableDevMode, enableDevMode, isDevMode } from './lib/devMode.js';
284
285
  export type { RetryLoopCall, RetryLoopDecision, RetryLoopIdentity } from './lib/attempt/retryLoopTypes.js';
285
286
  export type { RetryLoopContext, RetryLoopOptions, RetryLoopState } from './lib/builder/retryLoop.js';
287
+ export type { CaptureChannelStatus, CaptureLimitation, NativeCaptureNote, RecorderCaptureAcknowledgement, } from './lib/capture/nativeCoverage.js';
288
+ export type { EngineReadSources, NativeCaptureObservation, NativeReadCaptureNote, SourceLimitation, } from './lib/capture/readSources.js';
286
289
  export { stringifySnapshot } from './lib/runner/stringifySnapshot.js';
@@ -0,0 +1,7 @@
1
+ /** @internal Copy the served projection; charge sidecar growth before retaining each omitted event. */
2
+ export declare function copyCaptureEvidence(value: unknown, maxBytes: number): Record<string, unknown>;
3
+ /**
4
+ * @internal Validate already inert evidence. Never restores undefined into ordinary JSON maps.
5
+ * A marker means an own undefined tracked value was omitted, not that business state lacked the key.
6
+ */
7
+ export declare function validateAbsentEntries(payload: Record<string, unknown>): boolean;
@@ -0,0 +1,11 @@
1
+ import type { NativeCaptureObservation } from './readSources.js';
2
+ /**
3
+ * A checkpoint retains an observation ABOUT its paused root leg, not the log itself.
4
+ * Validates shape, not authenticity. Never promotes it to durable evidence or copies arbitrary fields.
5
+ * Returning undefined lets the checkpoint codec give one fixed refusal, without untrusted text.
6
+ */
7
+ export declare function copyCheckpointCapture(value: unknown): NativeCaptureObservation | undefined;
8
+ /** Read the optional field before the general checkpoint upcaster could evaluate a supplied getter. */
9
+ export declare function readCheckpointCapture(stored: object): NativeCaptureObservation | undefined;
10
+ /** Keep the general upcaster from re-reading capture through a getter or Proxy get trap. */
11
+ export declare function withoutCheckpointCapture(stored: Record<string, unknown>): Record<string, unknown>;
@@ -0,0 +1,9 @@
1
+ /** @internal Fixed diagnostic only; never carries source values, paths or adapter errors. */
2
+ export declare class HistoryDataError extends Error {
3
+ readonly code: 'too-large' | 'invalid-data';
4
+ constructor(code: 'too-large' | 'invalid-data');
5
+ }
6
+ /** @internal Copy bounded inert JSON data without invoking accessors, toJSON or application coercion. */
7
+ export declare function copyHistoryData(value: unknown, maxBytes: number, onOmitted?: (path: readonly string[]) => void): unknown;
8
+ /** @internal Integrity of this JSON representation, not a value fingerprint or an authenticity signature. */
9
+ export declare function historyDigest(value: unknown): Promise<string>;
@@ -0,0 +1,4 @@
1
+ import type { CaptureHistoryTarget } from './historyTypes.js';
2
+ import type { NativeCaptureNote } from './nativeCoverage.js';
3
+ /** @internal Called only after the bounded inert-data copier. Retains native observations, not storage authority. */
4
+ export declare function historyNote(value: unknown, target: CaptureHistoryTarget): NativeCaptureNote | undefined;
@@ -0,0 +1,5 @@
1
+ import type { CaptureHistoryReceipt, CaptureHistoryTarget } from './historyTypes.js';
2
+ /** @internal Bounded own-data root identity. Does not execute stored accessors. */
3
+ export declare function copyHistoryTarget(value: unknown): CaptureHistoryTarget | undefined;
4
+ /** @internal Fixed fields only; an adapter cannot leak its additional receipt data into saved metadata. */
5
+ export declare function copyHistoryReceipt(value: unknown, target: CaptureHistoryTarget): CaptureHistoryReceipt | undefined;
@@ -0,0 +1,39 @@
1
+ import type { LogAddress } from 'foottrace';
2
+ /** Exact root segment and evidence entry acknowledged by a storage adapter. */
3
+ export interface CaptureHistoryTarget {
4
+ readonly version: 1;
5
+ readonly evidenceId: string;
6
+ readonly runId: string;
7
+ /** SHA-256 of the exact inert JSON evidence plus canonical commit log and served starting state. */
8
+ readonly digest: string;
9
+ readonly logAddress: LogAddress;
10
+ readonly commits: {
11
+ readonly from: number;
12
+ readonly to: number;
13
+ };
14
+ }
15
+ /** Adapter assertion about the preceding evidence and end entry, not about this receipt's delivery. */
16
+ export interface CaptureHistoryReceipt extends CaptureHistoryTarget {
17
+ readonly durability: 'durable';
18
+ }
19
+ /** Explicit host-owned durability capability. A normal RecordSink.flush is not this promise. */
20
+ export interface CaptureHistoryOptions {
21
+ /** Resolve only after this target's evidence, commits and end entry are durably stored together. */
22
+ readonly acknowledge: (target: CaptureHistoryTarget, context: {
23
+ readonly signal: AbortSignal;
24
+ }) => Promise<CaptureHistoryReceipt>;
25
+ /** Maximum UTF-8 bytes of the evidence payload and target. Default 1 MiB, maximum 8 MiB. */
26
+ readonly maxBytes?: number;
27
+ /** Total time allowed for evidence delivery, acknowledgement and receipt delivery. Default 10s, maximum 30s. */
28
+ readonly timeoutMs?: number;
29
+ }
30
+ /** Persistence result only. An acknowledged failed/paused prefix is not a completed business workflow. */
31
+ export type CaptureHistoryStatus = {
32
+ readonly status: 'acknowledged';
33
+ } | {
34
+ readonly status: 'unknown';
35
+ readonly reason: string;
36
+ };
37
+ /** @internal Opaque note names; Foottrace keeps them without interpreting engine metadata. */
38
+ export declare const CAPTURE_HISTORY_NOTE = "capture-history";
39
+ export declare const CAPTURE_RECEIPT_NOTE = "capture-receipt";
@@ -0,0 +1,69 @@
1
+ import type { LogAddress } from 'foottrace';
2
+ import type { TerminalFailureContext } from '../errors/terminalFailure.js';
3
+ /** @internal Shared observation vocabularies; producer, types and checkpoint reader use the same values. */
4
+ export declare const CAPTURE_RETENTION_MODES: readonly ["full", "summary", "off", "unknown"];
5
+ export declare const CAPTURE_COMMIT_VALUE_MODES: readonly ["full", "delta", "unknown"];
6
+ export declare const CAPTURE_PROVENANCE_MODES: readonly ["off", "reads-prefix", "unknown"];
7
+ export declare const CAPTURE_CHANNEL_STATUSES: readonly ["captured", "disabled", "partial", "failed", "unknown"];
8
+ declare const RECORDER_CONTROL_STATUSES: readonly ["captured", "partial", "unknown"];
9
+ export type CaptureChannelStatus = (typeof CAPTURE_CHANNEL_STATUSES)[number];
10
+ /** @internal Exact membership without coercing stored values. */
11
+ export declare function isCaptureValue<T extends string>(value: unknown, vocabulary: readonly T[]): value is T;
12
+ /** @internal Limitations inherent in every version-1 observation. */
13
+ export declare const CAPTURE_BASE_LIMITATIONS: readonly ["tracked-state-only", "final-attempt-views", "read-sources-not-collected", "child-scopes-not-attested", "storage-not-attested"];
14
+ /** @internal One vocabulary for native observation and its stored checkpoint codec. */
15
+ export declare const CAPTURE_LIMITATIONS: readonly ["tracked-state-only", "final-attempt-views", "read-sources-not-collected", "child-scopes-not-attested", "storage-not-attested", "resumed-segment", "redacted-export", "redaction-active", "custom-scope", "read-retention-failed", "commit-retention-failed", "attention-omitted", "recorder-snapshot-failed", "identity-omitted", "execution-broken", "modes-unavailable", "checkpoint-history-not-included", "source-history-not-included"];
16
+ export type CaptureLimitation = (typeof CAPTURE_LIMITATIONS)[number];
17
+ /** A producer acknowledgement, not engine inspection of a recorder's implementation. */
18
+ export interface RecorderCaptureAcknowledgement {
19
+ readonly version: 1;
20
+ readonly runId: string;
21
+ readonly control: (typeof RECORDER_CONTROL_STATUSES)[number];
22
+ }
23
+ /** Engine observation of ONE root-log segment. Never a durable or whole-workflow completeness claim. */
24
+ export interface NativeCaptureNote {
25
+ readonly version: 1;
26
+ readonly runId: string;
27
+ readonly scope: 'root-log';
28
+ readonly logAddress: LogAddress;
29
+ /** Half-open offsets in this log. A same-executor resume starts at the previous end. */
30
+ readonly commits: {
31
+ readonly from: number;
32
+ readonly to: number;
33
+ };
34
+ readonly boundary: {
35
+ readonly status: 'running' | 'completed' | 'paused' | 'failed' | 'cancelled';
36
+ readonly failure?: TerminalFailureContext;
37
+ };
38
+ readonly modes: {
39
+ readonly readTracking: (typeof CAPTURE_RETENTION_MODES)[number];
40
+ readonly writeTracking: (typeof CAPTURE_RETENTION_MODES)[number];
41
+ readonly commitValues: (typeof CAPTURE_COMMIT_VALUE_MODES)[number];
42
+ readonly writeProvenance: (typeof CAPTURE_PROVENANCE_MODES)[number];
43
+ };
44
+ readonly channels: {
45
+ readonly reads: CaptureChannelStatus;
46
+ readonly writes: CaptureChannelStatus;
47
+ readonly attention: CaptureChannelStatus;
48
+ readonly control: CaptureChannelStatus;
49
+ readonly readSources: 'not-collected';
50
+ };
51
+ readonly persistence: 'memory-only';
52
+ readonly limitations: readonly CaptureLimitation[];
53
+ }
54
+ /** @internal Bounded facts collected at native funnels; no values, key names, recorder discovery or tree walk. */
55
+ export declare class NativeCapture {
56
+ readonly runId: string;
57
+ readonly logAddress: LogAddress;
58
+ readonly from: number;
59
+ private readonly gaps;
60
+ private boundary;
61
+ private readonly modes;
62
+ constructor(runId: string, logAddress: LogAddress, from: number, modes: NativeCaptureNote['modes']);
63
+ limit(gap: CaptureLimitation): void;
64
+ end(status: NativeCaptureNote['boundary']['status'], failure?: TerminalFailureContext): void;
65
+ snapshot(to: number, control?: CaptureChannelStatus, redacted?: boolean): NativeCaptureNote;
66
+ }
67
+ /** Stored/recorder metadata is untrusted. Read data properties only, never getters or arbitrary strings. */
68
+ export declare function copyCaptureAcknowledgement(value: unknown): RecorderCaptureAcknowledgement | undefined;
69
+ export {};
@@ -0,0 +1,10 @@
1
+ import type { CaptureLimitation, NativeCaptureNote } from './nativeCoverage.js';
2
+ /** @internal One inert-data boundary for checkpoint and history capture codecs. */
3
+ export declare function ownData(record: unknown, key: string): unknown;
4
+ export declare function captureIdentifier(value: unknown): value is string;
5
+ export declare function copyIdentity(value: unknown, exact?: boolean, version?: 1 | 2): Pick<NativeCaptureNote, 'runId' | 'logAddress' | 'commits'> | undefined;
6
+ export declare function copyModes(value: unknown, exact?: boolean): NativeCaptureNote['modes'] | undefined;
7
+ export declare function copyChannels(value: unknown, exact?: boolean): NativeCaptureNote['channels'] | undefined;
8
+ /** Shared native statuses; source version admission remains explicit at each codec boundary. */
9
+ export declare function copyObservedChannels(value: unknown): Omit<NativeCaptureNote['channels'], 'readSources'> | undefined;
10
+ export declare function copyLimitations(value: unknown): readonly CaptureLimitation[] | undefined;
@@ -0,0 +1,43 @@
1
+ import type { ReadSourceRecord, ReadSourceSnapshot } from 'foottrace/write';
2
+ import type { CaptureChannelStatus, NativeCaptureNote } from './nativeCoverage.js';
3
+ /** Engine coverage only. Source descriptors and their codec belong to foottrace/write. */
4
+ export declare const SOURCE_LIMITATIONS: readonly ["privacy-active", "identity-unavailable", "untracked-read", "custom-scope", "child-source-ownership", "resumed-source-ownership", "sink-source-unsupported", "source-history-not-included", "source-capture-failed", "redacted-source-export"];
5
+ export type SourceLimitation = (typeof SOURCE_LIMITATIONS)[number];
6
+ /** Packet 3 is an in-memory observation, not a stored-history acknowledgement. */
7
+ export interface EngineReadSources {
8
+ readonly version: 1;
9
+ readonly runId: string;
10
+ readonly persistence: 'memory-only';
11
+ readonly commits: {
12
+ readonly from: number;
13
+ readonly to: number;
14
+ };
15
+ readonly status: CaptureChannelStatus;
16
+ readonly limitations: readonly SourceLimitation[];
17
+ /** Absent means unknown ownership, never an observed-empty book. */
18
+ readonly record?: ReadSourceSnapshot;
19
+ }
20
+ /** A new discriminant prevents strict v1 readers from accepting new completeness claims. */
21
+ export interface NativeReadCaptureNote extends Omit<NativeCaptureNote, 'version' | 'channels'> {
22
+ readonly version: 2;
23
+ readonly channels: Omit<NativeCaptureNote['channels'], 'readSources'> & {
24
+ readonly readSources: CaptureChannelStatus;
25
+ };
26
+ }
27
+ export type NativeCaptureObservation = NativeCaptureNote | NativeReadCaptureNote;
28
+ /** One owner per runtime/leg; propagated only to frames in that log. Never reads values or scans commits. */
29
+ export declare class EngineReadSourceCapture {
30
+ readonly runId: string;
31
+ private readonly book?;
32
+ readonly from: number;
33
+ private readonly gaps;
34
+ private sealed?;
35
+ get observing(): boolean;
36
+ constructor(runId: string, book?: ReadSourceRecord | undefined, gap?: SourceLimitation, from?: number);
37
+ limit(gap: SourceLimitation): void;
38
+ retire(): void;
39
+ seal(to: number): void;
40
+ snapshot(to: number, redact?: boolean): EngineReadSources;
41
+ }
42
+ /** Keep the v1 producer unchanged. Only explicitly enabled source observations acquire v2. */
43
+ export declare function withReadSources(note: NativeCaptureNote, sources: EngineReadSources): NativeReadCaptureNote;
@@ -346,6 +346,7 @@ export declare class FlowchartTraverser<TOut = any, TScope = any> {
346
346
  executionTree: unknown;
347
347
  initialState?: Record<string, unknown> | undefined;
348
348
  commitLog: unknown[];
349
+ readSources?: import("../../capture/readSources.js").EngineReadSources | undefined;
349
350
  logAddress?: import("foottrace").LogAddress | undefined;
350
351
  subflowResults?: Record<string, unknown> | undefined;
351
352
  recorders?: {
@@ -261,6 +261,8 @@ export interface SubflowResult {
261
261
  globalContext: Record<string, unknown>;
262
262
  stageContexts: Record<string, unknown>;
263
263
  history: unknown[];
264
+ /** Unknown until each child invocation has its own source ownership protocol. */
265
+ readonly readSources?: import('../capture/readSources.js').EngineReadSources;
264
266
  /** Identity of the local history, not its parent's log. */
265
267
  readonly logAddress?: LogAddress;
266
268
  /**
@@ -376,6 +378,7 @@ export interface IExecutionRuntime {
376
378
  /** The commit log's fold base — see `RuntimeSnapshot.initialState`. */
377
379
  initialState?: Record<string, unknown>;
378
380
  commitLog: unknown[];
381
+ readonly readSources?: import('../capture/readSources.js').EngineReadSources;
379
382
  readonly logAddress?: LogAddress;
380
383
  /** Dual-keyed by subflow path (last iteration) AND per-execution mount runtimeStageId
381
384
  * (each iteration) — see RuntimeSnapshot.subflowResults / subflow-commit-visibility. */
@@ -14,6 +14,8 @@
14
14
  import type { CommitPhase, EmitSourcePosition, UntrackedSource } from 'foottrace';
15
15
  import type { EventLog, SharedMemory } from 'foottrace/write';
16
16
  import type { AttemptContext, AttemptRecord, AttemptSummary, LateWrite } from '../attempt/types.js';
17
+ import type { NativeCapture } from '../capture/nativeCoverage.js';
18
+ import type { EngineReadSourceCapture } from '../capture/readSources.js';
17
19
  import type { StructuredErrorInfo } from '../errors/errorInfo.js';
18
20
  import { type TerminalFailureContext, NativeFailureState } from '../errors/terminalFailure.js';
19
21
  import { type DiagnosticChannel, DiagnosticCollector } from './DiagnosticCollector.js';
@@ -57,6 +59,11 @@ export declare class StageContext {
57
59
  private policy;
58
60
  /** The emitting frame's logical leg, never the mutable executor's current leg. */
59
61
  private emitRunId?;
62
+ /** The native root-log collector; copied to same-log frames, never child runtimes. */
63
+ capture?: NativeCapture;
64
+ /** Source coverage, shared only by frames of this runtime. */
65
+ readSources?: EngineReadSourceCapture;
66
+ private sourceAttempt?;
60
67
  stageName: string;
61
68
  /** Unique stage identifier from the builder (matches spec node id). */
62
69
  stageId: string;
@@ -342,6 +349,7 @@ export declare class StageContext {
342
349
  * `'summary'` records a cheap marker, `'off'` records nothing.
343
350
  */
344
351
  getValue(path: string[], key?: string, description?: string): unknown;
352
+ private readRetainedValue;
345
353
  /**
346
354
  * How many tracked reads of this frame read a value the run's rule selects
347
355
  * (a key it masks whole, or one with secret fields). A boundary that maps
@@ -350,6 +358,10 @@ export declare class StageContext {
350
358
  * (`memory/redaction.ts · MapperTaint`). Always 0 without a policy or a mark.
351
359
  */
352
360
  get selectedReads(): number;
361
+ private noteAndJudgeRead;
362
+ private judgeRead;
363
+ private readWithNativeSource;
364
+ private noteSourceRead;
353
365
  /** Read state without tracking in _stageReads or paying structuredClone cost.
354
366
  * Used by ScopeFacade.getValueSilent() for array proxy internal operations. */
355
367
  getValueDirect(path: string[], key?: string): unknown;
@@ -455,6 +467,7 @@ export declare class StageContext {
455
467
  * reads them post-run for the execution-tree snapshot.
456
468
  */
457
469
  commit(phase?: CommitPhase): void;
470
+ private commitRetained;
458
471
  /** Whether this frame has committed — a call's record arriving after it is late (P2, `ScopeFacade · call`). */
459
472
  get committed(): boolean;
460
473
  /**
@@ -3,11 +3,13 @@ import type { Attention } from 'foottrace';
3
3
  import type { AttemptRecord, AttemptSummary } from '../attempt/types.js';
4
4
  /** One execution's ownership, pending summary, marks and omission accounting stay in this helper. */
5
5
  export declare class StageAttention {
6
+ private readonly onOmitted?;
6
7
  private marks?;
7
8
  private omitted;
8
9
  private retryPossible;
9
10
  private summary?;
10
11
  private terminal?;
12
+ constructor(onOmitted?: (() => void) | undefined);
11
13
  /** A new execution starts fresh; an attempt discard never calls this. No collection is reconstructed. */
12
14
  begin(): void;
13
15
  /** Called only after the frame retained this attempt. Raw error, target and decision payloads are never read. */