@decaf-ts/utils 0.2.6 → 0.2.8

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 (157) hide show
  1. package/LICENSE.md +0 -0
  2. package/README.md +0 -0
  3. package/bin/build-scripts.cjs +1885 -1423
  4. package/bin/tag-release.cjs +1876 -1420
  5. package/bin/tag-release.sh +0 -0
  6. package/bin/update-scripts.cjs +1881 -1425
  7. package/dist/assets/slogans.json +0 -0
  8. package/dist/utils.cjs +86 -689
  9. package/dist/utils.esm.cjs +78 -674
  10. package/lib/assets/slogans.json +0 -0
  11. package/lib/bin/build-scripts.d.ts +0 -0
  12. package/lib/bin/tag-release.d.ts +0 -0
  13. package/lib/bin/update-scripts.d.ts +0 -0
  14. package/lib/cli/command.cjs +6 -7
  15. package/lib/cli/command.d.ts +5 -5
  16. package/lib/cli/commands/build-scripts.cjs +9 -3
  17. package/lib/cli/commands/build-scripts.d.ts +1 -1
  18. package/lib/cli/commands/index.cjs +0 -0
  19. package/lib/cli/commands/index.d.ts +0 -0
  20. package/lib/cli/commands/tag-release.cjs +1 -1
  21. package/lib/cli/commands/tag-release.d.ts +1 -1
  22. package/lib/cli/commands/update-scripts.cjs +1 -1
  23. package/lib/cli/commands/update-scripts.d.ts +1 -1
  24. package/lib/cli/constants.cjs +0 -0
  25. package/lib/cli/constants.d.ts +0 -0
  26. package/lib/cli/index.cjs +0 -0
  27. package/lib/cli/index.d.ts +0 -0
  28. package/lib/cli/types.cjs +1 -1
  29. package/lib/cli/types.d.ts +1 -1
  30. package/lib/esm/assets/slogans.json +0 -0
  31. package/lib/esm/bin/build-scripts.d.ts +0 -0
  32. package/lib/esm/bin/build-scripts.js +0 -0
  33. package/lib/esm/bin/tag-release.d.ts +0 -0
  34. package/lib/esm/bin/tag-release.js +0 -0
  35. package/lib/esm/bin/update-scripts.d.ts +0 -0
  36. package/lib/esm/bin/update-scripts.js +0 -0
  37. package/lib/esm/cli/command.d.ts +5 -5
  38. package/lib/esm/cli/command.js +2 -3
  39. package/lib/esm/cli/commands/build-scripts.d.ts +1 -1
  40. package/lib/esm/cli/commands/build-scripts.js +9 -3
  41. package/lib/esm/cli/commands/index.d.ts +0 -0
  42. package/lib/esm/cli/commands/index.js +0 -0
  43. package/lib/esm/cli/commands/tag-release.d.ts +1 -1
  44. package/lib/esm/cli/commands/tag-release.js +1 -1
  45. package/lib/esm/cli/commands/update-scripts.d.ts +1 -1
  46. package/lib/esm/cli/commands/update-scripts.js +1 -1
  47. package/lib/esm/cli/constants.d.ts +0 -0
  48. package/lib/esm/cli/constants.js +0 -0
  49. package/lib/esm/cli/index.d.ts +0 -0
  50. package/lib/esm/cli/index.js +0 -0
  51. package/lib/esm/cli/types.d.ts +1 -1
  52. package/lib/esm/cli/types.js +1 -1
  53. package/lib/esm/index.d.ts +2 -2
  54. package/lib/esm/index.js +2 -2
  55. package/lib/esm/input/index.d.ts +0 -0
  56. package/lib/esm/input/index.js +0 -0
  57. package/lib/esm/input/input.d.ts +1 -2
  58. package/lib/esm/input/input.js +2 -2
  59. package/lib/esm/input/types.d.ts +83 -0
  60. package/lib/esm/input/types.js +1 -1
  61. package/lib/esm/output/common.d.ts +3 -3
  62. package/lib/esm/output/common.js +2 -2
  63. package/lib/esm/output/index.d.ts +1 -3
  64. package/lib/esm/output/index.js +2 -4
  65. package/lib/esm/utils/constants.d.ts +0 -77
  66. package/lib/esm/utils/constants.js +1 -114
  67. package/lib/esm/utils/environment.d.ts +1 -1
  68. package/lib/esm/utils/environment.js +2 -2
  69. package/lib/esm/utils/fs.d.ts +0 -0
  70. package/lib/esm/utils/fs.js +2 -2
  71. package/lib/esm/utils/http.d.ts +1 -1
  72. package/lib/esm/utils/http.js +2 -2
  73. package/lib/esm/utils/index.d.ts +0 -0
  74. package/lib/esm/utils/index.js +0 -0
  75. package/lib/esm/utils/md.d.ts +0 -0
  76. package/lib/esm/utils/md.js +0 -0
  77. package/lib/esm/utils/tests.d.ts +0 -0
  78. package/lib/esm/utils/tests.js +0 -0
  79. package/lib/esm/utils/text.d.ts +0 -0
  80. package/lib/esm/utils/text.js +0 -0
  81. package/lib/esm/utils/timeout.d.ts +0 -0
  82. package/lib/esm/utils/timeout.js +0 -0
  83. package/lib/esm/utils/types.d.ts +0 -0
  84. package/lib/esm/utils/types.js +0 -0
  85. package/lib/esm/utils/utils.d.ts +2 -2
  86. package/lib/esm/utils/utils.js +2 -2
  87. package/lib/esm/utils/web.d.ts +0 -0
  88. package/lib/esm/utils/web.js +0 -0
  89. package/lib/esm/writers/OutputWriter.d.ts +0 -0
  90. package/lib/esm/writers/OutputWriter.js +0 -0
  91. package/lib/esm/writers/RegexpOutputWriter.d.ts +0 -0
  92. package/lib/esm/writers/RegexpOutputWriter.js +0 -0
  93. package/lib/esm/writers/StandardOutputWriter.d.ts +2 -2
  94. package/lib/esm/writers/StandardOutputWriter.js +2 -2
  95. package/lib/esm/writers/index.d.ts +0 -0
  96. package/lib/esm/writers/index.js +0 -0
  97. package/lib/esm/writers/types.d.ts +0 -0
  98. package/lib/esm/writers/types.js +0 -0
  99. package/lib/index.cjs +2 -2
  100. package/lib/index.d.ts +2 -2
  101. package/lib/input/index.cjs +0 -0
  102. package/lib/input/index.d.ts +0 -0
  103. package/lib/input/input.cjs +2 -2
  104. package/lib/input/input.d.ts +1 -2
  105. package/lib/input/types.cjs +1 -1
  106. package/lib/input/types.d.ts +83 -0
  107. package/lib/output/common.cjs +2 -2
  108. package/lib/output/common.d.ts +3 -3
  109. package/lib/output/index.cjs +1 -3
  110. package/lib/output/index.d.ts +1 -3
  111. package/lib/utils/constants.cjs +2 -115
  112. package/lib/utils/constants.d.ts +0 -77
  113. package/lib/utils/environment.cjs +3 -3
  114. package/lib/utils/environment.d.ts +1 -1
  115. package/lib/utils/fs.cjs +2 -2
  116. package/lib/utils/fs.d.ts +0 -0
  117. package/lib/utils/http.cjs +2 -2
  118. package/lib/utils/http.d.ts +1 -1
  119. package/lib/utils/index.cjs +0 -0
  120. package/lib/utils/index.d.ts +0 -0
  121. package/lib/utils/md.cjs +0 -0
  122. package/lib/utils/md.d.ts +0 -0
  123. package/lib/utils/tests.cjs +0 -0
  124. package/lib/utils/tests.d.ts +0 -0
  125. package/lib/utils/text.cjs +0 -0
  126. package/lib/utils/text.d.ts +0 -0
  127. package/lib/utils/timeout.cjs +0 -0
  128. package/lib/utils/timeout.d.ts +0 -0
  129. package/lib/utils/types.cjs +0 -0
  130. package/lib/utils/types.d.ts +0 -0
  131. package/lib/utils/utils.cjs +2 -2
  132. package/lib/utils/utils.d.ts +2 -2
  133. package/lib/utils/web.cjs +0 -0
  134. package/lib/utils/web.d.ts +0 -0
  135. package/lib/writers/OutputWriter.cjs +0 -0
  136. package/lib/writers/OutputWriter.d.ts +0 -0
  137. package/lib/writers/RegexpOutputWriter.cjs +0 -0
  138. package/lib/writers/RegexpOutputWriter.d.ts +0 -0
  139. package/lib/writers/StandardOutputWriter.cjs +2 -2
  140. package/lib/writers/StandardOutputWriter.d.ts +2 -2
  141. package/lib/writers/index.cjs +0 -0
  142. package/lib/writers/index.d.ts +0 -0
  143. package/lib/writers/types.cjs +0 -0
  144. package/lib/writers/types.d.ts +0 -0
  145. package/package.json +5 -2
  146. package/lib/esm/output/logging.d.ts +0 -177
  147. package/lib/esm/output/logging.js +0 -349
  148. package/lib/esm/output/types.d.ts +0 -203
  149. package/lib/esm/output/types.js +0 -2
  150. package/lib/esm/utils/accumulator.d.ts +0 -105
  151. package/lib/esm/utils/accumulator.js +0 -144
  152. package/lib/output/logging.cjs +0 -354
  153. package/lib/output/logging.d.ts +0 -177
  154. package/lib/output/types.cjs +0 -3
  155. package/lib/output/types.d.ts +0 -203
  156. package/lib/utils/accumulator.cjs +0 -148
  157. package/lib/utils/accumulator.d.ts +0 -105
@@ -1,9 +1,11 @@
1
- import { style } from 'styled-string-builder';
2
1
  import prompts from 'prompts';
3
2
  import { parseArgs } from 'util';
3
+ import { Logging, DefaultLoggingConfig } from '@decaf-ts/logging';
4
4
  import fs from 'fs';
5
5
  import path from 'path';
6
6
  import { spawn } from 'child_process';
7
+ import { style } from 'styled-string-builder';
8
+ import { ObjectAccumulator } from 'typed-object-accumulator';
7
9
  import https from 'https';
8
10
  import { rollup } from 'rollup';
9
11
  import typescript from '@rollup/plugin-typescript';
@@ -11,528 +13,6 @@ import commonjs from '@rollup/plugin-commonjs';
11
13
  import { nodeResolve } from '@rollup/plugin-node-resolve';
12
14
  import json from '@rollup/plugin-json';
13
15
 
14
- /**
15
- * @description Default encoding for text operations.
16
- * @summary The standard UTF-8 encoding used for text processing.
17
- * @const {string} Encoding
18
- * @memberOf @decaf-ts/utils
19
- */
20
- const Encoding = "utf-8";
21
- /**
22
- * @description Regular expression for semantic versioning.
23
- * @summary A regex pattern to match and parse semantic version strings.
24
- * @const {RegExp} SemVersionRegex
25
- * @memberOf @decaf-ts/utils
26
- */
27
- const SemVersionRegex = /^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z])))/g;
28
- /**
29
- * @description Enum for semantic version components.
30
- * @summary Defines the three levels of semantic versioning: PATCH, MINOR, and MAJOR.
31
- * @enum {string}
32
- * @memberOf @decaf-ts/utils
33
- */
34
- var SemVersion;
35
- (function (SemVersion) {
36
- /** Patch version for backwards-compatible bug fixes. */
37
- SemVersion["PATCH"] = "patch";
38
- /** Minor version for backwards-compatible new features. */
39
- SemVersion["MINOR"] = "minor";
40
- /** Major version for changes that break backwards compatibility. */
41
- SemVersion["MAJOR"] = "major";
42
- })(SemVersion || (SemVersion = {}));
43
- /**
44
- * @description Flag to indicate non-CI environment.
45
- * @summary Used to specify that a command should run outside of a Continuous Integration environment.
46
- * @const {string} NoCIFLag
47
- * @memberOf @decaf-ts/utils
48
- */
49
- const NoCIFLag = "-no-ci";
50
- /**
51
- * @description Key for the setup script in package.json.
52
- * @summary Identifies the script that runs after package installation.
53
- * @const {string} SetupScriptKey
54
- * @memberOf @decaf-ts/utils
55
- */
56
- const SetupScriptKey = "postinstall";
57
- /**
58
- * @description Enum for various authentication tokens.
59
- * @summary Defines the file names for storing different types of authentication tokens.
60
- * @enum {string}
61
- * @memberOf @decaf-ts/utils
62
- */
63
- var Tokens;
64
- (function (Tokens) {
65
- /** Git authentication token file name. */
66
- Tokens["GIT"] = ".token";
67
- /** NPM authentication token file name. */
68
- Tokens["NPM"] = ".npmtoken";
69
- /** Docker authentication token file name. */
70
- Tokens["DOCKER"] = ".dockertoken";
71
- /** Confluence authentication token file name. */
72
- Tokens["CONFLUENCE"] = ".confluence-token";
73
- })(Tokens || (Tokens = {}));
74
- /**
75
- * @description Enum for log levels.
76
- * @summary Defines different levels of logging for the application.
77
- * @enum {string}
78
- * @memberOf @decaf-ts/utils
79
- */
80
- var LogLevel;
81
- (function (LogLevel) {
82
- /** Error events that are likely to cause problems. */
83
- LogLevel["error"] = "error";
84
- /** Routine information, such as ongoing status or performance. */
85
- LogLevel["info"] = "info";
86
- /** Additional relevant information. */
87
- LogLevel["verbose"] = "verbose";
88
- /** Debug or trace information. */
89
- LogLevel["debug"] = "debug";
90
- /** way too verbose or silly information. */
91
- LogLevel["silly"] = "silly";
92
- })(LogLevel || (LogLevel = {}));
93
- /**
94
- * @description Numeric values associated with log levels.
95
- * @summary Provides a numeric representation of log levels for comparison and filtering.
96
- * @const {Object} NumericLogLevels
97
- * @property {number} error - Numeric value for error level (0).
98
- * @property {number} info - Numeric value for info level (2).
99
- * @property {number} verbose - Numeric value for verbose level (4).
100
- * @property {number} debug - Numeric value for debug level (5).
101
- * @property {number} silly - Numeric value for silly level (8).
102
- * @memberOf @decaf-ts/utils
103
- */
104
- const NumericLogLevels = {
105
- error: 2,
106
- info: 4,
107
- verbose: 6,
108
- debug: 7,
109
- silly: 9,
110
- };
111
- /**
112
- * @description Default theme for styling log output.
113
- * @summary Defines the default color and style settings for various components of log messages.
114
- * @const DefaultTheme
115
- * @typedef {Theme} DefaultTheme
116
- * @property {Object} class - Styling for class names.
117
- * @property {number} class.fg - Foreground color code for class names (4).
118
- * @property {Object} id - Styling for identifiers.
119
- * @property {number} id.fg - Foreground color code for identifiers (36).
120
- * @property {Object} stack - Styling for stack traces (empty object).
121
- * @property {Object} timestamp - Styling for timestamps (empty object).
122
- * @property {Object} message - Styling for different types of messages.
123
- * @property {Object} message.error - Styling for error messages.
124
- * @property {number} message.error.fg - Foreground color code for error messages (34).
125
- * @property {Object} method - Styling for method names (empty object).
126
- * @property {Object} logLevel - Styling for different log levels.
127
- * @property {Object} logLevel.error - Styling for error level logs.
128
- * @property {number} logLevel.error.fg - Foreground color code for error level logs (6).
129
- * @property {Object} logLevel.info - Styling for info level logs (empty object).
130
- * @property {Object} logLevel.verbose - Styling for verbose level logs (empty object).
131
- * @property {Object} logLevel.debug - Styling for debug level logs.
132
- * @property {number} logLevel.debug.fg - Foreground color code for debug level logs (7).
133
- * @memberOf @decaf-ts/utils
134
- */
135
- const DefaultTheme = {
136
- class: {
137
- fg: 34,
138
- },
139
- id: {
140
- fg: 36,
141
- },
142
- stack: {},
143
- timestamp: {},
144
- message: {
145
- error: {
146
- fg: 31,
147
- },
148
- },
149
- method: {},
150
- logLevel: {
151
- error: {
152
- fg: 31,
153
- style: ["bold"],
154
- },
155
- info: {},
156
- verbose: {},
157
- debug: {
158
- fg: 33,
159
- },
160
- },
161
- };
162
- /**
163
- * @description Default configuration for logging.
164
- * @summary Defines the default settings for the logging system, including verbosity, log level, styling, and timestamp format.
165
- * @const DefaultLoggingConfig
166
- * @typedef {LoggingConfig} DefaultLoggingConfig
167
- * @property {number} verbose - Verbosity level (0).
168
- * @property {LogLevel} level - Default log level (LogLevel.info).
169
- * @property {boolean} style - Whether to apply styling to log output (false).
170
- * @property {boolean} timestamp - Whether to include timestamps in log messages (true).
171
- * @property {string} timestampFormat - Format for timestamps ("HH:mm:ss.SSS").
172
- * @property {boolean} context - Whether to include context information in log messages (true).
173
- * @property {Theme} theme - The theme to use for styling log messages (DefaultTheme).
174
- * @memberOf @decaf-ts/utils
175
- */
176
- const DefaultLoggingConfig = {
177
- verbose: 0,
178
- level: LogLevel.info,
179
- logLevel: true,
180
- style: false,
181
- separator: " - ",
182
- timestamp: true,
183
- timestampFormat: "HH:mm:ss.SSS",
184
- context: true,
185
- theme: DefaultTheme,
186
- };
187
- const AbortCode = "Aborted";
188
-
189
- /**
190
- * @description A minimal logger implementation.
191
- * @summary MiniLogger is a lightweight logging class that implements the VerbosityLogger interface.
192
- * It provides basic logging functionality with support for different log levels and verbosity.
193
- *
194
- * @class
195
- */
196
- class MiniLogger {
197
- /**
198
- * @description Creates a new MiniLogger instance.
199
- * @summary Initializes a MiniLogger with the given class name, optional configuration, and method name.
200
- *
201
- * @param context - The name of the class using this logger.
202
- * @param [conf] - Optional logging configuration. Defaults to Info level and verbosity 0.
203
- * @param [id] - Optional unique identifier for the logger instance.
204
- */
205
- constructor(context, conf, id) {
206
- this.context = context;
207
- this.conf = conf;
208
- this.id = id;
209
- }
210
- config(key) {
211
- if (this.conf && key in this.conf)
212
- return this.conf[key];
213
- return Logging.getConfig()[key];
214
- }
215
- for(method, config) {
216
- method = method
217
- ? typeof method === "string"
218
- ? method
219
- : method.name
220
- : undefined;
221
- return Logging.for([this.context, method].join("."), this.id, config);
222
- }
223
- /**
224
- * @description Creates a formatted log string.
225
- * @summary Generates a log string with timestamp, colored log level, and message.
226
- *
227
- * @param level - The log level as a string.
228
- * @param message
229
- * @param stack
230
- * @return A formatted log string.
231
- */
232
- createLog(level, message, stack) {
233
- const log = [];
234
- const style = this.config("style");
235
- if (this.config("timestamp")) {
236
- const date = new Date().toISOString();
237
- const timestamp = style ? Logging.theme(date, "timestamp", level) : date;
238
- log.push(timestamp);
239
- }
240
- if (this.config("logLevel")) {
241
- const lvl = style
242
- ? Logging.theme(level, "logLevel", level)
243
- : level;
244
- log.push(lvl);
245
- }
246
- if (this.config("context")) {
247
- const context = style
248
- ? Logging.theme(this.context, "class", level)
249
- : this.context;
250
- log.push(context);
251
- }
252
- const msg = style
253
- ? Logging.theme(typeof message === "string" ? message : message.message, "message", level)
254
- : typeof message === "string"
255
- ? message
256
- : message.message;
257
- log.push(msg);
258
- if (stack || message instanceof Error) {
259
- stack = style
260
- ? Logging.theme((stack || message.stack), "stack", level)
261
- : stack;
262
- log.push(`\nStack trace:\n${stack}`);
263
- }
264
- return log.join(this.config("separator"));
265
- }
266
- /**
267
- * @description Logs a message with the specified log level.
268
- * @summary Checks if the message should be logged based on the current log level,
269
- * then uses the appropriate console method to output the log.
270
- *
271
- * @param level - The log level of the message.
272
- * @param msg - The message to be logged.
273
- * @param stack
274
- */
275
- log(level, msg, stack) {
276
- if (NumericLogLevels[this.config("level")] <
277
- NumericLogLevels[level])
278
- return;
279
- let method;
280
- switch (level) {
281
- case LogLevel.info:
282
- method = console.log;
283
- break;
284
- case LogLevel.verbose:
285
- case LogLevel.debug:
286
- method = console.debug;
287
- break;
288
- case LogLevel.error:
289
- method = console.error;
290
- break;
291
- default:
292
- throw new Error("Invalid log level");
293
- }
294
- method(this.createLog(level, msg, stack));
295
- }
296
- /**
297
- * @description LLogs a `way too verbose` or a silly message.
298
- * @summary Logs a message at the Silly level if the current verbosity allows it.
299
- *
300
- * @param msg - The message to be logged.
301
- * @param verbosity - The verbosity level of the message (default: 0).
302
- */
303
- silly(msg, verbosity = 0) {
304
- if (this.config("verbose") >= verbosity)
305
- this.log(LogLevel.verbose, msg);
306
- }
307
- /**
308
- * @description Logs a verbose message.
309
- * @summary Logs a message at the Verbose level if the current verbosity allows it.
310
- *
311
- * @param msg - The message to be logged.
312
- * @param verbosity - The verbosity level of the message (default: 0).
313
- */
314
- verbose(msg, verbosity = 0) {
315
- if (this.config("verbose") >= verbosity)
316
- this.log(LogLevel.verbose, msg);
317
- }
318
- /**
319
- * @description Logs an info message.
320
- * @summary Logs a message at the Info level.
321
- *
322
- * @param msg - The message to be logged.
323
- */
324
- info(msg) {
325
- this.log(LogLevel.info, msg);
326
- }
327
- /**
328
- * @description Logs a debug message.
329
- * @summary Logs a message at the Debug level.
330
- *
331
- * @param msg - The message to be logged.
332
- */
333
- debug(msg) {
334
- this.log(LogLevel.debug, msg);
335
- }
336
- /**
337
- * @description Logs an error message.
338
- * @summary Logs a message at the Error level.
339
- *
340
- * @param msg - The message to be logged.
341
- */
342
- error(msg) {
343
- this.log(LogLevel.error, msg);
344
- }
345
- setConfig(config) {
346
- this.conf = { ...(this.conf || {}), ...config };
347
- }
348
- }
349
- /**
350
- * @description A static class for managing logging operations.
351
- * @summary The Logging class provides a centralized logging mechanism with support for
352
- * different log levels and verbosity. It uses a singleton pattern to maintain a global
353
- * logger instance and allows creating specific loggers for different classes and methods.
354
- *
355
- * @class
356
- */
357
- class Logging {
358
- /**
359
- * @description Factory function for creating logger instances.
360
- * @summary A function that creates new VerbosityLogger instances. By default, it creates a MiniLogger.
361
- */
362
- static { this._factory = (object, config, id) => {
363
- return new MiniLogger(object, config, id);
364
- }; }
365
- /**
366
- * @description Configuration for the logging system.
367
- * @summary Stores the global verbosity level and log level settings.
368
- */
369
- static { this._config = DefaultLoggingConfig; }
370
- /**
371
- * @description Private constructor to prevent instantiation.
372
- * @summary Ensures that the Logging class cannot be instantiated as it's designed to be used statically.
373
- */
374
- constructor() { }
375
- /**
376
- * @description Setter for the logging configuration.
377
- * @summary Allows updating the global logging configuration.
378
- *
379
- * @param config - An object containing verbosity and log level settings.
380
- */
381
- static setConfig(config) {
382
- Object.assign(this._config, config);
383
- }
384
- static getConfig() {
385
- return Object.assign({}, this._config);
386
- }
387
- /**
388
- * @description Retrieves or creates the global logger instance.
389
- * @summary Returns the existing global logger or creates a new one if it doesn't exist.
390
- *
391
- * @return The global VerbosityLogger instance.
392
- */
393
- static get() {
394
- this.global = this.global ? this.global : this._factory("Logging");
395
- return this.global;
396
- }
397
- /**
398
- * @description Logs a verbose message.
399
- * @summary Delegates the verbose logging to the global logger instance.
400
- *
401
- * @param msg - The message to be logged.
402
- * @param verbosity - The verbosity level of the message (default: 0).
403
- */
404
- static verbose(msg, verbosity = 0) {
405
- return this.get().verbose(msg, verbosity);
406
- }
407
- /**
408
- * @description Logs an info message.
409
- * @summary Delegates the info logging to the global logger instance.
410
- *
411
- * @param msg - The message to be logged.
412
- */
413
- static info(msg) {
414
- return this.get().info(msg);
415
- }
416
- /**
417
- * @description Logs a debug message.
418
- * @summary Delegates the debug logging to the global logger instance.
419
- *
420
- * @param msg - The message to be logged.
421
- */
422
- static debug(msg) {
423
- return this.get().debug(msg);
424
- }
425
- /**
426
- * @description Logs a silly message.
427
- * @summary Delegates the debug logging to the global logger instance.
428
- *
429
- * @param msg - The message to be logged.
430
- */
431
- static silly(msg) {
432
- return this.get().silly(msg);
433
- }
434
- /**
435
- * @description Logs an error message.
436
- * @summary Delegates the error logging to the global logger instance.
437
- *
438
- * @param msg - The message to be logged.
439
- */
440
- static error(msg) {
441
- return this.get().error(msg);
442
- }
443
- static for(object, id, config) {
444
- object = typeof object === "string" ? object : object.name;
445
- id = typeof id === "string" ? id : undefined;
446
- config = typeof id === "object" ? id : config;
447
- return this._factory(object, config, id);
448
- }
449
- /**
450
- * @description Creates a logger for a specific reason or context.
451
- *
452
- * @summary This static method creates a new logger instance using the factory function,
453
- * based on a given reason or context.
454
- *
455
- * @param reason - A string describing the reason or context for creating this logger.
456
- * @param id
457
- * @returns A new VerbosityLogger or ClassLogger instance.
458
- */
459
- static because(reason, id) {
460
- return this._factory(reason, this._config, id);
461
- }
462
- static theme(text, type, loggerLevel, template = DefaultTheme) {
463
- if (!this._config.style)
464
- return text;
465
- const logger = Logging.get().for(this.theme);
466
- function apply(txt, option, value) {
467
- try {
468
- const t = txt;
469
- let c = style(t);
470
- function applyColor(val, isBg = false) {
471
- let f = isBg ? c.background : c.foreground;
472
- if (!Array.isArray(val)) {
473
- return f.call(c, value);
474
- }
475
- switch (val.length) {
476
- case 1:
477
- f = isBg ? c.bgColor256 : c.color256;
478
- return f(val[0]);
479
- case 3:
480
- f = isBg ? c.bgRgb : c.rgb;
481
- return c.rgb(val[0], val[1], val[2]);
482
- default:
483
- logger.error(`Not a valid color option: ${option}`);
484
- return style(t);
485
- }
486
- }
487
- function applyStyle(v) {
488
- if (typeof v === "number") {
489
- c = c.style(v);
490
- }
491
- else {
492
- c = c[v];
493
- }
494
- }
495
- switch (option) {
496
- case "bg":
497
- case "fg":
498
- return applyColor(value).text;
499
- case "style":
500
- if (Array.isArray(value)) {
501
- value.forEach(applyStyle);
502
- }
503
- else {
504
- applyStyle(value);
505
- }
506
- return c.text;
507
- default:
508
- logger.error(`Not a valid theme option: ${option}`);
509
- return t;
510
- }
511
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
512
- }
513
- catch (e) {
514
- logger.error(`Error applying style: ${option} with value ${value}`);
515
- return txt;
516
- }
517
- }
518
- const individualTheme = template[type];
519
- if (!individualTheme || !Object.keys(individualTheme).length) {
520
- return text;
521
- }
522
- let actualTheme = individualTheme;
523
- const logLevels = Object.assign({}, LogLevel);
524
- if (Object.keys(individualTheme)[0] in logLevels)
525
- actualTheme =
526
- individualTheme[loggerLevel] || {};
527
- return Object.keys(actualTheme).reduce((acc, key) => {
528
- const val = actualTheme[key];
529
- if (val)
530
- return apply(acc, key, val);
531
- return acc;
532
- }, text);
533
- }
534
- }
535
-
536
16
  /**
537
17
  * @description Represents a user input prompt with various configuration options.
538
18
  * @summary This class provides a flexible interface for creating and managing user input prompts.
@@ -1316,6 +796,68 @@ function escapeRegExp(string) {
1316
796
  return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
1317
797
  }
1318
798
 
799
+ /**
800
+ * @description Default encoding for text operations.
801
+ * @summary The standard UTF-8 encoding used for text processing.
802
+ * @const {string} Encoding
803
+ * @memberOf @decaf-ts/utils
804
+ */
805
+ const Encoding = "utf-8";
806
+ /**
807
+ * @description Regular expression for semantic versioning.
808
+ * @summary A regex pattern to match and parse semantic version strings.
809
+ * @const {RegExp} SemVersionRegex
810
+ * @memberOf @decaf-ts/utils
811
+ */
812
+ const SemVersionRegex = /^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z])))/g;
813
+ /**
814
+ * @description Enum for semantic version components.
815
+ * @summary Defines the three levels of semantic versioning: PATCH, MINOR, and MAJOR.
816
+ * @enum {string}
817
+ * @memberOf @decaf-ts/utils
818
+ */
819
+ var SemVersion;
820
+ (function (SemVersion) {
821
+ /** Patch version for backwards-compatible bug fixes. */
822
+ SemVersion["PATCH"] = "patch";
823
+ /** Minor version for backwards-compatible new features. */
824
+ SemVersion["MINOR"] = "minor";
825
+ /** Major version for changes that break backwards compatibility. */
826
+ SemVersion["MAJOR"] = "major";
827
+ })(SemVersion || (SemVersion = {}));
828
+ /**
829
+ * @description Flag to indicate non-CI environment.
830
+ * @summary Used to specify that a command should run outside of a Continuous Integration environment.
831
+ * @const {string} NoCIFLag
832
+ * @memberOf @decaf-ts/utils
833
+ */
834
+ const NoCIFLag = "-no-ci";
835
+ /**
836
+ * @description Key for the setup script in package.json.
837
+ * @summary Identifies the script that runs after package installation.
838
+ * @const {string} SetupScriptKey
839
+ * @memberOf @decaf-ts/utils
840
+ */
841
+ const SetupScriptKey = "postinstall";
842
+ /**
843
+ * @description Enum for various authentication tokens.
844
+ * @summary Defines the file names for storing different types of authentication tokens.
845
+ * @enum {string}
846
+ * @memberOf @decaf-ts/utils
847
+ */
848
+ var Tokens;
849
+ (function (Tokens) {
850
+ /** Git authentication token file name. */
851
+ Tokens["GIT"] = ".token";
852
+ /** NPM authentication token file name. */
853
+ Tokens["NPM"] = ".npmtoken";
854
+ /** Docker authentication token file name. */
855
+ Tokens["DOCKER"] = ".dockertoken";
856
+ /** Confluence authentication token file name. */
857
+ Tokens["CONFLUENCE"] = ".confluence-token";
858
+ })(Tokens || (Tokens = {}));
859
+ const AbortCode = "Aborted";
860
+
1319
861
  /**
1320
862
  * @description A standard output writer for handling command execution output.
1321
863
  * @summary This class implements the OutputWriter interface and provides methods for
@@ -2853,7 +2395,7 @@ const colors = [
2853
2395
  /**
2854
2396
  * @description Prints a styled banner to the console.
2855
2397
  * @summary Generates and prints a colorful ASCII art banner with a random slogan.
2856
- * @param {VerbosityLogger} [logger] - Optional logger for verbose output.
2398
+ * @param {Logger} [logger] - Optional logger for verbose output.
2857
2399
  * @function printBanner
2858
2400
  * @mermaid
2859
2401
  * sequenceDiagram
@@ -2925,150 +2467,6 @@ function getSlogan(i) {
2925
2467
  }
2926
2468
  }
2927
2469
 
2928
- /**
2929
- * @class ObjectAccumulator
2930
- * @template T - The type of the accumulated object, extends object
2931
- * @description A class that accumulates objects and provides type-safe access to their properties.
2932
- * It allows for dynamic addition of properties while maintaining type information.
2933
- * @summary Accumulates objects and maintains type information for accumulated properties
2934
- * @memberOf utils
2935
- */
2936
- class ObjectAccumulator {
2937
- constructor() {
2938
- Object.defineProperty(this, "__size", {
2939
- value: 0,
2940
- writable: true,
2941
- configurable: false,
2942
- enumerable: false,
2943
- });
2944
- }
2945
- /**
2946
- * @protected
2947
- * @description Expands the accumulator with properties from a new object
2948
- * @summary Adds new properties to the accumulator
2949
- * @template V - The type of the object being expanded
2950
- * @param {V} value - The object to expand with
2951
- * @returns {void}
2952
- */
2953
- expand(value) {
2954
- Object.entries(value).forEach(([k, v]) => {
2955
- Object.defineProperty(this, k, {
2956
- get: () => v,
2957
- set: (val) => {
2958
- v = val;
2959
- },
2960
- configurable: true,
2961
- enumerable: true,
2962
- });
2963
- });
2964
- }
2965
- /**
2966
- * @description Accumulates a new object into the accumulator
2967
- * @summary Adds properties from a new object to the accumulator, maintaining type information
2968
- * @template V - The type of the object being accumulated
2969
- * @param {V} value - The object to accumulate
2970
- * @returns A new ObjectAccumulator instance with updated type information
2971
- * @mermaid
2972
- * sequenceDiagram
2973
- * participant A as Accumulator
2974
- * participant O as Object
2975
- * A->>O: Get entries
2976
- * loop For each entry
2977
- * A->>A: Define property
2978
- * end
2979
- * A->>A: Update size
2980
- * A->>A: Return updated accumulator
2981
- */
2982
- accumulate(value) {
2983
- this.expand(value);
2984
- this.__size = this.__size + Object.keys(value).length;
2985
- return this;
2986
- }
2987
- /**
2988
- * @description Retrieves a value from the accumulator by its key
2989
- * @summary Gets a value from the accumulated object using a type-safe key
2990
- * @template K - The key type, must be a key of this
2991
- * @param {K} key - The key of the value to retrieve
2992
- * @returns {any | undefined} The value associated with the key, or undefined if not found
2993
- */
2994
- get(key) {
2995
- return this[key];
2996
- }
2997
- /**
2998
- * @description Checks if a key exists in the accumulator
2999
- * @summary Determines whether the accumulator contains a specific key
3000
- * @param {string} key - The key to check for existence
3001
- * @returns {boolean} True if the key exists, false otherwise
3002
- */
3003
- has(key) {
3004
- return !!this[key];
3005
- }
3006
- /**
3007
- * @description Removes a key-value pair from the accumulator
3008
- * @summary Deletes a property from the accumulated object
3009
- * @param {string} key - The key of the property to remove
3010
- * @returns {} The accumulator instance with the specified property removed
3011
- */
3012
- remove(key) {
3013
- if (!(key in this))
3014
- return this;
3015
- delete this[key];
3016
- this.__size--;
3017
- return this;
3018
- }
3019
- /**
3020
- * @description Retrieves all keys from the accumulator
3021
- * @summary Gets an array of all accumulated property keys
3022
- * @returns {string[]} An array of keys as strings
3023
- */
3024
- keys() {
3025
- return Object.keys(this);
3026
- }
3027
- /**
3028
- * @description Retrieves all values from the accumulator
3029
- * @summary Gets an array of all accumulated property values
3030
- * @returns An array of values
3031
- */
3032
- values() {
3033
- return Object.values(this);
3034
- }
3035
- /**
3036
- * @description Gets the number of key-value pairs in the accumulator
3037
- * @summary Returns the count of accumulated properties
3038
- * @returns {number} The number of key-value pairs
3039
- */
3040
- size() {
3041
- return this.__size;
3042
- }
3043
- /**
3044
- * @description Clears all accumulated key-value pairs
3045
- * @summary Removes all properties from the accumulator and returns a new empty instance
3046
- * @returns {ObjectAccumulator<never>} A new empty ObjectAccumulator instance
3047
- */
3048
- clear() {
3049
- return new ObjectAccumulator();
3050
- }
3051
- /**
3052
- * @description Executes a callback for each key-value pair in the accumulator
3053
- * @summary Iterates over all accumulated properties, calling a function for each
3054
- * @param {function(any, string, number): void} callback - The function to execute for each entry
3055
- * @returns {void}
3056
- */
3057
- forEach(callback) {
3058
- Object.entries(this).forEach(([key, value], i) => callback(value, key, i));
3059
- }
3060
- /**
3061
- * @description Creates a new array with the results of calling a provided function on every element in the accumulator
3062
- * @summary Maps each accumulated property to a new value using a callback function
3063
- * @template R - The type of the mapped values
3064
- * @param {function(any, string,number): R} callback - Function that produces an element of the new array
3065
- * @returns {R[]} A new array with each element being the result of the callback function
3066
- */
3067
- map(callback) {
3068
- return Object.entries(this).map(([key, value], i) => callback(value, key, i));
3069
- }
3070
- }
3071
-
3072
2470
  /**
3073
2471
  * @function isBrowser
3074
2472
  * @description Determines if the current environment is a browser by checking the prototype chain of the global object.
@@ -3375,7 +2773,7 @@ class HttpClient {
3375
2773
  }
3376
2774
  }
3377
2775
 
3378
- const VERSION_STRING = "0.2.6";
2776
+ const VERSION_STRING = "0.2.7";
3379
2777
  var Modes;
3380
2778
  (function (Modes) {
3381
2779
  Modes["CJS"] = "commonjs";
@@ -3480,7 +2878,12 @@ class BuildScripts extends Command {
3480
2878
  writeFile(`bin/${cmd}.cjs`, data);
3481
2879
  }
3482
2880
  }
3483
- async bundle(mode, isDev, isLib, entryFile = "src/index.ts", nameOverride = this.pkgName, externals, include = ["prompts", "styled-string-builder"]) {
2881
+ async bundle(mode, isDev, isLib, entryFile = "src/index.ts", nameOverride = this.pkgName, externals, include = [
2882
+ "prompts",
2883
+ "styled-string-builder",
2884
+ "typed-object-accumulator",
2885
+ "@decaf-ts/logging",
2886
+ ]) {
3484
2887
  const isEsm = mode === Modes.ESM;
3485
2888
  const pkgName = this.pkgName;
3486
2889
  const ext = Array.from(new Set([
@@ -3496,6 +2899,7 @@ class BuildScripts extends Command {
3496
2899
  "child_process",
3497
2900
  "util",
3498
2901
  "https",
2902
+ "tslib",
3499
2903
  ],
3500
2904
  ...(externals || []),
3501
2905
  ]));
@@ -4416,12 +3820,12 @@ class RegexpOutputWriter extends StandardOutputWriter {
4416
3820
  * @description Represents the current version of the module.
4417
3821
  * @summary This constant stores the version number of the @asdasdasd/utils module.
4418
3822
  * The actual version number is replaced during the build process,
4419
- * with the placeholder "0.2.6" being substituted with the current version.
3823
+ * with the placeholder "0.2.7" being substituted with the current version.
4420
3824
  *
4421
3825
  * @const VERSION
4422
3826
  * @memberOf module:@decaf-ts/utils
4423
3827
  */
4424
- const VERSION = "0.2.6";
3828
+ const VERSION = "0.2.7";
4425
3829
 
4426
- export { AbortCode, BuildScripts, Command, DefaultCommandOptions, DefaultCommandValues, DefaultLoggingConfig, DefaultTheme, Encoding, Environment, HttpClient, LogLevel, Logging, MiniLogger, NoCIFLag, NumericLogLevels, RegexpOutputWriter, ReleaseScript, SemVersion, SemVersionRegex, SetupScriptKey, StandardOutputWriter, TemplateSync, Tokens, UserInput, VERSION, chainAbortController, copyFile, deletePath, escapeRegExp, getAllFiles, getDependencies, getPackage, getPackageVersion, getSlogan, installDependencies, installIfNotAvailable, lockify, normalizeImport, padEnd, patchFile, patchPlaceholders, patchString, printBanner, pushToGit, readFile, renameFile, runCommand, setPackageAttribute, spawnCommand, toCamelCase, toENVFormat, toKebabCase, toPascalCase, toSnakeCase, updateDependencies, writeFile };
4427
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuZXNtLmNqcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzL2NvbnN0YW50cy50cyIsIi4uL3NyYy9vdXRwdXQvbG9nZ2luZy50cyIsIi4uL3NyYy9pbnB1dC9pbnB1dC50cyIsIi4uL3NyYy9jbGkvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3V0aWxzL3RleHQudHMiLCIuLi9zcmMvd3JpdGVycy9TdGFuZGFyZE91dHB1dFdyaXRlci50cyIsIi4uL3NyYy91dGlscy91dGlscy50cyIsIi4uL3NyYy91dGlscy9mcy50cyIsIi4uL3NyYy9vdXRwdXQvY29tbW9uLnRzIiwiLi4vc3JjL3V0aWxzL2FjY3VtdWxhdG9yLnRzIiwiLi4vc3JjL3V0aWxzL3dlYi50cyIsIi4uL3NyYy91dGlscy9lbnZpcm9ubWVudC50cyIsIi4uL3NyYy9jbGkvY29tbWFuZC50cyIsIi4uL3NyYy91dGlscy9odHRwLnRzIiwiLi4vc3JjL2NsaS9jb21tYW5kcy9idWlsZC1zY3JpcHRzLnRzIiwiLi4vc3JjL2NsaS9jb21tYW5kcy90YWctcmVsZWFzZS50cyIsIi4uL3NyYy9jbGkvY29tbWFuZHMvdXBkYXRlLXNjcmlwdHMudHMiLCIuLi9zcmMvd3JpdGVycy9SZWdleHBPdXRwdXRXcml0ZXIudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9nZ2luZ0NvbmZpZywgVGhlbWUgfSBmcm9tIFwiLi4vb3V0cHV0L3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgZW5jb2RpbmcgZm9yIHRleHQgb3BlcmF0aW9ucy5cbiAqIEBzdW1tYXJ5IFRoZSBzdGFuZGFyZCBVVEYtOCBlbmNvZGluZyB1c2VkIGZvciB0ZXh0IHByb2Nlc3NpbmcuXG4gKiBAY29uc3Qge3N0cmluZ30gRW5jb2RpbmdcbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IEVuY29kaW5nID0gXCJ1dGYtOFwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWd1bGFyIGV4cHJlc3Npb24gZm9yIHNlbWFudGljIHZlcnNpb25pbmcuXG4gKiBAc3VtbWFyeSBBIHJlZ2V4IHBhdHRlcm4gdG8gbWF0Y2ggYW5kIHBhcnNlIHNlbWFudGljIHZlcnNpb24gc3RyaW5ncy5cbiAqIEBjb25zdCB7UmVnRXhwfSBTZW1WZXJzaW9uUmVnZXhcbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IFNlbVZlcnNpb25SZWdleCA9XG4gIC9eKFxcZCspXFwuKFxcZCspXFwuKFxcZCspKD86LShbMC05QS1aYS16LV0rKD86XFwuWzAtOUEtWmEtel0pKSkvZztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRW51bSBmb3Igc2VtYW50aWMgdmVyc2lvbiBjb21wb25lbnRzLlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgdGhyZWUgbGV2ZWxzIG9mIHNlbWFudGljIHZlcnNpb25pbmc6IFBBVENILCBNSU5PUiwgYW5kIE1BSk9SLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGVudW0gU2VtVmVyc2lvbiB7XG4gIC8qKiBQYXRjaCB2ZXJzaW9uIGZvciBiYWNrd2FyZHMtY29tcGF0aWJsZSBidWcgZml4ZXMuICovXG4gIFBBVENIID0gXCJwYXRjaFwiLFxuICAvKiogTWlub3IgdmVyc2lvbiBmb3IgYmFja3dhcmRzLWNvbXBhdGlibGUgbmV3IGZlYXR1cmVzLiAqL1xuICBNSU5PUiA9IFwibWlub3JcIixcbiAgLyoqIE1ham9yIHZlcnNpb24gZm9yIGNoYW5nZXMgdGhhdCBicmVhayBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gKi9cbiAgTUFKT1IgPSBcIm1ham9yXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZsYWcgdG8gaW5kaWNhdGUgbm9uLUNJIGVudmlyb25tZW50LlxuICogQHN1bW1hcnkgVXNlZCB0byBzcGVjaWZ5IHRoYXQgYSBjb21tYW5kIHNob3VsZCBydW4gb3V0c2lkZSBvZiBhIENvbnRpbnVvdXMgSW50ZWdyYXRpb24gZW52aXJvbm1lbnQuXG4gKiBAY29uc3Qge3N0cmluZ30gTm9DSUZMYWdcbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IE5vQ0lGTGFnID0gXCItbm8tY2lcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gS2V5IGZvciB0aGUgc2V0dXAgc2NyaXB0IGluIHBhY2thZ2UuanNvbi5cbiAqIEBzdW1tYXJ5IElkZW50aWZpZXMgdGhlIHNjcmlwdCB0aGF0IHJ1bnMgYWZ0ZXIgcGFja2FnZSBpbnN0YWxsYXRpb24uXG4gKiBAY29uc3Qge3N0cmluZ30gU2V0dXBTY3JpcHRLZXlcbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IFNldHVwU2NyaXB0S2V5ID0gXCJwb3N0aW5zdGFsbFwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbnVtIGZvciB2YXJpb3VzIGF1dGhlbnRpY2F0aW9uIHRva2Vucy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIGZpbGUgbmFtZXMgZm9yIHN0b3JpbmcgZGlmZmVyZW50IHR5cGVzIG9mIGF1dGhlbnRpY2F0aW9uIHRva2Vucy5cbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAbWVtYmVyT2YgQGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCBlbnVtIFRva2VucyB7XG4gIC8qKiBHaXQgYXV0aGVudGljYXRpb24gdG9rZW4gZmlsZSBuYW1lLiAqL1xuICBHSVQgPSBcIi50b2tlblwiLFxuICAvKiogTlBNIGF1dGhlbnRpY2F0aW9uIHRva2VuIGZpbGUgbmFtZS4gKi9cbiAgTlBNID0gXCIubnBtdG9rZW5cIixcbiAgLyoqIERvY2tlciBhdXRoZW50aWNhdGlvbiB0b2tlbiBmaWxlIG5hbWUuICovXG4gIERPQ0tFUiA9IFwiLmRvY2tlcnRva2VuXCIsXG4gIC8qKiBDb25mbHVlbmNlIGF1dGhlbnRpY2F0aW9uIHRva2VuIGZpbGUgbmFtZS4gKi9cbiAgQ09ORkxVRU5DRSA9IFwiLmNvbmZsdWVuY2UtdG9rZW5cIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRW51bSBmb3IgbG9nIGxldmVscy5cbiAqIEBzdW1tYXJ5IERlZmluZXMgZGlmZmVyZW50IGxldmVscyBvZiBsb2dnaW5nIGZvciB0aGUgYXBwbGljYXRpb24uXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQG1lbWJlck9mIEBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgZW51bSBMb2dMZXZlbCB7XG4gIC8qKiBFcnJvciBldmVudHMgdGhhdCBhcmUgbGlrZWx5IHRvIGNhdXNlIHByb2JsZW1zLiAqL1xuICBlcnJvciA9IFwiZXJyb3JcIixcbiAgLyoqIFJvdXRpbmUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgb25nb2luZyBzdGF0dXMgb3IgcGVyZm9ybWFuY2UuICovXG4gIGluZm8gPSBcImluZm9cIixcbiAgLyoqIEFkZGl0aW9uYWwgcmVsZXZhbnQgaW5mb3JtYXRpb24uICovXG4gIHZlcmJvc2UgPSBcInZlcmJvc2VcIixcbiAgLyoqIERlYnVnIG9yIHRyYWNlIGluZm9ybWF0aW9uLiAqL1xuICBkZWJ1ZyA9IFwiZGVidWdcIixcbiAgLyoqIHdheSB0b28gdmVyYm9zZSBvciBzaWxseSBpbmZvcm1hdGlvbi4gKi9cbiAgc2lsbHkgPSBcInNpbGx5XCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE51bWVyaWMgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBsb2cgbGV2ZWxzLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgYSBudW1lcmljIHJlcHJlc2VudGF0aW9uIG9mIGxvZyBsZXZlbHMgZm9yIGNvbXBhcmlzb24gYW5kIGZpbHRlcmluZy5cbiAqIEBjb25zdCB7T2JqZWN0fSBOdW1lcmljTG9nTGV2ZWxzXG4gKiBAcHJvcGVydHkge251bWJlcn0gZXJyb3IgLSBOdW1lcmljIHZhbHVlIGZvciBlcnJvciBsZXZlbCAoMCkuXG4gKiBAcHJvcGVydHkge251bWJlcn0gaW5mbyAtIE51bWVyaWMgdmFsdWUgZm9yIGluZm8gbGV2ZWwgKDIpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHZlcmJvc2UgLSBOdW1lcmljIHZhbHVlIGZvciB2ZXJib3NlIGxldmVsICg0KS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBkZWJ1ZyAtIE51bWVyaWMgdmFsdWUgZm9yIGRlYnVnIGxldmVsICg1KS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBzaWxseSAtIE51bWVyaWMgdmFsdWUgZm9yIHNpbGx5IGxldmVsICg4KS5cbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IE51bWVyaWNMb2dMZXZlbHMgPSB7XG4gIGVycm9yOiAyLFxuICBpbmZvOiA0LFxuICB2ZXJib3NlOiA2LFxuICBkZWJ1ZzogNyxcbiAgc2lsbHk6IDksXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IHRoZW1lIGZvciBzdHlsaW5nIGxvZyBvdXRwdXQuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBkZWZhdWx0IGNvbG9yIGFuZCBzdHlsZSBzZXR0aW5ncyBmb3IgdmFyaW91cyBjb21wb25lbnRzIG9mIGxvZyBtZXNzYWdlcy5cbiAqIEBjb25zdCBEZWZhdWx0VGhlbWVcbiAqIEB0eXBlZGVmIHtUaGVtZX0gRGVmYXVsdFRoZW1lXG4gKiBAcHJvcGVydHkge09iamVjdH0gY2xhc3MgLSBTdHlsaW5nIGZvciBjbGFzcyBuYW1lcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjbGFzcy5mZyAtIEZvcmVncm91bmQgY29sb3IgY29kZSBmb3IgY2xhc3MgbmFtZXMgKDQpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGlkIC0gU3R5bGluZyBmb3IgaWRlbnRpZmllcnMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gaWQuZmcgLSBGb3JlZ3JvdW5kIGNvbG9yIGNvZGUgZm9yIGlkZW50aWZpZXJzICgzNikuXG4gKiBAcHJvcGVydHkge09iamVjdH0gc3RhY2sgLSBTdHlsaW5nIGZvciBzdGFjayB0cmFjZXMgKGVtcHR5IG9iamVjdCkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gdGltZXN0YW1wIC0gU3R5bGluZyBmb3IgdGltZXN0YW1wcyAoZW1wdHkgb2JqZWN0KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBtZXNzYWdlIC0gU3R5bGluZyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIG1lc3NhZ2VzLlxuICogQHByb3BlcnR5IHtPYmplY3R9IG1lc3NhZ2UuZXJyb3IgLSBTdHlsaW5nIGZvciBlcnJvciBtZXNzYWdlcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtZXNzYWdlLmVycm9yLmZnIC0gRm9yZWdyb3VuZCBjb2xvciBjb2RlIGZvciBlcnJvciBtZXNzYWdlcyAoMzQpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IG1ldGhvZCAtIFN0eWxpbmcgZm9yIG1ldGhvZCBuYW1lcyAoZW1wdHkgb2JqZWN0KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2dMZXZlbCAtIFN0eWxpbmcgZm9yIGRpZmZlcmVudCBsb2cgbGV2ZWxzLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGxvZ0xldmVsLmVycm9yIC0gU3R5bGluZyBmb3IgZXJyb3IgbGV2ZWwgbG9ncy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsb2dMZXZlbC5lcnJvci5mZyAtIEZvcmVncm91bmQgY29sb3IgY29kZSBmb3IgZXJyb3IgbGV2ZWwgbG9ncyAoNikuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbG9nTGV2ZWwuaW5mbyAtIFN0eWxpbmcgZm9yIGluZm8gbGV2ZWwgbG9ncyAoZW1wdHkgb2JqZWN0KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2dMZXZlbC52ZXJib3NlIC0gU3R5bGluZyBmb3IgdmVyYm9zZSBsZXZlbCBsb2dzIChlbXB0eSBvYmplY3QpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGxvZ0xldmVsLmRlYnVnIC0gU3R5bGluZyBmb3IgZGVidWcgbGV2ZWwgbG9ncy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsb2dMZXZlbC5kZWJ1Zy5mZyAtIEZvcmVncm91bmQgY29sb3IgY29kZSBmb3IgZGVidWcgbGV2ZWwgbG9ncyAoNykuXG4gKiBAbWVtYmVyT2YgQGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0VGhlbWU6IFRoZW1lID0ge1xuICBjbGFzczoge1xuICAgIGZnOiAzNCxcbiAgfSxcbiAgaWQ6IHtcbiAgICBmZzogMzYsXG4gIH0sXG4gIHN0YWNrOiB7fSxcbiAgdGltZXN0YW1wOiB7fSxcbiAgbWVzc2FnZToge1xuICAgIGVycm9yOiB7XG4gICAgICBmZzogMzEsXG4gICAgfSxcbiAgfSxcbiAgbWV0aG9kOiB7fSxcbiAgbG9nTGV2ZWw6IHtcbiAgICBlcnJvcjoge1xuICAgICAgZmc6IDMxLFxuICAgICAgc3R5bGU6IFtcImJvbGRcIl0sXG4gICAgfSxcbiAgICBpbmZvOiB7fSxcbiAgICB2ZXJib3NlOiB7fSxcbiAgICBkZWJ1Zzoge1xuICAgICAgZmc6IDMzLFxuICAgIH0sXG4gIH0sXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIGxvZ2dpbmcuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBkZWZhdWx0IHNldHRpbmdzIGZvciB0aGUgbG9nZ2luZyBzeXN0ZW0sIGluY2x1ZGluZyB2ZXJib3NpdHksIGxvZyBsZXZlbCwgc3R5bGluZywgYW5kIHRpbWVzdGFtcCBmb3JtYXQuXG4gKiBAY29uc3QgRGVmYXVsdExvZ2dpbmdDb25maWdcbiAqIEB0eXBlZGVmIHtMb2dnaW5nQ29uZmlnfSBEZWZhdWx0TG9nZ2luZ0NvbmZpZ1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHZlcmJvc2UgLSBWZXJib3NpdHkgbGV2ZWwgKDApLlxuICogQHByb3BlcnR5IHtMb2dMZXZlbH0gbGV2ZWwgLSBEZWZhdWx0IGxvZyBsZXZlbCAoTG9nTGV2ZWwuaW5mbykuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHN0eWxlIC0gV2hldGhlciB0byBhcHBseSBzdHlsaW5nIHRvIGxvZyBvdXRwdXQgKGZhbHNlKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdGltZXN0YW1wIC0gV2hldGhlciB0byBpbmNsdWRlIHRpbWVzdGFtcHMgaW4gbG9nIG1lc3NhZ2VzICh0cnVlKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aW1lc3RhbXBGb3JtYXQgLSBGb3JtYXQgZm9yIHRpbWVzdGFtcHMgKFwiSEg6bW06c3MuU1NTXCIpLlxuICogQHByb3BlcnR5IHtib29sZWFufSBjb250ZXh0IC0gV2hldGhlciB0byBpbmNsdWRlIGNvbnRleHQgaW5mb3JtYXRpb24gaW4gbG9nIG1lc3NhZ2VzICh0cnVlKS5cbiAqIEBwcm9wZXJ0eSB7VGhlbWV9IHRoZW1lIC0gVGhlIHRoZW1lIHRvIHVzZSBmb3Igc3R5bGluZyBsb2cgbWVzc2FnZXMgKERlZmF1bHRUaGVtZSkuXG4gKiBAbWVtYmVyT2YgQGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0TG9nZ2luZ0NvbmZpZzogTG9nZ2luZ0NvbmZpZyA9IHtcbiAgdmVyYm9zZTogMCxcbiAgbGV2ZWw6IExvZ0xldmVsLmluZm8sXG4gIGxvZ0xldmVsOiB0cnVlLFxuICBzdHlsZTogZmFsc2UsXG4gIHNlcGFyYXRvcjogXCIgLSBcIixcbiAgdGltZXN0YW1wOiB0cnVlLFxuICB0aW1lc3RhbXBGb3JtYXQ6IFwiSEg6bW06c3MuU1NTXCIsXG4gIGNvbnRleHQ6IHRydWUsXG4gIHRoZW1lOiBEZWZhdWx0VGhlbWUsXG59O1xuXG5leHBvcnQgY29uc3QgQWJvcnRDb2RlID0gXCJBYm9ydGVkXCI7XG4iLCJpbXBvcnQge1xuICBEZWZhdWx0TG9nZ2luZ0NvbmZpZyxcbiAgRGVmYXVsdFRoZW1lLFxuICBMb2dMZXZlbCxcbiAgTnVtZXJpY0xvZ0xldmVscyxcbn0gZnJvbSBcIi4uL3V0aWxzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgTG9nZ2luZ0NvbmZpZyxcbiAgTG9nZ2luZ0NvbnRleHQsXG4gIFN0cmluZ0xpa2UsXG4gIFRoZW1lLFxuICBUaGVtZU9wdGlvbixcbiAgVGhlbWVPcHRpb25CeUxvZ0xldmVsLFxuICBWZXJib3NpdHlMb2dnZXIsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBDb2xvcml6ZU9wdGlvbnMsIHN0eWxlLCBTdHlsZWRTdHJpbmcgfSBmcm9tIFwic3R5bGVkLXN0cmluZy1idWlsZGVyXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgbWluaW1hbCBsb2dnZXIgaW1wbGVtZW50YXRpb24uXG4gKiBAc3VtbWFyeSBNaW5pTG9nZ2VyIGlzIGEgbGlnaHR3ZWlnaHQgbG9nZ2luZyBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIFZlcmJvc2l0eUxvZ2dlciBpbnRlcmZhY2UuXG4gKiBJdCBwcm92aWRlcyBiYXNpYyBsb2dnaW5nIGZ1bmN0aW9uYWxpdHkgd2l0aCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgbG9nIGxldmVscyBhbmQgdmVyYm9zaXR5LlxuICpcbiAqIEBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgTWluaUxvZ2dlciBpbXBsZW1lbnRzIFZlcmJvc2l0eUxvZ2dlciB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBNaW5pTG9nZ2VyIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIE1pbmlMb2dnZXIgd2l0aCB0aGUgZ2l2ZW4gY2xhc3MgbmFtZSwgb3B0aW9uYWwgY29uZmlndXJhdGlvbiwgYW5kIG1ldGhvZCBuYW1lLlxuICAgKlxuICAgKiBAcGFyYW0gY29udGV4dCAtIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyB1c2luZyB0aGlzIGxvZ2dlci5cbiAgICogQHBhcmFtIFtjb25mXSAtIE9wdGlvbmFsIGxvZ2dpbmcgY29uZmlndXJhdGlvbi4gRGVmYXVsdHMgdG8gSW5mbyBsZXZlbCBhbmQgdmVyYm9zaXR5IDAuXG4gICAqIEBwYXJhbSBbaWRdIC0gT3B0aW9uYWwgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBsb2dnZXIgaW5zdGFuY2UuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgY29udGV4dDogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBjb25mPzogUGFydGlhbDxMb2dnaW5nQ29uZmlnPixcbiAgICBwcm90ZWN0ZWQgaWQ/OiBzdHJpbmdcbiAgKSB7fVxuXG4gIHByb3RlY3RlZCBjb25maWcoXG4gICAga2V5OiBrZXlvZiBMb2dnaW5nQ29uZmlnXG4gICk6IExvZ2dpbmdDb25maWdba2V5b2YgTG9nZ2luZ0NvbmZpZ10ge1xuICAgIGlmICh0aGlzLmNvbmYgJiYga2V5IGluIHRoaXMuY29uZikgcmV0dXJuIHRoaXMuY29uZltrZXldO1xuICAgIHJldHVybiBMb2dnaW5nLmdldENvbmZpZygpW2tleV07XG4gIH1cblxuICBmb3IoXG4gICAgbWV0aG9kPzogc3RyaW5nIHwgKCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSxcbiAgICBjb25maWc/OiBQYXJ0aWFsPExvZ2dpbmdDb25maWc+XG4gICk6IFZlcmJvc2l0eUxvZ2dlciB7XG4gICAgbWV0aG9kID0gbWV0aG9kXG4gICAgICA/IHR5cGVvZiBtZXRob2QgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBtZXRob2RcbiAgICAgICAgOiBtZXRob2QubmFtZVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4gTG9nZ2luZy5mb3IoW3RoaXMuY29udGV4dCwgbWV0aG9kXS5qb2luKFwiLlwiKSwgdGhpcy5pZCwgY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGZvcm1hdHRlZCBsb2cgc3RyaW5nLlxuICAgKiBAc3VtbWFyeSBHZW5lcmF0ZXMgYSBsb2cgc3RyaW5nIHdpdGggdGltZXN0YW1wLCBjb2xvcmVkIGxvZyBsZXZlbCwgYW5kIG1lc3NhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSBsZXZlbCAtIFRoZSBsb2cgbGV2ZWwgYXMgYSBzdHJpbmcuXG4gICAqIEBwYXJhbSBtZXNzYWdlXG4gICAqIEBwYXJhbSBzdGFja1xuICAgKiBAcmV0dXJuIEEgZm9ybWF0dGVkIGxvZyBzdHJpbmcuXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlTG9nKFxuICAgIGxldmVsOiBMb2dMZXZlbCxcbiAgICBtZXNzYWdlOiBTdHJpbmdMaWtlIHwgRXJyb3IsXG4gICAgc3RhY2s/OiBzdHJpbmdcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBsb2c6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgc3R5bGUgPSB0aGlzLmNvbmZpZyhcInN0eWxlXCIpO1xuICAgIGlmICh0aGlzLmNvbmZpZyhcInRpbWVzdGFtcFwiKSkge1xuICAgICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IHN0eWxlID8gTG9nZ2luZy50aGVtZShkYXRlLCBcInRpbWVzdGFtcFwiLCBsZXZlbCkgOiBkYXRlO1xuICAgICAgbG9nLnB1c2godGltZXN0YW1wKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWcoXCJsb2dMZXZlbFwiKSkge1xuICAgICAgY29uc3QgbHZsOiBzdHJpbmcgPSBzdHlsZVxuICAgICAgICA/IExvZ2dpbmcudGhlbWUobGV2ZWwsIFwibG9nTGV2ZWxcIiwgbGV2ZWwpXG4gICAgICAgIDogbGV2ZWw7XG4gICAgICBsb2cucHVzaChsdmwpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZyhcImNvbnRleHRcIikpIHtcbiAgICAgIGNvbnN0IGNvbnRleHQ6IHN0cmluZyA9IHN0eWxlXG4gICAgICAgID8gTG9nZ2luZy50aGVtZSh0aGlzLmNvbnRleHQsIFwiY2xhc3NcIiwgbGV2ZWwpXG4gICAgICAgIDogdGhpcy5jb250ZXh0O1xuICAgICAgbG9nLnB1c2goY29udGV4dCk7XG4gICAgfVxuXG4gICAgY29uc3QgbXNnOiBzdHJpbmcgPSBzdHlsZVxuICAgICAgPyBMb2dnaW5nLnRoZW1lKFxuICAgICAgICAgIHR5cGVvZiBtZXNzYWdlID09PSBcInN0cmluZ1wiID8gbWVzc2FnZSA6IChtZXNzYWdlIGFzIEVycm9yKS5tZXNzYWdlLFxuICAgICAgICAgIFwibWVzc2FnZVwiLFxuICAgICAgICAgIGxldmVsXG4gICAgICAgIClcbiAgICAgIDogdHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBtZXNzYWdlXG4gICAgICAgIDogKG1lc3NhZ2UgYXMgRXJyb3IpLm1lc3NhZ2U7XG4gICAgbG9nLnB1c2gobXNnKTtcbiAgICBpZiAoc3RhY2sgfHwgbWVzc2FnZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBzdGFjayA9IHN0eWxlXG4gICAgICAgID8gTG9nZ2luZy50aGVtZShcbiAgICAgICAgICAgIChzdGFjayB8fCAobWVzc2FnZSBhcyBFcnJvcikuc3RhY2spIGFzIHN0cmluZyxcbiAgICAgICAgICAgIFwic3RhY2tcIixcbiAgICAgICAgICAgIGxldmVsXG4gICAgICAgICAgKVxuICAgICAgICA6IHN0YWNrO1xuICAgICAgbG9nLnB1c2goYFxcblN0YWNrIHRyYWNlOlxcbiR7c3RhY2t9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxvZy5qb2luKHRoaXMuY29uZmlnKFwic2VwYXJhdG9yXCIpIGFzIHN0cmluZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSBtZXNzYWdlIHdpdGggdGhlIHNwZWNpZmllZCBsb2cgbGV2ZWwuXG4gICAqIEBzdW1tYXJ5IENoZWNrcyBpZiB0aGUgbWVzc2FnZSBzaG91bGQgYmUgbG9nZ2VkIGJhc2VkIG9uIHRoZSBjdXJyZW50IGxvZyBsZXZlbCxcbiAgICogdGhlbiB1c2VzIHRoZSBhcHByb3ByaWF0ZSBjb25zb2xlIG1ldGhvZCB0byBvdXRwdXQgdGhlIGxvZy5cbiAgICpcbiAgICogQHBhcmFtIGxldmVsIC0gVGhlIGxvZyBsZXZlbCBvZiB0aGUgbWVzc2FnZS5cbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICogQHBhcmFtIHN0YWNrXG4gICAqL1xuICBwcm90ZWN0ZWQgbG9nKFxuICAgIGxldmVsOiBMb2dMZXZlbCxcbiAgICBtc2c6IFN0cmluZ0xpa2UgfCBFcnJvcixcbiAgICBzdGFjaz86IHN0cmluZ1xuICApOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICBOdW1lcmljTG9nTGV2ZWxzW3RoaXMuY29uZmlnKFwibGV2ZWxcIikgYXMgTG9nTGV2ZWxdIDxcbiAgICAgIE51bWVyaWNMb2dMZXZlbHNbbGV2ZWxdXG4gICAgKVxuICAgICAgcmV0dXJuO1xuICAgIGxldCBtZXRob2Q7XG4gICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgY2FzZSBMb2dMZXZlbC5pbmZvOlxuICAgICAgICBtZXRob2QgPSBjb25zb2xlLmxvZztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIExvZ0xldmVsLnZlcmJvc2U6XG4gICAgICBjYXNlIExvZ0xldmVsLmRlYnVnOlxuICAgICAgICBtZXRob2QgPSBjb25zb2xlLmRlYnVnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTG9nTGV2ZWwuZXJyb3I6XG4gICAgICAgIG1ldGhvZCA9IGNvbnNvbGUuZXJyb3I7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBsb2cgbGV2ZWxcIik7XG4gICAgfVxuICAgIG1ldGhvZCh0aGlzLmNyZWF0ZUxvZyhsZXZlbCwgbXNnLCBzdGFjaykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMTG9ncyBhIGB3YXkgdG9vIHZlcmJvc2VgIG9yIGEgc2lsbHkgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgTG9ncyBhIG1lc3NhZ2UgYXQgdGhlIFNpbGx5IGxldmVsIGlmIHRoZSBjdXJyZW50IHZlcmJvc2l0eSBhbGxvd3MgaXQuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqIEBwYXJhbSB2ZXJib3NpdHkgLSBUaGUgdmVyYm9zaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChkZWZhdWx0OiAwKS5cbiAgICovXG4gIHNpbGx5KG1zZzogU3RyaW5nTGlrZSwgdmVyYm9zaXR5OiBudW1iZXIgPSAwKTogdm9pZCB7XG4gICAgaWYgKCh0aGlzLmNvbmZpZyhcInZlcmJvc2VcIikgYXMgbnVtYmVyKSA+PSB2ZXJib3NpdHkpXG4gICAgICB0aGlzLmxvZyhMb2dMZXZlbC52ZXJib3NlLCBtc2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGEgdmVyYm9zZSBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBMb2dzIGEgbWVzc2FnZSBhdCB0aGUgVmVyYm9zZSBsZXZlbCBpZiB0aGUgY3VycmVudCB2ZXJib3NpdHkgYWxsb3dzIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKiBAcGFyYW0gdmVyYm9zaXR5IC0gVGhlIHZlcmJvc2l0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZSAoZGVmYXVsdDogMCkuXG4gICAqL1xuICB2ZXJib3NlKG1zZzogU3RyaW5nTGlrZSwgdmVyYm9zaXR5OiBudW1iZXIgPSAwKTogdm9pZCB7XG4gICAgaWYgKCh0aGlzLmNvbmZpZyhcInZlcmJvc2VcIikgYXMgbnVtYmVyKSA+PSB2ZXJib3NpdHkpXG4gICAgICB0aGlzLmxvZyhMb2dMZXZlbC52ZXJib3NlLCBtc2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGFuIGluZm8gbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgTG9ncyBhIG1lc3NhZ2UgYXQgdGhlIEluZm8gbGV2ZWwuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqL1xuICBpbmZvKG1zZzogU3RyaW5nTGlrZSk6IHZvaWQge1xuICAgIHRoaXMubG9nKExvZ0xldmVsLmluZm8sIG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSBkZWJ1ZyBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBMb2dzIGEgbWVzc2FnZSBhdCB0aGUgRGVidWcgbGV2ZWwuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqL1xuICBkZWJ1Zyhtc2c6IFN0cmluZ0xpa2UpOiB2b2lkIHtcbiAgICB0aGlzLmxvZyhMb2dMZXZlbC5kZWJ1ZywgbXNnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhbiBlcnJvciBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBMb2dzIGEgbWVzc2FnZSBhdCB0aGUgRXJyb3IgbGV2ZWwuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqL1xuICBlcnJvcihtc2c6IFN0cmluZ0xpa2UgfCBFcnJvcik6IHZvaWQge1xuICAgIHRoaXMubG9nKExvZ0xldmVsLmVycm9yLCBtc2cpO1xuICB9XG5cbiAgc2V0Q29uZmlnKGNvbmZpZzogUGFydGlhbDxMb2dnaW5nQ29uZmlnPikge1xuICAgIHRoaXMuY29uZiA9IHsgLi4uKHRoaXMuY29uZiB8fCB7fSksIC4uLmNvbmZpZyB9O1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgc3RhdGljIGNsYXNzIGZvciBtYW5hZ2luZyBsb2dnaW5nIG9wZXJhdGlvbnMuXG4gKiBAc3VtbWFyeSBUaGUgTG9nZ2luZyBjbGFzcyBwcm92aWRlcyBhIGNlbnRyYWxpemVkIGxvZ2dpbmcgbWVjaGFuaXNtIHdpdGggc3VwcG9ydCBmb3JcbiAqIGRpZmZlcmVudCBsb2cgbGV2ZWxzIGFuZCB2ZXJib3NpdHkuIEl0IHVzZXMgYSBzaW5nbGV0b24gcGF0dGVybiB0byBtYWludGFpbiBhIGdsb2JhbFxuICogbG9nZ2VyIGluc3RhbmNlIGFuZCBhbGxvd3MgY3JlYXRpbmcgc3BlY2lmaWMgbG9nZ2VycyBmb3IgZGlmZmVyZW50IGNsYXNzZXMgYW5kIG1ldGhvZHMuXG4gKlxuICogQGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dnaW5nIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgZ2xvYmFsIGxvZ2dlciBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgQSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgVmVyYm9zaXR5TG9nZ2VyIHVzZWQgZm9yIGdsb2JhbCBsb2dnaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2xvYmFsPzogVmVyYm9zaXR5TG9nZ2VyO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRmFjdG9yeSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgbG9nZ2VyIGluc3RhbmNlcy5cbiAgICogQHN1bW1hcnkgQSBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgbmV3IFZlcmJvc2l0eUxvZ2dlciBpbnN0YW5jZXMuIEJ5IGRlZmF1bHQsIGl0IGNyZWF0ZXMgYSBNaW5pTG9nZ2VyLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX2ZhY3Rvcnk6IChcbiAgICBvYmplY3Q6IHN0cmluZyxcbiAgICBjb25maWc/OiBQYXJ0aWFsPExvZ2dpbmdDb25maWc+LFxuICAgIGlkPzogc3RyaW5nXG4gICkgPT4gVmVyYm9zaXR5TG9nZ2VyID0gKFxuICAgIG9iamVjdDogc3RyaW5nLFxuICAgIGNvbmZpZz86IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz4sXG4gICAgaWQ/OiBzdHJpbmdcbiAgKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBNaW5pTG9nZ2VyKG9iamVjdCwgY29uZmlnLCBpZCk7XG4gIH07XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29uZmlndXJhdGlvbiBmb3IgdGhlIGxvZ2dpbmcgc3lzdGVtLlxuICAgKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGdsb2JhbCB2ZXJib3NpdHkgbGV2ZWwgYW5kIGxvZyBsZXZlbCBzZXR0aW5ncy5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9jb25maWc6IExvZ2dpbmdDb25maWcgPSBEZWZhdWx0TG9nZ2luZ0NvbmZpZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCBpbnN0YW50aWF0aW9uLlxuICAgKiBAc3VtbWFyeSBFbnN1cmVzIHRoYXQgdGhlIExvZ2dpbmcgY2xhc3MgY2Fubm90IGJlIGluc3RhbnRpYXRlZCBhcyBpdCdzIGRlc2lnbmVkIHRvIGJlIHVzZWQgc3RhdGljYWxseS5cbiAgICovXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0dGVyIGZvciB0aGUgbG9nZ2luZyBjb25maWd1cmF0aW9uLlxuICAgKiBAc3VtbWFyeSBBbGxvd3MgdXBkYXRpbmcgdGhlIGdsb2JhbCBsb2dnaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBBbiBvYmplY3QgY29udGFpbmluZyB2ZXJib3NpdHkgYW5kIGxvZyBsZXZlbCBzZXR0aW5ncy5cbiAgICovXG4gIHN0YXRpYyBzZXRDb25maWcoY29uZmlnOiBQYXJ0aWFsPExvZ2dpbmdDb25maWc+KSB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLl9jb25maWcsIGNvbmZpZyk7XG4gIH1cblxuICBzdGF0aWMgZ2V0Q29uZmlnKCk6IExvZ2dpbmdDb25maWcge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9jb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgb3IgY3JlYXRlcyB0aGUgZ2xvYmFsIGxvZ2dlciBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgZXhpc3RpbmcgZ2xvYmFsIGxvZ2dlciBvciBjcmVhdGVzIGEgbmV3IG9uZSBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuICAgKlxuICAgKiBAcmV0dXJuIFRoZSBnbG9iYWwgVmVyYm9zaXR5TG9nZ2VyIGluc3RhbmNlLlxuICAgKi9cbiAgc3RhdGljIGdldCgpOiBWZXJib3NpdHlMb2dnZXIge1xuICAgIHRoaXMuZ2xvYmFsID0gdGhpcy5nbG9iYWwgPyB0aGlzLmdsb2JhbCA6IHRoaXMuX2ZhY3RvcnkoXCJMb2dnaW5nXCIpO1xuICAgIHJldHVybiB0aGlzLmdsb2JhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIHZlcmJvc2UgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgRGVsZWdhdGVzIHRoZSB2ZXJib3NlIGxvZ2dpbmcgdG8gdGhlIGdsb2JhbCBsb2dnZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqIEBwYXJhbSB2ZXJib3NpdHkgLSBUaGUgdmVyYm9zaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChkZWZhdWx0OiAwKS5cbiAgICovXG4gIHN0YXRpYyB2ZXJib3NlKG1zZzogU3RyaW5nTGlrZSwgdmVyYm9zaXR5OiBudW1iZXIgPSAwKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCkudmVyYm9zZShtc2csIHZlcmJvc2l0eSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYW4gaW5mbyBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdGhlIGluZm8gbG9nZ2luZyB0byB0aGUgZ2xvYmFsIGxvZ2dlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIHN0YXRpYyBpbmZvKG1zZzogU3RyaW5nTGlrZSk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmdldCgpLmluZm8obXNnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIGRlYnVnIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IERlbGVnYXRlcyB0aGUgZGVidWcgbG9nZ2luZyB0byB0aGUgZ2xvYmFsIGxvZ2dlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIHN0YXRpYyBkZWJ1Zyhtc2c6IFN0cmluZ0xpa2UpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoKS5kZWJ1Zyhtc2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGEgc2lsbHkgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgRGVsZWdhdGVzIHRoZSBkZWJ1ZyBsb2dnaW5nIHRvIHRoZSBnbG9iYWwgbG9nZ2VyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgc3RhdGljIHNpbGx5KG1zZzogU3RyaW5nTGlrZSk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmdldCgpLnNpbGx5KG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYW4gZXJyb3IgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgRGVsZWdhdGVzIHRoZSBlcnJvciBsb2dnaW5nIHRvIHRoZSBnbG9iYWwgbG9nZ2VyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgc3RhdGljIGVycm9yKG1zZzogU3RyaW5nTGlrZSk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmdldCgpLmVycm9yKG1zZyk7XG4gIH1cblxuICBzdGF0aWMgZm9yKFxuICAgIG9iamVjdDogTG9nZ2luZ0NvbnRleHQsXG4gICAgaWQ/OiBzdHJpbmcgfCBQYXJ0aWFsPExvZ2dpbmdDb25maWc+LFxuICAgIGNvbmZpZz86IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz5cbiAgKTogVmVyYm9zaXR5TG9nZ2VyIHtcbiAgICBvYmplY3QgPSB0eXBlb2Ygb2JqZWN0ID09PSBcInN0cmluZ1wiID8gb2JqZWN0IDogb2JqZWN0Lm5hbWU7XG4gICAgaWQgPSB0eXBlb2YgaWQgPT09IFwic3RyaW5nXCIgPyBpZCA6IHVuZGVmaW5lZDtcbiAgICBjb25maWcgPSB0eXBlb2YgaWQgPT09IFwib2JqZWN0XCIgPyAoaWQgYXMgUGFydGlhbDxMb2dnaW5nQ29uZmlnPikgOiBjb25maWc7XG4gICAgcmV0dXJuIHRoaXMuX2ZhY3Rvcnkob2JqZWN0LCBjb25maWcsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGxvZ2dlciBmb3IgYSBzcGVjaWZpYyByZWFzb24gb3IgY29udGV4dC5cbiAgICpcbiAgICogQHN1bW1hcnkgVGhpcyBzdGF0aWMgbWV0aG9kIGNyZWF0ZXMgYSBuZXcgbG9nZ2VyIGluc3RhbmNlIHVzaW5nIHRoZSBmYWN0b3J5IGZ1bmN0aW9uLFxuICAgKiBiYXNlZCBvbiBhIGdpdmVuIHJlYXNvbiBvciBjb250ZXh0LlxuICAgKlxuICAgKiBAcGFyYW0gcmVhc29uIC0gQSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcmVhc29uIG9yIGNvbnRleHQgZm9yIGNyZWF0aW5nIHRoaXMgbG9nZ2VyLlxuICAgKiBAcGFyYW0gaWRcbiAgICogQHJldHVybnMgQSBuZXcgVmVyYm9zaXR5TG9nZ2VyIG9yIENsYXNzTG9nZ2VyIGluc3RhbmNlLlxuICAgKi9cbiAgc3RhdGljIGJlY2F1c2UocmVhc29uOiBzdHJpbmcsIGlkPzogc3RyaW5nKTogVmVyYm9zaXR5TG9nZ2VyIHtcbiAgICByZXR1cm4gdGhpcy5fZmFjdG9yeShyZWFzb24sIHRoaXMuX2NvbmZpZywgaWQpO1xuICB9XG5cbiAgc3RhdGljIHRoZW1lKFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICB0eXBlOiBrZXlvZiBUaGVtZSB8IGtleW9mIExvZ0xldmVsLFxuICAgIGxvZ2dlckxldmVsOiBMb2dMZXZlbCxcbiAgICB0ZW1wbGF0ZTogVGhlbWUgPSBEZWZhdWx0VGhlbWVcbiAgKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcuc3R5bGUpIHJldHVybiB0ZXh0O1xuICAgIGNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZ2V0KCkuZm9yKHRoaXMudGhlbWUpO1xuXG4gICAgZnVuY3Rpb24gYXBwbHkoXG4gICAgICB0eHQ6IHN0cmluZyxcbiAgICAgIG9wdGlvbjoga2V5b2YgVGhlbWVPcHRpb24sXG4gICAgICB2YWx1ZTogbnVtYmVyIHwgW251bWJlcl0gfCBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gfCBudW1iZXJbXSB8IHN0cmluZ1tdXG4gICAgKTogc3RyaW5nIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHQ6IHN0cmluZyB8IFN0eWxlZFN0cmluZyA9IHR4dDtcbiAgICAgICAgbGV0IGMgPSBzdHlsZSh0KTtcblxuICAgICAgICBmdW5jdGlvbiBhcHBseUNvbG9yKFxuICAgICAgICAgIHZhbDogbnVtYmVyIHwgW251bWJlcl0gfCBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICAgICAgaXNCZyA9IGZhbHNlXG4gICAgICAgICk6IFN0eWxlZFN0cmluZyB7XG4gICAgICAgICAgbGV0IGY6XG4gICAgICAgICAgICB8IHR5cGVvZiBjLmJhY2tncm91bmRcbiAgICAgICAgICAgIHwgdHlwZW9mIGMuZm9yZWdyb3VuZFxuICAgICAgICAgICAgfCB0eXBlb2YgYy5yZ2JcbiAgICAgICAgICAgIHwgdHlwZW9mIGMuY29sb3IyNTYgPSBpc0JnID8gYy5iYWNrZ3JvdW5kIDogYy5mb3JlZ3JvdW5kO1xuICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gKGYgYXMgdHlwZW9mIGMuYmFja2dyb3VuZCB8IHR5cGVvZiBjLmZvcmVncm91bmQpLmNhbGwoXG4gICAgICAgICAgICAgIGMsXG4gICAgICAgICAgICAgIHZhbHVlIGFzIG51bWJlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3dpdGNoICh2YWwubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgIGYgPSBpc0JnID8gYy5iZ0NvbG9yMjU2IDogYy5jb2xvcjI1NjtcbiAgICAgICAgICAgICAgcmV0dXJuIChmIGFzIHR5cGVvZiBjLmJnQ29sb3IyNTYgfCB0eXBlb2YgYy5jb2xvcjI1NikodmFsWzBdKTtcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgZiA9IGlzQmcgPyBjLmJnUmdiIDogYy5yZ2I7XG4gICAgICAgICAgICAgIHJldHVybiBjLnJnYih2YWxbMF0sIHZhbFsxXSwgdmFsWzJdKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90IGEgdmFsaWQgY29sb3Igb3B0aW9uOiAke29wdGlvbn1gKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHN0eWxlKHQgYXMgc3RyaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBhcHBseVN0eWxlKHY6IG51bWJlciB8IHN0cmluZyk6IHZvaWQge1xuICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgYyA9IGMuc3R5bGUodik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGMgPSBjW3YgYXMga2V5b2YgQ29sb3JpemVPcHRpb25zXSBhcyBTdHlsZWRTdHJpbmc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChvcHRpb24pIHtcbiAgICAgICAgICBjYXNlIFwiYmdcIjpcbiAgICAgICAgICBjYXNlIFwiZmdcIjpcbiAgICAgICAgICAgIHJldHVybiBhcHBseUNvbG9yKHZhbHVlIGFzIG51bWJlcikudGV4dDtcbiAgICAgICAgICBjYXNlIFwic3R5bGVcIjpcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKGFwcGx5U3R5bGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYXBwbHlTdHlsZSh2YWx1ZSBhcyBudW1iZXIgfCBzdHJpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGMudGV4dDtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3QgYSB2YWxpZCB0aGVtZSBvcHRpb246ICR7b3B0aW9ufWApO1xuICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYEVycm9yIGFwcGx5aW5nIHN0eWxlOiAke29wdGlvbn0gd2l0aCB2YWx1ZSAke3ZhbHVlfWApO1xuICAgICAgICByZXR1cm4gdHh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGluZGl2aWR1YWxUaGVtZSA9IHRlbXBsYXRlW3R5cGUgYXMga2V5b2YgVGhlbWVdO1xuICAgIGlmICghaW5kaXZpZHVhbFRoZW1lIHx8ICFPYmplY3Qua2V5cyhpbmRpdmlkdWFsVGhlbWUpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgbGV0IGFjdHVhbFRoZW1lOiBUaGVtZU9wdGlvbiA9IGluZGl2aWR1YWxUaGVtZSBhcyBUaGVtZU9wdGlvbjtcblxuICAgIGNvbnN0IGxvZ0xldmVscyA9IE9iamVjdC5hc3NpZ24oe30sIExvZ0xldmVsKTtcbiAgICBpZiAoT2JqZWN0LmtleXMoaW5kaXZpZHVhbFRoZW1lKVswXSBpbiBsb2dMZXZlbHMpXG4gICAgICBhY3R1YWxUaGVtZSA9XG4gICAgICAgIChpbmRpdmlkdWFsVGhlbWUgYXMgVGhlbWVPcHRpb25CeUxvZ0xldmVsKVtsb2dnZXJMZXZlbF0gfHwge307XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoYWN0dWFsVGhlbWUpLnJlZHVjZSgoYWNjOiBzdHJpbmcsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSAoYWN0dWFsVGhlbWUgYXMgVGhlbWVPcHRpb24pW2tleSBhcyBrZXlvZiBUaGVtZU9wdGlvbl07XG4gICAgICBpZiAodmFsKVxuICAgICAgICByZXR1cm4gYXBwbHkoXG4gICAgICAgICAgYWNjLFxuICAgICAgICAgIGtleSBhcyBrZXlvZiBUaGVtZU9wdGlvbixcbiAgICAgICAgICB2YWwgYXNcbiAgICAgICAgICAgIHwgbnVtYmVyXG4gICAgICAgICAgICB8IFtudW1iZXJdXG4gICAgICAgICAgICB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXVxuICAgICAgICAgICAgfCBudW1iZXJbXVxuICAgICAgICAgICAgfCBzdHJpbmdbXVxuICAgICAgICApO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB0ZXh0KTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQW5zd2VycyxcbiAgQ2hvaWNlLFxuICBGYWxzeSxcbiAgSW5pdGlhbFJldHVyblZhbHVlLFxuICBQcmV2Q2FsbGVyLFxuICBQcm9tcHRPYmplY3QsXG4gIFByb21wdFR5cGUsXG4gIFZhbHVlT3JGdW5jLFxufSBmcm9tIFwicHJvbXB0c1wiO1xuaW1wb3J0IHByb21wdHMgZnJvbSBcInByb21wdHNcIjtcbmltcG9ydCB7IHBhcnNlQXJncywgUGFyc2VBcmdzQ29uZmlnIH0gZnJvbSBcInV0aWxcIjtcbmltcG9ydCB7IFdyaXRhYmxlLCBSZWFkYWJsZSB9IGZyb20gXCJzdHJlYW1cIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiLi4vb3V0cHV0L2xvZ2dpbmdcIjtcbmltcG9ydCB7IEtsZXVyIH0gZnJvbSBcIi4uL291dHB1dC90eXBlc1wiO1xuaW1wb3J0IHsgUGFyc2VBcmdzT3B0aW9uc0NvbmZpZywgUGFyc2VBcmdzUmVzdWx0IH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwcmVzZW50cyBhIHVzZXIgaW5wdXQgcHJvbXB0IHdpdGggdmFyaW91cyBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gKiBAc3VtbWFyeSBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgZmxleGlibGUgaW50ZXJmYWNlIGZvciBjcmVhdGluZyBhbmQgbWFuYWdpbmcgdXNlciBpbnB1dCBwcm9tcHRzLlxuICogSXQgaW1wbGVtZW50cyB0aGUgUHJvbXB0T2JqZWN0IGludGVyZmFjZSBmcm9tIHRoZSAncHJvbXB0cycgbGlicmFyeSBhbmQgb2ZmZXJzIG1ldGhvZHMgdG8gc2V0XG4gKiB2YXJpb3VzIHByb3BlcnRpZXMgb2YgdGhlIHByb21wdC4gVGhlIGNsYXNzIGFsc28gaW5jbHVkZXMgc3RhdGljIG1ldGhvZHMgZm9yIGNvbW1vbiBpbnB1dCBzY2VuYXJpb3NcbiAqIGFuZCBhcmd1bWVudCBwYXJzaW5nLlxuICpcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHR5cGUgb2YgdGhlIHByb21wdCBuYW1lLCBleHRlbmRpbmcgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb21wdCwgdXNlZCBhcyB0aGUga2V5IGluIHRoZSByZXR1cm5lZCBhbnN3ZXJzIG9iamVjdC5cbiAqXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIFVzZXJJbnB1dDxSIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiBpbXBsZW1lbnRzIFByb21wdE9iamVjdDxSPiB7XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGxvZ2dlciA9IExvZ2dpbmcuZm9yKFVzZXJJbnB1dCk7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHR5cGUgb2YgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyB0aGUgaW5wdXQgbWV0aG9kIChlLmcuLCB0ZXh0LCBudW1iZXIsIGNvbmZpcm0pLlxuICAgKi9cbiAgdHlwZTogUHJvbXB0VHlwZSB8IEZhbHN5IHwgUHJldkNhbGxlcjxSLCBQcm9tcHRUeXBlIHwgRmFsc3k+ID0gXCJ0ZXh0XCI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbmFtZSBvZiB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBVc2VkIGFzIHRoZSBrZXkgaW4gdGhlIHJldHVybmVkIGFuc3dlcnMgb2JqZWN0LlxuICAgKi9cbiAgbmFtZTogVmFsdWVPckZ1bmM8Uj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbWVzc2FnZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAqIEBzdW1tYXJ5IFRoZSBxdWVzdGlvbiBvciBpbnN0cnVjdGlvbiBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuXG4gICAqL1xuICBtZXNzYWdlPzogVmFsdWVPckZ1bmM8c3RyaW5nPiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IFRoZSBkZWZhdWx0IHZhbHVlIHByZXNlbnRlZCB0byB0aGUgdXNlci5cbiAgICovXG4gIGluaXRpYWw/OlxuICAgIHwgSW5pdGlhbFJldHVyblZhbHVlXG4gICAgfCBQcmV2Q2FsbGVyPFIsIEluaXRpYWxSZXR1cm5WYWx1ZSB8IFByb21pc2U8SW5pdGlhbFJldHVyblZhbHVlPj5cbiAgICB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzdHlsZSBvZiB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHRoZSB2aXN1YWwgc3R5bGUgb2YgdGhlIHByb21wdC5cbiAgICovXG4gIHN0eWxlPzogc3RyaW5nIHwgUHJldkNhbGxlcjxSLCBzdHJpbmcgfCBGYWxzeT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgZm9ybWF0IGZ1bmN0aW9uIGZvciB0aGUgaW5wdXQuXG4gICAqIEBzdW1tYXJ5IEEgZnVuY3Rpb24gdG8gZm9ybWF0IHRoZSB1c2VyJ3MgaW5wdXQgYmVmb3JlIGl0J3MgcmV0dXJuZWQuXG4gICAqL1xuICBmb3JtYXQ/OiBQcmV2Q2FsbGVyPFIsIHZvaWQ+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHZhbGlkYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBpbnB1dC5cbiAgICogQHN1bW1hcnkgQSBmdW5jdGlvbiB0byB2YWxpZGF0ZSB0aGUgdXNlcidzIGlucHV0LlxuICAgKi9cbiAgdmFsaWRhdGU/OlxuICAgIHwgUHJldkNhbGxlcjxSLCBib29sZWFuIHwgc3RyaW5nIHwgUHJvbWlzZTxib29sZWFuIHwgc3RyaW5nPj5cbiAgICB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBvblN0YXRlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKiBAc3VtbWFyeSBBIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBzdGF0ZSBvZiB0aGUgcHJvbXB0IGNoYW5nZXMuXG4gICAqL1xuICBvblN0YXRlPzogUHJldkNhbGxlcjxSLCB2b2lkPiB8IHVuZGVmaW5lZDtcblxuICBvblJlbmRlcj86ICgoa2xldXI6IEtsZXVyKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBtaW5pbXVtIHZhbHVlIGZvciBudW1iZXIgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBUaGUgbG93ZXN0IG51bWJlciB0aGUgdXNlciBjYW4gaW5wdXQuXG4gICAqL1xuICBtaW4/OiBudW1iZXIgfCBQcmV2Q2FsbGVyPFIsIG51bWJlciB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBtYXhpbXVtIHZhbHVlIGZvciBudW1iZXIgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBUaGUgaGlnaGVzdCBudW1iZXIgdGhlIHVzZXIgY2FuIGlucHV0LlxuICAgKi9cbiAgbWF4PzogbnVtYmVyIHwgUHJldkNhbGxlcjxSLCBudW1iZXIgfCBGYWxzeT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBXaGV0aGVyIHRvIGFsbG93IGZsb2F0IHZhbHVlcyBmb3IgbnVtYmVyIGlucHV0cy5cbiAgICogQHN1bW1hcnkgSWYgdHJ1ZSwgYWxsb3dzIGRlY2ltYWwgbnVtYmVycy5cbiAgICovXG4gIGZsb2F0PzogYm9vbGVhbiB8IFByZXZDYWxsZXI8UiwgYm9vbGVhbiB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdG8gcm91bmQgdG8gZm9yIGZsb2F0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyB0aGUgcHJlY2lzaW9uIG9mIGZsb2F0IGlucHV0cy5cbiAgICovXG4gIHJvdW5kPzogbnVtYmVyIHwgUHJldkNhbGxlcjxSLCBudW1iZXIgfCBGYWxzeT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbnN0cnVjdGlvbnMgZm9yIHRoZSB1c2VyLlxuICAgKiBAc3VtbWFyeSBBZGRpdGlvbmFsIGd1aWRhbmNlIHByb3ZpZGVkIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgaW5zdHJ1Y3Rpb25zPzogc3RyaW5nIHwgYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBpbmNyZW1lbnQgdmFsdWUgZm9yIG51bWJlciBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IFRoZSBzdGVwIHNpemUgd2hlbiBpbmNyZWFzaW5nIG9yIGRlY3JlYXNpbmcgdGhlIG51bWJlci5cbiAgICovXG4gIGluY3JlbWVudD86IG51bWJlciB8IFByZXZDYWxsZXI8UiwgbnVtYmVyIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHNlcGFyYXRvciBmb3IgbGlzdCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IFRoZSBjaGFyYWN0ZXIgdXNlZCB0byBzZXBhcmF0ZSBsaXN0IGl0ZW1zLlxuICAgKi9cbiAgc2VwYXJhdG9yPzogc3RyaW5nIHwgUHJldkNhbGxlcjxSLCBzdHJpbmcgfCBGYWxzeT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgYWN0aXZlIG9wdGlvbiBzdHlsZSBmb3Igc2VsZWN0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgVGhlIHN0eWxlIGFwcGxpZWQgdG8gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb24uXG4gICAqL1xuICBhY3RpdmU/OiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBpbmFjdGl2ZSBvcHRpb24gc3R5bGUgZm9yIHNlbGVjdCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IFRoZSBzdHlsZSBhcHBsaWVkIHRvIG5vbi1zZWxlY3RlZCBvcHRpb25zLlxuICAgKi9cbiAgaW5hY3RpdmU/OiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICBjaG9pY2VzPzogQ2hvaWNlW10gfCBQcmV2Q2FsbGVyPFIsIENob2ljZVtdIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGhpbnQgdGV4dCBmb3IgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAqL1xuICBoaW50Pzogc3RyaW5nIHwgUHJldkNhbGxlcjxSLCBzdHJpbmcgfCBGYWxzeT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgd2FybmluZyB0ZXh0IGZvciB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBBIHdhcm5pbmcgbWVzc2FnZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAqL1xuICB3YXJuPzogc3RyaW5nIHwgUHJldkNhbGxlcjxSLCBzdHJpbmcgfCBGYWxzeT4gfCB1bmRlZmluZWQ7XG5cbiAgc3VnZ2VzdD86ICgoaW5wdXQ6IGFueSwgY2hvaWNlczogQ2hvaWNlW10pID0+IFByb21pc2U8YW55PikgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbGltaXQgZm9yIGxpc3QgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBUaGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdGhhdCBjYW4gYmUgc2VsZWN0ZWQuXG4gICAqL1xuICBsaW1pdD86IG51bWJlciB8IFByZXZDYWxsZXI8UiwgbnVtYmVyIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIG1hc2sgZm9yIHBhc3N3b3JkIGlucHV0cy5cbiAgICogQHN1bW1hcnkgVGhlIGNoYXJhY3RlciB1c2VkIHRvIGhpZGUgdGhlIHVzZXIncyBpbnB1dC5cbiAgICovXG4gIG1hc2s/OiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzdGRvdXQgc3RyZWFtIGZvciB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBUaGUgb3V0cHV0IHN0cmVhbSB1c2VkIGJ5IHRoZSBwcm9tcHQuXG4gICAqL1xuICBzdGRvdXQ/OiBXcml0YWJsZSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzdGRpbiBzdHJlYW0gZm9yIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IFRoZSBpbnB1dCBzdHJlYW0gdXNlZCBieSB0aGUgcHJvbXB0LlxuICAgKi9cbiAgc3RkaW4/OiBSZWFkYWJsZSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgVXNlcklucHV0IGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIG5ldyBVc2VySW5wdXQgb2JqZWN0IHdpdGggdGhlIGdpdmVuIG5hbWUuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb21wdC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG5hbWU6IFZhbHVlT3JGdW5jPFI+KSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgdHlwZSBvZiB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSBpbnB1dCBtZXRob2QgZm9yIHRoZSBwcm9tcHQuXG4gICAqXG4gICAqIEBwYXJhbSB0eXBlIC0gVGhlIHR5cGUgb2YgdGhlIHByb21wdC5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldFR5cGUodHlwZTogUHJvbXB0VHlwZSB8IEZhbHN5IHwgUHJldkNhbGxlcjxSLCBQcm9tcHRUeXBlIHwgRmFsc3k+KTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIHR5cGUgdG86ICR7dHlwZX1gKTtcbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBtZXNzYWdlIG9mIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIHF1ZXN0aW9uIG9yIGluc3RydWN0aW9uIHByZXNlbnRlZCB0byB0aGUgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0TWVzc2FnZSh2YWx1ZTogVmFsdWVPckZ1bmM8c3RyaW5nPiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBtZXNzYWdlIHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMubWVzc2FnZSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIGRlZmF1bHQgdmFsdWUgcHJlc2VudGVkIHRvIHRoZSB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldEluaXRpYWwoXG4gICAgdmFsdWU6XG4gICAgICB8IEluaXRpYWxSZXR1cm5WYWx1ZVxuICAgICAgfCBQcmV2Q2FsbGVyPFIsIEluaXRpYWxSZXR1cm5WYWx1ZSB8IFByb21pc2U8SW5pdGlhbFJldHVyblZhbHVlPj5cbiAgICAgIHwgdW5kZWZpbmVkXG4gICk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBpbml0aWFsIHZhbHVlIHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMuaW5pdGlhbCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBzdHlsZSBvZiB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSB2aXN1YWwgc3R5bGUgb2YgdGhlIHByb21wdC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHN0eWxlIHRvIGJlIGFwcGxpZWQuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRTdHlsZSh2YWx1ZTogc3RyaW5nIHwgUHJldkNhbGxlcjxSLCBzdHJpbmcgfCBGYWxzeT4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgc3R5bGUgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5zdHlsZSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBmb3JtYXQgZnVuY3Rpb24gb2YgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyBhIGZ1bmN0aW9uIHRvIGZvcm1hdCB0aGUgdXNlcidzIGlucHV0IGJlZm9yZSBpdCdzIHJldHVybmVkLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgZm9ybWF0IGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0Rm9ybWF0KHZhbHVlOiBQcmV2Q2FsbGVyPFIsIHZvaWQ+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIGZvcm1hdCBmdW5jdGlvbmApO1xuICAgIHRoaXMuZm9ybWF0ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHZhbGlkYXRpb24gZnVuY3Rpb24gb2YgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyBhIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIHRoZSB1c2VyJ3MgaW5wdXQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWxpZGF0aW9uIGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0VmFsaWRhdGUoXG4gICAgdmFsdWU6XG4gICAgICB8IFByZXZDYWxsZXI8UiwgYm9vbGVhbiB8IHN0cmluZyB8IFByb21pc2U8Ym9vbGVhbiB8IHN0cmluZz4+XG4gICAgICB8IHVuZGVmaW5lZFxuICApOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgdmFsaWRhdGUgZnVuY3Rpb25gKTtcbiAgICB0aGlzLnZhbGlkYXRlID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIG9uU3RhdGUgY2FsbGJhY2sgb2YgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBzdGF0ZSBvZiB0aGUgcHJvbXB0IGNoYW5nZXMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBvblN0YXRlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0T25TdGF0ZSh2YWx1ZTogUHJldkNhbGxlcjxSLCB2b2lkPiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBvblN0YXRlIGNhbGxiYWNrYCk7XG4gICAgdGhpcy5vblN0YXRlID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIG9uUmVuZGVyIGNhbGxiYWNrIG9mIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgcHJvbXB0IGlzIHJlbmRlcmVkLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgb25SZW5kZXIgY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRPblJlbmRlcih2YWx1ZTogKChrbGV1cjogS2xldXIpID0+IHZvaWQpIHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIG9uUmVuZGVyIGNhbGxiYWNrYCk7XG4gICAgdGhpcy5vblJlbmRlciA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBtaW5pbXVtIHZhbHVlIGZvciBudW1iZXIgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSBsb3dlc3QgbnVtYmVyIHRoZSB1c2VyIGNhbiBpbnB1dC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIG1pbmltdW0gdmFsdWUuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRNaW4odmFsdWU6IG51bWJlciB8IFByZXZDYWxsZXI8UiwgbnVtYmVyIHwgRmFsc3k+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIG1pbiB2YWx1ZSB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLm1pbiA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBtYXhpbXVtIHZhbHVlIGZvciBudW1iZXIgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSBoaWdoZXN0IG51bWJlciB0aGUgdXNlciBjYW4gaW5wdXQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBtYXhpbXVtIHZhbHVlLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0TWF4KHZhbHVlOiBudW1iZXIgfCBQcmV2Q2FsbGVyPFIsIG51bWJlciB8IEZhbHN5PiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBtYXggdmFsdWUgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5tYXggPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB3aGV0aGVyIHRvIGFsbG93IGZsb2F0IHZhbHVlcyBmb3IgbnVtYmVyIGlucHV0cy5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB3aGV0aGVyIGRlY2ltYWwgbnVtYmVycyBhcmUgYWxsb3dlZC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gV2hldGhlciB0byBhbGxvdyBmbG9hdCB2YWx1ZXMuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRGbG9hdCh2YWx1ZTogYm9vbGVhbiB8IFByZXZDYWxsZXI8UiwgYm9vbGVhbiB8IEZhbHN5PiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBmbG9hdCB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLmZsb2F0ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0byByb3VuZCB0byBmb3IgZmxvYXQgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSBwcmVjaXNpb24gb2YgZmxvYXQgaW5wdXRzLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0Um91bmQodmFsdWU6IG51bWJlciB8IFByZXZDYWxsZXI8UiwgbnVtYmVyIHwgRmFsc3k+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIHJvdW5kIHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMucm91bmQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgdXNlci5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyBhZGRpdGlvbmFsIGd1aWRhbmNlIHByb3ZpZGVkIHRvIHRoZSB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgaW5zdHJ1Y3Rpb25zLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0SW5zdHJ1Y3Rpb25zKHZhbHVlOiBzdHJpbmcgfCBib29sZWFuIHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIGluc3RydWN0aW9ucyB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLmluc3RydWN0aW9ucyA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBpbmNyZW1lbnQgdmFsdWUgZm9yIG51bWJlciBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIHN0ZXAgc2l6ZSB3aGVuIGluY3JlYXNpbmcgb3IgZGVjcmVhc2luZyB0aGUgbnVtYmVyLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgaW5jcmVtZW50IHZhbHVlLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0SW5jcmVtZW50KFxuICAgIHZhbHVlOiBudW1iZXIgfCBQcmV2Q2FsbGVyPFIsIG51bWJlciB8IEZhbHN5PiB8IHVuZGVmaW5lZFxuICApOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgaW5jcmVtZW50IHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMuaW5jcmVtZW50ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHNlcGFyYXRvciBmb3IgbGlzdCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIGNoYXJhY3RlciB1c2VkIHRvIHNlcGFyYXRlIGxpc3QgaXRlbXMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBzZXBhcmF0b3IgY2hhcmFjdGVyLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0U2VwYXJhdG9yKFxuICAgIHZhbHVlOiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZFxuICApOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgc2VwYXJhdG9yIHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMuc2VwYXJhdG9yID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGFjdGl2ZSBvcHRpb24gc3R5bGUgZm9yIHNlbGVjdCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIHN0eWxlIGFwcGxpZWQgdG8gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBvcHRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBhY3RpdmUgb3B0aW9uIHN0eWxlLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0QWN0aXZlKHZhbHVlOiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBhY3RpdmUgc3R5bGUgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5hY3RpdmUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgaW5hY3RpdmUgb3B0aW9uIHN0eWxlIGZvciBzZWxlY3QgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSBzdHlsZSBhcHBsaWVkIHRvIG5vbi1zZWxlY3RlZCBvcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgaW5hY3RpdmUgb3B0aW9uIHN0eWxlLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0SW5hY3RpdmUodmFsdWU6IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIGluYWN0aXZlIHN0eWxlIHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMuaW5hY3RpdmUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHNldENob2ljZXMoXG4gICAgdmFsdWU6IENob2ljZVtdIHwgUHJldkNhbGxlcjxSLCBDaG9pY2VbXSB8IEZhbHN5PiB8IHVuZGVmaW5lZFxuICApOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgY2hvaWNlczogJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YCk7XG4gICAgdGhpcy5jaG9pY2VzID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGhpbnQgdGV4dCBmb3IgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGRpc3BsYXllZCB0byB0aGUgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGhpbnQgdGV4dC5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldEhpbnQodmFsdWU6IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIGhpbnQgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5oaW50ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHdhcm5pbmcgdGV4dCBmb3IgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyBhIHdhcm5pbmcgbWVzc2FnZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB3YXJuaW5nIHRleHQuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRXYXJuKHZhbHVlOiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyB3YXJuIHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMud2FybiA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0U3VnZ2VzdChcbiAgICB2YWx1ZTogKChpbnB1dDogYW55LCBjaG9pY2VzOiBDaG9pY2VbXSkgPT4gUHJvbWlzZTxhbnk+KSB8IHVuZGVmaW5lZFxuICApOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgc3VnZ2VzdCBmdW5jdGlvbmApO1xuICAgIHRoaXMuc3VnZ2VzdCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBsaW1pdCBmb3IgbGlzdCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRoYXQgY2FuIGJlIHNlbGVjdGVkIGluIGxpc3QtdHlwZSBwcm9tcHRzLlxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSB0eXBlIG9mIHRoZSBwcm9tcHQgbmFtZSwgZXh0ZW5kaW5nIHN0cmluZy5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRoYXQgY2FuIGJlIHNlbGVjdGVkLCBvciBhIGZ1bmN0aW9uIHRvIGRldGVybWluZSB0aGlzIHZhbHVlLlxuICAgKiBAcmV0dXJuIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRMaW1pdCh2YWx1ZTogbnVtYmVyIHwgUHJldkNhbGxlcjxSLCBudW1iZXIgfCBGYWxzeT4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgbGltaXQgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5saW1pdCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBtYXNrIGZvciBwYXNzd29yZCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIGNoYXJhY3RlciB1c2VkIHRvIGhpZGUgdGhlIHVzZXIncyBpbnB1dCBpbiBwYXNzd29yZC10eXBlIHByb21wdHMuXG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHR5cGUgb2YgdGhlIHByb21wdCBuYW1lLCBleHRlbmRpbmcgc3RyaW5nLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgY2hhcmFjdGVyIHVzZWQgdG8gbWFzayB0aGUgaW5wdXQsIG9yIGEgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHRoaXMgdmFsdWUuXG4gICAqIEByZXR1cm4gVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldE1hc2sodmFsdWU6IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIG1hc2sgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5tYXNrID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHN0ZG91dCBzdHJlYW0gZm9yIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIG91dHB1dCBzdHJlYW0gdXNlZCBieSB0aGUgcHJvbXB0IGZvciBkaXNwbGF5aW5nIG1lc3NhZ2VzIGFuZCByZXN1bHRzLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgV3JpdGFibGUgc3RyZWFtIHRvIGJlIHVzZWQgYXMgc3Rkb3V0LlxuICAgKiBAcmV0dXJuIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRTdGRvdXQodmFsdWU6IFdyaXRhYmxlIHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIHN0ZG91dCBzdHJlYW1gKTtcbiAgICB0aGlzLnN0ZG91dCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgc3RkaW4gc3RyZWFtIGZvciB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHRoZSBpbnB1dCBzdHJlYW0gdXNlZCBieSB0aGUgcHJvbXB0IGZvciByZWNlaXZpbmcgdXNlciBpbnB1dC5cbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIFJlYWRhYmxlIHN0cmVhbSB0byBiZSB1c2VkIGFzIHN0ZGluLlxuICAgKiBAcmV0dXJuIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRTdGRpbih2YWx1ZTogUmVhZGFibGUgfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICB0aGlzLnN0ZGluID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFza3MgdGhlIHVzZXIgZm9yIGlucHV0IGJhc2VkIG9uIHRoZSBjdXJyZW50IFVzZXJJbnB1dCBjb25maWd1cmF0aW9uLlxuICAgKiBAc3VtbWFyeSBQcm9tcHRzIHRoZSB1c2VyIGFuZCByZXR1cm5zIHRoZWlyIHJlc3BvbnNlIGFzIGEgc2luZ2xlIHZhbHVlLlxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSB0eXBlIG9mIHRoZSBwcm9tcHQgbmFtZSwgZXh0ZW5kaW5nIHN0cmluZy5cbiAgICogQHJldHVybiBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdXNlcidzIGFuc3dlci5cbiAgICovXG4gIGFzeW5jIGFzaygpIHtcbiAgICByZXR1cm4gKGF3YWl0IFVzZXJJbnB1dC5hc2sodGhpcykpW3RoaXMubmFtZSBhcyBrZXlvZiBBbnN3ZXJzPFI+XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXNrcyB0aGUgdXNlciBvbmUgb3IgbW9yZSBxdWVzdGlvbnMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIFVzZXJJbnB1dCBjb25maWd1cmF0aW9ucy5cbiAgICogQHN1bW1hcnkgUHJvbXB0cyB0aGUgdXNlciB3aXRoIG9uZSBvciBtb3JlIHF1ZXN0aW9ucyBhbmQgcmV0dXJucyB0aGVpciBhbnN3ZXJzIGFzIGFuIG9iamVjdC5cbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgdHlwZSBvZiB0aGUgcHJvbXB0IG5hbWUsIGV4dGVuZGluZyBzdHJpbmcuXG4gICAqIEBwYXJhbSBxdWVzdGlvbiAtIEEgc2luZ2xlIFVzZXJJbnB1dCBpbnN0YW5jZSBvciBhbiBhcnJheSBvZiBVc2VySW5wdXQgaW5zdGFuY2VzLlxuICAgKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSB1c2VyJ3MgYW5zd2Vycy5cbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgVSBhcyBVc2VyXG4gICAqICAgcGFydGljaXBhbnQgQSBhcyBhc2sgbWV0aG9kXG4gICAqICAgcGFydGljaXBhbnQgUCBhcyBwcm9tcHRzIGxpYnJhcnlcbiAgICogICBBLT4+UDogQ2FsbCBwcm9tcHRzIHdpdGggcXVlc3Rpb24ocylcbiAgICogICBQLT4+VTogRGlzcGxheSBwcm9tcHQocylcbiAgICogICBVLT4+UDogUHJvdmlkZSBpbnB1dFxuICAgKiAgIFAtPj5BOiBSZXR1cm4gYW5zd2Vyc1xuICAgKiAgIEEtPj5BOiBQcm9jZXNzIGFuc3dlcnNcbiAgICogICBBLS0+PkNhbGxlcjogUmV0dXJuIHByb2Nlc3NlZCBhbnN3ZXJzXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgYXNrPFIgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KFxuICAgIHF1ZXN0aW9uOiBVc2VySW5wdXQ8Uj4gfCBVc2VySW5wdXQ8Uj5bXVxuICApIHtcbiAgICBjb25zdCBsb2cgPSBVc2VySW5wdXQubG9nZ2VyLmZvcih0aGlzLmFzayk7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHF1ZXN0aW9uKSkge1xuICAgICAgcXVlc3Rpb24gPSBbcXVlc3Rpb25dO1xuICAgIH1cbiAgICBsZXQgYW5zd2VyczogQW5zd2VyczxSPjtcbiAgICB0cnkge1xuICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgIGBBc2tpbmcgcXVlc3Rpb25zOiAke3F1ZXN0aW9uLm1hcCgocSkgPT4gcS5uYW1lKS5qb2luKFwiLCBcIil9YFxuICAgICAgKTtcbiAgICAgIGFuc3dlcnMgPSBhd2FpdCBwcm9tcHRzKHF1ZXN0aW9uKTtcbiAgICAgIGxvZy52ZXJib3NlKGBSZWNlaXZlZCBhbnN3ZXJzOiAke0pTT04uc3RyaW5naWZ5KGFuc3dlcnMsIG51bGwsIDIpfWApO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdoaWxlIGdldHRpbmcgaW5wdXQ6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICAgIHJldHVybiBhbnN3ZXJzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBc2tzIHRoZSB1c2VyIGZvciBhIG51bWJlciBpbnB1dC5cbiAgICogQHN1bW1hcnkgUHJvbXB0cyB0aGUgdXNlciB0byBlbnRlciBhIG51bWJlciwgd2l0aCBvcHRpb25hbCBtaW5pbXVtLCBtYXhpbXVtLCBhbmQgaW5pdGlhbCB2YWx1ZXMuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb21wdCwgdXNlZCBhcyB0aGUga2V5IGluIHRoZSByZXR1cm5lZCBhbnN3ZXJzIG9iamVjdC5cbiAgICogQHBhcmFtIHF1ZXN0aW9uIC0gVGhlIG1lc3NhZ2UgZGlzcGxheWVkIHRvIHRoZSB1c2VyLlxuICAgKiBAcGFyYW0gbWluIC0gVGhlIG1pbmltdW0gYWxsb3dlZCB2YWx1ZSAob3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gbWF4IC0gVGhlIG1heGltdW0gYWxsb3dlZCB2YWx1ZSAob3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gaW5pdGlhbCAtIFRoZSBpbml0aWFsIHZhbHVlIHByZXNlbnRlZCB0byB0aGUgdXNlciAob3B0aW9uYWwpLlxuICAgKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBudW1iZXIgZW50ZXJlZCBieSB0aGUgdXNlci5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBhc2tOdW1iZXIoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHF1ZXN0aW9uOiBzdHJpbmcsXG4gICAgbWluPzogbnVtYmVyLFxuICAgIG1heD86IG51bWJlcixcbiAgICBpbml0aWFsPzogbnVtYmVyXG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgbG9nID0gVXNlcklucHV0LmxvZ2dlci5mb3IodGhpcy5hc2tOdW1iZXIpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYEFza2luZyBudW1iZXIgaW5wdXQ6IHVuZGVmaW5lZCwgcXVlc3Rpb246ICR7cXVlc3Rpb259LCBtaW46ICR7bWlufSwgbWF4OiAke21heH0sIGluaXRpYWw6ICR7aW5pdGlhbH1gXG4gICAgKTtcbiAgICBjb25zdCB1c2VySW5wdXQgPSBuZXcgVXNlcklucHV0KG5hbWUpXG4gICAgICAuc2V0TWVzc2FnZShxdWVzdGlvbilcbiAgICAgIC5zZXRUeXBlKFwibnVtYmVyXCIpO1xuXG4gICAgaWYgKHR5cGVvZiBtaW4gPT09IFwibnVtYmVyXCIpIHVzZXJJbnB1dC5zZXRNaW4obWluKTtcblxuICAgIGlmICh0eXBlb2YgbWF4ID09PSBcIm51bWJlclwiKSB1c2VySW5wdXQuc2V0TWF4KG1heCk7XG5cbiAgICBpZiAodHlwZW9mIGluaXRpYWwgPT09IFwibnVtYmVyXCIpIHVzZXJJbnB1dC5zZXRJbml0aWFsKGluaXRpYWwpO1xuXG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmFzayh1c2VySW5wdXQpKVtuYW1lXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXNrcyB0aGUgdXNlciBmb3IgYSB0ZXh0IGlucHV0LlxuICAgKiBAc3VtbWFyeSBQcm9tcHRzIHRoZSB1c2VyIHRvIGVudGVyIHRleHQsIHdpdGggb3B0aW9uYWwgbWFza2luZyBhbmQgaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvbXB0LCB1c2VkIGFzIHRoZSBrZXkgaW4gdGhlIHJldHVybmVkIGFuc3dlcnMgb2JqZWN0LlxuICAgKiBAcGFyYW0gcXVlc3Rpb24gLSBUaGUgbWVzc2FnZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAqIEBwYXJhbSBtYXNrIC0gVGhlIGNoYXJhY3RlciB1c2VkIHRvIG1hc2sgdGhlIGlucHV0IChvcHRpb25hbCwgZm9yIHBhc3N3b3JkLWxpa2UgaW5wdXRzKS5cbiAgICogQHBhcmFtIGluaXRpYWwgLSBUaGUgaW5pdGlhbCB2YWx1ZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgKG9wdGlvbmFsKS5cbiAgICogQHJldHVybiBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdGV4dCBlbnRlcmVkIGJ5IHRoZSB1c2VyLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGFza1RleHQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHF1ZXN0aW9uOiBzdHJpbmcsXG4gICAgbWFzazogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICAgIGluaXRpYWw/OiBzdHJpbmdcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBsb2cgPSBVc2VySW5wdXQubG9nZ2VyLmZvcih0aGlzLmFza1RleHQpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYEFza2luZyB0ZXh0IGlucHV0OiB1bmRlZmluZWQsIHF1ZXN0aW9uOiAke3F1ZXN0aW9ufSwgbWFzazogJHttYXNrfSwgaW5pdGlhbDogJHtpbml0aWFsfWBcbiAgICApO1xuICAgIGNvbnN0IHVzZXJJbnB1dCA9IG5ldyBVc2VySW5wdXQobmFtZSkuc2V0TWVzc2FnZShxdWVzdGlvbik7XG5cbiAgICBpZiAobWFzaykgdXNlcklucHV0LnNldE1hc2sobWFzayk7XG4gICAgaWYgKHR5cGVvZiBpbml0aWFsID09PSBcInN0cmluZ1wiKSB1c2VySW5wdXQuc2V0SW5pdGlhbChpbml0aWFsKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuYXNrKHVzZXJJbnB1dCkpW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBc2tzIHRoZSB1c2VyIGZvciBhIGNvbmZpcm1hdGlvbiAoeWVzL25vKS5cbiAgICogQHN1bW1hcnkgUHJvbXB0cyB0aGUgdXNlciB3aXRoIGEgeWVzL25vIHF1ZXN0aW9uIGFuZCByZXR1cm5zIGEgYm9vbGVhbiByZXN1bHQuXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb21wdCwgdXNlZCBhcyB0aGUga2V5IGluIHRoZSByZXR1cm5lZCBhbnN3ZXJzIG9iamVjdC5cbiAgICogQHBhcmFtIHF1ZXN0aW9uIC0gVGhlIG1lc3NhZ2UgZGlzcGxheWVkIHRvIHRoZSB1c2VyLlxuICAgKiBAcGFyYW0gaW5pdGlhbCAtIFRoZSBpbml0aWFsIHZhbHVlIHByZXNlbnRlZCB0byB0aGUgdXNlciAob3B0aW9uYWwpLlxuICAgKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgYm9vbGVhbiByZXByZXNlbnRpbmcgdGhlIHVzZXIncyBhbnN3ZXIuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgYXNrQ29uZmlybWF0aW9uKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBxdWVzdGlvbjogc3RyaW5nLFxuICAgIGluaXRpYWw/OiBib29sZWFuXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGxvZyA9IFVzZXJJbnB1dC5sb2dnZXIuZm9yKHRoaXMuYXNrQ29uZmlybWF0aW9uKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBBc2tpbmcgY29uZmlybWF0aW9uIGlucHV0OiB1bmRlZmluZWQsIHF1ZXN0aW9uOiAke3F1ZXN0aW9ufSwgaW5pdGlhbDogJHtpbml0aWFsfWBcbiAgICApO1xuICAgIGNvbnN0IHVzZXJJbnB1dCA9IG5ldyBVc2VySW5wdXQobmFtZSlcbiAgICAgIC5zZXRNZXNzYWdlKHF1ZXN0aW9uKVxuICAgICAgLnNldFR5cGUoXCJjb25maXJtXCIpO1xuXG4gICAgaWYgKHR5cGVvZiBpbml0aWFsICE9PSBcInVuZGVmaW5lZFwiKSB1c2VySW5wdXQuc2V0SW5pdGlhbChpbml0aWFsKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuYXNrKHVzZXJJbnB1dCkpW25hbWVdO1xuICB9XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVwZWF0ZWRseSBhc2tzIGZvciBpbnB1dCB1bnRpbCBhIHZhbGlkIHJlc3BvbnNlIGlzIGdpdmVuIG9yIHRoZSBsaW1pdCBpcyByZWFjaGVkLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBpbnNpc3RzIG9uIGdldHRpbmcgYSB2YWxpZCBpbnB1dCBmcm9tIHRoZSB1c2VyLCBhbGxvd2luZyBmb3IgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGF0dGVtcHRzLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSB0eXBlIG9mIHRoZSBleHBlY3RlZCByZXN1bHQuXG4gICAqIEBwYXJhbSBpbnB1dCAtIFRoZSBVc2VySW5wdXQgaW5zdGFuY2UgdG8gdXNlIGZvciBwcm9tcHRpbmcuXG4gICAqIEBwYXJhbSB0ZXN0IC0gQSBmdW5jdGlvbiB0byB2YWxpZGF0ZSB0aGUgdXNlcidzIGlucHV0LlxuICAgKiBAcGFyYW0gbGltaXQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXR0ZW1wdHMgYWxsb3dlZCAoZGVmYXVsdCBpcyAxKS5cbiAgICogQHBhcmFtIGRlZmF1bHRDb25maXJtYXRpb25cbiAgICogQHJldHVybiBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdmFsaWQgaW5wdXQgb3IgdW5kZWZpbmVkIGlmIHRoZSBsaW1pdCBpcyByZWFjaGVkLlxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXJcbiAgICogICBwYXJ0aWNpcGFudCBJIGFzIGluc2lzdCBtZXRob2RcbiAgICogICBwYXJ0aWNpcGFudCBBIGFzIGFzayBtZXRob2RcbiAgICogICBwYXJ0aWNpcGFudCBUIGFzIHRlc3QgZnVuY3Rpb25cbiAgICogICBwYXJ0aWNpcGFudCBDIGFzIGFza0NvbmZpcm1hdGlvbiBtZXRob2RcbiAgICogICBsb29wIFVudGlsIHZhbGlkIGlucHV0IG9yIGxpbWl0IHJlYWNoZWRcbiAgICogICAgIEktPj5BOiBDYWxsIGFzayB3aXRoIGlucHV0XG4gICAqICAgICBBLT4+VTogUHJvbXB0IHVzZXJcbiAgICogICAgIFUtPj5BOiBQcm92aWRlIGlucHV0XG4gICAqICAgICBBLT4+STogUmV0dXJuIHJlc3VsdFxuICAgKiAgICAgSS0+PlQ6IFRlc3QgcmVzdWx0XG4gICAqICAgICBhbHQgVGVzdCBwYXNzZXNcbiAgICogICAgICAgSS0+PkM6IEFzayBmb3IgY29uZmlybWF0aW9uXG4gICAqICAgICAgIEMtPj5VOiBDb25maXJtIGlucHV0XG4gICAqICAgICAgIFUtPj5DOiBQcm92aWRlIGNvbmZpcm1hdGlvblxuICAgKiAgICAgICBDLT4+STogUmV0dXJuIGNvbmZpcm1hdGlvblxuICAgKiAgICAgICBhbHQgQ29uZmlybWVkXG4gICAqICAgICAgICAgSS0tPj5DYWxsZXI6IFJldHVybiB2YWxpZCByZXN1bHRcbiAgICogICAgICAgZWxzZSBOb3QgY29uZmlybWVkXG4gICAqICAgICAgICAgSS0+Pkk6IENvbnRpbnVlIGxvb3BcbiAgICogICAgICAgZW5kXG4gICAqICAgICBlbHNlIFRlc3QgZmFpbHNcbiAgICogICAgICAgSS0+Pkk6IENvbnRpbnVlIGxvb3BcbiAgICogICAgIGVuZFxuICAgKiAgIGVuZFxuICAgKiAgIEktLT4+Q2FsbGVyOiBSZXR1cm4gdW5kZWZpbmVkIGlmIGxpbWl0IHJlYWNoZWRcbiAgICovXG4gIHN0YXRpYyBhc3luYyBpbnNpc3Q8Uj4oXG4gICAgaW5wdXQ6IFVzZXJJbnB1dCxcbiAgICB0ZXN0OiAocmVzOiBzdHJpbmcgfCBudW1iZXIpID0+IGJvb2xlYW4sXG4gICAgZGVmYXVsdENvbmZpcm1hdGlvbjogYm9vbGVhbixcbiAgICBsaW1pdCA9IDFcbiAgKTogUHJvbWlzZTxSIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgbG9nID0gVXNlcklucHV0LmxvZ2dlci5mb3IodGhpcy5pbnNpc3QpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYEluc2lzdGluZyBvbiBpbnB1dDogJHtpbnB1dC5uYW1lfSwgdGVzdDogJHt0ZXN0LnRvU3RyaW5nKCl9LCBkZWZhdWx0Q29uZmlybWF0aW9uOiAke2RlZmF1bHRDb25maXJtYXRpb259LCBsaW1pdDogJHtsaW1pdH1gXG4gICAgKTtcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgbGV0IGNvdW50ID0gMDtcbiAgICBsZXQgY29uZmlybWF0aW9uOiBib29sZWFuO1xuICAgIHRyeSB7XG4gICAgICBkbyB7XG4gICAgICAgIHJlc3VsdCA9IChhd2FpdCBVc2VySW5wdXQuYXNrKGlucHV0KSlbXG4gICAgICAgICAgaW5wdXQubmFtZSBhcyBrZXlvZiBBbnN3ZXJzPHN0cmluZz5cbiAgICAgICAgXSBhcyBzdHJpbmc7XG4gICAgICAgIGlmICghdGVzdChyZXN1bHQpKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbmZpcm1hdGlvbiA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgICAgYCR7aW5wdXQubmFtZX0tY29uZmlybWAsXG4gICAgICAgICAgYElzIHRoZSAke2lucHV0LnR5cGV9IGNvcnJlY3Q/YCxcbiAgICAgICAgICBkZWZhdWx0Q29uZmlybWF0aW9uXG4gICAgICAgICk7XG4gICAgICAgIGlmICghY29uZmlybWF0aW9uKSByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICB9IHdoaWxlICh0eXBlb2YgcmVzdWx0ID09PSBcInVuZGVmaW5lZFwiICYmIGxpbWl0ID4gMSAmJiBjb3VudCsrIDwgbGltaXQpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGxvZy5lcnJvcihgRXJyb3Igd2hpbGUgaW5zaXN0aW5nOiAke2V9YCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcInVuZGVmaW5lZFwiKSBsb2cuaW5mbyhcIm5vIHNlbGVjdGlvbi4uLlwiKTtcbiAgICByZXR1cm4gcmVzdWx0IGFzIFIgfCB1bmRlZmluZWQ7XG4gIH1cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXBlYXRlZGx5IGFza3MgZm9yIHRleHQgaW5wdXQgdW50aWwgYSB2YWxpZCByZXNwb25zZSBpcyBnaXZlbiBvciB0aGUgbGltaXQgaXMgcmVhY2hlZC5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgaW5zaXN0cyBvbiBnZXR0aW5nIGEgdmFsaWQgdGV4dCBpbnB1dCBmcm9tIHRoZSB1c2VyLCBhbGxvd2luZyBmb3IgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGF0dGVtcHRzLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9tcHQsIHVzZWQgYXMgdGhlIGtleSBpbiB0aGUgcmV0dXJuZWQgYW5zd2VycyBvYmplY3QuXG4gICAqIEBwYXJhbSBxdWVzdGlvbiAtIFRoZSBtZXNzYWdlIGRpc3BsYXllZCB0byB0aGUgdXNlci5cbiAgICogQHBhcmFtIHRlc3QgLSBBIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIHRoZSB1c2VyJ3MgaW5wdXQuXG4gICAqIEBwYXJhbSBtYXNrIC0gVGhlIGNoYXJhY3RlciB1c2VkIHRvIG1hc2sgdGhlIGlucHV0IChvcHRpb25hbCwgZm9yIHBhc3N3b3JkLWxpa2UgaW5wdXRzKS5cbiAgICogQHBhcmFtIGluaXRpYWwgLSBUaGUgaW5pdGlhbCB2YWx1ZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgKG9wdGlvbmFsKS5cbiAgICogQHBhcmFtIGRlZmF1bHRDb25maXJtYXRpb25cbiAgICogQHBhcmFtIGxpbWl0IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGF0dGVtcHRzIGFsbG93ZWQgKGRlZmF1bHQgaXMgLTEsIG1lYW5pbmcgdW5saW1pdGVkKS5cbiAgICogQHJldHVybiBBIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgdmFsaWQgaW5wdXQgb3IgdW5kZWZpbmVkIGlmIHRoZSBsaW1pdCBpcyByZWFjaGVkLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGluc2lzdEZvclRleHQoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHF1ZXN0aW9uOiBzdHJpbmcsXG4gICAgdGVzdDogKHJlczogc3RyaW5nKSA9PiBib29sZWFuLFxuICAgIG1hc2s6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgICBpbml0aWFsPzogc3RyaW5nLFxuICAgIGRlZmF1bHRDb25maXJtYXRpb24gPSBmYWxzZSxcbiAgICBsaW1pdCA9IC0xXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgbG9nID0gVXNlcklucHV0LmxvZ2dlci5mb3IodGhpcy5pbnNpc3RGb3JUZXh0KTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBJbnNpc3RpbmcgZm9yIHRleHQgaW5wdXQ6IHVuZGVmaW5lZCwgcXVlc3Rpb246ICR7cXVlc3Rpb259LCB0ZXN0OiAke3Rlc3QudG9TdHJpbmcoKX0sIG1hc2s6ICR7bWFza30sIGluaXRpYWw6ICR7aW5pdGlhbH0sIGRlZmF1bHRDb25maXJtYXRpb246ICR7ZGVmYXVsdENvbmZpcm1hdGlvbn0sIGxpbWl0OiAke2xpbWl0fWBcbiAgICApO1xuICAgIGNvbnN0IHVzZXJJbnB1dCA9IG5ldyBVc2VySW5wdXQobmFtZSkuc2V0TWVzc2FnZShxdWVzdGlvbik7XG5cbiAgICBpZiAobWFzaykgdXNlcklucHV0LnNldE1hc2sobWFzayk7XG4gICAgaWYgKHR5cGVvZiBpbml0aWFsID09PSBcInN0cmluZ1wiKSB1c2VySW5wdXQuc2V0SW5pdGlhbChpbml0aWFsKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuaW5zaXN0KFxuICAgICAgdXNlcklucHV0LFxuICAgICAgdGVzdCBhcyAocmVzOiBzdHJpbmcgfCBudW1iZXIpID0+IGJvb2xlYW4sXG4gICAgICBkZWZhdWx0Q29uZmlybWF0aW9uLFxuICAgICAgbGltaXRcbiAgICApKSBhcyBzdHJpbmc7XG4gIH1cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXBlYXRlZGx5IGFza3MgZm9yIG51bWJlciBpbnB1dCB1bnRpbCBhIHZhbGlkIHJlc3BvbnNlIGlzIGdpdmVuIG9yIHRoZSBsaW1pdCBpcyByZWFjaGVkLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBpbnNpc3RzIG9uIGdldHRpbmcgYSB2YWxpZCBudW1iZXIgaW5wdXQgZnJvbSB0aGUgdXNlciwgYWxsb3dpbmcgZm9yIGEgc3BlY2lmaWVkIG51bWJlciBvZiBhdHRlbXB0cy5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvbXB0LCB1c2VkIGFzIHRoZSBrZXkgaW4gdGhlIHJldHVybmVkIGFuc3dlcnMgb2JqZWN0LlxuICAgKiBAcGFyYW0gcXVlc3Rpb24gLSBUaGUgbWVzc2FnZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAqIEBwYXJhbSB0ZXN0IC0gQSBmdW5jdGlvbiB0byB2YWxpZGF0ZSB0aGUgdXNlcidzIGlucHV0LlxuICAgKiBAcGFyYW0gbWluIC0gVGhlIG1pbmltdW0gYWxsb3dlZCB2YWx1ZSAob3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gbWF4IC0gVGhlIG1heGltdW0gYWxsb3dlZCB2YWx1ZSAob3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gaW5pdGlhbCAtIFRoZSBpbml0aWFsIHZhbHVlIHByZXNlbnRlZCB0byB0aGUgdXNlciAob3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gZGVmYXVsdENvbmZpcm1hdGlvblxuICAgKiBAcGFyYW0gbGltaXQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXR0ZW1wdHMgYWxsb3dlZCAoZGVmYXVsdCBpcyAtMSwgbWVhbmluZyB1bmxpbWl0ZWQpLlxuICAgKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB2YWxpZCBpbnB1dCBvciB1bmRlZmluZWQgaWYgdGhlIGxpbWl0IGlzIHJlYWNoZWQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgaW5zaXN0Rm9yTnVtYmVyKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBxdWVzdGlvbjogc3RyaW5nLFxuICAgIHRlc3Q6IChyZXM6IG51bWJlcikgPT4gYm9vbGVhbixcbiAgICBtaW4/OiBudW1iZXIsXG4gICAgbWF4PzogbnVtYmVyLFxuICAgIGluaXRpYWw/OiBudW1iZXIsXG4gICAgZGVmYXVsdENvbmZpcm1hdGlvbiA9IGZhbHNlLFxuICAgIGxpbWl0ID0gLTFcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBsb2cgPSBVc2VySW5wdXQubG9nZ2VyLmZvcih0aGlzLmluc2lzdEZvck51bWJlcik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgSW5zaXN0aW5nIGZvciBudW1iZXIgaW5wdXQ6IHVuZGVmaW5lZCwgcXVlc3Rpb246ICR7cXVlc3Rpb259LCB0ZXN0OiAke3Rlc3QudG9TdHJpbmcoKX0sIG1pbjogJHttaW59LCBtYXg6ICR7bWF4fSwgaW5pdGlhbDogJHtpbml0aWFsfSwgZGVmYXVsdENvbmZpcm1hdGlvbjogJHtkZWZhdWx0Q29uZmlybWF0aW9ufSwgbGltaXQ6ICR7bGltaXR9YFxuICAgICk7XG4gICAgY29uc3QgdXNlcklucHV0ID0gbmV3IFVzZXJJbnB1dChuYW1lKVxuICAgICAgLnNldE1lc3NhZ2UocXVlc3Rpb24pXG4gICAgICAuc2V0VHlwZShcIm51bWJlclwiKTtcblxuICAgIGlmICh0eXBlb2YgbWluID09PSBcIm51bWJlclwiKSB1c2VySW5wdXQuc2V0TWluKG1pbik7XG5cbiAgICBpZiAodHlwZW9mIG1heCA9PT0gXCJudW1iZXJcIikgdXNlcklucHV0LnNldE1heChtYXgpO1xuXG4gICAgaWYgKHR5cGVvZiBpbml0aWFsID09PSBcIm51bWJlclwiKSB1c2VySW5wdXQuc2V0SW5pdGlhbChpbml0aWFsKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuaW5zaXN0KFxuICAgICAgdXNlcklucHV0LFxuICAgICAgdGVzdCBhcyAocmVzOiBzdHJpbmcgfCBudW1iZXIpID0+IGJvb2xlYW4sXG4gICAgICBkZWZhdWx0Q29uZmlybWF0aW9uLFxuICAgICAgbGltaXRcbiAgICApKSBhcyBudW1iZXI7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBhcnNlcyBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBvcHRpb25zLlxuICAgKiBAc3VtbWFyeSBVc2VzIE5vZGUuanMncyB1dGlsLnBhcnNlQXJncyB0byBwYXJzZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGFuZCByZXR1cm4gdGhlIHJlc3VsdC5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHBhcnNpbmcgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJuIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBwYXJzZWQgYXJndW1lbnRzLlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDIGFzIENhbGxlclxuICAgKiAgIHBhcnRpY2lwYW50IFAgYXMgcGFyc2VBcmdzIG1ldGhvZFxuICAgKiAgIHBhcnRpY2lwYW50IFUgYXMgdXRpbC5wYXJzZUFyZ3NcbiAgICogICBDLT4+UDogQ2FsbCB3aXRoIG9wdGlvbnNcbiAgICogICBQLT4+UDogUHJlcGFyZSBhcmdzIG9iamVjdFxuICAgKiAgIFAtPj5VOiBDYWxsIHBhcnNlQXJncyB3aXRoIHByZXBhcmVkIGFyZ3NcbiAgICogICBVLT4+UDogUmV0dXJuIHBhcnNlZCByZXN1bHRcbiAgICogICBQLS0+PkM6IFJldHVybiBQYXJzZUFyZ3NSZXN1bHRcbiAgICovXG4gIHN0YXRpYyBwYXJzZUFyZ3Mob3B0aW9uczogUGFyc2VBcmdzT3B0aW9uc0NvbmZpZyk6IFBhcnNlQXJnc1Jlc3VsdCB7XG4gICAgY29uc3QgbG9nID0gVXNlcklucHV0LmxvZ2dlci5mb3IodGhpcy5wYXJzZUFyZ3MpO1xuICAgIGNvbnN0IGFyZ3M6IFBhcnNlQXJnc0NvbmZpZyA9IHtcbiAgICAgIGFyZ3M6IHByb2Nlc3MuYXJndi5zbGljZSgyKSxcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgfTtcbiAgICBsb2cuZGVidWcoYFBhcnNpbmcgYXJndW1lbnRzOiAke0pTT04uc3RyaW5naWZ5KGFyZ3MsIG51bGwsIDIpfWApO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcGFyc2VBcmdzKGFyZ3MpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBsb2cuZGVidWcoXG4gICAgICAgIGBFcnJvciB3aGlsZSBwYXJzaW5nIGFyZ3VtZW50czpcXG4ke0pTT04uc3RyaW5naWZ5KGFyZ3MsIG51bGwsIDIpfVxcbiB8IG9wdGlvbnNcXG4ke0pTT04uc3RyaW5naWZ5KG9wdGlvbnMsIG51bGwsIDIpfVxcbiB8ICR7ZXJyb3J9YFxuICAgICAgKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2hpbGUgcGFyc2luZyBhcmd1bWVudHM6ICR7ZXJyb3J9YCk7XG4gICAgfVxuICB9XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGNvbW1hbmQgb3B0aW9ucyBmb3IgQ0xJIGNvbW1hbmRzLlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgc3RydWN0dXJlIGFuZCBkZWZhdWx0IHZhbHVlcyBmb3IgY29tbW9uIGNvbW1hbmQtbGluZSBvcHRpb25zIHVzZWQgYWNyb3NzIHZhcmlvdXMgQ0xJIGNvbW1hbmRzLlxuICogQGNvbnN0IERlZmF1bHRDb21tYW5kT3B0aW9uc1xuICogQHR5cGVkZWYge09iamVjdH0gRGVmYXVsdENvbW1hbmRPcHRpb25zXG4gKiBAcHJvcGVydHkge09iamVjdH0gdmVyYm9zZSAtIFZlcmJvc2l0eSBsZXZlbCBvcHRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyYm9zZS50eXBlIC0gVGhlIHR5cGUgb2YgdGhlIHZlcmJvc2Ugb3B0aW9uIChudW1iZXIpLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcmJvc2Uuc2hvcnQgLSBUaGUgc2hvcnQgZmxhZyBmb3IgdGhlIHZlcmJvc2Ugb3B0aW9uIChWKS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB2ZXJib3NlLmRlZmF1bHQgLSBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdmVyYm9zaXR5ICgwKS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB2ZXJzaW9uIC0gVmVyc2lvbiBkaXNwbGF5IG9wdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJzaW9uLnR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgdmVyc2lvbiBvcHRpb24gKGJvb2xlYW4pLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb24uc2hvcnQgLSBUaGUgc2hvcnQgZmxhZyBmb3IgdGhlIHZlcnNpb24gb3B0aW9uICh2KS5cbiAqIEBwcm9wZXJ0eSB7dW5kZWZpbmVkfSB2ZXJzaW9uLmRlZmF1bHQgLSBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdmVyc2lvbiBkaXNwbGF5ICh1bmRlZmluZWQpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGhlbHAgLSBIZWxwIGRpc3BsYXkgb3B0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGhlbHAudHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBoZWxwIG9wdGlvbiAoYm9vbGVhbikuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaGVscC5zaG9ydCAtIFRoZSBzaG9ydCBmbGFnIGZvciB0aGUgaGVscCBvcHRpb24gKGgpLlxuICogQHByb3BlcnR5IHtib29sZWFufSBoZWxwLmRlZmF1bHQgLSBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgaGVscCBkaXNwbGF5IChmYWxzZSkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbG9nTGV2ZWwgLSBMb2cgbGV2ZWwgb3B0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGxvZ0xldmVsLnR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgbG9nTGV2ZWwgb3B0aW9uIChzdHJpbmcpLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGxvZ0xldmVsLmRlZmF1bHQgLSBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgbG9nIGxldmVsIChcImluZm9cIikuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbG9nU3R5bGUgLSBMb2cgc3R5bGluZyBvcHRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbG9nU3R5bGUudHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBsb2dTdHlsZSBvcHRpb24gKGJvb2xlYW4pLlxuICogQHByb3BlcnR5IHtib29sZWFufSBsb2dTdHlsZS5kZWZhdWx0IC0gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGxvZyBzdHlsaW5nICh0cnVlKS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB0aW1lc3RhbXAgLSBUaW1lc3RhbXAgZGlzcGxheSBvcHRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGltZXN0YW1wLnR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgdGltZXN0YW1wIG9wdGlvbiAoYm9vbGVhbikuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHRpbWVzdGFtcC5kZWZhdWx0IC0gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRpbWVzdGFtcCBkaXNwbGF5ICh0cnVlKS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBiYW5uZXIgLSBCYW5uZXIgZGlzcGxheSBvcHRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYmFubmVyLnR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgYmFubmVyIG9wdGlvbiAoYm9vbGVhbikuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJhbm5lci5kZWZhdWx0IC0gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGJhbm5lciBkaXNwbGF5IChmYWxzZSkuXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0Q29tbWFuZE9wdGlvbnMgPSB7XG4gIHZlcmJvc2U6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICBzaG9ydDogXCJWXCIsXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkLFxuICB9LFxuICB2ZXJzaW9uOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgc2hvcnQ6IFwidlwiLFxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcbiAgfSxcbiAgaGVscDoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIHNob3J0OiBcImhcIixcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgbG9nTGV2ZWw6IHtcbiAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgIGRlZmF1bHQ6IFwiaW5mb1wiLFxuICB9LFxuICBsb2dTdHlsZToge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gIHRpbWVzdGFtcDoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG4gIGJhbm5lcjoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIGRlZmF1bHQ6IHRydWUsXG4gIH0sXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGNvbW1hbmQgdmFsdWVzIGRlcml2ZWQgZnJvbSBEZWZhdWx0Q29tbWFuZE9wdGlvbnMuXG4gKiBAc3VtbWFyeSBDcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlcyBvZiBhbGwgb3B0aW9ucyBkZWZpbmVkIGluIERlZmF1bHRDb21tYW5kT3B0aW9ucy5cbiAqIEBjb25zdCBEZWZhdWx0Q29tbWFuZFZhbHVlc1xuICogQHR5cGVkZWYge09iamVjdH0gRGVmYXVsdENvbW1hbmRWYWx1ZXNcbiAqIEBwcm9wZXJ0eSB7dW5rbm93bn0gW2tleTogc3RyaW5nXSAtIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBlYWNoIG9wdGlvbiBpbiBEZWZhdWx0Q29tbWFuZE9wdGlvbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0Q29tbWFuZFZhbHVlczoge1xuICBbayBpbiBrZXlvZiB0eXBlb2YgRGVmYXVsdENvbW1hbmRPcHRpb25zXTogdW5rbm93bjtcbn0gPSBPYmplY3Qua2V5cyhEZWZhdWx0Q29tbWFuZE9wdGlvbnMpLnJlZHVjZShcbiAgKGFjYzogUmVjb3JkPGtleW9mIHR5cGVvZiBEZWZhdWx0Q29tbWFuZE9wdGlvbnMsIHVua25vd24+LCBrZXk6IHN0cmluZykgPT4ge1xuICAgIGFjY1trZXkgYXMga2V5b2YgdHlwZW9mIERlZmF1bHRDb21tYW5kT3B0aW9uc10gPVxuICAgICAgRGVmYXVsdENvbW1hbmRPcHRpb25zW2tleSBhcyBrZXlvZiB0eXBlb2YgRGVmYXVsdENvbW1hbmRPcHRpb25zXS5kZWZhdWx0O1xuICAgIHJldHVybiBhY2M7XG4gIH0sXG4gIHt9IGFzIFJlY29yZDxrZXlvZiB0eXBlb2YgRGVmYXVsdENvbW1hbmRWYWx1ZXMsIHVua25vd24+XG4pO1xuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gUGFkcyB0aGUgZW5kIG9mIGEgc3RyaW5nIHdpdGggYSBzcGVjaWZpZWQgY2hhcmFjdGVyLlxuICogQHN1bW1hcnkgRXh0ZW5kcyB0aGUgaW5wdXQgc3RyaW5nIHRvIGEgc3BlY2lmaWVkIGxlbmd0aCBieSBhZGRpbmcgYSBwYWRkaW5nIGNoYXJhY3RlciB0byB0aGUgZW5kLlxuICogSWYgdGhlIGlucHV0IHN0cmluZyBpcyBhbHJlYWR5IGxvbmdlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLCBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciAtIFRoZSBpbnB1dCBzdHJpbmcgdG8gYmUgcGFkZGVkLlxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCAtIFRoZSBkZXNpcmVkIHRvdGFsIGxlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIHN0cmluZy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcj1cIiBcIl0gLSBUaGUgY2hhcmFjdGVyIHRvIHVzZSBmb3IgcGFkZGluZy4gRGVmYXVsdHMgdG8gYSBzcGFjZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHBhZGRlZCBzdHJpbmcuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHBhZGRpbmcgY2hhcmFjdGVyIGlzIG5vdCBleGFjdGx5IG9uZSBjaGFyYWN0ZXIgbG9uZy5cbiAqXG4gKiBAZnVuY3Rpb24gcGFkRW5kXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpUZXh0VXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhZEVuZChcbiAgc3RyOiBzdHJpbmcsXG4gIGxlbmd0aDogbnVtYmVyLFxuICBjaGFyOiBzdHJpbmcgPSBcIiBcIlxuKTogc3RyaW5nIHtcbiAgaWYgKGNoYXIubGVuZ3RoICE9PSAxKVxuICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgY2hhcmFjdGVyIGxlbmd0aCBmb3IgcGFkZGluZy4gbXVzdCBiZSBvbmUhXCIpO1xuICByZXR1cm4gc3RyLnBhZEVuZChsZW5ndGgsIGNoYXIpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXBsYWNlcyBwbGFjZWhvbGRlcnMgaW4gYSBzdHJpbmcgd2l0aCBwcm92aWRlZCB2YWx1ZXMuXG4gKiBAc3VtbWFyeSBJbnRlcnBvbGF0ZXMgYSBzdHJpbmcgYnkgcmVwbGFjaW5nIHBsYWNlaG9sZGVycyBvZiB0aGUgZm9ybSAke3ZhcmlhYmxlTmFtZX1cbiAqIHdpdGggY29ycmVzcG9uZGluZyB2YWx1ZXMgZnJvbSB0aGUgcHJvdmlkZWQgb2JqZWN0LiBJZiBhIHBsYWNlaG9sZGVyIGRvZXNuJ3QgaGF2ZVxuICogYSBjb3JyZXNwb25kaW5nIHZhbHVlLCBpdCBpcyBsZWZ0IHVuY2hhbmdlZCBpbiB0aGUgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dCAtIFRoZSBpbnB1dCBzdHJpbmcgY29udGFpbmluZyBwbGFjZWhvbGRlcnMgdG8gYmUgcmVwbGFjZWQuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz59IHZhbHVlcyAtIEFuIG9iamVjdCBjb250YWluaW5nIGtleS12YWx1ZSBwYWlycyBmb3IgcmVwbGFjZW1lbnQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbnRlcnBvbGF0ZWQgc3RyaW5nIHdpdGggcGxhY2Vob2xkZXJzIHJlcGxhY2VkIGJ5IHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICpcbiAqIEBmdW5jdGlvbiBwYXRjaFBsYWNlaG9sZGVyc1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IHBhdGNoU3RyaW5nXG4gKiAgIHBhcnRpY2lwYW50IFN0cmluZy5yZXBsYWNlXG4gKiAgIENhbGxlci0+PnBhdGNoU3RyaW5nOiBDYWxsIHdpdGggaW5wdXQgYW5kIHZhbHVlc1xuICogICBwYXRjaFN0cmluZy0+PlN0cmluZy5yZXBsYWNlOiBDYWxsIHdpdGggcmVnZXggYW5kIHJlcGxhY2VtZW50IGZ1bmN0aW9uXG4gKiAgIFN0cmluZy5yZXBsYWNlLT4+cGF0Y2hTdHJpbmc6IFJldHVybiByZXBsYWNlZCBzdHJpbmdcbiAqICAgcGF0Y2hTdHJpbmctLT4+Q2FsbGVyOiBSZXR1cm4gcGF0Y2hlZCBzdHJpbmdcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOlRleHRVdGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hQbGFjZWhvbGRlcnMoXG4gIGlucHV0OiBzdHJpbmcsXG4gIHZhbHVlczogUmVjb3JkPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPlxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIGlucHV0LnJlcGxhY2UoXG4gICAgL1xcJFxceyhbYS16QS1aMC05X10rKVxcfS9nLFxuICAgIChtYXRjaCwgdmFyaWFibGUpID0+ICh2YWx1ZXNbdmFyaWFibGUgYXMgc3RyaW5nXSBhcyBzdHJpbmcpIHx8IG1hdGNoXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXRjaFN0cmluZyhcbiAgaW5wdXQ6IHN0cmluZyxcbiAgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+LFxuICBmbGFnczogc3RyaW5nID0gXCJnXCJcbik6IHN0cmluZyB7XG4gIE9iamVjdC5lbnRyaWVzKHZhbHVlcykuZm9yRWFjaCgoW2tleSwgdmFsXSkgPT4ge1xuICAgIGNvbnN0IHJlZ2V4cCA9IG5ldyBSZWdFeHAoZXNjYXBlUmVnRXhwKGtleSksIGZsYWdzKTtcbiAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UocmVnZXhwLCB2YWwgYXMgc3RyaW5nKTtcbiAgfSk7XG4gIHJldHVybiBpbnB1dDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYSBzdHJpbmcgdG8gY2FtZWxDYXNlLlxuICogQHN1bW1hcnkgVHJhbnNmb3JtcyB0aGUgaW5wdXQgc3RyaW5nIGludG8gY2FtZWxDYXNlIGZvcm1hdCwgd2hlcmUgd29yZHMgYXJlIGpvaW5lZCB3aXRob3V0IHNwYWNlc1xuICogYW5kIGVhY2ggd29yZCBhZnRlciB0aGUgZmlyc3Qgc3RhcnRzIHdpdGggYSBjYXBpdGFsIGxldHRlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRoZSBpbnB1dCBzdHJpbmcgdG8gYmUgY29udmVydGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW5wdXQgc3RyaW5nIGNvbnZlcnRlZCB0byBjYW1lbENhc2UuXG4gKlxuICogQGZ1bmN0aW9uIHRvQ2FtZWxDYXNlXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpUZXh0VXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQ2FtZWxDYXNlKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0XG4gICAgLnJlcGxhY2UoLyg/Ol5cXHd8W0EtWl18XFxiXFx3KS9nLCAod29yZCwgaW5kZXgpID0+XG4gICAgICBpbmRleCA9PT0gMCA/IHdvcmQudG9Mb3dlckNhc2UoKSA6IHdvcmQudG9VcHBlckNhc2UoKVxuICAgIClcbiAgICAucmVwbGFjZSgvXFxzKy9nLCBcIlwiKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYSBzdHJpbmcgdG8gRU5WSVJPTk1FTlRfVkFSSUFCTEUgZm9ybWF0LlxuICogQHN1bW1hcnkgVHJhbnNmb3JtcyB0aGUgaW5wdXQgc3RyaW5nIGludG8gdXBwZXJjYXNlIHdpdGggd29yZHMgc2VwYXJhdGVkIGJ5IHVuZGVyc2NvcmVzLFxuICogdHlwaWNhbGx5IHVzZWQgZm9yIGVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGhlIGlucHV0IHN0cmluZyB0byBiZSBjb252ZXJ0ZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbnB1dCBzdHJpbmcgY29udmVydGVkIHRvIEVOVklST05NRU5UX1ZBUklBQkxFIGZvcm1hdC5cbiAqXG4gKiBAZnVuY3Rpb24gdG9FTlZGb3JtYXRcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOlRleHRVdGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9FTlZGb3JtYXQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRvU25ha2VDYXNlKHRleHQpLnRvVXBwZXJDYXNlKCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgc3RyaW5nIHRvIHNuYWtlX2Nhc2UuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIHRoZSBpbnB1dCBzdHJpbmcgaW50byBsb3dlcmNhc2Ugd2l0aCB3b3JkcyBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUaGUgaW5wdXQgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGlucHV0IHN0cmluZyBjb252ZXJ0ZWQgdG8gc25ha2VfY2FzZS5cbiAqXG4gKiBAZnVuY3Rpb24gdG9TbmFrZUNhc2VcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOlRleHRVdGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9TbmFrZUNhc2UodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHRcbiAgICAucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgXCIkMV8kMlwiKVxuICAgIC5yZXBsYWNlKC9bXFxzLV0rL2csIFwiX1wiKVxuICAgIC50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBhIHN0cmluZyB0byBrZWJhYi1jYXNlLlxuICogQHN1bW1hcnkgVHJhbnNmb3JtcyB0aGUgaW5wdXQgc3RyaW5nIGludG8gbG93ZXJjYXNlIHdpdGggd29yZHMgc2VwYXJhdGVkIGJ5IGh5cGhlbnMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUaGUgaW5wdXQgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGlucHV0IHN0cmluZyBjb252ZXJ0ZWQgdG8ga2ViYWItY2FzZS5cbiAqXG4gKiBAZnVuY3Rpb24gdG9LZWJhYkNhc2VcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOlRleHRVdGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9LZWJhYkNhc2UodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHRcbiAgICAucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgXCIkMS0kMlwiKVxuICAgIC5yZXBsYWNlKC9bXFxzX10rL2csIFwiLVwiKVxuICAgIC50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBhIHN0cmluZyB0byBQYXNjYWxDYXNlLlxuICogQHN1bW1hcnkgVHJhbnNmb3JtcyB0aGUgaW5wdXQgc3RyaW5nIGludG8gUGFzY2FsQ2FzZSBmb3JtYXQsIHdoZXJlIHdvcmRzIGFyZSBqb2luZWQgd2l0aG91dCBzcGFjZXNcbiAqIGFuZCBlYWNoIHdvcmQgc3RhcnRzIHdpdGggYSBjYXBpdGFsIGxldHRlci5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRoZSBpbnB1dCBzdHJpbmcgdG8gYmUgY29udmVydGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW5wdXQgc3RyaW5nIGNvbnZlcnRlZCB0byBQYXNjYWxDYXNlLlxuICpcbiAqIEBmdW5jdGlvbiB0b1Bhc2NhbENhc2VcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOlRleHRVdGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9QYXNjYWxDYXNlKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB0ZXh0XG4gICAgLnJlcGxhY2UoLyg/Ol5cXHd8W0EtWl18XFxiXFx3KS9nLCAod29yZCkgPT4gd29yZC50b1VwcGVyQ2FzZSgpKVxuICAgIC5yZXBsYWNlKC9cXHMrL2csIFwiXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHN0cmluZzogc3RyaW5nKSB7XG4gIHJldHVybiBzdHJpbmcucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFwiXFxcXCQmXCIpOyAvLyAkJiBtZWFucyB0aGUgd2hvbGUgbWF0Y2hlZCBzdHJpbmdcbn1cbiIsImltcG9ydCB7IEVuY29kaW5nIH0gZnJvbSBcIi4uL3V0aWxzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgT3V0cHV0V3JpdGVyIH0gZnJvbSBcIi4vT3V0cHV0V3JpdGVyXCI7XG5pbXBvcnQgeyBQcm9taXNlRXhlY3V0b3IgfSBmcm9tIFwiLi4vdXRpbHMvdHlwZXNcIjtcbmltcG9ydCB7IE91dHB1dFR5cGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCIuLi9vdXRwdXQvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgVmVyYm9zaXR5TG9nZ2VyIH0gZnJvbSBcIi4uL291dHB1dC90eXBlc1wiO1xuaW1wb3J0IHsgc3R5bGUgfSBmcm9tIFwic3R5bGVkLXN0cmluZy1idWlsZGVyXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgc3RhbmRhcmQgb3V0cHV0IHdyaXRlciBmb3IgaGFuZGxpbmcgY29tbWFuZCBleGVjdXRpb24gb3V0cHV0LlxuICogQHN1bW1hcnkgVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBPdXRwdXRXcml0ZXIgaW50ZXJmYWNlIGFuZCBwcm92aWRlcyBtZXRob2RzIGZvclxuICogaGFuZGxpbmcgdmFyaW91cyB0eXBlcyBvZiBvdXRwdXQgZnJvbSBjb21tYW5kIGV4ZWN1dGlvbiwgaW5jbHVkaW5nIHN0YW5kYXJkIG91dHB1dCxcbiAqIGVycm9yIG91dHB1dCwgYW5kIGV4aXQgY29kZXMuIEl0IGFsc28gaW5jbHVkZXMgdXRpbGl0eSBtZXRob2RzIGZvciBwYXJzaW5nIGNvbW1hbmRzXG4gKiBhbmQgcmVzb2x2aW5nIG9yIHJlamVjdGluZyBwcm9taXNlcyBiYXNlZCBvbiBleGVjdXRpb24gcmVzdWx0cy5cbiAqXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSB0eXBlIG9mIHRoZSByZXNvbHZlZCB2YWx1ZSwgZGVmYXVsdGluZyB0byBudW1iZXIuXG4gKlxuICogQHBhcmFtIGxvY2sgLSBBIFByb21pc2VFeGVjdXRvciB0byBjb250cm9sIHRoZSBhc3luY2hyb25vdXMgZmxvdy5cbiAqIEBwYXJhbSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgKHVudXNlZCBpbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbikuXG4gKlxuICogQGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGFuZGFyZE91dHB1dFdyaXRlcjxSID0gc3RyaW5nPiBpbXBsZW1lbnRzIE91dHB1dFdyaXRlciB7XG4gIHByb3RlY3RlZCBsb2dnZXI6IFZlcmJvc2l0eUxvZ2dlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIFN0YW5kYXJkT3V0cHV0V3JpdGVyLlxuICAgKiBAc3VtbWFyeSBDb25zdHJ1Y3RzIHRoZSBTdGFuZGFyZE91dHB1dFdyaXRlciB3aXRoIGEgbG9jayBtZWNoYW5pc20gYW5kIG9wdGlvbmFsIGFyZ3VtZW50cy5cbiAgICpcbiAgICogQHBhcmFtIGNtZFxuICAgKiBAcGFyYW0gbG9jayAtIEEgUHJvbWlzZUV4ZWN1dG9yIHRvIGNvbnRyb2wgdGhlIGFzeW5jaHJvbm91cyBmbG93LlxuICAgKiBAcGFyYW0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIChjdXJyZW50bHkgdW51c2VkKS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBjbWQ6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgbG9jazogUHJvbWlzZUV4ZWN1dG9yPFI+LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiB1bmtub3duW11cbiAgKSB7XG4gICAgdGhpcy5sb2dnZXIgPSBMb2dnaW5nLmZvcih0aGlzLmNtZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3Mgb3V0cHV0IHRvIHRoZSBjb25zb2xlLlxuICAgKiBAc3VtbWFyeSBGb3JtYXRzIGFuZCBsb2dzIHRoZSBnaXZlbiBkYXRhIHdpdGggYSB0aW1lc3RhbXAgYW5kIHR5cGUgaW5kaWNhdG9yLlxuICAgKlxuICAgKiBAcGFyYW0gdHlwZSAtIFRoZSB0eXBlIG9mIG91dHB1dCAoc3Rkb3V0IG9yIHN0ZGVycikuXG4gICAqIEBwYXJhbSBkYXRhIC0gVGhlIGRhdGEgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGxvZyh0eXBlOiBPdXRwdXRUeXBlLCBkYXRhOiBzdHJpbmcgfCBCdWZmZXIpIHtcbiAgICBkYXRhID0gQnVmZmVyLmlzQnVmZmVyKGRhdGEpID8gZGF0YS50b1N0cmluZyhFbmNvZGluZykgOiBkYXRhO1xuICAgIGNvbnN0IGxvZyA9IHR5cGUgPT09IFwic3RkZXJyXCIgPyBzdHlsZShkYXRhKS5yZWQudGV4dCA6IGRhdGE7XG4gICAgdGhpcy5sb2dnZXIuaW5mbyhsb2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHN0YW5kYXJkIG91dHB1dCBkYXRhLlxuICAgKiBAc3VtbWFyeSBMb2dzIHRoZSBnaXZlbiBjaHVuayBhcyBzdGFuZGFyZCBvdXRwdXQuXG4gICAqXG4gICAqIEBwYXJhbSBjaHVuayAtIFRoZSBkYXRhIGNodW5rIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIGRhdGEoY2h1bms6IGFueSkge1xuICAgIHRoaXMubG9nKFwic3Rkb3V0XCIsIFN0cmluZyhjaHVuaykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGVycm9yIG91dHB1dCBkYXRhLlxuICAgKiBAc3VtbWFyeSBMb2dzIHRoZSBnaXZlbiBjaHVuayBhcyBlcnJvciBvdXRwdXQuXG4gICAqXG4gICAqIEBwYXJhbSBjaHVuayAtIFRoZSBlcnJvciBkYXRhIGNodW5rIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIGVycm9yKGNodW5rOiBhbnkpIHtcbiAgICB0aGlzLmxvZyhcInN0ZGVyclwiLCBTdHJpbmcoY2h1bmspKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBlcnJvciBvYmplY3RzLlxuICAgKiBAc3VtbWFyeSBMb2dzIHRoZSBlcnJvciBtZXNzYWdlIGZyb20gdGhlIGdpdmVuIEVycm9yIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIGVyciAtIFRoZSBFcnJvciBvYmplY3QgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgZXJyb3JzKGVycjogRXJyb3IpIHtcbiAgICB0aGlzLmxvZyhcInN0ZGVyclwiLCBgRXJyb3IgZXhlY3V0aW5nIGNvbW1hbmQgZXhpdGVkIDogJHtlcnJ9YCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgdGhlIGV4aXQgb2YgYSBjb21tYW5kLlxuICAgKiBAc3VtbWFyeSBMb2dzIHRoZSBleGl0IGNvZGUgYW5kIHJlc29sdmVzIG9yIHJlamVjdHMgdGhlIHByb21pc2UgYmFzZWQgb24gdGhlIGNvZGUuXG4gICAqXG4gICAqIEBwYXJhbSBjb2RlIC0gVGhlIGV4aXQgY29kZSBvZiB0aGUgY29tbWFuZC5cbiAgICogQHBhcmFtIGxvZ3NcbiAgICovXG4gIGV4aXQoY29kZTogbnVtYmVyIHwgc3RyaW5nLCBsb2dzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMubG9nKFxuICAgICAgXCJzdGRvdXRcIixcbiAgICAgIGBjb21tYW5kIGV4aXRlZCBjb2RlIDogJHtjb2RlID09PSAwID8gc3R5bGUoY29kZS50b1N0cmluZygpKS5ncmVlbi50ZXh0IDogc3R5bGUoY29kZSA9PT0gbnVsbCA/IFwibnVsbFwiIDogY29kZS50b1N0cmluZygpKS5yZWQudGV4dH1gXG4gICAgKTtcbiAgICBpZiAoY29kZSA9PT0gMCkge1xuICAgICAgdGhpcy5yZXNvbHZlKGxvZ3MubWFwKChsKSA9PiBsLnRyaW0oKSkuam9pbihcIlxcblwiKSBhcyBSKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZWplY3QobmV3IEVycm9yKGxvZ3MubGVuZ3RoID8gbG9ncy5qb2luKFwiXFxuXCIpIDogY29kZS50b1N0cmluZygpKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYSBjb21tYW5kIHN0cmluZyBvciBhcnJheSBpbnRvIGNvbXBvbmVudHMuXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIHRoZSBjb21tYW5kIGludG8gYSBjb25zaXN0ZW50IGZvcm1hdCBhbmQgc3RvcmVzIGl0LCB0aGVuIHJldHVybnMgaXQgc3BsaXQgaW50byBjb21tYW5kIGFuZCBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgYXMgYSBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5ncy5cbiAgICogQHJldHVybiBBIHR1cGxlIGNvbnRhaW5pbmcgdGhlIGNvbW1hbmQgYW5kIGl0cyBhcmd1bWVudHMgYXMgc2VwYXJhdGUgZWxlbWVudHMuXG4gICAqL1xuICBwYXJzZUNvbW1hbmQoY29tbWFuZDogc3RyaW5nIHwgc3RyaW5nW10pOiBbc3RyaW5nLCBzdHJpbmdbXV0ge1xuICAgIGNvbW1hbmQgPSB0eXBlb2YgY29tbWFuZCA9PT0gXCJzdHJpbmdcIiA/IGNvbW1hbmQuc3BsaXQoXCIgXCIpIDogY29tbWFuZDtcbiAgICB0aGlzLmNtZCA9IGNvbW1hbmQuam9pbihcIiBcIik7XG4gICAgcmV0dXJuIFtjb21tYW5kWzBdLCBjb21tYW5kLnNsaWNlKDEpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVzb2x2ZXMgdGhlIHByb21pc2Ugd2l0aCBhIHN1Y2Nlc3MgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgTG9ncyBhIHN1Y2Nlc3MgbWVzc2FnZSBhbmQgcmVzb2x2ZXMgdGhlIHByb21pc2Ugd2l0aCB0aGUgZ2l2ZW4gcmVhc29uLlxuICAgKlxuICAgKiBAcGFyYW0gcmVhc29uIC0gVGhlIHJlYXNvbiBmb3IgcmVzb2x2aW5nIHRoZSBwcm9taXNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlc29sdmUocmVhc29uOiBSKSB7XG4gICAgdGhpcy5sb2coXG4gICAgICBcInN0ZG91dFwiLFxuICAgICAgYCR7dGhpcy5jbWR9IGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseTogJHtzdHlsZShyZWFzb24gPyBcInJhbiB0byBjb21wbGV0aW9uXCIgOiAocmVhc29uIGFzIHN0cmluZykpLmdyZWVufWBcbiAgICApO1xuICAgIHRoaXMubG9jay5yZXNvbHZlKHJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlamVjdHMgdGhlIHByb21pc2Ugd2l0aCBhbiBlcnJvciBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBMb2dzIGFuIGVycm9yIG1lc3NhZ2UgYW5kIHJlamVjdHMgdGhlIHByb21pc2Ugd2l0aCB0aGUgZ2l2ZW4gcmVhc29uLlxuICAgKlxuICAgKiBAcGFyYW0gcmVhc29uIC0gVGhlIHJlYXNvbiBmb3IgcmVqZWN0aW5nIHRoZSBwcm9taXNlLCBlaXRoZXIgYSBudW1iZXIgKGV4aXQgY29kZSkgb3IgYSBzdHJpbmcuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVqZWN0KHJlYXNvbjogbnVtYmVyIHwgc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBpZiAoIShyZWFzb24gaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgIHJlYXNvbiA9IG5ldyBFcnJvcihcbiAgICAgICAgdHlwZW9mIHJlYXNvbiA9PT0gXCJudW1iZXJcIiA/IGBFeGl0IGNvZGUgJHtyZWFzb259YCA6IHJlYXNvblxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5sb2coXG4gICAgICBcInN0ZGVyclwiLFxuICAgICAgYCR7dGhpcy5jbWR9IGZhaWxlZCB0byBleGVjdXRlOiAke3N0eWxlKHJlYXNvbi5tZXNzYWdlKS5yZWR9YFxuICAgICk7XG4gICAgdGhpcy5sb2NrLnJlamVjdChyZWFzb24pO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDaGlsZFByb2Nlc3NXaXRob3V0TnVsbFN0cmVhbXMsXG4gIHNwYXduLFxuICBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW8sXG59IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBTdGFuZGFyZE91dHB1dFdyaXRlciB9IGZyb20gXCIuLi93cml0ZXJzL1N0YW5kYXJkT3V0cHV0V3JpdGVyXCI7XG5pbXBvcnQgeyBDb21tYW5kUmVzdWx0IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IExvZ2dpbmcgfSBmcm9tIFwiLi4vb3V0cHV0L2xvZ2dpbmdcIjtcbmltcG9ydCB7IE91dHB1dFdyaXRlckNvbnN0cnVjdG9yIH0gZnJvbSBcIi4uL3dyaXRlcnMvdHlwZXNcIjtcbmltcG9ydCB7IFZlcmJvc2l0eUxvZ2dlciB9IGZyb20gXCIuLi9vdXRwdXQvdHlwZXNcIjtcbmltcG9ydCB7IEFib3J0Q29kZSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbG9ja2VkIHZlcnNpb24gb2YgYSBmdW5jdGlvbi5cbiAqIEBzdW1tYXJ5IFRoaXMgaGlnaGVyLW9yZGVyIGZ1bmN0aW9uIHRha2VzIGEgZnVuY3Rpb24gYW5kIHJldHVybnMgYSBuZXcgZnVuY3Rpb24gdGhhdCBlbnN1cmVzXG4gKiBzZXF1ZW50aWFsIGV4ZWN1dGlvbiBvZiB0aGUgb3JpZ2luYWwgZnVuY3Rpb24sIGV2ZW4gd2hlbiBjYWxsZWQgbXVsdGlwbGUgdGltZXMgY29uY3VycmVudGx5LlxuICogSXQgdXNlcyBhIFByb21pc2UtYmFzZWQgbG9ja2luZyBtZWNoYW5pc20gdG8gcXVldWUgZnVuY3Rpb24gY2FsbHMuXG4gKlxuICogQHRlbXBsYXRlIFIgLSBUaGUgcmV0dXJuIHR5cGUgb2YgdGhlIGlucHV0IGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSBmIC0gVGhlIGZ1bmN0aW9uIHRvIGJlIGxvY2tlZC4gSXQgY2FuIHRha2UgYW55IG51bWJlciBvZiBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gYSB2YWx1ZSBvZiB0eXBlIFIuXG4gKiBAcmV0dXJuIEEgbmV3IGZ1bmN0aW9uIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlIGFzIHRoZSBpbnB1dCBmdW5jdGlvbiwgYnV0IHdpdGggc2VxdWVudGlhbCBleGVjdXRpb24gZ3VhcmFudGVlZC5cbiAqXG4gKiBAZnVuY3Rpb24gbG9ja2lmeVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IExvY2tlZEZ1bmN0aW9uXG4gKiAgIHBhcnRpY2lwYW50IE9yaWdpbmFsRnVuY3Rpb25cbiAqICAgQ2FsbGVyLT4+TG9ja2VkRnVuY3Rpb246IENhbGwgd2l0aCBwYXJhbXNcbiAqICAgTG9ja2VkRnVuY3Rpb24tPj5Mb2NrZWRGdW5jdGlvbjogQ2hlY2sgY3VycmVudCBsb2NrXG4gKiAgIGFsdCBMb2NrIGlzIHJlc29sdmVkXG4gKiAgICAgTG9ja2VkRnVuY3Rpb24tPj5PcmlnaW5hbEZ1bmN0aW9uOiBFeGVjdXRlIHdpdGggcGFyYW1zXG4gKiAgICAgT3JpZ2luYWxGdW5jdGlvbi0tPj5Mb2NrZWRGdW5jdGlvbjogUmV0dXJuIHJlc3VsdFxuICogICAgIExvY2tlZEZ1bmN0aW9uLS0+PkNhbGxlcjogUmV0dXJuIHJlc3VsdFxuICogICBlbHNlIExvY2sgaXMgcGVuZGluZ1xuICogICAgIExvY2tlZEZ1bmN0aW9uLT4+TG9ja2VkRnVuY3Rpb246IFF1ZXVlIGV4ZWN1dGlvblxuICogICAgIExvY2tlZEZ1bmN0aW9uLS0+PkNhbGxlcjogUmV0dXJuIHByb21pc2VcbiAqICAgICBOb3RlIG92ZXIgTG9ja2VkRnVuY3Rpb246IFdhaXQgZm9yIHByZXZpb3VzIGV4ZWN1dGlvblxuICogICAgIExvY2tlZEZ1bmN0aW9uLT4+T3JpZ2luYWxGdW5jdGlvbjogRXhlY3V0ZSB3aXRoIHBhcmFtc1xuICogICAgIE9yaWdpbmFsRnVuY3Rpb24tLT4+TG9ja2VkRnVuY3Rpb246IFJldHVybiByZXN1bHRcbiAqICAgICBMb2NrZWRGdW5jdGlvbi0tPj5DYWxsZXI6IFJlc29sdmUgcHJvbWlzZSB3aXRoIHJlc3VsdFxuICogICBlbmRcbiAqICAgTG9ja2VkRnVuY3Rpb24tPj5Mb2NrZWRGdW5jdGlvbjogVXBkYXRlIGxvY2tcbiAqXG4gKiBAbWVtYmVyT2YgQGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2NraWZ5PFI+KGY6ICguLi5wYXJhbXM6IHVua25vd25bXSkgPT4gUikge1xuICBsZXQgbG9jazogUHJvbWlzZTxSIHwgdm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcbiAgcmV0dXJuICguLi5wYXJhbXM6IHVua25vd25bXSkgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IGxvY2sudGhlbigoKSA9PiBmKC4uLnBhcmFtcykpO1xuICAgIGxvY2sgPSByZXN1bHQuY2F0Y2goKCkgPT4ge30pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGFpbkFib3J0Q29udHJvbGxlcihcbiAgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyLFxuICAuLi5zaWduYWxzOiBBYm9ydFNpZ25hbFtdXG4pOiBBYm9ydENvbnRyb2xsZXI7XG5leHBvcnQgZnVuY3Rpb24gY2hhaW5BYm9ydENvbnRyb2xsZXIoXG4gIC4uLnNpZ25hbHM6IEFib3J0U2lnbmFsW11cbik6IEFib3J0Q29udHJvbGxlcjtcbmV4cG9ydCBmdW5jdGlvbiBjaGFpbkFib3J0Q29udHJvbGxlcihcbiAgYXJndW1lbnQwOiBBYm9ydENvbnRyb2xsZXIgfCBBYm9ydFNpZ25hbCxcbiAgLi4ucmVtYWluZGVyOiBBYm9ydFNpZ25hbFtdXG4pOiBBYm9ydENvbnRyb2xsZXIge1xuICBsZXQgc2lnbmFsczogQWJvcnRTaWduYWxbXTtcbiAgbGV0IGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcjtcblxuICAvLyBub3JtYWxpemUgYXJnc1xuICBpZiAoYXJndW1lbnQwIGluc3RhbmNlb2YgQWJvcnRTaWduYWwpIHtcbiAgICBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIHNpZ25hbHMgPSBbYXJndW1lbnQwLCAuLi5yZW1haW5kZXJdO1xuICB9IGVsc2Uge1xuICAgIGNvbnRyb2xsZXIgPSBhcmd1bWVudDA7XG4gICAgc2lnbmFscyA9IHJlbWFpbmRlcjtcbiAgfVxuXG4gIC8vIGlmIHRoZSBjb250cm9sbGVyIGlzIGFscmVhZHkgYWJvcnRlZCwgZXhpdCBlYXJseVxuICBpZiAoY29udHJvbGxlci5zaWduYWwuYWJvcnRlZCkge1xuICAgIHJldHVybiBjb250cm9sbGVyO1xuICB9XG5cbiAgY29uc3QgaGFuZGxlciA9ICgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKTtcblxuICBmb3IgKGNvbnN0IHNpZ25hbCBvZiBzaWduYWxzKSB7XG4gICAgLy8gY2hlY2sgYmVmb3JlIGFkZGluZyEgKGFuZCBhc3N1bWUgdGhlcmUgaXMgbm8gcG9zc2libGUgd2F5IHRoYXQgdGhlIHNpZ25hbCBjb3VsZFxuICAgIC8vIGFib3J0IGJldHdlZW4gdGhlIGBpZmAgY2hlY2sgYW5kIGFkZGluZyB0aGUgZXZlbnQgbGlzdGVuZXIpXG4gICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBoYW5kbGVyLCB7XG4gICAgICBvbmNlOiB0cnVlLFxuICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBjb250cm9sbGVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25Db21tYW5kPFIgPSBzdHJpbmc+KFxuICBvdXRwdXQ6IFN0YW5kYXJkT3V0cHV0V3JpdGVyPFI+LFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIG9wdHM6IFNwYXduT3B0aW9uc1dpdGhvdXRTdGRpbyxcbiAgYWJvcnQ6IEFib3J0Q29udHJvbGxlcixcbiAgbG9nZ2VyOiBWZXJib3NpdHlMb2dnZXJcbik6IENoaWxkUHJvY2Vzc1dpdGhvdXROdWxsU3RyZWFtcyB7XG4gIGZ1bmN0aW9uIHNwYXduSW5uZXIoY29tbWFuZDogc3RyaW5nLCBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXIpIHtcbiAgICBjb25zdCBbY21kLCBhcmd6XSA9IG91dHB1dC5wYXJzZUNvbW1hbmQoY29tbWFuZCk7XG4gICAgbG9nZ2VyLmluZm8oYFJ1bm5pbmcgY29tbWFuZDogJHtjbWR9YCk7XG4gICAgbG9nZ2VyLmRlYnVnKGB3aXRoIGFyZ3M6ICR7YXJnei5qb2luKFwiIFwiKX1gKTtcbiAgICBjb25zdCBjaGlsZFByb2Nlc3MgPSBzcGF3bihjbWQsIGFyZ3osIHtcbiAgICAgIC4uLm9wdHMsXG4gICAgICBjd2Q6IG9wdHMuY3dkIHx8IHByb2Nlc3MuY3dkKCksXG4gICAgICBlbnY6IE9iamVjdC5hc3NpZ24oe30sIHByb2Nlc3MuZW52LCBvcHRzLmVudiwgeyBQQVRIOiBwcm9jZXNzLmVudi5QQVRIIH0pLFxuICAgICAgc2hlbGw6IG9wdHMuc2hlbGwgfHwgZmFsc2UsXG4gICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgIH0pO1xuICAgIGxvZ2dlci52ZXJib3NlKGBwaWQgOiAke2NoaWxkUHJvY2Vzcy5waWR9YCk7XG4gICAgcmV0dXJuIGNoaWxkUHJvY2VzcztcbiAgfVxuXG4gIGNvbnN0IG0gPSBjb21tYW5kLm1hdGNoKC9bPD4kI10vZyk7XG4gIGlmIChtKVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIGNvbW1hbmQ6ICR7Y29tbWFuZH0uIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyczogJHttfWBcbiAgICApO1xuICBpZiAoY29tbWFuZC5pbmNsdWRlcyhcIiB8IFwiKSkge1xuICAgIGNvbnN0IGNtZHMgPSBjb21tYW5kLnNwbGl0KFwiIHwgXCIpO1xuICAgIGNvbnN0IHNwYXducyA9IFtdO1xuICAgIGNvbnN0IGNvbnRyb2xsZXJzID0gbmV3IEFycmF5KGNtZHMubGVuZ3RoKTtcbiAgICBjb250cm9sbGVyc1swXSA9IGFib3J0O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY21kcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGkgIT09IDApXG4gICAgICAgIGNvbnRyb2xsZXJzW2ldID0gY2hhaW5BYm9ydENvbnRyb2xsZXIoY29udHJvbGxlcnNbaSAtIDFdLnNpZ25hbCk7XG4gICAgICBzcGF3bnMucHVzaChzcGF3bklubmVyKGNtZHNbaV0sIGNvbnRyb2xsZXJzW2ldKSk7XG4gICAgICBpZiAoaSA9PT0gMCkgY29udGludWU7XG4gICAgICBzcGF3bnNbaSAtIDFdLnN0ZG91dC5waXBlKHNwYXduc1tpXS5zdGRpbik7XG4gICAgfVxuICAgIHJldHVybiBzcGF3bnNbY21kcy5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIHJldHVybiBzcGF3bklubmVyKGNvbW1hbmQsIGFib3J0KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgYSBjb21tYW5kIGFzeW5jaHJvbm91c2x5IHdpdGggY3VzdG9taXphYmxlIG91dHB1dCBoYW5kbGluZy5cbiAqIEBzdW1tYXJ5IFRoaXMgZnVuY3Rpb24gcnVucyBhIHNoZWxsIGNvbW1hbmQgYXMgYSBjaGlsZCBwcm9jZXNzLCBwcm92aWRpbmcgZmluZS1ncmFpbmVkXG4gKiBjb250cm9sIG92ZXIgaXRzIGV4ZWN1dGlvbiBhbmQgb3V0cHV0IGhhbmRsaW5nLiBJdCBzdXBwb3J0cyBjdXN0b20gb3V0cHV0IHdyaXRlcnMsXG4gKiBhbGxvd3MgZm9yIGNvbW1hbmQgYWJvcnRpb24sIGFuZCBjYXB0dXJlcyBib3RoIHN0ZG91dCBhbmQgc3RkZXJyLlxuICpcbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHR5cGUgb2YgdGhlIHJlc29sdmVkIHZhbHVlIGZyb20gdGhlIGNvbW1hbmQgZXhlY3V0aW9uLlxuICpcbiAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gcnVuLCBlaXRoZXIgYXMgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAqIEBwYXJhbSBvcHRzIC0gU3Bhd24gb3B0aW9ucyBmb3IgdGhlIGNoaWxkIHByb2Nlc3MuIERlZmF1bHRzIHRvIGFuIGVtcHR5IG9iamVjdC5cbiAqIEBwYXJhbSBvdXRwdXRDb25zdHJ1Y3RvciAtIENvbnN0cnVjdG9yIGZvciB0aGUgb3V0cHV0IHdyaXRlci4gRGVmYXVsdHMgdG8gU3RhbmRhcmRPdXRwdXRXcml0ZXIuXG4gKiBAcGFyYW0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIG91dHB1dCBjb25zdHJ1Y3Rvci5cbiAqIEByZXR1cm4ge0NvbW1hbmRSZXN1bHR9IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb21tYW5kIHJlc3VsdCBvZiB0eXBlIFIuXG4gKlxuICogQGZ1bmN0aW9uIHJ1bkNvbW1hbmRcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBydW5Db21tYW5kXG4gKiAgIHBhcnRpY2lwYW50IE91dHB1dFdyaXRlclxuICogICBwYXJ0aWNpcGFudCBDaGlsZFByb2Nlc3NcbiAqICAgQ2FsbGVyLT4+cnVuQ29tbWFuZDogQ2FsbCB3aXRoIGNvbW1hbmQgYW5kIG9wdGlvbnNcbiAqICAgcnVuQ29tbWFuZC0+Pk91dHB1dFdyaXRlcjogQ3JlYXRlIG5ldyBpbnN0YW5jZVxuICogICBydW5Db21tYW5kLT4+T3V0cHV0V3JpdGVyOiBQYXJzZSBjb21tYW5kXG4gKiAgIHJ1bkNvbW1hbmQtPj5DaGlsZFByb2Nlc3M6IFNwYXduIHByb2Nlc3NcbiAqICAgQ2hpbGRQcm9jZXNzLS0+PnJ1bkNvbW1hbmQ6IFJldHVybiBwcm9jZXNzIG9iamVjdFxuICogICBydW5Db21tYW5kLT4+Q2hpbGRQcm9jZXNzOiBTZXQgdXAgZXZlbnQgbGlzdGVuZXJzXG4gKiAgIGxvb3AgRm9yIGVhY2ggc3Rkb3V0IGRhdGFcbiAqICAgICBDaGlsZFByb2Nlc3MtPj5ydW5Db21tYW5kOiBFbWl0IHN0ZG91dCBkYXRhXG4gKiAgICAgcnVuQ29tbWFuZC0+Pk91dHB1dFdyaXRlcjogSGFuZGxlIHN0ZG91dCBkYXRhXG4gKiAgIGVuZFxuICogICBsb29wIEZvciBlYWNoIHN0ZGVyciBkYXRhXG4gKiAgICAgQ2hpbGRQcm9jZXNzLT4+cnVuQ29tbWFuZDogRW1pdCBzdGRlcnIgZGF0YVxuICogICAgIHJ1bkNvbW1hbmQtPj5PdXRwdXRXcml0ZXI6IEhhbmRsZSBzdGRlcnIgZGF0YVxuICogICBlbmRcbiAqICAgQ2hpbGRQcm9jZXNzLT4+cnVuQ29tbWFuZDogRW1pdCBlcnJvciAoaWYgYW55KVxuICogICBydW5Db21tYW5kLT4+T3V0cHV0V3JpdGVyOiBIYW5kbGUgZXJyb3JcbiAqICAgQ2hpbGRQcm9jZXNzLT4+cnVuQ29tbWFuZDogRW1pdCBleGl0XG4gKiAgIHJ1bkNvbW1hbmQtPj5PdXRwdXRXcml0ZXI6IEhhbmRsZSBleGl0XG4gKiAgIE91dHB1dFdyaXRlci0tPj5ydW5Db21tYW5kOiBSZXNvbHZlIG9yIHJlamVjdCBwcm9taXNlXG4gKiAgIHJ1bkNvbW1hbmQtLT4+Q2FsbGVyOiBSZXR1cm4gQ29tbWFuZFJlc3VsdFxuICpcbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bkNvbW1hbmQ8UiA9IHN0cmluZz4oXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgb3B0czogU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvID0ge30sXG4gIG91dHB1dENvbnN0cnVjdG9yOiBPdXRwdXRXcml0ZXJDb25zdHJ1Y3RvcjxcbiAgICBSLFxuICAgIFN0YW5kYXJkT3V0cHV0V3JpdGVyPFI+LFxuICAgIEVycm9yXG4gID4gPSBTdGFuZGFyZE91dHB1dFdyaXRlcjxSPixcbiAgLi4uYXJnczogdW5rbm93bltdXG4pOiBDb21tYW5kUmVzdWx0PFI+IHtcbiAgY29uc3QgbG9nZ2VyID0gTG9nZ2luZy5mb3IocnVuQ29tbWFuZCk7XG4gIGNvbnN0IGFib3J0ID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGNvbnN0IHJlc3VsdDogT21pdDxDb21tYW5kUmVzdWx0LCBcInByb21pc2VcIiB8IFwicGlwZVwiPiA9IHtcbiAgICBhYm9ydDogYWJvcnQsXG4gICAgY29tbWFuZDogY29tbWFuZCxcbiAgICBsb2dzOiBbXSxcbiAgICBlcnJzOiBbXSxcbiAgfTtcblxuICBjb25zdCBsb2NrID0gbmV3IFByb21pc2U8Uj4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGxldCBvdXRwdXQ7XG4gICAgdHJ5IHtcbiAgICAgIG91dHB1dCA9IG5ldyBvdXRwdXRDb25zdHJ1Y3RvcihcbiAgICAgICAgY29tbWFuZCxcbiAgICAgICAge1xuICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgcmVqZWN0LFxuICAgICAgICB9LFxuICAgICAgICAuLi5hcmdzXG4gICAgICApO1xuXG4gICAgICByZXN1bHQuY21kID0gc3Bhd25Db21tYW5kPFI+KG91dHB1dCwgY29tbWFuZCwgb3B0cywgYWJvcnQsIGxvZ2dlcik7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoYEVycm9yIHJ1bm5pbmcgY29tbWFuZCAke2NvbW1hbmR9OiAke2V9YCkpO1xuICAgIH1cblxuICAgIHJlc3VsdC5jbWQuc3Rkb3V0LnNldEVuY29kaW5nKFwidXRmOFwiKTtcblxuICAgIHJlc3VsdC5jbWQuc3Rkb3V0Lm9uKFwiZGF0YVwiLCAoY2h1bms6IGFueSkgPT4ge1xuICAgICAgY2h1bmsgPSBjaHVuay50b1N0cmluZygpO1xuICAgICAgcmVzdWx0LmxvZ3MucHVzaChjaHVuayk7XG4gICAgICBvdXRwdXQuZGF0YShjaHVuayk7XG4gICAgfSk7XG5cbiAgICByZXN1bHQuY21kLnN0ZGVyci5vbihcImRhdGFcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgZGF0YSA9IGRhdGEudG9TdHJpbmcoKTtcbiAgICAgIHJlc3VsdC5lcnJzLnB1c2goZGF0YSk7XG4gICAgICBvdXRwdXQuZXJyb3IoZGF0YSk7XG4gICAgfSk7XG5cbiAgICByZXN1bHQuY21kLm9uY2UoXCJlcnJvclwiLCAoZXJyOiBFcnJvcikgPT4ge1xuICAgICAgb3V0cHV0LmV4aXQoZXJyLm1lc3NhZ2UsIHJlc3VsdC5lcnJzKTtcbiAgICB9KTtcblxuICAgIHJlc3VsdC5jbWQub25jZShcImV4aXRcIiwgKGNvZGU6IG51bWJlciA9IDApID0+IHtcbiAgICAgIGlmIChhYm9ydC5zaWduYWwuYWJvcnRlZCAmJiBjb2RlID09PSBudWxsKSBjb2RlID0gQWJvcnRDb2RlIGFzIGFueTtcbiAgICAgIG91dHB1dC5leGl0KGNvZGUsIGNvZGUgPT09IDAgPyByZXN1bHQubG9ncyA6IHJlc3VsdC5lcnJzKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgT2JqZWN0LmFzc2lnbihyZXN1bHQsIHtcbiAgICBwcm9taXNlOiBsb2NrLFxuICAgIHBpcGU6IGFzeW5jIDxFPihjYjogKHI6IFIpID0+IEUpID0+IHtcbiAgICAgIGNvbnN0IGwgPSBsb2dnZXIuZm9yKFwicGlwZVwiKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGwudmVyYm9zZShgRXhlY3V0aW5nIHBpcGUgZnVuY3Rpb24gJHtjb21tYW5kfS4uLmApO1xuICAgICAgICBjb25zdCByZXN1bHQ6IFIgPSBhd2FpdCBsb2NrO1xuICAgICAgICBsLnZlcmJvc2UoYFBpcGluZyBvdXRwdXQgdG8gJHtjYi5uYW1lfTogJHtyZXN1bHR9YCk7XG4gICAgICAgIHJldHVybiBjYihyZXN1bHQpO1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsLmVycm9yKGBFcnJvciBwaXBpbmcgY29tbWFuZCBvdXRwdXQ6ICR7ZX1gKTtcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0IGFzIENvbW1hbmRSZXN1bHQ8Uj47XG59XG4iLCJpbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCIuLi9vdXRwdXQvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgcGF0Y2hTdHJpbmcgfSBmcm9tIFwiLi90ZXh0XCI7XG5pbXBvcnQgeyBydW5Db21tYW5kIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IERlcGVuZGVuY3lNYXAsIFNpbXBsZURlcGVuZGVuY3lNYXAgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5jb25zdCBsb2dnZXIgPSBMb2dnaW5nLmZvcihcImZzXCIpO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQYXRjaGVzIGEgZmlsZSB3aXRoIGdpdmVuIHZhbHVlcy5cbiAqIEBzdW1tYXJ5IFJlYWRzIGEgZmlsZSwgYXBwbGllcyBwYXRjaGVzIHVzaW5nIFRleHRVdGlscywgYW5kIHdyaXRlcyB0aGUgcmVzdWx0IGJhY2sgdG8gdGhlIGZpbGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUaGUgcGF0aCB0byB0aGUgZmlsZSB0byBiZSBwYXRjaGVkLlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+fSB2YWx1ZXMgLSBUaGUgdmFsdWVzIHRvIHBhdGNoIGludG8gdGhlIGZpbGUuXG4gKiBAcmV0dXJuIHt2b2lkfVxuICpcbiAqIEBmdW5jdGlvbiBwYXRjaEZpbGVcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBwYXRjaEZpbGVcbiAqICAgcGFydGljaXBhbnQgZnNcbiAqICAgcGFydGljaXBhbnQgcmVhZEZpbGVcbiAqICAgcGFydGljaXBhbnQgVGV4dFV0aWxzXG4gKiAgIHBhcnRpY2lwYW50IHdyaXRlRmlsZVxuICogICBDYWxsZXItPj5wYXRjaEZpbGU6IENhbGwgd2l0aCBwYXRoIGFuZCB2YWx1ZXNcbiAqICAgcGF0Y2hGaWxlLT4+ZnM6IENoZWNrIGlmIGZpbGUgZXhpc3RzXG4gKiAgIHBhdGNoRmlsZS0+PnJlYWRGaWxlOiBSZWFkIGZpbGUgY29udGVudFxuICogICByZWFkRmlsZS0+PmZzOiBSZWFkIGZpbGVcbiAqICAgZnMtLT4+cmVhZEZpbGU6IFJldHVybiBmaWxlIGNvbnRlbnRcbiAqICAgcmVhZEZpbGUtLT4+cGF0Y2hGaWxlOiBSZXR1cm4gZmlsZSBjb250ZW50XG4gKiAgIHBhdGNoRmlsZS0+PlRleHRVdGlsczogUGF0Y2ggc3RyaW5nXG4gKiAgIFRleHRVdGlscy0tPj5wYXRjaEZpbGU6IFJldHVybiBwYXRjaGVkIGNvbnRlbnRcbiAqICAgcGF0Y2hGaWxlLT4+d3JpdGVGaWxlOiBXcml0ZSBwYXRjaGVkIGNvbnRlbnRcbiAqICAgd3JpdGVGaWxlLT4+ZnM6IFdyaXRlIHRvIGZpbGVcbiAqICAgZnMtLT4+d3JpdGVGaWxlOiBGaWxlIHdyaXR0ZW5cbiAqICAgd3JpdGVGaWxlLS0+PnBhdGNoRmlsZTogRmlsZSB3cml0dGVuXG4gKiAgIHBhdGNoRmlsZS0tPj5DYWxsZXI6IFBhdGNoaW5nIGNvbXBsZXRlXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpmcy11dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0Y2hGaWxlKFxuICBwYXRoOiBzdHJpbmcsXG4gIHZhbHVlczogUmVjb3JkPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPlxuKSB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IocGF0Y2hGaWxlKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHBhdGgpKVxuICAgIHRocm93IG5ldyBFcnJvcihgRmlsZSBub3QgZm91bmQgYXQgcGF0aCBcIiR7cGF0aH1cIi5gKTtcbiAgbGV0IGNvbnRlbnQgPSByZWFkRmlsZShwYXRoKTtcblxuICB0cnkge1xuICAgIGxvZy52ZXJib3NlKGBQYXRjaGluZyBmaWxlIFwiJHtwYXRofVwiLi4uYCk7XG4gICAgbG9nLmRlYnVnKGB3aXRoIHZhbHVlOiAke0pTT04uc3RyaW5naWZ5KHZhbHVlcyl9YCk7XG4gICAgY29udGVudCA9IHBhdGNoU3RyaW5nKGNvbnRlbnQsIHZhbHVlcyk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBwYXRjaGluZyBmaWxlOiAke2Vycm9yfWApO1xuICB9XG4gIHdyaXRlRmlsZShwYXRoLCBjb250ZW50KTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVhZHMgYSBmaWxlIGFuZCByZXR1cm5zIGl0cyBjb250ZW50LlxuICogQHN1bW1hcnkgUmVhZHMgdGhlIGNvbnRlbnQgb2YgYSBmaWxlIGF0IHRoZSBzcGVjaWZpZWQgcGF0aCBhbmQgcmV0dXJucyBpdCBhcyBhIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBmaWxlIHRvIGJlIHJlYWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjb250ZW50IG9mIHRoZSBmaWxlLlxuICpcbiAqIEBmdW5jdGlvbiByZWFkRmlsZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRGaWxlKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IocmVhZEZpbGUpO1xuICB0cnkge1xuICAgIGxvZy52ZXJib3NlKGBSZWFkaW5nIGZpbGUgXCIke3BhdGh9XCIuLi5gKTtcbiAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKHBhdGgsIFwidXRmOFwiKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2cudmVyYm9zZShgRXJyb3IgcmVhZGluZyBmaWxlIFwiJHtwYXRofVwiOiAke2Vycm9yfWApO1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgcmVhZGluZyBmaWxlIFwiJHtwYXRofVwiOiAke2Vycm9yfWApO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFdyaXRlcyBkYXRhIHRvIGEgZmlsZS5cbiAqIEBzdW1tYXJ5IFdyaXRlcyB0aGUgcHJvdmlkZWQgZGF0YSB0byBhIGZpbGUgYXQgdGhlIHNwZWNpZmllZCBwYXRoLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVGhlIHBhdGggdG8gdGhlIGZpbGUgdG8gYmUgd3JpdHRlbi5cbiAqIEBwYXJhbSB7c3RyaW5nIHwgQnVmZmVyfSBkYXRhIC0gVGhlIGRhdGEgdG8gYmUgd3JpdHRlbiB0byB0aGUgZmlsZS5cbiAqIEByZXR1cm4ge3ZvaWR9XG4gKlxuICogQGZ1bmN0aW9uIHdyaXRlRmlsZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlRmlsZShwYXRoOiBzdHJpbmcsIGRhdGE6IHN0cmluZyB8IEJ1ZmZlcik6IHZvaWQge1xuICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKHdyaXRlRmlsZSk7XG4gIHRyeSB7XG4gICAgbG9nLnZlcmJvc2UoYFdyaXRpbmcgZmlsZSBcIiR7cGF0aH0gd2l0aCAke2RhdGEubGVuZ3RofSBieXRlcy4uLmApO1xuICAgIGZzLndyaXRlRmlsZVN5bmMocGF0aCwgZGF0YSwgXCJ1dGY4XCIpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZy52ZXJib3NlKGBFcnJvciB3cml0aW5nIGZpbGUgXCIke3BhdGh9XCI6ICR7ZXJyb3J9YCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3cml0aW5nIGZpbGUgXCIke3BhdGh9XCI6ICR7ZXJyb3J9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGFsbCBmaWxlcyByZWN1cnNpdmVseSBmcm9tIGEgZGlyZWN0b3J5LlxuICogQHN1bW1hcnkgVHJhdmVyc2VzIHRocm91Z2ggZGlyZWN0b3JpZXMgYW5kIHN1YmRpcmVjdG9yaWVzIHRvIGNvbGxlY3QgYWxsIGZpbGUgcGF0aHMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHAgLSBUaGUgcGF0aCB0byBzdGFydCBzZWFyY2hpbmcgZnJvbS5cbiAqIEBwYXJhbSBmaWx0ZXJcbiAqIEByZXR1cm4ge3N0cmluZ1tdfSBBcnJheSBvZiBmaWxlIHBhdGhzLlxuICpcbiAqIEBmdW5jdGlvbiBnZXRBbGxGaWxlc1xuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZnMtdXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFsbEZpbGVzKFxuICBwOiBzdHJpbmcsXG4gIGZpbHRlcj86IChmOiBzdHJpbmcsIGk/OiBudW1iZXIpID0+IGJvb2xlYW5cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgbG9nID0gbG9nZ2VyLmZvcihnZXRBbGxGaWxlcyk7XG4gIGNvbnN0IGZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHRyeSB7XG4gICAgbG9nLnZlcmJvc2UoYFJldHJpZXZpbmcgYWxsIGZpbGVzIGZyb20gXCIke3B9XCIuLi5gKTtcbiAgICBjb25zdCBlbnRyaWVzID0gZnMucmVhZGRpclN5bmMocCk7XG5cbiAgICBlbnRyaWVzLmZvckVhY2goKGVudHJ5KSA9PiB7XG4gICAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihwLCBlbnRyeSk7XG4gICAgICBjb25zdCBzdGF0ID0gZnMuc3RhdFN5bmMoZnVsbFBhdGgpO1xuXG4gICAgICBpZiAoc3RhdC5pc0ZpbGUoKSkge1xuICAgICAgICBmaWxlcy5wdXNoKGZ1bGxQYXRoKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgIGZpbGVzLnB1c2goLi4uZ2V0QWxsRmlsZXMoZnVsbFBhdGgpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoIWZpbHRlcikgcmV0dXJuIGZpbGVzO1xuICAgIHJldHVybiBmaWxlcy5maWx0ZXIoZmlsdGVyKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2cudmVyYm9zZShgRXJyb3IgcmV0cmlldmluZyBmaWxlcyBmcm9tIFwiJHtwfVwiOiAke2Vycm9yfWApO1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgcmV0cmlldmluZyBmaWxlcyBmcm9tIFwiJHtwfVwiOiAke2Vycm9yfWApO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZW5hbWVGaWxlKHNvdXJjZTogc3RyaW5nLCBkZXN0OiBzdHJpbmcpIHtcbiAgY29uc3QgbG9nID0gbG9nZ2VyLmZvcihyZW5hbWVGaWxlKTtcbiAgbGV0IGRlc2NyaXB0b3JTb3VyY2UsIGRlc2NyaXB0b3JEZXN0O1xuXG4gIHRyeSB7XG4gICAgZGVzY3JpcHRvclNvdXJjZSA9IGZzLnN0YXRTeW5jKHNvdXJjZSk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nLnZlcmJvc2UoYFNvdXJjZSBwYXRoIFwiJHtzb3VyY2V9XCIgZG9lcyBub3QgZXhpc3Q6ICR7ZXJyb3J9YCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTb3VyY2UgcGF0aCBcIiR7c291cmNlfVwiIGRvZXMgbm90IGV4aXN0OiAke2Vycm9yfWApO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBkZXNjcmlwdG9yRGVzdCA9IGZzLnN0YXRTeW5jKGRlc3QpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIC8vIGRvIG5vdGhpbmcuIGl0cyBva1xuICB9XG4gIGlmIChkZXNjcmlwdG9yRGVzdCkge1xuICAgIGxvZy52ZXJib3NlKGBEZXN0aW5hdGlvbiBwYXRoIFwiJHtkZXN0fVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEZXN0aW5hdGlvbiBwYXRoIFwiJHtkZXN0fVwiIGFscmVhZHkgZXhpc3RzYCk7XG4gIH1cblxuICB0cnkge1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYFJlbmFtaW5nICR7ZGVzY3JpcHRvclNvdXJjZS5pc0ZpbGUoKSA/IFwiZmlsZVwiIDogXCJkaXJlY3RvcnlcIn0gXCIke3NvdXJjZX1cIiB0byBcIiR7ZGVzdH0uLi5gXG4gICAgKTtcbiAgICBmcy5yZW5hbWVTeW5jKHNvdXJjZSwgZGVzdCk7XG4gICAgbG9nLnZlcmJvc2UoYFN1Y2Nlc3NmdWxseSByZW5hbWVkIHRvIFwiJHtkZXN0fVwiYCk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgRXJyb3IgcmVuYW1pbmcgJHtkZXNjcmlwdG9yU291cmNlLmlzRmlsZSgpID8gXCJmaWxlXCIgOiBcImRpcmVjdG9yeVwifSBcIiR7c291cmNlfVwiIHRvIFwiJHtkZXN0fVwiOiAke2Vycm9yfWBcbiAgICApO1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBFcnJvciByZW5hbWluZyAke2Rlc2NyaXB0b3JTb3VyY2UuaXNGaWxlKCkgPyBcImZpbGVcIiA6IFwiZGlyZWN0b3J5XCJ9IFwiJHtzb3VyY2V9XCIgdG8gXCIke2Rlc3R9XCI6ICR7ZXJyb3J9YFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHlGaWxlKHNvdXJjZTogc3RyaW5nLCBkZXN0OiBzdHJpbmcpIHtcbiAgY29uc3QgbG9nID0gbG9nZ2VyLmZvcihjb3B5RmlsZSk7XG4gIGxldCBkZXNjcmlwdG9yU291cmNlLCBkZXNjcmlwdG9yRGVzdDtcbiAgdHJ5IHtcbiAgICBkZXNjcmlwdG9yU291cmNlID0gZnMuc3RhdFN5bmMoc291cmNlKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2cudmVyYm9zZShgU291cmNlIHBhdGggXCIke3NvdXJjZX1cIiBkb2VzIG5vdCBleGlzdDogJHtlcnJvcn1gKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNvdXJjZSBwYXRoIFwiJHtzb3VyY2V9XCIgZG9lcyBub3QgZXhpc3Q6ICR7ZXJyb3J9YCk7XG4gIH1cbiAgdHJ5IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgZGVzY3JpcHRvckRlc3QgPSBmcy5zdGF0U3luYyhkZXN0KTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgaWYgKGRlc2NyaXB0b3JTb3VyY2UuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgbG9nLnZlcmJvc2UoYERlc3QgcGF0aCBcIiR7ZGVzdH1cIiBkb2VzIG5vdCBleGlzdC4gY3JlYXRpbmdgKTtcbiAgICAgIGZzLm1rZGlyU3luYyhkZXN0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICB0cnkge1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYENvcHlpbmcgJHtkZXNjcmlwdG9yU291cmNlLmlzRmlsZSgpID8gXCJmaWxlXCIgOiBcImRpcmVjdG9yeVwifSBcIiR7c291cmNlfVwiIHRvIFwiJHtkZXN0fS4uLmBcbiAgICApO1xuICAgIGZzLmNwU3luYyhzb3VyY2UsIGRlc3QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYEVycm9yIGNvcHlpbmcgJHtkZXNjcmlwdG9yU291cmNlLmlzRmlsZSgpID8gXCJmaWxlXCIgOiBcImRpcmVjdG9yeVwifSBcIiR7c291cmNlfVwiIHRvIFwiJHtkZXN0fTogJHtlcnJvcn1gXG4gICAgKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRXJyb3IgY29weWluZyAke2Rlc2NyaXB0b3JTb3VyY2UuaXNGaWxlKCkgPyBcImZpbGVcIiA6IFwiZGlyZWN0b3J5XCJ9IFwiJHtzb3VyY2V9XCIgdG8gXCIke2Rlc3R9OiAke2Vycm9yfWBcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWxldGVQYXRoKHA6IHN0cmluZykge1xuICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKGRlbGV0ZVBhdGgpO1xuICB0cnkge1xuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBmcy5zdGF0U3luYyhwKTtcbiAgICBpZiAoZGVzY3JpcHRvci5pc0ZpbGUoKSkge1xuICAgICAgbG9nLnZlcmJvc2UoYERlbGV0aW5nIGZpbGUgXCIke3B9Li4uYCk7XG4gICAgICBmcy5ybVN5bmMocCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIH0gZWxzZSBpZiAoZGVzY3JpcHRvci5pc0RpcmVjdG9yeSgpKVxuICAgICAgZnMucm1TeW5jKHAsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2cudmVyYm9zZShgRXJyb3IgRGVsZXRpbmcgXCIke3B9XCI6ICR7ZXJyb3J9YCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBEZWxldGluZyBcIiR7cH1cIjogJHtlcnJvcn1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgcGFja2FnZSBpbmZvcm1hdGlvbiBmcm9tIHBhY2thZ2UuanNvbi5cbiAqIEBzdW1tYXJ5IExvYWRzIGFuZCBwYXJzZXMgdGhlIHBhY2thZ2UuanNvbiBmaWxlIGZyb20gYSBzcGVjaWZpZWQgZGlyZWN0b3J5IG9yIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiBDYW4gcmV0dXJuIHRoZSBlbnRpcmUgcGFja2FnZSBvYmplY3Qgb3IgYSBzcGVjaWZpYyBwcm9wZXJ0eS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcD1wcm9jZXNzLmN3ZCgpXSAtIFRoZSBkaXJlY3RvcnkgcGF0aCB3aGVyZSB0aGUgcGFja2FnZS5qc29uIGZpbGUgaXMgbG9jYXRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcGVydHldIC0gT3B0aW9uYWwuIFRoZSBzcGVjaWZpYyBwcm9wZXJ0eSB0byByZXRyaWV2ZSBmcm9tIHBhY2thZ2UuanNvbi5cbiAqIEByZXR1cm4ge29iamVjdCB8IHN0cmluZ30gVGhlIHBhcnNlZCBjb250ZW50cyBvZiBwYWNrYWdlLmpzb24gb3IgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuXG4gKiBAZnVuY3Rpb24gZ2V0UGFja2FnZVxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgZ2V0UGFja2FnZVxuICogICBwYXJ0aWNpcGFudCByZWFkRmlsZVxuICogICBwYXJ0aWNpcGFudCBKU09OXG4gKiAgIENhbGxlci0+PmdldFBhY2thZ2U6IENhbGwgd2l0aCBwYXRoIGFuZCBvcHRpb25hbCBwcm9wZXJ0eVxuICogICBnZXRQYWNrYWdlLT4+cmVhZEZpbGU6IFJlYWQgcGFja2FnZS5qc29uXG4gKiAgIHJlYWRGaWxlLS0+PmdldFBhY2thZ2U6IFJldHVybiBmaWxlIGNvbnRlbnRcbiAqICAgZ2V0UGFja2FnZS0+PkpTT046IFBhcnNlIGZpbGUgY29udGVudFxuICogICBKU09OLS0+PmdldFBhY2thZ2U6IFJldHVybiBwYXJzZWQgb2JqZWN0XG4gKiAgIGFsdCBwcm9wZXJ0eSBzcGVjaWZpZWRcbiAqICAgICBnZXRQYWNrYWdlLT4+Z2V0UGFja2FnZTogQ2hlY2sgaWYgcHJvcGVydHkgZXhpc3RzXG4gKiAgICAgYWx0IHByb3BlcnR5IGV4aXN0c1xuICogICAgICAgZ2V0UGFja2FnZS0tPj5DYWxsZXI6IFJldHVybiBwcm9wZXJ0eSB2YWx1ZVxuICogICAgIGVsc2UgcHJvcGVydHkgZG9lc24ndCBleGlzdFxuICogICAgICAgZ2V0UGFja2FnZS0tPj5DYWxsZXI6IFRocm93IEVycm9yXG4gKiAgICAgZW5kXG4gKiAgIGVsc2Ugbm8gcHJvcGVydHkgc3BlY2lmaWVkXG4gKiAgICAgZ2V0UGFja2FnZS0tPj5DYWxsZXI6IFJldHVybiBlbnRpcmUgcGFja2FnZSBvYmplY3RcbiAqICAgZW5kXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWNrYWdlKFxuICBwOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuICBwcm9wZXJ0eT86IHN0cmluZ1xuKTogb2JqZWN0IHwgc3RyaW5nIHtcbiAgbGV0IHBrZzogYW55O1xuICB0cnkge1xuICAgIHBrZyA9IEpTT04ucGFyc2UocmVhZEZpbGUocGF0aC5qb2luKHAsIGBwYWNrYWdlLmpzb25gKSkpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJldHJpZXZlIHBhY2thZ2UgaW5mb3JtYXRpb25cIiAke2Vycm9yfWApO1xuICB9XG5cbiAgaWYgKHByb3BlcnR5KSB7XG4gICAgaWYgKCEocHJvcGVydHkgaW4gcGtnKSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUHJvcGVydHkgXCIke3Byb3BlcnR5fVwiIG5vdCBmb3VuZCBpbiBwYWNrYWdlLmpzb25gKTtcbiAgICByZXR1cm4gcGtnW3Byb3BlcnR5XSBhcyBzdHJpbmc7XG4gIH1cbiAgcmV0dXJuIHBrZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldFBhY2thZ2VBdHRyaWJ1dGUoXG4gIGF0dHI6IHN0cmluZyxcbiAgdmFsdWU6IHN0cmluZyxcbiAgcDogc3RyaW5nID0gcHJvY2Vzcy5jd2QoKVxuKTogdm9pZCB7XG4gIGNvbnN0IHBrZyA9IGdldFBhY2thZ2UocCkgYXMgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgcGtnW2F0dHJdID0gdmFsdWU7XG4gIHdyaXRlRmlsZShwYXRoLmpvaW4ocCwgYHBhY2thZ2UuanNvbmApLCBKU09OLnN0cmluZ2lmeShwa2csIG51bGwsIDIpKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHRoZSB2ZXJzaW9uIGZyb20gcGFja2FnZS5qc29uLlxuICogQHN1bW1hcnkgQSBjb252ZW5pZW5jZSBmdW5jdGlvbiB0aGF0IGNhbGxzIGdldFBhY2thZ2UgdG8gcmV0cmlldmUgdGhlIFwidmVyc2lvblwiIHByb3BlcnR5IGZyb20gcGFja2FnZS5qc29uLlxuICogQHBhcmFtIHtzdHJpbmd9IFtwPXByb2Nlc3MuY3dkKCldIC0gVGhlIGRpcmVjdG9yeSBwYXRoIHdoZXJlIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBpcyBsb2NhdGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgdmVyc2lvbiBzdHJpbmcgZnJvbSBwYWNrYWdlLmpzb24uXG4gKiBAZnVuY3Rpb24gZ2V0UGFja2FnZVZlcnNpb25cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZnMtdXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhY2thZ2VWZXJzaW9uKHAgPSBwcm9jZXNzLmN3ZCgpKTogc3RyaW5nIHtcbiAgcmV0dXJuIGdldFBhY2thZ2UocCwgXCJ2ZXJzaW9uXCIpIGFzIHN0cmluZztcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGFsbCBkZXBlbmRlbmNpZXMgZnJvbSB0aGUgcHJvamVjdC5cbiAqIEBzdW1tYXJ5IEV4ZWN1dGVzICducG0gbHMgLS1qc29uJyBjb21tYW5kIHRvIGdldCBhIGRldGFpbGVkIGxpc3Qgb2YgYWxsIGRlcGVuZGVuY2llcyAocHJvZHVjdGlvbiwgZGV2ZWxvcG1lbnQsIGFuZCBwZWVyKSBhbmQgdGhlaXIgdmVyc2lvbnMuXG4gKiBAcGFyYW0ge3N0cmluZ30gW3BhdGg9cHJvY2Vzcy5jd2QoKV0gLSBUaGUgZGlyZWN0b3J5IHBhdGggb2YgdGhlIHByb2plY3QuXG4gKiBAcmV0dXJuIHtQcm9taXNlPHtwcm9kOiBBcnJheTx7bmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmd9PiwgZGV2OiBBcnJheTx7bmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmd9PiwgcGVlcjogQXJyYXk8e25hbWU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nfT59Pn0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgYXJyYXlzIG9mIHByb2R1Y3Rpb24sIGRldmVsb3BtZW50LCBhbmQgcGVlciBkZXBlbmRlbmNpZXMuXG4gKiBAZnVuY3Rpb24gZ2V0RGVwZW5kZW5jaWVzXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBnZXREZXBlbmRlbmNpZXNcbiAqICAgcGFydGljaXBhbnQgcnVuQ29tbWFuZFxuICogICBwYXJ0aWNpcGFudCBKU09OXG4gKiAgIENhbGxlci0+PmdldERlcGVuZGVuY2llczogQ2FsbCB3aXRoIG9wdGlvbmFsIHBhdGhcbiAqICAgZ2V0RGVwZW5kZW5jaWVzLT4+cnVuQ29tbWFuZDogRXhlY3V0ZSAnbnBtIGxzIC0tanNvbidcbiAqICAgcnVuQ29tbWFuZC0tPj5nZXREZXBlbmRlbmNpZXM6IFJldHVybiBjb21tYW5kIG91dHB1dFxuICogICBnZXREZXBlbmRlbmNpZXMtPj5KU09OOiBQYXJzZSBjb21tYW5kIG91dHB1dFxuICogICBKU09OLS0+PmdldERlcGVuZGVuY2llczogUmV0dXJuIHBhcnNlZCBvYmplY3RcbiAqICAgZ2V0RGVwZW5kZW5jaWVzLT4+Z2V0RGVwZW5kZW5jaWVzOiBQcm9jZXNzIGRlcGVuZGVuY2llc1xuICogICBnZXREZXBlbmRlbmNpZXMtLT4+Q2FsbGVyOiBSZXR1cm4gcHJvY2Vzc2VkIGRlcGVuZGVuY2llc1xuICogQG1lbWJlck9mIG1vZHVsZTpmcy11dGlsc1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RGVwZW5kZW5jaWVzKFxuICBwYXRoOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpXG4pOiBQcm9taXNlPERlcGVuZGVuY3lNYXA+IHtcbiAgbGV0IHBrZzogYW55O1xuXG4gIHRyeSB7XG4gICAgcGtnID0gSlNPTi5wYXJzZShhd2FpdCBydW5Db21tYW5kKGBucG0gbHMgLS1qc29uYCwgeyBjd2Q6IHBhdGggfSkucHJvbWlzZSk7XG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byByZXRyaWV2ZSBkZXBlbmRlbmNpZXM6ICR7ZX1gKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgY29uc3QgbWFwcGVyID0gKGVudHJ5OiBbc3RyaW5nLCB1bmtub3duXSwgaW5kZXg6IG51bWJlcikgPT4gKHtcbiAgICBuYW1lOiBlbnRyeVswXSxcbiAgICB2ZXJzaW9uOiAoZW50cnlbMV0gYXMgYW55KS52ZXJzaW9uLFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIHByb2Q6IE9iamVjdC5lbnRyaWVzKHBrZy5kZXBlbmRlbmNpZXMgfHwge30pLm1hcChtYXBwZXIpLFxuICAgIGRldjogT2JqZWN0LmVudHJpZXMocGtnLmRldkRlcGVuZGVuY2llcyB8fCB7fSkubWFwKG1hcHBlciksXG4gICAgcGVlcjogT2JqZWN0LmVudHJpZXMocGtnLnBlZXJEZXBlbmRlbmNpZXMgfHwge30pLm1hcChtYXBwZXIpLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXBkYXRlRGVwZW5kZW5jaWVzKCkge1xuICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKHVwZGF0ZURlcGVuZGVuY2llcyk7XG4gIGxvZy5pbmZvKFwiY2hlY2tpbmcgZm9yIHVwZGF0ZXMuLi5cIik7XG4gIGF3YWl0IHJ1bkNvbW1hbmQoXCJucHggbnBtLWNoZWNrLXVwZGF0ZXMgLXVcIikucHJvbWlzZTtcbiAgbG9nLmluZm8oXCJ1cGRhdGluZy4uLlwiKTtcbiAgYXdhaXQgcnVuQ29tbWFuZChcIm5weCBucG0gcnVuIGRvLWluc3RhbGxcIikucHJvbWlzZTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxJZk5vdEF2YWlsYWJsZShcbiAgZGVwczogc3RyaW5nW10gfCBzdHJpbmcsXG4gIGRlcGVuZGVuY2llcz86IFNpbXBsZURlcGVuZGVuY3lNYXBcbikge1xuICBpZiAoIWRlcGVuZGVuY2llcykge1xuICAgIGNvbnN0IGQ6IERlcGVuZGVuY3lNYXAgPSBhd2FpdCBnZXREZXBlbmRlbmNpZXMoKTtcbiAgICBkZXBlbmRlbmNpZXMgPSB7XG4gICAgICBwcm9kOiBkLnByb2Q/Lm1hcCgocCkgPT4gcC5uYW1lKSB8fCBbXSxcbiAgICAgIGRldjogZC5kZXY/Lm1hcCgoZCkgPT4gZC5uYW1lKSB8fCBbXSxcbiAgICAgIHBlZXI6IGQucGVlcj8ubWFwKChwKSA9PiBwLm5hbWUpIHx8IFtdLFxuICAgIH07XG4gIH1cbiAgY29uc3QgeyBwcm9kLCBkZXYsIHBlZXIgfSA9IGRlcGVuZGVuY2llcztcbiAgY29uc3QgaW5zdGFsbGVkID0gQXJyYXkuZnJvbShcbiAgICBuZXcgU2V0KFsuLi4ocHJvZCB8fCBbXSksIC4uLihkZXYgfHwgW10pLCAuLi4ocGVlciB8fCBbXSldKVxuICApO1xuICBkZXBzID0gdHlwZW9mIGRlcHMgPT09IFwic3RyaW5nXCIgPyBbZGVwc10gOiBkZXBzO1xuICBjb25zdCB0b0luc3RhbGwgPSBkZXBzLmZpbHRlcigoZCkgPT4gIWluc3RhbGxlZC5pbmNsdWRlcyhkKSk7XG5cbiAgaWYgKHRvSW5zdGFsbC5sZW5ndGgpIGF3YWl0IGluc3RhbGxEZXBlbmRlbmNpZXMoeyBkZXY6IHRvSW5zdGFsbCB9KTtcbiAgZGVwZW5kZW5jaWVzLmRldiA9IGRlcGVuZGVuY2llcy5kZXYgfHwgW107XG4gIGRlcGVuZGVuY2llcy5kZXYucHVzaCguLi50b0luc3RhbGwpO1xuICByZXR1cm4gZGVwZW5kZW5jaWVzO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHVzaFRvR2l0KCkge1xuICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKHB1c2hUb0dpdCk7XG4gIGNvbnN0IGdpdFVzZXIgPSBhd2FpdCBydW5Db21tYW5kKFwiZ2l0IGNvbmZpZyB1c2VyLm5hbWVcIikucHJvbWlzZTtcbiAgY29uc3QgZ2l0RW1haWwgPSBhd2FpdCBydW5Db21tYW5kKFwiZ2l0IGNvbmZpZyB1c2VyLmVtYWlsXCIpLnByb21pc2U7XG4gIGxvZy52ZXJib3NlKGBjYWNoZWQgZ2l0IGlkOiAke2dpdFVzZXJ9LyR7Z2l0RW1haWx9LiBjaGFuZ2luZyB0byBhdXRvbWF0aW9uYCk7XG4gIGF3YWl0IHJ1bkNvbW1hbmQoJ2dpdCBjb25maWcgdXNlci5lbWFpbCBcImF1dG9tYXRpb25AZGVjYWYudHNcIicpLnByb21pc2U7XG4gIGF3YWl0IHJ1bkNvbW1hbmQoJ2dpdCBjb25maWcgdXNlci5uYW1lIFwiZGVjYWZcIicpLnByb21pc2U7XG4gIGxvZy5pbmZvKFwiUHVzaGluZyBjaGFuZ2VzIHRvIGdpdC4uLlwiKTtcbiAgYXdhaXQgcnVuQ29tbWFuZChcImdpdCBhZGQgLlwiKS5wcm9taXNlO1xuICBhd2FpdCBydW5Db21tYW5kKGBnaXQgY29tbWl0IC1tIFwicmVmcyAjMSAtIGFmdGVyIHJlcG8gc2V0dXBcImApLnByb21pc2U7XG4gIGF3YWl0IHJ1bkNvbW1hbmQoXCJnaXQgcHVzaFwiKS5wcm9taXNlO1xuICBhd2FpdCBydW5Db21tYW5kKGBnaXQgY29uZmlnIHVzZXIuZW1haWwgXCIke2dpdEVtYWlsfVwiYCkucHJvbWlzZTtcbiAgYXdhaXQgcnVuQ29tbWFuZChgZ2l0IGNvbmZpZyB1c2VyLm5hbWUgXCIke2dpdFVzZXJ9XCJgKS5wcm9taXNlO1xuICBsb2cudmVyYm9zZShgcmV2ZXJ0ZWQgdG8gZ2l0IGlkOiAke2dpdFVzZXJ9LyR7Z2l0RW1haWx9YCk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbnN0YWxsRGVwZW5kZW5jaWVzKGRlcGVuZGVuY2llczoge1xuICBwcm9kPzogc3RyaW5nW107XG4gIGRldj86IHN0cmluZ1tdO1xuICBwZWVyPzogc3RyaW5nW107XG59KSB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IoaW5zdGFsbERlcGVuZGVuY2llcyk7XG4gIGNvbnN0IHByb2QgPSBkZXBlbmRlbmNpZXMucHJvZCB8fCBbXTtcbiAgY29uc3QgZGV2ID0gZGVwZW5kZW5jaWVzLmRldiB8fCBbXTtcbiAgY29uc3QgcGVlciA9IGRlcGVuZGVuY2llcy5wZWVyIHx8IFtdO1xuICBpZiAocHJvZC5sZW5ndGgpIHtcbiAgICBsb2cuaW5mbyhgSW5zdGFsbGluZyBkZXBlbmRlbmNpZXMgJHtwcm9kLmpvaW4oXCIsIFwiKX0uLi5gKTtcbiAgICBhd2FpdCBydW5Db21tYW5kKGBucG0gaW5zdGFsbCAke3Byb2Quam9pbihcIiBcIil9YCwgeyBjd2Q6IHByb2Nlc3MuY3dkKCkgfSlcbiAgICAgIC5wcm9taXNlO1xuICB9XG4gIGlmIChkZXYubGVuZ3RoKSB7XG4gICAgbG9nLmluZm8oYEluc3RhbGxpbmcgZGV2RGVwZW5kZW5jaWVzICR7ZGV2LmpvaW4oXCIsIFwiKX0uLi5gKTtcbiAgICBhd2FpdCBydW5Db21tYW5kKGBucG0gaW5zdGFsbCAtLXNhdmUtZGV2ICR7ZGV2LmpvaW4oXCIgXCIpfWAsIHtcbiAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICB9KS5wcm9taXNlO1xuICB9XG4gIGlmIChwZWVyLmxlbmd0aCkge1xuICAgIGxvZy5pbmZvKGBJbnN0YWxsaW5nIHBlZXJEZXBlbmRlbmNpZXMgJHtwZWVyLmpvaW4oXCIsIFwiKX0uLi5gKTtcbiAgICBhd2FpdCBydW5Db21tYW5kKGBucG0gaW5zdGFsbCAtLXNhdmUtcGVlciAke3BlZXIuam9pbihcIiBcIil9YCwge1xuICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgIH0pLnByb21pc2U7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG5vcm1hbGl6ZUltcG9ydDxUPihcbiAgaW1wb3J0UHJvbWlzZTogUHJvbWlzZTxUPlxuKTogUHJvbWlzZTxUPiB7XG4gIC8vIENvbW1vbkpTJ3MgYG1vZHVsZS5leHBvcnRzYCBpcyB3cmFwcGVkIGFzIGBkZWZhdWx0YCBpbiBFU01vZHVsZS5cbiAgcmV0dXJuIGltcG9ydFByb21pc2UudGhlbigobTogYW55KSA9PiAobS5kZWZhdWx0IHx8IG0pIGFzIFQpO1xufVxuIiwiaW1wb3J0IHsgVmVyYm9zaXR5TG9nZ2VyIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCBzbG9nYW5zIGZyb20gXCIuLi9hc3NldHMvc2xvZ2Fucy5qc29uXCI7XG5pbXBvcnQgeyBzdHlsZSB9IGZyb20gXCJzdHlsZWQtc3RyaW5nLWJ1aWxkZXJcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQXJyYXkgb2YgQU5TSSBjb2xvciBjb2RlcyBmb3IgYmFubmVyIHN0eWxpbmcuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgc2V0IG9mIEFOU0kgY29sb3IgY29kZXMgdXNlZCB0byBzdHlsZSB0aGUgYmFubmVyIHRleHQuXG4gKi9cbmNvbnN0IGNvbG9ycyA9IFtcbiAgXCJcXHgxYlszODs1OzIxNW1cIiwgLy8gc29mdCBvcmFuZ2VcbiAgXCJcXHgxYlszODs1OzIwOW1cIiwgLy8gY29yYWxcbiAgXCJcXHgxYlszODs1OzIwNW1cIiwgLy8gcGlua1xuICBcIlxceDFiWzM4OzU7MjEwbVwiLCAvLyBwZWFjaHlcbiAgXCJcXHgxYlszODs1OzIxN21cIiwgLy8gc2FsbW9uXG4gIFwiXFx4MWJbMzg7NTsyMTZtXCIsIC8vIGxpZ2h0IGNvcmFsXG4gIFwiXFx4MWJbMzg7NTsyMjRtXCIsIC8vIGxpZ2h0IHBlYWNoXG4gIFwiXFx4MWJbMzg7NTsyMzBtXCIsIC8vIHNvZnQgY3JlYW1cbiAgXCJcXHgxYlszODs1OzIzMG1cIiwgLy8gc29mdCBjcmVhbVxuXTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJpbnRzIGEgc3R5bGVkIGJhbm5lciB0byB0aGUgY29uc29sZS5cbiAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhbmQgcHJpbnRzIGEgY29sb3JmdWwgQVNDSUkgYXJ0IGJhbm5lciB3aXRoIGEgcmFuZG9tIHNsb2dhbi5cbiAqIEBwYXJhbSB7VmVyYm9zaXR5TG9nZ2VyfSBbbG9nZ2VyXSAtIE9wdGlvbmFsIGxvZ2dlciBmb3IgdmVyYm9zZSBvdXRwdXQuXG4gKiBAZnVuY3Rpb24gcHJpbnRCYW5uZXJcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgcHJpbnRCYW5uZXJcbiAqICAgcGFydGljaXBhbnQgZ2V0U2xvZ2FuXG4gKiAgIHBhcnRpY2lwYW50IHBhZEVuZFxuICogICBwYXJ0aWNpcGFudCBjb25zb2xlXG4gKiAgIHByaW50QmFubmVyLT4+Z2V0U2xvZ2FuOiBDYWxsIGdldFNsb2dhbigpXG4gKiAgIGdldFNsb2dhbi0tPj5wcmludEJhbm5lcjogUmV0dXJuIHJhbmRvbSBzbG9nYW5cbiAqICAgcHJpbnRCYW5uZXItPj5wcmludEJhbm5lcjogQ3JlYXRlIGJhbm5lciBBU0NJSSBhcnRcbiAqICAgcHJpbnRCYW5uZXItPj5wcmludEJhbm5lcjogU3BsaXQgYmFubmVyIGludG8gbGluZXNcbiAqICAgcHJpbnRCYW5uZXItPj5wcmludEJhbm5lcjogQ2FsY3VsYXRlIG1heCBsaW5lIGxlbmd0aFxuICogICBwcmludEJhbm5lci0+PnBhZEVuZDogQ2FsbCBwYWRFbmQgd2l0aCBzbG9nYW5cbiAqICAgcGFkRW5kLS0+PnByaW50QmFubmVyOiBSZXR1cm4gcGFkZGVkIHNsb2dhbiBsaW5lXG4gKiAgIGxvb3AgRm9yIGVhY2ggYmFubmVyIGxpbmVcbiAqICAgICBwcmludEJhbm5lci0+PnN0eWxlOiBDYWxsIHN0eWxlKGxpbmUpXG4gKiAgICAgc3R5bGUtLT4+cHJpbnRCYW5uZXI6IFJldHVybiBzdHlsZWQgbGluZVxuICogICAgIHByaW50QmFubmVyLT4+Y29uc29sZTogTG9nIHN0eWxlZCBsaW5lXG4gKiAgIGVuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRCYW5uZXIobG9nZ2VyPzogVmVyYm9zaXR5TG9nZ2VyKSB7XG4gIGNvbnN0IG1lc3NhZ2UgPSBnZXRTbG9nYW4oKTtcbiAgY29uc3QgYmFubmVyOiBzdHJpbmcgfCBzdHJpbmdbXSA9XG4gICAgYCMgICAgICAgICAgICAgICAgIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paI4paI4paT4paS4paRICDilpHilpLilpPilojilojilojilojilojilojilpPilpLilpEgICDilpHilpLilpPilojilojilojilojilojilojilpPilpLilpEgIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSAgICAgICDilpHilpLilpPilojilojilojilojilojilojilojilojilpPilpLilpEgIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSBcbiMgICAgICAoICggICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkeKWkeKWkuKWk+KWiOKWk+KWkuKWkSDilpHilpLilpPilojilpPilpLilpEgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkeKWkeKWkuKWk+KWiOKWk+KWkuKWkSDilpHilpLilpPilojilpPilpLilpHilpHilpLilpPilojilpPilpLilpEg4paR4paS4paT4paI4paT4paS4paRICAgICAgICAgICAgICAgICDilpHilpLilpPilojilpPilpLilpEgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAgXG4jICAgICAgICkgKSAgICAgICDilpHilpLilpPilojilpPilpLilpHilpHilpLilpPilojilpPilpLilpEg4paR4paS4paT4paI4paT4paS4paRICAgICAgICDilpHilpLilpPilojilpPilpLilpEgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkeKWkeKWkuKWk+KWiOKWk+KWkuKWkSDilpHilpLilpPilojilpPilpLilpEgICAgICAgICAgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAg4paR4paS4paT4paI4paT4paS4paRICAgICAgICBcbiMgICAgWz09PT09PT1dICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkeKWkeKWkuKWk+KWiOKWk+KWkuKWkSDilpHilpLilpPilojilojilojilojilojilojilpPilpLilpEgICDilpHilpLilpPilojilpPilpLilpEgICAgICAgIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSDilpHilpLilpPilojilojilojilojilojilojilpPilpLilpEgICAgICAgICAgICDilpHilpLilpPilojilpPilpLilpEgICAgICDilpHilpLilpPilojilojilojilojilojilojilpPilpLilpEgIFxuIyAgICAgXFxgLS0tLS3CtCAgICAg4paR4paS4paT4paI4paT4paS4paR4paR4paS4paT4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAg4paR4paS4paT4paI4paT4paS4paRICAgICAgICDilpHilpLilpPilojilpPilpLilpHilpHilpLilpPilojilpPilpLilpEg4paR4paS4paT4paI4paT4paS4paRICAgICAgICAgICAgICAgICDilpHilpLilpPilojilpPilpLilpEgICAgICAgICAgICDilpHilpLilpPilojilpPilpLilpEgXG4jICAgICAgICAgICAgICAgICDilpHilpLilpPilojilpPilpLilpHilpHilpLilpPilojilpPilpLilpEg4paR4paS4paT4paI4paT4paS4paRICAgICAgICDilpHilpLilpPilojilpPilpLilpHilpHilpLilpPilojilpPilpLilpEg4paR4paS4paT4paI4paT4paS4paR4paR4paS4paT4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAgICAgICAgICAg4paR4paS4paT4paI4paT4paS4paRICAgICAgICAgICAg4paR4paS4paT4paI4paT4paS4paRIFxuIyAgICAgICAgICAgICAgICAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paI4paT4paS4paRICDilpHilpLilpPilojilojilojilojilojilojilojilojilpPilpLilpEgIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSAg4paR4paS4paT4paI4paT4paS4paR4paR4paS4paT4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAgICAgICAgICAg4paR4paS4paT4paI4paT4paS4paRICAgICDilpHilpLilpPilojilojilojilojilojilojilojilpPilpLilpEgIFxuI2Auc3BsaXQoXCJcXG5cIik7XG4gIGNvbnN0IG1heExlbmd0aCA9IGJhbm5lci5yZWR1Y2UoKG1heCwgbGluZSkgPT4gTWF0aC5tYXgobWF4LCBsaW5lLmxlbmd0aCksIDApO1xuICBiYW5uZXIucHVzaChgIyAgJHttZXNzYWdlLnBhZFN0YXJ0KG1heExlbmd0aCAtIDMpfWApO1xuICBiYW5uZXIuZm9yRWFjaCgobGluZSwgaW5kZXgpID0+IHtcbiAgICAobG9nZ2VyID8gbG9nZ2VyLmluZm8uYmluZChsb2dnZXIpIDogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSkoXG4gICAgICBzdHlsZShsaW5lIHx8IFwiXCIpLnJhdyhjb2xvcnNbaW5kZXhdKS50ZXh0XG4gICAgKTtcbiAgfSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHNsb2dhbiBmcm9tIHRoZSBwcmVkZWZpbmVkIGxpc3QuXG4gKiBAc3VtbWFyeSBGZXRjaGVzIGEgcmFuZG9tIHNsb2dhbiBvciBhIHNwZWNpZmljIG9uZSBieSBpbmRleCBmcm9tIHRoZSBzbG9nYW5zIGxpc3QuXG4gKiBAcGFyYW0ge251bWJlcn0gW2ldIC0gT3B0aW9uYWwgaW5kZXggdG8gcmV0cmlldmUgYSBzcGVjaWZpYyBzbG9nYW4uXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBzZWxlY3RlZCBzbG9nYW4uXG4gKiBAZnVuY3Rpb24gZ2V0U2xvZ2FuXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IGdldFNsb2dhblxuICogICBwYXJ0aWNpcGFudCBNYXRoLnJhbmRvbVxuICogICBwYXJ0aWNpcGFudCBzbG9nYW5zXG4gKiAgIGFsdCBpIGlzIHVuZGVmaW5lZFxuICogICAgIGdldFNsb2dhbi0+Pk1hdGgucmFuZG9tOiBHZW5lcmF0ZSByYW5kb20gaW5kZXhcbiAqICAgICBNYXRoLnJhbmRvbS0tPj5nZXRTbG9nYW46IFJldHVybiByYW5kb20gaW5kZXhcbiAqICAgZWxzZSBpIGlzIGRlZmluZWRcbiAqICAgICBOb3RlIG92ZXIgZ2V0U2xvZ2FuOiBVc2UgcHJvdmlkZWQgaW5kZXhcbiAqICAgZW5kXG4gKiAgIGdldFNsb2dhbi0+PnNsb2dhbnM6IEFjY2VzcyBzbG9nYW4gYXQgaW5kZXhcbiAqICAgc2xvZ2Fucy0tPj5nZXRTbG9nYW46IFJldHVybiBzbG9nYW5cbiAqICAgYWx0IEVycm9yIG9jY3Vyc1xuICogICAgIGdldFNsb2dhbi0+PmdldFNsb2dhbjogVGhyb3cgZXJyb3JcbiAqICAgZW5kXG4gKiAgIGdldFNsb2dhbi0tPj5DYWxsZXI6IFJldHVybiBzbG9nYW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNsb2dhbihpPzogbnVtYmVyKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBpID1cbiAgICAgIHR5cGVvZiBpID09PSBcInVuZGVmaW5lZFwiID8gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogc2xvZ2Fucy5sZW5ndGgpIDogaTtcbiAgICByZXR1cm4gc2xvZ2Fuc1tpXS5TbG9nYW47XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmV0cmlldmUgc2xvZ2FuczogJHtlcnJvcn1gKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBAY2xhc3MgT2JqZWN0QWNjdW11bGF0b3JcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIGFjY3VtdWxhdGVkIG9iamVjdCwgZXh0ZW5kcyBvYmplY3RcbiAqIEBkZXNjcmlwdGlvbiBBIGNsYXNzIHRoYXQgYWNjdW11bGF0ZXMgb2JqZWN0cyBhbmQgcHJvdmlkZXMgdHlwZS1zYWZlIGFjY2VzcyB0byB0aGVpciBwcm9wZXJ0aWVzLlxuICogSXQgYWxsb3dzIGZvciBkeW5hbWljIGFkZGl0aW9uIG9mIHByb3BlcnRpZXMgd2hpbGUgbWFpbnRhaW5pbmcgdHlwZSBpbmZvcm1hdGlvbi5cbiAqIEBzdW1tYXJ5IEFjY3VtdWxhdGVzIG9iamVjdHMgYW5kIG1haW50YWlucyB0eXBlIGluZm9ybWF0aW9uIGZvciBhY2N1bXVsYXRlZCBwcm9wZXJ0aWVzXG4gKiBAbWVtYmVyT2YgdXRpbHNcbiAqL1xuZXhwb3J0IGNsYXNzIE9iamVjdEFjY3VtdWxhdG9yPFQgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgLyoqXG4gICAqIEBwcml2YXRlXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgc2l6ZSBvZiB0aGUgYWNjdW11bGF0ZWQgb2JqZWN0XG4gICAqIEB0eXBlIHtudW1iZXJ9XG4gICAqL1xuICBwcml2YXRlIF9fc2l6ZSE6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgXCJfX3NpemVcIiwge1xuICAgICAgdmFsdWU6IDAsXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBkZXNjcmlwdGlvbiBFeHBhbmRzIHRoZSBhY2N1bXVsYXRvciB3aXRoIHByb3BlcnRpZXMgZnJvbSBhIG5ldyBvYmplY3RcbiAgICogQHN1bW1hcnkgQWRkcyBuZXcgcHJvcGVydGllcyB0byB0aGUgYWNjdW11bGF0b3JcbiAgICogQHRlbXBsYXRlIFYgLSBUaGUgdHlwZSBvZiB0aGUgb2JqZWN0IGJlaW5nIGV4cGFuZGVkXG4gICAqIEBwYXJhbSB7Vn0gdmFsdWUgLSBUaGUgb2JqZWN0IHRvIGV4cGFuZCB3aXRoXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgcHJvdGVjdGVkIGV4cGFuZDxWIGV4dGVuZHMgb2JqZWN0Pih2YWx1ZTogVik6IHZvaWQge1xuICAgIE9iamVjdC5lbnRyaWVzKHZhbHVlKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBrLCB7XG4gICAgICAgIGdldDogKCkgPT4gdixcbiAgICAgICAgc2V0OiAodmFsOiBWW2tleW9mIFZdKSA9PiB7XG4gICAgICAgICAgdiA9IHZhbDtcbiAgICAgICAgfSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFjY3VtdWxhdGVzIGEgbmV3IG9iamVjdCBpbnRvIHRoZSBhY2N1bXVsYXRvclxuICAgKiBAc3VtbWFyeSBBZGRzIHByb3BlcnRpZXMgZnJvbSBhIG5ldyBvYmplY3QgdG8gdGhlIGFjY3VtdWxhdG9yLCBtYWludGFpbmluZyB0eXBlIGluZm9ybWF0aW9uXG4gICAqIEB0ZW1wbGF0ZSBWIC0gVGhlIHR5cGUgb2YgdGhlIG9iamVjdCBiZWluZyBhY2N1bXVsYXRlZFxuICAgKiBAcGFyYW0ge1Z9IHZhbHVlIC0gVGhlIG9iamVjdCB0byBhY2N1bXVsYXRlXG4gICAqIEByZXR1cm5zIEEgbmV3IE9iamVjdEFjY3VtdWxhdG9yIGluc3RhbmNlIHdpdGggdXBkYXRlZCB0eXBlIGluZm9ybWF0aW9uXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgQWNjdW11bGF0b3JcbiAgICogICBwYXJ0aWNpcGFudCBPIGFzIE9iamVjdFxuICAgKiAgIEEtPj5POiBHZXQgZW50cmllc1xuICAgKiAgIGxvb3AgRm9yIGVhY2ggZW50cnlcbiAgICogICAgIEEtPj5BOiBEZWZpbmUgcHJvcGVydHlcbiAgICogICBlbmRcbiAgICogICBBLT4+QTogVXBkYXRlIHNpemVcbiAgICogICBBLT4+QTogUmV0dXJuIHVwZGF0ZWQgYWNjdW11bGF0b3JcbiAgICovXG4gIGFjY3VtdWxhdGU8ViBleHRlbmRzIG9iamVjdD4odmFsdWU6IFYpOiBUICYgViAmIE9iamVjdEFjY3VtdWxhdG9yPFQgJiBWPiB7XG4gICAgdGhpcy5leHBhbmQodmFsdWUpO1xuICAgIHRoaXMuX19zaXplID0gdGhpcy5fX3NpemUgKyBPYmplY3Qua2V5cyh2YWx1ZSkubGVuZ3RoO1xuICAgIHJldHVybiB0aGlzIGFzIHVua25vd24gYXMgVCAmIFYgJiBPYmplY3RBY2N1bXVsYXRvcjxUICYgVj47XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHZhbHVlIGZyb20gdGhlIGFjY3VtdWxhdG9yIGJ5IGl0cyBrZXlcbiAgICogQHN1bW1hcnkgR2V0cyBhIHZhbHVlIGZyb20gdGhlIGFjY3VtdWxhdGVkIG9iamVjdCB1c2luZyBhIHR5cGUtc2FmZSBrZXlcbiAgICogQHRlbXBsYXRlIEsgLSBUaGUga2V5IHR5cGUsIG11c3QgYmUgYSBrZXkgb2YgdGhpc1xuICAgKiBAcGFyYW0ge0t9IGtleSAtIFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJldHJpZXZlXG4gICAqIEByZXR1cm5zIHthbnkgfCB1bmRlZmluZWR9IFRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSwgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgZ2V0PEsgZXh0ZW5kcyBrZXlvZiB0aGlzPihrZXk6IEspOiB0aGlzW0tdIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpc1trZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSBrZXkgZXhpc3RzIGluIHRoZSBhY2N1bXVsYXRvclxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGFjY3VtdWxhdG9yIGNvbnRhaW5zIGEgc3BlY2lmaWMga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IHRvIGNoZWNrIGZvciBleGlzdGVuY2VcbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIGtleSBleGlzdHMsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgaGFzKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpc1trZXkgYXMga2V5b2YgdGhpc107XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlbW92ZXMgYSBrZXktdmFsdWUgcGFpciBmcm9tIHRoZSBhY2N1bXVsYXRvclxuICAgKiBAc3VtbWFyeSBEZWxldGVzIGEgcHJvcGVydHkgZnJvbSB0aGUgYWNjdW11bGF0ZWQgb2JqZWN0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byByZW1vdmVcbiAgICogQHJldHVybnMge30gVGhlIGFjY3VtdWxhdG9yIGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSByZW1vdmVkXG4gICAqL1xuICByZW1vdmUoXG4gICAga2V5OiBrZXlvZiB0aGlzIHwgc3RyaW5nXG4gICk6XG4gICAgfCAoT21pdDx0aGlzLCB0eXBlb2Yga2V5PiAmIE9iamVjdEFjY3VtdWxhdG9yPE9taXQ8dGhpcywgdHlwZW9mIGtleT4+KVxuICAgIHwgdGhpcyB7XG4gICAgaWYgKCEoa2V5IGluIHRoaXMpKSByZXR1cm4gdGhpcztcblxuICAgIGRlbGV0ZSB0aGlzW2tleSBhcyBrZXlvZiB0aGlzXTtcbiAgICB0aGlzLl9fc2l6ZS0tO1xuICAgIHJldHVybiB0aGlzIGFzIHVua25vd24gYXMgT21pdDx0aGlzLCB0eXBlb2Yga2V5PiAmXG4gICAgICBPYmplY3RBY2N1bXVsYXRvcjxPbWl0PHRoaXMsIHR5cGVvZiBrZXk+PjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGFsbCBrZXlzIGZyb20gdGhlIGFjY3VtdWxhdG9yXG4gICAqIEBzdW1tYXJ5IEdldHMgYW4gYXJyYXkgb2YgYWxsIGFjY3VtdWxhdGVkIHByb3BlcnR5IGtleXNcbiAgICogQHJldHVybnMge3N0cmluZ1tdfSBBbiBhcnJheSBvZiBrZXlzIGFzIHN0cmluZ3NcbiAgICovXG4gIGtleXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGFsbCB2YWx1ZXMgZnJvbSB0aGUgYWNjdW11bGF0b3JcbiAgICogQHN1bW1hcnkgR2V0cyBhbiBhcnJheSBvZiBhbGwgYWNjdW11bGF0ZWQgcHJvcGVydHkgdmFsdWVzXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHZhbHVlc1xuICAgKi9cbiAgdmFsdWVzKCk6IFRba2V5b2YgVF1bXSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEdldHMgdGhlIG51bWJlciBvZiBrZXktdmFsdWUgcGFpcnMgaW4gdGhlIGFjY3VtdWxhdG9yXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIGNvdW50IG9mIGFjY3VtdWxhdGVkIHByb3BlcnRpZXNcbiAgICogQHJldHVybnMge251bWJlcn0gVGhlIG51bWJlciBvZiBrZXktdmFsdWUgcGFpcnNcbiAgICovXG4gIHNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fX3NpemU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENsZWFycyBhbGwgYWNjdW11bGF0ZWQga2V5LXZhbHVlIHBhaXJzXG4gICAqIEBzdW1tYXJ5IFJlbW92ZXMgYWxsIHByb3BlcnRpZXMgZnJvbSB0aGUgYWNjdW11bGF0b3IgYW5kIHJldHVybnMgYSBuZXcgZW1wdHkgaW5zdGFuY2VcbiAgICogQHJldHVybnMge09iamVjdEFjY3VtdWxhdG9yPG5ldmVyPn0gQSBuZXcgZW1wdHkgT2JqZWN0QWNjdW11bGF0b3IgaW5zdGFuY2VcbiAgICovXG4gIGNsZWFyKCk6IE9iamVjdEFjY3VtdWxhdG9yPG5ldmVyPiB7XG4gICAgcmV0dXJuIG5ldyBPYmplY3RBY2N1bXVsYXRvcigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIGNhbGxiYWNrIGZvciBlYWNoIGtleS12YWx1ZSBwYWlyIGluIHRoZSBhY2N1bXVsYXRvclxuICAgKiBAc3VtbWFyeSBJdGVyYXRlcyBvdmVyIGFsbCBhY2N1bXVsYXRlZCBwcm9wZXJ0aWVzLCBjYWxsaW5nIGEgZnVuY3Rpb24gZm9yIGVhY2hcbiAgICogQHBhcmFtIHtmdW5jdGlvbihhbnksIHN0cmluZywgbnVtYmVyKTogdm9pZH0gY2FsbGJhY2sgLSBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSBmb3IgZWFjaCBlbnRyeVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGZvckVhY2goXG4gICAgY2FsbGJhY2s6ICh2YWx1ZTogdGhpc1trZXlvZiB0aGlzXSwga2V5OiBrZXlvZiB0aGlzLCBpOiBudW1iZXIpID0+IHZvaWRcbiAgKTogdm9pZCB7XG4gICAgT2JqZWN0LmVudHJpZXModGhpcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdLCBpKSA9PlxuICAgICAgY2FsbGJhY2sodmFsdWUsIGtleSBhcyBrZXlvZiB0aGlzLCBpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgYXJyYXkgd2l0aCB0aGUgcmVzdWx0cyBvZiBjYWxsaW5nIGEgcHJvdmlkZWQgZnVuY3Rpb24gb24gZXZlcnkgZWxlbWVudCBpbiB0aGUgYWNjdW11bGF0b3JcbiAgICogQHN1bW1hcnkgTWFwcyBlYWNoIGFjY3VtdWxhdGVkIHByb3BlcnR5IHRvIGEgbmV3IHZhbHVlIHVzaW5nIGEgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgdHlwZSBvZiB0aGUgbWFwcGVkIHZhbHVlc1xuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKGFueSwgc3RyaW5nLG51bWJlcik6IFJ9IGNhbGxiYWNrIC0gRnVuY3Rpb24gdGhhdCBwcm9kdWNlcyBhbiBlbGVtZW50IG9mIHRoZSBuZXcgYXJyYXlcbiAgICogQHJldHVybnMge1JbXX0gQSBuZXcgYXJyYXkgd2l0aCBlYWNoIGVsZW1lbnQgYmVpbmcgdGhlIHJlc3VsdCBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb25cbiAgICovXG4gIG1hcDxSPihcbiAgICBjYWxsYmFjazogKHZhbHVlOiB0aGlzW2tleW9mIHRoaXNdLCBrZXk6IGtleW9mIHRoaXMsIGk6IG51bWJlcikgPT4gUlxuICApOiBSW10ge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzKS5tYXAoKFtrZXksIHZhbHVlXSwgaSkgPT5cbiAgICAgIGNhbGxiYWNrKHZhbHVlLCBrZXkgYXMga2V5b2YgdGhpcywgaSlcbiAgICApO1xuICB9XG59XG4iLCIvKipcbiAqIEBmdW5jdGlvbiBpc0Jyb3dzZXJcbiAqIEBkZXNjcmlwdGlvbiBEZXRlcm1pbmVzIGlmIHRoZSBjdXJyZW50IGVudmlyb25tZW50IGlzIGEgYnJvd3NlciBieSBjaGVja2luZyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIHRoZSBnbG9iYWwgb2JqZWN0LlxuICogQHN1bW1hcnkgQ2hlY2tzIGlmIHRoZSBjb2RlIGlzIHJ1bm5pbmcgaW4gYSBicm93c2VyIGVudmlyb25tZW50LlxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIGVudmlyb25tZW50IGlzIGEgYnJvd3NlciwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCcm93c2VyKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZihPYmplY3QuZ2V0UHJvdG90eXBlT2YoZ2xvYmFsVGhpcykpICE9PVxuICAgIE9iamVjdC5wcm90b3R5cGVcbiAgKTtcbn1cbiIsImltcG9ydCB7IHRvRU5WRm9ybWF0IH0gZnJvbSBcIi4vdGV4dFwiO1xuaW1wb3J0IHsgT2JqZWN0QWNjdW11bGF0b3IgfSBmcm9tIFwiLi9hY2N1bXVsYXRvclwiO1xuaW1wb3J0IHsgRW52aXJvbm1lbnRGYWN0b3J5IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGlzQnJvd3NlciB9IGZyb20gXCIuL3dlYlwiO1xuXG4vKipcbiAqIEBjbGFzcyBFbnZpcm9ubWVudFxuICogQGV4dGVuZHMge09iamVjdEFjY3VtdWxhdG9yPFQ+fVxuICogQHRlbXBsYXRlIFRcbiAqIEBkZXNjcmlwdGlvbiBBIGNsYXNzIHJlcHJlc2VudGluZyBhbiBlbnZpcm9ubWVudCB3aXRoIGFjY3VtdWxhdGlvbiBjYXBhYmlsaXRpZXMuXG4gKiBAc3VtbWFyeSBNYW5hZ2VzIGVudmlyb25tZW50LXJlbGF0ZWQgZGF0YSBhbmQgcHJvdmlkZXMgbWV0aG9kcyBmb3IgYWNjdW11bGF0aW9uIGFuZCBrZXkgcmV0cmlldmFsLlxuICogQHBhcmFtIHtUfSBbaW5pdGlhbERhdGFdIC0gVGhlIGluaXRpYWwgZGF0YSB0byBwb3B1bGF0ZSB0aGUgZW52aXJvbm1lbnQgd2l0aC5cbiAqL1xuZXhwb3J0IGNsYXNzIEVudmlyb25tZW50PFQgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgT2JqZWN0QWNjdW11bGF0b3I8VD4ge1xuICAvKipcbiAgICogQHN0YXRpY1xuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBkZXNjcmlwdGlvbiBBIGZhY3RvcnkgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIEVudmlyb25tZW50IGluc3RhbmNlcy5cbiAgICogQHN1bW1hcnkgRGVmaW5lcyBob3cgbmV3IGluc3RhbmNlcyBvZiB0aGUgRW52aXJvbm1lbnQgY2xhc3Mgc2hvdWxkIGJlIGNyZWF0ZWQuXG4gICAqIEByZXR1cm4ge0Vudmlyb25tZW50PGFueT59IEEgbmV3IGluc3RhbmNlIG9mIHRoZSBFbnZpcm9ubWVudCBjbGFzcy5cbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgZmFjdG9yeTogRW52aXJvbm1lbnRGYWN0b3J5PGFueSwgYW55PiA9XG4gICAgKCk6IEVudmlyb25tZW50PGFueT4gPT4gbmV3IEVudmlyb25tZW50KCk7XG5cbiAgLyoqXG4gICAqIEBzdGF0aWNcbiAgICogQHByaXZhdGVcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVudmlyb25tZW50IGNsYXNzLlxuICAgKiBAdHlwZSB7RW52aXJvbm1lbnQ8YW55Pn1cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogRW52aXJvbm1lbnQ8YW55PjtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBmcm9tRW52KGs6IHN0cmluZykge1xuICAgIGxldCBlbnY6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGlmIChpc0Jyb3dzZXIoKSkge1xuICAgICAgZW52ID0gKGdsb2JhbFRoaXMgYXMgdHlwZW9mIGdsb2JhbFRoaXMgJiB7IEVOVjogUmVjb3JkPHN0cmluZywgYW55PiB9KVtcbiAgICAgICAgXCJFTlZcIlxuICAgICAgXTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW52ID0gZ2xvYmFsVGhpcy5wcm9jZXNzLmVudjtcbiAgICAgIGsgPSB0b0VOVkZvcm1hdChrKTtcbiAgICB9XG4gICAgcmV0dXJuIGVudltrXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBleHBhbmQ8ViBleHRlbmRzIG9iamVjdD4odmFsdWU6IFYpOiB2b2lkIHtcbiAgICBPYmplY3QuZW50cmllcyh2YWx1ZSkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgaywge1xuICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBmcm9tRW52ID0gdGhpcy5mcm9tRW52KGspO1xuICAgICAgICAgIHJldHVybiB0eXBlb2YgZnJvbUVudiA9PT0gXCJ1bmRlZmluZWRcIiA/IHYgOiBmcm9tRW52O1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6ICh2YWw6IFZba2V5b2YgVl0pID0+IHtcbiAgICAgICAgICB2ID0gdmFsO1xuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBzdGF0aWNcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBvciBjcmVhdGVzIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVudmlyb25tZW50IGNsYXNzLlxuICAgKiBAc3VtbWFyeSBFbnN1cmVzIG9ubHkgb25lIGluc3RhbmNlIG9mIHRoZSBFbnZpcm9ubWVudCBjbGFzcyBleGlzdHMuXG4gICAqIEB0ZW1wbGF0ZSBFXG4gICAqIEBwYXJhbSB7Li4udW5rbm93bltdfSBhcmdzIC0gQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGZhY3RvcnkgZnVuY3Rpb24gaWYgYSBuZXcgaW5zdGFuY2UgaXMgY3JlYXRlZC5cbiAgICogQHJldHVybiB7RX0gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRW52aXJvbm1lbnQgY2xhc3MuXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdGljIGluc3RhbmNlPEUgZXh0ZW5kcyBFbnZpcm9ubWVudDxhbnk+PiguLi5hcmdzOiB1bmtub3duW10pOiBFIHtcbiAgICBFbnZpcm9ubWVudC5faW5zdGFuY2UgPSAhRW52aXJvbm1lbnQuX2luc3RhbmNlXG4gICAgICA/IEVudmlyb25tZW50LmZhY3RvcnkoLi4uYXJncylcbiAgICAgIDogRW52aXJvbm1lbnQuX2luc3RhbmNlO1xuICAgIHJldHVybiBFbnZpcm9ubWVudC5faW5zdGFuY2UgYXMgRTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3RhdGljXG4gICAqIEBkZXNjcmlwdGlvbiBBY2N1bXVsYXRlcyB0aGUgZ2l2ZW4gdmFsdWUgaW50byB0aGUgZW52aXJvbm1lbnQuXG4gICAqIEBzdW1tYXJ5IEFkZHMgbmV3IHByb3BlcnRpZXMgdG8gdGhlIGVudmlyb25tZW50IGZyb20gdGhlIHByb3ZpZGVkIG9iamVjdC5cbiAgICogQHRlbXBsYXRlIFZcbiAgICogQHBhcmFtIHtWfSB2YWx1ZSAtIFRoZSBvYmplY3QgdG8gYWNjdW11bGF0ZSBpbnRvIHRoZSBlbnZpcm9ubWVudC5cbiAgICogQHJldHVybiB7Vn0gVGhlIHVwZGF0ZWQgZW52aXJvbm1lbnQgaW5zdGFuY2UuXG4gICAqL1xuICBzdGF0aWMgYWNjdW11bGF0ZTxWIGV4dGVuZHMgb2JqZWN0PihcbiAgICB2YWx1ZTogVlxuICApOiB0eXBlb2YgRW52aXJvbm1lbnQuX2luc3RhbmNlICZcbiAgICBWICZcbiAgICBPYmplY3RBY2N1bXVsYXRvcjx0eXBlb2YgRW52aXJvbm1lbnQuX2luc3RhbmNlICYgVj4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gRW52aXJvbm1lbnQuaW5zdGFuY2UoKTtcbiAgICByZXR1cm4gaW5zdGFuY2UuYWNjdW11bGF0ZSh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN0YXRpY1xuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHRoZSBrZXlzIG9mIHRoZSBlbnZpcm9ubWVudCwgb3B0aW9uYWxseSBjb252ZXJ0aW5nIHRoZW0gdG8gRU5WIGZvcm1hdC5cbiAgICogQHN1bW1hcnkgR2V0cyBhbGwga2V5cyBpbiB0aGUgZW52aXJvbm1lbnQsIHdpdGggYW4gb3B0aW9uIHRvIGZvcm1hdCB0aGVtIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RvRW52PXRydWVdIC0gV2hldGhlciB0byBjb252ZXJ0IHRoZSBrZXlzIHRvIEVOViBmb3JtYXQuXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfSBBbiBhcnJheSBvZiBrZXlzIGZyb20gdGhlIGVudmlyb25tZW50LlxuICAgKi9cbiAgc3RhdGljIGtleXModG9FbnY6IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBFbnZpcm9ubWVudC5pbnN0YW5jZSgpXG4gICAgICAua2V5cygpXG4gICAgICAubWFwKChrKSA9PiAodG9FbnYgPyB0b0VOVkZvcm1hdChrKSA6IGspKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUGFyc2VBcmdzUmVzdWx0IH0gZnJvbSBcIi4uL2lucHV0L3R5cGVzXCI7XG5pbXBvcnQgeyBMb2dnaW5nQ29uZmlnLCBWZXJib3NpdHlMb2dnZXIgfSBmcm9tIFwiLi4vb3V0cHV0L3R5cGVzXCI7XG5pbXBvcnQgeyBDb21tYW5kT3B0aW9ucyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIi4uL291dHB1dC9sb2dnaW5nXCI7XG5pbXBvcnQgeyBEZWZhdWx0TG9nZ2luZ0NvbmZpZywgTG9nTGV2ZWwgfSBmcm9tIFwiLi4vdXRpbHMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBVc2VySW5wdXQgfSBmcm9tIFwiLi4vaW5wdXQvaW5wdXRcIjtcbmltcG9ydCB7IERlZmF1bHRDb21tYW5kT3B0aW9ucywgRGVmYXVsdENvbW1hbmRWYWx1ZXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldERlcGVuZGVuY2llcywgZ2V0UGFja2FnZVZlcnNpb24gfSBmcm9tIFwiLi4vdXRpbHMvZnNcIjtcbmltcG9ydCB7IHByaW50QmFubmVyIH0gZnJvbSBcIi4uL291dHB1dC9jb21tb25cIjtcbmltcG9ydCB7IEVudmlyb25tZW50IH0gZnJvbSBcIi4uL3V0aWxzL2Vudmlyb25tZW50XCI7XG5cbi8qKlxuICogQGNsYXNzIENvbW1hbmRcbiAqIEBhYnN0cmFjdFxuICogQHRlbXBsYXRlIEkgLSBUaGUgdHlwZSBvZiBpbnB1dCBvcHRpb25zIGZvciB0aGUgY29tbWFuZC5cbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJldHVybiB0eXBlIG9mIHRoZSBjb21tYW5kIGV4ZWN1dGlvbi5cbiAqIEBtZW1iZXJPZiB1dGlscy9jbGlcbiAqIEBkZXNjcmlwdGlvbiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBjb21tYW5kIGltcGxlbWVudGF0aW9uLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgYSBzdHJ1Y3R1cmUgZm9yIGNyZWF0aW5nIGNvbW1hbmQtbGluZSBpbnRlcmZhY2UgY29tbWFuZHMgd2l0aCBpbnB1dCBoYW5kbGluZywgbG9nZ2luZywgYW5kIGV4ZWN1dGlvbiBmbG93LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQuXG4gKiBAcGFyYW0ge0NvbW1hbmRPcHRpb25zPEk+fSBbaW5wdXRzXSAtIFRoZSBpbnB1dCBvcHRpb25zIGZvciB0aGUgY29tbWFuZC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IFtyZXF1aXJlbWVudHNdIC0gVGhlIGxpc3Qgb2YgcmVxdWlyZWQgZGVwZW5kZW5jaWVzIGZvciB0aGUgY29tbWFuZC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbW1hbmQ8SSwgUj4ge1xuICAvKipcbiAgICogQHN0YXRpY1xuICAgKiBAZGVzY3JpcHRpb24gU3RhdGljIGxvZ2dlciBmb3IgdGhlIENvbW1hbmQgY2xhc3MuXG4gICAqIEB0eXBlIHtWZXJib3NpdHlMb2dnZXJ9XG4gICAqL1xuICBzdGF0aWMgbG9nOiBWZXJib3NpdHlMb2dnZXI7XG5cbiAgLyoqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQGRlc2NyaXB0aW9uIEluc3RhbmNlIGxvZ2dlciBmb3IgdGhlIGNvbW1hbmQuXG4gICAqIEB0eXBlIHtWZXJib3NpdHlMb2dnZXJ9XG4gICAqL1xuICBwcm90ZWN0ZWQgbG9nOiBWZXJib3NpdHlMb2dnZXI7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBuYW1lOiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIGlucHV0czogQ29tbWFuZE9wdGlvbnM8ST4gPSB7fSBhcyB1bmtub3duIGFzIENvbW1hbmRPcHRpb25zPEk+LFxuICAgIHByb3RlY3RlZCByZXF1aXJlbWVudHM6IHN0cmluZ1tdID0gW11cbiAgKSB7XG4gICAgaWYgKCFDb21tYW5kLmxvZykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbW1hbmQsIFwibG9nXCIsIHtcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogTG9nZ2luZy5mb3IoQ29tbWFuZC5uYW1lKSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5sb2cgPSBDb21tYW5kLmxvZztcbiAgICB9XG4gICAgdGhpcy5sb2cgPSBDb21tYW5kLmxvZy5mb3IodGhpcy5uYW1lKTtcbiAgICB0aGlzLmlucHV0cyA9IE9iamVjdC5hc3NpZ24oe30sIERlZmF1bHRDb21tYW5kT3B0aW9ucywgaW5wdXRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBhc3luY1xuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGFsbCByZXF1aXJlZCBkZXBlbmRlbmNpZXMgYXJlIHByZXNlbnQuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgbGlzdCBvZiBkZXBlbmRlbmNpZXMgYW5kIGNvbXBhcmVzIGl0IGFnYWluc3QgdGhlIHJlcXVpcmVkIGRlcGVuZGVuY2llcyBmb3IgdGhlIGNvbW1hbmQuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjaGVjayBpcyBjb21wbGV0ZS5cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ29tbWFuZFxuICAgKiAgIHBhcnRpY2lwYW50IGdldERlcGVuZGVuY2llc1xuICAgKiAgIHBhcnRpY2lwYW50IFNldFxuICAgKiAgIENvbW1hbmQtPj5nZXREZXBlbmRlbmNpZXM6IENhbGxcbiAgICogICBnZXREZXBlbmRlbmNpZXMtLT4+Q29tbWFuZDogUmV0dXJuIHtwcm9kLCBkZXYsIHBlZXJ9XG4gICAqICAgQ29tbWFuZC0+PlNldDogQ3JlYXRlIFNldCBmcm9tIHByb2QsIGRldiwgcGVlclxuICAgKiAgIFNldC0tPj5Db21tYW5kOiBSZXR1cm4gdW5pcXVlIGRlcGVuZGVuY2llc1xuICAgKiAgIENvbW1hbmQtPj5Db21tYW5kOiBDb21wYXJlIGFnYWluc3QgcmVxdWlyZW1lbnRzXG4gICAqICAgYWx0IE1pc3NpbmcgZGVwZW5kZW5jaWVzXG4gICAqICAgICBDb21tYW5kLT4+Q29tbWFuZDogQWRkIHRvIG1pc3NpbmcgbGlzdFxuICAgKiAgIGVuZFxuICAgKiAgIE5vdGUgb3ZlciBDb21tYW5kOiBJZiBtaXNzaW5nLmxlbmd0aCA+IDAsIGhhbmRsZSBtaXNzaW5nIGRlcGVuZGVuY2llc1xuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGNoZWNrUmVxdWlyZW1lbnRzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgcHJvZCwgZGV2LCBwZWVyIH0gPSBhd2FpdCBnZXREZXBlbmRlbmNpZXMoKTtcbiAgICBjb25zdCBtaXNzaW5nID0gW107XG4gICAgY29uc3QgZnVsbExpc3QgPSBBcnJheS5mcm9tKFxuICAgICAgbmV3IFNldChbLi4ucHJvZCwgLi4uZGV2LCAuLi5wZWVyXSkudmFsdWVzKClcbiAgICApLm1hcCgoZCkgPT4gZC5uYW1lKTtcbiAgICBmb3IgKGNvbnN0IGRlcCBvZiB0aGlzLnJlcXVpcmVtZW50cylcbiAgICAgIGlmICghZnVsbExpc3QuaW5jbHVkZXMoZGVwKSkgbWlzc2luZy5wdXNoKGRlcCk7XG5cbiAgICBpZiAoIW1pc3NpbmcubGVuZ3RoKSByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogQHByb3RlY3RlZFxuICAgKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgaGVscCBpbmZvcm1hdGlvbiBmb3IgdGhlIGNvbW1hbmQuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIHNob3VsZCBiZSBvdmVycmlkZGVuIGluIGRlcml2ZWQgY2xhc3NlcyB0byBwcm92aWRlIHNwZWNpZmljIGhlbHAgaW5mb3JtYXRpb24uXG4gICAqIEBwYXJhbSB7UGFyc2VBcmdzUmVzdWx0fSBhcmdzIC0gVGhlIHBhcnNlZCBjb21tYW5kLWxpbmUgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgcHJvdGVjdGVkIGhlbHAoYXJnczogUGFyc2VBcmdzUmVzdWx0KTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubG9nLmluZm8oXG4gICAgICBgVGhpcyBpcyBoZWxwLiBJJ20gbm8gdXNlIGJlY2F1c2UgSSBzaG91bGQgaGF2ZSBiZWVuIG92ZXJyaWRkZW4uYFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3RlY3RlZFxuICAgKiBAYWJzdHJhY3RcbiAgICogQGRlc2NyaXB0aW9uIFJ1bnMgdGhlIGNvbW1hbmQgd2l0aCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gZGVyaXZlZCBjbGFzc2VzIHRvIGRlZmluZSB0aGUgY29tbWFuZCdzIGJlaGF2aW9yLlxuICAgKiBAcGFyYW0ge1BhcnNlQXJnc1Jlc3VsdH0gYW5zd2VycyAtIFRoZSBwYXJzZWQgY29tbWFuZC1saW5lIGFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge1Byb21pc2U8UiB8IHN0cmluZyB8IHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBjb21tYW5kJ3MgcmVzdWx0LlxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IHJ1bjxSPihcbiAgICBhbnN3ZXJzOiBMb2dnaW5nQ29uZmlnICZcbiAgICAgIHR5cGVvZiBEZWZhdWx0Q29tbWFuZFZhbHVlcyAmIHsgW2sgaW4ga2V5b2YgSV06IHVua25vd24gfVxuICApOiBQcm9taXNlPFIgfCBzdHJpbmcgfCB2b2lkPjtcblxuICAvKipcbiAgICogQGFzeW5jXG4gICAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyB0aGUgY29tbWFuZC5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgaGFuZGxlcyB0aGUgb3ZlcmFsbCBleGVjdXRpb24gZmxvdyBvZiB0aGUgY29tbWFuZCwgaW5jbHVkaW5nIHBhcnNpbmcgYXJndW1lbnRzLFxuICAgKiBzZXR0aW5nIHVwIGxvZ2dpbmcsIGNoZWNraW5nIGZvciB2ZXJzaW9uIG9yIGhlbHAgcmVxdWVzdHMsIGFuZCBydW5uaW5nIHRoZSBjb21tYW5kLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSIHwgc3RyaW5nIHwgdm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGNvbW1hbmQncyByZXN1bHQuXG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENvbW1hbmRcbiAgICogICBwYXJ0aWNpcGFudCBVc2VySW5wdXRcbiAgICogICBwYXJ0aWNpcGFudCBMb2dnaW5nXG4gICAqICAgcGFydGljaXBhbnQgZ2V0UGFja2FnZVZlcnNpb25cbiAgICogICBwYXJ0aWNpcGFudCBwcmludEJhbm5lclxuICAgKiAgIENvbW1hbmQtPj5Vc2VySW5wdXQ6IHBhcnNlQXJncyhpbnB1dHMpXG4gICAqICAgVXNlcklucHV0LS0+PkNvbW1hbmQ6IFJldHVybiBQYXJzZUFyZ3NSZXN1bHRcbiAgICogICBDb21tYW5kLT4+Q29tbWFuZDogUHJvY2VzcyBvcHRpb25zXG4gICAqICAgQ29tbWFuZC0+PkxvZ2dpbmc6IHNldENvbmZpZyhvcHRpb25zKVxuICAgKiAgIGFsdCB2ZXJzaW9uIHJlcXVlc3RlZFxuICAgKiAgICAgQ29tbWFuZC0+PmdldFBhY2thZ2VWZXJzaW9uOiBDYWxsXG4gICAqICAgICBnZXRQYWNrYWdlVmVyc2lvbi0tPj5Db21tYW5kOiBSZXR1cm4gdmVyc2lvblxuICAgKiAgIGVsc2UgaGVscCByZXF1ZXN0ZWRcbiAgICogICAgIENvbW1hbmQtPj5Db21tYW5kOiBoZWxwKGFyZ3MpXG4gICAqICAgZWxzZSBiYW5uZXIgcmVxdWVzdGVkXG4gICAqICAgICBDb21tYW5kLT4+cHJpbnRCYW5uZXI6IENhbGxcbiAgICogICBlbmRcbiAgICogICBDb21tYW5kLT4+Q29tbWFuZDogcnVuKGFyZ3MpXG4gICAqICAgYWx0IGVycm9yIG9jY3Vyc1xuICAgKiAgICAgQ29tbWFuZC0+PkNvbW1hbmQ6IExvZyBlcnJvclxuICAgKiAgIGVuZFxuICAgKiAgIENvbW1hbmQtLT4+Q29tbWFuZDogUmV0dXJuIHJlc3VsdFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZSgpOiBQcm9taXNlPFIgfCBzdHJpbmcgfCB2b2lkPiB7XG4gICAgY29uc3QgYXJnczogUGFyc2VBcmdzUmVzdWx0ID0gVXNlcklucHV0LnBhcnNlQXJncyh0aGlzLmlucHV0cyk7XG4gICAgY29uc3QgZW52ID0gRW52aXJvbm1lbnQuYWNjdW11bGF0ZShEZWZhdWx0TG9nZ2luZ0NvbmZpZylcbiAgICAgIC5hY2N1bXVsYXRlKERlZmF1bHRDb21tYW5kVmFsdWVzKVxuICAgICAgLmFjY3VtdWxhdGUoYXJncy52YWx1ZXMpO1xuICAgIGNvbnN0IHsgdGltZXN0YW1wLCB2ZXJib3NlLCB2ZXJzaW9uLCBoZWxwLCBsb2dMZXZlbCwgbG9nU3R5bGUsIGJhbm5lciB9ID1cbiAgICAgIGVudjtcblxuICAgIHRoaXMubG9nLnNldENvbmZpZyh7XG4gICAgICAuLi5lbnYsXG4gICAgICB0aW1lc3RhbXA6ICEhdGltZXN0YW1wLFxuICAgICAgbGV2ZWw6IGxvZ0xldmVsIGFzIExvZ0xldmVsLFxuICAgICAgc3R5bGU6ICEhbG9nU3R5bGUsXG4gICAgICB2ZXJib3NlOiAodmVyYm9zZSBhcyBudW1iZXIpIHx8IDAsXG4gICAgfSk7XG5cbiAgICBpZiAodmVyc2lvbikge1xuICAgICAgcmV0dXJuIGdldFBhY2thZ2VWZXJzaW9uKCk7XG4gICAgfVxuXG4gICAgaWYgKGhlbHApIHtcbiAgICAgIHJldHVybiB0aGlzLmhlbHAoYXJncyk7XG4gICAgfVxuXG4gICAgaWYgKGJhbm5lcilcbiAgICAgIHByaW50QmFubmVyKFxuICAgICAgICB0aGlzLmxvZy5mb3IocHJpbnRCYW5uZXIsIHtcbiAgICAgICAgICB0aW1lc3RhbXA6IGZhbHNlLFxuICAgICAgICAgIHN0eWxlOiBmYWxzZSxcbiAgICAgICAgICBjb250ZXh0OiBmYWxzZSxcbiAgICAgICAgICBsb2dMZXZlbDogZmFsc2UsXG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgbGV0IHJlc3VsdDtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5ydW4oZW52KTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aGlzLmxvZy5lcnJvcihgRXJyb3Igd2hpbGUgcnVubmluZyBwcm92aWRlZCBjbGkgZnVuY3Rpb246ICR7ZX1gKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdCBhcyBSO1xuICB9XG59XG4iLCJpbXBvcnQgaHR0cHMgZnJvbSBcImh0dHBzXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIi4uL291dHB1dC9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgc2ltcGxlIEhUVFAgY2xpZW50IGZvciBkb3dubG9hZGluZyBmaWxlcy5cbiAqIEBzdW1tYXJ5IFRoaXMgY2xhc3MgcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSB0byBkb3dubG9hZCBmaWxlcyBmcm9tIEhUVFBTIFVSTHMuXG4gKiBJdCB1c2VzIE5vZGUuanMgYnVpbHQtaW4gaHR0cHMgbW9kdWxlIHRvIG1ha2UgcmVxdWVzdHMuXG4gKlxuICogQGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBIdHRwQ2xpZW50IHtcbiAgcHJvdGVjdGVkIHN0YXRpYyBsb2cgPSBMb2dnaW5nLmZvcihIdHRwQ2xpZW50KTtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEb3dubG9hZHMgYSBmaWxlIGZyb20gYSBnaXZlbiBVUkwuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIHNlbmRzIGEgR0VUIHJlcXVlc3QgdG8gdGhlIHNwZWNpZmllZCBVUkwgYW5kIHJldHVybnMgdGhlIHJlc3BvbnNlIGJvZHkgYXMgYSBzdHJpbmcuXG4gICAqIEl0IGhhbmRsZXMgZGlmZmVyZW50IHNjZW5hcmlvcyBzdWNoIGFzIG5vbi0yMDAgc3RhdHVzIGNvZGVzIGFuZCBuZXR3b3JrIGVycm9ycy5cbiAgICpcbiAgICogQHBhcmFtIHVybCAtIFRoZSBVUkwgb2YgdGhlIGZpbGUgdG8gZG93bmxvYWQuXG4gICAqIEByZXR1cm4gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgZmlsZSBjb250ZW50IGFzIGEgc3RyaW5nLlxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAgICogICBwYXJ0aWNpcGFudCBIdHRwQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgSFRUUFNcbiAgICogICBwYXJ0aWNpcGFudCBTZXJ2ZXJcbiAgICogICBDbGllbnQtPj5IdHRwQ2xpZW50OiBkb3dubG9hZEZpbGUodXJsKVxuICAgKiAgIEh0dHBDbGllbnQtPj5IVFRQUzogZ2V0KHVybClcbiAgICogICBIVFRQUy0+PlNlcnZlcjogR0VUIHJlcXVlc3RcbiAgICogICBTZXJ2ZXItLT4+SFRUUFM6IFJlc3BvbnNlXG4gICAqICAgSFRUUFMtLT4+SHR0cENsaWVudDogUmVzcG9uc2Ugb2JqZWN0XG4gICAqICAgYWx0IFN0YXR1cyBjb2RlIGlzIDIwMFxuICAgKiAgICAgbG9vcCBGb3IgZWFjaCBkYXRhIGNodW5rXG4gICAqICAgICAgIEhUVFBTLT4+SHR0cENsaWVudDogJ2RhdGEnIGV2ZW50XG4gICAqICAgICAgIEh0dHBDbGllbnQtPj5IdHRwQ2xpZW50OiBBY2N1bXVsYXRlIGRhdGFcbiAgICogICAgIGVuZFxuICAgKiAgICAgSFRUUFMtPj5IdHRwQ2xpZW50OiAnZW5kJyBldmVudFxuICAgKiAgICAgSHR0cENsaWVudC0tPj5DbGllbnQ6IFJlc29sdmUgd2l0aCBkYXRhXG4gICAqICAgZWxzZSBTdGF0dXMgY29kZSBpcyBub3QgMjAwXG4gICAqICAgICBIdHRwQ2xpZW50LS0+PkNsaWVudDogUmVqZWN0IHdpdGggZXJyb3JcbiAgICogICBlbmRcbiAgICovXG4gIHN0YXRpYyBhc3luYyBkb3dubG9hZEZpbGUodXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGZ1bmN0aW9uIHJlcXVlc3QodXJsOiBzdHJpbmcpIHtcbiAgICAgICAgdXJsID0gZW5jb2RlVVJJKHVybCk7XG4gICAgICAgIGh0dHBzLmdldCh1cmwsIChyZXMpID0+IHtcbiAgICAgICAgICBpZiAocmVzLnN0YXR1c0NvZGUgPT09IDMwMSB8fCByZXMuc3RhdHVzQ29kZSA9PT0gMzA3KVxuICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QocmVzLmhlYWRlcnMubG9jYXRpb24gYXMgc3RyaW5nKTtcblxuICAgICAgICAgIGlmIChyZXMuc3RhdHVzQ29kZSAhPT0gMjAwKSB7XG4gICAgICAgICAgICBIdHRwQ2xpZW50LmxvZy5lcnJvcihcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBmZXRjaCAke3VybH0gKHN0YXR1czogJHtyZXMuc3RhdHVzQ29kZX0pYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybiByZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9YCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZXQgZGF0YSA9IFwiXCI7XG4gICAgICAgICAgcmVzLm9uKFwiZGF0YVwiLCAoY2h1bmspID0+IHtcbiAgICAgICAgICAgIGRhdGEgKz0gY2h1bms7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmVzLm9uKFwiZXJyb3JcIiwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmVzLm9uKFwiZW5kXCIsICgpID0+IHtcbiAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmVxdWVzdCh1cmwpO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBMb2dnaW5nQ29uZmlnIH0gZnJvbSBcIi4uLy4uL291dHB1dFwiO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCIuLi9jb21tYW5kXCI7XG5pbXBvcnQgeyBDb21tYW5kT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVmYXVsdENvbW1hbmRPcHRpb25zLCBEZWZhdWx0Q29tbWFuZFZhbHVlcyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIGNvcHlGaWxlLFxuICBkZWxldGVQYXRoLFxuICBnZXRBbGxGaWxlcyxcbiAgZ2V0UGFja2FnZSxcbiAgcGF0Y2hGaWxlLFxuICByZWFkRmlsZSxcbiAgcmVuYW1lRmlsZSxcbiAgcnVuQ29tbWFuZCxcbiAgd3JpdGVGaWxlLFxufSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyByb2xsdXAsIElucHV0T3B0aW9ucywgT3V0cHV0T3B0aW9ucywgUm9sbHVwQnVpbGQgfSBmcm9tIFwicm9sbHVwXCI7XG5pbXBvcnQgdHlwZXNjcmlwdCBmcm9tIFwiQHJvbGx1cC9wbHVnaW4tdHlwZXNjcmlwdFwiO1xuaW1wb3J0IGNvbW1vbmpzIGZyb20gXCJAcm9sbHVwL3BsdWdpbi1jb21tb25qc1wiO1xuaW1wb3J0IHsgbm9kZVJlc29sdmUgfSBmcm9tIFwiQHJvbGx1cC9wbHVnaW4tbm9kZS1yZXNvbHZlXCI7XG5pbXBvcnQganNvbiBmcm9tIFwiQHJvbGx1cC9wbHVnaW4tanNvblwiO1xuXG5jb25zdCBWRVJTSU9OX1NUUklORyA9IFwiIyNWRVJTSU9OIyNcIjtcblxuZW51bSBNb2RlcyB7XG4gIENKUyA9IFwiY29tbW9uanNcIixcbiAgRVNNID0gXCJlczIwMjJcIixcbn1cblxuY29uc3QgQ29tbWFuZHMgPSBbXCJ1cGRhdGUtc2NyaXB0c1wiLCBcInRhZy1yZWxlYXNlXCIsIFwiYnVpbGQtc2NyaXB0c1wiXTtcblxuY29uc3Qgb3B0aW9ucyA9IHtcbiAgcHJvZDoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICBkZXY6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgZG9jczoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICBjb21tYW5kczoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICBiYW5uZXI6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbn07XG5cbmV4cG9ydCBjbGFzcyBCdWlsZFNjcmlwdHMgZXh0ZW5kcyBDb21tYW5kPFxuICBDb21tYW5kT3B0aW9uczx0eXBlb2Ygb3B0aW9ucz4sXG4gIHZvaWRcbj4ge1xuICBwcml2YXRlIHJlcGxhY2VtZW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IHBrZ1ZlcnNpb246IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBwa2dOYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXG4gICAgICBcIkJ1aWxkU2NyaXB0c1wiLFxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgRGVmYXVsdENvbW1hbmRPcHRpb25zLCBvcHRpb25zKSBhcyBDb21tYW5kT3B0aW9uczxcbiAgICAgICAgdHlwZW9mIG9wdGlvbnNcbiAgICAgID5cbiAgICApO1xuICAgIGNvbnN0IHBrZyA9IGdldFBhY2thZ2UoKSBhcyB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH07XG4gICAgY29uc3QgeyBuYW1lLCB2ZXJzaW9uIH0gPSBwa2c7XG4gICAgdGhpcy5wa2dOYW1lID0gbmFtZS5pbmNsdWRlcyhcIkBcIikgPyBuYW1lLnNwbGl0KFwiL1wiKVsxXSA6IG5hbWU7XG4gICAgdGhpcy5wa2dWZXJzaW9uID0gdmVyc2lvbjtcbiAgICB0aGlzLnJlcGxhY2VtZW50c1tWRVJTSU9OX1NUUklOR10gPSB0aGlzLnBrZ1ZlcnNpb247XG4gIH1cblxuICBwYXRjaENqc0ltcG9ydHMoZmlsZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVnZXhwID0gLyhyZXF1aXJlXFwoW1wiJ10pKFxcLi4qPykoW1wiJ11cXClbOyxdKS9nO1xuICAgIGxldCBkYXRhID0gcmVhZEZpbGUoZmlsZSk7XG4gICAgZGF0YSA9IGRhdGEucmVwbGFjZShyZWdleHAsIChtYXRjaCwgLi4uZ3JvdXBzOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgY29uc3QgcmVuYW1lZEZpbGUgPSBncm91cHNbMV0gKyBcIi5janNcIjtcbiAgICAgIGNvbnN0IGRpcm5hbWUgPSBwYXRoLmRpcm5hbWUoZmlsZSkucmVwbGFjZShcImxpYlwiLCBcInNyY1wiKTtcbiAgICAgIGNvbnN0IGZpbGVOYW1lID0gZ3JvdXBzWzFdICsgXCIudHNcIjtcbiAgICAgIGNvbnN0IHNvdXJjZUZpbGVQYXRoID0gcGF0aC5qb2luKGRpcm5hbWUsIGZpbGVOYW1lKTtcblxuICAgICAgbGV0IHJlc3VsdDtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhzb3VyY2VGaWxlUGF0aCkpIHtcbiAgICAgICAgcmVzdWx0ID0gZ3JvdXBzWzBdICsgZ3JvdXBzWzFdICsgXCIvaW5kZXguY2pzXCIgKyBncm91cHNbMl07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBncm91cHNbMF0gKyByZW5hbWVkRmlsZSArIGdyb3Vwc1syXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgICB3cml0ZUZpbGUoZmlsZSwgZGF0YSk7XG4gIH1cblxuICBwYXRjaEZpbGVzKHA6IHN0cmluZykge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnBhdGNoRmlsZXMpO1xuICAgIGNvbnN0IHsgbmFtZSwgdmVyc2lvbiB9ID0gZ2V0UGFja2FnZSgpIGFzIGFueTtcbiAgICBsb2cuaW5mbyhgUGF0Y2hpbmcgJHtuYW1lfSAke3ZlcnNpb259IG1vZHVsZSBpbiAke3B9Li4uYCk7XG4gICAgY29uc3Qgc3RhdCA9IGZzLnN0YXRTeW5jKHApO1xuICAgIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkpXG4gICAgICBmcy5yZWFkZGlyU3luYyhwLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgICAuZmlsdGVyKChwKSA9PiBwLmlzRmlsZSgpKVxuICAgICAgICAuZm9yRWFjaCgoZmlsZSkgPT5cbiAgICAgICAgICBwYXRjaEZpbGUocGF0aC5qb2luKGZpbGUucGFyZW50UGF0aCwgZmlsZS5uYW1lKSwgdGhpcy5yZXBsYWNlbWVudHMpXG4gICAgICAgICk7XG4gICAgbG9nLnZlcmJvc2UoYE1vZHVsZSAke25hbWV9ICR7dmVyc2lvbn0gcGF0Y2hlZCBpbiAke3B9Li4uYCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkKGlzRGV2OiBib29sZWFuLCBtb2RlOiBNb2RlcywgYnVuZGxlID0gZmFsc2UpIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5idWlsZCk7XG4gICAgbG9nLmluZm8oXG4gICAgICBgQnVpbGRpbmcgJHt0aGlzLnBrZ05hbWV9ICR7dGhpcy5wa2dWZXJzaW9ufSBtb2R1bGUgKCR7bW9kZX0pIGluICR7aXNEZXYgPyBcImRldlwiIDogXCJwcm9kXCJ9IG1vZGUuLi5gXG4gICAgKTtcblxuICAgIGF3YWl0IHJ1bkNvbW1hbmQoXG4gICAgICBgbnB4IHRzYyAtLW1vZHVsZSAke2J1bmRsZSA/IFwiYW1kXCIgOiBtb2RlfSR7aXNEZXYgPyBcIiAtLWlubGluZVNvdXJjZU1hcFwiIDogXCIgLS1zb3VyY2VNYXAgZmFsc2VcIn0gLS1vdXREaXIgJHtidW5kbGUgPyBcImRpc3RcIiA6IGBsaWIke21vZGUgPT09IE1vZGVzLkVTTSA/IFwiL2VzbVwiIDogXCJcIn1gfSR7YnVuZGxlID8gYCAtLWlzb2xhdGVkTW9kdWxlcyBmYWxzZSAtLW91dEZpbGUgJHt0aGlzLnBrZ05hbWV9YCA6IFwiXCJ9YFxuICAgICkucHJvbWlzZTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBNb2R1bGUgJHt0aGlzLnBrZ05hbWV9ICR7dGhpcy5wa2dWZXJzaW9ufSAoJHttb2RlfSkgYnVpbHQgaW4gJHtpc0RldiA/IFwiZGV2XCIgOiBcInByb2RcIn0gbW9kZS4uLmBcbiAgICApO1xuICAgIGlmIChtb2RlID09PSBNb2Rlcy5DSlMgJiYgIWJ1bmRsZSkge1xuICAgICAgY29uc3QgZmlsZXMgPSBnZXRBbGxGaWxlcyhcbiAgICAgICAgXCJsaWJcIixcbiAgICAgICAgKGZpbGUpID0+IGZpbGUuZW5kc1dpdGgoXCIuanNcIikgJiYgIWZpbGUuaW5jbHVkZXMoXCIvZXNtL1wiKVxuICAgICAgKTtcblxuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIGxvZy52ZXJib3NlKGBQYXRjaGluZyAke2ZpbGV9J3MgY2pzIGltcG9ydHMuLi5gKTtcbiAgICAgICAgY29uc3QgZiA9IGZpbGUucmVwbGFjZShcIi5qc1wiLCBcIi5janNcIik7XG4gICAgICAgIGF3YWl0IHJlbmFtZUZpbGUoZmlsZSwgZik7XG4gICAgICAgIHRoaXMucGF0Y2hDanNJbXBvcnRzKGYpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvcHlBc3NldHMobW9kZTogTW9kZXMpIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5jb3B5QXNzZXRzKTtcbiAgICBsZXQgaGFzQXNzZXRzID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGhhc0Fzc2V0cyA9IGZzLnN0YXRTeW5jKFwiLi9zcmMvYXNzZXRzXCIpLmlzRGlyZWN0b3J5KCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgcmV0dXJuIGxvZy52ZXJib3NlKGBObyBhc3NldHMgZm91bmQgaW4gLi9zcmMvYXNzZXRzIHRvIGNvcHlgKTtcbiAgICB9XG4gICAgaWYgKGhhc0Fzc2V0cylcbiAgICAgIGNvcHlGaWxlKFxuICAgICAgICBcIi4vc3JjL2Fzc2V0c1wiLFxuICAgICAgICBgLi8ke21vZGUgPT09IE1vZGVzLkNKUyA/IFwibGliXCIgOiBcImRpc3RcIn0vYXNzZXRzYFxuICAgICAgKTtcbiAgfVxuXG4gIGFzeW5jIGJ1aWxkQ29tbWFuZHMoKSB7XG4gICAgZm9yIChjb25zdCBjbWQgb2YgQ29tbWFuZHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuYnVuZGxlKE1vZGVzLkNKUywgdHJ1ZSwgdHJ1ZSwgYHNyYy9iaW4vJHtjbWR9LnRzYCwgY21kKTtcbiAgICAgIGxldCBkYXRhID0gcmVhZEZpbGUoYGJpbi8ke2NtZH0uY2pzYCk7XG4gICAgICBkYXRhID0gXCIjIS91c3IvYmluL2VudiBub2RlXFxuXCIgKyBkYXRhO1xuICAgICAgd3JpdGVGaWxlKGBiaW4vJHtjbWR9LmNqc2AsIGRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGJ1bmRsZShcbiAgICBtb2RlOiBNb2RlcyxcbiAgICBpc0RldjogYm9vbGVhbixcbiAgICBpc0xpYjogYm9vbGVhbixcbiAgICBlbnRyeUZpbGU6IHN0cmluZyA9IFwic3JjL2luZGV4LnRzXCIsXG4gICAgbmFtZU92ZXJyaWRlOiBzdHJpbmcgPSB0aGlzLnBrZ05hbWUsXG4gICAgZXh0ZXJuYWxzPzogc3RyaW5nW10sXG4gICAgaW5jbHVkZTogc3RyaW5nW10gPSBbXCJwcm9tcHRzXCIsIFwic3R5bGVkLXN0cmluZy1idWlsZGVyXCJdXG4gICkge1xuICAgIGNvbnN0IGlzRXNtID0gbW9kZSA9PT0gTW9kZXMuRVNNO1xuICAgIGNvbnN0IHBrZ05hbWUgPSB0aGlzLnBrZ05hbWU7XG5cbiAgICBjb25zdCBleHQgPSBBcnJheS5mcm9tKFxuICAgICAgbmV3IFNldChbXG4gICAgICAgIC4uLltcbiAgICAgICAgICBcImZzXCIsXG4gICAgICAgICAgXCJwYXRoXCIsXG4gICAgICAgICAgXCJwcm9jZXNzXCIsXG4gICAgICAgICAgXCJyb2xsdXBcIixcbiAgICAgICAgICBcIkByb2xsdXAvcGx1Z2luLXR5cGVzY3JpcHRcIixcbiAgICAgICAgICBcIkByb2xsdXAvcGx1Z2luLWpzb25cIixcbiAgICAgICAgICBcIkByb2xsdXAvcGx1Z2luLWNvbW1vbmpzXCIsXG4gICAgICAgICAgXCJAcm9sbHVwL3BsdWdpbi1ub2RlLXJlc29sdmVcIixcbiAgICAgICAgICBcImNoaWxkX3Byb2Nlc3NcIixcbiAgICAgICAgICBcInV0aWxcIixcbiAgICAgICAgICBcImh0dHBzXCIsXG4gICAgICAgIF0sXG4gICAgICAgIC4uLihleHRlcm5hbHMgfHwgW10pLFxuICAgICAgXSlcbiAgICApO1xuXG4gICAgY29uc3QgcGx1Z2lucyA9IFtcbiAgICAgIHR5cGVzY3JpcHQoe1xuICAgICAgICBjb21waWxlck9wdGlvbnM6IHtcbiAgICAgICAgICBtb2R1bGU6IFwiZXNuZXh0XCIsXG4gICAgICAgICAgZGVjbGFyYXRpb246IGZhbHNlLFxuICAgICAgICAgIG91dERpcjogaXNMaWIgPyBcImJpblwiIDogXCJkaXN0XCIsXG4gICAgICAgIH0sXG4gICAgICAgIGluY2x1ZGU6IFtcInNyYy8qKi8qLnRzXCJdLFxuICAgICAgICBleGNsdWRlOiBbXCJub2RlX21vZHVsZXNcIiwgXCIqKi8qLnNwZWMudHNcIl0sXG4gICAgICAgIHRzY29uZmlnOiBcIi4vdHNjb25maWcuanNvblwiLFxuICAgICAgfSksXG4gICAgICBqc29uKCksXG4gICAgXTtcblxuICAgIGlmIChpc0xpYikge1xuICAgICAgcGx1Z2lucy5wdXNoKFxuICAgICAgICBjb21tb25qcyh7XG4gICAgICAgICAgaW5jbHVkZTogW10sXG4gICAgICAgICAgZXhjbHVkZTogZXh0ZXJuYWxzLFxuICAgICAgICB9KSxcbiAgICAgICAgbm9kZVJlc29sdmUoe1xuICAgICAgICAgIHJlc29sdmVPbmx5OiBpbmNsdWRlLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dDogSW5wdXRPcHRpb25zID0ge1xuICAgICAgaW5wdXQ6IGVudHJ5RmlsZSxcbiAgICAgIHBsdWdpbnM6IHBsdWdpbnMsXG4gICAgICBleHRlcm5hbDogZXh0LFxuICAgIH07XG5cbiAgICBjb25zdCBvdXRwdXRzOiBPdXRwdXRPcHRpb25zW10gPSBbXG4gICAgICB7XG4gICAgICAgIGZpbGU6IGAke2lzTGliID8gXCJiaW4vXCIgOiBcImRpc3QvXCJ9JHtuYW1lT3ZlcnJpZGUgPyBuYW1lT3ZlcnJpZGUgOiBgLmJ1bmRsZS4keyFpc0RldiA/IFwibWluXCIgOiBcIlwifWB9JHtpc0VzbSA/IFwiLmVzbVwiIDogXCJcIn0uY2pzYCxcbiAgICAgICAgZm9ybWF0OiBpc0xpYiA/IFwiY2pzXCIgOiBpc0VzbSA/IFwiZXNtXCIgOiBcInVtZFwiLFxuICAgICAgICBuYW1lOiBwa2dOYW1lLFxuICAgICAgICBlc01vZHVsZTogaXNFc20sXG4gICAgICAgIHNvdXJjZW1hcDogaXNEZXYgPyBcImlubGluZVwiIDogZmFsc2UsXG4gICAgICAgIGdsb2JhbHM6IHt9LFxuICAgICAgICBleHBvcnRzOiBcImF1dG9cIixcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBidW5kbGUgPSBhd2FpdCByb2xsdXAoaW5wdXQpO1xuICAgICAgY29uc29sZS5sb2coYnVuZGxlLndhdGNoRmlsZXMpO1xuICAgICAgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPdXRwdXRzKGJ1bmRsZTogUm9sbHVwQnVpbGQpIHtcbiAgICAgICAgZm9yIChjb25zdCBvdXRwdXRPcHRpb25zIG9mIG91dHB1dHMpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgY29uc3QgeyBvdXRwdXQgfSA9IGF3YWl0IGJ1bmRsZS53cml0ZShvdXRwdXRPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBnZW5lcmF0ZU91dHB1dHMoYnVuZGxlKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBidW5kbGU6ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkQnlFbnYoaXNEZXY6IGJvb2xlYW4pIHtcbiAgICB0cnkge1xuICAgICAgZGVsZXRlUGF0aChcImxpYlwiKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBkZWxldGVQYXRoKFwiZGlzdFwiKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGZzLm1rZGlyU3luYyhcImxpYlwiKTtcbiAgICBmcy5ta2RpclN5bmMoXCJkaXN0XCIpO1xuICAgIGF3YWl0IHRoaXMuYnVpbGQoaXNEZXYsIE1vZGVzLkNKUyk7XG4gICAgYXdhaXQgdGhpcy5idWlsZChpc0RldiwgTW9kZXMuRVNNKTtcbiAgICBhd2FpdCB0aGlzLmJ1bmRsZShNb2Rlcy5DSlMsIHRydWUsIGZhbHNlKTtcbiAgICBhd2FpdCB0aGlzLmJ1bmRsZShNb2Rlcy5FU00sIHRydWUsIGZhbHNlKTtcbiAgICB0aGlzLnBhdGNoRmlsZXMoXCJsaWJcIik7XG4gICAgdGhpcy5wYXRjaEZpbGVzKFwiZGlzdFwiKTtcbiAgICB0aGlzLmNvcHlBc3NldHMoTW9kZXMuQ0pTKTtcbiAgICB0aGlzLmNvcHlBc3NldHMoTW9kZXMuRVNNKTtcbiAgfVxuXG4gIGFzeW5jIGJ1aWxkRGV2KCkge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkQnlFbnYodHJ1ZSk7XG4gIH1cblxuICBhc3luYyBidWlsZFByb2QoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRCeUVudihmYWxzZSk7XG4gIH1cblxuICBhc3luYyBidWlsZERvY3MoKSB7XG4gICAgYXdhaXQgcnVuQ29tbWFuZChgbnBtIGluc3RhbGwgYmV0dGVyLWRvY3MgdGFmZnlkYmApLnByb21pc2U7XG4gICAgYXdhaXQgcnVuQ29tbWFuZChgbnB4IG1hcmtkb3duLWluY2x1ZGUgLi93b3JrZG9jcy9yZWFkbWUtbWQuanNvbmApLnByb21pc2U7XG4gICAgYXdhaXQgcnVuQ29tbWFuZChcbiAgICAgIGBucHgganNkb2MgLWMgLi93b3JrZG9jcy9qc2RvY3MuanNvbiAtdCAuL25vZGVfbW9kdWxlcy9iZXR0ZXItZG9jc2BcbiAgICApLnByb21pc2U7XG4gICAgYXdhaXQgcnVuQ29tbWFuZChgbnBtIHJlbW92ZSBiZXR0ZXItZG9jcyB0YWZmeWRiYCkucHJvbWlzZTtcbiAgICBbXG4gICAgICB7XG4gICAgICAgIHNyYzogXCJ3b3JrZG9jcy9hc3NldHNcIixcbiAgICAgICAgZGVzdDogXCIuL2RvY3Mvd29ya2RvY3MvYXNzZXRzXCIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzcmM6IFwid29ya2RvY3MvcmVwb3J0cy9jb3ZlcmFnZVwiLFxuICAgICAgICBkZXN0OiBcIi4vZG9jcy93b3JrZG9jcy9yZXBvcnRzL2NvdmVyYWdlXCIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzcmM6IFwid29ya2RvY3MvcmVwb3J0cy9odG1sXCIsXG4gICAgICAgIGRlc3Q6IFwiLi9kb2NzL3dvcmtkb2NzL3JlcG9ydHMvaHRtbFwiLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc3JjOiBcIndvcmtkb2NzL3Jlc291cmNlc1wiLFxuICAgICAgICBkZXN0OiBcIi4vZG9jcy93b3JrZG9jcy9yZXNvdXJjZXNcIixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNyYzogXCJMSUNFTlNFLm1kXCIsXG4gICAgICAgIGRlc3Q6IFwiLi9kb2NzL0xJQ0VOU0UubWRcIixcbiAgICAgIH0sXG4gICAgXS5mb3JFYWNoKChmKSA9PiB7XG4gICAgICBjb25zdCB7IHNyYywgZGVzdCB9ID0gZjtcbiAgICAgIGNvcHlGaWxlKHNyYywgZGVzdCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcnVuPFI+KFxuICAgIGFuc3dlcnM6IExvZ2dpbmdDb25maWcgJlxuICAgICAgdHlwZW9mIERlZmF1bHRDb21tYW5kVmFsdWVzICYgeyBbayBpbiBrZXlvZiB0eXBlb2Ygb3B0aW9uc106IHVua25vd24gfVxuICApOiBQcm9taXNlPHN0cmluZyB8IHZvaWQgfCBSPiB7XG4gICAgY29uc3QgeyBkZXYsIHByb2QsIGRvY3MsIGNvbW1hbmRzIH0gPSBhbnN3ZXJzO1xuXG4gICAgaWYgKGNvbW1hbmRzKSB7XG4gICAgICBhd2FpdCB0aGlzLmJ1aWxkQ29tbWFuZHMoKTtcbiAgICB9XG5cbiAgICBpZiAoZGV2KSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5idWlsZERldigpO1xuICAgIH1cbiAgICBpZiAocHJvZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYnVpbGRQcm9kKCk7XG4gICAgfVxuICAgIGlmIChkb2NzKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5idWlsZERvY3MoKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IHJ1bkNvbW1hbmQgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IE5vQ0lGTGFnLCBTZW1WZXJzaW9uLCBTZW1WZXJzaW9uUmVnZXggfSBmcm9tIFwiLi4vLi4vdXRpbHMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBVc2VySW5wdXQgfSBmcm9tIFwiLi4vLi4vaW5wdXQvaW5wdXRcIjtcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiLi4vY29tbWFuZFwiO1xuaW1wb3J0IHsgTG9nZ2luZ0NvbmZpZyB9IGZyb20gXCIuLi8uLi9vdXRwdXRcIjtcbmltcG9ydCB7IERlZmF1bHRDb21tYW5kVmFsdWVzIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5cbmNvbnN0IG9wdGlvbnMgPSB7XG4gIGNpOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgbWVzc2FnZToge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgc2hvcnQ6IFwibVwiLFxuICB9LFxuICB0YWc6IHtcbiAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgIHNob3J0OiBcInRcIixcbiAgICBkZWZhdWx0OiB1bmRlZmluZWQsXG4gIH0sXG59O1xuXG4vKipcbiAqIEBjbGFzcyBSZWxlYXNlU2NyaXB0XG4gKiBAZXh0ZW5kcyB7Q29tbWFuZH1cbiAqIEBjYXZlZ29yeSBzY3JpcHRzXG4gKiBAZGVzY3JpcHRpb24gQSBjb21tYW5kLWxpbmUgc2NyaXB0IGZvciBtYW5hZ2luZyByZWxlYXNlcyBhbmQgdmVyc2lvbiB1cGRhdGVzLlxuICogQHN1bW1hcnkgVGhpcyBzY3JpcHQgYXV0b21hdGVzIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGFuZCBwdXNoaW5nIG5ldyByZWxlYXNlcy4gSXQgaGFuZGxlcyB2ZXJzaW9uIHVwZGF0ZXMsXG4gKiBjb21taXQgbWVzc2FnZXMsIGFuZCBvcHRpb25hbGx5IHB1Ymxpc2hlcyB0byBOUE0uIFRoZSBzY3JpcHQgc3VwcG9ydHMgc2VtYW50aWMgdmVyc2lvbmluZyBhbmQgY2FuIHdvcmsgaW4gYm90aCBDSSBhbmQgbm9uLUNJIGVudmlyb25tZW50cy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHNjcmlwdFxuICogQHBhcmFtIHtib29sZWFufSBvcHRpb25zLmNpIC0gV2hldGhlciB0aGUgc2NyaXB0IGlzIHJ1bm5pbmcgaW4gYSBDSSBlbnZpcm9ubWVudCAoZGVmYXVsdDogdHJ1ZSlcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25zLm1lc3NhZ2UgLSBUaGUgcmVsZWFzZSBtZXNzYWdlIChzaG9ydDogJ20nKVxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMudGFnIC0gVGhlIHZlcnNpb24gdGFnIHRvIHVzZSAoc2hvcnQ6ICd0JywgZGVmYXVsdDogdW5kZWZpbmVkKVxuICovXG5leHBvcnQgY2xhc3MgUmVsZWFzZVNjcmlwdCBleHRlbmRzIENvbW1hbmQ8dHlwZW9mIG9wdGlvbnMsIHZvaWQ+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJSZWxlYXNlU2NyaXB0XCIsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyB0aGUgdmVyc2lvbiBmb3IgdGhlIHJlbGVhc2UuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIHZhbGlkYXRlcyB0aGUgcHJvdmlkZWQgdGFnIG9yIHByb21wdHMgdGhlIHVzZXIgZm9yIGEgbmV3IG9uZSBpZiBub3QgcHJvdmlkZWQgb3IgaW52YWxpZC5cbiAgICogSXQgYWxzbyBkaXNwbGF5cyB0aGUgbGF0ZXN0IGdpdCB0YWdzIGZvciByZWZlcmVuY2UuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgLSBUaGUgdmVyc2lvbiB0YWcgdG8gcHJlcGFyZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBUaGUgcHJlcGFyZWQgdmVyc2lvbiB0YWdcbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgUiBhcyBSZWxlYXNlU2NyaXB0XG4gICAqICAgcGFydGljaXBhbnQgVCBhcyBUZXN0VmVyc2lvblxuICAgKiAgIHBhcnRpY2lwYW50IFUgYXMgVXNlcklucHV0XG4gICAqICAgcGFydGljaXBhbnQgRyBhcyBHaXRcbiAgICogICBSLT4+VDogdGVzdFZlcnNpb24odGFnKVxuICAgKiAgIGFsdCB0YWcgaXMgdmFsaWRcbiAgICogICAgIFQtLT4+UjogcmV0dXJuIHRhZ1xuICAgKiAgIGVsc2UgdGFnIGlzIGludmFsaWQgb3Igbm90IHByb3ZpZGVkXG4gICAqICAgICBSLT4+RzogTGlzdCBsYXRlc3QgZ2l0IHRhZ3NcbiAgICogICAgIFItPj5VOiBQcm9tcHQgZm9yIG5ldyB0YWdcbiAgICogICAgIFUtLT4+UjogcmV0dXJuIG5ldyB0YWdcbiAgICogICBlbmRcbiAgICovXG4gIGFzeW5jIHByZXBhcmVWZXJzaW9uKHRhZz86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucHJlcGFyZVZlcnNpb24pO1xuICAgIHRhZyA9IHRoaXMudGVzdFZlcnNpb24oKHRhZyBhcyBzdHJpbmcpIHx8IFwiXCIpO1xuICAgIGlmICghdGFnKSB7XG4gICAgICBsb2cudmVyYm9zZShcIk5vIHJlbGVhc2UgbWVzc2FnZSBwcm92aWRlZC4gUHJvbXB0aW5nIGZvciBvbmU6XCIpO1xuICAgICAgbG9nLmluZm8oYExpc3RpbmcgbGF0ZXN0IGdpdCB0YWdzOmApO1xuICAgICAgYXdhaXQgcnVuQ29tbWFuZChcImdpdCB0YWcgLS1zb3J0PS10YWdnZXJkYXRlIHwgaGVhZCAtbiA1XCIpLnByb21pc2U7XG4gICAgICByZXR1cm4gYXdhaXQgVXNlcklucHV0Lmluc2lzdEZvclRleHQoXG4gICAgICAgIFwidGFnXCIsXG4gICAgICAgIFwiRW50ZXIgdGhlIG5ldyB0YWcgbnVtYmVyIChhY2NlcHRzIHYqLiouKlstLi4uXSlcIixcbiAgICAgICAgKHZhbCkgPT5cbiAgICAgICAgICAhIXZhbC50b1N0cmluZygpLm1hdGNoKC9edlswLTldK1xcLlswLTldKy5bMC05XSsoLVswLTlhLXpBLVotXSspPyQvKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhZztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGVzdHMgaWYgdGhlIHByb3ZpZGVkIHZlcnNpb24gaXMgdmFsaWQuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIGNoZWNrcyBpZiB0aGUgdmVyc2lvbiBpcyBhIHZhbGlkIHNlbWFudGljIHZlcnNpb24gb3IgYSBwcmVkZWZpbmVkIHVwZGF0ZSB0eXBlIChQQVRDSCwgTUlOT1IsIE1BSk9SKS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSBUaGUgdmVyc2lvbiB0byB0ZXN0XG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCB1bmRlZmluZWR9IFRoZSB2YWxpZGF0ZWQgdmVyc2lvbiBvciB1bmRlZmluZWQgaWYgaW52YWxpZFxuICAgKi9cbiAgdGVzdFZlcnNpb24odmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy50ZXN0VmVyc2lvbik7XG4gICAgdmVyc2lvbiA9IHZlcnNpb24udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgc3dpdGNoICh2ZXJzaW9uKSB7XG4gICAgICBjYXNlIFNlbVZlcnNpb24uUEFUQ0g6XG4gICAgICBjYXNlIFNlbVZlcnNpb24uTUlOT1I6XG4gICAgICBjYXNlIFNlbVZlcnNpb24uTUFKT1I6XG4gICAgICAgIGxvZy52ZXJib3NlKGBVc2luZyBwcm92aWRlZCBTZW1WZXIgdXBkYXRlOiAke3ZlcnNpb259YCwgMSk7XG4gICAgICAgIHJldHVybiB2ZXJzaW9uO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgbG9nLnZlcmJvc2UoXG4gICAgICAgICAgYFRlc3RpbmcgcHJvdmlkZWQgdmVyc2lvbiBmb3IgU2VtVmVyIGNvbXBhdGliaWxpdHk6ICR7dmVyc2lvbn1gLFxuICAgICAgICAgIDFcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFuZXcgUmVnRXhwKFNlbVZlcnNpb25SZWdleCkudGVzdCh2ZXJzaW9uKSkge1xuICAgICAgICAgIGxvZy5kZWJ1ZyhgSW52YWxpZCB2ZXJzaW9uIG51bWJlcjogJHt2ZXJzaW9ufWApO1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgbG9nLnZlcmJvc2UoYHZlcnNpb24gYXBwcm92ZWQ6ICR7dmVyc2lvbn1gLCAxKTtcbiAgICAgICAgcmV0dXJuIHZlcnNpb247XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcmVwYXJlcyB0aGUgcmVsZWFzZSBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBlaXRoZXIgcmV0dXJucyB0aGUgcHJvdmlkZWQgbWVzc2FnZSBvciBwcm9tcHRzIHRoZSB1c2VyIGZvciBhIG5ldyBvbmUgaWYgbm90IHByb3ZpZGVkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdIC0gVGhlIHJlbGVhc2UgbWVzc2FnZVxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBUaGUgcHJlcGFyZWQgcmVsZWFzZSBtZXNzYWdlXG4gICAqL1xuICBhc3luYyBwcmVwYXJlTWVzc2FnZShtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgY29uc3QgbG9nID0gdGhpcy5sb2cuZm9yKHRoaXMucHJlcGFyZU1lc3NhZ2UpO1xuICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgbG9nLnZlcmJvc2UoXCJObyByZWxlYXNlIG1lc3NhZ2UgcHJvdmlkZWQuIFByb21wdGluZyBmb3Igb25lXCIpO1xuICAgICAgcmV0dXJuIGF3YWl0IFVzZXJJbnB1dC5pbnNpc3RGb3JUZXh0KFxuICAgICAgICBcIm1lc3NhZ2VcIixcbiAgICAgICAgXCJXaGF0IHNob3VsZCBiZSB0aGUgcmVsZWFzZSBtZXNzYWdlL3RpY2tldD9cIixcbiAgICAgICAgKHZhbCkgPT4gISF2YWwgJiYgdmFsLnRvU3RyaW5nKCkubGVuZ3RoID4gNVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG1lc3NhZ2U7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJ1bnMgdGhlIHJlbGVhc2Ugc2NyaXB0LlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBvcmNoZXN0cmF0ZXMgdGhlIGVudGlyZSByZWxlYXNlIHByb2Nlc3MsIGluY2x1ZGluZyB2ZXJzaW9uIHByZXBhcmF0aW9uLCBtZXNzYWdlIGNyZWF0aW9uLFxuICAgKiBnaXQgb3BlcmF0aW9ucywgYW5kIG5wbSBwdWJsaXNoaW5nIChpZiBub3QgaW4gQ0kgZW52aXJvbm1lbnQpLlxuICAgKiBAcGFyYW0ge1BhcnNlQXJnc1Jlc3VsdH0gYXJncyAtIFRoZSBwYXJzZWQgY29tbWFuZC1saW5lIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgUiBhcyBSZWxlYXNlU2NyaXB0XG4gICAqICAgcGFydGljaXBhbnQgViBhcyBQcmVwYXJlVmVyc2lvblxuICAgKiAgIHBhcnRpY2lwYW50IE0gYXMgUHJlcGFyZU1lc3NhZ2VcbiAgICogICBwYXJ0aWNpcGFudCBOIGFzIE5QTVxuICAgKiAgIHBhcnRpY2lwYW50IEcgYXMgR2l0XG4gICAqICAgcGFydGljaXBhbnQgVSBhcyBVc2VySW5wdXRcbiAgICogICBSLT4+VjogcHJlcGFyZVZlcnNpb24odGFnKVxuICAgKiAgIFItPj5NOiBwcmVwYXJlTWVzc2FnZShtZXNzYWdlKVxuICAgKiAgIFItPj5OOiBSdW4gcHJlcGFyZS1yZWxlYXNlIHNjcmlwdFxuICAgKiAgIFItPj5HOiBDaGVjayBnaXQgc3RhdHVzXG4gICAqICAgYWx0IGNoYW5nZXMgZXhpc3RcbiAgICogICAgIFItPj5VOiBBc2sgZm9yIGNvbmZpcm1hdGlvblxuICAgKiAgICAgVS0tPj5SOiBDb25maXJtXG4gICAqICAgICBSLT4+RzogQWRkIGFuZCBjb21taXQgY2hhbmdlc1xuICAgKiAgIGVuZFxuICAgKiAgIFItPj5OOiBVcGRhdGUgbnBtIHZlcnNpb25cbiAgICogICBSLT4+RzogUHVzaCBjaGFuZ2VzIGFuZCB0YWdzXG4gICAqICAgYWx0IG5vdCBDSSBlbnZpcm9ubWVudFxuICAgKiAgICAgUi0+Pk46IFB1Ymxpc2ggdG8gbnBtXG4gICAqICAgZW5kXG4gICAqL1xuICBhc3luYyBydW4oXG4gICAgYXJnczogTG9nZ2luZ0NvbmZpZyAmXG4gICAgICB0eXBlb2YgRGVmYXVsdENvbW1hbmRWYWx1ZXMgJiB7IFtrIGluIGtleW9mIHR5cGVvZiBvcHRpb25zXTogdW5rbm93biB9XG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCByZXN1bHQ6IGFueTtcbiAgICBjb25zdCB7IGNpIH0gPSBhcmdzO1xuICAgIGxldCB7IHRhZywgbWVzc2FnZSB9ID0gYXJncztcbiAgICB0YWcgPSBhd2FpdCB0aGlzLnByZXBhcmVWZXJzaW9uKHRhZyBhcyBzdHJpbmcpO1xuICAgIG1lc3NhZ2UgPSBhd2FpdCB0aGlzLnByZXBhcmVNZXNzYWdlKG1lc3NhZ2UgYXMgc3RyaW5nKTtcbiAgICByZXN1bHQgPSBhd2FpdCBydW5Db21tYW5kKGBucG0gcnVuIHByZXBhcmUtcmVsZWFzZSAtLSAke3RhZ30gJHttZXNzYWdlfWAsIHtcbiAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICB9KS5wcm9taXNlO1xuICAgIHJlc3VsdCA9IGF3YWl0IHJ1bkNvbW1hbmQoXCJnaXQgc3RhdHVzIC0tcG9yY2VsYWluXCIpLnByb21pc2U7XG4gICAgYXdhaXQgcmVzdWx0O1xuICAgIGlmIChcbiAgICAgIHJlc3VsdC5sb2dzLmxlbmd0aCAmJlxuICAgICAgKGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgIFwiZ2l0LWNoYW5nZXNcIixcbiAgICAgICAgXCJEbyB5b3Ugd2FudCB0byBwdXNoIHRoZSBjaGFuZ2VzIHRvIHRoZSByZW1vdGUgcmVwb3NpdG9yeT9cIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKSlcbiAgICApIHtcbiAgICAgIGF3YWl0IHJ1bkNvbW1hbmQoXCJnaXQgYWRkIC5cIikucHJvbWlzZTtcbiAgICAgIGF3YWl0IHJ1bkNvbW1hbmQoXG4gICAgICAgIGBnaXQgY29tbWl0IC1tIFwiJHt0YWd9IC0gJHttZXNzYWdlfSAtIGFmdGVyIHJlbGVhc2UgcHJlcGFyYXRpb24ke2NpID8gXCJcIiA6IE5vQ0lGTGFnfVwiYFxuICAgICAgKS5wcm9taXNlO1xuICAgIH1cbiAgICBhd2FpdCBydW5Db21tYW5kKFxuICAgICAgYG5wbSB2ZXJzaW9uIFwiJHt0YWd9XCIgLW0gXCIke21lc3NhZ2V9JHtjaSA/IFwiXCIgOiBOb0NJRkxhZ31cImBcbiAgICApLnByb21pc2U7XG4gICAgYXdhaXQgcnVuQ29tbWFuZChcImdpdCBwdXNoIC0tZm9sbG93LXRhZ3NcIikucHJvbWlzZTtcbiAgICBpZiAoIWNpKSB7XG4gICAgICBhd2FpdCBydW5Db21tYW5kKFwiTlBNX1RPS0VOPSQoY2F0IC5ucG10b2tlbikgbnBtIHB1Ymxpc2ggLS1hY2Nlc3MgcHVibGljXCIpXG4gICAgICAgIC5wcm9taXNlO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiLi4vY29tbWFuZFwiO1xuaW1wb3J0IHsgQ29tbWFuZE9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGdldFBhY2thZ2UsXG4gIEh0dHBDbGllbnQsXG4gIHBhdGNoRmlsZSxcbiAgcGF0Y2hTdHJpbmcsXG4gIHJ1bkNvbW1hbmQsXG4gIHNldFBhY2thZ2VBdHRyaWJ1dGUsXG4gIFNldHVwU2NyaXB0S2V5LFxuICBUb2tlbnMsXG4gIHdyaXRlRmlsZSxcbn0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5pbXBvcnQgeyBMb2dnaW5nQ29uZmlnIH0gZnJvbSBcIi4uLy4uL291dHB1dFwiO1xuaW1wb3J0IHsgRGVmYXVsdENvbW1hbmRWYWx1ZXMgfSBmcm9tIFwiLi4vaW5kZXhcIjtcbmltcG9ydCB7IFVzZXJJbnB1dCB9IGZyb20gXCIuLi8uLi9pbnB1dFwiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuXG5jb25zdCBiYXNlVXJsID1cbiAgXCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZGVjYWYtdHMvdHMtd29ya3NwYWNlL21hc3RlclwiO1xuXG5jb25zdCBvcHRpb25zID0ge1xuICB0ZW1wbGF0ZXM6IFtcbiAgICBcIi5naXRodWIvSVNTVUVfVEVNUExBVEUvYnVnX3JlcG9ydC5tZFwiLFxuICAgIFwiLmdpdGh1Yi9JU1NVRV9URU1QTEFURS9mZWF0dXJlX3JlcXVlc3QubWRcIixcbiAgICBcIi5naXRodWIvRlVORElORy55bWxcIixcbiAgXSxcbiAgd29ya2Zsb3dzOiBbXG4gICAgXCIuZ2l0aHViL3dvcmtmbG93cy9jb2RlcWwtYW5hbHlzaXMueW1sXCIsXG4gICAgXCIuZ2l0aHViL3dvcmtmbG93cy9qZXN0LWNvdmVyYWdlLnlhbWxcIixcbiAgICBcIi5naXRodWIvd29ya2Zsb3dzL25vZGVqcy1idWlsZC1wcm9kLnlhbWxcIixcbiAgICBcIi5naXRodWIvd29ya2Zsb3dzL3BhZ2VzLnlhbWxcIixcbiAgICBcIi5naXRodWIvd29ya2Zsb3dzL3B1Ymxpc2gtb24tcmVsZWFzZS55YW1sXCIsXG4gICAgXCIuZ2l0aHViL3dvcmtmbG93cy9yZWxlYXNlLW9uLXRhZy55YW1sXCIsXG4gICAgXCIuZ2l0aHViL3dvcmtmbG93cy9zbnlrLWFuYWx5c2lzLnlhbWxcIixcbiAgXSxcbiAgaWRlOiBbXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy9BbGwgVGVzdHMucnVuLnhtbFwiLFxuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvYnVpbGQucnVuLnhtbFwiLFxuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvYnVpbGRfcHJvZC5ydW4ueG1sXCIsXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy9jb3ZlcmFnZS5ydW4ueG1sXCIsXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy9kb2NzLnJ1bi54bWxcIixcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL2RyYXdpbmdzLnJ1bi54bWxcIixcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL2ZsYXNoLWZvcndhcmQucnVuLnhtbFwiLFxuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvSW50ZWdyYXRpb25fVGVzdHMucnVuLnhtbFwiLFxuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvQnVuZGxpbmdfVGVzdHMucnVuLnhtbFwiLFxuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvbGludC1maXgucnVuLnhtbFwiLFxuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvcmVsZWFzZS5ydW4ueG1sXCIsXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy90ZXN0X2NpcmN1bGFyLnJ1bi54bWxcIixcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL3VtbC5ydW4ueG1sXCIsXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy9Vbml0IFRlc3RzLnJ1bi54bWxcIixcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL3VwZGF0ZS1zY3JpcHRzLnJ1bi54bWxcIixcbiAgXSxcbiAgZG9jczogW1xuICAgIFwid29ya2RvY3MvdHV0b3JpYWxzL0NvbnRyaWJ1dGluZy5tZFwiLFxuICAgIFwid29ya2RvY3MvdHV0b3JpYWxzL0RvY3VtZW50YXRpb24ubWRcIixcbiAgICBcIndvcmtkb2NzL3R1dG9yaWFscy9Gb3IgRGV2ZWxvcGVycy5tZFwiLFxuICAgIFwid29ya2RvY3MvMi1CYWRnZXMubWRcIixcbiAgICBcIndvcmtkb2NzL2pzZG9jcy5qc29uXCIsXG4gICAgXCJ3b3JrZG9jcy9yZWFkbWUtbWQuanNvblwiLFxuICBdLFxuICBzdHlsZXM6IFtcIi5wcmV0dGllcnJjXCIsIFwiZXNsaW50LmNvbmZpZy5qc1wiXSxcbiAgc2NyaXB0czogW1xuICAgIFwiYmluL3VwZGF0ZS1zY3JpcHRzLmNqc1wiLFxuICAgIFwiYmluL3RhZy1yZWxlYXNlLmNqc1wiLFxuICAgIFwiYmluL2J1aWxkLXNjcmlwdHMuY2pzXCIsXG4gIF0sXG4gIHRlc3RzOiBbXCJqZXN0LmNvbmZpZy50c1wiLCBcIndvcmtkb2NzL3JlcG9ydHMvamVzdC5jb3ZlcmFnZS5jb25maWcudHNcIl0sXG4gIHR5cGVzY3JpcHQ6IFtcInRzY29uZmlnLmpzb25cIl0sXG4gIGRvY2tlcjogW1wiRG9ja2VyZmlsZVwiXSxcbiAgYXV0b21hdGlvbjogW1xuICAgIFwid29ya2RvY3MvY29uZmx1ZW5jZS9Db250aW51b3VzIEludGVncmF0aW9uLURlcGxveW1lbnQvR2l0SHViLm1kXCIsXG4gICAgXCJ3b3JrZG9jcy9jb25mbHVlbmNlL0NvbnRpbnVvdXMgSW50ZWdyYXRpb24tRGVwbG95bWVudC9KaXJhLm1kXCIsXG4gICAgXCJ3b3JrZG9jcy9jb25mbHVlbmNlL0NvbnRpbnVvdXMgSW50ZWdyYXRpb24tRGVwbG95bWVudC9UZWFtcy5tZFwiLFxuICBdLFxufTtcblxuY29uc3QgYXJnenogPSB7XG4gIC8vIGluaXQgYXR0cmlidXRlc1xuICBib290OiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gIH0sXG4gIG9yZzoge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgc2hvcnQ6IFwib1wiLFxuICB9LFxuICBuYW1lOiB7XG4gICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICBzaG9ydDogXCJuXCIsXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkLFxuICB9LFxuICBhdXRob3I6IHtcbiAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgIHNob3J0OiBcImFcIixcbiAgICBkZWZhdWx0OiB1bmRlZmluZWQsXG4gIH0sXG4gIC8vIHVwZGF0ZSBhdHRyaWJ1dGVzXG4gIGFsbDoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICB9LFxuICBsaWNlbnNlOiB7XG4gICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICBtZXNzYWdlOiBcIlBpY2sgdGhlIGxpY2Vuc2VcIixcbiAgfSxcbiAgc2NyaXB0czoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICB9LFxuICBzdHlsZXM6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgfSxcbiAgZG9jczoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICB9LFxuICBpZGU6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgfSxcbiAgd29ya2Zsb3dzOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gIH0sXG4gIHRlbXBsYXRlczoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICB9LFxuICB0eXBlc2NyaXB0OiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gIH0sXG4gIGRvY2tlcjoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICB9LFxuICBwa2c6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgfSxcbiAgZGVwZW5kZW5jaWVzOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gIH0sXG4gIHRlc3RzOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gIH0sXG4gIGF1dG9tYXRpb246IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgfSxcbn07XG5cbi8qKlxuICogQGNsYXNzIFRlbXBsYXRlU3luY1xuICogQGV4dGVuZHMge0NvbW1hbmR9XG4gKiBAY2F0ZWdvcnkgc2NyaXB0c1xuICogQGRlc2NyaXB0aW9uIEEgY29tbWFuZC1saW5lIHRvb2wgZm9yIHN5bmNocm9uaXppbmcgcHJvamVjdCB0ZW1wbGF0ZXMgYW5kIGNvbmZpZ3VyYXRpb25zLlxuICogQHN1bW1hcnkgVGhpcyBjbGFzcyBwcm92aWRlcyBmdW5jdGlvbmFsaXR5IHRvIGRvd25sb2FkIGFuZCB1cGRhdGUgdmFyaW91cyBwcm9qZWN0IGZpbGVzIGFuZCBjb25maWd1cmF0aW9ucyBmcm9tIGEgcmVtb3RlIHJlcG9zaXRvcnkuXG4gKiBJdCBzdXBwb3J0cyB1cGRhdGluZyBsaWNlbnNlcywgSURFIGNvbmZpZ3VyYXRpb25zLCBzY3JpcHRzLCBzdHlsZXMsIGRvY3VtZW50YXRpb24sIHdvcmtmbG93cywgYW5kIHRlbXBsYXRlcy5cbiAqXG4gKiBAcGFyYW0ge0NvbW1hbmRPcHRpb25zfSBhcmdzIC0gVGhlIGNvbW1hbmQgb3B0aW9ucyBmb3IgVGVtcGxhdGVTeW5jXG4gKi9cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZVN5bmMgZXh0ZW5kcyBDb21tYW5kPENvbW1hbmRPcHRpb25zPHR5cGVvZiBhcmd6ej4sIHZvaWQ+IHtcbiAgcHJpdmF0ZSByZXBsYWNlbWVudHM6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4gPSB7fTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlRlbXBsYXRlU3luY1wiLCBhcmd6eik7XG4gIH1cblxuICBwcml2YXRlIGxvYWRWYWx1ZXNGcm9tUGFja2FnZSgpIHtcbiAgICBjb25zdCBwID0gcHJvY2Vzcy5jd2QoKTtcbiAgICBjb25zdCBhdXRob3IgPSBnZXRQYWNrYWdlKHAsIFwiYXV0aG9yXCIpIGFzIHN0cmluZztcbiAgICBjb25zdCBzY29wZWROYW1lID0gZ2V0UGFja2FnZShwLCBcIm5hbWVcIik7XG4gICAgbGV0IG5hbWU6IHN0cmluZyA9IHNjb3BlZE5hbWUgYXMgc3RyaW5nO1xuICAgIGxldCBvcmc6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBpZiAobmFtZS5zdGFydHNXaXRoKFwiQFwiKSkge1xuICAgICAgY29uc3Qgc3BsaXQgPSBuYW1lLnNwbGl0KFwiL1wiKTtcbiAgICAgIG5hbWUgPSBzcGxpdFsxXTtcbiAgICAgIG9yZyA9IHNwbGl0WzBdLnJlcGxhY2UoXCJAXCIsIFwiXCIpO1xuICAgIH1cbiAgICBbXCJUaWFnbyBWZW5jZXNsYXVcIiwgXCJUaWFnb1ZlbmNlc2xhdVwiLCBcIiR7YXV0aG9yfVwiXS5mb3JFYWNoKFxuICAgICAgKGVsKSA9PiAodGhpcy5yZXBsYWNlbWVudHNbZWxdID0gYXV0aG9yKVxuICAgICk7XG4gICAgW1wiVFMtV29ya3NwYWNlXCIsIFwidHMtd29ya3NwYWNlXCIsIFwiJHtuYW1lfVwiXS5mb3JFYWNoKFxuICAgICAgKGVsKSA9PiAodGhpcy5yZXBsYWNlbWVudHNbZWxdID0gbmFtZSlcbiAgICApO1xuICAgIFtcImRlY2FmLXRzXCIsIFwiJHtvcmd9XCJdLmZvckVhY2goXG4gICAgICAoZWwpID0+ICh0aGlzLnJlcGxhY2VtZW50c1tlbF0gPSAob3JnIGFzIHN0cmluZykgfHwgJ1wiXCInKVxuICAgICk7XG4gICAgdGhpcy5yZXBsYWNlbWVudHNbXCIke29yZ19vcl9vd25lcn1cIl0gPSBvcmcgfHwgbmFtZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRG93bmxvYWRzIGZpbGVzIGZvciBhIHNwZWNpZmljIG9wdGlvbiBjYXRlZ29yeS5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgZG93bmxvYWRzIGFsbCBmaWxlcyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBvcHRpb24ga2V5IGZyb20gdGhlIHJlbW90ZSByZXBvc2l0b3J5LlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSByZXByZXNlbnRpbmcgdGhlIG9wdGlvbiBjYXRlZ29yeSB0byBkb3dubG9hZFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBzcGVjaWZpZWQgb3B0aW9uIGtleSBpcyBub3QgZm91bmRcbiAgICovXG4gIGFzeW5jIGRvd25sb2FkT3B0aW9uKGtleToga2V5b2YgdHlwZW9mIG9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIShrZXkgaW4gb3B0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgT3B0aW9uIFwiJHtrZXl9XCIgbm90IGZvdW5kIGluIG9wdGlvbnNgKTtcbiAgICB9XG4gICAgY29uc3QgZmlsZXMgPSBvcHRpb25zW2tleSBhcyBrZXlvZiB0eXBlb2Ygb3B0aW9uc107XG5cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIHRoaXMubG9nLmluZm8oYERvd25sb2FkaW5nICR7ZmlsZX1gKTtcblxuICAgICAgbGV0IGRhdGEgPSBhd2FpdCBIdHRwQ2xpZW50LmRvd25sb2FkRmlsZShgJHtiYXNlVXJsfS8ke2ZpbGV9YCk7XG4gICAgICBkYXRhID0gcGF0Y2hTdHJpbmcoZGF0YSwgdGhpcy5yZXBsYWNlbWVudHMpO1xuICAgICAgd3JpdGVGaWxlKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBmaWxlKSwgZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEb3dubG9hZHMgYW5kIHNldHMgdXAgdGhlIHNwZWNpZmllZCBsaWNlbnNlLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBkb3dubG9hZHMgdGhlIGNob3NlbiBsaWNlbnNlIGZpbGUsIHNhdmVzIGl0IHRvIHRoZSBwcm9qZWN0LCBhbmQgdXBkYXRlcyB0aGUgcGFja2FnZS5qc29uIGxpY2Vuc2UgZmllbGQuXG4gICAqIEBwYXJhbSB7XCJNSVRcIiB8IFwiR1BMXCIgfCBcIkFwYWNoZVwiIHwgXCJMR1BMXCIgfCBcIkFHUExcIn0gbGljZW5zZSAtIFRoZSBsaWNlbnNlIHRvIGRvd25sb2FkIGFuZCBzZXQgdXBcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBnZXRMaWNlbnNlKGxpY2Vuc2U6IFwiTUlUXCIgfCBcIkdQTFwiIHwgXCJBcGFjaGVcIiB8IFwiTEdQTFwiIHwgXCJBR1BMXCIpIHtcbiAgICB0aGlzLmxvZy5pbmZvKGBEb3dubG9hZGluZyAke2xpY2Vuc2V9IGxpY2Vuc2VgKTtcbiAgICBjb25zdCB1cmwgPSBgJHtiYXNlVXJsfS93b3JrZG9jcy9saWNlbnNlcy8ke2xpY2Vuc2V9Lm1kYDtcbiAgICBsZXQgZGF0YSA9IGF3YWl0IEh0dHBDbGllbnQuZG93bmxvYWRGaWxlKHVybCk7XG4gICAgZGF0YSA9IHBhdGNoU3RyaW5nKGRhdGEsIHRoaXMucmVwbGFjZW1lbnRzKTtcbiAgICB3cml0ZUZpbGUocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwiTElDRU5TRS5tZFwiKSwgZGF0YSk7XG4gICAgc2V0UGFja2FnZUF0dHJpYnV0ZShcImxpY2Vuc2VcIiwgbGljZW5zZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERvd25sb2FkcyBJREUgY29uZmlndXJhdGlvbiBmaWxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBnZXRJZGUoKSB7XG4gICAgZnMubWtkaXJTeW5jKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcIi5pZGVhXCIsIFwicnVuQ29uZmlndXJhdGlvbnNcIiksIHtcbiAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICB9KTtcbiAgICBhd2FpdCB0aGlzLmRvd25sb2FkT3B0aW9uKFwiaWRlXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBVcGRhdGUgbnBtIHNjcmlwdHNcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhc3luYyBnZXRTY3JpcHRzKCkge1xuICAgIGF3YWl0IHRoaXMuZG93bmxvYWRPcHRpb24oXCJzY3JpcHRzXCIpO1xuICAgIHRoaXMubG9nLmluZm8oXCJwbGVhc2UgcmUtcnVuIHRoZSBjb21tYW5kXCIpO1xuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRG93bmxvYWRzIHN0eWxlIGNvbmZpZ3VyYXRpb24gZmlsZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgZ2V0U3R5bGVzID0gKCkgPT4gdGhpcy5kb3dubG9hZE9wdGlvbihcInN0eWxlc1wiKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERvd25sb2FkcyB0ZW1wbGF0ZSBmaWxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBnZXRUZW1wbGF0ZXMgPSAoKSA9PiB0aGlzLmRvd25sb2FkT3B0aW9uKFwidGVtcGxhdGVzXCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRG93bmxvYWRzIHdvcmtmbG93IGNvbmZpZ3VyYXRpb24gZmlsZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgZ2V0V29ya2Zsb3dzID0gKCkgPT4gdGhpcy5kb3dubG9hZE9wdGlvbihcIndvcmtmbG93c1wiKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERvd25sb2FkcyBkb2N1bWVudGF0aW9uIGZpbGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGdldERvY3MgPSAoKSA9PiB0aGlzLmRvd25sb2FkT3B0aW9uKFwiZG9jc1wiKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERvd25sb2FkcyB0eXBlc2NyaXB0IGNvbmZpZyBmaWxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBnZXRUeXBlc2NyaXB0ID0gKCkgPT4gdGhpcy5kb3dubG9hZE9wdGlvbihcInR5cGVzY3JpcHRcIik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEb3dubG9hZHMgYXV0b21hdGlvbiBkb2N1bWVudGF0aW9uIGZpbGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGdldEF1dG9tYXRpb24gPSAoKSA9PiB0aGlzLmRvd25sb2FkT3B0aW9uKFwiYXV0b21hdGlvblwiKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERvd25sb2FkcyBhdXRvbWF0aW9uIGRvY3VtZW50YXRpb24gZmlsZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgZ2V0VGVzdHMgPSAoKSA9PiB0aGlzLmRvd25sb2FkT3B0aW9uKFwidGVzdHNcIik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEb3dubG9hZHMgZG9ja2VyIGltYWdlIGZpbGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGdldERvY2tlciA9ICgpID0+IHRoaXMuZG93bmxvYWRPcHRpb24oXCJkb2NrZXJcIik7XG5cbiAgYXN5bmMgaW5pdFBhY2thZ2UocGtnTmFtZTogc3RyaW5nLCBhdXRob3I6IHN0cmluZywgbGljZW5zZTogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBrZyA9IGdldFBhY2thZ2UoKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIGRlbGV0ZSBwa2dbU2V0dXBTY3JpcHRLZXldO1xuICAgICAgcGtnLm5hbWUgPSBwa2dOYW1lO1xuICAgICAgcGtnLnZlcnNpb24gPSBcIjAuMC4xXCI7XG4gICAgICBwa2cuYXV0aG9yID0gYXV0aG9yO1xuICAgICAgcGtnLmxpY2Vuc2UgPSBsaWNlbnNlO1xuICAgICAgZnMud3JpdGVGaWxlU3luYyhcInBhY2thZ2UuanNvblwiLCBKU09OLnN0cmluZ2lmeShwa2csIG51bGwsIDIpKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGZpeGluZyBwYWNrYWdlLmpzb246ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB1cGRhdGVQYWNrYWdlU2NyaXBzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvcmlnaW5hbFBrZyA9IEpTT04ucGFyc2UoXG4gICAgICAgIGF3YWl0IEh0dHBDbGllbnQuZG93bmxvYWRGaWxlKGAke2Jhc2VVcmx9L3BhY2thZ2UuanNvbmApXG4gICAgICApO1xuICAgICAgY29uc3QgeyBzY3JpcHRzIH0gPSBvcmlnaW5hbFBrZztcblxuICAgICAgY29uc3QgcGtnOiB0eXBlb2Ygb3JpZ2luYWxQa2cgPSBnZXRQYWNrYWdlKCkgYXMge1xuICAgICAgICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgfTtcbiAgICAgIE9iamVjdC5rZXlzKHBrZy5zY3JpcHRzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgaWYgKGtleSBpbiBzY3JpcHRzKSB7XG4gICAgICAgICAgY29uc3QgcmVwbGFjZWQgPSBwYXRjaFN0cmluZyhzY3JpcHRzW2tleV0sIHRoaXMucmVwbGFjZW1lbnRzKTtcbiAgICAgICAgICBpZiAocmVwbGFjZWQgIT09IHNjcmlwdHNba2V5XSkge1xuICAgICAgICAgICAgcGtnLnNjcmlwdHNba2V5XSA9IHJlcGxhY2VkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHBrZ1tcImV4cG9ydHNcIl1bXCJyZXF1aXJlXCJdID0gb3JpZ2luYWxQa2dbXCJleHBvcnRzXCJdW1wicmVxdWlyZVwiXTtcbiAgICAgIHBrZ1tcImV4cG9ydHNcIl1bXCJpbXBvcnRcIl0gPSBvcmlnaW5hbFBrZ1tcImV4cG9ydHNcIl1bXCJpbXBvcnRcIl07XG4gICAgICBwa2dbXCJ0eXBlc1wiXSA9IG9yaWdpbmFsUGtnW1widHlwZXNcIl07XG5cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoXCJwYWNrYWdlLmpzb25cIiwgSlNPTi5zdHJpbmdpZnkocGtnLCBudWxsLCAyKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBmaXhpbmcgcGFja2FnZS5qc29uIHNjcmlwdHM6ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVUb2tlbkZpbGVzKCkge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLmNyZWF0ZVRva2VuRmlsZXMpO1xuICAgIGNvbnN0IGdpdFRva2VuID0gYXdhaXQgVXNlcklucHV0Lmluc2lzdEZvclRleHQoXG4gICAgICBcInRva2VuXCIsXG4gICAgICBcInBsZWFzZSBpbnB1dCB5b3VyIGdpdGh1YiB0b2tlblwiLFxuICAgICAgKHJlczogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiAhIXJlcy5tYXRjaCgvXmdocF9bMC05YS16QS1aXXszNn0kL2cpO1xuICAgICAgfVxuICAgICk7XG4gICAgT2JqZWN0LnZhbHVlcyhUb2tlbnMpLmZvckVhY2goKHRva2VuKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBsZXQgc3RhdHVzO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHN0YXR1cyA9IGZzLmV4aXN0c1N5bmModG9rZW4pO1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICAgIGxvZy5pbmZvKGBUb2tlbiBmaWxlICR7dG9rZW59IG5vdCBmb3VuZC4gQ3JlYXRpbmcgYSBuZXcgb25lLi4uYCk7XG4gICAgICAgICAgZnMud3JpdGVGaWxlU3luYyh0b2tlbiwgdG9rZW4gPT09IFwiLnRva2VuXCIgPyBnaXRUb2tlbiA6IFwiXCIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXN0YXR1cykge1xuICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmModG9rZW4sIHRva2VuID09PSBcIi50b2tlblwiID8gZ2l0VG9rZW4gOiBcIlwiKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGNyZWF0aW5nIHRva2VuIGZpbGUgJHt0b2tlbn06ICR7ZX1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGdldE9yZygpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IG9yZyA9IGF3YWl0IFVzZXJJbnB1dC5hc2tUZXh0KFxuICAgICAgXCJPcmdhbml6YXRpb25cIixcbiAgICAgIFwiRW50ZXIgdGhlIG9yZ2FuaXphdGlvbiBuYW1lICh3aWxsIGJlIHVzZWQgdG8gc2NvcGUgeW91ciBucG0gcHJvamVjdC4gbGVhdmUgYmxhbmsgdG8gY3JlYXRlIGEgdW5zY29wZWQgcHJvamVjdCk6XCJcbiAgICApO1xuICAgIGNvbnN0IGNvbmZpcm1hdGlvbiA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICBcIkNvbmZpcm0gb3JnYW5pemF0aW9uXCIsXG4gICAgICBcIklzIHRoaXMgb3JnYW5pemF0aW9uIGNvcnJlY3Q/XCIsXG4gICAgICB0cnVlXG4gICAgKTtcbiAgICBpZiAoIWNvbmZpcm1hdGlvbikgcmV0dXJuIHRoaXMuZ2V0T3JnKCk7XG5cbiAgICByZXR1cm4gb3JnO1xuICB9XG5cbiAgYXN5bmMgYXVkaXRGaXgoKSB7XG4gICAgcmV0dXJuIGF3YWl0IHJ1bkNvbW1hbmQoXCJucG0gYXVkaXQgZml4IC0tZm9yY2VcIikucHJvbWlzZTtcbiAgfVxuXG4gIHBhdGNoRmlsZXMoKSB7XG4gICAgY29uc3QgZmlsZXMgPSBbXG4gICAgICAuLi5mc1xuICAgICAgICAucmVhZGRpclN5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwic3JjXCIpLCB7XG4gICAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWUsXG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5pc0ZpbGUoKSlcbiAgICAgICAgLm1hcCgoZW50cnkpID0+IHBhdGguam9pbihlbnRyeS5wYXJlbnRQYXRoLCBlbnRyeS5uYW1lKSksXG4gICAgICAuLi5mc1xuICAgICAgICAucmVhZGRpclN5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwid29ya2RvY3NcIiksIHtcbiAgICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZSxcbiAgICAgICAgfSlcbiAgICAgICAgLmZpbHRlcigoZW50cnkpID0+IGVudHJ5LmlzRmlsZSgpICYmIGVudHJ5Lm5hbWUuZW5kc1dpdGgoXCIubWRcIikpXG4gICAgICAgIC5tYXAoKGVudHJ5KSA9PiBwYXRoLmpvaW4oZW50cnkucGFyZW50UGF0aCwgZW50cnkubmFtZSkpLFxuICAgICAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwiLmdpdGxhYi1jaS55bWxcIiksXG4gICAgICBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCJ3b3JrZG9jc1wiLCBcImpzZG9jcy5qc29uXCIpLFxuICAgIF07XG5cbiAgICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIHBhdGNoRmlsZShmaWxlIGFzIHN0cmluZywgdGhpcy5yZXBsYWNlbWVudHMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZURlcGVuZGVuY2llcygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxQa2cgPSBKU09OLnBhcnNlKFxuICAgICAgICBhd2FpdCBIdHRwQ2xpZW50LmRvd25sb2FkRmlsZShgJHtiYXNlVXJsfS9wYWNrYWdlLmpzb25gKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgZGV2RGVwZW5kZW5jaWVzIH0gPSBvcmlnaW5hbFBrZztcblxuICAgICAgY29uc3QgcGtnOiB0eXBlb2Ygb3JpZ2luYWxQa2cgPSBnZXRQYWNrYWdlKCkgYXMge1xuICAgICAgICBzY3JpcHRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgICAgfTtcbiAgICAgIE9iamVjdC5rZXlzKHBrZy5zY3JpcHRzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgaWYgKGtleSBpbiBkZXZEZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICBjb25zdCByZXBsYWNlZCA9IGRldkRlcGVuZGVuY2llc1trZXldO1xuICAgICAgICAgIGlmIChyZXBsYWNlZCAhPT0gZGV2RGVwZW5kZW5jaWVzW2tleV0pIHtcbiAgICAgICAgICAgIChwa2cgYXMgYW55KVtcImRldkRlcGVuZGVuY2llc1wiXSA9XG4gICAgICAgICAgICAgIChwa2cgYXMgYW55KVtcImRldkRlcGVuZGVuY2llc1wiXSB8fCB7fTtcbiAgICAgICAgICAgIChwa2cgYXMgYW55KVtcImRldkRlcGVuZGVuY2llc1wiXVtrZXldID0gcmVwbGFjZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgZnMud3JpdGVGaWxlU3luYyhcInBhY2thZ2UuanNvblwiLCBKU09OLnN0cmluZ2lmeShwa2csIG51bGwsIDIpKTtcbiAgICAgIGF3YWl0IHJ1bkNvbW1hbmQoXCJucG0gaW5zdGFsbFwiKS5wcm9taXNlO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZml4aW5nIHBhY2thZ2UuanNvbiBkZXBlbmRlbmNpZXM6ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJ1bnMgdGhlIHRlbXBsYXRlIHN5bmNocm9uaXphdGlvbiBwcm9jZXNzLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBvcmNoZXN0cmF0ZXMgdGhlIGRvd25sb2FkaW5nIG9mIHZhcmlvdXMgcHJvamVjdCBjb21wb25lbnRzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7UGFyc2VBcmdzUmVzdWx0fSBhcmdzIC0gVGhlIHBhcnNlZCBjb21tYW5kLWxpbmUgYXJndW1lbnRzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBUIGFzIFRlbXBsYXRlU3luY1xuICAgKiAgIHBhcnRpY2lwYW50IEwgYXMgZ2V0TGljZW5zZVxuICAgKiAgIHBhcnRpY2lwYW50IEkgYXMgZ2V0SWRlXG4gICAqICAgcGFydGljaXBhbnQgUyBhcyBnZXRTY3JpcHRzXG4gICAqICAgcGFydGljaXBhbnQgU3QgYXMgZ2V0U3R5bGVzXG4gICAqICAgcGFydGljaXBhbnQgRCBhcyBnZXREb2NzXG4gICAqICAgcGFydGljaXBhbnQgVyBhcyBnZXRXb3JrZmxvd3NcbiAgICogICBwYXJ0aWNpcGFudCBUZSBhcyBnZXRUZW1wbGF0ZXNcbiAgICogICBULT4+VDogUGFyc2UgYXJndW1lbnRzXG4gICAqICAgYWx0IGFsbCBmbGFnIGlzIHRydWVcbiAgICogICAgIFQtPj5UOiBTZXQgYWxsIGNvbXBvbmVudCBmbGFncyB0byB0cnVlXG4gICAqICAgZW5kXG4gICAqICAgYWx0IGxpY2Vuc2UgaXMgc3BlY2lmaWVkXG4gICAqICAgICBULT4+TDogZ2V0TGljZW5zZShsaWNlbnNlKVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCBpZGUgZmxhZyBpcyB0cnVlXG4gICAqICAgICBULT4+STogZ2V0SWRlKClcbiAgICogICBlbmRcbiAgICogICBhbHQgc2NyaXB0cyBmbGFnIGlzIHRydWVcbiAgICogICAgIFQtPj5TOiBnZXRTY3JpcHRzKClcbiAgICogICBlbmRcbiAgICogICBhbHQgc3R5bGVzIGZsYWcgaXMgdHJ1ZVxuICAgKiAgICAgVC0+PlN0OiBnZXRTdHlsZXMoKVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCBkb2NzIGZsYWcgaXMgdHJ1ZVxuICAgKiAgICAgVC0+PkQ6IGdldERvY3MoKVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCB3b3JrZmxvd3MgZmxhZyBpcyB0cnVlXG4gICAqICAgICBULT4+VzogZ2V0V29ya2Zsb3dzKClcbiAgICogICBlbmRcbiAgICogICBhbHQgdGVtcGxhdGVzIGZsYWcgaXMgdHJ1ZVxuICAgKiAgICAgVC0+PlRlOiBnZXRUZW1wbGF0ZXMoKVxuICAgKiAgIGVuZFxuICAgKi9cbiAgYXN5bmMgcnVuKFxuICAgIGFyZ3M6IExvZ2dpbmdDb25maWcgJlxuICAgICAgdHlwZW9mIERlZmF1bHRDb21tYW5kVmFsdWVzICYgeyBbayBpbiBrZXlvZiB0eXBlb2YgYXJnenpdOiB1bmtub3duIH1cbiAgKSB7XG4gICAgbGV0IHsgbGljZW5zZSB9ID0gYXJncztcbiAgICBjb25zdCB7IGJvb3QgfSA9IGFyZ3M7XG4gICAgbGV0IHtcbiAgICAgIGFsbCxcbiAgICAgIHNjcmlwdHMsXG4gICAgICBzdHlsZXMsXG4gICAgICBkb2NzLFxuICAgICAgaWRlLFxuICAgICAgd29ya2Zsb3dzLFxuICAgICAgdGVtcGxhdGVzLFxuICAgICAgZG9ja2VyLFxuICAgICAgdHlwZXNjcmlwdCxcbiAgICAgIGRlcGVuZGVuY2llcyxcbiAgICAgIHRlc3RzLFxuICAgICAgYXV0b21hdGlvbixcbiAgICAgIHBrZyxcbiAgICB9ID0gYXJncztcbiAgICBpZiAoXG4gICAgICBzY3JpcHRzIHx8XG4gICAgICBzdHlsZXMgfHxcbiAgICAgIGRvY3MgfHxcbiAgICAgIGlkZSB8fFxuICAgICAgd29ya2Zsb3dzIHx8XG4gICAgICB0ZW1wbGF0ZXMgfHxcbiAgICAgIGRvY2tlciB8fFxuICAgICAgdHlwZXNjcmlwdCB8fFxuICAgICAgYXV0b21hdGlvbiB8fFxuICAgICAgZGVwZW5kZW5jaWVzIHx8XG4gICAgICB0ZXN0cyB8fFxuICAgICAgcGtnXG4gICAgKVxuICAgICAgYWxsID0gZmFsc2U7XG5cbiAgICBpZiAoYm9vdCkge1xuICAgICAgY29uc3Qgb3JnID0gYXdhaXQgdGhpcy5nZXRPcmcoKTtcbiAgICAgIGNvbnN0IG5hbWUgPSBhd2FpdCBVc2VySW5wdXQuaW5zaXN0Rm9yVGV4dChcbiAgICAgICAgXCJQcm9qZWN0IG5hbWVcIixcbiAgICAgICAgXCJFbnRlciB0aGUgcHJvamVjdCBuYW1lOlwiLFxuICAgICAgICAocmVzOiBzdHJpbmcpID0+IHJlcy5sZW5ndGggPiAxXG4gICAgICApO1xuICAgICAgY29uc3QgYXV0aG9yID0gYXdhaXQgVXNlcklucHV0Lmluc2lzdEZvclRleHQoXG4gICAgICAgIFwiQXV0aG9yXCIsXG4gICAgICAgIFwiRW50ZXIgdGhlIGF1dGhvciBuYW1lOlwiLFxuICAgICAgICAocmVzOiBzdHJpbmcpID0+IHJlcy5sZW5ndGggPiAxXG4gICAgICApO1xuICAgICAgY29uc3QgcGtnTmFtZSA9IG9yZyA/IGBAJHtvcmd9LyR7bmFtZX1gIDogbmFtZTtcblxuICAgICAgYXdhaXQgdGhpcy5pbml0UGFja2FnZShwa2dOYW1lLCBhdXRob3IsIGxpY2Vuc2UgYXMgc3RyaW5nKTtcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlVG9rZW5GaWxlcygpO1xuICAgICAgYXdhaXQgdGhpcy5hdWRpdEZpeCgpO1xuICAgICAgdGhpcy5wYXRjaEZpbGVzKCk7XG4gICAgfVxuXG4gICAgaWYgKGFsbCkge1xuICAgICAgc2NyaXB0cyA9IGZhbHNlO1xuICAgICAgc3R5bGVzID0gdHJ1ZTtcbiAgICAgIGRvY3MgPSB0cnVlO1xuICAgICAgaWRlID0gdHJ1ZTtcbiAgICAgIHdvcmtmbG93cyA9IHRydWU7XG4gICAgICB0ZW1wbGF0ZXMgPSB0cnVlO1xuICAgICAgZG9ja2VyID0gdHJ1ZTtcbiAgICAgIHR5cGVzY3JpcHQgPSB0cnVlO1xuICAgICAgcGtnID0gdHJ1ZTtcbiAgICAgIGRlcGVuZGVuY2llcyA9IHRydWU7XG4gICAgICB0ZXN0cyA9IHRydWU7XG4gICAgICBhdXRvbWF0aW9uID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBzY3JpcHRzID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgc2NyaXB0cyA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgIFwic2NyaXB0c1wiLFxuICAgICAgICBcIkRvIHlvdSB3YW50IHRvIGdldCBzY3JpcHRzP1wiLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuXG4gICAgaWYgKHNjcmlwdHMpIGF3YWl0IHRoaXMuZ2V0U2NyaXB0cygpO1xuXG4gICAgdGhpcy5sb2FkVmFsdWVzRnJvbVBhY2thZ2UoKTtcbiAgICBpZiAoIWFsbCAmJiB0eXBlb2YgbGljZW5zZSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgY29uc3QgY29uZmlybWF0aW9uID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgXCJsaWNlbnNlXCIsXG4gICAgICAgIFwiRG8geW91IHdhbnQgdG8gc2V0IGEgbGljZW5zZT9cIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICAgIGlmIChjb25maXJtYXRpb24pXG4gICAgICAgIGxpY2Vuc2UgPSBhd2FpdCBVc2VySW5wdXQuaW5zaXN0Rm9yVGV4dChcbiAgICAgICAgICBcImxpY2Vuc2VcIixcbiAgICAgICAgICBcIkVudGVyIHRoZSBkZXNpcmVkIExpY2Vuc2UgKE1JVHxHUEx8QXBhY2hlfExHUEx8QUdQTCk6XCIsXG4gICAgICAgICAgKHZhbCkgPT4gISF2YWwgJiYgISF2YWwubWF0Y2goL14oTUlUfEdQTHxBcGFjaGV8TEdQTHxBR1BMKSQvZylcbiAgICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBsaWNlbnNlICE9PSBcInVuZGVmaW5lZFwiKVxuICAgICAgYXdhaXQgdGhpcy5nZXRMaWNlbnNlKFxuICAgICAgICBsaWNlbnNlIGFzIFwiTUlUXCIgfCBcIkdQTFwiIHwgXCJBcGFjaGVcIiB8IFwiTEdQTFwiIHwgXCJBR1BMXCJcbiAgICAgICk7XG5cbiAgICBpZiAodHlwZW9mIGlkZSA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIGlkZSA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgIFwiaWRlXCIsXG4gICAgICAgIFwiRG8geW91IHdhbnQgdG8gZ2V0IGlkZSBjb25maWdzP1wiLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuXG4gICAgaWYgKGlkZSkgYXdhaXQgdGhpcy5nZXRJZGUoKTtcblxuICAgIGlmICh0eXBlb2YgdHlwZXNjcmlwdCA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIHR5cGVzY3JpcHQgPSBhd2FpdCBVc2VySW5wdXQuYXNrQ29uZmlybWF0aW9uKFxuICAgICAgICBcInR5cGVzY3JpcHRcIixcbiAgICAgICAgXCJEbyB5b3Ugd2FudCB0byBnZXQgdHlwZXNjcmlwdCBjb25maWdzP1wiLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIGlmICh0eXBlc2NyaXB0KSBhd2FpdCB0aGlzLmdldFR5cGVzY3JpcHQoKTtcblxuICAgIGlmICh0eXBlb2YgZG9ja2VyID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgZG9ja2VyID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgXCJkb2NrZXJcIixcbiAgICAgICAgXCJEbyB5b3Ugd2FudCB0byBnZXQgZG9ja2VyIGNvbmZpZ3M/XCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG5cbiAgICBpZiAoZG9ja2VyKSBhd2FpdCB0aGlzLmdldERvY2tlcigpO1xuICAgIGlmICh0eXBlb2YgYXV0b21hdGlvbiA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIGF1dG9tYXRpb24gPSBhd2FpdCBVc2VySW5wdXQuYXNrQ29uZmlybWF0aW9uKFxuICAgICAgICBcImF1dG9tYXRpb25cIixcbiAgICAgICAgXCJEbyB5b3Ugd2FudCB0byBnZXQgYXV0b21hdGlvbiBjb25maWdzP1wiLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIGlmIChhdXRvbWF0aW9uKSBhd2FpdCB0aGlzLmdldEF1dG9tYXRpb24oKTtcblxuICAgIGlmICh0eXBlb2Ygc3R5bGVzID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgc3R5bGVzID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgXCJzdHlsZXNcIixcbiAgICAgICAgXCJEbyB5b3Ugd2FudCB0byBnZXQgc3R5bGVzP1wiLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIGlmIChzdHlsZXMpIGF3YWl0IHRoaXMuZ2V0U3R5bGVzKCk7XG5cbiAgICBpZiAodHlwZW9mIGRvY3MgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICBkb2NzID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgXCJkb2NzXCIsXG4gICAgICAgIFwiRG8geW91IHdhbnQgdG8gZ2V0IGRvY3M/XCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgaWYgKGRvY3MpIGF3YWl0IHRoaXMuZ2V0RG9jcygpO1xuICAgIGlmICh0eXBlb2Ygd29ya2Zsb3dzID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgd29ya2Zsb3dzID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgXCJ3b3JrZmxvd3NcIixcbiAgICAgICAgXCJEbyB5b3Ugd2FudCB0byBnZXQgd29ya2Zsb3dzP1wiLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIGlmICh3b3JrZmxvd3MpIGF3YWl0IHRoaXMuZ2V0V29ya2Zsb3dzKCk7XG4gICAgaWYgKHR5cGVvZiB0ZW1wbGF0ZXMgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICB0ZW1wbGF0ZXMgPSBhd2FpdCBVc2VySW5wdXQuYXNrQ29uZmlybWF0aW9uKFxuICAgICAgICBcInRlbXBsYXRlc1wiLFxuICAgICAgICBcIkRvIHlvdSB3YW50IHRvIGdldCB0ZW1wbGF0ZXM/XCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgaWYgKHRlbXBsYXRlcykgYXdhaXQgdGhpcy5nZXRUZW1wbGF0ZXMoKTtcbiAgICBpZiAodHlwZW9mIHBrZyA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIHBrZyA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgIFwicGtnXCIsXG4gICAgICAgIFwiRG8geW91IHdhbnQgdG8gdXBkYXRlIHlvdXIgcGFja2FnZS5qc29uIHNjcmlwdHM/XCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgaWYgKHBrZykgYXdhaXQgdGhpcy51cGRhdGVQYWNrYWdlU2NyaXBzKCk7XG5cbiAgICBpZiAodHlwZW9mIHRlc3RzID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgdGVzdHMgPSBhd2FpdCBVc2VySW5wdXQuYXNrQ29uZmlybWF0aW9uKFxuICAgICAgICBcInBrZ1wiLFxuICAgICAgICBcIkRvIHlvdSB3YW50IHRvIHVwZGF0ZSB5b3VyIHRlc3QgY29uZmlncz9cIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICBpZiAodGVzdHMpIGF3YWl0IHRoaXMuZ2V0VGVzdHMoKTtcblxuICAgIGlmICh0eXBlb2YgZGVwZW5kZW5jaWVzID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgZGVwZW5kZW5jaWVzID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgXCJwa2dcIixcbiAgICAgICAgXCJEbyB5b3Ugd2FudCB0byB1cGRhdGUgZGV2IGRlcGVuZGVuY2llcz9cIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICBpZiAoZGVwZW5kZW5jaWVzKSBhd2FpdCB0aGlzLnVwZGF0ZURlcGVuZGVuY2llcygpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBTdGFuZGFyZE91dHB1dFdyaXRlciB9IGZyb20gXCIuL1N0YW5kYXJkT3V0cHV0V3JpdGVyXCI7XG5pbXBvcnQgeyBQcm9taXNlRXhlY3V0b3IgfSBmcm9tIFwiLi4vdXRpbHMvdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBzcGVjaWFsaXplZCBvdXRwdXQgd3JpdGVyIHRoYXQgdXNlcyByZWd1bGFyIGV4cHJlc3Npb25zIHRvIHByb2Nlc3Mgb3V0cHV0LlxuICogQHN1bW1hcnkgVGhpcyBjbGFzcyBleHRlbmRzIFN0YW5kYXJkT3V0cHV0V3JpdGVyIHRvIHByb3ZpZGUgcmVnZXgtYmFzZWQgb3V0cHV0IHByb2Nlc3NpbmcuXG4gKiBJdCBhbGxvd3MgZm9yIHBhdHRlcm4gbWF0Y2hpbmcgaW4gdGhlIG91dHB1dCBzdHJlYW0gYW5kIGNhbiB0cmlnZ2VyIHNwZWNpZmljIGFjdGlvbnNcbiAqIGJhc2VkIG9uIG1hdGNoZWQgcGF0dGVybnMuXG4gKlxuICogQHRlbXBsYXRlIFQgLSBUaGUgdHlwZSBvZiB0aGUgcmVzb2x2ZWQgdmFsdWUsIGRlZmF1bHRpbmcgdG8gc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBsb2NrIC0gQSBQcm9taXNlRXhlY3V0b3IgdG8gY29udHJvbCB0aGUgYXN5bmNocm9ub3VzIGZsb3cuXG4gKiBAcGFyYW0gcmVnZXhwIC0gQSBzdHJpbmcgb3IgUmVnRXhwIHRvIG1hdGNoIGFnYWluc3QgdGhlIG91dHB1dC5cbiAqIEBwYXJhbSBmbGFncyAtIE9wdGlvbmFsIGZsYWdzIGZvciB0aGUgUmVnRXhwIGNvbnN0cnVjdG9yLlxuICpcbiAqIEBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgUmVnZXhwT3V0cHV0V3JpdGVyIGV4dGVuZHMgU3RhbmRhcmRPdXRwdXRXcml0ZXI8c3RyaW5nPiB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIGZvciBtYXRjaGluZyBvdXRwdXQuXG4gICAqIEBzdW1tYXJ5IFRoaXMgcmVhZG9ubHkgcHJvcGVydHkgc3RvcmVzIHRoZSBjb21waWxlZCBSZWdFeHAgdXNlZCBmb3IgcGF0dGVybiBtYXRjaGluZy5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSByZWdleHA6IFJlZ0V4cDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIFJlZ2V4cE91dHB1dFdyaXRlci5cbiAgICogQHN1bW1hcnkgQ29uc3RydWN0cyB0aGUgUmVnZXhwT3V0cHV0V3JpdGVyIHdpdGggYSBsb2NrIG1lY2hhbmlzbSBhbmQgYSByZWd1bGFyIGV4cHJlc3Npb24uXG4gICAqXG4gICAqIEBwYXJhbSBjbWRcbiAgICogQHBhcmFtIGxvY2sgLSBBIFByb21pc2VFeGVjdXRvciB0byBjb250cm9sIHRoZSBhc3luY2hyb25vdXMgZmxvdy5cbiAgICogQHBhcmFtIHJlZ2V4cCAtIEEgc3RyaW5nIG9yIFJlZ0V4cCB0byBtYXRjaCBhZ2FpbnN0IHRoZSBvdXRwdXQuXG4gICAqIEBwYXJhbSBmbGFncyAtIE9wdGlvbmFsIGZsYWdzIGZvciB0aGUgUmVnRXhwIGNvbnN0cnVjdG9yLCBkZWZhdWx0cyB0byBcImdcIi5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGNtZDogc3RyaW5nLFxuICAgIGxvY2s6IFByb21pc2VFeGVjdXRvcjxzdHJpbmcsIEVycm9yPixcbiAgICByZWdleHA6IHN0cmluZyB8IFJlZ0V4cCxcbiAgICBmbGFncyA9IFwiZ1wiXG4gICkge1xuICAgIHN1cGVyKGNtZCwgbG9jayk7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMucmVnZXhwID1cbiAgICAgICAgdHlwZW9mIHJlZ2V4cCA9PT0gXCJzdHJpbmdcIiA/IG5ldyBSZWdFeHAocmVnZXhwLCBmbGFncykgOiByZWdleHA7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbjogJHtlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGVzdHMgdGhlIGlucHV0IGRhdGEgYWdhaW5zdCB0aGUgc3RvcmVkIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAgICogQHN1bW1hcnkgRXhlY3V0ZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBvbiB0aGUgaW5wdXQgZGF0YSBhbmQgcmV0dXJucyB0aGUgbWF0Y2ggcmVzdWx0LlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBzdHJpbmcgdG8gdGVzdCBhZ2FpbnN0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24uXG4gICAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgcmVndWxhciBleHByZXNzaW9uIGV4ZWN1dGlvbiwgb3IgdW5kZWZpbmVkIGlmIGFuIGVycm9yIG9jY3Vycy5cbiAgICovXG4gIHByaXZhdGUgdGVzdChkYXRhOiBzdHJpbmcpIHtcbiAgICB0aGlzLnJlZ2V4cC5sYXN0SW5kZXggPSAwO1xuICAgIGxldCBtYXRjaDtcbiAgICB0cnkge1xuICAgICAgbWF0Y2ggPSB0aGlzLnJlZ2V4cC5leGVjKGRhdGEpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHJldHVybiBjb25zb2xlLmRlYnVnKGBGYWlsZWQgdG8gcGFyc2UgY2h1bms6ICR7ZGF0YX1cXG5FcnJvcjogJHtlfSBgKTtcbiAgICB9XG4gICAgcmV0dXJuIG1hdGNoO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUZXN0cyB0aGUgZGF0YSBhbmQgcmVzb2x2ZXMgdGhlIHByb21pc2UgaWYgYSBtYXRjaCBpcyBmb3VuZC5cbiAgICogQHN1bW1hcnkgRXhlY3V0ZXMgdGhlIHRlc3QgbWV0aG9kIGFuZCByZXNvbHZlcyB0aGUgcHJvbWlzZSB3aXRoIHRoZSBmaXJzdCBtYXRjaCBncm91cCBpZiBzdWNjZXNzZnVsLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBzdHJpbmcgdG8gdGVzdCBhZ2FpbnN0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24uXG4gICAqL1xuICBwcm90ZWN0ZWQgdGVzdEFuZFJlc29sdmUoZGF0YTogc3RyaW5nKSB7XG4gICAgY29uc3QgbWF0Y2ggPSB0aGlzLnRlc3QoZGF0YSk7XG4gICAgaWYgKG1hdGNoKSB0aGlzLnJlc29sdmUobWF0Y2hbMF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUZXN0cyB0aGUgZGF0YSBhbmQgcmVqZWN0cyB0aGUgcHJvbWlzZSBpZiBhIG1hdGNoIGlzIGZvdW5kLlxuICAgKiBAc3VtbWFyeSBFeGVjdXRlcyB0aGUgdGVzdCBtZXRob2QgYW5kIHJlamVjdHMgdGhlIHByb21pc2Ugd2l0aCB0aGUgZmlyc3QgbWF0Y2ggZ3JvdXAgaWYgc3VjY2Vzc2Z1bC5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgc3RyaW5nIHRvIHRlc3QgYWdhaW5zdCB0aGUgcmVndWxhciBleHByZXNzaW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIHRlc3RBbmRSZWplY3QoZGF0YTogc3RyaW5nKSB7XG4gICAgY29uc3QgbWF0Y2ggPSB0aGlzLnRlc3QoZGF0YSk7XG4gICAgaWYgKG1hdGNoKSB0aGlzLnJlamVjdChtYXRjaFswXSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBpbmNvbWluZyBkYXRhIGNodW5rcy5cbiAgICogQHN1bW1hcnkgQ2FsbHMgdGhlIHBhcmVudCBjbGFzcyBkYXRhIG1ldGhvZCBhbmQgdGhlbiB0ZXN0cyB0aGUgZGF0YSBmb3IgYSBtYXRjaCB0byBwb3RlbnRpYWxseSByZXNvbHZlIHRoZSBwcm9taXNlLlxuICAgKlxuICAgKiBAcGFyYW0gY2h1bmsgLSBUaGUgZGF0YSBjaHVuayB0byBwcm9jZXNzLlxuICAgKi9cbiAgZGF0YShjaHVuazogYW55KSB7XG4gICAgc3VwZXIuZGF0YShjaHVuayk7XG4gICAgdGhpcy50ZXN0QW5kUmVzb2x2ZShTdHJpbmcoY2h1bmspKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvY2Vzc2VzIGluY29taW5nIGVycm9yIGNodW5rcy5cbiAgICogQHN1bW1hcnkgQ2FsbHMgdGhlIHBhcmVudCBjbGFzcyBlcnJvciBtZXRob2QgYW5kIHRoZW4gdGVzdHMgdGhlIGRhdGEgZm9yIGEgbWF0Y2ggdG8gcG90ZW50aWFsbHkgcmVqZWN0IHRoZSBwcm9taXNlLlxuICAgKlxuICAgKiBAcGFyYW0gY2h1bmsgLSBUaGUgZXJyb3IgY2h1bmsgdG8gcHJvY2Vzcy5cbiAgICovXG4gIGVycm9yKGNodW5rOiBhbnkpIHtcbiAgICBzdXBlci5lcnJvcihjaHVuayk7XG4gICAgdGhpcy50ZXN0QW5kUmVqZWN0KFN0cmluZyhjaHVuaykpO1xuICB9XG59XG4iLCJleHBvcnQgKiBmcm9tIFwiLi9jbGlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9vdXRwdXRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi93cml0ZXJzXCI7XG5cbi8qKlxuICogQG1vZHVsZSBAZGVjYWYtdHMvdXRpbHNcbiAqIEBkZXNjcmlwdGlvblxuICogVGhpcyBtb2R1bGUgc2VydmVzIGEgbGlnaHQgdmVyc2lvbiBvZiBEZWNhZiBDTEkgdG9vbCwgcHJvdmlkaW5nIGEgY29tcHJlaGVuc2l2ZSBzZXQgb2YgdXRpbGl0aWVzXG4gKiBhbmQgZnVuY3Rpb25hbGl0aWVzIGZvciBjb21tYW5kLWxpbmUgaW50ZXJmYWNlIG9wZXJhdGlvbnMuIEl0IGVuY29tcGFzc2VzIHNldmVyYWwga2V5IGNvbXBvbmVudHM6XG4gKlxuICogMS4gSW5wdXQgSGFuZGxpbmc6IE1hbmFnZXMgdXNlciBpbnB1dCBhbmQgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBwcm9jZXNzaW5nLlxuICogMi4gVXRpbGl0eSBGdW5jdGlvbnM6IE9mZmVycyBhIGNvbGxlY3Rpb24gb2YgaGVscGVyIGZ1bmN0aW9ucyBhbmQgY29uc3RhbnRzIGZvciB2YXJpb3VzIG9wZXJhdGlvbnMuXG4gKiAzLiBUeXBlIERlZmluaXRpb25zOiBEZWZpbmVzIGN1c3RvbSB0eXBlcyBhbmQgaW50ZXJmYWNlcyB1c2VkIHRocm91Z2hvdXQgdGhlIG1vZHVsZS5cbiAqIDQuIE91dHB1dCBNYW5hZ2VtZW50OiBQcm92aWRlcyBkaWZmZXJlbnQgb3V0cHV0IHdyaXRpbmcgc3RyYXRlZ2llcyBmb3IgZmxleGlibGUgY29uc29sZSBvdXRwdXQgaGFuZGxpbmcuXG4gKlxuICogVGhlIG1vZHVsZSBpcyBkZXNpZ25lZCB0byBmYWNpbGl0YXRlIHRoZSBjcmVhdGlvbiBvZiByb2J1c3QgQ0xJIGFwcGxpY2F0aW9ucyBieSBvZmZlcmluZzpcbiAqIC0gU3RhbmRhcmRpemVkIGlucHV0IHBhcnNpbmcgYW5kIHZhbGlkYXRpb25cbiAqIC0gQ29uc2lzdGVudCBvdXRwdXQgZm9ybWF0dGluZyBhbmQgaGFuZGxpbmdcbiAqIC0gUmV1c2FibGUgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGNvbW1vbiBDTEkgdGFza3NcbiAqIC0gRXh0ZW5zaWJsZSBhcmNoaXRlY3R1cmUgZm9yIGFkZGluZyBuZXcgY29tbWFuZHMgYW5kIGZlYXR1cmVzXG4gKlxuICogSXQgc3VwcG9ydHMgdmFyaW91cyBvdXRwdXQgbW9kZXMsIGluY2x1ZGluZyBzdGFuZGFyZCBjb25zb2xlIG91dHB1dCBhbmQgcmVndWxhciBleHByZXNzaW9uLWJhc2VkIG91dHB1dCxcbiAqIGFsbG93aW5nIGZvciB2ZXJzYXRpbGUgZGF0YSBwcmVzZW50YXRpb24gYW5kIHByb2Nlc3NpbmcuIFRoZSBtb2R1bGFyIHN0cnVjdHVyZSBlbmFibGVzIGVhc3kgbWFpbnRlbmFuY2VcbiAqIGFuZCBleHRlbnNpb24gb2YgdGhlIENMSSBmdW5jdGlvbmFsaXR5LlxuICpcbiAqIFRoaXMgbW9kdWxlIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIGRldmVsb3BlcnMgYnVpbGRpbmcgY29tcGxleCBjb21tYW5kLWxpbmUgdG9vbHMgdGhhdCByZXF1aXJlXG4gKiBzdHJ1Y3R1cmVkIGlucHV0IGhhbmRsaW5nLCBmbGV4aWJsZSBvdXRwdXQgZm9ybWF0dGluZywgYW5kIGEgcmljaCBzZXQgb2YgdXRpbGl0eSBmdW5jdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVwcmVzZW50cyB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUuXG4gKiBAc3VtbWFyeSBUaGlzIGNvbnN0YW50IHN0b3JlcyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIEBhc2Rhc2Rhc2QvdXRpbHMgbW9kdWxlLlxuICogVGhlIGFjdHVhbCB2ZXJzaW9uIG51bWJlciBpcyByZXBsYWNlZCBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3MsXG4gKiB3aXRoIHRoZSBwbGFjZWhvbGRlciBcIiMjVkVSU0lPTiMjXCIgYmVpbmcgc3Vic3RpdHV0ZWQgd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uLlxuICpcbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdLCJuYW1lcyI6WyJvcHRpb25zIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBRUE7Ozs7O0FBS0c7QUFDSSxNQUFNLFFBQVEsR0FBRztBQUV4Qjs7Ozs7QUFLRztBQUNJLE1BQU0sZUFBZSxHQUMxQjtBQUVGOzs7OztBQUtHO0lBQ1M7QUFBWixDQUFBLFVBQVksVUFB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QUFBLHdCQUFBLEVBQTJCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUEsQ0FBRSxFQUFFO0FBQzVELFlBQUEsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUU7U0FDbkIsQ0FBQyxDQUFDLE9BQU87O0FBRWQ7QUFFTyxlQUFlLGVBQWUsQ0FDbkMsYUFBeUIsRUFBQTs7QUFHekIsSUFBQSxPQUFPLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLE1BQU0sQ0FBQyxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQU0sQ0FBQztBQUM5RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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
3830
+ export { AbortCode, BuildScripts, Command, DefaultCommandOptions, DefaultCommandValues, Encoding, Environment, HttpClient, NoCIFLag, RegexpOutputWriter, ReleaseScript, SemVersion, SemVersionRegex, SetupScriptKey, StandardOutputWriter, TemplateSync, Tokens, UserInput, VERSION, chainAbortController, copyFile, deletePath, escapeRegExp, getAllFiles, getDependencies, getPackage, getPackageVersion, getSlogan, installDependencies, installIfNotAvailable, lockify, normalizeImport, padEnd, patchFile, patchPlaceholders, patchString, printBanner, pushToGit, readFile, renameFile, runCommand, setPackageAttribute, spawnCommand, toCamelCase, toENVFormat, toKebabCase, toPascalCase, toSnakeCase, updateDependencies, writeFile };
3831
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuZXNtLmNqcyIsInNvdXJjZXMiOlsiLi4vc3JjL2lucHV0L2lucHV0LnRzIiwiLi4vc3JjL2NsaS9jb25zdGFudHMudHMiLCIuLi9zcmMvdXRpbHMvdGV4dC50cyIsIi4uL3NyYy91dGlscy9jb25zdGFudHMudHMiLCIuLi9zcmMvd3JpdGVycy9TdGFuZGFyZE91dHB1dFdyaXRlci50cyIsIi4uL3NyYy91dGlscy91dGlscy50cyIsIi4uL3NyYy91dGlscy9mcy50cyIsIi4uL3NyYy9vdXRwdXQvY29tbW9uLnRzIiwiLi4vc3JjL3V0aWxzL3dlYi50cyIsIi4uL3NyYy91dGlscy9lbnZpcm9ubWVudC50cyIsIi4uL3NyYy9jbGkvY29tbWFuZC50cyIsIi4uL3NyYy91dGlscy9odHRwLnRzIiwiLi4vc3JjL2NsaS9jb21tYW5kcy9idWlsZC1zY3JpcHRzLnRzIiwiLi4vc3JjL2NsaS9jb21tYW5kcy90YWctcmVsZWFzZS50cyIsIi4uL3NyYy9jbGkvY29tbWFuZHMvdXBkYXRlLXNjcmlwdHMudHMiLCIuLi9zcmMvd3JpdGVycy9SZWdleHBPdXRwdXRXcml0ZXIudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQW5zd2VycyxcbiAgQ2hvaWNlLFxuICBGYWxzeSxcbiAgSW5pdGlhbFJldHVyblZhbHVlLFxuICBQcmV2Q2FsbGVyLFxuICBQcm9tcHRPYmplY3QsXG4gIFByb21wdFR5cGUsXG4gIFZhbHVlT3JGdW5jLFxufSBmcm9tIFwicHJvbXB0c1wiO1xuaW1wb3J0IHByb21wdHMgZnJvbSBcInByb21wdHNcIjtcbmltcG9ydCB7IHBhcnNlQXJncywgUGFyc2VBcmdzQ29uZmlnIH0gZnJvbSBcInV0aWxcIjtcbmltcG9ydCB7IFdyaXRhYmxlLCBSZWFkYWJsZSB9IGZyb20gXCJzdHJlYW1cIjtcbmltcG9ydCB7IEtsZXVyLCBQYXJzZUFyZ3NPcHRpb25zQ29uZmlnLCBQYXJzZUFyZ3NSZXN1bHQgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXByZXNlbnRzIGEgdXNlciBpbnB1dCBwcm9tcHQgd2l0aCB2YXJpb3VzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAqIEBzdW1tYXJ5IFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBmbGV4aWJsZSBpbnRlcmZhY2UgZm9yIGNyZWF0aW5nIGFuZCBtYW5hZ2luZyB1c2VyIGlucHV0IHByb21wdHMuXG4gKiBJdCBpbXBsZW1lbnRzIHRoZSBQcm9tcHRPYmplY3QgaW50ZXJmYWNlIGZyb20gdGhlICdwcm9tcHRzJyBsaWJyYXJ5IGFuZCBvZmZlcnMgbWV0aG9kcyB0byBzZXRcbiAqIHZhcmlvdXMgcHJvcGVydGllcyBvZiB0aGUgcHJvbXB0LiBUaGUgY2xhc3MgYWxzbyBpbmNsdWRlcyBzdGF0aWMgbWV0aG9kcyBmb3IgY29tbW9uIGlucHV0IHNjZW5hcmlvc1xuICogYW5kIGFyZ3VtZW50IHBhcnNpbmcuXG4gKlxuICogQHRlbXBsYXRlIFIgLSBUaGUgdHlwZSBvZiB0aGUgcHJvbXB0IG5hbWUsIGV4dGVuZGluZyBzdHJpbmcuXG4gKlxuICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvbXB0LCB1c2VkIGFzIHRoZSBrZXkgaW4gdGhlIHJldHVybmVkIGFuc3dlcnMgb2JqZWN0LlxuICpcbiAqIEBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgVXNlcklucHV0PFIgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+IGltcGxlbWVudHMgUHJvbXB0T2JqZWN0PFI+IHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgbG9nZ2VyID0gTG9nZ2luZy5mb3IoVXNlcklucHV0KTtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgdHlwZSBvZiB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHRoZSBpbnB1dCBtZXRob2QgKGUuZy4sIHRleHQsIG51bWJlciwgY29uZmlybSkuXG4gICAqL1xuICB0eXBlOiBQcm9tcHRUeXBlIHwgRmFsc3kgfCBQcmV2Q2FsbGVyPFIsIFByb21wdFR5cGUgfCBGYWxzeT4gPSBcInRleHRcIjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBuYW1lIG9mIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IFVzZWQgYXMgdGhlIGtleSBpbiB0aGUgcmV0dXJuZWQgYW5zd2VycyBvYmplY3QuXG4gICAqL1xuICBuYW1lOiBWYWx1ZU9yRnVuYzxSPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBtZXNzYWdlIGRpc3BsYXllZCB0byB0aGUgdXNlci5cbiAgICogQHN1bW1hcnkgVGhlIHF1ZXN0aW9uIG9yIGluc3RydWN0aW9uIHByZXNlbnRlZCB0byB0aGUgdXNlci5cbiAgICovXG4gIG1lc3NhZ2U/OiBWYWx1ZU9yRnVuYzxzdHJpbmc+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgVGhlIGRlZmF1bHQgdmFsdWUgcHJlc2VudGVkIHRvIHRoZSB1c2VyLlxuICAgKi9cbiAgaW5pdGlhbD86XG4gICAgfCBJbml0aWFsUmV0dXJuVmFsdWVcbiAgICB8IFByZXZDYWxsZXI8UiwgSW5pdGlhbFJldHVyblZhbHVlIHwgUHJvbWlzZTxJbml0aWFsUmV0dXJuVmFsdWU+PlxuICAgIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHN0eWxlIG9mIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgdGhlIHZpc3VhbCBzdHlsZSBvZiB0aGUgcHJvbXB0LlxuICAgKi9cbiAgc3R5bGU/OiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBmb3JtYXQgZnVuY3Rpb24gZm9yIHRoZSBpbnB1dC5cbiAgICogQHN1bW1hcnkgQSBmdW5jdGlvbiB0byBmb3JtYXQgdGhlIHVzZXIncyBpbnB1dCBiZWZvcmUgaXQncyByZXR1cm5lZC5cbiAgICovXG4gIGZvcm1hdD86IFByZXZDYWxsZXI8Uiwgdm9pZD4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgdmFsaWRhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGlucHV0LlxuICAgKiBAc3VtbWFyeSBBIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIHRoZSB1c2VyJ3MgaW5wdXQuXG4gICAqL1xuICB2YWxpZGF0ZT86XG4gICAgfCBQcmV2Q2FsbGVyPFIsIGJvb2xlYW4gfCBzdHJpbmcgfCBQcm9taXNlPGJvb2xlYW4gfCBzdHJpbmc+PlxuICAgIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIG9uU3RhdGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEBzdW1tYXJ5IEEgZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIHN0YXRlIG9mIHRoZSBwcm9tcHQgY2hhbmdlcy5cbiAgICovXG4gIG9uU3RhdGU/OiBQcmV2Q2FsbGVyPFIsIHZvaWQ+IHwgdW5kZWZpbmVkO1xuXG4gIG9uUmVuZGVyPzogKChrbGV1cjogS2xldXIpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIG1pbmltdW0gdmFsdWUgZm9yIG51bWJlciBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IFRoZSBsb3dlc3QgbnVtYmVyIHRoZSB1c2VyIGNhbiBpbnB1dC5cbiAgICovXG4gIG1pbj86IG51bWJlciB8IFByZXZDYWxsZXI8UiwgbnVtYmVyIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIG1heGltdW0gdmFsdWUgZm9yIG51bWJlciBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IFRoZSBoaWdoZXN0IG51bWJlciB0aGUgdXNlciBjYW4gaW5wdXQuXG4gICAqL1xuICBtYXg/OiBudW1iZXIgfCBQcmV2Q2FsbGVyPFIsIG51bWJlciB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFdoZXRoZXIgdG8gYWxsb3cgZmxvYXQgdmFsdWVzIGZvciBudW1iZXIgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBJZiB0cnVlLCBhbGxvd3MgZGVjaW1hbCBudW1iZXJzLlxuICAgKi9cbiAgZmxvYXQ/OiBib29sZWFuIHwgUHJldkNhbGxlcjxSLCBib29sZWFuIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0byByb3VuZCB0byBmb3IgZmxvYXQgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIHRoZSBwcmVjaXNpb24gb2YgZmxvYXQgaW5wdXRzLlxuICAgKi9cbiAgcm91bmQ/OiBudW1iZXIgfCBQcmV2Q2FsbGVyPFIsIG51bWJlciB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluc3RydWN0aW9ucyBmb3IgdGhlIHVzZXIuXG4gICAqIEBzdW1tYXJ5IEFkZGl0aW9uYWwgZ3VpZGFuY2UgcHJvdmlkZWQgdG8gdGhlIHVzZXIuXG4gICAqL1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmcgfCBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGluY3JlbWVudCB2YWx1ZSBmb3IgbnVtYmVyIGlucHV0cy5cbiAgICogQHN1bW1hcnkgVGhlIHN0ZXAgc2l6ZSB3aGVuIGluY3JlYXNpbmcgb3IgZGVjcmVhc2luZyB0aGUgbnVtYmVyLlxuICAgKi9cbiAgaW5jcmVtZW50PzogbnVtYmVyIHwgUHJldkNhbGxlcjxSLCBudW1iZXIgfCBGYWxzeT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgc2VwYXJhdG9yIGZvciBsaXN0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgVGhlIGNoYXJhY3RlciB1c2VkIHRvIHNlcGFyYXRlIGxpc3QgaXRlbXMuXG4gICAqL1xuICBzZXBhcmF0b3I/OiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBhY3RpdmUgb3B0aW9uIHN0eWxlIGZvciBzZWxlY3QgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBUaGUgc3R5bGUgYXBwbGllZCB0byB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9wdGlvbi5cbiAgICovXG4gIGFjdGl2ZT86IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGluYWN0aXZlIG9wdGlvbiBzdHlsZSBmb3Igc2VsZWN0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgVGhlIHN0eWxlIGFwcGxpZWQgdG8gbm9uLXNlbGVjdGVkIG9wdGlvbnMuXG4gICAqL1xuICBpbmFjdGl2ZT86IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIGNob2ljZXM/OiBDaG9pY2VbXSB8IFByZXZDYWxsZXI8UiwgQ2hvaWNlW10gfCBGYWxzeT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgaGludCB0ZXh0IGZvciB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGRpc3BsYXllZCB0byB0aGUgdXNlci5cbiAgICovXG4gIGhpbnQ/OiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSB3YXJuaW5nIHRleHQgZm9yIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IEEgd2FybmluZyBtZXNzYWdlIGRpc3BsYXllZCB0byB0aGUgdXNlci5cbiAgICovXG4gIHdhcm4/OiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZDtcblxuICBzdWdnZXN0PzogKChpbnB1dDogYW55LCBjaG9pY2VzOiBDaG9pY2VbXSkgPT4gUHJvbWlzZTxhbnk+KSB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBsaW1pdCBmb3IgbGlzdCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IFRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0aGF0IGNhbiBiZSBzZWxlY3RlZC5cbiAgICovXG4gIGxpbWl0PzogbnVtYmVyIHwgUHJldkNhbGxlcjxSLCBudW1iZXIgfCBGYWxzeT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgbWFzayBmb3IgcGFzc3dvcmQgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBUaGUgY2hhcmFjdGVyIHVzZWQgdG8gaGlkZSB0aGUgdXNlcidzIGlucHV0LlxuICAgKi9cbiAgbWFzaz86IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHN0ZG91dCBzdHJlYW0gZm9yIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IFRoZSBvdXRwdXQgc3RyZWFtIHVzZWQgYnkgdGhlIHByb21wdC5cbiAgICovXG4gIHN0ZG91dD86IFdyaXRhYmxlIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIHN0ZGluIHN0cmVhbSBmb3IgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgVGhlIGlucHV0IHN0cmVhbSB1c2VkIGJ5IHRoZSBwcm9tcHQuXG4gICAqL1xuICBzdGRpbj86IFJlYWRhYmxlIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBVc2VySW5wdXQgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgbmV3IFVzZXJJbnB1dCBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gbmFtZS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvbXB0LlxuICAgKi9cbiAgY29uc3RydWN0b3IobmFtZTogVmFsdWVPckZ1bmM8Uj4pIHtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSB0eXBlIG9mIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIGlucHV0IG1ldGhvZCBmb3IgdGhlIHByb21wdC5cbiAgICpcbiAgICogQHBhcmFtIHR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgcHJvbXB0LlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0VHlwZSh0eXBlOiBQcm9tcHRUeXBlIHwgRmFsc3kgfCBQcmV2Q2FsbGVyPFIsIFByb21wdFR5cGUgfCBGYWxzeT4pOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgdHlwZSB0bzogJHt0eXBlfWApO1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIG1lc3NhZ2Ugb2YgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgcXVlc3Rpb24gb3IgaW5zdHJ1Y3Rpb24gcHJlc2VudGVkIHRvIHRoZSB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRNZXNzYWdlKHZhbHVlOiBWYWx1ZU9yRnVuYzxzdHJpbmc+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIG1lc3NhZ2UgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5tZXNzYWdlID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgZGVmYXVsdCB2YWx1ZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBpbml0aWFsIHZhbHVlLlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0SW5pdGlhbChcbiAgICB2YWx1ZTpcbiAgICAgIHwgSW5pdGlhbFJldHVyblZhbHVlXG4gICAgICB8IFByZXZDYWxsZXI8UiwgSW5pdGlhbFJldHVyblZhbHVlIHwgUHJvbWlzZTxJbml0aWFsUmV0dXJuVmFsdWU+PlxuICAgICAgfCB1bmRlZmluZWRcbiAgKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIGluaXRpYWwgdmFsdWUgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5pbml0aWFsID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIHN0eWxlIG9mIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIHZpc3VhbCBzdHlsZSBvZiB0aGUgcHJvbXB0LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgc3R5bGUgdG8gYmUgYXBwbGllZC5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldFN0eWxlKHZhbHVlOiBzdHJpbmcgfCBQcmV2Q2FsbGVyPFIsIHN0cmluZyB8IEZhbHN5PiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBzdHlsZSB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLnN0eWxlID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGZvcm1hdCBmdW5jdGlvbiBvZiB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIGEgZnVuY3Rpb24gdG8gZm9ybWF0IHRoZSB1c2VyJ3MgaW5wdXQgYmVmb3JlIGl0J3MgcmV0dXJuZWQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBmb3JtYXQgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRGb3JtYXQodmFsdWU6IFByZXZDYWxsZXI8Uiwgdm9pZD4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgZm9ybWF0IGZ1bmN0aW9uYCk7XG4gICAgdGhpcy5mb3JtYXQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgdmFsaWRhdGlvbiBmdW5jdGlvbiBvZiB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIGEgZnVuY3Rpb24gdG8gdmFsaWRhdGUgdGhlIHVzZXIncyBpbnB1dC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbGlkYXRpb24gZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRWYWxpZGF0ZShcbiAgICB2YWx1ZTpcbiAgICAgIHwgUHJldkNhbGxlcjxSLCBib29sZWFuIHwgc3RyaW5nIHwgUHJvbWlzZTxib29sZWFuIHwgc3RyaW5nPj5cbiAgICAgIHwgdW5kZWZpbmVkXG4gICk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyB2YWxpZGF0ZSBmdW5jdGlvbmApO1xuICAgIHRoaXMudmFsaWRhdGUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgb25TdGF0ZSBjYWxsYmFjayBvZiB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHN0YXRlIG9mIHRoZSBwcm9tcHQgY2hhbmdlcy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIG9uU3RhdGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRPblN0YXRlKHZhbHVlOiBQcmV2Q2FsbGVyPFIsIHZvaWQ+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIG9uU3RhdGUgY2FsbGJhY2tgKTtcbiAgICB0aGlzLm9uU3RhdGUgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgb25SZW5kZXIgY2FsbGJhY2sgb2YgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBwcm9tcHQgaXMgcmVuZGVyZWQuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBvblJlbmRlciBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldE9uUmVuZGVyKHZhbHVlOiAoKGtsZXVyOiBLbGV1cikgPT4gdm9pZCkgfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgb25SZW5kZXIgY2FsbGJhY2tgKTtcbiAgICB0aGlzLm9uUmVuZGVyID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIG1pbmltdW0gdmFsdWUgZm9yIG51bWJlciBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIGxvd2VzdCBudW1iZXIgdGhlIHVzZXIgY2FuIGlucHV0LlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgbWluaW11bSB2YWx1ZS5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldE1pbih2YWx1ZTogbnVtYmVyIHwgUHJldkNhbGxlcjxSLCBudW1iZXIgfCBGYWxzeT4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgbWluIHZhbHVlIHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMubWluID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIG1heGltdW0gdmFsdWUgZm9yIG51bWJlciBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIGhpZ2hlc3QgbnVtYmVyIHRoZSB1c2VyIGNhbiBpbnB1dC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIG1heGltdW0gdmFsdWUuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRNYXgodmFsdWU6IG51bWJlciB8IFByZXZDYWxsZXI8UiwgbnVtYmVyIHwgRmFsc3k+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIG1heCB2YWx1ZSB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLm1heCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHdoZXRoZXIgdG8gYWxsb3cgZmxvYXQgdmFsdWVzIGZvciBudW1iZXIgaW5wdXRzLlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIHdoZXRoZXIgZGVjaW1hbCBudW1iZXJzIGFyZSBhbGxvd2VkLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBXaGV0aGVyIHRvIGFsbG93IGZsb2F0IHZhbHVlcy5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldEZsb2F0KHZhbHVlOiBib29sZWFuIHwgUHJldkNhbGxlcjxSLCBib29sZWFuIHwgRmFsc3k+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIGZsb2F0IHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMuZmxvYXQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRvIHJvdW5kIHRvIGZvciBmbG9hdCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIHByZWNpc2lvbiBvZiBmbG9hdCBpbnB1dHMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRSb3VuZCh2YWx1ZTogbnVtYmVyIHwgUHJldkNhbGxlcjxSLCBudW1iZXIgfCBGYWxzeT4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgcm91bmQgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5yb3VuZCA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBpbnN0cnVjdGlvbnMgZm9yIHRoZSB1c2VyLlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIGFkZGl0aW9uYWwgZ3VpZGFuY2UgcHJvdmlkZWQgdG8gdGhlIHVzZXIuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBpbnN0cnVjdGlvbnMuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRJbnN0cnVjdGlvbnModmFsdWU6IHN0cmluZyB8IGJvb2xlYW4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgaW5zdHJ1Y3Rpb25zIHRvOiAke3ZhbHVlfWApO1xuICAgIHRoaXMuaW5zdHJ1Y3Rpb25zID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGluY3JlbWVudCB2YWx1ZSBmb3IgbnVtYmVyIGlucHV0cy5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgc3RlcCBzaXplIHdoZW4gaW5jcmVhc2luZyBvciBkZWNyZWFzaW5nIHRoZSBudW1iZXIuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBpbmNyZW1lbnQgdmFsdWUuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRJbmNyZW1lbnQoXG4gICAgdmFsdWU6IG51bWJlciB8IFByZXZDYWxsZXI8UiwgbnVtYmVyIHwgRmFsc3k+IHwgdW5kZWZpbmVkXG4gICk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBpbmNyZW1lbnQgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5pbmNyZW1lbnQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgc2VwYXJhdG9yIGZvciBsaXN0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgY2hhcmFjdGVyIHVzZWQgdG8gc2VwYXJhdGUgbGlzdCBpdGVtcy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHNlcGFyYXRvciBjaGFyYWN0ZXIuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRTZXBhcmF0b3IoXG4gICAgdmFsdWU6IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkXG4gICk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBzZXBhcmF0b3IgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5zZXBhcmF0b3IgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgYWN0aXZlIG9wdGlvbiBzdHlsZSBmb3Igc2VsZWN0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgc3R5bGUgYXBwbGllZCB0byB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9wdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGFjdGl2ZSBvcHRpb24gc3R5bGUuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRBY3RpdmUodmFsdWU6IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIGFjdGl2ZSBzdHlsZSB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLmFjdGl2ZSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBpbmFjdGl2ZSBvcHRpb24gc3R5bGUgZm9yIHNlbGVjdCBpbnB1dHMuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIHN0eWxlIGFwcGxpZWQgdG8gbm9uLXNlbGVjdGVkIG9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBpbmFjdGl2ZSBvcHRpb24gc3R5bGUuXG4gICAqIEByZXR1cm5zIFRoaXMgVXNlcklucHV0IGluc3RhbmNlIGZvciBtZXRob2QgY2hhaW5pbmcuXG4gICAqL1xuICBzZXRJbmFjdGl2ZSh2YWx1ZTogc3RyaW5nIHwgUHJldkNhbGxlcjxSLCBzdHJpbmcgfCBGYWxzeT4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgaW5hY3RpdmUgc3R5bGUgdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy5pbmFjdGl2ZSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgc2V0Q2hvaWNlcyhcbiAgICB2YWx1ZTogQ2hvaWNlW10gfCBQcmV2Q2FsbGVyPFIsIENob2ljZVtdIHwgRmFsc3k+IHwgdW5kZWZpbmVkXG4gICk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBjaG9pY2VzOiAke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gKTtcbiAgICB0aGlzLmNob2ljZXMgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgaGludCB0ZXh0IGZvciB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZGlzcGxheWVkIHRvIHRoZSB1c2VyLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgaGludCB0ZXh0LlxuICAgKiBAcmV0dXJucyBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0SGludCh2YWx1ZTogc3RyaW5nIHwgUHJldkNhbGxlcjxSLCBzdHJpbmcgfCBGYWxzeT4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgaGludCB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLmhpbnQgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgd2FybmluZyB0ZXh0IGZvciB0aGUgcHJvbXB0LlxuICAgKiBAc3VtbWFyeSBDb25maWd1cmVzIGEgd2FybmluZyBtZXNzYWdlIGRpc3BsYXllZCB0byB0aGUgdXNlci5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHdhcm5pbmcgdGV4dC5cbiAgICogQHJldHVybnMgVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldFdhcm4odmFsdWU6IHN0cmluZyB8IFByZXZDYWxsZXI8Uiwgc3RyaW5nIHwgRmFsc3k+IHwgdW5kZWZpbmVkKTogdGhpcyB7XG4gICAgVXNlcklucHV0LmxvZ2dlci52ZXJib3NlKGBTZXR0aW5nIHdhcm4gdG86ICR7dmFsdWV9YCk7XG4gICAgdGhpcy53YXJuID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRTdWdnZXN0KFxuICAgIHZhbHVlOiAoKGlucHV0OiBhbnksIGNob2ljZXM6IENob2ljZVtdKSA9PiBQcm9taXNlPGFueT4pIHwgdW5kZWZpbmVkXG4gICk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBzdWdnZXN0IGZ1bmN0aW9uYCk7XG4gICAgdGhpcy5zdWdnZXN0ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIGxpbWl0IGZvciBsaXN0IGlucHV0cy5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdGhhdCBjYW4gYmUgc2VsZWN0ZWQgaW4gbGlzdC10eXBlIHByb21wdHMuXG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHR5cGUgb2YgdGhlIHByb21wdCBuYW1lLCBleHRlbmRpbmcgc3RyaW5nLlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdGhhdCBjYW4gYmUgc2VsZWN0ZWQsIG9yIGEgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIHRoaXMgdmFsdWUuXG4gICAqIEByZXR1cm4gVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldExpbWl0KHZhbHVlOiBudW1iZXIgfCBQcmV2Q2FsbGVyPFIsIG51bWJlciB8IEZhbHN5PiB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIFVzZXJJbnB1dC5sb2dnZXIudmVyYm9zZShgU2V0dGluZyBsaW1pdCB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLmxpbWl0ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldHMgdGhlIG1hc2sgZm9yIHBhc3N3b3JkIGlucHV0cy5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgY2hhcmFjdGVyIHVzZWQgdG8gaGlkZSB0aGUgdXNlcidzIGlucHV0IGluIHBhc3N3b3JkLXR5cGUgcHJvbXB0cy5cbiAgICogQHRlbXBsYXRlIFIgLSBUaGUgdHlwZSBvZiB0aGUgcHJvbXB0IG5hbWUsIGV4dGVuZGluZyBzdHJpbmcuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBjaGFyYWN0ZXIgdXNlZCB0byBtYXNrIHRoZSBpbnB1dCwgb3IgYSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgdGhpcyB2YWx1ZS5cbiAgICogQHJldHVybiBUaGlzIFVzZXJJbnB1dCBpbnN0YW5jZSBmb3IgbWV0aG9kIGNoYWluaW5nLlxuICAgKi9cbiAgc2V0TWFzayh2YWx1ZTogc3RyaW5nIHwgUHJldkNhbGxlcjxSLCBzdHJpbmcgfCBGYWxzeT4gfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgbWFzayB0bzogJHt2YWx1ZX1gKTtcbiAgICB0aGlzLm1hc2sgPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgc3Rkb3V0IHN0cmVhbSBmb3IgdGhlIHByb21wdC5cbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgb3V0cHV0IHN0cmVhbSB1c2VkIGJ5IHRoZSBwcm9tcHQgZm9yIGRpc3BsYXlpbmcgbWVzc2FnZXMgYW5kIHJlc3VsdHMuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSBXcml0YWJsZSBzdHJlYW0gdG8gYmUgdXNlZCBhcyBzdGRvdXQuXG4gICAqIEByZXR1cm4gVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldFN0ZG91dCh2YWx1ZTogV3JpdGFibGUgfCB1bmRlZmluZWQpOiB0aGlzIHtcbiAgICBVc2VySW5wdXQubG9nZ2VyLnZlcmJvc2UoYFNldHRpbmcgc3Rkb3V0IHN0cmVhbWApO1xuICAgIHRoaXMuc3Rkb3V0ID0gdmFsdWU7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBzdGRpbiBzdHJlYW0gZm9yIHRoZSBwcm9tcHQuXG4gICAqIEBzdW1tYXJ5IENvbmZpZ3VyZXMgdGhlIGlucHV0IHN0cmVhbSB1c2VkIGJ5IHRoZSBwcm9tcHQgZm9yIHJlY2VpdmluZyB1c2VyIGlucHV0LlxuICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgUmVhZGFibGUgc3RyZWFtIHRvIGJlIHVzZWQgYXMgc3RkaW4uXG4gICAqIEByZXR1cm4gVGhpcyBVc2VySW5wdXQgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZy5cbiAgICovXG4gIHNldFN0ZGluKHZhbHVlOiBSZWFkYWJsZSB8IHVuZGVmaW5lZCk6IHRoaXMge1xuICAgIHRoaXMuc3RkaW4gPSB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQXNrcyB0aGUgdXNlciBmb3IgaW5wdXQgYmFzZWQgb24gdGhlIGN1cnJlbnQgVXNlcklucHV0IGNvbmZpZ3VyYXRpb24uXG4gICAqIEBzdW1tYXJ5IFByb21wdHMgdGhlIHVzZXIgYW5kIHJldHVybnMgdGhlaXIgcmVzcG9uc2UgYXMgYSBzaW5nbGUgdmFsdWUuXG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHR5cGUgb2YgdGhlIHByb21wdCBuYW1lLCBleHRlbmRpbmcgc3RyaW5nLlxuICAgKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB1c2VyJ3MgYW5zd2VyLlxuICAgKi9cbiAgYXN5bmMgYXNrKCkge1xuICAgIHJldHVybiAoYXdhaXQgVXNlcklucHV0LmFzayh0aGlzKSlbdGhpcy5uYW1lIGFzIGtleW9mIEFuc3dlcnM8Uj5dO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBc2tzIHRoZSB1c2VyIG9uZSBvciBtb3JlIHF1ZXN0aW9ucyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgVXNlcklucHV0IGNvbmZpZ3VyYXRpb25zLlxuICAgKiBAc3VtbWFyeSBQcm9tcHRzIHRoZSB1c2VyIHdpdGggb25lIG9yIG1vcmUgcXVlc3Rpb25zIGFuZCByZXR1cm5zIHRoZWlyIGFuc3dlcnMgYXMgYW4gb2JqZWN0LlxuICAgKiBAdGVtcGxhdGUgUiAtIFRoZSB0eXBlIG9mIHRoZSBwcm9tcHQgbmFtZSwgZXh0ZW5kaW5nIHN0cmluZy5cbiAgICogQHBhcmFtIHF1ZXN0aW9uIC0gQSBzaW5nbGUgVXNlcklucHV0IGluc3RhbmNlIG9yIGFuIGFycmF5IG9mIFVzZXJJbnB1dCBpbnN0YW5jZXMuXG4gICAqIEByZXR1cm4gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHVzZXIncyBhbnN3ZXJzLlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXJcbiAgICogICBwYXJ0aWNpcGFudCBBIGFzIGFzayBtZXRob2RcbiAgICogICBwYXJ0aWNpcGFudCBQIGFzIHByb21wdHMgbGlicmFyeVxuICAgKiAgIEEtPj5QOiBDYWxsIHByb21wdHMgd2l0aCBxdWVzdGlvbihzKVxuICAgKiAgIFAtPj5VOiBEaXNwbGF5IHByb21wdChzKVxuICAgKiAgIFUtPj5QOiBQcm92aWRlIGlucHV0XG4gICAqICAgUC0+PkE6IFJldHVybiBhbnN3ZXJzXG4gICAqICAgQS0+PkE6IFByb2Nlc3MgYW5zd2Vyc1xuICAgKiAgIEEtLT4+Q2FsbGVyOiBSZXR1cm4gcHJvY2Vzc2VkIGFuc3dlcnNcbiAgICovXG4gIHN0YXRpYyBhc3luYyBhc2s8UiBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4oXG4gICAgcXVlc3Rpb246IFVzZXJJbnB1dDxSPiB8IFVzZXJJbnB1dDxSPltdXG4gICkge1xuICAgIGNvbnN0IGxvZyA9IFVzZXJJbnB1dC5sb2dnZXIuZm9yKHRoaXMuYXNrKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocXVlc3Rpb24pKSB7XG4gICAgICBxdWVzdGlvbiA9IFtxdWVzdGlvbl07XG4gICAgfVxuICAgIGxldCBhbnN3ZXJzOiBBbnN3ZXJzPFI+O1xuICAgIHRyeSB7XG4gICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgYEFza2luZyBxdWVzdGlvbnM6ICR7cXVlc3Rpb24ubWFwKChxKSA9PiBxLm5hbWUpLmpvaW4oXCIsIFwiKX1gXG4gICAgICApO1xuICAgICAgYW5zd2VycyA9IGF3YWl0IHByb21wdHMocXVlc3Rpb24pO1xuICAgICAgbG9nLnZlcmJvc2UoYFJlY2VpdmVkIGFuc3dlcnM6ICR7SlNPTi5zdHJpbmdpZnkoYW5zd2VycywgbnVsbCwgMil9YCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3Igd2hpbGUgZ2V0dGluZyBpbnB1dDogJHtlcnJvcn1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGFuc3dlcnM7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFza3MgdGhlIHVzZXIgZm9yIGEgbnVtYmVyIGlucHV0LlxuICAgKiBAc3VtbWFyeSBQcm9tcHRzIHRoZSB1c2VyIHRvIGVudGVyIGEgbnVtYmVyLCB3aXRoIG9wdGlvbmFsIG1pbmltdW0sIG1heGltdW0sIGFuZCBpbml0aWFsIHZhbHVlcy5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvbXB0LCB1c2VkIGFzIHRoZSBrZXkgaW4gdGhlIHJldHVybmVkIGFuc3dlcnMgb2JqZWN0LlxuICAgKiBAcGFyYW0gcXVlc3Rpb24gLSBUaGUgbWVzc2FnZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAqIEBwYXJhbSBtaW4gLSBUaGUgbWluaW11bSBhbGxvd2VkIHZhbHVlIChvcHRpb25hbCkuXG4gICAqIEBwYXJhbSBtYXggLSBUaGUgbWF4aW11bSBhbGxvd2VkIHZhbHVlIChvcHRpb25hbCkuXG4gICAqIEBwYXJhbSBpbml0aWFsIC0gVGhlIGluaXRpYWwgdmFsdWUgcHJlc2VudGVkIHRvIHRoZSB1c2VyIChvcHRpb25hbCkuXG4gICAqIEByZXR1cm4gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIG51bWJlciBlbnRlcmVkIGJ5IHRoZSB1c2VyLlxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGFza051bWJlcihcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcXVlc3Rpb246IHN0cmluZyxcbiAgICBtaW4/OiBudW1iZXIsXG4gICAgbWF4PzogbnVtYmVyLFxuICAgIGluaXRpYWw/OiBudW1iZXJcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBsb2cgPSBVc2VySW5wdXQubG9nZ2VyLmZvcih0aGlzLmFza051bWJlcik7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgQXNraW5nIG51bWJlciBpbnB1dDogdW5kZWZpbmVkLCBxdWVzdGlvbjogJHtxdWVzdGlvbn0sIG1pbjogJHttaW59LCBtYXg6ICR7bWF4fSwgaW5pdGlhbDogJHtpbml0aWFsfWBcbiAgICApO1xuICAgIGNvbnN0IHVzZXJJbnB1dCA9IG5ldyBVc2VySW5wdXQobmFtZSlcbiAgICAgIC5zZXRNZXNzYWdlKHF1ZXN0aW9uKVxuICAgICAgLnNldFR5cGUoXCJudW1iZXJcIik7XG5cbiAgICBpZiAodHlwZW9mIG1pbiA9PT0gXCJudW1iZXJcIikgdXNlcklucHV0LnNldE1pbihtaW4pO1xuXG4gICAgaWYgKHR5cGVvZiBtYXggPT09IFwibnVtYmVyXCIpIHVzZXJJbnB1dC5zZXRNYXgobWF4KTtcblxuICAgIGlmICh0eXBlb2YgaW5pdGlhbCA9PT0gXCJudW1iZXJcIikgdXNlcklucHV0LnNldEluaXRpYWwoaW5pdGlhbCk7XG5cbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuYXNrKHVzZXJJbnB1dCkpW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBc2tzIHRoZSB1c2VyIGZvciBhIHRleHQgaW5wdXQuXG4gICAqIEBzdW1tYXJ5IFByb21wdHMgdGhlIHVzZXIgdG8gZW50ZXIgdGV4dCwgd2l0aCBvcHRpb25hbCBtYXNraW5nIGFuZCBpbml0aWFsIHZhbHVlLlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9tcHQsIHVzZWQgYXMgdGhlIGtleSBpbiB0aGUgcmV0dXJuZWQgYW5zd2VycyBvYmplY3QuXG4gICAqIEBwYXJhbSBxdWVzdGlvbiAtIFRoZSBtZXNzYWdlIGRpc3BsYXllZCB0byB0aGUgdXNlci5cbiAgICogQHBhcmFtIG1hc2sgLSBUaGUgY2hhcmFjdGVyIHVzZWQgdG8gbWFzayB0aGUgaW5wdXQgKG9wdGlvbmFsLCBmb3IgcGFzc3dvcmQtbGlrZSBpbnB1dHMpLlxuICAgKiBAcGFyYW0gaW5pdGlhbCAtIFRoZSBpbml0aWFsIHZhbHVlIHByZXNlbnRlZCB0byB0aGUgdXNlciAob3B0aW9uYWwpLlxuICAgKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB0ZXh0IGVudGVyZWQgYnkgdGhlIHVzZXIuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgYXNrVGV4dChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcXVlc3Rpb246IHN0cmluZyxcbiAgICBtYXNrOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gICAgaW5pdGlhbD86IHN0cmluZ1xuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IGxvZyA9IFVzZXJJbnB1dC5sb2dnZXIuZm9yKHRoaXMuYXNrVGV4dCk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgQXNraW5nIHRleHQgaW5wdXQ6IHVuZGVmaW5lZCwgcXVlc3Rpb246ICR7cXVlc3Rpb259LCBtYXNrOiAke21hc2t9LCBpbml0aWFsOiAke2luaXRpYWx9YFxuICAgICk7XG4gICAgY29uc3QgdXNlcklucHV0ID0gbmV3IFVzZXJJbnB1dChuYW1lKS5zZXRNZXNzYWdlKHF1ZXN0aW9uKTtcblxuICAgIGlmIChtYXNrKSB1c2VySW5wdXQuc2V0TWFzayhtYXNrKTtcbiAgICBpZiAodHlwZW9mIGluaXRpYWwgPT09IFwic3RyaW5nXCIpIHVzZXJJbnB1dC5zZXRJbml0aWFsKGluaXRpYWwpO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5hc2sodXNlcklucHV0KSlbbmFtZV07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFza3MgdGhlIHVzZXIgZm9yIGEgY29uZmlybWF0aW9uICh5ZXMvbm8pLlxuICAgKiBAc3VtbWFyeSBQcm9tcHRzIHRoZSB1c2VyIHdpdGggYSB5ZXMvbm8gcXVlc3Rpb24gYW5kIHJldHVybnMgYSBib29sZWFuIHJlc3VsdC5cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvbXB0LCB1c2VkIGFzIHRoZSBrZXkgaW4gdGhlIHJldHVybmVkIGFuc3dlcnMgb2JqZWN0LlxuICAgKiBAcGFyYW0gcXVlc3Rpb24gLSBUaGUgbWVzc2FnZSBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAqIEBwYXJhbSBpbml0aWFsIC0gVGhlIGluaXRpYWwgdmFsdWUgcHJlc2VudGVkIHRvIHRoZSB1c2VyIChvcHRpb25hbCkuXG4gICAqIEByZXR1cm4gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBib29sZWFuIHJlcHJlc2VudGluZyB0aGUgdXNlcidzIGFuc3dlci5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBhc2tDb25maXJtYXRpb24oXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHF1ZXN0aW9uOiBzdHJpbmcsXG4gICAgaW5pdGlhbD86IGJvb2xlYW5cbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgbG9nID0gVXNlcklucHV0LmxvZ2dlci5mb3IodGhpcy5hc2tDb25maXJtYXRpb24pO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYEFza2luZyBjb25maXJtYXRpb24gaW5wdXQ6IHVuZGVmaW5lZCwgcXVlc3Rpb246ICR7cXVlc3Rpb259LCBpbml0aWFsOiAke2luaXRpYWx9YFxuICAgICk7XG4gICAgY29uc3QgdXNlcklucHV0ID0gbmV3IFVzZXJJbnB1dChuYW1lKVxuICAgICAgLnNldE1lc3NhZ2UocXVlc3Rpb24pXG4gICAgICAuc2V0VHlwZShcImNvbmZpcm1cIik7XG5cbiAgICBpZiAodHlwZW9mIGluaXRpYWwgIT09IFwidW5kZWZpbmVkXCIpIHVzZXJJbnB1dC5zZXRJbml0aWFsKGluaXRpYWwpO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5hc2sodXNlcklucHV0KSlbbmFtZV07XG4gIH1cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXBlYXRlZGx5IGFza3MgZm9yIGlucHV0IHVudGlsIGEgdmFsaWQgcmVzcG9uc2UgaXMgZ2l2ZW4gb3IgdGhlIGxpbWl0IGlzIHJlYWNoZWQuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIGluc2lzdHMgb24gZ2V0dGluZyBhIHZhbGlkIGlucHV0IGZyb20gdGhlIHVzZXIsIGFsbG93aW5nIGZvciBhIHNwZWNpZmllZCBudW1iZXIgb2YgYXR0ZW1wdHMuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHR5cGUgb2YgdGhlIGV4cGVjdGVkIHJlc3VsdC5cbiAgICogQHBhcmFtIGlucHV0IC0gVGhlIFVzZXJJbnB1dCBpbnN0YW5jZSB0byB1c2UgZm9yIHByb21wdGluZy5cbiAgICogQHBhcmFtIHRlc3QgLSBBIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIHRoZSB1c2VyJ3MgaW5wdXQuXG4gICAqIEBwYXJhbSBsaW1pdCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhdHRlbXB0cyBhbGxvd2VkIChkZWZhdWx0IGlzIDEpLlxuICAgKiBAcGFyYW0gZGVmYXVsdENvbmZpcm1hdGlvblxuICAgKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB2YWxpZCBpbnB1dCBvciB1bmRlZmluZWQgaWYgdGhlIGxpbWl0IGlzIHJlYWNoZWQuXG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IFUgYXMgVXNlclxuICAgKiAgIHBhcnRpY2lwYW50IEkgYXMgaW5zaXN0IG1ldGhvZFxuICAgKiAgIHBhcnRpY2lwYW50IEEgYXMgYXNrIG1ldGhvZFxuICAgKiAgIHBhcnRpY2lwYW50IFQgYXMgdGVzdCBmdW5jdGlvblxuICAgKiAgIHBhcnRpY2lwYW50IEMgYXMgYXNrQ29uZmlybWF0aW9uIG1ldGhvZFxuICAgKiAgIGxvb3AgVW50aWwgdmFsaWQgaW5wdXQgb3IgbGltaXQgcmVhY2hlZFxuICAgKiAgICAgSS0+PkE6IENhbGwgYXNrIHdpdGggaW5wdXRcbiAgICogICAgIEEtPj5VOiBQcm9tcHQgdXNlclxuICAgKiAgICAgVS0+PkE6IFByb3ZpZGUgaW5wdXRcbiAgICogICAgIEEtPj5JOiBSZXR1cm4gcmVzdWx0XG4gICAqICAgICBJLT4+VDogVGVzdCByZXN1bHRcbiAgICogICAgIGFsdCBUZXN0IHBhc3Nlc1xuICAgKiAgICAgICBJLT4+QzogQXNrIGZvciBjb25maXJtYXRpb25cbiAgICogICAgICAgQy0+PlU6IENvbmZpcm0gaW5wdXRcbiAgICogICAgICAgVS0+PkM6IFByb3ZpZGUgY29uZmlybWF0aW9uXG4gICAqICAgICAgIEMtPj5JOiBSZXR1cm4gY29uZmlybWF0aW9uXG4gICAqICAgICAgIGFsdCBDb25maXJtZWRcbiAgICogICAgICAgICBJLS0+PkNhbGxlcjogUmV0dXJuIHZhbGlkIHJlc3VsdFxuICAgKiAgICAgICBlbHNlIE5vdCBjb25maXJtZWRcbiAgICogICAgICAgICBJLT4+STogQ29udGludWUgbG9vcFxuICAgKiAgICAgICBlbmRcbiAgICogICAgIGVsc2UgVGVzdCBmYWlsc1xuICAgKiAgICAgICBJLT4+STogQ29udGludWUgbG9vcFxuICAgKiAgICAgZW5kXG4gICAqICAgZW5kXG4gICAqICAgSS0tPj5DYWxsZXI6IFJldHVybiB1bmRlZmluZWQgaWYgbGltaXQgcmVhY2hlZFxuICAgKi9cbiAgc3RhdGljIGFzeW5jIGluc2lzdDxSPihcbiAgICBpbnB1dDogVXNlcklucHV0LFxuICAgIHRlc3Q6IChyZXM6IHN0cmluZyB8IG51bWJlcikgPT4gYm9vbGVhbixcbiAgICBkZWZhdWx0Q29uZmlybWF0aW9uOiBib29sZWFuLFxuICAgIGxpbWl0ID0gMVxuICApOiBQcm9taXNlPFIgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBsb2cgPSBVc2VySW5wdXQubG9nZ2VyLmZvcih0aGlzLmluc2lzdCk7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgSW5zaXN0aW5nIG9uIGlucHV0OiAke2lucHV0Lm5hbWV9LCB0ZXN0OiAke3Rlc3QudG9TdHJpbmcoKX0sIGRlZmF1bHRDb25maXJtYXRpb246ICR7ZGVmYXVsdENvbmZpcm1hdGlvbn0sIGxpbWl0OiAke2xpbWl0fWBcbiAgICApO1xuICAgIGxldCByZXN1bHQ6IHN0cmluZyB8IG51bWJlciB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGxldCBjb25maXJtYXRpb246IGJvb2xlYW47XG4gICAgdHJ5IHtcbiAgICAgIGRvIHtcbiAgICAgICAgcmVzdWx0ID0gKGF3YWl0IFVzZXJJbnB1dC5hc2soaW5wdXQpKVtcbiAgICAgICAgICBpbnB1dC5uYW1lIGFzIGtleW9mIEFuc3dlcnM8c3RyaW5nPlxuICAgICAgICBdIGFzIHN0cmluZztcbiAgICAgICAgaWYgKCF0ZXN0KHJlc3VsdCkpIHtcbiAgICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uZmlybWF0aW9uID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgICBgJHtpbnB1dC5uYW1lfS1jb25maXJtYCxcbiAgICAgICAgICBgSXMgdGhlICR7aW5wdXQudHlwZX0gY29ycmVjdD9gLFxuICAgICAgICAgIGRlZmF1bHRDb25maXJtYXRpb25cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFjb25maXJtYXRpb24pIHJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgICAgIH0gd2hpbGUgKHR5cGVvZiByZXN1bHQgPT09IFwidW5kZWZpbmVkXCIgJiYgbGltaXQgPiAxICYmIGNvdW50KysgPCBsaW1pdCk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgbG9nLmVycm9yKGBFcnJvciB3aGlsZSBpbnNpc3Rpbmc6ICR7ZX1gKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwidW5kZWZpbmVkXCIpIGxvZy5pbmZvKFwibm8gc2VsZWN0aW9uLi4uXCIpO1xuICAgIHJldHVybiByZXN1bHQgYXMgUiB8IHVuZGVmaW5lZDtcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlcGVhdGVkbHkgYXNrcyBmb3IgdGV4dCBpbnB1dCB1bnRpbCBhIHZhbGlkIHJlc3BvbnNlIGlzIGdpdmVuIG9yIHRoZSBsaW1pdCBpcyByZWFjaGVkLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBpbnNpc3RzIG9uIGdldHRpbmcgYSB2YWxpZCB0ZXh0IGlucHV0IGZyb20gdGhlIHVzZXIsIGFsbG93aW5nIGZvciBhIHNwZWNpZmllZCBudW1iZXIgb2YgYXR0ZW1wdHMuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb21wdCwgdXNlZCBhcyB0aGUga2V5IGluIHRoZSByZXR1cm5lZCBhbnN3ZXJzIG9iamVjdC5cbiAgICogQHBhcmFtIHF1ZXN0aW9uIC0gVGhlIG1lc3NhZ2UgZGlzcGxheWVkIHRvIHRoZSB1c2VyLlxuICAgKiBAcGFyYW0gdGVzdCAtIEEgZnVuY3Rpb24gdG8gdmFsaWRhdGUgdGhlIHVzZXIncyBpbnB1dC5cbiAgICogQHBhcmFtIG1hc2sgLSBUaGUgY2hhcmFjdGVyIHVzZWQgdG8gbWFzayB0aGUgaW5wdXQgKG9wdGlvbmFsLCBmb3IgcGFzc3dvcmQtbGlrZSBpbnB1dHMpLlxuICAgKiBAcGFyYW0gaW5pdGlhbCAtIFRoZSBpbml0aWFsIHZhbHVlIHByZXNlbnRlZCB0byB0aGUgdXNlciAob3B0aW9uYWwpLlxuICAgKiBAcGFyYW0gZGVmYXVsdENvbmZpcm1hdGlvblxuICAgKiBAcGFyYW0gbGltaXQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXR0ZW1wdHMgYWxsb3dlZCAoZGVmYXVsdCBpcyAtMSwgbWVhbmluZyB1bmxpbWl0ZWQpLlxuICAgKiBAcmV0dXJuIEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSB2YWxpZCBpbnB1dCBvciB1bmRlZmluZWQgaWYgdGhlIGxpbWl0IGlzIHJlYWNoZWQuXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgaW5zaXN0Rm9yVGV4dChcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcXVlc3Rpb246IHN0cmluZyxcbiAgICB0ZXN0OiAocmVzOiBzdHJpbmcpID0+IGJvb2xlYW4sXG4gICAgbWFzazogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICAgIGluaXRpYWw/OiBzdHJpbmcsXG4gICAgZGVmYXVsdENvbmZpcm1hdGlvbiA9IGZhbHNlLFxuICAgIGxpbWl0ID0gLTFcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBsb2cgPSBVc2VySW5wdXQubG9nZ2VyLmZvcih0aGlzLmluc2lzdEZvclRleHQpO1xuICAgIGxvZy52ZXJib3NlKFxuICAgICAgYEluc2lzdGluZyBmb3IgdGV4dCBpbnB1dDogdW5kZWZpbmVkLCBxdWVzdGlvbjogJHtxdWVzdGlvbn0sIHRlc3Q6ICR7dGVzdC50b1N0cmluZygpfSwgbWFzazogJHttYXNrfSwgaW5pdGlhbDogJHtpbml0aWFsfSwgZGVmYXVsdENvbmZpcm1hdGlvbjogJHtkZWZhdWx0Q29uZmlybWF0aW9ufSwgbGltaXQ6ICR7bGltaXR9YFxuICAgICk7XG4gICAgY29uc3QgdXNlcklucHV0ID0gbmV3IFVzZXJJbnB1dChuYW1lKS5zZXRNZXNzYWdlKHF1ZXN0aW9uKTtcblxuICAgIGlmIChtYXNrKSB1c2VySW5wdXQuc2V0TWFzayhtYXNrKTtcbiAgICBpZiAodHlwZW9mIGluaXRpYWwgPT09IFwic3RyaW5nXCIpIHVzZXJJbnB1dC5zZXRJbml0aWFsKGluaXRpYWwpO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5pbnNpc3QoXG4gICAgICB1c2VySW5wdXQsXG4gICAgICB0ZXN0IGFzIChyZXM6IHN0cmluZyB8IG51bWJlcikgPT4gYm9vbGVhbixcbiAgICAgIGRlZmF1bHRDb25maXJtYXRpb24sXG4gICAgICBsaW1pdFxuICAgICkpIGFzIHN0cmluZztcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlcGVhdGVkbHkgYXNrcyBmb3IgbnVtYmVyIGlucHV0IHVudGlsIGEgdmFsaWQgcmVzcG9uc2UgaXMgZ2l2ZW4gb3IgdGhlIGxpbWl0IGlzIHJlYWNoZWQuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIGluc2lzdHMgb24gZ2V0dGluZyBhIHZhbGlkIG51bWJlciBpbnB1dCBmcm9tIHRoZSB1c2VyLCBhbGxvd2luZyBmb3IgYSBzcGVjaWZpZWQgbnVtYmVyIG9mIGF0dGVtcHRzLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9tcHQsIHVzZWQgYXMgdGhlIGtleSBpbiB0aGUgcmV0dXJuZWQgYW5zd2VycyBvYmplY3QuXG4gICAqIEBwYXJhbSBxdWVzdGlvbiAtIFRoZSBtZXNzYWdlIGRpc3BsYXllZCB0byB0aGUgdXNlci5cbiAgICogQHBhcmFtIHRlc3QgLSBBIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIHRoZSB1c2VyJ3MgaW5wdXQuXG4gICAqIEBwYXJhbSBtaW4gLSBUaGUgbWluaW11bSBhbGxvd2VkIHZhbHVlIChvcHRpb25hbCkuXG4gICAqIEBwYXJhbSBtYXggLSBUaGUgbWF4aW11bSBhbGxvd2VkIHZhbHVlIChvcHRpb25hbCkuXG4gICAqIEBwYXJhbSBpbml0aWFsIC0gVGhlIGluaXRpYWwgdmFsdWUgcHJlc2VudGVkIHRvIHRoZSB1c2VyIChvcHRpb25hbCkuXG4gICAqIEBwYXJhbSBkZWZhdWx0Q29uZmlybWF0aW9uXG4gICAqIEBwYXJhbSBsaW1pdCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBhdHRlbXB0cyBhbGxvd2VkIChkZWZhdWx0IGlzIC0xLCBtZWFuaW5nIHVubGltaXRlZCkuXG4gICAqIEByZXR1cm4gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHZhbGlkIGlucHV0IG9yIHVuZGVmaW5lZCBpZiB0aGUgbGltaXQgaXMgcmVhY2hlZC5cbiAgICovXG4gIHN0YXRpYyBhc3luYyBpbnNpc3RGb3JOdW1iZXIoXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHF1ZXN0aW9uOiBzdHJpbmcsXG4gICAgdGVzdDogKHJlczogbnVtYmVyKSA9PiBib29sZWFuLFxuICAgIG1pbj86IG51bWJlcixcbiAgICBtYXg/OiBudW1iZXIsXG4gICAgaW5pdGlhbD86IG51bWJlcixcbiAgICBkZWZhdWx0Q29uZmlybWF0aW9uID0gZmFsc2UsXG4gICAgbGltaXQgPSAtMVxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IGxvZyA9IFVzZXJJbnB1dC5sb2dnZXIuZm9yKHRoaXMuaW5zaXN0Rm9yTnVtYmVyKTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBJbnNpc3RpbmcgZm9yIG51bWJlciBpbnB1dDogdW5kZWZpbmVkLCBxdWVzdGlvbjogJHtxdWVzdGlvbn0sIHRlc3Q6ICR7dGVzdC50b1N0cmluZygpfSwgbWluOiAke21pbn0sIG1heDogJHttYXh9LCBpbml0aWFsOiAke2luaXRpYWx9LCBkZWZhdWx0Q29uZmlybWF0aW9uOiAke2RlZmF1bHRDb25maXJtYXRpb259LCBsaW1pdDogJHtsaW1pdH1gXG4gICAgKTtcbiAgICBjb25zdCB1c2VySW5wdXQgPSBuZXcgVXNlcklucHV0KG5hbWUpXG4gICAgICAuc2V0TWVzc2FnZShxdWVzdGlvbilcbiAgICAgIC5zZXRUeXBlKFwibnVtYmVyXCIpO1xuXG4gICAgaWYgKHR5cGVvZiBtaW4gPT09IFwibnVtYmVyXCIpIHVzZXJJbnB1dC5zZXRNaW4obWluKTtcblxuICAgIGlmICh0eXBlb2YgbWF4ID09PSBcIm51bWJlclwiKSB1c2VySW5wdXQuc2V0TWF4KG1heCk7XG5cbiAgICBpZiAodHlwZW9mIGluaXRpYWwgPT09IFwibnVtYmVyXCIpIHVzZXJJbnB1dC5zZXRJbml0aWFsKGluaXRpYWwpO1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5pbnNpc3QoXG4gICAgICB1c2VySW5wdXQsXG4gICAgICB0ZXN0IGFzIChyZXM6IHN0cmluZyB8IG51bWJlcikgPT4gYm9vbGVhbixcbiAgICAgIGRlZmF1bHRDb25maXJtYXRpb24sXG4gICAgICBsaW1pdFxuICAgICkpIGFzIG51bWJlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUGFyc2VzIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIG9wdGlvbnMuXG4gICAqIEBzdW1tYXJ5IFVzZXMgTm9kZS5qcydzIHV0aWwucGFyc2VBcmdzIHRvIHBhcnNlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgYW5kIHJldHVybiB0aGUgcmVzdWx0LlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgcGFyc2luZyBhcmd1bWVudHMuXG4gICAqIEByZXR1cm4gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcnNlZCBhcmd1bWVudHMuXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2FsbGVyXG4gICAqICAgcGFydGljaXBhbnQgUCBhcyBwYXJzZUFyZ3MgbWV0aG9kXG4gICAqICAgcGFydGljaXBhbnQgVSBhcyB1dGlsLnBhcnNlQXJnc1xuICAgKiAgIEMtPj5QOiBDYWxsIHdpdGggb3B0aW9uc1xuICAgKiAgIFAtPj5QOiBQcmVwYXJlIGFyZ3Mgb2JqZWN0XG4gICAqICAgUC0+PlU6IENhbGwgcGFyc2VBcmdzIHdpdGggcHJlcGFyZWQgYXJnc1xuICAgKiAgIFUtPj5QOiBSZXR1cm4gcGFyc2VkIHJlc3VsdFxuICAgKiAgIFAtLT4+QzogUmV0dXJuIFBhcnNlQXJnc1Jlc3VsdFxuICAgKi9cbiAgc3RhdGljIHBhcnNlQXJncyhvcHRpb25zOiBQYXJzZUFyZ3NPcHRpb25zQ29uZmlnKTogUGFyc2VBcmdzUmVzdWx0IHtcbiAgICBjb25zdCBsb2cgPSBVc2VySW5wdXQubG9nZ2VyLmZvcih0aGlzLnBhcnNlQXJncyk7XG4gICAgY29uc3QgYXJnczogUGFyc2VBcmdzQ29uZmlnID0ge1xuICAgICAgYXJnczogcHJvY2Vzcy5hcmd2LnNsaWNlKDIpLFxuICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICB9O1xuICAgIGxvZy5kZWJ1ZyhgUGFyc2luZyBhcmd1bWVudHM6ICR7SlNPTi5zdHJpbmdpZnkoYXJncywgbnVsbCwgMil9YCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBwYXJzZUFyZ3MoYXJncyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGxvZy5kZWJ1ZyhcbiAgICAgICAgYEVycm9yIHdoaWxlIHBhcnNpbmcgYXJndW1lbnRzOlxcbiR7SlNPTi5zdHJpbmdpZnkoYXJncywgbnVsbCwgMil9XFxuIHwgb3B0aW9uc1xcbiR7SlNPTi5zdHJpbmdpZnkob3B0aW9ucywgbnVsbCwgMil9XFxuIHwgJHtlcnJvcn1gXG4gICAgICApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciB3aGlsZSBwYXJzaW5nIGFyZ3VtZW50czogJHtlcnJvcn1gKTtcbiAgICB9XG4gIH1cbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgY29tbWFuZCBvcHRpb25zIGZvciBDTEkgY29tbWFuZHMuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgYW5kIGRlZmF1bHQgdmFsdWVzIGZvciBjb21tb24gY29tbWFuZC1saW5lIG9wdGlvbnMgdXNlZCBhY3Jvc3MgdmFyaW91cyBDTEkgY29tbWFuZHMuXG4gKiBAY29uc3QgRGVmYXVsdENvbW1hbmRPcHRpb25zXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEZWZhdWx0Q29tbWFuZE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSB2ZXJib3NlIC0gVmVyYm9zaXR5IGxldmVsIG9wdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJib3NlLnR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgdmVyYm9zZSBvcHRpb24gKG51bWJlcikuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyYm9zZS5zaG9ydCAtIFRoZSBzaG9ydCBmbGFnIGZvciB0aGUgdmVyYm9zZSBvcHRpb24gKFYpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHZlcmJvc2UuZGVmYXVsdCAtIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB2ZXJib3NpdHkgKDApLlxuICogQHByb3BlcnR5IHtPYmplY3R9IHZlcnNpb24gLSBWZXJzaW9uIGRpc3BsYXkgb3B0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb24udHlwZSAtIFRoZSB0eXBlIG9mIHRoZSB2ZXJzaW9uIG9wdGlvbiAoYm9vbGVhbikuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyc2lvbi5zaG9ydCAtIFRoZSBzaG9ydCBmbGFnIGZvciB0aGUgdmVyc2lvbiBvcHRpb24gKHYpLlxuICogQHByb3BlcnR5IHt1bmRlZmluZWR9IHZlcnNpb24uZGVmYXVsdCAtIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB2ZXJzaW9uIGRpc3BsYXkgKHVuZGVmaW5lZCkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gaGVscCAtIEhlbHAgZGlzcGxheSBvcHRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaGVscC50eXBlIC0gVGhlIHR5cGUgb2YgdGhlIGhlbHAgb3B0aW9uIChib29sZWFuKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBoZWxwLnNob3J0IC0gVGhlIHNob3J0IGZsYWcgZm9yIHRoZSBoZWxwIG9wdGlvbiAoaCkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGhlbHAuZGVmYXVsdCAtIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBoZWxwIGRpc3BsYXkgKGZhbHNlKS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2dMZXZlbCAtIExvZyBsZXZlbCBvcHRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbG9nTGV2ZWwudHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBsb2dMZXZlbCBvcHRpb24gKHN0cmluZykuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbG9nTGV2ZWwuZGVmYXVsdCAtIFRoZSBkZWZhdWx0IHZhbHVlIGZvciBsb2cgbGV2ZWwgKFwiaW5mb1wiKS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2dTdHlsZSAtIExvZyBzdHlsaW5nIG9wdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBsb2dTdHlsZS50eXBlIC0gVGhlIHR5cGUgb2YgdGhlIGxvZ1N0eWxlIG9wdGlvbiAoYm9vbGVhbikuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGxvZ1N0eWxlLmRlZmF1bHQgLSBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgbG9nIHN0eWxpbmcgKHRydWUpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IHRpbWVzdGFtcCAtIFRpbWVzdGFtcCBkaXNwbGF5IG9wdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aW1lc3RhbXAudHlwZSAtIFRoZSB0eXBlIG9mIHRoZSB0aW1lc3RhbXAgb3B0aW9uIChib29sZWFuKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdGltZXN0YW1wLmRlZmF1bHQgLSBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGltZXN0YW1wIGRpc3BsYXkgKHRydWUpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGJhbm5lciAtIEJhbm5lciBkaXNwbGF5IG9wdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBiYW5uZXIudHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBiYW5uZXIgb3B0aW9uIChib29sZWFuKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYmFubmVyLmRlZmF1bHQgLSBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgYmFubmVyIGRpc3BsYXkgKGZhbHNlKS5cbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRDb21tYW5kT3B0aW9ucyA9IHtcbiAgdmVyYm9zZToge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIHNob3J0OiBcIlZcIixcbiAgICBkZWZhdWx0OiB1bmRlZmluZWQsXG4gIH0sXG4gIHZlcnNpb246IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICBzaG9ydDogXCJ2XCIsXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkLFxuICB9LFxuICBoZWxwOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgc2hvcnQ6IFwiaFwiLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICBsb2dMZXZlbDoge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgZGVmYXVsdDogXCJpbmZvXCIsXG4gIH0sXG4gIGxvZ1N0eWxlOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgdGltZXN0YW1wOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbiAgYmFubmVyOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgZGVmYXVsdDogdHJ1ZSxcbiAgfSxcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgY29tbWFuZCB2YWx1ZXMgZGVyaXZlZCBmcm9tIERlZmF1bHRDb21tYW5kT3B0aW9ucy5cbiAqIEBzdW1tYXJ5IENyZWF0ZXMgYW4gb2JqZWN0IHdpdGggdGhlIGRlZmF1bHQgdmFsdWVzIG9mIGFsbCBvcHRpb25zIGRlZmluZWQgaW4gRGVmYXVsdENvbW1hbmRPcHRpb25zLlxuICogQGNvbnN0IERlZmF1bHRDb21tYW5kVmFsdWVzXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEZWZhdWx0Q29tbWFuZFZhbHVlc1xuICogQHByb3BlcnR5IHt1bmtub3dufSBba2V5OiBzdHJpbmddIC0gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIGVhY2ggb3B0aW9uIGluIERlZmF1bHRDb21tYW5kT3B0aW9ucy5cbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRDb21tYW5kVmFsdWVzOiB7XG4gIFtrIGluIGtleW9mIHR5cGVvZiBEZWZhdWx0Q29tbWFuZE9wdGlvbnNdOiB1bmtub3duO1xufSA9IE9iamVjdC5rZXlzKERlZmF1bHRDb21tYW5kT3B0aW9ucykucmVkdWNlKFxuICAoYWNjOiBSZWNvcmQ8a2V5b2YgdHlwZW9mIERlZmF1bHRDb21tYW5kT3B0aW9ucywgdW5rbm93bj4sIGtleTogc3RyaW5nKSA9PiB7XG4gICAgYWNjW2tleSBhcyBrZXlvZiB0eXBlb2YgRGVmYXVsdENvbW1hbmRPcHRpb25zXSA9XG4gICAgICBEZWZhdWx0Q29tbWFuZE9wdGlvbnNba2V5IGFzIGtleW9mIHR5cGVvZiBEZWZhdWx0Q29tbWFuZE9wdGlvbnNdLmRlZmF1bHQ7XG4gICAgcmV0dXJuIGFjYztcbiAgfSxcbiAge30gYXMgUmVjb3JkPGtleW9mIHR5cGVvZiBEZWZhdWx0Q29tbWFuZFZhbHVlcywgdW5rbm93bj5cbik7XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBQYWRzIHRoZSBlbmQgb2YgYSBzdHJpbmcgd2l0aCBhIHNwZWNpZmllZCBjaGFyYWN0ZXIuXG4gKiBAc3VtbWFyeSBFeHRlbmRzIHRoZSBpbnB1dCBzdHJpbmcgdG8gYSBzcGVjaWZpZWQgbGVuZ3RoIGJ5IGFkZGluZyBhIHBhZGRpbmcgY2hhcmFjdGVyIHRvIHRoZSBlbmQuXG4gKiBJZiB0aGUgaW5wdXQgc3RyaW5nIGlzIGFscmVhZHkgbG9uZ2VyIHRoYW4gdGhlIHNwZWNpZmllZCBsZW5ndGgsIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIC0gVGhlIGlucHV0IHN0cmluZyB0byBiZSBwYWRkZWQuXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIC0gVGhlIGRlc2lyZWQgdG90YWwgbGVuZ3RoIG9mIHRoZSByZXN1bHRpbmcgc3RyaW5nLlxuICogQHBhcmFtIHtzdHJpbmd9IFtjaGFyPVwiIFwiXSAtIFRoZSBjaGFyYWN0ZXIgdG8gdXNlIGZvciBwYWRkaW5nLiBEZWZhdWx0cyB0byBhIHNwYWNlLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgcGFkZGVkIHN0cmluZy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcGFkZGluZyBjaGFyYWN0ZXIgaXMgbm90IGV4YWN0bHkgb25lIGNoYXJhY3RlciBsb25nLlxuICpcbiAqIEBmdW5jdGlvbiBwYWRFbmRcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOlRleHRVdGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGFkRW5kKFxuICBzdHI6IHN0cmluZyxcbiAgbGVuZ3RoOiBudW1iZXIsXG4gIGNoYXI6IHN0cmluZyA9IFwiIFwiXG4pOiBzdHJpbmcge1xuICBpZiAoY2hhci5sZW5ndGggIT09IDEpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjaGFyYWN0ZXIgbGVuZ3RoIGZvciBwYWRkaW5nLiBtdXN0IGJlIG9uZSFcIik7XG4gIHJldHVybiBzdHIucGFkRW5kKGxlbmd0aCwgY2hhcik7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcGxhY2VzIHBsYWNlaG9sZGVycyBpbiBhIHN0cmluZyB3aXRoIHByb3ZpZGVkIHZhbHVlcy5cbiAqIEBzdW1tYXJ5IEludGVycG9sYXRlcyBhIHN0cmluZyBieSByZXBsYWNpbmcgcGxhY2Vob2xkZXJzIG9mIHRoZSBmb3JtICR7dmFyaWFibGVOYW1lfVxuICogd2l0aCBjb3JyZXNwb25kaW5nIHZhbHVlcyBmcm9tIHRoZSBwcm92aWRlZCBvYmplY3QuIElmIGEgcGxhY2Vob2xkZXIgZG9lc24ndCBoYXZlXG4gKiBhIGNvcnJlc3BvbmRpbmcgdmFsdWUsIGl0IGlzIGxlZnQgdW5jaGFuZ2VkIGluIHRoZSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IC0gVGhlIGlucHV0IHN0cmluZyBjb250YWluaW5nIHBsYWNlaG9sZGVycyB0byBiZSByZXBsYWNlZC5cbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgbnVtYmVyIHwgc3RyaW5nPn0gdmFsdWVzIC0gQW4gb2JqZWN0IGNvbnRhaW5pbmcga2V5LXZhbHVlIHBhaXJzIGZvciByZXBsYWNlbWVudC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGludGVycG9sYXRlZCBzdHJpbmcgd2l0aCBwbGFjZWhvbGRlcnMgcmVwbGFjZWQgYnkgdGhlaXIgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gKlxuICogQGZ1bmN0aW9uIHBhdGNoUGxhY2Vob2xkZXJzXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgcGF0Y2hTdHJpbmdcbiAqICAgcGFydGljaXBhbnQgU3RyaW5nLnJlcGxhY2VcbiAqICAgQ2FsbGVyLT4+cGF0Y2hTdHJpbmc6IENhbGwgd2l0aCBpbnB1dCBhbmQgdmFsdWVzXG4gKiAgIHBhdGNoU3RyaW5nLT4+U3RyaW5nLnJlcGxhY2U6IENhbGwgd2l0aCByZWdleCBhbmQgcmVwbGFjZW1lbnQgZnVuY3Rpb25cbiAqICAgU3RyaW5nLnJlcGxhY2UtPj5wYXRjaFN0cmluZzogUmV0dXJuIHJlcGxhY2VkIHN0cmluZ1xuICogICBwYXRjaFN0cmluZy0tPj5DYWxsZXI6IFJldHVybiBwYXRjaGVkIHN0cmluZ1xuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6VGV4dFV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXRjaFBsYWNlaG9sZGVycyhcbiAgaW5wdXQ6IHN0cmluZyxcbiAgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+XG4pOiBzdHJpbmcge1xuICByZXR1cm4gaW5wdXQucmVwbGFjZShcbiAgICAvXFwkXFx7KFthLXpBLVowLTlfXSspXFx9L2csXG4gICAgKG1hdGNoLCB2YXJpYWJsZSkgPT4gKHZhbHVlc1t2YXJpYWJsZSBhcyBzdHJpbmddIGFzIHN0cmluZykgfHwgbWF0Y2hcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGNoU3RyaW5nKFxuICBpbnB1dDogc3RyaW5nLFxuICB2YWx1ZXM6IFJlY29yZDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz4sXG4gIGZsYWdzOiBzdHJpbmcgPSBcImdcIlxuKTogc3RyaW5nIHtcbiAgT2JqZWN0LmVudHJpZXModmFsdWVzKS5mb3JFYWNoKChba2V5LCB2YWxdKSA9PiB7XG4gICAgY29uc3QgcmVnZXhwID0gbmV3IFJlZ0V4cChlc2NhcGVSZWdFeHAoa2V5KSwgZmxhZ3MpO1xuICAgIGlucHV0ID0gaW5wdXQucmVwbGFjZShyZWdleHAsIHZhbCBhcyBzdHJpbmcpO1xuICB9KTtcbiAgcmV0dXJuIGlucHV0O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBhIHN0cmluZyB0byBjYW1lbENhc2UuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIHRoZSBpbnB1dCBzdHJpbmcgaW50byBjYW1lbENhc2UgZm9ybWF0LCB3aGVyZSB3b3JkcyBhcmUgam9pbmVkIHdpdGhvdXQgc3BhY2VzXG4gKiBhbmQgZWFjaCB3b3JkIGFmdGVyIHRoZSBmaXJzdCBzdGFydHMgd2l0aCBhIGNhcGl0YWwgbGV0dGVyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGhlIGlucHV0IHN0cmluZyB0byBiZSBjb252ZXJ0ZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbnB1dCBzdHJpbmcgY29udmVydGVkIHRvIGNhbWVsQ2FzZS5cbiAqXG4gKiBAZnVuY3Rpb24gdG9DYW1lbENhc2VcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOlRleHRVdGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gdG9DYW1lbENhc2UodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHRcbiAgICAucmVwbGFjZSgvKD86Xlxcd3xbQS1aXXxcXGJcXHcpL2csICh3b3JkLCBpbmRleCkgPT5cbiAgICAgIGluZGV4ID09PSAwID8gd29yZC50b0xvd2VyQ2FzZSgpIDogd29yZC50b1VwcGVyQ2FzZSgpXG4gICAgKVxuICAgIC5yZXBsYWNlKC9cXHMrL2csIFwiXCIpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBhIHN0cmluZyB0byBFTlZJUk9OTUVOVF9WQVJJQUJMRSBmb3JtYXQuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIHRoZSBpbnB1dCBzdHJpbmcgaW50byB1cHBlcmNhc2Ugd2l0aCB3b3JkcyBzZXBhcmF0ZWQgYnkgdW5kZXJzY29yZXMsXG4gKiB0eXBpY2FsbHkgdXNlZCBmb3IgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZXMuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgLSBUaGUgaW5wdXQgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGlucHV0IHN0cmluZyBjb252ZXJ0ZWQgdG8gRU5WSVJPTk1FTlRfVkFSSUFCTEUgZm9ybWF0LlxuICpcbiAqIEBmdW5jdGlvbiB0b0VOVkZvcm1hdFxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6VGV4dFV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0VOVkZvcm1hdCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdG9TbmFrZUNhc2UodGV4dCkudG9VcHBlckNhc2UoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYSBzdHJpbmcgdG8gc25ha2VfY2FzZS5cbiAqIEBzdW1tYXJ5IFRyYW5zZm9ybXMgdGhlIGlucHV0IHN0cmluZyBpbnRvIGxvd2VyY2FzZSB3aXRoIHdvcmRzIHNlcGFyYXRlZCBieSB1bmRlcnNjb3Jlcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRoZSBpbnB1dCBzdHJpbmcgdG8gYmUgY29udmVydGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW5wdXQgc3RyaW5nIGNvbnZlcnRlZCB0byBzbmFrZV9jYXNlLlxuICpcbiAqIEBmdW5jdGlvbiB0b1NuYWtlQ2FzZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6VGV4dFV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1NuYWtlQ2FzZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dFxuICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCBcIiQxXyQyXCIpXG4gICAgLnJlcGxhY2UoL1tcXHMtXSsvZywgXCJfXCIpXG4gICAgLnRvTG93ZXJDYXNlKCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgc3RyaW5nIHRvIGtlYmFiLWNhc2UuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIHRoZSBpbnB1dCBzdHJpbmcgaW50byBsb3dlcmNhc2Ugd2l0aCB3b3JkcyBzZXBhcmF0ZWQgYnkgaHlwaGVucy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRoZSBpbnB1dCBzdHJpbmcgdG8gYmUgY29udmVydGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgaW5wdXQgc3RyaW5nIGNvbnZlcnRlZCB0byBrZWJhYi1jYXNlLlxuICpcbiAqIEBmdW5jdGlvbiB0b0tlYmFiQ2FzZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6VGV4dFV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0tlYmFiQ2FzZSh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dFxuICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCBcIiQxLSQyXCIpXG4gICAgLnJlcGxhY2UoL1tcXHNfXSsvZywgXCItXCIpXG4gICAgLnRvTG93ZXJDYXNlKCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgc3RyaW5nIHRvIFBhc2NhbENhc2UuXG4gKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIHRoZSBpbnB1dCBzdHJpbmcgaW50byBQYXNjYWxDYXNlIGZvcm1hdCwgd2hlcmUgd29yZHMgYXJlIGpvaW5lZCB3aXRob3V0IHNwYWNlc1xuICogYW5kIGVhY2ggd29yZCBzdGFydHMgd2l0aCBhIGNhcGl0YWwgbGV0dGVyLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IC0gVGhlIGlucHV0IHN0cmluZyB0byBiZSBjb252ZXJ0ZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbnB1dCBzdHJpbmcgY29udmVydGVkIHRvIFBhc2NhbENhc2UuXG4gKlxuICogQGZ1bmN0aW9uIHRvUGFzY2FsQ2FzZVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6VGV4dFV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1Bhc2NhbENhc2UodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHRcbiAgICAucmVwbGFjZSgvKD86Xlxcd3xbQS1aXXxcXGJcXHcpL2csICh3b3JkKSA9PiB3b3JkLnRvVXBwZXJDYXNlKCkpXG4gICAgLnJlcGxhY2UoL1xccysvZywgXCJcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyaW5nOiBzdHJpbmcpIHtcbiAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKC9bLiorP14ke30oKXxbXFxdXFxcXF0vZywgXCJcXFxcJCZcIik7IC8vICQmIG1lYW5zIHRoZSB3aG9sZSBtYXRjaGVkIHN0cmluZ1xufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBlbmNvZGluZyBmb3IgdGV4dCBvcGVyYXRpb25zLlxuICogQHN1bW1hcnkgVGhlIHN0YW5kYXJkIFVURi04IGVuY29kaW5nIHVzZWQgZm9yIHRleHQgcHJvY2Vzc2luZy5cbiAqIEBjb25zdCB7c3RyaW5nfSBFbmNvZGluZ1xuICogQG1lbWJlck9mIEBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgY29uc3QgRW5jb2RpbmcgPSBcInV0Zi04XCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3Igc2VtYW50aWMgdmVyc2lvbmluZy5cbiAqIEBzdW1tYXJ5IEEgcmVnZXggcGF0dGVybiB0byBtYXRjaCBhbmQgcGFyc2Ugc2VtYW50aWMgdmVyc2lvbiBzdHJpbmdzLlxuICogQGNvbnN0IHtSZWdFeHB9IFNlbVZlcnNpb25SZWdleFxuICogQG1lbWJlck9mIEBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgY29uc3QgU2VtVmVyc2lvblJlZ2V4ID1cbiAgL14oXFxkKylcXC4oXFxkKylcXC4oXFxkKykoPzotKFswLTlBLVphLXotXSsoPzpcXC5bMC05QS1aYS16XSkpKS9nO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbnVtIGZvciBzZW1hbnRpYyB2ZXJzaW9uIGNvbXBvbmVudHMuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSB0aHJlZSBsZXZlbHMgb2Ygc2VtYW50aWMgdmVyc2lvbmluZzogUEFUQ0gsIE1JTk9SLCBhbmQgTUFKT1IuXG4gKiBAZW51bSB7c3RyaW5nfVxuICogQG1lbWJlck9mIEBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgZW51bSBTZW1WZXJzaW9uIHtcbiAgLyoqIFBhdGNoIHZlcnNpb24gZm9yIGJhY2t3YXJkcy1jb21wYXRpYmxlIGJ1ZyBmaXhlcy4gKi9cbiAgUEFUQ0ggPSBcInBhdGNoXCIsXG4gIC8qKiBNaW5vciB2ZXJzaW9uIGZvciBiYWNrd2FyZHMtY29tcGF0aWJsZSBuZXcgZmVhdHVyZXMuICovXG4gIE1JTk9SID0gXCJtaW5vclwiLFxuICAvKiogTWFqb3IgdmVyc2lvbiBmb3IgY2hhbmdlcyB0aGF0IGJyZWFrIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAqL1xuICBNQUpPUiA9IFwibWFqb3JcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRmxhZyB0byBpbmRpY2F0ZSBub24tQ0kgZW52aXJvbm1lbnQuXG4gKiBAc3VtbWFyeSBVc2VkIHRvIHNwZWNpZnkgdGhhdCBhIGNvbW1hbmQgc2hvdWxkIHJ1biBvdXRzaWRlIG9mIGEgQ29udGludW91cyBJbnRlZ3JhdGlvbiBlbnZpcm9ubWVudC5cbiAqIEBjb25zdCB7c3RyaW5nfSBOb0NJRkxhZ1xuICogQG1lbWJlck9mIEBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgY29uc3QgTm9DSUZMYWcgPSBcIi1uby1jaVwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBLZXkgZm9yIHRoZSBzZXR1cCBzY3JpcHQgaW4gcGFja2FnZS5qc29uLlxuICogQHN1bW1hcnkgSWRlbnRpZmllcyB0aGUgc2NyaXB0IHRoYXQgcnVucyBhZnRlciBwYWNrYWdlIGluc3RhbGxhdGlvbi5cbiAqIEBjb25zdCB7c3RyaW5nfSBTZXR1cFNjcmlwdEtleVxuICogQG1lbWJlck9mIEBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgY29uc3QgU2V0dXBTY3JpcHRLZXkgPSBcInBvc3RpbnN0YWxsXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVudW0gZm9yIHZhcmlvdXMgYXV0aGVudGljYXRpb24gdG9rZW5zLlxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgZmlsZSBuYW1lcyBmb3Igc3RvcmluZyBkaWZmZXJlbnQgdHlwZXMgb2YgYXV0aGVudGljYXRpb24gdG9rZW5zLlxuICogQGVudW0ge3N0cmluZ31cbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGVudW0gVG9rZW5zIHtcbiAgLyoqIEdpdCBhdXRoZW50aWNhdGlvbiB0b2tlbiBmaWxlIG5hbWUuICovXG4gIEdJVCA9IFwiLnRva2VuXCIsXG4gIC8qKiBOUE0gYXV0aGVudGljYXRpb24gdG9rZW4gZmlsZSBuYW1lLiAqL1xuICBOUE0gPSBcIi5ucG10b2tlblwiLFxuICAvKiogRG9ja2VyIGF1dGhlbnRpY2F0aW9uIHRva2VuIGZpbGUgbmFtZS4gKi9cbiAgRE9DS0VSID0gXCIuZG9ja2VydG9rZW5cIixcbiAgLyoqIENvbmZsdWVuY2UgYXV0aGVudGljYXRpb24gdG9rZW4gZmlsZSBuYW1lLiAqL1xuICBDT05GTFVFTkNFID0gXCIuY29uZmx1ZW5jZS10b2tlblwiLFxufVxuXG5leHBvcnQgY29uc3QgQWJvcnRDb2RlID0gXCJBYm9ydGVkXCI7XG4iLCJpbXBvcnQgeyBFbmNvZGluZyB9IGZyb20gXCIuLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IE91dHB1dFdyaXRlciB9IGZyb20gXCIuL091dHB1dFdyaXRlclwiO1xuaW1wb3J0IHsgUHJvbWlzZUV4ZWN1dG9yIH0gZnJvbSBcIi4uL3V0aWxzL3R5cGVzXCI7XG5pbXBvcnQgeyBPdXRwdXRUeXBlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IHN0eWxlIH0gZnJvbSBcInN0eWxlZC1zdHJpbmctYnVpbGRlclwiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgc3RhbmRhcmQgb3V0cHV0IHdyaXRlciBmb3IgaGFuZGxpbmcgY29tbWFuZCBleGVjdXRpb24gb3V0cHV0LlxuICogQHN1bW1hcnkgVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBPdXRwdXRXcml0ZXIgaW50ZXJmYWNlIGFuZCBwcm92aWRlcyBtZXRob2RzIGZvclxuICogaGFuZGxpbmcgdmFyaW91cyB0eXBlcyBvZiBvdXRwdXQgZnJvbSBjb21tYW5kIGV4ZWN1dGlvbiwgaW5jbHVkaW5nIHN0YW5kYXJkIG91dHB1dCxcbiAqIGVycm9yIG91dHB1dCwgYW5kIGV4aXQgY29kZXMuIEl0IGFsc28gaW5jbHVkZXMgdXRpbGl0eSBtZXRob2RzIGZvciBwYXJzaW5nIGNvbW1hbmRzXG4gKiBhbmQgcmVzb2x2aW5nIG9yIHJlamVjdGluZyBwcm9taXNlcyBiYXNlZCBvbiBleGVjdXRpb24gcmVzdWx0cy5cbiAqXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSB0eXBlIG9mIHRoZSByZXNvbHZlZCB2YWx1ZSwgZGVmYXVsdGluZyB0byBudW1iZXIuXG4gKlxuICogQHBhcmFtIGxvY2sgLSBBIFByb21pc2VFeGVjdXRvciB0byBjb250cm9sIHRoZSBhc3luY2hyb25vdXMgZmxvdy5cbiAqIEBwYXJhbSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgKHVudXNlZCBpbiB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbikuXG4gKlxuICogQGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGFuZGFyZE91dHB1dFdyaXRlcjxSID0gc3RyaW5nPiBpbXBsZW1lbnRzIE91dHB1dFdyaXRlciB7XG4gIHByb3RlY3RlZCBsb2dnZXI6IExvZ2dlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIGEgbmV3IGluc3RhbmNlIG9mIFN0YW5kYXJkT3V0cHV0V3JpdGVyLlxuICAgKiBAc3VtbWFyeSBDb25zdHJ1Y3RzIHRoZSBTdGFuZGFyZE91dHB1dFdyaXRlciB3aXRoIGEgbG9jayBtZWNoYW5pc20gYW5kIG9wdGlvbmFsIGFyZ3VtZW50cy5cbiAgICpcbiAgICogQHBhcmFtIGNtZFxuICAgKiBAcGFyYW0gbG9jayAtIEEgUHJvbWlzZUV4ZWN1dG9yIHRvIGNvbnRyb2wgdGhlIGFzeW5jaHJvbm91cyBmbG93LlxuICAgKiBAcGFyYW0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIChjdXJyZW50bHkgdW51c2VkKS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBjbWQ6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgbG9jazogUHJvbWlzZUV4ZWN1dG9yPFI+LFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAuLi5hcmdzOiB1bmtub3duW11cbiAgKSB7XG4gICAgdGhpcy5sb2dnZXIgPSBMb2dnaW5nLmZvcih0aGlzLmNtZCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3Mgb3V0cHV0IHRvIHRoZSBjb25zb2xlLlxuICAgKiBAc3VtbWFyeSBGb3JtYXRzIGFuZCBsb2dzIHRoZSBnaXZlbiBkYXRhIHdpdGggYSB0aW1lc3RhbXAgYW5kIHR5cGUgaW5kaWNhdG9yLlxuICAgKlxuICAgKiBAcGFyYW0gdHlwZSAtIFRoZSB0eXBlIG9mIG91dHB1dCAoc3Rkb3V0IG9yIHN0ZGVycikuXG4gICAqIEBwYXJhbSBkYXRhIC0gVGhlIGRhdGEgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGxvZyh0eXBlOiBPdXRwdXRUeXBlLCBkYXRhOiBzdHJpbmcgfCBCdWZmZXIpIHtcbiAgICBkYXRhID0gQnVmZmVyLmlzQnVmZmVyKGRhdGEpID8gZGF0YS50b1N0cmluZyhFbmNvZGluZykgOiBkYXRhO1xuICAgIGNvbnN0IGxvZyA9IHR5cGUgPT09IFwic3RkZXJyXCIgPyBzdHlsZShkYXRhKS5yZWQudGV4dCA6IGRhdGE7XG4gICAgdGhpcy5sb2dnZXIuaW5mbyhsb2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIHN0YW5kYXJkIG91dHB1dCBkYXRhLlxuICAgKiBAc3VtbWFyeSBMb2dzIHRoZSBnaXZlbiBjaHVuayBhcyBzdGFuZGFyZCBvdXRwdXQuXG4gICAqXG4gICAqIEBwYXJhbSBjaHVuayAtIFRoZSBkYXRhIGNodW5rIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIGRhdGEoY2h1bms6IGFueSkge1xuICAgIHRoaXMubG9nKFwic3Rkb3V0XCIsIFN0cmluZyhjaHVuaykpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIYW5kbGVzIGVycm9yIG91dHB1dCBkYXRhLlxuICAgKiBAc3VtbWFyeSBMb2dzIHRoZSBnaXZlbiBjaHVuayBhcyBlcnJvciBvdXRwdXQuXG4gICAqXG4gICAqIEBwYXJhbSBjaHVuayAtIFRoZSBlcnJvciBkYXRhIGNodW5rIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIGVycm9yKGNodW5rOiBhbnkpIHtcbiAgICB0aGlzLmxvZyhcInN0ZGVyclwiLCBTdHJpbmcoY2h1bmspKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGFuZGxlcyBlcnJvciBvYmplY3RzLlxuICAgKiBAc3VtbWFyeSBMb2dzIHRoZSBlcnJvciBtZXNzYWdlIGZyb20gdGhlIGdpdmVuIEVycm9yIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIGVyciAtIFRoZSBFcnJvciBvYmplY3QgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgZXJyb3JzKGVycjogRXJyb3IpIHtcbiAgICB0aGlzLmxvZyhcInN0ZGVyclwiLCBgRXJyb3IgZXhlY3V0aW5nIGNvbW1hbmQgZXhpdGVkIDogJHtlcnJ9YCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhhbmRsZXMgdGhlIGV4aXQgb2YgYSBjb21tYW5kLlxuICAgKiBAc3VtbWFyeSBMb2dzIHRoZSBleGl0IGNvZGUgYW5kIHJlc29sdmVzIG9yIHJlamVjdHMgdGhlIHByb21pc2UgYmFzZWQgb24gdGhlIGNvZGUuXG4gICAqXG4gICAqIEBwYXJhbSBjb2RlIC0gVGhlIGV4aXQgY29kZSBvZiB0aGUgY29tbWFuZC5cbiAgICogQHBhcmFtIGxvZ3NcbiAgICovXG4gIGV4aXQoY29kZTogbnVtYmVyIHwgc3RyaW5nLCBsb2dzOiBzdHJpbmdbXSkge1xuICAgIHRoaXMubG9nKFxuICAgICAgXCJzdGRvdXRcIixcbiAgICAgIGBjb21tYW5kIGV4aXRlZCBjb2RlIDogJHtjb2RlID09PSAwID8gc3R5bGUoY29kZS50b1N0cmluZygpKS5ncmVlbi50ZXh0IDogc3R5bGUoY29kZSA9PT0gbnVsbCA/IFwibnVsbFwiIDogY29kZS50b1N0cmluZygpKS5yZWQudGV4dH1gXG4gICAgKTtcbiAgICBpZiAoY29kZSA9PT0gMCkge1xuICAgICAgdGhpcy5yZXNvbHZlKGxvZ3MubWFwKChsKSA9PiBsLnRyaW0oKSkuam9pbihcIlxcblwiKSBhcyBSKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZWplY3QobmV3IEVycm9yKGxvZ3MubGVuZ3RoID8gbG9ncy5qb2luKFwiXFxuXCIpIDogY29kZS50b1N0cmluZygpKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQYXJzZXMgYSBjb21tYW5kIHN0cmluZyBvciBhcnJheSBpbnRvIGNvbXBvbmVudHMuXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIHRoZSBjb21tYW5kIGludG8gYSBjb25zaXN0ZW50IGZvcm1hdCBhbmQgc3RvcmVzIGl0LCB0aGVuIHJldHVybnMgaXQgc3BsaXQgaW50byBjb21tYW5kIGFuZCBhcmd1bWVudHMuXG4gICAqXG4gICAqIEBwYXJhbSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgYXMgYSBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5ncy5cbiAgICogQHJldHVybiBBIHR1cGxlIGNvbnRhaW5pbmcgdGhlIGNvbW1hbmQgYW5kIGl0cyBhcmd1bWVudHMgYXMgc2VwYXJhdGUgZWxlbWVudHMuXG4gICAqL1xuICBwYXJzZUNvbW1hbmQoY29tbWFuZDogc3RyaW5nIHwgc3RyaW5nW10pOiBbc3RyaW5nLCBzdHJpbmdbXV0ge1xuICAgIGNvbW1hbmQgPSB0eXBlb2YgY29tbWFuZCA9PT0gXCJzdHJpbmdcIiA/IGNvbW1hbmQuc3BsaXQoXCIgXCIpIDogY29tbWFuZDtcbiAgICB0aGlzLmNtZCA9IGNvbW1hbmQuam9pbihcIiBcIik7XG4gICAgcmV0dXJuIFtjb21tYW5kWzBdLCBjb21tYW5kLnNsaWNlKDEpXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVzb2x2ZXMgdGhlIHByb21pc2Ugd2l0aCBhIHN1Y2Nlc3MgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgTG9ncyBhIHN1Y2Nlc3MgbWVzc2FnZSBhbmQgcmVzb2x2ZXMgdGhlIHByb21pc2Ugd2l0aCB0aGUgZ2l2ZW4gcmVhc29uLlxuICAgKlxuICAgKiBAcGFyYW0gcmVhc29uIC0gVGhlIHJlYXNvbiBmb3IgcmVzb2x2aW5nIHRoZSBwcm9taXNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlc29sdmUocmVhc29uOiBSKSB7XG4gICAgdGhpcy5sb2coXG4gICAgICBcInN0ZG91dFwiLFxuICAgICAgYCR7dGhpcy5jbWR9IGV4ZWN1dGVkIHN1Y2Nlc3NmdWxseTogJHtzdHlsZShyZWFzb24gPyBcInJhbiB0byBjb21wbGV0aW9uXCIgOiAocmVhc29uIGFzIHN0cmluZykpLmdyZWVufWBcbiAgICApO1xuICAgIHRoaXMubG9jay5yZXNvbHZlKHJlYXNvbik7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlamVjdHMgdGhlIHByb21pc2Ugd2l0aCBhbiBlcnJvciBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBMb2dzIGFuIGVycm9yIG1lc3NhZ2UgYW5kIHJlamVjdHMgdGhlIHByb21pc2Ugd2l0aCB0aGUgZ2l2ZW4gcmVhc29uLlxuICAgKlxuICAgKiBAcGFyYW0gcmVhc29uIC0gVGhlIHJlYXNvbiBmb3IgcmVqZWN0aW5nIHRoZSBwcm9taXNlLCBlaXRoZXIgYSBudW1iZXIgKGV4aXQgY29kZSkgb3IgYSBzdHJpbmcuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVqZWN0KHJlYXNvbjogbnVtYmVyIHwgc3RyaW5nIHwgRXJyb3IpIHtcbiAgICBpZiAoIShyZWFzb24gaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgIHJlYXNvbiA9IG5ldyBFcnJvcihcbiAgICAgICAgdHlwZW9mIHJlYXNvbiA9PT0gXCJudW1iZXJcIiA/IGBFeGl0IGNvZGUgJHtyZWFzb259YCA6IHJlYXNvblxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5sb2coXG4gICAgICBcInN0ZGVyclwiLFxuICAgICAgYCR7dGhpcy5jbWR9IGZhaWxlZCB0byBleGVjdXRlOiAke3N0eWxlKHJlYXNvbi5tZXNzYWdlKS5yZWR9YFxuICAgICk7XG4gICAgdGhpcy5sb2NrLnJlamVjdChyZWFzb24pO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDaGlsZFByb2Nlc3NXaXRob3V0TnVsbFN0cmVhbXMsXG4gIHNwYXduLFxuICBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW8sXG59IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBTdGFuZGFyZE91dHB1dFdyaXRlciB9IGZyb20gXCIuLi93cml0ZXJzL1N0YW5kYXJkT3V0cHV0V3JpdGVyXCI7XG5pbXBvcnQgeyBDb21tYW5kUmVzdWx0IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IE91dHB1dFdyaXRlckNvbnN0cnVjdG9yIH0gZnJvbSBcIi4uL3dyaXRlcnMvdHlwZXNcIjtcbmltcG9ydCB7IEFib3J0Q29kZSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBsb2NrZWQgdmVyc2lvbiBvZiBhIGZ1bmN0aW9uLlxuICogQHN1bW1hcnkgVGhpcyBoaWdoZXItb3JkZXIgZnVuY3Rpb24gdGFrZXMgYSBmdW5jdGlvbiBhbmQgcmV0dXJucyBhIG5ldyBmdW5jdGlvbiB0aGF0IGVuc3VyZXNcbiAqIHNlcXVlbnRpYWwgZXhlY3V0aW9uIG9mIHRoZSBvcmlnaW5hbCBmdW5jdGlvbiwgZXZlbiB3aGVuIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBjb25jdXJyZW50bHkuXG4gKiBJdCB1c2VzIGEgUHJvbWlzZS1iYXNlZCBsb2NraW5nIG1lY2hhbmlzbSB0byBxdWV1ZSBmdW5jdGlvbiBjYWxscy5cbiAqXG4gKiBAdGVtcGxhdGUgUiAtIFRoZSByZXR1cm4gdHlwZSBvZiB0aGUgaW5wdXQgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIGYgLSBUaGUgZnVuY3Rpb24gdG8gYmUgbG9ja2VkLiBJdCBjYW4gdGFrZSBhbnkgbnVtYmVyIG9mIHBhcmFtZXRlcnMgYW5kIHJldHVybiBhIHZhbHVlIG9mIHR5cGUgUi5cbiAqIEByZXR1cm4gQSBuZXcgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZSBzaWduYXR1cmUgYXMgdGhlIGlucHV0IGZ1bmN0aW9uLCBidXQgd2l0aCBzZXF1ZW50aWFsIGV4ZWN1dGlvbiBndWFyYW50ZWVkLlxuICpcbiAqIEBmdW5jdGlvbiBsb2NraWZ5XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDYWxsZXJcbiAqICAgcGFydGljaXBhbnQgTG9ja2VkRnVuY3Rpb25cbiAqICAgcGFydGljaXBhbnQgT3JpZ2luYWxGdW5jdGlvblxuICogICBDYWxsZXItPj5Mb2NrZWRGdW5jdGlvbjogQ2FsbCB3aXRoIHBhcmFtc1xuICogICBMb2NrZWRGdW5jdGlvbi0+PkxvY2tlZEZ1bmN0aW9uOiBDaGVjayBjdXJyZW50IGxvY2tcbiAqICAgYWx0IExvY2sgaXMgcmVzb2x2ZWRcbiAqICAgICBMb2NrZWRGdW5jdGlvbi0+Pk9yaWdpbmFsRnVuY3Rpb246IEV4ZWN1dGUgd2l0aCBwYXJhbXNcbiAqICAgICBPcmlnaW5hbEZ1bmN0aW9uLS0+PkxvY2tlZEZ1bmN0aW9uOiBSZXR1cm4gcmVzdWx0XG4gKiAgICAgTG9ja2VkRnVuY3Rpb24tLT4+Q2FsbGVyOiBSZXR1cm4gcmVzdWx0XG4gKiAgIGVsc2UgTG9jayBpcyBwZW5kaW5nXG4gKiAgICAgTG9ja2VkRnVuY3Rpb24tPj5Mb2NrZWRGdW5jdGlvbjogUXVldWUgZXhlY3V0aW9uXG4gKiAgICAgTG9ja2VkRnVuY3Rpb24tLT4+Q2FsbGVyOiBSZXR1cm4gcHJvbWlzZVxuICogICAgIE5vdGUgb3ZlciBMb2NrZWRGdW5jdGlvbjogV2FpdCBmb3IgcHJldmlvdXMgZXhlY3V0aW9uXG4gKiAgICAgTG9ja2VkRnVuY3Rpb24tPj5PcmlnaW5hbEZ1bmN0aW9uOiBFeGVjdXRlIHdpdGggcGFyYW1zXG4gKiAgICAgT3JpZ2luYWxGdW5jdGlvbi0tPj5Mb2NrZWRGdW5jdGlvbjogUmV0dXJuIHJlc3VsdFxuICogICAgIExvY2tlZEZ1bmN0aW9uLS0+PkNhbGxlcjogUmVzb2x2ZSBwcm9taXNlIHdpdGggcmVzdWx0XG4gKiAgIGVuZFxuICogICBMb2NrZWRGdW5jdGlvbi0+PkxvY2tlZEZ1bmN0aW9uOiBVcGRhdGUgbG9ja1xuICpcbiAqIEBtZW1iZXJPZiBAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvY2tpZnk8Uj4oZjogKC4uLnBhcmFtczogdW5rbm93bltdKSA9PiBSKSB7XG4gIGxldCBsb2NrOiBQcm9taXNlPFIgfCB2b2lkPiA9IFByb21pc2UucmVzb2x2ZSgpO1xuICByZXR1cm4gKC4uLnBhcmFtczogdW5rbm93bltdKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gbG9jay50aGVuKCgpID0+IGYoLi4ucGFyYW1zKSk7XG4gICAgbG9jayA9IHJlc3VsdC5jYXRjaCgoKSA9PiB7fSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoYWluQWJvcnRDb250cm9sbGVyKFxuICBjb250cm9sbGVyOiBBYm9ydENvbnRyb2xsZXIsXG4gIC4uLnNpZ25hbHM6IEFib3J0U2lnbmFsW11cbik6IEFib3J0Q29udHJvbGxlcjtcbmV4cG9ydCBmdW5jdGlvbiBjaGFpbkFib3J0Q29udHJvbGxlcihcbiAgLi4uc2lnbmFsczogQWJvcnRTaWduYWxbXVxuKTogQWJvcnRDb250cm9sbGVyO1xuZXhwb3J0IGZ1bmN0aW9uIGNoYWluQWJvcnRDb250cm9sbGVyKFxuICBhcmd1bWVudDA6IEFib3J0Q29udHJvbGxlciB8IEFib3J0U2lnbmFsLFxuICAuLi5yZW1haW5kZXI6IEFib3J0U2lnbmFsW11cbik6IEFib3J0Q29udHJvbGxlciB7XG4gIGxldCBzaWduYWxzOiBBYm9ydFNpZ25hbFtdO1xuICBsZXQgY29udHJvbGxlcjogQWJvcnRDb250cm9sbGVyO1xuXG4gIC8vIG5vcm1hbGl6ZSBhcmdzXG4gIGlmIChhcmd1bWVudDAgaW5zdGFuY2VvZiBBYm9ydFNpZ25hbCkge1xuICAgIGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgc2lnbmFscyA9IFthcmd1bWVudDAsIC4uLnJlbWFpbmRlcl07XG4gIH0gZWxzZSB7XG4gICAgY29udHJvbGxlciA9IGFyZ3VtZW50MDtcbiAgICBzaWduYWxzID0gcmVtYWluZGVyO1xuICB9XG5cbiAgLy8gaWYgdGhlIGNvbnRyb2xsZXIgaXMgYWxyZWFkeSBhYm9ydGVkLCBleGl0IGVhcmx5XG4gIGlmIChjb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgcmV0dXJuIGNvbnRyb2xsZXI7XG4gIH1cblxuICBjb25zdCBoYW5kbGVyID0gKCkgPT4gY29udHJvbGxlci5hYm9ydCgpO1xuXG4gIGZvciAoY29uc3Qgc2lnbmFsIG9mIHNpZ25hbHMpIHtcbiAgICAvLyBjaGVjayBiZWZvcmUgYWRkaW5nISAoYW5kIGFzc3VtZSB0aGVyZSBpcyBubyBwb3NzaWJsZSB3YXkgdGhhdCB0aGUgc2lnbmFsIGNvdWxkXG4gICAgLy8gYWJvcnQgYmV0d2VlbiB0aGUgYGlmYCBjaGVjayBhbmQgYWRkaW5nIHRoZSBldmVudCBsaXN0ZW5lcilcbiAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgIGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBzaWduYWwuYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIGhhbmRsZXIsIHtcbiAgICAgIG9uY2U6IHRydWUsXG4gICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGNvbnRyb2xsZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3bkNvbW1hbmQ8UiA9IHN0cmluZz4oXG4gIG91dHB1dDogU3RhbmRhcmRPdXRwdXRXcml0ZXI8Uj4sXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgb3B0czogU3Bhd25PcHRpb25zV2l0aG91dFN0ZGlvLFxuICBhYm9ydDogQWJvcnRDb250cm9sbGVyLFxuICBsb2dnZXI6IExvZ2dlclxuKTogQ2hpbGRQcm9jZXNzV2l0aG91dE51bGxTdHJlYW1zIHtcbiAgZnVuY3Rpb24gc3Bhd25Jbm5lcihjb21tYW5kOiBzdHJpbmcsIGNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcikge1xuICAgIGNvbnN0IFtjbWQsIGFyZ3pdID0gb3V0cHV0LnBhcnNlQ29tbWFuZChjb21tYW5kKTtcbiAgICBsb2dnZXIuaW5mbyhgUnVubmluZyBjb21tYW5kOiAke2NtZH1gKTtcbiAgICBsb2dnZXIuZGVidWcoYHdpdGggYXJnczogJHthcmd6LmpvaW4oXCIgXCIpfWApO1xuICAgIGNvbnN0IGNoaWxkUHJvY2VzcyA9IHNwYXduKGNtZCwgYXJneiwge1xuICAgICAgLi4ub3B0cyxcbiAgICAgIGN3ZDogb3B0cy5jd2QgfHwgcHJvY2Vzcy5jd2QoKSxcbiAgICAgIGVudjogT2JqZWN0LmFzc2lnbih7fSwgcHJvY2Vzcy5lbnYsIG9wdHMuZW52LCB7IFBBVEg6IHByb2Nlc3MuZW52LlBBVEggfSksXG4gICAgICBzaGVsbDogb3B0cy5zaGVsbCB8fCBmYWxzZSxcbiAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgfSk7XG4gICAgbG9nZ2VyLnZlcmJvc2UoYHBpZCA6ICR7Y2hpbGRQcm9jZXNzLnBpZH1gKTtcbiAgICByZXR1cm4gY2hpbGRQcm9jZXNzO1xuICB9XG5cbiAgY29uc3QgbSA9IGNvbW1hbmQubWF0Y2goL1s8PiQjXS9nKTtcbiAgaWYgKG0pXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgY29tbWFuZDogJHtjb21tYW5kfS4gY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzOiAke219YFxuICAgICk7XG4gIGlmIChjb21tYW5kLmluY2x1ZGVzKFwiIHwgXCIpKSB7XG4gICAgY29uc3QgY21kcyA9IGNvbW1hbmQuc3BsaXQoXCIgfCBcIik7XG4gICAgY29uc3Qgc3Bhd25zID0gW107XG4gICAgY29uc3QgY29udHJvbGxlcnMgPSBuZXcgQXJyYXkoY21kcy5sZW5ndGgpO1xuICAgIGNvbnRyb2xsZXJzWzBdID0gYWJvcnQ7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaSAhPT0gMClcbiAgICAgICAgY29udHJvbGxlcnNbaV0gPSBjaGFpbkFib3J0Q29udHJvbGxlcihjb250cm9sbGVyc1tpIC0gMV0uc2lnbmFsKTtcbiAgICAgIHNwYXducy5wdXNoKHNwYXduSW5uZXIoY21kc1tpXSwgY29udHJvbGxlcnNbaV0pKTtcbiAgICAgIGlmIChpID09PSAwKSBjb250aW51ZTtcbiAgICAgIHNwYXduc1tpIC0gMV0uc3Rkb3V0LnBpcGUoc3Bhd25zW2ldLnN0ZGluKTtcbiAgICB9XG4gICAgcmV0dXJuIHNwYXduc1tjbWRzLmxlbmd0aCAtIDFdO1xuICB9XG5cbiAgcmV0dXJuIHNwYXduSW5uZXIoY29tbWFuZCwgYWJvcnQpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFeGVjdXRlcyBhIGNvbW1hbmQgYXN5bmNocm9ub3VzbHkgd2l0aCBjdXN0b21pemFibGUgb3V0cHV0IGhhbmRsaW5nLlxuICogQHN1bW1hcnkgVGhpcyBmdW5jdGlvbiBydW5zIGEgc2hlbGwgY29tbWFuZCBhcyBhIGNoaWxkIHByb2Nlc3MsIHByb3ZpZGluZyBmaW5lLWdyYWluZWRcbiAqIGNvbnRyb2wgb3ZlciBpdHMgZXhlY3V0aW9uIGFuZCBvdXRwdXQgaGFuZGxpbmcuIEl0IHN1cHBvcnRzIGN1c3RvbSBvdXRwdXQgd3JpdGVycyxcbiAqIGFsbG93cyBmb3IgY29tbWFuZCBhYm9ydGlvbiwgYW5kIGNhcHR1cmVzIGJvdGggc3Rkb3V0IGFuZCBzdGRlcnIuXG4gKlxuICogQHRlbXBsYXRlIFIgLSBUaGUgdHlwZSBvZiB0aGUgcmVzb2x2ZWQgdmFsdWUgZnJvbSB0aGUgY29tbWFuZCBleGVjdXRpb24uXG4gKlxuICogQHBhcmFtIGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBydW4sIGVpdGhlciBhcyBhIHN0cmluZyBvciBhbiBhcnJheSBvZiBzdHJpbmdzLlxuICogQHBhcmFtIG9wdHMgLSBTcGF3biBvcHRpb25zIGZvciB0aGUgY2hpbGQgcHJvY2Vzcy4gRGVmYXVsdHMgdG8gYW4gZW1wdHkgb2JqZWN0LlxuICogQHBhcmFtIG91dHB1dENvbnN0cnVjdG9yIC0gQ29uc3RydWN0b3IgZm9yIHRoZSBvdXRwdXQgd3JpdGVyLiBEZWZhdWx0cyB0byBTdGFuZGFyZE91dHB1dFdyaXRlci5cbiAqIEBwYXJhbSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgb3V0cHV0IGNvbnN0cnVjdG9yLlxuICogQHJldHVybiB7Q29tbWFuZFJlc3VsdH0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbW1hbmQgcmVzdWx0IG9mIHR5cGUgUi5cbiAqXG4gKiBAZnVuY3Rpb24gcnVuQ29tbWFuZFxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IHJ1bkNvbW1hbmRcbiAqICAgcGFydGljaXBhbnQgT3V0cHV0V3JpdGVyXG4gKiAgIHBhcnRpY2lwYW50IENoaWxkUHJvY2Vzc1xuICogICBDYWxsZXItPj5ydW5Db21tYW5kOiBDYWxsIHdpdGggY29tbWFuZCBhbmQgb3B0aW9uc1xuICogICBydW5Db21tYW5kLT4+T3V0cHV0V3JpdGVyOiBDcmVhdGUgbmV3IGluc3RhbmNlXG4gKiAgIHJ1bkNvbW1hbmQtPj5PdXRwdXRXcml0ZXI6IFBhcnNlIGNvbW1hbmRcbiAqICAgcnVuQ29tbWFuZC0+PkNoaWxkUHJvY2VzczogU3Bhd24gcHJvY2Vzc1xuICogICBDaGlsZFByb2Nlc3MtLT4+cnVuQ29tbWFuZDogUmV0dXJuIHByb2Nlc3Mgb2JqZWN0XG4gKiAgIHJ1bkNvbW1hbmQtPj5DaGlsZFByb2Nlc3M6IFNldCB1cCBldmVudCBsaXN0ZW5lcnNcbiAqICAgbG9vcCBGb3IgZWFjaCBzdGRvdXQgZGF0YVxuICogICAgIENoaWxkUHJvY2Vzcy0+PnJ1bkNvbW1hbmQ6IEVtaXQgc3Rkb3V0IGRhdGFcbiAqICAgICBydW5Db21tYW5kLT4+T3V0cHV0V3JpdGVyOiBIYW5kbGUgc3Rkb3V0IGRhdGFcbiAqICAgZW5kXG4gKiAgIGxvb3AgRm9yIGVhY2ggc3RkZXJyIGRhdGFcbiAqICAgICBDaGlsZFByb2Nlc3MtPj5ydW5Db21tYW5kOiBFbWl0IHN0ZGVyciBkYXRhXG4gKiAgICAgcnVuQ29tbWFuZC0+Pk91dHB1dFdyaXRlcjogSGFuZGxlIHN0ZGVyciBkYXRhXG4gKiAgIGVuZFxuICogICBDaGlsZFByb2Nlc3MtPj5ydW5Db21tYW5kOiBFbWl0IGVycm9yIChpZiBhbnkpXG4gKiAgIHJ1bkNvbW1hbmQtPj5PdXRwdXRXcml0ZXI6IEhhbmRsZSBlcnJvclxuICogICBDaGlsZFByb2Nlc3MtPj5ydW5Db21tYW5kOiBFbWl0IGV4aXRcbiAqICAgcnVuQ29tbWFuZC0+Pk91dHB1dFdyaXRlcjogSGFuZGxlIGV4aXRcbiAqICAgT3V0cHV0V3JpdGVyLS0+PnJ1bkNvbW1hbmQ6IFJlc29sdmUgb3IgcmVqZWN0IHByb21pc2VcbiAqICAgcnVuQ29tbWFuZC0tPj5DYWxsZXI6IFJldHVybiBDb21tYW5kUmVzdWx0XG4gKlxuICogQG1lbWJlck9mIEBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuQ29tbWFuZDxSID0gc3RyaW5nPihcbiAgY29tbWFuZDogc3RyaW5nLFxuICBvcHRzOiBTcGF3bk9wdGlvbnNXaXRob3V0U3RkaW8gPSB7fSxcbiAgb3V0cHV0Q29uc3RydWN0b3I6IE91dHB1dFdyaXRlckNvbnN0cnVjdG9yPFxuICAgIFIsXG4gICAgU3RhbmRhcmRPdXRwdXRXcml0ZXI8Uj4sXG4gICAgRXJyb3JcbiAgPiA9IFN0YW5kYXJkT3V0cHV0V3JpdGVyPFI+LFxuICAuLi5hcmdzOiB1bmtub3duW11cbik6IENvbW1hbmRSZXN1bHQ8Uj4ge1xuICBjb25zdCBsb2dnZXIgPSBMb2dnaW5nLmZvcihydW5Db21tYW5kKTtcbiAgY29uc3QgYWJvcnQgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgY29uc3QgcmVzdWx0OiBPbWl0PENvbW1hbmRSZXN1bHQsIFwicHJvbWlzZVwiIHwgXCJwaXBlXCI+ID0ge1xuICAgIGFib3J0OiBhYm9ydCxcbiAgICBjb21tYW5kOiBjb21tYW5kLFxuICAgIGxvZ3M6IFtdLFxuICAgIGVycnM6IFtdLFxuICB9O1xuXG4gIGNvbnN0IGxvY2sgPSBuZXcgUHJvbWlzZTxSPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgbGV0IG91dHB1dDtcbiAgICB0cnkge1xuICAgICAgb3V0cHV0ID0gbmV3IG91dHB1dENvbnN0cnVjdG9yKFxuICAgICAgICBjb21tYW5kLFxuICAgICAgICB7XG4gICAgICAgICAgcmVzb2x2ZSxcbiAgICAgICAgICByZWplY3QsXG4gICAgICAgIH0sXG4gICAgICAgIC4uLmFyZ3NcbiAgICAgICk7XG5cbiAgICAgIHJlc3VsdC5jbWQgPSBzcGF3bkNvbW1hbmQ8Uj4ob3V0cHV0LCBjb21tYW5kLCBvcHRzLCBhYm9ydCwgbG9nZ2VyKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgRXJyb3IgcnVubmluZyBjb21tYW5kICR7Y29tbWFuZH06ICR7ZX1gKSk7XG4gICAgfVxuXG4gICAgcmVzdWx0LmNtZC5zdGRvdXQuc2V0RW5jb2RpbmcoXCJ1dGY4XCIpO1xuXG4gICAgcmVzdWx0LmNtZC5zdGRvdXQub24oXCJkYXRhXCIsIChjaHVuazogYW55KSA9PiB7XG4gICAgICBjaHVuayA9IGNodW5rLnRvU3RyaW5nKCk7XG4gICAgICByZXN1bHQubG9ncy5wdXNoKGNodW5rKTtcbiAgICAgIG91dHB1dC5kYXRhKGNodW5rKTtcbiAgICB9KTtcblxuICAgIHJlc3VsdC5jbWQuc3RkZXJyLm9uKFwiZGF0YVwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICBkYXRhID0gZGF0YS50b1N0cmluZygpO1xuICAgICAgcmVzdWx0LmVycnMucHVzaChkYXRhKTtcbiAgICAgIG91dHB1dC5lcnJvcihkYXRhKTtcbiAgICB9KTtcblxuICAgIHJlc3VsdC5jbWQub25jZShcImVycm9yXCIsIChlcnI6IEVycm9yKSA9PiB7XG4gICAgICBvdXRwdXQuZXhpdChlcnIubWVzc2FnZSwgcmVzdWx0LmVycnMpO1xuICAgIH0pO1xuXG4gICAgcmVzdWx0LmNtZC5vbmNlKFwiZXhpdFwiLCAoY29kZTogbnVtYmVyID0gMCkgPT4ge1xuICAgICAgaWYgKGFib3J0LnNpZ25hbC5hYm9ydGVkICYmIGNvZGUgPT09IG51bGwpIGNvZGUgPSBBYm9ydENvZGUgYXMgYW55O1xuICAgICAgb3V0cHV0LmV4aXQoY29kZSwgY29kZSA9PT0gMCA/IHJlc3VsdC5sb2dzIDogcmVzdWx0LmVycnMpO1xuICAgIH0pO1xuICB9KTtcblxuICBPYmplY3QuYXNzaWduKHJlc3VsdCwge1xuICAgIHByb21pc2U6IGxvY2ssXG4gICAgcGlwZTogYXN5bmMgPEU+KGNiOiAocjogUikgPT4gRSkgPT4ge1xuICAgICAgY29uc3QgbCA9IGxvZ2dlci5mb3IoXCJwaXBlXCIpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbC52ZXJib3NlKGBFeGVjdXRpbmcgcGlwZSBmdW5jdGlvbiAke2NvbW1hbmR9Li4uYCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogUiA9IGF3YWl0IGxvY2s7XG4gICAgICAgIGwudmVyYm9zZShgUGlwaW5nIG91dHB1dCB0byAke2NiLm5hbWV9OiAke3Jlc3VsdH1gKTtcbiAgICAgICAgcmV0dXJuIGNiKHJlc3VsdCk7XG4gICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgIGwuZXJyb3IoYEVycm9yIHBpcGluZyBjb21tYW5kIG91dHB1dDogJHtlfWApO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQgYXMgQ29tbWFuZFJlc3VsdDxSPjtcbn1cbiIsImltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBwYXRjaFN0cmluZyB9IGZyb20gXCIuL3RleHRcIjtcbmltcG9ydCB7IHJ1bkNvbW1hbmQgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgRGVwZW5kZW5jeU1hcCwgU2ltcGxlRGVwZW5kZW5jeU1hcCB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBMb2dnaW5nIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbmNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZm9yKFwiZnNcIik7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFBhdGNoZXMgYSBmaWxlIHdpdGggZ2l2ZW4gdmFsdWVzLlxuICogQHN1bW1hcnkgUmVhZHMgYSBmaWxlLCBhcHBsaWVzIHBhdGNoZXMgdXNpbmcgVGV4dFV0aWxzLCBhbmQgd3JpdGVzIHRoZSByZXN1bHQgYmFjayB0byB0aGUgZmlsZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBmaWxlIHRvIGJlIHBhdGNoZWQuXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIG51bWJlciB8IHN0cmluZz59IHZhbHVlcyAtIFRoZSB2YWx1ZXMgdG8gcGF0Y2ggaW50byB0aGUgZmlsZS5cbiAqIEByZXR1cm4ge3ZvaWR9XG4gKlxuICogQGZ1bmN0aW9uIHBhdGNoRmlsZVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IHBhdGNoRmlsZVxuICogICBwYXJ0aWNpcGFudCBmc1xuICogICBwYXJ0aWNpcGFudCByZWFkRmlsZVxuICogICBwYXJ0aWNpcGFudCBUZXh0VXRpbHNcbiAqICAgcGFydGljaXBhbnQgd3JpdGVGaWxlXG4gKiAgIENhbGxlci0+PnBhdGNoRmlsZTogQ2FsbCB3aXRoIHBhdGggYW5kIHZhbHVlc1xuICogICBwYXRjaEZpbGUtPj5mczogQ2hlY2sgaWYgZmlsZSBleGlzdHNcbiAqICAgcGF0Y2hGaWxlLT4+cmVhZEZpbGU6IFJlYWQgZmlsZSBjb250ZW50XG4gKiAgIHJlYWRGaWxlLT4+ZnM6IFJlYWQgZmlsZVxuICogICBmcy0tPj5yZWFkRmlsZTogUmV0dXJuIGZpbGUgY29udGVudFxuICogICByZWFkRmlsZS0tPj5wYXRjaEZpbGU6IFJldHVybiBmaWxlIGNvbnRlbnRcbiAqICAgcGF0Y2hGaWxlLT4+VGV4dFV0aWxzOiBQYXRjaCBzdHJpbmdcbiAqICAgVGV4dFV0aWxzLS0+PnBhdGNoRmlsZTogUmV0dXJuIHBhdGNoZWQgY29udGVudFxuICogICBwYXRjaEZpbGUtPj53cml0ZUZpbGU6IFdyaXRlIHBhdGNoZWQgY29udGVudFxuICogICB3cml0ZUZpbGUtPj5mczogV3JpdGUgdG8gZmlsZVxuICogICBmcy0tPj53cml0ZUZpbGU6IEZpbGUgd3JpdHRlblxuICogICB3cml0ZUZpbGUtLT4+cGF0Y2hGaWxlOiBGaWxlIHdyaXR0ZW5cbiAqICAgcGF0Y2hGaWxlLS0+PkNhbGxlcjogUGF0Y2hpbmcgY29tcGxldGVcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZzLXV0aWxzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXRjaEZpbGUoXG4gIHBhdGg6IHN0cmluZyxcbiAgdmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXIgfCBzdHJpbmc+XG4pIHtcbiAgY29uc3QgbG9nID0gbG9nZ2VyLmZvcihwYXRjaEZpbGUpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMocGF0aCkpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBGaWxlIG5vdCBmb3VuZCBhdCBwYXRoIFwiJHtwYXRofVwiLmApO1xuICBsZXQgY29udGVudCA9IHJlYWRGaWxlKHBhdGgpO1xuXG4gIHRyeSB7XG4gICAgbG9nLnZlcmJvc2UoYFBhdGNoaW5nIGZpbGUgXCIke3BhdGh9XCIuLi5gKTtcbiAgICBsb2cuZGVidWcoYHdpdGggdmFsdWU6ICR7SlNPTi5zdHJpbmdpZnkodmFsdWVzKX1gKTtcbiAgICBjb250ZW50ID0gcGF0Y2hTdHJpbmcoY29udGVudCwgdmFsdWVzKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHBhdGNoaW5nIGZpbGU6ICR7ZXJyb3J9YCk7XG4gIH1cbiAgd3JpdGVGaWxlKHBhdGgsIGNvbnRlbnQpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZWFkcyBhIGZpbGUgYW5kIHJldHVybnMgaXRzIGNvbnRlbnQuXG4gKiBAc3VtbWFyeSBSZWFkcyB0aGUgY29udGVudCBvZiBhIGZpbGUgYXQgdGhlIHNwZWNpZmllZCBwYXRoIGFuZCByZXR1cm5zIGl0IGFzIGEgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVGhlIHBhdGggdG8gdGhlIGZpbGUgdG8gYmUgcmVhZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUuXG4gKlxuICogQGZ1bmN0aW9uIHJlYWRGaWxlXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTp1dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZEZpbGUocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbG9nID0gbG9nZ2VyLmZvcihyZWFkRmlsZSk7XG4gIHRyeSB7XG4gICAgbG9nLnZlcmJvc2UoYFJlYWRpbmcgZmlsZSBcIiR7cGF0aH1cIi4uLmApO1xuICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmMocGF0aCwgXCJ1dGY4XCIpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZy52ZXJib3NlKGBFcnJvciByZWFkaW5nIGZpbGUgXCIke3BhdGh9XCI6ICR7ZXJyb3J9YCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciByZWFkaW5nIGZpbGUgXCIke3BhdGh9XCI6ICR7ZXJyb3J9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gV3JpdGVzIGRhdGEgdG8gYSBmaWxlLlxuICogQHN1bW1hcnkgV3JpdGVzIHRoZSBwcm92aWRlZCBkYXRhIHRvIGEgZmlsZSBhdCB0aGUgc3BlY2lmaWVkIHBhdGguXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUaGUgcGF0aCB0byB0aGUgZmlsZSB0byBiZSB3cml0dGVuLlxuICogQHBhcmFtIHtzdHJpbmcgfCBCdWZmZXJ9IGRhdGEgLSBUaGUgZGF0YSB0byBiZSB3cml0dGVuIHRvIHRoZSBmaWxlLlxuICogQHJldHVybiB7dm9pZH1cbiAqXG4gKiBAZnVuY3Rpb24gd3JpdGVGaWxlXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTp1dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVGaWxlKHBhdGg6IHN0cmluZywgZGF0YTogc3RyaW5nIHwgQnVmZmVyKTogdm9pZCB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3Iod3JpdGVGaWxlKTtcbiAgdHJ5IHtcbiAgICBsb2cudmVyYm9zZShgV3JpdGluZyBmaWxlIFwiJHtwYXRofSB3aXRoICR7ZGF0YS5sZW5ndGh9IGJ5dGVzLi4uYCk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLCBkYXRhLCBcInV0ZjhcIik7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nLnZlcmJvc2UoYEVycm9yIHdyaXRpbmcgZmlsZSBcIiR7cGF0aH1cIjogJHtlcnJvcn1gKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHdyaXRpbmcgZmlsZSBcIiR7cGF0aH1cIjogJHtlcnJvcn1gKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYWxsIGZpbGVzIHJlY3Vyc2l2ZWx5IGZyb20gYSBkaXJlY3RvcnkuXG4gKiBAc3VtbWFyeSBUcmF2ZXJzZXMgdGhyb3VnaCBkaXJlY3RvcmllcyBhbmQgc3ViZGlyZWN0b3JpZXMgdG8gY29sbGVjdCBhbGwgZmlsZSBwYXRocy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcCAtIFRoZSBwYXRoIHRvIHN0YXJ0IHNlYXJjaGluZyBmcm9tLlxuICogQHBhcmFtIGZpbHRlclxuICogQHJldHVybiB7c3RyaW5nW119IEFycmF5IG9mIGZpbGUgcGF0aHMuXG4gKlxuICogQGZ1bmN0aW9uIGdldEFsbEZpbGVzXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTpmcy11dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsRmlsZXMoXG4gIHA6IHN0cmluZyxcbiAgZmlsdGVyPzogKGY6IHN0cmluZywgaT86IG51bWJlcikgPT4gYm9vbGVhblxuKTogc3RyaW5nW10ge1xuICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKGdldEFsbEZpbGVzKTtcbiAgY29uc3QgZmlsZXM6IHN0cmluZ1tdID0gW107XG5cbiAgdHJ5IHtcbiAgICBsb2cudmVyYm9zZShgUmV0cmlldmluZyBhbGwgZmlsZXMgZnJvbSBcIiR7cH1cIi4uLmApO1xuICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhwKTtcblxuICAgIGVudHJpZXMuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKHAsIGVudHJ5KTtcbiAgICAgIGNvbnN0IHN0YXQgPSBmcy5zdGF0U3luYyhmdWxsUGF0aCk7XG5cbiAgICAgIGlmIChzdGF0LmlzRmlsZSgpKSB7XG4gICAgICAgIGZpbGVzLnB1c2goZnVsbFBhdGgpO1xuICAgICAgfSBlbHNlIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgZmlsZXMucHVzaCguLi5nZXRBbGxGaWxlcyhmdWxsUGF0aCkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICghZmlsdGVyKSByZXR1cm4gZmlsZXM7XG4gICAgcmV0dXJuIGZpbGVzLmZpbHRlcihmaWx0ZXIpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZy52ZXJib3NlKGBFcnJvciByZXRyaWV2aW5nIGZpbGVzIGZyb20gXCIke3B9XCI6ICR7ZXJyb3J9YCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciByZXRyaWV2aW5nIGZpbGVzIGZyb20gXCIke3B9XCI6ICR7ZXJyb3J9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmFtZUZpbGUoc291cmNlOiBzdHJpbmcsIGRlc3Q6IHN0cmluZykge1xuICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKHJlbmFtZUZpbGUpO1xuICBsZXQgZGVzY3JpcHRvclNvdXJjZSwgZGVzY3JpcHRvckRlc3Q7XG5cbiAgdHJ5IHtcbiAgICBkZXNjcmlwdG9yU291cmNlID0gZnMuc3RhdFN5bmMoc291cmNlKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2cudmVyYm9zZShgU291cmNlIHBhdGggXCIke3NvdXJjZX1cIiBkb2VzIG5vdCBleGlzdDogJHtlcnJvcn1gKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNvdXJjZSBwYXRoIFwiJHtzb3VyY2V9XCIgZG9lcyBub3QgZXhpc3Q6ICR7ZXJyb3J9YCk7XG4gIH1cblxuICB0cnkge1xuICAgIGRlc2NyaXB0b3JEZXN0ID0gZnMuc3RhdFN5bmMoZGVzdCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgLy8gZG8gbm90aGluZy4gaXRzIG9rXG4gIH1cbiAgaWYgKGRlc2NyaXB0b3JEZXN0KSB7XG4gICAgbG9nLnZlcmJvc2UoYERlc3RpbmF0aW9uIHBhdGggXCIke2Rlc3R9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERlc3RpbmF0aW9uIHBhdGggXCIke2Rlc3R9XCIgYWxyZWFkeSBleGlzdHNgKTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgUmVuYW1pbmcgJHtkZXNjcmlwdG9yU291cmNlLmlzRmlsZSgpID8gXCJmaWxlXCIgOiBcImRpcmVjdG9yeVwifSBcIiR7c291cmNlfVwiIHRvIFwiJHtkZXN0fS4uLmBcbiAgICApO1xuICAgIGZzLnJlbmFtZVN5bmMoc291cmNlLCBkZXN0KTtcbiAgICBsb2cudmVyYm9zZShgU3VjY2Vzc2Z1bGx5IHJlbmFtZWQgdG8gXCIke2Rlc3R9XCJgKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBFcnJvciByZW5hbWluZyAke2Rlc2NyaXB0b3JTb3VyY2UuaXNGaWxlKCkgPyBcImZpbGVcIiA6IFwiZGlyZWN0b3J5XCJ9IFwiJHtzb3VyY2V9XCIgdG8gXCIke2Rlc3R9XCI6ICR7ZXJyb3J9YFxuICAgICk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEVycm9yIHJlbmFtaW5nICR7ZGVzY3JpcHRvclNvdXJjZS5pc0ZpbGUoKSA/IFwiZmlsZVwiIDogXCJkaXJlY3RvcnlcIn0gXCIke3NvdXJjZX1cIiB0byBcIiR7ZGVzdH1cIjogJHtlcnJvcn1gXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29weUZpbGUoc291cmNlOiBzdHJpbmcsIGRlc3Q6IHN0cmluZykge1xuICBjb25zdCBsb2cgPSBsb2dnZXIuZm9yKGNvcHlGaWxlKTtcbiAgbGV0IGRlc2NyaXB0b3JTb3VyY2UsIGRlc2NyaXB0b3JEZXN0O1xuICB0cnkge1xuICAgIGRlc2NyaXB0b3JTb3VyY2UgPSBmcy5zdGF0U3luYyhzb3VyY2UpO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZy52ZXJib3NlKGBTb3VyY2UgcGF0aCBcIiR7c291cmNlfVwiIGRvZXMgbm90IGV4aXN0OiAke2Vycm9yfWApO1xuICAgIHRocm93IG5ldyBFcnJvcihgU291cmNlIHBhdGggXCIke3NvdXJjZX1cIiBkb2VzIG5vdCBleGlzdDogJHtlcnJvcn1gKTtcbiAgfVxuICB0cnkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBkZXNjcmlwdG9yRGVzdCA9IGZzLnN0YXRTeW5jKGRlc3QpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBpZiAoZGVzY3JpcHRvclNvdXJjZS5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBsb2cudmVyYm9zZShgRGVzdCBwYXRoIFwiJHtkZXN0fVwiIGRvZXMgbm90IGV4aXN0LiBjcmVhdGluZ2ApO1xuICAgICAgZnMubWtkaXJTeW5jKGRlc3QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHRyeSB7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgQ29weWluZyAke2Rlc2NyaXB0b3JTb3VyY2UuaXNGaWxlKCkgPyBcImZpbGVcIiA6IFwiZGlyZWN0b3J5XCJ9IFwiJHtzb3VyY2V9XCIgdG8gXCIke2Rlc3R9Li4uYFxuICAgICk7XG4gICAgZnMuY3BTeW5jKHNvdXJjZSwgZGVzdCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgbG9nLnZlcmJvc2UoXG4gICAgICBgRXJyb3IgY29weWluZyAke2Rlc2NyaXB0b3JTb3VyY2UuaXNGaWxlKCkgPyBcImZpbGVcIiA6IFwiZGlyZWN0b3J5XCJ9IFwiJHtzb3VyY2V9XCIgdG8gXCIke2Rlc3R9OiAke2Vycm9yfWBcbiAgICApO1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBFcnJvciBjb3B5aW5nICR7ZGVzY3JpcHRvclNvdXJjZS5pc0ZpbGUoKSA/IFwiZmlsZVwiIDogXCJkaXJlY3RvcnlcIn0gXCIke3NvdXJjZX1cIiB0byBcIiR7ZGVzdH06ICR7ZXJyb3J9YFxuICAgICk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZVBhdGgocDogc3RyaW5nKSB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IoZGVsZXRlUGF0aCk7XG4gIHRyeSB7XG4gICAgY29uc3QgZGVzY3JpcHRvciA9IGZzLnN0YXRTeW5jKHApO1xuICAgIGlmIChkZXNjcmlwdG9yLmlzRmlsZSgpKSB7XG4gICAgICBsb2cudmVyYm9zZShgRGVsZXRpbmcgZmlsZSBcIiR7cH0uLi5gKTtcbiAgICAgIGZzLnJtU3luYyhwLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgfSBlbHNlIGlmIChkZXNjcmlwdG9yLmlzRGlyZWN0b3J5KCkpXG4gICAgICBmcy5ybVN5bmMocCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIGxvZy52ZXJib3NlKGBFcnJvciBEZWxldGluZyBcIiR7cH1cIjogJHtlcnJvcn1gKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIERlbGV0aW5nIFwiJHtwfVwiOiAke2Vycm9yfWApO1xuICB9XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBwYWNrYWdlIGluZm9ybWF0aW9uIGZyb20gcGFja2FnZS5qc29uLlxuICogQHN1bW1hcnkgTG9hZHMgYW5kIHBhcnNlcyB0aGUgcGFja2FnZS5qc29uIGZpbGUgZnJvbSBhIHNwZWNpZmllZCBkaXJlY3Rvcnkgb3IgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuIENhbiByZXR1cm4gdGhlIGVudGlyZSBwYWNrYWdlIG9iamVjdCBvciBhIHNwZWNpZmljIHByb3BlcnR5LlxuICogQHBhcmFtIHtzdHJpbmd9IFtwPXByb2Nlc3MuY3dkKCldIC0gVGhlIGRpcmVjdG9yeSBwYXRoIHdoZXJlIHRoZSBwYWNrYWdlLmpzb24gZmlsZSBpcyBsb2NhdGVkLlxuICogQHBhcmFtIHtzdHJpbmd9IFtwcm9wZXJ0eV0gLSBPcHRpb25hbC4gVGhlIHNwZWNpZmljIHByb3BlcnR5IHRvIHJldHJpZXZlIGZyb20gcGFja2FnZS5qc29uLlxuICogQHJldHVybiB7b2JqZWN0IHwgc3RyaW5nfSBUaGUgcGFyc2VkIGNvbnRlbnRzIG9mIHBhY2thZ2UuanNvbiBvciB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS5cbiAqIEBmdW5jdGlvbiBnZXRQYWNrYWdlXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICBwYXJ0aWNpcGFudCBnZXRQYWNrYWdlXG4gKiAgIHBhcnRpY2lwYW50IHJlYWRGaWxlXG4gKiAgIHBhcnRpY2lwYW50IEpTT05cbiAqICAgQ2FsbGVyLT4+Z2V0UGFja2FnZTogQ2FsbCB3aXRoIHBhdGggYW5kIG9wdGlvbmFsIHByb3BlcnR5XG4gKiAgIGdldFBhY2thZ2UtPj5yZWFkRmlsZTogUmVhZCBwYWNrYWdlLmpzb25cbiAqICAgcmVhZEZpbGUtLT4+Z2V0UGFja2FnZTogUmV0dXJuIGZpbGUgY29udGVudFxuICogICBnZXRQYWNrYWdlLT4+SlNPTjogUGFyc2UgZmlsZSBjb250ZW50XG4gKiAgIEpTT04tLT4+Z2V0UGFja2FnZTogUmV0dXJuIHBhcnNlZCBvYmplY3RcbiAqICAgYWx0IHByb3BlcnR5IHNwZWNpZmllZFxuICogICAgIGdldFBhY2thZ2UtPj5nZXRQYWNrYWdlOiBDaGVjayBpZiBwcm9wZXJ0eSBleGlzdHNcbiAqICAgICBhbHQgcHJvcGVydHkgZXhpc3RzXG4gKiAgICAgICBnZXRQYWNrYWdlLS0+PkNhbGxlcjogUmV0dXJuIHByb3BlcnR5IHZhbHVlXG4gKiAgICAgZWxzZSBwcm9wZXJ0eSBkb2Vzbid0IGV4aXN0XG4gKiAgICAgICBnZXRQYWNrYWdlLS0+PkNhbGxlcjogVGhyb3cgRXJyb3JcbiAqICAgICBlbmRcbiAqICAgZWxzZSBubyBwcm9wZXJ0eSBzcGVjaWZpZWRcbiAqICAgICBnZXRQYWNrYWdlLS0+PkNhbGxlcjogUmV0dXJuIGVudGlyZSBwYWNrYWdlIG9iamVjdFxuICogICBlbmRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dXRpbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhY2thZ2UoXG4gIHA6IHN0cmluZyA9IHByb2Nlc3MuY3dkKCksXG4gIHByb3BlcnR5Pzogc3RyaW5nXG4pOiBvYmplY3QgfCBzdHJpbmcge1xuICBsZXQgcGtnOiBhbnk7XG4gIHRyeSB7XG4gICAgcGtnID0gSlNPTi5wYXJzZShyZWFkRmlsZShwYXRoLmpvaW4ocCwgYHBhY2thZ2UuanNvbmApKSk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmV0cmlldmUgcGFja2FnZSBpbmZvcm1hdGlvblwiICR7ZXJyb3J9YCk7XG4gIH1cblxuICBpZiAocHJvcGVydHkpIHtcbiAgICBpZiAoIShwcm9wZXJ0eSBpbiBwa2cpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9wZXJ0eSBcIiR7cHJvcGVydHl9XCIgbm90IGZvdW5kIGluIHBhY2thZ2UuanNvbmApO1xuICAgIHJldHVybiBwa2dbcHJvcGVydHldIGFzIHN0cmluZztcbiAgfVxuICByZXR1cm4gcGtnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0UGFja2FnZUF0dHJpYnV0ZShcbiAgYXR0cjogc3RyaW5nLFxuICB2YWx1ZTogc3RyaW5nLFxuICBwOiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpXG4pOiB2b2lkIHtcbiAgY29uc3QgcGtnID0gZ2V0UGFja2FnZShwKSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBwa2dbYXR0cl0gPSB2YWx1ZTtcbiAgd3JpdGVGaWxlKHBhdGguam9pbihwLCBgcGFja2FnZS5qc29uYCksIEpTT04uc3RyaW5naWZ5KHBrZywgbnVsbCwgMikpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgdGhlIHZlcnNpb24gZnJvbSBwYWNrYWdlLmpzb24uXG4gKiBAc3VtbWFyeSBBIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQgY2FsbHMgZ2V0UGFja2FnZSB0byByZXRyaWV2ZSB0aGUgXCJ2ZXJzaW9uXCIgcHJvcGVydHkgZnJvbSBwYWNrYWdlLmpzb24uXG4gKiBAcGFyYW0ge3N0cmluZ30gW3A9cHJvY2Vzcy5jd2QoKV0gLSBUaGUgZGlyZWN0b3J5IHBhdGggd2hlcmUgdGhlIHBhY2thZ2UuanNvbiBmaWxlIGlzIGxvY2F0ZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB2ZXJzaW9uIHN0cmluZyBmcm9tIHBhY2thZ2UuanNvbi5cbiAqIEBmdW5jdGlvbiBnZXRQYWNrYWdlVmVyc2lvblxuICogQG1lbWJlck9mIG1vZHVsZTpmcy11dGlsc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFja2FnZVZlcnNpb24ocCA9IHByb2Nlc3MuY3dkKCkpOiBzdHJpbmcge1xuICByZXR1cm4gZ2V0UGFja2FnZShwLCBcInZlcnNpb25cIikgYXMgc3RyaW5nO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYWxsIGRlcGVuZGVuY2llcyBmcm9tIHRoZSBwcm9qZWN0LlxuICogQHN1bW1hcnkgRXhlY3V0ZXMgJ25wbSBscyAtLWpzb24nIGNvbW1hbmQgdG8gZ2V0IGEgZGV0YWlsZWQgbGlzdCBvZiBhbGwgZGVwZW5kZW5jaWVzIChwcm9kdWN0aW9uLCBkZXZlbG9wbWVudCwgYW5kIHBlZXIpIGFuZCB0aGVpciB2ZXJzaW9ucy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0aD1wcm9jZXNzLmN3ZCgpXSAtIFRoZSBkaXJlY3RvcnkgcGF0aCBvZiB0aGUgcHJvamVjdC5cbiAqIEByZXR1cm4ge1Byb21pc2U8e3Byb2Q6IEFycmF5PHtuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZ30+LCBkZXY6IEFycmF5PHtuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZ30+LCBwZWVyOiBBcnJheTx7bmFtZTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmd9Pn0+fSBBbiBvYmplY3QgY29udGFpbmluZyBhcnJheXMgb2YgcHJvZHVjdGlvbiwgZGV2ZWxvcG1lbnQsIGFuZCBwZWVyIGRlcGVuZGVuY2llcy5cbiAqIEBmdW5jdGlvbiBnZXREZXBlbmRlbmNpZXNcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2FsbGVyXG4gKiAgIHBhcnRpY2lwYW50IGdldERlcGVuZGVuY2llc1xuICogICBwYXJ0aWNpcGFudCBydW5Db21tYW5kXG4gKiAgIHBhcnRpY2lwYW50IEpTT05cbiAqICAgQ2FsbGVyLT4+Z2V0RGVwZW5kZW5jaWVzOiBDYWxsIHdpdGggb3B0aW9uYWwgcGF0aFxuICogICBnZXREZXBlbmRlbmNpZXMtPj5ydW5Db21tYW5kOiBFeGVjdXRlICducG0gbHMgLS1qc29uJ1xuICogICBydW5Db21tYW5kLS0+PmdldERlcGVuZGVuY2llczogUmV0dXJuIGNvbW1hbmQgb3V0cHV0XG4gKiAgIGdldERlcGVuZGVuY2llcy0+PkpTT046IFBhcnNlIGNvbW1hbmQgb3V0cHV0XG4gKiAgIEpTT04tLT4+Z2V0RGVwZW5kZW5jaWVzOiBSZXR1cm4gcGFyc2VkIG9iamVjdFxuICogICBnZXREZXBlbmRlbmNpZXMtPj5nZXREZXBlbmRlbmNpZXM6IFByb2Nlc3MgZGVwZW5kZW5jaWVzXG4gKiAgIGdldERlcGVuZGVuY2llcy0tPj5DYWxsZXI6IFJldHVybiBwcm9jZXNzZWQgZGVwZW5kZW5jaWVzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmZzLXV0aWxzXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXREZXBlbmRlbmNpZXMoXG4gIHBhdGg6IHN0cmluZyA9IHByb2Nlc3MuY3dkKClcbik6IFByb21pc2U8RGVwZW5kZW5jeU1hcD4ge1xuICBsZXQgcGtnOiBhbnk7XG5cbiAgdHJ5IHtcbiAgICBwa2cgPSBKU09OLnBhcnNlKGF3YWl0IHJ1bkNvbW1hbmQoYG5wbSBscyAtLWpzb25gLCB7IGN3ZDogcGF0aCB9KS5wcm9taXNlKTtcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHJldHJpZXZlIGRlcGVuZGVuY2llczogJHtlfWApO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBjb25zdCBtYXBwZXIgPSAoZW50cnk6IFtzdHJpbmcsIHVua25vd25dLCBpbmRleDogbnVtYmVyKSA9PiAoe1xuICAgIG5hbWU6IGVudHJ5WzBdLFxuICAgIHZlcnNpb246IChlbnRyeVsxXSBhcyBhbnkpLnZlcnNpb24sXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgcHJvZDogT2JqZWN0LmVudHJpZXMocGtnLmRlcGVuZGVuY2llcyB8fCB7fSkubWFwKG1hcHBlciksXG4gICAgZGV2OiBPYmplY3QuZW50cmllcyhwa2cuZGV2RGVwZW5kZW5jaWVzIHx8IHt9KS5tYXAobWFwcGVyKSxcbiAgICBwZWVyOiBPYmplY3QuZW50cmllcyhwa2cucGVlckRlcGVuZGVuY2llcyB8fCB7fSkubWFwKG1hcHBlciksXG4gIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB1cGRhdGVEZXBlbmRlbmNpZXMoKSB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IodXBkYXRlRGVwZW5kZW5jaWVzKTtcbiAgbG9nLmluZm8oXCJjaGVja2luZyBmb3IgdXBkYXRlcy4uLlwiKTtcbiAgYXdhaXQgcnVuQ29tbWFuZChcIm5weCBucG0tY2hlY2stdXBkYXRlcyAtdVwiKS5wcm9taXNlO1xuICBsb2cuaW5mbyhcInVwZGF0aW5nLi4uXCIpO1xuICBhd2FpdCBydW5Db21tYW5kKFwibnB4IG5wbSBydW4gZG8taW5zdGFsbFwiKS5wcm9taXNlO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5zdGFsbElmTm90QXZhaWxhYmxlKFxuICBkZXBzOiBzdHJpbmdbXSB8IHN0cmluZyxcbiAgZGVwZW5kZW5jaWVzPzogU2ltcGxlRGVwZW5kZW5jeU1hcFxuKSB7XG4gIGlmICghZGVwZW5kZW5jaWVzKSB7XG4gICAgY29uc3QgZDogRGVwZW5kZW5jeU1hcCA9IGF3YWl0IGdldERlcGVuZGVuY2llcygpO1xuICAgIGRlcGVuZGVuY2llcyA9IHtcbiAgICAgIHByb2Q6IGQucHJvZD8ubWFwKChwKSA9PiBwLm5hbWUpIHx8IFtdLFxuICAgICAgZGV2OiBkLmRldj8ubWFwKChkKSA9PiBkLm5hbWUpIHx8IFtdLFxuICAgICAgcGVlcjogZC5wZWVyPy5tYXAoKHApID0+IHAubmFtZSkgfHwgW10sXG4gICAgfTtcbiAgfVxuICBjb25zdCB7IHByb2QsIGRldiwgcGVlciB9ID0gZGVwZW5kZW5jaWVzO1xuICBjb25zdCBpbnN0YWxsZWQgPSBBcnJheS5mcm9tKFxuICAgIG5ldyBTZXQoWy4uLihwcm9kIHx8IFtdKSwgLi4uKGRldiB8fCBbXSksIC4uLihwZWVyIHx8IFtdKV0pXG4gICk7XG4gIGRlcHMgPSB0eXBlb2YgZGVwcyA9PT0gXCJzdHJpbmdcIiA/IFtkZXBzXSA6IGRlcHM7XG4gIGNvbnN0IHRvSW5zdGFsbCA9IGRlcHMuZmlsdGVyKChkKSA9PiAhaW5zdGFsbGVkLmluY2x1ZGVzKGQpKTtcblxuICBpZiAodG9JbnN0YWxsLmxlbmd0aCkgYXdhaXQgaW5zdGFsbERlcGVuZGVuY2llcyh7IGRldjogdG9JbnN0YWxsIH0pO1xuICBkZXBlbmRlbmNpZXMuZGV2ID0gZGVwZW5kZW5jaWVzLmRldiB8fCBbXTtcbiAgZGVwZW5kZW5jaWVzLmRldi5wdXNoKC4uLnRvSW5zdGFsbCk7XG4gIHJldHVybiBkZXBlbmRlbmNpZXM7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwdXNoVG9HaXQoKSB7XG4gIGNvbnN0IGxvZyA9IGxvZ2dlci5mb3IocHVzaFRvR2l0KTtcbiAgY29uc3QgZ2l0VXNlciA9IGF3YWl0IHJ1bkNvbW1hbmQoXCJnaXQgY29uZmlnIHVzZXIubmFtZVwiKS5wcm9taXNlO1xuICBjb25zdCBnaXRFbWFpbCA9IGF3YWl0IHJ1bkNvbW1hbmQoXCJnaXQgY29uZmlnIHVzZXIuZW1haWxcIikucHJvbWlzZTtcbiAgbG9nLnZlcmJvc2UoYGNhY2hlZCBnaXQgaWQ6ICR7Z2l0VXNlcn0vJHtnaXRFbWFpbH0uIGNoYW5naW5nIHRvIGF1dG9tYXRpb25gKTtcbiAgYXdhaXQgcnVuQ29tbWFuZCgnZ2l0IGNvbmZpZyB1c2VyLmVtYWlsIFwiYXV0b21hdGlvbkBkZWNhZi50c1wiJykucHJvbWlzZTtcbiAgYXdhaXQgcnVuQ29tbWFuZCgnZ2l0IGNvbmZpZyB1c2VyLm5hbWUgXCJkZWNhZlwiJykucHJvbWlzZTtcbiAgbG9nLmluZm8oXCJQdXNoaW5nIGNoYW5nZXMgdG8gZ2l0Li4uXCIpO1xuICBhd2FpdCBydW5Db21tYW5kKFwiZ2l0IGFkZCAuXCIpLnByb21pc2U7XG4gIGF3YWl0IHJ1bkNvbW1hbmQoYGdpdCBjb21taXQgLW0gXCJyZWZzICMxIC0gYWZ0ZXIgcmVwbyBzZXR1cFwiYCkucHJvbWlzZTtcbiAgYXdhaXQgcnVuQ29tbWFuZChcImdpdCBwdXNoXCIpLnByb21pc2U7XG4gIGF3YWl0IHJ1bkNvbW1hbmQoYGdpdCBjb25maWcgdXNlci5lbWFpbCBcIiR7Z2l0RW1haWx9XCJgKS5wcm9taXNlO1xuICBhd2FpdCBydW5Db21tYW5kKGBnaXQgY29uZmlnIHVzZXIubmFtZSBcIiR7Z2l0VXNlcn1cImApLnByb21pc2U7XG4gIGxvZy52ZXJib3NlKGByZXZlcnRlZCB0byBnaXQgaWQ6ICR7Z2l0VXNlcn0vJHtnaXRFbWFpbH1gKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxEZXBlbmRlbmNpZXMoZGVwZW5kZW5jaWVzOiB7XG4gIHByb2Q/OiBzdHJpbmdbXTtcbiAgZGV2Pzogc3RyaW5nW107XG4gIHBlZXI/OiBzdHJpbmdbXTtcbn0pIHtcbiAgY29uc3QgbG9nID0gbG9nZ2VyLmZvcihpbnN0YWxsRGVwZW5kZW5jaWVzKTtcbiAgY29uc3QgcHJvZCA9IGRlcGVuZGVuY2llcy5wcm9kIHx8IFtdO1xuICBjb25zdCBkZXYgPSBkZXBlbmRlbmNpZXMuZGV2IHx8IFtdO1xuICBjb25zdCBwZWVyID0gZGVwZW5kZW5jaWVzLnBlZXIgfHwgW107XG4gIGlmIChwcm9kLmxlbmd0aCkge1xuICAgIGxvZy5pbmZvKGBJbnN0YWxsaW5nIGRlcGVuZGVuY2llcyAke3Byb2Quam9pbihcIiwgXCIpfS4uLmApO1xuICAgIGF3YWl0IHJ1bkNvbW1hbmQoYG5wbSBpbnN0YWxsICR7cHJvZC5qb2luKFwiIFwiKX1gLCB7IGN3ZDogcHJvY2Vzcy5jd2QoKSB9KVxuICAgICAgLnByb21pc2U7XG4gIH1cbiAgaWYgKGRldi5sZW5ndGgpIHtcbiAgICBsb2cuaW5mbyhgSW5zdGFsbGluZyBkZXZEZXBlbmRlbmNpZXMgJHtkZXYuam9pbihcIiwgXCIpfS4uLmApO1xuICAgIGF3YWl0IHJ1bkNvbW1hbmQoYG5wbSBpbnN0YWxsIC0tc2F2ZS1kZXYgJHtkZXYuam9pbihcIiBcIil9YCwge1xuICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgIH0pLnByb21pc2U7XG4gIH1cbiAgaWYgKHBlZXIubGVuZ3RoKSB7XG4gICAgbG9nLmluZm8oYEluc3RhbGxpbmcgcGVlckRlcGVuZGVuY2llcyAke3BlZXIuam9pbihcIiwgXCIpfS4uLmApO1xuICAgIGF3YWl0IHJ1bkNvbW1hbmQoYG5wbSBpbnN0YWxsIC0tc2F2ZS1wZWVyICR7cGVlci5qb2luKFwiIFwiKX1gLCB7XG4gICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgfSkucHJvbWlzZTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbm9ybWFsaXplSW1wb3J0PFQ+KFxuICBpbXBvcnRQcm9taXNlOiBQcm9taXNlPFQ+XG4pOiBQcm9taXNlPFQ+IHtcbiAgLy8gQ29tbW9uSlMncyBgbW9kdWxlLmV4cG9ydHNgIGlzIHdyYXBwZWQgYXMgYGRlZmF1bHRgIGluIEVTTW9kdWxlLlxuICByZXR1cm4gaW1wb3J0UHJvbWlzZS50aGVuKChtOiBhbnkpID0+IChtLmRlZmF1bHQgfHwgbSkgYXMgVCk7XG59XG4iLCJpbXBvcnQgc2xvZ2FucyBmcm9tIFwiLi4vYXNzZXRzL3Nsb2dhbnMuanNvblwiO1xuaW1wb3J0IHsgc3R5bGUgfSBmcm9tIFwic3R5bGVkLXN0cmluZy1idWlsZGVyXCI7XG5pbXBvcnQgeyBMb2dnZXIgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQXJyYXkgb2YgQU5TSSBjb2xvciBjb2RlcyBmb3IgYmFubmVyIHN0eWxpbmcuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgc2V0IG9mIEFOU0kgY29sb3IgY29kZXMgdXNlZCB0byBzdHlsZSB0aGUgYmFubmVyIHRleHQuXG4gKi9cbmNvbnN0IGNvbG9ycyA9IFtcbiAgXCJcXHgxYlszODs1OzIxNW1cIiwgLy8gc29mdCBvcmFuZ2VcbiAgXCJcXHgxYlszODs1OzIwOW1cIiwgLy8gY29yYWxcbiAgXCJcXHgxYlszODs1OzIwNW1cIiwgLy8gcGlua1xuICBcIlxceDFiWzM4OzU7MjEwbVwiLCAvLyBwZWFjaHlcbiAgXCJcXHgxYlszODs1OzIxN21cIiwgLy8gc2FsbW9uXG4gIFwiXFx4MWJbMzg7NTsyMTZtXCIsIC8vIGxpZ2h0IGNvcmFsXG4gIFwiXFx4MWJbMzg7NTsyMjRtXCIsIC8vIGxpZ2h0IHBlYWNoXG4gIFwiXFx4MWJbMzg7NTsyMzBtXCIsIC8vIHNvZnQgY3JlYW1cbiAgXCJcXHgxYlszODs1OzIzMG1cIiwgLy8gc29mdCBjcmVhbVxuXTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJpbnRzIGEgc3R5bGVkIGJhbm5lciB0byB0aGUgY29uc29sZS5cbiAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhbmQgcHJpbnRzIGEgY29sb3JmdWwgQVNDSUkgYXJ0IGJhbm5lciB3aXRoIGEgcmFuZG9tIHNsb2dhbi5cbiAqIEBwYXJhbSB7TG9nZ2VyfSBbbG9nZ2VyXSAtIE9wdGlvbmFsIGxvZ2dlciBmb3IgdmVyYm9zZSBvdXRwdXQuXG4gKiBAZnVuY3Rpb24gcHJpbnRCYW5uZXJcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgcHJpbnRCYW5uZXJcbiAqICAgcGFydGljaXBhbnQgZ2V0U2xvZ2FuXG4gKiAgIHBhcnRpY2lwYW50IHBhZEVuZFxuICogICBwYXJ0aWNpcGFudCBjb25zb2xlXG4gKiAgIHByaW50QmFubmVyLT4+Z2V0U2xvZ2FuOiBDYWxsIGdldFNsb2dhbigpXG4gKiAgIGdldFNsb2dhbi0tPj5wcmludEJhbm5lcjogUmV0dXJuIHJhbmRvbSBzbG9nYW5cbiAqICAgcHJpbnRCYW5uZXItPj5wcmludEJhbm5lcjogQ3JlYXRlIGJhbm5lciBBU0NJSSBhcnRcbiAqICAgcHJpbnRCYW5uZXItPj5wcmludEJhbm5lcjogU3BsaXQgYmFubmVyIGludG8gbGluZXNcbiAqICAgcHJpbnRCYW5uZXItPj5wcmludEJhbm5lcjogQ2FsY3VsYXRlIG1heCBsaW5lIGxlbmd0aFxuICogICBwcmludEJhbm5lci0+PnBhZEVuZDogQ2FsbCBwYWRFbmQgd2l0aCBzbG9nYW5cbiAqICAgcGFkRW5kLS0+PnByaW50QmFubmVyOiBSZXR1cm4gcGFkZGVkIHNsb2dhbiBsaW5lXG4gKiAgIGxvb3AgRm9yIGVhY2ggYmFubmVyIGxpbmVcbiAqICAgICBwcmludEJhbm5lci0+PnN0eWxlOiBDYWxsIHN0eWxlKGxpbmUpXG4gKiAgICAgc3R5bGUtLT4+cHJpbnRCYW5uZXI6IFJldHVybiBzdHlsZWQgbGluZVxuICogICAgIHByaW50QmFubmVyLT4+Y29uc29sZTogTG9nIHN0eWxlZCBsaW5lXG4gKiAgIGVuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRCYW5uZXIobG9nZ2VyPzogTG9nZ2VyKSB7XG4gIGNvbnN0IG1lc3NhZ2UgPSBnZXRTbG9nYW4oKTtcbiAgY29uc3QgYmFubmVyOiBzdHJpbmcgfCBzdHJpbmdbXSA9XG4gICAgYCMgICAgICAgICAgICAgICAgIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paI4paI4paT4paS4paRICDilpHilpLilpPilojilojilojilojilojilojilpPilpLilpEgICDilpHilpLilpPilojilojilojilojilojilojilpPilpLilpEgIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSAgICAgICDilpHilpLilpPilojilojilojilojilojilojilojilojilpPilpLilpEgIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSBcbiMgICAgICAoICggICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkeKWkeKWkuKWk+KWiOKWk+KWkuKWkSDilpHilpLilpPilojilpPilpLilpEgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkeKWkeKWkuKWk+KWiOKWk+KWkuKWkSDilpHilpLilpPilojilpPilpLilpHilpHilpLilpPilojilpPilpLilpEg4paR4paS4paT4paI4paT4paS4paRICAgICAgICAgICAgICAgICDilpHilpLilpPilojilpPilpLilpEgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAgXG4jICAgICAgICkgKSAgICAgICDilpHilpLilpPilojilpPilpLilpHilpHilpLilpPilojilpPilpLilpEg4paR4paS4paT4paI4paT4paS4paRICAgICAgICDilpHilpLilpPilojilpPilpLilpEgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkeKWkeKWkuKWk+KWiOKWk+KWkuKWkSDilpHilpLilpPilojilpPilpLilpEgICAgICAgICAgICAgICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAg4paR4paS4paT4paI4paT4paS4paRICAgICAgICBcbiMgICAgWz09PT09PT1dICAgIOKWkeKWkuKWk+KWiOKWk+KWkuKWkeKWkeKWkuKWk+KWiOKWk+KWkuKWkSDilpHilpLilpPilojilojilojilojilojilojilpPilpLilpEgICDilpHilpLilpPilojilpPilpLilpEgICAgICAgIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSDilpHilpLilpPilojilojilojilojilojilojilpPilpLilpEgICAgICAgICAgICDilpHilpLilpPilojilpPilpLilpEgICAgICDilpHilpLilpPilojilojilojilojilojilojilpPilpLilpEgIFxuIyAgICAgXFxgLS0tLS3CtCAgICAg4paR4paS4paT4paI4paT4paS4paR4paR4paS4paT4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAg4paR4paS4paT4paI4paT4paS4paRICAgICAgICDilpHilpLilpPilojilpPilpLilpHilpHilpLilpPilojilpPilpLilpEg4paR4paS4paT4paI4paT4paS4paRICAgICAgICAgICAgICAgICDilpHilpLilpPilojilpPilpLilpEgICAgICAgICAgICDilpHilpLilpPilojilpPilpLilpEgXG4jICAgICAgICAgICAgICAgICDilpHilpLilpPilojilpPilpLilpHilpHilpLilpPilojilpPilpLilpEg4paR4paS4paT4paI4paT4paS4paRICAgICAgICDilpHilpLilpPilojilpPilpLilpHilpHilpLilpPilojilpPilpLilpEg4paR4paS4paT4paI4paT4paS4paR4paR4paS4paT4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAgICAgICAgICAg4paR4paS4paT4paI4paT4paS4paRICAgICAgICAgICAg4paR4paS4paT4paI4paT4paS4paRIFxuIyAgICAgICAgICAgICAgICAg4paR4paS4paT4paI4paI4paI4paI4paI4paI4paI4paT4paS4paRICDilpHilpLilpPilojilojilojilojilojilojilojilojilpPilpLilpEgIOKWkeKWkuKWk+KWiOKWiOKWiOKWiOKWiOKWiOKWk+KWkuKWkSAg4paR4paS4paT4paI4paT4paS4paR4paR4paS4paT4paI4paT4paS4paRIOKWkeKWkuKWk+KWiOKWk+KWkuKWkSAgICAgICAgICAgICAgICAg4paR4paS4paT4paI4paT4paS4paRICAgICDilpHilpLilpPilojilojilojilojilojilojilojilpPilpLilpEgIFxuI2Auc3BsaXQoXCJcXG5cIik7XG4gIGNvbnN0IG1heExlbmd0aCA9IGJhbm5lci5yZWR1Y2UoKG1heCwgbGluZSkgPT4gTWF0aC5tYXgobWF4LCBsaW5lLmxlbmd0aCksIDApO1xuICBiYW5uZXIucHVzaChgIyAgJHttZXNzYWdlLnBhZFN0YXJ0KG1heExlbmd0aCAtIDMpfWApO1xuICBiYW5uZXIuZm9yRWFjaCgobGluZSwgaW5kZXgpID0+IHtcbiAgICAobG9nZ2VyID8gbG9nZ2VyLmluZm8uYmluZChsb2dnZXIpIDogY29uc29sZS5sb2cuYmluZChjb25zb2xlKSkoXG4gICAgICBzdHlsZShsaW5lIHx8IFwiXCIpLnJhdyhjb2xvcnNbaW5kZXhdKS50ZXh0XG4gICAgKTtcbiAgfSk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBhIHNsb2dhbiBmcm9tIHRoZSBwcmVkZWZpbmVkIGxpc3QuXG4gKiBAc3VtbWFyeSBGZXRjaGVzIGEgcmFuZG9tIHNsb2dhbiBvciBhIHNwZWNpZmljIG9uZSBieSBpbmRleCBmcm9tIHRoZSBzbG9nYW5zIGxpc3QuXG4gKiBAcGFyYW0ge251bWJlcn0gW2ldIC0gT3B0aW9uYWwgaW5kZXggdG8gcmV0cmlldmUgYSBzcGVjaWZpYyBzbG9nYW4uXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBzZWxlY3RlZCBzbG9nYW4uXG4gKiBAZnVuY3Rpb24gZ2V0U2xvZ2FuXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IGdldFNsb2dhblxuICogICBwYXJ0aWNpcGFudCBNYXRoLnJhbmRvbVxuICogICBwYXJ0aWNpcGFudCBzbG9nYW5zXG4gKiAgIGFsdCBpIGlzIHVuZGVmaW5lZFxuICogICAgIGdldFNsb2dhbi0+Pk1hdGgucmFuZG9tOiBHZW5lcmF0ZSByYW5kb20gaW5kZXhcbiAqICAgICBNYXRoLnJhbmRvbS0tPj5nZXRTbG9nYW46IFJldHVybiByYW5kb20gaW5kZXhcbiAqICAgZWxzZSBpIGlzIGRlZmluZWRcbiAqICAgICBOb3RlIG92ZXIgZ2V0U2xvZ2FuOiBVc2UgcHJvdmlkZWQgaW5kZXhcbiAqICAgZW5kXG4gKiAgIGdldFNsb2dhbi0+PnNsb2dhbnM6IEFjY2VzcyBzbG9nYW4gYXQgaW5kZXhcbiAqICAgc2xvZ2Fucy0tPj5nZXRTbG9nYW46IFJldHVybiBzbG9nYW5cbiAqICAgYWx0IEVycm9yIG9jY3Vyc1xuICogICAgIGdldFNsb2dhbi0+PmdldFNsb2dhbjogVGhyb3cgZXJyb3JcbiAqICAgZW5kXG4gKiAgIGdldFNsb2dhbi0tPj5DYWxsZXI6IFJldHVybiBzbG9nYW5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNsb2dhbihpPzogbnVtYmVyKTogc3RyaW5nIHtcbiAgdHJ5IHtcbiAgICBpID1cbiAgICAgIHR5cGVvZiBpID09PSBcInVuZGVmaW5lZFwiID8gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogc2xvZ2Fucy5sZW5ndGgpIDogaTtcbiAgICByZXR1cm4gc2xvZ2Fuc1tpXS5TbG9nYW47XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gcmV0cmlldmUgc2xvZ2FuczogJHtlcnJvcn1gKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBAZnVuY3Rpb24gaXNCcm93c2VyXG4gKiBAZGVzY3JpcHRpb24gRGV0ZXJtaW5lcyBpZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBpcyBhIGJyb3dzZXIgYnkgY2hlY2tpbmcgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiB0aGUgZ2xvYmFsIG9iamVjdC5cbiAqIEBzdW1tYXJ5IENoZWNrcyBpZiB0aGUgY29kZSBpcyBydW5uaW5nIGluIGEgYnJvd3NlciBlbnZpcm9ubWVudC5cbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSBlbnZpcm9ubWVudCBpcyBhIGJyb3dzZXIsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQnJvd3NlcigpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YoT2JqZWN0LmdldFByb3RvdHlwZU9mKGdsb2JhbFRoaXMpKSAhPT1cbiAgICBPYmplY3QucHJvdG90eXBlXG4gICk7XG59XG4iLCJpbXBvcnQgeyB0b0VOVkZvcm1hdCB9IGZyb20gXCIuL3RleHRcIjtcbmltcG9ydCB7IEVudmlyb25tZW50RmFjdG9yeSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBpc0Jyb3dzZXIgfSBmcm9tIFwiLi93ZWJcIjtcbmltcG9ydCB7IE9iamVjdEFjY3VtdWxhdG9yIH0gZnJvbSBcInR5cGVkLW9iamVjdC1hY2N1bXVsYXRvclwiO1xuXG4vKipcbiAqIEBjbGFzcyBFbnZpcm9ubWVudFxuICogQGV4dGVuZHMge09iamVjdEFjY3VtdWxhdG9yPFQ+fVxuICogQHRlbXBsYXRlIFRcbiAqIEBkZXNjcmlwdGlvbiBBIGNsYXNzIHJlcHJlc2VudGluZyBhbiBlbnZpcm9ubWVudCB3aXRoIGFjY3VtdWxhdGlvbiBjYXBhYmlsaXRpZXMuXG4gKiBAc3VtbWFyeSBNYW5hZ2VzIGVudmlyb25tZW50LXJlbGF0ZWQgZGF0YSBhbmQgcHJvdmlkZXMgbWV0aG9kcyBmb3IgYWNjdW11bGF0aW9uIGFuZCBrZXkgcmV0cmlldmFsLlxuICogQHBhcmFtIHtUfSBbaW5pdGlhbERhdGFdIC0gVGhlIGluaXRpYWwgZGF0YSB0byBwb3B1bGF0ZSB0aGUgZW52aXJvbm1lbnQgd2l0aC5cbiAqL1xuZXhwb3J0IGNsYXNzIEVudmlyb25tZW50PFQgZXh0ZW5kcyBvYmplY3Q+IGV4dGVuZHMgT2JqZWN0QWNjdW11bGF0b3I8VD4ge1xuICAvKipcbiAgICogQHN0YXRpY1xuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBkZXNjcmlwdGlvbiBBIGZhY3RvcnkgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIEVudmlyb25tZW50IGluc3RhbmNlcy5cbiAgICogQHN1bW1hcnkgRGVmaW5lcyBob3cgbmV3IGluc3RhbmNlcyBvZiB0aGUgRW52aXJvbm1lbnQgY2xhc3Mgc2hvdWxkIGJlIGNyZWF0ZWQuXG4gICAqIEByZXR1cm4ge0Vudmlyb25tZW50PGFueT59IEEgbmV3IGluc3RhbmNlIG9mIHRoZSBFbnZpcm9ubWVudCBjbGFzcy5cbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgZmFjdG9yeTogRW52aXJvbm1lbnRGYWN0b3J5PGFueSwgYW55PiA9XG4gICAgKCk6IEVudmlyb25tZW50PGFueT4gPT4gbmV3IEVudmlyb25tZW50KCk7XG5cbiAgLyoqXG4gICAqIEBzdGF0aWNcbiAgICogQHByaXZhdGVcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVudmlyb25tZW50IGNsYXNzLlxuICAgKiBAdHlwZSB7RW52aXJvbm1lbnQ8YW55Pn1cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogRW52aXJvbm1lbnQ8YW55PjtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBmcm9tRW52KGs6IHN0cmluZykge1xuICAgIGxldCBlbnY6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGlmIChpc0Jyb3dzZXIoKSkge1xuICAgICAgZW52ID0gKGdsb2JhbFRoaXMgYXMgdHlwZW9mIGdsb2JhbFRoaXMgJiB7IEVOVjogUmVjb3JkPHN0cmluZywgYW55PiB9KVtcbiAgICAgICAgXCJFTlZcIlxuICAgICAgXTtcbiAgICB9IGVsc2Uge1xuICAgICAgZW52ID0gZ2xvYmFsVGhpcy5wcm9jZXNzLmVudjtcbiAgICAgIGsgPSB0b0VOVkZvcm1hdChrKTtcbiAgICB9XG4gICAgcmV0dXJuIGVudltrXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBleHBhbmQ8ViBleHRlbmRzIG9iamVjdD4odmFsdWU6IFYpOiB2b2lkIHtcbiAgICBPYmplY3QuZW50cmllcyh2YWx1ZSkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgaywge1xuICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBmcm9tRW52ID0gdGhpcy5mcm9tRW52KGspO1xuICAgICAgICAgIHJldHVybiB0eXBlb2YgZnJvbUVudiA9PT0gXCJ1bmRlZmluZWRcIiA/IHYgOiBmcm9tRW52O1xuICAgICAgICB9LFxuICAgICAgICBzZXQ6ICh2YWw6IFZba2V5b2YgVl0pID0+IHtcbiAgICAgICAgICB2ID0gdmFsO1xuICAgICAgICB9LFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvdGVjdGVkXG4gICAqIEBzdGF0aWNcbiAgICogQGRlc2NyaXB0aW9uIFJldHJpZXZlcyBvciBjcmVhdGVzIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIEVudmlyb25tZW50IGNsYXNzLlxuICAgKiBAc3VtbWFyeSBFbnN1cmVzIG9ubHkgb25lIGluc3RhbmNlIG9mIHRoZSBFbnZpcm9ubWVudCBjbGFzcyBleGlzdHMuXG4gICAqIEB0ZW1wbGF0ZSBFXG4gICAqIEBwYXJhbSB7Li4udW5rbm93bltdfSBhcmdzIC0gQXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGZhY3RvcnkgZnVuY3Rpb24gaWYgYSBuZXcgaW5zdGFuY2UgaXMgY3JlYXRlZC5cbiAgICogQHJldHVybiB7RX0gVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgRW52aXJvbm1lbnQgY2xhc3MuXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdGljIGluc3RhbmNlPEUgZXh0ZW5kcyBFbnZpcm9ubWVudDxhbnk+PiguLi5hcmdzOiB1bmtub3duW10pOiBFIHtcbiAgICBFbnZpcm9ubWVudC5faW5zdGFuY2UgPSAhRW52aXJvbm1lbnQuX2luc3RhbmNlXG4gICAgICA/IEVudmlyb25tZW50LmZhY3RvcnkoLi4uYXJncylcbiAgICAgIDogRW52aXJvbm1lbnQuX2luc3RhbmNlO1xuICAgIHJldHVybiBFbnZpcm9ubWVudC5faW5zdGFuY2UgYXMgRTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAc3RhdGljXG4gICAqIEBkZXNjcmlwdGlvbiBBY2N1bXVsYXRlcyB0aGUgZ2l2ZW4gdmFsdWUgaW50byB0aGUgZW52aXJvbm1lbnQuXG4gICAqIEBzdW1tYXJ5IEFkZHMgbmV3IHByb3BlcnRpZXMgdG8gdGhlIGVudmlyb25tZW50IGZyb20gdGhlIHByb3ZpZGVkIG9iamVjdC5cbiAgICogQHRlbXBsYXRlIFZcbiAgICogQHBhcmFtIHtWfSB2YWx1ZSAtIFRoZSBvYmplY3QgdG8gYWNjdW11bGF0ZSBpbnRvIHRoZSBlbnZpcm9ubWVudC5cbiAgICogQHJldHVybiB7Vn0gVGhlIHVwZGF0ZWQgZW52aXJvbm1lbnQgaW5zdGFuY2UuXG4gICAqL1xuICBzdGF0aWMgYWNjdW11bGF0ZTxWIGV4dGVuZHMgb2JqZWN0PihcbiAgICB2YWx1ZTogVlxuICApOiB0eXBlb2YgRW52aXJvbm1lbnQuX2luc3RhbmNlICZcbiAgICBWICZcbiAgICBPYmplY3RBY2N1bXVsYXRvcjx0eXBlb2YgRW52aXJvbm1lbnQuX2luc3RhbmNlICYgVj4ge1xuICAgIGNvbnN0IGluc3RhbmNlID0gRW52aXJvbm1lbnQuaW5zdGFuY2UoKTtcbiAgICByZXR1cm4gaW5zdGFuY2UuYWNjdW11bGF0ZSh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQHN0YXRpY1xuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIHRoZSBrZXlzIG9mIHRoZSBlbnZpcm9ubWVudCwgb3B0aW9uYWxseSBjb252ZXJ0aW5nIHRoZW0gdG8gRU5WIGZvcm1hdC5cbiAgICogQHN1bW1hcnkgR2V0cyBhbGwga2V5cyBpbiB0aGUgZW52aXJvbm1lbnQsIHdpdGggYW4gb3B0aW9uIHRvIGZvcm1hdCB0aGVtIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RvRW52PXRydWVdIC0gV2hldGhlciB0byBjb252ZXJ0IHRoZSBrZXlzIHRvIEVOViBmb3JtYXQuXG4gICAqIEByZXR1cm4ge3N0cmluZ1tdfSBBbiBhcnJheSBvZiBrZXlzIGZyb20gdGhlIGVudmlyb25tZW50LlxuICAgKi9cbiAgc3RhdGljIGtleXModG9FbnY6IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBFbnZpcm9ubWVudC5pbnN0YW5jZSgpXG4gICAgICAua2V5cygpXG4gICAgICAubWFwKChrKSA9PiAodG9FbnYgPyB0b0VOVkZvcm1hdChrKSA6IGspKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgUGFyc2VBcmdzUmVzdWx0IH0gZnJvbSBcIi4uL2lucHV0L3R5cGVzXCI7XG5pbXBvcnQgeyBDb21tYW5kT3B0aW9ucyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBVc2VySW5wdXQgfSBmcm9tIFwiLi4vaW5wdXQvaW5wdXRcIjtcbmltcG9ydCB7IERlZmF1bHRDb21tYW5kT3B0aW9ucywgRGVmYXVsdENvbW1hbmRWYWx1ZXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldERlcGVuZGVuY2llcywgZ2V0UGFja2FnZVZlcnNpb24gfSBmcm9tIFwiLi4vdXRpbHMvZnNcIjtcbmltcG9ydCB7IHByaW50QmFubmVyIH0gZnJvbSBcIi4uL291dHB1dC9jb21tb25cIjtcbmltcG9ydCB7IEVudmlyb25tZW50IH0gZnJvbSBcIi4uL3V0aWxzL2Vudmlyb25tZW50XCI7XG5pbXBvcnQge1xuICBEZWZhdWx0TG9nZ2luZ0NvbmZpZyxcbiAgTG9nZ2VyLFxuICBMb2dnaW5nLFxuICBMb2dnaW5nQ29uZmlnLFxuICBMb2dMZXZlbCxcbn0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5cbi8qKlxuICogQGNsYXNzIENvbW1hbmRcbiAqIEBhYnN0cmFjdFxuICogQHRlbXBsYXRlIEkgLSBUaGUgdHlwZSBvZiBpbnB1dCBvcHRpb25zIGZvciB0aGUgY29tbWFuZC5cbiAqIEB0ZW1wbGF0ZSBSIC0gVGhlIHJldHVybiB0eXBlIG9mIHRoZSBjb21tYW5kIGV4ZWN1dGlvbi5cbiAqIEBtZW1iZXJPZiB1dGlscy9jbGlcbiAqIEBkZXNjcmlwdGlvbiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBjb21tYW5kIGltcGxlbWVudGF0aW9uLlxuICogQHN1bW1hcnkgUHJvdmlkZXMgYSBzdHJ1Y3R1cmUgZm9yIGNyZWF0aW5nIGNvbW1hbmQtbGluZSBpbnRlcmZhY2UgY29tbWFuZHMgd2l0aCBpbnB1dCBoYW5kbGluZywgbG9nZ2luZywgYW5kIGV4ZWN1dGlvbiBmbG93LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQuXG4gKiBAcGFyYW0ge0NvbW1hbmRPcHRpb25zPEk+fSBbaW5wdXRzXSAtIFRoZSBpbnB1dCBvcHRpb25zIGZvciB0aGUgY29tbWFuZC5cbiAqIEBwYXJhbSB7c3RyaW5nW119IFtyZXF1aXJlbWVudHNdIC0gVGhlIGxpc3Qgb2YgcmVxdWlyZWQgZGVwZW5kZW5jaWVzIGZvciB0aGUgY29tbWFuZC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbW1hbmQ8SSwgUj4ge1xuICAvKipcbiAgICogQHN0YXRpY1xuICAgKiBAZGVzY3JpcHRpb24gU3RhdGljIGxvZ2dlciBmb3IgdGhlIENvbW1hbmQgY2xhc3MuXG4gICAqIEB0eXBlIHtMb2dnZXJ9XG4gICAqL1xuICBzdGF0aWMgbG9nOiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQGRlc2NyaXB0aW9uIEluc3RhbmNlIGxvZ2dlciBmb3IgdGhlIGNvbW1hbmQuXG4gICAqIEB0eXBlIHtMb2dnZXJ9XG4gICAqL1xuICBwcm90ZWN0ZWQgbG9nOiBMb2dnZXI7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBuYW1lOiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIGlucHV0czogQ29tbWFuZE9wdGlvbnM8ST4gPSB7fSBhcyB1bmtub3duIGFzIENvbW1hbmRPcHRpb25zPEk+LFxuICAgIHByb3RlY3RlZCByZXF1aXJlbWVudHM6IHN0cmluZ1tdID0gW11cbiAgKSB7XG4gICAgaWYgKCFDb21tYW5kLmxvZykge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENvbW1hbmQsIFwibG9nXCIsIHtcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICB2YWx1ZTogTG9nZ2luZy5mb3IoQ29tbWFuZC5uYW1lKSxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5sb2cgPSBDb21tYW5kLmxvZztcbiAgICB9XG4gICAgdGhpcy5sb2cgPSBDb21tYW5kLmxvZy5mb3IodGhpcy5uYW1lKTtcbiAgICB0aGlzLmlucHV0cyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7fSxcbiAgICAgIERlZmF1bHRDb21tYW5kT3B0aW9ucyxcbiAgICAgIGlucHV0c1xuICAgICkgYXMgQ29tbWFuZE9wdGlvbnM8ST47XG4gIH1cblxuICAvKipcbiAgICogQHByb3RlY3RlZFxuICAgKiBAYXN5bmNcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhbGwgcmVxdWlyZWQgZGVwZW5kZW5jaWVzIGFyZSBwcmVzZW50LlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgZGVwZW5kZW5jaWVzIGFuZCBjb21wYXJlcyBpdCBhZ2FpbnN0IHRoZSByZXF1aXJlZCBkZXBlbmRlbmNpZXMgZm9yIHRoZSBjb21tYW5kLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY2hlY2sgaXMgY29tcGxldGUuXG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgIHBhcnRpY2lwYW50IENvbW1hbmRcbiAgICogICBwYXJ0aWNpcGFudCBnZXREZXBlbmRlbmNpZXNcbiAgICogICBwYXJ0aWNpcGFudCBTZXRcbiAgICogICBDb21tYW5kLT4+Z2V0RGVwZW5kZW5jaWVzOiBDYWxsXG4gICAqICAgZ2V0RGVwZW5kZW5jaWVzLS0+PkNvbW1hbmQ6IFJldHVybiB7cHJvZCwgZGV2LCBwZWVyfVxuICAgKiAgIENvbW1hbmQtPj5TZXQ6IENyZWF0ZSBTZXQgZnJvbSBwcm9kLCBkZXYsIHBlZXJcbiAgICogICBTZXQtLT4+Q29tbWFuZDogUmV0dXJuIHVuaXF1ZSBkZXBlbmRlbmNpZXNcbiAgICogICBDb21tYW5kLT4+Q29tbWFuZDogQ29tcGFyZSBhZ2FpbnN0IHJlcXVpcmVtZW50c1xuICAgKiAgIGFsdCBNaXNzaW5nIGRlcGVuZGVuY2llc1xuICAgKiAgICAgQ29tbWFuZC0+PkNvbW1hbmQ6IEFkZCB0byBtaXNzaW5nIGxpc3RcbiAgICogICBlbmRcbiAgICogICBOb3RlIG92ZXIgQ29tbWFuZDogSWYgbWlzc2luZy5sZW5ndGggPiAwLCBoYW5kbGUgbWlzc2luZyBkZXBlbmRlbmNpZXNcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBjaGVja1JlcXVpcmVtZW50cygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHByb2QsIGRldiwgcGVlciB9ID0gYXdhaXQgZ2V0RGVwZW5kZW5jaWVzKCk7XG4gICAgY29uc3QgbWlzc2luZyA9IFtdO1xuICAgIGNvbnN0IGZ1bGxMaXN0ID0gQXJyYXkuZnJvbShcbiAgICAgIG5ldyBTZXQoWy4uLnByb2QsIC4uLmRldiwgLi4ucGVlcl0pLnZhbHVlcygpXG4gICAgKS5tYXAoKGQpID0+IGQubmFtZSk7XG4gICAgZm9yIChjb25zdCBkZXAgb2YgdGhpcy5yZXF1aXJlbWVudHMpXG4gICAgICBpZiAoIWZ1bGxMaXN0LmluY2x1ZGVzKGRlcCkpIG1pc3NpbmcucHVzaChkZXApO1xuXG4gICAgaWYgKCFtaXNzaW5nLmxlbmd0aCkgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQGRlc2NyaXB0aW9uIFByb3ZpZGVzIGhlbHAgaW5mb3JtYXRpb24gZm9yIHRoZSBjb21tYW5kLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBzaG91bGQgYmUgb3ZlcnJpZGRlbiBpbiBkZXJpdmVkIGNsYXNzZXMgdG8gcHJvdmlkZSBzcGVjaWZpYyBoZWxwIGluZm9ybWF0aW9uLlxuICAgKiBAcGFyYW0ge1BhcnNlQXJnc1Jlc3VsdH0gYXJncyAtIFRoZSBwYXJzZWQgY29tbWFuZC1saW5lIGFyZ3VtZW50cy5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIHByb3RlY3RlZCBoZWxwKGFyZ3M6IFBhcnNlQXJnc1Jlc3VsdCk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmxvZy5pbmZvKFxuICAgICAgYFRoaXMgaXMgaGVscC4gSSdtIG5vIHVzZSBiZWNhdXNlIEkgc2hvdWxkIGhhdmUgYmVlbiBvdmVycmlkZGVuLmBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm90ZWN0ZWRcbiAgICogQGFic3RyYWN0XG4gICAqIEBkZXNjcmlwdGlvbiBSdW5zIHRoZSBjb21tYW5kIHdpdGggdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGltcGxlbWVudGVkIGluIGRlcml2ZWQgY2xhc3NlcyB0byBkZWZpbmUgdGhlIGNvbW1hbmQncyBiZWhhdmlvci5cbiAgICogQHBhcmFtIHtQYXJzZUFyZ3NSZXN1bHR9IGFuc3dlcnMgLSBUaGUgcGFyc2VkIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFIgfCBzdHJpbmcgfCB2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgY29tbWFuZCdzIHJlc3VsdC5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBydW48Uj4oXG4gICAgYW5zd2VyczogTG9nZ2luZ0NvbmZpZyAmXG4gICAgICB0eXBlb2YgRGVmYXVsdENvbW1hbmRWYWx1ZXMgJiB7IFtrIGluIGtleW9mIEldOiB1bmtub3duIH1cbiAgKTogUHJvbWlzZTxSIHwgc3RyaW5nIHwgdm9pZD47XG5cbiAgLyoqXG4gICAqIEBhc3luY1xuICAgKiBAZGVzY3JpcHRpb24gRXhlY3V0ZXMgdGhlIGNvbW1hbmQuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIGhhbmRsZXMgdGhlIG92ZXJhbGwgZXhlY3V0aW9uIGZsb3cgb2YgdGhlIGNvbW1hbmQsIGluY2x1ZGluZyBwYXJzaW5nIGFyZ3VtZW50cyxcbiAgICogc2V0dGluZyB1cCBsb2dnaW5nLCBjaGVja2luZyBmb3IgdmVyc2lvbiBvciBoZWxwIHJlcXVlc3RzLCBhbmQgcnVubmluZyB0aGUgY29tbWFuZC5cbiAgICogQHJldHVybnMge1Byb21pc2U8UiB8IHN0cmluZyB8IHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRoZSBjb21tYW5kJ3MgcmVzdWx0LlxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBDb21tYW5kXG4gICAqICAgcGFydGljaXBhbnQgVXNlcklucHV0XG4gICAqICAgcGFydGljaXBhbnQgTG9nZ2luZ1xuICAgKiAgIHBhcnRpY2lwYW50IGdldFBhY2thZ2VWZXJzaW9uXG4gICAqICAgcGFydGljaXBhbnQgcHJpbnRCYW5uZXJcbiAgICogICBDb21tYW5kLT4+VXNlcklucHV0OiBwYXJzZUFyZ3MoaW5wdXRzKVxuICAgKiAgIFVzZXJJbnB1dC0tPj5Db21tYW5kOiBSZXR1cm4gUGFyc2VBcmdzUmVzdWx0XG4gICAqICAgQ29tbWFuZC0+PkNvbW1hbmQ6IFByb2Nlc3Mgb3B0aW9uc1xuICAgKiAgIENvbW1hbmQtPj5Mb2dnaW5nOiBzZXRDb25maWcob3B0aW9ucylcbiAgICogICBhbHQgdmVyc2lvbiByZXF1ZXN0ZWRcbiAgICogICAgIENvbW1hbmQtPj5nZXRQYWNrYWdlVmVyc2lvbjogQ2FsbFxuICAgKiAgICAgZ2V0UGFja2FnZVZlcnNpb24tLT4+Q29tbWFuZDogUmV0dXJuIHZlcnNpb25cbiAgICogICBlbHNlIGhlbHAgcmVxdWVzdGVkXG4gICAqICAgICBDb21tYW5kLT4+Q29tbWFuZDogaGVscChhcmdzKVxuICAgKiAgIGVsc2UgYmFubmVyIHJlcXVlc3RlZFxuICAgKiAgICAgQ29tbWFuZC0+PnByaW50QmFubmVyOiBDYWxsXG4gICAqICAgZW5kXG4gICAqICAgQ29tbWFuZC0+PkNvbW1hbmQ6IHJ1bihhcmdzKVxuICAgKiAgIGFsdCBlcnJvciBvY2N1cnNcbiAgICogICAgIENvbW1hbmQtPj5Db21tYW5kOiBMb2cgZXJyb3JcbiAgICogICBlbmRcbiAgICogICBDb21tYW5kLS0+PkNvbW1hbmQ6IFJldHVybiByZXN1bHRcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGUoKTogUHJvbWlzZTxSIHwgc3RyaW5nIHwgdm9pZD4ge1xuICAgIGNvbnN0IGFyZ3M6IFBhcnNlQXJnc1Jlc3VsdCA9IFVzZXJJbnB1dC5wYXJzZUFyZ3ModGhpcy5pbnB1dHMpO1xuICAgIGNvbnN0IGVudiA9IEVudmlyb25tZW50LmFjY3VtdWxhdGUoRGVmYXVsdExvZ2dpbmdDb25maWcpXG4gICAgICAuYWNjdW11bGF0ZShEZWZhdWx0Q29tbWFuZFZhbHVlcylcbiAgICAgIC5hY2N1bXVsYXRlKGFyZ3MudmFsdWVzKTtcbiAgICBjb25zdCB7IHRpbWVzdGFtcCwgdmVyYm9zZSwgdmVyc2lvbiwgaGVscCwgbG9nTGV2ZWwsIGxvZ1N0eWxlLCBiYW5uZXIgfSA9XG4gICAgICBlbnY7XG5cbiAgICB0aGlzLmxvZy5zZXRDb25maWcoe1xuICAgICAgLi4uZW52LFxuICAgICAgdGltZXN0YW1wOiAhIXRpbWVzdGFtcCxcbiAgICAgIGxldmVsOiBsb2dMZXZlbCBhcyBMb2dMZXZlbCxcbiAgICAgIHN0eWxlOiAhIWxvZ1N0eWxlLFxuICAgICAgdmVyYm9zZTogKHZlcmJvc2UgYXMgbnVtYmVyKSB8fCAwLFxuICAgIH0pO1xuXG4gICAgaWYgKHZlcnNpb24pIHtcbiAgICAgIHJldHVybiBnZXRQYWNrYWdlVmVyc2lvbigpO1xuICAgIH1cblxuICAgIGlmIChoZWxwKSB7XG4gICAgICByZXR1cm4gdGhpcy5oZWxwKGFyZ3MpO1xuICAgIH1cblxuICAgIGlmIChiYW5uZXIpXG4gICAgICBwcmludEJhbm5lcihcbiAgICAgICAgdGhpcy5sb2cuZm9yKHByaW50QmFubmVyLCB7XG4gICAgICAgICAgdGltZXN0YW1wOiBmYWxzZSxcbiAgICAgICAgICBzdHlsZTogZmFsc2UsXG4gICAgICAgICAgY29udGV4dDogZmFsc2UsXG4gICAgICAgICAgbG9nTGV2ZWw6IGZhbHNlLFxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgIGxldCByZXN1bHQ7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMucnVuKGVudik7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhpcy5sb2cuZXJyb3IoYEVycm9yIHdoaWxlIHJ1bm5pbmcgcHJvdmlkZWQgY2xpIGZ1bmN0aW9uOiAke2V9YCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQgYXMgUjtcbiAgfVxufVxuIiwiaW1wb3J0IGh0dHBzIGZyb20gXCJodHRwc1wiO1xuaW1wb3J0IHsgTG9nZ2luZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIHNpbXBsZSBIVFRQIGNsaWVudCBmb3IgZG93bmxvYWRpbmcgZmlsZXMuXG4gKiBAc3VtbWFyeSBUaGlzIGNsYXNzIHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgdG8gZG93bmxvYWQgZmlsZXMgZnJvbSBIVFRQUyBVUkxzLlxuICogSXQgdXNlcyBOb2RlLmpzIGJ1aWx0LWluIGh0dHBzIG1vZHVsZSB0byBtYWtlIHJlcXVlc3RzLlxuICpcbiAqIEBjbGFzc1xuICovXG5leHBvcnQgY2xhc3MgSHR0cENsaWVudCB7XG4gIHByb3RlY3RlZCBzdGF0aWMgbG9nID0gTG9nZ2luZy5mb3IoSHR0cENsaWVudCk7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRG93bmxvYWRzIGEgZmlsZSBmcm9tIGEgZ2l2ZW4gVVJMLlxuICAgKiBAc3VtbWFyeSBUaGlzIG1ldGhvZCBzZW5kcyBhIEdFVCByZXF1ZXN0IHRvIHRoZSBzcGVjaWZpZWQgVVJMIGFuZCByZXR1cm5zIHRoZSByZXNwb25zZSBib2R5IGFzIGEgc3RyaW5nLlxuICAgKiBJdCBoYW5kbGVzIGRpZmZlcmVudCBzY2VuYXJpb3Mgc3VjaCBhcyBub24tMjAwIHN0YXR1cyBjb2RlcyBhbmQgbmV0d29yayBlcnJvcnMuXG4gICAqXG4gICAqIEBwYXJhbSB1cmwgLSBUaGUgVVJMIG9mIHRoZSBmaWxlIHRvIGRvd25sb2FkLlxuICAgKiBAcmV0dXJuIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGZpbGUgY29udGVudCBhcyBhIHN0cmluZy5cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gICAqICAgcGFydGljaXBhbnQgSHR0cENsaWVudFxuICAgKiAgIHBhcnRpY2lwYW50IEhUVFBTXG4gICAqICAgcGFydGljaXBhbnQgU2VydmVyXG4gICAqICAgQ2xpZW50LT4+SHR0cENsaWVudDogZG93bmxvYWRGaWxlKHVybClcbiAgICogICBIdHRwQ2xpZW50LT4+SFRUUFM6IGdldCh1cmwpXG4gICAqICAgSFRUUFMtPj5TZXJ2ZXI6IEdFVCByZXF1ZXN0XG4gICAqICAgU2VydmVyLS0+PkhUVFBTOiBSZXNwb25zZVxuICAgKiAgIEhUVFBTLS0+Pkh0dHBDbGllbnQ6IFJlc3BvbnNlIG9iamVjdFxuICAgKiAgIGFsdCBTdGF0dXMgY29kZSBpcyAyMDBcbiAgICogICAgIGxvb3AgRm9yIGVhY2ggZGF0YSBjaHVua1xuICAgKiAgICAgICBIVFRQUy0+Pkh0dHBDbGllbnQ6ICdkYXRhJyBldmVudFxuICAgKiAgICAgICBIdHRwQ2xpZW50LT4+SHR0cENsaWVudDogQWNjdW11bGF0ZSBkYXRhXG4gICAqICAgICBlbmRcbiAgICogICAgIEhUVFBTLT4+SHR0cENsaWVudDogJ2VuZCcgZXZlbnRcbiAgICogICAgIEh0dHBDbGllbnQtLT4+Q2xpZW50OiBSZXNvbHZlIHdpdGggZGF0YVxuICAgKiAgIGVsc2UgU3RhdHVzIGNvZGUgaXMgbm90IDIwMFxuICAgKiAgICAgSHR0cENsaWVudC0tPj5DbGllbnQ6IFJlamVjdCB3aXRoIGVycm9yXG4gICAqICAgZW5kXG4gICAqL1xuICBzdGF0aWMgYXN5bmMgZG93bmxvYWRGaWxlKHVybDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBmdW5jdGlvbiByZXF1ZXN0KHVybDogc3RyaW5nKSB7XG4gICAgICAgIHVybCA9IGVuY29kZVVSSSh1cmwpO1xuICAgICAgICBodHRwcy5nZXQodXJsLCAocmVzKSA9PiB7XG4gICAgICAgICAgaWYgKHJlcy5zdGF0dXNDb2RlID09PSAzMDEgfHwgcmVzLnN0YXR1c0NvZGUgPT09IDMwNylcbiAgICAgICAgICAgIHJldHVybiByZXF1ZXN0KHJlcy5oZWFkZXJzLmxvY2F0aW9uIGFzIHN0cmluZyk7XG5cbiAgICAgICAgICBpZiAocmVzLnN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgICAgICAgICAgSHR0cENsaWVudC5sb2cuZXJyb3IoXG4gICAgICAgICAgICAgIGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9IChzdGF0dXM6ICR7cmVzLnN0YXR1c0NvZGV9KWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfWApKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGV0IGRhdGEgPSBcIlwiO1xuICAgICAgICAgIHJlcy5vbihcImRhdGFcIiwgKGNodW5rKSA9PiB7XG4gICAgICAgICAgICBkYXRhICs9IGNodW5rO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJlcy5vbihcImVycm9yXCIsIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJlcy5vbihcImVuZFwiLCAoKSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJlcXVlc3QodXJsKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCIuLi9jb21tYW5kXCI7XG5pbXBvcnQgeyBDb21tYW5kT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVmYXVsdENvbW1hbmRPcHRpb25zLCBEZWZhdWx0Q29tbWFuZFZhbHVlcyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIGNvcHlGaWxlLFxuICBkZWxldGVQYXRoLFxuICBnZXRBbGxGaWxlcyxcbiAgZ2V0UGFja2FnZSxcbiAgcGF0Y2hGaWxlLFxuICByZWFkRmlsZSxcbiAgcmVuYW1lRmlsZSxcbiAgcnVuQ29tbWFuZCxcbiAgd3JpdGVGaWxlLFxufSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyByb2xsdXAsIElucHV0T3B0aW9ucywgT3V0cHV0T3B0aW9ucywgUm9sbHVwQnVpbGQgfSBmcm9tIFwicm9sbHVwXCI7XG5pbXBvcnQgdHlwZXNjcmlwdCBmcm9tIFwiQHJvbGx1cC9wbHVnaW4tdHlwZXNjcmlwdFwiO1xuaW1wb3J0IGNvbW1vbmpzIGZyb20gXCJAcm9sbHVwL3BsdWdpbi1jb21tb25qc1wiO1xuaW1wb3J0IHsgbm9kZVJlc29sdmUgfSBmcm9tIFwiQHJvbGx1cC9wbHVnaW4tbm9kZS1yZXNvbHZlXCI7XG5pbXBvcnQganNvbiBmcm9tIFwiQHJvbGx1cC9wbHVnaW4tanNvblwiO1xuaW1wb3J0IHsgTG9nZ2luZ0NvbmZpZyB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuXG5jb25zdCBWRVJTSU9OX1NUUklORyA9IFwiIyNWRVJTSU9OIyNcIjtcblxuZW51bSBNb2RlcyB7XG4gIENKUyA9IFwiY29tbW9uanNcIixcbiAgRVNNID0gXCJlczIwMjJcIixcbn1cblxuY29uc3QgQ29tbWFuZHMgPSBbXCJ1cGRhdGUtc2NyaXB0c1wiLCBcInRhZy1yZWxlYXNlXCIsIFwiYnVpbGQtc2NyaXB0c1wiXTtcblxuY29uc3Qgb3B0aW9ucyA9IHtcbiAgcHJvZDoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICBkZXY6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbiAgZG9jczoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICBjb21tYW5kczoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgIGRlZmF1bHQ6IGZhbHNlLFxuICB9LFxuICBiYW5uZXI6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICBkZWZhdWx0OiBmYWxzZSxcbiAgfSxcbn07XG5cbmV4cG9ydCBjbGFzcyBCdWlsZFNjcmlwdHMgZXh0ZW5kcyBDb21tYW5kPFxuICBDb21tYW5kT3B0aW9uczx0eXBlb2Ygb3B0aW9ucz4sXG4gIHZvaWRcbj4ge1xuICBwcml2YXRlIHJlcGxhY2VtZW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBwcml2YXRlIHJlYWRvbmx5IHBrZ1ZlcnNpb246IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBwa2dOYW1lOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXG4gICAgICBcIkJ1aWxkU2NyaXB0c1wiLFxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgRGVmYXVsdENvbW1hbmRPcHRpb25zLCBvcHRpb25zKSBhcyBDb21tYW5kT3B0aW9uczxcbiAgICAgICAgdHlwZW9mIG9wdGlvbnNcbiAgICAgID5cbiAgICApO1xuICAgIGNvbnN0IHBrZyA9IGdldFBhY2thZ2UoKSBhcyB7IG5hbWU6IHN0cmluZzsgdmVyc2lvbjogc3RyaW5nIH07XG4gICAgY29uc3QgeyBuYW1lLCB2ZXJzaW9uIH0gPSBwa2c7XG4gICAgdGhpcy5wa2dOYW1lID0gbmFtZS5pbmNsdWRlcyhcIkBcIikgPyBuYW1lLnNwbGl0KFwiL1wiKVsxXSA6IG5hbWU7XG4gICAgdGhpcy5wa2dWZXJzaW9uID0gdmVyc2lvbjtcbiAgICB0aGlzLnJlcGxhY2VtZW50c1tWRVJTSU9OX1NUUklOR10gPSB0aGlzLnBrZ1ZlcnNpb247XG4gIH1cblxuICBwYXRjaENqc0ltcG9ydHMoZmlsZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVnZXhwID0gLyhyZXF1aXJlXFwoW1wiJ10pKFxcLi4qPykoW1wiJ11cXClbOyxdKS9nO1xuICAgIGxldCBkYXRhID0gcmVhZEZpbGUoZmlsZSk7XG4gICAgZGF0YSA9IGRhdGEucmVwbGFjZShyZWdleHAsIChtYXRjaCwgLi4uZ3JvdXBzOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgY29uc3QgcmVuYW1lZEZpbGUgPSBncm91cHNbMV0gKyBcIi5janNcIjtcbiAgICAgIGNvbnN0IGRpcm5hbWUgPSBwYXRoLmRpcm5hbWUoZmlsZSkucmVwbGFjZShcImxpYlwiLCBcInNyY1wiKTtcbiAgICAgIGNvbnN0IGZpbGVOYW1lID0gZ3JvdXBzWzFdICsgXCIudHNcIjtcbiAgICAgIGNvbnN0IHNvdXJjZUZpbGVQYXRoID0gcGF0aC5qb2luKGRpcm5hbWUsIGZpbGVOYW1lKTtcblxuICAgICAgbGV0IHJlc3VsdDtcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhzb3VyY2VGaWxlUGF0aCkpIHtcbiAgICAgICAgcmVzdWx0ID0gZ3JvdXBzWzBdICsgZ3JvdXBzWzFdICsgXCIvaW5kZXguY2pzXCIgKyBncm91cHNbMl07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgPSBncm91cHNbMF0gKyByZW5hbWVkRmlsZSArIGdyb3Vwc1syXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgICB3cml0ZUZpbGUoZmlsZSwgZGF0YSk7XG4gIH1cblxuICBwYXRjaEZpbGVzKHA6IHN0cmluZykge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnBhdGNoRmlsZXMpO1xuICAgIGNvbnN0IHsgbmFtZSwgdmVyc2lvbiB9ID0gZ2V0UGFja2FnZSgpIGFzIGFueTtcbiAgICBsb2cuaW5mbyhgUGF0Y2hpbmcgJHtuYW1lfSAke3ZlcnNpb259IG1vZHVsZSBpbiAke3B9Li4uYCk7XG4gICAgY29uc3Qgc3RhdCA9IGZzLnN0YXRTeW5jKHApO1xuICAgIGlmIChzdGF0LmlzRGlyZWN0b3J5KCkpXG4gICAgICBmcy5yZWFkZGlyU3luYyhwLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KVxuICAgICAgICAuZmlsdGVyKChwKSA9PiBwLmlzRmlsZSgpKVxuICAgICAgICAuZm9yRWFjaCgoZmlsZSkgPT5cbiAgICAgICAgICBwYXRjaEZpbGUocGF0aC5qb2luKGZpbGUucGFyZW50UGF0aCwgZmlsZS5uYW1lKSwgdGhpcy5yZXBsYWNlbWVudHMpXG4gICAgICAgICk7XG4gICAgbG9nLnZlcmJvc2UoYE1vZHVsZSAke25hbWV9ICR7dmVyc2lvbn0gcGF0Y2hlZCBpbiAke3B9Li4uYCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkKGlzRGV2OiBib29sZWFuLCBtb2RlOiBNb2RlcywgYnVuZGxlID0gZmFsc2UpIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5idWlsZCk7XG4gICAgbG9nLmluZm8oXG4gICAgICBgQnVpbGRpbmcgJHt0aGlzLnBrZ05hbWV9ICR7dGhpcy5wa2dWZXJzaW9ufSBtb2R1bGUgKCR7bW9kZX0pIGluICR7aXNEZXYgPyBcImRldlwiIDogXCJwcm9kXCJ9IG1vZGUuLi5gXG4gICAgKTtcblxuICAgIGF3YWl0IHJ1bkNvbW1hbmQoXG4gICAgICBgbnB4IHRzYyAtLW1vZHVsZSAke2J1bmRsZSA/IFwiYW1kXCIgOiBtb2RlfSR7aXNEZXYgPyBcIiAtLWlubGluZVNvdXJjZU1hcFwiIDogXCIgLS1zb3VyY2VNYXAgZmFsc2VcIn0gLS1vdXREaXIgJHtidW5kbGUgPyBcImRpc3RcIiA6IGBsaWIke21vZGUgPT09IE1vZGVzLkVTTSA/IFwiL2VzbVwiIDogXCJcIn1gfSR7YnVuZGxlID8gYCAtLWlzb2xhdGVkTW9kdWxlcyBmYWxzZSAtLW91dEZpbGUgJHt0aGlzLnBrZ05hbWV9YCA6IFwiXCJ9YFxuICAgICkucHJvbWlzZTtcbiAgICBsb2cudmVyYm9zZShcbiAgICAgIGBNb2R1bGUgJHt0aGlzLnBrZ05hbWV9ICR7dGhpcy5wa2dWZXJzaW9ufSAoJHttb2RlfSkgYnVpbHQgaW4gJHtpc0RldiA/IFwiZGV2XCIgOiBcInByb2RcIn0gbW9kZS4uLmBcbiAgICApO1xuICAgIGlmIChtb2RlID09PSBNb2Rlcy5DSlMgJiYgIWJ1bmRsZSkge1xuICAgICAgY29uc3QgZmlsZXMgPSBnZXRBbGxGaWxlcyhcbiAgICAgICAgXCJsaWJcIixcbiAgICAgICAgKGZpbGUpID0+IGZpbGUuZW5kc1dpdGgoXCIuanNcIikgJiYgIWZpbGUuaW5jbHVkZXMoXCIvZXNtL1wiKVxuICAgICAgKTtcblxuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIGxvZy52ZXJib3NlKGBQYXRjaGluZyAke2ZpbGV9J3MgY2pzIGltcG9ydHMuLi5gKTtcbiAgICAgICAgY29uc3QgZiA9IGZpbGUucmVwbGFjZShcIi5qc1wiLCBcIi5janNcIik7XG4gICAgICAgIGF3YWl0IHJlbmFtZUZpbGUoZmlsZSwgZik7XG4gICAgICAgIHRoaXMucGF0Y2hDanNJbXBvcnRzKGYpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvcHlBc3NldHMobW9kZTogTW9kZXMpIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5jb3B5QXNzZXRzKTtcbiAgICBsZXQgaGFzQXNzZXRzID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIGhhc0Fzc2V0cyA9IGZzLnN0YXRTeW5jKFwiLi9zcmMvYXNzZXRzXCIpLmlzRGlyZWN0b3J5KCk7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgcmV0dXJuIGxvZy52ZXJib3NlKGBObyBhc3NldHMgZm91bmQgaW4gLi9zcmMvYXNzZXRzIHRvIGNvcHlgKTtcbiAgICB9XG4gICAgaWYgKGhhc0Fzc2V0cylcbiAgICAgIGNvcHlGaWxlKFxuICAgICAgICBcIi4vc3JjL2Fzc2V0c1wiLFxuICAgICAgICBgLi8ke21vZGUgPT09IE1vZGVzLkNKUyA/IFwibGliXCIgOiBcImRpc3RcIn0vYXNzZXRzYFxuICAgICAgKTtcbiAgfVxuXG4gIGFzeW5jIGJ1aWxkQ29tbWFuZHMoKSB7XG4gICAgZm9yIChjb25zdCBjbWQgb2YgQ29tbWFuZHMpIHtcbiAgICAgIGF3YWl0IHRoaXMuYnVuZGxlKE1vZGVzLkNKUywgdHJ1ZSwgdHJ1ZSwgYHNyYy9iaW4vJHtjbWR9LnRzYCwgY21kKTtcbiAgICAgIGxldCBkYXRhID0gcmVhZEZpbGUoYGJpbi8ke2NtZH0uY2pzYCk7XG4gICAgICBkYXRhID0gXCIjIS91c3IvYmluL2VudiBub2RlXFxuXCIgKyBkYXRhO1xuICAgICAgd3JpdGVGaWxlKGBiaW4vJHtjbWR9LmNqc2AsIGRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGJ1bmRsZShcbiAgICBtb2RlOiBNb2RlcyxcbiAgICBpc0RldjogYm9vbGVhbixcbiAgICBpc0xpYjogYm9vbGVhbixcbiAgICBlbnRyeUZpbGU6IHN0cmluZyA9IFwic3JjL2luZGV4LnRzXCIsXG4gICAgbmFtZU92ZXJyaWRlOiBzdHJpbmcgPSB0aGlzLnBrZ05hbWUsXG4gICAgZXh0ZXJuYWxzPzogc3RyaW5nW10sXG4gICAgaW5jbHVkZTogc3RyaW5nW10gPSBbXG4gICAgICBcInByb21wdHNcIixcbiAgICAgIFwic3R5bGVkLXN0cmluZy1idWlsZGVyXCIsXG4gICAgICBcInR5cGVkLW9iamVjdC1hY2N1bXVsYXRvclwiLFxuICAgICAgXCJAZGVjYWYtdHMvbG9nZ2luZ1wiLFxuICAgIF1cbiAgKSB7XG4gICAgY29uc3QgaXNFc20gPSBtb2RlID09PSBNb2Rlcy5FU007XG4gICAgY29uc3QgcGtnTmFtZSA9IHRoaXMucGtnTmFtZTtcblxuICAgIGNvbnN0IGV4dCA9IEFycmF5LmZyb20oXG4gICAgICBuZXcgU2V0KFtcbiAgICAgICAgLi4uW1xuICAgICAgICAgIFwiZnNcIixcbiAgICAgICAgICBcInBhdGhcIixcbiAgICAgICAgICBcInByb2Nlc3NcIixcbiAgICAgICAgICBcInJvbGx1cFwiLFxuICAgICAgICAgIFwiQHJvbGx1cC9wbHVnaW4tdHlwZXNjcmlwdFwiLFxuICAgICAgICAgIFwiQHJvbGx1cC9wbHVnaW4tanNvblwiLFxuICAgICAgICAgIFwiQHJvbGx1cC9wbHVnaW4tY29tbW9uanNcIixcbiAgICAgICAgICBcIkByb2xsdXAvcGx1Z2luLW5vZGUtcmVzb2x2ZVwiLFxuICAgICAgICAgIFwiY2hpbGRfcHJvY2Vzc1wiLFxuICAgICAgICAgIFwidXRpbFwiLFxuICAgICAgICAgIFwiaHR0cHNcIixcbiAgICAgICAgICBcInRzbGliXCIsXG4gICAgICAgIF0sXG4gICAgICAgIC4uLihleHRlcm5hbHMgfHwgW10pLFxuICAgICAgXSlcbiAgICApO1xuXG4gICAgY29uc3QgcGx1Z2lucyA9IFtcbiAgICAgIHR5cGVzY3JpcHQoe1xuICAgICAgICBjb21waWxlck9wdGlvbnM6IHtcbiAgICAgICAgICBtb2R1bGU6IFwiZXNuZXh0XCIsXG4gICAgICAgICAgZGVjbGFyYXRpb246IGZhbHNlLFxuICAgICAgICAgIG91dERpcjogaXNMaWIgPyBcImJpblwiIDogXCJkaXN0XCIsXG4gICAgICAgIH0sXG4gICAgICAgIGluY2x1ZGU6IFtcInNyYy8qKi8qLnRzXCJdLFxuICAgICAgICBleGNsdWRlOiBbXCJub2RlX21vZHVsZXNcIiwgXCIqKi8qLnNwZWMudHNcIl0sXG4gICAgICAgIHRzY29uZmlnOiBcIi4vdHNjb25maWcuanNvblwiLFxuICAgICAgfSksXG4gICAgICBqc29uKCksXG4gICAgXTtcblxuICAgIGlmIChpc0xpYikge1xuICAgICAgcGx1Z2lucy5wdXNoKFxuICAgICAgICBjb21tb25qcyh7XG4gICAgICAgICAgaW5jbHVkZTogW10sXG4gICAgICAgICAgZXhjbHVkZTogZXh0ZXJuYWxzLFxuICAgICAgICB9KSxcbiAgICAgICAgbm9kZVJlc29sdmUoe1xuICAgICAgICAgIHJlc29sdmVPbmx5OiBpbmNsdWRlLFxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnB1dDogSW5wdXRPcHRpb25zID0ge1xuICAgICAgaW5wdXQ6IGVudHJ5RmlsZSxcbiAgICAgIHBsdWdpbnM6IHBsdWdpbnMsXG4gICAgICBleHRlcm5hbDogZXh0LFxuICAgIH07XG5cbiAgICBjb25zdCBvdXRwdXRzOiBPdXRwdXRPcHRpb25zW10gPSBbXG4gICAgICB7XG4gICAgICAgIGZpbGU6IGAke2lzTGliID8gXCJiaW4vXCIgOiBcImRpc3QvXCJ9JHtuYW1lT3ZlcnJpZGUgPyBuYW1lT3ZlcnJpZGUgOiBgLmJ1bmRsZS4keyFpc0RldiA/IFwibWluXCIgOiBcIlwifWB9JHtpc0VzbSA/IFwiLmVzbVwiIDogXCJcIn0uY2pzYCxcbiAgICAgICAgZm9ybWF0OiBpc0xpYiA/IFwiY2pzXCIgOiBpc0VzbSA/IFwiZXNtXCIgOiBcInVtZFwiLFxuICAgICAgICBuYW1lOiBwa2dOYW1lLFxuICAgICAgICBlc01vZHVsZTogaXNFc20sXG4gICAgICAgIHNvdXJjZW1hcDogaXNEZXYgPyBcImlubGluZVwiIDogZmFsc2UsXG4gICAgICAgIGdsb2JhbHM6IHt9LFxuICAgICAgICBleHBvcnRzOiBcImF1dG9cIixcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBidW5kbGUgPSBhd2FpdCByb2xsdXAoaW5wdXQpO1xuICAgICAgY29uc29sZS5sb2coYnVuZGxlLndhdGNoRmlsZXMpO1xuICAgICAgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVPdXRwdXRzKGJ1bmRsZTogUm9sbHVwQnVpbGQpIHtcbiAgICAgICAgZm9yIChjb25zdCBvdXRwdXRPcHRpb25zIG9mIG91dHB1dHMpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgICAgY29uc3QgeyBvdXRwdXQgfSA9IGF3YWl0IGJ1bmRsZS53cml0ZShvdXRwdXRPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBnZW5lcmF0ZU91dHB1dHMoYnVuZGxlKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBidW5kbGU6ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJ1aWxkQnlFbnYoaXNEZXY6IGJvb2xlYW4pIHtcbiAgICB0cnkge1xuICAgICAgZGVsZXRlUGF0aChcImxpYlwiKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBkZWxldGVQYXRoKFwiZGlzdFwiKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICAgIGZzLm1rZGlyU3luYyhcImxpYlwiKTtcbiAgICBmcy5ta2RpclN5bmMoXCJkaXN0XCIpO1xuICAgIGF3YWl0IHRoaXMuYnVpbGQoaXNEZXYsIE1vZGVzLkNKUyk7XG4gICAgYXdhaXQgdGhpcy5idWlsZChpc0RldiwgTW9kZXMuRVNNKTtcbiAgICBhd2FpdCB0aGlzLmJ1bmRsZShNb2Rlcy5DSlMsIHRydWUsIGZhbHNlKTtcbiAgICBhd2FpdCB0aGlzLmJ1bmRsZShNb2Rlcy5FU00sIHRydWUsIGZhbHNlKTtcbiAgICB0aGlzLnBhdGNoRmlsZXMoXCJsaWJcIik7XG4gICAgdGhpcy5wYXRjaEZpbGVzKFwiZGlzdFwiKTtcbiAgICB0aGlzLmNvcHlBc3NldHMoTW9kZXMuQ0pTKTtcbiAgICB0aGlzLmNvcHlBc3NldHMoTW9kZXMuRVNNKTtcbiAgfVxuXG4gIGFzeW5jIGJ1aWxkRGV2KCkge1xuICAgIHJldHVybiB0aGlzLmJ1aWxkQnlFbnYodHJ1ZSk7XG4gIH1cblxuICBhc3luYyBidWlsZFByb2QoKSB7XG4gICAgcmV0dXJuIHRoaXMuYnVpbGRCeUVudihmYWxzZSk7XG4gIH1cblxuICBhc3luYyBidWlsZERvY3MoKSB7XG4gICAgYXdhaXQgcnVuQ29tbWFuZChgbnBtIGluc3RhbGwgYmV0dGVyLWRvY3MgdGFmZnlkYmApLnByb21pc2U7XG4gICAgYXdhaXQgcnVuQ29tbWFuZChgbnB4IG1hcmtkb3duLWluY2x1ZGUgLi93b3JrZG9jcy9yZWFkbWUtbWQuanNvbmApLnByb21pc2U7XG4gICAgYXdhaXQgcnVuQ29tbWFuZChcbiAgICAgIGBucHgganNkb2MgLWMgLi93b3JrZG9jcy9qc2RvY3MuanNvbiAtdCAuL25vZGVfbW9kdWxlcy9iZXR0ZXItZG9jc2BcbiAgICApLnByb21pc2U7XG4gICAgYXdhaXQgcnVuQ29tbWFuZChgbnBtIHJlbW92ZSBiZXR0ZXItZG9jcyB0YWZmeWRiYCkucHJvbWlzZTtcbiAgICBbXG4gICAgICB7XG4gICAgICAgIHNyYzogXCJ3b3JrZG9jcy9hc3NldHNcIixcbiAgICAgICAgZGVzdDogXCIuL2RvY3Mvd29ya2RvY3MvYXNzZXRzXCIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzcmM6IFwid29ya2RvY3MvcmVwb3J0cy9jb3ZlcmFnZVwiLFxuICAgICAgICBkZXN0OiBcIi4vZG9jcy93b3JrZG9jcy9yZXBvcnRzL2NvdmVyYWdlXCIsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzcmM6IFwid29ya2RvY3MvcmVwb3J0cy9odG1sXCIsXG4gICAgICAgIGRlc3Q6IFwiLi9kb2NzL3dvcmtkb2NzL3JlcG9ydHMvaHRtbFwiLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc3JjOiBcIndvcmtkb2NzL3Jlc291cmNlc1wiLFxuICAgICAgICBkZXN0OiBcIi4vZG9jcy93b3JrZG9jcy9yZXNvdXJjZXNcIixcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHNyYzogXCJMSUNFTlNFLm1kXCIsXG4gICAgICAgIGRlc3Q6IFwiLi9kb2NzL0xJQ0VOU0UubWRcIixcbiAgICAgIH0sXG4gICAgXS5mb3JFYWNoKChmKSA9PiB7XG4gICAgICBjb25zdCB7IHNyYywgZGVzdCB9ID0gZjtcbiAgICAgIGNvcHlGaWxlKHNyYywgZGVzdCk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgcnVuPFI+KFxuICAgIGFuc3dlcnM6IExvZ2dpbmdDb25maWcgJlxuICAgICAgdHlwZW9mIERlZmF1bHRDb21tYW5kVmFsdWVzICYgeyBbayBpbiBrZXlvZiB0eXBlb2Ygb3B0aW9uc106IHVua25vd24gfVxuICApOiBQcm9taXNlPHN0cmluZyB8IHZvaWQgfCBSPiB7XG4gICAgY29uc3QgeyBkZXYsIHByb2QsIGRvY3MsIGNvbW1hbmRzIH0gPSBhbnN3ZXJzO1xuXG4gICAgaWYgKGNvbW1hbmRzKSB7XG4gICAgICBhd2FpdCB0aGlzLmJ1aWxkQ29tbWFuZHMoKTtcbiAgICB9XG5cbiAgICBpZiAoZGV2KSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5idWlsZERldigpO1xuICAgIH1cbiAgICBpZiAocHJvZCkge1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYnVpbGRQcm9kKCk7XG4gICAgfVxuICAgIGlmIChkb2NzKSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5idWlsZERvY3MoKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IHJ1bkNvbW1hbmQgfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IE5vQ0lGTGFnLCBTZW1WZXJzaW9uLCBTZW1WZXJzaW9uUmVnZXggfSBmcm9tIFwiLi4vLi4vdXRpbHMvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBVc2VySW5wdXQgfSBmcm9tIFwiLi4vLi4vaW5wdXQvaW5wdXRcIjtcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiLi4vY29tbWFuZFwiO1xuaW1wb3J0IHsgRGVmYXVsdENvbW1hbmRWYWx1ZXMgfSBmcm9tIFwiLi4vaW5kZXhcIjtcbmltcG9ydCB7IExvZ2dpbmdDb25maWcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuY29uc3Qgb3B0aW9ucyA9IHtcbiAgY2k6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICBkZWZhdWx0OiB0cnVlLFxuICB9LFxuICBtZXNzYWdlOiB7XG4gICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICBzaG9ydDogXCJtXCIsXG4gIH0sXG4gIHRhZzoge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgc2hvcnQ6IFwidFwiLFxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcbiAgfSxcbn07XG5cbi8qKlxuICogQGNsYXNzIFJlbGVhc2VTY3JpcHRcbiAqIEBleHRlbmRzIHtDb21tYW5kfVxuICogQGNhdmVnb3J5IHNjcmlwdHNcbiAqIEBkZXNjcmlwdGlvbiBBIGNvbW1hbmQtbGluZSBzY3JpcHQgZm9yIG1hbmFnaW5nIHJlbGVhc2VzIGFuZCB2ZXJzaW9uIHVwZGF0ZXMuXG4gKiBAc3VtbWFyeSBUaGlzIHNjcmlwdCBhdXRvbWF0ZXMgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgYW5kIHB1c2hpbmcgbmV3IHJlbGVhc2VzLiBJdCBoYW5kbGVzIHZlcnNpb24gdXBkYXRlcyxcbiAqIGNvbW1pdCBtZXNzYWdlcywgYW5kIG9wdGlvbmFsbHkgcHVibGlzaGVzIHRvIE5QTS4gVGhlIHNjcmlwdCBzdXBwb3J0cyBzZW1hbnRpYyB2ZXJzaW9uaW5nIGFuZCBjYW4gd29yayBpbiBib3RoIENJIGFuZCBub24tQ0kgZW52aXJvbm1lbnRzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgc2NyaXB0XG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9wdGlvbnMuY2kgLSBXaGV0aGVyIHRoZSBzY3JpcHQgaXMgcnVubmluZyBpbiBhIENJIGVudmlyb25tZW50IChkZWZhdWx0OiB0cnVlKVxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubWVzc2FnZSAtIFRoZSByZWxlYXNlIG1lc3NhZ2UgKHNob3J0OiAnbScpXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9ucy50YWcgLSBUaGUgdmVyc2lvbiB0YWcgdG8gdXNlIChzaG9ydDogJ3QnLCBkZWZhdWx0OiB1bmRlZmluZWQpXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWxlYXNlU2NyaXB0IGV4dGVuZHMgQ29tbWFuZDx0eXBlb2Ygb3B0aW9ucywgdm9pZD4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlJlbGVhc2VTY3JpcHRcIiwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIHRoZSB2ZXJzaW9uIGZvciB0aGUgcmVsZWFzZS5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgdmFsaWRhdGVzIHRoZSBwcm92aWRlZCB0YWcgb3IgcHJvbXB0cyB0aGUgdXNlciBmb3IgYSBuZXcgb25lIGlmIG5vdCBwcm92aWRlZCBvciBpbnZhbGlkLlxuICAgKiBJdCBhbHNvIGRpc3BsYXlzIHRoZSBsYXRlc3QgZ2l0IHRhZ3MgZm9yIHJlZmVyZW5jZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhZyAtIFRoZSB2ZXJzaW9uIHRhZyB0byBwcmVwYXJlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IFRoZSBwcmVwYXJlZCB2ZXJzaW9uIHRhZ1xuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBSIGFzIFJlbGVhc2VTY3JpcHRcbiAgICogICBwYXJ0aWNpcGFudCBUIGFzIFRlc3RWZXJzaW9uXG4gICAqICAgcGFydGljaXBhbnQgVSBhcyBVc2VySW5wdXRcbiAgICogICBwYXJ0aWNpcGFudCBHIGFzIEdpdFxuICAgKiAgIFItPj5UOiB0ZXN0VmVyc2lvbih0YWcpXG4gICAqICAgYWx0IHRhZyBpcyB2YWxpZFxuICAgKiAgICAgVC0tPj5SOiByZXR1cm4gdGFnXG4gICAqICAgZWxzZSB0YWcgaXMgaW52YWxpZCBvciBub3QgcHJvdmlkZWRcbiAgICogICAgIFItPj5HOiBMaXN0IGxhdGVzdCBnaXQgdGFnc1xuICAgKiAgICAgUi0+PlU6IFByb21wdCBmb3IgbmV3IHRhZ1xuICAgKiAgICAgVS0tPj5SOiByZXR1cm4gbmV3IHRhZ1xuICAgKiAgIGVuZFxuICAgKi9cbiAgYXN5bmMgcHJlcGFyZVZlcnNpb24odGFnPzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5wcmVwYXJlVmVyc2lvbik7XG4gICAgdGFnID0gdGhpcy50ZXN0VmVyc2lvbigodGFnIGFzIHN0cmluZykgfHwgXCJcIik7XG4gICAgaWYgKCF0YWcpIHtcbiAgICAgIGxvZy52ZXJib3NlKFwiTm8gcmVsZWFzZSBtZXNzYWdlIHByb3ZpZGVkLiBQcm9tcHRpbmcgZm9yIG9uZTpcIik7XG4gICAgICBsb2cuaW5mbyhgTGlzdGluZyBsYXRlc3QgZ2l0IHRhZ3M6YCk7XG4gICAgICBhd2FpdCBydW5Db21tYW5kKFwiZ2l0IHRhZyAtLXNvcnQ9LXRhZ2dlcmRhdGUgfCBoZWFkIC1uIDVcIikucHJvbWlzZTtcbiAgICAgIHJldHVybiBhd2FpdCBVc2VySW5wdXQuaW5zaXN0Rm9yVGV4dChcbiAgICAgICAgXCJ0YWdcIixcbiAgICAgICAgXCJFbnRlciB0aGUgbmV3IHRhZyBudW1iZXIgKGFjY2VwdHMgdiouKi4qWy0uLi5dKVwiLFxuICAgICAgICAodmFsKSA9PlxuICAgICAgICAgICEhdmFsLnRvU3RyaW5nKCkubWF0Y2goL152WzAtOV0rXFwuWzAtOV0rLlswLTldKygtWzAtOWEtekEtWi1dKyk/JC8pXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGFnO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUZXN0cyBpZiB0aGUgcHJvdmlkZWQgdmVyc2lvbiBpcyB2YWxpZC5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSB2ZXJzaW9uIGlzIGEgdmFsaWQgc2VtYW50aWMgdmVyc2lvbiBvciBhIHByZWRlZmluZWQgdXBkYXRlIHR5cGUgKFBBVENILCBNSU5PUiwgTUFKT1IpLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uIHRvIHRlc3RcbiAgICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH0gVGhlIHZhbGlkYXRlZCB2ZXJzaW9uIG9yIHVuZGVmaW5lZCBpZiBpbnZhbGlkXG4gICAqL1xuICB0ZXN0VmVyc2lvbih2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGxvZyA9IHRoaXMubG9nLmZvcih0aGlzLnRlc3RWZXJzaW9uKTtcbiAgICB2ZXJzaW9uID0gdmVyc2lvbi50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBzd2l0Y2ggKHZlcnNpb24pIHtcbiAgICAgIGNhc2UgU2VtVmVyc2lvbi5QQVRDSDpcbiAgICAgIGNhc2UgU2VtVmVyc2lvbi5NSU5PUjpcbiAgICAgIGNhc2UgU2VtVmVyc2lvbi5NQUpPUjpcbiAgICAgICAgbG9nLnZlcmJvc2UoYFVzaW5nIHByb3ZpZGVkIFNlbVZlciB1cGRhdGU6ICR7dmVyc2lvbn1gLCAxKTtcbiAgICAgICAgcmV0dXJuIHZlcnNpb247XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBsb2cudmVyYm9zZShcbiAgICAgICAgICBgVGVzdGluZyBwcm92aWRlZCB2ZXJzaW9uIGZvciBTZW1WZXIgY29tcGF0aWJpbGl0eTogJHt2ZXJzaW9ufWAsXG4gICAgICAgICAgMVxuICAgICAgICApO1xuICAgICAgICBpZiAoIW5ldyBSZWdFeHAoU2VtVmVyc2lvblJlZ2V4KS50ZXN0KHZlcnNpb24pKSB7XG4gICAgICAgICAgbG9nLmRlYnVnKGBJbnZhbGlkIHZlcnNpb24gbnVtYmVyOiAke3ZlcnNpb259YCk7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsb2cudmVyYm9zZShgdmVyc2lvbiBhcHByb3ZlZDogJHt2ZXJzaW9ufWAsIDEpO1xuICAgICAgICByZXR1cm4gdmVyc2lvbjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByZXBhcmVzIHRoZSByZWxlYXNlIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIGVpdGhlciByZXR1cm5zIHRoZSBwcm92aWRlZCBtZXNzYWdlIG9yIHByb21wdHMgdGhlIHVzZXIgZm9yIGEgbmV3IG9uZSBpZiBub3QgcHJvdmlkZWQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbWVzc2FnZV0gLSBUaGUgcmVsZWFzZSBtZXNzYWdlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHN0cmluZz59IFRoZSBwcmVwYXJlZCByZWxlYXNlIG1lc3NhZ2VcbiAgICovXG4gIGFzeW5jIHByZXBhcmVNZXNzYWdlKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5wcmVwYXJlTWVzc2FnZSk7XG4gICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICBsb2cudmVyYm9zZShcIk5vIHJlbGVhc2UgbWVzc2FnZSBwcm92aWRlZC4gUHJvbXB0aW5nIGZvciBvbmVcIik7XG4gICAgICByZXR1cm4gYXdhaXQgVXNlcklucHV0Lmluc2lzdEZvclRleHQoXG4gICAgICAgIFwibWVzc2FnZVwiLFxuICAgICAgICBcIldoYXQgc2hvdWxkIGJlIHRoZSByZWxlYXNlIG1lc3NhZ2UvdGlja2V0P1wiLFxuICAgICAgICAodmFsKSA9PiAhIXZhbCAmJiB2YWwudG9TdHJpbmcoKS5sZW5ndGggPiA1XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUnVucyB0aGUgcmVsZWFzZSBzY3JpcHQuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIG9yY2hlc3RyYXRlcyB0aGUgZW50aXJlIHJlbGVhc2UgcHJvY2VzcywgaW5jbHVkaW5nIHZlcnNpb24gcHJlcGFyYXRpb24sIG1lc3NhZ2UgY3JlYXRpb24sXG4gICAqIGdpdCBvcGVyYXRpb25zLCBhbmQgbnBtIHB1Ymxpc2hpbmcgKGlmIG5vdCBpbiBDSSBlbnZpcm9ubWVudCkuXG4gICAqIEBwYXJhbSB7UGFyc2VBcmdzUmVzdWx0fSBhcmdzIC0gVGhlIHBhcnNlZCBjb21tYW5kLWxpbmUgYXJndW1lbnRzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogICBwYXJ0aWNpcGFudCBSIGFzIFJlbGVhc2VTY3JpcHRcbiAgICogICBwYXJ0aWNpcGFudCBWIGFzIFByZXBhcmVWZXJzaW9uXG4gICAqICAgcGFydGljaXBhbnQgTSBhcyBQcmVwYXJlTWVzc2FnZVxuICAgKiAgIHBhcnRpY2lwYW50IE4gYXMgTlBNXG4gICAqICAgcGFydGljaXBhbnQgRyBhcyBHaXRcbiAgICogICBwYXJ0aWNpcGFudCBVIGFzIFVzZXJJbnB1dFxuICAgKiAgIFItPj5WOiBwcmVwYXJlVmVyc2lvbih0YWcpXG4gICAqICAgUi0+Pk06IHByZXBhcmVNZXNzYWdlKG1lc3NhZ2UpXG4gICAqICAgUi0+Pk46IFJ1biBwcmVwYXJlLXJlbGVhc2Ugc2NyaXB0XG4gICAqICAgUi0+Pkc6IENoZWNrIGdpdCBzdGF0dXNcbiAgICogICBhbHQgY2hhbmdlcyBleGlzdFxuICAgKiAgICAgUi0+PlU6IEFzayBmb3IgY29uZmlybWF0aW9uXG4gICAqICAgICBVLS0+PlI6IENvbmZpcm1cbiAgICogICAgIFItPj5HOiBBZGQgYW5kIGNvbW1pdCBjaGFuZ2VzXG4gICAqICAgZW5kXG4gICAqICAgUi0+Pk46IFVwZGF0ZSBucG0gdmVyc2lvblxuICAgKiAgIFItPj5HOiBQdXNoIGNoYW5nZXMgYW5kIHRhZ3NcbiAgICogICBhbHQgbm90IENJIGVudmlyb25tZW50XG4gICAqICAgICBSLT4+TjogUHVibGlzaCB0byBucG1cbiAgICogICBlbmRcbiAgICovXG4gIGFzeW5jIHJ1bihcbiAgICBhcmdzOiBMb2dnaW5nQ29uZmlnICZcbiAgICAgIHR5cGVvZiBEZWZhdWx0Q29tbWFuZFZhbHVlcyAmIHsgW2sgaW4ga2V5b2YgdHlwZW9mIG9wdGlvbnNdOiB1bmtub3duIH1cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IHJlc3VsdDogYW55O1xuICAgIGNvbnN0IHsgY2kgfSA9IGFyZ3M7XG4gICAgbGV0IHsgdGFnLCBtZXNzYWdlIH0gPSBhcmdzO1xuICAgIHRhZyA9IGF3YWl0IHRoaXMucHJlcGFyZVZlcnNpb24odGFnIGFzIHN0cmluZyk7XG4gICAgbWVzc2FnZSA9IGF3YWl0IHRoaXMucHJlcGFyZU1lc3NhZ2UobWVzc2FnZSBhcyBzdHJpbmcpO1xuICAgIHJlc3VsdCA9IGF3YWl0IHJ1bkNvbW1hbmQoYG5wbSBydW4gcHJlcGFyZS1yZWxlYXNlIC0tICR7dGFnfSAke21lc3NhZ2V9YCwge1xuICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpLFxuICAgIH0pLnByb21pc2U7XG4gICAgcmVzdWx0ID0gYXdhaXQgcnVuQ29tbWFuZChcImdpdCBzdGF0dXMgLS1wb3JjZWxhaW5cIikucHJvbWlzZTtcbiAgICBhd2FpdCByZXN1bHQ7XG4gICAgaWYgKFxuICAgICAgcmVzdWx0LmxvZ3MubGVuZ3RoICYmXG4gICAgICAoYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgXCJnaXQtY2hhbmdlc1wiLFxuICAgICAgICBcIkRvIHlvdSB3YW50IHRvIHB1c2ggdGhlIGNoYW5nZXMgdG8gdGhlIHJlbW90ZSByZXBvc2l0b3J5P1wiLFxuICAgICAgICB0cnVlXG4gICAgICApKVxuICAgICkge1xuICAgICAgYXdhaXQgcnVuQ29tbWFuZChcImdpdCBhZGQgLlwiKS5wcm9taXNlO1xuICAgICAgYXdhaXQgcnVuQ29tbWFuZChcbiAgICAgICAgYGdpdCBjb21taXQgLW0gXCIke3RhZ30gLSAke21lc3NhZ2V9IC0gYWZ0ZXIgcmVsZWFzZSBwcmVwYXJhdGlvbiR7Y2kgPyBcIlwiIDogTm9DSUZMYWd9XCJgXG4gICAgICApLnByb21pc2U7XG4gICAgfVxuICAgIGF3YWl0IHJ1bkNvbW1hbmQoXG4gICAgICBgbnBtIHZlcnNpb24gXCIke3RhZ31cIiAtbSBcIiR7bWVzc2FnZX0ke2NpID8gXCJcIiA6IE5vQ0lGTGFnfVwiYFxuICAgICkucHJvbWlzZTtcbiAgICBhd2FpdCBydW5Db21tYW5kKFwiZ2l0IHB1c2ggLS1mb2xsb3ctdGFnc1wiKS5wcm9taXNlO1xuICAgIGlmICghY2kpIHtcbiAgICAgIGF3YWl0IHJ1bkNvbW1hbmQoXCJOUE1fVE9LRU49JChjYXQgLm5wbXRva2VuKSBucG0gcHVibGlzaCAtLWFjY2VzcyBwdWJsaWNcIilcbiAgICAgICAgLnByb21pc2U7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gXCIuLi9jb21tYW5kXCI7XG5pbXBvcnQgeyBDb21tYW5kT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZ2V0UGFja2FnZSxcbiAgSHR0cENsaWVudCxcbiAgcGF0Y2hGaWxlLFxuICBwYXRjaFN0cmluZyxcbiAgcnVuQ29tbWFuZCxcbiAgc2V0UGFja2FnZUF0dHJpYnV0ZSxcbiAgU2V0dXBTY3JpcHRLZXksXG4gIFRva2VucyxcbiAgd3JpdGVGaWxlLFxufSBmcm9tIFwiLi4vLi4vdXRpbHNcIjtcbmltcG9ydCB7IERlZmF1bHRDb21tYW5kVmFsdWVzIH0gZnJvbSBcIi4uL2luZGV4XCI7XG5pbXBvcnQgeyBVc2VySW5wdXQgfSBmcm9tIFwiLi4vLi4vaW5wdXRcIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IExvZ2dpbmdDb25maWcgfSBmcm9tIFwiQGRlY2FmLXRzL2xvZ2dpbmdcIjtcblxuY29uc3QgYmFzZVVybCA9XG4gIFwiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2RlY2FmLXRzL3RzLXdvcmtzcGFjZS9tYXN0ZXJcIjtcblxuY29uc3Qgb3B0aW9ucyA9IHtcbiAgdGVtcGxhdGVzOiBbXG4gICAgXCIuZ2l0aHViL0lTU1VFX1RFTVBMQVRFL2J1Z19yZXBvcnQubWRcIixcbiAgICBcIi5naXRodWIvSVNTVUVfVEVNUExBVEUvZmVhdHVyZV9yZXF1ZXN0Lm1kXCIsXG4gICAgXCIuZ2l0aHViL0ZVTkRJTkcueW1sXCIsXG4gIF0sXG4gIHdvcmtmbG93czogW1xuICAgIFwiLmdpdGh1Yi93b3JrZmxvd3MvY29kZXFsLWFuYWx5c2lzLnltbFwiLFxuICAgIFwiLmdpdGh1Yi93b3JrZmxvd3MvamVzdC1jb3ZlcmFnZS55YW1sXCIsXG4gICAgXCIuZ2l0aHViL3dvcmtmbG93cy9ub2RlanMtYnVpbGQtcHJvZC55YW1sXCIsXG4gICAgXCIuZ2l0aHViL3dvcmtmbG93cy9wYWdlcy55YW1sXCIsXG4gICAgXCIuZ2l0aHViL3dvcmtmbG93cy9wdWJsaXNoLW9uLXJlbGVhc2UueWFtbFwiLFxuICAgIFwiLmdpdGh1Yi93b3JrZmxvd3MvcmVsZWFzZS1vbi10YWcueWFtbFwiLFxuICAgIFwiLmdpdGh1Yi93b3JrZmxvd3Mvc255ay1hbmFseXNpcy55YW1sXCIsXG4gIF0sXG4gIGlkZTogW1xuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvQWxsIFRlc3RzLnJ1bi54bWxcIixcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL2J1aWxkLnJ1bi54bWxcIixcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL2J1aWxkX3Byb2QucnVuLnhtbFwiLFxuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvY292ZXJhZ2UucnVuLnhtbFwiLFxuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvZG9jcy5ydW4ueG1sXCIsXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy9kcmF3aW5ncy5ydW4ueG1sXCIsXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy9mbGFzaC1mb3J3YXJkLnJ1bi54bWxcIixcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL0ludGVncmF0aW9uX1Rlc3RzLnJ1bi54bWxcIixcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL0J1bmRsaW5nX1Rlc3RzLnJ1bi54bWxcIixcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL2xpbnQtZml4LnJ1bi54bWxcIixcbiAgICBcIi5pZGVhL3J1bkNvbmZpZ3VyYXRpb25zL3JlbGVhc2UucnVuLnhtbFwiLFxuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvdGVzdF9jaXJjdWxhci5ydW4ueG1sXCIsXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy91bWwucnVuLnhtbFwiLFxuICAgIFwiLmlkZWEvcnVuQ29uZmlndXJhdGlvbnMvVW5pdCBUZXN0cy5ydW4ueG1sXCIsXG4gICAgXCIuaWRlYS9ydW5Db25maWd1cmF0aW9ucy91cGRhdGUtc2NyaXB0cy5ydW4ueG1sXCIsXG4gIF0sXG4gIGRvY3M6IFtcbiAgICBcIndvcmtkb2NzL3R1dG9yaWFscy9Db250cmlidXRpbmcubWRcIixcbiAgICBcIndvcmtkb2NzL3R1dG9yaWFscy9Eb2N1bWVudGF0aW9uLm1kXCIsXG4gICAgXCJ3b3JrZG9jcy90dXRvcmlhbHMvRm9yIERldmVsb3BlcnMubWRcIixcbiAgICBcIndvcmtkb2NzLzItQmFkZ2VzLm1kXCIsXG4gICAgXCJ3b3JrZG9jcy9qc2RvY3MuanNvblwiLFxuICAgIFwid29ya2RvY3MvcmVhZG1lLW1kLmpzb25cIixcbiAgXSxcbiAgc3R5bGVzOiBbXCIucHJldHRpZXJyY1wiLCBcImVzbGludC5jb25maWcuanNcIl0sXG4gIHNjcmlwdHM6IFtcbiAgICBcImJpbi91cGRhdGUtc2NyaXB0cy5janNcIixcbiAgICBcImJpbi90YWctcmVsZWFzZS5janNcIixcbiAgICBcImJpbi9idWlsZC1zY3JpcHRzLmNqc1wiLFxuICBdLFxuICB0ZXN0czogW1wiamVzdC5jb25maWcudHNcIiwgXCJ3b3JrZG9jcy9yZXBvcnRzL2plc3QuY292ZXJhZ2UuY29uZmlnLnRzXCJdLFxuICB0eXBlc2NyaXB0OiBbXCJ0c2NvbmZpZy5qc29uXCJdLFxuICBkb2NrZXI6IFtcIkRvY2tlcmZpbGVcIl0sXG4gIGF1dG9tYXRpb246IFtcbiAgICBcIndvcmtkb2NzL2NvbmZsdWVuY2UvQ29udGludW91cyBJbnRlZ3JhdGlvbi1EZXBsb3ltZW50L0dpdEh1Yi5tZFwiLFxuICAgIFwid29ya2RvY3MvY29uZmx1ZW5jZS9Db250aW51b3VzIEludGVncmF0aW9uLURlcGxveW1lbnQvSmlyYS5tZFwiLFxuICAgIFwid29ya2RvY3MvY29uZmx1ZW5jZS9Db250aW51b3VzIEludGVncmF0aW9uLURlcGxveW1lbnQvVGVhbXMubWRcIixcbiAgXSxcbn07XG5cbmNvbnN0IGFyZ3p6ID0ge1xuICAvLyBpbml0IGF0dHJpYnV0ZXNcbiAgYm9vdDoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICB9LFxuICBvcmc6IHtcbiAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgIHNob3J0OiBcIm9cIixcbiAgfSxcbiAgbmFtZToge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgc2hvcnQ6IFwiblwiLFxuICAgIGRlZmF1bHQ6IHVuZGVmaW5lZCxcbiAgfSxcbiAgYXV0aG9yOiB7XG4gICAgdHlwZTogXCJzdHJpbmdcIixcbiAgICBzaG9ydDogXCJhXCIsXG4gICAgZGVmYXVsdDogdW5kZWZpbmVkLFxuICB9LFxuICAvLyB1cGRhdGUgYXR0cmlidXRlc1xuICBhbGw6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgfSxcbiAgbGljZW5zZToge1xuICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgbWVzc2FnZTogXCJQaWNrIHRoZSBsaWNlbnNlXCIsXG4gIH0sXG4gIHNjcmlwdHM6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgfSxcbiAgc3R5bGVzOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gIH0sXG4gIGRvY3M6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgfSxcbiAgaWRlOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gIH0sXG4gIHdvcmtmbG93czoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICB9LFxuICB0ZW1wbGF0ZXM6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgfSxcbiAgdHlwZXNjcmlwdDoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICB9LFxuICBkb2NrZXI6IHtcbiAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgfSxcbiAgcGtnOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gIH0sXG4gIGRlcGVuZGVuY2llczoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICB9LFxuICB0ZXN0czoge1xuICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICB9LFxuICBhdXRvbWF0aW9uOiB7XG4gICAgdHlwZTogXCJib29sZWFuXCIsXG4gIH0sXG59O1xuXG4vKipcbiAqIEBjbGFzcyBUZW1wbGF0ZVN5bmNcbiAqIEBleHRlbmRzIHtDb21tYW5kfVxuICogQGNhdGVnb3J5IHNjcmlwdHNcbiAqIEBkZXNjcmlwdGlvbiBBIGNvbW1hbmQtbGluZSB0b29sIGZvciBzeW5jaHJvbml6aW5nIHByb2plY3QgdGVtcGxhdGVzIGFuZCBjb25maWd1cmF0aW9ucy5cbiAqIEBzdW1tYXJ5IFRoaXMgY2xhc3MgcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSB0byBkb3dubG9hZCBhbmQgdXBkYXRlIHZhcmlvdXMgcHJvamVjdCBmaWxlcyBhbmQgY29uZmlndXJhdGlvbnMgZnJvbSBhIHJlbW90ZSByZXBvc2l0b3J5LlxuICogSXQgc3VwcG9ydHMgdXBkYXRpbmcgbGljZW5zZXMsIElERSBjb25maWd1cmF0aW9ucywgc2NyaXB0cywgc3R5bGVzLCBkb2N1bWVudGF0aW9uLCB3b3JrZmxvd3MsIGFuZCB0ZW1wbGF0ZXMuXG4gKlxuICogQHBhcmFtIHtDb21tYW5kT3B0aW9uc30gYXJncyAtIFRoZSBjb21tYW5kIG9wdGlvbnMgZm9yIFRlbXBsYXRlU3luY1xuICovXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVTeW5jIGV4dGVuZHMgQ29tbWFuZDxDb21tYW5kT3B0aW9uczx0eXBlb2YgYXJneno+LCB2b2lkPiB7XG4gIHByaXZhdGUgcmVwbGFjZW1lbnRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+ID0ge307XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJUZW1wbGF0ZVN5bmNcIiwgYXJnenopO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkVmFsdWVzRnJvbVBhY2thZ2UoKSB7XG4gICAgY29uc3QgcCA9IHByb2Nlc3MuY3dkKCk7XG4gICAgY29uc3QgYXV0aG9yID0gZ2V0UGFja2FnZShwLCBcImF1dGhvclwiKSBhcyBzdHJpbmc7XG4gICAgY29uc3Qgc2NvcGVkTmFtZSA9IGdldFBhY2thZ2UocCwgXCJuYW1lXCIpO1xuICAgIGxldCBuYW1lOiBzdHJpbmcgPSBzY29wZWROYW1lIGFzIHN0cmluZztcbiAgICBsZXQgb3JnOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgaWYgKG5hbWUuc3RhcnRzV2l0aChcIkBcIikpIHtcbiAgICAgIGNvbnN0IHNwbGl0ID0gbmFtZS5zcGxpdChcIi9cIik7XG4gICAgICBuYW1lID0gc3BsaXRbMV07XG4gICAgICBvcmcgPSBzcGxpdFswXS5yZXBsYWNlKFwiQFwiLCBcIlwiKTtcbiAgICB9XG4gICAgW1wiVGlhZ28gVmVuY2VzbGF1XCIsIFwiVGlhZ29WZW5jZXNsYXVcIiwgXCIke2F1dGhvcn1cIl0uZm9yRWFjaChcbiAgICAgIChlbCkgPT4gKHRoaXMucmVwbGFjZW1lbnRzW2VsXSA9IGF1dGhvcilcbiAgICApO1xuICAgIFtcIlRTLVdvcmtzcGFjZVwiLCBcInRzLXdvcmtzcGFjZVwiLCBcIiR7bmFtZX1cIl0uZm9yRWFjaChcbiAgICAgIChlbCkgPT4gKHRoaXMucmVwbGFjZW1lbnRzW2VsXSA9IG5hbWUpXG4gICAgKTtcbiAgICBbXCJkZWNhZi10c1wiLCBcIiR7b3JnfVwiXS5mb3JFYWNoKFxuICAgICAgKGVsKSA9PiAodGhpcy5yZXBsYWNlbWVudHNbZWxdID0gKG9yZyBhcyBzdHJpbmcpIHx8ICdcIlwiJylcbiAgICApO1xuICAgIHRoaXMucmVwbGFjZW1lbnRzW1wiJHtvcmdfb3Jfb3duZXJ9XCJdID0gb3JnIHx8IG5hbWU7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERvd25sb2FkcyBmaWxlcyBmb3IgYSBzcGVjaWZpYyBvcHRpb24gY2F0ZWdvcnkuXG4gICAqIEBzdW1tYXJ5IFRoaXMgbWV0aG9kIGRvd25sb2FkcyBhbGwgZmlsZXMgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gb3B0aW9uIGtleSBmcm9tIHRoZSByZW1vdGUgcmVwb3NpdG9yeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgcmVwcmVzZW50aW5nIHRoZSBvcHRpb24gY2F0ZWdvcnkgdG8gZG93bmxvYWRcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgc3BlY2lmaWVkIG9wdGlvbiBrZXkgaXMgbm90IGZvdW5kXG4gICAqL1xuICBhc3luYyBkb3dubG9hZE9wdGlvbihrZXk6IGtleW9mIHR5cGVvZiBvcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCEoa2V5IGluIG9wdGlvbnMpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE9wdGlvbiBcIiR7a2V5fVwiIG5vdCBmb3VuZCBpbiBvcHRpb25zYCk7XG4gICAgfVxuICAgIGNvbnN0IGZpbGVzID0gb3B0aW9uc1trZXkgYXMga2V5b2YgdHlwZW9mIG9wdGlvbnNdO1xuXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBEb3dubG9hZGluZyAke2ZpbGV9YCk7XG5cbiAgICAgIGxldCBkYXRhID0gYXdhaXQgSHR0cENsaWVudC5kb3dubG9hZEZpbGUoYCR7YmFzZVVybH0vJHtmaWxlfWApO1xuICAgICAgZGF0YSA9IHBhdGNoU3RyaW5nKGRhdGEsIHRoaXMucmVwbGFjZW1lbnRzKTtcbiAgICAgIHdyaXRlRmlsZShwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgZmlsZSksIGRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRG93bmxvYWRzIGFuZCBzZXRzIHVwIHRoZSBzcGVjaWZpZWQgbGljZW5zZS5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2QgZG93bmxvYWRzIHRoZSBjaG9zZW4gbGljZW5zZSBmaWxlLCBzYXZlcyBpdCB0byB0aGUgcHJvamVjdCwgYW5kIHVwZGF0ZXMgdGhlIHBhY2thZ2UuanNvbiBsaWNlbnNlIGZpZWxkLlxuICAgKiBAcGFyYW0ge1wiTUlUXCIgfCBcIkdQTFwiIHwgXCJBcGFjaGVcIiB8IFwiTEdQTFwiIHwgXCJBR1BMXCJ9IGxpY2Vuc2UgLSBUaGUgbGljZW5zZSB0byBkb3dubG9hZCBhbmQgc2V0IHVwXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZ2V0TGljZW5zZShsaWNlbnNlOiBcIk1JVFwiIHwgXCJHUExcIiB8IFwiQXBhY2hlXCIgfCBcIkxHUExcIiB8IFwiQUdQTFwiKSB7XG4gICAgdGhpcy5sb2cuaW5mbyhgRG93bmxvYWRpbmcgJHtsaWNlbnNlfSBsaWNlbnNlYCk7XG4gICAgY29uc3QgdXJsID0gYCR7YmFzZVVybH0vd29ya2RvY3MvbGljZW5zZXMvJHtsaWNlbnNlfS5tZGA7XG4gICAgbGV0IGRhdGEgPSBhd2FpdCBIdHRwQ2xpZW50LmRvd25sb2FkRmlsZSh1cmwpO1xuICAgIGRhdGEgPSBwYXRjaFN0cmluZyhkYXRhLCB0aGlzLnJlcGxhY2VtZW50cyk7XG4gICAgd3JpdGVGaWxlKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcIkxJQ0VOU0UubWRcIiksIGRhdGEpO1xuICAgIHNldFBhY2thZ2VBdHRyaWJ1dGUoXCJsaWNlbnNlXCIsIGxpY2Vuc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEb3dubG9hZHMgSURFIGNvbmZpZ3VyYXRpb24gZmlsZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZ2V0SWRlKCkge1xuICAgIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCIuaWRlYVwiLCBcInJ1bkNvbmZpZ3VyYXRpb25zXCIpLCB7XG4gICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy5kb3dubG9hZE9wdGlvbihcImlkZVwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlIG5wbSBzY3JpcHRzXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgYXN5bmMgZ2V0U2NyaXB0cygpIHtcbiAgICBhd2FpdCB0aGlzLmRvd25sb2FkT3B0aW9uKFwic2NyaXB0c1wiKTtcbiAgICB0aGlzLmxvZy5pbmZvKFwicGxlYXNlIHJlLXJ1biB0aGUgY29tbWFuZFwiKTtcbiAgICBwcm9jZXNzLmV4aXQoMCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERvd25sb2FkcyBzdHlsZSBjb25maWd1cmF0aW9uIGZpbGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGdldFN0eWxlcyA9ICgpID0+IHRoaXMuZG93bmxvYWRPcHRpb24oXCJzdHlsZXNcIik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEb3dubG9hZHMgdGVtcGxhdGUgZmlsZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgZ2V0VGVtcGxhdGVzID0gKCkgPT4gdGhpcy5kb3dubG9hZE9wdGlvbihcInRlbXBsYXRlc1wiKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIERvd25sb2FkcyB3b3JrZmxvdyBjb25maWd1cmF0aW9uIGZpbGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGdldFdvcmtmbG93cyA9ICgpID0+IHRoaXMuZG93bmxvYWRPcHRpb24oXCJ3b3JrZmxvd3NcIik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEb3dubG9hZHMgZG9jdW1lbnRhdGlvbiBmaWxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBnZXREb2NzID0gKCkgPT4gdGhpcy5kb3dubG9hZE9wdGlvbihcImRvY3NcIik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEb3dubG9hZHMgdHlwZXNjcmlwdCBjb25maWcgZmlsZXMuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgZ2V0VHlwZXNjcmlwdCA9ICgpID0+IHRoaXMuZG93bmxvYWRPcHRpb24oXCJ0eXBlc2NyaXB0XCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRG93bmxvYWRzIGF1dG9tYXRpb24gZG9jdW1lbnRhdGlvbiBmaWxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBnZXRBdXRvbWF0aW9uID0gKCkgPT4gdGhpcy5kb3dubG9hZE9wdGlvbihcImF1dG9tYXRpb25cIik7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBEb3dubG9hZHMgYXV0b21hdGlvbiBkb2N1bWVudGF0aW9uIGZpbGVzLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICovXG4gIGdldFRlc3RzID0gKCkgPT4gdGhpcy5kb3dubG9hZE9wdGlvbihcInRlc3RzXCIpO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRG93bmxvYWRzIGRvY2tlciBpbWFnZSBmaWxlcy5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBnZXREb2NrZXIgPSAoKSA9PiB0aGlzLmRvd25sb2FkT3B0aW9uKFwiZG9ja2VyXCIpO1xuXG4gIGFzeW5jIGluaXRQYWNrYWdlKHBrZ05hbWU6IHN0cmluZywgYXV0aG9yOiBzdHJpbmcsIGxpY2Vuc2U6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwa2cgPSBnZXRQYWNrYWdlKCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBkZWxldGUgcGtnW1NldHVwU2NyaXB0S2V5XTtcbiAgICAgIHBrZy5uYW1lID0gcGtnTmFtZTtcbiAgICAgIHBrZy52ZXJzaW9uID0gXCIwLjAuMVwiO1xuICAgICAgcGtnLmF1dGhvciA9IGF1dGhvcjtcbiAgICAgIHBrZy5saWNlbnNlID0gbGljZW5zZTtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoXCJwYWNrYWdlLmpzb25cIiwgSlNPTi5zdHJpbmdpZnkocGtnLCBudWxsLCAyKSk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBmaXhpbmcgcGFja2FnZS5qc29uOiAke2V9YCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgdXBkYXRlUGFja2FnZVNjcmlwcygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxQa2cgPSBKU09OLnBhcnNlKFxuICAgICAgICBhd2FpdCBIdHRwQ2xpZW50LmRvd25sb2FkRmlsZShgJHtiYXNlVXJsfS9wYWNrYWdlLmpzb25gKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHsgc2NyaXB0cyB9ID0gb3JpZ2luYWxQa2c7XG5cbiAgICAgIGNvbnN0IHBrZzogdHlwZW9mIG9yaWdpbmFsUGtnID0gZ2V0UGFja2FnZSgpIGFzIHtcbiAgICAgICAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgIH07XG4gICAgICBPYmplY3Qua2V5cyhwa2cuc2NyaXB0cykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGlmIChrZXkgaW4gc2NyaXB0cykge1xuICAgICAgICAgIGNvbnN0IHJlcGxhY2VkID0gcGF0Y2hTdHJpbmcoc2NyaXB0c1trZXldLCB0aGlzLnJlcGxhY2VtZW50cyk7XG4gICAgICAgICAgaWYgKHJlcGxhY2VkICE9PSBzY3JpcHRzW2tleV0pIHtcbiAgICAgICAgICAgIHBrZy5zY3JpcHRzW2tleV0gPSByZXBsYWNlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBwa2dbXCJleHBvcnRzXCJdW1wicmVxdWlyZVwiXSA9IG9yaWdpbmFsUGtnW1wiZXhwb3J0c1wiXVtcInJlcXVpcmVcIl07XG4gICAgICBwa2dbXCJleHBvcnRzXCJdW1wiaW1wb3J0XCJdID0gb3JpZ2luYWxQa2dbXCJleHBvcnRzXCJdW1wiaW1wb3J0XCJdO1xuICAgICAgcGtnW1widHlwZXNcIl0gPSBvcmlnaW5hbFBrZ1tcInR5cGVzXCJdO1xuXG4gICAgICBmcy53cml0ZUZpbGVTeW5jKFwicGFja2FnZS5qc29uXCIsIEpTT04uc3RyaW5naWZ5KHBrZywgbnVsbCwgMikpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZml4aW5nIHBhY2thZ2UuanNvbiBzY3JpcHRzOiAke2V9YCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY3JlYXRlVG9rZW5GaWxlcygpIHtcbiAgICBjb25zdCBsb2cgPSB0aGlzLmxvZy5mb3IodGhpcy5jcmVhdGVUb2tlbkZpbGVzKTtcbiAgICBjb25zdCBnaXRUb2tlbiA9IGF3YWl0IFVzZXJJbnB1dC5pbnNpc3RGb3JUZXh0KFxuICAgICAgXCJ0b2tlblwiLFxuICAgICAgXCJwbGVhc2UgaW5wdXQgeW91ciBnaXRodWIgdG9rZW5cIixcbiAgICAgIChyZXM6IHN0cmluZykgPT4ge1xuICAgICAgICByZXR1cm4gISFyZXMubWF0Y2goL15naHBfWzAtOWEtekEtWl17MzZ9JC9nKTtcbiAgICAgIH1cbiAgICApO1xuICAgIE9iamVjdC52YWx1ZXMoVG9rZW5zKS5mb3JFYWNoKCh0b2tlbikgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IHN0YXR1cztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBzdGF0dXMgPSBmcy5leGlzdHNTeW5jKHRva2VuKTtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICBsb2cuaW5mbyhgVG9rZW4gZmlsZSAke3Rva2VufSBub3QgZm91bmQuIENyZWF0aW5nIGEgbmV3IG9uZS4uLmApO1xuICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmModG9rZW4sIHRva2VuID09PSBcIi50b2tlblwiID8gZ2l0VG9rZW4gOiBcIlwiKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdGF0dXMpIHtcbiAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHRva2VuLCB0b2tlbiA9PT0gXCIudG9rZW5cIiA/IGdpdFRva2VuIDogXCJcIik7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBjcmVhdGluZyB0b2tlbiBmaWxlICR7dG9rZW59OiAke2V9YCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBnZXRPcmcoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBvcmcgPSBhd2FpdCBVc2VySW5wdXQuYXNrVGV4dChcbiAgICAgIFwiT3JnYW5pemF0aW9uXCIsXG4gICAgICBcIkVudGVyIHRoZSBvcmdhbml6YXRpb24gbmFtZSAod2lsbCBiZSB1c2VkIHRvIHNjb3BlIHlvdXIgbnBtIHByb2plY3QuIGxlYXZlIGJsYW5rIHRvIGNyZWF0ZSBhIHVuc2NvcGVkIHByb2plY3QpOlwiXG4gICAgKTtcbiAgICBjb25zdCBjb25maXJtYXRpb24gPSBhd2FpdCBVc2VySW5wdXQuYXNrQ29uZmlybWF0aW9uKFxuICAgICAgXCJDb25maXJtIG9yZ2FuaXphdGlvblwiLFxuICAgICAgXCJJcyB0aGlzIG9yZ2FuaXphdGlvbiBjb3JyZWN0P1wiLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gICAgaWYgKCFjb25maXJtYXRpb24pIHJldHVybiB0aGlzLmdldE9yZygpO1xuXG4gICAgcmV0dXJuIG9yZztcbiAgfVxuXG4gIGFzeW5jIGF1ZGl0Rml4KCkge1xuICAgIHJldHVybiBhd2FpdCBydW5Db21tYW5kKFwibnBtIGF1ZGl0IGZpeCAtLWZvcmNlXCIpLnByb21pc2U7XG4gIH1cblxuICBwYXRjaEZpbGVzKCkge1xuICAgIGNvbnN0IGZpbGVzID0gW1xuICAgICAgLi4uZnNcbiAgICAgICAgLnJlYWRkaXJTeW5jKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcInNyY1wiKSwge1xuICAgICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgICAgICB3aXRoRmlsZVR5cGVzOiB0cnVlLFxuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkuaXNGaWxlKCkpXG4gICAgICAgIC5tYXAoKGVudHJ5KSA9PiBwYXRoLmpvaW4oZW50cnkucGFyZW50UGF0aCwgZW50cnkubmFtZSkpLFxuICAgICAgLi4uZnNcbiAgICAgICAgLnJlYWRkaXJTeW5jKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcIndvcmtkb2NzXCIpLCB7XG4gICAgICAgICAgcmVjdXJzaXZlOiB0cnVlLFxuICAgICAgICAgIHdpdGhGaWxlVHlwZXM6IHRydWUsXG4gICAgICAgIH0pXG4gICAgICAgIC5maWx0ZXIoKGVudHJ5KSA9PiBlbnRyeS5pc0ZpbGUoKSAmJiBlbnRyeS5uYW1lLmVuZHNXaXRoKFwiLm1kXCIpKVxuICAgICAgICAubWFwKChlbnRyeSkgPT4gcGF0aC5qb2luKGVudHJ5LnBhcmVudFBhdGgsIGVudHJ5Lm5hbWUpKSxcbiAgICAgIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcIi5naXRsYWItY2kueW1sXCIpLFxuICAgICAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwid29ya2RvY3NcIiwgXCJqc2RvY3MuanNvblwiKSxcbiAgICBdO1xuXG4gICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICBwYXRjaEZpbGUoZmlsZSBhcyBzdHJpbmcsIHRoaXMucmVwbGFjZW1lbnRzKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB1cGRhdGVEZXBlbmRlbmNpZXMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsUGtnID0gSlNPTi5wYXJzZShcbiAgICAgICAgYXdhaXQgSHR0cENsaWVudC5kb3dubG9hZEZpbGUoYCR7YmFzZVVybH0vcGFja2FnZS5qc29uYClcbiAgICAgICk7XG4gICAgICBjb25zdCB7IGRldkRlcGVuZGVuY2llcyB9ID0gb3JpZ2luYWxQa2c7XG5cbiAgICAgIGNvbnN0IHBrZzogdHlwZW9mIG9yaWdpbmFsUGtnID0gZ2V0UGFja2FnZSgpIGFzIHtcbiAgICAgICAgc2NyaXB0czogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICAgIH07XG4gICAgICBPYmplY3Qua2V5cyhwa2cuc2NyaXB0cykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGlmIChrZXkgaW4gZGV2RGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgY29uc3QgcmVwbGFjZWQgPSBkZXZEZXBlbmRlbmNpZXNba2V5XTtcbiAgICAgICAgICBpZiAocmVwbGFjZWQgIT09IGRldkRlcGVuZGVuY2llc1trZXldKSB7XG4gICAgICAgICAgICAocGtnIGFzIGFueSlbXCJkZXZEZXBlbmRlbmNpZXNcIl0gPVxuICAgICAgICAgICAgICAocGtnIGFzIGFueSlbXCJkZXZEZXBlbmRlbmNpZXNcIl0gfHwge307XG4gICAgICAgICAgICAocGtnIGFzIGFueSlbXCJkZXZEZXBlbmRlbmNpZXNcIl1ba2V5XSA9IHJlcGxhY2VkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGZzLndyaXRlRmlsZVN5bmMoXCJwYWNrYWdlLmpzb25cIiwgSlNPTi5zdHJpbmdpZnkocGtnLCBudWxsLCAyKSk7XG4gICAgICBhd2FpdCBydW5Db21tYW5kKFwibnBtIGluc3RhbGxcIikucHJvbWlzZTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGZpeGluZyBwYWNrYWdlLmpzb24gZGVwZW5kZW5jaWVzOiAke2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSdW5zIHRoZSB0ZW1wbGF0ZSBzeW5jaHJvbml6YXRpb24gcHJvY2Vzcy5cbiAgICogQHN1bW1hcnkgVGhpcyBtZXRob2Qgb3JjaGVzdHJhdGVzIHRoZSBkb3dubG9hZGluZyBvZiB2YXJpb3VzIHByb2plY3QgY29tcG9uZW50cyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge1BhcnNlQXJnc1Jlc3VsdH0gYXJncyAtIFRoZSBwYXJzZWQgY29tbWFuZC1saW5lIGFyZ3VtZW50c1xuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICAgcGFydGljaXBhbnQgVCBhcyBUZW1wbGF0ZVN5bmNcbiAgICogICBwYXJ0aWNpcGFudCBMIGFzIGdldExpY2Vuc2VcbiAgICogICBwYXJ0aWNpcGFudCBJIGFzIGdldElkZVxuICAgKiAgIHBhcnRpY2lwYW50IFMgYXMgZ2V0U2NyaXB0c1xuICAgKiAgIHBhcnRpY2lwYW50IFN0IGFzIGdldFN0eWxlc1xuICAgKiAgIHBhcnRpY2lwYW50IEQgYXMgZ2V0RG9jc1xuICAgKiAgIHBhcnRpY2lwYW50IFcgYXMgZ2V0V29ya2Zsb3dzXG4gICAqICAgcGFydGljaXBhbnQgVGUgYXMgZ2V0VGVtcGxhdGVzXG4gICAqICAgVC0+PlQ6IFBhcnNlIGFyZ3VtZW50c1xuICAgKiAgIGFsdCBhbGwgZmxhZyBpcyB0cnVlXG4gICAqICAgICBULT4+VDogU2V0IGFsbCBjb21wb25lbnQgZmxhZ3MgdG8gdHJ1ZVxuICAgKiAgIGVuZFxuICAgKiAgIGFsdCBsaWNlbnNlIGlzIHNwZWNpZmllZFxuICAgKiAgICAgVC0+Pkw6IGdldExpY2Vuc2UobGljZW5zZSlcbiAgICogICBlbmRcbiAgICogICBhbHQgaWRlIGZsYWcgaXMgdHJ1ZVxuICAgKiAgICAgVC0+Pkk6IGdldElkZSgpXG4gICAqICAgZW5kXG4gICAqICAgYWx0IHNjcmlwdHMgZmxhZyBpcyB0cnVlXG4gICAqICAgICBULT4+UzogZ2V0U2NyaXB0cygpXG4gICAqICAgZW5kXG4gICAqICAgYWx0IHN0eWxlcyBmbGFnIGlzIHRydWVcbiAgICogICAgIFQtPj5TdDogZ2V0U3R5bGVzKClcbiAgICogICBlbmRcbiAgICogICBhbHQgZG9jcyBmbGFnIGlzIHRydWVcbiAgICogICAgIFQtPj5EOiBnZXREb2NzKClcbiAgICogICBlbmRcbiAgICogICBhbHQgd29ya2Zsb3dzIGZsYWcgaXMgdHJ1ZVxuICAgKiAgICAgVC0+Plc6IGdldFdvcmtmbG93cygpXG4gICAqICAgZW5kXG4gICAqICAgYWx0IHRlbXBsYXRlcyBmbGFnIGlzIHRydWVcbiAgICogICAgIFQtPj5UZTogZ2V0VGVtcGxhdGVzKClcbiAgICogICBlbmRcbiAgICovXG4gIGFzeW5jIHJ1bihcbiAgICBhcmdzOiBMb2dnaW5nQ29uZmlnICZcbiAgICAgIHR5cGVvZiBEZWZhdWx0Q29tbWFuZFZhbHVlcyAmIHsgW2sgaW4ga2V5b2YgdHlwZW9mIGFyZ3p6XTogdW5rbm93biB9XG4gICkge1xuICAgIGxldCB7IGxpY2Vuc2UgfSA9IGFyZ3M7XG4gICAgY29uc3QgeyBib290IH0gPSBhcmdzO1xuICAgIGxldCB7XG4gICAgICBhbGwsXG4gICAgICBzY3JpcHRzLFxuICAgICAgc3R5bGVzLFxuICAgICAgZG9jcyxcbiAgICAgIGlkZSxcbiAgICAgIHdvcmtmbG93cyxcbiAgICAgIHRlbXBsYXRlcyxcbiAgICAgIGRvY2tlcixcbiAgICAgIHR5cGVzY3JpcHQsXG4gICAgICBkZXBlbmRlbmNpZXMsXG4gICAgICB0ZXN0cyxcbiAgICAgIGF1dG9tYXRpb24sXG4gICAgICBwa2csXG4gICAgfSA9IGFyZ3M7XG4gICAgaWYgKFxuICAgICAgc2NyaXB0cyB8fFxuICAgICAgc3R5bGVzIHx8XG4gICAgICBkb2NzIHx8XG4gICAgICBpZGUgfHxcbiAgICAgIHdvcmtmbG93cyB8fFxuICAgICAgdGVtcGxhdGVzIHx8XG4gICAgICBkb2NrZXIgfHxcbiAgICAgIHR5cGVzY3JpcHQgfHxcbiAgICAgIGF1dG9tYXRpb24gfHxcbiAgICAgIGRlcGVuZGVuY2llcyB8fFxuICAgICAgdGVzdHMgfHxcbiAgICAgIHBrZ1xuICAgIClcbiAgICAgIGFsbCA9IGZhbHNlO1xuXG4gICAgaWYgKGJvb3QpIHtcbiAgICAgIGNvbnN0IG9yZyA9IGF3YWl0IHRoaXMuZ2V0T3JnKCk7XG4gICAgICBjb25zdCBuYW1lID0gYXdhaXQgVXNlcklucHV0Lmluc2lzdEZvclRleHQoXG4gICAgICAgIFwiUHJvamVjdCBuYW1lXCIsXG4gICAgICAgIFwiRW50ZXIgdGhlIHByb2plY3QgbmFtZTpcIixcbiAgICAgICAgKHJlczogc3RyaW5nKSA9PiByZXMubGVuZ3RoID4gMVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGF1dGhvciA9IGF3YWl0IFVzZXJJbnB1dC5pbnNpc3RGb3JUZXh0KFxuICAgICAgICBcIkF1dGhvclwiLFxuICAgICAgICBcIkVudGVyIHRoZSBhdXRob3IgbmFtZTpcIixcbiAgICAgICAgKHJlczogc3RyaW5nKSA9PiByZXMubGVuZ3RoID4gMVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHBrZ05hbWUgPSBvcmcgPyBgQCR7b3JnfS8ke25hbWV9YCA6IG5hbWU7XG5cbiAgICAgIGF3YWl0IHRoaXMuaW5pdFBhY2thZ2UocGtnTmFtZSwgYXV0aG9yLCBsaWNlbnNlIGFzIHN0cmluZyk7XG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZVRva2VuRmlsZXMoKTtcbiAgICAgIGF3YWl0IHRoaXMuYXVkaXRGaXgoKTtcbiAgICAgIHRoaXMucGF0Y2hGaWxlcygpO1xuICAgIH1cblxuICAgIGlmIChhbGwpIHtcbiAgICAgIHNjcmlwdHMgPSBmYWxzZTtcbiAgICAgIHN0eWxlcyA9IHRydWU7XG4gICAgICBkb2NzID0gdHJ1ZTtcbiAgICAgIGlkZSA9IHRydWU7XG4gICAgICB3b3JrZmxvd3MgPSB0cnVlO1xuICAgICAgdGVtcGxhdGVzID0gdHJ1ZTtcbiAgICAgIGRvY2tlciA9IHRydWU7XG4gICAgICB0eXBlc2NyaXB0ID0gdHJ1ZTtcbiAgICAgIHBrZyA9IHRydWU7XG4gICAgICBkZXBlbmRlbmNpZXMgPSB0cnVlO1xuICAgICAgdGVzdHMgPSB0cnVlO1xuICAgICAgYXV0b21hdGlvbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygc2NyaXB0cyA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIHNjcmlwdHMgPSBhd2FpdCBVc2VySW5wdXQuYXNrQ29uZmlybWF0aW9uKFxuICAgICAgICBcInNjcmlwdHNcIixcbiAgICAgICAgXCJEbyB5b3Ugd2FudCB0byBnZXQgc2NyaXB0cz9cIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcblxuICAgIGlmIChzY3JpcHRzKSBhd2FpdCB0aGlzLmdldFNjcmlwdHMoKTtcblxuICAgIHRoaXMubG9hZFZhbHVlc0Zyb21QYWNrYWdlKCk7XG4gICAgaWYgKCFhbGwgJiYgdHlwZW9mIGxpY2Vuc2UgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGNvbnN0IGNvbmZpcm1hdGlvbiA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgIFwibGljZW5zZVwiLFxuICAgICAgICBcIkRvIHlvdSB3YW50IHRvIHNldCBhIGxpY2Vuc2U/XCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgICBpZiAoY29uZmlybWF0aW9uKVxuICAgICAgICBsaWNlbnNlID0gYXdhaXQgVXNlcklucHV0Lmluc2lzdEZvclRleHQoXG4gICAgICAgICAgXCJsaWNlbnNlXCIsXG4gICAgICAgICAgXCJFbnRlciB0aGUgZGVzaXJlZCBMaWNlbnNlIChNSVR8R1BMfEFwYWNoZXxMR1BMfEFHUEwpOlwiLFxuICAgICAgICAgICh2YWwpID0+ICEhdmFsICYmICEhdmFsLm1hdGNoKC9eKE1JVHxHUEx8QXBhY2hlfExHUEx8QUdQTCkkL2cpXG4gICAgICAgICk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgbGljZW5zZSAhPT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIGF3YWl0IHRoaXMuZ2V0TGljZW5zZShcbiAgICAgICAgbGljZW5zZSBhcyBcIk1JVFwiIHwgXCJHUExcIiB8IFwiQXBhY2hlXCIgfCBcIkxHUExcIiB8IFwiQUdQTFwiXG4gICAgICApO1xuXG4gICAgaWYgKHR5cGVvZiBpZGUgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICBpZGUgPSBhd2FpdCBVc2VySW5wdXQuYXNrQ29uZmlybWF0aW9uKFxuICAgICAgICBcImlkZVwiLFxuICAgICAgICBcIkRvIHlvdSB3YW50IHRvIGdldCBpZGUgY29uZmlncz9cIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcblxuICAgIGlmIChpZGUpIGF3YWl0IHRoaXMuZ2V0SWRlKCk7XG5cbiAgICBpZiAodHlwZW9mIHR5cGVzY3JpcHQgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICB0eXBlc2NyaXB0ID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgXCJ0eXBlc2NyaXB0XCIsXG4gICAgICAgIFwiRG8geW91IHdhbnQgdG8gZ2V0IHR5cGVzY3JpcHQgY29uZmlncz9cIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICBpZiAodHlwZXNjcmlwdCkgYXdhaXQgdGhpcy5nZXRUeXBlc2NyaXB0KCk7XG5cbiAgICBpZiAodHlwZW9mIGRvY2tlciA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIGRvY2tlciA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgIFwiZG9ja2VyXCIsXG4gICAgICAgIFwiRG8geW91IHdhbnQgdG8gZ2V0IGRvY2tlciBjb25maWdzP1wiLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuXG4gICAgaWYgKGRvY2tlcikgYXdhaXQgdGhpcy5nZXREb2NrZXIoKTtcbiAgICBpZiAodHlwZW9mIGF1dG9tYXRpb24gPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICBhdXRvbWF0aW9uID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgXCJhdXRvbWF0aW9uXCIsXG4gICAgICAgIFwiRG8geW91IHdhbnQgdG8gZ2V0IGF1dG9tYXRpb24gY29uZmlncz9cIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICBpZiAoYXV0b21hdGlvbikgYXdhaXQgdGhpcy5nZXRBdXRvbWF0aW9uKCk7XG5cbiAgICBpZiAodHlwZW9mIHN0eWxlcyA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIHN0eWxlcyA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgIFwic3R5bGVzXCIsXG4gICAgICAgIFwiRG8geW91IHdhbnQgdG8gZ2V0IHN0eWxlcz9cIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICBpZiAoc3R5bGVzKSBhd2FpdCB0aGlzLmdldFN0eWxlcygpO1xuXG4gICAgaWYgKHR5cGVvZiBkb2NzID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgZG9jcyA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgIFwiZG9jc1wiLFxuICAgICAgICBcIkRvIHlvdSB3YW50IHRvIGdldCBkb2NzP1wiLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIGlmIChkb2NzKSBhd2FpdCB0aGlzLmdldERvY3MoKTtcbiAgICBpZiAodHlwZW9mIHdvcmtmbG93cyA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIHdvcmtmbG93cyA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgIFwid29ya2Zsb3dzXCIsXG4gICAgICAgIFwiRG8geW91IHdhbnQgdG8gZ2V0IHdvcmtmbG93cz9cIixcbiAgICAgICAgdHJ1ZVxuICAgICAgKTtcbiAgICBpZiAod29ya2Zsb3dzKSBhd2FpdCB0aGlzLmdldFdvcmtmbG93cygpO1xuICAgIGlmICh0eXBlb2YgdGVtcGxhdGVzID09PSBcInVuZGVmaW5lZFwiKVxuICAgICAgdGVtcGxhdGVzID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgXCJ0ZW1wbGF0ZXNcIixcbiAgICAgICAgXCJEbyB5b3Ugd2FudCB0byBnZXQgdGVtcGxhdGVzP1wiLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIGlmICh0ZW1wbGF0ZXMpIGF3YWl0IHRoaXMuZ2V0VGVtcGxhdGVzKCk7XG4gICAgaWYgKHR5cGVvZiBwa2cgPT09IFwidW5kZWZpbmVkXCIpXG4gICAgICBwa2cgPSBhd2FpdCBVc2VySW5wdXQuYXNrQ29uZmlybWF0aW9uKFxuICAgICAgICBcInBrZ1wiLFxuICAgICAgICBcIkRvIHlvdSB3YW50IHRvIHVwZGF0ZSB5b3VyIHBhY2thZ2UuanNvbiBzY3JpcHRzP1wiLFxuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIGlmIChwa2cpIGF3YWl0IHRoaXMudXBkYXRlUGFja2FnZVNjcmlwcygpO1xuXG4gICAgaWYgKHR5cGVvZiB0ZXN0cyA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIHRlc3RzID0gYXdhaXQgVXNlcklucHV0LmFza0NvbmZpcm1hdGlvbihcbiAgICAgICAgXCJwa2dcIixcbiAgICAgICAgXCJEbyB5b3Ugd2FudCB0byB1cGRhdGUgeW91ciB0ZXN0IGNvbmZpZ3M/XCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgaWYgKHRlc3RzKSBhd2FpdCB0aGlzLmdldFRlc3RzKCk7XG5cbiAgICBpZiAodHlwZW9mIGRlcGVuZGVuY2llcyA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIGRlcGVuZGVuY2llcyA9IGF3YWl0IFVzZXJJbnB1dC5hc2tDb25maXJtYXRpb24oXG4gICAgICAgIFwicGtnXCIsXG4gICAgICAgIFwiRG8geW91IHdhbnQgdG8gdXBkYXRlIGRldiBkZXBlbmRlbmNpZXM/XCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgaWYgKGRlcGVuZGVuY2llcykgYXdhaXQgdGhpcy51cGRhdGVEZXBlbmRlbmNpZXMoKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU3RhbmRhcmRPdXRwdXRXcml0ZXIgfSBmcm9tIFwiLi9TdGFuZGFyZE91dHB1dFdyaXRlclwiO1xuaW1wb3J0IHsgUHJvbWlzZUV4ZWN1dG9yIH0gZnJvbSBcIi4uL3V0aWxzL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEEgc3BlY2lhbGl6ZWQgb3V0cHV0IHdyaXRlciB0aGF0IHVzZXMgcmVndWxhciBleHByZXNzaW9ucyB0byBwcm9jZXNzIG91dHB1dC5cbiAqIEBzdW1tYXJ5IFRoaXMgY2xhc3MgZXh0ZW5kcyBTdGFuZGFyZE91dHB1dFdyaXRlciB0byBwcm92aWRlIHJlZ2V4LWJhc2VkIG91dHB1dCBwcm9jZXNzaW5nLlxuICogSXQgYWxsb3dzIGZvciBwYXR0ZXJuIG1hdGNoaW5nIGluIHRoZSBvdXRwdXQgc3RyZWFtIGFuZCBjYW4gdHJpZ2dlciBzcGVjaWZpYyBhY3Rpb25zXG4gKiBiYXNlZCBvbiBtYXRjaGVkIHBhdHRlcm5zLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIC0gVGhlIHR5cGUgb2YgdGhlIHJlc29sdmVkIHZhbHVlLCBkZWZhdWx0aW5nIHRvIHN0cmluZy5cbiAqXG4gKiBAcGFyYW0gbG9jayAtIEEgUHJvbWlzZUV4ZWN1dG9yIHRvIGNvbnRyb2wgdGhlIGFzeW5jaHJvbm91cyBmbG93LlxuICogQHBhcmFtIHJlZ2V4cCAtIEEgc3RyaW5nIG9yIFJlZ0V4cCB0byBtYXRjaCBhZ2FpbnN0IHRoZSBvdXRwdXQuXG4gKiBAcGFyYW0gZmxhZ3MgLSBPcHRpb25hbCBmbGFncyBmb3IgdGhlIFJlZ0V4cCBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIFJlZ2V4cE91dHB1dFdyaXRlciBleHRlbmRzIFN0YW5kYXJkT3V0cHV0V3JpdGVyPHN0cmluZz4ge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gdXNlZCBmb3IgbWF0Y2hpbmcgb3V0cHV0LlxuICAgKiBAc3VtbWFyeSBUaGlzIHJlYWRvbmx5IHByb3BlcnR5IHN0b3JlcyB0aGUgY29tcGlsZWQgUmVnRXhwIHVzZWQgZm9yIHBhdHRlcm4gbWF0Y2hpbmcuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVnZXhwOiBSZWdFeHA7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiBSZWdleHBPdXRwdXRXcml0ZXIuXG4gICAqIEBzdW1tYXJ5IENvbnN0cnVjdHMgdGhlIFJlZ2V4cE91dHB1dFdyaXRlciB3aXRoIGEgbG9jayBtZWNoYW5pc20gYW5kIGEgcmVndWxhciBleHByZXNzaW9uLlxuICAgKlxuICAgKiBAcGFyYW0gY21kXG4gICAqIEBwYXJhbSBsb2NrIC0gQSBQcm9taXNlRXhlY3V0b3IgdG8gY29udHJvbCB0aGUgYXN5bmNocm9ub3VzIGZsb3cuXG4gICAqIEBwYXJhbSByZWdleHAgLSBBIHN0cmluZyBvciBSZWdFeHAgdG8gbWF0Y2ggYWdhaW5zdCB0aGUgb3V0cHV0LlxuICAgKiBAcGFyYW0gZmxhZ3MgLSBPcHRpb25hbCBmbGFncyBmb3IgdGhlIFJlZ0V4cCBjb25zdHJ1Y3RvciwgZGVmYXVsdHMgdG8gXCJnXCIuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBjbWQ6IHN0cmluZyxcbiAgICBsb2NrOiBQcm9taXNlRXhlY3V0b3I8c3RyaW5nLCBFcnJvcj4sXG4gICAgcmVnZXhwOiBzdHJpbmcgfCBSZWdFeHAsXG4gICAgZmxhZ3MgPSBcImdcIlxuICApIHtcbiAgICBzdXBlcihjbWQsIGxvY2spO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnJlZ2V4cCA9XG4gICAgICAgIHR5cGVvZiByZWdleHAgPT09IFwic3RyaW5nXCIgPyBuZXcgUmVnRXhwKHJlZ2V4cCwgZmxhZ3MpIDogcmVnZXhwO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb246ICR7ZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRlc3RzIHRoZSBpbnB1dCBkYXRhIGFnYWluc3QgdGhlIHN0b3JlZCByZWd1bGFyIGV4cHJlc3Npb24uXG4gICAqIEBzdW1tYXJ5IEV4ZWN1dGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gb24gdGhlIGlucHV0IGRhdGEgYW5kIHJldHVybnMgdGhlIG1hdGNoIHJlc3VsdC5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgc3RyaW5nIHRvIHRlc3QgYWdhaW5zdCB0aGUgcmVndWxhciBleHByZXNzaW9uLlxuICAgKiBAcmV0dXJuIFRoZSByZXN1bHQgb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBleGVjdXRpb24sIG9yIHVuZGVmaW5lZCBpZiBhbiBlcnJvciBvY2N1cnMuXG4gICAqL1xuICBwcml2YXRlIHRlc3QoZGF0YTogc3RyaW5nKSB7XG4gICAgdGhpcy5yZWdleHAubGFzdEluZGV4ID0gMDtcbiAgICBsZXQgbWF0Y2g7XG4gICAgdHJ5IHtcbiAgICAgIG1hdGNoID0gdGhpcy5yZWdleHAuZXhlYyhkYXRhKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICByZXR1cm4gY29uc29sZS5kZWJ1ZyhgRmFpbGVkIHRvIHBhcnNlIGNodW5rOiAke2RhdGF9XFxuRXJyb3I6ICR7ZX0gYCk7XG4gICAgfVxuICAgIHJldHVybiBtYXRjaDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGVzdHMgdGhlIGRhdGEgYW5kIHJlc29sdmVzIHRoZSBwcm9taXNlIGlmIGEgbWF0Y2ggaXMgZm91bmQuXG4gICAqIEBzdW1tYXJ5IEV4ZWN1dGVzIHRoZSB0ZXN0IG1ldGhvZCBhbmQgcmVzb2x2ZXMgdGhlIHByb21pc2Ugd2l0aCB0aGUgZmlyc3QgbWF0Y2ggZ3JvdXAgaWYgc3VjY2Vzc2Z1bC5cbiAgICpcbiAgICogQHBhcmFtIGRhdGEgLSBUaGUgc3RyaW5nIHRvIHRlc3QgYWdhaW5zdCB0aGUgcmVndWxhciBleHByZXNzaW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIHRlc3RBbmRSZXNvbHZlKGRhdGE6IHN0cmluZykge1xuICAgIGNvbnN0IG1hdGNoID0gdGhpcy50ZXN0KGRhdGEpO1xuICAgIGlmIChtYXRjaCkgdGhpcy5yZXNvbHZlKG1hdGNoWzBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGVzdHMgdGhlIGRhdGEgYW5kIHJlamVjdHMgdGhlIHByb21pc2UgaWYgYSBtYXRjaCBpcyBmb3VuZC5cbiAgICogQHN1bW1hcnkgRXhlY3V0ZXMgdGhlIHRlc3QgbWV0aG9kIGFuZCByZWplY3RzIHRoZSBwcm9taXNlIHdpdGggdGhlIGZpcnN0IG1hdGNoIGdyb3VwIGlmIHN1Y2Nlc3NmdWwuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhIC0gVGhlIHN0cmluZyB0byB0ZXN0IGFnYWluc3QgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAgICovXG4gIHByb3RlY3RlZCB0ZXN0QW5kUmVqZWN0KGRhdGE6IHN0cmluZykge1xuICAgIGNvbnN0IG1hdGNoID0gdGhpcy50ZXN0KGRhdGEpO1xuICAgIGlmIChtYXRjaCkgdGhpcy5yZWplY3QobWF0Y2hbMF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm9jZXNzZXMgaW5jb21pbmcgZGF0YSBjaHVua3MuXG4gICAqIEBzdW1tYXJ5IENhbGxzIHRoZSBwYXJlbnQgY2xhc3MgZGF0YSBtZXRob2QgYW5kIHRoZW4gdGVzdHMgdGhlIGRhdGEgZm9yIGEgbWF0Y2ggdG8gcG90ZW50aWFsbHkgcmVzb2x2ZSB0aGUgcHJvbWlzZS5cbiAgICpcbiAgICogQHBhcmFtIGNodW5rIC0gVGhlIGRhdGEgY2h1bmsgdG8gcHJvY2Vzcy5cbiAgICovXG4gIGRhdGEoY2h1bms6IGFueSkge1xuICAgIHN1cGVyLmRhdGEoY2h1bmspO1xuICAgIHRoaXMudGVzdEFuZFJlc29sdmUoU3RyaW5nKGNodW5rKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBpbmNvbWluZyBlcnJvciBjaHVua3MuXG4gICAqIEBzdW1tYXJ5IENhbGxzIHRoZSBwYXJlbnQgY2xhc3MgZXJyb3IgbWV0aG9kIGFuZCB0aGVuIHRlc3RzIHRoZSBkYXRhIGZvciBhIG1hdGNoIHRvIHBvdGVudGlhbGx5IHJlamVjdCB0aGUgcHJvbWlzZS5cbiAgICpcbiAgICogQHBhcmFtIGNodW5rIC0gVGhlIGVycm9yIGNodW5rIHRvIHByb2Nlc3MuXG4gICAqL1xuICBlcnJvcihjaHVuazogYW55KSB7XG4gICAgc3VwZXIuZXJyb3IoY2h1bmspO1xuICAgIHRoaXMudGVzdEFuZFJlamVjdChTdHJpbmcoY2h1bmspKTtcbiAgfVxufVxuIiwiZXhwb3J0ICogZnJvbSBcIi4vY2xpXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vb3V0cHV0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlsc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vd3JpdGVyc1wiO1xuXG4vKipcbiAqIEBtb2R1bGUgQGRlY2FmLXRzL3V0aWxzXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoaXMgbW9kdWxlIHNlcnZlcyBhIGxpZ2h0IHZlcnNpb24gb2YgRGVjYWYgQ0xJIHRvb2wsIHByb3ZpZGluZyBhIGNvbXByZWhlbnNpdmUgc2V0IG9mIHV0aWxpdGllc1xuICogYW5kIGZ1bmN0aW9uYWxpdGllcyBmb3IgY29tbWFuZC1saW5lIGludGVyZmFjZSBvcGVyYXRpb25zLiBJdCBlbmNvbXBhc3NlcyBzZXZlcmFsIGtleSBjb21wb25lbnRzOlxuICpcbiAqIDEuIElucHV0IEhhbmRsaW5nOiBNYW5hZ2VzIHVzZXIgaW5wdXQgYW5kIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgcHJvY2Vzc2luZy5cbiAqIDIuIFV0aWxpdHkgRnVuY3Rpb25zOiBPZmZlcnMgYSBjb2xsZWN0aW9uIG9mIGhlbHBlciBmdW5jdGlvbnMgYW5kIGNvbnN0YW50cyBmb3IgdmFyaW91cyBvcGVyYXRpb25zLlxuICogMy4gVHlwZSBEZWZpbml0aW9uczogRGVmaW5lcyBjdXN0b20gdHlwZXMgYW5kIGludGVyZmFjZXMgdXNlZCB0aHJvdWdob3V0IHRoZSBtb2R1bGUuXG4gKiA0LiBPdXRwdXQgTWFuYWdlbWVudDogUHJvdmlkZXMgZGlmZmVyZW50IG91dHB1dCB3cml0aW5nIHN0cmF0ZWdpZXMgZm9yIGZsZXhpYmxlIGNvbnNvbGUgb3V0cHV0IGhhbmRsaW5nLlxuICpcbiAqIFRoZSBtb2R1bGUgaXMgZGVzaWduZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY3JlYXRpb24gb2Ygcm9idXN0IENMSSBhcHBsaWNhdGlvbnMgYnkgb2ZmZXJpbmc6XG4gKiAtIFN0YW5kYXJkaXplZCBpbnB1dCBwYXJzaW5nIGFuZCB2YWxpZGF0aW9uXG4gKiAtIENvbnNpc3RlbnQgb3V0cHV0IGZvcm1hdHRpbmcgYW5kIGhhbmRsaW5nXG4gKiAtIFJldXNhYmxlIHV0aWxpdHkgZnVuY3Rpb25zIGZvciBjb21tb24gQ0xJIHRhc2tzXG4gKiAtIEV4dGVuc2libGUgYXJjaGl0ZWN0dXJlIGZvciBhZGRpbmcgbmV3IGNvbW1hbmRzIGFuZCBmZWF0dXJlc1xuICpcbiAqIEl0IHN1cHBvcnRzIHZhcmlvdXMgb3V0cHV0IG1vZGVzLCBpbmNsdWRpbmcgc3RhbmRhcmQgY29uc29sZSBvdXRwdXQgYW5kIHJlZ3VsYXIgZXhwcmVzc2lvbi1iYXNlZCBvdXRwdXQsXG4gKiBhbGxvd2luZyBmb3IgdmVyc2F0aWxlIGRhdGEgcHJlc2VudGF0aW9uIGFuZCBwcm9jZXNzaW5nLiBUaGUgbW9kdWxhciBzdHJ1Y3R1cmUgZW5hYmxlcyBlYXN5IG1haW50ZW5hbmNlXG4gKiBhbmQgZXh0ZW5zaW9uIG9mIHRoZSBDTEkgZnVuY3Rpb25hbGl0eS5cbiAqXG4gKiBUaGlzIG1vZHVsZSBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvciBkZXZlbG9wZXJzIGJ1aWxkaW5nIGNvbXBsZXggY29tbWFuZC1saW5lIHRvb2xzIHRoYXQgcmVxdWlyZVxuICogc3RydWN0dXJlZCBpbnB1dCBoYW5kbGluZywgZmxleGlibGUgb3V0cHV0IGZvcm1hdHRpbmcsIGFuZCBhIHJpY2ggc2V0IG9mIHV0aWxpdHkgZnVuY3Rpb25zLlxuICovXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgbW9kdWxlLlxuICogQHN1bW1hcnkgVGhpcyBjb25zdGFudCBzdG9yZXMgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBAYXNkYXNkYXNkL3V0aWxzIG1vZHVsZS5cbiAqIFRoZSBhY3R1YWwgdmVyc2lvbiBudW1iZXIgaXMgcmVwbGFjZWQgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzLFxuICogd2l0aCB0aGUgcGxhY2Vob2xkZXIgXCIjI1ZFUlNJT04jI1wiIGJlaW5nIHN1YnN0aXR1dGVkIHdpdGggdGhlIGN1cnJlbnQgdmVyc2lvbi5cbiAqXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTpAZGVjYWYtdHMvdXRpbHNcbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG4iXSwibmFtZXMiOlsib3B0aW9ucyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7O0FBZ0JBOzs7Ozs7Ozs7Ozs7QUFZRztNQUNVLFNBQVMsQ0FBQTthQUNJLElBQU0sQ0FBQSxNQUFBLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQXNKeEQ7Ozs7O0FBS0c7QUFDSCxJQUFBLFdBQUEsQ0FBWSxJQUFvQixFQUFBO0FBM0poQzs7O0FBR0c7UUFDSCxJQUFJLENBQUEsSUFBQSxHQUEyRCxNQUFNO0FBd0puRSxRQUFBLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSTs7QUFHbEI7Ozs7OztBQU1HO0FBQ0gsSUFBQSxPQUFPLENBQUMsSUFBNEQsRUFBQTtRQUNsRSxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFvQixpQkFBQSxFQUFBLElBQUksQ0FBRSxDQUFBLENBQUM7QUFDcEQsUUFBQSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUk7QUFDaEIsUUFBQSxPQUFPLElBQUk7O0FBR2I7Ozs7OztBQU1HO0FBQ0gsSUFBQSxVQUFVLENBQUMsS0FBc0MsRUFBQTtRQUMvQyxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUF1QixvQkFBQSxFQUFBLEtBQUssQ0FBRSxDQUFBLENBQUM7QUFDeEQsUUFBQSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUs7QUFDcEIsUUFBQSxPQUFPLElBQUk7O0FBR2I7Ozs7OztBQU1HO0FBQ0gsSUFBQSxVQUFVLENBQ1IsS0FHYSxFQUFBO1FBRWIsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBNkIsMEJBQUEsRUFBQSxLQUFLLENBQUUsQ0FBQSxDQUFDO0FBQzlELFFBQUEsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLO0FBQ3BCLFFBQUEsT0FBTyxJQUFJOztBQUdiOzs7Ozs7QUFNRztBQUNILElBQUEsUUFBUSxDQUFDLEtBQXlELEVBQUE7UUFDaEUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBcUIsa0JBQUEsRUFBQSxLQUFLLENBQUUsQ0FBQSxDQUFDO0FBQ3RELFFBQUEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLO0FBQ2xCLFFBQUEsT0FBTyxJQUFJOztBQUdiOzs7Ozs7QUFNRztBQUNILElBQUEsU0FBUyxDQUFDLEtBQXNDLEVBQUE7QUFDOUMsUUFBQSxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBLHVCQUFBLENBQXlCLENBQUM7QUFDbkQsUUFBQSxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUs7QUFDbkIsUUFBQSxPQUFPLElBQUk7O0FBR2I7Ozs7OztBQU1HO0FBQ0gsSUFBQSxXQUFXLENBQ1QsS0FFYSxFQUFBO0FBRWIsUUFBQSxTQUFTLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBLHlCQUFBLENBQTJCLENBQUM7QUFDckQsUUFBQSxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUs7QUFDckIsUUFBQSxPQUFPLElBQUk7O0FBR2I7Ozs7OztBQU1HO0FBQ0gsSUFBQSxVQUFVLENBQUMsS0FBc0MsRUFBQTtBQUMvQyxRQUFBLFNBQVMsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUEsd0JBQUEsQ0FBMEIsQ0FBQztBQUNwRCxRQUFBLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSztBQUNwQixRQUFBLE9BQU8sSUFBSTs7QUFHYjs7Ozs7O0FBTUc7QUFDSCxJQUFBLFdBQVcsQ0FBQyxLQUEyQyxFQUFBO0FBQ3JELFFBQUEsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQSx5QkFBQSxDQUEyQixDQUFDO0FBQ3JELFFBQUEsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLO0FBQ3JCLFFBQUEsT0FBTyxJQUFJOztBQUdiOzs7Ozs7QUFNRztBQUNILElBQUEsTUFBTSxDQUFDLEtBQXlELEVBQUE7UUFDOUQsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBeUIsc0JBQUEsRUFBQSxLQUFLLENBQUUsQ0FBQSxDQUFDO0FBQzFELFFBQUEsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLO0FBQ2hCLFFBQUEsT0FBTyxJQUFJOztBQUdiOzs7Ozs7QUFNRztBQUNILElBQUEsTUFBTSxDQUFDLEtBQXlELEVBQUE7UUFDOUQsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBeUIsc0JBQUEsRUFBQSxLQUFLLENBQUUsQ0FBQSxDQUFDO0FBQzFELFFBQUEsSUFBSSxDQUFDLEdBQUcsR0FBRyxLQUFLO0FBQ2hCLFFBQUEsT0FBTyxJQUFJOztBQUdiOzs7Ozs7QUFNRztBQUNILElBQUEsUUFBUSxDQUFDLEtBQTJELEVBQUE7UUFDbEUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBcUIsa0JBQUEsRUFBQSxLQUFLLENBQUUsQ0FBQSxDQUFDO0FBQ3RELFFBQUEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLO0FBQ2xCLFFBQUEsT0FBTyxJQUFJOztBQUdiOzs7Ozs7QUFNRztBQUNILElBQUEsUUFBUSxDQUFDLEtBQXlELEVBQUE7UUFDaEUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBcUIsa0JBQUEsRUFBQSxLQUFLLENBQUUsQ0FBQSxDQUFDO0FBQ3RELFFBQUEsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLO0FBQ2xCLFFBQUEsT0FBTyxJQUFJOztBQUdiOzs7Ozs7QUFNRztBQUNILElBQUEsZUFBZSxDQUFDLEtBQW1DLEVBQUE7UUFDakQsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBNEIseUJBQUEsRUFBQSxLQUFLLENBQUUsQ0FBQSxDQUFDO0FBQzdELFFBQUEsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLO0FBQ3pCLFFBQUEsT0FBTyxJQUFJOztBQUdiOzs7Ozs7QUFNRztBQUNILElBQUEsWUFBWSxDQUNWLEtBQXlELEVBQUE7UUFFekQsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBeUIsc0JBQUEsRUFBQSxLQUFLLENBQUUsQ0FBQSxDQUFDO0FBQzFELFFBQUEsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLO0FBQ3RCLFFBQUEsT0FBTyxJQUFJOztBQUdiOzs7Ozs7QUFNRztBQUNILElBQUEsWUFBWSxDQUNWLEtBQXlELEVBQUE7UUFFekQsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBeUIsc0JBQUEsRUFBQSxLQUFLLENBQUUsQ0FBQSxDQUFDO0FBQzFELFFBQUEsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLO0FBQ3RCLFFBQUEsT0FBTyxJQUFJOztBQUdiOzs7Ozs7QUFNRztBQUNILElBQUEsU0FBUyxDQUFDLEtBQXlELEVBQUE7UUFDakUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBNEIseUJBQUEsRUFBQSxLQUFLLENBQUUsQ0FBQSxDQUFDO0FBQzdELFFBQUEsSUFBSSxDQUFDLE1BQU0sR0FB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