@smarterplan/ngx-smarterplan-admin 0.1.53 → 0.1.55

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.
@@ -103,10 +103,10 @@ export class UserMissionFormComponent {
103
103
  }
104
104
  }
105
105
  UserMissionFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: UserMissionFormComponent, deps: [{ token: i1.FormBuilder }, { token: i2.BaseUserService }, { token: i3.TranslateService }, { token: i2.ValidatorsService }], target: i0.ɵɵFactoryTarget.Component });
106
- UserMissionFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: UserMissionFormComponent, selector: "lib-user-mission-form", inputs: { addToOrganisation: "addToOrganisation", isSP: "isSP", createForExistingUser: "createForExistingUser", currentOrg: "currentOrg" }, outputs: { added: "added" }, ngImport: i0, template: "<div *ngIf=\"form\">\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n <div id=\"personalInfo\">\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'User Personal Information' | translate }}</h4>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Email' | translate}} *</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" data-testid=\"new-user-email\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['email'])|| isFormError(form.controls['email'])}\"\r\n required formControlName=\"email\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-user-email-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['email']) \r\n || isFormError(form.controls['email'])\">\r\n {{validatorsService.getError(form.controls['email']) | translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Last name' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"lastName\" data-testid=\"new-user-lastName\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['lastName'])|| isFormError(form.controls['lastName'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-user-lastName-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['lastName']) \r\n || isFormError(form.controls['lastName'])\">\r\n {{validatorsService.getError(form.controls['lastName']) | translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'First name' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"firstName\" data-testid=\"new-user-firstName\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['firstName'])|| isFormError(form.controls['firstName'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-user-firstName-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['firstName']) \r\n || isFormError(form.controls['firstName'])\">\r\n {{validatorsService.getError(form.controls['firstName']) | translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"working\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n\r\n <div *ngIf=\"createdUser; else waitingForUser\">\r\n <div class=\"alert alert-info\">\r\n {{'User successfully created' | translate}}\r\n </div>\r\n <lib-form-mission [organisationForMission]=\"addToOrganisation\" [userForMissionID]=\"createdUser.id\"\r\n [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\" (addedMissionInput)=\"onMissionInput($event)\">\r\n </lib-form-mission>\r\n </div>\r\n <ng-template #waitingForUser>\r\n <div class=\"action-button-container\">\r\n <button data-testid=\"new-user-submit-btn\" type=\"submit\" class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\r\n [disabled]=\"working\">{{'Create user' | translate}}</button>\r\n <button data-testid=\"new-user-cancel-btn\" type=\"button\" (click)=\"onCancel()\" [disabled]=\"working\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\r\n </div>\r\n <div class=\"invalid-feedback\" *ngIf=\"errorForm\">\r\n <ngb-alert data-testid=\"new-user-form-invalid\" [dismissible]=\"false\" type=\"danger\">\r\n {{'errorForm.infoBtn' |translate}}\r\n </ngb-alert>\r\n </div>\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'Mission details' | translate }}</h4>\r\n </div>\r\n <ngb-alert type=\"warning\" [dismissible]=\"false\">{{'Please create a user first' | translate}}.</ngb-alert>\r\n\r\n </ng-template>\r\n </form>\r\n</div>", styles: [".form-group{margin:1.5rem 0}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"], components: [{ type: i4.NgbAlert, selector: "ngb-alert", inputs: ["animation", "dismissible", "type"], outputs: ["closed"], exportAs: ["ngbAlert"] }, { type: i2.LoaderComponent, selector: "lib-loader", inputs: ["useLogo", "color"] }, { type: i5.FormMissionComponent, selector: "lib-form-mission", inputs: ["missionToEdit", "organisationForMission", "isSP", "userForMissionID", "currentUserOrganisation"], outputs: ["addedMissionInput"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i1.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: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], pipes: { "translate": i3.TranslatePipe } });
106
+ UserMissionFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: UserMissionFormComponent, selector: "lib-user-mission-form", inputs: { addToOrganisation: "addToOrganisation", isSP: "isSP", createForExistingUser: "createForExistingUser", currentOrg: "currentOrg" }, outputs: { added: "added" }, ngImport: i0, template: "<div *ngIf=\"form\">\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\n <div id=\"personalInfo\">\n <div style=\"margin-top: 1rem;\">\n <h4>{{ 'User Personal Information' | translate }}</h4>\n </div>\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{'Email' | translate}} *</label>\n <div class=\"col-sm-8\">\n <input type=\"text\" class=\"form-control\" data-testid=\"new-user-email\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['email'])|| isFormError(form.controls['email'])}\"\n required formControlName=\"email\">\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-user-email-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['email']) \n || isFormError(form.controls['email'])\">\n {{validatorsService.getError(form.controls['email']) | translate}}\n </ngb-alert>\n\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{'Last name' | translate}}</label>\n <div class=\"col-sm-8\">\n <input type=\"text\" class=\"form-control\" formControlName=\"lastName\" data-testid=\"new-user-lastName\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['lastName'])|| isFormError(form.controls['lastName'])}\">\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-user-lastName-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['lastName']) \n || isFormError(form.controls['lastName'])\">\n {{validatorsService.getError(form.controls['lastName']) | translate}}\n </ngb-alert>\n\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{'First name' | translate}}</label>\n <div class=\"col-sm-8\">\n <input type=\"text\" class=\"form-control\" formControlName=\"firstName\" data-testid=\"new-user-firstName\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['firstName'])|| isFormError(form.controls['firstName'])}\">\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-user-firstName-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['firstName']) \n || isFormError(form.controls['firstName'])\">\n {{validatorsService.getError(form.controls['firstName']) | translate}}\n </ngb-alert>\n\n </div>\n </div>\n </div>\n </div>\n <div class=\"d-flex justify-content-center\" *ngIf=\"working\">\n <lib-loader></lib-loader>\n </div>\n\n <div *ngIf=\"createdUser; else waitingForUser\">\n <div class=\"alert alert-info\">\n {{'User successfully created' | translate}}\n </div>\n <lib-form-mission [organisationForMission]=\"addToOrganisation\" [userForMissionID]=\"createdUser.id\"\n [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\" (addedMissionInput)=\"onMissionInput($event)\">\n </lib-form-mission>\n </div>\n <ng-template #waitingForUser>\n <div class=\"action-button-container\">\n <button data-testid=\"new-user-submit-btn\" type=\"submit\" class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\n [disabled]=\"working\">{{'Create user' | translate}}</button>\n <button data-testid=\"new-user-cancel-btn\" type=\"button\" (click)=\"onCancel()\" [disabled]=\"working\"\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\n </div>\n <div class=\"invalid-feedback\" *ngIf=\"errorForm\">\n <ngb-alert data-testid=\"new-user-form-invalid\" [dismissible]=\"false\" type=\"danger\">\n {{'errorForm.infoBtn' |translate}}\n </ngb-alert>\n </div>\n <div style=\"margin-top: 1rem;\">\n <h4>{{ 'Mission details' | translate }}</h4>\n </div>\n <ngb-alert type=\"warning\" [dismissible]=\"false\">{{'Please create a user first' | translate}}.</ngb-alert>\n\n </ng-template>\n </form>\n</div>", styles: [".form-group{margin:1.5rem 0}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"], components: [{ type: i4.NgbAlert, selector: "ngb-alert", inputs: ["animation", "dismissible", "type"], outputs: ["closed"], exportAs: ["ngbAlert"] }, { type: i2.LoaderComponent, selector: "lib-loader", inputs: ["useLogo", "color"] }, { type: i5.FormMissionComponent, selector: "lib-form-mission", inputs: ["missionToEdit", "organisationForMission", "isSP", "userForMissionID", "currentUserOrganisation"], outputs: ["addedMissionInput"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i1.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: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], pipes: { "translate": i3.TranslatePipe } });
107
107
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: UserMissionFormComponent, decorators: [{
108
108
  type: Component,
109
- args: [{ selector: 'lib-user-mission-form', template: "<div *ngIf=\"form\">\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\r\n <div id=\"personalInfo\">\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'User Personal Information' | translate }}</h4>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Email' | translate}} *</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" data-testid=\"new-user-email\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['email'])|| isFormError(form.controls['email'])}\"\r\n required formControlName=\"email\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-user-email-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['email']) \r\n || isFormError(form.controls['email'])\">\r\n {{validatorsService.getError(form.controls['email']) | translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Last name' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"lastName\" data-testid=\"new-user-lastName\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['lastName'])|| isFormError(form.controls['lastName'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-user-lastName-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['lastName']) \r\n || isFormError(form.controls['lastName'])\">\r\n {{validatorsService.getError(form.controls['lastName']) | translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'First name' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" class=\"form-control\" formControlName=\"firstName\" data-testid=\"new-user-firstName\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['firstName'])|| isFormError(form.controls['firstName'])}\">\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"new-user-firstName-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['firstName']) \r\n || isFormError(form.controls['firstName'])\">\r\n {{validatorsService.getError(form.controls['firstName']) | translate}}\r\n </ngb-alert>\r\n\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"working\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n\r\n <div *ngIf=\"createdUser; else waitingForUser\">\r\n <div class=\"alert alert-info\">\r\n {{'User successfully created' | translate}}\r\n </div>\r\n <lib-form-mission [organisationForMission]=\"addToOrganisation\" [userForMissionID]=\"createdUser.id\"\r\n [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\" (addedMissionInput)=\"onMissionInput($event)\">\r\n </lib-form-mission>\r\n </div>\r\n <ng-template #waitingForUser>\r\n <div class=\"action-button-container\">\r\n <button data-testid=\"new-user-submit-btn\" type=\"submit\" class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\r\n [disabled]=\"working\">{{'Create user' | translate}}</button>\r\n <button data-testid=\"new-user-cancel-btn\" type=\"button\" (click)=\"onCancel()\" [disabled]=\"working\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\r\n </div>\r\n <div class=\"invalid-feedback\" *ngIf=\"errorForm\">\r\n <ngb-alert data-testid=\"new-user-form-invalid\" [dismissible]=\"false\" type=\"danger\">\r\n {{'errorForm.infoBtn' |translate}}\r\n </ngb-alert>\r\n </div>\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'Mission details' | translate }}</h4>\r\n </div>\r\n <ngb-alert type=\"warning\" [dismissible]=\"false\">{{'Please create a user first' | translate}}.</ngb-alert>\r\n\r\n </ng-template>\r\n </form>\r\n</div>", styles: [".form-group{margin:1.5rem 0}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"] }]
109
+ args: [{ selector: 'lib-user-mission-form', template: "<div *ngIf=\"form\">\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"form\">\n <div id=\"personalInfo\">\n <div style=\"margin-top: 1rem;\">\n <h4>{{ 'User Personal Information' | translate }}</h4>\n </div>\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{'Email' | translate}} *</label>\n <div class=\"col-sm-8\">\n <input type=\"text\" class=\"form-control\" data-testid=\"new-user-email\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['email'])|| isFormError(form.controls['email'])}\"\n required formControlName=\"email\">\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-user-email-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['email']) \n || isFormError(form.controls['email'])\">\n {{validatorsService.getError(form.controls['email']) | translate}}\n </ngb-alert>\n\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{'Last name' | translate}}</label>\n <div class=\"col-sm-8\">\n <input type=\"text\" class=\"form-control\" formControlName=\"lastName\" data-testid=\"new-user-lastName\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['lastName'])|| isFormError(form.controls['lastName'])}\">\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-user-lastName-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['lastName']) \n || isFormError(form.controls['lastName'])\">\n {{validatorsService.getError(form.controls['lastName']) | translate}}\n </ngb-alert>\n\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{'First name' | translate}}</label>\n <div class=\"col-sm-8\">\n <input type=\"text\" class=\"form-control\" formControlName=\"firstName\" data-testid=\"new-user-firstName\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(form.controls['firstName'])|| isFormError(form.controls['firstName'])}\">\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"new-user-firstName-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\"validatorsService.isControlError(form.controls['firstName']) \n || isFormError(form.controls['firstName'])\">\n {{validatorsService.getError(form.controls['firstName']) | translate}}\n </ngb-alert>\n\n </div>\n </div>\n </div>\n </div>\n <div class=\"d-flex justify-content-center\" *ngIf=\"working\">\n <lib-loader></lib-loader>\n </div>\n\n <div *ngIf=\"createdUser; else waitingForUser\">\n <div class=\"alert alert-info\">\n {{'User successfully created' | translate}}\n </div>\n <lib-form-mission [organisationForMission]=\"addToOrganisation\" [userForMissionID]=\"createdUser.id\"\n [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\" (addedMissionInput)=\"onMissionInput($event)\">\n </lib-form-mission>\n </div>\n <ng-template #waitingForUser>\n <div class=\"action-button-container\">\n <button data-testid=\"new-user-submit-btn\" type=\"submit\" class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\n [disabled]=\"working\">{{'Create user' | translate}}</button>\n <button data-testid=\"new-user-cancel-btn\" type=\"button\" (click)=\"onCancel()\" [disabled]=\"working\"\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' | translate}}</button>\n </div>\n <div class=\"invalid-feedback\" *ngIf=\"errorForm\">\n <ngb-alert data-testid=\"new-user-form-invalid\" [dismissible]=\"false\" type=\"danger\">\n {{'errorForm.infoBtn' |translate}}\n </ngb-alert>\n </div>\n <div style=\"margin-top: 1rem;\">\n <h4>{{ 'Mission details' | translate }}</h4>\n </div>\n <ngb-alert type=\"warning\" [dismissible]=\"false\">{{'Please create a user first' | translate}}.</ngb-alert>\n\n </ng-template>\n </form>\n</div>", styles: [".form-group{margin:1.5rem 0}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"] }]
110
110
  }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.BaseUserService }, { type: i3.TranslateService }, { type: i2.ValidatorsService }]; }, propDecorators: { addToOrganisation: [{
111
111
  type: Input
112
112
  }], isSP: [{
@@ -118,4 +118,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImpor
118
118
  }], added: [{
119
119
  type: Output
120
120
  }] } });
121
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1taXNzaW9uLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWFkbWluL3NyYy9saWIvdXNlci91c2VyLW1pc3Npb24tZm9ybS91c2VyLW1pc3Npb24tZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi91c2VyL3VzZXItbWlzc2lvbi1mb3JtL3VzZXItbWlzc2lvbi1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUEwQixVQUFVLEVBQW1CLE1BQU0sZ0JBQWdCLENBQUM7QUFFckYsT0FBTyxFQUFxRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7Ozs7Ozs7O0FBT3ZLLE1BQU0sT0FBTyx3QkFBd0I7SUFzQmpDLFlBQ1ksRUFBZSxFQUNmLFdBQTRCLEVBQzVCLFNBQTJCLEVBQzVCLGlCQUFxQztRQUhwQyxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2YsZ0JBQVcsR0FBWCxXQUFXLENBQWlCO1FBQzVCLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzVCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBb0I7UUFwQnZDLDBCQUFxQixHQUFHLEtBQUssQ0FBQztRQU03QixVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUU5QyxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBTWhCLGNBQVMsR0FBWSxLQUFLLENBQUM7SUFPdkIsQ0FBQztJQUVMLFFBQVE7UUFDSixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsS0FBSyxDQUFDLHdCQUF3QjtRQUMxQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ3RCLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQztZQUN0RCxRQUFRLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLGFBQWEsRUFBRSxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQztZQUNoRixTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLGFBQWEsRUFBRSxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQztTQUNuRixDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDTCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRCxLQUFLLENBQUMsUUFBUTtRQUNWLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNsQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUN0QixPQUFPO1NBQ1Y7UUFFRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQVUsQ0FBQztRQUNmLElBQUk7WUFDQSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUNsQyxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDM0QsSUFBSSxDQUFDLEVBQUU7Z0JBQ0gsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7Z0JBQzlDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2dCQUNyQixPQUFPO2FBQ1Y7WUFDRCxJQUFJO2dCQUNBLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FDMUQsU0FBUyxFQUNULElBQUksQ0FDUCxDQUFDO2dCQUNGLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7YUFDOUI7WUFBQyxPQUFPLEtBQUssRUFBRTtnQkFDWixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztnQkFDckIsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyRCxPQUFPO2FBQ1Y7U0FDSjtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ1osT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN4QjtRQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLENBQUM7SUFFRCwwRUFBMEU7SUFDMUUsMkNBQTJDO0lBQzNDLG1DQUFtQztJQUNuQywyREFBMkQ7SUFDM0QscUNBQXFDO0lBQ3JDLGFBQWE7SUFDYix5QkFBeUI7SUFDekIsd0RBQXdEO0lBQ3hELDJEQUEyRDtJQUMzRCxxQ0FBcUM7SUFDckMsK0VBQStFO0lBQy9FLGdCQUFnQjtJQUNoQiwrQ0FBK0M7SUFDL0MsaUVBQWlFO0lBQ2pFLGNBQWM7SUFDZCxTQUFTO0lBQ1QsSUFBSTtJQUVKLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBZ0I7UUFDakMsSUFBSSxPQUFPLEVBQUU7WUFDVCxJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQztZQUM1QixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsdUNBQXVDLENBQzFELElBQUksQ0FBQyxZQUF1QixFQUM1QixJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FDbkMsQ0FBQztZQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3pCO2FBQU07WUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMxQjtJQUNMLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBTztRQUNmLE9BQU8sT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4RCxDQUFDO0lBR0QsWUFBWTtRQUNSLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNuQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztTQUMxQjtJQUVMLENBQUM7O3FIQTVIUSx3QkFBd0I7eUdBQXhCLHdCQUF3QixzT0NWckMsaWxLQW1GTTsyRkR6RU8sd0JBQXdCO2tCQUxwQyxTQUFTOytCQUNJLHVCQUF1QjsrTEFNeEIsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBSUcsVUFBVTtzQkFBbEIsS0FBSztnQkFFSSxLQUFLO3NCQUFkLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMsIEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQgeyBPcmdhbmlzYXRpb24sIE1pc3Npb24sIFByb2ZpbGUsIEJhc2VVc2VyU2VydmljZSwgVmFsaWRhdG9yc1NlcnZpY2UsdGV4dFZhbGlkYXRvciwgbm9FbXB0eVZhbGlkYXRvciwgZW1haWxWYWxpZGF0b3IgfSBmcm9tICdAc21hcnRlcnBsYW4vbmd4LXNtYXJ0ZXJwbGFuLWNvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2xpYi11c2VyLW1pc3Npb24tZm9ybScsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vdXNlci1taXNzaW9uLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vdXNlci1taXNzaW9uLWZvcm0uY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgVXNlck1pc3Npb25Gb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgICBASW5wdXQoKSBhZGRUb09yZ2FuaXNhdGlvbjogT3JnYW5pc2F0aW9uO1xyXG5cclxuICAgIEBJbnB1dCgpIGlzU1A6IGJvb2xlYW47XHJcblxyXG4gICAgQElucHV0KCkgY3JlYXRlRm9yRXhpc3RpbmdVc2VyID0gZmFsc2U7XHJcblxyXG4gICAgZm9ybTogRm9ybUdyb3VwO1xyXG5cclxuICAgIEBJbnB1dCgpIGN1cnJlbnRPcmc6IE9yZ2FuaXNhdGlvbjtcclxuXHJcbiAgICBAT3V0cHV0KCkgYWRkZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcblxyXG4gICAgd29ya2luZyA9IGZhbHNlO1xyXG5cclxuICAgIG1pc3Npb25JbnB1dDogTWlzc2lvbjtcclxuXHJcbiAgICBjcmVhdGVkVXNlcjogUHJvZmlsZTtcclxuXHJcbiAgICBlcnJvckZvcm06IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcclxuICAgICAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBCYXNlVXNlclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXHJcbiAgICAgICAgcHVibGljIHZhbGlkYXRvcnNTZXJ2aWNlIDogVmFsaWRhdG9yc1NlcnZpY2VcclxuICAgICkgeyB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgdGhpcy5vbkFkZE5ld1VzZXJNaXNzaW9uVG9PcmcoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkFkZE5ld1VzZXJNaXNzaW9uVG9PcmcoKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICAgIGVtYWlsOiBbbnVsbCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIGVtYWlsVmFsaWRhdG9yKCldXSxcclxuICAgICAgICAgICAgbGFzdE5hbWU6IFtcIlwiLCBbVmFsaWRhdG9ycy5tYXhMZW5ndGgoMjU1KSwgdGV4dFZhbGlkYXRvcigpLCBub0VtcHR5VmFsaWRhdG9yKCldXSxcclxuICAgICAgICAgICAgZmlyc3ROYW1lOiBbXCJcIixbVmFsaWRhdG9ycy5tYXhMZW5ndGgoMjU1KSwgdGV4dFZhbGlkYXRvcigpLCBub0VtcHR5VmFsaWRhdG9yKCldXSxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNhbmNlbCgpIHtcclxuICAgICAgICB0aGlzLmFkZGVkLmVtaXQoZmFsc2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBlbWFpbCgpOiBBYnN0cmFjdENvbnRyb2wge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0KFwiZW1haWxcIik7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TdWJtaXQoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmZvcm0udmFsaWQpIHtcclxuICAgICAgICAgICAgdGhpcy5lcnJvckZvcm0gPSB0cnVlO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLndvcmtpbmcgPSB0cnVlO1xyXG4gICAgICAgIGxldCBwOiBQcm9maWxlO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuZm9ybS52YWx1ZTtcclxuICAgICAgICAgICAgcCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UucHJvZmlsZUZvck1haWwoZm9ybVZhbHVlLmVtYWlsKTtcclxuICAgICAgICAgICAgaWYgKHApIHtcclxuICAgICAgICAgICAgICAgIGFsZXJ0KFwiVXNlciB3aXRoIHRoaXMgZW1haWwgZXhpc3RzIGFscmVhZHkhXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy53b3JraW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHByb2ZpbGUgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmNyZWF0ZVVzZXJBV1NhbmRQcm9maWxlKFxyXG4gICAgICAgICAgICAgICAgICAgIGZvcm1WYWx1ZSxcclxuICAgICAgICAgICAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVXNlciBjcmVhdGVkIVwiLCBwcm9maWxlLm1ldGFkYXRhKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlZFVzZXIgPSBwcm9maWxlO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy53b3JraW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBhbGVydCh0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KEpTT04uc3RyaW5naWZ5KGVycm9yKSkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMud29ya2luZyA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGFzeW5jIHVwZGF0ZUFsbE1pc3Npb25zRnJvbVRlbXBsYXRlKG1pc3Npb25JbnB1dDogVXBkYXRlTWlzc2lvbklucHV0KSB7XHJcbiAgICAvLyAgICAgLy8gYWxsIG1pc3Npb25zIG9mIHRoaXMgb3JnYW5pc2F0aW9uXHJcbiAgICAvLyAgICAgY29uc3QgbWlzc2lvbnNGcm9tVGVtcGxhdGUgPVxyXG4gICAgLy8gICAgICAgICBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLmdldE1pc3Npb25zQnlUZW1wbGF0ZShcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMubWlzc2lvblRvRWRpdC5pZCxcclxuICAgIC8vICAgICAgICAgKTtcclxuICAgIC8vICAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgIC8vICAgICAgICAgbWlzc2lvbnNGcm9tVGVtcGxhdGUubWFwKGFzeW5jIChtaXNzaW9uKSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgICBjb25zdCBtaXNzaW9uVGVtcGxhdGUgPSB7IC4uLm1pc3Npb25JbnB1dCB9O1xyXG4gICAgLy8gICAgICAgICAgICAgaWYgKHRoaXMuc2VuZFVwZGF0ZSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIG1pc3Npb25UZW1wbGF0ZS5lbWFpbFN0YXR1cyA9IEVtYWlsU3RhdHVzLlVQREFURV9UT19ERUxJVkVSO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgbWlzc2lvblRlbXBsYXRlLmlkID0gbWlzc2lvbi5pZDtcclxuICAgIC8vICAgICAgICAgICAgIGF3YWl0IHRoaXMubWlzc2lvblNlcnZpY2UudXBkYXRlKG1pc3Npb25UZW1wbGF0ZSk7XHJcbiAgICAvLyAgICAgICAgIH0pLFxyXG4gICAgLy8gICAgICk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgYXN5bmMgb25NaXNzaW9uSW5wdXQobWlzc2lvbjogTWlzc2lvbikge1xyXG4gICAgICAgIGlmIChtaXNzaW9uKSB7XHJcbiAgICAgICAgICAgIHRoaXMubWlzc2lvbklucHV0ID0gbWlzc2lvbjtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy51c2VyU2VydmljZS5jcmVhdGVPclVwZGF0ZU1pc3Npb25Gb3JPcmdXaXRoUHJvcGVydHkoXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1pc3Npb25JbnB1dCBhcyBNaXNzaW9uLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5taXNzaW9uSW5wdXQub3JnYW5pc2F0aW9uSUQsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkZWQuZW1pdCh0cnVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFkZGVkLmVtaXQoZmFsc2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpc0Zvcm1FcnJvcihjb250cm9sKSB7XHJcbiAgICAgICAgcmV0dXJuIGNvbnRyb2wgJiYgY29udHJvbC5pbnZhbGlkICYmIHRoaXMuZXJyb3JGb3JtO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBvbkZvcm1DaGFuZ2UoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZXJyb3JGb3JtICYmIHRoaXMuZm9ybS52YWxpZCkge1xyXG4gICAgICAgICAgICB0aGlzLmVycm9yRm9ybSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiAqbmdJZj1cImZvcm1cIj5cclxuICAgIDxmb3JtIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdCgpXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCI+XHJcbiAgICAgICAgPGRpdiBpZD1cInBlcnNvbmFsSW5mb1wiPlxyXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbTtcIj5cclxuICAgICAgICAgICAgICAgIDxoND57eyAnVXNlciBQZXJzb25hbCBJbmZvcm1hdGlvbicgfCB0cmFuc2xhdGUgfX08L2g0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J0VtYWlsJyB8IHRyYW5zbGF0ZX19ICo8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBkYXRhLXRlc3RpZD1cIm5ldy11c2VyLWVtYWlsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydpcy1pbnZhbGlkJyA6IHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ2VtYWlsJ10pfHwgIGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ2VtYWlsJ10pfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIGZvcm1Db250cm9sTmFtZT1cImVtYWlsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nYi1hbGVydCBkYXRhLXRlc3RpZD1cIm5ldy11c2VyLWVtYWlsLWludmFsaWRcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIiB0eXBlPVwiZGFuZ2VyXCIgKm5nSWY9XCJ2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydlbWFpbCddKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgaXNGb3JtRXJyb3IoZm9ybS5jb250cm9sc1snZW1haWwnXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7dmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IoZm9ybS5jb250cm9sc1snZW1haWwnXSkgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snTGFzdCBuYW1lJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwibGFzdE5hbWVcIiBkYXRhLXRlc3RpZD1cIm5ldy11c2VyLWxhc3ROYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnIDogdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snbGFzdE5hbWUnXSl8fCAgaXNGb3JtRXJyb3IoZm9ybS5jb250cm9sc1snbGFzdE5hbWUnXSl9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nYi1hbGVydCBkYXRhLXRlc3RpZD1cIm5ldy11c2VyLWxhc3ROYW1lLWludmFsaWRcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIiB0eXBlPVwiZGFuZ2VyXCIgKm5nSWY9XCJ2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydsYXN0TmFtZSddKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgaXNGb3JtRXJyb3IoZm9ybS5jb250cm9sc1snbGFzdE5hbWUnXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7dmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IoZm9ybS5jb250cm9sc1snbGFzdE5hbWUnXSkgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snRmlyc3QgbmFtZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImZpcnN0TmFtZVwiIGRhdGEtdGVzdGlkPVwibmV3LXVzZXItZmlyc3ROYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnIDogdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snZmlyc3ROYW1lJ10pfHwgIGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ2ZpcnN0TmFtZSddKX1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmdiLWFsZXJ0IGRhdGEtdGVzdGlkPVwibmV3LXVzZXItZmlyc3ROYW1lLWludmFsaWRcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIiB0eXBlPVwiZGFuZ2VyXCIgKm5nSWY9XCJ2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihmb3JtLmNvbnRyb2xzWydmaXJzdE5hbWUnXSkgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ2ZpcnN0TmFtZSddKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3t2YWxpZGF0b3JzU2VydmljZS5nZXRFcnJvcihmb3JtLmNvbnRyb2xzWydmaXJzdE5hbWUnXSkgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCIgKm5nSWY9XCJ3b3JraW5nXCI+XHJcbiAgICAgICAgICAgIDxsaWItbG9hZGVyPjwvbGliLWxvYWRlcj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cImNyZWF0ZWRVc2VyOyBlbHNlIHdhaXRpbmdGb3JVc2VyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbGVydCBhbGVydC1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICB7eydVc2VyIHN1Y2Nlc3NmdWxseSBjcmVhdGVkJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bGliLWZvcm0tbWlzc2lvbiBbb3JnYW5pc2F0aW9uRm9yTWlzc2lvbl09XCJhZGRUb09yZ2FuaXNhdGlvblwiIFt1c2VyRm9yTWlzc2lvbklEXT1cImNyZWF0ZWRVc2VyLmlkXCJcclxuICAgICAgICAgICAgICAgIFtjdXJyZW50VXNlck9yZ2FuaXNhdGlvbl09XCJjdXJyZW50T3JnXCIgW2lzU1BdPVwiaXNTUFwiIChhZGRlZE1pc3Npb25JbnB1dCk9XCJvbk1pc3Npb25JbnB1dCgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgIDwvbGliLWZvcm0tbWlzc2lvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI3dhaXRpbmdGb3JVc2VyPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ1dHRvbi1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gZGF0YS10ZXN0aWQ9XCJuZXctdXNlci1zdWJtaXQtYnRuXCIgdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1yLTMgYWN0aW9uLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIndvcmtpbmdcIj57eydDcmVhdGUgdXNlcicgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLXRlc3RpZD1cIm5ldy11c2VyLWNhbmNlbC1idG5cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIiBbZGlzYWJsZWRdPVwid29ya2luZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgYWN0aW9uLWJ1dHRvblwiPnt7J0NhbmNlbCcgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIiAqbmdJZj1cImVycm9yRm9ybVwiPlxyXG4gICAgICAgICAgICAgICAgPG5nYi1hbGVydCBkYXRhLXRlc3RpZD1cIm5ldy11c2VyLWZvcm0taW52YWxpZFwiIFtkaXNtaXNzaWJsZV09XCJmYWxzZVwiIHR5cGU9XCJkYW5nZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eydlcnJvckZvcm0uaW5mb0J0bicgfHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxcmVtO1wiPlxyXG4gICAgICAgICAgICAgICAgPGg0Pnt7ICdNaXNzaW9uIGRldGFpbHMnIHwgdHJhbnNsYXRlIH19PC9oND5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxuZ2ItYWxlcnQgdHlwZT1cIndhcm5pbmdcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIj57eydQbGVhc2UgY3JlYXRlIGEgdXNlciBmaXJzdCcgfCB0cmFuc2xhdGV9fS48L25nYi1hbGVydD5cclxuXHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwvZm9ybT5cclxuPC9kaXY+Il19
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1taXNzaW9uLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWFkbWluL3NyYy9saWIvdXNlci91c2VyLW1pc3Npb24tZm9ybS91c2VyLW1pc3Npb24tZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi91c2VyL3VzZXItbWlzc2lvbi1mb3JtL3VzZXItbWlzc2lvbi1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0UsT0FBTyxFQUEwQixVQUFVLEVBQW1CLE1BQU0sZ0JBQWdCLENBQUM7QUFFckYsT0FBTyxFQUFxRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7Ozs7Ozs7O0FBT3ZLLE1BQU0sT0FBTyx3QkFBd0I7SUFzQmpDLFlBQ1ksRUFBZSxFQUNmLFdBQTRCLEVBQzVCLFNBQTJCLEVBQzVCLGlCQUFxQztRQUhwQyxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2YsZ0JBQVcsR0FBWCxXQUFXLENBQWlCO1FBQzVCLGNBQVMsR0FBVCxTQUFTLENBQWtCO1FBQzVCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBb0I7UUFwQnZDLDBCQUFxQixHQUFHLEtBQUssQ0FBQztRQU03QixVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUU5QyxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBTWhCLGNBQVMsR0FBWSxLQUFLLENBQUM7SUFPdkIsQ0FBQztJQUVMLFFBQVE7UUFDSixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsS0FBSyxD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LENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FDbkMsQ0FBQztZQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3pCO2FBQU07WUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMxQjtJQUNMLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBTztRQUNmLE9BQU8sT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4RCxDQUFDO0lBR0QsWUFBWTtRQUNSLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNuQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztTQUMxQjtJQUVMLENBQUM7O3FIQTVIUSx3QkFBd0I7eUdBQXhCLHdCQUF3QixzT0NWckMsMjZKQW1GTTsyRkR6RU8sd0JBQXdCO2tCQUxwQyxTQUFTOytCQUNJLHVCQUF1QjsrTEFNeEIsaUJBQWlCO3NCQUF6QixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBSUcsVUFBVTtzQkFBbEIsS0FBSztnQkFFSSxLQUFLO3NCQUFkLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzLCBBYnN0cmFjdENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBPcmdhbmlzYXRpb24sIE1pc3Npb24sIFByb2ZpbGUsIEJhc2VVc2VyU2VydmljZSwgVmFsaWRhdG9yc1NlcnZpY2UsdGV4dFZhbGlkYXRvciwgbm9FbXB0eVZhbGlkYXRvciwgZW1haWxWYWxpZGF0b3IgfSBmcm9tICdAc21hcnRlcnBsYW4vbmd4LXNtYXJ0ZXJwbGFuLWNvcmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2xpYi11c2VyLW1pc3Npb24tZm9ybScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3VzZXItbWlzc2lvbi1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi91c2VyLW1pc3Npb24tZm9ybS5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFVzZXJNaXNzaW9uRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgICBASW5wdXQoKSBhZGRUb09yZ2FuaXNhdGlvbjogT3JnYW5pc2F0aW9uO1xuXG4gICAgQElucHV0KCkgaXNTUDogYm9vbGVhbjtcblxuICAgIEBJbnB1dCgpIGNyZWF0ZUZvckV4aXN0aW5nVXNlciA9IGZhbHNlO1xuXG4gICAgZm9ybTogRm9ybUdyb3VwO1xuXG4gICAgQElucHV0KCkgY3VycmVudE9yZzogT3JnYW5pc2F0aW9uO1xuXG4gICAgQE91dHB1dCgpIGFkZGVkID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgd29ya2luZyA9IGZhbHNlO1xuXG4gICAgbWlzc2lvbklucHV0OiBNaXNzaW9uO1xuXG4gICAgY3JlYXRlZFVzZXI6IFByb2ZpbGU7XG5cbiAgICBlcnJvckZvcm06IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcbiAgICAgICAgcHJpdmF0ZSB1c2VyU2VydmljZTogQmFzZVVzZXJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgcHVibGljIHZhbGlkYXRvcnNTZXJ2aWNlIDogVmFsaWRhdG9yc1NlcnZpY2VcbiAgICApIHsgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMub25BZGROZXdVc2VyTWlzc2lvblRvT3JnKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgb25BZGROZXdVc2VyTWlzc2lvblRvT3JnKCkge1xuICAgICAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgIGVtYWlsOiBbbnVsbCwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIGVtYWlsVmFsaWRhdG9yKCldXSxcbiAgICAgICAgICAgIGxhc3ROYW1lOiBbXCJcIiwgW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDI1NSksIHRleHRWYWxpZGF0b3IoKSwgbm9FbXB0eVZhbGlkYXRvcigpXV0sXG4gICAgICAgICAgICBmaXJzdE5hbWU6IFtcIlwiLFtWYWxpZGF0b3JzLm1heExlbmd0aCgyNTUpLCB0ZXh0VmFsaWRhdG9yKCksIG5vRW1wdHlWYWxpZGF0b3IoKV1dLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkNhbmNlbCgpIHtcbiAgICAgICAgdGhpcy5hZGRlZC5lbWl0KGZhbHNlKTtcbiAgICB9XG5cbiAgICBnZXQgZW1haWwoKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybS5nZXQoXCJlbWFpbFwiKTtcbiAgICB9XG5cbiAgICBhc3luYyBvblN1Ym1pdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZvcm0udmFsaWQpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3JGb3JtID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMud29ya2luZyA9IHRydWU7XG4gICAgICAgIGxldCBwOiBQcm9maWxlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5mb3JtLnZhbHVlO1xuICAgICAgICAgICAgcCA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UucHJvZmlsZUZvck1haWwoZm9ybVZhbHVlLmVtYWlsKTtcbiAgICAgICAgICAgIGlmIChwKSB7XG4gICAgICAgICAgICAgICAgYWxlcnQoXCJVc2VyIHdpdGggdGhpcyBlbWFpbCBleGlzdHMgYWxyZWFkeSFcIik7XG4gICAgICAgICAgICAgICAgdGhpcy53b3JraW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9maWxlID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5jcmVhdGVVc2VyQVdTYW5kUHJvZmlsZShcbiAgICAgICAgICAgICAgICAgICAgZm9ybVZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJVc2VyIGNyZWF0ZWQhXCIsIHByb2ZpbGUubWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlZFVzZXIgPSBwcm9maWxlO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndvcmtpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBhbGVydCh0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KEpTT04uc3RyaW5naWZ5KGVycm9yKSkpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMud29ya2luZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIGFzeW5jIHVwZGF0ZUFsbE1pc3Npb25zRnJvbVRlbXBsYXRlKG1pc3Npb25JbnB1dDogVXBkYXRlTWlzc2lvbklucHV0KSB7XG4gICAgLy8gICAgIC8vIGFsbCBtaXNzaW9ucyBvZiB0aGlzIG9yZ2FuaXNhdGlvblxuICAgIC8vICAgICBjb25zdCBtaXNzaW9uc0Zyb21UZW1wbGF0ZSA9XG4gICAgLy8gICAgICAgICBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLmdldE1pc3Npb25zQnlUZW1wbGF0ZShcbiAgICAvLyAgICAgICAgICAgICB0aGlzLm1pc3Npb25Ub0VkaXQuaWQsXG4gICAgLy8gICAgICAgICApO1xuICAgIC8vICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAvLyAgICAgICAgIG1pc3Npb25zRnJvbVRlbXBsYXRlLm1hcChhc3luYyAobWlzc2lvbikgPT4ge1xuICAgIC8vICAgICAgICAgICAgIGNvbnN0IG1pc3Npb25UZW1wbGF0ZSA9IHsgLi4ubWlzc2lvbklucHV0IH07XG4gICAgLy8gICAgICAgICAgICAgaWYgKHRoaXMuc2VuZFVwZGF0ZSkge1xuICAgIC8vICAgICAgICAgICAgICAgICBtaXNzaW9uVGVtcGxhdGUuZW1haWxTdGF0dXMgPSBFbWFpbFN0YXR1cy5VUERBVEVfVE9fREVMSVZFUjtcbiAgICAvLyAgICAgICAgICAgICB9XG4gICAgLy8gICAgICAgICAgICAgbWlzc2lvblRlbXBsYXRlLmlkID0gbWlzc2lvbi5pZDtcbiAgICAvLyAgICAgICAgICAgICBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLnVwZGF0ZShtaXNzaW9uVGVtcGxhdGUpO1xuICAgIC8vICAgICAgICAgfSksXG4gICAgLy8gICAgICk7XG4gICAgLy8gfVxuXG4gICAgYXN5bmMgb25NaXNzaW9uSW5wdXQobWlzc2lvbjogTWlzc2lvbikge1xuICAgICAgICBpZiAobWlzc2lvbikge1xuICAgICAgICAgICAgdGhpcy5taXNzaW9uSW5wdXQgPSBtaXNzaW9uO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy51c2VyU2VydmljZS5jcmVhdGVPclVwZGF0ZU1pc3Npb25Gb3JPcmdXaXRoUHJvcGVydHkoXG4gICAgICAgICAgICAgICAgdGhpcy5taXNzaW9uSW5wdXQgYXMgTWlzc2lvbixcbiAgICAgICAgICAgICAgICB0aGlzLm1pc3Npb25JbnB1dC5vcmdhbmlzYXRpb25JRCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmFkZGVkLmVtaXQodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFkZGVkLmVtaXQoZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNGb3JtRXJyb3IoY29udHJvbCkge1xuICAgICAgICByZXR1cm4gY29udHJvbCAmJiBjb250cm9sLmludmFsaWQgJiYgdGhpcy5lcnJvckZvcm07XG4gICAgfVxuXG5cbiAgICBvbkZvcm1DaGFuZ2UoKSB7XG4gICAgICAgIGlmICh0aGlzLmVycm9yRm9ybSAmJiB0aGlzLmZvcm0udmFsaWQpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3JGb3JtID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgIH1cbn1cbiIsIjxkaXYgKm5nSWY9XCJmb3JtXCI+XG4gICAgPGZvcm0gKG5nU3VibWl0KT1cIm9uU3VibWl0KClcIiBbZm9ybUdyb3VwXT1cImZvcm1cIj5cbiAgICAgICAgPGRpdiBpZD1cInBlcnNvbmFsSW5mb1wiPlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDFyZW07XCI+XG4gICAgICAgICAgICAgICAgPGg0Pnt7ICdVc2VyIFBlcnNvbmFsIEluZm9ybWF0aW9uJyB8IHRyYW5zbGF0ZSB9fTwvaDQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snRW1haWwnIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZGF0YS10ZXN0aWQ9XCJuZXctdXNlci1lbWFpbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnIDogdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snZW1haWwnXSl8fCAgaXNGb3JtRXJyb3IoZm9ybS5jb250cm9sc1snZW1haWwnXSl9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkIGZvcm1Db250cm9sTmFtZT1cImVtYWlsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmdiLWFsZXJ0IGRhdGEtdGVzdGlkPVwibmV3LXVzZXItZW1haWwtaW52YWxpZFwiIFtkaXNtaXNzaWJsZV09XCJmYWxzZVwiIHR5cGU9XCJkYW5nZXJcIiAqbmdJZj1cInZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ2VtYWlsJ10pIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgaXNGb3JtRXJyb3IoZm9ybS5jb250cm9sc1snZW1haWwnXSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3ZhbGlkYXRvcnNTZXJ2aWNlLmdldEVycm9yKGZvcm0uY29udHJvbHNbJ2VtYWlsJ10pIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmdiLWFsZXJ0PlxuXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snTGFzdCBuYW1lJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJsYXN0TmFtZVwiIGRhdGEtdGVzdGlkPVwibmV3LXVzZXItbGFzdE5hbWVcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnIDogdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snbGFzdE5hbWUnXSl8fCAgaXNGb3JtRXJyb3IoZm9ybS5jb250cm9sc1snbGFzdE5hbWUnXSl9XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmdiLWFsZXJ0IGRhdGEtdGVzdGlkPVwibmV3LXVzZXItbGFzdE5hbWUtaW52YWxpZFwiIFtkaXNtaXNzaWJsZV09XCJmYWxzZVwiIHR5cGU9XCJkYW5nZXJcIiAqbmdJZj1cInZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ2xhc3ROYW1lJ10pIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgaXNGb3JtRXJyb3IoZm9ybS5jb250cm9sc1snbGFzdE5hbWUnXSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3ZhbGlkYXRvcnNTZXJ2aWNlLmdldEVycm9yKGZvcm0uY29udHJvbHNbJ2xhc3ROYW1lJ10pIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmdiLWFsZXJ0PlxuXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snRmlyc3QgbmFtZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiZmlyc3ROYW1lXCIgZGF0YS10ZXN0aWQ9XCJuZXctdXNlci1maXJzdE5hbWVcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnIDogdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IoZm9ybS5jb250cm9sc1snZmlyc3ROYW1lJ10pfHwgIGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ2ZpcnN0TmFtZSddKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZ2ItYWxlcnQgZGF0YS10ZXN0aWQ9XCJuZXctdXNlci1maXJzdE5hbWUtaW52YWxpZFwiIFtkaXNtaXNzaWJsZV09XCJmYWxzZVwiIHR5cGU9XCJkYW5nZXJcIiAqbmdJZj1cInZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKGZvcm0uY29udHJvbHNbJ2ZpcnN0TmFtZSddKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIGlzRm9ybUVycm9yKGZvcm0uY29udHJvbHNbJ2ZpcnN0TmFtZSddKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7dmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IoZm9ybS5jb250cm9sc1snZmlyc3ROYW1lJ10pIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmdiLWFsZXJ0PlxuXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIiAqbmdJZj1cIndvcmtpbmdcIj5cbiAgICAgICAgICAgIDxsaWItbG9hZGVyPjwvbGliLWxvYWRlcj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cImNyZWF0ZWRVc2VyOyBlbHNlIHdhaXRpbmdGb3JVc2VyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtaW5mb1wiPlxuICAgICAgICAgICAgICAgIHt7J1VzZXIgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQnIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGxpYi1mb3JtLW1pc3Npb24gW29yZ2FuaXNhdGlvbkZvck1pc3Npb25dPVwiYWRkVG9PcmdhbmlzYXRpb25cIiBbdXNlckZvck1pc3Npb25JRF09XCJjcmVhdGVkVXNlci5pZFwiXG4gICAgICAgICAgICAgICAgW2N1cnJlbnRVc2VyT3JnYW5pc2F0aW9uXT1cImN1cnJlbnRPcmdcIiBbaXNTUF09XCJpc1NQXCIgKGFkZGVkTWlzc2lvbklucHV0KT1cIm9uTWlzc2lvbklucHV0KCRldmVudClcIj5cbiAgICAgICAgICAgIDwvbGliLWZvcm0tbWlzc2lvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjd2FpdGluZ0ZvclVzZXI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ1dHRvbi1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGRhdGEtdGVzdGlkPVwibmV3LXVzZXItc3VibWl0LWJ0blwiIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtci0zIGFjdGlvbi1idXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwid29ya2luZ1wiPnt7J0NyZWF0ZSB1c2VyJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLXRlc3RpZD1cIm5ldy11c2VyLWNhbmNlbC1idG5cIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIiBbZGlzYWJsZWRdPVwid29ya2luZ1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIGFjdGlvbi1idXR0b25cIj57eydDYW5jZWwnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIiAqbmdJZj1cImVycm9yRm9ybVwiPlxuICAgICAgICAgICAgICAgIDxuZ2ItYWxlcnQgZGF0YS10ZXN0aWQ9XCJuZXctdXNlci1mb3JtLWludmFsaWRcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIiB0eXBlPVwiZGFuZ2VyXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7J2Vycm9yRm9ybS5pbmZvQnRuJyB8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDFyZW07XCI+XG4gICAgICAgICAgICAgICAgPGg0Pnt7ICdNaXNzaW9uIGRldGFpbHMnIHwgdHJhbnNsYXRlIH19PC9oND5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPG5nYi1hbGVydCB0eXBlPVwid2FybmluZ1wiIFtkaXNtaXNzaWJsZV09XCJmYWxzZVwiPnt7J1BsZWFzZSBjcmVhdGUgYSB1c2VyIGZpcnN0JyB8IHRyYW5zbGF0ZX19LjwvbmdiLWFsZXJ0PlxuXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9mb3JtPlxuPC9kaXY+Il19
@@ -328,9 +328,9 @@ export class UserComponent {
328
328
  }
329
329
  }
330
330
  UserComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: UserComponent, deps: [{ token: i1.BaseUserService }, { token: i1.MissionService }, { token: i1.DomainService }, { token: i1.OrganisationService }, { token: i2.NgbModal }, { token: i3.TranslateService }, { token: i1.ProfileService }], target: i0.ɵɵFactoryTarget.Component });
331
- UserComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: UserComponent, selector: "lib-user", ngImport: i0, template: "<div class=\"dashboard-tab\">\r\n <div class=\"header-dashboard-tab\">\r\n <h3>{{'Users' | translate}}</h3>\r\n <!-- <app-search-bar *ngIf=\"!hideList\" [searchable]=\"orgsUsersMissions\" objectType=\"USER\"\r\n (searchEvent)=\"applyResultsSearchBar($event)\">\r\n </app-search-bar> -->\r\n <hr>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-8 col-lg-6\">\r\n <div class=\"row ml-0 mb-2\" *ngIf=\"!hideList\">\r\n <button class=\"btn btn-outline-primary rounded-pill add-button\" *ngIf=\"!isGuide\" (click)=\"onAddOrg()\">\r\n {{'Add user to new organisation' | translate}}</button>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <div *ngIf=\"!hideList\">\r\n <ul class=\"list-group list-group-flush\" *ngIf=\"filteredOrgsUsersMissions\" data-testid=\"mission-organisation-list\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let o of filteredOrgsUsersMissions\">\r\n <div class=\"d-flex justify-content-between align-items-center font-weight-bold\"\r\n ngbTooltip=\"See details and users\" style=\"cursor: pointer;\" (click)=\"onToggleDetailOrg(o.org.id, o.org)\">\r\n {{o.org.name}} <small *ngIf=\"o.org.id == currentOrg.id\">({{'My organisation' | translate}})</small>\r\n <small *ngIf=\"isSP && clientsSP.includes(o.org.id)\">({{'Client of SmarterPlan' | translate}})</small>\r\n <small *ngIf=\"isSP && getOrderedOrg(o.org.id)\">({{'Client of ' | translate}}\r\n {{getOrderedOrg(o.org.id)}})</small>\r\n <lib-chevron [conditionShowing]=\"detailsOrg==o.org.id\" [ngClass]=\"[getStringNoSpace(o.org.name)]\"></lib-chevron>\r\n </div>\r\n <div class=\"missions\" *ngIf=\"detailsOrg==o.org.id\">\r\n <div class='d-flex'>\r\n <button data-testid=\"user-new-btn\" class=\"btn btn-outline-primary rounded-pill mt-3 mb-3\" (click)=\"onAdd(o.org)\">{{'Add user' |\r\n translate}}</button>\r\n </div>\r\n\r\n <ul class=\"list-group list-group-flush\" data-testid=\"mission-user-list\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let a of o.users\"\r\n (click)=\"onToggleDetailUser(a.user.id)\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n {{a.user.displayName}}\r\n <lib-chevron [conditionShowing]=\"detailsUser==a.user.id\" [ngClass]=\"[getStringNoSpace(a.user.displayName)]\"></lib-chevron>\r\n </div>\r\n\r\n <div *ngIf=\"detailsUser==a.user.id\">\r\n <div class=\"ml-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n {{'Email' | translate}}: {{a.user.email }}\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\" data-testid=\"mission-new-btn\"\r\n (click)=\"onAddForUser(o.org, a.user)\">{{'Add new mission' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\" (click)=\"onClearToken(a)\">\r\n {{'Clear Token' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\"\r\n (click)=\"onDeleteUser(a.user)\">{{'Delete user' | translate}}</button>\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n {{ a.missions.length > 0 ? ('Current Missions' | translate) : ('No missions' | translate)}}\r\n </div>\r\n </div>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item\" *ngFor=\"let mis of a.missions\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.description\">\r\n {{'Description' | translate}}: {{mis.description}}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.templateMissionID\">\r\n {{'Attendee of tour' | translate}}: {{mis.templateMission.title}}</li>\r\n\r\n <li class=\"list-group-item bg-transparent\">{{'Role' | translate}}: {{ mis.role }}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.hashtags && mis.hashtags.length> 0\">\r\n {{'Hashtags' | translate}}: <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\">\r\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of mis.hashtags\">\r\n {{ hashtag | hashtagFromID | async }}</li>\r\n </div>\r\n </ul>\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Language' | translate }}: {{\r\n mis.locale ? mis.locale : ('Not applicable' | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate }}: {{\r\n mis.level}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Ordered by' | translate }}: {{\r\n mis.orderedOrganisation.name}}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.domains\">{{'Domains' | translate }}:\r\n {{mis.domains ?\r\n domainIdsToStringForMission(mis) : (\"No data\" | translate) }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Authorized location' | translate }}:\r\n {{ mis.space ? mis.space.name : \"No location\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Authorized zone' | translate }}:\r\n {{ mis.zone ? mis.zone.name : \"All zones allowed\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Starts' | translate }}:\r\n {{ mis.startDateTime ? (mis.startDateTime | timeDateString: \"day_time_zone\" | async) :\r\n \"No data\" | translate}}, {{'Ends' | translate}}: {{ mis.endDateTime\r\n ? (mis.endDateTime | timeDateString: \"day_time_zone\" | async)\r\n : \"No data\" | translate}}.\r\n </li>\r\n </ul>\r\n <div class=\"action-button-container\" >\r\n <button type=\"button\" data-testid=\"edit-mission-btn\" class=\"btn btn-outline-primary rounded-pill mr-2 action-button\"\r\n (click)=\"onEdit(mis)\">{{'Edit' |\r\n translate}}</button>\r\n <button type=\"button\" *ngIf=\"mis.role === 'VISITOR' || mis.role === 'VISITOR_MUSEUM'\"\r\n class=\"btn btn-outline-primary rounded-pill mr-2 action-button share-visitor-button\"\r\n (click)=\"onSetForShareableLink(a.user, mis)\">{{'Generate Shareable Link' |\r\n translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n (click)=\"onDeleteMission(mis)\">{{'Delete' | translate}}</button>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n <li class=\"list-group-item list-group-item-action\" *ngIf=\"profilesWithoutMission && profilesWithoutMission.length > 0\">\r\n <div class=\"d-flex justify-content-between align-items-center font-weight-bold\"\r\n ngbTooltip=\"See details\" style=\"cursor: pointer;\" (click)=\"onToggleDetailOrg('-2', null)\">\r\n {{\"Users without missions\" | translate}}\r\n <lib-chevron [conditionShowing]=\"detailsOrg=='-2'\"></lib-chevron>\r\n </div>\r\n <div class=\"missions\" *ngIf=\"detailsOrg=='-2'\">\r\n <ul class=\"list-group list-group-flush\" data-testid=\"mission-organisation-list\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let profile of profilesWithoutMission\" \r\n (click)=\"onToggleDetailUser(profile.id)\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n {{profile.displayName}}\r\n <lib-chevron [conditionShowing]=\"detailsUser==profile.id\" [ngClass]=\"[getStringNoSpace(profile.displayName)]\"></lib-chevron>\r\n </div>\r\n <div *ngIf=\"detailsUser==profile.id\">\r\n <div class=\"ml-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n {{'Email' | translate}}: {{profile.email }}\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\" data-testid=\"mission-new-btn\"\r\n (click)=\"onAddForUser(currentOrg, profile)\">{{'Add new mission' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\"\r\n (click)=\"onDeleteUser(profile)\">{{'Delete user' | translate}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div *ngIf=\"create\">\r\n <lib-user-mission-form [addToOrganisation]=\"addToOrg\" [currentOrg]=\"currentOrg\" [isSP]=\"isSP\"\r\n (added)=\"userAdded($event)\">\r\n </lib-user-mission-form>\r\n </div>\r\n <div *ngIf=\"edit\">\r\n <lib-form-mission [missionToEdit]=\"missionToEdit\" [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\"\r\n (addedMissionInput)=\"onMissionEdited($event)\"></lib-form-mission>\r\n </div>\r\n <div *ngIf=\"createForExistingUser\">\r\n <lib-form-mission [organisationForMission]=\"addToOrg\" [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\"\r\n [userForMissionID]=\"userForAddingMission.id\" (addedMissionInput)=\"onMissionCreated($event)\">\r\n </lib-form-mission>\r\n </div>\r\n <div *ngIf=\"isAddingOrg || isAddingToExistingOrg\">\r\n <lib-form-organisation [currentOrg]=\"currentOrg\" [currentUser]=\"me\" [existing]=\"isAddingToExistingOrg\"\r\n (added)=\"orgAdded($event)\"></lib-form-organisation>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-4 col-lg-6\" *ngIf=\"orgSelectedDetails && !isGuide\">\r\n <lib-detail-organisation [org]=\"orgSelectedDetails\" [currentOrg]=\"currentOrg\" [isSP]=\"isSP\"\r\n (orgChanged)='orgAdded($event)'></lib-detail-organisation>\r\n </div>\r\n </div>\r\n</div>", styles: [".add-button{width:-moz-fit-content;width:fit-content;margin-left:.5rem}li.ml-4{margin-left:3rem}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}.action-button-container .share-visitor-button{width:-moz-fit-content;width:fit-content}\n"], components: [{ type: i1.LoaderComponent, selector: "lib-loader", inputs: ["useLogo", "color"] }, { type: i4.ChevronComponent, selector: "lib-chevron", inputs: ["conditionShowing"] }, { type: i5.UserMissionFormComponent, selector: "lib-user-mission-form", inputs: ["addToOrganisation", "isSP", "createForExistingUser", "currentOrg"], outputs: ["added"] }, { type: i6.FormMissionComponent, selector: "lib-form-mission", inputs: ["missionToEdit", "organisationForMission", "isSP", "userForMissionID", "currentUserOrganisation"], outputs: ["addedMissionInput"] }, { type: i7.FormOrganisationComponent, selector: "lib-form-organisation", inputs: ["currentOrg", "currentUser", "existing"], outputs: ["added"] }, { type: i8.DetailOrganisationComponent, selector: "lib-detail-organisation", inputs: ["org", "currentOrg", "isSP"], outputs: ["orgChanged"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], pipes: { "translate": i3.TranslatePipe, "async": i9.AsyncPipe, "hashtagFromID": i1.HashtagFromIdPipe, "timeDateString": i1.TimeDateToLocalStringPipe } });
331
+ UserComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: UserComponent, selector: "lib-user", ngImport: i0, template: "<div class=\"dashboard-tab\">\n <div class=\"header-dashboard-tab\">\n <h3>{{'Users' | translate}}</h3>\n <!-- <app-search-bar *ngIf=\"!hideList\" [searchable]=\"orgsUsersMissions\" objectType=\"USER\"\n (searchEvent)=\"applyResultsSearchBar($event)\">\n </app-search-bar> -->\n <hr>\n </div>\n <div class=\"row\">\n <div class=\"col-md-8 col-lg-6\">\n <div class=\"row ml-0 mb-2\" *ngIf=\"!hideList\">\n <button class=\"btn btn-outline-primary rounded-pill add-button\" *ngIf=\"!isGuide\" (click)=\"onAddOrg()\">\n {{'Add user to new organisation' | translate}}</button>\n </div>\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\n <lib-loader></lib-loader>\n </div>\n <div *ngIf=\"!hideList\">\n <ul class=\"list-group list-group-flush\" *ngIf=\"filteredOrgsUsersMissions\" data-testid=\"mission-organisation-list\">\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let o of filteredOrgsUsersMissions\">\n <div class=\"d-flex justify-content-between align-items-center font-weight-bold\"\n ngbTooltip=\"See details and users\" style=\"cursor: pointer;\" (click)=\"onToggleDetailOrg(o.org.id, o.org)\">\n {{o.org.name}} <small *ngIf=\"o.org.id == currentOrg.id\">({{'My organisation' | translate}})</small>\n <small *ngIf=\"isSP && clientsSP.includes(o.org.id)\">({{'Client of SmarterPlan' | translate}})</small>\n <small *ngIf=\"isSP && getOrderedOrg(o.org.id)\">({{'Client of ' | translate}}\n {{getOrderedOrg(o.org.id)}})</small>\n <lib-chevron [conditionShowing]=\"detailsOrg==o.org.id\" [ngClass]=\"[getStringNoSpace(o.org.name)]\"></lib-chevron>\n </div>\n <div class=\"missions\" *ngIf=\"detailsOrg==o.org.id\">\n <div class='d-flex'>\n <button data-testid=\"user-new-btn\" class=\"btn btn-outline-primary rounded-pill mt-3 mb-3\" (click)=\"onAdd(o.org)\">{{'Add user' |\n translate}}</button>\n </div>\n\n <ul class=\"list-group list-group-flush\" data-testid=\"mission-user-list\">\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let a of o.users\"\n (click)=\"onToggleDetailUser(a.user.id)\">\n <div class=\"d-flex justify-content-between align-items-center\">\n {{a.user.displayName}}\n <lib-chevron [conditionShowing]=\"detailsUser==a.user.id\" [ngClass]=\"[getStringNoSpace(a.user.displayName)]\"></lib-chevron>\n </div>\n\n <div *ngIf=\"detailsUser==a.user.id\">\n <div class=\"ml-3\">\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\n {{'Email' | translate}}: {{a.user.email }}\n </div>\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\n <button type=\"button\" class=\"btn btn-primary rounded-pill\" data-testid=\"mission-new-btn\"\n (click)=\"onAddForUser(o.org, a.user)\">{{'Add new mission' | translate}}</button>\n <button type=\"button\" class=\"btn btn-primary rounded-pill\" (click)=\"onClearToken(a)\">\n {{'Clear Token' | translate}}</button>\n <button type=\"button\" class=\"btn btn-primary rounded-pill\"\n (click)=\"onDeleteUser(a.user)\">{{'Delete user' | translate}}</button>\n </div>\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\n {{ a.missions.length > 0 ? ('Current Missions' | translate) : ('No missions' | translate)}}\n </div>\n </div>\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item\" *ngFor=\"let mis of a.missions\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.description\">\n {{'Description' | translate}}: {{mis.description}}</li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.templateMissionID\">\n {{'Attendee of tour' | translate}}: {{mis.templateMission.title}}</li>\n\n <li class=\"list-group-item bg-transparent\">{{'Role' | translate}}: {{ mis.role }}</li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.hashtags && mis.hashtags.length> 0\">\n {{'Hashtags' | translate}}: <ul class=\"keywordsDisplay no-border\">\n <div class=\"keywordsdisplayContainer\">\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of mis.hashtags\">\n {{ hashtag | hashtagFromID | async }}</li>\n </div>\n </ul>\n </li>\n <li class=\"list-group-item bg-transparent\">{{'Language' | translate }}: {{\n mis.locale ? mis.locale : ('Not applicable' | translate)}}</li>\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate }}: {{\n mis.level}}</li>\n <li class=\"list-group-item bg-transparent\">{{'Ordered by' | translate }}: {{\n mis.orderedOrganisation.name}}</li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.domains\">{{'Domains' | translate }}:\n {{mis.domains ?\n domainIdsToStringForMission(mis) : (\"No data\" | translate) }}</li>\n <li class=\"list-group-item bg-transparent\">{{'Authorized location' | translate }}:\n {{ mis.space ? mis.space.name : \"No location\" | translate}}</li>\n <li class=\"list-group-item bg-transparent\">{{'Authorized zone' | translate }}:\n {{ mis.zone ? mis.zone.name : \"All zones allowed\" | translate}}</li>\n <li class=\"list-group-item bg-transparent\">{{'Starts' | translate }}:\n {{ mis.startDateTime ? (mis.startDateTime | timeDateString: \"day_time_zone\" | async) :\n \"No data\" | translate}}, {{'Ends' | translate}}: {{ mis.endDateTime\n ? (mis.endDateTime | timeDateString: \"day_time_zone\" | async)\n : \"No data\" | translate}}\n </li>\n <li class=\"list-group-item bg-transparent\">{{'Created' | translate }}:\n {{ mis.createdAt | timeDateString: \"day_time_zone\" | async }}\n </li>\n </ul>\n <div class=\"action-button-container\" >\n <button type=\"button\" data-testid=\"edit-mission-btn\" class=\"btn btn-outline-primary rounded-pill mr-2 action-button\"\n (click)=\"onEdit(mis)\">{{'Edit' |\n translate}}</button>\n <button type=\"button\" *ngIf=\"mis.role === 'VISITOR' || mis.role === 'VISITOR_MUSEUM'\"\n class=\"btn btn-outline-primary rounded-pill mr-2 action-button share-visitor-button\"\n (click)=\"onSetForShareableLink(a.user, mis)\">{{'Generate Shareable Link' |\n translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill action-button\"\n (click)=\"onDeleteMission(mis)\">{{'Delete' | translate}}</button>\n </div>\n </li>\n </ul>\n </div>\n </li>\n </ul>\n </div>\n </li>\n <li class=\"list-group-item list-group-item-action\" *ngIf=\"profilesWithoutMission && profilesWithoutMission.length > 0\">\n <div class=\"d-flex justify-content-between align-items-center font-weight-bold\"\n ngbTooltip=\"See details\" style=\"cursor: pointer;\" (click)=\"onToggleDetailOrg('-2', null)\">\n {{\"Users without missions\" | translate}}\n <lib-chevron [conditionShowing]=\"detailsOrg=='-2'\"></lib-chevron>\n </div>\n <div class=\"missions\" *ngIf=\"detailsOrg=='-2'\">\n <ul class=\"list-group list-group-flush\" data-testid=\"mission-organisation-list\">\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let profile of profilesWithoutMission\" \n (click)=\"onToggleDetailUser(profile.id)\">\n <div class=\"d-flex justify-content-between align-items-center\">\n {{profile.displayName}}\n <lib-chevron [conditionShowing]=\"detailsUser==profile.id\" [ngClass]=\"[getStringNoSpace(profile.displayName)]\"></lib-chevron>\n </div>\n <div *ngIf=\"detailsUser==profile.id\">\n <div class=\"ml-3\">\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\n {{'Email' | translate}}: {{profile.email }}\n </div>\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\n <button type=\"button\" class=\"btn btn-primary rounded-pill\" data-testid=\"mission-new-btn\"\n (click)=\"onAddForUser(currentOrg, profile)\">{{'Add new mission' | translate}}</button>\n <button type=\"button\" class=\"btn btn-primary rounded-pill\"\n (click)=\"onDeleteUser(profile)\">{{'Delete user' | translate}}</button>\n </div>\n </div>\n </div>\n </li>\n </ul>\n </div>\n </li>\n </ul>\n </div>\n\n <div *ngIf=\"create\">\n <lib-user-mission-form [addToOrganisation]=\"addToOrg\" [currentOrg]=\"currentOrg\" [isSP]=\"isSP\"\n (added)=\"userAdded($event)\">\n </lib-user-mission-form>\n </div>\n <div *ngIf=\"edit\">\n <lib-form-mission [missionToEdit]=\"missionToEdit\" [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\"\n (addedMissionInput)=\"onMissionEdited($event)\"></lib-form-mission>\n </div>\n <div *ngIf=\"createForExistingUser\">\n <lib-form-mission [organisationForMission]=\"addToOrg\" [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\"\n [userForMissionID]=\"userForAddingMission.id\" (addedMissionInput)=\"onMissionCreated($event)\">\n </lib-form-mission>\n </div>\n <div *ngIf=\"isAddingOrg || isAddingToExistingOrg\">\n <lib-form-organisation [currentOrg]=\"currentOrg\" [currentUser]=\"me\" [existing]=\"isAddingToExistingOrg\"\n (added)=\"orgAdded($event)\"></lib-form-organisation>\n </div>\n </div>\n\n <div class=\"col-md-4 col-lg-6\" *ngIf=\"orgSelectedDetails && !isGuide\">\n <lib-detail-organisation [org]=\"orgSelectedDetails\" [currentOrg]=\"currentOrg\" [isSP]=\"isSP\"\n (orgChanged)='orgAdded($event)'></lib-detail-organisation>\n </div>\n </div>\n</div>", styles: [".add-button{width:-moz-fit-content;width:fit-content;margin-left:.5rem}li.ml-4{margin-left:3rem}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}.action-button-container .share-visitor-button{width:-moz-fit-content;width:fit-content}\n"], components: [{ type: i1.LoaderComponent, selector: "lib-loader", inputs: ["useLogo", "color"] }, { type: i4.ChevronComponent, selector: "lib-chevron", inputs: ["conditionShowing"] }, { type: i5.UserMissionFormComponent, selector: "lib-user-mission-form", inputs: ["addToOrganisation", "isSP", "createForExistingUser", "currentOrg"], outputs: ["added"] }, { type: i6.FormMissionComponent, selector: "lib-form-mission", inputs: ["missionToEdit", "organisationForMission", "isSP", "userForMissionID", "currentUserOrganisation"], outputs: ["addedMissionInput"] }, { type: i7.FormOrganisationComponent, selector: "lib-form-organisation", inputs: ["currentOrg", "currentUser", "existing"], outputs: ["added"] }, { type: i8.DetailOrganisationComponent, selector: "lib-detail-organisation", inputs: ["org", "currentOrg", "isSP"], outputs: ["orgChanged"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], pipes: { "translate": i3.TranslatePipe, "async": i9.AsyncPipe, "hashtagFromID": i1.HashtagFromIdPipe, "timeDateString": i1.TimeDateToLocalStringPipe } });
332
332
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: UserComponent, decorators: [{
333
333
  type: Component,
334
- args: [{ selector: 'lib-user', template: "<div class=\"dashboard-tab\">\r\n <div class=\"header-dashboard-tab\">\r\n <h3>{{'Users' | translate}}</h3>\r\n <!-- <app-search-bar *ngIf=\"!hideList\" [searchable]=\"orgsUsersMissions\" objectType=\"USER\"\r\n (searchEvent)=\"applyResultsSearchBar($event)\">\r\n </app-search-bar> -->\r\n <hr>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-8 col-lg-6\">\r\n <div class=\"row ml-0 mb-2\" *ngIf=\"!hideList\">\r\n <button class=\"btn btn-outline-primary rounded-pill add-button\" *ngIf=\"!isGuide\" (click)=\"onAddOrg()\">\r\n {{'Add user to new organisation' | translate}}</button>\r\n </div>\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\r\n <lib-loader></lib-loader>\r\n </div>\r\n <div *ngIf=\"!hideList\">\r\n <ul class=\"list-group list-group-flush\" *ngIf=\"filteredOrgsUsersMissions\" data-testid=\"mission-organisation-list\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let o of filteredOrgsUsersMissions\">\r\n <div class=\"d-flex justify-content-between align-items-center font-weight-bold\"\r\n ngbTooltip=\"See details and users\" style=\"cursor: pointer;\" (click)=\"onToggleDetailOrg(o.org.id, o.org)\">\r\n {{o.org.name}} <small *ngIf=\"o.org.id == currentOrg.id\">({{'My organisation' | translate}})</small>\r\n <small *ngIf=\"isSP && clientsSP.includes(o.org.id)\">({{'Client of SmarterPlan' | translate}})</small>\r\n <small *ngIf=\"isSP && getOrderedOrg(o.org.id)\">({{'Client of ' | translate}}\r\n {{getOrderedOrg(o.org.id)}})</small>\r\n <lib-chevron [conditionShowing]=\"detailsOrg==o.org.id\" [ngClass]=\"[getStringNoSpace(o.org.name)]\"></lib-chevron>\r\n </div>\r\n <div class=\"missions\" *ngIf=\"detailsOrg==o.org.id\">\r\n <div class='d-flex'>\r\n <button data-testid=\"user-new-btn\" class=\"btn btn-outline-primary rounded-pill mt-3 mb-3\" (click)=\"onAdd(o.org)\">{{'Add user' |\r\n translate}}</button>\r\n </div>\r\n\r\n <ul class=\"list-group list-group-flush\" data-testid=\"mission-user-list\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let a of o.users\"\r\n (click)=\"onToggleDetailUser(a.user.id)\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n {{a.user.displayName}}\r\n <lib-chevron [conditionShowing]=\"detailsUser==a.user.id\" [ngClass]=\"[getStringNoSpace(a.user.displayName)]\"></lib-chevron>\r\n </div>\r\n\r\n <div *ngIf=\"detailsUser==a.user.id\">\r\n <div class=\"ml-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n {{'Email' | translate}}: {{a.user.email }}\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\" data-testid=\"mission-new-btn\"\r\n (click)=\"onAddForUser(o.org, a.user)\">{{'Add new mission' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\" (click)=\"onClearToken(a)\">\r\n {{'Clear Token' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\"\r\n (click)=\"onDeleteUser(a.user)\">{{'Delete user' | translate}}</button>\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n {{ a.missions.length > 0 ? ('Current Missions' | translate) : ('No missions' | translate)}}\r\n </div>\r\n </div>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item\" *ngFor=\"let mis of a.missions\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.description\">\r\n {{'Description' | translate}}: {{mis.description}}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.templateMissionID\">\r\n {{'Attendee of tour' | translate}}: {{mis.templateMission.title}}</li>\r\n\r\n <li class=\"list-group-item bg-transparent\">{{'Role' | translate}}: {{ mis.role }}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.hashtags && mis.hashtags.length> 0\">\r\n {{'Hashtags' | translate}}: <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\">\r\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of mis.hashtags\">\r\n {{ hashtag | hashtagFromID | async }}</li>\r\n </div>\r\n </ul>\r\n </li>\r\n <li class=\"list-group-item bg-transparent\">{{'Language' | translate }}: {{\r\n mis.locale ? mis.locale : ('Not applicable' | translate)}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate }}: {{\r\n mis.level}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Ordered by' | translate }}: {{\r\n mis.orderedOrganisation.name}}</li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.domains\">{{'Domains' | translate }}:\r\n {{mis.domains ?\r\n domainIdsToStringForMission(mis) : (\"No data\" | translate) }}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Authorized location' | translate }}:\r\n {{ mis.space ? mis.space.name : \"No location\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Authorized zone' | translate }}:\r\n {{ mis.zone ? mis.zone.name : \"All zones allowed\" | translate}}</li>\r\n <li class=\"list-group-item bg-transparent\">{{'Starts' | translate }}:\r\n {{ mis.startDateTime ? (mis.startDateTime | timeDateString: \"day_time_zone\" | async) :\r\n \"No data\" | translate}}, {{'Ends' | translate}}: {{ mis.endDateTime\r\n ? (mis.endDateTime | timeDateString: \"day_time_zone\" | async)\r\n : \"No data\" | translate}}.\r\n </li>\r\n </ul>\r\n <div class=\"action-button-container\" >\r\n <button type=\"button\" data-testid=\"edit-mission-btn\" class=\"btn btn-outline-primary rounded-pill mr-2 action-button\"\r\n (click)=\"onEdit(mis)\">{{'Edit' |\r\n translate}}</button>\r\n <button type=\"button\" *ngIf=\"mis.role === 'VISITOR' || mis.role === 'VISITOR_MUSEUM'\"\r\n class=\"btn btn-outline-primary rounded-pill mr-2 action-button share-visitor-button\"\r\n (click)=\"onSetForShareableLink(a.user, mis)\">{{'Generate Shareable Link' |\r\n translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill action-button\"\r\n (click)=\"onDeleteMission(mis)\">{{'Delete' | translate}}</button>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n <li class=\"list-group-item list-group-item-action\" *ngIf=\"profilesWithoutMission && profilesWithoutMission.length > 0\">\r\n <div class=\"d-flex justify-content-between align-items-center font-weight-bold\"\r\n ngbTooltip=\"See details\" style=\"cursor: pointer;\" (click)=\"onToggleDetailOrg('-2', null)\">\r\n {{\"Users without missions\" | translate}}\r\n <lib-chevron [conditionShowing]=\"detailsOrg=='-2'\"></lib-chevron>\r\n </div>\r\n <div class=\"missions\" *ngIf=\"detailsOrg=='-2'\">\r\n <ul class=\"list-group list-group-flush\" data-testid=\"mission-organisation-list\">\r\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let profile of profilesWithoutMission\" \r\n (click)=\"onToggleDetailUser(profile.id)\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n {{profile.displayName}}\r\n <lib-chevron [conditionShowing]=\"detailsUser==profile.id\" [ngClass]=\"[getStringNoSpace(profile.displayName)]\"></lib-chevron>\r\n </div>\r\n <div *ngIf=\"detailsUser==profile.id\">\r\n <div class=\"ml-3\">\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n {{'Email' | translate}}: {{profile.email }}\r\n </div>\r\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\" data-testid=\"mission-new-btn\"\r\n (click)=\"onAddForUser(currentOrg, profile)\">{{'Add new mission' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-primary rounded-pill\"\r\n (click)=\"onDeleteUser(profile)\">{{'Delete user' | translate}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n\r\n <div *ngIf=\"create\">\r\n <lib-user-mission-form [addToOrganisation]=\"addToOrg\" [currentOrg]=\"currentOrg\" [isSP]=\"isSP\"\r\n (added)=\"userAdded($event)\">\r\n </lib-user-mission-form>\r\n </div>\r\n <div *ngIf=\"edit\">\r\n <lib-form-mission [missionToEdit]=\"missionToEdit\" [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\"\r\n (addedMissionInput)=\"onMissionEdited($event)\"></lib-form-mission>\r\n </div>\r\n <div *ngIf=\"createForExistingUser\">\r\n <lib-form-mission [organisationForMission]=\"addToOrg\" [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\"\r\n [userForMissionID]=\"userForAddingMission.id\" (addedMissionInput)=\"onMissionCreated($event)\">\r\n </lib-form-mission>\r\n </div>\r\n <div *ngIf=\"isAddingOrg || isAddingToExistingOrg\">\r\n <lib-form-organisation [currentOrg]=\"currentOrg\" [currentUser]=\"me\" [existing]=\"isAddingToExistingOrg\"\r\n (added)=\"orgAdded($event)\"></lib-form-organisation>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-4 col-lg-6\" *ngIf=\"orgSelectedDetails && !isGuide\">\r\n <lib-detail-organisation [org]=\"orgSelectedDetails\" [currentOrg]=\"currentOrg\" [isSP]=\"isSP\"\r\n (orgChanged)='orgAdded($event)'></lib-detail-organisation>\r\n </div>\r\n </div>\r\n</div>", styles: [".add-button{width:-moz-fit-content;width:fit-content;margin-left:.5rem}li.ml-4{margin-left:3rem}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}.action-button-container .share-visitor-button{width:-moz-fit-content;width:fit-content}\n"] }]
334
+ args: [{ selector: 'lib-user', template: "<div class=\"dashboard-tab\">\n <div class=\"header-dashboard-tab\">\n <h3>{{'Users' | translate}}</h3>\n <!-- <app-search-bar *ngIf=\"!hideList\" [searchable]=\"orgsUsersMissions\" objectType=\"USER\"\n (searchEvent)=\"applyResultsSearchBar($event)\">\n </app-search-bar> -->\n <hr>\n </div>\n <div class=\"row\">\n <div class=\"col-md-8 col-lg-6\">\n <div class=\"row ml-0 mb-2\" *ngIf=\"!hideList\">\n <button class=\"btn btn-outline-primary rounded-pill add-button\" *ngIf=\"!isGuide\" (click)=\"onAddOrg()\">\n {{'Add user to new organisation' | translate}}</button>\n </div>\n <div class=\"d-flex justify-content-center\" *ngIf=\"loading\">\n <lib-loader></lib-loader>\n </div>\n <div *ngIf=\"!hideList\">\n <ul class=\"list-group list-group-flush\" *ngIf=\"filteredOrgsUsersMissions\" data-testid=\"mission-organisation-list\">\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let o of filteredOrgsUsersMissions\">\n <div class=\"d-flex justify-content-between align-items-center font-weight-bold\"\n ngbTooltip=\"See details and users\" style=\"cursor: pointer;\" (click)=\"onToggleDetailOrg(o.org.id, o.org)\">\n {{o.org.name}} <small *ngIf=\"o.org.id == currentOrg.id\">({{'My organisation' | translate}})</small>\n <small *ngIf=\"isSP && clientsSP.includes(o.org.id)\">({{'Client of SmarterPlan' | translate}})</small>\n <small *ngIf=\"isSP && getOrderedOrg(o.org.id)\">({{'Client of ' | translate}}\n {{getOrderedOrg(o.org.id)}})</small>\n <lib-chevron [conditionShowing]=\"detailsOrg==o.org.id\" [ngClass]=\"[getStringNoSpace(o.org.name)]\"></lib-chevron>\n </div>\n <div class=\"missions\" *ngIf=\"detailsOrg==o.org.id\">\n <div class='d-flex'>\n <button data-testid=\"user-new-btn\" class=\"btn btn-outline-primary rounded-pill mt-3 mb-3\" (click)=\"onAdd(o.org)\">{{'Add user' |\n translate}}</button>\n </div>\n\n <ul class=\"list-group list-group-flush\" data-testid=\"mission-user-list\">\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let a of o.users\"\n (click)=\"onToggleDetailUser(a.user.id)\">\n <div class=\"d-flex justify-content-between align-items-center\">\n {{a.user.displayName}}\n <lib-chevron [conditionShowing]=\"detailsUser==a.user.id\" [ngClass]=\"[getStringNoSpace(a.user.displayName)]\"></lib-chevron>\n </div>\n\n <div *ngIf=\"detailsUser==a.user.id\">\n <div class=\"ml-3\">\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\n {{'Email' | translate}}: {{a.user.email }}\n </div>\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\n <button type=\"button\" class=\"btn btn-primary rounded-pill\" data-testid=\"mission-new-btn\"\n (click)=\"onAddForUser(o.org, a.user)\">{{'Add new mission' | translate}}</button>\n <button type=\"button\" class=\"btn btn-primary rounded-pill\" (click)=\"onClearToken(a)\">\n {{'Clear Token' | translate}}</button>\n <button type=\"button\" class=\"btn btn-primary rounded-pill\"\n (click)=\"onDeleteUser(a.user)\">{{'Delete user' | translate}}</button>\n </div>\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\n {{ a.missions.length > 0 ? ('Current Missions' | translate) : ('No missions' | translate)}}\n </div>\n </div>\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item\" *ngFor=\"let mis of a.missions\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.description\">\n {{'Description' | translate}}: {{mis.description}}</li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.templateMissionID\">\n {{'Attendee of tour' | translate}}: {{mis.templateMission.title}}</li>\n\n <li class=\"list-group-item bg-transparent\">{{'Role' | translate}}: {{ mis.role }}</li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.hashtags && mis.hashtags.length> 0\">\n {{'Hashtags' | translate}}: <ul class=\"keywordsDisplay no-border\">\n <div class=\"keywordsdisplayContainer\">\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of mis.hashtags\">\n {{ hashtag | hashtagFromID | async }}</li>\n </div>\n </ul>\n </li>\n <li class=\"list-group-item bg-transparent\">{{'Language' | translate }}: {{\n mis.locale ? mis.locale : ('Not applicable' | translate)}}</li>\n <li class=\"list-group-item bg-transparent\">{{'Access level' | translate }}: {{\n mis.level}}</li>\n <li class=\"list-group-item bg-transparent\">{{'Ordered by' | translate }}: {{\n mis.orderedOrganisation.name}}</li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"mis.domains\">{{'Domains' | translate }}:\n {{mis.domains ?\n domainIdsToStringForMission(mis) : (\"No data\" | translate) }}</li>\n <li class=\"list-group-item bg-transparent\">{{'Authorized location' | translate }}:\n {{ mis.space ? mis.space.name : \"No location\" | translate}}</li>\n <li class=\"list-group-item bg-transparent\">{{'Authorized zone' | translate }}:\n {{ mis.zone ? mis.zone.name : \"All zones allowed\" | translate}}</li>\n <li class=\"list-group-item bg-transparent\">{{'Starts' | translate }}:\n {{ mis.startDateTime ? (mis.startDateTime | timeDateString: \"day_time_zone\" | async) :\n \"No data\" | translate}}, {{'Ends' | translate}}: {{ mis.endDateTime\n ? (mis.endDateTime | timeDateString: \"day_time_zone\" | async)\n : \"No data\" | translate}}\n </li>\n <li class=\"list-group-item bg-transparent\">{{'Created' | translate }}:\n {{ mis.createdAt | timeDateString: \"day_time_zone\" | async }}\n </li>\n </ul>\n <div class=\"action-button-container\" >\n <button type=\"button\" data-testid=\"edit-mission-btn\" class=\"btn btn-outline-primary rounded-pill mr-2 action-button\"\n (click)=\"onEdit(mis)\">{{'Edit' |\n translate}}</button>\n <button type=\"button\" *ngIf=\"mis.role === 'VISITOR' || mis.role === 'VISITOR_MUSEUM'\"\n class=\"btn btn-outline-primary rounded-pill mr-2 action-button share-visitor-button\"\n (click)=\"onSetForShareableLink(a.user, mis)\">{{'Generate Shareable Link' |\n translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill action-button\"\n (click)=\"onDeleteMission(mis)\">{{'Delete' | translate}}</button>\n </div>\n </li>\n </ul>\n </div>\n </li>\n </ul>\n </div>\n </li>\n <li class=\"list-group-item list-group-item-action\" *ngIf=\"profilesWithoutMission && profilesWithoutMission.length > 0\">\n <div class=\"d-flex justify-content-between align-items-center font-weight-bold\"\n ngbTooltip=\"See details\" style=\"cursor: pointer;\" (click)=\"onToggleDetailOrg('-2', null)\">\n {{\"Users without missions\" | translate}}\n <lib-chevron [conditionShowing]=\"detailsOrg=='-2'\"></lib-chevron>\n </div>\n <div class=\"missions\" *ngIf=\"detailsOrg=='-2'\">\n <ul class=\"list-group list-group-flush\" data-testid=\"mission-organisation-list\">\n <li class=\"list-group-item list-group-item-action\" *ngFor=\"let profile of profilesWithoutMission\" \n (click)=\"onToggleDetailUser(profile.id)\">\n <div class=\"d-flex justify-content-between align-items-center\">\n {{profile.displayName}}\n <lib-chevron [conditionShowing]=\"detailsUser==profile.id\" [ngClass]=\"[getStringNoSpace(profile.displayName)]\"></lib-chevron>\n </div>\n <div *ngIf=\"detailsUser==profile.id\">\n <div class=\"ml-3\">\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\n {{'Email' | translate}}: {{profile.email }}\n </div>\n <div class=\"d-flex justify-content-between align-items-center mt-3\">\n <button type=\"button\" class=\"btn btn-primary rounded-pill\" data-testid=\"mission-new-btn\"\n (click)=\"onAddForUser(currentOrg, profile)\">{{'Add new mission' | translate}}</button>\n <button type=\"button\" class=\"btn btn-primary rounded-pill\"\n (click)=\"onDeleteUser(profile)\">{{'Delete user' | translate}}</button>\n </div>\n </div>\n </div>\n </li>\n </ul>\n </div>\n </li>\n </ul>\n </div>\n\n <div *ngIf=\"create\">\n <lib-user-mission-form [addToOrganisation]=\"addToOrg\" [currentOrg]=\"currentOrg\" [isSP]=\"isSP\"\n (added)=\"userAdded($event)\">\n </lib-user-mission-form>\n </div>\n <div *ngIf=\"edit\">\n <lib-form-mission [missionToEdit]=\"missionToEdit\" [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\"\n (addedMissionInput)=\"onMissionEdited($event)\"></lib-form-mission>\n </div>\n <div *ngIf=\"createForExistingUser\">\n <lib-form-mission [organisationForMission]=\"addToOrg\" [currentUserOrganisation]=\"currentOrg\" [isSP]=\"isSP\"\n [userForMissionID]=\"userForAddingMission.id\" (addedMissionInput)=\"onMissionCreated($event)\">\n </lib-form-mission>\n </div>\n <div *ngIf=\"isAddingOrg || isAddingToExistingOrg\">\n <lib-form-organisation [currentOrg]=\"currentOrg\" [currentUser]=\"me\" [existing]=\"isAddingToExistingOrg\"\n (added)=\"orgAdded($event)\"></lib-form-organisation>\n </div>\n </div>\n\n <div class=\"col-md-4 col-lg-6\" *ngIf=\"orgSelectedDetails && !isGuide\">\n <lib-detail-organisation [org]=\"orgSelectedDetails\" [currentOrg]=\"currentOrg\" [isSP]=\"isSP\"\n (orgChanged)='orgAdded($event)'></lib-detail-organisation>\n </div>\n </div>\n</div>", styles: [".add-button{width:-moz-fit-content;width:fit-content;margin-left:.5rem}li.ml-4{margin-left:3rem}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}.action-button-container .share-visitor-button{width:-moz-fit-content;width:fit-content}\n"] }]
335
335
  }], ctorParameters: function () { return [{ type: i1.BaseUserService }, { type: i1.MissionService }, { type: i1.DomainService }, { type: i1.OrganisationService }, { type: i2.NgbModal }, { type: i3.TranslateService }, { type: i1.ProfileService }]; } });
336
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi91c2VyL3VzZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWFkbWluL3NyYy9saWIvdXNlci91c2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFbEQsT0FBTyxFQUlILFVBQVUsRUFDVixxQkFBcUIsRUFNckIsYUFBYSxFQUViLFNBQVMsR0FDWixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7Ozs7Ozs7O0FBUXhFLE1BQU0sT0FBTyxhQUFhO0lBbUV0QixZQUNZLFdBQTRCLEVBQzVCLGNBQThCLEVBQzlCLGFBQTRCLEVBQzVCLG1CQUF3QyxFQUN4QyxZQUFzQixFQUN0QixTQUEyQixFQUMzQixjQUE4QjtRQU45QixnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUFDNUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsaUJBQVksR0FBWixZQUFZLENBQVU7UUFDdEIsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFDM0IsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBdkUxQyxnQkFBVyxHQUFHLElBQUksQ0FBQztRQUVuQixlQUFVLEdBQUcsSUFBSSxDQUFDO1FBRWxCLFVBQUssR0FBRyxFQUFFLENBQUM7UUFFWCxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBRWYsU0FBSSxHQUFHLEtBQUssQ0FB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NktNOzJGRG5KTyxhQUFhO2tCQUx6QixTQUFTOytCQUNJLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgICBCYXNlVXNlclNlcnZpY2UsXHJcbiAgICBEb21haW4sXHJcbiAgICBEb21haW5TZXJ2aWNlLFxyXG4gICAgRG9tYWluVHlwZSxcclxuICAgIGZpbHRlclVuaXF1ZUFycmF5QnlJRCxcclxuICAgIE1pc3Npb24sXHJcbiAgICBNaXNzaW9uU2VydmljZSxcclxuICAgIE9yZ2FuaXNhdGlvbixcclxuICAgIE9yZ2FuaXNhdGlvblNlcnZpY2UsXHJcbiAgICBQcm9maWxlLFxyXG4gICAgUHJvZmlsZUVudGl0eSxcclxuICAgIFByb2ZpbGVTZXJ2aWNlLFxyXG4gICAgd2FpdFVudGlsLFxyXG59IGZyb20gJ0BzbWFydGVycGxhbi9uZ3gtc21hcnRlcnBsYW4tY29yZSc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgR3Vlc3RMaW5rQ29tcG9uZW50IH0gZnJvbSAnLi4vZ3Vlc3QtbGluay9ndWVzdC1saW5rLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2xpYi11c2VyJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi91c2VyLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL3VzZXIuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFVzZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gICAgdXNlcnM6IEFycmF5PE1pc3Npb24gJiB7IG5hbWU6IHN0cmluZzsgfT47XHJcblxyXG4gICAgZGV0YWlsc1VzZXIgPSAnLTEnO1xyXG5cclxuICAgIGRldGFpbHNPcmcgPSAnLTEnO1xyXG5cclxuICAgIHF1ZXJ5ID0gJyc7XHJcblxyXG4gICAgY3JlYXRlID0gZmFsc2U7XHJcblxyXG4gICAgZWRpdCA9IGZhbHNlO1xyXG5cclxuICAgIHdvcmtpbmcgPSBmYWxzZTtcclxuXHJcbiAgICBjcmVhdGVGb3JFeGlzdGluZ1VzZXIgPSBmYWxzZTtcclxuXHJcbiAgICBpc0FkZGluZ09yZyA9IGZhbHNlO1xyXG5cclxuICAgIGlzQWRkaW5nVG9FeGlzdGluZ09yZyA9IGZhbHNlO1xyXG5cclxuICAgIHVzZXJGb3JBZGRpbmdNaXNzaW9uOiBQcm9maWxlRW50aXR5O1xyXG5cclxuICAgIGN1cnJlbnRPcmc6IE9yZ2FuaXNhdGlvbjtcclxuXHJcbiAgICBtZTogUHJvZmlsZUVudGl0eTtcclxuXHJcbiAgICBoaWRlTGlzdCA9IGZhbHNlO1xyXG5cclxuICAgIG9yZ3NVc2Vyc01pc3Npb25zOiBBcnJheTx7XHJcbiAgICAgICAgb3JnOiBPcmdhbmlzYXRpb247XHJcbiAgICAgICAgdXNlcnM6IEFycmF5PHtcclxuICAgICAgICAgICAgbWlzc2lvbnM6IE1pc3Npb25bXTtcclxuICAgICAgICAgICAgdXNlcjogUHJvZmlsZUVudGl0eTtcclxuICAgICAgICB9PjtcclxuICAgIH0+ID0gW107XHJcblxyXG4gICAgbWlzc2lvblRvRWRpdDogTWlzc2lvbjtcclxuXHJcbiAgICBpc1NQID0gZmFsc2U7XHJcblxyXG4gICAgaXNHdWlkZSA9IGZhbHNlO1xyXG5cclxuICAgIGNsaWVudHNTUDogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgICBwcmVzdGF0YWlyZUNsaWVudHM6IEFycmF5PHsgb3JnT3duZXI6IHN0cmluZzsgcHJlc3RhdGFpcmU6IHN0cmluZzsgfT4gPSBbXTtcclxuXHJcbiAgICBkb21haW5zOiBEb21haW5bXTtcclxuXHJcbiAgICBhZGRUb09yZzogT3JnYW5pc2F0aW9uO1xyXG5cclxuICAgIG9yZ1NlbGVjdGVkRGV0YWlsczogT3JnYW5pc2F0aW9uO1xyXG5cclxuICAgIGZpbHRlcmVkT3Jnc1VzZXJzTWlzc2lvbnM6IEFycmF5PHtcclxuICAgICAgICBvcmc6IE9yZ2FuaXNhdGlvbjtcclxuICAgICAgICB1c2VyczogQXJyYXk8e1xyXG4gICAgICAgICAgICBtaXNzaW9uczogTWlzc2lvbltdO1xyXG4gICAgICAgICAgICB1c2VyOiBQcm9maWxlRW50aXR5O1xyXG4gICAgICAgIH0+O1xyXG4gICAgfT47XHJcblxyXG4gICAgbG9hZGluZyA9IGZhbHNlO1xyXG5cclxuICAgIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICAgIHByb2ZpbGVzV2l0aG91dE1pc3Npb246IFByb2ZpbGVFbnRpdHlbXSA9IFtdO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IEJhc2VVc2VyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIG1pc3Npb25TZXJ2aWNlOiBNaXNzaW9uU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGRvbWFpblNlcnZpY2U6IERvbWFpblNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBvcmdhbmlzYXRpb25TZXJ2aWNlOiBPcmdhbmlzYXRpb25TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBOZ2JNb2RhbCxcclxuICAgICAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHByb2ZpbGVTZXJ2aWNlOiBQcm9maWxlU2VydmljZSxcclxuICAgICkgeyB9XHJcblxyXG4gICAgLy8gQHRvZG8gbGlzdCBteSBvcmcgYW5kIHN1YiBvcmdzXHJcblxyXG5cclxuXHJcbiAgICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgICAgICB0aGlzLmluaXRJbmZvKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xyXG4gICAgICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIHJlc2V0TGlzdCBmZXRjaGVzIGEgZnJlc2ggdXNlciBsaXN0IGZyb20gc2VydmVyXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHJlc2V0TGlzdCgpIHtcclxuICAgICAgICB0aGlzLm9yZ3NVc2Vyc01pc3Npb25zID0gW107XHJcbiAgICAgICAgbGV0IGFsbE1pc3Npb25zID0gW107XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgICBpZiAodGhpcy5pc1NQKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3Jnc1VzZXJzTWlzc2lvbnMgPSBhd2FpdCB0aGlzLmluaXRMaXN0Rm9yU1AoKTtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZE9yZ3NVc2Vyc01pc3Npb25zID0gdGhpcy5vcmdzVXNlcnNNaXNzaW9ucztcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmlzR3VpZGUpIHtcclxuICAgICAgICAgICAgLy8gZ3VpZGUgc2VlcyBvbmx5IGl0cyBvd24gb3JnYW5pc2F0aW9uXHJcbiAgICAgICAgICAgIGFsbE1pc3Npb25zID1cclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWlzc2lvblNlcnZpY2UuZ2V0TWlzc2lvbnNCeU9yZ2FuaXNhdGlvbih0aGlzLmN1cnJlbnRPcmcuaWQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGFsbE1pc3Npb25zID0gYXdhaXQgdGhpcy5taXNzaW9uU2VydmljZS5nZXRNaXNzaW9uc0J5T3JkZXJlZE9yZ2FuaXNhdGlvbihcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE9yZy5pZFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50T3JnTWlzc2lvbnMgPVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5taXNzaW9uU2VydmljZS5nZXRNaXNzaW9uc0J5T3JnYW5pc2F0aW9uKHRoaXMuY3VycmVudE9yZy5pZCk7XHJcbiAgICAgICAgICAgIGFsbE1pc3Npb25zID0gWy4uLmFsbE1pc3Npb25zLCAuLi5jdXJyZW50T3JnTWlzc2lvbnNdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYWxsTWlzc2lvbnMgPSBhbGxNaXNzaW9ucy5maWx0ZXIoKG1pc3Npb24pID0+IG1pc3Npb24udXNlciAmJiAhbWlzc2lvbi51c2VyLmRlbGV0ZWRBdCk7XHJcbiAgICAgICAgYWxsTWlzc2lvbnMgPSBmaWx0ZXJVbmlxdWVBcnJheUJ5SUQoYWxsTWlzc2lvbnMpO1xyXG5cclxuICAgICAgICBpZiAoYWxsTWlzc2lvbnMpIHtcclxuICAgICAgICAgICAgY29uc3Qgb3JncyA9IGFsbE1pc3Npb25zLm1hcCgobWlzKSA9PiBtaXMub3JnYW5pc2F0aW9uKTtcclxuICAgICAgICAgICAgY29uc3QgcHJvZmlsZXMgPSBhbGxNaXNzaW9ucy5tYXAoKG1pcykgPT4gbWlzLnVzZXIpO1xyXG4gICAgICAgICAgICBjb25zdCB1bmlxdWVPcmcgPSBmaWx0ZXJVbmlxdWVBcnJheUJ5SUQob3Jncyk7XHJcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZVVzZXJzID0gZmlsdGVyVW5pcXVlQXJyYXlCeUlEKHByb2ZpbGVzKTtcclxuICAgICAgICAgICAgdW5pcXVlT3JnLm1hcCgob3JnKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcmdNaXNzaW9ucyA9IGFsbE1pc3Npb25zLmZpbHRlcigobWlzKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1pcy5vcmdhbmlzYXRpb25JRCA9PT0gb3JnLmlkO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICBsZXQgdXNlcnMgPSB0aGlzLmdldFVzZXJzRm9yT3JnTWlzc2lvbnModW5pcXVlVXNlcnMsIG9yZ01pc3Npb25zKTtcclxuICAgICAgICAgICAgICAgIHVzZXJzID0gdXNlcnMuc29ydCgodXNlcikgPT4gKHVzZXIudXNlci5lbWFpbCA/IDAgOiAtMSkpO1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0ID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIG9yZyxcclxuICAgICAgICAgICAgICAgICAgICB1c2VycyxcclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9yZ3NVc2Vyc01pc3Npb25zLnB1c2gob2JqZWN0KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRPcmdzVXNlcnNNaXNzaW9ucyA9IHRoaXMub3Jnc1VzZXJzTWlzc2lvbnM7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5pdEluZm8oKSB7XHJcbiAgICAgICAgYXdhaXQgd2FpdFVudGlsKCgpID0+IHRoaXMudXNlclNlcnZpY2UuY3UgIT09IHVuZGVmaW5lZCk7XHJcbiAgICAgICAgdGhpcy5tZSA9IHRoaXMudXNlclNlcnZpY2UuY3U7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50T3JnID0gdGhpcy51c2VyU2VydmljZS5jdXJyZW50T3JnYW5pc2F0aW9uKCk7XHJcbiAgICAgICAgdGhpcy5pc1NQID0gdGhpcy51c2VyU2VydmljZS5pc1NQQWRtaW4oKTtcclxuICAgICAgICB0aGlzLmlzR3VpZGUgPSB0aGlzLnVzZXJTZXJ2aWNlLmlzR3VpZGUoKTtcclxuICAgICAgICB0aGlzLnJlc2V0TGlzdCgpO1xyXG4gICAgICAgIHRoaXMuc2V0RG9tYWlucygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGluaXRMaXN0Rm9yU1AoKTogUHJvbWlzZTxhbnlbXT4ge1xyXG4gICAgICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcclxuICAgICAgICBsZXQgYWxsTWlzc2lvbnMgPSBbXTtcclxuICAgICAgICBsZXQgYWxsT3JncyA9IFtdO1xyXG4gICAgICAgIGFsbE9yZ3MgPSBhd2FpdCB0aGlzLm9yZ2FuaXNhdGlvblNlcnZpY2UubGlzdE9yZ2FuaXNhdGlvbnMoKTtcclxuICAgICAgICBhbGxPcmdzID0gYWxsT3Jncy5maWx0ZXIoKG8pID0+ICFvLmRlbGV0ZWRBdCk7XHJcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAgICAgIGFsbE9yZ3MubWFwKGFzeW5jIChvcmcpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1pc3Npb25zID0gYXdhaXQgdGhpcy5taXNzaW9uU2VydmljZS5nZXRNaXNzaW9uc0J5T3JnYW5pc2F0aW9uKFxyXG4gICAgICAgICAgICAgICAgICAgIG9yZy5pZFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGFsbE1pc3Npb25zID0gWy4uLmFsbE1pc3Npb25zLCAuLi5taXNzaW9uc107XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3QgcHJvZmlsZXMgPSBhbGxNaXNzaW9uc1xyXG4gICAgICAgICAgICAubWFwKChtaXMpID0+IG1pcy51c2VyKVxyXG4gICAgICAgICAgICAuZmlsdGVyKCh1c2VyKSA9PiAhdXNlci5kZWxldGVkQXQpO1xyXG4gICAgICAgIGNvbnN0IHVuaXF1ZVVzZXJzID0gZmlsdGVyVW5pcXVlQXJyYXlCeUlEKFxyXG4gICAgICAgICAgICBwcm9maWxlcy5maWx0ZXIoKHByb2ZpbGUpID0+IHByb2ZpbGUgIT09IG51bGwpXHJcbiAgICAgICAgKTtcclxuICAgICAgICBhbGxPcmdzLm1hcCgob3JnKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IG9yZ01pc3Npb25zID0gYWxsTWlzc2lvbnMuZmlsdGVyKChtaXMpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBtaXMub3JnYW5pc2F0aW9uSUQgPT09IG9yZy5pZDtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAob3JnTWlzc2lvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIG9yZ01pc3Npb25zLmZpbHRlcihcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG0pID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLm9yZGVyZWRPcmdhbmlzYXRpb25JRCA9PT0gJzZlMjgyMDFmLTQ2NzktNGMyOS05ZDJkLThhMzI1ZjU3Y2VlOSdcclxuICAgICAgICAgICAgICAgICAgICApLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xpZW50c1NQLnB1c2gob3JnLmlkKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmVzdGF0YWlyZUNsaWVudHMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9yZ093bmVyOiBvcmdNaXNzaW9uc1swXS5vcmRlcmVkT3JnYW5pc2F0aW9uSUQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXN0YXRhaXJlOiBvcmcuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgdXNlcnMgPSB0aGlzLmdldFVzZXJzRm9yT3JnTWlzc2lvbnModW5pcXVlVXNlcnMsIG9yZ01pc3Npb25zKTtcclxuICAgICAgICAgICAgY29uc3Qgb2JqZWN0ID0ge1xyXG4gICAgICAgICAgICAgICAgb3JnLFxyXG4gICAgICAgICAgICAgICAgdXNlcnMsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChvYmplY3QpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBnZXQgcHJvZmlsZXMgd2l0aG91dCBNaXNzaW9uc1xyXG4gICAgICAgIGxldCBwcm9maWxlc1dpdGhvdXRNaXNzaW9uID0gYXdhaXQgdGhpcy5wcm9maWxlU2VydmljZS5saXN0Q3VycmVudFByb2ZpbGVzKCk7XHJcbiAgICAgICAgcHJvZmlsZXNXaXRob3V0TWlzc2lvbiA9IHByb2ZpbGVzV2l0aG91dE1pc3Npb24uZmlsdGVyKChwcm9maWxlKSA9PiAhdW5pcXVlVXNlcnMubWFwKChwKSA9PiBwLmlkKS5pbmNsdWRlcyhwcm9maWxlLmlkKSk7XHJcbiAgICAgICAgaWYgKHByb2ZpbGVzV2l0aG91dE1pc3Npb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnByb2ZpbGVzV2l0aG91dE1pc3Npb24gPSBbXTtcclxuICAgICAgICAgICAgcHJvZmlsZXNXaXRob3V0TWlzc2lvbi5mb3JFYWNoKChwcm9maWxlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VyID0gbmV3IFByb2ZpbGVFbnRpdHkocHJvZmlsZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2ZpbGVzV2l0aG91dE1pc3Npb24ucHVzaCh1c2VyKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0cztcclxuICAgIH1cclxuXHJcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xyXG4gICAgZ2V0VXNlcnNGb3JPcmdNaXNzaW9ucyhcclxuICAgICAgICB1bmlxdWVVc2VyczogUHJvZmlsZVtdLFxyXG4gICAgICAgIG9yZ01pc3Npb25zOiBNaXNzaW9uW11cclxuICAgICk6IEFycmF5PHtcclxuICAgICAgICBtaXNzaW9uczogTWlzc2lvbltdO1xyXG4gICAgICAgIHVzZXI6IFByb2ZpbGVFbnRpdHk7XHJcbiAgICB9PiB7XHJcbiAgICAgICAgY29uc3QgdXNlcnMgPSB1bmlxdWVVc2Vycy5tYXAoKHVzZXIpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgdXNlck1pc3Npb25zID0gb3JnTWlzc2lvbnMuZmlsdGVyKChtKSA9PiBtLnVzZXJJRCA9PT0gdXNlci5pZCk7XHJcbiAgICAgICAgICAgIGlmICh1c2VyTWlzc2lvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdXNlclByb2ZpbGUgPSBuZXcgUHJvZmlsZUVudGl0eSh1c2VyKTtcclxuICAgICAgICAgICAgICAgIC8vIG9uY2Ugd2UgZ290IHRoZSB1c2VyIHdlIGNoZWNrIGZpbHRlciBvbmx5IGFjdGl2ZSBtaXNzaW9ucyAobm90IGRlbGV0ZWQpXHJcbiAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVNaXNzaW9ucyA9IHVzZXJNaXNzaW9ucy5maWx0ZXIoKG1pcykgPT4gIW1pcy5kZWxldGVkQXQpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgICAgICBtaXNzaW9uczogYWN0aXZlTWlzc2lvbnMsXHJcbiAgICAgICAgICAgICAgICAgICAgdXNlcjogdXNlclByb2ZpbGUsXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB1c2Vycy5maWx0ZXIoKHVzKSA9PiB1cyAhPT0gbnVsbCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2V0RG9tYWlucygpIHtcclxuICAgICAgICBjb25zdCBkb21haW5zID0gYXdhaXQgdGhpcy5kb21haW5TZXJ2aWNlLmdldERvbWFpbnNGb3JPcmdFeGNsdWRpbmdUeXBlcyhcclxuICAgICAgICAgICAgW0RvbWFpblR5cGUuRkVBVFVSRSwgRG9tYWluVHlwZS5CT09LSU5HXSxcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50T3JnLmlkXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLmRvbWFpbnMgPSBkb21haW5zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogb25Ub2dnbGVEZXRhaWwgZm9sZHMvdW5mb2xkcyBkZXRhaWxzIGZvciBhIGdpdmVuIG9yZ2FuaXNhdGlvblxyXG4gICAgICogQHBhcmFtIGkgaW5kZXggb2YgdGhlIG9yZ2FuaXNhdGlvbiB0byBiZSB0b2dnbGVkXHJcbiAgICAgKi9cclxuICAgIG9uVG9nZ2xlRGV0YWlsT3JnKGluZGV4LCBvcmcpIHtcclxuICAgICAgICB0aGlzLmRldGFpbHNPcmcgPSBpbmRleCA9PT0gdGhpcy5kZXRhaWxzT3JnID8gJy0xJyA6IGluZGV4O1xyXG4gICAgICAgIHRoaXMub3JnU2VsZWN0ZWREZXRhaWxzID0gdGhpcy5kZXRhaWxzT3JnID09PSAnLTEnID8gbnVsbCA6IG9yZztcclxuICAgIH1cclxuXHJcbiAgICBvblRvZ2dsZURldGFpbFVzZXIoaW5kZXgpIHtcclxuICAgICAgICB0aGlzLmRldGFpbHNVc2VyID0gaW5kZXggPT09IHRoaXMuZGV0YWlsc1VzZXIgPyAnLTEnIDogaW5kZXg7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25BZGQob3JnOiBPcmdhbmlzYXRpb24pIHtcclxuICAgICAgICB0aGlzLmNyZWF0ZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5oaWRlTGlzdCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5hZGRUb09yZyA9IG9yZztcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkVkaXQobTogTWlzc2lvbikge1xyXG4gICAgICAgIHRoaXMuZWRpdCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5oaWRlTGlzdCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5taXNzaW9uVG9FZGl0ID0gbTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNhbmNlbCgpIHtcclxuICAgICAgICB0aGlzLndvcmtpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNyZWF0ZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubWlzc2lvblRvRWRpdCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVGb3JFeGlzdGluZ1VzZXIgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBvbkFkZEZvclVzZXIob3JnOiBPcmdhbmlzYXRpb24sIHVzZXI6IFByb2ZpbGVFbnRpdHkpIHtcclxuICAgICAgICB0aGlzLmhpZGVMaXN0ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmNyZWF0ZUZvckV4aXN0aW5nVXNlciA9IHRydWU7XHJcbiAgICAgICAgdGhpcy51c2VyRm9yQWRkaW5nTWlzc2lvbiA9IHVzZXI7XHJcbiAgICAgICAgdGhpcy5hZGRUb09yZyA9IG9yZztcclxuICAgIH1cclxuXHJcbiAgICBvbkFkZE9yZygpIHtcclxuICAgICAgICB0aGlzLmhpZGVMaXN0ID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmlzQWRkaW5nT3JnID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBvcmdBZGRlZChpc0FkZGVkOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5oaWRlTGlzdCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuaXNBZGRpbmdPcmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzQWRkaW5nVG9FeGlzdGluZ09yZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChpc0FkZGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVzZXRMaXN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHVzZXJBZGRlZChpc0FkZGVkOiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5oaWRlTGlzdCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5hZGRUb09yZyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVGb3JFeGlzdGluZ1VzZXIgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnVzZXJGb3JBZGRpbmdNaXNzaW9uID0gbnVsbDtcclxuICAgICAgICBpZiAoaXNBZGRlZCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2V0TGlzdCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbk1pc3Npb25FZGl0ZWQobWlzc2lvbjogTWlzc2lvbikge1xyXG4gICAgICAgIHRoaXMuZWRpdCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMubWlzc2lvblRvRWRpdCA9IG51bGw7XHJcbiAgICAgICAgaWYgKG1pc3Npb24pIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy51c2VyU2VydmljZS5jcmVhdGVPclVwZGF0ZU1pc3Npb25Gb3JPcmdXaXRoUHJvcGVydHkoXHJcbiAgICAgICAgICAgICAgICBtaXNzaW9uLFxyXG4gICAgICAgICAgICAgICAgbWlzc2lvbi5vcmdhbmlzYXRpb25JRCxcclxuICAgICAgICAgICAgICAgIGZhbHNlXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRoaXMucmVzZXRMaXN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaGlkZUxpc3QgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbk1pc3Npb25DcmVhdGVkKG1pc3Npb246IE1pc3Npb24pIHtcclxuICAgICAgICB0aGlzLmNyZWF0ZUZvckV4aXN0aW5nVXNlciA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudXNlckZvckFkZGluZ01pc3Npb24gPSBudWxsO1xyXG4gICAgICAgIGlmIChtaXNzaW9uKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudXNlclNlcnZpY2UuY3JlYXRlT3JVcGRhdGVNaXNzaW9uRm9yT3JnV2l0aFByb3BlcnR5KFxyXG4gICAgICAgICAgICAgICAgbWlzc2lvbixcclxuICAgICAgICAgICAgICAgIG1pc3Npb24ub3JnYW5pc2F0aW9uSURcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5yZXNldExpc3QoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5oaWRlTGlzdCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE9yZGVyZWRPcmcob3JnSUQ6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgICAgIGxldCBuYW1lO1xyXG4gICAgICAgIHRoaXMucHJlc3RhdGFpcmVDbGllbnRzLm1hcChhc3luYyAocHJlc3RhKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChwcmVzdGEucHJlc3RhdGFpcmUgPT09IG9yZ0lEKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvcmcgPSB0aGlzLm9yZ3NVc2Vyc01pc3Npb25zLmZpbHRlcihcclxuICAgICAgICAgICAgICAgICAgICAob2JqZWN0KSA9PiBvYmplY3Qub3JnLmlkID09PSBwcmVzdGEub3JnT3duZXJcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICBpZiAob3JnLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgICBuYW1lID0gb3JnWzBdLm9yZy5uYW1lO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG5hbWU7XHJcbiAgICB9XHJcblxyXG4gICAgZG9tYWluSWRzVG9TdHJpbmdGb3JNaXNzaW9uKG1pc3Npb246IE1pc3Npb24pOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBuYW1lcyA9ICcnO1xyXG4gICAgICAgIGZvciAoY29uc3QgZG9tYWluSUQgb2YgbWlzc2lvbi5kb21haW5zKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRvbWFpbiA9IHRoaXMuZG9tYWlucy5maW5kKChkb20pID0+IGRvbS5pZCA9PT0gZG9tYWluSUQpO1xyXG4gICAgICAgICAgICBpZiAoZG9tYWluKSB7XHJcbiAgICAgICAgICAgICAgICBuYW1lcyA9IGAke25hbWVzfSAke2RvbWFpbi5uYW1lfSxgO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBuYW1lcy5zbGljZSgwLCAtMSk7IC8vIHRvIHJlbW92ZSBsYXN0IGNvbW1hXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25EZWxldGVNaXNzaW9uKG1pc3Npb246IE1pc3Npb24pIHtcclxuICAgICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnY29uZmlybS5kZWxldGVNaXNzaW9uJyk7XHJcbiAgICAgICAgaWYgKHdpbmRvdy5jb25maXJtKG1lc3NhZ2UpKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubWlzc2lvblNlcnZpY2Uuc29mdERlbGV0ZU1pc3Npb24obWlzc2lvbi5pZCk7XHJcbiAgICAgICAgICAgIHRoaXMucmVzZXRMaXN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uRGVsZXRlVXNlcih1c2VyKSB7XHJcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2NvbmZpcm0uZGVsZXRlVXNlcicpO1xyXG4gICAgICAgIGlmICh3aW5kb3cuY29uZmlybShtZXNzYWdlKSkge1xyXG4gICAgICAgICAgICBjb25zdCB1c2VyTWlzc2lvbnMgPSBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLmdldE1pc3Npb25zRnJvbVVzZXJJRChcclxuICAgICAgICAgICAgICAgIHVzZXIuaWRcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgaWYgKHVzZXJNaXNzaW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHREZWxldGUgPSBbXTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgICAgICAgICAgICAgIHVzZXJNaXNzaW9ucy5tYXAoYXN5bmMgKG1pc3Npb24pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2lvbi5vcmRlcmVkT3JnYW5pc2F0aW9uSUQgPT09IHRoaXMuY3VycmVudE9yZy5pZCB8fFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1NQXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsZXRlZE1pc3Npb24gPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWlzc2lvblNlcnZpY2Uuc29mdERlbGV0ZU1pc3Npb24obWlzc2lvbi5pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsZXRlZE1pc3Npb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHREZWxldGUucHVzaChkZWxldGVkTWlzc2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHREZWxldGUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudXNlclNlcnZpY2Uuc29mdERlbGV0ZVVzZXIodXNlci5pZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5yZXNldExpc3QoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMudXNlclNlcnZpY2Uuc29mdERlbGV0ZVVzZXIodXNlci5pZCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlc2V0TGlzdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFwcGx5UmVzdWx0c1NlYXJjaEJhcihyZXN1bHRzKSB7XHJcbiAgICAgICAgdGhpcy5vcmdTZWxlY3RlZERldGFpbHMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRPcmdzVXNlcnNNaXNzaW9ucyA9IHJlc3VsdHMgfHwgdGhpcy5vcmdzVXNlcnNNaXNzaW9ucztcclxuICAgIH1cclxuXHJcbiAgICBvbkFkZEluRXhpc3RpbmdPcmcoKSB7XHJcbiAgICAgICAgdGhpcy5oaWRlTGlzdCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5pc0FkZGluZ1RvRXhpc3RpbmdPcmcgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ3JlYXRlcyBlbmN5cHRlZCBsaW5rIGFuZCBzZXRzIGl0IGZvciBndWVzdExpbmsgZm9yIFNwYWNlLlxyXG4gICAgICogQHBhcmFtIG1pc1xyXG4gICAgICovXHJcbiAgICBvblNldEZvclNoYXJlYWJsZUxpbmsodXNlcjogUHJvZmlsZUVudGl0eSwgbWlzc2lvbjogTWlzc2lvbikge1xyXG4gICAgICAgIGNvbnN0IG1vZGFsUmVmZXJlbmNlID0gdGhpcy5tb2RhbFNlcnZpY2Uub3BlbihHdWVzdExpbmtDb21wb25lbnQpO1xyXG4gICAgICAgIG1vZGFsUmVmZXJlbmNlLmNvbXBvbmVudEluc3RhbmNlLnVzZXJuYW1lID0gdXNlci5lbWFpbDtcclxuICAgICAgICBtb2RhbFJlZmVyZW5jZS5jb21wb25lbnRJbnN0YW5jZS5zcGFjZUlEID0gbWlzc2lvbi5zcGFjZUlEO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uQ2xlYXJUb2tlbih1c2VyKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy51c2VyU2VydmljZS5jbGVhclVzZXJUb2tlbih1c2VyLnVzZXIuaWQpO1xyXG4gICAgICAgIGNvbnN0IGZpcnN0TWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2ZpcnN0VG9rZW5NZXNzYWdlJyk7XHJcbiAgICAgICAgY29uc3Qgc2Vjb25kTWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ3NlY29uZFRva2VuTWVzc2FnZScpO1xyXG4gICAgICAgIGFsZXJ0KGZpcnN0TWVzc2FnZSArIHVzZXIudXNlci5kaXNwbGF5TmFtZSArIHNlY29uZE1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFN0cmluZ05vU3BhY2UoZGF0YSk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIGRhdGEucmVwbGFjZSgvXFxzL2csICcnKTtcclxuICAgIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiZGFzaGJvYXJkLXRhYlwiPlxyXG4gIDxkaXYgY2xhc3M9XCJoZWFkZXItZGFzaGJvYXJkLXRhYlwiPlxyXG4gICAgPGgzPnt7J1VzZXJzJyB8IHRyYW5zbGF0ZX19PC9oMz5cclxuICAgIDwhLS0gPGFwcC1zZWFyY2gtYmFyICpuZ0lmPVwiIWhpZGVMaXN0XCIgW3NlYXJjaGFibGVdPVwib3Jnc1VzZXJzTWlzc2lvbnNcIiBvYmplY3RUeXBlPVwiVVNFUlwiXHJcbiAgICAgICAgKHNlYXJjaEV2ZW50KT1cImFwcGx5UmVzdWx0c1NlYXJjaEJhcigkZXZlbnQpXCI+XHJcbiAgICAgIDwvYXBwLXNlYXJjaC1iYXI+IC0tPlxyXG4gICAgPGhyPlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtOCBjb2wtbGctNlwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93IG1sLTAgbWItMlwiICpuZ0lmPVwiIWhpZGVMaXN0XCI+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBhZGQtYnV0dG9uXCIgKm5nSWY9XCIhaXNHdWlkZVwiIChjbGljayk9XCJvbkFkZE9yZygpXCI+XHJcbiAgICAgICAgICB7eydBZGQgdXNlciB0byBuZXcgb3JnYW5pc2F0aW9uJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIiAqbmdJZj1cImxvYWRpbmdcIj5cclxuICAgICAgICA8bGliLWxvYWRlcj48L2xpYi1sb2FkZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiIWhpZGVMaXN0XCI+XHJcbiAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCIgKm5nSWY9XCJmaWx0ZXJlZE9yZ3NVc2Vyc01pc3Npb25zXCIgZGF0YS10ZXN0aWQ9XCJtaXNzaW9uLW9yZ2FuaXNhdGlvbi1saXN0XCI+XHJcbiAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gbGlzdC1ncm91cC1pdGVtLWFjdGlvblwiICpuZ0Zvcj1cImxldCBvIG9mIGZpbHRlcmVkT3Jnc1VzZXJzTWlzc2lvbnNcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgZm9udC13ZWlnaHQtYm9sZFwiXHJcbiAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIlNlZSBkZXRhaWxzIGFuZCB1c2Vyc1wiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiIChjbGljayk9XCJvblRvZ2dsZURldGFpbE9yZyhvLm9yZy5pZCwgby5vcmcpXCI+XHJcbiAgICAgICAgICAgICAge3tvLm9yZy5uYW1lfX0gPHNtYWxsICpuZ0lmPVwiby5vcmcuaWQgPT0gY3VycmVudE9yZy5pZFwiPih7eydNeSBvcmdhbmlzYXRpb24nIHwgdHJhbnNsYXRlfX0pPC9zbWFsbD5cclxuICAgICAgICAgICAgICA8c21hbGwgKm5nSWY9XCJpc1NQICYmIGNsaWVudHNTUC5pbmNsdWRlcyhvLm9yZy5pZClcIj4oe3snQ2xpZW50IG9mIFNtYXJ0ZXJQbGFuJyB8IHRyYW5zbGF0ZX19KTwvc21hbGw+XHJcbiAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwiaXNTUCAmJiBnZXRPcmRlcmVkT3JnKG8ub3JnLmlkKVwiPih7eydDbGllbnQgb2YgJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgICB7e2dldE9yZGVyZWRPcmcoby5vcmcuaWQpfX0pPC9zbWFsbD5cclxuICAgICAgICAgICAgICA8bGliLWNoZXZyb24gW2NvbmRpdGlvblNob3dpbmddPVwiZGV0YWlsc09yZz09by5vcmcuaWRcIiAgW25nQ2xhc3NdPVwiW2dldFN0cmluZ05vU3BhY2Uoby5vcmcubmFtZSldXCI+PC9saWItY2hldnJvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaXNzaW9uc1wiICpuZ0lmPVwiZGV0YWlsc09yZz09by5vcmcuaWRcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdkLWZsZXgnPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLXRlc3RpZD1cInVzZXItbmV3LWJ0blwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG10LTMgbWItM1wiIChjbGljayk9XCJvbkFkZChvLm9yZylcIj57eydBZGQgdXNlcicgfFxyXG4gICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2hcIiBkYXRhLXRlc3RpZD1cIm1pc3Npb24tdXNlci1saXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gbGlzdC1ncm91cC1pdGVtLWFjdGlvblwiICpuZ0Zvcj1cImxldCBhIG9mIG8udXNlcnNcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Ub2dnbGVEZXRhaWxVc2VyKGEudXNlci5pZClcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e2EudXNlci5kaXNwbGF5TmFtZX19XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpYi1jaGV2cm9uIFtjb25kaXRpb25TaG93aW5nXT1cImRldGFpbHNVc2VyPT1hLnVzZXIuaWRcIiBbbmdDbGFzc109XCJbZ2V0U3RyaW5nTm9TcGFjZShhLnVzZXIuZGlzcGxheU5hbWUpXVwiPjwvbGliLWNoZXZyb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImRldGFpbHNVc2VyPT1hLnVzZXIuaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eydFbWFpbCcgfCB0cmFuc2xhdGV9fToge3thLnVzZXIuZW1haWwgfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSByb3VuZGVkLXBpbGxcIiBkYXRhLXRlc3RpZD1cIm1pc3Npb24tbmV3LWJ0blwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQWRkRm9yVXNlcihvLm9yZywgYS51c2VyKVwiPnt7J0FkZCBuZXcgbWlzc2lvbicgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSByb3VuZGVkLXBpbGxcIiAoY2xpY2spPVwib25DbGVhclRva2VuKGEpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3snQ2xlYXIgVG9rZW4nIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgcm91bmRlZC1waWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGVVc2VyKGEudXNlcilcIj57eydEZWxldGUgdXNlcicgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGEubWlzc2lvbnMubGVuZ3RoID4gMCA/ICgnQ3VycmVudCBNaXNzaW9ucycgfCB0cmFuc2xhdGUpIDogKCdObyBtaXNzaW9ucycgfCB0cmFuc2xhdGUpfX1cclxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtXCIgKm5nRm9yPVwibGV0IG1pcyBvZiBhLm1pc3Npb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiICpuZ0lmPVwibWlzLmRlc2NyaXB0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydEZXNjcmlwdGlvbicgfCB0cmFuc2xhdGV9fToge3ttaXMuZGVzY3JpcHRpb259fTwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCIgKm5nSWY9XCJtaXMudGVtcGxhdGVNaXNzaW9uSURcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0F0dGVuZGVlIG9mIHRvdXInIHwgdHJhbnNsYXRlfX06IHt7bWlzLnRlbXBsYXRlTWlzc2lvbi50aXRsZX19PC9saT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snUm9sZScgfCB0cmFuc2xhdGV9fToge3sgbWlzLnJvbGUgfX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiICpuZ0lmPVwibWlzLmhhc2h0YWdzICYmIG1pcy5oYXNodGFncy5sZW5ndGg+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0hhc2h0YWdzJyB8IHRyYW5zbGF0ZX19OiA8dWwgY2xhc3M9XCJrZXl3b3Jkc0Rpc3BsYXkgbm8tYm9yZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrZXl3b3Jkc2Rpc3BsYXlDb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJrZXl3b3Jkc0l0ZW1cIiAqbmdGb3I9XCJsZXQgaGFzaHRhZyBvZiBtaXMuaGFzaHRhZ3NcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGhhc2h0YWcgfCBoYXNodGFnRnJvbUlEIHwgYXN5bmMgfX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydMYW5ndWFnZScgfCB0cmFuc2xhdGUgfX06IHt7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXMubG9jYWxlID8gbWlzLmxvY2FsZSA6ICgnTm90IGFwcGxpY2FibGUnIHwgdHJhbnNsYXRlKX19PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydBY2Nlc3MgbGV2ZWwnIHwgdHJhbnNsYXRlIH19OiB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzLmxldmVsfX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J09yZGVyZWQgYnknIHwgdHJhbnNsYXRlIH19OiB7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzLm9yZGVyZWRPcmdhbmlzYXRpb24ubmFtZX19PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIiAqbmdJZj1cIm1pcy5kb21haW5zXCI+e3snRG9tYWlucycgfCB0cmFuc2xhdGUgfX06XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e21pcy5kb21haW5zID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbklkc1RvU3RyaW5nRm9yTWlzc2lvbihtaXMpIDogKFwiTm8gZGF0YVwiIHwgdHJhbnNsYXRlKSB9fTwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snQXV0aG9yaXplZCBsb2NhdGlvbicgfCB0cmFuc2xhdGUgfX06XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBtaXMuc3BhY2UgPyBtaXMuc3BhY2UubmFtZSA6IFwiTm8gbG9jYXRpb25cIiB8IHRyYW5zbGF0ZX19PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydBdXRob3JpemVkIHpvbmUnIHwgdHJhbnNsYXRlIH19OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgbWlzLnpvbmUgPyBtaXMuem9uZS5uYW1lIDogXCJBbGwgem9uZXMgYWxsb3dlZFwiIHwgdHJhbnNsYXRlfX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J1N0YXJ0cycgfCB0cmFuc2xhdGUgfX06XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBtaXMuc3RhcnREYXRlVGltZSA/IChtaXMuc3RhcnREYXRlVGltZSB8IHRpbWVEYXRlU3RyaW5nOiBcImRheV90aW1lX3pvbmVcIiB8IGFzeW5jKSA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIk5vIGRhdGFcIiB8IHRyYW5zbGF0ZX19LCB7eydFbmRzJyB8IHRyYW5zbGF0ZX19OiB7eyBtaXMuZW5kRGF0ZVRpbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gKG1pcy5lbmREYXRlVGltZSB8IHRpbWVEYXRlU3RyaW5nOiBcImRheV90aW1lX3pvbmVcIiB8IGFzeW5jKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcIk5vIGRhdGFcIiB8IHRyYW5zbGF0ZX19LlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb24tYnV0dG9uLWNvbnRhaW5lclwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLXRlc3RpZD1cImVkaXQtbWlzc2lvbi1idG5cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtci0yIGFjdGlvbi1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRWRpdChtaXMpXCI+e3snRWRpdCcgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cIm1pcy5yb2xlID09PSAnVklTSVRPUicgfHwgbWlzLnJvbGUgPT09ICdWSVNJVE9SX01VU0VVTSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbXItMiBhY3Rpb24tYnV0dG9uIHNoYXJlLXZpc2l0b3ItYnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvblNldEZvclNoYXJlYWJsZUxpbmsoYS51c2VyLCBtaXMpXCI+e3snR2VuZXJhdGUgU2hhcmVhYmxlIExpbmsnIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgYWN0aW9uLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGVNaXNzaW9uKG1pcylcIj57eydEZWxldGUnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gbGlzdC1ncm91cC1pdGVtLWFjdGlvblwiICpuZ0lmPVwicHJvZmlsZXNXaXRob3V0TWlzc2lvbiAmJiBwcm9maWxlc1dpdGhvdXRNaXNzaW9uLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgZm9udC13ZWlnaHQtYm9sZFwiXHJcbiAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIlNlZSBkZXRhaWxzXCIgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7XCIgKGNsaWNrKT1cIm9uVG9nZ2xlRGV0YWlsT3JnKCctMicsIG51bGwpXCI+XHJcbiAgICAgICAgICAgICAge3tcIlVzZXJzIHdpdGhvdXQgbWlzc2lvbnNcIiB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgICAgPGxpYi1jaGV2cm9uIFtjb25kaXRpb25TaG93aW5nXT1cImRldGFpbHNPcmc9PSctMidcIj48L2xpYi1jaGV2cm9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1pc3Npb25zXCIgKm5nSWY9XCJkZXRhaWxzT3JnPT0nLTInXCI+XHJcbiAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCIgZGF0YS10ZXN0aWQ9XCJtaXNzaW9uLW9yZ2FuaXNhdGlvbi1saXN0XCI+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gbGlzdC1ncm91cC1pdGVtLWFjdGlvblwiICpuZ0Zvcj1cImxldCBwcm9maWxlIG9mIHByb2ZpbGVzV2l0aG91dE1pc3Npb25cIiBcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvblRvZ2dsZURldGFpbFVzZXIocHJvZmlsZS5pZClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7cHJvZmlsZS5kaXNwbGF5TmFtZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1jaGV2cm9uIFtjb25kaXRpb25TaG93aW5nXT1cImRldGFpbHNVc2VyPT1wcm9maWxlLmlkXCIgW25nQ2xhc3NdPVwiW2dldFN0cmluZ05vU3BhY2UocHJvZmlsZS5kaXNwbGF5TmFtZSldXCI+PC9saWItY2hldnJvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZGV0YWlsc1VzZXI9PXByb2ZpbGUuaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWwtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydFbWFpbCcgfCB0cmFuc2xhdGV9fToge3twcm9maWxlLmVtYWlsIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIG10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgcm91bmRlZC1waWxsXCIgZGF0YS10ZXN0aWQ9XCJtaXNzaW9uLW5ldy1idG5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25BZGRGb3JVc2VyKGN1cnJlbnRPcmcsIHByb2ZpbGUpXCI+e3snQWRkIG5ldyBtaXNzaW9uJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHJvdW5kZWQtcGlsbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGVsZXRlVXNlcihwcm9maWxlKVwiPnt7J0RlbGV0ZSB1c2VyJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2xpPlxyXG4gICAgICAgIDwvdWw+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiAqbmdJZj1cImNyZWF0ZVwiPlxyXG4gICAgICAgIDxsaWItdXNlci1taXNzaW9uLWZvcm0gW2FkZFRvT3JnYW5pc2F0aW9uXT1cImFkZFRvT3JnXCIgW2N1cnJlbnRPcmddPVwiY3VycmVudE9yZ1wiIFtpc1NQXT1cImlzU1BcIlxyXG4gICAgICAgICAgKGFkZGVkKT1cInVzZXJBZGRlZCgkZXZlbnQpXCI+XHJcbiAgICAgICAgPC9saWItdXNlci1taXNzaW9uLWZvcm0+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiZWRpdFwiPlxyXG4gICAgICAgIDxsaWItZm9ybS1taXNzaW9uIFttaXNzaW9uVG9FZGl0XT1cIm1pc3Npb25Ub0VkaXRcIiBbY3VycmVudFVzZXJPcmdhbmlzYXRpb25dPVwiY3VycmVudE9yZ1wiIFtpc1NQXT1cImlzU1BcIlxyXG4gICAgICAgICAgKGFkZGVkTWlzc2lvbklucHV0KT1cIm9uTWlzc2lvbkVkaXRlZCgkZXZlbnQpXCI+PC9saWItZm9ybS1taXNzaW9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiAqbmdJZj1cImNyZWF0ZUZvckV4aXN0aW5nVXNlclwiPlxyXG4gICAgICAgIDxsaWItZm9ybS1taXNzaW9uIFtvcmdhbmlzYXRpb25Gb3JNaXNzaW9uXT1cImFkZFRvT3JnXCIgW2N1cnJlbnRVc2VyT3JnYW5pc2F0aW9uXT1cImN1cnJlbnRPcmdcIiBbaXNTUF09XCJpc1NQXCJcclxuICAgICAgICAgIFt1c2VyRm9yTWlzc2lvbklEXT1cInVzZXJGb3JBZGRpbmdNaXNzaW9uLmlkXCIgKGFkZGVkTWlzc2lvbklucHV0KT1cIm9uTWlzc2lvbkNyZWF0ZWQoJGV2ZW50KVwiPlxyXG4gICAgICAgIDwvbGliLWZvcm0tbWlzc2lvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgKm5nSWY9XCJpc0FkZGluZ09yZyB8fCBpc0FkZGluZ1RvRXhpc3RpbmdPcmdcIj5cclxuICAgICAgICA8bGliLWZvcm0tb3JnYW5pc2F0aW9uIFtjdXJyZW50T3JnXT1cImN1cnJlbnRPcmdcIiBbY3VycmVudFVzZXJdPVwibWVcIiBbZXhpc3RpbmddPVwiaXNBZGRpbmdUb0V4aXN0aW5nT3JnXCJcclxuICAgICAgICAgIChhZGRlZCk9XCJvcmdBZGRlZCgkZXZlbnQpXCI+PC9saWItZm9ybS1vcmdhbmlzYXRpb24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImNvbC1tZC00IGNvbC1sZy02XCIgKm5nSWY9XCJvcmdTZWxlY3RlZERldGFpbHMgJiYgIWlzR3VpZGVcIj5cclxuICAgICAgPGxpYi1kZXRhaWwtb3JnYW5pc2F0aW9uIFtvcmddPVwib3JnU2VsZWN0ZWREZXRhaWxzXCIgW2N1cnJlbnRPcmddPVwiY3VycmVudE9yZ1wiIFtpc1NQXT1cImlzU1BcIlxyXG4gICAgICAgIChvcmdDaGFuZ2VkKT0nb3JnQWRkZWQoJGV2ZW50KSc+PC9saWItZGV0YWlsLW9yZ2FuaXNhdGlvbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj4iXX0=
336
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi91c2VyL3VzZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWFkbWluL3NyYy9saWIvdXNlci91c2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFbEQsT0FBTyxFQUlILFVBQVUsRUFDVixxQkFBcUIsRUFNckIsYUFBYSxFQUViLFNBQVMsR0FDWixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7Ozs7Ozs7O0FBUXhFLE1BQU0sT0FBTyxhQUFhO0lBbUV0QixZQUNZLFdBQTRCLEVBQzVCLGNBQThCLEVBQzlCLGFBQTRCLEVBQzVCLG1CQUF3QyxFQUN4QyxZQUFzQixFQUN0QixTQUEyQixFQUMzQixjQUE4QjtRQU45QixnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUFDNUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsaUJBQVksR0FBWixZQUFZLENBQVU7UUFDdEIsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFDM0IsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBdkUxQyxnQkFBVyxHQUFHLElBQUksQ0FBQztRQUVuQixlQUFVLEdBQUcsSUFBSSxDQUFDO1FBRWxCLFVBQUssR0FBRyxFQUFFLENBQUM7UUFFWCxXQUFNLEdBQUcsS0FBSyxDQUFDO1FBRWYsU0FBSSxHQUFHLEtBQUssQ0FB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Z0xNOzJGRHRKTyxhQUFhO2tCQUx6QixTQUFTOytCQUNJLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBCYXNlVXNlclNlcnZpY2UsXG4gICAgRG9tYWluLFxuICAgIERvbWFpblNlcnZpY2UsXG4gICAgRG9tYWluVHlwZSxcbiAgICBmaWx0ZXJVbmlxdWVBcnJheUJ5SUQsXG4gICAgTWlzc2lvbixcbiAgICBNaXNzaW9uU2VydmljZSxcbiAgICBPcmdhbmlzYXRpb24sXG4gICAgT3JnYW5pc2F0aW9uU2VydmljZSxcbiAgICBQcm9maWxlLFxuICAgIFByb2ZpbGVFbnRpdHksXG4gICAgUHJvZmlsZVNlcnZpY2UsXG4gICAgd2FpdFVudGlsLFxufSBmcm9tICdAc21hcnRlcnBsYW4vbmd4LXNtYXJ0ZXJwbGFuLWNvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgR3Vlc3RMaW5rQ29tcG9uZW50IH0gZnJvbSAnLi4vZ3Vlc3QtbGluay9ndWVzdC1saW5rLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdsaWItdXNlcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3VzZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3VzZXIuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVXNlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgdXNlcnM6IEFycmF5PE1pc3Npb24gJiB7IG5hbWU6IHN0cmluZzsgfT47XG5cbiAgICBkZXRhaWxzVXNlciA9ICctMSc7XG5cbiAgICBkZXRhaWxzT3JnID0gJy0xJztcblxuICAgIHF1ZXJ5ID0gJyc7XG5cbiAgICBjcmVhdGUgPSBmYWxzZTtcblxuICAgIGVkaXQgPSBmYWxzZTtcblxuICAgIHdvcmtpbmcgPSBmYWxzZTtcblxuICAgIGNyZWF0ZUZvckV4aXN0aW5nVXNlciA9IGZhbHNlO1xuXG4gICAgaXNBZGRpbmdPcmcgPSBmYWxzZTtcblxuICAgIGlzQWRkaW5nVG9FeGlzdGluZ09yZyA9IGZhbHNlO1xuXG4gICAgdXNlckZvckFkZGluZ01pc3Npb246IFByb2ZpbGVFbnRpdHk7XG5cbiAgICBjdXJyZW50T3JnOiBPcmdhbmlzYXRpb247XG5cbiAgICBtZTogUHJvZmlsZUVudGl0eTtcblxuICAgIGhpZGVMaXN0ID0gZmFsc2U7XG5cbiAgICBvcmdzVXNlcnNNaXNzaW9uczogQXJyYXk8e1xuICAgICAgICBvcmc6IE9yZ2FuaXNhdGlvbjtcbiAgICAgICAgdXNlcnM6IEFycmF5PHtcbiAgICAgICAgICAgIG1pc3Npb25zOiBNaXNzaW9uW107XG4gICAgICAgICAgICB1c2VyOiBQcm9maWxlRW50aXR5O1xuICAgICAgICB9PjtcbiAgICB9PiA9IFtdO1xuXG4gICAgbWlzc2lvblRvRWRpdDogTWlzc2lvbjtcblxuICAgIGlzU1AgPSBmYWxzZTtcblxuICAgIGlzR3VpZGUgPSBmYWxzZTtcblxuICAgIGNsaWVudHNTUDogc3RyaW5nW10gPSBbXTtcblxuICAgIHByZXN0YXRhaXJlQ2xpZW50czogQXJyYXk8eyBvcmdPd25lcjogc3RyaW5nOyBwcmVzdGF0YWlyZTogc3RyaW5nOyB9PiA9IFtdO1xuXG4gICAgZG9tYWluczogRG9tYWluW107XG5cbiAgICBhZGRUb09yZzogT3JnYW5pc2F0aW9uO1xuXG4gICAgb3JnU2VsZWN0ZWREZXRhaWxzOiBPcmdhbmlzYXRpb247XG5cbiAgICBmaWx0ZXJlZE9yZ3NVc2Vyc01pc3Npb25zOiBBcnJheTx7XG4gICAgICAgIG9yZzogT3JnYW5pc2F0aW9uO1xuICAgICAgICB1c2VyczogQXJyYXk8e1xuICAgICAgICAgICAgbWlzc2lvbnM6IE1pc3Npb25bXTtcbiAgICAgICAgICAgIHVzZXI6IFByb2ZpbGVFbnRpdHk7XG4gICAgICAgIH0+O1xuICAgIH0+O1xuXG4gICAgbG9hZGluZyA9IGZhbHNlO1xuXG4gICAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgICBwcm9maWxlc1dpdGhvdXRNaXNzaW9uOiBQcm9maWxlRW50aXR5W10gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBCYXNlVXNlclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbWlzc2lvblNlcnZpY2U6IE1pc3Npb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGRvbWFpblNlcnZpY2U6IERvbWFpblNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgb3JnYW5pc2F0aW9uU2VydmljZTogT3JnYW5pc2F0aW9uU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsLFxuICAgICAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBwcm9maWxlU2VydmljZTogUHJvZmlsZVNlcnZpY2UsXG4gICAgKSB7IH1cblxuICAgIC8vIEB0b2RvIGxpc3QgbXkgb3JnIGFuZCBzdWIgb3Jnc1xuXG5cblxuICAgIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0aGlzLmluaXRJbmZvKCk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGVzdHJveSQubmV4dCh0cnVlKTtcbiAgICAgICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJlc2V0TGlzdCBmZXRjaGVzIGEgZnJlc2ggdXNlciBsaXN0IGZyb20gc2VydmVyXG4gICAgICovXG4gICAgYXN5bmMgcmVzZXRMaXN0KCkge1xuICAgICAgICB0aGlzLm9yZ3NVc2Vyc01pc3Npb25zID0gW107XG4gICAgICAgIGxldCBhbGxNaXNzaW9ucyA9IFtdO1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5pc1NQKSB7XG4gICAgICAgICAgICB0aGlzLm9yZ3NVc2Vyc01pc3Npb25zID0gYXdhaXQgdGhpcy5pbml0TGlzdEZvclNQKCk7XG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkT3Jnc1VzZXJzTWlzc2lvbnMgPSB0aGlzLm9yZ3NVc2Vyc01pc3Npb25zO1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc0d1aWRlKSB7XG4gICAgICAgICAgICAvLyBndWlkZSBzZWVzIG9ubHkgaXRzIG93biBvcmdhbmlzYXRpb25cbiAgICAgICAgICAgIGFsbE1pc3Npb25zID1cbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLm1pc3Npb25TZXJ2aWNlLmdldE1pc3Npb25zQnlPcmdhbmlzYXRpb24odGhpcy5jdXJyZW50T3JnLmlkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFsbE1pc3Npb25zID0gYXdhaXQgdGhpcy5taXNzaW9uU2VydmljZS5nZXRNaXNzaW9uc0J5T3JkZXJlZE9yZ2FuaXNhdGlvbihcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRPcmcuaWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50T3JnTWlzc2lvbnMgPVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubWlzc2lvblNlcnZpY2UuZ2V0TWlzc2lvbnNCeU9yZ2FuaXNhdGlvbih0aGlzLmN1cnJlbnRPcmcuaWQpO1xuICAgICAgICAgICAgYWxsTWlzc2lvbnMgPSBbLi4uYWxsTWlzc2lvbnMsIC4uLmN1cnJlbnRPcmdNaXNzaW9uc107XG4gICAgICAgIH1cblxuICAgICAgICBhbGxNaXNzaW9ucyA9IGFsbE1pc3Npb25zLmZpbHRlcigobWlzc2lvbikgPT4gbWlzc2lvbi51c2VyICYmICFtaXNzaW9uLnVzZXIuZGVsZXRlZEF0KTtcbiAgICAgICAgYWxsTWlzc2lvbnMgPSBmaWx0ZXJVbmlxdWVBcnJheUJ5SUQoYWxsTWlzc2lvbnMpO1xuXG4gICAgICAgIGlmIChhbGxNaXNzaW9ucykge1xuICAgICAgICAgICAgY29uc3Qgb3JncyA9IGFsbE1pc3Npb25zLm1hcCgobWlzKSA9PiBtaXMub3JnYW5pc2F0aW9uKTtcbiAgICAgICAgICAgIGNvbnN0IHByb2ZpbGVzID0gYWxsTWlzc2lvbnMubWFwKChtaXMpID0+IG1pcy51c2VyKTtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZU9yZyA9IGZpbHRlclVuaXF1ZUFycmF5QnlJRChvcmdzKTtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZVVzZXJzID0gZmlsdGVyVW5pcXVlQXJyYXlCeUlEKHByb2ZpbGVzKTtcbiAgICAgICAgICAgIHVuaXF1ZU9yZy5tYXAoKG9yZykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9yZ01pc3Npb25zID0gYWxsTWlzc2lvbnMuZmlsdGVyKChtaXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1pcy5vcmdhbmlzYXRpb25JRCA9PT0gb3JnLmlkO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGxldCB1c2VycyA9IHRoaXMuZ2V0VXNlcnNGb3JPcmdNaXNzaW9ucyh1bmlxdWVVc2Vycywgb3JnTWlzc2lvbnMpO1xuICAgICAgICAgICAgICAgIHVzZXJzID0gdXNlcnMuc29ydCgodXNlcikgPT4gKHVzZXIudXNlci5lbWFpbCA/IDAgOiAtMSkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG9iamVjdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgb3JnLFxuICAgICAgICAgICAgICAgICAgICB1c2VycyxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMub3Jnc1VzZXJzTWlzc2lvbnMucHVzaChvYmplY3QpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maWx0ZXJlZE9yZ3NVc2Vyc01pc3Npb25zID0gdGhpcy5vcmdzVXNlcnNNaXNzaW9ucztcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgfVxuXG4gICAgYXN5bmMgaW5pdEluZm8oKSB7XG4gICAgICAgIGF3YWl0IHdhaXRVbnRpbCgoKSA9PiB0aGlzLnVzZXJTZXJ2aWNlLmN1ICE9PSB1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLm1lID0gdGhpcy51c2VyU2VydmljZS5jdTtcbiAgICAgICAgdGhpcy5jdXJyZW50T3JnID0gdGhpcy51c2VyU2VydmljZS5jdXJyZW50T3JnYW5pc2F0aW9uKCk7XG4gICAgICAgIHRoaXMuaXNTUCA9IHRoaXMudXNlclNlcnZpY2UuaXNTUEFkbWluKCk7XG4gICAgICAgIHRoaXMuaXNHdWlkZSA9IHRoaXMudXNlclNlcnZpY2UuaXNHdWlkZSgpO1xuICAgICAgICB0aGlzLnJlc2V0TGlzdCgpO1xuICAgICAgICB0aGlzLnNldERvbWFpbnMoKTtcbiAgICB9XG5cbiAgICBhc3luYyBpbml0TGlzdEZvclNQKCk6IFByb21pc2U8YW55W10+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IFtdO1xuICAgICAgICBsZXQgYWxsTWlzc2lvbnMgPSBbXTtcbiAgICAgICAgbGV0IGFsbE9yZ3MgPSBbXTtcbiAgICAgICAgYWxsT3JncyA9IGF3YWl0IHRoaXMub3JnYW5pc2F0aW9uU2VydmljZS5saXN0T3JnYW5pc2F0aW9ucygpO1xuICAgICAgICBhbGxPcmdzID0gYWxsT3Jncy5maWx0ZXIoKG8pID0+ICFvLmRlbGV0ZWRBdCk7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICAgICAgYWxsT3Jncy5tYXAoYXN5bmMgKG9yZykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1pc3Npb25zID0gYXdhaXQgdGhpcy5taXNzaW9uU2VydmljZS5nZXRNaXNzaW9uc0J5T3JnYW5pc2F0aW9uKFxuICAgICAgICAgICAgICAgICAgICBvcmcuaWRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGFsbE1pc3Npb25zID0gWy4uLmFsbE1pc3Npb25zLCAuLi5taXNzaW9uc107XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHByb2ZpbGVzID0gYWxsTWlzc2lvbnNcbiAgICAgICAgICAgIC5tYXAoKG1pcykgPT4gbWlzLnVzZXIpXG4gICAgICAgICAgICAuZmlsdGVyKCh1c2VyKSA9PiAhdXNlci5kZWxldGVkQXQpO1xuICAgICAgICBjb25zdCB1bmlxdWVVc2VycyA9IGZpbHRlclVuaXF1ZUFycmF5QnlJRChcbiAgICAgICAgICAgIHByb2ZpbGVzLmZpbHRlcigocHJvZmlsZSkgPT4gcHJvZmlsZSAhPT0gbnVsbClcbiAgICAgICAgKTtcbiAgICAgICAgYWxsT3Jncy5tYXAoKG9yZykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3JnTWlzc2lvbnMgPSBhbGxNaXNzaW9ucy5maWx0ZXIoKG1pcykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBtaXMub3JnYW5pc2F0aW9uSUQgPT09IG9yZy5pZDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAob3JnTWlzc2lvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgb3JnTWlzc2lvbnMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgKG0pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5vcmRlcmVkT3JnYW5pc2F0aW9uSUQgPT09ICc2ZTI4MjAxZi00Njc5LTRjMjktOWQyZC04YTMyNWY1N2NlZTknXG4gICAgICAgICAgICAgICAgICAgICkubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsaWVudHNTUC5wdXNoKG9yZy5pZCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmVzdGF0YWlyZUNsaWVudHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcmdPd25lcjogb3JnTWlzc2lvbnNbMF0ub3JkZXJlZE9yZ2FuaXNhdGlvbklELFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlc3RhdGFpcmU6IG9yZy5pZCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdXNlcnMgPSB0aGlzLmdldFVzZXJzRm9yT3JnTWlzc2lvbnModW5pcXVlVXNlcnMsIG9yZ01pc3Npb25zKTtcbiAgICAgICAgICAgIGNvbnN0IG9iamVjdCA9IHtcbiAgICAgICAgICAgICAgICBvcmcsXG4gICAgICAgICAgICAgICAgdXNlcnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKG9iamVjdCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGdldCBwcm9maWxlcyB3aXRob3V0IE1pc3Npb25zXG4gICAgICAgIGxldCBwcm9maWxlc1dpdGhvdXRNaXNzaW9uID0gYXdhaXQgdGhpcy5wcm9maWxlU2VydmljZS5saXN0Q3VycmVudFByb2ZpbGVzKCk7XG4gICAgICAgIHByb2ZpbGVzV2l0aG91dE1pc3Npb24gPSBwcm9maWxlc1dpdGhvdXRNaXNzaW9uLmZpbHRlcigocHJvZmlsZSkgPT4gIXVuaXF1ZVVzZXJzLm1hcCgocCkgPT4gcC5pZCkuaW5jbHVkZXMocHJvZmlsZS5pZCkpO1xuICAgICAgICBpZiAocHJvZmlsZXNXaXRob3V0TWlzc2lvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnByb2ZpbGVzV2l0aG91dE1pc3Npb24gPSBbXTtcbiAgICAgICAgICAgIHByb2ZpbGVzV2l0aG91dE1pc3Npb24uZm9yRWFjaCgocHJvZmlsZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVzZXIgPSBuZXcgUHJvZmlsZUVudGl0eShwcm9maWxlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2ZpbGVzV2l0aG91dE1pc3Npb24ucHVzaCh1c2VyKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcbiAgICBnZXRVc2Vyc0Zvck9yZ01pc3Npb25zKFxuICAgICAgICB1bmlxdWVVc2VyczogUHJvZmlsZVtdLFxuICAgICAgICBvcmdNaXNzaW9uczogTWlzc2lvbltdXG4gICAgKTogQXJyYXk8e1xuICAgICAgICBtaXNzaW9uczogTWlzc2lvbltdO1xuICAgICAgICB1c2VyOiBQcm9maWxlRW50aXR5O1xuICAgIH0+IHtcbiAgICAgICAgY29uc3QgdXNlcnMgPSB1bmlxdWVVc2Vycy5tYXAoKHVzZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVzZXJNaXNzaW9ucyA9IG9yZ01pc3Npb25zLmZpbHRlcigobSkgPT4gbS51c2VySUQgPT09IHVzZXIuaWQpO1xuICAgICAgICAgICAgaWYgKHVzZXJNaXNzaW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdXNlclByb2ZpbGUgPSBuZXcgUHJvZmlsZUVudGl0eSh1c2VyKTtcbiAgICAgICAgICAgICAgICAvLyBvbmNlIHdlIGdvdCB0aGUgdXNlciB3ZSBjaGVjayBmaWx0ZXIgb25seSBhY3RpdmUgbWlzc2lvbnMgKG5vdCBkZWxldGVkKVxuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2ZU1pc3Npb25zID0gdXNlck1pc3Npb25zLmZpbHRlcigobWlzKSA9PiAhbWlzLmRlbGV0ZWRBdCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbWlzc2lvbnM6IGFjdGl2ZU1pc3Npb25zLFxuICAgICAgICAgICAgICAgICAgICB1c2VyOiB1c2VyUHJvZmlsZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdXNlcnMuZmlsdGVyKCh1cykgPT4gdXMgIT09IG51bGwpO1xuICAgIH1cblxuICAgIGFzeW5jIHNldERvbWFpbnMoKSB7XG4gICAgICAgIGNvbnN0IGRvbWFpbnMgPSBhd2FpdCB0aGlzLmRvbWFpblNlcnZpY2UuZ2V0RG9tYWluc0Zvck9yZ0V4Y2x1ZGluZ1R5cGVzKFxuICAgICAgICAgICAgW0RvbWFpblR5cGUuRkVBVFVSRSwgRG9tYWluVHlwZS5CT09LSU5HXSxcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE9yZy5pZFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmRvbWFpbnMgPSBkb21haW5zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIG9uVG9nZ2xlRGV0YWlsIGZvbGRzL3VuZm9sZHMgZGV0YWlscyBmb3IgYSBnaXZlbiBvcmdhbmlzYXRpb25cbiAgICAgKiBAcGFyYW0gaSBpbmRleCBvZiB0aGUgb3JnYW5pc2F0aW9uIHRvIGJlIHRvZ2dsZWRcbiAgICAgKi9cbiAgICBvblRvZ2dsZURldGFpbE9yZyhpbmRleCwgb3JnKSB7XG4gICAgICAgIHRoaXMuZGV0YWlsc09yZyA9IGluZGV4ID09PSB0aGlzLmRldGFpbHNPcmcgPyAnLTEnIDogaW5kZXg7XG4gICAgICAgIHRoaXMub3JnU2VsZWN0ZWREZXRhaWxzID0gdGhpcy5kZXRhaWxzT3JnID09PSAnLTEnID8gbnVsbCA6IG9yZztcbiAgICB9XG5cbiAgICBvblRvZ2dsZURldGFpbFVzZXIoaW5kZXgpIHtcbiAgICAgICAgdGhpcy5kZXRhaWxzVXNlciA9IGluZGV4ID09PSB0aGlzLmRldGFpbHNVc2VyID8gJy0xJyA6IGluZGV4O1xuICAgIH1cblxuICAgIGFzeW5jIG9uQWRkKG9yZzogT3JnYW5pc2F0aW9uKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5oaWRlTGlzdCA9IHRydWU7XG4gICAgICAgIHRoaXMuYWRkVG9PcmcgPSBvcmc7XG4gICAgfVxuXG4gICAgYXN5bmMgb25FZGl0KG06IE1pc3Npb24pIHtcbiAgICAgICAgdGhpcy5lZGl0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5oaWRlTGlzdCA9IHRydWU7XG4gICAgICAgIHRoaXMubWlzc2lvblRvRWRpdCA9IG07XG4gICAgfVxuXG4gICAgb25DYW5jZWwoKSB7XG4gICAgICAgIHRoaXMud29ya2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNyZWF0ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1pc3Npb25Ub0VkaXQgPSBudWxsO1xuICAgICAgICB0aGlzLmNyZWF0ZUZvckV4aXN0aW5nVXNlciA9IGZhbHNlO1xuICAgIH1cblxuICAgIG9uQWRkRm9yVXNlcihvcmc6IE9yZ2FuaXNhdGlvbiwgdXNlcjogUHJvZmlsZUVudGl0eSkge1xuICAgICAgICB0aGlzLmhpZGVMaXN0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jcmVhdGVGb3JFeGlzdGluZ1VzZXIgPSB0cnVlO1xuICAgICAgICB0aGlzLnVzZXJGb3JBZGRpbmdNaXNzaW9uID0gdXNlcjtcbiAgICAgICAgdGhpcy5hZGRUb09yZyA9IG9yZztcbiAgICB9XG5cbiAgICBvbkFkZE9yZygpIHtcbiAgICAgICAgdGhpcy5oaWRlTGlzdCA9IHRydWU7XG4gICAgICAgIHRoaXMuaXNBZGRpbmdPcmcgPSB0cnVlO1xuICAgIH1cblxuICAgIG9yZ0FkZGVkKGlzQWRkZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5oaWRlTGlzdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzQWRkaW5nT3JnID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNBZGRpbmdUb0V4aXN0aW5nT3JnID0gZmFsc2U7XG4gICAgICAgIGlmIChpc0FkZGVkKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0TGlzdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdXNlckFkZGVkKGlzQWRkZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5oaWRlTGlzdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNyZWF0ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFkZFRvT3JnID0gbnVsbDtcbiAgICAgICAgdGhpcy5jcmVhdGVGb3JFeGlzdGluZ1VzZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy51c2VyRm9yQWRkaW5nTWlzc2lvbiA9IG51bGw7XG4gICAgICAgIGlmIChpc0FkZGVkKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0TGlzdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgb25NaXNzaW9uRWRpdGVkKG1pc3Npb246IE1pc3Npb24pIHtcbiAgICAgICAgdGhpcy5lZGl0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMubWlzc2lvblRvRWRpdCA9IG51bGw7XG4gICAgICAgIGlmIChtaXNzaW9uKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmNyZWF0ZU9yVXBkYXRlTWlzc2lvbkZvck9yZ1dpdGhQcm9wZXJ0eShcbiAgICAgICAgICAgICAgICBtaXNzaW9uLFxuICAgICAgICAgICAgICAgIG1pc3Npb24ub3JnYW5pc2F0aW9uSUQsXG4gICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnJlc2V0TGlzdCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGlkZUxpc3QgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBhc3luYyBvbk1pc3Npb25DcmVhdGVkKG1pc3Npb246IE1pc3Npb24pIHtcbiAgICAgICAgdGhpcy5jcmVhdGVGb3JFeGlzdGluZ1VzZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy51c2VyRm9yQWRkaW5nTWlzc2lvbiA9IG51bGw7XG4gICAgICAgIGlmIChtaXNzaW9uKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmNyZWF0ZU9yVXBkYXRlTWlzc2lvbkZvck9yZ1dpdGhQcm9wZXJ0eShcbiAgICAgICAgICAgICAgICBtaXNzaW9uLFxuICAgICAgICAgICAgICAgIG1pc3Npb24ub3JnYW5pc2F0aW9uSURcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLnJlc2V0TGlzdCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGlkZUxpc3QgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBnZXRPcmRlcmVkT3JnKG9yZ0lEOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgbGV0IG5hbWU7XG4gICAgICAgIHRoaXMucHJlc3RhdGFpcmVDbGllbnRzLm1hcChhc3luYyAocHJlc3RhKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJlc3RhLnByZXN0YXRhaXJlID09PSBvcmdJRCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9yZyA9IHRoaXMub3Jnc1VzZXJzTWlzc2lvbnMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAob2JqZWN0KSA9PiBvYmplY3Qub3JnLmlkID09PSBwcmVzdGEub3JnT3duZXJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChvcmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBuYW1lID0gb3JnWzBdLm9yZy5uYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBuYW1lO1xuICAgIH1cblxuICAgIGRvbWFpbklkc1RvU3RyaW5nRm9yTWlzc2lvbihtaXNzaW9uOiBNaXNzaW9uKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IG5hbWVzID0gJyc7XG4gICAgICAgIGZvciAoY29uc3QgZG9tYWluSUQgb2YgbWlzc2lvbi5kb21haW5zKSB7XG4gICAgICAgICAgICBjb25zdCBkb21haW4gPSB0aGlzLmRvbWFpbnMuZmluZCgoZG9tKSA9PiBkb20uaWQgPT09IGRvbWFpbklEKTtcbiAgICAgICAgICAgIGlmIChkb21haW4pIHtcbiAgICAgICAgICAgICAgICBuYW1lcyA9IGAke25hbWVzfSAke2RvbWFpbi5uYW1lfSxgO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuYW1lcy5zbGljZSgwLCAtMSk7IC8vIHRvIHJlbW92ZSBsYXN0IGNvbW1hXG4gICAgfVxuXG4gICAgYXN5bmMgb25EZWxldGVNaXNzaW9uKG1pc3Npb246IE1pc3Npb24pIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2NvbmZpcm0uZGVsZXRlTWlzc2lvbicpO1xuICAgICAgICBpZiAod2luZG93LmNvbmZpcm0obWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMubWlzc2lvblNlcnZpY2Uuc29mdERlbGV0ZU1pc3Npb24obWlzc2lvbi5pZCk7XG4gICAgICAgICAgICB0aGlzLnJlc2V0TGlzdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgb25EZWxldGVVc2VyKHVzZXIpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2NvbmZpcm0uZGVsZXRlVXNlcicpO1xuICAgICAgICBpZiAod2luZG93LmNvbmZpcm0obWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHVzZXJNaXNzaW9ucyA9IGF3YWl0IHRoaXMubWlzc2lvblNlcnZpY2UuZ2V0TWlzc2lvbnNGcm9tVXNlcklEKFxuICAgICAgICAgICAgICAgIHVzZXIuaWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAodXNlck1pc3Npb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHREZWxldGUgPSBbXTtcbiAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICAgICAgdXNlck1pc3Npb25zLm1hcChhc3luYyAobWlzc2lvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3Npb24ub3JkZXJlZE9yZ2FuaXNhdGlvbklEID09PSB0aGlzLmN1cnJlbnRPcmcuaWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU1BcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbGV0ZWRNaXNzaW9uID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5taXNzaW9uU2VydmljZS5zb2Z0RGVsZXRlTWlzc2lvbihtaXNzaW9uLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsZXRlZE1pc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0RGVsZXRlLnB1c2goZGVsZXRlZE1pc3Npb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHREZWxldGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLnNvZnREZWxldGVVc2VyKHVzZXIuaWQpO1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlc2V0TGlzdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy51c2VyU2VydmljZS5zb2Z0RGVsZXRlVXNlcih1c2VyLmlkKTtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlc2V0TGlzdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXBwbHlSZXN1bHRzU2VhcmNoQmFyKHJlc3VsdHMpIHtcbiAgICAgICAgdGhpcy5vcmdTZWxlY3RlZERldGFpbHMgPSBudWxsO1xuICAgICAgICB0aGlzLmZpbHRlcmVkT3Jnc1VzZXJzTWlzc2lvbnMgPSByZXN1bHRzIHx8IHRoaXMub3Jnc1VzZXJzTWlzc2lvbnM7XG4gICAgfVxuXG4gICAgb25BZGRJbkV4aXN0aW5nT3JnKCkge1xuICAgICAgICB0aGlzLmhpZGVMaXN0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pc0FkZGluZ1RvRXhpc3RpbmdPcmcgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgZW5jeXB0ZWQgbGluayBhbmQgc2V0cyBpdCBmb3IgZ3Vlc3RMaW5rIGZvciBTcGFjZS5cbiAgICAgKiBAcGFyYW0gbWlzXG4gICAgICovXG4gICAgb25TZXRGb3JTaGFyZWFibGVMaW5rKHVzZXI6IFByb2ZpbGVFbnRpdHksIG1pc3Npb246IE1pc3Npb24pIHtcbiAgICAgICAgY29uc3QgbW9kYWxSZWZlcmVuY2UgPSB0aGlzLm1vZGFsU2VydmljZS5vcGVuKEd1ZXN0TGlua0NvbXBvbmVudCk7XG4gICAgICAgIG1vZGFsUmVmZXJlbmNlLmNvbXBvbmVudEluc3RhbmNlLnVzZXJuYW1lID0gdXNlci5lbWFpbDtcbiAgICAgICAgbW9kYWxSZWZlcmVuY2UuY29tcG9uZW50SW5zdGFuY2Uuc3BhY2VJRCA9IG1pc3Npb24uc3BhY2VJRDtcbiAgICB9XG5cbiAgICBhc3luYyBvbkNsZWFyVG9rZW4odXNlcikge1xuICAgICAgICBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlLmNsZWFyVXNlclRva2VuKHVzZXIudXNlci5pZCk7XG4gICAgICAgIGNvbnN0IGZpcnN0TWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2ZpcnN0VG9rZW5NZXNzYWdlJyk7XG4gICAgICAgIGNvbnN0IHNlY29uZE1lc3NhZ2UgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdzZWNvbmRUb2tlbk1lc3NhZ2UnKTtcbiAgICAgICAgYWxlcnQoZmlyc3RNZXNzYWdlICsgdXNlci51c2VyLmRpc3BsYXlOYW1lICsgc2Vjb25kTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgZ2V0U3RyaW5nTm9TcGFjZShkYXRhKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGRhdGEucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZGFzaGJvYXJkLXRhYlwiPlxuICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWRhc2hib2FyZC10YWJcIj5cbiAgICA8aDM+e3snVXNlcnMnIHwgdHJhbnNsYXRlfX08L2gzPlxuICAgIDwhLS0gPGFwcC1zZWFyY2gtYmFyICpuZ0lmPVwiIWhpZGVMaXN0XCIgW3NlYXJjaGFibGVdPVwib3Jnc1VzZXJzTWlzc2lvbnNcIiBvYmplY3RUeXBlPVwiVVNFUlwiXG4gICAgICAgIChzZWFyY2hFdmVudCk9XCJhcHBseVJlc3VsdHNTZWFyY2hCYXIoJGV2ZW50KVwiPlxuICAgICAgPC9hcHAtc2VhcmNoLWJhcj4gLS0+XG4gICAgPGhyPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtOCBjb2wtbGctNlwiPlxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBtbC0wIG1iLTJcIiAqbmdJZj1cIiFoaWRlTGlzdFwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIGFkZC1idXR0b25cIiAqbmdJZj1cIiFpc0d1aWRlXCIgKGNsaWNrKT1cIm9uQWRkT3JnKClcIj5cbiAgICAgICAgICB7eydBZGQgdXNlciB0byBuZXcgb3JnYW5pc2F0aW9uJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiICpuZ0lmPVwibG9hZGluZ1wiPlxuICAgICAgICA8bGliLWxvYWRlcj48L2xpYi1sb2FkZXI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCIhaGlkZUxpc3RcIj5cbiAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCIgKm5nSWY9XCJmaWx0ZXJlZE9yZ3NVc2Vyc01pc3Npb25zXCIgZGF0YS10ZXN0aWQ9XCJtaXNzaW9uLW9yZ2FuaXNhdGlvbi1saXN0XCI+XG4gICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGxpc3QtZ3JvdXAtaXRlbS1hY3Rpb25cIiAqbmdGb3I9XCJsZXQgbyBvZiBmaWx0ZXJlZE9yZ3NVc2Vyc01pc3Npb25zXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBmb250LXdlaWdodC1ib2xkXCJcbiAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIlNlZSBkZXRhaWxzIGFuZCB1c2Vyc1wiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiIChjbGljayk9XCJvblRvZ2dsZURldGFpbE9yZyhvLm9yZy5pZCwgby5vcmcpXCI+XG4gICAgICAgICAgICAgIHt7by5vcmcubmFtZX19IDxzbWFsbCAqbmdJZj1cIm8ub3JnLmlkID09IGN1cnJlbnRPcmcuaWRcIj4oe3snTXkgb3JnYW5pc2F0aW9uJyB8IHRyYW5zbGF0ZX19KTwvc21hbGw+XG4gICAgICAgICAgICAgIDxzbWFsbCAqbmdJZj1cImlzU1AgJiYgY2xpZW50c1NQLmluY2x1ZGVzKG8ub3JnLmlkKVwiPih7eydDbGllbnQgb2YgU21hcnRlclBsYW4nIHwgdHJhbnNsYXRlfX0pPC9zbWFsbD5cbiAgICAgICAgICAgICAgPHNtYWxsICpuZ0lmPVwiaXNTUCAmJiBnZXRPcmRlcmVkT3JnKG8ub3JnLmlkKVwiPih7eydDbGllbnQgb2YgJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAge3tnZXRPcmRlcmVkT3JnKG8ub3JnLmlkKX19KTwvc21hbGw+XG4gICAgICAgICAgICAgIDxsaWItY2hldnJvbiBbY29uZGl0aW9uU2hvd2luZ109XCJkZXRhaWxzT3JnPT1vLm9yZy5pZFwiICBbbmdDbGFzc109XCJbZ2V0U3RyaW5nTm9TcGFjZShvLm9yZy5uYW1lKV1cIj48L2xpYi1jaGV2cm9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWlzc2lvbnNcIiAqbmdJZj1cImRldGFpbHNPcmc9PW8ub3JnLmlkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9J2QtZmxleCc+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBkYXRhLXRlc3RpZD1cInVzZXItbmV3LWJ0blwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG10LTMgbWItM1wiIChjbGljayk9XCJvbkFkZChvLm9yZylcIj57eydBZGQgdXNlcicgfFxuICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCIgZGF0YS10ZXN0aWQ9XCJtaXNzaW9uLXVzZXItbGlzdFwiPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBsaXN0LWdyb3VwLWl0ZW0tYWN0aW9uXCIgKm5nRm9yPVwibGV0IGEgb2Ygby51c2Vyc1wiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Ub2dnbGVEZXRhaWxVc2VyKGEudXNlci5pZClcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7YS51c2VyLmRpc3BsYXlOYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgPGxpYi1jaGV2cm9uIFtjb25kaXRpb25TaG93aW5nXT1cImRldGFpbHNVc2VyPT1hLnVzZXIuaWRcIiBbbmdDbGFzc109XCJbZ2V0U3RyaW5nTm9TcGFjZShhLnVzZXIuZGlzcGxheU5hbWUpXVwiPjwvbGliLWNoZXZyb24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImRldGFpbHNVc2VyPT1hLnVzZXIuaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eydFbWFpbCcgfCB0cmFuc2xhdGV9fToge3thLnVzZXIuZW1haWwgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSByb3VuZGVkLXBpbGxcIiBkYXRhLXRlc3RpZD1cIm1pc3Npb24tbmV3LWJ0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkFkZEZvclVzZXIoby5vcmcsIGEudXNlcilcIj57eydBZGQgbmV3IG1pc3Npb24nIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHJvdW5kZWQtcGlsbFwiIChjbGljayk9XCJvbkNsZWFyVG9rZW4oYSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3snQ2xlYXIgVG9rZW4nIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHJvdW5kZWQtcGlsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkRlbGV0ZVVzZXIoYS51c2VyKVwiPnt7J0RlbGV0ZSB1c2VyJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgYS5taXNzaW9ucy5sZW5ndGggPiAwID8gKCdDdXJyZW50IE1pc3Npb25zJyB8IHRyYW5zbGF0ZSkgOiAoJ05vIG1pc3Npb25zJyB8IHRyYW5zbGF0ZSl9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtXCIgKm5nRm9yPVwibGV0IG1pcyBvZiBhLm1pc3Npb25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCIgKm5nSWY9XCJtaXMuZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydEZXNjcmlwdGlvbicgfCB0cmFuc2xhdGV9fToge3ttaXMuZGVzY3JpcHRpb259fTwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiICpuZ0lmPVwibWlzLnRlbXBsYXRlTWlzc2lvbklEXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3snQXR0ZW5kZWUgb2YgdG91cicgfCB0cmFuc2xhdGV9fToge3ttaXMudGVtcGxhdGVNaXNzaW9uLnRpdGxlfX08L2xpPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J1JvbGUnIHwgdHJhbnNsYXRlfX06IHt7IG1pcy5yb2xlIH19PC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCIgKm5nSWY9XCJtaXMuaGFzaHRhZ3MgJiYgbWlzLmhhc2h0YWdzLmxlbmd0aD4gMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J0hhc2h0YWdzJyB8IHRyYW5zbGF0ZX19OiA8dWwgY2xhc3M9XCJrZXl3b3Jkc0Rpc3BsYXkgbm8tYm9yZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2V5d29yZHNkaXNwbGF5Q29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImtleXdvcmRzSXRlbVwiICpuZ0Zvcj1cImxldCBoYXNodGFnIG9mIG1pcy5oYXNodGFnc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGhhc2h0YWcgfCBoYXNodGFnRnJvbUlEIHwgYXN5bmMgfX08L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snTGFuZ3VhZ2UnIHwgdHJhbnNsYXRlIH19OiB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pcy5sb2NhbGUgPyBtaXMubG9jYWxlIDogKCdOb3QgYXBwbGljYWJsZScgfCB0cmFuc2xhdGUpfX08L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydBY2Nlc3MgbGV2ZWwnIHwgdHJhbnNsYXRlIH19OiB7e1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pcy5sZXZlbH19PC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snT3JkZXJlZCBieScgfCB0cmFuc2xhdGUgfX06IHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzLm9yZGVyZWRPcmdhbmlzYXRpb24ubmFtZX19PC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCIgKm5nSWY9XCJtaXMuZG9tYWluc1wiPnt7J0RvbWFpbnMnIHwgdHJhbnNsYXRlIH19OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7bWlzLmRvbWFpbnMgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbWFpbklkc1RvU3RyaW5nRm9yTWlzc2lvbihtaXMpIDogKFwiTm8gZGF0YVwiIHwgdHJhbnNsYXRlKSB9fTwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J0F1dGhvcml6ZWQgbG9jYXRpb24nIHwgdHJhbnNsYXRlIH19OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG1pcy5zcGFjZSA/IG1pcy5zcGFjZS5uYW1lIDogXCJObyBsb2NhdGlvblwiIHwgdHJhbnNsYXRlfX08L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydBdXRob3JpemVkIHpvbmUnIHwgdHJhbnNsYXRlIH19OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG1pcy56b25lID8gbWlzLnpvbmUubmFtZSA6IFwiQWxsIHpvbmVzIGFsbG93ZWRcIiB8IHRyYW5zbGF0ZX19PC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCI+e3snU3RhcnRzJyB8IHRyYW5zbGF0ZSB9fTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBtaXMuc3RhcnREYXRlVGltZSA/IChtaXMuc3RhcnREYXRlVGltZSB8IHRpbWVEYXRlU3RyaW5nOiBcImRheV90aW1lX3pvbmVcIiB8IGFzeW5jKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJObyBkYXRhXCIgfCB0cmFuc2xhdGV9fSwge3snRW5kcycgfCB0cmFuc2xhdGV9fToge3sgbWlzLmVuZERhdGVUaW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAobWlzLmVuZERhdGVUaW1lIHwgdGltZURhdGVTdHJpbmc6IFwiZGF5X3RpbWVfem9uZVwiIHwgYXN5bmMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcIk5vIGRhdGFcIiB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J0NyZWF0ZWQnIHwgdHJhbnNsYXRlIH19OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IG1pcy5jcmVhdGVkQXQgIHwgdGltZURhdGVTdHJpbmc6IFwiZGF5X3RpbWVfem9uZVwiIHwgYXN5bmMgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uLWJ1dHRvbi1jb250YWluZXJcIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtdGVzdGlkPVwiZWRpdC1taXNzaW9uLWJ0blwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1yLTIgYWN0aW9uLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRWRpdChtaXMpXCI+e3snRWRpdCcgfFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiICpuZ0lmPVwibWlzLnJvbGUgPT09ICdWSVNJVE9SJyB8fCBtaXMucm9sZSA9PT0gJ1ZJU0lUT1JfTVVTRVVNJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbXItMiBhY3Rpb24tYnV0dG9uIHNoYXJlLXZpc2l0b3ItYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25TZXRGb3JTaGFyZWFibGVMaW5rKGEudXNlciwgbWlzKVwiPnt7J0dlbmVyYXRlIFNoYXJlYWJsZSBMaW5rJyB8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgYWN0aW9uLWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGVsZXRlTWlzc2lvbihtaXMpXCI+e3snRGVsZXRlJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGxpc3QtZ3JvdXAtaXRlbS1hY3Rpb25cIiAqbmdJZj1cInByb2ZpbGVzV2l0aG91dE1pc3Npb24gJiYgcHJvZmlsZXNXaXRob3V0TWlzc2lvbi5sZW5ndGggPiAwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBmb250LXdlaWdodC1ib2xkXCJcbiAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cIlNlZSBkZXRhaWxzXCIgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7XCIgKGNsaWNrKT1cIm9uVG9nZ2xlRGV0YWlsT3JnKCctMicsIG51bGwpXCI+XG4gICAgICAgICAgICAgIHt7XCJVc2VycyB3aXRob3V0IG1pc3Npb25zXCIgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICA8bGliLWNoZXZyb24gW2NvbmRpdGlvblNob3dpbmddPVwiZGV0YWlsc09yZz09Jy0yJ1wiPjwvbGliLWNoZXZyb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtaXNzaW9uc1wiICpuZ0lmPVwiZGV0YWlsc09yZz09Jy0yJ1wiPlxuICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2hcIiBkYXRhLXRlc3RpZD1cIm1pc3Npb24tb3JnYW5pc2F0aW9uLWxpc3RcIj5cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gbGlzdC1ncm91cC1pdGVtLWFjdGlvblwiICpuZ0Zvcj1cImxldCBwcm9maWxlIG9mIHByb2ZpbGVzV2l0aG91dE1pc3Npb25cIiBcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Ub2dnbGVEZXRhaWxVc2VyKHByb2ZpbGUuaWQpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7cHJvZmlsZS5kaXNwbGF5TmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItY2hldnJvbiBbY29uZGl0aW9uU2hvd2luZ109XCJkZXRhaWxzVXNlcj09cHJvZmlsZS5pZFwiIFtuZ0NsYXNzXT1cIltnZXRTdHJpbmdOb1NwYWNlKHByb2ZpbGUuZGlzcGxheU5hbWUpXVwiPjwvbGliLWNoZXZyb24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZGV0YWlsc1VzZXI9PXByb2ZpbGUuaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBtdC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydFbWFpbCcgfCB0cmFuc2xhdGV9fToge3twcm9maWxlLmVtYWlsIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgcm91bmRlZC1waWxsXCIgZGF0YS10ZXN0aWQ9XCJtaXNzaW9uLW5ldy1idG5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQWRkRm9yVXNlcihjdXJyZW50T3JnLCBwcm9maWxlKVwiPnt7J0FkZCBuZXcgbWlzc2lvbicgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgcm91bmRlZC1waWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGVsZXRlVXNlcihwcm9maWxlKVwiPnt7J0RlbGV0ZSB1c2VyJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwiY3JlYXRlXCI+XG4gICAgICAgIDxsaWItdXNlci1taXNzaW9uLWZvcm0gW2FkZFRvT3JnYW5pc2F0aW9uXT1cImFkZFRvT3JnXCIgW2N1cnJlbnRPcmddPVwiY3VycmVudE9yZ1wiIFtpc1NQXT1cImlzU1BcIlxuICAgICAgICAgIChhZGRlZCk9XCJ1c2VyQWRkZWQoJGV2ZW50KVwiPlxuICAgICAgICA8L2xpYi11c2VyLW1pc3Npb24tZm9ybT5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiAqbmdJZj1cImVkaXRcIj5cbiAgICAgICAgPGxpYi1mb3JtLW1pc3Npb24gW21pc3Npb25Ub0VkaXRdPVwibWlzc2lvblRvRWRpdFwiIFtjdXJyZW50VXNlck9yZ2FuaXNhdGlvbl09XCJjdXJyZW50T3JnXCIgW2lzU1BdPVwiaXNTUFwiXG4gICAgICAgICAgKGFkZGVkTWlzc2lvbklucHV0KT1cIm9uTWlzc2lvbkVkaXRlZCgkZXZlbnQpXCI+PC9saWItZm9ybS1taXNzaW9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiY3JlYXRlRm9yRXhpc3RpbmdVc2VyXCI+XG4gICAgICAgIDxsaWItZm9ybS1taXNzaW9uIFtvcmdhbmlzYXRpb25Gb3JNaXNzaW9uXT1cImFkZFRvT3JnXCIgW2N1cnJlbnRVc2VyT3JnYW5pc2F0aW9uXT1cImN1cnJlbnRPcmdcIiBbaXNTUF09XCJpc1NQXCJcbiAgICAgICAgICBbdXNlckZvck1pc3Npb25JRF09XCJ1c2VyRm9yQWRkaW5nTWlzc2lvbi5pZFwiIChhZGRlZE1pc3Npb25JbnB1dCk9XCJvbk1pc3Npb25DcmVhdGVkKCRldmVudClcIj5cbiAgICAgICAgPC9saWItZm9ybS1taXNzaW9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwiaXNBZGRpbmdPcmcgfHwgaXNBZGRpbmdUb0V4aXN0aW5nT3JnXCI+XG4gICAgICAgIDxsaWItZm9ybS1vcmdhbmlzYXRpb24gW2N1cnJlbnRPcmddPVwiY3VycmVudE9yZ1wiIFtjdXJyZW50VXNlcl09XCJtZVwiIFtleGlzdGluZ109XCJpc0FkZGluZ1RvRXhpc3RpbmdPcmdcIlxuICAgICAgICAgIChhZGRlZCk9XCJvcmdBZGRlZCgkZXZlbnQpXCI+PC9saWItZm9ybS1vcmdhbmlzYXRpb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNCBjb2wtbGctNlwiICpuZ0lmPVwib3JnU2VsZWN0ZWREZXRhaWxzICYmICFpc0d1aWRlXCI+XG4gICAgICA8bGliLWRldGFpbC1vcmdhbmlzYXRpb24gW29yZ109XCJvcmdTZWxlY3RlZERldGFpbHNcIiBbY3VycmVudE9yZ109XCJjdXJyZW50T3JnXCIgW2lzU1BdPVwiaXNTUFwiXG4gICAgICAgIChvcmdDaGFuZ2VkKT0nb3JnQWRkZWQoJGV2ZW50KSc+PC9saWItZGV0YWlsLW9yZ2FuaXNhdGlvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj4iXX0=