@workflow/core 5.0.0-beta.6 → 5.0.0-beta.7

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 (52) hide show
  1. package/dist/classify-error.d.ts +4 -3
  2. package/dist/classify-error.d.ts.map +1 -1
  3. package/dist/classify-error.js +29 -5
  4. package/dist/describe-error.d.ts.map +1 -1
  5. package/dist/describe-error.js +52 -6
  6. package/dist/encryption.d.ts +7 -1
  7. package/dist/encryption.d.ts.map +1 -1
  8. package/dist/encryption.js +13 -6
  9. package/dist/runtime/constants.d.ts +47 -0
  10. package/dist/runtime/constants.d.ts.map +1 -1
  11. package/dist/runtime/constants.js +86 -8
  12. package/dist/runtime/helpers.d.ts.map +1 -1
  13. package/dist/runtime/helpers.js +10 -2
  14. package/dist/runtime/replay-budget.d.ts +98 -0
  15. package/dist/runtime/replay-budget.d.ts.map +1 -0
  16. package/dist/runtime/replay-budget.js +191 -0
  17. package/dist/runtime/resume-hook.d.ts.map +1 -1
  18. package/dist/runtime/resume-hook.js +2 -1
  19. package/dist/runtime/runs.d.ts.map +1 -1
  20. package/dist/runtime/runs.js +4 -1
  21. package/dist/runtime/step-executor.d.ts.map +1 -1
  22. package/dist/runtime/step-executor.js +8 -1
  23. package/dist/runtime/step-handler.d.ts.map +1 -1
  24. package/dist/runtime/step-handler.js +10 -1
  25. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  26. package/dist/runtime/suspension-handler.js +6 -2
  27. package/dist/runtime.d.ts.map +1 -1
  28. package/dist/runtime.js +288 -174
  29. package/dist/serialization/types.d.ts +7 -0
  30. package/dist/serialization/types.d.ts.map +1 -1
  31. package/dist/serialization/types.js +1 -1
  32. package/dist/serialization.d.ts +1 -0
  33. package/dist/serialization.d.ts.map +1 -1
  34. package/dist/serialization.js +100 -11
  35. package/dist/step/writable-stream.d.ts.map +1 -1
  36. package/dist/step/writable-stream.js +17 -1
  37. package/dist/step.d.ts.map +1 -1
  38. package/dist/step.js +15 -4
  39. package/dist/symbols.d.ts +16 -0
  40. package/dist/symbols.d.ts.map +1 -1
  41. package/dist/symbols.js +17 -1
  42. package/dist/version.d.ts +1 -1
  43. package/dist/version.js +2 -2
  44. package/dist/workflow/abort-controller.d.ts.map +1 -1
  45. package/dist/workflow/abort-controller.js +13 -2
  46. package/dist/workflow/hook.d.ts.map +1 -1
  47. package/dist/workflow/hook.js +12 -3
  48. package/dist/workflow/sleep.d.ts.map +1 -1
  49. package/dist/workflow/sleep.js +22 -3
  50. package/dist/workflow.d.ts.map +1 -1
  51. package/dist/workflow.js +3 -3
  52. package/package.json +5 -5
@@ -51,6 +51,7 @@ const stepHandler = (worldHandlers) => worldHandlers.createQueueHandler('__wkf_s
51
51
  specVersion: SPEC_VERSION_CURRENT,
52
52
  correlationId: stepId,
53
53
  eventData: {
54
+ stepName: stepNameFromQueue,
54
55
  error: await dehydrateStepError(err, workflowRunId, await getEncryptionKey()),
55
56
  },
56
57
  }, { requestId });
@@ -132,6 +133,7 @@ const stepHandler = (worldHandlers) => worldHandlers.createQueueHandler('__wkf_s
132
133
  eventType: 'step_started',
133
134
  specVersion: SPEC_VERSION_CURRENT,
134
135
  correlationId: stepId,
136
+ eventData: { stepName },
135
137
  }, { requestId });
136
138
  if (!startResult.step) {
137
139
  throw new WorkflowRuntimeError(`step_started event for "${stepId}" did not return step entity`);
@@ -222,6 +224,7 @@ const stepHandler = (worldHandlers) => worldHandlers.createQueueHandler('__wkf_s
222
224
  specVersion: SPEC_VERSION_CURRENT,
223
225
  correlationId: stepId,
224
226
  eventData: {
227
+ stepName,
225
228
  error: await dehydrateStepError(err, workflowRunId, await getEncryptionKey()),
226
229
  },
227
230
  }, { requestId });
@@ -295,6 +298,7 @@ const stepHandler = (worldHandlers) => worldHandlers.createQueueHandler('__wkf_s
295
298
  specVersion: SPEC_VERSION_CURRENT,
296
299
  correlationId: stepId,
297
300
  eventData: {
301
+ stepName,
298
302
  error: await dehydrateStepError(wrappedError, workflowRunId, await getEncryptionKey()),
299
303
  },
300
304
  }, { requestId });
@@ -342,6 +346,7 @@ const stepHandler = (worldHandlers) => worldHandlers.createQueueHandler('__wkf_s
342
346
  specVersion: SPEC_VERSION_CURRENT,
343
347
  correlationId: stepId,
344
348
  eventData: {
349
+ stepName,
345
350
  error: await dehydrateStepError(new FatalError(errorMessage), workflowRunId, await getEncryptionKey()),
346
351
  },
347
352
  }, { requestId });
@@ -533,6 +538,7 @@ const stepHandler = (worldHandlers) => worldHandlers.createQueueHandler('__wkf_s
533
538
  specVersion: SPEC_VERSION_CURRENT,
534
539
  correlationId: stepId,
535
540
  eventData: {
541
+ stepName,
536
542
  error: await dehydrateStepError(err, workflowRunId, encryptionKey),
537
543
  },
538
544
  }, { requestId });
@@ -601,6 +607,7 @@ const stepHandler = (worldHandlers) => worldHandlers.createQueueHandler('__wkf_s
601
607
  specVersion: SPEC_VERSION_CURRENT,
602
608
  correlationId: stepId,
603
609
  eventData: {
610
+ stepName,
604
611
  error: await dehydrateStepError(wrappedError, workflowRunId, encryptionKey),
605
612
  },
606
613
  }, { requestId });
@@ -657,6 +664,7 @@ const stepHandler = (worldHandlers) => worldHandlers.createQueueHandler('__wkf_s
657
664
  specVersion: SPEC_VERSION_CURRENT,
658
665
  correlationId: stepId,
659
666
  eventData: {
667
+ stepName,
660
668
  error: await dehydrateStepError(err, workflowRunId, encryptionKey),
661
669
  ...(RetryableError.is(err) && {
662
670
  retryAfter: err.retryAfter,
@@ -727,6 +735,7 @@ const stepHandler = (worldHandlers) => worldHandlers.createQueueHandler('__wkf_s
727
735
  specVersion: SPEC_VERSION_CURRENT,
728
736
  correlationId: stepId,
729
737
  eventData: {
738
+ stepName,
730
739
  result: result,
731
740
  },
732
741
  }, { requestId })
@@ -773,4 +782,4 @@ export const stepEntrypoint =
773
782
  }
774
783
  return cachedStepHandler(req);
775
784
  });
776
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvc3RlcC1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLFVBQVUsRUFDVixjQUFjLEVBQ2QsZUFBZSxFQUNmLHNCQUFzQixFQUN0QixhQUFhLEVBQ2IsYUFBYSxFQUNiLG9CQUFvQixFQUNwQixrQkFBa0IsR0FDbkIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRCxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQix3QkFBd0IsRUFDeEIsb0JBQW9CLEVBQ3BCLGdCQUFnQixHQUNqQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEtBQUssU0FBUyxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xFLE9BQU8sRUFDTCxXQUFXLEVBQ1gsb0JBQW9CLEVBQ3BCLHFCQUFxQixFQUNyQixLQUFLLEVBQ0wsZ0JBQWdCLEdBQ2pCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUNMLFlBQVksRUFDWixhQUFhLEVBQ2IscUJB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InNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHdhaXRVbnRpbCB9IGZyb20gJ0B2ZXJjZWwvZnVuY3Rpb25zJztcbmltcG9ydCB7XG4gIEVudGl0eUNvbmZsaWN0RXJyb3IsXG4gIEZhdGFsRXJyb3IsXG4gIFJldHJ5YWJsZUVycm9yLFxuICBSdW5FeHBpcmVkRXJyb3IsXG4gIFN0ZXBOb3RSZWdpc3RlcmVkRXJyb3IsXG4gIFRocm90dGxlRXJyb3IsXG4gIFRvb0Vhcmx5RXJyb3IsXG4gIFdvcmtmbG93UnVudGltZUVycm9yLFxuICBXb3JrZmxvd1dvcmxkRXJyb3IsXG59IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgZm9ybWF0U3RlcE5hbWUsIHBsdXJhbGl6ZSB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgeyBnZXRQb3J0IH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzL2dldC1wb3J0JztcbmltcG9ydCB7IFNQRUNfVkVSU0lPTl9DVVJSRU5ULCBTdGVwSW52b2tlUGF5bG9hZFNjaGVtYSB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBkZXNjcmliZUVycm9yIH0gZnJvbSAnLi4vZGVzY3JpYmUtZXJyb3IuanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciwgc3RlcExvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBnZXRTdGVwRnVuY3Rpb24gfSBmcm9tICcuLi9wcml2YXRlLmpzJztcbmltcG9ydCB7XG4gIGNhbmNlbEFib3J0UmVhZGVycyxcbiAgZGVoeWRyYXRlU3RlcEVycm9yLFxuICBkZWh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUsXG4gIGh5ZHJhdGVTdGVwQXJndW1lbnRzLFxuICBoeWRyYXRlU3RlcEVycm9yLFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IGNvbnRleHRTdG9yYWdlIH0gZnJvbSAnLi4vc3RlcC9jb250ZXh0LXN0b3JhZ2UuanMnO1xuaW1wb3J0ICogYXMgQXR0cmlidXRlIGZyb20gJy4uL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQge1xuICBnZXRTcGFuS2luZCxcbiAgbGlua1RvQ3VycmVudENvbnRleHQsXG4gIHNlcmlhbGl6ZVRyYWNlQ2FycmllcixcbiAgdHJhY2UsXG4gIHdpdGhUcmFjZUNvbnRleHQsXG59IGZyb20gJy4uL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQge1xuICBnZXRFcnJvck5hbWUsXG4gIGdldEVycm9yU3RhY2ssXG4gIG5vcm1hbGl6ZVVua25vd25FcnJvcixcbn0gZnJvbSAnLi4vdHlwZXMuanMnO1xuaW1wb3J0IHsgTUFYX1FVRVVFX0RFTElWRVJJRVMgfSBmcm9tICcuL2NvbnN0YW50cy5qcyc7XG5pbXBvcnQge1xuICBnZXRRdWV1ZU92ZXJoZWFkLFxuICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSxcbiAgaGFuZGxlSGVhbHRoQ2hlY2tNZXNzYWdlLFxuICBtZW1vaXplRW5jcnlwdGlvbktleSxcbiAgcGFyc2VIZWFsdGhDaGVja1BheWxvYWQsXG4gIHF1ZXVlTWVzc2FnZSxcbiAgd2l0aEhlYWx0aENoZWNrLFxufSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHsgZ2V0V29ybGQsIGdldFdvcmxkSGFuZGxlcnMsIHR5cGUgV29ybGRIYW5kbGVycyB9IGZyb20gJy4vd29ybGQuanMnO1xuXG5jb25zdCBERUZBVUxUX1NURVBfTUFYX1JFVFJJRVMgPSAzO1xuXG5jb25zdCBzdGVwSGFuZGxlciA9ICh3b3JsZEhhbmRsZXJzOiBXb3JsZEhhbmRsZXJzKSA9PlxuICB3b3JsZEhhbmRsZXJzLmNyZWF0ZVF1ZXVlSGFuZGxlcihcbiAgICAnX193a2Zfc3RlcF8nLFxuICAgIGFzeW5jIChtZXNzYWdlXywgbWV0YWRhdGEpID0+IHtcbiAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYSBoZWFsdGggY2hlY2sgbWVzc2FnZVxuICAgICAgLy8gTk9URTogSGVhbHRoIGNoZWNrIG1lc3NhZ2VzIGFyZSBpbnRlbnRpb25hbGx5IHVuYXV0aGVudGljYXRlZCBmb3IgbW9uaXRvcmluZyBwdXJwb3Nlcy5cbiAgICAgIC8vIFRoZXkgb25seSB3cml0ZSBhIHNpbXBsZSBzdGF0dXMgcmVzcG9uc2UgdG8gYSBzdHJlYW0gYW5kIGRvIG5vdCBleHBvc2Ugc2Vuc2l0aXZlIGRhdGEuXG4gICAgICAvLyBUaGUgc3RyZWFtIG5hbWUgaW5jbHVkZXMgYSB1bmlxdWUgY29ycmVsYXRpb25JZCB0aGF0IG11c3QgYmUga25vd24gYnkgdGhlIGNhbGxlci5cbiAgICAgIGNvbnN0IGhlYWx0aENoZWNrID0gcGFyc2VIZWFsdGhDaGVja1BheWxvYWQobWVzc2FnZV8pO1xuICAgICAgaWYgKGhlYWx0aENoZWNrKSB7XG4gICAgICAgIGF3YWl0IGhhbmRsZUhlYWx0aENoZWNrTWVzc2FnZShcbiAgICAgICAgICBoZWFsdGhDaGVjayxcbiAgICAgICAgICAnc3RlcCcsXG4gICAgICAgICAgd29ybGRIYW5kbGVycy5zcGVjVmVyc2lvblxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdCxcbiAgICAgICAgc3RlcElkLFxuICAgICAgICB0cmFjZUNhcnJpZXI6IHRyYWNlQ29udGV4dCxcbiAgICAgICAgcmVxdWVzdGVkQXQsXG4gICAgICB9ID0gU3RlcEludm9rZVBheWxvYWRTY2hlbWEucGFyc2UobWVzc2FnZV8pO1xuICAgICAgY29uc3QgeyByZXF1ZXN0SWQgfSA9IG1ldGFkYXRhO1xuXG4gICAgICAvLyAtLS0gTWF4IGRlbGl2ZXJ5IGNoZWNrIC0tLVxuICAgICAgLy8gRW5mb3JjZSBtYXggZGVsaXZlcnkgbGltaXQgYmVmb3JlIGFueSBpbmZyYXN0cnVjdHVyZSBjYWxscy5cbiAgICAgIC8vIFRoaXMgcHJldmVudHMgcnVuYXdheSBzdGVwcyBmcm9tIGNvbnN1bWluZyBpbmZpbml0ZSBxdWV1ZSBkZWxpdmVyaWVzLlxuICAgICAgLy8gQXQgdGhpcyBwb2ludCwgd2Ugd2FudCB0byBkbyB0aGUgbWluaW1hbCBhbW91bnQgb2Ygd29yayAobm8gZmV0Y2hpbmdcbiAgICAgIC8vIG9mIHRoZSBzdGVwIGRldGFpbHMsIGV0Yy4gV2Ugc2ltcGx5IGF0dGVtcHQgdG8gbWFyayB0aGUgc3RlcCBhcyBmYWlsZWRcbiAgICAgIC8vIGFuZCBlbnF1ZXVlIHRoZSB3b3JrZmxvdyBvbmNlLCBhbmQgaWYgZWl0aGVyIG9mIHRob3NlIGZhaWxzLCB0aGUgbWVzc2FnZVxuICAgICAgLy8gaXMgc3RpbGwgY29uc3VtZWQgYnV0IHdpdGggYWRlcXVhdGUgbG9nZ2luZyB0aGF0IGFuIGVycm9yIG9jY3VycmVkLlxuICAgICAgLy8gU2NvcGVkIGxvZ2dlciBmb3IgdGhpcyBzdGVwIGludm9jYXRpb24g4oCUIGF0dGFjaGVzIHJ1bi9zdGVwIGNvbnRleHQgdG9cbiAgICAgIC8vIGV2ZXJ5IGxvZyBsaW5lIGJlbG93IHNvIGNhbGxlcnMgZG9uJ3QgcmVwZWF0IGl0LlxuICAgICAgY29uc3Qgc3RlcE5hbWVGcm9tUXVldWUgPSBtZXRhZGF0YS5xdWV1ZU5hbWUuc2xpY2UoJ19fd2tmX3N0ZXBfJy5sZW5ndGgpO1xuICAgICAgY29uc3Qgc3RlcFJ1bnRpbWVMb2dnZXIgPSBydW50aW1lTG9nZ2VyLmZvclJ1bihcbiAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICB7IHN0ZXBJZCwgc3RlcE5hbWU6IHN0ZXBOYW1lRnJvbVF1ZXVlIH1cbiAgICAgICk7XG5cbiAgICAgIGlmIChtZXRhZGF0YS5hdHRlbXB0ID4gTUFYX1FVRVVFX0RFTElWRVJJRVMpIHtcbiAgICAgICAgc3RlcFJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgYFN0ZXAgaGFuZGxlciBleGNlZWRlZCBtYXggZGVsaXZlcmllcyAoJHttZXRhZGF0YS5hdHRlbXB0fS8ke01BWF9RVUVVRV9ERUxJVkVSSUVTfSlgLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGQoKTtcbiAgICAgICAgICBjb25zdCBnZXRFbmNyeXB0aW9uS2V5ID0gbWVtb2l6ZUVuY3J5cHRpb25LZXkod29ybGQsIHdvcmtmbG93UnVuSWQpO1xuICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBGYXRhbEVycm9yKFxuICAgICAgICAgICAgYFN0ZXAgZXhjZWVkZWQgbWF4aW11bSBxdWV1ZSBkZWxpdmVyaWVzICgke21ldGFkYXRhLmF0dGVtcHR9LyR7TUFYX1FVRVVFX0RFTElWRVJJRVN9KWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICk7XG4gICAgICAgICAgLy8gUmUtcXVldWUgdGhlIHdvcmtmbG93IHRvIGhhbmRsZSB0aGUgZmFpbGVkIHN0ZXBcbiAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2Uod29ybGQsIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSksIHtcbiAgICAgICAgICAgIHJ1bklkOiB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBzZXJpYWxpemVUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpIHx8IFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIENhbid0IGV2ZW4gbWFyayB0aGUgc3RlcCBhcyBmYWlsZWQuIENvbnN1bWUgdGhlIG1lc3NhZ2UgdG8gc3RvcFxuICAgICAgICAgIC8vIGZ1cnRoZXIgcmV0cmllcy4gVGhlIHJ1biB3aWxsIHJlbWFpbiBpbiBpdHMgY3VycmVudCBzdGF0ZS5cbiAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gbWFyayBzdGVwIGFzIGZhaWxlZCBhZnRlciAke21ldGFkYXRhLmF0dGVtcHR9IGRlbGl2ZXJ5IGF0dGVtcHRzLiBgICtcbiAgICAgICAgICAgICAgYEEgcGVyc2lzdGVudCBlcnJvciBpcyBwcmV2ZW50aW5nIHRoZSBzdGVwIGZyb20gYmVpbmcgdGVybWluYXRlZC4gYCArXG4gICAgICAgICAgICAgIGBUaGUgcnVuIHdpbGwgcmVtYWluIGluIGl0cyBjdXJyZW50IHN0YXRlIHVudGlsIG1hbnVhbGx5IHJlc29sdmVkLiBgICtcbiAgICAgICAgICAgICAgYFRoaXMgaXMgbW9zdCBsaWtlbHkgZHVlIHRvIGEgcGVyc2lzdGVudCBvdXRhZ2Ugb2YgdGhlIHdvcmtmbG93IGJhY2tlbmQgYCArXG4gICAgICAgICAgICAgIGBvciBhIGJ1ZyBpbiB0aGUgd29ya2Zsb3cgcnVudGltZSBhbmQgc2hvdWxkIGJlIHJlcG9ydGVkIHRvIHRoZSBXb3JrZmxvdyB0ZWFtLmAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGF0dGVtcHQ6IG1ldGFkYXRhLmF0dGVtcHQsXG4gICAgICAgICAgICAgIGVycm9yTmFtZTogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubmFtZSA6ICdVbmtub3duRXJyb3InLFxuICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICAgICAgZXJyb3JTdGFjazogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIuc3RhY2sgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNwYW5MaW5rcyA9IGF3YWl0IGxpbmtUb0N1cnJlbnRDb250ZXh0KCk7XG4gICAgICAvLyBFeGVjdXRlIHN0ZXAgd2l0aGluIHRoZSBwcm9wYWdhdGVkIHRyYWNlIGNvbnRleHRcbiAgICAgIHJldHVybiBhd2FpdCB3aXRoVHJhY2VDb250ZXh0KHRyYWNlQ29udGV4dCwgYXN5bmMgKCkgPT4ge1xuICAgICAgICAvLyBFeHRyYWN0IHRoZSBzdGVwIG5hbWUgZnJvbSB0aGUgdG9waWMgbmFtZVxuICAgICAgICBjb25zdCBzdGVwTmFtZSA9IG1ldGFkYXRhLnF1ZXVlTmFtZS5zbGljZSgnX193a2Zfc3RlcF8nLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGQoKTtcbiAgICAgICAgY29uc3QgaXNWZXJjZWwgPSBwcm9jZXNzLmVudi5WRVJDRUxfVVJMICE9PSB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gTWVtb2l6ZWQgYWNjZXNzb3IgZm9yIHRoZSBwZXItcnVuIEFFUy0yNTYgZW5jcnlwdGlvbiBrZXkuIFRoZSBmaXJzdFxuICAgICAgICAvLyBjYWxsZXIgKHR5cGljYWxseSBgaHlkcmF0ZVN0ZXBBcmd1bWVudHNgIGZvciBpbnB1dCBkZXNlcmlhbGl6YXRpb24sXG4gICAgICAgIC8vIG9yIG9uZSBvZiB0aGUgZWFybHktcmV0dXJuIGRlaHlkcmF0ZVN0ZXBFcnJvciBwYXRocyBpZiBzdGVwX3N0YXJ0ZWRcbiAgICAgICAgLy8gZmFpbHMpIHRyaWdnZXJzIHRoZSBhY3R1YWwgZmV0Y2ggLyBIS0RGIGRlcml2YXRpb247IHN1YnNlcXVlbnRcbiAgICAgICAgLy8gY2FsbGVycyBhd2FpdCB0aGUgY2FjaGVkIHByb21pc2UuIFN0ZXBzIHRoYXQgZmFpbCBiZWZvcmUgYW55XG4gICAgICAgIC8vIGVuY3J5cHRpb24tYXdhcmUgd29yayBoYXBwZW5zIChlLmcuIGFuIGltbWVkaWF0ZSBzdGVwX3N0YXJ0ZWRcbiAgICAgICAgLy8gY29uZmxpY3QpIHNraXAgdGhlIGZldGNoIGVudGlyZWx5LlxuICAgICAgICBjb25zdCBnZXRFbmNyeXB0aW9uS2V5ID0gbWVtb2l6ZUVuY3J5cHRpb25LZXkod29ybGQsIHdvcmtmbG93UnVuSWQpO1xuXG4gICAgICAgIC8vIFJlc29sdmUgbG9jYWwgYXN5bmMgdmFsdWVzIGNvbmN1cnJlbnRseSBiZWZvcmUgZW50ZXJpbmcgdGhlIHRyYWNlIHNwYW5cbiAgICAgICAgY29uc3QgW3BvcnQsIHNwYW5LaW5kXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICBpc1ZlcmNlbCA/IHVuZGVmaW5lZCA6IGdldFBvcnQoKSxcbiAgICAgICAgICBnZXRTcGFuS2luZCgnQ09OU1VNRVInKSxcbiAgICAgICAgXSk7XG5cbiAgICAgICAgcmV0dXJuIHRyYWNlKFxuICAgICAgICAgIGBTVEVQICR7c3RlcE5hbWV9YCxcbiAgICAgICAgICB7IGtpbmQ6IHNwYW5LaW5kLCBsaW5rczogc3BhbkxpbmtzIH0sXG4gICAgICAgICAgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcE5hbWUoc3RlcE5hbWUpLFxuICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcEF0dGVtcHQobWV0YWRhdGEuYXR0ZW1wdCksXG4gICAgICAgICAgICAgIC8vIFN0YW5kYXJkIE9URUwgbWVzc2FnaW5nIGNvbnZlbnRpb25zXG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdTeXN0ZW0oJ3ZlcmNlbC1xdWV1ZScpLFxuICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nRGVzdGluYXRpb25OYW1lKG1ldGFkYXRhLnF1ZXVlTmFtZSksXG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdNZXNzYWdlSWQobWV0YWRhdGEubWVzc2FnZUlkKSxcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ09wZXJhdGlvblR5cGUoJ3Byb2Nlc3MnKSxcbiAgICAgICAgICAgICAgLi4uZ2V0UXVldWVPdmVyaGVhZCh7IHJlcXVlc3RlZEF0IH0pLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIE5vdGU6IFN0ZXAgZnVuY3Rpb24gdmFsaWRhdGlvbiBoYXBwZW5zIGFmdGVyIHN0ZXBfc3RhcnRlZCBzbyB3ZSBjYW5cbiAgICAgICAgICAgIC8vIHByb3Blcmx5IGZhaWwgdGhlIHN0ZXAgKG5vdCB0aGUgcnVuKSBpZiB0aGUgZnVuY3Rpb24gaXMgbm90IHJlZ2lzdGVyZWQuXG4gICAgICAgICAgICAvLyBUaGlzIGFsbG93cyB0aGUgd29ya2Zsb3cgdG8gaGFuZGxlIHRoZSBzdGVwIGZhaWx1cmUgZ3JhY2VmdWxseS5cbiAgICAgICAgICAgIGNvbnN0IHN0ZXBGbiA9IGdldFN0ZXBGdW5jdGlvbihzdGVwTmFtZSk7XG5cbiAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dOYW1lKHdvcmtmbG93TmFtZSksXG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1bklkKHdvcmtmbG93UnVuSWQpLFxuICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcElkKHN0ZXBJZCksXG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwVHJhY2VQcm9wYWdhdGVkKCEhdHJhY2VDb250ZXh0KSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQgdmFsaWRhdGVzIHN0YXRlIGFuZCByZXR1cm5zIHRoZSBzdGVwIGVudGl0eSwgc28gbm8gc2VwYXJhdGVcbiAgICAgICAgICAgIC8vIHdvcmxkLnN0ZXBzLmdldCgpIGNhbGwgaXMgbmVlZGVkLiBUaGUgc2VydmVyIGNoZWNrczpcbiAgICAgICAgICAgIC8vIC0gU3RlcCBub3QgaW4gdGVybWluYWwgc3RhdGUgKHJldHVybnMgNDA5KVxuICAgICAgICAgICAgLy8gLSByZXRyeUFmdGVyIHRpbWVzdGFtcCByZWFjaGVkIChyZXR1cm5zIDQyNSB3aXRoIFJldHJ5LUFmdGVyIGhlYWRlcilcbiAgICAgICAgICAgIC8vIC0gV29ya2Zsb3cgc3RpbGwgYWN0aXZlIChyZXR1cm5zIDQxMCBpZiBjb21wbGV0ZWQpXG4gICAgICAgICAgICBsZXQgc3RlcDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGNvbnN0IHN0YXJ0UmVzdWx0ID0gYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfc3RhcnRlZCcsXG4gICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgaWYgKCFzdGFydFJlc3VsdC5zdGVwKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgICAgICAgYHN0ZXBfc3RhcnRlZCBldmVudCBmb3IgXCIke3N0ZXBJZH1cIiBkaWQgbm90IHJldHVybiBzdGVwIGVudGl0eWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHN0ZXAgPSBzdGFydFJlc3VsdC5zdGVwO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgIGlmIChUaHJvdHRsZUVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXRyeVJldHJ5QWZ0ZXIgPSBNYXRoLm1heChcbiAgICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAgICAgICB0eXBlb2YgZXJyLnJldHJ5QWZ0ZXIgPT09ICdudW1iZXInID8gZXJyLnJldHJ5QWZ0ZXIgOiAxXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgJ1Rocm90dGxlZCBhZ2FpbiBvbiByZXRyeSwgZGVmZXJyaW5nIHRvIHF1ZXVlJyxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0cnlBZnRlclNlY29uZHM6IHJldHJ5UmV0cnlBZnRlcixcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHRpbWVvdXRTZWNvbmRzOiByZXRyeVJldHJ5QWZ0ZXIgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAvLyBFeHBlY3RlZCB3aGVuIGEgcnVuIGlzIGNhbmNlbGxlZCB3aGlsZSBhIHN0ZXAgaXMgaW4tZmxpZ2h0LlxuICAgICAgICAgICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAnV29ya2Zsb3cgcnVuIGhhcyBhbHJlYWR5IGNvbXBsZXRlZCwgc2tpcHBpbmcgc3RlcCcsXG4gICAgICAgICAgICAgICAgICB7IGVycm9yTmFtZTogZXJyLm5hbWUsIGVycm9yTWVzc2FnZTogZXJyLm1lc3NhZ2UgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAvLyBTdGVwIGFscmVhZHkgaW4gYSB0ZXJtaW5hbCBzdGF0ZSDigJQgYW5vdGhlciB3b3JrZXIgZmluaXNoZWRcbiAgICAgICAgICAgICAgICAvLyBpdCBvciBpdCB3YXMgcmV0cmllZCB0byBjb21wbGV0aW9uLiBSZS1lbnF1ZXVlIHRoZSBwYXJlbnRcbiAgICAgICAgICAgICAgICAvLyB3b3JrZmxvdyBzbyBpdCBjYW4gb2JzZXJ2ZSB0aGUgb3V0Y29tZS5cbiAgICAgICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAgICAgICAgICdTdGVwIGluIHRlcm1pbmFsIHN0YXRlLCByZS1lbnF1ZXVpbmcgd29ya2Zsb3cnLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IGVyci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFNraXBwZWQodHJ1ZSksXG4gICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFNraXBSZWFzb24oJ2NvbXBsZXRlZCcpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHNwYW4/LmFkZEV2ZW50Py4oJ3N0ZXAuc2tpcHBlZCcsIHtcbiAgICAgICAgICAgICAgICAgICdza2lwLnJlYXNvbic6ICd0ZXJtaW5hbF9zdGF0ZScsXG4gICAgICAgICAgICAgICAgICAnc3RlcC5uYW1lJzogc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAnc3RlcC5pZCc6IHN0ZXBJZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2Uod29ybGQsIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSksIHtcbiAgICAgICAgICAgICAgICAgIHJ1bklkOiB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBzZXJpYWxpemVUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIFRvbyBlYXJseTogcmV0cnlBZnRlciB0aW1lc3RhbXAgbm90IHJlYWNoZWQgeWV0XG4gICAgICAgICAgICAgIC8vIFJldHVybiB0aW1lb3V0IHRvIHF1ZXVlIHNvIGl0IHJldHJpZXMgbGF0ZXJcbiAgICAgICAgICAgICAgaWYgKFRvb0Vhcmx5RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVvdXRTZWNvbmRzID0gTWF0aC5tYXgoMSwgZXJyLnJldHJ5QWZ0ZXIgPz8gMSk7XG4gICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJldHJ5VGltZW91dFNlY29uZHModGltZW91dFNlY29uZHMpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIEFkZCBzcGFuIGV2ZW50IGZvciBkZWxheWVkIHJldHJ5XG4gICAgICAgICAgICAgICAgc3Bhbj8uYWRkRXZlbnQ/Lignc3RlcC5kZWxheWVkJywge1xuICAgICAgICAgICAgICAgICAgJ2RlbGF5LnJlYXNvbic6ICdyZXRyeV9hZnRlcl9ub3RfcmVhY2hlZCcsXG4gICAgICAgICAgICAgICAgICAnZGVsYXkudGltZW91dF9zZWNvbmRzJzogdGltZW91dFNlY29uZHMsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc3RlcFJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAnU3RlcCByZXRyeUFmdGVyIHRpbWVzdGFtcCBub3QgeWV0IHJlYWNoZWQnLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICByZXRyeUFmdGVyU2Vjb25kczogZXJyLnJldHJ5QWZ0ZXIsXG4gICAgICAgICAgICAgICAgICAgIHRpbWVvdXRTZWNvbmRzLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgdGltZW91dFNlY29uZHMgfTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBSZS10aHJvdyBvdGhlciBlcnJvcnNcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5kZWJ1ZygnU3RlcCBleGVjdXRpb24gZGV0YWlscycsIHtcbiAgICAgICAgICAgICAgc3RhdHVzOiBzdGVwLnN0YXR1cyxcbiAgICAgICAgICAgICAgYXR0ZW1wdDogc3RlcC5hdHRlbXB0LFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cyhzdGVwLnN0YXR1cyksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gVmFsaWRhdGUgc3RlcCBmdW5jdGlvbiBleGlzdHMgQUZURVIgc3RlcF9zdGFydGVkIHNvIHdlIGNhblxuICAgICAgICAgICAgLy8gcHJvcGVybHkgZmFpbCB0aGUgc3RlcCAobm90IHRoZSBydW4pIGlmIHRoZSBmdW5jdGlvbiBpcyBtaXNzaW5nLlxuICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgdGhlIHdvcmtmbG93IHRvIGhhbmRsZSB0aGUgc3RlcCBmYWlsdXJlIGdyYWNlZnVsbHksXG4gICAgICAgICAgICAvLyBzaW1pbGFyIHRvIGhvdyBGYXRhbEVycm9yIGlzIGhhbmRsZWQuXG4gICAgICAgICAgICBpZiAoIXN0ZXBGbiB8fCB0eXBlb2Ygc3RlcEZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVyciA9IG5ldyBTdGVwTm90UmVnaXN0ZXJlZEVycm9yKHN0ZXBOYW1lKTtcblxuICAgICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAnU3RlcCBmdW5jdGlvbiBub3QgcmVnaXN0ZXJlZCwgZmFpbGluZyBzdGVwIChub3QgcnVuKScsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBlcnIubmFtZSxcbiAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICBlcnJvclN0YWNrOiBlcnIuc3RhY2ssXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIC8vIEZhaWwgdGhlIHN0ZXAgdmlhIGV2ZW50IChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSlcbiAgICAgICAgICAgICAgLy8gVGhpcyBtYXRjaGVzIHRoZSBGYXRhbEVycm9yIHBhdHRlcm4gLSBmYWlsIHRoZSBzdGVwIGFuZCByZS1xdWV1ZSB3b3JrZmxvd1xuICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKVxuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKHN0ZXBGYWlsRXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoc3RlcEZhaWxFcnIpKSB7XG4gICAgICAgICAgICAgICAgICAvLyBTdGVwIGFscmVhZHkgdHJhbnNpdGlvbmVkIHRvIGEgdGVybWluYWwgc3RhdGUg4oCUIGR1cGxpY2F0ZVxuICAgICAgICAgICAgICAgICAgLy8gZGVsaXZlcnkgb3IgY29uY3VycmVudCBjYW5jZWxsYXRpb24uIERyb3Agc2lsZW50bHkuXG4gICAgICAgICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAnVHJpZWQgZmFpbGluZyBzdGVwIGZvciBtaXNzaW5nIGZ1bmN0aW9uLCBidXQgc3RlcCBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBzdGVwRmFpbEVyci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogc3RlcEZhaWxFcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgc3RlcEZhaWxFcnI7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBGYXRhbEVycm9yKHRydWUpLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAvLyBSZS1pbnZva2UgdGhlIHdvcmtmbG93IHRvIGhhbmRsZSB0aGUgZmFpbGVkIHN0ZXBcbiAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKHdvcmxkLCBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUpLCB7XG4gICAgICAgICAgICAgICAgcnVuSWQ6IHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBzZXJpYWxpemVUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbWF4UmV0cmllcyA9IHN0ZXBGbi5tYXhSZXRyaWVzID8/IERFRkFVTFRfU1RFUF9NQVhfUkVUUklFUztcblxuICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwTWF4UmV0cmllcyhtYXhSZXRyaWVzKSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBsZXQgcmVzdWx0OiB1bmtub3duO1xuXG4gICAgICAgICAgICAvLyBDaGVjayBtYXggcmV0cmllcyBBRlRFUiBzdGVwX3N0YXJ0ZWQgKGF0dGVtcHQgd2FzIGp1c3QgaW5jcmVtZW50ZWQpXG4gICAgICAgICAgICAvLyBzdGVwLmF0dGVtcHQgdHJhY2tzIGhvdyBtYW55IHRpbWVzIHN0ZXBfc3RhcnRlZCBoYXMgYmVlbiBjYWxsZWQuXG4gICAgICAgICAgICAvLyBOb3RlOiBtYXhSZXRyaWVzIGlzIHRoZSBudW1iZXIgb2YgUkVUUklFUyBhZnRlciB0aGUgZmlyc3QgYXR0ZW1wdCwgc28gdG90YWwgYXR0ZW1wdHMgPSBtYXhSZXRyaWVzICsgMVxuICAgICAgICAgICAgLy8gVXNlID4gaGVyZSAobm90ID49KSBiZWNhdXNlIHRoaXMgZ3VhcmRzIGFnYWluc3QgcmUtaW52b2NhdGlvbiBBRlRFUiBhbGwgYXR0ZW1wdHMgYXJlIHVzZWQuXG4gICAgICAgICAgICAvLyBUaGUgcG9zdC1mYWlsdXJlIGNoZWNrIHVzZXMgPj0gdG8gZGVjaWRlIHdoZXRoZXIgdG8gcmV0cnkgYWZ0ZXIgYSBmYWlsdXJlLlxuICAgICAgICAgICAgaWYgKHN0ZXAuYXR0ZW1wdCA+IG1heFJldHJpZXMgKyAxKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJldHJ5Q291bnQgPSBzdGVwLmF0dGVtcHQgLSAxO1xuICAgICAgICAgICAgICAvLyBQZXJzaXN0ZWQgbWVzc2FnZSDigJQga2VwdCBzaG9ydCwgbm8gbWFjaGluZSBgc3RlcE5hbWVgLFxuICAgICAgICAgICAgICAvLyBzaW5jZSBvYnNlcnZhYmlsaXR5IGFscmVhZHkgYXR0cmlidXRlcyB0aGUgZXZlbnQgdG8gYVxuICAgICAgICAgICAgICAvLyBzcGVjaWZpYyBzdGVwLlxuICAgICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgU3RlcCBleGNlZWRlZCBtYXggcmV0cmllcyAoJHtyZXRyeUNvdW50fSAke3BsdXJhbGl6ZSgncmV0cnknLCAncmV0cmllcycsIHJldHJ5Q291bnQpfSlgO1xuICAgICAgICAgICAgICBzdGVwTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgIGBTdGVwICR7Zm9ybWF0U3RlcE5hbWUoc3RlcE5hbWUpfSBleGNlZWRlZCBtYXggcmV0cmllcyAoJHtyZXRyeUNvdW50fSAke3BsdXJhbGl6ZSgncmV0cnknLCAncmV0cmllcycsIHJldHJ5Q291bnQpfSlgLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgIHJldHJ5Q291bnQsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAvLyBGYWlsIHRoZSBzdGVwIHZpYSBldmVudCAoZXZlbnQtc291cmNlZCBhcmNoaXRlY3R1cmUpLlxuICAgICAgICAgICAgICAvLyBQcmVzZXJ2ZSB0aGUgcHJpb3IgYXR0ZW1wdCdzIHNlcmlhbGl6ZWQgZXJyb3IgYXMgdGhlIGNhdXNlIHNvXG4gICAgICAgICAgICAgIC8vIHRoZSB1bmRlcmx5aW5nIGZhaWx1cmUgaXMgcmVjb3ZlcmFibGUgZnJvbSBgc3RlcC5lcnJvci5jYXVzZWBcbiAgICAgICAgICAgICAgLy8gYWZ0ZXIgaHlkcmF0aW9uLCB3aXRob3V0IGZvcmNpbmcgY29uc3VtZXJzIHRvIHdhbGsgdGhlXG4gICAgICAgICAgICAgIC8vIHN0ZXBfcmV0cnlpbmcgZXZlbnQgaGlzdG9yeS4gTWlycm9ycyB0aGUgcG9zdC1mYWlsdXJlIHBhdGhcbiAgICAgICAgICAgICAgLy8gYmVsb3cgdGhhdCB3cmFwcyB0aGUgbGl2ZSBgZXJyYCBhcyBjYXVzZS5cbiAgICAgICAgICAgICAgY29uc3Qgd3JhcHBlZEVycm9yID0gbmV3IEZhdGFsRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgICAgaWYgKHN0ZXAuZXJyb3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAod3JhcHBlZEVycm9yIGFzIEVycm9yKS5jYXVzZSA9IGF3YWl0IGh5ZHJhdGVTdGVwRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIHN0ZXAuZXJyb3IsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgIC8vIElnbm9yZTogYmVzdC1lZmZvcnQgY2F1c2UgYXR0YWNobWVudCwgdGhlIHdyYXBwaW5nXG4gICAgICAgICAgICAgICAgICAvLyBGYXRhbEVycm9yIHN0YWNrL21lc3NhZ2Ugc3RpbGwgc3VyZmFjZSB0aGUgZmFpbHVyZS5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9mYWlsZWQnLFxuICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWRFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KClcbiAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgICAvLyBTdGVwIGFscmVhZHkgdHJhbnNpdGlvbmVkIHRvIGEgdGVybWluYWwgc3RhdGUg4oCUIGR1cGxpY2F0ZVxuICAgICAgICAgICAgICAgICAgLy8gZGVsaXZlcnkgb3IgY29uY3VycmVudCBjb21wbGV0aW9uLiBEcm9wIHNpbGVudGx5LlxuICAgICAgICAgICAgICAgICAgc3RlcFJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgc3RlcCwgYnV0IHN0ZXAgaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZTogZXJyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTdGF0dXMoJ2ZhaWxlZCcpLFxuICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmV0cnlFeGhhdXN0ZWQodHJ1ZSksXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIC8vIFJlLWludm9rZSB0aGUgd29ya2Zsb3cgdG8gaGFuZGxlIHRoZSBmYWlsZWQgc3RlcFxuICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2Uod29ybGQsIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSksIHtcbiAgICAgICAgICAgICAgICBydW5JZDogd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IHNlcmlhbGl6ZVRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyAtLS0gSW5mcmFzdHJ1Y3R1cmU6IHByZXBhcmUgc3RlcCBpbnB1dCAtLS1cbiAgICAgICAgICAgIC8vIE5ldHdvcmsvc2VydmVyIGVycm9ycyBwcm9wYWdhdGUgdG8gdGhlIHF1ZXVlIGhhbmRsZXIgZm9yIHJldHJ5LlxuICAgICAgICAgICAgLy8gV29ya2Zsb3dSdW50aW1lRXJyb3IgKGRhdGEgaW50ZWdyaXR5IGlzc3VlcykgYXJlIGZhdGFsIOKAlCByZXRyeWluZ1xuICAgICAgICAgICAgLy8gd29uJ3QgZml4IHRoZW0sIHNvIHdlIHJlLXF1ZXVlIHRoZSB3b3JrZmxvdyB0byBzdXJmYWNlIHRoZSBlcnJvci5cbiAgICAgICAgICAgIC8vIHN0ZXBfc3RhcnRlZCBhbHJlYWR5IHZhbGlkYXRlZCB0aGUgc3RlcCBpcyBpbiB2YWxpZCBzdGF0ZSAocGVuZGluZy9ydW5uaW5nKVxuICAgICAgICAgICAgLy8gYW5kIHJldHVybmVkIHRoZSB1cGRhdGVkIHN0ZXAgZW50aXR5IHdpdGggaW5jcmVtZW50ZWQgYXR0ZW1wdFxuXG4gICAgICAgICAgICAvLyBzdGVwLmF0dGVtcHQgaXMgbm93IHRoZSBjdXJyZW50IGF0dGVtcHQgbnVtYmVyIChhZnRlciBpbmNyZW1lbnQpXG4gICAgICAgICAgICBjb25zdCBhdHRlbXB0ID0gc3RlcC5hdHRlbXB0O1xuXG4gICAgICAgICAgICBpZiAoIXN0ZXAuc3RhcnRlZEF0KSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGBTdGVwIFwiJHtzdGVwSWR9XCIgaGFzIG5vIFwic3RhcnRlZEF0XCIgdGltZXN0YW1wYDtcbiAgICAgICAgICAgICAgc3RlcFJ1bnRpbWVMb2dnZXIuZXJyb3IoJ0ZhdGFsIHJ1bnRpbWUgZXJyb3IgZHVyaW5nIHN0ZXAgc2V0dXAnLCB7XG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9mYWlsZWQnLFxuICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGYXRhbEVycm9yKGVycm9yTWVzc2FnZSksXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZmFpbEVycikge1xuICAgICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGZhaWxFcnIpKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGZhaWxFcnI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gUmUtcXVldWUgdGhlIHdvcmtmbG93IHNvIGl0IGNhbiBwcm9jZXNzIHRoZSBzdGVwIGZhaWx1cmVcbiAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKHdvcmxkLCBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUpLCB7XG4gICAgICAgICAgICAgICAgcnVuSWQ6IHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBzZXJpYWxpemVUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIENhcHR1cmUgc3RhcnRlZEF0IGZvciB1c2UgaW4gYXN5bmMgY2FsbGJhY2sgKFR5cGVTY3JpcHQgbmFycm93aW5nIGRvZXNuJ3QgcGVyc2lzdClcbiAgICAgICAgICAgIGNvbnN0IHN0ZXBTdGFydGVkQXQgPSBzdGVwLnN0YXJ0ZWRBdDtcblxuICAgICAgICAgICAgLy8gUmVzb2x2ZSB0aGUgZW5jcnlwdGlvbiBrZXkgbm93IHRoYXQgd2UncmUgY29tbWl0dGVkIHRvIHJ1bm5pbmdcbiAgICAgICAgICAgIC8vIHVzZXIgY29kZTogaW5wdXQgaHlkcmF0aW9uIG5lZWRzIGl0LCBhbmQgYGNvbnRleHRTdG9yYWdlYCAoYW5kXG4gICAgICAgICAgICAvLyBhbnkgdXNlci1jb2RlIHBhdGhzIHRoYXQgcnVuIGluc2lkZSBpdCkgY2FwdHVyZSB0aGUgcmVzb2x2ZWRcbiAgICAgICAgICAgIC8vIHZhbHVlLiBUcmlnZ2VycyB0aGUgdW5kZXJseWluZyB3b3JsZCAvIEtNUyBmZXRjaCBvbmNlLCB3aXRoXG4gICAgICAgICAgICAvLyBzdWJzZXF1ZW50IGRlaHlkcmF0ZSBwYXRocyByZXVzaW5nIHRoZSBtZW1vaXplZCByZXN1bHQuXG4gICAgICAgICAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpO1xuXG4gICAgICAgICAgICAvLyBIeWRyYXRlIHRoZSBzdGVwIGlucHV0IGFyZ3VtZW50cywgY2xvc3VyZSB2YXJpYWJsZXMsIGFuZCB0aGlzVmFsXG4gICAgICAgICAgICAvLyBOT1RFOiBUaGlzIGNhcHR1cmVzIG9ubHkgdGhlIHN5bmNocm9ub3VzIHBvcnRpb24gb2YgaHlkcmF0aW9uLiBBbnkgYXN5bmNcbiAgICAgICAgICAgIC8vIG9wZXJhdGlvbnMgKGUuZy4sIHN0cmVhbSBsb2FkaW5nKSBhcmUgYWRkZWQgdG8gYG9wc2AgYW5kIGV4ZWN1dGVkIGxhdGVyXG4gICAgICAgICAgICAvLyB2aWEgUHJvbWlzZS5hbGwob3BzKSAtIHRoZWlyIHRpbWluZyBpcyBub3QgaW5jbHVkZWQgaW4gdGhpcyBtZWFzdXJlbWVudC5cbiAgICAgICAgICAgIGNvbnN0IG9wczogUHJvbWlzZTx2b2lkPltdID0gW107XG4gICAgICAgICAgICBjb25zdCBoeWRyYXRlZElucHV0ID0gYXdhaXQgdHJhY2UoXG4gICAgICAgICAgICAgICdzdGVwLmh5ZHJhdGUnLFxuICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgYXN5bmMgKGh5ZHJhdGVTcGFuKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgICAgICAgICAgICAgIHN0ZXAuaW5wdXQsXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgIG9wc1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICAgICAgICAgICAgaHlkcmF0ZVNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBBcmd1bWVudHNDb3VudChyZXN1bHQuYXJncy5sZW5ndGgpLFxuICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlF1ZXVlRGVzZXJpYWxpemVUaW1lTXMoZHVyYXRpb25NcyksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QgYXJncyA9IGh5ZHJhdGVkSW5wdXQuYXJncztcbiAgICAgICAgICAgIGNvbnN0IHRoaXNWYWwgPSBoeWRyYXRlZElucHV0LnRoaXNWYWwgPz8gbnVsbDtcblxuICAgICAgICAgICAgLy8gLS0tIFVzZXIgY29kZSBleGVjdXRpb24gLS0tXG4gICAgICAgICAgICAvLyBPbmx5IGVycm9ycyBmcm9tIHN0ZXBGbi5hcHBseSgpICh1c2VyIHN0ZXAgY29kZSkgc2hvdWxkIHByb2R1Y2VcbiAgICAgICAgICAgIC8vIHN0ZXBfZmFpbGVkL3N0ZXBfcmV0cnlpbmcuIEluZnJhc3RydWN0dXJlIGVycm9ycyAobmV0d29yaywgc2VydmVyKVxuICAgICAgICAgICAgLy8gbXVzdCBwcm9wYWdhdGUgdG8gdGhlIHF1ZXVlIGhhbmRsZXIgZm9yIGF1dG9tYXRpYyByZXRyeS5cbiAgICAgICAgICAgIGxldCB1c2VyQ29kZUVycm9yOiB1bmtub3duO1xuICAgICAgICAgICAgbGV0IHVzZXJDb2RlRmFpbGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGNvbnN0IGV4ZWN1dGlvblN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCB0cmFjZSgnc3RlcC5leGVjdXRlJywge30sIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgY29udGV4dFN0b3JhZ2UucnVuKFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBzdGVwTWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgc3RlcFN0YXJ0ZWRBdDogbmV3IERhdGUoK3N0ZXBTdGFydGVkQXQpLFxuICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TWV0YWRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1N0YXJ0ZWRBdDogbmV3IERhdGUoK3dvcmtmbG93U3RhcnRlZEF0KSxcbiAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB0aGVyZSBzaG91bGQgYmUgYSBnZXRVcmwgbWV0aG9kIG9uIHRoZSB3b3JsZCBpbnRlcmZhY2UgaXRzZWxmLiBUaGlzXG4gICAgICAgICAgICAgICAgICAgICAgLy8gc29sdXRpb24gb25seSB3b3JrcyBmb3IgdmVyY2VsICsgbG9jYWwgd29ybGRzLlxuICAgICAgICAgICAgICAgICAgICAgIHVybDogaXNWZXJjZWxcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYGh0dHBzOi8vJHtwcm9jZXNzLmVudi5WRVJDRUxfVVJMfWBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYGh0dHA6Ly9sb2NhbGhvc3Q6JHtwb3J0ID8/IDMwMDB9YCxcbiAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlczogeyBlbmNyeXB0aW9uOiAhIWVuY3J5cHRpb25LZXkgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgb3BzLFxuICAgICAgICAgICAgICAgICAgICBjbG9zdXJlVmFyczogaHlkcmF0ZWRJbnB1dC5jbG9zdXJlVmFycyxcbiAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAoKSA9PiBzdGVwRm4uYXBwbHkodGhpc1ZhbCwgYXJncylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICB1c2VyQ29kZUVycm9yID0gZXJyO1xuICAgICAgICAgICAgICB1c2VyQ29kZUZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBleGVjdXRpb25UaW1lTXMgPSBEYXRlLm5vdygpIC0gZXhlY3V0aW9uU3RhcnRUaW1lO1xuXG4gICAgICAgICAgICBjYW5jZWxBYm9ydFJlYWRlcnMoLi4uYXJncywgdGhpc1ZhbCwgaHlkcmF0ZWRJbnB1dC5jbG9zdXJlVmFycyk7XG5cbiAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuUXVldWVFeGVjdXRpb25UaW1lTXMoZXhlY3V0aW9uVGltZU1zKSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyAtLS0gRGVoeWRyYXRlIChzZXJpYWxpemUpIHRoZSBzdGVwJ3MgcmV0dXJuIHZhbHVlIC0tLVxuICAgICAgICAgICAgLy8gQSBub24tc2VyaWFsaXphYmxlIHJldHVybiB2YWx1ZSBpcyBhIHVzZXItY29kZSBidWcsIG5vdCBhblxuICAgICAgICAgICAgLy8gaW5mcmFzdHJ1Y3R1cmUgZmFpbHVyZS4gUm91dGUgaXQgdGhyb3VnaCB0aGUgc2FtZSBzdGVwLWZhaWx1cmVcbiAgICAgICAgICAgIC8vIHBhdGggYXMgYSB0aHJvd24gZXJyb3Igc28gU2VyaWFsaXphdGlvbkVycm9yICh3aGljaCBpcyBtYXJrZWRcbiAgICAgICAgICAgIC8vIGBmYXRhbDogdHJ1ZWApIHNob3J0LWNpcmN1aXRzIHRoZSByZXRyeSBsb29wIGluc3RlYWQgb2ZcbiAgICAgICAgICAgIC8vIGJ1YmJsaW5nIGFzIGFuIEhUVFAgNTAwIGFuZCBidXJuaW5nIHRocm91Z2ggYWxsIDQgcXVldWVcbiAgICAgICAgICAgIC8vIGRlbGl2ZXJpZXMgb24gYSBndWFyYW50ZWVkLXRvLWZhaWwgbWVzc2FnZS5cbiAgICAgICAgICAgIGlmICghdXNlckNvZGVGYWlsZWQpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBhd2FpdCB0cmFjZShcbiAgICAgICAgICAgICAgICAgICdzdGVwLmRlaHlkcmF0ZScsXG4gICAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICAgIGFzeW5jIChkZWh5ZHJhdGVTcGFuKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlaHlkcmF0ZWQgPSBhd2FpdCBkZWh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgICAgICAgICAgICAgICBvcHNcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZHVyYXRpb25NcyA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICAgICAgICAgICAgICAgIGRlaHlkcmF0ZVNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5RdWV1ZVNlcmlhbGl6ZVRpbWVNcyhkdXJhdGlvbk1zKSxcbiAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJlc3VsdFR5cGUodHlwZW9mIGRlaHlkcmF0ZWQpLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlaHlkcmF0ZWQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgdXNlckNvZGVFcnJvciA9IGVycjtcbiAgICAgICAgICAgICAgICB1c2VyQ29kZUZhaWxlZCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gLS0tIEhhbmRsZSB1c2VyIGNvZGUgZXJyb3JzIC0tLVxuICAgICAgICAgICAgaWYgKHVzZXJDb2RlRmFpbGVkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVyciA9IHVzZXJDb2RlRXJyb3I7XG5cbiAgICAgICAgICAgICAgLy8gSW5mcmFzdHJ1Y3R1cmUgZXJyb3JzIHRoYXQgc29tZWhvdyBzdXJmYWNlZCB0aHJvdWdoIHVzZXIgY29kZVxuICAgICAgICAgICAgICAvLyBzaG91bGQgcHJvcGFnYXRlIHRvIHRoZSBxdWV1ZSBoYW5kbGVyIGZvciByZXRyeSwgbm90IGNvbnN1bWVcbiAgICAgICAgICAgICAgLy8gc3RlcCBhdHRlbXB0cy5cbiAgICAgICAgICAgICAgaWYgKFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgLy8gV29ya2Zsb3cgaGFzIGFscmVhZHkgY29tcGxldGVkLCBzbyBuby1vcFxuICAgICAgICAgICAgICAgIHN0ZXBMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICdXb3JrZmxvdyBydW4gYWxyZWFkeSBjb21wbGV0ZWQsIHNraXBwaW5nIHN0ZXAnLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChXb3JrZmxvd1dvcmxkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIuc3RhdHVzICE9PSB1bmRlZmluZWQgJiYgZXJyLnN0YXR1cyA+PSA1MDApIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBXcmFwIEFib3J0RXJyb3IgaW4gRmF0YWxFcnJvciDigJQgYWJvcnQgaXMgaW50ZW50aW9uYWwgY2FuY2VsbGF0aW9uLCBub3QgcmV0cnlhYmxlXG4gICAgICAgICAgICAgIGxldCBlZmZlY3RpdmVFcnI6IHVua25vd24gPSBlcnI7XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBlcnIgaW5zdGFuY2VvZiBFcnJvciAmJlxuICAgICAgICAgICAgICAgIGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicgJiZcbiAgICAgICAgICAgICAgICAhRmF0YWxFcnJvci5pcyhlcnIpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZhdGFsRXJyID0gbmV3IEZhdGFsRXJyb3IoYEFib3J0ZWQ6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgZmF0YWxFcnIuc3RhY2sgPSBlcnIuc3RhY2s7XG4gICAgICAgICAgICAgICAgZWZmZWN0aXZlRXJyID0gZmF0YWxFcnI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZEVycm9yID0gYXdhaXQgbm9ybWFsaXplVW5rbm93bkVycm9yKGVmZmVjdGl2ZUVycik7XG4gICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTdGFjayA9XG4gICAgICAgICAgICAgICAgbm9ybWFsaXplZEVycm9yLnN0YWNrIHx8IGdldEVycm9yU3RhY2soZWZmZWN0aXZlRXJyKSB8fCAnJztcblxuICAgICAgICAgICAgICAvLyBSZWNvcmQgZXhjZXB0aW9uIGZvciBPVEVMIGVycm9yIHRyYWNraW5nXG4gICAgICAgICAgICAgIGlmIChlZmZlY3RpdmVFcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIHNwYW4/LnJlY29yZEV4Y2VwdGlvbj8uKGVmZmVjdGl2ZUVycik7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBEZXRlcm1pbmUgZXJyb3IgY2F0ZWdvcnkgYW5kIHJldHJ5YWJpbGl0eVxuICAgICAgICAgICAgICBjb25zdCBpc0ZhdGFsID0gRmF0YWxFcnJvci5pcyhlZmZlY3RpdmVFcnIpO1xuICAgICAgICAgICAgICBjb25zdCBpc1JldHJ5YWJsZSA9IFJldHJ5YWJsZUVycm9yLmlzKGVmZmVjdGl2ZUVycik7XG4gICAgICAgICAgICAgIGNvbnN0IGVycm9yQ2F0ZWdvcnkgPSBpc0ZhdGFsXG4gICAgICAgICAgICAgICAgPyAnZmF0YWwnXG4gICAgICAgICAgICAgICAgOiBpc1JldHJ5YWJsZVxuICAgICAgICAgICAgICAgICAgPyAncmV0cnlhYmxlJ1xuICAgICAgICAgICAgICAgICAgOiAndHJhbnNpZW50JztcblxuICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcEVycm9yTmFtZShnZXRFcnJvck5hbWUoZXJyKSksXG4gICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBFcnJvck1lc3NhZ2Uobm9ybWFsaXplZEVycm9yLm1lc3NhZ2UpLFxuICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvclR5cGUoZ2V0RXJyb3JOYW1lKGVycikpLFxuICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvckNhdGVnb3J5KGVycm9yQ2F0ZWdvcnkpLFxuICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5FcnJvclJldHJ5YWJsZSghaXNGYXRhbCksXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGlmIChpc0ZhdGFsKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBkZXNjcmliZUVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgY29uc3QgZnJpZW5kbHlTdGVwID0gZm9ybWF0U3RlcE5hbWUoc3RlcE5hbWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZyYW1pbmcgPVxuICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24uYXR0cmlidXRpb24gPT09ICdzZGsnXG4gICAgICAgICAgICAgICAgICAgID8gYFN0ZXAgJHtmcmllbmRseVN0ZXB9IGZhaWxlZCB3aXRoIGEgRmF0YWxFcnJvciBmcm9tIHRoZSBTREsgcnVudGltZSDigJQgYnViYmxpbmcgdXAgdG8gcGFyZW50IHdvcmtmbG93YFxuICAgICAgICAgICAgICAgICAgICA6IGBTdGVwICR7ZnJpZW5kbHlTdGVwfSB0aHJldyBhIEZhdGFsRXJyb3Ig4oCUIGJ1YmJsaW5nIHVwIHRvIHBhcmVudCB3b3JrZmxvd2A7XG4gICAgICAgICAgICAgICAgLy8gTWlycm9yIHRoZSB3b3JrZmxvdy1sZXZlbCBsb2cgZm9ybWF0dGluZzogcHV0IHRoZSBmcmFtaW5nICtcbiAgICAgICAgICAgICAgICAvLyBzdGFjayBpbnRvIHRoZSBtZXNzYWdlIHNvIGNvbnNvbGUuZXJyb3IgcmVuZGVycyB0aGUgc3RhY2tcbiAgICAgICAgICAgICAgICAvLyBpbmxpbmUsIGFuZCBrZWVwIHRoZSBtZXRhZGF0YSBvYmplY3Qgc21hbGwgd2l0aCBvbmx5IHRoZVxuICAgICAgICAgICAgICAgIC8vIHN0cnVjdHVyZWQgZmllbGRzIHRoYXQgbG9nIGRyYWlucyB3YW50IHRvIGluZGV4LlxuICAgICAgICAgICAgICAgIC8vIE5vIGBoaW50YCBmaWVsZCBoZXJlIOKAlCBhY3Rpb25hYmxlIGhpbnQgdGV4dCBsaXZlcyBvbiB0aGVcbiAgICAgICAgICAgICAgICAvLyBlcnJvciBtZXNzYWdlIGl0c2VsZiAoc28gaXQgc3Vydml2ZXMgc2VyaWFsaXphdGlvbiDihpJcbiAgICAgICAgICAgICAgICAvLyBldmVudCBsb2cg4oaSIG9ic2VydmFiaWxpdHkgcmVoeWRyYXRlKSwgYW5kIGFkZGluZyBpdFxuICAgICAgICAgICAgICAgIC8vIGFnYWluIGhlcmUganVzdCBkdXBsaWNhdGVzIGl0IG9uIHN0ZGVyci5cbiAgICAgICAgICAgICAgICBzdGVwTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgYCR7ZnJhbWluZ31cXG4ke25vcm1hbGl6ZWRTdGFjayB8fCBub3JtYWxpemVkRXJyb3IubWVzc2FnZX1gLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICBlcnJvckF0dHJpYnV0aW9uOiBkZXNjcmlwdGlvbi5hdHRyaWJ1dGlvbixcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBub3JtYWxpemVkRXJyb3IubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBub3JtYWxpemVkRXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIC8vIEZhaWwgdGhlIHN0ZXAgdmlhIGV2ZW50IChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSkuXG4gICAgICAgICAgICAgICAgLy8gU2VyaWFsaXplIHRoZSBvcmlnaW5hbCB0aHJvd24gdmFsdWUgc28gaXRzIGZ1bGwgdHlwZSBpZGVudGl0eVxuICAgICAgICAgICAgICAgIC8vIGFuZCBjdXN0b20gcHJvcGVydGllcyByb3VuZC10cmlwIHRocm91Z2ggdGhlIGV2ZW50IGxvZy5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfZmFpbGVkJyxcbiAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoc3RlcEZhaWxFcnIpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKHN0ZXBGYWlsRXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTdGVwIGFscmVhZHkgaW4gdGVybWluYWwgc3RhdGUg4oCUIGlkZW1wb3RlbnQuXG4gICAgICAgICAgICAgICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgc3RlcCwgYnV0IHN0ZXAgaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IHN0ZXBGYWlsRXJyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IHN0ZXBGYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB0aHJvdyBzdGVwRmFpbEVycjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwRmF0YWxFcnJvcih0cnVlKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXhSZXRyaWVzID1cbiAgICAgICAgICAgICAgICAgIHN0ZXBGbi5tYXhSZXRyaWVzID8/IERFRkFVTFRfU1RFUF9NQVhfUkVUUklFUztcbiAgICAgICAgICAgICAgICAvLyBzdGVwLmF0dGVtcHQgd2FzIGluY3JlbWVudGVkIGJ5IHN0ZXBfc3RhcnRlZCwgdXNlIGl0IGhlcmVcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50QXR0ZW1wdCA9IHN0ZXAuYXR0ZW1wdDtcblxuICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBBdHRlbXB0KGN1cnJlbnRBdHRlbXB0KSxcbiAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwTWF4UmV0cmllcyhtYXhSZXRyaWVzKSxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIC8vIE5vdGU6IG1heFJldHJpZXMgaXMgdGhlIG51bWJlciBvZiBSRVRSSUVTIGFmdGVyIHRoZSBmaXJzdCBhdHRlbXB0LCBzbyB0b3RhbCBhdHRlbXB0cyA9IG1heFJldHJpZXMgKyAxXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRBdHRlbXB0ID49IG1heFJldHJpZXMgKyAxKSB7XG4gICAgICAgICAgICAgICAgICAvLyBNYXggcmV0cmllcyByZWFjaGVkXG4gICAgICAgICAgICAgICAgICBjb25zdCByZXRyeUNvdW50ID0gc3RlcC5hdHRlbXB0IC0gMTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gZGVzY3JpYmVFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgZnJpZW5kbHlTdGVwID0gZm9ybWF0U3RlcE5hbWUoc3RlcE5hbWUpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgZnJhbWluZyA9XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLmF0dHJpYnV0aW9uID09PSAnc2RrJ1xuICAgICAgICAgICAgICAgICAgICAgID8gYFN0ZXAgJHtmcmllbmRseVN0ZXB9IGhpdCBtYXggcmV0cmllcyBvbiBhbiBTREsgcnVudGltZSBlcnJvciDigJQgYnViYmxpbmcgdG8gcGFyZW50IHdvcmtmbG93YFxuICAgICAgICAgICAgICAgICAgICAgIDogYFN0ZXAgJHtmcmllbmRseVN0ZXB9IGhpdCBtYXggcmV0cmllcyDigJQgYnViYmxpbmcgZXJyb3IgdGhyb3duIGJ5IHlvdXIgc3RlcCB0byB0aGUgcGFyZW50IHdvcmtmbG93YDtcbiAgICAgICAgICAgICAgICAgIHN0ZXBMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGAke2ZyYW1pbmd9XFxuJHtub3JtYWxpemVkU3RhY2sgfHwgbm9ybWFsaXplZEVycm9yLm1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0OiBzdGVwLmF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgcmV0cnlDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvckF0dHJpYnV0aW9uOiBkZXNjcmlwdGlvbi5hdHRyaWJ1dGlvbixcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IG5vcm1hbGl6ZWRFcnJvci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogbm9ybWFsaXplZEVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAvLyBEb24ndCBpbmNsdWRlIHRoZSBtYWNoaW5lIHN0ZXAgbmFtZSBpbiB0aGUgcGVyc2lzdGVkXG4gICAgICAgICAgICAgICAgICAvLyBlcnJvciBtZXNzYWdlIOKAlCBvYnNlcnZhYmlsaXR5IGFscmVhZHkgc2hvd3Mgd2hpY2ggc3RlcFxuICAgICAgICAgICAgICAgICAgLy8gcHJvZHVjZWQgdGhlIGV2ZW50LCBhbmQgYHN0ZXBOYW1lOiAnc3RlcC8vLi8uLi4vZm9vJ2BcbiAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSB0aXRsZSBpcyBqdXN0IG5vaXNlLiBUaGUgQ0xJIGxvZ2dlciByZW5kZXJzXG4gICAgICAgICAgICAgICAgICAvLyBgU3RlcCBmb28gKC4vLi4uKSBoaXQgbWF4IHJldHJpZXNgIHNlcGFyYXRlbHkuXG4gICAgICAgICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgU3RlcCBmYWlsZWQgYWZ0ZXIgJHttYXhSZXRyaWVzfSAke3BsdXJhbGl6ZSgncmV0cnknLCAncmV0cmllcycsIG1heFJldHJpZXMpfTogJHtub3JtYWxpemVkRXJyb3IubWVzc2FnZX1gO1xuICAgICAgICAgICAgICAgICAgLy8gRmFpbCB0aGUgc3RlcCB2aWEgZXZlbnQgKGV2ZW50LXNvdXJjZWQgYXJjaGl0ZWN0dXJlKS5cbiAgICAgICAgICAgICAgICAgIC8vIFdyYXAgdGhlIG9yaWdpbmFsIGVycm9yIHdpdGggYSBGYXRhbEVycm9yIHRoYXQgcHJlc2VydmVzXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgd3JhcHBlZCBtZXNzYWdlIHBsdXMgdGhlIG9yaWdpbmFsIHRocm93biB2YWx1ZSBhc1xuICAgICAgICAgICAgICAgICAgLy8gYGNhdXNlYCBzbyBpdCdzIHJlY292ZXJhYmxlIGFmdGVyIGh5ZHJhdGlvbi5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHdyYXBwZWRFcnJvciA9IG5ldyBGYXRhbEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAod3JhcHBlZEVycm9yIGFzIEVycm9yKS5jYXVzZSA9IGVycjtcbiAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkU3RhY2spIHdyYXBwZWRFcnJvci5zdGFjayA9IG5vcm1hbGl6ZWRTdGFjaztcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoc3RlcEZhaWxFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoc3RlcEZhaWxFcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU3RlcCBhbHJlYWR5IGluIHRlcm1pbmFsIHN0YXRlIOKAlCBpZGVtcG90ZW50LlxuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAnVHJpZWQgZmFpbGluZyBzdGVwLCBidXQgc3RlcCBoYXMgYWxyZWFkeSBmaW5pc2hlZC4nLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IHN0ZXBGYWlsRXJyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogc3RlcEZhaWxFcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGVwRmFpbEVycjtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBSZXRyeUV4aGF1c3RlZCh0cnVlKSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyBOb3QgYXQgbWF4IHJldHJpZXMgeWV0IC0gbG9nIGFzIGEgcmV0cnlhYmxlIGVycm9yXG4gICAgICAgICAgICAgICAgICBpZiAoUmV0cnlhYmxlRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICBzdGVwTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgJ0VuY291bnRlcmVkIFJldHJ5YWJsZUVycm9yLCBzdGVwIHdpbGwgYmUgcmV0cmllZCcsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdDogY3VycmVudEF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IGVyci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RhY2s6IG5vcm1hbGl6ZWRTdGFjayxcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdGVwTG9nZ2VyLmluZm8oJ0VuY291bnRlcmVkIEVycm9yLCBzdGVwIHdpbGwgYmUgcmV0cmllZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgYXR0ZW1wdDogY3VycmVudEF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBub3JtYWxpemVkRXJyb3IubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IG5vcm1hbGl6ZWRFcnJvci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yU3RhY2s6IG5vcm1hbGl6ZWRTdGFjayxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAvLyBTZXQgc3RlcCB0byBwZW5kaW5nIGZvciByZXRyeSB2aWEgZXZlbnQgKGV2ZW50LXNvdXJjZWQgYXJjaGl0ZWN0dXJlKVxuICAgICAgICAgICAgICAgICAgLy8gc3RlcF9yZXRyeWluZyByZWNvcmRzIHRoZSBlcnJvciBhbmQgc2V0cyBzdGF0dXMgdG8gcGVuZGluZy5cbiAgICAgICAgICAgICAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlIHNvIGl0cyBmdWxsIHR5cGUgaWRlbnRpdHlcbiAgICAgICAgICAgICAgICAgIC8vIGFuZCBjdXN0b20gcHJvcGVydGllcyByb3VuZC10cmlwIHRocm91Z2ggdGhlIGV2ZW50IGxvZy5cbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX3JldHJ5aW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogYXdhaXQgZGVoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKFJldHJ5YWJsZUVycm9yLmlzKGVycikgJiYge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHJ5QWZ0ZXI6IGVyci5yZXRyeUFmdGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICB9IGNhdGNoIChzdGVwUmV0cnlFcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoc3RlcFJldHJ5RXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXAgYWxyZWFkeSBpbiB0ZXJtaW5hbCBzdGF0ZSDigJQgaWRlbXBvdGVudC5cbiAgICAgICAgICAgICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIHJldHJ5aW5nIHN0ZXAsIGJ1dCBzdGVwIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZTogc3RlcFJldHJ5RXJyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogc3RlcFJldHJ5RXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3RlcFJldHJ5RXJyO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBjb25zdCB0aW1lb3V0U2Vjb25kcyA9IE1hdGgubWF4KFxuICAgICAgICAgICAgICAgICAgICAxLFxuICAgICAgICAgICAgICAgICAgICBSZXRyeWFibGVFcnJvci5pcyhlcnIpXG4gICAgICAgICAgICAgICAgICAgICAgPyBNYXRoLmNlaWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICgrZXJyLnJldHJ5QWZ0ZXIuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKSkgLyAxMDAwXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgOiAxXG4gICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBSZXRyeVRpbWVvdXRTZWNvbmRzKHRpbWVvdXRTZWNvbmRzKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBSZXRyeVdpbGxSZXRyeSh0cnVlKSxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAvLyBBZGQgc3BhbiBldmVudCBmb3IgcmV0cnkgc2NoZWR1bGluZ1xuICAgICAgICAgICAgICAgICAgc3Bhbj8uYWRkRXZlbnQ/LigncmV0cnkuc2NoZWR1bGVkJywge1xuICAgICAgICAgICAgICAgICAgICAncmV0cnkudGltZW91dF9zZWNvbmRzJzogdGltZW91dFNlY29uZHMsXG4gICAgICAgICAgICAgICAgICAgICdyZXRyeS5hdHRlbXB0JzogY3VycmVudEF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICdyZXRyeS5tYXhfcmV0cmllcyc6IG1heFJldHJpZXMsXG4gICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgLy8gSXQncyBhIHJldHJ5YWJsZSBlcnJvciAtIHNvIGhhdmUgdGhlIHF1ZXVlIGtlZXAgdGhlIG1lc3NhZ2UgdmlzaWJsZVxuICAgICAgICAgICAgICAgICAgLy8gc28gdGhhdCBpdCBnZXRzIHJldHJpZWQuXG4gICAgICAgICAgICAgICAgICByZXR1cm4geyB0aW1lb3V0U2Vjb25kcyB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIFJlLWludm9rZSB0aGUgd29ya2Zsb3cgdG8gaGFuZGxlIHRoZSBmYWlsZWQvcmV0cnlpbmcgc3RlcFxuICAgICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2Uod29ybGQsIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSksIHtcbiAgICAgICAgICAgICAgICBydW5JZDogd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IHNlcmlhbGl6ZVRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZEF0OiBuZXcgRGF0ZSgpLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyAtLS0gSW5mcmFzdHJ1Y3R1cmU6IGNvbXBsZXRlIHRoZSBzdGVwIC0tLVxuICAgICAgICAgICAgLy8gRXJyb3JzIGhlcmUgKG5ldHdvcmsgZmFpbHVyZXMsIHNlcnZlciBlcnJvcnMpIHByb3BhZ2F0ZSB0byB0aGVcbiAgICAgICAgICAgIC8vIHF1ZXVlIGhhbmRsZXIgZm9yIGF1dG9tYXRpYyByZXRyeS5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyBOT1RFOiBOb25lIG9mIHRoZSBjb2RlIGZyb20gdGhpcyBwb2ludCBpcyBndWFyYW50ZWVkIHRvIHJ1bi5cbiAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBzdGVwIG1pZ2h0IGZhaWwgb3IgY2F1c2UgYSBmdW5jdGlvbiB0aW1lb3V0IGFuZCB0aGVcbiAgICAgICAgICAgIC8vIHByb2Nlc3MgbWlnaHQgYmUgU0lHS0lMTCdkLCB0aGUgd29ya2Zsb3cgcnVudGltZSBtdXN0IGJlXG4gICAgICAgICAgICAvLyByZXNpbGllbnQgdG8gdGhlIGJlbG93IGNvZGUgbm90IGV4ZWN1dGluZyBvbiBhIGZhaWxlZCBzdGVwLlxuICAgICAgICAgICAgLy8gKERlaHlkcmF0aW9uIGFscmVhZHkgaGFwcGVuZWQgYWJvdmUgYW5kIGlzIGFjY291bnRlZCBmb3IgaW4gdGhlXG4gICAgICAgICAgICAvLyB1c2VyQ29kZUZhaWxlZCBwYXRoLilcbiAgICAgICAgICAgIHdhaXRVbnRpbChcbiAgICAgICAgICAgICAgUHJvbWlzZS5hbGwob3BzKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gSWdub3JlIGV4cGVjdGVkIGNsaWVudCBkaXNjb25uZWN0IGVycm9ycyAoZS5nLiwgYnJvd3NlciByZWZyZXNoIGR1cmluZyBzdHJlYW1pbmcpXG4gICAgICAgICAgICAgICAgY29uc3QgaXNBYm9ydEVycm9yID1cbiAgICAgICAgICAgICAgICAgIGVycj8ubmFtZSA9PT0gJ0Fib3J0RXJyb3InIHx8IGVycj8ubmFtZSA9PT0gJ1Jlc3BvbnNlQWJvcnRlZCc7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0Fib3J0RXJyb3IpIHRocm93IGVycjtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIC8vIFJ1biBzdGVwX2NvbXBsZXRlZCBhbmQgdHJhY2Ugc2VyaWFsaXphdGlvbiBjb25jdXJyZW50bHk7XG4gICAgICAgICAgICAvLyB0aGUgdHJhY2UgY2FycmllciBpcyB1c2VkIGluIHRoZSBmaW5hbCBxdWV1ZU1lc3NhZ2UgY2FsbCBiZWxvd1xuICAgICAgICAgICAgbGV0IHN0ZXBDb21wbGV0ZWQ0MDkgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IFssIHRyYWNlQ2Fycmllcl0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgIHdvcmxkLmV2ZW50c1xuICAgICAgICAgICAgICAgIC5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2NvbXBsZXRlZCcsXG4gICAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb25JZDogc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHJlc3VsdCBhcyBVaW50OEFycmF5LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmNhdGNoKChlcnI6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU3RlcCBhbHJlYWR5IGluIHRlcm1pbmFsIHN0YXRlIOKAlCBpZGVtcG90ZW50LlxuICAgICAgICAgICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICdUcmllZCBjb21wbGV0aW5nIHN0ZXAsIGJ1dCBzdGVwIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBlcnIubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBzdGVwQ29tcGxldGVkNDA5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBzZXJpYWxpemVUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgIF0pO1xuXG4gICAgICAgICAgICBpZiAoc3RlcENvbXBsZXRlZDQwOSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cygnY29tcGxldGVkJyksXG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmVzdWx0VHlwZSh0eXBlb2YgcmVzdWx0KSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBRdWV1ZSB0aGUgd29ya2Zsb3cgY29udGludWF0aW9uIHdpdGggdGhlIGNvbmN1cnJlbnRseS1yZXNvbHZlZCB0cmFjZSBjYXJyaWVyXG4gICAgICAgICAgICBhd2FpdCBxdWV1ZU1lc3NhZ2Uod29ybGQsIGdldFdvcmtmbG93UXVldWVOYW1lKHdvcmtmbG93TmFtZSksIHtcbiAgICAgICAgICAgICAgcnVuSWQ6IHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG4gICk7XG5cbi8qKlxuICogQSBzaW5nbGUgcm91dGUgdGhhdCBoYW5kbGVzIGFueSBzdGVwIGV4ZWN1dGlvbiByZXF1ZXN0IGFuZCByb3V0ZXMgdG8gdGhlXG4gKiBhcHByb3ByaWF0ZSBzdGVwIGZ1bmN0aW9uLiBXZSBtYXkgZXZlbnR1YWxseSB3YW50IHRvIGNyZWF0ZSBkaWZmZXJlbnQgYnVuZGxlc1xuICogZm9yIGVhY2ggc3RlcCwgdGhpcyBpcyB0ZW1wb3JhcnkuXG4gKi9cbmxldCBjYWNoZWRTdGVwSGFuZGxlcjogKChyZXE6IFJlcXVlc3QpID0+IFByb21pc2U8UmVzcG9uc2U+KSB8IHVuZGVmaW5lZDtcbmV4cG9ydCBjb25zdCBzdGVwRW50cnlwb2ludDogKHJlcTogUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXNwb25zZT4gPVxuICAvKiBAX19QVVJFX18gKi8gd2l0aEhlYWx0aENoZWNrKGFzeW5jIChyZXEpID0+IHtcbiAgICBpZiAoIWNhY2hlZFN0ZXBIYW5kbGVyKSB7XG4gICAgICBjYWNoZWRTdGVwSGFuZGxlciA9IHN0ZXBIYW5kbGVyKGF3YWl0IGdldFdvcmxkSGFuZGxlcnMoKSk7XG4gICAgfVxuICAgIHJldHVybiBjYWNoZWRTdGVwSGFuZGxlcihyZXEpO1xuICB9KTtcbiJdfQ==
785
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3J1bnRpbWUvc3RlcC1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLFVBQVUsRUFDVixjQUFjLEVBQ2QsZUFBZSxFQUNmLHNCQUFzQixFQUN0QixhQUFhLEVBQ2IsYUFBYSxFQUNiLG9CQUFvQixFQUNwQixrQkFBa0IsR0FDbkIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRCxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUNsQix3QkFBd0IsRUFDeEIsb0JBQW9CLEVBQ3BCLGdCQUFnQixHQUNqQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEtBQUssU0FBUyxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xFLE9BQU8sRUFDTCxXQUFXLEVBQ1gsb0JBQW9CLEVBQ3BCLHFCQUFxQixFQUNyQixLQUFLLEVBQ0wsZ0JBQWdCLEdBQ2pCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUNMLFlBQVksRUFDWixhQUFhLEVBQ2IscUJB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QUUsQ0FBQztRQUN2QixpQkFBaUIsR0FBRyxXQUFXLENBQUMsTUFBTSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUNELE9BQU8saUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEMsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB3YWl0VW50aWwgfSBmcm9tICdAdmVyY2VsL2Z1bmN0aW9ucyc7XG5pbXBvcnQge1xuICBFbnRpdHlDb25mbGljdEVycm9yLFxuICBGYXRhbEVycm9yLFxuICBSZXRyeWFibGVFcnJvcixcbiAgUnVuRXhwaXJlZEVycm9yLFxuICBTdGVwTm90UmVnaXN0ZXJlZEVycm9yLFxuICBUaHJvdHRsZUVycm9yLFxuICBUb29FYXJseUVycm9yLFxuICBXb3JrZmxvd1J1bnRpbWVFcnJvcixcbiAgV29ya2Zsb3dXb3JsZEVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IGZvcm1hdFN0ZXBOYW1lLCBwbHVyYWxpemUgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHsgZ2V0UG9ydCB9IGZyb20gJ0B3b3JrZmxvdy91dGlscy9nZXQtcG9ydCc7XG5pbXBvcnQgeyBTUEVDX1ZFUlNJT05fQ1VSUkVOVCwgU3RlcEludm9rZVBheWxvYWRTY2hlbWEgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgZGVzY3JpYmVFcnJvciB9IGZyb20gJy4uL2Rlc2NyaWJlLWVycm9yLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIsIHN0ZXBMb2dnZXIgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZ2V0U3RlcEZ1bmN0aW9uIH0gZnJvbSAnLi4vcHJpdmF0ZS5qcyc7XG5pbXBvcnQge1xuICBjYW5jZWxBYm9ydFJlYWRlcnMsXG4gIGRlaHlkcmF0ZVN0ZXBFcnJvcixcbiAgZGVoeWRyYXRlU3RlcFJldHVyblZhbHVlLFxuICBoeWRyYXRlU3RlcEFyZ3VtZW50cyxcbiAgaHlkcmF0ZVN0ZXBFcnJvcixcbn0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBjb250ZXh0U3RvcmFnZSB9IGZyb20gJy4uL3N0ZXAvY29udGV4dC1zdG9yYWdlLmpzJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHtcbiAgZ2V0U3BhbktpbmQsXG4gIGxpbmtUb0N1cnJlbnRDb250ZXh0LFxuICBzZXJpYWxpemVUcmFjZUNhcnJpZXIsXG4gIHRyYWNlLFxuICB3aXRoVHJhY2VDb250ZXh0LFxufSBmcm9tICcuLi90ZWxlbWV0cnkuanMnO1xuaW1wb3J0IHtcbiAgZ2V0RXJyb3JOYW1lLFxuICBnZXRFcnJvclN0YWNrLFxuICBub3JtYWxpemVVbmtub3duRXJyb3IsXG59IGZyb20gJy4uL3R5cGVzLmpzJztcbmltcG9ydCB7IE1BWF9RVUVVRV9ERUxJVkVSSUVTIH0gZnJvbSAnLi9jb25zdGFudHMuanMnO1xuaW1wb3J0IHtcbiAgZ2V0UXVldWVPdmVyaGVhZCxcbiAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUsXG4gIGhhbmRsZUhlYWx0aENoZWNrTWVzc2FnZSxcbiAgbWVtb2l6ZUVuY3J5cHRpb25LZXksXG4gIHBhcnNlSGVhbHRoQ2hlY2tQYXlsb2FkLFxuICBxdWV1ZU1lc3NhZ2UsXG4gIHdpdGhIZWFsdGhDaGVjayxcbn0gZnJvbSAnLi9oZWxwZXJzLmpzJztcbmltcG9ydCB7IGdldFdvcmxkLCBnZXRXb3JsZEhhbmRsZXJzLCB0eXBlIFdvcmxkSGFuZGxlcnMgfSBmcm9tICcuL3dvcmxkLmpzJztcblxuY29uc3QgREVGQVVMVF9TVEVQX01BWF9SRVRSSUVTID0gMztcblxuY29uc3Qgc3RlcEhhbmRsZXIgPSAod29ybGRIYW5kbGVyczogV29ybGRIYW5kbGVycykgPT5cbiAgd29ybGRIYW5kbGVycy5jcmVhdGVRdWV1ZUhhbmRsZXIoXG4gICAgJ19fd2tmX3N0ZXBfJyxcbiAgICBhc3luYyAobWVzc2FnZV8sIG1ldGFkYXRhKSA9PiB7XG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgaGVhbHRoIGNoZWNrIG1lc3NhZ2VcbiAgICAgIC8vIE5PVEU6IEhlYWx0aCBjaGVjayBtZXNzYWdlcyBhcmUgaW50ZW50aW9uYWxseSB1bmF1dGhlbnRpY2F0ZWQgZm9yIG1vbml0b3JpbmcgcHVycG9zZXMuXG4gICAgICAvLyBUaGV5IG9ubHkgd3JpdGUgYSBzaW1wbGUgc3RhdHVzIHJlc3BvbnNlIHRvIGEgc3RyZWFtIGFuZCBkbyBub3QgZXhwb3NlIHNlbnNpdGl2ZSBkYXRhLlxuICAgICAgLy8gVGhlIHN0cmVhbSBuYW1lIGluY2x1ZGVzIGEgdW5pcXVlIGNvcnJlbGF0aW9uSWQgdGhhdCBtdXN0IGJlIGtub3duIGJ5IHRoZSBjYWxsZXIuXG4gICAgICBjb25zdCBoZWFsdGhDaGVjayA9IHBhcnNlSGVhbHRoQ2hlY2tQYXlsb2FkKG1lc3NhZ2VfKTtcbiAgICAgIGlmIChoZWFsdGhDaGVjaykge1xuICAgICAgICBhd2FpdCBoYW5kbGVIZWFsdGhDaGVja01lc3NhZ2UoXG4gICAgICAgICAgaGVhbHRoQ2hlY2ssXG4gICAgICAgICAgJ3N0ZXAnLFxuICAgICAgICAgIHdvcmxkSGFuZGxlcnMuc3BlY1ZlcnNpb25cbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7XG4gICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQsXG4gICAgICAgIHN0ZXBJZCxcbiAgICAgICAgdHJhY2VDYXJyaWVyOiB0cmFjZUNvbnRleHQsXG4gICAgICAgIHJlcXVlc3RlZEF0LFxuICAgICAgfSA9IFN0ZXBJbnZva2VQYXlsb2FkU2NoZW1hLnBhcnNlKG1lc3NhZ2VfKTtcbiAgICAgIGNvbnN0IHsgcmVxdWVzdElkIH0gPSBtZXRhZGF0YTtcblxuICAgICAgLy8gLS0tIE1heCBkZWxpdmVyeSBjaGVjayAtLS1cbiAgICAgIC8vIEVuZm9yY2UgbWF4IGRlbGl2ZXJ5IGxpbWl0IGJlZm9yZSBhbnkgaW5mcmFzdHJ1Y3R1cmUgY2FsbHMuXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIHJ1bmF3YXkgc3RlcHMgZnJvbSBjb25zdW1pbmcgaW5maW5pdGUgcXVldWUgZGVsaXZlcmllcy5cbiAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHdlIHdhbnQgdG8gZG8gdGhlIG1pbmltYWwgYW1vdW50IG9mIHdvcmsgKG5vIGZldGNoaW5nXG4gICAgICAvLyBvZiB0aGUgc3RlcCBkZXRhaWxzLCBldGMuIFdlIHNpbXBseSBhdHRlbXB0IHRvIG1hcmsgdGhlIHN0ZXAgYXMgZmFpbGVkXG4gICAgICAvLyBhbmQgZW5xdWV1ZSB0aGUgd29ya2Zsb3cgb25jZSwgYW5kIGlmIGVpdGhlciBvZiB0aG9zZSBmYWlscywgdGhlIG1lc3NhZ2VcbiAgICAgIC8vIGlzIHN0aWxsIGNvbnN1bWVkIGJ1dCB3aXRoIGFkZXF1YXRlIGxvZ2dpbmcgdGhhdCBhbiBlcnJvciBvY2N1cnJlZC5cbiAgICAgIC8vIFNjb3BlZCBsb2dnZXIgZm9yIHRoaXMgc3RlcCBpbnZvY2F0aW9uIOKAlCBhdHRhY2hlcyBydW4vc3RlcCBjb250ZXh0IHRvXG4gICAgICAvLyBldmVyeSBsb2cgbGluZSBiZWxvdyBzbyBjYWxsZXJzIGRvbid0IHJlcGVhdCBpdC5cbiAgICAgIGNvbnN0IHN0ZXBOYW1lRnJvbVF1ZXVlID0gbWV0YWRhdGEucXVldWVOYW1lLnNsaWNlKCdfX3drZl9zdGVwXycubGVuZ3RoKTtcbiAgICAgIGNvbnN0IHN0ZXBSdW50aW1lTG9nZ2VyID0gcnVudGltZUxvZ2dlci5mb3JSdW4oXG4gICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgeyBzdGVwSWQsIHN0ZXBOYW1lOiBzdGVwTmFtZUZyb21RdWV1ZSB9XG4gICAgICApO1xuXG4gICAgICBpZiAobWV0YWRhdGEuYXR0ZW1wdCA+IE1BWF9RVUVVRV9ERUxJVkVSSUVTKSB7XG4gICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLmVycm9yKFxuICAgICAgICAgIGBTdGVwIGhhbmRsZXIgZXhjZWVkZWQgbWF4IGRlbGl2ZXJpZXMgKCR7bWV0YWRhdGEuYXR0ZW1wdH0vJHtNQVhfUVVFVUVfREVMSVZFUklFU30pYCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhdHRlbXB0OiBtZXRhZGF0YS5hdHRlbXB0LFxuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkKCk7XG4gICAgICAgICAgY29uc3QgZ2V0RW5jcnlwdGlvbktleSA9IG1lbW9pemVFbmNyeXB0aW9uS2V5KHdvcmxkLCB3b3JrZmxvd1J1bklkKTtcbiAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgRmF0YWxFcnJvcihcbiAgICAgICAgICAgIGBTdGVwIGV4Y2VlZGVkIG1heGltdW0gcXVldWUgZGVsaXZlcmllcyAoJHttZXRhZGF0YS5hdHRlbXB0fS8ke01BWF9RVUVVRV9ERUxJVkVSSUVTfSlgXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9mYWlsZWQnLFxuICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgc3RlcE5hbWU6IHN0ZXBOYW1lRnJvbVF1ZXVlLFxuICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVTdGVwRXJyb3IoXG4gICAgICAgICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBSZS1xdWV1ZSB0aGUgd29ya2Zsb3cgdG8gaGFuZGxlIHRoZSBmYWlsZWQgc3RlcFxuICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZSh3b3JsZCwgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lKSwge1xuICAgICAgICAgICAgcnVuSWQ6IHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICB0cmFjZUNhcnJpZXI6IGF3YWl0IHNlcmlhbGl6ZVRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikgfHwgUnVuRXhwaXJlZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQ2FuJ3QgZXZlbiBtYXJrIHRoZSBzdGVwIGFzIGZhaWxlZC4gQ29uc3VtZSB0aGUgbWVzc2FnZSB0byBzdG9wXG4gICAgICAgICAgLy8gZnVydGhlciByZXRyaWVzLiBUaGUgcnVuIHdpbGwgcmVtYWluIGluIGl0cyBjdXJyZW50IHN0YXRlLlxuICAgICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBtYXJrIHN0ZXAgYXMgZmFpbGVkIGFmdGVyICR7bWV0YWRhdGEuYXR0ZW1wdH0gZGVsaXZlcnkgYXR0ZW1wdHMuIGAgK1xuICAgICAgICAgICAgICBgQSBwZXJzaXN0ZW50IGVycm9yIGlzIHByZXZlbnRpbmcgdGhlIHN0ZXAgZnJvbSBiZWluZyB0ZXJtaW5hdGVkLiBgICtcbiAgICAgICAgICAgICAgYFRoZSBydW4gd2lsbCByZW1haW4gaW4gaXRzIGN1cnJlbnQgc3RhdGUgdW50aWwgbWFudWFsbHkgcmVzb2x2ZWQuIGAgK1xuICAgICAgICAgICAgICBgVGhpcyBpcyBtb3N0IGxpa2VseSBkdWUgdG8gYSBwZXJzaXN0ZW50IG91dGFnZSBvZiB0aGUgd29ya2Zsb3cgYmFja2VuZCBgICtcbiAgICAgICAgICAgICAgYG9yIGEgYnVnIGluIHRoZSB3b3JrZmxvdyBydW50aW1lIGFuZCBzaG91bGQgYmUgcmVwb3J0ZWQgdG8gdGhlIFdvcmtmbG93IHRlYW0uYCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYXR0ZW1wdDogbWV0YWRhdGEuYXR0ZW1wdCxcbiAgICAgICAgICAgICAgZXJyb3JOYW1lOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5uYW1lIDogJ1Vua25vd25FcnJvcicsXG4gICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgICAgICAgICBlcnJvclN0YWNrOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5zdGFjayA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3BhbkxpbmtzID0gYXdhaXQgbGlua1RvQ3VycmVudENvbnRleHQoKTtcbiAgICAgIC8vIEV4ZWN1dGUgc3RlcCB3aXRoaW4gdGhlIHByb3BhZ2F0ZWQgdHJhY2UgY29udGV4dFxuICAgICAgcmV0dXJuIGF3YWl0IHdpdGhUcmFjZUNvbnRleHQodHJhY2VDb250ZXh0LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIHN0ZXAgbmFtZSBmcm9tIHRoZSB0b3BpYyBuYW1lXG4gICAgICAgIGNvbnN0IHN0ZXBOYW1lID0gbWV0YWRhdGEucXVldWVOYW1lLnNsaWNlKCdfX3drZl9zdGVwXycubGVuZ3RoKTtcbiAgICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZCgpO1xuICAgICAgICBjb25zdCBpc1ZlcmNlbCA9IHByb2Nlc3MuZW52LlZFUkNFTF9VUkwgIT09IHVuZGVmaW5lZDtcblxuICAgICAgICAvLyBNZW1vaXplZCBhY2Nlc3NvciBmb3IgdGhlIHBlci1ydW4gQUVTLTI1NiBlbmNyeXB0aW9uIGtleS4gVGhlIGZpcnN0XG4gICAgICAgIC8vIGNhbGxlciAodHlwaWNhbGx5IGBoeWRyYXRlU3RlcEFyZ3VtZW50c2AgZm9yIGlucHV0IGRlc2VyaWFsaXphdGlvbixcbiAgICAgICAgLy8gb3Igb25lIG9mIHRoZSBlYXJseS1yZXR1cm4gZGVoeWRyYXRlU3RlcEVycm9yIHBhdGhzIGlmIHN0ZXBfc3RhcnRlZFxuICAgICAgICAvLyBmYWlscykgdHJpZ2dlcnMgdGhlIGFjdHVhbCBmZXRjaCAvIEhLREYgZGVyaXZhdGlvbjsgc3Vic2VxdWVudFxuICAgICAgICAvLyBjYWxsZXJzIGF3YWl0IHRoZSBjYWNoZWQgcHJvbWlzZS4gU3RlcHMgdGhhdCBmYWlsIGJlZm9yZSBhbnlcbiAgICAgICAgLy8gZW5jcnlwdGlvbi1hd2FyZSB3b3JrIGhhcHBlbnMgKGUuZy4gYW4gaW1tZWRpYXRlIHN0ZXBfc3RhcnRlZFxuICAgICAgICAvLyBjb25mbGljdCkgc2tpcCB0aGUgZmV0Y2ggZW50aXJlbHkuXG4gICAgICAgIGNvbnN0IGdldEVuY3J5cHRpb25LZXkgPSBtZW1vaXplRW5jcnlwdGlvbktleSh3b3JsZCwgd29ya2Zsb3dSdW5JZCk7XG5cbiAgICAgICAgLy8gUmVzb2x2ZSBsb2NhbCBhc3luYyB2YWx1ZXMgY29uY3VycmVudGx5IGJlZm9yZSBlbnRlcmluZyB0aGUgdHJhY2Ugc3BhblxuICAgICAgICBjb25zdCBbcG9ydCwgc3BhbktpbmRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICAgIGlzVmVyY2VsID8gdW5kZWZpbmVkIDogZ2V0UG9ydCgpLFxuICAgICAgICAgIGdldFNwYW5LaW5kKCdDT05TVU1FUicpLFxuICAgICAgICBdKTtcblxuICAgICAgICByZXR1cm4gdHJhY2UoXG4gICAgICAgICAgYFNURVAgJHtzdGVwTmFtZX1gLFxuICAgICAgICAgIHsga2luZDogc3BhbktpbmQsIGxpbmtzOiBzcGFuTGlua3MgfSxcbiAgICAgICAgICBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwTmFtZShzdGVwTmFtZSksXG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwQXR0ZW1wdChtZXRhZGF0YS5hdHRlbXB0KSxcbiAgICAgICAgICAgICAgLy8gU3RhbmRhcmQgT1RFTCBtZXNzYWdpbmcgY29udmVudGlvbnNcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ1N5c3RlbSgndmVyY2VsLXF1ZXVlJyksXG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5NZXNzYWdpbmdEZXN0aW5hdGlvbk5hbWUobWV0YWRhdGEucXVldWVOYW1lKSxcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLk1lc3NhZ2luZ01lc3NhZ2VJZChtZXRhZGF0YS5tZXNzYWdlSWQpLFxuICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuTWVzc2FnaW5nT3BlcmF0aW9uVHlwZSgncHJvY2VzcycpLFxuICAgICAgICAgICAgICAuLi5nZXRRdWV1ZU92ZXJoZWFkKHsgcmVxdWVzdGVkQXQgfSksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gTm90ZTogU3RlcCBmdW5jdGlvbiB2YWxpZGF0aW9uIGhhcHBlbnMgYWZ0ZXIgc3RlcF9zdGFydGVkIHNvIHdlIGNhblxuICAgICAgICAgICAgLy8gcHJvcGVybHkgZmFpbCB0aGUgc3RlcCAobm90IHRoZSBydW4pIGlmIHRoZSBmdW5jdGlvbiBpcyBub3QgcmVnaXN0ZXJlZC5cbiAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIHRoZSB3b3JrZmxvdyB0byBoYW5kbGUgdGhlIHN0ZXAgZmFpbHVyZSBncmFjZWZ1bGx5LlxuICAgICAgICAgICAgY29uc3Qgc3RlcEZuID0gZ2V0U3RlcEZ1bmN0aW9uKHN0ZXBOYW1lKTtcblxuICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd05hbWUod29ya2Zsb3dOYW1lKSxcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuSWQod29ya2Zsb3dSdW5JZCksXG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwSWQoc3RlcElkKSxcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBUcmFjZVByb3BhZ2F0ZWQoISF0cmFjZUNvbnRleHQpLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIHN0ZXBfc3RhcnRlZCB2YWxpZGF0ZXMgc3RhdGUgYW5kIHJldHVybnMgdGhlIHN0ZXAgZW50aXR5LCBzbyBubyBzZXBhcmF0ZVxuICAgICAgICAgICAgLy8gd29ybGQuc3RlcHMuZ2V0KCkgY2FsbCBpcyBuZWVkZWQuIFRoZSBzZXJ2ZXIgY2hlY2tzOlxuICAgICAgICAgICAgLy8gLSBTdGVwIG5vdCBpbiB0ZXJtaW5hbCBzdGF0ZSAocmV0dXJucyA0MDkpXG4gICAgICAgICAgICAvLyAtIHJldHJ5QWZ0ZXIgdGltZXN0YW1wIHJlYWNoZWQgKHJldHVybnMgNDI1IHdpdGggUmV0cnktQWZ0ZXIgaGVhZGVyKVxuICAgICAgICAgICAgLy8gLSBXb3JrZmxvdyBzdGlsbCBhY3RpdmUgKHJldHVybnMgNDEwIGlmIGNvbXBsZXRlZClcbiAgICAgICAgICAgIGxldCBzdGVwO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhcnRSZXN1bHQgPSBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9zdGFydGVkJyxcbiAgICAgICAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YTogeyBzdGVwTmFtZSB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGlmICghc3RhcnRSZXN1bHQuc3RlcCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICAgICAgIGBzdGVwX3N0YXJ0ZWQgZXZlbnQgZm9yIFwiJHtzdGVwSWR9XCIgZGlkIG5vdCByZXR1cm4gc3RlcCBlbnRpdHlgXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzdGVwID0gc3RhcnRSZXN1bHQuc3RlcDtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICBpZiAoVGhyb3R0bGVFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmV0cnlSZXRyeUFmdGVyID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgICAxLFxuICAgICAgICAgICAgICAgICAgdHlwZW9mIGVyci5yZXRyeUFmdGVyID09PSAnbnVtYmVyJyA/IGVyci5yZXRyeUFmdGVyIDogMVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgc3RlcFJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICdUaHJvdHRsZWQgYWdhaW4gb24gcmV0cnksIGRlZmVycmluZyB0byBxdWV1ZScsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHJldHJ5QWZ0ZXJTZWNvbmRzOiByZXRyeVJldHJ5QWZ0ZXIsXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4geyB0aW1lb3V0U2Vjb25kczogcmV0cnlSZXRyeUFmdGVyIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKFJ1bkV4cGlyZWRFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgLy8gRXhwZWN0ZWQgd2hlbiBhIHJ1biBpcyBjYW5jZWxsZWQgd2hpbGUgYSBzdGVwIGlzIGluLWZsaWdodC5cbiAgICAgICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgJ1dvcmtmbG93IHJ1biBoYXMgYWxyZWFkeSBjb21wbGV0ZWQsIHNraXBwaW5nIHN0ZXAnLFxuICAgICAgICAgICAgICAgICAgeyBlcnJvck5hbWU6IGVyci5uYW1lLCBlcnJvck1lc3NhZ2U6IGVyci5tZXNzYWdlIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgICAgICAgLy8gU3RlcCBhbHJlYWR5IGluIGEgdGVybWluYWwgc3RhdGUg4oCUIGFub3RoZXIgd29ya2VyIGZpbmlzaGVkXG4gICAgICAgICAgICAgICAgLy8gaXQgb3IgaXQgd2FzIHJldHJpZWQgdG8gY29tcGxldGlvbi4gUmUtZW5xdWV1ZSB0aGUgcGFyZW50XG4gICAgICAgICAgICAgICAgLy8gd29ya2Zsb3cgc28gaXQgY2FuIG9ic2VydmUgdGhlIG91dGNvbWUuXG4gICAgICAgICAgICAgICAgc3RlcFJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgICAgICAgICAnU3RlcCBpbiB0ZXJtaW5hbCBzdGF0ZSwgcmUtZW5xdWV1aW5nIHdvcmtmbG93JyxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBlcnIubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTa2lwcGVkKHRydWUpLFxuICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTa2lwUmVhc29uKCdjb21wbGV0ZWQnKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBzcGFuPy5hZGRFdmVudD8uKCdzdGVwLnNraXBwZWQnLCB7XG4gICAgICAgICAgICAgICAgICAnc2tpcC5yZWFzb24nOiAndGVybWluYWxfc3RhdGUnLFxuICAgICAgICAgICAgICAgICAgJ3N0ZXAubmFtZSc6IHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgJ3N0ZXAuaWQnOiBzdGVwSWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKHdvcmxkLCBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUpLCB7XG4gICAgICAgICAgICAgICAgICBydW5JZDogd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgc2VyaWFsaXplVHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBUb28gZWFybHk6IHJldHJ5QWZ0ZXIgdGltZXN0YW1wIG5vdCByZWFjaGVkIHlldFxuICAgICAgICAgICAgICAvLyBSZXR1cm4gdGltZW91dCB0byBxdWV1ZSBzbyBpdCByZXRyaWVzIGxhdGVyXG4gICAgICAgICAgICAgIGlmIChUb29FYXJseUVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lb3V0U2Vjb25kcyA9IE1hdGgubWF4KDEsIGVyci5yZXRyeUFmdGVyID8/IDEpO1xuICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBSZXRyeVRpbWVvdXRTZWNvbmRzKHRpbWVvdXRTZWNvbmRzKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyBBZGQgc3BhbiBldmVudCBmb3IgZGVsYXllZCByZXRyeVxuICAgICAgICAgICAgICAgIHNwYW4/LmFkZEV2ZW50Py4oJ3N0ZXAuZGVsYXllZCcsIHtcbiAgICAgICAgICAgICAgICAgICdkZWxheS5yZWFzb24nOiAncmV0cnlfYWZ0ZXJfbm90X3JlYWNoZWQnLFxuICAgICAgICAgICAgICAgICAgJ2RlbGF5LnRpbWVvdXRfc2Vjb25kcyc6IHRpbWVvdXRTZWNvbmRzLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAgICAgICAgICAgJ1N0ZXAgcmV0cnlBZnRlciB0aW1lc3RhbXAgbm90IHlldCByZWFjaGVkJyxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0cnlBZnRlclNlY29uZHM6IGVyci5yZXRyeUFmdGVyLFxuICAgICAgICAgICAgICAgICAgICB0aW1lb3V0U2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHRpbWVvdXRTZWNvbmRzIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy8gUmUtdGhyb3cgb3RoZXIgZXJyb3JzXG4gICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3RlcFJ1bnRpbWVMb2dnZXIuZGVidWcoJ1N0ZXAgZXhlY3V0aW9uIGRldGFpbHMnLCB7XG4gICAgICAgICAgICAgIHN0YXR1czogc3RlcC5zdGF0dXMsXG4gICAgICAgICAgICAgIGF0dGVtcHQ6IHN0ZXAuYXR0ZW1wdCxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTdGF0dXMoc3RlcC5zdGF0dXMpLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIFZhbGlkYXRlIHN0ZXAgZnVuY3Rpb24gZXhpc3RzIEFGVEVSIHN0ZXBfc3RhcnRlZCBzbyB3ZSBjYW5cbiAgICAgICAgICAgIC8vIHByb3Blcmx5IGZhaWwgdGhlIHN0ZXAgKG5vdCB0aGUgcnVuKSBpZiB0aGUgZnVuY3Rpb24gaXMgbWlzc2luZy5cbiAgICAgICAgICAgIC8vIFRoaXMgYWxsb3dzIHRoZSB3b3JrZmxvdyB0byBoYW5kbGUgdGhlIHN0ZXAgZmFpbHVyZSBncmFjZWZ1bGx5LFxuICAgICAgICAgICAgLy8gc2ltaWxhciB0byBob3cgRmF0YWxFcnJvciBpcyBoYW5kbGVkLlxuICAgICAgICAgICAgaWYgKCFzdGVwRm4gfHwgdHlwZW9mIHN0ZXBGbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBjb25zdCBlcnIgPSBuZXcgU3RlcE5vdFJlZ2lzdGVyZWRFcnJvcihzdGVwTmFtZSk7XG5cbiAgICAgICAgICAgICAgc3RlcFJ1bnRpbWVMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgJ1N0ZXAgZnVuY3Rpb24gbm90IHJlZ2lzdGVyZWQsIGZhaWxpbmcgc3RlcCAobm90IHJ1biknLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVycm9yTmFtZTogZXJyLm5hbWUsXG4gICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVyci5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgZXJyb3JTdGFjazogZXJyLnN0YWNrLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAvLyBGYWlsIHRoZSBzdGVwIHZpYSBldmVudCAoZXZlbnQtc291cmNlZCBhcmNoaXRlY3R1cmUpXG4gICAgICAgICAgICAgIC8vIFRoaXMgbWF0Y2hlcyB0aGUgRmF0YWxFcnJvciBwYXR0ZXJuIC0gZmFpbCB0aGUgc3RlcCBhbmQgcmUtcXVldWUgd29ya2Zsb3dcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9mYWlsZWQnLFxuICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KClcbiAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9IGNhdGNoIChzdGVwRmFpbEVycikge1xuICAgICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKHN0ZXBGYWlsRXJyKSkge1xuICAgICAgICAgICAgICAgICAgLy8gU3RlcCBhbHJlYWR5IHRyYW5zaXRpb25lZCB0byBhIHRlcm1pbmFsIHN0YXRlIOKAlCBkdXBsaWNhdGVcbiAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5IG9yIGNvbmN1cnJlbnQgY2FuY2VsbGF0aW9uLiBEcm9wIHNpbGVudGx5LlxuICAgICAgICAgICAgICAgICAgc3RlcFJ1bnRpbWVMb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgc3RlcCBmb3IgbWlzc2luZyBmdW5jdGlvbiwgYnV0IHN0ZXAgaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZTogc3RlcEZhaWxFcnIubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IHN0ZXBGYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IHN0ZXBGYWlsRXJyO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBTdGF0dXMoJ2ZhaWxlZCcpLFxuICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwRmF0YWxFcnJvcih0cnVlKSxcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgLy8gUmUtaW52b2tlIHRoZSB3b3JrZmxvdyB0byBoYW5kbGUgdGhlIGZhaWxlZCBzdGVwXG4gICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZSh3b3JsZCwgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lKSwge1xuICAgICAgICAgICAgICAgIHJ1bklkOiB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgc2VyaWFsaXplVHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG1heFJldHJpZXMgPSBzdGVwRm4ubWF4UmV0cmllcyA/PyBERUZBVUxUX1NURVBfTUFYX1JFVFJJRVM7XG5cbiAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcE1heFJldHJpZXMobWF4UmV0cmllcyksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbGV0IHJlc3VsdDogdW5rbm93bjtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgbWF4IHJldHJpZXMgQUZURVIgc3RlcF9zdGFydGVkIChhdHRlbXB0IHdhcyBqdXN0IGluY3JlbWVudGVkKVxuICAgICAgICAgICAgLy8gc3RlcC5hdHRlbXB0IHRyYWNrcyBob3cgbWFueSB0aW1lcyBzdGVwX3N0YXJ0ZWQgaGFzIGJlZW4gY2FsbGVkLlxuICAgICAgICAgICAgLy8gTm90ZTogbWF4UmV0cmllcyBpcyB0aGUgbnVtYmVyIG9mIFJFVFJJRVMgYWZ0ZXIgdGhlIGZpcnN0IGF0dGVtcHQsIHNvIHRvdGFsIGF0dGVtcHRzID0gbWF4UmV0cmllcyArIDFcbiAgICAgICAgICAgIC8vIFVzZSA+IGhlcmUgKG5vdCA+PSkgYmVjYXVzZSB0aGlzIGd1YXJkcyBhZ2FpbnN0IHJlLWludm9jYXRpb24gQUZURVIgYWxsIGF0dGVtcHRzIGFyZSB1c2VkLlxuICAgICAgICAgICAgLy8gVGhlIHBvc3QtZmFpbHVyZSBjaGVjayB1c2VzID49IHRvIGRlY2lkZSB3aGV0aGVyIHRvIHJldHJ5IGFmdGVyIGEgZmFpbHVyZS5cbiAgICAgICAgICAgIGlmIChzdGVwLmF0dGVtcHQgPiBtYXhSZXRyaWVzICsgMSkge1xuICAgICAgICAgICAgICBjb25zdCByZXRyeUNvdW50ID0gc3RlcC5hdHRlbXB0IC0gMTtcbiAgICAgICAgICAgICAgLy8gUGVyc2lzdGVkIG1lc3NhZ2Ug4oCUIGtlcHQgc2hvcnQsIG5vIG1hY2hpbmUgYHN0ZXBOYW1lYCxcbiAgICAgICAgICAgICAgLy8gc2luY2Ugb2JzZXJ2YWJpbGl0eSBhbHJlYWR5IGF0dHJpYnV0ZXMgdGhlIGV2ZW50IHRvIGFcbiAgICAgICAgICAgICAgLy8gc3BlY2lmaWMgc3RlcC5cbiAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYFN0ZXAgZXhjZWVkZWQgbWF4IHJldHJpZXMgKCR7cmV0cnlDb3VudH0gJHtwbHVyYWxpemUoJ3JldHJ5JywgJ3JldHJpZXMnLCByZXRyeUNvdW50KX0pYDtcbiAgICAgICAgICAgICAgc3RlcExvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICBgU3RlcCAke2Zvcm1hdFN0ZXBOYW1lKHN0ZXBOYW1lKX0gZXhjZWVkZWQgbWF4IHJldHJpZXMgKCR7cmV0cnlDb3VudH0gJHtwbHVyYWxpemUoJ3JldHJ5JywgJ3JldHJpZXMnLCByZXRyeUNvdW50KX0pYCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICByZXRyeUNvdW50LFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgLy8gRmFpbCB0aGUgc3RlcCB2aWEgZXZlbnQgKGV2ZW50LXNvdXJjZWQgYXJjaGl0ZWN0dXJlKS5cbiAgICAgICAgICAgICAgLy8gUHJlc2VydmUgdGhlIHByaW9yIGF0dGVtcHQncyBzZXJpYWxpemVkIGVycm9yIGFzIHRoZSBjYXVzZSBzb1xuICAgICAgICAgICAgICAvLyB0aGUgdW5kZXJseWluZyBmYWlsdXJlIGlzIHJlY292ZXJhYmxlIGZyb20gYHN0ZXAuZXJyb3IuY2F1c2VgXG4gICAgICAgICAgICAgIC8vIGFmdGVyIGh5ZHJhdGlvbiwgd2l0aG91dCBmb3JjaW5nIGNvbnN1bWVycyB0byB3YWxrIHRoZVxuICAgICAgICAgICAgICAvLyBzdGVwX3JldHJ5aW5nIGV2ZW50IGhpc3RvcnkuIE1pcnJvcnMgdGhlIHBvc3QtZmFpbHVyZSBwYXRoXG4gICAgICAgICAgICAgIC8vIGJlbG93IHRoYXQgd3JhcHMgdGhlIGxpdmUgYGVycmAgYXMgY2F1c2UuXG4gICAgICAgICAgICAgIGNvbnN0IHdyYXBwZWRFcnJvciA9IG5ldyBGYXRhbEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICAgIGlmIChzdGVwLmVycm9yICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgKHdyYXBwZWRFcnJvciBhcyBFcnJvcikuY2F1c2UgPSBhd2FpdCBoeWRyYXRlU3RlcEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBzdGVwLmVycm9yLFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBnZXRFbmNyeXB0aW9uS2V5KClcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAvLyBJZ25vcmU6IGJlc3QtZWZmb3J0IGNhdXNlIGF0dGFjaG1lbnQsIHRoZSB3cmFwcGluZ1xuICAgICAgICAgICAgICAgICAgLy8gRmF0YWxFcnJvciBzdGFjay9tZXNzYWdlIHN0aWxsIHN1cmZhY2UgdGhlIGZhaWx1cmUuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfZmFpbGVkJyxcbiAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVTdGVwRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZ2V0RW5jcnlwdGlvbktleSgpXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB7IHJlcXVlc3RJZCB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgLy8gU3RlcCBhbHJlYWR5IHRyYW5zaXRpb25lZCB0byBhIHRlcm1pbmFsIHN0YXRlIOKAlCBkdXBsaWNhdGVcbiAgICAgICAgICAgICAgICAgIC8vIGRlbGl2ZXJ5IG9yIGNvbmN1cnJlbnQgY29tcGxldGlvbi4gRHJvcCBzaWxlbnRseS5cbiAgICAgICAgICAgICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICdUcmllZCBmYWlsaW5nIHN0ZXAsIGJ1dCBzdGVwIGhhcyBhbHJlYWR5IGZpbmlzaGVkLicsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IGVyci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJldHJ5RXhoYXVzdGVkKHRydWUpLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAvLyBSZS1pbnZva2UgdGhlIHdvcmtmbG93IHRvIGhhbmRsZSB0aGUgZmFpbGVkIHN0ZXBcbiAgICAgICAgICAgICAgYXdhaXQgcXVldWVNZXNzYWdlKHdvcmxkLCBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUpLCB7XG4gICAgICAgICAgICAgICAgcnVuSWQ6IHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyOiBhd2FpdCBzZXJpYWxpemVUcmFjZUNhcnJpZXIoKSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gLS0tIEluZnJhc3RydWN0dXJlOiBwcmVwYXJlIHN0ZXAgaW5wdXQgLS0tXG4gICAgICAgICAgICAvLyBOZXR3b3JrL3NlcnZlciBlcnJvcnMgcHJvcGFnYXRlIHRvIHRoZSBxdWV1ZSBoYW5kbGVyIGZvciByZXRyeS5cbiAgICAgICAgICAgIC8vIFdvcmtmbG93UnVudGltZUVycm9yIChkYXRhIGludGVncml0eSBpc3N1ZXMpIGFyZSBmYXRhbCDigJQgcmV0cnlpbmdcbiAgICAgICAgICAgIC8vIHdvbid0IGZpeCB0aGVtLCBzbyB3ZSByZS1xdWV1ZSB0aGUgd29ya2Zsb3cgdG8gc3VyZmFjZSB0aGUgZXJyb3IuXG4gICAgICAgICAgICAvLyBzdGVwX3N0YXJ0ZWQgYWxyZWFkeSB2YWxpZGF0ZWQgdGhlIHN0ZXAgaXMgaW4gdmFsaWQgc3RhdGUgKHBlbmRpbmcvcnVubmluZylcbiAgICAgICAgICAgIC8vIGFuZCByZXR1cm5lZCB0aGUgdXBkYXRlZCBzdGVwIGVudGl0eSB3aXRoIGluY3JlbWVudGVkIGF0dGVtcHRcblxuICAgICAgICAgICAgLy8gc3RlcC5hdHRlbXB0IGlzIG5vdyB0aGUgY3VycmVudCBhdHRlbXB0IG51bWJlciAoYWZ0ZXIgaW5jcmVtZW50KVxuICAgICAgICAgICAgY29uc3QgYXR0ZW1wdCA9IHN0ZXAuYXR0ZW1wdDtcblxuICAgICAgICAgICAgaWYgKCFzdGVwLnN0YXJ0ZWRBdCkge1xuICAgICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgU3RlcCBcIiR7c3RlcElkfVwiIGhhcyBubyBcInN0YXJ0ZWRBdFwiIHRpbWVzdGFtcGA7XG4gICAgICAgICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLmVycm9yKCdGYXRhbCBydW50aW1lIGVycm9yIGR1cmluZyBzdGVwIHNldHVwJywge1xuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfZmFpbGVkJyxcbiAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVTdGVwRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmF0YWxFcnJvcihlcnJvck1lc3NhZ2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKVxuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGZhaWxFcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhmYWlsRXJyKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aHJvdyBmYWlsRXJyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIFJlLXF1ZXVlIHRoZSB3b3JrZmxvdyBzbyBpdCBjYW4gcHJvY2VzcyB0aGUgc3RlcCBmYWlsdXJlXG4gICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZSh3b3JsZCwgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lKSwge1xuICAgICAgICAgICAgICAgIHJ1bklkOiB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgc2VyaWFsaXplVHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDYXB0dXJlIHN0YXJ0ZWRBdCBmb3IgdXNlIGluIGFzeW5jIGNhbGxiYWNrIChUeXBlU2NyaXB0IG5hcnJvd2luZyBkb2Vzbid0IHBlcnNpc3QpXG4gICAgICAgICAgICBjb25zdCBzdGVwU3RhcnRlZEF0ID0gc3RlcC5zdGFydGVkQXQ7XG5cbiAgICAgICAgICAgIC8vIFJlc29sdmUgdGhlIGVuY3J5cHRpb24ga2V5IG5vdyB0aGF0IHdlJ3JlIGNvbW1pdHRlZCB0byBydW5uaW5nXG4gICAgICAgICAgICAvLyB1c2VyIGNvZGU6IGlucHV0IGh5ZHJhdGlvbiBuZWVkcyBpdCwgYW5kIGBjb250ZXh0U3RvcmFnZWAgKGFuZFxuICAgICAgICAgICAgLy8gYW55IHVzZXItY29kZSBwYXRocyB0aGF0IHJ1biBpbnNpZGUgaXQpIGNhcHR1cmUgdGhlIHJlc29sdmVkXG4gICAgICAgICAgICAvLyB2YWx1ZS4gVHJpZ2dlcnMgdGhlIHVuZGVybHlpbmcgd29ybGQgLyBLTVMgZmV0Y2ggb25jZSwgd2l0aFxuICAgICAgICAgICAgLy8gc3Vic2VxdWVudCBkZWh5ZHJhdGUgcGF0aHMgcmV1c2luZyB0aGUgbWVtb2l6ZWQgcmVzdWx0LlxuICAgICAgICAgICAgY29uc3QgZW5jcnlwdGlvbktleSA9IGF3YWl0IGdldEVuY3J5cHRpb25LZXkoKTtcblxuICAgICAgICAgICAgLy8gSHlkcmF0ZSB0aGUgc3RlcCBpbnB1dCBhcmd1bWVudHMsIGNsb3N1cmUgdmFyaWFibGVzLCBhbmQgdGhpc1ZhbFxuICAgICAgICAgICAgLy8gTk9URTogVGhpcyBjYXB0dXJlcyBvbmx5IHRoZSBzeW5jaHJvbm91cyBwb3J0aW9uIG9mIGh5ZHJhdGlvbi4gQW55IGFzeW5jXG4gICAgICAgICAgICAvLyBvcGVyYXRpb25zIChlLmcuLCBzdHJlYW0gbG9hZGluZykgYXJlIGFkZGVkIHRvIGBvcHNgIGFuZCBleGVjdXRlZCBsYXRlclxuICAgICAgICAgICAgLy8gdmlhIFByb21pc2UuYWxsKG9wcykgLSB0aGVpciB0aW1pbmcgaXMgbm90IGluY2x1ZGVkIGluIHRoaXMgbWVhc3VyZW1lbnQuXG4gICAgICAgICAgICBjb25zdCBvcHM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuICAgICAgICAgICAgY29uc3QgaHlkcmF0ZWRJbnB1dCA9IGF3YWl0IHRyYWNlKFxuICAgICAgICAgICAgICAnc3RlcC5oeWRyYXRlJyxcbiAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgIGFzeW5jIChoeWRyYXRlU3BhbikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgaHlkcmF0ZVN0ZXBBcmd1bWVudHMoXG4gICAgICAgICAgICAgICAgICBzdGVwLmlucHV0LFxuICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICBvcHNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgICAgICAgICAgIGh5ZHJhdGVTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwQXJndW1lbnRzQ291bnQocmVzdWx0LmFyZ3MubGVuZ3RoKSxcbiAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5RdWV1ZURlc2VyaWFsaXplVGltZU1zKGR1cmF0aW9uTXMpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSBoeWRyYXRlZElucHV0LmFyZ3M7XG4gICAgICAgICAgICBjb25zdCB0aGlzVmFsID0gaHlkcmF0ZWRJbnB1dC50aGlzVmFsID8/IG51bGw7XG5cbiAgICAgICAgICAgIC8vIC0tLSBVc2VyIGNvZGUgZXhlY3V0aW9uIC0tLVxuICAgICAgICAgICAgLy8gT25seSBlcnJvcnMgZnJvbSBzdGVwRm4uYXBwbHkoKSAodXNlciBzdGVwIGNvZGUpIHNob3VsZCBwcm9kdWNlXG4gICAgICAgICAgICAvLyBzdGVwX2ZhaWxlZC9zdGVwX3JldHJ5aW5nLiBJbmZyYXN0cnVjdHVyZSBlcnJvcnMgKG5ldHdvcmssIHNlcnZlcilcbiAgICAgICAgICAgIC8vIG11c3QgcHJvcGFnYXRlIHRvIHRoZSBxdWV1ZSBoYW5kbGVyIGZvciBhdXRvbWF0aWMgcmV0cnkuXG4gICAgICAgICAgICBsZXQgdXNlckNvZGVFcnJvcjogdW5rbm93bjtcbiAgICAgICAgICAgIGxldCB1c2VyQ29kZUZhaWxlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICBjb25zdCBleGVjdXRpb25TdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgdHJhY2UoJ3N0ZXAuZXhlY3V0ZScsIHt9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IGNvbnRleHRTdG9yYWdlLnJ1bihcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc3RlcE1ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBTdGFydGVkQXQ6IG5ldyBEYXRlKCtzdGVwU3RhcnRlZEF0KSxcbiAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd01ldGFkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dTdGFydGVkQXQ6IG5ldyBEYXRlKCt3b3JrZmxvd1N0YXJ0ZWRBdCksXG4gICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogdGhlcmUgc2hvdWxkIGJlIGEgZ2V0VXJsIG1ldGhvZCBvbiB0aGUgd29ybGQgaW50ZXJmYWNlIGl0c2VsZi4gVGhpc1xuICAgICAgICAgICAgICAgICAgICAgIC8vIHNvbHV0aW9uIG9ubHkgd29ya3MgZm9yIHZlcmNlbCArIGxvY2FsIHdvcmxkcy5cbiAgICAgICAgICAgICAgICAgICAgICB1cmw6IGlzVmVyY2VsXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGBodHRwczovLyR7cHJvY2Vzcy5lbnYuVkVSQ0VMX1VSTH1gXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGBodHRwOi8vbG9jYWxob3N0OiR7cG9ydCA/PyAzMDAwfWAsXG4gICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXM6IHsgZW5jcnlwdGlvbjogISFlbmNyeXB0aW9uS2V5IH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG9wcyxcbiAgICAgICAgICAgICAgICAgICAgY2xvc3VyZVZhcnM6IGh5ZHJhdGVkSW5wdXQuY2xvc3VyZVZhcnMsXG4gICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgKCkgPT4gc3RlcEZuLmFwcGx5KHRoaXNWYWwsIGFyZ3MpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgdXNlckNvZGVFcnJvciA9IGVycjtcbiAgICAgICAgICAgICAgdXNlckNvZGVGYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZXhlY3V0aW9uVGltZU1zID0gRGF0ZS5ub3coKSAtIGV4ZWN1dGlvblN0YXJ0VGltZTtcblxuICAgICAgICAgICAgY2FuY2VsQWJvcnRSZWFkZXJzKC4uLmFyZ3MsIHRoaXNWYWwsIGh5ZHJhdGVkSW5wdXQuY2xvc3VyZVZhcnMpO1xuXG4gICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlF1ZXVlRXhlY3V0aW9uVGltZU1zKGV4ZWN1dGlvblRpbWVNcyksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gLS0tIERlaHlkcmF0ZSAoc2VyaWFsaXplKSB0aGUgc3RlcCdzIHJldHVybiB2YWx1ZSAtLS1cbiAgICAgICAgICAgIC8vIEEgbm9uLXNlcmlhbGl6YWJsZSByZXR1cm4gdmFsdWUgaXMgYSB1c2VyLWNvZGUgYnVnLCBub3QgYW5cbiAgICAgICAgICAgIC8vIGluZnJhc3RydWN0dXJlIGZhaWx1cmUuIFJvdXRlIGl0IHRocm91Z2ggdGhlIHNhbWUgc3RlcC1mYWlsdXJlXG4gICAgICAgICAgICAvLyBwYXRoIGFzIGEgdGhyb3duIGVycm9yIHNvIFNlcmlhbGl6YXRpb25FcnJvciAod2hpY2ggaXMgbWFya2VkXG4gICAgICAgICAgICAvLyBgZmF0YWw6IHRydWVgKSBzaG9ydC1jaXJjdWl0cyB0aGUgcmV0cnkgbG9vcCBpbnN0ZWFkIG9mXG4gICAgICAgICAgICAvLyBidWJibGluZyBhcyBhbiBIVFRQIDUwMCBhbmQgYnVybmluZyB0aHJvdWdoIGFsbCA0IHF1ZXVlXG4gICAgICAgICAgICAvLyBkZWxpdmVyaWVzIG9uIGEgZ3VhcmFudGVlZC10by1mYWlsIG1lc3NhZ2UuXG4gICAgICAgICAgICBpZiAoIXVzZXJDb2RlRmFpbGVkKSB7XG4gICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgdHJhY2UoXG4gICAgICAgICAgICAgICAgICAnc3RlcC5kZWh5ZHJhdGUnLFxuICAgICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICAgICBhc3luYyAoZGVoeWRyYXRlU3BhbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWh5ZHJhdGVkID0gYXdhaXQgZGVoeWRyYXRlU3RlcFJldHVyblZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgICAgICAgICAgICAgICAgb3BzXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uTXMgPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgICAgICAgICAgICAgICBkZWh5ZHJhdGVTcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuUXVldWVTZXJpYWxpemVUaW1lTXMoZHVyYXRpb25NcyksXG4gICAgICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBSZXN1bHRUeXBlKHR5cGVvZiBkZWh5ZHJhdGVkKSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWh5ZHJhdGVkO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIHVzZXJDb2RlRXJyb3IgPSBlcnI7XG4gICAgICAgICAgICAgICAgdXNlckNvZGVGYWlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIC0tLSBIYW5kbGUgdXNlciBjb2RlIGVycm9ycyAtLS1cbiAgICAgICAgICAgIGlmICh1c2VyQ29kZUZhaWxlZCkge1xuICAgICAgICAgICAgICBjb25zdCBlcnIgPSB1c2VyQ29kZUVycm9yO1xuXG4gICAgICAgICAgICAgIC8vIEluZnJhc3RydWN0dXJlIGVycm9ycyB0aGF0IHNvbWVob3cgc3VyZmFjZWQgdGhyb3VnaCB1c2VyIGNvZGVcbiAgICAgICAgICAgICAgLy8gc2hvdWxkIHByb3BhZ2F0ZSB0byB0aGUgcXVldWUgaGFuZGxlciBmb3IgcmV0cnksIG5vdCBjb25zdW1lXG4gICAgICAgICAgICAgIC8vIHN0ZXAgYXR0ZW1wdHMuXG4gICAgICAgICAgICAgIGlmIChSdW5FeHBpcmVkRXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgIC8vIFdvcmtmbG93IGhhcyBhbHJlYWR5IGNvbXBsZXRlZCwgc28gbm8tb3BcbiAgICAgICAgICAgICAgICBzdGVwTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAnV29ya2Zsb3cgcnVuIGFscmVhZHkgY29tcGxldGVkLCBza2lwcGluZyBzdGVwJyxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoV29ya2Zsb3dXb3JsZEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyLnN0YXR1cyAhPT0gdW5kZWZpbmVkICYmIGVyci5zdGF0dXMgPj0gNTAwKSB7XG4gICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gV3JhcCBBYm9ydEVycm9yIGluIEZhdGFsRXJyb3Ig4oCUIGFib3J0IGlzIGludGVudGlvbmFsIGNhbmNlbGxhdGlvbiwgbm90IHJldHJ5YWJsZVxuICAgICAgICAgICAgICBsZXQgZWZmZWN0aXZlRXJyOiB1bmtub3duID0gZXJyO1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZXJyIGluc3RhbmNlb2YgRXJyb3IgJiZcbiAgICAgICAgICAgICAgICBlcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InICYmXG4gICAgICAgICAgICAgICAgIUZhdGFsRXJyb3IuaXMoZXJyKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmYXRhbEVyciA9IG5ldyBGYXRhbEVycm9yKGBBYm9ydGVkOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgICAgICAgICAgIGZhdGFsRXJyLnN0YWNrID0gZXJyLnN0YWNrO1xuICAgICAgICAgICAgICAgIGVmZmVjdGl2ZUVyciA9IGZhdGFsRXJyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRFcnJvciA9IGF3YWl0IG5vcm1hbGl6ZVVua25vd25FcnJvcihlZmZlY3RpdmVFcnIpO1xuICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkU3RhY2sgPVxuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRFcnJvci5zdGFjayB8fCBnZXRFcnJvclN0YWNrKGVmZmVjdGl2ZUVycikgfHwgJyc7XG5cbiAgICAgICAgICAgICAgLy8gUmVjb3JkIGV4Y2VwdGlvbiBmb3IgT1RFTCBlcnJvciB0cmFja2luZ1xuICAgICAgICAgICAgICBpZiAoZWZmZWN0aXZlRXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBzcGFuPy5yZWNvcmRFeGNlcHRpb24/LihlZmZlY3RpdmVFcnIpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGVycm9yIGNhdGVnb3J5IGFuZCByZXRyeWFiaWxpdHlcbiAgICAgICAgICAgICAgY29uc3QgaXNGYXRhbCA9IEZhdGFsRXJyb3IuaXMoZWZmZWN0aXZlRXJyKTtcbiAgICAgICAgICAgICAgY29uc3QgaXNSZXRyeWFibGUgPSBSZXRyeWFibGVFcnJvci5pcyhlZmZlY3RpdmVFcnIpO1xuICAgICAgICAgICAgICBjb25zdCBlcnJvckNhdGVnb3J5ID0gaXNGYXRhbFxuICAgICAgICAgICAgICAgID8gJ2ZhdGFsJ1xuICAgICAgICAgICAgICAgIDogaXNSZXRyeWFibGVcbiAgICAgICAgICAgICAgICAgID8gJ3JldHJ5YWJsZSdcbiAgICAgICAgICAgICAgICAgIDogJ3RyYW5zaWVudCc7XG5cbiAgICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBFcnJvck5hbWUoZ2V0RXJyb3JOYW1lKGVycikpLFxuICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwRXJyb3JNZXNzYWdlKG5vcm1hbGl6ZWRFcnJvci5tZXNzYWdlKSxcbiAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuRXJyb3JUeXBlKGdldEVycm9yTmFtZShlcnIpKSxcbiAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuRXJyb3JDYXRlZ29yeShlcnJvckNhdGVnb3J5KSxcbiAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuRXJyb3JSZXRyeWFibGUoIWlzRmF0YWwpLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBpZiAoaXNGYXRhbCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gZGVzY3JpYmVFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZyaWVuZGx5U3RlcCA9IGZvcm1hdFN0ZXBOYW1lKHN0ZXBOYW1lKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmcmFtaW5nID1cbiAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLmF0dHJpYnV0aW9uID09PSAnc2RrJ1xuICAgICAgICAgICAgICAgICAgICA/IGBTdGVwICR7ZnJpZW5kbHlTdGVwfSBmYWlsZWQgd2l0aCBhIEZhdGFsRXJyb3IgZnJvbSB0aGUgU0RLIHJ1bnRpbWUg4oCUIGJ1YmJsaW5nIHVwIHRvIHBhcmVudCB3b3JrZmxvd2BcbiAgICAgICAgICAgICAgICAgICAgOiBgU3RlcCAke2ZyaWVuZGx5U3RlcH0gdGhyZXcgYSBGYXRhbEVycm9yIOKAlCBidWJibGluZyB1cCB0byBwYXJlbnQgd29ya2Zsb3dgO1xuICAgICAgICAgICAgICAgIC8vIE1pcnJvciB0aGUgd29ya2Zsb3ctbGV2ZWwgbG9nIGZvcm1hdHRpbmc6IHB1dCB0aGUgZnJhbWluZyArXG4gICAgICAgICAgICAgICAgLy8gc3RhY2sgaW50byB0aGUgbWVzc2FnZSBzbyBjb25zb2xlLmVycm9yIHJlbmRlcnMgdGhlIHN0YWNrXG4gICAgICAgICAgICAgICAgLy8gaW5saW5lLCBhbmQga2VlcCB0aGUgbWV0YWRhdGEgb2JqZWN0IHNtYWxsIHdpdGggb25seSB0aGVcbiAgICAgICAgICAgICAgICAvLyBzdHJ1Y3R1cmVkIGZpZWxkcyB0aGF0IGxvZyBkcmFpbnMgd2FudCB0byBpbmRleC5cbiAgICAgICAgICAgICAgICAvLyBObyBgaGludGAgZmllbGQgaGVyZSDigJQgYWN0aW9uYWJsZSBoaW50IHRleHQgbGl2ZXMgb24gdGhlXG4gICAgICAgICAgICAgICAgLy8gZXJyb3IgbWVzc2FnZSBpdHNlbGYgKHNvIGl0IHN1cnZpdmVzIHNlcmlhbGl6YXRpb24g4oaSXG4gICAgICAgICAgICAgICAgLy8gZXZlbnQgbG9nIOKGkiBvYnNlcnZhYmlsaXR5IHJlaHlkcmF0ZSksIGFuZCBhZGRpbmcgaXRcbiAgICAgICAgICAgICAgICAvLyBhZ2FpbiBoZXJlIGp1c3QgZHVwbGljYXRlcyBpdCBvbiBzdGRlcnIuXG4gICAgICAgICAgICAgICAgc3RlcExvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgIGAke2ZyYW1pbmd9XFxuJHtub3JtYWxpemVkU3RhY2sgfHwgbm9ybWFsaXplZEVycm9yLm1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JBdHRyaWJ1dGlvbjogZGVzY3JpcHRpb24uYXR0cmlidXRpb24sXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZTogbm9ybWFsaXplZEVycm9yLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogbm9ybWFsaXplZEVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAvLyBGYWlsIHRoZSBzdGVwIHZpYSBldmVudCAoZXZlbnQtc291cmNlZCBhcmNoaXRlY3R1cmUpLlxuICAgICAgICAgICAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgb3JpZ2luYWwgdGhyb3duIHZhbHVlIHNvIGl0cyBmdWxsIHR5cGUgaWRlbnRpdHlcbiAgICAgICAgICAgICAgICAvLyBhbmQgY3VzdG9tIHByb3BlcnRpZXMgcm91bmQtdHJpcCB0aHJvdWdoIHRoZSBldmVudCBsb2cuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IHN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGF3YWl0IGRlaHlkcmF0ZVN0ZXBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uS2V5XG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoc3RlcEZhaWxFcnIpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKHN0ZXBGYWlsRXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTdGVwIGFscmVhZHkgaW4gdGVybWluYWwgc3RhdGUg4oCUIGlkZW1wb3RlbnQuXG4gICAgICAgICAgICAgICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgc3RlcCwgYnV0IHN0ZXAgaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IHN0ZXBGYWlsRXJyLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IHN0ZXBGYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB0aHJvdyBzdGVwRmFpbEVycjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwU3RhdHVzKCdmYWlsZWQnKSxcbiAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwRmF0YWxFcnJvcih0cnVlKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXhSZXRyaWVzID1cbiAgICAgICAgICAgICAgICAgIHN0ZXBGbi5tYXhSZXRyaWVzID8/IERFRkFVTFRfU1RFUF9NQVhfUkVUUklFUztcbiAgICAgICAgICAgICAgICAvLyBzdGVwLmF0dGVtcHQgd2FzIGluY3JlbWVudGVkIGJ5IHN0ZXBfc3RhcnRlZCwgdXNlIGl0IGhlcmVcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50QXR0ZW1wdCA9IHN0ZXAuYXR0ZW1wdDtcblxuICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBBdHRlbXB0KGN1cnJlbnRBdHRlbXB0KSxcbiAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwTWF4UmV0cmllcyhtYXhSZXRyaWVzKSxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIC8vIE5vdGU6IG1heFJldHJpZXMgaXMgdGhlIG51bWJlciBvZiBSRVRSSUVTIGFmdGVyIHRoZSBmaXJzdCBhdHRlbXB0LCBzbyB0b3RhbCBhdHRlbXB0cyA9IG1heFJldHJpZXMgKyAxXG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRBdHRlbXB0ID49IG1heFJldHJpZXMgKyAxKSB7XG4gICAgICAgICAgICAgICAgICAvLyBNYXggcmV0cmllcyByZWFjaGVkXG4gICAgICAgICAgICAgICAgICBjb25zdCByZXRyeUNvdW50ID0gc3RlcC5hdHRlbXB0IC0gMTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gZGVzY3JpYmVFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgZnJpZW5kbHlTdGVwID0gZm9ybWF0U3RlcE5hbWUoc3RlcE5hbWUpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgZnJhbWluZyA9XG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLmF0dHJpYnV0aW9uID09PSAnc2RrJ1xuICAgICAgICAgICAgICAgICAgICAgID8gYFN0ZXAgJHtmcmllbmRseVN0ZXB9IGhpdCBtYXggcmV0cmllcyBvbiBhbiBTREsgcnVudGltZSBlcnJvciDigJQgYnViYmxpbmcgdG8gcGFyZW50IHdvcmtmbG93YFxuICAgICAgICAgICAgICAgICAgICAgIDogYFN0ZXAgJHtmcmllbmRseVN0ZXB9IGhpdCBtYXggcmV0cmllcyDigJQgYnViYmxpbmcgZXJyb3IgdGhyb3duIGJ5IHlvdXIgc3RlcCB0byB0aGUgcGFyZW50IHdvcmtmbG93YDtcbiAgICAgICAgICAgICAgICAgIHN0ZXBMb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGAke2ZyYW1pbmd9XFxuJHtub3JtYWxpemVkU3RhY2sgfHwgbm9ybWFsaXplZEVycm9yLm1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBJZCxcbiAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0OiBzdGVwLmF0dGVtcHQsXG4gICAgICAgICAgICAgICAgICAgICAgcmV0cnlDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvckF0dHJpYnV0aW9uOiBkZXNjcmlwdGlvbi5hdHRyaWJ1dGlvbixcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IG5vcm1hbGl6ZWRFcnJvci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogbm9ybWFsaXplZEVycm9yLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAvLyBEb24ndCBpbmNsdWRlIHRoZSBtYWNoaW5lIHN0ZXAgbmFtZSBpbiB0aGUgcGVyc2lzdGVkXG4gICAgICAgICAgICAgICAgICAvLyBlcnJvciBtZXNzYWdlIOKAlCBvYnNlcnZhYmlsaXR5IGFscmVhZHkgc2hvd3Mgd2hpY2ggc3RlcFxuICAgICAgICAgICAgICAgICAgLy8gcHJvZHVjZWQgdGhlIGV2ZW50LCBhbmQgYHN0ZXBOYW1lOiAnc3RlcC8vLi8uLi4vZm9vJ2BcbiAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSB0aXRsZSBpcyBqdXN0IG5vaXNlLiBUaGUgQ0xJIGxvZ2dlciByZW5kZXJzXG4gICAgICAgICAgICAgICAgICAvLyBgU3RlcCBmb28gKC4vLi4uKSBoaXQgbWF4IHJldHJpZXNgIHNlcGFyYXRlbHkuXG4gICAgICAgICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgU3RlcCBmYWlsZWQgYWZ0ZXIgJHttYXhSZXRyaWVzfSAke3BsdXJhbGl6ZSgncmV0cnknLCAncmV0cmllcycsIG1heFJldHJpZXMpfTogJHtub3JtYWxpemVkRXJyb3IubWVzc2FnZX1gO1xuICAgICAgICAgICAgICAgICAgLy8gRmFpbCB0aGUgc3RlcCB2aWEgZXZlbnQgKGV2ZW50LXNvdXJjZWQgYXJjaGl0ZWN0dXJlKS5cbiAgICAgICAgICAgICAgICAgIC8vIFdyYXAgdGhlIG9yaWdpbmFsIGVycm9yIHdpdGggYSBGYXRhbEVycm9yIHRoYXQgcHJlc2VydmVzXG4gICAgICAgICAgICAgICAgICAvLyB0aGUgd3JhcHBlZCBtZXNzYWdlIHBsdXMgdGhlIG9yaWdpbmFsIHRocm93biB2YWx1ZSBhc1xuICAgICAgICAgICAgICAgICAgLy8gYGNhdXNlYCBzbyBpdCdzIHJlY292ZXJhYmxlIGFmdGVyIGh5ZHJhdGlvbi5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHdyYXBwZWRFcnJvciA9IG5ldyBGYXRhbEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAod3JhcHBlZEVycm9yIGFzIEVycm9yKS5jYXVzZSA9IGVycjtcbiAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkU3RhY2spIHdyYXBwZWRFcnJvci5zdGFjayA9IG5vcm1hbGl6ZWRTdGFjaztcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudFR5cGU6ICdzdGVwX2ZhaWxlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVTdGVwRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZEVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHN0ZXBGYWlsRXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKHN0ZXBGYWlsRXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXAgYWxyZWFkeSBpbiB0ZXJtaW5hbCBzdGF0ZSDigJQgaWRlbXBvdGVudC5cbiAgICAgICAgICAgICAgICAgICAgICBzdGVwUnVudGltZUxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGZhaWxpbmcgc3RlcCwgYnV0IHN0ZXAgaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBzdGVwRmFpbEVyci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2U6IHN0ZXBGYWlsRXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgc3RlcEZhaWxFcnI7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cygnZmFpbGVkJyksXG4gICAgICAgICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwUmV0cnlFeGhhdXN0ZWQodHJ1ZSksXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gTm90IGF0IG1heCByZXRyaWVzIHlldCAtIGxvZyBhcyBhIHJldHJ5YWJsZSBlcnJvclxuICAgICAgICAgICAgICAgICAgaWYgKFJldHJ5YWJsZUVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RlcExvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICdFbmNvdW50ZXJlZCBSZXRyeWFibGVFcnJvciwgc3RlcCB3aWxsIGJlIHJldHJpZWQnLFxuICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdGVwTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHQ6IGN1cnJlbnRBdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBlcnIubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvclN0YWNrOiBub3JtYWxpemVkU3RhY2ssXG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3RlcExvZ2dlci5pbmZvKCdFbmNvdW50ZXJlZCBFcnJvciwgc3RlcCB3aWxsIGJlIHJldHJpZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgICAgICAgICB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgc3RlcElkLFxuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHQ6IGN1cnJlbnRBdHRlbXB0LFxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yTmFtZTogbm9ybWFsaXplZEVycm9yLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBub3JtYWxpemVkRXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvclN0YWNrOiBub3JtYWxpemVkU3RhY2ssXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgLy8gU2V0IHN0ZXAgdG8gcGVuZGluZyBmb3IgcmV0cnkgdmlhIGV2ZW50IChldmVudC1zb3VyY2VkIGFyY2hpdGVjdHVyZSlcbiAgICAgICAgICAgICAgICAgIC8vIHN0ZXBfcmV0cnlpbmcgcmVjb3JkcyB0aGUgZXJyb3IgYW5kIHNldHMgc3RhdHVzIHRvIHBlbmRpbmcuXG4gICAgICAgICAgICAgICAgICAvLyBTZXJpYWxpemUgdGhlIG9yaWdpbmFsIHRocm93biB2YWx1ZSBzbyBpdHMgZnVsbCB0eXBlIGlkZW50aXR5XG4gICAgICAgICAgICAgICAgICAvLyBhbmQgY3VzdG9tIHByb3BlcnRpZXMgcm91bmQtdHJpcCB0aHJvdWdoIHRoZSBldmVudCBsb2cuXG4gICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRUeXBlOiAnc3RlcF9yZXRyeWluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbjogU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudERhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBhd2FpdCBkZWh5ZHJhdGVTdGVwRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbktleVxuICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oUmV0cnlhYmxlRXJyb3IuaXMoZXJyKSAmJiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0cnlBZnRlcjogZXJyLnJldHJ5QWZ0ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIHsgcmVxdWVzdElkIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKHN0ZXBSZXRyeUVycikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhzdGVwUmV0cnlFcnIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gU3RlcCBhbHJlYWR5IGluIHRlcm1pbmFsIHN0YXRlIOKAlCBpZGVtcG90ZW50LlxuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAnVHJpZWQgcmV0cnlpbmcgc3RlcCwgYnV0IHN0ZXAgaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOYW1lOiBzdGVwUmV0cnlFcnIubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBzdGVwUmV0cnlFcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBzdGVwUmV0cnlFcnI7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVvdXRTZWNvbmRzID0gTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAgICAgICAgIFJldHJ5YWJsZUVycm9yLmlzKGVycilcbiAgICAgICAgICAgICAgICAgICAgICA/IE1hdGguY2VpbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKCtlcnIucmV0cnlBZnRlci5nZXRUaW1lKCkgLSBEYXRlLm5vdygpKSAvIDEwMDBcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICA6IDFcbiAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJldHJ5VGltZW91dFNlY29uZHModGltZW91dFNlY29uZHMpLFxuICAgICAgICAgICAgICAgICAgICAuLi5BdHRyaWJ1dGUuU3RlcFJldHJ5V2lsbFJldHJ5KHRydWUpLFxuICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgIC8vIEFkZCBzcGFuIGV2ZW50IGZvciByZXRyeSBzY2hlZHVsaW5nXG4gICAgICAgICAgICAgICAgICBzcGFuPy5hZGRFdmVudD8uKCdyZXRyeS5zY2hlZHVsZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgICdyZXRyeS50aW1lb3V0X3NlY29uZHMnOiB0aW1lb3V0U2Vjb25kcyxcbiAgICAgICAgICAgICAgICAgICAgJ3JldHJ5LmF0dGVtcHQnOiBjdXJyZW50QXR0ZW1wdCxcbiAgICAgICAgICAgICAgICAgICAgJ3JldHJ5Lm1heF9yZXRyaWVzJzogbWF4UmV0cmllcyxcbiAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAvLyBJdCdzIGEgcmV0cnlhYmxlIGVycm9yIC0gc28gaGF2ZSB0aGUgcXVldWUga2VlcCB0aGUgbWVzc2FnZSB2aXNpYmxlXG4gICAgICAgICAgICAgICAgICAvLyBzbyB0aGF0IGl0IGdldHMgcmV0cmllZC5cbiAgICAgICAgICAgICAgICAgIHJldHVybiB7IHRpbWVvdXRTZWNvbmRzIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gUmUtaW52b2tlIHRoZSB3b3JrZmxvdyB0byBoYW5kbGUgdGhlIGZhaWxlZC9yZXRyeWluZyBzdGVwXG4gICAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZSh3b3JsZCwgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lKSwge1xuICAgICAgICAgICAgICAgIHJ1bklkOiB3b3JrZmxvd1J1bklkLFxuICAgICAgICAgICAgICAgIHRyYWNlQ2FycmllcjogYXdhaXQgc2VyaWFsaXplVHJhY2VDYXJyaWVyKCksXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkQXQ6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIC0tLSBJbmZyYXN0cnVjdHVyZTogY29tcGxldGUgdGhlIHN0ZXAgLS0tXG4gICAgICAgICAgICAvLyBFcnJvcnMgaGVyZSAobmV0d29yayBmYWlsdXJlcywgc2VydmVyIGVycm9ycykgcHJvcGFnYXRlIHRvIHRoZVxuICAgICAgICAgICAgLy8gcXVldWUgaGFuZGxlciBmb3IgYXV0b21hdGljIHJldHJ5LlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIE5PVEU6IE5vbmUgb2YgdGhlIGNvZGUgZnJvbSB0aGlzIHBvaW50IGlzIGd1YXJhbnRlZWQgdG8gcnVuLlxuICAgICAgICAgICAgLy8gU2luY2UgdGhlIHN0ZXAgbWlnaHQgZmFpbCBvciBjYXVzZSBhIGZ1bmN0aW9uIHRpbWVvdXQgYW5kIHRoZVxuICAgICAgICAgICAgLy8gcHJvY2VzcyBtaWdodCBiZSBTSUdLSUxMJ2QsIHRoZSB3b3JrZmxvdyBydW50aW1lIG11c3QgYmVcbiAgICAgICAgICAgIC8vIHJlc2lsaWVudCB0byB0aGUgYmVsb3cgY29kZSBub3QgZXhlY3V0aW5nIG9uIGEgZmFpbGVkIHN0ZXAuXG4gICAgICAgICAgICAvLyAoRGVoeWRyYXRpb24gYWxyZWFkeSBoYXBwZW5lZCBhYm92ZSBhbmQgaXMgYWNjb3VudGVkIGZvciBpbiB0aGVcbiAgICAgICAgICAgIC8vIHVzZXJDb2RlRmFpbGVkIHBhdGguKVxuICAgICAgICAgICAgd2FpdFVudGlsKFxuICAgICAgICAgICAgICBQcm9taXNlLmFsbChvcHMpLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBJZ25vcmUgZXhwZWN0ZWQgY2xpZW50IGRpc2Nvbm5lY3QgZXJyb3JzIChlLmcuLCBicm93c2VyIHJlZnJlc2ggZHVyaW5nIHN0cmVhbWluZylcbiAgICAgICAgICAgICAgICBjb25zdCBpc0Fib3J0RXJyb3IgPVxuICAgICAgICAgICAgICAgICAgZXJyPy5uYW1lID09PSAnQWJvcnRFcnJvcicgfHwgZXJyPy5uYW1lID09PSAnUmVzcG9uc2VBYm9ydGVkJztcbiAgICAgICAgICAgICAgICBpZiAoIWlzQWJvcnRFcnJvcikgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gUnVuIHN0ZXBfY29tcGxldGVkIGFuZCB0cmFjZSBzZXJpYWxpemF0aW9uIGNvbmN1cnJlbnRseTtcbiAgICAgICAgICAgIC8vIHRoZSB0cmFjZSBjYXJyaWVyIGlzIHVzZWQgaW4gdGhlIGZpbmFsIHF1ZXVlTWVzc2FnZSBjYWxsIGJlbG93XG4gICAgICAgICAgICBsZXQgc3RlcENvbXBsZXRlZDQwOSA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgWywgdHJhY2VDYXJyaWVyXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgd29ybGQuZXZlbnRzXG4gICAgICAgICAgICAgICAgLmNyZWF0ZShcbiAgICAgICAgICAgICAgICAgIHdvcmtmbG93UnVuSWQsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50VHlwZTogJ3N0ZXBfY29tcGxldGVkJyxcbiAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb246IFNQRUNfVkVSU0lPTl9DVVJSRU5ULFxuICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbklkOiBzdGVwSWQsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDogcmVzdWx0IGFzIFVpbnQ4QXJyYXksXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgeyByZXF1ZXN0SWQgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycjogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKEVudGl0eUNvbmZsaWN0RXJyb3IuaXMoZXJyKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTdGVwIGFscmVhZHkgaW4gdGVybWluYWwgc3RhdGUg4oCUIGlkZW1wb3RlbnQuXG4gICAgICAgICAgICAgICAgICAgIHN0ZXBSdW50aW1lTG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgJ1RyaWVkIGNvbXBsZXRpbmcgc3RlcCwgYnV0IHN0ZXAgaGFzIGFscmVhZHkgZmluaXNoZWQuJyxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5hbWU6IGVyci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnIubWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHN0ZXBDb21wbGV0ZWQ0MDkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIHNlcmlhbGl6ZVRyYWNlQ2FycmllcigpLFxuICAgICAgICAgICAgXSk7XG5cbiAgICAgICAgICAgIGlmIChzdGVwQ29tcGxldGVkNDA5KSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgICAgIC4uLkF0dHJpYnV0ZS5TdGVwU3RhdHVzKCdjb21wbGV0ZWQnKSxcbiAgICAgICAgICAgICAgLi4uQXR0cmlidXRlLlN0ZXBSZXN1bHRUeXBlKHR5cGVvZiByZXN1bHQpLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIFF1ZXVlIHRoZSB3b3JrZmxvdyBjb250aW51YXRpb24gd2l0aCB0aGUgY29uY3VycmVudGx5LXJlc29sdmVkIHRyYWNlIGNhcnJpZXJcbiAgICAgICAgICAgIGF3YWl0IHF1ZXVlTWVzc2FnZSh3b3JsZCwgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lKSwge1xuICAgICAgICAgICAgICBydW5JZDogd29ya2Zsb3dSdW5JZCxcbiAgICAgICAgICAgICAgdHJhY2VDYXJyaWVyLFxuICAgICAgICAgICAgICByZXF1ZXN0ZWRBdDogbmV3IERhdGUoKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgKTtcblxuLyoqXG4gKiBBIHNpbmdsZSByb3V0ZSB0aGF0IGhhbmRsZXMgYW55IHN0ZXAgZXhlY3V0aW9uIHJlcXVlc3QgYW5kIHJvdXRlcyB0byB0aGVcbiAqIGFwcHJvcHJpYXRlIHN0ZXAgZnVuY3Rpb24uIFdlIG1heSBldmVudHVhbGx5IHdhbnQgdG8gY3JlYXRlIGRpZmZlcmVudCBidW5kbGVzXG4gKiBmb3IgZWFjaCBzdGVwLCB0aGlzIGlzIHRlbXBvcmFyeS5cbiAqL1xubGV0IGNhY2hlZFN0ZXBIYW5kbGVyOiAoKHJlcTogUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXNwb25zZT4pIHwgdW5kZWZpbmVkO1xuZXhwb3J0IGNvbnN0IHN0ZXBFbnRyeXBvaW50OiAocmVxOiBSZXF1ZXN0KSA9PiBQcm9taXNlPFJlc3BvbnNlPiA9XG4gIC8qIEBfX1BVUkVfXyAqLyB3aXRoSGVhbHRoQ2hlY2soYXN5bmMgKHJlcSkgPT4ge1xuICAgIGlmICghY2FjaGVkU3RlcEhhbmRsZXIpIHtcbiAgICAgIGNhY2hlZFN0ZXBIYW5kbGVyID0gc3RlcEhhbmRsZXIoYXdhaXQgZ2V0V29ybGRIYW5kbGVycygpKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlZFN0ZXBIYW5kbGVyKHJlcSk7XG4gIH0pO1xuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"suspension-handler.d.ts","sourceRoot":"","sources":["../../src/runtime/suspension-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAO/C,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,KAAK,EACX,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAEV,uBAAuB,EAEvB,kBAAkB,EACnB,MAAM,cAAc,CAAC;AAMtB,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,kBAAkB,CAAC;IAC/B,KAAK,EAAE,KAAK,CAAC;IACb,GAAG,EAAE,WAAW,CAAC;IACjB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,4DAA4D;IAC5D,YAAY,EAAE,uBAAuB,EAAE,CAAC;IACxC;;;;;;;OAOG;IACH,yBAAyB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvC,iCAAiC;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0EAA0E;IAC1E,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,EACrC,UAAU,EACV,KAAK,EACL,GAAG,EACH,IAAI,EACJ,SAAS,GACV,EAAE,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAyU5D"}
1
+ {"version":3,"file":"suspension-handler.d.ts","sourceRoot":"","sources":["../../src/runtime/suspension-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAO/C,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,KAAK,EACX,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAEV,uBAAuB,EAEvB,kBAAkB,EACnB,MAAM,cAAc,CAAC;AAMtB,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,kBAAkB,CAAC;IAC/B,KAAK,EAAE,KAAK,CAAC;IACb,GAAG,EAAE,WAAW,CAAC;IACjB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,4DAA4D;IAC5D,YAAY,EAAE,uBAAuB,EAAE,CAAC;IACxC;;;;;;;OAOG;IACH,yBAAyB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvC,iCAAiC;IACjC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,0EAA0E;IAC1E,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,EACrC,UAAU,EACV,KAAK,EACL,GAAG,EACH,IAAI,EACJ,SAAS,GACV,EAAE,uBAAuB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CA6U5D"}