@pipeline-builder/pipeline-manager 4.5.2 → 4.5.4

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 (74) hide show
  1. package/README.md +62 -37
  2. package/dist/agent/post-steps.d.ts +5 -4
  3. package/dist/agent/post-steps.d.ts.map +1 -1
  4. package/dist/agent/post-steps.js +19 -7
  5. package/dist/agent/targets.d.ts +12 -2
  6. package/dist/agent/targets.d.ts.map +1 -1
  7. package/dist/agent/targets.js +20 -4
  8. package/dist/cli.d.ts.map +1 -1
  9. package/dist/cli.js +16 -7
  10. package/dist/commands/audit-stacks.d.ts +42 -1
  11. package/dist/commands/audit-stacks.d.ts.map +1 -1
  12. package/dist/commands/audit-stacks.js +104 -23
  13. package/dist/commands/audit-tokens.d.ts.map +1 -1
  14. package/dist/commands/audit-tokens.js +3 -4
  15. package/dist/commands/create-pat.d.ts.map +1 -1
  16. package/dist/commands/create-pat.js +9 -6
  17. package/dist/commands/deploy.d.ts.map +1 -1
  18. package/dist/commands/deploy.js +15 -2
  19. package/dist/commands/login.d.ts +3 -2
  20. package/dist/commands/login.d.ts.map +1 -1
  21. package/dist/commands/login.js +19 -10
  22. package/dist/commands/logout.d.ts +24 -0
  23. package/dist/commands/logout.d.ts.map +1 -0
  24. package/dist/commands/logout.js +105 -0
  25. package/dist/commands/new-plugin.js +5 -5
  26. package/dist/commands/org-export.js +2 -2
  27. package/dist/commands/pipeline-remove.d.ts +26 -0
  28. package/dist/commands/pipeline-remove.d.ts.map +1 -0
  29. package/dist/commands/pipeline-remove.js +84 -0
  30. package/dist/commands/provision-steps.d.ts.map +1 -1
  31. package/dist/commands/provision-steps.js +1 -2
  32. package/dist/commands/provision.d.ts.map +1 -1
  33. package/dist/commands/provision.js +6 -5
  34. package/dist/commands/register.d.ts.map +1 -1
  35. package/dist/commands/register.js +3 -4
  36. package/dist/commands/status.d.ts +5 -2
  37. package/dist/commands/status.d.ts.map +1 -1
  38. package/dist/commands/status.js +65 -25
  39. package/dist/commands/toolchain.d.ts +21 -0
  40. package/dist/commands/toolchain.d.ts.map +1 -0
  41. package/dist/commands/toolchain.js +70 -0
  42. package/dist/commands/validate-templates.d.ts.map +1 -1
  43. package/dist/commands/validate-templates.js +4 -5
  44. package/dist/config/cli.constants.d.ts +8 -0
  45. package/dist/config/cli.constants.d.ts.map +1 -1
  46. package/dist/config/cli.constants.js +21 -2
  47. package/dist/types/plugin.d.ts +0 -6
  48. package/dist/types/plugin.d.ts.map +1 -1
  49. package/dist/types/plugin.js +1 -1
  50. package/dist/utils/command-utils.d.ts +13 -0
  51. package/dist/utils/command-utils.d.ts.map +1 -1
  52. package/dist/utils/command-utils.js +31 -17
  53. package/dist/utils/config-loader.d.ts +2 -1
  54. package/dist/utils/config-loader.d.ts.map +1 -1
  55. package/dist/utils/config-loader.js +14 -4
  56. package/dist/utils/credential-store.d.ts +9 -1
  57. package/dist/utils/credential-store.d.ts.map +1 -1
  58. package/dist/utils/credential-store.js +21 -2
  59. package/dist/utils/error-handler.d.ts +10 -1
  60. package/dist/utils/error-handler.d.ts.map +1 -1
  61. package/dist/utils/error-handler.js +20 -8
  62. package/dist/utils/pipeline-config.d.ts +5 -2
  63. package/dist/utils/pipeline-config.d.ts.map +1 -1
  64. package/dist/utils/pipeline-config.js +12 -3
  65. package/dist/utils/plugin-resolver.d.ts +21 -6
  66. package/dist/utils/plugin-resolver.d.ts.map +1 -1
  67. package/dist/utils/plugin-resolver.js +42 -9
  68. package/dist/utils/response-utils.d.ts +11 -0
  69. package/dist/utils/response-utils.d.ts.map +1 -1
  70. package/dist/utils/response-utils.js +23 -1
  71. package/dist/utils/toolchain.d.ts +78 -0
  72. package/dist/utils/toolchain.d.ts.map +1 -0
  73. package/dist/utils/toolchain.js +195 -0
  74. package/package.json +4 -4
@@ -136,25 +136,41 @@ export function isTargetId(value) {
136
136
  * in only when their post-install option is selected (see LOAD_STEPS).
137
137
  */
138
138
  export const COMMON_SPARSE_PATHS = ['deploy/bin'];
139
+ /**
140
+ * The managed toolchain release's build inputs: init-platform.sh always builds
141
+ * `build-plugin-images.sh --only pipeline-bootstrap,cdk-synth` (after the `_base`
142
+ * images), and `--build-bootstrap` runs `--only pipeline-bootstrap`, so every
143
+ * clone that runs either needs these folders — with or without `--with-plugins`.
144
+ * The release has its own source root, `deploy/toolchain` (both halves), beside
145
+ * the plugin catalog; of the catalog it needs only the `_base` images.
146
+ */
147
+ export const TOOLCHAIN_SPARSE_PATHS = [
148
+ 'deploy/plugins/_base',
149
+ 'deploy/toolchain',
150
+ ];
139
151
  /**
140
152
  * Opt-in post-install load steps. Each maps a provision `--with-*` flag to the
141
153
  * init-platform env var that enables it AND the repo folder(s) it reads — so the
142
154
  * sparse checkout grows exactly with the selected options.
143
155
  */
144
156
  export const LOAD_STEPS = [
145
- // The plugin build reads deploy/plugins/_base AND deploy/codebuild/bootstrap.
146
- { id: 'plugins', flag: 'withPlugins', env: 'LOAD_PLUGINS', paths: ['deploy/plugins', 'deploy/codebuild'] },
157
+ // The catalog. The toolchain release (deploy/toolchain) and the _base images it
158
+ // builds on are always in the clone (TOOLCHAIN_SPARSE_PATHS).
159
+ { id: 'plugins', flag: 'withPlugins', env: 'LOAD_PLUGINS', paths: ['deploy/plugins'] },
147
160
  { id: 'compliance', flag: 'withCompliance', env: 'LOAD_COMPLIANCE', paths: ['deploy/compliance'] },
148
161
  { id: 'samples', flag: 'withSamples', env: 'LOAD_TEMPLATES', paths: ['deploy/samples'] },
149
162
  ];
150
163
  /**
151
164
  * The de-duplicated set of sparse paths for a target plus the enabled load
152
- * steps: common base ∪ target folder(s) ∪ each enabled step's folder(s).
165
+ * steps: common base ∪ target folder(s) ∪ the toolchain build inputs ∪ each
166
+ * enabled step's folder(s).
153
167
  */
154
168
  export function sparsePathsFor(target, enabledLoadIds) {
155
169
  const paths = new Set(COMMON_SPARSE_PATHS);
156
170
  for (const p of TARGETS[target].sparsePaths)
157
171
  paths.add(p);
172
+ for (const p of TOOLCHAIN_SPARSE_PATHS)
173
+ paths.add(p);
158
174
  for (const step of LOAD_STEPS) {
159
175
  if (enabledLoadIds.includes(step.id))
160
176
  for (const p of step.paths)
@@ -262,4 +278,4 @@ export function teardownCommand(target, opts = {}) {
262
278
  }
263
279
  }
264
280
  }
265
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFyZ2V0cy5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FnZW50L3RhcmdldHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFzRHZELCtFQUErRTtBQUUvRSxNQUFNLE1BQU0sR0FBYyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsdURBQXVELEVBQUUsQ0FBQztBQUNsSSxNQUFNLFdBQVcsR0FBYyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSw2REFBNkQsRUFBRSxDQUFDO0FBQzNKLE1BQU0sVUFBVSxHQUFjLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxzRUFBc0UsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDMUssTUFBTSxNQUFNLEdBQWMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxDQUFDO0FBQ3ZGLE1BQU0sV0FBVyxHQUFjLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSw2REFBNkQsRUFBRSxDQUFDO0FBQ3RKLE1BQU0sUUFBUSxHQUFjLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxnRkFBZ0YsRUFBRSxDQUFDO0FBQ2hLLE1BQU0sYUFBYSxHQUFjLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSx3Q0FBd0MsRUFBRSxDQUFDO0FBQ3ZJLDRGQUE0RjtBQUM1RixrRkFBa0Y7QUFDbEYsTUFBTSxVQUFVLEdBQWMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLDRGQUE0RixFQUFFLENBQUM7QUFDbEwsaUZBQWlGO0FBQ2pGLE1BQU0sWUFBWSxHQUFjLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSw2Q0FBNkMsRUFBRSxDQUFDO0FBQ3pJLDZGQUE2RjtBQUM3RiwwRkFBMEY7QUFDMUYsOEZBQThGO0FBQzlGLCtGQUErRjtBQUMvRiw2RkFBNkY7QUFDN0YsZ0dBQWdHO0FBQ2hHLHVEQUF1RDtBQUN2RCxNQUFNLFNBQVMsR0FBYyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUseUZBQXlGLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO0FBQzNMLE1BQU0sWUFBWSxHQUFjLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxtRkFBbUYsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDN0wscUZBQXFGO0FBQ3JGLHVGQUF1RjtBQUN2RiwwRkFBMEY7QUFDMUYsTUFBTSxJQUFJLEdBQWMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLHFIQUFxSCxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUV6TSwwRUFBMEU7QUFDMUUsa0ZBQWtGO0FBQ2xGLG9CQUFvQjtBQUNwQixNQUFNLEtBQUssR0FBeUI7SUFDbEMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLHdEQUF3RCxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUU7SUFDckgsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLDBEQUEwRCxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUU7SUFDNUgsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLHlDQUF5QyxFQUFFO0lBQ2hHLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLGdDQUFnQyxFQUFFO0lBQ2hHLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSx3REFBd0QsRUFBRTtJQUNqSCxFQUFFLElBQUksRUFBRSx3QkFBd0IsRUFBRSxHQUFHLEVBQUUscUJBQXFCLEVBQUUsV0FBVyxFQUFFLHNEQUFzRCxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUU7Q0FDbkosQ0FBQztBQUVGLCtFQUErRTtBQUUvRSxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQTJDO0lBQzdELE1BQU0sRUFBRTtRQUNOLEVBQUUsRUFBRSxRQUFRO1FBQ1osS0FBSyxFQUFFLHdCQUF3QjtRQUMvQixHQUFHLEVBQUUscUJBQXFCO1FBQzFCLFVBQVUsRUFBRSxjQUFjO1FBQzFCLFdBQVcsRUFBRSxDQUFDLHFCQUFxQixDQUFDO1FBQ3BDLFFBQVEsRUFBRSxFQUFFO1FBQ1osUUFBUSxFQUFFLEVBQUU7UUFDWixVQUFVLEVBQUUsc0NBQXNDO1FBQ2xELElBQUksRUFBRSxNQUFNO1FBQ1osT0FBTyxFQUFFLGFBQWE7UUFDdEIsT0FBTyxFQUFFLDRTQUE0UztRQUNyVCxRQUFRLEVBQUUsb0hBQW9IO1FBQzlILHlFQUF5RTtRQUN6RSxTQUFTLEVBQUU7WUFDVCxFQUFFLE9BQU8sRUFBRSxnQ0FBZ0MsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO1lBQ3pELEVBQUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7WUFDaEQsRUFBRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRTtZQUNoRCxFQUFFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFO1lBQ3BELEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7WUFDMUMsRUFBRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRTtTQUNoRDtLQUNGO0lBQ0QsUUFBUSxFQUFFO1FBQ1IsRUFBRSxFQUFFLFVBQVU7UUFDZCxLQUFLLEVBQUUsNkJBQTZCO1FBQ3BDLEdBQUcsRUFBRSx1QkFBdUI7UUFDNUIsVUFBVSxFQUFFLGNBQWM7UUFDMUIsV0FBVyxFQUFFLENBQUMsdUJBQXVCLENBQUM7UUFDdEMsUUFBUSxFQUFFLEVBQUU7UUFDWixRQUFRLEVBQUUsRUFBRTtRQUNaLFVBQVUsRUFBRSx3Q0FBd0M7UUFDcEQsSUFBSSxFQUFFLE1BQU07UUFDWixPQUFPLEVBQUUsa0JBQWtCO1FBQzNCLE9BQU8sRUFBRSx3UEFBd1A7UUFDalEsUUFBUSxFQUFFLDhGQUE4RjtRQUN4RyxtRkFBbUY7UUFDbkYsU0FBUyxFQUFFO1lBQ1QsRUFBRSxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRTtZQUN6RCxFQUFFLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFO1lBQ25ELEVBQUUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLElBQUksRUFBRSxJQUFJLEVBQUU7U0FDakQ7S0FDRjtJQUNELEdBQUcsRUFBRTtRQUNILEVBQUUsRUFBRSxLQUFLO1FBQ1QsS0FBSyxFQUFFLGtEQUFrRDtRQUN6RCxHQUFHLEVBQUUsZ0JBQWdCO1FBQ3JCLFVBQVUsRUFBRSxjQUFjO1FBQzFCLFdBQVcsRUFBRSxDQUFDLGdCQUFnQixDQUFDO1FBQy9CLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsV0FBVyxDQUFDO1FBQ3pDLFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUM7UUFDL0csVUFBVSxFQUFFLDZHQUE2RztRQUN6SCxJQUFJLEVBQUUsY0FBYztRQUNwQixPQUFPLEVBQUUsZUFBZTtRQUN4QixPQUFPLEVBQUUsd09BQXdPO1FBQ2pQLFFBQVEsRUFBRSxzSUFBc0k7UUFDaEosU0FBUyxFQUFFLEVBQUUsRUFBRSx5REFBeUQ7S0FDekU7SUFDRCxHQUFHLEVBQUU7UUFDSCxFQUFFLEVBQUUsS0FBSztRQUNULEtBQUssRUFBRSx3Q0FBd0M7UUFDL0MsR0FBRyxFQUFFLGdCQUFnQjtRQUNyQixVQUFVLEVBQUUsY0FBYztRQUMxQixXQUFXLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztRQUMvQixRQUFRLEVBQUUsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDO1FBQy9CLFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEdBQUcsS0FBSyxDQUFDO1FBQzVGLFVBQVUsRUFBRSxvSEFBb0g7UUFDaEksSUFBSSxFQUFFLGNBQWM7UUFDcEIsT0FBTyxFQUFFLFlBQVk7UUFDckIsT0FBTyxFQUFFLHlWQUF5VjtRQUNsVyxRQUFRLEVBQUUsa1BBQWtQO1FBQzVQLFNBQVMsRUFBRSxFQUFFLEVBQUUseURBQXlEO0tBQ3pFO0NBQ0YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBd0IsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUVwRixNQUFNLFVBQVUsVUFBVSxDQUFDLEtBQWM7SUFDdkMsT0FBTyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUssVUFBZ0MsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEYsQ0FBQztBQUVELCtFQUErRTtBQUUvRTs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFzQixDQUFDLFlBQVksQ0FBQyxDQUFDO0FBRXJFOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUc7SUFDeEIsOEVBQThFO0lBQzlFLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUMsRUFBRTtJQUMxRyxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsRUFBRSxpQkFBaUIsRUFBRSxLQUFLLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO0lBQ2xHLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO0NBQ2hGLENBQUM7QUFJWDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLE1BQWdCLEVBQUUsY0FBaUM7SUFDaEYsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQVMsbUJBQW1CLENBQUMsQ0FBQztJQUNuRCxLQUFLLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXO1FBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRCxLQUFLLE1BQU0sSUFBSSxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQzlCLElBQUksY0FBYyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQUUsS0FBSyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSztnQkFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFDRCxPQUFPLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQztBQUNwQixDQUFDO0FBU0Q7Ozs7R0FJRztBQUNILFNBQVMsZUFBZSxDQUFDLEtBQWE7SUFDcEMsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUMxRCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsTUFBa0IsRUFDbEIsTUFBK0IsRUFDL0IsSUFBSSxHQUF1QixFQUFFO0lBRTdCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDO0lBQy9CLE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBZSxFQUFXLEVBQUU7UUFDNUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQixPQUFPLENBQUMsS0FBSyxTQUFTLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDO0lBQ3BELENBQUMsQ0FBQztJQUVGLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRWxFLE1BQU0sS0FBSyxHQUFhLENBQUMsTUFBTSxNQUFNLENBQUMsR0FBRyxZQUFZLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxRQUFRLEVBQUUsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUM1RCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztZQUFFLFNBQVM7UUFDOUIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzdCLFNBQVM7UUFDWCxDQUFDO1FBQ0QsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNyQyx3RUFBd0U7UUFDeEUsMkVBQTJFO1FBQzNFLDJFQUEyRTtRQUMzRSx3RUFBd0U7UUFDeEUsZUFBZSxDQUFDLEdBQUcsRUFBRSxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUNyRSwwRUFBMEU7UUFDMUUsNkVBQTZFO1FBQzdFLG9FQUFvRTtRQUNwRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakUsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQ3JELENBQUM7QUFTRCw4REFBOEQ7QUFDOUQsTUFBTSxpQkFBaUIsR0FBRyxrQkFBa0IsQ0FBQztBQUM3QywyQ0FBMkM7QUFDM0MsTUFBTSxtQkFBbUIsR0FBRyxrQkFBa0IsQ0FBQztBQUUvQzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsTUFBZ0IsRUFDaEIsSUFBSSxHQUErSCxFQUFFO0lBRXJJLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3QywrRUFBK0U7SUFDL0Usc0RBQXNEO0lBQ3RELGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbEMsSUFBSSxJQUFJLENBQUMsU0FBUztRQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ2xFLElBQUksSUFBSSxDQUFDLFdBQVc7UUFBRSxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUN4RSxJQUFJLElBQUksQ0FBQyxNQUFNO1FBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDeEQsSUFBSSxJQUFJLENBQUMsWUFBWTtRQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDNUUsUUFBUSxNQUFNLEVBQUUsQ0FBQztRQUNmLEtBQUssUUFBUTtZQUNYLE9BQU8sRUFBRSxPQUFPLEVBQUUsZ0RBQWdELEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQzNGLEtBQUssVUFBVTtZQUNiLE9BQU8sRUFBRSxPQUFPLEVBQUUsa0RBQWtELEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQzdGLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDWCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLGlCQUFpQixDQUFDO1lBQ2xELE9BQU87Z0JBQ0wsT0FBTyxFQUNMLGdEQUFnRCxLQUFLLGFBQWEsTUFBTSxNQUFNO29CQUM5RSw4REFBOEQsS0FBSyxhQUFhLE1BQU0sRUFBRTtnQkFDMUYsV0FBVyxFQUFFLElBQUk7YUFDbEIsQ0FBQztRQUNKLENBQUM7UUFDRCxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQ1gsZ0ZBQWdGO1lBQ2hGLCtFQUErRTtZQUMvRSw2RUFBNkU7WUFDN0UseUVBQXlFO1lBQ3pFLHVCQUF1QjtZQUN2QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxJQUFJLG1CQUFtQixDQUFDO1lBQ3hELElBQUksT0FBTyxHQUFHLDREQUE0RCxPQUFPLGFBQWEsTUFBTSxFQUFFLENBQUM7WUFDdkcsSUFBSSxJQUFJLENBQUMsTUFBTTtnQkFBRSxPQUFPLElBQUksYUFBYSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDdkQsSUFBSSxJQUFJLENBQUMsWUFBWTtnQkFBRSxPQUFPLElBQUkscUJBQXFCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUMzRSxJQUFJLElBQUksQ0FBQyxTQUFTO2dCQUFFLE9BQU8sSUFBSSxRQUFRLENBQUM7WUFDeEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDeEMsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbi8qKlxuICogRGV0ZXJtaW5pc3RpYyByZWdpc3RyeSBvZiBwbGF0Zm9ybSBkZXBsb3kgdGFyZ2V0cyDigJQgdGhlIHNvdXJjZSBvZiB0cnV0aCB0aGVcbiAqIGBwcm92aXNpb25gIGFkdmlzb3IgdXNlcyB0byBhc3NlbWJsZSB0aGUgRVhBQ1QgZGVwbG95IGNvbW1hbmQuIFRoZSBhZ2VudCBpcyBhXG4gKiB0aGluIHdyYXBwZXIgb3ZlciB0aGUgZXhpc3RpbmcgZGVwbG95IHNjcmlwdHM7IGl0IG5ldmVyIHJlaW1wbGVtZW50c1xuICogZGVwbG95bWVudCwgb25seSB2YWxpZGF0ZXMgaW5wdXRzIGFuZCBhc3NlbWJsZXMgdGhlIGNvbW1hbmQgdG8gcnVuLlxuICpcbiAqIEtlZXAgdGhpcyBpbiBsb2NrLXN0ZXAgd2l0aCB0aGUgZmxhZ3MgdGhlIHNjcmlwdHMgYWNjZXB0IOKAlCBldmVyeSB0YXJnZXQnc1xuICogb3BlcmF0b3IgZW50cnlwb2ludCBpcyBgYmluL3NldHVwLnNoYCAoZGVwbG95Lzx0YXJnZXQ+L2Jpbi9zZXR1cC5zaCkuXG4gKi9cblxuaW1wb3J0IHsgYXNzZXJ0U2hlbGxTYWZlLCBzaGVsbFF1b3RlIH0gZnJvbSAnLi4vY29uZmlnL2NsaS5jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgcmVzb2x2ZUF3c1JlZ2lvbiB9IGZyb20gJy4uL3V0aWxzL2F3cy1lbnYuanMnO1xuXG5leHBvcnQgdHlwZSBUYXJnZXRJZCA9ICdkb2NrZXInIHwgJ21pbmlrdWJlJyB8ICdlYzInIHwgJ2Vrcyc7XG5cbi8qKiBBIHNpbmdsZSBpbnB1dCB0aGUgdW5kZXJseWluZyBkZXBsb3kgc2NyaXB0IGFjY2VwdHMuICovXG5leHBvcnQgaW50ZXJmYWNlIElucHV0U3BlYyB7XG4gIC8qKiBGbGFnIG5hbWUgcGFzc2VkIHRvIHRoZSBzY3JpcHQgKHdpdGhvdXQgdGhlIGxlYWRpbmcgYC0tYCkuICovXG4gIHJlYWRvbmx5IGZsYWc6IHN0cmluZztcbiAgLyoqIEtleSBvbiB0aGUgcHJvdmlzaW9uIHBhcmFtcyBvYmplY3QuICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuICAvKiogSHVtYW4gZGVzY3JpcHRpb24g4oCUIHNob3duIHdoZW4gYSByZXF1aXJlZCBpbnB1dCBpcyBtaXNzaW5nLiAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAvKiogU2VjcmV0IOKAlCBuZXZlciBwcmludGVkIGluIHRoZSBhc3NlbWJsZWQgY29tbWFuZCAobWFza2VkIGFzIGAqKipgKS4gKi9cbiAgcmVhZG9ubHkgc2VjcmV0PzogYm9vbGVhbjtcbiAgLyoqIEJvb2xlYW4gZmxhZyB3aXRoIG5vIHZhbHVlIChlLmcuIGAtLWVtYWlsYCkuICovXG4gIHJlYWRvbmx5IGJvb2xlYW4/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhcmdldFNwZWMge1xuICByZWFkb25seSBpZDogVGFyZ2V0SWQ7XG4gIHJlYWRvbmx5IGxhYmVsOiBzdHJpbmc7XG4gIC8qKiBEaXJlY3RvcnkgdGhlIGVudHJ5cG9pbnQgcnVucyBmcm9tIChyZWxhdGl2ZSB0byByZXBvIHJvb3QpLiAqL1xuICByZWFkb25seSBkaXI6IHN0cmluZztcbiAgLyoqIEVudHJ5cG9pbnQgc2NyaXB0IChyZWxhdGl2ZSB0byBgZGlyYCkuICovXG4gIHJlYWRvbmx5IGVudHJ5cG9pbnQ6IHN0cmluZztcbiAgLyoqIElucHV0cyB0aGUgc2NyaXB0IFJFUVVJUkVTIOKAlCB0aGUgYWR2aXNvciByZXBvcnRzIGFueSB0aGF0IGFyZSBtaXNzaW5nLiAqL1xuICByZWFkb25seSByZXF1aXJlZDogcmVhZG9ubHkgSW5wdXRTcGVjW107XG4gIC8qKiBPcHRpb25hbCBpbnB1dHMsIHBhc3NlZCB0aHJvdWdoIG9ubHkgd2hlbiBwcm92aWRlZC4gKi9cbiAgcmVhZG9ubHkgb3B0aW9uYWw6IHJlYWRvbmx5IElucHV0U3BlY1tdO1xuICAvKipcbiAgICogUmVwbyBmb2xkZXIocykgdGhpcyB0YXJnZXQncyBkZXBsb3kgbmVlZHMsIGZvciBhIHNwYXJzZSBgLS1yZXBvYCBib290c3RyYXAuXG4gICAqIENvbWJpbmVkIHdpdGggQ09NTU9OX1NQQVJTRV9QQVRIUyBhbmQgYW55IHNlbGVjdGVkIGxvYWQgc3RlcHMnIHBhdGhzLlxuICAgKi9cbiAgcmVhZG9ubHkgc3BhcnNlUGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKiogUG9zdC1kZXBsb3kgc3RlcCB0byBzdXJmYWNlIChyZWdpc3RlcnMgYWRtaW4gKyBsb2FkcyBwbHVnaW5zKS4gKi9cbiAgcmVhZG9ubHkgcG9zdERlcGxveT86IHN0cmluZztcbiAgLyoqIFJvdWdoIG1vbnRobHkgY29zdCAoZnJvbSBkb2NzKS4gKi9cbiAgcmVhZG9ubHkgY29zdDogc3RyaW5nO1xuICAvKiogT25lLWxpbmUgXCJiZXN0IGZvclwiLiAqL1xuICByZWFkb25seSBiZXN0Rm9yOiBzdHJpbmc7XG4gIC8qKiBXaGF0IHRoZSBkZXBsb3kgY3JlYXRlcyDigJQgc2hvd24gd2hlbiBkZXBsb3lpbmcgc28gXCJEZXBsb3lpbmdcIiBpc24ndCBvcGFxdWUuICovXG4gIHJlYWRvbmx5IGRlcGxveXM6IHN0cmluZztcbiAgLyoqIFdoYXQgYSB0ZWFyZG93biBvZiB0aGlzIHRhcmdldCBkZXN0cm95cyDigJQgc2hvd24gYmVmb3JlIGEgKGdhdGVkKSB0ZWFyZG93bi4gKi9cbiAgcmVhZG9ubHkgZGVzdHJveXM6IHN0cmluZztcbiAgLyoqXG4gICAqIEhvc3QgcG9ydHMgdGhlIGRlcGxveSBiaW5kcyDigJQgYSBGQUxMQkFDSyBvbmx5LiBUaGUgbGl2ZSBsaXN0IGlzIERFUklWRUQgZnJvbSB0aGVcbiAgICogY2xvbmVkIGRlcGxveSBzb3VyY2UgYXQgcnVudGltZSAocG9ydHMudHMgYGRpc2NvdmVySG9zdFBvcnRzYCk6IGxvY2FsIGZyb21cbiAgICogZG9ja2VyLWNvbXBvc2UueW1sJ3MgcHVibGlzaGVkIHBvcnRzLCBtaW5pa3ViZSBmcm9tIHNldHVwLnNoJ3MgcG9ydC1mb3J3YXJkcy4gVGhpc1xuICAgKiBzdGF0aWMgY29weSBpcyB1c2VkIG9ubHkgd2hlbiB0aGF0IHNvdXJjZSBjYW4ndCBiZSByZWFkLiBFbXB0eSBmb3IgcmVtb3RlIHRhcmdldHNcbiAgICogKGVjMi9la3MgYmluZCBub3RoaW5nIG9uIHRoZSBvcGVyYXRvcidzIG1hY2hpbmUpLlxuICAgKi9cbiAgcmVhZG9ubHkgaG9zdFBvcnRzOiByZWFkb25seSB7IHNlcnZpY2U6IHN0cmluZzsgcG9ydDogbnVtYmVyIH1bXTtcbn1cblxuLy8gLS0tIFNoYXJlZCBpbnB1dCBzcGVjcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBET01BSU46IElucHV0U3BlYyA9IHsgZmxhZzogJ2RvbWFpbicsIGtleTogJ2RvbWFpbicsIGRlc2NyaXB0aW9uOiAnRnVsbHktcXVhbGlmaWVkIGRvbWFpbiBuYW1lIChBTEIgQUNNIGNlcnQgKyBTRVMgREtJTSknIH07XG5jb25zdCBIT1NURURfWk9ORTogSW5wdXRTcGVjID0geyBmbGFnOiAnaG9zdGVkLXpvbmUtaWQnLCBrZXk6ICdob3N0ZWRab25lSWQnLCBkZXNjcmlwdGlvbjogJ1B1YmxpYyBSb3V0ZSA1MyBob3N0ZWQgem9uZSBJRCBhdXRob3JpdGF0aXZlIGZvciB0aGUgZG9tYWluJyB9O1xuY29uc3QgR0hDUl9UT0tFTjogSW5wdXRTcGVjID0geyBmbGFnOiAnZ2hjci10b2tlbicsIGtleTogJ2doY3JUb2tlbicsIGRlc2NyaXB0aW9uOiAnR2l0SHViIFBBVCB3aXRoIHJlYWQ6cGFja2FnZXMgKGF2b2lkcyBnaGNyLmlvIGFub255bW91cyByYXRlIGxpbWl0cyknLCBzZWNyZXQ6IHRydWUgfTtcbmNvbnN0IFJFR0lPTjogSW5wdXRTcGVjID0geyBmbGFnOiAncmVnaW9uJywga2V5OiAncmVnaW9uJywgZGVzY3JpcHRpb246ICdBV1MgcmVnaW9uJyB9O1xuY29uc3QgREVQTE9ZX01PREU6IElucHV0U3BlYyA9IHsgZmxhZzogJ2RlcGxveS1tb2RlJywga2V5OiAnZGVwbG95TW9kZScsIGRlc2NyaXB0aW9uOiAncHVibGljIChpbnRlcm5ldC1mYWNpbmcgQUxCKSBvciBwcml2YXRlIChpbnRlcm5hbCwgZGVmYXVsdCknIH07XG5jb25zdCBLRVlfUEFJUjogSW5wdXRTcGVjID0geyBmbGFnOiAna2V5LXBhaXInLCBrZXk6ICdrZXlQYWlyJywgZGVzY3JpcHRpb246ICdFQzIga2V5IHBhaXIgaW4gdGhlIHJlZ2lvbiAoYnJlYWstZ2xhc3Mgc2VyaWFsIGNvbnNvbGU7IHJvdXRpbmUgYWNjZXNzIGlzIFNTTSknIH07XG5jb25zdCBJTlNUQU5DRV9UWVBFOiBJbnB1dFNwZWMgPSB7IGZsYWc6ICdpbnN0YW5jZS10eXBlJywga2V5OiAnaW5zdGFuY2VUeXBlJywgZGVzY3JpcHRpb246ICdFQzIgaW5zdGFuY2UgdHlwZSAoZGVmYXVsdCB0My4yeGxhcmdlKScgfTtcbi8vIGVjMiBkZXBsb3kvdGVhcmRvd24gc3RhY2sgbmFtZSAoQ2xvdWRGb3JtYXRpb24pLiBUaGUgYHN0YWNrTmFtZWAgcGFyYW0ga2V5IGlzIGFsc28gcmV1c2VkXG4vLyBieSB0aGUgdGVhcmRvd24gcGF0aCBhcyB0aGUgcmVzb3VyY2UgaWRlbnRpZmllciAoZWMyIHN0YWNrIC8gZWtzIGNsdXN0ZXIgbmFtZSkuXG5jb25zdCBTVEFDS19OQU1FOiBJbnB1dFNwZWMgPSB7IGZsYWc6ICdzdGFjay1uYW1lJywga2V5OiAnc3RhY2tOYW1lJywgZGVzY3JpcHRpb246ICdDbG91ZEZvcm1hdGlvbiBzdGFjayBuYW1lIChkZWZhdWx0IHBpcGVsaW5lLWJ1aWxkZXIpIOKAlCBzZXQgdG8gcnVuIGEgc2Vjb25kIGVjMiBlbnZpcm9ubWVudCcgfTtcbi8vIGVrcyBjbHVzdGVyIG5hbWUgKGVrc2N0bCkuIFNldCB0byBydW4gYSBzZWNvbmQgRUtTIGVudmlyb25tZW50IGluIG9uZSBhY2NvdW50LlxuY29uc3QgQ0xVU1RFUl9OQU1FOiBJbnB1dFNwZWMgPSB7IGZsYWc6ICdjbHVzdGVyLW5hbWUnLCBrZXk6ICdjbHVzdGVyTmFtZScsIGRlc2NyaXB0aW9uOiAnRUtTIGNsdXN0ZXIgbmFtZSAoZGVmYXVsdCBwaXBlbGluZS1idWlsZGVyKScgfTtcbi8vIEF1dG8taW5pdCBpcyBPTiBCWSBERUZBVUxUIG9uIHRoZSBBV1MgdGFyZ2V0cyAoZWMyICsgZWtzIHNldHVwLnNoIGRlZmF1bHQgQVVUT19JTklUPXRydWUpLFxuLy8gc28gYC0tbm8tYXV0by1pbml0YCBpcyB0aGUgbG9hZC1iZWFyaW5nIG9wdC1vdXQgYW5kIGAtLWF1dG8taW5pdGAgaXMgYSBuby1vcCByZWFmZmlybSDigJRcbi8vIG1pcnJvcnMgLS1lbWFpbC8tLW5vLWVtYWlsLiBlYzIgc2VsZi1pbml0cyBvbiB0aGUgaW5zdGFuY2Ugb24gZmlyc3QgYm9vdDsgZWtzIHNlbGYtaW5pdHMgaW5cbi8vIHNldHVwLnNoJ3MgZmluYWwgcGhhc2UgKG92ZXIgYSBrdWJlY3RsIHBvcnQtZm9yd2FyZCkuIG1pbmlrdWJlL2xvY2FsIHJ1biBpbml0IHZpYSBwcm92aXNpb24uXG4vLyBOT1RFOiBgLS1uby1hdXRvLWluaXRgJ3Mga2V5IChub0F1dG9Jbml0KSBpcyBOT1QgZGVyaXZhYmxlIGZyb20gaXRzIGZsYWcgdGhlIHdheSB0aGUgb3RoZXJcbi8vIHNwZWNzJyBrZXlzIGFyZSAoY29tbWFuZGVyIGZvbGRzIC0teC8tLW5vLXggaW50byBhIHNpbmdsZSBgeGAgb3B0aW9uKTsgcHJvdmlzaW9uLnRzIGFzc2VtYmxlc1xuLy8gYm90aCBrZXlzIGV4cGxpY2l0bHkg4oCUIHNlZSB0aGUgcGFyYW0tYXNzZW1ibHkgdGhlcmUuXG5jb25zdCBBVVRPX0lOSVQ6IElucHV0U3BlYyA9IHsgZmxhZzogJ2F1dG8taW5pdCcsIGtleTogJ2F1dG9Jbml0JywgZGVzY3JpcHRpb246ICdlYzIvZWtzOiB0aGUgZGVwbG95IHNlbGYtcnVucyBpbml0LXBsYXRmb3JtIChyZWdpc3RlciArIGFsbCBsb2Fkcykg4oCUIHRoZSBERUZBVUxUIG9uIEFXUycsIGJvb2xlYW46IHRydWUgfTtcbmNvbnN0IE5PX0FVVE9fSU5JVDogSW5wdXRTcGVjID0geyBmbGFnOiAnbm8tYXV0by1pbml0Jywga2V5OiAnbm9BdXRvSW5pdCcsIGRlc2NyaXB0aW9uOiAnZWMyL2Vrczogc2tpcCB0aGUgZGVwbG95LW1hbmFnZWQgYXV0by1pbml0IGFuZCBydW4gaW5pdC1wbGF0Zm9ybSBtYW51YWxseSBpbnN0ZWFkJywgYm9vbGVhbjogdHJ1ZSB9O1xuLy8gZWMyIG9ubHk6IExFQU4gZHJvcHMgdGhlIG9wdGlvbmFsIG9ic2VydmFiaWxpdHkvYWRtaW4gc2VydmljZXMgc28gdGhlIGNvcmUgc3RhY2sgK1xuLy8gbWVzaCBmaXRzIGEgdDMueGxhcmdlIGluc3RlYWQgb2YgdDMuMnhsYXJnZS4gRmxvd3MgdGhyb3VnaCB0aGUgQ0ZOIGBMZWFuYCBwYXJhbSBpbnRvXG4vLyB0aGUgaW5zdGFuY2UncyBzdGFydHVwLnNoLiAobWluaWt1YmUgcmVhZHMgTEVBTiBhcyBhbiBlbnYgdmFyOyBla3MgZG9lc24ndCBzdXBwb3J0IGl0LilcbmNvbnN0IExFQU46IElucHV0U3BlYyA9IHsgZmxhZzogJ2xlYW4nLCBrZXk6ICdsZWFuJywgZGVzY3JpcHRpb246ICdlYzI6IHRyaW0gb3B0aW9uYWwgb2JzZXJ2YWJpbGl0eS9hZG1pbiBzZXJ2aWNlcyBzbyB0aGUgc3RhY2sgZml0cyBhIHQzLnhsYXJnZSAocGFpciB3aXRoIC0taW5zdGFuY2UtdHlwZSB0My54bGFyZ2UpJywgYm9vbGVhbjogdHJ1ZSB9O1xuXG4vLyBTRVMgLyBlbWFpbCBmYW1pbHkg4oCUIHNoYXJlZCBieSBlYzIgKyBla3MuIFNFUyBpcyBwcm92aXNpb25lZCBCWSBERUZBVUxUXG4vLyBvbiBBV1MgZGVwbG95czsgYC0tbm8tZW1haWxgIGlzIHRoZSBvcHQtb3V0IChgLS1lbWFpbGAgaXMgYSBoYXJtbGVzcyBuby1vcCBrZXB0XG4vLyBmb3IgYmFjay1jb21wYXQpLlxuY29uc3QgRU1BSUw6IHJlYWRvbmx5IElucHV0U3BlY1tdID0gW1xuICB7IGZsYWc6ICdlbWFpbCcsIGtleTogJ2VtYWlsJywgZGVzY3JpcHRpb246ICdFbmFibGUgU0VTIHRyYW5zYWN0aW9uYWwgZW1haWwgKG9uIGJ5IGRlZmF1bHQgZm9yIEFXUyknLCBib29sZWFuOiB0cnVlIH0sXG4gIHsgZmxhZzogJ25vLWVtYWlsJywga2V5OiAnbm9FbWFpbCcsIGRlc2NyaXB0aW9uOiAnU2tpcCBTRVMgKHRyYW5zYWN0aW9uYWwgZW1haWwgaXMgcHJvdmlzaW9uZWQgYnkgZGVmYXVsdCknLCBib29sZWFuOiB0cnVlIH0sXG4gIHsgZmxhZzogJ2VtYWlsLWZyb20nLCBrZXk6ICdlbWFpbEZyb20nLCBkZXNjcmlwdGlvbjogJ0Zyb20gYWRkcmVzcyAoZGVmYXVsdCBub3JlcGx5QDxkb21haW4+KScgfSxcbiAgeyBmbGFnOiAnZW1haWwtZnJvbS1uYW1lJywga2V5OiAnZW1haWxGcm9tTmFtZScsIGRlc2NyaXB0aW9uOiAnRGlzcGxheSBuYW1lIG9uIG91dGJvdW5kIGVtYWlsJyB9LFxuICB7IGZsYWc6ICdhbGVydC1lbWFpbCcsIGtleTogJ2FsZXJ0RW1haWwnLCBkZXNjcmlwdGlvbjogJ1N1YnNjcmliZSBhbiBhZGRyZXNzIHRvIHRoZSBib3VuY2UvY29tcGxhaW50IFNOUyB0b3BpYycgfSxcbiAgeyBmbGFnOiAnbm8tY3JlYXRlLXNlcy1pZGVudGl0eScsIGtleTogJ25vQ3JlYXRlU2VzSWRlbnRpdHknLCBkZXNjcmlwdGlvbjogJ1NraXAgU0VTIGlkZW50aXR5IGNyZWF0aW9uIChkb21haW4gYWxyZWFkeSB2ZXJpZmllZCknLCBib29sZWFuOiB0cnVlIH0sXG5dO1xuXG4vLyAtLS0gVGFyZ2V0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCBjb25zdCBUQVJHRVRTOiBSZWFkb25seTxSZWNvcmQ8VGFyZ2V0SWQsIFRhcmdldFNwZWM+PiA9IHtcbiAgZG9ja2VyOiB7XG4gICAgaWQ6ICdkb2NrZXInLFxuICAgIGxhYmVsOiAnTG9jYWwgKERvY2tlciBDb21wb3NlKScsXG4gICAgZGlyOiAnZGVwbG95L2xvY2FsL2RvY2tlcicsXG4gICAgZW50cnlwb2ludDogJ2Jpbi9zZXR1cC5zaCcsXG4gICAgc3BhcnNlUGF0aHM6IFsnZGVwbG95L2xvY2FsL2RvY2tlciddLFxuICAgIHJlcXVpcmVkOiBbXSxcbiAgICBvcHRpb25hbDogW10sXG4gICAgcG9zdERlcGxveTogJy4vZGVwbG95L2Jpbi9pbml0LXBsYXRmb3JtLnNoIGRvY2tlcicsXG4gICAgY29zdDogJ0ZyZWUnLFxuICAgIGJlc3RGb3I6ICdEZXZlbG9wbWVudCcsXG4gICAgZGVwbG95czogJ3RoZSBwbGF0Zm9ybSBhcyBhIERvY2tlciBDb21wb3NlIHN0YWNrIOKAlCBhbiBuZ2lueCBUTFMgcHJveHksIHRoZSBBUEkgc2VydmljZXMgKHBsYXRmb3JtLCBwbHVnaW4sIHBpcGVsaW5lLCBtZXNzYWdlLCByZXBvcnRpbmcsIGNvbXBsaWFuY2UsIHF1b3RhLCBiaWxsaW5nLCBpbWFnZS1yZWdpc3RyeSksIHRoZSBmcm9udGVuZCwgYW5kIHBvc3RncmVzICsgbW9uZ28gKyByZWRpcy4gRmlyc3QgcnVuIHB1bGxzIHRoZSBnaGNyLmlvIGltYWdlcyBhbmQgZ2VuZXJhdGVzIGEgbG9jYWwgVExTIGNlcnQgKGEgZmV3IG1pbnV0ZXMpLicsXG4gICAgZGVzdHJveXM6ICdzdG9wcyBhbGwgY29udGFpbmVycyDigJQgZGF0YSB1bmRlciBkZXBsb3kvbG9jYWwvZG9ja2VyL2RhdGEgcGVyc2lzdHMgb24gZGlzayAoZGVsZXRlIGl0IG1hbnVhbGx5IGZvciBhIGNsZWFuIHNsYXRlKScsXG4gICAgLy8gTWlycm9ycyB0aGUgcHVibGlzaGVkIHBvcnRzIGluIGRlcGxveS9sb2NhbC9kb2NrZXIvZG9ja2VyLWNvbXBvc2UueW1sLlxuICAgIGhvc3RQb3J0czogW1xuICAgICAgeyBzZXJ2aWNlOiAnbmdpbngg4oCUIEhUVFBTIGdhdGV3YXkgKFVJL0FQSSknLCBwb3J0OiA4NDQzIH0sXG4gICAgICB7IHNlcnZpY2U6ICduZ2lueCDigJQgSFRUUCByZWRpcmVjdCcsIHBvcnQ6IDgwODAgfSxcbiAgICAgIHsgc2VydmljZTogJ3BnQWRtaW4gKFBvc3RncmVzIFVJKScsIHBvcnQ6IDU0ODAgfSxcbiAgICAgIHsgc2VydmljZTogJ01vbmdvIEV4cHJlc3MgKE1vbmdvIFVJKScsIHBvcnQ6IDI3MDgxIH0sXG4gICAgICB7IHNlcnZpY2U6ICdEb2NrZXIgcmVnaXN0cnknLCBwb3J0OiA1MDAwIH0sXG4gICAgICB7IHNlcnZpY2U6ICdKYWVnZXIgKHRyYWNpbmcgVUkpJywgcG9ydDogMTY2ODYgfSxcbiAgICBdLFxuICB9LFxuICBtaW5pa3ViZToge1xuICAgIGlkOiAnbWluaWt1YmUnLFxuICAgIGxhYmVsOiAnTWluaWt1YmUgKGxvY2FsIEt1YmVybmV0ZXMpJyxcbiAgICBkaXI6ICdkZXBsb3kvbG9jYWwvbWluaWt1YmUnLFxuICAgIGVudHJ5cG9pbnQ6ICdiaW4vc2V0dXAuc2gnLFxuICAgIHNwYXJzZVBhdGhzOiBbJ2RlcGxveS9sb2NhbC9taW5pa3ViZSddLFxuICAgIHJlcXVpcmVkOiBbXSxcbiAgICBvcHRpb25hbDogW10sXG4gICAgcG9zdERlcGxveTogJy4vZGVwbG95L2Jpbi9pbml0LXBsYXRmb3JtLnNoIG1pbmlrdWJlJyxcbiAgICBjb3N0OiAnRnJlZScsXG4gICAgYmVzdEZvcjogJ0xvY2FsIEt1YmVybmV0ZXMnLFxuICAgIGRlcGxveXM6ICd0aGUgcGxhdGZvcm0gb250byBhIGxvY2FsIE1pbmlrdWJlIGNsdXN0ZXIg4oCUIHRoZSBzYW1lIHNlcnZpY2VzIGFzIEt1YmVybmV0ZXMgRGVwbG95bWVudHMvU2VydmljZXMgYmVoaW5kIGFuIGluZ3Jlc3MsIHBsdXMgaW4tY2x1c3RlciBwb3N0Z3JlcyArIG1vbmdvICsgcmVkaXMuIEZpcnN0IHJ1biBwdWxscyBpbWFnZXMsIGJ1aWxkcyB0aGUgY2x1c3RlciwgYW5kIGdlbmVyYXRlcyBhIFRMUyBjZXJ0IChzZXZlcmFsIG1pbnV0ZXMpLicsXG4gICAgZGVzdHJveXM6ICdzdG9wcyB0aGUgbWluaWt1YmUgc3RhY2sg4oCUIHBlcnNpc3RlbnQgdm9sdW1lcyAoUFZDIGRhdGEpIHJlbWFpbiB1bnRpbCB0aGUgY2x1c3RlciBpcyBkZWxldGVkJyxcbiAgICAvLyBNaXJyb3JzIHRoZSBrdWJlY3RsIHBvcnQtZm9yd2FyZHMgc3RhcnRlZCBpbiBkZXBsb3kvbG9jYWwvbWluaWt1YmUvYmluL3NldHVwLnNoLlxuICAgIGhvc3RQb3J0czogW1xuICAgICAgeyBzZXJ2aWNlOiAnbmdpbngg4oCUIEhUVFBTIGdhdGV3YXkgKFVJL0FQSSknLCBwb3J0OiA4NDQzIH0sXG4gICAgICB7IHNlcnZpY2U6ICdNb25nbyBFeHByZXNzIChNb25nbyBVSSknLCBwb3J0OiA4MDgxIH0sXG4gICAgICB7IHNlcnZpY2U6ICdwZ0FkbWluIChQb3N0Z3JlcyBVSSknLCBwb3J0OiA1NDgwIH0sXG4gICAgXSxcbiAgfSxcbiAgZWMyOiB7XG4gICAgaWQ6ICdlYzInLFxuICAgIGxhYmVsOiAnQVdTIEVDMiAoc2luZ2xlIE1pbmlrdWJlIGluc3RhbmNlIGJlaGluZCBhbiBBTEIpJyxcbiAgICBkaXI6ICdkZXBsb3kvYXdzL2VjMicsXG4gICAgZW50cnlwb2ludDogJ2Jpbi9zZXR1cC5zaCcsXG4gICAgc3BhcnNlUGF0aHM6IFsnZGVwbG95L2F3cy9lYzInXSxcbiAgICByZXF1aXJlZDogW0tFWV9QQUlSLCBET01BSU4sIEhPU1RFRF9aT05FXSxcbiAgICBvcHRpb25hbDogW1JFR0lPTiwgREVQTE9ZX01PREUsIEdIQ1JfVE9LRU4sIElOU1RBTkNFX1RZUEUsIFNUQUNLX05BTUUsIEFVVE9fSU5JVCwgTk9fQVVUT19JTklULCBMRUFOLCAuLi5FTUFJTF0sXG4gICAgcG9zdERlcGxveTogJy4vZGVwbG95L2Jpbi9pbml0LXBsYXRmb3JtLnNoIGVjMiAgIyBhdXRvLXJ1bnMgb24gdGhlIGluc3RhbmNlIGJ5IGRlZmF1bHQ7IC0tbm8tYXV0by1pbml0IHRvIGRvIGl0IG1hbnVhbGx5JyxcbiAgICBjb3N0OiAnfiQxNDAtMjY1L21vJyxcbiAgICBiZXN0Rm9yOiAnRGV2IC8gc3RhZ2luZycsXG4gICAgZGVwbG95czogJ3RoZSBwbGF0Zm9ybSBvbiBhIHNpbmdsZSBFQzIgaW5zdGFuY2UgdmlhIENsb3VkRm9ybWF0aW9uIOKAlCBhIFZQQywgdGhlIGluc3RhbmNlIChydW5uaW5nIHRoZSBNaW5pa3ViZSBzdGFjayksIGFuIEFMQiwgYSBSb3V0ZSA1MyByZWNvcmQgKyBBQ00gY2VydCBmb3IgdGhlIGRvbWFpbiwgYW5kIChieSBkZWZhdWx0KSBTRVMgZW1haWwuIFRoZSBpbnN0YW5jZSBwdWxscyBpbWFnZXMgb24gZmlyc3QgYm9vdC4nLFxuICAgIGRlc3Ryb3lzOiAnREVMRVRFUyB0aGUgQ2xvdWRGb3JtYXRpb24gc3RhY2s6IHRoZSBWUEMsIEVDMiBpbnN0YW5jZSwgYW5kIGl0cyBFQlMgZGF0YSB2b2x1bWUgKGRhdGFiYXNlcywgcmVnaXN0cnksIHBsdWdpbiBidWlsZHMpLiBJcnJldmVyc2libGUuJyxcbiAgICBob3N0UG9ydHM6IFtdLCAvLyByZW1vdGUgKEFXUykg4oCUIGJpbmRzIG5vdGhpbmcgb24gdGhlIG9wZXJhdG9yJ3MgbWFjaGluZVxuICB9LFxuICBla3M6IHtcbiAgICBpZDogJ2VrcycsXG4gICAgbGFiZWw6ICdBV1MgRUtTIEF1dG8gTW9kZSAobWFuYWdlZCBLdWJlcm5ldGVzKScsXG4gICAgZGlyOiAnZGVwbG95L2F3cy9la3MnLFxuICAgIGVudHJ5cG9pbnQ6ICdiaW4vc2V0dXAuc2gnLFxuICAgIHNwYXJzZVBhdGhzOiBbJ2RlcGxveS9hd3MvZWtzJ10sXG4gICAgcmVxdWlyZWQ6IFtET01BSU4sIEhPU1RFRF9aT05FXSxcbiAgICBvcHRpb25hbDogW1JFR0lPTiwgREVQTE9ZX01PREUsIEdIQ1JfVE9LRU4sIENMVVNURVJfTkFNRSwgQVVUT19JTklULCBOT19BVVRPX0lOSVQsIC4uLkVNQUlMXSxcbiAgICBwb3N0RGVwbG95OiAnLi9kZXBsb3kvYmluL2luaXQtcGxhdGZvcm0uc2ggZWtzICAjIGF1dG8tcnVucyBhdCB0aGUgZW5kIG9mIHNldHVwLnNoIGJ5IGRlZmF1bHQ7IC0tbm8tYXV0by1pbml0IHRvIGRvIGl0IG1hbnVhbGx5JyxcbiAgICBjb3N0OiAnfiQxNTAtNDAwL21vJyxcbiAgICBiZXN0Rm9yOiAnUHJvZHVjdGlvbicsXG4gICAgZGVwbG95czogJ3RoZSBwbGF0Zm9ybSBvbiBBbWF6b24gRUtTIEF1dG8gTW9kZSDigJQgYW4gQVdTLW1hbmFnZWQgS3ViZXJuZXRlcyBjbHVzdGVyIChLYXJwZW50ZXItc2NhbGVkIEVDMiBub2RlcywgQVdTIExvYWQgQmFsYW5jZXIgQ29udHJvbGxlciwgRUJTL0VGUyBDU0kpLCB0aGUgc2FtZSBLdWJlcm5ldGVzIHdvcmtsb2FkcyBhcyB0aGUgb3RoZXIgazhzIHRhcmdldHMsIGFuIEFMQiBJbmdyZXNzICsgQUNNIGZvciB0aGUgZG9tYWluLCBhbmQgKGJ5IGRlZmF1bHQpIFNFUyBlbWFpbC4gUGx1Z2luIGJ1aWxkcyBydW4gb24gdGhlIGluLWNsdXN0ZXIgcm9vdGxlc3MgYnVpbGRraXRkIChFQzIgbm9kZXMgYWxsb3cgaXQpLicsXG4gICAgZGVzdHJveXM6ICdSdW5zIGJpbi9zaHV0ZG93bi5zaDogREVMRVRFUyB0aGUgRUtTIGNsdXN0ZXIgKyBub2RlcyAoZWtzY3RsKSwgdGhlIEVGUyBmaWxlc3lzdGVtLCBhbmQg4oCUIHdoZW4gLS1kb21haW4gaXMgc2V0IOKAlCB0aGUgQUNNIGNlcnQgKyBSb3V0ZSA1MyBhbGlhcy4gRUJTIHZvbHVtZXMgb24gdGhlIFJldGFpbiBTdG9yYWdlQ2xhc3MgYXJlIE5PVCBhdXRvLWRlbGV0ZWQgKHJlcG9ydGVkIGF0IHRoZSBlbmQpLiBJcnJldmVyc2libGUuJyxcbiAgICBob3N0UG9ydHM6IFtdLCAvLyByZW1vdGUgKEFXUykg4oCUIGJpbmRzIG5vdGhpbmcgb24gdGhlIG9wZXJhdG9yJ3MgbWFjaGluZVxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IFRBUkdFVF9JRFM6IHJlYWRvbmx5IFRhcmdldElkW10gPSBbJ2RvY2tlcicsICdtaW5pa3ViZScsICdlYzInLCAnZWtzJ107XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1RhcmdldElkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgVGFyZ2V0SWQge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAoVEFSR0VUX0lEUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModmFsdWUpO1xufVxuXG4vLyAtLS0gU3BhcnNlIGJvb3RzdHJhcCBwYXRocyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogRm9sZGVycyBldmVyeSBgLS1yZXBvYCBib290c3RyYXAgbmVlZHMgcmVnYXJkbGVzcyBvZiB0YXJnZXQ6IHRoZSBvcmNoZXN0cmF0aW9uXG4gKiBzY3JpcHRzLiBFYWNoIHRhcmdldCdzIHNldHVwLnNoICsgaW5pdC1wbGF0Zm9ybS5zaCBsaXZlIGluIC8gZHJpdmUgdGhlc2UuXG4gKiBEZWxpYmVyYXRlbHkgbWluaW1hbCDigJQgaGVhdmllciBmb2xkZXJzIChwbHVnaW5zL2NvbXBsaWFuY2Uvc2FtcGxlcykgYXJlIHB1bGxlZFxuICogaW4gb25seSB3aGVuIHRoZWlyIHBvc3QtaW5zdGFsbCBvcHRpb24gaXMgc2VsZWN0ZWQgKHNlZSBMT0FEX1NURVBTKS5cbiAqL1xuZXhwb3J0IGNvbnN0IENPTU1PTl9TUEFSU0VfUEFUSFM6IHJlYWRvbmx5IHN0cmluZ1tdID0gWydkZXBsb3kvYmluJ107XG5cbi8qKlxuICogT3B0LWluIHBvc3QtaW5zdGFsbCBsb2FkIHN0ZXBzLiBFYWNoIG1hcHMgYSBwcm92aXNpb24gYC0td2l0aC0qYCBmbGFnIHRvIHRoZVxuICogaW5pdC1wbGF0Zm9ybSBlbnYgdmFyIHRoYXQgZW5hYmxlcyBpdCBBTkQgdGhlIHJlcG8gZm9sZGVyKHMpIGl0IHJlYWRzIOKAlCBzbyB0aGVcbiAqIHNwYXJzZSBjaGVja291dCBncm93cyBleGFjdGx5IHdpdGggdGhlIHNlbGVjdGVkIG9wdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBMT0FEX1NURVBTID0gW1xuICAvLyBUaGUgcGx1Z2luIGJ1aWxkIHJlYWRzIGRlcGxveS9wbHVnaW5zL19iYXNlIEFORCBkZXBsb3kvY29kZWJ1aWxkL2Jvb3RzdHJhcC5cbiAgeyBpZDogJ3BsdWdpbnMnLCBmbGFnOiAnd2l0aFBsdWdpbnMnLCBlbnY6ICdMT0FEX1BMVUdJTlMnLCBwYXRoczogWydkZXBsb3kvcGx1Z2lucycsICdkZXBsb3kvY29kZWJ1aWxkJ10gfSxcbiAgeyBpZDogJ2NvbXBsaWFuY2UnLCBmbGFnOiAnd2l0aENvbXBsaWFuY2UnLCBlbnY6ICdMT0FEX0NPTVBMSUFOQ0UnLCBwYXRoczogWydkZXBsb3kvY29tcGxpYW5jZSddIH0sXG4gIHsgaWQ6ICdzYW1wbGVzJywgZmxhZzogJ3dpdGhTYW1wbGVzJywgZW52OiAnTE9BRF9URU1QTEFURVMnLCBwYXRoczogWydkZXBsb3kvc2FtcGxlcyddIH0sXG5dIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBMb2FkU3RlcElkID0gKHR5cGVvZiBMT0FEX1NURVBTKVtudW1iZXJdWydpZCddO1xuXG4vKipcbiAqIFRoZSBkZS1kdXBsaWNhdGVkIHNldCBvZiBzcGFyc2UgcGF0aHMgZm9yIGEgdGFyZ2V0IHBsdXMgdGhlIGVuYWJsZWQgbG9hZFxuICogc3RlcHM6IGNvbW1vbiBiYXNlIOKIqiB0YXJnZXQgZm9sZGVyKHMpIOKIqiBlYWNoIGVuYWJsZWQgc3RlcCdzIGZvbGRlcihzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVBhdGhzRm9yKHRhcmdldDogVGFyZ2V0SWQsIGVuYWJsZWRMb2FkSWRzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oQ09NTU9OX1NQQVJTRV9QQVRIUyk7XG4gIGZvciAoY29uc3QgcCBvZiBUQVJHRVRTW3RhcmdldF0uc3BhcnNlUGF0aHMpIHBhdGhzLmFkZChwKTtcbiAgZm9yIChjb25zdCBzdGVwIG9mIExPQURfU1RFUFMpIHtcbiAgICBpZiAoZW5hYmxlZExvYWRJZHMuaW5jbHVkZXMoc3RlcC5pZCkpIGZvciAoY29uc3QgcCBvZiBzdGVwLnBhdGhzKSBwYXRocy5hZGQocCk7XG4gIH1cbiAgcmV0dXJuIFsuLi5wYXRoc107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZW1ibGVSZXN1bHQge1xuICAvKiogVGhlIGV4YWN0IGNvbW1hbmQgdG8gcnVuIOKAlCBzZWNyZXRzIG1hc2tlZCBhcyBgKioqYC4gKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuICAvKiogUmVxdWlyZWQgaW5wdXRzIHRoYXQgd2VyZSBub3Qgc3VwcGxpZWQuICovXG4gIHJlYWRvbmx5IG1pc3Npbmc6IHJlYWRvbmx5IElucHV0U3BlY1tdO1xufVxuXG4vKipcbiAqIFF1b3RlIG9ubHkgd2hlbiB0aGUgdmFsdWUgd291bGQgb3RoZXJ3aXNlIGJlIHdvcmQtc3BsaXQgb3IgbWlzLXBhcnNlZCBieSB0aGVcbiAqIHNoZWxsICh3aGl0ZXNwYWNlIG9yIGVtYmVkZGVkIHF1b3RlcykuIGBhc3NlcnRTaGVsbFNhZmVgIGFscmVhZHkgcmVqZWN0cyB0aGVcbiAqIGRhbmdlcm91cyBtZXRhY2hhcmFjdGVycywgc28gc2ltcGxlIHRva2VucyBzdGF5IHVucXVvdGVkIGZvciByZWFkYWJpbGl0eS5cbiAqL1xuZnVuY3Rpb24gbWF5YmVTaGVsbFF1b3RlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gL1tcXHMnXCJdLy50ZXN0KHZhbHVlKSA/IHNoZWxsUXVvdGUodmFsdWUpIDogdmFsdWU7XG59XG5cbi8qKlxuICogQXNzZW1ibGUgdGhlIGRlcGxveSBjb21tYW5kIGZvciBhIHRhcmdldCBmcm9tIHRoZSBwcm92aWRlZCBwYXJhbXMuIFB1cmUgYW5kXG4gKiBkZXRlcm1pbmlzdGljIOKAlCBubyBzaGVsbCwgbm8gTExNLiBNaXNzaW5nIHJlcXVpcmVkIGlucHV0cyBhcmUgcmVwb3J0ZWQgKG5ldmVyXG4gKiBndWVzc2VkKS4gQnkgZGVmYXVsdCBzZWNyZXRzIGFyZSBtYXNrZWQgKGAqKipgKSBmb3IgRElTUExBWTsgcGFzcyBgbWFzazogZmFsc2VgXG4gKiB0byBidWlsZCB0aGUgcmVhbCBjb21tYW5kIGZvciBFWEVDVVRJT04g4oCUIHRoYXQgc3RyaW5nIG11c3QgbmV2ZXIgYmUgbG9nZ2VkIG9yXG4gKiBzaG93biB0byB0aGUgbW9kZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlbWJsZUNvbW1hbmQoXG4gIHRhcmdldDogVGFyZ2V0U3BlYyxcbiAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgb3B0czogeyBtYXNrPzogYm9vbGVhbiB9ID0ge30sXG4pOiBBc3NlbWJsZVJlc3VsdCB7XG4gIGNvbnN0IG1hc2sgPSBvcHRzLm1hc2sgPz8gdHJ1ZTtcbiAgY29uc3QgcHJvdmlkZWQgPSAoc3BlYzogSW5wdXRTcGVjKTogYm9vbGVhbiA9PiB7XG4gICAgY29uc3QgdiA9IHBhcmFtc1tzcGVjLmtleV07XG4gICAgcmV0dXJuIHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSAnJyAmJiB2ICE9PSBmYWxzZTtcbiAgfTtcblxuICBjb25zdCBtaXNzaW5nID0gdGFyZ2V0LnJlcXVpcmVkLmZpbHRlcigoc3BlYykgPT4gIXByb3ZpZGVkKHNwZWMpKTtcblxuICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbYGNkICR7dGFyZ2V0LmRpcn0gJiYgYmFzaCAke3RhcmdldC5lbnRyeXBvaW50fWBdO1xuICBmb3IgKGNvbnN0IHNwZWMgb2YgWy4uLnRhcmdldC5yZXF1aXJlZCwgLi4udGFyZ2V0Lm9wdGlvbmFsXSkge1xuICAgIGlmICghcHJvdmlkZWQoc3BlYykpIGNvbnRpbnVlO1xuICAgIGlmIChzcGVjLmJvb2xlYW4pIHtcbiAgICAgIHBhcnRzLnB1c2goYC0tJHtzcGVjLmZsYWd9YCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgcmF3ID0gU3RyaW5nKHBhcmFtc1tzcGVjLmtleV0pO1xuICAgIC8vIFRoZSBhc3NlbWJsZWQgY29tbWFuZCBpcyBleGVjdXRlZCB2aWEgYSBzaGVsbCAocnVuU2NyaXB0KSwgc28gYSBwYXJhbVxuICAgIC8vIHZhbHVlIGNhcnJ5aW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzIHdvdWxkIGJlIGNvbW1hbmQgaW5qZWN0aW9uLiBWYWxpZGF0ZVxuICAgIC8vIHRoZSBSRUFMIHZhbHVlIGV2ZW4gd2hlbiBtYXNraW5nIGZvciBkaXNwbGF5IOKAlCB0aGUgZXhlY3V0ZWQgY29tbWFuZCB1c2VzXG4gICAgLy8gdGhlIHVubWFza2VkIHZhbHVlLiBSZWRhY3Qgc2VjcmV0cyBzbyB0aGUgZXJyb3IgbmV2ZXIgZWNob2VzIGEgdG9rZW4uXG4gICAgYXNzZXJ0U2hlbGxTYWZlKHJhdywgYC0tJHtzcGVjLmZsYWd9YCwgeyByZWRhY3RWYWx1ZTogc3BlYy5zZWNyZXQgfSk7XG4gICAgLy8gYXNzZXJ0U2hlbGxTYWZlIHN0aWxsIHBlcm1pdHMgc3BhY2VzIGFuZCBxdW90ZXMgKGUuZy4gLS1lbWFpbC1mcm9tLW5hbWVcbiAgICAvLyBcIlBpcGVsaW5lIEJ1aWxkZXJcIiwgb3IgTydCcmllbiksIHdoaWNoIHdvdWxkIHdvcmQtc3BsaXQgd2hlbiBlbWl0dGVkIGJhcmU7XG4gICAgLy8gcXVvdGUgdGhvc2Ugc28gdGhlIHZhbHVlIHJlYWNoZXMgdGhlIHNjcmlwdCBhcyBhIHNpbmdsZSBhcmd1bWVudC5cbiAgICBjb25zdCB2YWx1ZSA9IHNwZWMuc2VjcmV0ICYmIG1hc2sgPyAnKioqJyA6IG1heWJlU2hlbGxRdW90ZShyYXcpO1xuICAgIHBhcnRzLnB1c2goYC0tJHtzcGVjLmZsYWd9ICR7dmFsdWV9YCk7XG4gIH1cblxuICByZXR1cm4geyBjb21tYW5kOiBwYXJ0cy5qb2luKCcgXFxcXFxcbiAgJyksIG1pc3NpbmcgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZWFyZG93blJlc3VsdCB7XG4gIC8qKiBUaGUgZXhhY3QgdGVhcmRvd24gY29tbWFuZCB0byBydW4uICovXG4gIHJlYWRvbmx5IGNvbW1hbmQ6IHN0cmluZztcbiAgLyoqIFdoZXRoZXIgdGhpcyB0ZWFyZG93biBpcnJldmVyc2libHkgZGVzdHJveXMgZGF0YSAoQVdTIHRhcmdldHMpLiAqL1xuICByZWFkb25seSBkZXN0cnVjdGl2ZTogYm9vbGVhbjtcbn1cblxuLyoqIENsb3VkRm9ybWF0aW9uIHN0YWNrIG5hbWUgdGhlIEVDMiBzZXR1cC5zaCBkZWZhdWx0cyB0by4gKi9cbmNvbnN0IERFRkFVTFRfRUMyX1NUQUNLID0gJ3BpcGVsaW5lLWJ1aWxkZXInO1xuLyoqIEVLUyBjbHVzdGVyIG5hbWUgZWtzY3RsIGRlZmF1bHRzIHRvLiAqL1xuY29uc3QgREVGQVVMVF9FS1NfQ0xVU1RFUiA9ICdwaXBlbGluZS1idWlsZGVyJztcblxuLyoqXG4gKiBBc3NlbWJsZSB0aGUgdGVhcmRvd24gY29tbWFuZCBmb3IgYSB0YXJnZXQuIFB1cmUgYW5kIGRldGVybWluaXN0aWMg4oCUIG1pcnJvcnNcbiAqIGBhc3NlbWJsZUNvbW1hbmRgIGZvciB0aGUgZGVzdHJveSBwYXRoLiBsb2NhbC9taW5pa3ViZSBTVE9QIHRoZSBzdGFja1xuICogKG5vbi1kZXN0cnVjdGl2ZSDigJQgb24tZGlzayAvIFBWQyBkYXRhIHN1cnZpdmVzKTsgZWMyIERFTEVURXMgaXRzIENsb3VkRm9ybWF0aW9uXG4gKiBzdGFjayBhbmQgZWtzIERFTEVURXMgaXRzIGNsdXN0ZXIgKGVrc2N0bCkg4oCUIGJvdGggaXJyZXZlcnNpYmxlLiBFQzIgYGRlbGV0ZS1zdGFja2BcbiAqIGFuZCBgZWtzY3RsIGRlbGV0ZSBjbHVzdGVyYCBoYXZlIG5vIG5hdGl2ZSBwcm9tcHQsIHdoaWNoIGlzIGV4YWN0bHkgd2h5IHRoZSBhZ2VudCdzXG4gKiB0eXBlZC1jb25maXJtYXRpb24gZ2F0ZSBpcyBtYW5kYXRvcnkgdGhlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZWFyZG93bkNvbW1hbmQoXG4gIHRhcmdldDogVGFyZ2V0SWQsXG4gIG9wdHM6IHsgc3RhY2tOYW1lPzogc3RyaW5nOyBjbHVzdGVyTmFtZT86IHN0cmluZzsgcmVnaW9uPzogc3RyaW5nOyBkb21haW4/OiBzdHJpbmc7IGhvc3RlZFpvbmVJZD86IHN0cmluZzsgYXNzdW1lWWVzPzogYm9vbGVhbiB9ID0ge30sXG4pOiBUZWFyZG93blJlc3VsdCB7XG4gIGNvbnN0IHJlZ2lvbiA9IHJlc29sdmVBd3NSZWdpb24ob3B0cy5yZWdpb24pO1xuICAvLyBBbnl0aGluZyBmbG93aW5nIHVucXVvdGVkIGludG8gYSBzaGVsbC1leGVjdXRlZCB0ZWFyZG93biBjb21tYW5kIGlzIHJlamVjdGVkXG4gIC8vIGZvciBzaGVsbCBtZXRhY2hhcmFjdGVycyAobWlycm9ycyBhc3NlbWJsZUNvbW1hbmQpLlxuICBhc3NlcnRTaGVsbFNhZmUocmVnaW9uLCAncmVnaW9uJyk7XG4gIGlmIChvcHRzLnN0YWNrTmFtZSkgYXNzZXJ0U2hlbGxTYWZlKG9wdHMuc3RhY2tOYW1lLCAnc3RhY2stbmFtZScpO1xuICBpZiAob3B0cy5jbHVzdGVyTmFtZSkgYXNzZXJ0U2hlbGxTYWZlKG9wdHMuY2x1c3Rlck5hbWUsICdjbHVzdGVyLW5hbWUnKTtcbiAgaWYgKG9wdHMuZG9tYWluKSBhc3NlcnRTaGVsbFNhZmUob3B0cy5kb21haW4sICdkb21haW4nKTtcbiAgaWYgKG9wdHMuaG9zdGVkWm9uZUlkKSBhc3NlcnRTaGVsbFNhZmUob3B0cy5ob3N0ZWRab25lSWQsICdob3N0ZWQtem9uZS1pZCcpO1xuICBzd2l0Y2ggKHRhcmdldCkge1xuICAgIGNhc2UgJ2RvY2tlcic6XG4gICAgICByZXR1cm4geyBjb21tYW5kOiAnY2QgZGVwbG95L2xvY2FsL2RvY2tlciAmJiBiYXNoIGJpbi9zaHV0ZG93bi5zaCcsIGRlc3RydWN0aXZlOiBmYWxzZSB9O1xuICAgIGNhc2UgJ21pbmlrdWJlJzpcbiAgICAgIHJldHVybiB7IGNvbW1hbmQ6ICdjZCBkZXBsb3kvbG9jYWwvbWluaWt1YmUgJiYgYmFzaCBiaW4vc2h1dGRvd24uc2gnLCBkZXN0cnVjdGl2ZTogZmFsc2UgfTtcbiAgICBjYXNlICdlYzInOiB7XG4gICAgICBjb25zdCBzdGFjayA9IG9wdHMuc3RhY2tOYW1lIHx8IERFRkFVTFRfRUMyX1NUQUNLO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWFuZDpcbiAgICAgICAgICBgYXdzIGNsb3VkZm9ybWF0aW9uIGRlbGV0ZS1zdGFjayAtLXN0YWNrLW5hbWUgJHtzdGFja30gLS1yZWdpb24gJHtyZWdpb259ICYmIGAgK1xuICAgICAgICAgIGBhd3MgY2xvdWRmb3JtYXRpb24gd2FpdCBzdGFjay1kZWxldGUtY29tcGxldGUgLS1zdGFjay1uYW1lICR7c3RhY2t9IC0tcmVnaW9uICR7cmVnaW9ufWAsXG4gICAgICAgIGRlc3RydWN0aXZlOiB0cnVlLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnZWtzJzoge1xuICAgICAgLy8gZWtzIHRlYXJzIGRvd24gdmlhIGJpbi9zaHV0ZG93bi5zaCAobGlrZSBsb2NhbC9taW5pa3ViZSB1c2UgYmluL3NodXRkb3duLnNoKTpcbiAgICAgIC8vIGl0IGRlbGV0ZXMgdGhlIGNsdXN0ZXIgQU5EIHRoZSByZXNvdXJjZXMgZWtzY3RsIGFsb25lIHdvdWxkIG9ycGhhbiDigJQgdGhlIEVGU1xuICAgICAgLy8gZmlsZXN5c3RlbSBhbmQsIHdoZW4gLS1kb21haW4gaXMgZ2l2ZW4sIHRoZSBBQ00gY2VydCArIFJvdXRlIDUzIGFsaWFzLiBUaGVcbiAgICAgIC8vIGFnZW50J3MgdHlwZWQtY29uZmlybWF0aW9uIGdhdGUgYWxyZWFkeSByYW4sIHNvIHBhc3MgLS15ZXMgdG8gc2tpcCB0aGVcbiAgICAgIC8vIHNjcmlwdCdzIG93biBwcm9tcHQuXG4gICAgICBjb25zdCBjbHVzdGVyID0gb3B0cy5jbHVzdGVyTmFtZSB8fCBERUZBVUxUX0VLU19DTFVTVEVSO1xuICAgICAgbGV0IGNvbW1hbmQgPSBgY2QgZGVwbG95L2F3cy9la3MgJiYgYmFzaCBiaW4vc2h1dGRvd24uc2ggLS1jbHVzdGVyLW5hbWUgJHtjbHVzdGVyfSAtLXJlZ2lvbiAke3JlZ2lvbn1gO1xuICAgICAgaWYgKG9wdHMuZG9tYWluKSBjb21tYW5kICs9IGAgLS1kb21haW4gJHtvcHRzLmRvbWFpbn1gO1xuICAgICAgaWYgKG9wdHMuaG9zdGVkWm9uZUlkKSBjb21tYW5kICs9IGAgLS1ob3N0ZWQtem9uZS1pZCAke29wdHMuaG9zdGVkWm9uZUlkfWA7XG4gICAgICBpZiAob3B0cy5hc3N1bWVZZXMpIGNvbW1hbmQgKz0gJyAtLXllcyc7XG4gICAgICByZXR1cm4geyBjb21tYW5kLCBkZXN0cnVjdGl2ZTogdHJ1ZSB9O1xuICAgIH1cbiAgfVxufVxuIl19
281
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFyZ2V0cy5qcyIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FnZW50L3RhcmdldHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsK0NBQStDO0FBQy9DLHNDQUFzQztBQUV0Qzs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFzRHZELCtFQUErRTtBQUUvRSxNQUFNLE1BQU0sR0FBYyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsdURBQXVELEVBQUUsQ0FBQztBQUNsSSxNQUFNLFdBQVcsR0FBYyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSw2REFBNkQsRUFBRSxDQUFDO0FBQzNKLE1BQU0sVUFBVSxHQUFjLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxzRUFBc0UsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDMUssTUFBTSxNQUFNLEdBQWMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxDQUFDO0FBQ3ZGLE1BQU0sV0FBVyxHQUFjLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSw2REFBNkQsRUFBRSxDQUFDO0FBQ3RKLE1BQU0sUUFBUSxHQUFjLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxnRkFBZ0YsRUFBRSxDQUFDO0FBQ2hLLE1BQU0sYUFBYSxHQUFjLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLFdBQVcs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LEdBQUcsNERBQTRELE9BQU8sYUFBYSxNQUFNLEVBQUUsQ0FBQztZQUN2RyxJQUFJLElBQUksQ0FBQyxNQUFNO2dCQUFFLE9BQU8sSUFBSSxhQUFhLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN2RCxJQUFJLElBQUksQ0FBQyxZQUFZO2dCQUFFLE9BQU8sSUFBSSxxQkFBcUIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzNFLElBQUksSUFBSSxDQUFDLFNBQVM7Z0JBQUUsT0FBTyxJQUFJLFFBQVEsQ0FBQztZQUN4QyxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN4QyxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuLyoqXG4gKiBEZXRlcm1pbmlzdGljIHJlZ2lzdHJ5IG9mIHBsYXRmb3JtIGRlcGxveSB0YXJnZXRzIOKAlCB0aGUgc291cmNlIG9mIHRydXRoIHRoZVxuICogYHByb3Zpc2lvbmAgYWR2aXNvciB1c2VzIHRvIGFzc2VtYmxlIHRoZSBFWEFDVCBkZXBsb3kgY29tbWFuZC4gVGhlIGFnZW50IGlzIGFcbiAqIHRoaW4gd3JhcHBlciBvdmVyIHRoZSBleGlzdGluZyBkZXBsb3kgc2NyaXB0czsgaXQgbmV2ZXIgcmVpbXBsZW1lbnRzXG4gKiBkZXBsb3ltZW50LCBvbmx5IHZhbGlkYXRlcyBpbnB1dHMgYW5kIGFzc2VtYmxlcyB0aGUgY29tbWFuZCB0byBydW4uXG4gKlxuICogS2VlcCB0aGlzIGluIGxvY2stc3RlcCB3aXRoIHRoZSBmbGFncyB0aGUgc2NyaXB0cyBhY2NlcHQg4oCUIGV2ZXJ5IHRhcmdldCdzXG4gKiBvcGVyYXRvciBlbnRyeXBvaW50IGlzIGBiaW4vc2V0dXAuc2hgIChkZXBsb3kvPHRhcmdldD4vYmluL3NldHVwLnNoKS5cbiAqL1xuXG5pbXBvcnQgeyBhc3NlcnRTaGVsbFNhZmUsIHNoZWxsUXVvdGUgfSBmcm9tICcuLi9jb25maWcvY2xpLmNvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyByZXNvbHZlQXdzUmVnaW9uIH0gZnJvbSAnLi4vdXRpbHMvYXdzLWVudi5qcyc7XG5cbmV4cG9ydCB0eXBlIFRhcmdldElkID0gJ2RvY2tlcicgfCAnbWluaWt1YmUnIHwgJ2VjMicgfCAnZWtzJztcblxuLyoqIEEgc2luZ2xlIGlucHV0IHRoZSB1bmRlcmx5aW5nIGRlcGxveSBzY3JpcHQgYWNjZXB0cy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5wdXRTcGVjIHtcbiAgLyoqIEZsYWcgbmFtZSBwYXNzZWQgdG8gdGhlIHNjcmlwdCAod2l0aG91dCB0aGUgbGVhZGluZyBgLS1gKS4gKi9cbiAgcmVhZG9ubHkgZmxhZzogc3RyaW5nO1xuICAvKiogS2V5IG9uIHRoZSBwcm92aXNpb24gcGFyYW1zIG9iamVjdC4gKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gIC8qKiBIdW1hbiBkZXNjcmlwdGlvbiDigJQgc2hvd24gd2hlbiBhIHJlcXVpcmVkIGlucHV0IGlzIG1pc3NpbmcuICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIC8qKiBTZWNyZXQg4oCUIG5ldmVyIHByaW50ZWQgaW4gdGhlIGFzc2VtYmxlZCBjb21tYW5kIChtYXNrZWQgYXMgYCoqKmApLiAqL1xuICByZWFkb25seSBzZWNyZXQ/OiBib29sZWFuO1xuICAvKiogQm9vbGVhbiBmbGFnIHdpdGggbm8gdmFsdWUgKGUuZy4gYC0tZW1haWxgKS4gKi9cbiAgcmVhZG9ubHkgYm9vbGVhbj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFyZ2V0U3BlYyB7XG4gIHJlYWRvbmx5IGlkOiBUYXJnZXRJZDtcbiAgcmVhZG9ubHkgbGFiZWw6IHN0cmluZztcbiAgLyoqIERpcmVjdG9yeSB0aGUgZW50cnlwb2ludCBydW5zIGZyb20gKHJlbGF0aXZlIHRvIHJlcG8gcm9vdCkuICovXG4gIHJlYWRvbmx5IGRpcjogc3RyaW5nO1xuICAvKiogRW50cnlwb2ludCBzY3JpcHQgKHJlbGF0aXZlIHRvIGBkaXJgKS4gKi9cbiAgcmVhZG9ubHkgZW50cnlwb2ludDogc3RyaW5nO1xuICAvKiogSW5wdXRzIHRoZSBzY3JpcHQgUkVRVUlSRVMg4oCUIHRoZSBhZHZpc29yIHJlcG9ydHMgYW55IHRoYXQgYXJlIG1pc3NpbmcuICovXG4gIHJlYWRvbmx5IHJlcXVpcmVkOiByZWFkb25seSBJbnB1dFNwZWNbXTtcbiAgLyoqIE9wdGlvbmFsIGlucHV0cywgcGFzc2VkIHRocm91Z2ggb25seSB3aGVuIHByb3ZpZGVkLiAqL1xuICByZWFkb25seSBvcHRpb25hbDogcmVhZG9ubHkgSW5wdXRTcGVjW107XG4gIC8qKlxuICAgKiBSZXBvIGZvbGRlcihzKSB0aGlzIHRhcmdldCdzIGRlcGxveSBuZWVkcywgZm9yIGEgc3BhcnNlIGAtLXJlcG9gIGJvb3RzdHJhcC5cbiAgICogQ29tYmluZWQgd2l0aCBDT01NT05fU1BBUlNFX1BBVEhTIGFuZCBhbnkgc2VsZWN0ZWQgbG9hZCBzdGVwcycgcGF0aHMuXG4gICAqL1xuICByZWFkb25seSBzcGFyc2VQYXRoczogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKiBQb3N0LWRlcGxveSBzdGVwIHRvIHN1cmZhY2UgKHJlZ2lzdGVycyBhZG1pbiArIGxvYWRzIHBsdWdpbnMpLiAqL1xuICByZWFkb25seSBwb3N0RGVwbG95Pzogc3RyaW5nO1xuICAvKiogUm91Z2ggbW9udGhseSBjb3N0IChmcm9tIGRvY3MpLiAqL1xuICByZWFkb25seSBjb3N0OiBzdHJpbmc7XG4gIC8qKiBPbmUtbGluZSBcImJlc3QgZm9yXCIuICovXG4gIHJlYWRvbmx5IGJlc3RGb3I6IHN0cmluZztcbiAgLyoqIFdoYXQgdGhlIGRlcGxveSBjcmVhdGVzIOKAlCBzaG93biB3aGVuIGRlcGxveWluZyBzbyBcIkRlcGxveWluZ1wiIGlzbid0IG9wYXF1ZS4gKi9cbiAgcmVhZG9ubHkgZGVwbG95czogc3RyaW5nO1xuICAvKiogV2hhdCBhIHRlYXJkb3duIG9mIHRoaXMgdGFyZ2V0IGRlc3Ryb3lzIOKAlCBzaG93biBiZWZvcmUgYSAoZ2F0ZWQpIHRlYXJkb3duLiAqL1xuICByZWFkb25seSBkZXN0cm95czogc3RyaW5nO1xuICAvKipcbiAgICogSG9zdCBwb3J0cyB0aGUgZGVwbG95IGJpbmRzIOKAlCBhIEZBTExCQUNLIG9ubHkuIFRoZSBsaXZlIGxpc3QgaXMgREVSSVZFRCBmcm9tIHRoZVxuICAgKiBjbG9uZWQgZGVwbG95IHNvdXJjZSBhdCBydW50aW1lIChwb3J0cy50cyBgZGlzY292ZXJIb3N0UG9ydHNgKTogbG9jYWwgZnJvbVxuICAgKiBkb2NrZXItY29tcG9zZS55bWwncyBwdWJsaXNoZWQgcG9ydHMsIG1pbmlrdWJlIGZyb20gc2V0dXAuc2gncyBwb3J0LWZvcndhcmRzLiBUaGlzXG4gICAqIHN0YXRpYyBjb3B5IGlzIHVzZWQgb25seSB3aGVuIHRoYXQgc291cmNlIGNhbid0IGJlIHJlYWQuIEVtcHR5IGZvciByZW1vdGUgdGFyZ2V0c1xuICAgKiAoZWMyL2VrcyBiaW5kIG5vdGhpbmcgb24gdGhlIG9wZXJhdG9yJ3MgbWFjaGluZSkuXG4gICAqL1xuICByZWFkb25seSBob3N0UG9ydHM6IHJlYWRvbmx5IHsgc2VydmljZTogc3RyaW5nOyBwb3J0OiBudW1iZXIgfVtdO1xufVxuXG4vLyAtLS0gU2hhcmVkIGlucHV0IHNwZWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IERPTUFJTjogSW5wdXRTcGVjID0geyBmbGFnOiAnZG9tYWluJywga2V5OiAnZG9tYWluJywgZGVzY3JpcHRpb246ICdGdWxseS1xdWFsaWZpZWQgZG9tYWluIG5hbWUgKEFMQiBBQ00gY2VydCArIFNFUyBES0lNKScgfTtcbmNvbnN0IEhPU1RFRF9aT05FOiBJbnB1dFNwZWMgPSB7IGZsYWc6ICdob3N0ZWQtem9uZS1pZCcsIGtleTogJ2hvc3RlZFpvbmVJZCcsIGRlc2NyaXB0aW9uOiAnUHVibGljIFJvdXRlIDUzIGhvc3RlZCB6b25lIElEIGF1dGhvcml0YXRpdmUgZm9yIHRoZSBkb21haW4nIH07XG5jb25zdCBHSENSX1RPS0VOOiBJbnB1dFNwZWMgPSB7IGZsYWc6ICdnaGNyLXRva2VuJywga2V5OiAnZ2hjclRva2VuJywgZGVzY3JpcHRpb246ICdHaXRIdWIgUEFUIHdpdGggcmVhZDpwYWNrYWdlcyAoYXZvaWRzIGdoY3IuaW8gYW5vbnltb3VzIHJhdGUgbGltaXRzKScsIHNlY3JldDogdHJ1ZSB9O1xuY29uc3QgUkVHSU9OOiBJbnB1dFNwZWMgPSB7IGZsYWc6ICdyZWdpb24nLCBrZXk6ICdyZWdpb24nLCBkZXNjcmlwdGlvbjogJ0FXUyByZWdpb24nIH07XG5jb25zdCBERVBMT1lfTU9ERTogSW5wdXRTcGVjID0geyBmbGFnOiAnZGVwbG95LW1vZGUnLCBrZXk6ICdkZXBsb3lNb2RlJywgZGVzY3JpcHRpb246ICdwdWJsaWMgKGludGVybmV0LWZhY2luZyBBTEIpIG9yIHByaXZhdGUgKGludGVybmFsLCBkZWZhdWx0KScgfTtcbmNvbnN0IEtFWV9QQUlSOiBJbnB1dFNwZWMgPSB7IGZsYWc6ICdrZXktcGFpcicsIGtleTogJ2tleVBhaXInLCBkZXNjcmlwdGlvbjogJ0VDMiBrZXkgcGFpciBpbiB0aGUgcmVnaW9uIChicmVhay1nbGFzcyBzZXJpYWwgY29uc29sZTsgcm91dGluZSBhY2Nlc3MgaXMgU1NNKScgfTtcbmNvbnN0IElOU1RBTkNFX1RZUEU6IElucHV0U3BlYyA9IHsgZmxhZzogJ2luc3RhbmNlLXR5cGUnLCBrZXk6ICdpbnN0YW5jZVR5cGUnLCBkZXNjcmlwdGlvbjogJ0VDMiBpbnN0YW5jZSB0eXBlIChkZWZhdWx0IHQzLjJ4bGFyZ2UpJyB9O1xuLy8gZWMyIGRlcGxveS90ZWFyZG93biBzdGFjayBuYW1lIChDbG91ZEZvcm1hdGlvbikuIFRoZSBgc3RhY2tOYW1lYCBwYXJhbSBrZXkgaXMgYWxzbyByZXVzZWRcbi8vIGJ5IHRoZSB0ZWFyZG93biBwYXRoIGFzIHRoZSByZXNvdXJjZSBpZGVudGlmaWVyIChlYzIgc3RhY2sgLyBla3MgY2x1c3RlciBuYW1lKS5cbmNvbnN0IFNUQUNLX05BTUU6IElucHV0U3BlYyA9IHsgZmxhZzogJ3N0YWNrLW5hbWUnLCBrZXk6ICdzdGFja05hbWUnLCBkZXNjcmlwdGlvbjogJ0Nsb3VkRm9ybWF0aW9uIHN0YWNrIG5hbWUgKGRlZmF1bHQgcGlwZWxpbmUtYnVpbGRlcikg4oCUIHNldCB0byBydW4gYSBzZWNvbmQgZWMyIGVudmlyb25tZW50JyB9O1xuLy8gZWtzIGNsdXN0ZXIgbmFtZSAoZWtzY3RsKS4gU2V0IHRvIHJ1biBhIHNlY29uZCBFS1MgZW52aXJvbm1lbnQgaW4gb25lIGFjY291bnQuXG5jb25zdCBDTFVTVEVSX05BTUU6IElucHV0U3BlYyA9IHsgZmxhZzogJ2NsdXN0ZXItbmFtZScsIGtleTogJ2NsdXN0ZXJOYW1lJywgZGVzY3JpcHRpb246ICdFS1MgY2x1c3RlciBuYW1lIChkZWZhdWx0IHBpcGVsaW5lLWJ1aWxkZXIpJyB9O1xuLy8gQXV0by1pbml0IGlzIE9OIEJZIERFRkFVTFQgb24gdGhlIEFXUyB0YXJnZXRzIChlYzIgKyBla3Mgc2V0dXAuc2ggZGVmYXVsdCBBVVRPX0lOSVQ9dHJ1ZSksXG4vLyBzbyBgLS1uby1hdXRvLWluaXRgIGlzIHRoZSBsb2FkLWJlYXJpbmcgb3B0LW91dCBhbmQgYC0tYXV0by1pbml0YCBpcyBhIG5vLW9wIHJlYWZmaXJtIOKAlFxuLy8gbWlycm9ycyAtLWVtYWlsLy0tbm8tZW1haWwuIGVjMiBzZWxmLWluaXRzIG9uIHRoZSBpbnN0YW5jZSBvbiBmaXJzdCBib290OyBla3Mgc2VsZi1pbml0cyBpblxuLy8gc2V0dXAuc2gncyBmaW5hbCBwaGFzZSAob3ZlciBhIGt1YmVjdGwgcG9ydC1mb3J3YXJkKS4gbWluaWt1YmUvbG9jYWwgcnVuIGluaXQgdmlhIHByb3Zpc2lvbi5cbi8vIE5PVEU6IGAtLW5vLWF1dG8taW5pdGAncyBrZXkgKG5vQXV0b0luaXQpIGlzIE5PVCBkZXJpdmFibGUgZnJvbSBpdHMgZmxhZyB0aGUgd2F5IHRoZSBvdGhlclxuLy8gc3BlY3MnIGtleXMgYXJlIChjb21tYW5kZXIgZm9sZHMgLS14Ly0tbm8teCBpbnRvIGEgc2luZ2xlIGB4YCBvcHRpb24pOyBwcm92aXNpb24udHMgYXNzZW1ibGVzXG4vLyBib3RoIGtleXMgZXhwbGljaXRseSDigJQgc2VlIHRoZSBwYXJhbS1hc3NlbWJseSB0aGVyZS5cbmNvbnN0IEFVVE9fSU5JVDogSW5wdXRTcGVjID0geyBmbGFnOiAnYXV0by1pbml0Jywga2V5OiAnYXV0b0luaXQnLCBkZXNjcmlwdGlvbjogJ2VjMi9la3M6IHRoZSBkZXBsb3kgc2VsZi1ydW5zIGluaXQtcGxhdGZvcm0gKHJlZ2lzdGVyICsgYWxsIGxvYWRzKSDigJQgdGhlIERFRkFVTFQgb24gQVdTJywgYm9vbGVhbjogdHJ1ZSB9O1xuY29uc3QgTk9fQVVUT19JTklUOiBJbnB1dFNwZWMgPSB7IGZsYWc6ICduby1hdXRvLWluaXQnLCBrZXk6ICdub0F1dG9Jbml0JywgZGVzY3JpcHRpb246ICdlYzIvZWtzOiBza2lwIHRoZSBkZXBsb3ktbWFuYWdlZCBhdXRvLWluaXQgYW5kIHJ1biBpbml0LXBsYXRmb3JtIG1hbnVhbGx5IGluc3RlYWQnLCBib29sZWFuOiB0cnVlIH07XG4vLyBlYzIgb25seTogTEVBTiBkcm9wcyB0aGUgb3B0aW9uYWwgb2JzZXJ2YWJpbGl0eS9hZG1pbiBzZXJ2aWNlcyBzbyB0aGUgY29yZSBzdGFjayArXG4vLyBtZXNoIGZpdHMgYSB0My54bGFyZ2UgaW5zdGVhZCBvZiB0My4yeGxhcmdlLiBGbG93cyB0aHJvdWdoIHRoZSBDRk4gYExlYW5gIHBhcmFtIGludG9cbi8vIHRoZSBpbnN0YW5jZSdzIHN0YXJ0dXAuc2guIChtaW5pa3ViZSByZWFkcyBMRUFOIGFzIGFuIGVudiB2YXI7IGVrcyBkb2Vzbid0IHN1cHBvcnQgaXQuKVxuY29uc3QgTEVBTjogSW5wdXRTcGVjID0geyBmbGFnOiAnbGVhbicsIGtleTogJ2xlYW4nLCBkZXNjcmlwdGlvbjogJ2VjMjogdHJpbSBvcHRpb25hbCBvYnNlcnZhYmlsaXR5L2FkbWluIHNlcnZpY2VzIHNvIHRoZSBzdGFjayBmaXRzIGEgdDMueGxhcmdlIChwYWlyIHdpdGggLS1pbnN0YW5jZS10eXBlIHQzLnhsYXJnZSknLCBib29sZWFuOiB0cnVlIH07XG5cbi8vIFNFUyAvIGVtYWlsIGZhbWlseSDigJQgc2hhcmVkIGJ5IGVjMiArIGVrcy4gU0VTIGlzIHByb3Zpc2lvbmVkIEJZIERFRkFVTFRcbi8vIG9uIEFXUyBkZXBsb3lzOyBgLS1uby1lbWFpbGAgaXMgdGhlIG9wdC1vdXQgKGAtLWVtYWlsYCBpcyBhIGhhcm1sZXNzIG5vLW9wIGtlcHRcbi8vIGZvciBiYWNrLWNvbXBhdCkuXG5jb25zdCBFTUFJTDogcmVhZG9ubHkgSW5wdXRTcGVjW10gPSBbXG4gIHsgZmxhZzogJ2VtYWlsJywga2V5OiAnZW1haWwnLCBkZXNjcmlwdGlvbjogJ0VuYWJsZSBTRVMgdHJhbnNhY3Rpb25hbCBlbWFpbCAob24gYnkgZGVmYXVsdCBmb3IgQVdTKScsIGJvb2xlYW46IHRydWUgfSxcbiAgeyBmbGFnOiAnbm8tZW1haWwnLCBrZXk6ICdub0VtYWlsJywgZGVzY3JpcHRpb246ICdTa2lwIFNFUyAodHJhbnNhY3Rpb25hbCBlbWFpbCBpcyBwcm92aXNpb25lZCBieSBkZWZhdWx0KScsIGJvb2xlYW46IHRydWUgfSxcbiAgeyBmbGFnOiAnZW1haWwtZnJvbScsIGtleTogJ2VtYWlsRnJvbScsIGRlc2NyaXB0aW9uOiAnRnJvbSBhZGRyZXNzIChkZWZhdWx0IG5vcmVwbHlAPGRvbWFpbj4pJyB9LFxuICB7IGZsYWc6ICdlbWFpbC1mcm9tLW5hbWUnLCBrZXk6ICdlbWFpbEZyb21OYW1lJywgZGVzY3JpcHRpb246ICdEaXNwbGF5IG5hbWUgb24gb3V0Ym91bmQgZW1haWwnIH0sXG4gIHsgZmxhZzogJ2FsZXJ0LWVtYWlsJywga2V5OiAnYWxlcnRFbWFpbCcsIGRlc2NyaXB0aW9uOiAnU3Vic2NyaWJlIGFuIGFkZHJlc3MgdG8gdGhlIGJvdW5jZS9jb21wbGFpbnQgU05TIHRvcGljJyB9LFxuICB7IGZsYWc6ICduby1jcmVhdGUtc2VzLWlkZW50aXR5Jywga2V5OiAnbm9DcmVhdGVTZXNJZGVudGl0eScsIGRlc2NyaXB0aW9uOiAnU2tpcCBTRVMgaWRlbnRpdHkgY3JlYXRpb24gKGRvbWFpbiBhbHJlYWR5IHZlcmlmaWVkKScsIGJvb2xlYW46IHRydWUgfSxcbl07XG5cbi8vIC0tLSBUYXJnZXRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGNvbnN0IFRBUkdFVFM6IFJlYWRvbmx5PFJlY29yZDxUYXJnZXRJZCwgVGFyZ2V0U3BlYz4+ID0ge1xuICBkb2NrZXI6IHtcbiAgICBpZDogJ2RvY2tlcicsXG4gICAgbGFiZWw6ICdMb2NhbCAoRG9ja2VyIENvbXBvc2UpJyxcbiAgICBkaXI6ICdkZXBsb3kvbG9jYWwvZG9ja2VyJyxcbiAgICBlbnRyeXBvaW50OiAnYmluL3NldHVwLnNoJyxcbiAgICBzcGFyc2VQYXRoczogWydkZXBsb3kvbG9jYWwvZG9ja2VyJ10sXG4gICAgcmVxdWlyZWQ6IFtdLFxuICAgIG9wdGlvbmFsOiBbXSxcbiAgICBwb3N0RGVwbG95OiAnLi9kZXBsb3kvYmluL2luaXQtcGxhdGZvcm0uc2ggZG9ja2VyJyxcbiAgICBjb3N0OiAnRnJlZScsXG4gICAgYmVzdEZvcjogJ0RldmVsb3BtZW50JyxcbiAgICBkZXBsb3lzOiAndGhlIHBsYXRmb3JtIGFzIGEgRG9ja2VyIENvbXBvc2Ugc3RhY2sg4oCUIGFuIG5naW54IFRMUyBwcm94eSwgdGhlIEFQSSBzZXJ2aWNlcyAocGxhdGZvcm0sIHBsdWdpbiwgcGlwZWxpbmUsIG1lc3NhZ2UsIHJlcG9ydGluZywgY29tcGxpYW5jZSwgcXVvdGEsIGJpbGxpbmcsIGltYWdlLXJlZ2lzdHJ5KSwgdGhlIGZyb250ZW5kLCBhbmQgcG9zdGdyZXMgKyBtb25nbyArIHJlZGlzLiBGaXJzdCBydW4gcHVsbHMgdGhlIGdoY3IuaW8gaW1hZ2VzIGFuZCBnZW5lcmF0ZXMgYSBsb2NhbCBUTFMgY2VydCAoYSBmZXcgbWludXRlcykuJyxcbiAgICBkZXN0cm95czogJ3N0b3BzIGFsbCBjb250YWluZXJzIOKAlCBkYXRhIHVuZGVyIGRlcGxveS9sb2NhbC9kb2NrZXIvZGF0YSBwZXJzaXN0cyBvbiBkaXNrIChkZWxldGUgaXQgbWFudWFsbHkgZm9yIGEgY2xlYW4gc2xhdGUpJyxcbiAgICAvLyBNaXJyb3JzIHRoZSBwdWJsaXNoZWQgcG9ydHMgaW4gZGVwbG95L2xvY2FsL2RvY2tlci9kb2NrZXItY29tcG9zZS55bWwuXG4gICAgaG9zdFBvcnRzOiBbXG4gICAgICB7IHNlcnZpY2U6ICduZ2lueCDigJQgSFRUUFMgZ2F0ZXdheSAoVUkvQVBJKScsIHBvcnQ6IDg0NDMgfSxcbiAgICAgIHsgc2VydmljZTogJ25naW54IOKAlCBIVFRQIHJlZGlyZWN0JywgcG9ydDogODA4MCB9LFxuICAgICAgeyBzZXJ2aWNlOiAncGdBZG1pbiAoUG9zdGdyZXMgVUkpJywgcG9ydDogNTQ4MCB9LFxuICAgICAgeyBzZXJ2aWNlOiAnTW9uZ28gRXhwcmVzcyAoTW9uZ28gVUkpJywgcG9ydDogMjcwODEgfSxcbiAgICAgIHsgc2VydmljZTogJ0RvY2tlciByZWdpc3RyeScsIHBvcnQ6IDUwMDAgfSxcbiAgICAgIHsgc2VydmljZTogJ0phZWdlciAodHJhY2luZyBVSSknLCBwb3J0OiAxNjY4NiB9LFxuICAgIF0sXG4gIH0sXG4gIG1pbmlrdWJlOiB7XG4gICAgaWQ6ICdtaW5pa3ViZScsXG4gICAgbGFiZWw6ICdNaW5pa3ViZSAobG9jYWwgS3ViZXJuZXRlcyknLFxuICAgIGRpcjogJ2RlcGxveS9sb2NhbC9taW5pa3ViZScsXG4gICAgZW50cnlwb2ludDogJ2Jpbi9zZXR1cC5zaCcsXG4gICAgc3BhcnNlUGF0aHM6IFsnZGVwbG95L2xvY2FsL21pbmlrdWJlJ10sXG4gICAgcmVxdWlyZWQ6IFtdLFxuICAgIG9wdGlvbmFsOiBbXSxcbiAgICBwb3N0RGVwbG95OiAnLi9kZXBsb3kvYmluL2luaXQtcGxhdGZvcm0uc2ggbWluaWt1YmUnLFxuICAgIGNvc3Q6ICdGcmVlJyxcbiAgICBiZXN0Rm9yOiAnTG9jYWwgS3ViZXJuZXRlcycsXG4gICAgZGVwbG95czogJ3RoZSBwbGF0Zm9ybSBvbnRvIGEgbG9jYWwgTWluaWt1YmUgY2x1c3RlciDigJQgdGhlIHNhbWUgc2VydmljZXMgYXMgS3ViZXJuZXRlcyBEZXBsb3ltZW50cy9TZXJ2aWNlcyBiZWhpbmQgYW4gaW5ncmVzcywgcGx1cyBpbi1jbHVzdGVyIHBvc3RncmVzICsgbW9uZ28gKyByZWRpcy4gRmlyc3QgcnVuIHB1bGxzIGltYWdlcywgYnVpbGRzIHRoZSBjbHVzdGVyLCBhbmQgZ2VuZXJhdGVzIGEgVExTIGNlcnQgKHNldmVyYWwgbWludXRlcykuJyxcbiAgICBkZXN0cm95czogJ3N0b3BzIHRoZSBtaW5pa3ViZSBzdGFjayDigJQgcGVyc2lzdGVudCB2b2x1bWVzIChQVkMgZGF0YSkgcmVtYWluIHVudGlsIHRoZSBjbHVzdGVyIGlzIGRlbGV0ZWQnLFxuICAgIC8vIE1pcnJvcnMgdGhlIGt1YmVjdGwgcG9ydC1mb3J3YXJkcyBzdGFydGVkIGluIGRlcGxveS9sb2NhbC9taW5pa3ViZS9iaW4vc2V0dXAuc2guXG4gICAgaG9zdFBvcnRzOiBbXG4gICAgICB7IHNlcnZpY2U6ICduZ2lueCDigJQgSFRUUFMgZ2F0ZXdheSAoVUkvQVBJKScsIHBvcnQ6IDg0NDMgfSxcbiAgICAgIHsgc2VydmljZTogJ01vbmdvIEV4cHJlc3MgKE1vbmdvIFVJKScsIHBvcnQ6IDgwODEgfSxcbiAgICAgIHsgc2VydmljZTogJ3BnQWRtaW4gKFBvc3RncmVzIFVJKScsIHBvcnQ6IDU0ODAgfSxcbiAgICBdLFxuICB9LFxuICBlYzI6IHtcbiAgICBpZDogJ2VjMicsXG4gICAgbGFiZWw6ICdBV1MgRUMyIChzaW5nbGUgTWluaWt1YmUgaW5zdGFuY2UgYmVoaW5kIGFuIEFMQiknLFxuICAgIGRpcjogJ2RlcGxveS9hd3MvZWMyJyxcbiAgICBlbnRyeXBvaW50OiAnYmluL3NldHVwLnNoJyxcbiAgICBzcGFyc2VQYXRoczogWydkZXBsb3kvYXdzL2VjMiddLFxuICAgIHJlcXVpcmVkOiBbS0VZX1BBSVIsIERPTUFJTiwgSE9TVEVEX1pPTkVdLFxuICAgIG9wdGlvbmFsOiBbUkVHSU9OLCBERVBMT1lfTU9ERSwgR0hDUl9UT0tFTiwgSU5TVEFOQ0VfVFlQRSwgU1RBQ0tfTkFNRSwgQVVUT19JTklULCBOT19BVVRPX0lOSVQsIExFQU4sIC4uLkVNQUlMXSxcbiAgICBwb3N0RGVwbG95OiAnLi9kZXBsb3kvYmluL2luaXQtcGxhdGZvcm0uc2ggZWMyICAjIGF1dG8tcnVucyBvbiB0aGUgaW5zdGFuY2UgYnkgZGVmYXVsdDsgLS1uby1hdXRvLWluaXQgdG8gZG8gaXQgbWFudWFsbHknLFxuICAgIGNvc3Q6ICd+JDE0MC0yNjUvbW8nLFxuICAgIGJlc3RGb3I6ICdEZXYgLyBzdGFnaW5nJyxcbiAgICBkZXBsb3lzOiAndGhlIHBsYXRmb3JtIG9uIGEgc2luZ2xlIEVDMiBpbnN0YW5jZSB2aWEgQ2xvdWRGb3JtYXRpb24g4oCUIGEgVlBDLCB0aGUgaW5zdGFuY2UgKHJ1bm5pbmcgdGhlIE1pbmlrdWJlIHN0YWNrKSwgYW4gQUxCLCBhIFJvdXRlIDUzIHJlY29yZCArIEFDTSBjZXJ0IGZvciB0aGUgZG9tYWluLCBhbmQgKGJ5IGRlZmF1bHQpIFNFUyBlbWFpbC4gVGhlIGluc3RhbmNlIHB1bGxzIGltYWdlcyBvbiBmaXJzdCBib290LicsXG4gICAgZGVzdHJveXM6ICdERUxFVEVTIHRoZSBDbG91ZEZvcm1hdGlvbiBzdGFjazogdGhlIFZQQywgRUMyIGluc3RhbmNlLCBhbmQgaXRzIEVCUyBkYXRhIHZvbHVtZSAoZGF0YWJhc2VzLCByZWdpc3RyeSwgcGx1Z2luIGJ1aWxkcykuIElycmV2ZXJzaWJsZS4nLFxuICAgIGhvc3RQb3J0czogW10sIC8vIHJlbW90ZSAoQVdTKSDigJQgYmluZHMgbm90aGluZyBvbiB0aGUgb3BlcmF0b3IncyBtYWNoaW5lXG4gIH0sXG4gIGVrczoge1xuICAgIGlkOiAnZWtzJyxcbiAgICBsYWJlbDogJ0FXUyBFS1MgQXV0byBNb2RlIChtYW5hZ2VkIEt1YmVybmV0ZXMpJyxcbiAgICBkaXI6ICdkZXBsb3kvYXdzL2VrcycsXG4gICAgZW50cnlwb2ludDogJ2Jpbi9zZXR1cC5zaCcsXG4gICAgc3BhcnNlUGF0aHM6IFsnZGVwbG95L2F3cy9la3MnXSxcbiAgICByZXF1aXJlZDogW0RPTUFJTiwgSE9TVEVEX1pPTkVdLFxuICAgIG9wdGlvbmFsOiBbUkVHSU9OLCBERVBMT1lfTU9ERSwgR0hDUl9UT0tFTiwgQ0xVU1RFUl9OQU1FLCBBVVRPX0lOSVQsIE5PX0FVVE9fSU5JVCwgLi4uRU1BSUxdLFxuICAgIHBvc3REZXBsb3k6ICcuL2RlcGxveS9iaW4vaW5pdC1wbGF0Zm9ybS5zaCBla3MgICMgYXV0by1ydW5zIGF0IHRoZSBlbmQgb2Ygc2V0dXAuc2ggYnkgZGVmYXVsdDsgLS1uby1hdXRvLWluaXQgdG8gZG8gaXQgbWFudWFsbHknLFxuICAgIGNvc3Q6ICd+JDE1MC00MDAvbW8nLFxuICAgIGJlc3RGb3I6ICdQcm9kdWN0aW9uJyxcbiAgICBkZXBsb3lzOiAndGhlIHBsYXRmb3JtIG9uIEFtYXpvbiBFS1MgQXV0byBNb2RlIOKAlCBhbiBBV1MtbWFuYWdlZCBLdWJlcm5ldGVzIGNsdXN0ZXIgKEthcnBlbnRlci1zY2FsZWQgRUMyIG5vZGVzLCBBV1MgTG9hZCBCYWxhbmNlciBDb250cm9sbGVyLCBFQlMvRUZTIENTSSksIHRoZSBzYW1lIEt1YmVybmV0ZXMgd29ya2xvYWRzIGFzIHRoZSBvdGhlciBrOHMgdGFyZ2V0cywgYW4gQUxCIEluZ3Jlc3MgKyBBQ00gZm9yIHRoZSBkb21haW4sIGFuZCAoYnkgZGVmYXVsdCkgU0VTIGVtYWlsLiBQbHVnaW4gYnVpbGRzIHJ1biBvbiB0aGUgaW4tY2x1c3RlciByb290bGVzcyBidWlsZGtpdGQgKEVDMiBub2RlcyBhbGxvdyBpdCkuJyxcbiAgICBkZXN0cm95czogJ1J1bnMgYmluL3NodXRkb3duLnNoOiBERUxFVEVTIHRoZSBFS1MgY2x1c3RlciArIG5vZGVzIChla3NjdGwpLCB0aGUgRUZTIGZpbGVzeXN0ZW0sIGFuZCDigJQgd2hlbiAtLWRvbWFpbiBpcyBzZXQg4oCUIHRoZSBBQ00gY2VydCArIFJvdXRlIDUzIGFsaWFzLiBFQlMgdm9sdW1lcyBvbiB0aGUgUmV0YWluIFN0b3JhZ2VDbGFzcyBhcmUgTk9UIGF1dG8tZGVsZXRlZCAocmVwb3J0ZWQgYXQgdGhlIGVuZCkuIElycmV2ZXJzaWJsZS4nLFxuICAgIGhvc3RQb3J0czogW10sIC8vIHJlbW90ZSAoQVdTKSDigJQgYmluZHMgbm90aGluZyBvbiB0aGUgb3BlcmF0b3IncyBtYWNoaW5lXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgVEFSR0VUX0lEUzogcmVhZG9ubHkgVGFyZ2V0SWRbXSA9IFsnZG9ja2VyJywgJ21pbmlrdWJlJywgJ2VjMicsICdla3MnXTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzVGFyZ2V0SWQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBUYXJnZXRJZCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIChUQVJHRVRfSURTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyh2YWx1ZSk7XG59XG5cbi8vIC0tLSBTcGFyc2UgYm9vdHN0cmFwIHBhdGhzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBGb2xkZXJzIGV2ZXJ5IGAtLXJlcG9gIGJvb3RzdHJhcCBuZWVkcyByZWdhcmRsZXNzIG9mIHRhcmdldDogdGhlIG9yY2hlc3RyYXRpb25cbiAqIHNjcmlwdHMuIEVhY2ggdGFyZ2V0J3Mgc2V0dXAuc2ggKyBpbml0LXBsYXRmb3JtLnNoIGxpdmUgaW4gLyBkcml2ZSB0aGVzZS5cbiAqIERlbGliZXJhdGVseSBtaW5pbWFsIOKAlCBoZWF2aWVyIGZvbGRlcnMgKHBsdWdpbnMvY29tcGxpYW5jZS9zYW1wbGVzKSBhcmUgcHVsbGVkXG4gKiBpbiBvbmx5IHdoZW4gdGhlaXIgcG9zdC1pbnN0YWxsIG9wdGlvbiBpcyBzZWxlY3RlZCAoc2VlIExPQURfU1RFUFMpLlxuICovXG5leHBvcnQgY29uc3QgQ09NTU9OX1NQQVJTRV9QQVRIUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbJ2RlcGxveS9iaW4nXTtcblxuLyoqXG4gKiBUaGUgbWFuYWdlZCB0b29sY2hhaW4gcmVsZWFzZSdzIGJ1aWxkIGlucHV0czogaW5pdC1wbGF0Zm9ybS5zaCBhbHdheXMgYnVpbGRzXG4gKiBgYnVpbGQtcGx1Z2luLWltYWdlcy5zaCAtLW9ubHkgcGlwZWxpbmUtYm9vdHN0cmFwLGNkay1zeW50aGAgKGFmdGVyIHRoZSBgX2Jhc2VgXG4gKiBpbWFnZXMpLCBhbmQgYC0tYnVpbGQtYm9vdHN0cmFwYCBydW5zIGAtLW9ubHkgcGlwZWxpbmUtYm9vdHN0cmFwYCwgc28gZXZlcnlcbiAqIGNsb25lIHRoYXQgcnVucyBlaXRoZXIgbmVlZHMgdGhlc2UgZm9sZGVycyDigJQgd2l0aCBvciB3aXRob3V0IGAtLXdpdGgtcGx1Z2luc2AuXG4gKiBUaGUgcmVsZWFzZSBoYXMgaXRzIG93biBzb3VyY2Ugcm9vdCwgYGRlcGxveS90b29sY2hhaW5gIChib3RoIGhhbHZlcyksIGJlc2lkZVxuICogdGhlIHBsdWdpbiBjYXRhbG9nOyBvZiB0aGUgY2F0YWxvZyBpdCBuZWVkcyBvbmx5IHRoZSBgX2Jhc2VgIGltYWdlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IFRPT0xDSEFJTl9TUEFSU0VfUEFUSFM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAnZGVwbG95L3BsdWdpbnMvX2Jhc2UnLFxuICAnZGVwbG95L3Rvb2xjaGFpbicsXG5dO1xuXG4vKipcbiAqIE9wdC1pbiBwb3N0LWluc3RhbGwgbG9hZCBzdGVwcy4gRWFjaCBtYXBzIGEgcHJvdmlzaW9uIGAtLXdpdGgtKmAgZmxhZyB0byB0aGVcbiAqIGluaXQtcGxhdGZvcm0gZW52IHZhciB0aGF0IGVuYWJsZXMgaXQgQU5EIHRoZSByZXBvIGZvbGRlcihzKSBpdCByZWFkcyDigJQgc28gdGhlXG4gKiBzcGFyc2UgY2hlY2tvdXQgZ3Jvd3MgZXhhY3RseSB3aXRoIHRoZSBzZWxlY3RlZCBvcHRpb25zLlxuICovXG5leHBvcnQgY29uc3QgTE9BRF9TVEVQUyA9IFtcbiAgLy8gVGhlIGNhdGFsb2cuIFRoZSB0b29sY2hhaW4gcmVsZWFzZSAoZGVwbG95L3Rvb2xjaGFpbikgYW5kIHRoZSBfYmFzZSBpbWFnZXMgaXRcbiAgLy8gYnVpbGRzIG9uIGFyZSBhbHdheXMgaW4gdGhlIGNsb25lIChUT09MQ0hBSU5fU1BBUlNFX1BBVEhTKS5cbiAgeyBpZDogJ3BsdWdpbnMnLCBmbGFnOiAnd2l0aFBsdWdpbnMnLCBlbnY6ICdMT0FEX1BMVUdJTlMnLCBwYXRoczogWydkZXBsb3kvcGx1Z2lucyddIH0sXG4gIHsgaWQ6ICdjb21wbGlhbmNlJywgZmxhZzogJ3dpdGhDb21wbGlhbmNlJywgZW52OiAnTE9BRF9DT01QTElBTkNFJywgcGF0aHM6IFsnZGVwbG95L2NvbXBsaWFuY2UnXSB9LFxuICB7IGlkOiAnc2FtcGxlcycsIGZsYWc6ICd3aXRoU2FtcGxlcycsIGVudjogJ0xPQURfVEVNUExBVEVTJywgcGF0aHM6IFsnZGVwbG95L3NhbXBsZXMnXSB9LFxuXSBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgTG9hZFN0ZXBJZCA9ICh0eXBlb2YgTE9BRF9TVEVQUylbbnVtYmVyXVsnaWQnXTtcblxuLyoqXG4gKiBUaGUgZGUtZHVwbGljYXRlZCBzZXQgb2Ygc3BhcnNlIHBhdGhzIGZvciBhIHRhcmdldCBwbHVzIHRoZSBlbmFibGVkIGxvYWRcbiAqIHN0ZXBzOiBjb21tb24gYmFzZSDiiKogdGFyZ2V0IGZvbGRlcihzKSDiiKogdGhlIHRvb2xjaGFpbiBidWlsZCBpbnB1dHMg4oiqIGVhY2hcbiAqIGVuYWJsZWQgc3RlcCdzIGZvbGRlcihzKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVBhdGhzRm9yKHRhcmdldDogVGFyZ2V0SWQsIGVuYWJsZWRMb2FkSWRzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgcGF0aHMgPSBuZXcgU2V0PHN0cmluZz4oQ09NTU9OX1NQQVJTRV9QQVRIUyk7XG4gIGZvciAoY29uc3QgcCBvZiBUQVJHRVRTW3RhcmdldF0uc3BhcnNlUGF0aHMpIHBhdGhzLmFkZChwKTtcbiAgZm9yIChjb25zdCBwIG9mIFRPT0xDSEFJTl9TUEFSU0VfUEFUSFMpIHBhdGhzLmFkZChwKTtcbiAgZm9yIChjb25zdCBzdGVwIG9mIExPQURfU1RFUFMpIHtcbiAgICBpZiAoZW5hYmxlZExvYWRJZHMuaW5jbHVkZXMoc3RlcC5pZCkpIGZvciAoY29uc3QgcCBvZiBzdGVwLnBhdGhzKSBwYXRocy5hZGQocCk7XG4gIH1cbiAgcmV0dXJuIFsuLi5wYXRoc107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZW1ibGVSZXN1bHQge1xuICAvKiogVGhlIGV4YWN0IGNvbW1hbmQgdG8gcnVuIOKAlCBzZWNyZXRzIG1hc2tlZCBhcyBgKioqYC4gKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuICAvKiogUmVxdWlyZWQgaW5wdXRzIHRoYXQgd2VyZSBub3Qgc3VwcGxpZWQuICovXG4gIHJlYWRvbmx5IG1pc3Npbmc6IHJlYWRvbmx5IElucHV0U3BlY1tdO1xufVxuXG4vKipcbiAqIFF1b3RlIG9ubHkgd2hlbiB0aGUgdmFsdWUgd291bGQgb3RoZXJ3aXNlIGJlIHdvcmQtc3BsaXQgb3IgbWlzLXBhcnNlZCBieSB0aGVcbiAqIHNoZWxsICh3aGl0ZXNwYWNlIG9yIGVtYmVkZGVkIHF1b3RlcykuIGBhc3NlcnRTaGVsbFNhZmVgIGFscmVhZHkgcmVqZWN0cyB0aGVcbiAqIGRhbmdlcm91cyBtZXRhY2hhcmFjdGVycywgc28gc2ltcGxlIHRva2VucyBzdGF5IHVucXVvdGVkIGZvciByZWFkYWJpbGl0eS5cbiAqL1xuZnVuY3Rpb24gbWF5YmVTaGVsbFF1b3RlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gL1tcXHMnXCJdLy50ZXN0KHZhbHVlKSA/IHNoZWxsUXVvdGUodmFsdWUpIDogdmFsdWU7XG59XG5cbi8qKlxuICogQXNzZW1ibGUgdGhlIGRlcGxveSBjb21tYW5kIGZvciBhIHRhcmdldCBmcm9tIHRoZSBwcm92aWRlZCBwYXJhbXMuIFB1cmUgYW5kXG4gKiBkZXRlcm1pbmlzdGljIOKAlCBubyBzaGVsbCwgbm8gTExNLiBNaXNzaW5nIHJlcXVpcmVkIGlucHV0cyBhcmUgcmVwb3J0ZWQgKG5ldmVyXG4gKiBndWVzc2VkKS4gQnkgZGVmYXVsdCBzZWNyZXRzIGFyZSBtYXNrZWQgKGAqKipgKSBmb3IgRElTUExBWTsgcGFzcyBgbWFzazogZmFsc2VgXG4gKiB0byBidWlsZCB0aGUgcmVhbCBjb21tYW5kIGZvciBFWEVDVVRJT04g4oCUIHRoYXQgc3RyaW5nIG11c3QgbmV2ZXIgYmUgbG9nZ2VkIG9yXG4gKiBzaG93biB0byB0aGUgbW9kZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlbWJsZUNvbW1hbmQoXG4gIHRhcmdldDogVGFyZ2V0U3BlYyxcbiAgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgb3B0czogeyBtYXNrPzogYm9vbGVhbiB9ID0ge30sXG4pOiBBc3NlbWJsZVJlc3VsdCB7XG4gIGNvbnN0IG1hc2sgPSBvcHRzLm1hc2sgPz8gdHJ1ZTtcbiAgY29uc3QgcHJvdmlkZWQgPSAoc3BlYzogSW5wdXRTcGVjKTogYm9vbGVhbiA9PiB7XG4gICAgY29uc3QgdiA9IHBhcmFtc1tzcGVjLmtleV07XG4gICAgcmV0dXJuIHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSAnJyAmJiB2ICE9PSBmYWxzZTtcbiAgfTtcblxuICBjb25zdCBtaXNzaW5nID0gdGFyZ2V0LnJlcXVpcmVkLmZpbHRlcigoc3BlYykgPT4gIXByb3ZpZGVkKHNwZWMpKTtcblxuICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbYGNkICR7dGFyZ2V0LmRpcn0gJiYgYmFzaCAke3RhcmdldC5lbnRyeXBvaW50fWBdO1xuICBmb3IgKGNvbnN0IHNwZWMgb2YgWy4uLnRhcmdldC5yZXF1aXJlZCwgLi4udGFyZ2V0Lm9wdGlvbmFsXSkge1xuICAgIGlmICghcHJvdmlkZWQoc3BlYykpIGNvbnRpbnVlO1xuICAgIGlmIChzcGVjLmJvb2xlYW4pIHtcbiAgICAgIHBhcnRzLnB1c2goYC0tJHtzcGVjLmZsYWd9YCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgcmF3ID0gU3RyaW5nKHBhcmFtc1tzcGVjLmtleV0pO1xuICAgIC8vIFRoZSBhc3NlbWJsZWQgY29tbWFuZCBpcyBleGVjdXRlZCB2aWEgYSBzaGVsbCAocnVuU2NyaXB0KSwgc28gYSBwYXJhbVxuICAgIC8vIHZhbHVlIGNhcnJ5aW5nIHNoZWxsIG1ldGFjaGFyYWN0ZXJzIHdvdWxkIGJlIGNvbW1hbmQgaW5qZWN0aW9uLiBWYWxpZGF0ZVxuICAgIC8vIHRoZSBSRUFMIHZhbHVlIGV2ZW4gd2hlbiBtYXNraW5nIGZvciBkaXNwbGF5IOKAlCB0aGUgZXhlY3V0ZWQgY29tbWFuZCB1c2VzXG4gICAgLy8gdGhlIHVubWFza2VkIHZhbHVlLiBSZWRhY3Qgc2VjcmV0cyBzbyB0aGUgZXJyb3IgbmV2ZXIgZWNob2VzIGEgdG9rZW4uXG4gICAgYXNzZXJ0U2hlbGxTYWZlKHJhdywgYC0tJHtzcGVjLmZsYWd9YCwgeyByZWRhY3RWYWx1ZTogc3BlYy5zZWNyZXQgfSk7XG4gICAgLy8gYXNzZXJ0U2hlbGxTYWZlIHN0aWxsIHBlcm1pdHMgc3BhY2VzIGFuZCBxdW90ZXMgKGUuZy4gLS1lbWFpbC1mcm9tLW5hbWVcbiAgICAvLyBcIlBpcGVsaW5lIEJ1aWxkZXJcIiwgb3IgTydCcmllbiksIHdoaWNoIHdvdWxkIHdvcmQtc3BsaXQgd2hlbiBlbWl0dGVkIGJhcmU7XG4gICAgLy8gcXVvdGUgdGhvc2Ugc28gdGhlIHZhbHVlIHJlYWNoZXMgdGhlIHNjcmlwdCBhcyBhIHNpbmdsZSBhcmd1bWVudC5cbiAgICBjb25zdCB2YWx1ZSA9IHNwZWMuc2VjcmV0ICYmIG1hc2sgPyAnKioqJyA6IG1heWJlU2hlbGxRdW90ZShyYXcpO1xuICAgIHBhcnRzLnB1c2goYC0tJHtzcGVjLmZsYWd9ICR7dmFsdWV9YCk7XG4gIH1cblxuICByZXR1cm4geyBjb21tYW5kOiBwYXJ0cy5qb2luKCcgXFxcXFxcbiAgJyksIG1pc3NpbmcgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZWFyZG93blJlc3VsdCB7XG4gIC8qKiBUaGUgZXhhY3QgdGVhcmRvd24gY29tbWFuZCB0byBydW4uICovXG4gIHJlYWRvbmx5IGNvbW1hbmQ6IHN0cmluZztcbiAgLyoqIFdoZXRoZXIgdGhpcyB0ZWFyZG93biBpcnJldmVyc2libHkgZGVzdHJveXMgZGF0YSAoQVdTIHRhcmdldHMpLiAqL1xuICByZWFkb25seSBkZXN0cnVjdGl2ZTogYm9vbGVhbjtcbn1cblxuLyoqIENsb3VkRm9ybWF0aW9uIHN0YWNrIG5hbWUgdGhlIEVDMiBzZXR1cC5zaCBkZWZhdWx0cyB0by4gKi9cbmNvbnN0IERFRkFVTFRfRUMyX1NUQUNLID0gJ3BpcGVsaW5lLWJ1aWxkZXInO1xuLyoqIEVLUyBjbHVzdGVyIG5hbWUgZWtzY3RsIGRlZmF1bHRzIHRvLiAqL1xuY29uc3QgREVGQVVMVF9FS1NfQ0xVU1RFUiA9ICdwaXBlbGluZS1idWlsZGVyJztcblxuLyoqXG4gKiBBc3NlbWJsZSB0aGUgdGVhcmRvd24gY29tbWFuZCBmb3IgYSB0YXJnZXQuIFB1cmUgYW5kIGRldGVybWluaXN0aWMg4oCUIG1pcnJvcnNcbiAqIGBhc3NlbWJsZUNvbW1hbmRgIGZvciB0aGUgZGVzdHJveSBwYXRoLiBsb2NhbC9taW5pa3ViZSBTVE9QIHRoZSBzdGFja1xuICogKG5vbi1kZXN0cnVjdGl2ZSDigJQgb24tZGlzayAvIFBWQyBkYXRhIHN1cnZpdmVzKTsgZWMyIERFTEVURXMgaXRzIENsb3VkRm9ybWF0aW9uXG4gKiBzdGFjayBhbmQgZWtzIERFTEVURXMgaXRzIGNsdXN0ZXIgKGVrc2N0bCkg4oCUIGJvdGggaXJyZXZlcnNpYmxlLiBFQzIgYGRlbGV0ZS1zdGFja2BcbiAqIGFuZCBgZWtzY3RsIGRlbGV0ZSBjbHVzdGVyYCBoYXZlIG5vIG5hdGl2ZSBwcm9tcHQsIHdoaWNoIGlzIGV4YWN0bHkgd2h5IHRoZSBhZ2VudCdzXG4gKiB0eXBlZC1jb25maXJtYXRpb24gZ2F0ZSBpcyBtYW5kYXRvcnkgdGhlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZWFyZG93bkNvbW1hbmQoXG4gIHRhcmdldDogVGFyZ2V0SWQsXG4gIG9wdHM6IHsgc3RhY2tOYW1lPzogc3RyaW5nOyBjbHVzdGVyTmFtZT86IHN0cmluZzsgcmVnaW9uPzogc3RyaW5nOyBkb21haW4/OiBzdHJpbmc7IGhvc3RlZFpvbmVJZD86IHN0cmluZzsgYXNzdW1lWWVzPzogYm9vbGVhbiB9ID0ge30sXG4pOiBUZWFyZG93blJlc3VsdCB7XG4gIGNvbnN0IHJlZ2lvbiA9IHJlc29sdmVBd3NSZWdpb24ob3B0cy5yZWdpb24pO1xuICAvLyBBbnl0aGluZyBmbG93aW5nIHVucXVvdGVkIGludG8gYSBzaGVsbC1leGVjdXRlZCB0ZWFyZG93biBjb21tYW5kIGlzIHJlamVjdGVkXG4gIC8vIGZvciBzaGVsbCBtZXRhY2hhcmFjdGVycyAobWlycm9ycyBhc3NlbWJsZUNvbW1hbmQpLlxuICBhc3NlcnRTaGVsbFNhZmUocmVnaW9uLCAncmVnaW9uJyk7XG4gIGlmIChvcHRzLnN0YWNrTmFtZSkgYXNzZXJ0U2hlbGxTYWZlKG9wdHMuc3RhY2tOYW1lLCAnc3RhY2stbmFtZScpO1xuICBpZiAob3B0cy5jbHVzdGVyTmFtZSkgYXNzZXJ0U2hlbGxTYWZlKG9wdHMuY2x1c3Rlck5hbWUsICdjbHVzdGVyLW5hbWUnKTtcbiAgaWYgKG9wdHMuZG9tYWluKSBhc3NlcnRTaGVsbFNhZmUob3B0cy5kb21haW4sICdkb21haW4nKTtcbiAgaWYgKG9wdHMuaG9zdGVkWm9uZUlkKSBhc3NlcnRTaGVsbFNhZmUob3B0cy5ob3N0ZWRab25lSWQsICdob3N0ZWQtem9uZS1pZCcpO1xuICBzd2l0Y2ggKHRhcmdldCkge1xuICAgIGNhc2UgJ2RvY2tlcic6XG4gICAgICByZXR1cm4geyBjb21tYW5kOiAnY2QgZGVwbG95L2xvY2FsL2RvY2tlciAmJiBiYXNoIGJpbi9zaHV0ZG93bi5zaCcsIGRlc3RydWN0aXZlOiBmYWxzZSB9O1xuICAgIGNhc2UgJ21pbmlrdWJlJzpcbiAgICAgIHJldHVybiB7IGNvbW1hbmQ6ICdjZCBkZXBsb3kvbG9jYWwvbWluaWt1YmUgJiYgYmFzaCBiaW4vc2h1dGRvd24uc2gnLCBkZXN0cnVjdGl2ZTogZmFsc2UgfTtcbiAgICBjYXNlICdlYzInOiB7XG4gICAgICBjb25zdCBzdGFjayA9IG9wdHMuc3RhY2tOYW1lIHx8IERFRkFVTFRfRUMyX1NUQUNLO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29tbWFuZDpcbiAgICAgICAgICBgYXdzIGNsb3VkZm9ybWF0aW9uIGRlbGV0ZS1zdGFjayAtLXN0YWNrLW5hbWUgJHtzdGFja30gLS1yZWdpb24gJHtyZWdpb259ICYmIGAgK1xuICAgICAgICAgIGBhd3MgY2xvdWRmb3JtYXRpb24gd2FpdCBzdGFjay1kZWxldGUtY29tcGxldGUgLS1zdGFjay1uYW1lICR7c3RhY2t9IC0tcmVnaW9uICR7cmVnaW9ufWAsXG4gICAgICAgIGRlc3RydWN0aXZlOiB0cnVlLFxuICAgICAgfTtcbiAgICB9XG4gICAgY2FzZSAnZWtzJzoge1xuICAgICAgLy8gZWtzIHRlYXJzIGRvd24gdmlhIGJpbi9zaHV0ZG93bi5zaCAobGlrZSBsb2NhbC9taW5pa3ViZSB1c2UgYmluL3NodXRkb3duLnNoKTpcbiAgICAgIC8vIGl0IGRlbGV0ZXMgdGhlIGNsdXN0ZXIgQU5EIHRoZSByZXNvdXJjZXMgZWtzY3RsIGFsb25lIHdvdWxkIG9ycGhhbiDigJQgdGhlIEVGU1xuICAgICAgLy8gZmlsZXN5c3RlbSBhbmQsIHdoZW4gLS1kb21haW4gaXMgZ2l2ZW4sIHRoZSBBQ00gY2VydCArIFJvdXRlIDUzIGFsaWFzLiBUaGVcbiAgICAgIC8vIGFnZW50J3MgdHlwZWQtY29uZmlybWF0aW9uIGdhdGUgYWxyZWFkeSByYW4sIHNvIHBhc3MgLS15ZXMgdG8gc2tpcCB0aGVcbiAgICAgIC8vIHNjcmlwdCdzIG93biBwcm9tcHQuXG4gICAgICBjb25zdCBjbHVzdGVyID0gb3B0cy5jbHVzdGVyTmFtZSB8fCBERUZBVUxUX0VLU19DTFVTVEVSO1xuICAgICAgbGV0IGNvbW1hbmQgPSBgY2QgZGVwbG95L2F3cy9la3MgJiYgYmFzaCBiaW4vc2h1dGRvd24uc2ggLS1jbHVzdGVyLW5hbWUgJHtjbHVzdGVyfSAtLXJlZ2lvbiAke3JlZ2lvbn1gO1xuICAgICAgaWYgKG9wdHMuZG9tYWluKSBjb21tYW5kICs9IGAgLS1kb21haW4gJHtvcHRzLmRvbWFpbn1gO1xuICAgICAgaWYgKG9wdHMuaG9zdGVkWm9uZUlkKSBjb21tYW5kICs9IGAgLS1ob3N0ZWQtem9uZS1pZCAke29wdHMuaG9zdGVkWm9uZUlkfWA7XG4gICAgICBpZiAob3B0cy5hc3N1bWVZZXMpIGNvbW1hbmQgKz0gJyAtLXllcyc7XG4gICAgICByZXR1cm4geyBjb21tYW5kLCBkZXN0cnVjdGl2ZTogdHJ1ZSB9O1xuICAgIH1cbiAgfVxufVxuIl19
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sources":["../src/cli.ts"],"names":[],"mappings":";AAwDA;;GAEG;AACH,UAAU,UAAU;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wGAAwG;AACxG,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAEpD;AAsVD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,UAAe,GAAG,IAAI,CA0D5D;AAiDD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,IAAI,CAAC,OAAO,GAAE,UAAe,GAAG,IAAI,CA0BnD"}
1
+ {"version":3,"file":"cli.d.ts","sources":["../src/cli.ts"],"names":[],"mappings":";AA6DA;;GAEG;AACH,UAAU,UAAU;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wGAAwG;AACxG,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAEpD;AA6VD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,UAAe,GAAG,IAAI,CA0D5D;AAiDD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,IAAI,CAAC,OAAO,GAAE,UAAe,GAAG,IAAI,CA0BnD"}
package/dist/cli.js CHANGED
@@ -17,8 +17,10 @@ import { instantiateTemplate } from './commands/instantiate-template.js';
17
17
  import { listPipelines } from './commands/list-pipelines.js';
18
18
  import { listPlugins } from './commands/list-plugins.js';
19
19
  import { login } from './commands/login.js';
20
+ import { logout } from './commands/logout.js';
20
21
  import { newPlugin } from './commands/new-plugin.js';
21
22
  import { orgExport } from './commands/org-export.js';
23
+ import { deletePipeline, deregisterPipeline } from './commands/pipeline-remove.js';
22
24
  import { deprecatePlugin, yankPlugin } from './commands/plugin-lifecycle.js';
23
25
  import { provision } from './commands/provision.js';
24
26
  import { publishPlugin } from './commands/publish-plugin.js';
@@ -31,13 +33,14 @@ import { status } from './commands/status.js';
31
33
  import { storeToken } from './commands/store-token.js';
32
34
  import { synth } from './commands/synth.js';
33
35
  import { testPlugin } from './commands/test-plugin.js';
36
+ import { toolchain } from './commands/toolchain.js';
34
37
  import { registerUpgradeOption } from './commands/upgrade.js';
35
38
  import { uploadPlugin } from './commands/upload-plugin.js';
36
39
  import { validatePlugin } from './commands/validate-plugin.js';
37
40
  import { validateTemplatesCommand } from './commands/validate-templates.js';
38
41
  import { verifyPlugins } from './commands/verify-plugins.js';
39
42
  import { version } from './commands/version.js';
40
- import { APP_NAME, APP_DESCRIPTION, APP_VERSION, ENV_VARS, isDebugMode, generateExecutionId, } from './config/cli.constants.js';
43
+ import { APP_NAME, APP_DESCRIPTION, APP_VERSION, ENV_VARS, isDebugMode, generateExecutionId, meetsNodeVersionFloor, NODE_VERSION_FLOOR, } from './config/cli.constants.js';
41
44
  import { banner, miniBanner } from './utils/banner.js';
42
45
  import { getApiConfig } from './utils/config-loader.js';
43
46
  import { loadSession } from './utils/credential-store.js';
@@ -63,9 +66,8 @@ function checkEnvironment({ signInRelevant = true } = {}) {
63
66
  }
64
67
  // Check Node version
65
68
  const nodeVersion = process.version;
66
- const majorVersion = parseInt(nodeVersion.slice(1).split('.')[0] || '0', 10);
67
- if (majorVersion < 24) {
68
- warnings.push(`Node.js ${nodeVersion} detected - version 24+ required (see package.json engines)`);
69
+ if (!meetsNodeVersionFloor(nodeVersion)) {
70
+ warnings.push(`Node.js ${nodeVersion} detected - version ${NODE_VERSION_FLOOR}+ required (see package.json engines)`);
69
71
  }
70
72
  // Display warnings
71
73
  if (warnings.length > 0) {
@@ -109,14 +111,16 @@ function displayStartupInfo(options) {
109
111
  /** Top-level `--help` epilogue: command groups, auth, env vars, examples, exit codes. */
110
112
  const HELP_TEXT = `
111
113
  Command groups:
112
- auth Authenticate and manage credentials (login, pat)
113
- pipeline Create, inspect, and deploy pipelines (create, list, get, register, synth, deploy)
114
+ auth Authenticate and manage credentials (login, logout, pat)
115
+ pipeline Create, inspect, and deploy pipelines (create, list, get, register, deregister, delete, synth, deploy)
114
116
  plugin Author, validate, and publish plugins (new, validate, test, publish, upload, get, list, deprecate, yank, verify)
115
117
  template Instantiate golden-path pipeline templates and validate {{ ... }} syntax (instantiate, validate)
116
118
  infra Set up and operate platform infrastructure (bootstrap, setup-events, redrive-events, store-token, provision)
117
119
  audit Operator audits, cron-friendly (tokens, stacks)
118
120
  org Organization data operations (export)
119
121
  security-report Upload SARIF / trivy / grype reports produced inside a pipeline (upload)
122
+ report Stakeholder reports (list, create, run, publish, link, pdf, transfer)
123
+ toolchain The pipeline toolchain release (export)
120
124
  status / version / completions
121
125
 
122
126
  Authentication:
@@ -162,6 +166,7 @@ function registerTaskNamespaces() {
162
166
  // auth — authenticate and manage credentials
163
167
  const auth = program.command('auth').description('Authenticate and manage credentials');
164
168
  login(auth); // auth login — browser (device-authorization) sign-in, stored locally
169
+ logout(auth); // auth logout — revoke the stored session on the platform and delete it locally
165
170
  createPat(auth); // auth pat — create a named access key (device sign-in + browser step-up)
166
171
  // pipeline — create, inspect, and deploy pipelines
167
172
  const pipeline = program.command('pipeline').description('Create, inspect, and deploy pipelines');
@@ -169,6 +174,8 @@ function registerTaskNamespaces() {
169
174
  listPipelines(pipeline); // pipeline list
170
175
  getPipeline(pipeline); // pipeline get
171
176
  register(pipeline); // pipeline register — re-register a deployed ARN + drain pending intents
177
+ deregisterPipeline(pipeline); // pipeline deregister — remove a registry row (audit stacks' missing-stack fix)
178
+ deletePipeline(pipeline); // pipeline delete — delete a pipeline configuration
172
179
  synth(pipeline); // pipeline synth — CDK synthesis from pipeline config
173
180
  deploy(pipeline); // pipeline deploy — CDK deploy (--app prints boilerplate path)
174
181
  // plugin — author, validate, and publish plugins
@@ -198,6 +205,8 @@ function registerTaskNamespaces() {
198
205
  const audit = program.command('audit').description('Operator audits (cron-friendly: exit 1 on findings)');
199
206
  auditTokens(audit); // audit tokens — expiring platform tokens in Secrets Manager
200
207
  auditStacks(audit); // audit stacks — CFN stacks vs pipeline_registry drift
208
+ // toolchain — the pipeline toolchain release (pipeline-bootstrap + cdk-synth)
209
+ toolchain(program); // toolchain export — the resolved release as JSON, for deploy --local-spec
201
210
  // org — organization data operations
202
211
  const org = program.command('org').description('Organization data operations');
203
212
  orgExport(org); // org export — GDPR portability export
@@ -517,4 +526,4 @@ if (isMainModule) {
517
526
  scheduleUpdateNotice();
518
527
  main(options);
519
528
  }
520
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlcyI6WyIuLi9zcmMvY2xpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzlELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDL0QsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDNUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNoRCxPQUFPLEVBQ0wsUUFBUSxFQUNSLGVBQWUsRUFDZixXQUFXLEVBQ1gsUUFBUSxFQUNSLFdBQVcsRUFDWCxtQkFBbUIsR0FDcEIsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3hHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBZ0RoRSx3R0FBd0c7QUFDeEcsTUFBTSxVQUFVLFlBQVksQ0FBQyxJQUFjO0lBQ3pDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLFdBQVcsSUFBSSxDQUFDLEtBQUssaUJBQWlCLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztBQUMxSSxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLEVBQUUsY0FBYyxHQUFHLElBQUksRUFBRSxHQUFpQyxFQUFFO0lBQ3BGLE1BQU0sUUFBUSxHQUFhLEVBQUUsQ0FBQztJQUU5Qix1RUFBdUU7SUFDdkUsMkVBQTJFO0lBQzNFLDJFQUEyRTtJQUMzRSxJQUFJLGNBQWMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3hHLFFBQVEsQ0FBQyxJQUFJLENBQUMsc0RBQXNELENBQUMsQ0FBQztRQUN0RSxRQUFRLENBQUMsSUFBSSxDQUFDLDJFQUEyRSxDQUFDLENBQUM7SUFDN0YsQ0FBQztJQUVELHFCQUFxQjtJQUNyQixNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO0lBQ3BDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDN0UsSUFBSSxZQUFZLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDdEIsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLFdBQVcsNkRBQTZELENBQUMsQ0FBQztJQUNyRyxDQUFDO0lBRUQsbUJBQW1CO0lBQ25CLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN4QixZQUFZLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUNyQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3pCLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDbEIsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsa0JBQWtCLENBQUMsT0FBbUI7SUFDN0MsSUFBSSxPQUFPLENBQUMsS0FBSztRQUFFLE9BQU87SUFFMUIsTUFBTSxXQUFXLEdBQUcsbUJBQW1CLEVBQUUsQ0FBQztJQUUxQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3JDLFVBQVUsQ0FBQyxtQkFBbUIsRUFBRTtZQUM5QixJQUFJLEVBQUUsUUFBUTtZQUNkLE9BQU8sRUFBRSxXQUFXO1lBQ3BCLFdBQVc7WUFDWCxJQUFJLEVBQUUsT0FBTyxDQUFDLE9BQU87WUFDckIsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO1lBQzFCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtZQUNsQixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRTtZQUNsQixHQUFHLEVBQUU7Z0JBQ0gsS0FBSyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSztnQkFDeEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUEsQ0FBQyxDQUFDLFNBQVM7Z0JBQzlELEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLFNBQVM7YUFDMUQ7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO1NBQU0sQ0FBQztRQUNOLFVBQVUsQ0FBQyxjQUFjLEVBQUU7WUFDekIsT0FBTyxFQUFFLFdBQVc7WUFDcEIsV0FBVztTQUNaLENBQUMsQ0FBQztJQUNMLENBQUM7QUFDSCxDQUFDO0FBRUQseUZBQXlGO0FBQ3pGLE1BQU0sU0FBUyxHQUFHOzs7Ozs7Ozs7Ozs7O1NBYVQsUUFBUTs7O0tBR1osUUFBUSwrQkFBK0IsUUFBUSxDQUFDLGNBQWM7OztJQUcvRCxRQUFRLENBQUMsY0FBYztJQUN2QixRQUFRLENBQUMsaUJBQWlCO0lBQzFCLFFBQVEsQ0FBQyxlQUFlO0lBQ3hCLFFBQVEsQ0FBQyx1QkFBdUI7O0lBRWhDLFFBQVEsQ0FBQyxLQUFLOzs7TUFHWixRQUFRO01BQ1IsUUFBUTtNQUNSLFFBQVE7TUFDUixRQUFRO01BQ1IsUUFBUTtNQUNSLFFBQVE7TUFDUixRQUFRO01BQ1IsUUFBUTtNQUNSLFFBQVE7TUFDUixRQUFRO01BQ1IsUUFBUTs7Ozs7O09BTVAsUUFBUTtDQUNkLENBQUM7QUFFRjs7OztHQUlHO0FBQ0gsU0FBUyxzQkFBc0I7SUFDN0IsVUFBVSxDQUFDLDZCQUE2QixDQUFDLENBQUM7SUFFMUMsNkNBQTZDO0lBQzdDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7SUFDeEYsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsc0VBQXNFO0lBQ25GLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLDBFQUEwRTtJQUUzRixtREFBbUQ7SUFDbkQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxXQUFXLENBQUMsdUNBQXVDLENBQUMsQ0FBQztJQUNsRyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxrQkFBa0I7SUFDNUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCO0lBQ3pDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGVBQWU7SUFDdEMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMseUVBQXlFO0lBQzdGLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLHNEQUFzRDtJQUN2RSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQywrREFBK0Q7SUFFakYsaURBQWlEO0lBQ2pELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsV0FBVyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7SUFDOUYsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsaURBQWlEO0lBQ3BFLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLHVFQUF1RTtJQUMvRixVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxrRUFBa0U7SUFDdEYsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsNkVBQTZFO0lBQ3BHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLG9DQUFvQztJQUMxRCxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxhQUFhO0lBQ2hDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGNBQWM7SUFDbkMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMscURBQXFEO0lBQzlFLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLHdEQUF3RDtJQUM1RSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxzRUFBc0U7SUFFN0YsbUZBQW1GO0lBQ25GLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsV0FBVyxDQUFDLHVFQUF1RSxDQUFDLENBQUM7SUFDbEksbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQywrREFBK0Q7SUFDOUYsd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxvQkFBb0I7SUFFeEQscURBQXFEO0lBQ3JELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsV0FBVyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7SUFDakcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsc0NBQXNDO0lBQ3hELFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLG1EQUFtRDtJQUN2RSxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyw2REFBNkQ7SUFDbkYsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsMkRBQTJEO0lBQzlFLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGdFQUFnRTtJQUVsRiw4REFBOEQ7SUFDOUQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLENBQUMscURBQXFELENBQUMsQ0FBQztJQUMxRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyw2REFBNkQ7SUFDakYsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsdURBQXVEO0lBRTNFLHFDQUFxQztJQUNyQyxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBQy9FLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLHVDQUF1QztJQUV2RCxzRkFBc0Y7SUFDdEYseUZBQXlGO0lBQ3pGLHFGQUFxRjtJQUNyRixrRkFBa0Y7SUFDbEYsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRWhCLG9GQUFvRjtJQUNwRixjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDMUIsQ0FBQztBQUVELCtEQUErRDtBQUMvRCxTQUFTLGdCQUFnQixDQUFDLEtBQWE7SUFDckMsOEVBQThFO0lBQzlFLDBFQUEwRTtJQUMxRSwyRUFBMkU7SUFDM0UsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM1RCxNQUFNLElBQUksR0FBNkIsRUFBRSxDQUFDO0lBQzFDLEtBQUssTUFBTSxDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ25GLENBQUM7SUFDRCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLFFBQVEsS0FBSyxFQUFFLENBQUM7UUFDZCxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ1osc0VBQXNFO1lBQ3RFLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO2lCQUMvQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLDhCQUE4QixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQztpQkFDcEcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQzs7OzsyQkFJUyxXQUFXOzs7O0VBSXBDLEtBQUs7OzsyREFHb0QsQ0FBQyxDQUFDO1lBQ3ZELE1BQU07UUFDUixDQUFDO1FBQ0QsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUNYLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO2lCQUMvQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsV0FBVyxFQUFFLDBCQUEwQixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUM7aUJBQ2xGLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUM7OztvQkFHRSxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQzs7OztFQUlwQyxLQUFLOzs7MkNBR29DLENBQUMsQ0FBQztZQUN2QyxNQUFNO1FBQ1IsQ0FBQztRQUNELEtBQUssTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLEtBQUssR0FBRztnQkFDWiwrREFBK0QsV0FBVyxHQUFHO2dCQUM3RSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUMzQyxnRUFBZ0UsRUFBRSxTQUFTLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQzthQUNsRyxDQUFDO1lBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3Q0FBd0MsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDeEUsTUFBTTtRQUNSLENBQUM7UUFDRDtZQUNFLE9BQU8sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEtBQUssMkJBQTJCLENBQUMsQ0FBQztZQUNsRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7QUFDSCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGdCQUFnQjtJQUN2QixVQUFVLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUVuQyxvQkFBb0I7SUFDcEIsT0FBTztTQUNKLElBQUksQ0FBQyxRQUFRLENBQUM7U0FDZCxXQUFXLENBQUMsZUFBZSxDQUFDO1NBQzVCLE9BQU8sQ0FBQyxXQUFXLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixDQUFDO1NBQ3pELE1BQU0sQ0FBQyxTQUFTLEVBQUUsdUNBQXVDLEVBQUUsS0FBSyxDQUFDO1NBQ2pFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsMkJBQTJCLEVBQUUsS0FBSyxDQUFDO1NBQ3ZELE1BQU0sQ0FBQyxTQUFTLEVBQUUsOEJBQThCLEVBQUUsS0FBSyxDQUFDO1NBQ3hELE1BQU0sQ0FBQyxZQUFZLEVBQUUsd0JBQXdCLEVBQUUsS0FBSyxDQUFDO1NBQ3JELFdBQVcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFbkMsOEVBQThFO0lBQzlFLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRS9CLDBFQUEwRTtJQUMxRSw4RUFBOEU7SUFDOUUsK0VBQStFO0lBQy9FLDhCQUE4QjtJQUM5QixPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsRUFBRSxDQUFDLHFCQUFxQixDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFFakcsMENBQTBDO0lBQzFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqQixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQywyQ0FBMkM7SUFFNUQsc0JBQXNCLEVBQUUsQ0FBQztJQUV6QixvQkFBb0I7SUFDcEIsVUFBVSxDQUFDLGlDQUFpQyxDQUFDLENBQUM7SUFDOUMsT0FBTztTQUNKLE9BQU8sQ0FBQyxhQUFhLENBQUM7U0FDdEIsV0FBVyxDQUFDLDhDQUE4QyxDQUFDO1NBQzNELFFBQVEsQ0FBQyxTQUFTLEVBQUUsZ0NBQWdDLENBQUM7U0FDckQsTUFBTSxDQUFDLENBQUMsS0FBYSxFQUFFLEVBQUU7UUFDeEIsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFFTCxVQUFVLENBQUMsc0NBQXNDLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGtCQUFrQjtJQUN6Qiw2QkFBNkI7SUFDN0IsT0FBTyxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLEtBQVksRUFBRSxFQUFFO1FBQy9DLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhO1FBQ2hDLFVBQVUsQ0FBQyxvQkFBb0IsRUFBRTtZQUMvQixLQUFLLEVBQUUsS0FBSyxDQUFDLE9BQU87WUFDcEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1NBQ2pCLENBQUMsQ0FBQztRQUVILFdBQVcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLE9BQU8sRUFBRTtZQUN0QyxLQUFLLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQyxJQUFJLEVBQUUsSUFBSTtZQUNWLE9BQU8sRUFBRTtnQkFDUCxJQUFJLEVBQUUsbUJBQW1CO2FBQzFCO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxzQ0FBc0M7SUFDdEMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLE1BQWUsRUFBRSxFQUFFO1FBQ25ELE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhO1FBQ2hDLFVBQVUsQ0FBQyw2QkFBNkIsRUFBRTtZQUN4QyxNQUFNLEVBQUUsWUFBWSxDQUFDLE1BQU0sQ0FBQztTQUM3QixDQUFDLENBQUM7UUFFSCxNQUFNLEtBQUssR0FBRyxNQUFNLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUEsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBRTFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLE9BQU8sRUFBRTtZQUN0QyxLQUFLLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQyxJQUFJLEVBQUUsSUFBSTtZQUNWLE9BQU8sRUFBRTtnQkFDUCxJQUFJLEVBQUUsb0JBQW9CO2FBQzNCO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCx5QkFBeUI7SUFDekIsT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO1FBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhO1FBQzlCLFlBQVksQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQ3JELE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhO1FBQzlCLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxnQ0FBZ0M7SUFDckQsQ0FBQyxDQUFDLENBQUM7SUFFSCxpQkFBaUI7SUFDakIsT0FBTyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFO1FBQ3pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhO1FBQzlCLFlBQVksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQzdDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhO1FBQzlCLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxpQ0FBaUM7SUFDdEQsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUMsT0FBTyxHQUFlLEVBQUU7SUFDcEQsTUFBTSxFQUNKLFVBQVUsR0FBRyxJQUFJLEVBQ2pCLGFBQWEsR0FBRyxLQUFLLEVBQ3JCLEtBQUssR0FBRyxLQUFLLEVBQ2IsT0FBTyxHQUFHLEtBQUssRUFDZixLQUFLLEdBQUcsS0FBSyxFQUNiLE9BQU8sR0FBRyxLQUFLLEVBQ2YsVUFBVSxHQUFHLEtBQUssR0FDbkIsR0FBRyxPQUFPLENBQUM7SUFFWixzQkFBc0I7SUFDdEIsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQUNaLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQztJQUM3QixDQUFDO0lBRUQsaUJBQWlCO0lBQ2pCLElBQUksVUFBVSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekIsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixVQUFVLEVBQUUsQ0FBQztRQUNmLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxDQUFDO2dCQUNMLE9BQU8sRUFBRSxLQUFLO2dCQUNkLGVBQWUsRUFBRSxJQUFJO2dCQUNyQixhQUFhLEVBQUUsS0FBSyxJQUFJLE9BQU87Z0JBQy9CLGVBQWUsRUFBRSxLQUFLO2FBQ3ZCLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQsdUJBQXVCO0lBQ3ZCLGtCQUFrQixDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBRTlDLG9CQUFvQjtJQUNwQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxnQkFBZ0IsQ0FBQyxFQUFFLGNBQWMsRUFBRSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELHVCQUF1QjtJQUN2QixrQkFBa0IsRUFBRSxDQUFDO0lBRXJCLG9CQUFvQjtJQUNwQixJQUFJLENBQUM7UUFDSCxnQkFBZ0IsRUFBRSxDQUFDO1FBQ25CLFVBQVUsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsVUFBVSxDQUFDLDJCQUEyQixFQUFFO1lBQ3RDLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDO1NBQzNCLENBQUMsQ0FBQztRQUVILFdBQVcsQ0FBQyxLQUFLLEVBQUUsV0FBVyxDQUFDLGFBQWEsRUFBRTtZQUM1QyxLQUFLLEVBQUUsS0FBSyxJQUFJLFdBQVcsRUFBRTtZQUM3QixJQUFJLEVBQUUsSUFBSTtZQUNWLE9BQU8sRUFBRTtnQkFDUCxLQUFLLEVBQUUsZ0JBQWdCO2FBQ3hCO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsY0FBYztJQUNyQixJQUFJLENBQUM7UUFDSCxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU1QixtQ0FBbUM7UUFDbkMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3RCLFNBQVMsQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1lBQ3BELE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhO1lBQzlCLE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNyQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xCLENBQUM7UUFFRCwwQkFBMEI7UUFDMUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLElBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3hDLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLE9BQU8sQ0FBQyxDQUFDO1lBRTNFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDbkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWE7Z0JBQzlCLFVBQVUsQ0FBQyxvQkFBb0IsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWE7Z0JBQzlCLFNBQVMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO2dCQUNqQyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDN0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxHQUFHLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN6RCxDQUFDLENBQUMsQ0FBQztnQkFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYTtnQkFDOUIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQixDQUFDO1FBQ0gsQ0FBQztRQUVELFVBQVUsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsV0FBVyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsT0FBTyxFQUFFO1lBQ3RDLEtBQUssRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xDLElBQUksRUFBRSxJQUFJO1lBQ1YsT0FBTyxFQUFFO2dCQUNQLEtBQUssRUFBRSxrQkFBa0I7Z0JBQ3pCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTthQUNuQjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLFVBQVUsSUFBSSxDQUFDLE9BQU8sR0FBZSxFQUFFO0lBQzNDLElBQUksQ0FBQztRQUNILGlCQUFpQjtRQUNqQixhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFdkIsc0NBQXNDO1FBQ3RDLGNBQWMsRUFBRSxDQUFDO1FBRWpCLG1EQUFtRDtRQUNuRCxVQUFVLENBQUMsc0NBQXNDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLGdDQUFnQztRQUNoQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYTtRQUNoQyxVQUFVLENBQUMsaUJBQWlCLEVBQUU7WUFDNUIsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUM7U0FDM0IsQ0FBQyxDQUFDO1FBRUgsV0FBVyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsT0FBTyxFQUFFO1lBQ3RDLEtBQUssRUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDO1lBQzNCLElBQUksRUFBRSxJQUFJO1lBQ1YsT0FBTyxFQUFFO2dCQUNQLEtBQUssRUFBRSxNQUFNO2dCQUNiLE9BQU87YUFDUjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEMsTUFBTSxZQUFZLEdBQUcsYUFBYSxLQUFLLFNBQVM7T0FDM0MsWUFBWSxDQUFDLGFBQWEsQ0FBQyxLQUFLLFlBQVksQ0FBQyxhQUFhLENBQUMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNsRixJQUFJLFlBQVksRUFBRSxDQUFDO0lBQ2pCLHFEQUFxRDtJQUNyRCxNQUFNLE9BQU8sR0FBZTtRQUMxQixLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssTUFBTTtRQUNuQywwRUFBMEU7UUFDMUUsc0VBQXNFO1FBQ3RFLDJEQUEyRDtRQUMzRCxLQUFLLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO1FBQzNFLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7UUFDM0MsT0FBTyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxLQUFLLEdBQUc7UUFDNUUsVUFBVSxFQUFFLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNoRCxDQUFDO0lBRUYsdUVBQXVFO0lBQ3ZFLG9CQUFvQixFQUFFLENBQUM7SUFDdkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG4vLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0IHsgcmVhbHBhdGhTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAnbm9kZTp1cmwnO1xuaW1wb3J0IHsgZXJyb3JNZXNzYWdlIH0gZnJvbSAnQHBpcGVsaW5lLWJ1aWxkZXIvYXBpLWNvcmUnO1xuaW1wb3J0IHsgcHJvZ3JhbSB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBhdWRpdFN0YWNrcyB9IGZyb20gJy4vY29tbWFuZHMvYXVkaXQtc3RhY2tzLmpzJztcbmltcG9ydCB7IGF1ZGl0VG9rZW5zIH0gZnJvbSAnLi9jb21tYW5kcy9hdWRpdC10b2tlbnMuanMnO1xuaW1wb3J0IHsgYm9vdHN0cmFwIH0gZnJvbSAnLi9jb21tYW5kcy9ib290c3RyYXAuanMnO1xuaW1wb3J0IHsgY3JlYXRlUGF0IH0gZnJvbSAnLi9jb21tYW5kcy9jcmVhdGUtcGF0LmpzJztcbmltcG9ydCB7IGNyZWF0ZVBpcGVsaW5lIH0gZnJvbSAnLi9jb21tYW5kcy9jcmVhdGUtcGlwZWxpbmUuanMnO1xuaW1wb3J0IHsgZGVwbG95IH0gZnJvbSAnLi9jb21tYW5kcy9kZXBsb3kuanMnO1xuaW1wb3J0IHsgZ2V0UGlwZWxpbmUgfSBmcm9tICcuL2NvbW1hbmRzL2dldC1waXBlbGluZS5qcyc7XG5pbXBvcnQgeyBnZXRQbHVnaW4gfSBmcm9tICcuL2NvbW1hbmRzL2dldC1wbHVnaW4uanMnO1xuaW1wb3J0IHsgaW5zdGFudGlhdGVUZW1wbGF0ZSB9IGZyb20gJy4vY29tbWFuZHMvaW5zdGFudGlhdGUtdGVtcGxhdGUuanMnO1xuaW1wb3J0IHsgbGlzdFBpcGVsaW5lcyB9IGZyb20gJy4vY29tbWFuZHMvbGlzdC1waXBlbGluZXMuanMnO1xuaW1wb3J0IHsgbGlzdFBsdWdpbnMgfSBmcm9tICcuL2NvbW1hbmRzL2xpc3QtcGx1Z2lucy5qcyc7XG5pbXBvcnQgeyBsb2dpbiB9IGZyb20gJy4vY29tbWFuZHMvbG9naW4uanMnO1xuaW1wb3J0IHsgbmV3UGx1Z2luIH0gZnJvbSAnLi9jb21tYW5kcy9uZXctcGx1Z2luLmpzJztcbmltcG9ydCB7IG9yZ0V4cG9ydCB9IGZyb20gJy4vY29tbWFuZHMvb3JnLWV4cG9ydC5qcyc7XG5pbXBvcnQgeyBkZXByZWNhdGVQbHVnaW4sIHlhbmtQbHVnaW4gfSBmcm9tICcuL2NvbW1hbmRzL3BsdWdpbi1saWZlY3ljbGUuanMnO1xuaW1wb3J0IHsgcHJvdmlzaW9uIH0gZnJvbSAnLi9jb21tYW5kcy9wcm92aXNpb24uanMnO1xuaW1wb3J0IHsgcHVibGlzaFBsdWdpbiB9IGZyb20gJy4vY29tbWFuZHMvcHVibGlzaC1wbHVnaW4uanMnO1xuaW1wb3J0IHsgcmVkcml2ZUV2ZW50cyB9IGZyb20gJy4vY29tbWFuZHMvcmVkcml2ZS1ldmVudHMuanMnO1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tICcuL2NvbW1hbmRzL3JlZ2lzdGVyLmpzJztcbmltcG9ydCB7IHJlcG9ydCB9IGZyb20gJy4vY29tbWFuZHMvcmVwb3J0LmpzJztcbmltcG9ydCB7IHNlY3VyaXR5UmVwb3J0IH0gZnJvbSAnLi9jb21tYW5kcy9zZWN1cml0eS1yZXBvcnQuanMnO1xuaW1wb3J0IHsgc2V0dXBFdmVudHMgfSBmcm9tICcuL2NvbW1hbmRzL3NldHVwLWV2ZW50cy5qcyc7XG5pbXBvcnQgeyBzdGF0dXMgfSBmcm9tICcuL2NvbW1hbmRzL3N0YXR1cy5qcyc7XG5pbXBvcnQgeyBzdG9yZVRva2VuIH0gZnJvbSAnLi9jb21tYW5kcy9zdG9yZS10b2tlbi5qcyc7XG5pbXBvcnQgeyBzeW50aCB9IGZyb20gJy4vY29tbWFuZHMvc3ludGguanMnO1xuaW1wb3J0IHsgdGVzdFBsdWdpbiB9IGZyb20gJy4vY29tbWFuZHMvdGVzdC1wbHVnaW4uanMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJVcGdyYWRlT3B0aW9uIH0gZnJvbSAnLi9jb21tYW5kcy91cGdyYWRlLmpzJztcbmltcG9ydCB7IHVwbG9hZFBsdWdpbiB9IGZyb20gJy4vY29tbWFuZHMvdXBsb2FkLXBsdWdpbi5qcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVBsdWdpbiB9IGZyb20gJy4vY29tbWFuZHMvdmFsaWRhdGUtcGx1Z2luLmpzJztcbmltcG9ydCB7IHZhbGlkYXRlVGVtcGxhdGVzQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdmFsaWRhdGUtdGVtcGxhdGVzLmpzJztcbmltcG9ydCB7IHZlcmlmeVBsdWdpbnMgfSBmcm9tICcuL2NvbW1hbmRzL3ZlcmlmeS1wbHVnaW5zLmpzJztcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuL2NvbW1hbmRzL3ZlcnNpb24uanMnO1xuaW1wb3J0IHtcbiAgQVBQX05BTUUsXG4gIEFQUF9ERVNDUklQVElPTixcbiAgQVBQX1ZFUlNJT04sXG4gIEVOVl9WQVJTLFxuICBpc0RlYnVnTW9kZSxcbiAgZ2VuZXJhdGVFeGVjdXRpb25JZCxcbn0gZnJvbSAnLi9jb25maWcvY2xpLmNvbnN0YW50cy5qcyc7XG5pbXBvcnQgeyBiYW5uZXIsIG1pbmlCYW5uZXIgfSBmcm9tICcuL3V0aWxzL2Jhbm5lci5qcyc7XG5pbXBvcnQgeyBnZXRBcGlDb25maWcgfSBmcm9tICcuL3V0aWxzL2NvbmZpZy1sb2FkZXIuanMnO1xuaW1wb3J0IHsgbG9hZFNlc3Npb24gfSBmcm9tICcuL3V0aWxzL2NyZWRlbnRpYWwtc3RvcmUuanMnO1xuaW1wb3J0IHsgRVJST1JfQ09ERVMsIGhhbmRsZUVycm9yIH0gZnJvbSAnLi91dGlscy9lcnJvci1oYW5kbGVyLmpzJztcbmltcG9ydCB7IHByaW50SW5mbywgcHJpbnRFcnJvciwgcHJpbnRXYXJuaW5nLCBwcmludERlYnVnLCBwcmludFNlY3Rpb24gfSBmcm9tICcuL3V0aWxzL291dHB1dC11dGlscy5qcyc7XG5pbXBvcnQgeyBwcmVmbGlnaHRDb21tYW5kVG9vbHMgfSBmcm9tICcuL3V0aWxzL3ByZWZsaWdodC5qcyc7XG5pbXBvcnQgeyBzY2hlZHVsZVVwZGF0ZU5vdGljZSB9IGZyb20gJy4vdXRpbHMvdXBkYXRlLW5vdGljZS5qcyc7XG5cbi8qKlxuICogQ0xJIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAqL1xuaW50ZXJmYWNlIENsaU9wdGlvbnMge1xuICAvKipcbiAgICogU2hvdyBiYW5uZXIgb24gc3RhcnR1cFxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBzaG93QmFubmVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTWluaW1hbCBiYW5uZXIgKG5vIEFTQ0lJIGFydClcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIG1pbmltYWxCYW5uZXI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEZWJ1ZyBtb2RlXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBkZWJ1Zz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFZlcmJvc2Ugb3V0cHV0XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICB2ZXJib3NlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUXVpZXQgbW9kZSAobWluaW1hbCBvdXRwdXQpXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBxdWlldD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE5vIGNvbG9yIG91dHB1dFxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgbm9Db2xvcj86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBgLS11cGdyYWRlYCAvIGAtLXVwZ3JhZGUtY2hlY2tgOiB0YWxrcyBvbmx5IHRvIHRoZSBucG0gcmVnaXN0cnksIG5ldmVyIHRvXG4gICAqIHRoZSBwbGF0Zm9ybSwgc28gaXQgbXVzdCB3b3JrIHNpZ25lZCBvdXQgYW5kIHdpdGhvdXQgdGhlIHNpZ24taW4gd2FybmluZy5cbiAgICovXG4gIHNlbGZVcGRhdGU/OiBib29sZWFuO1xufVxuXG4vKiogV2hldGhlciBhcmd2IGFza3MgZm9yIGEgc2VsZi11cGRhdGUgKGAtLXVwZ3JhZGVgIC8gYC0tdXBncmFkZS1jaGVja2AsIHdpdGggb3Igd2l0aG91dCBhIHZlcnNpb24pLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2VsZlVwZGF0ZShhcmd2OiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICByZXR1cm4gYXJndi5zb21lKChhKSA9PiBhID09PSAnLS11cGdyYWRlJyB8fCBhID09PSAnLS11cGdyYWRlLWNoZWNrJyB8fCBhLnN0YXJ0c1dpdGgoJy0tdXBncmFkZT0nKSB8fCBhLnN0YXJ0c1dpdGgoJy0tdXBncmFkZS1jaGVjaz0nKSk7XG59XG5cbi8qKlxuICogQ2hlY2sgZW52aXJvbm1lbnQgYW5kIGRpc3BsYXkgd2FybmluZ3NcbiAqL1xuZnVuY3Rpb24gY2hlY2tFbnZpcm9ubWVudCh7IHNpZ25JblJlbGV2YW50ID0gdHJ1ZSB9OiB7IHNpZ25JblJlbGV2YW50PzogYm9vbGVhbiB9ID0ge30pOiB2b2lkIHtcbiAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG5cbiAgLy8gTm90IHNpZ25lZCBpbiBBVCBBTEw6IG5laXRoZXIgYW4gZXhwbGljaXQgdG9rZW4gbm9yIGEgc3RvcmVkIGJyb3dzZXJcbiAgLy8gc2lnbi1pbi4gRWl0aGVyIGFsb25lIGlzIGVub3VnaCwgc28gdGhlIHdhcm5pbmcgb25seSBmaXJlcyB3aGVuIGJvdGggYXJlXG4gIC8vIG1pc3Npbmcg4oCUIG90aGVyd2lzZSBgYXV0aCBsb2dpbmAgdXNlcnMgd291bGQgYmUgbmFnZ2VkIG9uIGV2ZXJ5IGNvbW1hbmQuXG4gIGlmIChzaWduSW5SZWxldmFudCAmJiAhcHJvY2Vzcy5lbnZbRU5WX1ZBUlMuUExBVEZPUk1fVE9LRU5dICYmICFsb2FkU2Vzc2lvbihnZXRBcGlDb25maWcoKS5hcGkuYmFzZVVybCkpIHtcbiAgICB3YXJuaW5ncy5wdXNoKCdOb3Qgc2lnbmVkIGluIChubyBQTEFURk9STV9UT0tFTiwgbm8gc3RvcmVkIHNlc3Npb24pJyk7XG4gICAgd2FybmluZ3MucHVzaCgnUnVuIFwicGlwZWxpbmUtbWFuYWdlciBhdXRoIGxvZ2luXCIg4oCUIEFQSSBvcGVyYXRpb25zIHdpbGwgZmFpbCB1bnRpbCB5b3UgZG8nKTtcbiAgfVxuXG4gIC8vIENoZWNrIE5vZGUgdmVyc2lvblxuICBjb25zdCBub2RlVmVyc2lvbiA9IHByb2Nlc3MudmVyc2lvbjtcbiAgY29uc3QgbWFqb3JWZXJzaW9uID0gcGFyc2VJbnQobm9kZVZlcnNpb24uc2xpY2UoMSkuc3BsaXQoJy4nKVswXSB8fCAnMCcsIDEwKTtcbiAgaWYgKG1ham9yVmVyc2lvbiA8IDI0KSB7XG4gICAgd2FybmluZ3MucHVzaChgTm9kZS5qcyAke25vZGVWZXJzaW9ufSBkZXRlY3RlZCAtIHZlcnNpb24gMjQrIHJlcXVpcmVkIChzZWUgcGFja2FnZS5qc29uIGVuZ2luZXMpYCk7XG4gIH1cblxuICAvLyBEaXNwbGF5IHdhcm5pbmdzXG4gIGlmICh3YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgcHJpbnRTZWN0aW9uKCdFbnZpcm9ubWVudCBXYXJuaW5ncycpO1xuICAgIHdhcm5pbmdzLmZvckVhY2god2FybmluZyA9PiB7XG4gICAgICBwcmludFdhcm5pbmcod2FybmluZyk7XG4gICAgfSk7XG4gICAgY29uc29sZS5sb2coJycpO1xuICB9XG59XG5cbi8qKlxuICogRGlzcGxheSBzdGFydHVwIGluZm9ybWF0aW9uXG4gKi9cbmZ1bmN0aW9uIGRpc3BsYXlTdGFydHVwSW5mbyhvcHRpb25zOiBDbGlPcHRpb25zKTogdm9pZCB7XG4gIGlmIChvcHRpb25zLnF1aWV0KSByZXR1cm47XG5cbiAgY29uc3QgZXhlY3V0aW9uSWQgPSBnZW5lcmF0ZUV4ZWN1dGlvbklkKCk7XG5cbiAgaWYgKG9wdGlvbnMuZGVidWcgfHwgb3B0aW9ucy52ZXJib3NlKSB7XG4gICAgcHJpbnREZWJ1ZygnQ0xJIENvbmZpZ3VyYXRpb24nLCB7XG4gICAgICBuYW1lOiBBUFBfTkFNRSxcbiAgICAgIHZlcnNpb246IEFQUF9WRVJTSU9OLFxuICAgICAgZXhlY3V0aW9uSWQsXG4gICAgICBub2RlOiBwcm9jZXNzLnZlcnNpb24sXG4gICAgICBwbGF0Zm9ybTogcHJvY2Vzcy5wbGF0Zm9ybSxcbiAgICAgIGFyY2g6IHByb2Nlc3MuYXJjaCxcbiAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICAgIGVudjoge1xuICAgICAgICBkZWJ1ZzogcHJvY2Vzcy5lbnYuREVCVUcsXG4gICAgICAgIHRva2VuOiBwcm9jZXNzLmVudltFTlZfVkFSUy5QTEFURk9STV9UT0tFTl0gPyAnc2V0JzogJ25vdCBzZXQnLFxuICAgICAgICB1cmw6IHByb2Nlc3MuZW52W0VOVl9WQVJTLlBMQVRGT1JNX0JBU0VfVVJMXSB8fCAnZGVmYXVsdCcsXG4gICAgICB9LFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHByaW50RGVidWcoJ1N0YXJ0aW5nIENMSScsIHtcbiAgICAgIHZlcnNpb246IEFQUF9WRVJTSU9OLFxuICAgICAgZXhlY3V0aW9uSWQsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqIFRvcC1sZXZlbCBgLS1oZWxwYCBlcGlsb2d1ZTogY29tbWFuZCBncm91cHMsIGF1dGgsIGVudiB2YXJzLCBleGFtcGxlcywgZXhpdCBjb2Rlcy4gKi9cbmNvbnN0IEhFTFBfVEVYVCA9IGBcbkNvbW1hbmQgZ3JvdXBzOlxuICBhdXRoICAgICAgQXV0aGVudGljYXRlIGFuZCBtYW5hZ2UgY3JlZGVudGlhbHMgKGxvZ2luLCBwYXQpXG4gIHBpcGVsaW5lICBDcmVhdGUsIGluc3BlY3QsIGFuZCBkZXBsb3kgcGlwZWxpbmVzIChjcmVhdGUsIGxpc3QsIGdldCwgcmVnaXN0ZXIsIHN5bnRoLCBkZXBsb3kpXG4gIHBsdWdpbiAgICBBdXRob3IsIHZhbGlkYXRlLCBhbmQgcHVibGlzaCBwbHVnaW5zIChuZXcsIHZhbGlkYXRlLCB0ZXN0LCBwdWJsaXNoLCB1cGxvYWQsIGdldCwgbGlzdCwgZGVwcmVjYXRlLCB5YW5rLCB2ZXJpZnkpXG4gIHRlbXBsYXRlICBJbnN0YW50aWF0ZSBnb2xkZW4tcGF0aCBwaXBlbGluZSB0ZW1wbGF0ZXMgYW5kIHZhbGlkYXRlIHt7IC4uLiB9fSBzeW50YXggKGluc3RhbnRpYXRlLCB2YWxpZGF0ZSlcbiAgaW5mcmEgICAgIFNldCB1cCBhbmQgb3BlcmF0ZSBwbGF0Zm9ybSBpbmZyYXN0cnVjdHVyZSAoYm9vdHN0cmFwLCBzZXR1cC1ldmVudHMsIHJlZHJpdmUtZXZlbnRzLCBzdG9yZS10b2tlbiwgcHJvdmlzaW9uKVxuICBhdWRpdCAgICAgT3BlcmF0b3IgYXVkaXRzLCBjcm9uLWZyaWVuZGx5ICh0b2tlbnMsIHN0YWNrcylcbiAgb3JnICAgICAgIE9yZ2FuaXphdGlvbiBkYXRhIG9wZXJhdGlvbnMgKGV4cG9ydClcbiAgc2VjdXJpdHktcmVwb3J0ICBVcGxvYWQgU0FSSUYgLyB0cml2eSAvIGdyeXBlIHJlcG9ydHMgcHJvZHVjZWQgaW5zaWRlIGEgcGlwZWxpbmUgKHVwbG9hZClcbiAgc3RhdHVzIC8gdmVyc2lvbiAvIGNvbXBsZXRpb25zXG5cbkF1dGhlbnRpY2F0aW9uOlxuICBSdW4gJyR7QVBQX05BTUV9IGF1dGggbG9naW4nIG9uY2UgcGVyIHBsYXRmb3JtIOKAlCBpdCBzaWducyB5b3UgaW4gdGhyb3VnaCB5b3VyXG4gIGJyb3dzZXIgKG5vIHBhc3N3b3JkIG9uIHRoZSBjb21tYW5kIGxpbmUpIGFuZCBzdG9yZXMgdGhlIHNlc3Npb24gdW5kZXJcbiAgfi8ucGlwZWxpbmUtbWFuYWdlci9jcmVkZW50aWFscy5qc29uLiBGb3IgQ0ksIGNyZWF0ZSBhbiBhY2Nlc3Mga2V5IHdpdGhcbiAgJyR7QVBQX05BTUV9IGF1dGggcGF0JyBhbmQgZXhwb3J0IGl0IGFzICR7RU5WX1ZBUlMuUExBVEZPUk1fVE9LRU59LCB3aGljaCBhbHdheXMgd2lucy5cblxuRW52aXJvbm1lbnQgVmFyaWFibGVzOlxuICAke0VOVl9WQVJTLlBMQVRGT1JNX1RPS0VOfSBBY2Nlc3Mga2V5IG9yIHRva2VuIChvdmVycmlkZXMgdGhlIHN0b3JlZCBzZXNzaW9uKVxuICAke0VOVl9WQVJTLlBMQVRGT1JNX0JBU0VfVVJMfSBBUEkgYmFzZSBVUkwgKG9wdGlvbmFsKVxuICAke0VOVl9WQVJTLkNMSV9DT05GSUdfUEFUSH0gQ29uZmlnIGZpbGUgcGF0aCAob3B0aW9uYWwpXG4gICR7RU5WX1ZBUlMuVExTX1JFSkVDVF9VTkFVVEhPUklaRUR9IERpc2FibGUgU1NMIHZlcmlmaWNhdGlvbiBpZiAnMCdcbiAgUExBVEZPUk1fQ0FfQlVORExFICBQRU0gb2YgYSBwcml2YXRlIENBIHRvIHRydXN0IGZvciB0aGUgcGxhdGZvcm0gKHZlcmlmaWVkLCBub3Qgc2tpcHBlZClcbiAgJHtFTlZfVkFSUy5ERUJVR30gRW5hYmxlIGRlYnVnIG1vZGUgaWYgJ3RydWUnXG5cbkV4YW1wbGVzOlxuICAkICR7QVBQX05BTUV9IHZlcnNpb25cbiAgJCAke0FQUF9OQU1FfSAtLXVwZ3JhZGUgICAgICAgICAgICAoLS11cGdyYWRlIDx2ZXJzaW9uPiBmb3IgYSBzcGVjaWZpYyBvbmUsIC0tdXBncmFkZS1jaGVjayB0byBvbmx5IGxvb2spXG4gICQgJHtBUFBfTkFNRX0gYXV0aCBsb2dpblxuICAkICR7QVBQX05BTUV9IHBpcGVsaW5lIGxpc3QgLS1wcm9qZWN0IG15LWFwcFxuICAkICR7QVBQX05BTUV9IHBpcGVsaW5lIGdldCAtLWlkIHBpcGUtMTIzIC0tZm9ybWF0IGpzb25cbiAgJCAke0FQUF9OQU1FfSBwaXBlbGluZSBjcmVhdGUgLWYgcHJvcHMuanNvbiAtLWRlcGxveSAtLXByb2ZpbGUgcHJvZHVjdGlvblxuICAkICR7QVBQX05BTUV9IHRlbXBsYXRlIGluc3RhbnRpYXRlIC1uIHJlYWN0LWphdmFzY3JpcHQgLXAgcmVhY3QgLW8gYWNtZSAtLWlucHV0IG9yZ0lkPTx1dWlkPiAtLW91dHB1dCBwcm9wcy5qc29uXG4gICQgJHtBUFBfTkFNRX0gcGx1Z2luIHVwbG9hZCAtLWZpbGUgcGx1Z2luLnppcFxuICAkICR7QVBQX05BTUV9IGluZnJhIHN0b3JlLXRva2VuIC0tZGF5cyAzMCAtLXJlZ2lvbiB1cy1lYXN0LTFcbiAgJCAke0FQUF9OQU1FfSBpbmZyYSBib290c3RyYXAgLS1hY2NvdW50IDEyMzQ1Njc4OTAxMiAtLXJlZ2lvbiB1cy1lYXN0LTFcbiAgJCAke0FQUF9OQU1FfSBwaXBlbGluZSBkZXBsb3kgLS1pZCBwaXBlLTEyMyAtLXByb2ZpbGUgcHJvZHVjdGlvblxuXG5FeGl0IGNvZGVzICgwID0gc3VjY2VzczsgZmFpbHVyZXMgdXNlIGEgc3RhbmRhcmQgY29kZSBieSBlcnJvciB0eXBlKTpcbiAgMSBnZW5lcmFsIMK3IDIgdmFsaWRhdGlvbiDCtyAzIGFwaS1yZXF1ZXN0IMK3IDQgYXV0aCDCtyA1IGZvcmJpZGRlblxuICA2IG5vdC1mb3VuZCDCtyA3IG5ldHdvcmsgwrcgOCBjb25maWcgwrcgOSBmaWxlLXN5c3RlbSDCtyAxMCB0aW1lb3V0XG5cblJ1biAnJHtBUFBfTkFNRX0gPGdyb3VwPiAtLWhlbHAnIHRvIHNlZSBhIGdyb3VwJ3Mgc3ViY29tbWFuZHMuXG5gO1xuXG4vKipcbiAqIFRhc2sgbmFtZXNwYWNlcyDigJQgY29tbWFuZHMgYXJlIGdyb3VwZWQgYnkgdGhlIGpvYiB0aGUgdXNlciBpcyBkb2luZywgbm90IGJ5XG4gKiBpbXBsZW1lbnRhdGlvbi4gRWFjaCBwYXJlbnQgaXMgYSBzdWJjb21tYW5kIGNvbnRhaW5lcjsgdGhlIGxlYWYgdmVyYiBsaXZlcyBpblxuICogdGhlIGNvbW1hbmQgZmlsZSAoZS5nLiBgLmNvbW1hbmQoJ2xpc3QnKWApLCBzbyBgcGlwZWxpbmUgbGlzdGAgcmVhZHMgYXMgYSB0YXNrLlxuICovXG5mdW5jdGlvbiByZWdpc3RlclRhc2tOYW1lc3BhY2VzKCk6IHZvaWQge1xuICBwcmludERlYnVnKCdSZWdpc3RlcmluZyB0YXNrIG5hbWVzcGFjZXMnKTtcblxuICAvLyBhdXRoIOKAlCBhdXRoZW50aWNhdGUgYW5kIG1hbmFnZSBjcmVkZW50aWFsc1xuICBjb25zdCBhdXRoID0gcHJvZ3JhbS5jb21tYW5kKCdhdXRoJykuZGVzY3JpcHRpb24oJ0F1dGhlbnRpY2F0ZSBhbmQgbWFuYWdlIGNyZWRlbnRpYWxzJyk7XG4gIGxvZ2luKGF1dGgpOyAvLyBhdXRoIGxvZ2luIOKAlCBicm93c2VyIChkZXZpY2UtYXV0aG9yaXphdGlvbikgc2lnbi1pbiwgc3RvcmVkIGxvY2FsbHlcbiAgY3JlYXRlUGF0KGF1dGgpOyAvLyBhdXRoIHBhdCDigJQgY3JlYXRlIGEgbmFtZWQgYWNjZXNzIGtleSAoZGV2aWNlIHNpZ24taW4gKyBicm93c2VyIHN0ZXAtdXApXG5cbiAgLy8gcGlwZWxpbmUg4oCUIGNyZWF0ZSwgaW5zcGVjdCwgYW5kIGRlcGxveSBwaXBlbGluZXNcbiAgY29uc3QgcGlwZWxpbmUgPSBwcm9ncmFtLmNvbW1hbmQoJ3BpcGVsaW5lJykuZGVzY3JpcHRpb24oJ0NyZWF0ZSwgaW5zcGVjdCwgYW5kIGRlcGxveSBwaXBlbGluZXMnKTtcbiAgY3JlYXRlUGlwZWxpbmUocGlwZWxpbmUpOyAvLyBwaXBlbGluZSBjcmVhdGVcbiAgbGlzdFBpcGVsaW5lcyhwaXBlbGluZSk7IC8vIHBpcGVsaW5lIGxpc3RcbiAgZ2V0UGlwZWxpbmUocGlwZWxpbmUpOyAvLyBwaXBlbGluZSBnZXRcbiAgcmVnaXN0ZXIocGlwZWxpbmUpOyAvLyBwaXBlbGluZSByZWdpc3RlciDigJQgcmUtcmVnaXN0ZXIgYSBkZXBsb3llZCBBUk4gKyBkcmFpbiBwZW5kaW5nIGludGVudHNcbiAgc3ludGgocGlwZWxpbmUpOyAvLyBwaXBlbGluZSBzeW50aCDigJQgQ0RLIHN5bnRoZXNpcyBmcm9tIHBpcGVsaW5lIGNvbmZpZ1xuICBkZXBsb3kocGlwZWxpbmUpOyAvLyBwaXBlbGluZSBkZXBsb3kg4oCUIENESyBkZXBsb3kgKC0tYXBwIHByaW50cyBib2lsZXJwbGF0ZSBwYXRoKVxuXG4gIC8vIHBsdWdpbiDigJQgYXV0aG9yLCB2YWxpZGF0ZSwgYW5kIHB1Ymxpc2ggcGx1Z2luc1xuICBjb25zdCBwbHVnaW4gPSBwcm9ncmFtLmNvbW1hbmQoJ3BsdWdpbicpLmRlc2NyaXB0aW9uKCdBdXRob3IsIHZhbGlkYXRlLCBhbmQgcHVibGlzaCBwbHVnaW5zJyk7XG4gIG5ld1BsdWdpbihwbHVnaW4pOyAvLyBwbHVnaW4gbmV3IOKAlCBzY2FmZm9sZCBhIGxvY2FsIHBsdWdpbiBkaXJlY3RvcnlcbiAgdmFsaWRhdGVQbHVnaW4ocGx1Z2luKTsgLy8gcGx1Z2luIHZhbGlkYXRlIOKAlCB0aGUgc2VydmVyJ3Mgc2NoZW1hcyArIHRoZSBjYXRhbG9nLW1ldGFkYXRhIHJlcG9ydFxuICB0ZXN0UGx1Z2luKHBsdWdpbik7IC8vIHBsdWdpbiB0ZXN0IOKAlCBydW4gaW5zdGFsbCArIGJ1aWxkIGNvbW1hbmRzIGxvY2FsbHkgaW4gdGhlIGltYWdlXG4gIHB1Ymxpc2hQbHVnaW4ocGx1Z2luKTsgLy8gcGx1Z2luIHB1Ymxpc2gg4oCUIHByZS1mbGlnaHQsIHNjYW4gcHJldmlldywgYWNjZXB0LW9yLWVkaXQsIHB1Ymxpc2ggcmVxdWVzdFxuICB1cGxvYWRQbHVnaW4ocGx1Z2luKTsgLy8gcGx1Z2luIHVwbG9hZCDigJQgdXBsb2FkIGFuZCBkZXBsb3lcbiAgZ2V0UGx1Z2luKHBsdWdpbik7IC8vIHBsdWdpbiBnZXRcbiAgbGlzdFBsdWdpbnMocGx1Z2luKTsgLy8gcGx1Z2luIGxpc3RcbiAgZGVwcmVjYXRlUGx1Z2luKHBsdWdpbik7IC8vIHBsdWdpbiBkZXByZWNhdGUg4oCUIGRlcHJlY2F0ZSAob3IgLS11bmRvKSBhIHZlcnNpb25cbiAgeWFua1BsdWdpbihwbHVnaW4pOyAvLyBwbHVnaW4geWFuayDigJQgc3RvcCBhIHZlcnNpb24gcmVzb2x2aW5nIGZvciBuZXcgc3ludGhzXG4gIHZlcmlmeVBsdWdpbnMocGx1Z2luKTsgLy8gcGx1Z2luIHZlcmlmeSDigJQgcnVuLXRpbWUgY2hlY2sgb2YgYSBwaXBlbGluZSdzIHBpbm5lZCBwbHVnaW4gaW1hZ2VzXG5cbiAgLy8gdGVtcGxhdGUg4oCUIGluc3RhbnRpYXRlIGdvbGRlbi1wYXRoIHBpcGVsaW5lIHRlbXBsYXRlcywgdmFsaWRhdGUge3sgLi4uIH19IHN5bnRheFxuICBjb25zdCB0ZW1wbGF0ZSA9IHByb2dyYW0uY29tbWFuZCgndGVtcGxhdGUnKS5kZXNjcmlwdGlvbignSW5zdGFudGlhdGUgcGlwZWxpbmUgdGVtcGxhdGVzIGFuZCB2YWxpZGF0ZSB7eyAuLi4gfX0gdGVtcGxhdGUgc3ludGF4Jyk7XG4gIGluc3RhbnRpYXRlVGVtcGxhdGUodGVtcGxhdGUpOyAvLyB0ZW1wbGF0ZSBpbnN0YW50aWF0ZSDigJQgcmVuZGVyIGEgdGVtcGxhdGUgaW50byBwaXBlbGluZSBwcm9wc1xuICB2YWxpZGF0ZVRlbXBsYXRlc0NvbW1hbmQodGVtcGxhdGUpOyAvLyB0ZW1wbGF0ZSB2YWxpZGF0ZVxuXG4gIC8vIGluZnJhIOKAlCBzZXQgdXAgYW5kIG9wZXJhdGUgcGxhdGZvcm0gaW5mcmFzdHJ1Y3R1cmVcbiAgY29uc3QgaW5mcmEgPSBwcm9ncmFtLmNvbW1hbmQoJ2luZnJhJykuZGVzY3JpcHRpb24oJ1NldCB1cCBhbmQgb3BlcmF0ZSBwbGF0Zm9ybSBpbmZyYXN0cnVjdHVyZScpO1xuICBib290c3RyYXAoaW5mcmEpOyAvLyBpbmZyYSBib290c3RyYXAg4oCUIENESyB0b29sa2l0IHN0YWNrXG4gIHNldHVwRXZlbnRzKGluZnJhKTsgLy8gaW5mcmEgc2V0dXAtZXZlbnRzIOKAlCBFdmVudEJyaWRnZSBldmVudCBpbmdlc3Rpb25cbiAgcmVkcml2ZUV2ZW50cyhpbmZyYSk7IC8vIGluZnJhIHJlZHJpdmUtZXZlbnRzIOKAlCBtYW51YWwgRExRIOKGkiBxdWV1ZSByZWRyaXZlIGZhbGxiYWNrXG4gIHN0b3JlVG9rZW4oaW5mcmEpOyAvLyBpbmZyYSBzdG9yZS10b2tlbiDigJQgSldUIHRva2VuIGluIFNlY3JldHMgTWFuYWdlciBmb3IgQ0RLXG4gIHByb3Zpc2lvbihpbmZyYSk7IC8vIGluZnJhIHByb3Zpc2lvbiDigJQgQUktYXNzaXN0ZWQgZGVwbG95L3RlYXJkb3duIG9mIHRoZSBwbGF0Zm9ybVxuXG4gIC8vIGF1ZGl0IOKAlCBvcGVyYXRvciBhdWRpdHMgKGNyb24tZnJpZW5kbHk6IGV4aXQgMSBvbiBmaW5kaW5ncylcbiAgY29uc3QgYXVkaXQgPSBwcm9ncmFtLmNvbW1hbmQoJ2F1ZGl0JykuZGVzY3JpcHRpb24oJ09wZXJhdG9yIGF1ZGl0cyAoY3Jvbi1mcmllbmRseTogZXhpdCAxIG9uIGZpbmRpbmdzKScpO1xuICBhdWRpdFRva2VucyhhdWRpdCk7IC8vIGF1ZGl0IHRva2VucyDigJQgZXhwaXJpbmcgcGxhdGZvcm0gdG9rZW5zIGluIFNlY3JldHMgTWFuYWdlclxuICBhdWRpdFN0YWNrcyhhdWRpdCk7IC8vIGF1ZGl0IHN0YWNrcyDigJQgQ0ZOIHN0YWNrcyB2cyBwaXBlbGluZV9yZWdpc3RyeSBkcmlmdFxuXG4gIC8vIG9yZyDigJQgb3JnYW5pemF0aW9uIGRhdGEgb3BlcmF0aW9uc1xuICBjb25zdCBvcmcgPSBwcm9ncmFtLmNvbW1hbmQoJ29yZycpLmRlc2NyaXB0aW9uKCdPcmdhbml6YXRpb24gZGF0YSBvcGVyYXRpb25zJyk7XG4gIG9yZ0V4cG9ydChvcmcpOyAvLyBvcmcgZXhwb3J0IOKAlCBHRFBSIHBvcnRhYmlsaXR5IGV4cG9ydFxuXG4gIC8vIHJlcG9ydCDigJQgdGhlIHN0YWtlaG9sZGVyLXJlcG9ydCBhZGQtb24uIFJlZ2lzdGVyZWQgYXMgaXRzIE9XTiBuYW1lc3BhY2UgcmF0aGVyIHRoYW5cbiAgLy8gdW5kZXIgYG9yZ2AsIGJlY2F1c2UgaXRzIHZlcmJzIGFyZSBhIGxlYWQncyB3b3JrZmxvdyAoY29tcG9zZSwgcHVibGlzaCwgc2hhcmUpLCBub3QgYW5cbiAgLy8gb3JnYW5pemF0aW9uLWRhdGEgb3BlcmF0aW9uLiBUaGUgdHdvIGpvYnMgdGhlIGRhc2hib2FyZCBpcyB0aGUgd3Jvbmcgc2hhcGUgZm9yIGFyZVxuICAvLyBiYWNrZmlsbGluZyBhIHJ1biBvZiBwYXN0IHBlcmlvZHMgYW5kIGRyaXZpbmcgYSBwdWJsaXNoIGZyb20gYW5vdGhlciBzY2hlZHVsZXIuXG4gIHJlcG9ydChwcm9ncmFtKTtcblxuICAvLyBzZWN1cml0eS1yZXBvcnQg4oCUIHVwbG9hZCBTQVJJRiAvIHRyaXZ5IC8gZ3J5cGUgcmVwb3J0cyBwcm9kdWNlZCBpbnNpZGUgYSBwaXBlbGluZVxuICBzZWN1cml0eVJlcG9ydChwcm9ncmFtKTtcbn1cblxuLyoqIFByaW50IHNoZWxsIGNvbXBsZXRpb25zIGZvciBgc2hlbGxgIChiYXNoLCB6c2ggb3IgZmlzaCkuICovXG5mdW5jdGlvbiBwcmludENvbXBsZXRpb25zKHNoZWxsOiBzdHJpbmcpOiB2b2lkIHtcbiAgLy8gV2FsayBjb21tYW5kZXIncyByZWdpc3RlcmVkIHRyZWUgc28gY29tcGxldGlvbnMgbmV2ZXIgZHJpZnQgZnJvbSB0aGUgYWN0dWFsXG4gIC8vIHN1cmZhY2UuIGB0b3BMZXZlbGAgaXMgdGhlIGZpcnN0LXdvcmQgc2V0IChuYW1lc3BhY2VzICsgbWV0YSBjb21tYW5kcyk7XG4gIC8vIGBzdWJzYCBtYXBzIGVhY2ggbmFtZXNwYWNlIHRvIGl0cyBsZWFmIHZlcmJzIGZvciBzZWNvbmQtd29yZCBjb21wbGV0aW9uLlxuICBjb25zdCB0b3BMZXZlbCA9IHByb2dyYW0uY29tbWFuZHMubWFwKGMgPT4gYy5uYW1lKCkpLnNvcnQoKTtcbiAgY29uc3Qgc3ViczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG4gIGZvciAoY29uc3QgYyBvZiBwcm9ncmFtLmNvbW1hbmRzKSB7XG4gICAgaWYgKGMuY29tbWFuZHMubGVuZ3RoID4gMCkgc3Vic1tjLm5hbWUoKV0gPSBjLmNvbW1hbmRzLm1hcChzID0+IHMubmFtZSgpKS5zb3J0KCk7XG4gIH1cbiAgY29uc3QgdG9wTGV2ZWxTdHIgPSB0b3BMZXZlbC5qb2luKCcgJyk7XG4gIHN3aXRjaCAoc2hlbGwpIHtcbiAgICBjYXNlICdiYXNoJzoge1xuICAgICAgLy8gVHdvLWxldmVsOiBjb21wbGV0ZSB0aGUgZ3JvdXAgYXQgd29yZCAxLCBpdHMgc3ViY29tbWFuZHMgYXQgd29yZCAyLlxuICAgICAgY29uc3QgY2FzZXMgPSBPYmplY3QuZW50cmllcyhzdWJzKVxuICAgICAgICAubWFwKChbbnMsIGxlYXZlc10pID0+IGAgICAgICAke25zfSkgQ09NUFJFUExZPSgkKGNvbXBnZW4gLVcgXCIke2xlYXZlcy5qb2luKCcgJyl9XCIgLS0gXCJcXCR7Y3VyfVwiKSk7O2ApXG4gICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICAgIGNvbnNvbGUubG9nKGAjIHBpcGVsaW5lLW1hbmFnZXIgYmFzaCBjb21wbGV0aW9uc1xuX3BpcGVsaW5lX21hbmFnZXJfY29tcGxldGlvbnMoKSB7XG4gIGxvY2FsIGN1cj1cIlxcJHtDT01QX1dPUkRTW0NPTVBfQ1dPUkRdfVwiXG4gIGlmIFsgXCJcXCR7Q09NUF9DV09SRH1cIiAtZXEgMSBdOyB0aGVuXG5DT01QUkVQTFk9KCQoY29tcGdlbiAtVyBcIiR7dG9wTGV2ZWxTdHJ9XCIgLS0gXCJcXCR7Y3VyfVwiKSlcbnJldHVyblxuICBmaVxuICBjYXNlIFwiXFwke0NPTVBfV09SRFNbMV19XCIgaW5cbiR7Y2FzZXN9XG4gIGVzYWNcbn1cbmNvbXBsZXRlIC1GIF9waXBlbGluZV9tYW5hZ2VyX2NvbXBsZXRpb25zIHBpcGVsaW5lLW1hbmFnZXJgKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd6c2gnOiB7XG4gICAgICBjb25zdCBjYXNlcyA9IE9iamVjdC5lbnRyaWVzKHN1YnMpXG4gICAgICAgIC5tYXAoKFtucywgbGVhdmVzXSkgPT4gYCAgICAgICAgJHtuc30pIF92YWx1ZXMgJ3N1YmNvbW1hbmQnICR7bGVhdmVzLmpvaW4oJyAnKX07O2ApXG4gICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICAgIGNvbnNvbGUubG9nKGAjIHBpcGVsaW5lLW1hbmFnZXIgenNoIGNvbXBsZXRpb25zXG5fcGlwZWxpbmVfbWFuYWdlcigpIHtcbiAgaWYgKCggQ1VSUkVOVCA9PSAyICkpOyB0aGVuXG5fdmFsdWVzICdjb21tYW5kJyAke3RvcExldmVsLmpvaW4oJyAnKX1cbnJldHVyblxuICBmaVxuICBjYXNlIFwiXFwke3dvcmRzWzJdfVwiIGluXG4ke2Nhc2VzfVxuICBlc2FjXG59XG5jb21wZGVmIF9waXBlbGluZV9tYW5hZ2VyIHBpcGVsaW5lLW1hbmFnZXJgKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICdmaXNoJzoge1xuICAgICAgY29uc3QgbGluZXMgPSBbXG4gICAgICAgIGBjb21wbGV0ZSAtYyBwaXBlbGluZS1tYW5hZ2VyIC1uICdfX2Zpc2hfdXNlX3N1YmNvbW1hbmQnIC1hICcke3RvcExldmVsU3RyfSdgLFxuICAgICAgICAuLi5PYmplY3QuZW50cmllcyhzdWJzKS5tYXAoKFtucywgbGVhdmVzXSkgPT5cbiAgICAgICAgICBgY29tcGxldGUgLWMgcGlwZWxpbmUtbWFuYWdlciAtbiAnX19maXNoX3NlZW5fc3ViY29tbWFuZF9mcm9tICR7bnN9JyAtYSAnJHtsZWF2ZXMuam9pbignICcpfSdgKSxcbiAgICAgIF07XG4gICAgICBjb25zb2xlLmxvZyhgIyBwaXBlbGluZS1tYW5hZ2VyIGZpc2ggY29tcGxldGlvbnNcXG4ke2xpbmVzLmpvaW4oJ1xcbicpfWApO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICBjb25zb2xlLmVycm9yKGBVbmtub3duIHNoZWxsOiAke3NoZWxsfS4gVXNlIGJhc2gsIHpzaCwgb3IgZmlzaC5gKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIGFsbCBDTEkgY29tbWFuZHNcbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJDb21tYW5kcygpOiB2b2lkIHtcbiAgcHJpbnREZWJ1ZygnUmVnaXN0ZXJpbmcgY29tbWFuZHMnKTtcblxuICAvLyBDb25maWd1cmUgcHJvZ3JhbVxuICBwcm9ncmFtXG4gICAgLm5hbWUoQVBQX05BTUUpXG4gICAgLmRlc2NyaXB0aW9uKEFQUF9ERVNDUklQVElPTilcbiAgICAudmVyc2lvbihBUFBfVkVSU0lPTiwgJy12LCAtLXZlcnNpb24nLCAnU2hvdyBDTEkgdmVyc2lvbicpXG4gICAgLm9wdGlvbignLS1kZWJ1ZycsICdFbmFibGUgZGVidWcgb3V0cHV0IHdpdGggc3RhY2sgdHJhY2VzJywgZmFsc2UpXG4gICAgLm9wdGlvbignLS12ZXJib3NlJywgJ1Nob3cgZGV0YWlsZWQgaW5mb3JtYXRpb24nLCBmYWxzZSlcbiAgICAub3B0aW9uKCctLXF1aWV0JywgJ01pbmltYWwgb3V0cHV0IChlcnJvcnMgb25seSknLCBmYWxzZSlcbiAgICAub3B0aW9uKCctLW5vLWNvbG9yJywgJ0Rpc2FibGUgY29sb3JlZCBvdXRwdXQnLCBmYWxzZSlcbiAgICAuYWRkSGVscFRleHQoJ2FmdGVyJywgSEVMUF9URVhUKTtcblxuICAvLyAtLXVwZ3JhZGUgW3ZlcnNpb25dOiBzZWxmLXVwZGF0ZSwgaGFuZGxlZCBsaWtlIC0tdmVyc2lvbiAobGlzdGVuZXIgKyBleGl0KS5cbiAgcmVnaXN0ZXJVcGdyYWRlT3B0aW9uKHByb2dyYW0pO1xuXG4gIC8vIEZhaWwtZmFzdCBwcmVmbGlnaHQ6IGJlZm9yZSBBTlkgY29tbWFuZCdzIGFjdGlvbiBydW5zLCB2ZXJpZnkgdGhlIGxvY2FsXG4gIC8vIHRvb2xzIHRoYXQgY29tbWFuZCBuZWVkcy4gQ29tbWFuZGVyIHNraXBzIHRoaXMgZm9yIC0taGVscC8tLXZlcnNpb24gYW5kIGZvclxuICAvLyBoZWxwIG91dHB1dCwgc28gdGhvc2UgYWx3YXlzIHdvcms7IEFQSS1vbmx5IGNvbW1hbmRzIGRlY2xhcmUgbm8gcmVxdWlyZW1lbnRzXG4gIC8vIGFuZCBwYXNzIHRocm91Z2ggdW50b3VjaGVkLlxuICBwcm9ncmFtLmhvb2soJ3ByZUFjdGlvbicsIChfdGhpc0NvbW1hbmQsIGFjdGlvbkNvbW1hbmQpID0+IHByZWZsaWdodENvbW1hbmRUb29scyhhY3Rpb25Db21tYW5kKSk7XG5cbiAgLy8gVG9wLWxldmVsIG1ldGEgY29tbWFuZHMgKG5vIG5hbWVzcGFjZSkuXG4gIHZlcnNpb24ocHJvZ3JhbSk7XG4gIHN0YXR1cyhwcm9ncmFtKTsgLy8gU2hvdyBlbnZpcm9ubWVudCBhbmQgY29ubmVjdGl2aXR5IHN0YXR1c1xuXG4gIHJlZ2lzdGVyVGFza05hbWVzcGFjZXMoKTtcblxuICAvLyBTaGVsbCBjb21wbGV0aW9uc1xuICBwcmludERlYnVnKCdSZWdpc3RlcmluZyBjb21wbGV0aW9ucyBjb21tYW5kJyk7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZCgnY29tcGxldGlvbnMnKVxuICAgIC5kZXNjcmlwdGlvbignR2VuZXJhdGUgc2hlbGwgY29tcGxldGlvbnMgKGJhc2gsIHpzaCwgZmlzaCknKVxuICAgIC5hcmd1bWVudCgnPHNoZWxsPicsICdTaGVsbCB0eXBlOiBiYXNoLCB6c2gsIG9yIGZpc2gnKVxuICAgIC5hY3Rpb24oKHNoZWxsOiBzdHJpbmcpID0+IHtcbiAgICAgIHByaW50Q29tcGxldGlvbnMoc2hlbGwpO1xuICAgIH0pO1xuXG4gIHByaW50RGVidWcoJ0FsbCBjb21tYW5kcyByZWdpc3RlcmVkIHN1Y2Nlc3NmdWxseScpO1xufVxuXG4vKipcbiAqIEhhbmRsZSBwcm9ncmFtIGVycm9yc1xuICovXG5mdW5jdGlvbiBzZXR1cEVycm9ySGFuZGxlcnMoKTogdm9pZCB7XG4gIC8vIEhhbmRsZSB1bmNhdWdodCBleGNlcHRpb25zXG4gIHByb2Nlc3Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uJywgKGVycm9yOiBFcnJvcikgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgcHJpbnRFcnJvcignVW5jYXVnaHQgZXhjZXB0aW9uJywge1xuICAgICAgZXJyb3I6IGVycm9yLm1lc3NhZ2UsXG4gICAgICBuYW1lOiBlcnJvci5uYW1lLFxuICAgIH0pO1xuXG4gICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkdFTkVSQUwsIHtcbiAgICAgIGRlYnVnOiBpc0RlYnVnTW9kZShwcm9ncmFtLm9wdHMoKSksXG4gICAgICBleGl0OiB0cnVlLFxuICAgICAgY29udGV4dDoge1xuICAgICAgICB0eXBlOiAndW5jYXVnaHRFeGNlcHRpb24nLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gSGFuZGxlIHVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbnNcbiAgcHJvY2Vzcy5vbigndW5oYW5kbGVkUmVqZWN0aW9uJywgKHJlYXNvbjogdW5rbm93bikgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgcHJpbnRFcnJvcignVW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uJywge1xuICAgICAgcmVhc29uOiBlcnJvck1lc3NhZ2UocmVhc29uKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGVycm9yID0gcmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyByZWFzb246IG5ldyBFcnJvcihTdHJpbmcocmVhc29uKSk7XG5cbiAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuR0VORVJBTCwge1xuICAgICAgZGVidWc6IGlzRGVidWdNb2RlKHByb2dyYW0ub3B0cygpKSxcbiAgICAgIGV4aXQ6IHRydWUsXG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIHR5cGU6ICd1bmhhbmRsZWRSZWplY3Rpb24nLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gSGFuZGxlIFNJR0lOVCAoQ3RybCtDKVxuICBwcm9jZXNzLm9uKCdTSUdJTlQnLCAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgcHJpbnRXYXJuaW5nKCdQcm9jZXNzIGludGVycnVwdGVkIGJ5IHVzZXIgKFNJR0lOVCknKTtcbiAgICBjb25zb2xlLmxvZygnJyk7IC8vIEVtcHR5IGxpbmVcbiAgICBwcm9jZXNzLmV4aXQoMTMwKTsgLy8gU3RhbmRhcmQgZXhpdCBjb2RlIGZvciBTSUdJTlRcbiAgfSk7XG5cbiAgLy8gSGFuZGxlIFNJR1RFUk1cbiAgcHJvY2Vzcy5vbignU0lHVEVSTScsICgpID0+IHtcbiAgICBjb25zb2xlLmxvZygnJyk7IC8vIEVtcHR5IGxpbmVcbiAgICBwcmludFdhcm5pbmcoJ1Byb2Nlc3MgdGVybWluYXRlZCAoU0lHVEVSTSknKTtcbiAgICBjb25zb2xlLmxvZygnJyk7IC8vIEVtcHR5IGxpbmVcbiAgICBwcm9jZXNzLmV4aXQoMTQzKTsgLy8gU3RhbmRhcmQgZXhpdCBjb2RlIGZvciBTSUdURVJNXG4gIH0pO1xufVxuXG4vKipcbiAqIEluaXRpYWxpemUgQ0xJIHdpdGggb3B0aW9uc1xuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ0xJIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaXRpYWxpemVDbGkob3B0aW9uczogQ2xpT3B0aW9ucyA9IHt9KTogdm9pZCB7XG4gIGNvbnN0IHtcbiAgICBzaG93QmFubmVyID0gdHJ1ZSxcbiAgICBtaW5pbWFsQmFubmVyID0gZmFsc2UsXG4gICAgZGVidWcgPSBmYWxzZSxcbiAgICB2ZXJib3NlID0gZmFsc2UsXG4gICAgcXVpZXQgPSBmYWxzZSxcbiAgICBub0NvbG9yID0gZmFsc2UsXG4gICAgc2VsZlVwZGF0ZSA9IGZhbHNlLFxuICB9ID0gb3B0aW9ucztcblxuICAvLyBIYW5kbGUgY29sb3Igb3V0cHV0XG4gIGlmIChub0NvbG9yKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9fQ09MT1IgPSAnMSc7XG4gIH1cblxuICAvLyBEaXNwbGF5IGJhbm5lclxuICBpZiAoc2hvd0Jhbm5lciAmJiAhcXVpZXQpIHtcbiAgICBpZiAobWluaW1hbEJhbm5lcikge1xuICAgICAgbWluaUJhbm5lcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBiYW5uZXIoe1xuICAgICAgICBtaW5pbWFsOiBmYWxzZSxcbiAgICAgICAgc2hvd0Rlc2NyaXB0aW9uOiB0cnVlLFxuICAgICAgICBzaG93VGltZXN0YW1wOiBkZWJ1ZyB8fCB2ZXJib3NlLFxuICAgICAgICBzaG93RXhlY3V0aW9uSWQ6IGRlYnVnLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gRGlzcGxheSBzdGFydHVwIGluZm9cbiAgZGlzcGxheVN0YXJ0dXBJbmZvKHsgZGVidWcsIHZlcmJvc2UsIHF1aWV0IH0pO1xuXG4gIC8vIENoZWNrIGVudmlyb25tZW50XG4gIGlmICghcXVpZXQpIHtcbiAgICBjaGVja0Vudmlyb25tZW50KHsgc2lnbkluUmVsZXZhbnQ6ICFzZWxmVXBkYXRlIH0pO1xuICB9XG5cbiAgLy8gU2V0dXAgZXJyb3IgaGFuZGxlcnNcbiAgc2V0dXBFcnJvckhhbmRsZXJzKCk7XG5cbiAgLy8gUmVnaXN0ZXIgY29tbWFuZHNcbiAgdHJ5IHtcbiAgICByZWdpc3RlckNvbW1hbmRzKCk7XG4gICAgcHJpbnREZWJ1ZygnQ0xJIGluaXRpYWxpemF0aW9uIGNvbXBsZXRlJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcHJpbnRFcnJvcignQ0xJIGluaXRpYWxpemF0aW9uIGZhaWxlZCcsIHtcbiAgICAgIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyb3IpLFxuICAgIH0pO1xuXG4gICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkNPTkZJR1VSQVRJT04sIHtcbiAgICAgIGRlYnVnOiBkZWJ1ZyB8fCBpc0RlYnVnTW9kZSgpLFxuICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgc3RhZ2U6ICdpbml0aWFsaXphdGlvbicsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUGFyc2UgY29tbWFuZCBsaW5lIGFyZ3VtZW50c1xuICovXG5mdW5jdGlvbiBwYXJzZUFyZ3VtZW50cygpOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBwcm9ncmFtLnBhcnNlKHByb2Nlc3MuYXJndik7XG5cbiAgICAvLyBTaG93IGhlbHAgaWYgbm8gY29tbWFuZCBwcm92aWRlZFxuICAgIGNvbnN0IGFyZ3MgPSBwcm9jZXNzLmFyZ3Yuc2xpY2UoMik7XG4gICAgaWYgKGFyZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBwcmludEluZm8oJ05vIGNvbW1hbmQgc3BlY2lmaWVkIC0gZGlzcGxheWluZyBoZWxwJyk7XG4gICAgICBjb25zb2xlLmxvZygnJyk7IC8vIEVtcHR5IGxpbmVcbiAgICAgIHByb2dyYW0ub3V0cHV0SGVscCgpO1xuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGNvbW1hbmQgZXhpc3RzXG4gICAgY29uc3QgY29tbWFuZCA9IGFyZ3NbMF07XG4gICAgaWYgKGNvbW1hbmQgJiYgIWNvbW1hbmQuc3RhcnRzV2l0aCgnLScpKSB7XG4gICAgICBjb25zdCBjb21tYW5kRXhpc3RzID0gcHJvZ3JhbS5jb21tYW5kcy5zb21lKGNtZCA9PiBjbWQubmFtZSgpID09PSBjb21tYW5kKTtcblxuICAgICAgaWYgKCFjb21tYW5kRXhpc3RzKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgICAgICBwcmludEVycm9yKGBVbmtub3duIGNvbW1hbmQ6ICR7Y29tbWFuZH1gKTtcbiAgICAgICAgY29uc29sZS5sb2coJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgICAgIHByaW50SW5mbygnQXZhaWxhYmxlIGNvbW1hbmRzOicpO1xuICAgICAgICBwcm9ncmFtLmNvbW1hbmRzLmZvckVhY2goY21kID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgIOKAoiAke2NtZC5uYW1lKCl9IC0gJHtjbWQuZGVzY3JpcHRpb24oKX1gKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJpbnREZWJ1ZygnQ29tbWFuZCBsaW5lIGFyZ3VtZW50cyBwYXJzZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkdFTkVSQUwsIHtcbiAgICAgIGRlYnVnOiBpc0RlYnVnTW9kZShwcm9ncmFtLm9wdHMoKSksXG4gICAgICBleGl0OiB0cnVlLFxuICAgICAgY29udGV4dDoge1xuICAgICAgICBzdGFnZTogJ2FyZ3VtZW50LXBhcnNpbmcnLFxuICAgICAgICBhcmd2OiBwcm9jZXNzLmFyZ3YsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogTWFpbiBDTEkgZW50cnkgcG9pbnRcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENMSSBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIFN0YW5kYXJkIGluaXRpYWxpemF0aW9uXG4gKiBtYWluKCk7XG4gKlxuICogLy8gTWluaW1hbCBtb2RlXG4gKiBtYWluKHsgbWluaW1hbEJhbm5lcjogdHJ1ZSwgcXVpZXQ6IHRydWUgfSk7XG4gKlxuICogLy8gRGVidWcgbW9kZVxuICogbWFpbih7IGRlYnVnOiB0cnVlLCB2ZXJib3NlOiB0cnVlIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWluKG9wdGlvbnM6IENsaU9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICB0cnkge1xuICAgIC8vIEluaXRpYWxpemUgQ0xJXG4gICAgaW5pdGlhbGl6ZUNsaShvcHRpb25zKTtcblxuICAgIC8vIFBhcnNlIGFyZ3VtZW50cyBhbmQgZXhlY3V0ZSBjb21tYW5kXG4gICAgcGFyc2VBcmd1bWVudHMoKTtcblxuICAgIC8vIElmIHdlIHJlYWNoIGhlcmUsIGNvbW1hbmQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseVxuICAgIHByaW50RGVidWcoJ0NMSSBleGVjdXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseScpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIEZpbmFsIGNhdGNoLWFsbCBlcnJvciBoYW5kbGVyXG4gICAgY29uc29sZS5lcnJvcignJyk7IC8vIEVtcHR5IGxpbmVcbiAgICBwcmludEVycm9yKCdGYXRhbCBDTEkgZXJyb3InLCB7XG4gICAgICBlcnJvcjogZXJyb3JNZXNzYWdlKGVycm9yKSxcbiAgICB9KTtcblxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBFUlJPUl9DT0RFUy5HRU5FUkFMLCB7XG4gICAgICBkZWJ1ZzogaXNEZWJ1Z01vZGUob3B0aW9ucyksXG4gICAgICBleGl0OiB0cnVlLFxuICAgICAgY29udGV4dDoge1xuICAgICAgICBzdGFnZTogJ21haW4nLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJ1biBDTEkgaWYgZXhlY3V0ZWQgZGlyZWN0bHkuIEVTTSBoYXMgbm8gYHJlcXVpcmUubWFpbmA7IGNvbXBhcmUgdGhlIGludm9rZWRcbiAqIHNjcmlwdCB0byB0aGlzIG1vZHVsZSdzIHBhdGgsIHJlc29sdmluZyBzeW1saW5rcyBvbiBib3RoIHNpZGVzIHNvIHRoZSBgYmluYFxuICogc3ltbGluayAobm9kZV9tb2R1bGVzLy5iaW4vcGlwZWxpbmUtbWFuYWdlciDihpIgZGlzdC9jbGkuanMpIHN0aWxsIG1hdGNoZXMuXG4gKi9cbmNvbnN0IGludm9rZWRTY3JpcHQgPSBwcm9jZXNzLmFyZ3ZbMV07XG5jb25zdCBpc01haW5Nb2R1bGUgPSBpbnZva2VkU2NyaXB0ICE9PSB1bmRlZmluZWRcbiAgJiYgcmVhbHBhdGhTeW5jKGludm9rZWRTY3JpcHQpID09PSByZWFscGF0aFN5bmMoZmlsZVVSTFRvUGF0aChpbXBvcnQubWV0YS51cmwpKTtcbmlmIChpc01haW5Nb2R1bGUpIHtcbiAgLy8gUGFyc2UgQ0xJIG9wdGlvbnMgZnJvbSBlbnZpcm9ubWVudCBvciBjb21tYW5kIGxpbmVcbiAgY29uc3Qgb3B0aW9uczogQ2xpT3B0aW9ucyA9IHtcbiAgICBkZWJ1ZzogcHJvY2Vzcy5lbnYuREVCVUcgPT09ICd0cnVlJyxcbiAgICAvLyBgLS10b2tlbmAgcHJpbnRzIGEgYmFyZSB0b2tlbiBmb3IgYCQo4oCmKWAgY2FwdHVyZSwgc28gdGhlIGJhbm5lciBhbmQgdGhlXG4gICAgLy8gc3RhcnR1cCBjaHJvbWUgbXVzdCBub3QgcmVhY2ggc3Rkb3V0IGVpdGhlci4gU2Nhbm5lZCBmcm9tIGFyZ3YgbGlrZVxuICAgIC8vIGAtLXF1aWV0YCBpcywgYmVjYXVzZSB0aGlzIHJ1bnMgQkVGT1JFIENvbW1hbmRlciBwYXJzZXMuXG4gICAgcXVpZXQ6IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1xdWlldCcpIHx8IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS10b2tlbicpLFxuICAgIHZlcmJvc2U6IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS12ZXJib3NlJyksXG4gICAgbm9Db2xvcjogcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLW5vLWNvbG9yJykgfHwgcHJvY2Vzcy5lbnYuTk9fQ09MT1IgPT09ICcxJyxcbiAgICBzZWxmVXBkYXRlOiBpc1NlbGZVcGRhdGUocHJvY2Vzcy5hcmd2LnNsaWNlKDIpKSxcbiAgfTtcblxuICAvLyBEYWlseSBiYWNrZ3JvdW5kIGNoZWNrOyBwcmludHMgXCJ1cGRhdGUgYXZhaWxhYmxlXCIgdG8gc3RkZXJyIG9uIGV4aXQuXG4gIHNjaGVkdWxlVXBkYXRlTm90aWNlKCk7XG4gIG1haW4ob3B0aW9ucyk7XG59Il19
529
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlcyI6WyIuLi9zcmMvY2xpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSwrQ0FBK0M7QUFDL0Msc0NBQXNDO0FBRXRDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDdkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDMUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDckQsT0FBTyxFQUFFLFNBQVMsRUFB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QUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7UUFDM0UsT0FBTyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUMzQyxPQUFPLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEtBQUssR0FBRztRQUM1RSxVQUFVLEVBQUUsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2hELENBQUM7SUFFRix1RUFBdUU7SUFDdkUsb0JBQW9CLEVBQUUsQ0FBQztJQUN2QixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcbi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyByZWFscGF0aFN5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQgeyBlcnJvck1lc3NhZ2UgfSBmcm9tICdAcGlwZWxpbmUtYnVpbGRlci9hcGktY29yZSc7XG5pbXBvcnQgeyBwcm9ncmFtIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7IGF1ZGl0U3RhY2tzIH0gZnJvbSAnLi9jb21tYW5kcy9hdWRpdC1zdGFja3MuanMnO1xuaW1wb3J0IHsgYXVkaXRUb2tlbnMgfSBmcm9tICcuL2NvbW1hbmRzL2F1ZGl0LXRva2Vucy5qcyc7XG5pbXBvcnQgeyBib290c3RyYXAgfSBmcm9tICcuL2NvbW1hbmRzL2Jvb3RzdHJhcC5qcyc7XG5pbXBvcnQgeyBjcmVhdGVQYXQgfSBmcm9tICcuL2NvbW1hbmRzL2NyZWF0ZS1wYXQuanMnO1xuaW1wb3J0IHsgY3JlYXRlUGlwZWxpbmUgfSBmcm9tICcuL2NvbW1hbmRzL2NyZWF0ZS1waXBlbGluZS5qcyc7XG5pbXBvcnQgeyBkZXBsb3kgfSBmcm9tICcuL2NvbW1hbmRzL2RlcGxveS5qcyc7XG5pbXBvcnQgeyBnZXRQaXBlbGluZSB9IGZyb20gJy4vY29tbWFuZHMvZ2V0LXBpcGVsaW5lLmpzJztcbmltcG9ydCB7IGdldFBsdWdpbiB9IGZyb20gJy4vY29tbWFuZHMvZ2V0LXBsdWdpbi5qcyc7XG5pbXBvcnQgeyBpbnN0YW50aWF0ZVRlbXBsYXRlIH0gZnJvbSAnLi9jb21tYW5kcy9pbnN0YW50aWF0ZS10ZW1wbGF0ZS5qcyc7XG5pbXBvcnQgeyBsaXN0UGlwZWxpbmVzIH0gZnJvbSAnLi9jb21tYW5kcy9saXN0LXBpcGVsaW5lcy5qcyc7XG5pbXBvcnQgeyBsaXN0UGx1Z2lucyB9IGZyb20gJy4vY29tbWFuZHMvbGlzdC1wbHVnaW5zLmpzJztcbmltcG9ydCB7IGxvZ2luIH0gZnJvbSAnLi9jb21tYW5kcy9sb2dpbi5qcyc7XG5pbXBvcnQgeyBsb2dvdXQgfSBmcm9tICcuL2NvbW1hbmRzL2xvZ291dC5qcyc7XG5pbXBvcnQgeyBuZXdQbHVnaW4gfSBmcm9tICcuL2NvbW1hbmRzL25ldy1wbHVnaW4uanMnO1xuaW1wb3J0IHsgb3JnRXhwb3J0IH0gZnJvbSAnLi9jb21tYW5kcy9vcmctZXhwb3J0LmpzJztcbmltcG9ydCB7IGRlbGV0ZVBpcGVsaW5lLCBkZXJlZ2lzdGVyUGlwZWxpbmUgfSBmcm9tICcuL2NvbW1hbmRzL3BpcGVsaW5lLXJlbW92ZS5qcyc7XG5pbXBvcnQgeyBkZXByZWNhdGVQbHVnaW4sIHlhbmtQbHVnaW4gfSBmcm9tICcuL2NvbW1hbmRzL3BsdWdpbi1saWZlY3ljbGUuanMnO1xuaW1wb3J0IHsgcHJvdmlzaW9uIH0gZnJvbSAnLi9jb21tYW5kcy9wcm92aXNpb24uanMnO1xuaW1wb3J0IHsgcHVibGlzaFBsdWdpbiB9IGZyb20gJy4vY29tbWFuZHMvcHVibGlzaC1wbHVnaW4uanMnO1xuaW1wb3J0IHsgcmVkcml2ZUV2ZW50cyB9IGZyb20gJy4vY29tbWFuZHMvcmVkcml2ZS1ldmVudHMuanMnO1xuaW1wb3J0IHsgcmVnaXN0ZXIgfSBmcm9tICcuL2NvbW1hbmRzL3JlZ2lzdGVyLmpzJztcbmltcG9ydCB7IHJlcG9ydCB9IGZyb20gJy4vY29tbWFuZHMvcmVwb3J0LmpzJztcbmltcG9ydCB7IHNlY3VyaXR5UmVwb3J0IH0gZnJvbSAnLi9jb21tYW5kcy9zZWN1cml0eS1yZXBvcnQuanMnO1xuaW1wb3J0IHsgc2V0dXBFdmVudHMgfSBmcm9tICcuL2NvbW1hbmRzL3NldHVwLWV2ZW50cy5qcyc7XG5pbXBvcnQgeyBzdGF0dXMgfSBmcm9tICcuL2NvbW1hbmRzL3N0YXR1cy5qcyc7XG5pbXBvcnQgeyBzdG9yZVRva2VuIH0gZnJvbSAnLi9jb21tYW5kcy9zdG9yZS10b2tlbi5qcyc7XG5pbXBvcnQgeyBzeW50aCB9IGZyb20gJy4vY29tbWFuZHMvc3ludGguanMnO1xuaW1wb3J0IHsgdGVzdFBsdWdpbiB9IGZyb20gJy4vY29tbWFuZHMvdGVzdC1wbHVnaW4uanMnO1xuaW1wb3J0IHsgdG9vbGNoYWluIH0gZnJvbSAnLi9jb21tYW5kcy90b29sY2hhaW4uanMnO1xuaW1wb3J0IHsgcmVnaXN0ZXJVcGdyYWRlT3B0aW9uIH0gZnJvbSAnLi9jb21tYW5kcy91cGdyYWRlLmpzJztcbmltcG9ydCB7IHVwbG9hZFBsdWdpbiB9IGZyb20gJy4vY29tbWFuZHMvdXBsb2FkLXBsdWdpbi5qcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVBsdWdpbiB9IGZyb20gJy4vY29tbWFuZHMvdmFsaWRhdGUtcGx1Z2luLmpzJztcbmltcG9ydCB7IHZhbGlkYXRlVGVtcGxhdGVzQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMvdmFsaWRhdGUtdGVtcGxhdGVzLmpzJztcbmltcG9ydCB7IHZlcmlmeVBsdWdpbnMgfSBmcm9tICcuL2NvbW1hbmRzL3ZlcmlmeS1wbHVnaW5zLmpzJztcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuL2NvbW1hbmRzL3ZlcnNpb24uanMnO1xuaW1wb3J0IHtcbiAgQVBQX05BTUUsXG4gIEFQUF9ERVNDUklQVElPTixcbiAgQVBQX1ZFUlNJT04sXG4gIEVOVl9WQVJTLFxuICBpc0RlYnVnTW9kZSxcbiAgZ2VuZXJhdGVFeGVjdXRpb25JZCxcbiAgbWVldHNOb2RlVmVyc2lvbkZsb29yLFxuICBOT0RFX1ZFUlNJT05fRkxPT1IsXG59IGZyb20gJy4vY29uZmlnL2NsaS5jb25zdGFudHMuanMnO1xuaW1wb3J0IHsgYmFubmVyLCBtaW5pQmFubmVyIH0gZnJvbSAnLi91dGlscy9iYW5uZXIuanMnO1xuaW1wb3J0IHsgZ2V0QXBpQ29uZmlnIH0gZnJvbSAnLi91dGlscy9jb25maWctbG9hZGVyLmpzJztcbmltcG9ydCB7IGxvYWRTZXNzaW9uIH0gZnJvbSAnLi91dGlscy9jcmVkZW50aWFsLXN0b3JlLmpzJztcbmltcG9ydCB7IEVSUk9SX0NPREVTLCBoYW5kbGVFcnJvciB9IGZyb20gJy4vdXRpbHMvZXJyb3ItaGFuZGxlci5qcyc7XG5pbXBvcnQgeyBwcmludEluZm8sIHByaW50RXJyb3IsIHByaW50V2FybmluZywgcHJpbnREZWJ1ZywgcHJpbnRTZWN0aW9uIH0gZnJvbSAnLi91dGlscy9vdXRwdXQtdXRpbHMuanMnO1xuaW1wb3J0IHsgcHJlZmxpZ2h0Q29tbWFuZFRvb2xzIH0gZnJvbSAnLi91dGlscy9wcmVmbGlnaHQuanMnO1xuaW1wb3J0IHsgc2NoZWR1bGVVcGRhdGVOb3RpY2UgfSBmcm9tICcuL3V0aWxzL3VwZGF0ZS1ub3RpY2UuanMnO1xuXG4vKipcbiAqIENMSSBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gKi9cbmludGVyZmFjZSBDbGlPcHRpb25zIHtcbiAgLyoqXG4gICAqIFNob3cgYmFubmVyIG9uIHN0YXJ0dXBcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgc2hvd0Jhbm5lcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE1pbmltYWwgYmFubmVyIChubyBBU0NJSSBhcnQpXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBtaW5pbWFsQmFubmVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGVidWcgbW9kZVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgZGVidWc/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBWZXJib3NlIG91dHB1dFxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgdmVyYm9zZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFF1aWV0IG1vZGUgKG1pbmltYWwgb3V0cHV0KVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcXVpZXQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBObyBjb2xvciBvdXRwdXRcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIG5vQ29sb3I/OiBib29sZWFuO1xuICAvKipcbiAgICogYC0tdXBncmFkZWAgLyBgLS11cGdyYWRlLWNoZWNrYDogdGFsa3Mgb25seSB0byB0aGUgbnBtIHJlZ2lzdHJ5LCBuZXZlciB0b1xuICAgKiB0aGUgcGxhdGZvcm0sIHNvIGl0IG11c3Qgd29yayBzaWduZWQgb3V0IGFuZCB3aXRob3V0IHRoZSBzaWduLWluIHdhcm5pbmcuXG4gICAqL1xuICBzZWxmVXBkYXRlPzogYm9vbGVhbjtcbn1cblxuLyoqIFdoZXRoZXIgYXJndiBhc2tzIGZvciBhIHNlbGYtdXBkYXRlIChgLS11cGdyYWRlYCAvIGAtLXVwZ3JhZGUtY2hlY2tgLCB3aXRoIG9yIHdpdGhvdXQgYSB2ZXJzaW9uKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1NlbGZVcGRhdGUoYXJndjogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIGFyZ3Yuc29tZSgoYSkgPT4gYSA9PT0gJy0tdXBncmFkZScgfHwgYSA9PT0gJy0tdXBncmFkZS1jaGVjaycgfHwgYS5zdGFydHNXaXRoKCctLXVwZ3JhZGU9JykgfHwgYS5zdGFydHNXaXRoKCctLXVwZ3JhZGUtY2hlY2s9JykpO1xufVxuXG4vKipcbiAqIENoZWNrIGVudmlyb25tZW50IGFuZCBkaXNwbGF5IHdhcm5pbmdzXG4gKi9cbmZ1bmN0aW9uIGNoZWNrRW52aXJvbm1lbnQoeyBzaWduSW5SZWxldmFudCA9IHRydWUgfTogeyBzaWduSW5SZWxldmFudD86IGJvb2xlYW4gfSA9IHt9KTogdm9pZCB7XG4gIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIE5vdCBzaWduZWQgaW4gQVQgQUxMOiBuZWl0aGVyIGFuIGV4cGxpY2l0IHRva2VuIG5vciBhIHN0b3JlZCBicm93c2VyXG4gIC8vIHNpZ24taW4uIEVpdGhlciBhbG9uZSBpcyBlbm91Z2gsIHNvIHRoZSB3YXJuaW5nIG9ubHkgZmlyZXMgd2hlbiBib3RoIGFyZVxuICAvLyBtaXNzaW5nIOKAlCBvdGhlcndpc2UgYGF1dGggbG9naW5gIHVzZXJzIHdvdWxkIGJlIG5hZ2dlZCBvbiBldmVyeSBjb21tYW5kLlxuICBpZiAoc2lnbkluUmVsZXZhbnQgJiYgIXByb2Nlc3MuZW52W0VOVl9WQVJTLlBMQVRGT1JNX1RPS0VOXSAmJiAhbG9hZFNlc3Npb24oZ2V0QXBpQ29uZmlnKCkuYXBpLmJhc2VVcmwpKSB7XG4gICAgd2FybmluZ3MucHVzaCgnTm90IHNpZ25lZCBpbiAobm8gUExBVEZPUk1fVE9LRU4sIG5vIHN0b3JlZCBzZXNzaW9uKScpO1xuICAgIHdhcm5pbmdzLnB1c2goJ1J1biBcInBpcGVsaW5lLW1hbmFnZXIgYXV0aCBsb2dpblwiIOKAlCBBUEkgb3BlcmF0aW9ucyB3aWxsIGZhaWwgdW50aWwgeW91IGRvJyk7XG4gIH1cblxuICAvLyBDaGVjayBOb2RlIHZlcnNpb25cbiAgY29uc3Qgbm9kZVZlcnNpb24gPSBwcm9jZXNzLnZlcnNpb247XG4gIGlmICghbWVldHNOb2RlVmVyc2lvbkZsb29yKG5vZGVWZXJzaW9uKSkge1xuICAgIHdhcm5pbmdzLnB1c2goYE5vZGUuanMgJHtub2RlVmVyc2lvbn0gZGV0ZWN0ZWQgLSB2ZXJzaW9uICR7Tk9ERV9WRVJTSU9OX0ZMT09SfSsgcmVxdWlyZWQgKHNlZSBwYWNrYWdlLmpzb24gZW5naW5lcylgKTtcbiAgfVxuXG4gIC8vIERpc3BsYXkgd2FybmluZ3NcbiAgaWYgKHdhcm5pbmdzLmxlbmd0aCA+IDApIHtcbiAgICBwcmludFNlY3Rpb24oJ0Vudmlyb25tZW50IFdhcm5pbmdzJyk7XG4gICAgd2FybmluZ3MuZm9yRWFjaCh3YXJuaW5nID0+IHtcbiAgICAgIHByaW50V2FybmluZyh3YXJuaW5nKTtcbiAgICB9KTtcbiAgICBjb25zb2xlLmxvZygnJyk7XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNwbGF5IHN0YXJ0dXAgaW5mb3JtYXRpb25cbiAqL1xuZnVuY3Rpb24gZGlzcGxheVN0YXJ0dXBJbmZvKG9wdGlvbnM6IENsaU9wdGlvbnMpOiB2b2lkIHtcbiAgaWYgKG9wdGlvbnMucXVpZXQpIHJldHVybjtcblxuICBjb25zdCBleGVjdXRpb25JZCA9IGdlbmVyYXRlRXhlY3V0aW9uSWQoKTtcblxuICBpZiAob3B0aW9ucy5kZWJ1ZyB8fCBvcHRpb25zLnZlcmJvc2UpIHtcbiAgICBwcmludERlYnVnKCdDTEkgQ29uZmlndXJhdGlvbicsIHtcbiAgICAgIG5hbWU6IEFQUF9OQU1FLFxuICAgICAgdmVyc2lvbjogQVBQX1ZFUlNJT04sXG4gICAgICBleGVjdXRpb25JZCxcbiAgICAgIG5vZGU6IHByb2Nlc3MudmVyc2lvbixcbiAgICAgIHBsYXRmb3JtOiBwcm9jZXNzLnBsYXRmb3JtLFxuICAgICAgYXJjaDogcHJvY2Vzcy5hcmNoLFxuICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgICAgZW52OiB7XG4gICAgICAgIGRlYnVnOiBwcm9jZXNzLmVudi5ERUJVRyxcbiAgICAgICAgdG9rZW46IHByb2Nlc3MuZW52W0VOVl9WQVJTLlBMQVRGT1JNX1RPS0VOXSA/ICdzZXQnOiAnbm90IHNldCcsXG4gICAgICAgIHVybDogcHJvY2Vzcy5lbnZbRU5WX1ZBUlMuUExBVEZPUk1fQkFTRV9VUkxdIHx8ICdkZWZhdWx0JyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgcHJpbnREZWJ1ZygnU3RhcnRpbmcgQ0xJJywge1xuICAgICAgdmVyc2lvbjogQVBQX1ZFUlNJT04sXG4gICAgICBleGVjdXRpb25JZCxcbiAgICB9KTtcbiAgfVxufVxuXG4vKiogVG9wLWxldmVsIGAtLWhlbHBgIGVwaWxvZ3VlOiBjb21tYW5kIGdyb3VwcywgYXV0aCwgZW52IHZhcnMsIGV4YW1wbGVzLCBleGl0IGNvZGVzLiAqL1xuY29uc3QgSEVMUF9URVhUID0gYFxuQ29tbWFuZCBncm91cHM6XG4gIGF1dGggICAgICBBdXRoZW50aWNhdGUgYW5kIG1hbmFnZSBjcmVkZW50aWFscyAobG9naW4sIGxvZ291dCwgcGF0KVxuICBwaXBlbGluZSAgQ3JlYXRlLCBpbnNwZWN0LCBhbmQgZGVwbG95IHBpcGVsaW5lcyAoY3JlYXRlLCBsaXN0LCBnZXQsIHJlZ2lzdGVyLCBkZXJlZ2lzdGVyLCBkZWxldGUsIHN5bnRoLCBkZXBsb3kpXG4gIHBsdWdpbiAgICBBdXRob3IsIHZhbGlkYXRlLCBhbmQgcHVibGlzaCBwbHVnaW5zIChuZXcsIHZhbGlkYXRlLCB0ZXN0LCBwdWJsaXNoLCB1cGxvYWQsIGdldCwgbGlzdCwgZGVwcmVjYXRlLCB5YW5rLCB2ZXJpZnkpXG4gIHRlbXBsYXRlICBJbnN0YW50aWF0ZSBnb2xkZW4tcGF0aCBwaXBlbGluZSB0ZW1wbGF0ZXMgYW5kIHZhbGlkYXRlIHt7IC4uLiB9fSBzeW50YXggKGluc3RhbnRpYXRlLCB2YWxpZGF0ZSlcbiAgaW5mcmEgICAgIFNldCB1cCBhbmQgb3BlcmF0ZSBwbGF0Zm9ybSBpbmZyYXN0cnVjdHVyZSAoYm9vdHN0cmFwLCBzZXR1cC1ldmVudHMsIHJlZHJpdmUtZXZlbnRzLCBzdG9yZS10b2tlbiwgcHJvdmlzaW9uKVxuICBhdWRpdCAgICAgT3BlcmF0b3IgYXVkaXRzLCBjcm9uLWZyaWVuZGx5ICh0b2tlbnMsIHN0YWNrcylcbiAgb3JnICAgICAgIE9yZ2FuaXphdGlvbiBkYXRhIG9wZXJhdGlvbnMgKGV4cG9ydClcbiAgc2VjdXJpdHktcmVwb3J0ICBVcGxvYWQgU0FSSUYgLyB0cml2eSAvIGdyeXBlIHJlcG9ydHMgcHJvZHVjZWQgaW5zaWRlIGEgcGlwZWxpbmUgKHVwbG9hZClcbiAgcmVwb3J0ICAgIFN0YWtlaG9sZGVyIHJlcG9ydHMgKGxpc3QsIGNyZWF0ZSwgcnVuLCBwdWJsaXNoLCBsaW5rLCBwZGYsIHRyYW5zZmVyKVxuICB0b29sY2hhaW4gVGhlIHBpcGVsaW5lIHRvb2xjaGFpbiByZWxlYXNlIChleHBvcnQpXG4gIHN0YXR1cyAvIHZlcnNpb24gLyBjb21wbGV0aW9uc1xuXG5BdXRoZW50aWNhdGlvbjpcbiAgUnVuICcke0FQUF9OQU1FfSBhdXRoIGxvZ2luJyBvbmNlIHBlciBwbGF0Zm9ybSDigJQgaXQgc2lnbnMgeW91IGluIHRocm91Z2ggeW91clxuICBicm93c2VyIChubyBwYXNzd29yZCBvbiB0aGUgY29tbWFuZCBsaW5lKSBhbmQgc3RvcmVzIHRoZSBzZXNzaW9uIHVuZGVyXG4gIH4vLnBpcGVsaW5lLW1hbmFnZXIvY3JlZGVudGlhbHMuanNvbi4gRm9yIENJLCBjcmVhdGUgYW4gYWNjZXNzIGtleSB3aXRoXG4gICcke0FQUF9OQU1FfSBhdXRoIHBhdCcgYW5kIGV4cG9ydCBpdCBhcyAke0VOVl9WQVJTLlBMQVRGT1JNX1RPS0VOfSwgd2hpY2ggYWx3YXlzIHdpbnMuXG5cbkVudmlyb25tZW50IFZhcmlhYmxlczpcbiAgJHtFTlZfVkFSUy5QTEFURk9STV9UT0tFTn0gQWNjZXNzIGtleSBvciB0b2tlbiAob3ZlcnJpZGVzIHRoZSBzdG9yZWQgc2Vzc2lvbilcbiAgJHtFTlZfVkFSUy5QTEFURk9STV9CQVNFX1VSTH0gQVBJIGJhc2UgVVJMIChvcHRpb25hbClcbiAgJHtFTlZfVkFSUy5DTElfQ09ORklHX1BBVEh9IENvbmZpZyBmaWxlIHBhdGggKG9wdGlvbmFsKVxuICAke0VOVl9WQVJTLlRMU19SRUpFQ1RfVU5BVVRIT1JJWkVEfSBEaXNhYmxlIFNTTCB2ZXJpZmljYXRpb24gaWYgJzAnXG4gIFBMQVRGT1JNX0NBX0JVTkRMRSAgUEVNIG9mIGEgcHJpdmF0ZSBDQSB0byB0cnVzdCBmb3IgdGhlIHBsYXRmb3JtICh2ZXJpZmllZCwgbm90IHNraXBwZWQpXG4gICR7RU5WX1ZBUlMuREVCVUd9IEVuYWJsZSBkZWJ1ZyBtb2RlIGlmICd0cnVlJ1xuXG5FeGFtcGxlczpcbiAgJCAke0FQUF9OQU1FfSB2ZXJzaW9uXG4gICQgJHtBUFBfTkFNRX0gLS11cGdyYWRlICAgICAgICAgICAgKC0tdXBncmFkZSA8dmVyc2lvbj4gZm9yIGEgc3BlY2lmaWMgb25lLCAtLXVwZ3JhZGUtY2hlY2sgdG8gb25seSBsb29rKVxuICAkICR7QVBQX05BTUV9IGF1dGggbG9naW5cbiAgJCAke0FQUF9OQU1FfSBwaXBlbGluZSBsaXN0IC0tcHJvamVjdCBteS1hcHBcbiAgJCAke0FQUF9OQU1FfSBwaXBlbGluZSBnZXQgLS1pZCBwaXBlLTEyMyAtLWZvcm1hdCBqc29uXG4gICQgJHtBUFBfTkFNRX0gcGlwZWxpbmUgY3JlYXRlIC1mIHByb3BzLmpzb24gLS1kZXBsb3kgLS1wcm9maWxlIHByb2R1Y3Rpb25cbiAgJCAke0FQUF9OQU1FfSB0ZW1wbGF0ZSBpbnN0YW50aWF0ZSAtbiByZWFjdC1qYXZhc2NyaXB0IC1wIHJlYWN0IC1vIGFjbWUgLS1pbnB1dCBvcmdJZD08dXVpZD4gLS1vdXRwdXQgcHJvcHMuanNvblxuICAkICR7QVBQX05BTUV9IHBsdWdpbiB1cGxvYWQgLS1maWxlIHBsdWdpbi56aXBcbiAgJCAke0FQUF9OQU1FfSBpbmZyYSBzdG9yZS10b2tlbiAtLWRheXMgMzAgLS1yZWdpb24gdXMtZWFzdC0xXG4gICQgJHtBUFBfTkFNRX0gaW5mcmEgYm9vdHN0cmFwIC0tYWNjb3VudCAxMjM0NTY3ODkwMTIgLS1yZWdpb24gdXMtZWFzdC0xXG4gICQgJHtBUFBfTkFNRX0gcGlwZWxpbmUgZGVwbG95IC0taWQgcGlwZS0xMjMgLS1wcm9maWxlIHByb2R1Y3Rpb25cblxuRXhpdCBjb2RlcyAoMCA9IHN1Y2Nlc3M7IGZhaWx1cmVzIHVzZSBhIHN0YW5kYXJkIGNvZGUgYnkgZXJyb3IgdHlwZSk6XG4gIDEgZ2VuZXJhbCDCtyAyIHZhbGlkYXRpb24gwrcgMyBhcGktcmVxdWVzdCDCtyA0IGF1dGggwrcgNSBmb3JiaWRkZW5cbiAgNiBub3QtZm91bmQgwrcgNyBuZXR3b3JrIMK3IDggY29uZmlnIMK3IDkgZmlsZS1zeXN0ZW0gwrcgMTAgdGltZW91dFxuXG5SdW4gJyR7QVBQX05BTUV9IDxncm91cD4gLS1oZWxwJyB0byBzZWUgYSBncm91cCdzIHN1YmNvbW1hbmRzLlxuYDtcblxuLyoqXG4gKiBUYXNrIG5hbWVzcGFjZXMg4oCUIGNvbW1hbmRzIGFyZSBncm91cGVkIGJ5IHRoZSBqb2IgdGhlIHVzZXIgaXMgZG9pbmcsIG5vdCBieVxuICogaW1wbGVtZW50YXRpb24uIEVhY2ggcGFyZW50IGlzIGEgc3ViY29tbWFuZCBjb250YWluZXI7IHRoZSBsZWFmIHZlcmIgbGl2ZXMgaW5cbiAqIHRoZSBjb21tYW5kIGZpbGUgKGUuZy4gYC5jb21tYW5kKCdsaXN0JylgKSwgc28gYHBpcGVsaW5lIGxpc3RgIHJlYWRzIGFzIGEgdGFzay5cbiAqL1xuZnVuY3Rpb24gcmVnaXN0ZXJUYXNrTmFtZXNwYWNlcygpOiB2b2lkIHtcbiAgcHJpbnREZWJ1ZygnUmVnaXN0ZXJpbmcgdGFzayBuYW1lc3BhY2VzJyk7XG5cbiAgLy8gYXV0aCDigJQgYXV0aGVudGljYXRlIGFuZCBtYW5hZ2UgY3JlZGVudGlhbHNcbiAgY29uc3QgYXV0aCA9IHByb2dyYW0uY29tbWFuZCgnYXV0aCcpLmRlc2NyaXB0aW9uKCdBdXRoZW50aWNhdGUgYW5kIG1hbmFnZSBjcmVkZW50aWFscycpO1xuICBsb2dpbihhdXRoKTsgLy8gYXV0aCBsb2dpbiDigJQgYnJvd3NlciAoZGV2aWNlLWF1dGhvcml6YXRpb24pIHNpZ24taW4sIHN0b3JlZCBsb2NhbGx5XG4gIGxvZ291dChhdXRoKTsgLy8gYXV0aCBsb2dvdXQg4oCUIHJldm9rZSB0aGUgc3RvcmVkIHNlc3Npb24gb24gdGhlIHBsYXRmb3JtIGFuZCBkZWxldGUgaXQgbG9jYWxseVxuICBjcmVhdGVQYXQoYXV0aCk7IC8vIGF1dGggcGF0IOKAlCBjcmVhdGUgYSBuYW1lZCBhY2Nlc3Mga2V5IChkZXZpY2Ugc2lnbi1pbiArIGJyb3dzZXIgc3RlcC11cClcblxuICAvLyBwaXBlbGluZSDigJQgY3JlYXRlLCBpbnNwZWN0LCBhbmQgZGVwbG95IHBpcGVsaW5lc1xuICBjb25zdCBwaXBlbGluZSA9IHByb2dyYW0uY29tbWFuZCgncGlwZWxpbmUnKS5kZXNjcmlwdGlvbignQ3JlYXRlLCBpbnNwZWN0LCBhbmQgZGVwbG95IHBpcGVsaW5lcycpO1xuICBjcmVhdGVQaXBlbGluZShwaXBlbGluZSk7IC8vIHBpcGVsaW5lIGNyZWF0ZVxuICBsaXN0UGlwZWxpbmVzKHBpcGVsaW5lKTsgLy8gcGlwZWxpbmUgbGlzdFxuICBnZXRQaXBlbGluZShwaXBlbGluZSk7IC8vIHBpcGVsaW5lIGdldFxuICByZWdpc3RlcihwaXBlbGluZSk7IC8vIHBpcGVsaW5lIHJlZ2lzdGVyIOKAlCByZS1yZWdpc3RlciBhIGRlcGxveWVkIEFSTiArIGRyYWluIHBlbmRpbmcgaW50ZW50c1xuICBkZXJlZ2lzdGVyUGlwZWxpbmUocGlwZWxpbmUpOyAvLyBwaXBlbGluZSBkZXJlZ2lzdGVyIOKAlCByZW1vdmUgYSByZWdpc3RyeSByb3cgKGF1ZGl0IHN0YWNrcycgbWlzc2luZy1zdGFjayBmaXgpXG4gIGRlbGV0ZVBpcGVsaW5lKHBpcGVsaW5lKTsgLy8gcGlwZWxpbmUgZGVsZXRlIOKAlCBkZWxldGUgYSBwaXBlbGluZSBjb25maWd1cmF0aW9uXG4gIHN5bnRoKHBpcGVsaW5lKTsgLy8gcGlwZWxpbmUgc3ludGgg4oCUIENESyBzeW50aGVzaXMgZnJvbSBwaXBlbGluZSBjb25maWdcbiAgZGVwbG95KHBpcGVsaW5lKTsgLy8gcGlwZWxpbmUgZGVwbG95IOKAlCBDREsgZGVwbG95ICgtLWFwcCBwcmludHMgYm9pbGVycGxhdGUgcGF0aClcblxuICAvLyBwbHVnaW4g4oCUIGF1dGhvciwgdmFsaWRhdGUsIGFuZCBwdWJsaXNoIHBsdWdpbnNcbiAgY29uc3QgcGx1Z2luID0gcHJvZ3JhbS5jb21tYW5kKCdwbHVnaW4nKS5kZXNjcmlwdGlvbignQXV0aG9yLCB2YWxpZGF0ZSwgYW5kIHB1Ymxpc2ggcGx1Z2lucycpO1xuICBuZXdQbHVnaW4ocGx1Z2luKTsgLy8gcGx1Z2luIG5ldyDigJQgc2NhZmZvbGQgYSBsb2NhbCBwbHVnaW4gZGlyZWN0b3J5XG4gIHZhbGlkYXRlUGx1Z2luKHBsdWdpbik7IC8vIHBsdWdpbiB2YWxpZGF0ZSDigJQgdGhlIHNlcnZlcidzIHNjaGVtYXMgKyB0aGUgY2F0YWxvZy1tZXRhZGF0YSByZXBvcnRcbiAgdGVzdFBsdWdpbihwbHVnaW4pOyAvLyBwbHVnaW4gdGVzdCDigJQgcnVuIGluc3RhbGwgKyBidWlsZCBjb21tYW5kcyBsb2NhbGx5IGluIHRoZSBpbWFnZVxuICBwdWJsaXNoUGx1Z2luKHBsdWdpbik7IC8vIHBsdWdpbiBwdWJsaXNoIOKAlCBwcmUtZmxpZ2h0LCBzY2FuIHByZXZpZXcsIGFjY2VwdC1vci1lZGl0LCBwdWJsaXNoIHJlcXVlc3RcbiAgdXBsb2FkUGx1Z2luKHBsdWdpbik7IC8vIHBsdWdpbiB1cGxvYWQg4oCUIHVwbG9hZCBhbmQgZGVwbG95XG4gIGdldFBsdWdpbihwbHVnaW4pOyAvLyBwbHVnaW4gZ2V0XG4gIGxpc3RQbHVnaW5zKHBsdWdpbik7IC8vIHBsdWdpbiBsaXN0XG4gIGRlcHJlY2F0ZVBsdWdpbihwbHVnaW4pOyAvLyBwbHVnaW4gZGVwcmVjYXRlIOKAlCBkZXByZWNhdGUgKG9yIC0tdW5kbykgYSB2ZXJzaW9uXG4gIHlhbmtQbHVnaW4ocGx1Z2luKTsgLy8gcGx1Z2luIHlhbmsg4oCUIHN0b3AgYSB2ZXJzaW9uIHJlc29sdmluZyBmb3IgbmV3IHN5bnRoc1xuICB2ZXJpZnlQbHVnaW5zKHBsdWdpbik7IC8vIHBsdWdpbiB2ZXJpZnkg4oCUIHJ1bi10aW1lIGNoZWNrIG9mIGEgcGlwZWxpbmUncyBwaW5uZWQgcGx1Z2luIGltYWdlc1xuXG4gIC8vIHRlbXBsYXRlIOKAlCBpbnN0YW50aWF0ZSBnb2xkZW4tcGF0aCBwaXBlbGluZSB0ZW1wbGF0ZXMsIHZhbGlkYXRlIHt7IC4uLiB9fSBzeW50YXhcbiAgY29uc3QgdGVtcGxhdGUgPSBwcm9ncmFtLmNvbW1hbmQoJ3RlbXBsYXRlJykuZGVzY3JpcHRpb24oJ0luc3RhbnRpYXRlIHBpcGVsaW5lIHRlbXBsYXRlcyBhbmQgdmFsaWRhdGUge3sgLi4uIH19IHRlbXBsYXRlIHN5bnRheCcpO1xuICBpbnN0YW50aWF0ZVRlbXBsYXRlKHRlbXBsYXRlKTsgLy8gdGVtcGxhdGUgaW5zdGFudGlhdGUg4oCUIHJlbmRlciBhIHRlbXBsYXRlIGludG8gcGlwZWxpbmUgcHJvcHNcbiAgdmFsaWRhdGVUZW1wbGF0ZXNDb21tYW5kKHRlbXBsYXRlKTsgLy8gdGVtcGxhdGUgdmFsaWRhdGVcblxuICAvLyBpbmZyYSDigJQgc2V0IHVwIGFuZCBvcGVyYXRlIHBsYXRmb3JtIGluZnJhc3RydWN0dXJlXG4gIGNvbnN0IGluZnJhID0gcHJvZ3JhbS5jb21tYW5kKCdpbmZyYScpLmRlc2NyaXB0aW9uKCdTZXQgdXAgYW5kIG9wZXJhdGUgcGxhdGZvcm0gaW5mcmFzdHJ1Y3R1cmUnKTtcbiAgYm9vdHN0cmFwKGluZnJhKTsgLy8gaW5mcmEgYm9vdHN0cmFwIOKAlCBDREsgdG9vbGtpdCBzdGFja1xuICBzZXR1cEV2ZW50cyhpbmZyYSk7IC8vIGluZnJhIHNldHVwLWV2ZW50cyDigJQgRXZlbnRCcmlkZ2UgZXZlbnQgaW5nZXN0aW9uXG4gIHJlZHJpdmVFdmVudHMoaW5mcmEpOyAvLyBpbmZyYSByZWRyaXZlLWV2ZW50cyDigJQgbWFudWFsIERMUSDihpIgcXVldWUgcmVkcml2ZSBmYWxsYmFja1xuICBzdG9yZVRva2VuKGluZnJhKTsgLy8gaW5mcmEgc3RvcmUtdG9rZW4g4oCUIEpXVCB0b2tlbiBpbiBTZWNyZXRzIE1hbmFnZXIgZm9yIENES1xuICBwcm92aXNpb24oaW5mcmEpOyAvLyBpbmZyYSBwcm92aXNpb24g4oCUIEFJLWFzc2lzdGVkIGRlcGxveS90ZWFyZG93biBvZiB0aGUgcGxhdGZvcm1cblxuICAvLyBhdWRpdCDigJQgb3BlcmF0b3IgYXVkaXRzIChjcm9uLWZyaWVuZGx5OiBleGl0IDEgb24gZmluZGluZ3MpXG4gIGNvbnN0IGF1ZGl0ID0gcHJvZ3JhbS5jb21tYW5kKCdhdWRpdCcpLmRlc2NyaXB0aW9uKCdPcGVyYXRvciBhdWRpdHMgKGNyb24tZnJpZW5kbHk6IGV4aXQgMSBvbiBmaW5kaW5ncyknKTtcbiAgYXVkaXRUb2tlbnMoYXVkaXQpOyAvLyBhdWRpdCB0b2tlbnMg4oCUIGV4cGlyaW5nIHBsYXRmb3JtIHRva2VucyBpbiBTZWNyZXRzIE1hbmFnZXJcbiAgYXVkaXRTdGFja3MoYXVkaXQpOyAvLyBhdWRpdCBzdGFja3Mg4oCUIENGTiBzdGFja3MgdnMgcGlwZWxpbmVfcmVnaXN0cnkgZHJpZnRcblxuICAvLyB0b29sY2hhaW4g4oCUIHRoZSBwaXBlbGluZSB0b29sY2hhaW4gcmVsZWFzZSAocGlwZWxpbmUtYm9vdHN0cmFwICsgY2RrLXN5bnRoKVxuICB0b29sY2hhaW4ocHJvZ3JhbSk7IC8vIHRvb2xjaGFpbiBleHBvcnQg4oCUIHRoZSByZXNvbHZlZCByZWxlYXNlIGFzIEpTT04sIGZvciBkZXBsb3kgLS1sb2NhbC1zcGVjXG5cbiAgLy8gb3JnIOKAlCBvcmdhbml6YXRpb24gZGF0YSBvcGVyYXRpb25zXG4gIGNvbnN0IG9yZyA9IHByb2dyYW0uY29tbWFuZCgnb3JnJykuZGVzY3JpcHRpb24oJ09yZ2FuaXphdGlvbiBkYXRhIG9wZXJhdGlvbnMnKTtcbiAgb3JnRXhwb3J0KG9yZyk7IC8vIG9yZyBleHBvcnQg4oCUIEdEUFIgcG9ydGFiaWxpdHkgZXhwb3J0XG5cbiAgLy8gcmVwb3J0IOKAlCB0aGUgc3Rha2Vob2xkZXItcmVwb3J0IGFkZC1vbi4gUmVnaXN0ZXJlZCBhcyBpdHMgT1dOIG5hbWVzcGFjZSByYXRoZXIgdGhhblxuICAvLyB1bmRlciBgb3JnYCwgYmVjYXVzZSBpdHMgdmVyYnMgYXJlIGEgbGVhZCdzIHdvcmtmbG93IChjb21wb3NlLCBwdWJsaXNoLCBzaGFyZSksIG5vdCBhblxuICAvLyBvcmdhbml6YXRpb24tZGF0YSBvcGVyYXRpb24uIFRoZSB0d28gam9icyB0aGUgZGFzaGJvYXJkIGlzIHRoZSB3cm9uZyBzaGFwZSBmb3IgYXJlXG4gIC8vIGJhY2tmaWxsaW5nIGEgcnVuIG9mIHBhc3QgcGVyaW9kcyBhbmQgZHJpdmluZyBhIHB1Ymxpc2ggZnJvbSBhbm90aGVyIHNjaGVkdWxlci5cbiAgcmVwb3J0KHByb2dyYW0pO1xuXG4gIC8vIHNlY3VyaXR5LXJlcG9ydCDigJQgdXBsb2FkIFNBUklGIC8gdHJpdnkgLyBncnlwZSByZXBvcnRzIHByb2R1Y2VkIGluc2lkZSBhIHBpcGVsaW5lXG4gIHNlY3VyaXR5UmVwb3J0KHByb2dyYW0pO1xufVxuXG4vKiogUHJpbnQgc2hlbGwgY29tcGxldGlvbnMgZm9yIGBzaGVsbGAgKGJhc2gsIHpzaCBvciBmaXNoKS4gKi9cbmZ1bmN0aW9uIHByaW50Q29tcGxldGlvbnMoc2hlbGw6IHN0cmluZyk6IHZvaWQge1xuICAvLyBXYWxrIGNvbW1hbmRlcidzIHJlZ2lzdGVyZWQgdHJlZSBzbyBjb21wbGV0aW9ucyBuZXZlciBkcmlmdCBmcm9tIHRoZSBhY3R1YWxcbiAgLy8gc3VyZmFjZS4gYHRvcExldmVsYCBpcyB0aGUgZmlyc3Qtd29yZCBzZXQgKG5hbWVzcGFjZXMgKyBtZXRhIGNvbW1hbmRzKTtcbiAgLy8gYHN1YnNgIG1hcHMgZWFjaCBuYW1lc3BhY2UgdG8gaXRzIGxlYWYgdmVyYnMgZm9yIHNlY29uZC13b3JkIGNvbXBsZXRpb24uXG4gIGNvbnN0IHRvcExldmVsID0gcHJvZ3JhbS5jb21tYW5kcy5tYXAoYyA9PiBjLm5hbWUoKSkuc29ydCgpO1xuICBjb25zdCBzdWJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcbiAgZm9yIChjb25zdCBjIG9mIHByb2dyYW0uY29tbWFuZHMpIHtcbiAgICBpZiAoYy5jb21tYW5kcy5sZW5ndGggPiAwKSBzdWJzW2MubmFtZSgpXSA9IGMuY29tbWFuZHMubWFwKHMgPT4gcy5uYW1lKCkpLnNvcnQoKTtcbiAgfVxuICBjb25zdCB0b3BMZXZlbFN0ciA9IHRvcExldmVsLmpvaW4oJyAnKTtcbiAgc3dpdGNoIChzaGVsbCkge1xuICAgIGNhc2UgJ2Jhc2gnOiB7XG4gICAgICAvLyBUd28tbGV2ZWw6IGNvbXBsZXRlIHRoZSBncm91cCBhdCB3b3JkIDEsIGl0cyBzdWJjb21tYW5kcyBhdCB3b3JkIDIuXG4gICAgICBjb25zdCBjYXNlcyA9IE9iamVjdC5lbnRyaWVzKHN1YnMpXG4gICAgICAgIC5tYXAoKFtucywgbGVhdmVzXSkgPT4gYCAgICAgICR7bnN9KSBDT01QUkVQTFk9KCQoY29tcGdlbiAtVyBcIiR7bGVhdmVzLmpvaW4oJyAnKX1cIiAtLSBcIlxcJHtjdXJ9XCIpKTs7YClcbiAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgICAgY29uc29sZS5sb2coYCMgcGlwZWxpbmUtbWFuYWdlciBiYXNoIGNvbXBsZXRpb25zXG5fcGlwZWxpbmVfbWFuYWdlcl9jb21wbGV0aW9ucygpIHtcbiAgbG9jYWwgY3VyPVwiXFwke0NPTVBfV09SRFNbQ09NUF9DV09SRF19XCJcbiAgaWYgWyBcIlxcJHtDT01QX0NXT1JEfVwiIC1lcSAxIF07IHRoZW5cbkNPTVBSRVBMWT0oJChjb21wZ2VuIC1XIFwiJHt0b3BMZXZlbFN0cn1cIiAtLSBcIlxcJHtjdXJ9XCIpKVxucmV0dXJuXG4gIGZpXG4gIGNhc2UgXCJcXCR7Q09NUF9XT1JEU1sxXX1cIiBpblxuJHtjYXNlc31cbiAgZXNhY1xufVxuY29tcGxldGUgLUYgX3BpcGVsaW5lX21hbmFnZXJfY29tcGxldGlvbnMgcGlwZWxpbmUtbWFuYWdlcmApO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3pzaCc6IHtcbiAgICAgIGNvbnN0IGNhc2VzID0gT2JqZWN0LmVudHJpZXMoc3VicylcbiAgICAgICAgLm1hcCgoW25zLCBsZWF2ZXNdKSA9PiBgICAgICAgICAke25zfSkgX3ZhbHVlcyAnc3ViY29tbWFuZCcgJHtsZWF2ZXMuam9pbignICcpfTs7YClcbiAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgICAgY29uc29sZS5sb2coYCMgcGlwZWxpbmUtbWFuYWdlciB6c2ggY29tcGxldGlvbnNcbl9waXBlbGluZV9tYW5hZ2VyKCkge1xuICBpZiAoKCBDVVJSRU5UID09IDIgKSk7IHRoZW5cbl92YWx1ZXMgJ2NvbW1hbmQnICR7dG9wTGV2ZWwuam9pbignICcpfVxucmV0dXJuXG4gIGZpXG4gIGNhc2UgXCJcXCR7d29yZHNbMl19XCIgaW5cbiR7Y2FzZXN9XG4gIGVzYWNcbn1cbmNvbXBkZWYgX3BpcGVsaW5lX21hbmFnZXIgcGlwZWxpbmUtbWFuYWdlcmApO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ2Zpc2gnOiB7XG4gICAgICBjb25zdCBsaW5lcyA9IFtcbiAgICAgICAgYGNvbXBsZXRlIC1jIHBpcGVsaW5lLW1hbmFnZXIgLW4gJ19fZmlzaF91c2Vfc3ViY29tbWFuZCcgLWEgJyR7dG9wTGV2ZWxTdHJ9J2AsXG4gICAgICAgIC4uLk9iamVjdC5lbnRyaWVzKHN1YnMpLm1hcCgoW25zLCBsZWF2ZXNdKSA9PlxuICAgICAgICAgIGBjb21wbGV0ZSAtYyBwaXBlbGluZS1tYW5hZ2VyIC1uICdfX2Zpc2hfc2Vlbl9zdWJjb21tYW5kX2Zyb20gJHtuc30nIC1hICcke2xlYXZlcy5qb2luKCcgJyl9J2ApLFxuICAgICAgXTtcbiAgICAgIGNvbnNvbGUubG9nKGAjIHBpcGVsaW5lLW1hbmFnZXIgZmlzaCBjb21wbGV0aW9uc1xcbiR7bGluZXMuam9pbignXFxuJyl9YCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFVua25vd24gc2hlbGw6ICR7c2hlbGx9LiBVc2UgYmFzaCwgenNoLCBvciBmaXNoLmApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYWxsIENMSSBjb21tYW5kc1xuICovXG5mdW5jdGlvbiByZWdpc3RlckNvbW1hbmRzKCk6IHZvaWQge1xuICBwcmludERlYnVnKCdSZWdpc3RlcmluZyBjb21tYW5kcycpO1xuXG4gIC8vIENvbmZpZ3VyZSBwcm9ncmFtXG4gIHByb2dyYW1cbiAgICAubmFtZShBUFBfTkFNRSlcbiAgICAuZGVzY3JpcHRpb24oQVBQX0RFU0NSSVBUSU9OKVxuICAgIC52ZXJzaW9uKEFQUF9WRVJTSU9OLCAnLXYsIC0tdmVyc2lvbicsICdTaG93IENMSSB2ZXJzaW9uJylcbiAgICAub3B0aW9uKCctLWRlYnVnJywgJ0VuYWJsZSBkZWJ1ZyBvdXRwdXQgd2l0aCBzdGFjayB0cmFjZXMnLCBmYWxzZSlcbiAgICAub3B0aW9uKCctLXZlcmJvc2UnLCAnU2hvdyBkZXRhaWxlZCBpbmZvcm1hdGlvbicsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tcXVpZXQnLCAnTWluaW1hbCBvdXRwdXQgKGVycm9ycyBvbmx5KScsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tbm8tY29sb3InLCAnRGlzYWJsZSBjb2xvcmVkIG91dHB1dCcsIGZhbHNlKVxuICAgIC5hZGRIZWxwVGV4dCgnYWZ0ZXInLCBIRUxQX1RFWFQpO1xuXG4gIC8vIC0tdXBncmFkZSBbdmVyc2lvbl06IHNlbGYtdXBkYXRlLCBoYW5kbGVkIGxpa2UgLS12ZXJzaW9uIChsaXN0ZW5lciArIGV4aXQpLlxuICByZWdpc3RlclVwZ3JhZGVPcHRpb24ocHJvZ3JhbSk7XG5cbiAgLy8gRmFpbC1mYXN0IHByZWZsaWdodDogYmVmb3JlIEFOWSBjb21tYW5kJ3MgYWN0aW9uIHJ1bnMsIHZlcmlmeSB0aGUgbG9jYWxcbiAgLy8gdG9vbHMgdGhhdCBjb21tYW5kIG5lZWRzLiBDb21tYW5kZXIgc2tpcHMgdGhpcyBmb3IgLS1oZWxwLy0tdmVyc2lvbiBhbmQgZm9yXG4gIC8vIGhlbHAgb3V0cHV0LCBzbyB0aG9zZSBhbHdheXMgd29yazsgQVBJLW9ubHkgY29tbWFuZHMgZGVjbGFyZSBubyByZXF1aXJlbWVudHNcbiAgLy8gYW5kIHBhc3MgdGhyb3VnaCB1bnRvdWNoZWQuXG4gIHByb2dyYW0uaG9vaygncHJlQWN0aW9uJywgKF90aGlzQ29tbWFuZCwgYWN0aW9uQ29tbWFuZCkgPT4gcHJlZmxpZ2h0Q29tbWFuZFRvb2xzKGFjdGlvbkNvbW1hbmQpKTtcblxuICAvLyBUb3AtbGV2ZWwgbWV0YSBjb21tYW5kcyAobm8gbmFtZXNwYWNlKS5cbiAgdmVyc2lvbihwcm9ncmFtKTtcbiAgc3RhdHVzKHByb2dyYW0pOyAvLyBTaG93IGVudmlyb25tZW50IGFuZCBjb25uZWN0aXZpdHkgc3RhdHVzXG5cbiAgcmVnaXN0ZXJUYXNrTmFtZXNwYWNlcygpO1xuXG4gIC8vIFNoZWxsIGNvbXBsZXRpb25zXG4gIHByaW50RGVidWcoJ1JlZ2lzdGVyaW5nIGNvbXBsZXRpb25zIGNvbW1hbmQnKTtcbiAgcHJvZ3JhbVxuICAgIC5jb21tYW5kKCdjb21wbGV0aW9ucycpXG4gICAgLmRlc2NyaXB0aW9uKCdHZW5lcmF0ZSBzaGVsbCBjb21wbGV0aW9ucyAoYmFzaCwgenNoLCBmaXNoKScpXG4gICAgLmFyZ3VtZW50KCc8c2hlbGw+JywgJ1NoZWxsIHR5cGU6IGJhc2gsIHpzaCwgb3IgZmlzaCcpXG4gICAgLmFjdGlvbigoc2hlbGw6IHN0cmluZykgPT4ge1xuICAgICAgcHJpbnRDb21wbGV0aW9ucyhzaGVsbCk7XG4gICAgfSk7XG5cbiAgcHJpbnREZWJ1ZygnQWxsIGNvbW1hbmRzIHJlZ2lzdGVyZWQgc3VjY2Vzc2Z1bGx5Jyk7XG59XG5cbi8qKlxuICogSGFuZGxlIHByb2dyYW0gZXJyb3JzXG4gKi9cbmZ1bmN0aW9uIHNldHVwRXJyb3JIYW5kbGVycygpOiB2b2lkIHtcbiAgLy8gSGFuZGxlIHVuY2F1Z2h0IGV4Y2VwdGlvbnNcbiAgcHJvY2Vzcy5vbigndW5jYXVnaHRFeGNlcHRpb24nLCAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgY29uc29sZS5lcnJvcignJyk7IC8vIEVtcHR5IGxpbmVcbiAgICBwcmludEVycm9yKCdVbmNhdWdodCBleGNlcHRpb24nLCB7XG4gICAgICBlcnJvcjogZXJyb3IubWVzc2FnZSxcbiAgICAgIG5hbWU6IGVycm9yLm5hbWUsXG4gICAgfSk7XG5cbiAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuR0VORVJBTCwge1xuICAgICAgZGVidWc6IGlzRGVidWdNb2RlKHByb2dyYW0ub3B0cygpKSxcbiAgICAgIGV4aXQ6IHRydWUsXG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIHR5cGU6ICd1bmNhdWdodEV4Y2VwdGlvbicsXG4gICAgICB9LFxuICAgIH0pO1xuICB9KTtcblxuICAvLyBIYW5kbGUgdW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uc1xuICBwcm9jZXNzLm9uKCd1bmhhbmRsZWRSZWplY3Rpb24nLCAocmVhc29uOiB1bmtub3duKSA9PiB7XG4gICAgY29uc29sZS5lcnJvcignJyk7IC8vIEVtcHR5IGxpbmVcbiAgICBwcmludEVycm9yKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24nLCB7XG4gICAgICByZWFzb246IGVycm9yTWVzc2FnZShyZWFzb24pLFxuICAgIH0pO1xuXG4gICAgY29uc3QgZXJyb3IgPSByZWFzb24gaW5zdGFuY2VvZiBFcnJvciA/IHJlYXNvbjogbmV3IEVycm9yKFN0cmluZyhyZWFzb24pKTtcblxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBFUlJPUl9DT0RFUy5HRU5FUkFMLCB7XG4gICAgICBkZWJ1ZzogaXNEZWJ1Z01vZGUocHJvZ3JhbS5vcHRzKCkpLFxuICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgdHlwZTogJ3VuaGFuZGxlZFJlamVjdGlvbicsXG4gICAgICB9LFxuICAgIH0pO1xuICB9KTtcblxuICAvLyBIYW5kbGUgU0lHSU5UIChDdHJsK0MpXG4gIHByb2Nlc3Mub24oJ1NJR0lOVCcsICgpID0+IHtcbiAgICBjb25zb2xlLmxvZygnJyk7IC8vIEVtcHR5IGxpbmVcbiAgICBwcmludFdhcm5pbmcoJ1Byb2Nlc3MgaW50ZXJydXB0ZWQgYnkgdXNlciAoU0lHSU5UKScpO1xuICAgIGNvbnNvbGUubG9nKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgIHByb2Nlc3MuZXhpdCgxMzApOyAvLyBTdGFuZGFyZCBleGl0IGNvZGUgZm9yIFNJR0lOVFxuICB9KTtcblxuICAvLyBIYW5kbGUgU0lHVEVSTVxuICBwcm9jZXNzLm9uKCdTSUdURVJNJywgKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgIHByaW50V2FybmluZygnUHJvY2VzcyB0ZXJtaW5hdGVkIChTSUdURVJNKScpO1xuICAgIGNvbnNvbGUubG9nKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgIHByb2Nlc3MuZXhpdCgxNDMpOyAvLyBTdGFuZGFyZCBleGl0IGNvZGUgZm9yIFNJR1RFUk1cbiAgfSk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZSBDTEkgd2l0aCBvcHRpb25zXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBDTEkgaW5pdGlhbGl6YXRpb24gb3B0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZUNsaShvcHRpb25zOiBDbGlPcHRpb25zID0ge30pOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIHNob3dCYW5uZXIgPSB0cnVlLFxuICAgIG1pbmltYWxCYW5uZXIgPSBmYWxzZSxcbiAgICBkZWJ1ZyA9IGZhbHNlLFxuICAgIHZlcmJvc2UgPSBmYWxzZSxcbiAgICBxdWlldCA9IGZhbHNlLFxuICAgIG5vQ29sb3IgPSBmYWxzZSxcbiAgICBzZWxmVXBkYXRlID0gZmFsc2UsXG4gIH0gPSBvcHRpb25zO1xuXG4gIC8vIEhhbmRsZSBjb2xvciBvdXRwdXRcbiAgaWYgKG5vQ29sb3IpIHtcbiAgICBwcm9jZXNzLmVudi5OT19DT0xPUiA9ICcxJztcbiAgfVxuXG4gIC8vIERpc3BsYXkgYmFubmVyXG4gIGlmIChzaG93QmFubmVyICYmICFxdWlldCkge1xuICAgIGlmIChtaW5pbWFsQmFubmVyKSB7XG4gICAgICBtaW5pQmFubmVyKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJhbm5lcih7XG4gICAgICAgIG1pbmltYWw6IGZhbHNlLFxuICAgICAgICBzaG93RGVzY3JpcHRpb246IHRydWUsXG4gICAgICAgIHNob3dUaW1lc3RhbXA6IGRlYnVnIHx8IHZlcmJvc2UsXG4gICAgICAgIHNob3dFeGVjdXRpb25JZDogZGVidWcsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBEaXNwbGF5IHN0YXJ0dXAgaW5mb1xuICBkaXNwbGF5U3RhcnR1cEluZm8oeyBkZWJ1ZywgdmVyYm9zZSwgcXVpZXQgfSk7XG5cbiAgLy8gQ2hlY2sgZW52aXJvbm1lbnRcbiAgaWYgKCFxdWlldCkge1xuICAgIGNoZWNrRW52aXJvbm1lbnQoeyBzaWduSW5SZWxldmFudDogIXNlbGZVcGRhdGUgfSk7XG4gIH1cblxuICAvLyBTZXR1cCBlcnJvciBoYW5kbGVyc1xuICBzZXR1cEVycm9ySGFuZGxlcnMoKTtcblxuICAvLyBSZWdpc3RlciBjb21tYW5kc1xuICB0cnkge1xuICAgIHJlZ2lzdGVyQ29tbWFuZHMoKTtcbiAgICBwcmludERlYnVnKCdDTEkgaW5pdGlhbGl6YXRpb24gY29tcGxldGUnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBwcmludEVycm9yKCdDTEkgaW5pdGlhbGl6YXRpb24gZmFpbGVkJywge1xuICAgICAgZXJyb3I6IGVycm9yTWVzc2FnZShlcnJvciksXG4gICAgfSk7XG5cbiAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuQ09ORklHVVJBVElPTiwge1xuICAgICAgZGVidWc6IGRlYnVnIHx8IGlzRGVidWdNb2RlKCksXG4gICAgICBleGl0OiB0cnVlLFxuICAgICAgY29udGV4dDoge1xuICAgICAgICBzdGFnZTogJ2luaXRpYWxpemF0aW9uJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBQYXJzZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzXG4gKi9cbmZ1bmN0aW9uIHBhcnNlQXJndW1lbnRzKCk6IHZvaWQge1xuICB0cnkge1xuICAgIHByb2dyYW0ucGFyc2UocHJvY2Vzcy5hcmd2KTtcblxuICAgIC8vIFNob3cgaGVscCBpZiBubyBjb21tYW5kIHByb3ZpZGVkXG4gICAgY29uc3QgYXJncyA9IHByb2Nlc3MuYXJndi5zbGljZSgyKTtcbiAgICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICAgIHByaW50SW5mbygnTm8gY29tbWFuZCBzcGVjaWZpZWQgLSBkaXNwbGF5aW5nIGhlbHAnKTtcbiAgICAgIGNvbnNvbGUubG9nKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgICAgcHJvZ3JhbS5vdXRwdXRIZWxwKCk7XG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgY29tbWFuZCBleGlzdHNcbiAgICBjb25zdCBjb21tYW5kID0gYXJnc1swXTtcbiAgICBpZiAoY29tbWFuZCAmJiAhY29tbWFuZC5zdGFydHNXaXRoKCctJykpIHtcbiAgICAgIGNvbnN0IGNvbW1hbmRFeGlzdHMgPSBwcm9ncmFtLmNvbW1hbmRzLnNvbWUoY21kID0+IGNtZC5uYW1lKCkgPT09IGNvbW1hbmQpO1xuXG4gICAgICBpZiAoIWNvbW1hbmRFeGlzdHMpIHtcbiAgICAgICAgY29uc29sZS5sb2coJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgICAgIHByaW50RXJyb3IoYFVua25vd24gY29tbWFuZDogJHtjb21tYW5kfWApO1xuICAgICAgICBjb25zb2xlLmxvZygnJyk7IC8vIEVtcHR5IGxpbmVcbiAgICAgICAgcHJpbnRJbmZvKCdBdmFpbGFibGUgY29tbWFuZHM6Jyk7XG4gICAgICAgIHByb2dyYW0uY29tbWFuZHMuZm9yRWFjaChjbWQgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGAg4oCiICR7Y21kLm5hbWUoKX0gLSAke2NtZC5kZXNjcmlwdGlvbigpfWApO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc29sZS5sb2coJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcmludERlYnVnKCdDb21tYW5kIGxpbmUgYXJndW1lbnRzIHBhcnNlZCBzdWNjZXNzZnVsbHknKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuR0VORVJBTCwge1xuICAgICAgZGVidWc6IGlzRGVidWdNb2RlKHByb2dyYW0ub3B0cygpKSxcbiAgICAgIGV4aXQ6IHRydWUsXG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIHN0YWdlOiAnYXJndW1lbnQtcGFyc2luZycsXG4gICAgICAgIGFyZ3Y6IHByb2Nlc3MuYXJndixcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBNYWluIENMSSBlbnRyeSBwb2ludFxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ0xJIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gU3RhbmRhcmQgaW5pdGlhbGl6YXRpb25cbiAqIG1haW4oKTtcbiAqXG4gKiAvLyBNaW5pbWFsIG1vZGVcbiAqIG1haW4oeyBtaW5pbWFsQmFubmVyOiB0cnVlLCBxdWlldDogdHJ1ZSB9KTtcbiAqXG4gKiAvLyBEZWJ1ZyBtb2RlXG4gKiBtYWluKHsgZGVidWc6IHRydWUsIHZlcmJvc2U6IHRydWUgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1haW4ob3B0aW9uczogQ2xpT3B0aW9ucyA9IHt9KTogdm9pZCB7XG4gIHRyeSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBDTElcbiAgICBpbml0aWFsaXplQ2xpKG9wdGlvbnMpO1xuXG4gICAgLy8gUGFyc2UgYXJndW1lbnRzIGFuZCBleGVjdXRlIGNvbW1hbmRcbiAgICBwYXJzZUFyZ3VtZW50cygpO1xuXG4gICAgLy8gSWYgd2UgcmVhY2ggaGVyZSwgY29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XG4gICAgcHJpbnREZWJ1ZygnQ0xJIGV4ZWN1dGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gRmluYWwgY2F0Y2gtYWxsIGVycm9yIGhhbmRsZXJcbiAgICBjb25zb2xlLmVycm9yKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgIHByaW50RXJyb3IoJ0ZhdGFsIENMSSBlcnJvcicsIHtcbiAgICAgIGVycm9yOiBlcnJvck1lc3NhZ2UoZXJyb3IpLFxuICAgIH0pO1xuXG4gICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkdFTkVSQUwsIHtcbiAgICAgIGRlYnVnOiBpc0RlYnVnTW9kZShvcHRpb25zKSxcbiAgICAgIGV4aXQ6IHRydWUsXG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIHN0YWdlOiAnbWFpbicsXG4gICAgICAgIG9wdGlvbnMsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUnVuIENMSSBpZiBleGVjdXRlZCBkaXJlY3RseS4gRVNNIGhhcyBubyBgcmVxdWlyZS5tYWluYDsgY29tcGFyZSB0aGUgaW52b2tlZFxuICogc2NyaXB0IHRvIHRoaXMgbW9kdWxlJ3MgcGF0aCwgcmVzb2x2aW5nIHN5bWxpbmtzIG9uIGJvdGggc2lkZXMgc28gdGhlIGBiaW5gXG4gKiBzeW1saW5rIChub2RlX21vZHVsZXMvLmJpbi9waXBlbGluZS1tYW5hZ2VyIOKGkiBkaXN0L2NsaS5qcykgc3RpbGwgbWF0Y2hlcy5cbiAqL1xuY29uc3QgaW52b2tlZFNjcmlwdCA9IHByb2Nlc3MuYXJndlsxXTtcbmNvbnN0IGlzTWFpbk1vZHVsZSA9IGludm9rZWRTY3JpcHQgIT09IHVuZGVmaW5lZFxuICAmJiByZWFscGF0aFN5bmMoaW52b2tlZFNjcmlwdCkgPT09IHJlYWxwYXRoU3luYyhmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuaWYgKGlzTWFpbk1vZHVsZSkge1xuICAvLyBQYXJzZSBDTEkgb3B0aW9ucyBmcm9tIGVudmlyb25tZW50IG9yIGNvbW1hbmQgbGluZVxuICBjb25zdCBvcHRpb25zOiBDbGlPcHRpb25zID0ge1xuICAgIGRlYnVnOiBwcm9jZXNzLmVudi5ERUJVRyA9PT0gJ3RydWUnLFxuICAgIC8vIGAtLXRva2VuYCBwcmludHMgYSBiYXJlIHRva2VuIGZvciBgJCjigKYpYCBjYXB0dXJlLCBzbyB0aGUgYmFubmVyIGFuZCB0aGVcbiAgICAvLyBzdGFydHVwIGNocm9tZSBtdXN0IG5vdCByZWFjaCBzdGRvdXQgZWl0aGVyLiBTY2FubmVkIGZyb20gYXJndiBsaWtlXG4gICAgLy8gYC0tcXVpZXRgIGlzLCBiZWNhdXNlIHRoaXMgcnVucyBCRUZPUkUgQ29tbWFuZGVyIHBhcnNlcy5cbiAgICBxdWlldDogcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLXF1aWV0JykgfHwgcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLXRva2VuJyksXG4gICAgdmVyYm9zZTogcHJvY2Vzcy5hcmd2LmluY2x1ZGVzKCctLXZlcmJvc2UnKSxcbiAgICBub0NvbG9yOiBwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tbm8tY29sb3InKSB8fCBwcm9jZXNzLmVudi5OT19DT0xPUiA9PT0gJzEnLFxuICAgIHNlbGZVcGRhdGU6IGlzU2VsZlVwZGF0ZShwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpLFxuICB9O1xuXG4gIC8vIERhaWx5IGJhY2tncm91bmQgY2hlY2s7IHByaW50cyBcInVwZGF0ZSBhdmFpbGFibGVcIiB0byBzdGRlcnIgb24gZXhpdC5cbiAgc2NoZWR1bGVVcGRhdGVOb3RpY2UoKTtcbiAgbWFpbihvcHRpb25zKTtcbn0iXX0=
@@ -1,4 +1,38 @@
1
1
  import { Command } from 'commander';
2
+ /** One `GET /api/pipelines/registry` row (the fields this audit reads). */
3
+ export interface RegistryEntry {
4
+ /** Registry row UUID — what `pipeline deregister --id` takes. */
5
+ id: string;
6
+ pipelineId: string;
7
+ orgId?: string;
8
+ pipelineName: string;
9
+ stackName?: string;
10
+ region?: string;
11
+ }
12
+ export interface AuditFinding {
13
+ type: 'orphaned-stack' | 'missing-stack';
14
+ stackName?: string;
15
+ pipelineId?: string;
16
+ pipelineName?: string;
17
+ /** Registry row id (missing-stack only). */
18
+ registryId?: string;
19
+ detail: string;
20
+ /** The command that reconciles this finding. */
21
+ fix: string;
22
+ }
23
+ /** Registry rows fetched per request (the route caps `limit` at MAX_PAGE_LIMIT, 1000 by default). */
24
+ export declare const REGISTRY_PAGE_LIMIT = 500;
25
+ /**
26
+ * Read EVERY registry row the platform returns for this caller (`limit` +
27
+ * `offset` paging until `pagination.hasMore` is false). A partial registry is
28
+ * as bad as an empty one: each row left unread becomes a false orphaned-stack
29
+ * finding. `orgId` is sent when `--org` names an org — the platform scopes the
30
+ * list to the caller's org unless it honours that parameter (a system-org
31
+ * caller), and the caller checks which org it got back.
32
+ */
33
+ export declare function fetchAllRegistryEntries(client: {
34
+ get<T = unknown>(url: string, params?: Record<string, unknown>): Promise<T>;
35
+ }, pipelineUrl: string, orgId?: string): Promise<RegistryEntry[]>;
2
36
  /**
3
37
  * Registers the `audit-stacks` command with the CLI program.
4
38
  *
@@ -9,6 +43,13 @@ import { Command } from 'commander';
9
43
  * - **Missing stacks**: registry entries pointing to stacks that no longer exist
10
44
  * in CloudFormation (likely after a manual `aws cloudformation delete-stack`).
11
45
  *
46
+ * Scope: the registry of ONE org (yours, or `--org` when the platform lets the
47
+ * credential list that org) against the stacks of ONE region (`--region`) —
48
+ * registry rows of other regions are counted but not compared, and stacks
49
+ * tagged with another `OrgId` are skipped. Every finding carries the command
50
+ * that reconciles it (`pipeline deregister` for a missing stack; `pipeline
51
+ * register` or `aws cloudformation delete-stack` for an orphaned one).
52
+ *
12
53
  * Designed for cron use:
13
54
  * - Exits 0 when there are no findings.
14
55
  * - Exits 1 when at least one orphaned or missing stack is found.
@@ -17,7 +58,7 @@ import { Command } from 'commander';
17
58
  * @example
18
59
  * ```bash
19
60
  * pipeline-manager audit stacks --region us-east-1
20
- * pipeline-manager audit stacks --org acme --json
61
+ * pipeline-manager audit stacks --region eu-west-1 --json
21
62
  * ```
22
63
  */
23
64
  export declare function auditStacks(program: Command): void;