@decaf-ts/injectable-decorators 1.6.7 → 1.6.9

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.
@@ -3,11 +3,9 @@ import 'reflect-metadata';
3
3
  /**
4
4
  * @description Constants used for reflection metadata keys in the dependency injection system.
5
5
  * @summary Injectables Reflection keys used to store and retrieve metadata about injectable classes and properties.
6
- *
7
6
  * @property {string} REFLECT Reflection injectables base key prefix for all metadata keys
8
7
  * @property {string} INJECTABLE Reflection key suffix for marking a class as injectable
9
8
  * @property {string} INJECT Reflection key suffix for marking a property for injection
10
- *
11
9
  * @const InjectablesKeys
12
10
  * @memberOf module:injectable-decorators
13
11
  */
@@ -16,6 +14,52 @@ const InjectablesKeys = {
16
14
  INJECTABLE: "injectable",
17
15
  INJECT: "inject",
18
16
  };
17
+ /**
18
+ * @description Default configuration applied by the @injectable decorator when none is provided.
19
+ * @summary Sets sensible defaults such as singleton lifecycle for newly registered injectables.
20
+ * @const DefaultInjectablesConfig
21
+ * @memberOf module:injectable-decorators
22
+ */
23
+ const DefaultInjectablesConfig = {
24
+ singleton: true,
25
+ };
26
+ /**
27
+ * @description Reflection metadata key for accessing TypeScript type information.
28
+ * @summary Holds the key for retrieving the design type from TypeScript's reflection metadata.
29
+ * @const TypeKey
30
+ * @memberOf module:injectable-decorators
31
+ */
32
+ const TypeKey = "design:type";
33
+
34
+ /**
35
+ * @description Generates a fully qualified reflection metadata key.
36
+ * @summary Returns the reflection key for injectables by prefixing the provided key with the base reflection key.
37
+ * @param {string} key The key to be prefixed
38
+ * @return {string} The fully qualified reflection key
39
+ * @function getInjectKey
40
+ * @memberOf module:injectable-decorators
41
+ */
42
+ const getInjectKey = (key) => InjectablesKeys.REFLECT + key;
43
+ /**
44
+ * @description Extracts the type name from a decorated property using reflection.
45
+ * @summary Retrieves the type from a property decorator by accessing TypeScript's reflection metadata.
46
+ * @param {any} model The target object containing the decorated property
47
+ * @param {string | symbol} propKey The property key (name or symbol) of the decorated property
48
+ * @return {string | undefined} The name of the property type, or undefined if it's a Function type
49
+ * @function getTypeFromDecorator
50
+ * @memberOf module:injectable-decorators
51
+ */
52
+ function getTypeFromDecorator(model, propKey) {
53
+ const typeDef = Reflect.getMetadata(TypeKey, model, propKey);
54
+ if (typeDef.name === "Function") {
55
+ return undefined;
56
+ }
57
+ const meta = Reflect.getMetadata(getInjectKey(InjectablesKeys.INJECTABLE), typeDef);
58
+ if (!meta) {
59
+ return undefined;
60
+ }
61
+ return meta.symbol;
62
+ }
19
63
 
20
64
  /**
21
65
  * @description Default implementation of the InjectablesRegistry interface.
@@ -99,7 +143,7 @@ class InjectableRegistryImp {
99
143
  const name = category || Symbol.for(obj.toString());
100
144
  if (!this.cache[name] || force)
101
145
  this.cache[name] = {
102
- instance: constructor ? obj : undefined,
146
+ instance: options.singleton && constructor ? obj : undefined,
103
147
  constructor: !constructor ? obj : obj.constructor,
104
148
  options: options,
105
149
  };
@@ -116,7 +160,9 @@ class InjectableRegistryImp {
116
160
  catch (e) {
117
161
  throw new Error(`failed to build ${name.toString()} with args ${args}: ${e}`);
118
162
  }
119
- this.cache[name].instance = instance;
163
+ if (options.singleton) {
164
+ this.cache[name].instance = instance;
165
+ }
120
166
  if (options.callback)
121
167
  instance = options.callback(instance, ...args);
122
168
  return instance;
@@ -166,6 +212,11 @@ class InjectableRegistryImp {
166
212
  * Injectables-->>Client: MyService instance
167
213
  */
168
214
  class Injectables {
215
+ /**
216
+ * @description Holds the active registry implementation used by the Injectables facade.
217
+ * @summary Internal static reference that can be swapped via setRegistry to customize how injectables are stored and retrieved.
218
+ * @type {InjectablesRegistry | undefined}
219
+ */
169
220
  static { this.actingInjectablesRegistry = undefined; }
170
221
  constructor() { }
171
222
  /**
@@ -246,56 +297,62 @@ class Injectables {
246
297
  }
247
298
 
248
299
  /**
249
- * @description Reflection metadata key for accessing TypeScript type information.
250
- * @summary Holds the key for retrieving the design type from TypeScript's reflection metadata.
251
- * @const TypeKey
252
- * @memberOf module:injectable-decorators
253
- */
254
- const TypeKey = "design:type";
255
- /**
256
- * @description Extracts the type name from a decorated property using reflection.
257
- * @summary Retrieves the type from a property decorator by accessing TypeScript's reflection metadata.
258
- * @param {any} model The target object containing the decorated property
259
- * @param {string | symbol} propKey The property key (name or symbol) of the decorated property
260
- * @return {string | undefined} The name of the property type, or undefined if it's a Function type
261
- * @function getTypeFromDecorator
262
- * @memberOf module:injectable-decorators
263
- */
264
- function getTypeFromDecorator(model, propKey) {
265
- const typeDef = Reflect.getMetadata(TypeKey, model, propKey);
266
- if (typeDef.name === "Function") {
267
- return undefined;
268
- }
269
- const meta = Reflect.getMetadata(getInjectKey(InjectablesKeys.INJECTABLE), typeDef);
270
- if (!meta) {
271
- return undefined;
272
- }
273
- return meta.symbol;
274
- }
275
-
276
- /**
277
- * @description Generates a fully qualified reflection metadata key.
278
- * @summary Returns the reflection key for injectables by prefixing the provided key with the base reflection key.
279
- * @param {string} key The key to be prefixed
280
- * @return {string} The fully qualified reflection key
281
- * @function getInjectKey
282
- * @memberOf module:injectable-decorators
300
+ * @description Decorator that marks a class as available for dependency injection.
301
+ * @summary Defines a class as an injectable that can be retrieved from the registry.
302
+ * When applied to a class, replaces its constructor with one that returns an instance.
303
+ *
304
+ * @param {string | Constructor} [category] Defaults to the class category. Useful when minification occurs and names are changed,
305
+ * or when you want to upcast the object to a different type.
306
+ * @param {Partial<InjectableConfig>} [cfg=DefaultInjectableConfig] Allows overriding the default singleton behavior and adding a callback function.
307
+ *
308
+ * @return {function(any): any} A decorator function that transforms the class into an injectable.
309
+ *
310
+ * @function injectable
311
+ * @category Class Decorators
312
+ *
313
+ * @mermaid
314
+ * sequenceDiagram
315
+ * participant Client
316
+ * participant Decorator
317
+ * participant Injectables
318
+ *
319
+ * Client->>Decorator: @injectable()
320
+ * Decorator->>Decorator: Create new constructor
321
+ *
322
+ * Note over Decorator: When new instance requested
323
+ * Decorator->>Injectables: get(category)
324
+ * alt Instance exists
325
+ * Injectables-->>Decorator: Return existing instance
326
+ * else No instance
327
+ * Decorator->>Injectables: register(original, category)
328
+ * Decorator->>Injectables: get(category)
329
+ * Injectables-->>Decorator: Return new instance
330
+ * opt Has callback
331
+ * Decorator->>Decorator: Call instanceCallback
332
+ * end
333
+ * end
334
+ * Decorator->>Decorator: Define metadata
335
+ * Decorator-->>Client: Return instance
283
336
  */
284
- const getInjectKey = (key) => InjectablesKeys.REFLECT + key;
285
- function injectable(name, cb) {
286
- const instanceCallback = (typeof name === "function" && !name.name ? name : cb);
287
- const category = typeof name === "string"
288
- ? name
289
- : cb
290
- ? name
291
- : typeof name === "function" && !name.name
292
- ? undefined
293
- : name;
337
+ function injectable(category, cfg) {
338
+ cfg =
339
+ cfg ||
340
+ (typeof category === "object"
341
+ ? Object.assign(category, DefaultInjectablesConfig)
342
+ : DefaultInjectablesConfig);
343
+ category =
344
+ typeof category === "object"
345
+ ? undefined
346
+ : typeof category === "string"
347
+ ? category
348
+ : typeof category === "function" && category.name
349
+ ? category
350
+ : undefined;
294
351
  return (original) => {
295
352
  const symbol = Symbol.for(category || original.toString());
296
- const name = category || original.name;
353
+ category = category || original.name;
297
354
  const metadata = {
298
- class: name,
355
+ class: category,
299
356
  symbol: symbol,
300
357
  };
301
358
  Reflect.defineMetadata(getInjectKey(InjectablesKeys.INJECTABLE), metadata, original);
@@ -313,16 +370,36 @@ function injectable(name, cb) {
313
370
  configurable: false,
314
371
  value: original.prototype.constructor.name,
315
372
  });
316
- const opts = {
317
- singleton: true,
318
- callback: instanceCallback,
319
- };
320
373
  Reflect.defineMetadata(getInjectKey(InjectablesKeys.INJECTABLE), metadata, newConstructor);
321
- Injectables.register(original, symbol, opts);
374
+ Injectables.register(original, symbol, cfg);
322
375
  // return new constructor (will override original)
323
376
  return newConstructor;
324
377
  };
325
378
  }
379
+ /**
380
+ * @description Convenience decorator to register an injectable as a singleton.
381
+ * @summary Wraps {@link injectable} forcing the singleton lifecycle so only one instance is created and reused.
382
+ * @param {string|Constructor} [category] Optional explicit category/symbol source; defaults to the class.
383
+ * @param {Omit<InjectableConfig, "singleton">} [cfg] Additional injectable configuration excluding the singleton flag.
384
+ * @return {function(any): any} A class decorator that registers the target as a singleton injectable.
385
+ * @function singleton
386
+ * @category Class Decorators
387
+ */
388
+ function singleton(category, cfg) {
389
+ return injectable(category, Object.assign({}, cfg || {}, { singleton: true }));
390
+ }
391
+ /**
392
+ * @description Convenience decorator to register an injectable as on-demand (non-singleton).
393
+ * @summary Wraps {@link injectable} forcing new instances to be created on every injection or retrieval.
394
+ * @param {string|Constructor} [category] Optional explicit category/symbol source; defaults to the class.
395
+ * @param {Omit<InjectableConfig, "singleton">} [cfg] Additional injectable configuration excluding the singleton flag.
396
+ * @return {function(any): any} A class decorator that registers the target as a non-singleton injectable.
397
+ * @function onDemand
398
+ * @category Class Decorators
399
+ */
400
+ function onDemand(category, cfg) {
401
+ return injectable(category, Object.assign({}, cfg || {}, { singleton: false }));
402
+ }
326
403
  /**
327
404
  * @description Property decorator that injects a dependency into a class property.
328
405
  * @summary Allows for the injection of an {@link injectable} decorated dependency into a class property.
@@ -346,8 +423,8 @@ function injectable(name, cb) {
346
423
  *
347
424
  * @param {string} [category] Defaults to the class name derived from the property type. Useful when minification occurs
348
425
  * and names are changed, or when you want to upcast the object to a different type.
349
- * @param {InstanceTransformer} [transformer] Optional function to transform the injectable instance before it's injected.
350
- * @return {Function} A property decorator function that sets up the dependency injection.
426
+ * @param {Partial<InjectOptions>} [cfg={}] Optional function to transform the injectable instance before it's injected, or arguments to pass the constructor when injecting onDemand
427
+ * @return {function(any, any): void} A property decorator function that sets up the dependency injection.
351
428
  *
352
429
  * @function inject
353
430
  * @category Property Decorators
@@ -382,39 +459,43 @@ function injectable(name, cb) {
382
459
  * end
383
460
  * end
384
461
  */
385
- function inject(category, transformer, ...args) {
462
+ function inject(category, cfg) {
386
463
  return (target, propertyKey) => {
387
- const values = new WeakMap();
388
- const name = category || getTypeFromDecorator(target, propertyKey);
464
+ const config = (cfg || typeof category === "object" ? category : {});
465
+ const name = (typeof category !== "object" &&
466
+ category) ||
467
+ getTypeFromDecorator(target, propertyKey);
389
468
  if (!name) {
390
469
  throw new Error(`Could not get Type from decorator`);
391
470
  }
392
471
  Reflect.defineMetadata(getInjectKey(InjectablesKeys.INJECT), {
393
472
  injectable: name,
394
473
  }, target, propertyKey);
474
+ const values = new WeakMap();
395
475
  Object.defineProperty(target, propertyKey, {
396
476
  configurable: true,
397
477
  get() {
398
478
  const descriptor = Object.getOwnPropertyDescriptor(target, propertyKey);
399
479
  if (descriptor.configurable) {
480
+ // let /obj: any;
400
481
  Object.defineProperty(this, propertyKey, {
401
482
  enumerable: true,
402
483
  configurable: false,
403
484
  get() {
404
485
  let obj = values.get(this);
405
- if (!obj) {
406
- obj = Injectables.get(name, ...args);
407
- if (!obj)
408
- throw new Error(`Could not get Injectable ${name.toString()} to inject in ${target.constructor ? target.constructor.name : target.name}'s ${propertyKey}`);
409
- if (transformer)
410
- try {
411
- obj = transformer(obj, target);
412
- }
413
- catch (e) {
414
- console.error(e);
415
- }
416
- values.set(this, obj);
417
- }
486
+ if (obj)
487
+ return obj;
488
+ obj = Injectables.get(name, ...(config.args || []));
489
+ if (!obj)
490
+ throw new Error(`Could not get Injectable ${name.toString()} to inject in ${target.constructor ? target.constructor.name : target.name}'s ${propertyKey}`);
491
+ if (config.transformer)
492
+ try {
493
+ obj = config.transformer(obj, target);
494
+ }
495
+ catch (e) {
496
+ console.error(e);
497
+ }
498
+ values.set(this, obj);
418
499
  return obj;
419
500
  },
420
501
  });
@@ -439,7 +520,7 @@ function inject(category, transformer, ...args) {
439
520
  * @const VERSION
440
521
  * @memberOf module:injectable-decorators
441
522
  */
442
- const VERSION = "1.6.7";
523
+ const VERSION = "1.6.9";
443
524
 
444
- export { InjectableRegistryImp, Injectables, InjectablesKeys, TypeKey, VERSION, getInjectKey, getTypeFromDecorator, inject, injectable };
445
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5qZWN0YWJsZS1kZWNvcmF0b3JzLmVzbS5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25zdGFudHMudHMiLCIuLi9zcmMvcmVnaXN0cnkudHMiLCIuLi9zcmMvSW5qZWN0YWJsZXMudHMiLCIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkZXNjcmlwdGlvbiBDb25zdGFudHMgdXNlZCBmb3IgcmVmbGVjdGlvbiBtZXRhZGF0YSBrZXlzIGluIHRoZSBkZXBlbmRlbmN5IGluamVjdGlvbiBzeXN0ZW0uXG4gKiBAc3VtbWFyeSBJbmplY3RhYmxlcyBSZWZsZWN0aW9uIGtleXMgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEgYWJvdXQgaW5qZWN0YWJsZSBjbGFzc2VzIGFuZCBwcm9wZXJ0aWVzLlxuICogXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVGTEVDVCBSZWZsZWN0aW9uIGluamVjdGFibGVzIGJhc2Uga2V5IHByZWZpeCBmb3IgYWxsIG1ldGFkYXRhIGtleXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJTkpFQ1RBQkxFIFJlZmxlY3Rpb24ga2V5IHN1ZmZpeCBmb3IgbWFya2luZyBhIGNsYXNzIGFzIGluamVjdGFibGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJTkpFQ1QgUmVmbGVjdGlvbiBrZXkgc3VmZml4IGZvciBtYXJraW5nIGEgcHJvcGVydHkgZm9yIGluamVjdGlvblxuICogXG4gKiBAY29uc3QgSW5qZWN0YWJsZXNLZXlzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgSW5qZWN0YWJsZXNLZXlzID0ge1xuICBSRUZMRUNUOiBcImluamVjdC5kYi5cIixcbiAgSU5KRUNUQUJMRTogXCJpbmplY3RhYmxlXCIsXG4gIElOSkVDVDogXCJpbmplY3RcIixcbn07XG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlRGVmLCBJbmplY3RhYmxlT3B0aW9ucyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlc0tleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldEluamVjdEtleSB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHlwZSByZXByZXNlbnRpbmcgZWl0aGVyIGEgY2xhc3MgY29uc3RydWN0b3Igb3IgYW4gaW5zdGFuY2UuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGFuIEluamVjdGFibGUgdHlwZSB0aGF0IGNhbiBiZSBlaXRoZXIgYSBjbGFzcyBjb25zdHJ1Y3RvciBvciBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzLlxuICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgb2YgdGhlIGluamVjdGFibGUgb2JqZWN0XG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oYW55KTogVCB8IFR9IEluamVjdGFibGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCB0eXBlIEluamVjdGFibGU8VD4gPSB7IG5ldyAoLi4uYXJnczogYW55W10pOiBUIH0gfCBUO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb250cmFjdCBmb3IgYSByZWdpc3RyeSB0aGF0IG1hbmFnZXMgaW5qZWN0YWJsZSBvYmplY3RzLlxuICogQHN1bW1hcnkgSW50ZXJmYWNlIGZvciBhbiBpbmplY3RhYmxlIHJlZ2lzdHJ5IHRoYXQgcHJvdmlkZXMgbWV0aG9kcyBmb3IgcmV0cmlldmluZywgcmVnaXN0ZXJpbmcsIGFuZCBidWlsZGluZyBpbmplY3RhYmxlIG9iamVjdHMuXG4gKiBAdGVtcGxhdGUgVCBUeXBlIHBhcmFtZXRlciB1c2VkIGluIHRoZSBpbnRlcmZhY2UgbWV0aG9kc1xuICogQGludGVyZmFjZSBJbmplY3RhYmxlc1JlZ2lzdHJ5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluamVjdGFibGVzUmVnaXN0cnkge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZldGNoZXMgYW4gaW5qZWN0YWJsZSBpbnN0YW5jZSBieSBpdHMgcmVnaXN0ZXJlZCBuYW1lLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYW4ge0BsaW5rIEluamVjdGFibGV9IGZyb20gdGhlIHJlZ2lzdHJ5IGJ5IG5hbWUsIG9wdGlvbmFsbHkgcGFzc2luZyBjb25zdHJ1Y3RvciBhcmd1bWVudHMuXG4gICAqIEB0ZW1wbGF0ZSBUIFR5cGUgb2YgdGhlIGluamVjdGFibGUgb2JqZWN0IHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7c3ltYm9sfSBuYW1lIFRoZSByZWdpc3RlcmVkIG5hbWUgb2YgdGhlIGluamVjdGFibGUgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyBDb25zdHJ1Y3RvciBhcmd1bWVudHMgdG8gcGFzcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIGluamVjdGFibGVcbiAgICogQHJldHVybiB7SW5qZWN0YWJsZTxUPiB8IHVuZGVmaW5lZH0gVGhlIGluamVjdGFibGUgaW5zdGFuY2Ugb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZFxuICAgKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICAgKi9cbiAgZ2V0PFQ+KFxuICAgIG5hbWU6IHN5bWJvbCB8IHN0cmluZyB8IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IFQgfSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBUIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWRkcyBhIGNsYXNzIG9yIG9iamVjdCB0byB0aGUgaW5qZWN0YWJsZSByZWdpc3RyeS5cbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIGFuIGluamVjdGFibGUgY29uc3RydWN0b3Igb3IgaW5zdGFuY2Ugd2l0aCB0aGUgcmVnaXN0cnksIG1ha2luZyBpdCBhdmFpbGFibGUgZm9yIGluamVjdGlvbi5cbiAgICogQHRlbXBsYXRlIFQgVHlwZSBvZiB0aGUgaW5qZWN0YWJsZSBvYmplY3QgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIHtJbmplY3RhYmxlPFQ+fSBjb25zdHJ1Y3RvciBUaGUgY2xhc3MgY29uc3RydWN0b3Igb3Igb2JqZWN0IGluc3RhbmNlIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHJlZ2lzdHJhdGlvbiAoY2F0ZWdvcnksIHNpbmdsZXRvbiBmbGFnLCBldGMuKVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICAgKi9cbiAgcmVnaXN0ZXI8VD4oXG4gICAgY29uc3RydWN0b3I6IEluamVjdGFibGU8VD4sXG4gICAgY2F0ZWdvcnk6IHN5bWJvbCB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zOiBJbmplY3RhYmxlT3B0aW9uczxUPixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBhbiBpbmplY3RhYmxlIGNsYXNzLlxuICAgKiBAc3VtbWFyeSBJbnN0YW50aWF0ZXMgYW4gaW5qZWN0YWJsZSBjbGFzcyB1c2luZyBpdHMgY29uc3RydWN0b3IgYW5kIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAqIEB0ZW1wbGF0ZSBUIFR5cGUgb2YgdGhlIG9iamVjdCB0byBidWlsZFxuICAgKiBAcGFyYW0ge3N5bWJvbH0gbmFtZSBPYmplY3QgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgaW5qZWN0YWJsZSB0byBidWlsZFxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIENvbnN0cnVjdG9yIGFyZ3VtZW50cyB0byBwYXNzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgaW5qZWN0YWJsZVxuICAgKiBAcmV0dXJuIHtUfSBUaGUgbmV3bHkgY3JlYXRlZCBpbnN0YW5jZVxuICAgKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICAgKi9cbiAgYnVpbGQ8VD4obmFtZTogc3ltYm9sLCAuLi5hcmdzOiBhbnlbXSk6IFQ7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEluamVjdGFibGVzUmVnaXN0cnkgaW50ZXJmYWNlLlxuICogQHN1bW1hcnkgSG9sZHMgdGhlIHZhcmlvdXMge0BsaW5rIEluamVjdGFibGV9cyBpbiBhIGNhY2hlIGFuZCBwcm92aWRlcyBtZXRob2RzIHRvIHJlZ2lzdGVyLCByZXRyaWV2ZSwgYW5kIGJ1aWxkIHRoZW0uXG4gKiBAdGVtcGxhdGUgVCBUeXBlIHBhcmFtZXRlciB1c2VkIGluIHRoZSBjbGFzcyBtZXRob2RzXG4gKlxuICogQGNsYXNzIEluamVjdGFibGVSZWdpc3RyeUltcFxuICogQGltcGxlbWVudHMgSW5qZWN0YWJsZXNSZWdpc3RyeVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIG5ldyByZWdpc3RyeVxuICogY29uc3QgcmVnaXN0cnkgPSBuZXcgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wKCk7XG4gKlxuICogLy8gUmVnaXN0ZXIgYSBjbGFzc1xuICogY2xhc3MgTXlTZXJ2aWNlIHtcbiAqICAgZG9Tb21ldGhpbmcoKSB7XG4gKiAgICAgcmV0dXJuICdIZWxsbyBXb3JsZCc7XG4gKiAgIH1cbiAqIH1cbiAqIHJlZ2lzdHJ5LnJlZ2lzdGVyKE15U2VydmljZSwgJ015U2VydmljZScsIHRydWUpO1xuICpcbiAqIC8vIEdldCB0aGUgaW5zdGFuY2VcbiAqIGNvbnN0IHNlcnZpY2UgPSByZWdpc3RyeS5nZXQoJ015U2VydmljZScpO1xuICogc2VydmljZS5kb1NvbWV0aGluZygpOyAvLyAnSGVsbG8gV29ybGQnXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgUmVnaXN0cnlcbiAqXG4gKiAgIENsaWVudC0+PlJlZ2lzdHJ5OiByZWdpc3RlcihNeVNlcnZpY2UpXG4gKiAgIFJlZ2lzdHJ5LT4+UmVnaXN0cnk6IFN0b3JlIGluIGNhY2hlXG4gKlxuICogICBDbGllbnQtPj5SZWdpc3RyeTogZ2V0KFwiTXlTZXJ2aWNlXCIpXG4gKiAgIGFsdCBJbnN0YW5jZSBleGlzdHMgYW5kIGlzIHNpbmdsZXRvblxuICogICAgIFJlZ2lzdHJ5LS0+PkNsaWVudDogUmV0dXJuIGNhY2hlZCBpbnN0YW5jZVxuICogICBlbHNlIE5vIGluc3RhbmNlIG9yIG5vdCBzaW5nbGV0b25cbiAqICAgICBSZWdpc3RyeS0+PlJlZ2lzdHJ5OiBidWlsZChuYW1lKVxuICogICAgIFJlZ2lzdHJ5LS0+PkNsaWVudDogUmV0dXJuIG5ldyBpbnN0YW5jZVxuICogICBlbmRcbiAqL1xuZXhwb3J0IGNsYXNzIEluamVjdGFibGVSZWdpc3RyeUltcCBpbXBsZW1lbnRzIEluamVjdGFibGVzUmVnaXN0cnkge1xuICBwcml2YXRlIGNhY2hlOiBSZWNvcmQ8c3ltYm9sLCBJbmplY3RhYmxlRGVmPiA9IHt9O1xuXG4gIGhhczxUPihuYW1lOiBzeW1ib2wgfCB7IG5ldyAoLi4uYXJnczogYW55W10pOiBUIH0pOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIHJldHVybiBuYW1lIGluIHRoaXMuY2FjaGU7XG4gICAgcmV0dXJuIFN5bWJvbC5mb3IobmFtZS50b1N0cmluZygpKSBpbiB0aGlzLmNhY2hlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBnZXQ8VD4oXG4gICAgbmFtZTogc3ltYm9sIHwgc3RyaW5nIHwgeyBuZXcgKC4uLmFyZ3M6IGFueVtdKTogVCB9LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFQgfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIikgbmFtZSA9IFN5bWJvbC5mb3IobmFtZSk7XG4gICAgaWYgKHR5cGVvZiBuYW1lICE9PSBcInN5bWJvbFwiKSB7XG4gICAgICBjb25zdCBtZXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgZ2V0SW5qZWN0S2V5KEluamVjdGFibGVzS2V5cy5JTkpFQ1RBQkxFKSxcbiAgICAgICAgbmFtZVxuICAgICAgKTtcbiAgICAgIG5hbWUgPSAobWV0YT8uc3ltYm9sIGFzIHN5bWJvbCkgfHwgU3ltYm9sLmZvcihuYW1lLnRvU3RyaW5nKCkpO1xuICAgIH1cbiAgICBpZiAoIW5hbWUpIHRocm93IG5ldyBFcnJvcihgSW5qZWN0YWJsZSAke25hbWV9IG5vdCBmb3VuZGApO1xuXG4gICAgaWYgKCEoKG5hbWUgYXMgc3ltYm9sKSBpbiB0aGlzLmNhY2hlKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlW25hbWVdO1xuICAgIGlmICghY2FjaGUub3B0aW9ucy5zaW5nbGV0b24gJiYgIWNhY2hlLmluc3RhbmNlKVxuICAgICAgcmV0dXJuIHRoaXMuYnVpbGQ8VD4obmFtZSwgLi4uYXJncyk7XG4gICAgcmV0dXJuIGNhY2hlLmluc3RhbmNlIHx8IHRoaXMuYnVpbGQ8VD4obmFtZSwgLi4uYXJncyk7XG4gIH1cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICByZWdpc3RlcjxUPihcbiAgICBvYmo6IEluamVjdGFibGU8VD4sXG4gICAgY2F0ZWdvcnk6IHN5bWJvbCB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zOiBJbmplY3RhYmxlT3B0aW9uczxUPixcbiAgICBmb3JjZTogYm9vbGVhbiA9IGZhbHNlXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGNhc3RPYmo6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBvYmogYXMgUmVjb3JkPHN0cmluZywgYW55PjtcblxuICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gIWNhc3RPYmoubmFtZSAmJiBjYXN0T2JqLmNvbnN0cnVjdG9yO1xuICAgIGlmICh0eXBlb2YgY2FzdE9iaiAhPT0gXCJmdW5jdGlvblwiICYmICFjb25zdHJ1Y3RvcilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEluamVjdGFibGUgcmVnaXN0ZXJpbmcgZmFpbGVkLiBNaXNzaW5nIENsYXNzIG5hbWUgb3IgY29uc3RydWN0b3JgXG4gICAgICApO1xuXG4gICAgY29uc3QgbmFtZSA9IGNhdGVnb3J5IHx8IFN5bWJvbC5mb3IoKG9iaiBhcyBhbnkpLnRvU3RyaW5nKCkpO1xuXG4gICAgaWYgKCF0aGlzLmNhY2hlW25hbWVdIHx8IGZvcmNlKVxuICAgICAgdGhpcy5jYWNoZVtuYW1lXSA9IHtcbiAgICAgICAgaW5zdGFuY2U6IGNvbnN0cnVjdG9yID8gb2JqIDogdW5kZWZpbmVkLFxuICAgICAgICBjb25zdHJ1Y3RvcjogIWNvbnN0cnVjdG9yID8gb2JqIDogKG9iaiBhcyBhbnkpLmNvbnN0cnVjdG9yLFxuICAgICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgfTtcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIGJ1aWxkPFQ+KG5hbWU6IHN5bWJvbCwgLi4uYXJnczogYW55W10pOiBUIHtcbiAgICBjb25zdCB7IGNvbnN0cnVjdG9yLCBvcHRpb25zIH0gPSB0aGlzLmNhY2hlW25hbWVdO1xuICAgIGxldCBpbnN0YW5jZTogVDtcbiAgICB0cnkge1xuICAgICAgaW5zdGFuY2UgPSBuZXcgY29uc3RydWN0b3IoLi4uYXJncyk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgZmFpbGVkIHRvIGJ1aWxkICR7bmFtZS50b1N0cmluZygpfSB3aXRoIGFyZ3MgJHthcmdzfTogJHtlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMuY2FjaGVbbmFtZV0uaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICBpZiAob3B0aW9ucy5jYWxsYmFjaykgaW5zdGFuY2UgPSBvcHRpb25zLmNhbGxiYWNrKGluc3RhbmNlLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEluamVjdGFibGUsXG4gIEluamVjdGFibGVSZWdpc3RyeUltcCxcbiAgSW5qZWN0YWJsZXNSZWdpc3RyeSxcbn0gZnJvbSBcIi4vcmVnaXN0cnlcIjtcbmltcG9ydCB7IEluamVjdGFibGVPcHRpb25zIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ2VudHJhbCByZWdpc3RyeSBmb3IgbWFuYWdpbmcgaW5qZWN0YWJsZSBkZXBlbmRlbmNpZXMuXG4gKiBAc3VtbWFyeSBTdGF0aWMgY2xhc3MgaG9sZGluZyB0aGUgYWNjZXNzIHRvIHRoZSBpbmplY3RhYmxlcyBmdW5jdGlvbnMuIFByb3ZpZGVzIG1ldGhvZHMgZm9yIHJlZ2lzdGVyaW5nLFxuICogcmV0cmlldmluZywgYW5kIGJ1aWxkaW5nIGluamVjdGFibGUgb2JqZWN0cy5cbiAqIEB0ZW1wbGF0ZSBUIFR5cGUgb2YgdGhlIGluamVjdGFibGUgb2JqZWN0XG4gKlxuICogQGNsYXNzIEluamVjdGFibGVzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIERlZmluZSBhbiBpbmplY3RhYmxlIGNsYXNzXG4gKiBAaW5qZWN0YWJsZSgpXG4gKiBjbGFzcyBNeVNlcnZpY2Uge1xuICogICBkb1NvbWV0aGluZygpIHtcbiAqICAgICByZXR1cm4gJ0hlbGxvIFdvcmxkJztcbiAqICAgfVxuICogfVxuICpcbiAqIC8vIEluamVjdCB0aGUgc2VydmljZSBpbnRvIGFub3RoZXIgY2xhc3NcbiAqIGNsYXNzIE15Q29tcG9uZW50IHtcbiAqICAgQGluamVjdCgpXG4gKiAgIHByaXZhdGUgc2VydmljZSE6IE15U2VydmljZTtcbiAqXG4gKiAgIHVzZVNlcnZpY2UoKSB7XG4gKiAgICAgcmV0dXJuIHRoaXMuc2VydmljZS5kb1NvbWV0aGluZygpO1xuICogICB9XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgSW5qZWN0YWJsZXNcbiAqICAgcGFydGljaXBhbnQgUmVnaXN0cnlcbiAqXG4gKiAgIENsaWVudC0+PkluamVjdGFibGVzOiByZWdpc3RlcihNeVNlcnZpY2UpXG4gKiAgIEluamVjdGFibGVzLT4+UmVnaXN0cnk6IHJlZ2lzdGVyKE15U2VydmljZSlcbiAqICAgUmVnaXN0cnktLT4+SW5qZWN0YWJsZXM6IHZvaWRcbiAqXG4gKiAgIENsaWVudC0+PkluamVjdGFibGVzOiBnZXQoXCJNeVNlcnZpY2VcIilcbiAqICAgSW5qZWN0YWJsZXMtPj5SZWdpc3RyeTogZ2V0KFwiTXlTZXJ2aWNlXCIpXG4gKiAgIFJlZ2lzdHJ5LS0+PkluamVjdGFibGVzOiBNeVNlcnZpY2UgaW5zdGFuY2VcbiAqICAgSW5qZWN0YWJsZXMtLT4+Q2xpZW50OiBNeVNlcnZpY2UgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGNsYXNzIEluamVjdGFibGVzIHtcbiAgcHJpdmF0ZSBzdGF0aWMgYWN0aW5nSW5qZWN0YWJsZXNSZWdpc3RyeT86IEluamVjdGFibGVzUmVnaXN0cnkgPSB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGZXRjaGVzIGFuIGluamVjdGFibGUgaW5zdGFuY2UgYnkgaXRzIHJlZ2lzdGVyZWQgbmFtZS5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBuYW1lZCB7QGxpbmsgSW5qZWN0YWJsZX0gZnJvbSB0aGUgcmVnaXN0cnkuIElmIHRoZSBpbmplY3RhYmxlIGlzIGEgc2luZ2xldG9uLFxuICAgKiByZXR1cm5zIHRoZSBleGlzdGluZyBpbnN0YW5jZS4gT3RoZXJ3aXNlLCBjcmVhdGVzIGEgbmV3IGluc3RhbmNlLlxuICAgKiBAdGVtcGxhdGUgVCBUeXBlIG9mIHRoZSBpbmplY3RhYmxlIG9iamVjdCB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgcmVnaXN0ZXJlZCBuYW1lIG9mIHRoZSBpbmplY3RhYmxlIHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgQ29uc3RydWN0b3IgYXJndW1lbnRzIHRvIHBhc3Mgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBpbmplY3RhYmxlXG4gICAqIEByZXR1cm4ge0luamVjdGFibGU8VD4gfCB1bmRlZmluZWR9IFRoZSBpbmplY3RhYmxlIGluc3RhbmNlIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcbiAgICovXG4gIHN0YXRpYyBnZXQ8VD4oXG4gICAgbmFtZTogc3ltYm9sIHwgc3RyaW5nIHwgeyBuZXcgKC4uLmFyZ3M6IGFueVtdKTogVCB9LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBJbmplY3RhYmxlcy5nZXRSZWdpc3RyeSgpLmdldChuYW1lLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWRkcyBhIGNsYXNzIG9yIG9iamVjdCB0byB0aGUgaW5qZWN0YWJsZSByZWdpc3RyeS5cbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIGFuIGluamVjdGFibGUgY29uc3RydWN0b3Igb3IgaW5zdGFuY2Ugd2l0aCB0aGUgcmVnaXN0cnksIG1ha2luZyBpdCBhdmFpbGFibGUgZm9yIGluamVjdGlvbi5cbiAgICogQHRlbXBsYXRlIFQgVHlwZSBvZiB0aGUgaW5qZWN0YWJsZSBvYmplY3QgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIHtJbmplY3RhYmxlPFQ+fSBjb25zdHJ1Y3RvciBUaGUgY2xhc3MgY29uc3RydWN0b3Igb3Igb2JqZWN0IGluc3RhbmNlIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHJlZ2lzdHJhdGlvbiAoY2F0ZWdvcnksIHNpbmdsZXRvbiBmbGFnLCBldGMuKVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyPFQ+KGNvbnN0cnVjdG9yOiBJbmplY3RhYmxlPFQ+LCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICAgIHJldHVybiBJbmplY3RhYmxlcy5nZXRSZWdpc3RyeSgpLnJlZ2lzdGVyKFxuICAgICAgY29uc3RydWN0b3IsXG4gICAgICAuLi4oYXJncyBhcyBbc3ltYm9sLCBJbmplY3RhYmxlT3B0aW9uczxUPl0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBhbiBpbmplY3RhYmxlIGNsYXNzLlxuICAgKiBAc3VtbWFyeSBJbnN0YW50aWF0ZXMgYW4gaW5qZWN0YWJsZSBjbGFzcyB1c2luZyBpdHMgY29uc3RydWN0b3IgYW5kIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAqIEB0ZW1wbGF0ZSBUIFR5cGUgb2YgdGhlIG9iamVjdCB0byBidWlsZFxuICAgKiBAcGFyYW0ge3N5bWJvbH0gbmFtZSBzeW1ib2wgcmVmZXJlbmNpbmcgdGhlIGluamVjdGFibGVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyBDb25zdHJ1Y3RvciBhcmd1bWVudHMgdG8gcGFzcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIGluamVjdGFibGVcbiAgICogQHJldHVybiB7VH0gVGhlIG5ld2x5IGNyZWF0ZWQgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBidWlsZDxUPihuYW1lOiBzeW1ib2wsIC4uLmFyZ3M6IGFueVtdKTogVCB7XG4gICAgcmV0dXJuIEluamVjdGFibGVzLmdldFJlZ2lzdHJ5KCkuYnVpbGQobmFtZSwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlcGxhY2VzIHRoZSBjdXJyZW50IHJlZ2lzdHJ5IGltcGxlbWVudGF0aW9uLlxuICAgKiBAc3VtbWFyeSBTZXRzIGEgbmV3IHtAbGluayBJbmplY3RhYmxlc1JlZ2lzdHJ5fSBpbXBsZW1lbnRhdGlvbiwgYWxsb3dpbmcgZm9yIGN1c3RvbSByZWdpc3RyeSBiZWhhdmlvci5cbiAgICogQHBhcmFtIHtJbmplY3RhYmxlc1JlZ2lzdHJ5fSBvcGVyYXRpb25zUmVnaXN0cnkgVGhlIG5ldyBpbXBsZW1lbnRhdGlvbiBvZiBSZWdpc3RyeSB0byB1c2VcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBzZXRSZWdpc3RyeShvcGVyYXRpb25zUmVnaXN0cnk6IEluamVjdGFibGVzUmVnaXN0cnkpOiB2b2lkIHtcbiAgICBJbmplY3RhYmxlcy5hY3RpbmdJbmplY3RhYmxlc1JlZ2lzdHJ5ID0gb3BlcmF0aW9uc1JlZ2lzdHJ5O1xuICB9XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBjdXJyZW50IHJlZ2lzdHJ5IGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBjdXJyZW50IHtAbGluayBJbmplY3RhYmxlc1JlZ2lzdHJ5fSBvciBjcmVhdGVzIGEgZGVmYXVsdCBvbmUgaWYgbm9uZSBleGlzdHMuXG4gICAqIEByZXR1cm4ge0luamVjdGFibGVzUmVnaXN0cnl9IFRoZSBjdXJyZW50IHJlZ2lzdHJ5IGluc3RhbmNlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRSZWdpc3RyeSgpOiBJbmplY3RhYmxlc1JlZ2lzdHJ5IHtcbiAgICBpZiAoIUluamVjdGFibGVzLmFjdGluZ0luamVjdGFibGVzUmVnaXN0cnkpXG4gICAgICBJbmplY3RhYmxlcy5hY3RpbmdJbmplY3RhYmxlc1JlZ2lzdHJ5ID0gbmV3IEluamVjdGFibGVSZWdpc3RyeUltcCgpO1xuICAgIHJldHVybiBJbmplY3RhYmxlcy5hY3RpbmdJbmplY3RhYmxlc1JlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDbGVhcnMgYWxsIHJlZ2lzdGVyZWQgaW5qZWN0YWJsZXMuXG4gICAqIEBzdW1tYXJ5IFJlc2V0cyB0aGUgcmVnaXN0cnkgdG8gYSBjbGVhbiBzdGF0ZSBieSBjcmVhdGluZyBhIG5ldyBlbXB0eSByZWdpc3RyeSBpbnN0YW5jZS5cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyByZXNldCgpOiB2b2lkIHtcbiAgICBJbmplY3RhYmxlcy5zZXRSZWdpc3RyeShuZXcgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZW1vdmVzIHNwZWNpZmljIGluamVjdGFibGVzIGZyb20gdGhlIHJlZ2lzdHJ5IGJhc2VkIG9uIGEgcGF0dGVybi5cbiAgICogQHN1bW1hcnkgU2VsZWN0aXZlbHkgcmVzZXRzIHRoZSByZWdpc3RyeSBieSByZW1vdmluZyBvbmx5IHRoZSBpbmplY3RhYmxlcyB3aG9zZSBuYW1lcyBtYXRjaCB0aGUgcHJvdmlkZWQgcGF0dGVybi5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBSZWdFeHB9IG1hdGNoIEEgc3RyaW5nIG9yIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIHRvIG1hdGNoIGFnYWluc3QgaW5qZWN0YWJsZSBuYW1lc1xuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHNlbGVjdGl2ZVJlc2V0KG1hdGNoOiBzdHJpbmcgfCBSZWdFeHApOiB2b2lkIHtcbiAgICBjb25zdCByZWdleHAgPSB0eXBlb2YgbWF0Y2ggPT09IFwic3RyaW5nXCIgPyBuZXcgUmVnRXhwKG1hdGNoKSA6IG1hdGNoO1xuICAgIChJbmplY3RhYmxlcy5hY3RpbmdJbmplY3RhYmxlc1JlZ2lzdHJ5IGFzIGFueSlbXCJjYWNoZVwiXSA9IE9iamVjdC5lbnRyaWVzKFxuICAgICAgKEluamVjdGFibGVzLmFjdGluZ0luamVjdGFibGVzUmVnaXN0cnkgYXMgYW55KVtcImNhY2hlXCJdXG4gICAgKS5yZWR1Y2UoKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICBpZiAoIWtleS5tYXRjaChyZWdleHApKSBhY2N1bVtrZXldID0gdmFsO1xuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIHt9KTtcbiAgfVxufVxuIiwiaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YVwiO1xuaW1wb3J0IHsgZ2V0SW5qZWN0S2V5IH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZXNLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlZmxlY3Rpb24gbWV0YWRhdGEga2V5IGZvciBhY2Nlc3NpbmcgVHlwZVNjcmlwdCB0eXBlIGluZm9ybWF0aW9uLlxuICogQHN1bW1hcnkgSG9sZHMgdGhlIGtleSBmb3IgcmV0cmlldmluZyB0aGUgZGVzaWduIHR5cGUgZnJvbSBUeXBlU2NyaXB0J3MgcmVmbGVjdGlvbiBtZXRhZGF0YS5cbiAqIEBjb25zdCBUeXBlS2V5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgVHlwZUtleSA9IFwiZGVzaWduOnR5cGVcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXh0cmFjdHMgdGhlIHR5cGUgbmFtZSBmcm9tIGEgZGVjb3JhdGVkIHByb3BlcnR5IHVzaW5nIHJlZmxlY3Rpb24uXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIHR5cGUgZnJvbSBhIHByb3BlcnR5IGRlY29yYXRvciBieSBhY2Nlc3NpbmcgVHlwZVNjcmlwdCdzIHJlZmxlY3Rpb24gbWV0YWRhdGEuXG4gKiBAcGFyYW0ge2FueX0gbW9kZWwgVGhlIHRhcmdldCBvYmplY3QgY29udGFpbmluZyB0aGUgZGVjb3JhdGVkIHByb3BlcnR5XG4gKiBAcGFyYW0ge3N0cmluZyB8IHN5bWJvbH0gcHJvcEtleSBUaGUgcHJvcGVydHkga2V5IChuYW1lIG9yIHN5bWJvbCkgb2YgdGhlIGRlY29yYXRlZCBwcm9wZXJ0eVxuICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdHlwZSwgb3IgdW5kZWZpbmVkIGlmIGl0J3MgYSBGdW5jdGlvbiB0eXBlXG4gKiBAZnVuY3Rpb24gZ2V0VHlwZUZyb21EZWNvcmF0b3JcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlRnJvbURlY29yYXRvcihcbiAgbW9kZWw6IGFueSxcbiAgcHJvcEtleTogc3RyaW5nIHwgc3ltYm9sXG4pOiBzeW1ib2wgfCB1bmRlZmluZWQge1xuICBjb25zdCB0eXBlRGVmID0gUmVmbGVjdC5nZXRNZXRhZGF0YShUeXBlS2V5LCBtb2RlbCwgcHJvcEtleSk7XG4gIGlmICh0eXBlRGVmLm5hbWUgPT09IFwiRnVuY3Rpb25cIikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgbWV0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgZ2V0SW5qZWN0S2V5KEluamVjdGFibGVzS2V5cy5JTkpFQ1RBQkxFKSxcbiAgICB0eXBlRGVmXG4gICk7XG4gIGlmICghbWV0YSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIG1ldGEuc3ltYm9sO1xufVxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZXNLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlcyB9IGZyb20gXCIuL0luamVjdGFibGVzXCI7XG5pbXBvcnQgeyBnZXRUeXBlRnJvbURlY29yYXRvciB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQge1xuICBJbmplY3RhYmxlTWV0YWRhdGEsXG4gIEluamVjdGFibGVPcHRpb25zLFxuICBJbnN0YW5jZUNhbGxiYWNrLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBmdWxseSBxdWFsaWZpZWQgcmVmbGVjdGlvbiBtZXRhZGF0YSBrZXkuXG4gKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSByZWZsZWN0aW9uIGtleSBmb3IgaW5qZWN0YWJsZXMgYnkgcHJlZml4aW5nIHRoZSBwcm92aWRlZCBrZXkgd2l0aCB0aGUgYmFzZSByZWZsZWN0aW9uIGtleS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0byBiZSBwcmVmaXhlZFxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZnVsbHkgcXVhbGlmaWVkIHJlZmxlY3Rpb24ga2V5XG4gKiBAZnVuY3Rpb24gZ2V0SW5qZWN0S2V5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgZ2V0SW5qZWN0S2V5ID0gKGtleTogc3RyaW5nKSA9PiBJbmplY3RhYmxlc0tleXMuUkVGTEVDVCArIGtleTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgc2luZ2xldG9uIHRoYXQgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSByZWdpc3RyeS5cbiAqIFdoZW4gYXBwbGllZCB0byBhIGNsYXNzLCByZXBsYWNlcyBpdHMgY29uc3RydWN0b3Igd2l0aCBvbmUgdGhhdCByZXR1cm5zIGEgc2luZ2xldG9uIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbY2F0ZWdvcnldIERlZmF1bHRzIHRvIHRoZSBjbGFzcyBuYW1lLiBVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2NjdXJzIGFuZCBuYW1lcyBhcmUgY2hhbmdlZCxcbiAqIG9yIHdoZW4geW91IHdhbnQgdG8gdXBjYXN0IHRoZSBvYmplY3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2ZvcmNlXSBEZWZpbmVzIGlmIHRoZSBpbmplY3RhYmxlIHNob3VsZCBvdmVycmlkZSBhbiBhbHJlYWR5IGV4aXN0aW5nIGluc3RhbmNlIChpZiBhbnkpLlxuICogT25seSBtZWFudCBmb3IgZXh0ZW5kaW5nIGRlY29yYXRvcnMuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaW5zdGFuY2VDYWxsYmFja10gT3B0aW9uYWwgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBpbnN0YW5jZSBhZnRlciBjcmVhdGlvbi5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgdGhlIGNsYXNzIGludG8gYW4gaW5qZWN0YWJsZS5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0YWJsZVxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBEZWNvcmF0b3JcbiAqICAgcGFydGljaXBhbnQgSW5qZWN0YWJsZXNcbiAqXG4gKiAgIENsaWVudC0+PkRlY29yYXRvcjogQGluamVjdGFibGUoKVxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IENyZWF0ZSBuZXcgY29uc3RydWN0b3JcbiAqXG4gKiAgIE5vdGUgb3ZlciBEZWNvcmF0b3I6IFdoZW4gbmV3IGluc3RhbmNlIHJlcXVlc3RlZFxuICogICBEZWNvcmF0b3ItPj5JbmplY3RhYmxlczogZ2V0KG5hbWUpXG4gKiAgIGFsdCBJbnN0YW5jZSBleGlzdHNcbiAqICAgICBJbmplY3RhYmxlcy0tPj5EZWNvcmF0b3I6IFJldHVybiBleGlzdGluZyBpbnN0YW5jZVxuICogICBlbHNlIE5vIGluc3RhbmNlXG4gKiAgICAgRGVjb3JhdG9yLT4+SW5qZWN0YWJsZXM6IHJlZ2lzdGVyKG9yaWdpbmFsLCBuYW1lKVxuICogICAgIERlY29yYXRvci0+PkluamVjdGFibGVzOiBnZXQobmFtZSlcbiAqICAgICBJbmplY3RhYmxlcy0tPj5EZWNvcmF0b3I6IFJldHVybiBuZXcgaW5zdGFuY2VcbiAqICAgICBvcHQgSGFzIGNhbGxiYWNrXG4gKiAgICAgICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IENhbGwgaW5zdGFuY2VDYWxsYmFja1xuICogICAgIGVuZFxuICogICBlbmRcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBEZWZpbmUgbWV0YWRhdGFcbiAqICAgRGVjb3JhdG9yLS0+PkNsaWVudDogUmV0dXJuIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RhYmxlKCk6IChvcmlnaW5hbDogYW55KSA9PiBhbnk7XG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0YWJsZShcbiAgY2F0ZWdvcnk6IHN0cmluZyB8IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IGFueSB9XG4pOiAob3JpZ2luYWw6IGFueSkgPT4gYW55O1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdGFibGUoXG4gIGluc3RhbmNlQ2FsbGJhY2s6IEluc3RhbmNlQ2FsbGJhY2s8YW55PlxuKTogKG9yaWdpbmFsOiBhbnkpID0+IGFueTtcbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RhYmxlKFxuICBjYXRlZ29yeTogc3RyaW5nIHwgeyBuZXcgKC4uLmFyZ3M6IGFueVtdKTogYW55IH0sXG4gIGluc3RhbmNlQ2FsbGJhY2s6IEluc3RhbmNlQ2FsbGJhY2s8YW55PlxuKTogKG9yaWdpbmFsOiBhbnkpID0+IGFueTtcbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RhYmxlKFxuICBuYW1lPzogc3RyaW5nIHwgeyBuZXcgKC4uLmFyZ3M6IGFueVtdKTogYW55IH0gfCBJbnN0YW5jZUNhbGxiYWNrPGFueT4sXG4gIGNiPzogSW5zdGFuY2VDYWxsYmFjazxhbnk+XG4pIHtcbiAgY29uc3QgaW5zdGFuY2VDYWxsYmFjayA9IChcbiAgICB0eXBlb2YgbmFtZSA9PT0gXCJmdW5jdGlvblwiICYmICFuYW1lLm5hbWUgPyBuYW1lIDogY2JcbiAgKSBhcyBJbnN0YW5jZUNhbGxiYWNrPGFueT4gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGNhdGVnb3J5ID1cbiAgICB0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBuYW1lXG4gICAgICA6IGNiXG4gICAgICAgID8gbmFtZVxuICAgICAgICA6IHR5cGVvZiBuYW1lID09PSBcImZ1bmN0aW9uXCIgJiYgIW5hbWUubmFtZVxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiBuYW1lO1xuXG4gIHJldHVybiAob3JpZ2luYWw6IGFueSkgPT4ge1xuICAgIGNvbnN0IHN5bWJvbCA9IFN5bWJvbC5mb3IoY2F0ZWdvcnkgfHwgb3JpZ2luYWwudG9TdHJpbmcoKSk7XG4gICAgY29uc3QgbmFtZSA9IGNhdGVnb3J5IHx8IG9yaWdpbmFsLm5hbWU7XG5cbiAgICBjb25zdCBtZXRhZGF0YTogSW5qZWN0YWJsZU1ldGFkYXRhID0ge1xuICAgICAgY2xhc3M6IG5hbWUsXG4gICAgICBzeW1ib2w6IHN5bWJvbCxcbiAgICB9O1xuXG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgIGdldEluamVjdEtleShJbmplY3RhYmxlc0tleXMuSU5KRUNUQUJMRSksXG4gICAgICBtZXRhZGF0YSxcbiAgICAgIG9yaWdpbmFsXG4gICAgKTtcbiAgICAvLyB0aGUgbmV3IGNvbnN0cnVjdG9yIGJlaGF2aW91clxuICAgIGNvbnN0IG5ld0NvbnN0cnVjdG9yOiBhbnkgPSBmdW5jdGlvbiAoLi4uYXJnczogYW55W10pIHtcbiAgICAgIHJldHVybiBJbmplY3RhYmxlcy5nZXQ8YW55PihzeW1ib2wsIC4uLmFyZ3MpO1xuICAgIH07XG5cbiAgICAvLyBjb3B5IHByb3RvdHlwZSBzbyBpbnN0YW5jZW9mIG9wZXJhdG9yIHN0aWxsIHdvcmtzXG4gICAgbmV3Q29uc3RydWN0b3IucHJvdG90eXBlID0gb3JpZ2luYWwucHJvdG90eXBlO1xuICAgIC8vIG5ld0NvbnN0cnVjdG9yLl9fcHJvdG9fXyA9IG9yaWdpbmFsLl9fcHJvdG9fXztcbiAgICAvLyBTZXRzIHRoZSBwcm9wZXIgY29uc3RydWN0b3IgbmFtZSBmb3IgdHlwZSB2ZXJpZmljYXRpb25cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3Q29uc3RydWN0b3IsIFwibmFtZVwiLCB7XG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBvcmlnaW5hbC5wcm90b3R5cGUuY29uc3RydWN0b3IubmFtZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG9wdHM6IEluamVjdGFibGVPcHRpb25zPGFueT4gPSB7XG4gICAgICBzaW5nbGV0b246IHRydWUsXG4gICAgICBjYWxsYmFjazogaW5zdGFuY2VDYWxsYmFjayBhcyBJbnN0YW5jZUNhbGxiYWNrPGFueT4sXG4gICAgfTtcblxuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICBnZXRJbmplY3RLZXkoSW5qZWN0YWJsZXNLZXlzLklOSkVDVEFCTEUpLFxuICAgICAgbWV0YWRhdGEsXG4gICAgICBuZXdDb25zdHJ1Y3RvclxuICAgICk7XG5cbiAgICBJbmplY3RhYmxlcy5yZWdpc3RlcihvcmlnaW5hbCwgc3ltYm9sLCBvcHRzKTtcbiAgICAvLyByZXR1cm4gbmV3IGNvbnN0cnVjdG9yICh3aWxsIG92ZXJyaWRlIG9yaWdpbmFsKVxuICAgIHJldHVybiBuZXdDb25zdHJ1Y3RvcjtcbiAgfTtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZ1bmN0aW9uIHR5cGUgZm9yIHRyYW5zZm9ybWluZyBpbmplY3RhYmxlIGluc3RhbmNlcyBiZWZvcmUgdGhleSdyZSBpbmplY3RlZC5cbiAqIEBzdW1tYXJ5IEZ1bmN0aW9uIHdoaWNoIHRyYW5zZm9ybXMgYSBjYWNoZWQge0BsaW5rIGluamVjdGFibGV9IGluc3RhbmNlIGJlZm9yZSBpdCdzIGluamVjdGVkIGludG8gYSB0YXJnZXQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7YW55fSBpbmplY3RhYmxlIFRoZSBpbmplY3RhYmxlIGluc3RhbmNlIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHthbnl9IG9iaiBUaGUgb2JqZWN0IHRoZSBpbmplY3RhYmxlIHdpbGwgYmUgaW5qZWN0ZWQgb25cbiAqIEByZXR1cm4ge2FueX0gVGhlIHRyYW5zZm9ybWVkIGluamVjdGFibGUgaW5zdGFuY2VcbiAqXG4gKiBAdHlwZWRlZiB7RnVuY3Rpb259IEluc3RhbmNlVHJhbnNmb3JtZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCB0eXBlIEluc3RhbmNlVHJhbnNmb3JtZXIgPSAoaW5qZWN0YWJsZTogYW55LCBvYmo6IGFueSkgPT4gYW55O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGEgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBAc3VtbWFyeSBBbGxvd3MgZm9yIHRoZSBpbmplY3Rpb24gb2YgYW4ge0BsaW5rIGluamVjdGFibGV9IGRlY29yYXRlZCBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIFRoZSBwcm9wZXJ0eSBtdXN0IGJlIHR5cGVkIGZvciB0aGUgcmVxdWVzdGVkIGRlcGVuZGVuY3kuIE9ubHkgY29uY3JldGUgY2xhc3NlcyBhcmUgc3VwcG9ydGVkOyBnZW5lcmljcyBhcmUgbm90LlxuICpcbiAqIEluamVjdGVkIHByb3BlcnRpZXMgc2hvdWxkIGJlIGRlc2NyaWJlZCBsaWtlIHNvOlxuICogPHByZT5cbiAqICAgICBjbGFzcyBDbGFzc05hbWUge1xuICogICAgICAgICAuLi5cbiAqXG4gKiAgICAgICAgIEBpbmplY3QoKVxuICogICAgICAgICBwcm9wZXJ0eU5hbWUhOiBJbmplY3RhYmxlQ2xhc3M7XG4gKlxuICogICAgICAgICAuLi5cbiAqICAgICB9XG4gKiA8L3ByZT5cbiAqXG4gKiB3aGVyZSBJbmplY3RhYmxlQ2xhc3MgaXMgdGhlIGNsYXNzIHlvdSB3YW50IHRvIGluamVjdC5cbiAqIE5vdGljZSB0aGUgdXNlIG9mICchOicgdG8gZW5zdXJlIHRoZSB0cmFuc3BpbGVyIHRoZSBwcm9wZXJ0eSB3aWxsIGJlIHNldCBvdXRzaWRlIHRoZSBjb25zdHJ1Y3RvciBidXQgd2lsbCBhbHdheXMgYmUgZGVmaW5lZC5cbiAqIEZvciBwcm9qZWN0cyB3aGVyZSBtaW5pZmljYXRpb24gb2NjdXJzLCB5b3Ugc2hvdWxkIHVzZSB0aGUgY2F0ZWdvcnkgcGFyYW0gdG8gZW5zdXJlIHRoZSBuYW1lIGlzIHRoZSBzYW1lIHRocm91Z2hvdXQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtjYXRlZ29yeV0gRGVmYXVsdHMgdG8gdGhlIGNsYXNzIG5hbWUgZGVyaXZlZCBmcm9tIHRoZSBwcm9wZXJ0eSB0eXBlLiBVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2NjdXJzXG4gKiBhbmQgbmFtZXMgYXJlIGNoYW5nZWQsIG9yIHdoZW4geW91IHdhbnQgdG8gdXBjYXN0IHRoZSBvYmplY3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAqIEBwYXJhbSB7SW5zdGFuY2VUcmFuc2Zvcm1lcn0gW3RyYW5zZm9ybWVyXSBPcHRpb25hbCBmdW5jdGlvbiB0byB0cmFuc2Zvcm0gdGhlIGluamVjdGFibGUgaW5zdGFuY2UgYmVmb3JlIGl0J3MgaW5qZWN0ZWQuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IERlY29yYXRvclxuICogICBwYXJ0aWNpcGFudCBJbmplY3RhYmxlc1xuICpcbiAqICAgQ2xpZW50LT4+RGVjb3JhdG9yOiBAaW5qZWN0KClcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBHZXQgdHlwZSBmcm9tIHByb3BlcnR5XG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogRGVmaW5lIG1ldGFkYXRhXG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogRGVmaW5lIHByb3BlcnR5IGdldHRlclxuICpcbiAqICAgTm90ZSBvdmVyIERlY29yYXRvcjogV2hlbiBwcm9wZXJ0eSBhY2Nlc3NlZFxuICogICBDbGllbnQtPj5EZWNvcmF0b3I6IGFjY2VzcyBwcm9wZXJ0eVxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IENoZWNrIGlmIGluc3RhbmNlIGV4aXN0c1xuICogICBhbHQgSW5zdGFuY2UgZXhpc3RzIGluIFdlYWtNYXBcbiAqICAgICBEZWNvcmF0b3ItLT4+Q2xpZW50OiBSZXR1cm4gY2FjaGVkIGluc3RhbmNlXG4gKiAgIGVsc2UgTm8gaW5zdGFuY2VcbiAqICAgICBEZWNvcmF0b3ItPj5JbmplY3RhYmxlczogZ2V0KG5hbWUpXG4gKiAgICAgYWx0IEluamVjdGFibGUgZm91bmRcbiAqICAgICAgIEluamVjdGFibGVzLS0+PkRlY29yYXRvcjogUmV0dXJuIGluamVjdGFibGUgaW5zdGFuY2VcbiAqICAgICAgIG9wdCBIYXMgdHJhbnNmb3JtZXJcbiAqICAgICAgICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBDYWxsIHRyYW5zZm9ybWVyXG4gKiAgICAgICBlbmRcbiAqICAgICAgIERlY29yYXRvci0+PkRlY29yYXRvcjogU3RvcmUgaW4gV2Vha01hcFxuICogICAgICAgRGVjb3JhdG9yLS0+PkNsaWVudDogUmV0dXJuIGluc3RhbmNlXG4gKiAgICAgZWxzZSBObyBpbmplY3RhYmxlXG4gKiAgICAgICBEZWNvcmF0b3ItLT4+Q2xpZW50OiBUaHJvdyBlcnJvclxuICogICAgIGVuZFxuICogICBlbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdChcbiAgY2F0ZWdvcnk/OiBzeW1ib2wgfCBzdHJpbmcgfCB7IG5ldyAoLi4uYXJnczogYW55W10pOiBhbnkgfSxcbiAgdHJhbnNmb3JtZXI/OiBJbnN0YW5jZVRyYW5zZm9ybWVyLFxuICAuLi5hcmdzOiBhbnlbXVxuKSB7XG4gIHJldHVybiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5PzogYW55KSA9PiB7XG4gICAgY29uc3QgdmFsdWVzID0gbmV3IFdlYWtNYXAoKTtcblxuICAgIGNvbnN0IG5hbWU6IHN5bWJvbCB8IHN0cmluZyB8IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IGFueSB9IHwgdW5kZWZpbmVkID1cbiAgICAgIGNhdGVnb3J5IHx8IGdldFR5cGVGcm9tRGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZ2V0IFR5cGUgZnJvbSBkZWNvcmF0b3JgKTtcbiAgICB9XG5cbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgZ2V0SW5qZWN0S2V5KEluamVjdGFibGVzS2V5cy5JTkpFQ1QpLFxuICAgICAge1xuICAgICAgICBpbmplY3RhYmxlOiBuYW1lLFxuICAgICAgfSxcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQodGhpczogYW55KSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgIHByb3BlcnR5S2V5XG4gICAgICAgICkgYXMgUHJvcGVydHlEZXNjcmlwdG9yO1xuICAgICAgICBpZiAoZGVzY3JpcHRvci5jb25maWd1cmFibGUpIHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0KHRoaXM6IGFueSkge1xuICAgICAgICAgICAgICBsZXQgb2JqID0gdmFsdWVzLmdldCh0aGlzKTtcbiAgICAgICAgICAgICAgaWYgKCFvYmopIHtcbiAgICAgICAgICAgICAgICBvYmogPSBJbmplY3RhYmxlcy5nZXQobmFtZSwgLi4uYXJncyk7XG4gICAgICAgICAgICAgICAgaWYgKCFvYmopXG4gICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBDb3VsZCBub3QgZ2V0IEluamVjdGFibGUgJHtuYW1lLnRvU3RyaW5nKCl9IHRvIGluamVjdCBpbiAke3RhcmdldC5jb25zdHJ1Y3RvciA/IHRhcmdldC5jb25zdHJ1Y3Rvci5uYW1lIDogdGFyZ2V0Lm5hbWV9J3MgJHtwcm9wZXJ0eUtleX1gXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm1lcilcbiAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIG9iaiA9IHRyYW5zZm9ybWVyKG9iaiwgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWx1ZXMuc2V0KHRoaXMsIG9iaik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXNbcHJvcGVydHlLZXldO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBsaWdodHdlaWdodCBkZXBlbmRlbmN5IGluamVjdGlvbiBsaWJyYXJ5IGZvciBUeXBlU2NyaXB0IGFwcGxpY2F0aW9ucy5cbiAqIEBzdW1tYXJ5IEFkZHMgYSBzaW1wbGUgSW5qZWN0YWJsZXMgaW1wbGVtZW50YXRpb24gdG8gY3JlYXRlIHNpbmdsZXRvbiBpbnN0YW5jZXMgb2YgYW4gb2JqZWN0XG4gKiBhbmQgZWFzaWx5IGluamVjdCBpdCBpbnRvIG90aGVyIG9iamVjdHMuIFByb3ZpZGVzIGRlY29yYXRvcnMgZm9yIG1hcmtpbmcgY2xhc3NlcyBhcyBpbmplY3RhYmxlXG4gKiBhbmQgZm9yIGluamVjdGluZyBkZXBlbmRlbmNpZXMgaW50byBjbGFzcyBwcm9wZXJ0aWVzLlxuICpcbiAqIEBtb2R1bGUgaW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cblxuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9JbmplY3RhYmxlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmVnaXN0cnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDdXJyZW50IHZlcnNpb24gb2YgdGhlIGluamVjdGFibGUtZGVjb3JhdG9ycyBsaWJyYXJ5LlxuICogQHN1bW1hcnkgRGVmaW5lZCBvbiBsaWJyYXJ5IGJ1aWxkLiBIb2xkcyB0aGUgbGlicmFyeSdzIGN1cnJlbnQgdmVyc2lvbiBzdHJpbmcuXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7Ozs7OztBQVVHO0FBQ1UsTUFBQSxlQUFlLEdBQUc7QUFDN0IsSUFBQSxPQUFPLEVBQUUsWUFBWTtBQUNyQixJQUFBLFVBQVUsRUFBRSxZQUFZO0FBQ3hCLElBQUEsTUFBTSxFQUFFLFFBQVE7OztBQ2tEbEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBeUNHO01BQ1UscUJBQXFCLENBQUE7QUFBbEMsSUFBQSxXQUFBLEdBQUE7UUFDVSxJQUFLLENBQUEsS0FBQSxHQUFrQyxFQUFFOztBQUVqRCxJQUFBLEdBQUcsQ0FBSSxJQUEwQyxFQUFBO1FBQy9DLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUTtBQUFFLFlBQUEsT0FBTyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUs7QUFDdkQsUUFBQSxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUs7O0FBR2xEOztBQUVHO0FBQ0gsSUFBQSxHQUFHLENBQ0QsSUFBbUQsRUFDbkQsR0FBRyxJQUFXLEVBQUE7UUFFZCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVE7QUFBRSxZQUFBLElBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztBQUNyRCxRQUFBLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO0FBQzVCLFlBQUEsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FDOUIsWUFBWSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsRUFDeEMsSUFBSSxDQUNMO0FBQ0QsWUFBQSxJQUFJLEdBQUksSUFBSSxFQUFFLE1BQWlCLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7O0FBRWhF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
525
+ export { DefaultInjectablesConfig, InjectableRegistryImp, Injectables, InjectablesKeys, TypeKey, VERSION, getInjectKey, getTypeFromDecorator, inject, injectable, onDemand, singleton };
526
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5qZWN0YWJsZS1kZWNvcmF0b3JzLmVzbS5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25zdGFudHMudHMiLCIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvcmVnaXN0cnkudHMiLCIuLi9zcmMvSW5qZWN0YWJsZXMudHMiLCIuLi9zcmMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlQ29uZmlnIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25zdGFudHMgdXNlZCBmb3IgcmVmbGVjdGlvbiBtZXRhZGF0YSBrZXlzIGluIHRoZSBkZXBlbmRlbmN5IGluamVjdGlvbiBzeXN0ZW0uXG4gKiBAc3VtbWFyeSBJbmplY3RhYmxlcyBSZWZsZWN0aW9uIGtleXMgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEgYWJvdXQgaW5qZWN0YWJsZSBjbGFzc2VzIGFuZCBwcm9wZXJ0aWVzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFRkxFQ1QgUmVmbGVjdGlvbiBpbmplY3RhYmxlcyBiYXNlIGtleSBwcmVmaXggZm9yIGFsbCBtZXRhZGF0YSBrZXlzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSU5KRUNUQUJMRSBSZWZsZWN0aW9uIGtleSBzdWZmaXggZm9yIG1hcmtpbmcgYSBjbGFzcyBhcyBpbmplY3RhYmxlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSU5KRUNUIFJlZmxlY3Rpb24ga2V5IHN1ZmZpeCBmb3IgbWFya2luZyBhIHByb3BlcnR5IGZvciBpbmplY3Rpb25cbiAqIEBjb25zdCBJbmplY3RhYmxlc0tleXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBJbmplY3RhYmxlc0tleXMgPSB7XG4gIFJFRkxFQ1Q6IFwiaW5qZWN0LmRiLlwiLFxuICBJTkpFQ1RBQkxFOiBcImluamVjdGFibGVcIixcbiAgSU5KRUNUOiBcImluamVjdFwiLFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBjb25maWd1cmF0aW9uIGFwcGxpZWQgYnkgdGhlIEBpbmplY3RhYmxlIGRlY29yYXRvciB3aGVuIG5vbmUgaXMgcHJvdmlkZWQuXG4gKiBAc3VtbWFyeSBTZXRzIHNlbnNpYmxlIGRlZmF1bHRzIHN1Y2ggYXMgc2luZ2xldG9uIGxpZmVjeWNsZSBmb3IgbmV3bHkgcmVnaXN0ZXJlZCBpbmplY3RhYmxlcy5cbiAqIEBjb25zdCBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWdcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWc6IEluamVjdGFibGVDb25maWcgPSB7XG4gIHNpbmdsZXRvbjogdHJ1ZSxcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlZmxlY3Rpb24gbWV0YWRhdGEga2V5IGZvciBhY2Nlc3NpbmcgVHlwZVNjcmlwdCB0eXBlIGluZm9ybWF0aW9uLlxuICogQHN1bW1hcnkgSG9sZHMgdGhlIGtleSBmb3IgcmV0cmlldmluZyB0aGUgZGVzaWduIHR5cGUgZnJvbSBUeXBlU2NyaXB0J3MgcmVmbGVjdGlvbiBtZXRhZGF0YS5cbiAqIEBjb25zdCBUeXBlS2V5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgVHlwZUtleSA9IFwiZGVzaWduOnR5cGVcIjtcbiIsImltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGFcIjtcbmltcG9ydCB7IEluamVjdGFibGVzS2V5cywgVHlwZUtleSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBmdWxseSBxdWFsaWZpZWQgcmVmbGVjdGlvbiBtZXRhZGF0YSBrZXkuXG4gKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSByZWZsZWN0aW9uIGtleSBmb3IgaW5qZWN0YWJsZXMgYnkgcHJlZml4aW5nIHRoZSBwcm92aWRlZCBrZXkgd2l0aCB0aGUgYmFzZSByZWZsZWN0aW9uIGtleS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0byBiZSBwcmVmaXhlZFxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZnVsbHkgcXVhbGlmaWVkIHJlZmxlY3Rpb24ga2V5XG4gKiBAZnVuY3Rpb24gZ2V0SW5qZWN0S2V5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgZ2V0SW5qZWN0S2V5ID0gKGtleTogc3RyaW5nKSA9PiBJbmplY3RhYmxlc0tleXMuUkVGTEVDVCArIGtleTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXh0cmFjdHMgdGhlIHR5cGUgbmFtZSBmcm9tIGEgZGVjb3JhdGVkIHByb3BlcnR5IHVzaW5nIHJlZmxlY3Rpb24uXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIHR5cGUgZnJvbSBhIHByb3BlcnR5IGRlY29yYXRvciBieSBhY2Nlc3NpbmcgVHlwZVNjcmlwdCdzIHJlZmxlY3Rpb24gbWV0YWRhdGEuXG4gKiBAcGFyYW0ge2FueX0gbW9kZWwgVGhlIHRhcmdldCBvYmplY3QgY29udGFpbmluZyB0aGUgZGVjb3JhdGVkIHByb3BlcnR5XG4gKiBAcGFyYW0ge3N0cmluZyB8IHN5bWJvbH0gcHJvcEtleSBUaGUgcHJvcGVydHkga2V5IChuYW1lIG9yIHN5bWJvbCkgb2YgdGhlIGRlY29yYXRlZCBwcm9wZXJ0eVxuICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdHlwZSwgb3IgdW5kZWZpbmVkIGlmIGl0J3MgYSBGdW5jdGlvbiB0eXBlXG4gKiBAZnVuY3Rpb24gZ2V0VHlwZUZyb21EZWNvcmF0b3JcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlRnJvbURlY29yYXRvcihcbiAgbW9kZWw6IGFueSxcbiAgcHJvcEtleTogc3RyaW5nIHwgc3ltYm9sXG4pOiBzeW1ib2wgfCB1bmRlZmluZWQge1xuICBjb25zdCB0eXBlRGVmID0gUmVmbGVjdC5nZXRNZXRhZGF0YShUeXBlS2V5LCBtb2RlbCwgcHJvcEtleSk7XG4gIGlmICh0eXBlRGVmLm5hbWUgPT09IFwiRnVuY3Rpb25cIikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgbWV0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgZ2V0SW5qZWN0S2V5KEluamVjdGFibGVzS2V5cy5JTkpFQ1RBQkxFKSxcbiAgICB0eXBlRGVmXG4gICk7XG4gIGlmICghbWV0YSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIG1ldGEuc3ltYm9sO1xufVxuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZURlZiwgSW5qZWN0YWJsZU9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZXNLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXRJbmplY3RLZXkgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUeXBlIHJlcHJlc2VudGluZyBlaXRoZXIgYSBjbGFzcyBjb25zdHJ1Y3RvciBvciBhbiBpbnN0YW5jZS5cbiAqIEBzdW1tYXJ5IERlZmluZXMgYW4gSW5qZWN0YWJsZSB0eXBlIHRoYXQgY2FuIGJlIGVpdGhlciBhIGNsYXNzIGNvbnN0cnVjdG9yIG9yIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MuXG4gKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiB0aGUgaW5qZWN0YWJsZSBvYmplY3RcbiAqIEB0eXBlZGVmIHtmdW5jdGlvbihhbnkpOiBUIHwgVH0gSW5qZWN0YWJsZVxuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgSW5qZWN0YWJsZTxUPiA9IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IFQgfSB8IFQ7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnRyYWN0IGZvciBhIHJlZ2lzdHJ5IHRoYXQgbWFuYWdlcyBpbmplY3RhYmxlIG9iamVjdHMuXG4gKiBAc3VtbWFyeSBJbnRlcmZhY2UgZm9yIGFuIGluamVjdGFibGUgcmVnaXN0cnkgdGhhdCBwcm92aWRlcyBtZXRob2RzIGZvciByZXRyaWV2aW5nLCByZWdpc3RlcmluZywgYW5kIGJ1aWxkaW5nIGluamVjdGFibGUgb2JqZWN0cy5cbiAqIEB0ZW1wbGF0ZSBUIFR5cGUgcGFyYW1ldGVyIHVzZWQgaW4gdGhlIGludGVyZmFjZSBtZXRob2RzXG4gKiBAaW50ZXJmYWNlIEluamVjdGFibGVzUmVnaXN0cnlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5qZWN0YWJsZXNSZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRmV0Y2hlcyBhbiBpbmplY3RhYmxlIGluc3RhbmNlIGJ5IGl0cyByZWdpc3RlcmVkIG5hbWUuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhbiB7QGxpbmsgSW5qZWN0YWJsZX0gZnJvbSB0aGUgcmVnaXN0cnkgYnkgbmFtZSwgb3B0aW9uYWxseSBwYXNzaW5nIGNvbnN0cnVjdG9yIGFyZ3VtZW50cy5cbiAgICogQHRlbXBsYXRlIFQgVHlwZSBvZiB0aGUgaW5qZWN0YWJsZSBvYmplY3QgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHtzeW1ib2x9IG5hbWUgVGhlIHJlZ2lzdGVyZWQgbmFtZSBvZiB0aGUgaW5qZWN0YWJsZSB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIENvbnN0cnVjdG9yIGFyZ3VtZW50cyB0byBwYXNzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgaW5qZWN0YWJsZVxuICAgKiBAcmV0dXJuIHtJbmplY3RhYmxlPFQ+IHwgdW5kZWZpbmVkfSBUaGUgaW5qZWN0YWJsZSBpbnN0YW5jZSBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kXG4gICAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gICAqL1xuICBnZXQ8VD4oXG4gICAgbmFtZTogc3ltYm9sIHwgc3RyaW5nIHwgeyBuZXcgKC4uLmFyZ3M6IGFueVtdKTogVCB9LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFQgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBZGRzIGEgY2xhc3Mgb3Igb2JqZWN0IHRvIHRoZSBpbmplY3RhYmxlIHJlZ2lzdHJ5LlxuICAgKiBAc3VtbWFyeSBSZWdpc3RlcnMgYW4gaW5qZWN0YWJsZSBjb25zdHJ1Y3RvciBvciBpbnN0YW5jZSB3aXRoIHRoZSByZWdpc3RyeSwgbWFraW5nIGl0IGF2YWlsYWJsZSBmb3IgaW5qZWN0aW9uLlxuICAgKiBAdGVtcGxhdGUgVCBUeXBlIG9mIHRoZSBpbmplY3RhYmxlIG9iamVjdCB0byByZWdpc3RlclxuICAgKiBAcGFyYW0ge0luamVjdGFibGU8VD59IGNvbnN0cnVjdG9yIFRoZSBjbGFzcyBjb25zdHJ1Y3RvciBvciBvYmplY3QgaW5zdGFuY2UgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgcmVnaXN0cmF0aW9uIChjYXRlZ29yeSwgc2luZ2xldG9uIGZsYWcsIGV0Yy4pXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gICAqL1xuICByZWdpc3RlcjxUPihcbiAgICBjb25zdHJ1Y3RvcjogSW5qZWN0YWJsZTxUPixcbiAgICBjYXRlZ29yeTogc3ltYm9sIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM6IEluamVjdGFibGVPcHRpb25zPFQ+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIGFuIGluamVjdGFibGUgY2xhc3MuXG4gICAqIEBzdW1tYXJ5IEluc3RhbnRpYXRlcyBhbiBpbmplY3RhYmxlIGNsYXNzIHVzaW5nIGl0cyBjb25zdHJ1Y3RvciBhbmQgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICogQHRlbXBsYXRlIFQgVHlwZSBvZiB0aGUgb2JqZWN0IHRvIGJ1aWxkXG4gICAqIEBwYXJhbSB7c3ltYm9sfSBuYW1lIE9iamVjdCBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBpbmplY3RhYmxlIHRvIGJ1aWxkXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgQ29uc3RydWN0b3IgYXJndW1lbnRzIHRvIHBhc3Mgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBpbmplY3RhYmxlXG4gICAqIEByZXR1cm4ge1R9IFRoZSBuZXdseSBjcmVhdGVkIGluc3RhbmNlXG4gICAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gICAqL1xuICBidWlsZDxUPihuYW1lOiBzeW1ib2wsIC4uLmFyZ3M6IGFueVtdKTogVDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSW5qZWN0YWJsZXNSZWdpc3RyeSBpbnRlcmZhY2UuXG4gKiBAc3VtbWFyeSBIb2xkcyB0aGUgdmFyaW91cyB7QGxpbmsgSW5qZWN0YWJsZX1zIGluIGEgY2FjaGUgYW5kIHByb3ZpZGVzIG1ldGhvZHMgdG8gcmVnaXN0ZXIsIHJldHJpZXZlLCBhbmQgYnVpbGQgdGhlbS5cbiAqIEB0ZW1wbGF0ZSBUIFR5cGUgcGFyYW1ldGVyIHVzZWQgaW4gdGhlIGNsYXNzIG1ldGhvZHNcbiAqXG4gKiBAY2xhc3MgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wXG4gKiBAaW1wbGVtZW50cyBJbmplY3RhYmxlc1JlZ2lzdHJ5XG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgbmV3IHJlZ2lzdHJ5XG4gKiBjb25zdCByZWdpc3RyeSA9IG5ldyBJbmplY3RhYmxlUmVnaXN0cnlJbXAoKTtcbiAqXG4gKiAvLyBSZWdpc3RlciBhIGNsYXNzXG4gKiBjbGFzcyBNeVNlcnZpY2Uge1xuICogICBkb1NvbWV0aGluZygpIHtcbiAqICAgICByZXR1cm4gJ0hlbGxvIFdvcmxkJztcbiAqICAgfVxuICogfVxuICogcmVnaXN0cnkucmVnaXN0ZXIoTXlTZXJ2aWNlLCAnTXlTZXJ2aWNlJywgdHJ1ZSk7XG4gKlxuICogLy8gR2V0IHRoZSBpbnN0YW5jZVxuICogY29uc3Qgc2VydmljZSA9IHJlZ2lzdHJ5LmdldCgnTXlTZXJ2aWNlJyk7XG4gKiBzZXJ2aWNlLmRvU29tZXRoaW5nKCk7IC8vICdIZWxsbyBXb3JsZCdcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBSZWdpc3RyeVxuICpcbiAqICAgQ2xpZW50LT4+UmVnaXN0cnk6IHJlZ2lzdGVyKE15U2VydmljZSlcbiAqICAgUmVnaXN0cnktPj5SZWdpc3RyeTogU3RvcmUgaW4gY2FjaGVcbiAqXG4gKiAgIENsaWVudC0+PlJlZ2lzdHJ5OiBnZXQoXCJNeVNlcnZpY2VcIilcbiAqICAgYWx0IEluc3RhbmNlIGV4aXN0cyBhbmQgaXMgc2luZ2xldG9uXG4gKiAgICAgUmVnaXN0cnktLT4+Q2xpZW50OiBSZXR1cm4gY2FjaGVkIGluc3RhbmNlXG4gKiAgIGVsc2UgTm8gaW5zdGFuY2Ugb3Igbm90IHNpbmdsZXRvblxuICogICAgIFJlZ2lzdHJ5LT4+UmVnaXN0cnk6IGJ1aWxkKG5hbWUpXG4gKiAgICAgUmVnaXN0cnktLT4+Q2xpZW50OiBSZXR1cm4gbmV3IGluc3RhbmNlXG4gKiAgIGVuZFxuICovXG5leHBvcnQgY2xhc3MgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wIGltcGxlbWVudHMgSW5qZWN0YWJsZXNSZWdpc3RyeSB7XG4gIHByaXZhdGUgY2FjaGU6IFJlY29yZDxzeW1ib2wsIEluamVjdGFibGVEZWY+ID0ge307XG5cbiAgaGFzPFQ+KG5hbWU6IHN5bWJvbCB8IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IFQgfSk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikgcmV0dXJuIG5hbWUgaW4gdGhpcy5jYWNoZTtcbiAgICByZXR1cm4gU3ltYm9sLmZvcihuYW1lLnRvU3RyaW5nKCkpIGluIHRoaXMuY2FjaGU7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIGdldDxUPihcbiAgICBuYW1lOiBzeW1ib2wgfCBzdHJpbmcgfCB7IG5ldyAoLi4uYXJnczogYW55W10pOiBUIH0sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN0cmluZ1wiKSBuYW1lID0gU3ltYm9sLmZvcihuYW1lKTtcbiAgICBpZiAodHlwZW9mIG5hbWUgIT09IFwic3ltYm9sXCIpIHtcbiAgICAgIGNvbnN0IG1ldGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICBnZXRJbmplY3RLZXkoSW5qZWN0YWJsZXNLZXlzLklOSkVDVEFCTEUpLFxuICAgICAgICBuYW1lXG4gICAgICApO1xuICAgICAgbmFtZSA9IChtZXRhPy5zeW1ib2wgYXMgc3ltYm9sKSB8fCBTeW1ib2wuZm9yKG5hbWUudG9TdHJpbmcoKSk7XG4gICAgfVxuICAgIGlmICghbmFtZSkgdGhyb3cgbmV3IEVycm9yKGBJbmplY3RhYmxlICR7bmFtZX0gbm90IGZvdW5kYCk7XG5cbiAgICBpZiAoISgobmFtZSBhcyBzeW1ib2wpIGluIHRoaXMuY2FjaGUpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGVbbmFtZV07XG4gICAgaWYgKCFjYWNoZS5vcHRpb25zLnNpbmdsZXRvbiAmJiAhY2FjaGUuaW5zdGFuY2UpXG4gICAgICByZXR1cm4gdGhpcy5idWlsZDxUPihuYW1lLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gY2FjaGUuaW5zdGFuY2UgfHwgdGhpcy5idWlsZDxUPihuYW1lLCAuLi5hcmdzKTtcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHJlZ2lzdGVyPFQ+KFxuICAgIG9iajogSW5qZWN0YWJsZTxUPixcbiAgICBjYXRlZ29yeTogc3ltYm9sIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM6IEluamVjdGFibGVPcHRpb25zPFQ+LFxuICAgIGZvcmNlOiBib29sZWFuID0gZmFsc2VcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgY2FzdE9iajogUmVjb3JkPHN0cmluZywgYW55PiA9IG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG4gICAgY29uc3QgY29uc3RydWN0b3IgPSAhY2FzdE9iai5uYW1lICYmIGNhc3RPYmouY29uc3RydWN0b3I7XG4gICAgaWYgKHR5cGVvZiBjYXN0T2JqICE9PSBcImZ1bmN0aW9uXCIgJiYgIWNvbnN0cnVjdG9yKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW5qZWN0YWJsZSByZWdpc3RlcmluZyBmYWlsZWQuIE1pc3NpbmcgQ2xhc3MgbmFtZSBvciBjb25zdHJ1Y3RvcmBcbiAgICAgICk7XG5cbiAgICBjb25zdCBuYW1lID0gY2F0ZWdvcnkgfHwgU3ltYm9sLmZvcigob2JqIGFzIGFueSkudG9TdHJpbmcoKSk7XG5cbiAgICBpZiAoIXRoaXMuY2FjaGVbbmFtZV0gfHwgZm9yY2UpXG4gICAgICB0aGlzLmNhY2hlW25hbWVdID0ge1xuICAgICAgICBpbnN0YW5jZTogb3B0aW9ucy5zaW5nbGV0b24gJiYgY29uc3RydWN0b3IgPyBvYmogOiB1bmRlZmluZWQsXG4gICAgICAgIGNvbnN0cnVjdG9yOiAhY29uc3RydWN0b3IgPyBvYmogOiAob2JqIGFzIGFueSkuY29uc3RydWN0b3IsXG4gICAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgYnVpbGQ8VD4obmFtZTogc3ltYm9sLCAuLi5hcmdzOiBhbnlbXSk6IFQge1xuICAgIGNvbnN0IHsgY29uc3RydWN0b3IsIG9wdGlvbnMgfSA9IHRoaXMuY2FjaGVbbmFtZV07XG4gICAgbGV0IGluc3RhbmNlOiBUO1xuICAgIHRyeSB7XG4gICAgICBpbnN0YW5jZSA9IG5ldyBjb25zdHJ1Y3RvciguLi5hcmdzKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBmYWlsZWQgdG8gYnVpbGQgJHtuYW1lLnRvU3RyaW5nKCl9IHdpdGggYXJncyAke2FyZ3N9OiAke2V9YFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuc2luZ2xldG9uKSB7XG4gICAgICB0aGlzLmNhY2hlW25hbWVdLmluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmNhbGxiYWNrKSBpbnN0YW5jZSA9IG9wdGlvbnMuY2FsbGJhY2soaW5zdGFuY2UsIC4uLmFyZ3MpO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgSW5qZWN0YWJsZSxcbiAgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wLFxuICBJbmplY3RhYmxlc1JlZ2lzdHJ5LFxufSBmcm9tIFwiLi9yZWdpc3RyeVwiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZU9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDZW50cmFsIHJlZ2lzdHJ5IGZvciBtYW5hZ2luZyBpbmplY3RhYmxlIGRlcGVuZGVuY2llcy5cbiAqIEBzdW1tYXJ5IFN0YXRpYyBjbGFzcyBob2xkaW5nIHRoZSBhY2Nlc3MgdG8gdGhlIGluamVjdGFibGVzIGZ1bmN0aW9ucy4gUHJvdmlkZXMgbWV0aG9kcyBmb3IgcmVnaXN0ZXJpbmcsXG4gKiByZXRyaWV2aW5nLCBhbmQgYnVpbGRpbmcgaW5qZWN0YWJsZSBvYmplY3RzLlxuICogQHRlbXBsYXRlIFQgVHlwZSBvZiB0aGUgaW5qZWN0YWJsZSBvYmplY3RcbiAqXG4gKiBAY2xhc3MgSW5qZWN0YWJsZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRGVmaW5lIGFuIGluamVjdGFibGUgY2xhc3NcbiAqIEBpbmplY3RhYmxlKClcbiAqIGNsYXNzIE15U2VydmljZSB7XG4gKiAgIGRvU29tZXRoaW5nKCkge1xuICogICAgIHJldHVybiAnSGVsbG8gV29ybGQnO1xuICogICB9XG4gKiB9XG4gKlxuICogLy8gSW5qZWN0IHRoZSBzZXJ2aWNlIGludG8gYW5vdGhlciBjbGFzc1xuICogY2xhc3MgTXlDb21wb25lbnQge1xuICogICBAaW5qZWN0KClcbiAqICAgcHJpdmF0ZSBzZXJ2aWNlITogTXlTZXJ2aWNlO1xuICpcbiAqICAgdXNlU2VydmljZSgpIHtcbiAqICAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmRvU29tZXRoaW5nKCk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBJbmplY3RhYmxlc1xuICogICBwYXJ0aWNpcGFudCBSZWdpc3RyeVxuICpcbiAqICAgQ2xpZW50LT4+SW5qZWN0YWJsZXM6IHJlZ2lzdGVyKE15U2VydmljZSlcbiAqICAgSW5qZWN0YWJsZXMtPj5SZWdpc3RyeTogcmVnaXN0ZXIoTXlTZXJ2aWNlKVxuICogICBSZWdpc3RyeS0tPj5JbmplY3RhYmxlczogdm9pZFxuICpcbiAqICAgQ2xpZW50LT4+SW5qZWN0YWJsZXM6IGdldChcIk15U2VydmljZVwiKVxuICogICBJbmplY3RhYmxlcy0+PlJlZ2lzdHJ5OiBnZXQoXCJNeVNlcnZpY2VcIilcbiAqICAgUmVnaXN0cnktLT4+SW5qZWN0YWJsZXM6IE15U2VydmljZSBpbnN0YW5jZVxuICogICBJbmplY3RhYmxlcy0tPj5DbGllbnQ6IE15U2VydmljZSBpbnN0YW5jZVxuICovXG5leHBvcnQgY2xhc3MgSW5qZWN0YWJsZXMge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhvbGRzIHRoZSBhY3RpdmUgcmVnaXN0cnkgaW1wbGVtZW50YXRpb24gdXNlZCBieSB0aGUgSW5qZWN0YWJsZXMgZmFjYWRlLlxuICAgKiBAc3VtbWFyeSBJbnRlcm5hbCBzdGF0aWMgcmVmZXJlbmNlIHRoYXQgY2FuIGJlIHN3YXBwZWQgdmlhIHNldFJlZ2lzdHJ5IHRvIGN1c3RvbWl6ZSBob3cgaW5qZWN0YWJsZXMgYXJlIHN0b3JlZCBhbmQgcmV0cmlldmVkLlxuICAgKiBAdHlwZSB7SW5qZWN0YWJsZXNSZWdpc3RyeSB8IHVuZGVmaW5lZH1cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGFjdGluZ0luamVjdGFibGVzUmVnaXN0cnk/OiBJbmplY3RhYmxlc1JlZ2lzdHJ5ID0gdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRmV0Y2hlcyBhbiBpbmplY3RhYmxlIGluc3RhbmNlIGJ5IGl0cyByZWdpc3RlcmVkIG5hbWUuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgbmFtZWQge0BsaW5rIEluamVjdGFibGV9IGZyb20gdGhlIHJlZ2lzdHJ5LiBJZiB0aGUgaW5qZWN0YWJsZSBpcyBhIHNpbmdsZXRvbixcbiAgICogcmV0dXJucyB0aGUgZXhpc3RpbmcgaW5zdGFuY2UuIE90aGVyd2lzZSwgY3JlYXRlcyBhIG5ldyBpbnN0YW5jZS5cbiAgICogQHRlbXBsYXRlIFQgVHlwZSBvZiB0aGUgaW5qZWN0YWJsZSBvYmplY3QgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIHJlZ2lzdGVyZWQgbmFtZSBvZiB0aGUgaW5qZWN0YWJsZSB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIENvbnN0cnVjdG9yIGFyZ3VtZW50cyB0byBwYXNzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgaW5qZWN0YWJsZVxuICAgKiBAcmV0dXJuIHtJbmplY3RhYmxlPFQ+IHwgdW5kZWZpbmVkfSBUaGUgaW5qZWN0YWJsZSBpbnN0YW5jZSBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kXG4gICAqL1xuICBzdGF0aWMgZ2V0PFQ+KFxuICAgIG5hbWU6IHN5bWJvbCB8IHN0cmluZyB8IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IFQgfSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gSW5qZWN0YWJsZXMuZ2V0UmVnaXN0cnkoKS5nZXQobmFtZSwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFkZHMgYSBjbGFzcyBvciBvYmplY3QgdG8gdGhlIGluamVjdGFibGUgcmVnaXN0cnkuXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhbiBpbmplY3RhYmxlIGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlIHdpdGggdGhlIHJlZ2lzdHJ5LCBtYWtpbmcgaXQgYXZhaWxhYmxlIGZvciBpbmplY3Rpb24uXG4gICAqIEB0ZW1wbGF0ZSBUIFR5cGUgb2YgdGhlIGluamVjdGFibGUgb2JqZWN0IHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7SW5qZWN0YWJsZTxUPn0gY29uc3RydWN0b3IgVGhlIGNsYXNzIGNvbnN0cnVjdG9yIG9yIG9iamVjdCBpbnN0YW5jZSB0byByZWdpc3RlclxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciByZWdpc3RyYXRpb24gKGNhdGVnb3J5LCBzaW5nbGV0b24gZmxhZywgZXRjLilcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyByZWdpc3RlcjxUPihjb25zdHJ1Y3RvcjogSW5qZWN0YWJsZTxUPiwgLi4uYXJnczogYW55W10pOiB2b2lkIHtcbiAgICByZXR1cm4gSW5qZWN0YWJsZXMuZ2V0UmVnaXN0cnkoKS5yZWdpc3RlcihcbiAgICAgIGNvbnN0cnVjdG9yLFxuICAgICAgLi4uKGFyZ3MgYXMgW3N5bWJvbCwgSW5qZWN0YWJsZU9wdGlvbnM8VD5dKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgYW4gaW5qZWN0YWJsZSBjbGFzcy5cbiAgICogQHN1bW1hcnkgSW5zdGFudGlhdGVzIGFuIGluamVjdGFibGUgY2xhc3MgdXNpbmcgaXRzIGNvbnN0cnVjdG9yIGFuZCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgKiBAdGVtcGxhdGUgVCBUeXBlIG9mIHRoZSBvYmplY3QgdG8gYnVpbGRcbiAgICogQHBhcmFtIHtzeW1ib2x9IG5hbWUgc3ltYm9sIHJlZmVyZW5jaW5nIHRoZSBpbmplY3RhYmxlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgQ29uc3RydWN0b3IgYXJndW1lbnRzIHRvIHBhc3Mgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBpbmplY3RhYmxlXG4gICAqIEByZXR1cm4ge1R9IFRoZSBuZXdseSBjcmVhdGVkIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgYnVpbGQ8VD4obmFtZTogc3ltYm9sLCAuLi5hcmdzOiBhbnlbXSk6IFQge1xuICAgIHJldHVybiBJbmplY3RhYmxlcy5nZXRSZWdpc3RyeSgpLmJ1aWxkKG5hbWUsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXBsYWNlcyB0aGUgY3VycmVudCByZWdpc3RyeSBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHN1bW1hcnkgU2V0cyBhIG5ldyB7QGxpbmsgSW5qZWN0YWJsZXNSZWdpc3RyeX0gaW1wbGVtZW50YXRpb24sIGFsbG93aW5nIGZvciBjdXN0b20gcmVnaXN0cnkgYmVoYXZpb3IuXG4gICAqIEBwYXJhbSB7SW5qZWN0YWJsZXNSZWdpc3RyeX0gb3BlcmF0aW9uc1JlZ2lzdHJ5IFRoZSBuZXcgaW1wbGVtZW50YXRpb24gb2YgUmVnaXN0cnkgdG8gdXNlXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgc2V0UmVnaXN0cnkob3BlcmF0aW9uc1JlZ2lzdHJ5OiBJbmplY3RhYmxlc1JlZ2lzdHJ5KTogdm9pZCB7XG4gICAgSW5qZWN0YWJsZXMuYWN0aW5nSW5qZWN0YWJsZXNSZWdpc3RyeSA9IG9wZXJhdGlvbnNSZWdpc3RyeTtcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgY3VycmVudCByZWdpc3RyeSBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgY3VycmVudCB7QGxpbmsgSW5qZWN0YWJsZXNSZWdpc3RyeX0gb3IgY3JlYXRlcyBhIGRlZmF1bHQgb25lIGlmIG5vbmUgZXhpc3RzLlxuICAgKiBAcmV0dXJuIHtJbmplY3RhYmxlc1JlZ2lzdHJ5fSBUaGUgY3VycmVudCByZWdpc3RyeSBpbnN0YW5jZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UmVnaXN0cnkoKTogSW5qZWN0YWJsZXNSZWdpc3RyeSB7XG4gICAgaWYgKCFJbmplY3RhYmxlcy5hY3RpbmdJbmplY3RhYmxlc1JlZ2lzdHJ5KVxuICAgICAgSW5qZWN0YWJsZXMuYWN0aW5nSW5qZWN0YWJsZXNSZWdpc3RyeSA9IG5ldyBJbmplY3RhYmxlUmVnaXN0cnlJbXAoKTtcbiAgICByZXR1cm4gSW5qZWN0YWJsZXMuYWN0aW5nSW5qZWN0YWJsZXNSZWdpc3RyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2xlYXJzIGFsbCByZWdpc3RlcmVkIGluamVjdGFibGVzLlxuICAgKiBAc3VtbWFyeSBSZXNldHMgdGhlIHJlZ2lzdHJ5IHRvIGEgY2xlYW4gc3RhdGUgYnkgY3JlYXRpbmcgYSBuZXcgZW1wdHkgcmVnaXN0cnkgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgcmVzZXQoKTogdm9pZCB7XG4gICAgSW5qZWN0YWJsZXMuc2V0UmVnaXN0cnkobmV3IEluamVjdGFibGVSZWdpc3RyeUltcCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVtb3ZlcyBzcGVjaWZpYyBpbmplY3RhYmxlcyBmcm9tIHRoZSByZWdpc3RyeSBiYXNlZCBvbiBhIHBhdHRlcm4uXG4gICAqIEBzdW1tYXJ5IFNlbGVjdGl2ZWx5IHJlc2V0cyB0aGUgcmVnaXN0cnkgYnkgcmVtb3Zpbmcgb25seSB0aGUgaW5qZWN0YWJsZXMgd2hvc2UgbmFtZXMgbWF0Y2ggdGhlIHByb3ZpZGVkIHBhdHRlcm4uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgUmVnRXhwfSBtYXRjaCBBIHN0cmluZyBvciByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiB0byBtYXRjaCBhZ2FpbnN0IGluamVjdGFibGUgbmFtZXNcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBzZWxlY3RpdmVSZXNldChtYXRjaDogc3RyaW5nIHwgUmVnRXhwKTogdm9pZCB7XG4gICAgY29uc3QgcmVnZXhwID0gdHlwZW9mIG1hdGNoID09PSBcInN0cmluZ1wiID8gbmV3IFJlZ0V4cChtYXRjaCkgOiBtYXRjaDtcbiAgICAoSW5qZWN0YWJsZXMuYWN0aW5nSW5qZWN0YWJsZXNSZWdpc3RyeSBhcyBhbnkpW1wiY2FjaGVcIl0gPSBPYmplY3QuZW50cmllcyhcbiAgICAgIChJbmplY3RhYmxlcy5hY3RpbmdJbmplY3RhYmxlc1JlZ2lzdHJ5IGFzIGFueSlbXCJjYWNoZVwiXVxuICAgICkucmVkdWNlKChhY2N1bTogUmVjb3JkPHN0cmluZywgYW55PiwgW2tleSwgdmFsXSkgPT4ge1xuICAgICAgaWYgKCFrZXkubWF0Y2gocmVnZXhwKSkgYWNjdW1ba2V5XSA9IHZhbDtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCB7fSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZywgSW5qZWN0YWJsZXNLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlcyB9IGZyb20gXCIuL0luamVjdGFibGVzXCI7XG5pbXBvcnQgeyBnZXRJbmplY3RLZXksIGdldFR5cGVGcm9tRGVjb3JhdG9yIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IEluamVjdGFibGVNZXRhZGF0YSwgSW5zdGFuY2VDYWxsYmFjayB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIEBpbmplY3RhYmxlIGRlY29yYXRvci5cbiAqIEBzdW1tYXJ5IENvbnRyb2xzIGxpZmVjeWNsZSAoc2luZ2xldG9uIHZzIG9uLWRlbWFuZCkgYW5kIGFuIG9wdGlvbmFsIGluc3RhbmNlIHRyYW5zZm9ybWF0aW9uIGNhbGxiYWNrIGV4ZWN1dGVkIHBvc3QtY29uc3RydWN0aW9uLlxuICogQHRlbXBsYXRlIFQgVGhlIGluc3RhbmNlIHR5cGUgYWZmZWN0ZWQgYnkgdGhlIGNhbGxiYWNrIHdoZW4gcHJvdmlkZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHNpbmdsZXRvbiBXaGVuIHRydWUsIGEgc2luZ2xlIGluc3RhbmNlIGlzIHNoYXJlZCAoc2luZ2xldG9uKS4gV2hlbiBmYWxzZSwgaW5zdGFuY2VzIGFyZSBjcmVhdGVkIG9uIGRlbWFuZC5cbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2VDYWxsYmFjazxUPn0gW2NhbGxiYWNrXSBPcHRpb25hbCBob29rIHRvIHRyYW5zZm9ybSB0aGUgaW5zdGFuY2UgYWZ0ZXIgaXQgaXMgY29uc3RydWN0ZWQuXG4gKiBAdHlwZWRlZiBJbmplY3RhYmxlQ29uZmlnXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBJbmplY3RhYmxlQ29uZmlnID0ge1xuICBzaW5nbGV0b246IGJvb2xlYW47XG4gIGNhbGxiYWNrPzogSW5zdGFuY2VDYWxsYmFjazxhbnk+O1xufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJpYyBjb25zdHJ1Y3RvciB0eXBlIGZvciBjbGFzcy1saWtlIHZhbHVlcy5cbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYW55IGNsYXNzIHRoYXQgY2FuIGJlIGluc3RhbnRpYXRlZCB3aXRoIGFyYml0cmFyeSBhcmd1bWVudHMsIHByb2R1Y2luZyBhbiBpbnN0YW5jZSBvZiB0eXBlIFQuXG4gKiBAdGVtcGxhdGUgVCBUaGUgaW5zdGFuY2UgdHlwZSBjcmVhdGVkIGJ5IHRoZSBjb25zdHJ1Y3Rvci5cbiAqIEB0eXBlZGVmIENvbnN0cnVjdG9yXG4gKiBAZXhhbXBsZVxuICogLy8gVXNpbmcgQ29uc3RydWN0b3IgdG8gdHlwZSBhIGZhY3RvcnlcbiAqIGZ1bmN0aW9uIG1ha2U8VD4oQ3RvcjogQ29uc3RydWN0b3I8VD4sIC4uLmFyZ3M6IGFueVtdKTogVCB7XG4gKiAgIHJldHVybiBuZXcgQ3RvciguLi5hcmdzKTtcbiAqIH1cbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCB0eXBlIENvbnN0cnVjdG9yPFQgPSBhbnk+ID0geyBuZXcgKC4uLmFyZ3M6IGFueVtdKTogVCB9O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIGNsYXNzIGFzIGF2YWlsYWJsZSBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgY2xhc3MgYXMgYW4gaW5qZWN0YWJsZSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVnaXN0cnkuXG4gKiBXaGVuIGFwcGxpZWQgdG8gYSBjbGFzcywgcmVwbGFjZXMgaXRzIGNvbnN0cnVjdG9yIHdpdGggb25lIHRoYXQgcmV0dXJucyBhbiBpbnN0YW5jZS5cbiAqXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnkpOiBhbnl9IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyB0aGUgY2xhc3MgaW50byBhbiBpbmplY3RhYmxlLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RhYmxlKCk6IChvcmlnaW5hbDogYW55KSA9PiBhbnk7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIGNsYXNzIGFzIGF2YWlsYWJsZSBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgY2xhc3MgYXMgYW4gaW5qZWN0YWJsZSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVnaXN0cnkuXG4gKiBXaGVuIGFwcGxpZWQgdG8gYSBjbGFzcywgcmVwbGFjZXMgaXRzIGNvbnN0cnVjdG9yIHdpdGggb25lIHRoYXQgcmV0dXJucyBhbiBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZyB8IENvbnN0cnVjdG9yfSBjYXRlZ29yeSBEZWZhdWx0cyB0byB0aGUgY2xhc3MgY2F0ZWdvcnkuIFVzZWZ1bCB3aGVuIG1pbmlmaWNhdGlvbiBvY2N1cnMgYW5kIG5hbWVzIGFyZSBjaGFuZ2VkLFxuICogb3Igd2hlbiB5b3Ugd2FudCB0byB1cGNhc3QgdGhlIG9iamVjdCB0byBhIGRpZmZlcmVudCB0eXBlLlxuICpcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSBjbGFzcyBpbnRvIGFuIGluamVjdGFibGUuXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdGFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdGFibGUoXG4gIGNhdGVnb3J5OiBzdHJpbmcgfCBDb25zdHJ1Y3RvclxuKTogKG9yaWdpbmFsOiBhbnkpID0+IGFueTtcbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IG1hcmtzIGEgY2xhc3MgYXMgYXZhaWxhYmxlIGZvciBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBjbGFzcyBhcyBhbiBpbmplY3RhYmxlIHRoYXQgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSByZWdpc3RyeS5cbiAqIFdoZW4gYXBwbGllZCB0byBhIGNsYXNzLCByZXBsYWNlcyBpdHMgY29uc3RydWN0b3Igd2l0aCBvbmUgdGhhdCByZXR1cm5zIGFuIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSB7UGFydGlhbDxJbmplY3RhYmxlQ29uZmlnPn0gY2ZnPURlZmF1bHRJbmplY3RhYmxlQ29uZmlnIEFsbG93cyBvdmVycmlkaW5nIHRoZSBkZWZhdWx0IHNpbmdsZXRvbiBiZWhhdmlvciBhbmQgYWRkaW5nIGEgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55KTogYW55fSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgdGhlIGNsYXNzIGludG8gYW4gaW5qZWN0YWJsZS5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0YWJsZShcbiAgY2ZnOiBQYXJ0aWFsPEluamVjdGFibGVDb25maWc+XG4pOiAob3JpZ2luYWw6IGFueSkgPT4gYW55O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIGNsYXNzIGFzIGF2YWlsYWJsZSBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgY2xhc3MgYXMgYW4gaW5qZWN0YWJsZSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVnaXN0cnkuXG4gKiBXaGVuIGFwcGxpZWQgdG8gYSBjbGFzcywgcmVwbGFjZXMgaXRzIGNvbnN0cnVjdG9yIHdpdGggb25lIHRoYXQgcmV0dXJucyBhbiBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0gY2F0ZWdvcnkgRGVmYXVsdHMgdG8gdGhlIGNsYXNzIGNhdGVnb3J5LiBVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2NjdXJzIGFuZCBuYW1lcyBhcmUgY2hhbmdlZCxcbiAqIG9yIHdoZW4geW91IHdhbnQgdG8gdXBjYXN0IHRoZSBvYmplY3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAqIEBwYXJhbSB7UGFydGlhbDxJbmplY3RhYmxlQ29uZmlnPn0gY2ZnPURlZmF1bHRJbmplY3RhYmxlQ29uZmlnIEFsbG93cyBvdmVycmlkaW5nIHRoZSBkZWZhdWx0IHNpbmdsZXRvbiBiZWhhdmlvciBhbmQgYWRkaW5nIGEgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55KTogYW55fSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgdGhlIGNsYXNzIGludG8gYW4gaW5qZWN0YWJsZS5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0YWJsZShcbiAgY2F0ZWdvcnk6IHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICBjZmc6IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz5cbik6IChvcmlnaW5hbDogYW55KSA9PiBhbnk7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIGNsYXNzIGFzIGF2YWlsYWJsZSBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgY2xhc3MgYXMgYW4gaW5qZWN0YWJsZSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVnaXN0cnkuXG4gKiBXaGVuIGFwcGxpZWQgdG8gYSBjbGFzcywgcmVwbGFjZXMgaXRzIGNvbnN0cnVjdG9yIHdpdGggb25lIHRoYXQgcmV0dXJucyBhbiBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZyB8IENvbnN0cnVjdG9yfSBbY2F0ZWdvcnldIERlZmF1bHRzIHRvIHRoZSBjbGFzcyBjYXRlZ29yeS4gVXNlZnVsIHdoZW4gbWluaWZpY2F0aW9uIG9jY3VycyBhbmQgbmFtZXMgYXJlIGNoYW5nZWQsXG4gKiBvciB3aGVuIHlvdSB3YW50IHRvIHVwY2FzdCB0aGUgb2JqZWN0IHRvIGEgZGlmZmVyZW50IHR5cGUuXG4gKiBAcGFyYW0ge1BhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz59IFtjZmc9RGVmYXVsdEluamVjdGFibGVDb25maWddIEFsbG93cyBvdmVycmlkaW5nIHRoZSBkZWZhdWx0IHNpbmdsZXRvbiBiZWhhdmlvciBhbmQgYWRkaW5nIGEgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55KTogYW55fSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgdGhlIGNsYXNzIGludG8gYW4gaW5qZWN0YWJsZS5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0YWJsZVxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBEZWNvcmF0b3JcbiAqICAgcGFydGljaXBhbnQgSW5qZWN0YWJsZXNcbiAqXG4gKiAgIENsaWVudC0+PkRlY29yYXRvcjogQGluamVjdGFibGUoKVxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IENyZWF0ZSBuZXcgY29uc3RydWN0b3JcbiAqXG4gKiAgIE5vdGUgb3ZlciBEZWNvcmF0b3I6IFdoZW4gbmV3IGluc3RhbmNlIHJlcXVlc3RlZFxuICogICBEZWNvcmF0b3ItPj5JbmplY3RhYmxlczogZ2V0KGNhdGVnb3J5KVxuICogICBhbHQgSW5zdGFuY2UgZXhpc3RzXG4gKiAgICAgSW5qZWN0YWJsZXMtLT4+RGVjb3JhdG9yOiBSZXR1cm4gZXhpc3RpbmcgaW5zdGFuY2VcbiAqICAgZWxzZSBObyBpbnN0YW5jZVxuICogICAgIERlY29yYXRvci0+PkluamVjdGFibGVzOiByZWdpc3RlcihvcmlnaW5hbCwgY2F0ZWdvcnkpXG4gKiAgICAgRGVjb3JhdG9yLT4+SW5qZWN0YWJsZXM6IGdldChjYXRlZ29yeSlcbiAqICAgICBJbmplY3RhYmxlcy0tPj5EZWNvcmF0b3I6IFJldHVybiBuZXcgaW5zdGFuY2VcbiAqICAgICBvcHQgSGFzIGNhbGxiYWNrXG4gKiAgICAgICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IENhbGwgaW5zdGFuY2VDYWxsYmFja1xuICogICAgIGVuZFxuICogICBlbmRcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBEZWZpbmUgbWV0YWRhdGFcbiAqICAgRGVjb3JhdG9yLS0+PkNsaWVudDogUmV0dXJuIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RhYmxlKFxuICBjYXRlZ29yeT86IHN0cmluZyB8IENvbnN0cnVjdG9yIHwgUGFydGlhbDxJbmplY3RhYmxlQ29uZmlnPixcbiAgY2ZnPzogUGFydGlhbDxJbmplY3RhYmxlQ29uZmlnPlxuKSB7XG4gIGNmZyA9XG4gICAgY2ZnIHx8XG4gICAgKHR5cGVvZiBjYXRlZ29yeSA9PT0gXCJvYmplY3RcIlxuICAgICAgPyBPYmplY3QuYXNzaWduKGNhdGVnb3J5IGFzIFJlY29yZDxhbnksIGFueT4sIERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZylcbiAgICAgIDogRGVmYXVsdEluamVjdGFibGVzQ29uZmlnKTtcbiAgY2F0ZWdvcnkgPVxuICAgIHR5cGVvZiBjYXRlZ29yeSA9PT0gXCJvYmplY3RcIlxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogdHlwZW9mIGNhdGVnb3J5ID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gY2F0ZWdvcnlcbiAgICAgICAgOiB0eXBlb2YgY2F0ZWdvcnkgPT09IFwiZnVuY3Rpb25cIiAmJiBjYXRlZ29yeS5uYW1lXG4gICAgICAgICAgPyBjYXRlZ29yeVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gIHJldHVybiAob3JpZ2luYWw6IGFueSkgPT4ge1xuICAgIGNvbnN0IHN5bWJvbCA9IFN5bWJvbC5mb3IoY2F0ZWdvcnkgfHwgb3JpZ2luYWwudG9TdHJpbmcoKSk7XG4gICAgY2F0ZWdvcnkgPSBjYXRlZ29yeSB8fCBvcmlnaW5hbC5uYW1lO1xuXG4gICAgY29uc3QgbWV0YWRhdGE6IEluamVjdGFibGVNZXRhZGF0YSA9IHtcbiAgICAgIGNsYXNzOiBjYXRlZ29yeSBhcyBzdHJpbmcsXG4gICAgICBzeW1ib2w6IHN5bWJvbCxcbiAgICB9O1xuXG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgIGdldEluamVjdEtleShJbmplY3RhYmxlc0tleXMuSU5KRUNUQUJMRSksXG4gICAgICBtZXRhZGF0YSxcbiAgICAgIG9yaWdpbmFsXG4gICAgKTtcbiAgICAvLyB0aGUgbmV3IGNvbnN0cnVjdG9yIGJlaGF2aW91clxuICAgIGNvbnN0IG5ld0NvbnN0cnVjdG9yOiBhbnkgPSBmdW5jdGlvbiAoLi4uYXJnczogYW55W10pIHtcbiAgICAgIHJldHVybiBJbmplY3RhYmxlcy5nZXQ8YW55PihzeW1ib2wsIC4uLmFyZ3MpO1xuICAgIH07XG5cbiAgICAvLyBjb3B5IHByb3RvdHlwZSBzbyBpbnN0YW5jZW9mIG9wZXJhdG9yIHN0aWxsIHdvcmtzXG4gICAgbmV3Q29uc3RydWN0b3IucHJvdG90eXBlID0gb3JpZ2luYWwucHJvdG90eXBlO1xuICAgIC8vIG5ld0NvbnN0cnVjdG9yLl9fcHJvdG9fXyA9IG9yaWdpbmFsLl9fcHJvdG9fXztcbiAgICAvLyBTZXRzIHRoZSBwcm9wZXIgY29uc3RydWN0b3IgbmFtZSBmb3IgdHlwZSB2ZXJpZmljYXRpb25cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3Q29uc3RydWN0b3IsIFwibmFtZVwiLCB7XG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBvcmlnaW5hbC5wcm90b3R5cGUuY29uc3RydWN0b3IubmFtZSxcbiAgICB9KTtcblxuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICBnZXRJbmplY3RLZXkoSW5qZWN0YWJsZXNLZXlzLklOSkVDVEFCTEUpLFxuICAgICAgbWV0YWRhdGEsXG4gICAgICBuZXdDb25zdHJ1Y3RvclxuICAgICk7XG5cbiAgICBJbmplY3RhYmxlcy5yZWdpc3RlcihvcmlnaW5hbCwgc3ltYm9sLCBjZmcpO1xuICAgIC8vIHJldHVybiBuZXcgY29uc3RydWN0b3IgKHdpbGwgb3ZlcnJpZGUgb3JpZ2luYWwpXG4gICAgcmV0dXJuIG5ld0NvbnN0cnVjdG9yO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb252ZW5pZW5jZSBkZWNvcmF0b3IgdG8gcmVnaXN0ZXIgYW4gaW5qZWN0YWJsZSBhcyBhIHNpbmdsZXRvbi5cbiAqIEBzdW1tYXJ5IFdyYXBzIHtAbGluayBpbmplY3RhYmxlfSBmb3JjaW5nIHRoZSBzaW5nbGV0b24gbGlmZWN5Y2xlIHNvIG9ubHkgb25lIGluc3RhbmNlIGlzIGNyZWF0ZWQgYW5kIHJldXNlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfENvbnN0cnVjdG9yfSBbY2F0ZWdvcnldIE9wdGlvbmFsIGV4cGxpY2l0IGNhdGVnb3J5L3N5bWJvbCBzb3VyY2U7IGRlZmF1bHRzIHRvIHRoZSBjbGFzcy5cbiAqIEBwYXJhbSB7T21pdDxJbmplY3RhYmxlQ29uZmlnLCBcInNpbmdsZXRvblwiPn0gW2NmZ10gQWRkaXRpb25hbCBpbmplY3RhYmxlIGNvbmZpZ3VyYXRpb24gZXhjbHVkaW5nIHRoZSBzaW5nbGV0b24gZmxhZy5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBjbGFzcyBkZWNvcmF0b3IgdGhhdCByZWdpc3RlcnMgdGhlIHRhcmdldCBhcyBhIHNpbmdsZXRvbiBpbmplY3RhYmxlLlxuICogQGZ1bmN0aW9uIHNpbmdsZXRvblxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpbmdsZXRvbihcbiAgY2F0ZWdvcnk/OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgY2ZnPzogT21pdDxJbmplY3RhYmxlQ29uZmlnLCBcInNpbmdsZXRvblwiPlxuKSB7XG4gIHJldHVybiBpbmplY3RhYmxlKFxuICAgIGNhdGVnb3J5IGFzIGFueSxcbiAgICBPYmplY3QuYXNzaWduKHt9LCBjZmcgfHwge30sIHsgc2luZ2xldG9uOiB0cnVlIH0pXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlbmllbmNlIGRlY29yYXRvciB0byByZWdpc3RlciBhbiBpbmplY3RhYmxlIGFzIG9uLWRlbWFuZCAobm9uLXNpbmdsZXRvbikuXG4gKiBAc3VtbWFyeSBXcmFwcyB7QGxpbmsgaW5qZWN0YWJsZX0gZm9yY2luZyBuZXcgaW5zdGFuY2VzIHRvIGJlIGNyZWF0ZWQgb24gZXZlcnkgaW5qZWN0aW9uIG9yIHJldHJpZXZhbC5cbiAqIEBwYXJhbSB7c3RyaW5nfENvbnN0cnVjdG9yfSBbY2F0ZWdvcnldIE9wdGlvbmFsIGV4cGxpY2l0IGNhdGVnb3J5L3N5bWJvbCBzb3VyY2U7IGRlZmF1bHRzIHRvIHRoZSBjbGFzcy5cbiAqIEBwYXJhbSB7T21pdDxJbmplY3RhYmxlQ29uZmlnLCBcInNpbmdsZXRvblwiPn0gW2NmZ10gQWRkaXRpb25hbCBpbmplY3RhYmxlIGNvbmZpZ3VyYXRpb24gZXhjbHVkaW5nIHRoZSBzaW5nbGV0b24gZmxhZy5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBjbGFzcyBkZWNvcmF0b3IgdGhhdCByZWdpc3RlcnMgdGhlIHRhcmdldCBhcyBhIG5vbi1zaW5nbGV0b24gaW5qZWN0YWJsZS5cbiAqIEBmdW5jdGlvbiBvbkRlbWFuZFxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uRGVtYW5kKFxuICBjYXRlZ29yeT86IHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICBjZmc/OiBPbWl0PEluamVjdGFibGVDb25maWcsIFwic2luZ2xldG9uXCI+XG4pIHtcbiAgcmV0dXJuIGluamVjdGFibGUoXG4gICAgY2F0ZWdvcnkgYXMgYW55LFxuICAgIE9iamVjdC5hc3NpZ24oe30sIGNmZyB8fCB7fSwgeyBzaW5nbGV0b246IGZhbHNlIH0pXG4gICk7XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiB0eXBlIGZvciB0cmFuc2Zvcm1pbmcgaW5qZWN0YWJsZSBpbnN0YW5jZXMgYmVmb3JlIHRoZXkncmUgaW5qZWN0ZWQuXG4gKiBAc3VtbWFyeSBGdW5jdGlvbiB3aGljaCB0cmFuc2Zvcm1zIGEgY2FjaGVkIHtAbGluayBpbmplY3RhYmxlfSBpbnN0YW5jZSBiZWZvcmUgaXQncyBpbmplY3RlZCBpbnRvIGEgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge2FueX0gaW5qZWN0YWJsZSBUaGUgaW5qZWN0YWJsZSBpbnN0YW5jZSB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7YW55fSBvYmogVGhlIG9iamVjdCB0aGUgaW5qZWN0YWJsZSB3aWxsIGJlIGluamVjdGVkIG9uXG4gKiBAcmV0dXJuIHthbnl9IFRoZSB0cmFuc2Zvcm1lZCBpbmplY3RhYmxlIGluc3RhbmNlXG4gKlxuICogQHR5cGVkZWYge0Z1bmN0aW9ufSBJbnN0YW5jZVRyYW5zZm9ybWVyXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFuY2VUcmFuc2Zvcm1lciA9IChpbmplY3RhYmxlOiBhbnksIG9iajogYW55KSA9PiBhbnk7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE9wdGlvbnMgZm9yIHRoZSBwcm9wZXJ0eS1sZXZlbCBAaW5qZWN0IGRlY29yYXRvci5cbiAqIEBzdW1tYXJ5IEFsbG93cyBzcGVjaWZ5aW5nIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBhbmQgYW4gb3B0aW9uYWwgdHJhbnNmb3JtZXIgdG8gYmUgYXBwbGllZCB0byB0aGUgcmVzb2x2ZWQgaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge2FueVtdfSBbYXJnc10gT3B0aW9uYWwgY29uc3RydWN0b3IgYXJndW1lbnRzIHRvIHVzZSB3aGVuIGJ1aWxkaW5nIHRoZSBpbmplY3RhYmxlIGluc3RhbmNlLlxuICogQHByb3BlcnR5IHtJbnN0YW5jZVRyYW5zZm9ybWVyfSBbdHJhbnNmb3JtZXJdIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgaW5zdGFuY2UgYmVmb3JlIGFzc2lnbm1lbnQuXG4gKiBAdHlwZWRlZiBJbmplY3RPcHRpb25zXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBJbmplY3RPcHRpb25zID0ge1xuICBhcmdzPzogYW55W107XG4gIHRyYW5zZm9ybWVyPzogSW5zdGFuY2VUcmFuc2Zvcm1lcjtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByb3BlcnR5IGRlY29yYXRvciB0aGF0IGluamVjdHMgYSBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIEBzdW1tYXJ5IEFsbG93cyBmb3IgdGhlIGluamVjdGlvbiBvZiBhbiB7QGxpbmsgaW5qZWN0YWJsZX0gZGVjb3JhdGVkIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogVGhlIHByb3BlcnR5IG11c3QgYmUgdHlwZWQgZm9yIHRoZSByZXF1ZXN0ZWQgZGVwZW5kZW5jeS4gT25seSBjb25jcmV0ZSBjbGFzc2VzIGFyZSBzdXBwb3J0ZWQ7IGdlbmVyaWNzIGFyZSBub3QuXG4gKlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnkpOiB2b2lkfSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdCgpOiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBhbnkpID0+IHZvaWQ7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGEgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBAc3VtbWFyeSBBbGxvd3MgZm9yIHRoZSBpbmplY3Rpb24gb2YgYW4ge0BsaW5rIGluamVjdGFibGV9IGRlY29yYXRlZCBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIFRoZSBwcm9wZXJ0eSBtdXN0IGJlIHR5cGVkIGZvciB0aGUgcmVxdWVzdGVkIGRlcGVuZGVuY3kuIE9ubHkgY29uY3JldGUgY2xhc3NlcyBhcmUgc3VwcG9ydGVkOyBnZW5lcmljcyBhcmUgbm90LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjYXRlZ29yeSBEZWZhdWx0cyB0byB0aGUgY2xhc3MgbmFtZSBkZXJpdmVkIGZyb20gdGhlIHByb3BlcnR5IHR5cGUuIFVzZWZ1bCB3aGVuIG1pbmlmaWNhdGlvbiBvY2N1cnNcbiAqIGFuZCBuYW1lcyBhcmUgY2hhbmdlZCwgb3Igd2hlbiB5b3Ugd2FudCB0byB1cGNhc3QgdGhlIG9iamVjdCB0byBhIGRpZmZlcmVudCB0eXBlLlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnkpOiB2b2lkfSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdChcbiAgY2F0ZWdvcnk6IHN0cmluZyB8IENvbnN0cnVjdG9yXG4pOiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBhbnkpID0+IHZvaWQ7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGEgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBAc3VtbWFyeSBBbGxvd3MgZm9yIHRoZSBpbmplY3Rpb24gb2YgYW4ge0BsaW5rIGluamVjdGFibGV9IGRlY29yYXRlZCBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIFRoZSBwcm9wZXJ0eSBtdXN0IGJlIHR5cGVkIGZvciB0aGUgcmVxdWVzdGVkIGRlcGVuZGVuY3kuIE9ubHkgY29uY3JldGUgY2xhc3NlcyBhcmUgc3VwcG9ydGVkOyBnZW5lcmljcyBhcmUgbm90LlxuICpcbiAqIEBwYXJhbSB7UGFydGlhbDxJbmplY3RPcHRpb25zPn0gW2NmZz17fV0gT3B0aW9uYWwgZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHRoZSBpbmplY3RhYmxlIGluc3RhbmNlIGJlZm9yZSBpdCdzIGluamVjdGVkLCBvciBhcmd1bWVudHMgdG8gcGFzcyB0aGUgY29uc3RydWN0b3Igd2hlbiBpbmplY3Rpbmcgb25EZW1hbmRcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSwgYW55KTogdm9pZH0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3QoXG4gIGNmZzogUGFydGlhbDxJbmplY3RPcHRpb25zPlxuKTogKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogYW55KSA9PiB2b2lkO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogQHN1bW1hcnkgQWxsb3dzIGZvciB0aGUgaW5qZWN0aW9uIG9mIGFuIHtAbGluayBpbmplY3RhYmxlfSBkZWNvcmF0ZWQgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBUaGUgcHJvcGVydHkgbXVzdCBiZSB0eXBlZCBmb3IgdGhlIHJlcXVlc3RlZCBkZXBlbmRlbmN5LiBPbmx5IGNvbmNyZXRlIGNsYXNzZXMgYXJlIHN1cHBvcnRlZDsgZ2VuZXJpY3MgYXJlIG5vdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2F0ZWdvcnkgRGVmYXVsdHMgdG8gdGhlIGNsYXNzIG5hbWUgZGVyaXZlZCBmcm9tIHRoZSBwcm9wZXJ0eSB0eXBlLiBVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2NjdXJzXG4gKiBhbmQgbmFtZXMgYXJlIGNoYW5nZWQsIG9yIHdoZW4geW91IHdhbnQgdG8gdXBjYXN0IHRoZSBvYmplY3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAqIEBwYXJhbSB7UGFydGlhbDxJbmplY3RPcHRpb25zPn0gY2ZnPXt9IE9wdGlvbmFsIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgaW5qZWN0YWJsZSBpbnN0YW5jZSBiZWZvcmUgaXQncyBpbmplY3RlZCwgb3IgYXJndW1lbnRzIHRvIHBhc3MgdGhlIGNvbnN0cnVjdG9yIHdoZW4gaW5qZWN0aW5nIG9uRGVtYW5kXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueSk6IHZvaWR9IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0KFxuICBjYXRlZ29yeTogc3RyaW5nIHwgQ29uc3RydWN0b3IsXG4gIGNmZzogUGFydGlhbDxJbmplY3RPcHRpb25zPlxuKTogKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogYW55KSA9PiB2b2lkO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogQHN1bW1hcnkgQWxsb3dzIGZvciB0aGUgaW5qZWN0aW9uIG9mIGFuIHtAbGluayBpbmplY3RhYmxlfSBkZWNvcmF0ZWQgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBUaGUgcHJvcGVydHkgbXVzdCBiZSB0eXBlZCBmb3IgdGhlIHJlcXVlc3RlZCBkZXBlbmRlbmN5LiBPbmx5IGNvbmNyZXRlIGNsYXNzZXMgYXJlIHN1cHBvcnRlZDsgZ2VuZXJpY3MgYXJlIG5vdC5cbiAqXG4gKiBJbmplY3RlZCBwcm9wZXJ0aWVzIHNob3VsZCBiZSBkZXNjcmliZWQgbGlrZSBzbzpcbiAqIDxwcmU+XG4gKiAgICAgY2xhc3MgQ2xhc3NOYW1lIHtcbiAqICAgICAgICAgLi4uXG4gKlxuICogICAgICAgICBAaW5qZWN0KClcbiAqICAgICAgICAgcHJvcGVydHlOYW1lITogSW5qZWN0YWJsZUNsYXNzO1xuICpcbiAqICAgICAgICAgLi4uXG4gKiAgICAgfVxuICogPC9wcmU+XG4gKlxuICogd2hlcmUgSW5qZWN0YWJsZUNsYXNzIGlzIHRoZSBjbGFzcyB5b3Ugd2FudCB0byBpbmplY3QuXG4gKiBOb3RpY2UgdGhlIHVzZSBvZiAnITonIHRvIGVuc3VyZSB0aGUgdHJhbnNwaWxlciB0aGUgcHJvcGVydHkgd2lsbCBiZSBzZXQgb3V0c2lkZSB0aGUgY29uc3RydWN0b3IgYnV0IHdpbGwgYWx3YXlzIGJlIGRlZmluZWQuXG4gKiBGb3IgcHJvamVjdHMgd2hlcmUgbWluaWZpY2F0aW9uIG9jY3VycywgeW91IHNob3VsZCB1c2UgdGhlIGNhdGVnb3J5IHBhcmFtIHRvIGVuc3VyZSB0aGUgbmFtZSBpcyB0aGUgc2FtZSB0aHJvdWdob3V0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbY2F0ZWdvcnldIERlZmF1bHRzIHRvIHRoZSBjbGFzcyBuYW1lIGRlcml2ZWQgZnJvbSB0aGUgcHJvcGVydHkgdHlwZS4gVXNlZnVsIHdoZW4gbWluaWZpY2F0aW9uIG9jY3Vyc1xuICogYW5kIG5hbWVzIGFyZSBjaGFuZ2VkLCBvciB3aGVuIHlvdSB3YW50IHRvIHVwY2FzdCB0aGUgb2JqZWN0IHRvIGEgZGlmZmVyZW50IHR5cGUuXG4gKiBAcGFyYW0ge1BhcnRpYWw8SW5qZWN0T3B0aW9ucz59IFtjZmc9e31dIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgaW5qZWN0YWJsZSBpbnN0YW5jZSBiZWZvcmUgaXQncyBpbmplY3RlZCwgb3IgYXJndW1lbnRzIHRvIHBhc3MgdGhlIGNvbnN0cnVjdG9yIHdoZW4gaW5qZWN0aW5nIG9uRGVtYW5kXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueSk6IHZvaWR9IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBEZWNvcmF0b3JcbiAqICAgcGFydGljaXBhbnQgSW5qZWN0YWJsZXNcbiAqXG4gKiAgIENsaWVudC0+PkRlY29yYXRvcjogQGluamVjdCgpXG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogR2V0IHR5cGUgZnJvbSBwcm9wZXJ0eVxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IERlZmluZSBtZXRhZGF0YVxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IERlZmluZSBwcm9wZXJ0eSBnZXR0ZXJcbiAqXG4gKiAgIE5vdGUgb3ZlciBEZWNvcmF0b3I6IFdoZW4gcHJvcGVydHkgYWNjZXNzZWRcbiAqICAgQ2xpZW50LT4+RGVjb3JhdG9yOiBhY2Nlc3MgcHJvcGVydHlcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBDaGVjayBpZiBpbnN0YW5jZSBleGlzdHNcbiAqICAgYWx0IEluc3RhbmNlIGV4aXN0cyBpbiBXZWFrTWFwXG4gKiAgICAgRGVjb3JhdG9yLS0+PkNsaWVudDogUmV0dXJuIGNhY2hlZCBpbnN0YW5jZVxuICogICBlbHNlIE5vIGluc3RhbmNlXG4gKiAgICAgRGVjb3JhdG9yLT4+SW5qZWN0YWJsZXM6IGdldChuYW1lKVxuICogICAgIGFsdCBJbmplY3RhYmxlIGZvdW5kXG4gKiAgICAgICBJbmplY3RhYmxlcy0tPj5EZWNvcmF0b3I6IFJldHVybiBpbmplY3RhYmxlIGluc3RhbmNlXG4gKiAgICAgICBvcHQgSGFzIHRyYW5zZm9ybWVyXG4gKiAgICAgICAgIERlY29yYXRvci0+PkRlY29yYXRvcjogQ2FsbCB0cmFuc2Zvcm1lclxuICogICAgICAgZW5kXG4gKiAgICAgICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IFN0b3JlIGluIFdlYWtNYXBcbiAqICAgICAgIERlY29yYXRvci0tPj5DbGllbnQ6IFJldHVybiBpbnN0YW5jZVxuICogICAgIGVsc2UgTm8gaW5qZWN0YWJsZVxuICogICAgICAgRGVjb3JhdG9yLS0+PkNsaWVudDogVGhyb3cgZXJyb3JcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3QoXG4gIGNhdGVnb3J5Pzogc3ltYm9sIHwgc3RyaW5nIHwgQ29uc3RydWN0b3IgfCBQYXJ0aWFsPEluamVjdE9wdGlvbnM+LFxuICBjZmc/OiBQYXJ0aWFsPEluamVjdE9wdGlvbnM+XG4pIHtcbiAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IGFueSkgPT4ge1xuICAgIGNvbnN0IGNvbmZpZzogSW5qZWN0T3B0aW9ucyA9IChcbiAgICAgIGNmZyB8fCB0eXBlb2YgY2F0ZWdvcnkgPT09IFwib2JqZWN0XCIgPyBjYXRlZ29yeSA6IHt9XG4gICAgKSBhcyBJbmplY3RPcHRpb25zO1xuXG4gICAgY29uc3QgbmFtZTogc3ltYm9sIHwgc3RyaW5nIHwgQ29uc3RydWN0b3IgfCB1bmRlZmluZWQgPVxuICAgICAgKHR5cGVvZiBjYXRlZ29yeSAhPT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAoY2F0ZWdvcnkgYXMgc3ltYm9sIHwgc3RyaW5nIHwgQ29uc3RydWN0b3IpKSB8fFxuICAgICAgZ2V0VHlwZUZyb21EZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgVHlwZSBmcm9tIGRlY29yYXRvcmApO1xuICAgIH1cblxuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICBnZXRJbmplY3RLZXkoSW5qZWN0YWJsZXNLZXlzLklOSkVDVCksXG4gICAgICB7XG4gICAgICAgIGluamVjdGFibGU6IG5hbWUsXG4gICAgICB9LFxuICAgICAgdGFyZ2V0LFxuICAgICAgcHJvcGVydHlLZXlcbiAgICApO1xuXG4gICAgY29uc3QgdmFsdWVzID0gbmV3IFdlYWtNYXAoKTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQodGhpczogYW55KSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgIHByb3BlcnR5S2V5XG4gICAgICAgICkgYXMgUHJvcGVydHlEZXNjcmlwdG9yO1xuICAgICAgICBpZiAoZGVzY3JpcHRvci5jb25maWd1cmFibGUpIHtcbiAgICAgICAgICAvLyBsZXQgL29iajogYW55O1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eUtleSwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQodGhpczogYW55KSB7XG4gICAgICAgICAgICAgIGxldCBvYmogPSB2YWx1ZXMuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgICBpZiAob2JqKSByZXR1cm4gb2JqO1xuICAgICAgICAgICAgICBvYmogPSBJbmplY3RhYmxlcy5nZXQobmFtZSwgLi4uKGNvbmZpZy5hcmdzIHx8IFtdKSk7XG4gICAgICAgICAgICAgIGlmICghb2JqKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgIGBDb3VsZCBub3QgZ2V0IEluamVjdGFibGUgJHtuYW1lLnRvU3RyaW5nKCl9IHRvIGluamVjdCBpbiAke3RhcmdldC5jb25zdHJ1Y3RvciA/IHRhcmdldC5jb25zdHJ1Y3Rvci5uYW1lIDogdGFyZ2V0Lm5hbWV9J3MgJHtwcm9wZXJ0eUtleX1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKGNvbmZpZy50cmFuc2Zvcm1lcilcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgb2JqID0gY29uZmlnLnRyYW5zZm9ybWVyKG9iaiwgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFsdWVzLnNldCh0aGlzLCBvYmopO1xuXG4gICAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB0aGlzW3Byb3BlcnR5S2V5XTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgfTtcbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIEEgbGlnaHR3ZWlnaHQgZGVwZW5kZW5jeSBpbmplY3Rpb24gbGlicmFyeSBmb3IgVHlwZVNjcmlwdCBhcHBsaWNhdGlvbnMuXG4gKiBAc3VtbWFyeSBBZGRzIGEgc2ltcGxlIEluamVjdGFibGVzIGltcGxlbWVudGF0aW9uIHRvIGNyZWF0ZSBzaW5nbGV0b24gaW5zdGFuY2VzIG9mIGFuIG9iamVjdFxuICogYW5kIGVhc2lseSBpbmplY3QgaXQgaW50byBvdGhlciBvYmplY3RzLiBQcm92aWRlcyBkZWNvcmF0b3JzIGZvciBtYXJraW5nIGNsYXNzZXMgYXMgaW5qZWN0YWJsZVxuICogYW5kIGZvciBpbmplY3RpbmcgZGVwZW5kZW5jaWVzIGludG8gY2xhc3MgcHJvcGVydGllcy5cbiAqXG4gKiBAbW9kdWxlIGluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5cbmV4cG9ydCAqIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vSW5qZWN0YWJsZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3JlZ2lzdHJ5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3VycmVudCB2ZXJzaW9uIG9mIHRoZSBpbmplY3RhYmxlLWRlY29yYXRvcnMgbGlicmFyeS5cbiAqIEBzdW1tYXJ5IERlZmluZWQgb24gbGlicmFyeSBidWlsZC4gSG9sZHMgdGhlIGxpYnJhcnkncyBjdXJyZW50IHZlcnNpb24gc3RyaW5nLlxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUE7Ozs7Ozs7O0FBUUc7QUFDVSxNQUFBLGVBQWUsR0FBRztBQUM3QixJQUFBLE9BQU8sRUFBRSxZQUFZO0FBQ3JCLElBQUEsVUFBVSxFQUFFLFlBQVk7QUFDeEIsSUFBQSxNQUFNLEVBQUUsUUFBUTs7QUFHbEI7Ozs7O0FBS0c7QUFDVSxNQUFBLHdCQUF3QixHQUFxQjtBQUN4RCxJQUFBLFNBQVMsRUFBRSxJQUFJOztB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
@@ -45,6 +45,11 @@ const registry_1 = require("./registry.cjs");
45
45
  * Injectables-->>Client: MyService instance
46
46
  */
47
47
  class Injectables {
48
+ /**
49
+ * @description Holds the active registry implementation used by the Injectables facade.
50
+ * @summary Internal static reference that can be swapped via setRegistry to customize how injectables are stored and retrieved.
51
+ * @type {InjectablesRegistry | undefined}
52
+ */
48
53
  static { this.actingInjectablesRegistry = undefined; }
49
54
  constructor() { }
50
55
  /**
@@ -124,4 +129,4 @@ class Injectables {
124
129
  }
125
130
  }
126
131
  exports.Injectables = Injectables;
127
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5qZWN0YWJsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvSW5qZWN0YWJsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBSW9CO0FBR3BCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlDRztBQUNILE1BQWEsV0FBVzthQUNQLDhCQUF5QixHQUF5QixTQUFTLENBQUM7SUFFM0UsZ0JBQXVCLENBQUM7SUFFeEI7Ozs7Ozs7O09BUUc7SUFDSCxNQUFNLENBQUMsR0FBRyxDQUNSLElBQW1ELEVBQ25ELEdBQUcsSUFBVztRQUVkLE9BQU8sV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyxRQUFRLENBQUksV0FBMEIsRUFBRSxHQUFHLElBQVc7UUFDM0QsT0FBTyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUN2QyxXQUFXLEVBQ1gsR0FBSSxJQUF1QyxDQUM1QyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxNQUFNLENBQUMsS0FBSyxDQUFJLElBQVksRUFBRSxHQUFHLElBQVc7UUFDMUMsT0FBTyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxXQUFXLENBQUMsa0JBQXVDO1FBQ3hELFdBQVcsQ0FBQyx5QkFBeUIsR0FBRyxrQkFBa0IsQ0FBQztJQUM3RCxDQUFDO0lBQ0Q7Ozs7T0FJRztJQUNLLE1BQU0sQ0FBQyxXQUFXO1FBQ3hCLElBQUksQ0FBQyxXQUFXLENBQUMseUJBQXlCO1lBQ3hDLFdBQVcsQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLGdDQUFxQixFQUFFLENBQUM7UUFDdEUsT0FBTyxXQUFXLENBQUMseUJBQXlCLENBQUM7SUFDL0MsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsS0FBSztRQUNWLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxnQ0FBcUIsRUFBRSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFzQjtRQUMxQyxNQUFNLE1BQU0sR0FBRyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDcEUsV0FBVyxDQUFDLHlCQUFpQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQ3JFLFdBQVcsQ0FBQyx5QkFBaUMsQ0FBQyxPQUFPLENBQUMsQ0FDeEQsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUEwQixFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUU7WUFDbEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO2dCQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDekMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDVCxDQUFDOztBQTNGSCxrQ0E0RkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBJbmplY3RhYmxlUmVnaXN0cnlJbXAsXG4gIEluamVjdGFibGVzUmVnaXN0cnksXG59IGZyb20gXCIuL3JlZ2lzdHJ5XCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlT3B0aW9ucyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENlbnRyYWwgcmVnaXN0cnkgZm9yIG1hbmFnaW5nIGluamVjdGFibGUgZGVwZW5kZW5jaWVzLlxuICogQHN1bW1hcnkgU3RhdGljIGNsYXNzIGhvbGRpbmcgdGhlIGFjY2VzcyB0byB0aGUgaW5qZWN0YWJsZXMgZnVuY3Rpb25zLiBQcm92aWRlcyBtZXRob2RzIGZvciByZWdpc3RlcmluZyxcbiAqIHJldHJpZXZpbmcsIGFuZCBidWlsZGluZyBpbmplY3RhYmxlIG9iamVjdHMuXG4gKiBAdGVtcGxhdGUgVCBUeXBlIG9mIHRoZSBpbmplY3RhYmxlIG9iamVjdFxuICpcbiAqIEBjbGFzcyBJbmplY3RhYmxlc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBEZWZpbmUgYW4gaW5qZWN0YWJsZSBjbGFzc1xuICogQGluamVjdGFibGUoKVxuICogY2xhc3MgTXlTZXJ2aWNlIHtcbiAqICAgZG9Tb21ldGhpbmcoKSB7XG4gKiAgICAgcmV0dXJuICdIZWxsbyBXb3JsZCc7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiAvLyBJbmplY3QgdGhlIHNlcnZpY2UgaW50byBhbm90aGVyIGNsYXNzXG4gKiBjbGFzcyBNeUNvbXBvbmVudCB7XG4gKiAgIEBpbmplY3QoKVxuICogICBwcml2YXRlIHNlcnZpY2UhOiBNeVNlcnZpY2U7XG4gKlxuICogICB1c2VTZXJ2aWNlKCkge1xuICogICAgIHJldHVybiB0aGlzLnNlcnZpY2UuZG9Tb21ldGhpbmcoKTtcbiAqICAgfVxuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IEluamVjdGFibGVzXG4gKiAgIHBhcnRpY2lwYW50IFJlZ2lzdHJ5XG4gKlxuICogICBDbGllbnQtPj5JbmplY3RhYmxlczogcmVnaXN0ZXIoTXlTZXJ2aWNlKVxuICogICBJbmplY3RhYmxlcy0+PlJlZ2lzdHJ5OiByZWdpc3RlcihNeVNlcnZpY2UpXG4gKiAgIFJlZ2lzdHJ5LS0+PkluamVjdGFibGVzOiB2b2lkXG4gKlxuICogICBDbGllbnQtPj5JbmplY3RhYmxlczogZ2V0KFwiTXlTZXJ2aWNlXCIpXG4gKiAgIEluamVjdGFibGVzLT4+UmVnaXN0cnk6IGdldChcIk15U2VydmljZVwiKVxuICogICBSZWdpc3RyeS0tPj5JbmplY3RhYmxlczogTXlTZXJ2aWNlIGluc3RhbmNlXG4gKiAgIEluamVjdGFibGVzLS0+PkNsaWVudDogTXlTZXJ2aWNlIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBjbGFzcyBJbmplY3RhYmxlcyB7XG4gIHByaXZhdGUgc3RhdGljIGFjdGluZ0luamVjdGFibGVzUmVnaXN0cnk/OiBJbmplY3RhYmxlc1JlZ2lzdHJ5ID0gdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRmV0Y2hlcyBhbiBpbmplY3RhYmxlIGluc3RhbmNlIGJ5IGl0cyByZWdpc3RlcmVkIG5hbWUuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgbmFtZWQge0BsaW5rIEluamVjdGFibGV9IGZyb20gdGhlIHJlZ2lzdHJ5LiBJZiB0aGUgaW5qZWN0YWJsZSBpcyBhIHNpbmdsZXRvbixcbiAgICogcmV0dXJucyB0aGUgZXhpc3RpbmcgaW5zdGFuY2UuIE90aGVyd2lzZSwgY3JlYXRlcyBhIG5ldyBpbnN0YW5jZS5cbiAgICogQHRlbXBsYXRlIFQgVHlwZSBvZiB0aGUgaW5qZWN0YWJsZSBvYmplY3QgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIHJlZ2lzdGVyZWQgbmFtZSBvZiB0aGUgaW5qZWN0YWJsZSB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIENvbnN0cnVjdG9yIGFyZ3VtZW50cyB0byBwYXNzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgaW5qZWN0YWJsZVxuICAgKiBAcmV0dXJuIHtJbmplY3RhYmxlPFQ+IHwgdW5kZWZpbmVkfSBUaGUgaW5qZWN0YWJsZSBpbnN0YW5jZSBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kXG4gICAqL1xuICBzdGF0aWMgZ2V0PFQ+KFxuICAgIG5hbWU6IHN5bWJvbCB8IHN0cmluZyB8IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IFQgfSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gSW5qZWN0YWJsZXMuZ2V0UmVnaXN0cnkoKS5nZXQobmFtZSwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFkZHMgYSBjbGFzcyBvciBvYmplY3QgdG8gdGhlIGluamVjdGFibGUgcmVnaXN0cnkuXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhbiBpbmplY3RhYmxlIGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlIHdpdGggdGhlIHJlZ2lzdHJ5LCBtYWtpbmcgaXQgYXZhaWxhYmxlIGZvciBpbmplY3Rpb24uXG4gICAqIEB0ZW1wbGF0ZSBUIFR5cGUgb2YgdGhlIGluamVjdGFibGUgb2JqZWN0IHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7SW5qZWN0YWJsZTxUPn0gY29uc3RydWN0b3IgVGhlIGNsYXNzIGNvbnN0cnVjdG9yIG9yIG9iamVjdCBpbnN0YW5jZSB0byByZWdpc3RlclxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciByZWdpc3RyYXRpb24gKGNhdGVnb3J5LCBzaW5nbGV0b24gZmxhZywgZXRjLilcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyByZWdpc3RlcjxUPihjb25zdHJ1Y3RvcjogSW5qZWN0YWJsZTxUPiwgLi4uYXJnczogYW55W10pOiB2b2lkIHtcbiAgICByZXR1cm4gSW5qZWN0YWJsZXMuZ2V0UmVnaXN0cnkoKS5yZWdpc3RlcihcbiAgICAgIGNvbnN0cnVjdG9yLFxuICAgICAgLi4uKGFyZ3MgYXMgW3N5bWJvbCwgSW5qZWN0YWJsZU9wdGlvbnM8VD5dKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgYW4gaW5qZWN0YWJsZSBjbGFzcy5cbiAgICogQHN1bW1hcnkgSW5zdGFudGlhdGVzIGFuIGluamVjdGFibGUgY2xhc3MgdXNpbmcgaXRzIGNvbnN0cnVjdG9yIGFuZCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgKiBAdGVtcGxhdGUgVCBUeXBlIG9mIHRoZSBvYmplY3QgdG8gYnVpbGRcbiAgICogQHBhcmFtIHtzeW1ib2x9IG5hbWUgc3ltYm9sIHJlZmVyZW5jaW5nIHRoZSBpbmplY3RhYmxlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgQ29uc3RydWN0b3IgYXJndW1lbnRzIHRvIHBhc3Mgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBpbmplY3RhYmxlXG4gICAqIEByZXR1cm4ge1R9IFRoZSBuZXdseSBjcmVhdGVkIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgYnVpbGQ8VD4obmFtZTogc3ltYm9sLCAuLi5hcmdzOiBhbnlbXSk6IFQge1xuICAgIHJldHVybiBJbmplY3RhYmxlcy5nZXRSZWdpc3RyeSgpLmJ1aWxkKG5hbWUsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXBsYWNlcyB0aGUgY3VycmVudCByZWdpc3RyeSBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHN1bW1hcnkgU2V0cyBhIG5ldyB7QGxpbmsgSW5qZWN0YWJsZXNSZWdpc3RyeX0gaW1wbGVtZW50YXRpb24sIGFsbG93aW5nIGZvciBjdXN0b20gcmVnaXN0cnkgYmVoYXZpb3IuXG4gICAqIEBwYXJhbSB7SW5qZWN0YWJsZXNSZWdpc3RyeX0gb3BlcmF0aW9uc1JlZ2lzdHJ5IFRoZSBuZXcgaW1wbGVtZW50YXRpb24gb2YgUmVnaXN0cnkgdG8gdXNlXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgc2V0UmVnaXN0cnkob3BlcmF0aW9uc1JlZ2lzdHJ5OiBJbmplY3RhYmxlc1JlZ2lzdHJ5KTogdm9pZCB7XG4gICAgSW5qZWN0YWJsZXMuYWN0aW5nSW5qZWN0YWJsZXNSZWdpc3RyeSA9IG9wZXJhdGlvbnNSZWdpc3RyeTtcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgY3VycmVudCByZWdpc3RyeSBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgY3VycmVudCB7QGxpbmsgSW5qZWN0YWJsZXNSZWdpc3RyeX0gb3IgY3JlYXRlcyBhIGRlZmF1bHQgb25lIGlmIG5vbmUgZXhpc3RzLlxuICAgKiBAcmV0dXJuIHtJbmplY3RhYmxlc1JlZ2lzdHJ5fSBUaGUgY3VycmVudCByZWdpc3RyeSBpbnN0YW5jZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UmVnaXN0cnkoKTogSW5qZWN0YWJsZXNSZWdpc3RyeSB7XG4gICAgaWYgKCFJbmplY3RhYmxlcy5hY3RpbmdJbmplY3RhYmxlc1JlZ2lzdHJ5KVxuICAgICAgSW5qZWN0YWJsZXMuYWN0aW5nSW5qZWN0YWJsZXNSZWdpc3RyeSA9IG5ldyBJbmplY3RhYmxlUmVnaXN0cnlJbXAoKTtcbiAgICByZXR1cm4gSW5qZWN0YWJsZXMuYWN0aW5nSW5qZWN0YWJsZXNSZWdpc3RyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2xlYXJzIGFsbCByZWdpc3RlcmVkIGluamVjdGFibGVzLlxuICAgKiBAc3VtbWFyeSBSZXNldHMgdGhlIHJlZ2lzdHJ5IHRvIGEgY2xlYW4gc3RhdGUgYnkgY3JlYXRpbmcgYSBuZXcgZW1wdHkgcmVnaXN0cnkgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgcmVzZXQoKTogdm9pZCB7XG4gICAgSW5qZWN0YWJsZXMuc2V0UmVnaXN0cnkobmV3IEluamVjdGFibGVSZWdpc3RyeUltcCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVtb3ZlcyBzcGVjaWZpYyBpbmplY3RhYmxlcyBmcm9tIHRoZSByZWdpc3RyeSBiYXNlZCBvbiBhIHBhdHRlcm4uXG4gICAqIEBzdW1tYXJ5IFNlbGVjdGl2ZWx5IHJlc2V0cyB0aGUgcmVnaXN0cnkgYnkgcmVtb3Zpbmcgb25seSB0aGUgaW5qZWN0YWJsZXMgd2hvc2UgbmFtZXMgbWF0Y2ggdGhlIHByb3ZpZGVkIHBhdHRlcm4uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgUmVnRXhwfSBtYXRjaCBBIHN0cmluZyBvciByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiB0byBtYXRjaCBhZ2FpbnN0IGluamVjdGFibGUgbmFtZXNcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBzZWxlY3RpdmVSZXNldChtYXRjaDogc3RyaW5nIHwgUmVnRXhwKTogdm9pZCB7XG4gICAgY29uc3QgcmVnZXhwID0gdHlwZW9mIG1hdGNoID09PSBcInN0cmluZ1wiID8gbmV3IFJlZ0V4cChtYXRjaCkgOiBtYXRjaDtcbiAgICAoSW5qZWN0YWJsZXMuYWN0aW5nSW5qZWN0YWJsZXNSZWdpc3RyeSBhcyBhbnkpW1wiY2FjaGVcIl0gPSBPYmplY3QuZW50cmllcyhcbiAgICAgIChJbmplY3RhYmxlcy5hY3RpbmdJbmplY3RhYmxlc1JlZ2lzdHJ5IGFzIGFueSlbXCJjYWNoZVwiXVxuICAgICkucmVkdWNlKChhY2N1bTogUmVjb3JkPHN0cmluZywgYW55PiwgW2tleSwgdmFsXSkgPT4ge1xuICAgICAgaWYgKCFrZXkubWF0Y2gocmVnZXhwKSkgYWNjdW1ba2V5XSA9IHZhbDtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCB7fSk7XG4gIH1cbn1cbiJdfQ==
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5qZWN0YWJsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvSW5qZWN0YWJsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBSW9CO0FBR3BCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlDRztBQUNILE1BQWEsV0FBVztJQUN0Qjs7OztPQUlHO2FBQ1ksOEJBQXlCLEdBQXlCLFNBQVMsQ0FBQztJQUUzRSxnQkFBdUIsQ0FBQztJQUV4Qjs7Ozs7Ozs7T0FRRztJQUNILE1BQU0sQ0FBQyxHQUFHLENBQ1IsSUFBbUQsRUFDbkQsR0FBRyxJQUFXO1FBRWQsT0FBTyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsTUFBTSxDQUFDLFFBQVEsQ0FBSSxXQUEwQixFQUFFLEdBQUcsSUFBVztRQUMzRCxPQUFPLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQ3ZDLFdBQVcsRUFDWCxHQUFJLElBQXVDLENBQzVDLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILE1BQU0sQ0FBQyxLQUFLLENBQUksSUFBWSxFQUFFLEdBQUcsSUFBVztRQUMxQyxPQUFPLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsTUFBTSxDQUFDLFdBQVcsQ0FBQyxrQkFBdUM7UUFDeEQsV0FBVyxDQUFDLHlCQUF5QixHQUFHLGtCQUFrQixDQUFDO0lBQzdELENBQUM7SUFDRDs7OztPQUlHO0lBQ0ssTUFBTSxDQUFDLFdBQVc7UUFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyx5QkFBeUI7WUFDeEMsV0FBVyxDQUFDLHlCQUF5QixHQUFHLElBQUksZ0NBQXFCLEVBQUUsQ0FBQztRQUN0RSxPQUFPLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQztJQUMvQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxLQUFLO1FBQ1YsV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLGdDQUFxQixFQUFFLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQXNCO1FBQzFDLE1BQU0sTUFBTSxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNwRSxXQUFXLENBQUMseUJBQWlDLENBQUMsT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FDckUsV0FBVyxDQUFDLHlCQUFpQyxDQUFDLE9BQU8sQ0FBQyxDQUN4RCxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQTBCLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRTtZQUNsRCxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7Z0JBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUN6QyxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNULENBQUM7O0FBaEdILGtDQWlHQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEluamVjdGFibGUsXG4gIEluamVjdGFibGVSZWdpc3RyeUltcCxcbiAgSW5qZWN0YWJsZXNSZWdpc3RyeSxcbn0gZnJvbSBcIi4vcmVnaXN0cnlcIjtcbmltcG9ydCB7IEluamVjdGFibGVPcHRpb25zIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ2VudHJhbCByZWdpc3RyeSBmb3IgbWFuYWdpbmcgaW5qZWN0YWJsZSBkZXBlbmRlbmNpZXMuXG4gKiBAc3VtbWFyeSBTdGF0aWMgY2xhc3MgaG9sZGluZyB0aGUgYWNjZXNzIHRvIHRoZSBpbmplY3RhYmxlcyBmdW5jdGlvbnMuIFByb3ZpZGVzIG1ldGhvZHMgZm9yIHJlZ2lzdGVyaW5nLFxuICogcmV0cmlldmluZywgYW5kIGJ1aWxkaW5nIGluamVjdGFibGUgb2JqZWN0cy5cbiAqIEB0ZW1wbGF0ZSBUIFR5cGUgb2YgdGhlIGluamVjdGFibGUgb2JqZWN0XG4gKlxuICogQGNsYXNzIEluamVjdGFibGVzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIERlZmluZSBhbiBpbmplY3RhYmxlIGNsYXNzXG4gKiBAaW5qZWN0YWJsZSgpXG4gKiBjbGFzcyBNeVNlcnZpY2Uge1xuICogICBkb1NvbWV0aGluZygpIHtcbiAqICAgICByZXR1cm4gJ0hlbGxvIFdvcmxkJztcbiAqICAgfVxuICogfVxuICpcbiAqIC8vIEluamVjdCB0aGUgc2VydmljZSBpbnRvIGFub3RoZXIgY2xhc3NcbiAqIGNsYXNzIE15Q29tcG9uZW50IHtcbiAqICAgQGluamVjdCgpXG4gKiAgIHByaXZhdGUgc2VydmljZSE6IE15U2VydmljZTtcbiAqXG4gKiAgIHVzZVNlcnZpY2UoKSB7XG4gKiAgICAgcmV0dXJuIHRoaXMuc2VydmljZS5kb1NvbWV0aGluZygpO1xuICogICB9XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgSW5qZWN0YWJsZXNcbiAqICAgcGFydGljaXBhbnQgUmVnaXN0cnlcbiAqXG4gKiAgIENsaWVudC0+PkluamVjdGFibGVzOiByZWdpc3RlcihNeVNlcnZpY2UpXG4gKiAgIEluamVjdGFibGVzLT4+UmVnaXN0cnk6IHJlZ2lzdGVyKE15U2VydmljZSlcbiAqICAgUmVnaXN0cnktLT4+SW5qZWN0YWJsZXM6IHZvaWRcbiAqXG4gKiAgIENsaWVudC0+PkluamVjdGFibGVzOiBnZXQoXCJNeVNlcnZpY2VcIilcbiAqICAgSW5qZWN0YWJsZXMtPj5SZWdpc3RyeTogZ2V0KFwiTXlTZXJ2aWNlXCIpXG4gKiAgIFJlZ2lzdHJ5LS0+PkluamVjdGFibGVzOiBNeVNlcnZpY2UgaW5zdGFuY2VcbiAqICAgSW5qZWN0YWJsZXMtLT4+Q2xpZW50OiBNeVNlcnZpY2UgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGNsYXNzIEluamVjdGFibGVzIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIb2xkcyB0aGUgYWN0aXZlIHJlZ2lzdHJ5IGltcGxlbWVudGF0aW9uIHVzZWQgYnkgdGhlIEluamVjdGFibGVzIGZhY2FkZS5cbiAgICogQHN1bW1hcnkgSW50ZXJuYWwgc3RhdGljIHJlZmVyZW5jZSB0aGF0IGNhbiBiZSBzd2FwcGVkIHZpYSBzZXRSZWdpc3RyeSB0byBjdXN0b21pemUgaG93IGluamVjdGFibGVzIGFyZSBzdG9yZWQgYW5kIHJldHJpZXZlZC5cbiAgICogQHR5cGUge0luamVjdGFibGVzUmVnaXN0cnkgfCB1bmRlZmluZWR9XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBhY3RpbmdJbmplY3RhYmxlc1JlZ2lzdHJ5PzogSW5qZWN0YWJsZXNSZWdpc3RyeSA9IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZldGNoZXMgYW4gaW5qZWN0YWJsZSBpbnN0YW5jZSBieSBpdHMgcmVnaXN0ZXJlZCBuYW1lLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIG5hbWVkIHtAbGluayBJbmplY3RhYmxlfSBmcm9tIHRoZSByZWdpc3RyeS4gSWYgdGhlIGluamVjdGFibGUgaXMgYSBzaW5nbGV0b24sXG4gICAqIHJldHVybnMgdGhlIGV4aXN0aW5nIGluc3RhbmNlLiBPdGhlcndpc2UsIGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuXG4gICAqIEB0ZW1wbGF0ZSBUIFR5cGUgb2YgdGhlIGluamVjdGFibGUgb2JqZWN0IHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSByZWdpc3RlcmVkIG5hbWUgb2YgdGhlIGluamVjdGFibGUgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyBDb25zdHJ1Y3RvciBhcmd1bWVudHMgdG8gcGFzcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIGluamVjdGFibGVcbiAgICogQHJldHVybiB7SW5qZWN0YWJsZTxUPiB8IHVuZGVmaW5lZH0gVGhlIGluamVjdGFibGUgaW5zdGFuY2Ugb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgc3RhdGljIGdldDxUPihcbiAgICBuYW1lOiBzeW1ib2wgfCBzdHJpbmcgfCB7IG5ldyAoLi4uYXJnczogYW55W10pOiBUIH0sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIEluamVjdGFibGVzLmdldFJlZ2lzdHJ5KCkuZ2V0KG5hbWUsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBZGRzIGEgY2xhc3Mgb3Igb2JqZWN0IHRvIHRoZSBpbmplY3RhYmxlIHJlZ2lzdHJ5LlxuICAgKiBAc3VtbWFyeSBSZWdpc3RlcnMgYW4gaW5qZWN0YWJsZSBjb25zdHJ1Y3RvciBvciBpbnN0YW5jZSB3aXRoIHRoZSByZWdpc3RyeSwgbWFraW5nIGl0IGF2YWlsYWJsZSBmb3IgaW5qZWN0aW9uLlxuICAgKiBAdGVtcGxhdGUgVCBUeXBlIG9mIHRoZSBpbmplY3RhYmxlIG9iamVjdCB0byByZWdpc3RlclxuICAgKiBAcGFyYW0ge0luamVjdGFibGU8VD59IGNvbnN0cnVjdG9yIFRoZSBjbGFzcyBjb25zdHJ1Y3RvciBvciBvYmplY3QgaW5zdGFuY2UgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgcmVnaXN0cmF0aW9uIChjYXRlZ29yeSwgc2luZ2xldG9uIGZsYWcsIGV0Yy4pXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXI8VD4oY29uc3RydWN0b3I6IEluamVjdGFibGU8VD4sIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgcmV0dXJuIEluamVjdGFibGVzLmdldFJlZ2lzdHJ5KCkucmVnaXN0ZXIoXG4gICAgICBjb25zdHJ1Y3RvcixcbiAgICAgIC4uLihhcmdzIGFzIFtzeW1ib2wsIEluamVjdGFibGVPcHRpb25zPFQ+XSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIGFuIGluamVjdGFibGUgY2xhc3MuXG4gICAqIEBzdW1tYXJ5IEluc3RhbnRpYXRlcyBhbiBpbmplY3RhYmxlIGNsYXNzIHVzaW5nIGl0cyBjb25zdHJ1Y3RvciBhbmQgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICogQHRlbXBsYXRlIFQgVHlwZSBvZiB0aGUgb2JqZWN0IHRvIGJ1aWxkXG4gICAqIEBwYXJhbSB7c3ltYm9sfSBuYW1lIHN5bWJvbCByZWZlcmVuY2luZyB0aGUgaW5qZWN0YWJsZVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIENvbnN0cnVjdG9yIGFyZ3VtZW50cyB0byBwYXNzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgaW5qZWN0YWJsZVxuICAgKiBAcmV0dXJuIHtUfSBUaGUgbmV3bHkgY3JlYXRlZCBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGJ1aWxkPFQ+KG5hbWU6IHN5bWJvbCwgLi4uYXJnczogYW55W10pOiBUIHtcbiAgICByZXR1cm4gSW5qZWN0YWJsZXMuZ2V0UmVnaXN0cnkoKS5idWlsZChuYW1lLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVwbGFjZXMgdGhlIGN1cnJlbnQgcmVnaXN0cnkgaW1wbGVtZW50YXRpb24uXG4gICAqIEBzdW1tYXJ5IFNldHMgYSBuZXcge0BsaW5rIEluamVjdGFibGVzUmVnaXN0cnl9IGltcGxlbWVudGF0aW9uLCBhbGxvd2luZyBmb3IgY3VzdG9tIHJlZ2lzdHJ5IGJlaGF2aW9yLlxuICAgKiBAcGFyYW0ge0luamVjdGFibGVzUmVnaXN0cnl9IG9wZXJhdGlvbnNSZWdpc3RyeSBUaGUgbmV3IGltcGxlbWVudGF0aW9uIG9mIFJlZ2lzdHJ5IHRvIHVzZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHNldFJlZ2lzdHJ5KG9wZXJhdGlvbnNSZWdpc3RyeTogSW5qZWN0YWJsZXNSZWdpc3RyeSk6IHZvaWQge1xuICAgIEluamVjdGFibGVzLmFjdGluZ0luamVjdGFibGVzUmVnaXN0cnkgPSBvcGVyYXRpb25zUmVnaXN0cnk7XG4gIH1cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGN1cnJlbnQgcmVnaXN0cnkgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIGN1cnJlbnQge0BsaW5rIEluamVjdGFibGVzUmVnaXN0cnl9IG9yIGNyZWF0ZXMgYSBkZWZhdWx0IG9uZSBpZiBub25lIGV4aXN0cy5cbiAgICogQHJldHVybiB7SW5qZWN0YWJsZXNSZWdpc3RyeX0gVGhlIGN1cnJlbnQgcmVnaXN0cnkgaW5zdGFuY2VcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldFJlZ2lzdHJ5KCk6IEluamVjdGFibGVzUmVnaXN0cnkge1xuICAgIGlmICghSW5qZWN0YWJsZXMuYWN0aW5nSW5qZWN0YWJsZXNSZWdpc3RyeSlcbiAgICAgIEluamVjdGFibGVzLmFjdGluZ0luamVjdGFibGVzUmVnaXN0cnkgPSBuZXcgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wKCk7XG4gICAgcmV0dXJuIEluamVjdGFibGVzLmFjdGluZ0luamVjdGFibGVzUmVnaXN0cnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENsZWFycyBhbGwgcmVnaXN0ZXJlZCBpbmplY3RhYmxlcy5cbiAgICogQHN1bW1hcnkgUmVzZXRzIHRoZSByZWdpc3RyeSB0byBhIGNsZWFuIHN0YXRlIGJ5IGNyZWF0aW5nIGEgbmV3IGVtcHR5IHJlZ2lzdHJ5IGluc3RhbmNlLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHJlc2V0KCk6IHZvaWQge1xuICAgIEluamVjdGFibGVzLnNldFJlZ2lzdHJ5KG5ldyBJbmplY3RhYmxlUmVnaXN0cnlJbXAoKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlbW92ZXMgc3BlY2lmaWMgaW5qZWN0YWJsZXMgZnJvbSB0aGUgcmVnaXN0cnkgYmFzZWQgb24gYSBwYXR0ZXJuLlxuICAgKiBAc3VtbWFyeSBTZWxlY3RpdmVseSByZXNldHMgdGhlIHJlZ2lzdHJ5IGJ5IHJlbW92aW5nIG9ubHkgdGhlIGluamVjdGFibGVzIHdob3NlIG5hbWVzIG1hdGNoIHRoZSBwcm92aWRlZCBwYXR0ZXJuLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IFJlZ0V4cH0gbWF0Y2ggQSBzdHJpbmcgb3IgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gdG8gbWF0Y2ggYWdhaW5zdCBpbmplY3RhYmxlIG5hbWVzXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgc2VsZWN0aXZlUmVzZXQobWF0Y2g6IHN0cmluZyB8IFJlZ0V4cCk6IHZvaWQge1xuICAgIGNvbnN0IHJlZ2V4cCA9IHR5cGVvZiBtYXRjaCA9PT0gXCJzdHJpbmdcIiA/IG5ldyBSZWdFeHAobWF0Y2gpIDogbWF0Y2g7XG4gICAgKEluamVjdGFibGVzLmFjdGluZ0luamVjdGFibGVzUmVnaXN0cnkgYXMgYW55KVtcImNhY2hlXCJdID0gT2JqZWN0LmVudHJpZXMoXG4gICAgICAoSW5qZWN0YWJsZXMuYWN0aW5nSW5qZWN0YWJsZXNSZWdpc3RyeSBhcyBhbnkpW1wiY2FjaGVcIl1cbiAgICApLnJlZHVjZSgoYWNjdW06IFJlY29yZDxzdHJpbmcsIGFueT4sIFtrZXksIHZhbF0pID0+IHtcbiAgICAgIGlmICgha2V5Lm1hdGNoKHJlZ2V4cCkpIGFjY3VtW2tleV0gPSB2YWw7XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwge30pO1xuICB9XG59XG4iXX0=
@@ -42,6 +42,11 @@ import { Injectable, InjectablesRegistry } from "./registry";
42
42
  * Injectables-->>Client: MyService instance
43
43
  */
44
44
  export declare class Injectables {
45
+ /**
46
+ * @description Holds the active registry implementation used by the Injectables facade.
47
+ * @summary Internal static reference that can be swapped via setRegistry to customize how injectables are stored and retrieved.
48
+ * @type {InjectablesRegistry | undefined}
49
+ */
45
50
  private static actingInjectablesRegistry?;
46
51
  private constructor();
47
52
  /**