@workflow/core 5.0.0-beta.46 → 5.0.0-beta.48

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 (71) hide show
  1. package/dist/capabilities.d.ts +6 -5
  2. package/dist/capabilities.d.ts.map +1 -1
  3. package/dist/capabilities.js +14 -12
  4. package/dist/classify-error.d.ts.map +1 -1
  5. package/dist/classify-error.js +13 -3
  6. package/dist/describe-error.d.ts.map +1 -1
  7. package/dist/describe-error.js +16 -1
  8. package/dist/events-consumer.d.ts +29 -6
  9. package/dist/events-consumer.d.ts.map +1 -1
  10. package/dist/events-consumer.js +66 -11
  11. package/dist/private.d.ts +13 -11
  12. package/dist/private.d.ts.map +1 -1
  13. package/dist/private.js +57 -29
  14. package/dist/replay-payload-cache.d.ts +13 -17
  15. package/dist/replay-payload-cache.d.ts.map +1 -1
  16. package/dist/replay-payload-cache.js +55 -57
  17. package/dist/runtime/constants.d.ts +12 -10
  18. package/dist/runtime/constants.d.ts.map +1 -1
  19. package/dist/runtime/constants.js +13 -11
  20. package/dist/runtime/helpers.d.ts +27 -33
  21. package/dist/runtime/helpers.d.ts.map +1 -1
  22. package/dist/runtime/helpers.js +31 -43
  23. package/dist/runtime/quickjs-serde.d.ts.map +1 -1
  24. package/dist/runtime/quickjs-serde.js +62 -1
  25. package/dist/runtime/resume-hook.d.ts +19 -26
  26. package/dist/runtime/resume-hook.d.ts.map +1 -1
  27. package/dist/runtime/resume-hook.js +201 -255
  28. package/dist/runtime/resume-latency.d.ts +8 -11
  29. package/dist/runtime/resume-latency.d.ts.map +1 -1
  30. package/dist/runtime/resume-latency.js +1 -1
  31. package/dist/runtime/run.d.ts.map +1 -1
  32. package/dist/runtime/run.js +9 -13
  33. package/dist/runtime/runs.d.ts.map +1 -1
  34. package/dist/runtime/runs.js +8 -4
  35. package/dist/runtime/start.js +12 -10
  36. package/dist/runtime/suspension-handler.d.ts +54 -1
  37. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  38. package/dist/runtime/suspension-handler.js +83 -20
  39. package/dist/runtime/vm-mode.d.ts +1 -1
  40. package/dist/runtime/vm-mode.d.ts.map +1 -1
  41. package/dist/runtime/vm-mode.js +1 -1
  42. package/dist/runtime.d.ts.map +1 -1
  43. package/dist/runtime.js +318 -119
  44. package/dist/serialization/reducers/common-vm.d.ts.map +1 -1
  45. package/dist/serialization/reducers/common-vm.js +38 -1
  46. package/dist/serialization/reducers/common.d.ts.map +1 -1
  47. package/dist/serialization/reducers/common.js +26 -2
  48. package/dist/serialization/types.d.ts +7 -0
  49. package/dist/serialization/types.d.ts.map +1 -1
  50. package/dist/serialization/types.js +1 -1
  51. package/dist/serialization.d.ts +27 -5
  52. package/dist/serialization.d.ts.map +1 -1
  53. package/dist/serialization.js +185 -44
  54. package/dist/telemetry/semantic-conventions.d.ts +41 -7
  55. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  56. package/dist/telemetry/semantic-conventions.js +30 -6
  57. package/dist/telemetry.d.ts +12 -0
  58. package/dist/telemetry.d.ts.map +1 -1
  59. package/dist/telemetry.js +62 -2
  60. package/dist/version.d.ts +1 -1
  61. package/dist/version.js +2 -2
  62. package/dist/vm/script-cache.d.ts +9 -11
  63. package/dist/vm/script-cache.d.ts.map +1 -1
  64. package/dist/vm/script-cache.js +25 -40
  65. package/dist/workflow/sleep.d.ts.map +1 -1
  66. package/dist/workflow/sleep.js +3 -6
  67. package/dist/workflow.d.ts +16 -0
  68. package/dist/workflow.d.ts.map +1 -1
  69. package/dist/workflow.js +72 -27
  70. package/docs/foundations/errors-and-retries.mdx +1 -1
  71. package/package.json +10 -10
package/dist/telemetry.js CHANGED
@@ -164,6 +164,20 @@ const StepExecutionDurationHistogram = once(async () => {
164
164
  // OTel registration, which is the whole point of the log. With several copies
165
165
  // in a process, each one's view is what is worth seeing.
166
166
  let otelDiagLogged = false;
167
+ function describeThrownValue(value) {
168
+ try {
169
+ if (typeof value === 'object' &&
170
+ value !== null &&
171
+ 'message' in value &&
172
+ typeof value.message === 'string') {
173
+ return value.message;
174
+ }
175
+ return String(value);
176
+ }
177
+ catch {
178
+ return 'Unknown error';
179
+ }
180
+ }
167
181
  function logOtelDiagnosticOnce(otel, tracer) {
168
182
  const debugEnabled = typeof process !== 'undefined' &&
169
183
  typeof process.env.DEBUG === 'string' &&
@@ -214,7 +228,7 @@ export async function trace(spanName, ...args) {
214
228
  else {
215
229
  span.setStatus({
216
230
  code: otel.SpanStatusCode.ERROR,
217
- message: e.message,
231
+ message: describeThrownValue(e),
218
232
  });
219
233
  }
220
234
  throw e;
@@ -224,6 +238,52 @@ export async function trace(spanName, ...args) {
224
238
  }
225
239
  });
226
240
  }
241
+ /** Starts a child span without installing it as the active context. */
242
+ export async function startTraceSpan(spanName) {
243
+ const [tracer, otel] = await Promise.all([Tracer.value, OtelApi.value]);
244
+ if (!tracer || !otel)
245
+ return { end() { }, fail() { } };
246
+ const span = tracer.startSpan(spanName);
247
+ let ended = false;
248
+ const finish = (status) => {
249
+ if (ended)
250
+ return;
251
+ ended = true;
252
+ span.setStatus(status);
253
+ span.end();
254
+ };
255
+ return {
256
+ end: () => finish({ code: otel.SpanStatusCode.OK }),
257
+ fail: (error) => finish({
258
+ code: otel.SpanStatusCode.ERROR,
259
+ message: describeThrownValue(error),
260
+ }),
261
+ };
262
+ }
263
+ /** Bind work to the currently active span even when it starts from a child. */
264
+ export async function bindActiveTraceContext(fn) {
265
+ const otel = await OtelApi.value;
266
+ return otel ? otel.context.bind(otel.context.active(), fn) : fn;
267
+ }
268
+ /** Keeps a parked workflow's ambient trace context aligned with each resume. */
269
+ export async function createRefreshableTraceContext() {
270
+ const otel = await OtelApi.value;
271
+ if (!otel) {
272
+ return { refresh() { }, run: (fn) => fn() };
273
+ }
274
+ let current = otel.context.active();
275
+ const context = {
276
+ getValue: (key) => current.getValue(key),
277
+ setValue: (key, value) => current.setValue(key, value),
278
+ deleteValue: (key) => current.deleteValue(key),
279
+ };
280
+ return {
281
+ refresh: () => {
282
+ current = otel.context.active();
283
+ },
284
+ run: (fn) => otel.context.with(context, fn),
285
+ };
286
+ }
227
287
  /**
228
288
  * Emit a span whose start is back-dated to `startEpochMs` and whose end is now,
229
289
  * so its duration reflects an interval only measurable at its end (e.g.
@@ -364,4 +424,4 @@ export async function getWorkflowBaggage() {
364
424
  workflowName: name,
365
425
  };
366
426
  }
367
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RlbGVtZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNqRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sS0FBSyxJQUFJLE1BQU0scUNBQXFDLENBQUM7QUFvQjVEOzs7O0dBSUc7QUFDSCxNQUFNLGlCQUFpQixHQUFHLGVBQWUsQ0FDdkMsbUNBQW1DLEVBQ25DLENBQUMsRUFDRCxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLElBQUksR0FBRyxFQUFVLEVBQUUsQ0FBQyxDQUM1QyxDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CO0lBQ2xDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUM7SUFDOUMsSUFBSSxLQUFLLEtBQUssWUFBWTtRQUFFLE9BQU8sWUFBWSxDQUFDO0lBQ2hELElBQ0UsS0FBSztRQUNMLEtBQUssS0FBSyxRQUFRO1FBQ2xCLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFDMUMsQ0FBQztRQUNELGlCQUFpQixDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsYUFBYSxDQUFDLElBQUksQ0FDaEIsMkNBQTJDLEtBQUssaUVBQWlFLENBQ2xILENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsT0FBMkM7SUFFM0MsT0FBTyxPQUFPLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxJ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Q2pELENBQUMsQ0FBQztJQUVILDBDQUEwQztJQUMxQyxNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUNwRCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUNyQixPQUFPLENBQ1IsQ0FBQztJQUVGLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxrQkFBa0I7SUFHdEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQ2pDLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFNUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ25FLElBQUksQ0FBQyxPQUFPO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFL0IsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEtBQUssQ0FBQztJQUN6RCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxFQUFFLEtBQUssQ0FBQztJQUV0RCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBRXRDLE9BQU87UUFDTCxhQUFhLEVBQUUsS0FBSztRQUNwQixZQUFZLEVBQUUsSUFBSTtLQUNuQixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlICogYXMgYXBpIGZyb20gJ0BvcGVudGVsZW1ldHJ5L2FwaSc7XG5pbXBvcnQgdHlwZSB7IFNwYW4sIFNwYW5LaW5kLCBTcGFuT3B0aW9ucyB9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L2FwaSc7XG5pbXBvcnQgeyBnbG9iYWxTaW5nbGV0b24sIG9uY2UgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHsgV29ya2Zsb3dTdXNwZW5zaW9uIH0gZnJvbSAnLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCAqIGFzIEF0dHIgZnJvbSAnLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRyYWNlIENvbnRleHQgUHJvcGFnYXRpb24gVXRpbGl0aWVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDb250cm9scyBob3cgd29ya2Zsb3cvc3RlcCBxdWV1ZS1oYW5kbGVyIHNwYW5zIHJlbGF0ZSB0byB0aGUgcnVuLW9yaWdpblxuICogdHJhY2UgY29udGV4dCBjYXJyaWVkIGluIHF1ZXVlIG1lc3NhZ2VzOlxuICpcbiAqIC0gYCdsaW5rZWQnYCAoZGVmYXVsdCk6IGVhY2ggaW52b2NhdGlvbiBzdGFydHMgYSBORVcgcm9vdCB0cmFjZTsgdGhlXG4gKiAgIHJ1bi1vcmlnaW4gY29udGV4dCAoYW5kIHRoZSBpbmNvbWluZyBkZWxpdmVyeSBjb250ZXh0KSBhcmUgYXR0YWNoZWQgYXNcbiAqICAgc3BhbiBsaW5rcy4gVGhpcyBrZWVwcyB0cmFjZXMgYm91bmRlZCBwZXIgaW52b2NhdGlvbiBpbnN0ZWFkIG9mXG4gKiAgIHN0aXRjaGluZyBhIGxvbmctbGl2ZWQgcnVuIGludG8gb25lIGdpYW50IHRyYWNlLlxuICogLSBgJ2NvbnRpbnVvdXMnYDogdGhlIHJlc3RvcmVkIHJ1bi1vcmlnaW4gY29udGV4dCBiZWNvbWVzIHRoZSBwYXJlbnQgb2ZcbiAqICAgdGhlIGludm9jYXRpb24gc3BhbiAobGVnYWN5IGJlaGF2aW9yKSwgcHJvZHVjaW5nIGEgc2luZ2xlIHRyYWNlIHRoYXRcbiAqICAgc3BhbnMgdGhlIGVudGlyZSBydW4uXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93VHJhY2VNb2RlID0gJ2xpbmtlZCcgfCAnY29udGludW91cyc7XG5cbi8qKlxuICogVW5yZWNvZ25pemVkIGBXT1JLRkxPV19UUkFDRV9NT0RFYCB2YWx1ZXMgd2UgYWxyZWFkeSB3YXJuZWQgYWJvdXQuIE9uXG4gKiBgZ2xvYmFsVGhpc2AgKHNlZSBgZ2xvYmFsU2luZ2xldG9uYCkgc28gdGhlIHdhcm5pbmcgc3RheXMgb25jZSBwZXIgcHJvY2Vzc1xuICogcmF0aGVyIHRoYW4gb25jZSBwZXIgYnVuZGxlciBsYXllci5cbiAqL1xuY29uc3QgdHJhY2VNb2RlV2FybmluZ3MgPSBnbG9iYWxTaW5nbGV0b24oXG4gICdAd29ya2Zsb3cvY29yZS8vdHJhY2VNb2RlV2FybmluZ3MnLFxuICAxLFxuICAoKSA9PiAoeyB1bnJlY29nbml6ZWQ6IG5ldyBTZXQ8c3RyaW5nPigpIH0pXG4pO1xuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBhY3RpdmUgdHJhY2UgbW9kZSBmcm9tIHRoZSBgV09SS0ZMT1dfVFJBQ0VfTU9ERWAgZW52IHZhci5cbiAqIERlZmF1bHRzIHRvIGAnbGlua2VkJ2A7IGFueSB2YWx1ZSBvdGhlciB0aGFuIGAnY29udGludW91cydgIHNlbGVjdHMgaXQuXG4gKiBVbnJlY29nbml6ZWQgbm9uLWVtcHR5IHZhbHVlcyAoZS5nLiB0eXBvcyBsaWtlIGBjb250aW5vdXNgKSBlbWl0IGFcbiAqIG9uZS10aW1lIHdhcm5pbmcgc28gc2lsZW50IGZhbGxiYWNrIHRvIGBsaW5rZWRgIGlzIGF0IGxlYXN0IHZpc2libGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3JrZmxvd1RyYWNlTW9kZSgpOiBXb3JrZmxvd1RyYWNlTW9kZSB7XG4gIGNvbnN0IHZhbHVlID0gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfVFJBQ0VfTU9ERTtcbiAgaWYgKHZhbHVlID09PSAnY29udGludW91cycpIHJldHVybiAnY29udGludW91cyc7XG4gIGlmIChcbiAgICB2YWx1ZSAmJlxuICAgIHZhbHVlICE9PSAnbGlua2VkJyAmJlxuICAgICF0cmFjZU1vZGVXYXJuaW5ncy51bnJlY29nbml6ZWQuaGFzKHZhbHVlKVxuICApIHtcbiAgICB0cmFjZU1vZGVXYXJuaW5ncy51bnJlY29nbml6ZWQuYWRkKHZhbHVlKTtcbiAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICBgVW5yZWNvZ25pemVkIFdPUktGTE9XX1RSQUNFX01PREUgdmFsdWUgXCIke3ZhbHVlfVwiOyBleHBlY3RlZCBcImxpbmtlZFwiIG9yIFwiY29udGludW91c1wiLiBGYWxsaW5nIGJhY2sgdG8gXCJsaW5rZWRcIi5gXG4gICAgKTtcbiAgfVxuICByZXR1cm4gJ2xpbmtlZCc7XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIGEgc2VyaWFsaXplZCB0cmFjZSBjYXJyaWVyIGlzIHVzYWJsZSwgaS5lLiBwcmVzZW50IGFuZFxuICogbm9uLWVtcHR5LiBgc2VyaWFsaXplVHJhY2VDYXJyaWVyKClgIHJldHVybnMgYHt9YCB3aGVuIG5vIE9URUwgU0RLIGlzXG4gKiByZWdpc3RlcmVkIG9yIG5vIHNwYW4gaXMgYWN0aXZlLCBhbmQgYHN0YXJ0KClgIGFsd2F5cyBhdHRhY2hlcyB0aGVcbiAqIGNhcnJpZXIgdG8gdGhlIGZpcnN0IHF1ZXVlIG1lc3NhZ2UsIHNvIGFuIGVtcHR5IGNhcnJpZXIgbXVzdCBiZSB0cmVhdGVkXG4gKiB0aGUgc2FtZSBhcyBhbiBhYnNlbnQgb25lIHdoZXJldmVyIHRoZSB0cmFjZS1tb2RlIGxvZ2ljIGJyYW5jaGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNVc2FibGVUcmFjZUNhcnJpZXIoXG4gIGNhcnJpZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWRcbik6IGNhcnJpZXIgaXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIHJldHVybiBjYXJyaWVyICE9PSB1bmRlZmluZWQgJiYgT2JqZWN0LmtleXMoY2FycmllcikubGVuZ3RoID4gMDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cmFjZSBjYXJyaWVyIHRvIGF0dGFjaCB0byBtZXNzYWdlcyB0aGUgY3VycmVudCBpbnZvY2F0aW9uXG4gKiBlbnF1ZXVlcy4gSW4gYGxpbmtlZGAgbW9kZSB0aGUgT1JJR0lOQUwgcnVuLW9yaWdpbiBjYXJyaWVyIGlzIGZvcndhcmRlZFxuICogdW5jaGFuZ2VkICh3aGVuIHVzYWJsZSkgc28gZXZlcnkgZnV0dXJlIGludm9jYXRpb24gbGlua3MgYmFjayB0byB0aGUgc2FtZVxuICogb3JpZ2luOyBvdGhlcndpc2UgKGBjb250aW51b3VzYCBtb2RlLCBvciBubyB1c2FibGUgaW5jb21pbmcgY2FycmllcilcbiAqIHRoZSBjdXJyZW50IChhY3RpdmUpIGNvbnRleHQgaXMgc2VyaWFsaXplZCwgc28gdGhlIHRyYWNlIGtlZXBzIGNoYWluaW5nXG4gKiAoY29udGludW91cykgb3IgdGhlIGZpcnN0IGluc3RydW1lbnRlZCBpbnZvY2F0aW9uIGJlY29tZXMgdGhlIGRlLWZhY3RvXG4gKiBvcmlnaW4gKGxpbmtlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXh0VHJhY2VDYXJyaWVyKFxuICB0cmFjZU1vZGU6IFdvcmtmbG93VHJhY2VNb2RlLFxuICBpbmNvbWluZ0NhcnJpZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWRcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICByZXR1cm4gdHJhY2VNb2RlID09PSAnbGlua2VkJyAmJiBpc1VzYWJsZVRyYWNlQ2FycmllcihpbmNvbWluZ0NhcnJpZXIpXG4gICAgPyBQcm9taXNlLnJlc29sdmUoaW5jb21pbmdDYXJyaWVyKVxuICAgIDogc2VyaWFsaXplVHJhY2VDYXJyaWVyKCk7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBzcGFuIGxpbmtzIGZvciBhIHF1ZXVlLWRlbGl2ZXJlZCBpbnZvY2F0aW9uIHNwYW5cbiAqIChgd29ya2Zsb3cuZXhlY3V0ZWAgLyBgc3RlcC5leGVjdXRlYCk6XG4gKlxuICogLSBJbiBgbGlua2VkYCBtb2RlIHRoZSBpbnZvY2F0aW9uIHNwYW4gaXMgYSBDSElMRCBvZiB0aGUgbG9jYWwgZGVsaXZlcnlcbiAqICAgKGZsb3ctcm91dGUpIGNvbnRleHQsIHNvIHRoZSBvbmx5IGxpbmsgaXMgdG8gdGhlIHJ1bi1vcmlnaW4gY29udGV4dFxuICogICBmcm9tIHRoZSBtZXNzYWdlJ3MgdHJhY2UgY2FycmllciwgY29ubmVjdGluZyB0aGlzIGJvdW5kZWQgcGVyLWludm9jYXRpb25cbiAqICAgdHJhY2UgYmFjayB0byB3aGVyZSB0aGUgcnVuIHdhcyBzdGFydGVkLiBUaGUgcnVuLW9yaWdpbiBjb250ZXh0IGlzIGFcbiAqICAgbGluaywgbmV2ZXIgYSBwYXJlbnQsIGFuZCByZS1lbnF1ZXVlcyBmb3J3YXJkIHRoZSBvcmlnaW5hbCBjYXJyaWVyXG4gKiAgIHVuY2hhbmdlZCwgc28gdGhlIHdob2xlIHJ1biBpcyBuZXZlciBzdGl0Y2hlZCBpbnRvIG9uZSBnaWFudCB0cmFjZS5cbiAqICAgVGhlIGxpbmsgaXMgc2tpcHBlZCB3aGVuIHRoZSBjYXJyaWVyIGlzIGFic2VudCwgZW1wdHksIG9yIGludmFsaWQuXG4gKiAtIEluIGBjb250aW51b3VzYCBtb2RlIHRoZSBydW4tb3JpZ2luIGNvbnRleHQgaXMgcmVzdG9yZWQgYXMgdGhlIHBhcmVudFxuICogICBpbnN0ZWFkLCBhbmQgdGhlIGxpbmsgcG9pbnRzIGF0IHRoZSBpbmNvbWluZyBkZWxpdmVyeSBjb250ZXh0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRJbnZvY2F0aW9uU3BhbkxpbmtzKFxuICB0cmFjZU1vZGU6IFdvcmtmbG93VHJhY2VNb2RlLFxuICBpbmNvbWluZ0NhcnJpZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWRcbik6IFByb21pc2U8YXBpLkxpbmtbXSB8IHVuZGVmaW5lZD4ge1xuICBpZiAodHJhY2VNb2RlICE9PSAnbGlua2VkJykgcmV0dXJuIGxpbmtUb0N1cnJlbnRDb250ZXh0KCk7XG4gIGNvbnN0IG9yaWdpbkxpbmsgPSBhd2FpdCBsaW5rVG9UcmFjZUNhcnJpZXIoXG4gICAgaXNVc2FibGVUcmFjZUNhcnJpZXIoaW5jb21pbmdDYXJyaWVyKSA/IGluY29taW5nQ2FycmllciA6IHVuZGVmaW5lZFxuICApO1xuICByZXR1cm4gb3JpZ2luTGluayA/IFtvcmlnaW5MaW5rXSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBjdXJyZW50IHRyYWNlIGNvbnRleHQgaW50byBhIGZvcm1hdCB0aGF0IGNhbiBiZSBwYXNzZWQgdGhyb3VnaCBxdWV1ZXNcbiAqIEByZXR1cm5zIEEgcmVjb3JkIG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIHRoZSB0cmFjZSBjb250ZXh0XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXJpYWxpemVUcmFjZUNhcnJpZXIoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gIGNvbnN0IG90ZWwgPSBhd2FpdCBPdGVsQXBpLnZhbHVlO1xuICBpZiAoIW90ZWwpIHJldHVybiB7fTtcbiAgY29uc3QgY2FycmllcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAvLyBJbmplY3QgdGhlIGN1cnJlbnQgY29udGV4dCBpbnRvIHRoZSBjYXJyaWVyXG4gIG90ZWwucHJvcGFnYXRpb24uaW5qZWN0KG90ZWwuY29udGV4dC5hY3RpdmUoKSwgY2Fycmllcik7XG4gIHJldHVybiBjYXJyaWVyO1xufVxuXG4vKipcbiAqIERlc2VyaWFsaXplcyB0cmFjZSBjb250ZXh0IGFuZCByZXR1cm5zIGEgY29udGV4dCB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbnRpbnVlIHRoZSB0cmFjZVxuICogQHBhcmFtIHRyYWNlQ2FycmllciBUaGUgc2VyaWFsaXplZCB0cmFjZSBjb250ZXh0XG4gKiBAcmV0dXJucyBPcGVuVGVsZW1ldHJ5IGNvbnRleHQgd2l0aCB0aGUgcmVzdG9yZWQgdHJhY2VcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlc2VyaWFsaXplVHJhY2VDYXJyaWVyKFxuICB0cmFjZUNhcnJpZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbikge1xuICBjb25zdCBvdGVsID0gYXdhaXQgT3RlbEFwaS52YWx1ZTtcbiAgaWYgKCFvdGVsKSByZXR1cm47XG4gIC8vIEV4dHJhY3QgdGhlIGNvbnRleHQgZnJvbSB0aGUgY2FycmllclxuICByZXR1cm4gb3RlbC5wcm9wYWdhdGlvbi5leHRyYWN0KG90ZWwuY29udGV4dC5hY3RpdmUoKSwgdHJhY2VDYXJyaWVyKTtcbn1cblxuLyoqXG4gKiBSdW5zIGEgZnVuY3Rpb24gd2l0aGluIHRoZSBjb250ZXh0IG9mIGEgZGVzZXJpYWxpemVkIHRyYWNlXG4gKiBAcGFyYW0gdHJhY2VDYXJyaWVyIFRoZSBzZXJpYWxpemVkIHRyYWNlIGNhcnJpZXIgKG9wdGlvbmFsKVxuICogQHBhcmFtIGZuIFRoZSBmdW5jdGlvbiB0byBydW4gd2l0aGluIHRoZSB0cmFjZSBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFRyYWNlQ29udGV4dDxUPihcbiAgdHJhY2VDYXJyaWVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkLFxuICBmbjogKCkgPT4gUHJvbWlzZTxUPlxuKTogUHJvbWlzZTxUPiB7XG4gIGlmICghdHJhY2VDYXJyaWVyKSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH1cblxuICBjb25zdCBvdGVsID0gYXdhaXQgT3RlbEFwaS52YWx1ZTtcbiAgaWYgKCFvdGVsKSByZXR1cm4gZm4oKTtcblxuICBjb25zdCBleHRyYWN0ZWRDb250ZXh0ID0gYXdhaXQgZGVzZXJpYWxpemVUcmFjZUNhcnJpZXIodHJhY2VDYXJyaWVyKTtcbiAgaWYgKCFleHRyYWN0ZWRDb250ZXh0KSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH1cblxuICByZXR1cm4gb3RlbC5jb250ZXh0LndpdGgoZXh0cmFjdGVkQ29udGV4dCwgYXN5bmMgKCkgPT4gYXdhaXQgZm4oKSk7XG59XG5cbmNvbnN0IE90ZWxBcGkgPSBvbmNlKGFzeW5jICgpID0+IHtcbiAgLy8gYEBvcGVudGVsZW1ldHJ5L2FwaWAgaXMgYW4gb3B0aW9uYWwgcGVlciBkZXBlbmRlbmN5LiBUaGUgc3RhdGljIHNwZWNpZmllclxuICAvLyBpcyBpbnRlbnRpb25hbDogZXNidWlsZC1idW5kbGVkIHRhcmdldHMgKHRoZSBDTEknc1xuICAvLyBgdmVyY2VsLWJ1aWxkLW91dHB1dC1hcGlgIGJ1aWxkLCBOaXRybywgQXN0cm8pIHNoaXAgYSBzZWxmLWNvbnRhaW5lZFxuICAvLyBidW5kbGUgd2l0aCBubyBub2RlX21vZHVsZXMsIHNvIHRoZSBwYWNrYWdlIG11c3QgYmUgKmlubGluZWQqIGF0IGJ1aWxkXG4gIC8vIHRpbWUgZm9yIHNwYW5zIHRvIHdvcmsgYXQgcnVudGltZTsgYSBydW50aW1lLWJ1aWx0IHNwZWNpZmllciBpcyBvcGFxdWUgdG9cbiAgLy8gZXNidWlsZCBhbmQgd291bGQgc2lsZW50bHkgZGlzYWJsZSB0cmFjaW5nIHRoZXJlLiBCdW5kbGVycyB0aGF0IHJlamVjdCBhblxuICAvLyB1bnJlc29sdmFibGUgc3RhdGljIGBpbXBvcnQoKWAgd2hlbiB0aGUgcGVlciBpc24ndCBpbnN0YWxsZWQgKFJvbGx1cC9WaXRlLFxuICAvLyBlLmcuIFN2ZWx0ZUtpdCkgaW5zdGVhZCBleHRlcm5hbGl6ZSBgQG9wZW50ZWxlbWV0cnkvYXBpYCBpbiB0aGUgd29ya2Zsb3dcbiAgLy8gZnJhbWV3b3JrIGludGVncmF0aW9uLCB3aGljaCBrZWVwcyB0aGUgYnVpbGQgZ3JlZW4gYW5kIHN0aWxsIGxvYWRzIHJlYWxcbiAgLy8gT1RlbCB3aGVuIHRoZSBwZWVyIGlzIHByZXNlbnQuIFJ1bnRpbWUgc2VtYW50aWNzOiBwcmVzZW50IOKGkiBsb2FkZWQsIGFic2VudFxuICAvLyDihpIgY2F1Z2h0IGFuZCB0cmFjaW5nIGRpc2FibGVkLlxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBpbXBvcnQoJ0BvcGVudGVsZW1ldHJ5L2FwaScpO1xuICB9IGNhdGNoIHtcbiAgICBydW50aW1lTG9nZ2VyLmluZm8oJ09wZW5UZWxlbWV0cnkgbm90IGF2YWlsYWJsZSwgdHJhY2luZyB3aWxsIGJlIGRpc2FibGVkJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn0pO1xuXG5jb25zdCBUcmFjZXIgPSBvbmNlKGFzeW5jICgpID0+IHtcbiAgY29uc3QgYXBpID0gYXdhaXQgT3RlbEFwaS52YWx1ZTtcbiAgaWYgKCFhcGkpIHJldHVybiBudWxsO1xuICBjb25zdCB0cmFjZXIgPSBhcGkudHJhY2UuZ2V0VHJhY2VyKCd3b3JrZmxvdycpO1xuICBsb2dPdGVsRGlhZ25vc3RpY09uY2UoYXBpLCB0cmFjZXIpO1xuICByZXR1cm4gdHJhY2VyO1xufSk7XG5cbmNvbnN0IFN0ZXBFeGVjdXRpb25EdXJhdGlvbkhpc3RvZ3JhbSA9IG9uY2UoYXN5bmMgKCkgPT4ge1xuICBjb25zdCBvdGVsID0gYXdhaXQgT3RlbEFwaS52YWx1ZTtcbiAgaWYgKCFvdGVsKSByZXR1cm4gbnVsbDtcbiAgLy8gc2VydmljZS5uYW1lIGlzIGEgcmVzb3VyY2UgYXR0cmlidXRlLCBhcHBsaWVkIGJ5IHRoZSBjb25maWd1cmVkIHByb3ZpZGVyLlxuICByZXR1cm4gb3RlbC5tZXRyaWNzXG4gICAgLmdldE1ldGVyKCd3b3JrZmxvdycpXG4gICAgLmNyZWF0ZUhpc3RvZ3JhbSgnd29ya2Zsb3cuc3RlcC5leGVjdXRlLmR1cmF0aW9uJywge1xuICAgICAgZGVzY3JpcHRpb246ICdEdXJhdGlvbiBvZiB1c2VyIHN0ZXAgZXhlY3V0aW9uJyxcbiAgICAgIHVuaXQ6ICdtcycsXG4gICAgfSk7XG59KTtcblxuLyoqXG4gKiBPbmUtc2hvdCBydW50aW1lIGRpYWdub3N0aWMgKERFQlVHPXdvcmtmbG93Oiogb25seSksIHNhbWUgc2hhcGUgYXMgdGhlIG9uZVxuICogd29ybGQtdmVyY2VsIGVtaXRzIHRhZ2dlZCBgd29ybGQtdmVyY2VsYDogcHJpbnRzIGhvdyB0aGlzIG1vZHVsZSBpbnN0YW5jZVxuICogb2YgYEBvcGVudGVsZW1ldHJ5L2FwaWAgc2VlcyB0aGUgZ2xvYmFsIHJlZ2lzdHJhdGlvbiwgc28gYSBkZXBsb3ltZW50J3NcbiAqIGxvZ3Mgc2hvdyB0aGUgdHdvIHBhY2thZ2VzJyB2aWV3cyBzaWRlIGJ5IHNpZGUuXG4gKi9cbi8vIHBlci1jb3B5LW9rOiB0aGlzIGRpYWdub3N0aWMgcmVwb3J0cyBob3cgVEhJUyBtb2R1bGUgaW5zdGFuY2Ugc2VlcyB0aGUgZ2xvYmFsXG4vLyBPVGVsIHJlZ2lzdHJhdGlvbiwgd2hpY2ggaXMgdGhlIHdob2xlIHBvaW50IG9mIHRoZSBsb2cuIFdpdGggc2V2ZXJhbCBjb3BpZXNcbi8vIGluIGEgcHJvY2VzcywgZWFjaCBvbmUncyB2aWV3IGlzIHdoYXQgaXMgd29ydGggc2VlaW5nLlxubGV0IG90ZWxEaWFnTG9nZ2VkID0gZmFsc2U7XG5mdW5jdGlvbiBsb2dPdGVsRGlhZ25vc3RpY09uY2Uob3RlbDogdHlwZW9mIGFwaSwgdHJhY2VyOiBhcGkuVHJhY2VyKTogdm9pZCB7XG4gIGNvbnN0IGRlYnVnRW5hYmxlZCA9XG4gICAgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIHByb2Nlc3MuZW52LkRFQlVHID09PSAnc3RyaW5nJyAmJlxuICAgIChwcm9jZXNzLmVudi5ERUJVRy5pbmNsdWRlcygnd29ya2Zsb3c6JykgfHwgcHJvY2Vzcy5lbnYuREVCVUcgPT09ICcqJyk7XG4gIGlmIChvdGVsRGlhZ0xvZ2dlZCB8fCAhZGVidWdFbmFibGVkKSByZXR1cm47XG4gIG90ZWxEaWFnTG9nZ2VkID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBjb25zdCBnID0gKGdsb2JhbFRoaXMgYXMgUmVjb3JkPHN5bWJvbCwgdW5rbm93bj4pW1xuICAgICAgU3ltYm9sLmZvcignb3BlbnRlbGVtZXRyeS5qcy5hcGkuMScpXG4gICAgXSBhcyB7IHZlcnNpb24/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBwcm92aWRlciA9IG90ZWwudHJhY2UuZ2V0VHJhY2VyUHJvdmlkZXIoKTtcbiAgICBjb25zdCBkZWxlZ2F0ZSA9XG4gICAgICAocHJvdmlkZXIgYXMgeyBnZXREZWxlZ2F0ZT86ICgpID0+IHVua25vd24gfSkuZ2V0RGVsZWdhdGU/LigpID8/IHByb3ZpZGVyO1xuICAgIGNvbnN0IHByb2JlID0gdHJhY2VyLnN0YXJ0U3Bhbignd29ya2Zsb3cub3RlbC5wcm9iZS5jb3JlJyk7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ1t3b3JrZmxvdzpvdGVsLWRpYWddIGNvcmUnLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBnbG9iYWxSZWdpc3RyYXRpb25WZXJzaW9uOiBnPy52ZXJzaW9uID8/IG51bGwsXG4gICAgICAgIHByb3ZpZGVyQ3RvcjogcHJvdmlkZXI/LmNvbnN0cnVjdG9yPy5uYW1lID8/IG51bGwsXG4gICAgICAgIGRlbGVnYXRlQ3RvcjogKGRlbGVnYXRlIGFzIG9iamVjdCB8IG51bGwpPy5jb25zdHJ1Y3Rvcj8ubmFtZSA/PyBudWxsLFxuICAgICAgICB0cmFjZXJDdG9yOiB0cmFjZXI/LmNvbnN0cnVjdG9yPy5uYW1lID8/IG51bGwsXG4gICAgICAgIHByb2JlQ3RvcjogcHJvYmU/LmNvbnN0cnVjdG9yPy5uYW1lID8/IG51bGwsXG4gICAgICAgIHByb2JlUmVjb3JkaW5nOiBwcm9iZS5pc1JlY29yZGluZygpLFxuICAgICAgfSlcbiAgICApO1xuICAgIHByb2JlLmVuZCgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICdbd29ya2Zsb3c6b3RlbC1kaWFnXSBjb3JlIGZhaWxlZDonLFxuICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvclxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRyYWNlPFQ+KFxuICBzcGFuTmFtZTogc3RyaW5nLFxuICAuLi5hcmdzOlxuICAgIHwgW2ZuOiAoc3Bhbj86IFNwYW4pID0+IFByb21pc2U8VD5dXG4gICAgfCBbb3B0czogU3Bhbk9wdGlvbnMsIGZuOiAoc3Bhbj86IFNwYW4pID0+IFByb21pc2U8VD5dXG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgW3RyYWNlciwgb3RlbF0gPSBhd2FpdCBQcm9taXNlLmFsbChbVHJhY2VyLnZhbHVlLCBPdGVsQXBpLnZhbHVlXSk7XG4gIGNvbnN0IHsgZm4sIG9wdHMgfSA9XG4gICAgdHlwZW9mIGFyZ3NbMF0gPT09ICdmdW5jdGlvbidcbiAgICAgID8geyBmbjogYXJnc1swXSwgb3B0czoge30gfVxuICAgICAgOiB7IGZuOiBhcmdzWzFdLCBvcHRzOiBhcmdzWzBdIH07XG4gIGlmICghZm4pIHRocm93IG5ldyBFcnJvcignRnVuY3Rpb24gdG8gdHJhY2UgbXVzdCBiZSBwcm92aWRlZCcpO1xuXG4gIGlmICghdHJhY2VyIHx8ICFvdGVsKSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH1cblxuICByZXR1cm4gdHJhY2VyLnN0YXJ0QWN0aXZlU3BhbihzcGFuTmFtZSwgb3B0cywgYXN5bmMgKHNwYW4pID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZm4oc3Bhbik7XG4gICAgICBzcGFuLnNldFN0YXR1cyh7IGNvZGU6IG90ZWwuU3BhblN0YXR1c0NvZGUuT0sgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChXb3JrZmxvd1N1c3BlbnNpb24uaXMoZSkpIHtcbiAgICAgICAgc3Bhbi5zZXRTdGF0dXMoeyBjb2RlOiBvdGVsLlNwYW5TdGF0dXNDb2RlLk9LIH0pO1xuICAgICAgICBhcHBseVdvcmtmbG93U3VzcGVuc2lvblRvU3BhbihlLCBzcGFuKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNwYW4uc2V0U3RhdHVzKHtcbiAgICAgICAgICBjb2RlOiBvdGVsLlNwYW5TdGF0dXNDb2RlLkVSUk9SLFxuICAgICAgICAgIG1lc3NhZ2U6IChlIGFzIEVycm9yKS5tZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHRocm93IGU7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNwYW4uZW5kKCk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBFbWl0IGEgc3BhbiB3aG9zZSBzdGFydCBpcyBiYWNrLWRhdGVkIHRvIGBzdGFydEVwb2NoTXNgIGFuZCB3aG9zZSBlbmQgaXMgbm93LFxuICogc28gaXRzIGR1cmF0aW9uIHJlZmxlY3RzIGFuIGludGVydmFsIG9ubHkgbWVhc3VyYWJsZSBhdCBpdHMgZW5kIChlLmcuXG4gKiB0aW1lLXRvLWZpcnN0LWNodW5rLCBrbm93biB3aGVuIHRoZSBmaXJzdCBjaHVuayBhcnJpdmVzKS4gVW5saWtlIGB0cmFjZSgpYCxcbiAqIHRoaXMgcmVjb3JkcyBhbiBhbHJlYWR5LWVsYXBzZWQgc3BhbiBpbiBvbmUgc2hvdCByYXRoZXIgdGhhbiB3cmFwcGluZyBhXG4gKiBjYWxsYmFjay4gTm8tb3Agd2hlbiBPcGVuVGVsZW1ldHJ5IGlzIG5vdCBhdmFpbGFibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWNvcmRFbGFwc2VkU3BhbihcbiAgc3Bhbk5hbWU6IHN0cmluZyxcbiAgc3RhcnRFcG9jaE1zOiBudW1iZXIsXG4gIG9wdHM/OiBTcGFuT3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHRyYWNlciA9IGF3YWl0IFRyYWNlci52YWx1ZTtcbiAgaWYgKCF0cmFjZXIpIHJldHVybjtcbiAgdHJhY2VyLnN0YXJ0U3BhbihzcGFuTmFtZSwgeyAuLi5vcHRzLCBzdGFydFRpbWU6IHN0YXJ0RXBvY2hNcyB9KS5lbmQoKTtcbn1cblxuLyoqXG4gKiBSZWNvcmRzIHRoZSBzYW1lIHVzZXItY29kZSBpbnRlcnZhbCBhcyB0aGUgaW5uZXIgYHN0ZXAuZXhlY3V0ZWAgc3Bhbi4gVGhlXG4gKiBjb25maWd1cmVkIE9wZW5UZWxlbWV0cnkgbWV0ZXIgcHJvdmlkZXIgYXR0YWNoZXMgcmVzb3VyY2UgZGltZW5zaW9ucyBzdWNoIGFzXG4gKiBzZXJ2aWNlLm5hbWUsIHNvIHRoaXMgYXZvaWRzIGFjY2VwdGluZyBhIGNhbGxlci1jb250cm9sbGVkIHNlcnZpY2UgdGFnLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVjb3JkU3RlcEV4ZWN1dGlvbkR1cmF0aW9uKFxuICBkdXJhdGlvbk1zOiBudW1iZXIsXG4gIHN0YXR1czogJ29rJyB8ICdlcnJvcidcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBoaXN0b2dyYW0gPSBhd2FpdCBTdGVwRXhlY3V0aW9uRHVyYXRpb25IaXN0b2dyYW0udmFsdWU7XG4gIGhpc3RvZ3JhbT8ucmVjb3JkKGR1cmF0aW9uTXMsIHsgJ3dvcmtmbG93LnN0ZXAuc3RhdHVzJzogc3RhdHVzIH0pO1xufVxuXG4vKipcbiAqIEFwcGxpZXMgdGhlIHdvcmtmbG93IHN1c3BlbnNpb24gYWxnZWJyYWljIGVmZmVjdCB0byBhbiBhY3RpdmUgc3Bhbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5V29ya2Zsb3dTdXNwZW5zaW9uVG9TcGFuKFxuICBlcnJvcjogV29ya2Zsb3dTdXNwZW5zaW9uLFxuICBzcGFuOiBhcGkuU3BhblxuKTogdm9pZCB7XG4gIHNwYW4uc2V0QXR0cmlidXRlcyh7XG4gICAgLi4uQXR0ci5Xb3JrZmxvd1N1c3BlbnNpb25TdGF0ZSgnc3VzcGVuZGVkJyksXG4gICAgLi4uQXR0ci5Xb3JrZmxvd1N1c3BlbnNpb25TdGVwQ291bnQoZXJyb3Iuc3RlcENvdW50KSxcbiAgICAuLi5BdHRyLldvcmtmbG93U3VzcGVuc2lvbkhvb2tDb3VudChlcnJvci5ob29rQ291bnQpLFxuICAgIC4uLkF0dHIuV29ya2Zsb3dTdXNwZW5zaW9uV2FpdENvdW50KGVycm9yLndhaXRDb3VudCksXG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U3BhbkNvbnRleHRGb3JUcmFjZUNhcnJpZXIoXG4gIGNhcnJpZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbikge1xuICBjb25zdCBbZGVzZXJpYWxpemVkLCBvdGVsXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBkZXNlcmlhbGl6ZVRyYWNlQ2FycmllcihjYXJyaWVyKSxcbiAgICBPdGVsQXBpLnZhbHVlLFxuICBdKTtcbiAgaWYgKCFkZXNlcmlhbGl6ZWQgfHwgIW90ZWwpIHJldHVybjtcbiAgcmV0dXJuIG90ZWwudHJhY2UuZ2V0U3BhbkNvbnRleHQoZGVzZXJpYWxpemVkKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEFjdGl2ZVNwYW4oKSB7XG4gIHJldHVybiBhd2FpdCB3aXRoT3RlbCgob3RlbCkgPT4gb3RlbC50cmFjZS5nZXRBY3RpdmVTcGFuKCkpO1xufVxuXG4vKipcbiAqIFdyYXBzIGFsbCBtZXRob2RzIG9mIGFuIG9iamVjdCB3aXRoIHRyYWNpbmcgc3BhbnMuXG4gKiBAcGFyYW0gcHJlZml4IC0gUHJlZml4IGZvciBzcGFuIG5hbWVzIChlLmcuLCBcIldPUkxELnJ1bnNcIilcbiAqIEBwYXJhbSBvIC0gT2JqZWN0IHdpdGggbWV0aG9kcyB0byBpbnN0cnVtZW50XG4gKiBAcmV0dXJucyBJbnN0cnVtZW50ZWQgb2JqZWN0IHdpdGggc2FtZSBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RydW1lbnRPYmplY3Q8VCBleHRlbmRzIG9iamVjdD4ocHJlZml4OiBzdHJpbmcsIG86IFQpOiBUIHtcbiAgY29uc3QgaGFuZGxlcnMgPSB7fSBhcyBUO1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvKSBhcyAoa2V5b2YgVClbXSkge1xuICAgIGlmICh0eXBlb2Ygb1trZXldICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBoYW5kbGVyc1trZXldID0gb1trZXldO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmID0gb1trZXldO1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgaGFuZGxlcnNba2V5XSA9IGFzeW5jICguLi5hcmdzOiBhbnlbXSkgPT5cbiAgICAgICAgdHJhY2UoYCR7cHJlZml4fS4ke1N0cmluZyhrZXkpfWAsIHt9LCAoKSA9PiBmKC4uLmFyZ3MpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGhhbmRsZXJzO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U3BhbktpbmQoZmllbGQ6IGtleW9mIHR5cGVvZiBTcGFuS2luZCkge1xuICByZXR1cm4gd2l0aE90ZWwoKHgpID0+IHguU3BhbktpbmRbZmllbGRdKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhPdGVsPFQ+KFxuICBmbjogKG90ZWw6IHR5cGVvZiBhcGkpID0+IFRcbik6IFByb21pc2U8QXdhaXRlZDxUPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBvdGVsID0gYXdhaXQgT3RlbEFwaS52YWx1ZTtcbiAgaWYgKCFvdGVsKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gYXdhaXQgZm4ob3RlbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsaW5rVG9DdXJyZW50Q29udGV4dCgpOiBQcm9taXNlPFthcGkuTGlua10gfCB1bmRlZmluZWQ+IHtcbiAgcmV0dXJuIHdpdGhPdGVsKChvdGVsKTogW2FwaS5MaW5rXSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IG90ZWwudHJhY2UuZ2V0QWN0aXZlU3BhbigpPy5zcGFuQ29udGV4dCgpO1xuICAgIGlmICghY29udGV4dCkgcmV0dXJuO1xuICAgIHJldHVybiBbeyBjb250ZXh0IH1dO1xuICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBzcGFuIGxpbmsgcG9pbnRpbmcgYXQgdGhlIHNwYW4gY29udGV4dCBlbWJlZGRlZCBpbiBhIHNlcmlhbGl6ZWRcbiAqIHRyYWNlIGNhcnJpZXIgKGUuZy4gdGhlIHJ1bi1vcmlnaW4gY29udGV4dCBmbG93aW5nIHRocm91Z2ggcXVldWVcbiAqIG1lc3NhZ2VzKS4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIE9URUwgaXMgdW5hdmFpbGFibGUsIHRoZSBjYXJyaWVyIGlzXG4gKiBhYnNlbnQsIG9yIGl0IGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBzcGFuIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaW5rVG9UcmFjZUNhcnJpZXIoXG4gIGNhcnJpZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWRcbik6IFByb21pc2U8YXBpLkxpbmsgfCB1bmRlZmluZWQ+IHtcbiAgaWYgKCFjYXJyaWVyKSByZXR1cm47XG4gIGNvbnN0IFtjb250ZXh0LCBvdGVsXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBnZXRTcGFuQ29udGV4dEZvclRyYWNlQ2FycmllcihjYXJyaWVyKSxcbiAgICBPdGVsQXBpLnZhbHVlLFxuICBdKTtcbiAgaWYgKCFjb250ZXh0IHx8ICFvdGVsKSByZXR1cm47XG4gIGlmICghb3RlbC50cmFjZS5pc1NwYW5Db250ZXh0VmFsaWQoY29udGV4dCkpIHJldHVybjtcbiAgcmV0dXJuIHsgY29udGV4dCB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJhZ2dhZ2UgUHJvcGFnYXRpb24gVXRpbGl0aWVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBXb3JrZmxvdyBjb250ZXh0IHRvIHByb3BhZ2F0ZSB2aWEgYmFnZ2FnZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93QmFnZ2FnZUNvbnRleHQge1xuICB3b3JrZmxvd1J1bklkOiBzdHJpbmc7XG4gIHdvcmtmbG93TmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNldHMgd29ya2Zsb3cgY29udGV4dCBhcyBPVEVMIGJhZ2dhZ2UgZm9yIGF1dG9tYXRpYyBwcm9wYWdhdGlvbi5cbiAqIEJhZ2dhZ2UgaXMgcHJvcGFnYXRlZCBhY3Jvc3Mgc2VydmljZSBib3VuZGFyaWVzIHZpYSBIVFRQIGhlYWRlcnMuXG4gKiBAcGFyYW0gY29udGV4dCAtIFdvcmtmbG93IGNvbnRleHQgdG8gc2V0IGFzIGJhZ2dhZ2VcbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdG8gcnVuIHdpdGhpbiB0aGUgYmFnZ2FnZSBjb250ZXh0XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoV29ya2Zsb3dCYWdnYWdlPFQ+KFxuICBjb250ZXh0OiBXb3JrZmxvd0JhZ2dhZ2VDb250ZXh0LFxuICBmbjogKCkgPT4gUHJvbWlzZTxUPlxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IG90ZWwgPSBhd2FpdCBPdGVsQXBpLnZhbHVlO1xuICBpZiAoIW90ZWwpIHJldHVybiBmbigpO1xuXG4gIC8vIENyZWF0ZSBiYWdnYWdlIHdpdGggd29ya2Zsb3cgY29udGV4dFxuICBjb25zdCBiYWdnYWdlID0gb3RlbC5wcm9wYWdhdGlvbi5jcmVhdGVCYWdnYWdlKHtcbiAgICAnd29ya2Zsb3cucnVuX2lkJzogeyB2YWx1ZTogY29udGV4dC53b3JrZmxvd1J1bklkIH0sXG4gICAgJ3dvcmtmbG93Lm5hbWUnOiB7IHZhbHVlOiBjb250ZXh0LndvcmtmbG93TmFtZSB9LFxuICB9KTtcblxuICAvLyBTZXQgYmFnZ2FnZSBpbiBjb250ZXh0IGFuZCBydW4gZnVuY3Rpb25cbiAgY29uc3QgY29udGV4dFdpdGhCYWdnYWdlID0gb3RlbC5wcm9wYWdhdGlvbi5zZXRCYWdnYWdlKFxuICAgIG90ZWwuY29udGV4dC5hY3RpdmUoKSxcbiAgICBiYWdnYWdlXG4gICk7XG5cbiAgcmV0dXJuIG90ZWwuY29udGV4dC53aXRoKGNvbnRleHRXaXRoQmFnZ2FnZSwgKCkgPT4gZm4oKSk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHdvcmtmbG93IGNvbnRleHQgZnJvbSBPVEVMIGJhZ2dhZ2UuXG4gKiBAcmV0dXJucyBXb3JrZmxvdyBjb250ZXh0IGlmIHByZXNlbnQgaW4gYmFnZ2FnZSwgdW5kZWZpbmVkIG90aGVyd2lzZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0V29ya2Zsb3dCYWdnYWdlKCk6IFByb21pc2U8XG4gIFdvcmtmbG93QmFnZ2FnZUNvbnRleHQgfCB1bmRlZmluZWRcbj4ge1xuICBjb25zdCBvdGVsID0gYXdhaXQgT3RlbEFwaS52YWx1ZTtcbiAgaWYgKCFvdGVsKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGJhZ2dhZ2UgPSBvdGVsLnByb3BhZ2F0aW9uLmdldEJhZ2dhZ2Uob3RlbC5jb250ZXh0LmFjdGl2ZSgpKTtcbiAgaWYgKCFiYWdnYWdlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHJ1bklkID0gYmFnZ2FnZS5nZXRFbnRyeSgnd29ya2Zsb3cucnVuX2lkJyk/LnZhbHVlO1xuICBjb25zdCBuYW1lID0gYmFnZ2FnZS5nZXRFbnRyeSgnd29ya2Zsb3cubmFtZScpPy52YWx1ZTtcblxuICBpZiAoIXJ1bklkIHx8ICFuYW1lKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgd29ya2Zsb3dOYW1lOiBuYW1lLFxuICB9O1xufVxuIl19
427
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVsZW1ldHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RlbGVtZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUNqRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sS0FBSyxJQUFJLE1BQU0scUNBQXFDLENBQUM7QUFvQjVEOzs7O0dBSUc7QUFDSCxNQUFNLGlCQUFpQixHQUFHLGVBQWUsQ0FDdkMsbUNBQW1DLEVBQ25DLENBQUMsRUFDRCxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLElBQUksR0FBRyxFQUFVLEVBQUUsQ0FBQyxDQUM1QyxDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CO0lBQ2xDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUM7SUFDOUMsSUFBSSxLQUFLLEtBQUssWUFBWTtRQUFFLE9BQU8sWUFBWSxDQUFDO0lBQ2hELElBQ0UsS0FBSztRQUNMLEtBQUssS0FBSyxRQUFRO1FBQ2xCLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFDMUMsQ0FBQztRQUNELGlCQUFpQixDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsYUFBYSxDQUFDLElBQUksQ0FDaEIsMkNBQTJDLEtBQUssaUVBQWlFLENBQ2xILENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDbEMsT0FBMkM7SUFFM0MsT0FBTyxPQUFPLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxJ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USxDQUFDLGVBQWUsQ0FBQyxFQUFFLEtBQUssQ0FBQztJQUV0RCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBRXRDLE9BQU87UUFDTCxhQUFhLEVBQUUsS0FBSztRQUNwQixZQUFZLEVBQUUsSUFBSTtLQUNuQixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlICogYXMgYXBpIGZyb20gJ0BvcGVudGVsZW1ldHJ5L2FwaSc7XG5pbXBvcnQgdHlwZSB7IFNwYW4sIFNwYW5LaW5kLCBTcGFuT3B0aW9ucyB9IGZyb20gJ0BvcGVudGVsZW1ldHJ5L2FwaSc7XG5pbXBvcnQgeyBnbG9iYWxTaW5nbGV0b24sIG9uY2UgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHsgV29ya2Zsb3dTdXNwZW5zaW9uIH0gZnJvbSAnLi9nbG9iYWwuanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcbmltcG9ydCAqIGFzIEF0dHIgZnJvbSAnLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFRyYWNlIENvbnRleHQgUHJvcGFnYXRpb24gVXRpbGl0aWVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBDb250cm9scyBob3cgd29ya2Zsb3cvc3RlcCBxdWV1ZS1oYW5kbGVyIHNwYW5zIHJlbGF0ZSB0byB0aGUgcnVuLW9yaWdpblxuICogdHJhY2UgY29udGV4dCBjYXJyaWVkIGluIHF1ZXVlIG1lc3NhZ2VzOlxuICpcbiAqIC0gYCdsaW5rZWQnYCAoZGVmYXVsdCk6IGVhY2ggaW52b2NhdGlvbiBzdGFydHMgYSBORVcgcm9vdCB0cmFjZTsgdGhlXG4gKiAgIHJ1bi1vcmlnaW4gY29udGV4dCAoYW5kIHRoZSBpbmNvbWluZyBkZWxpdmVyeSBjb250ZXh0KSBhcmUgYXR0YWNoZWQgYXNcbiAqICAgc3BhbiBsaW5rcy4gVGhpcyBrZWVwcyB0cmFjZXMgYm91bmRlZCBwZXIgaW52b2NhdGlvbiBpbnN0ZWFkIG9mXG4gKiAgIHN0aXRjaGluZyBhIGxvbmctbGl2ZWQgcnVuIGludG8gb25lIGdpYW50IHRyYWNlLlxuICogLSBgJ2NvbnRpbnVvdXMnYDogdGhlIHJlc3RvcmVkIHJ1bi1vcmlnaW4gY29udGV4dCBiZWNvbWVzIHRoZSBwYXJlbnQgb2ZcbiAqICAgdGhlIGludm9jYXRpb24gc3BhbiAobGVnYWN5IGJlaGF2aW9yKSwgcHJvZHVjaW5nIGEgc2luZ2xlIHRyYWNlIHRoYXRcbiAqICAgc3BhbnMgdGhlIGVudGlyZSBydW4uXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93VHJhY2VNb2RlID0gJ2xpbmtlZCcgfCAnY29udGludW91cyc7XG5cbi8qKlxuICogVW5yZWNvZ25pemVkIGBXT1JLRkxPV19UUkFDRV9NT0RFYCB2YWx1ZXMgd2UgYWxyZWFkeSB3YXJuZWQgYWJvdXQuIE9uXG4gKiBgZ2xvYmFsVGhpc2AgKHNlZSBgZ2xvYmFsU2luZ2xldG9uYCkgc28gdGhlIHdhcm5pbmcgc3RheXMgb25jZSBwZXIgcHJvY2Vzc1xuICogcmF0aGVyIHRoYW4gb25jZSBwZXIgYnVuZGxlciBsYXllci5cbiAqL1xuY29uc3QgdHJhY2VNb2RlV2FybmluZ3MgPSBnbG9iYWxTaW5nbGV0b24oXG4gICdAd29ya2Zsb3cvY29yZS8vdHJhY2VNb2RlV2FybmluZ3MnLFxuICAxLFxuICAoKSA9PiAoeyB1bnJlY29nbml6ZWQ6IG5ldyBTZXQ8c3RyaW5nPigpIH0pXG4pO1xuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBhY3RpdmUgdHJhY2UgbW9kZSBmcm9tIHRoZSBgV09SS0ZMT1dfVFJBQ0VfTU9ERWAgZW52IHZhci5cbiAqIERlZmF1bHRzIHRvIGAnbGlua2VkJ2A7IGFueSB2YWx1ZSBvdGhlciB0aGFuIGAnY29udGludW91cydgIHNlbGVjdHMgaXQuXG4gKiBVbnJlY29nbml6ZWQgbm9uLWVtcHR5IHZhbHVlcyAoZS5nLiB0eXBvcyBsaWtlIGBjb250aW5vdXNgKSBlbWl0IGFcbiAqIG9uZS10aW1lIHdhcm5pbmcgc28gc2lsZW50IGZhbGxiYWNrIHRvIGBsaW5rZWRgIGlzIGF0IGxlYXN0IHZpc2libGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRXb3JrZmxvd1RyYWNlTW9kZSgpOiBXb3JrZmxvd1RyYWNlTW9kZSB7XG4gIGNvbnN0IHZhbHVlID0gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfVFJBQ0VfTU9ERTtcbiAgaWYgKHZhbHVlID09PSAnY29udGludW91cycpIHJldHVybiAnY29udGludW91cyc7XG4gIGlmIChcbiAgICB2YWx1ZSAmJlxuICAgIHZhbHVlICE9PSAnbGlua2VkJyAmJlxuICAgICF0cmFjZU1vZGVXYXJuaW5ncy51bnJlY29nbml6ZWQuaGFzKHZhbHVlKVxuICApIHtcbiAgICB0cmFjZU1vZGVXYXJuaW5ncy51bnJlY29nbml6ZWQuYWRkKHZhbHVlKTtcbiAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICBgVW5yZWNvZ25pemVkIFdPUktGTE9XX1RSQUNFX01PREUgdmFsdWUgXCIke3ZhbHVlfVwiOyBleHBlY3RlZCBcImxpbmtlZFwiIG9yIFwiY29udGludW91c1wiLiBGYWxsaW5nIGJhY2sgdG8gXCJsaW5rZWRcIi5gXG4gICAgKTtcbiAgfVxuICByZXR1cm4gJ2xpbmtlZCc7XG59XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIGEgc2VyaWFsaXplZCB0cmFjZSBjYXJyaWVyIGlzIHVzYWJsZSwgaS5lLiBwcmVzZW50IGFuZFxuICogbm9uLWVtcHR5LiBgc2VyaWFsaXplVHJhY2VDYXJyaWVyKClgIHJldHVybnMgYHt9YCB3aGVuIG5vIE9URUwgU0RLIGlzXG4gKiByZWdpc3RlcmVkIG9yIG5vIHNwYW4gaXMgYWN0aXZlLCBhbmQgYHN0YXJ0KClgIGFsd2F5cyBhdHRhY2hlcyB0aGVcbiAqIGNhcnJpZXIgdG8gdGhlIGZpcnN0IHF1ZXVlIG1lc3NhZ2UsIHNvIGFuIGVtcHR5IGNhcnJpZXIgbXVzdCBiZSB0cmVhdGVkXG4gKiB0aGUgc2FtZSBhcyBhbiBhYnNlbnQgb25lIHdoZXJldmVyIHRoZSB0cmFjZS1tb2RlIGxvZ2ljIGJyYW5jaGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNVc2FibGVUcmFjZUNhcnJpZXIoXG4gIGNhcnJpZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWRcbik6IGNhcnJpZXIgaXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gIHJldHVybiBjYXJyaWVyICE9PSB1bmRlZmluZWQgJiYgT2JqZWN0LmtleXMoY2FycmllcikubGVuZ3RoID4gMDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cmFjZSBjYXJyaWVyIHRvIGF0dGFjaCB0byBtZXNzYWdlcyB0aGUgY3VycmVudCBpbnZvY2F0aW9uXG4gKiBlbnF1ZXVlcy4gSW4gYGxpbmtlZGAgbW9kZSB0aGUgT1JJR0lOQUwgcnVuLW9yaWdpbiBjYXJyaWVyIGlzIGZvcndhcmRlZFxuICogdW5jaGFuZ2VkICh3aGVuIHVzYWJsZSkgc28gZXZlcnkgZnV0dXJlIGludm9jYXRpb24gbGlua3MgYmFjayB0byB0aGUgc2FtZVxuICogb3JpZ2luOyBvdGhlcndpc2UgKGBjb250aW51b3VzYCBtb2RlLCBvciBubyB1c2FibGUgaW5jb21pbmcgY2FycmllcilcbiAqIHRoZSBjdXJyZW50IChhY3RpdmUpIGNvbnRleHQgaXMgc2VyaWFsaXplZCwgc28gdGhlIHRyYWNlIGtlZXBzIGNoYWluaW5nXG4gKiAoY29udGludW91cykgb3IgdGhlIGZpcnN0IGluc3RydW1lbnRlZCBpbnZvY2F0aW9uIGJlY29tZXMgdGhlIGRlLWZhY3RvXG4gKiBvcmlnaW4gKGxpbmtlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXROZXh0VHJhY2VDYXJyaWVyKFxuICB0cmFjZU1vZGU6IFdvcmtmbG93VHJhY2VNb2RlLFxuICBpbmNvbWluZ0NhcnJpZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWRcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICByZXR1cm4gdHJhY2VNb2RlID09PSAnbGlua2VkJyAmJiBpc1VzYWJsZVRyYWNlQ2FycmllcihpbmNvbWluZ0NhcnJpZXIpXG4gICAgPyBQcm9taXNlLnJlc29sdmUoaW5jb21pbmdDYXJyaWVyKVxuICAgIDogc2VyaWFsaXplVHJhY2VDYXJyaWVyKCk7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBzcGFuIGxpbmtzIGZvciBhIHF1ZXVlLWRlbGl2ZXJlZCBpbnZvY2F0aW9uIHNwYW5cbiAqIChgd29ya2Zsb3cuZXhlY3V0ZWAgLyBgc3RlcC5leGVjdXRlYCk6XG4gKlxuICogLSBJbiBgbGlua2VkYCBtb2RlIHRoZSBpbnZvY2F0aW9uIHNwYW4gaXMgYSBDSElMRCBvZiB0aGUgbG9jYWwgZGVsaXZlcnlcbiAqICAgKGZsb3ctcm91dGUpIGNvbnRleHQsIHNvIHRoZSBvbmx5IGxpbmsgaXMgdG8gdGhlIHJ1bi1vcmlnaW4gY29udGV4dFxuICogICBmcm9tIHRoZSBtZXNzYWdlJ3MgdHJhY2UgY2FycmllciwgY29ubmVjdGluZyB0aGlzIGJvdW5kZWQgcGVyLWludm9jYXRpb25cbiAqICAgdHJhY2UgYmFjayB0byB3aGVyZSB0aGUgcnVuIHdhcyBzdGFydGVkLiBUaGUgcnVuLW9yaWdpbiBjb250ZXh0IGlzIGFcbiAqICAgbGluaywgbmV2ZXIgYSBwYXJlbnQsIGFuZCByZS1lbnF1ZXVlcyBmb3J3YXJkIHRoZSBvcmlnaW5hbCBjYXJyaWVyXG4gKiAgIHVuY2hhbmdlZCwgc28gdGhlIHdob2xlIHJ1biBpcyBuZXZlciBzdGl0Y2hlZCBpbnRvIG9uZSBnaWFudCB0cmFjZS5cbiAqICAgVGhlIGxpbmsgaXMgc2tpcHBlZCB3aGVuIHRoZSBjYXJyaWVyIGlzIGFic2VudCwgZW1wdHksIG9yIGludmFsaWQuXG4gKiAtIEluIGBjb250aW51b3VzYCBtb2RlIHRoZSBydW4tb3JpZ2luIGNvbnRleHQgaXMgcmVzdG9yZWQgYXMgdGhlIHBhcmVudFxuICogICBpbnN0ZWFkLCBhbmQgdGhlIGxpbmsgcG9pbnRzIGF0IHRoZSBpbmNvbWluZyBkZWxpdmVyeSBjb250ZXh0LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRJbnZvY2F0aW9uU3BhbkxpbmtzKFxuICB0cmFjZU1vZGU6IFdvcmtmbG93VHJhY2VNb2RlLFxuICBpbmNvbWluZ0NhcnJpZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWRcbik6IFByb21pc2U8YXBpLkxpbmtbXSB8IHVuZGVmaW5lZD4ge1xuICBpZiAodHJhY2VNb2RlICE9PSAnbGlua2VkJykgcmV0dXJuIGxpbmtUb0N1cnJlbnRDb250ZXh0KCk7XG4gIGNvbnN0IG9yaWdpbkxpbmsgPSBhd2FpdCBsaW5rVG9UcmFjZUNhcnJpZXIoXG4gICAgaXNVc2FibGVUcmFjZUNhcnJpZXIoaW5jb21pbmdDYXJyaWVyKSA/IGluY29taW5nQ2FycmllciA6IHVuZGVmaW5lZFxuICApO1xuICByZXR1cm4gb3JpZ2luTGluayA/IFtvcmlnaW5MaW5rXSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBTZXJpYWxpemVzIHRoZSBjdXJyZW50IHRyYWNlIGNvbnRleHQgaW50byBhIGZvcm1hdCB0aGF0IGNhbiBiZSBwYXNzZWQgdGhyb3VnaCBxdWV1ZXNcbiAqIEByZXR1cm5zIEEgcmVjb3JkIG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIHRoZSB0cmFjZSBjb250ZXh0XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzZXJpYWxpemVUcmFjZUNhcnJpZXIoKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gIGNvbnN0IG90ZWwgPSBhd2FpdCBPdGVsQXBpLnZhbHVlO1xuICBpZiAoIW90ZWwpIHJldHVybiB7fTtcbiAgY29uc3QgY2FycmllcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAvLyBJbmplY3QgdGhlIGN1cnJlbnQgY29udGV4dCBpbnRvIHRoZSBjYXJyaWVyXG4gIG90ZWwucHJvcGFnYXRpb24uaW5qZWN0KG90ZWwuY29udGV4dC5hY3RpdmUoKSwgY2Fycmllcik7XG4gIHJldHVybiBjYXJyaWVyO1xufVxuXG4vKipcbiAqIERlc2VyaWFsaXplcyB0cmFjZSBjb250ZXh0IGFuZCByZXR1cm5zIGEgY29udGV4dCB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbnRpbnVlIHRoZSB0cmFjZVxuICogQHBhcmFtIHRyYWNlQ2FycmllciBUaGUgc2VyaWFsaXplZCB0cmFjZSBjb250ZXh0XG4gKiBAcmV0dXJucyBPcGVuVGVsZW1ldHJ5IGNvbnRleHQgd2l0aCB0aGUgcmVzdG9yZWQgdHJhY2VcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlc2VyaWFsaXplVHJhY2VDYXJyaWVyKFxuICB0cmFjZUNhcnJpZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbikge1xuICBjb25zdCBvdGVsID0gYXdhaXQgT3RlbEFwaS52YWx1ZTtcbiAgaWYgKCFvdGVsKSByZXR1cm47XG4gIC8vIEV4dHJhY3QgdGhlIGNvbnRleHQgZnJvbSB0aGUgY2FycmllclxuICByZXR1cm4gb3RlbC5wcm9wYWdhdGlvbi5leHRyYWN0KG90ZWwuY29udGV4dC5hY3RpdmUoKSwgdHJhY2VDYXJyaWVyKTtcbn1cblxuLyoqXG4gKiBSdW5zIGEgZnVuY3Rpb24gd2l0aGluIHRoZSBjb250ZXh0IG9mIGEgZGVzZXJpYWxpemVkIHRyYWNlXG4gKiBAcGFyYW0gdHJhY2VDYXJyaWVyIFRoZSBzZXJpYWxpemVkIHRyYWNlIGNhcnJpZXIgKG9wdGlvbmFsKVxuICogQHBhcmFtIGZuIFRoZSBmdW5jdGlvbiB0byBydW4gd2l0aGluIHRoZSB0cmFjZSBjb250ZXh0XG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2l0aFRyYWNlQ29udGV4dDxUPihcbiAgdHJhY2VDYXJyaWVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkLFxuICBmbjogKCkgPT4gUHJvbWlzZTxUPlxuKTogUHJvbWlzZTxUPiB7XG4gIGlmICghdHJhY2VDYXJyaWVyKSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH1cblxuICBjb25zdCBvdGVsID0gYXdhaXQgT3RlbEFwaS52YWx1ZTtcbiAgaWYgKCFvdGVsKSByZXR1cm4gZm4oKTtcblxuICBjb25zdCBleHRyYWN0ZWRDb250ZXh0ID0gYXdhaXQgZGVzZXJpYWxpemVUcmFjZUNhcnJpZXIodHJhY2VDYXJyaWVyKTtcbiAgaWYgKCFleHRyYWN0ZWRDb250ZXh0KSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH1cblxuICByZXR1cm4gb3RlbC5jb250ZXh0LndpdGgoZXh0cmFjdGVkQ29udGV4dCwgYXN5bmMgKCkgPT4gYXdhaXQgZm4oKSk7XG59XG5cbmNvbnN0IE90ZWxBcGkgPSBvbmNlKGFzeW5jICgpID0+IHtcbiAgLy8gYEBvcGVudGVsZW1ldHJ5L2FwaWAgaXMgYW4gb3B0aW9uYWwgcGVlciBkZXBlbmRlbmN5LiBUaGUgc3RhdGljIHNwZWNpZmllclxuICAvLyBpcyBpbnRlbnRpb25hbDogZXNidWlsZC1idW5kbGVkIHRhcmdldHMgKHRoZSBDTEknc1xuICAvLyBgdmVyY2VsLWJ1aWxkLW91dHB1dC1hcGlgIGJ1aWxkLCBOaXRybywgQXN0cm8pIHNoaXAgYSBzZWxmLWNvbnRhaW5lZFxuICAvLyBidW5kbGUgd2l0aCBubyBub2RlX21vZHVsZXMsIHNvIHRoZSBwYWNrYWdlIG11c3QgYmUgKmlubGluZWQqIGF0IGJ1aWxkXG4gIC8vIHRpbWUgZm9yIHNwYW5zIHRvIHdvcmsgYXQgcnVudGltZTsgYSBydW50aW1lLWJ1aWx0IHNwZWNpZmllciBpcyBvcGFxdWUgdG9cbiAgLy8gZXNidWlsZCBhbmQgd291bGQgc2lsZW50bHkgZGlzYWJsZSB0cmFjaW5nIHRoZXJlLiBCdW5kbGVycyB0aGF0IHJlamVjdCBhblxuICAvLyB1bnJlc29sdmFibGUgc3RhdGljIGBpbXBvcnQoKWAgd2hlbiB0aGUgcGVlciBpc24ndCBpbnN0YWxsZWQgKFJvbGx1cC9WaXRlLFxuICAvLyBlLmcuIFN2ZWx0ZUtpdCkgaW5zdGVhZCBleHRlcm5hbGl6ZSBgQG9wZW50ZWxlbWV0cnkvYXBpYCBpbiB0aGUgd29ya2Zsb3dcbiAgLy8gZnJhbWV3b3JrIGludGVncmF0aW9uLCB3aGljaCBrZWVwcyB0aGUgYnVpbGQgZ3JlZW4gYW5kIHN0aWxsIGxvYWRzIHJlYWxcbiAgLy8gT1RlbCB3aGVuIHRoZSBwZWVyIGlzIHByZXNlbnQuIFJ1bnRpbWUgc2VtYW50aWNzOiBwcmVzZW50IOKGkiBsb2FkZWQsIGFic2VudFxuICAvLyDihpIgY2F1Z2h0IGFuZCB0cmFjaW5nIGRpc2FibGVkLlxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBpbXBvcnQoJ0BvcGVudGVsZW1ldHJ5L2FwaScpO1xuICB9IGNhdGNoIHtcbiAgICBydW50aW1lTG9nZ2VyLmluZm8oJ09wZW5UZWxlbWV0cnkgbm90IGF2YWlsYWJsZSwgdHJhY2luZyB3aWxsIGJlIGRpc2FibGVkJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn0pO1xuXG5jb25zdCBUcmFjZXIgPSBvbmNlKGFzeW5jICgpID0+IHtcbiAgY29uc3QgYXBpID0gYXdhaXQgT3RlbEFwaS52YWx1ZTtcbiAgaWYgKCFhcGkpIHJldHVybiBudWxsO1xuICBjb25zdCB0cmFjZXIgPSBhcGkudHJhY2UuZ2V0VHJhY2VyKCd3b3JrZmxvdycpO1xuICBsb2dPdGVsRGlhZ25vc3RpY09uY2UoYXBpLCB0cmFjZXIpO1xuICByZXR1cm4gdHJhY2VyO1xufSk7XG5cbmNvbnN0IFN0ZXBFeGVjdXRpb25EdXJhdGlvbkhpc3RvZ3JhbSA9IG9uY2UoYXN5bmMgKCkgPT4ge1xuICBjb25zdCBvdGVsID0gYXdhaXQgT3RlbEFwaS52YWx1ZTtcbiAgaWYgKCFvdGVsKSByZXR1cm4gbnVsbDtcbiAgLy8gc2VydmljZS5uYW1lIGlzIGEgcmVzb3VyY2UgYXR0cmlidXRlLCBhcHBsaWVkIGJ5IHRoZSBjb25maWd1cmVkIHByb3ZpZGVyLlxuICByZXR1cm4gb3RlbC5tZXRyaWNzXG4gICAgLmdldE1ldGVyKCd3b3JrZmxvdycpXG4gICAgLmNyZWF0ZUhpc3RvZ3JhbSgnd29ya2Zsb3cuc3RlcC5leGVjdXRlLmR1cmF0aW9uJywge1xuICAgICAgZGVzY3JpcHRpb246ICdEdXJhdGlvbiBvZiB1c2VyIHN0ZXAgZXhlY3V0aW9uJyxcbiAgICAgIHVuaXQ6ICdtcycsXG4gICAgfSk7XG59KTtcblxuLyoqXG4gKiBPbmUtc2hvdCBydW50aW1lIGRpYWdub3N0aWMgKERFQlVHPXdvcmtmbG93Oiogb25seSksIHNhbWUgc2hhcGUgYXMgdGhlIG9uZVxuICogd29ybGQtdmVyY2VsIGVtaXRzIHRhZ2dlZCBgd29ybGQtdmVyY2VsYDogcHJpbnRzIGhvdyB0aGlzIG1vZHVsZSBpbnN0YW5jZVxuICogb2YgYEBvcGVudGVsZW1ldHJ5L2FwaWAgc2VlcyB0aGUgZ2xvYmFsIHJlZ2lzdHJhdGlvbiwgc28gYSBkZXBsb3ltZW50J3NcbiAqIGxvZ3Mgc2hvdyB0aGUgdHdvIHBhY2thZ2VzJyB2aWV3cyBzaWRlIGJ5IHNpZGUuXG4gKi9cbi8vIHBlci1jb3B5LW9rOiB0aGlzIGRpYWdub3N0aWMgcmVwb3J0cyBob3cgVEhJUyBtb2R1bGUgaW5zdGFuY2Ugc2VlcyB0aGUgZ2xvYmFsXG4vLyBPVGVsIHJlZ2lzdHJhdGlvbiwgd2hpY2ggaXMgdGhlIHdob2xlIHBvaW50IG9mIHRoZSBsb2cuIFdpdGggc2V2ZXJhbCBjb3BpZXNcbi8vIGluIGEgcHJvY2VzcywgZWFjaCBvbmUncyB2aWV3IGlzIHdoYXQgaXMgd29ydGggc2VlaW5nLlxubGV0IG90ZWxEaWFnTG9nZ2VkID0gZmFsc2U7XG5cbmZ1bmN0aW9uIGRlc2NyaWJlVGhyb3duVmFsdWUodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgIHZhbHVlICE9PSBudWxsICYmXG4gICAgICAnbWVzc2FnZScgaW4gdmFsdWUgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZS5tZXNzYWdlID09PSAnc3RyaW5nJ1xuICAgICkge1xuICAgICAgcmV0dXJuIHZhbHVlLm1lc3NhZ2U7XG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gJ1Vua25vd24gZXJyb3InO1xuICB9XG59XG5cbmZ1bmN0aW9uIGxvZ090ZWxEaWFnbm9zdGljT25jZShvdGVsOiB0eXBlb2YgYXBpLCB0cmFjZXI6IGFwaS5UcmFjZXIpOiB2b2lkIHtcbiAgY29uc3QgZGVidWdFbmFibGVkID1cbiAgICB0eXBlb2YgcHJvY2VzcyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2YgcHJvY2Vzcy5lbnYuREVCVUcgPT09ICdzdHJpbmcnICYmXG4gICAgKHByb2Nlc3MuZW52LkRFQlVHLmluY2x1ZGVzKCd3b3JrZmxvdzonKSB8fCBwcm9jZXNzLmVudi5ERUJVRyA9PT0gJyonKTtcbiAgaWYgKG90ZWxEaWFnTG9nZ2VkIHx8ICFkZWJ1Z0VuYWJsZWQpIHJldHVybjtcbiAgb3RlbERpYWdMb2dnZWQgPSB0cnVlO1xuICB0cnkge1xuICAgIGNvbnN0IGcgPSAoZ2xvYmFsVGhpcyBhcyBSZWNvcmQ8c3ltYm9sLCB1bmtub3duPilbXG4gICAgICBTeW1ib2wuZm9yKCdvcGVudGVsZW1ldHJ5LmpzLmFwaS4xJylcbiAgICBdIGFzIHsgdmVyc2lvbj86IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHByb3ZpZGVyID0gb3RlbC50cmFjZS5nZXRUcmFjZXJQcm92aWRlcigpO1xuICAgIGNvbnN0IGRlbGVnYXRlID1cbiAgICAgIChwcm92aWRlciBhcyB7IGdldERlbGVnYXRlPzogKCkgPT4gdW5rbm93biB9KS5nZXREZWxlZ2F0ZT8uKCkgPz8gcHJvdmlkZXI7XG4gICAgY29uc3QgcHJvYmUgPSB0cmFjZXIuc3RhcnRTcGFuKCd3b3JrZmxvdy5vdGVsLnByb2JlLmNvcmUnKTtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnW3dvcmtmbG93Om90ZWwtZGlhZ10gY29yZScsXG4gICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGdsb2JhbFJlZ2lzdHJhdGlvblZlcnNpb246IGc/LnZlcnNpb24gPz8gbnVsbCxcbiAgICAgICAgcHJvdmlkZXJDdG9yOiBwcm92aWRlcj8uY29uc3RydWN0b3I/Lm5hbWUgPz8gbnVsbCxcbiAgICAgICAgZGVsZWdhdGVDdG9yOiAoZGVsZWdhdGUgYXMgb2JqZWN0IHwgbnVsbCk/LmNvbnN0cnVjdG9yPy5uYW1lID8/IG51bGwsXG4gICAgICAgIHRyYWNlckN0b3I6IHRyYWNlcj8uY29uc3RydWN0b3I/Lm5hbWUgPz8gbnVsbCxcbiAgICAgICAgcHJvYmVDdG9yOiBwcm9iZT8uY29uc3RydWN0b3I/Lm5hbWUgPz8gbnVsbCxcbiAgICAgICAgcHJvYmVSZWNvcmRpbmc6IHByb2JlLmlzUmVjb3JkaW5nKCksXG4gICAgICB9KVxuICAgICk7XG4gICAgcHJvYmUuZW5kKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ1t3b3JrZmxvdzpvdGVsLWRpYWddIGNvcmUgZmFpbGVkOicsXG4gICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IGVycm9yXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdHJhY2U8VD4oXG4gIHNwYW5OYW1lOiBzdHJpbmcsXG4gIC4uLmFyZ3M6XG4gICAgfCBbZm46IChzcGFuPzogU3BhbikgPT4gUHJvbWlzZTxUPl1cbiAgICB8IFtvcHRzOiBTcGFuT3B0aW9ucywgZm46IChzcGFuPzogU3BhbikgPT4gUHJvbWlzZTxUPl1cbik6IFByb21pc2U8VD4ge1xuICBjb25zdCBbdHJhY2VyLCBvdGVsXSA9IGF3YWl0IFByb21pc2UuYWxsKFtUcmFjZXIudmFsdWUsIE90ZWxBcGkudmFsdWVdKTtcbiAgY29uc3QgeyBmbiwgb3B0cyB9ID1cbiAgICB0eXBlb2YgYXJnc1swXSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyB7IGZuOiBhcmdzWzBdLCBvcHRzOiB7fSB9XG4gICAgICA6IHsgZm46IGFyZ3NbMV0sIG9wdHM6IGFyZ3NbMF0gfTtcbiAgaWYgKCFmbikgdGhyb3cgbmV3IEVycm9yKCdGdW5jdGlvbiB0byB0cmFjZSBtdXN0IGJlIHByb3ZpZGVkJyk7XG5cbiAgaWYgKCF0cmFjZXIgfHwgIW90ZWwpIHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfVxuXG4gIHJldHVybiB0cmFjZXIuc3RhcnRBY3RpdmVTcGFuKHNwYW5OYW1lLCBvcHRzLCBhc3luYyAoc3BhbikgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmbihzcGFuKTtcbiAgICAgIHNwYW4uc2V0U3RhdHVzKHsgY29kZTogb3RlbC5TcGFuU3RhdHVzQ29kZS5PSyB9KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKFdvcmtmbG93U3VzcGVuc2lvbi5pcyhlKSkge1xuICAgICAgICBzcGFuLnNldFN0YXR1cyh7IGNvZGU6IG90ZWwuU3BhblN0YXR1c0NvZGUuT0sgfSk7XG4gICAgICAgIGFwcGx5V29ya2Zsb3dTdXNwZW5zaW9uVG9TcGFuKGUsIHNwYW4pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Bhbi5zZXRTdGF0dXMoe1xuICAgICAgICAgIGNvZGU6IG90ZWwuU3BhblN0YXR1c0NvZGUuRVJST1IsXG4gICAgICAgICAgbWVzc2FnZTogZGVzY3JpYmVUaHJvd25WYWx1ZShlKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzcGFuLmVuZCgpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKiBTdGFydHMgYSBjaGlsZCBzcGFuIHdpdGhvdXQgaW5zdGFsbGluZyBpdCBhcyB0aGUgYWN0aXZlIGNvbnRleHQuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RhcnRUcmFjZVNwYW4oc3Bhbk5hbWU6IHN0cmluZykge1xuICBjb25zdCBbdHJhY2VyLCBvdGVsXSA9IGF3YWl0IFByb21pc2UuYWxsKFtUcmFjZXIudmFsdWUsIE90ZWxBcGkudmFsdWVdKTtcbiAgaWYgKCF0cmFjZXIgfHwgIW90ZWwpIHJldHVybiB7IGVuZCgpIHt9LCBmYWlsKCkge30gfTtcblxuICBjb25zdCBzcGFuID0gdHJhY2VyLnN0YXJ0U3BhbihzcGFuTmFtZSk7XG4gIGxldCBlbmRlZCA9IGZhbHNlO1xuICBjb25zdCBmaW5pc2ggPSAoc3RhdHVzOiBhcGkuU3BhblN0YXR1cykgPT4ge1xuICAgIGlmIChlbmRlZCkgcmV0dXJuO1xuICAgIGVuZGVkID0gdHJ1ZTtcbiAgICBzcGFuLnNldFN0YXR1cyhzdGF0dXMpO1xuICAgIHNwYW4uZW5kKCk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBlbmQ6ICgpID0+IGZpbmlzaCh7IGNvZGU6IG90ZWwuU3BhblN0YXR1c0NvZGUuT0sgfSksXG4gICAgZmFpbDogKGVycm9yOiB1bmtub3duKSA9PlxuICAgICAgZmluaXNoKHtcbiAgICAgICAgY29kZTogb3RlbC5TcGFuU3RhdHVzQ29kZS5FUlJPUixcbiAgICAgICAgbWVzc2FnZTogZGVzY3JpYmVUaHJvd25WYWx1ZShlcnJvciksXG4gICAgICB9KSxcbiAgfTtcbn1cblxuLyoqIEJpbmQgd29yayB0byB0aGUgY3VycmVudGx5IGFjdGl2ZSBzcGFuIGV2ZW4gd2hlbiBpdCBzdGFydHMgZnJvbSBhIGNoaWxkLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJpbmRBY3RpdmVUcmFjZUNvbnRleHQ8QXJncyBleHRlbmRzIHVua25vd25bXSwgUmVzdWx0PihcbiAgZm46ICguLi5hcmdzOiBBcmdzKSA9PiBSZXN1bHRcbik6IFByb21pc2U8KC4uLmFyZ3M6IEFyZ3MpID0+IFJlc3VsdD4ge1xuICBjb25zdCBvdGVsID0gYXdhaXQgT3RlbEFwaS52YWx1ZTtcbiAgcmV0dXJuIG90ZWwgPyBvdGVsLmNvbnRleHQuYmluZChvdGVsLmNvbnRleHQuYWN0aXZlKCksIGZuKSA6IGZuO1xufVxuXG4vKiogS2VlcHMgYSBwYXJrZWQgd29ya2Zsb3cncyBhbWJpZW50IHRyYWNlIGNvbnRleHQgYWxpZ25lZCB3aXRoIGVhY2ggcmVzdW1lLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVJlZnJlc2hhYmxlVHJhY2VDb250ZXh0KCkge1xuICBjb25zdCBvdGVsID0gYXdhaXQgT3RlbEFwaS52YWx1ZTtcbiAgaWYgKCFvdGVsKSB7XG4gICAgcmV0dXJuIHsgcmVmcmVzaCgpIHt9LCBydW46IDxUPihmbjogKCkgPT4gVCk6IFQgPT4gZm4oKSB9O1xuICB9XG5cbiAgbGV0IGN1cnJlbnQgPSBvdGVsLmNvbnRleHQuYWN0aXZlKCk7XG4gIGNvbnN0IGNvbnRleHQ6IGFwaS5Db250ZXh0ID0ge1xuICAgIGdldFZhbHVlOiAoa2V5KSA9PiBjdXJyZW50LmdldFZhbHVlKGtleSksXG4gICAgc2V0VmFsdWU6IChrZXksIHZhbHVlKSA9PiBjdXJyZW50LnNldFZhbHVlKGtleSwgdmFsdWUpLFxuICAgIGRlbGV0ZVZhbHVlOiAoa2V5KSA9PiBjdXJyZW50LmRlbGV0ZVZhbHVlKGtleSksXG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICByZWZyZXNoOiAoKSA9PiB7XG4gICAgICBjdXJyZW50ID0gb3RlbC5jb250ZXh0LmFjdGl2ZSgpO1xuICAgIH0sXG4gICAgcnVuOiA8VD4oZm46ICgpID0+IFQpOiBUID0+IG90ZWwuY29udGV4dC53aXRoKGNvbnRleHQsIGZuKSxcbiAgfTtcbn1cblxuLyoqXG4gKiBFbWl0IGEgc3BhbiB3aG9zZSBzdGFydCBpcyBiYWNrLWRhdGVkIHRvIGBzdGFydEVwb2NoTXNgIGFuZCB3aG9zZSBlbmQgaXMgbm93LFxuICogc28gaXRzIGR1cmF0aW9uIHJlZmxlY3RzIGFuIGludGVydmFsIG9ubHkgbWVhc3VyYWJsZSBhdCBpdHMgZW5kIChlLmcuXG4gKiB0aW1lLXRvLWZpcnN0LWNodW5rLCBrbm93biB3aGVuIHRoZSBmaXJzdCBjaHVuayBhcnJpdmVzKS4gVW5saWtlIGB0cmFjZSgpYCxcbiAqIHRoaXMgcmVjb3JkcyBhbiBhbHJlYWR5LWVsYXBzZWQgc3BhbiBpbiBvbmUgc2hvdCByYXRoZXIgdGhhbiB3cmFwcGluZyBhXG4gKiBjYWxsYmFjay4gTm8tb3Agd2hlbiBPcGVuVGVsZW1ldHJ5IGlzIG5vdCBhdmFpbGFibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWNvcmRFbGFwc2VkU3BhbihcbiAgc3Bhbk5hbWU6IHN0cmluZyxcbiAgc3RhcnRFcG9jaE1zOiBudW1iZXIsXG4gIG9wdHM/OiBTcGFuT3B0aW9uc1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHRyYWNlciA9IGF3YWl0IFRyYWNlci52YWx1ZTtcbiAgaWYgKCF0cmFjZXIpIHJldHVybjtcbiAgdHJhY2VyLnN0YXJ0U3BhbihzcGFuTmFtZSwgeyAuLi5vcHRzLCBzdGFydFRpbWU6IHN0YXJ0RXBvY2hNcyB9KS5lbmQoKTtcbn1cblxuLyoqXG4gKiBSZWNvcmRzIHRoZSBzYW1lIHVzZXItY29kZSBpbnRlcnZhbCBhcyB0aGUgaW5uZXIgYHN0ZXAuZXhlY3V0ZWAgc3Bhbi4gVGhlXG4gKiBjb25maWd1cmVkIE9wZW5UZWxlbWV0cnkgbWV0ZXIgcHJvdmlkZXIgYXR0YWNoZXMgcmVzb3VyY2UgZGltZW5zaW9ucyBzdWNoIGFzXG4gKiBzZXJ2aWNlLm5hbWUsIHNvIHRoaXMgYXZvaWRzIGFjY2VwdGluZyBhIGNhbGxlci1jb250cm9sbGVkIHNlcnZpY2UgdGFnLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVjb3JkU3RlcEV4ZWN1dGlvbkR1cmF0aW9uKFxuICBkdXJhdGlvbk1zOiBudW1iZXIsXG4gIHN0YXR1czogJ29rJyB8ICdlcnJvcidcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBoaXN0b2dyYW0gPSBhd2FpdCBTdGVwRXhlY3V0aW9uRHVyYXRpb25IaXN0b2dyYW0udmFsdWU7XG4gIGhpc3RvZ3JhbT8ucmVjb3JkKGR1cmF0aW9uTXMsIHsgJ3dvcmtmbG93LnN0ZXAuc3RhdHVzJzogc3RhdHVzIH0pO1xufVxuXG4vKipcbiAqIEFwcGxpZXMgdGhlIHdvcmtmbG93IHN1c3BlbnNpb24gYWxnZWJyYWljIGVmZmVjdCB0byBhbiBhY3RpdmUgc3Bhbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5V29ya2Zsb3dTdXNwZW5zaW9uVG9TcGFuKFxuICBlcnJvcjogV29ya2Zsb3dTdXNwZW5zaW9uLFxuICBzcGFuOiBhcGkuU3BhblxuKTogdm9pZCB7XG4gIHNwYW4uc2V0QXR0cmlidXRlcyh7XG4gICAgLi4uQXR0ci5Xb3JrZmxvd1N1c3BlbnNpb25TdGF0ZSgnc3VzcGVuZGVkJyksXG4gICAgLi4uQXR0ci5Xb3JrZmxvd1N1c3BlbnNpb25TdGVwQ291bnQoZXJyb3Iuc3RlcENvdW50KSxcbiAgICAuLi5BdHRyLldvcmtmbG93U3VzcGVuc2lvbkhvb2tDb3VudChlcnJvci5ob29rQ291bnQpLFxuICAgIC4uLkF0dHIuV29ya2Zsb3dTdXNwZW5zaW9uV2FpdENvdW50KGVycm9yLndhaXRDb3VudCksXG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U3BhbkNvbnRleHRGb3JUcmFjZUNhcnJpZXIoXG4gIGNhcnJpZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz5cbikge1xuICBjb25zdCBbZGVzZXJpYWxpemVkLCBvdGVsXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBkZXNlcmlhbGl6ZVRyYWNlQ2FycmllcihjYXJyaWVyKSxcbiAgICBPdGVsQXBpLnZhbHVlLFxuICBdKTtcbiAgaWYgKCFkZXNlcmlhbGl6ZWQgfHwgIW90ZWwpIHJldHVybjtcbiAgcmV0dXJuIG90ZWwudHJhY2UuZ2V0U3BhbkNvbnRleHQoZGVzZXJpYWxpemVkKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEFjdGl2ZVNwYW4oKSB7XG4gIHJldHVybiBhd2FpdCB3aXRoT3RlbCgob3RlbCkgPT4gb3RlbC50cmFjZS5nZXRBY3RpdmVTcGFuKCkpO1xufVxuXG4vKipcbiAqIFdyYXBzIGFsbCBtZXRob2RzIG9mIGFuIG9iamVjdCB3aXRoIHRyYWNpbmcgc3BhbnMuXG4gKiBAcGFyYW0gcHJlZml4IC0gUHJlZml4IGZvciBzcGFuIG5hbWVzIChlLmcuLCBcIldPUkxELnJ1bnNcIilcbiAqIEBwYXJhbSBvIC0gT2JqZWN0IHdpdGggbWV0aG9kcyB0byBpbnN0cnVtZW50XG4gKiBAcmV0dXJucyBJbnN0cnVtZW50ZWQgb2JqZWN0IHdpdGggc2FtZSBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluc3RydW1lbnRPYmplY3Q8VCBleHRlbmRzIG9iamVjdD4ocHJlZml4OiBzdHJpbmcsIG86IFQpOiBUIHtcbiAgY29uc3QgaGFuZGxlcnMgPSB7fSBhcyBUO1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvKSBhcyAoa2V5b2YgVClbXSkge1xuICAgIGlmICh0eXBlb2Ygb1trZXldICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBoYW5kbGVyc1trZXldID0gb1trZXldO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmID0gb1trZXldO1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgaGFuZGxlcnNba2V5XSA9IGFzeW5jICguLi5hcmdzOiBhbnlbXSkgPT5cbiAgICAgICAgdHJhY2UoYCR7cHJlZml4fS4ke1N0cmluZyhrZXkpfWAsIHt9LCAoKSA9PiBmKC4uLmFyZ3MpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGhhbmRsZXJzO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U3BhbktpbmQoZmllbGQ6IGtleW9mIHR5cGVvZiBTcGFuS2luZCkge1xuICByZXR1cm4gd2l0aE90ZWwoKHgpID0+IHguU3BhbktpbmRbZmllbGRdKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhPdGVsPFQ+KFxuICBmbjogKG90ZWw6IHR5cGVvZiBhcGkpID0+IFRcbik6IFByb21pc2U8QXdhaXRlZDxUPiB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBvdGVsID0gYXdhaXQgT3RlbEFwaS52YWx1ZTtcbiAgaWYgKCFvdGVsKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gYXdhaXQgZm4ob3RlbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsaW5rVG9DdXJyZW50Q29udGV4dCgpOiBQcm9taXNlPFthcGkuTGlua10gfCB1bmRlZmluZWQ+IHtcbiAgcmV0dXJuIHdpdGhPdGVsKChvdGVsKTogW2FwaS5MaW5rXSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgY29uc3QgY29udGV4dCA9IG90ZWwudHJhY2UuZ2V0QWN0aXZlU3BhbigpPy5zcGFuQ29udGV4dCgpO1xuICAgIGlmICghY29udGV4dCkgcmV0dXJuO1xuICAgIHJldHVybiBbeyBjb250ZXh0IH1dO1xuICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBzcGFuIGxpbmsgcG9pbnRpbmcgYXQgdGhlIHNwYW4gY29udGV4dCBlbWJlZGRlZCBpbiBhIHNlcmlhbGl6ZWRcbiAqIHRyYWNlIGNhcnJpZXIgKGUuZy4gdGhlIHJ1bi1vcmlnaW4gY29udGV4dCBmbG93aW5nIHRocm91Z2ggcXVldWVcbiAqIG1lc3NhZ2VzKS4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIE9URUwgaXMgdW5hdmFpbGFibGUsIHRoZSBjYXJyaWVyIGlzXG4gKiBhYnNlbnQsIG9yIGl0IGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBzcGFuIGNvbnRleHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsaW5rVG9UcmFjZUNhcnJpZXIoXG4gIGNhcnJpZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWRcbik6IFByb21pc2U8YXBpLkxpbmsgfCB1bmRlZmluZWQ+IHtcbiAgaWYgKCFjYXJyaWVyKSByZXR1cm47XG4gIGNvbnN0IFtjb250ZXh0LCBvdGVsXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBnZXRTcGFuQ29udGV4dEZvclRyYWNlQ2FycmllcihjYXJyaWVyKSxcbiAgICBPdGVsQXBpLnZhbHVlLFxuICBdKTtcbiAgaWYgKCFjb250ZXh0IHx8ICFvdGVsKSByZXR1cm47XG4gIGlmICghb3RlbC50cmFjZS5pc1NwYW5Db250ZXh0VmFsaWQoY29udGV4dCkpIHJldHVybjtcbiAgcmV0dXJuIHsgY29udGV4dCB9O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJhZ2dhZ2UgUHJvcGFnYXRpb24gVXRpbGl0aWVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBXb3JrZmxvdyBjb250ZXh0IHRvIHByb3BhZ2F0ZSB2aWEgYmFnZ2FnZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtmbG93QmFnZ2FnZUNvbnRleHQge1xuICB3b3JrZmxvd1J1bklkOiBzdHJpbmc7XG4gIHdvcmtmbG93TmFtZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFNldHMgd29ya2Zsb3cgY29udGV4dCBhcyBPVEVMIGJhZ2dhZ2UgZm9yIGF1dG9tYXRpYyBwcm9wYWdhdGlvbi5cbiAqIEJhZ2dhZ2UgaXMgcHJvcGFnYXRlZCBhY3Jvc3Mgc2VydmljZSBib3VuZGFyaWVzIHZpYSBIVFRQIGhlYWRlcnMuXG4gKiBAcGFyYW0gY29udGV4dCAtIFdvcmtmbG93IGNvbnRleHQgdG8gc2V0IGFzIGJhZ2dhZ2VcbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdG8gcnVuIHdpdGhpbiB0aGUgYmFnZ2FnZSBjb250ZXh0XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRoV29ya2Zsb3dCYWdnYWdlPFQ+KFxuICBjb250ZXh0OiBXb3JrZmxvd0JhZ2dhZ2VDb250ZXh0LFxuICBmbjogKCkgPT4gUHJvbWlzZTxUPlxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IG90ZWwgPSBhd2FpdCBPdGVsQXBpLnZhbHVlO1xuICBpZiAoIW90ZWwpIHJldHVybiBmbigpO1xuXG4gIC8vIENyZWF0ZSBiYWdnYWdlIHdpdGggd29ya2Zsb3cgY29udGV4dFxuICBjb25zdCBiYWdnYWdlID0gb3RlbC5wcm9wYWdhdGlvbi5jcmVhdGVCYWdnYWdlKHtcbiAgICAnd29ya2Zsb3cucnVuX2lkJzogeyB2YWx1ZTogY29udGV4dC53b3JrZmxvd1J1bklkIH0sXG4gICAgJ3dvcmtmbG93Lm5hbWUnOiB7IHZhbHVlOiBjb250ZXh0LndvcmtmbG93TmFtZSB9LFxuICB9KTtcblxuICAvLyBTZXQgYmFnZ2FnZSBpbiBjb250ZXh0IGFuZCBydW4gZnVuY3Rpb25cbiAgY29uc3QgY29udGV4dFdpdGhCYWdnYWdlID0gb3RlbC5wcm9wYWdhdGlvbi5zZXRCYWdnYWdlKFxuICAgIG90ZWwuY29udGV4dC5hY3RpdmUoKSxcbiAgICBiYWdnYWdlXG4gICk7XG5cbiAgcmV0dXJuIG90ZWwuY29udGV4dC53aXRoKGNvbnRleHRXaXRoQmFnZ2FnZSwgKCkgPT4gZm4oKSk7XG59XG5cbi8qKlxuICogUmV0cmlldmVzIHdvcmtmbG93IGNvbnRleHQgZnJvbSBPVEVMIGJhZ2dhZ2UuXG4gKiBAcmV0dXJucyBXb3JrZmxvdyBjb250ZXh0IGlmIHByZXNlbnQgaW4gYmFnZ2FnZSwgdW5kZWZpbmVkIG90aGVyd2lzZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0V29ya2Zsb3dCYWdnYWdlKCk6IFByb21pc2U8XG4gIFdvcmtmbG93QmFnZ2FnZUNvbnRleHQgfCB1bmRlZmluZWRcbj4ge1xuICBjb25zdCBvdGVsID0gYXdhaXQgT3RlbEFwaS52YWx1ZTtcbiAgaWYgKCFvdGVsKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGJhZ2dhZ2UgPSBvdGVsLnByb3BhZ2F0aW9uLmdldEJhZ2dhZ2Uob3RlbC5jb250ZXh0LmFjdGl2ZSgpKTtcbiAgaWYgKCFiYWdnYWdlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHJ1bklkID0gYmFnZ2FnZS5nZXRFbnRyeSgnd29ya2Zsb3cucnVuX2lkJyk/LnZhbHVlO1xuICBjb25zdCBuYW1lID0gYmFnZ2FnZS5nZXRFbnRyeSgnd29ya2Zsb3cubmFtZScpPy52YWx1ZTtcblxuICBpZiAoIXJ1bklkIHx8ICFuYW1lKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7XG4gICAgd29ya2Zsb3dSdW5JZDogcnVuSWQsXG4gICAgd29ya2Zsb3dOYW1lOiBuYW1lLFxuICB9O1xufVxuIl19
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const version = "5.0.0-beta.46";
1
+ export declare const version = "5.0.0-beta.48";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,3 +1,3 @@
1
1
  // Generated by genversion.
2
- export const version = '5.0.0-beta.46';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJCQUEyQjtBQUMzQixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR2VuZXJhdGVkIGJ5IGdlbnZlcnNpb24uXG5leHBvcnQgY29uc3QgdmVyc2lvbiA9ICc1LjAuMC1iZXRhLjQ2J1xuIl19
2
+ export const version = '5.0.0-beta.48';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJCQUEyQjtBQUMzQixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR2VuZXJhdGVkIGJ5IGdlbnZlcnNpb24uXG5leHBvcnQgY29uc3QgdmVyc2lvbiA9ICc1LjAuMC1iZXRhLjQ4J1xuIl19
@@ -1,27 +1,25 @@
1
- import { type Context, Script } from 'node:vm';
1
+ import { Script } from 'node:vm';
2
2
  /**
3
- * Returns a compiled `vm.Script` for the given workflow bundle code and
4
- * filename, compiling and caching it on first use. Subsequent calls with the
5
- * same `(code, filename)` return the cached `Script`.
3
+ * Returns a compiled `vm.Script` for the given source code and filename,
4
+ * compiling and caching it on first use. Subsequent calls with the same
5
+ * `(code, filename)` return the cached `Script`.
6
6
  *
7
7
  * The returned `Script` is not yet bound to any context; the caller runs it
8
8
  * against a specific VM context via `script.runInContext(context)`. This is
9
9
  * equivalent to `vm.runInContext(code, context, { filename })` but skips the
10
10
  * recompile.
11
11
  */
12
- export declare function getCachedWorkflowScript(code: string, filename: string): Script;
13
- /**
14
- * Runs the cached workflow-bundle `Script` against `context`. Compiles and
15
- * caches the `Script` on first use for the given `(code, filename)`.
16
- */
17
- export declare function runCachedWorkflowScript(code: string, filename: string, context: Context): unknown;
12
+ export declare function getCachedWorkflowScript(code: string, filename: string): {
13
+ script: Script;
14
+ cacheHit: boolean;
15
+ };
18
16
  /**
19
17
  * Clears the compiled-script cache. Intended for tests that want to assert
20
18
  * compile-vs-cache behaviour in isolation; not used on the hot path.
21
19
  */
22
20
  export declare function clearWorkflowScriptCache(): void;
23
21
  /**
24
- * Number of distinct bundle (`code`) versions currently retained. Exposed for
22
+ * Number of distinct script source strings currently retained. Exposed for
25
23
  * tests asserting the LRU bound; not used on the hot path.
26
24
  */
27
25
  export declare function workflowScriptCacheSize(): number;
@@ -1 +1 @@
1
- {"version":3,"file":"script-cache.d.ts","sourceRoot":"","sources":["../../src/vm/script-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAgG/C;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,MAAM,CAqBR;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,GACf,OAAO,CAET;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD"}
1
+ {"version":3,"file":"script-cache.d.ts","sourceRoot":"","sources":["../../src/vm/script-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAuFjC;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAsBvC;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD"}
@@ -38,27 +38,21 @@ import { globalSingleton } from '@workflow/utils';
38
38
  * function bodies the duplicated work is the (cheap) top-level parse, not full
39
39
  * per-workflow codegen.
40
40
  *
41
- * We use a nested Map (code -> filename -> Script) so that evicting a bundle
42
- * (e.g. a new deployment/hot-reload producing a different `code`) drops the old
43
- * code string and all of its per-filename scripts together.
41
+ * We use a nested Map (code -> filename -> Script) so that evicting a source
42
+ * string drops all of its per-filename scripts together. Most entries are full
43
+ * workflow bundles; `compileWorkflowBundle` also caches its tiny workflow-name
44
+ * lookup snippets here.
44
45
  *
45
46
  * Bounding
46
47
  * --------
47
48
  * The top-level (`code`-keyed) map is an insertion-ordered LRU capped at
48
- * `MAX_BUNDLES` entries. In production this bound is never reached: a
49
- * deployment is its own process serving exactly one build-time bundle literal
50
- * (skew protection runs old versions as separate processes), so there is a
51
- * single `code` key for the process lifetime. The bound exists for dev/watch
52
- * mode, where the dev route re-reads `workflowCode` from disk and re-invokes
53
- * the entrypoint on every edit: each edit produces a NEW bundle string, which
54
- * without a bound would pin every historical version forever (~0.8MB per edit,
55
- * growing monotonically with edit count). The dev path only ever needs the
56
- * latest bundle, so an LRU that keeps the few most-recent bundles and evicts
57
- * the rest preserves the pre-cache GC behaviour while still serving the
58
- * steady-state single-bundle case for free. The per-`filename` inner map is not
59
- * separately bounded: it is naturally bounded by the (small) number of workflow
60
- * source files in a bundle and is dropped wholesale when its parent `code`
61
- * entry is evicted.
49
+ * `MAX_SCRIPT_SOURCES` entries. A production deployment has one large bundle
50
+ * source plus small lookup sources; the bundle is touched immediately before
51
+ * its lookup on every compilation, so lookup churn cannot evict the expensive
52
+ * entry in normal use. The bound primarily protects dev/watch mode, where every
53
+ * edit produces a new bundle string that would otherwise pin all historical
54
+ * versions. The per-`filename` inner map is naturally bounded by the workflows
55
+ * compiled from that source and is dropped wholesale with its parent entry.
62
56
  */
63
57
  // On `globalThis` (see `globalSingleton`): compiling a bundle is the expensive
64
58
  // part this cache exists to skip, and per-copy caches would pay it once per
@@ -67,20 +61,17 @@ const scripts = globalSingleton('@workflow/core//vmScriptCache', 1, () => ({
67
61
  byCode: new Map(),
68
62
  }));
69
63
  /**
70
- * Max number of distinct bundle (`code`) versions to retain. One is enough for
71
- * production; a handful covers pathological dev hot-reload / repeated-rebuild
72
- * churn within a single long-lived process (e.g. a watch session or a test
73
- * file) without unbounded growth. Kept deliberately small: there is no value
74
- * in retaining stale bundles, only a memory cost.
64
+ * Maximum number of distinct script source strings to retain. Kept deliberately
65
+ * small because stale bundles and one-off lookup snippets have no lasting value.
75
66
  */
76
- const MAX_BUNDLES = 8;
67
+ const MAX_SCRIPT_SOURCES = 8;
77
68
  /**
78
69
  * Looks up the per-filename map for `code`, marking it most-recently-used.
79
70
  * Relies on `Map` preserving insertion order: deleting and re-inserting an
80
71
  * existing key moves it to the end (newest), so the first key is always the
81
72
  * least-recently-used eviction candidate.
82
73
  */
83
- function touchBundle(code) {
74
+ function touchScriptSource(code) {
84
75
  const byFilename = scripts.byCode.get(code);
85
76
  if (byFilename === undefined) {
86
77
  return undefined;
@@ -91,9 +82,9 @@ function touchBundle(code) {
91
82
  return byFilename;
92
83
  }
93
84
  /**
94
- * Returns a compiled `vm.Script` for the given workflow bundle code and
95
- * filename, compiling and caching it on first use. Subsequent calls with the
96
- * same `(code, filename)` return the cached `Script`.
85
+ * Returns a compiled `vm.Script` for the given source code and filename,
86
+ * compiling and caching it on first use. Subsequent calls with the same
87
+ * `(code, filename)` return the cached `Script`.
97
88
  *
98
89
  * The returned `Script` is not yet bound to any context; the caller runs it
99
90
  * against a specific VM context via `script.runInContext(context)`. This is
@@ -101,13 +92,13 @@ function touchBundle(code) {
101
92
  * recompile.
102
93
  */
103
94
  export function getCachedWorkflowScript(code, filename) {
104
- let byFilename = touchBundle(code);
95
+ let byFilename = touchScriptSource(code);
105
96
  if (byFilename === undefined) {
106
97
  byFilename = new Map();
107
98
  scripts.byCode.set(code, byFilename);
108
- // Evict the least-recently-used bundle(s) when over the cap. New bundles
99
+ // Evict the least-recently-used source(s) when over the cap. New sources
109
100
  // are appended at the end, so the oldest live at the front.
110
- while (scripts.byCode.size > MAX_BUNDLES) {
101
+ while (scripts.byCode.size > MAX_SCRIPT_SOURCES) {
111
102
  const oldest = scripts.byCode.keys().next().value;
112
103
  if (oldest === undefined) {
113
104
  break;
@@ -116,18 +107,12 @@ export function getCachedWorkflowScript(code, filename) {
116
107
  }
117
108
  }
118
109
  let script = byFilename.get(filename);
110
+ const cacheHit = script !== undefined;
119
111
  if (script === undefined) {
120
112
  script = new Script(code, { filename });
121
113
  byFilename.set(filename, script);
122
114
  }
123
- return script;
124
- }
125
- /**
126
- * Runs the cached workflow-bundle `Script` against `context`. Compiles and
127
- * caches the `Script` on first use for the given `(code, filename)`.
128
- */
129
- export function runCachedWorkflowScript(code, filename, context) {
130
- return getCachedWorkflowScript(code, filename).runInContext(context);
115
+ return { script, cacheHit };
131
116
  }
132
117
  /**
133
118
  * Clears the compiled-script cache. Intended for tests that want to assert
@@ -137,10 +122,10 @@ export function clearWorkflowScriptCache() {
137
122
  scripts.byCode.clear();
138
123
  }
139
124
  /**
140
- * Number of distinct bundle (`code`) versions currently retained. Exposed for
125
+ * Number of distinct script source strings currently retained. Exposed for
141
126
  * tests asserting the LRU bound; not used on the hot path.
142
127
  */
143
128
  export function workflowScriptCacheSize() {
144
129
  return scripts.byCode.size;
145
130
  }
146
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NyaXB0LWNhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3ZtL3NjcmlwdC1jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWdCLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFbEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkRHO0FBQ0gsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSwwQ0FBMEM7QUFDMUMsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLCtCQUErQixFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3pFLE1BQU0sRUFBRSxJQUFJLEdBQUcsRUFBK0I7Q0FDL0MsQ0FBQyxDQUFDLENBQUM7QUFFSjs7Ozs7O0dBTUc7QUFDSCxNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUM7QUFFdEI7Ozs7O0dBS0c7QUFDSCxTQUFTLFdBQVcsQ0FBQyxJQUFZO0lBQy9CLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVDLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzdCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxvRUFBb0U7SUFDcEUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLElBQVksRUFDWixRQUFnQjtJQUVoQixJQUFJLFVBQVUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbkMsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDN0IsVUFBVSxHQUFHLElBQUksR0FBRyxFQUFrQixDQUFDO1FBQ3ZDLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNyQyx5RUFBeUU7UUFDekUsNERBQTREO1FBQzVELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsV0FBVyxFQUFFLENBQUM7WUFDekMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbEQsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3pCLE1BQU07WUFDUixDQUFDO1lBQ0QsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFDRCxJQUFJLE1BQU0sR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3RDLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLFVBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxJQUFZLEVBQ1osUUFBZ0IsRUFDaEIsT0FBZ0I7SUFFaEIsT0FBTyx1QkFBdUIsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3ZFLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsd0JBQXdCO0lBQ3RDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDekIsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSx1QkFBdUI7SUFDckMsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdHlwZSBDb250ZXh0LCBTY3JpcHQgfSBmcm9tICdub2RlOnZtJztcbmltcG9ydCB7IGdsb2JhbFNpbmdsZXRvbiB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5cbi8qKlxuICogTW9kdWxlLWxldmVsIGNhY2hlIG9mIGNvbXBpbGVkIHdvcmtmbG93LWJ1bmRsZSBgdm0uU2NyaXB0YCBvYmplY3RzLlxuICpcbiAqIFdoeSB0aGlzIGV4aXN0c1xuICogLS0tLS0tLS0tLS0tLS0tXG4gKiBSZXBsYXlpbmcgYSB3b3JrZmxvdyByZS1ldmFsdWF0ZXMgdGhlIHdvcmtmbG93IGJ1bmRsZSBhZ2FpbnN0IGEgZnJlc2ggVk1cbiAqIGNvbnRleHQgb24gZXZlcnkgaXRlcmF0aW9uIG9mIHRoZSBpbmxpbmUgcmVwbGF5IGxvb3AgKHNlZVxuICogYHJ1bldvcmtmbG93YCBpbiBgLi4vd29ya2Zsb3cudHNgKS4gVGhlIGJ1bmRsZSBpcyBhIHNpbmdsZSBzdHJpbmcgdGhhdFxuICogY29udGFpbnMgZXZlcnkgd29ya2Zsb3cgZnVuY3Rpb24gaW4gdGhlIGFwcCBhbmQgcmVnaXN0ZXJzIHRoZW0gb25cbiAqIGBnbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3NgLiBQcmV2aW91c2x5IGVhY2ggcmVwbGF5IGNhbGxlZFxuICogYHZtLnJ1bkluQ29udGV4dCh3b3JrZmxvd0NvZGUsIGNvbnRleHQsIHsgZmlsZW5hbWUgfSlgLCB3aGljaCBSRS1QQVJTRVMgYW5kXG4gKiBSRS1DT01QSUxFUyB0aGUgZW50aXJlIGJ1bmRsZSBldmVyeSB0aW1lOiBPKE4pIGZ1bGwgcmUtcGFyc2VzIGZvciBhXG4gKiBzZXF1ZW50aWFsIHdvcmtmbG93IG9mIE4gc3RlcHMsIHBsdXMgdGhlIHNhbWUgcGFyc2UgY29zdCByZXBlYXRlZCBhY3Jvc3NcbiAqIGV2ZXJ5IGludm9jYXRpb24gaW4gdGhlIHByb2Nlc3MuXG4gKlxuICogQ29tcGlsYXRpb24gaXMgYSBwdXJlIGZ1bmN0aW9uIG9mIGAoY29kZSwgZmlsZW5hbWUpYDogYSBgdm0uU2NyaXB0YCBjYXJyaWVzXG4gKiBubyByZWFsbS9jb250ZXh0IHN0YXRlOyBpdCBpcyBvbmx5IGJvdW5kIHRvIGEgY29udGV4dCBhdCBgcnVuSW5Db250ZXh0YFxuICogdGltZS4gU28gYSBzaW5nbGUgY29tcGlsZWQgYFNjcmlwdGAgY2FuIGJlIHJldXNlZCBhY3Jvc3MgcmVwbGF5cyBBTkQgYWNyb3NzXG4gKiB3b3JrZmxvdyBpbnZvY2F0aW9ucyBpbiB0aGUgc2FtZSBwcm9jZXNzIHdpdGhvdXQgYWZmZWN0aW5nIGRldGVybWluaXNtOiB0aGVcbiAqIHByb2R1Y2VkIHdvcmtmbG93IGZ1bmN0aW9uIGlzIGlkZW50aWNhbCB0byB0aGUgcHJldmlvdXMgcmUtcGFyc2UtZXZlcnktdGltZVxuICogYmVoYXZpb3VyLCB3aXRoIGlkZW50aWNhbCBgZmlsZW5hbWVgIHNvdXJjZSBhdHRyaWJ1dGlvbiAoc2VlIHRoZSBwcmVjaXNlXG4gKiBjbGFpbSwgYW5kIGl0cyBvbmUgY2F2ZWF0LCBpbiBgcnVuV29ya2Zsb3dgKS5cbiAqXG4gKiBLZXlpbmdcbiAqIC0tLS0tLVxuICogS2V5ZWQgYnkgYGNvZGVgIHRoZW4gYGZpbGVuYW1lYC4gVGhlIGBmaWxlbmFtZWAgaXMgcGFydCBvZiB0aGUga2V5IG9uXG4gKiBwdXJwb3NlLCBOT1QgYXMgYSBkZWR1cGUga2V5OiBpdCBpcyBiYWtlZCBpbnRvIHRoZSBjb21waWxlZCBzY3JpcHQncyBzb3VyY2VcbiAqIGF0dHJpYnV0aW9uIGFuZCBzdXJmYWNlcyBpbiBzdGFjayB0cmFjZXMsIHdoZXJlIGByZW1hcEVycm9yU3RhY2tgIGtleXMgb24gaXRcbiAqIHRvIG1hcCBmcmFtZXMgYmFjayB0byB0aGUgdXNlcidzIHNvdXJjZS4gVHdvIHdvcmtmbG93cyBpbiB0aGUgc2FtZSBidW5kbGVcbiAqIHNoYXJlIHRoZSBzYW1lIGBjb2RlYCBidXQgaGF2ZSBkaWZmZXJlbnQgYGZpbGVuYW1lYHMsIHNvIHRoZXkgaW50ZW50aW9uYWxseVxuICogY29tcGlsZSB0byBkaXN0aW5jdCBgU2NyaXB0YHM7IGNvbGxhcHNpbmcgdGhlbSBvbnRvIGEgc2luZ2xlIHNoYXJlZCBgU2NyaXB0YFxuICogd291bGQgbWlzYXR0cmlidXRlIG9uZSB3b3JrZmxvdydzIHN0YWNrIGZyYW1lcyB0byBhbm90aGVyIGZpbGUuIFRoZSBjb3N0IG9mXG4gKiBrZWVwaW5nIHRoZW0gZGlzdGluY3QgaXMgdGhhdCB0aGUgd2hvbGUgYnVuZGxlIGlzIGNvbXBpbGVkIG9uY2UgcGVyIGRpc3RpbmN0XG4gKiBgZmlsZW5hbWVgIChub3Qgb25jZSBwZXIgYnVuZGxlKTsgaW4gcHJhY3RpY2UgdGhhdCBpcyBib3VuZGVkIGJ5IHRoZSBudW1iZXJcbiAqIG9mIHNvdXJjZSBmaWxlcyB0aGF0IGRlZmluZSBhIHdvcmtmbG93LCBhbmQgYmVjYXVzZSBWOCBsYXppbHkgY29tcGlsZXNcbiAqIGZ1bmN0aW9uIGJvZGllcyB0aGUgZHVwbGljYXRlZCB3b3JrIGlzIHRoZSAoY2hlYXApIHRvcC1sZXZlbCBwYXJzZSwgbm90IGZ1bGxcbiAqIHBlci13b3JrZmxvdyBjb2RlZ2VuLlxuICpcbiAqIFdlIHVzZSBhIG5lc3RlZCBNYXAgKGNvZGUgLT4gZmlsZW5hbWUgLT4gU2NyaXB0KSBzbyB0aGF0IGV2aWN0aW5nIGEgYnVuZGxlXG4gKiAoZS5nLiBhIG5ldyBkZXBsb3ltZW50L2hvdC1yZWxvYWQgcHJvZHVjaW5nIGEgZGlmZmVyZW50IGBjb2RlYCkgZHJvcHMgdGhlIG9sZFxuICogY29kZSBzdHJpbmcgYW5kIGFsbCBvZiBpdHMgcGVyLWZpbGVuYW1lIHNjcmlwdHMgdG9nZXRoZXIuXG4gKlxuICogQm91bmRpbmdcbiAqIC0tLS0tLS0tXG4gKiBUaGUgdG9wLWxldmVsIChgY29kZWAta2V5ZWQpIG1hcCBpcyBhbiBpbnNlcnRpb24tb3JkZXJlZCBMUlUgY2FwcGVkIGF0XG4gKiBgTUFYX0JVTkRMRVNgIGVudHJpZXMuIEluIHByb2R1Y3Rpb24gdGhpcyBib3VuZCBpcyBuZXZlciByZWFjaGVkOiBhXG4gKiBkZXBsb3ltZW50IGlzIGl0cyBvd24gcHJvY2VzcyBzZXJ2aW5nIGV4YWN0bHkgb25lIGJ1aWxkLXRpbWUgYnVuZGxlIGxpdGVyYWxcbiAqIChza2V3IHByb3RlY3Rpb24gcnVucyBvbGQgdmVyc2lvbnMgYXMgc2VwYXJhdGUgcHJvY2Vzc2VzKSwgc28gdGhlcmUgaXMgYVxuICogc2luZ2xlIGBjb2RlYCBrZXkgZm9yIHRoZSBwcm9jZXNzIGxpZmV0aW1lLiBUaGUgYm91bmQgZXhpc3RzIGZvciBkZXYvd2F0Y2hcbiAqIG1vZGUsIHdoZXJlIHRoZSBkZXYgcm91dGUgcmUtcmVhZHMgYHdvcmtmbG93Q29kZWAgZnJvbSBkaXNrIGFuZCByZS1pbnZva2VzXG4gKiB0aGUgZW50cnlwb2ludCBvbiBldmVyeSBlZGl0OiBlYWNoIGVkaXQgcHJvZHVjZXMgYSBORVcgYnVuZGxlIHN0cmluZywgd2hpY2hcbiAqIHdpdGhvdXQgYSBib3VuZCB3b3VsZCBwaW4gZXZlcnkgaGlzdG9yaWNhbCB2ZXJzaW9uIGZvcmV2ZXIgKH4wLjhNQiBwZXIgZWRpdCxcbiAqIGdyb3dpbmcgbW9ub3RvbmljYWxseSB3aXRoIGVkaXQgY291bnQpLiBUaGUgZGV2IHBhdGggb25seSBldmVyIG5lZWRzIHRoZVxuICogbGF0ZXN0IGJ1bmRsZSwgc28gYW4gTFJVIHRoYXQga2VlcHMgdGhlIGZldyBtb3N0LXJlY2VudCBidW5kbGVzIGFuZCBldmljdHNcbiAqIHRoZSByZXN0IHByZXNlcnZlcyB0aGUgcHJlLWNhY2hlIEdDIGJlaGF2aW91ciB3aGlsZSBzdGlsbCBzZXJ2aW5nIHRoZVxuICogc3RlYWR5LXN0YXRlIHNpbmdsZS1idW5kbGUgY2FzZSBmb3IgZnJlZS4gVGhlIHBlci1gZmlsZW5hbWVgIGlubmVyIG1hcCBpcyBub3RcbiAqIHNlcGFyYXRlbHkgYm91bmRlZDogaXQgaXMgbmF0dXJhbGx5IGJvdW5kZWQgYnkgdGhlIChzbWFsbCkgbnVtYmVyIG9mIHdvcmtmbG93XG4gKiBzb3VyY2UgZmlsZXMgaW4gYSBidW5kbGUgYW5kIGlzIGRyb3BwZWQgd2hvbGVzYWxlIHdoZW4gaXRzIHBhcmVudCBgY29kZWBcbiAqIGVudHJ5IGlzIGV2aWN0ZWQuXG4gKi9cbi8vIE9uIGBnbG9iYWxUaGlzYCAoc2VlIGBnbG9iYWxTaW5nbGV0b25gKTogY29tcGlsaW5nIGEgYnVuZGxlIGlzIHRoZSBleHBlbnNpdmVcbi8vIHBhcnQgdGhpcyBjYWNoZSBleGlzdHMgdG8gc2tpcCwgYW5kIHBlci1jb3B5IGNhY2hlcyB3b3VsZCBwYXkgaXQgb25jZSBwZXJcbi8vIGJ1bmRsZXIgbGF5ZXIgdGhhdCBjb21waWxlcyBhIHdvcmtmbG93LlxuY29uc3Qgc2NyaXB0cyA9IGdsb2JhbFNpbmdsZXRvbignQHdvcmtmbG93L2NvcmUvL3ZtU2NyaXB0Q2FjaGUnLCAxLCAoKSA9PiAoe1xuICBieUNvZGU6IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBTY3JpcHQ+PigpLFxufSkpO1xuXG4vKipcbiAqIE1heCBudW1iZXIgb2YgZGlzdGluY3QgYnVuZGxlIChgY29kZWApIHZlcnNpb25zIHRvIHJldGFpbi4gT25lIGlzIGVub3VnaCBmb3JcbiAqIHByb2R1Y3Rpb247IGEgaGFuZGZ1bCBjb3ZlcnMgcGF0aG9sb2dpY2FsIGRldiBob3QtcmVsb2FkIC8gcmVwZWF0ZWQtcmVidWlsZFxuICogY2h1cm4gd2l0aGluIGEgc2luZ2xlIGxvbmctbGl2ZWQgcHJvY2VzcyAoZS5nLiBhIHdhdGNoIHNlc3Npb24gb3IgYSB0ZXN0XG4gKiBmaWxlKSB3aXRob3V0IHVuYm91bmRlZCBncm93dGguIEtlcHQgZGVsaWJlcmF0ZWx5IHNtYWxsOiB0aGVyZSBpcyBubyB2YWx1ZVxuICogaW4gcmV0YWluaW5nIHN0YWxlIGJ1bmRsZXMsIG9ubHkgYSBtZW1vcnkgY29zdC5cbiAqL1xuY29uc3QgTUFYX0JVTkRMRVMgPSA4O1xuXG4vKipcbiAqIExvb2tzIHVwIHRoZSBwZXItZmlsZW5hbWUgbWFwIGZvciBgY29kZWAsIG1hcmtpbmcgaXQgbW9zdC1yZWNlbnRseS11c2VkLlxuICogUmVsaWVzIG9uIGBNYXBgIHByZXNlcnZpbmcgaW5zZXJ0aW9uIG9yZGVyOiBkZWxldGluZyBhbmQgcmUtaW5zZXJ0aW5nIGFuXG4gKiBleGlzdGluZyBrZXkgbW92ZXMgaXQgdG8gdGhlIGVuZCAobmV3ZXN0KSwgc28gdGhlIGZpcnN0IGtleSBpcyBhbHdheXMgdGhlXG4gKiBsZWFzdC1yZWNlbnRseS11c2VkIGV2aWN0aW9uIGNhbmRpZGF0ZS5cbiAqL1xuZnVuY3Rpb24gdG91Y2hCdW5kbGUoY29kZTogc3RyaW5nKTogTWFwPHN0cmluZywgU2NyaXB0PiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGJ5RmlsZW5hbWUgPSBzY3JpcHRzLmJ5Q29kZS5nZXQoY29kZSk7XG4gIGlmIChieUZpbGVuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIC8vIE1vdmUgdG8gdGhlIG1vc3QtcmVjZW50bHktdXNlZCBwb3NpdGlvbiAoZW5kIG9mIGluc2VydGlvbiBvcmRlcikuXG4gIHNjcmlwdHMuYnlDb2RlLmRlbGV0ZShjb2RlKTtcbiAgc2NyaXB0cy5ieUNvZGUuc2V0KGNvZGUsIGJ5RmlsZW5hbWUpO1xuICByZXR1cm4gYnlGaWxlbmFtZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY29tcGlsZWQgYHZtLlNjcmlwdGAgZm9yIHRoZSBnaXZlbiB3b3JrZmxvdyBidW5kbGUgY29kZSBhbmRcbiAqIGZpbGVuYW1lLCBjb21waWxpbmcgYW5kIGNhY2hpbmcgaXQgb24gZmlyc3QgdXNlLiBTdWJzZXF1ZW50IGNhbGxzIHdpdGggdGhlXG4gKiBzYW1lIGAoY29kZSwgZmlsZW5hbWUpYCByZXR1cm4gdGhlIGNhY2hlZCBgU2NyaXB0YC5cbiAqXG4gKiBUaGUgcmV0dXJuZWQgYFNjcmlwdGAgaXMgbm90IHlldCBib3VuZCB0byBhbnkgY29udGV4dDsgdGhlIGNhbGxlciBydW5zIGl0XG4gKiBhZ2FpbnN0IGEgc3BlY2lmaWMgVk0gY29udGV4dCB2aWEgYHNjcmlwdC5ydW5JbkNvbnRleHQoY29udGV4dClgLiBUaGlzIGlzXG4gKiBlcXVpdmFsZW50IHRvIGB2bS5ydW5JbkNvbnRleHQoY29kZSwgY29udGV4dCwgeyBmaWxlbmFtZSB9KWAgYnV0IHNraXBzIHRoZVxuICogcmVjb21waWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FjaGVkV29ya2Zsb3dTY3JpcHQoXG4gIGNvZGU6IHN0cmluZyxcbiAgZmlsZW5hbWU6IHN0cmluZ1xuKTogU2NyaXB0IHtcbiAgbGV0IGJ5RmlsZW5hbWUgPSB0b3VjaEJ1bmRsZShjb2RlKTtcbiAgaWYgKGJ5RmlsZW5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIGJ5RmlsZW5hbWUgPSBuZXcgTWFwPHN0cmluZywgU2NyaXB0PigpO1xuICAgIHNjcmlwdHMuYnlDb2RlLnNldChjb2RlLCBieUZpbGVuYW1lKTtcbiAgICAvLyBFdmljdCB0aGUgbGVhc3QtcmVjZW50bHktdXNlZCBidW5kbGUocykgd2hlbiBvdmVyIHRoZSBjYXAuIE5ldyBidW5kbGVzXG4gICAgLy8gYXJlIGFwcGVuZGVkIGF0IHRoZSBlbmQsIHNvIHRoZSBvbGRlc3QgbGl2ZSBhdCB0aGUgZnJvbnQuXG4gICAgd2hpbGUgKHNjcmlwdHMuYnlDb2RlLnNpemUgPiBNQVhfQlVORExFUykge1xuICAgICAgY29uc3Qgb2xkZXN0ID0gc2NyaXB0cy5ieUNvZGUua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgIGlmIChvbGRlc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHNjcmlwdHMuYnlDb2RlLmRlbGV0ZShvbGRlc3QpO1xuICAgIH1cbiAgfVxuICBsZXQgc2NyaXB0ID0gYnlGaWxlbmFtZS5nZXQoZmlsZW5hbWUpO1xuICBpZiAoc2NyaXB0ID09PSB1bmRlZmluZWQpIHtcbiAgICBzY3JpcHQgPSBuZXcgU2NyaXB0KGNvZGUsIHsgZmlsZW5hbWUgfSk7XG4gICAgYnlGaWxlbmFtZS5zZXQoZmlsZW5hbWUsIHNjcmlwdCk7XG4gIH1cbiAgcmV0dXJuIHNjcmlwdDtcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSBjYWNoZWQgd29ya2Zsb3ctYnVuZGxlIGBTY3JpcHRgIGFnYWluc3QgYGNvbnRleHRgLiBDb21waWxlcyBhbmRcbiAqIGNhY2hlcyB0aGUgYFNjcmlwdGAgb24gZmlyc3QgdXNlIGZvciB0aGUgZ2l2ZW4gYChjb2RlLCBmaWxlbmFtZSlgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuQ2FjaGVkV29ya2Zsb3dTY3JpcHQoXG4gIGNvZGU6IHN0cmluZyxcbiAgZmlsZW5hbWU6IHN0cmluZyxcbiAgY29udGV4dDogQ29udGV4dFxuKTogdW5rbm93biB7XG4gIHJldHVybiBnZXRDYWNoZWRXb3JrZmxvd1NjcmlwdChjb2RlLCBmaWxlbmFtZSkucnVuSW5Db250ZXh0KGNvbnRleHQpO1xufVxuXG4vKipcbiAqIENsZWFycyB0aGUgY29tcGlsZWQtc2NyaXB0IGNhY2hlLiBJbnRlbmRlZCBmb3IgdGVzdHMgdGhhdCB3YW50IHRvIGFzc2VydFxuICogY29tcGlsZS12cy1jYWNoZSBiZWhhdmlvdXIgaW4gaXNvbGF0aW9uOyBub3QgdXNlZCBvbiB0aGUgaG90IHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhcldvcmtmbG93U2NyaXB0Q2FjaGUoKTogdm9pZCB7XG4gIHNjcmlwdHMuYnlDb2RlLmNsZWFyKCk7XG59XG5cbi8qKlxuICogTnVtYmVyIG9mIGRpc3RpbmN0IGJ1bmRsZSAoYGNvZGVgKSB2ZXJzaW9ucyBjdXJyZW50bHkgcmV0YWluZWQuIEV4cG9zZWQgZm9yXG4gKiB0ZXN0cyBhc3NlcnRpbmcgdGhlIExSVSBib3VuZDsgbm90IHVzZWQgb24gdGhlIGhvdCBwYXRoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd29ya2Zsb3dTY3JpcHRDYWNoZVNpemUoKTogbnVtYmVyIHtcbiAgcmV0dXJuIHNjcmlwdHMuYnlDb2RlLnNpemU7XG59XG4iXX0=
131
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NyaXB0LWNhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3ZtL3NjcmlwdC1jYWNoZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVsRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxREc7QUFDSCwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDBDQUEwQztBQUMxQyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsK0JBQStCLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDekUsTUFBTSxFQUFFLElBQUksR0FBRyxFQUErQjtDQUMvQyxDQUFDLENBQUMsQ0FBQztBQUVKOzs7R0FHRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO0FBRTdCOzs7OztHQUtHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxJQUFZO0lBQ3JDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVDLElBQUksVUFBVSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzdCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxvRUFBb0U7SUFDcEUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLElBQVksRUFDWixRQUFnQjtJQUVoQixJQUFJLFVBQVUsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QyxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM3QixVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7UUFDdkMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3JDLHlFQUF5RTtRQUN6RSw0REFBNEQ7UUFDNUQsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxrQkFBa0IsRUFBRSxDQUFDO1lBQ2hELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2xELElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN6QixNQUFNO1lBQ1IsQ0FBQztZQUNELE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLENBQUM7SUFDSCxDQUFDO0lBQ0QsSUFBSSxNQUFNLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0QyxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssU0FBUyxDQUFDO0lBQ3RDLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLFVBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFDRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxDQUFDO0FBQzlCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsd0JBQXdCO0lBQ3RDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDekIsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSx1QkFBdUI7SUFDckMsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2NyaXB0IH0gZnJvbSAnbm9kZTp2bSc7XG5pbXBvcnQgeyBnbG9iYWxTaW5nbGV0b24gfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuXG4vKipcbiAqIE1vZHVsZS1sZXZlbCBjYWNoZSBvZiBjb21waWxlZCB3b3JrZmxvdy1idW5kbGUgYHZtLlNjcmlwdGAgb2JqZWN0cy5cbiAqXG4gKiBXaHkgdGhpcyBleGlzdHNcbiAqIC0tLS0tLS0tLS0tLS0tLVxuICogUmVwbGF5aW5nIGEgd29ya2Zsb3cgcmUtZXZhbHVhdGVzIHRoZSB3b3JrZmxvdyBidW5kbGUgYWdhaW5zdCBhIGZyZXNoIFZNXG4gKiBjb250ZXh0IG9uIGV2ZXJ5IGl0ZXJhdGlvbiBvZiB0aGUgaW5saW5lIHJlcGxheSBsb29wIChzZWVcbiAqIGBydW5Xb3JrZmxvd2AgaW4gYC4uL3dvcmtmbG93LnRzYCkuIFRoZSBidW5kbGUgaXMgYSBzaW5nbGUgc3RyaW5nIHRoYXRcbiAqIGNvbnRhaW5zIGV2ZXJ5IHdvcmtmbG93IGZ1bmN0aW9uIGluIHRoZSBhcHAgYW5kIHJlZ2lzdGVycyB0aGVtIG9uXG4gKiBgZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzYC4gUHJldmlvdXNseSBlYWNoIHJlcGxheSBjYWxsZWRcbiAqIGB2bS5ydW5JbkNvbnRleHQod29ya2Zsb3dDb2RlLCBjb250ZXh0LCB7IGZpbGVuYW1lIH0pYCwgd2hpY2ggUkUtUEFSU0VTIGFuZFxuICogUkUtQ09NUElMRVMgdGhlIGVudGlyZSBidW5kbGUgZXZlcnkgdGltZTogTyhOKSBmdWxsIHJlLXBhcnNlcyBmb3IgYVxuICogc2VxdWVudGlhbCB3b3JrZmxvdyBvZiBOIHN0ZXBzLCBwbHVzIHRoZSBzYW1lIHBhcnNlIGNvc3QgcmVwZWF0ZWQgYWNyb3NzXG4gKiBldmVyeSBpbnZvY2F0aW9uIGluIHRoZSBwcm9jZXNzLlxuICpcbiAqIENvbXBpbGF0aW9uIGlzIGEgcHVyZSBmdW5jdGlvbiBvZiBgKGNvZGUsIGZpbGVuYW1lKWA6IGEgYHZtLlNjcmlwdGAgY2Fycmllc1xuICogbm8gcmVhbG0vY29udGV4dCBzdGF0ZTsgaXQgaXMgb25seSBib3VuZCB0byBhIGNvbnRleHQgYXQgYHJ1bkluQ29udGV4dGBcbiAqIHRpbWUuIFNvIGEgc2luZ2xlIGNvbXBpbGVkIGBTY3JpcHRgIGNhbiBiZSByZXVzZWQgYWNyb3NzIHJlcGxheXMgQU5EIGFjcm9zc1xuICogd29ya2Zsb3cgaW52b2NhdGlvbnMgaW4gdGhlIHNhbWUgcHJvY2VzcyB3aXRob3V0IGFmZmVjdGluZyBkZXRlcm1pbmlzbTogdGhlXG4gKiBwcm9kdWNlZCB3b3JrZmxvdyBmdW5jdGlvbiBpcyBpZGVudGljYWwgdG8gdGhlIHByZXZpb3VzIHJlLXBhcnNlLWV2ZXJ5LXRpbWVcbiAqIGJlaGF2aW91ciwgd2l0aCBpZGVudGljYWwgYGZpbGVuYW1lYCBzb3VyY2UgYXR0cmlidXRpb24gKHNlZSB0aGUgcHJlY2lzZVxuICogY2xhaW0sIGFuZCBpdHMgb25lIGNhdmVhdCwgaW4gYHJ1bldvcmtmbG93YCkuXG4gKlxuICogS2V5aW5nXG4gKiAtLS0tLS1cbiAqIEtleWVkIGJ5IGBjb2RlYCB0aGVuIGBmaWxlbmFtZWAuIFRoZSBgZmlsZW5hbWVgIGlzIHBhcnQgb2YgdGhlIGtleSBvblxuICogcHVycG9zZSwgTk9UIGFzIGEgZGVkdXBlIGtleTogaXQgaXMgYmFrZWQgaW50byB0aGUgY29tcGlsZWQgc2NyaXB0J3Mgc291cmNlXG4gKiBhdHRyaWJ1dGlvbiBhbmQgc3VyZmFjZXMgaW4gc3RhY2sgdHJhY2VzLCB3aGVyZSBgcmVtYXBFcnJvclN0YWNrYCBrZXlzIG9uIGl0XG4gKiB0byBtYXAgZnJhbWVzIGJhY2sgdG8gdGhlIHVzZXIncyBzb3VyY2UuIFR3byB3b3JrZmxvd3MgaW4gdGhlIHNhbWUgYnVuZGxlXG4gKiBzaGFyZSB0aGUgc2FtZSBgY29kZWAgYnV0IGhhdmUgZGlmZmVyZW50IGBmaWxlbmFtZWBzLCBzbyB0aGV5IGludGVudGlvbmFsbHlcbiAqIGNvbXBpbGUgdG8gZGlzdGluY3QgYFNjcmlwdGBzOyBjb2xsYXBzaW5nIHRoZW0gb250byBhIHNpbmdsZSBzaGFyZWQgYFNjcmlwdGBcbiAqIHdvdWxkIG1pc2F0dHJpYnV0ZSBvbmUgd29ya2Zsb3cncyBzdGFjayBmcmFtZXMgdG8gYW5vdGhlciBmaWxlLiBUaGUgY29zdCBvZlxuICoga2VlcGluZyB0aGVtIGRpc3RpbmN0IGlzIHRoYXQgdGhlIHdob2xlIGJ1bmRsZSBpcyBjb21waWxlZCBvbmNlIHBlciBkaXN0aW5jdFxuICogYGZpbGVuYW1lYCAobm90IG9uY2UgcGVyIGJ1bmRsZSk7IGluIHByYWN0aWNlIHRoYXQgaXMgYm91bmRlZCBieSB0aGUgbnVtYmVyXG4gKiBvZiBzb3VyY2UgZmlsZXMgdGhhdCBkZWZpbmUgYSB3b3JrZmxvdywgYW5kIGJlY2F1c2UgVjggbGF6aWx5IGNvbXBpbGVzXG4gKiBmdW5jdGlvbiBib2RpZXMgdGhlIGR1cGxpY2F0ZWQgd29yayBpcyB0aGUgKGNoZWFwKSB0b3AtbGV2ZWwgcGFyc2UsIG5vdCBmdWxsXG4gKiBwZXItd29ya2Zsb3cgY29kZWdlbi5cbiAqXG4gKiBXZSB1c2UgYSBuZXN0ZWQgTWFwIChjb2RlIC0+IGZpbGVuYW1lIC0+IFNjcmlwdCkgc28gdGhhdCBldmljdGluZyBhIHNvdXJjZVxuICogc3RyaW5nIGRyb3BzIGFsbCBvZiBpdHMgcGVyLWZpbGVuYW1lIHNjcmlwdHMgdG9nZXRoZXIuIE1vc3QgZW50cmllcyBhcmUgZnVsbFxuICogd29ya2Zsb3cgYnVuZGxlczsgYGNvbXBpbGVXb3JrZmxvd0J1bmRsZWAgYWxzbyBjYWNoZXMgaXRzIHRpbnkgd29ya2Zsb3ctbmFtZVxuICogbG9va3VwIHNuaXBwZXRzIGhlcmUuXG4gKlxuICogQm91bmRpbmdcbiAqIC0tLS0tLS0tXG4gKiBUaGUgdG9wLWxldmVsIChgY29kZWAta2V5ZWQpIG1hcCBpcyBhbiBpbnNlcnRpb24tb3JkZXJlZCBMUlUgY2FwcGVkIGF0XG4gKiBgTUFYX1NDUklQVF9TT1VSQ0VTYCBlbnRyaWVzLiBBIHByb2R1Y3Rpb24gZGVwbG95bWVudCBoYXMgb25lIGxhcmdlIGJ1bmRsZVxuICogc291cmNlIHBsdXMgc21hbGwgbG9va3VwIHNvdXJjZXM7IHRoZSBidW5kbGUgaXMgdG91Y2hlZCBpbW1lZGlhdGVseSBiZWZvcmVcbiAqIGl0cyBsb29rdXAgb24gZXZlcnkgY29tcGlsYXRpb24sIHNvIGxvb2t1cCBjaHVybiBjYW5ub3QgZXZpY3QgdGhlIGV4cGVuc2l2ZVxuICogZW50cnkgaW4gbm9ybWFsIHVzZS4gVGhlIGJvdW5kIHByaW1hcmlseSBwcm90ZWN0cyBkZXYvd2F0Y2ggbW9kZSwgd2hlcmUgZXZlcnlcbiAqIGVkaXQgcHJvZHVjZXMgYSBuZXcgYnVuZGxlIHN0cmluZyB0aGF0IHdvdWxkIG90aGVyd2lzZSBwaW4gYWxsIGhpc3RvcmljYWxcbiAqIHZlcnNpb25zLiBUaGUgcGVyLWBmaWxlbmFtZWAgaW5uZXIgbWFwIGlzIG5hdHVyYWxseSBib3VuZGVkIGJ5IHRoZSB3b3JrZmxvd3NcbiAqIGNvbXBpbGVkIGZyb20gdGhhdCBzb3VyY2UgYW5kIGlzIGRyb3BwZWQgd2hvbGVzYWxlIHdpdGggaXRzIHBhcmVudCBlbnRyeS5cbiAqL1xuLy8gT24gYGdsb2JhbFRoaXNgIChzZWUgYGdsb2JhbFNpbmdsZXRvbmApOiBjb21waWxpbmcgYSBidW5kbGUgaXMgdGhlIGV4cGVuc2l2ZVxuLy8gcGFydCB0aGlzIGNhY2hlIGV4aXN0cyB0byBza2lwLCBhbmQgcGVyLWNvcHkgY2FjaGVzIHdvdWxkIHBheSBpdCBvbmNlIHBlclxuLy8gYnVuZGxlciBsYXllciB0aGF0IGNvbXBpbGVzIGEgd29ya2Zsb3cuXG5jb25zdCBzY3JpcHRzID0gZ2xvYmFsU2luZ2xldG9uKCdAd29ya2Zsb3cvY29yZS8vdm1TY3JpcHRDYWNoZScsIDEsICgpID0+ICh7XG4gIGJ5Q29kZTogbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIFNjcmlwdD4+KCksXG59KSk7XG5cbi8qKlxuICogTWF4aW11bSBudW1iZXIgb2YgZGlzdGluY3Qgc2NyaXB0IHNvdXJjZSBzdHJpbmdzIHRvIHJldGFpbi4gS2VwdCBkZWxpYmVyYXRlbHlcbiAqIHNtYWxsIGJlY2F1c2Ugc3RhbGUgYnVuZGxlcyBhbmQgb25lLW9mZiBsb29rdXAgc25pcHBldHMgaGF2ZSBubyBsYXN0aW5nIHZhbHVlLlxuICovXG5jb25zdCBNQVhfU0NSSVBUX1NPVVJDRVMgPSA4O1xuXG4vKipcbiAqIExvb2tzIHVwIHRoZSBwZXItZmlsZW5hbWUgbWFwIGZvciBgY29kZWAsIG1hcmtpbmcgaXQgbW9zdC1yZWNlbnRseS11c2VkLlxuICogUmVsaWVzIG9uIGBNYXBgIHByZXNlcnZpbmcgaW5zZXJ0aW9uIG9yZGVyOiBkZWxldGluZyBhbmQgcmUtaW5zZXJ0aW5nIGFuXG4gKiBleGlzdGluZyBrZXkgbW92ZXMgaXQgdG8gdGhlIGVuZCAobmV3ZXN0KSwgc28gdGhlIGZpcnN0IGtleSBpcyBhbHdheXMgdGhlXG4gKiBsZWFzdC1yZWNlbnRseS11c2VkIGV2aWN0aW9uIGNhbmRpZGF0ZS5cbiAqL1xuZnVuY3Rpb24gdG91Y2hTY3JpcHRTb3VyY2UoY29kZTogc3RyaW5nKTogTWFwPHN0cmluZywgU2NyaXB0PiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGJ5RmlsZW5hbWUgPSBzY3JpcHRzLmJ5Q29kZS5nZXQoY29kZSk7XG4gIGlmIChieUZpbGVuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIC8vIE1vdmUgdG8gdGhlIG1vc3QtcmVjZW50bHktdXNlZCBwb3NpdGlvbiAoZW5kIG9mIGluc2VydGlvbiBvcmRlcikuXG4gIHNjcmlwdHMuYnlDb2RlLmRlbGV0ZShjb2RlKTtcbiAgc2NyaXB0cy5ieUNvZGUuc2V0KGNvZGUsIGJ5RmlsZW5hbWUpO1xuICByZXR1cm4gYnlGaWxlbmFtZTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY29tcGlsZWQgYHZtLlNjcmlwdGAgZm9yIHRoZSBnaXZlbiBzb3VyY2UgY29kZSBhbmQgZmlsZW5hbWUsXG4gKiBjb21waWxpbmcgYW5kIGNhY2hpbmcgaXQgb24gZmlyc3QgdXNlLiBTdWJzZXF1ZW50IGNhbGxzIHdpdGggdGhlIHNhbWVcbiAqIGAoY29kZSwgZmlsZW5hbWUpYCByZXR1cm4gdGhlIGNhY2hlZCBgU2NyaXB0YC5cbiAqXG4gKiBUaGUgcmV0dXJuZWQgYFNjcmlwdGAgaXMgbm90IHlldCBib3VuZCB0byBhbnkgY29udGV4dDsgdGhlIGNhbGxlciBydW5zIGl0XG4gKiBhZ2FpbnN0IGEgc3BlY2lmaWMgVk0gY29udGV4dCB2aWEgYHNjcmlwdC5ydW5JbkNvbnRleHQoY29udGV4dClgLiBUaGlzIGlzXG4gKiBlcXVpdmFsZW50IHRvIGB2bS5ydW5JbkNvbnRleHQoY29kZSwgY29udGV4dCwgeyBmaWxlbmFtZSB9KWAgYnV0IHNraXBzIHRoZVxuICogcmVjb21waWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2FjaGVkV29ya2Zsb3dTY3JpcHQoXG4gIGNvZGU6IHN0cmluZyxcbiAgZmlsZW5hbWU6IHN0cmluZ1xuKTogeyBzY3JpcHQ6IFNjcmlwdDsgY2FjaGVIaXQ6IGJvb2xlYW4gfSB7XG4gIGxldCBieUZpbGVuYW1lID0gdG91Y2hTY3JpcHRTb3VyY2UoY29kZSk7XG4gIGlmIChieUZpbGVuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICBieUZpbGVuYW1lID0gbmV3IE1hcDxzdHJpbmcsIFNjcmlwdD4oKTtcbiAgICBzY3JpcHRzLmJ5Q29kZS5zZXQoY29kZSwgYnlGaWxlbmFtZSk7XG4gICAgLy8gRXZpY3QgdGhlIGxlYXN0LXJlY2VudGx5LXVzZWQgc291cmNlKHMpIHdoZW4gb3ZlciB0aGUgY2FwLiBOZXcgc291cmNlc1xuICAgIC8vIGFyZSBhcHBlbmRlZCBhdCB0aGUgZW5kLCBzbyB0aGUgb2xkZXN0IGxpdmUgYXQgdGhlIGZyb250LlxuICAgIHdoaWxlIChzY3JpcHRzLmJ5Q29kZS5zaXplID4gTUFYX1NDUklQVF9TT1VSQ0VTKSB7XG4gICAgICBjb25zdCBvbGRlc3QgPSBzY3JpcHRzLmJ5Q29kZS5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgaWYgKG9sZGVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc2NyaXB0cy5ieUNvZGUuZGVsZXRlKG9sZGVzdCk7XG4gICAgfVxuICB9XG4gIGxldCBzY3JpcHQgPSBieUZpbGVuYW1lLmdldChmaWxlbmFtZSk7XG4gIGNvbnN0IGNhY2hlSGl0ID0gc2NyaXB0ICE9PSB1bmRlZmluZWQ7XG4gIGlmIChzY3JpcHQgPT09IHVuZGVmaW5lZCkge1xuICAgIHNjcmlwdCA9IG5ldyBTY3JpcHQoY29kZSwgeyBmaWxlbmFtZSB9KTtcbiAgICBieUZpbGVuYW1lLnNldChmaWxlbmFtZSwgc2NyaXB0KTtcbiAgfVxuICByZXR1cm4geyBzY3JpcHQsIGNhY2hlSGl0IH07XG59XG5cbi8qKlxuICogQ2xlYXJzIHRoZSBjb21waWxlZC1zY3JpcHQgY2FjaGUuIEludGVuZGVkIGZvciB0ZXN0cyB0aGF0IHdhbnQgdG8gYXNzZXJ0XG4gKiBjb21waWxlLXZzLWNhY2hlIGJlaGF2aW91ciBpbiBpc29sYXRpb247IG5vdCB1c2VkIG9uIHRoZSBob3QgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyV29ya2Zsb3dTY3JpcHRDYWNoZSgpOiB2b2lkIHtcbiAgc2NyaXB0cy5ieUNvZGUuY2xlYXIoKTtcbn1cblxuLyoqXG4gKiBOdW1iZXIgb2YgZGlzdGluY3Qgc2NyaXB0IHNvdXJjZSBzdHJpbmdzIGN1cnJlbnRseSByZXRhaW5lZC4gRXhwb3NlZCBmb3JcbiAqIHRlc3RzIGFzc2VydGluZyB0aGUgTFJVIGJvdW5kOyBub3QgdXNlZCBvbiB0aGUgaG90IHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3b3JrZmxvd1NjcmlwdENhY2hlU2l6ZSgpOiBudW1iZXIge1xuICByZXR1cm4gc2NyaXB0cy5ieUNvZGUuc2l6ZTtcbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"version":3,"file":"sleep.d.ts","sourceRoot":"","sources":["../../src/workflow/sleep.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAGtC,OAAO,EAIL,KAAK,2BAA2B,EACjC,MAAM,eAAe,CAAC;AAEvB,wBAAgB,WAAW,CAAC,GAAG,EAAE,2BAA2B,IAExD,OAAO,WAAW,GAAG,IAAI,GAAG,MAAM,KACjC,OAAO,CAAC,IAAI,CAAC,CAoIjB"}
1
+ {"version":3,"file":"sleep.d.ts","sourceRoot":"","sources":["../../src/workflow/sleep.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAGtC,OAAO,EAIL,KAAK,2BAA2B,EACjC,MAAM,eAAe,CAAC;AAEvB,wBAAgB,WAAW,CAAC,GAAG,EAAE,2BAA2B,IAExD,OAAO,WAAW,GAAG,IAAI,GAAG,MAAM,KACjC,OAAO,CAAC,IAAI,CAAC,CAgIjB"}
@@ -1,8 +1,7 @@
1
1
  import { ReplayDivergenceError } from '@workflow/errors';
2
2
  import { parseDurationToDate, withResolvers } from '@workflow/utils';
3
3
  import { EventConsumerResult } from '../events-consumer.js';
4
- import { WorkflowSuspension } from '../global.js';
5
- import { awaitEarlierDeliveries, registerDeliveryBarrier, scheduleWhenIdle, } from '../private.js';
4
+ import { awaitEarlierDeliveries, registerDeliveryBarrier, scheduleWorkflowSuspension, } from '../private.js';
6
5
  export function createSleep(ctx) {
7
6
  return async function sleepImpl(param) {
8
7
  const { promise, resolve } = withResolvers();
@@ -20,9 +19,7 @@ export function createSleep(ctx) {
20
19
  // If there are no events and we're waiting for wait_completed,
21
20
  // suspend the workflow until the wait fires
22
21
  if (!event) {
23
- scheduleWhenIdle(ctx, () => {
24
- ctx.onWorkflowError(new WorkflowSuspension(ctx.invocationsQueue, ctx.globalThis));
25
- });
22
+ scheduleWorkflowSuspension(ctx);
26
23
  return EventConsumerResult.NotConsumed;
27
24
  }
28
25
  if (event.correlationId !== correlationId) {
@@ -109,4 +106,4 @@ export function createSleep(ctx) {
109
106
  return promise;
110
107
  };
111
108
  }
112
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xlZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ya2Zsb3cvc2xlZXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXJFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFBZ0Msa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDaEYsT0FBTyxFQUNMLHNCQUFzQixFQUN0Qix1QkFBdUIsRUFDdkIsZ0JBQWdCLEdBRWpCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE1BQU0sVUFBVSxXQUFXLENBQUMsR0FBZ0M7SUFDMUQsT0FBTyxLQUFLLFVBQVUsU0FBUyxDQUM3QixLQUFrQztRQUVsQyxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLGFBQWEsRUFBUSxDQUFDO1FBQ25ELE1BQU0sYUFBYSxHQUFHLFFBQVEsR0FBRyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7UUFFbkQsNEJBQTRCO1FBQzVCLE1BQU0sUUFBUSxHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTVDLGdFQUFnRTtRQUNoRSxNQUFNLFFBQVEsR0FBNEI7WUFDeEMsSUFBSSxFQUFFLE1BQU07WUFDWixhQUFhO1lBQ2IsUUFBUTtTQUNULENBQUM7UUFDRixHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUVsRCxHQUFHLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3JDLCtEQUErRDtZQUMvRCw0Q0FBNEM7WUFDNUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNYLGdCQUFnQixDQUFDLEdBQUcsRUFB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LENBQUMsQ0FBQztZQUNILE9BQU8sbUJBQW1CLENBQUMsUUFBUSxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlcGxheURpdmVyZ2VuY2VFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgcGFyc2VEdXJhdGlvblRvRGF0ZSwgd2l0aFJlc29sdmVycyB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgdHlwZSB7IFN0cmluZ1ZhbHVlIH0gZnJvbSAnbXMnO1xuaW1wb3J0IHsgRXZlbnRDb25zdW1lclJlc3VsdCB9IGZyb20gJy4uL2V2ZW50cy1jb25zdW1lci5qcyc7XG5pbXBvcnQgeyB0eXBlIFdhaXRJbnZvY2F0aW9uUXVldWVJdGVtLCBXb3JrZmxvd1N1c3BlbnNpb24gfSBmcm9tICcuLi9nbG9iYWwuanMnO1xuaW1wb3J0IHtcbiAgYXdhaXRFYXJsaWVyRGVsaXZlcmllcyxcbiAgcmVnaXN0ZXJEZWxpdmVyeUJhcnJpZXIsXG4gIHNjaGVkdWxlV2hlbklkbGUsXG4gIHR5cGUgV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0LFxufSBmcm9tICcuLi9wcml2YXRlLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNsZWVwKGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0KSB7XG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiBzbGVlcEltcGwoXG4gICAgcGFyYW06IFN0cmluZ1ZhbHVlIHwgRGF0ZSB8IG51bWJlclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHByb21pc2UsIHJlc29sdmUgfSA9IHdpdGhSZXNvbHZlcnM8dm9pZD4oKTtcbiAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gYHdhaXRfJHtjdHguZ2VuZXJhdGVVbGlkKCl9YDtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgcmVzdW1lIHRpbWVcbiAgICBjb25zdCByZXN1bWVBdCA9IHBhcnNlRHVyYXRpb25Ub0RhdGUocGFyYW0pO1xuXG4gICAgLy8gQWRkIHdhaXQgdG8gaW52b2NhdGlvbnMgcXVldWUgKHVzaW5nIE1hcCBmb3IgTygxKSBvcGVyYXRpb25zKVxuICAgIGNvbnN0IHdhaXRJdGVtOiBXYWl0SW52b2NhdGlvblF1ZXVlSXRlbSA9IHtcbiAgICAgIHR5cGU6ICd3YWl0JyxcbiAgICAgIGNvcnJlbGF0aW9uSWQsXG4gICAgICByZXN1bWVBdCxcbiAgICB9O1xuICAgIGN0eC5pbnZvY2F0aW9uc1F1ZXVlLnNldChjb3JyZWxhdGlvbklkLCB3YWl0SXRlbSk7XG5cbiAgICBjdHguZXZlbnRzQ29uc3VtZXIuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGV2ZW50cyBhbmQgd2UncmUgd2FpdGluZyBmb3Igd2FpdF9jb21wbGV0ZWQsXG4gICAgICAvLyBzdXNwZW5kIHRoZSB3b3JrZmxvdyB1bnRpbCB0aGUgd2FpdCBmaXJlc1xuICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICBzY2hlZHVsZVdoZW5JZGxlKGN0eCwgKCkgPT4ge1xuICAgICAgICAgIGN0eC5vbldvcmtmbG93RXJyb3IoXG4gICAgICAgICAgICBuZXcgV29ya2Zsb3dTdXNwZW5zaW9uKGN0eC5pbnZvY2F0aW9uc1F1ZXVlLCBjdHguZ2xvYmFsVGhpcylcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuTm90Q29uc3VtZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5jb3JyZWxhdGlvbklkICE9PSBjb3JyZWxhdGlvbklkKSB7XG4gICAgICAgIC8vIFdlJ3JlIG5vdCBpbnRlcmVzdGVkIGluIHRoaXMgZXZlbnQgLSB0aGUgY29ycmVsYXRpb25JZCBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IGVudGl0eVxuICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZDtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgZm9yIHdhaXRfY3JlYXRlZCBldmVudCB0byBtYXJrIHRoaXMgd2FpdCBhcyBoYXZpbmcgdGhlIGV2ZW50IGNyZWF0ZWRcbiAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnKSB7XG4gICAgICAgIC8vIE1hcmsgdGhpcyB3YWl0IGFzIGhhdmluZyB0aGUgY3JlYXRlZCBldmVudCwgYnV0IGtlZXAgaXQgaW4gdGhlIHF1ZXVlXG4gICAgICAgIC8vIE8oMSkgbG9va3VwIHVzaW5nIE1hcFxuICAgICAgICBjb25zdCBxdWV1ZUl0ZW0gPSBjdHguaW52b2NhdGlvbnNRdWV1ZS5nZXQoY29ycmVsYXRpb25JZCk7XG4gICAgICAgIGlmIChxdWV1ZUl0ZW0gJiYgcXVldWVJdGVtLnR5cGUgPT09ICd3YWl0Jykge1xuICAgICAgICAgIHF1ZXVlSXRlbS5oYXNDcmVhdGVkRXZlbnQgPSB0cnVlO1xuICAgICAgICAgIHF1ZXVlSXRlbS5yZXN1bWVBdCA9IGV2ZW50LmV2ZW50RGF0YS5yZXN1bWVBdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Db25zdW1lZDtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgZm9yIHdhaXRfY29tcGxldGVkIGV2ZW50XG4gICAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50UmVzdW1lQXQgPSBldmVudC5ldmVudERhdGE/LnJlc3VtZUF0O1xuICAgICAgICBpZiAoZXZlbnRSZXN1bWVBdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3QgcXVldWVJdGVtID0gY3R4Lmludm9jYXRpb25zUXVldWUuZ2V0KGNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgIGNvbnN0IGV4cGVjdGVkUmVzdW1lQXQgPVxuICAgICAgICAgICAgcXVldWVJdGVtICYmIHF1ZXVlSXRlbS50eXBlID09PSAnd2FpdCdcbiAgICAgICAgICAgICAgPyBxdWV1ZUl0ZW0ucmVzdW1lQXRcbiAgICAgICAgICAgICAgOiByZXN1bWVBdDtcbiAgICAgICAgICBjb25zdCBldmVudFJlc3VtZUF0RGF0ZSA9IG5ldyBEYXRlKGV2ZW50UmVzdW1lQXQpO1xuICAgICAgICAgIGNvbnN0IGV2ZW50UmVzdW1lQXRNcyA9IGV2ZW50UmVzdW1lQXREYXRlLmdldFRpbWUoKTtcbiAgICAgICAgICBjb25zdCBleHBlY3RlZFJlc3VtZUF0TXMgPSBleHBlY3RlZFJlc3VtZUF0LmdldFRpbWUoKTtcbiAgICAgICAgICBjb25zdCBldmVudFJlc3VtZUF0Rm9yTWVzc2FnZSA9IE51bWJlci5pc0Zpbml0ZShldmVudFJlc3VtZUF0TXMpXG4gICAgICAgICAgICA/IGV2ZW50UmVzdW1lQXREYXRlLnRvSVNPU3RyaW5nKClcbiAgICAgICAgICAgIDogU3RyaW5nKGV2ZW50UmVzdW1lQXQpO1xuXG4gICAgICAgICAgaWYgKGV2ZW50UmVzdW1lQXRNcyAhPT0gZXhwZWN0ZWRSZXN1bWVBdE1zKSB7XG4gICAgICAgICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICAgICAgICBuZXcgUmVwbGF5RGl2ZXJnZW5jZUVycm9yKFxuICAgICAgICAgICAgICAgICAgYFJlcGxheSBkaXZlcmdlbmNlOiB3YWl0X2NvbXBsZXRlZCBldmVudCBmb3IgJHtjb3JyZWxhdGlvbklkfSBoYXMgcmVzdW1lQXQgXCIke2V2ZW50UmVzdW1lQXRGb3JNZXNzYWdlfVwiLCBidXQgdGhlIGN1cnJlbnQgd2FpdCBjb25zdW1lciBleHBlY3RzIFwiJHtleHBlY3RlZFJlc3VtZUF0LnRvSVNPU3RyaW5nKCl9XCJgLFxuICAgICAgICAgICAgICAgICAgeyBldmVudElkOiBldmVudC5ldmVudElkIH1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkZpbmlzaGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSB0aGlzIHdhaXQgZnJvbSB0aGUgaW52b2NhdGlvbnMgcXVldWUgKE8oMSkgZGVsZXRlIHVzaW5nIE1hcClcbiAgICAgICAgY3R4Lmludm9jYXRpb25zUXVldWUuZGVsZXRlKGNvcnJlbGF0aW9uSWQpO1xuXG4gICAgICAgIC8vIFRoaXMgYHdhaXRfY29tcGxldGVkYCBpcyBhIGJyYW5jaC1kZWNpZGluZyByZXNvbHV0aW9uIHRoZSB3b3JrZmxvd1xuICAgICAgICAvLyBtYXkgYFByb21pc2UucmFjZWAgYWdhaW5zdCBhIGhvb2sgcGF5bG9hZCwgb3IgYXdhaXQgb24gYSBicmFuY2hcbiAgICAgICAgLy8gcGFyYWxsZWwgdG8gb25lIGF3YWl0aW5nIGEgc3RlcC4gT3JkZXIgaXQgZGV0ZXJtaW5pc3RpY2FsbHkgYnlcbiAgICAgICAgLy8gZXZlbnQtbG9nIHBvc2l0aW9uIChzZWUgYHBlbmRpbmdEZWxpdmVyeUJhcnJpZXJzYCk6XG4gICAgICAgIC8vICAtIFJlZ2lzdGVyIGEgJ3dhaXQnIGJhcnJpZXIgYXQgdGhpcyBldmVudCdzIGluZGV4IHNvIGEgTEFURVItaW4tbG9nXG4gICAgICAgIC8vICAgIGhvb2sgcGF5bG9hZCBvciBzdGVwIHJlc3VsdCBpcyBkZWxpdmVyZWQgb25seSBhZnRlciB0aGlzIHdhaXQuXG4gICAgICAgIC8vICAtIEJlZm9yZSByZXNvbHZpbmcsIGRlZmVyIGJlaGluZCBldmVyeSBFQVJMSUVSLWluLWxvZyBIT09LIGFuZCBTVEVQXG4gICAgICAgIC8vICAgIGRlbGl2ZXJ5IHNvIHRoaXMgd2FpdCBkb2VzIG5vdCBwcmVlbXB0IG9uZSB0aGUgY29tbWl0dGVkIGxvZ1xuICAgICAgICAvLyAgICBvcmRlcmVkIGZpcnN0LiBUaGVuIG1hcmsgdGhpcyB3YWl0IGRlbGl2ZXJlZCB0byByZWxlYXNlIHRoZSBsYXRlclxuICAgICAgICAvLyAgICBkZWxpdmVyaWVzIGdhdGVkIG9uIGl0LlxuICAgICAgICBjb25zdCBldmVudEluZGV4ID0gY3R4LmV2ZW50c0NvbnN1bWVyLmV2ZW50SW5kZXg7XG4gICAgICAgIGNvbnN0IGJhcnJpZXIgPSByZWdpc3RlckRlbGl2ZXJ5QmFycmllcihjdHgsIGV2ZW50SW5kZXgsICd3YWl0Jyk7XG4gICAgICAgIC8vIFRoZSBkZWZlcnJhbCBpcyBjYXB0dXJlZCBIRVJFLCB3aGlsZSBjb25zdW1pbmcgdGhlIGV2ZW50LCBhbmQgbm90XG4gICAgICAgIC8vIGFmdGVyIHRoZSBxdWV1ZSB0YWlsIGJlbG93OiBzYW1lIHJlYXNvbmluZyBhcyBzdGVwLnRzLiBBbiBlYXJsaWVyXG4gICAgICAgIC8vIHN0ZXAgb3IgaG9vayB3aG9zZSBoeWRyYXRpb24gc2xvdCBzaXRzIGluIHRoYXQgdGFpbCBoYXMgdXN1YWxseVxuICAgICAgICAvLyBkZWxpdmVyZWQsIGFuZCBzbyBkZXJlZ2lzdGVyZWQgaXRzIGJhcnJpZXIsIGJ5IHRoZSB0aW1lIHRoZSB0YWlsXG4gICAgICAgIC8vIHJlc29sdmVzLiBSZWFkIHRoZW4sIGl0IHdvdWxkIGJlIGludmlzaWJsZSBhbmQgdGhpcyB3YWl0IHdvdWxkIHNraXBcbiAgICAgICAgLy8gYm90aCB0aGUgZ2F0ZSBBTkQgYGF3YWl0RWFybGllckRlbGl2ZXJpZXNgJyBtYWNyb3Rhc2sgeWllbGQsIGxldHRpbmdcbiAgICAgICAgLy8gaXQgb3ZlcnRha2UgdGhlIGJyYW5jaCB0aGF0IGVhcmxpZXIgZGVsaXZlcnkganVzdCB3b2tlLiBFdmVyeSBldmVudFxuICAgICAgICAvLyBpbiBvbmUgZHJhaW4gd2luZG93IGlzIGNvbnN1bWVkIGJlZm9yZSBhbnkgc2xvdCBydW5zLCBzbyBjYXB0dXJpbmdcbiAgICAgICAgLy8gYXQgY29uc3VtcHRpb24gdGltZSBzZWVzIGFsbCBvZiB0aGVtLlxuICAgICAgICBjb25zdCBlYXJsaWVyRGVsaXZlcmVkID0gYXdhaXRFYXJsaWVyRGVsaXZlcmllcyhcbiAgICAgICAgICBjdHgsXG4gICAgICAgICAgZXZlbnRJbmRleCxcbiAgICAgICAgICAnd2FpdCdcbiAgICAgICAgKTtcbiAgICAgICAgLy8gRGVmZXIgKyByZXNvbHZlIGluIGEgREVUQUNIRUQgcHJvbWlzZSAobm90IGNoYWluZWQgb250byB0aGUgc2VyaWFsXG4gICAgICAgIC8vIGBwcm9taXNlUXVldWVgKS4gYGF3YWl0RWFybGllckRlbGl2ZXJpZXNgIG1heSB3YWl0IG9uIGFuIGVhcmxpZXJcbiAgICAgICAgLy8gaG9vayBvciBzdGVwIGRlbGl2ZXJ5IHdob3NlIG93biByZXNvbHV0aW9uIGlzIGl0c2VsZiBkcml2ZW4gYnkgdGhlXG4gICAgICAgIC8vIHByb21pc2VRdWV1ZTsgYmxvY2tpbmcgYSBxdWV1ZSBzbG90IG9uIGl0IHdvdWxkIGRlYWRsb2NrIHRoZSBzZXJpYWxcbiAgICAgICAgLy8gcXVldWUuIFdlIHN0aWxsIGFuY2hvciB0byB0aGUgcXVldWUgdGFpbCBmaXJzdCBzbyBwcmlvciBxdWV1ZWRcbiAgICAgICAgLy8gaHlkcmF0aW9uL29yZGVyaW5nIHdvcmsgcnVucyBpbiBldmVudC1sb2cgb3JkZXIuXG4gICAgICAgIGNvbnN0IHF1ZXVlQXRDb21wbGV0aW9uID0gY3R4LnByb21pc2VRdWV1ZTtcbiAgICAgICAgdm9pZCBxdWV1ZUF0Q29tcGxldGlvblxuICAgICAgICAgIC50aGVuKCgpID0+IGVhcmxpZXJEZWxpdmVyZWQpXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgYmFycmllci5tYXJrRGVsaXZlcmVkKCk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkZpbmlzaGVkO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGlzIHJlcGxheSBpbnN0YWxsZWQgYSBkaWZmZXJlbnQgY29uc3VtZXIgdGhhbiB0aGUgc3RvcmVkIGV2ZW50IG5lZWRzLlxuICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgIGN0eC5vbldvcmtmbG93RXJyb3IoXG4gICAgICAgICAgbmV3IFJlcGxheURpdmVyZ2VuY2VFcnJvcihcbiAgICAgICAgICAgIGBSZXBsYXkgZGl2ZXJnZW5jZTogVW5leHBlY3RlZCBldmVudCB0eXBlIGZvciB3YWl0ICR7Y29ycmVsYXRpb25JZH0gXCIke2V2ZW50LmV2ZW50VHlwZX1cImAsXG4gICAgICAgICAgICB7IGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQgfVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfTtcbn1cbiJdfQ==
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xlZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ya2Zsb3cvc2xlZXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXJFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTVELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLDBCQUEwQixHQUUzQixNQUFNLGVBQWUsQ0FBQztBQUV2QixNQUFNLFVBQVUsV0FBVyxDQUFDLEdBQWdDO0lBQzFELE9BQU8sS0FBSyxVQUFVLFNBQVMsQ0FDN0IsS0FBa0M7UUFFbEMsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FBRyxhQUFhLEVBQVEsQ0FBQztRQUNuRCxNQUFNLGFBQWEsR0FBRyxRQUFRLEdBQUcsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO1FBRW5ELDRCQUE0QjtRQUM1QixNQUFNLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU1QyxnRUFBZ0U7UUFDaEUsTUFBTSxRQUFRLEdBQTRCO1lBQ3hDLElBQUksRUFBRSxNQUFNO1lBQ1osYUFBYTtZQUNiLFFBQVE7U0FDVCxDQUFDO1FBQ0YsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFbEQsR0FBRyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNyQywrREFBK0Q7WUFDL0QsNENBQTRDO1lBQzVDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDWCwwQkFBMEIsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEMsT0FBTyxtQkFBbUIsQ0FBQyxXQUFXLENBQUM7WUFD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ICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IHBhcnNlRHVyYXRpb25Ub0RhdGUsIHdpdGhSZXNvbHZlcnMgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBTdHJpbmdWYWx1ZSB9IGZyb20gJ21zJztcbmltcG9ydCB7IEV2ZW50Q29uc3VtZXJSZXN1bHQgfSBmcm9tICcuLi9ldmVudHMtY29uc3VtZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBXYWl0SW52b2NhdGlvblF1ZXVlSXRlbSB9IGZyb20gJy4uL2dsb2JhbC5qcyc7XG5pbXBvcnQge1xuICBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzLFxuICByZWdpc3RlckRlbGl2ZXJ5QmFycmllcixcbiAgc2NoZWR1bGVXb3JrZmxvd1N1c3BlbnNpb24sXG4gIHR5cGUgV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0LFxufSBmcm9tICcuLi9wcml2YXRlLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNsZWVwKGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0KSB7XG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiBzbGVlcEltcGwoXG4gICAgcGFyYW06IFN0cmluZ1ZhbHVlIHwgRGF0ZSB8IG51bWJlclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHByb21pc2UsIHJlc29sdmUgfSA9IHdpdGhSZXNvbHZlcnM8dm9pZD4oKTtcbiAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gYHdhaXRfJHtjdHguZ2VuZXJhdGVVbGlkKCl9YDtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgcmVzdW1lIHRpbWVcbiAgICBjb25zdCByZXN1bWVBdCA9IHBhcnNlRHVyYXRpb25Ub0RhdGUocGFyYW0pO1xuXG4gICAgLy8gQWRkIHdhaXQgdG8gaW52b2NhdGlvbnMgcXVldWUgKHVzaW5nIE1hcCBmb3IgTygxKSBvcGVyYXRpb25zKVxuICAgIGNvbnN0IHdhaXRJdGVtOiBXYWl0SW52b2NhdGlvblF1ZXVlSXRlbSA9IHtcbiAgICAgIHR5cGU6ICd3YWl0JyxcbiAgICAgIGNvcnJlbGF0aW9uSWQsXG4gICAgICByZXN1bWVBdCxcbiAgICB9O1xuICAgIGN0eC5pbnZvY2F0aW9uc1F1ZXVlLnNldChjb3JyZWxhdGlvbklkLCB3YWl0SXRlbSk7XG5cbiAgICBjdHguZXZlbnRzQ29uc3VtZXIuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGV2ZW50cyBhbmQgd2UncmUgd2FpdGluZyBmb3Igd2FpdF9jb21wbGV0ZWQsXG4gICAgICAvLyBzdXNwZW5kIHRoZSB3b3JrZmxvdyB1bnRpbCB0aGUgd2FpdCBmaXJlc1xuICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICBzY2hlZHVsZVdvcmtmbG93U3VzcGVuc2lvbihjdHgpO1xuICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LmNvcnJlbGF0aW9uSWQgIT09IGNvcnJlbGF0aW9uSWQpIHtcbiAgICAgICAgLy8gV2UncmUgbm90IGludGVyZXN0ZWQgaW4gdGhpcyBldmVudCAtIHRoZSBjb3JyZWxhdGlvbklkIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgZW50aXR5XG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBmb3Igd2FpdF9jcmVhdGVkIGV2ZW50IHRvIG1hcmsgdGhpcyB3YWl0IGFzIGhhdmluZyB0aGUgZXZlbnQgY3JlYXRlZFxuICAgICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCcpIHtcbiAgICAgICAgLy8gTWFyayB0aGlzIHdhaXQgYXMgaGF2aW5nIHRoZSBjcmVhdGVkIGV2ZW50LCBidXQga2VlcCBpdCBpbiB0aGUgcXVldWVcbiAgICAgICAgLy8gTygxKSBsb29rdXAgdXNpbmcgTWFwXG4gICAgICAgIGNvbnN0IHF1ZXVlSXRlbSA9IGN0eC5pbnZvY2F0aW9uc1F1ZXVlLmdldChjb3JyZWxhdGlvbklkKTtcbiAgICAgICAgaWYgKHF1ZXVlSXRlbSAmJiBxdWV1ZUl0ZW0udHlwZSA9PT0gJ3dhaXQnKSB7XG4gICAgICAgICAgcXVldWVJdGVtLmhhc0NyZWF0ZWRFdmVudCA9IHRydWU7XG4gICAgICAgICAgcXVldWVJdGVtLnJlc3VtZUF0ID0gZXZlbnQuZXZlbnREYXRhLnJlc3VtZUF0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBmb3Igd2FpdF9jb21wbGV0ZWQgZXZlbnRcbiAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCcpIHtcbiAgICAgICAgY29uc3QgZXZlbnRSZXN1bWVBdCA9IGV2ZW50LmV2ZW50RGF0YT8ucmVzdW1lQXQ7XG4gICAgICAgIGlmIChldmVudFJlc3VtZUF0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBxdWV1ZUl0ZW0gPSBjdHguaW52b2NhdGlvbnNRdWV1ZS5nZXQoY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgY29uc3QgZXhwZWN0ZWRSZXN1bWVBdCA9XG4gICAgICAgICAgICBxdWV1ZUl0ZW0gJiYgcXVldWVJdGVtLnR5cGUgPT09ICd3YWl0J1xuICAgICAgICAgICAgICA/IHF1ZXVlSXRlbS5yZXN1bWVBdFxuICAgICAgICAgICAgICA6IHJlc3VtZUF0O1xuICAgICAgICAgIGNvbnN0IGV2ZW50UmVzdW1lQXREYXRlID0gbmV3IERhdGUoZXZlbnRSZXN1bWVBdCk7XG4gICAgICAgICAgY29uc3QgZXZlbnRSZXN1bWVBdE1zID0gZXZlbnRSZXN1bWVBdERhdGUuZ2V0VGltZSgpO1xuICAgICAgICAgIGNvbnN0IGV4cGVjdGVkUmVzdW1lQXRNcyA9IGV4cGVjdGVkUmVzdW1lQXQuZ2V0VGltZSgpO1xuICAgICAgICAgIGNvbnN0IGV2ZW50UmVzdW1lQXRGb3JNZXNzYWdlID0gTnVtYmVyLmlzRmluaXRlKGV2ZW50UmVzdW1lQXRNcylcbiAgICAgICAgICAgID8gZXZlbnRSZXN1bWVBdERhdGUudG9JU09TdHJpbmcoKVxuICAgICAgICAgICAgOiBTdHJpbmcoZXZlbnRSZXN1bWVBdCk7XG5cbiAgICAgICAgICBpZiAoZXZlbnRSZXN1bWVBdE1zICE9PSBleHBlY3RlZFJlc3VtZUF0TXMpIHtcbiAgICAgICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICBjdHgub25Xb3JrZmxvd0Vycm9yKFxuICAgICAgICAgICAgICAgIG5ldyBSZXBsYXlEaXZlcmdlbmNlRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgUmVwbGF5IGRpdmVyZ2VuY2U6IHdhaXRfY29tcGxldGVkIGV2ZW50IGZvciAke2NvcnJlbGF0aW9uSWR9IGhhcyByZXN1bWVBdCBcIiR7ZXZlbnRSZXN1bWVBdEZvck1lc3NhZ2V9XCIsIGJ1dCB0aGUgY3VycmVudCB3YWl0IGNvbnN1bWVyIGV4cGVjdHMgXCIke2V4cGVjdGVkUmVzdW1lQXQudG9JU09TdHJpbmcoKX1cImAsXG4gICAgICAgICAgICAgICAgICB7IGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoaXMgd2FpdCBmcm9tIHRoZSBpbnZvY2F0aW9ucyBxdWV1ZSAoTygxKSBkZWxldGUgdXNpbmcgTWFwKVxuICAgICAgICBjdHguaW52b2NhdGlvbnNRdWV1ZS5kZWxldGUoY29ycmVsYXRpb25JZCk7XG5cbiAgICAgICAgLy8gVGhpcyBgd2FpdF9jb21wbGV0ZWRgIGlzIGEgYnJhbmNoLWRlY2lkaW5nIHJlc29sdXRpb24gdGhlIHdvcmtmbG93XG4gICAgICAgIC8vIG1heSBgUHJvbWlzZS5yYWNlYCBhZ2FpbnN0IGEgaG9vayBwYXlsb2FkLCBvciBhd2FpdCBvbiBhIGJyYW5jaFxuICAgICAgICAvLyBwYXJhbGxlbCB0byBvbmUgYXdhaXRpbmcgYSBzdGVwLiBPcmRlciBpdCBkZXRlcm1pbmlzdGljYWxseSBieVxuICAgICAgICAvLyBldmVudC1sb2cgcG9zaXRpb24gKHNlZSBgcGVuZGluZ0RlbGl2ZXJ5QmFycmllcnNgKTpcbiAgICAgICAgLy8gIC0gUmVnaXN0ZXIgYSAnd2FpdCcgYmFycmllciBhdCB0aGlzIGV2ZW50J3MgaW5kZXggc28gYSBMQVRFUi1pbi1sb2dcbiAgICAgICAgLy8gICAgaG9vayBwYXlsb2FkIG9yIHN0ZXAgcmVzdWx0IGlzIGRlbGl2ZXJlZCBvbmx5IGFmdGVyIHRoaXMgd2FpdC5cbiAgICAgICAgLy8gIC0gQmVmb3JlIHJlc29sdmluZywgZGVmZXIgYmVoaW5kIGV2ZXJ5IEVBUkxJRVItaW4tbG9nIEhPT0sgYW5kIFNURVBcbiAgICAgICAgLy8gICAgZGVsaXZlcnkgc28gdGhpcyB3YWl0IGRvZXMgbm90IHByZWVtcHQgb25lIHRoZSBjb21taXR0ZWQgbG9nXG4gICAgICAgIC8vICAgIG9yZGVyZWQgZmlyc3QuIFRoZW4gbWFyayB0aGlzIHdhaXQgZGVsaXZlcmVkIHRvIHJlbGVhc2UgdGhlIGxhdGVyXG4gICAgICAgIC8vICAgIGRlbGl2ZXJpZXMgZ2F0ZWQgb24gaXQuXG4gICAgICAgIGNvbnN0IGV2ZW50SW5kZXggPSBjdHguZXZlbnRzQ29uc3VtZXIuZXZlbnRJbmRleDtcbiAgICAgICAgY29uc3QgYmFycmllciA9IHJlZ2lzdGVyRGVsaXZlcnlCYXJyaWVyKGN0eCwgZXZlbnRJbmRleCwgJ3dhaXQnKTtcbiAgICAgICAgLy8gVGhlIGRlZmVycmFsIGlzIGNhcHR1cmVkIEhFUkUsIHdoaWxlIGNvbnN1bWluZyB0aGUgZXZlbnQsIGFuZCBub3RcbiAgICAgICAgLy8gYWZ0ZXIgdGhlIHF1ZXVlIHRhaWwgYmVsb3c6IHNhbWUgcmVhc29uaW5nIGFzIHN0ZXAudHMuIEFuIGVhcmxpZXJcbiAgICAgICAgLy8gc3RlcCBvciBob29rIHdob3NlIGh5ZHJhdGlvbiBzbG90IHNpdHMgaW4gdGhhdCB0YWlsIGhhcyB1c3VhbGx5XG4gICAgICAgIC8vIGRlbGl2ZXJlZCwgYW5kIHNvIGRlcmVnaXN0ZXJlZCBpdHMgYmFycmllciwgYnkgdGhlIHRpbWUgdGhlIHRhaWxcbiAgICAgICAgLy8gcmVzb2x2ZXMuIFJlYWQgdGhlbiwgaXQgd291bGQgYmUgaW52aXNpYmxlIGFuZCB0aGlzIHdhaXQgd291bGQgc2tpcFxuICAgICAgICAvLyBib3RoIHRoZSBnYXRlIEFORCBgYXdhaXRFYXJsaWVyRGVsaXZlcmllc2AnIG1hY3JvdGFzayB5aWVsZCwgbGV0dGluZ1xuICAgICAgICAvLyBpdCBvdmVydGFrZSB0aGUgYnJhbmNoIHRoYXQgZWFybGllciBkZWxpdmVyeSBqdXN0IHdva2UuIEV2ZXJ5IGV2ZW50XG4gICAgICAgIC8vIGluIG9uZSBkcmFpbiB3aW5kb3cgaXMgY29uc3VtZWQgYmVmb3JlIGFueSBzbG90IHJ1bnMsIHNvIGNhcHR1cmluZ1xuICAgICAgICAvLyBhdCBjb25zdW1wdGlvbiB0aW1lIHNlZXMgYWxsIG9mIHRoZW0uXG4gICAgICAgIGNvbnN0IGVhcmxpZXJEZWxpdmVyZWQgPSBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzKFxuICAgICAgICAgIGN0eCxcbiAgICAgICAgICBldmVudEluZGV4LFxuICAgICAgICAgICd3YWl0J1xuICAgICAgICApO1xuICAgICAgICAvLyBEZWZlciArIHJlc29sdmUgaW4gYSBERVRBQ0hFRCBwcm9taXNlIChub3QgY2hhaW5lZCBvbnRvIHRoZSBzZXJpYWxcbiAgICAgICAgLy8gYHByb21pc2VRdWV1ZWApLiBgYXdhaXRFYXJsaWVyRGVsaXZlcmllc2AgbWF5IHdhaXQgb24gYW4gZWFybGllclxuICAgICAgICAvLyBob29rIG9yIHN0ZXAgZGVsaXZlcnkgd2hvc2Ugb3duIHJlc29sdXRpb24gaXMgaXRzZWxmIGRyaXZlbiBieSB0aGVcbiAgICAgICAgLy8gcHJvbWlzZVF1ZXVlOyBibG9ja2luZyBhIHF1ZXVlIHNsb3Qgb24gaXQgd291bGQgZGVhZGxvY2sgdGhlIHNlcmlhbFxuICAgICAgICAvLyBxdWV1ZS4gV2Ugc3RpbGwgYW5jaG9yIHRvIHRoZSBxdWV1ZSB0YWlsIGZpcnN0IHNvIHByaW9yIHF1ZXVlZFxuICAgICAgICAvLyBoeWRyYXRpb24vb3JkZXJpbmcgd29yayBydW5zIGluIGV2ZW50LWxvZyBvcmRlci5cbiAgICAgICAgY29uc3QgcXVldWVBdENvbXBsZXRpb24gPSBjdHgucHJvbWlzZVF1ZXVlO1xuICAgICAgICB2b2lkIHF1ZXVlQXRDb21wbGV0aW9uXG4gICAgICAgICAgLnRoZW4oKCkgPT4gZWFybGllckRlbGl2ZXJlZClcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBiYXJyaWVyLm1hcmtEZWxpdmVyZWQoKTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoaXMgcmVwbGF5IGluc3RhbGxlZCBhIGRpZmZlcmVudCBjb25zdW1lciB0aGFuIHRoZSBzdG9yZWQgZXZlbnQgbmVlZHMuXG4gICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICBuZXcgUmVwbGF5RGl2ZXJnZW5jZUVycm9yKFxuICAgICAgICAgICAgYFJlcGxheSBkaXZlcmdlbmNlOiBVbmV4cGVjdGVkIGV2ZW50IHR5cGUgZm9yIHdhaXQgJHtjb3JyZWxhdGlvbklkfSBcIiR7ZXZlbnQuZXZlbnRUeXBlfVwiYCxcbiAgICAgICAgICAgIHsgZXZlbnRJZDogZXZlbnQuZXZlbnRJZCB9XG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZDtcbiAgICB9KTtcblxuICAgIHJldHVybiBwcm9taXNlO1xuICB9O1xufVxuIl19