projen 0.101.2 → 0.101.3

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 (143) hide show
  1. package/.jsii +2 -2
  2. package/lib/ai-instructions.js +2 -2
  3. package/lib/awscdk/auto-discover.js +6 -6
  4. package/lib/awscdk/awscdk-app-java.js +1 -1
  5. package/lib/awscdk/awscdk-app-py.js +1 -1
  6. package/lib/awscdk/awscdk-app-ts.js +1 -1
  7. package/lib/awscdk/awscdk-construct.js +1 -1
  8. package/lib/awscdk/awscdk-deps-java.js +1 -1
  9. package/lib/awscdk/awscdk-deps-js.js +1 -1
  10. package/lib/awscdk/awscdk-deps-py.js +1 -1
  11. package/lib/awscdk/awscdk-deps.js +1 -1
  12. package/lib/awscdk/cdk-config.js +3 -3
  13. package/lib/awscdk/cdk-tasks.js +1 -1
  14. package/lib/awscdk/integration-test.js +1 -1
  15. package/lib/awscdk/lambda-extension.js +1 -1
  16. package/lib/awscdk/lambda-function.js +2 -2
  17. package/lib/build/build-workflow.js +1 -1
  18. package/lib/cdk/auto-discover-base.js +2 -2
  19. package/lib/cdk/construct-lib.js +1 -1
  20. package/lib/cdk/integration-test-base.js +1 -1
  21. package/lib/cdk/jsii-build.js +1 -1
  22. package/lib/cdk/jsii-docgen.js +1 -1
  23. package/lib/cdk/jsii-project.js +1 -1
  24. package/lib/cdk8s/auto-discover.js +2 -2
  25. package/lib/cdk8s/cdk8s-app-py.js +1 -1
  26. package/lib/cdk8s/cdk8s-app-ts.js +1 -1
  27. package/lib/cdk8s/cdk8s-construct.js +1 -1
  28. package/lib/cdk8s/cdk8s-deps-py.js +1 -1
  29. package/lib/cdk8s/cdk8s-deps.js +1 -1
  30. package/lib/cdk8s/integration-test.js +1 -1
  31. package/lib/cdktf/cdktf-construct.js +1 -1
  32. package/lib/circleci/circleci.js +1 -1
  33. package/lib/cli/task-runtime.js +34 -7
  34. package/lib/component.js +1 -1
  35. package/lib/dependencies.js +1 -1
  36. package/lib/dev-env.js +1 -1
  37. package/lib/docker-compose/docker-compose-service.js +1 -1
  38. package/lib/docker-compose/docker-compose.js +1 -1
  39. package/lib/file.js +1 -1
  40. package/lib/gitattributes.js +1 -1
  41. package/lib/github/actions-provider.js +1 -1
  42. package/lib/github/auto-approve.js +1 -1
  43. package/lib/github/auto-merge.js +1 -1
  44. package/lib/github/auto-queue.js +1 -1
  45. package/lib/github/dependabot.js +1 -1
  46. package/lib/github/dependency-review.js +1 -1
  47. package/lib/github/github-credentials.js +1 -1
  48. package/lib/github/github-project.js +1 -1
  49. package/lib/github/github.js +1 -1
  50. package/lib/github/merge-queue.js +1 -1
  51. package/lib/github/mergify.js +1 -1
  52. package/lib/github/pr-template.js +1 -1
  53. package/lib/github/pull-request-backport.js +1 -1
  54. package/lib/github/pull-request-lint.js +1 -1
  55. package/lib/github/stale.js +1 -1
  56. package/lib/github/task-workflow-job.js +1 -1
  57. package/lib/github/task-workflow.js +1 -1
  58. package/lib/github/workflow-actions.js +1 -1
  59. package/lib/github/workflow-jobs.js +1 -1
  60. package/lib/github/workflow-steps.js +1 -1
  61. package/lib/github/workflows.js +1 -1
  62. package/lib/gitlab/configuration.js +1 -1
  63. package/lib/gitlab/gitlab-configuration.js +1 -1
  64. package/lib/gitlab/nested-configuration.js +1 -1
  65. package/lib/gitpod.js +1 -1
  66. package/lib/ignore-file.js +1 -1
  67. package/lib/ini.js +1 -1
  68. package/lib/java/java-project.js +1 -1
  69. package/lib/java/junit.js +1 -1
  70. package/lib/java/maven-compile.js +1 -1
  71. package/lib/java/maven-packaging.js +1 -1
  72. package/lib/java/maven-sample.js +1 -1
  73. package/lib/java/pom.js +2 -2
  74. package/lib/java/projenrc.js +1 -1
  75. package/lib/javascript/biome/biome.js +1 -1
  76. package/lib/javascript/bundler.js +1 -1
  77. package/lib/javascript/eslint.js +1 -1
  78. package/lib/javascript/jest.js +4 -4
  79. package/lib/javascript/license-checker.js +1 -1
  80. package/lib/javascript/node-package.js +1 -1
  81. package/lib/javascript/node-project.js +1 -1
  82. package/lib/javascript/npm-config.js +1 -1
  83. package/lib/javascript/prettier.js +1 -1
  84. package/lib/javascript/projenrc.js +1 -1
  85. package/lib/javascript/typescript-config.js +2 -2
  86. package/lib/javascript/upgrade-dependencies.js +2 -2
  87. package/lib/javascript/yarnrc.js +1 -1
  88. package/lib/json-patch.js +1 -1
  89. package/lib/json.js +1 -1
  90. package/lib/license.js +1 -1
  91. package/lib/logger.js +1 -1
  92. package/lib/makefile.js +1 -1
  93. package/lib/object-file.js +1 -1
  94. package/lib/project-build.js +1 -1
  95. package/lib/project-tree.js +1 -1
  96. package/lib/project.js +1 -1
  97. package/lib/projects.js +1 -1
  98. package/lib/projenrc-json.js +1 -1
  99. package/lib/projenrc.js +1 -1
  100. package/lib/python/pip.js +1 -1
  101. package/lib/python/poetry.js +2 -2
  102. package/lib/python/projenrc.js +1 -1
  103. package/lib/python/pyproject-toml-file.js +1 -1
  104. package/lib/python/pytest-sample.js +1 -1
  105. package/lib/python/pytest.js +1 -1
  106. package/lib/python/python-project.js +1 -1
  107. package/lib/python/python-sample.js +1 -1
  108. package/lib/python/requirements-file.js +1 -1
  109. package/lib/python/setuppy.js +1 -1
  110. package/lib/python/setuptools.js +1 -1
  111. package/lib/python/uv.js +1 -1
  112. package/lib/python/venv.js +1 -1
  113. package/lib/readme.js +1 -1
  114. package/lib/release/publisher.js +1 -1
  115. package/lib/release/release-trigger.js +1 -1
  116. package/lib/release/release.js +1 -1
  117. package/lib/renovatebot.js +1 -1
  118. package/lib/run-task.cjs +19 -2
  119. package/lib/sample-file.js +2 -2
  120. package/lib/source-code.js +1 -1
  121. package/lib/task-shell.js +1 -1
  122. package/lib/task.js +1 -1
  123. package/lib/tasks.js +1 -1
  124. package/lib/testing.js +1 -1
  125. package/lib/textfile.js +1 -1
  126. package/lib/toml.js +1 -1
  127. package/lib/typescript/projenrc-ts.js +1 -1
  128. package/lib/typescript/projenrc.js +1 -1
  129. package/lib/typescript/typescript-typedoc.js +1 -1
  130. package/lib/typescript/typescript.js +5 -5
  131. package/lib/version.js +2 -2
  132. package/lib/vscode/devcontainer.js +1 -1
  133. package/lib/vscode/extensions.js +1 -1
  134. package/lib/vscode/launch-config.js +1 -1
  135. package/lib/vscode/settings.js +1 -1
  136. package/lib/vscode/vscode.js +1 -1
  137. package/lib/web/next.js +3 -3
  138. package/lib/web/postcss.js +1 -1
  139. package/lib/web/react.js +3 -3
  140. package/lib/web/tailwind.js +1 -1
  141. package/lib/xmlfile.js +1 -1
  142. package/lib/yaml.js +1 -1
  143. package/package.json +1 -1
@@ -62,6 +62,23 @@ const QUOTED_ARGS_MARKER = `"${ARGS_MARKER}"`;
62
62
  function quoteArg(arg) {
63
63
  return '"' + arg.replace(/(["$`\\])/g, "\\$1") + '"';
64
64
  }
65
+ /**
66
+ * dax's built-in cross-platform shell only implements a subset of POSIX shell
67
+ * syntax and throws a terse `Not implemented: ...` for the rest. Rewrite those
68
+ * into a short, actionable error that points at the system-shell escape hatch;
69
+ * pass every other error through unchanged.
70
+ */
71
+ function enrichBuiltinShellError(error, command) {
72
+ const message = error instanceof Error ? error.message : String(error);
73
+ if (!/Not implemented:/.test(message)) {
74
+ /* v8 ignore next */
75
+ return error;
76
+ }
77
+ const commandLine = Array.isArray(command) ? command.join(" ") : command;
78
+ return new Error("projen's built-in shell can't run this command:\n" +
79
+ ` ${commandLine}\n` +
80
+ "To use your system's shell instead, set this task to TaskShell.system().");
81
+ }
65
82
  /**
66
83
  * The runtime component of the tasks engine.
67
84
  */
@@ -493,12 +510,22 @@ class RunTask {
493
510
  }
494
511
  // Otherwise run through dax: the "projen" shell or an explicit invocation.
495
512
  const builder = this.buildDaxCommand(command, shell);
496
- const result = await builder
497
- .cwd(cwd)
498
- .env(env)
499
- .stdout(capture ? "piped" : "inherit")
500
- .stderr(capture ? "piped" : "inherit")
501
- .noThrow();
513
+ let result;
514
+ try {
515
+ result = await builder
516
+ .cwd(cwd)
517
+ .env(env)
518
+ .stdout(capture ? "piped" : "inherit")
519
+ .stderr(capture ? "piped" : "inherit")
520
+ .noThrow();
521
+ }
522
+ catch (e) {
523
+ // dax's in-process shell throws a terse `Not implemented: ...` for shell
524
+ // syntax it does not support (e.g. `$(...)` command substitution); turn
525
+ // that into an actionable error that points at the system-shell escape
526
+ // hatch. Other errors pass through unchanged.
527
+ throw enrichBuiltinShellError(e, command);
528
+ }
502
529
  return {
503
530
  status: result.code,
504
531
  stdout: capture ? Buffer.from(result.stdoutBytes) : null,
@@ -548,4 +575,4 @@ class RunTask {
548
575
  return `"${process.execPath}" "${program}"`;
549
576
  }
550
577
  }
551
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1ydW50aW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS90YXNrLXJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkJBQXdEO0FBQ3hELCtCQUE4QztBQUM5QywyQ0FBNkI7QUFDN0IsK0JBQThCO0FBQzlCLGlDQUF3QztBQUN4Qyw2QkFBd0I7QUFDeEIsc0NBQStEO0FBQy9ELG9EQUFzQztBQUV0Qyx1Q0FBaUQ7QUFFakQscUVBQXFFO0FBQ3JFLGdGQUFnRjtBQUNoRixnRkFBZ0Y7QUFDaEYsMkVBQTJFO0FBQzNFLG1FQUFtRTtBQUNuRSxpRUFBaUU7QUFDakUsTUFBTSx1QkFBdUIsR0FBRyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQztBQUMvRCxNQUFNLGlCQUFpQixHQUNyQix1QkFBdUIsRUFBRSxPQUFPLElBQUksdUJBQXVCLENBQUM7QUFFOUQsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBQ3hCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQztBQUN6QixNQUFNLGtCQUFrQixHQUFHLElBQUksV0FBVyxHQUFHLENBQUM7QUFFOUM7Ozs7R0FJRztBQUNILFNBQVMsUUFBUSxDQUFDLEdBQVc7SUFDM0IsT0FBTyxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3ZELENBQUM7QUE4QkQ7O0dBRUc7QUFDSCxNQUFhLFdBQVc7SUFDdEI7O09BRUc7SUFDSSxNQUFNLENBQVUsYUFBYSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNwRCxtQkFBVSxFQUNWLFlBQVksQ0FDYixDQUFDO0lBRUY7Ozs7Ozs7OztPQVNHO0lBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBZSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztR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QUMsSUFBQSxXQUFJLEVBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNyRCxNQUFNLE1BQU0sR0FBRyxJQUFBLGNBQU8sRUFBQyxVQUFVLENBQUMsQ0FBQztZQUNuQyxJQUFJLE1BQU0sS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDO1lBQzlELENBQUM7WUFDRCxVQUFVLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUM3QixJQUFBLFdBQUksRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLEdBQUcsT0FBTyxVQUFVLENBQUMsQ0FDOUMsQ0FBQztRQUNGLE9BQU8sSUFBSSxPQUFPLENBQUMsUUFBUSxNQUFNLE9BQU8sR0FBRyxDQUFDO0lBQzlDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4aXN0c1N5bmMsIHJlYWRGaWxlU3luYywgc3RhdFN5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4sIHJlc29sdmUgfSBmcm9tIFwicGF0aFwiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSBcInV0aWxcIjtcbmltcG9ydCB7IGdyYXksIHVuZGVybGluZSB9IGZyb20gXCJjaGFsa1wiO1xuaW1wb3J0IHsgJCB9IGZyb20gXCJkYXhcIjtcbmltcG9ydCB7IFBST0pFTl9ESVIsIFRBU0tTX01BTklGRVNUX1ZFUlNJT04gfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQgKiBhcyBsb2dnaW5nIGZyb20gXCIuLi9sb2dnaW5nXCI7XG5pbXBvcnQgdHlwZSB7IFRhc2tzTWFuaWZlc3QsIFRhc2tTcGVjLCBUYXNrU3RlcCB9IGZyb20gXCIuLi90YXNrLW1vZGVsXCI7XG5pbXBvcnQgeyBzeXN0ZW1TaGVsbCwgdG9vbCB9IGZyb20gXCIuLi91dGlsL2V4ZWNcIjtcblxuLy8gYXZvaWRzIGEgKGZhbHNlIHBvc2l0aXZlKSBlc2J1aWxkIHdhcm5pbmcgYWJvdXQgaW5jb3JyZWN0IGltcG9ydHMuXG4vLyBgPy5kZWZhdWx0ID8/IG1vZHVsZWAga2VlcHMgdGhpcyB3b3JraW5nIGJvdGggYXMgYSBwbGFpbiBDb21tb25KUyByZXF1aXJlIGFuZFxuLy8gd2hlbiB0aGUgZGVwZW5kZW5jeSBpcyBpbnRlcm9wLXdyYXBwZWQgaW5zaWRlIHRoZSBidW5kbGVkIHJ1bi10YXNrLmNqcyAod2hlcmVcbi8vIGByZXF1aXJlKC4uLilgIG1heSB5aWVsZCBgeyBkZWZhdWx0OiBmbiB9YCBpbnN0ZWFkIG9mIHRoZSBmdW5jdGlvbikuIFNlZVxuLy8gcHJvamVuIzQ0MDcgKFwicGFyc2VDb25mbGljdEpTT04gaXMgbm90IGEgZnVuY3Rpb25cIiBhZnRlciBlamVjdCkuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuY29uc3QgcGFyc2VDb25mbGljdEpTT05Nb2R1bGUgPSByZXF1aXJlKFwicGFyc2UtY29uZmxpY3QtanNvblwiKTtcbmNvbnN0IHBhcnNlQ29uZmxpY3RKU09OID1cbiAgcGFyc2VDb25mbGljdEpTT05Nb2R1bGU/LmRlZmF1bHQgPz8gcGFyc2VDb25mbGljdEpTT05Nb2R1bGU7XG5cbmNvbnN0IEVOVl9UUklNX0xFTiA9IDIwO1xuY29uc3QgQVJHU19NQVJLRVIgPSBcIiRAXCI7XG5jb25zdCBRVU9URURfQVJHU19NQVJLRVIgPSBgXCIke0FSR1NfTUFSS0VSfVwiYDtcblxuLyoqXG4gKiBEb3VibGUtcXVvdGVzIGEgc2luZ2xlIGFyZ3VtZW50IHNvIGl0IGlzIHBhc3NlZCB0aHJvdWdoIHZlcmJhdGltLCBlc2NhcGluZyB0aGVcbiAqIGNoYXJhY3RlcnMgdGhhdCBzdGF5IHNwZWNpYWwgaW5zaWRlIGRvdWJsZSBxdW90ZXMuIChEb3VibGUgcXVvdGVzLCBub3Qgc2luZ2xlOlxuICogZGF4J3Mgc2hlbGwgbGFja3MgdGhlIFBPU0lYIGAnXFwnJ2AgZXNjYXBlLilcbiAqL1xuZnVuY3Rpb24gcXVvdGVBcmcoYXJnOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gJ1wiJyArIGFyZy5yZXBsYWNlKC8oW1wiJGBcXFxcXSkvZywgXCJcXFxcJDFcIikgKyAnXCInO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZWQgcmVzdWx0IG9mIGBzaGVsbCgpYCAoYSBzdWJzZXQgb2Ygbm9kZSdzIGBTcGF3blN5bmNSZXR1cm5zYCkuXG4gKi9cbmludGVyZmFjZSBTaGVsbFJlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgZXhpdCBjb2RlIG9mIHRoZSBjb21tYW5kLCBvciBgbnVsbGAgaWYgdGhlIHByb2Nlc3Mgd2FzIHRlcm1pbmF0ZWQgYnkgYVxuICAgKiBzaWduYWwgb3IgbmV2ZXIgc3Bhd25lZC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ2FwdHVyZWQgc3Rkb3V0LiBPbmx5IHBvcHVsYXRlZCB3aGVuIHN0ZG91dCBpcyBwaXBlZCAoZS5nLiB3aGVuIGV2YWx1YXRpbmdcbiAgICogZW52aXJvbm1lbnQgdmFyaWFibGVzKTsgYG51bGxgL2B1bmRlZmluZWRgIHdoZW4gc3RkaW8gaXMgaW5oZXJpdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3Rkb3V0PzogQnVmZmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ2FwdHVyZWQgc3RkZXJyLiBTZWUgYHN0ZG91dGAuXG4gICAqL1xuICByZWFkb25seSBzdGRlcnI/OiBCdWZmZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBbiBlcnJvciByYWlzZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBzcGF3biB0aGUgY29tbWFuZCAobm90IGEgbm9uLXplcm8gZXhpdFxuICAgKiBjb2RlLCB3aGljaCBpcyByZXBvcnRlZCB2aWEgYHN0YXR1c2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgZXJyb3I/OiBFcnJvcjtcbn1cblxuLyoqXG4gKiBUaGUgcnVudGltZSBjb21wb25lbnQgb2YgdGhlIHRhc2tzIGVuZ2luZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFRhc2tSdW50aW1lIHtcbiAgLyoqXG4gICAqIFRoZSBwcm9qZWN0LXJlbGF0aXZlIHBhdGggb2YgdGhlIHRhc2tzIG1hbmlmZXN0IGZpbGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE1BTklGRVNUX0ZJTEUgPSBwYXRoLnBvc2l4LmpvaW4oXG4gICAgUFJPSkVOX0RJUixcbiAgICBcInRhc2tzLmpzb25cIixcbiAgKTtcblxuICAvKipcbiAgICogT25lLXNob3QgZW50cnlwb2ludCBmb3IgdGhlIHN0YW5kYWxvbmUgdGFzayBydW5uZXIuXG4gICAqXG4gICAqIENyZWF0ZXMgYSBydW50aW1lIHJvb3RlZCBhdCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgcnVucyB0aGUgbmFtZWRcbiAgICogdGFzaywgYW5kIGNvbnZlcnRzIGFueSBmYWlsdXJlIGludG8gYSBub24temVybyBwcm9jZXNzIGV4aXQgY29kZS4gVGhpcyBpc1xuICAgKiB0aGUgc2luZ2xlIGxpbmUgaW52b2tlZCBieSB0aGUgYnVuZGxlZCBgc2NyaXB0cy9ydW4tdGFzay5janNgIHRoYXRcbiAgICogXCJwcm9qZW4gZWplY3RcIiBlbWl0cywgd2hpY2gga2VlcHMgdGhlIGdlbmVyYXRlZCBidW5kbGUgZm9vdGVyIHRyaXZpYWwuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB0YXNrIHRvIHJ1bi4gRGVmYXVsdHMgdG8gYHByb2Nlc3MuYXJndlsyXWAuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIG1haW4obmFtZTogc3RyaW5nID0gcHJvY2Vzcy5hcmd2WzJdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG5ldyBUYXNrUnVudGltZShcIi5cIikucnVuVGFzayhuYW1lKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZT8uc3RhY2sgPz8gU3RyaW5nKGUpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNvbnRlbnRzIG9mIHRhc2tzLmpzb25cbiAgICovXG4gIHByaXZhdGUgX21hbmlmZXN0OiBUYXNrc01hbmlmZXN0ID0geyB0YXNrczoge30gfTtcblxuICAvKipcbiAgICogVGhlIHJhdyBjb250ZW50cyBvZiB0aGUgY3VycmVudGx5IGxvYWRlZCBtYW5pZmVzdCwgdXNlZCB0byBkZXRlY3QgY2hhbmdlc1xuICAgKiBvbiBkaXNrIHNvIHRoZSBydW50aW1lIGNhbiByZWxvYWQgYSByZWdlbmVyYXRlZCBtYW5pZmVzdCBtaWQtcnVuLlxuICAgKi9cbiAgcHJpdmF0ZSBfaWRlbnRpdHk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgcHJvamVjdCBhbmQgdGhlIGN3ZCBmb3IgZXhlY3V0aW5nIHRhc2tzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHdvcmtkaXI6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcih3b3JrZGlyOiBzdHJpbmcpIHtcbiAgICB0aGlzLndvcmtkaXIgPSByZXNvbHZlKHdvcmtkaXIpO1xuICAgIC8vIFBlcmZvcm0gdGhlIGluaXRpYWwgbG9hZC4gVGhpcyBhbHNvIHZlcmlmaWVzIHRoZSBtYW5pZmVzdCdzIHNjaGVtYVxuICAgIC8vIHZlcnNpb24uXG4gICAgdGhpcy5yZWxvYWRNYW5pZmVzdElmQ2hhbmdlZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50cyBvZiB0YXNrcy5qc29uXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1hbmlmZXN0KCk6IFRhc2tzTWFuaWZlc3Qge1xuICAgIHJldHVybiB0aGlzLl9tYW5pZmVzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgdGFza3MgbWFuaWZlc3QgZmlsZS5cbiAgICovXG4gIHByaXZhdGUgZ2V0IG1hbmlmZXN0UGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBqb2luKHRoaXMud29ya2RpciwgVGFza1J1bnRpbWUuTUFOSUZFU1RfRklMRSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRhc2tzIGluIHRoaXMgcHJvamVjdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgdGFza3MoKTogVGFza1NwZWNbXSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5tYW5pZmVzdC50YXNrcyA/PyB7fSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhIHRhc2sgYnkgbmFtZSwgb3IgYHVuZGVmaW5lZGAgaWYgbm90IGZvdW5kLlxuICAgKi9cbiAgcHVibGljIHRyeUZpbmRUYXNrKG5hbWU6IHN0cmluZyk6IFRhc2tTcGVjIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMubWFuaWZlc3QudGFza3MpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1hbmlmZXN0LnRhc2tzW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGhlIHRhc2suXG4gICAqIEBwYXJhbSBuYW1lIFRoZSB0YXNrIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcnVuVGFzayhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyZW50czogc3RyaW5nW10gPSBbXSxcbiAgICBhcmdzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0gW10sXG4gICAgZW52OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBBIHByZXZpb3VzbHkgZXhlY3V0ZWQgdGFzayAobW9zdCBpbXBvcnRhbnRseSB0aGUgXCJkZWZhdWx0XCIvc3ludGggdGFzayxcbiAgICAvLyB3aGljaCBgYnVpbGRgIHNwYXducyBmaXJzdCkgbWF5IGhhdmUgcmVnZW5lcmF0ZWQgYC5wcm9qZW4vdGFza3MuanNvbmAuXG4gICAgLy8gUGljayB1cCBhbnkgc3VjaCBjaGFuZ2VzIGJlZm9yZSByZXNvbHZpbmcgYW5kIHJ1bm5pbmcgdGhpcyB0YXNrIHNvIHdlXG4gICAgLy8gbmV2ZXIgZXhlY3V0ZSBhIHN0YWxlLCBpbi1tZW1vcnkgZGVmaW5pdGlvbi5cbiAgICB0aGlzLnJlbG9hZE1hbmlmZXN0SWZDaGFuZ2VkKCk7XG5cbiAgICBjb25zdCB0YXNrID0gdGhpcy50cnlGaW5kVGFzayhuYW1lKTtcbiAgICBpZiAoIXRhc2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgY2Fubm90IGZpbmQgY29tbWFuZCAke25hbWV9YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgbmV3IFJ1blRhc2sodGhpcywgdGFzaywgcGFyZW50cywgYXJncywgZW52KS5ydW4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1yZWFkcyB0aGUgdGFza3MgbWFuaWZlc3QgZnJvbSBkaXNrIGlmIGl0cyBjb250ZW50cyBjaGFuZ2VkIHNpbmNlIGl0IHdhc1xuICAgKiBsYXN0IGxvYWRlZCwgdmVyaWZ5aW5nIGl0cyBzY2hlbWEgdmVyc2lvbiBhbG9uZyB0aGUgd2F5LlxuICAgKlxuICAgKiBDaGFuZ2UgZGV0ZWN0aW9uIGNvbXBhcmVzIHRoZSByYXcgZmlsZSBjb250ZW50cywgc28gYW4gdW5jaGFuZ2VkIG1hbmlmZXN0XG4gICAqIGlzIG5vdCByZS12ZXJpZmllZCBvciByZS1hZG9wdGVkLlxuICAgKi9cbiAgcHJpdmF0ZSByZWxvYWRNYW5pZmVzdElmQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICBpZiAoIWV4aXN0c1N5bmModGhpcy5tYW5pZmVzdFBhdGgpKSB7XG4gICAgICAvLyBObyBtYW5pZmVzdCBvbiBkaXNrOiB0cmVhdCBhcyBhbiBlbXB0eSBwcm9qZWN0IChsZWdhY3kgYmVoYXZpb3IpLlxuICAgICAgdGhpcy5fbWFuaWZlc3QgPSB7IHRhc2tzOiB7fSB9O1xuICAgICAgdGhpcy5faWRlbnRpdHkgPSB1bmRlZmluZWQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmF3ID0gcmVhZEZpbGVTeW5jKHRoaXMubWFuaWZlc3RQYXRoLCBcInV0Zi04XCIpO1xuICAgIGlmIChyYXcgPT09IHRoaXMuX2lkZW50aXR5KSB7XG4gICAgICByZXR1cm47IC8vIHVuY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCBsb2FkXG4gICAgfVxuXG4gICAgY29uc3QgbWFuaWZlc3Q6IFRhc2tzTWFuaWZlc3QgPSBwYXJzZUNvbmZsaWN0SlNPTihyYXcsIHVuZGVmaW5lZCwgXCJ0aGVpcnNcIik7XG5cbiAgICAvLyBBIHByZXZpb3VzbHkgbG9hZGVkIG1hbmlmZXN0IG1lYW5zIHRoaXMgaXMgYSAqcmVsb2FkKiAoZS5nLiB0aGVcbiAgICAvLyBcImRlZmF1bHRcIi9zeW50aCB0YXNrIHJlZ2VuZXJhdGVkIHRoZSBmaWxlIG1pZC1ydW4pLCBhcyBvcHBvc2VkIHRvIHRoZVxuICAgIC8vIGluaXRpYWwgbG9hZCBwZXJmb3JtZWQgYnkgdGhlIGNvbnN0cnVjdG9yLlxuICAgIGNvbnN0IGlzUmVsb2FkID0gdGhpcy5faWRlbnRpdHkgIT09IHVuZGVmaW5lZDtcblxuICAgIHRoaXMudmVyaWZ5TWFuaWZlc3QobWFuaWZlc3QpO1xuICAgIHRoaXMuX21hbmlmZXN0ID0gbWFuaWZlc3Q7XG4gICAgdGhpcy5faWRlbnRpdHkgPSByYXc7XG5cbiAgICBpZiAoaXNSZWxvYWQpIHtcbiAgICAgIGxvZ2dpbmcuZGVidWcoXG4gICAgICAgIGAke1Rhc2tSdW50aW1lLk1BTklGRVNUX0ZJTEV9IGNoYW5nZWQgb24gZGlzazsgc3VjY2Vzc2Z1bGx5IGxvYWRlZCB0aGUgbmV3IHRhc2tzIG1hbmlmZXN0LmAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYSBmcmVzaGx5IHJlYWQgbWFuaWZlc3Q6XG4gICAqXG4gICAqIC0gTGVnYWN5IG1hbmlmZXN0cyAobm8gYG1hbmlmZXN0VmVyc2lvbmApIGFyZSBhY2NlcHRlZCBhcy1pcyBmb3IgYmFja3dhcmRzXG4gICAqICAgY29tcGF0aWJpbGl0eS5cbiAgICogLSBNYW5pZmVzdHMgZnJvbSBhIG5ld2VyIHByb2plbiAoYSBoaWdoZXIgYG1hbmlmZXN0VmVyc2lvbmApIGFyZSBhY2NlcHRlZFxuICAgKiAgIHdpdGggYSB3YXJuaW5nLCBzaW5jZSB0aGlzIHJ1bnRpbWUgbWF5IG5vdCB1bmRlcnN0YW5kIHRoZSBzY2hlbWEuXG4gICAqL1xuICBwcml2YXRlIHZlcmlmeU1hbmlmZXN0KG1hbmlmZXN0OiBUYXNrc01hbmlmZXN0KTogdm9pZCB7XG4gICAgLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHk6IG1hbmlmZXN0cyBnZW5lcmF0ZWQgYmVmb3JlIHZlcnNpb25pbmcgY2Fycnkgbm9cbiAgICAvLyB2ZXJzaW9uLlxuICAgIGlmIChtYW5pZmVzdC5tYW5pZmVzdFZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChtYW5pZmVzdC5tYW5pZmVzdFZlcnNpb24gPiBUQVNLU19NQU5JRkVTVF9WRVJTSU9OKSB7XG4gICAgICBsb2dnaW5nLndhcm4oXG4gICAgICAgIGAke1Rhc2tSdW50aW1lLk1BTklGRVNUX0ZJTEV9IHdhcyBnZW5lcmF0ZWQgYnkgYSBuZXdlciB2ZXJzaW9uIG9mIHByb2plbiBgICtcbiAgICAgICAgICBgKG1hbmlmZXN0IHZlcnNpb24gJHttYW5pZmVzdC5tYW5pZmVzdFZlcnNpb259LCB0aGlzIHByb2plbiBzdXBwb3J0cyB1cCB0byAke1RBU0tTX01BTklGRVNUX1ZFUlNJT059KS4gYCArXG4gICAgICAgICAgYFNvbWUgdGFza3MgbWF5IG5vdCBiZWhhdmUgYXMgZXhwZWN0ZWQ7IGNvbnNpZGVyIHVwZ3JhZGluZyBwcm9qZW4uYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIFJ1blRhc2sge1xuICBwcml2YXRlIGVudjogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkIH0gPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRzOiBzdHJpbmdbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHdvcmtkaXI6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJ1bnRpbWU6IFRhc2tSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFzazogVGFza1NwZWMsXG4gICAgcGFyZW50czogc3RyaW5nW10gPSBbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFyZ3M6IEFycmF5PHN0cmluZyB8IG51bWJlcj4gPSBbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVudlBhcmFtOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9LFxuICApIHtcbiAgICB0aGlzLndvcmtkaXIgPSB0YXNrLmN3ZCA/PyB0aGlzLnJ1bnRpbWUud29ya2RpcjtcbiAgICB0aGlzLnBhcmVudHMgPSBwYXJlbnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIHRoZSB0YXNrLiBUaGlzIHdhcyBwcmV2aW91c2x5IGRvbmUgaW4gdGhlIGNvbnN0cnVjdG9yLCBidXQgaXMgbm93XG4gICAqIGFuIGFzeW5jIG1ldGhvZCBzaW5jZSBzaGVsbCBleGVjdXRpb24gaXMgYXN5bmNocm9ub3VzIChlLmcuIGRheCBvblxuICAgKiBXaW5kb3dzKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyB0YXNrLCBhcmdzLCBwYXJlbnRzIH0gPSB0aGlzO1xuXG4gICAgaWYgKCF0YXNrLnN0ZXBzIHx8IHRhc2suc3RlcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmxvZ0RlYnVnKGdyYXkoXCJObyBhY3Rpb25zIGhhdmUgYmVlbiBzcGVjaWZpZWQgZm9yIHRoaXMgdGFzay5cIikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZW52ID0gYXdhaXQgdGhpcy5yZXNvbHZlRW52aXJvbm1lbnQoXG4gICAgICB0aGlzLmVudlBhcmFtLFxuICAgICAgcGFyZW50cyxcbiAgICAgIHRoaXMucmVzb2x2ZVNoZWxsKCksXG4gICAgKTtcblxuICAgIGNvbnN0IGVudmxvZ3MgPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmVudikpIHtcbiAgICAgIGNvbnN0IHZ2ID0gdiA/PyBcIlwiO1xuICAgICAgY29uc3QgdHJpbW1lZCA9XG4gICAgICAgIHZ2Lmxlbmd0aCA+IEVOVl9UUklNX0xFTiA/IHZ2LnN1YnN0cmluZygwLCBFTlZfVFJJTV9MRU4pICsgXCIuLi5cIiA6IHZ2O1xuICAgICAgZW52bG9ncy5wdXNoKGAke2t9PSR7dHJpbW1lZH1gKTtcbiAgICB9XG5cbiAgICBpZiAoZW52bG9ncy5sZW5ndGgpIHtcbiAgICAgIHRoaXMubG9nRGVidWcoZ3JheShgJHt1bmRlcmxpbmUoXCJlbnZcIil9OiAke2VudmxvZ3Muam9pbihcIiBcIil9YCkpO1xuICAgIH1cblxuICAgIC8vIGV2YWx1YXRlIGNvbmRpdGlvblxuICAgIGlmICghKGF3YWl0IHRoaXMuZXZhbENvbmRpdGlvbih0YXNrLCB0aGlzLnJlc29sdmVTaGVsbCgpKSkpIHtcbiAgICAgIHRoaXMubG9nKFwiY29uZGl0aW9uIGV4aXRlZCB3aXRoIG5vbi16ZXJvIC0gc2tpcHBpbmdcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gdmVyaWZ5IHdlIHJlcXVpcmVkIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgZGVmaW5lZFxuICAgIGNvbnN0IG1lcmdlZCA9IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRoaXMuZW52IH07XG4gICAgY29uc3QgbWlzc2luZyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHRhc2sucmVxdWlyZWRFbnYgPz8gW10pIHtcbiAgICAgIGlmICghKG5hbWUgaW4gbWVyZ2VkKSkge1xuICAgICAgICBtaXNzaW5nLnB1c2gobmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgbWlzc2luZyByZXF1aXJlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6ICR7bWlzc2luZy5qb2luKFwiLFwiKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHN0ZXAgb2YgdGFzay5zdGVwcykge1xuICAgICAgY29uc3Qgc3RlcFNoZWxsID0gdGhpcy5yZXNvbHZlU2hlbGwoc3RlcCk7XG5cbiAgICAgIC8vIGV2YWx1YXRlIHN0ZXAgY29uZGl0aW9uXG4gICAgICBpZiAoIShhd2FpdCB0aGlzLmV2YWxDb25kaXRpb24oc3RlcCwgc3RlcFNoZWxsKSkpIHtcbiAgICAgICAgdGhpcy5sb2coXCJjb25kaXRpb24gZXhpdGVkIHdpdGggbm9uLXplcm8gLSBza2lwcGluZ1wiKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFyZ3NMaXN0OiBzdHJpbmdbXSA9IFtcbiAgICAgICAgLi4uKHN0ZXAuYXJncyB8fCBbXSksXG4gICAgICAgIC4uLihzdGVwLnJlY2VpdmVBcmdzID8gYXJncyA6IFtdKSxcbiAgICAgIF0ubWFwKChhKSA9PiBhLnRvU3RyaW5nKCkpO1xuXG4gICAgICBpZiAoc3RlcC5zYXkpIHtcbiAgICAgICAgbG9nZ2luZy5pbmZvKHRoaXMuZm10TG9nKHN0ZXAuc2F5KSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGVwLnNwYXduKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucnVudGltZS5ydW5UYXNrKFxuICAgICAgICAgIHN0ZXAuc3Bhd24sXG4gICAgICAgICAgWy4uLnRoaXMucGFyZW50cywgdGhpcy50YXNrLm5hbWVdLFxuICAgICAgICAgIGFyZ3NMaXN0LFxuICAgICAgICAgIHN0ZXAuZW52LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleGVjczogQXJyYXk8c3RyaW5nIHwgc3RyaW5nW10+ID0gc3RlcC5leGVjID8gW3N0ZXAuZXhlY10gOiBbXTtcblxuICAgICAgLy8gUGFyc2Ugc3RlcC1zcGVjaWZpYyBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZXZhbEVudmlyb25tZW50KHN0ZXAuZW52ID8/IHt9LCBzdGVwU2hlbGwpO1xuXG4gICAgICBpZiAoc3RlcC5idWlsdGluKSB7XG4gICAgICAgIGV4ZWNzLnB1c2godGhpcy5yZW5kZXJCdWlsdGluKHN0ZXAuYnVpbHRpbikpO1xuICAgICAgfVxuXG4gICAgICAvLyBgZXhlY0FyZ3NgIGlzIGFuIGV4cGxpY2l0IGFyZ3YgKHRoZSBwcm9ncmFtIGZvbGxvd2VkIGJ5IGl0cyBhcmd1bWVudHMpLlxuICAgICAgLy8gSXQgaXMgaGFuZGVkIHRvIGBzaGVsbCgpYCBhcyBhbiBhcnJheSByYXRoZXIgdGhhbiBhIHJlbmRlcmVkIHN0cmluZywgc29cbiAgICAgIC8vIGl0IHJ1bnMgd2l0aG91dCBhIHNoZWxsIGFuZCBldmVyeSBlbGVtZW50IGlzIHBhc3NlZCB0aHJvdWdoIHZlcmJhdGltIC1cbiAgICAgIC8vIHdoaWNoIGlzIHdoYXQgbGV0cyBjYWxsZXJzIGF2b2lkIHRoaW5raW5nIGFib3V0IHF1b3RpbmcuIEZpeGVkL3JlY2VpdmVkXG4gICAgICAvLyBhcmdzIGFyZSBzcGxpY2VkIGluIHdoZXJldmVyIGEgYCRAYCBtYXJrZXIgZWxlbWVudCBhcHBlYXJzIChtaXJyb3JpbmdcbiAgICAgIC8vIHRoZSBzdHJpbmcgYGV4ZWNgIGJlaGF2aW9yKSwgb3IgYXBwZW5kZWQgYXQgdGhlIGVuZCBpZiB0aGVyZSBpcyBub25lLlxuICAgICAgaWYgKHN0ZXAuZXhlY0FyZ3MpIHtcbiAgICAgICAgY29uc3QgYXJndjogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgbGV0IHBsYWNlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2Ygc3RlcC5leGVjQXJncykge1xuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBBUkdTX01BUktFUikge1xuICAgICAgICAgICAgYXJndi5wdXNoKC4uLmFyZ3NMaXN0KTtcbiAgICAgICAgICAgIHBsYWNlZCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFyZ3YucHVzaChlbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwbGFjZWQpIHtcbiAgICAgICAgICBhcmd2LnB1c2goLi4uYXJnc0xpc3QpO1xuICAgICAgICB9XG4gICAgICAgIGV4ZWNzLnB1c2goYXJndik7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZXhlYyBvZiBleGVjcykge1xuICAgICAgICBsZXQgY29tbWFuZCA9IGV4ZWM7XG5cbiAgICAgICAgLy8gQSBzdHJpbmcgY29tbWFuZCBpcyBhIHNoZWxsIGxpbmU6IHNwbGljZSB0YXNrIGFyZ3MgaW4gcGVyIHRoZSBgJEBgXG4gICAgICAgIC8vIG1hcmtlciBydWxlcy4gQW4gYGV4ZWNBcmdzYCBhcmd2IGFscmVhZHkgY2FycmllcyBpdHMgYXJncywgdW50b3VjaGVkLlxuICAgICAgICBpZiAodHlwZW9mIGNvbW1hbmQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBpZiAoY29tbWFuZC5pbmNsdWRlcyhRVU9URURfQVJHU19NQVJLRVIpKSB7XG4gICAgICAgICAgICAvLyBgXCIkQFwiYDogc3BsaWNlIGVhY2ggYXJnIGluIGFzIGEgc2VwYXJhdGUgdmVyYmF0aW0gd29yZCAobGlrZVxuICAgICAgICAgICAgLy8gYmFzaCdzIHF1b3RlZCBgXCIkQFwiYCksIHNvIHdoaXRlc3BhY2UgYW5kIG1ldGFjaGFyYWN0ZXJzIHN1cnZpdmUuXG4gICAgICAgICAgICBjb21tYW5kID0gY29tbWFuZC5yZXBsYWNlKFxuICAgICAgICAgICAgICBRVU9URURfQVJHU19NQVJLRVIsXG4gICAgICAgICAgICAgIGFyZ3NMaXN0Lm1hcChxdW90ZUFyZykuam9pbihcIiBcIiksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC5pbmNsdWRlcyhBUkdTX01BUktFUikpIHtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBjb21tYW5kLnJlcGxhY2UoQVJHU19NQVJLRVIsIGFyZ3NMaXN0LmpvaW4oXCIgXCIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tbWFuZCA9IFtjb21tYW5kLCAuLi5hcmdzTGlzdF0uam9pbihcIiBcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3dkID0gc3RlcC5jd2Q7XG4gICAgICAgIC8vIEEgdGhyb3duIGVycm9yIChlLmcuIHNwYXduIGZhaWx1cmUpIHByb3BhZ2F0ZXM7IGEgbm9uLXplcm8gZXhpdCBpc1xuICAgICAgICAvLyByZXBvcnRlZCB2aWEgYHJlc3VsdC5zdGF0dXNgLlxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNoZWxsKHtcbiAgICAgICAgICBjb21tYW5kLFxuICAgICAgICAgIGN3ZCxcbiAgICAgICAgICBleHRyYUVudjogZW52LFxuICAgICAgICAgIHNoZWxsOiBzdGVwU2hlbGwsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUYXNrIFwiJHt0aGlzLmZ1bGxuYW1lfVwiIGZhaWxlZCB3aGVuIGV4ZWN1dGluZyBcIiR7XG4gICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoY29tbWFuZCkgPyBjb21tYW5kLmpvaW4oXCIgXCIpIDogY29tbWFuZFxuICAgICAgICAgICAgfVwiIChjd2Q6ICR7cmVzb2x2ZShjd2QgPz8gdGhpcy53b3JrZGlyKX0pYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgYSB0YXNrIHNob3VsZCBiZSBleGVjdXRlZCBiYXNlZCBvbiBcImNvbmRpdGlvblwiLlxuICAgKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB0YXNrIHNob3VsZCBiZSBleGVjdXRlZCBvciBmYWxzZSBpZiB0aGUgY29uZGl0aW9uXG4gICAqIGV2YWx1YXRlcyB0byBmYWxzZSAoZXhpdHMgd2l0aCBub24temVybyksIGluZGljYXRpbmcgdGhhdCB0aGUgdGFzayBzaG91bGRcbiAgICogYmUgc2tpcHBlZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXZhbENvbmRpdGlvbihcbiAgICB0YXNrT3JTdGVwOiBUYXNrU3BlYyB8IFRhc2tTdGVwLFxuICAgIHNoZWxsOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgKSB7XG4gICAgLy8gbm8gY29uZGl0aW9uLCBjYXJyeSBvblxuICAgIGlmICghdGFza09yU3RlcC5jb25kaXRpb24pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMubG9nKGdyYXkoYCR7dW5kZXJsaW5lKFwiY29uZGl0aW9uXCIpfTogJHt0YXNrT3JTdGVwLmNvbmRpdGlvbn1gKSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaGVsbCh7XG4gICAgICBjb21tYW5kOiB0YXNrT3JTdGVwLmNvbmRpdGlvbixcbiAgICAgIHF1aWV0OiB0cnVlLFxuICAgICAgc2hlbGwsXG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBzaGVsbCBjb21tYW5kcyAoZS5nLiBgJCh4eClgKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBldmFsRW52aXJvbm1lbnQoXG4gICAgZW52OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSxcbiAgICBzaGVsbDogc3RyaW5nIHwgc3RyaW5nW10sXG4gICkge1xuICAgIGNvbnN0IG91dHB1dDogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkIH0gPSB7fTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudiA/PyB7fSkpIHtcbiAgICAgIGlmIChTdHJpbmcodmFsdWUpLnN0YXJ0c1dpdGgoXCIkKFwiKSAmJiBTdHJpbmcodmFsdWUpLmVuZHNXaXRoKFwiKVwiKSkge1xuICAgICAgICBjb25zdCBxdWVyeSA9IHZhbHVlLnN1YnN0cmluZygyLCB2YWx1ZS5sZW5ndGggLSAxKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaGVsbCh7XG4gICAgICAgICAgY29tbWFuZDogcXVlcnksXG4gICAgICAgICAgcXVpZXQ6IHRydWUsXG4gICAgICAgICAgY2FwdHVyZU91dHB1dDogdHJ1ZSxcbiAgICAgICAgICBzaGVsbCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSByZXN1bHQuZXJyb3JcbiAgICAgICAgICAgID8gcmVzdWx0LmVycm9yLnN0YWNrXG4gICAgICAgICAgICA6IHJlc3VsdC5zdGRlcnI/LnRvU3RyaW5nKCkudHJpbSgpIHx8XG4gICAgICAgICAgICAgIHJlc3VsdC5zdGRvdXQ/LnRvU3RyaW5nKCkudHJpbSgpIHx8XG4gICAgICAgICAgICAgIGBjb21tYW5kIGV4aXRlZCB3aXRoIGNvZGUgJHtyZXN1bHQuc3RhdHVzfWA7XG5cbiAgICAgICAgICBsb2dnaW5nLndhcm4oXG4gICAgICAgICAgICB0aGlzLmZtdExvZyhcbiAgICAgICAgICAgICAgYCR7dW5kZXJsaW5lKGtleSl9OiB1bmFibGUgdG8gZXZhbHVhdGUgXCIke3F1ZXJ5fVwiLiBFbnZpcm9ubWVudCB2YXJpYWJsZSB3aWxsIGJlIHNraXBwZWQuIENoZWNrIHRoYXQgdGhlIGNvbW1hbmQgZXhpc3RzIGFuZCBydW5zIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGxvZ2dpbmcud2Fybih0aGlzLmZtdExvZyhgJHt1bmRlcmxpbmUoa2V5KX06ICR7ZXJyb3J9YCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dHB1dFtrZXldID0gcmVzdWx0LnN0ZG91dD8udG9TdHJpbmcoXCJ1dGYtOFwiKS50cmltKCkgPz8gXCJcIjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0cHV0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBydW50aW1lIGVudmlyb25tZW50IGZvciBhIHRhc2suIE5hbWVseSwgaXQgc3VwcG9ydHMgdGhpcyBzeW50YXhcbiAgICogYCQoeHgpYCBmb3IgYWxsb3dpbmcgZW52aXJvbm1lbnQgdG8gYmUgZXZhbHVhdGVkIGJ5IGV4ZWN1dGluZyBhIHNoZWxsXG4gICAqIGNvbW1hbmQgYW5kIG9idGFpbmluZyBpdHMgcmVzdWx0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXNvbHZlRW52aXJvbm1lbnQoXG4gICAgZW52UGFyYW06IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9LFxuICAgIHBhcmVudHM6IHN0cmluZ1tdLFxuICAgIHNoZWxsOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgKSB7XG4gICAgbGV0IGVudiA9IHRoaXMucnVudGltZS5tYW5pZmVzdC5lbnYgPz8ge307XG5cbiAgICAvLyBhZGQgZW52IGZyb20gYWxsIHBhcmVudCB0YXNrcyBvbmUgYnkgb25lXG4gICAgZm9yIChjb25zdCBwYXJlbnQgb2YgcGFyZW50cykge1xuICAgICAgZW52ID0ge1xuICAgICAgICAuLi5lbnYsXG4gICAgICAgIC4uLih0aGlzLnJ1bnRpbWUudHJ5RmluZFRhc2socGFyZW50KT8uZW52ID8/IHt9KSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gYXBwbHkgdGFzayBlbnZpcm9ubWVudCwgdGhlbiB0aGUgc3BlY2lmaWMgZW52IGxhc3RcbiAgICBlbnYgPSB7XG4gICAgICAuLi5lbnYsXG4gICAgICAuLi4odGhpcy50YXNrLmVudiA/PyB7fSksXG4gICAgICAuLi5lbnZQYXJhbSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXZhbEVudmlyb25tZW50KGVudiwgc2hlbGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBzaGVsbCBmb3IgYSBzdGVwJ3MgY29tbWFuZCAob3IgdGhlIHRhc2sncywgd2hlbiBubyBzdGVwIGlzXG4gICAqIGdpdmVuKTogc3RlcCwgdGhlbiB0YXNrLCB0aGVuIHByb2plY3QgZGVmYXVsdCwgdGhlbiBcInByb2plblwiLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlU2hlbGwoc3RlcD86IFRhc2tTdGVwKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiAoXG4gICAgICBzdGVwPy5zaGVsbCA/PyB0aGlzLnRhc2suc2hlbGwgPz8gdGhpcy5ydW50aW1lLm1hbmlmZXN0LnNoZWxsID8/IFwicHJvamVuXCJcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIFwiZnVsbCBuYW1lXCIgb2YgdGhlIHRhc2sgd2hpY2ggaW5jbHVkZXMgYWxsIGl0J3MgcGFyZW50IHRhc2sgbmFtZXMgY29uY2F0ZW5hdGVkIGJ5IGNoZXZyb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgZnVsbG5hbWUoKSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnBhcmVudHMsIHRoaXMudGFzay5uYW1lXS5qb2luKFwiIMK7IFwiKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgbG9nZ2luZy52ZXJib3NlKHRoaXMuZm10TG9nKC4uLmFyZ3MpKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nRGVidWcoLi4uYXJnczogYW55W10pIHtcbiAgICBsb2dnaW5nLmRlYnVnKHRoaXMuZm10TG9nKC4uLmFyZ3MpKTtcbiAgfVxuXG4gIHByaXZhdGUgZm10TG9nKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgcmV0dXJuIGZvcm1hdChgJHt1bmRlcmxpbmUodGhpcy5mdWxsbmFtZSl9IHxgLCAuLi5hcmdzKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2hlbGwob3B0aW9uczogU2hlbGxPcHRpb25zKTogUHJvbWlzZTxTaGVsbFJlc3VsdD4ge1xuICAgIGNvbnN0IHF1aWV0ID0gb3B0aW9ucy5xdWlldCA/PyBmYWxzZTtcbiAgICBpZiAoIXF1aWV0KSB7XG4gICAgICBjb25zdCBsb2cgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gICAgICBsb2cucHVzaChcbiAgICAgICAgQXJyYXkuaXNBcnJheShvcHRpb25zLmNvbW1hbmQpXG4gICAgICAgICAgPyBvcHRpb25zLmNvbW1hbmQuam9pbihcIiBcIilcbiAgICAgICAgICA6IG9wdGlvbnMuY29tbWFuZCxcbiAgICAgICk7XG5cbiAgICAgIGlmIChvcHRpb25zLmN3ZCkge1xuICAgICAgICBsb2cucHVzaChgKGN3ZDogJHtvcHRpb25zLmN3ZH0pYCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nKGxvZy5qb2luKFwiIFwiKSk7XG4gICAgfVxuXG4gICAgY29uc3QgY3dkID0gb3B0aW9ucy5jd2QgPz8gdGhpcy53b3JrZGlyO1xuICAgIGlmICghZXhpc3RzU3luYyhjd2QpIHx8ICFzdGF0U3luYyhjd2QpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGludmFsaWQgd29ya2RpciAoY3dkKTogJHtjd2R9IG11c3QgYmUgYW4gZXhpc3RpbmcgZGlyZWN0b3J5YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHJlc29sdmVkIHNoZWxsIGlzIG9uZSBvZjpcbiAgICAvLyAtIFwicHJvamVuXCIgKGRlZmF1bHQpOiBkYXgncyBpbi1wcm9jZXNzIGNyb3NzLXBsYXRmb3JtIHNoZWxsLCBzbyBQT1NJWC1zdHlsZVxuICAgIC8vICAgdGFzayBzeW50YXggKGBta2RpciAtcGAsIGAmJmAsIGAkVkFSYCwgLi4uKSB3b3JrcyB0aGUgc2FtZSBldmVyeXdoZXJlLlxuICAgIC8vIC0gXCJzeXN0ZW1cIjogdGhlIGhvc3QncyBuYXRpdmUgc2hlbGwgKGAvYmluL3NoYCwgb3IgYGNtZC5leGVgIG9uIFdpbmRvd3MpLlxuICAgIC8vIC0gYW4gYXJndiwgZS5nLiBbXCJiYXNoXCIsXCItY1wiXTogYSBzaGVsbCBpbnZvY2F0aW9uIHdpdGggdGhlIGNvbW1hbmQgYXBwZW5kZWRcbiAgICAvLyAgIGFzIGl0cyBmaW5hbCBhcmd1bWVudC5cbiAgICBjb25zdCBzaGVsbCA9IG9wdGlvbnMuc2hlbGwgPz8gXCJwcm9qZW5cIjtcbiAgICBpZiAodHlwZW9mIHNoZWxsID09PSBcInN0cmluZ1wiICYmIHNoZWxsICE9PSBcInByb2plblwiICYmIHNoZWxsICE9PSBcInN5c3RlbVwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGB1bmtub3duIGJ1aWx0LWluIHNoZWxsICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgc2hlbGwsXG4gICAgICAgICl9OyB1c2UgdGhlIGJ1aWx0LWluIFwicHJvamVuXCIgb3IgXCJzeXN0ZW1cIiBzaGVsbHMsIG9yIGEgVGFza1NoZWxsLmNvbW1hbmQoWy4uLl0pIGludm9jYXRpb25gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBzdGRvdXQvc3RkZXJyIGFyZSBjYXB0dXJlZCBvbmx5IHdoZW4gYXNrZWQgKGUuZy4gYCQoLi4uKWAgZW52IGV2YWwpO1xuICAgIC8vIG90aGVyd2lzZSB0aGV5IGFyZSBpbmhlcml0ZWQgc28gb3V0cHV0IHN0cmVhbXMgdGhyb3VnaC5cbiAgICBjb25zdCBjYXB0dXJlID0gb3B0aW9ucy5jYXB0dXJlT3V0cHV0ID8/IGZhbHNlO1xuXG4gICAgY29uc3QgY29tbWFuZCA9IG9wdGlvbnMuY29tbWFuZDtcbiAgICBjb25zdCBlbnYgPSB7XG4gICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgIC4uLnRoaXMuZW52LFxuICAgICAgLi4ub3B0aW9ucy5leHRyYUVudixcbiAgICB9O1xuXG4gICAgLy8gXCJzeXN0ZW1cIjogdGhlIGhvc3QtbmF0aXZlIGVuZ2luZS4gQSBzdHJpbmcgY29tbWFuZCBydW5zIHRocm91Z2ggdGhlIE9TXG4gICAgLy8gc2hlbGw7IGFuIGBleGVjQXJnc2AgYXJndiBpcyBzcGF3bmVkIGRpcmVjdGx5IChzaGVsbC1mcmVlKSwgc28gdGhlIHJlYWxcbiAgICAvLyBiaW5hcnkgcnVucyB3aXRoIG5vIGRheCBidWlsdC1pbnMuIChPbmx5IGAkKC4uLilgL2NvbmRpdGlvbiBldmFsIGNhcHR1cmVzLFxuICAgIC8vIGFuZCB0aG9zZSBhbHdheXMgcGFzcyBhIHN0cmluZywgc28gYW4gYXJyYXkgY29tbWFuZCBuZXZlciBuZWVkcyBjYXB0dXJlLilcbiAgICBpZiAoc2hlbGwgPT09IFwic3lzdGVtXCIpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbW1hbmQpKSB7XG4gICAgICAgIGNvbnN0IFtwcm9ncmFtLCAuLi5hcmdzXSA9IGNvbW1hbmQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdG9vbChwcm9ncmFtKS5ydW4oYXJncywgeyBjd2QsIGVudiwgaW5oZXJpdFN0ZGlvOiB0cnVlIH0pO1xuICAgICAgICAgIHJldHVybiB7IHN0YXR1czogMCB9O1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGU/LnN0YXR1cyA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBlLnN0YXR1cyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3lzdGVtU2hlbGwoY29tbWFuZCwgeyBjd2QsIGVudiwgY2FwdHVyZSB9KTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UgcnVuIHRocm91Z2ggZGF4OiB0aGUgXCJwcm9qZW5cIiBzaGVsbCBvciBhbiBleHBsaWNpdCBpbnZvY2F0aW9uLlxuICAgIGNvbnN0IGJ1aWxkZXIgPSB0aGlzLmJ1aWxkRGF4Q29tbWFuZChjb21tYW5kLCBzaGVsbCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBidWlsZGVyXG4gICAgICAuY3dkKGN3ZClcbiAgICAgIC5lbnYoZW52KVxuICAgICAgLnN0ZG91dChjYXB0dXJlID8gXCJwaXBlZFwiIDogXCJpbmhlcml0XCIpXG4gICAgICAuc3RkZXJyKGNhcHR1cmUgPyBcInBpcGVkXCIgOiBcImluaGVyaXRcIilcbiAgICAgIC5ub1Rocm93KCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiByZXN1bHQuY29kZSxcbiAgICAgIHN0ZG91dDogY2FwdHVyZSA/IEJ1ZmZlci5mcm9tKHJlc3VsdC5zdGRvdXRCeXRlcykgOiBudWxsLFxuICAgICAgc3RkZXJyOiBjYXB0dXJlID8gQnVmZmVyLmZyb20ocmVzdWx0LnN0ZGVyckJ5dGVzKSA6IG51bGwsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGRheCBjb21tYW5kIGZvciB0aGUgXCJwcm9qZW5cIiBzaGVsbCBvciBhbiBleHBsaWNpdCBpbnZvY2F0aW9uLlxuICAgKiAoVGhlIFwic3lzdGVtXCIgc2hlbGwgaXMgaGFuZGxlZCBob3N0LXNpZGUsIG5vdCBoZXJlLikgYGNvbW1hbmRgIGlzIGEgc2hlbGxcbiAgICogbGluZSAoc3RyaW5nKSBvciBhbiBgZXhlY0FyZ3NgIGFyZ3YgKHN0cmluZ1tdKTsgYHNoZWxsYCBpcyBgXCJwcm9qZW5cImAgb3IgYW5cbiAgICogaW52b2NhdGlvbiBhcmd2IHN1Y2ggYXMgYFtcImJhc2hcIiwgXCItY1wiXWAuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkRGF4Q29tbWFuZChcbiAgICBjb21tYW5kOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgICBzaGVsbDogc3RyaW5nIHwgc3RyaW5nW10sXG4gICkge1xuICAgIC8vIEFuIGludm9jYXRpb24gKGUuZy4gW1wiYmFzaFwiLFwiLWNcIl0sIFtcIm5weFwiLFwiLS1ub1wiLFwiLWNcIl0pOiBhcHBlbmQgdGhlXG4gICAgLy8gY29tbWFuZCBhcyBpdHMgZmluYWwgYXJndW1lbnQuIEEgc3RyaW5nIGlzIGFwcGVuZGVkIGFzLWlzOyBhbiBgZXhlY0FyZ3NgXG4gICAgLy8gYXJndiBpcyByZW5kZXJlZCB0byBhIHF1b3RlZCBjb21tYW5kIGxpbmUgc28gdGhlIHNoZWxsIHJlLXBhcnNlcyB0aGUgc2FtZVxuICAgIC8vIGFyZ3YuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc2hlbGwpKSB7XG4gICAgICBjb25zdCBbcHJvZ3JhbSwgLi4uZmxhZ3NdID0gc2hlbGw7XG4gICAgICBjb25zdCBjb21tYW5kTGluZSA9IEFycmF5LmlzQXJyYXkoY29tbWFuZClcbiAgICAgICAgPyBjb21tYW5kLm1hcChxdW90ZUFyZykuam9pbihcIiBcIilcbiAgICAgICAgOiBjb21tYW5kO1xuICAgICAgcmV0dXJuICRgJHtwcm9ncmFtfSAke1suLi5mbGFncywgY29tbWFuZExpbmVdfWA7XG4gICAgfVxuXG4gICAgLy8gVGhlIGJ1aWx0LWluIFwicHJvamVuXCIgc2hlbGwgKGRheCkuXG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoY29tbWFuZClcbiAgICAgID8gLy8gZXhlY0FyZ3M6IHNoZWxsLWZyZWUgYXJndiAoZWFjaCBlbGVtZW50IGVzY2FwZWQ7IGAuY21kYCBzaGltcyByZXNvbHZlZCkuXG4gICAgICAgICRgJHtjb21tYW5kWzBdfSAke2NvbW1hbmQuc2xpY2UoMSl9YFxuICAgICAgOiAvLyBzdHJpbmcgY29tbWFuZCwgcGFyc2VkIGluLXByb2Nlc3MgYnkgZGF4J3MgY3Jvc3MtcGxhdGZvcm0gc2hlbGwuXG4gICAgICAgICQucmF3YCR7Y29tbWFuZH1gO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJCdWlsdGluKGJ1aWx0aW46IHN0cmluZykge1xuICAgIC8vIExvY2F0ZSBwcm9qZW4ncyBwYWNrYWdlIHJvb3QgYnkgd2Fsa2luZyB1cCBmcm9tIHRoaXMgbW9kdWxlJ3MgZGlyZWN0b3J5XG4gICAgLy8gdW50aWwgd2UgZmluZCBhIHBhY2thZ2UuanNvbi4gVGhpcyB3b3JrcyB3aGV0aGVyIHRoZSBjb2RlIHJ1bnMgZnJvbSB0aGVcbiAgICAvLyBjb21waWxlZCBmaWxlIChsaWIvY2xpL3Rhc2stcnVudGltZS5qcykgb3IgZnJvbSB0aGUgYnVuZGxlZCBydW4tdGFzay5janNcbiAgICAvLyAobGliL3J1bi10YXNrLmNqcyksIHdoaWNoIGxpdmUgYXQgZGlmZmVyZW50IGRlcHRocyAtIHNvIGEgaGFyZC1jb2RlZFxuICAgIC8vIHJlbGF0aXZlIHBhdGggdG8gcGFja2FnZS5qc29uIHdvdWxkIGJlIHdyb25nIGluIG9uZSBvZiB0aGUgdHdvIGNhc2VzLlxuICAgIGxldCBtb2R1bGVSb290ID0gX19kaXJuYW1lO1xuICAgIHdoaWxlICghZXhpc3RzU3luYyhqb2luKG1vZHVsZVJvb3QsIFwicGFja2FnZS5qc29uXCIpKSkge1xuICAgICAgY29uc3QgcGFyZW50ID0gZGlybmFtZShtb2R1bGVSb290KTtcbiAgICAgIGlmIChwYXJlbnQgPT09IG1vZHVsZVJvb3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidW5hYmxlIHRvIGxvY2F0ZSB0aGUgcHJvamVuIHBhY2thZ2Ugcm9vdFwiKTtcbiAgICAgIH1cbiAgICAgIG1vZHVsZVJvb3QgPSBwYXJlbnQ7XG4gICAgfVxuICAgIGNvbnN0IHByb2dyYW0gPSByZXF1aXJlLnJlc29sdmUoXG4gICAgICBqb2luKG1vZHVsZVJvb3QsIFwibGliXCIsIGAke2J1aWx0aW59LnRhc2suanNgKSxcbiAgICApO1xuICAgIHJldHVybiBgXCIke3Byb2Nlc3MuZXhlY1BhdGh9XCIgXCIke3Byb2dyYW19XCJgO1xuICB9XG59XG5cbmludGVyZmFjZSBTaGVsbE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGNvbW1hbmQgdG8gcnVuLiBBIHN0cmluZyBpcyBleGVjdXRlZCBhcyBhIHNoZWxsIGNvbW1hbmQgbGluZTsgYVxuICAgKiBzdHJpbmcgYXJyYXkgaXMgYW4gZXhwbGljaXQgYXJndiAocHJvZ3JhbSArIGFyZ3VtZW50cykgZXhlY3V0ZWQgd2l0aG91dCBhXG4gICAqIHNoZWxsLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nIHwgc3RyaW5nW107XG4gIC8qKlxuICAgKiBAZGVmYXVsdCAtIHByb2plY3QgZGlyXG4gICAqL1xuICByZWFkb25seSBjd2Q/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDYXB0dXJlIHN0ZG91dC9zdGRlcnIgKHNvIHRoZSBjYWxsZXIgY2FuIHJlYWQgdGhlbSBmcm9tIHRoZSByZXN1bHQpXG4gICAqIGluc3RlYWQgb2YgaW5oZXJpdGluZyB0aGUgcGFyZW50J3Mgc3RyZWFtcy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGNhcHR1cmVPdXRwdXQ/OiBib29sZWFuO1xuICAvKiogQGRlZmF1bHQgZmFsc2UgKi9cbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xuICByZWFkb25seSBleHRyYUVudj86IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB8IHVuZGVmaW5lZCB9O1xuICAvKipcbiAgICogVGhlIHJlc29sdmVkIHNoZWxsIHRvIGludGVycHJldCB0aGUgY29tbWFuZCAoZS5nLiBcInByb2plblwiLCBcImJhc2ggLWNcIikuXG4gICAqIEBkZWZhdWx0IFwicHJvamVuXCJcbiAgICovXG4gIHJlYWRvbmx5IHNoZWxsPzogc3RyaW5nIHwgc3RyaW5nW107XG59XG4iXX0=
578
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1ydW50aW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS90YXNrLXJ1bnRpbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkJBQXdEO0FBQ3hELCtCQUE4QztBQUM5QywyQ0FBNkI7QUFDN0IsK0JBQThCO0FBQzlCLGlDQUF3QztBQUN4Qyw2QkFBd0I7QUFDeEIsc0NBQStEO0FBQy9ELG9EQUFzQztBQUV0Qyx1Q0FBaUQ7QUFFakQscUVBQXFFO0FBQ3JFLGdGQUFnRjtBQUNoRixnRkFBZ0Y7QUFDaEYsMkVBQTJFO0FBQzNFLG1FQUFtRTtBQUNuRSxpRUFBaUU7QUFDakUsTUFBTSx1QkFBdUIsR0FBRyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQztBQUMvRCxNQUFNLGlCQUFpQixHQUNyQix1QkFBdUIsRUFBRSxPQUFPLElBQUksdUJBQXVCLENBQUM7QUFFOUQsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBQ3hCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQztBQUN6QixNQUFNLGtCQUFrQixHQUFHLElBQUksV0FBVyxHQUFHLENBQUM7QUFFOUM7Ozs7R0FJRztBQUNILFNBQVMsUUFBUSxDQUFDLEdBQVc7SUFDM0IsT0FBTyxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3ZELENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsdUJBQXVCLENBQzlCLEtBQWMsRUFDZCxPQUEwQjtJQUUxQixNQUFNLE9BQU8sR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFB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T0FBTyxDQUFDLE9BQU8sQ0FDN0IsSUFBQSxXQUFJLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBRSxHQUFHLE9BQU8sVUFBVSxDQUFDLENBQzlDLENBQUM7UUFDRixPQUFPLElBQUksT0FBTyxDQUFDLFFBQVEsTUFBTSxPQUFPLEdBQUcsQ0FBQztJQUM5QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGlzdHNTeW5jLCByZWFkRmlsZVN5bmMsIHN0YXRTeW5jIH0gZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luLCByZXNvbHZlIH0gZnJvbSBcInBhdGhcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gXCJ1dGlsXCI7XG5pbXBvcnQgeyBncmF5LCB1bmRlcmxpbmUgfSBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7ICQgfSBmcm9tIFwiZGF4XCI7XG5pbXBvcnQgeyBQUk9KRU5fRElSLCBUQVNLU19NQU5JRkVTVF9WRVJTSU9OIH0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0ICogYXMgbG9nZ2luZyBmcm9tIFwiLi4vbG9nZ2luZ1wiO1xuaW1wb3J0IHR5cGUgeyBUYXNrc01hbmlmZXN0LCBUYXNrU3BlYywgVGFza1N0ZXAgfSBmcm9tIFwiLi4vdGFzay1tb2RlbFwiO1xuaW1wb3J0IHsgc3lzdGVtU2hlbGwsIHRvb2wgfSBmcm9tIFwiLi4vdXRpbC9leGVjXCI7XG5cbi8vIGF2b2lkcyBhIChmYWxzZSBwb3NpdGl2ZSkgZXNidWlsZCB3YXJuaW5nIGFib3V0IGluY29ycmVjdCBpbXBvcnRzLlxuLy8gYD8uZGVmYXVsdCA/PyBtb2R1bGVgIGtlZXBzIHRoaXMgd29ya2luZyBib3RoIGFzIGEgcGxhaW4gQ29tbW9uSlMgcmVxdWlyZSBhbmRcbi8vIHdoZW4gdGhlIGRlcGVuZGVuY3kgaXMgaW50ZXJvcC13cmFwcGVkIGluc2lkZSB0aGUgYnVuZGxlZCBydW4tdGFzay5janMgKHdoZXJlXG4vLyBgcmVxdWlyZSguLi4pYCBtYXkgeWllbGQgYHsgZGVmYXVsdDogZm4gfWAgaW5zdGVhZCBvZiB0aGUgZnVuY3Rpb24pLiBTZWVcbi8vIHByb2plbiM0NDA3IChcInBhcnNlQ29uZmxpY3RKU09OIGlzIG5vdCBhIGZ1bmN0aW9uXCIgYWZ0ZXIgZWplY3QpLlxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmNvbnN0IHBhcnNlQ29uZmxpY3RKU09OTW9kdWxlID0gcmVxdWlyZShcInBhcnNlLWNvbmZsaWN0LWpzb25cIik7XG5jb25zdCBwYXJzZUNvbmZsaWN0SlNPTiA9XG4gIHBhcnNlQ29uZmxpY3RKU09OTW9kdWxlPy5kZWZhdWx0ID8/IHBhcnNlQ29uZmxpY3RKU09OTW9kdWxlO1xuXG5jb25zdCBFTlZfVFJJTV9MRU4gPSAyMDtcbmNvbnN0IEFSR1NfTUFSS0VSID0gXCIkQFwiO1xuY29uc3QgUVVPVEVEX0FSR1NfTUFSS0VSID0gYFwiJHtBUkdTX01BUktFUn1cImA7XG5cbi8qKlxuICogRG91YmxlLXF1b3RlcyBhIHNpbmdsZSBhcmd1bWVudCBzbyBpdCBpcyBwYXNzZWQgdGhyb3VnaCB2ZXJiYXRpbSwgZXNjYXBpbmcgdGhlXG4gKiBjaGFyYWN0ZXJzIHRoYXQgc3RheSBzcGVjaWFsIGluc2lkZSBkb3VibGUgcXVvdGVzLiAoRG91YmxlIHF1b3Rlcywgbm90IHNpbmdsZTpcbiAqIGRheCdzIHNoZWxsIGxhY2tzIHRoZSBQT1NJWCBgJ1xcJydgIGVzY2FwZS4pXG4gKi9cbmZ1bmN0aW9uIHF1b3RlQXJnKGFyZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuICdcIicgKyBhcmcucmVwbGFjZSgvKFtcIiRgXFxcXF0pL2csIFwiXFxcXCQxXCIpICsgJ1wiJztcbn1cblxuLyoqXG4gKiBkYXgncyBidWlsdC1pbiBjcm9zcy1wbGF0Zm9ybSBzaGVsbCBvbmx5IGltcGxlbWVudHMgYSBzdWJzZXQgb2YgUE9TSVggc2hlbGxcbiAqIHN5bnRheCBhbmQgdGhyb3dzIGEgdGVyc2UgYE5vdCBpbXBsZW1lbnRlZDogLi4uYCBmb3IgdGhlIHJlc3QuIFJld3JpdGUgdGhvc2VcbiAqIGludG8gYSBzaG9ydCwgYWN0aW9uYWJsZSBlcnJvciB0aGF0IHBvaW50cyBhdCB0aGUgc3lzdGVtLXNoZWxsIGVzY2FwZSBoYXRjaDtcbiAqIHBhc3MgZXZlcnkgb3RoZXIgZXJyb3IgdGhyb3VnaCB1bmNoYW5nZWQuXG4gKi9cbmZ1bmN0aW9uIGVucmljaEJ1aWx0aW5TaGVsbEVycm9yKFxuICBlcnJvcjogdW5rbm93bixcbiAgY29tbWFuZDogc3RyaW5nIHwgc3RyaW5nW10sXG4pOiB1bmtub3duIHtcbiAgY29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgaWYgKCEvTm90IGltcGxlbWVudGVkOi8udGVzdChtZXNzYWdlKSkge1xuICAgIC8qIHY4IGlnbm9yZSBuZXh0ICovXG4gICAgcmV0dXJuIGVycm9yO1xuICB9XG5cbiAgY29uc3QgY29tbWFuZExpbmUgPSBBcnJheS5pc0FycmF5KGNvbW1hbmQpID8gY29tbWFuZC5qb2luKFwiIFwiKSA6IGNvbW1hbmQ7XG4gIHJldHVybiBuZXcgRXJyb3IoXG4gICAgXCJwcm9qZW4ncyBidWlsdC1pbiBzaGVsbCBjYW4ndCBydW4gdGhpcyBjb21tYW5kOlxcblwiICtcbiAgICAgIGAgICR7Y29tbWFuZExpbmV9XFxuYCArXG4gICAgICBcIlRvIHVzZSB5b3VyIHN5c3RlbSdzIHNoZWxsIGluc3RlYWQsIHNldCB0aGlzIHRhc2sgdG8gVGFza1NoZWxsLnN5c3RlbSgpLlwiLFxuICApO1xufVxuXG4vKipcbiAqIE5vcm1hbGl6ZWQgcmVzdWx0IG9mIGBzaGVsbCgpYCAoYSBzdWJzZXQgb2Ygbm9kZSdzIGBTcGF3blN5bmNSZXR1cm5zYCkuXG4gKi9cbmludGVyZmFjZSBTaGVsbFJlc3VsdCB7XG4gIC8qKlxuICAgKiBUaGUgZXhpdCBjb2RlIG9mIHRoZSBjb21tYW5kLCBvciBgbnVsbGAgaWYgdGhlIHByb2Nlc3Mgd2FzIHRlcm1pbmF0ZWQgYnkgYVxuICAgKiBzaWduYWwgb3IgbmV2ZXIgc3Bhd25lZC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ2FwdHVyZWQgc3Rkb3V0LiBPbmx5IHBvcHVsYXRlZCB3aGVuIHN0ZG91dCBpcyBwaXBlZCAoZS5nLiB3aGVuIGV2YWx1YXRpbmdcbiAgICogZW52aXJvbm1lbnQgdmFyaWFibGVzKTsgYG51bGxgL2B1bmRlZmluZWRgIHdoZW4gc3RkaW8gaXMgaW5oZXJpdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3Rkb3V0PzogQnVmZmVyIHwgbnVsbDtcblxuICAvKipcbiAgICogQ2FwdHVyZWQgc3RkZXJyLiBTZWUgYHN0ZG91dGAuXG4gICAqL1xuICByZWFkb25seSBzdGRlcnI/OiBCdWZmZXIgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBBbiBlcnJvciByYWlzZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBzcGF3biB0aGUgY29tbWFuZCAobm90IGEgbm9uLXplcm8gZXhpdFxuICAgKiBjb2RlLCB3aGljaCBpcyByZXBvcnRlZCB2aWEgYHN0YXR1c2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgZXJyb3I/OiBFcnJvcjtcbn1cblxuLyoqXG4gKiBUaGUgcnVudGltZSBjb21wb25lbnQgb2YgdGhlIHRhc2tzIGVuZ2luZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFRhc2tSdW50aW1lIHtcbiAgLyoqXG4gICAqIFRoZSBwcm9qZWN0LXJlbGF0aXZlIHBhdGggb2YgdGhlIHRhc2tzIG1hbmlmZXN0IGZpbGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE1BTklGRVNUX0ZJTEUgPSBwYXRoLnBvc2l4LmpvaW4oXG4gICAgUFJPSkVOX0RJUixcbiAgICBcInRhc2tzLmpzb25cIixcbiAgKTtcblxuICAvKipcbiAgICogT25lLXNob3QgZW50cnlwb2ludCBmb3IgdGhlIHN0YW5kYWxvbmUgdGFzayBydW5uZXIuXG4gICAqXG4gICAqIENyZWF0ZXMgYSBydW50aW1lIHJvb3RlZCBhdCB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgcnVucyB0aGUgbmFtZWRcbiAgICogdGFzaywgYW5kIGNvbnZlcnRzIGFueSBmYWlsdXJlIGludG8gYSBub24temVybyBwcm9jZXNzIGV4aXQgY29kZS4gVGhpcyBpc1xuICAgKiB0aGUgc2luZ2xlIGxpbmUgaW52b2tlZCBieSB0aGUgYnVuZGxlZCBgc2NyaXB0cy9ydW4tdGFzay5janNgIHRoYXRcbiAgICogXCJwcm9qZW4gZWplY3RcIiBlbWl0cywgd2hpY2gga2VlcHMgdGhlIGdlbmVyYXRlZCBidW5kbGUgZm9vdGVyIHRyaXZpYWwuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB0YXNrIHRvIHJ1bi4gRGVmYXVsdHMgdG8gYHByb2Nlc3MuYXJndlsyXWAuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIG1haW4obmFtZTogc3RyaW5nID0gcHJvY2Vzcy5hcmd2WzJdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IG5ldyBUYXNrUnVudGltZShcIi5cIikucnVuVGFzayhuYW1lKTtcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZT8uc3RhY2sgPz8gU3RyaW5nKGUpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGNvbnRlbnRzIG9mIHRhc2tzLmpzb25cbiAgICovXG4gIHByaXZhdGUgX21hbmlmZXN0OiBUYXNrc01hbmlmZXN0ID0geyB0YXNrczoge30gfTtcblxuICAvKipcbiAgICogVGhlIHJhdyBjb250ZW50cyBvZiB0aGUgY3VycmVudGx5IGxvYWRlZCBtYW5pZmVzdCwgdXNlZCB0byBkZXRlY3QgY2hhbmdlc1xuICAgKiBvbiBkaXNrIHNvIHRoZSBydW50aW1lIGNhbiByZWxvYWQgYSByZWdlbmVyYXRlZCBtYW5pZmVzdCBtaWQtcnVuLlxuICAgKi9cbiAgcHJpdmF0ZSBfaWRlbnRpdHk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgcHJvamVjdCBhbmQgdGhlIGN3ZCBmb3IgZXhlY3V0aW5nIHRhc2tzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHdvcmtkaXI6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcih3b3JrZGlyOiBzdHJpbmcpIHtcbiAgICB0aGlzLndvcmtkaXIgPSByZXNvbHZlKHdvcmtkaXIpO1xuICAgIC8vIFBlcmZvcm0gdGhlIGluaXRpYWwgbG9hZC4gVGhpcyBhbHNvIHZlcmlmaWVzIHRoZSBtYW5pZmVzdCdzIHNjaGVtYVxuICAgIC8vIHZlcnNpb24uXG4gICAgdGhpcy5yZWxvYWRNYW5pZmVzdElmQ2hhbmdlZCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjb250ZW50cyBvZiB0YXNrcy5qc29uXG4gICAqL1xuICBwdWJsaWMgZ2V0IG1hbmlmZXN0KCk6IFRhc2tzTWFuaWZlc3Qge1xuICAgIHJldHVybiB0aGlzLl9tYW5pZmVzdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgdGFza3MgbWFuaWZlc3QgZmlsZS5cbiAgICovXG4gIHByaXZhdGUgZ2V0IG1hbmlmZXN0UGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBqb2luKHRoaXMud29ya2RpciwgVGFza1J1bnRpbWUuTUFOSUZFU1RfRklMRSk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRhc2tzIGluIHRoaXMgcHJvamVjdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgdGFza3MoKTogVGFza1NwZWNbXSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5tYW5pZmVzdC50YXNrcyA/PyB7fSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhIHRhc2sgYnkgbmFtZSwgb3IgYHVuZGVmaW5lZGAgaWYgbm90IGZvdW5kLlxuICAgKi9cbiAgcHVibGljIHRyeUZpbmRUYXNrKG5hbWU6IHN0cmluZyk6IFRhc2tTcGVjIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMubWFuaWZlc3QudGFza3MpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1hbmlmZXN0LnRhc2tzW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGhlIHRhc2suXG4gICAqIEBwYXJhbSBuYW1lIFRoZSB0YXNrIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcnVuVGFzayhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyZW50czogc3RyaW5nW10gPSBbXSxcbiAgICBhcmdzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0gW10sXG4gICAgZW52OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBBIHByZXZpb3VzbHkgZXhlY3V0ZWQgdGFzayAobW9zdCBpbXBvcnRhbnRseSB0aGUgXCJkZWZhdWx0XCIvc3ludGggdGFzayxcbiAgICAvLyB3aGljaCBgYnVpbGRgIHNwYXducyBmaXJzdCkgbWF5IGhhdmUgcmVnZW5lcmF0ZWQgYC5wcm9qZW4vdGFza3MuanNvbmAuXG4gICAgLy8gUGljayB1cCBhbnkgc3VjaCBjaGFuZ2VzIGJlZm9yZSByZXNvbHZpbmcgYW5kIHJ1bm5pbmcgdGhpcyB0YXNrIHNvIHdlXG4gICAgLy8gbmV2ZXIgZXhlY3V0ZSBhIHN0YWxlLCBpbi1tZW1vcnkgZGVmaW5pdGlvbi5cbiAgICB0aGlzLnJlbG9hZE1hbmlmZXN0SWZDaGFuZ2VkKCk7XG5cbiAgICBjb25zdCB0YXNrID0gdGhpcy50cnlGaW5kVGFzayhuYW1lKTtcbiAgICBpZiAoIXRhc2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgY2Fubm90IGZpbmQgY29tbWFuZCAke25hbWV9YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgbmV3IFJ1blRhc2sodGhpcywgdGFzaywgcGFyZW50cywgYXJncywgZW52KS5ydW4oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZS1yZWFkcyB0aGUgdGFza3MgbWFuaWZlc3QgZnJvbSBkaXNrIGlmIGl0cyBjb250ZW50cyBjaGFuZ2VkIHNpbmNlIGl0IHdhc1xuICAgKiBsYXN0IGxvYWRlZCwgdmVyaWZ5aW5nIGl0cyBzY2hlbWEgdmVyc2lvbiBhbG9uZyB0aGUgd2F5LlxuICAgKlxuICAgKiBDaGFuZ2UgZGV0ZWN0aW9uIGNvbXBhcmVzIHRoZSByYXcgZmlsZSBjb250ZW50cywgc28gYW4gdW5jaGFuZ2VkIG1hbmlmZXN0XG4gICAqIGlzIG5vdCByZS12ZXJpZmllZCBvciByZS1hZG9wdGVkLlxuICAgKi9cbiAgcHJpdmF0ZSByZWxvYWRNYW5pZmVzdElmQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICBpZiAoIWV4aXN0c1N5bmModGhpcy5tYW5pZmVzdFBhdGgpKSB7XG4gICAgICAvLyBObyBtYW5pZmVzdCBvbiBkaXNrOiB0cmVhdCBhcyBhbiBlbXB0eSBwcm9qZWN0IChsZWdhY3kgYmVoYXZpb3IpLlxuICAgICAgdGhpcy5fbWFuaWZlc3QgPSB7IHRhc2tzOiB7fSB9O1xuICAgICAgdGhpcy5faWRlbnRpdHkgPSB1bmRlZmluZWQ7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcmF3ID0gcmVhZEZpbGVTeW5jKHRoaXMubWFuaWZlc3RQYXRoLCBcInV0Zi04XCIpO1xuICAgIGlmIChyYXcgPT09IHRoaXMuX2lkZW50aXR5KSB7XG4gICAgICByZXR1cm47IC8vIHVuY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCBsb2FkXG4gICAgfVxuXG4gICAgY29uc3QgbWFuaWZlc3Q6IFRhc2tzTWFuaWZlc3QgPSBwYXJzZUNvbmZsaWN0SlNPTihyYXcsIHVuZGVmaW5lZCwgXCJ0aGVpcnNcIik7XG5cbiAgICAvLyBBIHByZXZpb3VzbHkgbG9hZGVkIG1hbmlmZXN0IG1lYW5zIHRoaXMgaXMgYSAqcmVsb2FkKiAoZS5nLiB0aGVcbiAgICAvLyBcImRlZmF1bHRcIi9zeW50aCB0YXNrIHJlZ2VuZXJhdGVkIHRoZSBmaWxlIG1pZC1ydW4pLCBhcyBvcHBvc2VkIHRvIHRoZVxuICAgIC8vIGluaXRpYWwgbG9hZCBwZXJmb3JtZWQgYnkgdGhlIGNvbnN0cnVjdG9yLlxuICAgIGNvbnN0IGlzUmVsb2FkID0gdGhpcy5faWRlbnRpdHkgIT09IHVuZGVmaW5lZDtcblxuICAgIHRoaXMudmVyaWZ5TWFuaWZlc3QobWFuaWZlc3QpO1xuICAgIHRoaXMuX21hbmlmZXN0ID0gbWFuaWZlc3Q7XG4gICAgdGhpcy5faWRlbnRpdHkgPSByYXc7XG5cbiAgICBpZiAoaXNSZWxvYWQpIHtcbiAgICAgIGxvZ2dpbmcuZGVidWcoXG4gICAgICAgIGAke1Rhc2tSdW50aW1lLk1BTklGRVNUX0ZJTEV9IGNoYW5nZWQgb24gZGlzazsgc3VjY2Vzc2Z1bGx5IGxvYWRlZCB0aGUgbmV3IHRhc2tzIG1hbmlmZXN0LmAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZXMgYSBmcmVzaGx5IHJlYWQgbWFuaWZlc3Q6XG4gICAqXG4gICAqIC0gTGVnYWN5IG1hbmlmZXN0cyAobm8gYG1hbmlmZXN0VmVyc2lvbmApIGFyZSBhY2NlcHRlZCBhcy1pcyBmb3IgYmFja3dhcmRzXG4gICAqICAgY29tcGF0aWJpbGl0eS5cbiAgICogLSBNYW5pZmVzdHMgZnJvbSBhIG5ld2VyIHByb2plbiAoYSBoaWdoZXIgYG1hbmlmZXN0VmVyc2lvbmApIGFyZSBhY2NlcHRlZFxuICAgKiAgIHdpdGggYSB3YXJuaW5nLCBzaW5jZSB0aGlzIHJ1bnRpbWUgbWF5IG5vdCB1bmRlcnN0YW5kIHRoZSBzY2hlbWEuXG4gICAqL1xuICBwcml2YXRlIHZlcmlmeU1hbmlmZXN0KG1hbmlmZXN0OiBUYXNrc01hbmlmZXN0KTogdm9pZCB7XG4gICAgLy8gQmFja3dhcmRzIGNvbXBhdGliaWxpdHk6IG1hbmlmZXN0cyBnZW5lcmF0ZWQgYmVmb3JlIHZlcnNpb25pbmcgY2Fycnkgbm9cbiAgICAvLyB2ZXJzaW9uLlxuICAgIGlmIChtYW5pZmVzdC5tYW5pZmVzdFZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChtYW5pZmVzdC5tYW5pZmVzdFZlcnNpb24gPiBUQVNLU19NQU5JRkVTVF9WRVJTSU9OKSB7XG4gICAgICBsb2dnaW5nLndhcm4oXG4gICAgICAgIGAke1Rhc2tSdW50aW1lLk1BTklGRVNUX0ZJTEV9IHdhcyBnZW5lcmF0ZWQgYnkgYSBuZXdlciB2ZXJzaW9uIG9mIHByb2plbiBgICtcbiAgICAgICAgICBgKG1hbmlmZXN0IHZlcnNpb24gJHttYW5pZmVzdC5tYW5pZmVzdFZlcnNpb259LCB0aGlzIHByb2plbiBzdXBwb3J0cyB1cCB0byAke1RBU0tTX01BTklGRVNUX1ZFUlNJT059KS4gYCArXG4gICAgICAgICAgYFNvbWUgdGFza3MgbWF5IG5vdCBiZWhhdmUgYXMgZXhwZWN0ZWQ7IGNvbnNpZGVyIHVwZ3JhZGluZyBwcm9qZW4uYCxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIFJ1blRhc2sge1xuICBwcml2YXRlIGVudjogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkIH0gPSB7fTtcbiAgcHJpdmF0ZSByZWFkb25seSBwYXJlbnRzOiBzdHJpbmdbXTtcblxuICBwcml2YXRlIHJlYWRvbmx5IHdvcmtkaXI6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJ1bnRpbWU6IFRhc2tSdW50aW1lLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdGFzazogVGFza1NwZWMsXG4gICAgcGFyZW50czogc3RyaW5nW10gPSBbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGFyZ3M6IEFycmF5PHN0cmluZyB8IG51bWJlcj4gPSBbXSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVudlBhcmFtOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9LFxuICApIHtcbiAgICB0aGlzLndvcmtkaXIgPSB0YXNrLmN3ZCA/PyB0aGlzLnJ1bnRpbWUud29ya2RpcjtcbiAgICB0aGlzLnBhcmVudHMgPSBwYXJlbnRzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIHRoZSB0YXNrLiBUaGlzIHdhcyBwcmV2aW91c2x5IGRvbmUgaW4gdGhlIGNvbnN0cnVjdG9yLCBidXQgaXMgbm93XG4gICAqIGFuIGFzeW5jIG1ldGhvZCBzaW5jZSBzaGVsbCBleGVjdXRpb24gaXMgYXN5bmNocm9ub3VzIChlLmcuIGRheCBvblxuICAgKiBXaW5kb3dzKS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyB0YXNrLCBhcmdzLCBwYXJlbnRzIH0gPSB0aGlzO1xuXG4gICAgaWYgKCF0YXNrLnN0ZXBzIHx8IHRhc2suc3RlcHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmxvZ0RlYnVnKGdyYXkoXCJObyBhY3Rpb25zIGhhdmUgYmVlbiBzcGVjaWZpZWQgZm9yIHRoaXMgdGFzay5cIikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZW52ID0gYXdhaXQgdGhpcy5yZXNvbHZlRW52aXJvbm1lbnQoXG4gICAgICB0aGlzLmVudlBhcmFtLFxuICAgICAgcGFyZW50cyxcbiAgICAgIHRoaXMucmVzb2x2ZVNoZWxsKCksXG4gICAgKTtcblxuICAgIGNvbnN0IGVudmxvZ3MgPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmVudikpIHtcbiAgICAgIGNvbnN0IHZ2ID0gdiA/PyBcIlwiO1xuICAgICAgY29uc3QgdHJpbW1lZCA9XG4gICAgICAgIHZ2Lmxlbmd0aCA+IEVOVl9UUklNX0xFTiA/IHZ2LnN1YnN0cmluZygwLCBFTlZfVFJJTV9MRU4pICsgXCIuLi5cIiA6IHZ2O1xuICAgICAgZW52bG9ncy5wdXNoKGAke2t9PSR7dHJpbW1lZH1gKTtcbiAgICB9XG5cbiAgICBpZiAoZW52bG9ncy5sZW5ndGgpIHtcbiAgICAgIHRoaXMubG9nRGVidWcoZ3JheShgJHt1bmRlcmxpbmUoXCJlbnZcIil9OiAke2VudmxvZ3Muam9pbihcIiBcIil9YCkpO1xuICAgIH1cblxuICAgIC8vIGV2YWx1YXRlIGNvbmRpdGlvblxuICAgIGlmICghKGF3YWl0IHRoaXMuZXZhbENvbmRpdGlvbih0YXNrLCB0aGlzLnJlc29sdmVTaGVsbCgpKSkpIHtcbiAgICAgIHRoaXMubG9nKFwiY29uZGl0aW9uIGV4aXRlZCB3aXRoIG5vbi16ZXJvIC0gc2tpcHBpbmdcIik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gdmVyaWZ5IHdlIHJlcXVpcmVkIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgZGVmaW5lZFxuICAgIGNvbnN0IG1lcmdlZCA9IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLnRoaXMuZW52IH07XG4gICAgY29uc3QgbWlzc2luZyA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHRhc2sucmVxdWlyZWRFbnYgPz8gW10pIHtcbiAgICAgIGlmICghKG5hbWUgaW4gbWVyZ2VkKSkge1xuICAgICAgICBtaXNzaW5nLnB1c2gobmFtZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgbWlzc2luZyByZXF1aXJlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXM6ICR7bWlzc2luZy5qb2luKFwiLFwiKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHN0ZXAgb2YgdGFzay5zdGVwcykge1xuICAgICAgY29uc3Qgc3RlcFNoZWxsID0gdGhpcy5yZXNvbHZlU2hlbGwoc3RlcCk7XG5cbiAgICAgIC8vIGV2YWx1YXRlIHN0ZXAgY29uZGl0aW9uXG4gICAgICBpZiAoIShhd2FpdCB0aGlzLmV2YWxDb25kaXRpb24oc3RlcCwgc3RlcFNoZWxsKSkpIHtcbiAgICAgICAgdGhpcy5sb2coXCJjb25kaXRpb24gZXhpdGVkIHdpdGggbm9uLXplcm8gLSBza2lwcGluZ1wiKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFyZ3NMaXN0OiBzdHJpbmdbXSA9IFtcbiAgICAgICAgLi4uKHN0ZXAuYXJncyB8fCBbXSksXG4gICAgICAgIC4uLihzdGVwLnJlY2VpdmVBcmdzID8gYXJncyA6IFtdKSxcbiAgICAgIF0ubWFwKChhKSA9PiBhLnRvU3RyaW5nKCkpO1xuXG4gICAgICBpZiAoc3RlcC5zYXkpIHtcbiAgICAgICAgbG9nZ2luZy5pbmZvKHRoaXMuZm10TG9nKHN0ZXAuc2F5KSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGVwLnNwYXduKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucnVudGltZS5ydW5UYXNrKFxuICAgICAgICAgIHN0ZXAuc3Bhd24sXG4gICAgICAgICAgWy4uLnRoaXMucGFyZW50cywgdGhpcy50YXNrLm5hbWVdLFxuICAgICAgICAgIGFyZ3NMaXN0LFxuICAgICAgICAgIHN0ZXAuZW52LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleGVjczogQXJyYXk8c3RyaW5nIHwgc3RyaW5nW10+ID0gc3RlcC5leGVjID8gW3N0ZXAuZXhlY10gOiBbXTtcblxuICAgICAgLy8gUGFyc2Ugc3RlcC1zcGVjaWZpYyBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiAgICAgIGNvbnN0IGVudiA9IGF3YWl0IHRoaXMuZXZhbEVudmlyb25tZW50KHN0ZXAuZW52ID8/IHt9LCBzdGVwU2hlbGwpO1xuXG4gICAgICBpZiAoc3RlcC5idWlsdGluKSB7XG4gICAgICAgIGV4ZWNzLnB1c2godGhpcy5yZW5kZXJCdWlsdGluKHN0ZXAuYnVpbHRpbikpO1xuICAgICAgfVxuXG4gICAgICAvLyBgZXhlY0FyZ3NgIGlzIGFuIGV4cGxpY2l0IGFyZ3YgKHRoZSBwcm9ncmFtIGZvbGxvd2VkIGJ5IGl0cyBhcmd1bWVudHMpLlxuICAgICAgLy8gSXQgaXMgaGFuZGVkIHRvIGBzaGVsbCgpYCBhcyBhbiBhcnJheSByYXRoZXIgdGhhbiBhIHJlbmRlcmVkIHN0cmluZywgc29cbiAgICAgIC8vIGl0IHJ1bnMgd2l0aG91dCBhIHNoZWxsIGFuZCBldmVyeSBlbGVtZW50IGlzIHBhc3NlZCB0aHJvdWdoIHZlcmJhdGltIC1cbiAgICAgIC8vIHdoaWNoIGlzIHdoYXQgbGV0cyBjYWxsZXJzIGF2b2lkIHRoaW5raW5nIGFib3V0IHF1b3RpbmcuIEZpeGVkL3JlY2VpdmVkXG4gICAgICAvLyBhcmdzIGFyZSBzcGxpY2VkIGluIHdoZXJldmVyIGEgYCRAYCBtYXJrZXIgZWxlbWVudCBhcHBlYXJzIChtaXJyb3JpbmdcbiAgICAgIC8vIHRoZSBzdHJpbmcgYGV4ZWNgIGJlaGF2aW9yKSwgb3IgYXBwZW5kZWQgYXQgdGhlIGVuZCBpZiB0aGVyZSBpcyBub25lLlxuICAgICAgaWYgKHN0ZXAuZXhlY0FyZ3MpIHtcbiAgICAgICAgY29uc3QgYXJndjogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgbGV0IHBsYWNlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2Ygc3RlcC5leGVjQXJncykge1xuICAgICAgICAgIGlmIChlbGVtZW50ID09PSBBUkdTX01BUktFUikge1xuICAgICAgICAgICAgYXJndi5wdXNoKC4uLmFyZ3NMaXN0KTtcbiAgICAgICAgICAgIHBsYWNlZCA9IHRydWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFyZ3YucHVzaChlbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwbGFjZWQpIHtcbiAgICAgICAgICBhcmd2LnB1c2goLi4uYXJnc0xpc3QpO1xuICAgICAgICB9XG4gICAgICAgIGV4ZWNzLnB1c2goYXJndik7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZXhlYyBvZiBleGVjcykge1xuICAgICAgICBsZXQgY29tbWFuZCA9IGV4ZWM7XG5cbiAgICAgICAgLy8gQSBzdHJpbmcgY29tbWFuZCBpcyBhIHNoZWxsIGxpbmU6IHNwbGljZSB0YXNrIGFyZ3MgaW4gcGVyIHRoZSBgJEBgXG4gICAgICAgIC8vIG1hcmtlciBydWxlcy4gQW4gYGV4ZWNBcmdzYCBhcmd2IGFscmVhZHkgY2FycmllcyBpdHMgYXJncywgdW50b3VjaGVkLlxuICAgICAgICBpZiAodHlwZW9mIGNvbW1hbmQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBpZiAoY29tbWFuZC5pbmNsdWRlcyhRVU9URURfQVJHU19NQVJLRVIpKSB7XG4gICAgICAgICAgICAvLyBgXCIkQFwiYDogc3BsaWNlIGVhY2ggYXJnIGluIGFzIGEgc2VwYXJhdGUgdmVyYmF0aW0gd29yZCAobGlrZVxuICAgICAgICAgICAgLy8gYmFzaCdzIHF1b3RlZCBgXCIkQFwiYCksIHNvIHdoaXRlc3BhY2UgYW5kIG1ldGFjaGFyYWN0ZXJzIHN1cnZpdmUuXG4gICAgICAgICAgICBjb21tYW5kID0gY29tbWFuZC5yZXBsYWNlKFxuICAgICAgICAgICAgICBRVU9URURfQVJHU19NQVJLRVIsXG4gICAgICAgICAgICAgIGFyZ3NMaXN0Lm1hcChxdW90ZUFyZykuam9pbihcIiBcIiksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC5pbmNsdWRlcyhBUkdTX01BUktFUikpIHtcbiAgICAgICAgICAgIGNvbW1hbmQgPSBjb21tYW5kLnJlcGxhY2UoQVJHU19NQVJLRVIsIGFyZ3NMaXN0LmpvaW4oXCIgXCIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tbWFuZCA9IFtjb21tYW5kLCAuLi5hcmdzTGlzdF0uam9pbihcIiBcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3dkID0gc3RlcC5jd2Q7XG4gICAgICAgIC8vIEEgdGhyb3duIGVycm9yIChlLmcuIHNwYXduIGZhaWx1cmUpIHByb3BhZ2F0ZXM7IGEgbm9uLXplcm8gZXhpdCBpc1xuICAgICAgICAvLyByZXBvcnRlZCB2aWEgYHJlc3VsdC5zdGF0dXNgLlxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnNoZWxsKHtcbiAgICAgICAgICBjb21tYW5kLFxuICAgICAgICAgIGN3ZCxcbiAgICAgICAgICBleHRyYUVudjogZW52LFxuICAgICAgICAgIHNoZWxsOiBzdGVwU2hlbGwsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUYXNrIFwiJHt0aGlzLmZ1bGxuYW1lfVwiIGZhaWxlZCB3aGVuIGV4ZWN1dGluZyBcIiR7XG4gICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoY29tbWFuZCkgPyBjb21tYW5kLmpvaW4oXCIgXCIpIDogY29tbWFuZFxuICAgICAgICAgICAgfVwiIChjd2Q6ICR7cmVzb2x2ZShjd2QgPz8gdGhpcy53b3JrZGlyKX0pYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgYSB0YXNrIHNob3VsZCBiZSBleGVjdXRlZCBiYXNlZCBvbiBcImNvbmRpdGlvblwiLlxuICAgKlxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSB0YXNrIHNob3VsZCBiZSBleGVjdXRlZCBvciBmYWxzZSBpZiB0aGUgY29uZGl0aW9uXG4gICAqIGV2YWx1YXRlcyB0byBmYWxzZSAoZXhpdHMgd2l0aCBub24temVybyksIGluZGljYXRpbmcgdGhhdCB0aGUgdGFzayBzaG91bGRcbiAgICogYmUgc2tpcHBlZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXZhbENvbmRpdGlvbihcbiAgICB0YXNrT3JTdGVwOiBUYXNrU3BlYyB8IFRhc2tTdGVwLFxuICAgIHNoZWxsOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgKSB7XG4gICAgLy8gbm8gY29uZGl0aW9uLCBjYXJyeSBvblxuICAgIGlmICghdGFza09yU3RlcC5jb25kaXRpb24pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMubG9nKGdyYXkoYCR7dW5kZXJsaW5lKFwiY29uZGl0aW9uXCIpfTogJHt0YXNrT3JTdGVwLmNvbmRpdGlvbn1gKSk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaGVsbCh7XG4gICAgICBjb21tYW5kOiB0YXNrT3JTdGVwLmNvbmRpdGlvbixcbiAgICAgIHF1aWV0OiB0cnVlLFxuICAgICAgc2hlbGwsXG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV2YWx1YXRlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSBzaGVsbCBjb21tYW5kcyAoZS5nLiBgJCh4eClgKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBldmFsRW52aXJvbm1lbnQoXG4gICAgZW52OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSxcbiAgICBzaGVsbDogc3RyaW5nIHwgc3RyaW5nW10sXG4gICkge1xuICAgIGNvbnN0IG91dHB1dDogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkIH0gPSB7fTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVudiA/PyB7fSkpIHtcbiAgICAgIGlmIChTdHJpbmcodmFsdWUpLnN0YXJ0c1dpdGgoXCIkKFwiKSAmJiBTdHJpbmcodmFsdWUpLmVuZHNXaXRoKFwiKVwiKSkge1xuICAgICAgICBjb25zdCBxdWVyeSA9IHZhbHVlLnN1YnN0cmluZygyLCB2YWx1ZS5sZW5ndGggLSAxKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5zaGVsbCh7XG4gICAgICAgICAgY29tbWFuZDogcXVlcnksXG4gICAgICAgICAgcXVpZXQ6IHRydWUsXG4gICAgICAgICAgY2FwdHVyZU91dHB1dDogdHJ1ZSxcbiAgICAgICAgICBzaGVsbCxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3IgPSByZXN1bHQuZXJyb3JcbiAgICAgICAgICAgID8gcmVzdWx0LmVycm9yLnN0YWNrXG4gICAgICAgICAgICA6IHJlc3VsdC5zdGRlcnI/LnRvU3RyaW5nKCkudHJpbSgpIHx8XG4gICAgICAgICAgICAgIHJlc3VsdC5zdGRvdXQ/LnRvU3RyaW5nKCkudHJpbSgpIHx8XG4gICAgICAgICAgICAgIGBjb21tYW5kIGV4aXRlZCB3aXRoIGNvZGUgJHtyZXN1bHQuc3RhdHVzfWA7XG5cbiAgICAgICAgICBsb2dnaW5nLndhcm4oXG4gICAgICAgICAgICB0aGlzLmZtdExvZyhcbiAgICAgICAgICAgICAgYCR7dW5kZXJsaW5lKGtleSl9OiB1bmFibGUgdG8gZXZhbHVhdGUgXCIke3F1ZXJ5fVwiLiBFbnZpcm9ubWVudCB2YXJpYWJsZSB3aWxsIGJlIHNraXBwZWQuIENoZWNrIHRoYXQgdGhlIGNvbW1hbmQgZXhpc3RzIGFuZCBydW5zIHN1Y2Nlc3NmdWxseS5gLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGxvZ2dpbmcud2Fybih0aGlzLmZtdExvZyhgJHt1bmRlcmxpbmUoa2V5KX06ICR7ZXJyb3J9YCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dHB1dFtrZXldID0gcmVzdWx0LnN0ZG91dD8udG9TdHJpbmcoXCJ1dGYtOFwiKS50cmltKCkgPz8gXCJcIjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0cHV0W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW5kZXJzIHRoZSBydW50aW1lIGVudmlyb25tZW50IGZvciBhIHRhc2suIE5hbWVseSwgaXQgc3VwcG9ydHMgdGhpcyBzeW50YXhcbiAgICogYCQoeHgpYCBmb3IgYWxsb3dpbmcgZW52aXJvbm1lbnQgdG8gYmUgZXZhbHVhdGVkIGJ5IGV4ZWN1dGluZyBhIHNoZWxsXG4gICAqIGNvbW1hbmQgYW5kIG9idGFpbmluZyBpdHMgcmVzdWx0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXNvbHZlRW52aXJvbm1lbnQoXG4gICAgZW52UGFyYW06IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9LFxuICAgIHBhcmVudHM6IHN0cmluZ1tdLFxuICAgIHNoZWxsOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgKSB7XG4gICAgbGV0IGVudiA9IHRoaXMucnVudGltZS5tYW5pZmVzdC5lbnYgPz8ge307XG5cbiAgICAvLyBhZGQgZW52IGZyb20gYWxsIHBhcmVudCB0YXNrcyBvbmUgYnkgb25lXG4gICAgZm9yIChjb25zdCBwYXJlbnQgb2YgcGFyZW50cykge1xuICAgICAgZW52ID0ge1xuICAgICAgICAuLi5lbnYsXG4gICAgICAgIC4uLih0aGlzLnJ1bnRpbWUudHJ5RmluZFRhc2socGFyZW50KT8uZW52ID8/IHt9KSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gYXBwbHkgdGFzayBlbnZpcm9ubWVudCwgdGhlbiB0aGUgc3BlY2lmaWMgZW52IGxhc3RcbiAgICBlbnYgPSB7XG4gICAgICAuLi5lbnYsXG4gICAgICAuLi4odGhpcy50YXNrLmVudiA/PyB7fSksXG4gICAgICAuLi5lbnZQYXJhbSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXZhbEVudmlyb25tZW50KGVudiwgc2hlbGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBzaGVsbCBmb3IgYSBzdGVwJ3MgY29tbWFuZCAob3IgdGhlIHRhc2sncywgd2hlbiBubyBzdGVwIGlzXG4gICAqIGdpdmVuKTogc3RlcCwgdGhlbiB0YXNrLCB0aGVuIHByb2plY3QgZGVmYXVsdCwgdGhlbiBcInByb2plblwiLlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlU2hlbGwoc3RlcD86IFRhc2tTdGVwKTogc3RyaW5nIHwgc3RyaW5nW10ge1xuICAgIHJldHVybiAoXG4gICAgICBzdGVwPy5zaGVsbCA/PyB0aGlzLnRhc2suc2hlbGwgPz8gdGhpcy5ydW50aW1lLm1hbmlmZXN0LnNoZWxsID8/IFwicHJvamVuXCJcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIFwiZnVsbCBuYW1lXCIgb2YgdGhlIHRhc2sgd2hpY2ggaW5jbHVkZXMgYWxsIGl0J3MgcGFyZW50IHRhc2sgbmFtZXMgY29uY2F0ZW5hdGVkIGJ5IGNoZXZyb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXQgZnVsbG5hbWUoKSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnBhcmVudHMsIHRoaXMudGFzay5uYW1lXS5qb2luKFwiIMK7IFwiKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgbG9nZ2luZy52ZXJib3NlKHRoaXMuZm10TG9nKC4uLmFyZ3MpKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nRGVidWcoLi4uYXJnczogYW55W10pIHtcbiAgICBsb2dnaW5nLmRlYnVnKHRoaXMuZm10TG9nKC4uLmFyZ3MpKTtcbiAgfVxuXG4gIHByaXZhdGUgZm10TG9nKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgcmV0dXJuIGZvcm1hdChgJHt1bmRlcmxpbmUodGhpcy5mdWxsbmFtZSl9IHxgLCAuLi5hcmdzKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2hlbGwob3B0aW9uczogU2hlbGxPcHRpb25zKTogUHJvbWlzZTxTaGVsbFJlc3VsdD4ge1xuICAgIGNvbnN0IHF1aWV0ID0gb3B0aW9ucy5xdWlldCA/PyBmYWxzZTtcbiAgICBpZiAoIXF1aWV0KSB7XG4gICAgICBjb25zdCBsb2cgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gICAgICBsb2cucHVzaChcbiAgICAgICAgQXJyYXkuaXNBcnJheShvcHRpb25zLmNvbW1hbmQpXG4gICAgICAgICAgPyBvcHRpb25zLmNvbW1hbmQuam9pbihcIiBcIilcbiAgICAgICAgICA6IG9wdGlvbnMuY29tbWFuZCxcbiAgICAgICk7XG5cbiAgICAgIGlmIChvcHRpb25zLmN3ZCkge1xuICAgICAgICBsb2cucHVzaChgKGN3ZDogJHtvcHRpb25zLmN3ZH0pYCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9nKGxvZy5qb2luKFwiIFwiKSk7XG4gICAgfVxuXG4gICAgY29uc3QgY3dkID0gb3B0aW9ucy5jd2QgPz8gdGhpcy53b3JrZGlyO1xuICAgIGlmICghZXhpc3RzU3luYyhjd2QpIHx8ICFzdGF0U3luYyhjd2QpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGludmFsaWQgd29ya2RpciAoY3dkKTogJHtjd2R9IG11c3QgYmUgYW4gZXhpc3RpbmcgZGlyZWN0b3J5YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVGhlIHJlc29sdmVkIHNoZWxsIGlzIG9uZSBvZjpcbiAgICAvLyAtIFwicHJvamVuXCIgKGRlZmF1bHQpOiBkYXgncyBpbi1wcm9jZXNzIGNyb3NzLXBsYXRmb3JtIHNoZWxsLCBzbyBQT1NJWC1zdHlsZVxuICAgIC8vICAgdGFzayBzeW50YXggKGBta2RpciAtcGAsIGAmJmAsIGAkVkFSYCwgLi4uKSB3b3JrcyB0aGUgc2FtZSBldmVyeXdoZXJlLlxuICAgIC8vIC0gXCJzeXN0ZW1cIjogdGhlIGhvc3QncyBuYXRpdmUgc2hlbGwgKGAvYmluL3NoYCwgb3IgYGNtZC5leGVgIG9uIFdpbmRvd3MpLlxuICAgIC8vIC0gYW4gYXJndiwgZS5nLiBbXCJiYXNoXCIsXCItY1wiXTogYSBzaGVsbCBpbnZvY2F0aW9uIHdpdGggdGhlIGNvbW1hbmQgYXBwZW5kZWRcbiAgICAvLyAgIGFzIGl0cyBmaW5hbCBhcmd1bWVudC5cbiAgICBjb25zdCBzaGVsbCA9IG9wdGlvbnMuc2hlbGwgPz8gXCJwcm9qZW5cIjtcbiAgICBpZiAodHlwZW9mIHNoZWxsID09PSBcInN0cmluZ1wiICYmIHNoZWxsICE9PSBcInByb2plblwiICYmIHNoZWxsICE9PSBcInN5c3RlbVwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGB1bmtub3duIGJ1aWx0LWluIHNoZWxsICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgc2hlbGwsXG4gICAgICAgICl9OyB1c2UgdGhlIGJ1aWx0LWluIFwicHJvamVuXCIgb3IgXCJzeXN0ZW1cIiBzaGVsbHMsIG9yIGEgVGFza1NoZWxsLmNvbW1hbmQoWy4uLl0pIGludm9jYXRpb25gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBzdGRvdXQvc3RkZXJyIGFyZSBjYXB0dXJlZCBvbmx5IHdoZW4gYXNrZWQgKGUuZy4gYCQoLi4uKWAgZW52IGV2YWwpO1xuICAgIC8vIG90aGVyd2lzZSB0aGV5IGFyZSBpbmhlcml0ZWQgc28gb3V0cHV0IHN0cmVhbXMgdGhyb3VnaC5cbiAgICBjb25zdCBjYXB0dXJlID0gb3B0aW9ucy5jYXB0dXJlT3V0cHV0ID8/IGZhbHNlO1xuXG4gICAgY29uc3QgY29tbWFuZCA9IG9wdGlvbnMuY29tbWFuZDtcbiAgICBjb25zdCBlbnYgPSB7XG4gICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgIC4uLnRoaXMuZW52LFxuICAgICAgLi4ub3B0aW9ucy5leHRyYUVudixcbiAgICB9O1xuXG4gICAgLy8gXCJzeXN0ZW1cIjogdGhlIGhvc3QtbmF0aXZlIGVuZ2luZS4gQSBzdHJpbmcgY29tbWFuZCBydW5zIHRocm91Z2ggdGhlIE9TXG4gICAgLy8gc2hlbGw7IGFuIGBleGVjQXJnc2AgYXJndiBpcyBzcGF3bmVkIGRpcmVjdGx5IChzaGVsbC1mcmVlKSwgc28gdGhlIHJlYWxcbiAgICAvLyBiaW5hcnkgcnVucyB3aXRoIG5vIGRheCBidWlsdC1pbnMuIChPbmx5IGAkKC4uLilgL2NvbmRpdGlvbiBldmFsIGNhcHR1cmVzLFxuICAgIC8vIGFuZCB0aG9zZSBhbHdheXMgcGFzcyBhIHN0cmluZywgc28gYW4gYXJyYXkgY29tbWFuZCBuZXZlciBuZWVkcyBjYXB0dXJlLilcbiAgICBpZiAoc2hlbGwgPT09IFwic3lzdGVtXCIpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNvbW1hbmQpKSB7XG4gICAgICAgIGNvbnN0IFtwcm9ncmFtLCAuLi5hcmdzXSA9IGNvbW1hbmQ7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdG9vbChwcm9ncmFtKS5ydW4oYXJncywgeyBjd2QsIGVudiwgaW5oZXJpdFN0ZGlvOiB0cnVlIH0pO1xuICAgICAgICAgIHJldHVybiB7IHN0YXR1czogMCB9O1xuICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGU/LnN0YXR1cyA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhdHVzOiBlLnN0YXR1cyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3lzdGVtU2hlbGwoY29tbWFuZCwgeyBjd2QsIGVudiwgY2FwdHVyZSB9KTtcbiAgICB9XG5cbiAgICAvLyBPdGhlcndpc2UgcnVuIHRocm91Z2ggZGF4OiB0aGUgXCJwcm9qZW5cIiBzaGVsbCBvciBhbiBleHBsaWNpdCBpbnZvY2F0aW9uLlxuICAgIGNvbnN0IGJ1aWxkZXIgPSB0aGlzLmJ1aWxkRGF4Q29tbWFuZChjb21tYW5kLCBzaGVsbCk7XG5cbiAgICBsZXQgcmVzdWx0O1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBidWlsZGVyXG4gICAgICAgIC5jd2QoY3dkKVxuICAgICAgICAuZW52KGVudilcbiAgICAgICAgLnN0ZG91dChjYXB0dXJlID8gXCJwaXBlZFwiIDogXCJpbmhlcml0XCIpXG4gICAgICAgIC5zdGRlcnIoY2FwdHVyZSA/IFwicGlwZWRcIiA6IFwiaW5oZXJpdFwiKVxuICAgICAgICAubm9UaHJvdygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGRheCdzIGluLXByb2Nlc3Mgc2hlbGwgdGhyb3dzIGEgdGVyc2UgYE5vdCBpbXBsZW1lbnRlZDogLi4uYCBmb3Igc2hlbGxcbiAgICAgIC8vIHN5bnRheCBpdCBkb2VzIG5vdCBzdXBwb3J0IChlLmcuIGAkKC4uLilgIGNvbW1hbmQgc3Vic3RpdHV0aW9uKTsgdHVyblxuICAgICAgLy8gdGhhdCBpbnRvIGFuIGFjdGlvbmFibGUgZXJyb3IgdGhhdCBwb2ludHMgYXQgdGhlIHN5c3RlbS1zaGVsbCBlc2NhcGVcbiAgICAgIC8vIGhhdGNoLiBPdGhlciBlcnJvcnMgcGFzcyB0aHJvdWdoIHVuY2hhbmdlZC5cbiAgICAgIHRocm93IGVucmljaEJ1aWx0aW5TaGVsbEVycm9yKGUsIGNvbW1hbmQpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IHJlc3VsdC5jb2RlLFxuICAgICAgc3Rkb3V0OiBjYXB0dXJlID8gQnVmZmVyLmZyb20ocmVzdWx0LnN0ZG91dEJ5dGVzKSA6IG51bGwsXG4gICAgICBzdGRlcnI6IGNhcHR1cmUgPyBCdWZmZXIuZnJvbShyZXN1bHQuc3RkZXJyQnl0ZXMpIDogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZGF4IGNvbW1hbmQgZm9yIHRoZSBcInByb2plblwiIHNoZWxsIG9yIGFuIGV4cGxpY2l0IGludm9jYXRpb24uXG4gICAqIChUaGUgXCJzeXN0ZW1cIiBzaGVsbCBpcyBoYW5kbGVkIGhvc3Qtc2lkZSwgbm90IGhlcmUuKSBgY29tbWFuZGAgaXMgYSBzaGVsbFxuICAgKiBsaW5lIChzdHJpbmcpIG9yIGFuIGBleGVjQXJnc2AgYXJndiAoc3RyaW5nW10pOyBgc2hlbGxgIGlzIGBcInByb2plblwiYCBvciBhblxuICAgKiBpbnZvY2F0aW9uIGFyZ3Ygc3VjaCBhcyBgW1wiYmFzaFwiLCBcIi1jXCJdYC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGREYXhDb21tYW5kKFxuICAgIGNvbW1hbmQ6IHN0cmluZyB8IHN0cmluZ1tdLFxuICAgIHNoZWxsOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgKSB7XG4gICAgLy8gQW4gaW52b2NhdGlvbiAoZS5nLiBbXCJiYXNoXCIsXCItY1wiXSwgW1wibnB4XCIsXCItLW5vXCIsXCItY1wiXSk6IGFwcGVuZCB0aGVcbiAgICAvLyBjb21tYW5kIGFzIGl0cyBmaW5hbCBhcmd1bWVudC4gQSBzdHJpbmcgaXMgYXBwZW5kZWQgYXMtaXM7IGFuIGBleGVjQXJnc2BcbiAgICAvLyBhcmd2IGlzIHJlbmRlcmVkIHRvIGEgcXVvdGVkIGNvbW1hbmQgbGluZSBzbyB0aGUgc2hlbGwgcmUtcGFyc2VzIHRoZSBzYW1lXG4gICAgLy8gYXJndi5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShzaGVsbCkpIHtcbiAgICAgIGNvbnN0IFtwcm9ncmFtLCAuLi5mbGFnc10gPSBzaGVsbDtcbiAgICAgIGNvbnN0IGNvbW1hbmRMaW5lID0gQXJyYXkuaXNBcnJheShjb21tYW5kKVxuICAgICAgICA/IGNvbW1hbmQubWFwKHF1b3RlQXJnKS5qb2luKFwiIFwiKVxuICAgICAgICA6IGNvbW1hbmQ7XG4gICAgICByZXR1cm4gJGAke3Byb2dyYW19ICR7Wy4uLmZsYWdzLCBjb21tYW5kTGluZV19YDtcbiAgICB9XG5cbiAgICAvLyBUaGUgYnVpbHQtaW4gXCJwcm9qZW5cIiBzaGVsbCAoZGF4KS5cbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShjb21tYW5kKVxuICAgICAgPyAvLyBleGVjQXJnczogc2hlbGwtZnJlZSBhcmd2IChlYWNoIGVsZW1lbnQgZXNjYXBlZDsgYC5jbWRgIHNoaW1zIHJlc29sdmVkKS5cbiAgICAgICAgJGAke2NvbW1hbmRbMF19ICR7Y29tbWFuZC5zbGljZSgxKX1gXG4gICAgICA6IC8vIHN0cmluZyBjb21tYW5kLCBwYXJzZWQgaW4tcHJvY2VzcyBieSBkYXgncyBjcm9zcy1wbGF0Zm9ybSBzaGVsbC5cbiAgICAgICAgJC5yYXdgJHtjb21tYW5kfWA7XG4gIH1cblxuICBwcml2YXRlIHJlbmRlckJ1aWx0aW4oYnVpbHRpbjogc3RyaW5nKSB7XG4gICAgLy8gTG9jYXRlIHByb2plbidzIHBhY2thZ2Ugcm9vdCBieSB3YWxraW5nIHVwIGZyb20gdGhpcyBtb2R1bGUncyBkaXJlY3RvcnlcbiAgICAvLyB1bnRpbCB3ZSBmaW5kIGEgcGFja2FnZS5qc29uLiBUaGlzIHdvcmtzIHdoZXRoZXIgdGhlIGNvZGUgcnVucyBmcm9tIHRoZVxuICAgIC8vIGNvbXBpbGVkIGZpbGUgKGxpYi9jbGkvdGFzay1ydW50aW1lLmpzKSBvciBmcm9tIHRoZSBidW5kbGVkIHJ1bi10YXNrLmNqc1xuICAgIC8vIChsaWIvcnVuLXRhc2suY2pzKSwgd2hpY2ggbGl2ZSBhdCBkaWZmZXJlbnQgZGVwdGhzIC0gc28gYSBoYXJkLWNvZGVkXG4gICAgLy8gcmVsYXRpdmUgcGF0aCB0byBwYWNrYWdlLmpzb24gd291bGQgYmUgd3JvbmcgaW4gb25lIG9mIHRoZSB0d28gY2FzZXMuXG4gICAgbGV0IG1vZHVsZVJvb3QgPSBfX2Rpcm5hbWU7XG4gICAgd2hpbGUgKCFleGlzdHNTeW5jKGpvaW4obW9kdWxlUm9vdCwgXCJwYWNrYWdlLmpzb25cIikpKSB7XG4gICAgICBjb25zdCBwYXJlbnQgPSBkaXJuYW1lKG1vZHVsZVJvb3QpO1xuICAgICAgaWYgKHBhcmVudCA9PT0gbW9kdWxlUm9vdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1bmFibGUgdG8gbG9jYXRlIHRoZSBwcm9qZW4gcGFja2FnZSByb290XCIpO1xuICAgICAgfVxuICAgICAgbW9kdWxlUm9vdCA9IHBhcmVudDtcbiAgICB9XG4gICAgY29uc3QgcHJvZ3JhbSA9IHJlcXVpcmUucmVzb2x2ZShcbiAgICAgIGpvaW4obW9kdWxlUm9vdCwgXCJsaWJcIiwgYCR7YnVpbHRpbn0udGFzay5qc2ApLFxuICAgICk7XG4gICAgcmV0dXJuIGBcIiR7cHJvY2Vzcy5leGVjUGF0aH1cIiBcIiR7cHJvZ3JhbX1cImA7XG4gIH1cbn1cblxuaW50ZXJmYWNlIFNoZWxsT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgY29tbWFuZCB0byBydW4uIEEgc3RyaW5nIGlzIGV4ZWN1dGVkIGFzIGEgc2hlbGwgY29tbWFuZCBsaW5lOyBhXG4gICAqIHN0cmluZyBhcnJheSBpcyBhbiBleHBsaWNpdCBhcmd2IChwcm9ncmFtICsgYXJndW1lbnRzKSBleGVjdXRlZCB3aXRob3V0IGFcbiAgICogc2hlbGwuXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kOiBzdHJpbmcgfCBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIEBkZWZhdWx0IC0gcHJvamVjdCBkaXJcbiAgICovXG4gIHJlYWRvbmx5IGN3ZD86IHN0cmluZztcbiAgLyoqXG4gICAqIENhcHR1cmUgc3Rkb3V0L3N0ZGVyciAoc28gdGhlIGNhbGxlciBjYW4gcmVhZCB0aGVtIGZyb20gdGhlIHJlc3VsdClcbiAgICogaW5zdGVhZCBvZiBpbmhlcml0aW5nIHRoZSBwYXJlbnQncyBzdHJlYW1zLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgY2FwdHVyZU91dHB1dD86IGJvb2xlYW47XG4gIC8qKiBAZGVmYXVsdCBmYWxzZSAqL1xuICByZWFkb25seSBxdWlldD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGV4dHJhRW52PzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkIH07XG4gIC8qKlxuICAgKiBUaGUgcmVzb2x2ZWQgc2hlbGwgdG8gaW50ZXJwcmV0IHRoZSBjb21tYW5kIChlLmcuIFwicHJvamVuXCIsIFwiYmFzaCAtY1wiKS5cbiAgICogQGRlZmF1bHQgXCJwcm9qZW5cIlxuICAgKi9cbiAgcmVhZG9ubHkgc2hlbGw/OiBzdHJpbmcgfCBzdHJpbmdbXTtcbn1cbiJdfQ==
package/lib/component.js CHANGED
@@ -16,7 +16,7 @@ const componentId = (scope) => {
16
16
  * @param id Unique id of the component. If not provided, an unstable AutoId is generated.
17
17
  */
18
18
  class Component extends constructs_1.Construct {
19
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Component", version: "0.101.2" };
19
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Component", version: "0.101.3" };
20
20
  /**
21
21
  * Test whether the given construct is a component.
22
22
  */
@@ -51,7 +51,7 @@ const json_1 = require("./json");
51
51
  * `nodeProject.addDeps()` or use the generic API of `project.deps`:
52
52
  */
53
53
  class Dependencies extends component_1.Component {
54
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Dependencies", version: "0.101.2" };
54
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.Dependencies", version: "0.101.3" };
55
55
  /**
56
56
  * The project-relative path of the deps manifest file.
57
57
  */
package/lib/dev-env.js CHANGED
@@ -6,7 +6,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
6
  * Options for specifying the Docker image of the container.
7
7
  */
8
8
  class DevEnvironmentDockerImage {
9
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.DevEnvironmentDockerImage", version: "0.101.2" };
9
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.DevEnvironmentDockerImage", version: "0.101.3" };
10
10
  /**
11
11
  * A publicly available Docker image.
12
12
  * @example 'ubuntu:latest'
@@ -7,7 +7,7 @@ const docker_compose_1 = require("./docker-compose");
7
7
  * A docker-compose service.
8
8
  */
9
9
  class DockerComposeService {
10
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.DockerComposeService", version: "0.101.2" };
10
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.DockerComposeService", version: "0.101.3" };
11
11
  /**
12
12
  * Name of the service.
13
13
  */
@@ -11,7 +11,7 @@ const yaml_1 = require("../yaml");
11
11
  * Create a docker-compose YAML file.
12
12
  */
13
13
  class DockerCompose extends component_1.Component {
14
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.DockerCompose", version: "0.101.2" };
14
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.DockerCompose", version: "0.101.3" };
15
15
  /**
16
16
  * Depends on a service name.
17
17
  */
package/lib/file.js CHANGED
@@ -45,7 +45,7 @@ const util_1 = require("./util");
45
45
  const constructs_1 = require("./util/constructs");
46
46
  const diff_1 = require("./util/diff");
47
47
  class FileBase extends component_1.Component {
48
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.FileBase", version: "0.101.2" };
48
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.FileBase", version: "0.101.3" };
49
49
  /**
50
50
  * The file path, relative to the project's outdir.
51
51
  */
@@ -32,7 +32,7 @@ var EndOfLine;
32
32
  * @see https://git-scm.com/docs/gitattributes
33
33
  */
34
34
  class GitAttributesFile extends file_1.FileBase {
35
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.GitAttributesFile", version: "0.101.2" };
35
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.GitAttributesFile", version: "0.101.3" };
36
36
  attributes = new Map();
37
37
  /**
38
38
  * The default end of line character for text files.
@@ -6,7 +6,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
6
  * Manage the versions used for GitHub Actions used in steps
7
7
  */
8
8
  class GitHubActionsProvider {
9
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.GitHubActionsProvider", version: "0.101.2" };
9
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.GitHubActionsProvider", version: "0.101.3" };
10
10
  actions = new Map();
11
11
  /**
12
12
  * Define an override for a given action.
@@ -9,7 +9,7 @@ const runner_options_1 = require("../runner-options");
9
9
  * Auto approve pull requests that meet a criteria
10
10
  */
11
11
  class AutoApprove extends component_1.Component {
12
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.AutoApprove", version: "0.101.2" };
12
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.AutoApprove", version: "0.101.3" };
13
13
  label;
14
14
  constructor(github, options = {}) {
15
15
  super(github.project);
@@ -19,7 +19,7 @@ const component_1 = require("../component");
19
19
  * @see https://mergify.com/
20
20
  */
21
21
  class AutoMerge extends component_1.Component {
22
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.AutoMerge", version: "0.101.2" };
22
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.AutoMerge", version: "0.101.3" };
23
23
  lazyConditions = new Array();
24
24
  constructor(github, options = {}) {
25
25
  super(github.project);
@@ -54,7 +54,7 @@ var MergeMethod;
54
54
  * PRs will be merged once they pass required checks.
55
55
  */
56
56
  class AutoQueue extends component_1.Component {
57
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.AutoQueue", version: "0.101.2" };
57
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.AutoQueue", version: "0.101.3" };
58
58
  constructor(scope, options = {}) {
59
59
  super(scope);
60
60
  const workflowEngine = github_1.GitHub.of(this.project);
@@ -166,7 +166,7 @@ var VersioningStrategy;
166
166
  * on the lockfile itself will be proposed.
167
167
  */
168
168
  class Dependabot extends component_1.Component {
169
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.Dependabot", version: "0.101.2" };
169
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.Dependabot", version: "0.101.3" };
170
170
  /**
171
171
  * The raw dependabot configuration.
172
172
  * @see https://docs.github.com/en/github/administering-a-repository/configuration-options-for-dependency-updates
@@ -15,7 +15,7 @@ const runner_options_1 = require("../runner-options");
15
15
  * @see https://github.com/actions/dependency-review-action
16
16
  */
17
17
  class DependencyReview extends component_1.Component {
18
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.DependencyReview", version: "0.101.2" };
18
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.DependencyReview", version: "0.101.3" };
19
19
  constructor(github, options = {}) {
20
20
  super(github.project);
21
21
  const commentSummary = options.commentSummaryInPr ?? "always";
@@ -41,7 +41,7 @@ const Case = __importStar(require("case"));
41
41
  */
42
42
  class GithubCredentials {
43
43
  options;
44
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.GithubCredentials", version: "0.101.2" };
44
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.GithubCredentials", version: "0.101.3" };
45
45
  /**
46
46
  * Provide API access through a GitHub personal access token.
47
47
  *
@@ -21,7 +21,7 @@ const vscode_1 = require("../vscode");
21
21
  * "engines" can be used to implement our CI/CD solutions.
22
22
  */
23
23
  class GitHubProject extends project_1.Project {
24
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.GitHubProject", version: "0.101.2" };
24
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.GitHubProject", version: "0.101.3" };
25
25
  /**
26
26
  * Access all github components.
27
27
  *
@@ -15,7 +15,7 @@ const workflow_steps_1 = require("./workflow-steps");
15
15
  const workflows_1 = require("./workflows");
16
16
  const component_1 = require("../component");
17
17
  class GitHub extends component_1.Component {
18
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.GitHub", version: "0.101.2" };
18
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.GitHub", version: "0.101.3" };
19
19
  /**
20
20
  * Returns the `GitHub` component of a project or `undefined` if the project
21
21
  * does not have a GitHub component.
@@ -10,7 +10,7 @@ const github_1 = require("./github");
10
10
  */
11
11
  class MergeQueue extends component_1.Component {
12
12
  options;
13
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.MergeQueue", version: "0.101.2" };
13
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.MergeQueue", version: "0.101.3" };
14
14
  constructor(scope, options = {}) {
15
15
  super(scope);
16
16
  this.options = options;
@@ -6,7 +6,7 @@ const component_1 = require("../component");
6
6
  const util_1 = require("../util");
7
7
  const yaml_1 = require("../yaml");
8
8
  class Mergify extends component_1.Component {
9
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.Mergify", version: "0.101.2" };
9
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.Mergify", version: "0.101.3" };
10
10
  rules = new Array();
11
11
  queues = new Array();
12
12
  // The actual YAML file will only be created if at least 1 rule is added.
@@ -7,7 +7,7 @@ const textfile_1 = require("../textfile");
7
7
  * Template for GitHub pull requests.
8
8
  */
9
9
  class PullRequestTemplate extends textfile_1.TextFile {
10
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.PullRequestTemplate", version: "0.101.2" };
10
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.PullRequestTemplate", version: "0.101.3" };
11
11
  /**
12
12
  * Returns the `PullRequestTemplate` instance associated with a project or `undefined` if
13
13
  * there is no PullRequestTemplate.
@@ -9,7 +9,7 @@ const component_1 = require("../component");
9
9
  const json_1 = require("../json");
10
10
  const release_1 = require("../release");
11
11
  class PullRequestBackport extends component_1.Component {
12
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.PullRequestBackport", version: "0.101.2" };
12
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.PullRequestBackport", version: "0.101.3" };
13
13
  file;
14
14
  workflow;
15
15
  constructor(scope, options = {}) {
@@ -13,7 +13,7 @@ const runner_options_1 = require("../runner-options");
13
13
  class PullRequestLint extends component_1.Component {
14
14
  github;
15
15
  options;
16
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.PullRequestLint", version: "0.101.2" };
16
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.PullRequestLint", version: "0.101.3" };
17
17
  constructor(github, options = {}) {
18
18
  super(github.project);
19
19
  this.github = github;
@@ -18,7 +18,7 @@ const runner_options_1 = require("../runner-options");
18
18
  * @see https://github.com/actions/stale
19
19
  */
20
20
  class Stale extends component_1.Component {
21
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.Stale", version: "0.101.2" };
21
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.Stale", version: "0.101.3" };
22
22
  constructor(github, options = {}) {
23
23
  super(github.project);
24
24
  const stale = github.addWorkflow("stale");
@@ -13,7 +13,7 @@ const util_1 = require("./private/util");
13
13
  * @implements {Job}
14
14
  */
15
15
  class TaskWorkflowJob extends component_1.Component {
16
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.TaskWorkflowJob", version: "0.101.2" };
16
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.TaskWorkflowJob", version: "0.101.3" };
17
17
  runsOn;
18
18
  runsOnGroup;
19
19
  steps;
@@ -9,7 +9,7 @@ const DEFAULT_JOB_ID = "build";
9
9
  * A GitHub workflow for common build tasks within a project.
10
10
  */
11
11
  class TaskWorkflow extends workflows_1.GithubWorkflow {
12
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.TaskWorkflow", version: "0.101.2" };
12
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.TaskWorkflow", version: "0.101.3" };
13
13
  jobId;
14
14
  artifactsDirectory;
15
15
  constructor(github, options) {
@@ -15,7 +15,7 @@ const RUNNER_TEMP = "${{ runner.temp }}";
15
15
  * A set of utility functions for creating GitHub actions in workflows.
16
16
  */
17
17
  class WorkflowActions {
18
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.WorkflowActions", version: "0.101.2" };
18
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.WorkflowActions", version: "0.101.3" };
19
19
  /**
20
20
  * Creates a .patch file from the current git diff and uploads it as an
21
21
  * artifact. Use `checkoutWithPatch` to download and apply in another job.
@@ -10,7 +10,7 @@ const runner_options_1 = require("../runner-options");
10
10
  * A set of utility functions for creating jobs in GitHub Workflows.
11
11
  */
12
12
  class WorkflowJobs {
13
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.WorkflowJobs", version: "0.101.2" };
13
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.WorkflowJobs", version: "0.101.3" };
14
14
  /**
15
15
  * Creates a pull request with the changes of a patch file.
16
16
  *
@@ -25,7 +25,7 @@ var CheckoutSubmodules;
25
25
  * A collection of very commonly used, individual, GitHub Workflow Job steps.
26
26
  */
27
27
  class WorkflowSteps {
28
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.WorkflowSteps", version: "0.101.2" };
28
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.WorkflowSteps", version: "0.101.3" };
29
29
  /**
30
30
  * Checks out a repository.
31
31
  *
@@ -16,7 +16,7 @@ const yaml_1 = require("../yaml");
16
16
  * @see https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions
17
17
  */
18
18
  class GithubWorkflow extends component_1.Component {
19
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.GithubWorkflow", version: "0.101.2" };
19
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.GithubWorkflow", version: "0.101.3" };
20
20
  /**
21
21
  * The name of the workflow. GitHub displays the names of your workflows under your repository's
22
22
  * "Actions" tab.
@@ -45,7 +45,7 @@ const yaml_1 = require("../yaml");
45
45
  * @see https://docs.gitlab.com/ee/ci/yaml/
46
46
  */
47
47
  class CiConfiguration extends component_1.Component {
48
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.gitlab.CiConfiguration", version: "0.101.2" };
48
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.gitlab.CiConfiguration", version: "0.101.3" };
49
49
  /**
50
50
  * The name of the configuration.
51
51
  */
@@ -8,7 +8,7 @@ const nested_configuration_1 = require("./nested-configuration");
8
8
  * A GitLab CI for the main `.gitlab-ci.yml` file.
9
9
  */
10
10
  class GitlabConfiguration extends configuration_1.CiConfiguration {
11
- static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.gitlab.GitlabConfiguration", version: "0.101.2" };
11
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.gitlab.GitlabConfiguration", version: "0.101.3" };
12
12
  nestedTemplates = {};
13
13
  constructor(project, options) {
14
14
  super(project, "gitlab-ci", options);