jsii-docgen
Version:
generates api docs for jsii modules
419 lines • 62.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.TranspileBase = exports.TranspiledTypeReference = exports.TranspiledType = exports.UnsupportedLanguageError = exports.Language = void 0;
exports.submoduleRelName = submoduleRelName;
const schema_1 = require("../schema");
/**
* Supported languages to generate documentation in.
*/
class Language {
/**
* Transform a literal string to the `Language` object.
*
* Throws an `UnsupportedLanguageError` if the language is not supported.
*/
static fromString(lang) {
switch (lang) {
case Language.TYPESCRIPT.name:
case Language.TYPESCRIPT.targetName:
return Language.TYPESCRIPT;
case Language.PYTHON.name:
case Language.PYTHON.targetName:
return Language.PYTHON;
case Language.JAVA.name:
case Language.JAVA.targetName:
return Language.JAVA;
case Language.CSHARP.name:
case Language.CSHARP.targetName:
return Language.CSHARP;
case Language.GO.name:
case Language.GO.targetName:
return Language.GO;
default:
throw new UnsupportedLanguageError(lang, Language.values());
}
}
static values() {
return [Language.TYPESCRIPT, Language.PYTHON, Language.JAVA, Language.CSHARP, Language.GO];
}
constructor({ name, targetName = name, validator }) {
this.name = name;
this.targetName = targetName;
this.validator = validator;
}
isValidConfiguration(config) {
// TypeScript does not need configuration, all other languages do
if (config == null) {
return this === Language.TYPESCRIPT;
}
return this.validator(config);
}
toString() {
return this.name;
}
}
exports.Language = Language;
/**
* TypeScript.
*/
Language.TYPESCRIPT = new Language({ name: 'typescript', validator: () => true });
/**
* Python.
*/
Language.PYTHON = new Language({ name: 'python', validator: validatePythonConfig });
/**
* Java.
*/
Language.JAVA = new Language({ name: 'java', validator: validateJavaConfig });
/**
* C#
*/
Language.CSHARP = new Language({ name: 'csharp', targetName: 'dotnet', validator: validateDotNetConfig });
/**
*
* Go
*/
Language.GO = new Language({ name: 'go', targetName: 'go', validator: validateGoConfig });
function validateDotNetConfig(config) {
// See: https://aws.github.io/jsii/user-guides/lib-author/configuration/targets/dotnet/
return typeof config.namespace === 'string' && typeof config.packageId === 'string';
}
function validateJavaConfig(config) {
var _a, _b;
// See: https://aws.github.io/jsii/user-guides/lib-author/configuration/targets/java/
return typeof config.package === 'string' && typeof ((_a = config.maven) === null || _a === void 0 ? void 0 : _a.groupId) === 'string' && typeof ((_b = config.maven) === null || _b === void 0 ? void 0 : _b.artifactId) === 'string';
}
function validatePythonConfig(config) {
// See: https://aws.github.io/jsii/user-guides/lib-author/configuration/targets/python/
return typeof config.module === 'string' && typeof config.distName === 'string';
}
function validateGoConfig(config) {
// See: https://aws.github.io/jsii/user-guides/lib-author/configuration/targets/go/
return typeof config.moduleName === 'string';
}
class UnsupportedLanguageError extends Error {
constructor(lang, supported) {
super(`Unsupported language: ${lang}. Supported languages are: [${supported}]`);
}
}
exports.UnsupportedLanguageError = UnsupportedLanguageError;
/**
* Outcome of transpiling a generic jsii type.
*/
class TranspiledType {
constructor(options) {
this.source = options.source;
this.language = options.language;
this.fqn = options.fqn;
this.name = options.name;
this.namespace = options.namespace;
this.module = options.module;
this.submodule = options.submodule;
this.submodulePath = options.submodulePath;
}
toJson() {
return (0, schema_1.filterUndefined)({
fqn: this.fqn,
displayName: this.name,
id: this.source.fqn,
packageName: this.source.assembly.name,
packageVersion: this.source.assembly.version,
submodule: this.submodulePath,
});
}
}
exports.TranspiledType = TranspiledType;
/**
* Outcome of transpiling a jsii type reference.
*/
class TranspiledTypeReference {
/**
* Create a type reference that represents a primitive.
*/
static primitive(transpile, ref, primitive) {
return new TranspiledTypeReference(transpile, ref, primitive);
}
/**
* Create a type reference that represents any type.
*/
static any(transpile, ref) {
return new TranspiledTypeReference(transpile, ref, undefined, true);
}
/**
* Create a type reference that represents the void (return) type.
*/
static void(transpile, ref) {
return new TranspiledTypeReference(transpile, ref, undefined, undefined, undefined, undefined, undefined, undefined, true);
}
/**
* Create a type reference that represents a concrete type.
*/
static type(transpile, ref, type) {
return new TranspiledTypeReference(transpile, ref, undefined, undefined, type);
}
/**
* Create a type reference that represents an array of a type reference.
*/
static arrayOfType(transpile, ref, tf) {
return new TranspiledTypeReference(transpile, ref, undefined, undefined, undefined, tf);
}
/**
* Create a type reference that represents a map of a type reference.
*/
static mapOfType(transpile, ref, tf) {
return new TranspiledTypeReference(transpile, ref, undefined, undefined, undefined, undefined, tf);
}
/**
* Create a type reference that represents a union of a type references.
*/
static unionOfTypes(transpile, ref, tfs) {
return new TranspiledTypeReference(transpile, ref, undefined, undefined, undefined, undefined, undefined, tfs);
}
constructor(
/**
* A transpiler
*/
transpile,
/**
* The original type reference.
*/
ref,
/**
* Primitive type ref.
*/
primitive,
/**
* 'Any' type ref
*/
isAny,
/**
* Concrete type.
*/
type,
/**
* Array of ref.
*/
arrayOfType,
/**
* Map of ref.
*/
mapOfType,
/**
* Union of ref.
*/
unionOfTypes,
/**
* 'Void' type ref.
*/
isVoid) {
this.transpile = transpile;
this.ref = ref;
this.primitive = primitive;
this.isAny = isAny;
this.type = type;
this.arrayOfType = arrayOfType;
this.mapOfType = mapOfType;
this.unionOfTypes = unionOfTypes;
this.isVoid = isVoid;
}
toString(options) {
var _a, _b;
const tFormatter = (_a = options === null || options === void 0 ? void 0 : options.typeFormatter) !== null && _a !== void 0 ? _a : ((t) => t.fqn);
const sFormatter = (_b = options === null || options === void 0 ? void 0 : options.stringFormatter) !== null && _b !== void 0 ? _b : ((s) => s);
if (this.primitive) {
return sFormatter(this.primitive);
}
if (this.type) {
return tFormatter(this.type);
}
if (this.isAny) {
return sFormatter(this.transpile.any());
}
if (this.arrayOfType) {
const ref = this.arrayOfType.toString(options);
return this.transpile.listOf(ref);
}
if (this.mapOfType) {
const ref = this.mapOfType.toString(options);
return this.transpile.mapOf(ref);
}
if (this.unionOfTypes) {
const refs = this.unionOfTypes.map((t) => t.toString(options));
return this.transpile.unionOf(refs);
}
if (this.isVoid) {
return sFormatter(this.transpile.void());
}
throw new Error(`Invalid type reference: ${this.ref.toString()}`);
}
toJson() {
if (this.primitive) {
return {
formattingPattern: this.primitive,
};
}
if (this.type) {
if (!this.ref.fqn) {
throw new Error(`Original type reference for ${this.type.fqn} does not have a fqn.`);
}
// If we are running in a test, report a fake stable version since types
// may belong to dependency packages, which could be specified with caret
// dependencies - this means the packageVersion of a type like
// `construct.Construct` will be set to whichever version is installed.
// This is okay in practice, but makes snapshot tests inconsistent.
const IS_TEST_RUN = process.env.NODE_ENV === 'test';
const packageVersion = IS_TEST_RUN ? '99.99.99' : this.type.source.assembly.version;
return {
formattingPattern: '%',
types: [
(0, schema_1.filterUndefined)({
id: this.ref.fqn,
displayName: this.type.name,
fqn: this.type.fqn,
packageName: this.type.source.assembly.name,
packageVersion,
submodule: this.type.submodulePath,
}),
],
};
}
if (this.isAny) {
return {
formattingPattern: this.transpile.any(),
};
}
if (this.arrayOfType) {
return {
formattingPattern: this.transpile.listOf('%'),
types: [this.arrayOfType.toJson()],
};
}
if (this.mapOfType) {
return {
formattingPattern: this.transpile.mapOf('%'),
types: [this.mapOfType.toJson()],
};
}
if (this.unionOfTypes) {
const inner = Array(this.unionOfTypes.length).fill('%');
return {
formattingPattern: this.transpile.unionOf(inner),
types: this.unionOfTypes.map((t) => t.toJson()),
};
}
throw new Error(`Invalid type reference: ${this.ref.toString()}`);
}
}
exports.TranspiledTypeReference = TranspiledTypeReference;
/**
* Common functionality between different transpilers.
*/
class TranspileBase {
constructor(language) {
this.language = language;
this.parentModulesCache = new Map();
this.submodulesCache = new Map();
}
typeReference(ref) {
if (ref.type) {
const transpiled = this.type(ref.type);
return TranspiledTypeReference.type(this, ref, transpiled);
}
if (ref.unionOfTypes) {
const transpiled = ref.unionOfTypes.map((t) => this.typeReference(t));
return TranspiledTypeReference.unionOfTypes(this, ref, transpiled);
}
if (ref.arrayOfType) {
const transpiled = this.typeReference(ref.arrayOfType);
return TranspiledTypeReference.arrayOfType(this, ref, transpiled);
}
if (ref.mapOfType) {
const transpiled = this.typeReference(ref.mapOfType);
return TranspiledTypeReference.mapOfType(this, ref, transpiled);
}
if (ref.isAny) {
return TranspiledTypeReference.any(this, ref);
}
if (ref.primitive) {
let transpiled;
switch (ref.primitive) {
case 'string':
transpiled = this.str();
break;
case 'boolean':
transpiled = this.boolean();
break;
case 'number':
transpiled = this.number();
break;
case 'date':
transpiled = this.date();
break;
case 'json':
transpiled = this.json();
break;
default:
throw new Error(`Unsupported primitive type '${ref.primitive}'`);
}
return TranspiledTypeReference.primitive(this, ref, transpiled);
}
if (ref.void) {
return TranspiledTypeReference.void(this, ref);
}
throw new Error(`Unsupported type: ${ref.toString()}`);
}
findSubmodule(type) {
if (this.submodulesCache.has(type.fqn)) {
return this.submodulesCache.get(type.fqn);
}
let submodule = undefined;
if (type.namespace) {
// if the type is in a submodule, the submodule name is the first
// part of the namespace. we construct the full submodule fqn and search for it.
const submoduleFqn = `${type.assembly.name}.${type.namespace.split('.')[0]}`;
const submodules = type.assembly.allSubmodules.filter((s) => s.fqn === submoduleFqn);
if (submodules.length > 1) {
// can never happen, but the array data structure forces this handling.
throw new Error(`Found multiple submodules with fqn ${submoduleFqn}`);
}
if (submodules.length === 0) {
submodule = undefined;
}
// type is inside this submodule.
submodule = submodules[0];
}
this.submodulesCache.set(type.fqn, submodule);
return submodule;
}
getParentModule(moduleLike) {
const cached = this.parentModulesCache.get(moduleLike.fqn);
if (cached)
return cached;
const types = moduleLike.types;
if (types.length === 0) {
throw new Error(`unable to determine assembly since module does not have any types: ${moduleLike.fqn}`);
}
const parent = types[0].assembly;
this.parentModulesCache.set(moduleLike.fqn, parent);
return parent;
}
optionalityCompare(p1, p2) {
if (!p1.optional && p2.optional) {
return -1;
}
if (!p2.optional && p1.optional) {
return 1;
}
return 0;
}
}
exports.TranspileBase = TranspileBase;
/**
* Return the root-relative name for a submodule
*
* Ex: for a submodule `asm.sub1.sub2`, return `sub1.sub2`.
*/
function submoduleRelName(submodule) {
return submodule.fqn.split('.').slice(1).join('.');
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNwaWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2RvY2dlbi90cmFuc3BpbGUvdHJhbnNwaWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWc1QkEsNENBRUM7QUFqNUJELHNDQUFvRTtBQUVwRTs7R0FFRztBQUNILE1BQWEsUUFBUTtJQTJCbkI7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBWTtRQUNuQyxRQUFRLElBQUksRUFBRSxDQUFDO1lBQ2IsS0FBSyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztZQUM5QixLQUFLLFFBQVEsQ0FBQyxVQUFVLENBQUMsVUFBVTtnQkFDakMsT0FBTyxRQUFRLENBQUMsVUFBVSxDQUFDO1lBQzdCLEtBQUssUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDMUIsS0FBSyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVU7Z0JBQzdCLE9BQU8sUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUN6QixLQUFLLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBQ3hCLEtBQUssUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVO2dCQUMzQixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDdkIsS0FBSyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUMxQixLQUFLLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFBVTtnQkFDN0IsT0FBTyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQ3pCLEtBQUssUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUM7WUFDdEIsS0FBSyxRQUFRLENBQUMsRUFBRSxDQUFDLFVBQVU7Z0JBQ3pCLE9BQU8sUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNyQjtnQkFDRSxNQUFNLElBQUksd0JBQXdCLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7SUFDSCxDQUFDO0lB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QU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcmVmbGVjdCBmcm9tICdqc2lpLXJlZmxlY3QnO1xuaW1wb3J0IHsgZmlsdGVyVW5kZWZpbmVkLCBKc2lpRW50aXR5LCBUeXBlU2NoZW1hIH0gZnJvbSAnLi4vc2NoZW1hJztcblxuLyoqXG4gKiBTdXBwb3J0ZWQgbGFuZ3VhZ2VzIHRvIGdlbmVyYXRlIGRvY3VtZW50YXRpb24gaW4uXG4gKi9cbmV4cG9ydCBjbGFzcyBMYW5ndWFnZSB7XG4gIC8qKlxuICAgKiBUeXBlU2NyaXB0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBUWVBFU0NSSVBUID0gbmV3IExhbmd1YWdlKHsgbmFtZTogJ3R5cGVzY3JpcHQnLCB2YWxpZGF0b3I6ICgpID0+IHRydWUgfSk7XG5cbiAgLyoqXG4gICAqIFB5dGhvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFlUSE9OID0gbmV3IExhbmd1YWdlKHsgbmFtZTogJ3B5dGhvbicsIHZhbGlkYXRvcjogdmFsaWRhdGVQeXRob25Db25maWcgfSk7XG5cbiAgLyoqXG4gICAqIEphdmEuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEpBVkEgPSBuZXcgTGFuZ3VhZ2UoeyBuYW1lOiAnamF2YScsIHZhbGlkYXRvcjogdmFsaWRhdGVKYXZhQ29uZmlnIH0pO1xuXG4gIC8qKlxuICAgKiBDI1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBDU0hBUlAgPSBuZXcgTGFuZ3VhZ2UoeyBuYW1lOiAnY3NoYXJwJywgdGFyZ2V0TmFtZTogJ2RvdG5ldCcsIHZhbGlkYXRvcjogdmFsaWRhdGVEb3ROZXRDb25maWcgfSk7XG5cbiAgLyoqXG4gICAqXG4gICAqIEdvXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEdPID0gbmV3IExhbmd1YWdlKHsgbmFtZTogJ2dvJywgdGFyZ2V0TmFtZTogJ2dvJywgdmFsaWRhdG9yOiB2YWxpZGF0ZUdvQ29uZmlnIH0pO1xuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm0gYSBsaXRlcmFsIHN0cmluZyB0byB0aGUgYExhbmd1YWdlYCBvYmplY3QuXG4gICAqXG4gICAqIFRocm93cyBhbiBgVW5zdXBwb3J0ZWRMYW5ndWFnZUVycm9yYCBpZiB0aGUgbGFuZ3VhZ2UgaXMgbm90IHN1cHBvcnRlZC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbVN0cmluZyhsYW5nOiBzdHJpbmcpIHtcbiAgICBzd2l0Y2ggKGxhbmcpIHtcbiAgICAgIGNhc2UgTGFuZ3VhZ2UuVFlQRVNDUklQVC5uYW1lOlxuICAgICAgY2FzZSBMYW5ndWFnZS5UWVBFU0NSSVBULnRhcmdldE5hbWU6XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5UWVBFU0NSSVBUO1xuICAgICAgY2FzZSBMYW5ndWFnZS5QWVRIT04ubmFtZTpcbiAgICAgIGNhc2UgTGFuZ3VhZ2UuUFlUSE9OLnRhcmdldE5hbWU6XG4gICAgICAgIHJldHVybiBMYW5ndWFnZS5QWVRIT047XG4gICAgICBjYXNlIExhbmd1YWdlLkpBVkEubmFtZTpcbiAgICAgIGNhc2UgTGFuZ3VhZ2UuSkFWQS50YXJnZXROYW1lOlxuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuSkFWQTtcbiAgICAgIGNhc2UgTGFuZ3VhZ2UuQ1NIQVJQLm5hbWU6XG4gICAgICBjYXNlIExhbmd1YWdlLkNTSEFSUC50YXJnZXROYW1lOlxuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuQ1NIQVJQO1xuICAgICAgY2FzZSBMYW5ndWFnZS5HTy5uYW1lOlxuICAgICAgY2FzZSBMYW5ndWFnZS5HTy50YXJnZXROYW1lOlxuICAgICAgICByZXR1cm4gTGFuZ3VhZ2UuR087XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRMYW5ndWFnZUVycm9yKGxhbmcsIExhbmd1YWdlLnZhbHVlcygpKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHZhbHVlcygpIHtcbiAgICByZXR1cm4gW0xhbmd1YWdlLlRZUEVTQ1JJUFQsIExhbmd1YWdlLlBZVEhPTiwgTGFuZ3VhZ2UuSkFWQSwgTGFuZ3VhZ2UuQ1NIQVJQLCBMYW5ndWFnZS5HT107XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgdGFyZ2V0TmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHZhbGlkYXRvcjogKGNvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICB7IG5hbWUsIHRhcmdldE5hbWUgPSBuYW1lLCB2YWxpZGF0b3IgfToge1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgdGFyZ2V0TmFtZT86IHN0cmluZztcbiAgICAgIHZhbGlkYXRvcjogKGNvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IGJvb2xlYW47XG4gICAgfSxcbiAgKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLnRhcmdldE5hbWUgPSB0YXJnZXROYW1lO1xuICAgIHRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yO1xuICB9XG5cbiAgcHVibGljIGlzVmFsaWRDb25maWd1cmF0aW9uKGNvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICAvLyBUeXBlU2NyaXB0IGRvZXMgbm90IG5lZWQgY29uZmlndXJhdGlvbiwgYWxsIG90aGVyIGxhbmd1YWdlcyBkb1xuICAgIGlmIChjb25maWcgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMgPT09IExhbmd1YWdlLlRZUEVTQ1JJUFQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudmFsaWRhdG9yKGNvbmZpZyk7XG4gIH1cblxuICBwdWJsaWMgdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxuXG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRG90TmV0Q29uZmlnKGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55Pik6IGJvb2xlYW4ge1xuICAvLyBTZWU6IGh0dHBzOi8vYXdzLmdpdGh1Yi5pby9qc2lpL3VzZXItZ3VpZGVzL2xpYi1hdXRob3IvY29uZmlndXJhdGlvbi90YXJnZXRzL2RvdG5ldC9cbiAgcmV0dXJuIHR5cGVvZiBjb25maWcubmFtZXNwYWNlID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgY29uZmlnLnBhY2thZ2VJZCA9PT0gJ3N0cmluZyc7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlSmF2YUNvbmZpZyhjb25maWc6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBib29sZWFuIHtcbiAgLy8gU2VlOiBodHRwczovL2F3cy5naXRodWIuaW8vanNpaS91c2VyLWd1aWRlcy9saWItYXV0aG9yL2NvbmZpZ3VyYXRpb24vdGFyZ2V0cy9qYXZhL1xuICByZXR1cm4gdHlwZW9mIGNvbmZpZy5wYWNrYWdlID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgY29uZmlnLm1hdmVuPy5ncm91cElkID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgY29uZmlnLm1hdmVuPy5hcnRpZmFjdElkID09PSAnc3RyaW5nJztcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVQeXRob25Db25maWcoY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogYm9vbGVhbiB7XG4gIC8vIFNlZTogaHR0cHM6Ly9hd3MuZ2l0aHViLmlvL2pzaWkvdXNlci1ndWlkZXMvbGliLWF1dGhvci9jb25maWd1cmF0aW9uL3RhcmdldHMvcHl0aG9uL1xuICByZXR1cm4gdHlwZW9mIGNvbmZpZy5tb2R1bGUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBjb25maWcuZGlzdE5hbWUgPT09ICdzdHJpbmcnO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUdvQ29uZmlnKGNvbmZpZzogUmVjb3JkPHN0cmluZywgYW55Pik6IGJvb2xlYW4ge1xuICAvLyBTZWU6IGh0dHBzOi8vYXdzLmdpdGh1Yi5pby9qc2lpL3VzZXItZ3VpZGVzL2xpYi1hdXRob3IvY29uZmlndXJhdGlvbi90YXJnZXRzL2dvL1xuICByZXR1cm4gdHlwZW9mIGNvbmZpZy5tb2R1bGVOYW1lID09PSAnc3RyaW5nJztcbn1cblxuZXhwb3J0IGNsYXNzIFVuc3VwcG9ydGVkTGFuZ3VhZ2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobGFuZzogc3RyaW5nLCBzdXBwb3J0ZWQ6IExhbmd1YWdlW10pIHtcbiAgICBzdXBlcihgVW5zdXBwb3J0ZWQgbGFuZ3VhZ2U6ICR7bGFuZ30uIFN1cHBvcnRlZCBsYW5ndWFnZXMgYXJlOiBbJHtzdXBwb3J0ZWR9XWApO1xuICB9XG59XG5cbi8qKlxuICogT3V0Y29tZSBvZiB0cmFuc3BpbGluZyBhIGpzaWkgc3RydWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zcGlsZWRTdHJ1Y3Qge1xuICAvKipcbiAgICogVGhlICh0cmFuc3BpbGVkKSB0eXBlLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogVHJhbnNwaWxlZFR5cGU7XG4gIC8qKlxuICAgKiBUaGUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBpbXBvcnQgc3RhdGVtZW50IG5lZWRlZCBpbiBvcmRlciB0byB1c2UgdGhpcyBzdHJ1Y3QuXG4gICAqL1xuICByZWFkb25seSBpbXBvcnQ6IHN0cmluZztcbiAgLyoqXG4gICAqIEhvdyB0byBpbml0aWFsaXplIHRoaXMgc3RydWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgaW5pdGlhbGl6YXRpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBPdXRjb21lIG9mIHRyYW5zcGlsaW5nIGEganNpaSBjbGFzcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc3BpbGVkQ2xhc3Mge1xuICAvKipcbiAgICogVGhlICh0cmFuc3BpbGVkKSB0eXBlLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogVHJhbnNwaWxlZFR5cGU7XG4gIC8qKlxuICAgKiBUaGUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPdXRjb21lIG9mIHRyYW5zcGlsaW5nIGEganNpaSBjYWxsYWJsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc3BpbGVkQ2FsbGFibGUge1xuICAvKipcbiAgICogVGhlICh0cmFuc3BpbGVkKSBwYXJlbnQgdHlwZS5cbiAgICovXG4gIHJlYWRvbmx5IHBhcmVudFR5cGU6IFRyYW5zcGlsZWRUeXBlO1xuICAvKipcbiAgICogSG93IGEgc2lnbmF0dXJlIG9mIHRoZSBjYWxsYWJsZSBsb29rcyBsaWtlLiBJbiBzb21lIGxhbmd1YWdlc1xuICAgKiAobGlrZSBKYXZhKSwgYSBjYWxsYWJsZSBtYXkgYmUgdHJhbnNsaXRlcmF0ZWQgdG8gbXVsdGlwbGUgb3ZlcmxvYWRlZFxuICAgKiBtZXRob2RzLCBzbyB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgc2lnbmF0dXJlc1xuICAgKi9cbiAgcmVhZG9ubHkgc2lnbmF0dXJlczogc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaGUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBpbXBvcnQgc3RhdGVtZW50IG5lZWRlZCBpbiBvcmRlciB0byB1c2UgdGhpcyBjYWxsYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IGltcG9ydDogc3RyaW5nO1xuICAvKipcbiAgICogSG93IGEgaW52b2NhdGlvbnMgb2YgdGhpcyBjYWxsYWJsZSBsb29rIGxpa2UuIEluIHNvbWUgbGFuZ3VhZ2VzXG4gICAqIChsaWtlIEphdmEpLCBhIGNhbGxhYmxlIG1heSBiZSB0cmFuc2xpdGVyYXRlZCB0byBtdWx0aXBsZSBvdmVybG9hZGVkXG4gICAqIG1ldGhvZHMsIHNvIHRoZXJlIG1heSBiZSBtdWx0aXBsZSBpbnZvY2F0aW9ucy5cbiAgICovXG4gIHJlYWRvbmx5IGludm9jYXRpb25zOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFRoZSBqc2lpIHBhcmFtZXRlcnMgdGhpcyBjYWxsYWJsZSBhY2NlcHRzLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyYW1ldGVyczogcmVmbGVjdC5QYXJhbWV0ZXJbXTtcbiAgLyoqXG4gICAqIFRoZSAodHJhbnNwaWxlZCkgcmV0dXJuIHR5cGUgLSB0aGlzIGlzIHVuZGVmaW5lZCBpZiB2b2lkIG9yIGluaXRpYWxpemVyLlxuICAgKi9cbiAgcmVhZG9ubHkgcmV0dXJuVHlwZT86IFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlO1xufVxuXG4vKipcbiAqIE91dGNvbWUgb2YgdHJhbnNwaWxpbmcgYSBqc2lpIHBhcmFtZXRlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc3BpbGVkUGFyYW1ldGVyIGV4dGVuZHMgVHJhbnNwaWxlZFByb3BlcnR5IHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRoZSBwYXJhbWV0ZXIgaXMgdmFyaWFkaWMuXG4gICAqL1xuICByZWFkb25seSB2YXJpYWRpYzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPdXRjb21lIG9mIHRyYW5zcGlsaW5nIGEganNpaSBpbnRlcmZhY2UgKG5vdCBkYXRhIHR5cGUpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zcGlsZWRJbnRlcmZhY2Uge1xuICAvKipcbiAgICogVGhlICh0cmFuc3BpbGVkKSB0eXBlLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogVHJhbnNwaWxlZFR5cGU7XG4gIC8qKlxuICAgKiBUaGUgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPdXRjb21lIG9mIHRyYW5zcGlsaW5nIGEgZ2VuZXJpYyBqc2lpIHR5cGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc3BpbGVkVHlwZSB7XG5cbiAgLyoqXG4gICAqIFRoZSBzb3VyY2UgdHlwZSB0aGlzIHdhcyB0cmFuc2xpdGVyYXRlZCBmcm9tLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNvdXJjZTogcmVmbGVjdC5UeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgdHJhbnNsaXRlcmF0aW9uIGxhbmd1YWdlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGxhbmd1YWdlOiBMYW5ndWFnZTtcblxuICAvKipcbiAgICogVGhlIGxhbmd1YWdlIHNwZWNpZmljIGZxbi5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBmcW46IHN0cmluZztcbiAgLyoqXG4gICAqIFNpbXBsZSBuYW1lIG9mIHRoZSB0eXBlLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIE5hbWVzcGFjZSBvZiB0aGUgdHlwZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBuYW1lc3BhY2U/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgbGFuZ3VhZ2Ugc3BlY2lmaWMgbW9kdWxlIG5hbWUgdGhlIHR5cGUgYmVsb25ncyB0by5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBtb2R1bGU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBsYW5ndWFnZSBzcGVjaWZpYyBzdWJtb2R1bGUgbmFtZSB0aGUgdHlwZSBiZWxvbmdzIHRvLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHN1Ym1vZHVsZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBsYW5ndWFnZS1pbmRlcGVuZGVudCBuYW1lIG9mIHRoZSBzdWJtb2R1bGUgdGhlIHR5cGUgYmVsb25ncyB0by5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBzdWJtb2R1bGVQYXRoPzogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zOiB7XG4gICAgc291cmNlOiByZWZsZWN0LlR5cGU7XG4gICAgbGFuZ3VhZ2U6IExhbmd1YWdlO1xuICAgIGZxbjogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBuYW1lc3BhY2U/OiBzdHJpbmc7XG4gICAgbW9kdWxlOiBzdHJpbmc7XG4gICAgc3VibW9kdWxlPzogc3RyaW5nO1xuICAgIHN1Ym1vZHVsZVBhdGg/OiBzdHJpbmc7XG4gIH0pIHtcbiAgICB0aGlzLnNvdXJjZSA9IG9wdGlvbnMuc291cmNlO1xuICAgIHRoaXMubGFuZ3VhZ2UgPSBvcHRpb25zLmxhbmd1YWdlO1xuICAgIHRoaXMuZnFuID0gb3B0aW9ucy5mcW47XG4gICAgdGhpcy5uYW1lID0gb3B0aW9ucy5uYW1lO1xuICAgIHRoaXMubmFtZXNwYWNlID0gb3B0aW9ucy5uYW1lc3BhY2U7XG4gICAgdGhpcy5tb2R1bGUgPSBvcHRpb25zLm1vZHVsZTtcbiAgICB0aGlzLnN1Ym1vZHVsZSA9IG9wdGlvbnMuc3VibW9kdWxlO1xuICAgIHRoaXMuc3VibW9kdWxlUGF0aCA9IG9wdGlvbnMuc3VibW9kdWxlUGF0aDtcbiAgfVxuXG4gIHRvSnNvbigpOiBKc2lpRW50aXR5IHtcbiAgICByZXR1cm4gZmlsdGVyVW5kZWZpbmVkKHtcbiAgICAgIGZxbjogdGhpcy5mcW4sXG4gICAgICBkaXNwbGF5TmFtZTogdGhpcy5uYW1lLFxuICAgICAgaWQ6IHRoaXMuc291cmNlLmZxbixcbiAgICAgIHBhY2thZ2VOYW1lOiB0aGlzLnNvdXJjZS5hc3NlbWJseS5uYW1lLFxuICAgICAgcGFja2FnZVZlcnNpb246IHRoaXMuc291cmNlLmFzc2VtYmx5LnZlcnNpb24sXG4gICAgICBzdWJtb2R1bGU6IHRoaXMuc3VibW9kdWxlUGF0aCxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGhvdyB0byByZW5kZXIgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSB0eXBlIHJlZmVyZW5jZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc3BpbGVkVHlwZVJlZmVyZW5jZVRvU3RyaW5nT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUeXBlIGZvcm1hdHRlci5cbiAgICovXG4gIHR5cGVGb3JtYXR0ZXI/OiAodHlwZTogVHJhbnNwaWxlZFR5cGUpID0+IHN0cmluZztcbiAgLyoqXG4gICAqIFN0cmluZyBmb3JtYXR0ZXIuXG4gICAqL1xuICBzdHJpbmdGb3JtYXR0ZXI/OiAodHlwZU5hbWU6IHN0cmluZykgPT4gc3RyaW5nO1xufVxuXG4vKipcbiAqIE91dGNvbWUgb2YgdHJhbnNwaWxpbmcgYSBqc2lpIHR5cGUgcmVmZXJlbmNlLlxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2Uge1xuICAvKipcbiAgICogQ3JlYXRlIGEgdHlwZSByZWZlcmVuY2UgdGhhdCByZXByZXNlbnRzIGEgcHJpbWl0aXZlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBwcmltaXRpdmUoXG4gICAgdHJhbnNwaWxlOiBUcmFuc3BpbGUsXG4gICAgcmVmOiByZWZsZWN0LlR5cGVSZWZlcmVuY2UsXG4gICAgcHJpbWl0aXZlOiBzdHJpbmcsXG4gICk6IFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlIHtcbiAgICByZXR1cm4gbmV3IFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlKHRyYW5zcGlsZSwgcmVmLCBwcmltaXRpdmUpO1xuICB9XG4gIC8qKlxuICAgKiBDcmVhdGUgYSB0eXBlIHJlZmVyZW5jZSB0aGF0IHJlcHJlc2VudHMgYW55IHR5cGUuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFueShcbiAgICB0cmFuc3BpbGU6IFRyYW5zcGlsZSxcbiAgICByZWY6IHJlZmxlY3QuVHlwZVJlZmVyZW5jZSxcbiAgKTogVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2Uge1xuICAgIHJldHVybiBuZXcgVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2UodHJhbnNwaWxlLCByZWYsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHR5cGUgcmVmZXJlbmNlIHRoYXQgcmVwcmVzZW50cyB0aGUgdm9pZCAocmV0dXJuKSB0eXBlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2b2lkKFxuICAgIHRyYW5zcGlsZTogVHJhbnNwaWxlLFxuICAgIHJlZjogcmVmbGVjdC5UeXBlUmVmZXJlbmNlLFxuICApOiBUcmFuc3BpbGVkVHlwZVJlZmVyZW5jZSB7XG4gICAgcmV0dXJuIG5ldyBUcmFuc3BpbGVkVHlwZVJlZmVyZW5jZShcbiAgICAgIHRyYW5zcGlsZSxcbiAgICAgIHJlZixcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRydWUsXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgdHlwZSByZWZlcmVuY2UgdGhhdCByZXByZXNlbnRzIGEgY29uY3JldGUgdHlwZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdHlwZShcbiAgICB0cmFuc3BpbGU6IFRyYW5zcGlsZSxcbiAgICByZWY6IHJlZmxlY3QuVHlwZVJlZmVyZW5jZSxcbiAgICB0eXBlOiBUcmFuc3BpbGVkVHlwZSxcbiAgKTogVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2Uge1xuICAgIHJldHVybiBuZXcgVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2UoXG4gICAgICB0cmFuc3BpbGUsXG4gICAgICByZWYsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0eXBlLFxuICAgICk7XG4gIH1cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHR5cGUgcmVmZXJlbmNlIHRoYXQgcmVwcmVzZW50cyBhbiBhcnJheSBvZiBhIHR5cGUgcmVmZXJlbmNlLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhcnJheU9mVHlwZShcbiAgICB0cmFuc3BpbGU6IFRyYW5zcGlsZSxcbiAgICByZWY6IHJlZmxlY3QuVHlwZVJlZmVyZW5jZSxcbiAgICB0ZjogVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2UsXG4gICk6IFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlIHtcbiAgICByZXR1cm4gbmV3IFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlKFxuICAgICAgdHJhbnNwaWxlLFxuICAgICAgcmVmLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGYsXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgdHlwZSByZWZlcmVuY2UgdGhhdCByZXByZXNlbnRzIGEgbWFwIG9mIGEgdHlwZSByZWZlcmVuY2UuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG1hcE9mVHlwZShcbiAgICB0cmFuc3BpbGU6IFRyYW5zcGlsZSxcbiAgICByZWY6IHJlZmxlY3QuVHlwZVJlZmVyZW5jZSxcbiAgICB0ZjogVHJhbnNwaWxlZFR5cGVSZWZlcmVuY2UsXG4gICk6IFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlIHtcbiAgICByZXR1cm4gbmV3IFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlKFxuICAgICAgdHJhbnNwaWxlLFxuICAgICAgcmVmLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGYsXG4gICAgKTtcbiAgfVxuICAvKipcbiAgICogQ3JlYXRlIGEgdHlwZSByZWZlcmVuY2UgdGhhdCByZXByZXNlbnRzIGEgdW5pb24gb2YgYSB0eXBlIHJlZmVyZW5jZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHVuaW9uT2ZUeXBlcyhcbiAgICB0cmFuc3BpbGU6IFRyYW5zcGlsZSxcbiAgICByZWY6IHJlZmxlY3QuVHlwZVJlZmVyZW5jZSxcbiAgICB0ZnM6IFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlW10sXG4gICk6IFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlIHtcbiAgICByZXR1cm4gbmV3IFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlKFxuICAgICAgdHJhbnNwaWxlLFxuICAgICAgcmVmLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGZzLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIC8qKlxuICAgICAqIEEgdHJhbnNwaWxlclxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNwaWxlOiBUcmFuc3BpbGUsXG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmFsIHR5cGUgcmVmZXJlbmNlLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVmOiByZWZsZWN0LlR5cGVSZWZlcmVuY2UsXG4gICAgLyoqXG4gICAgICogUHJpbWl0aXZlIHR5cGUgcmVmLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJpbWl0aXZlPzogc3RyaW5nLFxuICAgIC8qKlxuICAgICAqICdBbnknIHR5cGUgcmVmXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBpc0FueT86IGJvb2xlYW4sXG4gICAgLyoqXG4gICAgICogQ29uY3JldGUgdHlwZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHR5cGU/OiBUcmFuc3BpbGVkVHlwZSxcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiByZWYuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBhcnJheU9mVHlwZT86IFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlLFxuICAgIC8qKlxuICAgICAqIE1hcCBvZiByZWYuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBtYXBPZlR5cGU/OiBUcmFuc3BpbGVkVHlwZVJlZmVyZW5jZSxcbiAgICAvKipcbiAgICAgKiBVbmlvbiBvZiByZWYuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSB1bmlvbk9mVHlwZXM/OiBUcmFuc3BpbGVkVHlwZVJlZmVyZW5jZVtdLFxuICAgIC8qKlxuICAgICAqICdWb2lkJyB0eXBlIHJlZi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGlzVm9pZD86IGJvb2xlYW4sXG4gICkge31cblxuICBwdWJsaWMgdG9TdHJpbmcob3B0aW9ucz86IFRyYW5zcGlsZWRUeXBlUmVmZXJlbmNlVG9TdHJpbmdPcHRpb25zKTogc3RyaW5nIHtcbiAgICBjb25zdCB0Rm9ybWF0dGVyID0gb3B0aW9ucz8udHlwZUZvcm1hdHRlciA/PyAoKHQpID0+IHQuZnFuKTtcbiAgICBjb25zdCBzRm9ybWF0dGVyID0gb3B0aW9ucz8uc3RyaW5nRm9ybWF0dGVyID8/ICgocykgPT4gcyk7XG4gICAgaWYgKHRoaXMucHJpbWl0aXZlKSB7XG4gICAgICByZXR1cm4gc0Zvcm1hdHRlcih0aGlzLnByaW1pdGl2ZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnR5cGUpIHtcbiAgICAgIHJldHVybiB0Rm9ybWF0dGVyKHRoaXMudHlwZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmlzQW55KSB7XG4gICAgICByZXR1cm4gc0Zvcm1hdHRlcih0aGlzLnRyYW5zcGlsZS5hbnkoKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmFycmF5T2ZUeXBlKSB7XG4gICAgICBjb25zdCByZWYgPSB0aGlzLmFycmF5T2ZUeXBlLnRvU3RyaW5nKG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNwaWxlLmxpc3RPZihyZWYpO1xuICAgIH1cbiAgICBpZiAodGhpcy5tYXBPZlR5cGUpIHtcbiAgICAgIGNvbnN0IHJlZiA9IHRoaXMubWFwT2ZUeXBlLnRvU3RyaW5nKG9wdGlvbnMpO1xuICAgICAgcmV0dXJuIHRoaXMudHJhbnNwaWxlLm1hcE9mKHJlZik7XG4gICAgfVxuICAgIGlmICh0aGlzLnVuaW9uT2ZUeXBlcykge1xuICAgICAgY29uc3QgcmVmcyA9IHRoaXMudW5pb25PZlR5cGVzLm1hcCgodCkgPT4gdC50b1N0cmluZyhvcHRpb25zKSk7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc3BpbGUudW5pb25PZihyZWZzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNWb2lkKSB7XG4gICAgICByZXR1cm4gc0Zvcm1hdHRlcih0aGlzLnRyYW5zcGlsZS52b2lkKCkpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdHlwZSByZWZlcmVuY2U6ICR7dGhpcy5yZWYudG9TdHJpbmcoKX1gKTtcbiAgfVxuXG4gIHB1YmxpYyB0b0pzb24oKTogVHlwZVNjaGVtYSB7XG4gICAgaWYgKHRoaXMucHJpbWl0aXZlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBmb3JtYXR0aW5nUGF0dGVybjogdGhpcy5wcmltaXRpdmUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmICh0aGlzLnR5cGUpIHtcbiAgICAgIGlmICghdGhpcy5yZWYuZnFuKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgT3JpZ2luYWwgdHlwZSByZWZlcmVuY2UgZm9yICR7dGhpcy50eXBlLmZxbn0gZG9lcyBub3QgaGF2ZSBhIGZxbi5gKTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgd2UgYXJlIHJ1bm5pbmcgaW4gYSB0ZXN0LCByZXBvcnQgYSBmYWtlIHN0YWJsZSB2ZXJzaW9uIHNpbmNlIHR5cGVzXG4gICAgICAvLyBtYXkgYmVsb25nIHRvIGRlcGVuZGVuY3kgcGFja2FnZXMsIHdoaWNoIGNvdWxkIGJlIHNwZWNpZmllZCB3aXRoIGNhcmV0XG4gICAgICAvLyBkZXBlbmRlbmNpZXMgLSB0aGlzIG1lYW5zIHRoZSBwYWNrYWdlVmVyc2lvbiBvZiBhIHR5cGUgbGlrZVxuICAgICAgLy8gYGNvbnN0cnVjdC5Db25zdHJ1Y3RgIHdpbGwgYmUgc2V0IHRvIHdoaWNoZXZlciB2ZXJzaW9uIGlzIGluc3RhbGxlZC5cbiAgICAgIC8vIFRoaXMgaXMgb2theSBpbiBwcmFjdGljZSwgYnV0IG1ha2VzIHNuYXBzaG90IHRlc3RzIGluY29uc2lzdGVudC5cbiAgICAgIGNvbnN0IElTX1RFU1RfUlVOID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICd0ZXN0JztcbiAgICAgIGNvbnN0IHBhY2thZ2VWZXJzaW9uID0gSVNfVEVTVF9SVU4gPyAnOTkuOTkuOTknIDogdGhpcy50eXBlLnNvdXJjZS5hc3NlbWJseS52ZXJzaW9uO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBmb3JtYXR0aW5nUGF0dGVybjogJyUnLFxuICAgICAgICB0eXBlczogW1xuICAgICAgICAgIGZpbHRlclVuZGVmaW5lZCh7XG4gICAgICAgICAgICBpZDogdGhpcy5yZWYuZnFuLFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6IHRoaXMudHlwZS5uYW1lLFxuICAgICAgICAgICAgZnFuOiB0aGlzLnR5cGUuZnFuLFxuICAgICAgICAgICAgcGFja2FnZU5hbWU6IHRoaXMudHlwZS5zb3VyY2UuYXNzZW1ibHkubmFtZSxcbiAgICAgICAgICAgIHBhY2thZ2VWZXJzaW9uLFxuICAgICAgICAgICAgc3VibW9kdWxlOiB0aGlzLnR5cGUuc3VibW9kdWxlUGF0aCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaXNBbnkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZvcm1hdHRpbmdQYXR0ZXJuOiB0aGlzLnRyYW5zcGlsZS5hbnkoKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYXJyYXlPZlR5cGUpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZvcm1hdHRpbmdQYXR0ZXJuOiB0aGlzLnRyYW5zcGlsZS5saXN0T2YoJyUnKSxcbiAgICAgICAgdHlwZXM6IFt0aGlzLmFycmF5T2ZUeXBlLnRvSnNvbigpXSxcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICh0aGlzLm1hcE9mVHlwZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZm9ybWF0dGluZ1BhdHRlcm46IHRoaXMudHJhbnNwaWxlLm1hcE9mKCclJyksXG4gICAgICAgIHR5cGVzOiBbdGhpcy5tYXBPZlR5cGUudG9Kc29uKCldLFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMudW5pb25PZlR5cGVzKSB7XG4gICAgICBjb25zdCBpbm5lciA9IEFycmF5KHRoaXMudW5pb25PZlR5cGVzLmxlbmd0aCkuZmlsbCgnJScpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZm9ybWF0dGluZ1BhdHRlcm46IHRoaXMudHJhbnNwaWxlLnVuaW9uT2YoaW5uZXIpLFxuICAgICAgICB0eXBlczogdGhpcy51bmlvbk9mVHlwZXMubWFwKCh0KSA9PiB0LnRvSnNvbigpKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHR5cGUgcmVmZXJlbmNlOiAke3RoaXMucmVmLnRvU3RyaW5nKCl9YC