@workflow/core 5.0.0-beta.34 → 5.0.0-beta.36

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 (83) hide show
  1. package/dist/classify-error.d.ts.map +1 -1
  2. package/dist/classify-error.js +5 -2
  3. package/dist/create-hook.d.ts +41 -22
  4. package/dist/create-hook.d.ts.map +1 -1
  5. package/dist/create-hook.js +1 -1
  6. package/dist/describe-error.d.ts.map +1 -1
  7. package/dist/describe-error.js +12 -1
  8. package/dist/flushable-stream.d.ts +29 -0
  9. package/dist/flushable-stream.d.ts.map +1 -1
  10. package/dist/flushable-stream.js +228 -2
  11. package/dist/global.d.ts +2 -0
  12. package/dist/global.d.ts.map +1 -1
  13. package/dist/global.js +1 -1
  14. package/dist/private.d.ts +6 -17
  15. package/dist/private.d.ts.map +1 -1
  16. package/dist/private.js +1 -1
  17. package/dist/replay-payload-cache.d.ts +56 -0
  18. package/dist/replay-payload-cache.d.ts.map +1 -0
  19. package/dist/replay-payload-cache.js +137 -0
  20. package/dist/runtime/constants.d.ts +11 -0
  21. package/dist/runtime/constants.d.ts.map +1 -1
  22. package/dist/runtime/constants.js +26 -1
  23. package/dist/runtime/get-port-lazy.js +4 -4
  24. package/dist/runtime/helpers.d.ts +57 -0
  25. package/dist/runtime/helpers.d.ts.map +1 -1
  26. package/dist/runtime/helpers.js +102 -3
  27. package/dist/runtime/resume-hook.d.ts +4 -1
  28. package/dist/runtime/resume-hook.d.ts.map +1 -1
  29. package/dist/runtime/resume-hook.js +23 -20
  30. package/dist/runtime/run-id-time.d.ts +9 -0
  31. package/dist/runtime/run-id-time.d.ts.map +1 -1
  32. package/dist/runtime/run-id-time.js +15 -4
  33. package/dist/runtime/start.d.ts.map +1 -1
  34. package/dist/runtime/start.js +38 -8
  35. package/dist/runtime/step-executor.d.ts +41 -0
  36. package/dist/runtime/step-executor.d.ts.map +1 -1
  37. package/dist/runtime/step-executor.js +137 -18
  38. package/dist/runtime/step-handler.js +3 -3
  39. package/dist/runtime/step-latency.d.ts +70 -4
  40. package/dist/runtime/step-latency.d.ts.map +1 -1
  41. package/dist/runtime/step-latency.js +59 -7
  42. package/dist/runtime/suspension-handler.d.ts +10 -1
  43. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  44. package/dist/runtime/suspension-handler.js +22 -9
  45. package/dist/runtime.d.ts.map +1 -1
  46. package/dist/runtime.js +491 -115
  47. package/dist/serialization.d.ts +44 -4
  48. package/dist/serialization.d.ts.map +1 -1
  49. package/dist/serialization.js +88 -54
  50. package/dist/step/context-storage.d.ts +6 -0
  51. package/dist/step/context-storage.d.ts.map +1 -1
  52. package/dist/step/context-storage.js +1 -1
  53. package/dist/step.d.ts.map +1 -1
  54. package/dist/step.js +10 -16
  55. package/dist/symbols.d.ts +13 -0
  56. package/dist/symbols.d.ts.map +1 -1
  57. package/dist/symbols.js +14 -1
  58. package/dist/telemetry/semantic-conventions.d.ts +25 -0
  59. package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
  60. package/dist/telemetry/semantic-conventions.js +22 -1
  61. package/dist/version.d.ts +1 -1
  62. package/dist/version.js +2 -2
  63. package/dist/workflow/abort-controller.d.ts.map +1 -1
  64. package/dist/workflow/abort-controller.js +3 -2
  65. package/dist/workflow/hook.d.ts.map +1 -1
  66. package/dist/workflow/hook.js +22 -7
  67. package/dist/workflow.d.ts +12 -9
  68. package/dist/workflow.d.ts.map +1 -1
  69. package/dist/workflow.js +16 -10
  70. package/docs/api-reference/create-hook.mdx +43 -2
  71. package/docs/api-reference/define-hook.mdx +26 -24
  72. package/docs/api-reference/fatal-error.mdx +29 -7
  73. package/docs/api-reference/fetch.mdx +3 -4
  74. package/docs/api-reference/sleep.mdx +1 -1
  75. package/docs/foundations/hooks.mdx +1 -1
  76. package/docs/foundations/idempotency.mdx +16 -9
  77. package/docs/how-it-works/encryption.mdx +3 -3
  78. package/docs/how-it-works/event-sourcing.mdx +6 -6
  79. package/docs/how-it-works/framework-integrations.mdx +3 -3
  80. package/package.json +5 -5
  81. package/dist/step-hydration-cache.d.ts +0 -148
  82. package/dist/step-hydration-cache.d.ts.map +0 -1
  83. package/dist/step-hydration-cache.js +0 -171
@@ -1,5 +1,5 @@
1
1
  import { ERROR_SLUGS, HookNotFoundError, WorkflowRuntimeError, } from '@workflow/errors';
2
- import { isLegacySpecVersion, SPEC_VERSION_CURRENT, SPEC_VERSION_LEGACY, SPEC_VERSION_SUPPORTS_COMPRESSION, } from '@workflow/world';
2
+ import { isLegacySpecVersion, isTerminalWorkflowRunStatus, SPEC_VERSION_CURRENT, SPEC_VERSION_LEGACY, SPEC_VERSION_SUPPORTS_COMPRESSION, } from '@workflow/world';
3
3
  import { getRunCapabilities } from '../capabilities.js';
4
4
  import { importKey } from '../encryption.js';
5
5
  import { runtimeLogger } from '../logger.js';
@@ -10,26 +10,30 @@ import { linkToTraceCarrier, trace } from '../telemetry.js';
10
10
  import { getWorldLazy } from './get-world-lazy.js';
11
11
  import { getWorkflowQueueName } from './helpers.js';
12
12
  import { safeWaitUntil, waitedUntil } from './wait-until.js';
13
- /**
14
- * Internal helper that returns the hook, the associated workflow run,
15
- * and the resolved encryption key.
16
- */
17
- async function getHookByTokenWithKey(token) {
13
+ /** Get a Hook and its owning run without hydrating payload data. */
14
+ async function getHookAndRun(token) {
18
15
  const world = await getWorldLazy();
19
16
  const hook = await world.hooks.getByToken(token);
20
17
  const run = await world.runs.get(hook.runId);
21
- const rawKey = await world.getEncryptionKeyForRun?.(run);
18
+ return { hook, run };
19
+ }
20
+ async function getHookByTokenWithKey(token) {
21
+ const { hook, run } = await getHookAndRun(token);
22
+ const rawKey = await (await getWorldLazy()).getEncryptionKeyForRun?.(run);
22
23
  const encryptionKey = rawKey ? await importKey(rawKey) : undefined;
23
24
  if (typeof hook.metadata !== 'undefined') {
24
25
  hook.metadata = await hydrateStepArguments(hook.metadata, hook.runId, encryptionKey);
25
26
  }
26
- return { hook, run, encryptionKey };
27
+ return { hook, encryptionKey };
27
28
  }
28
29
  /**
29
30
  * Get the hook by token to find the associated workflow run,
30
31
  * and hydrate the `metadata` property if it was set from within
31
32
  * the workflow run.
32
33
  *
34
+ * A Hook kept by minimum retention remains available here after its run ends,
35
+ * but cannot be resumed.
36
+ *
33
37
  * @param token - The unique token identifying the hook
34
38
  */
35
39
  export async function getHookByToken(token) {
@@ -45,7 +49,7 @@ export async function getHookByToken(token) {
45
49
  * @param tokenOrHook - The unique token identifying the hook, or the hook object itself
46
50
  * @param payload - The data payload to send to the hook
47
51
  * @returns Promise resolving to the hook
48
- * @throws Error if the hook is not found or if there's an error during the process
52
+ * @throws {HookNotFoundError} If the Hook does not exist or its run has ended
49
53
  *
50
54
  * @example
51
55
  *
@@ -72,29 +76,28 @@ export async function resumeHook(tokenOrHook, payload, encryptionKeyOverride) {
72
76
  try {
73
77
  let hook;
74
78
  let workflowRun;
75
- let encryptionKey;
76
79
  if (typeof tokenOrHook === 'string') {
77
- const result = await getHookByTokenWithKey(tokenOrHook);
80
+ const result = await getHookAndRun(tokenOrHook);
78
81
  hook = result.hook;
79
82
  workflowRun = result.run;
80
- encryptionKey = encryptionKeyOverride ?? result.encryptionKey;
81
83
  }
82
84
  else {
83
85
  hook = tokenOrHook;
84
86
  workflowRun = await world.runs.get(hook.runId);
85
- if (encryptionKeyOverride) {
86
- encryptionKey = encryptionKeyOverride;
87
- }
88
- else {
89
- const rawKey = await world.getEncryptionKeyForRun?.(workflowRun);
90
- encryptionKey = rawKey ? await importKey(rawKey) : undefined;
91
- }
92
87
  }
93
88
  span?.setAttributes({
94
89
  ...Attribute.HookToken(hook.token),
95
90
  ...Attribute.HookId(hook.hookId),
96
91
  ...Attribute.WorkflowRunId(hook.runId),
97
92
  });
93
+ if (isTerminalWorkflowRunStatus(workflowRun.status)) {
94
+ throw new HookNotFoundError(hook.token);
95
+ }
96
+ let encryptionKey = encryptionKeyOverride;
97
+ if (!encryptionKey) {
98
+ const rawKey = await world.getEncryptionKeyForRun?.(workflowRun);
99
+ encryptionKey = rawKey ? await importKey(rawKey) : undefined;
100
+ }
98
101
  // Check the target run's capabilities to ensure we encode the
99
102
  // payload in a format the run's deployment can decode. For example,
100
103
  // runs created before encryption support was added cannot decode
@@ -255,4 +258,4 @@ export async function resumeWebhook(token, request) {
255
258
  }
256
259
  return response;
257
260
  }
258
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdW1lLWhvb2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9yZXN1bWUtaG9vay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsV0FBVyxFQUNYLGlCQUFpQixFQUNqQixvQkFBb0IsR0FDckIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBRUwsbUJBQW1CLEVBQ25CLG9CQUFvQixFQUNwQixtQkFBbUIsRUFDbkIsaUNBQWlDLEdBR2xDLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDeEQsT0FBTyxFQUFrQixTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFDTCx3QkFBd0IsRUFDeEIsb0JBQW9CLEVBQ3BCLG1CQUFtQixHQUNwQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRCxPQUFPLEtBQUssU0FBUyxNQUFNLHNDQUFzQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDbkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3BELE9BQU8sRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFN0Q7OztHQUdHO0FBQ0gsS0FBSyxVQUFVLHFCQUFxQixDQUFDLEtBQWE7SUFLaEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxZQUFZLEVBQUUsQ0FBQztJQUNuQyxNQUFNLElBQUksR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUss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Z0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM1QyxNQUFNLEtBQUssR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNsQyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNoQixRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUN6QixDQUFDO1FBQ0QsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxNQUFNLElBQUksb0JBQW9CLENBQUMsc0NBQXNDLEVBQUU7WUFDckUsSUFBSSxFQUFFLFdBQVcsQ0FBQyx5QkFBeUI7U0FDNUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFUlJPUl9TTFVHUyxcbiAgSG9va05vdEZvdW5kRXJyb3IsXG4gIFdvcmtmbG93UnVudGltZUVycm9yLFxufSBmcm9tICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7XG4gIHR5cGUgSG9vayxcbiAgaXNMZWdhY3lTcGVjVmVyc2lvbixcbiAgU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gIFNQRUNfVkVSU0lPTl9MRUdBQ1ksXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTixcbiAgdHlwZSBXb3JrZmxvd0ludm9rZVBheWxvYWQsXG4gIHR5cGUgV29ya2Zsb3dSdW4sXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBnZXRSdW5DYXBhYmlsaXRpZXMgfSBmcm9tICcuLi9jYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgdHlwZSBDcnlwdG9LZXksIGltcG9ydEtleSB9IGZyb20gJy4uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBkZWh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUsXG4gIGh5ZHJhdGVTdGVwQXJndW1lbnRzLFxuICBTZXJpYWxpemF0aW9uRm9ybWF0LFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IFdFQkhPT0tfUkVTUE9OU0VfV1JJVEFCTEUgfSBmcm9tICcuLi9zeW1ib2xzLmpzJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHsgbGlua1RvVHJhY2VDYXJyaWVyLCB0cmFjZSB9IGZyb20gJy4uL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZExhenkgfSBmcm9tICcuL2dldC13b3JsZC1sYXp5LmpzJztcbmltcG9ydCB7IGdldFdvcmtmbG93UXVldWVOYW1lIH0gZnJvbSAnLi9oZWxwZXJzLmpzJztcbmltcG9ydCB7IHNhZmVXYWl0VW50aWwsIHdhaXRlZFVudGlsIH0gZnJvbSAnLi93YWl0LXVudGlsLmpzJztcblxuLyoqXG4gKiBJbnRlcm5hbCBoZWxwZXIgdGhhdCByZXR1cm5zIHRoZSBob29rLCB0aGUgYXNzb2NpYXRlZCB3b3JrZmxvdyBydW4sXG4gKiBhbmQgdGhlIHJlc29sdmVkIGVuY3J5cHRpb24ga2V5LlxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRIb29rQnlUb2tlbldpdGhLZXkodG9rZW46IHN0cmluZyk6IFByb21pc2U8e1xuICBob29rOiBIb29rO1xuICBydW46IFdvcmtmbG93UnVuO1xuICBlbmNyeXB0aW9uS2V5OiBDcnlwdG9LZXkgfCB1bmRlZmluZWQ7XG59PiB7XG4gIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG4gIGNvbnN0IGhvb2sgPSBhd2FpdCB3b3JsZC5ob29rcy5nZXRCeVRva2VuKHRva2VuKTtcbiAgY29uc3QgcnVuID0gYXdhaXQgd29ybGQucnVucy5nZXQoaG9vay5ydW5JZCk7XG4gIGNvbnN0IHJhd0tleSA9IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/LihydW4pO1xuICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gcmF3S2V5ID8gYXdhaXQgaW1wb3J0S2V5KHJhd0tleSkgOiB1bmRlZmluZWQ7XG4gIGlmICh0eXBlb2YgaG9vay5tZXRhZGF0YSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBob29rLm1ldGFkYXRhID0gYXdhaXQgaHlkcmF0ZVN0ZXBBcmd1bWVudHMoXG4gICAgICBob29rLm1ldGFkYXRhIGFzIGFueSxcbiAgICAgIGhvb2sucnVuSWQsXG4gICAgICBlbmNyeXB0aW9uS2V5XG4gICAgKTtcbiAgfVxuICByZXR1cm4geyBob29rLCBydW4sIGVuY3J5cHRpb25LZXkgfTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGhvb2sgYnkgdG9rZW4gdG8gZmluZCB0aGUgYXNzb2NpYXRlZCB3b3JrZmxvdyBydW4sXG4gKiBhbmQgaHlkcmF0ZSB0aGUgYG1ldGFkYXRhYCBwcm9wZXJ0eSBpZiBpdCB3YXMgc2V0IGZyb20gd2l0aGluXG4gKiB0aGUgd29ya2Zsb3cgcnVuLlxuICpcbiAqIEBwYXJhbSB0b2tlbiAtIFRoZSB1bmlxdWUgdG9rZW4gaWRlbnRpZnlpbmcgdGhlIGhvb2tcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEhvb2tCeVRva2VuKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPEhvb2s+IHtcbiAgY29uc3QgeyBob29rIH0gPSBhd2FpdCBnZXRIb29rQnlUb2tlbldpdGhLZXkodG9rZW4pO1xuICByZXR1cm4gaG9vaztcbn1cblxuLyoqXG4gKiBSZXN1bWVzIGEgd29ya2Zsb3cgcnVuIGJ5IHNlbmRpbmcgYSBwYXlsb2FkIHRvIGEgaG9vayBpZGVudGlmaWVkIGJ5IGl0cyB0b2tlbi5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBleHRlcm5hbGx5IChlLmcuLCBmcm9tIGFuIEFQSSByb3V0ZSBvciBzZXJ2ZXIgYWN0aW9uKVxuICogdG8gc2VuZCBkYXRhIHRvIGEgaG9vayBhbmQgcmVzdW1lIHRoZSBhc3NvY2lhdGVkIHdvcmtmbG93IHJ1bi5cbiAqXG4gKiBAcGFyYW0gdG9rZW5Pckhvb2sgLSBUaGUgdW5pcXVlIHRva2VuIGlkZW50aWZ5aW5nIHRoZSBob29rLCBvciB0aGUgaG9vayBvYmplY3QgaXRzZWxmXG4gKiBAcGFyYW0gcGF5bG9hZCAtIFRoZSBkYXRhIHBheWxvYWQgdG8gc2VuZCB0byB0aGUgaG9va1xuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGhvb2tcbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGhvb2sgaXMgbm90IGZvdW5kIG9yIGlmIHRoZXJlJ3MgYW4gZXJyb3IgZHVyaW5nIHRoZSBwcm9jZXNzXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogLy8gSW4gYW4gQVBJIHJvdXRlXG4gKiBpbXBvcnQgeyByZXN1bWVIb29rIH0gZnJvbSAnQHdvcmtmbG93L2NvcmUvcnVudGltZSc7XG4gKlxuICogZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIFBPU1QocmVxdWVzdDogUmVxdWVzdCkge1xuICogICBjb25zdCB7IHRva2VuLCBkYXRhIH0gPSBhd2FpdCByZXF1ZXN0Lmpzb24oKTtcbiAqXG4gKiAgIHRyeSB7XG4gKiAgICAgY29uc3QgaG9vayA9IGF3YWl0IHJlc3VtZUhvb2sodG9rZW4sIGRhdGEpO1xuICogICAgIHJldHVybiBSZXNwb25zZS5qc29uKHsgcnVuSWQ6IGhvb2sucnVuSWQgfSk7XG4gKiAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSgnSG9vayBub3QgZm91bmQnLCB7IHN0YXR1czogNDA0IH0pO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc3VtZUhvb2s8VCA9IGFueT4oXG4gIHRva2VuT3JIb29rOiBzdHJpbmcgfCBIb29rLFxuICBwYXlsb2FkOiBULFxuICBlbmNyeXB0aW9uS2V5T3ZlcnJpZGU/OiBDcnlwdG9LZXlcbik6IFByb21pc2U8SG9vaz4ge1xuICByZXR1cm4gYXdhaXQgd2FpdGVkVW50aWwoKCkgPT4ge1xuICAgIHJldHVybiB0cmFjZSgnaG9vay5yZXN1bWUnLCBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgY29uc3Qgd29ybGQgPSBhd2FpdCBnZXRXb3JsZExhenkoKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IGhvb2s6IEhvb2s7XG4gICAgICAgIGxldCB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW47XG4gICAgICAgIGxldCBlbmNyeXB0aW9uS2V5OiBDcnlwdG9LZXkgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0eXBlb2YgdG9rZW5Pckhvb2sgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0SG9va0J5VG9rZW5XaXRoS2V5KHRva2VuT3JIb29rKTtcbiAgICAgICAgICBob29rID0gcmVzdWx0Lmhvb2s7XG4gICAgICAgICAgd29ya2Zsb3dSdW4gPSByZXN1bHQucnVuO1xuICAgICAgICAgIGVuY3J5cHRpb25LZXkgPSBlbmNyeXB0aW9uS2V5T3ZlcnJpZGUgPz8gcmVzdWx0LmVuY3J5cHRpb25LZXk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaG9vayA9IHRva2VuT3JIb29rO1xuICAgICAgICAgIHdvcmtmbG93UnVuID0gYXdhaXQgd29ybGQucnVucy5nZXQoaG9vay5ydW5JZCk7XG4gICAgICAgICAgaWYgKGVuY3J5cHRpb25LZXlPdmVycmlkZSkge1xuICAgICAgICAgICAgZW5jcnlwdGlvbktleSA9IGVuY3J5cHRpb25LZXlPdmVycmlkZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmF3S2V5ID0gYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKHdvcmtmbG93UnVuKTtcbiAgICAgICAgICAgIGVuY3J5cHRpb25LZXkgPSByYXdLZXkgPyBhd2FpdCBpbXBvcnRLZXkocmF3S2V5KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuSG9va1Rva2VuKGhvb2sudG9rZW4pLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Ib29rSWQoaG9vay5ob29rSWQpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1bklkKGhvb2sucnVuSWQpLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDaGVjayB0aGUgdGFyZ2V0IHJ1bidzIGNhcGFiaWxpdGllcyB0byBlbnN1cmUgd2UgZW5jb2RlIHRoZVxuICAgICAgICAvLyBwYXlsb2FkIGluIGEgZm9ybWF0IHRoZSBydW4ncyBkZXBsb3ltZW50IGNhbiBkZWNvZGUuIEZvciBleGFtcGxlLFxuICAgICAgICAvLyBydW5zIGNyZWF0ZWQgYmVmb3JlIGVuY3J5cHRpb24gc3VwcG9ydCB3YXMgYWRkZWQgY2Fubm90IGRlY29kZVxuICAgICAgICAvLyB0aGUgJ2VuY3InIHNlcmlhbGl6YXRpb24gZm9ybWF0LCBhbmQgcnVucyBjcmVhdGVkIGJlZm9yZVxuICAgICAgICAvLyBieXRlLXN0cmVhbSBmcmFtaW5nIHN1cHBvcnQgY2Fubm90IGRlY29kZSBmcmFtZWQgYnl0ZSBzdHJlYW1zLlxuICAgICAgICBjb25zdCByYXdWZXJzaW9uID0gd29ya2Zsb3dSdW4uZXhlY3V0aW9uQ29udGV4dD8ud29ya2Zsb3dDb3JlVmVyc2lvbjtcbiAgICAgICAgY29uc3QgY2FwYWJpbGl0aWVzID0gZ2V0UnVuQ2FwYWJpbGl0aWVzKFxuICAgICAgICAgIHR5cGVvZiByYXdWZXJzaW9uID09PSAnc3RyaW5nJyA/IHJhd1ZlcnNpb24gOiB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFjYXBhYmlsaXRpZXMuc3VwcG9ydGVkRm9ybWF0cy5oYXMoU2VyaWFsaXphdGlvbkZvcm1hdC5FTkNSWVBURUQpKSB7XG4gICAgICAgICAgZW5jcnlwdGlvbktleSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbXByZXNzIHRoZSBwYXlsb2FkIG9ubHkgd2hlbiB0aGUgdGFyZ2V0IHJ1biBpcyBtYXJrZWQgYXNcbiAgICAgICAgLy8gcG9zc2libHkgY29udGFpbmluZyBjb21wcmVzc2VkIHBheWxvYWRzIChzcGVjVmVyc2lvbiA+PSA1KSBBTkRcbiAgICAgICAgLy8gaXRzIGRlcGxveW1lbnQgY2FuIGRlY29kZSB0aGUgJ2d6aXAnIGZvcm1hdC5cbiAgICAgICAgY29uc3QgY29tcHJlc3Npb24gPVxuICAgICAgICAgICh3b3JrZmxvd1J1bi5zcGVjVmVyc2lvbiA/PyAwKSA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT04gJiZcbiAgICAgICAgICBjYXBhYmlsaXRpZXMuc3VwcG9ydGVkRm9ybWF0cy5oYXMoU2VyaWFsaXphdGlvbkZvcm1hdC5HWklQKTtcblxuICAgICAgICAvLyBEZWh5ZHJhdGUgdGhlIHBheWxvYWQgZm9yIHN0b3JhZ2VcbiAgICAgICAgY29uc3Qgb3BzOiBQcm9taXNlPGFueT5bXSA9IFtdO1xuICAgICAgICBjb25zdCB2MUNvbXBhdCA9IGlzTGVnYWN5U3BlY1ZlcnNpb24oaG9vay5zcGVjVmVyc2lvbik7XG4gICAgICAgIGNvbnN0IGRlaHlkcmF0ZWRQYXlsb2FkID0gYXdhaXQgZGVoeWRyYXRlU3RlcFJldHVyblZhbHVlKFxuICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICAgaG9vay5ydW5JZCxcbiAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgIG9wcyxcbiAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgIHYxQ29tcGF0LFxuICAgICAgICAgIGNhcGFiaWxpdGllcy5mcmFtZWRCeXRlU3RyZWFtcyxcbiAgICAgICAgICBjb21wcmVzc2lvblxuICAgICAgICApO1xuICAgICAgICAvLyBUaGVzZSBwYXlsb2FkLXN0cmVhbSBvcHMgYXJlIGZsdXNoZWQgaW4gdGhlIGJhY2tncm91bmQ7IHRoZVxuICAgICAgICAvLyBwcm9taXNlIGhhbmRlZCB0byB3YWl0VW50aWwgbXVzdCBuZXZlciByZWplY3QgKGFuIHVuY29uc3VtZWRcbiAgICAgICAgLy8gd2FpdFVudGlsIHJlamVjdGlvbiBjcmFzaGVzIHRoZSBwcm9jZXNzIGFzIHVuaGFuZGxlZFJlamVjdGlvbiksXG4gICAgICAgIC8vIHNvIHVuZXhwZWN0ZWQgZmFpbHVyZXMgYXJlIGxvZ2dlZCBpbnN0ZWFkLlxuICAgICAgICAvLyBOT1RFOiByZWplY3Rpb25zIHdpdGggYHVuZGVmaW5lZGAgYXJlIGFuIGV4cGVjdGVkIGFydGlmYWN0IG9mIHRoZVxuICAgICAgICAvLyB3ZWJob29rIGJ1bmRsZSBhbmQgYXJlIGlnbm9yZWQgZW50aXJlbHkuXG4gICAgICAgIHNhZmVXYWl0VW50aWwoUHJvbWlzZS5hbGwob3BzKSwgKGVycikgPT4ge1xuICAgICAgICAgIGlmIChlcnIgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybignQmFja2dyb3VuZCBmbHVzaCBvZiBob29rIHBheWxvYWQgb3BzIGZhaWxlZCcsIHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IGhvb2sucnVuSWQsXG4gICAgICAgICAgICBob29rSWQ6IGhvb2suaG9va0lkLFxuICAgICAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgaG9va19yZWNlaXZlZCBldmVudCB3aXRoIHRoZSBwYXlsb2FkXG4gICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgaG9vay5ydW5JZCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBldmVudFR5cGU6ICdob29rX3JlY2VpdmVkJyxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2suaG9va0lkLFxuICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgIC4uLih2MUNvbXBhdCA/IHt9IDogeyB0b2tlbjogaG9vay50b2tlbiB9KSxcbiAgICAgICAgICAgICAgcGF5bG9hZDogZGVoeWRyYXRlZFBheWxvYWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyB2MUNvbXBhdCB9XG4gICAgICAgICk7XG5cbiAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93TmFtZSh3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUpLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBMaW5rIHRvIHRoZSBydW4tb3JpZ2luIGNvbnRleHQgZnJvbSB0aGUgd29ya2Zsb3cgcnVuJ3Mgc3RvcmVkXG4gICAgICAgIC8vIHRyYWNlIGNhcnJpZXIgKHNraXBwZWQgd2hlbiBhYnNlbnQgb3IgaW52YWxpZCkuXG4gICAgICAgIGNvbnN0IG9yaWdpbkxpbmsgPSBhd2FpdCBsaW5rVG9UcmFjZUNhcnJpZXIoXG4gICAgICAgICAgd29ya2Zsb3dSdW4uZXhlY3V0aW9uQ29udGV4dD8udHJhY2VDYXJyaWVyXG4gICAgICAgICk7XG4gICAgICAgIGlmIChvcmlnaW5MaW5rKSB7XG4gICAgICAgICAgc3Bhbj8uYWRkTGluaz8uKG9yaWdpbkxpbmspO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmUtdHJpZ2dlciB0aGUgd29ya2Zsb3cgYWdhaW5zdCB0aGUgZGVwbG95bWVudCBJRCBhc3NvY2lhdGVkXG4gICAgICAgIC8vIHdpdGggdGhlIHdvcmtmbG93IHJ1biB0aGF0IHRoZSBob29rIGJlbG9uZ3MgdG9cbiAgICAgICAgYXdhaXQgd29ybGQucXVldWUoXG4gICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBydW5JZDogaG9vay5ydW5JZCxcbiAgICAgICAgICAgIC8vIGF0dGFjaCB0aGUgdHJhY2UgY2FycmllciBmcm9tIHRoZSB3b3JrZmxvdyBydW5cbiAgICAgICAgICAgIHRyYWNlQ2FycmllcjpcbiAgICAgICAgICAgICAgd29ya2Zsb3dSdW4uZXhlY3V0aW9uQ29udGV4dD8udHJhY2VDYXJyaWVyID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICB9IHNhdGlzZmllcyBXb3JrZmxvd0ludm9rZVBheWxvYWQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZGVwbG95bWVudElkOiB3b3JrZmxvd1J1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICBzcGVjVmVyc2lvbjogd29ya2Zsb3dSdW4uc3BlY1ZlcnNpb24gPz8gU1BFQ19WRVJTSU9OX0xFR0FDWSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIGhvb2s7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgLi4uQXR0cmlidXRlLkhvb2tUb2tlbihcbiAgICAgICAgICAgIHR5cGVvZiB0b2tlbk9ySG9vayA9PT0gJ3N0cmluZycgPyB0b2tlbk9ySG9vayA6IHRva2VuT3JIb29rLnRva2VuXG4gICAgICAgICAgKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuSG9va0ZvdW5kKGZhbHNlKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVzdW1lcyBhIHdlYmhvb2sgYnkgc2VuZGluZyBhIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUmVxdWVzdCB8IFJlcXVlc3R9XG4gKiBvYmplY3QgdG8gYSBob29rIGlkZW50aWZpZWQgYnkgaXRzIHRva2VuLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGV4dGVybmFsbHkgKGUuZy4sIGZyb20gYW4gQVBJIHJvdXRlIG9yIHNlcnZlciBhY3Rpb24pXG4gKiB0byBzZW5kIGEgcmVxdWVzdCB0byBhIHdlYmhvb2sgYW5kIHJlc3VtZSB0aGUgYXNzb2NpYXRlZCB3b3JrZmxvdyBydW4uXG4gKlxuICogQHBhcmFtIHRva2VuIC0gVGhlIHVuaXF1ZSB0b2tlbiBpZGVudGlmeWluZyB0aGUgaG9va1xuICogQHBhcmFtIHJlcXVlc3QgLSBUaGUgcmVxdWVzdCB0byBzZW5kIHRvIHRoZSBob29rXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmVzcG9uc2VcbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGhvb2sgaXMgbm90IGZvdW5kIG9yIGlmIHRoZXJlJ3MgYW4gZXJyb3IgZHVyaW5nIHRoZSBwcm9jZXNzXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogLy8gSW4gYW4gQVBJIHJvdXRlXG4gKiBpbXBvcnQgeyByZXN1bWVXZWJob29rIH0gZnJvbSAnQHdvcmtmbG93L2NvcmUvcnVudGltZSc7XG4gKlxuICogZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIFBPU1QocmVxdWVzdDogUmVxdWVzdCkge1xuICogICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKTtcbiAqICAgY29uc3QgdG9rZW4gPSB1cmwuc2VhcmNoUGFyYW1zLmdldCgndG9rZW4nKTtcbiAqXG4gKiAgIGlmICghdG9rZW4pIHtcbiAqICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKCdNaXNzaW5nIHRva2VuJywgeyBzdGF0dXM6IDQwMCB9KTtcbiAqICAgfVxuICpcbiAqICAgdHJ5IHtcbiAqICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlc3VtZVdlYmhvb2sodG9rZW4sIHJlcXVlc3QpO1xuICogICAgIHJldHVybiByZXNwb25zZTtcbiAqICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKCdXZWJob29rIG5vdCBmb3VuZCcsIHsgc3RhdHVzOiA0MDQgfSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzdW1lV2ViaG9vayhcbiAgdG9rZW46IHN0cmluZyxcbiAgcmVxdWVzdDogUmVxdWVzdFxuKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCB7IGhvb2ssIGVuY3J5cHRpb25LZXkgfSA9IGF3YWl0IGdldEhvb2tCeVRva2VuV2l0aEtleSh0b2tlbik7XG5cbiAgLy8gT25seSB3ZWJob29rcyBjYW4gYmUgcmVzdW1lZCB2aWEgdGhlIHB1YmxpYyBlbmRwb2ludC5cbiAgLy8gSWYgdGhlIGhvb2sgd2FzIGNyZWF0ZWQgdmlhIGNyZWF0ZUhvb2soKSAoaXNXZWJob29rICE9PSB0cnVlKSxcbiAgLy8gdGhyb3cgdGhlIHNhbWUgXCJub3QgZm91bmRcIiBlcnJvciB0aGUgd29ybGQgd291bGQgdGhyb3cgZm9yIGEgbWlzc2luZ1xuICAvLyB0b2tlbi4gVGhpcyBwcmV2ZW50cyBsZWFraW5nIHRoYXQgdGhlIHRva2VuIGlzIHZhbGlkLlxuICBpZiAoaG9vay5pc1dlYmhvb2sgPT09IGZhbHNlKSB7XG4gICAgdGhyb3cgbmV3IEhvb2tOb3RGb3VuZEVycm9yKHRva2VuKTtcbiAgfVxuXG4gIGxldCByZXNwb25zZTogUmVzcG9uc2UgfCB1bmRlZmluZWQ7XG4gIGxldCByZXNwb25zZVJlYWRhYmxlOiBSZWFkYWJsZVN0cmVhbTxSZXNwb25zZT4gfCB1bmRlZmluZWQ7XG4gIGlmIChcbiAgICBob29rLm1ldGFkYXRhICYmXG4gICAgdHlwZW9mIGhvb2subWV0YWRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgJ3Jlc3BvbmRXaXRoJyBpbiBob29rLm1ldGFkYXRhXG4gICkge1xuICAgIGlmIChob29rLm1ldGFkYXRhLnJlc3BvbmRXaXRoID09PSAnbWFudWFsJykge1xuICAgICAgY29uc3QgeyByZWFkYWJsZSwgd3JpdGFibGUgfSA9IG5ldyBUcmFuc2Zvcm1TdHJlYW08UmVzcG9uc2UsIFJlc3BvbnNlPigpO1xuICAgICAgcmVzcG9uc2VSZWFkYWJsZSA9IHJlYWRhYmxlO1xuXG4gICAgICAvLyBUaGUgcmVxdWVzdCBpbnN0YW5jZSBpbmNsdWRlcyB0aGUgd3JpdGFibGUgc3RyZWFtIHdoaWNoIHdpbGwgYmUgdXNlZFxuICAgICAgLy8gdG8gd3JpdGUgdGhlIHJlc3BvbnNlIHRvIHRoZSBjbGllbnQgZnJvbSB3aXRoaW4gdGhlIHdvcmtmbG93IHJ1blxuICAgICAgKHJlcXVlc3QgYXMgYW55KVtXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFXSA9IHdyaXRhYmxlO1xuICAgIH0gZWxzZSBpZiAoaG9vay5tZXRhZGF0YS5yZXNwb25kV2l0aCBpbnN0YW5jZW9mIFJlc3BvbnNlKSB7XG4gICAgICByZXNwb25zZSA9IGhvb2subWV0YWRhdGEucmVzcG9uZFdpdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgYEludmFsaWQgXFxgcmVzcG9uZFdpdGhcXGAgdmFsdWU6ICR7aG9vay5tZXRhZGF0YS5yZXNwb25kV2l0aH1gLFxuICAgICAgICB7IHNsdWc6IEVSUk9SX1NMVUdTLldFQkhPT0tfSU5WQUxJRF9SRVNQT05EX1dJVEhfVkFMVUUgfVxuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gTm8gYHJlc3BvbmRXaXRoYCB2YWx1ZSBpbXBsaWVzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHJldHVybmluZyBhIDIwMlxuICAgIHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKG51bGwsIHsgc3RhdHVzOiAyMDIgfSk7XG4gIH1cblxuICBhd2FpdCByZXN1bWVIb29rKGhvb2ssIHJlcXVlc3QsIGVuY3J5cHRpb25LZXkpO1xuXG4gIGlmIChyZXNwb25zZVJlYWRhYmxlKSB7XG4gICAgLy8gV2FpdCBmb3IgdGhlIHJlYWRhYmxlIHN0cmVhbSB0byBlbWl0IG9uZSBjaHVuayxcbiAgICAvLyB3aGljaCBpcyB0aGUgYFJlc3BvbnNlYCBvYmplY3RcbiAgICBjb25zdCByZWFkZXIgPSByZXNwb25zZVJlYWRhYmxlLmdldFJlYWRlcigpO1xuICAgIGNvbnN0IGNodW5rID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICBpZiAoY2h1bmsudmFsdWUpIHtcbiAgICAgIHJlc3BvbnNlID0gY2h1bmsudmFsdWU7XG4gICAgfVxuICAgIHJlYWRlci5jYW5jZWwoKTtcbiAgfVxuXG4gIGlmICghcmVzcG9uc2UpIHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoJ1dvcmtmbG93IHJ1biBkaWQgbm90IHNlbmQgYSByZXNwb25zZScsIHtcbiAgICAgIHNsdWc6IEVSUk9SX1NMVUdTLldFQkhPT0tfUkVTUE9OU0VfTk9UX1NFTlQsXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2U7XG59XG4iXX0=
261
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdW1lLWhvb2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9yZXN1bWUtaG9vay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsV0FBVyxFQUNYLGlCQUFpQixFQUNqQixvQkFBb0IsR0FDckIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBRUwsbUJBQW1CLEVBQ25CLDJCQUEyQixFQUMzQixvQkFBb0IsRUFDcEIsbUJBQW1CLEVBQ25CLGlDQUFpQyxHQUdsQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hELE9BQU8sRUFBa0IsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLG9CQUFvQixFQUNwQixtQkFBbUIsR0FDcEIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxLQUFLLFNBQVMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNwRCxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTdELG9FQUFvRTtBQUNwRSxLQUFLLFVBQVUsYUFBYSxDQUFDLEtBQWE7SUFJeEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxZQUFZLEVBQUUsQ0FBQztJQUNuQyxNQUFNLElBQUksR0FBRyxNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFB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LEdBQUcsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELE1BQU0sVUFBVSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFFL0MsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3JCLGtEQUFrRDtRQUNsRCxpQ0FBaUM7UUFDakMsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDNUMsTUFBTSxLQUFLLEdBQUcsTUFBTSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEMsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDekIsQ0FBQztRQUNELE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsTUFBTSxJQUFJLG9CQUFvQixDQUFDLHNDQUFzQyxFQUFFO1lBQ3JFLElBQUksRUFBRSxXQUFXLENBQUMseUJBQXlCO1NBQzVDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRVJST1JfU0xVR1MsXG4gIEhvb2tOb3RGb3VuZEVycm9yLFxuICBXb3JrZmxvd1J1bnRpbWVFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQge1xuICB0eXBlIEhvb2ssXG4gIGlzTGVnYWN5U3BlY1ZlcnNpb24sXG4gIGlzVGVybWluYWxXb3JrZmxvd1J1blN0YXR1cyxcbiAgU1BFQ19WRVJTSU9OX0NVUlJFTlQsXG4gIFNQRUNfVkVSU0lPTl9MRUdBQ1ksXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTixcbiAgdHlwZSBXb3JrZmxvd0ludm9rZVBheWxvYWQsXG4gIHR5cGUgV29ya2Zsb3dSdW4sXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBnZXRSdW5DYXBhYmlsaXRpZXMgfSBmcm9tICcuLi9jYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgdHlwZSBDcnlwdG9LZXksIGltcG9ydEtleSB9IGZyb20gJy4uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBkZWh5ZHJhdGVTdGVwUmV0dXJuVmFsdWUsXG4gIGh5ZHJhdGVTdGVwQXJndW1lbnRzLFxuICBTZXJpYWxpemF0aW9uRm9ybWF0LFxufSBmcm9tICcuLi9zZXJpYWxpemF0aW9uLmpzJztcbmltcG9ydCB7IFdFQkhPT0tfUkVTUE9OU0VfV1JJVEFCTEUgfSBmcm9tICcuLi9zeW1ib2xzLmpzJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHsgbGlua1RvVHJhY2VDYXJyaWVyLCB0cmFjZSB9IGZyb20gJy4uL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQgeyBnZXRXb3JsZExhenkgfSBmcm9tICcuL2dldC13b3JsZC1sYXp5LmpzJztcbmltcG9ydCB7IGdldFdvcmtmbG93UXVldWVOYW1lIH0gZnJvbSAnLi9oZWxwZXJzLmpzJztcbmltcG9ydCB7IHNhZmVXYWl0VW50aWwsIHdhaXRlZFVudGlsIH0gZnJvbSAnLi93YWl0LXVudGlsLmpzJztcblxuLyoqIEdldCBhIEhvb2sgYW5kIGl0cyBvd25pbmcgcnVuIHdpdGhvdXQgaHlkcmF0aW5nIHBheWxvYWQgZGF0YS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEhvb2tBbmRSdW4odG9rZW46IHN0cmluZyk6IFByb21pc2U8e1xuICBob29rOiBIb29rO1xuICBydW46IFdvcmtmbG93UnVuO1xufT4ge1xuICBjb25zdCB3b3JsZCA9IGF3YWl0IGdldFdvcmxkTGF6eSgpO1xuICBjb25zdCBob29rID0gYXdhaXQgd29ybGQuaG9va3MuZ2V0QnlUb2tlbih0b2tlbik7XG4gIGNvbnN0IHJ1biA9IGF3YWl0IHdvcmxkLnJ1bnMuZ2V0KGhvb2sucnVuSWQpO1xuICByZXR1cm4geyBob29rLCBydW4gfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0SG9va0J5VG9rZW5XaXRoS2V5KHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPHtcbiAgaG9vazogSG9vaztcbiAgZW5jcnlwdGlvbktleTogQ3J5cHRvS2V5IHwgdW5kZWZpbmVkO1xufT4ge1xuICBjb25zdCB7IGhvb2ssIHJ1biB9ID0gYXdhaXQgZ2V0SG9va0FuZFJ1bih0b2tlbik7XG4gIGNvbnN0IHJhd0tleSA9IGF3YWl0IChhd2FpdCBnZXRXb3JsZExhenkoKSkuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKHJ1bik7XG4gIGNvbnN0IGVuY3J5cHRpb25LZXkgPSByYXdLZXkgPyBhd2FpdCBpbXBvcnRLZXkocmF3S2V5KSA6IHVuZGVmaW5lZDtcbiAgaWYgKHR5cGVvZiBob29rLm1ldGFkYXRhICE9PSAndW5kZWZpbmVkJykge1xuICAgIGhvb2subWV0YWRhdGEgPSBhd2FpdCBoeWRyYXRlU3RlcEFyZ3VtZW50cyhcbiAgICAgIGhvb2subWV0YWRhdGEgYXMgYW55LFxuICAgICAgaG9vay5ydW5JZCxcbiAgICAgIGVuY3J5cHRpb25LZXlcbiAgICApO1xuICB9XG4gIHJldHVybiB7IGhvb2ssIGVuY3J5cHRpb25LZXkgfTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIGhvb2sgYnkgdG9rZW4gdG8gZmluZCB0aGUgYXNzb2NpYXRlZCB3b3JrZmxvdyBydW4sXG4gKiBhbmQgaHlkcmF0ZSB0aGUgYG1ldGFkYXRhYCBwcm9wZXJ0eSBpZiBpdCB3YXMgc2V0IGZyb20gd2l0aGluXG4gKiB0aGUgd29ya2Zsb3cgcnVuLlxuICpcbiAqIEEgSG9vayBrZXB0IGJ5IG1pbmltdW0gcmV0ZW50aW9uIHJlbWFpbnMgYXZhaWxhYmxlIGhlcmUgYWZ0ZXIgaXRzIHJ1biBlbmRzLFxuICogYnV0IGNhbm5vdCBiZSByZXN1bWVkLlxuICpcbiAqIEBwYXJhbSB0b2tlbiAtIFRoZSB1bmlxdWUgdG9rZW4gaWRlbnRpZnlpbmcgdGhlIGhvb2tcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEhvb2tCeVRva2VuKHRva2VuOiBzdHJpbmcpOiBQcm9taXNlPEhvb2s+IHtcbiAgY29uc3QgeyBob29rIH0gPSBhd2FpdCBnZXRIb29rQnlUb2tlbldpdGhLZXkodG9rZW4pO1xuICByZXR1cm4gaG9vaztcbn1cblxuLyoqXG4gKiBSZXN1bWVzIGEgd29ya2Zsb3cgcnVuIGJ5IHNlbmRpbmcgYSBwYXlsb2FkIHRvIGEgaG9vayBpZGVudGlmaWVkIGJ5IGl0cyB0b2tlbi5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBleHRlcm5hbGx5IChlLmcuLCBmcm9tIGFuIEFQSSByb3V0ZSBvciBzZXJ2ZXIgYWN0aW9uKVxuICogdG8gc2VuZCBkYXRhIHRvIGEgaG9vayBhbmQgcmVzdW1lIHRoZSBhc3NvY2lhdGVkIHdvcmtmbG93IHJ1bi5cbiAqXG4gKiBAcGFyYW0gdG9rZW5Pckhvb2sgLSBUaGUgdW5pcXVlIHRva2VuIGlkZW50aWZ5aW5nIHRoZSBob29rLCBvciB0aGUgaG9vayBvYmplY3QgaXRzZWxmXG4gKiBAcGFyYW0gcGF5bG9hZCAtIFRoZSBkYXRhIHBheWxvYWQgdG8gc2VuZCB0byB0aGUgaG9va1xuICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGhvb2tcbiAqIEB0aHJvd3Mge0hvb2tOb3RGb3VuZEVycm9yfSBJZiB0aGUgSG9vayBkb2VzIG5vdCBleGlzdCBvciBpdHMgcnVuIGhhcyBlbmRlZFxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogYGBgdHNcbiAqIC8vIEluIGFuIEFQSSByb3V0ZVxuICogaW1wb3J0IHsgcmVzdW1lSG9vayB9IGZyb20gJ0B3b3JrZmxvdy9jb3JlL3J1bnRpbWUnO1xuICpcbiAqIGV4cG9ydCBhc3luYyBmdW5jdGlvbiBQT1NUKHJlcXVlc3Q6IFJlcXVlc3QpIHtcbiAqICAgY29uc3QgeyB0b2tlbiwgZGF0YSB9ID0gYXdhaXQgcmVxdWVzdC5qc29uKCk7XG4gKlxuICogICB0cnkge1xuICogICAgIGNvbnN0IGhvb2sgPSBhd2FpdCByZXN1bWVIb29rKHRva2VuLCBkYXRhKTtcbiAqICAgICByZXR1cm4gUmVzcG9uc2UuanNvbih7IHJ1bklkOiBob29rLnJ1bklkIH0pO1xuICogICB9IGNhdGNoIChlcnJvcikge1xuICogICAgIHJldHVybiBuZXcgUmVzcG9uc2UoJ0hvb2sgbm90IGZvdW5kJywgeyBzdGF0dXM6IDQwNCB9KTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXN1bWVIb29rPFQgPSBhbnk+KFxuICB0b2tlbk9ySG9vazogc3RyaW5nIHwgSG9vayxcbiAgcGF5bG9hZDogVCxcbiAgZW5jcnlwdGlvbktleU92ZXJyaWRlPzogQ3J5cHRvS2V5XG4pOiBQcm9taXNlPEhvb2s+IHtcbiAgcmV0dXJuIGF3YWl0IHdhaXRlZFVudGlsKCgpID0+IHtcbiAgICByZXR1cm4gdHJhY2UoJ2hvb2sucmVzdW1lJywgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGRMYXp5KCk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCBob29rOiBIb29rO1xuICAgICAgICBsZXQgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuO1xuICAgICAgICBpZiAodHlwZW9mIHRva2VuT3JIb29rID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldEhvb2tBbmRSdW4odG9rZW5Pckhvb2spO1xuICAgICAgICAgIGhvb2sgPSByZXN1bHQuaG9vaztcbiAgICAgICAgICB3b3JrZmxvd1J1biA9IHJlc3VsdC5ydW47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaG9vayA9IHRva2VuT3JIb29rO1xuICAgICAgICAgIHdvcmtmbG93UnVuID0gYXdhaXQgd29ybGQucnVucy5nZXQoaG9vay5ydW5JZCk7XG4gICAgICAgIH1cblxuICAgICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuSG9va1Rva2VuKGhvb2sudG9rZW4pLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Ib29rSWQoaG9vay5ob29rSWQpLFxuICAgICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1bklkKGhvb2sucnVuSWQpLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaXNUZXJtaW5hbFdvcmtmbG93UnVuU3RhdHVzKHdvcmtmbG93UnVuLnN0YXR1cykpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgSG9va05vdEZvdW5kRXJyb3IoaG9vay50b2tlbik7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZW5jcnlwdGlvbktleSA9IGVuY3J5cHRpb25LZXlPdmVycmlkZTtcbiAgICAgICAgaWYgKCFlbmNyeXB0aW9uS2V5KSB7XG4gICAgICAgICAgY29uc3QgcmF3S2V5ID0gYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKHdvcmtmbG93UnVuKTtcbiAgICAgICAgICBlbmNyeXB0aW9uS2V5ID0gcmF3S2V5ID8gYXdhaXQgaW1wb3J0S2V5KHJhd0tleSkgOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayB0aGUgdGFyZ2V0IHJ1bidzIGNhcGFiaWxpdGllcyB0byBlbnN1cmUgd2UgZW5jb2RlIHRoZVxuICAgICAgICAvLyBwYXlsb2FkIGluIGEgZm9ybWF0IHRoZSBydW4ncyBkZXBsb3ltZW50IGNhbiBkZWNvZGUuIEZvciBleGFtcGxlLFxuICAgICAgICAvLyBydW5zIGNyZWF0ZWQgYmVmb3JlIGVuY3J5cHRpb24gc3VwcG9ydCB3YXMgYWRkZWQgY2Fubm90IGRlY29kZVxuICAgICAgICAvLyB0aGUgJ2VuY3InIHNlcmlhbGl6YXRpb24gZm9ybWF0LCBhbmQgcnVucyBjcmVhdGVkIGJlZm9yZVxuICAgICAgICAvLyBieXRlLXN0cmVhbSBmcmFtaW5nIHN1cHBvcnQgY2Fubm90IGRlY29kZSBmcmFtZWQgYnl0ZSBzdHJlYW1zLlxuICAgICAgICBjb25zdCByYXdWZXJzaW9uID0gd29ya2Zsb3dSdW4uZXhlY3V0aW9uQ29udGV4dD8ud29ya2Zsb3dDb3JlVmVyc2lvbjtcbiAgICAgICAgY29uc3QgY2FwYWJpbGl0aWVzID0gZ2V0UnVuQ2FwYWJpbGl0aWVzKFxuICAgICAgICAgIHR5cGVvZiByYXdWZXJzaW9uID09PSAnc3RyaW5nJyA/IHJhd1ZlcnNpb24gOiB1bmRlZmluZWRcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFjYXBhYmlsaXRpZXMuc3VwcG9ydGVkRm9ybWF0cy5oYXMoU2VyaWFsaXphdGlvbkZvcm1hdC5FTkNSWVBURUQpKSB7XG4gICAgICAgICAgZW5jcnlwdGlvbktleSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbXByZXNzIHRoZSBwYXlsb2FkIG9ubHkgd2hlbiB0aGUgdGFyZ2V0IHJ1biBpcyBtYXJrZWQgYXNcbiAgICAgICAgLy8gcG9zc2libHkgY29udGFpbmluZyBjb21wcmVzc2VkIHBheWxvYWRzIChzcGVjVmVyc2lvbiA+PSA1KSBBTkRcbiAgICAgICAgLy8gaXRzIGRlcGxveW1lbnQgY2FuIGRlY29kZSB0aGUgJ2d6aXAnIGZvcm1hdC5cbiAgICAgICAgY29uc3QgY29tcHJlc3Npb24gPVxuICAgICAgICAgICh3b3JrZmxvd1J1bi5zcGVjVmVyc2lvbiA/PyAwKSA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT04gJiZcbiAgICAgICAgICBjYXBhYmlsaXRpZXMuc3VwcG9ydGVkRm9ybWF0cy5oYXMoU2VyaWFsaXphdGlvbkZvcm1hdC5HWklQKTtcblxuICAgICAgICAvLyBEZWh5ZHJhdGUgdGhlIHBheWxvYWQgZm9yIHN0b3JhZ2VcbiAgICAgICAgY29uc3Qgb3BzOiBQcm9taXNlPGFueT5bXSA9IFtdO1xuICAgICAgICBjb25zdCB2MUNvbXBhdCA9IGlzTGVnYWN5U3BlY1ZlcnNpb24oaG9vay5zcGVjVmVyc2lvbik7XG4gICAgICAgIGNvbnN0IGRlaHlkcmF0ZWRQYXlsb2FkID0gYXdhaXQgZGVoeWRyYXRlU3RlcFJldHVyblZhbHVlKFxuICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICAgaG9vay5ydW5JZCxcbiAgICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICAgIG9wcyxcbiAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgIHYxQ29tcGF0LFxuICAgICAgICAgIGNhcGFiaWxpdGllcy5mcmFtZWRCeXRlU3RyZWFtcyxcbiAgICAgICAgICBjb21wcmVzc2lvblxuICAgICAgICApO1xuICAgICAgICAvLyBUaGVzZSBwYXlsb2FkLXN0cmVhbSBvcHMgYXJlIGZsdXNoZWQgaW4gdGhlIGJhY2tncm91bmQ7IHRoZVxuICAgICAgICAvLyBwcm9taXNlIGhhbmRlZCB0byB3YWl0VW50aWwgbXVzdCBuZXZlciByZWplY3QgKGFuIHVuY29uc3VtZWRcbiAgICAgICAgLy8gd2FpdFVudGlsIHJlamVjdGlvbiBjcmFzaGVzIHRoZSBwcm9jZXNzIGFzIHVuaGFuZGxlZFJlamVjdGlvbiksXG4gICAgICAgIC8vIHNvIHVuZXhwZWN0ZWQgZmFpbHVyZXMgYXJlIGxvZ2dlZCBpbnN0ZWFkLlxuICAgICAgICAvLyBOT1RFOiByZWplY3Rpb25zIHdpdGggYHVuZGVmaW5lZGAgYXJlIGFuIGV4cGVjdGVkIGFydGlmYWN0IG9mIHRoZVxuICAgICAgICAvLyB3ZWJob29rIGJ1bmRsZSBhbmQgYXJlIGlnbm9yZWQgZW50aXJlbHkuXG4gICAgICAgIHNhZmVXYWl0VW50aWwoUHJvbWlzZS5hbGwob3BzKSwgKGVycikgPT4ge1xuICAgICAgICAgIGlmIChlcnIgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybignQmFja2dyb3VuZCBmbHVzaCBvZiBob29rIHBheWxvYWQgb3BzIGZhaWxlZCcsIHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IGhvb2sucnVuSWQsXG4gICAgICAgICAgICBob29rSWQ6IGhvb2suaG9va0lkLFxuICAgICAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGEgaG9va19yZWNlaXZlZCBldmVudCB3aXRoIHRoZSBwYXlsb2FkXG4gICAgICAgIGF3YWl0IHdvcmxkLmV2ZW50cy5jcmVhdGUoXG4gICAgICAgICAgaG9vay5ydW5JZCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBldmVudFR5cGU6ICdob29rX3JlY2VpdmVkJyxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uOiBTUEVDX1ZFUlNJT05fQ1VSUkVOVCxcbiAgICAgICAgICAgIGNvcnJlbGF0aW9uSWQ6IGhvb2suaG9va0lkLFxuICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgIC4uLih2MUNvbXBhdCA/IHt9IDogeyB0b2tlbjogaG9vay50b2tlbiB9KSxcbiAgICAgICAgICAgICAgcGF5bG9hZDogZGVoeWRyYXRlZFBheWxvYWQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyB2MUNvbXBhdCB9XG4gICAgICAgICk7XG5cbiAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93TmFtZSh3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUpLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBMaW5rIHRvIHRoZSBydW4tb3JpZ2luIGNvbnRleHQgZnJvbSB0aGUgd29ya2Zsb3cgcnVuJ3Mgc3RvcmVkXG4gICAgICAgIC8vIHRyYWNlIGNhcnJpZXIgKHNraXBwZWQgd2hlbiBhYnNlbnQgb3IgaW52YWxpZCkuXG4gICAgICAgIGNvbnN0IG9yaWdpbkxpbmsgPSBhd2FpdCBsaW5rVG9UcmFjZUNhcnJpZXIoXG4gICAgICAgICAgd29ya2Zsb3dSdW4uZXhlY3V0aW9uQ29udGV4dD8udHJhY2VDYXJyaWVyXG4gICAgICAgICk7XG4gICAgICAgIGlmIChvcmlnaW5MaW5rKSB7XG4gICAgICAgICAgc3Bhbj8uYWRkTGluaz8uKG9yaWdpbkxpbmspO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmUtdHJpZ2dlciB0aGUgd29ya2Zsb3cgYWdhaW5zdCB0aGUgZGVwbG95bWVudCBJRCBhc3NvY2lhdGVkXG4gICAgICAgIC8vIHdpdGggdGhlIHdvcmtmbG93IHJ1biB0aGF0IHRoZSBob29rIGJlbG9uZ3MgdG9cbiAgICAgICAgYXdhaXQgd29ybGQucXVldWUoXG4gICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBydW5JZDogaG9vay5ydW5JZCxcbiAgICAgICAgICAgIC8vIGF0dGFjaCB0aGUgdHJhY2UgY2FycmllciBmcm9tIHRoZSB3b3JrZmxvdyBydW5cbiAgICAgICAgICAgIHRyYWNlQ2FycmllcjpcbiAgICAgICAgICAgICAgd29ya2Zsb3dSdW4uZXhlY3V0aW9uQ29udGV4dD8udHJhY2VDYXJyaWVyID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICB9IHNhdGlzZmllcyBXb3JrZmxvd0ludm9rZVBheWxvYWQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZGVwbG95bWVudElkOiB3b3JrZmxvd1J1bi5kZXBsb3ltZW50SWQsXG4gICAgICAgICAgICBzcGVjVmVyc2lvbjogd29ya2Zsb3dSdW4uc3BlY1ZlcnNpb24gPz8gU1BFQ19WRVJTSU9OX0xFR0FDWSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIGhvb2s7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgICAgLi4uQXR0cmlidXRlLkhvb2tUb2tlbihcbiAgICAgICAgICAgIHR5cGVvZiB0b2tlbk9ySG9vayA9PT0gJ3N0cmluZycgPyB0b2tlbk9ySG9vayA6IHRva2VuT3JIb29rLnRva2VuXG4gICAgICAgICAgKSxcbiAgICAgICAgICAuLi5BdHRyaWJ1dGUuSG9va0ZvdW5kKGZhbHNlKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogUmVzdW1lcyBhIHdlYmhvb2sgYnkgc2VuZGluZyBhIHtAbGluayBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUmVxdWVzdCB8IFJlcXVlc3R9XG4gKiBvYmplY3QgdG8gYSBob29rIGlkZW50aWZpZWQgYnkgaXRzIHRva2VuLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGV4dGVybmFsbHkgKGUuZy4sIGZyb20gYW4gQVBJIHJvdXRlIG9yIHNlcnZlciBhY3Rpb24pXG4gKiB0byBzZW5kIGEgcmVxdWVzdCB0byBhIHdlYmhvb2sgYW5kIHJlc3VtZSB0aGUgYXNzb2NpYXRlZCB3b3JrZmxvdyBydW4uXG4gKlxuICogQHBhcmFtIHRva2VuIC0gVGhlIHVuaXF1ZSB0b2tlbiBpZGVudGlmeWluZyB0aGUgaG9va1xuICogQHBhcmFtIHJlcXVlc3QgLSBUaGUgcmVxdWVzdCB0byBzZW5kIHRvIHRoZSBob29rXG4gKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmVzcG9uc2VcbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGhvb2sgaXMgbm90IGZvdW5kIG9yIGlmIHRoZXJlJ3MgYW4gZXJyb3IgZHVyaW5nIHRoZSBwcm9jZXNzXG4gKlxuICogQGV4YW1wbGVcbiAqXG4gKiBgYGB0c1xuICogLy8gSW4gYW4gQVBJIHJvdXRlXG4gKiBpbXBvcnQgeyByZXN1bWVXZWJob29rIH0gZnJvbSAnQHdvcmtmbG93L2NvcmUvcnVudGltZSc7XG4gKlxuICogZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIFBPU1QocmVxdWVzdDogUmVxdWVzdCkge1xuICogICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsKTtcbiAqICAgY29uc3QgdG9rZW4gPSB1cmwuc2VhcmNoUGFyYW1zLmdldCgndG9rZW4nKTtcbiAqXG4gKiAgIGlmICghdG9rZW4pIHtcbiAqICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKCdNaXNzaW5nIHRva2VuJywgeyBzdGF0dXM6IDQwMCB9KTtcbiAqICAgfVxuICpcbiAqICAgdHJ5IHtcbiAqICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlc3VtZVdlYmhvb2sodG9rZW4sIHJlcXVlc3QpO1xuICogICAgIHJldHVybiByZXNwb25zZTtcbiAqICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKCdXZWJob29rIG5vdCBmb3VuZCcsIHsgc3RhdHVzOiA0MDQgfSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzdW1lV2ViaG9vayhcbiAgdG9rZW46IHN0cmluZyxcbiAgcmVxdWVzdDogUmVxdWVzdFxuKTogUHJvbWlzZTxSZXNwb25zZT4ge1xuICBjb25zdCB7IGhvb2ssIGVuY3J5cHRpb25LZXkgfSA9IGF3YWl0IGdldEhvb2tCeVRva2VuV2l0aEtleSh0b2tlbik7XG5cbiAgLy8gT25seSB3ZWJob29rcyBjYW4gYmUgcmVzdW1lZCB2aWEgdGhlIHB1YmxpYyBlbmRwb2ludC5cbiAgLy8gSWYgdGhlIGhvb2sgd2FzIGNyZWF0ZWQgdmlhIGNyZWF0ZUhvb2soKSAoaXNXZWJob29rICE9PSB0cnVlKSxcbiAgLy8gdGhyb3cgdGhlIHNhbWUgXCJub3QgZm91bmRcIiBlcnJvciB0aGUgd29ybGQgd291bGQgdGhyb3cgZm9yIGEgbWlzc2luZ1xuICAvLyB0b2tlbi4gVGhpcyBwcmV2ZW50cyBsZWFraW5nIHRoYXQgdGhlIHRva2VuIGlzIHZhbGlkLlxuICBpZiAoaG9vay5pc1dlYmhvb2sgPT09IGZhbHNlKSB7XG4gICAgdGhyb3cgbmV3IEhvb2tOb3RGb3VuZEVycm9yKHRva2VuKTtcbiAgfVxuXG4gIGxldCByZXNwb25zZTogUmVzcG9uc2UgfCB1bmRlZmluZWQ7XG4gIGxldCByZXNwb25zZVJlYWRhYmxlOiBSZWFkYWJsZVN0cmVhbTxSZXNwb25zZT4gfCB1bmRlZmluZWQ7XG4gIGlmIChcbiAgICBob29rLm1ldGFkYXRhICYmXG4gICAgdHlwZW9mIGhvb2subWV0YWRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgJ3Jlc3BvbmRXaXRoJyBpbiBob29rLm1ldGFkYXRhXG4gICkge1xuICAgIGlmIChob29rLm1ldGFkYXRhLnJlc3BvbmRXaXRoID09PSAnbWFudWFsJykge1xuICAgICAgY29uc3QgeyByZWFkYWJsZSwgd3JpdGFibGUgfSA9IG5ldyBUcmFuc2Zvcm1TdHJlYW08UmVzcG9uc2UsIFJlc3BvbnNlPigpO1xuICAgICAgcmVzcG9uc2VSZWFkYWJsZSA9IHJlYWRhYmxlO1xuXG4gICAgICAvLyBUaGUgcmVxdWVzdCBpbnN0YW5jZSBpbmNsdWRlcyB0aGUgd3JpdGFibGUgc3RyZWFtIHdoaWNoIHdpbGwgYmUgdXNlZFxuICAgICAgLy8gdG8gd3JpdGUgdGhlIHJlc3BvbnNlIHRvIHRoZSBjbGllbnQgZnJvbSB3aXRoaW4gdGhlIHdvcmtmbG93IHJ1blxuICAgICAgKHJlcXVlc3QgYXMgYW55KVtXRUJIT09LX1JFU1BPTlNFX1dSSVRBQkxFXSA9IHdyaXRhYmxlO1xuICAgIH0gZWxzZSBpZiAoaG9vay5tZXRhZGF0YS5yZXNwb25kV2l0aCBpbnN0YW5jZW9mIFJlc3BvbnNlKSB7XG4gICAgICByZXNwb25zZSA9IGhvb2subWV0YWRhdGEucmVzcG9uZFdpdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgYEludmFsaWQgXFxgcmVzcG9uZFdpdGhcXGAgdmFsdWU6ICR7aG9vay5tZXRhZGF0YS5yZXNwb25kV2l0aH1gLFxuICAgICAgICB7IHNsdWc6IEVSUk9SX1NMVUdTLldFQkhPT0tfSU5WQUxJRF9SRVNQT05EX1dJVEhfVkFMVUUgfVxuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gTm8gYHJlc3BvbmRXaXRoYCB2YWx1ZSBpbXBsaWVzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHJldHVybmluZyBhIDIwMlxuICAgIHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKG51bGwsIHsgc3RhdHVzOiAyMDIgfSk7XG4gIH1cblxuICBhd2FpdCByZXN1bWVIb29rKGhvb2ssIHJlcXVlc3QsIGVuY3J5cHRpb25LZXkpO1xuXG4gIGlmIChyZXNwb25zZVJlYWRhYmxlKSB7XG4gICAgLy8gV2FpdCBmb3IgdGhlIHJlYWRhYmxlIHN0cmVhbSB0byBlbWl0IG9uZSBjaHVuayxcbiAgICAvLyB3aGljaCBpcyB0aGUgYFJlc3BvbnNlYCBvYmplY3RcbiAgICBjb25zdCByZWFkZXIgPSByZXNwb25zZVJlYWRhYmxlLmdldFJlYWRlcigpO1xuICAgIGNvbnN0IGNodW5rID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICBpZiAoY2h1bmsudmFsdWUpIHtcbiAgICAgIHJlc3BvbnNlID0gY2h1bmsudmFsdWU7XG4gICAgfVxuICAgIHJlYWRlci5jYW5jZWwoKTtcbiAgfVxuXG4gIGlmICghcmVzcG9uc2UpIHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoJ1dvcmtmbG93IHJ1biBkaWQgbm90IHNlbmQgYSByZXNwb25zZScsIHtcbiAgICAgIHNsdWc6IEVSUk9SX1NMVUdTLldFQkhPT0tfUkVTUE9OU0VfTk9UX1NFTlQsXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2U7XG59XG4iXX0=
@@ -2,6 +2,15 @@
2
2
  * Extracts the run's creation timestamp (epoch milliseconds) from a `wrun_`
3
3
  * run ID by decoding the embedded ULID time component.
4
4
  *
5
+ * `@workflow/world-vercel`'s region-tagged run IDs mark an ID as carrying
6
+ * metadata by setting the most-significant bit of the ULID's 48-bit
7
+ * timestamp, which would otherwise skew the decoded time past the year 6400.
8
+ * The tag-bit handling is delegated to the scheme's own codec —
9
+ * `decode()` returns the ULID with the tag bit cleared — so if the tagged
10
+ * layout ever evolves (the scheme carries a 5-bit version field for exactly
11
+ * that), this anchor keeps tracking the codec instead of silently diverging.
12
+ * For untagged input `decode()` is a passthrough.
13
+ *
5
14
  * Returns `undefined` when `runId` is not a decodable `wrun_<ulid>` (e.g. a
6
15
  * legacy/non-ULID id, or a test fixture like `wrun_test`); callers fall back to
7
16
  * an authoritative timestamp from the run snapshot (`createdAt`) in that case.
@@ -1 +1 @@
1
- {"version":3,"file":"run-id-time.d.ts","sourceRoot":"","sources":["../../src/runtime/run-id-time.ts"],"names":[],"mappings":"AAaA;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAShE"}
1
+ {"version":3,"file":"run-id-time.d.ts","sourceRoot":"","sources":["../../src/runtime/run-id-time.ts"],"names":[],"mappings":"AAeA;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAShE"}
@@ -1,7 +1,9 @@
1
+ import { decode } from '@workflow/world-vercel/run-id';
1
2
  import { decodeTime } from 'ulid';
2
3
  /**
3
- * Run IDs are minted client-side in `start()` as `wrun_<ulid>` (see
4
- * `runtime/start.ts`). A ULID encodes its creation time in its first 48 bits,
4
+ * Run IDs are minted client-side in `start()` as `wrun_<ulid>` (via
5
+ * `World.createRunId()` when the world provides one, else a plain ULID see
6
+ * `runtime/helpers.ts`). A ULID encodes its creation time in its first 48 bits,
5
7
  * so the run's creation timestamp is recoverable from the run ID alone —
6
8
  * without any server round-trip or run-snapshot load. This is the earliest
7
9
  * replay-stable timestamp a delivery has (the run ID arrives in the queue
@@ -13,6 +15,15 @@ const RUN_ID_PREFIX = 'wrun_';
13
15
  * Extracts the run's creation timestamp (epoch milliseconds) from a `wrun_`
14
16
  * run ID by decoding the embedded ULID time component.
15
17
  *
18
+ * `@workflow/world-vercel`'s region-tagged run IDs mark an ID as carrying
19
+ * metadata by setting the most-significant bit of the ULID's 48-bit
20
+ * timestamp, which would otherwise skew the decoded time past the year 6400.
21
+ * The tag-bit handling is delegated to the scheme's own codec —
22
+ * `decode()` returns the ULID with the tag bit cleared — so if the tagged
23
+ * layout ever evolves (the scheme carries a 5-bit version field for exactly
24
+ * that), this anchor keeps tracking the codec instead of silently diverging.
25
+ * For untagged input `decode()` is a passthrough.
26
+ *
16
27
  * Returns `undefined` when `runId` is not a decodable `wrun_<ulid>` (e.g. a
17
28
  * legacy/non-ULID id, or a test fixture like `wrun_test`); callers fall back to
18
29
  * an authoritative timestamp from the run snapshot (`createdAt`) in that case.
@@ -22,10 +33,10 @@ export function runIdCreatedAt(runId) {
22
33
  ? runId.slice(RUN_ID_PREFIX.length)
23
34
  : runId;
24
35
  try {
25
- return decodeTime(ulidPart);
36
+ return decodeTime(decode(ulidPart).ulid);
26
37
  }
27
38
  catch {
28
39
  return undefined;
29
40
  }
30
41
  }
31
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLWlkLXRpbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9ydW4taWQtdGltZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWxDOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDO0FBRTlCOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEtBQWE7SUFDMUMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7UUFDOUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztRQUNuQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ1YsSUFBSSxDQUFDO1FBQ0gsT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVjb2RlVGltZSB9IGZyb20gJ3VsaWQnO1xuXG4vKipcbiAqIFJ1biBJRHMgYXJlIG1pbnRlZCBjbGllbnQtc2lkZSBpbiBgc3RhcnQoKWAgYXMgYHdydW5fPHVsaWQ+YCAoc2VlXG4gKiBgcnVudGltZS9zdGFydC50c2ApLiBBIFVMSUQgZW5jb2RlcyBpdHMgY3JlYXRpb24gdGltZSBpbiBpdHMgZmlyc3QgNDggYml0cyxcbiAqIHNvIHRoZSBydW4ncyBjcmVhdGlvbiB0aW1lc3RhbXAgaXMgcmVjb3ZlcmFibGUgZnJvbSB0aGUgcnVuIElEIGFsb25lIOKAlFxuICogd2l0aG91dCBhbnkgc2VydmVyIHJvdW5kLXRyaXAgb3IgcnVuLXNuYXBzaG90IGxvYWQuIFRoaXMgaXMgdGhlIGVhcmxpZXN0XG4gKiByZXBsYXktc3RhYmxlIHRpbWVzdGFtcCBhIGRlbGl2ZXJ5IGhhcyAodGhlIHJ1biBJRCBhcnJpdmVzIGluIHRoZSBxdWV1ZVxuICogcGF5bG9hZCksIHdoaWNoIGxldHMgdGhlIHdvcmtmbG93IFZNIGJlIHNlZWRlZCBhbmQgY2xvY2staW5pdGlhbGl6ZWQgYmVmb3JlXG4gKiBgcnVuX3N0YXJ0ZWRgLlxuICovXG5jb25zdCBSVU5fSURfUFJFRklYID0gJ3dydW5fJztcblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgcnVuJ3MgY3JlYXRpb24gdGltZXN0YW1wIChlcG9jaCBtaWxsaXNlY29uZHMpIGZyb20gYSBgd3J1bl9gXG4gKiBydW4gSUQgYnkgZGVjb2RpbmcgdGhlIGVtYmVkZGVkIFVMSUQgdGltZSBjb21wb25lbnQuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIGBydW5JZGAgaXMgbm90IGEgZGVjb2RhYmxlIGB3cnVuXzx1bGlkPmAgKGUuZy4gYVxuICogbGVnYWN5L25vbi1VTElEIGlkLCBvciBhIHRlc3QgZml4dHVyZSBsaWtlIGB3cnVuX3Rlc3RgKTsgY2FsbGVycyBmYWxsIGJhY2sgdG9cbiAqIGFuIGF1dGhvcml0YXRpdmUgdGltZXN0YW1wIGZyb20gdGhlIHJ1biBzbmFwc2hvdCAoYGNyZWF0ZWRBdGApIGluIHRoYXQgY2FzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bklkQ3JlYXRlZEF0KHJ1bklkOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCB1bGlkUGFydCA9IHJ1bklkLnN0YXJ0c1dpdGgoUlVOX0lEX1BSRUZJWClcbiAgICA/IHJ1bklkLnNsaWNlKFJVTl9JRF9QUkVGSVgubGVuZ3RoKVxuICAgIDogcnVuSWQ7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGRlY29kZVRpbWUodWxpZFBhcnQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLWlkLXRpbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9ydW4taWQtdGltZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVsQzs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUM7QUFFOUI7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEtBQWE7SUFDMUMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7UUFDOUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztRQUNuQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ1YsSUFBSSxDQUFDO1FBQ0gsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlY29kZSB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZC12ZXJjZWwvcnVuLWlkJztcbmltcG9ydCB7IGRlY29kZVRpbWUgfSBmcm9tICd1bGlkJztcblxuLyoqXG4gKiBSdW4gSURzIGFyZSBtaW50ZWQgY2xpZW50LXNpZGUgaW4gYHN0YXJ0KClgIGFzIGB3cnVuXzx1bGlkPmAgKHZpYVxuICogYFdvcmxkLmNyZWF0ZVJ1bklkKClgIHdoZW4gdGhlIHdvcmxkIHByb3ZpZGVzIG9uZSwgZWxzZSBhIHBsYWluIFVMSUQg4oCUIHNlZVxuICogYHJ1bnRpbWUvaGVscGVycy50c2ApLiBBIFVMSUQgZW5jb2RlcyBpdHMgY3JlYXRpb24gdGltZSBpbiBpdHMgZmlyc3QgNDggYml0cyxcbiAqIHNvIHRoZSBydW4ncyBjcmVhdGlvbiB0aW1lc3RhbXAgaXMgcmVjb3ZlcmFibGUgZnJvbSB0aGUgcnVuIElEIGFsb25lIOKAlFxuICogd2l0aG91dCBhbnkgc2VydmVyIHJvdW5kLXRyaXAgb3IgcnVuLXNuYXBzaG90IGxvYWQuIFRoaXMgaXMgdGhlIGVhcmxpZXN0XG4gKiByZXBsYXktc3RhYmxlIHRpbWVzdGFtcCBhIGRlbGl2ZXJ5IGhhcyAodGhlIHJ1biBJRCBhcnJpdmVzIGluIHRoZSBxdWV1ZVxuICogcGF5bG9hZCksIHdoaWNoIGxldHMgdGhlIHdvcmtmbG93IFZNIGJlIHNlZWRlZCBhbmQgY2xvY2staW5pdGlhbGl6ZWQgYmVmb3JlXG4gKiBgcnVuX3N0YXJ0ZWRgLlxuICovXG5jb25zdCBSVU5fSURfUFJFRklYID0gJ3dydW5fJztcblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgcnVuJ3MgY3JlYXRpb24gdGltZXN0YW1wIChlcG9jaCBtaWxsaXNlY29uZHMpIGZyb20gYSBgd3J1bl9gXG4gKiBydW4gSUQgYnkgZGVjb2RpbmcgdGhlIGVtYmVkZGVkIFVMSUQgdGltZSBjb21wb25lbnQuXG4gKlxuICogYEB3b3JrZmxvdy93b3JsZC12ZXJjZWxgJ3MgcmVnaW9uLXRhZ2dlZCBydW4gSURzIG1hcmsgYW4gSUQgYXMgY2FycnlpbmdcbiAqIG1ldGFkYXRhIGJ5IHNldHRpbmcgdGhlIG1vc3Qtc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBVTElEJ3MgNDgtYml0XG4gKiB0aW1lc3RhbXAsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBza2V3IHRoZSBkZWNvZGVkIHRpbWUgcGFzdCB0aGUgeWVhciA2NDAwLlxuICogVGhlIHRhZy1iaXQgaGFuZGxpbmcgaXMgZGVsZWdhdGVkIHRvIHRoZSBzY2hlbWUncyBvd24gY29kZWMg4oCUXG4gKiBgZGVjb2RlKClgIHJldHVybnMgdGhlIFVMSUQgd2l0aCB0aGUgdGFnIGJpdCBjbGVhcmVkIOKAlCBzbyBpZiB0aGUgdGFnZ2VkXG4gKiBsYXlvdXQgZXZlciBldm9sdmVzICh0aGUgc2NoZW1lIGNhcnJpZXMgYSA1LWJpdCB2ZXJzaW9uIGZpZWxkIGZvciBleGFjdGx5XG4gKiB0aGF0KSwgdGhpcyBhbmNob3Iga2VlcHMgdHJhY2tpbmcgdGhlIGNvZGVjIGluc3RlYWQgb2Ygc2lsZW50bHkgZGl2ZXJnaW5nLlxuICogRm9yIHVudGFnZ2VkIGlucHV0IGBkZWNvZGUoKWAgaXMgYSBwYXNzdGhyb3VnaC5cbiAqXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gYHJ1bklkYCBpcyBub3QgYSBkZWNvZGFibGUgYHdydW5fPHVsaWQ+YCAoZS5nLiBhXG4gKiBsZWdhY3kvbm9uLVVMSUQgaWQsIG9yIGEgdGVzdCBmaXh0dXJlIGxpa2UgYHdydW5fdGVzdGApOyBjYWxsZXJzIGZhbGwgYmFjayB0b1xuICogYW4gYXV0aG9yaXRhdGl2ZSB0aW1lc3RhbXAgZnJvbSB0aGUgcnVuIHNuYXBzaG90IChgY3JlYXRlZEF0YCkgaW4gdGhhdCBjYXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuSWRDcmVhdGVkQXQocnVuSWQ6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHVsaWRQYXJ0ID0gcnVuSWQuc3RhcnRzV2l0aChSVU5fSURfUFJFRklYKVxuICAgID8gcnVuSWQuc2xpY2UoUlVOX0lEX1BSRUZJWC5sZW5ndGgpXG4gICAgOiBydW5JZDtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZGVjb2RlVGltZShkZWNvZGUodWxpZFBhcnQpLnVsaWQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/runtime/start.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAyB,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAwBpE,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAwB/B;;;;;GAKG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;IAEd;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEpC;;;;;;;;;;;OAWG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC;;;;;;;;;;;;OAYG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,4BAA6B,SAAQ,gBAAgB;IACpE;;;;;;;;;;;;;;;OAeG;IACH,YAAY,EAAE,QAAQ,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,+BAAgC,SAAQ,gBAAgB;IACvE,YAAY,CAAC,EAAE,SAAS,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB,4BAA4B,GAC5B,+BAA+B,CAAC;AAEpC;;GAEG;AACH,MAAM,MAAM,gBAAgB,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,IAAI,CAC/D,GAAG,IAAI,EAAE,KAAK,KACX,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtD;;;;;;;GAOG;AAIH,wBAAgB,KAAK,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,EACpD,QAAQ,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAC7D,IAAI,EAAE,OAAO,EAAE,EACf,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAEzB,wBAAgB,KAAK,CAAC,OAAO,EAC3B,QAAQ,EAAE,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAC1D,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAGzB,wBAAgB,KAAK,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,EACpD,QAAQ,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAC7D,IAAI,EAAE,KAAK,EACX,OAAO,CAAC,EAAE,+BAA+B,GACxC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAEzB,wBAAgB,KAAK,CAAC,OAAO,EAC3B,QAAQ,EAAE,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAC1D,OAAO,CAAC,EAAE,+BAA+B,GACxC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/runtime/start.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAyB,KAAK,EAAE,MAAM,iBAAiB,CAAC;AA2BpE,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AA8C/B;;;;;GAKG;AACH,wBAAgB,4BAA4B,IAAI,IAAI,CAEnD;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;IAEd;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;;;;;;;;OAUG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEpC;;;;;;;;;;;OAWG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAElC;;;;;;;;;;;;OAYG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,4BAA6B,SAAQ,gBAAgB;IACpE;;;;;;;;;;;;;;;OAeG;IACH,YAAY,EAAE,QAAQ,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,+BAAgC,SAAQ,gBAAgB;IACvE,YAAY,CAAC,EAAE,SAAS,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GACpB,4BAA4B,GAC5B,+BAA+B,CAAC;AAEpC;;GAEG;AACH,MAAM,MAAM,gBAAgB,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,IAAI,CAC/D,GAAG,IAAI,EAAE,KAAK,KACX,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtD;;;;;;;GAOG;AAIH,wBAAgB,KAAK,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,EACpD,QAAQ,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAC7D,IAAI,EAAE,OAAO,EAAE,EACf,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAEzB,wBAAgB,KAAK,CAAC,OAAO,EAC3B,QAAQ,EAAE,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAC1D,OAAO,EAAE,4BAA4B,GACpC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAGzB,wBAAgB,KAAK,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,EACpD,QAAQ,EAAE,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAC7D,IAAI,EAAE,KAAK,EACX,OAAO,CAAC,EAAE,+BAA+B,GACxC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAEzB,wBAAgB,KAAK,CAAC,OAAO,EAC3B,QAAQ,EAAE,gBAAgB,CAAC,EAAE,EAAE,OAAO,CAAC,GAAG,gBAAgB,EAC1D,OAAO,CAAC,EAAE,+BAA+B,GACxC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { EntityConflictError, WorkflowRuntimeError } from '@workflow/errors';
2
2
  import { workflowDisplayName } from '@workflow/utils/parse-name';
3
- import { isLegacySpecVersion, SPEC_VERSION_SUPPORTS_ATTRIBUTES, SPEC_VERSION_SUPPORTS_CBOR_QUEUE_TRANSPORT, SPEC_VERSION_SUPPORTS_COMPRESSION, workflowRunIdSchema, } from '@workflow/world';
3
+ import { isLegacySpecVersion, PARENT_RUN_ID_ATTRIBUTE, ROOT_RUN_ID_ATTRIBUTE, SPEC_VERSION_SUPPORTS_ATTRIBUTES, SPEC_VERSION_SUPPORTS_CBOR_QUEUE_TRANSPORT, SPEC_VERSION_SUPPORTS_COMPRESSION, workflowRunIdSchema, } from '@workflow/world';
4
4
  import { monotonicFactory } from 'ulid';
5
5
  import { normalizeAttributeChanges } from '../attribute-changes.js';
6
6
  import { getRunCapabilities } from '../capabilities.js';
@@ -8,6 +8,7 @@ import { isRetryableWorldError } from '../classify-error.js';
8
8
  import { importKey } from '../encryption.js';
9
9
  import { runtimeLogger } from '../logger.js';
10
10
  import { dehydrateWorkflowArguments, SerializationFormat, } from '../serialization.js';
11
+ import { contextStorage } from '../step/context-storage.js';
11
12
  import * as Attribute from '../telemetry/semantic-conventions.js';
12
13
  import { serializeTraceCarrier, trace } from '../telemetry.js';
13
14
  import { version as workflowCoreVersion } from '../version.js';
@@ -28,6 +29,27 @@ import { assertWorldSupportsRuntimeProtocol } from './world-compatibility.js';
28
29
  const CROSS_DEPLOYMENT_CAPABILITY_PROBE_TIMEOUT_MS = 2_000;
29
30
  /** ULID generator for client-side runId generation */
30
31
  const ulid = monotonicFactory();
32
+ /**
33
+ * Cross-run lineage for a run being started from inside another run.
34
+ *
35
+ * The ambient step context carries the parent run id and the root of its
36
+ * lineage; the runtime fills both from the run it already has loaded, so this
37
+ * is a pure context read with no I/O. The new run records `$parentRunId` (the
38
+ * edge) and inherits the parent's `$rootRunId` (the parent itself when it is a
39
+ * root), so a daisy chain or fan-out of any depth groups under one root id.
40
+ * Returns `undefined` for a top-level `start()`, which has no context, so
41
+ * standalone runs carry no lineage.
42
+ */
43
+ function resolveLineageAttributes() {
44
+ const store = contextStorage.getStore();
45
+ const parentRunId = store?.workflowMetadata?.workflowRunId;
46
+ if (!parentRunId)
47
+ return undefined;
48
+ return {
49
+ [ROOT_RUN_ID_ATTRIBUTE]: store.rootRunId ?? parentRunId,
50
+ [PARENT_RUN_ID_ATTRIBUTE]: parentRunId,
51
+ };
52
+ }
31
53
  // `deploymentId: 'latest'` is a no-op in Worlds without atomic deployments.
32
54
  // The warning that explains this only needs to fire once per process: a
33
55
  // workflow that hardcodes 'latest' for its Vercel deployment would otherwise
@@ -164,13 +186,21 @@ export async function start(workflow, argsOrOptions, options) {
164
186
  });
165
187
  attributes = Object.fromEntries(changes.map(({ key, value }) => [key, value]));
166
188
  }
167
- // Seed payload shared by run_created and the resilient-start queue
168
- // input. The flag rides along so server-side validation matches the
169
- // client-side check above on both paths.
170
- const attributeSeed = attributes
189
+ // Cross-run lineage: the reserved keys ride on the run's existing
190
+ // attributes, so they add no extra write. Caller attributes are spread
191
+ // last, so a caller with allowReservedAttributes can deliberately
192
+ // re-parent.
193
+ const lineage = specVersion >= SPEC_VERSION_SUPPORTS_ATTRIBUTES
194
+ ? resolveLineageAttributes()
195
+ : undefined;
196
+ const runAttributes = lineage
197
+ ? { ...lineage, ...attributes }
198
+ : attributes;
199
+ // Shared by the run_created event and the resilient-start queue input.
200
+ const attributeSeed = runAttributes
171
201
  ? {
172
- attributes,
173
- ...(allowReservedAttributes
202
+ attributes: runAttributes,
203
+ ...(allowReservedAttributes || lineage != null
174
204
  ? { allowReservedAttributes: true }
175
205
  : {}),
176
206
  }
@@ -310,4 +340,4 @@ export async function start(workflow, argsOrOptions, options) {
310
340
  });
311
341
  });
312
342
  }
313
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9zdGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVqRSxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLGdDQUFnQyxFQUNoQywwQ0FBMEMsRUFDMUMsaUNBQWlDLEVBQ2pDLG1CQUFtQixHQUNwQixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUU3QyxPQUFPLEVBQ0wsMEJBQTBCLEVBQzFCLG1CQUFtQixHQUNwQixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sS0FBSyxTQUFTLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxPQUFPLElBQUksbUJBQW1CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDakUsT0FBTyxFQUFFLEdBQUcsRUFBRSxN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LHVFQUF1RTtZQUN2RSxpRUFBaUU7WUFDakUsc0VBQXNFO1lBQ3RFLCtCQUErQjtZQUMvQixhQUFhLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUN0QyxhQUFhLENBQUMsSUFBSSxDQUNoQixzREFBc0QsRUFDdEQ7b0JBQ0UsYUFBYSxFQUFFLEtBQUs7b0JBQ3BCLEtBQUssRUFBRSxHQUFHLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDO2lCQUN4RCxDQUNGLENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztZQUVILElBQUksRUFBRSxhQUFhLENBQUM7Z0JBQ2xCLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7Z0JBQ2pDLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7Z0JBQ3ZDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssV0FBVztvQkFDM0MsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEdBQUc7b0JBQ3hCLENBQUMsQ0FBQyxTQUFTLENBQUMsaUJBQWlCLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7b0JBQ2hFLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDUixDQUFDLENBQUM7WUFFSCxPQUFPLElBQUksR0FBRyxDQUFVLEtBQUssRUFBRSxFQUFFLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbnRpdHlDb25mbGljdEVycm9yLCBXb3JrZmxvd1J1bnRpbWVFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgd29ya2Zsb3dEaXNwbGF5TmFtZSB9IGZyb20gJ0B3b3JrZmxvdy91dGlscy9wYXJzZS1uYW1lJztcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dJbnZva2VQYXlsb2FkLCBXb3JsZCB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQge1xuICBpc0xlZ2FjeVNwZWNWZXJzaW9uLFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQVRUUklCVVRFUyxcbiAgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NCT1JfUVVFVUVfVFJBTlNQT1JULFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT04sXG4gIHdvcmtmbG93UnVuSWRTY2hlbWEsXG59IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBtb25vdG9uaWNGYWN0b3J5IH0gZnJvbSAndWxpZCc7XG5pbXBvcnQgeyBub3JtYWxpemVBdHRyaWJ1dGVDaGFuZ2VzIH0gZnJvbSAnLi4vYXR0cmlidXRlLWNoYW5nZXMuanMnO1xuaW1wb3J0IHsgZ2V0UnVuQ2FwYWJpbGl0aWVzIH0gZnJvbSAnLi4vY2FwYWJpbGl0aWVzLmpzJztcbmltcG9ydCB7IGlzUmV0cnlhYmxlV29ybGRFcnJvciB9IGZyb20gJy4uL2NsYXNzaWZ5LWVycm9yLmpzJztcbmltcG9ydCB7IGltcG9ydEtleSB9IGZyb20gJy4uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHsgcnVudGltZUxvZ2dlciB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFNlcmlhbGl6YWJsZSB9IGZyb20gJy4uL3NjaGVtYXMuanMnO1xuaW1wb3J0IHtcbiAgZGVoeWRyYXRlV29ya2Zsb3dBcmd1bWVudHMsXG4gIFNlcmlhbGl6YXRpb25Gb3JtYXQsXG59IGZyb20gJy4uL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0ICogYXMgQXR0cmlidXRlIGZyb20gJy4uL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG5pbXBvcnQgeyBzZXJpYWxpemVUcmFjZUNhcnJpZXIsIHRyYWNlIH0gZnJvbSAnLi4vdGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7IHZlcnNpb24gYXMgd29ya2Zsb3dDb3JlVmVyc2lvbiB9IGZyb20gJy4uL3ZlcnNpb24uanMnO1xuaW1wb3J0IHsgZ2V0V29ybGRMYXp5IH0gZnJvbSAnLi9nZXQtd29ybGQtbGF6eS5qcyc7XG5pbXBvcnQgeyBnZXRXb3JrZmxvd1F1ZXVlTmFtZSwgaGVhbHRoQ2hlY2sgfSBmcm9tICcuL2hlbHBlcnMuanMnO1xuaW1wb3J0IHsgUnVuIH0gZnJvbSAnLi9ydW4uanMnO1xuaW1wb3J0IHsgc2FmZVdhaXRVbnRpbCwgd2FpdGVkVW50aWwgfSBmcm9tICcuL3dhaXQtdW50aWwuanMnO1xuaW1wb3J0IHsgYXNzZXJ0V29ybGRTdXBwb3J0c1J1bnRpbWVQcm90b2NvbCB9IGZyb20gJy4vd29ybGQtY29tcGF0aWJpbGl0eS5qcyc7XG5cbi8qKlxuICogVGltZW91dCBmb3IgdGhlIGNyb3NzLWRlcGxveW1lbnQgY2FwYWJpbGl0eSBwcm9iZSBkb25lIGJlZm9yZVxuICogZGVoeWRyYXRpbmcgd29ya2Zsb3cgYXJndW1lbnRzLiBLZXB0IHRpZ2h0IG9uIHB1cnBvc2U6IHRoZSBwcm9iZSBpc1xuICogYW4gb3B0aW1pemF0aW9uIChpdCBsZXRzIHRoZSBjYWxsZXIgZW1pdCB0aGUgZnJhbWVkIGJ5dGUtc3RyZWFtIHdpcmVcbiAqIGZvcm1hdCB3aGVuIHRoZSB0YXJnZXQgc3VwcG9ydHMgaXQpLCBhbmQgdGhlIGZhbGxiYWNrIG9uIHRpbWVvdXQgaXNcbiAqIHRoZSBsZWdhY3kgcmF3IGZvcm1hdCB3aGljaCBhbHdheXMgd29ya3MuIExvbmcgZGVsYXlzIGhlcmUgd291bGQganVzdFxuICogbWFrZSBgc3RhcnQoeyBkZXBsb3ltZW50SWQ6IC4uLiB9KWAgc2xvd2VyIGZvciB1c2VycyB3aG9zZSB0YXJnZXRcbiAqIGRlcGxveW1lbnRzIGRvbid0IHJlY29nbml6ZSB0aGUgaGVhbHRoIGNoZWNrIGF0IGFsbC5cbiAqL1xuY29uc3QgQ1JPU1NfREVQTE9ZTUVOVF9DQVBBQklMSVRZX1BST0JFX1RJTUVPVVRfTVMgPSAyXzAwMDtcblxuLyoqIFVMSUQgZ2VuZXJhdG9yIGZvciBjbGllbnQtc2lkZSBydW5JZCBnZW5lcmF0aW9uICovXG5jb25zdCB1bGlkID0gbW9ub3RvbmljRmFjdG9yeSgpO1xuXG4vLyBgZGVwbG95bWVudElkOiAnbGF0ZXN0J2AgaXMgYSBuby1vcCBpbiBXb3JsZHMgd2l0aG91dCBhdG9taWMgZGVwbG95bWVudHMuXG4vLyBUaGUgd2FybmluZyB0aGF0IGV4cGxhaW5zIHRoaXMgb25seSBuZWVkcyB0byBmaXJlIG9uY2UgcGVyIHByb2Nlc3M6IGFcbi8vIHdvcmtmbG93IHRoYXQgaGFyZGNvZGVzICdsYXRlc3QnIGZvciBpdHMgVmVyY2VsIGRlcGxveW1lbnQgd291bGQgb3RoZXJ3aXNlXG4vLyBsb2cgaXQgb24gZXZlcnkgbG9jYWwvUG9zdGdyZXMgcnVuLCBmbG9vZGluZyB0aWdodCBkZXYgbG9vcHMuXG5sZXQgaGFzV2FybmVkTGF0ZXN0Tm9PcCA9IGZhbHNlO1xuXG4vKipcbiAqIFJlc2V0IHRoZSBgZGVwbG95bWVudElkOiAnbGF0ZXN0J2Agbm8tb3Agd2Fybi1vbmNlIGd1YXJkLiBUZXN0LW9ubHkg4oCUXG4gKiBleHBvcnRlZCBzbyB1bml0IHRlc3RzIGNhbiBleGVyY2lzZSB0aGUgd2FybiBwYXRoIGFjcm9zcyBgc3RhcnQoKWAgY2FsbHMuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBfcmVzZXRMYXRlc3ROb09wV2FybkZvclRlc3RzKCk6IHZvaWQge1xuICBoYXNXYXJuZWRMYXRlc3ROb09wID0gZmFsc2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRPcHRpb25zQmFzZSB7XG4gIC8qKlxuICAgKiBUaGUgd29ybGQgdG8gdXNlIGZvciB0aGUgd29ya2Zsb3cgcnVuIGNyZWF0aW9uLFxuICAgKiBieSBkZWZhdWx0IHRoZSB3b3JsZCBpcyBpbmZlcnJlZCBmcm9tIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gICAqL1xuICB3b3JsZD86IFdvcmxkO1xuXG4gIC8qKlxuICAgKiBUaGUgc3BlYyB2ZXJzaW9uIHRvIHVzZSBmb3IgdGhlIHdvcmtmbG93IHJ1bi4gRGVmYXVsdHMgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uLlxuICAgKi9cbiAgc3BlY1ZlcnNpb24/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHJlZ2lvbiBpZGVudGlmaWVyIGZvciB0aGUgbmV3IHJ1bi4gQ3VycmVudGx5IGNvbnN1bWVkIG9ubHlcbiAgICogYnkgYEB3b3JrZmxvdy93b3JsZC12ZXJjZWxgLCB3aGljaCBlbWJlZHMgdGhlIHJlZ2lvbiBpbnRvIHRoZSB0YWdnZWRcbiAgICogcnVuIElEIGFuZCByb3V0ZXMgdGhlIGluaXRpYWwgd29ya2Zsb3cgbWVzc2FnZSB0byB0aGUgbWF0Y2hpbmdcbiAgICogcmVnaW9uYWwgcXVldWUuIFdoZW4gb21pdHRlZCwgdGhlIHdvcmxkIGZhbGxzIGJhY2sgdG8gaXRzIG93blxuICAgKiBkZWZhdWx0IChmb3IgYHdvcmxkLXZlcmNlbGA6IHRoZSBgVkVSQ0VMX1JFR0lPTmAgZW52aXJvbm1lbnRcbiAgICogdmFyaWFibGUsIHRoZW4gdGhlIHNlcnZlci1zaWRlIGRlZmF1bHQgcmVnaW9uIGBpYWQxYCDigJQgYSBjb25jcmV0ZSxcbiAgICogcm91dGFibGUgcmVnaW9uIGlzIGFsd2F5cyBjaG9zZW4pLlxuICAgKlxuICAgKiBXb3JsZHMgd2l0aG91dCBhIHJlZ2lvbmFsIGRpbWVuc2lvbiBpZ25vcmUgdGhpcyBmaWVsZC5cbiAgICovXG4gIHJlZ2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogUGxhaW50ZXh0IGF0dHJpYnV0ZXMgdG8gc2VlZCBvbiB0aGUgcnVuIGFzIGl0IGlzIGNyZWF0ZWQuXG4gICAqXG4gICAqIEF2YWlsYWJsZSBmb3IgbmF0aXZlLWF0dHJpYnV0ZXMgcnVucyAoc3BlYyB2ZXJzaW9uIDQgYW5kIGxhdGVyKS5cbiAgICovXG4gIGF0dHJpYnV0ZXM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBQZXJtaXQgcmVzZXJ2ZWQgYCRgLXByZWZpeGVkIGtleXMgaW4gYGF0dHJpYnV0ZXNgLiBUaGUgYCRgIG5hbWVzcGFjZVxuICAgKiBpcyByZXNlcnZlZCBmb3IgZnJhbWV3b3JrL2xpYnJhcnkgY29kZSBidWlsdCBvbiB0b3Agb2YgdGhlIHdvcmtmbG93XG4gICAqIFNESyAodGVsZW1ldHJ5LCBhZ2VudCBtZXRhZGF0YSwgcGxhdGZvcm0tZW1pdHRlZCB0YWdzLCBldGMuKTsgdXNlclxuICAgKiBjb2RlIE1VU1QgTk9UIHdyaXRlIGtleXMgaW4gaXQsIGFuZCB2YWxpZGF0aW9uIHJlamVjdHMgdGhlbSBzb1xuICAgKiBhY2NpZGVudGFsIGNvbGxpc2lvbnMgd2l0aCB0b29saW5nLW93bmVkIGtleXMgY2FuJ3Qgc2xpcCB0aHJvdWdoLlxuICAgKlxuICAgKiBPbmx5IGZsaXAgdGhpcyB0byBgdHJ1ZWAgaWYgeW91ciBjYWxsZXIgaXMgaXRzZWxmIGEgZnJhbWV3b3JrIG9yXG4gICAqIGxpYnJhcnkgdGhhdCBvd25zIGEgYCRgLXByZWZpeGVkIHN1Yi1uYW1lc3BhY2UgYW5kIGtub3dzIHRoZVxuICAgKiBjb252ZW50aW9ucyBvZiBhbnkgb3RoZXIgdG9vbHMgd3JpdGluZyBpbnRvIGl0LiBTYW1lIHNlbWFudGljcyBhc1xuICAgKiB0aGUgYHNldEF0dHJpYnV0ZXNgIG9wdGlvbiBvZiB0aGUgc2FtZSBuYW1lLlxuICAgKi9cbiAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgSUQgb2YgYW4gZXhpc3RpbmcgcnVuIHRoaXMgcnVuIGlzIGJlaW5nIHJlcGxheWVkIGZyb20sIGlmIGFueS5cbiAgICpcbiAgICogUmVjb3JkZWQgb24gdGhlIG5ldyBydW4ncyBgZXhlY3V0aW9uQ29udGV4dGAgYXMgYHJlcGxheWVkRnJvbVJ1bklkYCBzb1xuICAgKiB0b29saW5nIChlLmcuIHRoZSBkYXNoYm9hcmQgcnVucyBsaXN0KSBjYW4gc2hvdyB0aGF0IGEgcnVuIG9yaWdpbmF0ZWQgYXNcbiAgICogYSByZXBsYXkgYW5kIGxpbmsgYmFjayB0byBpdHMgc291cmNlLiBTZXQgYXV0b21hdGljYWxseSBieVxuICAgKiB7QGxpbmsgcmVjcmVhdGVSdW5Gcm9tRXhpc3Rpbmd9OyB0aGVyZSdzIHVzdWFsbHkgbm8gcmVhc29uIHRvIHBhc3MgaXRcbiAgICogZGlyZWN0bHkuXG4gICAqXG4gICAqIE11c3QgYmUgYSBydW4gSUQ6IGB3cnVuX2AgZm9sbG93ZWQgYnkgYSAyNi1jaGFyIFVMSUQuIEl0J3MgYSBmb3JlaWduIGtleVxuICAgKiB0byB0aGUgc291cmNlIHJ1biwgc28gYHN0YXJ0KClgIHZhbGlkYXRlcyB0aGUgZXhhY3Qgc2hhcGUgYW5kIHJlamVjdHNcbiAgICogYW55dGhpbmcgZWxzZSByYXRoZXIgdGhhbiBwZXJzaXN0IGEgbGluZWFnZSBsaW5rIHRoYXQgcG9pbnRzIGF0IGdhcmJhZ2UuXG4gICAqL1xuICByZXBsYXllZEZyb21SdW5JZD86IHN0cmluZztcbiAgLyoqXG4gICAqIFF1ZXVlIG5hbWVzcGFjZSBvZiB0aGUgdGFyZ2V0IGRlcGxveW1lbnQuIFNjb3BlcyB0aGUgd29ya2Zsb3cgcXVldWVcbiAgICogdG9waWMgdG8gYF9fe25hbWVzcGFjZX1fd2tmX3dvcmtmbG93XypgIChlLmcuIGAnZXZlJ2ApIGluc3RlYWQgb2YgdGhlXG4gICAqIGRlZmF1bHQgYF9fd2tmX3dvcmtmbG93XypgLCBhbmQgaXMgYWxzbyB1c2VkIGZvciB0aGUgY3Jvc3MtZGVwbG95bWVudFxuICAgKiBjYXBhYmlsaXR5IHByb2JlLiBGYWxscyBiYWNrIHRvIGBXT1JLRkxPV19RVUVVRV9OQU1FU1BBQ0VgIGluIHRoZVxuICAgKiBjYWxsaW5nIHByb2Nlc3MuXG4gICAqXG4gICAqIFdpdGhpbiBhIGRlcGxveW1lbnQgdGhlIGVudiBmYWxsYmFjayBpcyBjb3JyZWN0LiBDcm9zcy1jb250ZXh0IGNhbGxlcnNcbiAgICogKGUuZy4gdGhlIG9ic2VydmFiaWxpdHkgZGFzaGJvYXJkIHJlcGxheWluZyBhIHJ1bikgbXVzdCBwYXNzIHRoZVxuICAgKiBUQVJHRVQgZGVwbG95bWVudCdzIG5hbWVzcGFjZSBleHBsaWNpdGx5OiB0aGUgZW52IGZhbGxiYWNrIHJlc29sdmVzIGluXG4gICAqIHRoZSBjYWxsZXIncyBwcm9jZXNzLCBhbmQgYSBydW4gZW5xdWV1ZWQgdG8gYSB0b3BpYyB0aGUgdGFyZ2V0IGhhcyBub1xuICAgKiBjb25zdW1lciBmb3IgaXMgbmV2ZXIgcGlja2VkIHVwLlxuICAgKi9cbiAgbmFtZXNwYWNlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWQgZXh0ZW5kcyBTdGFydE9wdGlvbnNCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBkZXBsb3ltZW50IElEIHRvIHVzZSBmb3IgdGhlIHdvcmtmbG93IHJ1bi5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgdGhpcyBpcyBhdXRvbWF0aWNhbGx5IGluZmVycmVkIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAqIHdoZW4gZGVwbG95aW5nIHRvIFZlcmNlbC5cbiAgICpcbiAgICogU2V0IHRvIGAnbGF0ZXN0J2AgdG8gYXV0b21hdGljYWxseSByZXNvbHZlIHRoZSBtb3N0IHJlY2VudCBkZXBsb3ltZW50XG4gICAqIGZvciB0aGUgY3VycmVudCBlbnZpcm9ubWVudCAoc2FtZSBwcm9kdWN0aW9uIHRhcmdldCBvciBnaXQgYnJhbmNoKS5cbiAgICogVGhpcyBpcyBvbmx5IG1lYW5pbmdmdWwgaW4gd29ybGRzIHdpdGggYXRvbWljLCBpbW11dGFibGUgZGVwbG95bWVudHNcbiAgICogKGN1cnJlbnRseSBWZXJjZWwpLiBJbiBvdGhlciB3b3JsZHMgKGxvY2FsIGRldiwgUG9zdGdyZXMpIHRoZXJlIGlzIG5vXG4gICAqIG5vdGlvbiBvZiBtdWx0aXBsZSBkZXBsb3ltZW50cyB0byByZXNvbHZlIGJldHdlZW4sIHNvIGAnbGF0ZXN0J2AgaGFzIG5vXG4gICAqIGVmZmVjdCDigJQgYSB3YXJuaW5nIGlzIGxvZ2dlZCBhbmQgdGhlIHJ1biB0YXJnZXRzIHRoZSBjdXJyZW50IGRlcGxveW1lbnQuXG4gICAqXG4gICAqICoqTm90ZToqKiBXaGVuIGBkZXBsb3ltZW50SWRgIGlzIHByb3ZpZGVkLCB0aGUgYXJndW1lbnQgYW5kIHJldHVybiB0eXBlcyBiZWNvbWUgYHVua25vd25gXG4gICAqIHNpbmNlIHRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGUgdHlwZXMgd2lsbCBiZSBjb25zaXN0ZW50IGFjcm9zcyBkZXBsb3ltZW50cy5cbiAgICovXG4gIGRlcGxveW1lbnRJZDogJ2xhdGVzdCcgfCAoc3RyaW5nICYge30pO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YXJ0T3B0aW9uc1dpdGhvdXREZXBsb3ltZW50SWQgZXh0ZW5kcyBTdGFydE9wdGlvbnNCYXNlIHtcbiAgZGVwbG95bWVudElkPzogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHN0YXJ0aW5nIGEgd29ya2Zsb3cgcnVuLlxuICovXG5leHBvcnQgdHlwZSBTdGFydE9wdGlvbnMgPVxuICB8IFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWRcbiAgfCBTdGFydE9wdGlvbnNXaXRob3V0RGVwbG95bWVudElkO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gaW1wb3J0ZWQgd29ya2Zsb3cgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93RnVuY3Rpb248VEFyZ3MgZXh0ZW5kcyB1bmtub3duW10sIFRSZXN1bHQ+ID0gKFxuICAuLi5hcmdzOiBUQXJnc1xuKSA9PiBQcm9taXNlPFRSZXN1bHQ+O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGdlbmVyYXRlZCBtZXRhZGF0YSBvZiBhIHdvcmtmbG93IGZ1bmN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd01ldGFkYXRhID0geyB3b3JrZmxvd0lkOiBzdHJpbmcgfTtcblxuLyoqXG4gKiBTdGFydHMgYSB3b3JrZmxvdyBydW4uXG4gKlxuICogQHBhcmFtIHdvcmtmbG93IC0gVGhlIGltcG9ydGVkIHdvcmtmbG93IGZ1bmN0aW9uIHRvIHN0YXJ0LlxuICogQHBhcmFtIGFyZ3MgLSBUaGUgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHdvcmtmbG93IChvcHRpb25hbCkuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIGZvciB0aGUgd29ya2Zsb3cgcnVuIChvcHRpb25hbCkuXG4gKiBAcmV0dXJucyBUaGUgdW5pcXVlIHJ1biBJRCBmb3IgdGhlIG5ld2x5IHN0YXJ0ZWQgd29ya2Zsb3cgaW52b2NhdGlvbi5cbiAqL1xuLy8gT3ZlcmxvYWRzIHdpdGggZGVwbG95bWVudElkIC0gYXJncyBhbmQgcmV0dXJuIHR5cGUgYmVjb21lIHVua25vd25cbi8vIFVzZXMgZ2VuZXJpY3Mgc28gdHlwZWQgd29ya2Zsb3dzIGFyZSBhc3NpZ25hYmxlIChhdm9pZHMgY29udHJhdmFyaWFuY2UgaXNzdWVzKSxcbi8vIGJ1dCB0aGUgcmV0dXJuIHR5cGUgYW5kIGFyZ3MgYXJlIHN0aWxsIHVua25vd24gc2luY2UgdGhlIGRlcGxveWVkIHZlcnNpb24gbWF5IGRpZmZlci5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydDxUQXJncyBleHRlbmRzIHVua25vd25bXSwgVFJlc3VsdD4oXG4gIHdvcmtmbG93OiBXb3JrZmxvd0Z1bmN0aW9uPFRBcmdzLCBUUmVzdWx0PiB8IFdvcmtmbG93TWV0YWRhdGEsXG4gIGFyZ3M6IHVua25vd25bXSxcbiAgb3B0aW9uczogU3RhcnRPcHRpb25zV2l0aERlcGxveW1lbnRJZFxuKTogUHJvbWlzZTxSdW48dW5rbm93bj4+O1xuXG5leHBvcnQgZnVuY3Rpb24gc3RhcnQ8VFJlc3VsdD4oXG4gIHdvcmtmbG93OiBXb3JrZmxvd0Z1bmN0aW9uPFtdLCBUUmVzdWx0PiB8IFdvcmtmbG93TWV0YWRhdGEsXG4gIG9wdGlvbnM6IFN0YXJ0T3B0aW9uc1dpdGhEZXBsb3ltZW50SWRcbik6IFByb21pc2U8UnVuPHVua25vd24+PjtcblxuLy8gT3ZlcmxvYWRzIHdpdGhvdXQgZGVwbG95bWVudElkIC0gcHJlc2VydmUgdHlwZSBpbmZlcmVuY2VcbmV4cG9ydCBmdW5jdGlvbiBzdGFydDxUQXJncyBleHRlbmRzIHVua25vd25bXSwgVFJlc3VsdD4oXG4gIHdvcmtmbG93OiBXb3JrZmxvd0Z1bmN0aW9uPFRBcmdzLCBUUmVzdWx0PiB8IFdvcmtmbG93TWV0YWRhdGEsXG4gIGFyZ3M6IFRBcmdzLFxuICBvcHRpb25zPzogU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZFxuKTogUHJvbWlzZTxSdW48VFJlc3VsdD4+O1xuXG5leHBvcnQgZnVuY3Rpb24gc3RhcnQ8VFJlc3VsdD4oXG4gIHdvcmtmbG93OiBXb3JrZmxvd0Z1bmN0aW9uPFtdLCBUUmVzdWx0PiB8IFdvcmtmbG93TWV0YWRhdGEsXG4gIG9wdGlvbnM/OiBTdGFydE9wdGlvbnNXaXRob3V0RGVwbG95bWVudElkXG4pOiBQcm9taXNlPFJ1bjxUUmVzdWx0Pj47XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzdGFydDxUQXJncyBleHRlbmRzIHVua25vd25bXSwgVFJlc3VsdD4oXG4gIHdvcmtmbG93OiBXb3JrZmxvd0Z1bmN0aW9uPFRBcmdzLCBUUmVzdWx0PiB8IFdvcmtmbG93TWV0YWRhdGEsXG4gIGFyZ3NPck9wdGlvbnM/OiBUQXJncyB8IFN0YXJ0T3B0aW9ucyxcbiAgb3B0aW9ucz86IFN0YXJ0T3B0aW9uc1xuKSB7XG4gICd1c2Ugc3RlcCc7XG4gIHJldHVybiBhd2FpdCB3YWl0ZWRVbnRpbCgoKSA9PiB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0aGlzIGZpZWxkIGlzIGFkZGVkIGJ5IG91ciBjbGllbnQgdHJhbnNmb3JtXG4gICAgY29uc3Qgd29ya2Zsb3dOYW1lID0gd29ya2Zsb3c/LndvcmtmbG93SWQ7XG5cbiAgICBpZiAoIXdvcmtmbG93TmFtZSkge1xuICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICBgJ3N0YXJ0JyByZWNlaXZlZCBhbiBpbnZhbGlkIHdvcmtmbG93IGZ1bmN0aW9uLiBFbnN1cmUgdGhlIFdvcmtmbG93IFNESyBpcyBjb25maWd1cmVkIGNvcnJlY3RseSBhbmQgdGhlIGZ1bmN0aW9uIGluY2x1ZGVzIGEgJ3VzZSB3b3JrZmxvdycgZGlyZWN0aXZlLmAsXG4gICAgICAgIHsgc2x1ZzogJ3N0YXJ0LWludmFsaWQtd29ya2Zsb3ctZnVuY3Rpb24nIH1cbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3Bhbk5hbWUgPSBgd29ya2Zsb3cuc3RhcnQgJHt3b3JrZmxvd0Rpc3BsYXlOYW1lKHdvcmtmbG93TmFtZSl9YDtcbiAgICByZXR1cm4gdHJhY2Uoc3Bhbk5hbWUsIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93TmFtZSh3b3JrZmxvd05hbWUpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dPcGVyYXRpb24oJ3N0YXJ0JyksXG4gICAgICB9KTtcblxuICAgICAgbGV0IGFyZ3M6IFNlcmlhbGl6YWJsZVtdID0gW107XG4gICAgICBsZXQgb3B0czogU3RhcnRPcHRpb25zID0gb3B0aW9ucyA/PyB7fTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGFyZ3NPck9wdGlvbnMpKSB7XG4gICAgICAgIGFyZ3MgPSBhcmdzT3JPcHRpb25zIGFzIFNlcmlhbGl6YWJsZVtdO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgYXJnc09yT3B0aW9ucyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgb3B0cyA9IGFyZ3NPck9wdGlvbnM7XG4gICAgICB9XG5cbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dBcmd1bWVudHNDb3VudChhcmdzLmxlbmd0aCksXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgd29ybGQgPSBvcHRzLndvcmxkID8/IChhd2FpdCBnZXRXb3JsZExhenkoKSk7XG4gICAgICBhc3NlcnRXb3JsZFN1cHBvcnRzUnVudGltZVByb3RvY29sKHdvcmxkKTtcbiAgICAgIGNvbnN0IGN1cnJlbnREZXBsb3ltZW50SWQgPSBhd2FpdCB3b3JsZC5nZXREZXBsb3ltZW50SWQoKTtcbiAgICAgIGxldCBkZXBsb3ltZW50SWQgPSBvcHRzLmRlcGxveW1lbnRJZCA/PyBjdXJyZW50RGVwbG95bWVudElkO1xuXG4gICAgICAvLyBXaGVuICdsYXRlc3QnIGlzIHJlcXVlc3RlZCwgcmVzb2x2ZSB0aGUgYWN0dWFsIGxhdGVzdCBkZXBsb3ltZW50IElEXG4gICAgICAvLyBmb3IgdGhlIGN1cnJlbnQgZGVwbG95bWVudCdzIGVudmlyb25tZW50IChzYW1lIHByb2R1Y3Rpb24gdGFyZ2V0IG9yXG4gICAgICAvLyBzYW1lIGdpdCBicmFuY2ggZm9yIHByZXZpZXcgZGVwbG95bWVudHMpLlxuICAgICAgLy9cbiAgICAgIC8vIFJlc29sdmluZyAnbGF0ZXN0JyBvbmx5IG1lYW5zIHNvbWV0aGluZyBpbiB3b3JsZHMgd2l0aCBhdG9taWMsXG4gICAgICAvLyBpbW11dGFibGUgZGVwbG95bWVudHMgKGUuZy4gVmVyY2VsKSwgd2hpY2ggaW1wbGVtZW50XG4gICAgICAvLyByZXNvbHZlTGF0ZXN0RGVwbG95bWVudElkKCkuIFdvcmxkcyB3aXRob3V0IHRoYXQgY29uY2VwdCAobG9jYWwgZGV2LFxuICAgICAgLy8gc2VsZi1ob3N0ZWQgUG9zdGdyZXMpIGhhdmUgbm90aGluZyB0byByZXNvbHZlIGJldHdlZW4sIHNvIHJhdGhlciB0aGFuXG4gICAgICAvLyBmYWlsIGEgcnVuIHRoYXQgd29ya3MgZmluZSBvbiBWZXJjZWwsIHdlIHdhcm4gYW5kIGZhbGwgYmFjayB0byB0aGVcbiAgICAgIC8vIGN1cnJlbnQgZGVwbG95bWVudCDigJQgbWFraW5nICdsYXRlc3QnIGFuIGVmZmVjdGl2ZSBuby1vcCB0aGVyZS5cbiAgICAgIGlmIChkZXBsb3ltZW50SWQgPT09ICdsYXRlc3QnKSB7XG4gICAgICAgIGlmICh3b3JsZC5yZXNvbHZlTGF0ZXN0RGVwbG95bWVudElkKSB7XG4gICAgICAgICAgZGVwbG95bWVudElkID0gYXdhaXQgd29ybGQucmVzb2x2ZUxhdGVzdERlcGxveW1lbnRJZCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFdhcm4gb25jZSBwZXIgcHJvY2VzcyDigJQgc2VlIGhhc1dhcm5lZExhdGVzdE5vT3AgYWJvdmUuXG4gICAgICAgICAgaWYgKCFoYXNXYXJuZWRMYXRlc3ROb09wKSB7XG4gICAgICAgICAgICBoYXNXYXJuZWRMYXRlc3ROb09wID0gdHJ1ZTtcbiAgICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICAgXCJkZXBsb3ltZW50SWQ6ICdsYXRlc3QnIGhhcyBubyBlZmZlY3QgaW4gdGhpcyB3b3JsZCBhbmQgd2FzIGlnbm9yZWQuIFwiICtcbiAgICAgICAgICAgICAgICAnSXQgaXMgb25seSBzdXBwb3J0ZWQgYnkgd29ybGRzIHdpdGggYXRvbWljIGRlcGxveW1lbnRzLCBzdWNoIGFzIFZlcmNlbC4gJyArXG4gICAgICAgICAgICAgICAgJ1RoZSBydW4gd2lsbCB0YXJnZXQgdGhlIGN1cnJlbnQgZGVwbG95bWVudC4nLFxuICAgICAgICAgICAgICB7IGN1cnJlbnREZXBsb3ltZW50SWQgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVwbG95bWVudElkID0gY3VycmVudERlcGxveW1lbnRJZDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEZWNpZGUgd2hldGhlciB0byB3cml0ZSBieXRlIHN0cmVhbXMgaW4gdGhlIGZyYW1lZCB3aXJlIGZvcm1hdC5cbiAgICAgIC8vIEZvciBzYW1lLWRlcGxveW1lbnQgc3RhcnRzICh0aGUgY29tbW9uIGNhc2UpIHdlIGtub3cgdGhlIHRhcmdldCBpc1xuICAgICAgLy8gcnVubmluZyB0aGlzIHNhbWUgU0RLIHZlcnNpb24sIHNvIGZyYW1pbmcgaXMgc2FmZS4gRm9yIGNyb3NzLVxuICAgICAgLy8gZGVwbG95bWVudCBzdGFydHMgKGV4cGxpY2l0IGRlcGxveW1lbnRJZCBvciAnbGF0ZXN0JyB0aGF0IHJlc29sdmVzXG4gICAgICAvLyB0byBhIGRpZmZlcmVudCBkZXBsb3ltZW50KSB3ZSBwcm9iZSB0aGUgdGFyZ2V0IHZpYSBoZWFsdGhDaGVjayB0b1xuICAgICAgLy8gbGVhcm4gaXRzIHdvcmtmbG93LWNvcmUgdmVyc2lvbiwgdGhlbiBkZXJpdmUgdGhlIGNhcGFiaWxpdHkuIFRoZVxuICAgICAgLy8gcHJvYmUgaGFzIGEgdGlnaHQgdGltZW91dCDigJQgb24gbWlzcy9mYWlsdXJlIHdlIGZhbGwgYmFjayB0byB0aGVcbiAgICAgIC8vIGxlZ2FjeSByYXcgYnl0ZSBmb3JtYXQsIHdoaWNoIGlzIHVuaXZlcnNhbGx5IHJlYWRhYmxlLlxuICAgICAgLy9cbiAgICAgIC8vIFdvcmxkcyB0aGF0IGRvbid0IGV4cG9zZSB0aGUgYHN0cmVhbXNgIEFQSSAoZS5nLiBtaW5pbWFsIHRlc3RcbiAgICAgIC8vIG1vY2tzKSBjYW4ndCBzZXJ2aWNlIGhlYWx0aCBjaGVja3MsIHNvIHdlIHNraXAgdGhlIHByb2JlIGZvciB0aGVtLlxuICAgICAgbGV0IGZyYW1lZEJ5dGVTdHJlYW1zOiBib29sZWFuO1xuICAgICAgbGV0IHRhcmdldFN1cHBvcnRzQ29tcHJlc3Npb246IGJvb2xlYW47XG4gICAgICBpZiAoZGVwbG95bWVudElkID09PSBjdXJyZW50RGVwbG95bWVudElkKSB7XG4gICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zID0gdHJ1ZTtcbiAgICAgICAgdGFyZ2V0U3VwcG9ydHNDb21wcmVzc2lvbiA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB3b3JsZC5zdHJlYW1zPy5nZXQgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMgPSBmYWxzZTtcbiAgICAgICAgdGFyZ2V0U3VwcG9ydHNDb21wcmVzc2lvbiA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcHJvYmUgPSBhd2FpdCBoZWFsdGhDaGVjayh3b3JsZCwgJ3dvcmtmbG93Jywge1xuICAgICAgICAgIGRlcGxveW1lbnRJZCxcbiAgICAgICAgICB0aW1lb3V0OiBDUk9TU19ERVBMT1lNRU5UX0NBUEFCSUxJVFlfUFJPQkVfVElNRU9VVF9NUyxcbiAgICAgICAgICBuYW1lc3BhY2U6IG9wdHMubmFtZXNwYWNlLFxuICAgICAgICB9KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgICBjb25zdCBjYXBhYmlsaXRpZXMgPSBnZXRSdW5DYXBhYmlsaXRpZXMocHJvYmU/LndvcmtmbG93Q29yZVZlcnNpb24pO1xuICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyA9IGNhcGFiaWxpdGllcy5mcmFtZWRCeXRlU3RyZWFtcztcbiAgICAgICAgdGFyZ2V0U3VwcG9ydHNDb21wcmVzc2lvbiA9IGNhcGFiaWxpdGllcy5zdXBwb3J0ZWRGb3JtYXRzLmhhcyhcbiAgICAgICAgICBTZXJpYWxpemF0aW9uRm9ybWF0LkdaSVBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb3BzOiBQcm9taXNlPHZvaWQ+W10gPSBbXTtcblxuICAgICAgLy8gR2VuZXJhdGUgcnVuSWQgY2xpZW50LXNpZGUgc28gd2UgaGF2ZSBpdCBiZWZvcmUgc2VyaWFsaXphdGlvblxuICAgICAgLy8gKHJlcXVpcmVkIGZvciBmdXR1cmUgRTJFIGVuY3J5cHRpb24gd2hlcmUgcnVuSWQgaXMgcGFydCBvZiB0aGVcbiAgICAgIC8vIGVuY3J5cHRpb24gY29udGV4dCkuIFdoZW4gdGhlIFdvcmxkIHByb3ZpZGVzIGEgYGNyZWF0ZVJ1bklkKClgXG4gICAgICAvLyBpbXBsZW1lbnRhdGlvbiwgdXNlIGl0IHNvIHdvcmxkcyBjYW4gZW1iZWQgaW1wbGVtZW50YXRpb24tc3BlY2lmaWNcbiAgICAgIC8vIG1ldGFkYXRhIChlLmcuLCByZWdpb24pIGludG8gdGhlIElELCBmb3J3YXJkaW5nIHRoZSBmdWxsIG9wdGlvbnNcbiAgICAgIC8vIGJhZyBzbyB3b3JsZHMgY2FuIHJlYWQgd2hpY2hldmVyIGZpZWxkcyB0aGV5IHJlY29nbmlzZTsgb3RoZXJ3aXNlXG4gICAgICAvLyBmYWxsIGJhY2sgdG8gYSBzdGFuZGFyZCBtb25vdG9uaWMgVUxJRC5cbiAgICAgIGNvbnN0IHJ1bklkID0gYHdydW5fJHtcbiAgICAgICAgd29ybGQuY3JlYXRlUnVuSWRcbiAgICAgICAgICA/IHdvcmxkLmNyZWF0ZVJ1bklkKG9wdHMgYXMgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KVxuICAgICAgICAgIDogdWxpZCgpXG4gICAgICB9YDtcblxuICAgICAgLy8gU2VyaWFsaXplIGN1cnJlbnQgdHJhY2UgY29udGV4dCB0byBwcm9wYWdhdGUgYWNyb3NzIHF1ZXVlIGJvdW5kYXJ5XG4gICAgICBjb25zdCB0cmFjZUNhcnJpZXIgPSBhd2FpdCBzZXJpYWxpemVUcmFjZUNhcnJpZXIoKTtcblxuICAgICAgLy8gRGVmYXVsdCBuZXcgcnVucyB0byB0aGUgY29uZmlndXJlZCB3b3JsZCdzIHNwZWMgdmVyc2lvbi4gVGhlIHdvcmxkXG4gICAgICAvLyBpdHNlbGYgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkIGFnYWluc3QgdGhpcyBydW50aW1lJ3Mgc3BlYyB2ZXJzaW9uLlxuICAgICAgY29uc3Qgc3BlY1ZlcnNpb24gPSBvcHRzLnNwZWNWZXJzaW9uID8/IHdvcmxkLnNwZWNWZXJzaW9uO1xuICAgICAgY29uc3QgdjFDb21wYXQgPSBpc0xlZ2FjeVNwZWNWZXJzaW9uKHNwZWNWZXJzaW9uKTtcbiAgICAgIGNvbnN0IGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzID0gb3B0cy5hbGxvd1Jlc2VydmVkQXR0cmlidXRlcyA9PT0gdHJ1ZTtcbiAgICAgIGxldCBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKG9wdHMuYXR0cmlidXRlcyAmJiBPYmplY3Qua2V5cyhvcHRzLmF0dHJpYnV0ZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaWYgKHNwZWNWZXJzaW9uIDwgU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0FUVFJJQlVURVMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAnSW5pdGlhbCB3b3JrZmxvdyBhdHRyaWJ1dGVzIHJlcXVpcmUgYSBXb3JsZCB0aGF0IHN1cHBvcnRzIHNwZWMgdmVyc2lvbiA0IG9yIGxhdGVyLidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIGBub3JtYWxpemVBdHRyaWJ1dGVDaGFuZ2VzYCB0cmVhdHMgYHVuZGVmaW5lZGAgYXMgXCJyZW1vdmUgdGhpc1xuICAgICAgICAvLyBrZXlcIiwgd2hpY2ggaXMgbWVhbmluZ2xlc3MgYXQgY3JlYXRpb24gdGltZSDigJQgcmVqZWN0IGl0IHVwIGZyb250XG4gICAgICAgIC8vIHNvIEpTIGNhbGxlcnMgZ2V0IGEgY2xlYXIgZXJyb3IgaW5zdGVhZCBvZiBhIGRvd25zdHJlYW0gc2NoZW1hXG4gICAgICAgIC8vIGZhaWx1cmUgKHRoZSB0eXBlcyBhbHJlYWR5IGZvcmJpZCBub24tc3RyaW5nIHZhbHVlcykuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9wdHMuYXR0cmlidXRlcykpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgICBgSW5pdGlhbCB3b3JrZmxvdyBhdHRyaWJ1dGUgJHtKU09OLnN0cmluZ2lmeShrZXkpfSBtdXN0IGJlIGEgc3RyaW5nIHZhbHVlLmBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNoYW5nZXMgPSBub3JtYWxpemVBdHRyaWJ1dGVDaGFuZ2VzKG9wdHMuYXR0cmlidXRlcywge1xuICAgICAgICAgIGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzLFxuICAgICAgICB9KTtcbiAgICAgICAgYXR0cmlidXRlcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICBjaGFuZ2VzLm1hcCgoeyBrZXksIHZhbHVlIH0pID0+IFtrZXksIHZhbHVlIGFzIHN0cmluZ10pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICAvLyBTZWVkIHBheWxvYWQgc2hhcmVkIGJ5IHJ1bl9jcmVhdGVkIGFuZCB0aGUgcmVzaWxpZW50LXN0YXJ0IHF1ZXVlXG4gICAgICAvLyBpbnB1dC4gVGhlIGZsYWcgcmlkZXMgYWxvbmcgc28gc2VydmVyLXNpZGUgdmFsaWRhdGlvbiBtYXRjaGVzIHRoZVxuICAgICAgLy8gY2xpZW50LXNpZGUgY2hlY2sgYWJvdmUgb24gYm90aCBwYXRocy5cbiAgICAgIGNvbnN0IGF0dHJpYnV0ZVNlZWQgPSBhdHRyaWJ1dGVzXG4gICAgICAgID8ge1xuICAgICAgICAgICAgYXR0cmlidXRlcyxcbiAgICAgICAgICAgIC4uLihhbGxvd1Jlc2VydmVkQXR0cmlidXRlc1xuICAgICAgICAgICAgICA/IHsgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXM6IHRydWUgYXMgY29uc3QgfVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge307XG5cbiAgICAgIC8vIGByZXBsYXllZEZyb21SdW5JZGAgaXMgYSBmb3JlaWduIGtleSB0byB0aGUgc291cmNlIHJ1bjsgcmVqZWN0IGFueXRoaW5nXG4gICAgICAvLyB0aGF0IGlzbid0IGEgcmVhbCBydW4gSUQgc28gdGhlIGxpbmVhZ2UgbGluayBjYW4ndCBwb2ludCBhdCBnYXJiYWdlLlxuICAgICAgaWYgKFxuICAgICAgICBvcHRzLnJlcGxheWVkRnJvbVJ1bklkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgIXdvcmtmbG93UnVuSWRTY2hlbWEuc2FmZVBhcnNlKG9wdHMucmVwbGF5ZWRGcm9tUnVuSWQpLnN1Y2Nlc3NcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgYHJlcGxheWVkRnJvbVJ1bklkIG11c3QgYmUgYSBydW4gSUQgKHdydW5fPHVsaWQ+KTsgcmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIFN0cmluZyhvcHRzLnJlcGxheWVkRnJvbVJ1bklkKS5zbGljZSgwLCA2NClcbiAgICAgICAgICApfS5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlc29sdmUgZW5jcnlwdGlvbiBrZXkgZm9yIHRoZSBuZXcgcnVuLiBUaGUgcnVuSWQgaGFzIGFscmVhZHkgYmVlblxuICAgICAgLy8gZ2VuZXJhdGVkIGFib3ZlIChjbGllbnQtZ2VuZXJhdGVkIFVMSUQpIGFuZCB3aWxsIGJlIHVzZWQgZm9yIGJvdGhcbiAgICAgIC8vIGtleSBkZXJpdmF0aW9uIGFuZCB0aGUgcnVuX2NyZWF0ZWQgZXZlbnQuIFRoZSBXb3JsZCBpbXBsZW1lbnRhdGlvblxuICAgICAgLy8gdXNlcyB0aGUgcnVuSWQgZm9yIHBlci1ydW4gSEtERiBrZXkgZGVyaXZhdGlvbi4gV2UgcGFzcyB0aGUgcmVzb2x2ZWRcbiAgICAgIC8vIGRlcGxveW1lbnRJZCAobm90IGp1c3QgdGhlIHJhdyBvcHRzKSBzbyB0aGUgV29ybGQgY2FuIHVzZSBpdCBmb3JcbiAgICAgIC8vIGtleSByZXNvbHV0aW9uIGV2ZW4gd2hlbiBkZXBsb3ltZW50SWQgd2FzIGluZmVycmVkIGZyb20gdGhlIGVudmlyb25tZW50XG4gICAgICAvLyByYXRoZXIgdGhhbiBleHBsaWNpdGx5IHByb3ZpZGVkIGluIG9wdHMgKGUuZy4sIGluIGUyZSB0ZXN0IHJ1bm5lcnMpLlxuICAgICAgY29uc3QgcmF3S2V5ID0gYXdhaXQgd29ybGQuZ2V0RW5jcnlwdGlvbktleUZvclJ1bj8uKHJ1bklkLCB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIGRlcGxveW1lbnRJZCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZW5jcnlwdGlvbktleSA9IHJhd0tleSA/IGF3YWl0IGltcG9ydEtleShyYXdLZXkpIDogdW5kZWZpbmVkO1xuXG4gICAgICAvLyBDcmVhdGUgcnVuIHZpYSBydW5fY3JlYXRlZCBldmVudCAoZXZlbnQtc291cmNlZCBhcmNoaXRlY3R1cmUpXG4gICAgICAvLyBQYXNzIGNsaWVudC1nZW5lcmF0ZWQgcnVuSWQgLSBzZXJ2ZXIgd2lsbCBhY2NlcHQgYW5kIHVzZSBpdFxuICAgICAgLy8gQ29tcHJlc3Mgd29ya2Zsb3cgYXJndW1lbnRzIG9ubHkgd2hlbiB0aGUgcnVuIGl0c2VsZiBpcyBtYXJrZWQgYXNcbiAgICAgIC8vIHBvc3NpYmx5IGNvbnRhaW5pbmcgY29tcHJlc3NlZCBwYXlsb2FkcyAoc3BlY1ZlcnNpb24gPj0gNSkgQU5EIHRoZVxuICAgICAgLy8gdGFyZ2V0IGRlcGxveW1lbnQgY2FuIGRlY29kZSB0aGVtIChzYW1lLWRlcGxveW1lbnQsIG9yIHByb2JlZFxuICAgICAgLy8gY2FwYWJpbGl0eSBmb3IgY3Jvc3MtZGVwbG95bWVudCBzdGFydHMpLlxuICAgICAgY29uc3QgY29tcHJlc3Npb24gPVxuICAgICAgICB0YXJnZXRTdXBwb3J0c0NvbXByZXNzaW9uICYmXG4gICAgICAgIHNwZWNWZXJzaW9uID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTjtcbiAgICAgIGNvbnN0IHdvcmtmbG93QXJndW1lbnRzID0gYXdhaXQgZGVoeWRyYXRlV29ya2Zsb3dBcmd1bWVudHMoXG4gICAgICAgIGFyZ3MsXG4gICAgICAgIHJ1bklkLFxuICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICBvcHMsXG4gICAgICAgIGdsb2JhbFRoaXMsXG4gICAgICAgIHYxQ29tcGF0LFxuICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyxcbiAgICAgICAgY29tcHJlc3Npb25cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGV4ZWN1dGlvbkNvbnRleHQgPSB7XG4gICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgd29ya2Zsb3dDb3JlVmVyc2lvbixcbiAgICAgICAgZmVhdHVyZXM6IHsgZW5jcnlwdGlvbjogISFlbmNyeXB0aW9uS2V5IH0sXG4gICAgICAgIC4uLihvcHRzLnJlcGxheWVkRnJvbVJ1bklkXG4gICAgICAgICAgPyB7IHJlcGxheWVkRnJvbVJ1bklkOiBvcHRzLnJlcGxheWVkRnJvbVJ1bklkIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH07XG5cbiAgICAgIC8vIENhbGwgZXZlbnRzLmNyZWF0ZSAocnVuX2NyZWF0ZWQpIGFuZCBxdWV1ZSBpbiBwYXJhbGxlbC5cbiAgICAgIC8vIElmIGV2ZW50cy5jcmVhdGUgZmFpbHMgd2l0aCA0MjkvNXh4LCB0aGUgcnVuIHdhcyBzdGlsbCBhY2NlcHRlZFxuICAgICAgLy8gdmlhIHRoZSBxdWV1ZSBhbmQgY3JlYXRpb24gd2lsbCBiZSByZS10cmllZCBhc3luYyBieSB0aGUgcnVudGltZS5cbiAgICAgIGNvbnN0IFtydW5DcmVhdGVkUmVzdWx0LCBxdWV1ZVJlc3VsdF0gPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoW1xuICAgICAgICB3b3JsZC5ldmVudHMuY3JlYXRlKFxuICAgICAgICAgIHJ1bklkLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGV2ZW50VHlwZTogJ3J1bl9jcmVhdGVkJyxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgZXZlbnREYXRhOiB7XG4gICAgICAgICAgICAgIGRlcGxveW1lbnRJZDogZGVwbG95bWVudElkLFxuICAgICAgICAgICAgICB3b3JrZmxvd05hbWU6IHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgaW5wdXQ6IHdvcmtmbG93QXJndW1lbnRzLFxuICAgICAgICAgICAgICBleGVjdXRpb25Db250ZXh0LFxuICAgICAgICAgICAgICAuLi5hdHRyaWJ1dGVTZWVkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsgdjFDb21wYXQgfVxuICAgICAgICApLFxuICAgICAgICB3b3JsZC5xdWV1ZShcbiAgICAgICAgICBnZXRXb3JrZmxvd1F1ZXVlTmFtZSh3b3JrZmxvd05hbWUsIG9wdHMubmFtZXNwYWNlKSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBydW5JZCxcbiAgICAgICAgICAgIHRyYWNlQ2FycmllcixcbiAgICAgICAgICAgIC4uLihzcGVjVmVyc2lvbiA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ0JPUl9RVUVVRV9UUkFOU1BPUlRcbiAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICBydW5JbnB1dDoge1xuICAgICAgICAgICAgICAgICAgICBpbnB1dDogd29ya2Zsb3dBcmd1bWVudHMsXG4gICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICAgICAgICAgICAgICBzcGVjVmVyc2lvbixcbiAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgLi4uYXR0cmlidXRlU2VlZCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICB9IHNhdGlzZmllcyBXb3JrZmxvd0ludm9rZVBheWxvYWQsXG4gICAgICAgICAge1xuICAgICAgICAgICAgZGVwbG95bWVudElkLFxuICAgICAgICAgICAgc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAvLyBGb3J3YXJkIGFueSBjYWxsZXItc3VwcGxpZWQgcmVnaW9uIGhpbnQgc28gd29ybGRzIHdpdGhcbiAgICAgICAgICAgIC8vIHBlci1yZWdpb24gcXVldWUgcm91dGluZyAoZS5nLiB3b3JsZC12ZXJjZWwpIGNhbiB0YXJnZXQgdGhlXG4gICAgICAgICAgICAvLyBtYXRjaGluZyBxdWV1ZS4gV29ybGRzIHdpdGhvdXQgYSByZWdpb25hbCBkaW1lbnNpb24gaWdub3JlXG4gICAgICAgICAgICAvLyB0aGlzIGZpZWxkLlxuICAgICAgICAgICAgLi4uKG9wdHMucmVnaW9uICE9PSB1bmRlZmluZWQgPyB7IHJlZ2lvbjogb3B0cy5yZWdpb24gfSA6IHt9KSxcbiAgICAgICAgICB9XG4gICAgICAgICksXG4gICAgICBdKTtcblxuICAgICAgLy8gUXVldWUgZmFpbHVyZSBpcyBhbHdheXMgZmF0YWwg4oCUIHRoZSBydW4gd2FzIG5vdCBlbnF1ZXVlZFxuICAgICAgaWYgKHF1ZXVlUmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgICB0aHJvdyBxdWV1ZVJlc3VsdC5yZWFzb247XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZSBldmVudHMuY3JlYXRlIHJlc3VsdFxuICAgICAgbGV0IHJlc2lsaWVudFN0YXJ0ID0gZmFsc2U7XG4gICAgICBpZiAocnVuQ3JlYXRlZFJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgY29uc3QgZXJyID0gcnVuQ3JlYXRlZFJlc3VsdC5yZWFzb247XG4gICAgICAgIGlmIChFbnRpdHlDb25mbGljdEVycm9yLmlzKGVycikpIHtcbiAgICAgICAgICAvLyA0MDk6IFRoZSBydW4gYWxyZWFkeSBleGlzdHMuIFRoaXMgY2FuIGhhcHBlbiBpbiBleHRyZW1lIGNhc2VzIHdoZXJlXG4gICAgICAgICAgLy8gdGhlIHJ1biBjcmVhdGlvbiBjYWxsIGdldHMgYSBjb2xkIHN0YXJ0IG9yIG90aGVyIHNsb3dkb3duLCBhbmQgdGhlIHF1ZXVlXG4gICAgICAgICAgLy8gKyBydW5fc3RhcnRlZCBjYWxsIGNvbXBsZXRlcyBmYXN0ZXIuIFdlIGV4cGVjdCB0aGlzIHRvIGJlIDw9MSUgb2YgY2FzZXMuXG4gICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSBjYW4gc2FmZWx5IHJldHVybi5cbiAgICAgICAgfSBlbHNlIGlmIChpc1JldHJ5YWJsZVdvcmxkRXJyb3IoZXJyKSkge1xuICAgICAgICAgIC8vIDQyOSAoVGhyb3R0bGVFcnJvciksIDV4eCwgYW5kIHRyYW5zaWVudCB0cmFuc3BvcnQgZmFpbHVyZXNcbiAgICAgICAgICAvLyAoVFJBTlNQT1JUL1RJTUVPVVQpIGFyZSByZXRyeWFibGUg4oCUIHRoZSBydW4gd2FzIGFjY2VwdGVkIHZpYSB0aGVcbiAgICAgICAgICAvLyBxdWV1ZSBhbmQgY3JlYXRpb24gd2lsbCBiZSByZS10cmllZCBieSB0aGUgcnVudGltZSB3aGVuIGl0IGNhbGxzXG4gICAgICAgICAgLy8gcnVuX3N0YXJ0ZWQuXG4gICAgICAgICAgcmVzaWxpZW50U3RhcnQgPSB0cnVlO1xuICAgICAgICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgICAgICAgICdSdW4gY3JlYXRpb24gZXZlbnQgZmFpbGVkLCBidXQgdGhlIHJ1biB3YXMgYWNjZXB0ZWQgdmlhIHRoZSBxdWV1ZS4gJyArXG4gICAgICAgICAgICAgICdUaGUgcnVuX2NyZWF0ZWQgZXZlbnQgd2lsbCBiZSByZS10cmllZCBhc3luYyBieSB0aGUgcnVudGltZS4nLFxuICAgICAgICAgICAgeyB3b3JrZmxvd1J1bklkOiBydW5JZCwgZXJyb3I6IGVyci5tZXNzYWdlIH1cbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcnVuQ3JlYXRlZFJlc3VsdC52YWx1ZTtcbiAgICAgICAgLy8gQXNzZXJ0IHRoYXQgdGhlIHJ1biB3YXMgY3JlYXRlZFxuICAgICAgICBpZiAoIXJlc3VsdC5ydW4pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICBcIk1pc3NpbmcgJ3J1bicgaW4gc2VydmVyIHJlc3BvbnNlIGZvciAncnVuX2NyZWF0ZWQnIGV2ZW50XCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmVyaWZ5IHNlcnZlciBhY2NlcHRlZCBvdXIgcnVuSWRcbiAgICAgICAgaWYgKCF2MUNvbXBhdCAmJiByZXN1bHQucnVuLnJ1bklkICE9PSBydW5JZCkge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgIGBTZXJ2ZXIgcmV0dXJuZWQgZGlmZmVyZW50IHJ1bklkIHRoYW4gcmVxdWVzdGVkOiBleHBlY3RlZCAke3J1bklkfSwgZ290ICR7cmVzdWx0LnJ1bi5ydW5JZH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGVzZSBhcmd1bWVudC1zdHJlYW0gb3BzIGFyZSBmbHVzaGVkIGluIHRoZSBiYWNrZ3JvdW5kOyB0aGUgcHJvbWlzZVxuICAgICAgLy8gaGFuZGVkIHRvIHdhaXRVbnRpbCBtdXN0IG5ldmVyIHJlamVjdCAoYW4gdW5jb25zdW1lZCB3YWl0VW50aWxcbiAgICAgIC8vIHJlamVjdGlvbiBjcmFzaGVzIHRoZSBwcm9jZXNzIGFzIHVuaGFuZGxlZFJlamVjdGlvbiksIHNvIHVuZXhwZWN0ZWRcbiAgICAgIC8vIGZhaWx1cmVzIGFyZSBsb2dnZWQgaW5zdGVhZC5cbiAgICAgIHNhZmVXYWl0VW50aWwoUHJvbWlzZS5hbGwob3BzKSwgKGVycikgPT4ge1xuICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgJ0JhY2tncm91bmQgZmx1c2ggb2Ygd29ya2Zsb3cgYXJndW1lbnQgc3RyZWFtcyBmYWlsZWQnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHdvcmtmbG93UnVuSWQ6IHJ1bklkLFxuICAgICAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1bklkKHJ1bklkKSxcbiAgICAgICAgLi4uQXR0cmlidXRlLkRlcGxveW1lbnRJZChkZXBsb3ltZW50SWQpLFxuICAgICAgICAuLi4ocnVuQ3JlYXRlZFJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnICYmXG4gICAgICAgIHJ1bkNyZWF0ZWRSZXN1bHQudmFsdWUucnVuXG4gICAgICAgICAgPyBBdHRyaWJ1dGUuV29ya2Zsb3dSdW5TdGF0dXMocnVuQ3JlYXRlZFJlc3VsdC52YWx1ZS5ydW4uc3RhdHVzKVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBuZXcgUnVuPFRSZXN1bHQ+KHJ1bklkLCB7IHJlc2lsaWVudFN0YXJ0IH0pO1xuICAgIH0pO1xuICB9KTtcbn1cbiJdfQ==
343
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9zdGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVqRSxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLHVCQUF1QixFQUN2QixxQkFBcUIsRUFDckIsZ0NBQWdDLEVBQ2hDLDBDQUEwQyxFQUMxQyxpQ0FBaUMsRUFDakMsbUJBQW1CLEdBQ3BCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRTdDLE9BQU8sRUFDTCwwQkFBMEIsRUFDMUIsbUJBQW1CLEdBQ3BCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzVELE9BQU8sS0FBSyxTQUFTLE1BQU0sc0NBQXNDLENBQUM7QUFDbEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLEtBQUssRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxPQUFPLElBQUksbUJBQW1CLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8s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Q0YsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxFQUFFLGFBQWEsQ0FBQztnQkFDbEIsR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQztnQkFDakMsR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQztnQkFDdkMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sS0FBSyxXQUFXO29CQUMzQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsR0FBRztvQkFDeEIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQztvQkFDaEUsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUNSLENBQUMsQ0FBQztZQUVILE9BQU8sSUFBSSxHQUFHLENBQVUsS0FBSyxFQUFFLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUNyRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVudGl0eUNvbmZsaWN0RXJyb3IsIFdvcmtmbG93UnVudGltZUVycm9yIH0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQgeyB3b3JrZmxvd0Rpc3BsYXlOYW1lIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzL3BhcnNlLW5hbWUnO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0ludm9rZVBheWxvYWQsIFdvcmxkIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7XG4gIGlzTGVnYWN5U3BlY1ZlcnNpb24sXG4gIFBBUkVOVF9SVU5fSURfQVRUUklCVVRFLFxuICBST09UX1JVTl9JRF9BVFRSSUJVVEUsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19BVFRSSUJVVEVTLFxuICBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ0JPUl9RVUVVRV9UUkFOU1BPUlQsXG4gIFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTixcbiAgd29ya2Zsb3dSdW5JZFNjaGVtYSxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB7IG1vbm90b25pY0ZhY3RvcnkgfSBmcm9tICd1bGlkJztcbmltcG9ydCB7IG5vcm1hbGl6ZUF0dHJpYnV0ZUNoYW5nZXMgfSBmcm9tICcuLi9hdHRyaWJ1dGUtY2hhbmdlcy5qcyc7XG5pbXBvcnQgeyBnZXRSdW5DYXBhYmlsaXRpZXMgfSBmcm9tICcuLi9jYXBhYmlsaXRpZXMuanMnO1xuaW1wb3J0IHsgaXNSZXRyeWFibGVXb3JsZEVycm9yIH0gZnJvbSAnLi4vY2xhc3NpZnktZXJyb3IuanMnO1xuaW1wb3J0IHsgaW1wb3J0S2V5IH0gZnJvbSAnLi4vZW5jcnlwdGlvbi5qcyc7XG5pbXBvcnQgeyBydW50aW1lTG9nZ2VyIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB0eXBlIHsgU2VyaWFsaXphYmxlIH0gZnJvbSAnLi4vc2NoZW1hcy5qcyc7XG5pbXBvcnQge1xuICBkZWh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyxcbiAgU2VyaWFsaXphdGlvbkZvcm1hdCxcbn0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbi5qcyc7XG5pbXBvcnQgeyBjb250ZXh0U3RvcmFnZSB9IGZyb20gJy4uL3N0ZXAvY29udGV4dC1zdG9yYWdlLmpzJztcbmltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHsgc2VyaWFsaXplVHJhY2VDYXJyaWVyLCB0cmFjZSB9IGZyb20gJy4uL3RlbGVtZXRyeS5qcyc7XG5pbXBvcnQgeyB2ZXJzaW9uIGFzIHdvcmtmbG93Q29yZVZlcnNpb24gfSBmcm9tICcuLi92ZXJzaW9uLmpzJztcbmltcG9ydCB7IGdldFdvcmxkTGF6eSB9IGZyb20gJy4vZ2V0LXdvcmxkLWxhenkuanMnO1xuaW1wb3J0IHsgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUsIGhlYWx0aENoZWNrIH0gZnJvbSAnLi9oZWxwZXJzLmpzJztcbmltcG9ydCB7IFJ1biB9IGZyb20gJy4vcnVuLmpzJztcbmltcG9ydCB7IHNhZmVXYWl0VW50aWwsIHdhaXRlZFVudGlsIH0gZnJvbSAnLi93YWl0LXVudGlsLmpzJztcbmltcG9ydCB7IGFzc2VydFdvcmxkU3VwcG9ydHNSdW50aW1lUHJvdG9jb2wgfSBmcm9tICcuL3dvcmxkLWNvbXBhdGliaWxpdHkuanMnO1xuXG4vKipcbiAqIFRpbWVvdXQgZm9yIHRoZSBjcm9zcy1kZXBsb3ltZW50IGNhcGFiaWxpdHkgcHJvYmUgZG9uZSBiZWZvcmVcbiAqIGRlaHlkcmF0aW5nIHdvcmtmbG93IGFyZ3VtZW50cy4gS2VwdCB0aWdodCBvbiBwdXJwb3NlOiB0aGUgcHJvYmUgaXNcbiAqIGFuIG9wdGltaXphdGlvbiAoaXQgbGV0cyB0aGUgY2FsbGVyIGVtaXQgdGhlIGZyYW1lZCBieXRlLXN0cmVhbSB3aXJlXG4gKiBmb3JtYXQgd2hlbiB0aGUgdGFyZ2V0IHN1cHBvcnRzIGl0KSwgYW5kIHRoZSBmYWxsYmFjayBvbiB0aW1lb3V0IGlzXG4gKiB0aGUgbGVnYWN5IHJhdyBmb3JtYXQgd2hpY2ggYWx3YXlzIHdvcmtzLiBMb25nIGRlbGF5cyBoZXJlIHdvdWxkIGp1c3RcbiAqIG1ha2UgYHN0YXJ0KHsgZGVwbG95bWVudElkOiAuLi4gfSlgIHNsb3dlciBmb3IgdXNlcnMgd2hvc2UgdGFyZ2V0XG4gKiBkZXBsb3ltZW50cyBkb24ndCByZWNvZ25pemUgdGhlIGhlYWx0aCBjaGVjayBhdCBhbGwuXG4gKi9cbmNvbnN0IENST1NTX0RFUExPWU1FTlRfQ0FQQUJJTElUWV9QUk9CRV9USU1FT1VUX01TID0gMl8wMDA7XG5cbi8qKiBVTElEIGdlbmVyYXRvciBmb3IgY2xpZW50LXNpZGUgcnVuSWQgZ2VuZXJhdGlvbiAqL1xuY29uc3QgdWxpZCA9IG1vbm90b25pY0ZhY3RvcnkoKTtcblxuLyoqXG4gKiBDcm9zcy1ydW4gbGluZWFnZSBmb3IgYSBydW4gYmVpbmcgc3RhcnRlZCBmcm9tIGluc2lkZSBhbm90aGVyIHJ1bi5cbiAqXG4gKiBUaGUgYW1iaWVudCBzdGVwIGNvbnRleHQgY2FycmllcyB0aGUgcGFyZW50IHJ1biBpZCBhbmQgdGhlIHJvb3Qgb2YgaXRzXG4gKiBsaW5lYWdlOyB0aGUgcnVudGltZSBmaWxscyBib3RoIGZyb20gdGhlIHJ1biBpdCBhbHJlYWR5IGhhcyBsb2FkZWQsIHNvIHRoaXNcbiAqIGlzIGEgcHVyZSBjb250ZXh0IHJlYWQgd2l0aCBubyBJL08uIFRoZSBuZXcgcnVuIHJlY29yZHMgYCRwYXJlbnRSdW5JZGAgKHRoZVxuICogZWRnZSkgYW5kIGluaGVyaXRzIHRoZSBwYXJlbnQncyBgJHJvb3RSdW5JZGAgKHRoZSBwYXJlbnQgaXRzZWxmIHdoZW4gaXQgaXMgYVxuICogcm9vdCksIHNvIGEgZGFpc3kgY2hhaW4gb3IgZmFuLW91dCBvZiBhbnkgZGVwdGggZ3JvdXBzIHVuZGVyIG9uZSByb290IGlkLlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCBmb3IgYSB0b3AtbGV2ZWwgYHN0YXJ0KClgLCB3aGljaCBoYXMgbm8gY29udGV4dCwgc29cbiAqIHN0YW5kYWxvbmUgcnVucyBjYXJyeSBubyBsaW5lYWdlLlxuICovXG5mdW5jdGlvbiByZXNvbHZlTGluZWFnZUF0dHJpYnV0ZXMoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHN0b3JlID0gY29udGV4dFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgY29uc3QgcGFyZW50UnVuSWQgPSBzdG9yZT8ud29ya2Zsb3dNZXRhZGF0YT8ud29ya2Zsb3dSdW5JZDtcbiAgaWYgKCFwYXJlbnRSdW5JZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIFtST09UX1JVTl9JRF9BVFRSSUJVVEVdOiBzdG9yZS5yb290UnVuSWQgPz8gcGFyZW50UnVuSWQsXG4gICAgW1BBUkVOVF9SVU5fSURfQVRUUklCVVRFXTogcGFyZW50UnVuSWQsXG4gIH07XG59XG5cbi8vIGBkZXBsb3ltZW50SWQ6ICdsYXRlc3QnYCBpcyBhIG5vLW9wIGluIFdvcmxkcyB3aXRob3V0IGF0b21pYyBkZXBsb3ltZW50cy5cbi8vIFRoZSB3YXJuaW5nIHRoYXQgZXhwbGFpbnMgdGhpcyBvbmx5IG5lZWRzIHRvIGZpcmUgb25jZSBwZXIgcHJvY2VzczogYVxuLy8gd29ya2Zsb3cgdGhhdCBoYXJkY29kZXMgJ2xhdGVzdCcgZm9yIGl0cyBWZXJjZWwgZGVwbG95bWVudCB3b3VsZCBvdGhlcndpc2Vcbi8vIGxvZyBpdCBvbiBldmVyeSBsb2NhbC9Qb3N0Z3JlcyBydW4sIGZsb29kaW5nIHRpZ2h0IGRldiBsb29wcy5cbmxldCBoYXNXYXJuZWRMYXRlc3ROb09wID0gZmFsc2U7XG5cbi8qKlxuICogUmVzZXQgdGhlIGBkZXBsb3ltZW50SWQ6ICdsYXRlc3QnYCBuby1vcCB3YXJuLW9uY2UgZ3VhcmQuIFRlc3Qtb25seSDigJRcbiAqIGV4cG9ydGVkIHNvIHVuaXQgdGVzdHMgY2FuIGV4ZXJjaXNlIHRoZSB3YXJuIHBhdGggYWNyb3NzIGBzdGFydCgpYCBjYWxscy5cbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIF9yZXNldExhdGVzdE5vT3BXYXJuRm9yVGVzdHMoKTogdm9pZCB7XG4gIGhhc1dhcm5lZExhdGVzdE5vT3AgPSBmYWxzZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFydE9wdGlvbnNCYXNlIHtcbiAgLyoqXG4gICAqIFRoZSB3b3JsZCB0byB1c2UgZm9yIHRoZSB3b3JrZmxvdyBydW4gY3JlYXRpb24sXG4gICAqIGJ5IGRlZmF1bHQgdGhlIHdvcmxkIGlzIGluZmVycmVkIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcy5cbiAgICovXG4gIHdvcmxkPzogV29ybGQ7XG5cbiAgLyoqXG4gICAqIFRoZSBzcGVjIHZlcnNpb24gdG8gdXNlIGZvciB0aGUgd29ya2Zsb3cgcnVuLiBEZWZhdWx0cyB0byB0aGUgbGF0ZXN0IHZlcnNpb24uXG4gICAqL1xuICBzcGVjVmVyc2lvbj86IG51bWJlcjtcblxuICAvKipcbiAgICogT3B0aW9uYWwgcmVnaW9uIGlkZW50aWZpZXIgZm9yIHRoZSBuZXcgcnVuLiBDdXJyZW50bHkgY29uc3VtZWQgb25seVxuICAgKiBieSBgQHdvcmtmbG93L3dvcmxkLXZlcmNlbGAsIHdoaWNoIGVtYmVkcyB0aGUgcmVnaW9uIGludG8gdGhlIHRhZ2dlZFxuICAgKiBydW4gSUQgYW5kIHJvdXRlcyB0aGUgaW5pdGlhbCB3b3JrZmxvdyBtZXNzYWdlIHRvIHRoZSBtYXRjaGluZ1xuICAgKiByZWdpb25hbCBxdWV1ZS4gV2hlbiBvbWl0dGVkLCB0aGUgd29ybGQgZmFsbHMgYmFjayB0byBpdHMgb3duXG4gICAqIGRlZmF1bHQgKGZvciBgd29ybGQtdmVyY2VsYDogdGhlIGBWRVJDRUxfUkVHSU9OYCBlbnZpcm9ubWVudFxuICAgKiB2YXJpYWJsZSwgdGhlbiB0aGUgc2VydmVyLXNpZGUgZGVmYXVsdCByZWdpb24gYGlhZDFgIOKAlCBhIGNvbmNyZXRlLFxuICAgKiByb3V0YWJsZSByZWdpb24gaXMgYWx3YXlzIGNob3NlbikuXG4gICAqXG4gICAqIFdvcmxkcyB3aXRob3V0IGEgcmVnaW9uYWwgZGltZW5zaW9uIGlnbm9yZSB0aGlzIGZpZWxkLlxuICAgKi9cbiAgcmVnaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQbGFpbnRleHQgYXR0cmlidXRlcyB0byBzZWVkIG9uIHRoZSBydW4gYXMgaXQgaXMgY3JlYXRlZC5cbiAgICpcbiAgICogQXZhaWxhYmxlIGZvciBuYXRpdmUtYXR0cmlidXRlcyBydW5zIChzcGVjIHZlcnNpb24gNCBhbmQgbGF0ZXIpLlxuICAgKi9cbiAgYXR0cmlidXRlcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFBlcm1pdCByZXNlcnZlZCBgJGAtcHJlZml4ZWQga2V5cyBpbiBgYXR0cmlidXRlc2AuIFRoZSBgJGAgbmFtZXNwYWNlXG4gICAqIGlzIHJlc2VydmVkIGZvciBmcmFtZXdvcmsvbGlicmFyeSBjb2RlIGJ1aWx0IG9uIHRvcCBvZiB0aGUgd29ya2Zsb3dcbiAgICogU0RLICh0ZWxlbWV0cnksIGFnZW50IG1ldGFkYXRhLCBwbGF0Zm9ybS1lbWl0dGVkIHRhZ3MsIGV0Yy4pOyB1c2VyXG4gICAqIGNvZGUgTVVTVCBOT1Qgd3JpdGUga2V5cyBpbiBpdCwgYW5kIHZhbGlkYXRpb24gcmVqZWN0cyB0aGVtIHNvXG4gICAqIGFjY2lkZW50YWwgY29sbGlzaW9ucyB3aXRoIHRvb2xpbmctb3duZWQga2V5cyBjYW4ndCBzbGlwIHRocm91Z2guXG4gICAqXG4gICAqIE9ubHkgZmxpcCB0aGlzIHRvIGB0cnVlYCBpZiB5b3VyIGNhbGxlciBpcyBpdHNlbGYgYSBmcmFtZXdvcmsgb3JcbiAgICogbGlicmFyeSB0aGF0IG93bnMgYSBgJGAtcHJlZml4ZWQgc3ViLW5hbWVzcGFjZSBhbmQga25vd3MgdGhlXG4gICAqIGNvbnZlbnRpb25zIG9mIGFueSBvdGhlciB0b29scyB3cml0aW5nIGludG8gaXQuIFNhbWUgc2VtYW50aWNzIGFzXG4gICAqIHRoZSBgc2V0QXR0cmlidXRlc2Agb3B0aW9uIG9mIHRoZSBzYW1lIG5hbWUuXG4gICAqL1xuICBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBJRCBvZiBhbiBleGlzdGluZyBydW4gdGhpcyBydW4gaXMgYmVpbmcgcmVwbGF5ZWQgZnJvbSwgaWYgYW55LlxuICAgKlxuICAgKiBSZWNvcmRlZCBvbiB0aGUgbmV3IHJ1bidzIGBleGVjdXRpb25Db250ZXh0YCBhcyBgcmVwbGF5ZWRGcm9tUnVuSWRgIHNvXG4gICAqIHRvb2xpbmcgKGUuZy4gdGhlIGRhc2hib2FyZCBydW5zIGxpc3QpIGNhbiBzaG93IHRoYXQgYSBydW4gb3JpZ2luYXRlZCBhc1xuICAgKiBhIHJlcGxheSBhbmQgbGluayBiYWNrIHRvIGl0cyBzb3VyY2UuIFNldCBhdXRvbWF0aWNhbGx5IGJ5XG4gICAqIHtAbGluayByZWNyZWF0ZVJ1bkZyb21FeGlzdGluZ307IHRoZXJlJ3MgdXN1YWxseSBubyByZWFzb24gdG8gcGFzcyBpdFxuICAgKiBkaXJlY3RseS5cbiAgICpcbiAgICogTXVzdCBiZSBhIHJ1biBJRDogYHdydW5fYCBmb2xsb3dlZCBieSBhIDI2LWNoYXIgVUxJRC4gSXQncyBhIGZvcmVpZ24ga2V5XG4gICAqIHRvIHRoZSBzb3VyY2UgcnVuLCBzbyBgc3RhcnQoKWAgdmFsaWRhdGVzIHRoZSBleGFjdCBzaGFwZSBhbmQgcmVqZWN0c1xuICAgKiBhbnl0aGluZyBlbHNlIHJhdGhlciB0aGFuIHBlcnNpc3QgYSBsaW5lYWdlIGxpbmsgdGhhdCBwb2ludHMgYXQgZ2FyYmFnZS5cbiAgICovXG4gIHJlcGxheWVkRnJvbVJ1bklkPzogc3RyaW5nO1xuICAvKipcbiAgICogUXVldWUgbmFtZXNwYWNlIG9mIHRoZSB0YXJnZXQgZGVwbG95bWVudC4gU2NvcGVzIHRoZSB3b3JrZmxvdyBxdWV1ZVxuICAgKiB0b3BpYyB0byBgX197bmFtZXNwYWNlfV93a2Zfd29ya2Zsb3dfKmAgKGUuZy4gYCdldmUnYCkgaW5zdGVhZCBvZiB0aGVcbiAgICogZGVmYXVsdCBgX193a2Zfd29ya2Zsb3dfKmAsIGFuZCBpcyBhbHNvIHVzZWQgZm9yIHRoZSBjcm9zcy1kZXBsb3ltZW50XG4gICAqIGNhcGFiaWxpdHkgcHJvYmUuIEZhbGxzIGJhY2sgdG8gYFdPUktGTE9XX1FVRVVFX05BTUVTUEFDRWAgaW4gdGhlXG4gICAqIGNhbGxpbmcgcHJvY2Vzcy5cbiAgICpcbiAgICogV2l0aGluIGEgZGVwbG95bWVudCB0aGUgZW52IGZhbGxiYWNrIGlzIGNvcnJlY3QuIENyb3NzLWNvbnRleHQgY2FsbGVyc1xuICAgKiAoZS5nLiB0aGUgb2JzZXJ2YWJpbGl0eSBkYXNoYm9hcmQgcmVwbGF5aW5nIGEgcnVuKSBtdXN0IHBhc3MgdGhlXG4gICAqIFRBUkdFVCBkZXBsb3ltZW50J3MgbmFtZXNwYWNlIGV4cGxpY2l0bHk6IHRoZSBlbnYgZmFsbGJhY2sgcmVzb2x2ZXMgaW5cbiAgICogdGhlIGNhbGxlcidzIHByb2Nlc3MsIGFuZCBhIHJ1biBlbnF1ZXVlZCB0byBhIHRvcGljIHRoZSB0YXJnZXQgaGFzIG5vXG4gICAqIGNvbnN1bWVyIGZvciBpcyBuZXZlciBwaWNrZWQgdXAuXG4gICAqL1xuICBuYW1lc3BhY2U/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRPcHRpb25zV2l0aERlcGxveW1lbnRJZCBleHRlbmRzIFN0YXJ0T3B0aW9uc0Jhc2Uge1xuICAvKipcbiAgICogVGhlIGRlcGxveW1lbnQgSUQgdG8gdXNlIGZvciB0aGUgd29ya2Zsb3cgcnVuLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCB0aGlzIGlzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICogd2hlbiBkZXBsb3lpbmcgdG8gVmVyY2VsLlxuICAgKlxuICAgKiBTZXQgdG8gYCdsYXRlc3QnYCB0byBhdXRvbWF0aWNhbGx5IHJlc29sdmUgdGhlIG1vc3QgcmVjZW50IGRlcGxveW1lbnRcbiAgICogZm9yIHRoZSBjdXJyZW50IGVudmlyb25tZW50IChzYW1lIHByb2R1Y3Rpb24gdGFyZ2V0IG9yIGdpdCBicmFuY2gpLlxuICAgKiBUaGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBpbiB3b3JsZHMgd2l0aCBhdG9taWMsIGltbXV0YWJsZSBkZXBsb3ltZW50c1xuICAgKiAoY3VycmVudGx5IFZlcmNlbCkuIEluIG90aGVyIHdvcmxkcyAobG9jYWwgZGV2LCBQb3N0Z3JlcykgdGhlcmUgaXMgbm9cbiAgICogbm90aW9uIG9mIG11bHRpcGxlIGRlcGxveW1lbnRzIHRvIHJlc29sdmUgYmV0d2Vlbiwgc28gYCdsYXRlc3QnYCBoYXMgbm9cbiAgICogZWZmZWN0IOKAlCBhIHdhcm5pbmcgaXMgbG9nZ2VkIGFuZCB0aGUgcnVuIHRhcmdldHMgdGhlIGN1cnJlbnQgZGVwbG95bWVudC5cbiAgICpcbiAgICogKipOb3RlOioqIFdoZW4gYGRlcGxveW1lbnRJZGAgaXMgcHJvdmlkZWQsIHRoZSBhcmd1bWVudCBhbmQgcmV0dXJuIHR5cGVzIGJlY29tZSBgdW5rbm93bmBcbiAgICogc2luY2UgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoZSB0eXBlcyB3aWxsIGJlIGNvbnNpc3RlbnQgYWNyb3NzIGRlcGxveW1lbnRzLlxuICAgKi9cbiAgZGVwbG95bWVudElkOiAnbGF0ZXN0JyB8IChzdHJpbmcgJiB7fSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhcnRPcHRpb25zV2l0aG91dERlcGxveW1lbnRJZCBleHRlbmRzIFN0YXJ0T3B0aW9uc0Jhc2Uge1xuICBkZXBsb3ltZW50SWQ/OiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc3RhcnRpbmcgYSB3b3JrZmxvdyBydW4uXG4gKi9cbmV4cG9ydCB0eXBlIFN0YXJ0T3B0aW9ucyA9XG4gIHwgU3RhcnRPcHRpb25zV2l0aERlcGxveW1lbnRJZFxuICB8IFN0YXJ0T3B0aW9uc1dpdGhvdXREZXBsb3ltZW50SWQ7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBpbXBvcnRlZCB3b3JrZmxvdyBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgV29ya2Zsb3dGdW5jdGlvbjxUQXJncyBleHRlbmRzIHVua25vd25bXSwgVFJlc3VsdD4gPSAoXG4gIC4uLmFyZ3M6IFRBcmdzXG4pID0+IFByb21pc2U8VFJlc3VsdD47XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgZ2VuZXJhdGVkIG1ldGFkYXRhIG9mIGEgd29ya2Zsb3cgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtmbG93TWV0YWRhdGEgPSB7IHdvcmtmbG93SWQ6IHN0cmluZyB9O1xuXG4vKipcbiAqIFN0YXJ0cyBhIHdvcmtmbG93IHJ1bi5cbiAqXG4gKiBAcGFyYW0gd29ya2Zsb3cgLSBUaGUgaW1wb3J0ZWQgd29ya2Zsb3cgZnVuY3Rpb24gdG8gc3RhcnQuXG4gKiBAcGFyYW0gYXJncyAtIFRoZSBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgd29ya2Zsb3cgKG9wdGlvbmFsKS5cbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgZm9yIHRoZSB3b3JrZmxvdyBydW4gKG9wdGlvbmFsKS5cbiAqIEByZXR1cm5zIFRoZSB1bmlxdWUgcnVuIElEIGZvciB0aGUgbmV3bHkgc3RhcnRlZCB3b3JrZmxvdyBpbnZvY2F0aW9uLlxuICovXG4vLyBPdmVybG9hZHMgd2l0aCBkZXBsb3ltZW50SWQgLSBhcmdzIGFuZCByZXR1cm4gdHlwZSBiZWNvbWUgdW5rbm93blxuLy8gVXNlcyBnZW5lcmljcyBzbyB0eXBlZCB3b3JrZmxvd3MgYXJlIGFzc2lnbmFibGUgKGF2b2lkcyBjb250cmF2YXJpYW5jZSBpc3N1ZXMpLFxuLy8gYnV0IHRoZSByZXR1cm4gdHlwZSBhbmQgYXJncyBhcmUgc3RpbGwgdW5rbm93biBzaW5jZSB0aGUgZGVwbG95ZWQgdmVyc2lvbiBtYXkgZGlmZmVyLlxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0PFRBcmdzIGV4dGVuZHMgdW5rbm93bltdLCBUUmVzdWx0PihcbiAgd29ya2Zsb3c6IFdvcmtmbG93RnVuY3Rpb248VEFyZ3MsIFRSZXN1bHQ+IHwgV29ya2Zsb3dNZXRhZGF0YSxcbiAgYXJnczogdW5rbm93bltdLFxuICBvcHRpb25zOiBTdGFydE9wdGlvbnNXaXRoRGVwbG95bWVudElkXG4pOiBQcm9taXNlPFJ1bjx1bmtub3duPj47XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydDxUUmVzdWx0PihcbiAgd29ya2Zsb3c6IFdvcmtmbG93RnVuY3Rpb248W10sIFRSZXN1bHQ+IHwgV29ya2Zsb3dNZXRhZGF0YSxcbiAgb3B0aW9uczogU3RhcnRPcHRpb25zV2l0aERlcGxveW1lbnRJZFxuKTogUHJvbWlzZTxSdW48dW5rbm93bj4+O1xuXG4vLyBPdmVybG9hZHMgd2l0aG91dCBkZXBsb3ltZW50SWQgLSBwcmVzZXJ2ZSB0eXBlIGluZmVyZW5jZVxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0PFRBcmdzIGV4dGVuZHMgdW5rbm93bltdLCBUUmVzdWx0PihcbiAgd29ya2Zsb3c6IFdvcmtmbG93RnVuY3Rpb248VEFyZ3MsIFRSZXN1bHQ+IHwgV29ya2Zsb3dNZXRhZGF0YSxcbiAgYXJnczogVEFyZ3MsXG4gIG9wdGlvbnM/OiBTdGFydE9wdGlvbnNXaXRob3V0RGVwbG95bWVudElkXG4pOiBQcm9taXNlPFJ1bjxUUmVzdWx0Pj47XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydDxUUmVzdWx0PihcbiAgd29ya2Zsb3c6IFdvcmtmbG93RnVuY3Rpb248W10sIFRSZXN1bHQ+IHwgV29ya2Zsb3dNZXRhZGF0YSxcbiAgb3B0aW9ucz86IFN0YXJ0T3B0aW9uc1dpdGhvdXREZXBsb3ltZW50SWRcbik6IFByb21pc2U8UnVuPFRSZXN1bHQ+PjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0PFRBcmdzIGV4dGVuZHMgdW5rbm93bltdLCBUUmVzdWx0PihcbiAgd29ya2Zsb3c6IFdvcmtmbG93RnVuY3Rpb248VEFyZ3MsIFRSZXN1bHQ+IHwgV29ya2Zsb3dNZXRhZGF0YSxcbiAgYXJnc09yT3B0aW9ucz86IFRBcmdzIHwgU3RhcnRPcHRpb25zLFxuICBvcHRpb25zPzogU3RhcnRPcHRpb25zXG4pIHtcbiAgJ3VzZSBzdGVwJztcbiAgcmV0dXJuIGF3YWl0IHdhaXRlZFVudGlsKCgpID0+IHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRoaXMgZmllbGQgaXMgYWRkZWQgYnkgb3VyIGNsaWVudCB0cmFuc2Zvcm1cbiAgICBjb25zdCB3b3JrZmxvd05hbWUgPSB3b3JrZmxvdz8ud29ya2Zsb3dJZDtcblxuICAgIGlmICghd29ya2Zsb3dOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgIGAnc3RhcnQnIHJlY2VpdmVkIGFuIGludmFsaWQgd29ya2Zsb3cgZnVuY3Rpb24uIEVuc3VyZSB0aGUgV29ya2Zsb3cgU0RLIGlzIGNvbmZpZ3VyZWQgY29ycmVjdGx5IGFuZCB0aGUgZnVuY3Rpb24gaW5jbHVkZXMgYSAndXNlIHdvcmtmbG93JyBkaXJlY3RpdmUuYCxcbiAgICAgICAgeyBzbHVnOiAnc3RhcnQtaW52YWxpZC13b3JrZmxvdy1mdW5jdGlvbicgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzcGFuTmFtZSA9IGB3b3JrZmxvdy5zdGFydCAke3dvcmtmbG93RGlzcGxheU5hbWUod29ya2Zsb3dOYW1lKX1gO1xuICAgIHJldHVybiB0cmFjZShzcGFuTmFtZSwgYXN5bmMgKHNwYW4pID0+IHtcbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dOYW1lKHdvcmtmbG93TmFtZSksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd09wZXJhdGlvbignc3RhcnQnKSxcbiAgICAgIH0pO1xuXG4gICAgICBsZXQgYXJnczogU2VyaWFsaXphYmxlW10gPSBbXTtcbiAgICAgIGxldCBvcHRzOiBTdGFydE9wdGlvbnMgPSBvcHRpb25zID8/IHt9O1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYXJnc09yT3B0aW9ucykpIHtcbiAgICAgICAgYXJncyA9IGFyZ3NPck9wdGlvbnMgYXMgU2VyaWFsaXphYmxlW107XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmdzT3JPcHRpb25zID09PSAnb2JqZWN0Jykge1xuICAgICAgICBvcHRzID0gYXJnc09yT3B0aW9ucztcbiAgICAgIH1cblxuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0FyZ3VtZW50c0NvdW50KGFyZ3MubGVuZ3RoKSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB3b3JsZCA9IG9wdHMud29ybGQgPz8gKGF3YWl0IGdldFdvcmxkTGF6eSgpKTtcbiAgICAgIGFzc2VydFdvcmxkU3VwcG9ydHNSdW50aW1lUHJvdG9jb2wod29ybGQpO1xuICAgICAgY29uc3QgY3VycmVudERlcGxveW1lbnRJZCA9IGF3YWl0IHdvcmxkLmdldERlcGxveW1lbnRJZCgpO1xuICAgICAgbGV0IGRlcGxveW1lbnRJZCA9IG9wdHMuZGVwbG95bWVudElkID8/IGN1cnJlbnREZXBsb3ltZW50SWQ7XG5cbiAgICAgIC8vIFdoZW4gJ2xhdGVzdCcgaXMgcmVxdWVzdGVkLCByZXNvbHZlIHRoZSBhY3R1YWwgbGF0ZXN0IGRlcGxveW1lbnQgSURcbiAgICAgIC8vIGZvciB0aGUgY3VycmVudCBkZXBsb3ltZW50J3MgZW52aXJvbm1lbnQgKHNhbWUgcHJvZHVjdGlvbiB0YXJnZXQgb3JcbiAgICAgIC8vIHNhbWUgZ2l0IGJyYW5jaCBmb3IgcHJldmlldyBkZXBsb3ltZW50cykuXG4gICAgICAvL1xuICAgICAgLy8gUmVzb2x2aW5nICdsYXRlc3QnIG9ubHkgbWVhbnMgc29tZXRoaW5nIGluIHdvcmxkcyB3aXRoIGF0b21pYyxcbiAgICAgIC8vIGltbXV0YWJsZSBkZXBsb3ltZW50cyAoZS5nLiBWZXJjZWwpLCB3aGljaCBpbXBsZW1lbnRcbiAgICAgIC8vIHJlc29sdmVMYXRlc3REZXBsb3ltZW50SWQoKS4gV29ybGRzIHdpdGhvdXQgdGhhdCBjb25jZXB0IChsb2NhbCBkZXYsXG4gICAgICAvLyBzZWxmLWhvc3RlZCBQb3N0Z3JlcykgaGF2ZSBub3RoaW5nIHRvIHJlc29sdmUgYmV0d2Vlbiwgc28gcmF0aGVyIHRoYW5cbiAgICAgIC8vIGZhaWwgYSBydW4gdGhhdCB3b3JrcyBmaW5lIG9uIFZlcmNlbCwgd2Ugd2FybiBhbmQgZmFsbCBiYWNrIHRvIHRoZVxuICAgICAgLy8gY3VycmVudCBkZXBsb3ltZW50IOKAlCBtYWtpbmcgJ2xhdGVzdCcgYW4gZWZmZWN0aXZlIG5vLW9wIHRoZXJlLlxuICAgICAgaWYgKGRlcGxveW1lbnRJZCA9PT0gJ2xhdGVzdCcpIHtcbiAgICAgICAgaWYgKHdvcmxkLnJlc29sdmVMYXRlc3REZXBsb3ltZW50SWQpIHtcbiAgICAgICAgICBkZXBsb3ltZW50SWQgPSBhd2FpdCB3b3JsZC5yZXNvbHZlTGF0ZXN0RGVwbG95bWVudElkKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gV2FybiBvbmNlIHBlciBwcm9jZXNzIOKAlCBzZWUgaGFzV2FybmVkTGF0ZXN0Tm9PcCBhYm92ZS5cbiAgICAgICAgICBpZiAoIWhhc1dhcm5lZExhdGVzdE5vT3ApIHtcbiAgICAgICAgICAgIGhhc1dhcm5lZExhdGVzdE5vT3AgPSB0cnVlO1xuICAgICAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICAgICBcImRlcGxveW1lbnRJZDogJ2xhdGVzdCcgaGFzIG5vIGVmZmVjdCBpbiB0aGlzIHdvcmxkIGFuZCB3YXMgaWdub3JlZC4gXCIgK1xuICAgICAgICAgICAgICAgICdJdCBpcyBvbmx5IHN1cHBvcnRlZCBieSB3b3JsZHMgd2l0aCBhdG9taWMgZGVwbG95bWVudHMsIHN1Y2ggYXMgVmVyY2VsLiAnICtcbiAgICAgICAgICAgICAgICAnVGhlIHJ1biB3aWxsIHRhcmdldCB0aGUgY3VycmVudCBkZXBsb3ltZW50LicsXG4gICAgICAgICAgICAgIHsgY3VycmVudERlcGxveW1lbnRJZCB9XG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZXBsb3ltZW50SWQgPSBjdXJyZW50RGVwbG95bWVudElkO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIERlY2lkZSB3aGV0aGVyIHRvIHdyaXRlIGJ5dGUgc3RyZWFtcyBpbiB0aGUgZnJhbWVkIHdpcmUgZm9ybWF0LlxuICAgICAgLy8gRm9yIHNhbWUtZGVwbG95bWVudCBzdGFydHMgKHRoZSBjb21tb24gY2FzZSkgd2Uga25vdyB0aGUgdGFyZ2V0IGlzXG4gICAgICAvLyBydW5uaW5nIHRoaXMgc2FtZSBTREsgdmVyc2lvbiwgc28gZnJhbWluZyBpcyBzYWZlLiBGb3IgY3Jvc3MtXG4gICAgICAvLyBkZXBsb3ltZW50IHN0YXJ0cyAoZXhwbGljaXQgZGVwbG95bWVudElkIG9yICdsYXRlc3QnIHRoYXQgcmVzb2x2ZXNcbiAgICAgIC8vIHRvIGEgZGlmZmVyZW50IGRlcGxveW1lbnQpIHdlIHByb2JlIHRoZSB0YXJnZXQgdmlhIGhlYWx0aENoZWNrIHRvXG4gICAgICAvLyBsZWFybiBpdHMgd29ya2Zsb3ctY29yZSB2ZXJzaW9uLCB0aGVuIGRlcml2ZSB0aGUgY2FwYWJpbGl0eS4gVGhlXG4gICAgICAvLyBwcm9iZSBoYXMgYSB0aWdodCB0aW1lb3V0IOKAlCBvbiBtaXNzL2ZhaWx1cmUgd2UgZmFsbCBiYWNrIHRvIHRoZVxuICAgICAgLy8gbGVnYWN5IHJhdyBieXRlIGZvcm1hdCwgd2hpY2ggaXMgdW5pdmVyc2FsbHkgcmVhZGFibGUuXG4gICAgICAvL1xuICAgICAgLy8gV29ybGRzIHRoYXQgZG9uJ3QgZXhwb3NlIHRoZSBgc3RyZWFtc2AgQVBJIChlLmcuIG1pbmltYWwgdGVzdFxuICAgICAgLy8gbW9ja3MpIGNhbid0IHNlcnZpY2UgaGVhbHRoIGNoZWNrcywgc28gd2Ugc2tpcCB0aGUgcHJvYmUgZm9yIHRoZW0uXG4gICAgICBsZXQgZnJhbWVkQnl0ZVN0cmVhbXM6IGJvb2xlYW47XG4gICAgICBsZXQgdGFyZ2V0U3VwcG9ydHNDb21wcmVzc2lvbjogYm9vbGVhbjtcbiAgICAgIGlmIChkZXBsb3ltZW50SWQgPT09IGN1cnJlbnREZXBsb3ltZW50SWQpIHtcbiAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMgPSB0cnVlO1xuICAgICAgICB0YXJnZXRTdXBwb3J0c0NvbXByZXNzaW9uID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHdvcmxkLnN0cmVhbXM/LmdldCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmcmFtZWRCeXRlU3RyZWFtcyA9IGZhbHNlO1xuICAgICAgICB0YXJnZXRTdXBwb3J0c0NvbXByZXNzaW9uID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwcm9iZSA9IGF3YWl0IGhlYWx0aENoZWNrKHdvcmxkLCAnd29ya2Zsb3cnLCB7XG4gICAgICAgICAgZGVwbG95bWVudElkLFxuICAgICAgICAgIHRpbWVvdXQ6IENST1NTX0RFUExPWU1FTlRfQ0FQQUJJTElUWV9QUk9CRV9USU1FT1VUX01TLFxuICAgICAgICAgIG5hbWVzcGFjZTogb3B0cy5uYW1lc3BhY2UsXG4gICAgICAgIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICAgIGNvbnN0IGNhcGFiaWxpdGllcyA9IGdldFJ1bkNhcGFiaWxpdGllcyhwcm9iZT8ud29ya2Zsb3dDb3JlVmVyc2lvbik7XG4gICAgICAgIGZyYW1lZEJ5dGVTdHJlYW1zID0gY2FwYWJpbGl0aWVzLmZyYW1lZEJ5dGVTdHJlYW1zO1xuICAgICAgICB0YXJnZXRTdXBwb3J0c0NvbXByZXNzaW9uID0gY2FwYWJpbGl0aWVzLnN1cHBvcnRlZEZvcm1hdHMuaGFzKFxuICAgICAgICAgIFNlcmlhbGl6YXRpb25Gb3JtYXQuR1pJUFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvcHM6IFByb21pc2U8dm9pZD5bXSA9IFtdO1xuXG4gICAgICAvLyBHZW5lcmF0ZSBydW5JZCBjbGllbnQtc2lkZSBzbyB3ZSBoYXZlIGl0IGJlZm9yZSBzZXJpYWxpemF0aW9uXG4gICAgICAvLyAocmVxdWlyZWQgZm9yIGZ1dHVyZSBFMkUgZW5jcnlwdGlvbiB3aGVyZSBydW5JZCBpcyBwYXJ0IG9mIHRoZVxuICAgICAgLy8gZW5jcnlwdGlvbiBjb250ZXh0KS4gV2hlbiB0aGUgV29ybGQgcHJvdmlkZXMgYSBgY3JlYXRlUnVuSWQoKWBcbiAgICAgIC8vIGltcGxlbWVudGF0aW9uLCB1c2UgaXQgc28gd29ybGRzIGNhbiBlbWJlZCBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpY1xuICAgICAgLy8gbWV0YWRhdGEgKGUuZy4sIHJlZ2lvbikgaW50byB0aGUgSUQsIGZvcndhcmRpbmcgdGhlIGZ1bGwgb3B0aW9uc1xuICAgICAgLy8gYmFnIHNvIHdvcmxkcyBjYW4gcmVhZCB3aGljaGV2ZXIgZmllbGRzIHRoZXkgcmVjb2duaXNlOyBvdGhlcndpc2VcbiAgICAgIC8vIGZhbGwgYmFjayB0byBhIHN0YW5kYXJkIG1vbm90b25pYyBVTElELlxuICAgICAgY29uc3QgcnVuSWQgPSBgd3J1bl8ke1xuICAgICAgICB3b3JsZC5jcmVhdGVSdW5JZFxuICAgICAgICAgID8gd29ybGQuY3JlYXRlUnVuSWQob3B0cyBhcyBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pXG4gICAgICAgICAgOiB1bGlkKClcbiAgICAgIH1gO1xuXG4gICAgICAvLyBTZXJpYWxpemUgY3VycmVudCB0cmFjZSBjb250ZXh0IHRvIHByb3BhZ2F0ZSBhY3Jvc3MgcXVldWUgYm91bmRhcnlcbiAgICAgIGNvbnN0IHRyYWNlQ2FycmllciA9IGF3YWl0IHNlcmlhbGl6ZVRyYWNlQ2FycmllcigpO1xuXG4gICAgICAvLyBEZWZhdWx0IG5ldyBydW5zIHRvIHRoZSBjb25maWd1cmVkIHdvcmxkJ3Mgc3BlYyB2ZXJzaW9uLiBUaGUgd29ybGRcbiAgICAgIC8vIGl0c2VsZiBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQgYWdhaW5zdCB0aGlzIHJ1bnRpbWUncyBzcGVjIHZlcnNpb24uXG4gICAgICBjb25zdCBzcGVjVmVyc2lvbiA9IG9wdHMuc3BlY1ZlcnNpb24gPz8gd29ybGQuc3BlY1ZlcnNpb247XG4gICAgICBjb25zdCB2MUNvbXBhdCA9IGlzTGVnYWN5U3BlY1ZlcnNpb24oc3BlY1ZlcnNpb24pO1xuICAgICAgY29uc3QgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMgPSBvcHRzLmFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzID09PSB0cnVlO1xuICAgICAgbGV0IGF0dHJpYnV0ZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAob3B0cy5hdHRyaWJ1dGVzICYmIE9iamVjdC5rZXlzKG9wdHMuYXR0cmlidXRlcykubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoc3BlY1ZlcnNpb24gPCBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQVRUUklCVVRFUykge1xuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgICdJbml0aWFsIHdvcmtmbG93IGF0dHJpYnV0ZXMgcmVxdWlyZSBhIFdvcmxkIHRoYXQgc3VwcG9ydHMgc3BlYyB2ZXJzaW9uIDQgb3IgbGF0ZXIuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYG5vcm1hbGl6ZUF0dHJpYnV0ZUNoYW5nZXNgIHRyZWF0cyBgdW5kZWZpbmVkYCBhcyBcInJlbW92ZSB0aGlzXG4gICAgICAgIC8vIGtleVwiLCB3aGljaCBpcyBtZWFuaW5nbGVzcyBhdCBjcmVhdGlvbiB0aW1lIOKAlCByZWplY3QgaXQgdXAgZnJvbnRcbiAgICAgICAgLy8gc28gSlMgY2FsbGVycyBnZXQgYSBjbGVhciBlcnJvciBpbnN0ZWFkIG9mIGEgZG93bnN0cmVhbSBzY2hlbWFcbiAgICAgICAgLy8gZmFpbHVyZSAodGhlIHR5cGVzIGFscmVhZHkgZm9yYmlkIG5vbi1zdHJpbmcgdmFsdWVzKS5cbiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob3B0cy5hdHRyaWJ1dGVzKSkge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICAgIGBJbml0aWFsIHdvcmtmbG93IGF0dHJpYnV0ZSAke0pTT04uc3RyaW5naWZ5KGtleSl9IG11c3QgYmUgYSBzdHJpbmcgdmFsdWUuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2hhbmdlcyA9IG5vcm1hbGl6ZUF0dHJpYnV0ZUNoYW5nZXMob3B0cy5hdHRyaWJ1dGVzLCB7XG4gICAgICAgICAgYWxsb3dSZXNlcnZlZEF0dHJpYnV0ZXMsXG4gICAgICAgIH0pO1xuICAgICAgICBhdHRyaWJ1dGVzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgIGNoYW5nZXMubWFwKCh7IGtleSwgdmFsdWUgfSkgPT4gW2tleSwgdmFsdWUgYXMgc3RyaW5nXSlcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ3Jvc3MtcnVuIGxpbmVhZ2U6IHRoZSByZXNlcnZlZCBrZXlzIHJpZGUgb24gdGhlIHJ1bidzIGV4aXN0aW5nXG4gICAgICAvLyBhdHRyaWJ1dGVzLCBzbyB0aGV5IGFkZCBubyBleHRyYSB3cml0ZS4gQ2FsbGVyIGF0dHJpYnV0ZXMgYXJlIHNwcmVhZFxuICAgICAgLy8gbGFzdCwgc28gYSBjYWxsZXIgd2l0aCBhbGxvd1Jlc2VydmVkQXR0cmlidXRlcyBjYW4gZGVsaWJlcmF0ZWx5XG4gICAgICAvLyByZS1wYXJlbnQuXG4gICAgICBjb25zdCBsaW5lYWdlID1cbiAgICAgICAgc3BlY1ZlcnNpb24gPj0gU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0FUVFJJQlVURVNcbiAgICAgICAgICA/IHJlc29sdmVMaW5lYWdlQXR0cmlidXRlcygpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBydW5BdHRyaWJ1dGVzID0gbGluZWFnZVxuICAgICAgICA/IHsgLi4ubGluZWFnZSwgLi4uYXR0cmlidXRlcyB9XG4gICAgICAgIDogYXR0cmlidXRlcztcblxuICAgICAgLy8gU2hhcmVkIGJ5IHRoZSBydW5fY3JlYXRlZCBldmVudCBhbmQgdGhlIHJlc2lsaWVudC1zdGFydCBxdWV1ZSBpbnB1dC5cbiAgICAgIGNvbnN0IGF0dHJpYnV0ZVNlZWQgPSBydW5BdHRyaWJ1dGVzXG4gICAgICAgID8ge1xuICAgICAgICAgICAgYXR0cmlidXRlczogcnVuQXR0cmlidXRlcyxcbiAgICAgICAgICAgIC4uLihhbGxvd1Jlc2VydmVkQXR0cmlidXRlcyB8fCBsaW5lYWdlICE9IG51bGxcbiAgICAgICAgICAgICAgPyB7IGFsbG93UmVzZXJ2ZWRBdHRyaWJ1dGVzOiB0cnVlIGFzIGNvbnN0IH1cbiAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9O1xuXG4gICAgICAvLyBgcmVwbGF5ZWRGcm9tUnVuSWRgIGlzIGEgZm9yZWlnbiBrZXkgdG8gdGhlIHNvdXJjZSBydW47IHJlamVjdCBhbnl0aGluZ1xuICAgICAgLy8gdGhhdCBpc24ndCBhIHJlYWwgcnVuIElEIHNvIHRoZSBsaW5lYWdlIGxpbmsgY2FuJ3QgcG9pbnQgYXQgZ2FyYmFnZS5cbiAgICAgIGlmIChcbiAgICAgICAgb3B0cy5yZXBsYXllZEZyb21SdW5JZCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICF3b3JrZmxvd1J1bklkU2NoZW1hLnNhZmVQYXJzZShvcHRzLnJlcGxheWVkRnJvbVJ1bklkKS5zdWNjZXNzXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgIGByZXBsYXllZEZyb21SdW5JZCBtdXN0IGJlIGEgcnVuIElEICh3cnVuXzx1bGlkPik7IHJlY2VpdmVkICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICBTdHJpbmcob3B0cy5yZXBsYXllZEZyb21SdW5JZCkuc2xpY2UoMCwgNjQpXG4gICAgICAgICAgKX0uYFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNvbHZlIGVuY3J5cHRpb24ga2V5IGZvciB0aGUgbmV3IHJ1bi4gVGhlIHJ1bklkIGhhcyBhbHJlYWR5IGJlZW5cbiAgICAgIC8vIGdlbmVyYXRlZCBhYm92ZSAoY2xpZW50LWdlbmVyYXRlZCBVTElEKSBhbmQgd2lsbCBiZSB1c2VkIGZvciBib3RoXG4gICAgICAvLyBrZXkgZGVyaXZhdGlvbiBhbmQgdGhlIHJ1bl9jcmVhdGVkIGV2ZW50LiBUaGUgV29ybGQgaW1wbGVtZW50YXRpb25cbiAgICAgIC8vIHVzZXMgdGhlIHJ1bklkIGZvciBwZXItcnVuIEhLREYga2V5IGRlcml2YXRpb24uIFdlIHBhc3MgdGhlIHJlc29sdmVkXG4gICAgICAvLyBkZXBsb3ltZW50SWQgKG5vdCBqdXN0IHRoZSByYXcgb3B0cykgc28gdGhlIFdvcmxkIGNhbiB1c2UgaXQgZm9yXG4gICAgICAvLyBrZXkgcmVzb2x1dGlvbiBldmVuIHdoZW4gZGVwbG95bWVudElkIHdhcyBpbmZlcnJlZCBmcm9tIHRoZSBlbnZpcm9ubWVudFxuICAgICAgLy8gcmF0aGVyIHRoYW4gZXhwbGljaXRseSBwcm92aWRlZCBpbiBvcHRzIChlLmcuLCBpbiBlMmUgdGVzdCBydW5uZXJzKS5cbiAgICAgIGNvbnN0IHJhd0tleSA9IGF3YWl0IHdvcmxkLmdldEVuY3J5cHRpb25LZXlGb3JSdW4/LihydW5JZCwge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBkZXBsb3ltZW50SWQsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGVuY3J5cHRpb25LZXkgPSByYXdLZXkgPyBhd2FpdCBpbXBvcnRLZXkocmF3S2V5KSA6IHVuZGVmaW5lZDtcblxuICAgICAgLy8gQ3JlYXRlIHJ1biB2aWEgcnVuX2NyZWF0ZWQgZXZlbnQgKGV2ZW50LXNvdXJjZWQgYXJjaGl0ZWN0dXJlKVxuICAgICAgLy8gUGFzcyBjbGllbnQtZ2VuZXJhdGVkIHJ1bklkIC0gc2VydmVyIHdpbGwgYWNjZXB0IGFuZCB1c2UgaXRcbiAgICAgIC8vIENvbXByZXNzIHdvcmtmbG93IGFyZ3VtZW50cyBvbmx5IHdoZW4gdGhlIHJ1biBpdHNlbGYgaXMgbWFya2VkIGFzXG4gICAgICAvLyBwb3NzaWJseSBjb250YWluaW5nIGNvbXByZXNzZWQgcGF5bG9hZHMgKHNwZWNWZXJzaW9uID49IDUpIEFORCB0aGVcbiAgICAgIC8vIHRhcmdldCBkZXBsb3ltZW50IGNhbiBkZWNvZGUgdGhlbSAoc2FtZS1kZXBsb3ltZW50LCBvciBwcm9iZWRcbiAgICAgIC8vIGNhcGFiaWxpdHkgZm9yIGNyb3NzLWRlcGxveW1lbnQgc3RhcnRzKS5cbiAgICAgIGNvbnN0IGNvbXByZXNzaW9uID1cbiAgICAgICAgdGFyZ2V0U3VwcG9ydHNDb21wcmVzc2lvbiAmJlxuICAgICAgICBzcGVjVmVyc2lvbiA+PSBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT047XG4gICAgICBjb25zdCB3b3JrZmxvd0FyZ3VtZW50cyA9IGF3YWl0IGRlaHlkcmF0ZVdvcmtmbG93QXJndW1lbnRzKFxuICAgICAgICBhcmdzLFxuICAgICAgICBydW5JZCxcbiAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgb3BzLFxuICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICB2MUNvbXBhdCxcbiAgICAgICAgZnJhbWVkQnl0ZVN0cmVhbXMsXG4gICAgICAgIGNvbXByZXNzaW9uXG4gICAgICApO1xuXG4gICAgICBjb25zdCBleGVjdXRpb25Db250ZXh0ID0ge1xuICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgIHdvcmtmbG93Q29yZVZlcnNpb24sXG4gICAgICAgIGZlYXR1cmVzOiB7IGVuY3J5cHRpb246ICEhZW5jcnlwdGlvbktleSB9LFxuICAgICAgICAuLi4ob3B0cy5yZXBsYXllZEZyb21SdW5JZFxuICAgICAgICAgID8geyByZXBsYXllZEZyb21SdW5JZDogb3B0cy5yZXBsYXllZEZyb21SdW5JZCB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9O1xuXG4gICAgICAvLyBDYWxsIGV2ZW50cy5jcmVhdGUgKHJ1bl9jcmVhdGVkKSBhbmQgcXVldWUgaW4gcGFyYWxsZWwuXG4gICAgICAvLyBJZiBldmVudHMuY3JlYXRlIGZhaWxzIHdpdGggNDI5LzV4eCwgdGhlIHJ1biB3YXMgc3RpbGwgYWNjZXB0ZWRcbiAgICAgIC8vIHZpYSB0aGUgcXVldWUgYW5kIGNyZWF0aW9uIHdpbGwgYmUgcmUtdHJpZWQgYXN5bmMgYnkgdGhlIHJ1bnRpbWUuXG4gICAgICBjb25zdCBbcnVuQ3JlYXRlZFJlc3VsdCwgcXVldWVSZXN1bHRdID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtcbiAgICAgICAgd29ybGQuZXZlbnRzLmNyZWF0ZShcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBldmVudFR5cGU6ICdydW5fY3JlYXRlZCcsXG4gICAgICAgICAgICBzcGVjVmVyc2lvbixcbiAgICAgICAgICAgIGV2ZW50RGF0YToge1xuICAgICAgICAgICAgICBkZXBsb3ltZW50SWQ6IGRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgICAgd29ya2Zsb3dOYW1lOiB3b3JrZmxvd05hbWUsXG4gICAgICAgICAgICAgIGlucHV0OiB3b3JrZmxvd0FyZ3VtZW50cyxcbiAgICAgICAgICAgICAgZXhlY3V0aW9uQ29udGV4dCxcbiAgICAgICAgICAgICAgLi4uYXR0cmlidXRlU2VlZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IHYxQ29tcGF0IH1cbiAgICAgICAgKSxcbiAgICAgICAgd29ybGQucXVldWUoXG4gICAgICAgICAgZ2V0V29ya2Zsb3dRdWV1ZU5hbWUod29ya2Zsb3dOYW1lLCBvcHRzLm5hbWVzcGFjZSksXG4gICAgICAgICAge1xuICAgICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgICB0cmFjZUNhcnJpZXIsXG4gICAgICAgICAgICAuLi4oc3BlY1ZlcnNpb24gPj0gU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NCT1JfUVVFVUVfVFJBTlNQT1JUXG4gICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgcnVuSW5wdXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IHdvcmtmbG93QXJndW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICBkZXBsb3ltZW50SWQsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgc3BlY1ZlcnNpb24sXG4gICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgIC4uLmF0dHJpYnV0ZVNlZWQsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgfSBzYXRpc2ZpZXMgV29ya2Zsb3dJbnZva2VQYXlsb2FkLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGRlcGxveW1lbnRJZCxcbiAgICAgICAgICAgIHNwZWNWZXJzaW9uLFxuICAgICAgICAgICAgLy8gRm9yd2FyZCBhbnkgY2FsbGVyLXN1cHBsaWVkIHJlZ2lvbiBoaW50IHNvIHdvcmxkcyB3aXRoXG4gICAgICAgICAgICAvLyBwZXItcmVnaW9uIHF1ZXVlIHJvdXRpbmcgKGUuZy4gd29ybGQtdmVyY2VsKSBjYW4gdGFyZ2V0IHRoZVxuICAgICAgICAgICAgLy8gbWF0Y2hpbmcgcXVldWUuIFdvcmxkcyB3aXRob3V0IGEgcmVnaW9uYWwgZGltZW5zaW9uIGlnbm9yZVxuICAgICAgICAgICAgLy8gdGhpcyBmaWVsZC5cbiAgICAgICAgICAgIC4uLihvcHRzLnJlZ2lvbiAhPT0gdW5kZWZpbmVkID8geyByZWdpb246IG9wdHMucmVnaW9uIH0gOiB7fSksXG4gICAgICAgICAgfVxuICAgICAgICApLFxuICAgICAgXSk7XG5cbiAgICAgIC8vIFF1ZXVlIGZhaWx1cmUgaXMgYWx3YXlzIGZhdGFsIOKAlCB0aGUgcnVuIHdhcyBub3QgZW5xdWV1ZWRcbiAgICAgIGlmIChxdWV1ZVJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpIHtcbiAgICAgICAgdGhyb3cgcXVldWVSZXN1bHQucmVhc29uO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgZXZlbnRzLmNyZWF0ZSByZXN1bHRcbiAgICAgIGxldCByZXNpbGllbnRTdGFydCA9IGZhbHNlO1xuICAgICAgaWYgKHJ1bkNyZWF0ZWRSZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgIGNvbnN0IGVyciA9IHJ1bkNyZWF0ZWRSZXN1bHQucmVhc29uO1xuICAgICAgICBpZiAoRW50aXR5Q29uZmxpY3RFcnJvci5pcyhlcnIpKSB7XG4gICAgICAgICAgLy8gNDA5OiBUaGUgcnVuIGFscmVhZHkgZXhpc3RzLiBUaGlzIGNhbiBoYXBwZW4gaW4gZXh0cmVtZSBjYXNlcyB3aGVyZVxuICAgICAgICAgIC8vIHRoZSBydW4gY3JlYXRpb24gY2FsbCBnZXRzIGEgY29sZCBzdGFydCBvciBvdGhlciBzbG93ZG93biwgYW5kIHRoZSBxdWV1ZVxuICAgICAgICAgIC8vICsgcnVuX3N0YXJ0ZWQgY2FsbCBjb21wbGV0ZXMgZmFzdGVyLiBXZSBleHBlY3QgdGhpcyB0byBiZSA8PTElIG9mIGNhc2VzLlxuICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgY2FuIHNhZmVseSByZXR1cm4uXG4gICAgICAgIH0gZWxzZSBpZiAoaXNSZXRyeWFibGVXb3JsZEVycm9yKGVycikpIHtcbiAgICAgICAgICAvLyA0MjkgKFRocm90dGxlRXJyb3IpLCA1eHgsIGFuZCB0cmFuc2llbnQgdHJhbnNwb3J0IGZhaWx1cmVzXG4gICAgICAgICAgLy8gKFRSQU5TUE9SVC9USU1FT1VUKSBhcmUgcmV0cnlhYmxlIOKAlCB0aGUgcnVuIHdhcyBhY2NlcHRlZCB2aWEgdGhlXG4gICAgICAgICAgLy8gcXVldWUgYW5kIGNyZWF0aW9uIHdpbGwgYmUgcmUtdHJpZWQgYnkgdGhlIHJ1bnRpbWUgd2hlbiBpdCBjYWxsc1xuICAgICAgICAgIC8vIHJ1bl9zdGFydGVkLlxuICAgICAgICAgIHJlc2lsaWVudFN0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgICBydW50aW1lTG9nZ2VyLndhcm4oXG4gICAgICAgICAgICAnUnVuIGNyZWF0aW9uIGV2ZW50IGZhaWxlZCwgYnV0IHRoZSBydW4gd2FzIGFjY2VwdGVkIHZpYSB0aGUgcXVldWUuICcgK1xuICAgICAgICAgICAgICAnVGhlIHJ1bl9jcmVhdGVkIGV2ZW50IHdpbGwgYmUgcmUtdHJpZWQgYXN5bmMgYnkgdGhlIHJ1bnRpbWUuJyxcbiAgICAgICAgICAgIHsgd29ya2Zsb3dSdW5JZDogcnVuSWQsIGVycm9yOiBlcnIubWVzc2FnZSB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJ1bkNyZWF0ZWRSZXN1bHQudmFsdWU7XG4gICAgICAgIC8vIEFzc2VydCB0aGF0IHRoZSBydW4gd2FzIGNyZWF0ZWRcbiAgICAgICAgaWYgKCFyZXN1bHQucnVuKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgICAgICAgXCJNaXNzaW5nICdydW4nIGluIHNlcnZlciByZXNwb25zZSBmb3IgJ3J1bl9jcmVhdGVkJyBldmVudFwiXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZlcmlmeSBzZXJ2ZXIgYWNjZXB0ZWQgb3VyIHJ1bklkXG4gICAgICAgIGlmICghdjFDb21wYXQgJiYgcmVzdWx0LnJ1bi5ydW5JZCAhPT0gcnVuSWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICBgU2VydmVyIHJldHVybmVkIGRpZmZlcmVudCBydW5JZCB0aGFuIHJlcXVlc3RlZDogZXhwZWN0ZWQgJHtydW5JZH0sIGdvdCAke3Jlc3VsdC5ydW4ucnVuSWR9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVGhlc2UgYXJndW1lbnQtc3RyZWFtIG9wcyBhcmUgZmx1c2hlZCBpbiB0aGUgYmFja2dyb3VuZDsgdGhlIHByb21pc2VcbiAgICAgIC8vIGhhbmRlZCB0byB3YWl0VW50aWwgbXVzdCBuZXZlciByZWplY3QgKGFuIHVuY29uc3VtZWQgd2FpdFVudGlsXG4gICAgICAvLyByZWplY3Rpb24gY3Jhc2hlcyB0aGUgcHJvY2VzcyBhcyB1bmhhbmRsZWRSZWplY3Rpb24pLCBzbyB1bmV4cGVjdGVkXG4gICAgICAvLyBmYWlsdXJlcyBhcmUgbG9nZ2VkIGluc3RlYWQuXG4gICAgICBzYWZlV2FpdFVudGlsKFByb21pc2UuYWxsKG9wcyksIChlcnIpID0+IHtcbiAgICAgICAgcnVudGltZUxvZ2dlci53YXJuKFxuICAgICAgICAgICdCYWNrZ3JvdW5kIGZsdXNoIG9mIHdvcmtmbG93IGFyZ3VtZW50IHN0cmVhbXMgZmFpbGVkJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIHNwYW4/LnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSdW5JZChydW5JZCksXG4gICAgICAgIC4uLkF0dHJpYnV0ZS5EZXBsb3ltZW50SWQoZGVwbG95bWVudElkKSxcbiAgICAgICAgLi4uKHJ1bkNyZWF0ZWRSZXN1bHQuc3RhdHVzID09PSAnZnVsZmlsbGVkJyAmJlxuICAgICAgICBydW5DcmVhdGVkUmVzdWx0LnZhbHVlLnJ1blxuICAgICAgICAgID8gQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKHJ1bkNyZWF0ZWRSZXN1bHQudmFsdWUucnVuLnN0YXR1cylcbiAgICAgICAgICA6IHt9KSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbmV3IFJ1bjxUUmVzdWx0PihydW5JZCwgeyByZXNpbGllbnRTdGFydCB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG4iXX0=