cdktn 0.25.0-pre.9 → 0.25.0

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 (79) hide show
  1. package/.jsii +2191 -422
  2. package/README.md +12 -0
  3. package/lib/annotations.js +1 -1
  4. package/lib/app.js +1 -1
  5. package/lib/aspect.js +1 -1
  6. package/lib/asset-hash.d.ts +75 -0
  7. package/lib/asset-hash.js +129 -0
  8. package/lib/asset-staging.d.ts +180 -0
  9. package/lib/asset-staging.js +464 -0
  10. package/lib/assets.d.ts +401 -0
  11. package/lib/assets.js +333 -0
  12. package/lib/backends/azurerm-backend.js +2 -2
  13. package/lib/backends/cloud-backend.js +10 -7
  14. package/lib/backends/consul-backend.js +2 -2
  15. package/lib/backends/cos-backend.js +2 -2
  16. package/lib/backends/gcs-backend.js +2 -2
  17. package/lib/backends/http-backend.js +2 -2
  18. package/lib/backends/local-backend.js +2 -2
  19. package/lib/backends/oss-backend.js +2 -2
  20. package/lib/backends/pg-backend.js +2 -2
  21. package/lib/backends/remote-backend.js +4 -4
  22. package/lib/backends/s3-backend.js +2 -2
  23. package/lib/backends/swift-backend.js +2 -2
  24. package/lib/complex-computed-list.js +26 -26
  25. package/lib/errors.d.ts +16 -0
  26. package/lib/errors.js +51 -3
  27. package/lib/functions/provider-function.js +1 -1
  28. package/lib/functions/terraform-functions.generated.js +1 -1
  29. package/lib/ignore-strategy.d.ts +82 -0
  30. package/lib/ignore-strategy.js +29 -0
  31. package/lib/importable-resource.js +7 -4
  32. package/lib/index.d.ts +4 -0
  33. package/lib/index.js +5 -1
  34. package/lib/manifest.js +1 -1
  35. package/lib/private/fs.d.ts +74 -2
  36. package/lib/private/fs.js +93 -14
  37. package/lib/resource.js +1 -1
  38. package/lib/synthesize/synthesizer.js +9 -22
  39. package/lib/terraform-asset.d.ts +68 -5
  40. package/lib/terraform-asset.js +86 -36
  41. package/lib/terraform-backend.js +1 -1
  42. package/lib/terraform-count.js +1 -1
  43. package/lib/terraform-data-resource.d.ts +1 -1
  44. package/lib/terraform-data-resource.js +8 -5
  45. package/lib/terraform-data-source.js +1 -1
  46. package/lib/terraform-element.js +1 -1
  47. package/lib/terraform-ephemeral-resource.js +1 -1
  48. package/lib/terraform-functions.js +1 -1
  49. package/lib/terraform-hcl-module.js +1 -1
  50. package/lib/terraform-iterator.js +6 -6
  51. package/lib/terraform-local.js +1 -1
  52. package/lib/terraform-module.js +1 -1
  53. package/lib/terraform-operators.js +1 -1
  54. package/lib/terraform-output.js +1 -1
  55. package/lib/terraform-provider.js +1 -1
  56. package/lib/terraform-provisioner.js +1 -1
  57. package/lib/terraform-remote-state.js +1 -1
  58. package/lib/terraform-resource-targets.js +1 -1
  59. package/lib/terraform-resource.js +9 -4
  60. package/lib/terraform-stack.js +1 -1
  61. package/lib/terraform-variable.js +2 -2
  62. package/lib/testing/adapters/jest.d.ts +2 -1
  63. package/lib/testing/adapters/jest.js +3 -3
  64. package/lib/testing/index.js +1 -1
  65. package/lib/testing/matchers.d.ts +34 -30
  66. package/lib/testing/matchers.js +292 -89
  67. package/lib/tokens/lazy.js +2 -2
  68. package/lib/tokens/resolvable.js +2 -2
  69. package/lib/tokens/string-fragments.js +2 -2
  70. package/lib/tokens/token.js +2 -2
  71. package/lib/upgrade-id-aspect.js +1 -1
  72. package/lib/validations/index.d.ts +0 -1
  73. package/lib/validations/index.js +1 -2
  74. package/package.json +17 -3
  75. package/scripts/pack.mjs +27 -12
  76. package/lib/validations/validate-binary-version.d.ts +0 -23
  77. package/lib/validations/validate-binary-version.js +0 -91
  78. package/lib/validations/validate-terraform-version.d.ts +0 -13
  79. package/lib/validations/validate-terraform-version.js +0 -23
@@ -1,15 +1,52 @@
1
+ /**
2
+ * Predicate deciding whether a tree entry is skipped.
3
+ * `relPath` is always `/`-separated and relative to the walk root, so patterns
4
+ * behave identically on Windows. `isDirectory` is supplied from the walker's
5
+ * `lstat` so `.gitignore` / `.dockerignore`-style directory-only patterns can
6
+ * be honored without the predicate stat-ing the path itself.
7
+ */
8
+ export type ExcludePredicate = (relPath: string, isDirectory: boolean) => boolean;
9
+ export interface CopySyncOptions {
10
+ /**
11
+ * Entries for which this returns true are not copied. Called with the
12
+ * entry's `/`-separated relative path and whether it is a directory.
13
+ * Excluding a directory also skips everything below it, unless
14
+ * {@link descendIntoExcludedDirectories} is set.
15
+ *
16
+ * @default - nothing is excluded
17
+ */
18
+ readonly shouldExclude?: ExcludePredicate;
19
+ /**
20
+ * Keep walking into an excluded directory instead of pruning it. The
21
+ * directory entry itself is still omitted; its children are visited and
22
+ * re-tested against {@link shouldExclude}, so a strategy with negation
23
+ * patterns (`node_modules` + `!node_modules/keep`) can re-include entries
24
+ * below an excluded parent. Costs a full walk of excluded subtrees, so it
25
+ * is off unless a strategy asks for it.
26
+ *
27
+ * @default false
28
+ */
29
+ readonly descendIntoExcludedDirectories?: boolean;
30
+ }
1
31
  /**
2
32
  * Copy a file or directory. The directory can have contents and subfolders.
33
+ * Symlinks are recreated as symlinks rather than dereferenced, which keeps the
34
+ * copy consistent with {@link hashPath} (it hashes links by their target) and
35
+ * makes dangling links and link cycles harmless.
3
36
  * @param src - source path
4
37
  * @param dest - destination path
38
+ * @param options - copy behaviour, see {@link CopySyncOptions}
5
39
  */
6
- export declare function copySync(src: string, dest: string): void;
40
+ export declare function copySync(src: string, dest: string, options?: CopySyncOptions): void;
7
41
  /**
8
42
  * Zips contents at src and places zip archive at dest.
9
43
  * @param src - directory to archive
10
44
  * @param dest - path to write the resulting zip to
45
+ * @param shouldExclude - entries to omit, see {@link CopySyncOptions.shouldExclude}
46
+ * @param descendIntoExcludedDirectories - keep walking excluded directories,
47
+ * see {@link CopySyncOptions.descendIntoExcludedDirectories}
11
48
  */
12
- export declare function archiveSync(src: string, dest: string): void;
49
+ export declare function archiveSync(src: string, dest: string, shouldExclude?: ExcludePredicate, descendIntoExcludedDirectories?: boolean): void;
13
50
  export interface HashPathOptions {
14
51
  /**
15
52
  * Use the canonical entry-framed hash instead of the legacy
@@ -25,6 +62,25 @@ export interface HashPathOptions {
25
62
  * the legacy scheme, which never records directories.
26
63
  */
27
64
  readonly archive?: boolean;
65
+ /**
66
+ * Entries for which this returns true are omitted from the digest. Excluding
67
+ * a directory also omits everything below it, unless
68
+ * {@link descendIntoExcludedDirectories} is set. The same predicate must be
69
+ * given to {@link copySync} so the hash and the emitted artifact describe the
70
+ * same set of files.
71
+ *
72
+ * @default - nothing is excluded
73
+ */
74
+ readonly shouldExclude?: ExcludePredicate;
75
+ /**
76
+ * Keep walking into excluded directories, see
77
+ * {@link CopySyncOptions.descendIntoExcludedDirectories}. Must match the
78
+ * value given to {@link copySync} / {@link archiveSync} so the digest covers
79
+ * the same file set the artifact contains.
80
+ *
81
+ * @default false
82
+ */
83
+ readonly descendIntoExcludedDirectories?: boolean;
28
84
  }
29
85
  /**
30
86
  * Compute a stable MD5 hash of a file or directory's contents.
@@ -37,6 +93,22 @@ export interface HashPathOptions {
37
93
  * @returns uppercased hex digest, truncated to HASH_LEN characters
38
94
  */
39
95
  export declare function hashPath(src: string, options?: HashPathOptions): string;
96
+ /**
97
+ * Build a predicate matching the exclusion forms accepted by
98
+ * `AssetHashOptions.exclude` (via `ExcludeIgnoreStrategy`): an exact relative
99
+ * path, a `*.ext` suffix, or a directory (with or without a trailing `/`),
100
+ * which also excludes its contents.
101
+ * Deliberately not a full glob implementation — `**`, `?`, character classes and
102
+ * `!` negation are not supported, and a pattern is never interpreted as
103
+ * anchoring to a subdirectory it does not name.
104
+ * The returned matcher looks only at the path, not at whether the entry is a
105
+ * directory: `dir` and `dir/` both match a directory named `dir` and its
106
+ * contents. It is therefore narrower than {@link ExcludePredicate}, which also
107
+ * receives an `isDirectory` flag for strategies that need it.
108
+ * @param exclude - patterns to exclude
109
+ * @returns predicate over `/`-separated paths relative to the asset root
110
+ */
111
+ export declare function excludeMatcher(exclude: string[]): (relativePath: string) => boolean;
40
112
  /**
41
113
  * Walk upward from `rootPath` looking for a file with the given name.
42
114
  * Returns the absolute path of the first match, or `null` if the search
package/lib/private/fs.js CHANGED
@@ -36,6 +36,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.copySync = copySync;
37
37
  exports.archiveSync = archiveSync;
38
38
  exports.hashPath = hashPath;
39
+ exports.excludeMatcher = excludeMatcher;
39
40
  exports.findFileAboveCwd = findFileAboveCwd;
40
41
  // Copyright (c) HashiCorp, Inc
41
42
  // SPDX-License-Identifier: MPL-2.0
@@ -67,17 +68,28 @@ function zipAttrs(mode) {
67
68
  // Full implementation at https://github.com/jprichardson/node-fs-extra/blob/master/lib/copy/copy-sync.js
68
69
  /**
69
70
  * Copy a file or directory. The directory can have contents and subfolders.
71
+ * Symlinks are recreated as symlinks rather than dereferenced, which keeps the
72
+ * copy consistent with {@link hashPath} (it hashes links by their target) and
73
+ * makes dangling links and link cycles harmless.
70
74
  * @param src - source path
71
75
  * @param dest - destination path
76
+ * @param options - copy behaviour, see {@link CopySyncOptions}
72
77
  */
73
- function copySync(src, dest) {
78
+ function copySync(src, dest, options = {}) {
74
79
  /**
75
80
  * Copies file if present otherwise walks subfolder.
76
81
  * @param p - path relative to src/dest
82
+ * @param relPath - `/`-separated path relative to the copy root
77
83
  */
78
- function copyItem(p) {
84
+ function copyItem(p, relPath) {
79
85
  const sourcePath = path.resolve(src, p);
80
86
  const stat = fs.lstatSync(sourcePath);
87
+ const excluded = !!options.shouldExclude?.(relPath, stat.isDirectory());
88
+ // Skip, unless it is an excluded directory being descended into.
89
+ if (excluded &&
90
+ !(stat.isDirectory() && options.descendIntoExcludedDirectories)) {
91
+ return;
92
+ }
81
93
  if (stat.isSymbolicLink()) {
82
94
  fs.symlinkSync(fs.readlinkSync(sourcePath), path.resolve(dest, p));
83
95
  }
@@ -85,26 +97,30 @@ function copySync(src, dest) {
85
97
  fs.copyFileSync(sourcePath, path.resolve(dest, p));
86
98
  }
87
99
  else if (stat.isDirectory()) {
88
- walkSubfolder(p);
100
+ walkSubfolder(p, relPath);
89
101
  }
90
102
  }
91
103
  /**
92
104
  * Copies contents of subfolder.
93
105
  * @param p - path relative to src/dest
106
+ * @param relPath - `/`-separated path relative to the copy root
94
107
  */
95
- function walkSubfolder(p) {
108
+ function walkSubfolder(p, relPath) {
96
109
  const sourceDir = path.resolve(src, p);
97
110
  fs.mkdirSync(path.resolve(dest, p), { recursive: true });
98
- fs.readdirSync(sourceDir).forEach((item) => copyItem(path.join(p, item)));
111
+ fs.readdirSync(sourceDir).forEach((item) => copyItem(path.join(p, item), relPath ? `${relPath}/${item}` : item));
99
112
  }
100
- walkSubfolder(".");
113
+ walkSubfolder(".", "");
101
114
  }
102
115
  /**
103
116
  * Zips contents at src and places zip archive at dest.
104
117
  * @param src - directory to archive
105
118
  * @param dest - path to write the resulting zip to
119
+ * @param shouldExclude - entries to omit, see {@link CopySyncOptions.shouldExclude}
120
+ * @param descendIntoExcludedDirectories - keep walking excluded directories,
121
+ * see {@link CopySyncOptions.descendIntoExcludedDirectories}
106
122
  */
107
- function archiveSync(src, dest) {
123
+ function archiveSync(src, dest, shouldExclude, descendIntoExcludedDirectories = false) {
108
124
  try {
109
125
  const files = {};
110
126
  const walk = (dir, prefix) => {
@@ -114,6 +130,11 @@ function archiveSync(src, dest) {
114
130
  const full = path.join(dir, entry);
115
131
  const zipPath = prefix ? `${prefix}/${entry}` : entry;
116
132
  const stat = fs.lstatSync(full);
133
+ const excluded = !!shouldExclude?.(zipPath, stat.isDirectory());
134
+ if (excluded &&
135
+ !(stat.isDirectory() && descendIntoExcludedDirectories)) {
136
+ continue;
137
+ }
117
138
  if (stat.isSymbolicLink()) {
118
139
  // Store the link target as the entry data with S_IFLNK attrs so
119
140
  // extractors recreate the symlink instead of a copy of the target.
@@ -160,8 +181,8 @@ function archiveSync(src, dest) {
160
181
  */
161
182
  function hashPath(src, options = {}) {
162
183
  const digest = options.canonical
163
- ? canonicalHashPath(src, !options.archive)
164
- : legacyHashPath(src);
184
+ ? canonicalHashPath(src, !options.archive, options.shouldExclude, options.descendIntoExcludedDirectories)
185
+ : legacyHashPath(src, options.shouldExclude, options.descendIntoExcludedDirectories);
165
186
  return digest.slice(0, HASH_LEN).toUpperCase();
166
187
  }
167
188
  /**
@@ -173,8 +194,11 @@ function hashPath(src, options = {}) {
173
194
  * bytes, so a file containing `foo` can never collide with a symlink
174
195
  * targeting `foo`.
175
196
  * @param src - path to a file or directory to hash
197
+ * @param shouldExclude - entries to omit, see {@link HashPathOptions.shouldExclude}
198
+ * @param descendIntoExcludedDirectories - keep walking excluded directories,
199
+ * see {@link HashPathOptions.descendIntoExcludedDirectories}
176
200
  */
177
- function legacyHashPath(src) {
201
+ function legacyHashPath(src, shouldExclude, descendIntoExcludedDirectories = false) {
178
202
  const content = crypto.createHash("md5");
179
203
  const links = crypto.createHash("md5");
180
204
  let linkCount = 0;
@@ -196,7 +220,18 @@ function legacyHashPath(src) {
196
220
  content.update(fs.readFileSync(p));
197
221
  }
198
222
  else if (stat.isDirectory()) {
199
- fs.readdirSync(p).forEach((filename) => hashRecursion(path.resolve(p, filename), relPath ? `${relPath}/${filename}` : filename));
223
+ fs.readdirSync(p).forEach((filename) => {
224
+ const entryRelPath = relPath ? `${relPath}/${filename}` : filename;
225
+ const childPath = path.resolve(p, filename);
226
+ const childIsDir = fs.lstatSync(childPath).isDirectory();
227
+ if (shouldExclude?.(entryRelPath, childIsDir)) {
228
+ // Skip, unless it is an excluded directory being descended into.
229
+ if (!(childIsDir && descendIntoExcludedDirectories)) {
230
+ return;
231
+ }
232
+ }
233
+ hashRecursion(childPath, entryRelPath);
234
+ });
200
235
  }
201
236
  }
202
237
  hashRecursion(src, "", true);
@@ -227,8 +262,9 @@ function legacyHashPath(src) {
227
262
  * @param src - path to a file or directory to hash
228
263
  * @param includeDirectories - record directory entries; false for archive
229
264
  * artifacts, where the emitted zip has no directory entries
265
+ * @param shouldExclude - entries to omit, see {@link HashPathOptions.shouldExclude}
230
266
  */
231
- function canonicalHashPath(src, includeDirectories) {
267
+ function canonicalHashPath(src, includeDirectories, shouldExclude, descendIntoExcludedDirectories = false) {
232
268
  const hash = crypto.createHash("md5");
233
269
  /**
234
270
  * Walk `p`, framing each entry into the enclosing hash accumulator.
@@ -251,17 +287,60 @@ function canonicalHashPath(src, includeDirectories) {
251
287
  hash.update(data);
252
288
  }
253
289
  else if (stat.isDirectory()) {
290
+ // Records the `D` entry even for a descended-into excluded directory,
291
+ // matching the empty directory copySync leaves on disk.
254
292
  if (relPath && includeDirectories) {
255
293
  hash.update(`D ${relPath}\0`);
256
294
  }
257
295
  for (const filename of fs.readdirSync(p).sort()) {
258
- hashRecursion(path.resolve(p, filename), relPath ? `${relPath}/${filename}` : filename);
296
+ const entryRelPath = relPath ? `${relPath}/${filename}` : filename;
297
+ const childPath = path.resolve(p, filename);
298
+ const childIsDir = fs.lstatSync(childPath).isDirectory();
299
+ if (shouldExclude?.(entryRelPath, childIsDir)) {
300
+ // Skip, unless it is an excluded directory being descended into.
301
+ if (!(childIsDir && descendIntoExcludedDirectories)) {
302
+ continue;
303
+ }
304
+ }
305
+ hashRecursion(childPath, entryRelPath);
259
306
  }
260
307
  }
261
308
  }
262
309
  hashRecursion(src, "", true);
263
310
  return hash.digest("hex");
264
311
  }
312
+ /**
313
+ * Build a predicate matching the exclusion forms accepted by
314
+ * `AssetHashOptions.exclude` (via `ExcludeIgnoreStrategy`): an exact relative
315
+ * path, a `*.ext` suffix, or a directory (with or without a trailing `/`),
316
+ * which also excludes its contents.
317
+ * Deliberately not a full glob implementation — `**`, `?`, character classes and
318
+ * `!` negation are not supported, and a pattern is never interpreted as
319
+ * anchoring to a subdirectory it does not name.
320
+ * The returned matcher looks only at the path, not at whether the entry is a
321
+ * directory: `dir` and `dir/` both match a directory named `dir` and its
322
+ * contents. It is therefore narrower than {@link ExcludePredicate}, which also
323
+ * receives an `isDirectory` flag for strategies that need it.
324
+ * @param exclude - patterns to exclude
325
+ * @returns predicate over `/`-separated paths relative to the asset root
326
+ */
327
+ function excludeMatcher(exclude) {
328
+ // `/`-separated throughout: relative paths are normalized before matching, so
329
+ // `dir/child` patterns work the same on Windows.
330
+ const patterns = exclude.map((p) => p.replace(/\\/g, "/"));
331
+ return (relativePath) => {
332
+ for (const pattern of patterns) {
333
+ if (pattern.startsWith("*.") && relativePath.endsWith(pattern.slice(1))) {
334
+ return true;
335
+ }
336
+ const dir = pattern.endsWith("/") ? pattern.slice(0, -1) : pattern;
337
+ if (relativePath === dir || relativePath.startsWith(`${dir}/`)) {
338
+ return true;
339
+ }
340
+ }
341
+ return false;
342
+ };
343
+ }
265
344
  /**
266
345
  * Walk upward from `rootPath` looking for a file with the given name.
267
346
  * Returns the absolute path of the first match, or `null` if the search
@@ -281,4 +360,4 @@ function findFileAboveCwd(file, rootPath = process.cwd()) {
281
360
  }
282
361
  return null;
283
362
  }
284
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpdmF0ZS9mcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXNDQSw0QkE2QkM7QUFPRCxrQ0EyQ0M7QUE2QkQsNEJBS0M7QUFzSEQsNENBZUM7QUE1UkQsK0JBQStCO0FBQy9CLG1DQUFtQztBQUNuQyx1Q0FBeUI7QUFDekIsMkNBQTZCO0FBQzdCLCtDQUFpQztBQUNqQyxtQ0FBMEM7QUFFMUMsc0NBQXdEO0FBRXhELE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztBQUVwQix5RUFBeUU7QUFDekUsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDO0FBQ3pCLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQztBQUN6QixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUM7QUFDekIsMEVBQTBFO0FBQzFFLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQztBQUN0Qix5RUFBeUU7QUFDekUseUVBQXlFO0FBQ3pFLDBFQUEwRTtBQUMxRSwwQkFBMEI7QUFDMUIsTUFBTSxlQUFlLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUU3Qzs7OztHQUlHO0FBQ0gsU0FBUyxRQUFRLENBQUMsSUFBWTtJQUM1QixPQUFPLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM1QixDQUFDO0FBRUQseUdBQXlHO0FBQ3pHOzs7O0dBSUc7QUFDSCxTQUFnQixRQUFRLENBQUMsR0FBVyxFQUFFLElBQVk7SUFDaEQ7OztPQUdHO0lBQ0gsU0FBUyxRQUFRLENBQUMsQ0FBUztRQUN6QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4QyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FB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USxDQUFDLEVBQUUsQ0FBQztRQUM1QixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDL0MsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN2RCxPQUFPLGdCQUFnQixDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0ICogYXMgY3J5cHRvIGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCB7IHN0clRvVTgsIHppcFN5bmMgfSBmcm9tIFwiZmZsYXRlXCI7XG5pbXBvcnQgdHlwZSB7IFppcE9wdGlvbnMgfSBmcm9tIFwiZmZsYXRlXCI7XG5pbXBvcnQgeyBhc3NldENhbk5vdENyZWF0ZVppcEFyY2hpdmUgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5cbmNvbnN0IEhBU0hfTEVOID0gMzI7XG5cbi8vIFVuaXggZmlsZS10eXBlIGJpdHMgZm9yIHppcCBleHRlcm5hbCBhdHRyaWJ1dGVzIChzdF9tb2RlIHVwcGVyIG5pYmJsZSlcbmNvbnN0IFNfSUZMTksgPSAwbzEyMDAwMDtcbmNvbnN0IFNfSUZSRUcgPSAwbzEwMDAwMDtcbmNvbnN0IFBFUk1fTUFTSyA9IDBvNzc3Nztcbi8vIFwidmVyc2lvbiBtYWRlIGJ5XCIgaG9zdCBieXRlOyB1bnppcCBvbmx5IGhvbm9ycyB1bml4IG1vZGUgYXR0cnMgd2hlbiBzZXRcbmNvbnN0IFpJUF9PU19VTklYID0gMztcbi8vIFBpbm5lZCBzbyBhcmNoaXZlcyBhcmUgYnl0ZS1yZXByb2R1Y2libGUgYWNyb3NzIHN5bnRocy4gZmZsYXRlIGVuY29kZXNcbi8vIERPUyBkYXRlcyBmcm9tIGxvY2FsLXRpbWUgZ2V0dGVycyBhbmQgcmVqZWN0cyB5ZWFycyBvdXRzaWRlIDE5ODAtMjA5OSxcbi8vIHNvIHRoaXMgbXVzdCBiZSBhIGxvY2FsLXRpbWUgMTk4MCBkYXRlIChhIFVUQyBvbmUgdW5kZXJmbG93cyB0byAxOTc5IGluXG4vLyB0aW1lem9uZXMgd2VzdCBvZiBVVEMpLlxuY29uc3QgWklQX0VOVFJZX01USU1FID0gbmV3IERhdGUoMTk4MCwgMCwgMSk7XG5cbi8qKlxuICogWmlwIGV4dGVybmFsIGF0dHJpYnV0ZXMgZm9yIGEgdW5peCBtb2RlOiBmaWxlLXR5cGUgYW5kIHBlcm1pc3Npb24gYml0c1xuICogYmVsb25nIGluIHRoZSBoaWdoIDE2IGJpdHMgb2YgdGhlIDMyLWJpdCBmaWVsZC5cbiAqIEBwYXJhbSBtb2RlIC0gdW5peCBzdF9tb2RlIGJpdHMgKHR5cGUgfCBwZXJtaXNzaW9ucylcbiAqL1xuZnVuY3Rpb24gemlwQXR0cnMobW9kZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIChtb2RlIDw8IDE2KSA+Pj4gMDtcbn1cblxuLy8gRnVsbCBpbXBsZW1lbnRhdGlvbiBhdCBodHRwczovL2dpdGh1Yi5jb20vanByaWNoYXJkc29uL25vZGUtZnMtZXh0cmEvYmxvYi9tYXN0ZXIvbGliL2NvcHkvY29weS1zeW5jLmpzXG4vKipcbiAqIENvcHkgYSBmaWxlIG9yIGRpcmVjdG9yeS4gVGhlIGRpcmVjdG9yeSBjYW4gaGF2ZSBjb250ZW50cyBhbmQgc3ViZm9sZGVycy5cbiAqIEBwYXJhbSBzcmMgLSBzb3VyY2UgcGF0aFxuICogQHBhcmFtIGRlc3QgLSBkZXN0aW5hdGlvbiBwYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5U3luYyhzcmM6IHN0cmluZywgZGVzdDogc3RyaW5nKSB7XG4gIC8qKlxuICAgKiBDb3BpZXMgZmlsZSBpZiBwcmVzZW50IG90aGVyd2lzZSB3YWxrcyBzdWJmb2xkZXIuXG4gICAqIEBwYXJhbSBwIC0gcGF0aCByZWxhdGl2ZSB0byBzcmMvZGVzdFxuICAgKi9cbiAgZnVuY3Rpb24gY29weUl0ZW0ocDogc3RyaW5nKSB7XG4gICAgY29uc3Qgc291cmNlUGF0aCA9IHBhdGgucmVzb2x2ZShzcmMsIHApO1xuICAgIGNvbnN0IHN0YXQgPSBmcy5sc3RhdFN5bmMoc291cmNlUGF0aCk7XG4gICAgaWYgKHN0YXQuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgZnMuc3ltbGlua1N5bmMoZnMucmVhZGxpbmtTeW5jKHNvdXJjZVBhdGgpLCBwYXRoLnJlc29sdmUoZGVzdCwgcCkpO1xuICAgIH0gZWxzZSBpZiAoc3RhdC5pc0ZpbGUoKSkge1xuICAgICAgZnMuY29weUZpbGVTeW5jKHNvdXJjZVBhdGgsIHBhdGgucmVzb2x2ZShkZXN0LCBwKSk7XG4gICAgfSBlbHNlIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIHdhbGtTdWJmb2xkZXIocCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBDb3BpZXMgY29udGVudHMgb2Ygc3ViZm9sZGVyLlxuICAgKiBAcGFyYW0gcCAtIHBhdGggcmVsYXRpdmUgdG8gc3JjL2Rlc3RcbiAgICovXG4gIGZ1bmN0aW9uIHdhbGtTdWJmb2xkZXIocDogc3RyaW5nKSB7XG4gICAgY29uc3Qgc291cmNlRGlyID0gcGF0aC5yZXNvbHZlKHNyYywgcCk7XG4gICAgZnMubWtkaXJTeW5jKHBhdGgucmVzb2x2ZShkZXN0LCBwKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZnMucmVhZGRpclN5bmMoc291cmNlRGlyKS5mb3JFYWNoKChpdGVtOiBzdHJpbmcpID0+XG4gICAgICBjb3B5SXRlbShwYXRoLmpvaW4ocCwgaXRlbSkpLFxuICAgICk7XG4gIH1cblxuICB3YWxrU3ViZm9sZGVyKFwiLlwiKTtcbn1cblxuLyoqXG4gKiBaaXBzIGNvbnRlbnRzIGF0IHNyYyBhbmQgcGxhY2VzIHppcCBhcmNoaXZlIGF0IGRlc3QuXG4gKiBAcGFyYW0gc3JjIC0gZGlyZWN0b3J5IHRvIGFyY2hpdmVcbiAqIEBwYXJhbSBkZXN0IC0gcGF0aCB0byB3cml0ZSB0aGUgcmVzdWx0aW5nIHppcCB0b1xuICovXG5leHBvcnQgZnVuY3Rpb24gYXJjaGl2ZVN5bmMoc3JjOiBzdHJpbmcsIGRlc3Q6IHN0cmluZykge1xuICB0cnkge1xuICAgIGNvbnN0IGZpbGVzOiBSZWNvcmQ8c3RyaW5nLCBbVWludDhBcnJheSwgWmlwT3B0aW9uc10+ID0ge307XG4gICAgY29uc3Qgd2FsayA9IChkaXI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIFNvcnRlZCBzbyBlbnRyeSBvcmRlciDigJQgYW5kIHRoZXJlZm9yZSBhcmNoaXZlIGJ5dGVzIOKAlCBjYW5ub3QgZGVwZW5kXG4gICAgICAvLyBvbiBmaWxlc3lzdGVtIGVudW1lcmF0aW9uIG9yZGVyOyBtYXRjaGVzIHRoZSBjYW5vbmljYWwgaGFzaCB3YWxrLlxuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBmcy5yZWFkZGlyU3luYyhkaXIpLnNvcnQoKSkge1xuICAgICAgICBjb25zdCBmdWxsID0gcGF0aC5qb2luKGRpciwgZW50cnkpO1xuICAgICAgICBjb25zdCB6aXBQYXRoID0gcHJlZml4ID8gYCR7cHJlZml4fS8ke2VudHJ5fWAgOiBlbnRyeTtcbiAgICAgICAgY29uc3Qgc3RhdCA9IGZzLmxzdGF0U3luYyhmdWxsKTtcbiAgICAgICAgaWYgKHN0YXQuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgICAgIC8vIFN0b3JlIHRoZSBsaW5rIHRhcmdldCBhcyB0aGUgZW50cnkgZGF0YSB3aXRoIFNfSUZMTksgYXR0cnMgc29cbiAgICAgICAgICAvLyBleHRyYWN0b3JzIHJlY3JlYXRlIHRoZSBzeW1saW5rIGluc3RlYWQgb2YgYSBjb3B5IG9mIHRoZSB0YXJnZXQuXG4gICAgICAgICAgLy8gTmV2ZXIgcmVjdXJzaW5nIHRocm91Z2ggbGlua3MgYWxzbyBtYWtlcyBjeWNsZXMgdW5yZWFjaGFibGUuXG4gICAgICAgICAgZmlsZXNbemlwUGF0aF0gPSBbXG4gICAgICAgICAgICBzdHJUb1U4KGZzLnJlYWRsaW5rU3luYyhmdWxsKSksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG9zOiBaSVBfT1NfVU5JWCxcbiAgICAgICAgICAgICAgYXR0cnM6IHppcEF0dHJzKFNfSUZMTksgfCAoc3RhdC5tb2RlICYgUEVSTV9NQVNLKSksXG4gICAgICAgICAgICAgIGxldmVsOiAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdO1xuICAgICAgICB9IGVsc2UgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgIHdhbGsoZnVsbCwgemlwUGF0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZmlsZXNbemlwUGF0aF0gPSBbXG4gICAgICAgICAgICBmcy5yZWFkRmlsZVN5bmMoZnVsbCksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG9zOiBaSVBfT1NfVU5JWCxcbiAgICAgICAgICAgICAgYXR0cnM6IHppcEF0dHJzKFNfSUZSRUcgfCAoc3RhdC5tb2RlICYgUEVSTV9NQVNLKSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHdhbGsoc3JjLCBcIlwiKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgZGVzdCxcbiAgICAgIHppcFN5bmMoZmlsZXMsIHsgbGV2ZWw6IDksIG10aW1lOiBaSVBfRU5UUllfTVRJTUUgfSksXG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICB0aHJvdyBhc3NldENhbk5vdENyZWF0ZVppcEFyY2hpdmUoc3JjLCBkZXN0LCBlcnIpO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGFzaFBhdGhPcHRpb25zIHtcbiAgLyoqXG4gICAqIFVzZSB0aGUgY2Fub25pY2FsIGVudHJ5LWZyYW1lZCBoYXNoIGluc3RlYWQgb2YgdGhlIGxlZ2FjeVxuICAgKiBjb250ZW50LWNvbmNhdGVuYXRpb24gaGFzaC4gRW5hYmxlZCB0aHJvdWdoIHRoZSBgY2Fub25pY2FsQXNzZXRIYXNoZXNgXG4gICAqIGZlYXR1cmUgZmxhZy5cbiAgICovXG4gIHJlYWRvbmx5IGNhbm9uaWNhbD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBGcmFtZSBmb3IgYW4gYXJjaGl2ZSBhcnRpZmFjdDogYXJjaGl2ZVN5bmMgbmV2ZXIgZW1pdHMgWklQIGRpcmVjdG9yeVxuICAgKiBlbnRyaWVzLCBzbyBjYW5vbmljYWwgaGFzaGluZyBvbWl0cyBkaXJlY3RvcnkgcmVjb3JkcyBhbmQgdGhlIGhhc2hcbiAgICogdHJhY2tzIHRoZSBlbWl0dGVkIGFyY2hpdmUgYnl0ZXMgZXhhY3RseS4gTm9uLWVtcHR5IGRpcmVjdG9yaWVzIHN0YXlcbiAgICogdmlzaWJsZSB0aHJvdWdoIHRoZSByZWxhdGl2ZSBwYXRocyBvZiB0aGVpciBjb250ZW50cy4gSGFzIG5vIGVmZmVjdCBvblxuICAgKiB0aGUgbGVnYWN5IHNjaGVtZSwgd2hpY2ggbmV2ZXIgcmVjb3JkcyBkaXJlY3Rvcmllcy5cbiAgICovXG4gIHJlYWRvbmx5IGFyY2hpdmU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENvbXB1dGUgYSBzdGFibGUgTUQ1IGhhc2ggb2YgYSBmaWxlIG9yIGRpcmVjdG9yeSdzIGNvbnRlbnRzLlxuICogSW4gYm90aCBzY2hlbWVzIHN5bWxpbmtzIGFyZSBoYXNoZWQgYnkgdGhlaXIgbWV0YWRhdGEgKHBhdGggKyB0YXJnZXQpXG4gKiBpbnN0ZWFkIG9mIGJlaW5nIGZvbGxvd2VkLCBzbyBzaGFyZWQgdGFyZ2V0cyBhcmUgbm90IGRvdWJsZS1jb3VudGVkIGFuZFxuICogY3ljbGVzIGNhbm5vdCByZWN1cnNlOyBhIHN5bWxpbmsgYXQgdGhlIHJvb3QgaXRzZWxmIGlzIGZvbGxvd2VkLCBtYXRjaGluZ1xuICogaG93IHRoZSBhc3NldCBzb3VyY2UgcGF0aCBpcyBvcGVuZWQgd2hlbiB0aGUgYXJ0aWZhY3QgaXMgZW1pdHRlZC5cbiAqIEBwYXJhbSBzcmMgLSBwYXRoIHRvIGEgZmlsZSBvciBkaXJlY3RvcnkgdG8gaGFzaFxuICogQHBhcmFtIG9wdGlvbnMgLSBoYXNoIHNjaGVtZSBzZWxlY3Rpb24sIHNlZSB7QGxpbmsgSGFzaFBhdGhPcHRpb25zfVxuICogQHJldHVybnMgdXBwZXJjYXNlZCBoZXggZGlnZXN0LCB0cnVuY2F0ZWQgdG8gSEFTSF9MRU4gY2hhcmFjdGVyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzaFBhdGgoc3JjOiBzdHJpbmcsIG9wdGlvbnM6IEhhc2hQYXRoT3B0aW9ucyA9IHt9KTogc3RyaW5nIHtcbiAgY29uc3QgZGlnZXN0ID0gb3B0aW9ucy5jYW5vbmljYWxcbiAgICA/IGNhbm9uaWNhbEhhc2hQYXRoKHNyYywgIW9wdGlvbnMuYXJjaGl2ZSlcbiAgICA6IGxlZ2FjeUhhc2hQYXRoKHNyYyk7XG4gIHJldHVybiBkaWdlc3Quc2xpY2UoMCwgSEFTSF9MRU4pLnRvVXBwZXJDYXNlKCk7XG59XG5cbi8qKlxuICogTGVnYWN5LWNvbXBhdGlibGUgaGFzaDogZmlsZSBjb250ZW50cyBmb2xkIGludG8gb25lIGRpZ2VzdCBpblxuICogZGlyZWN0b3J5LWxpc3Rpbmcgb3JkZXIsIGV4YWN0bHkgYXMgZWFybGllciByZWxlYXNlcyBkaWQsIHNvIHRyZWVzIHdpdGhvdXRcbiAqIHN5bWxpbmtzIGtlZXAgdGhlaXIgaGlzdG9yaWNhbCBoYXNoZXMuIFN5bWxpbmsgbWV0YWRhdGEgZ29lcyBpbnRvIGEgc2Vjb25kXG4gKiBkaWdlc3QsIGFuZCBvbmx5IHdoZW4gc3ltbGlua3MgZXhpc3QgYXJlIHRoZSB0d28gY29tYmluZWQgdW5kZXIgYSB0YWdnZWRcbiAqIG91dGVyIGhhc2gg4oCUIHRoZSB0YWcga2VlcHMgc3ltbGluayBtZXRhZGF0YSBpbiBhIHNlcGFyYXRlIGRvbWFpbiBmcm9tIGZpbGVcbiAqIGJ5dGVzLCBzbyBhIGZpbGUgY29udGFpbmluZyBgZm9vYCBjYW4gbmV2ZXIgY29sbGlkZSB3aXRoIGEgc3ltbGlua1xuICogdGFyZ2V0aW5nIGBmb29gLlxuICogQHBhcmFtIHNyYyAtIHBhdGggdG8gYSBmaWxlIG9yIGRpcmVjdG9yeSB0byBoYXNoXG4gKi9cbmZ1bmN0aW9uIGxlZ2FjeUhhc2hQYXRoKHNyYzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgY29udGVudCA9IGNyeXB0by5jcmVhdGVIYXNoKFwibWQ1XCIpO1xuICBjb25zdCBsaW5rcyA9IGNyeXB0by5jcmVhdGVIYXNoKFwibWQ1XCIpO1xuICBsZXQgbGlua0NvdW50ID0gMDtcblxuICAvKipcbiAgICogV2FsayBgcGAsIGZlZWRpbmcgZmlsZSBjb250ZW50cyBhbmQgc3ltbGluayBtZXRhZGF0YSBpbnRvIHRoZSBlbmNsb3NpbmdcbiAgICogYWNjdW11bGF0b3JzLlxuICAgKiBAcGFyYW0gcCAtIHBhdGggdG8gd2Fsa1xuICAgKiBAcGFyYW0gcmVsUGF0aCAtIHBhdGggb2YgYHBgIHJlbGF0aXZlIHRvIHRoZSB3YWxrIHJvb3QsIGAvYC1zZXBhcmF0ZWRcbiAgICogQHBhcmFtIGlzUm9vdCAtIGZvbGxvdyBhIHN5bWxpbmsgb25seSBhdCB0aGUgcm9vdCwgbWF0Y2hpbmcgaG93IHRoZVxuICAgKiBhc3NldCdzIG93biBwYXRoIGlzIHJlc29sdmVkIHdoZW4gaXQgaXMgcmVhZFxuICAgKi9cbiAgZnVuY3Rpb24gaGFzaFJlY3Vyc2lvbihwOiBzdHJpbmcsIHJlbFBhdGg6IHN0cmluZywgaXNSb290ID0gZmFsc2UpIHtcbiAgICBjb25zdCBzdGF0ID0gaXNSb290ID8gZnMuc3RhdFN5bmMocCkgOiBmcy5sc3RhdFN5bmMocCk7XG4gICAgaWYgKHN0YXQuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgbGlua3MudXBkYXRlKGAke3JlbFBhdGh9XFwwJHtmcy5yZWFkbGlua1N5bmMocCl9XFwwYCk7XG4gICAgICBsaW5rQ291bnQrKztcbiAgICB9IGVsc2UgaWYgKHN0YXQuaXNGaWxlKCkpIHtcbiAgICAgIGNvbnRlbnQudXBkYXRlKGZzLnJlYWRGaWxlU3luYyhwKSk7XG4gICAgfSBlbHNlIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGZzLnJlYWRkaXJTeW5jKHApLmZvckVhY2goKGZpbGVuYW1lKSA9PlxuICAgICAgICBoYXNoUmVjdXJzaW9uKFxuICAgICAgICAgIHBhdGgucmVzb2x2ZShwLCBmaWxlbmFtZSksXG4gICAgICAgICAgcmVsUGF0aCA/IGAke3JlbFBhdGh9LyR7ZmlsZW5hbWV9YCA6IGZpbGVuYW1lLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBoYXNoUmVjdXJzaW9uKHNyYywgXCJcIiwgdHJ1ZSk7XG4gIGlmIChsaW5rQ291bnQgPT09IDApIHtcbiAgICByZXR1cm4gY29udGVudC5kaWdlc3QoXCJoZXhcIik7XG4gIH1cbiAgY29uc3Qgb3V0ZXIgPSBjcnlwdG8uY3JlYXRlSGFzaChcIm1kNVwiKTtcbiAgb3V0ZXIudXBkYXRlKFwiY2RrdG4vYXNzZXQtaGFzaC9zeW1saW5rcy92MVxcMFwiKTtcbiAgb3V0ZXIudXBkYXRlKGNvbnRlbnQuZGlnZXN0KFwiaGV4XCIpKTtcbiAgb3V0ZXIudXBkYXRlKGxpbmtzLmRpZ2VzdChcImhleFwiKSk7XG4gIHJldHVybiBvdXRlci5kaWdlc3QoXCJoZXhcIik7XG59XG5cbi8qKlxuICogQ2Fub25pY2FsIGhhc2gsIG1vZGVsZWQgb24gZ2l0IHRyZWVzIGFuZCBOaXggTkFSOiBldmVyeSBlbnRyeSBpcyBmcmFtZWRcbiAqIHdpdGggZXZlcnl0aGluZyB0aGF0IGFmZmVjdHMgdGhlIGVtaXR0ZWQgYXJ0aWZhY3Qg4oCUXG4gKlxuICogLSBmaWxlczogICAgICBgRiA8bW9kZT4gPHJlbFBhdGg+XFwwPHNpemU+XFwwYCArIGNvbnRlbnQsIHdoZXJlIGA8bW9kZT5gIGlzXG4gKiAgICAgICAgICAgICAgIHRoZSBvY3RhbCBwZXJtaXNzaW9uIG1hc2sgKGAwbzc3NzdgIGJpdHMpIHRoYXQgYXJjaGl2ZVN5bmNcbiAqICAgICAgICAgICAgICAgcHJlc2VydmVzIGluIHppcCBleHRlcm5hbCBhdHRyaWJ1dGVzLFxuICogLSBzeW1saW5rczogICBgTCA8bW9kZT4gPHJlbFBhdGg+XFwwPHRhcmdldCBieXRlIGxlbmd0aD5cXDBgICsgdGFyZ2V0LFxuICogLSBkaXJlY3RvcmllcyAoaW5jbHVkaW5nIGVtcHR5IG9uZXMsIHdoaWNoIGNvcHlTeW5jIG1hdGVyaWFsaXplcyk6XG4gKiAgICAgICAgICAgICAgIGBEIDxyZWxQYXRoPlxcMGAsIHdpdGggbm8gbW9kZSDigJQgbmVpdGhlciBhcmNoaXZlU3luYyBub3JcbiAqICAgICAgICAgICAgICAgY29weVN5bmMgcHJlc2VydmVzIGRpcmVjdG9yeSBwZXJtaXNzaW9ucyxcbiAqXG4gKiBpbiBzb3J0ZWQgZGlyZWN0b3J5IG9yZGVyIHdpdGggYC9gLXNlcGFyYXRlZCByZWxhdGl2ZSBwYXRocywgc28gcmVuYW1lcyxcbiAqIGVudHJ5LWJvdW5kYXJ5IHNoaWZ0cywgcGVybWlzc2lvbiBjaGFuZ2VzLCBlbXB0eS1kaXJlY3RvcnkgY2hhbmdlcywgYW5kXG4gKiBmaWxlLXZzLXN5bWxpbmsgc3dhcHMgYWxsIGNoYW5nZSB0aGUgZGlnZXN0LlxuICogQHBhcmFtIHNyYyAtIHBhdGggdG8gYSBmaWxlIG9yIGRpcmVjdG9yeSB0byBoYXNoXG4gKiBAcGFyYW0gaW5jbHVkZURpcmVjdG9yaWVzIC0gcmVjb3JkIGRpcmVjdG9yeSBlbnRyaWVzOyBmYWxzZSBmb3IgYXJjaGl2ZVxuICogYXJ0aWZhY3RzLCB3aGVyZSB0aGUgZW1pdHRlZCB6aXAgaGFzIG5vIGRpcmVjdG9yeSBlbnRyaWVzXG4gKi9cbmZ1bmN0aW9uIGNhbm9uaWNhbEhhc2hQYXRoKHNyYzogc3RyaW5nLCBpbmNsdWRlRGlyZWN0b3JpZXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goXCJtZDVcIik7XG5cbiAgLyoqXG4gICAqIFdhbGsgYHBgLCBmcmFtaW5nIGVhY2ggZW50cnkgaW50byB0aGUgZW5jbG9zaW5nIGhhc2ggYWNjdW11bGF0b3IuXG4gICAqIEBwYXJhbSBwIC0gcGF0aCB0byB3YWxrXG4gICAqIEBwYXJhbSByZWxQYXRoIC0gcGF0aCBvZiBgcGAgcmVsYXRpdmUgdG8gdGhlIHdhbGsgcm9vdCwgYC9gLXNlcGFyYXRlZFxuICAgKiBAcGFyYW0gaXNSb290IC0gZm9sbG93IGEgc3ltbGluayBvbmx5IGF0IHRoZSByb290LCBtYXRjaGluZyBob3cgdGhlXG4gICAqIGFzc2V0J3Mgb3duIHBhdGggaXMgcmVzb2x2ZWQgd2hlbiB0aGUgYXJ0aWZhY3QgaXMgZW1pdHRlZFxuICAgKi9cbiAgZnVuY3Rpb24gaGFzaFJlY3Vyc2lvbihwOiBzdHJpbmcsIHJlbFBhdGg6IHN0cmluZywgaXNSb290ID0gZmFsc2UpIHtcbiAgICBjb25zdCBzdGF0ID0gaXNSb290ID8gZnMuc3RhdFN5bmMocCkgOiBmcy5sc3RhdFN5bmMocCk7XG4gICAgY29uc3QgbW9kZSA9IChzdGF0Lm1vZGUgJiBQRVJNX01BU0spLnRvU3RyaW5nKDgpO1xuICAgIGlmIChzdGF0LmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGZzLnJlYWRsaW5rU3luYyhwKTtcbiAgICAgIGhhc2gudXBkYXRlKGBMICR7bW9kZX0gJHtyZWxQYXRofVxcMCR7QnVmZmVyLmJ5dGVMZW5ndGgodGFyZ2V0KX1cXDBgKTtcbiAgICAgIGhhc2gudXBkYXRlKHRhcmdldCk7XG4gICAgfSBlbHNlIGlmIChzdGF0LmlzRmlsZSgpKSB7XG4gICAgICBjb25zdCBkYXRhID0gZnMucmVhZEZpbGVTeW5jKHApO1xuICAgICAgaGFzaC51cGRhdGUoYEYgJHttb2RlfSAke3JlbFBhdGh9XFwwJHtkYXRhLmxlbmd0aH1cXDBgKTtcbiAgICAgIGhhc2gudXBkYXRlKGRhdGEpO1xuICAgIH0gZWxzZSBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBpZiAocmVsUGF0aCAmJiBpbmNsdWRlRGlyZWN0b3JpZXMpIHtcbiAgICAgICAgaGFzaC51cGRhdGUoYEQgJHtyZWxQYXRofVxcMGApO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmcy5yZWFkZGlyU3luYyhwKS5zb3J0KCkpIHtcbiAgICAgICAgaGFzaFJlY3Vyc2lvbihcbiAgICAgICAgICBwYXRoLnJlc29sdmUocCwgZmlsZW5hbWUpLFxuICAgICAgICAgIHJlbFBhdGggPyBgJHtyZWxQYXRofS8ke2ZpbGVuYW1lfWAgOiBmaWxlbmFtZSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYXNoUmVjdXJzaW9uKHNyYywgXCJcIiwgdHJ1ZSk7XG4gIHJldHVybiBoYXNoLmRpZ2VzdChcImhleFwiKTtcbn1cblxuLyoqXG4gKiBXYWxrIHVwd2FyZCBmcm9tIGByb290UGF0aGAgbG9va2luZyBmb3IgYSBmaWxlIHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gKiBSZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaXJzdCBtYXRjaCwgb3IgYG51bGxgIGlmIHRoZSBzZWFyY2hcbiAqIHJlYWNoZXMgdGhlIGZpbGVzeXN0ZW0gcm9vdCB3aXRob3V0IGZpbmRpbmcgaXQuXG4gKiBAcGFyYW0gZmlsZSAtIGZpbGVuYW1lIHRvIHNlYXJjaCBmb3JcbiAqIEBwYXJhbSByb290UGF0aCAtIGRpcmVjdG9yeSB0byBzdGFydCB0aGUgc2VhcmNoIGZyb20gKGRlZmF1bHRzIHRvIGN3ZClcbiAqIEByZXR1cm5zIGFic29sdXRlIHBhdGggdG8gdGhlIGZpbGUsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kRmlsZUFib3ZlQ3dkKFxuICBmaWxlOiBzdHJpbmcsXG4gIHJvb3RQYXRoOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5yZXNvbHZlKHJvb3RQYXRoLCBmaWxlKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMoZnVsbFBhdGgpKSB7XG4gICAgcmV0dXJuIGZ1bGxQYXRoO1xuICB9XG5cbiAgY29uc3QgcGFyZW50RGlyID0gcGF0aC5yZXNvbHZlKHJvb3RQYXRoLCBcIi4uXCIpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhwYXJlbnREaXIpICYmIHBhcmVudERpciAhPT0gcm9vdFBhdGgpIHtcbiAgICByZXR1cm4gZmluZEZpbGVBYm92ZUN3ZChmaWxlLCBwYXJlbnREaXIpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iXX0=
363
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJpdmF0ZS9mcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQThFQSw0QkEyQ0M7QUFVRCxrQ0F1REM7QUFpREQsNEJBY0M7QUF3SkQsd0NBa0JDO0FBVUQsNENBZUM7QUE1YkQsK0JBQStCO0FBQy9CLG1DQUFtQztBQUNuQyx1Q0FBeUI7QUFDekIsMkNBQTZCO0FBQzdCLCtDQUFpQztBQUNqQyxtQ0FBMEM7QUFFMUMsc0NBQXdEO0FBRXhELE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztBQUVwQix5RUFBeUU7QUFDekUsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDO0FBQ3pCLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQztBQUN6QixNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUM7QUFDekIsMEVBQTBFO0FBQzFFLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQztBQUN0Qix5RUFBeUU7QUFDekUseUVBQXlFO0FBQ3pFLDBFQUEwRTtBQUMxRSwwQkFBMEI7QUFDMUIsTUFBTSxlQUFlLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUU3Qzs7OztHQUlHO0FBQ0gsU0FBUyxRQUFRLENBQUMsSUFBWTtJQUM1QixPQUFPLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM1QixDQUFDO0FBc0NELHlHQUF5RztBQUN6Rzs7Ozs7Ozs7R0FRRztBQUNILFNBQWdCLFFBQVEsQ0FDdEIsR0FBVyxFQUNYLElBQVksRUFDWixVQUEyQixFQUFFO0lBRTdCOzs7O09BSUc7SUFDSCxTQUFTLFFBQVEsQ0FBQyxDQUFTLEVBQUUsT0FBZTtRQUMxQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4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QUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDL0QsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixnQkFBZ0IsQ0FDOUIsSUFBWSxFQUNaLFdBQW1CLE9BQU8sQ0FBQyxHQUFHLEVBQUU7SUFFaEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDOUMsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDNUIsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQy9DLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxTQUFTLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdkQsT0FBTyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgSGFzaGlDb3JwLCBJbmNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNUEwtMi4wXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCAqIGFzIGNyeXB0byBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgeyBzdHJUb1U4LCB6aXBTeW5jIH0gZnJvbSBcImZmbGF0ZVwiO1xuaW1wb3J0IHR5cGUgeyBaaXBPcHRpb25zIH0gZnJvbSBcImZmbGF0ZVwiO1xuaW1wb3J0IHsgYXNzZXRDYW5Ob3RDcmVhdGVaaXBBcmNoaXZlIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuXG5jb25zdCBIQVNIX0xFTiA9IDMyO1xuXG4vLyBVbml4IGZpbGUtdHlwZSBiaXRzIGZvciB6aXAgZXh0ZXJuYWwgYXR0cmlidXRlcyAoc3RfbW9kZSB1cHBlciBuaWJibGUpXG5jb25zdCBTX0lGTE5LID0gMG8xMjAwMDA7XG5jb25zdCBTX0lGUkVHID0gMG8xMDAwMDA7XG5jb25zdCBQRVJNX01BU0sgPSAwbzc3Nzc7XG4vLyBcInZlcnNpb24gbWFkZSBieVwiIGhvc3QgYnl0ZTsgdW56aXAgb25seSBob25vcnMgdW5peCBtb2RlIGF0dHJzIHdoZW4gc2V0XG5jb25zdCBaSVBfT1NfVU5JWCA9IDM7XG4vLyBQaW5uZWQgc28gYXJjaGl2ZXMgYXJlIGJ5dGUtcmVwcm9kdWNpYmxlIGFjcm9zcyBzeW50aHMuIGZmbGF0ZSBlbmNvZGVzXG4vLyBET1MgZGF0ZXMgZnJvbSBsb2NhbC10aW1lIGdldHRlcnMgYW5kIHJlamVjdHMgeWVhcnMgb3V0c2lkZSAxOTgwLTIwOTksXG4vLyBzbyB0aGlzIG11c3QgYmUgYSBsb2NhbC10aW1lIDE5ODAgZGF0ZSAoYSBVVEMgb25lIHVuZGVyZmxvd3MgdG8gMTk3OSBpblxuLy8gdGltZXpvbmVzIHdlc3Qgb2YgVVRDKS5cbmNvbnN0IFpJUF9FTlRSWV9NVElNRSA9IG5ldyBEYXRlKDE5ODAsIDAsIDEpO1xuXG4vKipcbiAqIFppcCBleHRlcm5hbCBhdHRyaWJ1dGVzIGZvciBhIHVuaXggbW9kZTogZmlsZS10eXBlIGFuZCBwZXJtaXNzaW9uIGJpdHNcbiAqIGJlbG9uZyBpbiB0aGUgaGlnaCAxNiBiaXRzIG9mIHRoZSAzMi1iaXQgZmllbGQuXG4gKiBAcGFyYW0gbW9kZSAtIHVuaXggc3RfbW9kZSBiaXRzICh0eXBlIHwgcGVybWlzc2lvbnMpXG4gKi9cbmZ1bmN0aW9uIHppcEF0dHJzKG1vZGU6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiAobW9kZSA8PCAxNikgPj4+IDA7XG59XG5cbi8qKlxuICogUHJlZGljYXRlIGRlY2lkaW5nIHdoZXRoZXIgYSB0cmVlIGVudHJ5IGlzIHNraXBwZWQuXG4gKiBgcmVsUGF0aGAgaXMgYWx3YXlzIGAvYC1zZXBhcmF0ZWQgYW5kIHJlbGF0aXZlIHRvIHRoZSB3YWxrIHJvb3QsIHNvIHBhdHRlcm5zXG4gKiBiZWhhdmUgaWRlbnRpY2FsbHkgb24gV2luZG93cy4gYGlzRGlyZWN0b3J5YCBpcyBzdXBwbGllZCBmcm9tIHRoZSB3YWxrZXInc1xuICogYGxzdGF0YCBzbyBgLmdpdGlnbm9yZWAgLyBgLmRvY2tlcmlnbm9yZWAtc3R5bGUgZGlyZWN0b3J5LW9ubHkgcGF0dGVybnMgY2FuXG4gKiBiZSBob25vcmVkIHdpdGhvdXQgdGhlIHByZWRpY2F0ZSBzdGF0LWluZyB0aGUgcGF0aCBpdHNlbGYuXG4gKi9cbmV4cG9ydCB0eXBlIEV4Y2x1ZGVQcmVkaWNhdGUgPSAoXG4gIHJlbFBhdGg6IHN0cmluZyxcbiAgaXNEaXJlY3Rvcnk6IGJvb2xlYW4sXG4pID0+IGJvb2xlYW47XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29weVN5bmNPcHRpb25zIHtcbiAgLyoqXG4gICAqIEVudHJpZXMgZm9yIHdoaWNoIHRoaXMgcmV0dXJucyB0cnVlIGFyZSBub3QgY29waWVkLiBDYWxsZWQgd2l0aCB0aGVcbiAgICogZW50cnkncyBgL2Atc2VwYXJhdGVkIHJlbGF0aXZlIHBhdGggYW5kIHdoZXRoZXIgaXQgaXMgYSBkaXJlY3RvcnkuXG4gICAqIEV4Y2x1ZGluZyBhIGRpcmVjdG9yeSBhbHNvIHNraXBzIGV2ZXJ5dGhpbmcgYmVsb3cgaXQsIHVubGVzc1xuICAgKiB7QGxpbmsgZGVzY2VuZEludG9FeGNsdWRlZERpcmVjdG9yaWVzfSBpcyBzZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm90aGluZyBpcyBleGNsdWRlZFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRXhjbHVkZT86IEV4Y2x1ZGVQcmVkaWNhdGU7XG5cbiAgLyoqXG4gICAqIEtlZXAgd2Fsa2luZyBpbnRvIGFuIGV4Y2x1ZGVkIGRpcmVjdG9yeSBpbnN0ZWFkIG9mIHBydW5pbmcgaXQuIFRoZVxuICAgKiBkaXJlY3RvcnkgZW50cnkgaXRzZWxmIGlzIHN0aWxsIG9taXR0ZWQ7IGl0cyBjaGlsZHJlbiBhcmUgdmlzaXRlZCBhbmRcbiAgICogcmUtdGVzdGVkIGFnYWluc3Qge0BsaW5rIHNob3VsZEV4Y2x1ZGV9LCBzbyBhIHN0cmF0ZWd5IHdpdGggbmVnYXRpb25cbiAgICogcGF0dGVybnMgKGBub2RlX21vZHVsZXNgICsgYCFub2RlX21vZHVsZXMva2VlcGApIGNhbiByZS1pbmNsdWRlIGVudHJpZXNcbiAgICogYmVsb3cgYW4gZXhjbHVkZWQgcGFyZW50LiBDb3N0cyBhIGZ1bGwgd2FsayBvZiBleGNsdWRlZCBzdWJ0cmVlcywgc28gaXRcbiAgICogaXMgb2ZmIHVubGVzcyBhIHN0cmF0ZWd5IGFza3MgZm9yIGl0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY2VuZEludG9FeGNsdWRlZERpcmVjdG9yaWVzPzogYm9vbGVhbjtcbn1cblxuLy8gRnVsbCBpbXBsZW1lbnRhdGlvbiBhdCBodHRwczovL2dpdGh1Yi5jb20vanByaWNoYXJkc29uL25vZGUtZnMtZXh0cmEvYmxvYi9tYXN0ZXIvbGliL2NvcHkvY29weS1zeW5jLmpzXG4vKipcbiAqIENvcHkgYSBmaWxlIG9yIGRpcmVjdG9yeS4gVGhlIGRpcmVjdG9yeSBjYW4gaGF2ZSBjb250ZW50cyBhbmQgc3ViZm9sZGVycy5cbiAqIFN5bWxpbmtzIGFyZSByZWNyZWF0ZWQgYXMgc3ltbGlua3MgcmF0aGVyIHRoYW4gZGVyZWZlcmVuY2VkLCB3aGljaCBrZWVwcyB0aGVcbiAqIGNvcHkgY29uc2lzdGVudCB3aXRoIHtAbGluayBoYXNoUGF0aH0gKGl0IGhhc2hlcyBsaW5rcyBieSB0aGVpciB0YXJnZXQpIGFuZFxuICogbWFrZXMgZGFuZ2xpbmcgbGlua3MgYW5kIGxpbmsgY3ljbGVzIGhhcm1sZXNzLlxuICogQHBhcmFtIHNyYyAtIHNvdXJjZSBwYXRoXG4gKiBAcGFyYW0gZGVzdCAtIGRlc3RpbmF0aW9uIHBhdGhcbiAqIEBwYXJhbSBvcHRpb25zIC0gY29weSBiZWhhdmlvdXIsIHNlZSB7QGxpbmsgQ29weVN5bmNPcHRpb25zfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY29weVN5bmMoXG4gIHNyYzogc3RyaW5nLFxuICBkZXN0OiBzdHJpbmcsXG4gIG9wdGlvbnM6IENvcHlTeW5jT3B0aW9ucyA9IHt9LFxuKSB7XG4gIC8qKlxuICAgKiBDb3BpZXMgZmlsZSBpZiBwcmVzZW50IG90aGVyd2lzZSB3YWxrcyBzdWJmb2xkZXIuXG4gICAqIEBwYXJhbSBwIC0gcGF0aCByZWxhdGl2ZSB0byBzcmMvZGVzdFxuICAgKiBAcGFyYW0gcmVsUGF0aCAtIGAvYC1zZXBhcmF0ZWQgcGF0aCByZWxhdGl2ZSB0byB0aGUgY29weSByb290XG4gICAqL1xuICBmdW5jdGlvbiBjb3B5SXRlbShwOiBzdHJpbmcsIHJlbFBhdGg6IHN0cmluZykge1xuICAgIGNvbnN0IHNvdXJjZVBhdGggPSBwYXRoLnJlc29sdmUoc3JjLCBwKTtcbiAgICBjb25zdCBzdGF0ID0gZnMubHN0YXRTeW5jKHNvdXJjZVBhdGgpO1xuICAgIGNvbnN0IGV4Y2x1ZGVkID0gISFvcHRpb25zLnNob3VsZEV4Y2x1ZGU/LihyZWxQYXRoLCBzdGF0LmlzRGlyZWN0b3J5KCkpO1xuICAgIC8vIFNraXAsIHVubGVzcyBpdCBpcyBhbiBleGNsdWRlZCBkaXJlY3RvcnkgYmVpbmcgZGVzY2VuZGVkIGludG8uXG4gICAgaWYgKFxuICAgICAgZXhjbHVkZWQgJiZcbiAgICAgICEoc3RhdC5pc0RpcmVjdG9yeSgpICYmIG9wdGlvbnMuZGVzY2VuZEludG9FeGNsdWRlZERpcmVjdG9yaWVzKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc3RhdC5pc1N5bWJvbGljTGluaygpKSB7XG4gICAgICBmcy5zeW1saW5rU3luYyhmcy5yZWFkbGlua1N5bmMoc291cmNlUGF0aCksIHBhdGgucmVzb2x2ZShkZXN0LCBwKSk7XG4gICAgfSBlbHNlIGlmIChzdGF0LmlzRmlsZSgpKSB7XG4gICAgICBmcy5jb3B5RmlsZVN5bmMoc291cmNlUGF0aCwgcGF0aC5yZXNvbHZlKGRlc3QsIHApKTtcbiAgICB9IGVsc2UgaWYgKHN0YXQuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgd2Fsa1N1YmZvbGRlcihwLCByZWxQYXRoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIENvcGllcyBjb250ZW50cyBvZiBzdWJmb2xkZXIuXG4gICAqIEBwYXJhbSBwIC0gcGF0aCByZWxhdGl2ZSB0byBzcmMvZGVzdFxuICAgKiBAcGFyYW0gcmVsUGF0aCAtIGAvYC1zZXBhcmF0ZWQgcGF0aCByZWxhdGl2ZSB0byB0aGUgY29weSByb290XG4gICAqL1xuICBmdW5jdGlvbiB3YWxrU3ViZm9sZGVyKHA6IHN0cmluZywgcmVsUGF0aDogc3RyaW5nKSB7XG4gICAgY29uc3Qgc291cmNlRGlyID0gcGF0aC5yZXNvbHZlKHNyYywgcCk7XG4gICAgZnMubWtkaXJTeW5jKHBhdGgucmVzb2x2ZShkZXN0LCBwKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgZnMucmVhZGRpclN5bmMoc291cmNlRGlyKS5mb3JFYWNoKChpdGVtOiBzdHJpbmcpID0+XG4gICAgICBjb3B5SXRlbShwYXRoLmpvaW4ocCwgaXRlbSksIHJlbFBhdGggPyBgJHtyZWxQYXRofS8ke2l0ZW19YCA6IGl0ZW0pLFxuICAgICk7XG4gIH1cblxuICB3YWxrU3ViZm9sZGVyKFwiLlwiLCBcIlwiKTtcbn1cblxuLyoqXG4gKiBaaXBzIGNvbnRlbnRzIGF0IHNyYyBhbmQgcGxhY2VzIHppcCBhcmNoaXZlIGF0IGRlc3QuXG4gKiBAcGFyYW0gc3JjIC0gZGlyZWN0b3J5IHRvIGFyY2hpdmVcbiAqIEBwYXJhbSBkZXN0IC0gcGF0aCB0byB3cml0ZSB0aGUgcmVzdWx0aW5nIHppcCB0b1xuICogQHBhcmFtIHNob3VsZEV4Y2x1ZGUgLSBlbnRyaWVzIHRvIG9taXQsIHNlZSB7QGxpbmsgQ29weVN5bmNPcHRpb25zLnNob3VsZEV4Y2x1ZGV9XG4gKiBAcGFyYW0gZGVzY2VuZEludG9FeGNsdWRlZERpcmVjdG9yaWVzIC0ga2VlcCB3YWxraW5nIGV4Y2x1ZGVkIGRpcmVjdG9yaWVzLFxuICogc2VlIHtAbGluayBDb3B5U3luY09wdGlvbnMuZGVzY2VuZEludG9FeGNsdWRlZERpcmVjdG9yaWVzfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJjaGl2ZVN5bmMoXG4gIHNyYzogc3RyaW5nLFxuICBkZXN0OiBzdHJpbmcsXG4gIHNob3VsZEV4Y2x1ZGU/OiBFeGNsdWRlUHJlZGljYXRlLFxuICBkZXNjZW5kSW50b0V4Y2x1ZGVkRGlyZWN0b3JpZXMgPSBmYWxzZSxcbikge1xuICB0cnkge1xuICAgIGNvbnN0IGZpbGVzOiBSZWNvcmQ8c3RyaW5nLCBbVWludDhBcnJheSwgWmlwT3B0aW9uc10+ID0ge307XG4gICAgY29uc3Qgd2FsayA9IChkaXI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIFNvcnRlZCBzbyBlbnRyeSBvcmRlciDigJQgYW5kIHRoZXJlZm9yZSBhcmNoaXZlIGJ5dGVzIOKAlCBjYW5ub3QgZGVwZW5kXG4gICAgICAvLyBvbiBmaWxlc3lzdGVtIGVudW1lcmF0aW9uIG9yZGVyOyBtYXRjaGVzIHRoZSBjYW5vbmljYWwgaGFzaCB3YWxrLlxuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBmcy5yZWFkZGlyU3luYyhkaXIpLnNvcnQoKSkge1xuICAgICAgICBjb25zdCBmdWxsID0gcGF0aC5qb2luKGRpciwgZW50cnkpO1xuICAgICAgICBjb25zdCB6aXBQYXRoID0gcHJlZml4ID8gYCR7cHJlZml4fS8ke2VudHJ5fWAgOiBlbnRyeTtcbiAgICAgICAgY29uc3Qgc3RhdCA9IGZzLmxzdGF0U3luYyhmdWxsKTtcbiAgICAgICAgY29uc3QgZXhjbHVkZWQgPSAhIXNob3VsZEV4Y2x1ZGU/Lih6aXBQYXRoLCBzdGF0LmlzRGlyZWN0b3J5KCkpO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZXhjbHVkZWQgJiZcbiAgICAgICAgICAhKHN0YXQuaXNEaXJlY3RvcnkoKSAmJiBkZXNjZW5kSW50b0V4Y2x1ZGVkRGlyZWN0b3JpZXMpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0LmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgICAgICAvLyBTdG9yZSB0aGUgbGluayB0YXJnZXQgYXMgdGhlIGVudHJ5IGRhdGEgd2l0aCBTX0lGTE5LIGF0dHJzIHNvXG4gICAgICAgICAgLy8gZXh0cmFjdG9ycyByZWNyZWF0ZSB0aGUgc3ltbGluayBpbnN0ZWFkIG9mIGEgY29weSBvZiB0aGUgdGFyZ2V0LlxuICAgICAgICAgIC8vIE5ldmVyIHJlY3Vyc2luZyB0aHJvdWdoIGxpbmtzIGFsc28gbWFrZXMgY3ljbGVzIHVucmVhY2hhYmxlLlxuICAgICAgICAgIGZpbGVzW3ppcFBhdGhdID0gW1xuICAgICAgICAgICAgc3RyVG9VOChmcy5yZWFkbGlua1N5bmMoZnVsbCkpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBvczogWklQX09TX1VOSVgsXG4gICAgICAgICAgICAgIGF0dHJzOiB6aXBBdHRycyhTX0lGTE5LIHwgKHN0YXQubW9kZSAmIFBFUk1fTUFTSykpLFxuICAgICAgICAgICAgICBsZXZlbDogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICB3YWxrKGZ1bGwsIHppcFBhdGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbGVzW3ppcFBhdGhdID0gW1xuICAgICAgICAgICAgZnMucmVhZEZpbGVTeW5jKGZ1bGwpLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBvczogWklQX09TX1VOSVgsXG4gICAgICAgICAgICAgIGF0dHJzOiB6aXBBdHRycyhTX0lGUkVHIHwgKHN0YXQubW9kZSAmIFBFUk1fTUFTSykpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICB3YWxrKHNyYywgXCJcIik7XG4gICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgIGRlc3QsXG4gICAgICB6aXBTeW5jKGZpbGVzLCB7IGxldmVsOiA5LCBtdGltZTogWklQX0VOVFJZX01USU1FIH0pLFxuICAgICk7XG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgdGhyb3cgYXNzZXRDYW5Ob3RDcmVhdGVaaXBBcmNoaXZlKHNyYywgZGVzdCwgZXJyKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhhc2hQYXRoT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBVc2UgdGhlIGNhbm9uaWNhbCBlbnRyeS1mcmFtZWQgaGFzaCBpbnN0ZWFkIG9mIHRoZSBsZWdhY3lcbiAgICogY29udGVudC1jb25jYXRlbmF0aW9uIGhhc2guIEVuYWJsZWQgdGhyb3VnaCB0aGUgYGNhbm9uaWNhbEFzc2V0SGFzaGVzYFxuICAgKiBmZWF0dXJlIGZsYWcuXG4gICAqL1xuICByZWFkb25seSBjYW5vbmljYWw/OiBib29sZWFuO1xuICAvKipcbiAgICogRnJhbWUgZm9yIGFuIGFyY2hpdmUgYXJ0aWZhY3Q6IGFyY2hpdmVTeW5jIG5ldmVyIGVtaXRzIFpJUCBkaXJlY3RvcnlcbiAgICogZW50cmllcywgc28gY2Fub25pY2FsIGhhc2hpbmcgb21pdHMgZGlyZWN0b3J5IHJlY29yZHMgYW5kIHRoZSBoYXNoXG4gICAqIHRyYWNrcyB0aGUgZW1pdHRlZCBhcmNoaXZlIGJ5dGVzIGV4YWN0bHkuIE5vbi1lbXB0eSBkaXJlY3RvcmllcyBzdGF5XG4gICAqIHZpc2libGUgdGhyb3VnaCB0aGUgcmVsYXRpdmUgcGF0aHMgb2YgdGhlaXIgY29udGVudHMuIEhhcyBubyBlZmZlY3Qgb25cbiAgICogdGhlIGxlZ2FjeSBzY2hlbWUsIHdoaWNoIG5ldmVyIHJlY29yZHMgZGlyZWN0b3JpZXMuXG4gICAqL1xuICByZWFkb25seSBhcmNoaXZlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEVudHJpZXMgZm9yIHdoaWNoIHRoaXMgcmV0dXJucyB0cnVlIGFyZSBvbWl0dGVkIGZyb20gdGhlIGRpZ2VzdC4gRXhjbHVkaW5nXG4gICAqIGEgZGlyZWN0b3J5IGFsc28gb21pdHMgZXZlcnl0aGluZyBiZWxvdyBpdCwgdW5sZXNzXG4gICAqIHtAbGluayBkZXNjZW5kSW50b0V4Y2x1ZGVkRGlyZWN0b3JpZXN9IGlzIHNldC4gVGhlIHNhbWUgcHJlZGljYXRlIG11c3QgYmVcbiAgICogZ2l2ZW4gdG8ge0BsaW5rIGNvcHlTeW5jfSBzbyB0aGUgaGFzaCBhbmQgdGhlIGVtaXR0ZWQgYXJ0aWZhY3QgZGVzY3JpYmUgdGhlXG4gICAqIHNhbWUgc2V0IG9mIGZpbGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vdGhpbmcgaXMgZXhjbHVkZWRcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEV4Y2x1ZGU/OiBFeGNsdWRlUHJlZGljYXRlO1xuXG4gIC8qKlxuICAgKiBLZWVwIHdhbGtpbmcgaW50byBleGNsdWRlZCBkaXJlY3Rvcmllcywgc2VlXG4gICAqIHtAbGluayBDb3B5U3luY09wdGlvbnMuZGVzY2VuZEludG9FeGNsdWRlZERpcmVjdG9yaWVzfS4gTXVzdCBtYXRjaCB0aGVcbiAgICogdmFsdWUgZ2l2ZW4gdG8ge0BsaW5rIGNvcHlTeW5jfSAvIHtAbGluayBhcmNoaXZlU3luY30gc28gdGhlIGRpZ2VzdCBjb3ZlcnNcbiAgICogdGhlIHNhbWUgZmlsZSBzZXQgdGhlIGFydGlmYWN0IGNvbnRhaW5zLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY2VuZEludG9FeGNsdWRlZERpcmVjdG9yaWVzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDb21wdXRlIGEgc3RhYmxlIE1ENSBoYXNoIG9mIGEgZmlsZSBvciBkaXJlY3RvcnkncyBjb250ZW50cy5cbiAqIEluIGJvdGggc2NoZW1lcyBzeW1saW5rcyBhcmUgaGFzaGVkIGJ5IHRoZWlyIG1ldGFkYXRhIChwYXRoICsgdGFyZ2V0KVxuICogaW5zdGVhZCBvZiBiZWluZyBmb2xsb3dlZCwgc28gc2hhcmVkIHRhcmdldHMgYXJlIG5vdCBkb3VibGUtY291bnRlZCBhbmRcbiAqIGN5Y2xlcyBjYW5ub3QgcmVjdXJzZTsgYSBzeW1saW5rIGF0IHRoZSByb290IGl0c2VsZiBpcyBmb2xsb3dlZCwgbWF0Y2hpbmdcbiAqIGhvdyB0aGUgYXNzZXQgc291cmNlIHBhdGggaXMgb3BlbmVkIHdoZW4gdGhlIGFydGlmYWN0IGlzIGVtaXR0ZWQuXG4gKiBAcGFyYW0gc3JjIC0gcGF0aCB0byBhIGZpbGUgb3IgZGlyZWN0b3J5IHRvIGhhc2hcbiAqIEBwYXJhbSBvcHRpb25zIC0gaGFzaCBzY2hlbWUgc2VsZWN0aW9uLCBzZWUge0BsaW5rIEhhc2hQYXRoT3B0aW9uc31cbiAqIEByZXR1cm5zIHVwcGVyY2FzZWQgaGV4IGRpZ2VzdCwgdHJ1bmNhdGVkIHRvIEhBU0hfTEVOIGNoYXJhY3RlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc2hQYXRoKHNyYzogc3RyaW5nLCBvcHRpb25zOiBIYXNoUGF0aE9wdGlvbnMgPSB7fSk6IHN0cmluZyB7XG4gIGNvbnN0IGRpZ2VzdCA9IG9wdGlvbnMuY2Fub25pY2FsXG4gICAgPyBjYW5vbmljYWxIYXNoUGF0aChcbiAgICAgICAgc3JjLFxuICAgICAgICAhb3B0aW9ucy5hcmNoaXZlLFxuICAgICAgICBvcHRpb25zLnNob3VsZEV4Y2x1ZGUsXG4gICAgICAgIG9wdGlvbnMuZGVzY2VuZEludG9FeGNsdWRlZERpcmVjdG9yaWVzLFxuICAgICAgKVxuICAgIDogbGVnYWN5SGFzaFBhdGgoXG4gICAgICAgIHNyYyxcbiAgICAgICAgb3B0aW9ucy5zaG91bGRFeGNsdWRlLFxuICAgICAgICBvcHRpb25zLmRlc2NlbmRJbnRvRXhjbHVkZWREaXJlY3RvcmllcyxcbiAgICAgICk7XG4gIHJldHVybiBkaWdlc3Quc2xpY2UoMCwgSEFTSF9MRU4pLnRvVXBwZXJDYXNlKCk7XG59XG5cbi8qKlxuICogTGVnYWN5LWNvbXBhdGlibGUgaGFzaDogZmlsZSBjb250ZW50cyBmb2xkIGludG8gb25lIGRpZ2VzdCBpblxuICogZGlyZWN0b3J5LWxpc3Rpbmcgb3JkZXIsIGV4YWN0bHkgYXMgZWFybGllciByZWxlYXNlcyBkaWQsIHNvIHRyZWVzIHdpdGhvdXRcbiAqIHN5bWxpbmtzIGtlZXAgdGhlaXIgaGlzdG9yaWNhbCBoYXNoZXMuIFN5bWxpbmsgbWV0YWRhdGEgZ29lcyBpbnRvIGEgc2Vjb25kXG4gKiBkaWdlc3QsIGFuZCBvbmx5IHdoZW4gc3ltbGlua3MgZXhpc3QgYXJlIHRoZSB0d28gY29tYmluZWQgdW5kZXIgYSB0YWdnZWRcbiAqIG91dGVyIGhhc2gg4oCUIHRoZSB0YWcga2VlcHMgc3ltbGluayBtZXRhZGF0YSBpbiBhIHNlcGFyYXRlIGRvbWFpbiBmcm9tIGZpbGVcbiAqIGJ5dGVzLCBzbyBhIGZpbGUgY29udGFpbmluZyBgZm9vYCBjYW4gbmV2ZXIgY29sbGlkZSB3aXRoIGEgc3ltbGlua1xuICogdGFyZ2V0aW5nIGBmb29gLlxuICogQHBhcmFtIHNyYyAtIHBhdGggdG8gYSBmaWxlIG9yIGRpcmVjdG9yeSB0byBoYXNoXG4gKiBAcGFyYW0gc2hvdWxkRXhjbHVkZSAtIGVudHJpZXMgdG8gb21pdCwgc2VlIHtAbGluayBIYXNoUGF0aE9wdGlvbnMuc2hvdWxkRXhjbHVkZX1cbiAqIEBwYXJhbSBkZXNjZW5kSW50b0V4Y2x1ZGVkRGlyZWN0b3JpZXMgLSBrZWVwIHdhbGtpbmcgZXhjbHVkZWQgZGlyZWN0b3JpZXMsXG4gKiBzZWUge0BsaW5rIEhhc2hQYXRoT3B0aW9ucy5kZXNjZW5kSW50b0V4Y2x1ZGVkRGlyZWN0b3JpZXN9XG4gKi9cbmZ1bmN0aW9uIGxlZ2FjeUhhc2hQYXRoKFxuICBzcmM6IHN0cmluZyxcbiAgc2hvdWxkRXhjbHVkZT86IEV4Y2x1ZGVQcmVkaWNhdGUsXG4gIGRlc2NlbmRJbnRvRXhjbHVkZWREaXJlY3RvcmllcyA9IGZhbHNlLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgY29udGVudCA9IGNyeXB0by5jcmVhdGVIYXNoKFwibWQ1XCIpO1xuICBjb25zdCBsaW5rcyA9IGNyeXB0by5jcmVhdGVIYXNoKFwibWQ1XCIpO1xuICBsZXQgbGlua0NvdW50ID0gMDtcblxuICAvKipcbiAgICogV2FsayBgcGAsIGZlZWRpbmcgZmlsZSBjb250ZW50cyBhbmQgc3ltbGluayBtZXRhZGF0YSBpbnRvIHRoZSBlbmNsb3NpbmdcbiAgICogYWNjdW11bGF0b3JzLlxuICAgKiBAcGFyYW0gcCAtIHBhdGggdG8gd2Fsa1xuICAgKiBAcGFyYW0gcmVsUGF0aCAtIHBhdGggb2YgYHBgIHJlbGF0aXZlIHRvIHRoZSB3YWxrIHJvb3QsIGAvYC1zZXBhcmF0ZWRcbiAgICogQHBhcmFtIGlzUm9vdCAtIGZvbGxvdyBhIHN5bWxpbmsgb25seSBhdCB0aGUgcm9vdCwgbWF0Y2hpbmcgaG93IHRoZVxuICAgKiBhc3NldCdzIG93biBwYXRoIGlzIHJlc29sdmVkIHdoZW4gaXQgaXMgcmVhZFxuICAgKi9cbiAgZnVuY3Rpb24gaGFzaFJlY3Vyc2lvbihwOiBzdHJpbmcsIHJlbFBhdGg6IHN0cmluZywgaXNSb290ID0gZmFsc2UpIHtcbiAgICBjb25zdCBzdGF0ID0gaXNSb290ID8gZnMuc3RhdFN5bmMocCkgOiBmcy5sc3RhdFN5bmMocCk7XG4gICAgaWYgKHN0YXQuaXNTeW1ib2xpY0xpbmsoKSkge1xuICAgICAgbGlua3MudXBkYXRlKGAke3JlbFBhdGh9XFwwJHtmcy5yZWFkbGlua1N5bmMocCl9XFwwYCk7XG4gICAgICBsaW5rQ291bnQrKztcbiAgICB9IGVsc2UgaWYgKHN0YXQuaXNGaWxlKCkpIHtcbiAgICAgIGNvbnRlbnQudXBkYXRlKGZzLnJlYWRGaWxlU3luYyhwKSk7XG4gICAgfSBlbHNlIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGZzLnJlYWRkaXJTeW5jKHApLmZvckVhY2goKGZpbGVuYW1lKSA9PiB7XG4gICAgICAgIGNvbnN0IGVudHJ5UmVsUGF0aCA9IHJlbFBhdGggPyBgJHtyZWxQYXRofS8ke2ZpbGVuYW1lfWAgOiBmaWxlbmFtZTtcbiAgICAgICAgY29uc3QgY2hpbGRQYXRoID0gcGF0aC5yZXNvbHZlKHAsIGZpbGVuYW1lKTtcbiAgICAgICAgY29uc3QgY2hpbGRJc0RpciA9IGZzLmxzdGF0U3luYyhjaGlsZFBhdGgpLmlzRGlyZWN0b3J5KCk7XG4gICAgICAgIGlmIChzaG91bGRFeGNsdWRlPy4oZW50cnlSZWxQYXRoLCBjaGlsZElzRGlyKSkge1xuICAgICAgICAgIC8vIFNraXAsIHVubGVzcyBpdCBpcyBhbiBleGNsdWRlZCBkaXJlY3RvcnkgYmVpbmcgZGVzY2VuZGVkIGludG8uXG4gICAgICAgICAgaWYgKCEoY2hpbGRJc0RpciAmJiBkZXNjZW5kSW50b0V4Y2x1ZGVkRGlyZWN0b3JpZXMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGhhc2hSZWN1cnNpb24oY2hpbGRQYXRoLCBlbnRyeVJlbFBhdGgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaGFzaFJlY3Vyc2lvbihzcmMsIFwiXCIsIHRydWUpO1xuICBpZiAobGlua0NvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuIGNvbnRlbnQuZGlnZXN0KFwiaGV4XCIpO1xuICB9XG4gIGNvbnN0IG91dGVyID0gY3J5cHRvLmNyZWF0ZUhhc2goXCJtZDVcIik7XG4gIG91dGVyLnVwZGF0ZShcImNka3RuL2Fzc2V0LWhhc2gvc3ltbGlua3MvdjFcXDBcIik7XG4gIG91dGVyLnVwZGF0ZShjb250ZW50LmRpZ2VzdChcImhleFwiKSk7XG4gIG91dGVyLnVwZGF0ZShsaW5rcy5kaWdlc3QoXCJoZXhcIikpO1xuICByZXR1cm4gb3V0ZXIuZGlnZXN0KFwiaGV4XCIpO1xufVxuXG4vKipcbiAqIENhbm9uaWNhbCBoYXNoLCBtb2RlbGVkIG9uIGdpdCB0cmVlcyBhbmQgTml4IE5BUjogZXZlcnkgZW50cnkgaXMgZnJhbWVkXG4gKiB3aXRoIGV2ZXJ5dGhpbmcgdGhhdCBhZmZlY3RzIHRoZSBlbWl0dGVkIGFydGlmYWN0IOKAlFxuICpcbiAqIC0gZmlsZXM6ICAgICAgYEYgPG1vZGU+IDxyZWxQYXRoPlxcMDxzaXplPlxcMGAgKyBjb250ZW50LCB3aGVyZSBgPG1vZGU+YCBpc1xuICogICAgICAgICAgICAgICB0aGUgb2N0YWwgcGVybWlzc2lvbiBtYXNrIChgMG83Nzc3YCBiaXRzKSB0aGF0IGFyY2hpdmVTeW5jXG4gKiAgICAgICAgICAgICAgIHByZXNlcnZlcyBpbiB6aXAgZXh0ZXJuYWwgYXR0cmlidXRlcyxcbiAqIC0gc3ltbGlua3M6ICAgYEwgPG1vZGU+IDxyZWxQYXRoPlxcMDx0YXJnZXQgYnl0ZSBsZW5ndGg+XFwwYCArIHRhcmdldCxcbiAqIC0gZGlyZWN0b3JpZXMgKGluY2x1ZGluZyBlbXB0eSBvbmVzLCB3aGljaCBjb3B5U3luYyBtYXRlcmlhbGl6ZXMpOlxuICogICAgICAgICAgICAgICBgRCA8cmVsUGF0aD5cXDBgLCB3aXRoIG5vIG1vZGUg4oCUIG5laXRoZXIgYXJjaGl2ZVN5bmMgbm9yXG4gKiAgICAgICAgICAgICAgIGNvcHlTeW5jIHByZXNlcnZlcyBkaXJlY3RvcnkgcGVybWlzc2lvbnMsXG4gKlxuICogaW4gc29ydGVkIGRpcmVjdG9yeSBvcmRlciB3aXRoIGAvYC1zZXBhcmF0ZWQgcmVsYXRpdmUgcGF0aHMsIHNvIHJlbmFtZXMsXG4gKiBlbnRyeS1ib3VuZGFyeSBzaGlmdHMsIHBlcm1pc3Npb24gY2hhbmdlcywgZW1wdHktZGlyZWN0b3J5IGNoYW5nZXMsIGFuZFxuICogZmlsZS12cy1zeW1saW5rIHN3YXBzIGFsbCBjaGFuZ2UgdGhlIGRpZ2VzdC5cbiAqIEBwYXJhbSBzcmMgLSBwYXRoIHRvIGEgZmlsZSBvciBkaXJlY3RvcnkgdG8gaGFzaFxuICogQHBhcmFtIGluY2x1ZGVEaXJlY3RvcmllcyAtIHJlY29yZCBkaXJlY3RvcnkgZW50cmllczsgZmFsc2UgZm9yIGFyY2hpdmVcbiAqIGFydGlmYWN0cywgd2hlcmUgdGhlIGVtaXR0ZWQgemlwIGhhcyBubyBkaXJlY3RvcnkgZW50cmllc1xuICogQHBhcmFtIHNob3VsZEV4Y2x1ZGUgLSBlbnRyaWVzIHRvIG9taXQsIHNlZSB7QGxpbmsgSGFzaFBhdGhPcHRpb25zLnNob3VsZEV4Y2x1ZGV9XG4gKi9cbmZ1bmN0aW9uIGNhbm9uaWNhbEhhc2hQYXRoKFxuICBzcmM6IHN0cmluZyxcbiAgaW5jbHVkZURpcmVjdG9yaWVzOiBib29sZWFuLFxuICBzaG91bGRFeGNsdWRlPzogRXhjbHVkZVByZWRpY2F0ZSxcbiAgZGVzY2VuZEludG9FeGNsdWRlZERpcmVjdG9yaWVzID0gZmFsc2UsXG4pOiBzdHJpbmcge1xuICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goXCJtZDVcIik7XG5cbiAgLyoqXG4gICAqIFdhbGsgYHBgLCBmcmFtaW5nIGVhY2ggZW50cnkgaW50byB0aGUgZW5jbG9zaW5nIGhhc2ggYWNjdW11bGF0b3IuXG4gICAqIEBwYXJhbSBwIC0gcGF0aCB0byB3YWxrXG4gICAqIEBwYXJhbSByZWxQYXRoIC0gcGF0aCBvZiBgcGAgcmVsYXRpdmUgdG8gdGhlIHdhbGsgcm9vdCwgYC9gLXNlcGFyYXRlZFxuICAgKiBAcGFyYW0gaXNSb290IC0gZm9sbG93IGEgc3ltbGluayBvbmx5IGF0IHRoZSByb290LCBtYXRjaGluZyBob3cgdGhlXG4gICAqIGFzc2V0J3Mgb3duIHBhdGggaXMgcmVzb2x2ZWQgd2hlbiB0aGUgYXJ0aWZhY3QgaXMgZW1pdHRlZFxuICAgKi9cbiAgZnVuY3Rpb24gaGFzaFJlY3Vyc2lvbihwOiBzdHJpbmcsIHJlbFBhdGg6IHN0cmluZywgaXNSb290ID0gZmFsc2UpIHtcbiAgICBjb25zdCBzdGF0ID0gaXNSb290ID8gZnMuc3RhdFN5bmMocCkgOiBmcy5sc3RhdFN5bmMocCk7XG4gICAgY29uc3QgbW9kZSA9IChzdGF0Lm1vZGUgJiBQRVJNX01BU0spLnRvU3RyaW5nKDgpO1xuICAgIGlmIChzdGF0LmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IGZzLnJlYWRsaW5rU3luYyhwKTtcbiAgICAgIGhhc2gudXBkYXRlKGBMICR7bW9kZX0gJHtyZWxQYXRofVxcMCR7QnVmZmVyLmJ5dGVMZW5ndGgodGFyZ2V0KX1cXDBgKTtcbiAgICAgIGhhc2gudXBkYXRlKHRhcmdldCk7XG4gICAgfSBlbHNlIGlmIChzdGF0LmlzRmlsZSgpKSB7XG4gICAgICBjb25zdCBkYXRhID0gZnMucmVhZEZpbGVTeW5jKHApO1xuICAgICAgaGFzaC51cGRhdGUoYEYgJHttb2RlfSAke3JlbFBhdGh9XFwwJHtkYXRhLmxlbmd0aH1cXDBgKTtcbiAgICAgIGhhc2gudXBkYXRlKGRhdGEpO1xuICAgIH0gZWxzZSBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAvLyBSZWNvcmRzIHRoZSBgRGAgZW50cnkgZXZlbiBmb3IgYSBkZXNjZW5kZWQtaW50byBleGNsdWRlZCBkaXJlY3RvcnksXG4gICAgICAvLyBtYXRjaGluZyB0aGUgZW1wdHkgZGlyZWN0b3J5IGNvcHlTeW5jIGxlYXZlcyBvbiBkaXNrLlxuICAgICAgaWYgKHJlbFBhdGggJiYgaW5jbHVkZURpcmVjdG9yaWVzKSB7XG4gICAgICAgIGhhc2gudXBkYXRlKGBEICR7cmVsUGF0aH1cXDBgKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgZnMucmVhZGRpclN5bmMocCkuc29ydCgpKSB7XG4gICAgICAgIGNvbnN0IGVudHJ5UmVsUGF0aCA9IHJlbFBhdGggPyBgJHtyZWxQYXRofS8ke2ZpbGVuYW1lfWAgOiBmaWxlbmFtZTtcbiAgICAgICAgY29uc3QgY2hpbGRQYXRoID0gcGF0aC5yZXNvbHZlKHAsIGZpbGVuYW1lKTtcbiAgICAgICAgY29uc3QgY2hpbGRJc0RpciA9IGZzLmxzdGF0U3luYyhjaGlsZFBhdGgpLmlzRGlyZWN0b3J5KCk7XG4gICAgICAgIGlmIChzaG91bGRFeGNsdWRlPy4oZW50cnlSZWxQYXRoLCBjaGlsZElzRGlyKSkge1xuICAgICAgICAgIC8vIFNraXAsIHVubGVzcyBpdCBpcyBhbiBleGNsdWRlZCBkaXJlY3RvcnkgYmVpbmcgZGVzY2VuZGVkIGludG8uXG4gICAgICAgICAgaWYgKCEoY2hpbGRJc0RpciAmJiBkZXNjZW5kSW50b0V4Y2x1ZGVkRGlyZWN0b3JpZXMpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaGFzaFJlY3Vyc2lvbihjaGlsZFBhdGgsIGVudHJ5UmVsUGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaGFzaFJlY3Vyc2lvbihzcmMsIFwiXCIsIHRydWUpO1xuICByZXR1cm4gaGFzaC5kaWdlc3QoXCJoZXhcIik7XG59XG5cbi8qKlxuICogQnVpbGQgYSBwcmVkaWNhdGUgbWF0Y2hpbmcgdGhlIGV4Y2x1c2lvbiBmb3JtcyBhY2NlcHRlZCBieVxuICogYEFzc2V0SGFzaE9wdGlvbnMuZXhjbHVkZWAgKHZpYSBgRXhjbHVkZUlnbm9yZVN0cmF0ZWd5YCk6IGFuIGV4YWN0IHJlbGF0aXZlXG4gKiBwYXRoLCBhIGAqLmV4dGAgc3VmZml4LCBvciBhIGRpcmVjdG9yeSAod2l0aCBvciB3aXRob3V0IGEgdHJhaWxpbmcgYC9gKSxcbiAqIHdoaWNoIGFsc28gZXhjbHVkZXMgaXRzIGNvbnRlbnRzLlxuICogRGVsaWJlcmF0ZWx5IG5vdCBhIGZ1bGwgZ2xvYiBpbXBsZW1lbnRhdGlvbiDigJQgYCoqYCwgYD9gLCBjaGFyYWN0ZXIgY2xhc3NlcyBhbmRcbiAqIGAhYCBuZWdhdGlvbiBhcmUgbm90IHN1cHBvcnRlZCwgYW5kIGEgcGF0dGVybiBpcyBuZXZlciBpbnRlcnByZXRlZCBhc1xuICogYW5jaG9yaW5nIHRvIGEgc3ViZGlyZWN0b3J5IGl0IGRvZXMgbm90IG5hbWUuXG4gKiBUaGUgcmV0dXJuZWQgbWF0Y2hlciBsb29rcyBvbmx5IGF0IHRoZSBwYXRoLCBub3QgYXQgd2hldGhlciB0aGUgZW50cnkgaXMgYVxuICogZGlyZWN0b3J5OiBgZGlyYCBhbmQgYGRpci9gIGJvdGggbWF0Y2ggYSBkaXJlY3RvcnkgbmFtZWQgYGRpcmAgYW5kIGl0c1xuICogY29udGVudHMuIEl0IGlzIHRoZXJlZm9yZSBuYXJyb3dlciB0aGFuIHtAbGluayBFeGNsdWRlUHJlZGljYXRlfSwgd2hpY2ggYWxzb1xuICogcmVjZWl2ZXMgYW4gYGlzRGlyZWN0b3J5YCBmbGFnIGZvciBzdHJhdGVnaWVzIHRoYXQgbmVlZCBpdC5cbiAqIEBwYXJhbSBleGNsdWRlIC0gcGF0dGVybnMgdG8gZXhjbHVkZVxuICogQHJldHVybnMgcHJlZGljYXRlIG92ZXIgYC9gLXNlcGFyYXRlZCBwYXRocyByZWxhdGl2ZSB0byB0aGUgYXNzZXQgcm9vdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhjbHVkZU1hdGNoZXIoXG4gIGV4Y2x1ZGU6IHN0cmluZ1tdLFxuKTogKHJlbGF0aXZlUGF0aDogc3RyaW5nKSA9PiBib29sZWFuIHtcbiAgLy8gYC9gLXNlcGFyYXRlZCB0aHJvdWdob3V0OiByZWxhdGl2ZSBwYXRocyBhcmUgbm9ybWFsaXplZCBiZWZvcmUgbWF0Y2hpbmcsIHNvXG4gIC8vIGBkaXIvY2hpbGRgIHBhdHRlcm5zIHdvcmsgdGhlIHNhbWUgb24gV2luZG93cy5cbiAgY29uc3QgcGF0dGVybnMgPSBleGNsdWRlLm1hcCgocCkgPT4gcC5yZXBsYWNlKC9cXFxcL2csIFwiL1wiKSk7XG4gIHJldHVybiAocmVsYXRpdmVQYXRoOiBzdHJpbmcpID0+IHtcbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcbiAgICAgIGlmIChwYXR0ZXJuLnN0YXJ0c1dpdGgoXCIqLlwiKSAmJiByZWxhdGl2ZVBhdGguZW5kc1dpdGgocGF0dGVybi5zbGljZSgxKSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCBkaXIgPSBwYXR0ZXJuLmVuZHNXaXRoKFwiL1wiKSA/IHBhdHRlcm4uc2xpY2UoMCwgLTEpIDogcGF0dGVybjtcbiAgICAgIGlmIChyZWxhdGl2ZVBhdGggPT09IGRpciB8fCByZWxhdGl2ZVBhdGguc3RhcnRzV2l0aChgJHtkaXJ9L2ApKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG59XG5cbi8qKlxuICogV2FsayB1cHdhcmQgZnJvbSBgcm9vdFBhdGhgIGxvb2tpbmcgZm9yIGEgZmlsZSB3aXRoIHRoZSBnaXZlbiBuYW1lLlxuICogUmV0dXJucyB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlyc3QgbWF0Y2gsIG9yIGBudWxsYCBpZiB0aGUgc2VhcmNoXG4gKiByZWFjaGVzIHRoZSBmaWxlc3lzdGVtIHJvb3Qgd2l0aG91dCBmaW5kaW5nIGl0LlxuICogQHBhcmFtIGZpbGUgLSBmaWxlbmFtZSB0byBzZWFyY2ggZm9yXG4gKiBAcGFyYW0gcm9vdFBhdGggLSBkaXJlY3RvcnkgdG8gc3RhcnQgdGhlIHNlYXJjaCBmcm9tIChkZWZhdWx0cyB0byBjd2QpXG4gKiBAcmV0dXJucyBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlLCBvciBudWxsIGlmIG5vdCBmb3VuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZEZpbGVBYm92ZUN3ZChcbiAgZmlsZTogc3RyaW5nLFxuICByb290UGF0aDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKSxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBmdWxsUGF0aCA9IHBhdGgucmVzb2x2ZShyb290UGF0aCwgZmlsZSk7XG4gIGlmIChmcy5leGlzdHNTeW5jKGZ1bGxQYXRoKSkge1xuICAgIHJldHVybiBmdWxsUGF0aDtcbiAgfVxuXG4gIGNvbnN0IHBhcmVudERpciA9IHBhdGgucmVzb2x2ZShyb290UGF0aCwgXCIuLlwiKTtcbiAgaWYgKGZzLmV4aXN0c1N5bmMocGFyZW50RGlyKSAmJiBwYXJlbnREaXIgIT09IHJvb3RQYXRoKSB7XG4gICAgcmV0dXJuIGZpbmRGaWxlQWJvdmVDd2QoZmlsZSwgcGFyZW50RGlyKTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIl19
package/lib/resource.js CHANGED
@@ -11,7 +11,7 @@ const terraform_stack_1 = require("./terraform-stack");
11
11
  * @deprecated - Please use Construct from the constructs package instead.
12
12
  */
13
13
  class Resource extends constructs_1.Construct {
14
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.Resource", version: "0.25.0-pre.9" };
14
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdktn.Resource", version: "0.25.0" };
15
15
  stack;
16
16
  constructor(scope, id) {
17
17
  super(scope, id);
@@ -47,7 +47,7 @@ const safe_stable_stringify_1 = __importDefault(require("safe-stable-stringify")
47
47
  const annotations_1 = require("../annotations");
48
48
  const constructs_1 = require("constructs");
49
49
  const aspect_1 = require("../aspect");
50
- const validate_terraform_version_1 = require("../validations/validate-terraform-version");
50
+ const target_versions_1 = require("../validations/target-versions");
51
51
  const errors_1 = require("../errors");
52
52
  // eslint-disable-next-line jsdoc/require-jsdoc
53
53
  class StackSynthesizer {
@@ -68,29 +68,16 @@ class StackSynthesizer {
68
68
  synthesize(session) {
69
69
  invokeAspects(this.stack);
70
70
  if (!session.stacksPrepared) {
71
- // This session wasn't built by App.synth() (which already prepared
72
- // every stack up front) - prepare this stack ourselves so
73
- // resolve-discovered provider-feature usage and Terraform-function
74
- // usage are rediscovered for the current pass before validations run
75
- // below. See ISynthesisSession.stacksPrepared.
76
- //
77
- // Terraform-function usage is recorded per-stack (see
78
- // `TerraformStack._usedFunctions`) and `prepareStack()` clears this
79
- // stack's own usage sets itself, as the first step of
80
- // `_runPreparingResolve()`, before rediscovering them. Without this,
81
- // a function rendered by an earlier pass over this same stack (e.g. a
82
- // previous direct call to this same synthesize()) would keep failing
83
- // target-version validation in a later pass even after that usage is
84
- // gone, breaking the per-synthesis-epoch guarantee that App.synth()
85
- // and Testing.synth()/synthHcl() already provide.
71
+ // Sessions not built by App.synth() arrive unprepared: prepare this
72
+ // stack so stale provider-feature and function usage is cleared and
73
+ // rediscovered before validations run (ISynthesisSession.stacksPrepared).
86
74
  this.stack.prepareStack();
87
75
  }
88
76
  if (this.stack.hasResourceMove()) {
89
- // TODO(target-versions): this probes the locally installed binary during
90
- // synth. Migrate to ValidateFeatureTargetSupport (declared cdktf.json
91
- // targetVersions) and leave installed-binary verification to the opt-in
92
- // validateInstalledBinary CLI behavior.
93
- this.stack.node.addValidation(new validate_terraform_version_1.ValidateTerraformVersion(">=1.5", `Resource move functionality is only supported for Terraform >=1.5. Please upgrade your Terraform version.`));
77
+ this.stack.node.addValidation(new target_versions_1.ValidateFeatureTargetSupport(this.stack, "The moved block", {
78
+ terraform: ">=1.5.0",
79
+ opentofu: ">=1.6.0",
80
+ }));
94
81
  }
95
82
  if (!session.skipValidation) {
96
83
  this.stack.runAllValidations();
@@ -203,4 +190,4 @@ function addCustomSynthesis(construct, synthesis) {
203
190
  function getCustomSynthesis(construct) {
204
191
  return construct[CUSTOM_SYNTHESIS_SYM];
205
192
  }
206
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ludGhlc2l6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3ludGhlc2l6ZS9zeW50aGVzaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUErSUEsc0NBeUNDO0FBbUNELGdEQVFDO0FBbk9ELCtCQUErQjtBQUMvQixtQ0FBbUM7QUFDbkMsMkNBQTZCO0FBQzdCLHVDQUF5QjtBQUN6QixrRkFBOEM7QUFHOUMsZ0RBQTBFO0FBQzFFLDJDQUF1RTtBQUN2RSxzQ0FBNkM7QUFFN0MsMEZBQXFGO0FBQ3JGLHNDQUFnRTtBQUVoRSwrQ0FBK0M7QUFDL0MsTUFBYSxnQkFBZ0I7SUFRZjtJQUNGO0lBQ0E7SUFUVjs7Ozs7T0FLRztJQUNILFlBQ1ksS0FBcUIsRUFDdkIsNkJBQTZCLEtBQUssRUFDbEMsWUFBWSxLQUFLO1FBRmYsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFDdkIsK0JBQTBCLEdBQTFCLDBCQUEwQixDQUFRO1FBQ2xDLGNBQVMsR0FBVCxTQUFTLENBQVE7SUFDeEIsQ0FBQztJQUVKLFVBQVUsQ0FBQyxPQUEwQjtRQUNuQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTFCLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDNUIsbUVBQW1FO1lBQ25FLDBEQUEwRDtZQUMxRCxtRUFBbUU7WUFDbkUscUVBQXFFO1lBQ3JFLCtDQUErQztZQUMvQyxFQUFFO1lBQ0Ysc0RBQXNEO1lBQ3RELG9FQUFvRTtZQUNwRSxzREFBc0Q7WUFDdEQscUVBQXFFO1lBQ3JFLHNFQUFzRTtZQUN0RSxxRUFBcUU7WUFDckUscUVBQXFFO1lBQ3JFLG9FQUFvRTtZQUNwRSxrREFBa0Q7WUFDbEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUM1QixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFD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QUFDLFFBQXVCO0lBQ25ELE9BQU8sNEJBQTRCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM5RCxDQUFDO0FBRUQsK0NBQStDO0FBQy9DLFNBQVMsaUJBQWlCLENBQUMsVUFBMkI7SUFDcEQsT0FBTyxVQUFVLENBQUMsS0FBSyxLQUFLLHlDQUEyQixDQUFDLEtBQUssQ0FBQztBQUNoRSxDQUFDO0FBRUQscUpBQXFKO0FBQ3JKLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0FBZWpFLCtDQUErQztBQUMvQyxTQUFnQixrQkFBa0IsQ0FDaEMsU0FBcUIsRUFDckIsU0FBMkI7SUFFM0IsTUFBTSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsb0JBQW9CLEVBQUU7UUFDckQsS0FBSyxFQUFFLFNBQVM7UUFDaEIsVUFBVSxFQUFFLEtBQUs7S0FDbEIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELCtDQUErQztBQUMvQyxTQUFTLGtCQUFrQixDQUN6QixTQUFxQjtJQUVyQixPQUFRLFNBQWlCLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUNsRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IChjKSBIYXNoaUNvcnAsIEluY1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1QTC0yLjBcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHN0cmluZ2lmeSBmcm9tIFwic2FmZS1zdGFibGUtc3RyaW5naWZ5XCI7XG5pbXBvcnQgeyBUZXJyYWZvcm1TdGFjayB9IGZyb20gXCIuLi90ZXJyYWZvcm0tc3RhY2tcIjtcbmltcG9ydCB7IElTdGFja1N5bnRoZXNpemVyLCBJU3ludGhlc2lzU2Vzc2lvbiB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBBbm5vdGF0aW9uTWV0YWRhdGFFbnRyeVR5cGUsIEFubm90YXRpb25zIH0gZnJvbSBcIi4uL2Fubm90YXRpb25zXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3RPcmRlciwgSUNvbnN0cnVjdCwgTWV0YWRhdGFFbnRyeSB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBBc3BlY3RzLCBJQXNwZWN0IH0gZnJvbSBcIi4uL2FzcGVjdFwiO1xuaW1wb3J0IHsgU3RhY2tBbm5vdGF0aW9uIH0gZnJvbSBcIi4uL21hbmlmZXN0XCI7XG5pbXBvcnQgeyBWYWxpZGF0ZVRlcnJhZm9ybVZlcnNpb24gfSBmcm9tIFwiLi4vdmFsaWRhdGlvbnMvdmFsaWRhdGUtdGVycmFmb3JtLXZlcnNpb25cIjtcbmltcG9ydCB7IGVuY291bnRlcmVkQW5ub3RhdGlvbldpdGhMZXZlbEVycm9yIH0gZnJvbSBcIi4uL2Vycm9yc1wiO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZXhwb3J0IGNsYXNzIFN0YWNrU3ludGhlc2l6ZXIgaW1wbGVtZW50cyBJU3RhY2tTeW50aGVzaXplciB7XG4gIC8qKlxuICAgKiBAcGFyYW0gc3RhY2sgdGhlIHN0YWNrIHRvIHN5bnRoZXNpemVcbiAgICogQHBhcmFtIGNvbnRpbnVlT25FcnJvckFubm90YXRpb25zIGlmIHNldCB0byB0cnVlLCBgc3ludGhlc2l6ZSgpYCB3aWxsIG5vdCB0aHJvdyBhbiBlcnJvclxuICAgKiBpZiBpdCBlbmNvdW50ZXJzIGFuIGVycm9yIEFubm90YXRpb24uIEhvd2V2ZXIsIGl0IHdpbGwgc3RpbGwgYWRkIGFsbCBlcnJvcnMgdG8gdGhlIG1hbmlmZXN0XG4gICAqIGZpbGUuIFRoZSBjZGt0bi1jbGkgdXNlcyB0aGlzIGZsYWcgdG8gcHJpbnQgdGhlIGVycm9ycyBpdHNlbGYuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgc3RhY2s6IFRlcnJhZm9ybVN0YWNrLFxuICAgIHByaXZhdGUgY29udGludWVPbkVycm9yQW5ub3RhdGlvbnMgPSBmYWxzZSxcbiAgICBwcml2YXRlIGhjbE91dHB1dCA9IGZhbHNlLFxuICApIHt9XG5cbiAgc3ludGhlc2l6ZShzZXNzaW9uOiBJU3ludGhlc2lzU2Vzc2lvbikge1xuICAgIGludm9rZUFzcGVjdHModGhpcy5zdGFjayk7XG5cbiAgICBpZiAoIXNlc3Npb24uc3RhY2tzUHJlcGFyZWQpIHtcbiAgICAgIC8vIFRoaXMgc2Vzc2lvbiB3YXNuJ3QgYnVpbHQgYnkgQXBwLnN5bnRoKCkgKHdoaWNoIGFscmVhZHkgcHJlcGFyZWRcbiAgICAgIC8vIGV2ZXJ5IHN0YWNrIHVwIGZyb250KSAtIHByZXBhcmUgdGhpcyBzdGFjayBvdXJzZWx2ZXMgc29cbiAgICAgIC8vIHJlc29sdmUtZGlzY292ZXJlZCBwcm92aWRlci1mZWF0dXJlIHVzYWdlIGFuZCBUZXJyYWZvcm0tZnVuY3Rpb25cbiAgICAgIC8vIHVzYWdlIGFyZSByZWRpc2NvdmVyZWQgZm9yIHRoZSBjdXJyZW50IHBhc3MgYmVmb3JlIHZhbGlkYXRpb25zIHJ1blxuICAgICAgLy8gYmVsb3cuIFNlZSBJU3ludGhlc2lzU2Vzc2lvbi5zdGFja3NQcmVwYXJlZC5cbiAgICAgIC8vXG4gICAgICAvLyBUZXJyYWZvcm0tZnVuY3Rpb24gdXNhZ2UgaXMgcmVjb3JkZWQgcGVyLXN0YWNrIChzZWVcbiAgICAgIC8vIGBUZXJyYWZvcm1TdGFjay5fdXNlZEZ1bmN0aW9uc2ApIGFuZCBgcHJlcGFyZVN0YWNrKClgIGNsZWFycyB0aGlzXG4gICAgICAvLyBzdGFjaydzIG93biB1c2FnZSBzZXRzIGl0c2VsZiwgYXMgdGhlIGZpcnN0IHN0ZXAgb2ZcbiAgICAgIC8vIGBfcnVuUHJlcGFyaW5nUmVzb2x2ZSgpYCwgYmVmb3JlIHJlZGlzY292ZXJpbmcgdGhlbS4gV2l0aG91dCB0aGlzLFxuICAgICAgLy8gYSBmdW5jdGlvbiByZW5kZXJlZCBieSBhbiBlYXJsaWVyIHBhc3Mgb3ZlciB0aGlzIHNhbWUgc3RhY2sgKGUuZy4gYVxuICAgICAgLy8gcHJldmlvdXMgZGlyZWN0IGNhbGwgdG8gdGhpcyBzYW1lIHN5bnRoZXNpemUoKSkgd291bGQga2VlcCBmYWlsaW5nXG4gICAgICAvLyB0YXJnZXQtdmVyc2lvbiB2YWxpZGF0aW9uIGluIGEgbGF0ZXIgcGFzcyBldmVuIGFmdGVyIHRoYXQgdXNhZ2UgaXNcbiAgICAgIC8vIGdvbmUsIGJyZWFraW5nIHRoZSBwZXItc3ludGhlc2lzLWVwb2NoIGd1YXJhbnRlZSB0aGF0IEFwcC5zeW50aCgpXG4gICAgICAvLyBhbmQgVGVzdGluZy5zeW50aCgpL3N5bnRoSGNsKCkgYWxyZWFkeSBwcm92aWRlLlxuICAgICAgdGhpcy5zdGFjay5wcmVwYXJlU3RhY2soKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGFjay5oYXNSZXNvdXJjZU1vdmUoKSkge1xuICAgICAgLy8gVE9ETyh0YXJnZXQtdmVyc2lvbnMpOiB0aGlzIHByb2JlcyB0aGUgbG9jYWxseSBpbnN0YWxsZWQgYmluYXJ5IGR1cmluZ1xuICAgICAgLy8gc3ludGguIE1pZ3JhdGUgdG8gVmFsaWRhdGVGZWF0dXJlVGFyZ2V0U3VwcG9ydCAoZGVjbGFyZWQgY2RrdGYuanNvblxuICAgICAgLy8gdGFyZ2V0VmVyc2lvbnMpIGFuZCBsZWF2ZSBpbnN0YWxsZWQtYmluYXJ5IHZlcmlmaWNhdGlvbiB0byB0aGUgb3B0LWluXG4gICAgICAvLyB2YWxpZGF0ZUluc3RhbGxlZEJpbmFyeSBDTEkgYmVoYXZpb3IuXG4gICAgICB0aGlzLnN0YWNrLm5vZGUuYWRkVmFsaWRhdGlvbihcbiAgICAgICAgbmV3IFZhbGlkYXRlVGVycmFmb3JtVmVyc2lvbihcbiAgICAgICAgICBcIj49MS41XCIsXG4gICAgICAgICAgYFJlc291cmNlIG1vdmUgZnVuY3Rpb25hbGl0eSBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgVGVycmFmb3JtID49MS41LiBQbGVhc2UgdXBncmFkZSB5b3VyIFRlcnJhZm9ybSB2ZXJzaW9uLmAsXG4gICAgICAgICksXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghc2Vzc2lvbi5za2lwVmFsaWRhdGlvbikge1xuICAgICAgdGhpcy5zdGFjay5ydW5BbGxWYWxpZGF0aW9ucygpO1xuICAgIH1cblxuICAgIGNvbnN0IG1hbmlmZXN0ID0gc2Vzc2lvbi5tYW5pZmVzdDtcbiAgICBjb25zdCBzdGFja01hbmlmZXN0ID0gbWFuaWZlc3QuZm9yU3RhY2sodGhpcy5zdGFjayk7XG5cbiAgICBjb25zdCB3b3JraW5nRGlyZWN0b3J5ID0gcGF0aC5qb2luKFxuICAgICAgc2Vzc2lvbi5vdXRkaXIsXG4gICAgICBzdGFja01hbmlmZXN0LndvcmtpbmdEaXJlY3RvcnksXG4gICAgKTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMod29ya2luZ0RpcmVjdG9yeSkpIGZzLm1rZGlyU3luYyh3b3JraW5nRGlyZWN0b3J5KTtcblxuICAgIC8vIGNhbGwgY3VzdG9tIHN5bnRoZXNpcyBvbiBjaGlsZCBub2RlcyAobGVhZnMgZmlyc3QpXG4gICAgdGhpcy5zdGFjay5ub2RlXG4gICAgICAuZmluZEFsbChDb25zdHJ1Y3RPcmRlci5QT1NUT1JERVIpXG4gICAgICAuZm9yRWFjaCgobm9kZSkgPT4gZ2V0Q3VzdG9tU3ludGhlc2lzKG5vZGUpPy5vblN5bnRoZXNpemUoc2Vzc2lvbikpO1xuXG4gICAgLy8gY29sbGVjdCBBbm5vdGF0aW9ucyBpbnRvIE1hbmlmZXN0XG4gICAgY29uc3QgYW5ub3RhdGlvbnMgPSB0aGlzLnN0YWNrLm5vZGVcbiAgICAgIC5maW5kQWxsKClcbiAgICAgIC5tYXAoKG5vZGUpID0+ICh7XG4gICAgICAgIG5vZGUsXG4gICAgICAgIG1ldGFkYXRhczogbm9kZS5ub2RlLm1ldGFkYXRhLmZpbHRlcihpc0Fubm90YXRpb25NZXRhZGF0YSksXG4gICAgICB9KSlcbiAgICAgIC5tYXA8U3RhY2tBbm5vdGF0aW9uW10+KCh7IG5vZGUsIG1ldGFkYXRhcyB9KSA9PlxuICAgICAgICBtZXRhZGF0YXMubWFwKChtZXRhZGF0YSkgPT4gKHtcbiAgICAgICAgICBjb25zdHJ1Y3RQYXRoOiBub2RlLm5vZGUucGF0aCxcbiAgICAgICAgICBsZXZlbDogbWV0YWRhdGEudHlwZSBhcyBBbm5vdGF0aW9uTWV0YWRhdGFFbnRyeVR5cGUsXG4gICAgICAgICAgbWVzc2FnZTogbWV0YWRhdGEuZGF0YSxcbiAgICAgICAgICBzdGFja3RyYWNlOiBtZXRhZGF0YS50cmFjZSxcbiAgICAgICAgfSkpLFxuICAgICAgKVxuICAgICAgLnJlZHVjZSgobGlzdCwgbWV0YWRhdGFzKSA9PiBbLi4ubGlzdCwgLi4ubWV0YWRhdGFzXSwgW10pOyAvLyBBcnJheS5mbGF0KClcblxuICAgIC8vIGl0IGlzIHJlYWRvbmx5IGJ1dCB0aGlzIGlzIHRoZSBwbGFjZSB3aGVyZSB3ZSBhcmUgYWxsb3dlZCB0byB3cml0ZSB0byBpdFxuICAgIChzdGFja01hbmlmZXN0LmFubm90YXRpb25zIGFzIGFueSkgPSBhbm5vdGF0aW9ucztcblxuICAgIC8vIGFib3J0IGlmIG9uZSBvciBtb3JlIGVycm9yIGFubm90YXRpb25zIGhhdmUgYmVlbiBlbmNvdW50ZXJlZFxuICAgIGlmIChcbiAgICAgICF0aGlzLmNvbnRpbnVlT25FcnJvckFubm90YXRpb25zICYmXG4gICAgICBhbm5vdGF0aW9ucy5zb21lKGlzRXJyb3JBbm5vdGF0aW9uKVxuICAgICkge1xuICAgICAgdGhyb3cgZW5jb3VudGVyZWRBbm5vdGF0aW9uV2l0aExldmVsRXJyb3IoXG4gICAgICAgIGFubm90YXRpb25zXG4gICAgICAgICAgLmZpbHRlcihpc0Vycm9yQW5ub3RhdGlvbilcbiAgICAgICAgICAubWFwKChhKSA9PiBgWyR7YS5jb25zdHJ1Y3RQYXRofV0gJHthLm1lc3NhZ2V9YClcbiAgICAgICAgICAuam9pbihcIlxcblwiKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGNsT3V0cHV0KSB7XG4gICAgICBjb25zdCBoY2wgPSB0aGlzLnN0YWNrLnRvSGNsVGVycmFmb3JtKCk7XG4gICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICBwYXRoLmpvaW4oc2Vzc2lvbi5vdXRkaXIsIHN0YWNrTWFuaWZlc3Quc3ludGhlc2l6ZWRTdGFja1BhdGgpLFxuICAgICAgICBoY2wuaGNsLFxuICAgICAgKTtcblxuICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgcGF0aC5qb2luKHNlc3Npb24ub3V0ZGlyLCBzdGFja01hbmlmZXN0LnN0YWNrTWV0YWRhdGFQYXRoISksXG4gICAgICAgIHN0cmluZ2lmeShoY2wubWV0YWRhdGEsIG51bGwsIDIpIGFzIHN0cmluZyxcbiAgICAgICk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBqc29uVGZDb25maWcgPSB0aGlzLnN0YWNrLnRvVGVycmFmb3JtKCk7XG5cbiAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgcGF0aC5qb2luKHNlc3Npb24ub3V0ZGlyLCBzdGFja01hbmlmZXN0LnN5bnRoZXNpemVkU3RhY2tQYXRoKSxcbiAgICAgIHN0cmluZ2lmeShqc29uVGZDb25maWcsIG51bGwsIDIpIGFzIHN0cmluZyxcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogSW52b2tlIGFzcGVjdHMgb24gdGhlIGdpdmVuIGNvbnN0cnVjdCB0cmVlLlxuICpcbiAqIG9yaWdpbmFsbHkgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi9kY2FlM2VlYWQwZGJmOWFjYjFlZDgwYmE5NWJiMTA0YzY0Y2IxYmQ3L3BhY2thZ2VzL0Bhd3MtY2RrL2NvcmUvbGliL3ByaXZhdGUvc3ludGhlc2lzLnRzI0w5OS1MMTM3XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZva2VBc3BlY3RzKHJvb3Q6IElDb25zdHJ1Y3QpIHtcbiAgY29uc3QgaW52b2tlZEJ5UGF0aDogeyBbbm9kZVBhdGg6IHN0cmluZ106IElBc3BlY3RbXSB9ID0ge307XG5cbiAgbGV0IG5lc3RlZEFzcGVjdFdhcm5pbmcgPSBmYWxzZTtcbiAgcmVjdXJzZShyb290LCBbXSk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbiAgZnVuY3Rpb24gcmVjdXJzZShjb25zdHJ1Y3Q6IElDb25zdHJ1Y3QsIGluaGVyaXRlZEFzcGVjdHM6IElBc3BlY3RbXSkge1xuICAgIGNvbnN0IG5vZGUgPSBjb25zdHJ1Y3Qubm9kZTtcbiAgICBjb25zdCBhc3BlY3RzID0gQXNwZWN0cy5vZihjb25zdHJ1Y3QpO1xuICAgIGNvbnN0IGFsbEFzcGVjdHNIZXJlID0gWy4uLihpbmhlcml0ZWRBc3BlY3RzID8/IFtdKSwgLi4uYXNwZWN0cy5hbGxdO1xuICAgIGNvbnN0IG5vZGVBc3BlY3RzQ291bnQgPSBhc3BlY3RzLmFsbC5sZW5ndGg7XG4gICAgZm9yIChjb25zdCBhc3BlY3Qgb2YgYWxsQXNwZWN0c0hlcmUpIHtcbiAgICAgIGxldCBpbnZva2VkID0gaW52b2tlZEJ5UGF0aFtub2RlLnBhdGhdO1xuICAgICAgaWYgKCFpbnZva2VkKSB7XG4gICAgICAgIGludm9rZWQgPSBpbnZva2VkQnlQYXRoW25vZGUucGF0aF0gPSBbXTtcbiAgICAgIH1cblxuICAgICAgaWYgKGludm9rZWQuaW5jbHVkZXMoYXNwZWN0KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgYXNwZWN0LnZpc2l0KGNvbnN0cnVjdCk7XG5cbiAgICAgIC8vIGlmIGFuIGFzcGVjdCB3YXMgYWRkZWQgdG8gdGhlIG5vZGUgd2hpbGUgaW52b2tpbmcgYW5vdGhlciBhc3BlY3QgaXQgd2lsbCBub3QgYmUgaW52b2tlZCwgZW1pdCBhIHdhcm5pbmdcbiAgICAgIC8vIHRoZSBgbmVzdGVkQXNwZWN0V2FybmluZ2AgZmxhZyBpcyB1c2VkIHRvIHByZXZlbnQgdGhlIHdhcm5pbmcgZnJvbSBiZWluZyBlbWl0dGVkIGZvciBldmVyeSBjaGlsZFxuICAgICAgaWYgKCFuZXN0ZWRBc3BlY3RXYXJuaW5nICYmIG5vZGVBc3BlY3RzQ291bnQgIT09IGFzcGVjdHMuYWxsLmxlbmd0aCkge1xuICAgICAgICBBbm5vdGF0aW9ucy5vZihjb25zdHJ1Y3QpLmFkZFdhcm5pbmcoXG4gICAgICAgICAgXCJXZSBkZXRlY3RlZCBhbiBBc3BlY3Qgd2FzIGFkZGVkIHZpYSBhbm90aGVyIEFzcGVjdCwgYW5kIHdpbGwgbm90IGJlIGFwcGxpZWRcIixcbiAgICAgICAgKTtcbiAgICAgICAgbmVzdGVkQXNwZWN0V2FybmluZyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIG1hcmsgYXMgaW52b2tlZCBmb3IgdGhpcyBub2RlXG4gICAgICBpbnZva2VkLnB1c2goYXNwZWN0KTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIGNvbnN0cnVjdC5ub2RlLmNoaWxkcmVuKSB7XG4gICAgICByZWN1cnNlKGNoaWxkLCBhbGxBc3BlY3RzSGVyZSk7XG4gICAgfVxuICB9XG59XG5cbmNvbnN0IGFubm90YXRpb25NZXRhZGF0YUVudHJ5VHlwZXMgPSBbXG4gIEFubm90YXRpb25NZXRhZGF0YUVudHJ5VHlwZS5JTkZPLFxuICBBbm5vdGF0aW9uTWV0YWRhdGFFbnRyeVR5cGUuV0FSTixcbiAgQW5ub3RhdGlvbk1ldGFkYXRhRW50cnlUeXBlLkVSUk9SLFxuXSBhcyBzdHJpbmdbXTtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbmZ1bmN0aW9uIGlzQW5ub3RhdGlvbk1ldGFkYXRhKG1ldGFkYXRhOiBNZXRhZGF0YUVudHJ5KTogYm9vbGVhbiB7XG4gIHJldHVybiBhbm5vdGF0aW9uTWV0YWRhdGFFbnRyeVR5cGVzLmluY2x1ZGVzKG1ldGFkYXRhLnR5cGUpO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZnVuY3Rpb24gaXNFcnJvckFubm90YXRpb24oYW5ub3RhdGlvbjogU3RhY2tBbm5vdGF0aW9uKTogYm9vbGVhbiB7XG4gIHJldHVybiBhbm5vdGF0aW9uLmxldmVsID09PSBBbm5vdGF0aW9uTWV0YWRhdGFFbnRyeVR5cGUuRVJST1I7XG59XG5cbi8vIG9yaWdpbmFsbHkgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvYmxvYi9kY2FlM2VlYWQwZGJmOWFjYjFlZDgwYmE5NWJiMTA0YzY0Y2IxYmQ3L3BhY2thZ2VzLyU0MGF3cy1jZGsvY29yZS9saWIvcHJpdmF0ZS9zeW50aGVzaXMudHMjTDUyXG5jb25zdCBDVVNUT01fU1lOVEhFU0lTX1NZTSA9IFN5bWJvbC5mb3IoXCJjZGt0Zi9jdXN0b21TeW50aGVzaXNcIik7XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBjb25zdHJ1Y3RzIHRoYXQgd2FudCB0byBkbyBzb21ldGhpbmcgY3VzdG9tIGR1cmluZyBzeW50aGVzaXNcbiAqXG4gKiBUaGlzIGZlYXR1cmUgaXMgaW50ZW5kZWQgZm9yIHVzZSBieSB0aGUgQ0RLVE4gb25seTsgM3JkIHBhcnR5XG4gKiBsaWJyYXJ5IGF1dGhvcnMgYW5kIENESyB1c2VycyBzaG91bGQgbm90IHVzZSB0aGlzIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElDdXN0b21TeW50aGVzaXMge1xuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGNvbnN0cnVjdCBpcyBzeW50aGVzaXplZFxuICAgKi9cbiAgb25TeW50aGVzaXplKHNlc3Npb246IElTeW50aGVzaXNTZXNzaW9uKTogdm9pZDtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbmV4cG9ydCBmdW5jdGlvbiBhZGRDdXN0b21TeW50aGVzaXMoXG4gIGNvbnN0cnVjdDogSUNvbnN0cnVjdCxcbiAgc3ludGhlc2lzOiBJQ3VzdG9tU3ludGhlc2lzLFxuKTogdm9pZCB7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb25zdHJ1Y3QsIENVU1RPTV9TWU5USEVTSVNfU1lNLCB7XG4gICAgdmFsdWU6IHN5bnRoZXNpcyxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgfSk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5mdW5jdGlvbiBnZXRDdXN0b21TeW50aGVzaXMoXG4gIGNvbnN0cnVjdDogSUNvbnN0cnVjdCxcbik6IElDdXN0b21TeW50aGVzaXMgfCB1bmRlZmluZWQge1xuICByZXR1cm4gKGNvbnN0cnVjdCBhcyBhbnkpW0NVU1RPTV9TWU5USEVTSVNfU1lNXTtcbn1cbiJdfQ==
193
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ludGhlc2l6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3ludGhlc2l6ZS9zeW50aGVzaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUErSEEsc0NBeUNDO0FBbUNELGdEQVFDO0FBbk5ELCtCQUErQjtBQUMvQixtQ0FBbUM7QUFDbkMsMkNBQTZCO0FBQzdCLHVDQUF5QjtBQUN6QixrRkFBOEM7QUFHOUMsZ0RBQTBFO0FBQzFFLDJDQUF1RTtBQUN2RSxzQ0FBNkM7QUFFN0Msb0VBQThFO0FBQzlFLHNDQUFnRTtBQUVoRSwrQ0FBK0M7QUFDL0MsTUFBYSxnQkFBZ0I7SUFRZjtJQUNGO0lBQ0E7SUFUVjs7Ozs7T0FLRztJQUNILFlBQ1ksS0FBcUIsRUFDdkIsNkJBQTZCLEtBQUssRUFDbEMsWUFBWSxLQUFLO1FBRmYsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFDdkIsK0JBQTBCLEdBQTFCLDBCQUEwQixDQUFRO1FBQ2xDLGNBQVMsR0FBVCxTQUFTLENBQVE7SUFDeEIsQ0FBQztJQUVKLFVBQVUsQ0FBQyxPQUEwQjtRQUNuQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTFCLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDNUIsb0VBQW9FO1lBQ3BFLG9FQUFvRTtZQUNwRSwwRUFBMEU7WUFDMUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUM1QixDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUM7WUFDakMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUMzQixJQUFJLDhDQUE0QixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLEVBQUU7Z0JBQzlELFNBQVMsRUFBRSxTQUFTO2dCQUNwQixRQUFRLEVB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QUFLLEtBQUsseUNBQTJCLENBQUMsS0FBSyxDQUFDO0FBQ2hFLENBQUM7QUFFRCxxSkFBcUo7QUFDckosTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLENBQUM7QUFlakUsK0NBQStDO0FBQy9DLFNBQWdCLGtCQUFrQixDQUNoQyxTQUFxQixFQUNyQixTQUEyQjtJQUUzQixNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxvQkFBb0IsRUFBRTtRQUNyRCxLQUFLLEVBQUUsU0FBUztRQUNoQixVQUFVLEVBQUUsS0FBSztLQUNsQixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsK0NBQStDO0FBQy9DLFNBQVMsa0JBQWtCLENBQ3pCLFNBQXFCO0lBRXJCLE9BQVEsU0FBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBQ2xELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgKGMpIEhhc2hpQ29ycCwgSW5jXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTVBMLTIuMFxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgc3RyaW5naWZ5IGZyb20gXCJzYWZlLXN0YWJsZS1zdHJpbmdpZnlcIjtcbmltcG9ydCB7IFRlcnJhZm9ybVN0YWNrIH0gZnJvbSBcIi4uL3RlcnJhZm9ybS1zdGFja1wiO1xuaW1wb3J0IHsgSVN0YWNrU3ludGhlc2l6ZXIsIElTeW50aGVzaXNTZXNzaW9uIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IEFubm90YXRpb25NZXRhZGF0YUVudHJ5VHlwZSwgQW5ub3RhdGlvbnMgfSBmcm9tIFwiLi4vYW5ub3RhdGlvbnNcIjtcbmltcG9ydCB7IENvbnN0cnVjdE9yZGVyLCBJQ29uc3RydWN0LCBNZXRhZGF0YUVudHJ5IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IEFzcGVjdHMsIElBc3BlY3QgfSBmcm9tIFwiLi4vYXNwZWN0XCI7XG5pbXBvcnQgeyBTdGFja0Fubm90YXRpb24gfSBmcm9tIFwiLi4vbWFuaWZlc3RcIjtcbmltcG9ydCB7IFZhbGlkYXRlRmVhdHVyZVRhcmdldFN1cHBvcnQgfSBmcm9tIFwiLi4vdmFsaWRhdGlvbnMvdGFyZ2V0LXZlcnNpb25zXCI7XG5pbXBvcnQgeyBlbmNvdW50ZXJlZEFubm90YXRpb25XaXRoTGV2ZWxFcnJvciB9IGZyb20gXCIuLi9lcnJvcnNcIjtcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbmV4cG9ydCBjbGFzcyBTdGFja1N5bnRoZXNpemVyIGltcGxlbWVudHMgSVN0YWNrU3ludGhlc2l6ZXIge1xuICAvKipcbiAgICogQHBhcmFtIHN0YWNrIHRoZSBzdGFjayB0byBzeW50aGVzaXplXG4gICAqIEBwYXJhbSBjb250aW51ZU9uRXJyb3JBbm5vdGF0aW9ucyBpZiBzZXQgdG8gdHJ1ZSwgYHN5bnRoZXNpemUoKWAgd2lsbCBub3QgdGhyb3cgYW4gZXJyb3JcbiAgICogaWYgaXQgZW5jb3VudGVycyBhbiBlcnJvciBBbm5vdGF0aW9uLiBIb3dldmVyLCBpdCB3aWxsIHN0aWxsIGFkZCBhbGwgZXJyb3JzIHRvIHRoZSBtYW5pZmVzdFxuICAgKiBmaWxlLiBUaGUgY2RrdG4tY2xpIHVzZXMgdGhpcyBmbGFnIHRvIHByaW50IHRoZSBlcnJvcnMgaXRzZWxmLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHN0YWNrOiBUZXJyYWZvcm1TdGFjayxcbiAgICBwcml2YXRlIGNvbnRpbnVlT25FcnJvckFubm90YXRpb25zID0gZmFsc2UsXG4gICAgcHJpdmF0ZSBoY2xPdXRwdXQgPSBmYWxzZSxcbiAgKSB7fVxuXG4gIHN5bnRoZXNpemUoc2Vzc2lvbjogSVN5bnRoZXNpc1Nlc3Npb24pIHtcbiAgICBpbnZva2VBc3BlY3RzKHRoaXMuc3RhY2spO1xuXG4gICAgaWYgKCFzZXNzaW9uLnN0YWNrc1ByZXBhcmVkKSB7XG4gICAgICAvLyBTZXNzaW9ucyBub3QgYnVpbHQgYnkgQXBwLnN5bnRoKCkgYXJyaXZlIHVucHJlcGFyZWQ6IHByZXBhcmUgdGhpc1xuICAgICAgLy8gc3RhY2sgc28gc3RhbGUgcHJvdmlkZXItZmVhdHVyZSBhbmQgZnVuY3Rpb24gdXNhZ2UgaXMgY2xlYXJlZCBhbmRcbiAgICAgIC8vIHJlZGlzY292ZXJlZCBiZWZvcmUgdmFsaWRhdGlvbnMgcnVuIChJU3ludGhlc2lzU2Vzc2lvbi5zdGFja3NQcmVwYXJlZCkuXG4gICAgICB0aGlzLnN0YWNrLnByZXBhcmVTdGFjaygpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnN0YWNrLmhhc1Jlc291cmNlTW92ZSgpKSB7XG4gICAgICB0aGlzLnN0YWNrLm5vZGUuYWRkVmFsaWRhdGlvbihcbiAgICAgICAgbmV3IFZhbGlkYXRlRmVhdHVyZVRhcmdldFN1cHBvcnQodGhpcy5zdGFjaywgXCJUaGUgbW92ZWQgYmxvY2tcIiwge1xuICAgICAgICAgIHRlcnJhZm9ybTogXCI+PTEuNS4wXCIsXG4gICAgICAgICAgb3BlbnRvZnU6IFwiPj0xLjYuMFwiLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFzZXNzaW9uLnNraXBWYWxpZGF0aW9uKSB7XG4gICAgICB0aGlzLnN0YWNrLnJ1bkFsbFZhbGlkYXRpb25zKCk7XG4gICAgfVxuXG4gICAgY29uc3QgbWFuaWZlc3QgPSBzZXNzaW9uLm1hbmlmZXN0O1xuICAgIGNvbnN0IHN0YWNrTWFuaWZlc3QgPSBtYW5pZmVzdC5mb3JTdGFjayh0aGlzLnN0YWNrKTtcblxuICAgIGNvbnN0IHdvcmtpbmdEaXJlY3RvcnkgPSBwYXRoLmpvaW4oXG4gICAgICBzZXNzaW9uLm91dGRpcixcbiAgICAgIHN0YWNrTWFuaWZlc3Qud29ya2luZ0RpcmVjdG9yeSxcbiAgICApO1xuICAgIGlmICghZnMuZXhpc3RzU3luYyh3b3JraW5nRGlyZWN0b3J5KSkgZnMubWtkaXJTeW5jKHdvcmtpbmdEaXJlY3RvcnkpO1xuXG4gICAgLy8gY2FsbCBjdXN0b20gc3ludGhlc2lzIG9uIGNoaWxkIG5vZGVzIChsZWFmcyBmaXJzdClcbiAgICB0aGlzLnN0YWNrLm5vZGVcbiAgICAgIC5maW5kQWxsKENvbnN0cnVjdE9yZGVyLlBPU1RPUkRFUilcbiAgICAgIC5mb3JFYWNoKChub2RlKSA9PiBnZXRDdXN0b21TeW50aGVzaXMobm9kZSk/Lm9uU3ludGhlc2l6ZShzZXNzaW9uKSk7XG5cbiAgICAvLyBjb2xsZWN0IEFubm90YXRpb25zIGludG8gTWFuaWZlc3RcbiAgICBjb25zdCBhbm5vdGF0aW9ucyA9IHRoaXMuc3RhY2subm9kZVxuICAgICAgLmZpbmRBbGwoKVxuICAgICAgLm1hcCgobm9kZSkgPT4gKHtcbiAgICAgICAgbm9kZSxcbiAgICAgICAgbWV0YWRhdGFzOiBub2RlLm5vZGUubWV0YWRhdGEuZmlsdGVyKGlzQW5ub3RhdGlvbk1ldGFkYXRhKSxcbiAgICAgIH0pKVxuICAgICAgLm1hcDxTdGFja0Fubm90YXRpb25bXT4oKHsgbm9kZSwgbWV0YWRhdGFzIH0pID0+XG4gICAgICAgIG1ldGFkYXRhcy5tYXAoKG1ldGFkYXRhKSA9PiAoe1xuICAgICAgICAgIGNvbnN0cnVjdFBhdGg6IG5vZGUubm9kZS5wYXRoLFxuICAgICAgICAgIGxldmVsOiBtZXRhZGF0YS50eXBlIGFzIEFubm90YXRpb25NZXRhZGF0YUVudHJ5VHlwZSxcbiAgICAgICAgICBtZXNzYWdlOiBtZXRhZGF0YS5kYXRhLFxuICAgICAgICAgIHN0YWNrdHJhY2U6IG1ldGFkYXRhLnRyYWNlLFxuICAgICAgICB9KSksXG4gICAgICApXG4gICAgICAucmVkdWNlKChsaXN0LCBtZXRhZGF0YXMpID0+IFsuLi5saXN0LCAuLi5tZXRhZGF0YXNdLCBbXSk7IC8vIEFycmF5LmZsYXQoKVxuXG4gICAgLy8gaXQgaXMgcmVhZG9ubHkgYnV0IHRoaXMgaXMgdGhlIHBsYWNlIHdoZXJlIHdlIGFyZSBhbGxvd2VkIHRvIHdyaXRlIHRvIGl0XG4gICAgKHN0YWNrTWFuaWZlc3QuYW5ub3RhdGlvbnMgYXMgYW55KSA9IGFubm90YXRpb25zO1xuXG4gICAgLy8gYWJvcnQgaWYgb25lIG9yIG1vcmUgZXJyb3IgYW5ub3RhdGlvbnMgaGF2ZSBiZWVuIGVuY291bnRlcmVkXG4gICAgaWYgKFxuICAgICAgIXRoaXMuY29udGludWVPbkVycm9yQW5ub3RhdGlvbnMgJiZcbiAgICAgIGFubm90YXRpb25zLnNvbWUoaXNFcnJvckFubm90YXRpb24pXG4gICAgKSB7XG4gICAgICB0aHJvdyBlbmNvdW50ZXJlZEFubm90YXRpb25XaXRoTGV2ZWxFcnJvcihcbiAgICAgICAgYW5ub3RhdGlvbnNcbiAgICAgICAgICAuZmlsdGVyKGlzRXJyb3JBbm5vdGF0aW9uKVxuICAgICAgICAgIC5tYXAoKGEpID0+IGBbJHthLmNvbnN0cnVjdFBhdGh9XSAke2EubWVzc2FnZX1gKVxuICAgICAgICAgIC5qb2luKFwiXFxuXCIpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oY2xPdXRwdXQpIHtcbiAgICAgIGNvbnN0IGhjbCA9IHRoaXMuc3RhY2sudG9IY2xUZXJyYWZvcm0oKTtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgIHBhdGguam9pbihzZXNzaW9uLm91dGRpciwgc3RhY2tNYW5pZmVzdC5zeW50aGVzaXplZFN0YWNrUGF0aCksXG4gICAgICAgIGhjbC5oY2wsXG4gICAgICApO1xuXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICBwYXRoLmpvaW4oc2Vzc2lvbi5vdXRkaXIsIHN0YWNrTWFuaWZlc3Quc3RhY2tNZXRhZGF0YVBhdGghKSxcbiAgICAgICAgc3RyaW5naWZ5KGhjbC5tZXRhZGF0YSwgbnVsbCwgMikgYXMgc3RyaW5nLFxuICAgICAgKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGpzb25UZkNvbmZpZyA9IHRoaXMuc3RhY2sudG9UZXJyYWZvcm0oKTtcblxuICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICBwYXRoLmpvaW4oc2Vzc2lvbi5vdXRkaXIsIHN0YWNrTWFuaWZlc3Quc3ludGhlc2l6ZWRTdGFja1BhdGgpLFxuICAgICAgc3RyaW5naWZ5KGpzb25UZkNvbmZpZywgbnVsbCwgMikgYXMgc3RyaW5nLFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBJbnZva2UgYXNwZWN0cyBvbiB0aGUgZ2l2ZW4gY29uc3RydWN0IHRyZWUuXG4gKlxuICogb3JpZ2luYWxseSBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL2RjYWUzZWVhZDBkYmY5YWNiMWVkODBiYTk1YmIxMDRjNjRjYjFiZDcvcGFja2FnZXMvQGF3cy1jZGsvY29yZS9saWIvcHJpdmF0ZS9zeW50aGVzaXMudHMjTDk5LUwxMzdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludm9rZUFzcGVjdHMocm9vdDogSUNvbnN0cnVjdCkge1xuICBjb25zdCBpbnZva2VkQnlQYXRoOiB7IFtub2RlUGF0aDogc3RyaW5nXTogSUFzcGVjdFtdIH0gPSB7fTtcblxuICBsZXQgbmVzdGVkQXNwZWN0V2FybmluZyA9IGZhbHNlO1xuICByZWN1cnNlKHJvb3QsIFtdKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuICBmdW5jdGlvbiByZWN1cnNlKGNvbnN0cnVjdDogSUNvbnN0cnVjdCwgaW5oZXJpdGVkQXNwZWN0czogSUFzcGVjdFtdKSB7XG4gICAgY29uc3Qgbm9kZSA9IGNvbnN0cnVjdC5ub2RlO1xuICAgIGNvbnN0IGFzcGVjdHMgPSBBc3BlY3RzLm9mKGNvbnN0cnVjdCk7XG4gICAgY29uc3QgYWxsQXNwZWN0c0hlcmUgPSBbLi4uKGluaGVyaXRlZEFzcGVjdHMgPz8gW10pLCAuLi5hc3BlY3RzLmFsbF07XG4gICAgY29uc3Qgbm9kZUFzcGVjdHNDb3VudCA9IGFzcGVjdHMuYWxsLmxlbmd0aDtcbiAgICBmb3IgKGNvbnN0IGFzcGVjdCBvZiBhbGxBc3BlY3RzSGVyZSkge1xuICAgICAgbGV0IGludm9rZWQgPSBpbnZva2VkQnlQYXRoW25vZGUucGF0aF07XG4gICAgICBpZiAoIWludm9rZWQpIHtcbiAgICAgICAgaW52b2tlZCA9IGludm9rZWRCeVBhdGhbbm9kZS5wYXRoXSA9IFtdO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW52b2tlZC5pbmNsdWRlcyhhc3BlY3QpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBhc3BlY3QudmlzaXQoY29uc3RydWN0KTtcblxuICAgICAgLy8gaWYgYW4gYXNwZWN0IHdhcyBhZGRlZCB0byB0aGUgbm9kZSB3aGlsZSBpbnZva2luZyBhbm90aGVyIGFzcGVjdCBpdCB3aWxsIG5vdCBiZSBpbnZva2VkLCBlbWl0IGEgd2FybmluZ1xuICAgICAgLy8gdGhlIGBuZXN0ZWRBc3BlY3RXYXJuaW5nYCBmbGFnIGlzIHVzZWQgdG8gcHJldmVudCB0aGUgd2FybmluZyBmcm9tIGJlaW5nIGVtaXR0ZWQgZm9yIGV2ZXJ5IGNoaWxkXG4gICAgICBpZiAoIW5lc3RlZEFzcGVjdFdhcm5pbmcgJiYgbm9kZUFzcGVjdHNDb3VudCAhPT0gYXNwZWN0cy5hbGwubGVuZ3RoKSB7XG4gICAgICAgIEFubm90YXRpb25zLm9mKGNvbnN0cnVjdCkuYWRkV2FybmluZyhcbiAgICAgICAgICBcIldlIGRldGVjdGVkIGFuIEFzcGVjdCB3YXMgYWRkZWQgdmlhIGFub3RoZXIgQXNwZWN0LCBhbmQgd2lsbCBub3QgYmUgYXBwbGllZFwiLFxuICAgICAgICApO1xuICAgICAgICBuZXN0ZWRBc3BlY3RXYXJuaW5nID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gbWFyayBhcyBpbnZva2VkIGZvciB0aGlzIG5vZGVcbiAgICAgIGludm9rZWQucHVzaChhc3BlY3QpO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY29uc3RydWN0Lm5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIHJlY3Vyc2UoY2hpbGQsIGFsbEFzcGVjdHNIZXJlKTtcbiAgICB9XG4gIH1cbn1cblxuY29uc3QgYW5ub3RhdGlvbk1ldGFkYXRhRW50cnlUeXBlcyA9IFtcbiAgQW5ub3RhdGlvbk1ldGFkYXRhRW50cnlUeXBlLklORk8sXG4gIEFubm90YXRpb25NZXRhZGF0YUVudHJ5VHlwZS5XQVJOLFxuICBBbm5vdGF0aW9uTWV0YWRhdGFFbnRyeVR5cGUuRVJST1IsXG5dIGFzIHN0cmluZ1tdO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZnVuY3Rpb24gaXNBbm5vdGF0aW9uTWV0YWRhdGEobWV0YWRhdGE6IE1ldGFkYXRhRW50cnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIGFubm90YXRpb25NZXRhZGF0YUVudHJ5VHlwZXMuaW5jbHVkZXMobWV0YWRhdGEudHlwZSk7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5mdW5jdGlvbiBpc0Vycm9yQW5ub3RhdGlvbihhbm5vdGF0aW9uOiBTdGFja0Fubm90YXRpb24pOiBib29sZWFuIHtcbiAgcmV0dXJuIGFubm90YXRpb24ubGV2ZWwgPT09IEFubm90YXRpb25NZXRhZGF0YUVudHJ5VHlwZS5FUlJPUjtcbn1cblxuLy8gb3JpZ2luYWxseSBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9ibG9iL2RjYWUzZWVhZDBkYmY5YWNiMWVkODBiYTk1YmIxMDRjNjRjYjFiZDcvcGFja2FnZXMvJTQwYXdzLWNkay9jb3JlL2xpYi9wcml2YXRlL3N5bnRoZXNpcy50cyNMNTJcbmNvbnN0IENVU1RPTV9TWU5USEVTSVNfU1lNID0gU3ltYm9sLmZvcihcImNka3RmL2N1c3RvbVN5bnRoZXNpc1wiKTtcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGNvbnN0cnVjdHMgdGhhdCB3YW50IHRvIGRvIHNvbWV0aGluZyBjdXN0b20gZHVyaW5nIHN5bnRoZXNpc1xuICpcbiAqIFRoaXMgZmVhdHVyZSBpcyBpbnRlbmRlZCBmb3IgdXNlIGJ5IHRoZSBDREtUTiBvbmx5OyAzcmQgcGFydHlcbiAqIGxpYnJhcnkgYXV0aG9ycyBhbmQgQ0RLIHVzZXJzIHNob3VsZCBub3QgdXNlIHRoaXMgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUN1c3RvbVN5bnRoZXNpcyB7XG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiB0aGUgY29uc3RydWN0IGlzIHN5bnRoZXNpemVkXG4gICAqL1xuICBvblN5bnRoZXNpemUoc2Vzc2lvbjogSVN5bnRoZXNpc1Nlc3Npb24pOiB2b2lkO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEN1c3RvbVN5bnRoZXNpcyhcbiAgY29uc3RydWN0OiBJQ29uc3RydWN0LFxuICBzeW50aGVzaXM6IElDdXN0b21TeW50aGVzaXMsXG4pOiB2b2lkIHtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnN0cnVjdCwgQ1VTVE9NX1NZTlRIRVNJU19TWU0sIHtcbiAgICB2YWx1ZTogc3ludGhlc2lzLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICB9KTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbmZ1bmN0aW9uIGdldEN1c3RvbVN5bnRoZXNpcyhcbiAgY29uc3RydWN0OiBJQ29uc3RydWN0LFxuKTogSUN1c3RvbVN5bnRoZXNpcyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiAoY29uc3RydWN0IGFzIGFueSlbQ1VTVE9NX1NZTlRIRVNJU19TWU1dO1xufVxuIl19