@decaf-ts/logging 0.1.0 → 0.2.1

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 (47) hide show
  1. package/dist/logging.cjs +458 -125
  2. package/dist/logging.esm.cjs +454 -119
  3. package/lib/constants.cjs +116 -17
  4. package/lib/constants.d.ts +72 -10
  5. package/lib/esm/constants.d.ts +72 -10
  6. package/lib/esm/constants.js +115 -16
  7. package/lib/esm/index.d.ts +2 -5
  8. package/lib/esm/index.js +3 -6
  9. package/lib/esm/logging.d.ts +172 -19
  10. package/lib/esm/logging.js +353 -37
  11. package/lib/esm/types.d.ts +122 -0
  12. package/lib/esm/types.js +2 -0
  13. package/lib/esm/winston/index.d.ts +0 -0
  14. package/lib/esm/winston/index.js +2 -0
  15. package/lib/esm/winston/winston.d.ts +12 -0
  16. package/lib/esm/winston/winston.js +44 -0
  17. package/lib/index.cjs +3 -6
  18. package/lib/index.d.ts +2 -5
  19. package/lib/logging.cjs +354 -37
  20. package/lib/logging.d.ts +172 -19
  21. package/lib/types.cjs +3 -0
  22. package/lib/types.d.ts +122 -0
  23. package/lib/winston/index.cjs +2 -0
  24. package/lib/winston/index.d.ts +0 -0
  25. package/lib/winston/winston.cjs +52 -0
  26. package/lib/winston/winston.d.ts +12 -0
  27. package/package.json +7 -4
  28. package/lib/Factory.cjs +0 -10
  29. package/lib/Factory.d.ts +0 -13
  30. package/lib/default.cjs +0 -76
  31. package/lib/default.d.ts +0 -9
  32. package/lib/esm/Factory.d.ts +0 -13
  33. package/lib/esm/Factory.js +0 -6
  34. package/lib/esm/default.d.ts +0 -9
  35. package/lib/esm/default.js +0 -72
  36. package/lib/esm/interfaces.d.ts +0 -21
  37. package/lib/esm/interfaces.js +0 -2
  38. package/lib/esm/utils.d.ts +0 -2
  39. package/lib/esm/utils.js +0 -8
  40. package/lib/esm/winston.d.ts +0 -15
  41. package/lib/esm/winston.js +0 -38
  42. package/lib/interfaces.cjs +0 -3
  43. package/lib/interfaces.d.ts +0 -21
  44. package/lib/utils.cjs +0 -11
  45. package/lib/utils.d.ts +0 -2
  46. package/lib/winston.cjs +0 -75
  47. package/lib/winston.d.ts +0 -15
@@ -1,145 +1,480 @@
1
+ import { style } from 'styled-string-builder';
2
+
3
+ /**
4
+ * @description Enum for log levels.
5
+ * @summary Defines different levels of logging for the application.
6
+ * @enum {string}
7
+ * @memberOf @decaf-ts/utils
8
+ */
1
9
  var LogLevel;
2
10
  (function (LogLevel) {
3
- LogLevel["Fatal"] = "fatal";
4
- LogLevel["Error"] = "error";
5
- LogLevel["Warn"] = "warn";
6
- LogLevel["Info"] = "info";
7
- LogLevel["Http"] = "http";
8
- LogLevel["Verbose"] = "verbose";
9
- LogLevel["Debug"] = "debug";
10
- LogLevel["Silly"] = "silly";
11
+ /** Error events that are likely to cause problems. */
12
+ LogLevel["error"] = "error";
13
+ /** Routine information, such as ongoing status or performance. */
14
+ LogLevel["info"] = "info";
15
+ /** Additional relevant information. */
16
+ LogLevel["verbose"] = "verbose";
17
+ /** Debug or trace information. */
18
+ LogLevel["debug"] = "debug";
19
+ /** way too verbose or silly information. */
20
+ LogLevel["silly"] = "silly";
11
21
  })(LogLevel || (LogLevel = {}));
22
+ /**
23
+ * @description Numeric values associated with log levels.
24
+ * @summary Provides a numeric representation of log levels for comparison and filtering.
25
+ * @const {Object} NumericLogLevels
26
+ * @property {number} error - Numeric value for error level (0).
27
+ * @property {number} info - Numeric value for info level (2).
28
+ * @property {number} verbose - Numeric value for verbose level (4).
29
+ * @property {number} debug - Numeric value for debug level (5).
30
+ * @property {number} silly - Numeric value for silly level (8).
31
+ * @memberOf @decaf-ts/utils
32
+ */
12
33
  const NumericLogLevels = {
13
- error: 0,
14
- warn: 1,
15
- info: 2,
16
- http: 3,
17
- verbose: 4,
18
- debug: 5,
19
- silly: 6,
34
+ error: 2,
35
+ info: 4,
36
+ verbose: 6,
37
+ debug: 7,
38
+ silly: 9,
39
+ };
40
+ var LoggingMode;
41
+ (function (LoggingMode) {
42
+ LoggingMode["RAW"] = "raw";
43
+ LoggingMode["JSON"] = "json";
44
+ })(LoggingMode || (LoggingMode = {}));
45
+ /**
46
+ * @description Default theme for styling log output.
47
+ * @summary Defines the default color and style settings for various components of log messages.
48
+ * @const DefaultTheme
49
+ * @typedef {Theme} DefaultTheme
50
+ * @property {Object} class - Styling for class names.
51
+ * @property {number} class.fg - Foreground color code for class names (4).
52
+ * @property {Object} id - Styling for identifiers.
53
+ * @property {number} id.fg - Foreground color code for identifiers (36).
54
+ * @property {Object} stack - Styling for stack traces (empty object).
55
+ * @property {Object} timestamp - Styling for timestamps (empty object).
56
+ * @property {Object} message - Styling for different types of messages.
57
+ * @property {Object} message.error - Styling for error messages.
58
+ * @property {number} message.error.fg - Foreground color code for error messages (34).
59
+ * @property {Object} method - Styling for method names (empty object).
60
+ * @property {Object} logLevel - Styling for different log levels.
61
+ * @property {Object} logLevel.error - Styling for error level logs.
62
+ * @property {number} logLevel.error.fg - Foreground color code for error level logs (6).
63
+ * @property {Object} logLevel.info - Styling for info level logs (empty object).
64
+ * @property {Object} logLevel.verbose - Styling for verbose level logs (empty object).
65
+ * @property {Object} logLevel.debug - Styling for debug level logs.
66
+ * @property {number} logLevel.debug.fg - Foreground color code for debug level logs (7).
67
+ * @memberOf @decaf-ts/utils
68
+ */
69
+ const DefaultTheme = {
70
+ class: {
71
+ fg: 34,
72
+ },
73
+ id: {
74
+ fg: 36,
75
+ },
76
+ stack: {},
77
+ timestamp: {},
78
+ message: {
79
+ error: {
80
+ fg: 31,
81
+ },
82
+ },
83
+ method: {},
84
+ logLevel: {
85
+ error: {
86
+ fg: 31,
87
+ style: ["bold"],
88
+ },
89
+ info: {},
90
+ verbose: {},
91
+ debug: {
92
+ fg: 33,
93
+ },
94
+ },
95
+ };
96
+ /**
97
+ * @description Default configuration for logging.
98
+ * @summary Defines the default settings for the logging system, including verbosity, log level, styling, and timestamp format.
99
+ * @const DefaultLoggingConfig
100
+ * @typedef {LoggingConfig} DefaultLoggingConfig
101
+ * @property {number} verbose - Verbosity level (0).
102
+ * @property {LogLevel} level - Default log level (LogLevel.info).
103
+ * @property {boolean} style - Whether to apply styling to log output (false).
104
+ * @property {boolean} timestamp - Whether to include timestamps in log messages (true).
105
+ * @property {string} timestampFormat - Format for timestamps ("HH:mm:ss.SSS").
106
+ * @property {boolean} context - Whether to include context information in log messages (true).
107
+ * @property {Theme} theme - The theme to use for styling log messages (DefaultTheme).
108
+ * @memberOf @decaf-ts/utils
109
+ */
110
+ const DefaultLoggingConfig = {
111
+ verbose: 0,
112
+ level: LogLevel.info,
113
+ logLevel: true,
114
+ mode: LoggingMode.RAW,
115
+ style: false,
116
+ separator: " - ",
117
+ timestamp: true,
118
+ timestampFormat: "HH:mm:ss.SSS",
119
+ context: true,
120
+ theme: DefaultTheme,
20
121
  };
21
122
 
22
- class LoggerFactory {
23
- constructor(level) {
24
- this.level = level;
123
+ /**
124
+ * @description A minimal logger implementation.
125
+ * @summary MiniLogger is a lightweight logging class that implements the VerbosityLogger interface.
126
+ * It provides basic logging functionality with support for different log levels and verbosity.
127
+ *
128
+ * @class
129
+ */
130
+ class MiniLogger {
131
+ /**
132
+ * @description Creates a new MiniLogger instance.
133
+ * @summary Initializes a MiniLogger with the given class name, optional configuration, and method name.
134
+ *
135
+ * @param context - The name of the class using this logger.
136
+ * @param [conf] - Optional logging configuration. Defaults to Info level and verbosity 0.
137
+ * @param [id] - Optional unique identifier for the logger instance.
138
+ */
139
+ constructor(context, conf, id) {
140
+ this.context = context;
141
+ this.conf = conf;
142
+ this.id = id;
25
143
  }
26
- }
27
-
28
- function toLogLevel(level) {
29
- if (level.toString() in NumericLogLevels) {
30
- return NumericLogLevels[level.toString()];
144
+ config(key) {
145
+ if (this.conf && key in this.conf)
146
+ return this.conf[key];
147
+ return Logging.getConfig()[key];
31
148
  }
32
- throw new Error(`Invalid level: ${level.toString()}`);
33
- }
34
-
35
- class DefaultLogger {
36
- constructor(level, clazz, method) {
37
- this.level = level;
38
- this.clazz = clazz;
39
- this.method = method;
40
- }
41
- log(level, message, data, profile) {
42
- if (toLogLevel(level) < toLogLevel(this.level))
149
+ for(method, config) {
150
+ method = method
151
+ ? typeof method === "string"
152
+ ? method
153
+ : method.name
154
+ : undefined;
155
+ return Logging.for([this.context, method].join("."), this.id, config);
156
+ }
157
+ /**
158
+ * @description Creates a formatted log string.
159
+ * @summary Generates a log string with timestamp, colored log level, and message.
160
+ *
161
+ * @param level - The log level as a string.
162
+ * @param message
163
+ * @param stack
164
+ * @return A formatted log string.
165
+ */
166
+ createLog(level, message, stack) {
167
+ const log = [];
168
+ const style = this.config("style");
169
+ if (this.config("timestamp")) {
170
+ const date = new Date().toISOString();
171
+ const timestamp = style ? Logging.theme(date, "timestamp", level) : date;
172
+ log.push(timestamp);
173
+ }
174
+ if (this.config("logLevel")) {
175
+ const lvl = style
176
+ ? Logging.theme(level, "logLevel", level)
177
+ : level;
178
+ log.push(lvl);
179
+ }
180
+ if (this.config("context")) {
181
+ const context = style
182
+ ? Logging.theme(this.context, "class", level)
183
+ : this.context;
184
+ log.push(context);
185
+ }
186
+ if (this.id) {
187
+ {
188
+ const id = style
189
+ ? Logging.theme(this.id, "id", level)
190
+ : this.id;
191
+ log.push(id);
192
+ }
193
+ }
194
+ const msg = style
195
+ ? Logging.theme(typeof message === "string" ? message : message.message, "message", level)
196
+ : typeof message === "string"
197
+ ? message
198
+ : message.message;
199
+ log.push(msg);
200
+ if (stack || message instanceof Error) {
201
+ stack = style
202
+ ? Logging.theme((stack || message.stack), "stack", level)
203
+ : stack;
204
+ log.push(`\nStack trace:\n${stack}`);
205
+ }
206
+ return log.join(this.config("separator"));
207
+ }
208
+ /**
209
+ * @description Logs a message with the specified log level.
210
+ * @summary Checks if the message should be logged based on the current log level,
211
+ * then uses the appropriate console method to output the log.
212
+ *
213
+ * @param level - The log level of the message.
214
+ * @param msg - The message to be logged.
215
+ * @param stack
216
+ */
217
+ log(level, msg, stack) {
218
+ if (NumericLogLevels[this.config("level")] <
219
+ NumericLogLevels[level])
43
220
  return;
44
- const { context, app } = data || {};
45
- const msg = `${profile ? `[${profile}]` : ""}${app ? `[${app}]` : ""}${context ? `[${context}]` : ""}${this.clazz ? `[${this.clazz}]` : ""}${this.method ? `[${this.method}]` : ""} ${message}`;
221
+ let method;
46
222
  switch (level) {
47
- case LogLevel.Fatal:
48
- case LogLevel.Error:
49
- return console.error(msg);
50
- case LogLevel.Warn:
51
- return console.warn(msg);
52
- case LogLevel.Info:
53
- return console.info(msg);
54
- case LogLevel.Http:
55
- case LogLevel.Verbose:
56
- case LogLevel.Debug:
57
- case LogLevel.Silly:
58
- return console.debug(msg);
223
+ case LogLevel.info:
224
+ method = console.log;
225
+ break;
226
+ case LogLevel.verbose:
227
+ case LogLevel.debug:
228
+ method = console.debug;
229
+ break;
230
+ case LogLevel.error:
231
+ method = console.error;
232
+ break;
59
233
  default:
60
- throw new Error(`Invalid log level: ${level}`);
234
+ throw new Error("Invalid log level");
61
235
  }
236
+ method(this.createLog(level, msg, stack));
62
237
  }
63
- silly(message, data, profile) {
64
- return this.log(LogLevel.Silly, message, data, profile);
238
+ /**
239
+ * @description LLogs a `way too verbose` or a silly message.
240
+ * @summary Logs a message at the Silly level if the current verbosity allows it.
241
+ *
242
+ * @param msg - The message to be logged.
243
+ * @param verbosity - The verbosity level of the message (default: 0).
244
+ */
245
+ silly(msg, verbosity = 0) {
246
+ if (this.config("verbose") >= verbosity)
247
+ this.log(LogLevel.verbose, msg);
65
248
  }
66
- verbose(message, data, profile) {
67
- return this.log(LogLevel.Verbose, message, data, profile);
249
+ /**
250
+ * @description Logs a verbose message.
251
+ * @summary Logs a message at the Verbose level if the current verbosity allows it.
252
+ *
253
+ * @param msg - The message to be logged.
254
+ * @param verbosity - The verbosity level of the message (default: 0).
255
+ */
256
+ verbose(msg, verbosity = 0) {
257
+ if (this.config("verbose") >= verbosity)
258
+ this.log(LogLevel.verbose, msg);
68
259
  }
69
- debug(message, data, profile) {
70
- return this.log(LogLevel.Debug, message, data, profile);
260
+ /**
261
+ * @description Logs an info message.
262
+ * @summary Logs a message at the Info level.
263
+ *
264
+ * @param msg - The message to be logged.
265
+ */
266
+ info(msg) {
267
+ this.log(LogLevel.info, msg);
71
268
  }
72
- info(message, data, profile) {
73
- return this.log(LogLevel.Info, message, data, profile);
269
+ /**
270
+ * @description Logs a debug message.
271
+ * @summary Logs a message at the Debug level.
272
+ *
273
+ * @param msg - The message to be logged.
274
+ */
275
+ debug(msg) {
276
+ this.log(LogLevel.debug, msg);
74
277
  }
75
- warn(message, data, profile) {
76
- return this.log(LogLevel.Warn, message, data, profile);
278
+ /**
279
+ * @description Logs an error message.
280
+ * @summary Logs a message at the Error level.
281
+ *
282
+ * @param msg - The message to be logged.
283
+ */
284
+ error(msg) {
285
+ this.log(LogLevel.error, msg);
77
286
  }
78
- error(message, data, profile) {
79
- return this.log(LogLevel.Error, message, data, profile);
287
+ setConfig(config) {
288
+ this.conf = { ...(this.conf || {}), ...config };
80
289
  }
81
- emerg(message, data, profile) {
82
- return this.log(LogLevel.Fatal, message, data, profile);
290
+ }
291
+ /**
292
+ * @description A static class for managing logging operations.
293
+ * @summary The Logging class provides a centralized logging mechanism with support for
294
+ * different log levels and verbosity. It uses a singleton pattern to maintain a global
295
+ * logger instance and allows creating specific loggers for different classes and methods.
296
+ *
297
+ * @class
298
+ */
299
+ class Logging {
300
+ /**
301
+ * @description Factory function for creating logger instances.
302
+ * @summary A function that creates new VerbosityLogger instances. By default, it creates a MiniLogger.
303
+ */
304
+ static { this._factory = (object, config, id) => {
305
+ return new MiniLogger(object, config, id);
306
+ }; }
307
+ /**
308
+ * @description Configuration for the logging system.
309
+ * @summary Stores the global verbosity level and log level settings.
310
+ */
311
+ static { this._config = DefaultLoggingConfig; }
312
+ /**
313
+ * @description Private constructor to prevent instantiation.
314
+ * @summary Ensures that the Logging class cannot be instantiated as it's designed to be used statically.
315
+ */
316
+ constructor() { }
317
+ setFactory(factory) {
318
+ Logging._factory = factory;
83
319
  }
84
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
85
- profile(id, meta) {
86
- throw new Error("Not implemented");
320
+ /**
321
+ * @description Setter for the logging configuration.
322
+ * @summary Allows updating the global logging configuration.
323
+ *
324
+ * @param config - An object containing verbosity and log level settings.
325
+ */
326
+ static setConfig(config) {
327
+ Object.assign(this._config, config);
87
328
  }
88
- }
89
- class DefaultLoggerFactory extends LoggerFactory {
90
- constructor(level) {
91
- super(level);
329
+ static getConfig() {
330
+ return Object.assign({}, this._config);
92
331
  }
93
- forClass(clazz) {
94
- return new DefaultLogger(this.level, clazz.name);
332
+ /**
333
+ * @description Retrieves or creates the global logger instance.
334
+ * @summary Returns the existing global logger or creates a new one if it doesn't exist.
335
+ *
336
+ * @return The global VerbosityLogger instance.
337
+ */
338
+ static get() {
339
+ this.global = this.global ? this.global : this._factory("Logging");
340
+ return this.global;
95
341
  }
96
- forMethod(clazz, method) {
97
- return new DefaultLogger(this.level, clazz.name, typeof method === "string" ? method : method.name);
342
+ /**
343
+ * @description Logs a verbose message.
344
+ * @summary Delegates the verbose logging to the global logger instance.
345
+ *
346
+ * @param msg - The message to be logged.
347
+ * @param verbosity - The verbosity level of the message (default: 0).
348
+ */
349
+ static verbose(msg, verbosity = 0) {
350
+ return this.get().verbose(msg, verbosity);
98
351
  }
99
- get() {
100
- return new DefaultLogger(this.level);
352
+ /**
353
+ * @description Logs an info message.
354
+ * @summary Delegates the info logging to the global logger instance.
355
+ *
356
+ * @param msg - The message to be logged.
357
+ */
358
+ static info(msg) {
359
+ return this.get().info(msg);
101
360
  }
102
- }
103
-
104
- class Logging {
105
- static { this._level = LogLevel.Info; }
106
- static { this._factory = DefaultLoggerFactory; }
107
- static { this.cacheByClass = {}; }
108
- static { this.cacheByClassMethod = {}; }
109
- constructor() { }
110
- static get level() {
111
- return this._level;
112
- }
113
- static set level(level) {
114
- this._level = level;
115
- }
116
- static get instance() {
117
- if (!this._instance)
118
- this._instance = new this._factory(Logging.level);
119
- return this._instance;
120
- }
121
- static set factory(factory) {
122
- this._factory = factory;
123
- }
124
- static forClass(clazz) {
125
- const name = clazz.name;
126
- if (!(name in this.cacheByClass))
127
- this.cacheByClass[name] = Logging.instance.forClass(clazz);
128
- return this.cacheByClass[name];
129
- }
130
- static forMethod(clazz, method) {
131
- const name = clazz.name;
132
- if (!(name in this.cacheByClassMethod))
133
- this.cacheByClassMethod[name] = {};
134
- const methodName = typeof method === "string" ? method : method.name;
135
- if (!(methodName in this.cacheByClassMethod[name]))
136
- this.cacheByClassMethod[name][methodName] = Logging.instance.forMethod(clazz, method);
137
- return this.cacheByClassMethod[name][methodName];
361
+ /**
362
+ * @description Logs a debug message.
363
+ * @summary Delegates the debug logging to the global logger instance.
364
+ *
365
+ * @param msg - The message to be logged.
366
+ */
367
+ static debug(msg) {
368
+ return this.get().debug(msg);
138
369
  }
139
- static get() {
140
- if (!this.global)
141
- this.global = Logging.instance.get();
142
- return this.global;
370
+ /**
371
+ * @description Logs a silly message.
372
+ * @summary Delegates the debug logging to the global logger instance.
373
+ *
374
+ * @param msg - The message to be logged.
375
+ */
376
+ static silly(msg) {
377
+ return this.get().silly(msg);
378
+ }
379
+ /**
380
+ * @description Logs an error message.
381
+ * @summary Delegates the error logging to the global logger instance.
382
+ *
383
+ * @param msg - The message to be logged.
384
+ */
385
+ static error(msg) {
386
+ return this.get().error(msg);
387
+ }
388
+ static for(object, id, config) {
389
+ object = typeof object === "string" ? object : object.name;
390
+ id = typeof id === "string" ? id : undefined;
391
+ config = typeof id === "object" ? id : config;
392
+ return this._factory(object, config, id);
393
+ }
394
+ /**
395
+ * @description Creates a logger for a specific reason or context.
396
+ *
397
+ * @summary This static method creates a new logger instance using the factory function,
398
+ * based on a given reason or context.
399
+ *
400
+ * @param reason - A string describing the reason or context for creating this logger.
401
+ * @param id
402
+ * @returns A new VerbosityLogger or ClassLogger instance.
403
+ */
404
+ static because(reason, id) {
405
+ return this._factory(reason, this._config, id);
406
+ }
407
+ static theme(text, type, loggerLevel, template = DefaultTheme) {
408
+ if (!this._config.style)
409
+ return text;
410
+ const logger = Logging.get().for(this.theme);
411
+ function apply(txt, option, value) {
412
+ try {
413
+ const t = txt;
414
+ let c = style(t);
415
+ function applyColor(val, isBg = false) {
416
+ let f = isBg ? c.background : c.foreground;
417
+ if (!Array.isArray(val)) {
418
+ return f.call(c, value);
419
+ }
420
+ switch (val.length) {
421
+ case 1:
422
+ f = isBg ? c.bgColor256 : c.color256;
423
+ return f(val[0]);
424
+ case 3:
425
+ f = isBg ? c.bgRgb : c.rgb;
426
+ return c.rgb(val[0], val[1], val[2]);
427
+ default:
428
+ logger.error(`Not a valid color option: ${option}`);
429
+ return style(t);
430
+ }
431
+ }
432
+ function applyStyle(v) {
433
+ if (typeof v === "number") {
434
+ c = c.style(v);
435
+ }
436
+ else {
437
+ c = c[v];
438
+ }
439
+ }
440
+ switch (option) {
441
+ case "bg":
442
+ case "fg":
443
+ return applyColor(value).text;
444
+ case "style":
445
+ if (Array.isArray(value)) {
446
+ value.forEach(applyStyle);
447
+ }
448
+ else {
449
+ applyStyle(value);
450
+ }
451
+ return c.text;
452
+ default:
453
+ logger.error(`Not a valid theme option: ${option}`);
454
+ return t;
455
+ }
456
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
457
+ }
458
+ catch (e) {
459
+ logger.error(`Error applying style: ${option} with value ${value}`);
460
+ return txt;
461
+ }
462
+ }
463
+ const individualTheme = template[type];
464
+ if (!individualTheme || !Object.keys(individualTheme).length) {
465
+ return text;
466
+ }
467
+ let actualTheme = individualTheme;
468
+ const logLevels = Object.assign({}, LogLevel);
469
+ if (Object.keys(individualTheme)[0] in logLevels)
470
+ actualTheme =
471
+ individualTheme[loggerLevel] || {};
472
+ return Object.keys(actualTheme).reduce((acc, key) => {
473
+ const val = actualTheme[key];
474
+ if (val)
475
+ return apply(acc, key, val);
476
+ return acc;
477
+ }, text);
143
478
  }
144
479
  }
145
480
 
@@ -160,7 +495,7 @@ class Logging {
160
495
  * @const VERSION
161
496
  * @memberOf module:ts-workspace
162
497
  */
163
- const VERSION = "0.1.0";
498
+ const VERSION = "0.2.1";
164
499
 
165
- export { DefaultLoggerFactory, LogLevel, LoggerFactory, Logging, NumericLogLevels, VERSION, toLogLevel };
166
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2luZy5lc20uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL0ZhY3RvcnkudHMiLCIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvZGVmYXVsdC50cyIsIi4uL3NyYy9sb2dnaW5nLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBlbnVtIExvZ0xldmVsIHtcbiAgRmF0YWwgPSBcImZhdGFsXCIsIC8vIEEgcGVyc29uIG11c3QgdGFrZSBhbiBhY3Rpb24gaW1tZWRpYXRlbHlcbiAgRXJyb3IgPSBcImVycm9yXCIsIC8vIEVycm9yIGV2ZW50cyBhcmUgbGlrZWx5IHRvIGNhdXNlIHByb2JsZW1zXG4gIFdhcm4gPSBcIndhcm5cIiwgLy8gV2FybmluZyBldmVudHMgbWlnaHQgY2F1c2UgcHJvYmxlbXMgaW4gdGhlIGZ1dHVyZSBhbmQgZGVzZXJ2ZSBleWVzXG4gIEluZm8gPSBcImluZm9cIiwgLy8gUm91dGluZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBvbmdvaW5nIHN0YXR1cyBvciBwZXJmb3JtYW5jZVxuICBIdHRwID0gXCJodHRwXCIsIC8vIEh0dHAgaW5mb3JtYXRpb25cbiAgVmVyYm9zZSA9IFwidmVyYm9zZVwiLCAvLyBEZWJ1ZyBvciB0cmFjZSBpbmZvcm1hdGlvblxuICBEZWJ1ZyA9IFwiZGVidWdcIiwgLy8gRGVidWcgb3IgdHJhY2UgaW5mb3JtYXRpb25cbiAgU2lsbHkgPSBcInNpbGx5XCIsIC8vIERlYnVnIG9yIHRyYWNlIGluZm9ybWF0aW9uXG59XG5cbmV4cG9ydCBjb25zdCBOdW1lcmljTG9nTGV2ZWxzID0ge1xuICBlcnJvcjogMCxcbiAgd2FybjogMSxcbiAgaW5mbzogMixcbiAgaHR0cDogMyxcbiAgdmVyYm9zZTogNCxcbiAgZGVidWc6IDUsXG4gIHNpbGx5OiA2LFxufTtcbiIsImltcG9ydCB7IExvZ2dlciB9IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IExvZ0xldmVsIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBMb2dnZXJGYWN0b3J5IHtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBsZXZlbDogTG9nTGV2ZWwpIHt9XG4gIGFic3RyYWN0IGZvckNsYXNzKGNsYXp6OiB7IG5ldyAoLi4uYXJnczogYW55W10pOiBhbnkgfSk6IExvZ2dlcjtcbiAgYWJzdHJhY3QgZm9yTWV0aG9kKFxuICAgIGNsYXp6OiB7IG5ldyAoLi4uYXJnczogYW55W10pOiBhbnkgfSxcbiAgICBtZXRob2Q6ICgoLi4uYXJnczogYW55W10pID0+IGFueSkgfCBzdHJpbmdcbiAgKTogTG9nZ2VyO1xuICBhYnN0cmFjdCBnZXQoKTogTG9nZ2VyO1xufVxuIiwiaW1wb3J0IHsgTG9nTGV2ZWwsIE51bWVyaWNMb2dMZXZlbHMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHRvTG9nTGV2ZWwobGV2ZWw6IExvZ0xldmVsKTogbnVtYmVyIHtcbiAgaWYgKGxldmVsLnRvU3RyaW5nKCkgaW4gTnVtZXJpY0xvZ0xldmVscykge1xuICAgIHJldHVybiAoTnVtZXJpY0xvZ0xldmVscyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtsZXZlbC50b1N0cmluZygpXTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbGV2ZWw6ICR7bGV2ZWwudG9TdHJpbmcoKX1gKTtcbn1cbiIsImltcG9ydCB7IExvZ2dlckZhY3RvcnkgfSBmcm9tIFwiLi9GYWN0b3J5XCI7XG5pbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTG9nRGF0YSwgTG9nZ2VyIH0gZnJvbSBcIi4vaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgdG9Mb2dMZXZlbCB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmNsYXNzIERlZmF1bHRMb2dnZXIgaW1wbGVtZW50cyBMb2dnZXIge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgbGV2ZWw6IExvZ0xldmVsLFxuICAgIHByb3RlY3RlZCBjbGF6ej86IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgbWV0aG9kPzogc3RyaW5nXG4gICkge31cblxuICBsb2coXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IEVycm9yLFxuICAgIGRhdGE/OiBMb2dEYXRhIHwgdW5kZWZpbmVkLFxuICAgIHByb2ZpbGU/OiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRvTG9nTGV2ZWwobGV2ZWwpIDwgdG9Mb2dMZXZlbCh0aGlzLmxldmVsKSkgcmV0dXJuO1xuXG4gICAgY29uc3QgeyBjb250ZXh0LCBhcHAgfSA9IGRhdGEgfHwge307XG5cbiAgICAgXG4gICAgY29uc3QgbXNnID0gYCR7cHJvZmlsZSA/IGBbJHtwcm9maWxlfV1gIDogXCJcIn0ke2FwcCA/IGBbJHthcHB9XWAgOiBcIlwifSR7Y29udGV4dCA/IGBbJHtjb250ZXh0fV1gIDogXCJcIn0ke3RoaXMuY2xhenogPyBgWyR7dGhpcy5jbGF6en1dYCA6IFwiXCJ9JHt0aGlzLm1ldGhvZCA/IGBbJHt0aGlzLm1ldGhvZH1dYCA6IFwiXCJ9ICR7bWVzc2FnZX1gO1xuICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICBjYXNlIExvZ0xldmVsLkZhdGFsOlxuICAgIGNhc2UgTG9nTGV2ZWwuRXJyb3I6XG4gICAgICByZXR1cm4gY29uc29sZS5lcnJvcihtc2cpO1xuICAgIGNhc2UgTG9nTGV2ZWwuV2FybjpcbiAgICAgIHJldHVybiBjb25zb2xlLndhcm4obXNnKTtcbiAgICBjYXNlIExvZ0xldmVsLkluZm86XG4gICAgICByZXR1cm4gY29uc29sZS5pbmZvKG1zZyk7XG4gICAgY2FzZSBMb2dMZXZlbC5IdHRwOlxuICAgIGNhc2UgTG9nTGV2ZWwuVmVyYm9zZTpcbiAgICBjYXNlIExvZ0xldmVsLkRlYnVnOlxuICAgIGNhc2UgTG9nTGV2ZWwuU2lsbHk6XG4gICAgICByZXR1cm4gY29uc29sZS5kZWJ1Zyhtc2cpO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbG9nIGxldmVsOiAke2xldmVsfWApO1xuICAgIH1cbiAgfVxuICBzaWxseShcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgZGF0YT86IExvZ0RhdGEgfCB1bmRlZmluZWQsXG4gICAgcHJvZmlsZT86IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5sb2coTG9nTGV2ZWwuU2lsbHksIG1lc3NhZ2UsIGRhdGEsIHByb2ZpbGUpO1xuICB9XG5cbiAgdmVyYm9zZShcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgZGF0YT86IExvZ0RhdGEgfCB1bmRlZmluZWQsXG4gICAgcHJvZmlsZT86IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5sb2coTG9nTGV2ZWwuVmVyYm9zZSwgbWVzc2FnZSwgZGF0YSwgcHJvZmlsZSk7XG4gIH1cblxuICBkZWJ1ZyhcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgZGF0YT86IExvZ0RhdGEgfCB1bmRlZmluZWQsXG4gICAgcHJvZmlsZT86IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5sb2coTG9nTGV2ZWwuRGVidWcsIG1lc3NhZ2UsIGRhdGEsIHByb2ZpbGUpO1xuICB9XG4gIGluZm8oXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGRhdGE/OiBMb2dEYXRhIHwgdW5kZWZpbmVkLFxuICAgIHByb2ZpbGU/OiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubG9nKExvZ0xldmVsLkluZm8sIG1lc3NhZ2UsIGRhdGEsIHByb2ZpbGUpO1xuICB9XG4gIHdhcm4oXG4gICAgbWVzc2FnZTogc3RyaW5nIHwgRXJyb3IsXG4gICAgZGF0YT86IExvZ0RhdGEgfCB1bmRlZmluZWQsXG4gICAgcHJvZmlsZT86IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5sb2coTG9nTGV2ZWwuV2FybiwgbWVzc2FnZSwgZGF0YSwgcHJvZmlsZSk7XG4gIH1cbiAgZXJyb3IoXG4gICAgbWVzc2FnZTogc3RyaW5nIHwgRXJyb3IsXG4gICAgZGF0YT86IExvZ0RhdGEgfCB1bmRlZmluZWQsXG4gICAgcHJvZmlsZT86IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5sb2coTG9nTGV2ZWwuRXJyb3IsIG1lc3NhZ2UsIGRhdGEsIHByb2ZpbGUpO1xuICB9XG4gIGVtZXJnKFxuICAgIG1lc3NhZ2U6IHN0cmluZyB8IEVycm9yLFxuICAgIGRhdGE/OiBMb2dEYXRhIHwgdW5kZWZpbmVkLFxuICAgIHByb2ZpbGU/OiBzdHJpbmcgfCB1bmRlZmluZWRcbiAgKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMubG9nKExvZ0xldmVsLkZhdGFsLCBtZXNzYWdlLCBkYXRhLCBwcm9maWxlKTtcbiAgfVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIHByb2ZpbGUoaWQ6IHN0cmluZyB8IG51bWJlciwgbWV0YT86IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJOb3QgaW1wbGVtZW50ZWRcIik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlZmF1bHRMb2dnZXJGYWN0b3J5IGV4dGVuZHMgTG9nZ2VyRmFjdG9yeSB7XG4gIGNvbnN0cnVjdG9yKGxldmVsOiBMb2dMZXZlbCkge1xuICAgIHN1cGVyKGxldmVsKTtcbiAgfVxuXG4gIGZvckNsYXNzKGNsYXp6OiBuZXcgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpOiBMb2dnZXIge1xuICAgIHJldHVybiBuZXcgRGVmYXVsdExvZ2dlcih0aGlzLmxldmVsLCBjbGF6ei5uYW1lKTtcbiAgfVxuICBmb3JNZXRob2QoXG4gICAgY2xheno6IG5ldyAoLi4uYXJnczogYW55W10pID0+IGFueSxcbiAgICBtZXRob2Q6IHN0cmluZyB8ICgoLi4uYXJnczogYW55W10pID0+IGFueSlcbiAgKTogTG9nZ2VyIHtcbiAgICByZXR1cm4gbmV3IERlZmF1bHRMb2dnZXIoXG4gICAgICB0aGlzLmxldmVsLFxuICAgICAgY2xhenoubmFtZSxcbiAgICAgIHR5cGVvZiBtZXRob2QgPT09IFwic3RyaW5nXCIgPyBtZXRob2QgOiBtZXRob2QubmFtZVxuICAgICk7XG4gIH1cblxuICBnZXQoKTogTG9nZ2VyIHtcbiAgICByZXR1cm4gbmV3IERlZmF1bHRMb2dnZXIodGhpcy5sZXZlbCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IExvZ2dlciB9IGZyb20gXCIuL2ludGVyZmFjZXNcIjtcbmltcG9ydCB7IExvZ2dlckZhY3RvcnkgfSBmcm9tIFwiLi9GYWN0b3J5XCI7XG5pbXBvcnQgeyBMb2dMZXZlbCB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRGVmYXVsdExvZ2dlckZhY3RvcnkgfSBmcm9tIFwiLi9kZWZhdWx0XCI7XG5cbmV4cG9ydCBjbGFzcyBMb2dnaW5nIHtcbiAgcHJpdmF0ZSBzdGF0aWMgX2xldmVsOiBMb2dMZXZlbCA9IExvZ0xldmVsLkluZm87XG4gIHByaXZhdGUgc3RhdGljIF9mYWN0b3J5OiB7IG5ldyAobGV2ZWw6IExvZ0xldmVsKTogTG9nZ2VyRmFjdG9yeSB9ID1cbiAgICBEZWZhdWx0TG9nZ2VyRmFjdG9yeTtcbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBMb2dnZXJGYWN0b3J5O1xuXG4gIHByaXZhdGUgc3RhdGljIGNhY2hlQnlDbGFzczogUmVjb3JkPHN0cmluZywgTG9nZ2VyPiA9IHt9O1xuICBwcml2YXRlIHN0YXRpYyBjYWNoZUJ5Q2xhc3NNZXRob2Q6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIExvZ2dlcj4+ID1cbiAgICB7fTtcbiAgcHJpdmF0ZSBzdGF0aWMgZ2xvYmFsOiBMb2dnZXI7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgc3RhdGljIGdldCBsZXZlbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fbGV2ZWw7XG4gIH1cblxuICBzdGF0aWMgc2V0IGxldmVsKGxldmVsOiBMb2dMZXZlbCkge1xuICAgIHRoaXMuX2xldmVsID0gbGV2ZWw7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIGdldCBpbnN0YW5jZSgpOiBMb2dnZXJGYWN0b3J5IHtcbiAgICBpZiAoIXRoaXMuX2luc3RhbmNlKSB0aGlzLl9pbnN0YW5jZSA9IG5ldyB0aGlzLl9mYWN0b3J5KExvZ2dpbmcubGV2ZWwpO1xuICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZTtcbiAgfVxuXG4gIHN0YXRpYyBzZXQgZmFjdG9yeShmYWN0b3J5OiB7IG5ldyAobGV2ZWw6IExvZ0xldmVsKTogTG9nZ2VyRmFjdG9yeSB9KSB7XG4gICAgdGhpcy5fZmFjdG9yeSA9IGZhY3Rvcnk7XG4gIH1cblxuICBzdGF0aWMgZm9yQ2xhc3MoY2xheno6IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IGFueSB9KSB7XG4gICAgY29uc3QgbmFtZSA9IGNsYXp6Lm5hbWU7XG4gICAgaWYgKCEobmFtZSBpbiB0aGlzLmNhY2hlQnlDbGFzcykpXG4gICAgICB0aGlzLmNhY2hlQnlDbGFzc1tuYW1lXSA9IExvZ2dpbmcuaW5zdGFuY2UuZm9yQ2xhc3MoY2xhenopO1xuICAgIHJldHVybiB0aGlzLmNhY2hlQnlDbGFzc1tuYW1lXTtcbiAgfVxuXG4gIHN0YXRpYyBmb3JNZXRob2QoXG4gICAgY2xheno6IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IGFueSB9LFxuICAgIG1ldGhvZDogKCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSB8IHN0cmluZ1xuICApOiBMb2dnZXIge1xuICAgIGNvbnN0IG5hbWUgPSBjbGF6ei5uYW1lO1xuICAgIGlmICghKG5hbWUgaW4gdGhpcy5jYWNoZUJ5Q2xhc3NNZXRob2QpKSB0aGlzLmNhY2hlQnlDbGFzc01ldGhvZFtuYW1lXSA9IHt9O1xuICAgIGNvbnN0IG1ldGhvZE5hbWUgPSB0eXBlb2YgbWV0aG9kID09PSBcInN0cmluZ1wiID8gbWV0aG9kIDogbWV0aG9kLm5hbWU7XG4gICAgaWYgKCEobWV0aG9kTmFtZSBpbiB0aGlzLmNhY2hlQnlDbGFzc01ldGhvZFtuYW1lXSkpXG4gICAgICB0aGlzLmNhY2hlQnlDbGFzc01ldGhvZFtuYW1lXVttZXRob2ROYW1lXSA9IExvZ2dpbmcuaW5zdGFuY2UuZm9yTWV0aG9kKFxuICAgICAgICBjbGF6eixcbiAgICAgICAgbWV0aG9kXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLmNhY2hlQnlDbGFzc01ldGhvZFtuYW1lXVttZXRob2ROYW1lXTtcbiAgfVxuXG4gIHN0YXRpYyBnZXQoKTogTG9nZ2VyIHtcbiAgICBpZiAoIXRoaXMuZ2xvYmFsKSB0aGlzLmdsb2JhbCA9IExvZ2dpbmcuaW5zdGFuY2UuZ2V0KCk7XG4gICAgcmV0dXJuIHRoaXMuZ2xvYmFsO1xuICB9XG59XG4iLCJleHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlZmF1bHRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0ZhY3RvcnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ludGVyZmFjZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2xvZ2dpbmdcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgTW9kdWxlIHN1bW1hcnlcbiAqIEBkZXNjcmlwdGlvbiBNb2R1bGUgZGVzY3JpcHRpb25cbiAqIEBtb2R1bGUgTG9nZ2luZ1xuICovXG5cbi8qKlxuICogQHN1bW1hcnkgTG9nZ2luZ1xuICogQGRlc2NyaXB0aW9uIE5hbWVzcGFjZSBkZXNjcmlwdGlvblxuICogQG5hbWVzcGFjZSBMb2dnaW5nXG4gKiBAbWVtYmVyT2YgbW9kdWxlOkxvZ2dpbmdcbiAqL1xuXG4vKipcbiAqIEBzdW1tYXJ5IHN0b3JlcyB0aGUgY3VycmVudCBwYWNrYWdlIHZlcnNpb25cbiAqIEBkZXNjcmlwdGlvbiB0aGlzIGlzIGhvdyB5b3Ugc2hvdWxkIGRvY3VtZW50IGEgY29uc3RhbnRcbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnRzLXdvcmtzcGFjZVxuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiSUFBWTtBQUFaLENBQUEsVUFBWSxRQUFRLEVBQUE7QUFDbEIsSUFBQSxRQUFBLENBQUEsT0FBQSxDQUFBLEdBQUEsT0FBZTtBQUNmLElBQUEsUUFBQSxDQUFBLE9BQUEsQ0FBQSxHQUFBLE9BQWU7QUFDZixJQUFBLFFBQUEsQ0FBQSxNQUFBLENBQUEsR0FBQSxNQUFhO0FBQ2IsSUFBQSxRQUFBLENBQUEsTUFBQSxDQUFBLEdBQUEsTUFBYTtBQUNiLElBQUEsUUFBQSxDQUFBLE1BQUEsQ0FBQSxHQUFBLE1BQWE7QUFDYixJQUFBLFFBQUEsQ0FBQSxTQUFBLENBQUEsR0FBQSxTQUFtQjtBQUNuQixJQUFBLFFBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxPQUFlO0FBQ2YsSUFBQSxRQUFBLENBQUEsT0FBQSxDQUFBLEdBQUEsT0FBZTtBQUNqQixDQUFDLEVBVFcsUUFBUSxLQUFSLFFBQVEsR0FTbkIsRUFBQSxDQUFBLENBQUE7QUFFWSxNQUFBLGdCQUFnQixHQUFHO0FBQzlCLElBQUEsS0FBSyxFQUFFLENBQUM7QUFDUixJQUFBLElBQUksRUFBRSxDQUFDO0FBQ1AsSUFBQSxJQUFJLEVBQUUsQ0FBQztBQUNQLElBQUEsSUFBSSxFQUFFLENBQUM7QUFDUCxJQUFBLE9BQU8sRUFBRSxDQUFDO0FBQ1YsSUFBQSxLQUFLLEVBQUUsQ0FBQztBQUNSLElBQUEsS0FBSyxFQUFFLENBQUM7OztNQ2ZZLGFBQWEsQ0FBQTtBQUNqQyxJQUFBLFdBQUEsQ0FBZ0MsS0FBZSxFQUFBO1FBQWYsSUFBSyxDQUFBLEtBQUEsR0FBTCxLQUFLOztBQU90Qzs7QUNUSyxTQUFVLFVBQVUsQ0FBQyxLQUFlLEVBQUE7QUFDeEMsSUFBQSxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsSUFBSSxnQkFBZ0IsRUFBRTtBQUN4QyxRQUFBLE9BQVEsZ0JBQXdDLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDOztJQUVwRSxNQUFNLElBQUksS0FBSyxDQUFDLENBQWtCLGVBQUEsRUFBQSxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUUsQ0FBQSxDQUFDO0FBQ3ZEOztBQ0ZBLE1BQU0sYUFBYSxDQUFBO0FBQ2pCLElBQUEsV0FBQSxDQUNZLEtBQWUsRUFDZixLQUFjLEVBQ2QsTUFBZSxFQUFBO1FBRmYsSUFBSyxDQUFBLEtBQUEsR0FBTCxLQUFLO1FBQ0wsSUFBSyxDQUFBLEtBQUEsR0FBTCxLQUFLO1FBQ0wsSUFBTSxDQUFBLE1BQUEsR0FBTixNQUFNOztBQUdsQixJQUFBLEdBQUcsQ0FDRCxLQUFlLEVBQ2YsT0FBdUIsRUFDdkIsSUFBMEIsRUFDMUIsT0FBNEIsRUFBQTtRQUU1QixJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUFFO1FBRWhELE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUU7QUFHbkMsUUFBQSxNQUFNLEdBQUcsR0FBRyxDQUFHLEVBQUEsT0FBTyxHQUFHLENBQUksQ0FBQSxFQUFBLE9BQU8sR0FBRyxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsQ0FBSSxDQUFBLEVBQUEsR0FBRyxDQUFHLENBQUEsQ0FBQSxHQUFHLEVBQUUsQ0FBRyxFQUFBLE9BQU8sR0FBRyxDQUFJLENBQUEsRUFBQSxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUcsRUFBQSxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUksQ0FBQSxFQUFBLElBQUksQ0FBQyxLQUFLLENBQUEsQ0FBQSxDQUFHLEdBQUcsRUFBRSxDQUFBLEVBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFBLENBQUEsRUFBSSxJQUFJLENBQUMsTUFBTSxDQUFHLENBQUEsQ0FBQSxHQUFHLEVBQUUsQ0FBSSxDQUFBLEVBQUEsT0FBTyxFQUFFO1FBQy9MLFFBQVEsS0FBSztZQUNiLEtBQUssUUFBUSxDQUFDLEtBQUs7WUFDbkIsS0FBSyxRQUFRLENBQUMsS0FBSztBQUNqQixnQkFBQSxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1lBQzNCLEtBQUssUUFBUSxDQUFDLElBQUk7QUFDaEIsZ0JBQUEsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztZQUMxQixLQUFLLFFBQVEsQ0FBQyxJQUFJO0FBQ2hCLGdCQUFBLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDMUIsS0FBSyxRQUFRLENBQUMsSUFBSTtZQUNsQixLQUFLLFFBQVEsQ0FBQyxPQUFPO1lBQ3JCLEtBQUssUUFBUSxDQUFDLEtBQUs7WUFDbkIsS0FBSyxRQUFRLENBQUMsS0FBSztBQUNqQixnQkFBQSxPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO0FBQzNCLFlBQUE7QUFDRSxnQkFBQSxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixLQUFLLENBQUEsQ0FBRSxDQUFDOzs7QUFHbEQsSUFBQSxLQUFLLENBQ0gsT0FBZSxFQUNmLElBQTBCLEVBQzFCLE9BQTRCLEVBQUE7QUFFNUIsUUFBQSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQzs7QUFHekQsSUFBQSxPQUFPLENBQ0wsT0FBZSxFQUNmLElBQTBCLEVBQzFCLE9BQTRCLEVBQUE7QUFFNUIsUUFBQSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQzs7QUFHM0QsSUFBQSxLQUFLLENBQ0gsT0FBZSxFQUNmLElBQTBCLEVBQzFCLE9BQTRCLEVBQUE7QUFFNUIsUUFBQSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQzs7QUFFekQsSUFBQSxJQUFJLENBQ0YsT0FBZSxFQUNmLElBQTBCLEVBQzFCLE9BQTRCLEVBQUE7QUFFNUIsUUFBQSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQzs7QUFFeEQsSUFBQSxJQUFJLENBQ0YsT0FBdUIsRUFDdkIsSUFBMEIsRUFDMUIsT0FBNEIsRUFBQTtBQUU1QixRQUFBLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDOztBQUV4RCxJQUFBLEtBQUssQ0FDSCxPQUF1QixFQUN2QixJQUEwQixFQUMxQixPQUE0QixFQUFBO0FBRTVCLFFBQUEsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUM7O0FBRXpELElBQUEsS0FBSyxDQUNILE9BQXVCLEVBQ3ZCLElBQTBCLEVBQzFCLE9BQTRCLEVBQUE7QUFFNUIsUUFBQSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQzs7O0lBR3pELE9BQU8sQ0FBQyxFQUFtQixFQUFFLElBQXNDLEVBQUE7QUFDakUsUUFBQSxNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDOztBQUVyQztBQUVLLE1BQU8sb0JBQXFCLFNBQVEsYUFBYSxDQUFBO0FBQ3JELElBQUEsV0FBQSxDQUFZLEtBQWUsRUFBQTtRQUN6QixLQUFLLENBQUMsS0FBSyxDQUFDOztBQUdkLElBQUEsUUFBUSxDQUFDLEtBQWtDLEVBQUE7UUFDekMsT0FBTyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUM7O0lBRWxELFNBQVMsQ0FDUCxLQUFrQyxFQUNsQyxNQUEwQyxFQUFBO1FBRTFDLE9BQU8sSUFBSSxhQUFhLENBQ3RCLElBQUksQ0FBQyxLQUFLLEVBQ1YsS0FBSyxDQUFDLElBQUksRUFDVixPQUFPLE1BQU0sS0FBSyxRQUFRLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQ2xEOztJQUdILEdBQUcsR0FBQTtBQUNELFFBQUEsT0FBTyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDOztBQUV2Qzs7TUNuSFksT0FBTyxDQUFBO0FBQ0gsSUFBQSxTQUFBLElBQUEsQ0FBQSxNQUFNLEdBQWEsUUFBUSxDQUFDLElBQUksQ0FBQzthQUNqQyxJQUFRLENBQUEsUUFBQSxHQUNyQixvQkFBb0IsQ0FBQzthQUdSLElBQVksQ0FBQSxZQUFBLEdBQTJCLEVBQUUsQ0FBQzthQUMxQyxJQUFrQixDQUFBLGtCQUFBLEdBQy9CLEVBQUUsQ0FBQztBQUdMLElBQUEsV0FBQSxHQUFBO0FBRUEsSUFBQSxXQUFXLEtBQUssR0FBQTtRQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU07O0lBR3BCLFdBQVcsS0FBSyxDQUFDLEtBQWUsRUFBQTtBQUM5QixRQUFBLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSzs7QUFHWCxJQUFBLFdBQVcsUUFBUSxHQUFBO1FBQzNCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUztBQUFFLFlBQUEsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUN0RSxPQUFPLElBQUksQ0FBQyxTQUFTOztJQUd2QixXQUFXLE9BQU8sQ0FBQyxPQUFpRCxFQUFBO0FBQ2xFLFFBQUEsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPOztJQUd6QixPQUFPLFFBQVEsQ0FBQyxLQUFvQyxFQUFBO0FBQ2xELFFBQUEsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUk7QUFDdkIsUUFBQSxJQUFJLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUM7QUFDOUIsWUFBQSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztBQUM1RCxRQUFBLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7O0FBR2hDLElBQUEsT0FBTyxTQUFTLENBQ2QsS0FBb0MsRUFDcEMsTUFBMEMsRUFBQTtBQUUxQyxRQUFBLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJO0FBQ3ZCLFFBQUEsSUFBSSxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUM7QUFBRSxZQUFBLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO0FBQzFFLFFBQUEsTUFBTSxVQUFVLEdBQUcsT0FBTyxNQUFNLEtBQUssUUFBUSxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSTtRQUNwRSxJQUFJLEVBQUUsVUFBVSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNoRCxZQUFBLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FDcEUsS0FBSyxFQUNMLE1BQU0sQ0FDUDtRQUNILE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQzs7QUFHbEQsSUFBQSxPQUFPLEdBQUcsR0FBQTtRQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTTtZQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDdEQsT0FBTyxJQUFJLENBQUMsTUFBTTs7OztBQ3BEdEI7Ozs7QUFJRztBQUVIOzs7OztBQUtHO0FBRUg7Ozs7O0FBS0c7QUFDSSxNQUFNLE9BQU8sR0FBRzs7OzsifQ==
500
+ export { DefaultLoggingConfig, DefaultTheme, LogLevel, Logging, LoggingMode, MiniLogger, NumericLogLevels, VERSION };
501
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2luZy5lc20uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2xvZ2dpbmcudHMiLCIuLi9zcmMvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTG9nZ2luZ0NvbmZpZywgVGhlbWUgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFbnVtIGZvciBsb2cgbGV2ZWxzLlxuICogQHN1bW1hcnkgRGVmaW5lcyBkaWZmZXJlbnQgbGV2ZWxzIG9mIGxvZ2dpbmcgZm9yIHRoZSBhcHBsaWNhdGlvbi5cbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAbWVtYmVyT2YgQGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCBlbnVtIExvZ0xldmVsIHtcbiAgLyoqIEVycm9yIGV2ZW50cyB0aGF0IGFyZSBsaWtlbHkgdG8gY2F1c2UgcHJvYmxlbXMuICovXG4gIGVycm9yID0gXCJlcnJvclwiLFxuICAvKiogUm91dGluZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBvbmdvaW5nIHN0YXR1cyBvciBwZXJmb3JtYW5jZS4gKi9cbiAgaW5mbyA9IFwiaW5mb1wiLFxuICAvKiogQWRkaXRpb25hbCByZWxldmFudCBpbmZvcm1hdGlvbi4gKi9cbiAgdmVyYm9zZSA9IFwidmVyYm9zZVwiLFxuICAvKiogRGVidWcgb3IgdHJhY2UgaW5mb3JtYXRpb24uICovXG4gIGRlYnVnID0gXCJkZWJ1Z1wiLFxuICAvKiogd2F5IHRvbyB2ZXJib3NlIG9yIHNpbGx5IGluZm9ybWF0aW9uLiAqL1xuICBzaWxseSA9IFwic2lsbHlcIixcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTnVtZXJpYyB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGxvZyBsZXZlbHMuXG4gKiBAc3VtbWFyeSBQcm92aWRlcyBhIG51bWVyaWMgcmVwcmVzZW50YXRpb24gb2YgbG9nIGxldmVscyBmb3IgY29tcGFyaXNvbiBhbmQgZmlsdGVyaW5nLlxuICogQGNvbnN0IHtPYmplY3R9IE51bWVyaWNMb2dMZXZlbHNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBlcnJvciAtIE51bWVyaWMgdmFsdWUgZm9yIGVycm9yIGxldmVsICgwKS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBpbmZvIC0gTnVtZXJpYyB2YWx1ZSBmb3IgaW5mbyBsZXZlbCAoMikuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdmVyYm9zZSAtIE51bWVyaWMgdmFsdWUgZm9yIHZlcmJvc2UgbGV2ZWwgKDQpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IGRlYnVnIC0gTnVtZXJpYyB2YWx1ZSBmb3IgZGVidWcgbGV2ZWwgKDUpLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNpbGx5IC0gTnVtZXJpYyB2YWx1ZSBmb3Igc2lsbHkgbGV2ZWwgKDgpLlxuICogQG1lbWJlck9mIEBkZWNhZi10cy91dGlsc1xuICovXG5leHBvcnQgY29uc3QgTnVtZXJpY0xvZ0xldmVscyA9IHtcbiAgZXJyb3I6IDIsXG4gIGluZm86IDQsXG4gIHZlcmJvc2U6IDYsXG4gIGRlYnVnOiA3LFxuICBzaWxseTogOSxcbn07XG5cbmV4cG9ydCBlbnVtIExvZ2dpbmdNb2RlIHtcbiAgUkFXID0gXCJyYXdcIixcbiAgSlNPTiA9IFwianNvblwiLFxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IHRoZW1lIGZvciBzdHlsaW5nIGxvZyBvdXRwdXQuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBkZWZhdWx0IGNvbG9yIGFuZCBzdHlsZSBzZXR0aW5ncyBmb3IgdmFyaW91cyBjb21wb25lbnRzIG9mIGxvZyBtZXNzYWdlcy5cbiAqIEBjb25zdCBEZWZhdWx0VGhlbWVcbiAqIEB0eXBlZGVmIHtUaGVtZX0gRGVmYXVsdFRoZW1lXG4gKiBAcHJvcGVydHkge09iamVjdH0gY2xhc3MgLSBTdHlsaW5nIGZvciBjbGFzcyBuYW1lcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjbGFzcy5mZyAtIEZvcmVncm91bmQgY29sb3IgY29kZSBmb3IgY2xhc3MgbmFtZXMgKDQpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGlkIC0gU3R5bGluZyBmb3IgaWRlbnRpZmllcnMuXG4gKiBAcHJvcGVydHkge251bWJlcn0gaWQuZmcgLSBGb3JlZ3JvdW5kIGNvbG9yIGNvZGUgZm9yIGlkZW50aWZpZXJzICgzNikuXG4gKiBAcHJvcGVydHkge09iamVjdH0gc3RhY2sgLSBTdHlsaW5nIGZvciBzdGFjayB0cmFjZXMgKGVtcHR5IG9iamVjdCkuXG4gKiBAcHJvcGVydHkge09iamVjdH0gdGltZXN0YW1wIC0gU3R5bGluZyBmb3IgdGltZXN0YW1wcyAoZW1wdHkgb2JqZWN0KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBtZXNzYWdlIC0gU3R5bGluZyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIG1lc3NhZ2VzLlxuICogQHByb3BlcnR5IHtPYmplY3R9IG1lc3NhZ2UuZXJyb3IgLSBTdHlsaW5nIGZvciBlcnJvciBtZXNzYWdlcy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtZXNzYWdlLmVycm9yLmZnIC0gRm9yZWdyb3VuZCBjb2xvciBjb2RlIGZvciBlcnJvciBtZXNzYWdlcyAoMzQpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IG1ldGhvZCAtIFN0eWxpbmcgZm9yIG1ldGhvZCBuYW1lcyAoZW1wdHkgb2JqZWN0KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2dMZXZlbCAtIFN0eWxpbmcgZm9yIGRpZmZlcmVudCBsb2cgbGV2ZWxzLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGxvZ0xldmVsLmVycm9yIC0gU3R5bGluZyBmb3IgZXJyb3IgbGV2ZWwgbG9ncy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsb2dMZXZlbC5lcnJvci5mZyAtIEZvcmVncm91bmQgY29sb3IgY29kZSBmb3IgZXJyb3IgbGV2ZWwgbG9ncyAoNikuXG4gKiBAcHJvcGVydHkge09iamVjdH0gbG9nTGV2ZWwuaW5mbyAtIFN0eWxpbmcgZm9yIGluZm8gbGV2ZWwgbG9ncyAoZW1wdHkgb2JqZWN0KS5cbiAqIEBwcm9wZXJ0eSB7T2JqZWN0fSBsb2dMZXZlbC52ZXJib3NlIC0gU3R5bGluZyBmb3IgdmVyYm9zZSBsZXZlbCBsb2dzIChlbXB0eSBvYmplY3QpLlxuICogQHByb3BlcnR5IHtPYmplY3R9IGxvZ0xldmVsLmRlYnVnIC0gU3R5bGluZyBmb3IgZGVidWcgbGV2ZWwgbG9ncy5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsb2dMZXZlbC5kZWJ1Zy5mZyAtIEZvcmVncm91bmQgY29sb3IgY29kZSBmb3IgZGVidWcgbGV2ZWwgbG9ncyAoNykuXG4gKiBAbWVtYmVyT2YgQGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0VGhlbWU6IFRoZW1lID0ge1xuICBjbGFzczoge1xuICAgIGZnOiAzNCxcbiAgfSxcbiAgaWQ6IHtcbiAgICBmZzogMzYsXG4gIH0sXG4gIHN0YWNrOiB7fSxcbiAgdGltZXN0YW1wOiB7fSxcbiAgbWVzc2FnZToge1xuICAgIGVycm9yOiB7XG4gICAgICBmZzogMzEsXG4gICAgfSxcbiAgfSxcbiAgbWV0aG9kOiB7fSxcbiAgbG9nTGV2ZWw6IHtcbiAgICBlcnJvcjoge1xuICAgICAgZmc6IDMxLFxuICAgICAgc3R5bGU6IFtcImJvbGRcIl0sXG4gICAgfSxcbiAgICBpbmZvOiB7fSxcbiAgICB2ZXJib3NlOiB7fSxcbiAgICBkZWJ1Zzoge1xuICAgICAgZmc6IDMzLFxuICAgIH0sXG4gIH0sXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIGxvZ2dpbmcuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBkZWZhdWx0IHNldHRpbmdzIGZvciB0aGUgbG9nZ2luZyBzeXN0ZW0sIGluY2x1ZGluZyB2ZXJib3NpdHksIGxvZyBsZXZlbCwgc3R5bGluZywgYW5kIHRpbWVzdGFtcCBmb3JtYXQuXG4gKiBAY29uc3QgRGVmYXVsdExvZ2dpbmdDb25maWdcbiAqIEB0eXBlZGVmIHtMb2dnaW5nQ29uZmlnfSBEZWZhdWx0TG9nZ2luZ0NvbmZpZ1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHZlcmJvc2UgLSBWZXJib3NpdHkgbGV2ZWwgKDApLlxuICogQHByb3BlcnR5IHtMb2dMZXZlbH0gbGV2ZWwgLSBEZWZhdWx0IGxvZyBsZXZlbCAoTG9nTGV2ZWwuaW5mbykuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHN0eWxlIC0gV2hldGhlciB0byBhcHBseSBzdHlsaW5nIHRvIGxvZyBvdXRwdXQgKGZhbHNlKS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdGltZXN0YW1wIC0gV2hldGhlciB0byBpbmNsdWRlIHRpbWVzdGFtcHMgaW4gbG9nIG1lc3NhZ2VzICh0cnVlKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aW1lc3RhbXBGb3JtYXQgLSBGb3JtYXQgZm9yIHRpbWVzdGFtcHMgKFwiSEg6bW06c3MuU1NTXCIpLlxuICogQHByb3BlcnR5IHtib29sZWFufSBjb250ZXh0IC0gV2hldGhlciB0byBpbmNsdWRlIGNvbnRleHQgaW5mb3JtYXRpb24gaW4gbG9nIG1lc3NhZ2VzICh0cnVlKS5cbiAqIEBwcm9wZXJ0eSB7VGhlbWV9IHRoZW1lIC0gVGhlIHRoZW1lIHRvIHVzZSBmb3Igc3R5bGluZyBsb2cgbWVzc2FnZXMgKERlZmF1bHRUaGVtZSkuXG4gKiBAbWVtYmVyT2YgQGRlY2FmLXRzL3V0aWxzXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0TG9nZ2luZ0NvbmZpZzogTG9nZ2luZ0NvbmZpZyA9IHtcbiAgdmVyYm9zZTogMCxcbiAgbGV2ZWw6IExvZ0xldmVsLmluZm8sXG4gIGxvZ0xldmVsOiB0cnVlLFxuICBtb2RlOiBMb2dnaW5nTW9kZS5SQVcsXG4gIHN0eWxlOiBmYWxzZSxcbiAgc2VwYXJhdG9yOiBcIiAtIFwiLFxuICB0aW1lc3RhbXA6IHRydWUsXG4gIHRpbWVzdGFtcEZvcm1hdDogXCJISDptbTpzcy5TU1NcIixcbiAgY29udGV4dDogdHJ1ZSxcbiAgdGhlbWU6IERlZmF1bHRUaGVtZSxcbn07XG4iLCJpbXBvcnQge1xuICBMb2dnZXJGYWN0b3J5LFxuICBMb2dnaW5nQ29uZmlnLFxuICBMb2dnaW5nQ29udGV4dCxcbiAgU3RyaW5nTGlrZSxcbiAgVGhlbWUsXG4gIFRoZW1lT3B0aW9uLFxuICBUaGVtZU9wdGlvbkJ5TG9nTGV2ZWwsXG4gIExvZ2dlcixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IENvbG9yaXplT3B0aW9ucywgc3R5bGUsIFN0eWxlZFN0cmluZyB9IGZyb20gXCJzdHlsZWQtc3RyaW5nLWJ1aWxkZXJcIjtcbmltcG9ydCB7XG4gIERlZmF1bHRMb2dnaW5nQ29uZmlnLFxuICBEZWZhdWx0VGhlbWUsXG4gIExvZ0xldmVsLFxuICBOdW1lcmljTG9nTGV2ZWxzLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBtaW5pbWFsIGxvZ2dlciBpbXBsZW1lbnRhdGlvbi5cbiAqIEBzdW1tYXJ5IE1pbmlMb2dnZXIgaXMgYSBsaWdodHdlaWdodCBsb2dnaW5nIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgVmVyYm9zaXR5TG9nZ2VyIGludGVyZmFjZS5cbiAqIEl0IHByb3ZpZGVzIGJhc2ljIGxvZ2dpbmcgZnVuY3Rpb25hbGl0eSB3aXRoIHN1cHBvcnQgZm9yIGRpZmZlcmVudCBsb2cgbGV2ZWxzIGFuZCB2ZXJib3NpdHkuXG4gKlxuICogQGNsYXNzXG4gKi9cbmV4cG9ydCBjbGFzcyBNaW5pTG9nZ2VyIGltcGxlbWVudHMgTG9nZ2VyIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IE1pbmlMb2dnZXIgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgTWluaUxvZ2dlciB3aXRoIHRoZSBnaXZlbiBjbGFzcyBuYW1lLCBvcHRpb25hbCBjb25maWd1cmF0aW9uLCBhbmQgbWV0aG9kIG5hbWUuXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZXh0IC0gVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHVzaW5nIHRoaXMgbG9nZ2VyLlxuICAgKiBAcGFyYW0gW2NvbmZdIC0gT3B0aW9uYWwgbG9nZ2luZyBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byBJbmZvIGxldmVsIGFuZCB2ZXJib3NpdHkgMC5cbiAgICogQHBhcmFtIFtpZF0gLSBPcHRpb25hbCB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGxvZ2dlciBpbnN0YW5jZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBjb250ZXh0OiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIGNvbmY/OiBQYXJ0aWFsPExvZ2dpbmdDb25maWc+LFxuICAgIHByb3RlY3RlZCBpZD86IHN0cmluZ1xuICApIHt9XG5cbiAgcHJvdGVjdGVkIGNvbmZpZyhcbiAgICBrZXk6IGtleW9mIExvZ2dpbmdDb25maWdcbiAgKTogTG9nZ2luZ0NvbmZpZ1trZXlvZiBMb2dnaW5nQ29uZmlnXSB7XG4gICAgaWYgKHRoaXMuY29uZiAmJiBrZXkgaW4gdGhpcy5jb25mKSByZXR1cm4gdGhpcy5jb25mW2tleV07XG4gICAgcmV0dXJuIExvZ2dpbmcuZ2V0Q29uZmlnKClba2V5XTtcbiAgfVxuXG4gIGZvcihcbiAgICBtZXRob2Q/OiBzdHJpbmcgfCAoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpLFxuICAgIGNvbmZpZz86IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz5cbiAgKTogTG9nZ2VyIHtcbiAgICBtZXRob2QgPSBtZXRob2RcbiAgICAgID8gdHlwZW9mIG1ldGhvZCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IG1ldGhvZFxuICAgICAgICA6IG1ldGhvZC5uYW1lXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiBMb2dnaW5nLmZvcihbdGhpcy5jb250ZXh0LCBtZXRob2RdLmpvaW4oXCIuXCIpLCB0aGlzLmlkLCBjb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgZm9ybWF0dGVkIGxvZyBzdHJpbmcuXG4gICAqIEBzdW1tYXJ5IEdlbmVyYXRlcyBhIGxvZyBzdHJpbmcgd2l0aCB0aW1lc3RhbXAsIGNvbG9yZWQgbG9nIGxldmVsLCBhbmQgbWVzc2FnZS5cbiAgICpcbiAgICogQHBhcmFtIGxldmVsIC0gVGhlIGxvZyBsZXZlbCBhcyBhIHN0cmluZy5cbiAgICogQHBhcmFtIG1lc3NhZ2VcbiAgICogQHBhcmFtIHN0YWNrXG4gICAqIEByZXR1cm4gQSBmb3JtYXR0ZWQgbG9nIHN0cmluZy5cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVMb2coXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIG1lc3NhZ2U6IFN0cmluZ0xpa2UgfCBFcnJvcixcbiAgICBzdGFjaz86IHN0cmluZ1xuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IGxvZzogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCBzdHlsZSA9IHRoaXMuY29uZmlnKFwic3R5bGVcIik7XG4gICAgaWYgKHRoaXMuY29uZmlnKFwidGltZXN0YW1wXCIpKSB7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgY29uc3QgdGltZXN0YW1wID0gc3R5bGUgPyBMb2dnaW5nLnRoZW1lKGRhdGUsIFwidGltZXN0YW1wXCIsIGxldmVsKSA6IGRhdGU7XG4gICAgICBsb2cucHVzaCh0aW1lc3RhbXApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbmZpZyhcImxvZ0xldmVsXCIpKSB7XG4gICAgICBjb25zdCBsdmw6IHN0cmluZyA9IHN0eWxlXG4gICAgICAgID8gTG9nZ2luZy50aGVtZShsZXZlbCwgXCJsb2dMZXZlbFwiLCBsZXZlbClcbiAgICAgICAgOiBsZXZlbDtcbiAgICAgIGxvZy5wdXNoKGx2bCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnKFwiY29udGV4dFwiKSkge1xuICAgICAgY29uc3QgY29udGV4dDogc3RyaW5nID0gc3R5bGVcbiAgICAgICAgPyBMb2dnaW5nLnRoZW1lKHRoaXMuY29udGV4dCwgXCJjbGFzc1wiLCBsZXZlbClcbiAgICAgICAgOiB0aGlzLmNvbnRleHQ7XG4gICAgICBsb2cucHVzaChjb250ZXh0KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pZCkge1xuICAgICAge1xuICAgICAgICBjb25zdCBpZDogc3RyaW5nID0gc3R5bGVcbiAgICAgICAgICA/IExvZ2dpbmcudGhlbWUodGhpcy5pZCwgXCJpZFwiLCBsZXZlbClcbiAgICAgICAgICA6IHRoaXMuaWQ7XG4gICAgICAgIGxvZy5wdXNoKGlkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBtc2c6IHN0cmluZyA9IHN0eWxlXG4gICAgICA/IExvZ2dpbmcudGhlbWUoXG4gICAgICAgICAgdHlwZW9mIG1lc3NhZ2UgPT09IFwic3RyaW5nXCIgPyBtZXNzYWdlIDogKG1lc3NhZ2UgYXMgRXJyb3IpLm1lc3NhZ2UsXG4gICAgICAgICAgXCJtZXNzYWdlXCIsXG4gICAgICAgICAgbGV2ZWxcbiAgICAgICAgKVxuICAgICAgOiB0eXBlb2YgbWVzc2FnZSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IG1lc3NhZ2VcbiAgICAgICAgOiAobWVzc2FnZSBhcyBFcnJvcikubWVzc2FnZTtcbiAgICBsb2cucHVzaChtc2cpO1xuICAgIGlmIChzdGFjayB8fCBtZXNzYWdlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHN0YWNrID0gc3R5bGVcbiAgICAgICAgPyBMb2dnaW5nLnRoZW1lKFxuICAgICAgICAgICAgKHN0YWNrIHx8IChtZXNzYWdlIGFzIEVycm9yKS5zdGFjaykgYXMgc3RyaW5nLFxuICAgICAgICAgICAgXCJzdGFja1wiLFxuICAgICAgICAgICAgbGV2ZWxcbiAgICAgICAgICApXG4gICAgICAgIDogc3RhY2s7XG4gICAgICBsb2cucHVzaChgXFxuU3RhY2sgdHJhY2U6XFxuJHtzdGFja31gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbG9nLmpvaW4odGhpcy5jb25maWcoXCJzZXBhcmF0b3JcIikgYXMgc3RyaW5nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIG1lc3NhZ2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGxvZyBsZXZlbC5cbiAgICogQHN1bW1hcnkgQ2hlY2tzIGlmIHRoZSBtZXNzYWdlIHNob3VsZCBiZSBsb2dnZWQgYmFzZWQgb24gdGhlIGN1cnJlbnQgbG9nIGxldmVsLFxuICAgKiB0aGVuIHVzZXMgdGhlIGFwcHJvcHJpYXRlIGNvbnNvbGUgbWV0aG9kIHRvIG91dHB1dCB0aGUgbG9nLlxuICAgKlxuICAgKiBAcGFyYW0gbGV2ZWwgLSBUaGUgbG9nIGxldmVsIG9mIHRoZSBtZXNzYWdlLlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKiBAcGFyYW0gc3RhY2tcbiAgICovXG4gIHByb3RlY3RlZCBsb2coXG4gICAgbGV2ZWw6IExvZ0xldmVsLFxuICAgIG1zZzogU3RyaW5nTGlrZSB8IEVycm9yLFxuICAgIHN0YWNrPzogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIE51bWVyaWNMb2dMZXZlbHNbdGhpcy5jb25maWcoXCJsZXZlbFwiKSBhcyBMb2dMZXZlbF0gPFxuICAgICAgTnVtZXJpY0xvZ0xldmVsc1tsZXZlbF1cbiAgICApXG4gICAgICByZXR1cm47XG4gICAgbGV0IG1ldGhvZDtcbiAgICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgICBjYXNlIExvZ0xldmVsLmluZm86XG4gICAgICAgIG1ldGhvZCA9IGNvbnNvbGUubG9nO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgTG9nTGV2ZWwudmVyYm9zZTpcbiAgICAgIGNhc2UgTG9nTGV2ZWwuZGVidWc6XG4gICAgICAgIG1ldGhvZCA9IGNvbnNvbGUuZGVidWc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBMb2dMZXZlbC5lcnJvcjpcbiAgICAgICAgbWV0aG9kID0gY29uc29sZS5lcnJvcjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGxvZyBsZXZlbFwiKTtcbiAgICB9XG4gICAgbWV0aG9kKHRoaXMuY3JlYXRlTG9nKGxldmVsLCBtc2csIHN0YWNrKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExMb2dzIGEgYHdheSB0b28gdmVyYm9zZWAgb3IgYSBzaWxseSBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBMb2dzIGEgbWVzc2FnZSBhdCB0aGUgU2lsbHkgbGV2ZWwgaWYgdGhlIGN1cnJlbnQgdmVyYm9zaXR5IGFsbG93cyBpdC5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICogQHBhcmFtIHZlcmJvc2l0eSAtIFRoZSB2ZXJib3NpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKGRlZmF1bHQ6IDApLlxuICAgKi9cbiAgc2lsbHkobXNnOiBTdHJpbmdMaWtlLCB2ZXJib3NpdHk6IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICBpZiAoKHRoaXMuY29uZmlnKFwidmVyYm9zZVwiKSBhcyBudW1iZXIpID49IHZlcmJvc2l0eSlcbiAgICAgIHRoaXMubG9nKExvZ0xldmVsLnZlcmJvc2UsIG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYSB2ZXJib3NlIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBWZXJib3NlIGxldmVsIGlmIHRoZSBjdXJyZW50IHZlcmJvc2l0eSBhbGxvd3MgaXQuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqIEBwYXJhbSB2ZXJib3NpdHkgLSBUaGUgdmVyYm9zaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChkZWZhdWx0OiAwKS5cbiAgICovXG4gIHZlcmJvc2UobXNnOiBTdHJpbmdMaWtlLCB2ZXJib3NpdHk6IG51bWJlciA9IDApOiB2b2lkIHtcbiAgICBpZiAoKHRoaXMuY29uZmlnKFwidmVyYm9zZVwiKSBhcyBudW1iZXIpID49IHZlcmJvc2l0eSlcbiAgICAgIHRoaXMubG9nKExvZ0xldmVsLnZlcmJvc2UsIG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYW4gaW5mbyBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBMb2dzIGEgbWVzc2FnZSBhdCB0aGUgSW5mbyBsZXZlbC5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIGluZm8obXNnOiBTdHJpbmdMaWtlKTogdm9pZCB7XG4gICAgdGhpcy5sb2coTG9nTGV2ZWwuaW5mbywgbXNnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIGRlYnVnIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBEZWJ1ZyBsZXZlbC5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIGRlYnVnKG1zZzogU3RyaW5nTGlrZSk6IHZvaWQge1xuICAgIHRoaXMubG9nKExvZ0xldmVsLmRlYnVnLCBtc2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGFuIGVycm9yIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IExvZ3MgYSBtZXNzYWdlIGF0IHRoZSBFcnJvciBsZXZlbC5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIGVycm9yKG1zZzogU3RyaW5nTGlrZSB8IEVycm9yKTogdm9pZCB7XG4gICAgdGhpcy5sb2coTG9nTGV2ZWwuZXJyb3IsIG1zZyk7XG4gIH1cblxuICBzZXRDb25maWcoY29uZmlnOiBQYXJ0aWFsPExvZ2dpbmdDb25maWc+KSB7XG4gICAgdGhpcy5jb25mID0geyAuLi4odGhpcy5jb25mIHx8IHt9KSwgLi4uY29uZmlnIH07XG4gIH1cbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBzdGF0aWMgY2xhc3MgZm9yIG1hbmFnaW5nIGxvZ2dpbmcgb3BlcmF0aW9ucy5cbiAqIEBzdW1tYXJ5IFRoZSBMb2dnaW5nIGNsYXNzIHByb3ZpZGVzIGEgY2VudHJhbGl6ZWQgbG9nZ2luZyBtZWNoYW5pc20gd2l0aCBzdXBwb3J0IGZvclxuICogZGlmZmVyZW50IGxvZyBsZXZlbHMgYW5kIHZlcmJvc2l0eS4gSXQgdXNlcyBhIHNpbmdsZXRvbiBwYXR0ZXJuIHRvIG1haW50YWluIGEgZ2xvYmFsXG4gKiBsb2dnZXIgaW5zdGFuY2UgYW5kIGFsbG93cyBjcmVhdGluZyBzcGVjaWZpYyBsb2dnZXJzIGZvciBkaWZmZXJlbnQgY2xhc3NlcyBhbmQgbWV0aG9kcy5cbiAqXG4gKiBAY2xhc3NcbiAqL1xuZXhwb3J0IGNsYXNzIExvZ2dpbmcge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBnbG9iYWwgbG9nZ2VyIGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBBIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBWZXJib3NpdHlMb2dnZXIgdXNlZCBmb3IgZ2xvYmFsIGxvZ2dpbmcuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnbG9iYWw/OiBMb2dnZXI7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBjcmVhdGluZyBsb2dnZXIgaW5zdGFuY2VzLlxuICAgKiBAc3VtbWFyeSBBIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBuZXcgVmVyYm9zaXR5TG9nZ2VyIGluc3RhbmNlcy4gQnkgZGVmYXVsdCwgaXQgY3JlYXRlcyBhIE1pbmlMb2dnZXIuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfZmFjdG9yeTogTG9nZ2VyRmFjdG9yeSA9IChcbiAgICBvYmplY3Q6IHN0cmluZyxcbiAgICBjb25maWc/OiBQYXJ0aWFsPExvZ2dpbmdDb25maWc+LFxuICAgIGlkPzogc3RyaW5nXG4gICkgPT4ge1xuICAgIHJldHVybiBuZXcgTWluaUxvZ2dlcihvYmplY3QsIGNvbmZpZywgaWQpO1xuICB9O1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBsb2dnaW5nIHN5c3RlbS5cbiAgICogQHN1bW1hcnkgU3RvcmVzIHRoZSBnbG9iYWwgdmVyYm9zaXR5IGxldmVsIGFuZCBsb2cgbGV2ZWwgc2V0dGluZ3MuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBfY29uZmlnOiBMb2dnaW5nQ29uZmlnID0gRGVmYXVsdExvZ2dpbmdDb25maWc7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIHByZXZlbnQgaW5zdGFudGlhdGlvbi5cbiAgICogQHN1bW1hcnkgRW5zdXJlcyB0aGF0IHRoZSBMb2dnaW5nIGNsYXNzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgYXMgaXQncyBkZXNpZ25lZCB0byBiZSB1c2VkIHN0YXRpY2FsbHkuXG4gICAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICBzZXRGYWN0b3J5KGZhY3Rvcnk6IExvZ2dlckZhY3RvcnkpIHtcbiAgICBMb2dnaW5nLl9mYWN0b3J5ID0gZmFjdG9yeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0dGVyIGZvciB0aGUgbG9nZ2luZyBjb25maWd1cmF0aW9uLlxuICAgKiBAc3VtbWFyeSBBbGxvd3MgdXBkYXRpbmcgdGhlIGdsb2JhbCBsb2dnaW5nIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgLSBBbiBvYmplY3QgY29udGFpbmluZyB2ZXJib3NpdHkgYW5kIGxvZyBsZXZlbCBzZXR0aW5ncy5cbiAgICovXG4gIHN0YXRpYyBzZXRDb25maWcoY29uZmlnOiBQYXJ0aWFsPExvZ2dpbmdDb25maWc+KSB7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLl9jb25maWcsIGNvbmZpZyk7XG4gIH1cblxuICBzdGF0aWMgZ2V0Q29uZmlnKCk6IExvZ2dpbmdDb25maWcge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9jb25maWcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgb3IgY3JlYXRlcyB0aGUgZ2xvYmFsIGxvZ2dlciBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgZXhpc3RpbmcgZ2xvYmFsIGxvZ2dlciBvciBjcmVhdGVzIGEgbmV3IG9uZSBpZiBpdCBkb2Vzbid0IGV4aXN0LlxuICAgKlxuICAgKiBAcmV0dXJuIFRoZSBnbG9iYWwgVmVyYm9zaXR5TG9nZ2VyIGluc3RhbmNlLlxuICAgKi9cbiAgc3RhdGljIGdldCgpOiBMb2dnZXIge1xuICAgIHRoaXMuZ2xvYmFsID0gdGhpcy5nbG9iYWwgPyB0aGlzLmdsb2JhbCA6IHRoaXMuX2ZhY3RvcnkoXCJMb2dnaW5nXCIpO1xuICAgIHJldHVybiB0aGlzLmdsb2JhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIHZlcmJvc2UgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgRGVsZWdhdGVzIHRoZSB2ZXJib3NlIGxvZ2dpbmcgdG8gdGhlIGdsb2JhbCBsb2dnZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBtc2cgLSBUaGUgbWVzc2FnZSB0byBiZSBsb2dnZWQuXG4gICAqIEBwYXJhbSB2ZXJib3NpdHkgLSBUaGUgdmVyYm9zaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChkZWZhdWx0OiAwKS5cbiAgICovXG4gIHN0YXRpYyB2ZXJib3NlKG1zZzogU3RyaW5nTGlrZSwgdmVyYm9zaXR5OiBudW1iZXIgPSAwKTogdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KCkudmVyYm9zZShtc2csIHZlcmJvc2l0eSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYW4gaW5mbyBtZXNzYWdlLlxuICAgKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgdGhlIGluZm8gbG9nZ2luZyB0byB0aGUgZ2xvYmFsIGxvZ2dlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIHN0YXRpYyBpbmZvKG1zZzogU3RyaW5nTGlrZSk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmdldCgpLmluZm8obXNnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gTG9ncyBhIGRlYnVnIG1lc3NhZ2UuXG4gICAqIEBzdW1tYXJ5IERlbGVnYXRlcyB0aGUgZGVidWcgbG9nZ2luZyB0byB0aGUgZ2xvYmFsIGxvZ2dlciBpbnN0YW5jZS5cbiAgICpcbiAgICogQHBhcmFtIG1zZyAtIFRoZSBtZXNzYWdlIHRvIGJlIGxvZ2dlZC5cbiAgICovXG4gIHN0YXRpYyBkZWJ1Zyhtc2c6IFN0cmluZ0xpa2UpOiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoKS5kZWJ1Zyhtc2cpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBMb2dzIGEgc2lsbHkgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgRGVsZWdhdGVzIHRoZSBkZWJ1ZyBsb2dnaW5nIHRvIHRoZSBnbG9iYWwgbG9nZ2VyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgc3RhdGljIHNpbGx5KG1zZzogU3RyaW5nTGlrZSk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmdldCgpLnNpbGx5KG1zZyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIExvZ3MgYW4gZXJyb3IgbWVzc2FnZS5cbiAgICogQHN1bW1hcnkgRGVsZWdhdGVzIHRoZSBlcnJvciBsb2dnaW5nIHRvIHRoZSBnbG9iYWwgbG9nZ2VyIGluc3RhbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gbXNnIC0gVGhlIG1lc3NhZ2UgdG8gYmUgbG9nZ2VkLlxuICAgKi9cbiAgc3RhdGljIGVycm9yKG1zZzogU3RyaW5nTGlrZSk6IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmdldCgpLmVycm9yKG1zZyk7XG4gIH1cblxuICBzdGF0aWMgZm9yKFxuICAgIG9iamVjdDogTG9nZ2luZ0NvbnRleHQsXG4gICAgaWQ/OiBzdHJpbmcgfCBQYXJ0aWFsPExvZ2dpbmdDb25maWc+LFxuICAgIGNvbmZpZz86IFBhcnRpYWw8TG9nZ2luZ0NvbmZpZz5cbiAgKTogTG9nZ2VyIHtcbiAgICBvYmplY3QgPSB0eXBlb2Ygb2JqZWN0ID09PSBcInN0cmluZ1wiID8gb2JqZWN0IDogb2JqZWN0Lm5hbWU7XG4gICAgaWQgPSB0eXBlb2YgaWQgPT09IFwic3RyaW5nXCIgPyBpZCA6IHVuZGVmaW5lZDtcbiAgICBjb25maWcgPSB0eXBlb2YgaWQgPT09IFwib2JqZWN0XCIgPyAoaWQgYXMgUGFydGlhbDxMb2dnaW5nQ29uZmlnPikgOiBjb25maWc7XG4gICAgcmV0dXJuIHRoaXMuX2ZhY3Rvcnkob2JqZWN0LCBjb25maWcsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIGxvZ2dlciBmb3IgYSBzcGVjaWZpYyByZWFzb24gb3IgY29udGV4dC5cbiAgICpcbiAgICogQHN1bW1hcnkgVGhpcyBzdGF0aWMgbWV0aG9kIGNyZWF0ZXMgYSBuZXcgbG9nZ2VyIGluc3RhbmNlIHVzaW5nIHRoZSBmYWN0b3J5IGZ1bmN0aW9uLFxuICAgKiBiYXNlZCBvbiBhIGdpdmVuIHJlYXNvbiBvciBjb250ZXh0LlxuICAgKlxuICAgKiBAcGFyYW0gcmVhc29uIC0gQSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcmVhc29uIG9yIGNvbnRleHQgZm9yIGNyZWF0aW5nIHRoaXMgbG9nZ2VyLlxuICAgKiBAcGFyYW0gaWRcbiAgICogQHJldHVybnMgQSBuZXcgVmVyYm9zaXR5TG9nZ2VyIG9yIENsYXNzTG9nZ2VyIGluc3RhbmNlLlxuICAgKi9cbiAgc3RhdGljIGJlY2F1c2UocmVhc29uOiBzdHJpbmcsIGlkPzogc3RyaW5nKTogTG9nZ2VyIHtcbiAgICByZXR1cm4gdGhpcy5fZmFjdG9yeShyZWFzb24sIHRoaXMuX2NvbmZpZywgaWQpO1xuICB9XG5cbiAgc3RhdGljIHRoZW1lKFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICB0eXBlOiBrZXlvZiBUaGVtZSB8IGtleW9mIExvZ0xldmVsLFxuICAgIGxvZ2dlckxldmVsOiBMb2dMZXZlbCxcbiAgICB0ZW1wbGF0ZTogVGhlbWUgPSBEZWZhdWx0VGhlbWVcbiAgKSB7XG4gICAgaWYgKCF0aGlzLl9jb25maWcuc3R5bGUpIHJldHVybiB0ZXh0O1xuICAgIGNvbnN0IGxvZ2dlciA9IExvZ2dpbmcuZ2V0KCkuZm9yKHRoaXMudGhlbWUpO1xuXG4gICAgZnVuY3Rpb24gYXBwbHkoXG4gICAgICB0eHQ6IHN0cmluZyxcbiAgICAgIG9wdGlvbjoga2V5b2YgVGhlbWVPcHRpb24sXG4gICAgICB2YWx1ZTogbnVtYmVyIHwgW251bWJlcl0gfCBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gfCBudW1iZXJbXSB8IHN0cmluZ1tdXG4gICAgKTogc3RyaW5nIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHQ6IHN0cmluZyB8IFN0eWxlZFN0cmluZyA9IHR4dDtcbiAgICAgICAgbGV0IGMgPSBzdHlsZSh0KTtcblxuICAgICAgICBmdW5jdGlvbiBhcHBseUNvbG9yKFxuICAgICAgICAgIHZhbDogbnVtYmVyIHwgW251bWJlcl0gfCBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICAgICAgaXNCZyA9IGZhbHNlXG4gICAgICAgICk6IFN0eWxlZFN0cmluZyB7XG4gICAgICAgICAgbGV0IGY6XG4gICAgICAgICAgICB8IHR5cGVvZiBjLmJhY2tncm91bmRcbiAgICAgICAgICAgIHwgdHlwZW9mIGMuZm9yZWdyb3VuZFxuICAgICAgICAgICAgfCB0eXBlb2YgYy5yZ2JcbiAgICAgICAgICAgIHwgdHlwZW9mIGMuY29sb3IyNTYgPSBpc0JnID8gYy5iYWNrZ3JvdW5kIDogYy5mb3JlZ3JvdW5kO1xuICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgICAgICAgICByZXR1cm4gKGYgYXMgdHlwZW9mIGMuYmFja2dyb3VuZCB8IHR5cGVvZiBjLmZvcmVncm91bmQpLmNhbGwoXG4gICAgICAgICAgICAgIGMsXG4gICAgICAgICAgICAgIHZhbHVlIGFzIG51bWJlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3dpdGNoICh2YWwubGVuZ3RoKSB7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgIGYgPSBpc0JnID8gYy5iZ0NvbG9yMjU2IDogYy5jb2xvcjI1NjtcbiAgICAgICAgICAgICAgcmV0dXJuIChmIGFzIHR5cGVvZiBjLmJnQ29sb3IyNTYgfCB0eXBlb2YgYy5jb2xvcjI1NikodmFsWzBdKTtcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgICAgZiA9IGlzQmcgPyBjLmJnUmdiIDogYy5yZ2I7XG4gICAgICAgICAgICAgIHJldHVybiBjLnJnYih2YWxbMF0sIHZhbFsxXSwgdmFsWzJdKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90IGEgdmFsaWQgY29sb3Igb3B0aW9uOiAke29wdGlvbn1gKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHN0eWxlKHQgYXMgc3RyaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBhcHBseVN0eWxlKHY6IG51bWJlciB8IHN0cmluZyk6IHZvaWQge1xuICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICAgICAgYyA9IGMuc3R5bGUodik7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGMgPSBjW3YgYXMga2V5b2YgQ29sb3JpemVPcHRpb25zXSBhcyBTdHlsZWRTdHJpbmc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChvcHRpb24pIHtcbiAgICAgICAgICBjYXNlIFwiYmdcIjpcbiAgICAgICAgICBjYXNlIFwiZmdcIjpcbiAgICAgICAgICAgIHJldHVybiBhcHBseUNvbG9yKHZhbHVlIGFzIG51bWJlcikudGV4dDtcbiAgICAgICAgICBjYXNlIFwic3R5bGVcIjpcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKGFwcGx5U3R5bGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYXBwbHlTdHlsZSh2YWx1ZSBhcyBudW1iZXIgfCBzdHJpbmcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGMudGV4dDtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3QgYSB2YWxpZCB0aGVtZSBvcHRpb246ICR7b3B0aW9ufWApO1xuICAgICAgICAgICAgcmV0dXJuIHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgICBsb2dnZXIuZXJyb3IoYEVycm9yIGFwcGx5aW5nIHN0eWxlOiAke29wdGlvbn0gd2l0aCB2YWx1ZSAke3ZhbHVlfWApO1xuICAgICAgICByZXR1cm4gdHh0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGluZGl2aWR1YWxUaGVtZSA9IHRlbXBsYXRlW3R5cGUgYXMga2V5b2YgVGhlbWVdO1xuICAgIGlmICghaW5kaXZpZHVhbFRoZW1lIHx8ICFPYmplY3Qua2V5cyhpbmRpdmlkdWFsVGhlbWUpLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgbGV0IGFjdHVhbFRoZW1lOiBUaGVtZU9wdGlvbiA9IGluZGl2aWR1YWxUaGVtZSBhcyBUaGVtZU9wdGlvbjtcblxuICAgIGNvbnN0IGxvZ0xldmVscyA9IE9iamVjdC5hc3NpZ24oe30sIExvZ0xldmVsKTtcbiAgICBpZiAoT2JqZWN0LmtleXMoaW5kaXZpZHVhbFRoZW1lKVswXSBpbiBsb2dMZXZlbHMpXG4gICAgICBhY3R1YWxUaGVtZSA9XG4gICAgICAgIChpbmRpdmlkdWFsVGhlbWUgYXMgVGhlbWVPcHRpb25CeUxvZ0xldmVsKVtsb2dnZXJMZXZlbF0gfHwge307XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoYWN0dWFsVGhlbWUpLnJlZHVjZSgoYWNjOiBzdHJpbmcsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCB2YWwgPSAoYWN0dWFsVGhlbWUgYXMgVGhlbWVPcHRpb24pW2tleSBhcyBrZXlvZiBUaGVtZU9wdGlvbl07XG4gICAgICBpZiAodmFsKVxuICAgICAgICByZXR1cm4gYXBwbHkoXG4gICAgICAgICAgYWNjLFxuICAgICAgICAgIGtleSBhcyBrZXlvZiBUaGVtZU9wdGlvbixcbiAgICAgICAgICB2YWwgYXNcbiAgICAgICAgICAgIHwgbnVtYmVyXG4gICAgICAgICAgICB8IFtudW1iZXJdXG4gICAgICAgICAgICB8IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXVxuICAgICAgICAgICAgfCBudW1iZXJbXVxuICAgICAgICAgICAgfCBzdHJpbmdbXVxuICAgICAgICApO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB0ZXh0KTtcbiAgfVxufVxuIiwiZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9sb2dnaW5nXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IE1vZHVsZSBzdW1tYXJ5XG4gKiBAZGVzY3JpcHRpb24gTW9kdWxlIGRlc2NyaXB0aW9uXG4gKiBAbW9kdWxlIExvZ2dpbmdcbiAqL1xuXG4vKipcbiAqIEBzdW1tYXJ5IExvZ2dpbmdcbiAqIEBkZXNjcmlwdGlvbiBOYW1lc3BhY2UgZGVzY3JpcHRpb25cbiAqIEBuYW1lc3BhY2UgTG9nZ2luZ1xuICogQG1lbWJlck9mIG1vZHVsZTpMb2dnaW5nXG4gKi9cblxuLyoqXG4gKiBAc3VtbWFyeSBzdG9yZXMgdGhlIGN1cnJlbnQgcGFja2FnZSB2ZXJzaW9uXG4gKiBAZGVzY3JpcHRpb24gdGhpcyBpcyBob3cgeW91IHNob3VsZCBkb2N1bWVudCBhIGNvbnN0YW50XG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTp0cy13b3Jrc3BhY2VcbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQTs7Ozs7QUFLRztJQUNTO0FBQVosQ0FBQSxVQUFZLFFBQVEsRUFBQTs7QUFFbEIsSUFBQSxRQUFBLENBQUEsT0FBQSxDQUFBLEdBQUEsT0FBZTs7QUFFZixJQUFBLFFBQUEsQ0FBQSxNQUFBLENBQUEsR0FBQSxNQUFhOztBQUViLElBQUEsUUFBQSxDQUFBLFNBQUEsQ0FBQSxHQUFBLFNBQW1COztBQUVuQixJQUFBLFFBQUEsQ0FBQSxPQUFBLENBQUEsR0FBQSxPQUFlOztBQUVmLElBQUEsUUFBQSxDQUFBLE9BQUEsQ0FBQSxHQUFBLE9BQWU7QUFDakIsQ0FBQyxFQVhXLFFBQVEsS0FBUixRQUFRLEdBV25CLEVBQUEsQ0FBQSxDQUFBO0FBRUQ7Ozs7Ozs7Ozs7QUFVRztBQUNVLE1BQUEsZ0JBQWdCLEdBQUc7QUFDOUIsSUFBQSxLQUFLLEVBQUUsQ0FBQztBQUNSLElBQUEsSUFBSSxFQUFFLENBQUM7QUFDUCxJQUFBLE9BQU8sRUFBRSxDQUFDO0FBQ1YsSUFBQSxLQUFLLEVBQUUsQ0FBQztBQUNSLElBQUEsS0FBSyxFQUFFLENBQUM7O0lBR0U7QUFBWixDQUFBLFVBQVksV0FBVyxFQUFBO0FBQ3JCLElBQUEsV0FBQSxDQUFBLEtBQUEsQ0FBQSxHQUFBLEtBQVc7QUFDWCxJ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