ems-web-app-cognito 1.0.13 → 1.0.24
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/esm2020/lib/cognito.classes.mjs +23 -1
- package/esm2020/lib/cognito.component.mjs +16 -3
- package/esm2020/lib/cognito.service.mjs +55 -8
- package/fesm2015/ems-web-app-cognito.mjs +121 -39
- package/fesm2015/ems-web-app-cognito.mjs.map +1 -1
- package/fesm2020/ems-web-app-cognito.mjs +116 -35
- package/fesm2020/ems-web-app-cognito.mjs.map +1 -1
- package/lib/cognito.classes.d.ts +7 -0
- package/lib/cognito.component.d.ts +5 -1
- package/lib/cognito.service.d.ts +4 -1
- package/package.json +3 -2
|
@@ -22,4 +22,26 @@ CognitoStrings.labelMagicLink = "Email me a magic link";
|
|
|
22
22
|
CognitoStrings.labelPasskeys = "Use a passkey";
|
|
23
23
|
CognitoStrings.labelPasskeyEnter = "Enter the code that was just emailed to you.";
|
|
24
24
|
CognitoStrings.labelPasswordRequirement = "Must be at least 8 characters and contain a number, special character, uppercase and lowercase letter.";
|
|
25
|
-
|
|
25
|
+
export class EphemeralStorage {
|
|
26
|
+
constructor() {
|
|
27
|
+
this._cache = {};
|
|
28
|
+
}
|
|
29
|
+
getItem(key) {
|
|
30
|
+
console.log(`getting: ${key}: ${this._cache[key]}`, this._cache);
|
|
31
|
+
return this._cache[key];
|
|
32
|
+
}
|
|
33
|
+
setItem(key, value) {
|
|
34
|
+
console.log(`setting: ${key}: ${value}`);
|
|
35
|
+
this._cache[key] = value;
|
|
36
|
+
return this.getItem(key);
|
|
37
|
+
}
|
|
38
|
+
removeItem(key) {
|
|
39
|
+
delete this._cache[key];
|
|
40
|
+
console.log(`deleting: ${key}`, this._cache);
|
|
41
|
+
}
|
|
42
|
+
clear() {
|
|
43
|
+
this._cache = {};
|
|
44
|
+
console.log(`clearing`, this._cache);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nbml0by5jbGFzc2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jb2duaXRvLmNsYXNzZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLGNBQWM7O0FBQ1gsNkNBQThCLEdBQVksMERBQTBELENBQUM7QUFDckcscUNBQXNCLEdBQVcseURBQXlELENBQUM7QUFDM0Ysb0NBQXFCLEdBQVcsc0hBQXNILENBQUM7QUFDdkosMkJBQVksR0FBVyw4REFBOEQsQ0FBQztBQUN0RixnQ0FBaUIsR0FBVyxvREFBb0QsQ0FBQztBQUNqRixnQ0FBaUIsR0FBVyw4Q0FBOEMsQ0FBQztBQUMzRSx5QkFBVSxHQUFXLGVBQWUsQ0FBQztBQUNyQyw0QkFBYSxHQUFXLFVBQVUsQ0FBQztBQUNuQyxrQ0FBbUIsR0FBVyxpQkFBaUIsQ0FBQztBQUNoRCwrQkFBZ0IsR0FBVyxjQUFjLENBQUM7QUFDMUMsbUNBQW9CLEdBQVcsa0JBQWtCLENBQUM7QUFDbEQsc0NBQXVCLEdBQVcsc0JBQXNCLENBQUM7QUFDekQsMEJBQVcsR0FBVyxRQUFRLENBQUM7QUFDL0Isd0JBQVMsR0FBVyxNQUFNLENBQUM7QUFDM0IseUJBQVUsR0FBVyxPQUFPLENBQUM7QUFDN0Isc0NBQXVCLEdBQVcsdUJBQXVCLENBQUM7QUFDMUQsdUJBQVEsR0FBVyxvQ0FBb0MsQ0FBQztBQUN4RCw0QkFBYSxHQUFXLDhDQUE4QyxDQUFDO0FBQ3ZFLDZCQUFjLEdBQVcsdUJBQXVCLENBQUM7QUFDakQsNEJBQWEsR0FBVyxlQUFlLENBQUM7QUFDeEMsZ0NBQWlCLEdBQVcsOENBQThDLENBQUE7QUFDMUUsdUNBQXdCLEdBQVcsd0dBQXdHLENBQUM7QUFJNUosTUFBTSxPQUFPLGdCQUFnQjtJQUE3QjtRQUNTLFdBQU0sR0FBUSxFQUFFLENBQUM7SUFzQjFCLENBQUM7SUFwQkEsT0FBTyxDQUFDLEdBQVc7UUFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQsT0FBTyxDQUFDLEdBQVcsRUFBRSxLQUFVO1FBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxHQUFHLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUN6QixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELFVBQVUsQ0FBQyxHQUFXO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxLQUFLO1FBQ0osSUFBSSxDQUFDLE1BQU0sR0FBRSxFQUFFLENBQUM7UUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBDb2duaXRvU3RyaW5ncyB7XG5cdCBwdWJsaWMgc3RhdGljIG9uVXNlclBhc3N3b3JkQ2hhbmdlU3VjY2Vzc2Z1bDogc3RyaW5nICA9IFwiVXBkYXRlIHN1Y2Nlc3NmdWwuIFBsZWFzZSBsb2cgaW4gd2l0aCB5b3VyIG5ldyBwYXNzd29yZC5cIjtcblx0IHB1YmxpYyBzdGF0aWMgb25WZXJpZmljYXRpb25Db2RlU2VudDogc3RyaW5nID0gXCJFbnRlciB5b3VyIGVtYWlsIGJlbG93IHRvIGdlbmVyYXRlIGEgdmVyaWZpY2F0aW9uIGNvZGUuXCI7XG5cdCBwdWJsaWMgc3RhdGljIG9uTmV3UGFzc3dvcmRSZXF1aXJlZDogc3RyaW5nID0gXCJZb3UgbmVlZCB0byBjcmVhdGUgYSBuZXcgcGFzc3dvcmQuIFBsZWFzZSBjaGVjayB5b3VyIGVtYWlsIGZvciBhIHZlcmlmaWNhdGlvbiBjb2RlIGFuZCB0aGVuIGNvbXBsZXRlIHRoZSBmb3JtIGJlbG93LlwiO1xuXHQgcHVibGljIHN0YXRpYyBvbkZpcnN0TG9naW46IHN0cmluZyA9IFwiUGxlYXNlIGNvbXBsZXRlIHRoZSBmaWVsZHMgYmVsb3cgdG8gZmluaXNoIGFjY291bnQgY3JlYXRpb24uXCI7XG5cdCBwdWJsaWMgc3RhdGljIG9uVG9vTWFueUF0dGVtcHRzOiBzdHJpbmcgPSBcIlRvbyBtYW55IGF0dGVtcHRzLiBQbGVhc2UgdHJ5IGFnYWluIGluIDE1IG1pbnV0ZXMuXCI7XG5cdCBwdWJsaWMgc3RhdGljIG9uUGFzc3dvcmRVcGRhdGVkOiBzdHJpbmcgPSBcIllvdXIgcGFzc3dvcmQgaGFzIGJlZW4gdXBkYXRlZCBzdWNjZXNzZnVsbHkuXCI7XG5cdCBwdWJsaWMgc3RhdGljIGxhYmVsRW1haWw6IHN0cmluZyA9IFwiRW1haWwgQWRkcmVzc1wiO1xuXHQgcHVibGljIHN0YXRpYyBsYWJlbFBhc3N3b3JkOiBzdHJpbmcgPSBcIlBhc3N3b3JkXCI7XG5cdCBwdWJsaWMgc3RhdGljIGxhYmVsRm9yZ290UGFzc3dvcmQ6IHN0cmluZyA9IFwiRm9yZ290IFBhc3N3b3JkXCI7XG5cdCBwdWJsaWMgc3RhdGljIGxhYmVsTmV3UGFzc3dvcmQ6IHN0cmluZyA9IFwiTmV3IFBhc3N3b3JkXCI7XG5cdCBwdWJsaWMgc3RhdGljIGxhYmVsQ3VycmVudFBhc3N3b3JkOiBzdHJpbmcgPSBcIkN1cnJlbnQgUGFzc3dvcmRcIjtcblx0IHB1YmxpYyBzdGF0aWMgbGFiZWxDb25maXJtTmV3UGFzc3dvcmQ6IHN0cmluZyA9IFwiQ29uZmlybSBOZXcgUGFzc3dvcmRcIjtcblx0IHB1YmxpYyBzdGF0aWMgbGFiZWxTdWJtaXQ6IHN0cmluZyA9IFwiU3VibWl0XCI7XG5cdCBwdWJsaWMgc3RhdGljIGxhYmVsQ29kZTogc3RyaW5nID0gXCJDb2RlXCI7XG5cdCBwdWJsaWMgc3RhdGljIGxhYmVsQ2xvc2U6IHN0cmluZyA9IFwiQ2xvc2VcIjtcblx0IHB1YmxpYyBzdGF0aWMgbGFiZWxVc2VSZWd1bGFyUGFzc3dvcmQ6IHN0cmluZyA9IFwiVXNlIFN0YW5kYXJkIFBhc3N3b3JkXCI7XG5cdCBwdWJsaWMgc3RhdGljIGxhYmVsT3RwOiBzdHJpbmcgPSBcIkVtYWlsIG1lIGEgT25lIFRpbWUgUGFzc3dvcmQgKE9UUClcIjtcblx0IHB1YmxpYyBzdGF0aWMgbGFiZWxPdHBFbnRlcjogc3RyaW5nID0gXCJFbnRlciB0aGUgY29kZSB0aGF0IHdhcyBqdXN0IGVtYWlsZWQgdG8geW91LlwiO1xuXHQgcHVibGljIHN0YXRpYyBsYWJlbE1hZ2ljTGluazogc3RyaW5nID0gXCJFbWFpbCBtZSBhIG1hZ2ljIGxpbmtcIjtcblx0IHB1YmxpYyBzdGF0aWMgbGFiZWxQYXNza2V5czogc3RyaW5nID0gXCJVc2UgYSBwYXNza2V5XCI7XG5cdCBwdWJsaWMgc3RhdGljIGxhYmVsUGFzc2tleUVudGVyOiBzdHJpbmcgPSBcIkVudGVyIHRoZSBjb2RlIHRoYXQgd2FzIGp1c3QgZW1haWxlZCB0byB5b3UuXCJcblx0IHB1YmxpYyBzdGF0aWMgbGFiZWxQYXNzd29yZFJlcXVpcmVtZW50OiBzdHJpbmcgPSBcIk11c3QgYmUgYXQgbGVhc3QgOCBjaGFyYWN0ZXJzIGFuZCBjb250YWluIGEgbnVtYmVyLCBzcGVjaWFsIGNoYXJhY3RlciwgdXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UgbGV0dGVyLlwiO1xufVxuXG5cbmV4cG9ydCBjbGFzcyBFcGhlbWVyYWxTdG9yYWdlIHtcblx0cHJpdmF0ZSBfY2FjaGU6IGFueSA9IHt9O1xuXG5cdGdldEl0ZW0oa2V5OiBzdHJpbmcpOiBhbnkge1xuXHRcdGNvbnNvbGUubG9nKGBnZXR0aW5nOiAke2tleX06ICR7dGhpcy5fY2FjaGVba2V5XX1gLCB0aGlzLl9jYWNoZSk7XG5cdFx0cmV0dXJuIHRoaXMuX2NhY2hlW2tleV07XG5cdH1cblxuXHRzZXRJdGVtKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTpzdHJpbmcge1xuXHRcdGNvbnNvbGUubG9nKGBzZXR0aW5nOiAke2tleX06ICR7dmFsdWV9YCk7XG5cdFx0dGhpcy5fY2FjaGVba2V5XSA9IHZhbHVlO1xuXHRcdHJldHVybiB0aGlzLmdldEl0ZW0oa2V5KTtcblx0fVxuXG5cdHJlbW92ZUl0ZW0oa2V5OiBzdHJpbmcpIHtcblx0XHRkZWxldGUgdGhpcy5fY2FjaGVba2V5XTtcblx0XHRjb25zb2xlLmxvZyhgZGVsZXRpbmc6ICR7a2V5fWAsIHRoaXMuX2NhY2hlKTtcblx0fVxuXG5cdGNsZWFyKCkge1xuXHRcdHRoaXMuX2NhY2hlPSB7fTtcblx0XHRjb25zb2xlLmxvZyhgY2xlYXJpbmdgLCB0aGlzLl9jYWNoZSk7XG5cdH1cbn0iXX0=
|
|
@@ -23,6 +23,7 @@ export class CognitoComponent {
|
|
|
23
23
|
this.magicLink = false;
|
|
24
24
|
this.reloadAfterLinkAuthentication = true;
|
|
25
25
|
this.passkeys = false;
|
|
26
|
+
this.useLocalStorage = true;
|
|
26
27
|
this.onReady = new EventEmitter();
|
|
27
28
|
this.onConnecting = new EventEmitter();
|
|
28
29
|
this.onAuthenticated = new EventEmitter();
|
|
@@ -44,7 +45,7 @@ export class CognitoComponent {
|
|
|
44
45
|
this.user = null;
|
|
45
46
|
}
|
|
46
47
|
ngOnInit() {
|
|
47
|
-
this.cognito.initialize(this.poolId, this.clientId);
|
|
48
|
+
this.cognito.initialize(this.poolId, this.clientId, this.useLocalStorage, this.idToken, this.accessToken, this.refreshToken);
|
|
48
49
|
this.cognito.form$.subscribe(form => {
|
|
49
50
|
this.formType = form;
|
|
50
51
|
this.showCurrentForm();
|
|
@@ -493,7 +494,7 @@ export class CognitoComponent {
|
|
|
493
494
|
}
|
|
494
495
|
}
|
|
495
496
|
CognitoComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: CognitoComponent, deps: [{ token: i1.CognitoService }], target: i0.ɵɵFactoryTarget.Component });
|
|
496
|
-
CognitoComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: CognitoComponent, selector: "cognito", inputs: { poolId: ["pool-id", "poolId"], providerName: ["provider-name", "providerName"], clientId: ["client-id", "clientId"], cognitoUrl: ["cognito-signin-url", "cognitoUrl"], region: "region", modalBackground: ["modal-background", "modalBackground"], zIndex: ["z-index", "zIndex"], hook: "hook", srp: "srp", otp: "otp", magicLink: ["magic-link", "magicLink"], magicLinkGenerator: ["magic-link-generator", "magicLinkGenerator"], reloadAfterLinkAuthentication: ["reload-after-link-authentication", "reloadAfterLinkAuthentication"], passkeys: "passkeys", getUserId: ["passkeys-get-user-id", "getUserId"], generateAuthenticationOptions: ["passkeys-generate-authentication-options", "generateAuthenticationOptions"], generateRegistrationOptions: ["passkeys-generate-registration-options", "generateRegistrationOptions"], verifyRegistration: ["passkeys-verify-registration", "verifyRegistration"], verifyAuthentication: ["passkeys-verify-authentication", "verifyAuthentication"] }, outputs: { onReady: "ready", onConnecting: "connecting", onAuthenticated: "authenticated", onResponse: "response", onUsernameEntered: "usernameEntered" }, host: { properties: { "style": "this.hostStyle", "class.render": "this.showForm", "class.transitioning": "this.transitioning" } }, ngImport: i0, template: "<form *ngIf=\"showForm && formType === CognitoFormType.Login\" class=\"cognito-form\" (submit)=\"login()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div *ngIf=\"prompt\" class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ strings.labelEmail }}</label>\n\t\t<input id=\"username\" class=\"cognito-input cognito-text\" type=\"text\" name=\"username\" [(ngModel)]=\"model.username\" [disabled]=\"disableUsername\"/>\n\t</div>\n\t<div *ngIf=\"!srp && !otp && !passkeys && !magicLink && showEmailSubmitButton\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"onEnterUsername()\" [disabled]=\"!model.username\">{{ strings.labelSubmit }}</button>\n\t</div>\n\t<div *ngIf=\"srp && !showPasswordField\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"showPasswordField = true; otp = false; magicLink = false; passkeys = false\" [disabled]=\"!model.username\">{{ strings.labelUseRegularPassword }}</button>\n\t</div>\n\t<div *ngIf=\"srp && showPasswordField\" class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"password\">{{ strings.labelPassword }}</label>\n\t\t<input id=\"password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password\" [(ngModel)]=\"model.password\"/>\n\t</div>\n\t<div *ngIf=\"srp && showPasswordField\" class=\"cognito-buttons\">\n\t\t<button type=\"button\" class=\"a\" (click)=\"onForgotPassword($event)\">{{ strings.labelForgotPassword }}</button>\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [value]=\"strings.labelSubmit\"/>\n\t</div>\n\t<div *ngIf=\"otp && model.showChallengeEntry\" class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"otp\">{{ strings.labelOtpEnter }}</label>\n\t\t<input id=\"otp\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"text\" name=\"otp\" [(ngModel)]=\"model.otp\"/>\n\t</div>\n\t<div *ngIf=\"passkeys && model.showChallengeEntry\" class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"passkey-reg\">{{ strings.labelPasskeyEnter }}</label>\n\t\t<textarea id=\"passkey-reg\" autocomplete=\"off\" class=\"cognito-input cognito-text\" name=\"passkey-reg\" [(ngModel)]=\"model.passkey\"></textarea>\n\t</div>\n\t<div *ngIf=\"otp\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"getOtp()\" [disabled]=\"!model.username\">{{ model.showChallengeEntry ? strings.labelSubmit : strings.labelOtp }}</button>\n\t</div>\t\n\t<div *ngIf=\"magicLink\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"getMagicLink()\" [disabled]=\"!model.username\">{{ strings.labelMagicLink }}</button>\n\t</div>\t\n\t<div *ngIf=\"passkeys\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"getPasskey()\" [disabled]=\"!model.username\">{{ model.showChallengeEntry ? strings.labelSubmit : strings.labelPasskeys }}</button>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.NewUser\" class=\"cognito-form\" (submit)=\"onNewUser()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ strings.labelEmail }}</label>\n\t\t<input id=\"username\" class=\"cognito-input cognito-text\" type=\"text\" name=\"username\" [(ngModel)]=\"model.username\" disabled />\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label no-mb\" for=\"new-password\">{{ strings.labelNewPassword }}</label>\n\t\t<p class=\"cognito-sublabel\">{{ strings.labelPasswordRequirement }}</p>\n\t\t<input id=\"new-password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-new\" [(ngModel)]=\"model.newPassword\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"password-confirm\">{{ strings.labelConfirmNewPassword }}</label>\n\t\t<input id=\"password-confirm\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-confirm\" [(ngModel)]=\"model.newPasswordConfirm\"/>\n\t</div>\n\t<div class=\"cognito-formrow\" *ngFor=\"let row of rows\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ row.label|labeler }}</label>\n\t\t<input [id]=\"row.key\" class=\"cognito-input cognito-text\" type=\"text\" [name]=\"row.key\" [(ngModel)]=\"model[row.key]\"/>\n\t</div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [disabled]=\"newUserFormDisabled()\" [value]=\"strings.labelSubmit\"/>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.ForcePasswordReset\" class=\"cognito-form\" (submit)=\"onForcePasswordReset()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div *ngIf=\"prompt\" class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ strings.labelEmail }}</label>\n\t\t<input id=\"username\" class=\"cognito-input cognito-text\" type=\"text\" name=\"username\" [(ngModel)]=\"model.username\" disabled />\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"code\">{{ strings.labelCode }}</label>\n\t\t<input id=\"code\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"text\" name=\"code\" [(ngModel)]=\"model.code\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"new-password\">{{ strings.labelNewPassword }}</label>\n\t\t<p class=\"cognito-sublabel\">{{ strings.labelPasswordRequirement }}</p>\n\t\t<input id=\"new-password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-new\" [(ngModel)]=\"model.newPassword\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"password-confirm\">{{ strings.labelConfirmNewPassword }}</label>\n\t\t<input id=\"password-confirm\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-confirm\" [(ngModel)]=\"model.newPasswordConfirm\"/>\n\t</div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [disabled]=\"newUserFormDisabled()\" [value]=\"strings.labelSubmit\"/>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.UserVerificationRequest\" class=\"cognito-form\" (submit)=\"onRequestVerificationCode()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div *ngIf=\"prompt\" class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ strings.labelEmail }}</label>\n\t\t<input id=\"username\" class=\"cognito-input cognito-text\" type=\"text\" name=\"username\" [(ngModel)]=\"model.username\"/>\n\t</div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [disabled]=\"!model.username\" [value]=\"strings.labelSubmit\"/>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.UserPasswordReset\" class=\"cognito-form\" (submit)=\"onUserPasswordReset()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div *ngIf=\"prompt\" class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"current-password\">{{ strings.labelCurrentPassword }}</label>\n\t\t<input id=\"current-password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password\" [(ngModel)]=\"model.password\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"new-password\">{{ strings.labelNewPassword }}</label>\n\t\t<p class=\"cognito-sublabel\">{{ strings.labelPasswordRequirement }}</p>\n\t\t<input id=\"new-password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-new\" [(ngModel)]=\"model.newPassword\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"password-confirm\">{{ strings.labelConfirmNewPassword }}</label>\n\t\t<input id=\"password-confirm\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-confirm\" [(ngModel)]=\"model.newPasswordConfirm\"/>\n\t</div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [disabled]=\"newUserFormDisabled()\" [value]=\"strings.labelSubmit\"/>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.PasswordUpdateSuccessful\" class=\"cognito-form\" (submit)=\"showForm = false\">\n\t<div class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [value]=\"strings.labelClose\"/>\n\t</div>\t\n</form>", styles: [":host{position:fixed;top:0;left:0;right:0;bottom:0;display:flex;z-index:0;opacity:0;justify-content:center;align-items:center;pointer-events:none;color:#4d4d4d}:host p{margin:0;padding:0}:host.render{opacity:1;transition:opacity 1s;pointer-events:auto}.cognito-form{position:relative;background:white;transition:all .25s;box-sizing:border-box;padding:2rem 1rem;width:calc(100% - 2rem);max-height:calc(100% - 2rem);max-width:30rem;overflow:auto;border:solid 1px #ccc;box-shadow:0 0 8px 2px #0000000d}:host.transitioning .cognito-form{opacity:0;transition:all .25s;pointer-events:none}.cognito-form .button.close{position:absolute;right:1rem;top:1rem;width:1rem;height:1rem;overflow:hidden;cursor:pointer;display:flex;align-items:center;justify-content:center;-webkit-appearance:none;appearance:none;background:none;border:solid 1px #ccc}.cognito-form .button.close .buttontext{position:absolute;opacity:0}.cognito-form .button.close:after{content:\"x\"}.cognito-form .prompt{font-weight:700;font-style:italic;margin-bottom:1rem;text-align:center}.cognito-form .error{font-style:italic;color:red;text-align:center;margin-top:1rem}.cognito-label{display:block;text-transform:uppercase;font-family:inherit;font-size:.875rem;font-weight:700}:host p.cognito-sublabel{font-size:14px;font-style:italic;margin-left:1rem}.cognito-text{display:block;width:100%;font-size:1.125rem;padding:.25rem;box-sizing:border-box;color:inherit;font-family:inherit;margin-top:.5rem}.cognito-formrow+.cognito-formrow{margin-top:1.25rem}.cognito-buttons{margin-top:2rem;text-align:center}.cognito-buttons button+button,.cognito-buttons button+input{margin-left:2rem}.cognito-buttons button.a{-webkit-appearance:none;appearance:none;background:none;border:0;text-decoration:underline;cursor:pointer}#passkey-reg{resize:none;height:8rem}\n"], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "labeler": i4.LabelerPipe } });
|
|
497
|
+
CognitoComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: CognitoComponent, selector: "cognito", inputs: { poolId: ["pool-id", "poolId"], providerName: ["provider-name", "providerName"], clientId: ["client-id", "clientId"], cognitoUrl: ["cognito-signin-url", "cognitoUrl"], region: "region", modalBackground: ["modal-background", "modalBackground"], zIndex: ["z-index", "zIndex"], hook: "hook", srp: "srp", otp: "otp", magicLink: ["magic-link", "magicLink"], magicLinkGenerator: ["magic-link-generator", "magicLinkGenerator"], reloadAfterLinkAuthentication: ["reload-after-link-authentication", "reloadAfterLinkAuthentication"], passkeys: "passkeys", useLocalStorage: "useLocalStorage", idToken: "idToken", accessToken: "accessToken", refreshToken: "refreshToken", getUserId: ["passkeys-get-user-id", "getUserId"], generateAuthenticationOptions: ["passkeys-generate-authentication-options", "generateAuthenticationOptions"], generateRegistrationOptions: ["passkeys-generate-registration-options", "generateRegistrationOptions"], verifyRegistration: ["passkeys-verify-registration", "verifyRegistration"], verifyAuthentication: ["passkeys-verify-authentication", "verifyAuthentication"] }, outputs: { onReady: "ready", onConnecting: "connecting", onAuthenticated: "authenticated", onResponse: "response", onUsernameEntered: "usernameEntered" }, host: { properties: { "style": "this.hostStyle", "class.render": "this.showForm", "class.transitioning": "this.transitioning" } }, ngImport: i0, template: "<form *ngIf=\"showForm && formType === CognitoFormType.Login\" class=\"cognito-form\" (submit)=\"login()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div *ngIf=\"prompt\" class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ strings.labelEmail }}</label>\n\t\t<input id=\"username\" class=\"cognito-input cognito-text\" type=\"text\" name=\"username\" [(ngModel)]=\"model.username\" [disabled]=\"disableUsername\"/>\n\t</div>\n\t<div *ngIf=\"!srp && !otp && !passkeys && !magicLink && showEmailSubmitButton\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"onEnterUsername()\" [disabled]=\"!model.username\">{{ strings.labelSubmit }}</button>\n\t</div>\n\t<div *ngIf=\"srp && !showPasswordField\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"showPasswordField = true; otp = false; magicLink = false; passkeys = false\" [disabled]=\"!model.username\">{{ strings.labelUseRegularPassword }}</button>\n\t</div>\n\t<div *ngIf=\"srp && showPasswordField\" class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"password\">{{ strings.labelPassword }}</label>\n\t\t<input id=\"password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password\" [(ngModel)]=\"model.password\"/>\n\t</div>\n\t<div *ngIf=\"srp && showPasswordField\" class=\"cognito-buttons\">\n\t\t<button type=\"button\" class=\"a\" (click)=\"onForgotPassword($event)\">{{ strings.labelForgotPassword }}</button>\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [value]=\"strings.labelSubmit\"/>\n\t</div>\n\t<div *ngIf=\"otp && model.showChallengeEntry\" class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"otp\">{{ strings.labelOtpEnter }}</label>\n\t\t<input id=\"otp\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"text\" name=\"otp\" [(ngModel)]=\"model.otp\"/>\n\t</div>\n\t<div *ngIf=\"passkeys && model.showChallengeEntry\" class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"passkey-reg\">{{ strings.labelPasskeyEnter }}</label>\n\t\t<textarea id=\"passkey-reg\" autocomplete=\"off\" class=\"cognito-input cognito-text\" name=\"passkey-reg\" [(ngModel)]=\"model.passkey\"></textarea>\n\t</div>\n\t<div *ngIf=\"otp\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"getOtp()\" [disabled]=\"!model.username\">{{ model.showChallengeEntry ? strings.labelSubmit : strings.labelOtp }}</button>\n\t</div>\t\n\t<div *ngIf=\"magicLink\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"getMagicLink()\" [disabled]=\"!model.username\">{{ strings.labelMagicLink }}</button>\n\t</div>\t\n\t<div *ngIf=\"passkeys\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"getPasskey()\" [disabled]=\"!model.username\">{{ model.showChallengeEntry ? strings.labelSubmit : strings.labelPasskeys }}</button>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.NewUser\" class=\"cognito-form\" (submit)=\"onNewUser()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ strings.labelEmail }}</label>\n\t\t<input id=\"username\" class=\"cognito-input cognito-text\" type=\"text\" name=\"username\" [(ngModel)]=\"model.username\" disabled />\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label no-mb\" for=\"new-password\">{{ strings.labelNewPassword }}</label>\n\t\t<p class=\"cognito-sublabel\">{{ strings.labelPasswordRequirement }}</p>\n\t\t<input id=\"new-password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-new\" [(ngModel)]=\"model.newPassword\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"password-confirm\">{{ strings.labelConfirmNewPassword }}</label>\n\t\t<input id=\"password-confirm\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-confirm\" [(ngModel)]=\"model.newPasswordConfirm\"/>\n\t</div>\n\t<div class=\"cognito-formrow\" *ngFor=\"let row of rows\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ row.label|labeler }}</label>\n\t\t<input [id]=\"row.key\" class=\"cognito-input cognito-text\" type=\"text\" [name]=\"row.key\" [(ngModel)]=\"model[row.key]\"/>\n\t</div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [disabled]=\"newUserFormDisabled()\" [value]=\"strings.labelSubmit\"/>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.ForcePasswordReset\" class=\"cognito-form\" (submit)=\"onForcePasswordReset()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div *ngIf=\"prompt\" class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ strings.labelEmail }}</label>\n\t\t<input id=\"username\" class=\"cognito-input cognito-text\" type=\"text\" name=\"username\" [(ngModel)]=\"model.username\" disabled />\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"code\">{{ strings.labelCode }}</label>\n\t\t<input id=\"code\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"text\" name=\"code\" [(ngModel)]=\"model.code\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"new-password\">{{ strings.labelNewPassword }}</label>\n\t\t<p class=\"cognito-sublabel\">{{ strings.labelPasswordRequirement }}</p>\n\t\t<input id=\"new-password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-new\" [(ngModel)]=\"model.newPassword\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"password-confirm\">{{ strings.labelConfirmNewPassword }}</label>\n\t\t<input id=\"password-confirm\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-confirm\" [(ngModel)]=\"model.newPasswordConfirm\"/>\n\t</div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [disabled]=\"newUserFormDisabled()\" [value]=\"strings.labelSubmit\"/>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.UserVerificationRequest\" class=\"cognito-form\" (submit)=\"onRequestVerificationCode()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div *ngIf=\"prompt\" class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ strings.labelEmail }}</label>\n\t\t<input id=\"username\" class=\"cognito-input cognito-text\" type=\"text\" name=\"username\" [(ngModel)]=\"model.username\"/>\n\t</div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [disabled]=\"!model.username\" [value]=\"strings.labelSubmit\"/>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.UserPasswordReset\" class=\"cognito-form\" (submit)=\"onUserPasswordReset()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div *ngIf=\"prompt\" class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"current-password\">{{ strings.labelCurrentPassword }}</label>\n\t\t<input id=\"current-password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password\" [(ngModel)]=\"model.password\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"new-password\">{{ strings.labelNewPassword }}</label>\n\t\t<p class=\"cognito-sublabel\">{{ strings.labelPasswordRequirement }}</p>\n\t\t<input id=\"new-password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-new\" [(ngModel)]=\"model.newPassword\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"password-confirm\">{{ strings.labelConfirmNewPassword }}</label>\n\t\t<input id=\"password-confirm\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-confirm\" [(ngModel)]=\"model.newPasswordConfirm\"/>\n\t</div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [disabled]=\"newUserFormDisabled()\" [value]=\"strings.labelSubmit\"/>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.PasswordUpdateSuccessful\" class=\"cognito-form\" (submit)=\"showForm = false\">\n\t<div class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [value]=\"strings.labelClose\"/>\n\t</div>\t\n</form>", styles: [":host{position:fixed;top:0;left:0;right:0;bottom:0;display:flex;z-index:0;opacity:0;justify-content:center;align-items:center;pointer-events:none;color:#4d4d4d}:host p{margin:0;padding:0}:host.render{opacity:1;transition:opacity 1s;pointer-events:auto}.cognito-form{position:relative;background:white;transition:all .25s;box-sizing:border-box;padding:2rem 1rem;width:calc(100% - 2rem);max-height:calc(100% - 2rem);max-width:30rem;overflow:auto;border:solid 1px #ccc;box-shadow:0 0 8px 2px #0000000d}:host.transitioning .cognito-form{opacity:0;transition:all .25s;pointer-events:none}.cognito-form .button.close{position:absolute;right:1rem;top:1rem;width:1rem;height:1rem;overflow:hidden;cursor:pointer;display:flex;align-items:center;justify-content:center;-webkit-appearance:none;appearance:none;background:none;border:solid 1px #ccc}.cognito-form .button.close .buttontext{position:absolute;opacity:0}.cognito-form .button.close:after{content:\"x\"}.cognito-form .prompt{font-weight:700;font-style:italic;margin-bottom:1rem;text-align:center}.cognito-form .error{font-style:italic;color:red;text-align:center;margin-top:1rem}.cognito-label{display:block;text-transform:uppercase;font-family:inherit;font-size:.875rem;font-weight:700}:host p.cognito-sublabel{font-size:14px;font-style:italic;margin-left:1rem}.cognito-text{display:block;width:100%;font-size:1.125rem;padding:.25rem;box-sizing:border-box;color:inherit;font-family:inherit;margin-top:.5rem}.cognito-formrow+.cognito-formrow{margin-top:1.25rem}.cognito-buttons{margin-top:2rem;text-align:center}.cognito-buttons button+button,.cognito-buttons button+input{margin-left:2rem}.cognito-buttons button.a{-webkit-appearance:none;appearance:none;background:none;border:0;text-decoration:underline;cursor:pointer}#passkey-reg{resize:none;height:8rem}\n"], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "labeler": i4.LabelerPipe } });
|
|
497
498
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: CognitoComponent, decorators: [{
|
|
498
499
|
type: Component,
|
|
499
500
|
args: [{ selector: 'cognito', template: "<form *ngIf=\"showForm && formType === CognitoFormType.Login\" class=\"cognito-form\" (submit)=\"login()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div *ngIf=\"prompt\" class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ strings.labelEmail }}</label>\n\t\t<input id=\"username\" class=\"cognito-input cognito-text\" type=\"text\" name=\"username\" [(ngModel)]=\"model.username\" [disabled]=\"disableUsername\"/>\n\t</div>\n\t<div *ngIf=\"!srp && !otp && !passkeys && !magicLink && showEmailSubmitButton\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"onEnterUsername()\" [disabled]=\"!model.username\">{{ strings.labelSubmit }}</button>\n\t</div>\n\t<div *ngIf=\"srp && !showPasswordField\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"showPasswordField = true; otp = false; magicLink = false; passkeys = false\" [disabled]=\"!model.username\">{{ strings.labelUseRegularPassword }}</button>\n\t</div>\n\t<div *ngIf=\"srp && showPasswordField\" class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"password\">{{ strings.labelPassword }}</label>\n\t\t<input id=\"password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password\" [(ngModel)]=\"model.password\"/>\n\t</div>\n\t<div *ngIf=\"srp && showPasswordField\" class=\"cognito-buttons\">\n\t\t<button type=\"button\" class=\"a\" (click)=\"onForgotPassword($event)\">{{ strings.labelForgotPassword }}</button>\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [value]=\"strings.labelSubmit\"/>\n\t</div>\n\t<div *ngIf=\"otp && model.showChallengeEntry\" class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"otp\">{{ strings.labelOtpEnter }}</label>\n\t\t<input id=\"otp\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"text\" name=\"otp\" [(ngModel)]=\"model.otp\"/>\n\t</div>\n\t<div *ngIf=\"passkeys && model.showChallengeEntry\" class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"passkey-reg\">{{ strings.labelPasskeyEnter }}</label>\n\t\t<textarea id=\"passkey-reg\" autocomplete=\"off\" class=\"cognito-input cognito-text\" name=\"passkey-reg\" [(ngModel)]=\"model.passkey\"></textarea>\n\t</div>\n\t<div *ngIf=\"otp\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"getOtp()\" [disabled]=\"!model.username\">{{ model.showChallengeEntry ? strings.labelSubmit : strings.labelOtp }}</button>\n\t</div>\t\n\t<div *ngIf=\"magicLink\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"getMagicLink()\" [disabled]=\"!model.username\">{{ strings.labelMagicLink }}</button>\n\t</div>\t\n\t<div *ngIf=\"passkeys\" class=\"cognito-buttons\">\n\t\t<button class=\"cognito-input cognito-submit cognito-button\" type=\"button\" (click)=\"getPasskey()\" [disabled]=\"!model.username\">{{ model.showChallengeEntry ? strings.labelSubmit : strings.labelPasskeys }}</button>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.NewUser\" class=\"cognito-form\" (submit)=\"onNewUser()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ strings.labelEmail }}</label>\n\t\t<input id=\"username\" class=\"cognito-input cognito-text\" type=\"text\" name=\"username\" [(ngModel)]=\"model.username\" disabled />\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label no-mb\" for=\"new-password\">{{ strings.labelNewPassword }}</label>\n\t\t<p class=\"cognito-sublabel\">{{ strings.labelPasswordRequirement }}</p>\n\t\t<input id=\"new-password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-new\" [(ngModel)]=\"model.newPassword\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"password-confirm\">{{ strings.labelConfirmNewPassword }}</label>\n\t\t<input id=\"password-confirm\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-confirm\" [(ngModel)]=\"model.newPasswordConfirm\"/>\n\t</div>\n\t<div class=\"cognito-formrow\" *ngFor=\"let row of rows\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ row.label|labeler }}</label>\n\t\t<input [id]=\"row.key\" class=\"cognito-input cognito-text\" type=\"text\" [name]=\"row.key\" [(ngModel)]=\"model[row.key]\"/>\n\t</div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [disabled]=\"newUserFormDisabled()\" [value]=\"strings.labelSubmit\"/>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.ForcePasswordReset\" class=\"cognito-form\" (submit)=\"onForcePasswordReset()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div *ngIf=\"prompt\" class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ strings.labelEmail }}</label>\n\t\t<input id=\"username\" class=\"cognito-input cognito-text\" type=\"text\" name=\"username\" [(ngModel)]=\"model.username\" disabled />\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"code\">{{ strings.labelCode }}</label>\n\t\t<input id=\"code\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"text\" name=\"code\" [(ngModel)]=\"model.code\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"new-password\">{{ strings.labelNewPassword }}</label>\n\t\t<p class=\"cognito-sublabel\">{{ strings.labelPasswordRequirement }}</p>\n\t\t<input id=\"new-password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-new\" [(ngModel)]=\"model.newPassword\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"password-confirm\">{{ strings.labelConfirmNewPassword }}</label>\n\t\t<input id=\"password-confirm\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-confirm\" [(ngModel)]=\"model.newPasswordConfirm\"/>\n\t</div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [disabled]=\"newUserFormDisabled()\" [value]=\"strings.labelSubmit\"/>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.UserVerificationRequest\" class=\"cognito-form\" (submit)=\"onRequestVerificationCode()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div *ngIf=\"prompt\" class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"username\">{{ strings.labelEmail }}</label>\n\t\t<input id=\"username\" class=\"cognito-input cognito-text\" type=\"text\" name=\"username\" [(ngModel)]=\"model.username\"/>\n\t</div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [disabled]=\"!model.username\" [value]=\"strings.labelSubmit\"/>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.UserPasswordReset\" class=\"cognito-form\" (submit)=\"onUserPasswordReset()\">\n\t<button class=\"button close\" (click)=\"showForm=false\" type=\"button\"><span class=\"buttontext\">{{ strings.labelClose }}</span></button>\n\t<div *ngIf=\"prompt\" class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"current-password\">{{ strings.labelCurrentPassword }}</label>\n\t\t<input id=\"current-password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password\" [(ngModel)]=\"model.password\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"new-password\">{{ strings.labelNewPassword }}</label>\n\t\t<p class=\"cognito-sublabel\">{{ strings.labelPasswordRequirement }}</p>\n\t\t<input id=\"new-password\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-new\" [(ngModel)]=\"model.newPassword\"/>\n\t</div>\n\t<div class=\"cognito-formrow\">\n\t\t<label class=\"cognito-label\" for=\"password-confirm\">{{ strings.labelConfirmNewPassword }}</label>\n\t\t<input id=\"password-confirm\" autocomplete=\"off\" class=\"cognito-input cognito-text\" type=\"password\" name=\"password-confirm\" [(ngModel)]=\"model.newPasswordConfirm\"/>\n\t</div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [disabled]=\"newUserFormDisabled()\" [value]=\"strings.labelSubmit\"/>\n\t</div>\t\n\t<div *ngIf=\"error\" class=\"error\" [innerHtml]=\"error\"></div>\n</form>\n<form *ngIf=\"showForm && formType === CognitoFormType.PasswordUpdateSuccessful\" class=\"cognito-form\" (submit)=\"showForm = false\">\n\t<div class=\"prompt\" [innerHtml]=\"prompt\"></div>\n\t<div class=\"cognito-buttons\">\n\t\t<input class=\"cognito-input cognito-submit cognito-button\" type=\"submit\" [value]=\"strings.labelClose\"/>\n\t</div>\t\n</form>", styles: [":host{position:fixed;top:0;left:0;right:0;bottom:0;display:flex;z-index:0;opacity:0;justify-content:center;align-items:center;pointer-events:none;color:#4d4d4d}:host p{margin:0;padding:0}:host.render{opacity:1;transition:opacity 1s;pointer-events:auto}.cognito-form{position:relative;background:white;transition:all .25s;box-sizing:border-box;padding:2rem 1rem;width:calc(100% - 2rem);max-height:calc(100% - 2rem);max-width:30rem;overflow:auto;border:solid 1px #ccc;box-shadow:0 0 8px 2px #0000000d}:host.transitioning .cognito-form{opacity:0;transition:all .25s;pointer-events:none}.cognito-form .button.close{position:absolute;right:1rem;top:1rem;width:1rem;height:1rem;overflow:hidden;cursor:pointer;display:flex;align-items:center;justify-content:center;-webkit-appearance:none;appearance:none;background:none;border:solid 1px #ccc}.cognito-form .button.close .buttontext{position:absolute;opacity:0}.cognito-form .button.close:after{content:\"x\"}.cognito-form .prompt{font-weight:700;font-style:italic;margin-bottom:1rem;text-align:center}.cognito-form .error{font-style:italic;color:red;text-align:center;margin-top:1rem}.cognito-label{display:block;text-transform:uppercase;font-family:inherit;font-size:.875rem;font-weight:700}:host p.cognito-sublabel{font-size:14px;font-style:italic;margin-left:1rem}.cognito-text{display:block;width:100%;font-size:1.125rem;padding:.25rem;box-sizing:border-box;color:inherit;font-family:inherit;margin-top:.5rem}.cognito-formrow+.cognito-formrow{margin-top:1.25rem}.cognito-buttons{margin-top:2rem;text-align:center}.cognito-buttons button+button,.cognito-buttons button+input{margin-left:2rem}.cognito-buttons button.a{-webkit-appearance:none;appearance:none;background:none;border:0;text-decoration:underline;cursor:pointer}#passkey-reg{resize:none;height:8rem}\n"] }]
|
|
@@ -548,6 +549,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImpor
|
|
|
548
549
|
}], passkeys: [{
|
|
549
550
|
type: Input,
|
|
550
551
|
args: ["passkeys"]
|
|
552
|
+
}], useLocalStorage: [{
|
|
553
|
+
type: Input,
|
|
554
|
+
args: ["useLocalStorage"]
|
|
555
|
+
}], idToken: [{
|
|
556
|
+
type: Input,
|
|
557
|
+
args: ["idToken"]
|
|
558
|
+
}], accessToken: [{
|
|
559
|
+
type: Input,
|
|
560
|
+
args: ["accessToken"]
|
|
561
|
+
}], refreshToken: [{
|
|
562
|
+
type: Input,
|
|
563
|
+
args: ["refreshToken"]
|
|
551
564
|
}], getUserId: [{
|
|
552
565
|
type: Input,
|
|
553
566
|
args: ["passkeys-get-user-id"]
|
|
@@ -579,4 +592,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImpor
|
|
|
579
592
|
type: Output,
|
|
580
593
|
args: ["usernameEntered"]
|
|
581
594
|
}] } });
|
|
582
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nbml0by5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2NvZ25pdG8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vc3JjL2xpYi9jb2duaXRvLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsV0FBVyxFQUFpQixLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzRyxPQUFPLEVBQWUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLE1BQU8sNEJBQTRCLENBQUM7QUFFbEgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRixPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBVSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU5RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7Ozs7O0FBT2pGLE1BQU0sT0FBTyxnQkFBZ0I7SUFvRDNCLFlBQW9CLE9BQXVCO1FBQXZCLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBakRyQixjQUFTLEdBQW9DLEVBQUUsQ0FBQztRQUN6QyxhQUFRLEdBQVksS0FBSyxDQUFDO1FBQ25CLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBRzNDLGlCQUFZLEdBQVcsUUFBUSxDQUFDO1FBSTdCLG9CQUFlLEdBQVcsdUJBQXVCLENBQUM7UUFDM0QsV0FBTSxHQUFXLElBQUksQ0FBQztRQUUxQixRQUFHLEdBQVksSUFBSSxDQUFDO1FBQ3BCLFFBQUcsR0FBWSxLQUFLLENBQUM7UUFDZCxjQUFTLEdBQVksS0FBSyxDQUFDO1FBRUwsa0NBQTZCLEdBQVksSUFBSSxDQUFDO1FBQ3RF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QkFBN0IsTUFBTTt1QkFBQyxVQUFVO2dCQUNTLGlCQUFpQjtzQkFBM0MsTUFBTTt1QkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSG9zdEJpbmRpbmcsIEFmdGVyVmlld0luaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29nbml0b1NlcnZpY2UgfSBmcm9tIFwiLi9jb2duaXRvLnNlcnZpY2VcIjtcbmltcG9ydCB7IENvZ25pdG9Vc2VyLCBDb2duaXRvVXNlclNlc3Npb24sIENvZ25pdG9JZFRva2VuLCBDb2duaXRvQWNjZXNzVG9rZW4gfSAgZnJvbSAnYW1hem9uLWNvZ25pdG8taWRlbnRpdHktanMnO1xuaW1wb3J0IHsgSUNvZ25pdG9SZXNwb25zZSwgSUNvZ25pdG9Vc2VyRGF0YSB9IGZyb20gXCIuL2NvZ25pdG8uaW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgQ29nbml0b1N0cmluZ3MgfSBmcm9tIFwiLi9jb2duaXRvLmNsYXNzZXNcIjtcbmltcG9ydCB7IENvZ25pdG9SZXNwb25zZVR5cGUsIENvZ25pdG9SZXF1ZXN0VHlwZSwgQ29nbml0b0Zvcm1UeXBlIH0gZnJvbSBcIi4vY29nbml0by50eXBlc1wiO1xuaW1wb3J0IHsgdW5zbmFrZSwgdGljaywgcGFyYW1zLCB0cmltIH0gZnJvbSBcIi4vY29nbml0by51dGlsc1wiO1xuaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBzdGFydEF1dGhlbnRpY2F0aW9uLCBzdGFydFJlZ2lzdHJhdGlvbiB9IGZyb20gJ0BzaW1wbGV3ZWJhdXRobi9icm93c2VyJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnY29nbml0bycsXG4gIHRlbXBsYXRlVXJsOiBcIi4vY29nbml0by5jb21wb25lbnQuaHRtbFwiLFxuICBzdHlsZVVybHM6IFsgXCIuL2NvZ25pdG8uY29tcG9uZW50Lmxlc3NcIiBdXG59KVxuZXhwb3J0IGNsYXNzIENvZ25pdG9Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuXG5cbiAgQEhvc3RCaW5kaW5nKFwic3R5bGVcIikgaG9zdFN0eWxlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudW1iZXI+ID0ge307XG4gIEBIb3N0QmluZGluZyhcImNsYXNzLnJlbmRlclwiKSBzaG93Rm9ybTogYm9vbGVhbiA9IGZhbHNlO1xuICBASG9zdEJpbmRpbmcoXCJjbGFzcy50cmFuc2l0aW9uaW5nXCIpIHRyYW5zaXRpb25pbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoXCJwb29sLWlkXCIpIHBvb2xJZCE6IHN0cmluZztcbiAgQElucHV0KFwicHJvdmlkZXItbmFtZVwiKSBwcm92aWRlck5hbWU6IHN0cmluZyA9IFwiR29vZ2xlXCI7XG4gIEBJbnB1dChcImNsaWVudC1pZFwiKSBjbGllbnRJZCE6IHN0cmluZztcbiAgQElucHV0KFwiY29nbml0by1zaWduaW4tdXJsXCIpIGNvZ25pdG9Vcmw/OiBzdHJpbmc7XG4gIEBJbnB1dChcInJlZ2lvblwiKSByZWdpb24hOiBzdHJpbmc7XG4gIEBJbnB1dChcIm1vZGFsLWJhY2tncm91bmRcIikgbW9kYWxCYWNrZ3JvdW5kOiBzdHJpbmcgPSBcInJnYmEoMjU1LDI1NSwyNTUsMC41KVwiO1xuICBASW5wdXQoXCJ6LWluZGV4XCIpIHpJbmRleDogbnVtYmVyID0gMTAwMDtcbiAgQElucHV0KFwiaG9va1wiKSBob29rPzogKHN0YXRlOiBhbnkpID0+IFByb21pc2U8Ym9vbGVhbj47XG4gIEBJbnB1dChcInNycFwiKSBzcnA6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoXCJvdHBcIikgb3RwOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dChcIm1hZ2ljLWxpbmtcIikgbWFnaWNMaW5rOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dChcIm1hZ2ljLWxpbmstZ2VuZXJhdG9yXCIpIG1hZ2ljTGlua0dlbmVyYXRvcj86IFByb21pc2U8Ym9vbGVhbj47XG4gIEBJbnB1dChcInJlbG9hZC1hZnRlci1saW5rLWF1dGhlbnRpY2F0aW9uXCIpIHJlbG9hZEFmdGVyTGlua0F1dGhlbnRpY2F0aW9uOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KFwicGFzc2tleXNcIikgcGFzc2tleXM6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoXCJwYXNza2V5cy1nZXQtdXNlci1pZFwiKSBnZXRVc2VySWQhOiAodXNlcm5hbWU6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmc+O1xuICBASW5wdXQoXCJwYXNza2V5cy1nZW5lcmF0ZS1hdXRoZW50aWNhdGlvbi1vcHRpb25zXCIpIGdlbmVyYXRlQXV0aGVudGljYXRpb25PcHRpb25zITogKGVtYWlsOiBzdHJpbmcpID0+IFByb21pc2U8YW55PjtcbiAgQElucHV0KFwicGFzc2tleXMtZ2VuZXJhdGUtcmVnaXN0cmF0aW9uLW9wdGlvbnNcIikgZ2VuZXJhdGVSZWdpc3RyYXRpb25PcHRpb25zITogKHRva2VuOiBzdHJpbmcpID0+IFByb21pc2U8YW55PjtcbiAgQElucHV0KFwicGFzc2tleXMtdmVyaWZ5LXJlZ2lzdHJhdGlvblwiKSB2ZXJpZnlSZWdpc3RyYXRpb24hOiAoaW5wdXQ6IGFueSwgdG9rZW46IHN0cmluZyApID0+IFByb21pc2U8YW55PjtcbiAgQElucHV0KFwicGFzc2tleXMtdmVyaWZ5LWF1dGhlbnRpY2F0aW9uXCIpIHZlcmlmeUF1dGhlbnRpY2F0aW9uITogKGlucHV0OiBhbnkpID0+IFByb21pc2U8YW55PjtcblxuICBAT3V0cHV0KFwicmVhZHlcIikgb25SZWFkeTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoXCJjb25uZWN0aW5nXCIpIG9uQ29ubmVjdGluZzogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KFwiYXV0aGVudGljYXRlZFwiKSBvbkF1dGhlbnRpY2F0ZWQ6IEV2ZW50RW1pdHRlcjxJQ29nbml0b1VzZXJEYXRhIHwgbnVsbD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoXCJyZXNwb25zZVwiKSBvblJlc3BvbnNlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTsgXG4gIEBPdXRwdXQoXCJ1c2VybmFtZUVudGVyZWRcIikgb25Vc2VybmFtZUVudGVyZWQ6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHB1YmxpYyBtb2RlbDogYW55ID0geyB1c2VybmFtZTogbnVsbCwgcGFzc3dvcmQ6IG51bGx9O1xuICBwdWJsaWMgY29tcG9uZW50U3R5bGU6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4gPSB7fTtcbiAgcHVibGljIGZvcm1UeXBlOiBDb2duaXRvRm9ybVR5cGUgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIENvZ25pdG9Gb3JtVHlwZSA9IENvZ25pdG9Gb3JtVHlwZTtcbiAgcHVibGljIHJvd3M6IGFueVtdID0gW107XG4gIHB1YmxpYyBlcnJvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBwcm9tcHQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgY2FjaGU6IElDb2duaXRvUmVzcG9uc2UgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIHN0cmluZ3MgPSBDb2duaXRvU3RyaW5ncztcbiAgcHVibGljIHNob3dQYXNzd29yZEZpZWxkOiBib29sZWFuID0gdHJ1ZTtcbiAgcHVibGljIHNob3dFbWFpbFN1Ym1pdEJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG4gIHB1YmxpYyBkaXNhYmxlVXNlcm5hbWU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIHNlc3Npb246IENvZ25pdG9Vc2VyU2Vzc2lvbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHVzZXI6IENvZ25pdG9Vc2VyIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBwYXNza2V5QXV0aE9wdGlvbnM/OiBhbnk7XG4gIHB1YmxpYyBwYXNza2V5UmVnT3B0aW9ucz86IGFueTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvZ25pdG86IENvZ25pdG9TZXJ2aWNlKSB7XG4gICAgXG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBcbiAgICB0aGlzLmNvZ25pdG8uaW5pdGlhbGl6ZSh0aGlzLnBvb2xJZCwgdGhpcy5jbGllbnRJZCk7XG5cbiAgICB0aGlzLmNvZ25pdG8uZm9ybSQuc3Vic2NyaWJlKGZvcm0gPT4ge1xuICAgICAgdGhpcy5mb3JtVHlwZSA9IGZvcm07XG4gICAgICB0aGlzLnNob3dDdXJyZW50Rm9ybSgpO1xuICAgIH0pO1xuICAgIFxuICAgIHRoaXMuY29nbml0by5zZXNzaW9uJC5zdWJzY3JpYmUoc2Vzc2lvbiA9PiB7XG4gICAgICB0aGlzLnNlc3Npb24gPSBzZXNzaW9uO1xuICAgIH0pO1xuICAgIHRoaXMuY29nbml0by51c2VyJC5zdWJzY3JpYmUodXNlciA9PiB7XG4gICAgICB0aGlzLnVzZXIgPSB1c2VyO1xuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVCdXR0b25zKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmluaXRpYWxpemUoKSk7XG4gIH1cblxuICBvbkVudGVyVXNlcm5hbWUoKSB7XG4gICAgdGhpcy5zaG93RW1haWxTdWJtaXRCdXR0b24gPSBmYWxzZTtcbiAgICB0aGlzLm9uVXNlcm5hbWVFbnRlcmVkLmVtaXQodGhpcy5tb2RlbC51c2VybmFtZSEucmVwbGFjZSgvXFxzKy9naW0sXCJcIikpO1xuICB9XG5cbiAgdXBkYXRlQnV0dG9ucygpIHtcbiAgICBpZih0aGlzLm90cCB8fCB0aGlzLm1hZ2ljTGluayB8fCB0aGlzLnBhc3NrZXlzKSB7XG4gICAgICB0aGlzLnNob3dQYXNzd29yZEZpZWxkID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbG9naW4oKSB7XG5cbiAgICBpZighdGhpcy5zcnAgJiYgdGhpcy5vdHApIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE90cCgpO1xuICAgIH0gZWxzZSBpZighdGhpcy5zcnAgJiYgdGhpcy5tYWdpY0xpbmspIHtcbiAgICAgIHJldHVybiB0aGlzLmdldE1hZ2ljTGluaygpO1xuICAgIH0gZWxzZSBpZighdGhpcy5zcnAgJiYgdGhpcy5wYXNza2V5cykge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0UGFzc2tleSgpO1xuICAgIH0gZWxzZSBpZighdGhpcy5zcnApIHtcbiAgICAgIHJldHVybiB0aGlzLm9uRW50ZXJVc2VybmFtZSgpO1xuICAgIH1cblxuICAgIGxldCByZXNwb25zZTogSUNvZ25pdG9SZXNwb25zZTtcbiAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICB0aGlzLm1vZGVsLnBhc3N3b3JkID0gdHJpbSh0aGlzLm1vZGVsLnBhc3N3b3JkKTtcblxuICAgIGlmKHRoaXMuaG9vaykge1xuICAgICAgY29uc3QgcHJvY2VlZCA9IGF3YWl0IHRoaXMuaG9vayh7IFwic3RhdGVcIjogXCJiZWZvcmUtbG9naW5cIiwgbW9kZWw6IHRoaXMubW9kZWwgfSk7XG4gICAgICBpZighcHJvY2VlZCkgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMubW9kZWwudXNlcm5hbWUhLnJlcGxhY2UoL1xccysvZ2ltLFwiXCIpO1xuICAgICAgdGhpcy5vbkNvbm5lY3RpbmcuZW1pdCh0cnVlKTtcbiAgICAgIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jb2duaXRvLmF1dGhlbnRpY2F0ZSh1c2VybmFtZSwgdGhpcy5tb2RlbC5wYXNzd29yZCEpO1xuICAgIH0gY2F0Y2goZTogYW55KSB7XG4gICAgICByZXNwb25zZSA9IGU7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaGFuZGxlUmVzcG9uc2UocmVzcG9uc2UhKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRPdHAoKSB7XG4gICAgbGV0IHJlc3BvbnNlOiBJQ29nbml0b1Jlc3BvbnNlO1xuICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMub25Db25uZWN0aW5nLmVtaXQodHJ1ZSk7XG5cbiAgICAgIGNvbnN0IHVzZXJuYW1lID0gdGhpcy5tb2RlbC51c2VybmFtZSEucmVwbGFjZSgvXFxzKy9naW0sXCJcIik7XG4gICAgICBjb25zdCBvdHAgPSB0aGlzLm1vZGVsLm90cCA/IHRyaW0odGhpcy5tb2RlbC5vdHApIDogdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnNycCA9IGZhbHNlO1xuICAgICAgdGhpcy5tYWdpY0xpbmsgPSBmYWxzZTtcbiAgICAgIHRoaXMucGFzc2tleXMgPSBmYWxzZTtcblxuICAgICAgaWYodGhpcy5ob29rKSB7XG4gICAgICAgIGNvbnN0IHByb2NlZWQgPSBhd2FpdCB0aGlzLmhvb2soeyBcInN0YXRlXCI6IFwiYmVmb3JlLW90cC1yZXF1ZXN0XCIsIG1vZGVsOiB0aGlzLm1vZGVsIH0pO1xuICAgICAgICBpZighcHJvY2VlZCkgcmV0dXJuIHRoaXMuY29ubmVjdGlvbkNvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJlc3BvbnNlICA9IGF3YWl0IHRoaXMuY29nbml0by5vdHBBdXRoZW50aWNhdGUodXNlcm5hbWUsIG90cCk7XG5cbiAgICAgIGlmKHRoaXMuaG9vaykge1xuICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgY29uc3QgcHJvY2VlZCA9IGF3YWl0IHRoaXMuaG9vayh7IFwic3RhdGVcIjogXCJhZnRlci1vdHAtcmVxdWVzdFwiLCBtb2RlbDogdGhpcy5tb2RlbCwgc2Vzc2lvbklkOiByZXNwb25zZS51c2VyLlNlc3Npb24gfSk7XG4gICAgICAgIGlmKCFwcm9jZWVkKSB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gcHJvY2VlZFwiKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoKGU6IGFueSkge1xuICAgICAgcmVzcG9uc2UgPSBlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmhhbmRsZVJlc3BvbnNlKHJlc3BvbnNlISk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0TWFnaWNMaW5rKCkge1xuICAgIFxuICAgIGxldCByZXNwb25zZTogSUNvZ25pdG9SZXNwb25zZTtcbiAgICB0aGlzLmVycm9yID0gbnVsbDtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMubW9kZWwudXNlcm5hbWUhLnJlcGxhY2UoL1xccysvZ2ltLFwiXCIpO1xuICAgICAgdGhpcy5vbkNvbm5lY3RpbmcuZW1pdCh0cnVlKTtcblxuICAgICAgaWYodGhpcy5ob29rKSB7XG4gICAgICAgIGNvbnN0IHByb2NlZWQgPSBhd2FpdCB0aGlzLmhvb2soeyBcInN0YXRlXCI6IFwiYmVmb3JlLW1hZ2ljLWxpbmstcmVxdWVzdFwiLCBtb2RlbDogdGhpcy5tb2RlbCB9KTtcbiAgICAgICAgaWYoIXByb2NlZWQpIHJldHVybiB0aGlzLmNvbm5lY3Rpb25Db21wbGV0ZSgpO1xuICAgICAgfVxuXG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuY29nbml0by5tYWdpY0xpbmtBdXRoZW50aWNhdGUodXNlcm5hbWUpO1xuICAgICAgXG4gICAgICBpZih0aGlzLmhvb2spIHtcbiAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IHByb2NlZWQgPSBhd2FpdCB0aGlzLmhvb2soeyBcInN0YXRlXCI6IFwiYWZ0ZXItbWFnaWMtbGluay1yZXF1ZXN0XCIsIG1vZGVsOiB0aGlzLm1vZGVsLCBzZXNzaW9uSWQ6IHJlc3BvbnNlLnVzZXIuU2Vzc2lvbiB9KTtcbiAgICAgICAgaWYoIXByb2NlZWQpIHJldHVybiB0aGlzLmNvbm5lY3Rpb25Db21wbGV0ZSgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2goZTogYW55KSB7XG4gICAgICByZXNwb25zZSA9IGU7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbkNvbXBsZXRlKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcHJvY2Vzc01hZ2ljTGluayhlbWFpbDogc3RyaW5nLCBjb2RlOiBzdHJpbmcsIHNlc3Npb25JZDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMub25Db25uZWN0aW5nLmVtaXQodHJ1ZSk7XG4gICAgICBhd2FpdCB0aGlzLmNvZ25pdG8ubWFnaWNMaW5rQXV0aGVudGljYXRlKGVtYWlsLCBjb2RlLCBzZXNzaW9uSWQpO1xuICAgICAgaWYodGhpcy5yZWxvYWRBZnRlckxpbmtBdXRoZW50aWNhdGlvbikge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm9uQXV0aGVudGljYXRlZC5lbWl0KHRoaXMuZ2V0VXNlckRhdGEoKSk7IC8vY29ubmVjdGVkXG4gICAgICAgIHRoaXMuc2hvd0Zvcm0gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uQ29tcGxldGUoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoKGU6IGFueSkgeyB9IFxuICB9XG5cbiAgYXN5bmMgZ2V0UGFzc2tleSgpIHtcbiAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMubW9kZWwudXNlcm5hbWUhLnJlcGxhY2UoL1xccysvZ2ltLFwiXCIpO1xuICAgIHRoaXMucGFzc2tleUF1dGhPcHRpb25zID0gYXdhaXQgdGhpcy5nZW5lcmF0ZUF1dGhlbnRpY2F0aW9uT3B0aW9ucyh1c2VybmFtZSk7XG4gICAgXG4gICAgY29uc3QgY3JlZGVudGlhbHMgPSB0aGlzLnBhc3NrZXlBdXRoT3B0aW9ucz8uYWxsb3dDcmVkZW50aWFscyA/PyBbXTtcbiAgICBpZighY3JlZGVudGlhbHMubGVuZ3RoICYmICF0aGlzLm1vZGVsLnBhc3NrZXkpIHRoaXMuc2VuZFBhc3NrZXlDb2RlKCk7XG4gICAgZWxzZSBpZighY3JlZGVudGlhbHMubGVuZ3RoKSB0aGlzLnJlZ2lzdGVyUGFzc2tleSgpO1xuICAgIGVsc2UgdGhpcy51c2VQYXNza2V5KCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRQYXNza2V5Q29kZSgpIHtcbiAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMubW9kZWwudXNlcm5hbWUhLnJlcGxhY2UoL1xccysvZ2ltLFwiXCIpO1xuICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5nZXRVc2VySWQodXNlcm5hbWUpO1xuICAgIHRoaXMuc3JwID0gZmFsc2U7XG4gICAgdGhpcy5vdHAgPSBmYWxzZTtcbiAgICB0aGlzLm1hZ2ljTGluayA9IGZhbHNlO1xuICAgIHRoaXMubW9kZWwuc2hvd0NoYWxsZW5nZUVudHJ5ID0gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdXNlUGFzc2tleSgpIHtcbiAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMubW9kZWwudXNlcm5hbWUhLnJlcGxhY2UoL1xccysvZ2ltLFwiXCIpO1xuICAgIHRoaXMub25Db25uZWN0aW5nLmVtaXQodHJ1ZSk7XG4gICAgY29uc3QgYXV0aGVudGljYXRpb24gPSBhd2FpdCBzdGFydEF1dGhlbnRpY2F0aW9uKHRoaXMucGFzc2tleUF1dGhPcHRpb25zKTtcbiAgICBjb25zdCBvdXRjb21lID0gYXdhaXQgdGhpcy52ZXJpZnlBdXRoZW50aWNhdGlvbihhdXRoZW50aWNhdGlvbik7XG4gICAgYXdhaXQgdGhpcy5jb2duaXRvLnBhc3NrZXlBdXRoZW50aWNhdGUodXNlcm5hbWUpO1xuICAgIFxuICAgIGlmKG91dGNvbWUudmVyaWZpZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuY29nbml0by5wYXNza2V5QXV0aGVudGljYXRlKHVzZXJuYW1lLCBvdXRjb21lLnVpZCk7XG4gICAgICB0aGlzLm9uQXV0aGVudGljYXRlZC5lbWl0KHRoaXMuZ2V0VXNlckRhdGEoKSk7XG4gICAgICB0aGlzLnNob3dGb3JtID0gZmFsc2U7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25Db21wbGV0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJQYXNza2V5KCkge1xuICAgIGNvbnN0IHVzZXJuYW1lID0gdGhpcy5tb2RlbC51c2VybmFtZSEucmVwbGFjZSgvXFxzKy9naW0sXCJcIik7XG4gICAgY29uc3QgY29kZSA9IHRoaXMubW9kZWwucGFzc2tleSEucmVwbGFjZSgvXFxzKy9naW0sXCJcIik7XG5cbiAgICB0aGlzLm9uQ29ubmVjdGluZy5lbWl0KHRydWUpO1xuICAgIGNvbnN0IG9wdGlvbnMgPSBhd2FpdCB0aGlzLmdlbmVyYXRlUmVnaXN0cmF0aW9uT3B0aW9ucyhjb2RlKTtcbiAgICBjb25zdCByZWdpc3RyYXRpb24gPSBhd2FpdCBzdGFydFJlZ2lzdHJhdGlvbihvcHRpb25zKTtcbiAgICBjb25zdCBvdXRjb21lID0gYXdhaXQgdGhpcy52ZXJpZnlSZWdpc3RyYXRpb24ocmVnaXN0cmF0aW9uLCBjb2RlKTtcbiAgICBhd2FpdCB0aGlzLmNvZ25pdG8ucGFzc2tleUF1dGhlbnRpY2F0ZSh1c2VybmFtZSk7XG4gICAgXG4gICAgaWYob3V0Y29tZS52ZXJpZmllZCkge1xuICAgICAgYXdhaXQgdGhpcy5jb2duaXRvLnBhc3NrZXlBdXRoZW50aWNhdGUodXNlcm5hbWUsIG91dGNvbWUudWlkKTtcbiAgICAgIHRoaXMub25BdXRoZW50aWNhdGVkLmVtaXQodGhpcy5nZXRVc2VyRGF0YSgpKTtcbiAgICAgIHRoaXMuc2hvd0Zvcm0gPSBmYWxzZTtcbiAgICAgIHRoaXMuY29ubmVjdGlvbkNvbXBsZXRlKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25OZXdVc2VyKCkge1xuICAgIGxldCByZXNwb25zZTogSUNvZ25pdG9SZXNwb25zZTtcbiAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICB0aGlzLm1vZGVsLm5ld1Bhc3N3b3JkID0gdHJpbSh0aGlzLm1vZGVsLm5ld1Bhc3N3b3JkKTtcblxuICAgIGlmKHRoaXMuaG9vaykge1xuICAgICAgY29uc3QgcHJvY2VlZCA9IGF3YWl0IHRoaXMuaG9vayh7IFwic3RhdGVcIjogXCJiZWZvcmUtcmVnaXN0cmF0aW9uXCIsIG1vZGVsOiB0aGlzLm1vZGVsIH0pO1xuICAgICAgaWYoIXByb2NlZWQpIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMub25Db25uZWN0aW5nLmVtaXQodHJ1ZSk7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuY29nbml0by5jb21wbGV0ZVBhc3N3b3JkVXBkYXRlKHRoaXMubW9kZWwubmV3UGFzc3dvcmQhLCB0aGlzLmNhY2hlIS51c2VyLCB0aGlzLmdldFVzZXJBdHRyaWJ1dGVzKCkpO1xuICAgIH0gY2F0Y2goZTogYW55KSB7XG4gICAgICByZXNwb25zZSA9IGU7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaGFuZGxlUmVzcG9uc2UocmVzcG9uc2UhKTtcbiAgICB9XG5cbiAgfVxuXG4gIGFzeW5jIG9uRm9yY2VQYXNzd29yZFJlc2V0KCkge1xuICAgIFxuICAgIHRoaXMubW9kZWwuY29kZSA9IHRyaW0odGhpcy5tb2RlbC5jb2RlKTtcbiAgICB0aGlzLm1vZGVsLm5ld1Bhc3N3b3JkID0gdHJpbSh0aGlzLm1vZGVsLm5ld1Bhc3N3b3JkKTtcbiAgICB0aGlzLm9uQ29ubmVjdGluZy5lbWl0KHRydWUpO1xuXG4gICAgaWYodGhpcy5ob29rKSB7XG4gICAgICBjb25zdCBwcm9jZWVkID0gYXdhaXQgdGhpcy5ob29rKHsgXCJzdGF0ZVwiOiBcImJlZm9yZS1mb3JjZS1wYXNzd29yZC1yZXNldFwiLCBtb2RlbDogdGhpcy5tb2RlbCB9KTtcbiAgICAgIGlmKCFwcm9jZWVkKSByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY29nbml0by5jb25maXJtUGFzc3dvcmQodGhpcy5jYWNoZSEudXNlciwgdGhpcy5tb2RlbC5jb2RlLCB0aGlzLm1vZGVsLm5ld1Bhc3N3b3JkKTtcbiAgICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuICAgICAgdGhpcy50cmFuc2l0aW9uaW5nID0gdHJ1ZTtcbiAgICAgIGF3YWl0IHRpY2soMjUwKTtcbiAgICAgIHRoaXMuZm9ybVR5cGUgPSBDb2duaXRvRm9ybVR5cGUuTG9naW47XG4gICAgICB0aGlzLnNldE1lc3NhZ2luZyhyZXNwb25zZSwgQ29nbml0b1N0cmluZ3Mub25Vc2VyUGFzc3dvcmRDaGFuZ2VTdWNjZXNzZnVsKTtcbiAgICAgIGF3YWl0IHRpY2soMCk7XG4gICAgICB0aGlzLnRyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICB9IGNhdGNoKGU6IGFueSkge1xuICAgICAgdGhpcy5zZXRNZXNzYWdpbmcoZSBhcyBJQ29nbml0b1Jlc3BvbnNlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5vbkNvbm5lY3RpbmcuZW1pdChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25Vc2VyUGFzc3dvcmRSZXNldCgpIHtcblxuICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuICAgIHRoaXMub25Db25uZWN0aW5nLmVtaXQodHJ1ZSk7XG5cbiAgICB0aGlzLm1vZGVsLnBhc3N3b3JkID0gdHJpbSh0aGlzLm1vZGVsLnBhc3N3b3JkKTtcbiAgICB0aGlzLm1vZGVsLm5ld1Bhc3N3b3JkID0gdHJpbSh0aGlzLm1vZGVsLm5ld1Bhc3N3b3JkKTtcblxuICAgIGlmKHRoaXMuaG9vaykge1xuICAgICAgY29uc3QgcHJvY2VlZCA9IGF3YWl0IHRoaXMuaG9vayh7IFwic3RhdGVcIjogXCJiZWZvcmUtdXNlci1wYXNzd29yZC1yZXNldFwiLCBtb2RlbDogdGhpcy5tb2RlbCB9KTtcbiAgICAgIGlmKCFwcm9jZWVkKSByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY29nbml0by5yZXNldFBhc3N3b3JkKHRoaXMudXNlciEsIHRoaXMubW9kZWwucGFzc3dvcmQhLCB0aGlzLm1vZGVsLm5ld1Bhc3N3b3JkKTtcbiAgICAgIHRoaXMudHJhbnNpdGlvbmluZyA9IHRydWU7XG4gICAgICBhd2FpdCB0aWNrKDI1MCk7XG4gICAgICB0aGlzLmZvcm1UeXBlID0gQ29nbml0b0Zvcm1UeXBlLlBhc3N3b3JkVXBkYXRlU3VjY2Vzc2Z1bDtcbiAgICAgIHRoaXMucHJvbXB0ID0gQ29nbml0b1N0cmluZ3Mub25QYXNzd29yZFVwZGF0ZWQ7XG4gICAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICAgIGF3YWl0IHRpY2soKTtcbiAgICAgIHRoaXMudHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgIH0gY2F0Y2goZTogYW55KSB7XG4gICAgICB0aGlzLnNldE1lc3NhZ2luZyhlIGFzIElDb2duaXRvUmVzcG9uc2UpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLm9uQ29ubmVjdGluZy5lbWl0KGZhbHNlKTtcbiAgICB9XG5cbiAgfVxuXG4gIGFzeW5jIG9uRm9yZ290UGFzc3dvcmQoJGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgJGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgIFxuICAgIHRoaXMudHJhbnNpdGlvbmluZyA9IHRydWU7XG4gICAgYXdhaXQgdGljaygyNTApO1xuICAgIHRoaXMuZm9ybVR5cGUgPSBDb2duaXRvRm9ybVR5cGUuVXNlclZlcmlmaWNhdGlvblJlcXVlc3Q7XG4gICAgdGhpcy5wcm9tcHQgPSBDb2duaXRvU3RyaW5ncy5vblZlcmlmaWNhdGlvbkNvZGVTZW50O1xuICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuICAgIGF3YWl0IHRpY2soKTtcbiAgICB0aGlzLnRyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgfVxuXG4gIGFzeW5jIG9uUmVxdWVzdFZlcmlmaWNhdGlvbkNvZGUoKSB7XG5cbiAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMubW9kZWwudXNlcm5hbWUhLnJlcGxhY2UoL1xccysvZ2ltLFwiXCIpO1xuICAgIGNvbnN0IG1vZGVsID0geyB1c2VybmFtZSB9O1xuXG4gICAgaWYodGhpcy5ob29rKSB7XG4gICAgICBjb25zdCBwcm9jZWVkID0gYXdhaXQgdGhpcy5ob29rKHsgXCJzdGF0ZVwiOiBcInJlcXVlc3QtdmVyaWZpY2F0aW9uLWNvZGVcIiwgXCJ1c2VybmFtZVwiOiB1c2VybmFtZSwgbW9kZWwgfSk7XG4gICAgICBpZighcHJvY2VlZCkgcmV0dXJuO1xuICAgICAgdGhpcy5tb2RlbC51c2VybmFtZSA9IG1vZGVsLnVzZXJuYW1lO1xuICAgIH1cblxuICAgIHRoaXMub25Db25uZWN0aW5nLmVtaXQodHJ1ZSk7XG4gICAgdGhpcy5lcnJvciA9IG51bGw7XG4gICAgXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5jb2duaXRvLnJlcXVlc3RWZXJpZmljYXRpb25Db2RlKG1vZGVsLnVzZXJuYW1lKTtcbiAgICAgIHRoaXMudHJhbnNpdGlvbmluZyA9IHRydWU7XG4gICAgICBhd2FpdCB0aWNrKDI1MCk7XG4gICAgICB0aGlzLnNldE1lc3NhZ2luZyhyZXNwb25zZSwgQ29nbml0b1N0cmluZ3Mub25OZXdQYXNzd29yZFJlcXVpcmVkKTtcbiAgICAgIHRoaXMuc2hvd1Bhc3N3b3JkUmVzZXRGb3JtKHJlc3BvbnNlLCBmYWxzZSk7XG4gICAgfSBjYXRjaChlOiBhbnkpIHtcbiAgICAgIHRoaXMuc2V0TWVzc2FnaW5nKGUgYXMgSUNvZ25pdG9SZXNwb25zZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbkNvbXBsZXRlKCk7XG4gICAgfVxuICB9XG5cbiAgbmV3VXNlckZvcm1EaXNhYmxlZCgpIHtcbiAgICBsZXQgZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB0aGlzLmNhY2hlPy5yZXF1aXJlZEF0dHJpYnV0ZXM/LmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmKCF0aGlzLm1vZGVsW2tleV0pIGRpc2FibGVkID0gdHJ1ZTtcbiAgICB9KTtcblxuICAgIGlmKCF0aGlzLm1vZGVsLm5ld1Bhc3N3b3JkIHx8ICF0aGlzLm1vZGVsLm5ld1Bhc3N3b3JkQ29uZmlybSkge1xuICAgICAgZGlzYWJsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmKHRoaXMubW9kZWwubmV3UGFzc3dvcmQgIT09IHRoaXMubW9kZWwubmV3UGFzc3dvcmRDb25maXJtKSB7XG4gICAgICBkaXNhYmxlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpc2FibGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplKCkge1xuXG5cbiAgICB0cnkge1xuICAgICAgaWYodGhpcy5jb2duaXRvVXJsICYmIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiZW1zX2FjY2Vzc190b2tlblwiKSkge1xuICAgICAgICBcbiAgICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IHRoaXMuY29nbml0by5nZXRVc2VySW5mbyh0aGlzLmNvZ25pdG9VcmwpIGFzIElDb2duaXRvVXNlckRhdGE7XG5cbiAgICAgICAgLy9lbXVsYXRlIGNvZ25pdG8gdXNlci9zZXNzaW9uIGZvciBmZWRlcmF0ZWQgbG9naW5cbiAgICAgICAgdGhpcy5zZXNzaW9uID0gbmV3IENvZ25pdG9Vc2VyU2Vzc2lvbih7XG4gICAgICAgICAgSWRUb2tlbjogbmV3IENvZ25pdG9JZFRva2VuKHsgSWRUb2tlbjogaW5mby5pZFRva2VuIH0pLFxuICAgICAgICAgIEFjY2Vzc1Rva2VuOiBuZXcgQ29nbml0b0FjY2Vzc1Rva2VuKHsgQWNjZXNzVG9rZW46IGluZm8uYWNjZXNzVG9rZW4gfSksXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvZ25pdG8uY3JlYXRlRmVkZXJhdGVkU2Vzc2lvbihpbmZvLmlkVG9rZW4sIGluZm8uYWNjZXNzVG9rZW4pXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZih0aGlzLnNlc3Npb24pIHtcbiAgICAgICAgdGhpcy5vbkF1dGhlbnRpY2F0ZWQuZW1pdCh0aGlzLmdldFVzZXJEYXRhKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlUmVzcG9uc2UocmVzcG9uc2U6IElDb2duaXRvUmVzcG9uc2UpIHtcblxuICAgIHRoaXMudHJhbnNpdGlvbmluZyA9IHRydWU7XG4gICAgXG4gICAgYXdhaXQgdGljaygyNTApO1xuXG4gICAgdGhpcy5zZXRNZXNzYWdpbmcocmVzcG9uc2UpO1xuICAgIHRoaXMuY2FjaGUgPSByZXNwb25zZS51c2VyQXR0cmlidXRlcyA/IHJlc3BvbnNlIDogdGhpcy5jYWNoZTtcblxuICAgIGlmKHJlc3BvbnNlLmVycm9yPy5jb2RlID09PSBDb2duaXRvUmVzcG9uc2VUeXBlLk5vdEF1dGhvcml6ZWQgJiYgcmVzcG9uc2UucmVxdWVzdCA9PT0gQ29nbml0b1JlcXVlc3RUeXBlLkF1dGhlbnRpY2F0aW9uKSB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25Db21wbGV0ZSgpOyAvL2xpa2VseSBiYWQgcGFzc3dvcmQgb3IgdG9vIG1hbnkgYXR0ZW1wdHNcbiAgICB9IGVsc2UgaWYocmVzcG9uc2UuZXJyb3I/LmNvZGUgPT09IENvZ25pdG9SZXNwb25zZVR5cGUuRm9yY2VQYXNzd29yZFJlc2V0ICYmIHJlc3BvbnNlLnJlcXVlc3QgPT09IENvZ25pdG9SZXF1ZXN0VHlwZS5BdXRoZW50aWNhdGlvbikge1xuICAgICAgdGhpcy5pbml0aWF0ZVBhc3N3b3JkUmVzZXQocmVzcG9uc2UpOyAvL2FkbWluIGhhcyBmb3JjZWQgdXNlciBwYXNzd29yZCByZXNldFxuICAgIH0gZWxzZSBpZihyZXNwb25zZS50eXBlID09PSBDb2duaXRvUmVzcG9uc2VUeXBlLk90cENoYWxsZW5nZSkge1xuICAgICAgdGhpcy5tb2RlbC5zaG93Q2hhbGxlbmdlRW50cnkgPSB0cnVlO1xuICAgICAgdGhpcy5jb25uZWN0aW9uQ29tcGxldGUoKTtcbiAgICB9IGVsc2UgaWYocmVzcG9uc2UudHlwZSA9PT0gQ29nbml0b1Jlc3BvbnNlVHlwZS5QYXNzd29yZFJlc2V0ICYmIHJlc3BvbnNlLnJlcXVlc3QgPT09IENvZ25pdG9SZXF1ZXN0VHlwZS5BdXRoZW50aWNhdGlvbikge1xuICAgICAgdGhpcy5wcm9tcHQgPSBDb2duaXRvU3RyaW5ncy5vbkZpcnN0TG9naW47XG4gICAgICB0aGlzLnNob3dQYXNzd29yZFJlc2V0Rm9ybShyZXNwb25zZSk7IC8vbmV3IHVzZXJcbiAgICB9IGVsc2UgaWYoIXJlc3BvbnNlLmVycm9yPy5jb2RlICYmIChyZXNwb25zZS5yZXF1ZXN0ID09PSBDb2duaXRvUmVxdWVzdFR5cGUuQXV0aGVudGljYXRpb24gfHwgcmVzcG9uc2UudHlwZSA9PT0gQ29nbml0b1Jlc3BvbnNlVHlwZS5BdXRoZW50aWNhdGVkICkpIHtcbiAgICAgIHRoaXMub25BdXRoZW50aWNhdGVkLmVtaXQodGhpcy5nZXRVc2VyRGF0YSgpKTsgLy9jb25uZWN0ZWRcbiAgICAgIHRoaXMuc2hvd0Zvcm0gPSBmYWxzZTtcbiAgICAgIHRoaXMuY29ubmVjdGlvbkNvbXBsZXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbkNvbXBsZXRlKCk7IC8vdW5zdXBwb3J0ZWQgcmVzcG9uc2UgLS0gaG9wZWZ1bGx5IGRlc2NyaWJlZCBpbiBtZXNzYWdpbmdcbiAgICB9XG5cbiAgICB0aGlzLm9uUmVzcG9uc2UuZW1pdCh7IHJlc3BvbnNlLCBtb2RlbDogdGhpcy5tb2RlbCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhdGVQYXNzd29yZFJlc2V0KHJlc3BvbnNlOiBJQ29nbml0b1Jlc3BvbnNlKSB7XG4gICAgdGhpcy5lcnJvciA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY29nbml0by5mb3Jnb3RQYXNzd29yZChyZXNwb25zZS51c2VyKTtcbiAgICAgIHRoaXMuc2V0TWVzc2FnaW5nKHJlc3VsdCwgQ29nbml0b1N0cmluZ3Mub25OZXdQYXNzd29yZFJlcXVpcmVkKTtcbiAgICAgIGF3YWl0IHRpY2soMjUwKTtcbiAgICAgIHRoaXMuc2hvd1Bhc3N3b3JkUmVzZXRGb3JtKHJlc3BvbnNlLCBmYWxzZSk7XG4gICAgfSBjYXRjaChlOiBhbnkpIHtcbiAgICAgIHRoaXMuc2V0TWVzc2FnaW5nKGUgYXMgSUNvZ25pdG9SZXNwb25zZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbkNvbXBsZXRlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRNZXNzYWdpbmcocmVzcG9uc2U6IElDb2duaXRvUmVzcG9uc2UsIHByb21wdDogc3RyaW5nIHwgbnVsbCA9IG51bGwpIHtcbiAgICBpZihyZXNwb25zZS5lcnJvcj8uY29kZSA9PT0gQ29nbml0b1Jlc3BvbnNlVHlwZS5MaW1pdEV4Y2VlZGVkRXhjZXB0aW9uKSB7XG4gICAgICB0aGlzLmVycm9yID0gQ29nbml0b1N0cmluZ3Mub25Ub29NYW55QXR0ZW1wdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXJyb3IgPSByZXNwb25zZS5lcnJvcj8ubWVzc2FnZSA/PyBudWxsO1xuICAgIH1cblxuICAgIHRoaXMucHJvbXB0ID0gcHJvbXB0O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb25uZWN0aW9uQ29tcGxldGUoKSB7XG4gICAgYXdhaXQgdGljaygpO1xuICAgIHRoaXMudHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgIHRoaXMub25Db25uZWN0aW5nLmVtaXQoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzaG93Q3VycmVudEZvcm0oKSB7XG4gICAgaWYoIXRoaXMuZm9ybVR5cGUpIHJldHVybjtcblxuICAgIGlmKHRoaXMuZm9ybVR5cGUgPT09IENvZ25pdG9Gb3JtVHlwZS5Hb29nbGVTaWduSW4pIHtcbiAgICAgIHJldHVybiB0aGlzLnNpZ25JbldpdGhHb29nbGUoKTtcbiAgICB9XG5cbiAgICB0aGlzLmhvc3RTdHlsZSA9IHtcbiAgICAgIFwiYmFja2dyb3VuZFwiOiB0aGlzLm1vZGFsQmFja2dyb3VuZCxcbiAgICAgIFwiei1pbmRleFwiOiB0aGlzLnpJbmRleFxuICAgIH1cblxuICAgIGF3YWl0IHRpY2soKTtcblxuICAgIHRoaXMuc2hvd0Zvcm0gPSB0cnVlO1xuICAgIHRoaXMub25SZWFkeS5lbWl0KCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNob3dQYXNzd29yZFJlc2V0Rm9ybShyZXN1bHQ6IElDb2duaXRvUmVzcG9uc2UsIGlzTmV3VXNlcjogYm9vbGVhbiA9IHRydWUpIHtcbiAgICB0aGlzLmNhY2hlID0gcmVzdWx0O1xuICAgIHRoaXMucm93cyA9IFtdO1xuICAgIHRoaXMuZm9ybVR5cGUgPSBpc05ld1VzZXIgPyBDb2duaXRvRm9ybVR5cGUuTmV3VXNlciA6IENvZ25pdG9Gb3JtVHlwZS5Gb3JjZVBhc3N3b3JkUmVzZXQ7XG4gICAgXG4gICAgLy9idWJibGUgZmlyc3QgYW5kIGxhc3QgbmFtZSBmaWVsZHMgdG8gdGhlIHRvcCBvZiB0aGUgYXR0cmlidXRlcyBsaXN0XG4gICAgcmVzdWx0LnJlcXVpcmVkQXR0cmlidXRlcz8uc29ydCgoYSxiKSA9PiB7XG4gICAgICBpZihhID09PSBcImdpdmVuX25hbWVcIiAmJiBiID09PSBcImZhbWlseV9uYW1lXCIpIHJldHVybiAtMTtcbiAgICAgIGlmKGIgPT09IFwiZ2l2ZW5fbmFtZVwiICYmIGEgPT09IFwiZmFtaWx5X25hbWVcIikgcmV0dXJuIDE7XG4gICAgICBpZihhID09PSBcImdpdmVuX25hbWVcIikgcmV0dXJuIC0xO1xuICAgICAgaWYoYSA9PT0gXCJmYW1pbHlfbmFtZVwiKSByZXR1cm4gLSAxO1xuICAgICAgaWYoYiA9PT0gXCJnaXZlbl9uYW1lXCIpIHJldHVybiAxO1xuICAgICAgaWYoYiA9PT0gXCJmYW1pbHlfbmFtZVwiKSByZXR1cm4gMTtcbiAgICAgIHJldHVybiBhID4gYiA/IDEgOiAtMTtcbiAgICB9KTtcblxuICAgIC8vaW5qZWN0IGZvcm1yb3dzIGZvciByZXF1aXJlZCBhdHRyaWJ1dGVzXG4gICAgcmVzdWx0LnJlcXVpcmVkQXR0cmlidXRlcz8uZm9yRWFjaChrZXkgPT4ge1xuICAgICAgaWYoa2V5Lm1hdGNoKC9eZW1haWwvKSkgcmV0dXJuO1xuICAgICAgY29uc3QgdmFsdWUgPSByZXN1bHQudXNlckF0dHJpYnV0ZXMhW2tleV1cbiAgICAgIHRoaXMucm93cy5wdXNoKHtcbiAgICAgICAgbGFiZWw6IHVuc25ha2Uoa2V5KSxcbiAgICAgICAga2V5XG4gICAgICB9KTtcbiAgICAgIHRoaXMubW9kZWxba2V5XSA9IHZhbHVlICYmIHZhbHVlLmxlbmd0aCA/IHZhbHVlIDogdW5kZWZpbmVkXG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aWNrKCk7XG4gICAgdGhpcy5jb25uZWN0aW9uQ29tcGxldGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VXNlckF0dHJpYnV0ZXMoKTogUmVjb3JkPHN0cmluZyxzdHJpbmc+IHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0ge30gYXMgUmVjb3JkPHN0cmluZyxzdHJpbmc+O1xuICAgIGlmKCF0aGlzLmNhY2hlPy5yZXF1aXJlZEF0dHJpYnV0ZXMpIHJldHVybiBhdHRyaWJ1dGVzO1xuICAgIHRoaXMuY2FjaGUhLnJlcXVpcmVkQXR0cmlidXRlcyEuZm9yRWFjaChrZXkgPT4gYXR0cmlidXRlc1trZXldID0gdGhpcy5tb2RlbFtrZXldKTtcbiAgICByZXR1cm4gYXR0cmlidXRlcztcbiAgfVxuXG4gIHByaXZhdGUgc2lnbkluV2l0aEdvb2dsZSgpIHtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmNvZ25pdG9Vcmx9L29hdXRoMi9hdXRob3JpemU/aWRlbnRpdHlfcHJvdmlkZXI9JHt0aGlzLnByb3ZpZGVyTmFtZX0mcmVkaXJlY3RfdXJpPSR7d2luZG93LmxvY2F0aW9uLm9yaWdpbn0mcmVzcG9uc2VfdHlwZT1UT0tFTiZjbGllbnRfaWQ9JHt0aGlzLmNsaWVudElkfSZzY29wZT1lbWFpbCBvcGVuaWQgcHJvZmlsZSBhd3MuY29nbml0by5zaWduaW4udXNlci5hZG1pbmA7XG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XG4gIH1cblxuICBwcml2YXRlIGdldFVzZXJEYXRhKCk6IElDb2duaXRvVXNlckRhdGEge1xuICAgIHJldHVybiB7XG4gICAgICBlbWFpbDogdGhpcy5zZXNzaW9uIS5nZXRJZFRva2VuKCkucGF5bG9hZFtcImVtYWlsXCJdLFxuICAgICAgdXNlcm5hbWU6IHRoaXMuc2Vzc2lvbiEuZ2V0SWRUb2tlbigpLnBheWxvYWRbXCJjb2duaXRvOnVzZXJuYW1lXCJdLFxuICAgICAgc3ViOiAgdGhpcy5zZXNzaW9uIS5nZXRJZFRva2VuKCkucGF5bG9hZFtcInN1YlwiXSxcbiAgICAgIGZpcnN0TmFtZTogdGhpcy5zZXNzaW9uIS5nZXRJZFRva2VuKCkucGF5bG9hZFtcImdpdmVuX25hbWVcIl0sXG4gICAgICBsYXN0TmFtZTogdGhpcy5zZXNzaW9uIS5nZXRJZFRva2VuKCkucGF5bG9hZFtcImZhbWlseV9uYW1lXCJdLFxuICAgICAgaWRUb2tlbjogIHRoaXMuc2Vzc2lvbiEuZ2V0SWRUb2tlbigpLmdldEp3dFRva2VuKCksXG4gICAgICBhY2Nlc3NUb2tlbjogIHRoaXMuc2Vzc2lvbiEuZ2V0QWNjZXNzVG9rZW4oKS5nZXRKd3RUb2tlbigpLFxuICAgIH1cbiAgfVxuXG59XG4iLCI8Zm9ybSAqbmdJZj1cInNob3dGb3JtICYmIGZvcm1UeXBlID09PSBDb2duaXRvRm9ybVR5cGUuTG9naW5cIiBjbGFzcz1cImNvZ25pdG8tZm9ybVwiIChzdWJtaXQpPVwibG9naW4oKVwiPlxuXHQ8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGNsb3NlXCIgKGNsaWNrKT1cInNob3dGb3JtPWZhbHNlXCIgdHlwZT1cImJ1dHRvblwiPjxzcGFuIGNsYXNzPVwiYnV0dG9udGV4dFwiPnt7IHN0cmluZ3MubGFiZWxDbG9zZSB9fTwvc3Bhbj48L2J1dHRvbj5cblx0PGRpdiAqbmdJZj1cInByb21wdFwiIGNsYXNzPVwicHJvbXB0XCIgW2lubmVySHRtbF09XCJwcm9tcHRcIj48L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tZm9ybXJvd1wiPlxuXHRcdDxsYWJlbCBjbGFzcz1cImNvZ25pdG8tbGFiZWxcIiBmb3I9XCJ1c2VybmFtZVwiPnt7IHN0cmluZ3MubGFiZWxFbWFpbCB9fTwvbGFiZWw+XG5cdFx0PGlucHV0IGlkPVwidXNlcm5hbWVcIiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by10ZXh0XCIgdHlwZT1cInRleHRcIiBuYW1lPVwidXNlcm5hbWVcIiBbKG5nTW9kZWwpXT1cIm1vZGVsLnVzZXJuYW1lXCIgW2Rpc2FibGVkXT1cImRpc2FibGVVc2VybmFtZVwiLz5cblx0PC9kaXY+XG5cdDxkaXYgKm5nSWY9XCIhc3JwICYmICFvdHAgJiYgIXBhc3NrZXlzICYmICFtYWdpY0xpbmsgJiYgc2hvd0VtYWlsU3VibWl0QnV0dG9uXCIgY2xhc3M9XCJjb2duaXRvLWJ1dHRvbnNcIj5cblx0XHQ8YnV0dG9uIGNsYXNzPVwiY29nbml0by1pbnB1dCBjb2duaXRvLXN1Ym1pdCBjb2duaXRvLWJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25FbnRlclVzZXJuYW1lKClcIiBbZGlzYWJsZWRdPVwiIW1vZGVsLnVzZXJuYW1lXCI+e3sgc3RyaW5ncy5sYWJlbFN1Ym1pdCB9fTwvYnV0dG9uPlxuXHQ8L2Rpdj5cblx0PGRpdiAqbmdJZj1cInNycCAmJiAhc2hvd1Bhc3N3b3JkRmllbGRcIiBjbGFzcz1cImNvZ25pdG8tYnV0dG9uc1wiPlxuXHRcdDxidXR0b24gY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tc3VibWl0IGNvZ25pdG8tYnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzaG93UGFzc3dvcmRGaWVsZCA9IHRydWU7IG90cCA9IGZhbHNlOyBtYWdpY0xpbmsgPSBmYWxzZTsgcGFzc2tleXMgPSBmYWxzZVwiIFtkaXNhYmxlZF09XCIhbW9kZWwudXNlcm5hbWVcIj57eyBzdHJpbmdzLmxhYmVsVXNlUmVndWxhclBhc3N3b3JkIH19PC9idXR0b24+XG5cdDwvZGl2PlxuXHQ8ZGl2ICpuZ0lmPVwic3JwICYmIHNob3dQYXNzd29yZEZpZWxkXCIgY2xhc3M9XCJjb2duaXRvLWZvcm1yb3dcIj5cblx0XHQ8bGFiZWwgY2xhc3M9XCJjb2duaXRvLWxhYmVsXCIgZm9yPVwicGFzc3dvcmRcIj57eyBzdHJpbmdzLmxhYmVsUGFzc3dvcmQgfX08L2xhYmVsPlxuXHRcdDxpbnB1dCBpZD1cInBhc3N3b3JkXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tdGV4dFwiIHR5cGU9XCJwYXNzd29yZFwiIG5hbWU9XCJwYXNzd29yZFwiIFsobmdNb2RlbCldPVwibW9kZWwucGFzc3dvcmRcIi8+XG5cdDwvZGl2PlxuXHQ8ZGl2ICpuZ0lmPVwic3JwICYmIHNob3dQYXNzd29yZEZpZWxkXCIgY2xhc3M9XCJjb2duaXRvLWJ1dHRvbnNcIj5cblx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImFcIiAoY2xpY2spPVwib25Gb3Jnb3RQYXNzd29yZCgkZXZlbnQpXCI+e3sgc3RyaW5ncy5sYWJlbEZvcmdvdFBhc3N3b3JkIH19PC9idXR0b24+XG5cdFx0PGlucHV0IGNsYXNzPVwiY29nbml0by1pbnB1dCBjb2duaXRvLXN1Ym1pdCBjb2duaXRvLWJ1dHRvblwiIHR5cGU9XCJzdWJtaXRcIiBbdmFsdWVdPVwic3RyaW5ncy5sYWJlbFN1Ym1pdFwiLz5cblx0PC9kaXY+XG5cdDxkaXYgKm5nSWY9XCJvdHAgJiYgbW9kZWwuc2hvd0NoYWxsZW5nZUVudHJ5XCIgY2xhc3M9XCJjb2duaXRvLWZvcm1yb3dcIj5cblx0XHQ8bGFiZWwgY2xhc3M9XCJjb2duaXRvLWxhYmVsXCIgZm9yPVwib3RwXCI+e3sgc3RyaW5ncy5sYWJlbE90cEVudGVyIH19PC9sYWJlbD5cblx0XHQ8aW5wdXQgaWQ9XCJvdHBcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by10ZXh0XCIgdHlwZT1cInRleHRcIiBuYW1lPVwib3RwXCIgWyhuZ01vZGVsKV09XCJtb2RlbC5vdHBcIi8+XG5cdDwvZGl2PlxuXHQ8ZGl2ICpuZ0lmPVwicGFzc2tleXMgJiYgbW9kZWwuc2hvd0NoYWxsZW5nZUVudHJ5XCIgY2xhc3M9XCJjb2duaXRvLWZvcm1yb3dcIj5cblx0XHQ8bGFiZWwgY2xhc3M9XCJjb2duaXRvLWxhYmVsXCIgZm9yPVwicGFzc2tleS1yZWdcIj57eyBzdHJpbmdzLmxhYmVsUGFzc2tleUVudGVyIH19PC9sYWJlbD5cblx0XHQ8dGV4dGFyZWEgaWQ9XCJwYXNza2V5LXJlZ1wiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIGNsYXNzPVwiY29nbml0by1pbnB1dCBjb2duaXRvLXRleHRcIiBuYW1lPVwicGFzc2tleS1yZWdcIiBbKG5nTW9kZWwpXT1cIm1vZGVsLnBhc3NrZXlcIj48L3RleHRhcmVhPlxuXHQ8L2Rpdj5cblx0PGRpdiAqbmdJZj1cIm90cFwiIGNsYXNzPVwiY29nbml0by1idXR0b25zXCI+XG5cdFx0PGJ1dHRvbiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by1zdWJtaXQgY29nbml0by1idXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImdldE90cCgpXCIgW2Rpc2FibGVkXT1cIiFtb2RlbC51c2VybmFtZVwiPnt7IG1vZGVsLnNob3dDaGFsbGVuZ2VFbnRyeSA/IHN0cmluZ3MubGFiZWxTdWJtaXQgOiBzdHJpbmdzLmxhYmVsT3RwIH19PC9idXR0b24+XG5cdDwvZGl2Plx0XG5cdDxkaXYgKm5nSWY9XCJtYWdpY0xpbmtcIiBjbGFzcz1cImNvZ25pdG8tYnV0dG9uc1wiPlxuXHRcdDxidXR0b24gY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tc3VibWl0IGNvZ25pdG8tYnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJnZXRNYWdpY0xpbmsoKVwiIFtkaXNhYmxlZF09XCIhbW9kZWwudXNlcm5hbWVcIj57eyBzdHJpbmdzLmxhYmVsTWFnaWNMaW5rIH19PC9idXR0b24+XG5cdDwvZGl2Plx0XG5cdDxkaXYgKm5nSWY9XCJwYXNza2V5c1wiIGNsYXNzPVwiY29nbml0by1idXR0b25zXCI+XG5cdFx0PGJ1dHRvbiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by1zdWJtaXQgY29nbml0by1idXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImdldFBhc3NrZXkoKVwiIFtkaXNhYmxlZF09XCIhbW9kZWwudXNlcm5hbWVcIj57eyBtb2RlbC5zaG93Q2hhbGxlbmdlRW50cnkgPyBzdHJpbmdzLmxhYmVsU3VibWl0IDogc3RyaW5ncy5sYWJlbFBhc3NrZXlzIH19PC9idXR0b24+XG5cdDwvZGl2Plx0XG5cdDxkaXYgKm5nSWY9XCJlcnJvclwiIGNsYXNzPVwiZXJyb3JcIiBbaW5uZXJIdG1sXT1cImVycm9yXCI+PC9kaXY+XG48L2Zvcm0+XG48Zm9ybSAqbmdJZj1cInNob3dGb3JtICYmIGZvcm1UeXBlID09PSBDb2duaXRvRm9ybVR5cGUuTmV3VXNlclwiIGNsYXNzPVwiY29nbml0by1mb3JtXCIgKHN1Ym1pdCk9XCJvbk5ld1VzZXIoKVwiPlxuXHQ8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGNsb3NlXCIgKGNsaWNrKT1cInNob3dGb3JtPWZhbHNlXCIgdHlwZT1cImJ1dHRvblwiPjxzcGFuIGNsYXNzPVwiYnV0dG9udGV4dFwiPnt7IHN0cmluZ3MubGFiZWxDbG9zZSB9fTwvc3Bhbj48L2J1dHRvbj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tZm9ybXJvd1wiPlxuXHRcdDxsYWJlbCBjbGFzcz1cImNvZ25pdG8tbGFiZWxcIiBmb3I9XCJ1c2VybmFtZVwiPnt7IHN0cmluZ3MubGFiZWxFbWFpbCB9fTwvbGFiZWw+XG5cdFx0PGlucHV0IGlkPVwidXNlcm5hbWVcIiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by10ZXh0XCIgdHlwZT1cInRleHRcIiBuYW1lPVwidXNlcm5hbWVcIiBbKG5nTW9kZWwpXT1cIm1vZGVsLnVzZXJuYW1lXCIgZGlzYWJsZWQgLz5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJjb2duaXRvLWZvcm1yb3dcIj5cblx0XHQ8bGFiZWwgY2xhc3M9XCJjb2duaXRvLWxhYmVsIG5vLW1iXCIgZm9yPVwibmV3LXBhc3N3b3JkXCI+e3sgc3RyaW5ncy5sYWJlbE5ld1Bhc3N3b3JkIH19PC9sYWJlbD5cblx0XHQ8cCBjbGFzcz1cImNvZ25pdG8tc3VibGFiZWxcIj57eyBzdHJpbmdzLmxhYmVsUGFzc3dvcmRSZXF1aXJlbWVudCB9fTwvcD5cblx0XHQ8aW5wdXQgaWQ9XCJuZXctcGFzc3dvcmRcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by10ZXh0XCIgdHlwZT1cInBhc3N3b3JkXCIgbmFtZT1cInBhc3N3b3JkLW5ld1wiIFsobmdNb2RlbCldPVwibW9kZWwubmV3UGFzc3dvcmRcIi8+XG5cdDwvZGl2PlxuXHQ8ZGl2IGNsYXNzPVwiY29nbml0by1mb3Jtcm93XCI+XG5cdFx0PGxhYmVsIGNsYXNzPVwiY29nbml0by1sYWJlbFwiIGZvcj1cInBhc3N3b3JkLWNvbmZpcm1cIj57eyBzdHJpbmdzLmxhYmVsQ29uZmlybU5ld1Bhc3N3b3JkIH19PC9sYWJlbD5cblx0XHQ8aW5wdXQgaWQ9XCJwYXNzd29yZC1jb25maXJtXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tdGV4dFwiIHR5cGU9XCJwYXNzd29yZFwiIG5hbWU9XCJwYXNzd29yZC1jb25maXJtXCIgWyhuZ01vZGVsKV09XCJtb2RlbC5uZXdQYXNzd29yZENvbmZpcm1cIi8+XG5cdDwvZGl2PlxuXHQ8ZGl2IGNsYXNzPVwiY29nbml0by1mb3Jtcm93XCIgKm5nRm9yPVwibGV0IHJvdyBvZiByb3dzXCI+XG5cdFx0PGxhYmVsIGNsYXNzPVwiY29nbml0by1sYWJlbFwiIGZvcj1cInVzZXJuYW1lXCI+e3sgcm93LmxhYmVsfGxhYmVsZXIgfX08L2xhYmVsPlxuXHRcdDxpbnB1dCBbaWRdPVwicm93LmtleVwiICBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by10ZXh0XCIgdHlwZT1cInRleHRcIiBbbmFtZV09XCJyb3cua2V5XCIgWyhuZ01vZGVsKV09XCJtb2RlbFtyb3cua2V5XVwiLz5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJjb2duaXRvLWJ1dHRvbnNcIj5cblx0XHQ8aW5wdXQgY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tc3VibWl0IGNvZ25pdG8tYnV0dG9uXCIgdHlwZT1cInN1Ym1pdFwiIFtkaXNhYmxlZF09XCJuZXdVc2VyRm9ybURpc2FibGVkKClcIiBbdmFsdWVdPVwic3RyaW5ncy5sYWJlbFN1Ym1pdFwiLz5cblx0PC9kaXY+XHRcblx0PGRpdiAqbmdJZj1cImVycm9yXCIgY2xhc3M9XCJlcnJvclwiIFtpbm5lckh0bWxdPVwiZXJyb3JcIj48L2Rpdj5cbjwvZm9ybT5cbjxmb3JtICpuZ0lmPVwic2hvd0Zvcm0gJiYgZm9ybVR5cGUgPT09IENvZ25pdG9Gb3JtVHlwZS5Gb3JjZVBhc3N3b3JkUmVzZXRcIiBjbGFzcz1cImNvZ25pdG8tZm9ybVwiIChzdWJtaXQpPVwib25Gb3JjZVBhc3N3b3JkUmVzZXQoKVwiPlxuXHQ8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGNsb3NlXCIgKGNsaWNrKT1cInNob3dGb3JtPWZhbHNlXCIgdHlwZT1cImJ1dHRvblwiPjxzcGFuIGNsYXNzPVwiYnV0dG9udGV4dFwiPnt7IHN0cmluZ3MubGFiZWxDbG9zZSB9fTwvc3Bhbj48L2J1dHRvbj5cblx0PGRpdiAqbmdJZj1cInByb21wdFwiIGNsYXNzPVwicHJvbXB0XCIgW2lubmVySHRtbF09XCJwcm9tcHRcIj48L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tZm9ybXJvd1wiPlxuXHRcdDxsYWJlbCBjbGFzcz1cImNvZ25pdG8tbGFiZWxcIiBmb3I9XCJ1c2VybmFtZVwiPnt7IHN0cmluZ3MubGFiZWxFbWFpbCB9fTwvbGFiZWw+XG5cdFx0PGlucHV0IGlkPVwidXNlcm5hbWVcIiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by10ZXh0XCIgdHlwZT1cInRleHRcIiBuYW1lPVwidXNlcm5hbWVcIiBbKG5nTW9kZWwpXT1cIm1vZGVsLnVzZXJuYW1lXCIgZGlzYWJsZWQgLz5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJjb2duaXRvLWZvcm1yb3dcIj5cblx0XHQ8bGFiZWwgY2xhc3M9XCJjb2duaXRvLWxhYmVsXCIgZm9yPVwiY29kZVwiPnt7IHN0cmluZ3MubGFiZWxDb2RlIH19PC9sYWJlbD5cblx0XHQ8aW5wdXQgaWQ9XCJjb2RlXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tdGV4dFwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImNvZGVcIiBbKG5nTW9kZWwpXT1cIm1vZGVsLmNvZGVcIi8+XG5cdDwvZGl2PlxuXHQ8ZGl2IGNsYXNzPVwiY29nbml0by1mb3Jtcm93XCI+XG5cdFx0PGxhYmVsIGNsYXNzPVwiY29nbml0by1sYWJlbFwiIGZvcj1cIm5ldy1wYXNzd29yZFwiPnt7IHN0cmluZ3MubGFiZWxOZXdQYXNzd29yZCB9fTwvbGFiZWw+XG5cdFx0PHAgY2xhc3M9XCJjb2duaXRvLXN1YmxhYmVsXCI+e3sgc3RyaW5ncy5sYWJlbFBhc3N3b3JkUmVxdWlyZW1lbnQgfX08L3A+XG5cdFx0PGlucHV0IGlkPVwibmV3LXBhc3N3b3JkXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tdGV4dFwiIHR5cGU9XCJwYXNzd29yZFwiIG5hbWU9XCJwYXNzd29yZC1uZXdcIiBbKG5nTW9kZWwpXT1cIm1vZGVsLm5ld1Bhc3N3b3JkXCIvPlxuXHQ8L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tZm9ybXJvd1wiPlxuXHRcdDxsYWJlbCBjbGFzcz1cImNvZ25pdG8tbGFiZWxcIiBmb3I9XCJwYXNzd29yZC1jb25maXJtXCI+e3sgc3RyaW5ncy5sYWJlbENvbmZpcm1OZXdQYXNzd29yZCB9fTwvbGFiZWw+XG5cdFx0PGlucHV0IGlkPVwicGFzc3dvcmQtY29uZmlybVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIGNsYXNzPVwiY29nbml0by1pbnB1dCBjb2duaXRvLXRleHRcIiB0eXBlPVwicGFzc3dvcmRcIiBuYW1lPVwicGFzc3dvcmQtY29uZmlybVwiIFsobmdNb2RlbCldPVwibW9kZWwubmV3UGFzc3dvcmRDb25maXJtXCIvPlxuXHQ8L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tYnV0dG9uc1wiPlxuXHRcdDxpbnB1dCBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by1zdWJtaXQgY29nbml0by1idXR0b25cIiB0eXBlPVwic3VibWl0XCIgW2Rpc2FibGVkXT1cIm5ld1VzZXJGb3JtRGlzYWJsZWQoKVwiIFt2YWx1ZV09XCJzdHJpbmdzLmxhYmVsU3VibWl0XCIvPlxuXHQ8L2Rpdj5cdFxuXHQ8ZGl2ICpuZ0lmPVwiZXJyb3JcIiBjbGFzcz1cImVycm9yXCIgW2lubmVySHRtbF09XCJlcnJvclwiPjwvZGl2PlxuPC9mb3JtPlxuPGZvcm0gKm5nSWY9XCJzaG93Rm9ybSAmJiBmb3JtVHlwZSA9PT0gQ29nbml0b0Zvcm1UeXBlLlVzZXJWZXJpZmljYXRpb25SZXF1ZXN0XCIgY2xhc3M9XCJjb2duaXRvLWZvcm1cIiAoc3VibWl0KT1cIm9uUmVxdWVzdFZlcmlmaWNhdGlvbkNvZGUoKVwiPlxuXHQ8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGNsb3NlXCIgKGNsaWNrKT1cInNob3dGb3JtPWZhbHNlXCIgdHlwZT1cImJ1dHRvblwiPjxzcGFuIGNsYXNzPVwiYnV0dG9udGV4dFwiPnt7IHN0cmluZ3MubGFiZWxDbG9zZSB9fTwvc3Bhbj48L2J1dHRvbj5cblx0PGRpdiAqbmdJZj1cInByb21wdFwiIGNsYXNzPVwicHJvbXB0XCIgW2lubmVySHRtbF09XCJwcm9tcHRcIj48L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tZm9ybXJvd1wiPlxuXHRcdDxsYWJlbCBjbGFzcz1cImNvZ25pdG8tbGFiZWxcIiBmb3I9XCJ1c2VybmFtZVwiPnt7IHN0cmluZ3MubGFiZWxFbWFpbCB9fTwvbGFiZWw+XG5cdFx0PGlucHV0IGlkPVwidXNlcm5hbWVcIiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by10ZXh0XCIgdHlwZT1cInRleHRcIiBuYW1lPVwidXNlcm5hbWVcIiBbKG5nTW9kZWwpXT1cIm1vZGVsLnVzZXJuYW1lXCIvPlxuXHQ8L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tYnV0dG9uc1wiPlxuXHRcdDxpbnB1dCBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by1zdWJtaXQgY29nbml0by1idXR0b25cIiB0eXBlPVwic3VibWl0XCIgW2Rpc2FibGVkXT1cIiFtb2RlbC51c2VybmFtZVwiIFt2YWx1ZV09XCJzdHJpbmdzLmxhYmVsU3VibWl0XCIvPlxuXHQ8L2Rpdj5cdFxuXHQ8ZGl2ICpuZ0lmPVwiZXJyb3JcIiBjbGFzcz1cImVycm9yXCIgW2lubmVySHRtbF09XCJlcnJvclwiPjwvZGl2PlxuPC9mb3JtPlxuPGZvcm0gKm5nSWY9XCJzaG93Rm9ybSAmJiBmb3JtVHlwZSA9PT0gQ29nbml0b0Zvcm1UeXBlLlVzZXJQYXNzd29yZFJlc2V0XCIgY2xhc3M9XCJjb2duaXRvLWZvcm1cIiAoc3VibWl0KT1cIm9uVXNlclBhc3N3b3JkUmVzZXQoKVwiPlxuXHQ8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGNsb3NlXCIgKGNsaWNrKT1cInNob3dGb3JtPWZhbHNlXCIgdHlwZT1cImJ1dHRvblwiPjxzcGFuIGNsYXNzPVwiYnV0dG9udGV4dFwiPnt7IHN0cmluZ3MubGFiZWxDbG9zZSB9fTwvc3Bhbj48L2J1dHRvbj5cblx0PGRpdiAqbmdJZj1cInByb21wdFwiIGNsYXNzPVwicHJvbXB0XCIgW2lubmVySHRtbF09XCJwcm9tcHRcIj48L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tZm9ybXJvd1wiPlxuXHRcdDxsYWJlbCBjbGFzcz1cImNvZ25pdG8tbGFiZWxcIiBmb3I9XCJjdXJyZW50LXBhc3N3b3JkXCI+e3sgc3RyaW5ncy5sYWJlbEN1cnJlbnRQYXNzd29yZCB9fTwvbGFiZWw+XG5cdFx0PGlucHV0IGlkPVwiY3VycmVudC1wYXNzd29yZFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIGNsYXNzPVwiY29nbml0by1pbnB1dCBjb2duaXRvLXRleHRcIiB0eXBlPVwicGFzc3dvcmRcIiBuYW1lPVwicGFzc3dvcmRcIiBbKG5nTW9kZWwpXT1cIm1vZGVsLnBhc3N3b3JkXCIvPlxuXHQ8L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tZm9ybXJvd1wiPlxuXHRcdDxsYWJlbCBjbGFzcz1cImNvZ25pdG8tbGFiZWxcIiBmb3I9XCJuZXctcGFzc3dvcmRcIj57eyBzdHJpbmdzLmxhYmVsTmV3UGFzc3dvcmQgfX08L2xhYmVsPlxuXHRcdDxwIGNsYXNzPVwiY29nbml0by1zdWJsYWJlbFwiPnt7IHN0cmluZ3MubGFiZWxQYXNzd29yZFJlcXVpcmVtZW50IH19PC9wPlxuXHRcdDxpbnB1dCBpZD1cIm5ldy1wYXNzd29yZFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIGNsYXNzPVwiY29nbml0by1pbnB1dCBjb2duaXRvLXRleHRcIiB0eXBlPVwicGFzc3dvcmRcIiBuYW1lPVwicGFzc3dvcmQtbmV3XCIgWyhuZ01vZGVsKV09XCJtb2RlbC5uZXdQYXNzd29yZFwiLz5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJjb2duaXRvLWZvcm1yb3dcIj5cblx0XHQ8bGFiZWwgY2xhc3M9XCJjb2duaXRvLWxhYmVsXCIgZm9yPVwicGFzc3dvcmQtY29uZmlybVwiPnt7IHN0cmluZ3MubGFiZWxDb25maXJtTmV3UGFzc3dvcmQgfX08L2xhYmVsPlxuXHRcdDxpbnB1dCBpZD1cInBhc3N3b3JkLWNvbmZpcm1cIiBhdXRvY29tcGxldGU9XCJvZmZcIiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by10ZXh0XCIgdHlwZT1cInBhc3N3b3JkXCIgbmFtZT1cInBhc3N3b3JkLWNvbmZpcm1cIiBbKG5nTW9kZWwpXT1cIm1vZGVsLm5ld1Bhc3N3b3JkQ29uZmlybVwiLz5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJjb2duaXRvLWJ1dHRvbnNcIj5cblx0XHQ8aW5wdXQgY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tc3VibWl0IGNvZ25pdG8tYnV0dG9uXCIgdHlwZT1cInN1Ym1pdFwiIFtkaXNhYmxlZF09XCJuZXdVc2VyRm9ybURpc2FibGVkKClcIiBbdmFsdWVdPVwic3RyaW5ncy5sYWJlbFN1Ym1pdFwiLz5cblx0PC9kaXY+XHRcblx0PGRpdiAqbmdJZj1cImVycm9yXCIgY2xhc3M9XCJlcnJvclwiIFtpbm5lckh0bWxdPVwiZXJyb3JcIj48L2Rpdj5cbjwvZm9ybT5cbjxmb3JtICpuZ0lmPVwic2hvd0Zvcm0gJiYgZm9ybVR5cGUgPT09IENvZ25pdG9Gb3JtVHlwZS5QYXNzd29yZFVwZGF0ZVN1Y2Nlc3NmdWxcIiBjbGFzcz1cImNvZ25pdG8tZm9ybVwiIChzdWJtaXQpPVwic2hvd0Zvcm0gPSBmYWxzZVwiPlxuXHQ8ZGl2IGNsYXNzPVwicHJvbXB0XCIgW2lubmVySHRtbF09XCJwcm9tcHRcIj48L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tYnV0dG9uc1wiPlxuXHRcdDxpbnB1dCBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by1zdWJtaXQgY29nbml0by1idXR0b25cIiB0eXBlPVwic3VibWl0XCIgW3ZhbHVlXT1cInN0cmluZ3MubGFiZWxDbG9zZVwiLz5cblx0PC9kaXY+XHRcbjwvZm9ybT4iXX0=
|
|
595
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nbml0by5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2NvZ25pdG8uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vc3JjL2xpYi9jb2duaXRvLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsV0FBVyxFQUFpQixLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzRyxPQUFPLEVBQWUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLE1BQU8sNEJBQTRCLENBQUM7QUFFbEgsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzRixPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBVSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUU5RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7Ozs7O0FBT2pGLE1BQU0sT0FBTyxnQkFBZ0I7SUF3RDNCLFlBQW9CLE9BQXVCO1FBQXZCLFlBQU8sR0FBUCxPQUFPLENBQWdCO1FBckRyQixjQUFTLEdBQW9DLEVBQUUsQ0FBQztRQUN6QyxhQUFRLEdBQVksS0FBSyxDQUFDO1FBQ25CLGtCQUFhLEdBQVksS0FBSyxDQUFDO1FBRzNDLGlCQUFZLEdBQVcsUUFBUSxDQUFDO1FBSTdCLG9CQUFlLEdBQVcsdUJBQXVCLENBQUM7UUFDM0QsV0FBTSxHQUFXLElBQUksQ0FBQztRQUUxQixRQUFHLEdBQVksSUFBSSxDQUFDO1FBQ3BCLFFBQUcsR0FBWSxLQUFLLENBQUM7UUFDZCxjQUFTLEdBQVksS0FBSyxDQUFDO1FBRUwsa0NBQTZCLEdBQVksSUFBSSxDQUFDO1FBQ3RF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QUs7dUJBQUMsMENBQTBDO2dCQUNBLDJCQUEyQjtzQkFBM0UsS0FBSzt1QkFBQyx3Q0FBd0M7Z0JBQ1Isa0JBQWtCO3NCQUF4RCxLQUFLO3VCQUFDLDhCQUE4QjtnQkFDSSxvQkFBb0I7c0JBQTVELEtBQUs7dUJBQUMsZ0NBQWdDO2dCQUV0QixPQUFPO3NCQUF2QixNQUFNO3VCQUFDLE9BQU87Z0JBQ08sWUFBWTtzQkFBakMsTUFBTTt1QkFBQyxZQUFZO2dCQUNLLGVBQWU7c0JBQXZDLE1BQU07dUJBQUMsZUFBZTtnQkFDSCxVQUFVO3NCQUE3QixNQUFNO3VCQUFDLFVBQVU7Z0JBQ1MsaUJBQWlCO3NCQUEzQyxNQUFNO3VCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBIb3N0QmluZGluZywgQWZ0ZXJWaWV3SW5pdCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb2duaXRvU2VydmljZSB9IGZyb20gXCIuL2NvZ25pdG8uc2VydmljZVwiO1xuaW1wb3J0IHsgQ29nbml0b1VzZXIsIENvZ25pdG9Vc2VyU2Vzc2lvbiwgQ29nbml0b0lkVG9rZW4sIENvZ25pdG9BY2Nlc3NUb2tlbiB9ICBmcm9tICdhbWF6b24tY29nbml0by1pZGVudGl0eS1qcyc7XG5pbXBvcnQgeyBJQ29nbml0b1Jlc3BvbnNlLCBJQ29nbml0b1VzZXJEYXRhIH0gZnJvbSBcIi4vY29nbml0by5pbnRlcmZhY2VzXCI7XG5pbXBvcnQgeyBDb2duaXRvU3RyaW5ncyB9IGZyb20gXCIuL2NvZ25pdG8uY2xhc3Nlc1wiO1xuaW1wb3J0IHsgQ29nbml0b1Jlc3BvbnNlVHlwZSwgQ29nbml0b1JlcXVlc3RUeXBlLCBDb2duaXRvRm9ybVR5cGUgfSBmcm9tIFwiLi9jb2duaXRvLnR5cGVzXCI7XG5pbXBvcnQgeyB1bnNuYWtlLCB0aWNrLCBwYXJhbXMsIHRyaW0gfSBmcm9tIFwiLi9jb2duaXRvLnV0aWxzXCI7XG5pbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IHN0YXJ0QXV0aGVudGljYXRpb24sIHN0YXJ0UmVnaXN0cmF0aW9uIH0gZnJvbSAnQHNpbXBsZXdlYmF1dGhuL2Jyb3dzZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjb2duaXRvJyxcbiAgdGVtcGxhdGVVcmw6IFwiLi9jb2duaXRvLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlVXJsczogWyBcIi4vY29nbml0by5jb21wb25lbnQubGVzc1wiIF1cbn0pXG5leHBvcnQgY2xhc3MgQ29nbml0b0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG5cblxuICBASG9zdEJpbmRpbmcoXCJzdHlsZVwiKSBob3N0U3R5bGU6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4gPSB7fTtcbiAgQEhvc3RCaW5kaW5nKFwiY2xhc3MucmVuZGVyXCIpIHNob3dGb3JtOiBib29sZWFuID0gZmFsc2U7XG4gIEBIb3N0QmluZGluZyhcImNsYXNzLnRyYW5zaXRpb25pbmdcIikgdHJhbnNpdGlvbmluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dChcInBvb2wtaWRcIikgcG9vbElkITogc3RyaW5nO1xuICBASW5wdXQoXCJwcm92aWRlci1uYW1lXCIpIHByb3ZpZGVyTmFtZTogc3RyaW5nID0gXCJHb29nbGVcIjtcbiAgQElucHV0KFwiY2xpZW50LWlkXCIpIGNsaWVudElkITogc3RyaW5nO1xuICBASW5wdXQoXCJjb2duaXRvLXNpZ25pbi11cmxcIikgY29nbml0b1VybD86IHN0cmluZztcbiAgQElucHV0KFwicmVnaW9uXCIpIHJlZ2lvbiE6IHN0cmluZztcbiAgQElucHV0KFwibW9kYWwtYmFja2dyb3VuZFwiKSBtb2RhbEJhY2tncm91bmQ6IHN0cmluZyA9IFwicmdiYSgyNTUsMjU1LDI1NSwwLjUpXCI7XG4gIEBJbnB1dChcInotaW5kZXhcIikgekluZGV4OiBudW1iZXIgPSAxMDAwO1xuICBASW5wdXQoXCJob29rXCIpIGhvb2s/OiAoc3RhdGU6IGFueSkgPT4gUHJvbWlzZTxib29sZWFuPjtcbiAgQElucHV0KFwic3JwXCIpIHNycDogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dChcIm90cFwiKSBvdHA6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KFwibWFnaWMtbGlua1wiKSBtYWdpY0xpbms6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KFwibWFnaWMtbGluay1nZW5lcmF0b3JcIikgbWFnaWNMaW5rR2VuZXJhdG9yPzogUHJvbWlzZTxib29sZWFuPjtcbiAgQElucHV0KFwicmVsb2FkLWFmdGVyLWxpbmstYXV0aGVudGljYXRpb25cIikgcmVsb2FkQWZ0ZXJMaW5rQXV0aGVudGljYXRpb246IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoXCJwYXNza2V5c1wiKSBwYXNza2V5czogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoXCJ1c2VMb2NhbFN0b3JhZ2VcIikgdXNlTG9jYWxTdG9yYWdlOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KFwiaWRUb2tlblwiKSBpZFRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dChcImFjY2Vzc1Rva2VuXCIpIGFjY2Vzc1Rva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dChcInJlZnJlc2hUb2tlblwiKSByZWZyZXNoVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBASW5wdXQoXCJwYXNza2V5cy1nZXQtdXNlci1pZFwiKSBnZXRVc2VySWQhOiAodXNlcm5hbWU6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmc+O1xuICBASW5wdXQoXCJwYXNza2V5cy1nZW5lcmF0ZS1hdXRoZW50aWNhdGlvbi1vcHRpb25zXCIpIGdlbmVyYXRlQXV0aGVudGljYXRpb25PcHRpb25zITogKGVtYWlsOiBzdHJpbmcpID0+IFByb21pc2U8YW55PjtcbiAgQElucHV0KFwicGFzc2tleXMtZ2VuZXJhdGUtcmVnaXN0cmF0aW9uLW9wdGlvbnNcIikgZ2VuZXJhdGVSZWdpc3RyYXRpb25PcHRpb25zITogKHRva2VuOiBzdHJpbmcpID0+IFByb21pc2U8YW55PjtcbiAgQElucHV0KFwicGFzc2tleXMtdmVyaWZ5LXJlZ2lzdHJhdGlvblwiKSB2ZXJpZnlSZWdpc3RyYXRpb24hOiAoaW5wdXQ6IGFueSwgdG9rZW46IHN0cmluZyApID0+IFByb21pc2U8YW55PjtcbiAgQElucHV0KFwicGFzc2tleXMtdmVyaWZ5LWF1dGhlbnRpY2F0aW9uXCIpIHZlcmlmeUF1dGhlbnRpY2F0aW9uITogKGlucHV0OiBhbnkpID0+IFByb21pc2U8YW55PjtcblxuICBAT3V0cHV0KFwicmVhZHlcIikgb25SZWFkeTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoXCJjb25uZWN0aW5nXCIpIG9uQ29ubmVjdGluZzogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KFwiYXV0aGVudGljYXRlZFwiKSBvbkF1dGhlbnRpY2F0ZWQ6IEV2ZW50RW1pdHRlcjxJQ29nbml0b1VzZXJEYXRhIHwgbnVsbD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoXCJyZXNwb25zZVwiKSBvblJlc3BvbnNlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTsgXG4gIEBPdXRwdXQoXCJ1c2VybmFtZUVudGVyZWRcIikgb25Vc2VybmFtZUVudGVyZWQ6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIHB1YmxpYyBtb2RlbDogYW55ID0geyB1c2VybmFtZTogbnVsbCwgcGFzc3dvcmQ6IG51bGx9O1xuICBwdWJsaWMgY29tcG9uZW50U3R5bGU6IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bWJlcj4gPSB7fTtcbiAgcHVibGljIGZvcm1UeXBlOiBDb2duaXRvRm9ybVR5cGUgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIENvZ25pdG9Gb3JtVHlwZSA9IENvZ25pdG9Gb3JtVHlwZTtcbiAgcHVibGljIHJvd3M6IGFueVtdID0gW107XG4gIHB1YmxpYyBlcnJvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBwcm9tcHQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwdWJsaWMgY2FjaGU6IElDb2duaXRvUmVzcG9uc2UgfCBudWxsID0gbnVsbDtcbiAgcHVibGljIHN0cmluZ3MgPSBDb2duaXRvU3RyaW5ncztcbiAgcHVibGljIHNob3dQYXNzd29yZEZpZWxkOiBib29sZWFuID0gdHJ1ZTtcbiAgcHVibGljIHNob3dFbWFpbFN1Ym1pdEJ1dHRvbjogYm9vbGVhbiA9IHRydWU7XG4gIHB1YmxpYyBkaXNhYmxlVXNlcm5hbWU6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIHNlc3Npb246IENvZ25pdG9Vc2VyU2Vzc2lvbiB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHVzZXI6IENvZ25pdG9Vc2VyIHwgbnVsbCA9IG51bGw7XG4gIHB1YmxpYyBwYXNza2V5QXV0aE9wdGlvbnM/OiBhbnk7XG4gIHB1YmxpYyBwYXNza2V5UmVnT3B0aW9ucz86IGFueTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvZ25pdG86IENvZ25pdG9TZXJ2aWNlKSB7XG4gICAgXG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBcbiAgICB0aGlzLmNvZ25pdG8uaW5pdGlhbGl6ZSh0aGlzLnBvb2xJZCwgdGhpcy5jbGllbnRJZCwgdGhpcy51c2VMb2NhbFN0b3JhZ2UsIHRoaXMuaWRUb2tlbiwgdGhpcy5hY2Nlc3NUb2tlbiwgdGhpcy5yZWZyZXNoVG9rZW4pO1xuXG4gICAgdGhpcy5jb2duaXRvLmZvcm0kLnN1YnNjcmliZShmb3JtID0+IHtcbiAgICAgIHRoaXMuZm9ybVR5cGUgPSBmb3JtO1xuICAgICAgdGhpcy5zaG93Q3VycmVudEZvcm0oKTtcbiAgICB9KTtcbiAgICBcbiAgICB0aGlzLmNvZ25pdG8uc2Vzc2lvbiQuc3Vic2NyaWJlKHNlc3Npb24gPT4ge1xuICAgICAgdGhpcy5zZXNzaW9uID0gc2Vzc2lvbjtcbiAgICB9KTtcbiAgICB0aGlzLmNvZ25pdG8udXNlciQuc3Vic2NyaWJlKHVzZXIgPT4ge1xuICAgICAgdGhpcy51c2VyID0gdXNlcjtcbiAgICB9KTtcblxuICAgIHRoaXMudXBkYXRlQnV0dG9ucygpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5pbml0aWFsaXplKCkpO1xuICB9XG5cbiAgb25FbnRlclVzZXJuYW1lKCkge1xuICAgIHRoaXMuc2hvd0VtYWlsU3VibWl0QnV0dG9uID0gZmFsc2U7XG4gICAgdGhpcy5vblVzZXJuYW1lRW50ZXJlZC5lbWl0KHRoaXMubW9kZWwudXNlcm5hbWUhLnJlcGxhY2UoL1xccysvZ2ltLFwiXCIpKTtcbiAgfVxuXG4gIHVwZGF0ZUJ1dHRvbnMoKSB7XG4gICAgaWYodGhpcy5vdHAgfHwgdGhpcy5tYWdpY0xpbmsgfHwgdGhpcy5wYXNza2V5cykge1xuICAgICAgdGhpcy5zaG93UGFzc3dvcmRGaWVsZCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGxvZ2luKCkge1xuXG4gICAgaWYoIXRoaXMuc3JwICYmIHRoaXMub3RwKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRPdHAoKTtcbiAgICB9IGVsc2UgaWYoIXRoaXMuc3JwICYmIHRoaXMubWFnaWNMaW5rKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRNYWdpY0xpbmsoKTtcbiAgICB9IGVsc2UgaWYoIXRoaXMuc3JwICYmIHRoaXMucGFzc2tleXMpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFBhc3NrZXkoKTtcbiAgICB9IGVsc2UgaWYoIXRoaXMuc3JwKSB7XG4gICAgICByZXR1cm4gdGhpcy5vbkVudGVyVXNlcm5hbWUoKTtcbiAgICB9XG5cbiAgICBsZXQgcmVzcG9uc2U6IElDb2duaXRvUmVzcG9uc2U7XG4gICAgdGhpcy5lcnJvciA9IG51bGw7XG4gICAgdGhpcy5tb2RlbC5wYXNzd29yZCA9IHRyaW0odGhpcy5tb2RlbC5wYXNzd29yZCk7XG5cbiAgICBpZih0aGlzLmhvb2spIHtcbiAgICAgIGNvbnN0IHByb2NlZWQgPSBhd2FpdCB0aGlzLmhvb2soeyBcInN0YXRlXCI6IFwiYmVmb3JlLWxvZ2luXCIsIG1vZGVsOiB0aGlzLm1vZGVsIH0pO1xuICAgICAgaWYoIXByb2NlZWQpIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdXNlcm5hbWUgPSB0aGlzLm1vZGVsLnVzZXJuYW1lIS5yZXBsYWNlKC9cXHMrL2dpbSxcIlwiKTtcbiAgICAgIHRoaXMub25Db25uZWN0aW5nLmVtaXQodHJ1ZSk7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHRoaXMuY29nbml0by5hdXRoZW50aWNhdGUodXNlcm5hbWUsIHRoaXMubW9kZWwucGFzc3dvcmQhKTtcbiAgICB9IGNhdGNoKGU6IGFueSkge1xuICAgICAgcmVzcG9uc2UgPSBlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmhhbmRsZVJlc3BvbnNlKHJlc3BvbnNlISk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0T3RwKCkge1xuICAgIGxldCByZXNwb25zZTogSUNvZ25pdG9SZXNwb25zZTtcbiAgICB0aGlzLmVycm9yID0gbnVsbDtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLm9uQ29ubmVjdGluZy5lbWl0KHRydWUpO1xuXG4gICAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMubW9kZWwudXNlcm5hbWUhLnJlcGxhY2UoL1xccysvZ2ltLFwiXCIpO1xuICAgICAgY29uc3Qgb3RwID0gdGhpcy5tb2RlbC5vdHAgPyB0cmltKHRoaXMubW9kZWwub3RwKSA6IHVuZGVmaW5lZDtcblxuICAgICAgdGhpcy5zcnAgPSBmYWxzZTtcbiAgICAgIHRoaXMubWFnaWNMaW5rID0gZmFsc2U7XG4gICAgICB0aGlzLnBhc3NrZXlzID0gZmFsc2U7XG5cbiAgICAgIGlmKHRoaXMuaG9vaykge1xuICAgICAgICBjb25zdCBwcm9jZWVkID0gYXdhaXQgdGhpcy5ob29rKHsgXCJzdGF0ZVwiOiBcImJlZm9yZS1vdHAtcmVxdWVzdFwiLCBtb2RlbDogdGhpcy5tb2RlbCB9KTtcbiAgICAgICAgaWYoIXByb2NlZWQpIHJldHVybiB0aGlzLmNvbm5lY3Rpb25Db21wbGV0ZSgpO1xuICAgICAgfVxuICAgICAgXG4gICAgICByZXNwb25zZSAgPSBhd2FpdCB0aGlzLmNvZ25pdG8ub3RwQXV0aGVudGljYXRlKHVzZXJuYW1lLCBvdHApO1xuXG4gICAgICBpZih0aGlzLmhvb2spIHtcbiAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IHByb2NlZWQgPSBhd2FpdCB0aGlzLmhvb2soeyBcInN0YXRlXCI6IFwiYWZ0ZXItb3RwLXJlcXVlc3RcIiwgbW9kZWw6IHRoaXMubW9kZWwsIHNlc3Npb25JZDogcmVzcG9uc2UudXNlci5TZXNzaW9uIH0pO1xuICAgICAgICBpZighcHJvY2VlZCkgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIHByb2NlZWRcIik7XG4gICAgICB9XG4gICAgfSBjYXRjaChlOiBhbnkpIHtcbiAgICAgIHJlc3BvbnNlID0gZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5oYW5kbGVSZXNwb25zZShyZXNwb25zZSEpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldE1hZ2ljTGluaygpIHtcbiAgICBcbiAgICBsZXQgcmVzcG9uc2U6IElDb2duaXRvUmVzcG9uc2U7XG4gICAgdGhpcy5lcnJvciA9IG51bGw7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdXNlcm5hbWUgPSB0aGlzLm1vZGVsLnVzZXJuYW1lIS5yZXBsYWNlKC9cXHMrL2dpbSxcIlwiKTtcbiAgICAgIHRoaXMub25Db25uZWN0aW5nLmVtaXQodHJ1ZSk7XG5cbiAgICAgIGlmKHRoaXMuaG9vaykge1xuICAgICAgICBjb25zdCBwcm9jZWVkID0gYXdhaXQgdGhpcy5ob29rKHsgXCJzdGF0ZVwiOiBcImJlZm9yZS1tYWdpYy1saW5rLXJlcXVlc3RcIiwgbW9kZWw6IHRoaXMubW9kZWwgfSk7XG4gICAgICAgIGlmKCFwcm9jZWVkKSByZXR1cm4gdGhpcy5jb25uZWN0aW9uQ29tcGxldGUoKTtcbiAgICAgIH1cblxuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNvZ25pdG8ubWFnaWNMaW5rQXV0aGVudGljYXRlKHVzZXJuYW1lKTtcbiAgICAgIFxuICAgICAgaWYodGhpcy5ob29rKSB7XG4gICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICBjb25zdCBwcm9jZWVkID0gYXdhaXQgdGhpcy5ob29rKHsgXCJzdGF0ZVwiOiBcImFmdGVyLW1hZ2ljLWxpbmstcmVxdWVzdFwiLCBtb2RlbDogdGhpcy5tb2RlbCwgc2Vzc2lvbklkOiByZXNwb25zZS51c2VyLlNlc3Npb24gfSk7XG4gICAgICAgIGlmKCFwcm9jZWVkKSByZXR1cm4gdGhpcy5jb25uZWN0aW9uQ29tcGxldGUoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoKGU6IGFueSkge1xuICAgICAgcmVzcG9uc2UgPSBlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25Db21wbGV0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHByb2Nlc3NNYWdpY0xpbmsoZW1haWw6IHN0cmluZywgY29kZTogc3RyaW5nLCBzZXNzaW9uSWQ6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLm9uQ29ubmVjdGluZy5lbWl0KHRydWUpO1xuICAgICAgYXdhaXQgdGhpcy5jb2duaXRvLm1hZ2ljTGlua0F1dGhlbnRpY2F0ZShlbWFpbCwgY29kZSwgc2Vzc2lvbklkKTtcbiAgICAgIGlmKHRoaXMucmVsb2FkQWZ0ZXJMaW5rQXV0aGVudGljYXRpb24pIHtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB3aW5kb3cubG9jYXRpb24ub3JpZ2luO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vbkF1dGhlbnRpY2F0ZWQuZW1pdCh0aGlzLmdldFVzZXJEYXRhKCkpOyAvL2Nvbm5lY3RlZFxuICAgICAgICB0aGlzLnNob3dGb3JtID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbkNvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaChlOiBhbnkpIHsgfSBcbiAgfVxuXG4gIGFzeW5jIGdldFBhc3NrZXkoKSB7XG4gICAgY29uc3QgdXNlcm5hbWUgPSB0aGlzLm1vZGVsLnVzZXJuYW1lIS5yZXBsYWNlKC9cXHMrL2dpbSxcIlwiKTtcbiAgICB0aGlzLnBhc3NrZXlBdXRoT3B0aW9ucyA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVBdXRoZW50aWNhdGlvbk9wdGlvbnModXNlcm5hbWUpO1xuICAgIFxuICAgIGNvbnN0IGNyZWRlbnRpYWxzID0gdGhpcy5wYXNza2V5QXV0aE9wdGlvbnM/LmFsbG93Q3JlZGVudGlhbHMgPz8gW107XG4gICAgaWYoIWNyZWRlbnRpYWxzLmxlbmd0aCAmJiAhdGhpcy5tb2RlbC5wYXNza2V5KSB0aGlzLnNlbmRQYXNza2V5Q29kZSgpO1xuICAgIGVsc2UgaWYoIWNyZWRlbnRpYWxzLmxlbmd0aCkgdGhpcy5yZWdpc3RlclBhc3NrZXkoKTtcbiAgICBlbHNlIHRoaXMudXNlUGFzc2tleSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZW5kUGFzc2tleUNvZGUoKSB7XG4gICAgY29uc3QgdXNlcm5hbWUgPSB0aGlzLm1vZGVsLnVzZXJuYW1lIS5yZXBsYWNlKC9cXHMrL2dpbSxcIlwiKTtcbiAgICBjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMuZ2V0VXNlcklkKHVzZXJuYW1lKTtcbiAgICB0aGlzLnNycCA9IGZhbHNlO1xuICAgIHRoaXMub3RwID0gZmFsc2U7XG4gICAgdGhpcy5tYWdpY0xpbmsgPSBmYWxzZTtcbiAgICB0aGlzLm1vZGVsLnNob3dDaGFsbGVuZ2VFbnRyeSA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHVzZVBhc3NrZXkoKSB7XG4gICAgY29uc3QgdXNlcm5hbWUgPSB0aGlzLm1vZGVsLnVzZXJuYW1lIS5yZXBsYWNlKC9cXHMrL2dpbSxcIlwiKTtcbiAgICB0aGlzLm9uQ29ubmVjdGluZy5lbWl0KHRydWUpO1xuICAgIGNvbnN0IGF1dGhlbnRpY2F0aW9uID0gYXdhaXQgc3RhcnRBdXRoZW50aWNhdGlvbih0aGlzLnBhc3NrZXlBdXRoT3B0aW9ucyk7XG4gICAgY29uc3Qgb3V0Y29tZSA9IGF3YWl0IHRoaXMudmVyaWZ5QXV0aGVudGljYXRpb24oYXV0aGVudGljYXRpb24pO1xuICAgIGF3YWl0IHRoaXMuY29nbml0by5wYXNza2V5QXV0aGVudGljYXRlKHVzZXJuYW1lKTtcbiAgICBcbiAgICBpZihvdXRjb21lLnZlcmlmaWVkKSB7XG4gICAgICBhd2FpdCB0aGlzLmNvZ25pdG8ucGFzc2tleUF1dGhlbnRpY2F0ZSh1c2VybmFtZSwgb3V0Y29tZS51aWQpO1xuICAgICAgdGhpcy5vbkF1dGhlbnRpY2F0ZWQuZW1pdCh0aGlzLmdldFVzZXJEYXRhKCkpO1xuICAgICAgdGhpcy5zaG93Rm9ybSA9IGZhbHNlO1xuICAgICAgdGhpcy5jb25uZWN0aW9uQ29tcGxldGUoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVyUGFzc2tleSgpIHtcbiAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMubW9kZWwudXNlcm5hbWUhLnJlcGxhY2UoL1xccysvZ2ltLFwiXCIpO1xuICAgIGNvbnN0IGNvZGUgPSB0aGlzLm1vZGVsLnBhc3NrZXkhLnJlcGxhY2UoL1xccysvZ2ltLFwiXCIpO1xuXG4gICAgdGhpcy5vbkNvbm5lY3RpbmcuZW1pdCh0cnVlKTtcbiAgICBjb25zdCBvcHRpb25zID0gYXdhaXQgdGhpcy5nZW5lcmF0ZVJlZ2lzdHJhdGlvbk9wdGlvbnMoY29kZSk7XG4gICAgY29uc3QgcmVnaXN0cmF0aW9uID0gYXdhaXQgc3RhcnRSZWdpc3RyYXRpb24ob3B0aW9ucyk7XG4gICAgY29uc3Qgb3V0Y29tZSA9IGF3YWl0IHRoaXMudmVyaWZ5UmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbiwgY29kZSk7XG4gICAgYXdhaXQgdGhpcy5jb2duaXRvLnBhc3NrZXlBdXRoZW50aWNhdGUodXNlcm5hbWUpO1xuICAgIFxuICAgIGlmKG91dGNvbWUudmVyaWZpZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMuY29nbml0by5wYXNza2V5QXV0aGVudGljYXRlKHVzZXJuYW1lLCBvdXRjb21lLnVpZCk7XG4gICAgICB0aGlzLm9uQXV0aGVudGljYXRlZC5lbWl0KHRoaXMuZ2V0VXNlckRhdGEoKSk7XG4gICAgICB0aGlzLnNob3dGb3JtID0gZmFsc2U7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25Db21wbGV0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uTmV3VXNlcigpIHtcbiAgICBsZXQgcmVzcG9uc2U6IElDb2duaXRvUmVzcG9uc2U7XG4gICAgdGhpcy5lcnJvciA9IG51bGw7XG4gICAgdGhpcy5tb2RlbC5uZXdQYXNzd29yZCA9IHRyaW0odGhpcy5tb2RlbC5uZXdQYXNzd29yZCk7XG5cbiAgICBpZih0aGlzLmhvb2spIHtcbiAgICAgIGNvbnN0IHByb2NlZWQgPSBhd2FpdCB0aGlzLmhvb2soeyBcInN0YXRlXCI6IFwiYmVmb3JlLXJlZ2lzdHJhdGlvblwiLCBtb2RlbDogdGhpcy5tb2RlbCB9KTtcbiAgICAgIGlmKCFwcm9jZWVkKSByZXR1cm47XG4gICAgfVxuICAgIFxuICAgIHRyeSB7XG4gICAgICB0aGlzLm9uQ29ubmVjdGluZy5lbWl0KHRydWUpO1xuICAgICAgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNvZ25pdG8uY29tcGxldGVQYXNzd29yZFVwZGF0ZSh0aGlzLm1vZGVsLm5ld1Bhc3N3b3JkISwgdGhpcy5jYWNoZSEudXNlciwgdGhpcy5nZXRVc2VyQXR0cmlidXRlcygpKTtcbiAgICB9IGNhdGNoKGU6IGFueSkge1xuICAgICAgcmVzcG9uc2UgPSBlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmhhbmRsZVJlc3BvbnNlKHJlc3BvbnNlISk7XG4gICAgfVxuXG4gIH1cblxuICBhc3luYyBvbkZvcmNlUGFzc3dvcmRSZXNldCgpIHtcbiAgICBcbiAgICB0aGlzLm1vZGVsLmNvZGUgPSB0cmltKHRoaXMubW9kZWwuY29kZSk7XG4gICAgdGhpcy5tb2RlbC5uZXdQYXNzd29yZCA9IHRyaW0odGhpcy5tb2RlbC5uZXdQYXNzd29yZCk7XG4gICAgdGhpcy5vbkNvbm5lY3RpbmcuZW1pdCh0cnVlKTtcblxuICAgIGlmKHRoaXMuaG9vaykge1xuICAgICAgY29uc3QgcHJvY2VlZCA9IGF3YWl0IHRoaXMuaG9vayh7IFwic3RhdGVcIjogXCJiZWZvcmUtZm9yY2UtcGFzc3dvcmQtcmVzZXRcIiwgbW9kZWw6IHRoaXMubW9kZWwgfSk7XG4gICAgICBpZighcHJvY2VlZCkgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNvZ25pdG8uY29uZmlybVBhc3N3b3JkKHRoaXMuY2FjaGUhLnVzZXIsIHRoaXMubW9kZWwuY29kZSwgdGhpcy5tb2RlbC5uZXdQYXNzd29yZCk7XG4gICAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICAgIHRoaXMudHJhbnNpdGlvbmluZyA9IHRydWU7XG4gICAgICBhd2FpdCB0aWNrKDI1MCk7XG4gICAgICB0aGlzLmZvcm1UeXBlID0gQ29nbml0b0Zvcm1UeXBlLkxvZ2luO1xuICAgICAgdGhpcy5zZXRNZXNzYWdpbmcocmVzcG9uc2UsIENvZ25pdG9TdHJpbmdzLm9uVXNlclBhc3N3b3JkQ2hhbmdlU3VjY2Vzc2Z1bCk7XG4gICAgICBhd2FpdCB0aWNrKDApO1xuICAgICAgdGhpcy50cmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICAgfSBjYXRjaChlOiBhbnkpIHtcbiAgICAgIHRoaXMuc2V0TWVzc2FnaW5nKGUgYXMgSUNvZ25pdG9SZXNwb25zZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMub25Db25uZWN0aW5nLmVtaXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uVXNlclBhc3N3b3JkUmVzZXQoKSB7XG5cbiAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICB0aGlzLm9uQ29ubmVjdGluZy5lbWl0KHRydWUpO1xuXG4gICAgdGhpcy5tb2RlbC5wYXNzd29yZCA9IHRyaW0odGhpcy5tb2RlbC5wYXNzd29yZCk7XG4gICAgdGhpcy5tb2RlbC5uZXdQYXNzd29yZCA9IHRyaW0odGhpcy5tb2RlbC5uZXdQYXNzd29yZCk7XG5cbiAgICBpZih0aGlzLmhvb2spIHtcbiAgICAgIGNvbnN0IHByb2NlZWQgPSBhd2FpdCB0aGlzLmhvb2soeyBcInN0YXRlXCI6IFwiYmVmb3JlLXVzZXItcGFzc3dvcmQtcmVzZXRcIiwgbW9kZWw6IHRoaXMubW9kZWwgfSk7XG4gICAgICBpZighcHJvY2VlZCkgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNvZ25pdG8ucmVzZXRQYXNzd29yZCh0aGlzLnVzZXIhLCB0aGlzLm1vZGVsLnBhc3N3b3JkISwgdGhpcy5tb2RlbC5uZXdQYXNzd29yZCk7XG4gICAgICB0aGlzLnRyYW5zaXRpb25pbmcgPSB0cnVlO1xuICAgICAgYXdhaXQgdGljaygyNTApO1xuICAgICAgdGhpcy5mb3JtVHlwZSA9IENvZ25pdG9Gb3JtVHlwZS5QYXNzd29yZFVwZGF0ZVN1Y2Nlc3NmdWw7XG4gICAgICB0aGlzLnByb21wdCA9IENvZ25pdG9TdHJpbmdzLm9uUGFzc3dvcmRVcGRhdGVkO1xuICAgICAgdGhpcy5lcnJvciA9IG51bGw7XG4gICAgICBhd2FpdCB0aWNrKCk7XG4gICAgICB0aGlzLnRyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICB9IGNhdGNoKGU6IGFueSkge1xuICAgICAgdGhpcy5zZXRNZXNzYWdpbmcoZSBhcyBJQ29nbml0b1Jlc3BvbnNlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5vbkNvbm5lY3RpbmcuZW1pdChmYWxzZSk7XG4gICAgfVxuXG4gIH1cblxuICBhc3luYyBvbkZvcmdvdFBhc3N3b3JkKCRldmVudDogTW91c2VFdmVudCkge1xuICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICRldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICBcbiAgICB0aGlzLnRyYW5zaXRpb25pbmcgPSB0cnVlO1xuICAgIGF3YWl0IHRpY2soMjUwKTtcbiAgICB0aGlzLmZvcm1UeXBlID0gQ29nbml0b0Zvcm1UeXBlLlVzZXJWZXJpZmljYXRpb25SZXF1ZXN0O1xuICAgIHRoaXMucHJvbXB0ID0gQ29nbml0b1N0cmluZ3Mub25WZXJpZmljYXRpb25Db2RlU2VudDtcbiAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICBhd2FpdCB0aWNrKCk7XG4gICAgdGhpcy50cmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gIH1cblxuICBhc3luYyBvblJlcXVlc3RWZXJpZmljYXRpb25Db2RlKCkge1xuXG4gICAgY29uc3QgdXNlcm5hbWUgPSB0aGlzLm1vZGVsLnVzZXJuYW1lIS5yZXBsYWNlKC9cXHMrL2dpbSxcIlwiKTtcbiAgICBjb25zdCBtb2RlbCA9IHsgdXNlcm5hbWUgfTtcblxuICAgIGlmKHRoaXMuaG9vaykge1xuICAgICAgY29uc3QgcHJvY2VlZCA9IGF3YWl0IHRoaXMuaG9vayh7IFwic3RhdGVcIjogXCJyZXF1ZXN0LXZlcmlmaWNhdGlvbi1jb2RlXCIsIFwidXNlcm5hbWVcIjogdXNlcm5hbWUsIG1vZGVsIH0pO1xuICAgICAgaWYoIXByb2NlZWQpIHJldHVybjtcbiAgICAgIHRoaXMubW9kZWwudXNlcm5hbWUgPSBtb2RlbC51c2VybmFtZTtcbiAgICB9XG5cbiAgICB0aGlzLm9uQ29ubmVjdGluZy5lbWl0KHRydWUpO1xuICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY29nbml0by5yZXF1ZXN0VmVyaWZpY2F0aW9uQ29kZShtb2RlbC51c2VybmFtZSk7XG4gICAgICB0aGlzLnRyYW5zaXRpb25pbmcgPSB0cnVlO1xuICAgICAgYXdhaXQgdGljaygyNTApO1xuICAgICAgdGhpcy5zZXRNZXNzYWdpbmcocmVzcG9uc2UsIENvZ25pdG9TdHJpbmdzLm9uTmV3UGFzc3dvcmRSZXF1aXJlZCk7XG4gICAgICB0aGlzLnNob3dQYXNzd29yZFJlc2V0Rm9ybShyZXNwb25zZSwgZmFsc2UpO1xuICAgIH0gY2F0Y2goZTogYW55KSB7XG4gICAgICB0aGlzLnNldE1lc3NhZ2luZyhlIGFzIElDb2duaXRvUmVzcG9uc2UpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25Db21wbGV0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIG5ld1VzZXJGb3JtRGlzYWJsZWQoKSB7XG4gICAgbGV0IGRpc2FibGVkID0gZmFsc2U7XG4gICAgdGhpcy5jYWNoZT8ucmVxdWlyZWRBdHRyaWJ1dGVzPy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZighdGhpcy5tb2RlbFtrZXldKSBkaXNhYmxlZCA9IHRydWU7XG4gICAgfSk7XG5cbiAgICBpZighdGhpcy5tb2RlbC5uZXdQYXNzd29yZCB8fCAhdGhpcy5tb2RlbC5uZXdQYXNzd29yZENvbmZpcm0pIHtcbiAgICAgIGRpc2FibGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZih0aGlzLm1vZGVsLm5ld1Bhc3N3b3JkICE9PSB0aGlzLm1vZGVsLm5ld1Bhc3N3b3JkQ29uZmlybSkge1xuICAgICAgZGlzYWJsZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBkaXNhYmxlZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhbGl6ZSgpIHtcbiAgICB0cnkge1xuICAgICAgaWYodGhpcy5jb2duaXRvVXJsICYmIGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiZW1zX2FjY2Vzc190b2tlblwiKSkge1xuICAgICAgICBcbiAgICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IHRoaXMuY29nbml0by5nZXRVc2VySW5mbyh0aGlzLmNvZ25pdG9VcmwpIGFzIElDb2duaXRvVXNlckRhdGE7XG5cbiAgICAgICAgLy9lbXVsYXRlIGNvZ25pdG8gdXNlci9zZXNzaW9uIGZvciBmZWRlcmF0ZWQgbG9naW5cbiAgICAgICAgdGhpcy5zZXNzaW9uID0gbmV3IENvZ25pdG9Vc2VyU2Vzc2lvbih7XG4gICAgICAgICAgSWRUb2tlbjogbmV3IENvZ25pdG9JZFRva2VuKHsgSWRUb2tlbjogaW5mby5pZFRva2VuIH0pLFxuICAgICAgICAgIEFjY2Vzc1Rva2VuOiBuZXcgQ29nbml0b0FjY2Vzc1Rva2VuKHsgQWNjZXNzVG9rZW46IGluZm8uYWNjZXNzVG9rZW4gfSksXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvZ25pdG8uY3JlYXRlRmVkZXJhdGVkU2Vzc2lvbihpbmZvLmlkVG9rZW4sIGluZm8uYWNjZXNzVG9rZW4pXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZih0aGlzLnNlc3Npb24pIHtcbiAgICAgICAgdGhpcy5vbkF1dGhlbnRpY2F0ZWQuZW1pdCh0aGlzLmdldFVzZXJEYXRhKCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlUmVzcG9uc2UocmVzcG9uc2U6IElDb2duaXRvUmVzcG9uc2UpIHtcblxuICAgIHRoaXMudHJhbnNpdGlvbmluZyA9IHRydWU7XG4gICAgXG4gICAgYXdhaXQgdGljaygyNTApO1xuXG4gICAgdGhpcy5zZXRNZXNzYWdpbmcocmVzcG9uc2UpO1xuICAgIHRoaXMuY2FjaGUgPSByZXNwb25zZS51c2VyQXR0cmlidXRlcyA/IHJlc3BvbnNlIDogdGhpcy5jYWNoZTtcblxuICAgIGlmKHJlc3BvbnNlLmVycm9yPy5jb2RlID09PSBDb2duaXRvUmVzcG9uc2VUeXBlLk5vdEF1dGhvcml6ZWQgJiYgcmVzcG9uc2UucmVxdWVzdCA9PT0gQ29nbml0b1JlcXVlc3RUeXBlLkF1dGhlbnRpY2F0aW9uKSB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25Db21wbGV0ZSgpOyAvL2xpa2VseSBiYWQgcGFzc3dvcmQgb3IgdG9vIG1hbnkgYXR0ZW1wdHNcbiAgICB9IGVsc2UgaWYocmVzcG9uc2UuZXJyb3I/LmNvZGUgPT09IENvZ25pdG9SZXNwb25zZVR5cGUuRm9yY2VQYXNzd29yZFJlc2V0ICYmIHJlc3BvbnNlLnJlcXVlc3QgPT09IENvZ25pdG9SZXF1ZXN0VHlwZS5BdXRoZW50aWNhdGlvbikge1xuICAgICAgdGhpcy5pbml0aWF0ZVBhc3N3b3JkUmVzZXQocmVzcG9uc2UpOyAvL2FkbWluIGhhcyBmb3JjZWQgdXNlciBwYXNzd29yZCByZXNldFxuICAgIH0gZWxzZSBpZihyZXNwb25zZS50eXBlID09PSBDb2duaXRvUmVzcG9uc2VUeXBlLk90cENoYWxsZW5nZSkge1xuICAgICAgdGhpcy5tb2RlbC5zaG93Q2hhbGxlbmdlRW50cnkgPSB0cnVlO1xuICAgICAgdGhpcy5jb25uZWN0aW9uQ29tcGxldGUoKTtcbiAgICB9IGVsc2UgaWYocmVzcG9uc2UudHlwZSA9PT0gQ29nbml0b1Jlc3BvbnNlVHlwZS5QYXNzd29yZFJlc2V0ICYmIHJlc3BvbnNlLnJlcXVlc3QgPT09IENvZ25pdG9SZXF1ZXN0VHlwZS5BdXRoZW50aWNhdGlvbikge1xuICAgICAgdGhpcy5wcm9tcHQgPSBDb2duaXRvU3RyaW5ncy5vbkZpcnN0TG9naW47XG4gICAgICB0aGlzLnNob3dQYXNzd29yZFJlc2V0Rm9ybShyZXNwb25zZSk7IC8vbmV3IHVzZXJcbiAgICB9IGVsc2UgaWYoIXJlc3BvbnNlLmVycm9yPy5jb2RlICYmIChyZXNwb25zZS5yZXF1ZXN0ID09PSBDb2duaXRvUmVxdWVzdFR5cGUuQXV0aGVudGljYXRpb24gfHwgcmVzcG9uc2UudHlwZSA9PT0gQ29nbml0b1Jlc3BvbnNlVHlwZS5BdXRoZW50aWNhdGVkICkpIHtcbiAgICAgIHRoaXMub25BdXRoZW50aWNhdGVkLmVtaXQodGhpcy5nZXRVc2VyRGF0YSgpKTsgLy9jb25uZWN0ZWRcbiAgICAgIHRoaXMuc2hvd0Zvcm0gPSBmYWxzZTtcbiAgICAgIHRoaXMuY29ubmVjdGlvbkNvbXBsZXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbkNvbXBsZXRlKCk7IC8vdW5zdXBwb3J0ZWQgcmVzcG9uc2UgLS0gaG9wZWZ1bGx5IGRlc2NyaWJlZCBpbiBtZXNzYWdpbmdcbiAgICB9XG5cbiAgICB0aGlzLm9uUmVzcG9uc2UuZW1pdCh7IHJlc3BvbnNlLCBtb2RlbDogdGhpcy5tb2RlbCB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW5pdGlhdGVQYXNzd29yZFJlc2V0KHJlc3BvbnNlOiBJQ29nbml0b1Jlc3BvbnNlKSB7XG4gICAgdGhpcy5lcnJvciA9IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuY29nbml0by5mb3Jnb3RQYXNzd29yZChyZXNwb25zZS51c2VyKTtcbiAgICAgIHRoaXMuc2V0TWVzc2FnaW5nKHJlc3VsdCwgQ29nbml0b1N0cmluZ3Mub25OZXdQYXNzd29yZFJlcXVpcmVkKTtcbiAgICAgIGF3YWl0IHRpY2soMjUwKTtcbiAgICAgIHRoaXMuc2hvd1Bhc3N3b3JkUmVzZXRGb3JtKHJlc3BvbnNlLCBmYWxzZSk7XG4gICAgfSBjYXRjaChlOiBhbnkpIHtcbiAgICAgIHRoaXMuc2V0TWVzc2FnaW5nKGUgYXMgSUNvZ25pdG9SZXNwb25zZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuY29ubmVjdGlvbkNvbXBsZXRlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRNZXNzYWdpbmcocmVzcG9uc2U6IElDb2duaXRvUmVzcG9uc2UsIHByb21wdDogc3RyaW5nIHwgbnVsbCA9IG51bGwpIHtcbiAgICBpZihyZXNwb25zZS5lcnJvcj8uY29kZSA9PT0gQ29nbml0b1Jlc3BvbnNlVHlwZS5MaW1pdEV4Y2VlZGVkRXhjZXB0aW9uKSB7XG4gICAgICB0aGlzLmVycm9yID0gQ29nbml0b1N0cmluZ3Mub25Ub29NYW55QXR0ZW1wdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXJyb3IgPSByZXNwb25zZS5lcnJvcj8ubWVzc2FnZSA/PyBudWxsO1xuICAgIH1cblxuICAgIHRoaXMucHJvbXB0ID0gcHJvbXB0O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb25uZWN0aW9uQ29tcGxldGUoKSB7XG4gICAgYXdhaXQgdGljaygpO1xuICAgIHRoaXMudHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuICAgIHRoaXMub25Db25uZWN0aW5nLmVtaXQoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzaG93Q3VycmVudEZvcm0oKSB7XG4gICAgaWYoIXRoaXMuZm9ybVR5cGUpIHJldHVybjtcblxuICAgIGlmKHRoaXMuZm9ybVR5cGUgPT09IENvZ25pdG9Gb3JtVHlwZS5Hb29nbGVTaWduSW4pIHtcbiAgICAgIHJldHVybiB0aGlzLnNpZ25JbldpdGhHb29nbGUoKTtcbiAgICB9XG5cbiAgICB0aGlzLmhvc3RTdHlsZSA9IHtcbiAgICAgIFwiYmFja2dyb3VuZFwiOiB0aGlzLm1vZGFsQmFja2dyb3VuZCxcbiAgICAgIFwiei1pbmRleFwiOiB0aGlzLnpJbmRleFxuICAgIH1cblxuICAgIGF3YWl0IHRpY2soKTtcblxuICAgIHRoaXMuc2hvd0Zvcm0gPSB0cnVlO1xuICAgIHRoaXMub25SZWFkeS5lbWl0KCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNob3dQYXNzd29yZFJlc2V0Rm9ybShyZXN1bHQ6IElDb2duaXRvUmVzcG9uc2UsIGlzTmV3VXNlcjogYm9vbGVhbiA9IHRydWUpIHtcbiAgICB0aGlzLmNhY2hlID0gcmVzdWx0O1xuICAgIHRoaXMucm93cyA9IFtdO1xuICAgIHRoaXMuZm9ybVR5cGUgPSBpc05ld1VzZXIgPyBDb2duaXRvRm9ybVR5cGUuTmV3VXNlciA6IENvZ25pdG9Gb3JtVHlwZS5Gb3JjZVBhc3N3b3JkUmVzZXQ7XG4gICAgXG4gICAgLy9idWJibGUgZmlyc3QgYW5kIGxhc3QgbmFtZSBmaWVsZHMgdG8gdGhlIHRvcCBvZiB0aGUgYXR0cmlidXRlcyBsaXN0XG4gICAgcmVzdWx0LnJlcXVpcmVkQXR0cmlidXRlcz8uc29ydCgoYSxiKSA9PiB7XG4gICAgICBpZihhID09PSBcImdpdmVuX25hbWVcIiAmJiBiID09PSBcImZhbWlseV9uYW1lXCIpIHJldHVybiAtMTtcbiAgICAgIGlmKGIgPT09IFwiZ2l2ZW5fbmFtZVwiICYmIGEgPT09IFwiZmFtaWx5X25hbWVcIikgcmV0dXJuIDE7XG4gICAgICBpZihhID09PSBcImdpdmVuX25hbWVcIikgcmV0dXJuIC0xO1xuICAgICAgaWYoYSA9PT0gXCJmYW1pbHlfbmFtZVwiKSByZXR1cm4gLSAxO1xuICAgICAgaWYoYiA9PT0gXCJnaXZlbl9uYW1lXCIpIHJldHVybiAxO1xuICAgICAgaWYoYiA9PT0gXCJmYW1pbHlfbmFtZVwiKSByZXR1cm4gMTtcbiAgICAgIHJldHVybiBhID4gYiA/IDEgOiAtMTtcbiAgICB9KTtcblxuICAgIC8vaW5qZWN0IGZvcm1yb3dzIGZvciByZXF1aXJlZCBhdHRyaWJ1dGVzXG4gICAgcmVzdWx0LnJlcXVpcmVkQXR0cmlidXRlcz8uZm9yRWFjaChrZXkgPT4ge1xuICAgICAgaWYoa2V5Lm1hdGNoKC9eZW1haWwvKSkgcmV0dXJuO1xuICAgICAgY29uc3QgdmFsdWUgPSByZXN1bHQudXNlckF0dHJpYnV0ZXMhW2tleV1cbiAgICAgIHRoaXMucm93cy5wdXNoKHtcbiAgICAgICAgbGFiZWw6IHVuc25ha2Uoa2V5KSxcbiAgICAgICAga2V5XG4gICAgICB9KTtcbiAgICAgIHRoaXMubW9kZWxba2V5XSA9IHZhbHVlICYmIHZhbHVlLmxlbmd0aCA/IHZhbHVlIDogdW5kZWZpbmVkXG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aWNrKCk7XG4gICAgdGhpcy5jb25uZWN0aW9uQ29tcGxldGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VXNlckF0dHJpYnV0ZXMoKTogUmVjb3JkPHN0cmluZyxzdHJpbmc+IHtcbiAgICBjb25zdCBhdHRyaWJ1dGVzID0ge30gYXMgUmVjb3JkPHN0cmluZyxzdHJpbmc+O1xuICAgIGlmKCF0aGlzLmNhY2hlPy5yZXF1aXJlZEF0dHJpYnV0ZXMpIHJldHVybiBhdHRyaWJ1dGVzO1xuICAgIHRoaXMuY2FjaGUhLnJlcXVpcmVkQXR0cmlidXRlcyEuZm9yRWFjaChrZXkgPT4gYXR0cmlidXRlc1trZXldID0gdGhpcy5tb2RlbFtrZXldKTtcbiAgICByZXR1cm4gYXR0cmlidXRlcztcbiAgfVxuXG4gIHByaXZhdGUgc2lnbkluV2l0aEdvb2dsZSgpIHtcbiAgICBjb25zdCB1cmwgPSBgJHt0aGlzLmNvZ25pdG9Vcmx9L29hdXRoMi9hdXRob3JpemU/aWRlbnRpdHlfcHJvdmlkZXI9JHt0aGlzLnByb3ZpZGVyTmFtZX0mcmVkaXJlY3RfdXJpPSR7d2luZG93LmxvY2F0aW9uLm9yaWdpbn0mcmVzcG9uc2VfdHlwZT1UT0tFTiZjbGllbnRfaWQ9JHt0aGlzLmNsaWVudElkfSZzY29wZT1lbWFpbCBvcGVuaWQgcHJvZmlsZSBhd3MuY29nbml0by5zaWduaW4udXNlci5hZG1pbmA7XG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XG4gIH1cblxuICBwcml2YXRlIGdldFVzZXJEYXRhKCk6IElDb2duaXRvVXNlckRhdGEge1xuICAgIHJldHVybiB7XG4gICAgICBlbWFpbDogdGhpcy5zZXNzaW9uIS5nZXRJZFRva2VuKCkucGF5bG9hZFtcImVtYWlsXCJdLFxuICAgICAgdXNlcm5hbWU6IHRoaXMuc2Vzc2lvbiEuZ2V0SWRUb2tlbigpLnBheWxvYWRbXCJjb2duaXRvOnVzZXJuYW1lXCJdLFxuICAgICAgc3ViOiAgdGhpcy5zZXNzaW9uIS5nZXRJZFRva2VuKCkucGF5bG9hZFtcInN1YlwiXSxcbiAgICAgIGZpcnN0TmFtZTogdGhpcy5zZXNzaW9uIS5nZXRJZFRva2VuKCkucGF5bG9hZFtcImdpdmVuX25hbWVcIl0sXG4gICAgICBsYXN0TmFtZTogdGhpcy5zZXNzaW9uIS5nZXRJZFRva2VuKCkucGF5bG9hZFtcImZhbWlseV9uYW1lXCJdLFxuICAgICAgaWRUb2tlbjogIHRoaXMuc2Vzc2lvbiEuZ2V0SWRUb2tlbigpLmdldEp3dFRva2VuKCksXG4gICAgICBhY2Nlc3NUb2tlbjogIHRoaXMuc2Vzc2lvbiEuZ2V0QWNjZXNzVG9rZW4oKS5nZXRKd3RUb2tlbigpLFxuICAgIH1cbiAgfVxuXG59XG4iLCI8Zm9ybSAqbmdJZj1cInNob3dGb3JtICYmIGZvcm1UeXBlID09PSBDb2duaXRvRm9ybVR5cGUuTG9naW5cIiBjbGFzcz1cImNvZ25pdG8tZm9ybVwiIChzdWJtaXQpPVwibG9naW4oKVwiPlxuXHQ8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGNsb3NlXCIgKGNsaWNrKT1cInNob3dGb3JtPWZhbHNlXCIgdHlwZT1cImJ1dHRvblwiPjxzcGFuIGNsYXNzPVwiYnV0dG9udGV4dFwiPnt7IHN0cmluZ3MubGFiZWxDbG9zZSB9fTwvc3Bhbj48L2J1dHRvbj5cblx0PGRpdiAqbmdJZj1cInByb21wdFwiIGNsYXNzPVwicHJvbXB0XCIgW2lubmVySHRtbF09XCJwcm9tcHRcIj48L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tZm9ybXJvd1wiPlxuXHRcdDxsYWJlbCBjbGFzcz1cImNvZ25pdG8tbGFiZWxcIiBmb3I9XCJ1c2VybmFtZVwiPnt7IHN0cmluZ3MubGFiZWxFbWFpbCB9fTwvbGFiZWw+XG5cdFx0PGlucHV0IGlkPVwidXNlcm5hbWVcIiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by10ZXh0XCIgdHlwZT1cInRleHRcIiBuYW1lPVwidXNlcm5hbWVcIiBbKG5nTW9kZWwpXT1cIm1vZGVsLnVzZXJuYW1lXCIgW2Rpc2FibGVkXT1cImRpc2FibGVVc2VybmFtZVwiLz5cblx0PC9kaXY+XG5cdDxkaXYgKm5nSWY9XCIhc3JwICYmICFvdHAgJiYgIXBhc3NrZXlzICYmICFtYWdpY0xpbmsgJiYgc2hvd0VtYWlsU3VibWl0QnV0dG9uXCIgY2xhc3M9XCJjb2duaXRvLWJ1dHRvbnNcIj5cblx0XHQ8YnV0dG9uIGNsYXNzPVwiY29nbml0by1pbnB1dCBjb2duaXRvLXN1Ym1pdCBjb2duaXRvLWJ1dHRvblwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwib25FbnRlclVzZXJuYW1lKClcIiBbZGlzYWJsZWRdPVwiIW1vZGVsLnVzZXJuYW1lXCI+e3sgc3RyaW5ncy5sYWJlbFN1Ym1pdCB9fTwvYnV0dG9uPlxuXHQ8L2Rpdj5cblx0PGRpdiAqbmdJZj1cInNycCAmJiAhc2hvd1Bhc3N3b3JkRmllbGRcIiBjbGFzcz1cImNvZ25pdG8tYnV0dG9uc1wiPlxuXHRcdDxidXR0b24gY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tc3VibWl0IGNvZ25pdG8tYnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzaG93UGFzc3dvcmRGaWVsZCA9IHRydWU7IG90cCA9IGZhbHNlOyBtYWdpY0xpbmsgPSBmYWxzZTsgcGFzc2tleXMgPSBmYWxzZVwiIFtkaXNhYmxlZF09XCIhbW9kZWwudXNlcm5hbWVcIj57eyBzdHJpbmdzLmxhYmVsVXNlUmVndWxhclBhc3N3b3JkIH19PC9idXR0b24+XG5cdDwvZGl2PlxuXHQ8ZGl2ICpuZ0lmPVwic3JwICYmIHNob3dQYXNzd29yZEZpZWxkXCIgY2xhc3M9XCJjb2duaXRvLWZvcm1yb3dcIj5cblx0XHQ8bGFiZWwgY2xhc3M9XCJjb2duaXRvLWxhYmVsXCIgZm9yPVwicGFzc3dvcmRcIj57eyBzdHJpbmdzLmxhYmVsUGFzc3dvcmQgfX08L2xhYmVsPlxuXHRcdDxpbnB1dCBpZD1cInBhc3N3b3JkXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tdGV4dFwiIHR5cGU9XCJwYXNzd29yZFwiIG5hbWU9XCJwYXNzd29yZFwiIFsobmdNb2RlbCldPVwibW9kZWwucGFzc3dvcmRcIi8+XG5cdDwvZGl2PlxuXHQ8ZGl2ICpuZ0lmPVwic3JwICYmIHNob3dQYXNzd29yZEZpZWxkXCIgY2xhc3M9XCJjb2duaXRvLWJ1dHRvbnNcIj5cblx0XHQ8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImFcIiAoY2xpY2spPVwib25Gb3Jnb3RQYXNzd29yZCgkZXZlbnQpXCI+e3sgc3RyaW5ncy5sYWJlbEZvcmdvdFBhc3N3b3JkIH19PC9idXR0b24+XG5cdFx0PGlucHV0IGNsYXNzPVwiY29nbml0by1pbnB1dCBjb2duaXRvLXN1Ym1pdCBjb2duaXRvLWJ1dHRvblwiIHR5cGU9XCJzdWJtaXRcIiBbdmFsdWVdPVwic3RyaW5ncy5sYWJlbFN1Ym1pdFwiLz5cblx0PC9kaXY+XG5cdDxkaXYgKm5nSWY9XCJvdHAgJiYgbW9kZWwuc2hvd0NoYWxsZW5nZUVudHJ5XCIgY2xhc3M9XCJjb2duaXRvLWZvcm1yb3dcIj5cblx0XHQ8bGFiZWwgY2xhc3M9XCJjb2duaXRvLWxhYmVsXCIgZm9yPVwib3RwXCI+e3sgc3RyaW5ncy5sYWJlbE90cEVudGVyIH19PC9sYWJlbD5cblx0XHQ8aW5wdXQgaWQ9XCJvdHBcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by10ZXh0XCIgdHlwZT1cInRleHRcIiBuYW1lPVwib3RwXCIgWyhuZ01vZGVsKV09XCJtb2RlbC5vdHBcIi8+XG5cdDwvZGl2PlxuXHQ8ZGl2ICpuZ0lmPVwicGFzc2tleXMgJiYgbW9kZWwuc2hvd0NoYWxsZW5nZUVudHJ5XCIgY2xhc3M9XCJjb2duaXRvLWZvcm1yb3dcIj5cblx0XHQ8bGFiZWwgY2xhc3M9XCJjb2duaXRvLWxhYmVsXCIgZm9yPVwicGFzc2tleS1yZWdcIj57eyBzdHJpbmdzLmxhYmVsUGFzc2tleUVudGVyIH19PC9sYWJlbD5cblx0XHQ8dGV4dGFyZWEgaWQ9XCJwYXNza2V5LXJlZ1wiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIGNsYXNzPVwiY29nbml0by1pbnB1dCBjb2duaXRvLXRleHRcIiBuYW1lPVwicGFzc2tleS1yZWdcIiBbKG5nTW9kZWwpXT1cIm1vZGVsLnBhc3NrZXlcIj48L3RleHRhcmVhPlxuXHQ8L2Rpdj5cblx0PGRpdiAqbmdJZj1cIm90cFwiIGNsYXNzPVwiY29nbml0by1idXR0b25zXCI+XG5cdFx0PGJ1dHRvbiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by1zdWJtaXQgY29nbml0by1idXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImdldE90cCgpXCIgW2Rpc2FibGVkXT1cIiFtb2RlbC51c2VybmFtZVwiPnt7IG1vZGVsLnNob3dDaGFsbGVuZ2VFbnRyeSA/IHN0cmluZ3MubGFiZWxTdWJtaXQgOiBzdHJpbmdzLmxhYmVsT3RwIH19PC9idXR0b24+XG5cdDwvZGl2Plx0XG5cdDxkaXYgKm5nSWY9XCJtYWdpY0xpbmtcIiBjbGFzcz1cImNvZ25pdG8tYnV0dG9uc1wiPlxuXHRcdDxidXR0b24gY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tc3VibWl0IGNvZ25pdG8tYnV0dG9uXCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJnZXRNYWdpY0xpbmsoKVwiIFtkaXNhYmxlZF09XCIhbW9kZWwudXNlcm5hbWVcIj57eyBzdHJpbmdzLmxhYmVsTWFnaWNMaW5rIH19PC9idXR0b24+XG5cdDwvZGl2Plx0XG5cdDxkaXYgKm5nSWY9XCJwYXNza2V5c1wiIGNsYXNzPVwiY29nbml0by1idXR0b25zXCI+XG5cdFx0PGJ1dHRvbiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by1zdWJtaXQgY29nbml0by1idXR0b25cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImdldFBhc3NrZXkoKVwiIFtkaXNhYmxlZF09XCIhbW9kZWwudXNlcm5hbWVcIj57eyBtb2RlbC5zaG93Q2hhbGxlbmdlRW50cnkgPyBzdHJpbmdzLmxhYmVsU3VibWl0IDogc3RyaW5ncy5sYWJlbFBhc3NrZXlzIH19PC9idXR0b24+XG5cdDwvZGl2Plx0XG5cdDxkaXYgKm5nSWY9XCJlcnJvclwiIGNsYXNzPVwiZXJyb3JcIiBbaW5uZXJIdG1sXT1cImVycm9yXCI+PC9kaXY+XG48L2Zvcm0+XG48Zm9ybSAqbmdJZj1cInNob3dGb3JtICYmIGZvcm1UeXBlID09PSBDb2duaXRvRm9ybVR5cGUuTmV3VXNlclwiIGNsYXNzPVwiY29nbml0by1mb3JtXCIgKHN1Ym1pdCk9XCJvbk5ld1VzZXIoKVwiPlxuXHQ8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGNsb3NlXCIgKGNsaWNrKT1cInNob3dGb3JtPWZhbHNlXCIgdHlwZT1cImJ1dHRvblwiPjxzcGFuIGNsYXNzPVwiYnV0dG9udGV4dFwiPnt7IHN0cmluZ3MubGFiZWxDbG9zZSB9fTwvc3Bhbj48L2J1dHRvbj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tZm9ybXJvd1wiPlxuXHRcdDxsYWJlbCBjbGFzcz1cImNvZ25pdG8tbGFiZWxcIiBmb3I9XCJ1c2VybmFtZVwiPnt7IHN0cmluZ3MubGFiZWxFbWFpbCB9fTwvbGFiZWw+XG5cdFx0PGlucHV0IGlkPVwidXNlcm5hbWVcIiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by10ZXh0XCIgdHlwZT1cInRleHRcIiBuYW1lPVwidXNlcm5hbWVcIiBbKG5nTW9kZWwpXT1cIm1vZGVsLnVzZXJuYW1lXCIgZGlzYWJsZWQgLz5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJjb2duaXRvLWZvcm1yb3dcIj5cblx0XHQ8bGFiZWwgY2xhc3M9XCJjb2duaXRvLWxhYmVsIG5vLW1iXCIgZm9yPVwibmV3LXBhc3N3b3JkXCI+e3sgc3RyaW5ncy5sYWJlbE5ld1Bhc3N3b3JkIH19PC9sYWJlbD5cblx0XHQ8cCBjbGFzcz1cImNvZ25pdG8tc3VibGFiZWxcIj57eyBzdHJpbmdzLmxhYmVsUGFzc3dvcmRSZXF1aXJlbWVudCB9fTwvcD5cblx0XHQ8aW5wdXQgaWQ9XCJuZXctcGFzc3dvcmRcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by10ZXh0XCIgdHlwZT1cInBhc3N3b3JkXCIgbmFtZT1cInBhc3N3b3JkLW5ld1wiIFsobmdNb2RlbCldPVwibW9kZWwubmV3UGFzc3dvcmRcIi8+XG5cdDwvZGl2PlxuXHQ8ZGl2IGNsYXNzPVwiY29nbml0by1mb3Jtcm93XCI+XG5cdFx0PGxhYmVsIGNsYXNzPVwiY29nbml0by1sYWJlbFwiIGZvcj1cInBhc3N3b3JkLWNvbmZpcm1cIj57eyBzdHJpbmdzLmxhYmVsQ29uZmlybU5ld1Bhc3N3b3JkIH19PC9sYWJlbD5cblx0XHQ8aW5wdXQgaWQ9XCJwYXNzd29yZC1jb25maXJtXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tdGV4dFwiIHR5cGU9XCJwYXNzd29yZFwiIG5hbWU9XCJwYXNzd29yZC1jb25maXJtXCIgWyhuZ01vZGVsKV09XCJtb2RlbC5uZXdQYXNzd29yZENvbmZpcm1cIi8+XG5cdDwvZGl2PlxuXHQ8ZGl2IGNsYXNzPVwiY29nbml0by1mb3Jtcm93XCIgKm5nRm9yPVwibGV0IHJvdyBvZiByb3dzXCI+XG5cdFx0PGxhYmVsIGNsYXNzPVwiY29nbml0by1sYWJlbFwiIGZvcj1cInVzZXJuYW1lXCI+e3sgcm93LmxhYmVsfGxhYmVsZXIgfX08L2xhYmVsPlxuXHRcdDxpbnB1dCBbaWRdPVwicm93LmtleVwiICBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by10ZXh0XCIgdHlwZT1cInRleHRcIiBbbmFtZV09XCJyb3cua2V5XCIgWyhuZ01vZGVsKV09XCJtb2RlbFtyb3cua2V5XVwiLz5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJjb2duaXRvLWJ1dHRvbnNcIj5cblx0XHQ8aW5wdXQgY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tc3VibWl0IGNvZ25pdG8tYnV0dG9uXCIgdHlwZT1cInN1Ym1pdFwiIFtkaXNhYmxlZF09XCJuZXdVc2VyRm9ybURpc2FibGVkKClcIiBbdmFsdWVdPVwic3RyaW5ncy5sYWJlbFN1Ym1pdFwiLz5cblx0PC9kaXY+XHRcblx0PGRpdiAqbmdJZj1cImVycm9yXCIgY2xhc3M9XCJlcnJvclwiIFtpbm5lckh0bWxdPVwiZXJyb3JcIj48L2Rpdj5cbjwvZm9ybT5cbjxmb3JtICpuZ0lmPVwic2hvd0Zvcm0gJiYgZm9ybVR5cGUgPT09IENvZ25pdG9Gb3JtVHlwZS5Gb3JjZVBhc3N3b3JkUmVzZXRcIiBjbGFzcz1cImNvZ25pdG8tZm9ybVwiIChzdWJtaXQpPVwib25Gb3JjZVBhc3N3b3JkUmVzZXQoKVwiPlxuXHQ8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGNsb3NlXCIgKGNsaWNrKT1cInNob3dGb3JtPWZhbHNlXCIgdHlwZT1cImJ1dHRvblwiPjxzcGFuIGNsYXNzPVwiYnV0dG9udGV4dFwiPnt7IHN0cmluZ3MubGFiZWxDbG9zZSB9fTwvc3Bhbj48L2J1dHRvbj5cblx0PGRpdiAqbmdJZj1cInByb21wdFwiIGNsYXNzPVwicHJvbXB0XCIgW2lubmVySHRtbF09XCJwcm9tcHRcIj48L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tZm9ybXJvd1wiPlxuXHRcdDxsYWJlbCBjbGFzcz1cImNvZ25pdG8tbGFiZWxcIiBmb3I9XCJ1c2VybmFtZVwiPnt7IHN0cmluZ3MubGFiZWxFbWFpbCB9fTwvbGFiZWw+XG5cdFx0PGlucHV0IGlkPVwidXNlcm5hbWVcIiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by10ZXh0XCIgdHlwZT1cInRleHRcIiBuYW1lPVwidXNlcm5hbWVcIiBbKG5nTW9kZWwpXT1cIm1vZGVsLnVzZXJuYW1lXCIgZGlzYWJsZWQgLz5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJjb2duaXRvLWZvcm1yb3dcIj5cblx0XHQ8bGFiZWwgY2xhc3M9XCJjb2duaXRvLWxhYmVsXCIgZm9yPVwiY29kZVwiPnt7IHN0cmluZ3MubGFiZWxDb2RlIH19PC9sYWJlbD5cblx0XHQ8aW5wdXQgaWQ9XCJjb2RlXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tdGV4dFwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImNvZGVcIiBbKG5nTW9kZWwpXT1cIm1vZGVsLmNvZGVcIi8+XG5cdDwvZGl2PlxuXHQ8ZGl2IGNsYXNzPVwiY29nbml0by1mb3Jtcm93XCI+XG5cdFx0PGxhYmVsIGNsYXNzPVwiY29nbml0by1sYWJlbFwiIGZvcj1cIm5ldy1wYXNzd29yZFwiPnt7IHN0cmluZ3MubGFiZWxOZXdQYXNzd29yZCB9fTwvbGFiZWw+XG5cdFx0PHAgY2xhc3M9XCJjb2duaXRvLXN1YmxhYmVsXCI+e3sgc3RyaW5ncy5sYWJlbFBhc3N3b3JkUmVxdWlyZW1lbnQgfX08L3A+XG5cdFx0PGlucHV0IGlkPVwibmV3LXBhc3N3b3JkXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tdGV4dFwiIHR5cGU9XCJwYXNzd29yZFwiIG5hbWU9XCJwYXNzd29yZC1uZXdcIiBbKG5nTW9kZWwpXT1cIm1vZGVsLm5ld1Bhc3N3b3JkXCIvPlxuXHQ8L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tZm9ybXJvd1wiPlxuXHRcdDxsYWJlbCBjbGFzcz1cImNvZ25pdG8tbGFiZWxcIiBmb3I9XCJwYXNzd29yZC1jb25maXJtXCI+e3sgc3RyaW5ncy5sYWJlbENvbmZpcm1OZXdQYXNzd29yZCB9fTwvbGFiZWw+XG5cdFx0PGlucHV0IGlkPVwicGFzc3dvcmQtY29uZmlybVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIGNsYXNzPVwiY29nbml0by1pbnB1dCBjb2duaXRvLXRleHRcIiB0eXBlPVwicGFzc3dvcmRcIiBuYW1lPVwicGFzc3dvcmQtY29uZmlybVwiIFsobmdNb2RlbCldPVwibW9kZWwubmV3UGFzc3dvcmRDb25maXJtXCIvPlxuXHQ8L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tYnV0dG9uc1wiPlxuXHRcdDxpbnB1dCBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by1zdWJtaXQgY29nbml0by1idXR0b25cIiB0eXBlPVwic3VibWl0XCIgW2Rpc2FibGVkXT1cIm5ld1VzZXJGb3JtRGlzYWJsZWQoKVwiIFt2YWx1ZV09XCJzdHJpbmdzLmxhYmVsU3VibWl0XCIvPlxuXHQ8L2Rpdj5cdFxuXHQ8ZGl2ICpuZ0lmPVwiZXJyb3JcIiBjbGFzcz1cImVycm9yXCIgW2lubmVySHRtbF09XCJlcnJvclwiPjwvZGl2PlxuPC9mb3JtPlxuPGZvcm0gKm5nSWY9XCJzaG93Rm9ybSAmJiBmb3JtVHlwZSA9PT0gQ29nbml0b0Zvcm1UeXBlLlVzZXJWZXJpZmljYXRpb25SZXF1ZXN0XCIgY2xhc3M9XCJjb2duaXRvLWZvcm1cIiAoc3VibWl0KT1cIm9uUmVxdWVzdFZlcmlmaWNhdGlvbkNvZGUoKVwiPlxuXHQ8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGNsb3NlXCIgKGNsaWNrKT1cInNob3dGb3JtPWZhbHNlXCIgdHlwZT1cImJ1dHRvblwiPjxzcGFuIGNsYXNzPVwiYnV0dG9udGV4dFwiPnt7IHN0cmluZ3MubGFiZWxDbG9zZSB9fTwvc3Bhbj48L2J1dHRvbj5cblx0PGRpdiAqbmdJZj1cInByb21wdFwiIGNsYXNzPVwicHJvbXB0XCIgW2lubmVySHRtbF09XCJwcm9tcHRcIj48L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tZm9ybXJvd1wiPlxuXHRcdDxsYWJlbCBjbGFzcz1cImNvZ25pdG8tbGFiZWxcIiBmb3I9XCJ1c2VybmFtZVwiPnt7IHN0cmluZ3MubGFiZWxFbWFpbCB9fTwvbGFiZWw+XG5cdFx0PGlucHV0IGlkPVwidXNlcm5hbWVcIiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by10ZXh0XCIgdHlwZT1cInRleHRcIiBuYW1lPVwidXNlcm5hbWVcIiBbKG5nTW9kZWwpXT1cIm1vZGVsLnVzZXJuYW1lXCIvPlxuXHQ8L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tYnV0dG9uc1wiPlxuXHRcdDxpbnB1dCBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by1zdWJtaXQgY29nbml0by1idXR0b25cIiB0eXBlPVwic3VibWl0XCIgW2Rpc2FibGVkXT1cIiFtb2RlbC51c2VybmFtZVwiIFt2YWx1ZV09XCJzdHJpbmdzLmxhYmVsU3VibWl0XCIvPlxuXHQ8L2Rpdj5cdFxuXHQ8ZGl2ICpuZ0lmPVwiZXJyb3JcIiBjbGFzcz1cImVycm9yXCIgW2lubmVySHRtbF09XCJlcnJvclwiPjwvZGl2PlxuPC9mb3JtPlxuPGZvcm0gKm5nSWY9XCJzaG93Rm9ybSAmJiBmb3JtVHlwZSA9PT0gQ29nbml0b0Zvcm1UeXBlLlVzZXJQYXNzd29yZFJlc2V0XCIgY2xhc3M9XCJjb2duaXRvLWZvcm1cIiAoc3VibWl0KT1cIm9uVXNlclBhc3N3b3JkUmVzZXQoKVwiPlxuXHQ8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIGNsb3NlXCIgKGNsaWNrKT1cInNob3dGb3JtPWZhbHNlXCIgdHlwZT1cImJ1dHRvblwiPjxzcGFuIGNsYXNzPVwiYnV0dG9udGV4dFwiPnt7IHN0cmluZ3MubGFiZWxDbG9zZSB9fTwvc3Bhbj48L2J1dHRvbj5cblx0PGRpdiAqbmdJZj1cInByb21wdFwiIGNsYXNzPVwicHJvbXB0XCIgW2lubmVySHRtbF09XCJwcm9tcHRcIj48L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tZm9ybXJvd1wiPlxuXHRcdDxsYWJlbCBjbGFzcz1cImNvZ25pdG8tbGFiZWxcIiBmb3I9XCJjdXJyZW50LXBhc3N3b3JkXCI+e3sgc3RyaW5ncy5sYWJlbEN1cnJlbnRQYXNzd29yZCB9fTwvbGFiZWw+XG5cdFx0PGlucHV0IGlkPVwiY3VycmVudC1wYXNzd29yZFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIGNsYXNzPVwiY29nbml0by1pbnB1dCBjb2duaXRvLXRleHRcIiB0eXBlPVwicGFzc3dvcmRcIiBuYW1lPVwicGFzc3dvcmRcIiBbKG5nTW9kZWwpXT1cIm1vZGVsLnBhc3N3b3JkXCIvPlxuXHQ8L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tZm9ybXJvd1wiPlxuXHRcdDxsYWJlbCBjbGFzcz1cImNvZ25pdG8tbGFiZWxcIiBmb3I9XCJuZXctcGFzc3dvcmRcIj57eyBzdHJpbmdzLmxhYmVsTmV3UGFzc3dvcmQgfX08L2xhYmVsPlxuXHRcdDxwIGNsYXNzPVwiY29nbml0by1zdWJsYWJlbFwiPnt7IHN0cmluZ3MubGFiZWxQYXNzd29yZFJlcXVpcmVtZW50IH19PC9wPlxuXHRcdDxpbnB1dCBpZD1cIm5ldy1wYXNzd29yZFwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIGNsYXNzPVwiY29nbml0by1pbnB1dCBjb2duaXRvLXRleHRcIiB0eXBlPVwicGFzc3dvcmRcIiBuYW1lPVwicGFzc3dvcmQtbmV3XCIgWyhuZ01vZGVsKV09XCJtb2RlbC5uZXdQYXNzd29yZFwiLz5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJjb2duaXRvLWZvcm1yb3dcIj5cblx0XHQ8bGFiZWwgY2xhc3M9XCJjb2duaXRvLWxhYmVsXCIgZm9yPVwicGFzc3dvcmQtY29uZmlybVwiPnt7IHN0cmluZ3MubGFiZWxDb25maXJtTmV3UGFzc3dvcmQgfX08L2xhYmVsPlxuXHRcdDxpbnB1dCBpZD1cInBhc3N3b3JkLWNvbmZpcm1cIiBhdXRvY29tcGxldGU9XCJvZmZcIiBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by10ZXh0XCIgdHlwZT1cInBhc3N3b3JkXCIgbmFtZT1cInBhc3N3b3JkLWNvbmZpcm1cIiBbKG5nTW9kZWwpXT1cIm1vZGVsLm5ld1Bhc3N3b3JkQ29uZmlybVwiLz5cblx0PC9kaXY+XG5cdDxkaXYgY2xhc3M9XCJjb2duaXRvLWJ1dHRvbnNcIj5cblx0XHQ8aW5wdXQgY2xhc3M9XCJjb2duaXRvLWlucHV0IGNvZ25pdG8tc3VibWl0IGNvZ25pdG8tYnV0dG9uXCIgdHlwZT1cInN1Ym1pdFwiIFtkaXNhYmxlZF09XCJuZXdVc2VyRm9ybURpc2FibGVkKClcIiBbdmFsdWVdPVwic3RyaW5ncy5sYWJlbFN1Ym1pdFwiLz5cblx0PC9kaXY+XHRcblx0PGRpdiAqbmdJZj1cImVycm9yXCIgY2xhc3M9XCJlcnJvclwiIFtpbm5lckh0bWxdPVwiZXJyb3JcIj48L2Rpdj5cbjwvZm9ybT5cbjxmb3JtICpuZ0lmPVwic2hvd0Zvcm0gJiYgZm9ybVR5cGUgPT09IENvZ25pdG9Gb3JtVHlwZS5QYXNzd29yZFVwZGF0ZVN1Y2Nlc3NmdWxcIiBjbGFzcz1cImNvZ25pdG8tZm9ybVwiIChzdWJtaXQpPVwic2hvd0Zvcm0gPSBmYWxzZVwiPlxuXHQ8ZGl2IGNsYXNzPVwicHJvbXB0XCIgW2lubmVySHRtbF09XCJwcm9tcHRcIj48L2Rpdj5cblx0PGRpdiBjbGFzcz1cImNvZ25pdG8tYnV0dG9uc1wiPlxuXHRcdDxpbnB1dCBjbGFzcz1cImNvZ25pdG8taW5wdXQgY29nbml0by1zdWJtaXQgY29nbml0by1idXR0b25cIiB0eXBlPVwic3VibWl0XCIgW3ZhbHVlXT1cInN0cmluZ3MubGFiZWxDbG9zZVwiLz5cblx0PC9kaXY+XHRcbjwvZm9ybT4iXX0=
|