@dbx-tools/appkit-mastra 0.9.153 → 0.9.157

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 (76) hide show
  1. package/README.md +4 -3
  2. package/index.ts +32 -24
  3. package/lib/index.d.ts +32 -24
  4. package/lib/index.js +32 -23
  5. package/lib/src/agents.d.ts +5 -6
  6. package/lib/src/agents.js +12 -15
  7. package/lib/src/chart.js +33 -33
  8. package/lib/src/chat.js +10 -13
  9. package/lib/src/config.d.ts +12 -13
  10. package/lib/src/config.js +4 -4
  11. package/lib/src/evaluation.js +7 -9
  12. package/lib/src/feedback-mode.d.ts +1 -1
  13. package/lib/src/feedback-mode.js +1 -1
  14. package/lib/src/filesystems.js +6 -6
  15. package/lib/src/follow-up-suggestions.js +10 -10
  16. package/lib/src/genie-chat.js +27 -29
  17. package/lib/src/genie.d.ts +2 -2
  18. package/lib/src/genie.js +29 -29
  19. package/lib/src/identity.d.ts +3 -30
  20. package/lib/src/identity.js +2 -27
  21. package/lib/src/memory.d.ts +1 -1
  22. package/lib/src/memory.js +24 -6
  23. package/lib/src/mlflow.d.ts +4 -4
  24. package/lib/src/mlflow.js +15 -18
  25. package/lib/src/model.d.ts +3 -3
  26. package/lib/src/model.js +6 -6
  27. package/lib/src/monty-sandbox.js +8 -8
  28. package/lib/src/observability.d.ts +6 -5
  29. package/lib/src/observability.js +8 -6
  30. package/lib/src/plugin.d.ts +1 -1
  31. package/lib/src/plugin.js +49 -51
  32. package/lib/src/remote-skills.d.ts +3 -4
  33. package/lib/src/remote-skills.js +46 -46
  34. package/lib/src/rest.d.ts +2 -2
  35. package/lib/src/rest.js +3 -3
  36. package/lib/src/server.js +17 -20
  37. package/lib/src/serving.js +10 -11
  38. package/lib/src/statement.js +7 -7
  39. package/lib/src/storage-schema.js +4 -4
  40. package/lib/src/summarize.js +5 -5
  41. package/lib/src/telemetry.d.ts +0 -6
  42. package/lib/src/telemetry.js +34 -41
  43. package/lib/src/validation.js +3 -4
  44. package/lib/src/workspaces.d.ts +2 -2
  45. package/lib/src/workspaces.js +34 -36
  46. package/lib/src/writer.d.ts +2 -2
  47. package/lib/src/writer.js +3 -3
  48. package/package.json +17 -305
  49. package/src/agents.ts +27 -21
  50. package/src/chart.ts +43 -37
  51. package/src/chat.ts +10 -12
  52. package/src/config.ts +14 -15
  53. package/src/evaluation.ts +6 -8
  54. package/src/feedback-mode.ts +1 -1
  55. package/src/filesystems.ts +5 -5
  56. package/src/follow-up-suggestions.ts +9 -9
  57. package/src/genie-chat.ts +32 -31
  58. package/src/genie.ts +29 -29
  59. package/src/identity.ts +3 -38
  60. package/src/memory.ts +24 -6
  61. package/src/mlflow.ts +21 -21
  62. package/src/model.ts +7 -7
  63. package/src/monty-sandbox.ts +7 -7
  64. package/src/observability.ts +8 -6
  65. package/src/plugin.ts +78 -65
  66. package/src/remote-skills.ts +63 -55
  67. package/src/rest.ts +4 -4
  68. package/src/server.ts +32 -20
  69. package/src/serving.ts +14 -11
  70. package/src/statement.ts +10 -6
  71. package/src/storage-schema.ts +3 -3
  72. package/src/summarize.ts +4 -4
  73. package/src/telemetry.ts +49 -55
  74. package/src/validation.ts +2 -3
  75. package/src/workspaces.ts +52 -42
  76. package/src/writer.ts +3 -3
package/lib/src/agents.js CHANGED
@@ -23,9 +23,9 @@ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExte
23
23
  return path;
24
24
  };
25
25
  import { ConfigurationError } from "@databricks/appkit";
26
- import { toolkitEntries } from "@dbx-tools/appkit";
27
- import { errorUtils, log, object, stringUtils } from "@dbx-tools/shared-core";
28
- import { TOOL_PROGRESS_PART_TYPE, ToolProgressEventSchema } from "@dbx-tools/shared-mastra/wire";
26
+ import { toolkitEntries, } from "@dbx-tools/appkit";
27
+ import { log, toError, sequence, toUniqueSlug, toIdentifier, } from "@dbx-tools/shared-core";
28
+ import { TOOL_PROGRESS_PART_TYPE, ToolProgressEventSchema } from "@dbx-tools/shared-mastra";
29
29
  import { Agent } from "@mastra/core/agent";
30
30
  import { createEventedAgent } from "@mastra/core/agent/durable";
31
31
  import { SkillSearchProcessor, ToolCallFilter } from "@mastra/core/processors";
@@ -83,8 +83,6 @@ function loadQuickJsDependency() {
83
83
  quickJsDependency ??= import(__rewriteRelativeImportExtension(/* @vite-ignore */ QUICKJS_PACKAGE));
84
84
  return quickJsDependency;
85
85
  }
86
- /** Re-export of Mastra's native `createTool` for full-feature access. */
87
- export { createTool } from "@mastra/core/tools";
88
86
  /**
89
87
  * AppKit-shaped tool factory. Lets users mix-and-match tools across
90
88
  * AppKit's `agents` plugin and `mastra` with a single import:
@@ -132,7 +130,7 @@ export function tool(opts) {
132
130
  * words don't collide in traces. Stable across runs.
133
131
  */
134
132
  function deriveToolId(description) {
135
- return stringUtils.toUniqueSlug(description, { fallbackPrefix: "tool" });
133
+ return toUniqueSlug(description, { fallbackPrefix: "tool" });
136
134
  }
137
135
  /**
138
136
  * Identity helper that brands a definition as a Mastra agent. Mirrors
@@ -352,7 +350,7 @@ async function tryCodeModeTransport(provider) {
352
350
  catch (caught) {
353
351
  return {
354
352
  category: "dependency-unavailable",
355
- error: errorUtils.toError(caught),
353
+ error: toError(caught),
356
354
  provider,
357
355
  };
358
356
  }
@@ -362,7 +360,7 @@ async function tryCodeModeTransport(provider) {
362
360
  catch (caught) {
363
361
  return {
364
362
  category: "construction-failed",
365
- error: errorUtils.toError(caught),
363
+ error: toError(caught),
366
364
  provider,
367
365
  };
368
366
  }
@@ -377,7 +375,7 @@ async function tryCodeModeTransport(provider) {
377
375
  catch (caught) {
378
376
  return {
379
377
  category: "dependency-unavailable",
380
- error: errorUtils.toError(caught),
378
+ error: toError(caught),
381
379
  provider,
382
380
  };
383
381
  }
@@ -387,7 +385,7 @@ async function tryCodeModeTransport(provider) {
387
385
  catch (caught) {
388
386
  return {
389
387
  category: "construction-failed",
390
- error: errorUtils.toError(caught),
388
+ error: toError(caught),
391
389
  provider,
392
390
  };
393
391
  }
@@ -634,7 +632,7 @@ function toolErrorLoggingProcessor(logger) {
634
632
  id: "tool-error-logger",
635
633
  async processOutputStream({ part }) {
636
634
  if (part.type === "tool-error") {
637
- const error = errorUtils.toError(part.payload.error);
635
+ const error = toError(part.payload.error);
638
636
  logger.error("tool execution failed", {
639
637
  toolName: part.payload.toolName,
640
638
  toolCallId: part.payload.toolCallId,
@@ -671,8 +669,7 @@ export function approvalGatedToolIds(tools) {
671
669
  if (!tools || typeof tools !== "object")
672
670
  return [];
673
671
  return [
674
- ...object
675
- .sequence(Object.entries(tools))
672
+ ...sequence(Object.entries(tools))
676
673
  .filter(([, tool]) => isApprovalGatedTool(tool))
677
674
  .map(([key, tool]) => resolveToolId(tool, key)),
678
675
  ];
@@ -777,7 +774,7 @@ function resolveDefinitions(config) {
777
774
  /** Derive a registry id from a definition's `name`, with a fallback. */
778
775
  function deriveAgentKey(def, index) {
779
776
  if (def.name) {
780
- const slug = stringUtils.toIdentifier(def.name);
777
+ const slug = toIdentifier(def.name);
781
778
  if (slug)
782
779
  return slug;
783
780
  }
@@ -995,4 +992,4 @@ function toolkitEntryToMastraTool(entry, plugin) {
995
992
  },
996
993
  });
997
994
  }
998
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FnZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7Ozs7Ozs7OztBQUVILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBUXhELE9BQU8sRUFBa0IsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBT2pHLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFL0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFdEUsT0FBTyxFQUFFLGtCQUFrQixFQUFvQixNQUFNLHFCQUFxQixDQUFDO0FBRTNFLE9BQU8sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHaEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBTWpELE9BQU8sRUFDTCxpQ0FBaUMsRUFDakMseUJBQXlCLEVBQ3pCLGdDQUFnQyxHQUNqQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMzRSxPQUFPLEVBQUUsc0JBQXNCLEVBQXNCLE1B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RUFBRSxDQUFDOzZCQUNuRCxDQUFDO2lDQUNELEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQzt3QkFDNUIsQ0FBQztxQkFDRjtvQkFDSCxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ1IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEFnZW50IHJlZ2lzdHJhdGlvbiBmb3IgdGhlIE1hc3RyYSBBcHBLaXQgcGx1Z2luLlxuICpcbiAqIE1pcnJvcnMgdGhlIHNoYXBlIG9mIHRoZSBBcHBLaXQgYGFnZW50c2AgcGx1Z2luIChgY29uZmlnLmFnZW50c2AgbWFwXG4gKiBvZiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9ufSwgZHVhbC1mb3JtIGB0b29sc2AgYWNjZXB0aW5nIGEgcGxhaW5cbiAqIHJlY29yZCBvciBhIGAocGx1Z2lucykgPT4gdG9vbHNgIGNhbGxiYWNrKS4gUmVzb2x2ZXMgZWFjaCBkZWZpbml0aW9uXG4gKiBpbnRvIGEgTWFzdHJhIGBBZ2VudGAgaW5zdGFuY2UgZHVyaW5nIHBsdWdpbiBzZXR1cDsgdXNlci1zdXBwbGllZFxuICogdG9vbCBjYWxsYmFja3MgYXJlIGludm9rZWQgZXhhY3RseSBvbmNlIHdpdGggYSB0eXBlZFxuICoge0BsaW5rIE1hc3RyYVBsdWdpbnN9IG1hcCBidWlsdCBmcm9tIHJlZ2lzdGVyZWQgc2libGluZyBwbHVnaW5zLlxuICpcbiAqIFdoZW4gbm8gYWdlbnRzIGFyZSByZWdpc3RlcmVkIHRoZSBwbHVnaW4gZmFsbHMgYmFjayB0byBhIHNpbmdsZVxuICogYnVpbHQtaW4gYW5hbHlzdCBzbyB0aGUgYmFyZSBgbWFzdHJhKClgIGNhbGwgc3RpbGwgbW91bnRzIGEgd29ya2luZ1xuICogc3RyZWFtYWJsZSBhZ2VudCBmb3IgZGVtb3MuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHtcbiAgQWdlbnRUb29sRGVmaW5pdGlvbixcbiAgUGx1Z2luVG9vbGtpdFByb3ZpZGVyLFxuICBUb29sa2l0RW50cnksXG4gIFRvb2xraXRPcHRpb25zIGFzIEFwcEtpdFRvb2xraXRPcHRpb25zLFxuICBUb29sUHJvdmlkZXIsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXQvYmV0YVwiO1xuaW1wb3J0IHsgcGx1Z2luUmVnaXN0cnksIHRvb2xraXRFbnRyaWVzIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgdHlwZSB7IEFnZW50VG9vbEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXQvdG9vbC1wcm92aWRlclwiO1xuaW1wb3J0IHsgZXJyb3JVdGlscywgbG9nLCBvYmplY3QsIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IFRPT0xfUFJPR1JFU1NfUEFSVF9UWVBFLCBUb29sUHJvZ3Jlc3NFdmVudFNjaGVtYSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmEvd2lyZVwiO1xuaW1wb3J0IHR5cGUge1xuICBBZ2VudENvbmZpZyxcbiAgQWdlbnRFeGVjdXRpb25PcHRpb25zLFxuICBBZ2VudEluc3RydWN0aW9ucyxcbiAgVG9vbHNJbnB1dCxcbn0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHsgQWdlbnQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL2FnZW50XCI7XG5pbXBvcnQgeyBjcmVhdGVFdmVudGVkQWdlbnQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL2FnZW50L2R1cmFibGVcIjtcbmltcG9ydCB7IFNraWxsU2VhcmNoUHJvY2Vzc29yLCBUb29sQ2FsbEZpbHRlciB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcHJvY2Vzc29yc1wiO1xuaW1wb3J0IHR5cGUgeyBPdXRwdXRQcm9jZXNzb3IgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3Byb2Nlc3NvcnNcIjtcbmltcG9ydCB7IE1BU1RSQV9SRVNPVVJDRV9JRF9LRVkgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgeyByZXNvbHZlQWdlbnRTa2lsbHMsIHR5cGUgSW5saW5lU2tpbGwgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3NraWxsc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2RlTW9kZVRyYW5zcG9ydCwgVG9vbCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvdG9vbHNcIjtcbmltcG9ydCB7IGNyZWF0ZUNvZGVNb2RlLCBjcmVhdGVUb29sIH0gZnJvbSBcIkBtYXN0cmEvY29yZS90b29sc1wiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2UgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3dvcmtzcGFjZVwiO1xuaW1wb3J0IHsgY3JlYXRlU2tpbGxUb29scywgY3JlYXRlV29ya3NwYWNlVG9vbHMgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3dvcmtzcGFjZVwiO1xuaW1wb3J0IHR5cGUgeyBQZ1ZlY3RvckNvbmZpZywgUG9zdGdyZXNTdG9yZUNvbmZpZyB9IGZyb20gXCJAbWFzdHJhL3BnXCI7XG5cbmltcG9ydCB7IGJ1aWxkUmVuZGVyRGF0YVRvb2wgfSBmcm9tIFwiLi9jaGFydC50c1wiO1xuaW1wb3J0IHR5cGUge1xuICBNYXN0cmFDb2RlTW9kZUNvbmZpZyxcbiAgTWFzdHJhQ29kZU1vZGVUcmFuc3BvcnQsXG4gIE1hc3RyYVBsdWdpbkNvbmZpZyxcbn0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQge1xuICBidWlsZEZvbGxvd1VwU3VnZ2VzdGlvbnNQcm9jZXNzb3IsXG4gIGJ1aWxkU3VnZ2VzdEZvbGxvd1Vwc1Rvb2wsXG4gIHJlc29sdmVGb2xsb3dVcFN1Z2dlc3Rpb25zQ29uZmlnLFxufSBmcm9tIFwiLi9mb2xsb3ctdXAtc3VnZ2VzdGlvbnMudHNcIjtcbmltcG9ydCB7IGJ1aWxkR2VuaWVUb29sa2l0UHJvdmlkZXIsIHJlc29sdmVHZW5pZVNwYWNlcyB9IGZyb20gXCIuL2dlbmllLnRzXCI7XG5pbXBvcnQgeyB3aXRoUmVxdWVzdE1lbW9yeVNjb3BlLCB0eXBlIE1lbW9yeUJ1aWxkZXIgfSBmcm9tIFwiLi9tZW1vcnkudHNcIjtcbmltcG9ydCB7IGJ1aWxkTW9kZWwsIFJFU1BPTlNFU19QUk9WSURFUl9PUFRJT05TIH0gZnJvbSBcIi4vbW9kZWwudHNcIjtcbmltcG9ydCB7IHN0cmlwU3RhbGVDaGFydHNQcm9jZXNzb3IgfSBmcm9tIFwiLi9wcm9jZXNzb3JzLnRzXCI7XG5pbXBvcnQgeyBNQVNUUkFfT1JJR0lOX0tFWSB9IGZyb20gXCIuL3JlcXVlc3QtY29udGV4dC50c1wiO1xuaW1wb3J0IHsgTUFTVFJBX1JFU09MVkVEX01PREVMX0tFWSB9IGZyb20gXCIuL3NlcnZpbmcudHNcIjtcbmltcG9ydCB7IFRZUE9HUkFQSFlfUlVMRSB9IGZyb20gXCIuL3N0eWxlLnRzXCI7XG5pbXBvcnQgeyBidWlsZFN1bW1hcml6ZVRvb2wgfSBmcm9tIFwiLi9zdW1tYXJpemUudHNcIjtcbmltcG9ydCB7XG4gIGJpbmREYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCxcbiAgZGF0YWJyaWNrc1dvcmtzcGFjZSxcbiAgdHlwZSBEYXRhYnJpY2tzV29ya3NwYWNlT3B0aW9ucyxcbn0gZnJvbSBcIi4vd29ya3NwYWNlcy50c1wiO1xuXG5jb25zdCBjb2RlTW9kZUxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvY29kZS1tb2RlXCIpO1xuY29uc3QgSVNPTEFURURfVk1fUEFDS0FHRSA9IFwiQG1hc3RyYS9pc29sYXRlZC12bVwiO1xuY29uc3QgUVVJQ0tKU19QQUNLQUdFID0gXCJAbWFzdHJhL3F1aWNranNcIjtcbmxldCBpc29sYXRlZFZtRGVwZW5kZW5jeTogUHJvbWlzZTx0eXBlb2YgaW1wb3J0KFwiQG1hc3RyYS9pc29sYXRlZC12bVwiKT4gfCB1bmRlZmluZWQ7XG5sZXQgcXVpY2tKc0RlcGVuZGVuY3k6IFByb21pc2U8dHlwZW9mIGltcG9ydChcIkBtYXN0cmEvcXVpY2tqc1wiKT4gfCB1bmRlZmluZWQ7XG5cbnR5cGUgTm9ybWFsaXplZENvZGVNb2RlQ29uZmlnID0gTWFzdHJhQ29kZU1vZGVDb25maWc7XG5cbmludGVyZmFjZSBSZXNvbHZlZENvZGVNb2RlQ29uZmlnIHtcbiAgcmVhZG9ubHkgaWQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRpbWVvdXQ/OiBudW1iZXI7XG4gIHJlYWRvbmx5IHByb3ZpZGVyOiBFeGNsdWRlPE1hc3RyYUNvZGVNb2RlVHJhbnNwb3J0LCBcImF1dG9cIj47XG4gIHJlYWRvbmx5IHRyYW5zcG9ydDogQ29kZU1vZGVUcmFuc3BvcnQ7XG59XG5cbnR5cGUgQ29kZU1vZGVGYWlsdXJlQ2F0ZWdvcnkgPVxuICBcInVuc3VwcG9ydGVkLXJ1bnRpbWVcIiB8IFwiZGVwZW5kZW5jeS11bmF2YWlsYWJsZVwiIHwgXCJjb25zdHJ1Y3Rpb24tZmFpbGVkXCI7XG5cbmludGVyZmFjZSBDb2RlTW9kZUZhaWx1cmUge1xuICByZWFkb25seSBjYXRlZ29yeTogQ29kZU1vZGVGYWlsdXJlQ2F0ZWdvcnk7XG4gIHJlYWRvbmx5IGVycm9yPzogRXJyb3I7XG4gIHJlYWRvbmx5IHByb3ZpZGVyOiBFeGNsdWRlPE1hc3RyYUNvZGVNb2RlVHJhbnNwb3J0LCBcImF1dG9cIj47XG59XG5cbi8qKiBSZXR1cm4gd2hldGhlciB0aGlzIGJvb3QgZW52aXJvbm1lbnQgbWF0Y2hlcyBpc29sYXRlZC12bSdzIHN1cHBvcnRlZCBhcHAgc2hhcGUuICovXG5mdW5jdGlvbiBzdXBwb3J0c0lzb2xhdGVkVm1UcmFuc3BvcnQoKTogYm9vbGVhbiB7XG4gIGlmIChwcm9jZXNzLnZlcnNpb25zLmJ1biB8fCBwcm9jZXNzLnJlbGVhc2UubmFtZSAhPT0gXCJub2RlXCIgfHwgcHJvY2Vzcy5wbGF0Zm9ybSAhPT0gXCJsaW51eFwiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IG5vZGVNYWpvciA9IE51bWJlci5wYXJzZUludChwcm9jZXNzLnZlcnNpb25zLm5vZGUuc3BsaXQoXCIuXCIpWzBdID8/IFwiXCIsIDEwKTtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobm9kZU1ham9yKSB8fCBub2RlTWFqb3IgPCAyMCB8fCBub2RlTWFqb3IgPj0gMjUpIHJldHVybiBmYWxzZTtcbiAgY29uc3Qgbm9kZU9wdGlvbnMgPSBwcm9jZXNzLmVudi5OT0RFX09QVElPTlM/LnNwbGl0KC9cXHMrLykgPz8gW107XG4gIHJldHVybiBbLi4ucHJvY2Vzcy5leGVjQXJndiwgLi4ubm9kZU9wdGlvbnNdLmluY2x1ZGVzKFwiLS1uby1ub2RlLXNuYXBzaG90XCIpO1xufVxuXG4vKiogUmV0dXJuIHdoZXRoZXIgdGhlIGN1cnJlbnQgcnVudGltZSBzYXRpc2ZpZXMgUXVpY2tKUycgcHVibGlzaGVkIGVuZ2luZSBmbG9vci4gKi9cbmZ1bmN0aW9uIHN1cHBvcnRzUXVpY2tKc1RyYW5zcG9ydCgpOiBib29sZWFuIHtcbiAgaWYgKHByb2Nlc3MudmVyc2lvbnMuYnVuKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHByb2Nlc3MucmVsZWFzZS5uYW1lICE9PSBcIm5vZGVcIikgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBbbWFqb3JUZXh0LCBtaW5vclRleHRdID0gcHJvY2Vzcy52ZXJzaW9ucy5ub2RlLnNwbGl0KFwiLlwiKTtcbiAgY29uc3QgbWFqb3IgPSBOdW1iZXIucGFyc2VJbnQobWFqb3JUZXh0ID8/IFwiXCIsIDEwKTtcbiAgY29uc3QgbWlub3IgPSBOdW1iZXIucGFyc2VJbnQobWlub3JUZXh0ID8/IFwiXCIsIDEwKTtcbiAgcmV0dXJuIChcbiAgICBOdW1iZXIuaXNGaW5pdGUobWFqb3IpICYmXG4gICAgTnVtYmVyLmlzRmluaXRlKG1pbm9yKSAmJlxuICAgIChtYWpvciA+IDIwIHx8IChtYWpvciA9PT0gMjAgJiYgbWlub3IgPj0gMTkpKVxuICApO1xufVxuXG4vKiogSW1wb3J0IHRoZSBvcHRpb25hbCBuYXRpdmUgdHJhbnNwb3J0IGF0IG1vc3Qgb25jZSBmb3IgdGhpcyBwcm9jZXNzLiAqL1xuZnVuY3Rpb24gbG9hZElzb2xhdGVkVm1EZXBlbmRlbmN5KCk6IFByb21pc2U8dHlwZW9mIGltcG9ydChcIkBtYXN0cmEvaXNvbGF0ZWQtdm1cIik+IHtcbiAgaXNvbGF0ZWRWbURlcGVuZGVuY3kgPz89IGltcG9ydCgvKiBAdml0ZS1pZ25vcmUgKi8gSVNPTEFURURfVk1fUEFDS0FHRSkgYXMgUHJvbWlzZTxcbiAgICB0eXBlb2YgaW1wb3J0KFwiQG1hc3RyYS9pc29sYXRlZC12bVwiKVxuICA+O1xuICByZXR1cm4gaXNvbGF0ZWRWbURlcGVuZGVuY3k7XG59XG5cbi8qKiBJbXBvcnQgdGhlIG9wdGlvbmFsIHBvcnRhYmxlIHRyYW5zcG9ydCBhdCBtb3N0IG9uY2UgZm9yIHRoaXMgcHJvY2Vzcy4gKi9cbmZ1bmN0aW9uIGxvYWRRdWlja0pzRGVwZW5kZW5jeSgpOiBQcm9taXNlPHR5cGVvZiBpbXBvcnQoXCJAbWFzdHJhL3F1aWNranNcIik+IHtcbiAgcXVpY2tKc0RlcGVuZGVuY3kgPz89IGltcG9ydCgvKiBAdml0ZS1pZ25vcmUgKi8gUVVJQ0tKU19QQUNLQUdFKSBhcyBQcm9taXNlPFxuICAgIHR5cGVvZiBpbXBvcnQoXCJAbWFzdHJhL3F1aWNranNcIilcbiAgPjtcbiAgcmV0dXJuIHF1aWNrSnNEZXBlbmRlbmN5O1xufVxuXG4vKipcbiAqIFRvb2wgcmVjb3JkIGFjY2VwdGVkIGJ5IGV2ZXJ5IE1hc3RyYSBgQWdlbnQudG9vbHNgIGZpZWxkIGFuZCBieSB0aGVcbiAqIGB0b29scyhwbHVnaW5zKWAgY2FsbGJhY2sgb24ge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbn0uXG4gKlxuICogQWxpYXMgb2YgTWFzdHJhJ3MgYFRvb2xzSW5wdXRgLCBzbyBpdCBhbHJlYWR5IGFjY2VwdHM6XG4gKlxuICogLSBNYXN0cmEgdG9vbHMgYnVpbHQgd2l0aCB7QGxpbmsgY3JlYXRlVG9vbH0gKG9yIGBuZXcgVG9vbCguLi4pYClcbiAqIC0gTWFzdHJhIHRvb2xzIGJ1aWx0IHdpdGggdGhlIEFwcEtpdC1zaGFwZWQge0BsaW5rIHRvb2x9IHdyYXBwZXJcbiAqICAgYmVsb3dcbiAqIC0gVmVyY2VsIEFJIFNESyB0b29scyAoYHRvb2woeyAuLi4gfSlgIGZyb20gYGFpYClcbiAqIC0gUHJvdmlkZXItZGVmaW5lZCB0b29scyAoZS5nLiBgb3BlbmFpLnRvb2xzLndlYlNlYXJjaCguLi4pYClcbiAqXG4gKiBFeGlzdGluZyB0b29sIGxpYnJhcmllcyBkcm9wIGluIGFzLWlzIC0gbm90aGluZyBpbiB0aGlzIHBhY2thZ2VcbiAqIGZvcmNlcyBhIHJlYnVpbGQuXG4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYVRvb2xzID0gVG9vbHNJbnB1dDtcblxuLyoqIFJlLWV4cG9ydCBvZiBNYXN0cmEncyBuYXRpdmUgYGNyZWF0ZVRvb2xgIGZvciBmdWxsLWZlYXR1cmUgYWNjZXNzLiAqL1xuZXhwb3J0IHsgY3JlYXRlVG9vbCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvdG9vbHNcIjtcblxuLyoqXG4gKiBBcHBLaXQtc2hhcGVkIHRvb2wgZmFjdG9yeS4gTGV0cyB1c2VycyBtaXgtYW5kLW1hdGNoIHRvb2xzIGFjcm9zc1xuICogQXBwS2l0J3MgYGFnZW50c2AgcGx1Z2luIGFuZCBgbWFzdHJhYCB3aXRoIGEgc2luZ2xlIGltcG9ydDpcbiAqXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgdG9vbCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbiAqIGltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG4gKlxuICogZ2V0X3dlYXRoZXI6IHRvb2woe1xuICogICBkZXNjcmlwdGlvbjogXCJXZWF0aGVyXCIsXG4gKiAgIHNjaGVtYTogei5vYmplY3QoeyBjaXR5OiB6LnN0cmluZygpIH0pLFxuICogICBleGVjdXRlOiBhc3luYyAoeyBjaXR5IH0pID0+IGBTdW5ueSBpbiAke2NpdHl9YCxcbiAqIH0pLFxuICogYGBgXG4gKlxuICogTWFwcyBvbnRvIE1hc3RyYSdzIGBjcmVhdGVUb29sYDpcbiAqXG4gKiAtIGBkZXNjcmlwdGlvbmAgLT4gYGRlc2NyaXB0aW9uYCAocmVxdWlyZWQpXG4gKiAtIGBzY2hlbWFgIC0+IGBpbnB1dFNjaGVtYWAgKG9wdGlvbmFsKVxuICogLSBgZXhlY3V0ZShpbnB1dClgIC0+IGBleGVjdXRlKGlucHV0LCBjdHgpYCAtIE1hc3RyYSBhbHJlYWR5IGNhbGxzXG4gKiAgIHRoZSBmaXJzdCBhcmcgd2l0aCB0aGUgcGFyc2VkIGlucHV0cywgc28gdGhlIGJvZHkgc2hhcGUgaXNcbiAqICAgaWRlbnRpY2FsLiBUaGUgTWFzdHJhIGBjb250ZXh0YCBhcmcgaXMgZm9yd2FyZGVkIGFzIHRoZSBzZWNvbmRcbiAqICAgcGFyYW1ldGVyIHdoZW4gdGhlIGNhbGxlciBkZWNsYXJlcyBpdC5cbiAqIC0gYGlkYDogb3B0aW9uYWwuIERlZmF1bHRzIHRvIGEgc3RhYmxlIGlkZW50aWZpZXIgZGVyaXZlZCBmcm9tXG4gKiAgIGBkZXNjcmlwdGlvbmAgKHNsdWdpZmllZCwgd2l0aCBhIHNob3J0IGhhc2ggc3VmZml4IGZvclxuICogICB1bmlxdWVuZXNzKS4gUGFzcyBhbiBleHBsaWNpdCBgaWRgIHdoZW4geW91IG5lZWQgYSBzdGFibGUgc3RyaW5nXG4gKiAgIGZvciB0cmFjaW5nIG9yIE1DUCBleHBvc3VyZS5cbiAqXG4gKiBSZWFjaCBmb3Ige0BsaW5rIGNyZWF0ZVRvb2x9IHdoZW4geW91IG5lZWQgTWFzdHJhLW9ubHkgZmllbGRzXG4gKiAoYG91dHB1dFNjaGVtYWAsIGBzdXNwZW5kU2NoZW1hYCwgYHJlcXVpcmVBcHByb3ZhbGAsIGBtY3BgLCBldGMuKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvb2wob3B0czogQXBwS2l0VG9vbE9wdGlvbnMpOiBUb29sIHtcbiAgY29uc3QgaWQgPSBvcHRzLmlkID8/IGRlcml2ZVRvb2xJZChvcHRzLmRlc2NyaXB0aW9uKTtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkLFxuICAgIGRlc2NyaXB0aW9uOiBvcHRzLmRlc2NyaXB0aW9uLFxuICAgIC4uLihvcHRzLnNjaGVtYSA/IHsgaW5wdXRTY2hlbWE6IG9wdHMuc2NoZW1hIGFzIG5ldmVyIH0gOiB7fSksXG4gICAgZXhlY3V0ZTogb3B0cy5leGVjdXRlIGFzIG5ldmVyLFxuICB9KTtcbn1cblxuLyoqXG4gKiBJbnB1dCBzaGFwZSBmb3IgdGhlIEFwcEtpdC1zdHlsZSB7QGxpbmsgdG9vbH0gZmFjdG9yeS4gQSB0cmltbWVkXG4gKiBzdWJzZXQgb2YgTWFzdHJhJ3MgYGNyZWF0ZVRvb2xgIG9wdGlvbnMgdGhhdCBtaXJyb3JzIHRoZVxuICogYEBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhYCBgdG9vbCh7IGRlc2NyaXB0aW9uLCBzY2hlbWEsIGV4ZWN1dGUgfSlgXG4gKiBzaWduYXR1cmUuXG4gKlxuICogR2VuZXJpY3MgYXJlIGludGVudGlvbmFsbHkgYWJzZW50IC0gaW5mZXJlbmNlIGZsb3dzIHRocm91Z2ggdGhlXG4gKiBjYWxsZXIncyBgc2NoZW1hYCAodHlwaWNhbGx5IGEgWm9kIG9iamVjdCksIGFuZCB0aGUgYGV4ZWN1dGVgIGJvZHlcbiAqIGRlc3RydWN0dXJlcyBuYXR1cmFsbHkgZnJvbSB0aGF0LiBSZWFjaCBmb3Ige0BsaW5rIGNyZWF0ZVRvb2x9IHdoZW5cbiAqIHlvdSBuZWVkIHRoZSBmdWxseS10eXBlZCBpbnB1dC9vdXRwdXQgc2NoZW1hcyB3aXJlZCBleHBsaWNpdGx5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcEtpdFRvb2xPcHRpb25zIHtcbiAgLyoqIE9wdGlvbmFsIHN0YWJsZSBpZGVudGlmaWVyOyBhdXRvLWRlcml2ZWQgZnJvbSBgZGVzY3JpcHRpb25gIHdoZW4gb21pdHRlZC4gKi9cbiAgaWQ/OiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBzaG93biB0byB0aGUgbW9kZWwuIFJlcXVpcmVkLiAqL1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKipcbiAgICogT3B0aW9uYWwgaW5wdXQgc2NoZW1hIChhbnkgU3RhbmRhcmQgU2NoZW1hIGluc3RhbmNlLCBlLmcuIFpvZCkuXG4gICAqIE1hcHMgdG8gTWFzdHJhJ3MgYGlucHV0U2NoZW1hYDsgcGFzc2VkIHRocm91Z2ggdG8gdGhlIG1vZGVsXG4gICAqIHZlcmJhdGltLlxuICAgKi9cbiAgc2NoZW1hPzogdW5rbm93bjtcbiAgLyoqXG4gICAqIEV4ZWN1dGUgYm9keS4gRmlyc3QgYXJnIGlzIHRoZSBwYXJzZWQgaW5wdXQgKHR5cGVkIG9mZiBgc2NoZW1hYFxuICAgKiB3aGVuIHN1cHBsaWVkKSwgc2Vjb25kIGFyZyBpcyB0aGUgZnVsbCBNYXN0cmEgZXhlY3V0aW9uIGNvbnRleHRcbiAgICogKHJlcXVlc3QgY29udGV4dCwgYWJvcnQgc2lnbmFsLCBtYXN0cmEgaW5zdGFuY2UpIGlmIHlvdSBuZWVkIGl0LlxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgZXhlY3V0ZTogKGlucHV0OiBhbnksIGNvbnRleHQ/OiB1bmtub3duKSA9PiB1bmtub3duO1xufVxuXG4vKipcbiAqIEJ1aWxkIGEgZGV0ZXJtaW5pc3RpYyBNYXN0cmEgdG9vbCBpZCBmcm9tIGEgZGVzY3JpcHRpb24uXG4gKiBEZWxlZ2F0ZXMgdG8ge0BsaW5rIHN0cmluZy50b1VuaXF1ZVNsdWd9OiBzbHVnICsgYWx3YXlzLW9uXG4gKiA2LWNoYXIgRk5WLTFhIGJhc2UtMzIgc3VmZml4IHNvIHR3byB0b29scyB3aXRoIHRoZSBzYW1lIGxlYWRpbmdcbiAqIHdvcmRzIGRvbid0IGNvbGxpZGUgaW4gdHJhY2VzLiBTdGFibGUgYWNyb3NzIHJ1bnMuXG4gKi9cbmZ1bmN0aW9uIGRlcml2ZVRvb2xJZChkZXNjcmlwdGlvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHN0cmluZ1V0aWxzLnRvVW5pcXVlU2x1ZyhkZXNjcmlwdGlvbiwgeyBmYWxsYmFja1ByZWZpeDogXCJ0b29sXCIgfSk7XG59XG5cbi8qKlxuICogSWRlbnRpdHkgaGVscGVyIHRoYXQgYnJhbmRzIGEgZGVmaW5pdGlvbiBhcyBhIE1hc3RyYSBhZ2VudC4gTWlycm9yc1xuICogQXBwS2l0J3MgYGNyZWF0ZUFnZW50KGRlZilgIHNvIHRoZSByZWdpc3RyYXRpb24gc2hhcGUgbWF0Y2hlczpcbiAqXG4gKiBgYGB0c1xuICogY29uc3Qgc3VwcG9ydCA9IGNyZWF0ZUFnZW50KHtcbiAqICAgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiLFxuICogICBtb2RlbDogXCJkYXRhYnJpY2tzLWNsYXVkZS1zb25uZXQtNC02XCIsXG4gKiAgIHRvb2xzKHBsdWdpbnMpIHsgcmV0dXJuIHsgLi4uIH07IH0sXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEFkZHMgdGhlIHBhY2thZ2UncyBkZWZhdWx0IHdvcmtzcGFjZSB3aGVuIHRoZSBkZWZpbml0aW9uIG9taXRzIG9uZS4gVGhhdFxuICogd29ya3NwYWNlIGNhcnJpZXMgRGF0YWJyaWNrcyBza2lsbCBtb3VudHMgd2hpbGUgY29tbWFuZCBleGVjdXRpb24gc3RheXNcbiAqIGRpc2FibGVkIHVudGlsIGEgc2FuZGJveCBpcyBzZWxlY3RlZCBleHBsaWNpdGx5LiBBbiBleHBsaWNpdCB3b3Jrc3BhY2VcbiAqIHJlbWFpbnMgdGhlIGNhbGxlcidzIGNvbXBsZXRlIG92ZXJyaWRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQWdlbnQ8XG4gIFRSZXF1ZXN0Q29udGV4dCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5rbm93biA9IHVua25vd24sXG4gIFREZWZpbml0aW9uIGV4dGVuZHMgTWFzdHJhQWdlbnREZWZpbml0aW9uPFRSZXF1ZXN0Q29udGV4dD4gPVxuICAgIE1hc3RyYUFnZW50RGVmaW5pdGlvbjxUUmVxdWVzdENvbnRleHQ+LFxuPihkZWY6IFREZWZpbml0aW9uKTogVERlZmluaXRpb24ge1xuICBpZiAoZGVmLndvcmtzcGFjZSkgcmV0dXJuIHsgLi4uZGVmIH07XG4gIGNvbnN0IHdvcmtzcGFjZSA9IGRhdGFicmlja3NXb3Jrc3BhY2UoKTtcbiAgbWFya0RlZmF1bHRXb3Jrc3BhY2Uod29ya3NwYWNlKTtcbiAgcmV0dXJuIHsgLi4uZGVmLCB3b3Jrc3BhY2UgfTtcbn1cblxuLyoqXG4gKiBCcmFuZCBmb3IgYSB7QGxpbmsgV29ya3NwYWNlfSB0aGF0IGBjcmVhdGVBZ2VudGAgYnVpbHQgd2l0aCBubyBjYWxsZXJcbiAqIG9wdGlvbnMsIHNvIHtAbGluayBidWlsZEFnZW50c30gbWF5IHJlYnVpbGQgaXQgd2l0aCBzdGFydHVwLXByb3Zpc2lvbmVkXG4gKiBgZXh0cmFTa2lsbE1vdW50c2AgKGEgY2FsbGVyLXN1cHBsaWVkIHdvcmtzcGFjZSBpcyBuZXZlciB0b3VjaGVkKS5cbiAqL1xuY29uc3QgZGVmYXVsdFdvcmtzcGFjZXMgPSBuZXcgV2Vha1NldDxXb3Jrc3BhY2U+KCk7XG5cbi8qKiBCcmFuZCBgd29ya3NwYWNlYCBhcyB0aGUgYXV0by1jcmVhdGVkIGRlZmF1bHQuICovXG5mdW5jdGlvbiBtYXJrRGVmYXVsdFdvcmtzcGFjZSh3b3Jrc3BhY2U6IFdvcmtzcGFjZSk6IHZvaWQge1xuICBkZWZhdWx0V29ya3NwYWNlcy5hZGQod29ya3NwYWNlKTtcbn1cblxuLyoqIFdoZXRoZXIgYHdvcmtzcGFjZWAgd2FzIGF1dG8tY3JlYXRlZCBieSB7QGxpbmsgY3JlYXRlQWdlbnR9LiAqL1xuZnVuY3Rpb24gaXNEZWZhdWx0V29ya3NwYWNlKHdvcmtzcGFjZTogV29ya3NwYWNlIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiB3b3Jrc3BhY2UgIT09IHVuZGVmaW5lZCAmJiBkZWZhdWx0V29ya3NwYWNlcy5oYXMod29ya3NwYWNlKTtcbn1cblxuLyoqXG4gKiBGaWx0ZXIgLyByZW5hbWUgb3B0aW9ucyBhY2NlcHRlZCBieSBldmVyeSBwbHVnaW4ncyBgLnRvb2xraXQoKWBcbiAqIG1ldGhvZCwgZGlyZWN0bHkgc291cmNlZCBmcm9tIEFwcEtpdCdzIHB1YmxpYyBiZXRhIGNvbnRyYWN0LlxuICovXG5leHBvcnQgdHlwZSBUb29sa2l0T3B0aW9ucyA9IEFwcEtpdFRvb2xraXRPcHRpb25zO1xuXG4vKipcbiAqIFRvb2xraXQgcHJvdmlkZXIgc2hhcGUgZXZlcnkgZW50cnkgaW4gdGhlIHtAbGluayBNYXN0cmFQbHVnaW5zfSBtYXBcbiAqIGV4cG9zZXMuIElkZW50aWNhbCB0byBBcHBLaXQncyBgUGx1Z2luVG9vbGtpdFByb3ZpZGVyYCAtIGFueSBBcHBLaXRcbiAqIHBsdWdpbiB0aGF0IGltcGxlbWVudHMgdGhlIHN0YW5kYXJkIGBUb29sUHJvdmlkZXJgIGludGVyZmFjZVxuICogKGBnZXRBZ2VudFRvb2xzYCArIGBleGVjdXRlQWdlbnRUb29sYCArIGB0b29sa2l0YCkgaXMgcmVhY2hhYmxlXG4gKiB0aHJvdWdoIHRoaXMgc3VyZmFjZSBhdXRvbWF0aWNhbGx5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlciB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgTWFzdHJhLXNoYXBlZCB0b29scyByZWNvcmQgYWRhcHRlZCBmcm9tIHRoZSBwbHVnaW4nc1xuICAgKiBhZ2VudCB0b29scy4gRWFjaCB0b29sIGRpc3BhdGNoZXMgYmFjayB0aHJvdWdoIHRoZSBwbHVnaW4nc1xuICAgKiBgZXhlY3V0ZUFnZW50VG9vbGAgc28gT0JPIGF1dGggYW5kIHRlbGVtZXRyeSBzcGFucyBzdGF5IGludGFjdC5cbiAgICovXG4gIHRvb2xraXQob3B0cz86IFRvb2xraXRPcHRpb25zKTogTWFzdHJhVG9vbHMgfCBQcm9taXNlPE1hc3RyYVRvb2xzPjtcbn1cblxuLyoqXG4gKiBQbHVnaW4gbWFwIGhhbmRlZCB0byB0aGUgZnVuY3Rpb24gZm9ybSBvZlxuICoge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbi50b29sc30uIE1pcnJvcnMgQXBwS2l0J3MgYFBsdWdpbnNgXG4gKiB0eXBlIGV4YWN0bHk6IGEgc3RyaW5nLWtleWVkIHJlY29yZCB3aGVyZSBldmVyeSB2YWx1ZSBleHBvc2VzXG4gKiBgLnRvb2xraXQob3B0cylgLlxuICpcbiAqIEltcGxlbWVudGVkIGFzIGEgcnVudGltZSBQcm94eSB0aGF0IGF1dG8tZGlzY292ZXJzIGFueSByZWdpc3RlcmVkXG4gKiBBcHBLaXQgcGx1Z2luIGltcGxlbWVudGluZyB0aGUgc3RhbmRhcmQgYFRvb2xQcm92aWRlcmAgaW50ZXJmYWNlXG4gKiAoYGFuYWx5dGljc2AsIGBmaWxlc2AsIGBsYWtlYmFzZWAsIGBnZW5pZWAsIHBsdXMgYW55IHRoaXJkLXBhcnR5XG4gKiBwbHVnaW4gdGhhdCBkb2VzIHRoZSBzYW1lKS4gVW5rbm93biBuYW1lcyByZXNvbHZlIHRvIGB1bmRlZmluZWRgXG4gKiBhdCBydW50aW1lLCBzbyBndWFyZCB3aXRoIGA/LmAgYW5kIGA/PyB7fWAgd2hlbiBzcHJlYWRpbmcgZnJvbSBhXG4gKiBwbHVnaW4gdGhhdCBtYXkgbm90IGJlIHJlZ2lzdGVyZWQgaW4gZXZlcnkgZW52aXJvbm1lbnQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjcmVhdGVBZ2VudCh7XG4gKiAgIGluc3RydWN0aW9uczogXCIuLi5cIixcbiAqICAgYXN5bmMgdG9vbHMocGx1Z2lucykge1xuICogICAgIHJldHVybiB7XG4gKiAgICAgICAuLi4oYXdhaXQgcGx1Z2lucy5hbmFseXRpY3MudG9vbGtpdCgpKSxcbiAqICAgICAgIC4uLihhd2FpdCBwbHVnaW5zLmZpbGVzLnRvb2xraXQoeyBvbmx5OiBbXCJ1cGxvYWRzLnJlYWRcIl0gfSkpLFxuICogICAgICAgZ2V0X3dlYXRoZXI6IHRvb2woe1xuICogICAgICAgICBkZXNjcmlwdGlvbjogXCJXZWF0aGVyXCIsXG4gKiAgICAgICAgIHNjaGVtYTogei5vYmplY3QoeyBjaXR5OiB6LnN0cmluZygpIH0pLFxuICogICAgICAgICBleGVjdXRlOiBhc3luYyAoeyBjaXR5IH0pID0+IGBTdW5ueSBpbiAke2NpdHl9YCxcbiAqICAgICAgIH0pLFxuICogICAgIH07XG4gKiAgIH0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSBNYXN0cmFQbHVnaW5zID0gUmVjb3JkPHN0cmluZywgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyPjtcblxuLyoqIEZ1bmN0aW9uIGZvcm0gb2Yge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbi50b29sc30uICovXG5leHBvcnQgdHlwZSBNYXN0cmFUb29sc0ZuID0gKHBsdWdpbnM6IE1hc3RyYVBsdWdpbnMpID0+IE1hc3RyYVRvb2xzIHwgUHJvbWlzZTxNYXN0cmFUb29scz47XG5cbi8qKiBGdW5jdGlvbiBmb3JtIG9mIHtAbGluayBNYXN0cmFBZ2VudERlZmluaXRpb24ud29ya3NwYWNlfTsgYHVuZGVmaW5lZGAgZGlzYWJsZXMgaXQgZm9yIHRoaXMgYWdlbnQuICovXG5leHBvcnQgdHlwZSBNYXN0cmFBZ2VudFdvcmtzcGFjZVJlc29sdmVyID0gKCkgPT4gV29ya3NwYWNlIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEEgY29kZS1kZWZpbmVkIE1hc3RyYSBhZ2VudC4gTWlycm9ycyB0aGUgc2hhcGUgQXBwS2l0J3MgYGFnZW50c2BcbiAqIHBsdWdpbiB1c2VzIGZvciBgQWdlbnREZWZpbml0aW9uYC4gVGhlIHJlZ2lzdHJ5IGtleSB1bmRlclxuICogYGNvbmZpZy5hZ2VudHNgIGlzIHRoZSBgYWdlbnRJZGAgdGhlIGNsaWVudCBzdHJlYW1zIGFnYWluc3Q7IGBuYW1lYFxuICogaXMgcHVyZWx5IGluZm9ybWF0aW9uYWwgKGRlZmF1bHRzIHRvIHRoZSBrZXkpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hc3RyYUFnZW50RGVmaW5pdGlvbjxcbiAgVFJlcXVlc3RDb250ZXh0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmtub3duID0gdW5rbm93bixcbj4ge1xuICAvKiogRGlzcGxheSBuYW1lIHVzZWQgYXMgYEFnZW50Lm5hbWVgLiBEZWZhdWx0cyB0byB0aGUgcmVnaXN0cnkga2V5LiAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgbG9uZy1mb3JtIGRlc2NyaXB0aW9uOyBzdXJmYWNlZCBhcyBgQWdlbnQuZGVzY3JpcHRpb25gLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFN0YXRpYyBvciByZXF1ZXN0LWNvbnRleHQtYXdhcmUgc3lzdGVtIGluc3RydWN0aW9ucy4gKi9cbiAgaW5zdHJ1Y3Rpb25zOiBBZ2VudENvbmZpZzxzdHJpbmcsIFRvb2xzSW5wdXQsIHVuZGVmaW5lZCwgVFJlcXVlc3RDb250ZXh0PltcImluc3RydWN0aW9uc1wiXTtcbiAgLyoqIE5hdGl2ZSBNYXN0cmEgc2NoZW1hIHRoYXQgdmFsaWRhdGVzIGFuZCB0eXBlcyBhcHBsaWNhdGlvbiByZXF1ZXN0IGNvbnRleHQuICovXG4gIHJlcXVlc3RDb250ZXh0U2NoZW1hPzogQWdlbnRDb25maWc8XG4gICAgc3RyaW5nLFxuICAgIFRvb2xzSW5wdXQsXG4gICAgdW5kZWZpbmVkLFxuICAgIFRSZXF1ZXN0Q29udGV4dFxuICA+W1wicmVxdWVzdENvbnRleHRTY2hlbWFcIl07XG4gIC8qKlxuICAgKiBNYXN0cmEtbmF0aXZlIHBlci1jYWxsIGFwcHJvdmFsIGdhdGUgZm9yIHRoaXMgYWdlbnQncyB0b29scy4gU3VwcG9ydHMgYW5cbiAgICogYXN5bmMgQ2xhc3NpZmllci1iYWNrZWQgZnVuY3Rpb247IHRvb2wtbGV2ZWwgYXBwcm92YWwgcmVtYWlucyBhdXRob3JpdGF0aXZlLlxuICAgKi9cbiAgcmVxdWlyZVRvb2xBcHByb3ZhbD86IEFnZW50RXhlY3V0aW9uT3B0aW9uc1tcInJlcXVpcmVUb29sQXBwcm92YWxcIl07XG4gIC8qKlxuICAgKiBQZXItYWdlbnQgbW9kZWwgb3ZlcnJpZGUuXG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBmYWxscyBiYWNrIHRvIHRoZSB3b3Jrc3BhY2VcbiAgICogICBgL3NlcnZpbmctZW5kcG9pbnRzYCByZXNvbHZlciB0aGF0IHtAbGluayBidWlsZE1vZGVsfSBjb25maWd1cmVzXG4gICAqICAgZnJvbSB0aGUgcGVyLXJlcXVlc3QgYFdvcmtzcGFjZUNsaWVudGAuXG4gICAqIC0gYHN0cmluZ2A6IHNob3J0aGFuZCBmb3IgXCJ1c2UgdGhlIGRlZmF1bHQgcmVzb2x2ZXIgYnV0IHN3YXAgdGhlXG4gICAqICAgYG1vZGVsSWRgXCIgKGUuZy4gYFwiZGF0YWJyaWNrcy1tZXRhLWxsYW1hLTMtMy03MGItaW5zdHJ1Y3RcImApLlxuICAgKiAtIEFueSBvdGhlciBNYXN0cmEgYER5bmFtaWNBcmd1bWVudDxNYXN0cmFNb2RlbENvbmZpZz5gOiBwYXNzZWRcbiAgICogICBzdHJhaWdodCB0aHJvdWdoIHRvIGBBZ2VudC5tb2RlbGAuIFVzZSB0aGlzIHdoZW4geW91IG5lZWQgZnVsbFxuICAgKiAgIGNvbnRyb2wgb3ZlciBhdXRoIG9yIHByb3ZpZGVySWQuXG4gICAqL1xuICBtb2RlbD86IEFnZW50Q29uZmlnPHN0cmluZywgVG9vbHNJbnB1dCwgdW5kZWZpbmVkLCBUUmVxdWVzdENvbnRleHQ+W1wibW9kZWxcIl0gfCBzdHJpbmc7XG4gIC8qKlxuICAgKiBQZXItYWdlbnQgdG9vbCByZWNvcmQuIEVpdGhlciBhIHBsYWluIG1hcCBvciBhIGNhbGxiYWNrIHRoYXRcbiAgICogcmVjZWl2ZXMgdGhlIHR5cGVkIHtAbGluayBNYXN0cmFQbHVnaW5zfSBzaWJsaW5nLXBsdWdpbiBpbmRleCBhbmRcbiAgICogcmV0dXJucyBhIG1hcC4gVGhlIGNhbGxiYWNrIHJ1bnMgZXhhY3RseSBvbmNlIGF0IGFnZW50IHNldHVwOyB0aGVcbiAgICogcmVzdWx0IGlzIGNhY2hlZCBmb3IgdGhlIGFnZW50J3MgbGlmZXRpbWUuXG4gICAqL1xuICB0b29scz86IE1hc3RyYVRvb2xzIHwgTWFzdHJhVG9vbHNGbjtcbiAgLyoqXG4gICAqIFBlci1hZ2VudCBzZW1hbnRpYyByZWNhbGwgKFBnVmVjdG9yKSBvdmVycmlkZS4gQ2FzY2FkZXMgZnJvbVxuICAgKiBgY29uZmlnLm1lbW9yeWA7IHRoZSBhZ2VudCB2YWx1ZSB3aW5zIHdoZW4gc2V0LlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogaW5oZXJpdCBgY29uZmlnLm1lbW9yeWAuIFdoZW4gdGhhdCdzXG4gICAqICAgZW5hYmxlZCwgdGhlIGFnZW50ICoqc2hhcmVzIHRoZSBwbHVnaW4tbGV2ZWwgc2luZ2xldG9uIGBQZ1ZlY3RvcmBcbiAgICogICBpbnN0YW5jZSoqIChjcm9zcy1hZ2VudCBzZW1hbnRpYyByZWNhbGwgYWNyb3NzIHRoZSBzYW1lIGluZGV4KS5cbiAgICogLSBgZmFsc2VgOiBkaXNhYmxlIHNlbWFudGljIHJlY2FsbCBmb3IgdGhpcyBhZ2VudCBvbmx5LlxuICAgKiAtIGB0cnVlYDogZW5hYmxlIHVzaW5nIHRoZSBzaGFyZWQgc2luZ2xldG9uIChzYW1lIGFzIGRlZmF1bHQgd2hlblxuICAgKiAgIHBsdWdpbiBtZW1vcnkgaXMgZW5hYmxlZDsgdXNlZnVsIHRvIG9wdCBpbiB3aGVuIHBsdWdpbiBkaXNhYmxlZCkuXG4gICAqIC0ge0BsaW5rIE1hc3RyYU1lbW9yeUNvbmZpZ30gb2JqZWN0OiBkZWRpY2F0ZWQgYFBnVmVjdG9yYCBmb3IgdGhpc1xuICAgKiAgIGFnZW50IChwcml2YXRlIHJlY2FsbCBpbmRleCkuIEJ5cGFzc2VzIHRoZSBzaGFyZWQgc2luZ2xldG9uLlxuICAgKi9cbiAgbWVtb3J5PzogYm9vbGVhbiB8IE1hc3RyYU1lbW9yeUNvbmZpZ092ZXJyaWRlO1xuICAvKipcbiAgICogUGVyLWFnZW50IHRocmVhZC9tZXNzYWdlIHN0b3JhZ2UgKGBQb3N0Z3Jlc1N0b3JlYCkgb3ZlcnJpZGUuXG4gICAqIENhc2NhZGVzIGZyb20gYGNvbmZpZy5zdG9yYWdlYDsgdGhlIGFnZW50IHZhbHVlIHdpbnMgd2hlbiBzZXQuXG4gICAqXG4gICAqIC0gYHVuZGVmaW5lZGAgKGRlZmF1bHQpOiBpbmhlcml0IGBjb25maWcuc3RvcmFnZWAuIFdoZW4gdGhhdCdzXG4gICAqICAgZW5hYmxlZCwgdGhlIGFnZW50IGdldHMgaXRzICoqb3duIHBlci1hZ2VudCBgUG9zdGdyZXNTdG9yZWAqKlxuICAgKiAgIGtleWVkIGJ5IHtAbGluayBhZ2VudFN0b3JhZ2VTY2hlbWFOYW1lfSBzbyB0aHJlYWRzIGFuZFxuICAgKiAgIG1lc3NhZ2VzIHN0YXkgaXNvbGF0ZWQgYmV0d2VlbiBhZ2VudHMgaW4gdGhlIHNhbWUgZGF0YWJhc2UuXG4gICAqIC0gYGZhbHNlYDogZGlzYWJsZSBzdG9yYWdlIGZvciB0aGlzIGFnZW50IG9ubHkgKHB1cmVseSBpbi1tZW1vcnkpLlxuICAgKiAtIGB0cnVlYDogZW5hYmxlIHdpdGggdGhlIHBlci1hZ2VudCBkZWZhdWx0IHNjaGVtYS5cbiAgICogLSB7QGxpbmsgTWFzdHJhU3RvcmFnZUNvbmZpZ092ZXJyaWRlfSBvYmplY3Q6IGRlZGljYXRlZFxuICAgKiAgIGBQb3N0Z3Jlc1N0b3JlYCBjb25maWcgKGN1c3RvbSBzY2hlbWEsIGNvbm5lY3Rpb24sIGV0Yy4pLlxuICAgKi9cbiAgc3RvcmFnZT86IGJvb2xlYW4gfCBNYXN0cmFTdG9yYWdlQ29uZmlnT3ZlcnJpZGU7XG4gIC8qKlxuICAgKiBNYXN0cmEge0BsaW5rIFdvcmtzcGFjZX0gZm9yIHRoaXMgYWdlbnQgKGZpbGVzeXN0ZW0sIHNhbmRib3gsIG9yIG90aGVyXG4gICAqIHByb3ZpZGVycykuIEFzc2lzdGFudCBza2lsbHMgZnJvbSBEYXRhYnJpY2tzIHdvcmtzcGFjZSBwYXRocyBhcmUgd2lyZWRcbiAgICogdmlhIHtAbGluayBkYXRhYnJpY2tzV29ya3NwYWNlfS5cbiAgICovXG4gIHdvcmtzcGFjZT86IFdvcmtzcGFjZSB8IE1hc3RyYUFnZW50V29ya3NwYWNlUmVzb2x2ZXI7XG59XG5cbi8qKiBUeXBlLWVyYXNlZCByZWdpc3RyeSBtZW1iZXI7IGVhY2ggZGVmaW5pdGlvbiByZXRhaW5zIHR5cGluZyBhdCBgY3JlYXRlQWdlbnRgLiAqL1xuZXhwb3J0IHR5cGUgQW55TWFzdHJhQWdlbnREZWZpbml0aW9uID0gTWFzdHJhQWdlbnREZWZpbml0aW9uPGFueT47XG5cbi8qKlxuICogRGlzdHJpYnV0aXZlIGBPbWl0YCBzbyB1bmlvbnMgaW4gYFBvc3RncmVzU3RvcmVDb25maWdgIC9cbiAqIGBQZ1ZlY3RvckNvbmZpZ2Aga2VlcCB0aGVpciBkaXNjcmltaW5hbnRzIGFmdGVyIHRoZSBvdmVycmlkZSB0eXBlc1xuICogc3RyaXAgYGlkYC4gVGhlIGJ1aWx0LWluIGBPbWl0YCBjb2xsYXBzZXMgdW5pb25zIHRvIG9uZSBzaGFwZSB3aXRoXG4gKiBjb21tb24gZmllbGRzIG9ubHksIHdoaWNoIGxvc2VzIHRoZSBjb25uZWN0aW9uLXN0eWxlIGRpc2NyaW1pbmFudHMuXG4gKi9cbnR5cGUgRGlzdHJpYnV0aXZlT21pdDxULCBLIGV4dGVuZHMga2V5b2YgbmV2ZXI+ID0gVCBleHRlbmRzIHVua25vd24gPyBPbWl0PFQsIEs+IDogbmV2ZXI7XG5cbi8qKlxuICogYFBvc3RncmVzU3RvcmVDb25maWdgIG1pbnVzIGBpZGAgLSBwZXItYWdlbnQgb3ZlcnJpZGVzIGFjY2VwdCBhbnlcbiAqIE1hc3RyYS1zdXBwb3J0ZWQgc3RvcmFnZSBzaGFwZS4gYGlkYCBpcyBmaWxsZWQgaW4gYXV0b21hdGljYWxseVxuICogZnJvbSB0aGUgYWdlbnQgcmVnaXN0cnkga2V5IHNvIHRyYWNlcyBzdGF5IHN0YWJsZS5cbiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhU3RvcmFnZUNvbmZpZ092ZXJyaWRlID0gRGlzdHJpYnV0aXZlT21pdDxQb3N0Z3Jlc1N0b3JlQ29uZmlnLCBcImlkXCI+ICYge1xuICBpZD86IHN0cmluZztcbn07XG5cbi8qKlxuICogYFBnVmVjdG9yQ29uZmlnYCBtaW51cyBgaWRgIC0gcGVyLWFnZW50IG92ZXJyaWRlcyBhY2NlcHQgYW55XG4gKiBNYXN0cmEtc3VwcG9ydGVkIHZlY3RvciBzaGFwZS4gYGlkYCBpcyBmaWxsZWQgaW4gYXV0b21hdGljYWxseVxuICogZnJvbSB0aGUgYWdlbnQgcmVnaXN0cnkga2V5LlxuICovXG5leHBvcnQgdHlwZSBNYXN0cmFNZW1vcnlDb25maWdPdmVycmlkZSA9IERpc3RyaWJ1dGl2ZU9taXQ8UGdWZWN0b3JDb25maWcsIFwiaWRcIj4gJiB7XG4gIGlkPzogc3RyaW5nO1xufTtcblxuLyoqIEhvdyBhbiBhZ2VudCdzIHVucGlubmVkIG1vZGVsIGlzIHJlc29sdmVkLiAqL1xuZXhwb3J0IHR5cGUgQWdlbnREZWZhdWx0TW9kZWwgPVxuICB7IGtpbmQ6IFwiYXV0b1wiIH0gfCB7IGtpbmQ6IFwiY29uZmlndXJlZFwiOyBtb2RlbDogc3RyaW5nIH0gfCB7IGtpbmQ6IFwiZHluYW1pY1wiIH07XG5cbi8qKiBPdXRwdXQgb2Yge0BsaW5rIGJ1aWxkQWdlbnRzfTogcmVzb2x2ZWQgYWdlbnRzIHBsdXMgdGhlIGRlZmF1bHQgaWQuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWx0QWdlbnRzIHtcbiAgYWdlbnRzOiBSZWNvcmQ8c3RyaW5nLCBBZ2VudD47XG4gIGRlZmF1bHRBZ2VudElkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBEZWZhdWx0IG1vZGVsIGludGVudCBwZXIgYWdlbnQgaWQuIEFuIHVuY29uZmlndXJlZCBhZ2VudCBpcyBgXCJhdXRvXCJgIGFuZFxuICAgKiByZXNvbHZlcyB0aGUgaGlnaGVzdC1yYW5rZWQgbGl2ZSBlbmRwb2ludDsgYSBzdHJpbmcgaXMgYFwiY29uZmlndXJlZFwiYDsgYVxuICAgKiBjdXN0b20gZnVuY3Rpb24gaXMgYFwiZHluYW1pY1wiYC4gQ29uc3VtZWQgYnkgdGhlIHBsdWdpbidzXG4gICAqIGBHRVQgL2RlZmF1bHQtbW9kZWxgIHJvdXRlLlxuICAgKi9cbiAgZGVmYXVsdE1vZGVsczogUmVjb3JkPHN0cmluZywgQWdlbnREZWZhdWx0TW9kZWw+O1xuICAvKipcbiAgICogQW1iaWVudCB0b29scyBzaGFyZWQgYWNyb3NzIGV2ZXJ5IGFnZW50ICh0aGUgYnVpbHQtaW4gc3lzdGVtIHRvb2xzXG4gICAqIHNwcmVhZCB3aXRoIGBjb25maWcudG9vbHNgKS4gU3VyZmFjZWQgc28gdGhlIG9wdGlvbmFsIE1DUCBzZXJ2ZXJcbiAgICogY2FuIHJlLWV4cG9zZSB0aGVtIHdoZW4ge0BsaW5rIE1hc3RyYU1jcENvbmZpZy50b29sc30gaXMgZW5hYmxlZC5cbiAgICovXG4gIGFtYmllbnRUb29sczogTWFzdHJhVG9vbHM7XG59XG5cbi8qKiBCdWlsZHMgb25lIG9wdGlvbmFsIG91dHB1dCBwcm9jZXNzb3IgZm9yIGEgcmVnaXN0ZXJlZCBNYXN0cmEgYWdlbnQuICovXG5leHBvcnQgdHlwZSBNYXN0cmFPdXRwdXRQcm9jZXNzb3JGYWN0b3J5ID0gKGFnZW50SWQ6IHN0cmluZykgPT4gT3V0cHV0UHJvY2Vzc29yIHwgdW5kZWZpbmVkO1xuXG4vKiogRmFsbGJhY2sgYWdlbnQgaWQgdXNlZCB3aGVuIGBjb25maWcuYWdlbnRzYCBpcyBvbWl0dGVkIGVudGlyZWx5LiAqL1xuZXhwb3J0IGNvbnN0IEZBTExCQUNLX0FHRU5UX0lEID0gXCJkZWZhdWx0XCI7XG5cbi8qKlxuICogRGVmYXVsdCBwZXItdHVybiBzdGVwIGNlaWxpbmcgYXBwbGllZCB0byBldmVyeSByZWdpc3RlcmVkIGFnZW50XG4gKiB3aGVuIHtAbGluayBNYXN0cmFQbHVnaW5Db25maWcuYWdlbnRNYXhTdGVwc30gaXMgdW5zZXQuIFNpemVkIHRvXG4gKiBmaXQgYSBkZWNvbXBvc2VkIEdlbmllIHR1cm4gKGdyb3VuZGluZyArIHNldmVyYWwgYGFza19nZW5pZWBcbiAqIGNhbGxzICsgYHByZXBhcmVfY2hhcnRgIHBlciBkYXRhc2V0ICsgdGhlIGZpbmFsLXRleHQgcmVwbHkpIHdpdGhcbiAqIGhlYWRyb29tIGZvciB0aGUgbW9kZWwgdG8gY2hhaW4gYSBjb3VwbGUgb2YgZm9sbG93LXVwcyBiZWZvcmVcbiAqIGFuc3dlcmluZyAtIHdlbGwgYWJvdmUgTWFzdHJhJ3Mgb3duIGBhZ2VudC5nZW5lcmF0ZWAgZGVmYXVsdCBvZlxuICogNSwgd2hpY2ggd291bGQgY3V0IG11bHRpLXN0ZXAgb3JjaGVzdHJhdGlvbiBvZmYgbWlkLWxvb3AuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FHRU5UX01BWF9TVEVQUyA9IDI1O1xuXG5jb25zdCBFVkVOVEVEX0NPTlNUUlVDVE9SX01PREVMID0ge1xuICBzcGVjaWZpY2F0aW9uVmVyc2lvbjogXCJ2M1wiLFxuICBwcm92aWRlcjogXCJkYngtdG9vbHNcIixcbiAgbW9kZWxJZDogXCJkZWZlcnJlZFwiLFxuICBzdXBwb3J0ZWRVcmxzOiB7fSxcbiAgYXN5bmMgZG9HZW5lcmF0ZSgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZWZlcnJlZCBldmVudGVkIGNvbnN0cnVjdG9yIG1vZGVsIG11c3Qgbm90IGV4ZWN1dGVcIik7XG4gIH0sXG4gIGFzeW5jIGRvU3RyZWFtKCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkRlZmVycmVkIGV2ZW50ZWQgY29uc3RydWN0b3IgbW9kZWwgbXVzdCBub3QgZXhlY3V0ZVwiKTtcbiAgfSxcbn0gYXMgbmV2ZXI7XG5cbi8qKlxuICogYEV2ZW50ZWRBZ2VudGAgZGVsZWdhdGVzIG1vZGVsIHJlc29sdXRpb24gdG8gdGhlIHdyYXBwZWQgYWdlbnQgYXQgZXhlY3V0aW9uXG4gKiB0aW1lLCBidXQgaXRzIGNvbnN0cnVjdG9yIGFsc28gcHJvYmVzIGFuIHVudHlwZWQgYF9fbW9kZWxgIHNsb3QgYW5kIG90aGVyd2lzZVxuICogY2FsbHMgYGdldE1vZGVsKClgIHdpdGggYW4gZW1wdHkgcmVxdWVzdCBjb250ZXh0LiBUZW1wb3JhcmlseSBmaWxsaW5nIHRoYXRcbiAqIHByb2JlIGF2b2lkcyBhbiBlYWdlciBzZXJ2aWNlLXByaW5jaXBhbCBsb29rdXAgd2hpbGUgcHJlc2VydmluZyB0aGUgd3JhcHBlZFxuICogYWdlbnQncyByZXF1ZXN0LXNjb3BlZCBtb2RlbCByZXNvbHZlciBmb3IgcmVhbCB0dXJucy5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlQmFja2dyb3VuZEFnZW50KGFnZW50OiBBZ2VudCwgbWF4U3RlcHM6IG51bWJlcik6IEFnZW50IHtcbiAgY29uc3QgbW9kZWxTbG90ID0gXCJfX21vZGVsXCI7XG4gIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGFnZW50LCBtb2RlbFNsb3QpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoYWdlbnQsIG1vZGVsU2xvdCwge1xuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogRVZFTlRFRF9DT05TVFJVQ1RPUl9NT0RFTCxcbiAgfSk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGNyZWF0ZUV2ZW50ZWRBZ2VudCh7IGFnZW50LCBtYXhTdGVwcyB9KSBhcyB1bmtub3duIGFzIEFnZW50O1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChkZXNjcmlwdG9yKSBPYmplY3QuZGVmaW5lUHJvcGVydHkoYWdlbnQsIG1vZGVsU2xvdCwgZGVzY3JpcHRvcik7XG4gICAgZWxzZSBkZWxldGUgKGFnZW50IGFzIEFnZW50ICYgeyBfX21vZGVsPzogdW5rbm93biB9KS5fX21vZGVsO1xuICB9XG59XG5cbmNvbnN0IEZBTExCQUNLX0FHRU5UX0lOU1RSVUNUSU9OUyA9IGBZb3UgYXJlIGEgZGF0YSBhbmFseXN0LiBUaGUgdXNlciB3aWxsIGFzayBxdWVzdGlvbnMgYWJvdXRcbmJ1c2luZXNzIG1ldHJpY3MgYW5kIG1heSBzaGFyZSBwZXJzb25hbCBwcmVmZXJlbmNlcyB5b3Ugc2hvdWxkIHJlbWVtYmVyIGFjcm9zcyB0dXJucy5cblxuUnVsZXM6XG5cbjEuIFF1b3RlIG51bWJlcnMgZXhhY3RseS4gTmV2ZXIgaW52ZW50IGRhdGEuXG4yLiBXaGVuIHRoZSB1c2VyIHN0YXRlcyBhIHByZWZlcmVuY2Ugb3IgZHVyYWJsZSBmYWN0IGFib3V0IHRoZW1zZWx2ZXNcbiAgIChcIkknbSBpbiBFVSBzbyB1c2UgRVVSXCIsIFwiYWx3YXlzIHNob3cgbWUgdGhlIFNRTFwiKSwgYWNrbm93bGVkZ2UgdGhhdFxuICAgeW91IHdpbGwgcmVtZW1iZXIgaXQuXG4zLiBJZiB5b3UgZG9uJ3QgaGF2ZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8gYW5zd2VyLCBhc2sgYSBjbGFyaWZ5aW5nXG4gICBxdWVzdGlvbiBpbnN0ZWFkIG9mIGd1ZXNzaW5nLmA7XG5cbi8qKiBUb29sLWNhbGwgZ3VpZGFuY2UgYXBwZW5kZWQgdG8gZXZlcnkgcmVnaXN0ZXJlZCBhZ2VudC4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX1RPT0xfV09SS0ZMT1dfSU5TVFJVQ1RJT05TID0gW1xuICBcIlRvb2wgd29ya2Zsb3c6XCIsXG4gIFwiV2hlbiB0aGUgYWN0aXZlIG1vZGVsIHN1cHBvcnRzIGl0LCBjYWxsIG11bHRpcGxlIHRvb2xzIGluIHRoZSBzYW1lIHR1cm4gd2hlbiB0aGVpciBpbnB1dHMgYXJlIGluZGVwZW5kZW50LCBpbmNsdWRpbmcgbXVsdGlwbGUgY2FsbHMgdG8gdGhlIHNhbWUgdG9vbC5cIixcbiAgXCJLZWVwIGNhbGxzIHNlcXVlbnRpYWwgd2hlbiBhIGxhdGVyIGlucHV0IGRlcGVuZHMgb24gYW4gZWFybGllciByZXN1bHQgb3Igd2hlbiBjYWxscyBtdXRhdGUgdGhlIHNhbWUgcmVzb3VyY2UuXCIsXG5dLmpvaW4oXCJcXG5cIik7XG5cbi8qKiBIeWJyaWQgcm91dGluZyBndWlkYW5jZSBhcHBlbmRlZCBhZnRlciBNYXN0cmEncyBnZW5lcmF0ZWQgQ29kZSBNb2RlIGNvbnRyYWN0LiAqL1xuZXhwb3J0IGNvbnN0IENPREVfTU9ERV9ST1VUSU5HX0lOU1RSVUNUSU9OUyA9IFtcbiAgXCJUb29sIHJvdXRpbmc6XCIsXG4gIFwiVGhlIENvZGUgTW9kZSBjb250cmFjdCBhYm92ZSBleHBsYWlucyBob3cgdG8gdXNlIGV4ZWN1dGVfdHlwZXNjcmlwdCB3aGVuIHNlbGVjdGVkOyBpdCBkb2VzIG5vdCByZXF1aXJlIHVzaW5nIENvZGUgTW9kZSBmb3IgZXZlcnkgdG9vbCBjYWxsLlwiLFxuICBcIkNhbGwgYSBkaXJlY3RseSBleHBvc2VkIHRvb2wgZGlyZWN0bHkgd2hlbiBvbmUgb3JkaW5hcnkgY2FsbCBpcyBzdWZmaWNpZW50LlwiLFxuICBcIkNhbGwgaW5kZXBlbmRlbnQgdG9vbHMgZGlyZWN0bHkgaW4gcGFyYWxsZWwgd2hlbiB0aGVpciByZXN1bHRzIGRvIG5vdCByZXF1aXJlIGNvZGUtc2lkZSB0cmFuc2Zvcm1hdGlvbi5cIixcbiAgXCJLZWVwIGRlcGVuZGVudCBjYWxscyBhcyBkaXJlY3Qgc2VxdWVudGlhbCB0b29sIGNhbGxzIHdoZW4gY29kZS1zaWRlIHRyYW5zZm9ybWF0aW9uIGlzIHVubmVjZXNzYXJ5LlwiLFxuICBcIlVzZSBleGVjdXRlX3R5cGVzY3JpcHQgd2hlbiB0aGUgdXNlciBleHBsaWNpdGx5IHJlcXVlc3RzIENvZGUgTW9kZSBvciB3aGVuIGNvZGUgaXMgdXNlZnVsIGZvciBsb29wcywgZmlsdGVyaW5nLCBqb2lucywgcmFuZG9tIHNlbGVjdGlvbiwgYWdncmVnYXRpb24sIGFyaXRobWV0aWMsIGR5bmFtaWMgZmFuLW91dCwgb3Iga2VlcGluZyBzdWJzdGFudGlhbCBpbnRlcm1lZGlhdGUgcmVzdWx0cyBvdXQgb2YgbW9kZWwgY29udGV4dC5cIixcbiAgXCJEbyBub3Qgd3JhcCBhIHNpbmdsZSBvcmRpbmFyeSB0b29sIGNhbGwgaW4gZXhlY3V0ZV90eXBlc2NyaXB0LlwiLFxuXS5qb2luKFwiXFxuXCIpO1xuXG4vKipcbiAqIFN0eWxlIGd1YXJkcmFpbHMgYXBwZW5kZWQgdG8gZXZlcnkgYWdlbnQncyBgaW5zdHJ1Y3Rpb25zYCB0byBjdXJiXG4gKiBjb21tb24gTExNLWlzbXMgKGVtIGRhc2hlcywgZW1vamlzLCBzeWNvcGhhbnRpYyBvcGVuZXJzLCBleGNlc3NpdmVcbiAqIGhlZGdpbmcsIHRocm93YXdheSBjbG9zZXJzKS4gQXBwZW5kZWQgcmF0aGVyIHRoYW4gcHJlcGVuZGVkIHNvIHRoZVxuICogYWdlbnQncyByb2xlL2NvbnRleHQgY29tZXMgZmlyc3Q7IHRoZSBtb2RlbCdzIHJlY2VuY3kgYmlhcyB0aGVuXG4gKiBoZWxwcyB0aGUgc3R5bGUgcnVsZXMgZG9taW5hdGUgdGhlIHJlc3BvbnNlIHN1cmZhY2UuXG4gKlxuICogT3ZlcnJpZGUgZ2xvYmFsbHkgdmlhIHtAbGluayBNYXN0cmFQbHVnaW5Db25maWcuc3R5bGVJbnN0cnVjdGlvbnN9XG4gKiAocGFzcyBgZmFsc2VgIHRvIGRpc2FibGUgZW50aXJlbHksIG9yIGEgc3RyaW5nIHRvIHJlcGxhY2UpLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9TVFlMRV9JTlNUUlVDVElPTlMgPSBbXG4gIFwiT3V0cHV0IHN0eWxlOlwiLFxuICBcIlwiLFxuICBcIlVzZSBtYXJrZG93biBmb3JtYXR0aW5nLCBpbmNsdWRpbmcgaGVhZGluZ3MsIGxpc3RzLCBhbmQgY29kZSBibG9ja3MuXCIsXG4gIFwiQXZvaWQgbGlzdHMgYW5kIGhlYWRlcnMgZm9yIHNob3J0IHJlcGxpZXMuXCIsXG4gIFwiUGxhaW4gcHJvc2UuXCIsXG4gIFRZUE9HUkFQSFlfUlVMRSxcbiAgXCJTa2lwIG9wZW5lcnMgbGlrZSAnR3JlYXQgcXVlc3Rpb24nLCAnQWJzb2x1dGVseScsIGFuZCAnSSdkIGJlIGhhcHB5IHRvIGhlbHAnLlwiLFxuICBcIlNraXAgY2xvc2VycyBsaWtlICdMZXQgbWUga25vdyBpZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zJy5cIixcbiAgXCJTa2lwIHNlbGYtZGlzY2xhaW1lcnMgbGlrZSAnSSBzaG91bGQgbWVudGlvbicgYW5kICdJdCdzIGltcG9ydGFudCB0byBub3RlJy5cIixcbiAgXCJBbnN3ZXIgZGlyZWN0bHkuXCIsXG4gIFwiRG8gbm90IGluY2x1ZGUgYSBwcmVhbWJsZSBiZWZvcmUgdGhlIGFjdHVhbCBhbnN3ZXIuXCIsXG4gIFwiVXNlIGxpc3RzIGFuZCBoZWFkZXJzIG9ubHkgd2hlbiB0aGV5IGNsYXJpZnkgYSBtdWx0aS1wYXJ0IGFuc3dlci5cIixcbl0uam9pbihcIlxcblwiKTtcblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBzdHlsZSBibG9jayB0byBhcHBlbmQgdG8gZXZlcnkgYWdlbnQncyBpbnN0cnVjdGlvbnMuXG4gKiBSZXR1cm5zIGBudWxsYCB3aGVuIHRoZSBjYWxsZXIgb3B0ZWQgb3V0IChgc3R5bGVJbnN0cnVjdGlvbnM6IGZhbHNlYCkuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTdHlsZUluc3RydWN0aW9ucyhjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyk6IHN0cmluZyB8IG51bGwge1xuICBpZiAoY29uZmlnLnN0eWxlSW5zdHJ1Y3Rpb25zID09PSBmYWxzZSkgcmV0dXJuIG51bGw7XG4gIGlmICh0eXBlb2YgY29uZmlnLnN0eWxlSW5zdHJ1Y3Rpb25zID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGNvbmZpZy5zdHlsZUluc3RydWN0aW9ucztcbiAgfVxuXG4gIHJldHVybiBERUZBVUxUX1NUWUxFX0lOU1RSVUNUSU9OUztcbn1cblxuLyoqIEFwcGVuZCBzaGFyZWQgd29ya2Zsb3cgYW5kIHN0eWxlIGJsb2NrcyB3aXRob3V0IG5hcnJvd2luZyBNYXN0cmEncyBpbnN0cnVjdGlvbiBzaGFwZXMuICovXG5mdW5jdGlvbiBhcHBlbmREZWZhdWx0SW5zdHJ1Y3Rpb25zKFxuICBpbnN0cnVjdGlvbnM6IEFnZW50SW5zdHJ1Y3Rpb25zLFxuICBzdHlsZTogc3RyaW5nIHwgbnVsbCxcbik6IEFnZW50SW5zdHJ1Y3Rpb25zIHtcbiAgY29uc3Qgc3VmZml4ID0gc3R5bGVcbiAgICA/IGAke0RFRkFVTFRfVE9PTF9XT1JLRkxPV19JTlNUUlVDVElPTlN9XFxuXFxuJHtzdHlsZX1gXG4gICAgOiBERUZBVUxUX1RPT0xfV09SS0ZMT1dfSU5TVFJVQ1RJT05TO1xuICBpZiAodHlwZW9mIGluc3RydWN0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBgJHtpbnN0cnVjdGlvbnMudHJpbUVuZCgpfVxcblxcbiR7c3VmZml4fWA7XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoaW5zdHJ1Y3Rpb25zKSkge1xuICAgIGlmIChpbnN0cnVjdGlvbnMuZXZlcnkoKGluc3RydWN0aW9uKSA9PiB0eXBlb2YgaW5zdHJ1Y3Rpb24gPT09IFwic3RyaW5nXCIpKSB7XG4gICAgICByZXR1cm4gWy4uLmluc3RydWN0aW9ucywgc3VmZml4XSBhcyBBZ2VudEluc3RydWN0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIFsuLi5pbnN0cnVjdGlvbnMsIHsgcm9sZTogXCJzeXN0ZW1cIiwgY29udGVudDogc3VmZml4IH1dIGFzIEFnZW50SW5zdHJ1Y3Rpb25zO1xuICB9XG4gIHJldHVybiBbaW5zdHJ1Y3Rpb25zLCB7IHJvbGU6IFwic3lzdGVtXCIsIGNvbnRlbnQ6IHN1ZmZpeCB9XSBhcyBBZ2VudEluc3RydWN0aW9ucztcbn1cblxuLyoqXG4gKiBDb21wb3NlIHN0YXRpYyBvciByZXF1ZXN0LWNvbnRleHQtYXdhcmUgaW5zdHJ1Y3Rpb25zIHdpdGggc2hhcmVkIHdvcmtmbG93XG4gKiBhbmQgc3R5bGUgZ3VpZGFuY2Ugd2hpbGUgcHJlc2VydmluZyBNYXN0cmEncyBuYXRpdmUgZ2VuZXJpYyBpbmZlcmVuY2UuXG4gKi9cbmZ1bmN0aW9uIGNvbXBvc2VJbnN0cnVjdGlvbnM8VFJlcXVlc3RDb250ZXh0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmtub3duPihcbiAgYWdlbnRJbnN0cnVjdGlvbnM6IEFnZW50Q29uZmlnPHN0cmluZywgVG9vbHNJbnB1dCwgdW5kZWZpbmVkLCBUUmVxdWVzdENvbnRleHQ+W1wiaW5zdHJ1Y3Rpb25zXCJdLFxuICBzdHlsZTogc3RyaW5nIHwgbnVsbCxcbiAgcmVzb2x2ZUNvZGVNb2RlPzogQ29kZU1vZGVSZXNvbHZlcjxUUmVxdWVzdENvbnRleHQ+LFxuKTogQWdlbnRDb25maWc8c3RyaW5nLCBUb29sc0lucHV0LCB1bmRlZmluZWQsIFRSZXF1ZXN0Q29udGV4dD5bXCJpbnN0cnVjdGlvbnNcIl0ge1xuICBjb25zdCBhcHBlbmQgPSAoaW5zdHJ1Y3Rpb25zOiBBZ2VudEluc3RydWN0aW9ucywgY29kZU1vZGVJbnN0cnVjdGlvbnM/OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBjb21wb3NlZCA9IGFwcGVuZERlZmF1bHRJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zLCBzdHlsZSk7XG4gICAgcmV0dXJuIGNvZGVNb2RlSW5zdHJ1Y3Rpb25zXG4gICAgICA/IGFwcGVuZEluc3RydWN0aW9uQmxvY2soXG4gICAgICAgICAgY29tcG9zZWQsXG4gICAgICAgICAgYCR7Y29kZU1vZGVJbnN0cnVjdGlvbnN9XFxuXFxuJHtDT0RFX01PREVfUk9VVElOR19JTlNUUlVDVElPTlN9YCxcbiAgICAgICAgKVxuICAgICAgOiBjb21wb3NlZDtcbiAgfTtcbiAgaWYgKHR5cGVvZiBhZ2VudEluc3RydWN0aW9ucyAhPT0gXCJmdW5jdGlvblwiICYmICFyZXNvbHZlQ29kZU1vZGUpIHtcbiAgICByZXR1cm4gYXBwZW5kKGFnZW50SW5zdHJ1Y3Rpb25zKSBhcyBBZ2VudENvbmZpZzxcbiAgICAgIHN0cmluZyxcbiAgICAgIFRvb2xzSW5wdXQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBUUmVxdWVzdENvbnRleHRcbiAgICA+W1wiaW5zdHJ1Y3Rpb25zXCJdO1xuICB9XG4gIHJldHVybiAoYXN5bmMgKGFyZ3MpID0+IHtcbiAgICBjb25zdCBbaW5zdHJ1Y3Rpb25zLCBjb2RlTW9kZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB0eXBlb2YgYWdlbnRJbnN0cnVjdGlvbnMgPT09IFwiZnVuY3Rpb25cIiA/IGFnZW50SW5zdHJ1Y3Rpb25zKGFyZ3MpIDogYWdlbnRJbnN0cnVjdGlvbnMsXG4gICAgICByZXNvbHZlQ29kZU1vZGU/LihhcmdzKSxcbiAgICBdKTtcbiAgICByZXR1cm4gYXBwZW5kKGluc3RydWN0aW9ucywgY29kZU1vZGU/Lmluc3RydWN0aW9ucyk7XG4gIH0pIGFzIEFnZW50Q29uZmlnPHN0cmluZywgVG9vbHNJbnB1dCwgdW5kZWZpbmVkLCBUUmVxdWVzdENvbnRleHQ+W1wiaW5zdHJ1Y3Rpb25zXCJdO1xufVxuXG4vKiogQXBwZW5kIG9uZSBzeXN0ZW0gaW5zdHJ1Y3Rpb24gYmxvY2sgd2hpbGUgcHJlc2VydmluZyBNYXN0cmEncyBhY2NlcHRlZCBzaGFwZXMuICovXG5mdW5jdGlvbiBhcHBlbmRJbnN0cnVjdGlvbkJsb2NrKGluc3RydWN0aW9uczogQWdlbnRJbnN0cnVjdGlvbnMsIGJsb2NrOiBzdHJpbmcpOiBBZ2VudEluc3RydWN0aW9ucyB7XG4gIGlmICh0eXBlb2YgaW5zdHJ1Y3Rpb25zID09PSBcInN0cmluZ1wiKSByZXR1cm4gYCR7aW5zdHJ1Y3Rpb25zLnRyaW1FbmQoKX1cXG5cXG4ke2Jsb2NrfWA7XG4gIGlmIChBcnJheS5pc0FycmF5KGluc3RydWN0aW9ucykpIHtcbiAgICBpZiAoaW5zdHJ1Y3Rpb25zLmV2ZXJ5KChpbnN0cnVjdGlvbikgPT4gdHlwZW9mIGluc3RydWN0aW9uID09PSBcInN0cmluZ1wiKSkge1xuICAgICAgcmV0dXJuIFsuLi5pbnN0cnVjdGlvbnMsIGJsb2NrXSBhcyBBZ2VudEluc3RydWN0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIFsuLi5pbnN0cnVjdGlvbnMsIHsgcm9sZTogXCJzeXN0ZW1cIiwgY29udGVudDogYmxvY2sgfV0gYXMgQWdlbnRJbnN0cnVjdGlvbnM7XG4gIH1cbiAgcmV0dXJuIFtpbnN0cnVjdGlvbnMsIHsgcm9sZTogXCJzeXN0ZW1cIiwgY29udGVudDogYmxvY2sgfV0gYXMgQWdlbnRJbnN0cnVjdGlvbnM7XG59XG5cbi8qKiBOb3JtYWxpemUgdGhlIHB1YmxpYyBDb2RlIE1vZGUgc2hvcnRoYW5kIGludG8gb25lIHN0YXJ0dXAgY29uZmlndXJhdGlvbi4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZUNvZGVNb2RlQ29uZmlnKFxuICBjb2RlTW9kZTogTWFzdHJhUGx1Z2luQ29uZmlnW1wiY29kZU1vZGVcIl0sXG4pOiBOb3JtYWxpemVkQ29kZU1vZGVDb25maWcgfCB1bmRlZmluZWQge1xuICBpZiAoY29kZU1vZGUgPT09IHVuZGVmaW5lZCB8fCBjb2RlTW9kZSA9PT0gZmFsc2UpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2YgY29kZU1vZGUgPT09IFwic3RyaW5nXCIgPyB7IHRyYW5zcG9ydDogY29kZU1vZGUgfSA6IGNvZGVNb2RlO1xufVxuXG4vKiogVHJ5IG9uZSBvcHRpb25hbCBDb2RlIE1vZGUgdHJhbnNwb3J0IHdpdGhvdXQgYXBwbHlpbmcgZmFsbGJhY2sgcG9saWN5LiAqL1xuYXN5bmMgZnVuY3Rpb24gdHJ5Q29kZU1vZGVUcmFuc3BvcnQoXG4gIHByb3ZpZGVyOiBFeGNsdWRlPE1hc3RyYUNvZGVNb2RlVHJhbnNwb3J0LCBcImF1dG9cIj4sXG4pOiBQcm9taXNlPFJlc29sdmVkQ29kZU1vZGVDb25maWcgfCBDb2RlTW9kZUZhaWx1cmU+IHtcbiAgaWYgKHByb3ZpZGVyID09PSBcImlzb2xhdGVkLXZtXCIpIHtcbiAgICBpZiAoIXN1cHBvcnRzSXNvbGF0ZWRWbVRyYW5zcG9ydCgpKSB7XG4gICAgICByZXR1cm4geyBjYXRlZ29yeTogXCJ1bnN1cHBvcnRlZC1ydW50aW1lXCIsIHByb3ZpZGVyIH07XG4gICAgfVxuICAgIGxldCBtb2R1bGU6IHR5cGVvZiBpbXBvcnQoXCJAbWFzdHJhL2lzb2xhdGVkLXZtXCIpO1xuICAgIHRyeSB7XG4gICAgICBtb2R1bGUgPSBhd2FpdCBsb2FkSXNvbGF0ZWRWbURlcGVuZGVuY3koKTtcbiAgICB9IGNhdGNoIChjYXVnaHQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNhdGVnb3J5OiBcImRlcGVuZGVuY3ktdW5hdmFpbGFibGVcIixcbiAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihjYXVnaHQpLFxuICAgICAgICBwcm92aWRlcixcbiAgICAgIH07XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyBwcm92aWRlciwgdHJhbnNwb3J0OiBuZXcgbW9kdWxlLklzb2xhdGVkVm1Db2RlTW9kZVRyYW5zcG9ydCgpIH07XG4gICAgfSBjYXRjaCAoY2F1Z2h0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjYXRlZ29yeTogXCJjb25zdHJ1Y3Rpb24tZmFpbGVkXCIsXG4gICAgICAgIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoY2F1Z2h0KSxcbiAgICAgICAgcHJvdmlkZXIsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGlmICghc3VwcG9ydHNRdWlja0pzVHJhbnNwb3J0KCkpIHtcbiAgICByZXR1cm4geyBjYXRlZ29yeTogXCJ1bnN1cHBvcnRlZC1ydW50aW1lXCIsIHByb3ZpZGVyIH07XG4gIH1cbiAgbGV0IG1vZHVsZTogdHlwZW9mIGltcG9ydChcIkBtYXN0cmEvcXVpY2tqc1wiKTtcbiAgdHJ5IHtcbiAgICBtb2R1bGUgPSBhd2FpdCBsb2FkUXVpY2tKc0RlcGVuZGVuY3koKTtcbiAgfSBjYXRjaCAoY2F1Z2h0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNhdGVnb3J5OiBcImRlcGVuZGVuY3ktdW5hdmFpbGFibGVcIixcbiAgICAgIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoY2F1Z2h0KSxcbiAgICAgIHByb3ZpZGVyLFxuICAgIH07XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4geyBwcm92aWRlciwgdHJhbnNwb3J0OiBuZXcgbW9kdWxlLlF1aWNrSnNDb2RlTW9kZVRyYW5zcG9ydCgpIH07XG4gIH0gY2F0Y2ggKGNhdWdodCkge1xuICAgIHJldHVybiB7XG4gICAgICBjYXRlZ29yeTogXCJjb25zdHJ1Y3Rpb24tZmFpbGVkXCIsXG4gICAgICBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKGNhdWdodCksXG4gICAgICBwcm92aWRlcixcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzQ29kZU1vZGVGYWlsdXJlKFxuICByZXN1bHQ6IFJlc29sdmVkQ29kZU1vZGVDb25maWcgfCBDb2RlTW9kZUZhaWx1cmUsXG4pOiByZXN1bHQgaXMgQ29kZU1vZGVGYWlsdXJlIHtcbiAgcmV0dXJuIFwiY2F0ZWdvcnlcIiBpbiByZXN1bHQ7XG59XG5cbi8qKiBQcm9kdWNlIHRoZSBhY3Rpb25hYmxlIHN0YXJ0dXAgZXJyb3IgZm9yIGFuIGV4cGxpY2l0bHkgcmVxdWlyZWQgdHJhbnNwb3J0LiAqL1xuZnVuY3Rpb24gcmVxdWlyZWRDb2RlTW9kZUVycm9yKGZhaWx1cmU6IENvZGVNb2RlRmFpbHVyZSk6IENvbmZpZ3VyYXRpb25FcnJvciB7XG4gIGNvbnN0IHJ1bnRpbWUgPSBwcm9jZXNzLnZlcnNpb25zLmJ1blxuICAgID8gYEJ1biAke3Byb2Nlc3MudmVyc2lvbnMuYnVufWBcbiAgICA6IGAke3Byb2Nlc3MucmVsZWFzZS5uYW1lfSAke3Byb2Nlc3MudmVyc2lvbnMubm9kZX1gO1xuICBjb25zdCBpbnN0YWxsID0gYGJ1biBhZGQgJHtmYWlsdXJlLnByb3ZpZGVyID09PSBcImlzb2xhdGVkLXZtXCIgPyBJU09MQVRFRF9WTV9QQUNLQUdFIDogUVVJQ0tKU19QQUNLQUdFfWA7XG4gIGNvbnN0IHJlYXNvbiA9XG4gICAgZmFpbHVyZS5jYXRlZ29yeSA9PT0gXCJ1bnN1cHBvcnRlZC1ydW50aW1lXCJcbiAgICAgID8gYGlzIG5vdCBzdXBwb3J0ZWQgYnkgJHtydW50aW1lfWBcbiAgICAgIDogZmFpbHVyZS5jYXRlZ29yeSA9PT0gXCJkZXBlbmRlbmN5LXVuYXZhaWxhYmxlXCJcbiAgICAgICAgPyBcImNvdWxkIG5vdCBiZSBsb2FkZWRcIlxuICAgICAgICA6IFwiY291bGQgbm90IGJlIGluaXRpYWxpemVkXCI7XG4gIHJldHVybiBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFxuICAgIGBtYXN0cmE6IGNvZGVNb2RlIHRyYW5zcG9ydCBcIiR7ZmFpbHVyZS5wcm92aWRlcn1cIiAke3JlYXNvbn0uIEluc3RhbGwgdGhlIG9wdGlvbmFsIHRyYW5zcG9ydCB3aXRoIFxcYCR7aW5zdGFsbH1cXGAgYW5kIHVzZSBhIHN1cHBvcnRlZCBydW50aW1lLmAsXG4gICAgZmFpbHVyZS5lcnJvciA/IHsgY2F1c2U6IGZhaWx1cmUuZXJyb3IgfSA6IHVuZGVmaW5lZCxcbiAgKTtcbn1cblxuLyoqIFJlc29sdmUgdGhlIGNvbmZpZ3VyZWQgb3B0aW9uYWwgdHJhbnNwb3J0IG9uY2UgZHVyaW5nIHBsdWdpbiBzdGFydHVwLiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNvZGVNb2RlQ29uZmlnKFxuICBjb2RlTW9kZTogTWFzdHJhUGx1Z2luQ29uZmlnW1wiY29kZU1vZGVcIl0sXG4pOiBQcm9taXNlPFJlc29sdmVkQ29kZU1vZGVDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgY29uZmlnID0gbm9ybWFsaXplQ29kZU1vZGVDb25maWcoY29kZU1vZGUpO1xuICBpZiAoIWNvbmZpZykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBwcm92aWRlcnM6IHJlYWRvbmx5IEV4Y2x1ZGU8TWFzdHJhQ29kZU1vZGVUcmFuc3BvcnQsIFwiYXV0b1wiPltdID1cbiAgICBjb25maWcudHJhbnNwb3J0ID09PSBcImF1dG9cIiA/IFtcImlzb2xhdGVkLXZtXCIsIFwicXVpY2tqc1wiXSA6IFtjb25maWcudHJhbnNwb3J0XTtcbiAgY29uc3QgZmFpbHVyZXM6IENvZGVNb2RlRmFpbHVyZVtdID0gW107XG4gIGZvciAoY29uc3QgcHJvdmlkZXIgb2YgcHJvdmlkZXJzKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJ5Q29kZU1vZGVUcmFuc3BvcnQocHJvdmlkZXIpO1xuICAgIGlmICghaXNDb2RlTW9kZUZhaWx1cmUocmVzdWx0KSkge1xuICAgICAgY29kZU1vZGVMb2dnZXIuaW5mbyhcInRyYW5zcG9ydCBzZWxlY3RlZFwiLCB7IHByb3ZpZGVyIH0pO1xuICAgICAgcmV0dXJuIHsgLi4ucmVzdWx0LCBpZDogY29uZmlnLmlkLCB0aW1lb3V0OiBjb25maWcudGltZW91dCB9O1xuICAgIH1cbiAgICBmYWlsdXJlcy5wdXNoKHJlc3VsdCk7XG4gICAgaWYgKGNvbmZpZy50cmFuc3BvcnQgIT09IFwiYXV0b1wiKSB0aHJvdyByZXF1aXJlZENvZGVNb2RlRXJyb3IocmVzdWx0KTtcbiAgICBjb25zdCBmaWVsZHMgPSB7XG4gICAgICBjYXRlZ29yeTogcmVzdWx0LmNhdGVnb3J5LFxuICAgICAgcHJvdmlkZXIsXG4gICAgICAuLi4ocmVzdWx0LmVycm9yID8geyBlcnJvcjogcmVzdWx0LmVycm9yIH0gOiB7fSksXG4gICAgfTtcbiAgICBpZiAocmVzdWx0LmNhdGVnb3J5ID09PSBcInVuc3VwcG9ydGVkLXJ1bnRpbWVcIikge1xuICAgICAgY29kZU1vZGVMb2dnZXIuaW5mbyhcImF1dG9tYXRpYyB0cmFuc3BvcnQgdW5zdXBwb3J0ZWRcIiwgZmllbGRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29kZU1vZGVMb2dnZXIud2FybihcImF1dG9tYXRpYyB0cmFuc3BvcnQgdW5hdmFpbGFibGVcIiwgZmllbGRzKTtcbiAgICB9XG4gIH1cblxuICBjb2RlTW9kZUxvZ2dlci5pbmZvKFwiYXV0b21hdGljIENvZGUgTW9kZSBkaXNhYmxlZFwiLCB7XG4gICAgcmVhc29uczogZmFpbHVyZXMubWFwKCh7IGNhdGVnb3J5LCBwcm92aWRlciB9KSA9PiAoeyBjYXRlZ29yeSwgcHJvdmlkZXIgfSkpLFxuICB9KTtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxudHlwZSBDb2RlTW9kZVJlc29sdmVyPFRSZXF1ZXN0Q29udGV4dCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5rbm93biA9IHVua25vd24+ID0gKFxuICBhcmdzOiBQYXJhbWV0ZXJzPFxuICAgIEV4Y2x1ZGU8XG4gICAgICBBZ2VudENvbmZpZzxzdHJpbmcsIFRvb2xzSW5wdXQsIHVuZGVmaW5lZCwgVFJlcXVlc3RDb250ZXh0PltcImluc3RydWN0aW9uc1wiXSxcbiAgICAgIEFnZW50SW5zdHJ1Y3Rpb25zXG4gICAgPlxuICA+WzBdLFxuKSA9PiBQcm9taXNlPFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUNvZGVNb2RlPiB8IHVuZGVmaW5lZD47XG5cbi8qKiBCdWlsZCByZXF1ZXN0LXNjb3BlZCBuYXRpdmUgQ29kZSBNb2RlIG92ZXIgYWxsIGV4ZWN1dGFibGUgY29udGV4dCB0b29scy4gKi9cbmFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ29kZU1vZGU8VFJlcXVlc3RDb250ZXh0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmtub3duPihcbiAgY29uZmlnOiBSZXNvbHZlZENvZGVNb2RlQ29uZmlnLFxuICB0b29sczogTWFzdHJhVG9vbHMsXG4gIHdvcmtzcGFjZTogV29ya3NwYWNlIHwgdW5kZWZpbmVkLFxuICByZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQ8VFJlcXVlc3RDb250ZXh0Pixcbik6IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlQ29kZU1vZGU+IHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHdvcmtzcGFjZVRvb2xzID0gd29ya3NwYWNlXG4gICAgPyBhd2FpdCBjcmVhdGVXb3Jrc3BhY2VUb29scyh3b3Jrc3BhY2UsIHsgcmVxdWVzdENvbnRleHQsIHdvcmtzcGFjZSB9KVxuICAgIDoge307XG4gIGNvbnN0IGNvbnRleHRUb29scyA9IHsgLi4udG9vbHMsIC4uLndvcmtzcGFjZVRvb2xzIH07XG4gIGNvbnN0IGV4ZWN1dGFibGVUb29scyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhjb250ZXh0VG9vbHMpLmZpbHRlcihcbiAgICAgIChbLCB0b29sXSkgPT5cbiAgICAgICAgdHlwZW9mIHRvb2wgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgdG9vbCAhPT0gbnVsbCAmJlxuICAgICAgICBcImV4ZWN1dGVcIiBpbiB0b29sICYmXG4gICAgICAgIHR5cGVvZiB0b29sLmV4ZWN1dGUgPT09IFwiZnVuY3Rpb25cIixcbiAgICApLFxuICApIGFzIFRvb2xzSW5wdXQ7XG4gIGlmIChPYmplY3Qua2V5cyhleGVjdXRhYmxlVG9vbHMpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgY29kZU1vZGUgPSBjcmVhdGVDb2RlTW9kZShcbiAgICB7XG4gICAgICB0b29sczogZXhlY3V0YWJsZVRvb2xzLFxuICAgICAgLi4uKGNvbmZpZy5pZCAhPT0gdW5kZWZpbmVkID8geyBpZDogY29uZmlnLmlkIH0gOiB7fSksXG4gICAgICAuLi4oY29uZmlnLnRpbWVvdXQgIT09IHVuZGVmaW5lZCA/IHsgdGltZW91dDogY29uZmlnLnRpbWVvdXQgfSA6IHt9KSxcbiAgICB9LFxuICAgIGNvbmZpZy50cmFuc3BvcnQsXG4gICk7XG4gIGlmICghKFwibWFzdHJhX3dvcmtzcGFjZV9yZWFkX2ZpbGVcIiBpbiB3b3Jrc3BhY2VUb29scykpIHJldHVybiBjb2RlTW9kZTtcbiAgcmV0dXJuIHtcbiAgICAuLi5jb2RlTW9kZSxcbiAgICBpbnN0cnVjdGlvbnM6IGAke2NvZGVNb2RlLmluc3RydWN0aW9uc31cXG5cXG5Xb3Jrc3BhY2UgZmlsZSBjb250ZW50IG5vdGU6XFxuVGV4dCByZXR1cm5lZCBieSBleHRlcm5hbF9tYXN0cmFfd29ya3NwYWNlX3JlYWRfZmlsZSBzdGFydHMgd2l0aCBvbmUgbWV0YWRhdGEgbGluZSBjb250YWluaW5nIHRoZSBwYXRoIGFuZCBzaXplLiBFeGNsdWRlIHRoYXQgZmlyc3QgbGluZSBiZWZvcmUgY2FsY3VsYXRpbmcgY29udGVudCBjaGFyYWN0ZXIgY291bnRzLCBoYXNoZXMsIG9yIG90aGVyIGNvbnRlbnQtb25seSB2YWx1ZXMuYCxcbiAgfTtcbn1cblxuLyoqIFJlc29sdmUgQ29kZSBNb2RlIGxhemlseSBzbyB3b3Jrc3BhY2UgYW5kIGR5bmFtaWMgdG9vbCBwb2xpY3kgZm9sbG93IGVhY2ggcmVxdWVzdC4gKi9cbmZ1bmN0aW9uIGNvZGVNb2RlUmVzb2x2ZXI8VFJlcXVlc3RDb250ZXh0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmtub3duPihcbiAgY29uZmlnOiBSZXNvbHZlZENvZGVNb2RlQ29uZmlnIHwgdW5kZWZpbmVkLFxuICB0b29sczogTWFzdHJhVG9vbHMsXG4gIHdvcmtzcGFjZTogV29ya3NwYWNlIHwgdW5kZWZpbmVkLFxuKTogQ29kZU1vZGVSZXNvbHZlcjxUUmVxdWVzdENvbnRleHQ+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb25maWcpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiAoeyByZXF1ZXN0Q29udGV4dCB9KSA9PiBidWlsZENvZGVNb2RlKGNvbmZpZywgdG9vbHMsIHdvcmtzcGFjZSwgcmVxdWVzdENvbnRleHQpO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlZCBkZXNjcmlwdGlvbiBmb3IgYW4gYWdlbnQgd2hvc2UgZGVmaW5pdGlvbiBvbWl0cyBvbmUuIEtlcHRcbiAqIGdlbmVyaWMgKHRoZSBhZ2VudCdzIG93biBuYW1lIGlzIHRoZSBvbmx5IHJlbGlhYmxlIHNpZ25hbCBhdCBidWlsZFxuICogdGltZSkgc28gaXQgcmVhZHMgc2Vuc2libHkgYXMgdGhlIGBhc2tfPGlkPmAgTUNQIHRvb2wncyBkZXNjcmlwdGlvblxuICogYW5kIGluIGFnZW50IG1ldGFkYXRhLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0QWdlbnREZXNjcmlwdGlvbihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYENvbnZlcnNhdGlvbmFsIEFJIGFnZW50IFwiJHtuYW1lfVwiLmA7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBldmVyeSBlbnRyeSBpbiBgY29uZmlnLmFnZW50c2AgaW50byBhIE1hc3RyYSBgQWdlbnRgXG4gKiBpbnN0YW5jZS4gV2hlbiBgY29uZmlnLmFnZW50c2AgaXMgb21pdHRlZCB0aGUgcGx1Z2luIHJlZ2lzdGVycyBhXG4gKiBzaW5nbGUgYnVpbHQtaW4gYGRlZmF1bHRgIGFuYWx5c3Qgc28gdGhlIGJhcmUgYG1hc3RyYSgpYCBjYWxsIHN0aWxsXG4gKiB5aWVsZHMgYSB3b3JraW5nIGFnZW50LlxuICpcbiAqIFBlci1hZ2VudCB0b29sIGNhbGxiYWNrcyBhcmUgaW52b2tlZCBvbmNlIHdpdGggYSB0eXBlZFxuICoge0BsaW5rIE1hc3RyYVBsdWdpbnN9IGluZGV4IGJ1aWx0IGZyb20gcmVnaXN0ZXJlZCBzaWJsaW5nIHBsdWdpbnNcbiAqIChjdXJyZW50bHkgYGdlbmllYDsgZXh0ZW5kIGBNYXN0cmFQbHVnaW5zYCB0byBzdXJmYWNlIG1vcmUpLlxuICpcbiAqIEB0aHJvd3Mgd2hlbiBgY29uZmlnLmRlZmF1bHRBZ2VudGAgaXMgc2V0IHRvIGFuIGlkIHRoYXQgaXNuJ3QgaW4gdGhlXG4gKiAgIHJlc29sdmVkIHJlZ2lzdHJ5OyB0aGlzIGlzIGEgd2lyaW5nIGJ1Zywgbm90IGEgcnVudGltZSBjb25kaXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBidWlsZEFnZW50cyhvcHRzOiB7XG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnO1xuICBjb250ZXh0OiBwbHVnaW5SZWdpc3RyeS5QbHVnaW5Db250ZXh0TGlrZSB8IHVuZGVmaW5lZDtcbiAgbWVtb3J5QnVpbGRlcj86IE1lbW9yeUJ1aWxkZXI7XG4gIG91dHB1dFByb2Nlc3NvckZhY3Rvcmllcz86IHJlYWRvbmx5IE1hc3RyYU91dHB1dFByb2Nlc3NvckZhY3RvcnlbXTtcbiAgbG9nOiBsb2cuTG9nZ2VyO1xuICAvKipcbiAgICogTG9jYWwgc2tpbGwgZmlsZXN5c3RlbXMgbW91bnRlZCBpbnRvIGV2ZXJ5IGF1dG8tY3JlYXRlZCBkZWZhdWx0IHdvcmtzcGFjZS5cbiAgICogU2tpbGwgYWN0aXZhdGlvbiBjb21lcyBmcm9tIHtAbGluayBzdGFuZGFyZFNraWxsc30sIG5vdCB3b3Jrc3BhY2Ugc2VhcmNoLlxuICAgKi9cbiAgZXh0cmFTa2lsbE1vdW50cz86IERhdGFicmlja3NXb3Jrc3BhY2VPcHRpb25zW1wiZXh0cmFTa2lsbE1vdW50c1wiXTtcbiAgLyoqIEZhc3QgaW4tbWVtb3J5IHNraWxscyBwYXNzZWQgdGhyb3VnaCBNYXN0cmEncyBzdGFuZGFyZCBhZ2VudCBza2lsbCB0b29scy4gKi9cbiAgc3RhbmRhcmRTa2lsbHM/OiByZWFkb25seSBJbmxpbmVTa2lsbFtdO1xuICAvKiogU3RhbmRhcmQgc2tpbGwgbmFtZXMgb21pdHRlZCBmcm9tIHNsb3dlciBEYXRhYnJpY2tzIHdvcmtzcGFjZSBzZWFyY2guICovXG4gIGV4Y2x1ZGVkV29ya3NwYWNlU2tpbGxOYW1lcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xufSk6IFByb21pc2U8QnVpbHRBZ2VudHM+IHtcbiAgY29uc3Qge1xuICAgIGNvbmZpZyxcbiAgICBjb250ZXh0LFxuICAgIG1lbW9yeUJ1aWxkZXIsXG4gICAgb3V0cHV0UHJvY2Vzc29yRmFjdG9yaWVzID0gW10sXG4gICAgbG9nLFxuICAgIGV4dHJhU2tpbGxNb3VudHMsXG4gICAgc3RhbmRhcmRTa2lsbHMgPSBbXSxcbiAgICBleGNsdWRlZFdvcmtzcGFjZVNraWxsTmFtZXMgPSBbXSxcbiAgfSA9IG9wdHM7XG4gIGNvbnN0IGNvZGVNb2RlQ29uZmlnID0gYXdhaXQgcmVzb2x2ZUNvZGVNb2RlQ29uZmlnKGNvbmZpZy5jb2RlTW9kZSk7XG4gIGNvbnN0IGRlZmluaXRpb25zID0gcmVzb2x2ZURlZmluaXRpb25zKGNvbmZpZyk7XG4gIGNvbnN0IGlkcyA9IE9iamVjdC5rZXlzKGRlZmluaXRpb25zKTtcbiAgY29uc3QgZGVmYXVsdEFnZW50SWQgPSBjb25maWcuZGVmYXVsdEFnZW50ID8/IGlkc1swXSA/PyBGQUxMQkFDS19BR0VOVF9JRDtcblxuICBjb25zdCBwbHVnaW5zID0gYnVpbGRQbHVnaW5zTWFwKGNvbmZpZywgY29udGV4dCk7XG4gIC8vIFN5c3RlbS1kZWZhdWx0IGFtYmllbnQgdG9vbHMgZXZlcnkgYWdlbnQgZ2V0cyBvdXQgb2YgdGhlIGJveDpcbiAgLy8gYHJlbmRlcl9kYXRhYCBmb3IgaW5saW5lIHZpc3VhbGl6YXRpb25zIGFuZCBgc3VtbWFyaXplYCBmb3JcbiAgLy8gb2ZmbG9hZGluZyB0ZXh0IGNvbmRlbnNpbmcgdG8gdGhlIGZhc3QgLyBzbWFsbCBjaGF0IHRpZXIuIFRoZVxuICAvLyB1c2VyIGNhbiBzaGFkb3cgZWl0aGVyIGJ5IGluY2x1ZGluZyBhIHNhbWUtbmFtZWQgdG9vbCBpbiB0aGVpciBvd25cbiAgLy8gYGNvbmZpZy50b29sc2Agb3IgcGVyLWFnZW50IGB0b29sc2AuIE1lcmdlIG9yZGVyIGlzXG4gIC8vIGBzeXN0ZW0gLT4gc3RhbmRhcmQgc2tpbGxzIC0+IHVzZXItYW1iaWVudCAtPiBwZXItYWdlbnRgLCBsYXN0IHdyaXRlIHdpbnMuXG4gIGNvbnN0IGZvbGxvd1VwcyA9IHJlc29sdmVGb2xsb3dVcFN1Z2dlc3Rpb25zQ29uZmlnKGNvbmZpZy5mb2xsb3dVcFN1Z2dlc3Rpb25zKTtcbiAgY29uc3QgZm9sbG93VXBQcm9jZXNzb3IgPSBidWlsZEZvbGxvd1VwU3VnZ2VzdGlvbnNQcm9jZXNzb3IoY29uZmlnKTtcbiAgY29uc3Qgc3lzdGVtVG9vbHM6IE1hc3RyYVRvb2xzID0ge1xuICAgIHJlbmRlcl9kYXRhOiBidWlsZFJlbmRlckRhdGFUb29sKGNvbmZpZyksXG4gICAgc3VtbWFyaXplOiBidWlsZFN1bW1hcml6ZVRvb2woY29uZmlnKSxcbiAgICAuLi4oZm9sbG93VXBzPy5leHBvc2VUb29sICYmIGZvbGxvd1Vwcy5tb2RlICE9PSBcImdlbmllXCJcbiAgICAgID8geyBzdWdnZXN0X2ZvbGxvd191cHM6IGJ1aWxkU3VnZ2VzdEZvbGxvd1Vwc1Rvb2woY29uZmlnKSB9XG4gICAgICA6IHt9KSxcbiAgfTtcbiAgY29uc3Qgc3RhbmRhcmRTa2lsbFRvb2xzID1cbiAgICBzdGFuZGFyZFNraWxscy5sZW5ndGggPiAwID8gY3JlYXRlU2tpbGxUb29scyhyZXNvbHZlQWdlbnRTa2lsbHMoWy4uLnN0YW5kYXJkU2tpbGxzXSkpIDoge307XG4gIGNvbnN0IGFtYmllbnRUb29scyA9IHtcbiAgICAuLi5zeXN0ZW1Ub29scyxcbiAgICAuLi5zdGFuZGFyZFNraWxsVG9vbHMsXG4gICAgLi4uKGNvbmZpZy50b29scyA/PyB7fSksXG4gIH07XG4gIGNvbnN0IHN0eWxlID0gcmVzb2x2ZVN0eWxlSW5zdHJ1Y3Rpb25zKGNvbmZpZyk7XG4gIC8vIERlZmF1bHQtb24gcHJvdGVjdGlvbiBhZ2FpbnN0IHRoZSBtb2RlbCBjb3B5aW5nIHR1cm4tc2NvcGVkXG4gIC8vIGNoYXJ0SWRzIGZyb20gcHJpb3IgYXNzaXN0YW50IHRvb2wgcmVzdWx0cyBpbnRvIHRoZSBuZXdcbiAgLy8gdHVybidzIGBbY2hhcnQ6PGlkPl1gIG1hcmtlcnMuIE9wdCBvdXQgcGVyLXBsdWdpbiB2aWFcbiAgLy8gYGNvbmZpZy5zdHJpcFN0YWxlQ2hhcnRzOiBmYWxzZWAuXG4gIGNvbnN0IGlucHV0UHJvY2Vzc29ycyA9IFtcbiAgICAvLyBgcmVuZGVyX2RhdGFgIGNhbiBjYXJyeSBodW5kcmVkcyBvZiBpbmxpbmUgcm93cy4gS2VlcCB0aGUgY29tcGxldGUgY2FsbFxuICAgIC8vIGluIE1lbW9yeSBhbmQgdGhlIFVJIHRyYW5zY3JpcHQsIGJ1dCB1c2UgTWFzdHJhJ3MgbmF0aXZlIHByb21wdC1zdGFnZVxuICAgIC8vIGZpbHRlciB0byBvbWl0IHByaW9yIGNhbGxzL3Jlc3VsdHMgZnJvbSBsYXRlciBtb2RlbCByZXF1ZXN0cy4gQ3VycmVudFxuICAgIC8vIHR1cm4gY2FsbHMgcmVtYWluIGF2YWlsYWJsZSB0byB0aGUgYWdlbnQgbG9vcC5cbiAgICBuZXcgVG9vbENhbGxGaWx0ZXIoeyBleGNsdWRlOiBbXCJyZW5kZXJfZGF0YVwiXSB9KSxcbiAgICAuLi4oY29uZmlnLnN0cmlwU3RhbGVDaGFydHMgPT09IGZhbHNlID8gW10gOiBbc3RyaXBTdGFsZUNoYXJ0c1Byb2Nlc3Nvcl0pLFxuICBdO1xuICBjb25zdCBhZ2VudHM6IFJlY29yZDxzdHJpbmcsIEFnZW50PiA9IHt9O1xuICBjb25zdCBkZWZhdWx0TW9kZWxzOiBSZWNvcmQ8c3RyaW5nLCBBZ2VudERlZmF1bHRNb2RlbD4gPSB7fTtcbiAgY29uc3QgYXBwcm92YWxHYXRlZEJ5QWdlbnQ6IEFycmF5PHsgYWdlbnRJZDogc3RyaW5nOyB0b29sSWRzOiBzdHJpbmdbXSB9PiA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2lkLCBkZWZdIG9mIE9iamVjdC5lbnRyaWVzKGRlZmluaXRpb25zKSkge1xuICAgIGNvbnN0IHVzZXJUb29scyA9IGF3YWl0IHJlc29sdmVVc2VyVG9vbHMoZGVmLnRvb2xzLCBwbHVnaW5zKTtcbiAgICBjb25zdCB0b29scyA9IHsgLi4uYW1iaWVudFRvb2xzLCAuLi51c2VyVG9vbHMgfTtcbiAgICBsZXQgd29ya3NwYWNlID0gcmVzb2x2ZUFnZW50V29ya3NwYWNlKGRlZi53b3Jrc3BhY2UpO1xuICAgIGlmIChcbiAgICAgIChkZWYud29ya3NwYWNlID09PSB1bmRlZmluZWQgJiYgIXdvcmtzcGFjZSkgfHxcbiAgICAgICgoZXh0cmFTa2lsbE1vdW50cz8ubGVuZ3RoIHx8XG4gICAgICAgIGNvbmZpZy5zYW5kYm94ICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgY29uZmlnLndvcmtzcGFjZUZhbGxiYWNrVG9UbXAgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBjb25maWcud29ya3NwYWNlVG9vbHMgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBjb250ZXh0ICE9PSB1bmRlZmluZWQpICYmXG4gICAgICAgIGlzRGVmYXVsdFdvcmtzcGFjZSh3b3Jrc3BhY2UpKVxuICAgICkge1xuICAgICAgd29ya3NwYWNlID0gZGF0YWJyaWNrc1dvcmtzcGFjZSh7XG4gICAgICAgIGV4dHJhU2tpbGxNb3VudHMsXG4gICAgICAgIGV4Y2x1ZGVTa2lsbE5hbWVzOiBleGNsdWRlZFdvcmtzcGFjZVNraWxsTmFtZXMsXG4gICAgICAgIGZhbGxiYWNrVG9UbXA6IGNvbmZpZy53b3Jrc3BhY2VGYWxsYmFja1RvVG1wLFxuICAgICAgICAuLi4oY29uZmlnLndvcmtzcGFjZVRvb2xzICE9PSB1bmRlZmluZWQgPyB7IHRvb2xzOiBjb25maWcud29ya3NwYWNlVG9vbHMgfSA6IHt9KSxcbiAgICAgICAgcGx1Z2luQ29udGV4dDogY29udGV4dCxcbiAgICAgICAgc2FuZGJveDogY29uZmlnLnNhbmRib3gsXG4gICAgICB9KTtcbiAgICAgIG1hcmtEZWZhdWx0V29ya3NwYWNlKHdvcmtzcGFjZSk7XG4gICAgfSBlbHNlIGlmICh3b3Jrc3BhY2UpIHtcbiAgICAgIHdvcmtzcGFjZSA9IGJpbmREYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCh3b3Jrc3BhY2UsIGNvbnRleHQsIGV4Y2x1ZGVkV29ya3NwYWNlU2tpbGxOYW1lcyk7XG4gICAgfVxuICAgIGNvbnN0IGdhdGVkID0gYXBwcm92YWxHYXRlZFRvb2xJZHModG9vbHMpO1xuICAgIGlmIChnYXRlZC5sZW5ndGggPiAwKSBhcHByb3ZhbEdhdGVkQnlBZ2VudC5wdXNoKHsgYWdlbnRJZDogaWQsIHRvb2xJZHM6IGdhdGVkIH0pO1xuICAgIGNvbnN0IG1lbW9yeSA9IG1lbW9yeUJ1aWxkZXI/LmZvckFnZW50KGlkLCBkZWYpO1xuICAgIGNvbnN0IHJlc29sdmVDb2RlTW9kZSA9IGNvZGVNb2RlUmVzb2x2ZXIoY29kZU1vZGVDb25maWcsIHRvb2xzLCB3b3Jrc3BhY2UpO1xuICAgIGNvbnN0IGFnZW50ID0gbmV3IEFnZW50KHtcbiAgICAgIGlkLFxuICAgICAgbmFtZTogZGVmLm5hbWUgPz8gaWQsXG4gICAgICAvLyBBbHdheXMgY2FycnkgYSBub24tZW1wdHkgZGVzY3JpcHRpb246IGl0J3Mgc3VyZmFjZWQgdG8gTUNQXG4gICAgICAvLyBjbGllbnRzICh3aGljaCByZWplY3QgYSBkZXNjcmlwdGlvbi1sZXNzIGFnZW50KSBhbmQgaW4gYWdlbnRcbiAgICAgIC8vIG1ldGFkYXRhLiBGYWxsIGJhY2sgdG8gYSBnZW5lcmF0ZWQgb25lIHdoZW4gdGhlIGRlZmluaXRpb25cbiAgICAgIC8vIG9taXRzIGl0LlxuICAgICAgZGVzY3JpcHRpb246IGRlZi5kZXNjcmlwdGlvbj8udHJpbSgpIHx8IGRlZmF1bHRBZ2VudERlc2NyaXB0aW9uKGRlZi5uYW1lID8/IGlkKSxcbiAgICAgIGluc3RydWN0aW9uczogY29tcG9zZUluc3RydWN0aW9ucyhkZWYuaW5zdHJ1Y3Rpb25zLCBzdHlsZSwgcmVzb2x2ZUNvZGVNb2RlKSxcbiAgICAgIC4uLihkZWYucmVxdWVzdENvbnRleHRTY2hlbWEgPyB7IHJlcXVlc3RDb250ZXh0U2NoZW1hOiBkZWYucmVxdWVzdENvbnRleHRTY2hlbWEgfSA6IHt9KSxcbiAgICAgIG1vZGVsOiByZXNvbHZlTW9kZWwoY29uZmlnLCBkZWYubW9kZWwpLFxuICAgICAgZGVmYXVsdE9wdGlvbnM6ICh7IHJlcXVlc3RDb250ZXh0IH0pID0+XG4gICAgICAgIHdpdGhSZXF1ZXN0TWVtb3J5U2NvcGUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgbWF4U3RlcHM6IGNvbmZpZy5hZ2VudE1heFN0ZXBzID8/IERFRkFVTFRfQUdFTlRfTUFYX1NURVBTLFxuICAgICAgICAgICAgcHJvdmlkZXJPcHRpb25zOiBSRVNQT05TRVNfUFJPVklERVJfT1BUSU9OUyxcbiAgICAgICAgICAgIC4uLihkZWYucmVxdWlyZVRvb2xBcHByb3ZhbCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8geyByZXF1aXJlVG9vbEFwcHJvdmFsOiBkZWYucmVxdWlyZVRvb2xBcHByb3ZhbCB9XG4gICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWVtb3J5ID8gcmVxdWVzdENvbnRleHQgOiB1bmRlZmluZWQsXG4gICAgICAgICksXG4gICAgICB0b29sczogcmVzb2x2ZUNvZGVNb2RlXG4gICAgICAgID8gYXN5bmMgKGFyZ3MpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvZGVNb2RlID0gYXdhaXQgcmVzb2x2ZUNvZGVNb2RlKGFyZ3MpO1xuICAgICAgICAgICAgcmV0dXJuIGNvZGVNb2RlID8geyAuLi50b29scywgW2NvZGVNb2RlLnRvb2wuaWRdOiBjb2RlTW9kZS50b29sIH0gOiB0b29scztcbiAgICAgICAgICB9XG4gICAgICAgIDogdG9vbHMsXG4gICAgICAuLi4obWVtb3J5ID8geyBtZW1vcnkgfSA6IHt9KSxcbiAgICAgIC4uLih3b3Jrc3BhY2UgPyB7IHdvcmtzcGFjZSB9IDoge30pLFxuICAgICAgaW5wdXRQcm9jZXNzb3JzOiBbLi4uaW5wdXRQcm9jZXNzb3JzLCAuLi53b3Jrc3BhY2VTa2lsbElucHV0UHJvY2Vzc29ycyh3b3Jrc3BhY2UsIGNvbmZpZyldLFxuICAgICAgb3V0cHV0UHJvY2Vzc29yczogW1xuICAgICAgICB0b29sRXJyb3JMb2dnaW5nUHJvY2Vzc29yKGxvZyksXG4gICAgICAgIC4uLihmb2xsb3dVcFByb2Nlc3NvciA/IFtmb2xsb3dVcFByb2Nlc3Nvcl0gOiBbXSksXG4gICAgICAgIC4uLm91dHB1dFByb2Nlc3NvckZhY3Rvcmllcy5mbGF0TWFwKChmYWN0b3J5KSA9PiB7XG4gICAgICAgICAgY29uc3QgcHJvY2Vzc29yID0gZmFjdG9yeShpZCk7XG4gICAgICAgICAgcmV0dXJuIHByb2Nlc3NvciA/IFtwcm9jZXNzb3JdIDogW107XG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBhZ2VudHNbaWRdID1cbiAgICAgIGNvbmZpZy5iYWNrZ3JvdW5kVHVybnMgPT09IGZhbHNlXG4gICAgICAgID8gYWdlbnRcbiAgICAgICAgOiBjcmVhdGVCYWNrZ3JvdW5kQWdlbnQoYWdlbnQsIGNvbmZpZy5hZ2VudE1heFN0ZXBzID8/IERFRkFVTFRfQUdFTlRfTUFYX1NURVBTKTtcbiAgICAvLyBTdXJmYWNlIHRoZSBlZmZlY3RpdmUgZGVmYXVsdCBtb2RlbCBwZXIgYWdlbnQgc28gb3BlcmF0b3JzIGNhblxuICAgIC8vIHNlZSBhdCBhIGdsYW5jZSB3aGljaCBlbmRwb2ludCBlYWNoIGFnZW50IHBvaW50cyBhdCB3aXRob3V0XG4gICAgLy8gaGF2aW5nIHRvIGZpcmUgYSByZXF1ZXN0IGFuZCBpbnNwZWN0IGEgdHJhY2UuIFRoZSB2YWx1ZSBpcyB0aGVcbiAgICAvLyAqc3RhdGljKiBkZWZhdWx0OyBwZXItcmVxdWVzdCBvdmVycmlkZXMgKGhlYWRlciAvIHF1ZXJ5IC9cbiAgICAvLyBib2R5KSBhbmQgdGhlIHdvcmtzcGFjZS1jYXRhbG9ndWUgZnV6enkgbWF0Y2ggc3RpbGwgYXBwbHkgYXRcbiAgICAvLyBjYWxsIHRpbWUuXG4gICAgY29uc3QgZGVmYXVsdE1vZGVsID0gZGVzY3JpYmVBZ2VudERlZmF1bHRNb2RlbChjb25maWcsIGRlZik7XG4gICAgZGVmYXVsdE1vZGVsc1tpZF0gPSBkZWZhdWx0TW9kZWw7XG4gICAgbG9nLmluZm8oXCJhZ2VudCByZWdpc3RlcmVkXCIsIHtcbiAgICAgIGlkLFxuICAgICAgbmFtZTogZGVmLm5hbWUgPz8gaWQsXG4gICAgICBkZWZhdWx0TW9kZWw6XG4gICAgICAgIGRlZmF1bHRNb2RlbC5raW5kID09PSBcImNvbmZpZ3VyZWRcIiA/IGRlZmF1bHRNb2RlbC5tb2RlbCA6IGA8JHtkZWZhdWx0TW9kZWwua2luZH0+YCxcbiAgICAgIHRvb2xzOiBbLi4uT2JqZWN0LmtleXModG9vbHMpLCAuLi4ocmVzb2x2ZUNvZGVNb2RlID8gW1wiPGR5bmFtaWMtY29kZS1tb2RlPlwiXSA6IFtdKV0sXG4gICAgfSk7XG4gIH1cblxuICBpZiAoIWFnZW50c1tkZWZhdWx0QWdlbnRJZF0pIHtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IucmVzb3VyY2VOb3RGb3VuZChcbiAgICAgIGBtYXN0cmEgZGVmYXVsdEFnZW50IFwiJHtkZWZhdWx0QWdlbnRJZH1cImAsXG4gICAgICBgUmVnaXN0ZXJlZCBhZ2VudHM6ICR7aWRzLmpvaW4oXCIsIFwiKSB8fCBcIm5vbmVcIn0uYCxcbiAgICApO1xuICB9XG5cbiAgYXNzZXJ0QXBwcm92YWxHYXRlZFRvb2xzSGF2ZVN0b3JhZ2UoYXBwcm92YWxHYXRlZEJ5QWdlbnQsIG1lbW9yeUJ1aWxkZXIpO1xuXG4gIGxvZy5pbmZvKFwiYWdlbnRzIHJlYWR5XCIsIHsgaWRzLCBkZWZhdWx0QWdlbnRJZCB9KTtcbiAgcmV0dXJuIHsgYWdlbnRzLCBkZWZhdWx0QWdlbnRJZCwgZGVmYXVsdE1vZGVscywgYW1iaWVudFRvb2xzIH07XG59XG5cbi8qKiBMb2cgZmFpbGVkIHRvb2wgY2FsbHMgd2l0aG91dCBjaGFuZ2luZyB0aGUgY2h1bmtzIHJldHVybmVkIHRvIHRoZSBjbGllbnQuICovXG5mdW5jdGlvbiB0b29sRXJyb3JMb2dnaW5nUHJvY2Vzc29yKGxvZ2dlcjogbG9nLkxvZ2dlcik6IE91dHB1dFByb2Nlc3NvciB7XG4gIHJldHVybiB7XG4gICAgaWQ6IFwidG9vbC1lcnJvci1sb2dnZXJcIixcbiAgICBhc3luYyBwcm9jZXNzT3V0cHV0U3RyZWFtKHsgcGFydCB9KSB7XG4gICAgICBpZiAocGFydC50eXBlID09PSBcInRvb2wtZXJyb3JcIikge1xuICAgICAgICBjb25zdCBlcnJvciA9IGVycm9yVXRpbHMudG9FcnJvcihwYXJ0LnBheWxvYWQuZXJyb3IpO1xuICAgICAgICBsb2dnZXIuZXJyb3IoXCJ0b29sIGV4ZWN1dGlvbiBmYWlsZWRcIiwge1xuICAgICAgICAgIHRvb2xOYW1lOiBwYXJ0LnBheWxvYWQudG9vbE5hbWUsXG4gICAgICAgICAgdG9vbENhbGxJZDogcGFydC5wYXlsb2FkLnRvb2xDYWxsSWQsXG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhcnQ7XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gd29ya3NwYWNlU2tpbGxJbnB1dFByb2Nlc3NvcnMoXG4gIHdvcmtzcGFjZTogV29ya3NwYWNlIHwgdW5kZWZpbmVkLFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbik6IFNraWxsU2VhcmNoUHJvY2Vzc29yW10ge1xuICBpZiAoIXdvcmtzcGFjZSB8fCBjb25maWcud29ya3NwYWNlU2tpbGxzID09PSBmYWxzZSkgcmV0dXJuIFtdO1xuICBjb25zdCBvcHRpb25zID0gdHlwZW9mIGNvbmZpZy53b3Jrc3BhY2VTa2lsbHMgPT09IFwib2JqZWN0XCIgPyBjb25maWcud29ya3NwYWNlU2tpbGxzIDogdW5kZWZpbmVkO1xuICBpZiAoIXdvcmtzcGFjZS5za2lsbHMpIHJldHVybiBbXTtcbiAgcmV0dXJuIFtcbiAgICBuZXcgU2tpbGxTZWFyY2hQcm9jZXNzb3Ioe1xuICAgICAgd29ya3NwYWNlLFxuICAgICAgc2VhcmNoOiB7XG4gICAgICAgIHRvcEs6IG9wdGlvbnM/LnRvcEsgPz8gNSxcbiAgICAgICAgbWluU2NvcmU6IG9wdGlvbnM/Lm1pblNjb3JlID8/IDAuMSxcbiAgICAgIH0sXG4gICAgICAuLi4ob3B0aW9ucz8udHRsTXMgIT09IHVuZGVmaW5lZCA/IHsgdHRsOiBvcHRpb25zLnR0bE1zIH0gOiB7fSksXG4gICAgICBibG9ja2luZ1JlZnJlc2g6IGZhbHNlLFxuICAgIH0pLFxuICBdO1xufVxuXG4vKipcbiAqIFRvb2wgaWRzIG9uIGB0b29sc2AgdGhhdCBhcmUgYXBwcm92YWwtZ2F0ZWQgKGByZXF1aXJlQXBwcm92YWw6IHRydWVgKS5cbiAqIEtleXMgYXJlIHVzZWQgYXMgYSBmYWxsYmFjayB3aGVuIGEgdG9vbCBvbWl0cyBhbiBleHBsaWNpdCBgaWRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXBwcm92YWxHYXRlZFRvb2xJZHModG9vbHM6IE1hc3RyYVRvb2xzKTogc3RyaW5nW10ge1xuICBpZiAoIXRvb2xzIHx8IHR5cGVvZiB0b29scyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIFtdO1xuICByZXR1cm4gW1xuICAgIC4uLm9iamVjdFxuICAgICAgLnNlcXVlbmNlKE9iamVjdC5lbnRyaWVzKHRvb2xzKSlcbiAgICAgIC5maWx0ZXIoKFssIHRvb2xdKSA9PiBpc0FwcHJvdmFsR2F0ZWRUb29sKHRvb2wpKVxuICAgICAgLm1hcCgoW2tleSwgdG9vbF0pID0+IHJlc29sdmVUb29sSWQodG9vbCwga2V5KSksXG4gIF07XG59XG5cbi8qKiBUcnVlIHdoZW4gYSBNYXN0cmEgLyBBSSBTREsgdG9vbCBwYXVzZXMgZm9yIGh1bWFuIGFwcHJvdmFsIGJlZm9yZSBleGVjdXRlLiAqL1xuZnVuY3Rpb24gaXNBcHByb3ZhbEdhdGVkVG9vbCh0b29sOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghdG9vbCB8fCB0eXBlb2YgdG9vbCAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gKHRvb2wgYXMgeyByZXF1aXJlQXBwcm92YWw/OiBib29sZWFuIH0pLnJlcXVpcmVBcHByb3ZhbCA9PT0gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVRvb2xJZCh0b29sOiB1bmtub3duLCBmYWxsYmFja0tleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHRvb2wgJiYgdHlwZW9mIHRvb2wgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mICh0b29sIGFzIHsgaWQ/OiBzdHJpbmcgfSkuaWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gKHRvb2wgYXMgeyBpZDogc3RyaW5nIH0pLmlkO1xuICB9XG4gIHJldHVybiBmYWxsYmFja0tleTtcbn1cblxuLyoqXG4gKiBBcHByb3ZhbC1nYXRlZCB0b29scyBzdXNwZW5kIHRoZSBhZ2VudCBsb29wIHVudGlsIGEgaHVtYW4gYXBwcm92ZXMuXG4gKiBNYXN0cmEgcGVyc2lzdHMgdGhvc2Ugc3VzcGVuZGVkIHJ1bnMgaW4gTWFzdHJhLWluc3RhbmNlLWxldmVsIHN0b3JhZ2VcbiAqIChgbWVtb3J5QnVpbGRlci5pbnN0YW5jZVN0b3JhZ2UoKWApLCBub3QgcGVyLWFnZW50IG1lbW9yeSAtIHNvIGJvb3RcbiAqIG11c3QgZmFpbCBmYXN0IHdoZW4gc3VjaCBhIHRvb2wgaXMgcmVnaXN0ZXJlZCB3aXRob3V0IHN0b3JhZ2UuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydEFwcHJvdmFsR2F0ZWRUb29sc0hhdmVTdG9yYWdlKFxuICBnYXRlZDogQXJyYXk8eyBhZ2VudElkOiBzdHJpbmc7IHRvb2xJZHM6IHN0cmluZ1tdIH0+LFxuICBtZW1vcnlCdWlsZGVyOiBNZW1vcnlCdWlsZGVyIHwgdW5kZWZpbmVkLFxuKTogdm9pZCB7XG4gIGlmIChnYXRlZC5sZW5ndGggPT09IDApIHJldHVybjtcbiAgaWYgKG1lbW9yeUJ1aWxkZXI/Lmluc3RhbmNlU3RvcmFnZSgpKSByZXR1cm47XG5cbiAgY29uc3QgZGV0YWlsID0gZ2F0ZWRcbiAgICAubWFwKCh7IGFnZW50SWQsIHRvb2xJZHMgfSkgPT4gYCR7YWdlbnRJZH06ICR7dG9vbElkcy5qb2luKFwiLCBcIil9YClcbiAgICAuam9pbihcIjsgXCIpO1xuICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFxuICAgIFwibWFzdHJhOiBhcHByb3ZhbC1nYXRlZCB0b29scyByZXF1aXJlIHBsdWdpbiBzdG9yYWdlIChQb3N0Z3Jlc1N0b3JlKSB0byBwZXJzaXN0IHN1c3BlbmRlZCBydW5zLiBcIiArXG4gICAgICBgQWZmZWN0ZWQgYWdlbnRzL3Rvb2xzOiAke2RldGFpbH0uIGAgK1xuICAgICAgXCJSZWdpc3RlciBsYWtlYmFzZSgpIGJlZm9yZSBtYXN0cmEoKSBzbyBzdG9yYWdlIGF1dG8tZW5hYmxlcywgb3IgcGFzcyBzdG9yYWdlOiB0cnVlIGV4cGxpY2l0bHkuXCIsXG4gICk7XG59XG5cbi8qKlxuICogRGVzY3JpYmUgaG93IGFuIGFnZW50IHJlc29sdmVzIGl0cyB1bnBpbm5lZCBtb2RlbDpcbiAqXG4gKiAgIDEuIFBlci1hZ2VudCBgZGVmLm1vZGVsYCAoc3RyaW5nIHN1Z2FyIGlzIGNvbmZpZ3VyZWQ7IGEgZnVuY3Rpb24gaXNcbiAqICAgICAgZHluYW1pYykuXG4gKiAgIDIuIFBsdWdpbi1sZXZlbCBgY29uZmlnLmRlZmF1bHRNb2RlbGAgKHNhbWUgcnVsZXMpLlxuICogICAzLiBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgIGVudiB2YXIuXG4gKiAgIDQuIEF1dG9tYXRpYyBsaXZlLWNhdGFsb2d1ZSByYW5raW5nIHdoZW4gbm9uZSBpcyBzZXQuXG4gKlxuICogVXNlZCBmb3IgdGhlIHN0YXJ0dXAgYGFnZW50IHJlZ2lzdGVyZWRgIGxvZyBzbyBvcGVyYXRvcnMgY2FuIHNlZVxuICogYGRlZmF1bHRNb2RlbEZhbGxiYWNrc2AgcmVtYWlucyBhbiBvcGVyYXRvci1waW5uZWQgY2FuZGlkYXRlIGxpc3QgaW5zaWRlIHRoZVxuICogYXV0b21hdGljIGxpdmUgbG9va3VwOyBpdCBpcyBub3QgYWR2ZXJ0aXNlZCBhcyBhIG1vZGVsIHVudGlsIGF2YWlsYWJpbGl0eSBpc1xuICogY2hlY2tlZC5cbiAqL1xuZnVuY3Rpb24gZGVzY3JpYmVBZ2VudERlZmF1bHRNb2RlbChcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIGRlZjogQW55TWFzdHJhQWdlbnREZWZpbml0aW9uLFxuKTogQWdlbnREZWZhdWx0TW9kZWwge1xuICBjb25zdCBlZmZlY3RpdmUgPSBkZWYubW9kZWwgPz8gY29uZmlnLmRlZmF1bHRNb2RlbDtcbiAgaWYgKHR5cGVvZiBlZmZlY3RpdmUgPT09IFwic3RyaW5nXCIpIHJldHVybiB7IGtpbmQ6IFwiY29uZmlndXJlZFwiLCBtb2RlbDogZWZmZWN0aXZlIH07XG4gIGlmIChlZmZlY3RpdmUgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHsga2luZDogXCJkeW5hbWljXCIgfTtcbiAgY29uc3QgZW52aXJvbm1lbnQgPSBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRTtcbiAgcmV0dXJuIGVudmlyb25tZW50ID8geyBraW5kOiBcImNvbmZpZ3VyZWRcIiwgbW9kZWw6IGVudmlyb25tZW50IH0gOiB7IGtpbmQ6IFwiYXV0b1wiIH07XG59XG5cbi8qKlxuICogTm9ybWFsaXplIGBjb25maWcuYWdlbnRzYCBpbnRvIGEgYFJlY29yZDxpZCwgZGVmaW5pdGlvbj5gLiBBY2NlcHRzXG4gKiBhbnkgb2YgdGhlIHRocmVlIHNoYXBlcyBkb2N1bWVudGVkIG9uXG4gKiB7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnLmFnZW50c306XG4gKlxuICogLSBSZWNvcmQgLSByZXR1cm5lZCBhcy1pcyB3aGVuIG5vbi1lbXB0eS5cbiAqIC0gU2luZ2xlIGRlZmluaXRpb24gKGRldGVjdGVkIHZpYSB0aGUgcmVxdWlyZWQgYGluc3RydWN0aW9uc2BcbiAqICAgZmllbGQpIC0ga2V5ZWQgYnkgYHNsdWdpZnkoZGVmLm5hbWUpYCBvciBgRkFMTEJBQ0tfQUdFTlRfSURgLlxuICogLSBBcnJheSAtIGtleWVkIGJ5IGBzbHVnaWZ5KGRlZi5uYW1lKWAgb3IgYGFnZW50XyR7aX1gOyBkdXBsaWNhdGVcbiAqICAgc2x1Z3MgZmFpbCBsb3VkbHkgc28gdXNlcnMga25vdyB0byBzZXQgZXhwbGljaXQgbmFtZXMuXG4gKlxuICogT21pdHRlZCBvciBlbXB0eSBpbnB1dHMgZmFsbCBiYWNrIHRvIGEgc2luZ2xlIGJ1aWx0LWluIGFuYWx5c3Qgc29cbiAqIHRoZSBiYXJlIGBtYXN0cmEoKWAgY2FsbCBzdGlsbCBtb3VudHMgYSB3b3JraW5nIGNoYXQgcm91dGUuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVEZWZpbml0aW9ucyhjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyk6IFJlY29yZDxzdHJpbmcsIEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbj4ge1xuICBjb25zdCBpbnB1dCA9IGNvbmZpZy5hZ2VudHM7XG4gIGlmICghaW5wdXQpIHJldHVybiBmYWxsYmFja0RlZmluaXRpb25zKCk7XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoaW5wdXQpKSB7XG4gICAgaWYgKGlucHV0Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbGxiYWNrRGVmaW5pdGlvbnMoKTtcbiAgICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbj4gPSB7fTtcbiAgICBpbnB1dC5mb3JFYWNoKChkZWYsIGkpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGRlcml2ZUFnZW50S2V5KGRlZiwgaSk7XG4gICAgICBpZiAob3V0W2tleV0pIHtcbiAgICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihcbiAgICAgICAgICBgbWFzdHJhOiBkdXBsaWNhdGUgYWdlbnQgaWQgXCIke2tleX1cIiBkZXJpdmVkIGZyb20gbmFtZSBcIiR7ZGVmLm5hbWUgPz8gXCJcIn1cIjsgYCArXG4gICAgICAgICAgICBgc2V0IHVuaXF1ZSBcXGBuYW1lXFxgcyBvbiBlYWNoIGRlZmluaXRpb25gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgb3V0W2tleV0gPSBkZWY7XG4gICAgfSk7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuXG4gIC8vIFNpbmdsZS1kZWZpbml0aW9uIHNob3J0aGFuZDogYW4gYWdlbnQgb3ducyB0aGUgcmVxdWlyZWQgYGluc3RydWN0aW9uc2BcbiAgLy8gZmllbGQgKHN0YXRpYyBvciBkeW5hbWljKTsgYSByZWNvcmQtb2YtYWdlbnRzIG5ldmVyIG93bnMgaXQgZGlyZWN0bHkuXG4gIGlmIChcImluc3RydWN0aW9uc1wiIGluIGlucHV0KSB7XG4gICAgY29uc3QgZGVmID0gaW5wdXQgYXMgQW55TWFzdHJhQWdlbnREZWZpbml0aW9uO1xuICAgIGNvbnN0IGtleSA9IGRlcml2ZUFnZW50S2V5KGRlZik7XG4gICAgcmV0dXJuIHsgW2tleV06IGRlZiB9O1xuICB9XG5cbiAgY29uc3QgcmVjb3JkID0gaW5wdXQgYXMgUmVjb3JkPHN0cmluZywgQW55TWFzdHJhQWdlbnREZWZpbml0aW9uPjtcbiAgaWYgKE9iamVjdC5rZXlzKHJlY29yZCkubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsbGJhY2tEZWZpbml0aW9ucygpO1xuICByZXR1cm4gcmVjb3JkO1xufVxuXG4vKiogRGVyaXZlIGEgcmVnaXN0cnkgaWQgZnJvbSBhIGRlZmluaXRpb24ncyBgbmFtZWAsIHdpdGggYSBmYWxsYmFjay4gKi9cbmZ1bmN0aW9uIGRlcml2ZUFnZW50S2V5KGRlZjogQW55TWFzdHJhQWdlbnREZWZpbml0aW9uLCBpbmRleD86IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChkZWYubmFtZSkge1xuICAgIGNvbnN0IHNsdWcgPSBzdHJpbmdVdGlscy50b0lkZW50aWZpZXIoZGVmLm5hbWUpO1xuICAgIGlmIChzbHVnKSByZXR1cm4gc2x1ZztcbiAgfVxuICByZXR1cm4gaW5kZXggPT09IHVuZGVmaW5lZCA/IEZBTExCQUNLX0FHRU5UX0lEIDogYGFnZW50XyR7aW5kZXh9YDtcbn1cblxuLyoqIEJ1aWx0LWluIGZhbGxiYWNrIHJlZ2lzdHJ5IHVzZWQgd2hlbiBgYWdlbnRzYCBpcyBvbWl0dGVkIC8gZW1wdHkuICovXG5mdW5jdGlvbiBmYWxsYmFja0RlZmluaXRpb25zKCk6IFJlY29yZDxzdHJpbmcsIEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbj4ge1xuICByZXR1cm4ge1xuICAgIFtGQUxMQkFDS19BR0VOVF9JRF06IHtcbiAgICAgIG5hbWU6IFwiRGVmYXVsdCBBZ2VudFwiLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiBGQUxMQkFDS19BR0VOVF9JTlNUUlVDVElPTlMsXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSBlZmZlY3RpdmUgbW9kZWwgc3BlYyBmb3IgYW4gYWdlbnQuIEZhbGxiYWNrIGxhZGRlciwgaW5cbiAqIG9yZGVyOlxuICpcbiAqICAgMS4gUGVyLWFnZW50IGBkZWYubW9kZWxgIChzdHJpbmcgc3VnYXIgb3IgYER5bmFtaWNBcmd1bWVudGApLlxuICogICAyLiBQbHVnaW4tbGV2ZWwgYGNvbmZpZy5kZWZhdWx0TW9kZWxgIChzdHJpbmcgc3VnYXIgb3JcbiAqICAgICAgYER5bmFtaWNBcmd1bWVudGApIC0gbWlycm9ycyBBcHBLaXQncyBgYWdlbnRzKHsgZGVmYXVsdE1vZGVsIH0pYC5cbiAqICAgMy4gVGhlIGF1dG8tcmVzb2x2ZXIgdGhhdCBtaW50cyB1c2VyLXNjb3BlZCB0b2tlbnMgYWdhaW5zdFxuICogICAgICBgL3NlcnZpbmctZW5kcG9pbnRzYCB2aWEge0BsaW5rIGJ1aWxkTW9kZWx9LlxuICpcbiAqIFN0cmluZyB2YWx1ZXMgYXJlIHRyZWF0ZWQgYXMgYG1vZGVsSWRgIHN1Z2FyIGFuZCB0aHJlYWRlZCB0aHJvdWdoXG4gKiBgYnVpbGRNb2RlbGAncyBvdmVycmlkZSBob29rIHNvIHRoZSBydW50aW1lIGZ1enp5IG1hdGNoZXIgYW5kIHRoZVxuICogcGVyLXJlcXVlc3QgYFgtTWFzdHJhLU1vZGVsYCBvdmVycmlkZSBsYXllciBvbiB0b3Agb2YgdGhlIHN0YXRpY1xuICogY2hvaWNlLiBOb24tc3RyaW5nIGBEeW5hbWljQXJndW1lbnRgcyBhcmUgcGFzc2VkIHRocm91Z2ggdmVyYmF0aW07XG4gKiBjYWxsZXJzIHRoYXQgbmVlZCBmdWxsIGNvbnRyb2wgb3ZlciBgcHJvdmlkZXJJZGAgLyBgaGVhZGVyc2AgL1xuICogYG1vZGVsSWRgIGJ5cGFzcyB0aGUgcmVzb2x2ZXIgcGlwZWxpbmUgZW50aXJlbHkuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVNb2RlbChcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIG92ZXJyaWRlOiBBbnlNYXN0cmFBZ2VudERlZmluaXRpb25bXCJtb2RlbFwiXSxcbik6IEFnZW50Q29uZmlnW1wibW9kZWxcIl0ge1xuICBjb25zdCBlZmZlY3RpdmUgPSBvdmVycmlkZSA/PyBjb25maWcuZGVmYXVsdE1vZGVsO1xuICBpZiAoZWZmZWN0aXZlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gKHsgcmVxdWVzdENvbnRleHQgfSkgPT4gYnVpbGRNb2RlbChjb25maWcsIHJlcXVlc3RDb250ZXh0KTtcbiAgfVxuICBpZiAodHlwZW9mIGVmZmVjdGl2ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IG1vZGVsSWQgPSBlZmZlY3RpdmU7XG4gICAgcmV0dXJuICh7IHJlcXVlc3RDb250ZXh0IH0pID0+IGJ1aWxkTW9kZWwoY29uZmlnLCByZXF1ZXN0Q29udGV4dCwgeyBtb2RlbElkIH0pO1xuICB9XG4gIHJldHVybiBlZmZlY3RpdmU7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBvbmx5IHRoZSB0b29scyBleHBsaWNpdGx5IHN1cHBsaWVkIGJ5IG9uZSBhZ2VudCBkZWZpbml0aW9uLlxuICogQ2FsbGJhY2sgZXJyb3JzIHByb3BhZ2F0ZSB2ZXJiYXRpbSBzbyB0aGUgb3JpZ2luYWwgc3RhY2sgc3Vydml2ZXMgLSB0aGVcbiAqIGNhbGxlciBhbHJlYWR5IGtub3dzIHdoaWNoIGFnZW50IHdhcyByZWdpc3RlcmluZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVVzZXJUb29scyhcbiAgZGVmVG9vbHM6IEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbltcInRvb2xzXCJdLFxuICBwbHVnaW5zOiBNYXN0cmFQbHVnaW5zLFxuKTogUHJvbWlzZTxNYXN0cmFUb29scz4ge1xuICBpZiAoIWRlZlRvb2xzKSByZXR1cm4ge307XG4gIHJldHVybiB0eXBlb2YgZGVmVG9vbHMgPT09IFwiZnVuY3Rpb25cIiA/IGRlZlRvb2xzKHBsdWdpbnMpIDogZGVmVG9vbHM7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVBZ2VudFdvcmtzcGFjZShcbiAgd29ya3NwYWNlOiBBbnlNYXN0cmFBZ2VudERlZmluaXRpb25bXCJ3b3Jrc3BhY2VcIl0sXG4pOiBXb3Jrc3BhY2UgfCB1bmRlZmluZWQge1xuICBpZiAoIXdvcmtzcGFjZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHR5cGVvZiB3b3Jrc3BhY2UgPT09IFwiZnVuY3Rpb25cIiA/IHdvcmtzcGFjZSgpIDogd29ya3NwYWNlO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSB7QGxpbmsgTWFzdHJhUGx1Z2luc30gcnVudGltZSBwcm94eSBoYW5kZWQgdG9cbiAqIGB0b29scyhwbHVnaW5zKWAgY2FsbGJhY2tzLlxuICpcbiAqIEltcGxlbWVudGVkIGFzIGEgYFByb3h5YCBvdmVyIHRoZSBBcHBLaXQgcGx1Z2luIGNvbnRleHQgc29cbiAqIGBwbHVnaW5zLjxuYW1lPmAgcmVzb2x2ZXMgYXQgZmlyc3QgYWNjZXNzLiBBbnkgc2libGluZyBwbHVnaW4gdGhhdFxuICogaW1wbGVtZW50cyBBcHBLaXQncyBzdGFuZGFyZCBgVG9vbFByb3ZpZGVyYCBpbnRlcmZhY2VcbiAqIChgdG9vbGtpdChvcHRzPylgICsgYGV4ZWN1dGVBZ2VudFRvb2wobmFtZSwgYXJncywgc2lnbmFsPywgY29udGV4dD8pYCkgaXNcbiAqIGF1dG8tYWRhcHRlZCBpbnRvIE1hc3RyYSB0b29scy4gVW5rbm93biBuYW1lcyByZXR1cm4gYHVuZGVmaW5lZGAsXG4gKiBtYXRjaGluZyBBcHBLaXQncyBgUGx1Z2luc2Agc2VtYW50aWNzIHNvIGBwbHVnaW5zLmZvbz8udG9vbGtpdCgpYFxuICogcmVtYWlucyBzYWZlIGluIGVudmlyb25tZW50cyB3aGVyZSBgZm9vYCBpc24ndCByZWdpc3RlcmVkLlxuICpcbiAqIGBnZW5pZWAgaXMgc3BlY2lhbC1jYXNlZCB0byBzd2FwIHRoZSBnZW5lcmljIEFwcEtpdCB0b29sa2l0ICh3aGljaFxuICogcnVucyBgZXhlY3V0ZUFnZW50VG9vbGAgYW5kIG9ubHkgZW1pdHMgYSBzaW5nbGUgZmluYWwgYHRvb2wtcmVzdWx0YFxuICogY2h1bmsgcGVyIGNhbGwpIGZvciB0aGUgc3RyZWFtaW5nLWF3YXJlIHRvb2xzIGJ1aWx0IGJ5XG4gKiB7QGxpbmsgYnVpbGRHZW5pZVRvb2xraXRQcm92aWRlcn0uIFRoZSBzdHJlYW1pbmcgdmFyaWFudCBmb3J3YXJkcyBlYWNoXG4gKiBHZW5pZSB3aXJlIGV2ZW50IChzdGF0dXMsIFNRTCwgcm93IGNvdW50cywgZXJyb3JzKSBvdXQgdGhyb3VnaCB0aGVcbiAqIE1hc3RyYSBgY3R4LndyaXRlcmAsIHNvIHRoZSBVSSBnZXRzIGB0b29sLW91dHB1dGAgY2h1bmtzIGluIHJlYWxcbiAqIHRpbWUgaW5zdGVhZCBvZiBzdGFyaW5nIGF0IGEgc3Bpbm5lciBmb3IgdGhlIGZ1bGwgR2VuaWUgcm91bmQtdHJpcC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRQbHVnaW5zTWFwKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgY29udGV4dDogcGx1Z2luUmVnaXN0cnkuUGx1Z2luQ29udGV4dExpa2UgfCB1bmRlZmluZWQsXG4pOiBNYXN0cmFQbHVnaW5zIHtcbiAgY29uc3QgY2FjaGUgPSBuZXcgTWFwPHN0cmluZywgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyIHwgbnVsbD4oKTtcbiAgcmV0dXJuIG5ldyBQcm94eSh7fSBhcyBNYXN0cmFQbHVnaW5zLCB7XG4gICAgZ2V0KF90YXJnZXQsIHByb3BOYW1lKSB7XG4gICAgICBpZiAodHlwZW9mIHByb3BOYW1lICE9PSBcInN0cmluZ1wiKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgaWYgKGNhY2hlLmhhcyhwcm9wTmFtZSkpIHJldHVybiBjYWNoZS5nZXQocHJvcE5hbWUpID8/IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHByb3ZpZGVyID0gcmVzb2x2ZVByb3ZpZGVyKGNvbmZpZywgY29udGV4dCwgcHJvcE5hbWUpO1xuICAgICAgY2FjaGUuc2V0KHByb3BOYW1lLCBwcm92aWRlcik7XG4gICAgICByZXR1cm4gcHJvdmlkZXIgPz8gdW5kZWZpbmVkO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFBpY2sgdGhlIHJpZ2h0IHtAbGluayBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXJ9IGZvciBhIHNpYmxpbmdcbiAqIHBsdWdpbiBsb29rdXAuIFJldHVybnMgdGhlIEdlbmllIGFnZW50LWJhY2tlZCBhZGFwdGVyIHdoZW5cbiAqIHRoZSBjYWxsZXIgYXNrcyBmb3IgYGdlbmllYCBBTkQgYXQgbGVhc3Qgb25lIHNwYWNlIGlzIHJlYWNoYWJsZVxuICogdmlhIHtAbGluayByZXNvbHZlR2VuaWVTcGFjZXN9ICh0aGUgZXhwbGljaXRcbiAqIGBjb25maWcuZ2VuaWVTcGFjZXNgLCB0aGUgcmVnaXN0ZXJlZCBBcHBLaXQgYGdlbmllKClgIHBsdWdpbidzXG4gKiBgc3BhY2VzYCBjb25maWcsIG9yIHRoZSBgREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRGAgZW52IHZhcikuXG4gKiBGYWxscyBiYWNrIHRvIHRoZSBnZW5lcmljIEFwcEtpdCBgVG9vbFByb3ZpZGVyYCBhZGFwdGVyIGZvclxuICogZXZlcnkgb3RoZXIgcGx1Z2luIG5hbWUuIGBjb25maWdgIGlzIHRocmVhZGVkIHRocm91Z2ggc28gdGhlXG4gKiBHZW5pZSBhZ2VudCBpbmhlcml0cyB0aGUgc2FtZSBtb2RlbCByZXNvbHZlciAvIGZhbGxiYWNrXG4gKiBsYWRkZXIgdGhlIGNhbGxpbmcgYWdlbnRzIHVzZS5cbiAqXG4gKiBUaGUgR2VuaWUgdG9vbHMgdGFsayB0byBHZW5pZSBkaXJlY3RseSB0aHJvdWdoIGBAZGJ4LXRvb2xzL2dlbmllYFxuICogKGBnZW5pZUV2ZW50Q2hhdGApIGFuZCB0aGUgd29ya3NwYWNlIGBzdGF0ZW1lbnRFeGVjdXRpb24uZ2V0U3RhdGVtZW50YFxuICogQVBJOyBBcHBLaXQncyBzdG9jayBgZ2VuaWVgIHBsdWdpbiBjb250cmlidXRlcyBvbmx5IGl0cyByZXNvdXJjZVxuICogbWFuaWZlc3QgYW5kIGBzcGFjZXNgIGNvbmZpZywgc28gYW4gYGFwcC55YW1sYCByZXNvdXJjZSBiaW5kaW5nIGFuZCBhXG4gKiBgZ2VuaWUoeyBzcGFjZXMgfSlgIHJlY29yZCBoYXZlIHRoZSBzYW1lIG1lYW5pbmcgaGVyZSBhcyB0aGV5IGRvIHRoZXJlLlxuICovXG5mdW5jdGlvbiByZXNvbHZlUHJvdmlkZXIoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICBjb250ZXh0OiBwbHVnaW5SZWdpc3RyeS5QbHVnaW5Db250ZXh0TGlrZSB8IHVuZGVmaW5lZCxcbiAgcHJvcE5hbWU6IHN0cmluZyxcbik6IE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlciB8IG51bGwge1xuICBpZiAocHJvcE5hbWUgPT09IFwiZ2VuaWVcIikge1xuICAgIGNvbnN0IHNwYWNlcyA9IHJlc29sdmVHZW5pZVNwYWNlcyhjb25maWcsIGNvbnRleHQpO1xuICAgIGlmIChPYmplY3Qua2V5cyhzcGFjZXMpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGJ1aWxkR2VuaWVUb29sa2l0UHJvdmlkZXIoe1xuICAgICAgc3BhY2VzLFxuICAgICAgY29uZmlnLFxuICAgIH0pIGFzIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlcjtcbiAgfVxuICBjb25zdCBwbHVnaW4gPSBjb250ZXh0Py5nZXRQbHVnaW5zKCkuZ2V0KHByb3BOYW1lKTtcbiAgcmV0dXJuIGFkYXB0UGx1Z2luVG9vbGtpdChwbHVnaW4sIHByb3BOYW1lKTtcbn1cblxudHlwZSBDb250ZXh0dWFsVG9vbFByb3ZpZGVyID0gUGFydGlhbDxQaWNrPFRvb2xQcm92aWRlciwgXCJnZXRBZ2VudFRvb2xzXCI+PiAmIHtcbiAgdG9vbGtpdD86IChcbiAgICBvcHRzPzogVG9vbGtpdE9wdGlvbnMsXG4gICkgPT5cbiAgICB8IFJldHVyblR5cGU8UGx1Z2luVG9vbGtpdFByb3ZpZGVyW1widG9vbGtpdFwiXT5cbiAgICB8IFByb21pc2U8UmV0dXJuVHlwZTxQbHVnaW5Ub29sa2l0UHJvdmlkZXJbXCJ0b29sa2l0XCJdPj47XG4gIGV4ZWN1dGVBZ2VudFRvb2w/OiAoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGFyZ3M6IHVua25vd24sXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICAgY29udGV4dD86IEFnZW50VG9vbEV4ZWN1dGlvbkNvbnRleHQsXG4gICkgPT4gUHJvbWlzZTx1bmtub3duPjtcbn07XG5cbi8qKlxuICogQWRhcHQgYW4gQXBwS2l0IGBUb29sUHJvdmlkZXJgIHBsdWdpbiBpbnN0YW5jZSBpbnRvIGFcbiAqIHtAbGluayBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXJ9LiBSZXR1cm5zIGBudWxsYCBmb3IgYW55IHBsdWdpblxuICogdGhhdCBkb2Vzbid0IGltcGxlbWVudCBgZXhlY3V0ZUFnZW50VG9vbGAgcGx1cyBlaXRoZXIgQXBwS2l0J3MgbmF0aXZlXG4gKiBgdG9vbGtpdGAgb3IgYGdldEFnZW50VG9vbHNgIHN1cmZhY2UuXG4gKi9cbmZ1bmN0aW9uIGFkYXB0UGx1Z2luVG9vbGtpdChcbiAgcGx1Z2luOiB1bmtub3duLFxuICBwbHVnaW5OYW1lOiBzdHJpbmcsXG4pOiBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXIgfCBudWxsIHtcbiAgaWYgKCFwbHVnaW4gfHwgdHlwZW9mIHBsdWdpbiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHAgPSBwbHVnaW4gYXMgQ29udGV4dHVhbFRvb2xQcm92aWRlcjtcbiAgaWYgKFxuICAgIHR5cGVvZiBwLmV4ZWN1dGVBZ2VudFRvb2wgIT09IFwiZnVuY3Rpb25cIiB8fFxuICAgICh0eXBlb2YgcC50b29sa2l0ICE9PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIHAuZ2V0QWdlbnRUb29scyAhPT0gXCJmdW5jdGlvblwiKVxuICApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHRvb2xraXQob3B0cz86IFRvb2xraXRPcHRpb25zKTogTWFzdHJhVG9vbHMgfCBQcm9taXNlPE1hc3RyYVRvb2xzPiB7XG4gICAgICBjb25zdCBlbnRyaWVzID1cbiAgICAgICAgdHlwZW9mIHAudG9vbGtpdCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgPyBwLnRvb2xraXQob3B0cylcbiAgICAgICAgICA6IHRvb2xraXRFbnRyaWVzRnJvbURlZmluaXRpb25zKHBsdWdpbk5hbWUsIHAuZ2V0QWdlbnRUb29scyEoKSwgb3B0cyk7XG4gICAgICBpZiAoaXNQcm9taXNlTGlrZShlbnRyaWVzKSkge1xuICAgICAgICByZXR1cm4gZW50cmllcy50aGVuKChyZXNvbHZlZCkgPT4gdG9vbGtpdEVudHJpZXNUb01hc3RyYVRvb2xzKHJlc29sdmVkLCBwKSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdG9vbGtpdEVudHJpZXNUb01hc3RyYVRvb2xzKGVudHJpZXMsIHApO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHRvb2xraXRFbnRyaWVzRnJvbURlZmluaXRpb25zKFxuICBwbHVnaW5OYW1lOiBzdHJpbmcsXG4gIGRlZmluaXRpb25zOiBBZ2VudFRvb2xEZWZpbml0aW9uW10sXG4gIG9wdGlvbnM6IFRvb2xraXRPcHRpb25zID0ge30sXG4pOiBSZWNvcmQ8c3RyaW5nLCBUb29sa2l0RW50cnk+IHtcbiAgcmV0dXJuIHRvb2xraXRFbnRyaWVzLmVudHJpZXMocGx1Z2luTmFtZSwgZGVmaW5pdGlvbnMsIG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBpc1Byb21pc2VMaWtlPFQ+KHZhbHVlOiBUIHwgUHJvbWlzZTxUPik6IHZhbHVlIGlzIFByb21pc2U8VD4ge1xuICByZXR1cm4gdHlwZW9mICh2YWx1ZSBhcyB7IHRoZW4/OiB1bmtub3duIH0pPy50aGVuID09PSBcImZ1bmN0aW9uXCI7XG59XG5cbmZ1bmN0aW9uIHRvb2xraXRFbnRyaWVzVG9NYXN0cmFUb29scyhcbiAgZW50cmllczogUmVjb3JkPHN0cmluZywgVG9vbGtpdEVudHJ5PixcbiAgcGx1Z2luOiBDb250ZXh0dWFsVG9vbFByb3ZpZGVyLFxuKTogTWFzdHJhVG9vbHMge1xuICBjb25zdCB0b29sczogTWFzdHJhVG9vbHMgPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMoZW50cmllcykpIHtcbiAgICB0b29sc1trZXldID0gdG9vbGtpdEVudHJ5VG9NYXN0cmFUb29sKGVudHJ5LCBwbHVnaW4pO1xuICB9XG4gIHJldHVybiB0b29scztcbn1cblxuLyoqXG4gKiBXcmFwIGEgc2luZ2xlIHtAbGluayBBcHBLaXRUb29sa2l0RW50cnl9IGFzIGEgTWFzdHJhIHRvb2wgd2hvc2VcbiAqIGBleGVjdXRlYCBkaXNwYXRjaGVzIGJhY2sgdGhyb3VnaCBgcGx1Z2luLmV4ZWN1dGVBZ2VudFRvb2woLi4uKWAgc29cbiAqIEFwcEtpdCdzIE9CTyBhdXRoIChgYXNVc2VyYCksIHRlbGVtZXRyeSBzcGFucywgYW5kIHRoZSBNYXN0cmEgbWVtb3J5IHJlc291cmNlXG4gKiBpZCBzdGF5IGludGFjdC4gSlNPTiBTY2hlbWEgcGFyYW1ldGVycyBwYXNzIHRocm91Z2ggdW5jaGFuZ2VkIC0gTWFzdHJhJ3NcbiAqIGBQdWJsaWNTY2hlbWFgIGFjY2VwdHMgYEpTT05TY2hlbWE3YCBkaXJlY3RseSB2aWEgYEBtYXN0cmEvc2NoZW1hLWNvbXBhdGAuXG4gKi9cbmZ1bmN0aW9uIHRvb2xraXRFbnRyeVRvTWFzdHJhVG9vbChlbnRyeTogVG9vbGtpdEVudHJ5LCBwbHVnaW46IENvbnRleHR1YWxUb29sUHJvdmlkZXIpOiBUb29sIHtcbiAgY29uc3QgYW5ub3RhdGlvbnMgPSBlbnRyeS5hbm5vdGF0aW9ucyA/PyBlbnRyeS5kZWYuYW5ub3RhdGlvbnM7XG4gIGNvbnN0IGVmZmVjdCA9IGFubm90YXRpb25zPy5lZmZlY3Q7XG4gIGNvbnN0IHJlcXVpcmVzQXBwcm92YWwgPSBlZmZlY3QgPT09IFwiZGVzdHJ1Y3RpdmVcIiB8fCBhbm5vdGF0aW9ucz8uZGVzdHJ1Y3RpdmUgPT09IHRydWU7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZDogYCR7ZW50cnkucGx1Z2luTmFtZX1fXyR7ZW50cnkubG9jYWxOYW1lfWAsXG4gICAgZGVzY3JpcHRpb246IGVudHJ5LmRlZi5kZXNjcmlwdGlvbixcbiAgICAuLi4oZW50cnkuZGVmLnBhcmFtZXRlcnMgPyB7IGlucHV0U2NoZW1hOiBlbnRyeS5kZWYucGFyYW1ldGVycyBhcyBuZXZlciB9IDoge30pLFxuICAgIC4uLihyZXF1aXJlc0FwcHJvdmFsID8geyByZXF1aXJlQXBwcm92YWw6IHRydWUgfSA6IHt9KSxcbiAgICAuLi4oYW5ub3RhdGlvbnNcbiAgICAgID8ge1xuICAgICAgICAgIG1jcDoge1xuICAgICAgICAgICAgYW5ub3RhdGlvbnM6IHtcbiAgICAgICAgICAgICAgcmVhZE9ubHlIaW50OiBlZmZlY3QgPT09IFwicmVhZFwiIHx8IGFubm90YXRpb25zLnJlYWRPbmx5ID09PSB0cnVlLFxuICAgICAgICAgICAgICBkZXN0cnVjdGl2ZUhpbnQ6IGVmZmVjdCA9PT0gXCJkZXN0cnVjdGl2ZVwiIHx8IGFubm90YXRpb25zLmRlc3RydWN0aXZlID09PSB0cnVlLFxuICAgICAgICAgICAgICBpZGVtcG90ZW50SGludDogYW5ub3RhdGlvbnMuaWRlbXBvdGVudCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gICAgZXhlY3V0ZTogYXN5bmMgKGlucHV0OiB1bmtub3duLCBjb250ZXh0OiB1bmtub3duKSA9PiB7XG4gICAgICBjb25zdCBleGVjdXRpb24gPSBjb250ZXh0IGFzXG4gICAgICAgIHwge1xuICAgICAgICAgICAgYWdlbnQ/OiB7IHRvb2xDYWxsSWQ/OiBzdHJpbmcgfTtcbiAgICAgICAgICAgIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG4gICAgICAgICAgICByZXF1ZXN0Q29udGV4dD86IHsgZ2V0KGtleTogc3RyaW5nKTogdW5rbm93biB9O1xuICAgICAgICAgICAgd3JpdGVyPzoge1xuICAgICAgICAgICAgICBjdXN0b20ocGFydDogeyB0eXBlOiBzdHJpbmc7IGRhdGE6IHVua25vd247IHRyYW5zaWVudD86IGJvb2xlYW4gfSk6IFByb21pc2U8dm9pZD47XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZXNvdXJjZUlkID0gZXhlY3V0aW9uPy5yZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9SRVNPVVJDRV9JRF9LRVkpO1xuICAgICAgY29uc3QgbW9kZWwgPSBleGVjdXRpb24/LnJlcXVlc3RDb250ZXh0Py5nZXQoTUFTVFJBX1JFU09MVkVEX01PREVMX0tFWSk7XG4gICAgICBjb25zdCBvcmlnaW4gPSBleGVjdXRpb24/LnJlcXVlc3RDb250ZXh0Py5nZXQoTUFTVFJBX09SSUdJTl9LRVkpO1xuICAgICAgY29uc3QgdG9vbENhbGxJZCA9IGV4ZWN1dGlvbj8uYWdlbnQ/LnRvb2xDYWxsSWQ7XG4gICAgICBjb25zdCB3cml0ZXIgPSBleGVjdXRpb24/LndyaXRlcjtcbiAgICAgIHJldHVybiBwbHVnaW4uZXhlY3V0ZUFnZW50VG9vbCEoZW50cnkubG9jYWxOYW1lLCBpbnB1dCwgZXhlY3V0aW9uPy5hYm9ydFNpZ25hbCwge1xuICAgICAgICAuLi4odHlwZW9mIHJlc291cmNlSWQgPT09IFwic3RyaW5nXCIgPyB7IHJlc291cmNlSWQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHR5cGVvZiBtb2RlbCA9PT0gXCJzdHJpbmdcIiA/IHsgbW9kZWwgfSA6IHt9KSxcbiAgICAgICAgLi4uKHR5cGVvZiBvcmlnaW4gPT09IFwic3RyaW5nXCIgPyB7IG9yaWdpbiB9IDoge30pLFxuICAgICAgICAuLi4od3JpdGVyICYmIHRvb2xDYWxsSWRcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgd3JpdGVQcm9ncmVzczogYXN5bmMgKGV2ZW50LCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gVG9vbFByb2dyZXNzRXZlbnRTY2hlbWEucGFyc2UoZXZlbnQpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHdyaXRlclxuICAgICAgICAgICAgICAgICAgLmN1c3RvbSh7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFRPT0xfUFJPR1JFU1NfUEFSVF9UWVBFLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiB7IHRvb2xDYWxsSWQsIGV2ZW50OiBwYXJzZWQgfSxcbiAgICAgICAgICAgICAgICAgICAgLi4uKG9wdGlvbnM/LnRyYW5zaWVudCA/IHsgdHJhbnNpZW50OiB0cnVlIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn1cbiJdfQ==
995
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWdlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FnZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7Ozs7Ozs7OztBQUVILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBUXhELE9BQU8sRUFDTCxjQUFjLEdBR2YsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQ0wsR0FBRyxFQUNILE9BQU8sRUFFUCxRQUFRLEVBQ1IsWUFBWSxFQUNaLFlBQVksR0FDYixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBTzVGLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFL0UsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFdEUsT0FBTyxFQUFFLGtCQUFrQixFQUFvQixNQUFNLHFCQUFxQixDQUFDO0FBRTNFLE9BQU8sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHaEYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBTWpELE9BQU8sRUFDTCxpQ0FBaUMsRUFDakMseUJBQXlCLEVBQ3pCLGdDQUFnQyxHQUNqQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3BDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMzRSxPQUFPLEVBQUUsc0JBQXNC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QUNMLENBQUM7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBZ2VudCByZWdpc3RyYXRpb24gZm9yIHRoZSBNYXN0cmEgQXBwS2l0IHBsdWdpbi5cbiAqXG4gKiBNaXJyb3JzIHRoZSBzaGFwZSBvZiB0aGUgQXBwS2l0IGBhZ2VudHNgIHBsdWdpbiAoYGNvbmZpZy5hZ2VudHNgIG1hcFxuICogb2Yge0BsaW5rIE1hc3RyYUFnZW50RGVmaW5pdGlvbn0sIGR1YWwtZm9ybSBgdG9vbHNgIGFjY2VwdGluZyBhIHBsYWluXG4gKiByZWNvcmQgb3IgYSBgKHBsdWdpbnMpID0+IHRvb2xzYCBjYWxsYmFjaykuIFJlc29sdmVzIGVhY2ggZGVmaW5pdGlvblxuICogaW50byBhIE1hc3RyYSBgQWdlbnRgIGluc3RhbmNlIGR1cmluZyBwbHVnaW4gc2V0dXA7IHVzZXItc3VwcGxpZWRcbiAqIHRvb2wgY2FsbGJhY2tzIGFyZSBpbnZva2VkIGV4YWN0bHkgb25jZSB3aXRoIGEgdHlwZWRcbiAqIHtAbGluayBNYXN0cmFQbHVnaW5zfSBtYXAgYnVpbHQgZnJvbSByZWdpc3RlcmVkIHNpYmxpbmcgcGx1Z2lucy5cbiAqXG4gKiBXaGVuIG5vIGFnZW50cyBhcmUgcmVnaXN0ZXJlZCB0aGUgcGx1Z2luIGZhbGxzIGJhY2sgdG8gYSBzaW5nbGVcbiAqIGJ1aWx0LWluIGFuYWx5c3Qgc28gdGhlIGJhcmUgYG1hc3RyYSgpYCBjYWxsIHN0aWxsIG1vdW50cyBhIHdvcmtpbmdcbiAqIHN0cmVhbWFibGUgYWdlbnQgZm9yIGRlbW9zLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uRXJyb3IgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgdHlwZSB7XG4gIEFnZW50VG9vbERlZmluaXRpb24sXG4gIFBsdWdpblRvb2xraXRQcm92aWRlcixcbiAgVG9vbGtpdEVudHJ5LFxuICBUb29sa2l0T3B0aW9ucyBhcyBBcHBLaXRUb29sa2l0T3B0aW9ucyxcbiAgVG9vbFByb3ZpZGVyLFxufSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0L2JldGFcIjtcbmltcG9ydCB7XG4gIHRvb2xraXRFbnRyaWVzLFxuICB0eXBlIFBsdWdpbkNvbnRleHRMaWtlLFxuICBBZ2VudFRvb2xFeGVjdXRpb25Db250ZXh0LFxufSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7XG4gIGxvZyxcbiAgdG9FcnJvcixcbiAgdHlwZSBMb2dnZXIsXG4gIHNlcXVlbmNlLFxuICB0b1VuaXF1ZVNsdWcsXG4gIHRvSWRlbnRpZmllcixcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IFRPT0xfUFJPR1JFU1NfUEFSVF9UWVBFLCBUb29sUHJvZ3Jlc3NFdmVudFNjaGVtYSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFcIjtcbmltcG9ydCB0eXBlIHtcbiAgQWdlbnRDb25maWcsXG4gIEFnZW50RXhlY3V0aW9uT3B0aW9ucyxcbiAgQWdlbnRJbnN0cnVjdGlvbnMsXG4gIFRvb2xzSW5wdXQsXG59IGZyb20gXCJAbWFzdHJhL2NvcmUvYWdlbnRcIjtcbmltcG9ydCB7IEFnZW50IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudFwiO1xuaW1wb3J0IHsgY3JlYXRlRXZlbnRlZEFnZW50IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9hZ2VudC9kdXJhYmxlXCI7XG5pbXBvcnQgeyBTa2lsbFNlYXJjaFByb2Nlc3NvciwgVG9vbENhbGxGaWx0ZXIgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3Byb2Nlc3NvcnNcIjtcbmltcG9ydCB0eXBlIHsgT3V0cHV0UHJvY2Vzc29yIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9wcm9jZXNzb3JzXCI7XG5pbXBvcnQgeyBNQVNUUkFfUkVTT1VSQ0VfSURfS0VZIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHsgcmVzb2x2ZUFnZW50U2tpbGxzLCB0eXBlIElubGluZVNraWxsIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9za2lsbHNcIjtcbmltcG9ydCB0eXBlIHsgQ29kZU1vZGVUcmFuc3BvcnQsIFRvb2wgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3Rvb2xzXCI7XG5pbXBvcnQgeyBjcmVhdGVDb2RlTW9kZSwgY3JlYXRlVG9vbCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvdG9vbHNcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlIH0gZnJvbSBcIkBtYXN0cmEvY29yZS93b3Jrc3BhY2VcIjtcbmltcG9ydCB7IGNyZWF0ZVNraWxsVG9vbHMsIGNyZWF0ZVdvcmtzcGFjZVRvb2xzIH0gZnJvbSBcIkBtYXN0cmEvY29yZS93b3Jrc3BhY2VcIjtcbmltcG9ydCB0eXBlIHsgUGdWZWN0b3JDb25maWcsIFBvc3RncmVzU3RvcmVDb25maWcgfSBmcm9tIFwiQG1hc3RyYS9wZ1wiO1xuXG5pbXBvcnQgeyBidWlsZFJlbmRlckRhdGFUb29sIH0gZnJvbSBcIi4vY2hhcnQudHNcIjtcbmltcG9ydCB0eXBlIHtcbiAgTWFzdHJhQ29kZU1vZGVDb25maWcsXG4gIE1hc3RyYUNvZGVNb2RlVHJhbnNwb3J0LFxuICBNYXN0cmFQbHVnaW5Db25maWcsXG59IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHtcbiAgYnVpbGRGb2xsb3dVcFN1Z2dlc3Rpb25zUHJvY2Vzc29yLFxuICBidWlsZFN1Z2dlc3RGb2xsb3dVcHNUb29sLFxuICByZXNvbHZlRm9sbG93VXBTdWdnZXN0aW9uc0NvbmZpZyxcbn0gZnJvbSBcIi4vZm9sbG93LXVwLXN1Z2dlc3Rpb25zLnRzXCI7XG5pbXBvcnQgeyBidWlsZEdlbmllVG9vbGtpdFByb3ZpZGVyLCByZXNvbHZlR2VuaWVTcGFjZXMgfSBmcm9tIFwiLi9nZW5pZS50c1wiO1xuaW1wb3J0IHsgd2l0aFJlcXVlc3RNZW1vcnlTY29wZSwgdHlwZSBNZW1vcnlCdWlsZGVyIH0gZnJvbSBcIi4vbWVtb3J5LnRzXCI7XG5pbXBvcnQgeyBidWlsZE1vZGVsLCBSRVNQT05TRVNfUFJPVklERVJfT1BUSU9OUyB9IGZyb20gXCIuL21vZGVsLnRzXCI7XG5pbXBvcnQgeyBzdHJpcFN0YWxlQ2hhcnRzUHJvY2Vzc29yIH0gZnJvbSBcIi4vcHJvY2Vzc29ycy50c1wiO1xuaW1wb3J0IHsgTUFTVFJBX09SSUdJTl9LRVkgfSBmcm9tIFwiLi9yZXF1ZXN0LWNvbnRleHQudHNcIjtcbmltcG9ydCB7IE1BU1RSQV9SRVNPTFZFRF9NT0RFTF9LRVkgfSBmcm9tIFwiLi9zZXJ2aW5nLnRzXCI7XG5pbXBvcnQgeyBUWVBPR1JBUEhZX1JVTEUgfSBmcm9tIFwiLi9zdHlsZS50c1wiO1xuaW1wb3J0IHsgYnVpbGRTdW1tYXJpemVUb29sIH0gZnJvbSBcIi4vc3VtbWFyaXplLnRzXCI7XG5pbXBvcnQge1xuICBiaW5kRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQsXG4gIGRhdGFicmlja3NXb3Jrc3BhY2UsXG4gIHR5cGUgRGF0YWJyaWNrc1dvcmtzcGFjZU9wdGlvbnMsXG59IGZyb20gXCIuL3dvcmtzcGFjZXMudHNcIjtcblxuY29uc3QgY29kZU1vZGVMb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL2NvZGUtbW9kZVwiKTtcbmNvbnN0IElTT0xBVEVEX1ZNX1BBQ0tBR0UgPSBcIkBtYXN0cmEvaXNvbGF0ZWQtdm1cIjtcbmNvbnN0IFFVSUNLSlNfUEFDS0FHRSA9IFwiQG1hc3RyYS9xdWlja2pzXCI7XG5sZXQgaXNvbGF0ZWRWbURlcGVuZGVuY3k6IFByb21pc2U8dHlwZW9mIGltcG9ydChcIkBtYXN0cmEvaXNvbGF0ZWQtdm1cIik+IHwgdW5kZWZpbmVkO1xubGV0IHF1aWNrSnNEZXBlbmRlbmN5OiBQcm9taXNlPHR5cGVvZiBpbXBvcnQoXCJAbWFzdHJhL3F1aWNranNcIik+IHwgdW5kZWZpbmVkO1xuXG50eXBlIE5vcm1hbGl6ZWRDb2RlTW9kZUNvbmZpZyA9IE1hc3RyYUNvZGVNb2RlQ29uZmlnO1xuXG5pbnRlcmZhY2UgUmVzb2x2ZWRDb2RlTW9kZUNvbmZpZyB7XG4gIHJlYWRvbmx5IGlkPzogc3RyaW5nO1xuICByZWFkb25seSB0aW1lb3V0PzogbnVtYmVyO1xuICByZWFkb25seSBwcm92aWRlcjogRXhjbHVkZTxNYXN0cmFDb2RlTW9kZVRyYW5zcG9ydCwgXCJhdXRvXCI+O1xuICByZWFkb25seSB0cmFuc3BvcnQ6IENvZGVNb2RlVHJhbnNwb3J0O1xufVxuXG50eXBlIENvZGVNb2RlRmFpbHVyZUNhdGVnb3J5ID1cbiAgXCJ1bnN1cHBvcnRlZC1ydW50aW1lXCIgfCBcImRlcGVuZGVuY3ktdW5hdmFpbGFibGVcIiB8IFwiY29uc3RydWN0aW9uLWZhaWxlZFwiO1xuXG5pbnRlcmZhY2UgQ29kZU1vZGVGYWlsdXJlIHtcbiAgcmVhZG9ubHkgY2F0ZWdvcnk6IENvZGVNb2RlRmFpbHVyZUNhdGVnb3J5O1xuICByZWFkb25seSBlcnJvcj86IEVycm9yO1xuICByZWFkb25seSBwcm92aWRlcjogRXhjbHVkZTxNYXN0cmFDb2RlTW9kZVRyYW5zcG9ydCwgXCJhdXRvXCI+O1xufVxuXG4vKiogUmV0dXJuIHdoZXRoZXIgdGhpcyBib290IGVudmlyb25tZW50IG1hdGNoZXMgaXNvbGF0ZWQtdm0ncyBzdXBwb3J0ZWQgYXBwIHNoYXBlLiAqL1xuZnVuY3Rpb24gc3VwcG9ydHNJc29sYXRlZFZtVHJhbnNwb3J0KCk6IGJvb2xlYW4ge1xuICBpZiAocHJvY2Vzcy52ZXJzaW9ucy5idW4gfHwgcHJvY2Vzcy5yZWxlYXNlLm5hbWUgIT09IFwibm9kZVwiIHx8IHByb2Nlc3MucGxhdGZvcm0gIT09IFwibGludXhcIikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBub2RlTWFqb3IgPSBOdW1iZXIucGFyc2VJbnQocHJvY2Vzcy52ZXJzaW9ucy5ub2RlLnNwbGl0KFwiLlwiKVswXSA/PyBcIlwiLCAxMCk7XG4gIGlmICghTnVtYmVyLmlzRmluaXRlKG5vZGVNYWpvcikgfHwgbm9kZU1ham9yIDwgMjAgfHwgbm9kZU1ham9yID49IDI1KSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IG5vZGVPcHRpb25zID0gcHJvY2Vzcy5lbnYuTk9ERV9PUFRJT05TPy5zcGxpdCgvXFxzKy8pID8/IFtdO1xuICByZXR1cm4gWy4uLnByb2Nlc3MuZXhlY0FyZ3YsIC4uLm5vZGVPcHRpb25zXS5pbmNsdWRlcyhcIi0tbm8tbm9kZS1zbmFwc2hvdFwiKTtcbn1cblxuLyoqIFJldHVybiB3aGV0aGVyIHRoZSBjdXJyZW50IHJ1bnRpbWUgc2F0aXNmaWVzIFF1aWNrSlMnIHB1Ymxpc2hlZCBlbmdpbmUgZmxvb3IuICovXG5mdW5jdGlvbiBzdXBwb3J0c1F1aWNrSnNUcmFuc3BvcnQoKTogYm9vbGVhbiB7XG4gIGlmIChwcm9jZXNzLnZlcnNpb25zLmJ1bikgcmV0dXJuIHRydWU7XG4gIGlmIChwcm9jZXNzLnJlbGVhc2UubmFtZSAhPT0gXCJub2RlXCIpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgW21ham9yVGV4dCwgbWlub3JUZXh0XSA9IHByb2Nlc3MudmVyc2lvbnMubm9kZS5zcGxpdChcIi5cIik7XG4gIGNvbnN0IG1ham9yID0gTnVtYmVyLnBhcnNlSW50KG1ham9yVGV4dCA/PyBcIlwiLCAxMCk7XG4gIGNvbnN0IG1pbm9yID0gTnVtYmVyLnBhcnNlSW50KG1pbm9yVGV4dCA/PyBcIlwiLCAxMCk7XG4gIHJldHVybiAoXG4gICAgTnVtYmVyLmlzRmluaXRlKG1ham9yKSAmJlxuICAgIE51bWJlci5pc0Zpbml0ZShtaW5vcikgJiZcbiAgICAobWFqb3IgPiAyMCB8fCAobWFqb3IgPT09IDIwICYmIG1pbm9yID49IDE5KSlcbiAgKTtcbn1cblxuLyoqIEltcG9ydCB0aGUgb3B0aW9uYWwgbmF0aXZlIHRyYW5zcG9ydCBhdCBtb3N0IG9uY2UgZm9yIHRoaXMgcHJvY2Vzcy4gKi9cbmZ1bmN0aW9uIGxvYWRJc29sYXRlZFZtRGVwZW5kZW5jeSgpOiBQcm9taXNlPHR5cGVvZiBpbXBvcnQoXCJAbWFzdHJhL2lzb2xhdGVkLXZtXCIpPiB7XG4gIGlzb2xhdGVkVm1EZXBlbmRlbmN5ID8/PSBpbXBvcnQoLyogQHZpdGUtaWdub3JlICovIElTT0xBVEVEX1ZNX1BBQ0tBR0UpIGFzIFByb21pc2U8XG4gICAgdHlwZW9mIGltcG9ydChcIkBtYXN0cmEvaXNvbGF0ZWQtdm1cIilcbiAgPjtcbiAgcmV0dXJuIGlzb2xhdGVkVm1EZXBlbmRlbmN5O1xufVxuXG4vKiogSW1wb3J0IHRoZSBvcHRpb25hbCBwb3J0YWJsZSB0cmFuc3BvcnQgYXQgbW9zdCBvbmNlIGZvciB0aGlzIHByb2Nlc3MuICovXG5mdW5jdGlvbiBsb2FkUXVpY2tKc0RlcGVuZGVuY3koKTogUHJvbWlzZTx0eXBlb2YgaW1wb3J0KFwiQG1hc3RyYS9xdWlja2pzXCIpPiB7XG4gIHF1aWNrSnNEZXBlbmRlbmN5ID8/PSBpbXBvcnQoLyogQHZpdGUtaWdub3JlICovIFFVSUNLSlNfUEFDS0FHRSkgYXMgUHJvbWlzZTxcbiAgICB0eXBlb2YgaW1wb3J0KFwiQG1hc3RyYS9xdWlja2pzXCIpXG4gID47XG4gIHJldHVybiBxdWlja0pzRGVwZW5kZW5jeTtcbn1cblxuLyoqXG4gKiBUb29sIHJlY29yZCBhY2NlcHRlZCBieSBldmVyeSBNYXN0cmEgYEFnZW50LnRvb2xzYCBmaWVsZCBhbmQgYnkgdGhlXG4gKiBgdG9vbHMocGx1Z2lucylgIGNhbGxiYWNrIG9uIHtAbGluayBNYXN0cmFBZ2VudERlZmluaXRpb259LlxuICpcbiAqIEFsaWFzIG9mIE1hc3RyYSdzIGBUb29sc0lucHV0YCwgc28gaXQgYWxyZWFkeSBhY2NlcHRzOlxuICpcbiAqIC0gTWFzdHJhIHRvb2xzIGJ1aWx0IHdpdGgge0BsaW5rIGNyZWF0ZVRvb2x9IChvciBgbmV3IFRvb2woLi4uKWApXG4gKiAtIE1hc3RyYSB0b29scyBidWlsdCB3aXRoIHRoZSBBcHBLaXQtc2hhcGVkIHtAbGluayB0b29sfSB3cmFwcGVyXG4gKiAgIGJlbG93XG4gKiAtIFZlcmNlbCBBSSBTREsgdG9vbHMgKGB0b29sKHsgLi4uIH0pYCBmcm9tIGBhaWApXG4gKiAtIFByb3ZpZGVyLWRlZmluZWQgdG9vbHMgKGUuZy4gYG9wZW5haS50b29scy53ZWJTZWFyY2goLi4uKWApXG4gKlxuICogRXhpc3RpbmcgdG9vbCBsaWJyYXJpZXMgZHJvcCBpbiBhcy1pcyAtIG5vdGhpbmcgaW4gdGhpcyBwYWNrYWdlXG4gKiBmb3JjZXMgYSByZWJ1aWxkLlxuICovXG5leHBvcnQgdHlwZSBNYXN0cmFUb29scyA9IFRvb2xzSW5wdXQ7XG5cbi8qKlxuICogQXBwS2l0LXNoYXBlZCB0b29sIGZhY3RvcnkuIExldHMgdXNlcnMgbWl4LWFuZC1tYXRjaCB0b29scyBhY3Jvc3NcbiAqIEFwcEtpdCdzIGBhZ2VudHNgIHBsdWdpbiBhbmQgYG1hc3RyYWAgd2l0aCBhIHNpbmdsZSBpbXBvcnQ6XG4gKlxuICogYGBgdHNcbiAqIGltcG9ydCB7IHRvb2wgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCI7XG4gKiBpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuICpcbiAqIGdldF93ZWF0aGVyOiB0b29sKHtcbiAqICAgZGVzY3JpcHRpb246IFwiV2VhdGhlclwiLFxuICogICBzY2hlbWE6IHoub2JqZWN0KHsgY2l0eTogei5zdHJpbmcoKSB9KSxcbiAqICAgZXhlY3V0ZTogYXN5bmMgKHsgY2l0eSB9KSA9PiBgU3VubnkgaW4gJHtjaXR5fWAsXG4gKiB9KSxcbiAqIGBgYFxuICpcbiAqIE1hcHMgb250byBNYXN0cmEncyBgY3JlYXRlVG9vbGA6XG4gKlxuICogLSBgZGVzY3JpcHRpb25gIC0+IGBkZXNjcmlwdGlvbmAgKHJlcXVpcmVkKVxuICogLSBgc2NoZW1hYCAtPiBgaW5wdXRTY2hlbWFgIChvcHRpb25hbClcbiAqIC0gYGV4ZWN1dGUoaW5wdXQpYCAtPiBgZXhlY3V0ZShpbnB1dCwgY3R4KWAgLSBNYXN0cmEgYWxyZWFkeSBjYWxsc1xuICogICB0aGUgZmlyc3QgYXJnIHdpdGggdGhlIHBhcnNlZCBpbnB1dHMsIHNvIHRoZSBib2R5IHNoYXBlIGlzXG4gKiAgIGlkZW50aWNhbC4gVGhlIE1hc3RyYSBgY29udGV4dGAgYXJnIGlzIGZvcndhcmRlZCBhcyB0aGUgc2Vjb25kXG4gKiAgIHBhcmFtZXRlciB3aGVuIHRoZSBjYWxsZXIgZGVjbGFyZXMgaXQuXG4gKiAtIGBpZGA6IG9wdGlvbmFsLiBEZWZhdWx0cyB0byBhIHN0YWJsZSBpZGVudGlmaWVyIGRlcml2ZWQgZnJvbVxuICogICBgZGVzY3JpcHRpb25gIChzbHVnaWZpZWQsIHdpdGggYSBzaG9ydCBoYXNoIHN1ZmZpeCBmb3JcbiAqICAgdW5pcXVlbmVzcykuIFBhc3MgYW4gZXhwbGljaXQgYGlkYCB3aGVuIHlvdSBuZWVkIGEgc3RhYmxlIHN0cmluZ1xuICogICBmb3IgdHJhY2luZyBvciBNQ1AgZXhwb3N1cmUuXG4gKlxuICogUmVhY2ggZm9yIHtAbGluayBjcmVhdGVUb29sfSB3aGVuIHlvdSBuZWVkIE1hc3RyYS1vbmx5IGZpZWxkc1xuICogKGBvdXRwdXRTY2hlbWFgLCBgc3VzcGVuZFNjaGVtYWAsIGByZXF1aXJlQXBwcm92YWxgLCBgbWNwYCwgZXRjLikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b29sKG9wdHM6IEFwcEtpdFRvb2xPcHRpb25zKTogVG9vbCB7XG4gIGNvbnN0IGlkID0gb3B0cy5pZCA/PyBkZXJpdmVUb29sSWQob3B0cy5kZXNjcmlwdGlvbik7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZCxcbiAgICBkZXNjcmlwdGlvbjogb3B0cy5kZXNjcmlwdGlvbixcbiAgICAuLi4ob3B0cy5zY2hlbWEgPyB7IGlucHV0U2NoZW1hOiBvcHRzLnNjaGVtYSBhcyBuZXZlciB9IDoge30pLFxuICAgIGV4ZWN1dGU6IG9wdHMuZXhlY3V0ZSBhcyBuZXZlcixcbiAgfSk7XG59XG5cbi8qKlxuICogSW5wdXQgc2hhcGUgZm9yIHRoZSBBcHBLaXQtc3R5bGUge0BsaW5rIHRvb2x9IGZhY3RvcnkuIEEgdHJpbW1lZFxuICogc3Vic2V0IG9mIE1hc3RyYSdzIGBjcmVhdGVUb29sYCBvcHRpb25zIHRoYXQgbWlycm9ycyB0aGVcbiAqIGBAZGF0YWJyaWNrcy9hcHBraXQvYmV0YWAgYHRvb2woeyBkZXNjcmlwdGlvbiwgc2NoZW1hLCBleGVjdXRlIH0pYFxuICogc2lnbmF0dXJlLlxuICpcbiAqIEdlbmVyaWNzIGFyZSBpbnRlbnRpb25hbGx5IGFic2VudCAtIGluZmVyZW5jZSBmbG93cyB0aHJvdWdoIHRoZVxuICogY2FsbGVyJ3MgYHNjaGVtYWAgKHR5cGljYWxseSBhIFpvZCBvYmplY3QpLCBhbmQgdGhlIGBleGVjdXRlYCBib2R5XG4gKiBkZXN0cnVjdHVyZXMgbmF0dXJhbGx5IGZyb20gdGhhdC4gUmVhY2ggZm9yIHtAbGluayBjcmVhdGVUb29sfSB3aGVuXG4gKiB5b3UgbmVlZCB0aGUgZnVsbHktdHlwZWQgaW5wdXQvb3V0cHV0IHNjaGVtYXMgd2lyZWQgZXhwbGljaXRseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBLaXRUb29sT3B0aW9ucyB7XG4gIC8qKiBPcHRpb25hbCBzdGFibGUgaWRlbnRpZmllcjsgYXV0by1kZXJpdmVkIGZyb20gYGRlc2NyaXB0aW9uYCB3aGVuIG9taXR0ZWQuICovXG4gIGlkPzogc3RyaW5nO1xuICAvKiogSHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gc2hvd24gdG8gdGhlIG1vZGVsLiBSZXF1aXJlZC4gKi9cbiAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGlucHV0IHNjaGVtYSAoYW55IFN0YW5kYXJkIFNjaGVtYSBpbnN0YW5jZSwgZS5nLiBab2QpLlxuICAgKiBNYXBzIHRvIE1hc3RyYSdzIGBpbnB1dFNjaGVtYWA7IHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBtb2RlbFxuICAgKiB2ZXJiYXRpbS5cbiAgICovXG4gIHNjaGVtYT86IHVua25vd247XG4gIC8qKlxuICAgKiBFeGVjdXRlIGJvZHkuIEZpcnN0IGFyZyBpcyB0aGUgcGFyc2VkIGlucHV0ICh0eXBlZCBvZmYgYHNjaGVtYWBcbiAgICogd2hlbiBzdXBwbGllZCksIHNlY29uZCBhcmcgaXMgdGhlIGZ1bGwgTWFzdHJhIGV4ZWN1dGlvbiBjb250ZXh0XG4gICAqIChyZXF1ZXN0IGNvbnRleHQsIGFib3J0IHNpZ25hbCwgbWFzdHJhIGluc3RhbmNlKSBpZiB5b3UgbmVlZCBpdC5cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIGV4ZWN1dGU6IChpbnB1dDogYW55LCBjb250ZXh0PzogdW5rbm93bikgPT4gdW5rbm93bjtcbn1cblxuLyoqXG4gKiBCdWlsZCBhIGRldGVybWluaXN0aWMgTWFzdHJhIHRvb2wgaWQgZnJvbSBhIGRlc2NyaXB0aW9uLlxuICogRGVsZWdhdGVzIHRvIHtAbGluayBzdHJpbmcudG9VbmlxdWVTbHVnfTogc2x1ZyArIGFsd2F5cy1vblxuICogNi1jaGFyIEZOVi0xYSBiYXNlLTMyIHN1ZmZpeCBzbyB0d28gdG9vbHMgd2l0aCB0aGUgc2FtZSBsZWFkaW5nXG4gKiB3b3JkcyBkb24ndCBjb2xsaWRlIGluIHRyYWNlcy4gU3RhYmxlIGFjcm9zcyBydW5zLlxuICovXG5mdW5jdGlvbiBkZXJpdmVUb29sSWQoZGVzY3JpcHRpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0b1VuaXF1ZVNsdWcoZGVzY3JpcHRpb24sIHsgZmFsbGJhY2tQcmVmaXg6IFwidG9vbFwiIH0pO1xufVxuXG4vKipcbiAqIElkZW50aXR5IGhlbHBlciB0aGF0IGJyYW5kcyBhIGRlZmluaXRpb24gYXMgYSBNYXN0cmEgYWdlbnQuIE1pcnJvcnNcbiAqIEFwcEtpdCdzIGBjcmVhdGVBZ2VudChkZWYpYCBzbyB0aGUgcmVnaXN0cmF0aW9uIHNoYXBlIG1hdGNoZXM6XG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IHN1cHBvcnQgPSBjcmVhdGVBZ2VudCh7XG4gKiAgIGluc3RydWN0aW9uczogXCIuLi5cIixcbiAqICAgbW9kZWw6IFwiZGF0YWJyaWNrcy1jbGF1ZGUtc29ubmV0LTQtNlwiLFxuICogICB0b29scyhwbHVnaW5zKSB7IHJldHVybiB7IC4uLiB9OyB9LFxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBBZGRzIHRoZSBwYWNrYWdlJ3MgZGVmYXVsdCB3b3Jrc3BhY2Ugd2hlbiB0aGUgZGVmaW5pdGlvbiBvbWl0cyBvbmUuIFRoYXRcbiAqIHdvcmtzcGFjZSBjYXJyaWVzIERhdGFicmlja3Mgc2tpbGwgbW91bnRzIHdoaWxlIGNvbW1hbmQgZXhlY3V0aW9uIHN0YXlzXG4gKiBkaXNhYmxlZCB1bnRpbCBhIHNhbmRib3ggaXMgc2VsZWN0ZWQgZXhwbGljaXRseS4gQW4gZXhwbGljaXQgd29ya3NwYWNlXG4gKiByZW1haW5zIHRoZSBjYWxsZXIncyBjb21wbGV0ZSBvdmVycmlkZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUFnZW50PFxuICBUUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVua25vd24gPSB1bmtub3duLFxuICBURGVmaW5pdGlvbiBleHRlbmRzIE1hc3RyYUFnZW50RGVmaW5pdGlvbjxUUmVxdWVzdENvbnRleHQ+ID1cbiAgICBNYXN0cmFBZ2VudERlZmluaXRpb248VFJlcXVlc3RDb250ZXh0Pixcbj4oZGVmOiBURGVmaW5pdGlvbik6IFREZWZpbml0aW9uIHtcbiAgaWYgKGRlZi53b3Jrc3BhY2UpIHJldHVybiB7IC4uLmRlZiB9O1xuICBjb25zdCB3b3Jrc3BhY2UgPSBkYXRhYnJpY2tzV29ya3NwYWNlKCk7XG4gIG1hcmtEZWZhdWx0V29ya3NwYWNlKHdvcmtzcGFjZSk7XG4gIHJldHVybiB7IC4uLmRlZiwgd29ya3NwYWNlIH07XG59XG5cbi8qKlxuICogQnJhbmQgZm9yIGEge0BsaW5rIFdvcmtzcGFjZX0gdGhhdCBgY3JlYXRlQWdlbnRgIGJ1aWx0IHdpdGggbm8gY2FsbGVyXG4gKiBvcHRpb25zLCBzbyB7QGxpbmsgYnVpbGRBZ2VudHN9IG1heSByZWJ1aWxkIGl0IHdpdGggc3RhcnR1cC1wcm92aXNpb25lZFxuICogYGV4dHJhU2tpbGxNb3VudHNgIChhIGNhbGxlci1zdXBwbGllZCB3b3Jrc3BhY2UgaXMgbmV2ZXIgdG91Y2hlZCkuXG4gKi9cbmNvbnN0IGRlZmF1bHRXb3Jrc3BhY2VzID0gbmV3IFdlYWtTZXQ8V29ya3NwYWNlPigpO1xuXG4vKiogQnJhbmQgYHdvcmtzcGFjZWAgYXMgdGhlIGF1dG8tY3JlYXRlZCBkZWZhdWx0LiAqL1xuZnVuY3Rpb24gbWFya0RlZmF1bHRXb3Jrc3BhY2Uod29ya3NwYWNlOiBXb3Jrc3BhY2UpOiB2b2lkIHtcbiAgZGVmYXVsdFdvcmtzcGFjZXMuYWRkKHdvcmtzcGFjZSk7XG59XG5cbi8qKiBXaGV0aGVyIGB3b3Jrc3BhY2VgIHdhcyBhdXRvLWNyZWF0ZWQgYnkge0BsaW5rIGNyZWF0ZUFnZW50fS4gKi9cbmZ1bmN0aW9uIGlzRGVmYXVsdFdvcmtzcGFjZSh3b3Jrc3BhY2U6IFdvcmtzcGFjZSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gd29ya3NwYWNlICE9PSB1bmRlZmluZWQgJiYgZGVmYXVsdFdvcmtzcGFjZXMuaGFzKHdvcmtzcGFjZSk7XG59XG5cbi8qKlxuICogRmlsdGVyIC8gcmVuYW1lIG9wdGlvbnMgYWNjZXB0ZWQgYnkgZXZlcnkgcGx1Z2luJ3MgYC50b29sa2l0KClgXG4gKiBtZXRob2QsIGRpcmVjdGx5IHNvdXJjZWQgZnJvbSBBcHBLaXQncyBwdWJsaWMgYmV0YSBjb250cmFjdC5cbiAqL1xuZXhwb3J0IHR5cGUgVG9vbGtpdE9wdGlvbnMgPSBBcHBLaXRUb29sa2l0T3B0aW9ucztcblxuLyoqXG4gKiBUb29sa2l0IHByb3ZpZGVyIHNoYXBlIGV2ZXJ5IGVudHJ5IGluIHRoZSB7QGxpbmsgTWFzdHJhUGx1Z2luc30gbWFwXG4gKiBleHBvc2VzLiBJZGVudGljYWwgdG8gQXBwS2l0J3MgYFBsdWdpblRvb2xraXRQcm92aWRlcmAgLSBhbnkgQXBwS2l0XG4gKiBwbHVnaW4gdGhhdCBpbXBsZW1lbnRzIHRoZSBzdGFuZGFyZCBgVG9vbFByb3ZpZGVyYCBpbnRlcmZhY2VcbiAqIChgZ2V0QWdlbnRUb29sc2AgKyBgZXhlY3V0ZUFnZW50VG9vbGAgKyBgdG9vbGtpdGApIGlzIHJlYWNoYWJsZVxuICogdGhyb3VnaCB0aGlzIHN1cmZhY2UgYXV0b21hdGljYWxseS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXIge1xuICAvKipcbiAgICogUmV0dXJucyBhIE1hc3RyYS1zaGFwZWQgdG9vbHMgcmVjb3JkIGFkYXB0ZWQgZnJvbSB0aGUgcGx1Z2luJ3NcbiAgICogYWdlbnQgdG9vbHMuIEVhY2ggdG9vbCBkaXNwYXRjaGVzIGJhY2sgdGhyb3VnaCB0aGUgcGx1Z2luJ3NcbiAgICogYGV4ZWN1dGVBZ2VudFRvb2xgIHNvIE9CTyBhdXRoIGFuZCB0ZWxlbWV0cnkgc3BhbnMgc3RheSBpbnRhY3QuXG4gICAqL1xuICB0b29sa2l0KG9wdHM/OiBUb29sa2l0T3B0aW9ucyk6IE1hc3RyYVRvb2xzIHwgUHJvbWlzZTxNYXN0cmFUb29scz47XG59XG5cbi8qKlxuICogUGx1Z2luIG1hcCBoYW5kZWQgdG8gdGhlIGZ1bmN0aW9uIGZvcm0gb2ZcbiAqIHtAbGluayBNYXN0cmFBZ2VudERlZmluaXRpb24udG9vbHN9LiBNaXJyb3JzIEFwcEtpdCdzIGBQbHVnaW5zYFxuICogdHlwZSBleGFjdGx5OiBhIHN0cmluZy1rZXllZCByZWNvcmQgd2hlcmUgZXZlcnkgdmFsdWUgZXhwb3Nlc1xuICogYC50b29sa2l0KG9wdHMpYC5cbiAqXG4gKiBJbXBsZW1lbnRlZCBhcyBhIHJ1bnRpbWUgUHJveHkgdGhhdCBhdXRvLWRpc2NvdmVycyBhbnkgcmVnaXN0ZXJlZFxuICogQXBwS2l0IHBsdWdpbiBpbXBsZW1lbnRpbmcgdGhlIHN0YW5kYXJkIGBUb29sUHJvdmlkZXJgIGludGVyZmFjZVxuICogKGBhbmFseXRpY3NgLCBgZmlsZXNgLCBgbGFrZWJhc2VgLCBgZ2VuaWVgLCBwbHVzIGFueSB0aGlyZC1wYXJ0eVxuICogcGx1Z2luIHRoYXQgZG9lcyB0aGUgc2FtZSkuIFVua25vd24gbmFtZXMgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYFxuICogYXQgcnVudGltZSwgc28gZ3VhcmQgd2l0aCBgPy5gIGFuZCBgPz8ge31gIHdoZW4gc3ByZWFkaW5nIGZyb20gYVxuICogcGx1Z2luIHRoYXQgbWF5IG5vdCBiZSByZWdpc3RlcmVkIGluIGV2ZXJ5IGVudmlyb25tZW50LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY3JlYXRlQWdlbnQoe1xuICogICBpbnN0cnVjdGlvbnM6IFwiLi4uXCIsXG4gKiAgIGFzeW5jIHRvb2xzKHBsdWdpbnMpIHtcbiAqICAgICByZXR1cm4ge1xuICogICAgICAgLi4uKGF3YWl0IHBsdWdpbnMuYW5hbHl0aWNzLnRvb2xraXQoKSksXG4gKiAgICAgICAuLi4oYXdhaXQgcGx1Z2lucy5maWxlcy50b29sa2l0KHsgb25seTogW1widXBsb2Fkcy5yZWFkXCJdIH0pKSxcbiAqICAgICAgIGdldF93ZWF0aGVyOiB0b29sKHtcbiAqICAgICAgICAgZGVzY3JpcHRpb246IFwiV2VhdGhlclwiLFxuICogICAgICAgICBzY2hlbWE6IHoub2JqZWN0KHsgY2l0eTogei5zdHJpbmcoKSB9KSxcbiAqICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgY2l0eSB9KSA9PiBgU3VubnkgaW4gJHtjaXR5fWAsXG4gKiAgICAgICB9KSxcbiAqICAgICB9O1xuICogICB9LFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhUGx1Z2lucyA9IFJlY29yZDxzdHJpbmcsIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlcj47XG5cbi8qKiBGdW5jdGlvbiBmb3JtIG9mIHtAbGluayBNYXN0cmFBZ2VudERlZmluaXRpb24udG9vbHN9LiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhVG9vbHNGbiA9IChwbHVnaW5zOiBNYXN0cmFQbHVnaW5zKSA9PiBNYXN0cmFUb29scyB8IFByb21pc2U8TWFzdHJhVG9vbHM+O1xuXG4vKiogRnVuY3Rpb24gZm9ybSBvZiB7QGxpbmsgTWFzdHJhQWdlbnREZWZpbml0aW9uLndvcmtzcGFjZX07IGB1bmRlZmluZWRgIGRpc2FibGVzIGl0IGZvciB0aGlzIGFnZW50LiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhQWdlbnRXb3Jrc3BhY2VSZXNvbHZlciA9ICgpID0+IFdvcmtzcGFjZSB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBBIGNvZGUtZGVmaW5lZCBNYXN0cmEgYWdlbnQuIE1pcnJvcnMgdGhlIHNoYXBlIEFwcEtpdCdzIGBhZ2VudHNgXG4gKiBwbHVnaW4gdXNlcyBmb3IgYEFnZW50RGVmaW5pdGlvbmAuIFRoZSByZWdpc3RyeSBrZXkgdW5kZXJcbiAqIGBjb25maWcuYWdlbnRzYCBpcyB0aGUgYGFnZW50SWRgIHRoZSBjbGllbnQgc3RyZWFtcyBhZ2FpbnN0OyBgbmFtZWBcbiAqIGlzIHB1cmVseSBpbmZvcm1hdGlvbmFsIChkZWZhdWx0cyB0byB0aGUga2V5KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXN0cmFBZ2VudERlZmluaXRpb248XG4gIFRSZXF1ZXN0Q29udGV4dCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5rbm93biA9IHVua25vd24sXG4+IHtcbiAgLyoqIERpc3BsYXkgbmFtZSB1c2VkIGFzIGBBZ2VudC5uYW1lYC4gRGVmYXVsdHMgdG8gdGhlIHJlZ2lzdHJ5IGtleS4gKi9cbiAgbmFtZT86IHN0cmluZztcbiAgLyoqIE9wdGlvbmFsIGxvbmctZm9ybSBkZXNjcmlwdGlvbjsgc3VyZmFjZWQgYXMgYEFnZW50LmRlc2NyaXB0aW9uYC4gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBTdGF0aWMgb3IgcmVxdWVzdC1jb250ZXh0LWF3YXJlIHN5c3RlbSBpbnN0cnVjdGlvbnMuICovXG4gIGluc3RydWN0aW9uczogQWdlbnRDb25maWc8c3RyaW5nLCBUb29sc0lucHV0LCB1bmRlZmluZWQsIFRSZXF1ZXN0Q29udGV4dD5bXCJpbnN0cnVjdGlvbnNcIl07XG4gIC8qKiBOYXRpdmUgTWFzdHJhIHNjaGVtYSB0aGF0IHZhbGlkYXRlcyBhbmQgdHlwZXMgYXBwbGljYXRpb24gcmVxdWVzdCBjb250ZXh0LiAqL1xuICByZXF1ZXN0Q29udGV4dFNjaGVtYT86IEFnZW50Q29uZmlnPFxuICAgIHN0cmluZyxcbiAgICBUb29sc0lucHV0LFxuICAgIHVuZGVmaW5lZCxcbiAgICBUUmVxdWVzdENvbnRleHRcbiAgPltcInJlcXVlc3RDb250ZXh0U2NoZW1hXCJdO1xuICAvKipcbiAgICogTWFzdHJhLW5hdGl2ZSBwZXItY2FsbCBhcHByb3ZhbCBnYXRlIGZvciB0aGlzIGFnZW50J3MgdG9vbHMuIFN1cHBvcnRzIGFuXG4gICAqIGFzeW5jIENsYXNzaWZpZXItYmFja2VkIGZ1bmN0aW9uOyB0b29sLWxldmVsIGFwcHJvdmFsIHJlbWFpbnMgYXV0aG9yaXRhdGl2ZS5cbiAgICovXG4gIHJlcXVpcmVUb29sQXBwcm92YWw/OiBBZ2VudEV4ZWN1dGlvbk9wdGlvbnNbXCJyZXF1aXJlVG9vbEFwcHJvdmFsXCJdO1xuICAvKipcbiAgICogUGVyLWFnZW50IG1vZGVsIG92ZXJyaWRlLlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogZmFsbHMgYmFjayB0byB0aGUgd29ya3NwYWNlXG4gICAqICAgYC9zZXJ2aW5nLWVuZHBvaW50c2AgcmVzb2x2ZXIgdGhhdCB7QGxpbmsgYnVpbGRNb2RlbH0gY29uZmlndXJlc1xuICAgKiAgIGZyb20gdGhlIHBlci1yZXF1ZXN0IGBXb3Jrc3BhY2VDbGllbnRgLlxuICAgKiAtIGBzdHJpbmdgOiBzaG9ydGhhbmQgZm9yIFwidXNlIHRoZSBkZWZhdWx0IHJlc29sdmVyIGJ1dCBzd2FwIHRoZVxuICAgKiAgIGBtb2RlbElkYFwiIChlLmcuIGBcImRhdGFicmlja3MtbWV0YS1sbGFtYS0zLTMtNzBiLWluc3RydWN0XCJgKS5cbiAgICogLSBBbnkgb3RoZXIgTWFzdHJhIGBEeW5hbWljQXJndW1lbnQ8TWFzdHJhTW9kZWxDb25maWc+YDogcGFzc2VkXG4gICAqICAgc3RyYWlnaHQgdGhyb3VnaCB0byBgQWdlbnQubW9kZWxgLiBVc2UgdGhpcyB3aGVuIHlvdSBuZWVkIGZ1bGxcbiAgICogICBjb250cm9sIG92ZXIgYXV0aCBvciBwcm92aWRlcklkLlxuICAgKi9cbiAgbW9kZWw/OiBBZ2VudENvbmZpZzxzdHJpbmcsIFRvb2xzSW5wdXQsIHVuZGVmaW5lZCwgVFJlcXVlc3RDb250ZXh0PltcIm1vZGVsXCJdIHwgc3RyaW5nO1xuICAvKipcbiAgICogUGVyLWFnZW50IHRvb2wgcmVjb3JkLiBFaXRoZXIgYSBwbGFpbiBtYXAgb3IgYSBjYWxsYmFjayB0aGF0XG4gICAqIHJlY2VpdmVzIHRoZSB0eXBlZCB7QGxpbmsgTWFzdHJhUGx1Z2luc30gc2libGluZy1wbHVnaW4gaW5kZXggYW5kXG4gICAqIHJldHVybnMgYSBtYXAuIFRoZSBjYWxsYmFjayBydW5zIGV4YWN0bHkgb25jZSBhdCBhZ2VudCBzZXR1cDsgdGhlXG4gICAqIHJlc3VsdCBpcyBjYWNoZWQgZm9yIHRoZSBhZ2VudCdzIGxpZmV0aW1lLlxuICAgKi9cbiAgdG9vbHM/OiBNYXN0cmFUb29scyB8IE1hc3RyYVRvb2xzRm47XG4gIC8qKlxuICAgKiBQZXItYWdlbnQgc2VtYW50aWMgcmVjYWxsIChQZ1ZlY3Rvcikgb3ZlcnJpZGUuIENhc2NhZGVzIGZyb21cbiAgICogYGNvbmZpZy5tZW1vcnlgOyB0aGUgYWdlbnQgdmFsdWUgd2lucyB3aGVuIHNldC5cbiAgICpcbiAgICogLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCk6IGluaGVyaXQgYGNvbmZpZy5tZW1vcnlgLiBXaGVuIHRoYXQnc1xuICAgKiAgIGVuYWJsZWQsIHRoZSBhZ2VudCAqKnNoYXJlcyB0aGUgcGx1Z2luLWxldmVsIHNpbmdsZXRvbiBgUGdWZWN0b3JgXG4gICAqICAgaW5zdGFuY2UqKiAoY3Jvc3MtYWdlbnQgc2VtYW50aWMgcmVjYWxsIGFjcm9zcyB0aGUgc2FtZSBpbmRleCkuXG4gICAqIC0gYGZhbHNlYDogZGlzYWJsZSBzZW1hbnRpYyByZWNhbGwgZm9yIHRoaXMgYWdlbnQgb25seS5cbiAgICogLSBgdHJ1ZWA6IGVuYWJsZSB1c2luZyB0aGUgc2hhcmVkIHNpbmdsZXRvbiAoc2FtZSBhcyBkZWZhdWx0IHdoZW5cbiAgICogICBwbHVnaW4gbWVtb3J5IGlzIGVuYWJsZWQ7IHVzZWZ1bCB0byBvcHQgaW4gd2hlbiBwbHVnaW4gZGlzYWJsZWQpLlxuICAgKiAtIHtAbGluayBNYXN0cmFNZW1vcnlDb25maWd9IG9iamVjdDogZGVkaWNhdGVkIGBQZ1ZlY3RvcmAgZm9yIHRoaXNcbiAgICogICBhZ2VudCAocHJpdmF0ZSByZWNhbGwgaW5kZXgpLiBCeXBhc3NlcyB0aGUgc2hhcmVkIHNpbmdsZXRvbi5cbiAgICovXG4gIG1lbW9yeT86IGJvb2xlYW4gfCBNYXN0cmFNZW1vcnlDb25maWdPdmVycmlkZTtcbiAgLyoqXG4gICAqIFBlci1hZ2VudCB0aHJlYWQvbWVzc2FnZSBzdG9yYWdlIChgUG9zdGdyZXNTdG9yZWApIG92ZXJyaWRlLlxuICAgKiBDYXNjYWRlcyBmcm9tIGBjb25maWcuc3RvcmFnZWA7IHRoZSBhZ2VudCB2YWx1ZSB3aW5zIHdoZW4gc2V0LlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogaW5oZXJpdCBgY29uZmlnLnN0b3JhZ2VgLiBXaGVuIHRoYXQnc1xuICAgKiAgIGVuYWJsZWQsIHRoZSBhZ2VudCBnZXRzIGl0cyAqKm93biBwZXItYWdlbnQgYFBvc3RncmVzU3RvcmVgKipcbiAgICogICBrZXllZCBieSB7QGxpbmsgYWdlbnRTdG9yYWdlU2NoZW1hTmFtZX0gc28gdGhyZWFkcyBhbmRcbiAgICogICBtZXNzYWdlcyBzdGF5IGlzb2xhdGVkIGJldHdlZW4gYWdlbnRzIGluIHRoZSBzYW1lIGRhdGFiYXNlLlxuICAgKiAtIGBmYWxzZWA6IGRpc2FibGUgc3RvcmFnZSBmb3IgdGhpcyBhZ2VudCBvbmx5IChwdXJlbHkgaW4tbWVtb3J5KS5cbiAgICogLSBgdHJ1ZWA6IGVuYWJsZSB3aXRoIHRoZSBwZXItYWdlbnQgZGVmYXVsdCBzY2hlbWEuXG4gICAqIC0ge0BsaW5rIE1hc3RyYVN0b3JhZ2VDb25maWdPdmVycmlkZX0gb2JqZWN0OiBkZWRpY2F0ZWRcbiAgICogICBgUG9zdGdyZXNTdG9yZWAgY29uZmlnIChjdXN0b20gc2NoZW1hLCBjb25uZWN0aW9uLCBldGMuKS5cbiAgICovXG4gIHN0b3JhZ2U/OiBib29sZWFuIHwgTWFzdHJhU3RvcmFnZUNvbmZpZ092ZXJyaWRlO1xuICAvKipcbiAgICogTWFzdHJhIHtAbGluayBXb3Jrc3BhY2V9IGZvciB0aGlzIGFnZW50IChmaWxlc3lzdGVtLCBzYW5kYm94LCBvciBvdGhlclxuICAgKiBwcm92aWRlcnMpLiBBc3Npc3RhbnQgc2tpbGxzIGZyb20gRGF0YWJyaWNrcyB3b3Jrc3BhY2UgcGF0aHMgYXJlIHdpcmVkXG4gICAqIHZpYSB7QGxpbmsgZGF0YWJyaWNrc1dvcmtzcGFjZX0uXG4gICAqL1xuICB3b3Jrc3BhY2U/OiBXb3Jrc3BhY2UgfCBNYXN0cmFBZ2VudFdvcmtzcGFjZVJlc29sdmVyO1xufVxuXG4vKiogVHlwZS1lcmFzZWQgcmVnaXN0cnkgbWVtYmVyOyBlYWNoIGRlZmluaXRpb24gcmV0YWlucyB0eXBpbmcgYXQgYGNyZWF0ZUFnZW50YC4gKi9cbmV4cG9ydCB0eXBlIEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbiA9IE1hc3RyYUFnZW50RGVmaW5pdGlvbjxhbnk+O1xuXG4vKipcbiAqIERpc3RyaWJ1dGl2ZSBgT21pdGAgc28gdW5pb25zIGluIGBQb3N0Z3Jlc1N0b3JlQ29uZmlnYCAvXG4gKiBgUGdWZWN0b3JDb25maWdgIGtlZXAgdGhlaXIgZGlzY3JpbWluYW50cyBhZnRlciB0aGUgb3ZlcnJpZGUgdHlwZXNcbiAqIHN0cmlwIGBpZGAuIFRoZSBidWlsdC1pbiBgT21pdGAgY29sbGFwc2VzIHVuaW9ucyB0byBvbmUgc2hhcGUgd2l0aFxuICogY29tbW9uIGZpZWxkcyBvbmx5LCB3aGljaCBsb3NlcyB0aGUgY29ubmVjdGlvbi1zdHlsZSBkaXNjcmltaW5hbnRzLlxuICovXG50eXBlIERpc3RyaWJ1dGl2ZU9taXQ8VCwgSyBleHRlbmRzIGtleW9mIG5ldmVyPiA9IFQgZXh0ZW5kcyB1bmtub3duID8gT21pdDxULCBLPiA6IG5ldmVyO1xuXG4vKipcbiAqIGBQb3N0Z3Jlc1N0b3JlQ29uZmlnYCBtaW51cyBgaWRgIC0gcGVyLWFnZW50IG92ZXJyaWRlcyBhY2NlcHQgYW55XG4gKiBNYXN0cmEtc3VwcG9ydGVkIHN0b3JhZ2Ugc2hhcGUuIGBpZGAgaXMgZmlsbGVkIGluIGF1dG9tYXRpY2FsbHlcbiAqIGZyb20gdGhlIGFnZW50IHJlZ2lzdHJ5IGtleSBzbyB0cmFjZXMgc3RheSBzdGFibGUuXG4gKi9cbmV4cG9ydCB0eXBlIE1hc3RyYVN0b3JhZ2VDb25maWdPdmVycmlkZSA9IERpc3RyaWJ1dGl2ZU9taXQ8UG9zdGdyZXNTdG9yZUNvbmZpZywgXCJpZFwiPiAmIHtcbiAgaWQ/OiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIGBQZ1ZlY3RvckNvbmZpZ2AgbWludXMgYGlkYCAtIHBlci1hZ2VudCBvdmVycmlkZXMgYWNjZXB0IGFueVxuICogTWFzdHJhLXN1cHBvcnRlZCB2ZWN0b3Igc2hhcGUuIGBpZGAgaXMgZmlsbGVkIGluIGF1dG9tYXRpY2FsbHlcbiAqIGZyb20gdGhlIGFnZW50IHJlZ2lzdHJ5IGtleS5cbiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhTWVtb3J5Q29uZmlnT3ZlcnJpZGUgPSBEaXN0cmlidXRpdmVPbWl0PFBnVmVjdG9yQ29uZmlnLCBcImlkXCI+ICYge1xuICBpZD86IHN0cmluZztcbn07XG5cbi8qKiBIb3cgYW4gYWdlbnQncyB1bnBpbm5lZCBtb2RlbCBpcyByZXNvbHZlZC4gKi9cbmV4cG9ydCB0eXBlIEFnZW50RGVmYXVsdE1vZGVsID1cbiAgeyBraW5kOiBcImF1dG9cIiB9IHwgeyBraW5kOiBcImNvbmZpZ3VyZWRcIjsgbW9kZWw6IHN0cmluZyB9IHwgeyBraW5kOiBcImR5bmFtaWNcIiB9O1xuXG4vKiogT3V0cHV0IG9mIHtAbGluayBidWlsZEFnZW50c306IHJlc29sdmVkIGFnZW50cyBwbHVzIHRoZSBkZWZhdWx0IGlkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdWlsdEFnZW50cyB7XG4gIGFnZW50czogUmVjb3JkPHN0cmluZywgQWdlbnQ+O1xuICBkZWZhdWx0QWdlbnRJZDogc3RyaW5nO1xuICAvKipcbiAgICogRGVmYXVsdCBtb2RlbCBpbnRlbnQgcGVyIGFnZW50IGlkLiBBbiB1bmNvbmZpZ3VyZWQgYWdlbnQgaXMgYFwiYXV0b1wiYCBhbmRcbiAgICogcmVzb2x2ZXMgdGhlIGhpZ2hlc3QtcmFua2VkIGxpdmUgZW5kcG9pbnQ7IGEgc3RyaW5nIGlzIGBcImNvbmZpZ3VyZWRcImA7IGFcbiAgICogY3VzdG9tIGZ1bmN0aW9uIGlzIGBcImR5bmFtaWNcImAuIENvbnN1bWVkIGJ5IHRoZSBwbHVnaW4nc1xuICAgKiBgR0VUIC9kZWZhdWx0LW1vZGVsYCByb3V0ZS5cbiAgICovXG4gIGRlZmF1bHRNb2RlbHM6IFJlY29yZDxzdHJpbmcsIEFnZW50RGVmYXVsdE1vZGVsPjtcbiAgLyoqXG4gICAqIEFtYmllbnQgdG9vbHMgc2hhcmVkIGFjcm9zcyBldmVyeSBhZ2VudCAodGhlIGJ1aWx0LWluIHN5c3RlbSB0b29sc1xuICAgKiBzcHJlYWQgd2l0aCBgY29uZmlnLnRvb2xzYCkuIFN1cmZhY2VkIHNvIHRoZSBvcHRpb25hbCBNQ1Agc2VydmVyXG4gICAqIGNhbiByZS1leHBvc2UgdGhlbSB3aGVuIHtAbGluayBNYXN0cmFNY3BDb25maWcudG9vbHN9IGlzIGVuYWJsZWQuXG4gICAqL1xuICBhbWJpZW50VG9vbHM6IE1hc3RyYVRvb2xzO1xufVxuXG4vKiogQnVpbGRzIG9uZSBvcHRpb25hbCBvdXRwdXQgcHJvY2Vzc29yIGZvciBhIHJlZ2lzdGVyZWQgTWFzdHJhIGFnZW50LiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhT3V0cHV0UHJvY2Vzc29yRmFjdG9yeSA9IChhZ2VudElkOiBzdHJpbmcpID0+IE91dHB1dFByb2Nlc3NvciB8IHVuZGVmaW5lZDtcblxuLyoqIEZhbGxiYWNrIGFnZW50IGlkIHVzZWQgd2hlbiBgY29uZmlnLmFnZW50c2AgaXMgb21pdHRlZCBlbnRpcmVseS4gKi9cbmV4cG9ydCBjb25zdCBGQUxMQkFDS19BR0VOVF9JRCA9IFwiZGVmYXVsdFwiO1xuXG4vKipcbiAqIERlZmF1bHQgcGVyLXR1cm4gc3RlcCBjZWlsaW5nIGFwcGxpZWQgdG8gZXZlcnkgcmVnaXN0ZXJlZCBhZ2VudFxuICogd2hlbiB7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnLmFnZW50TWF4U3RlcHN9IGlzIHVuc2V0LiBTaXplZCB0b1xuICogZml0IGEgZGVjb21wb3NlZCBHZW5pZSB0dXJuIChncm91bmRpbmcgKyBzZXZlcmFsIGBhc2tfZ2VuaWVgXG4gKiBjYWxscyArIGBwcmVwYXJlX2NoYXJ0YCBwZXIgZGF0YXNldCArIHRoZSBmaW5hbC10ZXh0IHJlcGx5KSB3aXRoXG4gKiBoZWFkcm9vbSBmb3IgdGhlIG1vZGVsIHRvIGNoYWluIGEgY291cGxlIG9mIGZvbGxvdy11cHMgYmVmb3JlXG4gKiBhbnN3ZXJpbmcgLSB3ZWxsIGFib3ZlIE1hc3RyYSdzIG93biBgYWdlbnQuZ2VuZXJhdGVgIGRlZmF1bHQgb2ZcbiAqIDUsIHdoaWNoIHdvdWxkIGN1dCBtdWx0aS1zdGVwIG9yY2hlc3RyYXRpb24gb2ZmIG1pZC1sb29wLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9BR0VOVF9NQVhfU1RFUFMgPSAyNTtcblxuY29uc3QgRVZFTlRFRF9DT05TVFJVQ1RPUl9NT0RFTCA9IHtcbiAgc3BlY2lmaWNhdGlvblZlcnNpb246IFwidjNcIixcbiAgcHJvdmlkZXI6IFwiZGJ4LXRvb2xzXCIsXG4gIG1vZGVsSWQ6IFwiZGVmZXJyZWRcIixcbiAgc3VwcG9ydGVkVXJsczoge30sXG4gIGFzeW5jIGRvR2VuZXJhdGUoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiRGVmZXJyZWQgZXZlbnRlZCBjb25zdHJ1Y3RvciBtb2RlbCBtdXN0IG5vdCBleGVjdXRlXCIpO1xuICB9LFxuICBhc3luYyBkb1N0cmVhbSgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJEZWZlcnJlZCBldmVudGVkIGNvbnN0cnVjdG9yIG1vZGVsIG11c3Qgbm90IGV4ZWN1dGVcIik7XG4gIH0sXG59IGFzIG5ldmVyO1xuXG4vKipcbiAqIGBFdmVudGVkQWdlbnRgIGRlbGVnYXRlcyBtb2RlbCByZXNvbHV0aW9uIHRvIHRoZSB3cmFwcGVkIGFnZW50IGF0IGV4ZWN1dGlvblxuICogdGltZSwgYnV0IGl0cyBjb25zdHJ1Y3RvciBhbHNvIHByb2JlcyBhbiB1bnR5cGVkIGBfX21vZGVsYCBzbG90IGFuZCBvdGhlcndpc2VcbiAqIGNhbGxzIGBnZXRNb2RlbCgpYCB3aXRoIGFuIGVtcHR5IHJlcXVlc3QgY29udGV4dC4gVGVtcG9yYXJpbHkgZmlsbGluZyB0aGF0XG4gKiBwcm9iZSBhdm9pZHMgYW4gZWFnZXIgc2VydmljZS1wcmluY2lwYWwgbG9va3VwIHdoaWxlIHByZXNlcnZpbmcgdGhlIHdyYXBwZWRcbiAqIGFnZW50J3MgcmVxdWVzdC1zY29wZWQgbW9kZWwgcmVzb2x2ZXIgZm9yIHJlYWwgdHVybnMuXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJhY2tncm91bmRBZ2VudChhZ2VudDogQWdlbnQsIG1heFN0ZXBzOiBudW1iZXIpOiBBZ2VudCB7XG4gIGNvbnN0IG1vZGVsU2xvdCA9IFwiX19tb2RlbFwiO1xuICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhZ2VudCwgbW9kZWxTbG90KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFnZW50LCBtb2RlbFNsb3QsIHtcbiAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgdmFsdWU6IEVWRU5URURfQ09OU1RSVUNUT1JfTU9ERUwsXG4gIH0pO1xuICB0cnkge1xuICAgIHJldHVybiBjcmVhdGVFdmVudGVkQWdlbnQoeyBhZ2VudCwgbWF4U3RlcHMgfSkgYXMgdW5rbm93biBhcyBBZ2VudDtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoZGVzY3JpcHRvcikgT2JqZWN0LmRlZmluZVByb3BlcnR5KGFnZW50LCBtb2RlbFNsb3QsIGRlc2NyaXB0b3IpO1xuICAgIGVsc2UgZGVsZXRlIChhZ2VudCBhcyBBZ2VudCAmIHsgX19tb2RlbD86IHVua25vd24gfSkuX19tb2RlbDtcbiAgfVxufVxuXG5jb25zdCBGQUxMQkFDS19BR0VOVF9JTlNUUlVDVElPTlMgPSBgWW91IGFyZSBhIGRhdGEgYW5hbHlzdC4gVGhlIHVzZXIgd2lsbCBhc2sgcXVlc3Rpb25zIGFib3V0XG5idXNpbmVzcyBtZXRyaWNzIGFuZCBtYXkgc2hhcmUgcGVyc29uYWwgcHJlZmVyZW5jZXMgeW91IHNob3VsZCByZW1lbWJlciBhY3Jvc3MgdHVybnMuXG5cblJ1bGVzOlxuXG4xLiBRdW90ZSBudW1iZXJzIGV4YWN0bHkuIE5ldmVyIGludmVudCBkYXRhLlxuMi4gV2hlbiB0aGUgdXNlciBzdGF0ZXMgYSBwcmVmZXJlbmNlIG9yIGR1cmFibGUgZmFjdCBhYm91dCB0aGVtc2VsdmVzXG4gICAoXCJJJ20gaW4gRVUgc28gdXNlIEVVUlwiLCBcImFsd2F5cyBzaG93IG1lIHRoZSBTUUxcIiksIGFja25vd2xlZGdlIHRoYXRcbiAgIHlvdSB3aWxsIHJlbWVtYmVyIGl0LlxuMy4gSWYgeW91IGRvbid0IGhhdmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvIGFuc3dlciwgYXNrIGEgY2xhcmlmeWluZ1xuICAgcXVlc3Rpb24gaW5zdGVhZCBvZiBndWVzc2luZy5gO1xuXG4vKiogVG9vbC1jYWxsIGd1aWRhbmNlIGFwcGVuZGVkIHRvIGV2ZXJ5IHJlZ2lzdGVyZWQgYWdlbnQuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9UT09MX1dPUktGTE9XX0lOU1RSVUNUSU9OUyA9IFtcbiAgXCJUb29sIHdvcmtmbG93OlwiLFxuICBcIldoZW4gdGhlIGFjdGl2ZSBtb2RlbCBzdXBwb3J0cyBpdCwgY2FsbCBtdWx0aXBsZSB0b29scyBpbiB0aGUgc2FtZSB0dXJuIHdoZW4gdGhlaXIgaW5wdXRzIGFyZSBpbmRlcGVuZGVudCwgaW5jbHVkaW5nIG11bHRpcGxlIGNhbGxzIHRvIHRoZSBzYW1lIHRvb2wuXCIsXG4gIFwiS2VlcCBjYWxscyBzZXF1ZW50aWFsIHdoZW4gYSBsYXRlciBpbnB1dCBkZXBlbmRzIG9uIGFuIGVhcmxpZXIgcmVzdWx0IG9yIHdoZW4gY2FsbHMgbXV0YXRlIHRoZSBzYW1lIHJlc291cmNlLlwiLFxuXS5qb2luKFwiXFxuXCIpO1xuXG4vKiogSHlicmlkIHJvdXRpbmcgZ3VpZGFuY2UgYXBwZW5kZWQgYWZ0ZXIgTWFzdHJhJ3MgZ2VuZXJhdGVkIENvZGUgTW9kZSBjb250cmFjdC4gKi9cbmV4cG9ydCBjb25zdCBDT0RFX01PREVfUk9VVElOR19JTlNUUlVDVElPTlMgPSBbXG4gIFwiVG9vbCByb3V0aW5nOlwiLFxuICBcIlRoZSBDb2RlIE1vZGUgY29udHJhY3QgYWJvdmUgZXhwbGFpbnMgaG93IHRvIHVzZSBleGVjdXRlX3R5cGVzY3JpcHQgd2hlbiBzZWxlY3RlZDsgaXQgZG9lcyBub3QgcmVxdWlyZSB1c2luZyBDb2RlIE1vZGUgZm9yIGV2ZXJ5IHRvb2wgY2FsbC5cIixcbiAgXCJDYWxsIGEgZGlyZWN0bHkgZXhwb3NlZCB0b29sIGRpcmVjdGx5IHdoZW4gb25lIG9yZGluYXJ5IGNhbGwgaXMgc3VmZmljaWVudC5cIixcbiAgXCJDYWxsIGluZGVwZW5kZW50IHRvb2xzIGRpcmVjdGx5IGluIHBhcmFsbGVsIHdoZW4gdGhlaXIgcmVzdWx0cyBkbyBub3QgcmVxdWlyZSBjb2RlLXNpZGUgdHJhbnNmb3JtYXRpb24uXCIsXG4gIFwiS2VlcCBkZXBlbmRlbnQgY2FsbHMgYXMgZGlyZWN0IHNlcXVlbnRpYWwgdG9vbCBjYWxscyB3aGVuIGNvZGUtc2lkZSB0cmFuc2Zvcm1hdGlvbiBpcyB1bm5lY2Vzc2FyeS5cIixcbiAgXCJVc2UgZXhlY3V0ZV90eXBlc2NyaXB0IHdoZW4gdGhlIHVzZXIgZXhwbGljaXRseSByZXF1ZXN0cyBDb2RlIE1vZGUgb3Igd2hlbiBjb2RlIGlzIHVzZWZ1bCBmb3IgbG9vcHMsIGZpbHRlcmluZywgam9pbnMsIHJhbmRvbSBzZWxlY3Rpb24sIGFnZ3JlZ2F0aW9uLCBhcml0aG1ldGljLCBkeW5hbWljIGZhbi1vdXQsIG9yIGtlZXBpbmcgc3Vic3RhbnRpYWwgaW50ZXJtZWRpYXRlIHJlc3VsdHMgb3V0IG9mIG1vZGVsIGNvbnRleHQuXCIsXG4gIFwiRG8gbm90IHdyYXAgYSBzaW5nbGUgb3JkaW5hcnkgdG9vbCBjYWxsIGluIGV4ZWN1dGVfdHlwZXNjcmlwdC5cIixcbl0uam9pbihcIlxcblwiKTtcblxuLyoqXG4gKiBTdHlsZSBndWFyZHJhaWxzIGFwcGVuZGVkIHRvIGV2ZXJ5IGFnZW50J3MgYGluc3RydWN0aW9uc2AgdG8gY3VyYlxuICogY29tbW9uIExMTS1pc21zIChlbSBkYXNoZXMsIGVtb2ppcywgc3ljb3BoYW50aWMgb3BlbmVycywgZXhjZXNzaXZlXG4gKiBoZWRnaW5nLCB0aHJvd2F3YXkgY2xvc2VycykuIEFwcGVuZGVkIHJhdGhlciB0aGFuIHByZXBlbmRlZCBzbyB0aGVcbiAqIGFnZW50J3Mgcm9sZS9jb250ZXh0IGNvbWVzIGZpcnN0OyB0aGUgbW9kZWwncyByZWNlbmN5IGJpYXMgdGhlblxuICogaGVscHMgdGhlIHN0eWxlIHJ1bGVzIGRvbWluYXRlIHRoZSByZXNwb25zZSBzdXJmYWNlLlxuICpcbiAqIE92ZXJyaWRlIGdsb2JhbGx5IHZpYSB7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnLnN0eWxlSW5zdHJ1Y3Rpb25zfVxuICogKHBhc3MgYGZhbHNlYCB0byBkaXNhYmxlIGVudGlyZWx5LCBvciBhIHN0cmluZyB0byByZXBsYWNlKS5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU1RZTEVfSU5TVFJVQ1RJT05TID0gW1xuICBcIk91dHB1dCBzdHlsZTpcIixcbiAgXCJcIixcbiAgXCJVc2UgbWFya2Rvd24gZm9ybWF0dGluZywgaW5jbHVkaW5nIGhlYWRpbmdzLCBsaXN0cywgYW5kIGNvZGUgYmxvY2tzLlwiLFxuICBcIkF2b2lkIGxpc3RzIGFuZCBoZWFkZXJzIGZvciBzaG9ydCByZXBsaWVzLlwiLFxuICBcIlBsYWluIHByb3NlLlwiLFxuICBUWVBPR1JBUEhZX1JVTEUsXG4gIFwiU2tpcCBvcGVuZXJzIGxpa2UgJ0dyZWF0IHF1ZXN0aW9uJywgJ0Fic29sdXRlbHknLCBhbmQgJ0knZCBiZSBoYXBweSB0byBoZWxwJy5cIixcbiAgXCJTa2lwIGNsb3NlcnMgbGlrZSAnTGV0IG1lIGtub3cgaWYgeW91IGhhdmUgYW55IHF1ZXN0aW9ucycuXCIsXG4gIFwiU2tpcCBzZWxmLWRpc2NsYWltZXJzIGxpa2UgJ0kgc2hvdWxkIG1lbnRpb24nIGFuZCAnSXQncyBpbXBvcnRhbnQgdG8gbm90ZScuXCIsXG4gIFwiQW5zd2VyIGRpcmVjdGx5LlwiLFxuICBcIkRvIG5vdCBpbmNsdWRlIGEgcHJlYW1ibGUgYmVmb3JlIHRoZSBhY3R1YWwgYW5zd2VyLlwiLFxuICBcIlVzZSBsaXN0cyBhbmQgaGVhZGVycyBvbmx5IHdoZW4gdGhleSBjbGFyaWZ5IGEgbXVsdGktcGFydCBhbnN3ZXIuXCIsXG5dLmpvaW4oXCJcXG5cIik7XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgc3R5bGUgYmxvY2sgdG8gYXBwZW5kIHRvIGV2ZXJ5IGFnZW50J3MgaW5zdHJ1Y3Rpb25zLlxuICogUmV0dXJucyBgbnVsbGAgd2hlbiB0aGUgY2FsbGVyIG9wdGVkIG91dCAoYHN0eWxlSW5zdHJ1Y3Rpb25zOiBmYWxzZWApLlxuICovXG5mdW5jdGlvbiByZXNvbHZlU3R5bGVJbnN0cnVjdGlvbnMoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKGNvbmZpZy5zdHlsZUluc3RydWN0aW9ucyA9PT0gZmFsc2UpIHJldHVybiBudWxsO1xuICBpZiAodHlwZW9mIGNvbmZpZy5zdHlsZUluc3RydWN0aW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBjb25maWcuc3R5bGVJbnN0cnVjdGlvbnM7XG4gIH1cblxuICByZXR1cm4gREVGQVVMVF9TVFlMRV9JTlNUUlVDVElPTlM7XG59XG5cbi8qKiBBcHBlbmQgc2hhcmVkIHdvcmtmbG93IGFuZCBzdHlsZSBibG9ja3Mgd2l0aG91dCBuYXJyb3dpbmcgTWFzdHJhJ3MgaW5zdHJ1Y3Rpb24gc2hhcGVzLiAqL1xuZnVuY3Rpb24gYXBwZW5kRGVmYXVsdEluc3RydWN0aW9ucyhcbiAgaW5zdHJ1Y3Rpb25zOiBBZ2VudEluc3RydWN0aW9ucyxcbiAgc3R5bGU6IHN0cmluZyB8IG51bGwsXG4pOiBBZ2VudEluc3RydWN0aW9ucyB7XG4gIGNvbnN0IHN1ZmZpeCA9IHN0eWxlXG4gICAgPyBgJHtERUZBVUxUX1RPT0xfV09SS0ZMT1dfSU5TVFJVQ1RJT05TfVxcblxcbiR7c3R5bGV9YFxuICAgIDogREVGQVVMVF9UT09MX1dPUktGTE9XX0lOU1RSVUNUSU9OUztcbiAgaWYgKHR5cGVvZiBpbnN0cnVjdGlvbnMgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gYCR7aW5zdHJ1Y3Rpb25zLnRyaW1FbmQoKX1cXG5cXG4ke3N1ZmZpeH1gO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGluc3RydWN0aW9ucykpIHtcbiAgICBpZiAoaW5zdHJ1Y3Rpb25zLmV2ZXJ5KChpbnN0cnVjdGlvbikgPT4gdHlwZW9mIGluc3RydWN0aW9uID09PSBcInN0cmluZ1wiKSkge1xuICAgICAgcmV0dXJuIFsuLi5pbnN0cnVjdGlvbnMsIHN1ZmZpeF0gYXMgQWdlbnRJbnN0cnVjdGlvbnM7XG4gICAgfVxuICAgIHJldHVybiBbLi4uaW5zdHJ1Y3Rpb25zLCB7IHJvbGU6IFwic3lzdGVtXCIsIGNvbnRlbnQ6IHN1ZmZpeCB9XSBhcyBBZ2VudEluc3RydWN0aW9ucztcbiAgfVxuICByZXR1cm4gW2luc3RydWN0aW9ucywgeyByb2xlOiBcInN5c3RlbVwiLCBjb250ZW50OiBzdWZmaXggfV0gYXMgQWdlbnRJbnN0cnVjdGlvbnM7XG59XG5cbi8qKlxuICogQ29tcG9zZSBzdGF0aWMgb3IgcmVxdWVzdC1jb250ZXh0LWF3YXJlIGluc3RydWN0aW9ucyB3aXRoIHNoYXJlZCB3b3JrZmxvd1xuICogYW5kIHN0eWxlIGd1aWRhbmNlIHdoaWxlIHByZXNlcnZpbmcgTWFzdHJhJ3MgbmF0aXZlIGdlbmVyaWMgaW5mZXJlbmNlLlxuICovXG5mdW5jdGlvbiBjb21wb3NlSW5zdHJ1Y3Rpb25zPFRSZXF1ZXN0Q29udGV4dCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5rbm93bj4oXG4gIGFnZW50SW5zdHJ1Y3Rpb25zOiBBZ2VudENvbmZpZzxzdHJpbmcsIFRvb2xzSW5wdXQsIHVuZGVmaW5lZCwgVFJlcXVlc3RDb250ZXh0PltcImluc3RydWN0aW9uc1wiXSxcbiAgc3R5bGU6IHN0cmluZyB8IG51bGwsXG4gIHJlc29sdmVDb2RlTW9kZT86IENvZGVNb2RlUmVzb2x2ZXI8VFJlcXVlc3RDb250ZXh0Pixcbik6IEFnZW50Q29uZmlnPHN0cmluZywgVG9vbHNJbnB1dCwgdW5kZWZpbmVkLCBUUmVxdWVzdENvbnRleHQ+W1wiaW5zdHJ1Y3Rpb25zXCJdIHtcbiAgY29uc3QgYXBwZW5kID0gKGluc3RydWN0aW9uczogQWdlbnRJbnN0cnVjdGlvbnMsIGNvZGVNb2RlSW5zdHJ1Y3Rpb25zPzogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgY29tcG9zZWQgPSBhcHBlbmREZWZhdWx0SW5zdHJ1Y3Rpb25zKGluc3RydWN0aW9ucywgc3R5bGUpO1xuICAgIHJldHVybiBjb2RlTW9kZUluc3RydWN0aW9uc1xuICAgICAgPyBhcHBlbmRJbnN0cnVjdGlvbkJsb2NrKFxuICAgICAgICAgIGNvbXBvc2VkLFxuICAgICAgICAgIGAke2NvZGVNb2RlSW5zdHJ1Y3Rpb25zfVxcblxcbiR7Q09ERV9NT0RFX1JPVVRJTkdfSU5TVFJVQ1RJT05TfWAsXG4gICAgICAgIClcbiAgICAgIDogY29tcG9zZWQ7XG4gIH07XG4gIGlmICh0eXBlb2YgYWdlbnRJbnN0cnVjdGlvbnMgIT09IFwiZnVuY3Rpb25cIiAmJiAhcmVzb2x2ZUNvZGVNb2RlKSB7XG4gICAgcmV0dXJuIGFwcGVuZChhZ2VudEluc3RydWN0aW9ucykgYXMgQWdlbnRDb25maWc8XG4gICAgICBzdHJpbmcsXG4gICAgICBUb29sc0lucHV0LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgVFJlcXVlc3RDb250ZXh0XG4gICAgPltcImluc3RydWN0aW9uc1wiXTtcbiAgfVxuICByZXR1cm4gKGFzeW5jIChhcmdzKSA9PiB7XG4gICAgY29uc3QgW2luc3RydWN0aW9ucywgY29kZU1vZGVdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgdHlwZW9mIGFnZW50SW5zdHJ1Y3Rpb25zID09PSBcImZ1bmN0aW9uXCIgPyBhZ2VudEluc3RydWN0aW9ucyhhcmdzKSA6IGFnZW50SW5zdHJ1Y3Rpb25zLFxuICAgICAgcmVzb2x2ZUNvZGVNb2RlPy4oYXJncyksXG4gICAgXSk7XG4gICAgcmV0dXJuIGFwcGVuZChpbnN0cnVjdGlvbnMsIGNvZGVNb2RlPy5pbnN0cnVjdGlvbnMpO1xuICB9KSBhcyBBZ2VudENvbmZpZzxzdHJpbmcsIFRvb2xzSW5wdXQsIHVuZGVmaW5lZCwgVFJlcXVlc3RDb250ZXh0PltcImluc3RydWN0aW9uc1wiXTtcbn1cblxuLyoqIEFwcGVuZCBvbmUgc3lzdGVtIGluc3RydWN0aW9uIGJsb2NrIHdoaWxlIHByZXNlcnZpbmcgTWFzdHJhJ3MgYWNjZXB0ZWQgc2hhcGVzLiAqL1xuZnVuY3Rpb24gYXBwZW5kSW5zdHJ1Y3Rpb25CbG9jayhpbnN0cnVjdGlvbnM6IEFnZW50SW5zdHJ1Y3Rpb25zLCBibG9jazogc3RyaW5nKTogQWdlbnRJbnN0cnVjdGlvbnMge1xuICBpZiAodHlwZW9mIGluc3RydWN0aW9ucyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGAke2luc3RydWN0aW9ucy50cmltRW5kKCl9XFxuXFxuJHtibG9ja31gO1xuICBpZiAoQXJyYXkuaXNBcnJheShpbnN0cnVjdGlvbnMpKSB7XG4gICAgaWYgKGluc3RydWN0aW9ucy5ldmVyeSgoaW5zdHJ1Y3Rpb24pID0+IHR5cGVvZiBpbnN0cnVjdGlvbiA9PT0gXCJzdHJpbmdcIikpIHtcbiAgICAgIHJldHVybiBbLi4uaW5zdHJ1Y3Rpb25zLCBibG9ja10gYXMgQWdlbnRJbnN0cnVjdGlvbnM7XG4gICAgfVxuICAgIHJldHVybiBbLi4uaW5zdHJ1Y3Rpb25zLCB7IHJvbGU6IFwic3lzdGVtXCIsIGNvbnRlbnQ6IGJsb2NrIH1dIGFzIEFnZW50SW5zdHJ1Y3Rpb25zO1xuICB9XG4gIHJldHVybiBbaW5zdHJ1Y3Rpb25zLCB7IHJvbGU6IFwic3lzdGVtXCIsIGNvbnRlbnQ6IGJsb2NrIH1dIGFzIEFnZW50SW5zdHJ1Y3Rpb25zO1xufVxuXG4vKiogTm9ybWFsaXplIHRoZSBwdWJsaWMgQ29kZSBNb2RlIHNob3J0aGFuZCBpbnRvIG9uZSBzdGFydHVwIGNvbmZpZ3VyYXRpb24uICovXG5mdW5jdGlvbiBub3JtYWxpemVDb2RlTW9kZUNvbmZpZyhcbiAgY29kZU1vZGU6IE1hc3RyYVBsdWdpbkNvbmZpZ1tcImNvZGVNb2RlXCJdLFxuKTogTm9ybWFsaXplZENvZGVNb2RlQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGNvZGVNb2RlID09PSB1bmRlZmluZWQgfHwgY29kZU1vZGUgPT09IGZhbHNlKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gdHlwZW9mIGNvZGVNb2RlID09PSBcInN0cmluZ1wiID8geyB0cmFuc3BvcnQ6IGNvZGVNb2RlIH0gOiBjb2RlTW9kZTtcbn1cblxuLyoqIFRyeSBvbmUgb3B0aW9uYWwgQ29kZSBNb2RlIHRyYW5zcG9ydCB3aXRob3V0IGFwcGx5aW5nIGZhbGxiYWNrIHBvbGljeS4gKi9cbmFzeW5jIGZ1bmN0aW9uIHRyeUNvZGVNb2RlVHJhbnNwb3J0KFxuICBwcm92aWRlcjogRXhjbHVkZTxNYXN0cmFDb2RlTW9kZVRyYW5zcG9ydCwgXCJhdXRvXCI+LFxuKTogUHJvbWlzZTxSZXNvbHZlZENvZGVNb2RlQ29uZmlnIHwgQ29kZU1vZGVGYWlsdXJlPiB7XG4gIGlmIChwcm92aWRlciA9PT0gXCJpc29sYXRlZC12bVwiKSB7XG4gICAgaWYgKCFzdXBwb3J0c0lzb2xhdGVkVm1UcmFuc3BvcnQoKSkge1xuICAgICAgcmV0dXJuIHsgY2F0ZWdvcnk6IFwidW5zdXBwb3J0ZWQtcnVudGltZVwiLCBwcm92aWRlciB9O1xuICAgIH1cbiAgICBsZXQgbW9kdWxlOiB0eXBlb2YgaW1wb3J0KFwiQG1hc3RyYS9pc29sYXRlZC12bVwiKTtcbiAgICB0cnkge1xuICAgICAgbW9kdWxlID0gYXdhaXQgbG9hZElzb2xhdGVkVm1EZXBlbmRlbmN5KCk7XG4gICAgfSBjYXRjaCAoY2F1Z2h0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjYXRlZ29yeTogXCJkZXBlbmRlbmN5LXVuYXZhaWxhYmxlXCIsXG4gICAgICAgIGVycm9yOiB0b0Vycm9yKGNhdWdodCksXG4gICAgICAgIHByb3ZpZGVyLFxuICAgICAgfTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IHByb3ZpZGVyLCB0cmFuc3BvcnQ6IG5ldyBtb2R1bGUuSXNvbGF0ZWRWbUNvZGVNb2RlVHJhbnNwb3J0KCkgfTtcbiAgICB9IGNhdGNoIChjYXVnaHQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNhdGVnb3J5OiBcImNvbnN0cnVjdGlvbi1mYWlsZWRcIixcbiAgICAgICAgZXJyb3I6IHRvRXJyb3IoY2F1Z2h0KSxcbiAgICAgICAgcHJvdmlkZXIsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGlmICghc3VwcG9ydHNRdWlja0pzVHJhbnNwb3J0KCkpIHtcbiAgICByZXR1cm4geyBjYXRlZ29yeTogXCJ1bnN1cHBvcnRlZC1ydW50aW1lXCIsIHByb3ZpZGVyIH07XG4gIH1cbiAgbGV0IG1vZHVsZTogdHlwZW9mIGltcG9ydChcIkBtYXN0cmEvcXVpY2tqc1wiKTtcbiAgdHJ5IHtcbiAgICBtb2R1bGUgPSBhd2FpdCBsb2FkUXVpY2tKc0RlcGVuZGVuY3koKTtcbiAgfSBjYXRjaCAoY2F1Z2h0KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNhdGVnb3J5OiBcImRlcGVuZGVuY3ktdW5hdmFpbGFibGVcIixcbiAgICAgIGVycm9yOiB0b0Vycm9yKGNhdWdodCksXG4gICAgICBwcm92aWRlcixcbiAgICB9O1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIHsgcHJvdmlkZXIsIHRyYW5zcG9ydDogbmV3IG1vZHVsZS5RdWlja0pzQ29kZU1vZGVUcmFuc3BvcnQoKSB9O1xuICB9IGNhdGNoIChjYXVnaHQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY2F0ZWdvcnk6IFwiY29uc3RydWN0aW9uLWZhaWxlZFwiLFxuICAgICAgZXJyb3I6IHRvRXJyb3IoY2F1Z2h0KSxcbiAgICAgIHByb3ZpZGVyLFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNDb2RlTW9kZUZhaWx1cmUoXG4gIHJlc3VsdDogUmVzb2x2ZWRDb2RlTW9kZUNvbmZpZyB8IENvZGVNb2RlRmFpbHVyZSxcbik6IHJlc3VsdCBpcyBDb2RlTW9kZUZhaWx1cmUge1xuICByZXR1cm4gXCJjYXRlZ29yeVwiIGluIHJlc3VsdDtcbn1cblxuLyoqIFByb2R1Y2UgdGhlIGFjdGlvbmFibGUgc3RhcnR1cCBlcnJvciBmb3IgYW4gZXhwbGljaXRseSByZXF1aXJlZCB0cmFuc3BvcnQuICovXG5mdW5jdGlvbiByZXF1aXJlZENvZGVNb2RlRXJyb3IoZmFpbHVyZTogQ29kZU1vZGVGYWlsdXJlKTogQ29uZmlndXJhdGlvbkVycm9yIHtcbiAgY29uc3QgcnVudGltZSA9IHByb2Nlc3MudmVyc2lvbnMuYnVuXG4gICAgPyBgQnVuICR7cHJvY2Vzcy52ZXJzaW9ucy5idW59YFxuICAgIDogYCR7cHJvY2Vzcy5yZWxlYXNlLm5hbWV9ICR7cHJvY2Vzcy52ZXJzaW9ucy5ub2RlfWA7XG4gIGNvbnN0IGluc3RhbGwgPSBgYnVuIGFkZCAke2ZhaWx1cmUucHJvdmlkZXIgPT09IFwiaXNvbGF0ZWQtdm1cIiA/IElTT0xBVEVEX1ZNX1BBQ0tBR0UgOiBRVUlDS0pTX1BBQ0tBR0V9YDtcbiAgY29uc3QgcmVhc29uID1cbiAgICBmYWlsdXJlLmNhdGVnb3J5ID09PSBcInVuc3VwcG9ydGVkLXJ1bnRpbWVcIlxuICAgICAgPyBgaXMgbm90IHN1cHBvcnRlZCBieSAke3J1bnRpbWV9YFxuICAgICAgOiBmYWlsdXJlLmNhdGVnb3J5ID09PSBcImRlcGVuZGVuY3ktdW5hdmFpbGFibGVcIlxuICAgICAgICA/IFwiY291bGQgbm90IGJlIGxvYWRlZFwiXG4gICAgICAgIDogXCJjb3VsZCBub3QgYmUgaW5pdGlhbGl6ZWRcIjtcbiAgcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uRXJyb3IoXG4gICAgYG1hc3RyYTogY29kZU1vZGUgdHJhbnNwb3J0IFwiJHtmYWlsdXJlLnByb3ZpZGVyfVwiICR7cmVhc29ufS4gSW5zdGFsbCB0aGUgb3B0aW9uYWwgdHJhbnNwb3J0IHdpdGggXFxgJHtpbnN0YWxsfVxcYCBhbmQgdXNlIGEgc3VwcG9ydGVkIHJ1bnRpbWUuYCxcbiAgICBmYWlsdXJlLmVycm9yID8geyBjYXVzZTogZmFpbHVyZS5lcnJvciB9IDogdW5kZWZpbmVkLFxuICApO1xufVxuXG4vKiogUmVzb2x2ZSB0aGUgY29uZmlndXJlZCBvcHRpb25hbCB0cmFuc3BvcnQgb25jZSBkdXJpbmcgcGx1Z2luIHN0YXJ0dXAuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQ29kZU1vZGVDb25maWcoXG4gIGNvZGVNb2RlOiBNYXN0cmFQbHVnaW5Db25maWdbXCJjb2RlTW9kZVwiXSxcbik6IFByb21pc2U8UmVzb2x2ZWRDb2RlTW9kZUNvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBjb25maWcgPSBub3JtYWxpemVDb2RlTW9kZUNvbmZpZyhjb2RlTW9kZSk7XG4gIGlmICghY29uZmlnKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHByb3ZpZGVyczogcmVhZG9ubHkgRXhjbHVkZTxNYXN0cmFDb2RlTW9kZVRyYW5zcG9ydCwgXCJhdXRvXCI+W10gPVxuICAgIGNvbmZpZy50cmFuc3BvcnQgPT09IFwiYXV0b1wiID8gW1wiaXNvbGF0ZWQtdm1cIiwgXCJxdWlja2pzXCJdIDogW2NvbmZpZy50cmFuc3BvcnRdO1xuICBjb25zdCBmYWlsdXJlczogQ29kZU1vZGVGYWlsdXJlW10gPSBbXTtcbiAgZm9yIChjb25zdCBwcm92aWRlciBvZiBwcm92aWRlcnMpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cnlDb2RlTW9kZVRyYW5zcG9ydChwcm92aWRlcik7XG4gICAgaWYgKCFpc0NvZGVNb2RlRmFpbHVyZShyZXN1bHQpKSB7XG4gICAgICBjb2RlTW9kZUxvZ2dlci5pbmZvKFwidHJhbnNwb3J0IHNlbGVjdGVkXCIsIHsgcHJvdmlkZXIgfSk7XG4gICAgICByZXR1cm4geyAuLi5yZXN1bHQsIGlkOiBjb25maWcuaWQsIHRpbWVvdXQ6IGNvbmZpZy50aW1lb3V0IH07XG4gICAgfVxuICAgIGZhaWx1cmVzLnB1c2gocmVzdWx0KTtcbiAgICBpZiAoY29uZmlnLnRyYW5zcG9ydCAhPT0gXCJhdXRvXCIpIHRocm93IHJlcXVpcmVkQ29kZU1vZGVFcnJvcihyZXN1bHQpO1xuICAgIGNvbnN0IGZpZWxkcyA9IHtcbiAgICAgIGNhdGVnb3J5OiByZXN1bHQuY2F0ZWdvcnksXG4gICAgICBwcm92aWRlcixcbiAgICAgIC4uLihyZXN1bHQuZXJyb3IgPyB7IGVycm9yOiByZXN1bHQuZXJyb3IgfSA6IHt9KSxcbiAgICB9O1xuICAgIGlmIChyZXN1bHQuY2F0ZWdvcnkgPT09IFwidW5zdXBwb3J0ZWQtcnVudGltZVwiKSB7XG4gICAgICBjb2RlTW9kZUxvZ2dlci5pbmZvKFwiYXV0b21hdGljIHRyYW5zcG9ydCB1bnN1cHBvcnRlZFwiLCBmaWVsZHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb2RlTW9kZUxvZ2dlci53YXJuKFwiYXV0b21hdGljIHRyYW5zcG9ydCB1bmF2YWlsYWJsZVwiLCBmaWVsZHMpO1xuICAgIH1cbiAgfVxuXG4gIGNvZGVNb2RlTG9nZ2VyLmluZm8oXCJhdXRvbWF0aWMgQ29kZSBNb2RlIGRpc2FibGVkXCIsIHtcbiAgICByZWFzb25zOiBmYWlsdXJlcy5tYXAoKHsgY2F0ZWdvcnksIHByb3ZpZGVyIH0pID0+ICh7IGNhdGVnb3J5LCBwcm92aWRlciB9KSksXG4gIH0pO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG50eXBlIENvZGVNb2RlUmVzb2x2ZXI8VFJlcXVlc3RDb250ZXh0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmtub3duID0gdW5rbm93bj4gPSAoXG4gIGFyZ3M6IFBhcmFtZXRlcnM8XG4gICAgRXhjbHVkZTxcbiAgICAgIEFnZW50Q29uZmlnPHN0cmluZywgVG9vbHNJbnB1dCwgdW5kZWZpbmVkLCBUUmVxdWVzdENvbnRleHQ+W1wiaW5zdHJ1Y3Rpb25zXCJdLFxuICAgICAgQWdlbnRJbnN0cnVjdGlvbnNcbiAgICA+XG4gID5bMF0sXG4pID0+IFByb21pc2U8UmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlQ29kZU1vZGU+IHwgdW5kZWZpbmVkPjtcblxuLyoqIEJ1aWxkIHJlcXVlc3Qtc2NvcGVkIG5hdGl2ZSBDb2RlIE1vZGUgb3ZlciBhbGwgZXhlY3V0YWJsZSBjb250ZXh0IHRvb2xzLiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGRDb2RlTW9kZTxUUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVua25vd24+KFxuICBjb25maWc6IFJlc29sdmVkQ29kZU1vZGVDb25maWcsXG4gIHRvb2xzOiBNYXN0cmFUb29scyxcbiAgd29ya3NwYWNlOiBXb3Jrc3BhY2UgfCB1bmRlZmluZWQsXG4gIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dDxUUmVxdWVzdENvbnRleHQ+LFxuKTogUHJvbWlzZTxSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVDb2RlTW9kZT4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgd29ya3NwYWNlVG9vbHMgPSB3b3Jrc3BhY2VcbiAgICA/IGF3YWl0IGNyZWF0ZVdvcmtzcGFjZVRvb2xzKHdvcmtzcGFjZSwgeyByZXF1ZXN0Q29udGV4dCwgd29ya3NwYWNlIH0pXG4gICAgOiB7fTtcbiAgY29uc3QgY29udGV4dFRvb2xzID0geyAuLi50b29scywgLi4ud29ya3NwYWNlVG9vbHMgfTtcbiAgY29uc3QgZXhlY3V0YWJsZVRvb2xzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgIE9iamVjdC5lbnRyaWVzKGNvbnRleHRUb29scykuZmlsdGVyKFxuICAgICAgKFssIHRvb2xdKSA9PlxuICAgICAgICB0eXBlb2YgdG9vbCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICB0b29sICE9PSBudWxsICYmXG4gICAgICAgIFwiZXhlY3V0ZVwiIGluIHRvb2wgJiZcbiAgICAgICAgdHlwZW9mIHRvb2wuZXhlY3V0ZSA9PT0gXCJmdW5jdGlvblwiLFxuICAgICksXG4gICkgYXMgVG9vbHNJbnB1dDtcbiAgaWYgKE9iamVjdC5rZXlzKGV4ZWN1dGFibGVUb29scykubGVuZ3RoID09PSAwKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBjb2RlTW9kZSA9IGNyZWF0ZUNvZGVNb2RlKFxuICAgIHtcbiAgICAgIHRvb2xzOiBleGVjdXRhYmxlVG9vbHMsXG4gICAgICAuLi4oY29uZmlnLmlkICE9PSB1bmRlZmluZWQgPyB7IGlkOiBjb25maWcuaWQgfSA6IHt9KSxcbiAgICAgIC4uLihjb25maWcudGltZW91dCAhPT0gdW5kZWZpbmVkID8geyB0aW1lb3V0OiBjb25maWcudGltZW91dCB9IDoge30pLFxuICAgIH0sXG4gICAgY29uZmlnLnRyYW5zcG9ydCxcbiAgKTtcbiAgaWYgKCEoXCJtYXN0cmFfd29ya3NwYWNlX3JlYWRfZmlsZVwiIGluIHdvcmtzcGFjZVRvb2xzKSkgcmV0dXJuIGNvZGVNb2RlO1xuICByZXR1cm4ge1xuICAgIC4uLmNvZGVNb2RlLFxuICAgIGluc3RydWN0aW9uczogYCR7Y29kZU1vZGUuaW5zdHJ1Y3Rpb25zfVxcblxcbldvcmtzcGFjZSBmaWxlIGNvbnRlbnQgbm90ZTpcXG5UZXh0IHJldHVybmVkIGJ5IGV4dGVybmFsX21hc3RyYV93b3Jrc3BhY2VfcmVhZF9maWxlIHN0YXJ0cyB3aXRoIG9uZSBtZXRhZGF0YSBsaW5lIGNvbnRhaW5pbmcgdGhlIHBhdGggYW5kIHNpemUuIEV4Y2x1ZGUgdGhhdCBmaXJzdCBsaW5lIGJlZm9yZSBjYWxjdWxhdGluZyBjb250ZW50IGNoYXJhY3RlciBjb3VudHMsIGhhc2hlcywgb3Igb3RoZXIgY29udGVudC1vbmx5IHZhbHVlcy5gLFxuICB9O1xufVxuXG4vKiogUmVzb2x2ZSBDb2RlIE1vZGUgbGF6aWx5IHNvIHdvcmtzcGFjZSBhbmQgZHluYW1pYyB0b29sIHBvbGljeSBmb2xsb3cgZWFjaCByZXF1ZXN0LiAqL1xuZnVuY3Rpb24gY29kZU1vZGVSZXNvbHZlcjxUUmVxdWVzdENvbnRleHQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVua25vd24+KFxuICBjb25maWc6IFJlc29sdmVkQ29kZU1vZGVDb25maWcgfCB1bmRlZmluZWQsXG4gIHRvb2xzOiBNYXN0cmFUb29scyxcbiAgd29ya3NwYWNlOiBXb3Jrc3BhY2UgfCB1bmRlZmluZWQsXG4pOiBDb2RlTW9kZVJlc29sdmVyPFRSZXF1ZXN0Q29udGV4dD4gfCB1bmRlZmluZWQge1xuICBpZiAoIWNvbmZpZykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuICh7IHJlcXVlc3RDb250ZXh0IH0pID0+IGJ1aWxkQ29kZU1vZGUoY29uZmlnLCB0b29scywgd29ya3NwYWNlLCByZXF1ZXN0Q29udGV4dCk7XG59XG5cbi8qKlxuICogR2VuZXJhdGVkIGRlc2NyaXB0aW9uIGZvciBhbiBhZ2VudCB3aG9zZSBkZWZpbml0aW9uIG9taXRzIG9uZS4gS2VwdFxuICogZ2VuZXJpYyAodGhlIGFnZW50J3Mgb3duIG5hbWUgaXMgdGhlIG9ubHkgcmVsaWFibGUgc2lnbmFsIGF0IGJ1aWxkXG4gKiB0aW1lKSBzbyBpdCByZWFkcyBzZW5zaWJseSBhcyB0aGUgYGFza188aWQ+YCBNQ1AgdG9vbCdzIGRlc2NyaXB0aW9uXG4gKiBhbmQgaW4gYWdlbnQgbWV0YWRhdGEuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRBZ2VudERlc2NyaXB0aW9uKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgQ29udmVyc2F0aW9uYWwgQUkgYWdlbnQgXCIke25hbWV9XCIuYDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGV2ZXJ5IGVudHJ5IGluIGBjb25maWcuYWdlbnRzYCBpbnRvIGEgTWFzdHJhIGBBZ2VudGBcbiAqIGluc3RhbmNlLiBXaGVuIGBjb25maWcuYWdlbnRzYCBpcyBvbWl0dGVkIHRoZSBwbHVnaW4gcmVnaXN0ZXJzIGFcbiAqIHNpbmdsZSBidWlsdC1pbiBgZGVmYXVsdGAgYW5hbHlzdCBzbyB0aGUgYmFyZSBgbWFzdHJhKClgIGNhbGwgc3RpbGxcbiAqIHlpZWxkcyBhIHdvcmtpbmcgYWdlbnQuXG4gKlxuICogUGVyLWFnZW50IHRvb2wgY2FsbGJhY2tzIGFyZSBpbnZva2VkIG9uY2Ugd2l0aCBhIHR5cGVkXG4gKiB7QGxpbmsgTWFzdHJhUGx1Z2luc30gaW5kZXggYnVpbHQgZnJvbSByZWdpc3RlcmVkIHNpYmxpbmcgcGx1Z2luc1xuICogKGN1cnJlbnRseSBgZ2VuaWVgOyBleHRlbmQgYE1hc3RyYVBsdWdpbnNgIHRvIHN1cmZhY2UgbW9yZSkuXG4gKlxuICogQHRocm93cyB3aGVuIGBjb25maWcuZGVmYXVsdEFnZW50YCBpcyBzZXQgdG8gYW4gaWQgdGhhdCBpc24ndCBpbiB0aGVcbiAqICAgcmVzb2x2ZWQgcmVnaXN0cnk7IHRoaXMgaXMgYSB3aXJpbmcgYnVnLCBub3QgYSBydW50aW1lIGNvbmRpdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQWdlbnRzKG9wdHM6IHtcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWc7XG4gIGNvbnRleHQ6IFBsdWdpbkNvbnRleHRMaWtlIHwgdW5kZWZpbmVkO1xuICBtZW1vcnlCdWlsZGVyPzogTWVtb3J5QnVpbGRlcjtcbiAgb3V0cHV0UHJvY2Vzc29yRmFjdG9yaWVzPzogcmVhZG9ubHkgTWFzdHJhT3V0cHV0UHJvY2Vzc29yRmFjdG9yeVtdO1xuICBsb2c6IExvZ2dlcjtcbiAgLyoqXG4gICAqIExvY2FsIHNraWxsIGZpbGVzeXN0ZW1zIG1vdW50ZWQgaW50byBldmVyeSBhdXRvLWNyZWF0ZWQgZGVmYXVsdCB3b3Jrc3BhY2UuXG4gICAqIFNraWxsIGFjdGl2YXRpb24gY29tZXMgZnJvbSB7QGxpbmsgc3RhbmRhcmRTa2lsbHN9LCBub3Qgd29ya3NwYWNlIHNlYXJjaC5cbiAgICovXG4gIGV4dHJhU2tpbGxNb3VudHM/OiBEYXRhYnJpY2tzV29ya3NwYWNlT3B0aW9uc1tcImV4dHJhU2tpbGxNb3VudHNcIl07XG4gIC8qKiBGYXN0IGluLW1lbW9yeSBza2lsbHMgcGFzc2VkIHRocm91Z2ggTWFzdHJhJ3Mgc3RhbmRhcmQgYWdlbnQgc2tpbGwgdG9vbHMuICovXG4gIHN0YW5kYXJkU2tpbGxzPzogcmVhZG9ubHkgSW5saW5lU2tpbGxbXTtcbiAgLyoqIFN0YW5kYXJkIHNraWxsIG5hbWVzIG9taXR0ZWQgZnJvbSBzbG93ZXIgRGF0YWJyaWNrcyB3b3Jrc3BhY2Ugc2VhcmNoLiAqL1xuICBleGNsdWRlZFdvcmtzcGFjZVNraWxsTmFtZXM/OiByZWFkb25seSBzdHJpbmdbXTtcbn0pOiBQcm9taXNlPEJ1aWx0QWdlbnRzPiB7XG4gIGNvbnN0IHtcbiAgICBjb25maWcsXG4gICAgY29udGV4dCxcbiAgICBtZW1vcnlCdWlsZGVyLFxuICAgIG91dHB1dFByb2Nlc3NvckZhY3RvcmllcyA9IFtdLFxuICAgIGxvZyxcbiAgICBleHRyYVNraWxsTW91bnRzLFxuICAgIHN0YW5kYXJkU2tpbGxzID0gW10sXG4gICAgZXhjbHVkZWRXb3Jrc3BhY2VTa2lsbE5hbWVzID0gW10sXG4gIH0gPSBvcHRzO1xuICBjb25zdCBjb2RlTW9kZUNvbmZpZyA9IGF3YWl0IHJlc29sdmVDb2RlTW9kZUNvbmZpZyhjb25maWcuY29kZU1vZGUpO1xuICBjb25zdCBkZWZpbml0aW9ucyA9IHJlc29sdmVEZWZpbml0aW9ucyhjb25maWcpO1xuICBjb25zdCBpZHMgPSBPYmplY3Qua2V5cyhkZWZpbml0aW9ucyk7XG4gIGNvbnN0IGRlZmF1bHRBZ2VudElkID0gY29uZmlnLmRlZmF1bHRBZ2VudCA/PyBpZHNbMF0gPz8gRkFMTEJBQ0tfQUdFTlRfSUQ7XG5cbiAgY29uc3QgcGx1Z2lucyA9IGJ1aWxkUGx1Z2luc01hcChjb25maWcsIGNvbnRleHQpO1xuICAvLyBTeXN0ZW0tZGVmYXVsdCBhbWJpZW50IHRvb2xzIGV2ZXJ5IGFnZW50IGdldHMgb3V0IG9mIHRoZSBib3g6XG4gIC8vIGByZW5kZXJfZGF0YWAgZm9yIGlubGluZSB2aXN1YWxpemF0aW9ucyBhbmQgYHN1bW1hcml6ZWAgZm9yXG4gIC8vIG9mZmxvYWRpbmcgdGV4dCBjb25kZW5zaW5nIHRvIHRoZSBmYXN0IC8gc21hbGwgY2hhdCB0aWVyLiBUaGVcbiAgLy8gdXNlciBjYW4gc2hhZG93IGVpdGhlciBieSBpbmNsdWRpbmcgYSBzYW1lLW5hbWVkIHRvb2wgaW4gdGhlaXIgb3duXG4gIC8vIGBjb25maWcudG9vbHNgIG9yIHBlci1hZ2VudCBgdG9vbHNgLiBNZXJnZSBvcmRlciBpc1xuICAvLyBgc3lzdGVtIC0+IHN0YW5kYXJkIHNraWxscyAtPiB1c2VyLWFtYmllbnQgLT4gcGVyLWFnZW50YCwgbGFzdCB3cml0ZSB3aW5zLlxuICBjb25zdCBmb2xsb3dVcHMgPSByZXNvbHZlRm9sbG93VXBTdWdnZXN0aW9uc0NvbmZpZyhjb25maWcuZm9sbG93VXBTdWdnZXN0aW9ucyk7XG4gIGNvbnN0IGZvbGxvd1VwUHJvY2Vzc29yID0gYnVpbGRGb2xsb3dVcFN1Z2dlc3Rpb25zUHJvY2Vzc29yKGNvbmZpZyk7XG4gIGNvbnN0IHN5c3RlbVRvb2xzOiBNYXN0cmFUb29scyA9IHtcbiAgICByZW5kZXJfZGF0YTogYnVpbGRSZW5kZXJEYXRhVG9vbChjb25maWcpLFxuICAgIHN1bW1hcml6ZTogYnVpbGRTdW1tYXJpemVUb29sKGNvbmZpZyksXG4gICAgLi4uKGZvbGxvd1Vwcz8uZXhwb3NlVG9vbCAmJiBmb2xsb3dVcHMubW9kZSAhPT0gXCJnZW5pZVwiXG4gICAgICA/IHsgc3VnZ2VzdF9mb2xsb3dfdXBzOiBidWlsZFN1Z2dlc3RGb2xsb3dVcHNUb29sKGNvbmZpZykgfVxuICAgICAgOiB7fSksXG4gIH07XG4gIGNvbnN0IHN0YW5kYXJkU2tpbGxUb29scyA9XG4gICAgc3RhbmRhcmRTa2lsbHMubGVuZ3RoID4gMCA/IGNyZWF0ZVNraWxsVG9vbHMocmVzb2x2ZUFnZW50U2tpbGxzKFsuLi5zdGFuZGFyZFNraWxsc10pKSA6IHt9O1xuICBjb25zdCBhbWJpZW50VG9vbHMgPSB7XG4gICAgLi4uc3lzdGVtVG9vbHMsXG4gICAgLi4uc3RhbmRhcmRTa2lsbFRvb2xzLFxuICAgIC4uLihjb25maWcudG9vbHMgPz8ge30pLFxuICB9O1xuICBjb25zdCBzdHlsZSA9IHJlc29sdmVTdHlsZUluc3RydWN0aW9ucyhjb25maWcpO1xuICAvLyBEZWZhdWx0LW9uIHByb3RlY3Rpb24gYWdhaW5zdCB0aGUgbW9kZWwgY29weWluZyB0dXJuLXNjb3BlZFxuICAvLyBjaGFydElkcyBmcm9tIHByaW9yIGFzc2lzdGFudCB0b29sIHJlc3VsdHMgaW50byB0aGUgbmV3XG4gIC8vIHR1cm4ncyBgW2NoYXJ0OjxpZD5dYCBtYXJrZXJzLiBPcHQgb3V0IHBlci1wbHVnaW4gdmlhXG4gIC8vIGBjb25maWcuc3RyaXBTdGFsZUNoYXJ0czogZmFsc2VgLlxuICBjb25zdCBpbnB1dFByb2Nlc3NvcnMgPSBbXG4gICAgLy8gYHJlbmRlcl9kYXRhYCBjYW4gY2FycnkgaHVuZHJlZHMgb2YgaW5saW5lIHJvd3MuIEtlZXAgdGhlIGNvbXBsZXRlIGNhbGxcbiAgICAvLyBpbiBNZW1vcnkgYW5kIHRoZSBVSSB0cmFuc2NyaXB0LCBidXQgdXNlIE1hc3RyYSdzIG5hdGl2ZSBwcm9tcHQtc3RhZ2VcbiAgICAvLyBmaWx0ZXIgdG8gb21pdCBwcmlvciBjYWxscy9yZXN1bHRzIGZyb20gbGF0ZXIgbW9kZWwgcmVxdWVzdHMuIEN1cnJlbnRcbiAgICAvLyB0dXJuIGNhbGxzIHJlbWFpbiBhdmFpbGFibGUgdG8gdGhlIGFnZW50IGxvb3AuXG4gICAgbmV3IFRvb2xDYWxsRmlsdGVyKHsgZXhjbHVkZTogW1wicmVuZGVyX2RhdGFcIl0gfSksXG4gICAgLi4uKGNvbmZpZy5zdHJpcFN0YWxlQ2hhcnRzID09PSBmYWxzZSA/IFtdIDogW3N0cmlwU3RhbGVDaGFydHNQcm9jZXNzb3JdKSxcbiAgXTtcbiAgY29uc3QgYWdlbnRzOiBSZWNvcmQ8c3RyaW5nLCBBZ2VudD4gPSB7fTtcbiAgY29uc3QgZGVmYXVsdE1vZGVsczogUmVjb3JkPHN0cmluZywgQWdlbnREZWZhdWx0TW9kZWw+ID0ge307XG4gIGNvbnN0IGFwcHJvdmFsR2F0ZWRCeUFnZW50OiBBcnJheTx7IGFnZW50SWQ6IHN0cmluZzsgdG9vbElkczogc3RyaW5nW10gfT4gPSBbXTtcblxuICBmb3IgKGNvbnN0IFtpZCwgZGVmXSBvZiBPYmplY3QuZW50cmllcyhkZWZpbml0aW9ucykpIHtcbiAgICBjb25zdCB1c2VyVG9vbHMgPSBhd2FpdCByZXNvbHZlVXNlclRvb2xzKGRlZi50b29scywgcGx1Z2lucyk7XG4gICAgY29uc3QgdG9vbHMgPSB7IC4uLmFtYmllbnRUb29scywgLi4udXNlclRvb2xzIH07XG4gICAgbGV0IHdvcmtzcGFjZSA9IHJlc29sdmVBZ2VudFdvcmtzcGFjZShkZWYud29ya3NwYWNlKTtcbiAgICBpZiAoXG4gICAgICAoZGVmLndvcmtzcGFjZSA9PT0gdW5kZWZpbmVkICYmICF3b3Jrc3BhY2UpIHx8XG4gICAgICAoKGV4dHJhU2tpbGxNb3VudHM/Lmxlbmd0aCB8fFxuICAgICAgICBjb25maWcuc2FuZGJveCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIGNvbmZpZy53b3Jrc3BhY2VGYWxsYmFja1RvVG1wICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgY29uZmlnLndvcmtzcGFjZVRvb2xzICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgY29udGV4dCAhPT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICBpc0RlZmF1bHRXb3Jrc3BhY2Uod29ya3NwYWNlKSlcbiAgICApIHtcbiAgICAgIHdvcmtzcGFjZSA9IGRhdGFicmlja3NXb3Jrc3BhY2Uoe1xuICAgICAgICBleHRyYVNraWxsTW91bnRzLFxuICAgICAgICBleGNsdWRlU2tpbGxOYW1lczogZXhjbHVkZWRXb3Jrc3BhY2VTa2lsbE5hbWVzLFxuICAgICAgICBmYWxsYmFja1RvVG1wOiBjb25maWcud29ya3NwYWNlRmFsbGJhY2tUb1RtcCxcbiAgICAgICAgLi4uKGNvbmZpZy53b3Jrc3BhY2VUb29scyAhPT0gdW5kZWZpbmVkID8geyB0b29sczogY29uZmlnLndvcmtzcGFjZVRvb2xzIH0gOiB7fSksXG4gICAgICAgIHBsdWdpbkNvbnRleHQ6IGNvbnRleHQsXG4gICAgICAgIHNhbmRib3g6IGNvbmZpZy5zYW5kYm94LFxuICAgICAgfSk7XG4gICAgICBtYXJrRGVmYXVsdFdvcmtzcGFjZSh3b3Jrc3BhY2UpO1xuICAgIH0gZWxzZSBpZiAod29ya3NwYWNlKSB7XG4gICAgICB3b3Jrc3BhY2UgPSBiaW5kRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQod29ya3NwYWNlLCBjb250ZXh0LCBleGNsdWRlZFdvcmtzcGFjZVNraWxsTmFtZXMpO1xuICAgIH1cbiAgICBjb25zdCBnYXRlZCA9IGFwcHJvdmFsR2F0ZWRUb29sSWRzKHRvb2xzKTtcbiAgICBpZiAoZ2F0ZWQubGVuZ3RoID4gMCkgYXBwcm92YWxHYXRlZEJ5QWdlbnQucHVzaCh7IGFnZW50SWQ6IGlkLCB0b29sSWRzOiBnYXRlZCB9KTtcbiAgICBjb25zdCBtZW1vcnkgPSBtZW1vcnlCdWlsZGVyPy5mb3JBZ2VudChpZCwgZGVmKTtcbiAgICBjb25zdCByZXNvbHZlQ29kZU1vZGUgPSBjb2RlTW9kZVJlc29sdmVyKGNvZGVNb2RlQ29uZmlnLCB0b29scywgd29ya3NwYWNlKTtcbiAgICBjb25zdCBhZ2VudCA9IG5ldyBBZ2VudCh7XG4gICAgICBpZCxcbiAgICAgIG5hbWU6IGRlZi5uYW1lID8/IGlkLFxuICAgICAgLy8gQWx3YXlzIGNhcnJ5IGEgbm9uLWVtcHR5IGRlc2NyaXB0aW9uOiBpdCdzIHN1cmZhY2VkIHRvIE1DUFxuICAgICAgLy8gY2xpZW50cyAod2hpY2ggcmVqZWN0IGEgZGVzY3JpcHRpb24tbGVzcyBhZ2VudCkgYW5kIGluIGFnZW50XG4gICAgICAvLyBtZXRhZGF0YS4gRmFsbCBiYWNrIHRvIGEgZ2VuZXJhdGVkIG9uZSB3aGVuIHRoZSBkZWZpbml0aW9uXG4gICAgICAvLyBvbWl0cyBpdC5cbiAgICAgIGRlc2NyaXB0aW9uOiBkZWYuZGVzY3JpcHRpb24/LnRyaW0oKSB8fCBkZWZhdWx0QWdlbnREZXNjcmlwdGlvbihkZWYubmFtZSA/PyBpZCksXG4gICAgICBpbnN0cnVjdGlvbnM6IGNvbXBvc2VJbnN0cnVjdGlvbnMoZGVmLmluc3RydWN0aW9ucywgc3R5bGUsIHJlc29sdmVDb2RlTW9kZSksXG4gICAgICAuLi4oZGVmLnJlcXVlc3RDb250ZXh0U2NoZW1hID8geyByZXF1ZXN0Q29udGV4dFNjaGVtYTogZGVmLnJlcXVlc3RDb250ZXh0U2NoZW1hIH0gOiB7fSksXG4gICAgICBtb2RlbDogcmVzb2x2ZU1vZGVsKGNvbmZpZywgZGVmLm1vZGVsKSxcbiAgICAgIGRlZmF1bHRPcHRpb25zOiAoeyByZXF1ZXN0Q29udGV4dCB9KSA9PlxuICAgICAgICB3aXRoUmVxdWVzdE1lbW9yeVNjb3BlKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1heFN0ZXBzOiBjb25maWcuYWdlbnRNYXhTdGVwcyA/PyBERUZBVUxUX0FHRU5UX01BWF9TVEVQUyxcbiAgICAgICAgICAgIHByb3ZpZGVyT3B0aW9uczogUkVTUE9OU0VTX1BST1ZJREVSX09QVElPTlMsXG4gICAgICAgICAgICAuLi4oZGVmLnJlcXVpcmVUb29sQXBwcm92YWwgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IHsgcmVxdWlyZVRvb2xBcHByb3ZhbDogZGVmLnJlcXVpcmVUb29sQXBwcm92YWwgfVxuICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1lbW9yeSA/IHJlcXVlc3RDb250ZXh0IDogdW5kZWZpbmVkLFxuICAgICAgICApLFxuICAgICAgdG9vbHM6IHJlc29sdmVDb2RlTW9kZVxuICAgICAgICA/IGFzeW5jIChhcmdzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb2RlTW9kZSA9IGF3YWl0IHJlc29sdmVDb2RlTW9kZShhcmdzKTtcbiAgICAgICAgICAgIHJldHVybiBjb2RlTW9kZSA/IHsgLi4udG9vbHMsIFtjb2RlTW9kZS50b29sLmlkXTogY29kZU1vZGUudG9vbCB9IDogdG9vbHM7XG4gICAgICAgICAgfVxuICAgICAgICA6IHRvb2xzLFxuICAgICAgLi4uKG1lbW9yeSA/IHsgbWVtb3J5IH0gOiB7fSksXG4gICAgICAuLi4od29ya3NwYWNlID8geyB3b3Jrc3BhY2UgfSA6IHt9KSxcbiAgICAgIGlucHV0UHJvY2Vzc29yczogWy4uLmlucHV0UHJvY2Vzc29ycywgLi4ud29ya3NwYWNlU2tpbGxJbnB1dFByb2Nlc3NvcnMod29ya3NwYWNlLCBjb25maWcpXSxcbiAgICAgIG91dHB1dFByb2Nlc3NvcnM6IFtcbiAgICAgICAgdG9vbEVycm9yTG9nZ2luZ1Byb2Nlc3Nvcihsb2cpLFxuICAgICAgICAuLi4oZm9sbG93VXBQcm9jZXNzb3IgPyBbZm9sbG93VXBQcm9jZXNzb3JdIDogW10pLFxuICAgICAgICAuLi5vdXRwdXRQcm9jZXNzb3JGYWN0b3JpZXMuZmxhdE1hcCgoZmFjdG9yeSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHByb2Nlc3NvciA9IGZhY3RvcnkoaWQpO1xuICAgICAgICAgIHJldHVybiBwcm9jZXNzb3IgPyBbcHJvY2Vzc29yXSA6IFtdO1xuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG4gICAgYWdlbnRzW2lkXSA9XG4gICAgICBjb25maWcuYmFja2dyb3VuZFR1cm5zID09PSBmYWxzZVxuICAgICAgICA/IGFnZW50XG4gICAgICAgIDogY3JlYXRlQmFja2dyb3VuZEFnZW50KGFnZW50LCBjb25maWcuYWdlbnRNYXhTdGVwcyA/PyBERUZBVUxUX0FHRU5UX01BWF9TVEVQUyk7XG4gICAgLy8gU3VyZmFjZSB0aGUgZWZmZWN0aXZlIGRlZmF1bHQgbW9kZWwgcGVyIGFnZW50IHNvIG9wZXJhdG9ycyBjYW5cbiAgICAvLyBzZWUgYXQgYSBnbGFuY2Ugd2hpY2ggZW5kcG9pbnQgZWFjaCBhZ2VudCBwb2ludHMgYXQgd2l0aG91dFxuICAgIC8vIGhhdmluZyB0byBmaXJlIGEgcmVxdWVzdCBhbmQgaW5zcGVjdCBhIHRyYWNlLiBUaGUgdmFsdWUgaXMgdGhlXG4gICAgLy8gKnN0YXRpYyogZGVmYXVsdDsgcGVyLXJlcXVlc3Qgb3ZlcnJpZGVzIChoZWFkZXIgLyBxdWVyeSAvXG4gICAgLy8gYm9keSkgYW5kIHRoZSB3b3Jrc3BhY2UtY2F0YWxvZ3VlIGZ1enp5IG1hdGNoIHN0aWxsIGFwcGx5IGF0XG4gICAgLy8gY2FsbCB0aW1lLlxuICAgIGNvbnN0IGRlZmF1bHRNb2RlbCA9IGRlc2NyaWJlQWdlbnREZWZhdWx0TW9kZWwoY29uZmlnLCBkZWYpO1xuICAgIGRlZmF1bHRNb2RlbHNbaWRdID0gZGVmYXVsdE1vZGVsO1xuICAgIGxvZy5pbmZvKFwiYWdlbnQgcmVnaXN0ZXJlZFwiLCB7XG4gICAgICBpZCxcbiAgICAgIG5hbWU6IGRlZi5uYW1lID8/IGlkLFxuICAgICAgZGVmYXVsdE1vZGVsOlxuICAgICAgICBkZWZhdWx0TW9kZWwua2luZCA9PT0gXCJjb25maWd1cmVkXCIgPyBkZWZhdWx0TW9kZWwubW9kZWwgOiBgPCR7ZGVmYXVsdE1vZGVsLmtpbmR9PmAsXG4gICAgICB0b29sczogWy4uLk9iamVjdC5rZXlzKHRvb2xzKSwgLi4uKHJlc29sdmVDb2RlTW9kZSA/IFtcIjxkeW5hbWljLWNvZGUtbW9kZT5cIl0gOiBbXSldLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKCFhZ2VudHNbZGVmYXVsdEFnZW50SWRdKSB7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICBgbWFzdHJhIGRlZmF1bHRBZ2VudCBcIiR7ZGVmYXVsdEFnZW50SWR9XCJgLFxuICAgICAgYFJlZ2lzdGVyZWQgYWdlbnRzOiAke2lkcy5qb2luKFwiLCBcIikgfHwgXCJub25lXCJ9LmAsXG4gICAgKTtcbiAgfVxuXG4gIGFzc2VydEFwcHJvdmFsR2F0ZWRUb29sc0hhdmVTdG9yYWdlKGFwcHJvdmFsR2F0ZWRCeUFnZW50LCBtZW1vcnlCdWlsZGVyKTtcblxuICBsb2cuaW5mbyhcImFnZW50cyByZWFkeVwiLCB7IGlkcywgZGVmYXVsdEFnZW50SWQgfSk7XG4gIHJldHVybiB7IGFnZW50cywgZGVmYXVsdEFnZW50SWQsIGRlZmF1bHRNb2RlbHMsIGFtYmllbnRUb29scyB9O1xufVxuXG4vKiogTG9nIGZhaWxlZCB0b29sIGNhbGxzIHdpdGhvdXQgY2hhbmdpbmcgdGhlIGNodW5rcyByZXR1cm5lZCB0byB0aGUgY2xpZW50LiAqL1xuZnVuY3Rpb24gdG9vbEVycm9yTG9nZ2luZ1Byb2Nlc3Nvcihsb2dnZXI6IExvZ2dlcik6IE91dHB1dFByb2Nlc3NvciB7XG4gIHJldHVybiB7XG4gICAgaWQ6IFwidG9vbC1lcnJvci1sb2dnZXJcIixcbiAgICBhc3luYyBwcm9jZXNzT3V0cHV0U3RyZWFtKHsgcGFydCB9KSB7XG4gICAgICBpZiAocGFydC50eXBlID09PSBcInRvb2wtZXJyb3JcIikge1xuICAgICAgICBjb25zdCBlcnJvciA9IHRvRXJyb3IocGFydC5wYXlsb2FkLmVycm9yKTtcbiAgICAgICAgbG9nZ2VyLmVycm9yKFwidG9vbCBleGVjdXRpb24gZmFpbGVkXCIsIHtcbiAgICAgICAgICB0b29sTmFtZTogcGFydC5wYXlsb2FkLnRvb2xOYW1lLFxuICAgICAgICAgIHRvb2xDYWxsSWQ6IHBhcnQucGF5bG9hZC50b29sQ2FsbElkLFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJ0O1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHdvcmtzcGFjZVNraWxsSW5wdXRQcm9jZXNzb3JzKFxuICB3b3Jrc3BhY2U6IFdvcmtzcGFjZSB8IHVuZGVmaW5lZCxcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4pOiBTa2lsbFNlYXJjaFByb2Nlc3NvcltdIHtcbiAgaWYgKCF3b3Jrc3BhY2UgfHwgY29uZmlnLndvcmtzcGFjZVNraWxscyA9PT0gZmFsc2UpIHJldHVybiBbXTtcbiAgY29uc3Qgb3B0aW9ucyA9IHR5cGVvZiBjb25maWcud29ya3NwYWNlU2tpbGxzID09PSBcIm9iamVjdFwiID8gY29uZmlnLndvcmtzcGFjZVNraWxscyA6IHVuZGVmaW5lZDtcbiAgaWYgKCF3b3Jrc3BhY2Uuc2tpbGxzKSByZXR1cm4gW107XG4gIHJldHVybiBbXG4gICAgbmV3IFNraWxsU2VhcmNoUHJvY2Vzc29yKHtcbiAgICAgIHdvcmtzcGFjZSxcbiAgICAgIHNlYXJjaDoge1xuICAgICAgICB0b3BLOiBvcHRpb25zPy50b3BLID8/IDUsXG4gICAgICAgIG1pblNjb3JlOiBvcHRpb25zPy5taW5TY29yZSA/PyAwLjEsXG4gICAgICB9LFxuICAgICAgLi4uKG9wdGlvbnM/LnR0bE1zICE9PSB1bmRlZmluZWQgPyB7IHR0bDogb3B0aW9ucy50dGxNcyB9IDoge30pLFxuICAgICAgYmxvY2tpbmdSZWZyZXNoOiBmYWxzZSxcbiAgICB9KSxcbiAgXTtcbn1cblxuLyoqXG4gKiBUb29sIGlkcyBvbiBgdG9vbHNgIHRoYXQgYXJlIGFwcHJvdmFsLWdhdGVkIChgcmVxdWlyZUFwcHJvdmFsOiB0cnVlYCkuXG4gKiBLZXlzIGFyZSB1c2VkIGFzIGEgZmFsbGJhY2sgd2hlbiBhIHRvb2wgb21pdHMgYW4gZXhwbGljaXQgYGlkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcHJvdmFsR2F0ZWRUb29sSWRzKHRvb2xzOiBNYXN0cmFUb29scyk6IHN0cmluZ1tdIHtcbiAgaWYgKCF0b29scyB8fCB0eXBlb2YgdG9vbHMgIT09IFwib2JqZWN0XCIpIHJldHVybiBbXTtcbiAgcmV0dXJuIFtcbiAgICAuLi5zZXF1ZW5jZShPYmplY3QuZW50cmllcyh0b29scykpXG4gICAgICAuZmlsdGVyKChbLCB0b29sXSkgPT4gaXNBcHByb3ZhbEdhdGVkVG9vbCh0b29sKSlcbiAgICAgIC5tYXAoKFtrZXksIHRvb2xdKSA9PiByZXNvbHZlVG9vbElkKHRvb2wsIGtleSkpLFxuICBdO1xufVxuXG4vKiogVHJ1ZSB3aGVuIGEgTWFzdHJhIC8gQUkgU0RLIHRvb2wgcGF1c2VzIGZvciBodW1hbiBhcHByb3ZhbCBiZWZvcmUgZXhlY3V0ZS4gKi9cbmZ1bmN0aW9uIGlzQXBwcm92YWxHYXRlZFRvb2wodG9vbDogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIXRvb2wgfHwgdHlwZW9mIHRvb2wgIT09IFwib2JqZWN0XCIpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuICh0b29sIGFzIHsgcmVxdWlyZUFwcHJvdmFsPzogYm9vbGVhbiB9KS5yZXF1aXJlQXBwcm92YWwgPT09IHRydWU7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVUb29sSWQodG9vbDogdW5rbm93biwgZmFsbGJhY2tLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICh0b29sICYmIHR5cGVvZiB0b29sID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiAodG9vbCBhcyB7IGlkPzogc3RyaW5nIH0pLmlkID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuICh0b29sIGFzIHsgaWQ6IHN0cmluZyB9KS5pZDtcbiAgfVxuICByZXR1cm4gZmFsbGJhY2tLZXk7XG59XG5cbi8qKlxuICogQXBwcm92YWwtZ2F0ZWQgdG9vbHMgc3VzcGVuZCB0aGUgYWdlbnQgbG9vcCB1bnRpbCBhIGh1bWFuIGFwcHJvdmVzLlxuICogTWFzdHJhIHBlcnNpc3RzIHRob3NlIHN1c3BlbmRlZCBydW5zIGluIE1hc3RyYS1pbnN0YW5jZS1sZXZlbCBzdG9yYWdlXG4gKiAoYG1lbW9yeUJ1aWxkZXIuaW5zdGFuY2VTdG9yYWdlKClgKSwgbm90IHBlci1hZ2VudCBtZW1vcnkgLSBzbyBib290XG4gKiBtdXN0IGZhaWwgZmFzdCB3aGVuIHN1Y2ggYSB0b29sIGlzIHJlZ2lzdGVyZWQgd2l0aG91dCBzdG9yYWdlLlxuICovXG5mdW5jdGlvbiBhc3NlcnRBcHByb3ZhbEdhdGVkVG9vbHNIYXZlU3RvcmFnZShcbiAgZ2F0ZWQ6IEFycmF5PHsgYWdlbnRJZDogc3RyaW5nOyB0b29sSWRzOiBzdHJpbmdbXSB9PixcbiAgbWVtb3J5QnVpbGRlcjogTWVtb3J5QnVpbGRlciB8IHVuZGVmaW5lZCxcbik6IHZvaWQge1xuICBpZiAoZ2F0ZWQubGVuZ3RoID09PSAwKSByZXR1cm47XG4gIGlmIChtZW1vcnlCdWlsZGVyPy5pbnN0YW5jZVN0b3JhZ2UoKSkgcmV0dXJuO1xuXG4gIGNvbnN0IGRldGFpbCA9IGdhdGVkXG4gICAgLm1hcCgoeyBhZ2VudElkLCB0b29sSWRzIH0pID0+IGAke2FnZW50SWR9OiAke3Rvb2xJZHMuam9pbihcIiwgXCIpfWApXG4gICAgLmpvaW4oXCI7IFwiKTtcbiAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihcbiAgICBcIm1hc3RyYTogYXBwcm92YWwtZ2F0ZWQgdG9vbHMgcmVxdWlyZSBwbHVnaW4gc3RvcmFnZSAoUG9zdGdyZXNTdG9yZSkgdG8gcGVyc2lzdCBzdXNwZW5kZWQgcnVucy4gXCIgK1xuICAgICAgYEFmZmVjdGVkIGFnZW50cy90b29sczogJHtkZXRhaWx9LiBgICtcbiAgICAgIFwiUmVnaXN0ZXIgbGFrZWJhc2UoKSBiZWZvcmUgbWFzdHJhKCkgc28gc3RvcmFnZSBhdXRvLWVuYWJsZXMsIG9yIHBhc3Mgc3RvcmFnZTogdHJ1ZSBleHBsaWNpdGx5LlwiLFxuICApO1xufVxuXG4vKipcbiAqIERlc2NyaWJlIGhvdyBhbiBhZ2VudCByZXNvbHZlcyBpdHMgdW5waW5uZWQgbW9kZWw6XG4gKlxuICogICAxLiBQZXItYWdlbnQgYGRlZi5tb2RlbGAgKHN0cmluZyBzdWdhciBpcyBjb25maWd1cmVkOyBhIGZ1bmN0aW9uIGlzXG4gKiAgICAgIGR5bmFtaWMpLlxuICogICAyLiBQbHVnaW4tbGV2ZWwgYGNvbmZpZy5kZWZhdWx0TW9kZWxgIChzYW1lIHJ1bGVzKS5cbiAqICAgMy4gYERBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FYCBlbnYgdmFyLlxuICogICA0LiBBdXRvbWF0aWMgbGl2ZS1jYXRhbG9ndWUgcmFua2luZyB3aGVuIG5vbmUgaXMgc2V0LlxuICpcbiAqIFVzZWQgZm9yIHRoZSBzdGFydHVwIGBhZ2VudCByZWdpc3RlcmVkYCBsb2cgc28gb3BlcmF0b3JzIGNhbiBzZWVcbiAqIGBkZWZhdWx0TW9kZWxGYWxsYmFja3NgIHJlbWFpbnMgYW4gb3BlcmF0b3ItcGlubmVkIGNhbmRpZGF0ZSBsaXN0IGluc2lkZSB0aGVcbiAqIGF1dG9tYXRpYyBsaXZlIGxvb2t1cDsgaXQgaXMgbm90IGFkdmVydGlzZWQgYXMgYSBtb2RlbCB1bnRpbCBhdmFpbGFiaWxpdHkgaXNcbiAqIGNoZWNrZWQuXG4gKi9cbmZ1bmN0aW9uIGRlc2NyaWJlQWdlbnREZWZhdWx0TW9kZWwoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICBkZWY6IEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbixcbik6IEFnZW50RGVmYXVsdE1vZGVsIHtcbiAgY29uc3QgZWZmZWN0aXZlID0gZGVmLm1vZGVsID8/IGNvbmZpZy5kZWZhdWx0TW9kZWw7XG4gIGlmICh0eXBlb2YgZWZmZWN0aXZlID09PSBcInN0cmluZ1wiKSByZXR1cm4geyBraW5kOiBcImNvbmZpZ3VyZWRcIiwgbW9kZWw6IGVmZmVjdGl2ZSB9O1xuICBpZiAoZWZmZWN0aXZlICE9PSB1bmRlZmluZWQpIHJldHVybiB7IGtpbmQ6IFwiZHluYW1pY1wiIH07XG4gIGNvbnN0IGVudmlyb25tZW50ID0gcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUU7XG4gIHJldHVybiBlbnZpcm9ubWVudCA/IHsga2luZDogXCJjb25maWd1cmVkXCIsIG1vZGVsOiBlbnZpcm9ubWVudCB9IDogeyBraW5kOiBcImF1dG9cIiB9O1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZSBgY29uZmlnLmFnZW50c2AgaW50byBhIGBSZWNvcmQ8aWQsIGRlZmluaXRpb24+YC4gQWNjZXB0c1xuICogYW55IG9mIHRoZSB0aHJlZSBzaGFwZXMgZG9jdW1lbnRlZCBvblxuICoge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5hZ2VudHN9OlxuICpcbiAqIC0gUmVjb3JkIC0gcmV0dXJuZWQgYXMtaXMgd2hlbiBub24tZW1wdHkuXG4gKiAtIFNpbmdsZSBkZWZpbml0aW9uIChkZXRlY3RlZCB2aWEgdGhlIHJlcXVpcmVkIGBpbnN0cnVjdGlvbnNgXG4gKiAgIGZpZWxkKSAtIGtleWVkIGJ5IGBzbHVnaWZ5KGRlZi5uYW1lKWAgb3IgYEZBTExCQUNLX0FHRU5UX0lEYC5cbiAqIC0gQXJyYXkgLSBrZXllZCBieSBgc2x1Z2lmeShkZWYubmFtZSlgIG9yIGBhZ2VudF8ke2l9YDsgZHVwbGljYXRlXG4gKiAgIHNsdWdzIGZhaWwgbG91ZGx5IHNvIHVzZXJzIGtub3cgdG8gc2V0IGV4cGxpY2l0IG5hbWVzLlxuICpcbiAqIE9taXR0ZWQgb3IgZW1wdHkgaW5wdXRzIGZhbGwgYmFjayB0byBhIHNpbmdsZSBidWlsdC1pbiBhbmFseXN0IHNvXG4gKiB0aGUgYmFyZSBgbWFzdHJhKClgIGNhbGwgc3RpbGwgbW91bnRzIGEgd29ya2luZyBjaGF0IHJvdXRlLlxuICovXG5mdW5jdGlvbiByZXNvbHZlRGVmaW5pdGlvbnMoY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcpOiBSZWNvcmQ8c3RyaW5nLCBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24+IHtcbiAgY29uc3QgaW5wdXQgPSBjb25maWcuYWdlbnRzO1xuICBpZiAoIWlucHV0KSByZXR1cm4gZmFsbGJhY2tEZWZpbml0aW9ucygpO1xuXG4gIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkge1xuICAgIGlmIChpbnB1dC5sZW5ndGggPT09IDApIHJldHVybiBmYWxsYmFja0RlZmluaXRpb25zKCk7XG4gICAgY29uc3Qgb3V0OiBSZWNvcmQ8c3RyaW5nLCBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24+ID0ge307XG4gICAgaW5wdXQuZm9yRWFjaCgoZGVmLCBpKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBkZXJpdmVBZ2VudEtleShkZWYsIGkpO1xuICAgICAgaWYgKG91dFtrZXldKSB7XG4gICAgICAgIHRocm93IG5ldyBDb25maWd1cmF0aW9uRXJyb3IoXG4gICAgICAgICAgYG1hc3RyYTogZHVwbGljYXRlIGFnZW50IGlkIFwiJHtrZXl9XCIgZGVyaXZlZCBmcm9tIG5hbWUgXCIke2RlZi5uYW1lID8/IFwiXCJ9XCI7IGAgK1xuICAgICAgICAgICAgYHNldCB1bmlxdWUgXFxgbmFtZVxcYHMgb24gZWFjaCBkZWZpbml0aW9uYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIG91dFtrZXldID0gZGVmO1xuICAgIH0pO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICAvLyBTaW5nbGUtZGVmaW5pdGlvbiBzaG9ydGhhbmQ6IGFuIGFnZW50IG93bnMgdGhlIHJlcXVpcmVkIGBpbnN0cnVjdGlvbnNgXG4gIC8vIGZpZWxkIChzdGF0aWMgb3IgZHluYW1pYyk7IGEgcmVjb3JkLW9mLWFnZW50cyBuZXZlciBvd25zIGl0IGRpcmVjdGx5LlxuICBpZiAoXCJpbnN0cnVjdGlvbnNcIiBpbiBpbnB1dCkge1xuICAgIGNvbnN0IGRlZiA9IGlucHV0IGFzIEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbjtcbiAgICBjb25zdCBrZXkgPSBkZXJpdmVBZ2VudEtleShkZWYpO1xuICAgIHJldHVybiB7IFtrZXldOiBkZWYgfTtcbiAgfVxuXG4gIGNvbnN0IHJlY29yZCA9IGlucHV0IGFzIFJlY29yZDxzdHJpbmcsIEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbj47XG4gIGlmIChPYmplY3Qua2V5cyhyZWNvcmQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbGxiYWNrRGVmaW5pdGlvbnMoKTtcbiAgcmV0dXJuIHJlY29yZDtcbn1cblxuLyoqIERlcml2ZSBhIHJlZ2lzdHJ5IGlkIGZyb20gYSBkZWZpbml0aW9uJ3MgYG5hbWVgLCB3aXRoIGEgZmFsbGJhY2suICovXG5mdW5jdGlvbiBkZXJpdmVBZ2VudEtleShkZWY6IEFueU1hc3RyYUFnZW50RGVmaW5pdGlvbiwgaW5kZXg/OiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoZGVmLm5hbWUpIHtcbiAgICBjb25zdCBzbHVnID0gdG9JZGVudGlmaWVyKGRlZi5uYW1lKTtcbiAgICBpZiAoc2x1ZykgcmV0dXJuIHNsdWc7XG4gIH1cbiAgcmV0dXJuIGluZGV4ID09PSB1bmRlZmluZWQgPyBGQUxMQkFDS19BR0VOVF9JRCA6IGBhZ2VudF8ke2luZGV4fWA7XG59XG5cbi8qKiBCdWlsdC1pbiBmYWxsYmFjayByZWdpc3RyeSB1c2VkIHdoZW4gYGFnZW50c2AgaXMgb21pdHRlZCAvIGVtcHR5LiAqL1xuZnVuY3Rpb24gZmFsbGJhY2tEZWZpbml0aW9ucygpOiBSZWNvcmQ8c3RyaW5nLCBBbnlNYXN0cmFBZ2VudERlZmluaXRpb24+IHtcbiAgcmV0dXJuIHtcbiAgICBbRkFMTEJBQ0tfQUdFTlRfSURdOiB7XG4gICAgICBuYW1lOiBcIkRlZmF1bHQgQWdlbnRcIixcbiAgICAgIGluc3RydWN0aW9uczogRkFMTEJBQ0tfQUdFTlRfSU5TVFJVQ1RJT05TLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogUGljayB0aGUgZWZmZWN0aXZlIG1vZGVsIHNwZWMgZm9yIGFuIGFnZW50LiBGYWxsYmFjayBsYWRkZXIsIGluXG4gKiBvcmRlcjpcbiAqXG4gKiAgIDEuIFBlci1hZ2VudCBgZGVmLm1vZGVsYCAoc3RyaW5nIHN1Z2FyIG9yIGBEeW5hbWljQXJndW1lbnRgKS5cbiAqICAgMi4gUGx1Z2luLWxldmVsIGBjb25maWcuZGVmYXVsdE1vZGVsYCAoc3RyaW5nIHN1Z2FyIG9yXG4gKiAgICAgIGBEeW5hbWljQXJndW1lbnRgKSAtIG1pcnJvcnMgQXBwS2l0J3MgYGFnZW50cyh7IGRlZmF1bHRNb2RlbCB9KWAuXG4gKiAgIDMuIFRoZSBhdXRvLXJlc29sdmVyIHRoYXQgbWludHMgdXNlci1zY29wZWQgdG9rZW5zIGFnYWluc3RcbiAqICAgICAgYC9zZXJ2aW5nLWVuZHBvaW50c2AgdmlhIHtAbGluayBidWlsZE1vZGVsfS5cbiAqXG4gKiBTdHJpbmcgdmFsdWVzIGFyZSB0cmVhdGVkIGFzIGBtb2RlbElkYCBzdWdhciBhbmQgdGhyZWFkZWQgdGhyb3VnaFxuICogYGJ1aWxkTW9kZWxgJ3Mgb3ZlcnJpZGUgaG9vayBzbyB0aGUgcnVudGltZSBmdXp6eSBtYXRjaGVyIGFuZCB0aGVcbiAqIHBlci1yZXF1ZXN0IGBYLU1hc3RyYS1Nb2RlbGAgb3ZlcnJpZGUgbGF5ZXIgb24gdG9wIG9mIHRoZSBzdGF0aWNcbiAqIGNob2ljZS4gTm9uLXN0cmluZyBgRHluYW1pY0FyZ3VtZW50YHMgYXJlIHBhc3NlZCB0aHJvdWdoIHZlcmJhdGltO1xuICogY2FsbGVycyB0aGF0IG5lZWQgZnVsbCBjb250cm9sIG92ZXIgYHByb3ZpZGVySWRgIC8gYGhlYWRlcnNgIC9cbiAqIGBtb2RlbElkYCBieXBhc3MgdGhlIHJlc29sdmVyIHBpcGVsaW5lIGVudGlyZWx5LlxuICovXG5mdW5jdGlvbiByZXNvbHZlTW9kZWwoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICBvdmVycmlkZTogQW55TWFzdHJhQWdlbnREZWZpbml0aW9uW1wibW9kZWxcIl0sXG4pOiBBZ2VudENvbmZpZ1tcIm1vZGVsXCJdIHtcbiAgY29uc3QgZWZmZWN0aXZlID0gb3ZlcnJpZGUgPz8gY29uZmlnLmRlZmF1bHRNb2RlbDtcbiAgaWYgKGVmZmVjdGl2ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICh7IHJlcXVlc3RDb250ZXh0IH0pID0+IGJ1aWxkTW9kZWwoY29uZmlnLCByZXF1ZXN0Q29udGV4dCk7XG4gIH1cbiAgaWYgKHR5cGVvZiBlZmZlY3RpdmUgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBtb2RlbElkID0gZWZmZWN0aXZlO1xuICAgIHJldHVybiAoeyByZXF1ZXN0Q29udGV4dCB9KSA9PiBidWlsZE1vZGVsKGNvbmZpZywgcmVxdWVzdENvbnRleHQsIHsgbW9kZWxJZCB9KTtcbiAgfVxuICByZXR1cm4gZWZmZWN0aXZlO1xufVxuXG4vKipcbiAqIFJlc29sdmUgb25seSB0aGUgdG9vbHMgZXhwbGljaXRseSBzdXBwbGllZCBieSBvbmUgYWdlbnQgZGVmaW5pdGlvbi5cbiAqIENhbGxiYWNrIGVycm9ycyBwcm9wYWdhdGUgdmVyYmF0aW0gc28gdGhlIG9yaWdpbmFsIHN0YWNrIHN1cnZpdmVzIC0gdGhlXG4gKiBjYWxsZXIgYWxyZWFkeSBrbm93cyB3aGljaCBhZ2VudCB3YXMgcmVnaXN0ZXJpbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVVc2VyVG9vbHMoXG4gIGRlZlRvb2xzOiBBbnlNYXN0cmFBZ2VudERlZmluaXRpb25bXCJ0b29sc1wiXSxcbiAgcGx1Z2luczogTWFzdHJhUGx1Z2lucyxcbik6IFByb21pc2U8TWFzdHJhVG9vbHM+IHtcbiAgaWYgKCFkZWZUb29scykgcmV0dXJuIHt9O1xuICByZXR1cm4gdHlwZW9mIGRlZlRvb2xzID09PSBcImZ1bmN0aW9uXCIgPyBkZWZUb29scyhwbHVnaW5zKSA6IGRlZlRvb2xzO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlQWdlbnRXb3Jrc3BhY2UoXG4gIHdvcmtzcGFjZTogQW55TWFzdHJhQWdlbnREZWZpbml0aW9uW1wid29ya3NwYWNlXCJdLFxuKTogV29ya3NwYWNlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCF3b3Jrc3BhY2UpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB0eXBlb2Ygd29ya3NwYWNlID09PSBcImZ1bmN0aW9uXCIgPyB3b3Jrc3BhY2UoKSA6IHdvcmtzcGFjZTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUge0BsaW5rIE1hc3RyYVBsdWdpbnN9IHJ1bnRpbWUgcHJveHkgaGFuZGVkIHRvXG4gKiBgdG9vbHMocGx1Z2lucylgIGNhbGxiYWNrcy5cbiAqXG4gKiBJbXBsZW1lbnRlZCBhcyBhIGBQcm94eWAgb3ZlciB0aGUgQXBwS2l0IHBsdWdpbiBjb250ZXh0IHNvXG4gKiBgcGx1Z2lucy48bmFtZT5gIHJlc29sdmVzIGF0IGZpcnN0IGFjY2Vzcy4gQW55IHNpYmxpbmcgcGx1Z2luIHRoYXRcbiAqIGltcGxlbWVudHMgQXBwS2l0J3Mgc3RhbmRhcmQgYFRvb2xQcm92aWRlcmAgaW50ZXJmYWNlXG4gKiAoYHRvb2xraXQob3B0cz8pYCArIGBleGVjdXRlQWdlbnRUb29sKG5hbWUsIGFyZ3MsIHNpZ25hbD8sIGNvbnRleHQ/KWApIGlzXG4gKiBhdXRvLWFkYXB0ZWQgaW50byBNYXN0cmEgdG9vbHMuIFVua25vd24gbmFtZXMgcmV0dXJuIGB1bmRlZmluZWRgLFxuICogbWF0Y2hpbmcgQXBwS2l0J3MgYFBsdWdpbnNgIHNlbWFudGljcyBzbyBgcGx1Z2lucy5mb28/LnRvb2xraXQoKWBcbiAqIHJlbWFpbnMgc2FmZSBpbiBlbnZpcm9ubWVudHMgd2hlcmUgYGZvb2AgaXNuJ3QgcmVnaXN0ZXJlZC5cbiAqXG4gKiBgZ2VuaWVgIGlzIHNwZWNpYWwtY2FzZWQgdG8gc3dhcCB0aGUgZ2VuZXJpYyBBcHBLaXQgdG9vbGtpdCAod2hpY2hcbiAqIHJ1bnMgYGV4ZWN1dGVBZ2VudFRvb2xgIGFuZCBvbmx5IGVtaXRzIGEgc2luZ2xlIGZpbmFsIGB0b29sLXJlc3VsdGBcbiAqIGNodW5rIHBlciBjYWxsKSBmb3IgdGhlIHN0cmVhbWluZy1hd2FyZSB0b29scyBidWlsdCBieVxuICoge0BsaW5rIGJ1aWxkR2VuaWVUb29sa2l0UHJvdmlkZXJ9LiBUaGUgc3RyZWFtaW5nIHZhcmlhbnQgZm9yd2FyZHMgZWFjaFxuICogR2VuaWUgd2lyZSBldmVudCAoc3RhdHVzLCBTUUwsIHJvdyBjb3VudHMsIGVycm9ycykgb3V0IHRocm91Z2ggdGhlXG4gKiBNYXN0cmEgYGN0eC53cml0ZXJgLCBzbyB0aGUgVUkgZ2V0cyBgdG9vbC1vdXRwdXRgIGNodW5rcyBpbiByZWFsXG4gKiB0aW1lIGluc3RlYWQgb2Ygc3RhcmluZyBhdCBhIHNwaW5uZXIgZm9yIHRoZSBmdWxsIEdlbmllIHJvdW5kLXRyaXAuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkUGx1Z2luc01hcChcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIGNvbnRleHQ6IFBsdWdpbkNvbnRleHRMaWtlIHwgdW5kZWZpbmVkLFxuKTogTWFzdHJhUGx1Z2lucyB7XG4gIGNvbnN0IGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE1hc3RyYVBsdWdpblRvb2xraXRQcm92aWRlciB8IG51bGw+KCk7XG4gIHJldHVybiBuZXcgUHJveHkoe30gYXMgTWFzdHJhUGx1Z2lucywge1xuICAgIGdldChfdGFyZ2V0LCBwcm9wTmFtZSkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wTmFtZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIGlmIChjYWNoZS5oYXMocHJvcE5hbWUpKSByZXR1cm4gY2FjaGUuZ2V0KHByb3BOYW1lKSA/PyB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBwcm92aWRlciA9IHJlc29sdmVQcm92aWRlcihjb25maWcsIGNvbnRleHQsIHByb3BOYW1lKTtcbiAgICAgIGNhY2hlLnNldChwcm9wTmFtZSwgcHJvdmlkZXIpO1xuICAgICAgcmV0dXJuIHByb3ZpZGVyID8/IHVuZGVmaW5lZDtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBQaWNrIHRoZSByaWdodCB7QGxpbmsgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyfSBmb3IgYSBzaWJsaW5nXG4gKiBwbHVnaW4gbG9va3VwLiBSZXR1cm5zIHRoZSBHZW5pZSBhZ2VudC1iYWNrZWQgYWRhcHRlciB3aGVuXG4gKiB0aGUgY2FsbGVyIGFza3MgZm9yIGBnZW5pZWAgQU5EIGF0IGxlYXN0IG9uZSBzcGFjZSBpcyByZWFjaGFibGVcbiAqIHZpYSB7QGxpbmsgcmVzb2x2ZUdlbmllU3BhY2VzfSAodGhlIGV4cGxpY2l0XG4gKiBgY29uZmlnLmdlbmllU3BhY2VzYCwgdGhlIHJlZ2lzdGVyZWQgQXBwS2l0IGBnZW5pZSgpYCBwbHVnaW4nc1xuICogYHNwYWNlc2AgY29uZmlnLCBvciB0aGUgYERBVEFCUklDS1NfR0VOSUVfU1BBQ0VfSURgIGVudiB2YXIpLlxuICogRmFsbHMgYmFjayB0byB0aGUgZ2VuZXJpYyBBcHBLaXQgYFRvb2xQcm92aWRlcmAgYWRhcHRlciBmb3JcbiAqIGV2ZXJ5IG90aGVyIHBsdWdpbiBuYW1lLiBgY29uZmlnYCBpcyB0aHJlYWRlZCB0aHJvdWdoIHNvIHRoZVxuICogR2VuaWUgYWdlbnQgaW5oZXJpdHMgdGhlIHNhbWUgbW9kZWwgcmVzb2x2ZXIgLyBmYWxsYmFja1xuICogbGFkZGVyIHRoZSBjYWxsaW5nIGFnZW50cyB1c2UuXG4gKlxuICogVGhlIEdlbmllIHRvb2xzIHRhbGsgdG8gR2VuaWUgZGlyZWN0bHkgdGhyb3VnaCBgQGRieC10b29scy9nZW5pZWBcbiAqIChgZ2VuaWVFdmVudENoYXRgKSBhbmQgdGhlIHdvcmtzcGFjZSBgc3RhdGVtZW50RXhlY3V0aW9uLmdldFN0YXRlbWVudGBcbiAqIEFQSTsgQXBwS2l0J3Mgc3RvY2sgYGdlbmllYCBwbHVnaW4gY29udHJpYnV0ZXMgb25seSBpdHMgcmVzb3VyY2VcbiAqIG1hbmlmZXN0IGFuZCBgc3BhY2VzYCBjb25maWcsIHNvIGFuIGBhcHAueWFtbGAgcmVzb3VyY2UgYmluZGluZyBhbmQgYVxuICogYGdlbmllKHsgc3BhY2VzIH0pYCByZWNvcmQgaGF2ZSB0aGUgc2FtZSBtZWFuaW5nIGhlcmUgYXMgdGhleSBkbyB0aGVyZS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVByb3ZpZGVyKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgY29udGV4dDogUGx1Z2luQ29udGV4dExpa2UgfCB1bmRlZmluZWQsXG4gIHByb3BOYW1lOiBzdHJpbmcsXG4pOiBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXIgfCBudWxsIHtcbiAgaWYgKHByb3BOYW1lID09PSBcImdlbmllXCIpIHtcbiAgICBjb25zdCBzcGFjZXMgPSByZXNvbHZlR2VuaWVTcGFjZXMoY29uZmlnLCBjb250ZXh0KTtcbiAgICBpZiAoT2JqZWN0LmtleXMoc3BhY2VzKS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgIHJldHVybiBidWlsZEdlbmllVG9vbGtpdFByb3ZpZGVyKHtcbiAgICAgIHNwYWNlcyxcbiAgICAgIGNvbmZpZyxcbiAgICB9KSBhcyBNYXN0cmFQbHVnaW5Ub29sa2l0UHJvdmlkZXI7XG4gIH1cbiAgY29uc3QgcGx1Z2luID0gY29udGV4dD8uZ2V0UGx1Z2lucygpLmdldChwcm9wTmFtZSk7XG4gIHJldHVybiBhZGFwdFBsdWdpblRvb2xraXQocGx1Z2luLCBwcm9wTmFtZSk7XG59XG5cbnR5cGUgQ29udGV4dHVhbFRvb2xQcm92aWRlciA9IFBhcnRpYWw8UGljazxUb29sUHJvdmlkZXIsIFwiZ2V0QWdlbnRUb29sc1wiPj4gJiB7XG4gIHRvb2xraXQ/OiAoXG4gICAgb3B0cz86IFRvb2xraXRPcHRpb25zLFxuICApID0+XG4gICAgfCBSZXR1cm5UeXBlPFBsdWdpblRvb2xraXRQcm92aWRlcltcInRvb2xraXRcIl0+XG4gICAgfCBQcm9taXNlPFJldHVyblR5cGU8UGx1Z2luVG9vbGtpdFByb3ZpZGVyW1widG9vbGtpdFwiXT4+O1xuICBleGVjdXRlQWdlbnRUb29sPzogKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBhcmdzOiB1bmtub3duLFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICAgIGNvbnRleHQ/OiBBZ2VudFRvb2xFeGVjdXRpb25Db250ZXh0LFxuICApID0+IFByb21pc2U8dW5rbm93bj47XG59O1xuXG4vKipcbiAqIEFkYXB0IGFuIEFwcEtpdCBgVG9vbFByb3ZpZGVyYCBwbHVnaW4gaW5zdGFuY2UgaW50byBhXG4gKiB7QGxpbmsgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyfS4gUmV0dXJucyBgbnVsbGAgZm9yIGFueSBwbHVnaW5cbiAqIHRoYXQgZG9lc24ndCBpbXBsZW1lbnQgYGV4ZWN1dGVBZ2VudFRvb2xgIHBsdXMgZWl0aGVyIEFwcEtpdCdzIG5hdGl2ZVxuICogYHRvb2xraXRgIG9yIGBnZXRBZ2VudFRvb2xzYCBzdXJmYWNlLlxuICovXG5mdW5jdGlvbiBhZGFwdFBsdWdpblRvb2xraXQoXG4gIHBsdWdpbjogdW5rbm93bixcbiAgcGx1Z2luTmFtZTogc3RyaW5nLFxuKTogTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyIHwgbnVsbCB7XG4gIGlmICghcGx1Z2luIHx8IHR5cGVvZiBwbHVnaW4gIT09IFwib2JqZWN0XCIpIHJldHVybiBudWxsO1xuICBjb25zdCBwID0gcGx1Z2luIGFzIENvbnRleHR1YWxUb29sUHJvdmlkZXI7XG4gIGlmIChcbiAgICB0eXBlb2YgcC5leGVjdXRlQWdlbnRUb29sICE9PSBcImZ1bmN0aW9uXCIgfHxcbiAgICAodHlwZW9mIHAudG9vbGtpdCAhPT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBwLmdldEFnZW50VG9vbHMgIT09IFwiZnVuY3Rpb25cIilcbiAgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0b29sa2l0KG9wdHM/OiBUb29sa2l0T3B0aW9ucyk6IE1hc3RyYVRvb2xzIHwgUHJvbWlzZTxNYXN0cmFUb29scz4ge1xuICAgICAgY29uc3QgZW50cmllcyA9XG4gICAgICAgIHR5cGVvZiBwLnRvb2xraXQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgID8gcC50b29sa2l0KG9wdHMpXG4gICAgICAgICAgOiB0b29sa2l0RW50cmllc0Zyb21EZWZpbml0aW9ucyhwbHVnaW5OYW1lLCBwLmdldEFnZW50VG9vbHMhKCksIG9wdHMpO1xuICAgICAgaWYgKGlzUHJvbWlzZUxpa2UoZW50cmllcykpIHtcbiAgICAgICAgcmV0dXJuIGVudHJpZXMudGhlbigocmVzb2x2ZWQpID0+IHRvb2xraXRFbnRyaWVzVG9NYXN0cmFUb29scyhyZXNvbHZlZCwgcCkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRvb2xraXRFbnRyaWVzVG9NYXN0cmFUb29scyhlbnRyaWVzLCBwKTtcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiB0b29sa2l0RW50cmllc0Zyb21EZWZpbml0aW9ucyhcbiAgcGx1Z2luTmFtZTogc3RyaW5nLFxuICBkZWZpbml0aW9uczogQWdlbnRUb29sRGVmaW5pdGlvbltdLFxuICBvcHRpb25zOiBUb29sa2l0T3B0aW9ucyA9IHt9LFxuKTogUmVjb3JkPHN0cmluZywgVG9vbGtpdEVudHJ5PiB7XG4gIHJldHVybiB0b29sa2l0RW50cmllcy5lbnRyaWVzKHBsdWdpbk5hbWUsIGRlZmluaXRpb25zLCBvcHRpb25zKTtcbn1cblxuZnVuY3Rpb24gaXNQcm9taXNlTGlrZTxUPih2YWx1ZTogVCB8IFByb21pc2U8VD4pOiB2YWx1ZSBpcyBQcm9taXNlPFQ+IHtcbiAgcmV0dXJuIHR5cGVvZiAodmFsdWUgYXMgeyB0aGVuPzogdW5rbm93biB9KT8udGhlbiA9PT0gXCJmdW5jdGlvblwiO1xufVxuXG5mdW5jdGlvbiB0b29sa2l0RW50cmllc1RvTWFzdHJhVG9vbHMoXG4gIGVudHJpZXM6IFJlY29yZDxzdHJpbmcsIFRvb2xraXRFbnRyeT4sXG4gIHBsdWdpbjogQ29udGV4dHVhbFRvb2xQcm92aWRlcixcbik6IE1hc3RyYVRvb2xzIHtcbiAgY29uc3QgdG9vbHM6IE1hc3RyYVRvb2xzID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgZW50cnldIG9mIE9iamVjdC5lbnRyaWVzKGVudHJpZXMpKSB7XG4gICAgdG9vbHNba2V5XSA9IHRvb2xraXRFbnRyeVRvTWFzdHJhVG9vbChlbnRyeSwgcGx1Z2luKTtcbiAgfVxuICByZXR1cm4gdG9vbHM7XG59XG5cbi8qKlxuICogV3JhcCBhIHNpbmdsZSB7QGxpbmsgQXBwS2l0VG9vbGtpdEVudHJ5fSBhcyBhIE1hc3RyYSB0b29sIHdob3NlXG4gKiBgZXhlY3V0ZWAgZGlzcGF0Y2hlcyBiYWNrIHRocm91Z2ggYHBsdWdpbi5leGVjdXRlQWdlbnRUb29sKC4uLilgIHNvXG4gKiBBcHBLaXQncyBPQk8gYXV0aCAoYGFzVXNlcmApLCB0ZWxlbWV0cnkgc3BhbnMsIGFuZCB0aGUgTWFzdHJhIG1lbW9yeSByZXNvdXJjZVxuICogaWQgc3RheSBpbnRhY3QuIEpTT04gU2NoZW1hIHBhcmFtZXRlcnMgcGFzcyB0aHJvdWdoIHVuY2hhbmdlZCAtIE1hc3RyYSdzXG4gKiBgUHVibGljU2NoZW1hYCBhY2NlcHRzIGBKU09OU2NoZW1hN2AgZGlyZWN0bHkgdmlhIGBAbWFzdHJhL3NjaGVtYS1jb21wYXRgLlxuICovXG5mdW5jdGlvbiB0b29sa2l0RW50cnlUb01hc3RyYVRvb2woZW50cnk6IFRvb2xraXRFbnRyeSwgcGx1Z2luOiBDb250ZXh0dWFsVG9vbFByb3ZpZGVyKTogVG9vbCB7XG4gIGNvbnN0IGFubm90YXRpb25zID0gZW50cnkuYW5ub3RhdGlvbnMgPz8gZW50cnkuZGVmLmFubm90YXRpb25zO1xuICBjb25zdCBlZmZlY3QgPSBhbm5vdGF0aW9ucz8uZWZmZWN0O1xuICBjb25zdCByZXF1aXJlc0FwcHJvdmFsID0gZWZmZWN0ID09PSBcImRlc3RydWN0aXZlXCIgfHwgYW5ub3RhdGlvbnM/LmRlc3RydWN0aXZlID09PSB0cnVlO1xuICByZXR1cm4gY3JlYXRlVG9vbCh7XG4gICAgaWQ6IGAke2VudHJ5LnBsdWdpbk5hbWV9X18ke2VudHJ5LmxvY2FsTmFtZX1gLFxuICAgIGRlc2NyaXB0aW9uOiBlbnRyeS5kZWYuZGVzY3JpcHRpb24sXG4gICAgLi4uKGVudHJ5LmRlZi5wYXJhbWV0ZXJzID8geyBpbnB1dFNjaGVtYTogZW50cnkuZGVmLnBhcmFtZXRlcnMgYXMgbmV2ZXIgfSA6IHt9KSxcbiAgICAuLi4ocmVxdWlyZXNBcHByb3ZhbCA/IHsgcmVxdWlyZUFwcHJvdmFsOiB0cnVlIH0gOiB7fSksXG4gICAgLi4uKGFubm90YXRpb25zXG4gICAgICA/IHtcbiAgICAgICAgICBtY3A6IHtcbiAgICAgICAgICAgIGFubm90YXRpb25zOiB7XG4gICAgICAgICAgICAgIHJlYWRPbmx5SGludDogZWZmZWN0ID09PSBcInJlYWRcIiB8fCBhbm5vdGF0aW9ucy5yZWFkT25seSA9PT0gdHJ1ZSxcbiAgICAgICAgICAgICAgZGVzdHJ1Y3RpdmVIaW50OiBlZmZlY3QgPT09IFwiZGVzdHJ1Y3RpdmVcIiB8fCBhbm5vdGF0aW9ucy5kZXN0cnVjdGl2ZSA9PT0gdHJ1ZSxcbiAgICAgICAgICAgICAgaWRlbXBvdGVudEhpbnQ6IGFubm90YXRpb25zLmlkZW1wb3RlbnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChpbnB1dDogdW5rbm93biwgY29udGV4dDogdW5rbm93bikgPT4ge1xuICAgICAgY29uc3QgZXhlY3V0aW9uID0gY29udGV4dCBhc1xuICAgICAgICB8IHtcbiAgICAgICAgICAgIGFnZW50PzogeyB0b29sQ2FsbElkPzogc3RyaW5nIH07XG4gICAgICAgICAgICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAgICAgICAgICAgcmVxdWVzdENvbnRleHQ/OiB7IGdldChrZXk6IHN0cmluZyk6IHVua25vd24gfTtcbiAgICAgICAgICAgIHdyaXRlcj86IHtcbiAgICAgICAgICAgICAgY3VzdG9tKHBhcnQ6IHsgdHlwZTogc3RyaW5nOyBkYXRhOiB1bmtub3duOyB0cmFuc2llbnQ/OiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3QgcmVzb3VyY2VJZCA9IGV4ZWN1dGlvbj8ucmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfUkVTT1VSQ0VfSURfS0VZKTtcbiAgICAgIGNvbnN0IG1vZGVsID0gZXhlY3V0aW9uPy5yZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9SRVNPTFZFRF9NT0RFTF9LRVkpO1xuICAgICAgY29uc3Qgb3JpZ2luID0gZXhlY3V0aW9uPy5yZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9PUklHSU5fS0VZKTtcbiAgICAgIGNvbnN0IHRvb2xDYWxsSWQgPSBleGVjdXRpb24/LmFnZW50Py50b29sQ2FsbElkO1xuICAgICAgY29uc3Qgd3JpdGVyID0gZXhlY3V0aW9uPy53cml0ZXI7XG4gICAgICByZXR1cm4gcGx1Z2luLmV4ZWN1dGVBZ2VudFRvb2whKGVudHJ5LmxvY2FsTmFtZSwgaW5wdXQsIGV4ZWN1dGlvbj8uYWJvcnRTaWduYWwsIHtcbiAgICAgICAgLi4uKHR5cGVvZiByZXNvdXJjZUlkID09PSBcInN0cmluZ1wiID8geyByZXNvdXJjZUlkIH0gOiB7fSksXG4gICAgICAgIC4uLih0eXBlb2YgbW9kZWwgPT09IFwic3RyaW5nXCIgPyB7IG1vZGVsIH0gOiB7fSksXG4gICAgICAgIC4uLih0eXBlb2Ygb3JpZ2luID09PSBcInN0cmluZ1wiID8geyBvcmlnaW4gfSA6IHt9KSxcbiAgICAgICAgLi4uKHdyaXRlciAmJiB0b29sQ2FsbElkXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIHdyaXRlUHJvZ3Jlc3M6IGFzeW5jIChldmVudCwgb3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IFRvb2xQcm9ncmVzc0V2ZW50U2NoZW1hLnBhcnNlKGV2ZW50KTtcbiAgICAgICAgICAgICAgICBhd2FpdCB3cml0ZXJcbiAgICAgICAgICAgICAgICAgIC5jdXN0b20oe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBUT09MX1BST0dSRVNTX1BBUlRfVFlQRSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogeyB0b29sQ2FsbElkLCBldmVudDogcGFyc2VkIH0sXG4gICAgICAgICAgICAgICAgICAgIC4uLihvcHRpb25zPy50cmFuc2llbnQgPyB7IHRyYW5zaWVudDogdHJ1ZSB9IDoge30pLFxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG4iXX0=