ngx-oauth 3.0.1 → 3.0.2
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/components/login/oauth-login.component.mjs +3 -3
- package/esm2020/lib/models/index.mjs +3 -3
- package/esm2020/lib/oauth.module.mjs +4 -4
- package/esm2020/lib/services/oauth.interceptor.mjs +3 -3
- package/esm2020/lib/services/oauth.service.mjs +32 -32
- package/fesm2015/ngx-oauth.mjs +50 -46
- package/fesm2015/ngx-oauth.mjs.map +1 -1
- package/fesm2020/ngx-oauth.mjs +44 -44
- package/fesm2020/ngx-oauth.mjs.map +1 -1
- package/lib/services/oauth.service.d.ts +2 -2
- package/package.json +1 -1
|
@@ -77,9 +77,9 @@ export class OAuthLoginComponent {
|
|
|
77
77
|
this.collapse = false;
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
|
-
OAuthLoginComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.
|
|
81
|
-
OAuthLoginComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.
|
|
82
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.
|
|
80
|
+
OAuthLoginComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: OAuthLoginComponent, deps: [{ token: i1.OAuthService }, { token: i2.Location }, { token: LOCATION }], target: i0.ɵɵFactoryTarget.Component });
|
|
81
|
+
OAuthLoginComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.5", type: OAuthLoginComponent, selector: "oauth-login", inputs: { i18n: "i18n", redirectUri: "redirectUri", useLogoutUrl: "useLogoutUrl", state: "state", profileName$: "profileName$" }, outputs: { stateChange: "stateChange" }, host: { listeners: { "window:keydown.escape": "keyboardEvent()" } }, queries: [{ propertyName: "loginTemplate", first: true, predicate: ["login"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"state$ | async\"></ng-container>\r\n<ng-container *ngIf=\"loginTemplate; else defaultLogin\"\r\n [ngTemplateOutlet]=\"loginTemplate\"\r\n [ngTemplateOutletContext]=\"{login: loginFunction, logout: logoutFunction, status: status$ | async}\">\r\n</ng-container>\r\n<ng-template #defaultLogin>\r\n <ng-container *ngIf=\"status$ | async as status\">\r\n <ng-container *ngIf=\"type === OAuthType.RESOURCE; else noResource\">\r\n <div class=\"oauth dropdown text-end p-3 {{collapse ? 'show': ''}}\">\r\n <button class=\"btn btn-link p-0 dropdown-toggle\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : toggleCollapse()\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </button>\r\n <div class=\"dropdown-menu mr-3 {{collapse ? 'show': ''}}\">\r\n <form class=\"p-3\" #form=\"ngForm\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED || status === OAuthStatus.DENIED\"\r\n (submit)=\"login({username: username, password: password})\">\r\n <div class=\"mb-3\">\r\n <input type=\"text\"\r\n class=\"form-control\"\r\n name=\"username\"\r\n required\r\n [(ngModel)]=\"username\"\r\n [placeholder]=\"i18n.username\">\r\n </div>\r\n <div class=\"mb-3\">\r\n <input type=\"password\"\r\n class=\"form-control\"\r\n name=\"password\"\r\n required\r\n [(ngModel)]=\"password\"\r\n [placeholder]=\"i18n.password\">\r\n </div>\r\n <div class=\"text-end\">\r\n <button type=\"submit\"\r\n class=\"btn btn-primary\"\r\n [disabled]=\"form.invalid\">{{i18n.submit}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #noResource>\r\n <a role=\"button\" class=\"oauth\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : login({redirectUri: redirectUri, state:state})\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </a>\r\n </ng-template>\r\n\r\n <ng-template #message>\r\n <span *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED\" class=\"not-authorized\">{{i18n.notAuthorized}}</span>\r\n <span *ngIf=\"status === OAuthStatus.AUTHORIZED\" class=\"authorized\">\r\n <span class=\"welcome\">{{i18n.authorized}} </span>\r\n <strong class=\"profile-name\" [innerHTML]=\"profileName\"></strong>\r\n </span>\r\n <span *ngIf=\"status === OAuthStatus.DENIED\" class=\"denied\">{{i18n.denied}}</span>\r\n </ng-template>\r\n </ng-container>\r\n</ng-template>\r\n\r\n", styles: [".oauth .dropdown-menu{left:auto;right:0;box-shadow:0 5px 10px #0003;min-width:250px}.oauth .dropdown-menu:before{content:\"\";display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:#0003;position:absolute;top:-7px;left:auto;right:15px}.oauth .dropdown-menu:after{content:\"\";display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:auto;right:16px}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", 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]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None });
|
|
82
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: OAuthLoginComponent, decorators: [{
|
|
83
83
|
type: Component,
|
|
84
84
|
args: [{ selector: 'oauth-login', encapsulation: ViewEncapsulation.None, template: "<ng-container *ngIf=\"state$ | async\"></ng-container>\r\n<ng-container *ngIf=\"loginTemplate; else defaultLogin\"\r\n [ngTemplateOutlet]=\"loginTemplate\"\r\n [ngTemplateOutletContext]=\"{login: loginFunction, logout: logoutFunction, status: status$ | async}\">\r\n</ng-container>\r\n<ng-template #defaultLogin>\r\n <ng-container *ngIf=\"status$ | async as status\">\r\n <ng-container *ngIf=\"type === OAuthType.RESOURCE; else noResource\">\r\n <div class=\"oauth dropdown text-end p-3 {{collapse ? 'show': ''}}\">\r\n <button class=\"btn btn-link p-0 dropdown-toggle\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : toggleCollapse()\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </button>\r\n <div class=\"dropdown-menu mr-3 {{collapse ? 'show': ''}}\">\r\n <form class=\"p-3\" #form=\"ngForm\"\r\n *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED || status === OAuthStatus.DENIED\"\r\n (submit)=\"login({username: username, password: password})\">\r\n <div class=\"mb-3\">\r\n <input type=\"text\"\r\n class=\"form-control\"\r\n name=\"username\"\r\n required\r\n [(ngModel)]=\"username\"\r\n [placeholder]=\"i18n.username\">\r\n </div>\r\n <div class=\"mb-3\">\r\n <input type=\"password\"\r\n class=\"form-control\"\r\n name=\"password\"\r\n required\r\n [(ngModel)]=\"password\"\r\n [placeholder]=\"i18n.password\">\r\n </div>\r\n <div class=\"text-end\">\r\n <button type=\"submit\"\r\n class=\"btn btn-primary\"\r\n [disabled]=\"form.invalid\">{{i18n.submit}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #noResource>\r\n <a role=\"button\" class=\"oauth\"\r\n (click)=\"status === OAuthStatus.AUTHORIZED ? logout() : login({redirectUri: redirectUri, state:state})\">\r\n <ng-container *ngTemplateOutlet=\"message\"></ng-container>\r\n </a>\r\n </ng-template>\r\n\r\n <ng-template #message>\r\n <span *ngIf=\"status === OAuthStatus.NOT_AUTHORIZED\" class=\"not-authorized\">{{i18n.notAuthorized}}</span>\r\n <span *ngIf=\"status === OAuthStatus.AUTHORIZED\" class=\"authorized\">\r\n <span class=\"welcome\">{{i18n.authorized}} </span>\r\n <strong class=\"profile-name\" [innerHTML]=\"profileName\"></strong>\r\n </span>\r\n <span *ngIf=\"status === OAuthStatus.DENIED\" class=\"denied\">{{i18n.denied}}</span>\r\n </ng-template>\r\n </ng-container>\r\n</ng-template>\r\n\r\n", styles: [".oauth .dropdown-menu{left:auto;right:0;box-shadow:0 5px 10px #0003;min-width:250px}.oauth .dropdown-menu:before{content:\"\";display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:#0003;position:absolute;top:-7px;left:auto;right:15px}.oauth .dropdown-menu:after{content:\"\";display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:auto;right:16px}\n"] }]
|
|
85
85
|
}], ctorParameters: function () { return [{ type: i1.OAuthService }, { type: i2.Location }, { type: Location, decorators: [{
|
|
@@ -8,9 +8,9 @@ export const OAUTH_CONFIG = new InjectionToken('OAuthConfig');
|
|
|
8
8
|
export const OAUTH_TOKEN = new InjectionToken('OAuthToken');
|
|
9
9
|
export class OAuthConfig {
|
|
10
10
|
}
|
|
11
|
-
OAuthConfig.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.
|
|
12
|
-
OAuthConfig.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.
|
|
13
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.
|
|
11
|
+
OAuthConfig.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: OAuthConfig, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
12
|
+
OAuthConfig.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: OAuthConfig, providedIn: 'root', useFactory: () => inject(OAUTH_CONFIG).reduce((p, c) => ({ ...p, ...c }), {}) });
|
|
13
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: OAuthConfig, decorators: [{
|
|
14
14
|
type: Injectable,
|
|
15
15
|
args: [{
|
|
16
16
|
providedIn: 'root',
|
|
@@ -84,16 +84,16 @@ export class OAuthModule {
|
|
|
84
84
|
};
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
|
-
OAuthModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.
|
|
88
|
-
OAuthModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.
|
|
87
|
+
OAuthModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: OAuthModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
|
88
|
+
OAuthModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.0.5", ngImport: i0, type: OAuthModule, declarations: [OAuthLoginComponent], imports: [CommonModule,
|
|
89
89
|
FormsModule,
|
|
90
90
|
HttpClientModule,
|
|
91
91
|
RouterModule], exports: [OAuthLoginComponent] });
|
|
92
|
-
OAuthModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.
|
|
92
|
+
OAuthModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: OAuthModule, imports: [CommonModule,
|
|
93
93
|
FormsModule,
|
|
94
94
|
HttpClientModule,
|
|
95
95
|
RouterModule] });
|
|
96
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.
|
|
96
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: OAuthModule, decorators: [{
|
|
97
97
|
type: NgModule,
|
|
98
98
|
args: [{
|
|
99
99
|
imports: [
|
|
@@ -48,9 +48,9 @@ export class OAuthInterceptor {
|
|
|
48
48
|
return false;
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
|
-
OAuthInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.
|
|
52
|
-
OAuthInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.
|
|
53
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.
|
|
51
|
+
OAuthInterceptor.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: OAuthInterceptor, deps: [{ token: i1.OAuthService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
52
|
+
OAuthInterceptor.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: OAuthInterceptor });
|
|
53
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: OAuthInterceptor, decorators: [{
|
|
54
54
|
type: Injectable
|
|
55
55
|
}], ctorParameters: function () { return [{ type: i1.OAuthService }]; } });
|
|
56
56
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGguaW50ZXJjZXB0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtb2F1dGgvc3JjL2xpYi9zZXJ2aWNlcy9vYXV0aC5pbnRlcmNlcHRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBYSxVQUFVLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDNUMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRTFDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxXQUFXLENBQUM7OztBQUd0QyxNQUFNLE9BQU8sZ0JBQWdCO0lBRTNCLFlBQW9CLFlBQTBCO1FBQTFCLGlCQUFZLEdBQVosWUFBWSxDQUFjO0lBQzlDLENBQUM7SUFFRCxTQUFTLENBQUMsR0FBcUIsRUFBRSxJQUFpQjtRQUNoRCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzdCLE1BQU0sRUFBQyxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO2dCQUNsQyxJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFO29CQUMvQixHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQzt3QkFDZCxVQUFVLEVBQUU7NEJBQ1YsYUFBYSxFQUFFLEdBQUcsS0FBSyxDQUFDLFVBQVUsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFO3lCQUMzRDtxQkFDRixDQUFDLENBQUM7aUJBQ0o7YUFDRjtZQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQzFCLFVBQVUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNqQixJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDbkQsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO29CQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO2lCQUMvQztnQkFDRCxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6QixDQUFDLENBQUMsQ0FDSCxDQUFDO1NBQ0g7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN6QjtJQUNILENBQUM7SUFFTyxjQUFjLENBQUMsR0FBcUI7UUFDMUMsTUFBTSxFQUFDLFdBQVcsRUFBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDeEMsSUFBSSxXQUFXLEVBQUU7WUFDZixLQUFLLE1BQU0sVUFBVSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFO2dCQUN0RCxJQUFJO29CQUNGLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUU7d0JBQzdCLE9BQU8sSUFBSSxDQUFDO3FCQUNiO2lCQUNGO2dCQUFDLE9BQU8sR0FBRyxFQUFFO2lCQUNiO2FBQ0Y7U0FDRjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQzs7NkdBNUNVLGdCQUFnQjtpSEFBaEIsZ0JBQWdCOzJGQUFoQixnQkFBZ0I7a0JBRDVCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtIdHRwRXZlbnQsIEh0dHBIYW5kbGVyLCBIdHRwSW50ZXJjZXB0b3IsIEh0dHBSZXF1ZXN0fSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQge09ic2VydmFibGUsIHRocm93RXJyb3J9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtjYXRjaEVycm9yfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge09BdXRoU2VydmljZX0gZnJvbSAnLi9vYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7T0F1dGhTdGF0dXN9IGZyb20gJy4uL21vZGVscyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBPQXV0aEludGVyY2VwdG9yIGltcGxlbWVudHMgSHR0cEludGVyY2VwdG9yIHtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG9hdXRoU2VydmljZTogT0F1dGhTZXJ2aWNlKSB7XG4gIH1cblxuICBpbnRlcmNlcHQocmVxOiBIdHRwUmVxdWVzdDxhbnk+LCBuZXh0OiBIdHRwSGFuZGxlcik6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+IHtcbiAgICBpZiAodGhpcy5vYXV0aFNlcnZpY2UpIHtcbiAgICAgIGlmICghdGhpcy5pc1BhdGhFeGNlcHRlZChyZXEpKSB7XG4gICAgICAgIGNvbnN0IHt0b2tlbn0gPSB0aGlzLm9hdXRoU2VydmljZTtcbiAgICAgICAgaWYgKHRva2VuICYmIHRva2VuLmFjY2Vzc190b2tlbikge1xuICAgICAgICAgIHJlcSA9IHJlcS5jbG9uZSh7XG4gICAgICAgICAgICBzZXRIZWFkZXJzOiB7XG4gICAgICAgICAgICAgIEF1dGhvcml6YXRpb246IGAke3Rva2VuLnRva2VuX3R5cGV9ICR7dG9rZW4uYWNjZXNzX3Rva2VufWBcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcSkucGlwZShcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XG4gICAgICAgICAgaWYgKGVyci5zdGF0dXMgPT09IDQwMSAmJiAhdGhpcy5pc1BhdGhFeGNlcHRlZChyZXEpKSB7XG4gICAgICAgICAgICB0aGlzLm9hdXRoU2VydmljZS50b2tlbiA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLm9hdXRoU2VydmljZS5zdGF0dXMgPSBPQXV0aFN0YXR1cy5ERU5JRUQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGVycik7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzUGF0aEV4Y2VwdGVkKHJlcTogSHR0cFJlcXVlc3Q8YW55Pikge1xuICAgIGNvbnN0IHtpZ25vcmVQYXRoc30gPSB0aGlzLm9hdXRoU2VydmljZTtcbiAgICBpZiAoaWdub3JlUGF0aHMpIHtcbiAgICAgIGZvciAoY29uc3QgaWdub3JlUGF0aCBvZiB0aGlzLm9hdXRoU2VydmljZS5pZ25vcmVQYXRocykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmIChyZXEudXJsLm1hdGNoKGlnbm9yZVBhdGgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Inject, Injectable } from '@angular/core';
|
|
2
2
|
import { HttpHeaders, HttpParams } from '@angular/common/http';
|
|
3
3
|
import { catchError, concatMap, delay, filter, map, shareReplay, switchMap, tap } from 'rxjs/operators';
|
|
4
|
-
import { EMPTY, from, noop, of, ReplaySubject } from 'rxjs';
|
|
4
|
+
import { EMPTY, firstValueFrom, from, noop, of, ReplaySubject } from 'rxjs';
|
|
5
5
|
import { LOCATION, OAuthStatus, OAuthType } from '../models';
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
7
7
|
import * as i1 from "@angular/common/http";
|
|
@@ -148,7 +148,7 @@ export class OAuthService {
|
|
|
148
148
|
}
|
|
149
149
|
async login(parameters) {
|
|
150
150
|
if (this.isResourceType(parameters)) {
|
|
151
|
-
this.resourceLogin(parameters);
|
|
151
|
+
await this.resourceLogin(parameters);
|
|
152
152
|
}
|
|
153
153
|
else if (this.isAuthorizationCodeType(parameters)) {
|
|
154
154
|
await this.authorizationCodeLogin(parameters);
|
|
@@ -157,7 +157,7 @@ export class OAuthService {
|
|
|
157
157
|
await this.implicitLogin(parameters);
|
|
158
158
|
}
|
|
159
159
|
else if (this.isClientCredentialType()) {
|
|
160
|
-
this.clientCredentialLogin();
|
|
160
|
+
await this.clientCredentialLogin();
|
|
161
161
|
}
|
|
162
162
|
}
|
|
163
163
|
logout(useLogoutUrl) {
|
|
@@ -218,10 +218,28 @@ export class OAuthService {
|
|
|
218
218
|
get ignorePaths() {
|
|
219
219
|
return this.authConfig.ignorePaths || [];
|
|
220
220
|
}
|
|
221
|
-
|
|
221
|
+
async clientCredentialLogin() {
|
|
222
|
+
const { clientId, clientSecret, tokenPath, scope } = this.authConfig.config;
|
|
223
|
+
await firstValueFrom(this.http.post(tokenPath, new HttpParams({
|
|
224
|
+
fromObject: {
|
|
225
|
+
client_id: clientId,
|
|
226
|
+
client_secret: clientSecret,
|
|
227
|
+
grant_type: OAuthType.CLIENT_CREDENTIAL,
|
|
228
|
+
...scope ? { scope } : {},
|
|
229
|
+
}
|
|
230
|
+
}), { headers: REQUEST_HEADER }).pipe(catchError((err) => {
|
|
231
|
+
this.token = err;
|
|
232
|
+
this.status = OAuthStatus.DENIED;
|
|
233
|
+
return EMPTY;
|
|
234
|
+
}), tap(params => {
|
|
235
|
+
this.token = params;
|
|
236
|
+
this.status = OAuthStatus.AUTHORIZED;
|
|
237
|
+
})));
|
|
238
|
+
}
|
|
239
|
+
async resourceLogin(parameters) {
|
|
222
240
|
const { clientId, clientSecret, tokenPath, scope } = this.authConfig.config;
|
|
223
241
|
const { username, password } = parameters;
|
|
224
|
-
this.http.post(tokenPath, new HttpParams({
|
|
242
|
+
await firstValueFrom(this.http.post(tokenPath, new HttpParams({
|
|
225
243
|
fromObject: {
|
|
226
244
|
client_id: clientId,
|
|
227
245
|
...clientSecret && { client_secret: clientSecret } || {},
|
|
@@ -234,36 +252,18 @@ export class OAuthService {
|
|
|
234
252
|
this.token = err;
|
|
235
253
|
this.status = OAuthStatus.DENIED;
|
|
236
254
|
return EMPTY;
|
|
237
|
-
})
|
|
255
|
+
}), tap(params => {
|
|
238
256
|
this.token = params;
|
|
239
257
|
this.status = OAuthStatus.AUTHORIZED;
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
async authorizationCodeLogin(parameters) {
|
|
243
|
-
const authUrl = await this.toAuthorizationUrl(parameters, OAuthType.AUTHORIZATION_CODE);
|
|
244
|
-
this.location.replace(authUrl);
|
|
258
|
+
})));
|
|
245
259
|
}
|
|
246
260
|
async implicitLogin(parameters) {
|
|
247
261
|
const authUrl = await this.toAuthorizationUrl(parameters, OAuthType.IMPLICIT);
|
|
248
262
|
this.location.replace(authUrl);
|
|
249
263
|
}
|
|
250
|
-
|
|
251
|
-
const
|
|
252
|
-
this.
|
|
253
|
-
fromObject: {
|
|
254
|
-
client_id: clientId,
|
|
255
|
-
client_secret: clientSecret,
|
|
256
|
-
grant_type: OAuthType.CLIENT_CREDENTIAL,
|
|
257
|
-
...scope ? { scope } : {},
|
|
258
|
-
}
|
|
259
|
-
}), { headers: REQUEST_HEADER }).pipe(catchError((err) => {
|
|
260
|
-
this.token = err;
|
|
261
|
-
this.status = OAuthStatus.DENIED;
|
|
262
|
-
return EMPTY;
|
|
263
|
-
})).subscribe(params => {
|
|
264
|
-
this.token = params;
|
|
265
|
-
this.status = OAuthStatus.AUTHORIZED;
|
|
266
|
-
});
|
|
264
|
+
async authorizationCodeLogin(parameters) {
|
|
265
|
+
const authUrl = await this.toAuthorizationUrl(parameters, OAuthType.AUTHORIZATION_CODE);
|
|
266
|
+
this.location.replace(authUrl);
|
|
267
267
|
}
|
|
268
268
|
isClientCredentialType() {
|
|
269
269
|
return this.authConfig.type === OAuthType.CLIENT_CREDENTIAL;
|
|
@@ -392,12 +392,12 @@ export class OAuthService {
|
|
|
392
392
|
}
|
|
393
393
|
}
|
|
394
394
|
}
|
|
395
|
-
OAuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.
|
|
396
|
-
OAuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.
|
|
397
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.
|
|
395
|
+
OAuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: OAuthService, deps: [{ token: i1.HttpClient }, { token: i0.NgZone }, { token: i2.OAuthConfig }, { token: LOCATION }, { token: i3.Location }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
396
|
+
OAuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: OAuthService });
|
|
397
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.5", ngImport: i0, type: OAuthService, decorators: [{
|
|
398
398
|
type: Injectable
|
|
399
399
|
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i0.NgZone }, { type: i2.OAuthConfig }, { type: Location, decorators: [{
|
|
400
400
|
type: Inject,
|
|
401
401
|
args: [LOCATION]
|
|
402
402
|
}] }, { type: i3.Location }]; } });
|
|
403
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGguc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1vYXV0aC9zcmMvbGliL3NlcnZpY2VzL29hdXRoLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQVMsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFhLFdBQVcsRUFBRSxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RSxPQUFPLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3RHLE9BQU8sRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBYyxFQUFFLEVBQUUsYUFBYSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3RFLE9BQU8sRUFHTCxRQUFRLEVBR1IsV0FBVyxFQUVYLFNBQVMsRUFHVixNQUFNLFdBQVcsQ0FBQzs7Ozs7QUFHbkIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFlLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUU5RixNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztLQUN6QyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztLQUNuQixPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztLQUNuQixPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBRXJCLE1BQU0sWUFBWSxHQUFHLENBQUMsU0FBaUIsRUFBRSxF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LE9BQU8sRUFBRSxFQUFFO1lBQzNCLE1BQU0sRUFBRSxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsR0FBRyxPQUFPLEdBQUcsYUFBYSxHQUFHLE9BQU8sR0FBRyxhQUFhLENBQUMsQ0FBQztZQUMvRSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7SUFDL0IsQ0FBQztJQUVPLFNBQVMsQ0FBQyxVQUF5QztRQUN6RCxNQUFNLEVBQUMsS0FBSyxFQUFDLEdBQUcsVUFBaUIsQ0FBQztRQUNsQyxJQUFJLEtBQUssRUFBRTtZQUNULElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQzs7eUdBMVlVLFlBQVksNkZBcUJILFFBQVE7NkdBckJqQixZQUFZOzJGQUFaLFlBQVk7a0JBRHhCLFVBQVU7a0lBc0J1QyxRQUFROzBCQUEzQyxNQUFNOzJCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZSwgTmdab25lfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7SHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXN9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7Y2F0Y2hFcnJvciwgY29uY2F0TWFwLCBkZWxheSwgZmlsdGVyLCBtYXAsIHNoYXJlUmVwbGF5LCBzd2l0Y2hNYXAsIHRhcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtFTVBUWSwgZnJvbSwgbm9vcCwgT2JzZXJ2YWJsZSwgb2YsIFJlcGxheVN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgQXV0aG9yaXphdGlvbkNvZGVQYXJhbWV0ZXJzLFxuICBJbXBsaWNpdFBhcmFtZXRlcnMsXG4gIExPQ0FUSU9OLFxuICBPQXV0aENvbmZpZyxcbiAgT0F1dGhQYXJhbWV0ZXJzLFxuICBPQXV0aFN0YXR1cyxcbiAgT0F1dGhUb2tlbixcbiAgT0F1dGhUeXBlLFxuICBPQXV0aFR5cGVDb25maWcsIE9wZW5JZENvbmZpZywgT3BlbklkQ29uZmlndXJhdGlvbixcbiAgUmVzb3VyY2VQYXJhbWV0ZXJzLCBVc2VySW5mb1xufSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHtMb2NhdGlvbiBhcyBMb2NhdGlvbjJ9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5cbmNvbnN0IGFyclRvU3RyaW5nID0gKGJ1ZjogVWludDhBcnJheSkgPT4gYnVmLnJlZHVjZSgocywgYikgPT4gcyArIFN0cmluZy5mcm9tQ2hhckNvZGUoYiksICcnKTtcblxuY29uc3QgYmFzZTY0dXJsID0gKHN0cjogc3RyaW5nKSA9PiBidG9hKHN0cilcbiAgLnJlcGxhY2UoL1xcKy9nLCAnLScpXG4gIC5yZXBsYWNlKC9cXC8vZywgJ18nKVxuICAucmVwbGFjZSgvPS9nLCAnJyk7XG5cbmNvbnN0IHJhbmRvbVN0cmluZyA9IChsZW5ndGg6IG51bWJlciA9IDQ4KSA9PiB7XG4gIGNvbnN0IGJ1ZmYgPSBhcnJUb1N0cmluZyhjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KGxlbmd0aCAqIDIpKSk7XG4gIHJldHVybiBiYXNlNjR1cmwoYnVmZikuc3Vic3RyaW5nKDAsIGxlbmd0aCk7XG59O1xuXG5jb25zdCBwa2NlID0gYXN5bmMgKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgYnVmZiA9IGF3YWl0IGNyeXB0by5zdWJ0bGUuZGlnZXN0KCdTSEEtMjU2JywgbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKHZhbHVlKSk7XG4gIHJldHVybiBiYXNlNjR1cmwoYXJyVG9TdHJpbmcobmV3IFVpbnQ4QXJyYXkoYnVmZikpKTtcbn07XG5cbmNvbnN0IFJFUVVFU1RfSEVBREVSID0gbmV3IEh0dHBIZWFkZXJzKHsnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCd9KTtcblxuY29uc3QgcGFyc2VPYXV0aFVyaSA9IChoYXNoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgbnVsbCA9PiB7XG4gIGNvbnN0IHJlZ2V4ID0gLyhbXiY9XSspPShbXiZdKikvZztcbiAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGxldCBtO1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tY29uZGl0aW9uYWwtYXNzaWdubWVudFxuICB3aGlsZSAoKG0gPSByZWdleC5leGVjKGhhc2gpKSAhPT0gbnVsbCkge1xuICAgIHBhcmFtc1tkZWNvZGVVUklDb21wb25lbnQobVsxXSldID0gZGVjb2RlVVJJQ29tcG9uZW50KG1bMl0pO1xuICB9XG4gIGlmIChPYmplY3Qua2V5cyhwYXJhbXMpLmxlbmd0aCkge1xuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5jb25zdCBqd3QgPSAodG9rZW46IHN0cmluZykgPT4gSlNPTi5wYXJzZShhdG9iKHRva2VuLnNwbGl0KCcuJylbMV0pKTtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE9BdXRoU2VydmljZSB7XG5cbiAgcHJpdmF0ZSBfdG9rZW46IE9BdXRoVG9rZW4gfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBfc3RhdHVzID0gT0F1dGhTdGF0dXMuTk9UX0FVVEhPUklaRUQ7XG4gIHByaXZhdGUgdGltZXI6IGFueTtcbiAgc3RhdGUkOiBSZXBsYXlTdWJqZWN0PHN0cmluZz4gPSBuZXcgUmVwbGF5U3ViamVjdCgxKTtcbiAgc3RhdHVzJDogUmVwbGF5U3ViamVjdDxPQXV0aFN0YXR1cz4gPSBuZXcgUmVwbGF5U3ViamVjdCgxKTtcbiAgdXNlckluZm8kOiBPYnNlcnZhYmxlPFVzZXJJbmZvPiA9IHRoaXMuc3RhdHVzJC5waXBlKFxuICAgIGZpbHRlcihzID0+IHMgPT09IE9BdXRoU3RhdHVzLkFVVEhPUklaRUQpLFxuICAgIG1hcCgoKSA9PiB7XG4gICAgICBjb25zdCB7Y29uZmlnfSA9IHRoaXMuYXV0aENvbmZpZyBhcyBhbnk7XG4gICAgICByZXR1cm4gY29uZmlnLnVzZXJQYXRoO1xuICAgIH0pLFxuICAgIGZpbHRlcihwID0+ICEhcCksXG4gICAgc3dpdGNoTWFwKHBhdGggPT4gdGhpcy5odHRwLmdldDxVc2VySW5mbz4ocGF0aCkpLFxuICAgIHNoYXJlUmVwbGF5KClcbiAgKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgICAgICAgICAgIHByaXZhdGUgem9uZTogTmdab25lLFxuICAgICAgICAgICAgICBwcml2YXRlIGF1dGhDb25maWc6IE9BdXRoQ29uZmlnLFxuICAgICAgICAgICAgICBASW5qZWN0KExPQ0FUSU9OKSBwcml2YXRlIGxvY2F0aW9uOiBMb2NhdGlvbixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBsb2NhdGlvblNlcnZpY2U6IExvY2F0aW9uMikge1xuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5pbml0KCkpOyAvLyBkZWNvdXBsZSBmb3IgaHR0cCBpbnRlcmNlcHRvclxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgb2F1dGggY29uZmlnIGZvciBpbml0aWFsaXplLiBJZiBPcGVuSWQgd2l0aCBpc3N1ZXJQYXRoIGlzIGNvbmZpZ3VyZWQgdGhlbiBjb25maWd1cmUgZnJvbSBzZXJ2ZXIgb3BlbmlkIGNvbmZpZ3VyYXRpb24uXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBnZXQgY29uZmlnJCgpIHtcbiAgICBsZXQge2NvbmZpZ30gPSB0aGlzLmF1dGhDb25maWc7XG4gICAgaWYgKGNvbmZpZyAmJiBjb25maWcuY2xpZW50SWQpIHtcbiAgICAgIGNvbnN0IHtpc3N1ZXJQYXRoLCBzY29wZX0gPSBjb25maWcgYXMgT3BlbklkQ29uZmlnO1xuICAgICAgaWYgKGlzc3VlclBhdGgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8T3BlbklkQ29uZmlndXJhdGlvbj4oYCR7aXNzdWVyUGF0aH0vLndlbGwta25vd24vb3BlbmlkLWNvbmZpZ3VyYXRpb25gKS5waXBlKFxuICAgICAgICAgIHRhcCh2ID0+IHRoaXMudHlwZSAmJiB0aGlzLnNldCh0aGlzLnR5cGUsIHtcbiAgICAgICAgICAgIC4uLnYuYXV0aG9yaXphdGlvbl9lbmRwb2ludCAmJiB7YXV0aG9yaXplUGF0aDogdi5hdXRob3JpemF0aW9uX2VuZHBvaW50fSB8fCB7fSxcbiAgICAgICAgICAgIC4uLnYudG9rZW5fZW5kcG9pbnQgJiYge3Rva2VuUGF0aDogdi50b2tlbl9lbmRwb2ludH0gfHwge30sXG4gICAgICAgICAgICAuLi52LnJldm9jYXRpb25fZW5kcG9pbnQgJiYge3Jldm9rZVBhdGg6IHYucmV2b2NhdGlvbl9lbmRwb2ludH0gfHwge30sXG4gICAgICAgICAgICAuLi52LmNvZGVfY2hhbGxlbmdlX21ldGhvZHNfc3VwcG9ydGVkICYmIHtwa2NlOiB2LmNvZGVfY2hhbGxlbmdlX21ldGhvZHNfc3VwcG9ydGVkLmluZGV4T2YoJ1MyNTYnKSA+IC0xfSB8fCB7fSxcbiAgICAgICAgICAgIC4uLnYudXNlcmluZm9fZW5kcG9pbnQgJiYge3VzZXJQYXRoOiB2LnVzZXJpbmZvX2VuZHBvaW50fSB8fCB7fSxcbiAgICAgICAgICAgIC4uLnYuaW50cm9zcGVjdGlvbl9lbmRwb2ludCAmJiB7aW50cm9zcGVjdGlvblBhdGg6IHYuaW50cm9zcGVjdGlvbl9lbmRwb2ludH0gfHwge30sXG4gICAgICAgICAgICAuLi52LmVuZF9zZXNzaW9uX2VuZHBvaW50ICYmIHtsb2dvdXRQYXRoOiB2LmVuZF9zZXNzaW9uX2VuZHBvaW50fSB8fCB7fSxcbiAgICAgICAgICAgIC4uLnNjb3BlICYmIHt9IHx8IHtzY29wZTogJ29wZW5pZCd9XG4gICAgICAgICAgfSBhcyBhbnkpKSxcbiAgICAgICAgICBtYXAoKCkgPT4gdGhpcy5hdXRoQ29uZmlnLmNvbmZpZylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvZihjb25maWcpO1xuICAgIH1cbiAgICBjb25zb2xlLndhcm4oJ2NsaWVudElkIGlzIG1pc3NpbmcgaW4gb2F1dGggY29uZmlnJyk7XG4gICAgcmV0dXJuIEVNUFRZO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXQuIFdpbGwgY2hlY2sgdGhlIHVybCBpbXBsaWNpdCBvciBhdXRob3JpemF0aW9uIGZsb3cgb3IgZXhpc3Rpbmcgc2F2ZWQgdG9rZW4uXG4gICAqIEBwcm90ZWN0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBpbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IHtoYXNoLCBzZWFyY2gsIG9yaWdpbiwgcGF0aG5hbWV9ID0gdGhpcy5sb2NhdGlvbjtcbiAgICBjb25zdCBpc0ltcGxpY2l0UmVkaXJlY3QgPSBoYXNoICYmIC8oYWNjZXNzX3Rva2VuPSl8KGVycm9yPSkvLnRlc3QoaGFzaCk7XG4gICAgY29uc3QgaXNBdXRoQ29kZVJlZGlyZWN0ID0gc2VhcmNoICYmIC8oY29kZT0pfChlcnJvcj0pLy50ZXN0KHNlYXJjaCk7XG4gICAgY29uc3Qge3N0b3JhZ2VLZXl9ID0gdGhpcy5hdXRoQ29uZmlnO1xuICAgIGNvbnN0IHNhdmVkVG9rZW4gPSBzdG9yYWdlS2V5ICYmIHRoaXMuYXV0aENvbmZpZy5zdG9yYWdlICYmIHRoaXMuYXV0aENvbmZpZy5zdG9yYWdlW3N0b3JhZ2VLZXldICYmXG4gICAgICBKU09OLnBhcnNlKHRoaXMuYXV0aENvbmZpZy5zdG9yYWdlW3N0b3JhZ2VLZXldKTtcbiAgICB0aGlzLmNvbmZpZyQuc3Vic2NyaWJlKGNvbmZpZyA9PiB7XG4gICAgICBpZiAoaXNJbXBsaWNpdFJlZGlyZWN0KSB7XG4gICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBwYXJzZU9hdXRoVXJpKGhhc2guc3Vic3RyKDEpKTtcbiAgICAgICAgdGhpcy50b2tlbiA9IHBhcmFtZXRlcnM7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gdGhpcy5jaGVja1Jlc3BvbnNlKHNhdmVkVG9rZW4sIHBhcmFtZXRlcnMpICYmIE9BdXRoU3RhdHVzLkFVVEhPUklaRUQgfHwgT0F1dGhTdGF0dXMuREVOSUVEO1xuICAgICAgfSBlbHNlIGlmIChpc0F1dGhDb2RlUmVkaXJlY3QpIHtcbiAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IHBhcnNlT2F1dGhVcmkoc2VhcmNoLnN1YnN0cigxKSk7XG4gICAgICAgIGlmICghdGhpcy5jaGVja1Jlc3BvbnNlKHNhdmVkVG9rZW4sIHBhcmFtZXRlcnMpKSB7XG4gICAgICAgICAgdGhpcy50b2tlbiA9IHBhcmFtZXRlcnM7XG4gICAgICAgICAgdGhpcy5zdGF0dXMgPSBPQXV0aFN0YXR1cy5ERU5JRUQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgbmV3UGFyYW1ldGVyc1N0cmluZyA9IHRoaXMuZ2V0Q2xlYW5lZFVuU2VhcmNoUGFyYW1ldGVycygpO1xuICAgICAgICAgIGNvbnN0IHtjbGllbnRJZCwgY2xpZW50U2VjcmV0LCB0b2tlblBhdGgsIHNjb3BlfSA9IGNvbmZpZyBhcyBhbnk7XG4gICAgICAgICAgY29uc3QgY29kZVZlcmlmaWVyID0gc2F2ZWRUb2tlbiAmJiBzYXZlZFRva2VuLmNvZGVWZXJpZmllcjtcbiAgICAgICAgICB0aGlzLmh0dHAucG9zdCh0b2tlblBhdGgsIG5ldyBIdHRwUGFyYW1zKHtcbiAgICAgICAgICAgIGZyb21PYmplY3Q6IHtcbiAgICAgICAgICAgICAgY29kZTogcGFyYW1ldGVycz8uWydjb2RlJ10sXG4gICAgICAgICAgICAgIGNsaWVudF9pZDogY2xpZW50SWQsXG4gICAgICAgICAgICAgIC4uLmNsaWVudFNlY3JldCAmJiB7Y2xpZW50X3NlY3JldDogY2xpZW50U2VjcmV0fSB8fCB7fSxcbiAgICAgICAgICAgICAgcmVkaXJlY3RfdXJpOiBgJHtvcmlnaW59JHtwYXRobmFtZX1gLFxuICAgICAgICAgICAgICBncmFudF90eXBlOiAnYXV0aG9yaXphdGlvbl9jb2RlJyxcbiAgICAgICAgICAgICAgLi4uc2NvcGUgJiYge3Njb3BlfSB8fCB7fSxcbiAgICAgICAgICAgICAgLi4uY29kZVZlcmlmaWVyICYmIHtjb2RlX3ZlcmlmaWVyOiBjb2RlVmVyaWZpZXJ9IHx8IHt9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksIHtoZWFkZXJzOiBSRVFVRVNUX0hFQURFUn0pLnBpcGUoXG4gICAgICAgICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy50b2tlbiA9IGVycjtcbiAgICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSBPQXV0aFN0YXR1cy5ERU5JRUQ7XG4gICAgICAgICAgICAgIHRoaXMubG9jYXRpb25TZXJ2aWNlLnJlcGxhY2VTdGF0ZShgJHtwYXRobmFtZX0ke25ld1BhcmFtZXRlcnNTdHJpbmd9YCk7XG4gICAgICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKS5zdWJzY3JpYmUodG9rZW4gPT4ge1xuICAgICAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuO1xuICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSBPQXV0aFN0YXR1cy5BVVRIT1JJWkVEO1xuICAgICAgICAgICAgdGhpcy5sb2NhdGlvblNlcnZpY2UucmVwbGFjZVN0YXRlKGAke3BhdGhuYW1lfSR7bmV3UGFyYW1ldGVyc1N0cmluZ31gKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzYXZlZFRva2VuKSB7XG4gICAgICAgIHRoaXMuX3Rva2VuID0gc2F2ZWRUb2tlbjtcbiAgICAgICAgY29uc3Qge2FjY2Vzc190b2tlbiwgcmVmcmVzaF90b2tlbiwgZXJyb3J9ID0gc2F2ZWRUb2tlbjtcbiAgICAgICAgaWYgKGFjY2Vzc190b2tlbikge1xuICAgICAgICAgIGlmIChyZWZyZXNoX3Rva2VuKSB7IC8vIGZvcmNlIHJlZnJlc2ggc2luY2UgbWlnaHQgYmUgYSBtYW51YWwgcGFnZSByZWZyZXNoXG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hUb2tlbigpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnN0YXR1cyA9IE9BdXRoU3RhdHVzLkFVVEhPUklaRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc3RhdHVzID0gZXJyb3IgJiYgT0F1dGhTdGF0dXMuREVOSUVEIHx8IE9BdXRoU3RhdHVzLk5PVF9BVVRIT1JJWkVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0YXR1cyA9IE9BdXRoU3RhdHVzLk5PVF9BVVRIT1JJWkVEO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgbG9naW4ocGFyYW1ldGVycz86IE9BdXRoUGFyYW1ldGVycykge1xuICAgIGlmICh0aGlzLmlzUmVzb3VyY2VUeXBlKHBhcmFtZXRlcnMgYXMgUmVzb3VyY2VQYXJhbWV0ZXJzKSkge1xuICAgICAgdGhpcy5yZXNvdXJjZUxvZ2luKHBhcmFtZXRlcnMgYXMgUmVzb3VyY2VQYXJhbWV0ZXJzKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNBdXRob3JpemF0aW9uQ29kZVR5cGUocGFyYW1ldGVycyBhcyBBdXRob3JpemF0aW9uQ29kZVBhcmFtZXRlcnMpKSB7XG4gICAgICBhd2FpdCB0aGlzLmF1dGhvcml6YXRpb25Db2RlTG9naW4ocGFyYW1ldGVycyBhcyBBdXRob3JpemF0aW9uQ29kZVBhcmFtZXRlcnMpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0ltcGxpY2l0VHlwZShwYXJhbWV0ZXJzIGFzIEltcGxpY2l0UGFyYW1ldGVycykpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW1wbGljaXRMb2dpbihwYXJhbWV0ZXJzIGFzIEltcGxpY2l0UGFyYW1ldGVycyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzQ2xpZW50Q3JlZGVudGlhbFR5cGUoKSkge1xuICAgICAgdGhpcy5jbGllbnRDcmVkZW50aWFsTG9naW4oKTtcbiAgICB9XG4gIH1cblxuICBsb2dvdXQodXNlTG9nb3V0VXJsPzogYm9vbGVhbikge1xuICAgIHRoaXMucmV2b2tlKCk7XG4gICAgdGhpcy50b2tlbiA9IG51bGw7XG4gICAgdGhpcy5zdGF0dXMgPSBPQXV0aFN0YXR1cy5OT1RfQVVUSE9SSVpFRDtcbiAgICBjb25zdCB7bG9nb3V0UGF0aCwgbG9nb3V0UmVkaXJlY3RVcml9ID0gdGhpcy5hdXRoQ29uZmlnLmNvbmZpZyBhcyBhbnk7XG4gICAgaWYgKHVzZUxvZ291dFVybCAmJiBsb2dvdXRQYXRoKSB7XG4gICAgICBjb25zdCB7b3JpZ2luLCBwYXRobmFtZX0gPSB0aGlzLmxvY2F0aW9uO1xuICAgICAgY29uc3QgY3VycmVudFBhdGggPSBgJHtvcmlnaW59JHtwYXRobmFtZX1gO1xuICAgICAgdGhpcy5sb2NhdGlvbi5yZXBsYWNlKGAke2xvZ291dFBhdGh9P3Bvc3RfbG9nb3V0X3JlZGlyZWN0X3VyaT0ke2xvZ291dFJlZGlyZWN0VXJpIHx8IGN1cnJlbnRQYXRofWApO1xuICAgIH1cbiAgfVxuXG4gIHJldm9rZSgpIHtcbiAgICBjb25zdCB7cmV2b2tlUGF0aCwgY2xpZW50SWQsIGNsaWVudFNlY3JldH0gPSB0aGlzLmF1dGhDb25maWcuY29uZmlnIGFzIGFueTtcbiAgICBpZiAocmV2b2tlUGF0aCkge1xuICAgICAgY29uc3Qge2FjY2Vzc190b2tlbiwgcmVmcmVzaF90b2tlbn0gPSB0aGlzLnRva2VuIGFzIE9BdXRoVG9rZW47XG4gICAgICBjb25zdCB0b1Jldm9rZSA9IFtdO1xuICAgICAgaWYgKGFjY2Vzc190b2tlbikge1xuICAgICAgICB0b1Jldm9rZS5wdXNoKHtcbiAgICAgICAgICAuLi5jbGllbnRJZCAmJiB7Y2xpZW50X2lkOiBjbGllbnRJZH0gfHwge30sXG4gICAgICAgICAgLi4uY2xpZW50U2VjcmV0ICYmIHtjbGllbnRfc2VjcmV0OiBjbGllbnRTZWNyZXR9IHx8IHt9LFxuICAgICAgICAgIHRva2VuOiBhY2Nlc3NfdG9rZW4sXG4gICAgICAgICAgdG9rZW5fdHlwZV9oaW50OiAnYWNjZXNzX3Rva2VuJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWZyZXNoX3Rva2VuKSB7XG4gICAgICAgIHRvUmV2b2tlLnB1c2goe1xuICAgICAgICAgIC4uLmNsaWVudElkICYmIHtjbGllbnRfaWQ6IGNsaWVudElkfSB8fCB7fSxcbiAgICAgICAgICAuLi5jbGllbnRTZWNyZXQgJiYge2NsaWVudF9zZWNyZXQ6IGNsaWVudFNlY3JldH0gfHwge30sXG4gICAgICAgICAgdG9rZW46IHJlZnJlc2hfdG9rZW4sXG4gICAgICAgICAgdG9rZW5fdHlwZV9oaW50OiAncmVmcmVzaF90b2tlbidcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBmcm9tKHRvUmV2b2tlKS5waXBlKFxuICAgICAgICBjb25jYXRNYXAobyA9PiBvZihvKS5waXBlKGRlbGF5KDMwMCkpKSwgLy8gc3BhY2UgcmVxdWVzdCB0byBhdm9pZCBjYW5jZWxsYXRpb25cbiAgICAgICAgc3dpdGNoTWFwKG8gPT4gdGhpcy5odHRwLnBvc3QocmV2b2tlUGF0aCwgbmV3IEh0dHBQYXJhbXMoe2Zyb21PYmplY3Q6IG99KSkpLFxuICAgICAgKS5zdWJzY3JpYmUobm9vcCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHN0YXR1cygpOiBPQXV0aFN0YXR1cyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXR1cztcbiAgfVxuXG4gIHNldCBzdGF0dXMoc3RhdHVzKSB7XG4gICAgdGhpcy5fc3RhdHVzID0gc3RhdHVzO1xuICAgIHRoaXMuc3RhdHVzJC5uZXh0KHN0YXR1cyk7XG4gIH1cblxuICBzZXQodHlwZTogT0F1dGhUeXBlLCBjb25maWc/OiBPQXV0aFR5cGVDb25maWcpOiB2b2lkIHtcbiAgICB0aGlzLmF1dGhDb25maWcudHlwZSA9IHR5cGU7XG4gICAgaWYgKGNvbmZpZykge1xuICAgICAgdGhpcy5hdXRoQ29uZmlnLmNvbmZpZyA9IHtcbiAgICAgICAgLi4udGhpcy5hdXRoQ29uZmlnLmNvbmZpZyxcbiAgICAgICAgLi4uY29uZmlnXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiB0aGlzLmF1dGhDb25maWcudHlwZTtcbiAgfVxuXG4gIGdldCBpZ25vcmVQYXRocygpOiBSZWdFeHBbXSB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aENvbmZpZy5pZ25vcmVQYXRocyB8fCBbXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb3VyY2VMb2dpbihwYXJhbWV0ZXJzOiBSZXNvdXJjZVBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCB7Y2xpZW50SWQsIGNsaWVudFNlY3JldCwgdG9rZW5QYXRoLCBzY29wZX0gPSB0aGlzLmF1dGhDb25maWcuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCB7dXNlcm5hbWUsIHBhc3N3b3JkfSA9IHBhcmFtZXRlcnM7XG4gICAgdGhpcy5odHRwLnBvc3QodG9rZW5QYXRoLCBuZXcgSHR0cFBhcmFtcyh7XG4gICAgICBmcm9tT2JqZWN0OiB7XG4gICAgICAgIGNsaWVudF9pZDogY2xpZW50SWQsXG4gICAgICAgIC4uLmNsaWVudFNlY3JldCAmJiB7Y2xpZW50X3NlY3JldDogY2xpZW50U2VjcmV0fSB8fCB7fSxcbiAgICAgICAgZ3JhbnRfdHlwZTogT0F1dGhUeXBlLlJFU09VUkNFLFxuICAgICAgICAuLi5zY29wZSAmJiB7c2NvcGV9IHx8IHt9LFxuICAgICAgICB1c2VybmFtZSxcbiAgICAgICAgcGFzc3dvcmRcbiAgICAgIH1cbiAgICB9KSwge2hlYWRlcnM6IFJFUVVFU1RfSEVBREVSfSkucGlwZShcbiAgICAgIGNhdGNoRXJyb3IoZXJyID0+IHtcbiAgICAgICAgdGhpcy50b2tlbiA9IGVycjtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBPQXV0aFN0YXR1cy5ERU5JRUQ7XG4gICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgIH0pXG4gICAgKS5zdWJzY3JpYmUocGFyYW1zID0+IHtcbiAgICAgIHRoaXMudG9rZW4gPSBwYXJhbXM7XG4gICAgICB0aGlzLnN0YXR1cyA9IE9BdXRoU3RhdHVzLkFVVEhPUklaRUQ7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGF1dGhvcml6YXRpb25Db2RlTG9naW4ocGFyYW1ldGVyczogQXV0aG9yaXphdGlvbkNvZGVQYXJhbWV0ZXJzKSB7XG4gICAgY29uc3QgYXV0aFVybCA9IGF3YWl0IHRoaXMudG9BdXRob3JpemF0aW9uVXJsKHBhcmFtZXRlcnMsIE9BdXRoVHlwZS5BVVRIT1JJWkFUSU9OX0NPREUpO1xuICAgIHRoaXMubG9jYXRpb24ucmVwbGFjZShhdXRoVXJsKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW1wbGljaXRMb2dpbihwYXJhbWV0ZXJzOiBJbXBsaWNpdFBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBhdXRoVXJsID0gYXdhaXQgdGhpcy50b0F1dGhvcml6YXRpb25VcmwocGFyYW1ldGVycywgT0F1dGhUeXBlLklNUExJQ0lUKTtcbiAgICB0aGlzLmxvY2F0aW9uLnJlcGxhY2UoYXV0aFVybCk7XG4gIH1cblxuICBwcml2YXRlIGNsaWVudENyZWRlbnRpYWxMb2dpbigpIHtcbiAgICBjb25zdCB7Y2xpZW50SWQsIGNsaWVudFNlY3JldCwgdG9rZW5QYXRoLCBzY29wZX0gPSB0aGlzLmF1dGhDb25maWcuY29uZmlnIGFzIGFueTtcbiAgICB0aGlzLmh0dHAucG9zdCh0b2tlblBhdGgsIG5ldyBIdHRwUGFyYW1zKHtcbiAgICAgIGZyb21PYmplY3Q6IHtcbiAgICAgICAgY2xpZW50X2lkOiBjbGllbnRJZCxcbiAgICAgICAgY2xpZW50X3NlY3JldDogY2xpZW50U2VjcmV0LFxuICAgICAgICBncmFudF90eXBlOiBPQXV0aFR5cGUuQ0xJRU5UX0NSRURFTlRJQUwsXG4gICAgICAgIC4uLnNjb3BlID8ge3Njb3BlfSA6IHt9LFxuICAgICAgfVxuICAgIH0pLCB7aGVhZGVyczogUkVRVUVTVF9IRUFERVJ9KS5waXBlKFxuICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMudG9rZW4gPSBlcnI7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gT0F1dGhTdGF0dXMuREVOSUVEO1xuICAgICAgICByZXR1cm4gRU1QVFk7XG4gICAgICB9KVxuICAgICkuc3Vic2NyaWJlKHBhcmFtcyA9PiB7XG4gICAgICB0aGlzLnRva2VuID0gcGFyYW1zO1xuICAgICAgdGhpcy5zdGF0dXMgPSBPQXV0aFN0YXR1cy5BVVRIT1JJWkVEO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0NsaWVudENyZWRlbnRpYWxUeXBlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmF1dGhDb25maWcudHlwZSA9PT0gT0F1dGhUeXBlLkNMSUVOVF9DUkVERU5USUFMO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1Jlc291cmNlVHlwZShwYXJhbWV0ZXJzPzogUmVzb3VyY2VQYXJhbWV0ZXJzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aENvbmZpZy50eXBlID09PSBPQXV0aFR5cGUuUkVTT1VSQ0UgJiYgISFwYXJhbWV0ZXJzPy5wYXNzd29yZDtcbiAgfVxuXG4gIHByaXZhdGUgaXNJbXBsaWNpdFR5cGUocGFyYW1ldGVycz86IEltcGxpY2l0UGFyYW1ldGVycyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmF1dGhDb25maWcudHlwZSA9PT0gT0F1dGhUeXBlLklNUExJQ0lUICYmICEhcGFyYW1ldGVycz8ucmVkaXJlY3RVcmk7XG4gIH1cblxuICBwcml2YXRlIGlzQXV0aG9yaXphdGlvbkNvZGVUeXBlKHBhcmFtZXRlcnM/OiBBdXRob3JpemF0aW9uQ29kZVBhcmFtZXRlcnMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoQ29uZmlnLnR5cGUgPT09IE9BdXRoVHlwZS5BVVRIT1JJWkFUSU9OX0NPREUgJiYgISFwYXJhbWV0ZXJzPy5yZWRpcmVjdFVyaTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgdG9BdXRob3JpemF0aW9uVXJsKHBhcmFtZXRlcnM6IEF1dGhvcml6YXRpb25Db2RlUGFyYW1ldGVycyB8IEltcGxpY2l0UGFyYW1ldGVycywgcmVzcG9uc2VUeXBlOiBPQXV0aFR5cGUpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHtjb25maWd9ID0gdGhpcy5hdXRoQ29uZmlnIGFzIGFueTtcbiAgICBsZXQgYXV0aG9yaXphdGlvblVybCA9IGAke2NvbmZpZy5hdXRob3JpemVQYXRofWA7XG4gICAgYXV0aG9yaXphdGlvblVybCArPSBjb25maWcuYXV0aG9yaXplUGF0aC5pbmNsdWRlcygnPycpICYmICcmJyB8fCAnPyc7XG4gICAgYXV0aG9yaXphdGlvblVybCArPSBgY2xpZW50X2lkPSR7Y29uZmlnLmNsaWVudElkfWA7XG4gICAgYXV0aG9yaXphdGlvblVybCArPSBgJnJlZGlyZWN0X3VyaT0ke2VuY29kZVVSSUNvbXBvbmVudChwYXJhbWV0ZXJzLnJlZGlyZWN0VXJpKX1gO1xuICAgIGF1dGhvcml6YXRpb25VcmwgKz0gYCZyZXNwb25zZV90eXBlPSR7cmVzcG9uc2VUeXBlfWA7XG4gICAgYXV0aG9yaXphdGlvblVybCArPSBgJnNjb3BlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGNvbmZpZy5zY29wZSB8fCAnJyl9YDtcbiAgICBhdXRob3JpemF0aW9uVXJsICs9IGAmc3RhdGU9JHtlbmNvZGVVUklDb21wb25lbnQocGFyYW1ldGVycy5zdGF0ZSB8fCAnJyl9YDtcbiAgICByZXR1cm4gYCR7YXV0aG9yaXphdGlvblVybH0ke3RoaXMuZ2VuZXJhdGVOb25jZShjb25maWcpfSR7YXdhaXQgdGhpcy5nZW5lcmF0ZUNvZGVDaGFsbGVuZ2UoY29uZmlnKX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZUNvZGVDaGFsbGVuZ2UoY29uZmlnOiBhbnkpIHtcbiAgICBpZiAoY29uZmlnLnBrY2UpIHtcbiAgICAgIGNvbnN0IGNvZGVWZXJpZmllciA9IHJhbmRvbVN0cmluZygpO1xuICAgICAgdGhpcy50b2tlbiA9IHsuLi50aGlzLnRva2VuLCBjb2RlVmVyaWZpZXJ9O1xuICAgICAgcmV0dXJuIGAmY29kZV9jaGFsbGVuZ2U9JHthd2FpdCBwa2NlKGNvZGVWZXJpZmllcil9JmNvZGVfY2hhbGxlbmdlX21ldGhvZD1TMjU2YDtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZU5vbmNlKGNvbmZpZzogYW55KSB7XG4gICAgaWYgKGNvbmZpZyAmJiBjb25maWcuc2NvcGUgJiYgY29uZmlnLnNjb3BlLmluZGV4T2YoJ29wZW5pZCcpID4gLTEpIHtcbiAgICAgIGNvbnN0IG5vbmNlID0gcmFuZG9tU3RyaW5nKDEwKTtcbiAgICAgIHRoaXMudG9rZW4gPSB7Li4udGhpcy50b2tlbiwgbm9uY2V9O1xuICAgICAgcmV0dXJuIGAmbm9uY2U9JHtub25jZX1gO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrUmVzcG9uc2UodG9rZW46IGFueSwgcGFyYW1ldGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IG51bGwpIHtcbiAgICB0aGlzLmVtaXRTdGF0ZShwYXJhbWV0ZXJzKTtcbiAgICB0aGlzLmNsZWFuTG9jYXRpb25IYXNoKCk7XG4gICAgaWYgKCFwYXJhbWV0ZXJzIHx8IHBhcmFtZXRlcnNbJ2Vycm9yJ10pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRva2VuICYmIHRva2VuLm5vbmNlICYmIHBhcmFtZXRlcnNbJ2FjY2Vzc190b2tlbiddKSB7XG4gICAgICBjb25zdCBqd3RUb2tlbiA9IGp3dChwYXJhbWV0ZXJzWydhY2Nlc3NfdG9rZW4nXSk7XG4gICAgICByZXR1cm4gdG9rZW4ubm9uY2UgPT09IGp3dFRva2VuLm5vbmNlO1xuICAgIH1cbiAgICByZXR1cm4gcGFyYW1ldGVyc1snYWNjZXNzX3Rva2VuJ10gfHwgcGFyYW1ldGVyc1snY29kZSddO1xuICB9XG5cbiAgc2V0IHRva2VuKHRva2VuOiBPQXV0aFRva2VuIHwgbnVsbCkge1xuICAgIHRoaXMuX3Rva2VuID0gdG9rZW47XG4gICAgY29uc3Qge3N0b3JhZ2VLZXl9ID0gdGhpcy5hdXRoQ29uZmlnO1xuICAgIGlmICh0b2tlbikge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgdGhpcy5hdXRoQ29uZmlnLnN0b3JhZ2Vbc3RvcmFnZUtleV0gPSBKU09OLnN0cmluZ2lmeSh0aGlzLnRva2VuKTtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyKTtcbiAgICAgIGlmICh0aGlzLnRva2VuICYmIHRoaXMudG9rZW4uZXhwaXJlc19pbikge1xuICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgIHRoaXMudGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hUb2tlbigpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSwgTnVtYmVyKHRoaXMudG9rZW4/LmV4cGlyZXNfaW4pICogMTAwMCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBkZWxldGUgdGhpcy5hdXRoQ29uZmlnLnN0b3JhZ2Vbc3RvcmFnZUtleV07XG4gICAgfVxuICB9XG5cbiAgZ2V0IHRva2VuKCkge1xuICAgIHJldHVybiB0aGlzLl90b2tlbjtcbiAgfVxuXG4gIHByaXZhdGUgcmVmcmVzaFRva2VuKCkge1xuICAgIGNvbnN0IHt0b2tlblBhdGgsIGNsaWVudElkLCBjbGllbnRTZWNyZXQsIHNjb3BlfSA9IHRoaXMuYXV0aENvbmZpZy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IHtyZWZyZXNoX3Rva2VufSA9IHRoaXMudG9rZW4gYXMgT0F1dGhUb2tlbjtcbiAgICBpZiAodG9rZW5QYXRoICYmIHJlZnJlc2hfdG9rZW4pIHtcbiAgICAgIHRoaXMuaHR0cC5wb3N0KHRva2VuUGF0aCwgbmV3IEh0dHBQYXJhbXMoe1xuICAgICAgICBmcm9tT2JqZWN0OiB7XG4gICAgICAgICAgY2xpZW50X2lkOiBjbGllbnRJZCxcbiAgICAgICAgICAuLi5jbGllbnRTZWNyZXQgJiYge2NsaWVudF9zZWNyZXQ6IGNsaWVudFNlY3JldH0gfHwge30sXG4gICAgICAgICAgZ3JhbnRfdHlwZTogJ3JlZnJlc2hfdG9rZW4nLFxuICAgICAgICAgIHJlZnJlc2hfdG9rZW4sXG4gICAgICAgICAgLi4uc2NvcGUgJiYge3Njb3BlfSB8fCB7fSxcbiAgICAgICAgfVxuICAgICAgfSksIHtoZWFkZXJzOiBSRVFVRVNUX0hFQURFUn0pLnBpcGUoXG4gICAgICAgIGNhdGNoRXJyb3IoKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nb3V0KCk7XG4gICAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgICAgICB9KVxuICAgICAgKS5zdWJzY3JpYmUocGFyYW1zID0+IHtcbiAgICAgICAgdGhpcy50b2tlbiA9IHtcbiAgICAgICAgICAuLi50aGlzLnRva2VuLFxuICAgICAgICAgIC4uLnBhcmFtc1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnN0YXR1cyA9IE9BdXRoU3RhdHVzLkFVVEhPUklaRUQ7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldENsZWFuZWRVblNlYXJjaFBhcmFtZXRlcnMoKTogc3RyaW5nIHtcbiAgICBjb25zdCB7c2VhcmNofSA9IHRoaXMubG9jYXRpb247XG4gICAgbGV0IHNlYXJjaFN0cmluZyA9IHNlYXJjaC5zdWJzdHIoMSk7XG4gICAgY29uc3QgaGFzaEtleXMgPSBbJ2NvZGUnLCAnc3RhdGUnLCAnZXJyb3InLCAnZXJyb3JfZGVzY3JpcHRpb24nLCAnc2Vzc2lvbl9zdGF0ZScsICdzY29wZScsICdhdXRodXNlcicsICdwcm9tcHQnXTtcbiAgICBoYXNoS2V5cy5mb3JFYWNoKChoYXNoS2V5KSA9PiB7XG4gICAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoJyYnICsgaGFzaEtleSArICcoPVteJl0qKT98XicgKyBoYXNoS2V5ICsgJyg9W14mXSopPyY/Jyk7XG4gICAgICBzZWFyY2hTdHJpbmcgPSBzZWFyY2hTdHJpbmcucmVwbGFjZShyZSwgJycpO1xuICAgIH0pO1xuICAgIHJldHVybiBzZWFyY2hTdHJpbmcubGVuZ3RoICYmIGA/JHtzZWFyY2hTdHJpbmd9YCB8fCAnJztcbiAgfVxuXG4gIHByaXZhdGUgY2xlYW5Mb2NhdGlvbkhhc2goKSB7XG4gICAgY29uc3Qge2hhc2h9ID0gdGhpcy5sb2NhdGlvbjtcbiAgICBsZXQgY3VySGFzaCA9IGhhc2guc3Vic3RyKDEpO1xuICAgIGNvbnN0IGhhc2hLZXlzID0gWydhY2Nlc3NfdG9rZW4nLCAndG9rZW5fdHlwZScsICdleHBpcmVzX2luJywgJ3Njb3BlJywgJ3N0YXRlJywgJ2Vycm9yJywgJ2Vycm9yX2Rlc2NyaXB0aW9uJywgJ3Nlc3Npb25fc3RhdGUnLCAnbm9uY2UnXTtcbiAgICBoYXNoS2V5cy5mb3JFYWNoKChoYXNoS2V5KSA9PiB7XG4gICAgICBjb25zdCByZSA9IG5ldyBSZWdFeHAoJyYnICsgaGFzaEtleSArICcoPVteJl0qKT98XicgKyBoYXNoS2V5ICsgJyg9W14mXSopPyY/Jyk7XG4gICAgICBjdXJIYXNoID0gY3VySGFzaC5yZXBsYWNlKHJlLCAnJyk7XG4gICAgfSk7XG4gICAgdGhpcy5sb2NhdGlvbi5oYXNoID0gY3VySGFzaDtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFN0YXRlKHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBudWxsKSB7XG4gICAgY29uc3Qge3N0YXRlfSA9IHBhcmFtZXRlcnMgYXMgYW55O1xuICAgIGlmIChzdGF0ZSkge1xuICAgICAgdGhpcy5zdGF0ZSQubmV4dChzdGF0ZSk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
403
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGguc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1vYXV0aC9zcmMvbGliL3NlcnZpY2VzL29hdXRoLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQVMsTUFBTSxlQUFlLENBQUM7QUFDekQsT0FBTyxFQUFhLFdBQVcsRUFBRSxVQUFVLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RSxPQUFPLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3RHLE9BQU8sRUFBQyxLQUFLLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQWMsRUFBRSxFQUFFLGFBQWEsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUN0RixPQUFPLEVBR0wsUUFBUSxFQUdSLFdBQVcsRUFFWCxTQUFTLEVBR1YsTUFBTSxXQUFXLENBQUM7Ozs7O0FBR25CLE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBZSxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFOUYsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7S0FDekMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7S0FDbkIsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7S0FDbkIsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztBQUVyQixNQUFNLFlBQVksR0FBRyxDQUFDLFNB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LE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDeEksUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzNCLE1BQU0sRUFBRSxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsR0FBRyxPQUFPLEdBQUcsYUFBYSxHQUFHLE9BQU8sR0FBRyxhQUFhLENBQUMsQ0FBQztZQUMvRSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUM7SUFDL0IsQ0FBQztJQUVPLFNBQVMsQ0FBQyxVQUF5QztRQUN6RCxNQUFNLEVBQUMsS0FBSyxFQUFDLEdBQUcsVUFBaUIsQ0FBQztRQUNsQyxJQUFJLEtBQUssRUFBRTtZQUNULElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3pCO0lBQ0gsQ0FBQzs7eUdBNVlVLFlBQVksNkZBcUJILFFBQVE7NkdBckJqQixZQUFZOzJGQUFaLFlBQVk7a0JBRHhCLFVBQVU7a0lBc0J1QyxRQUFROzBCQUEzQyxNQUFNOzJCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZSwgTmdab25lfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7SHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBQYXJhbXN9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7Y2F0Y2hFcnJvciwgY29uY2F0TWFwLCBkZWxheSwgZmlsdGVyLCBtYXAsIHNoYXJlUmVwbGF5LCBzd2l0Y2hNYXAsIHRhcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtFTVBUWSwgZmlyc3RWYWx1ZUZyb20sIGZyb20sIG5vb3AsIE9ic2VydmFibGUsIG9mLCBSZXBsYXlTdWJqZWN0fSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIEF1dGhvcml6YXRpb25Db2RlUGFyYW1ldGVycyxcbiAgSW1wbGljaXRQYXJhbWV0ZXJzLFxuICBMT0NBVElPTixcbiAgT0F1dGhDb25maWcsXG4gIE9BdXRoUGFyYW1ldGVycyxcbiAgT0F1dGhTdGF0dXMsXG4gIE9BdXRoVG9rZW4sXG4gIE9BdXRoVHlwZSxcbiAgT0F1dGhUeXBlQ29uZmlnLCBPcGVuSWRDb25maWcsIE9wZW5JZENvbmZpZ3VyYXRpb24sXG4gIFJlc291cmNlUGFyYW1ldGVycywgVXNlckluZm9cbn0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7TG9jYXRpb24gYXMgTG9jYXRpb24yfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5jb25zdCBhcnJUb1N0cmluZyA9IChidWY6IFVpbnQ4QXJyYXkpID0+IGJ1Zi5yZWR1Y2UoKHMsIGIpID0+IHMgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGIpLCAnJyk7XG5cbmNvbnN0IGJhc2U2NHVybCA9IChzdHI6IHN0cmluZykgPT4gYnRvYShzdHIpXG4gIC5yZXBsYWNlKC9cXCsvZywgJy0nKVxuICAucmVwbGFjZSgvXFwvL2csICdfJylcbiAgLnJlcGxhY2UoLz0vZywgJycpO1xuXG5jb25zdCByYW5kb21TdHJpbmcgPSAobGVuZ3RoOiBudW1iZXIgPSA0OCkgPT4ge1xuICBjb25zdCBidWZmID0gYXJyVG9TdHJpbmcoY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheShsZW5ndGggKiAyKSkpO1xuICByZXR1cm4gYmFzZTY0dXJsKGJ1ZmYpLnN1YnN0cmluZygwLCBsZW5ndGgpO1xufTtcblxuY29uc3QgcGtjZSA9IGFzeW5jICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGJ1ZmYgPSBhd2FpdCBjcnlwdG8uc3VidGxlLmRpZ2VzdCgnU0hBLTI1NicsIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh2YWx1ZSkpO1xuICByZXR1cm4gYmFzZTY0dXJsKGFyclRvU3RyaW5nKG5ldyBVaW50OEFycmF5KGJ1ZmYpKSk7XG59O1xuXG5jb25zdCBSRVFVRVNUX0hFQURFUiA9IG5ldyBIdHRwSGVhZGVycyh7J0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnfSk7XG5cbmNvbnN0IHBhcnNlT2F1dGhVcmkgPSAoaGFzaDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IG51bGwgPT4ge1xuICBjb25zdCByZWdleCA9IC8oW14mPV0rKT0oW14mXSopL2c7XG4gIGNvbnN0IHBhcmFtczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBsZXQgbTtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWNvbmRpdGlvbmFsLWFzc2lnbm1lbnRcbiAgd2hpbGUgKChtID0gcmVnZXguZXhlYyhoYXNoKSkgIT09IG51bGwpIHtcbiAgICBwYXJhbXNbZGVjb2RlVVJJQ29tcG9uZW50KG1bMV0pXSA9IGRlY29kZVVSSUNvbXBvbmVudChtWzJdKTtcbiAgfVxuICBpZiAoT2JqZWN0LmtleXMocGFyYW1zKS5sZW5ndGgpIHtcbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuY29uc3Qgand0ID0gKHRva2VuOiBzdHJpbmcpID0+IEpTT04ucGFyc2UoYXRvYih0b2tlbi5zcGxpdCgnLicpWzFdKSk7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBPQXV0aFNlcnZpY2Uge1xuXG4gIHByaXZhdGUgX3Rva2VuOiBPQXV0aFRva2VuIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgX3N0YXR1cyA9IE9BdXRoU3RhdHVzLk5PVF9BVVRIT1JJWkVEO1xuICBwcml2YXRlIHRpbWVyOiBhbnk7XG4gIHN0YXRlJDogUmVwbGF5U3ViamVjdDxzdHJpbmc+ID0gbmV3IFJlcGxheVN1YmplY3QoMSk7XG4gIHN0YXR1cyQ6IFJlcGxheVN1YmplY3Q8T0F1dGhTdGF0dXM+ID0gbmV3IFJlcGxheVN1YmplY3QoMSk7XG4gIHVzZXJJbmZvJDogT2JzZXJ2YWJsZTxVc2VySW5mbz4gPSB0aGlzLnN0YXR1cyQucGlwZShcbiAgICBmaWx0ZXIocyA9PiBzID09PSBPQXV0aFN0YXR1cy5BVVRIT1JJWkVEKSxcbiAgICBtYXAoKCkgPT4ge1xuICAgICAgY29uc3Qge2NvbmZpZ30gPSB0aGlzLmF1dGhDb25maWcgYXMgYW55O1xuICAgICAgcmV0dXJuIGNvbmZpZy51c2VyUGF0aDtcbiAgICB9KSxcbiAgICBmaWx0ZXIocCA9PiAhIXApLFxuICAgIHN3aXRjaE1hcChwYXRoID0+IHRoaXMuaHR0cC5nZXQ8VXNlckluZm8+KHBhdGgpKSxcbiAgICBzaGFyZVJlcGxheSgpXG4gICk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxuICAgICAgICAgICAgICBwcml2YXRlIHpvbmU6IE5nWm9uZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBhdXRoQ29uZmlnOiBPQXV0aENvbmZpZyxcbiAgICAgICAgICAgICAgQEluamVjdChMT0NBVElPTikgcHJpdmF0ZSBsb2NhdGlvbjogTG9jYXRpb24sXG4gICAgICAgICAgICAgIHByaXZhdGUgbG9jYXRpb25TZXJ2aWNlOiBMb2NhdGlvbjIpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaW5pdCgpKTsgLy8gZGVjb3VwbGUgZm9yIGh0dHAgaW50ZXJjZXB0b3JcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG9hdXRoIGNvbmZpZyBmb3IgaW5pdGlhbGl6ZS4gSWYgT3BlbklkIHdpdGggaXNzdWVyUGF0aCBpcyBjb25maWd1cmVkIHRoZW4gY29uZmlndXJlIGZyb20gc2VydmVyIG9wZW5pZCBjb25maWd1cmF0aW9uLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGNvbmZpZyQoKSB7XG4gICAgbGV0IHtjb25maWd9ID0gdGhpcy5hdXRoQ29uZmlnO1xuICAgIGlmIChjb25maWcgJiYgY29uZmlnLmNsaWVudElkKSB7XG4gICAgICBjb25zdCB7aXNzdWVyUGF0aCwgc2NvcGV9ID0gY29uZmlnIGFzIE9wZW5JZENvbmZpZztcbiAgICAgIGlmIChpc3N1ZXJQYXRoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE9wZW5JZENvbmZpZ3VyYXRpb24+KGAke2lzc3VlclBhdGh9Ly53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9uYCkucGlwZShcbiAgICAgICAgICB0YXAodiA9PiB0aGlzLnR5cGUgJiYgdGhpcy5zZXQodGhpcy50eXBlLCB7XG4gICAgICAgICAgICAuLi52LmF1dGhvcml6YXRpb25fZW5kcG9pbnQgJiYge2F1dGhvcml6ZVBhdGg6IHYuYXV0aG9yaXphdGlvbl9lbmRwb2ludH0gfHwge30sXG4gICAgICAgICAgICAuLi52LnRva2VuX2VuZHBvaW50ICYmIHt0b2tlblBhdGg6IHYudG9rZW5fZW5kcG9pbnR9IHx8IHt9LFxuICAgICAgICAgICAgLi4udi5yZXZvY2F0aW9uX2VuZHBvaW50ICYmIHtyZXZva2VQYXRoOiB2LnJldm9jYXRpb25fZW5kcG9pbnR9IHx8IHt9LFxuICAgICAgICAgICAgLi4udi5jb2RlX2NoYWxsZW5nZV9tZXRob2RzX3N1cHBvcnRlZCAmJiB7cGtjZTogdi5jb2RlX2NoYWxsZW5nZV9tZXRob2RzX3N1cHBvcnRlZC5pbmRleE9mKCdTMjU2JykgPiAtMX0gfHwge30sXG4gICAgICAgICAgICAuLi52LnVzZXJpbmZvX2VuZHBvaW50ICYmIHt1c2VyUGF0aDogdi51c2VyaW5mb19lbmRwb2ludH0gfHwge30sXG4gICAgICAgICAgICAuLi52LmludHJvc3BlY3Rpb25fZW5kcG9pbnQgJiYge2ludHJvc3BlY3Rpb25QYXRoOiB2LmludHJvc3BlY3Rpb25fZW5kcG9pbnR9IHx8IHt9LFxuICAgICAgICAgICAgLi4udi5lbmRfc2Vzc2lvbl9lbmRwb2ludCAmJiB7bG9nb3V0UGF0aDogdi5lbmRfc2Vzc2lvbl9lbmRwb2ludH0gfHwge30sXG4gICAgICAgICAgICAuLi5zY29wZSAmJiB7fSB8fCB7c2NvcGU6ICdvcGVuaWQnfVxuICAgICAgICAgIH0gYXMgYW55KSksXG4gICAgICAgICAgbWFwKCgpID0+IHRoaXMuYXV0aENvbmZpZy5jb25maWcpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2YoY29uZmlnKTtcbiAgICB9XG4gICAgY29uc29sZS53YXJuKCdjbGllbnRJZCBpcyBtaXNzaW5nIGluIG9hdXRoIGNvbmZpZycpO1xuICAgIHJldHVybiBFTVBUWTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0LiBXaWxsIGNoZWNrIHRoZSB1cmwgaW1wbGljaXQgb3IgYXV0aG9yaXphdGlvbiBmbG93IG9yIGV4aXN0aW5nIHNhdmVkIHRva2VuLlxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgaW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCB7aGFzaCwgc2VhcmNoLCBvcmlnaW4sIHBhdGhuYW1lfSA9IHRoaXMubG9jYXRpb247XG4gICAgY29uc3QgaXNJbXBsaWNpdFJlZGlyZWN0ID0gaGFzaCAmJiAvKGFjY2Vzc190b2tlbj0pfChlcnJvcj0pLy50ZXN0KGhhc2gpO1xuICAgIGNvbnN0IGlzQXV0aENvZGVSZWRpcmVjdCA9IHNlYXJjaCAmJiAvKGNvZGU9KXwoZXJyb3I9KS8udGVzdChzZWFyY2gpO1xuICAgIGNvbnN0IHtzdG9yYWdlS2V5fSA9IHRoaXMuYXV0aENvbmZpZztcbiAgICBjb25zdCBzYXZlZFRva2VuID0gc3RvcmFnZUtleSAmJiB0aGlzLmF1dGhDb25maWcuc3RvcmFnZSAmJiB0aGlzLmF1dGhDb25maWcuc3RvcmFnZVtzdG9yYWdlS2V5XSAmJlxuICAgICAgSlNPTi5wYXJzZSh0aGlzLmF1dGhDb25maWcuc3RvcmFnZVtzdG9yYWdlS2V5XSk7XG4gICAgdGhpcy5jb25maWckLnN1YnNjcmliZShjb25maWcgPT4ge1xuICAgICAgaWYgKGlzSW1wbGljaXRSZWRpcmVjdCkge1xuICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gcGFyc2VPYXV0aFVyaShoYXNoLnN1YnN0cigxKSk7XG4gICAgICAgIHRoaXMudG9rZW4gPSBwYXJhbWV0ZXJzO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IHRoaXMuY2hlY2tSZXNwb25zZShzYXZlZFRva2VuLCBwYXJhbWV0ZXJzKSAmJiBPQXV0aFN0YXR1cy5BVVRIT1JJWkVEIHx8IE9BdXRoU3RhdHVzLkRFTklFRDtcbiAgICAgIH0gZWxzZSBpZiAoaXNBdXRoQ29kZVJlZGlyZWN0KSB7XG4gICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBwYXJzZU9hdXRoVXJpKHNlYXJjaC5zdWJzdHIoMSkpO1xuICAgICAgICBpZiAoIXRoaXMuY2hlY2tSZXNwb25zZShzYXZlZFRva2VuLCBwYXJhbWV0ZXJzKSkge1xuICAgICAgICAgIHRoaXMudG9rZW4gPSBwYXJhbWV0ZXJzO1xuICAgICAgICAgIHRoaXMuc3RhdHVzID0gT0F1dGhTdGF0dXMuREVOSUVEO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG5ld1BhcmFtZXRlcnNTdHJpbmcgPSB0aGlzLmdldENsZWFuZWRVblNlYXJjaFBhcmFtZXRlcnMoKTtcbiAgICAgICAgICBjb25zdCB7Y2xpZW50SWQsIGNsaWVudFNlY3JldCwgdG9rZW5QYXRoLCBzY29wZX0gPSBjb25maWcgYXMgYW55O1xuICAgICAgICAgIGNvbnN0IGNvZGVWZXJpZmllciA9IHNhdmVkVG9rZW4gJiYgc2F2ZWRUb2tlbi5jb2RlVmVyaWZpZXI7XG4gICAgICAgICAgdGhpcy5odHRwLnBvc3QodG9rZW5QYXRoLCBuZXcgSHR0cFBhcmFtcyh7XG4gICAgICAgICAgICBmcm9tT2JqZWN0OiB7XG4gICAgICAgICAgICAgIGNvZGU6IHBhcmFtZXRlcnM/LlsnY29kZSddLFxuICAgICAgICAgICAgICBjbGllbnRfaWQ6IGNsaWVudElkLFxuICAgICAgICAgICAgICAuLi5jbGllbnRTZWNyZXQgJiYge2NsaWVudF9zZWNyZXQ6IGNsaWVudFNlY3JldH0gfHwge30sXG4gICAgICAgICAgICAgIHJlZGlyZWN0X3VyaTogYCR7b3JpZ2lufSR7cGF0aG5hbWV9YCxcbiAgICAgICAgICAgICAgZ3JhbnRfdHlwZTogJ2F1dGhvcml6YXRpb25fY29kZScsXG4gICAgICAgICAgICAgIC4uLnNjb3BlICYmIHtzY29wZX0gfHwge30sXG4gICAgICAgICAgICAgIC4uLmNvZGVWZXJpZmllciAmJiB7Y29kZV92ZXJpZmllcjogY29kZVZlcmlmaWVyfSB8fCB7fVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLCB7aGVhZGVyczogUkVRVUVTVF9IRUFERVJ9KS5waXBlKFxuICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMudG9rZW4gPSBlcnI7XG4gICAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gT0F1dGhTdGF0dXMuREVOSUVEO1xuICAgICAgICAgICAgICB0aGlzLmxvY2F0aW9uU2VydmljZS5yZXBsYWNlU3RhdGUoYCR7cGF0aG5hbWV9JHtuZXdQYXJhbWV0ZXJzU3RyaW5nfWApO1xuICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICkuc3Vic2NyaWJlKHRva2VuID0+IHtcbiAgICAgICAgICAgIHRoaXMudG9rZW4gPSB0b2tlbjtcbiAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gT0F1dGhTdGF0dXMuQVVUSE9SSVpFRDtcbiAgICAgICAgICAgIHRoaXMubG9jYXRpb25TZXJ2aWNlLnJlcGxhY2VTdGF0ZShgJHtwYXRobmFtZX0ke25ld1BhcmFtZXRlcnNTdHJpbmd9YCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc2F2ZWRUb2tlbikge1xuICAgICAgICB0aGlzLl90b2tlbiA9IHNhdmVkVG9rZW47XG4gICAgICAgIGNvbnN0IHthY2Nlc3NfdG9rZW4sIHJlZnJlc2hfdG9rZW4sIGVycm9yfSA9IHNhdmVkVG9rZW47XG4gICAgICAgIGlmIChhY2Nlc3NfdG9rZW4pIHtcbiAgICAgICAgICBpZiAocmVmcmVzaF90b2tlbikgeyAvLyBmb3JjZSByZWZyZXNoIHNpbmNlIG1pZ2h0IGJlIGEgbWFudWFsIHBhZ2UgcmVmcmVzaFxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW4oKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSBPQXV0aFN0YXR1cy5BVVRIT1JJWkVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0YXR1cyA9IGVycm9yICYmIE9BdXRoU3RhdHVzLkRFTklFRCB8fCBPQXV0aFN0YXR1cy5OT1RfQVVUSE9SSVpFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBPQXV0aFN0YXR1cy5OT1RfQVVUSE9SSVpFRDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGxvZ2luKHBhcmFtZXRlcnM/OiBPQXV0aFBhcmFtZXRlcnMpIHtcbiAgICBpZiAodGhpcy5pc1Jlc291cmNlVHlwZShwYXJhbWV0ZXJzIGFzIFJlc291cmNlUGFyYW1ldGVycykpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVzb3VyY2VMb2dpbihwYXJhbWV0ZXJzIGFzIFJlc291cmNlUGFyYW1ldGVycyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzQXV0aG9yaXphdGlvbkNvZGVUeXBlKHBhcmFtZXRlcnMgYXMgQXV0aG9yaXphdGlvbkNvZGVQYXJhbWV0ZXJzKSkge1xuICAgICAgYXdhaXQgdGhpcy5hdXRob3JpemF0aW9uQ29kZUxvZ2luKHBhcmFtZXRlcnMgYXMgQXV0aG9yaXphdGlvbkNvZGVQYXJhbWV0ZXJzKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNJbXBsaWNpdFR5cGUocGFyYW1ldGVycyBhcyBJbXBsaWNpdFBhcmFtZXRlcnMpKSB7XG4gICAgICBhd2FpdCB0aGlzLmltcGxpY2l0TG9naW4ocGFyYW1ldGVycyBhcyBJbXBsaWNpdFBhcmFtZXRlcnMpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0NsaWVudENyZWRlbnRpYWxUeXBlKCkpIHtcbiAgICAgIGF3YWl0IHRoaXMuY2xpZW50Q3JlZGVudGlhbExvZ2luKCk7XG4gICAgfVxuICB9XG5cbiAgbG9nb3V0KHVzZUxvZ291dFVybD86IGJvb2xlYW4pIHtcbiAgICB0aGlzLnJldm9rZSgpO1xuICAgIHRoaXMudG9rZW4gPSBudWxsO1xuICAgIHRoaXMuc3RhdHVzID0gT0F1dGhTdGF0dXMuTk9UX0FVVEhPUklaRUQ7XG4gICAgY29uc3Qge2xvZ291dFBhdGgsIGxvZ291dFJlZGlyZWN0VXJpfSA9IHRoaXMuYXV0aENvbmZpZy5jb25maWcgYXMgYW55O1xuICAgIGlmICh1c2VMb2dvdXRVcmwgJiYgbG9nb3V0UGF0aCkge1xuICAgICAgY29uc3Qge29yaWdpbiwgcGF0aG5hbWV9ID0gdGhpcy5sb2NhdGlvbjtcbiAgICAgIGNvbnN0IGN1cnJlbnRQYXRoID0gYCR7b3JpZ2lufSR7cGF0aG5hbWV9YDtcbiAgICAgIHRoaXMubG9jYXRpb24ucmVwbGFjZShgJHtsb2dvdXRQYXRofT9wb3N0X2xvZ291dF9yZWRpcmVjdF91cmk9JHtsb2dvdXRSZWRpcmVjdFVyaSB8fCBjdXJyZW50UGF0aH1gKTtcbiAgICB9XG4gIH1cblxuICByZXZva2UoKSB7XG4gICAgY29uc3Qge3Jldm9rZVBhdGgsIGNsaWVudElkLCBjbGllbnRTZWNyZXR9ID0gdGhpcy5hdXRoQ29uZmlnLmNvbmZpZyBhcyBhbnk7XG4gICAgaWYgKHJldm9rZVBhdGgpIHtcbiAgICAgIGNvbnN0IHthY2Nlc3NfdG9rZW4sIHJlZnJlc2hfdG9rZW59ID0gdGhpcy50b2tlbiBhcyBPQXV0aFRva2VuO1xuICAgICAgY29uc3QgdG9SZXZva2UgPSBbXTtcbiAgICAgIGlmIChhY2Nlc3NfdG9rZW4pIHtcbiAgICAgICAgdG9SZXZva2UucHVzaCh7XG4gICAgICAgICAgLi4uY2xpZW50SWQgJiYge2NsaWVudF9pZDogY2xpZW50SWR9IHx8IHt9LFxuICAgICAgICAgIC4uLmNsaWVudFNlY3JldCAmJiB7Y2xpZW50X3NlY3JldDogY2xpZW50U2VjcmV0fSB8fCB7fSxcbiAgICAgICAgICB0b2tlbjogYWNjZXNzX3Rva2VuLFxuICAgICAgICAgIHRva2VuX3R5cGVfaGludDogJ2FjY2Vzc190b2tlbidcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAocmVmcmVzaF90b2tlbikge1xuICAgICAgICB0b1Jldm9rZS5wdXNoKHtcbiAgICAgICAgICAuLi5jbGllbnRJZCAmJiB7Y2xpZW50X2lkOiBjbGllbnRJZH0gfHwge30sXG4gICAgICAgICAgLi4uY2xpZW50U2VjcmV0ICYmIHtjbGllbnRfc2VjcmV0OiBjbGllbnRTZWNyZXR9IHx8IHt9LFxuICAgICAgICAgIHRva2VuOiByZWZyZXNoX3Rva2VuLFxuICAgICAgICAgIHRva2VuX3R5cGVfaGludDogJ3JlZnJlc2hfdG9rZW4nXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgZnJvbSh0b1Jldm9rZSkucGlwZShcbiAgICAgICAgY29uY2F0TWFwKG8gPT4gb2YobykucGlwZShkZWxheSgzMDApKSksIC8vIHNwYWNlIHJlcXVlc3QgdG8gYXZvaWQgY2FuY2VsbGF0aW9uXG4gICAgICAgIHN3aXRjaE1hcChvID0+IHRoaXMuaHR0cC5wb3N0KHJldm9rZVBhdGgsIG5ldyBIdHRwUGFyYW1zKHtmcm9tT2JqZWN0OiBvfSkpKSxcbiAgICAgICkuc3Vic2NyaWJlKG5vb3ApO1xuICAgIH1cbiAgfVxuXG4gIGdldCBzdGF0dXMoKTogT0F1dGhTdGF0dXMge1xuICAgIHJldHVybiB0aGlzLl9zdGF0dXM7XG4gIH1cblxuICBzZXQgc3RhdHVzKHN0YXR1cykge1xuICAgIHRoaXMuX3N0YXR1cyA9IHN0YXR1cztcbiAgICB0aGlzLnN0YXR1cyQubmV4dChzdGF0dXMpO1xuICB9XG5cbiAgc2V0KHR5cGU6IE9BdXRoVHlwZSwgY29uZmlnPzogT0F1dGhUeXBlQ29uZmlnKTogdm9pZCB7XG4gICAgdGhpcy5hdXRoQ29uZmlnLnR5cGUgPSB0eXBlO1xuICAgIGlmIChjb25maWcpIHtcbiAgICAgIHRoaXMuYXV0aENvbmZpZy5jb25maWcgPSB7XG4gICAgICAgIC4uLnRoaXMuYXV0aENvbmZpZy5jb25maWcsXG4gICAgICAgIC4uLmNvbmZpZ1xuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBnZXQgdHlwZSgpIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoQ29uZmlnLnR5cGU7XG4gIH1cblxuICBnZXQgaWdub3JlUGF0aHMoKTogUmVnRXhwW10ge1xuICAgIHJldHVybiB0aGlzLmF1dGhDb25maWcuaWdub3JlUGF0aHMgfHwgW107XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNsaWVudENyZWRlbnRpYWxMb2dpbigpIHtcbiAgICBjb25zdCB7Y2xpZW50SWQsIGNsaWVudFNlY3JldCwgdG9rZW5QYXRoLCBzY29wZX0gPSB0aGlzLmF1dGhDb25maWcuY29uZmlnIGFzIGFueTtcbiAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLmh0dHAucG9zdCh0b2tlblBhdGgsIG5ldyBIdHRwUGFyYW1zKHtcbiAgICAgIGZyb21PYmplY3Q6IHtcbiAgICAgICAgY2xpZW50X2lkOiBjbGllbnRJZCxcbiAgICAgICAgY2xpZW50X3NlY3JldDogY2xpZW50U2VjcmV0LFxuICAgICAgICBncmFudF90eXBlOiBPQXV0aFR5cGUuQ0xJRU5UX0NSRURFTlRJQUwsXG4gICAgICAgIC4uLnNjb3BlID8ge3Njb3BlfSA6IHt9LFxuICAgICAgfVxuICAgIH0pLCB7aGVhZGVyczogUkVRVUVTVF9IRUFERVJ9KS5waXBlKFxuICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XG4gICAgICAgIHRoaXMudG9rZW4gPSBlcnI7XG4gICAgICAgIHRoaXMuc3RhdHVzID0gT0F1dGhTdGF0dXMuREVOSUVEO1xuICAgICAgICByZXR1cm4gRU1QVFk7XG4gICAgICB9KSxcbiAgICAgIHRhcChwYXJhbXMgPT4ge1xuICAgICAgICB0aGlzLnRva2VuID0gcGFyYW1zO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IE9BdXRoU3RhdHVzLkFVVEhPUklaRUQ7XG4gICAgICB9KVxuICAgICkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZXNvdXJjZUxvZ2luKHBhcmFtZXRlcnM6IFJlc291cmNlUGFyYW1ldGVycykge1xuICAgIGNvbnN0IHtjbGllbnRJZCwgY2xpZW50U2VjcmV0LCB0b2tlblBhdGgsIHNjb3BlfSA9IHRoaXMuYXV0aENvbmZpZy5jb25maWcgYXMgYW55O1xuICAgIGNvbnN0IHt1c2VybmFtZSwgcGFzc3dvcmR9ID0gcGFyYW1ldGVycztcbiAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLmh0dHAucG9zdCh0b2tlblBhdGgsIG5ldyBIdHRwUGFyYW1zKHtcbiAgICAgIGZyb21PYmplY3Q6IHtcbiAgICAgICAgY2xpZW50X2lkOiBjbGllbnRJZCxcbiAgICAgICAgLi4uY2xpZW50U2VjcmV0ICYmIHtjbGllbnRfc2VjcmV0OiBjbGllbnRTZWNyZXR9IHx8IHt9LFxuICAgICAgICBncmFudF90eXBlOiBPQXV0aFR5cGUuUkVTT1VSQ0UsXG4gICAgICAgIC4uLnNjb3BlICYmIHtzY29wZX0gfHwge30sXG4gICAgICAgIHVzZXJuYW1lLFxuICAgICAgICBwYXNzd29yZFxuICAgICAgfVxuICAgIH0pLCB7aGVhZGVyczogUkVRVUVTVF9IRUFERVJ9KS5waXBlKFxuICAgICAgY2F0Y2hFcnJvcihlcnIgPT4ge1xuICAgICAgICB0aGlzLnRva2VuID0gZXJyO1xuICAgICAgICB0aGlzLnN0YXR1cyA9IE9BdXRoU3RhdHVzLkRFTklFRDtcbiAgICAgICAgcmV0dXJuIEVNUFRZO1xuICAgICAgfSksXG4gICAgICB0YXAocGFyYW1zID0+IHtcbiAgICAgICAgdGhpcy50b2tlbiA9IHBhcmFtcztcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBPQXV0aFN0YXR1cy5BVVRIT1JJWkVEO1xuICAgICAgfSlcbiAgICApKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaW1wbGljaXRMb2dpbihwYXJhbWV0ZXJzOiBJbXBsaWNpdFBhcmFtZXRlcnMpIHtcbiAgICBjb25zdCBhdXRoVXJsID0gYXdhaXQgdGhpcy50b0F1dGhvcml6YXRpb25VcmwocGFyYW1ldGVycywgT0F1dGhUeXBlLklNUExJQ0lUKTtcbiAgICB0aGlzLmxvY2F0aW9uLnJlcGxhY2UoYXV0aFVybCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGF1dGhvcml6YXRpb25Db2RlTG9naW4ocGFyYW1ldGVyczogQXV0aG9yaXphdGlvbkNvZGVQYXJhbWV0ZXJzKSB7XG4gICAgY29uc3QgYXV0aFVybCA9IGF3YWl0IHRoaXMudG9BdXRob3JpemF0aW9uVXJsKHBhcmFtZXRlcnMsIE9BdXRoVHlwZS5BVVRIT1JJWkFUSU9OX0NPREUpO1xuICAgIHRoaXMubG9jYXRpb24ucmVwbGFjZShhdXRoVXJsKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNDbGllbnRDcmVkZW50aWFsVHlwZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoQ29uZmlnLnR5cGUgPT09IE9BdXRoVHlwZS5DTElFTlRfQ1JFREVOVElBTDtcbiAgfVxuXG4gIHByaXZhdGUgaXNSZXNvdXJjZVR5cGUocGFyYW1ldGVycz86IFJlc291cmNlUGFyYW1ldGVycyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmF1dGhDb25maWcudHlwZSA9PT0gT0F1dGhUeXBlLlJFU09VUkNFICYmICEhcGFyYW1ldGVycz8ucGFzc3dvcmQ7XG4gIH1cblxuICBwcml2YXRlIGlzSW1wbGljaXRUeXBlKHBhcmFtZXRlcnM/OiBJbXBsaWNpdFBhcmFtZXRlcnMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hdXRoQ29uZmlnLnR5cGUgPT09IE9BdXRoVHlwZS5JTVBMSUNJVCAmJiAhIXBhcmFtZXRlcnM/LnJlZGlyZWN0VXJpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0F1dGhvcml6YXRpb25Db2RlVHlwZShwYXJhbWV0ZXJzPzogQXV0aG9yaXphdGlvbkNvZGVQYXJhbWV0ZXJzKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYXV0aENvbmZpZy50eXBlID09PSBPQXV0aFR5cGUuQVVUSE9SSVpBVElPTl9DT0RFICYmICEhcGFyYW1ldGVycz8ucmVkaXJlY3RVcmk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHRvQXV0aG9yaXphdGlvblVybChwYXJhbWV0ZXJzOiBBdXRob3JpemF0aW9uQ29kZVBhcmFtZXRlcnMgfCBJbXBsaWNpdFBhcmFtZXRlcnMsIHJlc3BvbnNlVHlwZTogT0F1dGhUeXBlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB7Y29uZmlnfSA9IHRoaXMuYXV0aENvbmZpZyBhcyBhbnk7XG4gICAgbGV0IGF1dGhvcml6YXRpb25VcmwgPSBgJHtjb25maWcuYXV0aG9yaXplUGF0aH1gO1xuICAgIGF1dGhvcml6YXRpb25VcmwgKz0gY29uZmlnLmF1dGhvcml6ZVBhdGguaW5jbHVkZXMoJz8nKSAmJiAnJicgfHwgJz8nO1xuICAgIGF1dGhvcml6YXRpb25VcmwgKz0gYGNsaWVudF9pZD0ke2NvbmZpZy5jbGllbnRJZH1gO1xuICAgIGF1dGhvcml6YXRpb25VcmwgKz0gYCZyZWRpcmVjdF91cmk9JHtlbmNvZGVVUklDb21wb25lbnQocGFyYW1ldGVycy5yZWRpcmVjdFVyaSl9YDtcbiAgICBhdXRob3JpemF0aW9uVXJsICs9IGAmcmVzcG9uc2VfdHlwZT0ke3Jlc3BvbnNlVHlwZX1gO1xuICAgIGF1dGhvcml6YXRpb25VcmwgKz0gYCZzY29wZT0ke2VuY29kZVVSSUNvbXBvbmVudChjb25maWcuc2NvcGUgfHwgJycpfWA7XG4gICAgYXV0aG9yaXphdGlvblVybCArPSBgJnN0YXRlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBhcmFtZXRlcnMuc3RhdGUgfHwgJycpfWA7XG4gICAgcmV0dXJuIGAke2F1dGhvcml6YXRpb25Vcmx9JHt0aGlzLmdlbmVyYXRlTm9uY2UoY29uZmlnKX0ke2F3YWl0IHRoaXMuZ2VuZXJhdGVDb2RlQ2hhbGxlbmdlKGNvbmZpZyl9YDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVDb2RlQ2hhbGxlbmdlKGNvbmZpZzogYW55KSB7XG4gICAgaWYgKGNvbmZpZy5wa2NlKSB7XG4gICAgICBjb25zdCBjb2RlVmVyaWZpZXIgPSByYW5kb21TdHJpbmcoKTtcbiAgICAgIHRoaXMudG9rZW4gPSB7Li4udGhpcy50b2tlbiwgY29kZVZlcmlmaWVyfTtcbiAgICAgIHJldHVybiBgJmNvZGVfY2hhbGxlbmdlPSR7YXdhaXQgcGtjZShjb2RlVmVyaWZpZXIpfSZjb2RlX2NoYWxsZW5nZV9tZXRob2Q9UzI1NmA7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVOb25jZShjb25maWc6IGFueSkge1xuICAgIGlmIChjb25maWcgJiYgY29uZmlnLnNjb3BlICYmIGNvbmZpZy5zY29wZS5pbmRleE9mKCdvcGVuaWQnKSA+IC0xKSB7XG4gICAgICBjb25zdCBub25jZSA9IHJhbmRvbVN0cmluZygxMCk7XG4gICAgICB0aGlzLnRva2VuID0gey4uLnRoaXMudG9rZW4sIG5vbmNlfTtcbiAgICAgIHJldHVybiBgJm5vbmNlPSR7bm9uY2V9YDtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1Jlc3BvbnNlKHRva2VuOiBhbnksIHBhcmFtZXRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBudWxsKSB7XG4gICAgdGhpcy5lbWl0U3RhdGUocGFyYW1ldGVycyk7XG4gICAgdGhpcy5jbGVhbkxvY2F0aW9uSGFzaCgpO1xuICAgIGlmICghcGFyYW1ldGVycyB8fCBwYXJhbWV0ZXJzWydlcnJvciddKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0b2tlbiAmJiB0b2tlbi5ub25jZSAmJiBwYXJhbWV0ZXJzWydhY2Nlc3NfdG9rZW4nXSkge1xuICAgICAgY29uc3Qgand0VG9rZW4gPSBqd3QocGFyYW1ldGVyc1snYWNjZXNzX3Rva2VuJ10pO1xuICAgICAgcmV0dXJuIHRva2VuLm5vbmNlID09PSBqd3RUb2tlbi5ub25jZTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtZXRlcnNbJ2FjY2Vzc190b2tlbiddIHx8IHBhcmFtZXRlcnNbJ2NvZGUnXTtcbiAgfVxuXG4gIHNldCB0b2tlbih0b2tlbjogT0F1dGhUb2tlbiB8IG51bGwpIHtcbiAgICB0aGlzLl90b2tlbiA9IHRva2VuO1xuICAgIGNvbnN0IHtzdG9yYWdlS2V5fSA9IHRoaXMuYXV0aENvbmZpZztcbiAgICBpZiAodG9rZW4pIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIHRoaXMuYXV0aENvbmZpZy5zdG9yYWdlW3N0b3JhZ2VLZXldID0gSlNPTi5zdHJpbmdpZnkodGhpcy50b2tlbik7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7XG4gICAgICBpZiAodGhpcy50b2tlbiAmJiB0aGlzLnRva2VuLmV4cGlyZXNfaW4pIHtcbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW4oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sIE51bWJlcih0aGlzLnRva2VuPy5leHBpcmVzX2luKSAqIDEwMDApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgZGVsZXRlIHRoaXMuYXV0aENvbmZpZy5zdG9yYWdlW3N0b3JhZ2VLZXldO1xuICAgIH1cbiAgfVxuXG4gIGdldCB0b2tlbigpIHtcbiAgICByZXR1cm4gdGhpcy5fdG9rZW47XG4gIH1cblxuICBwcml2YXRlIHJlZnJlc2hUb2tlbigpIHtcbiAgICBjb25zdCB7dG9rZW5QYXRoLCBjbGllbnRJZCwgY2xpZW50U2VjcmV0LCBzY29wZX0gPSB0aGlzLmF1dGhDb25maWcuY29uZmlnIGFzIGFueTtcbiAgICBjb25zdCB7cmVmcmVzaF90b2tlbn0gPSB0aGlzLnRva2VuIGFzIE9BdXRoVG9rZW47XG4gICAgaWYgKHRva2VuUGF0aCAmJiByZWZyZXNoX3Rva2VuKSB7XG4gICAgICB0aGlzLmh0dHAucG9zdCh0b2tlblBhdGgsIG5ldyBIdHRwUGFyYW1zKHtcbiAgICAgICAgZnJvbU9iamVjdDoge1xuICAgICAgICAgIGNsaWVudF9pZDogY2xpZW50SWQsXG4gICAgICAgICAgLi4uY2xpZW50U2VjcmV0ICYmIHtjbGllbnRfc2VjcmV0OiBjbGllbnRTZWNyZXR9IHx8IHt9LFxuICAgICAgICAgIGdyYW50X3R5cGU6ICdyZWZyZXNoX3Rva2VuJyxcbiAgICAgICAgICByZWZyZXNoX3Rva2VuLFxuICAgICAgICAgIC4uLnNjb3BlICYmIHtzY29wZX0gfHwge30sXG4gICAgICAgIH1cbiAgICAgIH0pLCB7aGVhZGVyczogUkVRVUVTVF9IRUFERVJ9KS5waXBlKFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmxvZ291dCgpO1xuICAgICAgICAgIHJldHVybiBFTVBUWTtcbiAgICAgICAgfSlcbiAgICAgICkuc3Vic2NyaWJlKHBhcmFtcyA9PiB7XG4gICAgICAgIHRoaXMudG9rZW4gPSB7XG4gICAgICAgICAgLi4udGhpcy50b2tlbixcbiAgICAgICAgICAuLi5wYXJhbXNcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5zdGF0dXMgPSBPQXV0aFN0YXR1cy5BVVRIT1JJWkVEO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRDbGVhbmVkVW5TZWFyY2hQYXJhbWV0ZXJzKCk6IHN0cmluZyB7XG4gICAgY29uc3Qge3NlYXJjaH0gPSB0aGlzLmxvY2F0aW9uO1xuICAgIGxldCBzZWFyY2hTdHJpbmcgPSBzZWFyY2guc3Vic3RyKDEpO1xuICAgIGNvbnN0IGhhc2hLZXlzID0gWydjb2RlJywgJ3N0YXRlJywgJ2Vycm9yJywgJ2Vycm9yX2Rlc2NyaXB0aW9uJywgJ3Nlc3Npb25fc3RhdGUnLCAnc2NvcGUnLCAnYXV0aHVzZXInLCAncHJvbXB0J107XG4gICAgaGFzaEtleXMuZm9yRWFjaCgoaGFzaEtleSkgPT4ge1xuICAgICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKCcmJyArIGhhc2hLZXkgKyAnKD1bXiZdKik/fF4nICsgaGFzaEtleSArICcoPVteJl0qKT8mPycpO1xuICAgICAgc2VhcmNoU3RyaW5nID0gc2VhcmNoU3RyaW5nLnJlcGxhY2UocmUsICcnKTtcbiAgICB9KTtcbiAgICByZXR1cm4gc2VhcmNoU3RyaW5nLmxlbmd0aCAmJiBgPyR7c2VhcmNoU3RyaW5nfWAgfHwgJyc7XG4gIH1cblxuICBwcml2YXRlIGNsZWFuTG9jYXRpb25IYXNoKCkge1xuICAgIGNvbnN0IHtoYXNofSA9IHRoaXMubG9jYXRpb247XG4gICAgbGV0IGN1ckhhc2ggPSBoYXNoLnN1YnN0cigxKTtcbiAgICBjb25zdCBoYXNoS2V5cyA9IFsnYWNjZXNzX3Rva2VuJywgJ3Rva2VuX3R5cGUnLCAnZXhwaXJlc19pbicsICdzY29wZScsICdzdGF0ZScsICdlcnJvcicsICdlcnJvcl9kZXNjcmlwdGlvbicsICdzZXNzaW9uX3N0YXRlJywgJ25vbmNlJ107XG4gICAgaGFzaEtleXMuZm9yRWFjaCgoaGFzaEtleSkgPT4ge1xuICAgICAgY29uc3QgcmUgPSBuZXcgUmVnRXhwKCcmJyArIGhhc2hLZXkgKyAnKD1bXiZdKik/fF4nICsgaGFzaEtleSArICcoPVteJl0qKT8mPycpO1xuICAgICAgY3VySGFzaCA9IGN1ckhhc2gucmVwbGFjZShyZSwgJycpO1xuICAgIH0pO1xuICAgIHRoaXMubG9jYXRpb24uaGFzaCA9IGN1ckhhc2g7XG4gIH1cblxuICBwcml2YXRlIGVtaXRTdGF0ZShwYXJhbWV0ZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgbnVsbCkge1xuICAgIGNvbnN0IHtzdGF0ZX0gPSBwYXJhbWV0ZXJzIGFzIGFueTtcbiAgICBpZiAoc3RhdGUpIHtcbiAgICAgIHRoaXMuc3RhdGUkLm5leHQoc3RhdGUpO1xuICAgIH1cbiAgfVxufVxuIl19
|