@decaf-ts/injectable-decorators 1.6.14 → 1.6.16
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.
- package/README.md +1 -1
- package/dist/injectable-decorators.cjs +11 -27
- package/dist/injectable-decorators.esm.cjs +10 -27
- package/lib/decorators.cjs +5 -2
- package/lib/esm/decorators.js +7 -4
- package/lib/esm/index.d.ts +2 -1
- package/lib/esm/index.js +4 -3
- package/lib/esm/utils.d.ts +0 -11
- package/lib/esm/utils.js +2 -23
- package/lib/index.cjs +5 -4
- package/lib/index.d.ts +2 -1
- package/lib/utils.cjs +1 -23
- package/lib/utils.d.ts +0 -11
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
(function (global, factory) {
|
|
2
|
-
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@decaf-ts/decoration')
|
|
3
|
-
typeof define === 'function' && define.amd ? define(['exports', '@decaf-ts/decoration'
|
|
2
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@decaf-ts/decoration')) :
|
|
3
|
+
typeof define === 'function' && define.amd ? define(['exports', '@decaf-ts/decoration'], factory) :
|
|
4
4
|
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["injectable-decorators"] = {}, global.decoration));
|
|
5
5
|
})(this, (function (exports, decoration) { 'use strict';
|
|
6
6
|
|
|
@@ -44,26 +44,6 @@
|
|
|
44
44
|
* @memberOf module:injectable-decorators
|
|
45
45
|
*/
|
|
46
46
|
const getInjectKey = (key) => InjectablesKeys.REFLECT + key;
|
|
47
|
-
/**
|
|
48
|
-
* @description Extracts the type name from a decorated property using reflection.
|
|
49
|
-
* @summary Retrieves the type from a property decorator by accessing TypeScript's reflection metadata.
|
|
50
|
-
* @param {any} model The target object containing the decorated property
|
|
51
|
-
* @param {string | symbol} propKey The property key (name or symbol) of the decorated property
|
|
52
|
-
* @return {string | undefined} The name of the property type, or undefined if it's a Function type
|
|
53
|
-
* @function getTypeFromDecorator
|
|
54
|
-
* @memberOf module:injectable-decorators
|
|
55
|
-
*/
|
|
56
|
-
function getTypeFromDecorator(model, propKey) {
|
|
57
|
-
const typeDef = Reflect.getMetadata(TypeKey, model, propKey);
|
|
58
|
-
if (typeDef.name === "Function") {
|
|
59
|
-
return undefined;
|
|
60
|
-
}
|
|
61
|
-
const meta = Reflect.getMetadata(getInjectKey(InjectablesKeys.INJECTABLE), typeDef);
|
|
62
|
-
if (!meta) {
|
|
63
|
-
return undefined;
|
|
64
|
-
}
|
|
65
|
-
return meta.symbol;
|
|
66
|
-
}
|
|
67
47
|
|
|
68
48
|
/**
|
|
69
49
|
* @description Default implementation of the InjectablesRegistry interface.
|
|
@@ -412,9 +392,12 @@
|
|
|
412
392
|
function injectBaseDecorator(category, cfg) {
|
|
413
393
|
return function injectInnerDecorator(target, propertyKey) {
|
|
414
394
|
const config = (cfg || typeof category === "object" ? category : {});
|
|
395
|
+
if (propertyKey) {
|
|
396
|
+
decoration.prop()(target, propertyKey);
|
|
397
|
+
}
|
|
415
398
|
const name = (typeof category !== "object" &&
|
|
416
399
|
category) ||
|
|
417
|
-
|
|
400
|
+
decoration.Metadata.type(target.constructor, propertyKey);
|
|
418
401
|
if (!name) {
|
|
419
402
|
throw new Error(`Could not get Type from decorator`);
|
|
420
403
|
}
|
|
@@ -535,17 +518,18 @@
|
|
|
535
518
|
* @const VERSION
|
|
536
519
|
* @memberOf module:injectable-decorators
|
|
537
520
|
*/
|
|
538
|
-
const VERSION = "1.6.
|
|
539
|
-
|
|
521
|
+
const VERSION = "1.6.15";
|
|
522
|
+
const PACKAGE_NAME = "##PACKAGE_NAME##";
|
|
523
|
+
decoration.Metadata.registerLibrary(PACKAGE_NAME, VERSION);
|
|
540
524
|
|
|
541
525
|
exports.DefaultInjectablesConfig = DefaultInjectablesConfig;
|
|
542
526
|
exports.InjectableRegistryImp = InjectableRegistryImp;
|
|
543
527
|
exports.Injectables = Injectables;
|
|
544
528
|
exports.InjectablesKeys = InjectablesKeys;
|
|
529
|
+
exports.PACKAGE_NAME = PACKAGE_NAME;
|
|
545
530
|
exports.TypeKey = TypeKey;
|
|
546
531
|
exports.VERSION = VERSION;
|
|
547
532
|
exports.getInjectKey = getInjectKey;
|
|
548
|
-
exports.getTypeFromDecorator = getTypeFromDecorator;
|
|
549
533
|
exports.inject = inject;
|
|
550
534
|
exports.injectBaseDecorator = injectBaseDecorator;
|
|
551
535
|
exports.injectable = injectable;
|
|
@@ -554,4 +538,4 @@
|
|
|
554
538
|
exports.singleton = singleton;
|
|
555
539
|
|
|
556
540
|
}));
|
|
557
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5qZWN0YWJsZS1kZWNvcmF0b3JzLmNqcyIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy50cyIsIi4uL3NyYy91dGlscy50cyIsIi4uL3NyYy9yZWdpc3RyeS50cyIsIi4uL3NyYy9JbmplY3RhYmxlcy50cyIsIi4uL3NyYy9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGVDb25maWcgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnN0YW50cyB1c2VkIGZvciByZWZsZWN0aW9uIG1ldGFkYXRhIGtleXMgaW4gdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uIHN5c3RlbS5cbiAqIEBzdW1tYXJ5IEluamVjdGFibGVzIFJlZmxlY3Rpb24ga2V5cyB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YSBhYm91dCBpbmplY3RhYmxlIGNsYXNzZXMgYW5kIHByb3BlcnRpZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVGTEVDVCBSZWZsZWN0aW9uIGluamVjdGFibGVzIGJhc2Uga2V5IHByZWZpeCBmb3IgYWxsIG1ldGFkYXRhIGtleXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJTkpFQ1RBQkxFIFJlZmxlY3Rpb24ga2V5IHN1ZmZpeCBmb3IgbWFya2luZyBhIGNsYXNzIGFzIGluamVjdGFibGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJTkpFQ1QgUmVmbGVjdGlvbiBrZXkgc3VmZml4IGZvciBtYXJraW5nIGEgcHJvcGVydHkgZm9yIGluamVjdGlvblxuICogQGNvbnN0IEluamVjdGFibGVzS2V5c1xuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IEluamVjdGFibGVzS2V5cyA9IHtcbiAgUkVGTEVDVDogXCJpbmplY3QuZGIuXCIsXG4gIElOSkVDVEFCTEU6IFwiaW5qZWN0YWJsZVwiLFxuICBJTkpFQ1Q6IFwiaW5qZWN0XCIsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gYXBwbGllZCBieSB0aGUgQGluamVjdGFibGUgZGVjb3JhdG9yIHdoZW4gbm9uZSBpcyBwcm92aWRlZC5cbiAqIEBzdW1tYXJ5IFNldHMgc2Vuc2libGUgZGVmYXVsdHMgc3VjaCBhcyBzaW5nbGV0b24gbGlmZWN5Y2xlIGZvciBuZXdseSByZWdpc3RlcmVkIGluamVjdGFibGVzLlxuICogQGNvbnN0IERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZ1xuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZzogSW5qZWN0YWJsZUNvbmZpZyA9IHtcbiAgc2luZ2xldG9uOiB0cnVlLFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVmbGVjdGlvbiBtZXRhZGF0YSBrZXkgZm9yIGFjY2Vzc2luZyBUeXBlU2NyaXB0IHR5cGUgaW5mb3JtYXRpb24uXG4gKiBAc3VtbWFyeSBIb2xkcyB0aGUga2V5IGZvciByZXRyaWV2aW5nIHRoZSBkZXNpZ24gdHlwZSBmcm9tIFR5cGVTY3JpcHQncyByZWZsZWN0aW9uIG1ldGFkYXRhLlxuICogQGNvbnN0IFR5cGVLZXlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBUeXBlS2V5ID0gXCJkZXNpZ246dHlwZVwiO1xuIiwiaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YVwiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZXNLZXlzLCBUeXBlS2V5IH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIGZ1bGx5IHF1YWxpZmllZCByZWZsZWN0aW9uIG1ldGFkYXRhIGtleS5cbiAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIHJlZmxlY3Rpb24ga2V5IGZvciBpbmplY3RhYmxlcyBieSBwcmVmaXhpbmcgdGhlIHByb3ZpZGVkIGtleSB3aXRoIHRoZSBiYXNlIHJlZmxlY3Rpb24ga2V5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRvIGJlIHByZWZpeGVkXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBmdWxseSBxdWFsaWZpZWQgcmVmbGVjdGlvbiBrZXlcbiAqIEBmdW5jdGlvbiBnZXRJbmplY3RLZXlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRJbmplY3RLZXkgPSAoa2V5OiBzdHJpbmcpID0+IEluamVjdGFibGVzS2V5cy5SRUZMRUNUICsga2V5O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBFeHRyYWN0cyB0aGUgdHlwZSBuYW1lIGZyb20gYSBkZWNvcmF0ZWQgcHJvcGVydHkgdXNpbmcgcmVmbGVjdGlvbi5cbiAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgdHlwZSBmcm9tIGEgcHJvcGVydHkgZGVjb3JhdG9yIGJ5IGFjY2Vzc2luZyBUeXBlU2NyaXB0J3MgcmVmbGVjdGlvbiBtZXRhZGF0YS5cbiAqIEBwYXJhbSB7YW55fSBtb2RlbCBUaGUgdGFyZ2V0IG9iamVjdCBjb250YWluaW5nIHRoZSBkZWNvcmF0ZWQgcHJvcGVydHlcbiAqIEBwYXJhbSB7c3RyaW5nIHwgc3ltYm9sfSBwcm9wS2V5IFRoZSBwcm9wZXJ0eSBrZXkgKG5hbWUgb3Igc3ltYm9sKSBvZiB0aGUgZGVjb3JhdGVkIHByb3BlcnR5XG4gKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0eXBlLCBvciB1bmRlZmluZWQgaWYgaXQncyBhIEZ1bmN0aW9uIHR5cGVcbiAqIEBmdW5jdGlvbiBnZXRUeXBlRnJvbURlY29yYXRvclxuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVGcm9tRGVjb3JhdG9yKFxuICBtb2RlbDogYW55LFxuICBwcm9wS2V5OiBzdHJpbmcgfCBzeW1ib2xcbik6IHN5bWJvbCB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHR5cGVEZWYgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFR5cGVLZXksIG1vZGVsLCBwcm9wS2V5KTtcbiAgaWYgKHR5cGVEZWYubmFtZSA9PT0gXCJGdW5jdGlvblwiKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBtZXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICBnZXRJbmplY3RLZXkoSW5qZWN0YWJsZXNLZXlzLklOSkVDVEFCTEUpLFxuICAgIHR5cGVEZWZcbiAgKTtcbiAgaWYgKCFtZXRhKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gbWV0YS5zeW1ib2w7XG59XG4iLCJpbXBvcnQgeyBJbmplY3RhYmxlRGVmLCBJbmplY3RhYmxlT3B0aW9ucyB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlc0tleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldEluamVjdEtleSB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFR5cGUgcmVwcmVzZW50aW5nIGVpdGhlciBhIGNsYXNzIGNvbnN0cnVjdG9yIG9yIGFuIGluc3RhbmNlLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhbiBJbmplY3RhYmxlIHR5cGUgdGhhdCBjYW4gYmUgZWl0aGVyIGEgY2xhc3MgY29uc3RydWN0b3Igb3IgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcy5cbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0eXBlIG9mIHRoZSBpbmplY3RhYmxlIG9iamVjdFxuICogQHR5cGVkZWYge2Z1bmN0aW9uKGFueSk6IFQgfCBUfSBJbmplY3RhYmxlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBJbmplY3RhYmxlPFQ+ID0geyBuZXcgKC4uLmFyZ3M6IGFueVtdKTogVCB9IHwgVDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udHJhY3QgZm9yIGEgcmVnaXN0cnkgdGhhdCBtYW5hZ2VzIGluamVjdGFibGUgb2JqZWN0cy5cbiAqIEBzdW1tYXJ5IEludGVyZmFjZSBmb3IgYW4gaW5qZWN0YWJsZSByZWdpc3RyeSB0aGF0IHByb3ZpZGVzIG1ldGhvZHMgZm9yIHJldHJpZXZpbmcsIHJlZ2lzdGVyaW5nLCBhbmQgYnVpbGRpbmcgaW5qZWN0YWJsZSBvYmplY3RzLlxuICogQHRlbXBsYXRlIFQgVHlwZSBwYXJhbWV0ZXIgdXNlZCBpbiB0aGUgaW50ZXJmYWNlIG1ldGhvZHNcbiAqIEBpbnRlcmZhY2UgSW5qZWN0YWJsZXNSZWdpc3RyeVxuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmplY3RhYmxlc1JlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGZXRjaGVzIGFuIGluamVjdGFibGUgaW5zdGFuY2UgYnkgaXRzIHJlZ2lzdGVyZWQgbmFtZS5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIGFuIHtAbGluayBJbmplY3RhYmxlfSBmcm9tIHRoZSByZWdpc3RyeSBieSBuYW1lLCBvcHRpb25hbGx5IHBhc3NpbmcgY29uc3RydWN0b3IgYXJndW1lbnRzLlxuICAgKiBAdGVtcGxhdGUgVCBUeXBlIG9mIHRoZSBpbmplY3RhYmxlIG9iamVjdCB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0ge3N5bWJvbH0gbmFtZSBUaGUgcmVnaXN0ZXJlZCBuYW1lIG9mIHRoZSBpbmplY3RhYmxlIHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgQ29uc3RydWN0b3IgYXJndW1lbnRzIHRvIHBhc3Mgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBpbmplY3RhYmxlXG4gICAqIEByZXR1cm4ge0luamVjdGFibGU8VD4gfCB1bmRlZmluZWR9IFRoZSBpbmplY3RhYmxlIGluc3RhbmNlIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcbiAgICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAgICovXG4gIGdldDxUPihcbiAgICBuYW1lOiBzeW1ib2wgfCBzdHJpbmcgfCB7IG5ldyAoLi4uYXJnczogYW55W10pOiBUIH0sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogVCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFkZHMgYSBjbGFzcyBvciBvYmplY3QgdG8gdGhlIGluamVjdGFibGUgcmVnaXN0cnkuXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhbiBpbmplY3RhYmxlIGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlIHdpdGggdGhlIHJlZ2lzdHJ5LCBtYWtpbmcgaXQgYXZhaWxhYmxlIGZvciBpbmplY3Rpb24uXG4gICAqIEB0ZW1wbGF0ZSBUIFR5cGUgb2YgdGhlIGluamVjdGFibGUgb2JqZWN0IHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7SW5qZWN0YWJsZTxUPn0gY29uc3RydWN0b3IgVGhlIGNsYXNzIGNvbnN0cnVjdG9yIG9yIG9iamVjdCBpbnN0YW5jZSB0byByZWdpc3RlclxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciByZWdpc3RyYXRpb24gKGNhdGVnb3J5LCBzaW5nbGV0b24gZmxhZywgZXRjLilcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAgICovXG4gIHJlZ2lzdGVyPFQ+KFxuICAgIGNvbnN0cnVjdG9yOiBJbmplY3RhYmxlPFQ+LFxuICAgIGNhdGVnb3J5OiBzeW1ib2wgfCB1bmRlZmluZWQsXG4gICAgb3B0aW9uczogSW5qZWN0YWJsZU9wdGlvbnM8VD4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogdm9pZDtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgYW4gaW5qZWN0YWJsZSBjbGFzcy5cbiAgICogQHN1bW1hcnkgSW5zdGFudGlhdGVzIGFuIGluamVjdGFibGUgY2xhc3MgdXNpbmcgaXRzIGNvbnN0cnVjdG9yIGFuZCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgKiBAdGVtcGxhdGUgVCBUeXBlIG9mIHRoZSBvYmplY3QgdG8gYnVpbGRcbiAgICogQHBhcmFtIHtzeW1ib2x9IG5hbWUgT2JqZWN0IGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIGluamVjdGFibGUgdG8gYnVpbGRcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyBDb25zdHJ1Y3RvciBhcmd1bWVudHMgdG8gcGFzcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIGluamVjdGFibGVcbiAgICogQHJldHVybiB7VH0gVGhlIG5ld2x5IGNyZWF0ZWQgaW5zdGFuY2VcbiAgICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAgICovXG4gIGJ1aWxkPFQ+KG5hbWU6IHN5bWJvbCwgLi4uYXJnczogYW55W10pOiBUO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBJbmplY3RhYmxlc1JlZ2lzdHJ5IGludGVyZmFjZS5cbiAqIEBzdW1tYXJ5IEhvbGRzIHRoZSB2YXJpb3VzIHtAbGluayBJbmplY3RhYmxlfXMgaW4gYSBjYWNoZSBhbmQgcHJvdmlkZXMgbWV0aG9kcyB0byByZWdpc3RlciwgcmV0cmlldmUsIGFuZCBidWlsZCB0aGVtLlxuICogQHRlbXBsYXRlIFQgVHlwZSBwYXJhbWV0ZXIgdXNlZCBpbiB0aGUgY2xhc3MgbWV0aG9kc1xuICpcbiAqIEBjbGFzcyBJbmplY3RhYmxlUmVnaXN0cnlJbXBcbiAqIEBpbXBsZW1lbnRzIEluamVjdGFibGVzUmVnaXN0cnlcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDcmVhdGUgYSBuZXcgcmVnaXN0cnlcbiAqIGNvbnN0IHJlZ2lzdHJ5ID0gbmV3IEluamVjdGFibGVSZWdpc3RyeUltcCgpO1xuICpcbiAqIC8vIFJlZ2lzdGVyIGEgY2xhc3NcbiAqIGNsYXNzIE15U2VydmljZSB7XG4gKiAgIGRvU29tZXRoaW5nKCkge1xuICogICAgIHJldHVybiAnSGVsbG8gV29ybGQnO1xuICogICB9XG4gKiB9XG4gKiByZWdpc3RyeS5yZWdpc3RlcihNeVNlcnZpY2UsICdNeVNlcnZpY2UnLCB0cnVlKTtcbiAqXG4gKiAvLyBHZXQgdGhlIGluc3RhbmNlXG4gKiBjb25zdCBzZXJ2aWNlID0gcmVnaXN0cnkuZ2V0KCdNeVNlcnZpY2UnKTtcbiAqIHNlcnZpY2UuZG9Tb21ldGhpbmcoKTsgLy8gJ0hlbGxvIFdvcmxkJ1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IFJlZ2lzdHJ5XG4gKlxuICogICBDbGllbnQtPj5SZWdpc3RyeTogcmVnaXN0ZXIoTXlTZXJ2aWNlKVxuICogICBSZWdpc3RyeS0+PlJlZ2lzdHJ5OiBTdG9yZSBpbiBjYWNoZVxuICpcbiAqICAgQ2xpZW50LT4+UmVnaXN0cnk6IGdldChcIk15U2VydmljZVwiKVxuICogICBhbHQgSW5zdGFuY2UgZXhpc3RzIGFuZCBpcyBzaW5nbGV0b25cbiAqICAgICBSZWdpc3RyeS0tPj5DbGllbnQ6IFJldHVybiBjYWNoZWQgaW5zdGFuY2VcbiAqICAgZWxzZSBObyBpbnN0YW5jZSBvciBub3Qgc2luZ2xldG9uXG4gKiAgICAgUmVnaXN0cnktPj5SZWdpc3RyeTogYnVpbGQobmFtZSlcbiAqICAgICBSZWdpc3RyeS0tPj5DbGllbnQ6IFJldHVybiBuZXcgaW5zdGFuY2VcbiAqICAgZW5kXG4gKi9cbmV4cG9ydCBjbGFzcyBJbmplY3RhYmxlUmVnaXN0cnlJbXAgaW1wbGVtZW50cyBJbmplY3RhYmxlc1JlZ2lzdHJ5IHtcbiAgcHJpdmF0ZSBjYWNoZTogUmVjb3JkPHN5bWJvbCwgSW5qZWN0YWJsZURlZj4gPSB7fTtcblxuICBoYXM8VD4obmFtZTogc3ltYm9sIHwgeyBuZXcgKC4uLmFyZ3M6IGFueVtdKTogVCB9KTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN5bWJvbFwiKSByZXR1cm4gbmFtZSBpbiB0aGlzLmNhY2hlO1xuICAgIHJldHVybiBTeW1ib2wuZm9yKG5hbWUudG9TdHJpbmcoKSkgaW4gdGhpcy5jYWNoZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgZ2V0PFQ+KFxuICAgIG5hbWU6IHN5bWJvbCB8IHN0cmluZyB8IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IFQgfSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBUIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3RyaW5nXCIpIG5hbWUgPSBTeW1ib2wuZm9yKG5hbWUpO1xuICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gXCJzeW1ib2xcIikge1xuICAgICAgY29uc3QgbWV0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgIGdldEluamVjdEtleShJbmplY3RhYmxlc0tleXMuSU5KRUNUQUJMRSksXG4gICAgICAgIG5hbWVcbiAgICAgICk7XG4gICAgICBuYW1lID0gKG1ldGE/LnN5bWJvbCBhcyBzeW1ib2wpIHx8IFN5bWJvbC5mb3IobmFtZS50b1N0cmluZygpKTtcbiAgICB9XG4gICAgaWYgKCFuYW1lKSB0aHJvdyBuZXcgRXJyb3IoYEluamVjdGFibGUgJHtuYW1lfSBub3QgZm91bmRgKTtcblxuICAgIGlmICghKChuYW1lIGFzIHN5bWJvbCkgaW4gdGhpcy5jYWNoZSkpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZVtuYW1lXTtcbiAgICBpZiAoIWNhY2hlLm9wdGlvbnMuc2luZ2xldG9uICYmICFjYWNoZS5pbnN0YW5jZSlcbiAgICAgIHJldHVybiB0aGlzLmJ1aWxkPFQ+KG5hbWUsIC4uLmFyZ3MpO1xuICAgIHJldHVybiBjYWNoZS5pbnN0YW5jZSB8fCB0aGlzLmJ1aWxkPFQ+KG5hbWUsIC4uLmFyZ3MpO1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgcmVnaXN0ZXI8VD4oXG4gICAgb2JqOiBJbmplY3RhYmxlPFQ+LFxuICAgIGNhdGVnb3J5OiBzeW1ib2wgfCB1bmRlZmluZWQsXG4gICAgb3B0aW9uczogSW5qZWN0YWJsZU9wdGlvbnM8VD4sXG4gICAgZm9yY2U6IGJvb2xlYW4gPSBmYWxzZVxuICApOiB2b2lkIHtcbiAgICBjb25zdCBjYXN0T2JqOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gb2JqIGFzIFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgICBjb25zdCBjb25zdHJ1Y3RvciA9ICFjYXN0T2JqLm5hbWUgJiYgY2FzdE9iai5jb25zdHJ1Y3RvcjtcbiAgICBpZiAodHlwZW9mIGNhc3RPYmogIT09IFwiZnVuY3Rpb25cIiAmJiAhY29uc3RydWN0b3IpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbmplY3RhYmxlIHJlZ2lzdGVyaW5nIGZhaWxlZC4gTWlzc2luZyBDbGFzcyBuYW1lIG9yIGNvbnN0cnVjdG9yYFxuICAgICAgKTtcblxuICAgIGNvbnN0IG5hbWUgPSBjYXRlZ29yeSB8fCBTeW1ib2wuZm9yKChvYmogYXMgYW55KS50b1N0cmluZygpKTtcblxuICAgIGlmICghdGhpcy5jYWNoZVtuYW1lXSB8fCBmb3JjZSlcbiAgICAgIHRoaXMuY2FjaGVbbmFtZV0gPSB7XG4gICAgICAgIGluc3RhbmNlOiBvcHRpb25zLnNpbmdsZXRvbiAmJiBjb25zdHJ1Y3RvciA/IG9iaiA6IHVuZGVmaW5lZCxcbiAgICAgICAgY29uc3RydWN0b3I6ICFjb25zdHJ1Y3RvciA/IG9iaiA6IChvYmogYXMgYW55KS5jb25zdHJ1Y3RvcixcbiAgICAgICAgb3B0aW9uczogb3B0aW9ucyxcbiAgICAgIH07XG4gIH1cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBidWlsZDxUPihuYW1lOiBzeW1ib2wsIC4uLmFyZ3M6IGFueVtdKTogVCB7XG4gICAgY29uc3QgeyBjb25zdHJ1Y3Rvciwgb3B0aW9ucyB9ID0gdGhpcy5jYWNoZVtuYW1lXTtcbiAgICBsZXQgaW5zdGFuY2U6IFQ7XG4gICAgdHJ5IHtcbiAgICAgIGluc3RhbmNlID0gbmV3IGNvbnN0cnVjdG9yKC4uLmFyZ3MpO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYGZhaWxlZCB0byBidWlsZCAke25hbWUudG9TdHJpbmcoKX0gd2l0aCBhcmdzICR7YXJnc306ICR7ZX1gXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5zaW5nbGV0b24pIHtcbiAgICAgIHRoaXMuY2FjaGVbbmFtZV0uaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuY2FsbGJhY2spIGluc3RhbmNlID0gb3B0aW9ucy5jYWxsYmFjayhpbnN0YW5jZSwgLi4uYXJncyk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBJbmplY3RhYmxlLFxuICBJbmplY3RhYmxlUmVnaXN0cnlJbXAsXG4gIEluamVjdGFibGVzUmVnaXN0cnksXG59IGZyb20gXCIuL3JlZ2lzdHJ5XCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlT3B0aW9ucyB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENlbnRyYWwgcmVnaXN0cnkgZm9yIG1hbmFnaW5nIGluamVjdGFibGUgZGVwZW5kZW5jaWVzLlxuICogQHN1bW1hcnkgU3RhdGljIGNsYXNzIGhvbGRpbmcgdGhlIGFjY2VzcyB0byB0aGUgaW5qZWN0YWJsZXMgZnVuY3Rpb25zLiBQcm92aWRlcyBtZXRob2RzIGZvciByZWdpc3RlcmluZyxcbiAqIHJldHJpZXZpbmcsIGFuZCBidWlsZGluZyBpbmplY3RhYmxlIG9iamVjdHMuXG4gKiBAdGVtcGxhdGUgVCBUeXBlIG9mIHRoZSBpbmplY3RhYmxlIG9iamVjdFxuICpcbiAqIEBjbGFzcyBJbmplY3RhYmxlc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBEZWZpbmUgYW4gaW5qZWN0YWJsZSBjbGFzc1xuICogQGluamVjdGFibGUoKVxuICogY2xhc3MgTXlTZXJ2aWNlIHtcbiAqICAgZG9Tb21ldGhpbmcoKSB7XG4gKiAgICAgcmV0dXJuICdIZWxsbyBXb3JsZCc7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiAvLyBJbmplY3QgdGhlIHNlcnZpY2UgaW50byBhbm90aGVyIGNsYXNzXG4gKiBjbGFzcyBNeUNvbXBvbmVudCB7XG4gKiAgIEBpbmplY3QoKVxuICogICBwcml2YXRlIHNlcnZpY2UhOiBNeVNlcnZpY2U7XG4gKlxuICogICB1c2VTZXJ2aWNlKCkge1xuICogICAgIHJldHVybiB0aGlzLnNlcnZpY2UuZG9Tb21ldGhpbmcoKTtcbiAqICAgfVxuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IEluamVjdGFibGVzXG4gKiAgIHBhcnRpY2lwYW50IFJlZ2lzdHJ5XG4gKlxuICogICBDbGllbnQtPj5JbmplY3RhYmxlczogcmVnaXN0ZXIoTXlTZXJ2aWNlKVxuICogICBJbmplY3RhYmxlcy0+PlJlZ2lzdHJ5OiByZWdpc3RlcihNeVNlcnZpY2UpXG4gKiAgIFJlZ2lzdHJ5LS0+PkluamVjdGFibGVzOiB2b2lkXG4gKlxuICogICBDbGllbnQtPj5JbmplY3RhYmxlczogZ2V0KFwiTXlTZXJ2aWNlXCIpXG4gKiAgIEluamVjdGFibGVzLT4+UmVnaXN0cnk6IGdldChcIk15U2VydmljZVwiKVxuICogICBSZWdpc3RyeS0tPj5JbmplY3RhYmxlczogTXlTZXJ2aWNlIGluc3RhbmNlXG4gKiAgIEluamVjdGFibGVzLS0+PkNsaWVudDogTXlTZXJ2aWNlIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBjbGFzcyBJbmplY3RhYmxlcyB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSG9sZHMgdGhlIGFjdGl2ZSByZWdpc3RyeSBpbXBsZW1lbnRhdGlvbiB1c2VkIGJ5IHRoZSBJbmplY3RhYmxlcyBmYWNhZGUuXG4gICAqIEBzdW1tYXJ5IEludGVybmFsIHN0YXRpYyByZWZlcmVuY2UgdGhhdCBjYW4gYmUgc3dhcHBlZCB2aWEgc2V0UmVnaXN0cnkgdG8gY3VzdG9taXplIGhvdyBpbmplY3RhYmxlcyBhcmUgc3RvcmVkIGFuZCByZXRyaWV2ZWQuXG4gICAqIEB0eXBlIHtJbmplY3RhYmxlc1JlZ2lzdHJ5IHwgdW5kZWZpbmVkfVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgYWN0aW5nSW5qZWN0YWJsZXNSZWdpc3RyeT86IEluamVjdGFibGVzUmVnaXN0cnkgPSB1bmRlZmluZWQ7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBGZXRjaGVzIGFuIGluamVjdGFibGUgaW5zdGFuY2UgYnkgaXRzIHJlZ2lzdGVyZWQgbmFtZS5cbiAgICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSBuYW1lZCB7QGxpbmsgSW5qZWN0YWJsZX0gZnJvbSB0aGUgcmVnaXN0cnkuIElmIHRoZSBpbmplY3RhYmxlIGlzIGEgc2luZ2xldG9uLFxuICAgKiByZXR1cm5zIHRoZSBleGlzdGluZyBpbnN0YW5jZS4gT3RoZXJ3aXNlLCBjcmVhdGVzIGEgbmV3IGluc3RhbmNlLlxuICAgKiBAdGVtcGxhdGUgVCBUeXBlIG9mIHRoZSBpbmplY3RhYmxlIG9iamVjdCB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgcmVnaXN0ZXJlZCBuYW1lIG9mIHRoZSBpbmplY3RhYmxlIHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgQ29uc3RydWN0b3IgYXJndW1lbnRzIHRvIHBhc3Mgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBpbmplY3RhYmxlXG4gICAqIEByZXR1cm4ge0luamVjdGFibGU8VD4gfCB1bmRlZmluZWR9IFRoZSBpbmplY3RhYmxlIGluc3RhbmNlIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcbiAgICovXG4gIHN0YXRpYyBnZXQ8VD4oXG4gICAgbmFtZTogc3ltYm9sIHwgc3RyaW5nIHwgeyBuZXcgKC4uLmFyZ3M6IGFueVtdKTogVCB9LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBJbmplY3RhYmxlcy5nZXRSZWdpc3RyeSgpLmdldChuYW1lLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWRkcyBhIGNsYXNzIG9yIG9iamVjdCB0byB0aGUgaW5qZWN0YWJsZSByZWdpc3RyeS5cbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIGFuIGluamVjdGFibGUgY29uc3RydWN0b3Igb3IgaW5zdGFuY2Ugd2l0aCB0aGUgcmVnaXN0cnksIG1ha2luZyBpdCBhdmFpbGFibGUgZm9yIGluamVjdGlvbi5cbiAgICogQHRlbXBsYXRlIFQgVHlwZSBvZiB0aGUgaW5qZWN0YWJsZSBvYmplY3QgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIHtJbmplY3RhYmxlPFQ+fSBjb25zdHJ1Y3RvciBUaGUgY2xhc3MgY29uc3RydWN0b3Igb3Igb2JqZWN0IGluc3RhbmNlIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHJlZ2lzdHJhdGlvbiAoY2F0ZWdvcnksIHNpbmdsZXRvbiBmbGFnLCBldGMuKVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyPFQ+KGNvbnN0cnVjdG9yOiBJbmplY3RhYmxlPFQ+LCAuLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuICAgIHJldHVybiBJbmplY3RhYmxlcy5nZXRSZWdpc3RyeSgpLnJlZ2lzdGVyKFxuICAgICAgY29uc3RydWN0b3IsXG4gICAgICAuLi4oYXJncyBhcyBbc3ltYm9sLCBJbmplY3RhYmxlT3B0aW9uczxUPl0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBhbiBpbmplY3RhYmxlIGNsYXNzLlxuICAgKiBAc3VtbWFyeSBJbnN0YW50aWF0ZXMgYW4gaW5qZWN0YWJsZSBjbGFzcyB1c2luZyBpdHMgY29uc3RydWN0b3IgYW5kIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAqIEB0ZW1wbGF0ZSBUIFR5cGUgb2YgdGhlIG9iamVjdCB0byBidWlsZFxuICAgKiBAcGFyYW0ge3N5bWJvbH0gbmFtZSBzeW1ib2wgcmVmZXJlbmNpbmcgdGhlIGluamVjdGFibGVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyBDb25zdHJ1Y3RvciBhcmd1bWVudHMgdG8gcGFzcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIGluamVjdGFibGVcbiAgICogQHJldHVybiB7VH0gVGhlIG5ld2x5IGNyZWF0ZWQgaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBidWlsZDxUPihuYW1lOiBzeW1ib2wsIC4uLmFyZ3M6IGFueVtdKTogVCB7XG4gICAgcmV0dXJuIEluamVjdGFibGVzLmdldFJlZ2lzdHJ5KCkuYnVpbGQobmFtZSwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlcGxhY2VzIHRoZSBjdXJyZW50IHJlZ2lzdHJ5IGltcGxlbWVudGF0aW9uLlxuICAgKiBAc3VtbWFyeSBTZXRzIGEgbmV3IHtAbGluayBJbmplY3RhYmxlc1JlZ2lzdHJ5fSBpbXBsZW1lbnRhdGlvbiwgYWxsb3dpbmcgZm9yIGN1c3RvbSByZWdpc3RyeSBiZWhhdmlvci5cbiAgICogQHBhcmFtIHtJbmplY3RhYmxlc1JlZ2lzdHJ5fSBvcGVyYXRpb25zUmVnaXN0cnkgVGhlIG5ldyBpbXBsZW1lbnRhdGlvbiBvZiBSZWdpc3RyeSB0byB1c2VcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBzZXRSZWdpc3RyeShvcGVyYXRpb25zUmVnaXN0cnk6IEluamVjdGFibGVzUmVnaXN0cnkpOiB2b2lkIHtcbiAgICBJbmplY3RhYmxlcy5hY3RpbmdJbmplY3RhYmxlc1JlZ2lzdHJ5ID0gb3BlcmF0aW9uc1JlZ2lzdHJ5O1xuICB9XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBjdXJyZW50IHJlZ2lzdHJ5IGluc3RhbmNlLlxuICAgKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSBjdXJyZW50IHtAbGluayBJbmplY3RhYmxlc1JlZ2lzdHJ5fSBvciBjcmVhdGVzIGEgZGVmYXVsdCBvbmUgaWYgbm9uZSBleGlzdHMuXG4gICAqIEByZXR1cm4ge0luamVjdGFibGVzUmVnaXN0cnl9IFRoZSBjdXJyZW50IHJlZ2lzdHJ5IGluc3RhbmNlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRSZWdpc3RyeSgpOiBJbmplY3RhYmxlc1JlZ2lzdHJ5IHtcbiAgICBpZiAoIUluamVjdGFibGVzLmFjdGluZ0luamVjdGFibGVzUmVnaXN0cnkpXG4gICAgICBJbmplY3RhYmxlcy5hY3RpbmdJbmplY3RhYmxlc1JlZ2lzdHJ5ID0gbmV3IEluamVjdGFibGVSZWdpc3RyeUltcCgpO1xuICAgIHJldHVybiBJbmplY3RhYmxlcy5hY3RpbmdJbmplY3RhYmxlc1JlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDbGVhcnMgYWxsIHJlZ2lzdGVyZWQgaW5qZWN0YWJsZXMuXG4gICAqIEBzdW1tYXJ5IFJlc2V0cyB0aGUgcmVnaXN0cnkgdG8gYSBjbGVhbiBzdGF0ZSBieSBjcmVhdGluZyBhIG5ldyBlbXB0eSByZWdpc3RyeSBpbnN0YW5jZS5cbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyByZXNldCgpOiB2b2lkIHtcbiAgICBJbmplY3RhYmxlcy5zZXRSZWdpc3RyeShuZXcgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZW1vdmVzIHNwZWNpZmljIGluamVjdGFibGVzIGZyb20gdGhlIHJlZ2lzdHJ5IGJhc2VkIG9uIGEgcGF0dGVybi5cbiAgICogQHN1bW1hcnkgU2VsZWN0aXZlbHkgcmVzZXRzIHRoZSByZWdpc3RyeSBieSByZW1vdmluZyBvbmx5IHRoZSBpbmplY3RhYmxlcyB3aG9zZSBuYW1lcyBtYXRjaCB0aGUgcHJvdmlkZWQgcGF0dGVybi5cbiAgICogQHBhcmFtIHtzdHJpbmcgfCBSZWdFeHB9IG1hdGNoIEEgc3RyaW5nIG9yIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuIHRvIG1hdGNoIGFnYWluc3QgaW5qZWN0YWJsZSBuYW1lc1xuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHNlbGVjdGl2ZVJlc2V0KG1hdGNoOiBzdHJpbmcgfCBSZWdFeHApOiB2b2lkIHtcbiAgICBjb25zdCByZWdleHAgPSB0eXBlb2YgbWF0Y2ggPT09IFwic3RyaW5nXCIgPyBuZXcgUmVnRXhwKG1hdGNoKSA6IG1hdGNoO1xuICAgIChJbmplY3RhYmxlcy5hY3RpbmdJbmplY3RhYmxlc1JlZ2lzdHJ5IGFzIGFueSlbXCJjYWNoZVwiXSA9IE9iamVjdC5lbnRyaWVzKFxuICAgICAgKEluamVjdGFibGVzLmFjdGluZ0luamVjdGFibGVzUmVnaXN0cnkgYXMgYW55KVtcImNhY2hlXCJdXG4gICAgKS5yZWR1Y2UoKGFjY3VtOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBba2V5LCB2YWxdKSA9PiB7XG4gICAgICBpZiAoIWtleS5tYXRjaChyZWdleHApKSBhY2N1bVtrZXldID0gdmFsO1xuICAgICAgcmV0dXJuIGFjY3VtO1xuICAgIH0sIHt9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRGVmYXVsdEluamVjdGFibGVzQ29uZmlnLCBJbmplY3RhYmxlc0tleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEluamVjdGFibGVzIH0gZnJvbSBcIi4vSW5qZWN0YWJsZXNcIjtcbmltcG9ydCB7IGdldEluamVjdEtleSwgZ2V0VHlwZUZyb21EZWNvcmF0b3IgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZU1ldGFkYXRhLCBJbnN0YW5jZUNhbGxiYWNrIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERlY29yYXRpb24gfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgQGluamVjdGFibGUgZGVjb3JhdG9yLlxuICogQHN1bW1hcnkgQ29udHJvbHMgbGlmZWN5Y2xlIChzaW5nbGV0b24gdnMgb24tZGVtYW5kKSBhbmQgYW4gb3B0aW9uYWwgaW5zdGFuY2UgdHJhbnNmb3JtYXRpb24gY2FsbGJhY2sgZXhlY3V0ZWQgcG9zdC1jb25zdHJ1Y3Rpb24uXG4gKiBAdGVtcGxhdGUgVCBUaGUgaW5zdGFuY2UgdHlwZSBhZmZlY3RlZCBieSB0aGUgY2FsbGJhY2sgd2hlbiBwcm92aWRlZC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc2luZ2xldG9uIFdoZW4gdHJ1ZSwgYSBzaW5nbGUgaW5zdGFuY2UgaXMgc2hhcmVkIChzaW5nbGV0b24pLiBXaGVuIGZhbHNlLCBpbnN0YW5jZXMgYXJlIGNyZWF0ZWQgb24gZGVtYW5kLlxuICogQHByb3BlcnR5IHtJbnN0YW5jZUNhbGxiYWNrPFQ+fSBbY2FsbGJhY2tdIE9wdGlvbmFsIGhvb2sgdG8gdHJhbnNmb3JtIHRoZSBpbnN0YW5jZSBhZnRlciBpdCBpcyBjb25zdHJ1Y3RlZC5cbiAqIEB0eXBlZGVmIEluamVjdGFibGVDb25maWdcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCB0eXBlIEluamVjdGFibGVDb25maWcgPSB7XG4gIHNpbmdsZXRvbjogYm9vbGVhbjtcbiAgY2FsbGJhY2s/OiBJbnN0YW5jZUNhbGxiYWNrPGFueT47XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0YWJsZUJhc2VEZWNvcmF0b3IoXG4gIGNhdGVnb3J5Pzogc3RyaW5nIHwgQ29uc3RydWN0b3IgfCBQYXJ0aWFsPEluamVjdGFibGVDb25maWc+LFxuICBjZmc/OiBQYXJ0aWFsPEluamVjdGFibGVDb25maWc+XG4pIHtcbiAgY2ZnID1cbiAgICBjZmcgfHxcbiAgICAodHlwZW9mIGNhdGVnb3J5ID09PSBcIm9iamVjdFwiXG4gICAgICA/IE9iamVjdC5hc3NpZ24oY2F0ZWdvcnkgYXMgUmVjb3JkPGFueSwgYW55PiwgRGVmYXVsdEluamVjdGFibGVzQ29uZmlnKVxuICAgICAgOiBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWcpO1xuICBjYXRlZ29yeSA9XG4gICAgdHlwZW9mIGNhdGVnb3J5ID09PSBcIm9iamVjdFwiXG4gICAgICA/IHVuZGVmaW5lZFxuICAgICAgOiB0eXBlb2YgY2F0ZWdvcnkgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBjYXRlZ29yeVxuICAgICAgICA6IHR5cGVvZiBjYXRlZ29yeSA9PT0gXCJmdW5jdGlvblwiICYmIGNhdGVnb3J5Lm5hbWVcbiAgICAgICAgICA/IGNhdGVnb3J5XG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gIHJldHVybiBmdW5jdGlvbiBpbmplY3RhYmxlSW5uZXJEZWNvcmF0b3Iob3JpZ2luYWw6IGFueSkge1xuICAgIGNvbnN0IHN5bWJvbCA9IFN5bWJvbC5mb3IoY2F0ZWdvcnkgfHwgb3JpZ2luYWwudG9TdHJpbmcoKSk7XG4gICAgY2F0ZWdvcnkgPSBjYXRlZ29yeSB8fCBvcmlnaW5hbC5uYW1lO1xuXG4gICAgY29uc3QgbWV0YWRhdGE6IEluamVjdGFibGVNZXRhZGF0YSA9IHtcbiAgICAgIGNsYXNzOiBjYXRlZ29yeSBhcyBzdHJpbmcsXG4gICAgICBzeW1ib2w6IHN5bWJvbCxcbiAgICB9O1xuXG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgIGdldEluamVjdEtleShJbmplY3RhYmxlc0tleXMuSU5KRUNUQUJMRSksXG4gICAgICBtZXRhZGF0YSxcbiAgICAgIG9yaWdpbmFsXG4gICAgKTtcbiAgICAvLyB0aGUgbmV3IGNvbnN0cnVjdG9yIGJlaGF2aW91clxuICAgIGNvbnN0IG5ld0NvbnN0cnVjdG9yOiBhbnkgPSBmdW5jdGlvbiAoLi4uYXJnczogYW55W10pIHtcbiAgICAgIHJldHVybiBJbmplY3RhYmxlcy5nZXQ8YW55PihzeW1ib2wsIC4uLmFyZ3MpO1xuICAgIH07XG5cbiAgICAvLyBjb3B5IHByb3RvdHlwZSBzbyBpbnN0YW5jZW9mIG9wZXJhdG9yIHN0aWxsIHdvcmtzXG4gICAgbmV3Q29uc3RydWN0b3IucHJvdG90eXBlID0gb3JpZ2luYWwucHJvdG90eXBlO1xuICAgIC8vIG5ld0NvbnN0cnVjdG9yLl9fcHJvdG9fXyA9IG9yaWdpbmFsLl9fcHJvdG9fXztcbiAgICAvLyBTZXRzIHRoZSBwcm9wZXIgY29uc3RydWN0b3IgbmFtZSBmb3IgdHlwZSB2ZXJpZmljYXRpb25cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmV3Q29uc3RydWN0b3IsIFwibmFtZVwiLCB7XG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIHZhbHVlOiBvcmlnaW5hbC5wcm90b3R5cGUuY29uc3RydWN0b3IubmFtZSxcbiAgICB9KTtcblxuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICBnZXRJbmplY3RLZXkoSW5qZWN0YWJsZXNLZXlzLklOSkVDVEFCTEUpLFxuICAgICAgbWV0YWRhdGEsXG4gICAgICBuZXdDb25zdHJ1Y3RvclxuICAgICk7XG5cbiAgICBJbmplY3RhYmxlcy5yZWdpc3RlcihvcmlnaW5hbCwgc3ltYm9sLCBjZmcpO1xuICAgIC8vIHJldHVybiBuZXcgY29uc3RydWN0b3IgKHdpbGwgb3ZlcnJpZGUgb3JpZ2luYWwpXG4gICAgcmV0dXJuIG5ld0NvbnN0cnVjdG9yO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmljIGNvbnN0cnVjdG9yIHR5cGUgZm9yIGNsYXNzLWxpa2UgdmFsdWVzLlxuICogQHN1bW1hcnkgUmVwcmVzZW50cyBhbnkgY2xhc3MgdGhhdCBjYW4gYmUgaW5zdGFudGlhdGVkIHdpdGggYXJiaXRyYXJ5IGFyZ3VtZW50cywgcHJvZHVjaW5nIGFuIGluc3RhbmNlIG9mIHR5cGUgVC5cbiAqIEB0ZW1wbGF0ZSBUIFRoZSBpbnN0YW5jZSB0eXBlIGNyZWF0ZWQgYnkgdGhlIGNvbnN0cnVjdG9yLlxuICogQHR5cGVkZWYgQ29uc3RydWN0b3JcbiAqIEBleGFtcGxlXG4gKiAvLyBVc2luZyBDb25zdHJ1Y3RvciB0byB0eXBlIGEgZmFjdG9yeVxuICogZnVuY3Rpb24gbWFrZTxUPihDdG9yOiBDb25zdHJ1Y3RvcjxUPiwgLi4uYXJnczogYW55W10pOiBUIHtcbiAqICAgcmV0dXJuIG5ldyBDdG9yKC4uLmFyZ3MpO1xuICogfVxuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgQ29uc3RydWN0b3I8VCA9IGFueT4gPSB7IG5ldyAoLi4uYXJnczogYW55W10pOiBUIH07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IG1hcmtzIGEgY2xhc3MgYXMgYXZhaWxhYmxlIGZvciBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBjbGFzcyBhcyBhbiBpbmplY3RhYmxlIHRoYXQgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSByZWdpc3RyeS5cbiAqIFdoZW4gYXBwbGllZCB0byBhIGNsYXNzLCByZXBsYWNlcyBpdHMgY29uc3RydWN0b3Igd2l0aCBvbmUgdGhhdCByZXR1cm5zIGFuIGluc3RhbmNlLlxuICpcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSBjbGFzcyBpbnRvIGFuIGluamVjdGFibGUuXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdGFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdGFibGUoKTogKG9yaWdpbmFsOiBhbnkpID0+IGFueTtcbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IG1hcmtzIGEgY2xhc3MgYXMgYXZhaWxhYmxlIGZvciBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBjbGFzcyBhcyBhbiBpbmplY3RhYmxlIHRoYXQgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSByZWdpc3RyeS5cbiAqIFdoZW4gYXBwbGllZCB0byBhIGNsYXNzLCByZXBsYWNlcyBpdHMgY29uc3RydWN0b3Igd2l0aCBvbmUgdGhhdCByZXR1cm5zIGFuIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nIHwgQ29uc3RydWN0b3J9IGNhdGVnb3J5IERlZmF1bHRzIHRvIHRoZSBjbGFzcyBjYXRlZ29yeS4gVXNlZnVsIHdoZW4gbWluaWZpY2F0aW9uIG9jY3VycyBhbmQgbmFtZXMgYXJlIGNoYW5nZWQsXG4gKiBvciB3aGVuIHlvdSB3YW50IHRvIHVwY2FzdCB0aGUgb2JqZWN0IHRvIGEgZGlmZmVyZW50IHR5cGUuXG4gKlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55KTogYW55fSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgdGhlIGNsYXNzIGludG8gYW4gaW5qZWN0YWJsZS5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0YWJsZShcbiAgY2F0ZWdvcnk6IHN0cmluZyB8IENvbnN0cnVjdG9yXG4pOiAob3JpZ2luYWw6IGFueSkgPT4gYW55O1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHtQYXJ0aWFsPEluamVjdGFibGVDb25maWc+fSBjZmc9RGVmYXVsdEluamVjdGFibGVDb25maWcgQWxsb3dzIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQgc2luZ2xldG9uIGJlaGF2aW9yIGFuZCBhZGRpbmcgYSBjYWxsYmFjayBmdW5jdGlvbi5cbiAqXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnkpOiBhbnl9IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyB0aGUgY2xhc3MgaW50byBhbiBpbmplY3RhYmxlLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RhYmxlKFxuICBjZmc6IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz5cbik6IChvcmlnaW5hbDogYW55KSA9PiBhbnk7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IG1hcmtzIGEgY2xhc3MgYXMgYXZhaWxhYmxlIGZvciBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBjbGFzcyBhcyBhbiBpbmplY3RhYmxlIHRoYXQgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSByZWdpc3RyeS5cbiAqIFdoZW4gYXBwbGllZCB0byBhIGNsYXNzLCByZXBsYWNlcyBpdHMgY29uc3RydWN0b3Igd2l0aCBvbmUgdGhhdCByZXR1cm5zIGFuIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSBjYXRlZ29yeSBEZWZhdWx0cyB0byB0aGUgY2xhc3MgY2F0ZWdvcnkuIFVzZWZ1bCB3aGVuIG1pbmlmaWNhdGlvbiBvY2N1cnMgYW5kIG5hbWVzIGFyZSBjaGFuZ2VkLFxuICogb3Igd2hlbiB5b3Ugd2FudCB0byB1cGNhc3QgdGhlIG9iamVjdCB0byBhIGRpZmZlcmVudCB0eXBlLlxuICogQHBhcmFtIHtQYXJ0aWFsPEluamVjdGFibGVDb25maWc+fSBjZmc9RGVmYXVsdEluamVjdGFibGVDb25maWcgQWxsb3dzIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQgc2luZ2xldG9uIGJlaGF2aW9yIGFuZCBhZGRpbmcgYSBjYWxsYmFjayBmdW5jdGlvbi5cbiAqXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnkpOiBhbnl9IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyB0aGUgY2xhc3MgaW50byBhbiBpbmplY3RhYmxlLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RhYmxlKFxuICBjYXRlZ29yeTogc3RyaW5nIHwgQ29uc3RydWN0b3IsXG4gIGNmZzogUGFydGlhbDxJbmplY3RhYmxlQ29uZmlnPlxuKTogKG9yaWdpbmFsOiBhbnkpID0+IGFueTtcbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IG1hcmtzIGEgY2xhc3MgYXMgYXZhaWxhYmxlIGZvciBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBjbGFzcyBhcyBhbiBpbmplY3RhYmxlIHRoYXQgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSByZWdpc3RyeS5cbiAqIFdoZW4gYXBwbGllZCB0byBhIGNsYXNzLCByZXBsYWNlcyBpdHMgY29uc3RydWN0b3Igd2l0aCBvbmUgdGhhdCByZXR1cm5zIGFuIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nIHwgQ29uc3RydWN0b3J9IFtjYXRlZ29yeV0gRGVmYXVsdHMgdG8gdGhlIGNsYXNzIGNhdGVnb3J5LiBVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2NjdXJzIGFuZCBuYW1lcyBhcmUgY2hhbmdlZCxcbiAqIG9yIHdoZW4geW91IHdhbnQgdG8gdXBjYXN0IHRoZSBvYmplY3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAqIEBwYXJhbSB7UGFydGlhbDxJbmplY3RhYmxlQ29uZmlnPn0gW2NmZz1EZWZhdWx0SW5qZWN0YWJsZUNvbmZpZ10gQWxsb3dzIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQgc2luZ2xldG9uIGJlaGF2aW9yIGFuZCBhZGRpbmcgYSBjYWxsYmFjayBmdW5jdGlvbi5cbiAqXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnkpOiBhbnl9IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyB0aGUgY2xhc3MgaW50byBhbiBpbmplY3RhYmxlLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RhYmxlXG4gKiBAY2F0ZWdvcnkgQ2xhc3MgRGVjb3JhdG9yc1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IERlY29yYXRvclxuICogICBwYXJ0aWNpcGFudCBJbmplY3RhYmxlc1xuICpcbiAqICAgQ2xpZW50LT4+RGVjb3JhdG9yOiBAaW5qZWN0YWJsZSgpXG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogQ3JlYXRlIG5ldyBjb25zdHJ1Y3RvclxuICpcbiAqICAgTm90ZSBvdmVyIERlY29yYXRvcjogV2hlbiBuZXcgaW5zdGFuY2UgcmVxdWVzdGVkXG4gKiAgIERlY29yYXRvci0+PkluamVjdGFibGVzOiBnZXQoY2F0ZWdvcnkpXG4gKiAgIGFsdCBJbnN0YW5jZSBleGlzdHNcbiAqICAgICBJbmplY3RhYmxlcy0tPj5EZWNvcmF0b3I6IFJldHVybiBleGlzdGluZyBpbnN0YW5jZVxuICogICBlbHNlIE5vIGluc3RhbmNlXG4gKiAgICAgRGVjb3JhdG9yLT4+SW5qZWN0YWJsZXM6IHJlZ2lzdGVyKG9yaWdpbmFsLCBjYXRlZ29yeSlcbiAqICAgICBEZWNvcmF0b3ItPj5JbmplY3RhYmxlczogZ2V0KGNhdGVnb3J5KVxuICogICAgIEluamVjdGFibGVzLS0+PkRlY29yYXRvcjogUmV0dXJuIG5ldyBpbnN0YW5jZVxuICogICAgIG9wdCBIYXMgY2FsbGJhY2tcbiAqICAgICAgIERlY29yYXRvci0+PkRlY29yYXRvcjogQ2FsbCBpbnN0YW5jZUNhbGxiYWNrXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IERlZmluZSBtZXRhZGF0YVxuICogICBEZWNvcmF0b3ItLT4+Q2xpZW50OiBSZXR1cm4gaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdGFibGUoXG4gIGNhdGVnb3J5Pzogc3RyaW5nIHwgQ29uc3RydWN0b3IgfCBQYXJ0aWFsPEluamVjdGFibGVDb25maWc+LFxuICBjZmc/OiBQYXJ0aWFsPEluamVjdGFibGVDb25maWc+XG4pIHtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEluamVjdGFibGVzS2V5cy5JTkpFQ1RBQkxFKVxuICAgIC5kZWZpbmUoeyBkZWNvcmF0b3I6IGluamVjdGFibGVCYXNlRGVjb3JhdG9yLCBhcmdzOiBbY2F0ZWdvcnksIGNmZ10gfSlcbiAgICAuYXBwbHkoKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udmVuaWVuY2UgZGVjb3JhdG9yIHRvIHJlZ2lzdGVyIGFuIGluamVjdGFibGUgYXMgYSBzaW5nbGV0b24uXG4gKiBAc3VtbWFyeSBXcmFwcyB7QGxpbmsgaW5qZWN0YWJsZX0gZm9yY2luZyB0aGUgc2luZ2xldG9uIGxpZmVjeWNsZSBzbyBvbmx5IG9uZSBpbnN0YW5jZSBpcyBjcmVhdGVkIGFuZCByZXVzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ3xDb25zdHJ1Y3Rvcn0gW2NhdGVnb3J5XSBPcHRpb25hbCBleHBsaWNpdCBjYXRlZ29yeS9zeW1ib2wgc291cmNlOyBkZWZhdWx0cyB0byB0aGUgY2xhc3MuXG4gKiBAcGFyYW0ge09taXQ8SW5qZWN0YWJsZUNvbmZpZywgXCJzaW5nbGV0b25cIj59IFtjZmddIEFkZGl0aW9uYWwgaW5qZWN0YWJsZSBjb25maWd1cmF0aW9uIGV4Y2x1ZGluZyB0aGUgc2luZ2xldG9uIGZsYWcuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnkpOiBhbnl9IEEgY2xhc3MgZGVjb3JhdG9yIHRoYXQgcmVnaXN0ZXJzIHRoZSB0YXJnZXQgYXMgYSBzaW5nbGV0b24gaW5qZWN0YWJsZS5cbiAqIEBmdW5jdGlvbiBzaW5nbGV0b25cbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaW5nbGV0b24oXG4gIGNhdGVnb3J5Pzogc3RyaW5nIHwgQ29uc3RydWN0b3IsXG4gIGNmZz86IE9taXQ8SW5qZWN0YWJsZUNvbmZpZywgXCJzaW5nbGV0b25cIj5cbikge1xuICByZXR1cm4gaW5qZWN0YWJsZShcbiAgICBjYXRlZ29yeSBhcyBhbnksXG4gICAgT2JqZWN0LmFzc2lnbih7fSwgY2ZnIHx8IHt9LCB7IHNpbmdsZXRvbjogdHJ1ZSB9KVxuICApO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb252ZW5pZW5jZSBkZWNvcmF0b3IgdG8gcmVnaXN0ZXIgYW4gaW5qZWN0YWJsZSBhcyBvbi1kZW1hbmQgKG5vbi1zaW5nbGV0b24pLlxuICogQHN1bW1hcnkgV3JhcHMge0BsaW5rIGluamVjdGFibGV9IGZvcmNpbmcgbmV3IGluc3RhbmNlcyB0byBiZSBjcmVhdGVkIG9uIGV2ZXJ5IGluamVjdGlvbiBvciByZXRyaWV2YWwuXG4gKiBAcGFyYW0ge3N0cmluZ3xDb25zdHJ1Y3Rvcn0gW2NhdGVnb3J5XSBPcHRpb25hbCBleHBsaWNpdCBjYXRlZ29yeS9zeW1ib2wgc291cmNlOyBkZWZhdWx0cyB0byB0aGUgY2xhc3MuXG4gKiBAcGFyYW0ge09taXQ8SW5qZWN0YWJsZUNvbmZpZywgXCJzaW5nbGV0b25cIj59IFtjZmddIEFkZGl0aW9uYWwgaW5qZWN0YWJsZSBjb25maWd1cmF0aW9uIGV4Y2x1ZGluZyB0aGUgc2luZ2xldG9uIGZsYWcuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnkpOiBhbnl9IEEgY2xhc3MgZGVjb3JhdG9yIHRoYXQgcmVnaXN0ZXJzIHRoZSB0YXJnZXQgYXMgYSBub24tc2luZ2xldG9uIGluamVjdGFibGUuXG4gKiBAZnVuY3Rpb24gb25EZW1hbmRcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbkRlbWFuZChcbiAgY2F0ZWdvcnk/OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgY2ZnPzogT21pdDxJbmplY3RhYmxlQ29uZmlnLCBcInNpbmdsZXRvblwiPlxuKSB7XG4gIHJldHVybiBpbmplY3RhYmxlKFxuICAgIGNhdGVnb3J5IGFzIGFueSxcbiAgICBPYmplY3QuYXNzaWduKHt9LCBjZmcgfHwge30sIHsgc2luZ2xldG9uOiBmYWxzZSB9KVxuICApO1xufVxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRnVuY3Rpb24gdHlwZSBmb3IgdHJhbnNmb3JtaW5nIGluamVjdGFibGUgaW5zdGFuY2VzIGJlZm9yZSB0aGV5J3JlIGluamVjdGVkLlxuICogQHN1bW1hcnkgRnVuY3Rpb24gd2hpY2ggdHJhbnNmb3JtcyBhIGNhY2hlZCB7QGxpbmsgaW5qZWN0YWJsZX0gaW5zdGFuY2UgYmVmb3JlIGl0J3MgaW5qZWN0ZWQgaW50byBhIHRhcmdldCBvYmplY3QuXG4gKlxuICogQHBhcmFtIHthbnl9IGluamVjdGFibGUgVGhlIGluamVjdGFibGUgaW5zdGFuY2UgdG8gdHJhbnNmb3JtXG4gKiBAcGFyYW0ge2FueX0gb2JqIFRoZSBvYmplY3QgdGhlIGluamVjdGFibGUgd2lsbCBiZSBpbmplY3RlZCBvblxuICogQHJldHVybiB7YW55fSBUaGUgdHJhbnNmb3JtZWQgaW5qZWN0YWJsZSBpbnN0YW5jZVxuICpcbiAqIEB0eXBlZGVmIHtGdW5jdGlvbn0gSW5zdGFuY2VUcmFuc2Zvcm1lclxuICogQGNhdGVnb3J5IERlY29yYXRvcnNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCB0eXBlIEluc3RhbmNlVHJhbnNmb3JtZXIgPSAoaW5qZWN0YWJsZTogYW55LCBvYmo6IGFueSkgPT4gYW55O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBPcHRpb25zIGZvciB0aGUgcHJvcGVydHktbGV2ZWwgQGluamVjdCBkZWNvcmF0b3IuXG4gKiBAc3VtbWFyeSBBbGxvd3Mgc3BlY2lmeWluZyBjb25zdHJ1Y3RvciBhcmd1bWVudHMgYW5kIGFuIG9wdGlvbmFsIHRyYW5zZm9ybWVyIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHJlc29sdmVkIGluc3RhbmNlLlxuICogQHByb3BlcnR5IHthbnlbXX0gW2FyZ3NdIE9wdGlvbmFsIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyB0byB1c2Ugd2hlbiBidWlsZGluZyB0aGUgaW5qZWN0YWJsZSBpbnN0YW5jZS5cbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2VUcmFuc2Zvcm1lcn0gW3RyYW5zZm9ybWVyXSBPcHRpb25hbCBmdW5jdGlvbiB0byB0cmFuc2Zvcm0gdGhlIGluc3RhbmNlIGJlZm9yZSBhc3NpZ25tZW50LlxuICogQHR5cGVkZWYgSW5qZWN0T3B0aW9uc1xuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgSW5qZWN0T3B0aW9ucyA9IHtcbiAgYXJncz86IGFueVtdO1xuICB0cmFuc2Zvcm1lcj86IEluc3RhbmNlVHJhbnNmb3JtZXI7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0QmFzZURlY29yYXRvcihcbiAgY2F0ZWdvcnk/OiBzeW1ib2wgfCBzdHJpbmcgfCBDb25zdHJ1Y3RvciB8IFBhcnRpYWw8SW5qZWN0T3B0aW9ucz4sXG4gIGNmZz86IFBhcnRpYWw8SW5qZWN0T3B0aW9ucz5cbikge1xuICByZXR1cm4gZnVuY3Rpb24gaW5qZWN0SW5uZXJEZWNvcmF0b3IodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5PzogYW55KSB7XG4gICAgY29uc3QgY29uZmlnOiBJbmplY3RPcHRpb25zID0gKFxuICAgICAgY2ZnIHx8IHR5cGVvZiBjYXRlZ29yeSA9PT0gXCJvYmplY3RcIiA/IGNhdGVnb3J5IDoge31cbiAgICApIGFzIEluamVjdE9wdGlvbnM7XG5cbiAgICBjb25zdCBuYW1lOiBzeW1ib2wgfCBzdHJpbmcgfCBDb25zdHJ1Y3RvciB8IHVuZGVmaW5lZCA9XG4gICAgICAodHlwZW9mIGNhdGVnb3J5ICE9PSBcIm9iamVjdFwiICYmXG4gICAgICAgIChjYXRlZ29yeSBhcyBzeW1ib2wgfCBzdHJpbmcgfCBDb25zdHJ1Y3RvcikpIHx8XG4gICAgICBnZXRUeXBlRnJvbURlY29yYXRvcih0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGdldCBUeXBlIGZyb20gZGVjb3JhdG9yYCk7XG4gICAgfVxuXG4gICAgLy8gcHJvcCgpKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICBnZXRJbmplY3RLZXkoSW5qZWN0YWJsZXNLZXlzLklOSkVDVCksXG4gICAgICB7XG4gICAgICAgIGluamVjdGFibGU6IG5hbWUsXG4gICAgICB9LFxuICAgICAgdGFyZ2V0LFxuICAgICAgcHJvcGVydHlLZXlcbiAgICApO1xuXG4gICAgY29uc3QgdmFsdWVzID0gbmV3IFdlYWtNYXAoKTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQodGhpczogYW55KSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgIHByb3BlcnR5S2V5XG4gICAgICAgICkgYXMgUHJvcGVydHlEZXNjcmlwdG9yO1xuICAgICAgICBpZiAoZGVzY3JpcHRvci5jb25maWd1cmFibGUpIHtcbiAgICAgICAgICAvLyBsZXQgL29iajogYW55O1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eUtleSwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQodGhpczogYW55KSB7XG4gICAgICAgICAgICAgIGxldCBvYmogPSB2YWx1ZXMuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgICBpZiAob2JqKSByZXR1cm4gb2JqO1xuICAgICAgICAgICAgICBvYmogPSBJbmplY3RhYmxlcy5nZXQobmFtZSwgLi4uKGNvbmZpZy5hcmdzIHx8IFtdKSk7XG4gICAgICAgICAgICAgIGlmICghb2JqKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgIGBDb3VsZCBub3QgZ2V0IEluamVjdGFibGUgJHtuYW1lLnRvU3RyaW5nKCl9IHRvIGluamVjdCBpbiAke3RhcmdldC5jb25zdHJ1Y3RvciA/IHRhcmdldC5jb25zdHJ1Y3Rvci5uYW1lIDogdGFyZ2V0Lm5hbWV9J3MgJHtwcm9wZXJ0eUtleX1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKGNvbmZpZy50cmFuc2Zvcm1lcilcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgb2JqID0gY29uZmlnLnRyYW5zZm9ybWVyKG9iaiwgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFsdWVzLnNldCh0aGlzLCBvYmopO1xuXG4gICAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB0aGlzW3Byb3BlcnR5S2V5XTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogQHN1bW1hcnkgQWxsb3dzIGZvciB0aGUgaW5qZWN0aW9uIG9mIGFuIHtAbGluayBpbmplY3RhYmxlfSBkZWNvcmF0ZWQgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBUaGUgcHJvcGVydHkgbXVzdCBiZSB0eXBlZCBmb3IgdGhlIHJlcXVlc3RlZCBkZXBlbmRlbmN5LiBPbmx5IGNvbmNyZXRlIGNsYXNzZXMgYXJlIHN1cHBvcnRlZDsgZ2VuZXJpY3MgYXJlIG5vdC5cbiAqXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueSk6IHZvaWR9IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0KCk6ICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IGFueSkgPT4gdm9pZDtcbi8qKlxuICogQGRlc2NyaXB0aW9uIFByb3BlcnR5IGRlY29yYXRvciB0aGF0IGluamVjdHMgYSBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIEBzdW1tYXJ5IEFsbG93cyBmb3IgdGhlIGluamVjdGlvbiBvZiBhbiB7QGxpbmsgaW5qZWN0YWJsZX0gZGVjb3JhdGVkIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogVGhlIHByb3BlcnR5IG11c3QgYmUgdHlwZWQgZm9yIHRoZSByZXF1ZXN0ZWQgZGVwZW5kZW5jeS4gT25seSBjb25jcmV0ZSBjbGFzc2VzIGFyZSBzdXBwb3J0ZWQ7IGdlbmVyaWNzIGFyZSBub3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNhdGVnb3J5IERlZmF1bHRzIHRvIHRoZSBjbGFzcyBuYW1lIGRlcml2ZWQgZnJvbSB0aGUgcHJvcGVydHkgdHlwZS4gVXNlZnVsIHdoZW4gbWluaWZpY2F0aW9uIG9jY3Vyc1xuICogYW5kIG5hbWVzIGFyZSBjaGFuZ2VkLCBvciB3aGVuIHlvdSB3YW50IHRvIHVwY2FzdCB0aGUgb2JqZWN0IHRvIGEgZGlmZmVyZW50IHR5cGUuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueSk6IHZvaWR9IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0KFxuICBjYXRlZ29yeTogc3RyaW5nIHwgQ29uc3RydWN0b3Jcbik6ICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IGFueSkgPT4gdm9pZDtcbi8qKlxuICogQGRlc2NyaXB0aW9uIFByb3BlcnR5IGRlY29yYXRvciB0aGF0IGluamVjdHMgYSBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIEBzdW1tYXJ5IEFsbG93cyBmb3IgdGhlIGluamVjdGlvbiBvZiBhbiB7QGxpbmsgaW5qZWN0YWJsZX0gZGVjb3JhdGVkIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogVGhlIHByb3BlcnR5IG11c3QgYmUgdHlwZWQgZm9yIHRoZSByZXF1ZXN0ZWQgZGVwZW5kZW5jeS4gT25seSBjb25jcmV0ZSBjbGFzc2VzIGFyZSBzdXBwb3J0ZWQ7IGdlbmVyaWNzIGFyZSBub3QuXG4gKlxuICogQHBhcmFtIHtQYXJ0aWFsPEluamVjdE9wdGlvbnM+fSBbY2ZnPXt9XSBPcHRpb25hbCBmdW5jdGlvbiB0byB0cmFuc2Zvcm0gdGhlIGluamVjdGFibGUgaW5zdGFuY2UgYmVmb3JlIGl0J3MgaW5qZWN0ZWQsIG9yIGFyZ3VtZW50cyB0byBwYXNzIHRoZSBjb25zdHJ1Y3RvciB3aGVuIGluamVjdGluZyBvbkRlbWFuZFxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnkpOiB2b2lkfSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdChcbiAgY2ZnOiBQYXJ0aWFsPEluamVjdE9wdGlvbnM+XG4pOiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBhbnkpID0+IHZvaWQ7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGEgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBAc3VtbWFyeSBBbGxvd3MgZm9yIHRoZSBpbmplY3Rpb24gb2YgYW4ge0BsaW5rIGluamVjdGFibGV9IGRlY29yYXRlZCBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIFRoZSBwcm9wZXJ0eSBtdXN0IGJlIHR5cGVkIGZvciB0aGUgcmVxdWVzdGVkIGRlcGVuZGVuY3kuIE9ubHkgY29uY3JldGUgY2xhc3NlcyBhcmUgc3VwcG9ydGVkOyBnZW5lcmljcyBhcmUgbm90LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjYXRlZ29yeSBEZWZhdWx0cyB0byB0aGUgY2xhc3MgbmFtZSBkZXJpdmVkIGZyb20gdGhlIHByb3BlcnR5IHR5cGUuIFVzZWZ1bCB3aGVuIG1pbmlmaWNhdGlvbiBvY2N1cnNcbiAqIGFuZCBuYW1lcyBhcmUgY2hhbmdlZCwgb3Igd2hlbiB5b3Ugd2FudCB0byB1cGNhc3QgdGhlIG9iamVjdCB0byBhIGRpZmZlcmVudCB0eXBlLlxuICogQHBhcmFtIHtQYXJ0aWFsPEluamVjdE9wdGlvbnM+fSBjZmc9e30gT3B0aW9uYWwgZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHRoZSBpbmplY3RhYmxlIGluc3RhbmNlIGJlZm9yZSBpdCdzIGluamVjdGVkLCBvciBhcmd1bWVudHMgdG8gcGFzcyB0aGUgY29uc3RydWN0b3Igd2hlbiBpbmplY3Rpbmcgb25EZW1hbmRcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSwgYW55KTogdm9pZH0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3QoXG4gIGNhdGVnb3J5OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgY2ZnOiBQYXJ0aWFsPEluamVjdE9wdGlvbnM+XG4pOiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBhbnkpID0+IHZvaWQ7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGEgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBAc3VtbWFyeSBBbGxvd3MgZm9yIHRoZSBpbmplY3Rpb24gb2YgYW4ge0BsaW5rIGluamVjdGFibGV9IGRlY29yYXRlZCBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIFRoZSBwcm9wZXJ0eSBtdXN0IGJlIHR5cGVkIGZvciB0aGUgcmVxdWVzdGVkIGRlcGVuZGVuY3kuIE9ubHkgY29uY3JldGUgY2xhc3NlcyBhcmUgc3VwcG9ydGVkOyBnZW5lcmljcyBhcmUgbm90LlxuICpcbiAqIEluamVjdGVkIHByb3BlcnRpZXMgc2hvdWxkIGJlIGRlc2NyaWJlZCBsaWtlIHNvOlxuICogPHByZT5cbiAqICAgICBjbGFzcyBDbGFzc05hbWUge1xuICogICAgICAgICAuLi5cbiAqXG4gKiAgICAgICAgIEBpbmplY3QoKVxuICogICAgICAgICBwcm9wZXJ0eU5hbWUhOiBJbmplY3RhYmxlQ2xhc3M7XG4gKlxuICogICAgICAgICAuLi5cbiAqICAgICB9XG4gKiA8L3ByZT5cbiAqXG4gKiB3aGVyZSBJbmplY3RhYmxlQ2xhc3MgaXMgdGhlIGNsYXNzIHlvdSB3YW50IHRvIGluamVjdC5cbiAqIE5vdGljZSB0aGUgdXNlIG9mICchOicgdG8gZW5zdXJlIHRoZSB0cmFuc3BpbGVyIHRoZSBwcm9wZXJ0eSB3aWxsIGJlIHNldCBvdXRzaWRlIHRoZSBjb25zdHJ1Y3RvciBidXQgd2lsbCBhbHdheXMgYmUgZGVmaW5lZC5cbiAqIEZvciBwcm9qZWN0cyB3aGVyZSBtaW5pZmljYXRpb24gb2NjdXJzLCB5b3Ugc2hvdWxkIHVzZSB0aGUgY2F0ZWdvcnkgcGFyYW0gdG8gZW5zdXJlIHRoZSBuYW1lIGlzIHRoZSBzYW1lIHRocm91Z2hvdXQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtjYXRlZ29yeV0gRGVmYXVsdHMgdG8gdGhlIGNsYXNzIG5hbWUgZGVyaXZlZCBmcm9tIHRoZSBwcm9wZXJ0eSB0eXBlLiBVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2NjdXJzXG4gKiBhbmQgbmFtZXMgYXJlIGNoYW5nZWQsIG9yIHdoZW4geW91IHdhbnQgdG8gdXBjYXN0IHRoZSBvYmplY3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAqIEBwYXJhbSB7UGFydGlhbDxJbmplY3RPcHRpb25zPn0gW2NmZz17fV0gT3B0aW9uYWwgZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHRoZSBpbmplY3RhYmxlIGluc3RhbmNlIGJlZm9yZSBpdCdzIGluamVjdGVkLCBvciBhcmd1bWVudHMgdG8gcGFzcyB0aGUgY29uc3RydWN0b3Igd2hlbiBpbmplY3Rpbmcgb25EZW1hbmRcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSwgYW55KTogdm9pZH0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IERlY29yYXRvclxuICogICBwYXJ0aWNpcGFudCBJbmplY3RhYmxlc1xuICpcbiAqICAgQ2xpZW50LT4+RGVjb3JhdG9yOiBAaW5qZWN0KClcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBHZXQgdHlwZSBmcm9tIHByb3BlcnR5XG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogRGVmaW5lIG1ldGFkYXRhXG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogRGVmaW5lIHByb3BlcnR5IGdldHRlclxuICpcbiAqICAgTm90ZSBvdmVyIERlY29yYXRvcjogV2hlbiBwcm9wZXJ0eSBhY2Nlc3NlZFxuICogICBDbGllbnQtPj5EZWNvcmF0b3I6IGFjY2VzcyBwcm9wZXJ0eVxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IENoZWNrIGlmIGluc3RhbmNlIGV4aXN0c1xuICogICBhbHQgSW5zdGFuY2UgZXhpc3RzIGluIFdlYWtNYXBcbiAqICAgICBEZWNvcmF0b3ItLT4+Q2xpZW50OiBSZXR1cm4gY2FjaGVkIGluc3RhbmNlXG4gKiAgIGVsc2UgTm8gaW5zdGFuY2VcbiAqICAgICBEZWNvcmF0b3ItPj5JbmplY3RhYmxlczogZ2V0KG5hbWUpXG4gKiAgICAgYWx0IEluamVjdGFibGUgZm91bmRcbiAqICAgICAgIEluamVjdGFibGVzLS0+PkRlY29yYXRvcjogUmV0dXJuIGluamVjdGFibGUgaW5zdGFuY2VcbiAqICAgICAgIG9wdCBIYXMgdHJhbnNmb3JtZXJcbiAqICAgICAgICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBDYWxsIHRyYW5zZm9ybWVyXG4gKiAgICAgICBlbmRcbiAqICAgICAgIERlY29yYXRvci0+PkRlY29yYXRvcjogU3RvcmUgaW4gV2Vha01hcFxuICogICAgICAgRGVjb3JhdG9yLS0+PkNsaWVudDogUmV0dXJuIGluc3RhbmNlXG4gKiAgICAgZWxzZSBObyBpbmplY3RhYmxlXG4gKiAgICAgICBEZWNvcmF0b3ItLT4+Q2xpZW50OiBUaHJvdyBlcnJvclxuICogICAgIGVuZFxuICogICBlbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdChcbiAgY2F0ZWdvcnk/OiBzeW1ib2wgfCBzdHJpbmcgfCBDb25zdHJ1Y3RvciB8IFBhcnRpYWw8SW5qZWN0T3B0aW9ucz4sXG4gIGNmZz86IFBhcnRpYWw8SW5qZWN0T3B0aW9ucz5cbikge1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoSW5qZWN0YWJsZXNLZXlzLklOSkVDVClcbiAgICAuZGVmaW5lKHsgZGVjb3JhdG9yOiBpbmplY3RCYXNlRGVjb3JhdG9yLCBhcmdzOiBbY2F0ZWdvcnksIGNmZ10gfSlcbiAgICAuYXBwbHkoKTtcbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIEEgbGlnaHR3ZWlnaHQgZGVwZW5kZW5jeSBpbmplY3Rpb24gbGlicmFyeSBmb3IgVHlwZVNjcmlwdCBhcHBsaWNhdGlvbnMuXG4gKiBAc3VtbWFyeSBBZGRzIGEgc2ltcGxlIEluamVjdGFibGVzIGltcGxlbWVudGF0aW9uIHRvIGNyZWF0ZSBzaW5nbGV0b24gaW5zdGFuY2VzIG9mIGFuIG9iamVjdFxuICogYW5kIGVhc2lseSBpbmplY3QgaXQgaW50byBvdGhlciBvYmplY3RzLiBQcm92aWRlcyBkZWNvcmF0b3JzIGZvciBtYXJraW5nIGNsYXNzZXMgYXMgaW5qZWN0YWJsZVxuICogYW5kIGZvciBpbmplY3RpbmcgZGVwZW5kZW5jaWVzIGludG8gY2xhc3MgcHJvcGVydGllcy5cbiAqXG4gKiBAbW9kdWxlIGluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5cbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vSW5qZWN0YWJsZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3JlZ2lzdHJ5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3VycmVudCB2ZXJzaW9uIG9mIHRoZSBpbmplY3RhYmxlLWRlY29yYXRvcnMgbGlicmFyeS5cbiAqIEBzdW1tYXJ5IERlZmluZWQgb24gbGlicmFyeSBidWlsZC4gSG9sZHMgdGhlIGxpYnJhcnkncyBjdXJyZW50IHZlcnNpb24gc3RyaW5nLlxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuXG5NZXRhZGF0YS5yZWdpc3RlckxpYnJhcnkoXCJAZGVjYWYtdHMvaW5qZWN0YWJsZS1kZWNvcmF0b3JzXCIsIFZFUlNJT04pO1xuIl0sIm5hbWVzIjpbIkRlY29yYXRpb24iLCJNZXRhZGF0YSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0lBRUE7Ozs7Ozs7O0lBUUc7QUFDVSxVQUFBLGVBQWUsR0FBRztJQUM3QixJQUFBLE9BQU8sRUFBRSxZQUFZO0lBQ3JCLElBQUEsVUFBVSxFQUFFLFlBQVk7SUFDeEIsSUFBQSxNQUFNLEVBQUUsUUFBUTs7SUFHbEI7Ozs7O0lBS0c7QUFDVSxVQUFBLHdCQUF3QixHQUFxQjtJQUN4RCxJQUFBLFNBQVMsRUFBRSxJQUFJOztJQUdqQjs7Ozs7SUFLRztBQUNJLFVB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
|
|
541
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5qZWN0YWJsZS1kZWNvcmF0b3JzLmNqcyIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbnN0YW50cy50cyIsIi4uL3NyYy91dGlscy50cyIsIi4uL3NyYy9yZWdpc3RyeS50cyIsIi4uL3NyYy9JbmplY3RhYmxlcy50cyIsIi4uL3NyYy9kZWNvcmF0b3JzLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGVDb25maWcgfSBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnN0YW50cyB1c2VkIGZvciByZWZsZWN0aW9uIG1ldGFkYXRhIGtleXMgaW4gdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uIHN5c3RlbS5cbiAqIEBzdW1tYXJ5IEluamVjdGFibGVzIFJlZmxlY3Rpb24ga2V5cyB1c2VkIHRvIHN0b3JlIGFuZCByZXRyaWV2ZSBtZXRhZGF0YSBhYm91dCBpbmplY3RhYmxlIGNsYXNzZXMgYW5kIHByb3BlcnRpZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVGTEVDVCBSZWZsZWN0aW9uIGluamVjdGFibGVzIGJhc2Uga2V5IHByZWZpeCBmb3IgYWxsIG1ldGFkYXRhIGtleXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJTkpFQ1RBQkxFIFJlZmxlY3Rpb24ga2V5IHN1ZmZpeCBmb3IgbWFya2luZyBhIGNsYXNzIGFzIGluamVjdGFibGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJTkpFQ1QgUmVmbGVjdGlvbiBrZXkgc3VmZml4IGZvciBtYXJraW5nIGEgcHJvcGVydHkgZm9yIGluamVjdGlvblxuICogQGNvbnN0IEluamVjdGFibGVzS2V5c1xuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IEluamVjdGFibGVzS2V5cyA9IHtcbiAgUkVGTEVDVDogXCJpbmplY3QuZGIuXCIsXG4gIElOSkVDVEFCTEU6IFwiaW5qZWN0YWJsZVwiLFxuICBJTkpFQ1Q6IFwiaW5qZWN0XCIsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gYXBwbGllZCBieSB0aGUgQGluamVjdGFibGUgZGVjb3JhdG9yIHdoZW4gbm9uZSBpcyBwcm92aWRlZC5cbiAqIEBzdW1tYXJ5IFNldHMgc2Vuc2libGUgZGVmYXVsdHMgc3VjaCBhcyBzaW5nbGV0b24gbGlmZWN5Y2xlIGZvciBuZXdseSByZWdpc3RlcmVkIGluamVjdGFibGVzLlxuICogQGNvbnN0IERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZ1xuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZzogSW5qZWN0YWJsZUNvbmZpZyA9IHtcbiAgc2luZ2xldG9uOiB0cnVlLFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUmVmbGVjdGlvbiBtZXRhZGF0YSBrZXkgZm9yIGFjY2Vzc2luZyBUeXBlU2NyaXB0IHR5cGUgaW5mb3JtYXRpb24uXG4gKiBAc3VtbWFyeSBIb2xkcyB0aGUga2V5IGZvciByZXRyaWV2aW5nIHRoZSBkZXNpZ24gdHlwZSBmcm9tIFR5cGVTY3JpcHQncyByZWZsZWN0aW9uIG1ldGFkYXRhLlxuICogQGNvbnN0IFR5cGVLZXlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBUeXBlS2V5ID0gXCJkZXNpZ246dHlwZVwiO1xuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZXNLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlcyBhIGZ1bGx5IHF1YWxpZmllZCByZWZsZWN0aW9uIG1ldGFkYXRhIGtleS5cbiAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIHJlZmxlY3Rpb24ga2V5IGZvciBpbmplY3RhYmxlcyBieSBwcmVmaXhpbmcgdGhlIHByb3ZpZGVkIGtleSB3aXRoIHRoZSBiYXNlIHJlZmxlY3Rpb24ga2V5LlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IHRvIGJlIHByZWZpeGVkXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBmdWxseSBxdWFsaWZpZWQgcmVmbGVjdGlvbiBrZXlcbiAqIEBmdW5jdGlvbiBnZXRJbmplY3RLZXlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRJbmplY3RLZXkgPSAoa2V5OiBzdHJpbmcpID0+IEluamVjdGFibGVzS2V5cy5SRUZMRUNUICsga2V5O1xuIiwiaW1wb3J0IHsgSW5qZWN0YWJsZURlZiwgSW5qZWN0YWJsZU9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZXNLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXRJbmplY3RLZXkgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBUeXBlIHJlcHJlc2VudGluZyBlaXRoZXIgYSBjbGFzcyBjb25zdHJ1Y3RvciBvciBhbiBpbnN0YW5jZS5cbiAqIEBzdW1tYXJ5IERlZmluZXMgYW4gSW5qZWN0YWJsZSB0eXBlIHRoYXQgY2FuIGJlIGVpdGhlciBhIGNsYXNzIGNvbnN0cnVjdG9yIG9yIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MuXG4gKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiB0aGUgaW5qZWN0YWJsZSBvYmplY3RcbiAqIEB0eXBlZGVmIHtmdW5jdGlvbihhbnkpOiBUIHwgVH0gSW5qZWN0YWJsZVxuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgSW5qZWN0YWJsZTxUPiA9IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IFQgfSB8IFQ7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnRyYWN0IGZvciBhIHJlZ2lzdHJ5IHRoYXQgbWFuYWdlcyBpbmplY3RhYmxlIG9iamVjdHMuXG4gKiBAc3VtbWFyeSBJbnRlcmZhY2UgZm9yIGFuIGluamVjdGFibGUgcmVnaXN0cnkgdGhhdCBwcm92aWRlcyBtZXRob2RzIGZvciByZXRyaWV2aW5nLCByZWdpc3RlcmluZywgYW5kIGJ1aWxkaW5nIGluamVjdGFibGUgb2JqZWN0cy5cbiAqIEB0ZW1wbGF0ZSBUIFR5cGUgcGFyYW1ldGVyIHVzZWQgaW4gdGhlIGludGVyZmFjZSBtZXRob2RzXG4gKiBAaW50ZXJmYWNlIEluamVjdGFibGVzUmVnaXN0cnlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5qZWN0YWJsZXNSZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRmV0Y2hlcyBhbiBpbmplY3RhYmxlIGluc3RhbmNlIGJ5IGl0cyByZWdpc3RlcmVkIG5hbWUuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyBhbiB7QGxpbmsgSW5qZWN0YWJsZX0gZnJvbSB0aGUgcmVnaXN0cnkgYnkgbmFtZSwgb3B0aW9uYWxseSBwYXNzaW5nIGNvbnN0cnVjdG9yIGFyZ3VtZW50cy5cbiAgICogQHRlbXBsYXRlIFQgVHlwZSBvZiB0aGUgaW5qZWN0YWJsZSBvYmplY3QgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHtzeW1ib2x9IG5hbWUgVGhlIHJlZ2lzdGVyZWQgbmFtZSBvZiB0aGUgaW5qZWN0YWJsZSB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIENvbnN0cnVjdG9yIGFyZ3VtZW50cyB0byBwYXNzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgaW5qZWN0YWJsZVxuICAgKiBAcmV0dXJuIHtJbmplY3RhYmxlPFQ+IHwgdW5kZWZpbmVkfSBUaGUgaW5qZWN0YWJsZSBpbnN0YW5jZSBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kXG4gICAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gICAqL1xuICBnZXQ8VD4oXG4gICAgbmFtZTogc3ltYm9sIHwgc3RyaW5nIHwgeyBuZXcgKC4uLmFyZ3M6IGFueVtdKTogVCB9LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFQgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBZGRzIGEgY2xhc3Mgb3Igb2JqZWN0IHRvIHRoZSBpbmplY3RhYmxlIHJlZ2lzdHJ5LlxuICAgKiBAc3VtbWFyeSBSZWdpc3RlcnMgYW4gaW5qZWN0YWJsZSBjb25zdHJ1Y3RvciBvciBpbnN0YW5jZSB3aXRoIHRoZSByZWdpc3RyeSwgbWFraW5nIGl0IGF2YWlsYWJsZSBmb3IgaW5qZWN0aW9uLlxuICAgKiBAdGVtcGxhdGUgVCBUeXBlIG9mIHRoZSBpbmplY3RhYmxlIG9iamVjdCB0byByZWdpc3RlclxuICAgKiBAcGFyYW0ge0luamVjdGFibGU8VD59IGNvbnN0cnVjdG9yIFRoZSBjbGFzcyBjb25zdHJ1Y3RvciBvciBvYmplY3QgaW5zdGFuY2UgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgcmVnaXN0cmF0aW9uIChjYXRlZ29yeSwgc2luZ2xldG9uIGZsYWcsIGV0Yy4pXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gICAqL1xuICByZWdpc3RlcjxUPihcbiAgICBjb25zdHJ1Y3RvcjogSW5qZWN0YWJsZTxUPixcbiAgICBjYXRlZ29yeTogc3ltYm9sIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM6IEluamVjdGFibGVPcHRpb25zPFQ+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIGFuIGluamVjdGFibGUgY2xhc3MuXG4gICAqIEBzdW1tYXJ5IEluc3RhbnRpYXRlcyBhbiBpbmplY3RhYmxlIGNsYXNzIHVzaW5nIGl0cyBjb25zdHJ1Y3RvciBhbmQgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICogQHRlbXBsYXRlIFQgVHlwZSBvZiB0aGUgb2JqZWN0IHRvIGJ1aWxkXG4gICAqIEBwYXJhbSB7c3ltYm9sfSBuYW1lIE9iamVjdCBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBpbmplY3RhYmxlIHRvIGJ1aWxkXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgQ29uc3RydWN0b3IgYXJndW1lbnRzIHRvIHBhc3Mgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBpbmplY3RhYmxlXG4gICAqIEByZXR1cm4ge1R9IFRoZSBuZXdseSBjcmVhdGVkIGluc3RhbmNlXG4gICAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gICAqL1xuICBidWlsZDxUPihuYW1lOiBzeW1ib2wsIC4uLmFyZ3M6IGFueVtdKTogVDtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSW5qZWN0YWJsZXNSZWdpc3RyeSBpbnRlcmZhY2UuXG4gKiBAc3VtbWFyeSBIb2xkcyB0aGUgdmFyaW91cyB7QGxpbmsgSW5qZWN0YWJsZX1zIGluIGEgY2FjaGUgYW5kIHByb3ZpZGVzIG1ldGhvZHMgdG8gcmVnaXN0ZXIsIHJldHJpZXZlLCBhbmQgYnVpbGQgdGhlbS5cbiAqIEB0ZW1wbGF0ZSBUIFR5cGUgcGFyYW1ldGVyIHVzZWQgaW4gdGhlIGNsYXNzIG1ldGhvZHNcbiAqXG4gKiBAY2xhc3MgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wXG4gKiBAaW1wbGVtZW50cyBJbmplY3RhYmxlc1JlZ2lzdHJ5XG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgbmV3IHJlZ2lzdHJ5XG4gKiBjb25zdCByZWdpc3RyeSA9IG5ldyBJbmplY3RhYmxlUmVnaXN0cnlJbXAoKTtcbiAqXG4gKiAvLyBSZWdpc3RlciBhIGNsYXNzXG4gKiBjbGFzcyBNeVNlcnZpY2Uge1xuICogICBkb1NvbWV0aGluZygpIHtcbiAqICAgICByZXR1cm4gJ0hlbGxvIFdvcmxkJztcbiAqICAgfVxuICogfVxuICogcmVnaXN0cnkucmVnaXN0ZXIoTXlTZXJ2aWNlLCAnTXlTZXJ2aWNlJywgdHJ1ZSk7XG4gKlxuICogLy8gR2V0IHRoZSBpbnN0YW5jZVxuICogY29uc3Qgc2VydmljZSA9IHJlZ2lzdHJ5LmdldCgnTXlTZXJ2aWNlJyk7XG4gKiBzZXJ2aWNlLmRvU29tZXRoaW5nKCk7IC8vICdIZWxsbyBXb3JsZCdcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBSZWdpc3RyeVxuICpcbiAqICAgQ2xpZW50LT4+UmVnaXN0cnk6IHJlZ2lzdGVyKE15U2VydmljZSlcbiAqICAgUmVnaXN0cnktPj5SZWdpc3RyeTogU3RvcmUgaW4gY2FjaGVcbiAqXG4gKiAgIENsaWVudC0+PlJlZ2lzdHJ5OiBnZXQoXCJNeVNlcnZpY2VcIilcbiAqICAgYWx0IEluc3RhbmNlIGV4aXN0cyBhbmQgaXMgc2luZ2xldG9uXG4gKiAgICAgUmVnaXN0cnktLT4+Q2xpZW50OiBSZXR1cm4gY2FjaGVkIGluc3RhbmNlXG4gKiAgIGVsc2UgTm8gaW5zdGFuY2Ugb3Igbm90IHNpbmdsZXRvblxuICogICAgIFJlZ2lzdHJ5LT4+UmVnaXN0cnk6IGJ1aWxkKG5hbWUpXG4gKiAgICAgUmVnaXN0cnktLT4+Q2xpZW50OiBSZXR1cm4gbmV3IGluc3RhbmNlXG4gKiAgIGVuZFxuICovXG5leHBvcnQgY2xhc3MgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wIGltcGxlbWVudHMgSW5qZWN0YWJsZXNSZWdpc3RyeSB7XG4gIHByaXZhdGUgY2FjaGU6IFJlY29yZDxzeW1ib2wsIEluamVjdGFibGVEZWY+ID0ge307XG5cbiAgaGFzPFQ+KG5hbWU6IHN5bWJvbCB8IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IFQgfSk6IGJvb2xlYW4ge1xuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzeW1ib2xcIikgcmV0dXJuIG5hbWUgaW4gdGhpcy5jYWNoZTtcbiAgICByZXR1cm4gU3ltYm9sLmZvcihuYW1lLnRvU3RyaW5nKCkpIGluIHRoaXMuY2FjaGU7XG4gIH1cblxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIGdldDxUPihcbiAgICBuYW1lOiBzeW1ib2wgfCBzdHJpbmcgfCB7IG5ldyAoLi4uYXJnczogYW55W10pOiBUIH0sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN0cmluZ1wiKSBuYW1lID0gU3ltYm9sLmZvcihuYW1lKTtcbiAgICBpZiAodHlwZW9mIG5hbWUgIT09IFwic3ltYm9sXCIpIHtcbiAgICAgIGNvbnN0IG1ldGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICBnZXRJbmplY3RLZXkoSW5qZWN0YWJsZXNLZXlzLklOSkVDVEFCTEUpLFxuICAgICAgICBuYW1lXG4gICAgICApO1xuICAgICAgbmFtZSA9IChtZXRhPy5zeW1ib2wgYXMgc3ltYm9sKSB8fCBTeW1ib2wuZm9yKG5hbWUudG9TdHJpbmcoKSk7XG4gICAgfVxuICAgIGlmICghbmFtZSkgdGhyb3cgbmV3IEVycm9yKGBJbmplY3RhYmxlICR7bmFtZX0gbm90IGZvdW5kYCk7XG5cbiAgICBpZiAoISgobmFtZSBhcyBzeW1ib2wpIGluIHRoaXMuY2FjaGUpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGVbbmFtZV07XG4gICAgaWYgKCFjYWNoZS5vcHRpb25zLnNpbmdsZXRvbiAmJiAhY2FjaGUuaW5zdGFuY2UpXG4gICAgICByZXR1cm4gdGhpcy5idWlsZDxUPihuYW1lLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gY2FjaGUuaW5zdGFuY2UgfHwgdGhpcy5idWlsZDxUPihuYW1lLCAuLi5hcmdzKTtcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIHJlZ2lzdGVyPFQ+KFxuICAgIG9iajogSW5qZWN0YWJsZTxUPixcbiAgICBjYXRlZ29yeTogc3ltYm9sIHwgdW5kZWZpbmVkLFxuICAgIG9wdGlvbnM6IEluamVjdGFibGVPcHRpb25zPFQ+LFxuICAgIGZvcmNlOiBib29sZWFuID0gZmFsc2VcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgY2FzdE9iajogUmVjb3JkPHN0cmluZywgYW55PiA9IG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuXG4gICAgY29uc3QgY29uc3RydWN0b3IgPSAhY2FzdE9iai5uYW1lICYmIGNhc3RPYmouY29uc3RydWN0b3I7XG4gICAgaWYgKHR5cGVvZiBjYXN0T2JqICE9PSBcImZ1bmN0aW9uXCIgJiYgIWNvbnN0cnVjdG9yKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW5qZWN0YWJsZSByZWdpc3RlcmluZyBmYWlsZWQuIE1pc3NpbmcgQ2xhc3MgbmFtZSBvciBjb25zdHJ1Y3RvcmBcbiAgICAgICk7XG5cbiAgICBjb25zdCBuYW1lID0gY2F0ZWdvcnkgfHwgU3ltYm9sLmZvcigob2JqIGFzIGFueSkudG9TdHJpbmcoKSk7XG5cbiAgICBpZiAoIXRoaXMuY2FjaGVbbmFtZV0gfHwgZm9yY2UpXG4gICAgICB0aGlzLmNhY2hlW25hbWVdID0ge1xuICAgICAgICBpbnN0YW5jZTogb3B0aW9ucy5zaW5nbGV0b24gJiYgY29uc3RydWN0b3IgPyBvYmogOiB1bmRlZmluZWQsXG4gICAgICAgIGNvbnN0cnVjdG9yOiAhY29uc3RydWN0b3IgPyBvYmogOiAob2JqIGFzIGFueSkuY29uc3RydWN0b3IsXG4gICAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICB9O1xuICB9XG4gIC8qKlxuICAgKiBAaW5oZXJpdERvY1xuICAgKi9cbiAgYnVpbGQ8VD4obmFtZTogc3ltYm9sLCAuLi5hcmdzOiBhbnlbXSk6IFQge1xuICAgIGNvbnN0IHsgY29uc3RydWN0b3IsIG9wdGlvbnMgfSA9IHRoaXMuY2FjaGVbbmFtZV07XG4gICAgbGV0IGluc3RhbmNlOiBUO1xuICAgIHRyeSB7XG4gICAgICBpbnN0YW5jZSA9IG5ldyBjb25zdHJ1Y3RvciguLi5hcmdzKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBmYWlsZWQgdG8gYnVpbGQgJHtuYW1lLnRvU3RyaW5nKCl9IHdpdGggYXJncyAke2FyZ3N9OiAke2V9YFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuc2luZ2xldG9uKSB7XG4gICAgICB0aGlzLmNhY2hlW25hbWVdLmluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmNhbGxiYWNrKSBpbnN0YW5jZSA9IG9wdGlvbnMuY2FsbGJhY2soaW5zdGFuY2UsIC4uLmFyZ3MpO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgSW5qZWN0YWJsZSxcbiAgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wLFxuICBJbmplY3RhYmxlc1JlZ2lzdHJ5LFxufSBmcm9tIFwiLi9yZWdpc3RyeVwiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZU9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDZW50cmFsIHJlZ2lzdHJ5IGZvciBtYW5hZ2luZyBpbmplY3RhYmxlIGRlcGVuZGVuY2llcy5cbiAqIEBzdW1tYXJ5IFN0YXRpYyBjbGFzcyBob2xkaW5nIHRoZSBhY2Nlc3MgdG8gdGhlIGluamVjdGFibGVzIGZ1bmN0aW9ucy4gUHJvdmlkZXMgbWV0aG9kcyBmb3IgcmVnaXN0ZXJpbmcsXG4gKiByZXRyaWV2aW5nLCBhbmQgYnVpbGRpbmcgaW5qZWN0YWJsZSBvYmplY3RzLlxuICogQHRlbXBsYXRlIFQgVHlwZSBvZiB0aGUgaW5qZWN0YWJsZSBvYmplY3RcbiAqXG4gKiBAY2xhc3MgSW5qZWN0YWJsZXNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRGVmaW5lIGFuIGluamVjdGFibGUgY2xhc3NcbiAqIEBpbmplY3RhYmxlKClcbiAqIGNsYXNzIE15U2VydmljZSB7XG4gKiAgIGRvU29tZXRoaW5nKCkge1xuICogICAgIHJldHVybiAnSGVsbG8gV29ybGQnO1xuICogICB9XG4gKiB9XG4gKlxuICogLy8gSW5qZWN0IHRoZSBzZXJ2aWNlIGludG8gYW5vdGhlciBjbGFzc1xuICogY2xhc3MgTXlDb21wb25lbnQge1xuICogICBAaW5qZWN0KClcbiAqICAgcHJpdmF0ZSBzZXJ2aWNlITogTXlTZXJ2aWNlO1xuICpcbiAqICAgdXNlU2VydmljZSgpIHtcbiAqICAgICByZXR1cm4gdGhpcy5zZXJ2aWNlLmRvU29tZXRoaW5nKCk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBJbmplY3RhYmxlc1xuICogICBwYXJ0aWNpcGFudCBSZWdpc3RyeVxuICpcbiAqICAgQ2xpZW50LT4+SW5qZWN0YWJsZXM6IHJlZ2lzdGVyKE15U2VydmljZSlcbiAqICAgSW5qZWN0YWJsZXMtPj5SZWdpc3RyeTogcmVnaXN0ZXIoTXlTZXJ2aWNlKVxuICogICBSZWdpc3RyeS0tPj5JbmplY3RhYmxlczogdm9pZFxuICpcbiAqICAgQ2xpZW50LT4+SW5qZWN0YWJsZXM6IGdldChcIk15U2VydmljZVwiKVxuICogICBJbmplY3RhYmxlcy0+PlJlZ2lzdHJ5OiBnZXQoXCJNeVNlcnZpY2VcIilcbiAqICAgUmVnaXN0cnktLT4+SW5qZWN0YWJsZXM6IE15U2VydmljZSBpbnN0YW5jZVxuICogICBJbmplY3RhYmxlcy0tPj5DbGllbnQ6IE15U2VydmljZSBpbnN0YW5jZVxuICovXG5leHBvcnQgY2xhc3MgSW5qZWN0YWJsZXMge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEhvbGRzIHRoZSBhY3RpdmUgcmVnaXN0cnkgaW1wbGVtZW50YXRpb24gdXNlZCBieSB0aGUgSW5qZWN0YWJsZXMgZmFjYWRlLlxuICAgKiBAc3VtbWFyeSBJbnRlcm5hbCBzdGF0aWMgcmVmZXJlbmNlIHRoYXQgY2FuIGJlIHN3YXBwZWQgdmlhIHNldFJlZ2lzdHJ5IHRvIGN1c3RvbWl6ZSBob3cgaW5qZWN0YWJsZXMgYXJlIHN0b3JlZCBhbmQgcmV0cmlldmVkLlxuICAgKiBAdHlwZSB7SW5qZWN0YWJsZXNSZWdpc3RyeSB8IHVuZGVmaW5lZH1cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGFjdGluZ0luamVjdGFibGVzUmVnaXN0cnk/OiBJbmplY3RhYmxlc1JlZ2lzdHJ5ID0gdW5kZWZpbmVkO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRmV0Y2hlcyBhbiBpbmplY3RhYmxlIGluc3RhbmNlIGJ5IGl0cyByZWdpc3RlcmVkIG5hbWUuXG4gICAqIEBzdW1tYXJ5IFJldHJpZXZlcyB0aGUgbmFtZWQge0BsaW5rIEluamVjdGFibGV9IGZyb20gdGhlIHJlZ2lzdHJ5LiBJZiB0aGUgaW5qZWN0YWJsZSBpcyBhIHNpbmdsZXRvbixcbiAgICogcmV0dXJucyB0aGUgZXhpc3RpbmcgaW5zdGFuY2UuIE90aGVyd2lzZSwgY3JlYXRlcyBhIG5ldyBpbnN0YW5jZS5cbiAgICogQHRlbXBsYXRlIFQgVHlwZSBvZiB0aGUgaW5qZWN0YWJsZSBvYmplY3QgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIHJlZ2lzdGVyZWQgbmFtZSBvZiB0aGUgaW5qZWN0YWJsZSB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIENvbnN0cnVjdG9yIGFyZ3VtZW50cyB0byBwYXNzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgaW5qZWN0YWJsZVxuICAgKiBAcmV0dXJuIHtJbmplY3RhYmxlPFQ+IHwgdW5kZWZpbmVkfSBUaGUgaW5qZWN0YWJsZSBpbnN0YW5jZSBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kXG4gICAqL1xuICBzdGF0aWMgZ2V0PFQ+KFxuICAgIG5hbWU6IHN5bWJvbCB8IHN0cmluZyB8IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IFQgfSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gSW5qZWN0YWJsZXMuZ2V0UmVnaXN0cnkoKS5nZXQobmFtZSwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFkZHMgYSBjbGFzcyBvciBvYmplY3QgdG8gdGhlIGluamVjdGFibGUgcmVnaXN0cnkuXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhbiBpbmplY3RhYmxlIGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlIHdpdGggdGhlIHJlZ2lzdHJ5LCBtYWtpbmcgaXQgYXZhaWxhYmxlIGZvciBpbmplY3Rpb24uXG4gICAqIEB0ZW1wbGF0ZSBUIFR5cGUgb2YgdGhlIGluamVjdGFibGUgb2JqZWN0IHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7SW5qZWN0YWJsZTxUPn0gY29uc3RydWN0b3IgVGhlIGNsYXNzIGNvbnN0cnVjdG9yIG9yIG9iamVjdCBpbnN0YW5jZSB0byByZWdpc3RlclxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciByZWdpc3RyYXRpb24gKGNhdGVnb3J5LCBzaW5nbGV0b24gZmxhZywgZXRjLilcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyByZWdpc3RlcjxUPihjb25zdHJ1Y3RvcjogSW5qZWN0YWJsZTxUPiwgLi4uYXJnczogYW55W10pOiB2b2lkIHtcbiAgICByZXR1cm4gSW5qZWN0YWJsZXMuZ2V0UmVnaXN0cnkoKS5yZWdpc3RlcihcbiAgICAgIGNvbnN0cnVjdG9yLFxuICAgICAgLi4uKGFyZ3MgYXMgW3N5bWJvbCwgSW5qZWN0YWJsZU9wdGlvbnM8VD5dKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgYW4gaW5qZWN0YWJsZSBjbGFzcy5cbiAgICogQHN1bW1hcnkgSW5zdGFudGlhdGVzIGFuIGluamVjdGFibGUgY2xhc3MgdXNpbmcgaXRzIGNvbnN0cnVjdG9yIGFuZCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgKiBAdGVtcGxhdGUgVCBUeXBlIG9mIHRoZSBvYmplY3QgdG8gYnVpbGRcbiAgICogQHBhcmFtIHtzeW1ib2x9IG5hbWUgc3ltYm9sIHJlZmVyZW5jaW5nIHRoZSBpbmplY3RhYmxlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgQ29uc3RydWN0b3IgYXJndW1lbnRzIHRvIHBhc3Mgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBpbmplY3RhYmxlXG4gICAqIEByZXR1cm4ge1R9IFRoZSBuZXdseSBjcmVhdGVkIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgYnVpbGQ8VD4obmFtZTogc3ltYm9sLCAuLi5hcmdzOiBhbnlbXSk6IFQge1xuICAgIHJldHVybiBJbmplY3RhYmxlcy5nZXRSZWdpc3RyeSgpLmJ1aWxkKG5hbWUsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXBsYWNlcyB0aGUgY3VycmVudCByZWdpc3RyeSBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHN1bW1hcnkgU2V0cyBhIG5ldyB7QGxpbmsgSW5qZWN0YWJsZXNSZWdpc3RyeX0gaW1wbGVtZW50YXRpb24sIGFsbG93aW5nIGZvciBjdXN0b20gcmVnaXN0cnkgYmVoYXZpb3IuXG4gICAqIEBwYXJhbSB7SW5qZWN0YWJsZXNSZWdpc3RyeX0gb3BlcmF0aW9uc1JlZ2lzdHJ5IFRoZSBuZXcgaW1wbGVtZW50YXRpb24gb2YgUmVnaXN0cnkgdG8gdXNlXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgc2V0UmVnaXN0cnkob3BlcmF0aW9uc1JlZ2lzdHJ5OiBJbmplY3RhYmxlc1JlZ2lzdHJ5KTogdm9pZCB7XG4gICAgSW5qZWN0YWJsZXMuYWN0aW5nSW5qZWN0YWJsZXNSZWdpc3RyeSA9IG9wZXJhdGlvbnNSZWdpc3RyeTtcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgY3VycmVudCByZWdpc3RyeSBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgY3VycmVudCB7QGxpbmsgSW5qZWN0YWJsZXNSZWdpc3RyeX0gb3IgY3JlYXRlcyBhIGRlZmF1bHQgb25lIGlmIG5vbmUgZXhpc3RzLlxuICAgKiBAcmV0dXJuIHtJbmplY3RhYmxlc1JlZ2lzdHJ5fSBUaGUgY3VycmVudCByZWdpc3RyeSBpbnN0YW5jZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UmVnaXN0cnkoKTogSW5qZWN0YWJsZXNSZWdpc3RyeSB7XG4gICAgaWYgKCFJbmplY3RhYmxlcy5hY3RpbmdJbmplY3RhYmxlc1JlZ2lzdHJ5KVxuICAgICAgSW5qZWN0YWJsZXMuYWN0aW5nSW5qZWN0YWJsZXNSZWdpc3RyeSA9IG5ldyBJbmplY3RhYmxlUmVnaXN0cnlJbXAoKTtcbiAgICByZXR1cm4gSW5qZWN0YWJsZXMuYWN0aW5nSW5qZWN0YWJsZXNSZWdpc3RyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2xlYXJzIGFsbCByZWdpc3RlcmVkIGluamVjdGFibGVzLlxuICAgKiBAc3VtbWFyeSBSZXNldHMgdGhlIHJlZ2lzdHJ5IHRvIGEgY2xlYW4gc3RhdGUgYnkgY3JlYXRpbmcgYSBuZXcgZW1wdHkgcmVnaXN0cnkgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgcmVzZXQoKTogdm9pZCB7XG4gICAgSW5qZWN0YWJsZXMuc2V0UmVnaXN0cnkobmV3IEluamVjdGFibGVSZWdpc3RyeUltcCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVtb3ZlcyBzcGVjaWZpYyBpbmplY3RhYmxlcyBmcm9tIHRoZSByZWdpc3RyeSBiYXNlZCBvbiBhIHBhdHRlcm4uXG4gICAqIEBzdW1tYXJ5IFNlbGVjdGl2ZWx5IHJlc2V0cyB0aGUgcmVnaXN0cnkgYnkgcmVtb3Zpbmcgb25seSB0aGUgaW5qZWN0YWJsZXMgd2hvc2UgbmFtZXMgbWF0Y2ggdGhlIHByb3ZpZGVkIHBhdHRlcm4uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgUmVnRXhwfSBtYXRjaCBBIHN0cmluZyBvciByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiB0byBtYXRjaCBhZ2FpbnN0IGluamVjdGFibGUgbmFtZXNcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBzZWxlY3RpdmVSZXNldChtYXRjaDogc3RyaW5nIHwgUmVnRXhwKTogdm9pZCB7XG4gICAgY29uc3QgcmVnZXhwID0gdHlwZW9mIG1hdGNoID09PSBcInN0cmluZ1wiID8gbmV3IFJlZ0V4cChtYXRjaCkgOiBtYXRjaDtcbiAgICAoSW5qZWN0YWJsZXMuYWN0aW5nSW5qZWN0YWJsZXNSZWdpc3RyeSBhcyBhbnkpW1wiY2FjaGVcIl0gPSBPYmplY3QuZW50cmllcyhcbiAgICAgIChJbmplY3RhYmxlcy5hY3RpbmdJbmplY3RhYmxlc1JlZ2lzdHJ5IGFzIGFueSlbXCJjYWNoZVwiXVxuICAgICkucmVkdWNlKChhY2N1bTogUmVjb3JkPHN0cmluZywgYW55PiwgW2tleSwgdmFsXSkgPT4ge1xuICAgICAgaWYgKCFrZXkubWF0Y2gocmVnZXhwKSkgYWNjdW1ba2V5XSA9IHZhbDtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCB7fSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZywgSW5qZWN0YWJsZXNLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlcyB9IGZyb20gXCIuL0luamVjdGFibGVzXCI7XG5pbXBvcnQgeyBnZXRJbmplY3RLZXkgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZU1ldGFkYXRhLCBJbnN0YW5jZUNhbGxiYWNrIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERlY29yYXRpb24sIE1ldGFkYXRhLCBwcm9wIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIEBpbmplY3RhYmxlIGRlY29yYXRvci5cbiAqIEBzdW1tYXJ5IENvbnRyb2xzIGxpZmVjeWNsZSAoc2luZ2xldG9uIHZzIG9uLWRlbWFuZCkgYW5kIGFuIG9wdGlvbmFsIGluc3RhbmNlIHRyYW5zZm9ybWF0aW9uIGNhbGxiYWNrIGV4ZWN1dGVkIHBvc3QtY29uc3RydWN0aW9uLlxuICogQHRlbXBsYXRlIFQgVGhlIGluc3RhbmNlIHR5cGUgYWZmZWN0ZWQgYnkgdGhlIGNhbGxiYWNrIHdoZW4gcHJvdmlkZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHNpbmdsZXRvbiBXaGVuIHRydWUsIGEgc2luZ2xlIGluc3RhbmNlIGlzIHNoYXJlZCAoc2luZ2xldG9uKS4gV2hlbiBmYWxzZSwgaW5zdGFuY2VzIGFyZSBjcmVhdGVkIG9uIGRlbWFuZC5cbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2VDYWxsYmFjazxUPn0gW2NhbGxiYWNrXSBPcHRpb25hbCBob29rIHRvIHRyYW5zZm9ybSB0aGUgaW5zdGFuY2UgYWZ0ZXIgaXQgaXMgY29uc3RydWN0ZWQuXG4gKiBAdHlwZWRlZiBJbmplY3RhYmxlQ29uZmlnXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBJbmplY3RhYmxlQ29uZmlnID0ge1xuICBzaW5nbGV0b246IGJvb2xlYW47XG4gIGNhbGxiYWNrPzogSW5zdGFuY2VDYWxsYmFjazxhbnk+O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdGFibGVCYXNlRGVjb3JhdG9yKFxuICBjYXRlZ29yeT86IHN0cmluZyB8IENvbnN0cnVjdG9yIHwgUGFydGlhbDxJbmplY3RhYmxlQ29uZmlnPixcbiAgY2ZnPzogUGFydGlhbDxJbmplY3RhYmxlQ29uZmlnPlxuKSB7XG4gIGNmZyA9XG4gICAgY2ZnIHx8XG4gICAgKHR5cGVvZiBjYXRlZ29yeSA9PT0gXCJvYmplY3RcIlxuICAgICAgPyBPYmplY3QuYXNzaWduKGNhdGVnb3J5IGFzIFJlY29yZDxhbnksIGFueT4sIERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZylcbiAgICAgIDogRGVmYXVsdEluamVjdGFibGVzQ29uZmlnKTtcbiAgY2F0ZWdvcnkgPVxuICAgIHR5cGVvZiBjYXRlZ29yeSA9PT0gXCJvYmplY3RcIlxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogdHlwZW9mIGNhdGVnb3J5ID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gY2F0ZWdvcnlcbiAgICAgICAgOiB0eXBlb2YgY2F0ZWdvcnkgPT09IFwiZnVuY3Rpb25cIiAmJiBjYXRlZ29yeS5uYW1lXG4gICAgICAgICAgPyBjYXRlZ29yeVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICByZXR1cm4gZnVuY3Rpb24gaW5qZWN0YWJsZUlubmVyRGVjb3JhdG9yKG9yaWdpbmFsOiBhbnkpIHtcbiAgICBjb25zdCBzeW1ib2wgPSBTeW1ib2wuZm9yKGNhdGVnb3J5IHx8IG9yaWdpbmFsLnRvU3RyaW5nKCkpO1xuICAgIGNhdGVnb3J5ID0gY2F0ZWdvcnkgfHwgb3JpZ2luYWwubmFtZTtcblxuICAgIGNvbnN0IG1ldGFkYXRhOiBJbmplY3RhYmxlTWV0YWRhdGEgPSB7XG4gICAgICBjbGFzczogY2F0ZWdvcnkgYXMgc3RyaW5nLFxuICAgICAgc3ltYm9sOiBzeW1ib2wsXG4gICAgfTtcblxuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICBnZXRJbmplY3RLZXkoSW5qZWN0YWJsZXNLZXlzLklOSkVDVEFCTEUpLFxuICAgICAgbWV0YWRhdGEsXG4gICAgICBvcmlnaW5hbFxuICAgICk7XG4gICAgLy8gdGhlIG5ldyBjb25zdHJ1Y3RvciBiZWhhdmlvdXJcbiAgICBjb25zdCBuZXdDb25zdHJ1Y3RvcjogYW55ID0gZnVuY3Rpb24gKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICByZXR1cm4gSW5qZWN0YWJsZXMuZ2V0PGFueT4oc3ltYm9sLCAuLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgLy8gY29weSBwcm90b3R5cGUgc28gaW5zdGFuY2VvZiBvcGVyYXRvciBzdGlsbCB3b3Jrc1xuICAgIG5ld0NvbnN0cnVjdG9yLnByb3RvdHlwZSA9IG9yaWdpbmFsLnByb3RvdHlwZTtcbiAgICAvLyBuZXdDb25zdHJ1Y3Rvci5fX3Byb3RvX18gPSBvcmlnaW5hbC5fX3Byb3RvX187XG4gICAgLy8gU2V0cyB0aGUgcHJvcGVyIGNvbnN0cnVjdG9yIG5hbWUgZm9yIHR5cGUgdmVyaWZpY2F0aW9uXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld0NvbnN0cnVjdG9yLCBcIm5hbWVcIiwge1xuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogb3JpZ2luYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgfSk7XG5cbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgZ2V0SW5qZWN0S2V5KEluamVjdGFibGVzS2V5cy5JTkpFQ1RBQkxFKSxcbiAgICAgIG1ldGFkYXRhLFxuICAgICAgbmV3Q29uc3RydWN0b3JcbiAgICApO1xuXG4gICAgSW5qZWN0YWJsZXMucmVnaXN0ZXIob3JpZ2luYWwsIHN5bWJvbCwgY2ZnKTtcbiAgICAvLyByZXR1cm4gbmV3IGNvbnN0cnVjdG9yICh3aWxsIG92ZXJyaWRlIG9yaWdpbmFsKVxuICAgIHJldHVybiBuZXdDb25zdHJ1Y3RvcjtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJpYyBjb25zdHJ1Y3RvciB0eXBlIGZvciBjbGFzcy1saWtlIHZhbHVlcy5cbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYW55IGNsYXNzIHRoYXQgY2FuIGJlIGluc3RhbnRpYXRlZCB3aXRoIGFyYml0cmFyeSBhcmd1bWVudHMsIHByb2R1Y2luZyBhbiBpbnN0YW5jZSBvZiB0eXBlIFQuXG4gKiBAdGVtcGxhdGUgVCBUaGUgaW5zdGFuY2UgdHlwZSBjcmVhdGVkIGJ5IHRoZSBjb25zdHJ1Y3Rvci5cbiAqIEB0eXBlZGVmIENvbnN0cnVjdG9yXG4gKiBAZXhhbXBsZVxuICogLy8gVXNpbmcgQ29uc3RydWN0b3IgdG8gdHlwZSBhIGZhY3RvcnlcbiAqIGZ1bmN0aW9uIG1ha2U8VD4oQ3RvcjogQ29uc3RydWN0b3I8VD4sIC4uLmFyZ3M6IGFueVtdKTogVCB7XG4gKiAgIHJldHVybiBuZXcgQ3RvciguLi5hcmdzKTtcbiAqIH1cbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCB0eXBlIENvbnN0cnVjdG9yPFQgPSBhbnk+ID0geyBuZXcgKC4uLmFyZ3M6IGFueVtdKTogVCB9O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIGNsYXNzIGFzIGF2YWlsYWJsZSBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgY2xhc3MgYXMgYW4gaW5qZWN0YWJsZSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVnaXN0cnkuXG4gKiBXaGVuIGFwcGxpZWQgdG8gYSBjbGFzcywgcmVwbGFjZXMgaXRzIGNvbnN0cnVjdG9yIHdpdGggb25lIHRoYXQgcmV0dXJucyBhbiBpbnN0YW5jZS5cbiAqXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnkpOiBhbnl9IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyB0aGUgY2xhc3MgaW50byBhbiBpbmplY3RhYmxlLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RhYmxlKCk6IChvcmlnaW5hbDogYW55KSA9PiBhbnk7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIGNsYXNzIGFzIGF2YWlsYWJsZSBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgY2xhc3MgYXMgYW4gaW5qZWN0YWJsZSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVnaXN0cnkuXG4gKiBXaGVuIGFwcGxpZWQgdG8gYSBjbGFzcywgcmVwbGFjZXMgaXRzIGNvbnN0cnVjdG9yIHdpdGggb25lIHRoYXQgcmV0dXJucyBhbiBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZyB8IENvbnN0cnVjdG9yfSBjYXRlZ29yeSBEZWZhdWx0cyB0byB0aGUgY2xhc3MgY2F0ZWdvcnkuIFVzZWZ1bCB3aGVuIG1pbmlmaWNhdGlvbiBvY2N1cnMgYW5kIG5hbWVzIGFyZSBjaGFuZ2VkLFxuICogb3Igd2hlbiB5b3Ugd2FudCB0byB1cGNhc3QgdGhlIG9iamVjdCB0byBhIGRpZmZlcmVudCB0eXBlLlxuICpcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSBjbGFzcyBpbnRvIGFuIGluamVjdGFibGUuXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdGFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdGFibGUoXG4gIGNhdGVnb3J5OiBzdHJpbmcgfCBDb25zdHJ1Y3RvclxuKTogKG9yaWdpbmFsOiBhbnkpID0+IGFueTtcbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IG1hcmtzIGEgY2xhc3MgYXMgYXZhaWxhYmxlIGZvciBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBjbGFzcyBhcyBhbiBpbmplY3RhYmxlIHRoYXQgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSByZWdpc3RyeS5cbiAqIFdoZW4gYXBwbGllZCB0byBhIGNsYXNzLCByZXBsYWNlcyBpdHMgY29uc3RydWN0b3Igd2l0aCBvbmUgdGhhdCByZXR1cm5zIGFuIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSB7UGFydGlhbDxJbmplY3RhYmxlQ29uZmlnPn0gY2ZnPURlZmF1bHRJbmplY3RhYmxlQ29uZmlnIEFsbG93cyBvdmVycmlkaW5nIHRoZSBkZWZhdWx0IHNpbmdsZXRvbiBiZWhhdmlvciBhbmQgYWRkaW5nIGEgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55KTogYW55fSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgdGhlIGNsYXNzIGludG8gYW4gaW5qZWN0YWJsZS5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0YWJsZShcbiAgY2ZnOiBQYXJ0aWFsPEluamVjdGFibGVDb25maWc+XG4pOiAob3JpZ2luYWw6IGFueSkgPT4gYW55O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIGNsYXNzIGFzIGF2YWlsYWJsZSBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgY2xhc3MgYXMgYW4gaW5qZWN0YWJsZSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVnaXN0cnkuXG4gKiBXaGVuIGFwcGxpZWQgdG8gYSBjbGFzcywgcmVwbGFjZXMgaXRzIGNvbnN0cnVjdG9yIHdpdGggb25lIHRoYXQgcmV0dXJucyBhbiBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0gY2F0ZWdvcnkgRGVmYXVsdHMgdG8gdGhlIGNsYXNzIGNhdGVnb3J5LiBVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2NjdXJzIGFuZCBuYW1lcyBhcmUgY2hhbmdlZCxcbiAqIG9yIHdoZW4geW91IHdhbnQgdG8gdXBjYXN0IHRoZSBvYmplY3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAqIEBwYXJhbSB7UGFydGlhbDxJbmplY3RhYmxlQ29uZmlnPn0gY2ZnPURlZmF1bHRJbmplY3RhYmxlQ29uZmlnIEFsbG93cyBvdmVycmlkaW5nIHRoZSBkZWZhdWx0IHNpbmdsZXRvbiBiZWhhdmlvciBhbmQgYWRkaW5nIGEgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55KTogYW55fSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgdGhlIGNsYXNzIGludG8gYW4gaW5qZWN0YWJsZS5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0YWJsZShcbiAgY2F0ZWdvcnk6IHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICBjZmc6IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz5cbik6IChvcmlnaW5hbDogYW55KSA9PiBhbnk7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIGNsYXNzIGFzIGF2YWlsYWJsZSBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgY2xhc3MgYXMgYW4gaW5qZWN0YWJsZSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVnaXN0cnkuXG4gKiBXaGVuIGFwcGxpZWQgdG8gYSBjbGFzcywgcmVwbGFjZXMgaXRzIGNvbnN0cnVjdG9yIHdpdGggb25lIHRoYXQgcmV0dXJucyBhbiBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZyB8IENvbnN0cnVjdG9yfSBbY2F0ZWdvcnldIERlZmF1bHRzIHRvIHRoZSBjbGFzcyBjYXRlZ29yeS4gVXNlZnVsIHdoZW4gbWluaWZpY2F0aW9uIG9jY3VycyBhbmQgbmFtZXMgYXJlIGNoYW5nZWQsXG4gKiBvciB3aGVuIHlvdSB3YW50IHRvIHVwY2FzdCB0aGUgb2JqZWN0IHRvIGEgZGlmZmVyZW50IHR5cGUuXG4gKiBAcGFyYW0ge1BhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz59IFtjZmc9RGVmYXVsdEluamVjdGFibGVDb25maWddIEFsbG93cyBvdmVycmlkaW5nIHRoZSBkZWZhdWx0IHNpbmdsZXRvbiBiZWhhdmlvciBhbmQgYWRkaW5nIGEgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55KTogYW55fSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgdGhlIGNsYXNzIGludG8gYW4gaW5qZWN0YWJsZS5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0YWJsZVxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBEZWNvcmF0b3JcbiAqICAgcGFydGljaXBhbnQgSW5qZWN0YWJsZXNcbiAqXG4gKiAgIENsaWVudC0+PkRlY29yYXRvcjogQGluamVjdGFibGUoKVxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IENyZWF0ZSBuZXcgY29uc3RydWN0b3JcbiAqXG4gKiAgIE5vdGUgb3ZlciBEZWNvcmF0b3I6IFdoZW4gbmV3IGluc3RhbmNlIHJlcXVlc3RlZFxuICogICBEZWNvcmF0b3ItPj5JbmplY3RhYmxlczogZ2V0KGNhdGVnb3J5KVxuICogICBhbHQgSW5zdGFuY2UgZXhpc3RzXG4gKiAgICAgSW5qZWN0YWJsZXMtLT4+RGVjb3JhdG9yOiBSZXR1cm4gZXhpc3RpbmcgaW5zdGFuY2VcbiAqICAgZWxzZSBObyBpbnN0YW5jZVxuICogICAgIERlY29yYXRvci0+PkluamVjdGFibGVzOiByZWdpc3RlcihvcmlnaW5hbCwgY2F0ZWdvcnkpXG4gKiAgICAgRGVjb3JhdG9yLT4+SW5qZWN0YWJsZXM6IGdldChjYXRlZ29yeSlcbiAqICAgICBJbmplY3RhYmxlcy0tPj5EZWNvcmF0b3I6IFJldHVybiBuZXcgaW5zdGFuY2VcbiAqICAgICBvcHQgSGFzIGNhbGxiYWNrXG4gKiAgICAgICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IENhbGwgaW5zdGFuY2VDYWxsYmFja1xuICogICAgIGVuZFxuICogICBlbmRcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBEZWZpbmUgbWV0YWRhdGFcbiAqICAgRGVjb3JhdG9yLS0+PkNsaWVudDogUmV0dXJuIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RhYmxlKFxuICBjYXRlZ29yeT86IHN0cmluZyB8IENvbnN0cnVjdG9yIHwgUGFydGlhbDxJbmplY3RhYmxlQ29uZmlnPixcbiAgY2ZnPzogUGFydGlhbDxJbmplY3RhYmxlQ29uZmlnPlxuKSB7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihJbmplY3RhYmxlc0tleXMuSU5KRUNUQUJMRSlcbiAgICAuZGVmaW5lKHsgZGVjb3JhdG9yOiBpbmplY3RhYmxlQmFzZURlY29yYXRvciwgYXJnczogW2NhdGVnb3J5LCBjZmddIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlbmllbmNlIGRlY29yYXRvciB0byByZWdpc3RlciBhbiBpbmplY3RhYmxlIGFzIGEgc2luZ2xldG9uLlxuICogQHN1bW1hcnkgV3JhcHMge0BsaW5rIGluamVjdGFibGV9IGZvcmNpbmcgdGhlIHNpbmdsZXRvbiBsaWZlY3ljbGUgc28gb25seSBvbmUgaW5zdGFuY2UgaXMgY3JlYXRlZCBhbmQgcmV1c2VkLlxuICogQHBhcmFtIHtzdHJpbmd8Q29uc3RydWN0b3J9IFtjYXRlZ29yeV0gT3B0aW9uYWwgZXhwbGljaXQgY2F0ZWdvcnkvc3ltYm9sIHNvdXJjZTsgZGVmYXVsdHMgdG8gdGhlIGNsYXNzLlxuICogQHBhcmFtIHtPbWl0PEluamVjdGFibGVDb25maWcsIFwic2luZ2xldG9uXCI+fSBbY2ZnXSBBZGRpdGlvbmFsIGluamVjdGFibGUgY29uZmlndXJhdGlvbiBleGNsdWRpbmcgdGhlIHNpbmdsZXRvbiBmbGFnLlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55KTogYW55fSBBIGNsYXNzIGRlY29yYXRvciB0aGF0IHJlZ2lzdGVycyB0aGUgdGFyZ2V0IGFzIGEgc2luZ2xldG9uIGluamVjdGFibGUuXG4gKiBAZnVuY3Rpb24gc2luZ2xldG9uXG4gKiBAY2F0ZWdvcnkgQ2xhc3MgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2luZ2xldG9uKFxuICBjYXRlZ29yeT86IHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICBjZmc/OiBPbWl0PEluamVjdGFibGVDb25maWcsIFwic2luZ2xldG9uXCI+XG4pIHtcbiAgcmV0dXJuIGluamVjdGFibGUoXG4gICAgY2F0ZWdvcnkgYXMgYW55LFxuICAgIE9iamVjdC5hc3NpZ24oe30sIGNmZyB8fCB7fSwgeyBzaW5nbGV0b246IHRydWUgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udmVuaWVuY2UgZGVjb3JhdG9yIHRvIHJlZ2lzdGVyIGFuIGluamVjdGFibGUgYXMgb24tZGVtYW5kIChub24tc2luZ2xldG9uKS5cbiAqIEBzdW1tYXJ5IFdyYXBzIHtAbGluayBpbmplY3RhYmxlfSBmb3JjaW5nIG5ldyBpbnN0YW5jZXMgdG8gYmUgY3JlYXRlZCBvbiBldmVyeSBpbmplY3Rpb24gb3IgcmV0cmlldmFsLlxuICogQHBhcmFtIHtzdHJpbmd8Q29uc3RydWN0b3J9IFtjYXRlZ29yeV0gT3B0aW9uYWwgZXhwbGljaXQgY2F0ZWdvcnkvc3ltYm9sIHNvdXJjZTsgZGVmYXVsdHMgdG8gdGhlIGNsYXNzLlxuICogQHBhcmFtIHtPbWl0PEluamVjdGFibGVDb25maWcsIFwic2luZ2xldG9uXCI+fSBbY2ZnXSBBZGRpdGlvbmFsIGluamVjdGFibGUgY29uZmlndXJhdGlvbiBleGNsdWRpbmcgdGhlIHNpbmdsZXRvbiBmbGFnLlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55KTogYW55fSBBIGNsYXNzIGRlY29yYXRvciB0aGF0IHJlZ2lzdGVycyB0aGUgdGFyZ2V0IGFzIGEgbm9uLXNpbmdsZXRvbiBpbmplY3RhYmxlLlxuICogQGZ1bmN0aW9uIG9uRGVtYW5kXG4gKiBAY2F0ZWdvcnkgQ2xhc3MgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25EZW1hbmQoXG4gIGNhdGVnb3J5Pzogc3RyaW5nIHwgQ29uc3RydWN0b3IsXG4gIGNmZz86IE9taXQ8SW5qZWN0YWJsZUNvbmZpZywgXCJzaW5nbGV0b25cIj5cbikge1xuICByZXR1cm4gaW5qZWN0YWJsZShcbiAgICBjYXRlZ29yeSBhcyBhbnksXG4gICAgT2JqZWN0LmFzc2lnbih7fSwgY2ZnIHx8IHt9LCB7IHNpbmdsZXRvbjogZmFsc2UgfSlcbiAgKTtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZ1bmN0aW9uIHR5cGUgZm9yIHRyYW5zZm9ybWluZyBpbmplY3RhYmxlIGluc3RhbmNlcyBiZWZvcmUgdGhleSdyZSBpbmplY3RlZC5cbiAqIEBzdW1tYXJ5IEZ1bmN0aW9uIHdoaWNoIHRyYW5zZm9ybXMgYSBjYWNoZWQge0BsaW5rIGluamVjdGFibGV9IGluc3RhbmNlIGJlZm9yZSBpdCdzIGluamVjdGVkIGludG8gYSB0YXJnZXQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7YW55fSBpbmplY3RhYmxlIFRoZSBpbmplY3RhYmxlIGluc3RhbmNlIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHthbnl9IG9iaiBUaGUgb2JqZWN0IHRoZSBpbmplY3RhYmxlIHdpbGwgYmUgaW5qZWN0ZWQgb25cbiAqIEByZXR1cm4ge2FueX0gVGhlIHRyYW5zZm9ybWVkIGluamVjdGFibGUgaW5zdGFuY2VcbiAqXG4gKiBAdHlwZWRlZiB7RnVuY3Rpb259IEluc3RhbmNlVHJhbnNmb3JtZXJcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBJbnN0YW5jZVRyYW5zZm9ybWVyID0gKGluamVjdGFibGU6IGFueSwgb2JqOiBhbnkpID0+IGFueTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gT3B0aW9ucyBmb3IgdGhlIHByb3BlcnR5LWxldmVsIEBpbmplY3QgZGVjb3JhdG9yLlxuICogQHN1bW1hcnkgQWxsb3dzIHNwZWNpZnlpbmcgY29uc3RydWN0b3IgYXJndW1lbnRzIGFuZCBhbiBvcHRpb25hbCB0cmFuc2Zvcm1lciB0byBiZSBhcHBsaWVkIHRvIHRoZSByZXNvbHZlZCBpbnN0YW5jZS5cbiAqIEBwcm9wZXJ0eSB7YW55W119IFthcmdzXSBPcHRpb25hbCBjb25zdHJ1Y3RvciBhcmd1bWVudHMgdG8gdXNlIHdoZW4gYnVpbGRpbmcgdGhlIGluamVjdGFibGUgaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge0luc3RhbmNlVHJhbnNmb3JtZXJ9IFt0cmFuc2Zvcm1lcl0gT3B0aW9uYWwgZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHRoZSBpbnN0YW5jZSBiZWZvcmUgYXNzaWdubWVudC5cbiAqIEB0eXBlZGVmIEluamVjdE9wdGlvbnNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCB0eXBlIEluamVjdE9wdGlvbnMgPSB7XG4gIGFyZ3M/OiBhbnlbXTtcbiAgdHJhbnNmb3JtZXI/OiBJbnN0YW5jZVRyYW5zZm9ybWVyO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdEJhc2VEZWNvcmF0b3IoXG4gIGNhdGVnb3J5Pzogc3ltYm9sIHwgc3RyaW5nIHwgQ29uc3RydWN0b3IgfCBQYXJ0aWFsPEluamVjdE9wdGlvbnM+LFxuICBjZmc/OiBQYXJ0aWFsPEluamVjdE9wdGlvbnM+XG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluamVjdElubmVyRGVjb3JhdG9yKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkge1xuICAgIGNvbnN0IGNvbmZpZzogSW5qZWN0T3B0aW9ucyA9IChcbiAgICAgIGNmZyB8fCB0eXBlb2YgY2F0ZWdvcnkgPT09IFwib2JqZWN0XCIgPyBjYXRlZ29yeSA6IHt9XG4gICAgKSBhcyBJbmplY3RPcHRpb25zO1xuXG4gICAgaWYgKHByb3BlcnR5S2V5KSB7XG4gICAgICBwcm9wKCkodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgfVxuXG4gICAgY29uc3QgbmFtZTogc3ltYm9sIHwgc3RyaW5nIHwgQ29uc3RydWN0b3IgfCB1bmRlZmluZWQgPVxuICAgICAgKHR5cGVvZiBjYXRlZ29yeSAhPT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAoY2F0ZWdvcnkgYXMgc3ltYm9sIHwgc3RyaW5nIHwgQ29uc3RydWN0b3IpKSB8fFxuICAgICAgTWV0YWRhdGEudHlwZSh0YXJnZXQuY29uc3RydWN0b3IsIHByb3BlcnR5S2V5KTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGdldCBUeXBlIGZyb20gZGVjb3JhdG9yYCk7XG4gICAgfVxuXG4gICAgLy8gcHJvcCgpKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICBnZXRJbmplY3RLZXkoSW5qZWN0YWJsZXNLZXlzLklOSkVDVCksXG4gICAgICB7XG4gICAgICAgIGluamVjdGFibGU6IG5hbWUsXG4gICAgICB9LFxuICAgICAgdGFyZ2V0LFxuICAgICAgcHJvcGVydHlLZXlcbiAgICApO1xuXG4gICAgY29uc3QgdmFsdWVzID0gbmV3IFdlYWtNYXAoKTtcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3BlcnR5S2V5LCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQodGhpczogYW55KSB7XG4gICAgICAgIGNvbnN0IGRlc2NyaXB0b3I6IFByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgIHByb3BlcnR5S2V5XG4gICAgICAgICkgYXMgUHJvcGVydHlEZXNjcmlwdG9yO1xuICAgICAgICBpZiAoZGVzY3JpcHRvci5jb25maWd1cmFibGUpIHtcbiAgICAgICAgICAvLyBsZXQgL29iajogYW55O1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eUtleSwge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBnZXQodGhpczogYW55KSB7XG4gICAgICAgICAgICAgIGxldCBvYmogPSB2YWx1ZXMuZ2V0KHRoaXMpO1xuICAgICAgICAgICAgICBpZiAob2JqKSByZXR1cm4gb2JqO1xuICAgICAgICAgICAgICBvYmogPSBJbmplY3RhYmxlcy5nZXQobmFtZSwgLi4uKGNvbmZpZy5hcmdzIHx8IFtdKSk7XG4gICAgICAgICAgICAgIGlmICghb2JqKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgIGBDb3VsZCBub3QgZ2V0IEluamVjdGFibGUgJHtuYW1lLnRvU3RyaW5nKCl9IHRvIGluamVjdCBpbiAke3RhcmdldC5jb25zdHJ1Y3RvciA/IHRhcmdldC5jb25zdHJ1Y3Rvci5uYW1lIDogdGFyZ2V0Lm5hbWV9J3MgJHtwcm9wZXJ0eUtleX1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgaWYgKGNvbmZpZy50cmFuc2Zvcm1lcilcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgb2JqID0gY29uZmlnLnRyYW5zZm9ybWVyKG9iaiwgdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdmFsdWVzLnNldCh0aGlzLCBvYmopO1xuXG4gICAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB0aGlzW3Byb3BlcnR5S2V5XTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogQHN1bW1hcnkgQWxsb3dzIGZvciB0aGUgaW5qZWN0aW9uIG9mIGFuIHtAbGluayBpbmplY3RhYmxlfSBkZWNvcmF0ZWQgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBUaGUgcHJvcGVydHkgbXVzdCBiZSB0eXBlZCBmb3IgdGhlIHJlcXVlc3RlZCBkZXBlbmRlbmN5LiBPbmx5IGNvbmNyZXRlIGNsYXNzZXMgYXJlIHN1cHBvcnRlZDsgZ2VuZXJpY3MgYXJlIG5vdC5cbiAqXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueSk6IHZvaWR9IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0KCk6ICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IGFueSkgPT4gdm9pZDtcbi8qKlxuICogQGRlc2NyaXB0aW9uIFByb3BlcnR5IGRlY29yYXRvciB0aGF0IGluamVjdHMgYSBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIEBzdW1tYXJ5IEFsbG93cyBmb3IgdGhlIGluamVjdGlvbiBvZiBhbiB7QGxpbmsgaW5qZWN0YWJsZX0gZGVjb3JhdGVkIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogVGhlIHByb3BlcnR5IG11c3QgYmUgdHlwZWQgZm9yIHRoZSByZXF1ZXN0ZWQgZGVwZW5kZW5jeS4gT25seSBjb25jcmV0ZSBjbGFzc2VzIGFyZSBzdXBwb3J0ZWQ7IGdlbmVyaWNzIGFyZSBub3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNhdGVnb3J5IERlZmF1bHRzIHRvIHRoZSBjbGFzcyBuYW1lIGRlcml2ZWQgZnJvbSB0aGUgcHJvcGVydHkgdHlwZS4gVXNlZnVsIHdoZW4gbWluaWZpY2F0aW9uIG9jY3Vyc1xuICogYW5kIG5hbWVzIGFyZSBjaGFuZ2VkLCBvciB3aGVuIHlvdSB3YW50IHRvIHVwY2FzdCB0aGUgb2JqZWN0IHRvIGEgZGlmZmVyZW50IHR5cGUuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueSk6IHZvaWR9IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0KFxuICBjYXRlZ29yeTogc3RyaW5nIHwgQ29uc3RydWN0b3Jcbik6ICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IGFueSkgPT4gdm9pZDtcbi8qKlxuICogQGRlc2NyaXB0aW9uIFByb3BlcnR5IGRlY29yYXRvciB0aGF0IGluamVjdHMgYSBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIEBzdW1tYXJ5IEFsbG93cyBmb3IgdGhlIGluamVjdGlvbiBvZiBhbiB7QGxpbmsgaW5qZWN0YWJsZX0gZGVjb3JhdGVkIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogVGhlIHByb3BlcnR5IG11c3QgYmUgdHlwZWQgZm9yIHRoZSByZXF1ZXN0ZWQgZGVwZW5kZW5jeS4gT25seSBjb25jcmV0ZSBjbGFzc2VzIGFyZSBzdXBwb3J0ZWQ7IGdlbmVyaWNzIGFyZSBub3QuXG4gKlxuICogQHBhcmFtIHtQYXJ0aWFsPEluamVjdE9wdGlvbnM+fSBbY2ZnPXt9XSBPcHRpb25hbCBmdW5jdGlvbiB0byB0cmFuc2Zvcm0gdGhlIGluamVjdGFibGUgaW5zdGFuY2UgYmVmb3JlIGl0J3MgaW5qZWN0ZWQsIG9yIGFyZ3VtZW50cyB0byBwYXNzIHRoZSBjb25zdHJ1Y3RvciB3aGVuIGluamVjdGluZyBvbkRlbWFuZFxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnkpOiB2b2lkfSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdChcbiAgY2ZnOiBQYXJ0aWFsPEluamVjdE9wdGlvbnM+XG4pOiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBhbnkpID0+IHZvaWQ7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGEgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBAc3VtbWFyeSBBbGxvd3MgZm9yIHRoZSBpbmplY3Rpb24gb2YgYW4ge0BsaW5rIGluamVjdGFibGV9IGRlY29yYXRlZCBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIFRoZSBwcm9wZXJ0eSBtdXN0IGJlIHR5cGVkIGZvciB0aGUgcmVxdWVzdGVkIGRlcGVuZGVuY3kuIE9ubHkgY29uY3JldGUgY2xhc3NlcyBhcmUgc3VwcG9ydGVkOyBnZW5lcmljcyBhcmUgbm90LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjYXRlZ29yeSBEZWZhdWx0cyB0byB0aGUgY2xhc3MgbmFtZSBkZXJpdmVkIGZyb20gdGhlIHByb3BlcnR5IHR5cGUuIFVzZWZ1bCB3aGVuIG1pbmlmaWNhdGlvbiBvY2N1cnNcbiAqIGFuZCBuYW1lcyBhcmUgY2hhbmdlZCwgb3Igd2hlbiB5b3Ugd2FudCB0byB1cGNhc3QgdGhlIG9iamVjdCB0byBhIGRpZmZlcmVudCB0eXBlLlxuICogQHBhcmFtIHtQYXJ0aWFsPEluamVjdE9wdGlvbnM+fSBjZmc9e30gT3B0aW9uYWwgZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHRoZSBpbmplY3RhYmxlIGluc3RhbmNlIGJlZm9yZSBpdCdzIGluamVjdGVkLCBvciBhcmd1bWVudHMgdG8gcGFzcyB0aGUgY29uc3RydWN0b3Igd2hlbiBpbmplY3Rpbmcgb25EZW1hbmRcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSwgYW55KTogdm9pZH0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3QoXG4gIGNhdGVnb3J5OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgY2ZnOiBQYXJ0aWFsPEluamVjdE9wdGlvbnM+XG4pOiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBhbnkpID0+IHZvaWQ7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGEgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBAc3VtbWFyeSBBbGxvd3MgZm9yIHRoZSBpbmplY3Rpb24gb2YgYW4ge0BsaW5rIGluamVjdGFibGV9IGRlY29yYXRlZCBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIFRoZSBwcm9wZXJ0eSBtdXN0IGJlIHR5cGVkIGZvciB0aGUgcmVxdWVzdGVkIGRlcGVuZGVuY3kuIE9ubHkgY29uY3JldGUgY2xhc3NlcyBhcmUgc3VwcG9ydGVkOyBnZW5lcmljcyBhcmUgbm90LlxuICpcbiAqIEluamVjdGVkIHByb3BlcnRpZXMgc2hvdWxkIGJlIGRlc2NyaWJlZCBsaWtlIHNvOlxuICogPHByZT5cbiAqICAgICBjbGFzcyBDbGFzc05hbWUge1xuICogICAgICAgICAuLi5cbiAqXG4gKiAgICAgICAgIEBpbmplY3QoKVxuICogICAgICAgICBwcm9wZXJ0eU5hbWUhOiBJbmplY3RhYmxlQ2xhc3M7XG4gKlxuICogICAgICAgICAuLi5cbiAqICAgICB9XG4gKiA8L3ByZT5cbiAqXG4gKiB3aGVyZSBJbmplY3RhYmxlQ2xhc3MgaXMgdGhlIGNsYXNzIHlvdSB3YW50IHRvIGluamVjdC5cbiAqIE5vdGljZSB0aGUgdXNlIG9mICchOicgdG8gZW5zdXJlIHRoZSB0cmFuc3BpbGVyIHRoZSBwcm9wZXJ0eSB3aWxsIGJlIHNldCBvdXRzaWRlIHRoZSBjb25zdHJ1Y3RvciBidXQgd2lsbCBhbHdheXMgYmUgZGVmaW5lZC5cbiAqIEZvciBwcm9qZWN0cyB3aGVyZSBtaW5pZmljYXRpb24gb2NjdXJzLCB5b3Ugc2hvdWxkIHVzZSB0aGUgY2F0ZWdvcnkgcGFyYW0gdG8gZW5zdXJlIHRoZSBuYW1lIGlzIHRoZSBzYW1lIHRocm91Z2hvdXQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtjYXRlZ29yeV0gRGVmYXVsdHMgdG8gdGhlIGNsYXNzIG5hbWUgZGVyaXZlZCBmcm9tIHRoZSBwcm9wZXJ0eSB0eXBlLiBVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2NjdXJzXG4gKiBhbmQgbmFtZXMgYXJlIGNoYW5nZWQsIG9yIHdoZW4geW91IHdhbnQgdG8gdXBjYXN0IHRoZSBvYmplY3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAqIEBwYXJhbSB7UGFydGlhbDxJbmplY3RPcHRpb25zPn0gW2NmZz17fV0gT3B0aW9uYWwgZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHRoZSBpbmplY3RhYmxlIGluc3RhbmNlIGJlZm9yZSBpdCdzIGluamVjdGVkLCBvciBhcmd1bWVudHMgdG8gcGFzcyB0aGUgY29uc3RydWN0b3Igd2hlbiBpbmplY3Rpbmcgb25EZW1hbmRcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSwgYW55KTogdm9pZH0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IERlY29yYXRvclxuICogICBwYXJ0aWNpcGFudCBJbmplY3RhYmxlc1xuICpcbiAqICAgQ2xpZW50LT4+RGVjb3JhdG9yOiBAaW5qZWN0KClcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBHZXQgdHlwZSBmcm9tIHByb3BlcnR5XG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogRGVmaW5lIG1ldGFkYXRhXG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogRGVmaW5lIHByb3BlcnR5IGdldHRlclxuICpcbiAqICAgTm90ZSBvdmVyIERlY29yYXRvcjogV2hlbiBwcm9wZXJ0eSBhY2Nlc3NlZFxuICogICBDbGllbnQtPj5EZWNvcmF0b3I6IGFjY2VzcyBwcm9wZXJ0eVxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IENoZWNrIGlmIGluc3RhbmNlIGV4aXN0c1xuICogICBhbHQgSW5zdGFuY2UgZXhpc3RzIGluIFdlYWtNYXBcbiAqICAgICBEZWNvcmF0b3ItLT4+Q2xpZW50OiBSZXR1cm4gY2FjaGVkIGluc3RhbmNlXG4gKiAgIGVsc2UgTm8gaW5zdGFuY2VcbiAqICAgICBEZWNvcmF0b3ItPj5JbmplY3RhYmxlczogZ2V0KG5hbWUpXG4gKiAgICAgYWx0IEluamVjdGFibGUgZm91bmRcbiAqICAgICAgIEluamVjdGFibGVzLS0+PkRlY29yYXRvcjogUmV0dXJuIGluamVjdGFibGUgaW5zdGFuY2VcbiAqICAgICAgIG9wdCBIYXMgdHJhbnNmb3JtZXJcbiAqICAgICAgICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBDYWxsIHRyYW5zZm9ybWVyXG4gKiAgICAgICBlbmRcbiAqICAgICAgIERlY29yYXRvci0+PkRlY29yYXRvcjogU3RvcmUgaW4gV2Vha01hcFxuICogICAgICAgRGVjb3JhdG9yLS0+PkNsaWVudDogUmV0dXJuIGluc3RhbmNlXG4gKiAgICAgZWxzZSBObyBpbmplY3RhYmxlXG4gKiAgICAgICBEZWNvcmF0b3ItLT4+Q2xpZW50OiBUaHJvdyBlcnJvclxuICogICAgIGVuZFxuICogICBlbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdChcbiAgY2F0ZWdvcnk/OiBzeW1ib2wgfCBzdHJpbmcgfCBDb25zdHJ1Y3RvciB8IFBhcnRpYWw8SW5qZWN0T3B0aW9ucz4sXG4gIGNmZz86IFBhcnRpYWw8SW5qZWN0T3B0aW9ucz5cbikge1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoSW5qZWN0YWJsZXNLZXlzLklOSkVDVClcbiAgICAuZGVmaW5lKHsgZGVjb3JhdG9yOiBpbmplY3RCYXNlRGVjb3JhdG9yLCBhcmdzOiBbY2F0ZWdvcnksIGNmZ10gfSlcbiAgICAuYXBwbHkoKTtcbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIEEgbGlnaHR3ZWlnaHQgZGVwZW5kZW5jeSBpbmplY3Rpb24gbGlicmFyeSBmb3IgVHlwZVNjcmlwdCBhcHBsaWNhdGlvbnMuXG4gKiBAc3VtbWFyeSBBZGRzIGEgc2ltcGxlIEluamVjdGFibGVzIGltcGxlbWVudGF0aW9uIHRvIGNyZWF0ZSBzaW5nbGV0b24gaW5zdGFuY2VzIG9mIGFuIG9iamVjdFxuICogYW5kIGVhc2lseSBpbmplY3QgaXQgaW50byBvdGhlciBvYmplY3RzLiBQcm92aWRlcyBkZWNvcmF0b3JzIGZvciBtYXJraW5nIGNsYXNzZXMgYXMgaW5qZWN0YWJsZVxuICogYW5kIGZvciBpbmplY3RpbmcgZGVwZW5kZW5jaWVzIGludG8gY2xhc3MgcHJvcGVydGllcy5cbiAqXG4gKiBAbW9kdWxlIGluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5cbmltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vSW5qZWN0YWJsZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3JlZ2lzdHJ5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3VycmVudCB2ZXJzaW9uIG9mIHRoZSBpbmplY3RhYmxlLWRlY29yYXRvcnMgbGlicmFyeS5cbiAqIEBzdW1tYXJ5IERlZmluZWQgb24gbGlicmFyeSBidWlsZC4gSG9sZHMgdGhlIGxpYnJhcnkncyBjdXJyZW50IHZlcnNpb24gc3RyaW5nLlxuICogQGNvbnN0IFZFUlNJT05cbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfTkFNRSA9IFwiIyNQQUNLQUdFX05BTUUjI1wiO1xuTWV0YWRhdGEucmVnaXN0ZXJMaWJyYXJ5KFBBQ0tBR0VfTkFNRSwgVkVSU0lPTik7XG4iXSwibmFtZXMiOlsiRGVjb3JhdGlvbiIsInByb3AiLCJNZXRhZGF0YSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0lBRUE7Ozs7Ozs7O0lBUUc7QUFDVSxVQUFBLGVBQWUsR0FBRztJQUM3QixJQUFBLE9BQU8sRUFBRSxZQUFZO0lBQ3JCLElBQUEsVUFBVSxFQUFFLFlBQVk7SUFDeEIsSUFBQSxNQUFNLEVBQUUsUUFBUTs7SUFHbEI7Ozs7O0lBS0c7QUFDVSxVQUFBLHdCQUF3QixHQUFxQjtJQUN4RCxJQUFBLFNBQVMsRUFBRSxJQUFJOztJQUdqQjs7Ozs7SUFLRztBQUNJLFVBQU0s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
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { Decoration, Metadata } from '@decaf-ts/decoration';
|
|
2
|
-
import 'reflect-metadata';
|
|
1
|
+
import { Decoration, prop, Metadata } from '@decaf-ts/decoration';
|
|
3
2
|
|
|
4
3
|
/**
|
|
5
4
|
* @description Constants used for reflection metadata keys in the dependency injection system.
|
|
@@ -41,26 +40,6 @@ const TypeKey = "design:type";
|
|
|
41
40
|
* @memberOf module:injectable-decorators
|
|
42
41
|
*/
|
|
43
42
|
const getInjectKey = (key) => InjectablesKeys.REFLECT + key;
|
|
44
|
-
/**
|
|
45
|
-
* @description Extracts the type name from a decorated property using reflection.
|
|
46
|
-
* @summary Retrieves the type from a property decorator by accessing TypeScript's reflection metadata.
|
|
47
|
-
* @param {any} model The target object containing the decorated property
|
|
48
|
-
* @param {string | symbol} propKey The property key (name or symbol) of the decorated property
|
|
49
|
-
* @return {string | undefined} The name of the property type, or undefined if it's a Function type
|
|
50
|
-
* @function getTypeFromDecorator
|
|
51
|
-
* @memberOf module:injectable-decorators
|
|
52
|
-
*/
|
|
53
|
-
function getTypeFromDecorator(model, propKey) {
|
|
54
|
-
const typeDef = Reflect.getMetadata(TypeKey, model, propKey);
|
|
55
|
-
if (typeDef.name === "Function") {
|
|
56
|
-
return undefined;
|
|
57
|
-
}
|
|
58
|
-
const meta = Reflect.getMetadata(getInjectKey(InjectablesKeys.INJECTABLE), typeDef);
|
|
59
|
-
if (!meta) {
|
|
60
|
-
return undefined;
|
|
61
|
-
}
|
|
62
|
-
return meta.symbol;
|
|
63
|
-
}
|
|
64
43
|
|
|
65
44
|
/**
|
|
66
45
|
* @description Default implementation of the InjectablesRegistry interface.
|
|
@@ -409,9 +388,12 @@ function onDemand(category, cfg) {
|
|
|
409
388
|
function injectBaseDecorator(category, cfg) {
|
|
410
389
|
return function injectInnerDecorator(target, propertyKey) {
|
|
411
390
|
const config = (cfg || typeof category === "object" ? category : {});
|
|
391
|
+
if (propertyKey) {
|
|
392
|
+
prop()(target, propertyKey);
|
|
393
|
+
}
|
|
412
394
|
const name = (typeof category !== "object" &&
|
|
413
395
|
category) ||
|
|
414
|
-
|
|
396
|
+
Metadata.type(target.constructor, propertyKey);
|
|
415
397
|
if (!name) {
|
|
416
398
|
throw new Error(`Could not get Type from decorator`);
|
|
417
399
|
}
|
|
@@ -532,8 +514,9 @@ function inject(category, cfg) {
|
|
|
532
514
|
* @const VERSION
|
|
533
515
|
* @memberOf module:injectable-decorators
|
|
534
516
|
*/
|
|
535
|
-
const VERSION = "1.6.
|
|
536
|
-
|
|
517
|
+
const VERSION = "1.6.15";
|
|
518
|
+
const PACKAGE_NAME = "##PACKAGE_NAME##";
|
|
519
|
+
Metadata.registerLibrary(PACKAGE_NAME, VERSION);
|
|
537
520
|
|
|
538
|
-
export { DefaultInjectablesConfig, InjectableRegistryImp, Injectables, InjectablesKeys, TypeKey, VERSION, getInjectKey,
|
|
539
|
-
//# 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+KFxuICAgIG5hbWU6IHN5bWJvbCB8IHN0cmluZyB8IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IFQgfSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gSW5qZWN0YWJsZXMuZ2V0UmVnaXN0cnkoKS5nZXQobmFtZSwgLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEFkZHMgYSBjbGFzcyBvciBvYmplY3QgdG8gdGhlIGluamVjdGFibGUgcmVnaXN0cnkuXG4gICAqIEBzdW1tYXJ5IFJlZ2lzdGVycyBhbiBpbmplY3RhYmxlIGNvbnN0cnVjdG9yIG9yIGluc3RhbmNlIHdpdGggdGhlIHJlZ2lzdHJ5LCBtYWtpbmcgaXQgYXZhaWxhYmxlIGZvciBpbmplY3Rpb24uXG4gICAqIEB0ZW1wbGF0ZSBUIFR5cGUgb2YgdGhlIGluamVjdGFibGUgb2JqZWN0IHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSB7SW5qZWN0YWJsZTxUPn0gY29uc3RydWN0b3IgVGhlIGNsYXNzIGNvbnN0cnVjdG9yIG9yIG9iamVjdCBpbnN0YW5jZSB0byByZWdpc3RlclxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciByZWdpc3RyYXRpb24gKGNhdGVnb3J5LCBzaW5nbGV0b24gZmxhZywgZXRjLilcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyByZWdpc3RlcjxUPihjb25zdHJ1Y3RvcjogSW5qZWN0YWJsZTxUPiwgLi4uYXJnczogYW55W10pOiB2b2lkIHtcbiAgICByZXR1cm4gSW5qZWN0YWJsZXMuZ2V0UmVnaXN0cnkoKS5yZWdpc3RlcihcbiAgICAgIGNvbnN0cnVjdG9yLFxuICAgICAgLi4uKGFyZ3MgYXMgW3N5bWJvbCwgSW5qZWN0YWJsZU9wdGlvbnM8VD5dKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgYW4gaW5qZWN0YWJsZSBjbGFzcy5cbiAgICogQHN1bW1hcnkgSW5zdGFudGlhdGVzIGFuIGluamVjdGFibGUgY2xhc3MgdXNpbmcgaXRzIGNvbnN0cnVjdG9yIGFuZCB0aGUgcHJvdmlkZWQgYXJndW1lbnRzLlxuICAgKiBAdGVtcGxhdGUgVCBUeXBlIG9mIHRoZSBvYmplY3QgdG8gYnVpbGRcbiAgICogQHBhcmFtIHtzeW1ib2x9IG5hbWUgc3ltYm9sIHJlZmVyZW5jaW5nIHRoZSBpbmplY3RhYmxlXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgQ29uc3RydWN0b3IgYXJndW1lbnRzIHRvIHBhc3Mgd2hlbiBpbnN0YW50aWF0aW5nIHRoZSBpbmplY3RhYmxlXG4gICAqIEByZXR1cm4ge1R9IFRoZSBuZXdseSBjcmVhdGVkIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgYnVpbGQ8VD4obmFtZTogc3ltYm9sLCAuLi5hcmdzOiBhbnlbXSk6IFQge1xuICAgIHJldHVybiBJbmplY3RhYmxlcy5nZXRSZWdpc3RyeSgpLmJ1aWxkKG5hbWUsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXBsYWNlcyB0aGUgY3VycmVudCByZWdpc3RyeSBpbXBsZW1lbnRhdGlvbi5cbiAgICogQHN1bW1hcnkgU2V0cyBhIG5ldyB7QGxpbmsgSW5qZWN0YWJsZXNSZWdpc3RyeX0gaW1wbGVtZW50YXRpb24sIGFsbG93aW5nIGZvciBjdXN0b20gcmVnaXN0cnkgYmVoYXZpb3IuXG4gICAqIEBwYXJhbSB7SW5qZWN0YWJsZXNSZWdpc3RyeX0gb3BlcmF0aW9uc1JlZ2lzdHJ5IFRoZSBuZXcgaW1wbGVtZW50YXRpb24gb2YgUmVnaXN0cnkgdG8gdXNlXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgc2V0UmVnaXN0cnkob3BlcmF0aW9uc1JlZ2lzdHJ5OiBJbmplY3RhYmxlc1JlZ2lzdHJ5KTogdm9pZCB7XG4gICAgSW5qZWN0YWJsZXMuYWN0aW5nSW5qZWN0YWJsZXNSZWdpc3RyeSA9IG9wZXJhdGlvbnNSZWdpc3RyeTtcbiAgfVxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgY3VycmVudCByZWdpc3RyeSBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgUmV0dXJucyB0aGUgY3VycmVudCB7QGxpbmsgSW5qZWN0YWJsZXNSZWdpc3RyeX0gb3IgY3JlYXRlcyBhIGRlZmF1bHQgb25lIGlmIG5vbmUgZXhpc3RzLlxuICAgKiBAcmV0dXJuIHtJbmplY3RhYmxlc1JlZ2lzdHJ5fSBUaGUgY3VycmVudCByZWdpc3RyeSBpbnN0YW5jZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0UmVnaXN0cnkoKTogSW5qZWN0YWJsZXNSZWdpc3RyeSB7XG4gICAgaWYgKCFJbmplY3RhYmxlcy5hY3RpbmdJbmplY3RhYmxlc1JlZ2lzdHJ5KVxuICAgICAgSW5qZWN0YWJsZXMuYWN0aW5nSW5qZWN0YWJsZXNSZWdpc3RyeSA9IG5ldyBJbmplY3RhYmxlUmVnaXN0cnlJbXAoKTtcbiAgICByZXR1cm4gSW5qZWN0YWJsZXMuYWN0aW5nSW5qZWN0YWJsZXNSZWdpc3RyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2xlYXJzIGFsbCByZWdpc3RlcmVkIGluamVjdGFibGVzLlxuICAgKiBAc3VtbWFyeSBSZXNldHMgdGhlIHJlZ2lzdHJ5IHRvIGEgY2xlYW4gc3RhdGUgYnkgY3JlYXRpbmcgYSBuZXcgZW1wdHkgcmVnaXN0cnkgaW5zdGFuY2UuXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgcmVzZXQoKTogdm9pZCB7XG4gICAgSW5qZWN0YWJsZXMuc2V0UmVnaXN0cnkobmV3IEluamVjdGFibGVSZWdpc3RyeUltcCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVtb3ZlcyBzcGVjaWZpYyBpbmplY3RhYmxlcyBmcm9tIHRoZSByZWdpc3RyeSBiYXNlZCBvbiBhIHBhdHRlcm4uXG4gICAqIEBzdW1tYXJ5IFNlbGVjdGl2ZWx5IHJlc2V0cyB0aGUgcmVnaXN0cnkgYnkgcmVtb3Zpbmcgb25seSB0aGUgaW5qZWN0YWJsZXMgd2hvc2UgbmFtZXMgbWF0Y2ggdGhlIHByb3ZpZGVkIHBhdHRlcm4uXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgUmVnRXhwfSBtYXRjaCBBIHN0cmluZyBvciByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiB0byBtYXRjaCBhZ2FpbnN0IGluamVjdGFibGUgbmFtZXNcbiAgICogQHJldHVybiB7dm9pZH1cbiAgICovXG4gIHN0YXRpYyBzZWxlY3RpdmVSZXNldChtYXRjaDogc3RyaW5nIHwgUmVnRXhwKTogdm9pZCB7XG4gICAgY29uc3QgcmVnZXhwID0gdHlwZW9mIG1hdGNoID09PSBcInN0cmluZ1wiID8gbmV3IFJlZ0V4cChtYXRjaCkgOiBtYXRjaDtcbiAgICAoSW5qZWN0YWJsZXMuYWN0aW5nSW5qZWN0YWJsZXNSZWdpc3RyeSBhcyBhbnkpW1wiY2FjaGVcIl0gPSBPYmplY3QuZW50cmllcyhcbiAgICAgIChJbmplY3RhYmxlcy5hY3RpbmdJbmplY3RhYmxlc1JlZ2lzdHJ5IGFzIGFueSlbXCJjYWNoZVwiXVxuICAgICkucmVkdWNlKChhY2N1bTogUmVjb3JkPHN0cmluZywgYW55PiwgW2tleSwgdmFsXSkgPT4ge1xuICAgICAgaWYgKCFrZXkubWF0Y2gocmVnZXhwKSkgYWNjdW1ba2V5XSA9IHZhbDtcbiAgICAgIHJldHVybiBhY2N1bTtcbiAgICB9LCB7fSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZywgSW5qZWN0YWJsZXNLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlcyB9IGZyb20gXCIuL0luamVjdGFibGVzXCI7XG5pbXBvcnQgeyBnZXRJbmplY3RLZXksIGdldFR5cGVGcm9tRGVjb3JhdG9yIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IEluamVjdGFibGVNZXRhZGF0YSwgSW5zdGFuY2VDYWxsYmFjayB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWNvcmF0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIEBpbmplY3RhYmxlIGRlY29yYXRvci5cbiAqIEBzdW1tYXJ5IENvbnRyb2xzIGxpZmVjeWNsZSAoc2luZ2xldG9uIHZzIG9uLWRlbWFuZCkgYW5kIGFuIG9wdGlvbmFsIGluc3RhbmNlIHRyYW5zZm9ybWF0aW9uIGNhbGxiYWNrIGV4ZWN1dGVkIHBvc3QtY29uc3RydWN0aW9uLlxuICogQHRlbXBsYXRlIFQgVGhlIGluc3RhbmNlIHR5cGUgYWZmZWN0ZWQgYnkgdGhlIGNhbGxiYWNrIHdoZW4gcHJvdmlkZWQuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHNpbmdsZXRvbiBXaGVuIHRydWUsIGEgc2luZ2xlIGluc3RhbmNlIGlzIHNoYXJlZCAoc2luZ2xldG9uKS4gV2hlbiBmYWxzZSwgaW5zdGFuY2VzIGFyZSBjcmVhdGVkIG9uIGRlbWFuZC5cbiAqIEBwcm9wZXJ0eSB7SW5zdGFuY2VDYWxsYmFjazxUPn0gW2NhbGxiYWNrXSBPcHRpb25hbCBob29rIHRvIHRyYW5zZm9ybSB0aGUgaW5zdGFuY2UgYWZ0ZXIgaXQgaXMgY29uc3RydWN0ZWQuXG4gKiBAdHlwZWRlZiBJbmplY3RhYmxlQ29uZmlnXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBJbmplY3RhYmxlQ29uZmlnID0ge1xuICBzaW5nbGV0b246IGJvb2xlYW47XG4gIGNhbGxiYWNrPzogSW5zdGFuY2VDYWxsYmFjazxhbnk+O1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdGFibGVCYXNlRGVjb3JhdG9yKFxuICBjYXRlZ29yeT86IHN0cmluZyB8IENvbnN0cnVjdG9yIHwgUGFydGlhbDxJbmplY3RhYmxlQ29uZmlnPixcbiAgY2ZnPzogUGFydGlhbDxJbmplY3RhYmxlQ29uZmlnPlxuKSB7XG4gIGNmZyA9XG4gICAgY2ZnIHx8XG4gICAgKHR5cGVvZiBjYXRlZ29yeSA9PT0gXCJvYmplY3RcIlxuICAgICAgPyBPYmplY3QuYXNzaWduKGNhdGVnb3J5IGFzIFJlY29yZDxhbnksIGFueT4sIERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZylcbiAgICAgIDogRGVmYXVsdEluamVjdGFibGVzQ29uZmlnKTtcbiAgY2F0ZWdvcnkgPVxuICAgIHR5cGVvZiBjYXRlZ29yeSA9PT0gXCJvYmplY3RcIlxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDogdHlwZW9mIGNhdGVnb3J5ID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gY2F0ZWdvcnlcbiAgICAgICAgOiB0eXBlb2YgY2F0ZWdvcnkgPT09IFwiZnVuY3Rpb25cIiAmJiBjYXRlZ29yeS5uYW1lXG4gICAgICAgICAgPyBjYXRlZ29yeVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICByZXR1cm4gZnVuY3Rpb24gaW5qZWN0YWJsZUlubmVyRGVjb3JhdG9yKG9yaWdpbmFsOiBhbnkpIHtcbiAgICBjb25zdCBzeW1ib2wgPSBTeW1ib2wuZm9yKGNhdGVnb3J5IHx8IG9yaWdpbmFsLnRvU3RyaW5nKCkpO1xuICAgIGNhdGVnb3J5ID0gY2F0ZWdvcnkgfHwgb3JpZ2luYWwubmFtZTtcblxuICAgIGNvbnN0IG1ldGFkYXRhOiBJbmplY3RhYmxlTWV0YWRhdGEgPSB7XG4gICAgICBjbGFzczogY2F0ZWdvcnkgYXMgc3RyaW5nLFxuICAgICAgc3ltYm9sOiBzeW1ib2wsXG4gICAgfTtcblxuICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoXG4gICAgICBnZXRJbmplY3RLZXkoSW5qZWN0YWJsZXNLZXlzLklOSkVDVEFCTEUpLFxuICAgICAgbWV0YWRhdGEsXG4gICAgICBvcmlnaW5hbFxuICAgICk7XG4gICAgLy8gdGhlIG5ldyBjb25zdHJ1Y3RvciBiZWhhdmlvdXJcbiAgICBjb25zdCBuZXdDb25zdHJ1Y3RvcjogYW55ID0gZnVuY3Rpb24gKC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICByZXR1cm4gSW5qZWN0YWJsZXMuZ2V0PGFueT4oc3ltYm9sLCAuLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgLy8gY29weSBwcm90b3R5cGUgc28gaW5zdGFuY2VvZiBvcGVyYXRvciBzdGlsbCB3b3Jrc1xuICAgIG5ld0NvbnN0cnVjdG9yLnByb3RvdHlwZSA9IG9yaWdpbmFsLnByb3RvdHlwZTtcbiAgICAvLyBuZXdDb25zdHJ1Y3Rvci5fX3Byb3RvX18gPSBvcmlnaW5hbC5fX3Byb3RvX187XG4gICAgLy8gU2V0cyB0aGUgcHJvcGVyIGNvbnN0cnVjdG9yIG5hbWUgZm9yIHR5cGUgdmVyaWZpY2F0aW9uXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG5ld0NvbnN0cnVjdG9yLCBcIm5hbWVcIiwge1xuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICB2YWx1ZTogb3JpZ2luYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yLm5hbWUsXG4gICAgfSk7XG5cbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgZ2V0SW5qZWN0S2V5KEluamVjdGFibGVzS2V5cy5JTkpFQ1RBQkxFKSxcbiAgICAgIG1ldGFkYXRhLFxuICAgICAgbmV3Q29uc3RydWN0b3JcbiAgICApO1xuXG4gICAgSW5qZWN0YWJsZXMucmVnaXN0ZXIob3JpZ2luYWwsIHN5bWJvbCwgY2ZnKTtcbiAgICAvLyByZXR1cm4gbmV3IGNvbnN0cnVjdG9yICh3aWxsIG92ZXJyaWRlIG9yaWdpbmFsKVxuICAgIHJldHVybiBuZXdDb25zdHJ1Y3RvcjtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJpYyBjb25zdHJ1Y3RvciB0eXBlIGZvciBjbGFzcy1saWtlIHZhbHVlcy5cbiAqIEBzdW1tYXJ5IFJlcHJlc2VudHMgYW55IGNsYXNzIHRoYXQgY2FuIGJlIGluc3RhbnRpYXRlZCB3aXRoIGFyYml0cmFyeSBhcmd1bWVudHMsIHByb2R1Y2luZyBhbiBpbnN0YW5jZSBvZiB0eXBlIFQuXG4gKiBAdGVtcGxhdGUgVCBUaGUgaW5zdGFuY2UgdHlwZSBjcmVhdGVkIGJ5IHRoZSBjb25zdHJ1Y3Rvci5cbiAqIEB0eXBlZGVmIENvbnN0cnVjdG9yXG4gKiBAZXhhbXBsZVxuICogLy8gVXNpbmcgQ29uc3RydWN0b3IgdG8gdHlwZSBhIGZhY3RvcnlcbiAqIGZ1bmN0aW9uIG1ha2U8VD4oQ3RvcjogQ29uc3RydWN0b3I8VD4sIC4uLmFyZ3M6IGFueVtdKTogVCB7XG4gKiAgIHJldHVybiBuZXcgQ3RvciguLi5hcmdzKTtcbiAqIH1cbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCB0eXBlIENvbnN0cnVjdG9yPFQgPSBhbnk+ID0geyBuZXcgKC4uLmFyZ3M6IGFueVtdKTogVCB9O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIGNsYXNzIGFzIGF2YWlsYWJsZSBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgY2xhc3MgYXMgYW4gaW5qZWN0YWJsZSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVnaXN0cnkuXG4gKiBXaGVuIGFwcGxpZWQgdG8gYSBjbGFzcywgcmVwbGFjZXMgaXRzIGNvbnN0cnVjdG9yIHdpdGggb25lIHRoYXQgcmV0dXJucyBhbiBpbnN0YW5jZS5cbiAqXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnkpOiBhbnl9IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyB0aGUgY2xhc3MgaW50byBhbiBpbmplY3RhYmxlLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RhYmxlKCk6IChvcmlnaW5hbDogYW55KSA9PiBhbnk7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIGNsYXNzIGFzIGF2YWlsYWJsZSBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgY2xhc3MgYXMgYW4gaW5qZWN0YWJsZSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVnaXN0cnkuXG4gKiBXaGVuIGFwcGxpZWQgdG8gYSBjbGFzcywgcmVwbGFjZXMgaXRzIGNvbnN0cnVjdG9yIHdpdGggb25lIHRoYXQgcmV0dXJucyBhbiBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZyB8IENvbnN0cnVjdG9yfSBjYXRlZ29yeSBEZWZhdWx0cyB0byB0aGUgY2xhc3MgY2F0ZWdvcnkuIFVzZWZ1bCB3aGVuIG1pbmlmaWNhdGlvbiBvY2N1cnMgYW5kIG5hbWVzIGFyZSBjaGFuZ2VkLFxuICogb3Igd2hlbiB5b3Ugd2FudCB0byB1cGNhc3QgdGhlIG9iamVjdCB0byBhIGRpZmZlcmVudCB0eXBlLlxuICpcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSBjbGFzcyBpbnRvIGFuIGluamVjdGFibGUuXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdGFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdGFibGUoXG4gIGNhdGVnb3J5OiBzdHJpbmcgfCBDb25zdHJ1Y3RvclxuKTogKG9yaWdpbmFsOiBhbnkpID0+IGFueTtcbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IG1hcmtzIGEgY2xhc3MgYXMgYXZhaWxhYmxlIGZvciBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqIEBzdW1tYXJ5IERlZmluZXMgYSBjbGFzcyBhcyBhbiBpbmplY3RhYmxlIHRoYXQgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSByZWdpc3RyeS5cbiAqIFdoZW4gYXBwbGllZCB0byBhIGNsYXNzLCByZXBsYWNlcyBpdHMgY29uc3RydWN0b3Igd2l0aCBvbmUgdGhhdCByZXR1cm5zIGFuIGluc3RhbmNlLlxuICpcbiAqIEBwYXJhbSB7UGFydGlhbDxJbmplY3RhYmxlQ29uZmlnPn0gY2ZnPURlZmF1bHRJbmplY3RhYmxlQ29uZmlnIEFsbG93cyBvdmVycmlkaW5nIHRoZSBkZWZhdWx0IHNpbmdsZXRvbiBiZWhhdmlvciBhbmQgYWRkaW5nIGEgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55KTogYW55fSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgdGhlIGNsYXNzIGludG8gYW4gaW5qZWN0YWJsZS5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0YWJsZShcbiAgY2ZnOiBQYXJ0aWFsPEluamVjdGFibGVDb25maWc+XG4pOiAob3JpZ2luYWw6IGFueSkgPT4gYW55O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIGNsYXNzIGFzIGF2YWlsYWJsZSBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgY2xhc3MgYXMgYW4gaW5qZWN0YWJsZSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVnaXN0cnkuXG4gKiBXaGVuIGFwcGxpZWQgdG8gYSBjbGFzcywgcmVwbGFjZXMgaXRzIGNvbnN0cnVjdG9yIHdpdGggb25lIHRoYXQgcmV0dXJucyBhbiBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0gY2F0ZWdvcnkgRGVmYXVsdHMgdG8gdGhlIGNsYXNzIGNhdGVnb3J5LiBVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2NjdXJzIGFuZCBuYW1lcyBhcmUgY2hhbmdlZCxcbiAqIG9yIHdoZW4geW91IHdhbnQgdG8gdXBjYXN0IHRoZSBvYmplY3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAqIEBwYXJhbSB7UGFydGlhbDxJbmplY3RhYmxlQ29uZmlnPn0gY2ZnPURlZmF1bHRJbmplY3RhYmxlQ29uZmlnIEFsbG93cyBvdmVycmlkaW5nIHRoZSBkZWZhdWx0IHNpbmdsZXRvbiBiZWhhdmlvciBhbmQgYWRkaW5nIGEgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55KTogYW55fSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgdGhlIGNsYXNzIGludG8gYW4gaW5qZWN0YWJsZS5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0YWJsZShcbiAgY2F0ZWdvcnk6IHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICBjZmc6IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz5cbik6IChvcmlnaW5hbDogYW55KSA9PiBhbnk7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIGNsYXNzIGFzIGF2YWlsYWJsZSBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgY2xhc3MgYXMgYW4gaW5qZWN0YWJsZSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVnaXN0cnkuXG4gKiBXaGVuIGFwcGxpZWQgdG8gYSBjbGFzcywgcmVwbGFjZXMgaXRzIGNvbnN0cnVjdG9yIHdpdGggb25lIHRoYXQgcmV0dXJucyBhbiBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZyB8IENvbnN0cnVjdG9yfSBbY2F0ZWdvcnldIERlZmF1bHRzIHRvIHRoZSBjbGFzcyBjYXRlZ29yeS4gVXNlZnVsIHdoZW4gbWluaWZpY2F0aW9uIG9jY3VycyBhbmQgbmFtZXMgYXJlIGNoYW5nZWQsXG4gKiBvciB3aGVuIHlvdSB3YW50IHRvIHVwY2FzdCB0aGUgb2JqZWN0IHRvIGEgZGlmZmVyZW50IHR5cGUuXG4gKiBAcGFyYW0ge1BhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz59IFtjZmc9RGVmYXVsdEluamVjdGFibGVDb25maWddIEFsbG93cyBvdmVycmlkaW5nIHRoZSBkZWZhdWx0IHNpbmdsZXRvbiBiZWhhdmlvciBhbmQgYWRkaW5nIGEgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55KTogYW55fSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgdGhlIGNsYXNzIGludG8gYW4gaW5qZWN0YWJsZS5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0YWJsZVxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBEZWNvcmF0b3JcbiAqICAgcGFydGljaXBhbnQgSW5qZWN0YWJsZXNcbiAqXG4gKiAgIENsaWVudC0+PkRlY29yYXRvcjogQGluamVjdGFibGUoKVxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IENyZWF0ZSBuZXcgY29uc3RydWN0b3JcbiAqXG4gKiAgIE5vdGUgb3ZlciBEZWNvcmF0b3I6IFdoZW4gbmV3IGluc3RhbmNlIHJlcXVlc3RlZFxuICogICBEZWNvcmF0b3ItPj5JbmplY3RhYmxlczogZ2V0KGNhdGVnb3J5KVxuICogICBhbHQgSW5zdGFuY2UgZXhpc3RzXG4gKiAgICAgSW5qZWN0YWJsZXMtLT4+RGVjb3JhdG9yOiBSZXR1cm4gZXhpc3RpbmcgaW5zdGFuY2VcbiAqICAgZWxzZSBObyBpbnN0YW5jZVxuICogICAgIERlY29yYXRvci0+PkluamVjdGFibGVzOiByZWdpc3RlcihvcmlnaW5hbCwgY2F0ZWdvcnkpXG4gKiAgICAgRGVjb3JhdG9yLT4+SW5qZWN0YWJsZXM6IGdldChjYXRlZ29yeSlcbiAqICAgICBJbmplY3RhYmxlcy0tPj5EZWNvcmF0b3I6IFJldHVybiBuZXcgaW5zdGFuY2VcbiAqICAgICBvcHQgSGFzIGNhbGxiYWNrXG4gKiAgICAgICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IENhbGwgaW5zdGFuY2VDYWxsYmFja1xuICogICAgIGVuZFxuICogICBlbmRcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBEZWZpbmUgbWV0YWRhdGFcbiAqICAgRGVjb3JhdG9yLS0+PkNsaWVudDogUmV0dXJuIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RhYmxlKFxuICBjYXRlZ29yeT86IHN0cmluZyB8IENvbnN0cnVjdG9yIHwgUGFydGlhbDxJbmplY3RhYmxlQ29uZmlnPixcbiAgY2ZnPzogUGFydGlhbDxJbmplY3RhYmxlQ29uZmlnPlxuKSB7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihJbmplY3RhYmxlc0tleXMuSU5KRUNUQUJMRSlcbiAgICAuZGVmaW5lKHsgZGVjb3JhdG9yOiBpbmplY3RhYmxlQmFzZURlY29yYXRvciwgYXJnczogW2NhdGVnb3J5LCBjZmddIH0pXG4gICAgLmFwcGx5KCk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlbmllbmNlIGRlY29yYXRvciB0byByZWdpc3RlciBhbiBpbmplY3RhYmxlIGFzIGEgc2luZ2xldG9uLlxuICogQHN1bW1hcnkgV3JhcHMge0BsaW5rIGluamVjdGFibGV9IGZvcmNpbmcgdGhlIHNpbmdsZXRvbiBsaWZlY3ljbGUgc28gb25seSBvbmUgaW5zdGFuY2UgaXMgY3JlYXRlZCBhbmQgcmV1c2VkLlxuICogQHBhcmFtIHtzdHJpbmd8Q29uc3RydWN0b3J9IFtjYXRlZ29yeV0gT3B0aW9uYWwgZXhwbGljaXQgY2F0ZWdvcnkvc3ltYm9sIHNvdXJjZTsgZGVmYXVsdHMgdG8gdGhlIGNsYXNzLlxuICogQHBhcmFtIHtPbWl0PEluamVjdGFibGVDb25maWcsIFwic2luZ2xldG9uXCI+fSBbY2ZnXSBBZGRpdGlvbmFsIGluamVjdGFibGUgY29uZmlndXJhdGlvbiBleGNsdWRpbmcgdGhlIHNpbmdsZXRvbiBmbGFnLlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55KTogYW55fSBBIGNsYXNzIGRlY29yYXRvciB0aGF0IHJlZ2lzdGVycyB0aGUgdGFyZ2V0IGFzIGEgc2luZ2xldG9uIGluamVjdGFibGUuXG4gKiBAZnVuY3Rpb24gc2luZ2xldG9uXG4gKiBAY2F0ZWdvcnkgQ2xhc3MgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2luZ2xldG9uKFxuICBjYXRlZ29yeT86IHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICBjZmc/OiBPbWl0PEluamVjdGFibGVDb25maWcsIFwic2luZ2xldG9uXCI+XG4pIHtcbiAgcmV0dXJuIGluamVjdGFibGUoXG4gICAgY2F0ZWdvcnkgYXMgYW55LFxuICAgIE9iamVjdC5hc3NpZ24oe30sIGNmZyB8fCB7fSwgeyBzaW5nbGV0b246IHRydWUgfSlcbiAgKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29udmVuaWVuY2UgZGVjb3JhdG9yIHRvIHJlZ2lzdGVyIGFuIGluamVjdGFibGUgYXMgb24tZGVtYW5kIChub24tc2luZ2xldG9uKS5cbiAqIEBzdW1tYXJ5IFdyYXBzIHtAbGluayBpbmplY3RhYmxlfSBmb3JjaW5nIG5ldyBpbnN0YW5jZXMgdG8gYmUgY3JlYXRlZCBvbiBldmVyeSBpbmplY3Rpb24gb3IgcmV0cmlldmFsLlxuICogQHBhcmFtIHtzdHJpbmd8Q29uc3RydWN0b3J9IFtjYXRlZ29yeV0gT3B0aW9uYWwgZXhwbGljaXQgY2F0ZWdvcnkvc3ltYm9sIHNvdXJjZTsgZGVmYXVsdHMgdG8gdGhlIGNsYXNzLlxuICogQHBhcmFtIHtPbWl0PEluamVjdGFibGVDb25maWcsIFwic2luZ2xldG9uXCI+fSBbY2ZnXSBBZGRpdGlvbmFsIGluamVjdGFibGUgY29uZmlndXJhdGlvbiBleGNsdWRpbmcgdGhlIHNpbmdsZXRvbiBmbGFnLlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55KTogYW55fSBBIGNsYXNzIGRlY29yYXRvciB0aGF0IHJlZ2lzdGVycyB0aGUgdGFyZ2V0IGFzIGEgbm9uLXNpbmdsZXRvbiBpbmplY3RhYmxlLlxuICogQGZ1bmN0aW9uIG9uRGVtYW5kXG4gKiBAY2F0ZWdvcnkgQ2xhc3MgRGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gb25EZW1hbmQoXG4gIGNhdGVnb3J5Pzogc3RyaW5nIHwgQ29uc3RydWN0b3IsXG4gIGNmZz86IE9taXQ8SW5qZWN0YWJsZUNvbmZpZywgXCJzaW5nbGV0b25cIj5cbikge1xuICByZXR1cm4gaW5qZWN0YWJsZShcbiAgICBjYXRlZ29yeSBhcyBhbnksXG4gICAgT2JqZWN0LmFzc2lnbih7fSwgY2ZnIHx8IHt9LCB7IHNpbmdsZXRvbjogZmFsc2UgfSlcbiAgKTtcbn1cbi8qKlxuICogQGRlc2NyaXB0aW9uIEZ1bmN0aW9uIHR5cGUgZm9yIHRyYW5zZm9ybWluZyBpbmplY3RhYmxlIGluc3RhbmNlcyBiZWZvcmUgdGhleSdyZSBpbmplY3RlZC5cbiAqIEBzdW1tYXJ5IEZ1bmN0aW9uIHdoaWNoIHRyYW5zZm9ybXMgYSBjYWNoZWQge0BsaW5rIGluamVjdGFibGV9IGluc3RhbmNlIGJlZm9yZSBpdCdzIGluamVjdGVkIGludG8gYSB0YXJnZXQgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7YW55fSBpbmplY3RhYmxlIFRoZSBpbmplY3RhYmxlIGluc3RhbmNlIHRvIHRyYW5zZm9ybVxuICogQHBhcmFtIHthbnl9IG9iaiBUaGUgb2JqZWN0IHRoZSBpbmplY3RhYmxlIHdpbGwgYmUgaW5qZWN0ZWQgb25cbiAqIEByZXR1cm4ge2FueX0gVGhlIHRyYW5zZm9ybWVkIGluamVjdGFibGUgaW5zdGFuY2VcbiAqXG4gKiBAdHlwZWRlZiB7RnVuY3Rpb259IEluc3RhbmNlVHJhbnNmb3JtZXJcbiAqIEBjYXRlZ29yeSBEZWNvcmF0b3JzXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBJbnN0YW5jZVRyYW5zZm9ybWVyID0gKGluamVjdGFibGU6IGFueSwgb2JqOiBhbnkpID0+IGFueTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gT3B0aW9ucyBmb3IgdGhlIHByb3BlcnR5LWxldmVsIEBpbmplY3QgZGVjb3JhdG9yLlxuICogQHN1bW1hcnkgQWxsb3dzIHNwZWNpZnlpbmcgY29uc3RydWN0b3IgYXJndW1lbnRzIGFuZCBhbiBvcHRpb25hbCB0cmFuc2Zvcm1lciB0byBiZSBhcHBsaWVkIHRvIHRoZSByZXNvbHZlZCBpbnN0YW5jZS5cbiAqIEBwcm9wZXJ0eSB7YW55W119IFthcmdzXSBPcHRpb25hbCBjb25zdHJ1Y3RvciBhcmd1bWVudHMgdG8gdXNlIHdoZW4gYnVpbGRpbmcgdGhlIGluamVjdGFibGUgaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge0luc3RhbmNlVHJhbnNmb3JtZXJ9IFt0cmFuc2Zvcm1lcl0gT3B0aW9uYWwgZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHRoZSBpbnN0YW5jZSBiZWZvcmUgYXNzaWdubWVudC5cbiAqIEB0eXBlZGVmIEluamVjdE9wdGlvbnNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCB0eXBlIEluamVjdE9wdGlvbnMgPSB7XG4gIGFyZ3M/OiBhbnlbXTtcbiAgdHJhbnNmb3JtZXI/OiBJbnN0YW5jZVRyYW5zZm9ybWVyO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdEJhc2VEZWNvcmF0b3IoXG4gIGNhdGVnb3J5Pzogc3ltYm9sIHwgc3RyaW5nIHwgQ29uc3RydWN0b3IgfCBQYXJ0aWFsPEluamVjdE9wdGlvbnM+LFxuICBjZmc/OiBQYXJ0aWFsPEluamVjdE9wdGlvbnM+XG4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluamVjdElubmVyRGVjb3JhdG9yKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkge1xuICAgIGNvbnN0IGNvbmZpZzogSW5qZWN0T3B0aW9ucyA9IChcbiAgICAgIGNmZyB8fCB0eXBlb2YgY2F0ZWdvcnkgPT09IFwib2JqZWN0XCIgPyBjYXRlZ29yeSA6IHt9XG4gICAgKSBhcyBJbmplY3RPcHRpb25zO1xuXG4gICAgY29uc3QgbmFtZTogc3ltYm9sIHwgc3RyaW5nIHwgQ29uc3RydWN0b3IgfCB1bmRlZmluZWQgPVxuICAgICAgKHR5cGVvZiBjYXRlZ29yeSAhPT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAoY2F0ZWdvcnkgYXMgc3ltYm9sIHwgc3RyaW5nIHwgQ29uc3RydWN0b3IpKSB8fFxuICAgICAgZ2V0VHlwZUZyb21EZWNvcmF0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgVHlwZSBmcm9tIGRlY29yYXRvcmApO1xuICAgIH1cblxuICAgIC8vIHByb3AoKSh0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgZ2V0SW5qZWN0S2V5KEluamVjdGFibGVzS2V5cy5JTkpFQ1QpLFxuICAgICAge1xuICAgICAgICBpbmplY3RhYmxlOiBuYW1lLFxuICAgICAgfSxcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcblxuICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0KHRoaXM6IGFueSkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBwcm9wZXJ0eUtleVxuICAgICAgICApIGFzIFByb3BlcnR5RGVzY3JpcHRvcjtcbiAgICAgICAgaWYgKGRlc2NyaXB0b3IuY29uZmlndXJhYmxlKSB7XG4gICAgICAgICAgLy8gbGV0IC9vYmo6IGFueTtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0KHRoaXM6IGFueSkge1xuICAgICAgICAgICAgICBsZXQgb2JqID0gdmFsdWVzLmdldCh0aGlzKTtcbiAgICAgICAgICAgICAgaWYgKG9iaikgcmV0dXJuIG9iajtcbiAgICAgICAgICAgICAgb2JqID0gSW5qZWN0YWJsZXMuZ2V0KG5hbWUsIC4uLihjb25maWcuYXJncyB8fCBbXSkpO1xuICAgICAgICAgICAgICBpZiAoIW9iailcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgQ291bGQgbm90IGdldCBJbmplY3RhYmxlICR7bmFtZS50b1N0cmluZygpfSB0byBpbmplY3QgaW4gJHt0YXJnZXQuY29uc3RydWN0b3IgPyB0YXJnZXQuY29uc3RydWN0b3IubmFtZSA6IHRhcmdldC5uYW1lfSdzICR7cHJvcGVydHlLZXl9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChjb25maWcudHJhbnNmb3JtZXIpXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIG9iaiA9IGNvbmZpZy50cmFuc2Zvcm1lcihvYmosIHRhcmdldCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhbHVlcy5zZXQodGhpcywgb2JqKTtcblxuICAgICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdGhpc1twcm9wZXJ0eUtleV07XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByb3BlcnR5IGRlY29yYXRvciB0aGF0IGluamVjdHMgYSBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIEBzdW1tYXJ5IEFsbG93cyBmb3IgdGhlIGluamVjdGlvbiBvZiBhbiB7QGxpbmsgaW5qZWN0YWJsZX0gZGVjb3JhdGVkIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogVGhlIHByb3BlcnR5IG11c3QgYmUgdHlwZWQgZm9yIHRoZSByZXF1ZXN0ZWQgZGVwZW5kZW5jeS4gT25seSBjb25jcmV0ZSBjbGFzc2VzIGFyZSBzdXBwb3J0ZWQ7IGdlbmVyaWNzIGFyZSBub3QuXG4gKlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnkpOiB2b2lkfSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdCgpOiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBhbnkpID0+IHZvaWQ7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGEgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBAc3VtbWFyeSBBbGxvd3MgZm9yIHRoZSBpbmplY3Rpb24gb2YgYW4ge0BsaW5rIGluamVjdGFibGV9IGRlY29yYXRlZCBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIFRoZSBwcm9wZXJ0eSBtdXN0IGJlIHR5cGVkIGZvciB0aGUgcmVxdWVzdGVkIGRlcGVuZGVuY3kuIE9ubHkgY29uY3JldGUgY2xhc3NlcyBhcmUgc3VwcG9ydGVkOyBnZW5lcmljcyBhcmUgbm90LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjYXRlZ29yeSBEZWZhdWx0cyB0byB0aGUgY2xhc3MgbmFtZSBkZXJpdmVkIGZyb20gdGhlIHByb3BlcnR5IHR5cGUuIFVzZWZ1bCB3aGVuIG1pbmlmaWNhdGlvbiBvY2N1cnNcbiAqIGFuZCBuYW1lcyBhcmUgY2hhbmdlZCwgb3Igd2hlbiB5b3Ugd2FudCB0byB1cGNhc3QgdGhlIG9iamVjdCB0byBhIGRpZmZlcmVudCB0eXBlLlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnkpOiB2b2lkfSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdChcbiAgY2F0ZWdvcnk6IHN0cmluZyB8IENvbnN0cnVjdG9yXG4pOiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBhbnkpID0+IHZvaWQ7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGEgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBAc3VtbWFyeSBBbGxvd3MgZm9yIHRoZSBpbmplY3Rpb24gb2YgYW4ge0BsaW5rIGluamVjdGFibGV9IGRlY29yYXRlZCBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIFRoZSBwcm9wZXJ0eSBtdXN0IGJlIHR5cGVkIGZvciB0aGUgcmVxdWVzdGVkIGRlcGVuZGVuY3kuIE9ubHkgY29uY3JldGUgY2xhc3NlcyBhcmUgc3VwcG9ydGVkOyBnZW5lcmljcyBhcmUgbm90LlxuICpcbiAqIEBwYXJhbSB7UGFydGlhbDxJbmplY3RPcHRpb25zPn0gW2NmZz17fV0gT3B0aW9uYWwgZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHRoZSBpbmplY3RhYmxlIGluc3RhbmNlIGJlZm9yZSBpdCdzIGluamVjdGVkLCBvciBhcmd1bWVudHMgdG8gcGFzcyB0aGUgY29uc3RydWN0b3Igd2hlbiBpbmplY3Rpbmcgb25EZW1hbmRcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSwgYW55KTogdm9pZH0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3QoXG4gIGNmZzogUGFydGlhbDxJbmplY3RPcHRpb25zPlxuKTogKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogYW55KSA9PiB2b2lkO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogQHN1bW1hcnkgQWxsb3dzIGZvciB0aGUgaW5qZWN0aW9uIG9mIGFuIHtAbGluayBpbmplY3RhYmxlfSBkZWNvcmF0ZWQgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBUaGUgcHJvcGVydHkgbXVzdCBiZSB0eXBlZCBmb3IgdGhlIHJlcXVlc3RlZCBkZXBlbmRlbmN5LiBPbmx5IGNvbmNyZXRlIGNsYXNzZXMgYXJlIHN1cHBvcnRlZDsgZ2VuZXJpY3MgYXJlIG5vdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2F0ZWdvcnkgRGVmYXVsdHMgdG8gdGhlIGNsYXNzIG5hbWUgZGVyaXZlZCBmcm9tIHRoZSBwcm9wZXJ0eSB0eXBlLiBVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2NjdXJzXG4gKiBhbmQgbmFtZXMgYXJlIGNoYW5nZWQsIG9yIHdoZW4geW91IHdhbnQgdG8gdXBjYXN0IHRoZSBvYmplY3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAqIEBwYXJhbSB7UGFydGlhbDxJbmplY3RPcHRpb25zPn0gY2ZnPXt9IE9wdGlvbmFsIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgaW5qZWN0YWJsZSBpbnN0YW5jZSBiZWZvcmUgaXQncyBpbmplY3RlZCwgb3IgYXJndW1lbnRzIHRvIHBhc3MgdGhlIGNvbnN0cnVjdG9yIHdoZW4gaW5qZWN0aW5nIG9uRGVtYW5kXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueSk6IHZvaWR9IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0KFxuICBjYXRlZ29yeTogc3RyaW5nIHwgQ29uc3RydWN0b3IsXG4gIGNmZzogUGFydGlhbDxJbmplY3RPcHRpb25zPlxuKTogKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogYW55KSA9PiB2b2lkO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogQHN1bW1hcnkgQWxsb3dzIGZvciB0aGUgaW5qZWN0aW9uIG9mIGFuIHtAbGluayBpbmplY3RhYmxlfSBkZWNvcmF0ZWQgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBUaGUgcHJvcGVydHkgbXVzdCBiZSB0eXBlZCBmb3IgdGhlIHJlcXVlc3RlZCBkZXBlbmRlbmN5LiBPbmx5IGNvbmNyZXRlIGNsYXNzZXMgYXJlIHN1cHBvcnRlZDsgZ2VuZXJpY3MgYXJlIG5vdC5cbiAqXG4gKiBJbmplY3RlZCBwcm9wZXJ0aWVzIHNob3VsZCBiZSBkZXNjcmliZWQgbGlrZSBzbzpcbiAqIDxwcmU+XG4gKiAgICAgY2xhc3MgQ2xhc3NOYW1lIHtcbiAqICAgICAgICAgLi4uXG4gKlxuICogICAgICAgICBAaW5qZWN0KClcbiAqICAgICAgICAgcHJvcGVydHlOYW1lITogSW5qZWN0YWJsZUNsYXNzO1xuICpcbiAqICAgICAgICAgLi4uXG4gKiAgICAgfVxuICogPC9wcmU+XG4gKlxuICogd2hlcmUgSW5qZWN0YWJsZUNsYXNzIGlzIHRoZSBjbGFzcyB5b3Ugd2FudCB0byBpbmplY3QuXG4gKiBOb3RpY2UgdGhlIHVzZSBvZiAnITonIHRvIGVuc3VyZSB0aGUgdHJhbnNwaWxlciB0aGUgcHJvcGVydHkgd2lsbCBiZSBzZXQgb3V0c2lkZSB0aGUgY29uc3RydWN0b3IgYnV0IHdpbGwgYWx3YXlzIGJlIGRlZmluZWQuXG4gKiBGb3IgcHJvamVjdHMgd2hlcmUgbWluaWZpY2F0aW9uIG9jY3VycywgeW91IHNob3VsZCB1c2UgdGhlIGNhdGVnb3J5IHBhcmFtIHRvIGVuc3VyZSB0aGUgbmFtZSBpcyB0aGUgc2FtZSB0aHJvdWdob3V0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbY2F0ZWdvcnldIERlZmF1bHRzIHRvIHRoZSBjbGFzcyBuYW1lIGRlcml2ZWQgZnJvbSB0aGUgcHJvcGVydHkgdHlwZS4gVXNlZnVsIHdoZW4gbWluaWZpY2F0aW9uIG9jY3Vyc1xuICogYW5kIG5hbWVzIGFyZSBjaGFuZ2VkLCBvciB3aGVuIHlvdSB3YW50IHRvIHVwY2FzdCB0aGUgb2JqZWN0IHRvIGEgZGlmZmVyZW50IHR5cGUuXG4gKiBAcGFyYW0ge1BhcnRpYWw8SW5qZWN0T3B0aW9ucz59IFtjZmc9e31dIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgaW5qZWN0YWJsZSBpbnN0YW5jZSBiZWZvcmUgaXQncyBpbmplY3RlZCwgb3IgYXJndW1lbnRzIHRvIHBhc3MgdGhlIGNvbnN0cnVjdG9yIHdoZW4gaW5qZWN0aW5nIG9uRGVtYW5kXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueSk6IHZvaWR9IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBEZWNvcmF0b3JcbiAqICAgcGFydGljaXBhbnQgSW5qZWN0YWJsZXNcbiAqXG4gKiAgIENsaWVudC0+PkRlY29yYXRvcjogQGluamVjdCgpXG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogR2V0IHR5cGUgZnJvbSBwcm9wZXJ0eVxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IERlZmluZSBtZXRhZGF0YVxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IERlZmluZSBwcm9wZXJ0eSBnZXR0ZXJcbiAqXG4gKiAgIE5vdGUgb3ZlciBEZWNvcmF0b3I6IFdoZW4gcHJvcGVydHkgYWNjZXNzZWRcbiAqICAgQ2xpZW50LT4+RGVjb3JhdG9yOiBhY2Nlc3MgcHJvcGVydHlcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBDaGVjayBpZiBpbnN0YW5jZSBleGlzdHNcbiAqICAgYWx0IEluc3RhbmNlIGV4aXN0cyBpbiBXZWFrTWFwXG4gKiAgICAgRGVjb3JhdG9yLS0+PkNsaWVudDogUmV0dXJuIGNhY2hlZCBpbnN0YW5jZVxuICogICBlbHNlIE5vIGluc3RhbmNlXG4gKiAgICAgRGVjb3JhdG9yLT4+SW5qZWN0YWJsZXM6IGdldChuYW1lKVxuICogICAgIGFsdCBJbmplY3RhYmxlIGZvdW5kXG4gKiAgICAgICBJbmplY3RhYmxlcy0tPj5EZWNvcmF0b3I6IFJldHVybiBpbmplY3RhYmxlIGluc3RhbmNlXG4gKiAgICAgICBvcHQgSGFzIHRyYW5zZm9ybWVyXG4gKiAgICAgICAgIERlY29yYXRvci0+PkRlY29yYXRvcjogQ2FsbCB0cmFuc2Zvcm1lclxuICogICAgICAgZW5kXG4gKiAgICAgICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IFN0b3JlIGluIFdlYWtNYXBcbiAqICAgICAgIERlY29yYXRvci0tPj5DbGllbnQ6IFJldHVybiBpbnN0YW5jZVxuICogICAgIGVsc2UgTm8gaW5qZWN0YWJsZVxuICogICAgICAgRGVjb3JhdG9yLS0+PkNsaWVudDogVGhyb3cgZXJyb3JcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3QoXG4gIGNhdGVnb3J5Pzogc3ltYm9sIHwgc3RyaW5nIHwgQ29uc3RydWN0b3IgfCBQYXJ0aWFsPEluamVjdE9wdGlvbnM+LFxuICBjZmc/OiBQYXJ0aWFsPEluamVjdE9wdGlvbnM+XG4pIHtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEluamVjdGFibGVzS2V5cy5JTkpFQ1QpXG4gICAgLmRlZmluZSh7IGRlY29yYXRvcjogaW5qZWN0QmFzZURlY29yYXRvciwgYXJnczogW2NhdGVnb3J5LCBjZmddIH0pXG4gICAgLmFwcGx5KCk7XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBBIGxpZ2h0d2VpZ2h0IGRlcGVuZGVuY3kgaW5qZWN0aW9uIGxpYnJhcnkgZm9yIFR5cGVTY3JpcHQgYXBwbGljYXRpb25zLlxuICogQHN1bW1hcnkgQWRkcyBhIHNpbXBsZSBJbmplY3RhYmxlcyBpbXBsZW1lbnRhdGlvbiB0byBjcmVhdGUgc2luZ2xldG9uIGluc3RhbmNlcyBvZiBhbiBvYmplY3RcbiAqIGFuZCBlYXNpbHkgaW5qZWN0IGl0IGludG8gb3RoZXIgb2JqZWN0cy4gUHJvdmlkZXMgZGVjb3JhdG9ycyBmb3IgbWFya2luZyBjbGFzc2VzIGFzIGluamVjdGFibGVcbiAqIGFuZCBmb3IgaW5qZWN0aW5nIGRlcGVuZGVuY2llcyBpbnRvIGNsYXNzIHByb3BlcnRpZXMuXG4gKlxuICogQG1vZHVsZSBpbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuXG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0luamVjdGFibGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZWdpc3RyeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgaW5qZWN0YWJsZS1kZWNvcmF0b3JzIGxpYnJhcnkuXG4gKiBAc3VtbWFyeSBEZWZpbmVkIG9uIGxpYnJhcnkgYnVpbGQuIEhvbGRzIHRoZSBsaWJyYXJ5J3MgY3VycmVudCB2ZXJzaW9uIHN0cmluZy5cbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcblxuTWV0YWRhdGEucmVnaXN0ZXJMaWJyYXJ5KFwiQGRlY2FmLXRzL2luamVjdGFibGUtZGVjb3JhdG9yc1wiLCBWRVJTSU9OKTtcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQTs7Ozs7Ozs7QUFRRztBQUNVLE1BQUEsZUFBZSxHQUFHO0FBQzdCLElBQUEsT0FBTyxFQUFFLFlBQVk7QUFDckIsSUFBQSxVQUFVLEVBQUUsWUFBWTtBQUN4QixJQUFBLE1BQU0sRUFBRSxRQUFROztBQUdsQjs7Ozs7QUFLRztBQUNVLE1BQUEsd0JBQXdCLEdBQXFCO0FBQ3hELElBQUEsU0FBUyxFQUFFLElBQUk7O0FBR2pCOzs7OztBQUtHO0FBQ0ksTUFBTSxPQUFPLEdBQUc7O0FDOUJ2Qjs7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
|
|
521
|
+
export { DefaultInjectablesConfig, InjectableRegistryImp, Injectables, InjectablesKeys, PACKAGE_NAME, TypeKey, VERSION, getInjectKey, inject, injectBaseDecorator, injectable, injectableBaseDecorator, onDemand, singleton };
|
|
522
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5qZWN0YWJsZS1kZWNvcmF0b3JzLmVzbS5janMiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb25zdGFudHMudHMiLCIuLi9zcmMvdXRpbHMudHMiLCIuLi9zcmMvcmVnaXN0cnkudHMiLCIuLi9zcmMvSW5qZWN0YWJsZXMudHMiLCIuLi9zcmMvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlQ29uZmlnIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25zdGFudHMgdXNlZCBmb3IgcmVmbGVjdGlvbiBtZXRhZGF0YSBrZXlzIGluIHRoZSBkZXBlbmRlbmN5IGluamVjdGlvbiBzeXN0ZW0uXG4gKiBAc3VtbWFyeSBJbmplY3RhYmxlcyBSZWZsZWN0aW9uIGtleXMgdXNlZCB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEgYWJvdXQgaW5qZWN0YWJsZSBjbGFzc2VzIGFuZCBwcm9wZXJ0aWVzLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFRkxFQ1QgUmVmbGVjdGlvbiBpbmplY3RhYmxlcyBiYXNlIGtleSBwcmVmaXggZm9yIGFsbCBtZXRhZGF0YSBrZXlzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSU5KRUNUQUJMRSBSZWZsZWN0aW9uIGtleSBzdWZmaXggZm9yIG1hcmtpbmcgYSBjbGFzcyBhcyBpbmplY3RhYmxlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSU5KRUNUIFJlZmxlY3Rpb24ga2V5IHN1ZmZpeCBmb3IgbWFya2luZyBhIHByb3BlcnR5IGZvciBpbmplY3Rpb25cbiAqIEBjb25zdCBJbmplY3RhYmxlc0tleXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBJbmplY3RhYmxlc0tleXMgPSB7XG4gIFJFRkxFQ1Q6IFwiaW5qZWN0LmRiLlwiLFxuICBJTkpFQ1RBQkxFOiBcImluamVjdGFibGVcIixcbiAgSU5KRUNUOiBcImluamVjdFwiLFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVmYXVsdCBjb25maWd1cmF0aW9uIGFwcGxpZWQgYnkgdGhlIEBpbmplY3RhYmxlIGRlY29yYXRvciB3aGVuIG5vbmUgaXMgcHJvdmlkZWQuXG4gKiBAc3VtbWFyeSBTZXRzIHNlbnNpYmxlIGRlZmF1bHRzIHN1Y2ggYXMgc2luZ2xldG9uIGxpZmVjeWNsZSBmb3IgbmV3bHkgcmVnaXN0ZXJlZCBpbmplY3RhYmxlcy5cbiAqIEBjb25zdCBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWdcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWc6IEluamVjdGFibGVDb25maWcgPSB7XG4gIHNpbmdsZXRvbjogdHJ1ZSxcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlZmxlY3Rpb24gbWV0YWRhdGEga2V5IGZvciBhY2Nlc3NpbmcgVHlwZVNjcmlwdCB0eXBlIGluZm9ybWF0aW9uLlxuICogQHN1bW1hcnkgSG9sZHMgdGhlIGtleSBmb3IgcmV0cmlldmluZyB0aGUgZGVzaWduIHR5cGUgZnJvbSBUeXBlU2NyaXB0J3MgcmVmbGVjdGlvbiBtZXRhZGF0YS5cbiAqIEBjb25zdCBUeXBlS2V5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgVHlwZUtleSA9IFwiZGVzaWduOnR5cGVcIjtcbiIsImltcG9ydCB7IEluamVjdGFibGVzS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBmdWxseSBxdWFsaWZpZWQgcmVmbGVjdGlvbiBtZXRhZGF0YSBrZXkuXG4gKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSByZWZsZWN0aW9uIGtleSBmb3IgaW5qZWN0YWJsZXMgYnkgcHJlZml4aW5nIHRoZSBwcm92aWRlZCBrZXkgd2l0aCB0aGUgYmFzZSByZWZsZWN0aW9uIGtleS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0byBiZSBwcmVmaXhlZFxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZnVsbHkgcXVhbGlmaWVkIHJlZmxlY3Rpb24ga2V5XG4gKiBAZnVuY3Rpb24gZ2V0SW5qZWN0S2V5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgZ2V0SW5qZWN0S2V5ID0gKGtleTogc3RyaW5nKSA9PiBJbmplY3RhYmxlc0tleXMuUkVGTEVDVCArIGtleTtcbiIsImltcG9ydCB7IEluamVjdGFibGVEZWYsIEluamVjdGFibGVPcHRpb25zIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IEluamVjdGFibGVzS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgZ2V0SW5qZWN0S2V5IH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gVHlwZSByZXByZXNlbnRpbmcgZWl0aGVyIGEgY2xhc3MgY29uc3RydWN0b3Igb3IgYW4gaW5zdGFuY2UuXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGFuIEluamVjdGFibGUgdHlwZSB0aGF0IGNhbiBiZSBlaXRoZXIgYSBjbGFzcyBjb25zdHJ1Y3RvciBvciBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzLlxuICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgb2YgdGhlIGluamVjdGFibGUgb2JqZWN0XG4gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oYW55KTogVCB8IFR9IEluamVjdGFibGVcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCB0eXBlIEluamVjdGFibGU8VD4gPSB7IG5ldyAoLi4uYXJnczogYW55W10pOiBUIH0gfCBUO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb250cmFjdCBmb3IgYSByZWdpc3RyeSB0aGF0IG1hbmFnZXMgaW5qZWN0YWJsZSBvYmplY3RzLlxuICogQHN1bW1hcnkgSW50ZXJmYWNlIGZvciBhbiBpbmplY3RhYmxlIHJlZ2lzdHJ5IHRoYXQgcHJvdmlkZXMgbWV0aG9kcyBmb3IgcmV0cmlldmluZywgcmVnaXN0ZXJpbmcsIGFuZCBidWlsZGluZyBpbmplY3RhYmxlIG9iamVjdHMuXG4gKiBAdGVtcGxhdGUgVCBUeXBlIHBhcmFtZXRlciB1c2VkIGluIHRoZSBpbnRlcmZhY2UgbWV0aG9kc1xuICogQGludGVyZmFjZSBJbmplY3RhYmxlc1JlZ2lzdHJ5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluamVjdGFibGVzUmVnaXN0cnkge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZldGNoZXMgYW4gaW5qZWN0YWJsZSBpbnN0YW5jZSBieSBpdHMgcmVnaXN0ZXJlZCBuYW1lLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgYW4ge0BsaW5rIEluamVjdGFibGV9IGZyb20gdGhlIHJlZ2lzdHJ5IGJ5IG5hbWUsIG9wdGlvbmFsbHkgcGFzc2luZyBjb25zdHJ1Y3RvciBhcmd1bWVudHMuXG4gICAqIEB0ZW1wbGF0ZSBUIFR5cGUgb2YgdGhlIGluamVjdGFibGUgb2JqZWN0IHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7c3ltYm9sfSBuYW1lIFRoZSByZWdpc3RlcmVkIG5hbWUgb2YgdGhlIGluamVjdGFibGUgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyBDb25zdHJ1Y3RvciBhcmd1bWVudHMgdG8gcGFzcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIGluamVjdGFibGVcbiAgICogQHJldHVybiB7SW5qZWN0YWJsZTxUPiB8IHVuZGVmaW5lZH0gVGhlIGluamVjdGFibGUgaW5zdGFuY2Ugb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZFxuICAgKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICAgKi9cbiAgZ2V0PFQ+KFxuICAgIG5hbWU6IHN5bWJvbCB8IHN0cmluZyB8IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IFQgfSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBUIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQWRkcyBhIGNsYXNzIG9yIG9iamVjdCB0byB0aGUgaW5qZWN0YWJsZSByZWdpc3RyeS5cbiAgICogQHN1bW1hcnkgUmVnaXN0ZXJzIGFuIGluamVjdGFibGUgY29uc3RydWN0b3Igb3IgaW5zdGFuY2Ugd2l0aCB0aGUgcmVnaXN0cnksIG1ha2luZyBpdCBhdmFpbGFibGUgZm9yIGluamVjdGlvbi5cbiAgICogQHRlbXBsYXRlIFQgVHlwZSBvZiB0aGUgaW5qZWN0YWJsZSBvYmplY3QgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIHtJbmplY3RhYmxlPFQ+fSBjb25zdHJ1Y3RvciBUaGUgY2xhc3MgY29uc3RydWN0b3Igb3Igb2JqZWN0IGluc3RhbmNlIHRvIHJlZ2lzdGVyXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqIEBwYXJhbSB7YW55W119IGFyZ3MgQWRkaXRpb25hbCBhcmd1bWVudHMgZm9yIHJlZ2lzdHJhdGlvbiAoY2F0ZWdvcnksIHNpbmdsZXRvbiBmbGFnLCBldGMuKVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICAgKi9cbiAgcmVnaXN0ZXI8VD4oXG4gICAgY29uc3RydWN0b3I6IEluamVjdGFibGU8VD4sXG4gICAgY2F0ZWdvcnk6IHN5bWJvbCB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zOiBJbmplY3RhYmxlT3B0aW9uczxUPixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBhbiBpbmplY3RhYmxlIGNsYXNzLlxuICAgKiBAc3VtbWFyeSBJbnN0YW50aWF0ZXMgYW4gaW5qZWN0YWJsZSBjbGFzcyB1c2luZyBpdHMgY29uc3RydWN0b3IgYW5kIHRoZSBwcm92aWRlZCBhcmd1bWVudHMuXG4gICAqIEB0ZW1wbGF0ZSBUIFR5cGUgb2YgdGhlIG9iamVjdCB0byBidWlsZFxuICAgKiBAcGFyYW0ge3N5bWJvbH0gbmFtZSBPYmplY3QgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgaW5qZWN0YWJsZSB0byBidWlsZFxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIENvbnN0cnVjdG9yIGFyZ3VtZW50cyB0byBwYXNzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgaW5qZWN0YWJsZVxuICAgKiBAcmV0dXJuIHtUfSBUaGUgbmV3bHkgY3JlYXRlZCBpbnN0YW5jZVxuICAgKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICAgKi9cbiAgYnVpbGQ8VD4obmFtZTogc3ltYm9sLCAuLi5hcmdzOiBhbnlbXSk6IFQ7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEluamVjdGFibGVzUmVnaXN0cnkgaW50ZXJmYWNlLlxuICogQHN1bW1hcnkgSG9sZHMgdGhlIHZhcmlvdXMge0BsaW5rIEluamVjdGFibGV9cyBpbiBhIGNhY2hlIGFuZCBwcm92aWRlcyBtZXRob2RzIHRvIHJlZ2lzdGVyLCByZXRyaWV2ZSwgYW5kIGJ1aWxkIHRoZW0uXG4gKiBAdGVtcGxhdGUgVCBUeXBlIHBhcmFtZXRlciB1c2VkIGluIHRoZSBjbGFzcyBtZXRob2RzXG4gKlxuICogQGNsYXNzIEluamVjdGFibGVSZWdpc3RyeUltcFxuICogQGltcGxlbWVudHMgSW5qZWN0YWJsZXNSZWdpc3RyeVxuICpcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENyZWF0ZSBhIG5ldyByZWdpc3RyeVxuICogY29uc3QgcmVnaXN0cnkgPSBuZXcgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wKCk7XG4gKlxuICogLy8gUmVnaXN0ZXIgYSBjbGFzc1xuICogY2xhc3MgTXlTZXJ2aWNlIHtcbiAqICAgZG9Tb21ldGhpbmcoKSB7XG4gKiAgICAgcmV0dXJuICdIZWxsbyBXb3JsZCc7XG4gKiAgIH1cbiAqIH1cbiAqIHJlZ2lzdHJ5LnJlZ2lzdGVyKE15U2VydmljZSwgJ015U2VydmljZScsIHRydWUpO1xuICpcbiAqIC8vIEdldCB0aGUgaW5zdGFuY2VcbiAqIGNvbnN0IHNlcnZpY2UgPSByZWdpc3RyeS5nZXQoJ015U2VydmljZScpO1xuICogc2VydmljZS5kb1NvbWV0aGluZygpOyAvLyAnSGVsbG8gV29ybGQnXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgUmVnaXN0cnlcbiAqXG4gKiAgIENsaWVudC0+PlJlZ2lzdHJ5OiByZWdpc3RlcihNeVNlcnZpY2UpXG4gKiAgIFJlZ2lzdHJ5LT4+UmVnaXN0cnk6IFN0b3JlIGluIGNhY2hlXG4gKlxuICogICBDbGllbnQtPj5SZWdpc3RyeTogZ2V0KFwiTXlTZXJ2aWNlXCIpXG4gKiAgIGFsdCBJbnN0YW5jZSBleGlzdHMgYW5kIGlzIHNpbmdsZXRvblxuICogICAgIFJlZ2lzdHJ5LS0+PkNsaWVudDogUmV0dXJuIGNhY2hlZCBpbnN0YW5jZVxuICogICBlbHNlIE5vIGluc3RhbmNlIG9yIG5vdCBzaW5nbGV0b25cbiAqICAgICBSZWdpc3RyeS0+PlJlZ2lzdHJ5OiBidWlsZChuYW1lKVxuICogICAgIFJlZ2lzdHJ5LS0+PkNsaWVudDogUmV0dXJuIG5ldyBpbnN0YW5jZVxuICogICBlbmRcbiAqL1xuZXhwb3J0IGNsYXNzIEluamVjdGFibGVSZWdpc3RyeUltcCBpbXBsZW1lbnRzIEluamVjdGFibGVzUmVnaXN0cnkge1xuICBwcml2YXRlIGNhY2hlOiBSZWNvcmQ8c3ltYm9sLCBJbmplY3RhYmxlRGVmPiA9IHt9O1xuXG4gIGhhczxUPihuYW1lOiBzeW1ib2wgfCB7IG5ldyAoLi4uYXJnczogYW55W10pOiBUIH0pOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIG5hbWUgPT09IFwic3ltYm9sXCIpIHJldHVybiBuYW1lIGluIHRoaXMuY2FjaGU7XG4gICAgcmV0dXJuIFN5bWJvbC5mb3IobmFtZS50b1N0cmluZygpKSBpbiB0aGlzLmNhY2hlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBnZXQ8VD4oXG4gICAgbmFtZTogc3ltYm9sIHwgc3RyaW5nIHwgeyBuZXcgKC4uLmFyZ3M6IGFueVtdKTogVCB9LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFQgfCB1bmRlZmluZWQge1xuICAgIGlmICh0eXBlb2YgbmFtZSA9PT0gXCJzdHJpbmdcIikgbmFtZSA9IFN5bWJvbC5mb3IobmFtZSk7XG4gICAgaWYgKHR5cGVvZiBuYW1lICE9PSBcInN5bWJvbFwiKSB7XG4gICAgICBjb25zdCBtZXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgZ2V0SW5qZWN0S2V5KEluamVjdGFibGVzS2V5cy5JTkpFQ1RBQkxFKSxcbiAgICAgICAgbmFtZVxuICAgICAgKTtcbiAgICAgIG5hbWUgPSAobWV0YT8uc3ltYm9sIGFzIHN5bWJvbCkgfHwgU3ltYm9sLmZvcihuYW1lLnRvU3RyaW5nKCkpO1xuICAgIH1cbiAgICBpZiAoIW5hbWUpIHRocm93IG5ldyBFcnJvcihgSW5qZWN0YWJsZSAke25hbWV9IG5vdCBmb3VuZGApO1xuXG4gICAgaWYgKCEoKG5hbWUgYXMgc3ltYm9sKSBpbiB0aGlzLmNhY2hlKSkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlW25hbWVdO1xuICAgIGlmICghY2FjaGUub3B0aW9ucy5zaW5nbGV0b24gJiYgIWNhY2hlLmluc3RhbmNlKVxuICAgICAgcmV0dXJuIHRoaXMuYnVpbGQ8VD4obmFtZSwgLi4uYXJncyk7XG4gICAgcmV0dXJuIGNhY2hlLmluc3RhbmNlIHx8IHRoaXMuYnVpbGQ8VD4obmFtZSwgLi4uYXJncyk7XG4gIH1cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICByZWdpc3RlcjxUPihcbiAgICBvYmo6IEluamVjdGFibGU8VD4sXG4gICAgY2F0ZWdvcnk6IHN5bWJvbCB8IHVuZGVmaW5lZCxcbiAgICBvcHRpb25zOiBJbmplY3RhYmxlT3B0aW9uczxUPixcbiAgICBmb3JjZTogYm9vbGVhbiA9IGZhbHNlXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGNhc3RPYmo6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBvYmogYXMgUmVjb3JkPHN0cmluZywgYW55PjtcblxuICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gIWNhc3RPYmoubmFtZSAmJiBjYXN0T2JqLmNvbnN0cnVjdG9yO1xuICAgIGlmICh0eXBlb2YgY2FzdE9iaiAhPT0gXCJmdW5jdGlvblwiICYmICFjb25zdHJ1Y3RvcilcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEluamVjdGFibGUgcmVnaXN0ZXJpbmcgZmFpbGVkLiBNaXNzaW5nIENsYXNzIG5hbWUgb3IgY29uc3RydWN0b3JgXG4gICAgICApO1xuXG4gICAgY29uc3QgbmFtZSA9IGNhdGVnb3J5IHx8IFN5bWJvbC5mb3IoKG9iaiBhcyBhbnkpLnRvU3RyaW5nKCkpO1xuXG4gICAgaWYgKCF0aGlzLmNhY2hlW25hbWVdIHx8IGZvcmNlKVxuICAgICAgdGhpcy5jYWNoZVtuYW1lXSA9IHtcbiAgICAgICAgaW5zdGFuY2U6IG9wdGlvbnMuc2luZ2xldG9uICYmIGNvbnN0cnVjdG9yID8gb2JqIDogdW5kZWZpbmVkLFxuICAgICAgICBjb25zdHJ1Y3RvcjogIWNvbnN0cnVjdG9yID8gb2JqIDogKG9iaiBhcyBhbnkpLmNvbnN0cnVjdG9yLFxuICAgICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgfTtcbiAgfVxuICAvKipcbiAgICogQGluaGVyaXREb2NcbiAgICovXG4gIGJ1aWxkPFQ+KG5hbWU6IHN5bWJvbCwgLi4uYXJnczogYW55W10pOiBUIHtcbiAgICBjb25zdCB7IGNvbnN0cnVjdG9yLCBvcHRpb25zIH0gPSB0aGlzLmNhY2hlW25hbWVdO1xuICAgIGxldCBpbnN0YW5jZTogVDtcbiAgICB0cnkge1xuICAgICAgaW5zdGFuY2UgPSBuZXcgY29uc3RydWN0b3IoLi4uYXJncyk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgZmFpbGVkIHRvIGJ1aWxkICR7bmFtZS50b1N0cmluZygpfSB3aXRoIGFyZ3MgJHthcmdzfTogJHtlfWBcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLnNpbmdsZXRvbikge1xuICAgICAgdGhpcy5jYWNoZVtuYW1lXS5pbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5jYWxsYmFjaykgaW5zdGFuY2UgPSBvcHRpb25zLmNhbGxiYWNrKGluc3RhbmNlLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIEluamVjdGFibGUsXG4gIEluamVjdGFibGVSZWdpc3RyeUltcCxcbiAgSW5qZWN0YWJsZXNSZWdpc3RyeSxcbn0gZnJvbSBcIi4vcmVnaXN0cnlcIjtcbmltcG9ydCB7IEluamVjdGFibGVPcHRpb25zIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ2VudHJhbCByZWdpc3RyeSBmb3IgbWFuYWdpbmcgaW5qZWN0YWJsZSBkZXBlbmRlbmNpZXMuXG4gKiBAc3VtbWFyeSBTdGF0aWMgY2xhc3MgaG9sZGluZyB0aGUgYWNjZXNzIHRvIHRoZSBpbmplY3RhYmxlcyBmdW5jdGlvbnMuIFByb3ZpZGVzIG1ldGhvZHMgZm9yIHJlZ2lzdGVyaW5nLFxuICogcmV0cmlldmluZywgYW5kIGJ1aWxkaW5nIGluamVjdGFibGUgb2JqZWN0cy5cbiAqIEB0ZW1wbGF0ZSBUIFR5cGUgb2YgdGhlIGluamVjdGFibGUgb2JqZWN0XG4gKlxuICogQGNsYXNzIEluamVjdGFibGVzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIERlZmluZSBhbiBpbmplY3RhYmxlIGNsYXNzXG4gKiBAaW5qZWN0YWJsZSgpXG4gKiBjbGFzcyBNeVNlcnZpY2Uge1xuICogICBkb1NvbWV0aGluZygpIHtcbiAqICAgICByZXR1cm4gJ0hlbGxvIFdvcmxkJztcbiAqICAgfVxuICogfVxuICpcbiAqIC8vIEluamVjdCB0aGUgc2VydmljZSBpbnRvIGFub3RoZXIgY2xhc3NcbiAqIGNsYXNzIE15Q29tcG9uZW50IHtcbiAqICAgQGluamVjdCgpXG4gKiAgIHByaXZhdGUgc2VydmljZSE6IE15U2VydmljZTtcbiAqXG4gKiAgIHVzZVNlcnZpY2UoKSB7XG4gKiAgICAgcmV0dXJuIHRoaXMuc2VydmljZS5kb1NvbWV0aGluZygpO1xuICogICB9XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgSW5qZWN0YWJsZXNcbiAqICAgcGFydGljaXBhbnQgUmVnaXN0cnlcbiAqXG4gKiAgIENsaWVudC0+PkluamVjdGFibGVzOiByZWdpc3RlcihNeVNlcnZpY2UpXG4gKiAgIEluamVjdGFibGVzLT4+UmVnaXN0cnk6IHJlZ2lzdGVyKE15U2VydmljZSlcbiAqICAgUmVnaXN0cnktLT4+SW5qZWN0YWJsZXM6IHZvaWRcbiAqXG4gKiAgIENsaWVudC0+PkluamVjdGFibGVzOiBnZXQoXCJNeVNlcnZpY2VcIilcbiAqICAgSW5qZWN0YWJsZXMtPj5SZWdpc3RyeTogZ2V0KFwiTXlTZXJ2aWNlXCIpXG4gKiAgIFJlZ2lzdHJ5LS0+PkluamVjdGFibGVzOiBNeVNlcnZpY2UgaW5zdGFuY2VcbiAqICAgSW5qZWN0YWJsZXMtLT4+Q2xpZW50OiBNeVNlcnZpY2UgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGNsYXNzIEluamVjdGFibGVzIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBIb2xkcyB0aGUgYWN0aXZlIHJlZ2lzdHJ5IGltcGxlbWVudGF0aW9uIHVzZWQgYnkgdGhlIEluamVjdGFibGVzIGZhY2FkZS5cbiAgICogQHN1bW1hcnkgSW50ZXJuYWwgc3RhdGljIHJlZmVyZW5jZSB0aGF0IGNhbiBiZSBzd2FwcGVkIHZpYSBzZXRSZWdpc3RyeSB0byBjdXN0b21pemUgaG93IGluamVjdGFibGVzIGFyZSBzdG9yZWQgYW5kIHJldHJpZXZlZC5cbiAgICogQHR5cGUge0luamVjdGFibGVzUmVnaXN0cnkgfCB1bmRlZmluZWR9XG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBhY3RpbmdJbmplY3RhYmxlc1JlZ2lzdHJ5PzogSW5qZWN0YWJsZXNSZWdpc3RyeSA9IHVuZGVmaW5lZDtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZldGNoZXMgYW4gaW5qZWN0YWJsZSBpbnN0YW5jZSBieSBpdHMgcmVnaXN0ZXJlZCBuYW1lLlxuICAgKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIG5hbWVkIHtAbGluayBJbmplY3RhYmxlfSBmcm9tIHRoZSByZWdpc3RyeS4gSWYgdGhlIGluamVjdGFibGUgaXMgYSBzaW5nbGV0b24sXG4gICAqIHJldHVybnMgdGhlIGV4aXN0aW5nIGluc3RhbmNlLiBPdGhlcndpc2UsIGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuXG4gICAqIEB0ZW1wbGF0ZSBUIFR5cGUgb2YgdGhlIGluamVjdGFibGUgb2JqZWN0IHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSByZWdpc3RlcmVkIG5hbWUgb2YgdGhlIGluamVjdGFibGUgdG8gcmV0cmlldmVcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyBDb25zdHJ1Y3RvciBhcmd1bWVudHMgdG8gcGFzcyB3aGVuIGluc3RhbnRpYXRpbmcgdGhlIGluamVjdGFibGVcbiAgICogQHJldHVybiB7SW5qZWN0YWJsZTxUPiB8IHVuZGVmaW5lZH0gVGhlIGluamVjdGFibGUgaW5zdGFuY2Ugb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgc3RhdGljIGdldDxUPihcbiAgICBuYW1lOiBzeW1ib2wgfCBzdHJpbmcgfCB7IG5ldyAoLi4uYXJnczogYW55W10pOiBUIH0sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIEluamVjdGFibGVzLmdldFJlZ2lzdHJ5KCkuZ2V0KG5hbWUsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBZGRzIGEgY2xhc3Mgb3Igb2JqZWN0IHRvIHRoZSBpbmplY3RhYmxlIHJlZ2lzdHJ5LlxuICAgKiBAc3VtbWFyeSBSZWdpc3RlcnMgYW4gaW5qZWN0YWJsZSBjb25zdHJ1Y3RvciBvciBpbnN0YW5jZSB3aXRoIHRoZSByZWdpc3RyeSwgbWFraW5nIGl0IGF2YWlsYWJsZSBmb3IgaW5qZWN0aW9uLlxuICAgKiBAdGVtcGxhdGUgVCBUeXBlIG9mIHRoZSBpbmplY3RhYmxlIG9iamVjdCB0byByZWdpc3RlclxuICAgKiBAcGFyYW0ge0luamVjdGFibGU8VD59IGNvbnN0cnVjdG9yIFRoZSBjbGFzcyBjb25zdHJ1Y3RvciBvciBvYmplY3QgaW5zdGFuY2UgdG8gcmVnaXN0ZXJcbiAgICogQHBhcmFtIHthbnlbXX0gYXJncyBBZGRpdGlvbmFsIGFyZ3VtZW50cyBmb3IgcmVnaXN0cmF0aW9uIChjYXRlZ29yeSwgc2luZ2xldG9uIGZsYWcsIGV0Yy4pXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXI8VD4oY29uc3RydWN0b3I6IEluamVjdGFibGU8VD4sIC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgcmV0dXJuIEluamVjdGFibGVzLmdldFJlZ2lzdHJ5KCkucmVnaXN0ZXIoXG4gICAgICBjb25zdHJ1Y3RvcixcbiAgICAgIC4uLihhcmdzIGFzIFtzeW1ib2wsIEluamVjdGFibGVPcHRpb25zPFQ+XSlcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIGFuIGluamVjdGFibGUgY2xhc3MuXG4gICAqIEBzdW1tYXJ5IEluc3RhbnRpYXRlcyBhbiBpbmplY3RhYmxlIGNsYXNzIHVzaW5nIGl0cyBjb25zdHJ1Y3RvciBhbmQgdGhlIHByb3ZpZGVkIGFyZ3VtZW50cy5cbiAgICogQHRlbXBsYXRlIFQgVHlwZSBvZiB0aGUgb2JqZWN0IHRvIGJ1aWxkXG4gICAqIEBwYXJhbSB7c3ltYm9sfSBuYW1lIHN5bWJvbCByZWZlcmVuY2luZyB0aGUgaW5qZWN0YWJsZVxuICAgKiBAcGFyYW0ge2FueVtdfSBhcmdzIENvbnN0cnVjdG9yIGFyZ3VtZW50cyB0byBwYXNzIHdoZW4gaW5zdGFudGlhdGluZyB0aGUgaW5qZWN0YWJsZVxuICAgKiBAcmV0dXJuIHtUfSBUaGUgbmV3bHkgY3JlYXRlZCBpbnN0YW5jZVxuICAgKi9cbiAgc3RhdGljIGJ1aWxkPFQ+KG5hbWU6IHN5bWJvbCwgLi4uYXJnczogYW55W10pOiBUIHtcbiAgICByZXR1cm4gSW5qZWN0YWJsZXMuZ2V0UmVnaXN0cnkoKS5idWlsZChuYW1lLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVwbGFjZXMgdGhlIGN1cnJlbnQgcmVnaXN0cnkgaW1wbGVtZW50YXRpb24uXG4gICAqIEBzdW1tYXJ5IFNldHMgYSBuZXcge0BsaW5rIEluamVjdGFibGVzUmVnaXN0cnl9IGltcGxlbWVudGF0aW9uLCBhbGxvd2luZyBmb3IgY3VzdG9tIHJlZ2lzdHJ5IGJlaGF2aW9yLlxuICAgKiBAcGFyYW0ge0luamVjdGFibGVzUmVnaXN0cnl9IG9wZXJhdGlvbnNSZWdpc3RyeSBUaGUgbmV3IGltcGxlbWVudGF0aW9uIG9mIFJlZ2lzdHJ5IHRvIHVzZVxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHNldFJlZ2lzdHJ5KG9wZXJhdGlvbnNSZWdpc3RyeTogSW5qZWN0YWJsZXNSZWdpc3RyeSk6IHZvaWQge1xuICAgIEluamVjdGFibGVzLmFjdGluZ0luamVjdGFibGVzUmVnaXN0cnkgPSBvcGVyYXRpb25zUmVnaXN0cnk7XG4gIH1cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGN1cnJlbnQgcmVnaXN0cnkgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IFJldHVybnMgdGhlIGN1cnJlbnQge0BsaW5rIEluamVjdGFibGVzUmVnaXN0cnl9IG9yIGNyZWF0ZXMgYSBkZWZhdWx0IG9uZSBpZiBub25lIGV4aXN0cy5cbiAgICogQHJldHVybiB7SW5qZWN0YWJsZXNSZWdpc3RyeX0gVGhlIGN1cnJlbnQgcmVnaXN0cnkgaW5zdGFuY2VcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldFJlZ2lzdHJ5KCk6IEluamVjdGFibGVzUmVnaXN0cnkge1xuICAgIGlmICghSW5qZWN0YWJsZXMuYWN0aW5nSW5qZWN0YWJsZXNSZWdpc3RyeSlcbiAgICAgIEluamVjdGFibGVzLmFjdGluZ0luamVjdGFibGVzUmVnaXN0cnkgPSBuZXcgSW5qZWN0YWJsZVJlZ2lzdHJ5SW1wKCk7XG4gICAgcmV0dXJuIEluamVjdGFibGVzLmFjdGluZ0luamVjdGFibGVzUmVnaXN0cnk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENsZWFycyBhbGwgcmVnaXN0ZXJlZCBpbmplY3RhYmxlcy5cbiAgICogQHN1bW1hcnkgUmVzZXRzIHRoZSByZWdpc3RyeSB0byBhIGNsZWFuIHN0YXRlIGJ5IGNyZWF0aW5nIGEgbmV3IGVtcHR5IHJlZ2lzdHJ5IGluc3RhbmNlLlxuICAgKiBAcmV0dXJuIHt2b2lkfVxuICAgKi9cbiAgc3RhdGljIHJlc2V0KCk6IHZvaWQge1xuICAgIEluamVjdGFibGVzLnNldFJlZ2lzdHJ5KG5ldyBJbmplY3RhYmxlUmVnaXN0cnlJbXAoKSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlbW92ZXMgc3BlY2lmaWMgaW5qZWN0YWJsZXMgZnJvbSB0aGUgcmVnaXN0cnkgYmFzZWQgb24gYSBwYXR0ZXJuLlxuICAgKiBAc3VtbWFyeSBTZWxlY3RpdmVseSByZXNldHMgdGhlIHJlZ2lzdHJ5IGJ5IHJlbW92aW5nIG9ubHkgdGhlIGluamVjdGFibGVzIHdob3NlIG5hbWVzIG1hdGNoIHRoZSBwcm92aWRlZCBwYXR0ZXJuLlxuICAgKiBAcGFyYW0ge3N0cmluZyB8IFJlZ0V4cH0gbWF0Y2ggQSBzdHJpbmcgb3IgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gdG8gbWF0Y2ggYWdhaW5zdCBpbmplY3RhYmxlIG5hbWVzXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICBzdGF0aWMgc2VsZWN0aXZlUmVzZXQobWF0Y2g6IHN0cmluZyB8IFJlZ0V4cCk6IHZvaWQge1xuICAgIGNvbnN0IHJlZ2V4cCA9IHR5cGVvZiBtYXRjaCA9PT0gXCJzdHJpbmdcIiA/IG5ldyBSZWdFeHAobWF0Y2gpIDogbWF0Y2g7XG4gICAgKEluamVjdGFibGVzLmFjdGluZ0luamVjdGFibGVzUmVnaXN0cnkgYXMgYW55KVtcImNhY2hlXCJdID0gT2JqZWN0LmVudHJpZXMoXG4gICAgICAoSW5qZWN0YWJsZXMuYWN0aW5nSW5qZWN0YWJsZXNSZWdpc3RyeSBhcyBhbnkpW1wiY2FjaGVcIl1cbiAgICApLnJlZHVjZSgoYWNjdW06IFJlY29yZDxzdHJpbmcsIGFueT4sIFtrZXksIHZhbF0pID0+IHtcbiAgICAgIGlmICgha2V5Lm1hdGNoKHJlZ2V4cCkpIGFjY3VtW2tleV0gPSB2YWw7XG4gICAgICByZXR1cm4gYWNjdW07XG4gICAgfSwge30pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWcsIEluamVjdGFibGVzS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZXMgfSBmcm9tIFwiLi9JbmplY3RhYmxlc1wiO1xuaW1wb3J0IHsgZ2V0SW5qZWN0S2V5IH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IEluamVjdGFibGVNZXRhZGF0YSwgSW5zdGFuY2VDYWxsYmFjayB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWNvcmF0aW9uLCBNZXRhZGF0YSwgcHJvcCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBAaW5qZWN0YWJsZSBkZWNvcmF0b3IuXG4gKiBAc3VtbWFyeSBDb250cm9scyBsaWZlY3ljbGUgKHNpbmdsZXRvbiB2cyBvbi1kZW1hbmQpIGFuZCBhbiBvcHRpb25hbCBpbnN0YW5jZSB0cmFuc2Zvcm1hdGlvbiBjYWxsYmFjayBleGVjdXRlZCBwb3N0LWNvbnN0cnVjdGlvbi5cbiAqIEB0ZW1wbGF0ZSBUIFRoZSBpbnN0YW5jZSB0eXBlIGFmZmVjdGVkIGJ5IHRoZSBjYWxsYmFjayB3aGVuIHByb3ZpZGVkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBzaW5nbGV0b24gV2hlbiB0cnVlLCBhIHNpbmdsZSBpbnN0YW5jZSBpcyBzaGFyZWQgKHNpbmdsZXRvbikuIFdoZW4gZmFsc2UsIGluc3RhbmNlcyBhcmUgY3JlYXRlZCBvbiBkZW1hbmQuXG4gKiBAcHJvcGVydHkge0luc3RhbmNlQ2FsbGJhY2s8VD59IFtjYWxsYmFja10gT3B0aW9uYWwgaG9vayB0byB0cmFuc2Zvcm0gdGhlIGluc3RhbmNlIGFmdGVyIGl0IGlzIGNvbnN0cnVjdGVkLlxuICogQHR5cGVkZWYgSW5qZWN0YWJsZUNvbmZpZ1xuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgSW5qZWN0YWJsZUNvbmZpZyA9IHtcbiAgc2luZ2xldG9uOiBib29sZWFuO1xuICBjYWxsYmFjaz86IEluc3RhbmNlQ2FsbGJhY2s8YW55Pjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RhYmxlQmFzZURlY29yYXRvcihcbiAgY2F0ZWdvcnk/OiBzdHJpbmcgfCBDb25zdHJ1Y3RvciB8IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz4sXG4gIGNmZz86IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz5cbikge1xuICBjZmcgPVxuICAgIGNmZyB8fFxuICAgICh0eXBlb2YgY2F0ZWdvcnkgPT09IFwib2JqZWN0XCJcbiAgICAgID8gT2JqZWN0LmFzc2lnbihjYXRlZ29yeSBhcyBSZWNvcmQ8YW55LCBhbnk+LCBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWcpXG4gICAgICA6IERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZyk7XG4gIGNhdGVnb3J5ID1cbiAgICB0eXBlb2YgY2F0ZWdvcnkgPT09IFwib2JqZWN0XCJcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IHR5cGVvZiBjYXRlZ29yeSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGNhdGVnb3J5XG4gICAgICAgIDogdHlwZW9mIGNhdGVnb3J5ID09PSBcImZ1bmN0aW9uXCIgJiYgY2F0ZWdvcnkubmFtZVxuICAgICAgICAgID8gY2F0ZWdvcnlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluamVjdGFibGVJbm5lckRlY29yYXRvcihvcmlnaW5hbDogYW55KSB7XG4gICAgY29uc3Qgc3ltYm9sID0gU3ltYm9sLmZvcihjYXRlZ29yeSB8fCBvcmlnaW5hbC50b1N0cmluZygpKTtcbiAgICBjYXRlZ29yeSA9IGNhdGVnb3J5IHx8IG9yaWdpbmFsLm5hbWU7XG5cbiAgICBjb25zdCBtZXRhZGF0YTogSW5qZWN0YWJsZU1ldGFkYXRhID0ge1xuICAgICAgY2xhc3M6IGNhdGVnb3J5IGFzIHN0cmluZyxcbiAgICAgIHN5bWJvbDogc3ltYm9sLFxuICAgIH07XG5cbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgZ2V0SW5qZWN0S2V5KEluamVjdGFibGVzS2V5cy5JTkpFQ1RBQkxFKSxcbiAgICAgIG1ldGFkYXRhLFxuICAgICAgb3JpZ2luYWxcbiAgICApO1xuICAgIC8vIHRoZSBuZXcgY29uc3RydWN0b3IgYmVoYXZpb3VyXG4gICAgY29uc3QgbmV3Q29uc3RydWN0b3I6IGFueSA9IGZ1bmN0aW9uICguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgcmV0dXJuIEluamVjdGFibGVzLmdldDxhbnk+KHN5bWJvbCwgLi4uYXJncyk7XG4gICAgfTtcblxuICAgIC8vIGNvcHkgcHJvdG90eXBlIHNvIGluc3RhbmNlb2Ygb3BlcmF0b3Igc3RpbGwgd29ya3NcbiAgICBuZXdDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBvcmlnaW5hbC5wcm90b3R5cGU7XG4gICAgLy8gbmV3Q29uc3RydWN0b3IuX19wcm90b19fID0gb3JpZ2luYWwuX19wcm90b19fO1xuICAgIC8vIFNldHMgdGhlIHByb3BlciBjb25zdHJ1Y3RvciBuYW1lIGZvciB0eXBlIHZlcmlmaWNhdGlvblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdDb25zdHJ1Y3RvciwgXCJuYW1lXCIsIHtcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IG9yaWdpbmFsLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgIH0pO1xuXG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgIGdldEluamVjdEtleShJbmplY3RhYmxlc0tleXMuSU5KRUNUQUJMRSksXG4gICAgICBtZXRhZGF0YSxcbiAgICAgIG5ld0NvbnN0cnVjdG9yXG4gICAgKTtcblxuICAgIEluamVjdGFibGVzLnJlZ2lzdGVyKG9yaWdpbmFsLCBzeW1ib2wsIGNmZyk7XG4gICAgLy8gcmV0dXJuIG5ldyBjb25zdHJ1Y3RvciAod2lsbCBvdmVycmlkZSBvcmlnaW5hbClcbiAgICByZXR1cm4gbmV3Q29uc3RydWN0b3I7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyaWMgY29uc3RydWN0b3IgdHlwZSBmb3IgY2xhc3MtbGlrZSB2YWx1ZXMuXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGFueSBjbGFzcyB0aGF0IGNhbiBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhcmJpdHJhcnkgYXJndW1lbnRzLCBwcm9kdWNpbmcgYW4gaW5zdGFuY2Ugb2YgdHlwZSBULlxuICogQHRlbXBsYXRlIFQgVGhlIGluc3RhbmNlIHR5cGUgY3JlYXRlZCBieSB0aGUgY29uc3RydWN0b3IuXG4gKiBAdHlwZWRlZiBDb25zdHJ1Y3RvclxuICogQGV4YW1wbGVcbiAqIC8vIFVzaW5nIENvbnN0cnVjdG9yIHRvIHR5cGUgYSBmYWN0b3J5XG4gKiBmdW5jdGlvbiBtYWtlPFQ+KEN0b3I6IENvbnN0cnVjdG9yPFQ+LCAuLi5hcmdzOiBhbnlbXSk6IFQge1xuICogICByZXR1cm4gbmV3IEN0b3IoLi4uYXJncyk7XG4gKiB9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBDb25zdHJ1Y3RvcjxUID0gYW55PiA9IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IFQgfTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2UuXG4gKlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55KTogYW55fSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgdGhlIGNsYXNzIGludG8gYW4gaW5qZWN0YWJsZS5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0YWJsZSgpOiAob3JpZ2luYWw6IGFueSkgPT4gYW55O1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBDb25zdHJ1Y3Rvcn0gY2F0ZWdvcnkgRGVmYXVsdHMgdG8gdGhlIGNsYXNzIGNhdGVnb3J5LiBVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2NjdXJzIGFuZCBuYW1lcyBhcmUgY2hhbmdlZCxcbiAqIG9yIHdoZW4geW91IHdhbnQgdG8gdXBjYXN0IHRoZSBvYmplY3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAqXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnkpOiBhbnl9IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyB0aGUgY2xhc3MgaW50byBhbiBpbmplY3RhYmxlLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RhYmxlKFxuICBjYXRlZ29yeTogc3RyaW5nIHwgQ29uc3RydWN0b3Jcbik6IChvcmlnaW5hbDogYW55KSA9PiBhbnk7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIGNsYXNzIGFzIGF2YWlsYWJsZSBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgY2xhc3MgYXMgYW4gaW5qZWN0YWJsZSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVnaXN0cnkuXG4gKiBXaGVuIGFwcGxpZWQgdG8gYSBjbGFzcywgcmVwbGFjZXMgaXRzIGNvbnN0cnVjdG9yIHdpdGggb25lIHRoYXQgcmV0dXJucyBhbiBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0ge1BhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz59IGNmZz1EZWZhdWx0SW5qZWN0YWJsZUNvbmZpZyBBbGxvd3Mgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCBzaW5nbGV0b24gYmVoYXZpb3IgYW5kIGFkZGluZyBhIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSBjbGFzcyBpbnRvIGFuIGluamVjdGFibGUuXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdGFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdGFibGUoXG4gIGNmZzogUGFydGlhbDxJbmplY3RhYmxlQ29uZmlnPlxuKTogKG9yaWdpbmFsOiBhbnkpID0+IGFueTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIGNhdGVnb3J5IERlZmF1bHRzIHRvIHRoZSBjbGFzcyBjYXRlZ29yeS4gVXNlZnVsIHdoZW4gbWluaWZpY2F0aW9uIG9jY3VycyBhbmQgbmFtZXMgYXJlIGNoYW5nZWQsXG4gKiBvciB3aGVuIHlvdSB3YW50IHRvIHVwY2FzdCB0aGUgb2JqZWN0IHRvIGEgZGlmZmVyZW50IHR5cGUuXG4gKiBAcGFyYW0ge1BhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz59IGNmZz1EZWZhdWx0SW5qZWN0YWJsZUNvbmZpZyBBbGxvd3Mgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCBzaW5nbGV0b24gYmVoYXZpb3IgYW5kIGFkZGluZyBhIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSBjbGFzcyBpbnRvIGFuIGluamVjdGFibGUuXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdGFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdGFibGUoXG4gIGNhdGVnb3J5OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgY2ZnOiBQYXJ0aWFsPEluamVjdGFibGVDb25maWc+XG4pOiAob3JpZ2luYWw6IGFueSkgPT4gYW55O1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBDb25zdHJ1Y3Rvcn0gW2NhdGVnb3J5XSBEZWZhdWx0cyB0byB0aGUgY2xhc3MgY2F0ZWdvcnkuIFVzZWZ1bCB3aGVuIG1pbmlmaWNhdGlvbiBvY2N1cnMgYW5kIG5hbWVzIGFyZSBjaGFuZ2VkLFxuICogb3Igd2hlbiB5b3Ugd2FudCB0byB1cGNhc3QgdGhlIG9iamVjdCB0byBhIGRpZmZlcmVudCB0eXBlLlxuICogQHBhcmFtIHtQYXJ0aWFsPEluamVjdGFibGVDb25maWc+fSBbY2ZnPURlZmF1bHRJbmplY3RhYmxlQ29uZmlnXSBBbGxvd3Mgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCBzaW5nbGV0b24gYmVoYXZpb3IgYW5kIGFkZGluZyBhIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSBjbGFzcyBpbnRvIGFuIGluamVjdGFibGUuXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdGFibGVcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRGVjb3JhdG9yXG4gKiAgIHBhcnRpY2lwYW50IEluamVjdGFibGVzXG4gKlxuICogICBDbGllbnQtPj5EZWNvcmF0b3I6IEBpbmplY3RhYmxlKClcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBDcmVhdGUgbmV3IGNvbnN0cnVjdG9yXG4gKlxuICogICBOb3RlIG92ZXIgRGVjb3JhdG9yOiBXaGVuIG5ldyBpbnN0YW5jZSByZXF1ZXN0ZWRcbiAqICAgRGVjb3JhdG9yLT4+SW5qZWN0YWJsZXM6IGdldChjYXRlZ29yeSlcbiAqICAgYWx0IEluc3RhbmNlIGV4aXN0c1xuICogICAgIEluamVjdGFibGVzLS0+PkRlY29yYXRvcjogUmV0dXJuIGV4aXN0aW5nIGluc3RhbmNlXG4gKiAgIGVsc2UgTm8gaW5zdGFuY2VcbiAqICAgICBEZWNvcmF0b3ItPj5JbmplY3RhYmxlczogcmVnaXN0ZXIob3JpZ2luYWwsIGNhdGVnb3J5KVxuICogICAgIERlY29yYXRvci0+PkluamVjdGFibGVzOiBnZXQoY2F0ZWdvcnkpXG4gKiAgICAgSW5qZWN0YWJsZXMtLT4+RGVjb3JhdG9yOiBSZXR1cm4gbmV3IGluc3RhbmNlXG4gKiAgICAgb3B0IEhhcyBjYWxsYmFja1xuICogICAgICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBDYWxsIGluc3RhbmNlQ2FsbGJhY2tcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogRGVmaW5lIG1ldGFkYXRhXG4gKiAgIERlY29yYXRvci0tPj5DbGllbnQ6IFJldHVybiBpbnN0YW5jZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0YWJsZShcbiAgY2F0ZWdvcnk/OiBzdHJpbmcgfCBDb25zdHJ1Y3RvciB8IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz4sXG4gIGNmZz86IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz5cbikge1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoSW5qZWN0YWJsZXNLZXlzLklOSkVDVEFCTEUpXG4gICAgLmRlZmluZSh7IGRlY29yYXRvcjogaW5qZWN0YWJsZUJhc2VEZWNvcmF0b3IsIGFyZ3M6IFtjYXRlZ29yeSwgY2ZnXSB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb252ZW5pZW5jZSBkZWNvcmF0b3IgdG8gcmVnaXN0ZXIgYW4gaW5qZWN0YWJsZSBhcyBhIHNpbmdsZXRvbi5cbiAqIEBzdW1tYXJ5IFdyYXBzIHtAbGluayBpbmplY3RhYmxlfSBmb3JjaW5nIHRoZSBzaW5nbGV0b24gbGlmZWN5Y2xlIHNvIG9ubHkgb25lIGluc3RhbmNlIGlzIGNyZWF0ZWQgYW5kIHJldXNlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfENvbnN0cnVjdG9yfSBbY2F0ZWdvcnldIE9wdGlvbmFsIGV4cGxpY2l0IGNhdGVnb3J5L3N5bWJvbCBzb3VyY2U7IGRlZmF1bHRzIHRvIHRoZSBjbGFzcy5cbiAqIEBwYXJhbSB7T21pdDxJbmplY3RhYmxlQ29uZmlnLCBcInNpbmdsZXRvblwiPn0gW2NmZ10gQWRkaXRpb25hbCBpbmplY3RhYmxlIGNvbmZpZ3VyYXRpb24gZXhjbHVkaW5nIHRoZSBzaW5nbGV0b24gZmxhZy5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBjbGFzcyBkZWNvcmF0b3IgdGhhdCByZWdpc3RlcnMgdGhlIHRhcmdldCBhcyBhIHNpbmdsZXRvbiBpbmplY3RhYmxlLlxuICogQGZ1bmN0aW9uIHNpbmdsZXRvblxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpbmdsZXRvbihcbiAgY2F0ZWdvcnk/OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgY2ZnPzogT21pdDxJbmplY3RhYmxlQ29uZmlnLCBcInNpbmdsZXRvblwiPlxuKSB7XG4gIHJldHVybiBpbmplY3RhYmxlKFxuICAgIGNhdGVnb3J5IGFzIGFueSxcbiAgICBPYmplY3QuYXNzaWduKHt9LCBjZmcgfHwge30sIHsgc2luZ2xldG9uOiB0cnVlIH0pXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlbmllbmNlIGRlY29yYXRvciB0byByZWdpc3RlciBhbiBpbmplY3RhYmxlIGFzIG9uLWRlbWFuZCAobm9uLXNpbmdsZXRvbikuXG4gKiBAc3VtbWFyeSBXcmFwcyB7QGxpbmsgaW5qZWN0YWJsZX0gZm9yY2luZyBuZXcgaW5zdGFuY2VzIHRvIGJlIGNyZWF0ZWQgb24gZXZlcnkgaW5qZWN0aW9uIG9yIHJldHJpZXZhbC5cbiAqIEBwYXJhbSB7c3RyaW5nfENvbnN0cnVjdG9yfSBbY2F0ZWdvcnldIE9wdGlvbmFsIGV4cGxpY2l0IGNhdGVnb3J5L3N5bWJvbCBzb3VyY2U7IGRlZmF1bHRzIHRvIHRoZSBjbGFzcy5cbiAqIEBwYXJhbSB7T21pdDxJbmplY3RhYmxlQ29uZmlnLCBcInNpbmdsZXRvblwiPn0gW2NmZ10gQWRkaXRpb25hbCBpbmplY3RhYmxlIGNvbmZpZ3VyYXRpb24gZXhjbHVkaW5nIHRoZSBzaW5nbGV0b24gZmxhZy5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBjbGFzcyBkZWNvcmF0b3IgdGhhdCByZWdpc3RlcnMgdGhlIHRhcmdldCBhcyBhIG5vbi1zaW5nbGV0b24gaW5qZWN0YWJsZS5cbiAqIEBmdW5jdGlvbiBvbkRlbWFuZFxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uRGVtYW5kKFxuICBjYXRlZ29yeT86IHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICBjZmc/OiBPbWl0PEluamVjdGFibGVDb25maWcsIFwic2luZ2xldG9uXCI+XG4pIHtcbiAgcmV0dXJuIGluamVjdGFibGUoXG4gICAgY2F0ZWdvcnkgYXMgYW55LFxuICAgIE9iamVjdC5hc3NpZ24oe30sIGNmZyB8fCB7fSwgeyBzaW5nbGV0b246IGZhbHNlIH0pXG4gICk7XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiB0eXBlIGZvciB0cmFuc2Zvcm1pbmcgaW5qZWN0YWJsZSBpbnN0YW5jZXMgYmVmb3JlIHRoZXkncmUgaW5qZWN0ZWQuXG4gKiBAc3VtbWFyeSBGdW5jdGlvbiB3aGljaCB0cmFuc2Zvcm1zIGEgY2FjaGVkIHtAbGluayBpbmplY3RhYmxlfSBpbnN0YW5jZSBiZWZvcmUgaXQncyBpbmplY3RlZCBpbnRvIGEgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge2FueX0gaW5qZWN0YWJsZSBUaGUgaW5qZWN0YWJsZSBpbnN0YW5jZSB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7YW55fSBvYmogVGhlIG9iamVjdCB0aGUgaW5qZWN0YWJsZSB3aWxsIGJlIGluamVjdGVkIG9uXG4gKiBAcmV0dXJuIHthbnl9IFRoZSB0cmFuc2Zvcm1lZCBpbmplY3RhYmxlIGluc3RhbmNlXG4gKlxuICogQHR5cGVkZWYge0Z1bmN0aW9ufSBJbnN0YW5jZVRyYW5zZm9ybWVyXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFuY2VUcmFuc2Zvcm1lciA9IChpbmplY3RhYmxlOiBhbnksIG9iajogYW55KSA9PiBhbnk7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE9wdGlvbnMgZm9yIHRoZSBwcm9wZXJ0eS1sZXZlbCBAaW5qZWN0IGRlY29yYXRvci5cbiAqIEBzdW1tYXJ5IEFsbG93cyBzcGVjaWZ5aW5nIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBhbmQgYW4gb3B0aW9uYWwgdHJhbnNmb3JtZXIgdG8gYmUgYXBwbGllZCB0byB0aGUgcmVzb2x2ZWQgaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge2FueVtdfSBbYXJnc10gT3B0aW9uYWwgY29uc3RydWN0b3IgYXJndW1lbnRzIHRvIHVzZSB3aGVuIGJ1aWxkaW5nIHRoZSBpbmplY3RhYmxlIGluc3RhbmNlLlxuICogQHByb3BlcnR5IHtJbnN0YW5jZVRyYW5zZm9ybWVyfSBbdHJhbnNmb3JtZXJdIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgaW5zdGFuY2UgYmVmb3JlIGFzc2lnbm1lbnQuXG4gKiBAdHlwZWRlZiBJbmplY3RPcHRpb25zXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBJbmplY3RPcHRpb25zID0ge1xuICBhcmdzPzogYW55W107XG4gIHRyYW5zZm9ybWVyPzogSW5zdGFuY2VUcmFuc2Zvcm1lcjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RCYXNlRGVjb3JhdG9yKFxuICBjYXRlZ29yeT86IHN5bWJvbCB8IHN0cmluZyB8IENvbnN0cnVjdG9yIHwgUGFydGlhbDxJbmplY3RPcHRpb25zPixcbiAgY2ZnPzogUGFydGlhbDxJbmplY3RPcHRpb25zPlxuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpbmplY3RJbm5lckRlY29yYXRvcih0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpIHtcbiAgICBjb25zdCBjb25maWc6IEluamVjdE9wdGlvbnMgPSAoXG4gICAgICBjZmcgfHwgdHlwZW9mIGNhdGVnb3J5ID09PSBcIm9iamVjdFwiID8gY2F0ZWdvcnkgOiB7fVxuICAgICkgYXMgSW5qZWN0T3B0aW9ucztcblxuICAgIGlmIChwcm9wZXJ0eUtleSkge1xuICAgICAgcHJvcCgpKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIH1cblxuICAgIGNvbnN0IG5hbWU6IHN5bWJvbCB8IHN0cmluZyB8IENvbnN0cnVjdG9yIHwgdW5kZWZpbmVkID1cbiAgICAgICh0eXBlb2YgY2F0ZWdvcnkgIT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgKGNhdGVnb3J5IGFzIHN5bWJvbCB8IHN0cmluZyB8IENvbnN0cnVjdG9yKSkgfHxcbiAgICAgIE1ldGFkYXRhLnR5cGUodGFyZ2V0LmNvbnN0cnVjdG9yLCBwcm9wZXJ0eUtleSk7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgVHlwZSBmcm9tIGRlY29yYXRvcmApO1xuICAgIH1cblxuICAgIC8vIHByb3AoKSh0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgZ2V0SW5qZWN0S2V5KEluamVjdGFibGVzS2V5cy5JTkpFQ1QpLFxuICAgICAge1xuICAgICAgICBpbmplY3RhYmxlOiBuYW1lLFxuICAgICAgfSxcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcblxuICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0KHRoaXM6IGFueSkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBwcm9wZXJ0eUtleVxuICAgICAgICApIGFzIFByb3BlcnR5RGVzY3JpcHRvcjtcbiAgICAgICAgaWYgKGRlc2NyaXB0b3IuY29uZmlndXJhYmxlKSB7XG4gICAgICAgICAgLy8gbGV0IC9vYmo6IGFueTtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0KHRoaXM6IGFueSkge1xuICAgICAgICAgICAgICBsZXQgb2JqID0gdmFsdWVzLmdldCh0aGlzKTtcbiAgICAgICAgICAgICAgaWYgKG9iaikgcmV0dXJuIG9iajtcbiAgICAgICAgICAgICAgb2JqID0gSW5qZWN0YWJsZXMuZ2V0KG5hbWUsIC4uLihjb25maWcuYXJncyB8fCBbXSkpO1xuICAgICAgICAgICAgICBpZiAoIW9iailcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgQ291bGQgbm90IGdldCBJbmplY3RhYmxlICR7bmFtZS50b1N0cmluZygpfSB0byBpbmplY3QgaW4gJHt0YXJnZXQuY29uc3RydWN0b3IgPyB0YXJnZXQuY29uc3RydWN0b3IubmFtZSA6IHRhcmdldC5uYW1lfSdzICR7cHJvcGVydHlLZXl9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChjb25maWcudHJhbnNmb3JtZXIpXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIG9iaiA9IGNvbmZpZy50cmFuc2Zvcm1lcihvYmosIHRhcmdldCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhbHVlcy5zZXQodGhpcywgb2JqKTtcblxuICAgICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdGhpc1twcm9wZXJ0eUtleV07XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByb3BlcnR5IGRlY29yYXRvciB0aGF0IGluamVjdHMgYSBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIEBzdW1tYXJ5IEFsbG93cyBmb3IgdGhlIGluamVjdGlvbiBvZiBhbiB7QGxpbmsgaW5qZWN0YWJsZX0gZGVjb3JhdGVkIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogVGhlIHByb3BlcnR5IG11c3QgYmUgdHlwZWQgZm9yIHRoZSByZXF1ZXN0ZWQgZGVwZW5kZW5jeS4gT25seSBjb25jcmV0ZSBjbGFzc2VzIGFyZSBzdXBwb3J0ZWQ7IGdlbmVyaWNzIGFyZSBub3QuXG4gKlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnkpOiB2b2lkfSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdCgpOiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBhbnkpID0+IHZvaWQ7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGEgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBAc3VtbWFyeSBBbGxvd3MgZm9yIHRoZSBpbmplY3Rpb24gb2YgYW4ge0BsaW5rIGluamVjdGFibGV9IGRlY29yYXRlZCBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIFRoZSBwcm9wZXJ0eSBtdXN0IGJlIHR5cGVkIGZvciB0aGUgcmVxdWVzdGVkIGRlcGVuZGVuY3kuIE9ubHkgY29uY3JldGUgY2xhc3NlcyBhcmUgc3VwcG9ydGVkOyBnZW5lcmljcyBhcmUgbm90LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjYXRlZ29yeSBEZWZhdWx0cyB0byB0aGUgY2xhc3MgbmFtZSBkZXJpdmVkIGZyb20gdGhlIHByb3BlcnR5IHR5cGUuIFVzZWZ1bCB3aGVuIG1pbmlmaWNhdGlvbiBvY2N1cnNcbiAqIGFuZCBuYW1lcyBhcmUgY2hhbmdlZCwgb3Igd2hlbiB5b3Ugd2FudCB0byB1cGNhc3QgdGhlIG9iamVjdCB0byBhIGRpZmZlcmVudCB0eXBlLlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnkpOiB2b2lkfSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdChcbiAgY2F0ZWdvcnk6IHN0cmluZyB8IENvbnN0cnVjdG9yXG4pOiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBhbnkpID0+IHZvaWQ7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGEgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBAc3VtbWFyeSBBbGxvd3MgZm9yIHRoZSBpbmplY3Rpb24gb2YgYW4ge0BsaW5rIGluamVjdGFibGV9IGRlY29yYXRlZCBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIFRoZSBwcm9wZXJ0eSBtdXN0IGJlIHR5cGVkIGZvciB0aGUgcmVxdWVzdGVkIGRlcGVuZGVuY3kuIE9ubHkgY29uY3JldGUgY2xhc3NlcyBhcmUgc3VwcG9ydGVkOyBnZW5lcmljcyBhcmUgbm90LlxuICpcbiAqIEBwYXJhbSB7UGFydGlhbDxJbmplY3RPcHRpb25zPn0gW2NmZz17fV0gT3B0aW9uYWwgZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHRoZSBpbmplY3RhYmxlIGluc3RhbmNlIGJlZm9yZSBpdCdzIGluamVjdGVkLCBvciBhcmd1bWVudHMgdG8gcGFzcyB0aGUgY29uc3RydWN0b3Igd2hlbiBpbmplY3Rpbmcgb25EZW1hbmRcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSwgYW55KTogdm9pZH0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3QoXG4gIGNmZzogUGFydGlhbDxJbmplY3RPcHRpb25zPlxuKTogKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogYW55KSA9PiB2b2lkO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogQHN1bW1hcnkgQWxsb3dzIGZvciB0aGUgaW5qZWN0aW9uIG9mIGFuIHtAbGluayBpbmplY3RhYmxlfSBkZWNvcmF0ZWQgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBUaGUgcHJvcGVydHkgbXVzdCBiZSB0eXBlZCBmb3IgdGhlIHJlcXVlc3RlZCBkZXBlbmRlbmN5LiBPbmx5IGNvbmNyZXRlIGNsYXNzZXMgYXJlIHN1cHBvcnRlZDsgZ2VuZXJpY3MgYXJlIG5vdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2F0ZWdvcnkgRGVmYXVsdHMgdG8gdGhlIGNsYXNzIG5hbWUgZGVyaXZlZCBmcm9tIHRoZSBwcm9wZXJ0eSB0eXBlLiBVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2NjdXJzXG4gKiBhbmQgbmFtZXMgYXJlIGNoYW5nZWQsIG9yIHdoZW4geW91IHdhbnQgdG8gdXBjYXN0IHRoZSBvYmplY3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAqIEBwYXJhbSB7UGFydGlhbDxJbmplY3RPcHRpb25zPn0gY2ZnPXt9IE9wdGlvbmFsIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgaW5qZWN0YWJsZSBpbnN0YW5jZSBiZWZvcmUgaXQncyBpbmplY3RlZCwgb3IgYXJndW1lbnRzIHRvIHBhc3MgdGhlIGNvbnN0cnVjdG9yIHdoZW4gaW5qZWN0aW5nIG9uRGVtYW5kXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueSk6IHZvaWR9IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0KFxuICBjYXRlZ29yeTogc3RyaW5nIHwgQ29uc3RydWN0b3IsXG4gIGNmZzogUGFydGlhbDxJbmplY3RPcHRpb25zPlxuKTogKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogYW55KSA9PiB2b2lkO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogQHN1bW1hcnkgQWxsb3dzIGZvciB0aGUgaW5qZWN0aW9uIG9mIGFuIHtAbGluayBpbmplY3RhYmxlfSBkZWNvcmF0ZWQgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBUaGUgcHJvcGVydHkgbXVzdCBiZSB0eXBlZCBmb3IgdGhlIHJlcXVlc3RlZCBkZXBlbmRlbmN5LiBPbmx5IGNvbmNyZXRlIGNsYXNzZXMgYXJlIHN1cHBvcnRlZDsgZ2VuZXJpY3MgYXJlIG5vdC5cbiAqXG4gKiBJbmplY3RlZCBwcm9wZXJ0aWVzIHNob3VsZCBiZSBkZXNjcmliZWQgbGlrZSBzbzpcbiAqIDxwcmU+XG4gKiAgICAgY2xhc3MgQ2xhc3NOYW1lIHtcbiAqICAgICAgICAgLi4uXG4gKlxuICogICAgICAgICBAaW5qZWN0KClcbiAqICAgICAgICAgcHJvcGVydHlOYW1lITogSW5qZWN0YWJsZUNsYXNzO1xuICpcbiAqICAgICAgICAgLi4uXG4gKiAgICAgfVxuICogPC9wcmU+XG4gKlxuICogd2hlcmUgSW5qZWN0YWJsZUNsYXNzIGlzIHRoZSBjbGFzcyB5b3Ugd2FudCB0byBpbmplY3QuXG4gKiBOb3RpY2UgdGhlIHVzZSBvZiAnITonIHRvIGVuc3VyZSB0aGUgdHJhbnNwaWxlciB0aGUgcHJvcGVydHkgd2lsbCBiZSBzZXQgb3V0c2lkZSB0aGUgY29uc3RydWN0b3IgYnV0IHdpbGwgYWx3YXlzIGJlIGRlZmluZWQuXG4gKiBGb3IgcHJvamVjdHMgd2hlcmUgbWluaWZpY2F0aW9uIG9jY3VycywgeW91IHNob3VsZCB1c2UgdGhlIGNhdGVnb3J5IHBhcmFtIHRvIGVuc3VyZSB0aGUgbmFtZSBpcyB0aGUgc2FtZSB0aHJvdWdob3V0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbY2F0ZWdvcnldIERlZmF1bHRzIHRvIHRoZSBjbGFzcyBuYW1lIGRlcml2ZWQgZnJvbSB0aGUgcHJvcGVydHkgdHlwZS4gVXNlZnVsIHdoZW4gbWluaWZpY2F0aW9uIG9jY3Vyc1xuICogYW5kIG5hbWVzIGFyZSBjaGFuZ2VkLCBvciB3aGVuIHlvdSB3YW50IHRvIHVwY2FzdCB0aGUgb2JqZWN0IHRvIGEgZGlmZmVyZW50IHR5cGUuXG4gKiBAcGFyYW0ge1BhcnRpYWw8SW5qZWN0T3B0aW9ucz59IFtjZmc9e31dIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgaW5qZWN0YWJsZSBpbnN0YW5jZSBiZWZvcmUgaXQncyBpbmplY3RlZCwgb3IgYXJndW1lbnRzIHRvIHBhc3MgdGhlIGNvbnN0cnVjdG9yIHdoZW4gaW5qZWN0aW5nIG9uRGVtYW5kXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueSk6IHZvaWR9IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBEZWNvcmF0b3JcbiAqICAgcGFydGljaXBhbnQgSW5qZWN0YWJsZXNcbiAqXG4gKiAgIENsaWVudC0+PkRlY29yYXRvcjogQGluamVjdCgpXG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogR2V0IHR5cGUgZnJvbSBwcm9wZXJ0eVxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IERlZmluZSBtZXRhZGF0YVxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IERlZmluZSBwcm9wZXJ0eSBnZXR0ZXJcbiAqXG4gKiAgIE5vdGUgb3ZlciBEZWNvcmF0b3I6IFdoZW4gcHJvcGVydHkgYWNjZXNzZWRcbiAqICAgQ2xpZW50LT4+RGVjb3JhdG9yOiBhY2Nlc3MgcHJvcGVydHlcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBDaGVjayBpZiBpbnN0YW5jZSBleGlzdHNcbiAqICAgYWx0IEluc3RhbmNlIGV4aXN0cyBpbiBXZWFrTWFwXG4gKiAgICAgRGVjb3JhdG9yLS0+PkNsaWVudDogUmV0dXJuIGNhY2hlZCBpbnN0YW5jZVxuICogICBlbHNlIE5vIGluc3RhbmNlXG4gKiAgICAgRGVjb3JhdG9yLT4+SW5qZWN0YWJsZXM6IGdldChuYW1lKVxuICogICAgIGFsdCBJbmplY3RhYmxlIGZvdW5kXG4gKiAgICAgICBJbmplY3RhYmxlcy0tPj5EZWNvcmF0b3I6IFJldHVybiBpbmplY3RhYmxlIGluc3RhbmNlXG4gKiAgICAgICBvcHQgSGFzIHRyYW5zZm9ybWVyXG4gKiAgICAgICAgIERlY29yYXRvci0+PkRlY29yYXRvcjogQ2FsbCB0cmFuc2Zvcm1lclxuICogICAgICAgZW5kXG4gKiAgICAgICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IFN0b3JlIGluIFdlYWtNYXBcbiAqICAgICAgIERlY29yYXRvci0tPj5DbGllbnQ6IFJldHVybiBpbnN0YW5jZVxuICogICAgIGVsc2UgTm8gaW5qZWN0YWJsZVxuICogICAgICAgRGVjb3JhdG9yLS0+PkNsaWVudDogVGhyb3cgZXJyb3JcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3QoXG4gIGNhdGVnb3J5Pzogc3ltYm9sIHwgc3RyaW5nIHwgQ29uc3RydWN0b3IgfCBQYXJ0aWFsPEluamVjdE9wdGlvbnM+LFxuICBjZmc/OiBQYXJ0aWFsPEluamVjdE9wdGlvbnM+XG4pIHtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEluamVjdGFibGVzS2V5cy5JTkpFQ1QpXG4gICAgLmRlZmluZSh7IGRlY29yYXRvcjogaW5qZWN0QmFzZURlY29yYXRvciwgYXJnczogW2NhdGVnb3J5LCBjZmddIH0pXG4gICAgLmFwcGx5KCk7XG59XG4iLCIvKipcbiAqIEBkZXNjcmlwdGlvbiBBIGxpZ2h0d2VpZ2h0IGRlcGVuZGVuY3kgaW5qZWN0aW9uIGxpYnJhcnkgZm9yIFR5cGVTY3JpcHQgYXBwbGljYXRpb25zLlxuICogQHN1bW1hcnkgQWRkcyBhIHNpbXBsZSBJbmplY3RhYmxlcyBpbXBsZW1lbnRhdGlvbiB0byBjcmVhdGUgc2luZ2xldG9uIGluc3RhbmNlcyBvZiBhbiBvYmplY3RcbiAqIGFuZCBlYXNpbHkgaW5qZWN0IGl0IGludG8gb3RoZXIgb2JqZWN0cy4gUHJvdmlkZXMgZGVjb3JhdG9ycyBmb3IgbWFya2luZyBjbGFzc2VzIGFzIGluamVjdGFibGVcbiAqIGFuZCBmb3IgaW5qZWN0aW5nIGRlcGVuZGVuY2llcyBpbnRvIGNsYXNzIHByb3BlcnRpZXMuXG4gKlxuICogQG1vZHVsZSBpbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuXG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0luamVjdGFibGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZWdpc3RyeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgaW5qZWN0YWJsZS1kZWNvcmF0b3JzIGxpYnJhcnkuXG4gKiBAc3VtbWFyeSBEZWZpbmVkIG9uIGxpYnJhcnkgYnVpbGQuIEhvbGRzIHRoZSBsaWJyYXJ5J3MgY3VycmVudCB2ZXJzaW9uIHN0cmluZy5cbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX05BTUUgPSBcIiMjUEFDS0FHRV9OQU1FIyNcIjtcbk1ldGFkYXRhLnJlZ2lzdGVyTGlicmFyeShQQUNLQUdFX05BTUUsIFZFUlNJT04pO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUE7Ozs7Ozs7O0FBUUc7QUFDVSxNQUFBLGVBQWUsR0FBRztBQUM3QixJQUFBLE9BQU8sRUFBRSxZQUFZO0FBQ3JCLElBQUEsVUFBVSxFQUFFLFlBQVk7QUFDeEIsSUFBQSxNQUFNLEVBQUUsUUFBUTs7QUFHbEI7Ozs7O0FBS0c7QUFDVSxNQUFBLHdCQUF3QixHQUFxQjtBQUN4RCxJQUFBLFNBQVMsRUFBRSxJQUFJOztBQUdqQjs7Ozs7QUFLRztBQUNJLE1BQU0sT0FBTyxHQUFHOztBQy9CdkI7Ozs7Ozs7QUFPRztB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
|
package/lib/decorators.cjs
CHANGED
|
@@ -122,9 +122,12 @@ function onDemand(category, cfg) {
|
|
|
122
122
|
function injectBaseDecorator(category, cfg) {
|
|
123
123
|
return function injectInnerDecorator(target, propertyKey) {
|
|
124
124
|
const config = (cfg || typeof category === "object" ? category : {});
|
|
125
|
+
if (propertyKey) {
|
|
126
|
+
(0, decoration_1.prop)()(target, propertyKey);
|
|
127
|
+
}
|
|
125
128
|
const name = (typeof category !== "object" &&
|
|
126
129
|
category) ||
|
|
127
|
-
|
|
130
|
+
decoration_1.Metadata.type(target.constructor, propertyKey);
|
|
128
131
|
if (!name) {
|
|
129
132
|
throw new Error(`Could not get Type from decorator`);
|
|
130
133
|
}
|
|
@@ -230,4 +233,4 @@ function inject(category, cfg) {
|
|
|
230
233
|
.define({ decorator: injectBaseDecorator, args: [category, cfg] })
|
|
231
234
|
.apply();
|
|
232
235
|
}
|
|
233
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBb0JBLDBEQXlEQztBQStHRCxnQ0FPQztBQVdELDhCQVFDO0FBV0QsNEJBUUM7QUE0QkQsa0RBaUVDO0FBa0hELHdCQU9DO0FBL2JELCtDQUF3RTtBQUN4RSxtREFBNEM7QUFDNUMsdUNBQTZEO0FBRTdELHFEQUFrRDtBQWdCbEQsU0FBZ0IsdUJBQXVCLENBQ3JDLFFBQTJELEVBQzNELEdBQStCO0lBRS9CLEdBQUc7UUFDRCxHQUFHO1lBQ0gsQ0FBQyxPQUFPLFFBQVEsS0FBSyxRQUFRO2dCQUMzQixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUE0QixFQUFFLG9DQUF3QixDQUFDO2dCQUN2RSxDQUFDLENBQUMsb0NBQXdCLENBQUMsQ0FBQztJQUNoQyxRQUFRO1FBQ04sT0FBTyxRQUFRLEtBQUssUUFBUTtZQUMxQixDQUFDLENBQUMsU0FBUztZQUNYLENBQUMsQ0FBQyxPQUFPLFFBQVEsS0FBSyxRQUFRO2dCQUM1QixDQUFDLENBQUMsUUFBUTtnQkFDVixDQUFDLENBQUMsT0FBTyxRQUFRLEtBQUssVUFBVSxJQUFJLFFBQVEsQ0FBQyxJQUFJO29CQUMvQyxDQUFDLENBQUMsUUFBUTtvQkFDVixDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3BCLE9BQU8sU0FBUyx3QkFBd0IsQ0FBQyxRQUFhO1FBQ3BELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzNELFFBQVEsR0FBRyxRQUFRLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQztRQUVyQyxNQUFNLFFBQVEsR0FBdUI7WUFDbkMsS0FBSyxFQUFFLFFBQWtCO1lBQ3pCLE1BQU0sRUFBRSxNQUFNO1NBQ2YsQ0FBQztRQUVGLE9BQU8sQ0FBQyxjQUFjLENB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QUUsQ0FBQztvQ0FDWCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUNuQixDQUFDOzRCQUNILE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDOzRCQUV0QixPQUFPLEdBQUcsQ0FBQzt3QkFDYixDQUFDO3FCQUNGLENBQUMsQ0FBQztvQkFDSCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDM0IsQ0FBQztZQUNILENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7QUFDSixDQUFDO0FBdUREOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMERHO0FBQ0gsU0FBZ0IsTUFBTSxDQUNwQixRQUFpRSxFQUNqRSxHQUE0QjtJQUU1QixPQUFPLHVCQUFVLENBQUMsR0FBRyxDQUFDLDJCQUFlLENBQUMsTUFBTSxDQUFDO1NBQzFDLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztTQUNqRSxLQUFLLEVBQUUsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWcsIEluamVjdGFibGVzS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZXMgfSBmcm9tIFwiLi9JbmplY3RhYmxlc1wiO1xuaW1wb3J0IHsgZ2V0SW5qZWN0S2V5LCBnZXRUeXBlRnJvbURlY29yYXRvciB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlTWV0YWRhdGEsIEluc3RhbmNlQ2FsbGJhY2sgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVjb3JhdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBAaW5qZWN0YWJsZSBkZWNvcmF0b3IuXG4gKiBAc3VtbWFyeSBDb250cm9scyBsaWZlY3ljbGUgKHNpbmdsZXRvbiB2cyBvbi1kZW1hbmQpIGFuZCBhbiBvcHRpb25hbCBpbnN0YW5jZSB0cmFuc2Zvcm1hdGlvbiBjYWxsYmFjayBleGVjdXRlZCBwb3N0LWNvbnN0cnVjdGlvbi5cbiAqIEB0ZW1wbGF0ZSBUIFRoZSBpbnN0YW5jZSB0eXBlIGFmZmVjdGVkIGJ5IHRoZSBjYWxsYmFjayB3aGVuIHByb3ZpZGVkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBzaW5nbGV0b24gV2hlbiB0cnVlLCBhIHNpbmdsZSBpbnN0YW5jZSBpcyBzaGFyZWQgKHNpbmdsZXRvbikuIFdoZW4gZmFsc2UsIGluc3RhbmNlcyBhcmUgY3JlYXRlZCBvbiBkZW1hbmQuXG4gKiBAcHJvcGVydHkge0luc3RhbmNlQ2FsbGJhY2s8VD59IFtjYWxsYmFja10gT3B0aW9uYWwgaG9vayB0byB0cmFuc2Zvcm0gdGhlIGluc3RhbmNlIGFmdGVyIGl0IGlzIGNvbnN0cnVjdGVkLlxuICogQHR5cGVkZWYgSW5qZWN0YWJsZUNvbmZpZ1xuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgSW5qZWN0YWJsZUNvbmZpZyA9IHtcbiAgc2luZ2xldG9uOiBib29sZWFuO1xuICBjYWxsYmFjaz86IEluc3RhbmNlQ2FsbGJhY2s8YW55Pjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RhYmxlQmFzZURlY29yYXRvcihcbiAgY2F0ZWdvcnk/OiBzdHJpbmcgfCBDb25zdHJ1Y3RvciB8IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz4sXG4gIGNmZz86IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz5cbikge1xuICBjZmcgPVxuICAgIGNmZyB8fFxuICAgICh0eXBlb2YgY2F0ZWdvcnkgPT09IFwib2JqZWN0XCJcbiAgICAgID8gT2JqZWN0LmFzc2lnbihjYXRlZ29yeSBhcyBSZWNvcmQ8YW55LCBhbnk+LCBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWcpXG4gICAgICA6IERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZyk7XG4gIGNhdGVnb3J5ID1cbiAgICB0eXBlb2YgY2F0ZWdvcnkgPT09IFwib2JqZWN0XCJcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IHR5cGVvZiBjYXRlZ29yeSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGNhdGVnb3J5XG4gICAgICAgIDogdHlwZW9mIGNhdGVnb3J5ID09PSBcImZ1bmN0aW9uXCIgJiYgY2F0ZWdvcnkubmFtZVxuICAgICAgICAgID8gY2F0ZWdvcnlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluamVjdGFibGVJbm5lckRlY29yYXRvcihvcmlnaW5hbDogYW55KSB7XG4gICAgY29uc3Qgc3ltYm9sID0gU3ltYm9sLmZvcihjYXRlZ29yeSB8fCBvcmlnaW5hbC50b1N0cmluZygpKTtcbiAgICBjYXRlZ29yeSA9IGNhdGVnb3J5IHx8IG9yaWdpbmFsLm5hbWU7XG5cbiAgICBjb25zdCBtZXRhZGF0YTogSW5qZWN0YWJsZU1ldGFkYXRhID0ge1xuICAgICAgY2xhc3M6IGNhdGVnb3J5IGFzIHN0cmluZyxcbiAgICAgIHN5bWJvbDogc3ltYm9sLFxuICAgIH07XG5cbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgZ2V0SW5qZWN0S2V5KEluamVjdGFibGVzS2V5cy5JTkpFQ1RBQkxFKSxcbiAgICAgIG1ldGFkYXRhLFxuICAgICAgb3JpZ2luYWxcbiAgICApO1xuICAgIC8vIHRoZSBuZXcgY29uc3RydWN0b3IgYmVoYXZpb3VyXG4gICAgY29uc3QgbmV3Q29uc3RydWN0b3I6IGFueSA9IGZ1bmN0aW9uICguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgcmV0dXJuIEluamVjdGFibGVzLmdldDxhbnk+KHN5bWJvbCwgLi4uYXJncyk7XG4gICAgfTtcblxuICAgIC8vIGNvcHkgcHJvdG90eXBlIHNvIGluc3RhbmNlb2Ygb3BlcmF0b3Igc3RpbGwgd29ya3NcbiAgICBuZXdDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBvcmlnaW5hbC5wcm90b3R5cGU7XG4gICAgLy8gbmV3Q29uc3RydWN0b3IuX19wcm90b19fID0gb3JpZ2luYWwuX19wcm90b19fO1xuICAgIC8vIFNldHMgdGhlIHByb3BlciBjb25zdHJ1Y3RvciBuYW1lIGZvciB0eXBlIHZlcmlmaWNhdGlvblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdDb25zdHJ1Y3RvciwgXCJuYW1lXCIsIHtcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IG9yaWdpbmFsLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgIH0pO1xuXG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgIGdldEluamVjdEtleShJbmplY3RhYmxlc0tleXMuSU5KRUNUQUJMRSksXG4gICAgICBtZXRhZGF0YSxcbiAgICAgIG5ld0NvbnN0cnVjdG9yXG4gICAgKTtcblxuICAgIEluamVjdGFibGVzLnJlZ2lzdGVyKG9yaWdpbmFsLCBzeW1ib2wsIGNmZyk7XG4gICAgLy8gcmV0dXJuIG5ldyBjb25zdHJ1Y3RvciAod2lsbCBvdmVycmlkZSBvcmlnaW5hbClcbiAgICByZXR1cm4gbmV3Q29uc3RydWN0b3I7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyaWMgY29uc3RydWN0b3IgdHlwZSBmb3IgY2xhc3MtbGlrZSB2YWx1ZXMuXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGFueSBjbGFzcyB0aGF0IGNhbiBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhcmJpdHJhcnkgYXJndW1lbnRzLCBwcm9kdWNpbmcgYW4gaW5zdGFuY2Ugb2YgdHlwZSBULlxuICogQHRlbXBsYXRlIFQgVGhlIGluc3RhbmNlIHR5cGUgY3JlYXRlZCBieSB0aGUgY29uc3RydWN0b3IuXG4gKiBAdHlwZWRlZiBDb25zdHJ1Y3RvclxuICogQGV4YW1wbGVcbiAqIC8vIFVzaW5nIENvbnN0cnVjdG9yIHRvIHR5cGUgYSBmYWN0b3J5XG4gKiBmdW5jdGlvbiBtYWtlPFQ+KEN0b3I6IENvbnN0cnVjdG9yPFQ+LCAuLi5hcmdzOiBhbnlbXSk6IFQge1xuICogICByZXR1cm4gbmV3IEN0b3IoLi4uYXJncyk7XG4gKiB9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBDb25zdHJ1Y3RvcjxUID0gYW55PiA9IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IFQgfTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2UuXG4gKlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55KTogYW55fSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgdGhlIGNsYXNzIGludG8gYW4gaW5qZWN0YWJsZS5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0YWJsZSgpOiAob3JpZ2luYWw6IGFueSkgPT4gYW55O1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBDb25zdHJ1Y3Rvcn0gY2F0ZWdvcnkgRGVmYXVsdHMgdG8gdGhlIGNsYXNzIGNhdGVnb3J5LiBVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2NjdXJzIGFuZCBuYW1lcyBhcmUgY2hhbmdlZCxcbiAqIG9yIHdoZW4geW91IHdhbnQgdG8gdXBjYXN0IHRoZSBvYmplY3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAqXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnkpOiBhbnl9IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyB0aGUgY2xhc3MgaW50byBhbiBpbmplY3RhYmxlLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RhYmxlKFxuICBjYXRlZ29yeTogc3RyaW5nIHwgQ29uc3RydWN0b3Jcbik6IChvcmlnaW5hbDogYW55KSA9PiBhbnk7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIGNsYXNzIGFzIGF2YWlsYWJsZSBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgY2xhc3MgYXMgYW4gaW5qZWN0YWJsZSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVnaXN0cnkuXG4gKiBXaGVuIGFwcGxpZWQgdG8gYSBjbGFzcywgcmVwbGFjZXMgaXRzIGNvbnN0cnVjdG9yIHdpdGggb25lIHRoYXQgcmV0dXJucyBhbiBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0ge1BhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz59IGNmZz1EZWZhdWx0SW5qZWN0YWJsZUNvbmZpZyBBbGxvd3Mgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCBzaW5nbGV0b24gYmVoYXZpb3IgYW5kIGFkZGluZyBhIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSBjbGFzcyBpbnRvIGFuIGluamVjdGFibGUuXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdGFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdGFibGUoXG4gIGNmZzogUGFydGlhbDxJbmplY3RhYmxlQ29uZmlnPlxuKTogKG9yaWdpbmFsOiBhbnkpID0+IGFueTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIGNhdGVnb3J5IERlZmF1bHRzIHRvIHRoZSBjbGFzcyBjYXRlZ29yeS4gVXNlZnVsIHdoZW4gbWluaWZpY2F0aW9uIG9jY3VycyBhbmQgbmFtZXMgYXJlIGNoYW5nZWQsXG4gKiBvciB3aGVuIHlvdSB3YW50IHRvIHVwY2FzdCB0aGUgb2JqZWN0IHRvIGEgZGlmZmVyZW50IHR5cGUuXG4gKiBAcGFyYW0ge1BhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz59IGNmZz1EZWZhdWx0SW5qZWN0YWJsZUNvbmZpZyBBbGxvd3Mgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCBzaW5nbGV0b24gYmVoYXZpb3IgYW5kIGFkZGluZyBhIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSBjbGFzcyBpbnRvIGFuIGluamVjdGFibGUuXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdGFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdGFibGUoXG4gIGNhdGVnb3J5OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgY2ZnOiBQYXJ0aWFsPEluamVjdGFibGVDb25maWc+XG4pOiAob3JpZ2luYWw6IGFueSkgPT4gYW55O1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBDb25zdHJ1Y3Rvcn0gW2NhdGVnb3J5XSBEZWZhdWx0cyB0byB0aGUgY2xhc3MgY2F0ZWdvcnkuIFVzZWZ1bCB3aGVuIG1pbmlmaWNhdGlvbiBvY2N1cnMgYW5kIG5hbWVzIGFyZSBjaGFuZ2VkLFxuICogb3Igd2hlbiB5b3Ugd2FudCB0byB1cGNhc3QgdGhlIG9iamVjdCB0byBhIGRpZmZlcmVudCB0eXBlLlxuICogQHBhcmFtIHtQYXJ0aWFsPEluamVjdGFibGVDb25maWc+fSBbY2ZnPURlZmF1bHRJbmplY3RhYmxlQ29uZmlnXSBBbGxvd3Mgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCBzaW5nbGV0b24gYmVoYXZpb3IgYW5kIGFkZGluZyBhIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSBjbGFzcyBpbnRvIGFuIGluamVjdGFibGUuXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdGFibGVcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRGVjb3JhdG9yXG4gKiAgIHBhcnRpY2lwYW50IEluamVjdGFibGVzXG4gKlxuICogICBDbGllbnQtPj5EZWNvcmF0b3I6IEBpbmplY3RhYmxlKClcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBDcmVhdGUgbmV3IGNvbnN0cnVjdG9yXG4gKlxuICogICBOb3RlIG92ZXIgRGVjb3JhdG9yOiBXaGVuIG5ldyBpbnN0YW5jZSByZXF1ZXN0ZWRcbiAqICAgRGVjb3JhdG9yLT4+SW5qZWN0YWJsZXM6IGdldChjYXRlZ29yeSlcbiAqICAgYWx0IEluc3RhbmNlIGV4aXN0c1xuICogICAgIEluamVjdGFibGVzLS0+PkRlY29yYXRvcjogUmV0dXJuIGV4aXN0aW5nIGluc3RhbmNlXG4gKiAgIGVsc2UgTm8gaW5zdGFuY2VcbiAqICAgICBEZWNvcmF0b3ItPj5JbmplY3RhYmxlczogcmVnaXN0ZXIob3JpZ2luYWwsIGNhdGVnb3J5KVxuICogICAgIERlY29yYXRvci0+PkluamVjdGFibGVzOiBnZXQoY2F0ZWdvcnkpXG4gKiAgICAgSW5qZWN0YWJsZXMtLT4+RGVjb3JhdG9yOiBSZXR1cm4gbmV3IGluc3RhbmNlXG4gKiAgICAgb3B0IEhhcyBjYWxsYmFja1xuICogICAgICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBDYWxsIGluc3RhbmNlQ2FsbGJhY2tcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogRGVmaW5lIG1ldGFkYXRhXG4gKiAgIERlY29yYXRvci0tPj5DbGllbnQ6IFJldHVybiBpbnN0YW5jZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0YWJsZShcbiAgY2F0ZWdvcnk/OiBzdHJpbmcgfCBDb25zdHJ1Y3RvciB8IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz4sXG4gIGNmZz86IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz5cbikge1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoSW5qZWN0YWJsZXNLZXlzLklOSkVDVEFCTEUpXG4gICAgLmRlZmluZSh7IGRlY29yYXRvcjogaW5qZWN0YWJsZUJhc2VEZWNvcmF0b3IsIGFyZ3M6IFtjYXRlZ29yeSwgY2ZnXSB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb252ZW5pZW5jZSBkZWNvcmF0b3IgdG8gcmVnaXN0ZXIgYW4gaW5qZWN0YWJsZSBhcyBhIHNpbmdsZXRvbi5cbiAqIEBzdW1tYXJ5IFdyYXBzIHtAbGluayBpbmplY3RhYmxlfSBmb3JjaW5nIHRoZSBzaW5nbGV0b24gbGlmZWN5Y2xlIHNvIG9ubHkgb25lIGluc3RhbmNlIGlzIGNyZWF0ZWQgYW5kIHJldXNlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfENvbnN0cnVjdG9yfSBbY2F0ZWdvcnldIE9wdGlvbmFsIGV4cGxpY2l0IGNhdGVnb3J5L3N5bWJvbCBzb3VyY2U7IGRlZmF1bHRzIHRvIHRoZSBjbGFzcy5cbiAqIEBwYXJhbSB7T21pdDxJbmplY3RhYmxlQ29uZmlnLCBcInNpbmdsZXRvblwiPn0gW2NmZ10gQWRkaXRpb25hbCBpbmplY3RhYmxlIGNvbmZpZ3VyYXRpb24gZXhjbHVkaW5nIHRoZSBzaW5nbGV0b24gZmxhZy5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBjbGFzcyBkZWNvcmF0b3IgdGhhdCByZWdpc3RlcnMgdGhlIHRhcmdldCBhcyBhIHNpbmdsZXRvbiBpbmplY3RhYmxlLlxuICogQGZ1bmN0aW9uIHNpbmdsZXRvblxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpbmdsZXRvbihcbiAgY2F0ZWdvcnk/OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgY2ZnPzogT21pdDxJbmplY3RhYmxlQ29uZmlnLCBcInNpbmdsZXRvblwiPlxuKSB7XG4gIHJldHVybiBpbmplY3RhYmxlKFxuICAgIGNhdGVnb3J5IGFzIGFueSxcbiAgICBPYmplY3QuYXNzaWduKHt9LCBjZmcgfHwge30sIHsgc2luZ2xldG9uOiB0cnVlIH0pXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlbmllbmNlIGRlY29yYXRvciB0byByZWdpc3RlciBhbiBpbmplY3RhYmxlIGFzIG9uLWRlbWFuZCAobm9uLXNpbmdsZXRvbikuXG4gKiBAc3VtbWFyeSBXcmFwcyB7QGxpbmsgaW5qZWN0YWJsZX0gZm9yY2luZyBuZXcgaW5zdGFuY2VzIHRvIGJlIGNyZWF0ZWQgb24gZXZlcnkgaW5qZWN0aW9uIG9yIHJldHJpZXZhbC5cbiAqIEBwYXJhbSB7c3RyaW5nfENvbnN0cnVjdG9yfSBbY2F0ZWdvcnldIE9wdGlvbmFsIGV4cGxpY2l0IGNhdGVnb3J5L3N5bWJvbCBzb3VyY2U7IGRlZmF1bHRzIHRvIHRoZSBjbGFzcy5cbiAqIEBwYXJhbSB7T21pdDxJbmplY3RhYmxlQ29uZmlnLCBcInNpbmdsZXRvblwiPn0gW2NmZ10gQWRkaXRpb25hbCBpbmplY3RhYmxlIGNvbmZpZ3VyYXRpb24gZXhjbHVkaW5nIHRoZSBzaW5nbGV0b24gZmxhZy5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBjbGFzcyBkZWNvcmF0b3IgdGhhdCByZWdpc3RlcnMgdGhlIHRhcmdldCBhcyBhIG5vbi1zaW5nbGV0b24gaW5qZWN0YWJsZS5cbiAqIEBmdW5jdGlvbiBvbkRlbWFuZFxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uRGVtYW5kKFxuICBjYXRlZ29yeT86IHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICBjZmc/OiBPbWl0PEluamVjdGFibGVDb25maWcsIFwic2luZ2xldG9uXCI+XG4pIHtcbiAgcmV0dXJuIGluamVjdGFibGUoXG4gICAgY2F0ZWdvcnkgYXMgYW55LFxuICAgIE9iamVjdC5hc3NpZ24oe30sIGNmZyB8fCB7fSwgeyBzaW5nbGV0b246IGZhbHNlIH0pXG4gICk7XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiB0eXBlIGZvciB0cmFuc2Zvcm1pbmcgaW5qZWN0YWJsZSBpbnN0YW5jZXMgYmVmb3JlIHRoZXkncmUgaW5qZWN0ZWQuXG4gKiBAc3VtbWFyeSBGdW5jdGlvbiB3aGljaCB0cmFuc2Zvcm1zIGEgY2FjaGVkIHtAbGluayBpbmplY3RhYmxlfSBpbnN0YW5jZSBiZWZvcmUgaXQncyBpbmplY3RlZCBpbnRvIGEgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge2FueX0gaW5qZWN0YWJsZSBUaGUgaW5qZWN0YWJsZSBpbnN0YW5jZSB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7YW55fSBvYmogVGhlIG9iamVjdCB0aGUgaW5qZWN0YWJsZSB3aWxsIGJlIGluamVjdGVkIG9uXG4gKiBAcmV0dXJuIHthbnl9IFRoZSB0cmFuc2Zvcm1lZCBpbmplY3RhYmxlIGluc3RhbmNlXG4gKlxuICogQHR5cGVkZWYge0Z1bmN0aW9ufSBJbnN0YW5jZVRyYW5zZm9ybWVyXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFuY2VUcmFuc2Zvcm1lciA9IChpbmplY3RhYmxlOiBhbnksIG9iajogYW55KSA9PiBhbnk7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE9wdGlvbnMgZm9yIHRoZSBwcm9wZXJ0eS1sZXZlbCBAaW5qZWN0IGRlY29yYXRvci5cbiAqIEBzdW1tYXJ5IEFsbG93cyBzcGVjaWZ5aW5nIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBhbmQgYW4gb3B0aW9uYWwgdHJhbnNmb3JtZXIgdG8gYmUgYXBwbGllZCB0byB0aGUgcmVzb2x2ZWQgaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge2FueVtdfSBbYXJnc10gT3B0aW9uYWwgY29uc3RydWN0b3IgYXJndW1lbnRzIHRvIHVzZSB3aGVuIGJ1aWxkaW5nIHRoZSBpbmplY3RhYmxlIGluc3RhbmNlLlxuICogQHByb3BlcnR5IHtJbnN0YW5jZVRyYW5zZm9ybWVyfSBbdHJhbnNmb3JtZXJdIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgaW5zdGFuY2UgYmVmb3JlIGFzc2lnbm1lbnQuXG4gKiBAdHlwZWRlZiBJbmplY3RPcHRpb25zXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBJbmplY3RPcHRpb25zID0ge1xuICBhcmdzPzogYW55W107XG4gIHRyYW5zZm9ybWVyPzogSW5zdGFuY2VUcmFuc2Zvcm1lcjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RCYXNlRGVjb3JhdG9yKFxuICBjYXRlZ29yeT86IHN5bWJvbCB8IHN0cmluZyB8IENvbnN0cnVjdG9yIHwgUGFydGlhbDxJbmplY3RPcHRpb25zPixcbiAgY2ZnPzogUGFydGlhbDxJbmplY3RPcHRpb25zPlxuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpbmplY3RJbm5lckRlY29yYXRvcih0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpIHtcbiAgICBjb25zdCBjb25maWc6IEluamVjdE9wdGlvbnMgPSAoXG4gICAgICBjZmcgfHwgdHlwZW9mIGNhdGVnb3J5ID09PSBcIm9iamVjdFwiID8gY2F0ZWdvcnkgOiB7fVxuICAgICkgYXMgSW5qZWN0T3B0aW9ucztcblxuICAgIGNvbnN0IG5hbWU6IHN5bWJvbCB8IHN0cmluZyB8IENvbnN0cnVjdG9yIHwgdW5kZWZpbmVkID1cbiAgICAgICh0eXBlb2YgY2F0ZWdvcnkgIT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgKGNhdGVnb3J5IGFzIHN5bWJvbCB8IHN0cmluZyB8IENvbnN0cnVjdG9yKSkgfHxcbiAgICAgIGdldFR5cGVGcm9tRGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZ2V0IFR5cGUgZnJvbSBkZWNvcmF0b3JgKTtcbiAgICB9XG5cbiAgICAvLyBwcm9wKCkodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgIGdldEluamVjdEtleShJbmplY3RhYmxlc0tleXMuSU5KRUNUKSxcbiAgICAgIHtcbiAgICAgICAgaW5qZWN0YWJsZTogbmFtZSxcbiAgICAgIH0sXG4gICAgICB0YXJnZXQsXG4gICAgICBwcm9wZXJ0eUtleVxuICAgICk7XG5cbiAgICBjb25zdCB2YWx1ZXMgPSBuZXcgV2Vha01hcCgpO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldCh0aGlzOiBhbnkpIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgcHJvcGVydHlLZXlcbiAgICAgICAgKSBhcyBQcm9wZXJ0eURlc2NyaXB0b3I7XG4gICAgICAgIGlmIChkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSkge1xuICAgICAgICAgIC8vIGxldCAvb2JqOiBhbnk7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHByb3BlcnR5S2V5LCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldCh0aGlzOiBhbnkpIHtcbiAgICAgICAgICAgICAgbGV0IG9iaiA9IHZhbHVlcy5nZXQodGhpcyk7XG4gICAgICAgICAgICAgIGlmIChvYmopIHJldHVybiBvYmo7XG4gICAgICAgICAgICAgIG9iaiA9IEluamVjdGFibGVzLmdldChuYW1lLCAuLi4oY29uZmlnLmFyZ3MgfHwgW10pKTtcbiAgICAgICAgICAgICAgaWYgKCFvYmopXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgYENvdWxkIG5vdCBnZXQgSW5qZWN0YWJsZSAke25hbWUudG9TdHJpbmcoKX0gdG8gaW5qZWN0IGluICR7dGFyZ2V0LmNvbnN0cnVjdG9yID8gdGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWUgOiB0YXJnZXQubmFtZX0ncyAke3Byb3BlcnR5S2V5fWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAoY29uZmlnLnRyYW5zZm9ybWVyKVxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBvYmogPSBjb25maWcudHJhbnNmb3JtZXIob2JqLCB0YXJnZXQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YWx1ZXMuc2V0KHRoaXMsIG9iaik7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXNbcHJvcGVydHlLZXldO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGEgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBAc3VtbWFyeSBBbGxvd3MgZm9yIHRoZSBpbmplY3Rpb24gb2YgYW4ge0BsaW5rIGluamVjdGFibGV9IGRlY29yYXRlZCBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIFRoZSBwcm9wZXJ0eSBtdXN0IGJlIHR5cGVkIGZvciB0aGUgcmVxdWVzdGVkIGRlcGVuZGVuY3kuIE9ubHkgY29uY3JldGUgY2xhc3NlcyBhcmUgc3VwcG9ydGVkOyBnZW5lcmljcyBhcmUgbm90LlxuICpcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSwgYW55KTogdm9pZH0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3QoKTogKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogYW55KSA9PiB2b2lkO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogQHN1bW1hcnkgQWxsb3dzIGZvciB0aGUgaW5qZWN0aW9uIG9mIGFuIHtAbGluayBpbmplY3RhYmxlfSBkZWNvcmF0ZWQgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBUaGUgcHJvcGVydHkgbXVzdCBiZSB0eXBlZCBmb3IgdGhlIHJlcXVlc3RlZCBkZXBlbmRlbmN5LiBPbmx5IGNvbmNyZXRlIGNsYXNzZXMgYXJlIHN1cHBvcnRlZDsgZ2VuZXJpY3MgYXJlIG5vdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2F0ZWdvcnkgRGVmYXVsdHMgdG8gdGhlIGNsYXNzIG5hbWUgZGVyaXZlZCBmcm9tIHRoZSBwcm9wZXJ0eSB0eXBlLiBVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2NjdXJzXG4gKiBhbmQgbmFtZXMgYXJlIGNoYW5nZWQsIG9yIHdoZW4geW91IHdhbnQgdG8gdXBjYXN0IHRoZSBvYmplY3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSwgYW55KTogdm9pZH0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3QoXG4gIGNhdGVnb3J5OiBzdHJpbmcgfCBDb25zdHJ1Y3RvclxuKTogKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogYW55KSA9PiB2b2lkO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogQHN1bW1hcnkgQWxsb3dzIGZvciB0aGUgaW5qZWN0aW9uIG9mIGFuIHtAbGluayBpbmplY3RhYmxlfSBkZWNvcmF0ZWQgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBUaGUgcHJvcGVydHkgbXVzdCBiZSB0eXBlZCBmb3IgdGhlIHJlcXVlc3RlZCBkZXBlbmRlbmN5LiBPbmx5IGNvbmNyZXRlIGNsYXNzZXMgYXJlIHN1cHBvcnRlZDsgZ2VuZXJpY3MgYXJlIG5vdC5cbiAqXG4gKiBAcGFyYW0ge1BhcnRpYWw8SW5qZWN0T3B0aW9ucz59IFtjZmc9e31dIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgaW5qZWN0YWJsZSBpbnN0YW5jZSBiZWZvcmUgaXQncyBpbmplY3RlZCwgb3IgYXJndW1lbnRzIHRvIHBhc3MgdGhlIGNvbnN0cnVjdG9yIHdoZW4gaW5qZWN0aW5nIG9uRGVtYW5kXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueSk6IHZvaWR9IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0KFxuICBjZmc6IFBhcnRpYWw8SW5qZWN0T3B0aW9ucz5cbik6ICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IGFueSkgPT4gdm9pZDtcbi8qKlxuICogQGRlc2NyaXB0aW9uIFByb3BlcnR5IGRlY29yYXRvciB0aGF0IGluamVjdHMgYSBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIEBzdW1tYXJ5IEFsbG93cyBmb3IgdGhlIGluamVjdGlvbiBvZiBhbiB7QGxpbmsgaW5qZWN0YWJsZX0gZGVjb3JhdGVkIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogVGhlIHByb3BlcnR5IG11c3QgYmUgdHlwZWQgZm9yIHRoZSByZXF1ZXN0ZWQgZGVwZW5kZW5jeS4gT25seSBjb25jcmV0ZSBjbGFzc2VzIGFyZSBzdXBwb3J0ZWQ7IGdlbmVyaWNzIGFyZSBub3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNhdGVnb3J5IERlZmF1bHRzIHRvIHRoZSBjbGFzcyBuYW1lIGRlcml2ZWQgZnJvbSB0aGUgcHJvcGVydHkgdHlwZS4gVXNlZnVsIHdoZW4gbWluaWZpY2F0aW9uIG9jY3Vyc1xuICogYW5kIG5hbWVzIGFyZSBjaGFuZ2VkLCBvciB3aGVuIHlvdSB3YW50IHRvIHVwY2FzdCB0aGUgb2JqZWN0IHRvIGEgZGlmZmVyZW50IHR5cGUuXG4gKiBAcGFyYW0ge1BhcnRpYWw8SW5qZWN0T3B0aW9ucz59IGNmZz17fSBPcHRpb25hbCBmdW5jdGlvbiB0byB0cmFuc2Zvcm0gdGhlIGluamVjdGFibGUgaW5zdGFuY2UgYmVmb3JlIGl0J3MgaW5qZWN0ZWQsIG9yIGFyZ3VtZW50cyB0byBwYXNzIHRoZSBjb25zdHJ1Y3RvciB3aGVuIGluamVjdGluZyBvbkRlbWFuZFxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnkpOiB2b2lkfSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdChcbiAgY2F0ZWdvcnk6IHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICBjZmc6IFBhcnRpYWw8SW5qZWN0T3B0aW9ucz5cbik6ICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IGFueSkgPT4gdm9pZDtcbi8qKlxuICogQGRlc2NyaXB0aW9uIFByb3BlcnR5IGRlY29yYXRvciB0aGF0IGluamVjdHMgYSBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIEBzdW1tYXJ5IEFsbG93cyBmb3IgdGhlIGluamVjdGlvbiBvZiBhbiB7QGxpbmsgaW5qZWN0YWJsZX0gZGVjb3JhdGVkIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogVGhlIHByb3BlcnR5IG11c3QgYmUgdHlwZWQgZm9yIHRoZSByZXF1ZXN0ZWQgZGVwZW5kZW5jeS4gT25seSBjb25jcmV0ZSBjbGFzc2VzIGFyZSBzdXBwb3J0ZWQ7IGdlbmVyaWNzIGFyZSBub3QuXG4gKlxuICogSW5qZWN0ZWQgcHJvcGVydGllcyBzaG91bGQgYmUgZGVzY3JpYmVkIGxpa2Ugc286XG4gKiA8cHJlPlxuICogICAgIGNsYXNzIENsYXNzTmFtZSB7XG4gKiAgICAgICAgIC4uLlxuICpcbiAqICAgICAgICAgQGluamVjdCgpXG4gKiAgICAgICAgIHByb3BlcnR5TmFtZSE6IEluamVjdGFibGVDbGFzcztcbiAqXG4gKiAgICAgICAgIC4uLlxuICogICAgIH1cbiAqIDwvcHJlPlxuICpcbiAqIHdoZXJlIEluamVjdGFibGVDbGFzcyBpcyB0aGUgY2xhc3MgeW91IHdhbnQgdG8gaW5qZWN0LlxuICogTm90aWNlIHRoZSB1c2Ugb2YgJyE6JyB0byBlbnN1cmUgdGhlIHRyYW5zcGlsZXIgdGhlIHByb3BlcnR5IHdpbGwgYmUgc2V0IG91dHNpZGUgdGhlIGNvbnN0cnVjdG9yIGJ1dCB3aWxsIGFsd2F5cyBiZSBkZWZpbmVkLlxuICogRm9yIHByb2plY3RzIHdoZXJlIG1pbmlmaWNhdGlvbiBvY2N1cnMsIHlvdSBzaG91bGQgdXNlIHRoZSBjYXRlZ29yeSBwYXJhbSB0byBlbnN1cmUgdGhlIG5hbWUgaXMgdGhlIHNhbWUgdGhyb3VnaG91dC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NhdGVnb3J5XSBEZWZhdWx0cyB0byB0aGUgY2xhc3MgbmFtZSBkZXJpdmVkIGZyb20gdGhlIHByb3BlcnR5IHR5cGUuIFVzZWZ1bCB3aGVuIG1pbmlmaWNhdGlvbiBvY2N1cnNcbiAqIGFuZCBuYW1lcyBhcmUgY2hhbmdlZCwgb3Igd2hlbiB5b3Ugd2FudCB0byB1cGNhc3QgdGhlIG9iamVjdCB0byBhIGRpZmZlcmVudCB0eXBlLlxuICogQHBhcmFtIHtQYXJ0aWFsPEluamVjdE9wdGlvbnM+fSBbY2ZnPXt9XSBPcHRpb25hbCBmdW5jdGlvbiB0byB0cmFuc2Zvcm0gdGhlIGluamVjdGFibGUgaW5zdGFuY2UgYmVmb3JlIGl0J3MgaW5qZWN0ZWQsIG9yIGFyZ3VtZW50cyB0byBwYXNzIHRoZSBjb25zdHJ1Y3RvciB3aGVuIGluamVjdGluZyBvbkRlbWFuZFxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnkpOiB2b2lkfSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRGVjb3JhdG9yXG4gKiAgIHBhcnRpY2lwYW50IEluamVjdGFibGVzXG4gKlxuICogICBDbGllbnQtPj5EZWNvcmF0b3I6IEBpbmplY3QoKVxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IEdldCB0eXBlIGZyb20gcHJvcGVydHlcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBEZWZpbmUgbWV0YWRhdGFcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBEZWZpbmUgcHJvcGVydHkgZ2V0dGVyXG4gKlxuICogICBOb3RlIG92ZXIgRGVjb3JhdG9yOiBXaGVuIHByb3BlcnR5IGFjY2Vzc2VkXG4gKiAgIENsaWVudC0+PkRlY29yYXRvcjogYWNjZXNzIHByb3BlcnR5XG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogQ2hlY2sgaWYgaW5zdGFuY2UgZXhpc3RzXG4gKiAgIGFsdCBJbnN0YW5jZSBleGlzdHMgaW4gV2Vha01hcFxuICogICAgIERlY29yYXRvci0tPj5DbGllbnQ6IFJldHVybiBjYWNoZWQgaW5zdGFuY2VcbiAqICAgZWxzZSBObyBpbnN0YW5jZVxuICogICAgIERlY29yYXRvci0+PkluamVjdGFibGVzOiBnZXQobmFtZSlcbiAqICAgICBhbHQgSW5qZWN0YWJsZSBmb3VuZFxuICogICAgICAgSW5qZWN0YWJsZXMtLT4+RGVjb3JhdG9yOiBSZXR1cm4gaW5qZWN0YWJsZSBpbnN0YW5jZVxuICogICAgICAgb3B0IEhhcyB0cmFuc2Zvcm1lclxuICogICAgICAgICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IENhbGwgdHJhbnNmb3JtZXJcbiAqICAgICAgIGVuZFxuICogICAgICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBTdG9yZSBpbiBXZWFrTWFwXG4gKiAgICAgICBEZWNvcmF0b3ItLT4+Q2xpZW50OiBSZXR1cm4gaW5zdGFuY2VcbiAqICAgICBlbHNlIE5vIGluamVjdGFibGVcbiAqICAgICAgIERlY29yYXRvci0tPj5DbGllbnQ6IFRocm93IGVycm9yXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0KFxuICBjYXRlZ29yeT86IHN5bWJvbCB8IHN0cmluZyB8IENvbnN0cnVjdG9yIHwgUGFydGlhbDxJbmplY3RPcHRpb25zPixcbiAgY2ZnPzogUGFydGlhbDxJbmplY3RPcHRpb25zPlxuKSB7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihJbmplY3RhYmxlc0tleXMuSU5KRUNUKVxuICAgIC5kZWZpbmUoeyBkZWNvcmF0b3I6IGluamVjdEJhc2VEZWNvcmF0b3IsIGFyZ3M6IFtjYXRlZ29yeSwgY2ZnXSB9KVxuICAgIC5hcHBseSgpO1xufVxuIl19
|
|
236
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBb0JBLDBEQXlEQztBQStHRCxnQ0FPQztBQVdELDhCQVFDO0FBV0QsNEJBUUM7QUE0QkQsa0RBcUVDO0FBa0hELHdCQU9DO0FBbmNELCtDQUF3RTtBQUN4RSxtREFBNEM7QUFDNUMsdUNBQXVDO0FBRXZDLHFEQUFrRTtBQWdCbEUsU0FBZ0IsdUJBQXVCLENBQ3JDLFFBQTJELEVBQzNELEdBQStCO0lBRS9CLEdBQUc7UUFDRCxHQUFHO1lBQ0gsQ0FBQyxPQUFPLFFBQVEsS0FBSyxRQUFRO2dCQUMzQixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUE0QixFQUFFLG9DQUF3QixDQUFDO2dCQUN2RSxDQUFDLENBQUMsb0NBQXdCLENBQUMsQ0FBQztJQUNoQyxRQUFRO1FBQ04sT0FBTyxRQUFRLEtBQUssUUFBUTtZQUMxQixDQUFDLENBQUMsU0FBUztZQUNYLENBQUMsQ0FBQyxPQUFPLFFBQVEsS0FBSyxRQUFRO2dCQUM1QixDQUFDLENBQUMsUUFBUTtnQkFDVixDQUFDLENBQUMsT0FBTyxRQUFRLEtBQUssVUFBVSxJQUFJLFFBQVEsQ0FBQyxJQUFJO29CQUMvQyxDQUFDLENBQUMsUUFBUTtvQkFDVixDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3BCLE9BQU8sU0FBUyx3QkFBd0IsQ0FBQyxRQUFhO1FBQ3BELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzNELFFBQVEsR0FBRyxRQUFRLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQztRQUVyQyxNQUFNLFFBQVEsR0FBdUI7WUFDbkMsS0FBSyxFQUFFLFFBQWtCO1lBQ3pCLE1BQU0sRUFBRSxNQUFNO1NBQ2YsQ0FBQztRQUVGLE9BQU8sQ0FBQyxjQUFjLENB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LElBQUksQ0FBQztvQ0FDSCxHQUFHLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0NBQ3hDLENBQUM7Z0NBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztvQ0FDWCxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUNuQixDQUFDOzRCQUNILE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDOzRCQUV0QixPQUFPLEdBQUcsQ0FBQzt3QkFDYixDQUFDO3FCQUNGLENBQUMsQ0FBQztvQkFDSCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDM0IsQ0FBQztZQUNILENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDLENBQUM7QUFDSixDQUFDO0FBdUREOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMERHO0FBQ0gsU0FBZ0IsTUFBTSxDQUNwQixRQUFpRSxFQUNqRSxHQUE0QjtJQUU1QixPQUFPLHVCQUFVLENBQUMsR0FBRyxDQUFDLDJCQUFlLENBQUMsTUFBTSxDQUFDO1NBQzFDLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztTQUNqRSxLQUFLLEVBQUUsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWcsIEluamVjdGFibGVzS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZXMgfSBmcm9tIFwiLi9JbmplY3RhYmxlc1wiO1xuaW1wb3J0IHsgZ2V0SW5qZWN0S2V5IH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IEluamVjdGFibGVNZXRhZGF0YSwgSW5zdGFuY2VDYWxsYmFjayB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWNvcmF0aW9uLCBNZXRhZGF0YSwgcHJvcCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBAaW5qZWN0YWJsZSBkZWNvcmF0b3IuXG4gKiBAc3VtbWFyeSBDb250cm9scyBsaWZlY3ljbGUgKHNpbmdsZXRvbiB2cyBvbi1kZW1hbmQpIGFuZCBhbiBvcHRpb25hbCBpbnN0YW5jZSB0cmFuc2Zvcm1hdGlvbiBjYWxsYmFjayBleGVjdXRlZCBwb3N0LWNvbnN0cnVjdGlvbi5cbiAqIEB0ZW1wbGF0ZSBUIFRoZSBpbnN0YW5jZSB0eXBlIGFmZmVjdGVkIGJ5IHRoZSBjYWxsYmFjayB3aGVuIHByb3ZpZGVkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBzaW5nbGV0b24gV2hlbiB0cnVlLCBhIHNpbmdsZSBpbnN0YW5jZSBpcyBzaGFyZWQgKHNpbmdsZXRvbikuIFdoZW4gZmFsc2UsIGluc3RhbmNlcyBhcmUgY3JlYXRlZCBvbiBkZW1hbmQuXG4gKiBAcHJvcGVydHkge0luc3RhbmNlQ2FsbGJhY2s8VD59IFtjYWxsYmFja10gT3B0aW9uYWwgaG9vayB0byB0cmFuc2Zvcm0gdGhlIGluc3RhbmNlIGFmdGVyIGl0IGlzIGNvbnN0cnVjdGVkLlxuICogQHR5cGVkZWYgSW5qZWN0YWJsZUNvbmZpZ1xuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgSW5qZWN0YWJsZUNvbmZpZyA9IHtcbiAgc2luZ2xldG9uOiBib29sZWFuO1xuICBjYWxsYmFjaz86IEluc3RhbmNlQ2FsbGJhY2s8YW55Pjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RhYmxlQmFzZURlY29yYXRvcihcbiAgY2F0ZWdvcnk/OiBzdHJpbmcgfCBDb25zdHJ1Y3RvciB8IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz4sXG4gIGNmZz86IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz5cbikge1xuICBjZmcgPVxuICAgIGNmZyB8fFxuICAgICh0eXBlb2YgY2F0ZWdvcnkgPT09IFwib2JqZWN0XCJcbiAgICAgID8gT2JqZWN0LmFzc2lnbihjYXRlZ29yeSBhcyBSZWNvcmQ8YW55LCBhbnk+LCBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWcpXG4gICAgICA6IERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZyk7XG4gIGNhdGVnb3J5ID1cbiAgICB0eXBlb2YgY2F0ZWdvcnkgPT09IFwib2JqZWN0XCJcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IHR5cGVvZiBjYXRlZ29yeSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGNhdGVnb3J5XG4gICAgICAgIDogdHlwZW9mIGNhdGVnb3J5ID09PSBcImZ1bmN0aW9uXCIgJiYgY2F0ZWdvcnkubmFtZVxuICAgICAgICAgID8gY2F0ZWdvcnlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluamVjdGFibGVJbm5lckRlY29yYXRvcihvcmlnaW5hbDogYW55KSB7XG4gICAgY29uc3Qgc3ltYm9sID0gU3ltYm9sLmZvcihjYXRlZ29yeSB8fCBvcmlnaW5hbC50b1N0cmluZygpKTtcbiAgICBjYXRlZ29yeSA9IGNhdGVnb3J5IHx8IG9yaWdpbmFsLm5hbWU7XG5cbiAgICBjb25zdCBtZXRhZGF0YTogSW5qZWN0YWJsZU1ldGFkYXRhID0ge1xuICAgICAgY2xhc3M6IGNhdGVnb3J5IGFzIHN0cmluZyxcbiAgICAgIHN5bWJvbDogc3ltYm9sLFxuICAgIH07XG5cbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgZ2V0SW5qZWN0S2V5KEluamVjdGFibGVzS2V5cy5JTkpFQ1RBQkxFKSxcbiAgICAgIG1ldGFkYXRhLFxuICAgICAgb3JpZ2luYWxcbiAgICApO1xuICAgIC8vIHRoZSBuZXcgY29uc3RydWN0b3IgYmVoYXZpb3VyXG4gICAgY29uc3QgbmV3Q29uc3RydWN0b3I6IGFueSA9IGZ1bmN0aW9uICguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgcmV0dXJuIEluamVjdGFibGVzLmdldDxhbnk+KHN5bWJvbCwgLi4uYXJncyk7XG4gICAgfTtcblxuICAgIC8vIGNvcHkgcHJvdG90eXBlIHNvIGluc3RhbmNlb2Ygb3BlcmF0b3Igc3RpbGwgd29ya3NcbiAgICBuZXdDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBvcmlnaW5hbC5wcm90b3R5cGU7XG4gICAgLy8gbmV3Q29uc3RydWN0b3IuX19wcm90b19fID0gb3JpZ2luYWwuX19wcm90b19fO1xuICAgIC8vIFNldHMgdGhlIHByb3BlciBjb25zdHJ1Y3RvciBuYW1lIGZvciB0eXBlIHZlcmlmaWNhdGlvblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdDb25zdHJ1Y3RvciwgXCJuYW1lXCIsIHtcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IG9yaWdpbmFsLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgIH0pO1xuXG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgIGdldEluamVjdEtleShJbmplY3RhYmxlc0tleXMuSU5KRUNUQUJMRSksXG4gICAgICBtZXRhZGF0YSxcbiAgICAgIG5ld0NvbnN0cnVjdG9yXG4gICAgKTtcblxuICAgIEluamVjdGFibGVzLnJlZ2lzdGVyKG9yaWdpbmFsLCBzeW1ib2wsIGNmZyk7XG4gICAgLy8gcmV0dXJuIG5ldyBjb25zdHJ1Y3RvciAod2lsbCBvdmVycmlkZSBvcmlnaW5hbClcbiAgICByZXR1cm4gbmV3Q29uc3RydWN0b3I7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyaWMgY29uc3RydWN0b3IgdHlwZSBmb3IgY2xhc3MtbGlrZSB2YWx1ZXMuXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGFueSBjbGFzcyB0aGF0IGNhbiBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhcmJpdHJhcnkgYXJndW1lbnRzLCBwcm9kdWNpbmcgYW4gaW5zdGFuY2Ugb2YgdHlwZSBULlxuICogQHRlbXBsYXRlIFQgVGhlIGluc3RhbmNlIHR5cGUgY3JlYXRlZCBieSB0aGUgY29uc3RydWN0b3IuXG4gKiBAdHlwZWRlZiBDb25zdHJ1Y3RvclxuICogQGV4YW1wbGVcbiAqIC8vIFVzaW5nIENvbnN0cnVjdG9yIHRvIHR5cGUgYSBmYWN0b3J5XG4gKiBmdW5jdGlvbiBtYWtlPFQ+KEN0b3I6IENvbnN0cnVjdG9yPFQ+LCAuLi5hcmdzOiBhbnlbXSk6IFQge1xuICogICByZXR1cm4gbmV3IEN0b3IoLi4uYXJncyk7XG4gKiB9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBDb25zdHJ1Y3RvcjxUID0gYW55PiA9IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IFQgfTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2UuXG4gKlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55KTogYW55fSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgdGhlIGNsYXNzIGludG8gYW4gaW5qZWN0YWJsZS5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0YWJsZSgpOiAob3JpZ2luYWw6IGFueSkgPT4gYW55O1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBDb25zdHJ1Y3Rvcn0gY2F0ZWdvcnkgRGVmYXVsdHMgdG8gdGhlIGNsYXNzIGNhdGVnb3J5LiBVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2NjdXJzIGFuZCBuYW1lcyBhcmUgY2hhbmdlZCxcbiAqIG9yIHdoZW4geW91IHdhbnQgdG8gdXBjYXN0IHRoZSBvYmplY3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAqXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnkpOiBhbnl9IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyB0aGUgY2xhc3MgaW50byBhbiBpbmplY3RhYmxlLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RhYmxlKFxuICBjYXRlZ29yeTogc3RyaW5nIHwgQ29uc3RydWN0b3Jcbik6IChvcmlnaW5hbDogYW55KSA9PiBhbnk7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIGNsYXNzIGFzIGF2YWlsYWJsZSBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgY2xhc3MgYXMgYW4gaW5qZWN0YWJsZSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVnaXN0cnkuXG4gKiBXaGVuIGFwcGxpZWQgdG8gYSBjbGFzcywgcmVwbGFjZXMgaXRzIGNvbnN0cnVjdG9yIHdpdGggb25lIHRoYXQgcmV0dXJucyBhbiBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0ge1BhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz59IGNmZz1EZWZhdWx0SW5qZWN0YWJsZUNvbmZpZyBBbGxvd3Mgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCBzaW5nbGV0b24gYmVoYXZpb3IgYW5kIGFkZGluZyBhIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSBjbGFzcyBpbnRvIGFuIGluamVjdGFibGUuXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdGFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdGFibGUoXG4gIGNmZzogUGFydGlhbDxJbmplY3RhYmxlQ29uZmlnPlxuKTogKG9yaWdpbmFsOiBhbnkpID0+IGFueTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIGNhdGVnb3J5IERlZmF1bHRzIHRvIHRoZSBjbGFzcyBjYXRlZ29yeS4gVXNlZnVsIHdoZW4gbWluaWZpY2F0aW9uIG9jY3VycyBhbmQgbmFtZXMgYXJlIGNoYW5nZWQsXG4gKiBvciB3aGVuIHlvdSB3YW50IHRvIHVwY2FzdCB0aGUgb2JqZWN0IHRvIGEgZGlmZmVyZW50IHR5cGUuXG4gKiBAcGFyYW0ge1BhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz59IGNmZz1EZWZhdWx0SW5qZWN0YWJsZUNvbmZpZyBBbGxvd3Mgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCBzaW5nbGV0b24gYmVoYXZpb3IgYW5kIGFkZGluZyBhIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSBjbGFzcyBpbnRvIGFuIGluamVjdGFibGUuXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdGFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdGFibGUoXG4gIGNhdGVnb3J5OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgY2ZnOiBQYXJ0aWFsPEluamVjdGFibGVDb25maWc+XG4pOiAob3JpZ2luYWw6IGFueSkgPT4gYW55O1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBDb25zdHJ1Y3Rvcn0gW2NhdGVnb3J5XSBEZWZhdWx0cyB0byB0aGUgY2xhc3MgY2F0ZWdvcnkuIFVzZWZ1bCB3aGVuIG1pbmlmaWNhdGlvbiBvY2N1cnMgYW5kIG5hbWVzIGFyZSBjaGFuZ2VkLFxuICogb3Igd2hlbiB5b3Ugd2FudCB0byB1cGNhc3QgdGhlIG9iamVjdCB0byBhIGRpZmZlcmVudCB0eXBlLlxuICogQHBhcmFtIHtQYXJ0aWFsPEluamVjdGFibGVDb25maWc+fSBbY2ZnPURlZmF1bHRJbmplY3RhYmxlQ29uZmlnXSBBbGxvd3Mgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCBzaW5nbGV0b24gYmVoYXZpb3IgYW5kIGFkZGluZyBhIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSBjbGFzcyBpbnRvIGFuIGluamVjdGFibGUuXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdGFibGVcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRGVjb3JhdG9yXG4gKiAgIHBhcnRpY2lwYW50IEluamVjdGFibGVzXG4gKlxuICogICBDbGllbnQtPj5EZWNvcmF0b3I6IEBpbmplY3RhYmxlKClcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBDcmVhdGUgbmV3IGNvbnN0cnVjdG9yXG4gKlxuICogICBOb3RlIG92ZXIgRGVjb3JhdG9yOiBXaGVuIG5ldyBpbnN0YW5jZSByZXF1ZXN0ZWRcbiAqICAgRGVjb3JhdG9yLT4+SW5qZWN0YWJsZXM6IGdldChjYXRlZ29yeSlcbiAqICAgYWx0IEluc3RhbmNlIGV4aXN0c1xuICogICAgIEluamVjdGFibGVzLS0+PkRlY29yYXRvcjogUmV0dXJuIGV4aXN0aW5nIGluc3RhbmNlXG4gKiAgIGVsc2UgTm8gaW5zdGFuY2VcbiAqICAgICBEZWNvcmF0b3ItPj5JbmplY3RhYmxlczogcmVnaXN0ZXIob3JpZ2luYWwsIGNhdGVnb3J5KVxuICogICAgIERlY29yYXRvci0+PkluamVjdGFibGVzOiBnZXQoY2F0ZWdvcnkpXG4gKiAgICAgSW5qZWN0YWJsZXMtLT4+RGVjb3JhdG9yOiBSZXR1cm4gbmV3IGluc3RhbmNlXG4gKiAgICAgb3B0IEhhcyBjYWxsYmFja1xuICogICAgICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBDYWxsIGluc3RhbmNlQ2FsbGJhY2tcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogRGVmaW5lIG1ldGFkYXRhXG4gKiAgIERlY29yYXRvci0tPj5DbGllbnQ6IFJldHVybiBpbnN0YW5jZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0YWJsZShcbiAgY2F0ZWdvcnk/OiBzdHJpbmcgfCBDb25zdHJ1Y3RvciB8IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz4sXG4gIGNmZz86IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz5cbikge1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoSW5qZWN0YWJsZXNLZXlzLklOSkVDVEFCTEUpXG4gICAgLmRlZmluZSh7IGRlY29yYXRvcjogaW5qZWN0YWJsZUJhc2VEZWNvcmF0b3IsIGFyZ3M6IFtjYXRlZ29yeSwgY2ZnXSB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb252ZW5pZW5jZSBkZWNvcmF0b3IgdG8gcmVnaXN0ZXIgYW4gaW5qZWN0YWJsZSBhcyBhIHNpbmdsZXRvbi5cbiAqIEBzdW1tYXJ5IFdyYXBzIHtAbGluayBpbmplY3RhYmxlfSBmb3JjaW5nIHRoZSBzaW5nbGV0b24gbGlmZWN5Y2xlIHNvIG9ubHkgb25lIGluc3RhbmNlIGlzIGNyZWF0ZWQgYW5kIHJldXNlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfENvbnN0cnVjdG9yfSBbY2F0ZWdvcnldIE9wdGlvbmFsIGV4cGxpY2l0IGNhdGVnb3J5L3N5bWJvbCBzb3VyY2U7IGRlZmF1bHRzIHRvIHRoZSBjbGFzcy5cbiAqIEBwYXJhbSB7T21pdDxJbmplY3RhYmxlQ29uZmlnLCBcInNpbmdsZXRvblwiPn0gW2NmZ10gQWRkaXRpb25hbCBpbmplY3RhYmxlIGNvbmZpZ3VyYXRpb24gZXhjbHVkaW5nIHRoZSBzaW5nbGV0b24gZmxhZy5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBjbGFzcyBkZWNvcmF0b3IgdGhhdCByZWdpc3RlcnMgdGhlIHRhcmdldCBhcyBhIHNpbmdsZXRvbiBpbmplY3RhYmxlLlxuICogQGZ1bmN0aW9uIHNpbmdsZXRvblxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpbmdsZXRvbihcbiAgY2F0ZWdvcnk/OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgY2ZnPzogT21pdDxJbmplY3RhYmxlQ29uZmlnLCBcInNpbmdsZXRvblwiPlxuKSB7XG4gIHJldHVybiBpbmplY3RhYmxlKFxuICAgIGNhdGVnb3J5IGFzIGFueSxcbiAgICBPYmplY3QuYXNzaWduKHt9LCBjZmcgfHwge30sIHsgc2luZ2xldG9uOiB0cnVlIH0pXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlbmllbmNlIGRlY29yYXRvciB0byByZWdpc3RlciBhbiBpbmplY3RhYmxlIGFzIG9uLWRlbWFuZCAobm9uLXNpbmdsZXRvbikuXG4gKiBAc3VtbWFyeSBXcmFwcyB7QGxpbmsgaW5qZWN0YWJsZX0gZm9yY2luZyBuZXcgaW5zdGFuY2VzIHRvIGJlIGNyZWF0ZWQgb24gZXZlcnkgaW5qZWN0aW9uIG9yIHJldHJpZXZhbC5cbiAqIEBwYXJhbSB7c3RyaW5nfENvbnN0cnVjdG9yfSBbY2F0ZWdvcnldIE9wdGlvbmFsIGV4cGxpY2l0IGNhdGVnb3J5L3N5bWJvbCBzb3VyY2U7IGRlZmF1bHRzIHRvIHRoZSBjbGFzcy5cbiAqIEBwYXJhbSB7T21pdDxJbmplY3RhYmxlQ29uZmlnLCBcInNpbmdsZXRvblwiPn0gW2NmZ10gQWRkaXRpb25hbCBpbmplY3RhYmxlIGNvbmZpZ3VyYXRpb24gZXhjbHVkaW5nIHRoZSBzaW5nbGV0b24gZmxhZy5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBjbGFzcyBkZWNvcmF0b3IgdGhhdCByZWdpc3RlcnMgdGhlIHRhcmdldCBhcyBhIG5vbi1zaW5nbGV0b24gaW5qZWN0YWJsZS5cbiAqIEBmdW5jdGlvbiBvbkRlbWFuZFxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uRGVtYW5kKFxuICBjYXRlZ29yeT86IHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICBjZmc/OiBPbWl0PEluamVjdGFibGVDb25maWcsIFwic2luZ2xldG9uXCI+XG4pIHtcbiAgcmV0dXJuIGluamVjdGFibGUoXG4gICAgY2F0ZWdvcnkgYXMgYW55LFxuICAgIE9iamVjdC5hc3NpZ24oe30sIGNmZyB8fCB7fSwgeyBzaW5nbGV0b246IGZhbHNlIH0pXG4gICk7XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiB0eXBlIGZvciB0cmFuc2Zvcm1pbmcgaW5qZWN0YWJsZSBpbnN0YW5jZXMgYmVmb3JlIHRoZXkncmUgaW5qZWN0ZWQuXG4gKiBAc3VtbWFyeSBGdW5jdGlvbiB3aGljaCB0cmFuc2Zvcm1zIGEgY2FjaGVkIHtAbGluayBpbmplY3RhYmxlfSBpbnN0YW5jZSBiZWZvcmUgaXQncyBpbmplY3RlZCBpbnRvIGEgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge2FueX0gaW5qZWN0YWJsZSBUaGUgaW5qZWN0YWJsZSBpbnN0YW5jZSB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7YW55fSBvYmogVGhlIG9iamVjdCB0aGUgaW5qZWN0YWJsZSB3aWxsIGJlIGluamVjdGVkIG9uXG4gKiBAcmV0dXJuIHthbnl9IFRoZSB0cmFuc2Zvcm1lZCBpbmplY3RhYmxlIGluc3RhbmNlXG4gKlxuICogQHR5cGVkZWYge0Z1bmN0aW9ufSBJbnN0YW5jZVRyYW5zZm9ybWVyXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFuY2VUcmFuc2Zvcm1lciA9IChpbmplY3RhYmxlOiBhbnksIG9iajogYW55KSA9PiBhbnk7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE9wdGlvbnMgZm9yIHRoZSBwcm9wZXJ0eS1sZXZlbCBAaW5qZWN0IGRlY29yYXRvci5cbiAqIEBzdW1tYXJ5IEFsbG93cyBzcGVjaWZ5aW5nIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBhbmQgYW4gb3B0aW9uYWwgdHJhbnNmb3JtZXIgdG8gYmUgYXBwbGllZCB0byB0aGUgcmVzb2x2ZWQgaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge2FueVtdfSBbYXJnc10gT3B0aW9uYWwgY29uc3RydWN0b3IgYXJndW1lbnRzIHRvIHVzZSB3aGVuIGJ1aWxkaW5nIHRoZSBpbmplY3RhYmxlIGluc3RhbmNlLlxuICogQHByb3BlcnR5IHtJbnN0YW5jZVRyYW5zZm9ybWVyfSBbdHJhbnNmb3JtZXJdIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgaW5zdGFuY2UgYmVmb3JlIGFzc2lnbm1lbnQuXG4gKiBAdHlwZWRlZiBJbmplY3RPcHRpb25zXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBJbmplY3RPcHRpb25zID0ge1xuICBhcmdzPzogYW55W107XG4gIHRyYW5zZm9ybWVyPzogSW5zdGFuY2VUcmFuc2Zvcm1lcjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RCYXNlRGVjb3JhdG9yKFxuICBjYXRlZ29yeT86IHN5bWJvbCB8IHN0cmluZyB8IENvbnN0cnVjdG9yIHwgUGFydGlhbDxJbmplY3RPcHRpb25zPixcbiAgY2ZnPzogUGFydGlhbDxJbmplY3RPcHRpb25zPlxuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpbmplY3RJbm5lckRlY29yYXRvcih0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpIHtcbiAgICBjb25zdCBjb25maWc6IEluamVjdE9wdGlvbnMgPSAoXG4gICAgICBjZmcgfHwgdHlwZW9mIGNhdGVnb3J5ID09PSBcIm9iamVjdFwiID8gY2F0ZWdvcnkgOiB7fVxuICAgICkgYXMgSW5qZWN0T3B0aW9ucztcblxuICAgIGlmIChwcm9wZXJ0eUtleSkge1xuICAgICAgcHJvcCgpKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIH1cblxuICAgIGNvbnN0IG5hbWU6IHN5bWJvbCB8IHN0cmluZyB8IENvbnN0cnVjdG9yIHwgdW5kZWZpbmVkID1cbiAgICAgICh0eXBlb2YgY2F0ZWdvcnkgIT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgKGNhdGVnb3J5IGFzIHN5bWJvbCB8IHN0cmluZyB8IENvbnN0cnVjdG9yKSkgfHxcbiAgICAgIE1ldGFkYXRhLnR5cGUodGFyZ2V0LmNvbnN0cnVjdG9yLCBwcm9wZXJ0eUtleSk7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgVHlwZSBmcm9tIGRlY29yYXRvcmApO1xuICAgIH1cblxuICAgIC8vIHByb3AoKSh0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgZ2V0SW5qZWN0S2V5KEluamVjdGFibGVzS2V5cy5JTkpFQ1QpLFxuICAgICAge1xuICAgICAgICBpbmplY3RhYmxlOiBuYW1lLFxuICAgICAgfSxcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcblxuICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0KHRoaXM6IGFueSkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBwcm9wZXJ0eUtleVxuICAgICAgICApIGFzIFByb3BlcnR5RGVzY3JpcHRvcjtcbiAgICAgICAgaWYgKGRlc2NyaXB0b3IuY29uZmlndXJhYmxlKSB7XG4gICAgICAgICAgLy8gbGV0IC9vYmo6IGFueTtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0KHRoaXM6IGFueSkge1xuICAgICAgICAgICAgICBsZXQgb2JqID0gdmFsdWVzLmdldCh0aGlzKTtcbiAgICAgICAgICAgICAgaWYgKG9iaikgcmV0dXJuIG9iajtcbiAgICAgICAgICAgICAgb2JqID0gSW5qZWN0YWJsZXMuZ2V0KG5hbWUsIC4uLihjb25maWcuYXJncyB8fCBbXSkpO1xuICAgICAgICAgICAgICBpZiAoIW9iailcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgQ291bGQgbm90IGdldCBJbmplY3RhYmxlICR7bmFtZS50b1N0cmluZygpfSB0byBpbmplY3QgaW4gJHt0YXJnZXQuY29uc3RydWN0b3IgPyB0YXJnZXQuY29uc3RydWN0b3IubmFtZSA6IHRhcmdldC5uYW1lfSdzICR7cHJvcGVydHlLZXl9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChjb25maWcudHJhbnNmb3JtZXIpXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIG9iaiA9IGNvbmZpZy50cmFuc2Zvcm1lcihvYmosIHRhcmdldCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhbHVlcy5zZXQodGhpcywgb2JqKTtcblxuICAgICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdGhpc1twcm9wZXJ0eUtleV07XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByb3BlcnR5IGRlY29yYXRvciB0aGF0IGluamVjdHMgYSBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIEBzdW1tYXJ5IEFsbG93cyBmb3IgdGhlIGluamVjdGlvbiBvZiBhbiB7QGxpbmsgaW5qZWN0YWJsZX0gZGVjb3JhdGVkIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogVGhlIHByb3BlcnR5IG11c3QgYmUgdHlwZWQgZm9yIHRoZSByZXF1ZXN0ZWQgZGVwZW5kZW5jeS4gT25seSBjb25jcmV0ZSBjbGFzc2VzIGFyZSBzdXBwb3J0ZWQ7IGdlbmVyaWNzIGFyZSBub3QuXG4gKlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnkpOiB2b2lkfSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdCgpOiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBhbnkpID0+IHZvaWQ7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGEgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBAc3VtbWFyeSBBbGxvd3MgZm9yIHRoZSBpbmplY3Rpb24gb2YgYW4ge0BsaW5rIGluamVjdGFibGV9IGRlY29yYXRlZCBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIFRoZSBwcm9wZXJ0eSBtdXN0IGJlIHR5cGVkIGZvciB0aGUgcmVxdWVzdGVkIGRlcGVuZGVuY3kuIE9ubHkgY29uY3JldGUgY2xhc3NlcyBhcmUgc3VwcG9ydGVkOyBnZW5lcmljcyBhcmUgbm90LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjYXRlZ29yeSBEZWZhdWx0cyB0byB0aGUgY2xhc3MgbmFtZSBkZXJpdmVkIGZyb20gdGhlIHByb3BlcnR5IHR5cGUuIFVzZWZ1bCB3aGVuIG1pbmlmaWNhdGlvbiBvY2N1cnNcbiAqIGFuZCBuYW1lcyBhcmUgY2hhbmdlZCwgb3Igd2hlbiB5b3Ugd2FudCB0byB1cGNhc3QgdGhlIG9iamVjdCB0byBhIGRpZmZlcmVudCB0eXBlLlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnkpOiB2b2lkfSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdChcbiAgY2F0ZWdvcnk6IHN0cmluZyB8IENvbnN0cnVjdG9yXG4pOiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBhbnkpID0+IHZvaWQ7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGEgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBAc3VtbWFyeSBBbGxvd3MgZm9yIHRoZSBpbmplY3Rpb24gb2YgYW4ge0BsaW5rIGluamVjdGFibGV9IGRlY29yYXRlZCBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIFRoZSBwcm9wZXJ0eSBtdXN0IGJlIHR5cGVkIGZvciB0aGUgcmVxdWVzdGVkIGRlcGVuZGVuY3kuIE9ubHkgY29uY3JldGUgY2xhc3NlcyBhcmUgc3VwcG9ydGVkOyBnZW5lcmljcyBhcmUgbm90LlxuICpcbiAqIEBwYXJhbSB7UGFydGlhbDxJbmplY3RPcHRpb25zPn0gW2NmZz17fV0gT3B0aW9uYWwgZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHRoZSBpbmplY3RhYmxlIGluc3RhbmNlIGJlZm9yZSBpdCdzIGluamVjdGVkLCBvciBhcmd1bWVudHMgdG8gcGFzcyB0aGUgY29uc3RydWN0b3Igd2hlbiBpbmplY3Rpbmcgb25EZW1hbmRcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSwgYW55KTogdm9pZH0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3QoXG4gIGNmZzogUGFydGlhbDxJbmplY3RPcHRpb25zPlxuKTogKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogYW55KSA9PiB2b2lkO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogQHN1bW1hcnkgQWxsb3dzIGZvciB0aGUgaW5qZWN0aW9uIG9mIGFuIHtAbGluayBpbmplY3RhYmxlfSBkZWNvcmF0ZWQgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBUaGUgcHJvcGVydHkgbXVzdCBiZSB0eXBlZCBmb3IgdGhlIHJlcXVlc3RlZCBkZXBlbmRlbmN5LiBPbmx5IGNvbmNyZXRlIGNsYXNzZXMgYXJlIHN1cHBvcnRlZDsgZ2VuZXJpY3MgYXJlIG5vdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2F0ZWdvcnkgRGVmYXVsdHMgdG8gdGhlIGNsYXNzIG5hbWUgZGVyaXZlZCBmcm9tIHRoZSBwcm9wZXJ0eSB0eXBlLiBVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2NjdXJzXG4gKiBhbmQgbmFtZXMgYXJlIGNoYW5nZWQsIG9yIHdoZW4geW91IHdhbnQgdG8gdXBjYXN0IHRoZSBvYmplY3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAqIEBwYXJhbSB7UGFydGlhbDxJbmplY3RPcHRpb25zPn0gY2ZnPXt9IE9wdGlvbmFsIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgaW5qZWN0YWJsZSBpbnN0YW5jZSBiZWZvcmUgaXQncyBpbmplY3RlZCwgb3IgYXJndW1lbnRzIHRvIHBhc3MgdGhlIGNvbnN0cnVjdG9yIHdoZW4gaW5qZWN0aW5nIG9uRGVtYW5kXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueSk6IHZvaWR9IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0KFxuICBjYXRlZ29yeTogc3RyaW5nIHwgQ29uc3RydWN0b3IsXG4gIGNmZzogUGFydGlhbDxJbmplY3RPcHRpb25zPlxuKTogKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogYW55KSA9PiB2b2lkO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogQHN1bW1hcnkgQWxsb3dzIGZvciB0aGUgaW5qZWN0aW9uIG9mIGFuIHtAbGluayBpbmplY3RhYmxlfSBkZWNvcmF0ZWQgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBUaGUgcHJvcGVydHkgbXVzdCBiZSB0eXBlZCBmb3IgdGhlIHJlcXVlc3RlZCBkZXBlbmRlbmN5LiBPbmx5IGNvbmNyZXRlIGNsYXNzZXMgYXJlIHN1cHBvcnRlZDsgZ2VuZXJpY3MgYXJlIG5vdC5cbiAqXG4gKiBJbmplY3RlZCBwcm9wZXJ0aWVzIHNob3VsZCBiZSBkZXNjcmliZWQgbGlrZSBzbzpcbiAqIDxwcmU+XG4gKiAgICAgY2xhc3MgQ2xhc3NOYW1lIHtcbiAqICAgICAgICAgLi4uXG4gKlxuICogICAgICAgICBAaW5qZWN0KClcbiAqICAgICAgICAgcHJvcGVydHlOYW1lITogSW5qZWN0YWJsZUNsYXNzO1xuICpcbiAqICAgICAgICAgLi4uXG4gKiAgICAgfVxuICogPC9wcmU+XG4gKlxuICogd2hlcmUgSW5qZWN0YWJsZUNsYXNzIGlzIHRoZSBjbGFzcyB5b3Ugd2FudCB0byBpbmplY3QuXG4gKiBOb3RpY2UgdGhlIHVzZSBvZiAnITonIHRvIGVuc3VyZSB0aGUgdHJhbnNwaWxlciB0aGUgcHJvcGVydHkgd2lsbCBiZSBzZXQgb3V0c2lkZSB0aGUgY29uc3RydWN0b3IgYnV0IHdpbGwgYWx3YXlzIGJlIGRlZmluZWQuXG4gKiBGb3IgcHJvamVjdHMgd2hlcmUgbWluaWZpY2F0aW9uIG9jY3VycywgeW91IHNob3VsZCB1c2UgdGhlIGNhdGVnb3J5IHBhcmFtIHRvIGVuc3VyZSB0aGUgbmFtZSBpcyB0aGUgc2FtZSB0aHJvdWdob3V0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbY2F0ZWdvcnldIERlZmF1bHRzIHRvIHRoZSBjbGFzcyBuYW1lIGRlcml2ZWQgZnJvbSB0aGUgcHJvcGVydHkgdHlwZS4gVXNlZnVsIHdoZW4gbWluaWZpY2F0aW9uIG9jY3Vyc1xuICogYW5kIG5hbWVzIGFyZSBjaGFuZ2VkLCBvciB3aGVuIHlvdSB3YW50IHRvIHVwY2FzdCB0aGUgb2JqZWN0IHRvIGEgZGlmZmVyZW50IHR5cGUuXG4gKiBAcGFyYW0ge1BhcnRpYWw8SW5qZWN0T3B0aW9ucz59IFtjZmc9e31dIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgaW5qZWN0YWJsZSBpbnN0YW5jZSBiZWZvcmUgaXQncyBpbmplY3RlZCwgb3IgYXJndW1lbnRzIHRvIHBhc3MgdGhlIGNvbnN0cnVjdG9yIHdoZW4gaW5qZWN0aW5nIG9uRGVtYW5kXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueSk6IHZvaWR9IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBEZWNvcmF0b3JcbiAqICAgcGFydGljaXBhbnQgSW5qZWN0YWJsZXNcbiAqXG4gKiAgIENsaWVudC0+PkRlY29yYXRvcjogQGluamVjdCgpXG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogR2V0IHR5cGUgZnJvbSBwcm9wZXJ0eVxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IERlZmluZSBtZXRhZGF0YVxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IERlZmluZSBwcm9wZXJ0eSBnZXR0ZXJcbiAqXG4gKiAgIE5vdGUgb3ZlciBEZWNvcmF0b3I6IFdoZW4gcHJvcGVydHkgYWNjZXNzZWRcbiAqICAgQ2xpZW50LT4+RGVjb3JhdG9yOiBhY2Nlc3MgcHJvcGVydHlcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBDaGVjayBpZiBpbnN0YW5jZSBleGlzdHNcbiAqICAgYWx0IEluc3RhbmNlIGV4aXN0cyBpbiBXZWFrTWFwXG4gKiAgICAgRGVjb3JhdG9yLS0+PkNsaWVudDogUmV0dXJuIGNhY2hlZCBpbnN0YW5jZVxuICogICBlbHNlIE5vIGluc3RhbmNlXG4gKiAgICAgRGVjb3JhdG9yLT4+SW5qZWN0YWJsZXM6IGdldChuYW1lKVxuICogICAgIGFsdCBJbmplY3RhYmxlIGZvdW5kXG4gKiAgICAgICBJbmplY3RhYmxlcy0tPj5EZWNvcmF0b3I6IFJldHVybiBpbmplY3RhYmxlIGluc3RhbmNlXG4gKiAgICAgICBvcHQgSGFzIHRyYW5zZm9ybWVyXG4gKiAgICAgICAgIERlY29yYXRvci0+PkRlY29yYXRvcjogQ2FsbCB0cmFuc2Zvcm1lclxuICogICAgICAgZW5kXG4gKiAgICAgICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IFN0b3JlIGluIFdlYWtNYXBcbiAqICAgICAgIERlY29yYXRvci0tPj5DbGllbnQ6IFJldHVybiBpbnN0YW5jZVxuICogICAgIGVsc2UgTm8gaW5qZWN0YWJsZVxuICogICAgICAgRGVjb3JhdG9yLS0+PkNsaWVudDogVGhyb3cgZXJyb3JcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3QoXG4gIGNhdGVnb3J5Pzogc3ltYm9sIHwgc3RyaW5nIHwgQ29uc3RydWN0b3IgfCBQYXJ0aWFsPEluamVjdE9wdGlvbnM+LFxuICBjZmc/OiBQYXJ0aWFsPEluamVjdE9wdGlvbnM+XG4pIHtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEluamVjdGFibGVzS2V5cy5JTkpFQ1QpXG4gICAgLmRlZmluZSh7IGRlY29yYXRvcjogaW5qZWN0QmFzZURlY29yYXRvciwgYXJnczogW2NhdGVnb3J5LCBjZmddIH0pXG4gICAgLmFwcGx5KCk7XG59XG4iXX0=
|
package/lib/esm/decorators.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { DefaultInjectablesConfig, InjectablesKeys } from "./constants.js";
|
|
2
2
|
import { Injectables } from "./Injectables.js";
|
|
3
|
-
import { getInjectKey
|
|
4
|
-
import { Decoration } from "@decaf-ts/decoration";
|
|
3
|
+
import { getInjectKey } from "./utils.js";
|
|
4
|
+
import { Decoration, Metadata, prop } from "@decaf-ts/decoration";
|
|
5
5
|
export function injectableBaseDecorator(category, cfg) {
|
|
6
6
|
cfg =
|
|
7
7
|
cfg ||
|
|
@@ -114,9 +114,12 @@ export function onDemand(category, cfg) {
|
|
|
114
114
|
export function injectBaseDecorator(category, cfg) {
|
|
115
115
|
return function injectInnerDecorator(target, propertyKey) {
|
|
116
116
|
const config = (cfg || typeof category === "object" ? category : {});
|
|
117
|
+
if (propertyKey) {
|
|
118
|
+
prop()(target, propertyKey);
|
|
119
|
+
}
|
|
117
120
|
const name = (typeof category !== "object" &&
|
|
118
121
|
category) ||
|
|
119
|
-
|
|
122
|
+
Metadata.type(target.constructor, propertyKey);
|
|
120
123
|
if (!name) {
|
|
121
124
|
throw new Error(`Could not get Type from decorator`);
|
|
122
125
|
}
|
|
@@ -222,4 +225,4 @@ export function inject(category, cfg) {
|
|
|
222
225
|
.define({ decorator: injectBaseDecorator, args: [category, cfg] })
|
|
223
226
|
.apply();
|
|
224
227
|
}
|
|
225
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxlQUFlLEVBQUUsdUJBQW9CO0FBQ3hFLE9BQU8sRUFBRSxXQUFXLEVBQUUseUJBQXNCO0FBQzVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsbUJBQWdCO0FBRTdELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQWdCbEQsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxRQUEyRCxFQUMzRCxHQUErQjtJQUUvQixHQUFHO1FBQ0QsR0FBRztZQUNILENBQUMsT0FBTyxRQUFRLEtBQUssUUFBUTtnQkFDM0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBNEIsRUFBRSx3QkFBd0IsQ0FBQztnQkFDdkUsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDaEMsUUFBUTtRQUNOLE9BQU8sUUFBUSxLQUFLLFFBQVE7WUFDMUIsQ0FBQyxDQUFDLFNBQVM7WUFDWCxDQUFDLENBQUMsT0FBTyxRQUFRLEtBQUssUUFBUTtnQkFDNUIsQ0FBQyxDQUFDLFFBQVE7Z0JBQ1YsQ0FBQyxDQUFDLE9BQU8sUUFBUSxLQUFLLFVBQVUsSUFBSSxRQUFRLENBQUMsSUFBSTtvQkFDL0MsQ0FBQyxDQUFDLFFBQVE7b0JBQ1YsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNwQixPQUFPLFNBQVMsd0JBQXdCLENBQUMsUUFBYTtRQUNwRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUMzRCxRQUFRLEdBQUcsUUFBUSxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUM7UUFFckMsTUFBTSxRQUFRLEdBQXVCO1lBQ25DLEtBQUssRUFBRSxRQUFrQjtZQUN6QixN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O2dDQUN4QyxDQUFDO2dDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0NBQ1gsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FDbkIsQ0FBQzs0QkFDSCxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQzs0QkFFdEIsT0FBTyxHQUFHLENBQUM7d0JBQ2IsQ0FBQztxQkFDRixDQUFDLENBQUM7b0JBQ0gsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzNCLENBQUM7WUFDSCxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQXVERDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBERztBQUNILE1BQU0sVUFBVSxNQUFNLENBQ3BCLFFBQWlFLEVBQ2pFLEdBQTRCO0lBRTVCLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDO1NBQzFDLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztTQUNqRSxLQUFLLEVBQUUsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWcsIEluamVjdGFibGVzS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZXMgfSBmcm9tIFwiLi9JbmplY3RhYmxlc1wiO1xuaW1wb3J0IHsgZ2V0SW5qZWN0S2V5LCBnZXRUeXBlRnJvbURlY29yYXRvciB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlTWV0YWRhdGEsIEluc3RhbmNlQ2FsbGJhY2sgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgRGVjb3JhdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBAaW5qZWN0YWJsZSBkZWNvcmF0b3IuXG4gKiBAc3VtbWFyeSBDb250cm9scyBsaWZlY3ljbGUgKHNpbmdsZXRvbiB2cyBvbi1kZW1hbmQpIGFuZCBhbiBvcHRpb25hbCBpbnN0YW5jZSB0cmFuc2Zvcm1hdGlvbiBjYWxsYmFjayBleGVjdXRlZCBwb3N0LWNvbnN0cnVjdGlvbi5cbiAqIEB0ZW1wbGF0ZSBUIFRoZSBpbnN0YW5jZSB0eXBlIGFmZmVjdGVkIGJ5IHRoZSBjYWxsYmFjayB3aGVuIHByb3ZpZGVkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBzaW5nbGV0b24gV2hlbiB0cnVlLCBhIHNpbmdsZSBpbnN0YW5jZSBpcyBzaGFyZWQgKHNpbmdsZXRvbikuIFdoZW4gZmFsc2UsIGluc3RhbmNlcyBhcmUgY3JlYXRlZCBvbiBkZW1hbmQuXG4gKiBAcHJvcGVydHkge0luc3RhbmNlQ2FsbGJhY2s8VD59IFtjYWxsYmFja10gT3B0aW9uYWwgaG9vayB0byB0cmFuc2Zvcm0gdGhlIGluc3RhbmNlIGFmdGVyIGl0IGlzIGNvbnN0cnVjdGVkLlxuICogQHR5cGVkZWYgSW5qZWN0YWJsZUNvbmZpZ1xuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgSW5qZWN0YWJsZUNvbmZpZyA9IHtcbiAgc2luZ2xldG9uOiBib29sZWFuO1xuICBjYWxsYmFjaz86IEluc3RhbmNlQ2FsbGJhY2s8YW55Pjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RhYmxlQmFzZURlY29yYXRvcihcbiAgY2F0ZWdvcnk/OiBzdHJpbmcgfCBDb25zdHJ1Y3RvciB8IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz4sXG4gIGNmZz86IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz5cbikge1xuICBjZmcgPVxuICAgIGNmZyB8fFxuICAgICh0eXBlb2YgY2F0ZWdvcnkgPT09IFwib2JqZWN0XCJcbiAgICAgID8gT2JqZWN0LmFzc2lnbihjYXRlZ29yeSBhcyBSZWNvcmQ8YW55LCBhbnk+LCBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWcpXG4gICAgICA6IERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZyk7XG4gIGNhdGVnb3J5ID1cbiAgICB0eXBlb2YgY2F0ZWdvcnkgPT09IFwib2JqZWN0XCJcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IHR5cGVvZiBjYXRlZ29yeSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGNhdGVnb3J5XG4gICAgICAgIDogdHlwZW9mIGNhdGVnb3J5ID09PSBcImZ1bmN0aW9uXCIgJiYgY2F0ZWdvcnkubmFtZVxuICAgICAgICAgID8gY2F0ZWdvcnlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluamVjdGFibGVJbm5lckRlY29yYXRvcihvcmlnaW5hbDogYW55KSB7XG4gICAgY29uc3Qgc3ltYm9sID0gU3ltYm9sLmZvcihjYXRlZ29yeSB8fCBvcmlnaW5hbC50b1N0cmluZygpKTtcbiAgICBjYXRlZ29yeSA9IGNhdGVnb3J5IHx8IG9yaWdpbmFsLm5hbWU7XG5cbiAgICBjb25zdCBtZXRhZGF0YTogSW5qZWN0YWJsZU1ldGFkYXRhID0ge1xuICAgICAgY2xhc3M6IGNhdGVnb3J5IGFzIHN0cmluZyxcbiAgICAgIHN5bWJvbDogc3ltYm9sLFxuICAgIH07XG5cbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgZ2V0SW5qZWN0S2V5KEluamVjdGFibGVzS2V5cy5JTkpFQ1RBQkxFKSxcbiAgICAgIG1ldGFkYXRhLFxuICAgICAgb3JpZ2luYWxcbiAgICApO1xuICAgIC8vIHRoZSBuZXcgY29uc3RydWN0b3IgYmVoYXZpb3VyXG4gICAgY29uc3QgbmV3Q29uc3RydWN0b3I6IGFueSA9IGZ1bmN0aW9uICguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgcmV0dXJuIEluamVjdGFibGVzLmdldDxhbnk+KHN5bWJvbCwgLi4uYXJncyk7XG4gICAgfTtcblxuICAgIC8vIGNvcHkgcHJvdG90eXBlIHNvIGluc3RhbmNlb2Ygb3BlcmF0b3Igc3RpbGwgd29ya3NcbiAgICBuZXdDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBvcmlnaW5hbC5wcm90b3R5cGU7XG4gICAgLy8gbmV3Q29uc3RydWN0b3IuX19wcm90b19fID0gb3JpZ2luYWwuX19wcm90b19fO1xuICAgIC8vIFNldHMgdGhlIHByb3BlciBjb25zdHJ1Y3RvciBuYW1lIGZvciB0eXBlIHZlcmlmaWNhdGlvblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdDb25zdHJ1Y3RvciwgXCJuYW1lXCIsIHtcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IG9yaWdpbmFsLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgIH0pO1xuXG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgIGdldEluamVjdEtleShJbmplY3RhYmxlc0tleXMuSU5KRUNUQUJMRSksXG4gICAgICBtZXRhZGF0YSxcbiAgICAgIG5ld0NvbnN0cnVjdG9yXG4gICAgKTtcblxuICAgIEluamVjdGFibGVzLnJlZ2lzdGVyKG9yaWdpbmFsLCBzeW1ib2wsIGNmZyk7XG4gICAgLy8gcmV0dXJuIG5ldyBjb25zdHJ1Y3RvciAod2lsbCBvdmVycmlkZSBvcmlnaW5hbClcbiAgICByZXR1cm4gbmV3Q29uc3RydWN0b3I7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyaWMgY29uc3RydWN0b3IgdHlwZSBmb3IgY2xhc3MtbGlrZSB2YWx1ZXMuXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGFueSBjbGFzcyB0aGF0IGNhbiBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhcmJpdHJhcnkgYXJndW1lbnRzLCBwcm9kdWNpbmcgYW4gaW5zdGFuY2Ugb2YgdHlwZSBULlxuICogQHRlbXBsYXRlIFQgVGhlIGluc3RhbmNlIHR5cGUgY3JlYXRlZCBieSB0aGUgY29uc3RydWN0b3IuXG4gKiBAdHlwZWRlZiBDb25zdHJ1Y3RvclxuICogQGV4YW1wbGVcbiAqIC8vIFVzaW5nIENvbnN0cnVjdG9yIHRvIHR5cGUgYSBmYWN0b3J5XG4gKiBmdW5jdGlvbiBtYWtlPFQ+KEN0b3I6IENvbnN0cnVjdG9yPFQ+LCAuLi5hcmdzOiBhbnlbXSk6IFQge1xuICogICByZXR1cm4gbmV3IEN0b3IoLi4uYXJncyk7XG4gKiB9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBDb25zdHJ1Y3RvcjxUID0gYW55PiA9IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IFQgfTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2UuXG4gKlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55KTogYW55fSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgdGhlIGNsYXNzIGludG8gYW4gaW5qZWN0YWJsZS5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0YWJsZSgpOiAob3JpZ2luYWw6IGFueSkgPT4gYW55O1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBDb25zdHJ1Y3Rvcn0gY2F0ZWdvcnkgRGVmYXVsdHMgdG8gdGhlIGNsYXNzIGNhdGVnb3J5LiBVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2NjdXJzIGFuZCBuYW1lcyBhcmUgY2hhbmdlZCxcbiAqIG9yIHdoZW4geW91IHdhbnQgdG8gdXBjYXN0IHRoZSBvYmplY3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAqXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnkpOiBhbnl9IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyB0aGUgY2xhc3MgaW50byBhbiBpbmplY3RhYmxlLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RhYmxlKFxuICBjYXRlZ29yeTogc3RyaW5nIHwgQ29uc3RydWN0b3Jcbik6IChvcmlnaW5hbDogYW55KSA9PiBhbnk7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIGNsYXNzIGFzIGF2YWlsYWJsZSBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgY2xhc3MgYXMgYW4gaW5qZWN0YWJsZSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVnaXN0cnkuXG4gKiBXaGVuIGFwcGxpZWQgdG8gYSBjbGFzcywgcmVwbGFjZXMgaXRzIGNvbnN0cnVjdG9yIHdpdGggb25lIHRoYXQgcmV0dXJucyBhbiBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0ge1BhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz59IGNmZz1EZWZhdWx0SW5qZWN0YWJsZUNvbmZpZyBBbGxvd3Mgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCBzaW5nbGV0b24gYmVoYXZpb3IgYW5kIGFkZGluZyBhIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSBjbGFzcyBpbnRvIGFuIGluamVjdGFibGUuXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdGFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdGFibGUoXG4gIGNmZzogUGFydGlhbDxJbmplY3RhYmxlQ29uZmlnPlxuKTogKG9yaWdpbmFsOiBhbnkpID0+IGFueTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIGNhdGVnb3J5IERlZmF1bHRzIHRvIHRoZSBjbGFzcyBjYXRlZ29yeS4gVXNlZnVsIHdoZW4gbWluaWZpY2F0aW9uIG9jY3VycyBhbmQgbmFtZXMgYXJlIGNoYW5nZWQsXG4gKiBvciB3aGVuIHlvdSB3YW50IHRvIHVwY2FzdCB0aGUgb2JqZWN0IHRvIGEgZGlmZmVyZW50IHR5cGUuXG4gKiBAcGFyYW0ge1BhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz59IGNmZz1EZWZhdWx0SW5qZWN0YWJsZUNvbmZpZyBBbGxvd3Mgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCBzaW5nbGV0b24gYmVoYXZpb3IgYW5kIGFkZGluZyBhIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSBjbGFzcyBpbnRvIGFuIGluamVjdGFibGUuXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdGFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdGFibGUoXG4gIGNhdGVnb3J5OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgY2ZnOiBQYXJ0aWFsPEluamVjdGFibGVDb25maWc+XG4pOiAob3JpZ2luYWw6IGFueSkgPT4gYW55O1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBDb25zdHJ1Y3Rvcn0gW2NhdGVnb3J5XSBEZWZhdWx0cyB0byB0aGUgY2xhc3MgY2F0ZWdvcnkuIFVzZWZ1bCB3aGVuIG1pbmlmaWNhdGlvbiBvY2N1cnMgYW5kIG5hbWVzIGFyZSBjaGFuZ2VkLFxuICogb3Igd2hlbiB5b3Ugd2FudCB0byB1cGNhc3QgdGhlIG9iamVjdCB0byBhIGRpZmZlcmVudCB0eXBlLlxuICogQHBhcmFtIHtQYXJ0aWFsPEluamVjdGFibGVDb25maWc+fSBbY2ZnPURlZmF1bHRJbmplY3RhYmxlQ29uZmlnXSBBbGxvd3Mgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCBzaW5nbGV0b24gYmVoYXZpb3IgYW5kIGFkZGluZyBhIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSBjbGFzcyBpbnRvIGFuIGluamVjdGFibGUuXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdGFibGVcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRGVjb3JhdG9yXG4gKiAgIHBhcnRpY2lwYW50IEluamVjdGFibGVzXG4gKlxuICogICBDbGllbnQtPj5EZWNvcmF0b3I6IEBpbmplY3RhYmxlKClcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBDcmVhdGUgbmV3IGNvbnN0cnVjdG9yXG4gKlxuICogICBOb3RlIG92ZXIgRGVjb3JhdG9yOiBXaGVuIG5ldyBpbnN0YW5jZSByZXF1ZXN0ZWRcbiAqICAgRGVjb3JhdG9yLT4+SW5qZWN0YWJsZXM6IGdldChjYXRlZ29yeSlcbiAqICAgYWx0IEluc3RhbmNlIGV4aXN0c1xuICogICAgIEluamVjdGFibGVzLS0+PkRlY29yYXRvcjogUmV0dXJuIGV4aXN0aW5nIGluc3RhbmNlXG4gKiAgIGVsc2UgTm8gaW5zdGFuY2VcbiAqICAgICBEZWNvcmF0b3ItPj5JbmplY3RhYmxlczogcmVnaXN0ZXIob3JpZ2luYWwsIGNhdGVnb3J5KVxuICogICAgIERlY29yYXRvci0+PkluamVjdGFibGVzOiBnZXQoY2F0ZWdvcnkpXG4gKiAgICAgSW5qZWN0YWJsZXMtLT4+RGVjb3JhdG9yOiBSZXR1cm4gbmV3IGluc3RhbmNlXG4gKiAgICAgb3B0IEhhcyBjYWxsYmFja1xuICogICAgICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBDYWxsIGluc3RhbmNlQ2FsbGJhY2tcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogRGVmaW5lIG1ldGFkYXRhXG4gKiAgIERlY29yYXRvci0tPj5DbGllbnQ6IFJldHVybiBpbnN0YW5jZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0YWJsZShcbiAgY2F0ZWdvcnk/OiBzdHJpbmcgfCBDb25zdHJ1Y3RvciB8IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz4sXG4gIGNmZz86IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz5cbikge1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoSW5qZWN0YWJsZXNLZXlzLklOSkVDVEFCTEUpXG4gICAgLmRlZmluZSh7IGRlY29yYXRvcjogaW5qZWN0YWJsZUJhc2VEZWNvcmF0b3IsIGFyZ3M6IFtjYXRlZ29yeSwgY2ZnXSB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb252ZW5pZW5jZSBkZWNvcmF0b3IgdG8gcmVnaXN0ZXIgYW4gaW5qZWN0YWJsZSBhcyBhIHNpbmdsZXRvbi5cbiAqIEBzdW1tYXJ5IFdyYXBzIHtAbGluayBpbmplY3RhYmxlfSBmb3JjaW5nIHRoZSBzaW5nbGV0b24gbGlmZWN5Y2xlIHNvIG9ubHkgb25lIGluc3RhbmNlIGlzIGNyZWF0ZWQgYW5kIHJldXNlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfENvbnN0cnVjdG9yfSBbY2F0ZWdvcnldIE9wdGlvbmFsIGV4cGxpY2l0IGNhdGVnb3J5L3N5bWJvbCBzb3VyY2U7IGRlZmF1bHRzIHRvIHRoZSBjbGFzcy5cbiAqIEBwYXJhbSB7T21pdDxJbmplY3RhYmxlQ29uZmlnLCBcInNpbmdsZXRvblwiPn0gW2NmZ10gQWRkaXRpb25hbCBpbmplY3RhYmxlIGNvbmZpZ3VyYXRpb24gZXhjbHVkaW5nIHRoZSBzaW5nbGV0b24gZmxhZy5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBjbGFzcyBkZWNvcmF0b3IgdGhhdCByZWdpc3RlcnMgdGhlIHRhcmdldCBhcyBhIHNpbmdsZXRvbiBpbmplY3RhYmxlLlxuICogQGZ1bmN0aW9uIHNpbmdsZXRvblxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpbmdsZXRvbihcbiAgY2F0ZWdvcnk/OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgY2ZnPzogT21pdDxJbmplY3RhYmxlQ29uZmlnLCBcInNpbmdsZXRvblwiPlxuKSB7XG4gIHJldHVybiBpbmplY3RhYmxlKFxuICAgIGNhdGVnb3J5IGFzIGFueSxcbiAgICBPYmplY3QuYXNzaWduKHt9LCBjZmcgfHwge30sIHsgc2luZ2xldG9uOiB0cnVlIH0pXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlbmllbmNlIGRlY29yYXRvciB0byByZWdpc3RlciBhbiBpbmplY3RhYmxlIGFzIG9uLWRlbWFuZCAobm9uLXNpbmdsZXRvbikuXG4gKiBAc3VtbWFyeSBXcmFwcyB7QGxpbmsgaW5qZWN0YWJsZX0gZm9yY2luZyBuZXcgaW5zdGFuY2VzIHRvIGJlIGNyZWF0ZWQgb24gZXZlcnkgaW5qZWN0aW9uIG9yIHJldHJpZXZhbC5cbiAqIEBwYXJhbSB7c3RyaW5nfENvbnN0cnVjdG9yfSBbY2F0ZWdvcnldIE9wdGlvbmFsIGV4cGxpY2l0IGNhdGVnb3J5L3N5bWJvbCBzb3VyY2U7IGRlZmF1bHRzIHRvIHRoZSBjbGFzcy5cbiAqIEBwYXJhbSB7T21pdDxJbmplY3RhYmxlQ29uZmlnLCBcInNpbmdsZXRvblwiPn0gW2NmZ10gQWRkaXRpb25hbCBpbmplY3RhYmxlIGNvbmZpZ3VyYXRpb24gZXhjbHVkaW5nIHRoZSBzaW5nbGV0b24gZmxhZy5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBjbGFzcyBkZWNvcmF0b3IgdGhhdCByZWdpc3RlcnMgdGhlIHRhcmdldCBhcyBhIG5vbi1zaW5nbGV0b24gaW5qZWN0YWJsZS5cbiAqIEBmdW5jdGlvbiBvbkRlbWFuZFxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uRGVtYW5kKFxuICBjYXRlZ29yeT86IHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICBjZmc/OiBPbWl0PEluamVjdGFibGVDb25maWcsIFwic2luZ2xldG9uXCI+XG4pIHtcbiAgcmV0dXJuIGluamVjdGFibGUoXG4gICAgY2F0ZWdvcnkgYXMgYW55LFxuICAgIE9iamVjdC5hc3NpZ24oe30sIGNmZyB8fCB7fSwgeyBzaW5nbGV0b246IGZhbHNlIH0pXG4gICk7XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiB0eXBlIGZvciB0cmFuc2Zvcm1pbmcgaW5qZWN0YWJsZSBpbnN0YW5jZXMgYmVmb3JlIHRoZXkncmUgaW5qZWN0ZWQuXG4gKiBAc3VtbWFyeSBGdW5jdGlvbiB3aGljaCB0cmFuc2Zvcm1zIGEgY2FjaGVkIHtAbGluayBpbmplY3RhYmxlfSBpbnN0YW5jZSBiZWZvcmUgaXQncyBpbmplY3RlZCBpbnRvIGEgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge2FueX0gaW5qZWN0YWJsZSBUaGUgaW5qZWN0YWJsZSBpbnN0YW5jZSB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7YW55fSBvYmogVGhlIG9iamVjdCB0aGUgaW5qZWN0YWJsZSB3aWxsIGJlIGluamVjdGVkIG9uXG4gKiBAcmV0dXJuIHthbnl9IFRoZSB0cmFuc2Zvcm1lZCBpbmplY3RhYmxlIGluc3RhbmNlXG4gKlxuICogQHR5cGVkZWYge0Z1bmN0aW9ufSBJbnN0YW5jZVRyYW5zZm9ybWVyXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFuY2VUcmFuc2Zvcm1lciA9IChpbmplY3RhYmxlOiBhbnksIG9iajogYW55KSA9PiBhbnk7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE9wdGlvbnMgZm9yIHRoZSBwcm9wZXJ0eS1sZXZlbCBAaW5qZWN0IGRlY29yYXRvci5cbiAqIEBzdW1tYXJ5IEFsbG93cyBzcGVjaWZ5aW5nIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBhbmQgYW4gb3B0aW9uYWwgdHJhbnNmb3JtZXIgdG8gYmUgYXBwbGllZCB0byB0aGUgcmVzb2x2ZWQgaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge2FueVtdfSBbYXJnc10gT3B0aW9uYWwgY29uc3RydWN0b3IgYXJndW1lbnRzIHRvIHVzZSB3aGVuIGJ1aWxkaW5nIHRoZSBpbmplY3RhYmxlIGluc3RhbmNlLlxuICogQHByb3BlcnR5IHtJbnN0YW5jZVRyYW5zZm9ybWVyfSBbdHJhbnNmb3JtZXJdIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgaW5zdGFuY2UgYmVmb3JlIGFzc2lnbm1lbnQuXG4gKiBAdHlwZWRlZiBJbmplY3RPcHRpb25zXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBJbmplY3RPcHRpb25zID0ge1xuICBhcmdzPzogYW55W107XG4gIHRyYW5zZm9ybWVyPzogSW5zdGFuY2VUcmFuc2Zvcm1lcjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RCYXNlRGVjb3JhdG9yKFxuICBjYXRlZ29yeT86IHN5bWJvbCB8IHN0cmluZyB8IENvbnN0cnVjdG9yIHwgUGFydGlhbDxJbmplY3RPcHRpb25zPixcbiAgY2ZnPzogUGFydGlhbDxJbmplY3RPcHRpb25zPlxuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpbmplY3RJbm5lckRlY29yYXRvcih0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpIHtcbiAgICBjb25zdCBjb25maWc6IEluamVjdE9wdGlvbnMgPSAoXG4gICAgICBjZmcgfHwgdHlwZW9mIGNhdGVnb3J5ID09PSBcIm9iamVjdFwiID8gY2F0ZWdvcnkgOiB7fVxuICAgICkgYXMgSW5qZWN0T3B0aW9ucztcblxuICAgIGNvbnN0IG5hbWU6IHN5bWJvbCB8IHN0cmluZyB8IENvbnN0cnVjdG9yIHwgdW5kZWZpbmVkID1cbiAgICAgICh0eXBlb2YgY2F0ZWdvcnkgIT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgKGNhdGVnb3J5IGFzIHN5bWJvbCB8IHN0cmluZyB8IENvbnN0cnVjdG9yKSkgfHxcbiAgICAgIGdldFR5cGVGcm9tRGVjb3JhdG9yKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIGlmICghbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZ2V0IFR5cGUgZnJvbSBkZWNvcmF0b3JgKTtcbiAgICB9XG5cbiAgICAvLyBwcm9wKCkodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgIGdldEluamVjdEtleShJbmplY3RhYmxlc0tleXMuSU5KRUNUKSxcbiAgICAgIHtcbiAgICAgICAgaW5qZWN0YWJsZTogbmFtZSxcbiAgICAgIH0sXG4gICAgICB0YXJnZXQsXG4gICAgICBwcm9wZXJ0eUtleVxuICAgICk7XG5cbiAgICBjb25zdCB2YWx1ZXMgPSBuZXcgV2Vha01hcCgpO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIGdldCh0aGlzOiBhbnkpIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgcHJvcGVydHlLZXlcbiAgICAgICAgKSBhcyBQcm9wZXJ0eURlc2NyaXB0b3I7XG4gICAgICAgIGlmIChkZXNjcmlwdG9yLmNvbmZpZ3VyYWJsZSkge1xuICAgICAgICAgIC8vIGxldCAvb2JqOiBhbnk7XG4gICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHByb3BlcnR5S2V5LCB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIGdldCh0aGlzOiBhbnkpIHtcbiAgICAgICAgICAgICAgbGV0IG9iaiA9IHZhbHVlcy5nZXQodGhpcyk7XG4gICAgICAgICAgICAgIGlmIChvYmopIHJldHVybiBvYmo7XG4gICAgICAgICAgICAgIG9iaiA9IEluamVjdGFibGVzLmdldChuYW1lLCAuLi4oY29uZmlnLmFyZ3MgfHwgW10pKTtcbiAgICAgICAgICAgICAgaWYgKCFvYmopXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgYENvdWxkIG5vdCBnZXQgSW5qZWN0YWJsZSAke25hbWUudG9TdHJpbmcoKX0gdG8gaW5qZWN0IGluICR7dGFyZ2V0LmNvbnN0cnVjdG9yID8gdGFyZ2V0LmNvbnN0cnVjdG9yLm5hbWUgOiB0YXJnZXQubmFtZX0ncyAke3Byb3BlcnR5S2V5fWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAoY29uZmlnLnRyYW5zZm9ybWVyKVxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBvYmogPSBjb25maWcudHJhbnNmb3JtZXIob2JqLCB0YXJnZXQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YWx1ZXMuc2V0KHRoaXMsIG9iaik7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXNbcHJvcGVydHlLZXldO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGEgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBAc3VtbWFyeSBBbGxvd3MgZm9yIHRoZSBpbmplY3Rpb24gb2YgYW4ge0BsaW5rIGluamVjdGFibGV9IGRlY29yYXRlZCBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIFRoZSBwcm9wZXJ0eSBtdXN0IGJlIHR5cGVkIGZvciB0aGUgcmVxdWVzdGVkIGRlcGVuZGVuY3kuIE9ubHkgY29uY3JldGUgY2xhc3NlcyBhcmUgc3VwcG9ydGVkOyBnZW5lcmljcyBhcmUgbm90LlxuICpcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSwgYW55KTogdm9pZH0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3QoKTogKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogYW55KSA9PiB2b2lkO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogQHN1bW1hcnkgQWxsb3dzIGZvciB0aGUgaW5qZWN0aW9uIG9mIGFuIHtAbGluayBpbmplY3RhYmxlfSBkZWNvcmF0ZWQgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBUaGUgcHJvcGVydHkgbXVzdCBiZSB0eXBlZCBmb3IgdGhlIHJlcXVlc3RlZCBkZXBlbmRlbmN5LiBPbmx5IGNvbmNyZXRlIGNsYXNzZXMgYXJlIHN1cHBvcnRlZDsgZ2VuZXJpY3MgYXJlIG5vdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2F0ZWdvcnkgRGVmYXVsdHMgdG8gdGhlIGNsYXNzIG5hbWUgZGVyaXZlZCBmcm9tIHRoZSBwcm9wZXJ0eSB0eXBlLiBVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2NjdXJzXG4gKiBhbmQgbmFtZXMgYXJlIGNoYW5nZWQsIG9yIHdoZW4geW91IHdhbnQgdG8gdXBjYXN0IHRoZSBvYmplY3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSwgYW55KTogdm9pZH0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3QoXG4gIGNhdGVnb3J5OiBzdHJpbmcgfCBDb25zdHJ1Y3RvclxuKTogKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogYW55KSA9PiB2b2lkO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogQHN1bW1hcnkgQWxsb3dzIGZvciB0aGUgaW5qZWN0aW9uIG9mIGFuIHtAbGluayBpbmplY3RhYmxlfSBkZWNvcmF0ZWQgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBUaGUgcHJvcGVydHkgbXVzdCBiZSB0eXBlZCBmb3IgdGhlIHJlcXVlc3RlZCBkZXBlbmRlbmN5LiBPbmx5IGNvbmNyZXRlIGNsYXNzZXMgYXJlIHN1cHBvcnRlZDsgZ2VuZXJpY3MgYXJlIG5vdC5cbiAqXG4gKiBAcGFyYW0ge1BhcnRpYWw8SW5qZWN0T3B0aW9ucz59IFtjZmc9e31dIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgaW5qZWN0YWJsZSBpbnN0YW5jZSBiZWZvcmUgaXQncyBpbmplY3RlZCwgb3IgYXJndW1lbnRzIHRvIHBhc3MgdGhlIGNvbnN0cnVjdG9yIHdoZW4gaW5qZWN0aW5nIG9uRGVtYW5kXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueSk6IHZvaWR9IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0KFxuICBjZmc6IFBhcnRpYWw8SW5qZWN0T3B0aW9ucz5cbik6ICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IGFueSkgPT4gdm9pZDtcbi8qKlxuICogQGRlc2NyaXB0aW9uIFByb3BlcnR5IGRlY29yYXRvciB0aGF0IGluamVjdHMgYSBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIEBzdW1tYXJ5IEFsbG93cyBmb3IgdGhlIGluamVjdGlvbiBvZiBhbiB7QGxpbmsgaW5qZWN0YWJsZX0gZGVjb3JhdGVkIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogVGhlIHByb3BlcnR5IG11c3QgYmUgdHlwZWQgZm9yIHRoZSByZXF1ZXN0ZWQgZGVwZW5kZW5jeS4gT25seSBjb25jcmV0ZSBjbGFzc2VzIGFyZSBzdXBwb3J0ZWQ7IGdlbmVyaWNzIGFyZSBub3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNhdGVnb3J5IERlZmF1bHRzIHRvIHRoZSBjbGFzcyBuYW1lIGRlcml2ZWQgZnJvbSB0aGUgcHJvcGVydHkgdHlwZS4gVXNlZnVsIHdoZW4gbWluaWZpY2F0aW9uIG9jY3Vyc1xuICogYW5kIG5hbWVzIGFyZSBjaGFuZ2VkLCBvciB3aGVuIHlvdSB3YW50IHRvIHVwY2FzdCB0aGUgb2JqZWN0IHRvIGEgZGlmZmVyZW50IHR5cGUuXG4gKiBAcGFyYW0ge1BhcnRpYWw8SW5qZWN0T3B0aW9ucz59IGNmZz17fSBPcHRpb25hbCBmdW5jdGlvbiB0byB0cmFuc2Zvcm0gdGhlIGluamVjdGFibGUgaW5zdGFuY2UgYmVmb3JlIGl0J3MgaW5qZWN0ZWQsIG9yIGFyZ3VtZW50cyB0byBwYXNzIHRoZSBjb25zdHJ1Y3RvciB3aGVuIGluamVjdGluZyBvbkRlbWFuZFxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnkpOiB2b2lkfSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdChcbiAgY2F0ZWdvcnk6IHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICBjZmc6IFBhcnRpYWw8SW5qZWN0T3B0aW9ucz5cbik6ICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IGFueSkgPT4gdm9pZDtcbi8qKlxuICogQGRlc2NyaXB0aW9uIFByb3BlcnR5IGRlY29yYXRvciB0aGF0IGluamVjdHMgYSBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIEBzdW1tYXJ5IEFsbG93cyBmb3IgdGhlIGluamVjdGlvbiBvZiBhbiB7QGxpbmsgaW5qZWN0YWJsZX0gZGVjb3JhdGVkIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogVGhlIHByb3BlcnR5IG11c3QgYmUgdHlwZWQgZm9yIHRoZSByZXF1ZXN0ZWQgZGVwZW5kZW5jeS4gT25seSBjb25jcmV0ZSBjbGFzc2VzIGFyZSBzdXBwb3J0ZWQ7IGdlbmVyaWNzIGFyZSBub3QuXG4gKlxuICogSW5qZWN0ZWQgcHJvcGVydGllcyBzaG91bGQgYmUgZGVzY3JpYmVkIGxpa2Ugc286XG4gKiA8cHJlPlxuICogICAgIGNsYXNzIENsYXNzTmFtZSB7XG4gKiAgICAgICAgIC4uLlxuICpcbiAqICAgICAgICAgQGluamVjdCgpXG4gKiAgICAgICAgIHByb3BlcnR5TmFtZSE6IEluamVjdGFibGVDbGFzcztcbiAqXG4gKiAgICAgICAgIC4uLlxuICogICAgIH1cbiAqIDwvcHJlPlxuICpcbiAqIHdoZXJlIEluamVjdGFibGVDbGFzcyBpcyB0aGUgY2xhc3MgeW91IHdhbnQgdG8gaW5qZWN0LlxuICogTm90aWNlIHRoZSB1c2Ugb2YgJyE6JyB0byBlbnN1cmUgdGhlIHRyYW5zcGlsZXIgdGhlIHByb3BlcnR5IHdpbGwgYmUgc2V0IG91dHNpZGUgdGhlIGNvbnN0cnVjdG9yIGJ1dCB3aWxsIGFsd2F5cyBiZSBkZWZpbmVkLlxuICogRm9yIHByb2plY3RzIHdoZXJlIG1pbmlmaWNhdGlvbiBvY2N1cnMsIHlvdSBzaG91bGQgdXNlIHRoZSBjYXRlZ29yeSBwYXJhbSB0byBlbnN1cmUgdGhlIG5hbWUgaXMgdGhlIHNhbWUgdGhyb3VnaG91dC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NhdGVnb3J5XSBEZWZhdWx0cyB0byB0aGUgY2xhc3MgbmFtZSBkZXJpdmVkIGZyb20gdGhlIHByb3BlcnR5IHR5cGUuIFVzZWZ1bCB3aGVuIG1pbmlmaWNhdGlvbiBvY2N1cnNcbiAqIGFuZCBuYW1lcyBhcmUgY2hhbmdlZCwgb3Igd2hlbiB5b3Ugd2FudCB0byB1cGNhc3QgdGhlIG9iamVjdCB0byBhIGRpZmZlcmVudCB0eXBlLlxuICogQHBhcmFtIHtQYXJ0aWFsPEluamVjdE9wdGlvbnM+fSBbY2ZnPXt9XSBPcHRpb25hbCBmdW5jdGlvbiB0byB0cmFuc2Zvcm0gdGhlIGluamVjdGFibGUgaW5zdGFuY2UgYmVmb3JlIGl0J3MgaW5qZWN0ZWQsIG9yIGFyZ3VtZW50cyB0byBwYXNzIHRoZSBjb25zdHJ1Y3RvciB3aGVuIGluamVjdGluZyBvbkRlbWFuZFxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnkpOiB2b2lkfSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRGVjb3JhdG9yXG4gKiAgIHBhcnRpY2lwYW50IEluamVjdGFibGVzXG4gKlxuICogICBDbGllbnQtPj5EZWNvcmF0b3I6IEBpbmplY3QoKVxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IEdldCB0eXBlIGZyb20gcHJvcGVydHlcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBEZWZpbmUgbWV0YWRhdGFcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBEZWZpbmUgcHJvcGVydHkgZ2V0dGVyXG4gKlxuICogICBOb3RlIG92ZXIgRGVjb3JhdG9yOiBXaGVuIHByb3BlcnR5IGFjY2Vzc2VkXG4gKiAgIENsaWVudC0+PkRlY29yYXRvcjogYWNjZXNzIHByb3BlcnR5XG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogQ2hlY2sgaWYgaW5zdGFuY2UgZXhpc3RzXG4gKiAgIGFsdCBJbnN0YW5jZSBleGlzdHMgaW4gV2Vha01hcFxuICogICAgIERlY29yYXRvci0tPj5DbGllbnQ6IFJldHVybiBjYWNoZWQgaW5zdGFuY2VcbiAqICAgZWxzZSBObyBpbnN0YW5jZVxuICogICAgIERlY29yYXRvci0+PkluamVjdGFibGVzOiBnZXQobmFtZSlcbiAqICAgICBhbHQgSW5qZWN0YWJsZSBmb3VuZFxuICogICAgICAgSW5qZWN0YWJsZXMtLT4+RGVjb3JhdG9yOiBSZXR1cm4gaW5qZWN0YWJsZSBpbnN0YW5jZVxuICogICAgICAgb3B0IEhhcyB0cmFuc2Zvcm1lclxuICogICAgICAgICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IENhbGwgdHJhbnNmb3JtZXJcbiAqICAgICAgIGVuZFxuICogICAgICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBTdG9yZSBpbiBXZWFrTWFwXG4gKiAgICAgICBEZWNvcmF0b3ItLT4+Q2xpZW50OiBSZXR1cm4gaW5zdGFuY2VcbiAqICAgICBlbHNlIE5vIGluamVjdGFibGVcbiAqICAgICAgIERlY29yYXRvci0tPj5DbGllbnQ6IFRocm93IGVycm9yXG4gKiAgICAgZW5kXG4gKiAgIGVuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0KFxuICBjYXRlZ29yeT86IHN5bWJvbCB8IHN0cmluZyB8IENvbnN0cnVjdG9yIHwgUGFydGlhbDxJbmplY3RPcHRpb25zPixcbiAgY2ZnPzogUGFydGlhbDxJbmplY3RPcHRpb25zPlxuKSB7XG4gIHJldHVybiBEZWNvcmF0aW9uLmZvcihJbmplY3RhYmxlc0tleXMuSU5KRUNUKVxuICAgIC5kZWZpbmUoeyBkZWNvcmF0b3I6IGluamVjdEJhc2VEZWNvcmF0b3IsIGFyZ3M6IFtjYXRlZ29yeSwgY2ZnXSB9KVxuICAgIC5hcHBseSgpO1xufVxuIl19
|
|
228
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb3JhdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kZWNvcmF0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxlQUFlLEVBQUUsdUJBQW9CO0FBQ3hFLE9BQU8sRUFBRSxXQUFXLEVBQUUseUJBQXNCO0FBQzVDLE9BQU8sRUFBRSxZQUFZLEVBQUUsbUJBQWdCO0FBRXZDLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBZ0JsRSxNQUFNLFVBQVUsdUJBQXVCLENBQ3JDLFFBQTJELEVBQzNELEdBQStCO0lBRS9CLEdBQUc7UUFDRCxHQUFHO1lBQ0gsQ0FBQyxPQUFPLFFBQVEsS0FBSyxRQUFRO2dCQUMzQixDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUE0QixFQUFFLHdCQUF3QixDQUFDO2dCQUN2RSxDQUFDLENBQUMsd0JBQXdCLENBQUMsQ0FBQztJQUNoQyxRQUFRO1FBQ04sT0FBTyxRQUFRLEtBQUssUUFBUTtZQUMxQixDQUFDLENBQUMsU0FBUztZQUNYLENBQUMsQ0FBQyxPQUFPLFFBQVEsS0FBSyxRQUFRO2dCQUM1QixDQUFDLENBQUMsUUFBUTtnQkFDVixDQUFDLENBQUMsT0FBTyxRQUFRLEtBQUssVUFBVSxJQUFJLFFBQVEsQ0FBQyxJQUFJO29CQUMvQyxDQUFDLENBQUMsUUFBUTtvQkFDVixDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3BCLE9BQU8sU0FBUyx3QkFBd0IsQ0FBQyxRQUFhO1FBQ3BELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzNELFFBQVEsR0FBRyxRQUFRLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQztRQUVyQyxNQUFNLFFBQVEsR0FBdUI7WUFDbkMsS0FBSyxFQUFFLFFBQWtC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Q0FBQzs0QkFDSixJQUFJLE1BQU0sQ0FBQyxXQUFXO2dDQUNwQixJQUFJLENBQUM7b0NBQ0gsR0FBRyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dDQUN4QyxDQUFDO2dDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0NBQ1gsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FDbkIsQ0FBQzs0QkFDSCxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQzs0QkFFdEIsT0FBTyxHQUFHLENBQUM7d0JBQ2IsQ0FBQztxQkFDRixDQUFDLENBQUM7b0JBQ0gsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQzNCLENBQUM7WUFDSCxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQXVERDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBERztBQUNILE1BQU0sVUFBVSxNQUFNLENBQ3BCLFFBQWlFLEVBQ2pFLEdBQTRCO0lBRTVCLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDO1NBQzFDLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztTQUNqRSxLQUFLLEVBQUUsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWcsIEluamVjdGFibGVzS2V5cyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgSW5qZWN0YWJsZXMgfSBmcm9tIFwiLi9JbmplY3RhYmxlc1wiO1xuaW1wb3J0IHsgZ2V0SW5qZWN0S2V5IH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IEluamVjdGFibGVNZXRhZGF0YSwgSW5zdGFuY2VDYWxsYmFjayB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBEZWNvcmF0aW9uLCBNZXRhZGF0YSwgcHJvcCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBAaW5qZWN0YWJsZSBkZWNvcmF0b3IuXG4gKiBAc3VtbWFyeSBDb250cm9scyBsaWZlY3ljbGUgKHNpbmdsZXRvbiB2cyBvbi1kZW1hbmQpIGFuZCBhbiBvcHRpb25hbCBpbnN0YW5jZSB0cmFuc2Zvcm1hdGlvbiBjYWxsYmFjayBleGVjdXRlZCBwb3N0LWNvbnN0cnVjdGlvbi5cbiAqIEB0ZW1wbGF0ZSBUIFRoZSBpbnN0YW5jZSB0eXBlIGFmZmVjdGVkIGJ5IHRoZSBjYWxsYmFjayB3aGVuIHByb3ZpZGVkLlxuICogQHByb3BlcnR5IHtib29sZWFufSBzaW5nbGV0b24gV2hlbiB0cnVlLCBhIHNpbmdsZSBpbnN0YW5jZSBpcyBzaGFyZWQgKHNpbmdsZXRvbikuIFdoZW4gZmFsc2UsIGluc3RhbmNlcyBhcmUgY3JlYXRlZCBvbiBkZW1hbmQuXG4gKiBAcHJvcGVydHkge0luc3RhbmNlQ2FsbGJhY2s8VD59IFtjYWxsYmFja10gT3B0aW9uYWwgaG9vayB0byB0cmFuc2Zvcm0gdGhlIGluc3RhbmNlIGFmdGVyIGl0IGlzIGNvbnN0cnVjdGVkLlxuICogQHR5cGVkZWYgSW5qZWN0YWJsZUNvbmZpZ1xuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgSW5qZWN0YWJsZUNvbmZpZyA9IHtcbiAgc2luZ2xldG9uOiBib29sZWFuO1xuICBjYWxsYmFjaz86IEluc3RhbmNlQ2FsbGJhY2s8YW55Pjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RhYmxlQmFzZURlY29yYXRvcihcbiAgY2F0ZWdvcnk/OiBzdHJpbmcgfCBDb25zdHJ1Y3RvciB8IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz4sXG4gIGNmZz86IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz5cbikge1xuICBjZmcgPVxuICAgIGNmZyB8fFxuICAgICh0eXBlb2YgY2F0ZWdvcnkgPT09IFwib2JqZWN0XCJcbiAgICAgID8gT2JqZWN0LmFzc2lnbihjYXRlZ29yeSBhcyBSZWNvcmQ8YW55LCBhbnk+LCBEZWZhdWx0SW5qZWN0YWJsZXNDb25maWcpXG4gICAgICA6IERlZmF1bHRJbmplY3RhYmxlc0NvbmZpZyk7XG4gIGNhdGVnb3J5ID1cbiAgICB0eXBlb2YgY2F0ZWdvcnkgPT09IFwib2JqZWN0XCJcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IHR5cGVvZiBjYXRlZ29yeSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IGNhdGVnb3J5XG4gICAgICAgIDogdHlwZW9mIGNhdGVnb3J5ID09PSBcImZ1bmN0aW9uXCIgJiYgY2F0ZWdvcnkubmFtZVxuICAgICAgICAgID8gY2F0ZWdvcnlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgcmV0dXJuIGZ1bmN0aW9uIGluamVjdGFibGVJbm5lckRlY29yYXRvcihvcmlnaW5hbDogYW55KSB7XG4gICAgY29uc3Qgc3ltYm9sID0gU3ltYm9sLmZvcihjYXRlZ29yeSB8fCBvcmlnaW5hbC50b1N0cmluZygpKTtcbiAgICBjYXRlZ29yeSA9IGNhdGVnb3J5IHx8IG9yaWdpbmFsLm5hbWU7XG5cbiAgICBjb25zdCBtZXRhZGF0YTogSW5qZWN0YWJsZU1ldGFkYXRhID0ge1xuICAgICAgY2xhc3M6IGNhdGVnb3J5IGFzIHN0cmluZyxcbiAgICAgIHN5bWJvbDogc3ltYm9sLFxuICAgIH07XG5cbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgZ2V0SW5qZWN0S2V5KEluamVjdGFibGVzS2V5cy5JTkpFQ1RBQkxFKSxcbiAgICAgIG1ldGFkYXRhLFxuICAgICAgb3JpZ2luYWxcbiAgICApO1xuICAgIC8vIHRoZSBuZXcgY29uc3RydWN0b3IgYmVoYXZpb3VyXG4gICAgY29uc3QgbmV3Q29uc3RydWN0b3I6IGFueSA9IGZ1bmN0aW9uICguLi5hcmdzOiBhbnlbXSkge1xuICAgICAgcmV0dXJuIEluamVjdGFibGVzLmdldDxhbnk+KHN5bWJvbCwgLi4uYXJncyk7XG4gICAgfTtcblxuICAgIC8vIGNvcHkgcHJvdG90eXBlIHNvIGluc3RhbmNlb2Ygb3BlcmF0b3Igc3RpbGwgd29ya3NcbiAgICBuZXdDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBvcmlnaW5hbC5wcm90b3R5cGU7XG4gICAgLy8gbmV3Q29uc3RydWN0b3IuX19wcm90b19fID0gb3JpZ2luYWwuX19wcm90b19fO1xuICAgIC8vIFNldHMgdGhlIHByb3BlciBjb25zdHJ1Y3RvciBuYW1lIGZvciB0eXBlIHZlcmlmaWNhdGlvblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuZXdDb25zdHJ1Y3RvciwgXCJuYW1lXCIsIHtcbiAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgdmFsdWU6IG9yaWdpbmFsLnByb3RvdHlwZS5jb25zdHJ1Y3Rvci5uYW1lLFxuICAgIH0pO1xuXG4gICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YShcbiAgICAgIGdldEluamVjdEtleShJbmplY3RhYmxlc0tleXMuSU5KRUNUQUJMRSksXG4gICAgICBtZXRhZGF0YSxcbiAgICAgIG5ld0NvbnN0cnVjdG9yXG4gICAgKTtcblxuICAgIEluamVjdGFibGVzLnJlZ2lzdGVyKG9yaWdpbmFsLCBzeW1ib2wsIGNmZyk7XG4gICAgLy8gcmV0dXJuIG5ldyBjb25zdHJ1Y3RvciAod2lsbCBvdmVycmlkZSBvcmlnaW5hbClcbiAgICByZXR1cm4gbmV3Q29uc3RydWN0b3I7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEdlbmVyaWMgY29uc3RydWN0b3IgdHlwZSBmb3IgY2xhc3MtbGlrZSB2YWx1ZXMuXG4gKiBAc3VtbWFyeSBSZXByZXNlbnRzIGFueSBjbGFzcyB0aGF0IGNhbiBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhcmJpdHJhcnkgYXJndW1lbnRzLCBwcm9kdWNpbmcgYW4gaW5zdGFuY2Ugb2YgdHlwZSBULlxuICogQHRlbXBsYXRlIFQgVGhlIGluc3RhbmNlIHR5cGUgY3JlYXRlZCBieSB0aGUgY29uc3RydWN0b3IuXG4gKiBAdHlwZWRlZiBDb25zdHJ1Y3RvclxuICogQGV4YW1wbGVcbiAqIC8vIFVzaW5nIENvbnN0cnVjdG9yIHRvIHR5cGUgYSBmYWN0b3J5XG4gKiBmdW5jdGlvbiBtYWtlPFQ+KEN0b3I6IENvbnN0cnVjdG9yPFQ+LCAuLi5hcmdzOiBhbnlbXSk6IFQge1xuICogICByZXR1cm4gbmV3IEN0b3IoLi4uYXJncyk7XG4gKiB9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBDb25zdHJ1Y3RvcjxUID0gYW55PiA9IHsgbmV3ICguLi5hcmdzOiBhbnlbXSk6IFQgfTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2UuXG4gKlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55KTogYW55fSBBIGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHRyYW5zZm9ybXMgdGhlIGNsYXNzIGludG8gYW4gaW5qZWN0YWJsZS5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0YWJsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0YWJsZSgpOiAob3JpZ2luYWw6IGFueSkgPT4gYW55O1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBDb25zdHJ1Y3Rvcn0gY2F0ZWdvcnkgRGVmYXVsdHMgdG8gdGhlIGNsYXNzIGNhdGVnb3J5LiBVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2NjdXJzIGFuZCBuYW1lcyBhcmUgY2hhbmdlZCxcbiAqIG9yIHdoZW4geW91IHdhbnQgdG8gdXBjYXN0IHRoZSBvYmplY3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAqXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnkpOiBhbnl9IEEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyB0aGUgY2xhc3MgaW50byBhbiBpbmplY3RhYmxlLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RhYmxlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RhYmxlKFxuICBjYXRlZ29yeTogc3RyaW5nIHwgQ29uc3RydWN0b3Jcbik6IChvcmlnaW5hbDogYW55KSA9PiBhbnk7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXJrcyBhIGNsYXNzIGFzIGF2YWlsYWJsZSBmb3IgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKiBAc3VtbWFyeSBEZWZpbmVzIGEgY2xhc3MgYXMgYW4gaW5qZWN0YWJsZSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgcmVnaXN0cnkuXG4gKiBXaGVuIGFwcGxpZWQgdG8gYSBjbGFzcywgcmVwbGFjZXMgaXRzIGNvbnN0cnVjdG9yIHdpdGggb25lIHRoYXQgcmV0dXJucyBhbiBpbnN0YW5jZS5cbiAqXG4gKiBAcGFyYW0ge1BhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz59IGNmZz1EZWZhdWx0SW5qZWN0YWJsZUNvbmZpZyBBbGxvd3Mgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCBzaW5nbGV0b24gYmVoYXZpb3IgYW5kIGFkZGluZyBhIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSBjbGFzcyBpbnRvIGFuIGluamVjdGFibGUuXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdGFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdGFibGUoXG4gIGNmZzogUGFydGlhbDxJbmplY3RhYmxlQ29uZmlnPlxuKTogKG9yaWdpbmFsOiBhbnkpID0+IGFueTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIGNhdGVnb3J5IERlZmF1bHRzIHRvIHRoZSBjbGFzcyBjYXRlZ29yeS4gVXNlZnVsIHdoZW4gbWluaWZpY2F0aW9uIG9jY3VycyBhbmQgbmFtZXMgYXJlIGNoYW5nZWQsXG4gKiBvciB3aGVuIHlvdSB3YW50IHRvIHVwY2FzdCB0aGUgb2JqZWN0IHRvIGEgZGlmZmVyZW50IHR5cGUuXG4gKiBAcGFyYW0ge1BhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz59IGNmZz1EZWZhdWx0SW5qZWN0YWJsZUNvbmZpZyBBbGxvd3Mgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCBzaW5nbGV0b24gYmVoYXZpb3IgYW5kIGFkZGluZyBhIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSBjbGFzcyBpbnRvIGFuIGluamVjdGFibGUuXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdGFibGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdGFibGUoXG4gIGNhdGVnb3J5OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgY2ZnOiBQYXJ0aWFsPEluamVjdGFibGVDb25maWc+XG4pOiAob3JpZ2luYWw6IGFueSkgPT4gYW55O1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFya3MgYSBjbGFzcyBhcyBhdmFpbGFibGUgZm9yIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICogQHN1bW1hcnkgRGVmaW5lcyBhIGNsYXNzIGFzIGFuIGluamVjdGFibGUgdGhhdCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIHJlZ2lzdHJ5LlxuICogV2hlbiBhcHBsaWVkIHRvIGEgY2xhc3MsIHJlcGxhY2VzIGl0cyBjb25zdHJ1Y3RvciB3aXRoIG9uZSB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmcgfCBDb25zdHJ1Y3Rvcn0gW2NhdGVnb3J5XSBEZWZhdWx0cyB0byB0aGUgY2xhc3MgY2F0ZWdvcnkuIFVzZWZ1bCB3aGVuIG1pbmlmaWNhdGlvbiBvY2N1cnMgYW5kIG5hbWVzIGFyZSBjaGFuZ2VkLFxuICogb3Igd2hlbiB5b3Ugd2FudCB0byB1cGNhc3QgdGhlIG9iamVjdCB0byBhIGRpZmZlcmVudCB0eXBlLlxuICogQHBhcmFtIHtQYXJ0aWFsPEluamVjdGFibGVDb25maWc+fSBbY2ZnPURlZmF1bHRJbmplY3RhYmxlQ29uZmlnXSBBbGxvd3Mgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCBzaW5nbGV0b24gYmVoYXZpb3IgYW5kIGFkZGluZyBhIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICpcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCB0cmFuc2Zvcm1zIHRoZSBjbGFzcyBpbnRvIGFuIGluamVjdGFibGUuXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdGFibGVcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBDbGllbnRcbiAqICAgcGFydGljaXBhbnQgRGVjb3JhdG9yXG4gKiAgIHBhcnRpY2lwYW50IEluamVjdGFibGVzXG4gKlxuICogICBDbGllbnQtPj5EZWNvcmF0b3I6IEBpbmplY3RhYmxlKClcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBDcmVhdGUgbmV3IGNvbnN0cnVjdG9yXG4gKlxuICogICBOb3RlIG92ZXIgRGVjb3JhdG9yOiBXaGVuIG5ldyBpbnN0YW5jZSByZXF1ZXN0ZWRcbiAqICAgRGVjb3JhdG9yLT4+SW5qZWN0YWJsZXM6IGdldChjYXRlZ29yeSlcbiAqICAgYWx0IEluc3RhbmNlIGV4aXN0c1xuICogICAgIEluamVjdGFibGVzLS0+PkRlY29yYXRvcjogUmV0dXJuIGV4aXN0aW5nIGluc3RhbmNlXG4gKiAgIGVsc2UgTm8gaW5zdGFuY2VcbiAqICAgICBEZWNvcmF0b3ItPj5JbmplY3RhYmxlczogcmVnaXN0ZXIob3JpZ2luYWwsIGNhdGVnb3J5KVxuICogICAgIERlY29yYXRvci0+PkluamVjdGFibGVzOiBnZXQoY2F0ZWdvcnkpXG4gKiAgICAgSW5qZWN0YWJsZXMtLT4+RGVjb3JhdG9yOiBSZXR1cm4gbmV3IGluc3RhbmNlXG4gKiAgICAgb3B0IEhhcyBjYWxsYmFja1xuICogICAgICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBDYWxsIGluc3RhbmNlQ2FsbGJhY2tcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogRGVmaW5lIG1ldGFkYXRhXG4gKiAgIERlY29yYXRvci0tPj5DbGllbnQ6IFJldHVybiBpbnN0YW5jZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0YWJsZShcbiAgY2F0ZWdvcnk/OiBzdHJpbmcgfCBDb25zdHJ1Y3RvciB8IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz4sXG4gIGNmZz86IFBhcnRpYWw8SW5qZWN0YWJsZUNvbmZpZz5cbikge1xuICByZXR1cm4gRGVjb3JhdGlvbi5mb3IoSW5qZWN0YWJsZXNLZXlzLklOSkVDVEFCTEUpXG4gICAgLmRlZmluZSh7IGRlY29yYXRvcjogaW5qZWN0YWJsZUJhc2VEZWNvcmF0b3IsIGFyZ3M6IFtjYXRlZ29yeSwgY2ZnXSB9KVxuICAgIC5hcHBseSgpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDb252ZW5pZW5jZSBkZWNvcmF0b3IgdG8gcmVnaXN0ZXIgYW4gaW5qZWN0YWJsZSBhcyBhIHNpbmdsZXRvbi5cbiAqIEBzdW1tYXJ5IFdyYXBzIHtAbGluayBpbmplY3RhYmxlfSBmb3JjaW5nIHRoZSBzaW5nbGV0b24gbGlmZWN5Y2xlIHNvIG9ubHkgb25lIGluc3RhbmNlIGlzIGNyZWF0ZWQgYW5kIHJldXNlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfENvbnN0cnVjdG9yfSBbY2F0ZWdvcnldIE9wdGlvbmFsIGV4cGxpY2l0IGNhdGVnb3J5L3N5bWJvbCBzb3VyY2U7IGRlZmF1bHRzIHRvIHRoZSBjbGFzcy5cbiAqIEBwYXJhbSB7T21pdDxJbmplY3RhYmxlQ29uZmlnLCBcInNpbmdsZXRvblwiPn0gW2NmZ10gQWRkaXRpb25hbCBpbmplY3RhYmxlIGNvbmZpZ3VyYXRpb24gZXhjbHVkaW5nIHRoZSBzaW5nbGV0b24gZmxhZy5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBjbGFzcyBkZWNvcmF0b3IgdGhhdCByZWdpc3RlcnMgdGhlIHRhcmdldCBhcyBhIHNpbmdsZXRvbiBpbmplY3RhYmxlLlxuICogQGZ1bmN0aW9uIHNpbmdsZXRvblxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpbmdsZXRvbihcbiAgY2F0ZWdvcnk/OiBzdHJpbmcgfCBDb25zdHJ1Y3RvcixcbiAgY2ZnPzogT21pdDxJbmplY3RhYmxlQ29uZmlnLCBcInNpbmdsZXRvblwiPlxuKSB7XG4gIHJldHVybiBpbmplY3RhYmxlKFxuICAgIGNhdGVnb3J5IGFzIGFueSxcbiAgICBPYmplY3QuYXNzaWduKHt9LCBjZmcgfHwge30sIHsgc2luZ2xldG9uOiB0cnVlIH0pXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbnZlbmllbmNlIGRlY29yYXRvciB0byByZWdpc3RlciBhbiBpbmplY3RhYmxlIGFzIG9uLWRlbWFuZCAobm9uLXNpbmdsZXRvbikuXG4gKiBAc3VtbWFyeSBXcmFwcyB7QGxpbmsgaW5qZWN0YWJsZX0gZm9yY2luZyBuZXcgaW5zdGFuY2VzIHRvIGJlIGNyZWF0ZWQgb24gZXZlcnkgaW5qZWN0aW9uIG9yIHJldHJpZXZhbC5cbiAqIEBwYXJhbSB7c3RyaW5nfENvbnN0cnVjdG9yfSBbY2F0ZWdvcnldIE9wdGlvbmFsIGV4cGxpY2l0IGNhdGVnb3J5L3N5bWJvbCBzb3VyY2U7IGRlZmF1bHRzIHRvIHRoZSBjbGFzcy5cbiAqIEBwYXJhbSB7T21pdDxJbmplY3RhYmxlQ29uZmlnLCBcInNpbmdsZXRvblwiPn0gW2NmZ10gQWRkaXRpb25hbCBpbmplY3RhYmxlIGNvbmZpZ3VyYXRpb24gZXhjbHVkaW5nIHRoZSBzaW5nbGV0b24gZmxhZy5cbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSk6IGFueX0gQSBjbGFzcyBkZWNvcmF0b3IgdGhhdCByZWdpc3RlcnMgdGhlIHRhcmdldCBhcyBhIG5vbi1zaW5nbGV0b24gaW5qZWN0YWJsZS5cbiAqIEBmdW5jdGlvbiBvbkRlbWFuZFxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uRGVtYW5kKFxuICBjYXRlZ29yeT86IHN0cmluZyB8IENvbnN0cnVjdG9yLFxuICBjZmc/OiBPbWl0PEluamVjdGFibGVDb25maWcsIFwic2luZ2xldG9uXCI+XG4pIHtcbiAgcmV0dXJuIGluamVjdGFibGUoXG4gICAgY2F0ZWdvcnkgYXMgYW55LFxuICAgIE9iamVjdC5hc3NpZ24oe30sIGNmZyB8fCB7fSwgeyBzaW5nbGV0b246IGZhbHNlIH0pXG4gICk7XG59XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiB0eXBlIGZvciB0cmFuc2Zvcm1pbmcgaW5qZWN0YWJsZSBpbnN0YW5jZXMgYmVmb3JlIHRoZXkncmUgaW5qZWN0ZWQuXG4gKiBAc3VtbWFyeSBGdW5jdGlvbiB3aGljaCB0cmFuc2Zvcm1zIGEgY2FjaGVkIHtAbGluayBpbmplY3RhYmxlfSBpbnN0YW5jZSBiZWZvcmUgaXQncyBpbmplY3RlZCBpbnRvIGEgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAcGFyYW0ge2FueX0gaW5qZWN0YWJsZSBUaGUgaW5qZWN0YWJsZSBpbnN0YW5jZSB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7YW55fSBvYmogVGhlIG9iamVjdCB0aGUgaW5qZWN0YWJsZSB3aWxsIGJlIGluamVjdGVkIG9uXG4gKiBAcmV0dXJuIHthbnl9IFRoZSB0cmFuc2Zvcm1lZCBpbmplY3RhYmxlIGluc3RhbmNlXG4gKlxuICogQHR5cGVkZWYge0Z1bmN0aW9ufSBJbnN0YW5jZVRyYW5zZm9ybWVyXG4gKiBAY2F0ZWdvcnkgRGVjb3JhdG9yc1xuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IHR5cGUgSW5zdGFuY2VUcmFuc2Zvcm1lciA9IChpbmplY3RhYmxlOiBhbnksIG9iajogYW55KSA9PiBhbnk7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE9wdGlvbnMgZm9yIHRoZSBwcm9wZXJ0eS1sZXZlbCBAaW5qZWN0IGRlY29yYXRvci5cbiAqIEBzdW1tYXJ5IEFsbG93cyBzcGVjaWZ5aW5nIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBhbmQgYW4gb3B0aW9uYWwgdHJhbnNmb3JtZXIgdG8gYmUgYXBwbGllZCB0byB0aGUgcmVzb2x2ZWQgaW5zdGFuY2UuXG4gKiBAcHJvcGVydHkge2FueVtdfSBbYXJnc10gT3B0aW9uYWwgY29uc3RydWN0b3IgYXJndW1lbnRzIHRvIHVzZSB3aGVuIGJ1aWxkaW5nIHRoZSBpbmplY3RhYmxlIGluc3RhbmNlLlxuICogQHByb3BlcnR5IHtJbnN0YW5jZVRyYW5zZm9ybWVyfSBbdHJhbnNmb3JtZXJdIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgaW5zdGFuY2UgYmVmb3JlIGFzc2lnbm1lbnQuXG4gKiBAdHlwZWRlZiBJbmplY3RPcHRpb25zXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgdHlwZSBJbmplY3RPcHRpb25zID0ge1xuICBhcmdzPzogYW55W107XG4gIHRyYW5zZm9ybWVyPzogSW5zdGFuY2VUcmFuc2Zvcm1lcjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RCYXNlRGVjb3JhdG9yKFxuICBjYXRlZ29yeT86IHN5bWJvbCB8IHN0cmluZyB8IENvbnN0cnVjdG9yIHwgUGFydGlhbDxJbmplY3RPcHRpb25zPixcbiAgY2ZnPzogUGFydGlhbDxJbmplY3RPcHRpb25zPlxuKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpbmplY3RJbm5lckRlY29yYXRvcih0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpIHtcbiAgICBjb25zdCBjb25maWc6IEluamVjdE9wdGlvbnMgPSAoXG4gICAgICBjZmcgfHwgdHlwZW9mIGNhdGVnb3J5ID09PSBcIm9iamVjdFwiID8gY2F0ZWdvcnkgOiB7fVxuICAgICkgYXMgSW5qZWN0T3B0aW9ucztcblxuICAgIGlmIChwcm9wZXJ0eUtleSkge1xuICAgICAgcHJvcCgpKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICAgIH1cblxuICAgIGNvbnN0IG5hbWU6IHN5bWJvbCB8IHN0cmluZyB8IENvbnN0cnVjdG9yIHwgdW5kZWZpbmVkID1cbiAgICAgICh0eXBlb2YgY2F0ZWdvcnkgIT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgKGNhdGVnb3J5IGFzIHN5bWJvbCB8IHN0cmluZyB8IENvbnN0cnVjdG9yKSkgfHxcbiAgICAgIE1ldGFkYXRhLnR5cGUodGFyZ2V0LmNvbnN0cnVjdG9yLCBwcm9wZXJ0eUtleSk7XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgVHlwZSBmcm9tIGRlY29yYXRvcmApO1xuICAgIH1cblxuICAgIC8vIHByb3AoKSh0YXJnZXQsIHByb3BlcnR5S2V5KTtcbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKFxuICAgICAgZ2V0SW5qZWN0S2V5KEluamVjdGFibGVzS2V5cy5JTkpFQ1QpLFxuICAgICAge1xuICAgICAgICBpbmplY3RhYmxlOiBuYW1lLFxuICAgICAgfSxcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcblxuICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSwge1xuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgZ2V0KHRoaXM6IGFueSkge1xuICAgICAgICBjb25zdCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICAgICAgICAgIHRhcmdldCxcbiAgICAgICAgICBwcm9wZXJ0eUtleVxuICAgICAgICApIGFzIFByb3BlcnR5RGVzY3JpcHRvcjtcbiAgICAgICAgaWYgKGRlc2NyaXB0b3IuY29uZmlndXJhYmxlKSB7XG4gICAgICAgICAgLy8gbGV0IC9vYmo6IGFueTtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgZ2V0KHRoaXM6IGFueSkge1xuICAgICAgICAgICAgICBsZXQgb2JqID0gdmFsdWVzLmdldCh0aGlzKTtcbiAgICAgICAgICAgICAgaWYgKG9iaikgcmV0dXJuIG9iajtcbiAgICAgICAgICAgICAgb2JqID0gSW5qZWN0YWJsZXMuZ2V0KG5hbWUsIC4uLihjb25maWcuYXJncyB8fCBbXSkpO1xuICAgICAgICAgICAgICBpZiAoIW9iailcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgQ291bGQgbm90IGdldCBJbmplY3RhYmxlICR7bmFtZS50b1N0cmluZygpfSB0byBpbmplY3QgaW4gJHt0YXJnZXQuY29uc3RydWN0b3IgPyB0YXJnZXQuY29uc3RydWN0b3IubmFtZSA6IHRhcmdldC5uYW1lfSdzICR7cHJvcGVydHlLZXl9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChjb25maWcudHJhbnNmb3JtZXIpXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIG9iaiA9IGNvbmZpZy50cmFuc2Zvcm1lcihvYmosIHRhcmdldCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhbHVlcy5zZXQodGhpcywgb2JqKTtcblxuICAgICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdGhpc1twcm9wZXJ0eUtleV07XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFByb3BlcnR5IGRlY29yYXRvciB0aGF0IGluamVjdHMgYSBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIEBzdW1tYXJ5IEFsbG93cyBmb3IgdGhlIGluamVjdGlvbiBvZiBhbiB7QGxpbmsgaW5qZWN0YWJsZX0gZGVjb3JhdGVkIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogVGhlIHByb3BlcnR5IG11c3QgYmUgdHlwZWQgZm9yIHRoZSByZXF1ZXN0ZWQgZGVwZW5kZW5jeS4gT25seSBjb25jcmV0ZSBjbGFzc2VzIGFyZSBzdXBwb3J0ZWQ7IGdlbmVyaWNzIGFyZSBub3QuXG4gKlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnkpOiB2b2lkfSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdCgpOiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBhbnkpID0+IHZvaWQ7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGEgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBAc3VtbWFyeSBBbGxvd3MgZm9yIHRoZSBpbmplY3Rpb24gb2YgYW4ge0BsaW5rIGluamVjdGFibGV9IGRlY29yYXRlZCBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIFRoZSBwcm9wZXJ0eSBtdXN0IGJlIHR5cGVkIGZvciB0aGUgcmVxdWVzdGVkIGRlcGVuZGVuY3kuIE9ubHkgY29uY3JldGUgY2xhc3NlcyBhcmUgc3VwcG9ydGVkOyBnZW5lcmljcyBhcmUgbm90LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjYXRlZ29yeSBEZWZhdWx0cyB0byB0aGUgY2xhc3MgbmFtZSBkZXJpdmVkIGZyb20gdGhlIHByb3BlcnR5IHR5cGUuIFVzZWZ1bCB3aGVuIG1pbmlmaWNhdGlvbiBvY2N1cnNcbiAqIGFuZCBuYW1lcyBhcmUgY2hhbmdlZCwgb3Igd2hlbiB5b3Ugd2FudCB0byB1cGNhc3QgdGhlIG9iamVjdCB0byBhIGRpZmZlcmVudCB0eXBlLlxuICogQHJldHVybiB7ZnVuY3Rpb24oYW55LCBhbnkpOiB2b2lkfSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvbiB0aGF0IHNldHMgdXAgdGhlIGRlcGVuZGVuY3kgaW5qZWN0aW9uLlxuICpcbiAqIEBmdW5jdGlvbiBpbmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdChcbiAgY2F0ZWdvcnk6IHN0cmluZyB8IENvbnN0cnVjdG9yXG4pOiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBhbnkpID0+IHZvaWQ7XG4vKipcbiAqIEBkZXNjcmlwdGlvbiBQcm9wZXJ0eSBkZWNvcmF0b3IgdGhhdCBpbmplY3RzIGEgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBAc3VtbWFyeSBBbGxvd3MgZm9yIHRoZSBpbmplY3Rpb24gb2YgYW4ge0BsaW5rIGluamVjdGFibGV9IGRlY29yYXRlZCBkZXBlbmRlbmN5IGludG8gYSBjbGFzcyBwcm9wZXJ0eS5cbiAqIFRoZSBwcm9wZXJ0eSBtdXN0IGJlIHR5cGVkIGZvciB0aGUgcmVxdWVzdGVkIGRlcGVuZGVuY3kuIE9ubHkgY29uY3JldGUgY2xhc3NlcyBhcmUgc3VwcG9ydGVkOyBnZW5lcmljcyBhcmUgbm90LlxuICpcbiAqIEBwYXJhbSB7UGFydGlhbDxJbmplY3RPcHRpb25zPn0gW2NmZz17fV0gT3B0aW9uYWwgZnVuY3Rpb24gdG8gdHJhbnNmb3JtIHRoZSBpbmplY3RhYmxlIGluc3RhbmNlIGJlZm9yZSBpdCdzIGluamVjdGVkLCBvciBhcmd1bWVudHMgdG8gcGFzcyB0aGUgY29uc3RydWN0b3Igd2hlbiBpbmplY3Rpbmcgb25EZW1hbmRcbiAqIEByZXR1cm4ge2Z1bmN0aW9uKGFueSwgYW55KTogdm9pZH0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb24gdGhhdCBzZXRzIHVwIHRoZSBkZXBlbmRlbmN5IGluamVjdGlvbi5cbiAqXG4gKiBAZnVuY3Rpb24gaW5qZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3QoXG4gIGNmZzogUGFydGlhbDxJbmplY3RPcHRpb25zPlxuKTogKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogYW55KSA9PiB2b2lkO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogQHN1bW1hcnkgQWxsb3dzIGZvciB0aGUgaW5qZWN0aW9uIG9mIGFuIHtAbGluayBpbmplY3RhYmxlfSBkZWNvcmF0ZWQgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBUaGUgcHJvcGVydHkgbXVzdCBiZSB0eXBlZCBmb3IgdGhlIHJlcXVlc3RlZCBkZXBlbmRlbmN5LiBPbmx5IGNvbmNyZXRlIGNsYXNzZXMgYXJlIHN1cHBvcnRlZDsgZ2VuZXJpY3MgYXJlIG5vdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2F0ZWdvcnkgRGVmYXVsdHMgdG8gdGhlIGNsYXNzIG5hbWUgZGVyaXZlZCBmcm9tIHRoZSBwcm9wZXJ0eSB0eXBlLiBVc2VmdWwgd2hlbiBtaW5pZmljYXRpb24gb2NjdXJzXG4gKiBhbmQgbmFtZXMgYXJlIGNoYW5nZWQsIG9yIHdoZW4geW91IHdhbnQgdG8gdXBjYXN0IHRoZSBvYmplY3QgdG8gYSBkaWZmZXJlbnQgdHlwZS5cbiAqIEBwYXJhbSB7UGFydGlhbDxJbmplY3RPcHRpb25zPn0gY2ZnPXt9IE9wdGlvbmFsIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgaW5qZWN0YWJsZSBpbnN0YW5jZSBiZWZvcmUgaXQncyBpbmplY3RlZCwgb3IgYXJndW1lbnRzIHRvIHBhc3MgdGhlIGNvbnN0cnVjdG9yIHdoZW4gaW5qZWN0aW5nIG9uRGVtYW5kXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueSk6IHZvaWR9IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0KFxuICBjYXRlZ29yeTogc3RyaW5nIHwgQ29uc3RydWN0b3IsXG4gIGNmZzogUGFydGlhbDxJbmplY3RPcHRpb25zPlxuKTogKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogYW55KSA9PiB2b2lkO1xuLyoqXG4gKiBAZGVzY3JpcHRpb24gUHJvcGVydHkgZGVjb3JhdG9yIHRoYXQgaW5qZWN0cyBhIGRlcGVuZGVuY3kgaW50byBhIGNsYXNzIHByb3BlcnR5LlxuICogQHN1bW1hcnkgQWxsb3dzIGZvciB0aGUgaW5qZWN0aW9uIG9mIGFuIHtAbGluayBpbmplY3RhYmxlfSBkZWNvcmF0ZWQgZGVwZW5kZW5jeSBpbnRvIGEgY2xhc3MgcHJvcGVydHkuXG4gKiBUaGUgcHJvcGVydHkgbXVzdCBiZSB0eXBlZCBmb3IgdGhlIHJlcXVlc3RlZCBkZXBlbmRlbmN5LiBPbmx5IGNvbmNyZXRlIGNsYXNzZXMgYXJlIHN1cHBvcnRlZDsgZ2VuZXJpY3MgYXJlIG5vdC5cbiAqXG4gKiBJbmplY3RlZCBwcm9wZXJ0aWVzIHNob3VsZCBiZSBkZXNjcmliZWQgbGlrZSBzbzpcbiAqIDxwcmU+XG4gKiAgICAgY2xhc3MgQ2xhc3NOYW1lIHtcbiAqICAgICAgICAgLi4uXG4gKlxuICogICAgICAgICBAaW5qZWN0KClcbiAqICAgICAgICAgcHJvcGVydHlOYW1lITogSW5qZWN0YWJsZUNsYXNzO1xuICpcbiAqICAgICAgICAgLi4uXG4gKiAgICAgfVxuICogPC9wcmU+XG4gKlxuICogd2hlcmUgSW5qZWN0YWJsZUNsYXNzIGlzIHRoZSBjbGFzcyB5b3Ugd2FudCB0byBpbmplY3QuXG4gKiBOb3RpY2UgdGhlIHVzZSBvZiAnITonIHRvIGVuc3VyZSB0aGUgdHJhbnNwaWxlciB0aGUgcHJvcGVydHkgd2lsbCBiZSBzZXQgb3V0c2lkZSB0aGUgY29uc3RydWN0b3IgYnV0IHdpbGwgYWx3YXlzIGJlIGRlZmluZWQuXG4gKiBGb3IgcHJvamVjdHMgd2hlcmUgbWluaWZpY2F0aW9uIG9jY3VycywgeW91IHNob3VsZCB1c2UgdGhlIGNhdGVnb3J5IHBhcmFtIHRvIGVuc3VyZSB0aGUgbmFtZSBpcyB0aGUgc2FtZSB0aHJvdWdob3V0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbY2F0ZWdvcnldIERlZmF1bHRzIHRvIHRoZSBjbGFzcyBuYW1lIGRlcml2ZWQgZnJvbSB0aGUgcHJvcGVydHkgdHlwZS4gVXNlZnVsIHdoZW4gbWluaWZpY2F0aW9uIG9jY3Vyc1xuICogYW5kIG5hbWVzIGFyZSBjaGFuZ2VkLCBvciB3aGVuIHlvdSB3YW50IHRvIHVwY2FzdCB0aGUgb2JqZWN0IHRvIGEgZGlmZmVyZW50IHR5cGUuXG4gKiBAcGFyYW0ge1BhcnRpYWw8SW5qZWN0T3B0aW9ucz59IFtjZmc9e31dIE9wdGlvbmFsIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgaW5qZWN0YWJsZSBpbnN0YW5jZSBiZWZvcmUgaXQncyBpbmplY3RlZCwgb3IgYXJndW1lbnRzIHRvIHBhc3MgdGhlIGNvbnN0cnVjdG9yIHdoZW4gaW5qZWN0aW5nIG9uRGVtYW5kXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihhbnksIGFueSk6IHZvaWR9IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgc2V0cyB1cCB0aGUgZGVwZW5kZW5jeSBpbmplY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uIGluamVjdFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IENsaWVudFxuICogICBwYXJ0aWNpcGFudCBEZWNvcmF0b3JcbiAqICAgcGFydGljaXBhbnQgSW5qZWN0YWJsZXNcbiAqXG4gKiAgIENsaWVudC0+PkRlY29yYXRvcjogQGluamVjdCgpXG4gKiAgIERlY29yYXRvci0+PkRlY29yYXRvcjogR2V0IHR5cGUgZnJvbSBwcm9wZXJ0eVxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IERlZmluZSBtZXRhZGF0YVxuICogICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IERlZmluZSBwcm9wZXJ0eSBnZXR0ZXJcbiAqXG4gKiAgIE5vdGUgb3ZlciBEZWNvcmF0b3I6IFdoZW4gcHJvcGVydHkgYWNjZXNzZWRcbiAqICAgQ2xpZW50LT4+RGVjb3JhdG9yOiBhY2Nlc3MgcHJvcGVydHlcbiAqICAgRGVjb3JhdG9yLT4+RGVjb3JhdG9yOiBDaGVjayBpZiBpbnN0YW5jZSBleGlzdHNcbiAqICAgYWx0IEluc3RhbmNlIGV4aXN0cyBpbiBXZWFrTWFwXG4gKiAgICAgRGVjb3JhdG9yLS0+PkNsaWVudDogUmV0dXJuIGNhY2hlZCBpbnN0YW5jZVxuICogICBlbHNlIE5vIGluc3RhbmNlXG4gKiAgICAgRGVjb3JhdG9yLT4+SW5qZWN0YWJsZXM6IGdldChuYW1lKVxuICogICAgIGFsdCBJbmplY3RhYmxlIGZvdW5kXG4gKiAgICAgICBJbmplY3RhYmxlcy0tPj5EZWNvcmF0b3I6IFJldHVybiBpbmplY3RhYmxlIGluc3RhbmNlXG4gKiAgICAgICBvcHQgSGFzIHRyYW5zZm9ybWVyXG4gKiAgICAgICAgIERlY29yYXRvci0+PkRlY29yYXRvcjogQ2FsbCB0cmFuc2Zvcm1lclxuICogICAgICAgZW5kXG4gKiAgICAgICBEZWNvcmF0b3ItPj5EZWNvcmF0b3I6IFN0b3JlIGluIFdlYWtNYXBcbiAqICAgICAgIERlY29yYXRvci0tPj5DbGllbnQ6IFJldHVybiBpbnN0YW5jZVxuICogICAgIGVsc2UgTm8gaW5qZWN0YWJsZVxuICogICAgICAgRGVjb3JhdG9yLS0+PkNsaWVudDogVGhyb3cgZXJyb3JcbiAqICAgICBlbmRcbiAqICAgZW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3QoXG4gIGNhdGVnb3J5Pzogc3ltYm9sIHwgc3RyaW5nIHwgQ29uc3RydWN0b3IgfCBQYXJ0aWFsPEluamVjdE9wdGlvbnM+LFxuICBjZmc/OiBQYXJ0aWFsPEluamVjdE9wdGlvbnM+XG4pIHtcbiAgcmV0dXJuIERlY29yYXRpb24uZm9yKEluamVjdGFibGVzS2V5cy5JTkpFQ1QpXG4gICAgLmRlZmluZSh7IGRlY29yYXRvcjogaW5qZWN0QmFzZURlY29yYXRvciwgYXJnczogW2NhdGVnb3J5LCBjZmddIH0pXG4gICAgLmFwcGx5KCk7XG59XG4iXX0=
|
package/lib/esm/index.d.ts
CHANGED
package/lib/esm/index.js
CHANGED
|
@@ -19,6 +19,7 @@ export * from "./utils.js";
|
|
|
19
19
|
* @const VERSION
|
|
20
20
|
* @memberOf module:injectable-decorators
|
|
21
21
|
*/
|
|
22
|
-
export const VERSION = "1.6.
|
|
23
|
-
|
|
24
|
-
|
|
22
|
+
export const VERSION = "1.6.15";
|
|
23
|
+
export const PACKAGE_NAME = "##PACKAGE_NAME##";
|
|
24
|
+
Metadata.registerLibrary(PACKAGE_NAME, VERSION);
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUVILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVoRCwrQkFBNEI7QUFDNUIsZ0NBQTZCO0FBQzdCLGlDQUE4QjtBQUM5Qiw4QkFBMkI7QUFDM0IsMkJBQXdCO0FBQ3hCLDJCQUF3QjtBQUV4Qjs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUM7QUFDckMsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDO0FBQy9DLFFBQVEsQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZGVzY3JpcHRpb24gQSBsaWdodHdlaWdodCBkZXBlbmRlbmN5IGluamVjdGlvbiBsaWJyYXJ5IGZvciBUeXBlU2NyaXB0IGFwcGxpY2F0aW9ucy5cbiAqIEBzdW1tYXJ5IEFkZHMgYSBzaW1wbGUgSW5qZWN0YWJsZXMgaW1wbGVtZW50YXRpb24gdG8gY3JlYXRlIHNpbmdsZXRvbiBpbnN0YW5jZXMgb2YgYW4gb2JqZWN0XG4gKiBhbmQgZWFzaWx5IGluamVjdCBpdCBpbnRvIG90aGVyIG9iamVjdHMuIFByb3ZpZGVzIGRlY29yYXRvcnMgZm9yIG1hcmtpbmcgY2xhc3NlcyBhcyBpbmplY3RhYmxlXG4gKiBhbmQgZm9yIGluamVjdGluZyBkZXBlbmRlbmNpZXMgaW50byBjbGFzcyBwcm9wZXJ0aWVzLlxuICpcbiAqIEBtb2R1bGUgaW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cblxuaW1wb3J0IHsgTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRpb25cIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZWNvcmF0b3JzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9JbmplY3RhYmxlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmVnaXN0cnlcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3R5cGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBDdXJyZW50IHZlcnNpb24gb2YgdGhlIGluamVjdGFibGUtZGVjb3JhdG9ycyBsaWJyYXJ5LlxuICogQHN1bW1hcnkgRGVmaW5lZCBvbiBsaWJyYXJ5IGJ1aWxkLiBIb2xkcyB0aGUgbGlicmFyeSdzIGN1cnJlbnQgdmVyc2lvbiBzdHJpbmcuXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9OQU1FID0gXCIjI1BBQ0tBR0VfTkFNRSMjXCI7XG5NZXRhZGF0YS5yZWdpc3RlckxpYnJhcnkoUEFDS0FHRV9OQU1FLCBWRVJTSU9OKTtcbiJdfQ==
|
package/lib/esm/utils.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import "reflect-metadata";
|
|
2
1
|
/**
|
|
3
2
|
* @description Generates a fully qualified reflection metadata key.
|
|
4
3
|
* @summary Returns the reflection key for injectables by prefixing the provided key with the base reflection key.
|
|
@@ -8,13 +7,3 @@ import "reflect-metadata";
|
|
|
8
7
|
* @memberOf module:injectable-decorators
|
|
9
8
|
*/
|
|
10
9
|
export declare const getInjectKey: (key: string) => string;
|
|
11
|
-
/**
|
|
12
|
-
* @description Extracts the type name from a decorated property using reflection.
|
|
13
|
-
* @summary Retrieves the type from a property decorator by accessing TypeScript's reflection metadata.
|
|
14
|
-
* @param {any} model The target object containing the decorated property
|
|
15
|
-
* @param {string | symbol} propKey The property key (name or symbol) of the decorated property
|
|
16
|
-
* @return {string | undefined} The name of the property type, or undefined if it's a Function type
|
|
17
|
-
* @function getTypeFromDecorator
|
|
18
|
-
* @memberOf module:injectable-decorators
|
|
19
|
-
*/
|
|
20
|
-
export declare function getTypeFromDecorator(model: any, propKey: string | symbol): symbol | undefined;
|
package/lib/esm/utils.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import "
|
|
2
|
-
import { InjectablesKeys, TypeKey } from "./constants.js";
|
|
1
|
+
import { InjectablesKeys } from "./constants.js";
|
|
3
2
|
/**
|
|
4
3
|
* @description Generates a fully qualified reflection metadata key.
|
|
5
4
|
* @summary Returns the reflection key for injectables by prefixing the provided key with the base reflection key.
|
|
@@ -9,24 +8,4 @@ import { InjectablesKeys, TypeKey } from "./constants.js";
|
|
|
9
8
|
* @memberOf module:injectable-decorators
|
|
10
9
|
*/
|
|
11
10
|
export const getInjectKey = (key) => InjectablesKeys.REFLECT + key;
|
|
12
|
-
|
|
13
|
-
* @description Extracts the type name from a decorated property using reflection.
|
|
14
|
-
* @summary Retrieves the type from a property decorator by accessing TypeScript's reflection metadata.
|
|
15
|
-
* @param {any} model The target object containing the decorated property
|
|
16
|
-
* @param {string | symbol} propKey The property key (name or symbol) of the decorated property
|
|
17
|
-
* @return {string | undefined} The name of the property type, or undefined if it's a Function type
|
|
18
|
-
* @function getTypeFromDecorator
|
|
19
|
-
* @memberOf module:injectable-decorators
|
|
20
|
-
*/
|
|
21
|
-
export function getTypeFromDecorator(model, propKey) {
|
|
22
|
-
const typeDef = Reflect.getMetadata(TypeKey, model, propKey);
|
|
23
|
-
if (typeDef.name === "Function") {
|
|
24
|
-
return undefined;
|
|
25
|
-
}
|
|
26
|
-
const meta = Reflect.getMetadata(getInjectKey(InjectablesKeys.INJECTABLE), typeDef);
|
|
27
|
-
if (!meta) {
|
|
28
|
-
return undefined;
|
|
29
|
-
}
|
|
30
|
-
return meta.symbol;
|
|
31
|
-
}
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSx1QkFBb0I7QUFFdkQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUM7QUFFM0U7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLEtBQVUsRUFDVixPQUF3QjtJQUV4QixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDN0QsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsV0FBVyxDQUM5QixZQUFZLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxFQUN4QyxPQUFPLENBQ1IsQ0FBQztJQUNGLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7QUFDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBcInJlZmxlY3QtbWV0YWRhdGFcIjtcbmltcG9ydCB7IEluamVjdGFibGVzS2V5cywgVHlwZUtleSB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBmdWxseSBxdWFsaWZpZWQgcmVmbGVjdGlvbiBtZXRhZGF0YSBrZXkuXG4gKiBAc3VtbWFyeSBSZXR1cm5zIHRoZSByZWZsZWN0aW9uIGtleSBmb3IgaW5qZWN0YWJsZXMgYnkgcHJlZml4aW5nIHRoZSBwcm92aWRlZCBrZXkgd2l0aCB0aGUgYmFzZSByZWZsZWN0aW9uIGtleS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSB0byBiZSBwcmVmaXhlZFxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZnVsbHkgcXVhbGlmaWVkIHJlZmxlY3Rpb24ga2V5XG4gKiBAZnVuY3Rpb24gZ2V0SW5qZWN0S2V5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgZ2V0SW5qZWN0S2V5ID0gKGtleTogc3RyaW5nKSA9PiBJbmplY3RhYmxlc0tleXMuUkVGTEVDVCArIGtleTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXh0cmFjdHMgdGhlIHR5cGUgbmFtZSBmcm9tIGEgZGVjb3JhdGVkIHByb3BlcnR5IHVzaW5nIHJlZmxlY3Rpb24uXG4gKiBAc3VtbWFyeSBSZXRyaWV2ZXMgdGhlIHR5cGUgZnJvbSBhIHByb3BlcnR5IGRlY29yYXRvciBieSBhY2Nlc3NpbmcgVHlwZVNjcmlwdCdzIHJlZmxlY3Rpb24gbWV0YWRhdGEuXG4gKiBAcGFyYW0ge2FueX0gbW9kZWwgVGhlIHRhcmdldCBvYmplY3QgY29udGFpbmluZyB0aGUgZGVjb3JhdGVkIHByb3BlcnR5XG4gKiBAcGFyYW0ge3N0cmluZyB8IHN5bWJvbH0gcHJvcEtleSBUaGUgcHJvcGVydHkga2V5IChuYW1lIG9yIHN5bWJvbCkgb2YgdGhlIGRlY29yYXRlZCBwcm9wZXJ0eVxuICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdHlwZSwgb3IgdW5kZWZpbmVkIGlmIGl0J3MgYSBGdW5jdGlvbiB0eXBlXG4gKiBAZnVuY3Rpb24gZ2V0VHlwZUZyb21EZWNvcmF0b3JcbiAqIEBtZW1iZXJPZiBtb2R1bGU6aW5qZWN0YWJsZS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlRnJvbURlY29yYXRvcihcbiAgbW9kZWw6IGFueSxcbiAgcHJvcEtleTogc3RyaW5nIHwgc3ltYm9sXG4pOiBzeW1ib2wgfCB1bmRlZmluZWQge1xuICBjb25zdCB0eXBlRGVmID0gUmVmbGVjdC5nZXRNZXRhZGF0YShUeXBlS2V5LCBtb2RlbCwgcHJvcEtleSk7XG4gIGlmICh0eXBlRGVmLm5hbWUgPT09IFwiRnVuY3Rpb25cIikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgbWV0YSA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgZ2V0SW5qZWN0S2V5KEluamVjdGFibGVzS2V5cy5JTkpFQ1RBQkxFKSxcbiAgICB0eXBlRGVmXG4gICk7XG4gIGlmICghbWV0YSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIG1ldGEuc3ltYm9sO1xufVxuIl19
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSx1QkFBb0I7QUFFOUM7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlc0tleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgZnVsbHkgcXVhbGlmaWVkIHJlZmxlY3Rpb24gbWV0YWRhdGEga2V5LlxuICogQHN1bW1hcnkgUmV0dXJucyB0aGUgcmVmbGVjdGlvbiBrZXkgZm9yIGluamVjdGFibGVzIGJ5IHByZWZpeGluZyB0aGUgcHJvdmlkZWQga2V5IHdpdGggdGhlIGJhc2UgcmVmbGVjdGlvbiBrZXkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdG8gYmUgcHJlZml4ZWRcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZ1bGx5IHF1YWxpZmllZCByZWZsZWN0aW9uIGtleVxuICogQGZ1bmN0aW9uIGdldEluamVjdEtleVxuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEluamVjdEtleSA9IChrZXk6IHN0cmluZykgPT4gSW5qZWN0YWJsZXNLZXlzLlJFRkxFQ1QgKyBrZXk7XG4iXX0=
|
package/lib/index.cjs
CHANGED
|
@@ -22,7 +22,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
22
22
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
23
23
|
};
|
|
24
24
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
-
exports.VERSION = void 0;
|
|
25
|
+
exports.PACKAGE_NAME = exports.VERSION = void 0;
|
|
26
26
|
const decoration_1 = require("@decaf-ts/decoration");
|
|
27
27
|
__exportStar(require("./constants.cjs"), exports);
|
|
28
28
|
__exportStar(require("./decorators.cjs"), exports);
|
|
@@ -36,6 +36,7 @@ __exportStar(require("./utils.cjs"), exports);
|
|
|
36
36
|
* @const VERSION
|
|
37
37
|
* @memberOf module:injectable-decorators
|
|
38
38
|
*/
|
|
39
|
-
exports.VERSION = "1.6.
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
exports.VERSION = "1.6.15";
|
|
40
|
+
exports.PACKAGE_NAME = "##PACKAGE_NAME##";
|
|
41
|
+
decoration_1.Metadata.registerLibrary(exports.PACKAGE_NAME, exports.VERSION);
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7O0dBT0c7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgscURBQWdEO0FBRWhELGtEQUE0QjtBQUM1QixtREFBNkI7QUFDN0Isb0RBQThCO0FBQzlCLGlEQUEyQjtBQUMzQiw4Q0FBd0I7QUFDeEIsOENBQXdCO0FBRXhCOzs7OztHQUtHO0FBQ1UsUUFBQSxPQUFPLEdBQUcsYUFBYSxDQUFDO0FBQ3hCLFFBQUEsWUFBWSxHQUFHLGtCQUFrQixDQUFDO0FBQy9DLHFCQUFRLENBQUMsZUFBZSxDQUFDLG9CQUFZLEVBQUUsZUFBTyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkZXNjcmlwdGlvbiBBIGxpZ2h0d2VpZ2h0IGRlcGVuZGVuY3kgaW5qZWN0aW9uIGxpYnJhcnkgZm9yIFR5cGVTY3JpcHQgYXBwbGljYXRpb25zLlxuICogQHN1bW1hcnkgQWRkcyBhIHNpbXBsZSBJbmplY3RhYmxlcyBpbXBsZW1lbnRhdGlvbiB0byBjcmVhdGUgc2luZ2xldG9uIGluc3RhbmNlcyBvZiBhbiBvYmplY3RcbiAqIGFuZCBlYXNpbHkgaW5qZWN0IGl0IGludG8gb3RoZXIgb2JqZWN0cy4gUHJvdmlkZXMgZGVjb3JhdG9ycyBmb3IgbWFya2luZyBjbGFzc2VzIGFzIGluamVjdGFibGVcbiAqIGFuZCBmb3IgaW5qZWN0aW5nIGRlcGVuZGVuY2llcyBpbnRvIGNsYXNzIHByb3BlcnRpZXMuXG4gKlxuICogQG1vZHVsZSBpbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuXG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuXG5leHBvcnQgKiBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0luamVjdGFibGVzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZWdpc3RyeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdHlwZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgaW5qZWN0YWJsZS1kZWNvcmF0b3JzIGxpYnJhcnkuXG4gKiBAc3VtbWFyeSBEZWZpbmVkIG9uIGxpYnJhcnkgYnVpbGQuIEhvbGRzIHRoZSBsaWJyYXJ5J3MgY3VycmVudCB2ZXJzaW9uIHN0cmluZy5cbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgVkVSU0lPTiA9IFwiIyNWRVJTSU9OIyNcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX05BTUUgPSBcIiMjUEFDS0FHRV9OQU1FIyNcIjtcbk1ldGFkYXRhLnJlZ2lzdGVyTGlicmFyeShQQUNLQUdFX05BTUUsIFZFUlNJT04pO1xuIl19
|
package/lib/index.d.ts
CHANGED
package/lib/utils.cjs
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getInjectKey = void 0;
|
|
4
|
-
exports.getTypeFromDecorator = getTypeFromDecorator;
|
|
5
|
-
require("reflect-metadata");
|
|
6
4
|
const constants_1 = require("./constants.cjs");
|
|
7
5
|
/**
|
|
8
6
|
* @description Generates a fully qualified reflection metadata key.
|
|
@@ -14,24 +12,4 @@ const constants_1 = require("./constants.cjs");
|
|
|
14
12
|
*/
|
|
15
13
|
const getInjectKey = (key) => constants_1.InjectablesKeys.REFLECT + key;
|
|
16
14
|
exports.getInjectKey = getInjectKey;
|
|
17
|
-
|
|
18
|
-
* @description Extracts the type name from a decorated property using reflection.
|
|
19
|
-
* @summary Retrieves the type from a property decorator by accessing TypeScript's reflection metadata.
|
|
20
|
-
* @param {any} model The target object containing the decorated property
|
|
21
|
-
* @param {string | symbol} propKey The property key (name or symbol) of the decorated property
|
|
22
|
-
* @return {string | undefined} The name of the property type, or undefined if it's a Function type
|
|
23
|
-
* @function getTypeFromDecorator
|
|
24
|
-
* @memberOf module:injectable-decorators
|
|
25
|
-
*/
|
|
26
|
-
function getTypeFromDecorator(model, propKey) {
|
|
27
|
-
const typeDef = Reflect.getMetadata(constants_1.TypeKey, model, propKey);
|
|
28
|
-
if (typeDef.name === "Function") {
|
|
29
|
-
return undefined;
|
|
30
|
-
}
|
|
31
|
-
const meta = Reflect.getMetadata((0, exports.getInjectKey)(constants_1.InjectablesKeys.INJECTABLE), typeDef);
|
|
32
|
-
if (!meta) {
|
|
33
|
-
return undefined;
|
|
34
|
-
}
|
|
35
|
-
return meta.symbol;
|
|
36
|
-
}
|
|
37
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBc0JBLG9EQWdCQztBQXRDRCw0QkFBMEI7QUFDMUIsK0NBQXVEO0FBRXZEOzs7Ozs7O0dBT0c7QUFDSSxNQUFNLFlBQVksR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsMkJBQWUsQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO0FBQTlELFFBQUEsWUFBWSxnQkFBa0Q7QUFFM0U7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixvQkFBb0IsQ0FDbEMsS0FBVSxFQUNWLE9BQXdCO0lBRXhCLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsbUJBQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDN0QsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFDRCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsV0FBVyxDQUM5QixJQUFBLG9CQUFZLEVBQUMsMkJBQWUsQ0FBQyxVQUFVLENBQUMsRUFDeEMsT0FBTyxDQUNSLENBQUM7SUFDRixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG5pbXBvcnQgeyBJbmplY3RhYmxlc0tleXMsIFR5cGVLZXkgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgZnVsbHkgcXVhbGlmaWVkIHJlZmxlY3Rpb24gbWV0YWRhdGEga2V5LlxuICogQHN1bW1hcnkgUmV0dXJucyB0aGUgcmVmbGVjdGlvbiBrZXkgZm9yIGluamVjdGFibGVzIGJ5IHByZWZpeGluZyB0aGUgcHJvdmlkZWQga2V5IHdpdGggdGhlIGJhc2UgcmVmbGVjdGlvbiBrZXkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdG8gYmUgcHJlZml4ZWRcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZ1bGx5IHF1YWxpZmllZCByZWZsZWN0aW9uIGtleVxuICogQGZ1bmN0aW9uIGdldEluamVjdEtleVxuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEluamVjdEtleSA9IChrZXk6IHN0cmluZykgPT4gSW5qZWN0YWJsZXNLZXlzLlJFRkxFQ1QgKyBrZXk7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEV4dHJhY3RzIHRoZSB0eXBlIG5hbWUgZnJvbSBhIGRlY29yYXRlZCBwcm9wZXJ0eSB1c2luZyByZWZsZWN0aW9uLlxuICogQHN1bW1hcnkgUmV0cmlldmVzIHRoZSB0eXBlIGZyb20gYSBwcm9wZXJ0eSBkZWNvcmF0b3IgYnkgYWNjZXNzaW5nIFR5cGVTY3JpcHQncyByZWZsZWN0aW9uIG1ldGFkYXRhLlxuICogQHBhcmFtIHthbnl9IG1vZGVsIFRoZSB0YXJnZXQgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRlY29yYXRlZCBwcm9wZXJ0eVxuICogQHBhcmFtIHtzdHJpbmcgfCBzeW1ib2x9IHByb3BLZXkgVGhlIHByb3BlcnR5IGtleSAobmFtZSBvciBzeW1ib2wpIG9mIHRoZSBkZWNvcmF0ZWQgcHJvcGVydHlcbiAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHR5cGUsIG9yIHVuZGVmaW5lZCBpZiBpdCdzIGEgRnVuY3Rpb24gdHlwZVxuICogQGZ1bmN0aW9uIGdldFR5cGVGcm9tRGVjb3JhdG9yXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmluamVjdGFibGUtZGVjb3JhdG9yc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VHlwZUZyb21EZWNvcmF0b3IoXG4gIG1vZGVsOiBhbnksXG4gIHByb3BLZXk6IHN0cmluZyB8IHN5bWJvbFxuKTogc3ltYm9sIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdHlwZURlZiA9IFJlZmxlY3QuZ2V0TWV0YWRhdGEoVHlwZUtleSwgbW9kZWwsIHByb3BLZXkpO1xuICBpZiAodHlwZURlZi5uYW1lID09PSBcIkZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IG1ldGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgIGdldEluamVjdEtleShJbmplY3RhYmxlc0tleXMuSU5KRUNUQUJMRSksXG4gICAgdHlwZURlZlxuICApO1xuICBpZiAoIW1ldGEpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBtZXRhLnN5bWJvbDtcbn1cbiJdfQ==
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0NBQThDO0FBRTlDOzs7Ozs7O0dBT0c7QUFDSSxNQUFNLFlBQVksR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsMkJBQWUsQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDO0FBQTlELFFBQUEsWUFBWSxnQkFBa0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlc0tleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgZnVsbHkgcXVhbGlmaWVkIHJlZmxlY3Rpb24gbWV0YWRhdGEga2V5LlxuICogQHN1bW1hcnkgUmV0dXJucyB0aGUgcmVmbGVjdGlvbiBrZXkgZm9yIGluamVjdGFibGVzIGJ5IHByZWZpeGluZyB0aGUgcHJvdmlkZWQga2V5IHdpdGggdGhlIGJhc2UgcmVmbGVjdGlvbiBrZXkuXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgdG8gYmUgcHJlZml4ZWRcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGZ1bGx5IHF1YWxpZmllZCByZWZsZWN0aW9uIGtleVxuICogQGZ1bmN0aW9uIGdldEluamVjdEtleVxuICogQG1lbWJlck9mIG1vZHVsZTppbmplY3RhYmxlLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEluamVjdEtleSA9IChrZXk6IHN0cmluZykgPT4gSW5qZWN0YWJsZXNLZXlzLlJFRkxFQ1QgKyBrZXk7XG4iXX0=
|
package/lib/utils.d.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import "reflect-metadata";
|
|
2
1
|
/**
|
|
3
2
|
* @description Generates a fully qualified reflection metadata key.
|
|
4
3
|
* @summary Returns the reflection key for injectables by prefixing the provided key with the base reflection key.
|
|
@@ -8,13 +7,3 @@ import "reflect-metadata";
|
|
|
8
7
|
* @memberOf module:injectable-decorators
|
|
9
8
|
*/
|
|
10
9
|
export declare const getInjectKey: (key: string) => string;
|
|
11
|
-
/**
|
|
12
|
-
* @description Extracts the type name from a decorated property using reflection.
|
|
13
|
-
* @summary Retrieves the type from a property decorator by accessing TypeScript's reflection metadata.
|
|
14
|
-
* @param {any} model The target object containing the decorated property
|
|
15
|
-
* @param {string | symbol} propKey The property key (name or symbol) of the decorated property
|
|
16
|
-
* @return {string | undefined} The name of the property type, or undefined if it's a Function type
|
|
17
|
-
* @function getTypeFromDecorator
|
|
18
|
-
* @memberOf module:injectable-decorators
|
|
19
|
-
*/
|
|
20
|
-
export declare function getTypeFromDecorator(model: any, propKey: string | symbol): symbol | undefined;
|