@smarterplan/ngx-smarterplan-admin 0.1.61 → 0.1.63

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.
Files changed (48) hide show
  1. package/README.md +24 -24
  2. package/esm2020/lib/admin/admin.component.mjs +5 -5
  3. package/esm2020/lib/chevron/chevron.component.mjs +5 -5
  4. package/esm2020/lib/guest-link/guest-link.component.mjs +5 -5
  5. package/esm2020/lib/guide.guard.mjs +4 -4
  6. package/esm2020/lib/helpers.mjs +1 -1
  7. package/esm2020/lib/name-from-id.pipe.mjs +4 -4
  8. package/esm2020/lib/ngx-smarterplan-admin-routing.module.mjs +5 -5
  9. package/esm2020/lib/ngx-smarterplan-admin.module.mjs +5 -5
  10. package/esm2020/lib/ngx-smarterplan-admin.service.mjs +4 -4
  11. package/esm2020/lib/organisation/organisation.component.mjs +5 -5
  12. package/esm2020/lib/sp-admin.guard.mjs +7 -12
  13. package/esm2020/lib/user/detail-organisation/detail-organisation.component.mjs +5 -5
  14. package/esm2020/lib/user/form-mission/form-mission.component.mjs +5 -5
  15. package/esm2020/lib/user/form-organisation/form-organisation.component.mjs +5 -5
  16. package/esm2020/lib/user/user-mission-form/user-mission-form.component.mjs +5 -5
  17. package/esm2020/lib/user/user.component.mjs +5 -5
  18. package/esm2020/lib/visitor/create-batch/create-batch.component.mjs +5 -5
  19. package/esm2020/lib/visitor/template/template.component.mjs +5 -5
  20. package/esm2020/lib/visitor/visitor.component.mjs +5 -5
  21. package/esm2020/public-api.mjs +1 -1
  22. package/fesm2015/smarterplan-ngx-smarterplan-admin.mjs +71 -76
  23. package/fesm2015/smarterplan-ngx-smarterplan-admin.mjs.map +1 -1
  24. package/fesm2020/smarterplan-ngx-smarterplan-admin.mjs +71 -76
  25. package/fesm2020/smarterplan-ngx-smarterplan-admin.mjs.map +1 -1
  26. package/lib/sp-admin.guard.d.ts +2 -3
  27. package/package.json +14 -13
  28. package/lib/admin/admin.component.d.ts.map +0 -1
  29. package/lib/chevron/chevron.component.d.ts.map +0 -1
  30. package/lib/guest-link/guest-link.component.d.ts.map +0 -1
  31. package/lib/guide.guard.d.ts.map +0 -1
  32. package/lib/helpers.d.ts.map +0 -1
  33. package/lib/name-from-id.pipe.d.ts.map +0 -1
  34. package/lib/ngx-smarterplan-admin-routing.module.d.ts.map +0 -1
  35. package/lib/ngx-smarterplan-admin.module.d.ts.map +0 -1
  36. package/lib/ngx-smarterplan-admin.service.d.ts.map +0 -1
  37. package/lib/organisation/organisation.component.d.ts.map +0 -1
  38. package/lib/sp-admin.guard.d.ts.map +0 -1
  39. package/lib/user/detail-organisation/detail-organisation.component.d.ts.map +0 -1
  40. package/lib/user/form-mission/form-mission.component.d.ts.map +0 -1
  41. package/lib/user/form-organisation/form-organisation.component.d.ts.map +0 -1
  42. package/lib/user/user-mission-form/user-mission-form.component.d.ts.map +0 -1
  43. package/lib/user/user.component.d.ts.map +0 -1
  44. package/lib/visitor/create-batch/create-batch.component.d.ts.map +0 -1
  45. package/lib/visitor/template/template.component.d.ts.map +0 -1
  46. package/lib/visitor/visitor.component.d.ts.map +0 -1
  47. package/public-api.d.ts.map +0 -1
  48. package/smarterplan-ngx-smarterplan-admin.d.ts.map +0 -1
@@ -244,11 +244,11 @@ export class FormMissionComponent {
244
244
  }
245
245
  }
246
246
  }
247
- FormMissionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: FormMissionComponent, deps: [{ token: i1.FormBuilder }, { token: i2.SpaceService }, { token: i2.BaseUserService }, { token: i2.DomainService }, { token: i2.OrganisationService }, { token: i2.ZoneService }, { token: i2.HashtagService }, { token: i2.LocaleService }, { token: i2.ValidatorsService }], target: i0.ɵɵFactoryTarget.Component });
248
- FormMissionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: FormMissionComponent, selector: "lib-form-mission", inputs: { missionToEdit: "missionToEdit", organisationForMission: "organisationForMission", isSP: "isSP", userForMissionID: "userForMissionID", currentUserOrganisation: "currentUserOrganisation" }, outputs: { addedMissionInput: "addedMissionInput" }, ngImport: i0, template: "<div class=\"form-containter\" *ngIf=\"missionForm\">\n <div style=\"margin-top: 1rem;\">\n <h4>{{ 'Mission details' | translate }}</h4>\n </div>\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"missionForm\">\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{'Organisation' | translate}}</label>\n <div class=\"col-sm-8\">\n <input type=\"text\" data-testid=\"form-mission-organisation\" class=\"form-control\"\n formControlName=\"organisation\">\n </div>\n </div>\n\n <div class=\"form-group row\" *ngIf=\"isSP\">\n <label class=\"col-sm-4 col-form-label\">{{ 'Ordered by' | translate }}</label>\n <div class=\"col-sm-8\">\n <select class=\"form-control\" required formControlName=\"orderedOrganisationID\">\n <option *ngFor=\"let org of allOrgs\" [ngValue]=\"org.id\">\n {{ org.name }}\n </option>\n </select>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{'Description' | translate}}</label>\n <div class=\"col-sm-8\">\n <textarea class=\"form-control\" formControlName=\"description\" rows=\"10\" (ngModelChange)=\"onVerifForm()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['description'])|| isFormError(missionForm.controls['description'])} \"\n data-testid=\"form-mission-description\"></textarea>\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"form-mission-description-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['description']) \n || isFormError(missionForm.controls['description'])\">\n {{validatorsService.getError(missionForm.controls['description']) |\n translate}}\n </ngb-alert>\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{'Role' | translate}}*</label>\n <div class=\"col-sm-8\">\n <select class=\"form-control\" required formControlName=\"role\" data-testid=\"form-mission-role\" (ngModelChange)=\"onVerifForm()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['role'])|| isFormError(missionForm.controls['role'])} \">\n <option *ngFor=\"let r of availableRoles\" [ngValue]=\"r\">\n {{ r }}\n </option>\n </select>\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"form-mission-role-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['role']) \n || isFormError(missionForm.controls['role'])\">\n {{validatorsService.getError(missionForm.controls['role']) |\n translate}}\n </ngb-alert>\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\"\n *ngIf=\"missionForm.get('role').value !== 'VISITOR_MUSEUM' && missionForm.get('role').value !== 'GUIDE_MUSEUM'\">\n <label class=\"col-sm-4 col-form-label\">{{'Domains' | translate}}</label>\n <div class=\"col-sm-8\" *ngIf=\"domains\">\n <select class=\"form-control\" multiple formControlName=\"domains\">\n <option *ngFor=\"let domain of domains\" [ngValue]=\"domain.id\">\n {{ domain.name }}\n </option>\n </select>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{'Access level' | translate}}</label>\n <div class=\"col-sm-8\">\n <select class=\"form-control\" required formControlName=\"level\" data-testid=\"form-mission-level\">\n <option *ngFor=\"let level of availableLevels\" [ngValue]=\"level\">\n {{ level }}\n </option>\n </select>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{ 'Authorized location' | translate }}*</label>\n <div class=\"col-sm-8\" *ngIf=\"availableSpaces\">\n <select class=\"form-control\" required formControlName=\"space\" (ngModelChange)=\"onVerifForm()\" (change)=\"onSpaceClick()\"\n data-testid=\"form-mission-space\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['space'])|| isFormError(missionForm.controls['space'])} \">\n <option *ngFor=\"let space of availableSpaces\" [ngValue]=\"space.id\">\n {{ space.name }}\n </option>\n </select>\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"form-mission-space-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['space']) \n || isFormError(missionForm.controls['space'])\">\n {{validatorsService.getError(missionForm.controls['space']) |\n translate}}\n </ngb-alert>\n </div>\n </div>\n <div class=\"col-sm-8\" *ngIf=\"!availableSpaces\">\n {{ 'No locations available' | translate}}\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{ 'Authorized zone' | translate }}</label>\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace; else noSpace\">\n <select class=\"form-control\" formControlName=\"zone\" data-testid=\"form-mission-zone\">\n <option [ngValue]=\"defaultZone.id\">\n {{ 'All zones' | translate }}\n </option>\n <option *ngFor=\"let zone of zonesForSpace\" [ngValue]=\"zone.id\">\n {{ zone.name }}\n </option>\n </select>\n </div>\n <ng-template #noSpace>\n <div class=\"col-sm-8 hint-container\">\n <p class=\"hint keywordsRules\">{{'You need to choose the location first' | translate}} </p>\n </div>\n </ng-template>\n </div>\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{'Language' | translate}}</label>\n <div class=\"col-sm-8\">\n <select class=\"form-control\" formControlName=\"locale\">\n <option [ngValue]=\"null\">{{'Not applicable' | translate}}</option>\n <option *ngFor=\"let locale of locales\" [ngValue]=\"locale\">\n {{ locale }}\n </option>\n </select>\n </div>\n </div>\n <!-- Hashtags are available after Space is set -->\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{'Hashtags' | translate}}</label>\n <div class=\"col-sm-8\" *ngIf=\"spaceID.value\">\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length > 0\">{{'Available hashtags' | translate}} </p>\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length === 0\">\n {{'No hashtags created for this location' | translate}} </p>\n <div *ngIf=\"availableHashtags.length > 0\">\n <ul class=\"keywordsDisplay no-border\">\n <div class=\"keywordsdisplayContainer\">\n <li *ngFor=\"let hashtag of availableHashtags\"\n [class]=\"hashtagAdded(hashtag) ? 'keywordsItem added' : 'keywordsItem'\"\n (click)=\"onHashtagClick(hashtag)\" style=\"cursor: pointer;\"\n ngbTooltip=\"{{hashtagAdded(hashtag) ? ('Remove'|translate) : ('Add'|translate) }}\">\n {{hashtag.name}}\n </li>\n </div>\n </ul>\n <p class=\"keywordsRules\">{{'Added hashtags' | translate}} </p>\n <ul class=\"keywordsDisplay\">\n <div class=\"keywordsdisplayContainer\" *ngIf=\"addedHashtags.length> 0\">\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of addedHashtags\">{{ hashtag.name }}\n <a type=\"button\" class=\"closeButton\" (click)=\"removeHashtag(hashtag)\">\n <span class=\"crossItem\"></span>\n </a>\n </li>\n </div>\n </ul>\n </div>\n </div>\n <div class=\"col-sm-8 hint-container\" *ngIf=\"!spaceID.value\">\n <p class=\"hint keywordsRules\">{{'You need to choose the location first' | translate}} </p>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{'Mission Start Date' | translate}}</label>\n <div class=\"input-group col-sm-8\">\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" formControlName=\"startDate\" ngbDatepicker\n #d1=\"ngbDatepicker\" data-testid=\"form-mission-startDate\" (ngModelChange)=\"onVerifDate();onVerifForm()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['startDate'])|| isFormError(missionForm.controls['startDate'])} \">\n <div class=\"input-group-append\">\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d1.toggle()\" type=\"button\"></button>\n </div>\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"form-mission-startDate-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['startDate']) \n || isFormError(missionForm.controls['startDate'])\">\n {{validatorsService.getError(missionForm.controls['startDate']) |\n translate}}\n </ngb-alert>\n\n <ngb-alert data-testid=\"form-mission-startDate-invalid-verif\" [dismissible]=\"false\" type=\"danger\"\n *ngIf=\"dateError\">\n {{'errorForm.date_start_end' |\n translate}}\n </ngb-alert>\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{'Mission Start Time' | translate}}</label>\n <div class=\"input-group col-sm-8 timeZoneContainer\">\n <ngb-timepicker [(ngModel)]=\"missionTimeStart\" [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onVerifDate();onVerifForm()\"></ngb-timepicker>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{'Mission End Date' | translate}}</label>\n <div class=\"input-group col-sm-8\">\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" ngbDatepicker #d2=\"ngbDatepicker\"\n formControlName=\"endDate\" data-testid=\"form-mission-endDate\"\n [class.is-invalid]=\"validatorsService.isControlError(missionForm.controls['endDate'])\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['endDate'])|| isFormError(missionForm.controls['endDate'])} \"\n (ngModelChange)=\"onVerifDate();onVerifForm()\">\n <div class=\"input-group-append\">\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d2.toggle()\" type=\"button\"></button>\n </div>\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"form-mission-endDate-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['endDate']) \n || isFormError(missionForm.controls['endDate'])\">\n {{validatorsService.getError(missionForm.controls['endDate']) |\n translate}}\n </ngb-alert>\n\n <ngb-alert data-testid=\"form-mission-endDate-invalid-verif\" [dismissible]=\"false\" type=\"danger\"\n *ngIf=\"dateError\">\n {{'errorForm.date_end_start' |\n translate}}\n </ngb-alert>\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{'Mission End Time' | translate}}</label>\n <div class=\"input-group col-sm-8 timeZoneContainer\">\n <ngb-timepicker [(ngModel)]=\"missionTimeEnd\" [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onVerifDate();onVerifForm()\"></ngb-timepicker>\n </div>\n </div>\n\n <div class=\"btn-control-div action-button-container\">\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\n data-testid=\"form-mission-submit-btn\" [ngClass]=\"{'is-invalid' : errorForm }\">{{'Save' |\n translate}}</button>\n <button type=\"button\" (click)=\"onCancel()\" data-testid=\"form-mission-cancel-btn\"\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' |\n translate}}</button>\n </div>\n <div class=\"invalid-feedback\" *ngIf=\"errorForm\">\n <ngb-alert data-testid=\"form-mission-invalid\" [dismissible]=\"false\" type=\"danger\">\n {{'errorForm.infoBtn' |translate}}\n </ngb-alert>\n </div>\n </form>\n</div>", styles: [".form-containter{padding:0rem 1rem;margin-bottom:2rem}.checkbox-apply{margin-top:calc(.375rem + 1px)}.keywordsDisplay{min-height:40px}.hint{margin:0!important}.hint-container{display:flex;align-items:center}.crossItem{margin:0;padding:0;border:0;background:none;position:relative;width:7px;height:20px}.crossItem:before,.crossItem:after{content:\"\";position:absolute;top:6.25px;left:0;right:0;height:1.5px;background:#fff;border-radius:1.5px}.crossItem:before{transform:rotate(45deg)}.crossItem:after{transform:rotate(-45deg)}.crossItem span{display:block}.btn-control-div .btn{width:8rem}.timeZoneContainer{align-items:center}.timeZoneContainer span{margin-left:5px}.form-group{margin:1.5rem 0}label.col-sm-4.col-form-label{width:200px;min-width:200px}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"], components: [{ type: i3.NgbAlert, selector: "ngb-alert", inputs: ["animation", "dismissible", "type"], outputs: ["closed"], exportAs: ["ngbAlert"] }, { type: i3.NgbTimepicker, selector: "ngb-timepicker", inputs: ["meridian", "spinners", "seconds", "hourStep", "minuteStep", "secondStep", "readonlyInputs", "size"] }], directives: [{ type: i4.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.SelectMultipleControlValueAccessor, selector: "select[multiple][formControlName],select[multiple][formControl],select[multiple][ngModel]", inputs: ["compareWith"] }, { type: i3.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { type: i3.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "translate": i5.TranslatePipe } });
249
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: FormMissionComponent, decorators: [{
247
+ FormMissionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: FormMissionComponent, deps: [{ token: i1.FormBuilder }, { token: i2.SpaceService }, { token: i2.BaseUserService }, { token: i2.DomainService }, { token: i2.OrganisationService }, { token: i2.ZoneService }, { token: i2.HashtagService }, { token: i2.LocaleService }, { token: i2.ValidatorsService }], target: i0.ɵɵFactoryTarget.Component });
248
+ FormMissionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: FormMissionComponent, selector: "lib-form-mission", inputs: { missionToEdit: "missionToEdit", organisationForMission: "organisationForMission", isSP: "isSP", userForMissionID: "userForMissionID", currentUserOrganisation: "currentUserOrganisation" }, outputs: { addedMissionInput: "addedMissionInput" }, ngImport: i0, template: "<div class=\"form-containter\" *ngIf=\"missionForm\">\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'Mission details' | translate }}</h4>\r\n </div>\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"missionForm\">\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Organisation' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" data-testid=\"form-mission-organisation\" class=\"form-control\"\r\n formControlName=\"organisation\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\" *ngIf=\"isSP\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Ordered by' | translate }}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" required formControlName=\"orderedOrganisationID\">\r\n <option *ngFor=\"let org of allOrgs\" [ngValue]=\"org.id\">\r\n {{ org.name }}\r\n </option>\r\n </select>\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\">{{'Description' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <textarea class=\"form-control\" formControlName=\"description\" rows=\"10\" (ngModelChange)=\"onVerifForm()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['description'])|| isFormError(missionForm.controls['description'])} \"\r\n data-testid=\"form-mission-description\"></textarea>\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"form-mission-description-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['description']) \r\n || isFormError(missionForm.controls['description'])\">\r\n {{validatorsService.getError(missionForm.controls['description']) |\r\n translate}}\r\n </ngb-alert>\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\">{{'Role' | translate}}*</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" required formControlName=\"role\" data-testid=\"form-mission-role\" (ngModelChange)=\"onVerifForm()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['role'])|| isFormError(missionForm.controls['role'])} \">\r\n <option *ngFor=\"let r of availableRoles\" [ngValue]=\"r\">\r\n {{ r }}\r\n </option>\r\n </select>\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"form-mission-role-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['role']) \r\n || isFormError(missionForm.controls['role'])\">\r\n {{validatorsService.getError(missionForm.controls['role']) |\r\n translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\"\r\n *ngIf=\"missionForm.get('role').value !== 'VISITOR_MUSEUM' && missionForm.get('role').value !== 'GUIDE_MUSEUM'\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Domains' | translate}}</label>\r\n <div class=\"col-sm-8\" *ngIf=\"domains\">\r\n <select class=\"form-control\" multiple formControlName=\"domains\">\r\n <option *ngFor=\"let domain of domains\" [ngValue]=\"domain.id\">\r\n {{ domain.name }}\r\n </option>\r\n </select>\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\">{{'Access level' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" required formControlName=\"level\" data-testid=\"form-mission-level\">\r\n <option *ngFor=\"let level of availableLevels\" [ngValue]=\"level\">\r\n {{ level }}\r\n </option>\r\n </select>\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\">{{ 'Authorized location' | translate }}*</label>\r\n <div class=\"col-sm-8\" *ngIf=\"availableSpaces\">\r\n <select class=\"form-control\" required formControlName=\"space\" (ngModelChange)=\"onVerifForm()\" (change)=\"onSpaceClick()\"\r\n data-testid=\"form-mission-space\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['space'])|| isFormError(missionForm.controls['space'])} \">\r\n <option *ngFor=\"let space of availableSpaces\" [ngValue]=\"space.id\">\r\n {{ space.name }}\r\n </option>\r\n </select>\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"form-mission-space-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['space']) \r\n || isFormError(missionForm.controls['space'])\">\r\n {{validatorsService.getError(missionForm.controls['space']) |\r\n translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"!availableSpaces\">\r\n {{ 'No locations available' | translate}}\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\">{{ 'Authorized zone' | translate }}</label>\r\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace; else noSpace\">\r\n <select class=\"form-control\" formControlName=\"zone\" data-testid=\"form-mission-zone\">\r\n <option [ngValue]=\"defaultZone.id\">\r\n {{ 'All zones' | translate }}\r\n </option>\r\n <option *ngFor=\"let zone of zonesForSpace\" [ngValue]=\"zone.id\">\r\n {{ zone.name }}\r\n </option>\r\n </select>\r\n </div>\r\n <ng-template #noSpace>\r\n <div class=\"col-sm-8 hint-container\">\r\n <p class=\"hint keywordsRules\">{{'You need to choose the location first' | translate}} </p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Language' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" formControlName=\"locale\">\r\n <option [ngValue]=\"null\">{{'Not applicable' | translate}}</option>\r\n <option *ngFor=\"let locale of locales\" [ngValue]=\"locale\">\r\n {{ locale }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n <!-- Hashtags are available after Space is set -->\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Hashtags' | translate}}</label>\r\n <div class=\"col-sm-8\" *ngIf=\"spaceID.value\">\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length > 0\">{{'Available hashtags' | translate}} </p>\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length === 0\">\r\n {{'No hashtags created for this location' | translate}} </p>\r\n <div *ngIf=\"availableHashtags.length > 0\">\r\n <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\">\r\n <li *ngFor=\"let hashtag of availableHashtags\"\r\n [class]=\"hashtagAdded(hashtag) ? 'keywordsItem added' : 'keywordsItem'\"\r\n (click)=\"onHashtagClick(hashtag)\" style=\"cursor: pointer;\"\r\n ngbTooltip=\"{{hashtagAdded(hashtag) ? ('Remove'|translate) : ('Add'|translate) }}\">\r\n {{hashtag.name}}\r\n </li>\r\n </div>\r\n </ul>\r\n <p class=\"keywordsRules\">{{'Added hashtags' | translate}} </p>\r\n <ul class=\"keywordsDisplay\">\r\n <div class=\"keywordsdisplayContainer\" *ngIf=\"addedHashtags.length> 0\">\r\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of addedHashtags\">{{ hashtag.name }}\r\n <a type=\"button\" class=\"closeButton\" (click)=\"removeHashtag(hashtag)\">\r\n <span class=\"crossItem\"></span>\r\n </a>\r\n </li>\r\n </div>\r\n </ul>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8 hint-container\" *ngIf=\"!spaceID.value\">\r\n <p class=\"hint keywordsRules\">{{'You need to choose the location first' | translate}} </p>\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\">{{'Mission Start Date' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" formControlName=\"startDate\" ngbDatepicker\r\n #d1=\"ngbDatepicker\" data-testid=\"form-mission-startDate\" (ngModelChange)=\"onVerifDate();onVerifForm()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['startDate'])|| isFormError(missionForm.controls['startDate'])} \">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d1.toggle()\" type=\"button\"></button>\r\n </div>\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"form-mission-startDate-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['startDate']) \r\n || isFormError(missionForm.controls['startDate'])\">\r\n {{validatorsService.getError(missionForm.controls['startDate']) |\r\n translate}}\r\n </ngb-alert>\r\n\r\n <ngb-alert data-testid=\"form-mission-startDate-invalid-verif\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"dateError\">\r\n {{'errorForm.date_start_end' |\r\n translate}}\r\n </ngb-alert>\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\">{{'Mission Start Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8 timeZoneContainer\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeStart\" [ngModelOptions]=\"{standalone: true}\"\r\n (ngModelChange)=\"onVerifDate();onVerifForm()\"></ngb-timepicker>\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\">{{'Mission End Date' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" ngbDatepicker #d2=\"ngbDatepicker\"\r\n formControlName=\"endDate\" data-testid=\"form-mission-endDate\"\r\n [class.is-invalid]=\"validatorsService.isControlError(missionForm.controls['endDate'])\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['endDate'])|| isFormError(missionForm.controls['endDate'])} \"\r\n (ngModelChange)=\"onVerifDate();onVerifForm()\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d2.toggle()\" type=\"button\"></button>\r\n </div>\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"form-mission-endDate-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['endDate']) \r\n || isFormError(missionForm.controls['endDate'])\">\r\n {{validatorsService.getError(missionForm.controls['endDate']) |\r\n translate}}\r\n </ngb-alert>\r\n\r\n <ngb-alert data-testid=\"form-mission-endDate-invalid-verif\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"dateError\">\r\n {{'errorForm.date_end_start' |\r\n translate}}\r\n </ngb-alert>\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\">{{'Mission End Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8 timeZoneContainer\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeEnd\" [ngModelOptions]=\"{standalone: true}\"\r\n (ngModelChange)=\"onVerifDate();onVerifForm()\"></ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n <div class=\"btn-control-div action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\r\n data-testid=\"form-mission-submit-btn\" [ngClass]=\"{'is-invalid' : errorForm }\">{{'Save' |\r\n translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" data-testid=\"form-mission-cancel-btn\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' |\r\n translate}}</button>\r\n </div>\r\n <div class=\"invalid-feedback\" *ngIf=\"errorForm\">\r\n <ngb-alert data-testid=\"form-mission-invalid\" [dismissible]=\"false\" type=\"danger\">\r\n {{'errorForm.infoBtn' |translate}}\r\n </ngb-alert>\r\n </div>\r\n </form>\r\n</div>", styles: [".form-containter{padding:0rem 1rem;margin-bottom:2rem}.checkbox-apply{margin-top:calc(.375rem + 1px)}.keywordsDisplay{min-height:40px}.hint{margin:0!important}.hint-container{display:flex;align-items:center}.crossItem{margin:0;padding:0;border:0;background:none;position:relative;width:7px;height:20px}.crossItem:before,.crossItem:after{content:\"\";position:absolute;top:6.25px;left:0;right:0;height:1.5px;background:#fff;border-radius:1.5px}.crossItem:before{transform:rotate(45deg)}.crossItem:after{transform:rotate(-45deg)}.crossItem span{display:block}.btn-control-div .btn{width:8rem}.timeZoneContainer{align-items:center}.timeZoneContainer span{margin-left:5px}.form-group{margin:1.5rem 0}label.col-sm-4.col-form-label{width:200px;min-width:200px}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"], components: [{ type: i3.NgbAlert, selector: "ngb-alert", inputs: ["animation", "dismissible", "type"], outputs: ["closed"], exportAs: ["ngbAlert"] }, { type: i3.NgbTimepicker, selector: "ngb-timepicker", inputs: ["meridian", "spinners", "seconds", "hourStep", "minuteStep", "secondStep", "readonlyInputs", "size"] }], directives: [{ type: i4.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.SelectMultipleControlValueAccessor, selector: "select[multiple][formControlName],select[multiple][formControl],select[multiple][ngModel]", inputs: ["compareWith"] }, { type: i3.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "triggers", "container", "disableTooltip", "tooltipClass", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { type: i3.NgbInputDatepicker, selector: "input[ngbDatepicker]", inputs: ["autoClose", "datepickerClass", "dayTemplate", "dayTemplateData", "displayMonths", "firstDayOfWeek", "footerTemplate", "markDisabled", "minDate", "maxDate", "navigation", "outsideDays", "placement", "restoreFocus", "showWeekNumbers", "startDate", "container", "positionTarget", "weekdays", "disabled"], outputs: ["dateSelect", "navigate", "closed"], exportAs: ["ngbDatepicker"] }, { type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], pipes: { "translate": i5.TranslatePipe } });
249
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: FormMissionComponent, decorators: [{
250
250
  type: Component,
251
- args: [{ selector: 'lib-form-mission', template: "<div class=\"form-containter\" *ngIf=\"missionForm\">\n <div style=\"margin-top: 1rem;\">\n <h4>{{ 'Mission details' | translate }}</h4>\n </div>\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"missionForm\">\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{'Organisation' | translate}}</label>\n <div class=\"col-sm-8\">\n <input type=\"text\" data-testid=\"form-mission-organisation\" class=\"form-control\"\n formControlName=\"organisation\">\n </div>\n </div>\n\n <div class=\"form-group row\" *ngIf=\"isSP\">\n <label class=\"col-sm-4 col-form-label\">{{ 'Ordered by' | translate }}</label>\n <div class=\"col-sm-8\">\n <select class=\"form-control\" required formControlName=\"orderedOrganisationID\">\n <option *ngFor=\"let org of allOrgs\" [ngValue]=\"org.id\">\n {{ org.name }}\n </option>\n </select>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{'Description' | translate}}</label>\n <div class=\"col-sm-8\">\n <textarea class=\"form-control\" formControlName=\"description\" rows=\"10\" (ngModelChange)=\"onVerifForm()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['description'])|| isFormError(missionForm.controls['description'])} \"\n data-testid=\"form-mission-description\"></textarea>\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"form-mission-description-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['description']) \n || isFormError(missionForm.controls['description'])\">\n {{validatorsService.getError(missionForm.controls['description']) |\n translate}}\n </ngb-alert>\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{'Role' | translate}}*</label>\n <div class=\"col-sm-8\">\n <select class=\"form-control\" required formControlName=\"role\" data-testid=\"form-mission-role\" (ngModelChange)=\"onVerifForm()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['role'])|| isFormError(missionForm.controls['role'])} \">\n <option *ngFor=\"let r of availableRoles\" [ngValue]=\"r\">\n {{ r }}\n </option>\n </select>\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"form-mission-role-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['role']) \n || isFormError(missionForm.controls['role'])\">\n {{validatorsService.getError(missionForm.controls['role']) |\n translate}}\n </ngb-alert>\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\"\n *ngIf=\"missionForm.get('role').value !== 'VISITOR_MUSEUM' && missionForm.get('role').value !== 'GUIDE_MUSEUM'\">\n <label class=\"col-sm-4 col-form-label\">{{'Domains' | translate}}</label>\n <div class=\"col-sm-8\" *ngIf=\"domains\">\n <select class=\"form-control\" multiple formControlName=\"domains\">\n <option *ngFor=\"let domain of domains\" [ngValue]=\"domain.id\">\n {{ domain.name }}\n </option>\n </select>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{'Access level' | translate}}</label>\n <div class=\"col-sm-8\">\n <select class=\"form-control\" required formControlName=\"level\" data-testid=\"form-mission-level\">\n <option *ngFor=\"let level of availableLevels\" [ngValue]=\"level\">\n {{ level }}\n </option>\n </select>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{ 'Authorized location' | translate }}*</label>\n <div class=\"col-sm-8\" *ngIf=\"availableSpaces\">\n <select class=\"form-control\" required formControlName=\"space\" (ngModelChange)=\"onVerifForm()\" (change)=\"onSpaceClick()\"\n data-testid=\"form-mission-space\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['space'])|| isFormError(missionForm.controls['space'])} \">\n <option *ngFor=\"let space of availableSpaces\" [ngValue]=\"space.id\">\n {{ space.name }}\n </option>\n </select>\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"form-mission-space-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['space']) \n || isFormError(missionForm.controls['space'])\">\n {{validatorsService.getError(missionForm.controls['space']) |\n translate}}\n </ngb-alert>\n </div>\n </div>\n <div class=\"col-sm-8\" *ngIf=\"!availableSpaces\">\n {{ 'No locations available' | translate}}\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{ 'Authorized zone' | translate }}</label>\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace; else noSpace\">\n <select class=\"form-control\" formControlName=\"zone\" data-testid=\"form-mission-zone\">\n <option [ngValue]=\"defaultZone.id\">\n {{ 'All zones' | translate }}\n </option>\n <option *ngFor=\"let zone of zonesForSpace\" [ngValue]=\"zone.id\">\n {{ zone.name }}\n </option>\n </select>\n </div>\n <ng-template #noSpace>\n <div class=\"col-sm-8 hint-container\">\n <p class=\"hint keywordsRules\">{{'You need to choose the location first' | translate}} </p>\n </div>\n </ng-template>\n </div>\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{'Language' | translate}}</label>\n <div class=\"col-sm-8\">\n <select class=\"form-control\" formControlName=\"locale\">\n <option [ngValue]=\"null\">{{'Not applicable' | translate}}</option>\n <option *ngFor=\"let locale of locales\" [ngValue]=\"locale\">\n {{ locale }}\n </option>\n </select>\n </div>\n </div>\n <!-- Hashtags are available after Space is set -->\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{'Hashtags' | translate}}</label>\n <div class=\"col-sm-8\" *ngIf=\"spaceID.value\">\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length > 0\">{{'Available hashtags' | translate}} </p>\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length === 0\">\n {{'No hashtags created for this location' | translate}} </p>\n <div *ngIf=\"availableHashtags.length > 0\">\n <ul class=\"keywordsDisplay no-border\">\n <div class=\"keywordsdisplayContainer\">\n <li *ngFor=\"let hashtag of availableHashtags\"\n [class]=\"hashtagAdded(hashtag) ? 'keywordsItem added' : 'keywordsItem'\"\n (click)=\"onHashtagClick(hashtag)\" style=\"cursor: pointer;\"\n ngbTooltip=\"{{hashtagAdded(hashtag) ? ('Remove'|translate) : ('Add'|translate) }}\">\n {{hashtag.name}}\n </li>\n </div>\n </ul>\n <p class=\"keywordsRules\">{{'Added hashtags' | translate}} </p>\n <ul class=\"keywordsDisplay\">\n <div class=\"keywordsdisplayContainer\" *ngIf=\"addedHashtags.length> 0\">\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of addedHashtags\">{{ hashtag.name }}\n <a type=\"button\" class=\"closeButton\" (click)=\"removeHashtag(hashtag)\">\n <span class=\"crossItem\"></span>\n </a>\n </li>\n </div>\n </ul>\n </div>\n </div>\n <div class=\"col-sm-8 hint-container\" *ngIf=\"!spaceID.value\">\n <p class=\"hint keywordsRules\">{{'You need to choose the location first' | translate}} </p>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{'Mission Start Date' | translate}}</label>\n <div class=\"input-group col-sm-8\">\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" formControlName=\"startDate\" ngbDatepicker\n #d1=\"ngbDatepicker\" data-testid=\"form-mission-startDate\" (ngModelChange)=\"onVerifDate();onVerifForm()\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['startDate'])|| isFormError(missionForm.controls['startDate'])} \">\n <div class=\"input-group-append\">\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d1.toggle()\" type=\"button\"></button>\n </div>\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"form-mission-startDate-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['startDate']) \n || isFormError(missionForm.controls['startDate'])\">\n {{validatorsService.getError(missionForm.controls['startDate']) |\n translate}}\n </ngb-alert>\n\n <ngb-alert data-testid=\"form-mission-startDate-invalid-verif\" [dismissible]=\"false\" type=\"danger\"\n *ngIf=\"dateError\">\n {{'errorForm.date_start_end' |\n translate}}\n </ngb-alert>\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{'Mission Start Time' | translate}}</label>\n <div class=\"input-group col-sm-8 timeZoneContainer\">\n <ngb-timepicker [(ngModel)]=\"missionTimeStart\" [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onVerifDate();onVerifForm()\"></ngb-timepicker>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{'Mission End Date' | translate}}</label>\n <div class=\"input-group col-sm-8\">\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" ngbDatepicker #d2=\"ngbDatepicker\"\n formControlName=\"endDate\" data-testid=\"form-mission-endDate\"\n [class.is-invalid]=\"validatorsService.isControlError(missionForm.controls['endDate'])\"\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['endDate'])|| isFormError(missionForm.controls['endDate'])} \"\n (ngModelChange)=\"onVerifDate();onVerifForm()\">\n <div class=\"input-group-append\">\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d2.toggle()\" type=\"button\"></button>\n </div>\n <div class=\"invalid-feedback\">\n <ngb-alert data-testid=\"form-mission-endDate-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['endDate']) \n || isFormError(missionForm.controls['endDate'])\">\n {{validatorsService.getError(missionForm.controls['endDate']) |\n translate}}\n </ngb-alert>\n\n <ngb-alert data-testid=\"form-mission-endDate-invalid-verif\" [dismissible]=\"false\" type=\"danger\"\n *ngIf=\"dateError\">\n {{'errorForm.date_end_start' |\n translate}}\n </ngb-alert>\n </div>\n </div>\n </div>\n\n <div class=\"form-group row\">\n <label class=\"col-sm-4 col-form-label\">{{'Mission End Time' | translate}}</label>\n <div class=\"input-group col-sm-8 timeZoneContainer\">\n <ngb-timepicker [(ngModel)]=\"missionTimeEnd\" [ngModelOptions]=\"{standalone: true}\"\n (ngModelChange)=\"onVerifDate();onVerifForm()\"></ngb-timepicker>\n </div>\n </div>\n\n <div class=\"btn-control-div action-button-container\">\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\n data-testid=\"form-mission-submit-btn\" [ngClass]=\"{'is-invalid' : errorForm }\">{{'Save' |\n translate}}</button>\n <button type=\"button\" (click)=\"onCancel()\" data-testid=\"form-mission-cancel-btn\"\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' |\n translate}}</button>\n </div>\n <div class=\"invalid-feedback\" *ngIf=\"errorForm\">\n <ngb-alert data-testid=\"form-mission-invalid\" [dismissible]=\"false\" type=\"danger\">\n {{'errorForm.infoBtn' |translate}}\n </ngb-alert>\n </div>\n </form>\n</div>", styles: [".form-containter{padding:0rem 1rem;margin-bottom:2rem}.checkbox-apply{margin-top:calc(.375rem + 1px)}.keywordsDisplay{min-height:40px}.hint{margin:0!important}.hint-container{display:flex;align-items:center}.crossItem{margin:0;padding:0;border:0;background:none;position:relative;width:7px;height:20px}.crossItem:before,.crossItem:after{content:\"\";position:absolute;top:6.25px;left:0;right:0;height:1.5px;background:#fff;border-radius:1.5px}.crossItem:before{transform:rotate(45deg)}.crossItem:after{transform:rotate(-45deg)}.crossItem span{display:block}.btn-control-div .btn{width:8rem}.timeZoneContainer{align-items:center}.timeZoneContainer span{margin-left:5px}.form-group{margin:1.5rem 0}label.col-sm-4.col-form-label{width:200px;min-width:200px}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"] }]
251
+ args: [{ selector: 'lib-form-mission', template: "<div class=\"form-containter\" *ngIf=\"missionForm\">\r\n <div style=\"margin-top: 1rem;\">\r\n <h4>{{ 'Mission details' | translate }}</h4>\r\n </div>\r\n <form (ngSubmit)=\"onSubmit()\" [formGroup]=\"missionForm\">\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Organisation' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <input type=\"text\" data-testid=\"form-mission-organisation\" class=\"form-control\"\r\n formControlName=\"organisation\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\" *ngIf=\"isSP\">\r\n <label class=\"col-sm-4 col-form-label\">{{ 'Ordered by' | translate }}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" required formControlName=\"orderedOrganisationID\">\r\n <option *ngFor=\"let org of allOrgs\" [ngValue]=\"org.id\">\r\n {{ org.name }}\r\n </option>\r\n </select>\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\">{{'Description' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <textarea class=\"form-control\" formControlName=\"description\" rows=\"10\" (ngModelChange)=\"onVerifForm()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['description'])|| isFormError(missionForm.controls['description'])} \"\r\n data-testid=\"form-mission-description\"></textarea>\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"form-mission-description-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['description']) \r\n || isFormError(missionForm.controls['description'])\">\r\n {{validatorsService.getError(missionForm.controls['description']) |\r\n translate}}\r\n </ngb-alert>\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\">{{'Role' | translate}}*</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" required formControlName=\"role\" data-testid=\"form-mission-role\" (ngModelChange)=\"onVerifForm()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['role'])|| isFormError(missionForm.controls['role'])} \">\r\n <option *ngFor=\"let r of availableRoles\" [ngValue]=\"r\">\r\n {{ r }}\r\n </option>\r\n </select>\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"form-mission-role-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['role']) \r\n || isFormError(missionForm.controls['role'])\">\r\n {{validatorsService.getError(missionForm.controls['role']) |\r\n translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group row\"\r\n *ngIf=\"missionForm.get('role').value !== 'VISITOR_MUSEUM' && missionForm.get('role').value !== 'GUIDE_MUSEUM'\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Domains' | translate}}</label>\r\n <div class=\"col-sm-8\" *ngIf=\"domains\">\r\n <select class=\"form-control\" multiple formControlName=\"domains\">\r\n <option *ngFor=\"let domain of domains\" [ngValue]=\"domain.id\">\r\n {{ domain.name }}\r\n </option>\r\n </select>\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\">{{'Access level' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" required formControlName=\"level\" data-testid=\"form-mission-level\">\r\n <option *ngFor=\"let level of availableLevels\" [ngValue]=\"level\">\r\n {{ level }}\r\n </option>\r\n </select>\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\">{{ 'Authorized location' | translate }}*</label>\r\n <div class=\"col-sm-8\" *ngIf=\"availableSpaces\">\r\n <select class=\"form-control\" required formControlName=\"space\" (ngModelChange)=\"onVerifForm()\" (change)=\"onSpaceClick()\"\r\n data-testid=\"form-mission-space\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['space'])|| isFormError(missionForm.controls['space'])} \">\r\n <option *ngFor=\"let space of availableSpaces\" [ngValue]=\"space.id\">\r\n {{ space.name }}\r\n </option>\r\n </select>\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"form-mission-space-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['space']) \r\n || isFormError(missionForm.controls['space'])\">\r\n {{validatorsService.getError(missionForm.controls['space']) |\r\n translate}}\r\n </ngb-alert>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8\" *ngIf=\"!availableSpaces\">\r\n {{ 'No locations available' | translate}}\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\">{{ 'Authorized zone' | translate }}</label>\r\n <div class=\"col-sm-8\" *ngIf=\"zonesForSpace; else noSpace\">\r\n <select class=\"form-control\" formControlName=\"zone\" data-testid=\"form-mission-zone\">\r\n <option [ngValue]=\"defaultZone.id\">\r\n {{ 'All zones' | translate }}\r\n </option>\r\n <option *ngFor=\"let zone of zonesForSpace\" [ngValue]=\"zone.id\">\r\n {{ zone.name }}\r\n </option>\r\n </select>\r\n </div>\r\n <ng-template #noSpace>\r\n <div class=\"col-sm-8 hint-container\">\r\n <p class=\"hint keywordsRules\">{{'You need to choose the location first' | translate}} </p>\r\n </div>\r\n </ng-template>\r\n </div>\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Language' | translate}}</label>\r\n <div class=\"col-sm-8\">\r\n <select class=\"form-control\" formControlName=\"locale\">\r\n <option [ngValue]=\"null\">{{'Not applicable' | translate}}</option>\r\n <option *ngFor=\"let locale of locales\" [ngValue]=\"locale\">\r\n {{ locale }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n <!-- Hashtags are available after Space is set -->\r\n <div class=\"form-group row\">\r\n <label class=\"col-sm-4 col-form-label\">{{'Hashtags' | translate}}</label>\r\n <div class=\"col-sm-8\" *ngIf=\"spaceID.value\">\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length > 0\">{{'Available hashtags' | translate}} </p>\r\n <p class=\"keywordsRules\" *ngIf=\"availableHashtags.length === 0\">\r\n {{'No hashtags created for this location' | translate}} </p>\r\n <div *ngIf=\"availableHashtags.length > 0\">\r\n <ul class=\"keywordsDisplay no-border\">\r\n <div class=\"keywordsdisplayContainer\">\r\n <li *ngFor=\"let hashtag of availableHashtags\"\r\n [class]=\"hashtagAdded(hashtag) ? 'keywordsItem added' : 'keywordsItem'\"\r\n (click)=\"onHashtagClick(hashtag)\" style=\"cursor: pointer;\"\r\n ngbTooltip=\"{{hashtagAdded(hashtag) ? ('Remove'|translate) : ('Add'|translate) }}\">\r\n {{hashtag.name}}\r\n </li>\r\n </div>\r\n </ul>\r\n <p class=\"keywordsRules\">{{'Added hashtags' | translate}} </p>\r\n <ul class=\"keywordsDisplay\">\r\n <div class=\"keywordsdisplayContainer\" *ngIf=\"addedHashtags.length> 0\">\r\n <li class=\"keywordsItem\" *ngFor=\"let hashtag of addedHashtags\">{{ hashtag.name }}\r\n <a type=\"button\" class=\"closeButton\" (click)=\"removeHashtag(hashtag)\">\r\n <span class=\"crossItem\"></span>\r\n </a>\r\n </li>\r\n </div>\r\n </ul>\r\n </div>\r\n </div>\r\n <div class=\"col-sm-8 hint-container\" *ngIf=\"!spaceID.value\">\r\n <p class=\"hint keywordsRules\">{{'You need to choose the location first' | translate}} </p>\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\">{{'Mission Start Date' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" formControlName=\"startDate\" ngbDatepicker\r\n #d1=\"ngbDatepicker\" data-testid=\"form-mission-startDate\" (ngModelChange)=\"onVerifDate();onVerifForm()\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['startDate'])|| isFormError(missionForm.controls['startDate'])} \">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d1.toggle()\" type=\"button\"></button>\r\n </div>\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"form-mission-startDate-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['startDate']) \r\n || isFormError(missionForm.controls['startDate'])\">\r\n {{validatorsService.getError(missionForm.controls['startDate']) |\r\n translate}}\r\n </ngb-alert>\r\n\r\n <ngb-alert data-testid=\"form-mission-startDate-invalid-verif\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"dateError\">\r\n {{'errorForm.date_start_end' |\r\n translate}}\r\n </ngb-alert>\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\">{{'Mission Start Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8 timeZoneContainer\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeStart\" [ngModelOptions]=\"{standalone: true}\"\r\n (ngModelChange)=\"onVerifDate();onVerifForm()\"></ngb-timepicker>\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\">{{'Mission End Date' | translate}}</label>\r\n <div class=\"input-group col-sm-8\">\r\n <input class=\"form-control\" placeholder=\"dd/mm/yyyy\" ngbDatepicker #d2=\"ngbDatepicker\"\r\n formControlName=\"endDate\" data-testid=\"form-mission-endDate\"\r\n [class.is-invalid]=\"validatorsService.isControlError(missionForm.controls['endDate'])\"\r\n [ngClass]=\"{'is-invalid' : validatorsService.isControlError(missionForm.controls['endDate'])|| isFormError(missionForm.controls['endDate'])} \"\r\n (ngModelChange)=\"onVerifDate();onVerifForm()\">\r\n <div class=\"input-group-append\">\r\n <button class=\"btn btn-outline-secondary calendar\" (click)=\"d2.toggle()\" type=\"button\"></button>\r\n </div>\r\n <div class=\"invalid-feedback\">\r\n <ngb-alert data-testid=\"form-mission-endDate-invalid\" [dismissible]=\"false\" type=\"danger\" *ngIf=\" validatorsService.isControlError(missionForm.controls['endDate']) \r\n || isFormError(missionForm.controls['endDate'])\">\r\n {{validatorsService.getError(missionForm.controls['endDate']) |\r\n translate}}\r\n </ngb-alert>\r\n\r\n <ngb-alert data-testid=\"form-mission-endDate-invalid-verif\" [dismissible]=\"false\" type=\"danger\"\r\n *ngIf=\"dateError\">\r\n {{'errorForm.date_end_start' |\r\n translate}}\r\n </ngb-alert>\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\">{{'Mission End Time' | translate}}</label>\r\n <div class=\"input-group col-sm-8 timeZoneContainer\">\r\n <ngb-timepicker [(ngModel)]=\"missionTimeEnd\" [ngModelOptions]=\"{standalone: true}\"\r\n (ngModelChange)=\"onVerifDate();onVerifForm()\"></ngb-timepicker>\r\n </div>\r\n </div>\r\n\r\n <div class=\"btn-control-div action-button-container\">\r\n <button type=\"submit\" class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\r\n data-testid=\"form-mission-submit-btn\" [ngClass]=\"{'is-invalid' : errorForm }\">{{'Save' |\r\n translate}}</button>\r\n <button type=\"button\" (click)=\"onCancel()\" data-testid=\"form-mission-cancel-btn\"\r\n class=\"btn btn-outline-primary rounded-pill action-button\">{{'Cancel' |\r\n translate}}</button>\r\n </div>\r\n <div class=\"invalid-feedback\" *ngIf=\"errorForm\">\r\n <ngb-alert data-testid=\"form-mission-invalid\" [dismissible]=\"false\" type=\"danger\">\r\n {{'errorForm.infoBtn' |translate}}\r\n </ngb-alert>\r\n </div>\r\n </form>\r\n</div>", styles: [".form-containter{padding:0rem 1rem;margin-bottom:2rem}.checkbox-apply{margin-top:calc(.375rem + 1px)}.keywordsDisplay{min-height:40px}.hint{margin:0!important}.hint-container{display:flex;align-items:center}.crossItem{margin:0;padding:0;border:0;background:none;position:relative;width:7px;height:20px}.crossItem:before,.crossItem:after{content:\"\";position:absolute;top:6.25px;left:0;right:0;height:1.5px;background:#fff;border-radius:1.5px}.crossItem:before{transform:rotate(45deg)}.crossItem:after{transform:rotate(-45deg)}.crossItem span{display:block}.btn-control-div .btn{width:8rem}.timeZoneContainer{align-items:center}.timeZoneContainer span{margin-left:5px}.form-group{margin:1.5rem 0}label.col-sm-4.col-form-label{width:200px;min-width:200px}.action-button-container{display:flex;justify-content:space-evenly}.action-button-container .action-button{width:145px}\n"] }]
252
252
  }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.SpaceService }, { type: i2.BaseUserService }, { type: i2.DomainService }, { type: i2.OrganisationService }, { type: i2.ZoneService }, { type: i2.HashtagService }, { type: i2.LocaleService }, { type: i2.ValidatorsService }]; }, propDecorators: { missionToEdit: [{
253
253
  type: Input
254
254
  }], organisationForMission: [{
@@ -262,4 +262,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImpor
262
262
  }], addedMissionInput: [{
263
263
  type: Output
264
264
  }] } });
265
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1taXNzaW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1hZG1pbi9zcmMvbGliL3VzZXIvZm9ybS1taXNzaW9uL2Zvcm0tbWlzc2lvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi91c2VyL2Zvcm0tbWlzc2lvbi9mb3JtLW1pc3Npb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvRSxPQUFPLEVBTUwsV0FBVyxFQUVYLE1BQU0sRUFLTixXQUFXLEVBQ1gsV0FBVyxFQUtYLGtCQUFrQixHQUNuQixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDakMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVDLE9BQU8sRUFFTCxhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLGNBQWMsR0FDZixNQUFNLG1DQUFtQyxDQUFDOzs7Ozs7O0FBTzNDLE1BQU0sT0FBTyxvQkFBb0I7SUErQy9CLFlBQ1UsRUFBZSxFQUNmLFlBQTBCLEVBQzFCLFdBQTRCLEVBQzVCLGFBQTRCLEVBQzVCLG1CQUF3QyxFQUN4QyxXQUF3QixFQUN4QixjQUE4QixFQUM5QixhQUE0QixFQUM3QixpQkFBb0M7UUFSbkMsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUM1QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hD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Z0JBRUcsc0JBQXNCO3NCQUE5QixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBRUcsdUJBQXVCO3NCQUEvQixLQUFLO2dCQU1JLGlCQUFpQjtzQkFBMUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUJ1aWxkZXIsIEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIFpvbmUsXG4gIE1pc3Npb24sXG4gIE9yZ2FuaXNhdGlvbixcbiAgU3BhY2UsXG4gIFJvbGVTdGF0dXMsXG4gIExldmVsU3RhdHVzLFxuICBEb21haW4sXG4gIExvY2FsZSxcbiAgQmFzZVVzZXJTZXJ2aWNlLFxuICBEb21haW5TZXJ2aWNlLFxuICBPcmdhbmlzYXRpb25TZXJ2aWNlLFxuICBab25lU2VydmljZSxcbiAgZW51bVRvQXJyYXksXG4gIEVtYWlsU3RhdHVzLFxuICBIYXNodGFnLFxuICBTcGFjZVNlcnZpY2UsXG4gIExvY2FsZVNlcnZpY2UsXG4gIEhhc2h0YWdTZXJ2aWNlLFxuICBzdHJpbmdMb2NhbGVUb0VudW0sXG59IGZyb20gJ0BzbWFydGVycGxhbi9uZ3gtc21hcnRlcnBsYW4tY29yZSc7XG5pbXBvcnQgeyBEYXRlVGltZSB9IGZyb20gJ2x1eG9uJztcbmltcG9ydCB7IFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICBWYWxpZGF0b3JzU2VydmljZSxcbiAgdGV4dFZhbGlkYXRvcixcbiAgbm9FbXB0eVZhbGlkYXRvcixcbiAgZmxvYXRWYWxpZGF0b3IsXG59IGZyb20gJ0BzbWFydGVycGxhbi9uZ3gtc21hcnRlcnBsYW4tY29yZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xpYi1mb3JtLW1pc3Npb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vZm9ybS1taXNzaW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZm9ybS1taXNzaW9uLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1NaXNzaW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgbWlzc2lvblRvRWRpdDogTWlzc2lvbjtcblxuICBASW5wdXQoKSBvcmdhbmlzYXRpb25Gb3JNaXNzaW9uOiBPcmdhbmlzYXRpb247XG5cbiAgQElucHV0KCkgaXNTUDogYm9vbGVhbjtcblxuICBASW5wdXQoKSB1c2VyRm9yTWlzc2lvbklEOiBzdHJpbmc7XG5cbiAgQElucHV0KCkgY3VycmVudFVzZXJPcmdhbmlzYXRpb246IE9yZ2FuaXNhdGlvbjtcblxuICBtaXNzaW9uRm9ybTogRm9ybUdyb3VwO1xuXG4gIGF2YWlsYWJsZVNwYWNlczogU3BhY2VbXTtcblxuICBAT3V0cHV0KCkgYWRkZWRNaXNzaW9uSW5wdXQgPSBuZXcgRXZlbnRFbWl0dGVyPE1pc3Npb24+KCk7XG5cbiAgYXZhaWxhYmxlUm9sZXM6IFJvbGVTdGF0dXNbXTtcblxuICBhdmFpbGFibGVMZXZlbHM6IExldmVsU3RhdHVzW107XG5cbiAgYXZhaWxhYmxlSGFzaHRhZ3M6IEhhc2h0YWdbXSA9IFtdO1xuXG4gIGRvbWFpbnM6IERvbWFpbltdO1xuXG4gIGFsbE9yZ3M6IE9yZ2FuaXNhdGlvbltdO1xuXG4gIGlzR3VpZGUgPSBmYWxzZTtcblxuICB6b25lc0ZvclNwYWNlOiBab25lW107XG5cbiAgZGVmYXVsdFpvbmU6IFpvbmU7XG5cbiAgbWlzc2lvblRpbWVTdGFydDogbnVtYmVyID0gMTIgKiA2MCAqIDYwMDAwOyAvLyBtaWRkYXkgaW4gbWlsbGlzZWNvbmRzXG5cbiAgbWlzc2lvblRpbWVFbmQ6IG51bWJlciA9IDEyICogNjAgKiA2MDAwMDtcblxuICBhZGRlZEhhc2h0YWdzOiBIYXNodGFnW10gPSBbXTtcblxuICBjdXJyZW50TG9jYWxlOiBMb2NhbGU7XG5cbiAgbG9jYWxlczogc3RyaW5nW107XG5cbiAgZGF0ZUVycm9yOiBib29sZWFuID0gZmFsc2U7XG5cbiAgZXJyb3JGb3JtOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBzcGFjZVNlcnZpY2U6IFNwYWNlU2VydmljZSxcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBCYXNlVXNlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkb21haW5TZXJ2aWNlOiBEb21haW5TZXJ2aWNlLFxuICAgIHByaXZhdGUgb3JnYW5pc2F0aW9uU2VydmljZTogT3JnYW5pc2F0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHpvbmVTZXJ2aWNlOiBab25lU2VydmljZSxcbiAgICBwcml2YXRlIGhhc2h0YWdTZXJ2aWNlOiBIYXNodGFnU2VydmljZSxcbiAgICBwcml2YXRlIGxvY2FsZVNlcnZpY2U6IExvY2FsZVNlcnZpY2UsXG4gICAgcHVibGljIHZhbGlkYXRvcnNTZXJ2aWNlOiBWYWxpZGF0b3JzU2VydmljZVxuICApIHt9XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy51cGRhdGVVc2VySW5mbygpO1xuICAgIGF3YWl0IHRoaXMuc2V0RG9tYWlucygpO1xuICAgIGlmICh0aGlzLmlzU1ApIHtcbiAgICAgIHRoaXMuYWxsT3JncyA9IGF3YWl0IHRoaXMub3JnYW5pc2F0aW9uU2VydmljZS5saXN0T3JnYW5pc2F0aW9ucygpO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnRMb2NhbGUgPSBzdHJpbmdMb2NhbGVUb0VudW0odGhpcy5sb2NhbGVTZXJ2aWNlLmdldExvY2FsZSgpKTsgLy8gdG8gbWF0Y2ggZW51bSBMb2NhbGVcbiAgICB0aGlzLmxvY2FsZXMgPSBlbnVtVG9BcnJheShMb2NhbGUpO1xuICAgIGlmICh0aGlzLm1pc3Npb25Ub0VkaXQpIHtcbiAgICAgIHRoaXMuaW5pdEZvcm1Gb3JFZGl0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5pdEVtcHR5Rm9ybSgpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVVzZXJJbmZvKCkge1xuICAgIHRoaXMuYXZhaWxhYmxlUm9sZXMgPSB0aGlzLnVzZXJTZXJ2aWNlLmdldEF2YWlsYWJsZVJvbGVzRm9yQ3VycmVudFVzZXIoKTtcbiAgICB0aGlzLmF2YWlsYWJsZUxldmVscyA9IHRoaXMudXNlclNlcnZpY2UuZ2V0QXZhbGFibGVMZXZlbHNGb3JDdXJyZW50VXNlcigpO1xuICAgIHRoaXMuaXNHdWlkZSA9IHRoaXMudXNlclNlcnZpY2UuaXNHdWlkZSgpO1xuICB9XG5cbiAgYXN5bmMgc2V0RG9tYWlucygpIHtcbiAgICBpZiAoIXRoaXMuaXNHdWlkZSkge1xuICAgICAgY29uc3QgZG9tYWlucyA9IGF3YWl0IHRoaXMuZG9tYWluU2VydmljZS5nZXREb21haW5zRm9yTWlzc2lvbnNGb3JPcmcoXG4gICAgICAgIHRoaXMuY3VycmVudFVzZXJPcmdhbmlzYXRpb24uaWRcbiAgICAgICk7XG4gICAgICB0aGlzLmRvbWFpbnMgPSBkb21haW5zO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNldEhhc2h0YWdzKHNwYWNlSUQ6IHN0cmluZykge1xuICAgIHRoaXMuYXZhaWxhYmxlSGFzaHRhZ3MgPSBhd2FpdCB0aGlzLmhhc2h0YWdTZXJ2aWNlLmdldEhhc2h0YWdzRm9yU3BhY2UoXG4gICAgICBzcGFjZUlEXG4gICAgKTtcbiAgfVxuXG4gIGdldCBzcGFjZUlEKCk6IEFic3RyYWN0Q29udHJvbCB7XG4gICAgcmV0dXJuIHRoaXMubWlzc2lvbkZvcm0uZ2V0KCdzcGFjZScpO1xuICB9XG5cbiAgZ2V0IHJvbGUoKTogQWJzdHJhY3RDb250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5taXNzaW9uRm9ybS5nZXQoJ3JvbGUnKTtcbiAgfVxuXG4gIGFzeW5jIGluaXRGb3JtRm9yRWRpdCgpIHtcbiAgICBsZXQgc3RhcnREYXRlOiBhbnkgPSBudWxsO1xuICAgIGxldCBlbmREYXRlOiBhbnkgPSBudWxsO1xuXG4gICAgY29uc3QgbSA9IHRoaXMubWlzc2lvblRvRWRpdDtcblxuICAgIGlmIChtLnN0YXJ0RGF0ZVRpbWUpIHtcbiAgICAgIGNvbnN0IGRhdGUgPSBEYXRlVGltZS5mcm9tSVNPKG0uc3RhcnREYXRlVGltZSk7XG4gICAgICB0aGlzLm1pc3Npb25UaW1lU3RhcnQgPSAoZGF0ZS5ob3VyICogNjAgKyBkYXRlLm1pbnV0ZSkgKiA2MCAqIDEwMDA7XG4gICAgICBzdGFydERhdGUgPSBkYXRlLnRvTWlsbGlzKCkgLSB0aGlzLm1pc3Npb25UaW1lU3RhcnQ7XG4gICAgfVxuICAgIGlmIChtLmVuZERhdGVUaW1lKSB7XG4gICAgICBjb25zdCBkYXRlID0gRGF0ZVRpbWUuZnJvbUlTTyhtLmVuZERhdGVUaW1lKTtcbiAgICAgIHRoaXMubWlzc2lvblRpbWVFbmQgPSAoZGF0ZS5ob3VyICogNjAgKyBkYXRlLm1pbnV0ZSkgKiA2MCAqIDEwMDA7XG4gICAgICBlbmREYXRlID0gZGF0ZS50b01pbGxpcygpIC0gdGhpcy5taXNzaW9uVGltZUVuZDtcbiAgICB9XG5cbiAgICB0aGlzLnVzZXJGb3JNaXNzaW9uSUQgPSBtLnVzZXJJRDtcbiAgICB0aGlzLmF2YWlsYWJsZVNwYWNlcyA9IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLmdldEFsbG93ZWRTcGFjZXNGb3JPcmcoXG4gICAgICB0aGlzLm1pc3Npb25Ub0VkaXQub3JnYW5pc2F0aW9uSUQsXG4gICAgICB0aGlzLmN1cnJlbnRVc2VyT3JnYW5pc2F0aW9uLmlkXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLnNldEhhc2h0YWdzKG0uc3BhY2VJRCk7XG4gICAgdGhpcy5taXNzaW9uRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xuICAgICAgaWQ6IG0uaWQsXG4gICAgICBvcmdhbmlzYXRpb246IFt7IHZhbHVlOiBtLm9yZ2FuaXNhdGlvbi5uYW1lLCBkaXNhYmxlZDogdHJ1ZSB9XSxcbiAgICAgIG9yZ2FuaXNhdGlvbklEOiBtLm9yZ2FuaXNhdGlvbklELFxuICAgICAgb3JkZXJlZE9yZ2FuaXNhdGlvbklEOiBtLm9yZGVyZWRPcmdhbmlzYXRpb25JRCxcbiAgICAgIHJvbGU6IFttLnJvbGUsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICAgICAgbGV2ZWw6IFttLmxldmVsXSxcbiAgICAgIHNwYWNlOiBbbS5zcGFjZUlELCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIGRlc2NyaXB0aW9uOiBbbS5kZXNjcmlwdGlvbiwgW3RleHRWYWxpZGF0b3IoKSwgbm9FbXB0eVZhbGlkYXRvcigpXV0sXG4gICAgICBkb21haW5zOiBbbS5kb21haW5zXSxcbiAgICAgIHpvbmU6IFttLnpvbmVJRF0sXG4gICAgICBsb2NhbGU6IFttLmxvY2FsZV0sXG4gICAgICBzdGFydERhdGU6IFtzdGFydERhdGUsIFtmbG9hdFZhbGlkYXRvcigpXV0sXG4gICAgICBlbmREYXRlOiBbZW5kRGF0ZSwgW2Zsb2F0VmFsaWRhdG9yKCldXSxcbiAgICB9KTtcbiAgICBpZiAobS5oYXNodGFncyAmJiBtLmhhc2h0YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuYWRkZWRIYXNodGFncyA9IHRoaXMuYXZhaWxhYmxlSGFzaHRhZ3MuZmlsdGVyKChoYXNodGFnKSA9PlxuICAgICAgICBtLmhhc2h0YWdzLmluY2x1ZGVzKGhhc2h0YWcuaWQpXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLm9uU3BhY2VDbGljaygpO1xuICB9XG5cbiAgYXN5bmMgb25TcGFjZUNsaWNrKCkge1xuICAgIGNvbnN0IHpvbmVzID0gYXdhaXQgdGhpcy56b25lU2VydmljZS5nZXRab25lc0J5U3BhY2UodGhpcy5zcGFjZUlELnZhbHVlKTtcbiAgICB0aGlzLmRlZmF1bHRab25lID0gem9uZXMuZmluZCgoem9uZSkgPT4gIXpvbmUucGFyZW50SUQpO1xuICAgIGNvbnN0IGluZGV4T2ZEZWZhdWx0Wm9uZSA9IHpvbmVzLmluZGV4T2YodGhpcy5kZWZhdWx0Wm9uZSk7XG4gICAgem9uZXMuc3BsaWNlKGluZGV4T2ZEZWZhdWx0Wm9uZSwgMSk7XG4gICAgdGhpcy56b25lc0ZvclNwYWNlID0gem9uZXMuZmlsdGVyKCh6b25lKSA9PiAhem9uZS5hdWRpb0lEKTtcbiAgICBhd2FpdCB0aGlzLnNldEhhc2h0YWdzKHRoaXMuc3BhY2VJRC52YWx1ZSk7XG4gIH1cblxuICBhc3luYyBpbml0RW1wdHlGb3JtKCkge1xuICAgIHRoaXMuYXZhaWxhYmxlU3BhY2VzID0gYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2UuZ2V0QWxsb3dlZFNwYWNlc0Zvck9yZyhcbiAgICAgIHRoaXMub3JnYW5pc2F0aW9uRm9yTWlzc2lvbi5pZCxcbiAgICAgIHRoaXMuY3VycmVudFVzZXJPcmdhbmlzYXRpb24uaWRcbiAgICApO1xuICAgIHRoaXMubWlzc2lvbkZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIHJvbGU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICBsZXZlbDogW0xldmVsU3RhdHVzLk1JTklNVU1dLFxuICAgICAgb3JnYW5pc2F0aW9uOiBbXG4gICAgICAgIHsgdmFsdWU6IHRoaXMub3JnYW5pc2F0aW9uRm9yTWlzc2lvbi5uYW1lLCBkaXNhYmxlZDogdHJ1ZSB9LFxuICAgICAgXSxcbiAgICAgIG9yZ2FuaXNhdGlvbklEOiB0aGlzLm9yZ2FuaXNhdGlvbkZvck1pc3Npb24uaWQsXG4gICAgICBvcmRlcmVkT3JnYW5pc2F0aW9uSUQ6IHRoaXMuY3VycmVudFVzZXJPcmdhbmlzYXRpb24uaWQsXG4gICAgICBzcGFjZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIHpvbmU6IFsnJ10sXG4gICAgICBkZXNjcmlwdGlvbjogWycnLCBbdGV4dFZhbGlkYXRvcigpLCBub0VtcHR5VmFsaWRhdG9yKCldXSxcbiAgICAgIGRvbWFpbnM6IFtudWxsXSxcbiAgICAgIGxvY2FsZTogW3RoaXMuY3VycmVudExvY2FsZV0sXG4gICAgICBzdGFydERhdGU6IFtudWxsLCBbZmxvYXRWYWxpZGF0b3IoKV1dLFxuICAgICAgZW5kRGF0ZTogW251bGwsIFtmbG9hdFZhbGlkYXRvcigpXV0sXG4gICAgfSk7XG4gIH1cblxuICBvbkhhc2h0YWdDbGljayhoYXNodGFnOiBIYXNodGFnKSB7XG4gICAgaWYgKCF0aGlzLmhhc2h0YWdBZGRlZChoYXNodGFnKSkge1xuICAgICAgdGhpcy5hZGRlZEhhc2h0YWdzLnB1c2goaGFzaHRhZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWRkZWRIYXNodGFncy5zcGxpY2UodGhpcy5hZGRlZEhhc2h0YWdzLmluZGV4T2YoaGFzaHRhZyksIDEpO1xuICAgIH1cbiAgfVxuXG4gIGhhc2h0YWdBZGRlZChoYXNodGFnOiBIYXNodGFnKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYWRkZWRIYXNodGFncy5maW5kKChfaGFzaHRhZykgPT4gX2hhc2h0YWcuaWQgPT09IGhhc2h0YWcuaWQpICE9PVxuICAgICAgdW5kZWZpbmVkXG4gICAgKTtcbiAgfVxuXG4gIHJlbW92ZUhhc2h0YWcoaGFzaHRhZzogSGFzaHRhZykge1xuICAgIHRoaXMuYWRkZWRIYXNodGFncy5zcGxpY2UodGhpcy5hZGRlZEhhc2h0YWdzLmluZGV4T2YoaGFzaHRhZyksIDEpO1xuICB9XG5cbiAgYXN5bmMgb25TdWJtaXQoKSB7XG4gICAgaWYgKCF0aGlzLm1pc3Npb25Gb3JtLnZhbGlkKSB7XG4gICAgICB0aGlzLmVycm9yRm9ybSA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGF0ZXNWYWx1ZXMgPSBhd2FpdCB0aGlzLm9uVmVyaWZEYXRlKCk7XG4gICAgaWYgKGRhdGVzVmFsdWVzLmVycm9yKSB7XG4gICAgICB0aGlzLmRhdGVFcnJvciA9IHRydWU7XG4gICAgICB0aGlzLmVycm9yRm9ybSA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5taXNzaW9uRm9ybS52YWx1ZTtcbiAgICAvLyBpZiAoIXRoaXMubWlzc2lvbkZvcm0udmFsaWQpIHtcbiAgICAvLyAgICAgLy8gdGhpcyBzaG93cyBlcnJvcnMgaW4gdGhlIGZvcm1cbiAgICAvLyAgICAgdGhpcy5taXNzaW9uRm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgLy8gICAgIHJldHVybjtcbiAgICAvLyB9XG4gICAgLy8gbGV0IHN0YXJ0RGF0ZVN0cmluZzogc3RyaW5nO1xuICAgIC8vIGxldCBlbmREYXRlU3RyaW5nOiBzdHJpbmc7XG4gICAgLy8gaWYgKGZvcm1WYWx1ZS5zdGFydERhdGUpIHtcbiAgICAvLyAgICAgY29uc3QgZGF0ZUhvdXJTdGFydE51bWJlciA9IGZvcm1WYWx1ZS5zdGFydERhdGUgKyB0aGlzLm1pc3Npb25UaW1lU3RhcnQ7XG4gICAgLy8gICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IERhdGVUaW1lLmZyb21NaWxsaXMoZGF0ZUhvdXJTdGFydE51bWJlcik7XG4gICAgLy8gICAgIHN0YXJ0RGF0ZVN0cmluZyA9IHN0YXJ0RGF0ZS50b0lTTygpO1xuICAgIC8vIH1cbiAgICAvLyBpZiAoZm9ybVZhbHVlLmVuZERhdGUpIHtcbiAgICAvLyAgICAgY29uc3QgZGF0ZUhvdXJFbmROdW1iZXIgPSBmb3JtVmFsdWUuZW5kRGF0ZSArIHRoaXMubWlzc2lvblRpbWVFbmQ7XG4gICAgLy8gICAgIGNvbnN0IGVuZERhdGUgPSBEYXRlVGltZS5mcm9tTWlsbGlzKGRhdGVIb3VyRW5kTnVtYmVyKTtcbiAgICAvLyAgICAgZW5kRGF0ZVN0cmluZyA9IGVuZERhdGUudG9JU08oKTtcbiAgICAvLyB9XG5cbiAgICAvLyBpZiAoZW5kRGF0ZVN0cmluZyAmJiBzdGFydERhdGVTdHJpbmcgJiYgKGVuZERhdGVTdHJpbmcgPCBzdGFydERhdGVTdHJpbmcpKSB7XG4gICAgLy8gICAgIHRoaXMuZGF0ZUVycm9yID0gdHJ1ZTtcbiAgICAvLyAgICAgcmV0dXJuO1xuICAgIC8vIH0gZWxzZSB7XG4gICAgLy8gICAgIHRoaXMuZGF0ZUVycm9yID0gZmFsc2U7XG4gICAgLy8gfVxuXG4gICAgY29uc3QgbWlzc2lvbklucHV0OiBNaXNzaW9uID0ge1xuICAgICAgb3JnYW5pc2F0aW9uSUQ6IGZvcm1WYWx1ZS5vcmdhbmlzYXRpb25JRCxcbiAgICAgIG9yZGVyZWRPcmdhbmlzYXRpb25JRDogZm9ybVZhbHVlLm9yZGVyZWRPcmdhbmlzYXRpb25JRCxcbiAgICAgIGxldmVsOiBmb3JtVmFsdWUubGV2ZWwsXG4gICAgICByb2xlOiBmb3JtVmFsdWUucm9sZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBmb3JtVmFsdWUuZGVzY3JpcHRpb24sXG4gICAgICBzdGFydERhdGVUaW1lOiBkYXRlc1ZhbHVlcy5zdGFydERhdGVTdHJpbmcsXG4gICAgICBlbmREYXRlVGltZTogZGF0ZXNWYWx1ZXMuZW5kRGF0ZVN0cmluZyxcbiAgICAgIGRvbWFpbnM6IGZvcm1WYWx1ZS5kb21haW5zLFxuICAgICAgdXNlcklEOiB0aGlzLnVzZXJGb3JNaXNzaW9uSUQsXG4gICAgICBlbWFpbFN0YXR1czogdGhpcy5taXNzaW9uVG9FZGl0XG4gICAgICAgID8gdGhpcy5taXNzaW9uVG9FZGl0LmVtYWlsU3RhdHVzXG4gICAgICAgIDogRW1haWxTdGF0dXMuQ1JFQVRJT05fVE9fREVMSVZFUixcbiAgICAgIGxvY2FsZTogZm9ybVZhbHVlLmxvY2FsZSxcbiAgICB9O1xuICAgIG1pc3Npb25JbnB1dC5oYXNodGFncyA9IHRoaXMuYWRkZWRIYXNodGFncy5tYXAoKGgpID0+IGguaWQpO1xuICAgIGlmIChmb3JtVmFsdWUuc3BhY2UpIHtcbiAgICAgIG1pc3Npb25JbnB1dC5zcGFjZUlEID0gZm9ybVZhbHVlLnNwYWNlO1xuICAgIH1cbiAgICBpZiAoZm9ybVZhbHVlLnpvbmUpIHtcbiAgICAgIG1pc3Npb25JbnB1dC56b25lSUQgPSBmb3JtVmFsdWUuem9uZTtcbiAgICB9XG4gICAgaWYgKHRoaXMubWlzc2lvblRvRWRpdCkge1xuICAgICAgbWlzc2lvbklucHV0LmlkID0gdGhpcy5taXNzaW9uVG9FZGl0LmlkO1xuICAgIH1cbiAgICB0aGlzLmFkZGVkTWlzc2lvbklucHV0LmVtaXQobWlzc2lvbklucHV0KTtcbiAgfVxuXG4gIG9uQ2FuY2VsKCkge1xuICAgIHRoaXMuYWRkZWRNaXNzaW9uSW5wdXQuZW1pdChudWxsKTtcbiAgfVxuXG4gIGlzRm9ybUVycm9yKGNvbnRyb2wpIHtcbiAgICByZXR1cm4gY29udHJvbCAmJiBjb250cm9sLmludmFsaWQgJiYgdGhpcy5lcnJvckZvcm07XG4gIH1cblxuICBvblZlcmlmRGF0ZSgpOiBQcm9taXNlPHtcbiAgICBzdGFydERhdGVTdHJpbmc/OiBzdHJpbmc7XG4gICAgZW5kRGF0ZVN0cmluZz86IHN0cmluZztcbiAgICBlcnJvcj86IGJvb2xlYW47XG4gIH0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMubWlzc2lvbkZvcm0uZ2V0UmF3VmFsdWUoKTtcbiAgICAgIGxldCBzdGFydERhdGVTdHJpbmc6IHN0cmluZztcbiAgICAgIGxldCBlbmREYXRlU3RyaW5nOiBzdHJpbmc7XG5cbiAgICAgIGlmIChmb3JtVmFsdWUuc3RhcnREYXRlKSB7XG4gICAgICAgIGNvbnN0IGRhdGVIb3VyU3RhcnROdW1iZXIgPSBmb3JtVmFsdWUuc3RhcnREYXRlICsgdGhpcy5taXNzaW9uVGltZVN0YXJ0O1xuICAgICAgICBjb25zdCBzdGFydERhdGUgPSBEYXRlVGltZS5mcm9tTWlsbGlzKGRhdGVIb3VyU3RhcnROdW1iZXIpO1xuICAgICAgICBzdGFydERhdGVTdHJpbmcgPSBzdGFydERhdGUudG9JU08oKTtcbiAgICAgIH1cbiAgICAgIGlmIChmb3JtVmFsdWUuZW5kRGF0ZSkge1xuICAgICAgICBjb25zdCBkYXRlSG91ckVuZE51bWJlciA9IGZvcm1WYWx1ZS5lbmREYXRlICsgdGhpcy5taXNzaW9uVGltZUVuZDtcbiAgICAgICAgY29uc3QgZW5kRGF0ZSA9IERhdGVUaW1lLmZyb21NaWxsaXMoZGF0ZUhvdXJFbmROdW1iZXIpO1xuICAgICAgICBlbmREYXRlU3RyaW5nID0gZW5kRGF0ZS50b0lTTygpO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIGVuZERhdGVTdHJpbmcgJiZcbiAgICAgICAgc3RhcnREYXRlU3RyaW5nICYmXG4gICAgICAgIGVuZERhdGVTdHJpbmcgPD0gc3RhcnREYXRlU3RyaW5nXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5kYXRlRXJyb3IgPSB0cnVlO1xuICAgICAgICByZXNvbHZlKHsgZXJyb3I6IHRydWUgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmRhdGVFcnJvciA9IGZhbHNlO1xuICAgICAgICByZXNvbHZlKHsgc3RhcnREYXRlU3RyaW5nLCBlbmREYXRlU3RyaW5nIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgb25WZXJpZkZvcm0oKSB7XG4gICAgaWYgKHRoaXMuZXJyb3JGb3JtICYmIHRoaXMubWlzc2lvbkZvcm0udmFsaWQgJiYgIXRoaXMuZGF0ZUVycm9yKSB7XG4gICAgICB0aGlzLmVycm9yRm9ybSA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZvcm0tY29udGFpbnRlclwiICpuZ0lmPVwibWlzc2lvbkZvcm1cIj5cbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbTtcIj5cbiAgICAgICAgPGg0Pnt7ICdNaXNzaW9uIGRldGFpbHMnIHwgdHJhbnNsYXRlIH19PC9oND5cbiAgICA8L2Rpdj5cbiAgICA8Zm9ybSAobmdTdWJtaXQpPVwib25TdWJtaXQoKVwiIFtmb3JtR3JvdXBdPVwibWlzc2lvbkZvcm1cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J09yZ2FuaXNhdGlvbicgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1vcmdhbmlzYXRpb25cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm9yZ2FuaXNhdGlvblwiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiICpuZ0lmPVwiaXNTUFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eyAnT3JkZXJlZCBieScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCI+XG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHJlcXVpcmVkIGZvcm1Db250cm9sTmFtZT1cIm9yZGVyZWRPcmdhbmlzYXRpb25JRFwiPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBvcmcgb2YgYWxsT3Jnc1wiIFtuZ1ZhbHVlXT1cIm9yZy5pZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgb3JnLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J0Rlc2NyaXB0aW9uJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiPlxuICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXB0aW9uXCIgcm93cz1cIjEwXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25WZXJpZkZvcm0oKVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaXMtaW52YWxpZCcgOiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1snZGVzY3JpcHRpb24nXSl8fCBpc0Zvcm1FcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1snZGVzY3JpcHRpb24nXSl9IFwiXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZm9ybS1taXNzaW9uLWRlc2NyaXB0aW9uXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxuICAgICAgICAgICAgICAgICAgICA8bmdiLWFsZXJ0IGRhdGEtdGVzdGlkPVwiZm9ybS1taXNzaW9uLWRlc2NyaXB0aW9uLWludmFsaWRcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIiB0eXBlPVwiZGFuZ2VyXCIgKm5nSWY9XCIgdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ2Rlc2NyaXB0aW9uJ10pIFxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgIGlzRm9ybUVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydkZXNjcmlwdGlvbiddKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3t2YWxpZGF0b3JzU2VydmljZS5nZXRFcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1snZGVzY3JpcHRpb24nXSkgfFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgPC9uZ2ItYWxlcnQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J1JvbGUnIHwgdHJhbnNsYXRlfX0qPC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiPlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByZXF1aXJlZCBmb3JtQ29udHJvbE5hbWU9XCJyb2xlXCIgZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tcm9sZVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uVmVyaWZGb3JtKClcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnIDogdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ3JvbGUnXSl8fCBpc0Zvcm1FcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1sncm9sZSddKX0gXCI+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHIgb2YgYXZhaWxhYmxlUm9sZXNcIiBbbmdWYWx1ZV09XCJyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyByIH19XG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZ2ItYWxlcnQgZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tcm9sZS1pbnZhbGlkXCIgW2Rpc21pc3NpYmxlXT1cImZhbHNlXCIgdHlwZT1cImRhbmdlclwiICpuZ0lmPVwiIHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydyb2xlJ10pIFxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgIGlzRm9ybUVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydyb2xlJ10pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e3ZhbGlkYXRvcnNTZXJ2aWNlLmdldEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydyb2xlJ10pIHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgIDwvbmdiLWFsZXJ0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiXG4gICAgICAgICAgICAqbmdJZj1cIm1pc3Npb25Gb3JtLmdldCgncm9sZScpLnZhbHVlICE9PSAnVklTSVRPUl9NVVNFVU0nICYmIG1pc3Npb25Gb3JtLmdldCgncm9sZScpLnZhbHVlICE9PSAnR1VJREVfTVVTRVVNJ1wiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydEb21haW5zJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiICpuZ0lmPVwiZG9tYWluc1wiPlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBtdWx0aXBsZSBmb3JtQ29udHJvbE5hbWU9XCJkb21haW5zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGRvbWFpbiBvZiBkb21haW5zXCIgW25nVmFsdWVdPVwiZG9tYWluLmlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkb21haW4ubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snQWNjZXNzIGxldmVsJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiPlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByZXF1aXJlZCBmb3JtQ29udHJvbE5hbWU9XCJsZXZlbFwiIGRhdGEtdGVzdGlkPVwiZm9ybS1taXNzaW9uLWxldmVsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGxldmVsIG9mIGF2YWlsYWJsZUxldmVsc1wiIFtuZ1ZhbHVlXT1cImxldmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBsZXZlbCB9fVxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3sgJ0F1dGhvcml6ZWQgbG9jYXRpb24nIHwgdHJhbnNsYXRlIH19KjwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIiAqbmdJZj1cImF2YWlsYWJsZVNwYWNlc1wiPlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByZXF1aXJlZCBmb3JtQ29udHJvbE5hbWU9XCJzcGFjZVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uVmVyaWZGb3JtKClcIiAoY2hhbmdlKT1cIm9uU3BhY2VDbGljaygpXCJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tc3BhY2VcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnIDogdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ3NwYWNlJ10pfHwgaXNGb3JtRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ3NwYWNlJ10pfSBcIj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgc3BhY2Ugb2YgYXZhaWxhYmxlU3BhY2VzXCIgW25nVmFsdWVdPVwic3BhY2UuaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNwYWNlLm5hbWUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nYi1hbGVydCBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1zcGFjZS1pbnZhbGlkXCIgW2Rpc21pc3NpYmxlXT1cImZhbHNlXCIgdHlwZT1cImRhbmdlclwiICpuZ0lmPVwiIHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydzcGFjZSddKSBcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICBpc0Zvcm1FcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1snc3BhY2UnXSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7dmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ3NwYWNlJ10pIHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgIDwvbmdiLWFsZXJ0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIiAqbmdJZj1cIiFhdmFpbGFibGVTcGFjZXNcIj5cbiAgICAgICAgICAgICAgICB7eyAnTm8gbG9jYXRpb25zIGF2YWlsYWJsZScgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eyAnQXV0aG9yaXplZCB6b25lJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIiAqbmdJZj1cInpvbmVzRm9yU3BhY2U7IGVsc2Ugbm9TcGFjZVwiPlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJ6b25lXCIgZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tem9uZVwiPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cImRlZmF1bHRab25lLmlkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAnQWxsIHpvbmVzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgem9uZSBvZiB6b25lc0ZvclNwYWNlXCIgW25nVmFsdWVdPVwiem9uZS5pZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgem9uZS5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vU3BhY2U+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04IGhpbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiaGludCBrZXl3b3Jkc1J1bGVzXCI+e3snWW91IG5lZWQgdG8gY2hvb3NlIHRoZSBsb2NhdGlvbiBmaXJzdCcgfCB0cmFuc2xhdGV9fSA8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J0xhbmd1YWdlJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiPlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJsb2NhbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJudWxsXCI+e3snTm90IGFwcGxpY2FibGUnIHwgdHJhbnNsYXRlfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgbG9jYWxlIG9mIGxvY2FsZXNcIiBbbmdWYWx1ZV09XCJsb2NhbGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxvY2FsZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBIYXNodGFncyBhcmUgYXZhaWxhYmxlIGFmdGVyIFNwYWNlIGlzIHNldCAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J0hhc2h0YWdzJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiICpuZ0lmPVwic3BhY2VJRC52YWx1ZVwiPlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwia2V5d29yZHNSdWxlc1wiICpuZ0lmPVwiYXZhaWxhYmxlSGFzaHRhZ3MubGVuZ3RoID4gMFwiPnt7J0F2YWlsYWJsZSBoYXNodGFncycgfCB0cmFuc2xhdGV9fSA8L3A+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJrZXl3b3Jkc1J1bGVzXCIgKm5nSWY9XCJhdmFpbGFibGVIYXNodGFncy5sZW5ndGggPT09IDBcIj5cbiAgICAgICAgICAgICAgICAgICAge3snTm8gaGFzaHRhZ3MgY3JlYXRlZCBmb3IgdGhpcyBsb2NhdGlvbicgfCB0cmFuc2xhdGV9fSA8L3A+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImF2YWlsYWJsZUhhc2h0YWdzLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwia2V5d29yZHNEaXNwbGF5IG5vLWJvcmRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtleXdvcmRzZGlzcGxheUNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgaGFzaHRhZyBvZiBhdmFpbGFibGVIYXNodGFnc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJoYXNodGFnQWRkZWQoaGFzaHRhZykgPyAna2V5d29yZHNJdGVtIGFkZGVkJyA6ICdrZXl3b3Jkc0l0ZW0nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uSGFzaHRhZ0NsaWNrKGhhc2h0YWcpXCIgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cInt7aGFzaHRhZ0FkZGVkKGhhc2h0YWcpID8gKCdSZW1vdmUnfHRyYW5zbGF0ZSkgOiAoJ0FkZCd8dHJhbnNsYXRlKSB9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2hhc2h0YWcubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImtleXdvcmRzUnVsZXNcIj57eydBZGRlZCBoYXNodGFncycgfCB0cmFuc2xhdGV9fSA8L3A+XG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImtleXdvcmRzRGlzcGxheVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtleXdvcmRzZGlzcGxheUNvbnRhaW5lclwiICpuZ0lmPVwiYWRkZWRIYXNodGFncy5sZW5ndGg+IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJrZXl3b3Jkc0l0ZW1cIiAqbmdGb3I9XCJsZXQgaGFzaHRhZyBvZiBhZGRlZEhhc2h0YWdzXCI+e3sgaGFzaHRhZy5uYW1lIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlQnV0dG9uXCIgKGNsaWNrKT1cInJlbW92ZUhhc2h0YWcoaGFzaHRhZylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Jvc3NJdGVtXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTggaGludC1jb250YWluZXJcIiAqbmdJZj1cIiFzcGFjZUlELnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJoaW50IGtleXdvcmRzUnVsZXNcIj57eydZb3UgbmVlZCB0byBjaG9vc2UgdGhlIGxvY2F0aW9uIGZpcnN0JyB8IHRyYW5zbGF0ZX19IDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snTWlzc2lvbiBTdGFydCBEYXRlJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBjb2wtc20tOFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHBsYWNlaG9sZGVyPVwiZGQvbW0veXl5eVwiIGZvcm1Db250cm9sTmFtZT1cInN0YXJ0RGF0ZVwiIG5nYkRhdGVwaWNrZXJcbiAgICAgICAgICAgICAgICAgICAgI2QxPVwibmdiRGF0ZXBpY2tlclwiIGRhdGEtdGVzdGlkPVwiZm9ybS1taXNzaW9uLXN0YXJ0RGF0ZVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uVmVyaWZEYXRlKCk7b25WZXJpZkZvcm0oKVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaXMtaW52YWxpZCcgOiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1snc3RhcnREYXRlJ10pfHwgaXNGb3JtRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ3N0YXJ0RGF0ZSddKX0gXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWFwcGVuZFwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBjYWxlbmRhclwiIChjbGljayk9XCJkMS50b2dnbGUoKVwiIHR5cGU9XCJidXR0b25cIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxuICAgICAgICAgICAgICAgICAgICA8bmdiLWFsZXJ0IGRhdGEtdGVzdGlkPVwiZm9ybS1taXNzaW9uLXN0YXJ0RGF0ZS1pbnZhbGlkXCIgW2Rpc21pc3NpYmxlXT1cImZhbHNlXCIgdHlwZT1cImRhbmdlclwiICpuZ0lmPVwiIHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydzdGFydERhdGUnXSkgXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCAgaXNGb3JtRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ3N0YXJ0RGF0ZSddKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3t2YWxpZGF0b3JzU2VydmljZS5nZXRFcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1snc3RhcnREYXRlJ10pIHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgIDwvbmdiLWFsZXJ0PlxuXG4gICAgICAgICAgICAgICAgICAgIDxuZ2ItYWxlcnQgZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tc3RhcnREYXRlLWludmFsaWQtdmVyaWZcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIiB0eXBlPVwiZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZGF0ZUVycm9yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eydlcnJvckZvcm0uZGF0ZV9zdGFydF9lbmQnIHxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgIDwvbmdiLWFsZXJ0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydNaXNzaW9uIFN0YXJ0IFRpbWUnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGNvbC1zbS04IHRpbWVab25lQ29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPG5nYi10aW1lcGlja2VyIFsobmdNb2RlbCldPVwibWlzc2lvblRpbWVTdGFydFwiIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIlxuICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblZlcmlmRGF0ZSgpO29uVmVyaWZGb3JtKClcIj48L25nYi10aW1lcGlja2VyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydNaXNzaW9uIEVuZCBEYXRlJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBjb2wtc20tOFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHBsYWNlaG9sZGVyPVwiZGQvbW0veXl5eVwiIG5nYkRhdGVwaWNrZXIgI2QyPVwibmdiRGF0ZXBpY2tlclwiXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImVuZERhdGVcIiBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1lbmREYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwidmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ2VuZERhdGUnXSlcIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnIDogdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ2VuZERhdGUnXSl8fCBpc0Zvcm1FcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1snZW5kRGF0ZSddKX0gXCJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25WZXJpZkRhdGUoKTtvblZlcmlmRm9ybSgpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWFwcGVuZFwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBjYWxlbmRhclwiIChjbGljayk9XCJkMi50b2dnbGUoKVwiIHR5cGU9XCJidXR0b25cIj48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxuICAgICAgICAgICAgICAgICAgICA8bmdiLWFsZXJ0IGRhdGEtdGVzdGlkPVwiZm9ybS1taXNzaW9uLWVuZERhdGUtaW52YWxpZFwiIFtkaXNtaXNzaWJsZV09XCJmYWxzZVwiIHR5cGU9XCJkYW5nZXJcIiAqbmdJZj1cIiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1snZW5kRGF0ZSddKSBcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICBpc0Zvcm1FcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1snZW5kRGF0ZSddKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3t2YWxpZGF0b3JzU2VydmljZS5nZXRFcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1snZW5kRGF0ZSddKSB8XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cblxuICAgICAgICAgICAgICAgICAgICA8bmdiLWFsZXJ0IGRhdGEtdGVzdGlkPVwiZm9ybS1taXNzaW9uLWVuZERhdGUtaW52YWxpZC12ZXJpZlwiIFtkaXNtaXNzaWJsZV09XCJmYWxzZVwiIHR5cGU9XCJkYW5nZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJkYXRlRXJyb3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7J2Vycm9yRm9ybS5kYXRlX2VuZF9zdGFydCcgfFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgPC9uZ2ItYWxlcnQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J01pc3Npb24gRW5kIFRpbWUnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGNvbC1zbS04IHRpbWVab25lQ29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPG5nYi10aW1lcGlja2VyIFsobmdNb2RlbCldPVwibWlzc2lvblRpbWVFbmRcIiBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25WZXJpZkRhdGUoKTtvblZlcmlmRm9ybSgpXCI+PC9uZ2ItdGltZXBpY2tlcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWNvbnRyb2wtZGl2IGFjdGlvbi1idXR0b24tY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtci0zIGFjdGlvbi1idXR0b25cIlxuICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZm9ybS1taXNzaW9uLXN1Ym1pdC1idG5cIiBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnIDogZXJyb3JGb3JtIH1cIj57eydTYXZlJyB8XG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkNhbmNlbCgpXCIgZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tY2FuY2VsLWJ0blwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgYWN0aW9uLWJ1dHRvblwiPnt7J0NhbmNlbCcgfFxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiICpuZ0lmPVwiZXJyb3JGb3JtXCI+XG4gICAgICAgICAgICA8bmdiLWFsZXJ0IGRhdGEtdGVzdGlkPVwiZm9ybS1taXNzaW9uLWludmFsaWRcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIiB0eXBlPVwiZGFuZ2VyXCI+XG4gICAgICAgICAgICAgICAge3snZXJyb3JGb3JtLmluZm9CdG4nIHx0cmFuc2xhdGV9fVxuICAgICAgICAgICAgPC9uZ2ItYWxlcnQ+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT5cbjwvZGl2PiJdfQ==
265
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1taXNzaW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1hZG1pbi9zcmMvbGliL3VzZXIvZm9ybS1taXNzaW9uL2Zvcm0tbWlzc2lvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi91c2VyL2Zvcm0tbWlzc2lvbi9mb3JtLW1pc3Npb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvRSxPQUFPLEVBTUwsV0FBVyxFQUVYLE1BQU0sRUFLTixXQUFXLEVBQ1gsV0FBVyxFQUtYLGtCQUFrQixHQUNuQixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDakMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVDLE9BQU8sRUFFTCxhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLGNBQWMsR0FDZixNQUFNLG1DQUFtQyxDQUFDOzs7Ozs7O0FBTzNDLE1BQU0sT0FBTyxvQkFBb0I7SUErQy9CLFlBQ1UsRUFBZSxFQUNmLFlBQTBCLEVBQzFCLFdBQTRCLEVBQzVCLGFBQTRCLEVBQzVCLG1CQUF3QyxFQUN4QyxXQUF3QixFQUN4QixjQUE4QixFQUM5QixhQUE0QixFQUM3QixpQkFBb0M7UUFSbkMsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUM1QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hD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Z0JBRUcsc0JBQXNCO3NCQUE5QixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFFRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBRUcsdUJBQXVCO3NCQUEvQixLQUFLO2dCQU1JLGlCQUFpQjtzQkFBMUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQnVpbGRlciwgQWJzdHJhY3RDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge1xyXG4gIFpvbmUsXHJcbiAgTWlzc2lvbixcclxuICBPcmdhbmlzYXRpb24sXHJcbiAgU3BhY2UsXHJcbiAgUm9sZVN0YXR1cyxcclxuICBMZXZlbFN0YXR1cyxcclxuICBEb21haW4sXHJcbiAgTG9jYWxlLFxyXG4gIEJhc2VVc2VyU2VydmljZSxcclxuICBEb21haW5TZXJ2aWNlLFxyXG4gIE9yZ2FuaXNhdGlvblNlcnZpY2UsXHJcbiAgWm9uZVNlcnZpY2UsXHJcbiAgZW51bVRvQXJyYXksXHJcbiAgRW1haWxTdGF0dXMsXHJcbiAgSGFzaHRhZyxcclxuICBTcGFjZVNlcnZpY2UsXHJcbiAgTG9jYWxlU2VydmljZSxcclxuICBIYXNodGFnU2VydmljZSxcclxuICBzdHJpbmdMb2NhbGVUb0VudW0sXHJcbn0gZnJvbSAnQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlJztcclxuaW1wb3J0IHsgRGF0ZVRpbWUgfSBmcm9tICdsdXhvbic7XHJcbmltcG9ydCB7IFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7XHJcbiAgVmFsaWRhdG9yc1NlcnZpY2UsXHJcbiAgdGV4dFZhbGlkYXRvcixcclxuICBub0VtcHR5VmFsaWRhdG9yLFxyXG4gIGZsb2F0VmFsaWRhdG9yLFxyXG59IGZyb20gJ0BzbWFydGVycGxhbi9uZ3gtc21hcnRlcnBsYW4tY29yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1mb3JtLW1pc3Npb24nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9mb3JtLW1pc3Npb24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2Zvcm0tbWlzc2lvbi5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRm9ybU1pc3Npb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBJbnB1dCgpIG1pc3Npb25Ub0VkaXQ6IE1pc3Npb247XHJcblxyXG4gIEBJbnB1dCgpIG9yZ2FuaXNhdGlvbkZvck1pc3Npb246IE9yZ2FuaXNhdGlvbjtcclxuXHJcbiAgQElucHV0KCkgaXNTUDogYm9vbGVhbjtcclxuXHJcbiAgQElucHV0KCkgdXNlckZvck1pc3Npb25JRDogc3RyaW5nO1xyXG5cclxuICBASW5wdXQoKSBjdXJyZW50VXNlck9yZ2FuaXNhdGlvbjogT3JnYW5pc2F0aW9uO1xyXG5cclxuICBtaXNzaW9uRm9ybTogRm9ybUdyb3VwO1xyXG5cclxuICBhdmFpbGFibGVTcGFjZXM6IFNwYWNlW107XHJcblxyXG4gIEBPdXRwdXQoKSBhZGRlZE1pc3Npb25JbnB1dCA9IG5ldyBFdmVudEVtaXR0ZXI8TWlzc2lvbj4oKTtcclxuXHJcbiAgYXZhaWxhYmxlUm9sZXM6IFJvbGVTdGF0dXNbXTtcclxuXHJcbiAgYXZhaWxhYmxlTGV2ZWxzOiBMZXZlbFN0YXR1c1tdO1xyXG5cclxuICBhdmFpbGFibGVIYXNodGFnczogSGFzaHRhZ1tdID0gW107XHJcblxyXG4gIGRvbWFpbnM6IERvbWFpbltdO1xyXG5cclxuICBhbGxPcmdzOiBPcmdhbmlzYXRpb25bXTtcclxuXHJcbiAgaXNHdWlkZSA9IGZhbHNlO1xyXG5cclxuICB6b25lc0ZvclNwYWNlOiBab25lW107XHJcblxyXG4gIGRlZmF1bHRab25lOiBab25lO1xyXG5cclxuICBtaXNzaW9uVGltZVN0YXJ0OiBudW1iZXIgPSAxMiAqIDYwICogNjAwMDA7IC8vIG1pZGRheSBpbiBtaWxsaXNlY29uZHNcclxuXHJcbiAgbWlzc2lvblRpbWVFbmQ6IG51bWJlciA9IDEyICogNjAgKiA2MDAwMDtcclxuXHJcbiAgYWRkZWRIYXNodGFnczogSGFzaHRhZ1tdID0gW107XHJcblxyXG4gIGN1cnJlbnRMb2NhbGU6IExvY2FsZTtcclxuXHJcbiAgbG9jYWxlczogc3RyaW5nW107XHJcblxyXG4gIGRhdGVFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBlcnJvckZvcm06IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgc3BhY2VTZXJ2aWNlOiBTcGFjZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBCYXNlVXNlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRvbWFpblNlcnZpY2U6IERvbWFpblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG9yZ2FuaXNhdGlvblNlcnZpY2U6IE9yZ2FuaXNhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHpvbmVTZXJ2aWNlOiBab25lU2VydmljZSxcclxuICAgIHByaXZhdGUgaGFzaHRhZ1NlcnZpY2U6IEhhc2h0YWdTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBsb2NhbGVTZXJ2aWNlOiBMb2NhbGVTZXJ2aWNlLFxyXG4gICAgcHVibGljIHZhbGlkYXRvcnNTZXJ2aWNlOiBWYWxpZGF0b3JzU2VydmljZVxyXG4gICkge31cclxuXHJcbiAgYXN5bmMgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnVwZGF0ZVVzZXJJbmZvKCk7XHJcbiAgICBhd2FpdCB0aGlzLnNldERvbWFpbnMoKTtcclxuICAgIGlmICh0aGlzLmlzU1ApIHtcclxuICAgICAgdGhpcy5hbGxPcmdzID0gYXdhaXQgdGhpcy5vcmdhbmlzYXRpb25TZXJ2aWNlLmxpc3RPcmdhbmlzYXRpb25zKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmN1cnJlbnRMb2NhbGUgPSBzdHJpbmdMb2NhbGVUb0VudW0odGhpcy5sb2NhbGVTZXJ2aWNlLmdldExvY2FsZSgpKTsgLy8gdG8gbWF0Y2ggZW51bSBMb2NhbGVcclxuICAgIHRoaXMubG9jYWxlcyA9IGVudW1Ub0FycmF5KExvY2FsZSk7XHJcbiAgICBpZiAodGhpcy5taXNzaW9uVG9FZGl0KSB7XHJcbiAgICAgIHRoaXMuaW5pdEZvcm1Gb3JFZGl0KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmluaXRFbXB0eUZvcm0oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZVVzZXJJbmZvKCkge1xyXG4gICAgdGhpcy5hdmFpbGFibGVSb2xlcyA9IHRoaXMudXNlclNlcnZpY2UuZ2V0QXZhaWxhYmxlUm9sZXNGb3JDdXJyZW50VXNlcigpO1xyXG4gICAgdGhpcy5hdmFpbGFibGVMZXZlbHMgPSB0aGlzLnVzZXJTZXJ2aWNlLmdldEF2YWxhYmxlTGV2ZWxzRm9yQ3VycmVudFVzZXIoKTtcclxuICAgIHRoaXMuaXNHdWlkZSA9IHRoaXMudXNlclNlcnZpY2UuaXNHdWlkZSgpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgc2V0RG9tYWlucygpIHtcclxuICAgIGlmICghdGhpcy5pc0d1aWRlKSB7XHJcbiAgICAgIGNvbnN0IGRvbWFpbnMgPSBhd2FpdCB0aGlzLmRvbWFpblNlcnZpY2UuZ2V0RG9tYWluc0Zvck1pc3Npb25zRm9yT3JnKFxyXG4gICAgICAgIHRoaXMuY3VycmVudFVzZXJPcmdhbmlzYXRpb24uaWRcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5kb21haW5zID0gZG9tYWlucztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHNldEhhc2h0YWdzKHNwYWNlSUQ6IHN0cmluZykge1xyXG4gICAgdGhpcy5hdmFpbGFibGVIYXNodGFncyA9IGF3YWl0IHRoaXMuaGFzaHRhZ1NlcnZpY2UuZ2V0SGFzaHRhZ3NGb3JTcGFjZShcclxuICAgICAgc3BhY2VJRFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldCBzcGFjZUlEKCk6IEFic3RyYWN0Q29udHJvbCB7XHJcbiAgICByZXR1cm4gdGhpcy5taXNzaW9uRm9ybS5nZXQoJ3NwYWNlJyk7XHJcbiAgfVxyXG5cclxuICBnZXQgcm9sZSgpOiBBYnN0cmFjdENvbnRyb2wge1xyXG4gICAgcmV0dXJuIHRoaXMubWlzc2lvbkZvcm0uZ2V0KCdyb2xlJyk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBpbml0Rm9ybUZvckVkaXQoKSB7XHJcbiAgICBsZXQgc3RhcnREYXRlOiBhbnkgPSBudWxsO1xyXG4gICAgbGV0IGVuZERhdGU6IGFueSA9IG51bGw7XHJcblxyXG4gICAgY29uc3QgbSA9IHRoaXMubWlzc2lvblRvRWRpdDtcclxuXHJcbiAgICBpZiAobS5zdGFydERhdGVUaW1lKSB7XHJcbiAgICAgIGNvbnN0IGRhdGUgPSBEYXRlVGltZS5mcm9tSVNPKG0uc3RhcnREYXRlVGltZSk7XHJcbiAgICAgIHRoaXMubWlzc2lvblRpbWVTdGFydCA9IChkYXRlLmhvdXIgKiA2MCArIGRhdGUubWludXRlKSAqIDYwICogMTAwMDtcclxuICAgICAgc3RhcnREYXRlID0gZGF0ZS50b01pbGxpcygpIC0gdGhpcy5taXNzaW9uVGltZVN0YXJ0O1xyXG4gICAgfVxyXG4gICAgaWYgKG0uZW5kRGF0ZVRpbWUpIHtcclxuICAgICAgY29uc3QgZGF0ZSA9IERhdGVUaW1lLmZyb21JU08obS5lbmREYXRlVGltZSk7XHJcbiAgICAgIHRoaXMubWlzc2lvblRpbWVFbmQgPSAoZGF0ZS5ob3VyICogNjAgKyBkYXRlLm1pbnV0ZSkgKiA2MCAqIDEwMDA7XHJcbiAgICAgIGVuZERhdGUgPSBkYXRlLnRvTWlsbGlzKCkgLSB0aGlzLm1pc3Npb25UaW1lRW5kO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudXNlckZvck1pc3Npb25JRCA9IG0udXNlcklEO1xyXG4gICAgdGhpcy5hdmFpbGFibGVTcGFjZXMgPSBhd2FpdCB0aGlzLnNwYWNlU2VydmljZS5nZXRBbGxvd2VkU3BhY2VzRm9yT3JnKFxyXG4gICAgICB0aGlzLm1pc3Npb25Ub0VkaXQub3JnYW5pc2F0aW9uSUQsXHJcbiAgICAgIHRoaXMuY3VycmVudFVzZXJPcmdhbmlzYXRpb24uaWRcclxuICAgICk7XHJcbiAgICBhd2FpdCB0aGlzLnNldEhhc2h0YWdzKG0uc3BhY2VJRCk7XHJcbiAgICB0aGlzLm1pc3Npb25Gb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIGlkOiBtLmlkLFxyXG4gICAgICBvcmdhbmlzYXRpb246IFt7IHZhbHVlOiBtLm9yZ2FuaXNhdGlvbi5uYW1lLCBkaXNhYmxlZDogdHJ1ZSB9XSxcclxuICAgICAgb3JnYW5pc2F0aW9uSUQ6IG0ub3JnYW5pc2F0aW9uSUQsXHJcbiAgICAgIG9yZGVyZWRPcmdhbmlzYXRpb25JRDogbS5vcmRlcmVkT3JnYW5pc2F0aW9uSUQsXHJcbiAgICAgIHJvbGU6IFttLnJvbGUsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBsZXZlbDogW20ubGV2ZWxdLFxyXG4gICAgICBzcGFjZTogW20uc3BhY2VJRCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIGRlc2NyaXB0aW9uOiBbbS5kZXNjcmlwdGlvbiwgW3RleHRWYWxpZGF0b3IoKSwgbm9FbXB0eVZhbGlkYXRvcigpXV0sXHJcbiAgICAgIGRvbWFpbnM6IFttLmRvbWFpbnNdLFxyXG4gICAgICB6b25lOiBbbS56b25lSURdLFxyXG4gICAgICBsb2NhbGU6IFttLmxvY2FsZV0sXHJcbiAgICAgIHN0YXJ0RGF0ZTogW3N0YXJ0RGF0ZSwgW2Zsb2F0VmFsaWRhdG9yKCldXSxcclxuICAgICAgZW5kRGF0ZTogW2VuZERhdGUsIFtmbG9hdFZhbGlkYXRvcigpXV0sXHJcbiAgICB9KTtcclxuICAgIGlmIChtLmhhc2h0YWdzICYmIG0uaGFzaHRhZ3MubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmFkZGVkSGFzaHRhZ3MgPSB0aGlzLmF2YWlsYWJsZUhhc2h0YWdzLmZpbHRlcigoaGFzaHRhZykgPT5cclxuICAgICAgICBtLmhhc2h0YWdzLmluY2x1ZGVzKGhhc2h0YWcuaWQpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm9uU3BhY2VDbGljaygpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25TcGFjZUNsaWNrKCkge1xyXG4gICAgY29uc3Qgem9uZXMgPSBhd2FpdCB0aGlzLnpvbmVTZXJ2aWNlLmdldFpvbmVzQnlTcGFjZSh0aGlzLnNwYWNlSUQudmFsdWUpO1xyXG4gICAgdGhpcy5kZWZhdWx0Wm9uZSA9IHpvbmVzLmZpbmQoKHpvbmUpID0+ICF6b25lLnBhcmVudElEKTtcclxuICAgIGNvbnN0IGluZGV4T2ZEZWZhdWx0Wm9uZSA9IHpvbmVzLmluZGV4T2YodGhpcy5kZWZhdWx0Wm9uZSk7XHJcbiAgICB6b25lcy5zcGxpY2UoaW5kZXhPZkRlZmF1bHRab25lLCAxKTtcclxuICAgIHRoaXMuem9uZXNGb3JTcGFjZSA9IHpvbmVzLmZpbHRlcigoem9uZSkgPT4gIXpvbmUuYXVkaW9JRCk7XHJcbiAgICBhd2FpdCB0aGlzLnNldEhhc2h0YWdzKHRoaXMuc3BhY2VJRC52YWx1ZSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBpbml0RW1wdHlGb3JtKCkge1xyXG4gICAgdGhpcy5hdmFpbGFibGVTcGFjZXMgPSBhd2FpdCB0aGlzLnNwYWNlU2VydmljZS5nZXRBbGxvd2VkU3BhY2VzRm9yT3JnKFxyXG4gICAgICB0aGlzLm9yZ2FuaXNhdGlvbkZvck1pc3Npb24uaWQsXHJcbiAgICAgIHRoaXMuY3VycmVudFVzZXJPcmdhbmlzYXRpb24uaWRcclxuICAgICk7XHJcbiAgICB0aGlzLm1pc3Npb25Gb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHJvbGU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIGxldmVsOiBbTGV2ZWxTdGF0dXMuTUlOSU1VTV0sXHJcbiAgICAgIG9yZ2FuaXNhdGlvbjogW1xyXG4gICAgICAgIHsgdmFsdWU6IHRoaXMub3JnYW5pc2F0aW9uRm9yTWlzc2lvbi5uYW1lLCBkaXNhYmxlZDogdHJ1ZSB9LFxyXG4gICAgICBdLFxyXG4gICAgICBvcmdhbmlzYXRpb25JRDogdGhpcy5vcmdhbmlzYXRpb25Gb3JNaXNzaW9uLmlkLFxyXG4gICAgICBvcmRlcmVkT3JnYW5pc2F0aW9uSUQ6IHRoaXMuY3VycmVudFVzZXJPcmdhbmlzYXRpb24uaWQsXHJcbiAgICAgIHNwYWNlOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICB6b25lOiBbJyddLFxyXG4gICAgICBkZXNjcmlwdGlvbjogWycnLCBbdGV4dFZhbGlkYXRvcigpLCBub0VtcHR5VmFsaWRhdG9yKCldXSxcclxuICAgICAgZG9tYWluczogW251bGxdLFxyXG4gICAgICBsb2NhbGU6IFt0aGlzLmN1cnJlbnRMb2NhbGVdLFxyXG4gICAgICBzdGFydERhdGU6IFtudWxsLCBbZmxvYXRWYWxpZGF0b3IoKV1dLFxyXG4gICAgICBlbmREYXRlOiBbbnVsbCwgW2Zsb2F0VmFsaWRhdG9yKCldXSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25IYXNodGFnQ2xpY2soaGFzaHRhZzogSGFzaHRhZykge1xyXG4gICAgaWYgKCF0aGlzLmhhc2h0YWdBZGRlZChoYXNodGFnKSkge1xyXG4gICAgICB0aGlzLmFkZGVkSGFzaHRhZ3MucHVzaChoYXNodGFnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuYWRkZWRIYXNodGFncy5zcGxpY2UodGhpcy5hZGRlZEhhc2h0YWdzLmluZGV4T2YoaGFzaHRhZyksIDEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFzaHRhZ0FkZGVkKGhhc2h0YWc6IEhhc2h0YWcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuYWRkZWRIYXNodGFncy5maW5kKChfaGFzaHRhZykgPT4gX2hhc2h0YWcuaWQgPT09IGhhc2h0YWcuaWQpICE9PVxyXG4gICAgICB1bmRlZmluZWRcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVIYXNodGFnKGhhc2h0YWc6IEhhc2h0YWcpIHtcclxuICAgIHRoaXMuYWRkZWRIYXNodGFncy5zcGxpY2UodGhpcy5hZGRlZEhhc2h0YWdzLmluZGV4T2YoaGFzaHRhZyksIDEpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25TdWJtaXQoKSB7XHJcbiAgICBpZiAoIXRoaXMubWlzc2lvbkZvcm0udmFsaWQpIHtcclxuICAgICAgdGhpcy5lcnJvckZvcm0gPSB0cnVlO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZGF0ZXNWYWx1ZXMgPSBhd2FpdCB0aGlzLm9uVmVyaWZEYXRlKCk7XHJcbiAgICBpZiAoZGF0ZXNWYWx1ZXMuZXJyb3IpIHtcclxuICAgICAgdGhpcy5kYXRlRXJyb3IgPSB0cnVlO1xyXG4gICAgICB0aGlzLmVycm9yRm9ybSA9IHRydWU7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLm1pc3Npb25Gb3JtLnZhbHVlO1xyXG4gICAgLy8gaWYgKCF0aGlzLm1pc3Npb25Gb3JtLnZhbGlkKSB7XHJcbiAgICAvLyAgICAgLy8gdGhpcyBzaG93cyBlcnJvcnMgaW4gdGhlIGZvcm1cclxuICAgIC8vICAgICB0aGlzLm1pc3Npb25Gb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcclxuICAgIC8vICAgICByZXR1cm47XHJcbiAgICAvLyB9XHJcbiAgICAvLyBsZXQgc3RhcnREYXRlU3RyaW5nOiBzdHJpbmc7XHJcbiAgICAvLyBsZXQgZW5kRGF0ZVN0cmluZzogc3RyaW5nO1xyXG4gICAgLy8gaWYgKGZvcm1WYWx1ZS5zdGFydERhdGUpIHtcclxuICAgIC8vICAgICBjb25zdCBkYXRlSG91clN0YXJ0TnVtYmVyID0gZm9ybVZhbHVlLnN0YXJ0RGF0ZSArIHRoaXMubWlzc2lvblRpbWVTdGFydDtcclxuICAgIC8vICAgICBjb25zdCBzdGFydERhdGUgPSBEYXRlVGltZS5mcm9tTWlsbGlzKGRhdGVIb3VyU3RhcnROdW1iZXIpO1xyXG4gICAgLy8gICAgIHN0YXJ0RGF0ZVN0cmluZyA9IHN0YXJ0RGF0ZS50b0lTTygpO1xyXG4gICAgLy8gfVxyXG4gICAgLy8gaWYgKGZvcm1WYWx1ZS5lbmREYXRlKSB7XHJcbiAgICAvLyAgICAgY29uc3QgZGF0ZUhvdXJFbmROdW1iZXIgPSBmb3JtVmFsdWUuZW5kRGF0ZSArIHRoaXMubWlzc2lvblRpbWVFbmQ7XHJcbiAgICAvLyAgICAgY29uc3QgZW5kRGF0ZSA9IERhdGVUaW1lLmZyb21NaWxsaXMoZGF0ZUhvdXJFbmROdW1iZXIpO1xyXG4gICAgLy8gICAgIGVuZERhdGVTdHJpbmcgPSBlbmREYXRlLnRvSVNPKCk7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gaWYgKGVuZERhdGVTdHJpbmcgJiYgc3RhcnREYXRlU3RyaW5nICYmIChlbmREYXRlU3RyaW5nIDwgc3RhcnREYXRlU3RyaW5nKSkge1xyXG4gICAgLy8gICAgIHRoaXMuZGF0ZUVycm9yID0gdHJ1ZTtcclxuICAgIC8vICAgICByZXR1cm47XHJcbiAgICAvLyB9IGVsc2Uge1xyXG4gICAgLy8gICAgIHRoaXMuZGF0ZUVycm9yID0gZmFsc2U7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgY29uc3QgbWlzc2lvbklucHV0OiBNaXNzaW9uID0ge1xyXG4gICAgICBvcmdhbmlzYXRpb25JRDogZm9ybVZhbHVlLm9yZ2FuaXNhdGlvbklELFxyXG4gICAgICBvcmRlcmVkT3JnYW5pc2F0aW9uSUQ6IGZvcm1WYWx1ZS5vcmRlcmVkT3JnYW5pc2F0aW9uSUQsXHJcbiAgICAgIGxldmVsOiBmb3JtVmFsdWUubGV2ZWwsXHJcbiAgICAgIHJvbGU6IGZvcm1WYWx1ZS5yb2xlLFxyXG4gICAgICBkZXNjcmlwdGlvbjogZm9ybVZhbHVlLmRlc2NyaXB0aW9uLFxyXG4gICAgICBzdGFydERhdGVUaW1lOiBkYXRlc1ZhbHVlcy5zdGFydERhdGVTdHJpbmcsXHJcbiAgICAgIGVuZERhdGVUaW1lOiBkYXRlc1ZhbHVlcy5lbmREYXRlU3RyaW5nLFxyXG4gICAgICBkb21haW5zOiBmb3JtVmFsdWUuZG9tYWlucyxcclxuICAgICAgdXNlcklEOiB0aGlzLnVzZXJGb3JNaXNzaW9uSUQsXHJcbiAgICAgIGVtYWlsU3RhdHVzOiB0aGlzLm1pc3Npb25Ub0VkaXRcclxuICAgICAgICA/IHRoaXMubWlzc2lvblRvRWRpdC5lbWFpbFN0YXR1c1xyXG4gICAgICAgIDogRW1haWxTdGF0dXMuQ1JFQVRJT05fVE9fREVMSVZFUixcclxuICAgICAgbG9jYWxlOiBmb3JtVmFsdWUubG9jYWxlLFxyXG4gICAgfTtcclxuICAgIG1pc3Npb25JbnB1dC5oYXNodGFncyA9IHRoaXMuYWRkZWRIYXNodGFncy5tYXAoKGgpID0+IGguaWQpO1xyXG4gICAgaWYgKGZvcm1WYWx1ZS5zcGFjZSkge1xyXG4gICAgICBtaXNzaW9uSW5wdXQuc3BhY2VJRCA9IGZvcm1WYWx1ZS5zcGFjZTtcclxuICAgIH1cclxuICAgIGlmIChmb3JtVmFsdWUuem9uZSkge1xyXG4gICAgICBtaXNzaW9uSW5wdXQuem9uZUlEID0gZm9ybVZhbHVlLnpvbmU7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5taXNzaW9uVG9FZGl0KSB7XHJcbiAgICAgIG1pc3Npb25JbnB1dC5pZCA9IHRoaXMubWlzc2lvblRvRWRpdC5pZDtcclxuICAgIH1cclxuICAgIHRoaXMuYWRkZWRNaXNzaW9uSW5wdXQuZW1pdChtaXNzaW9uSW5wdXQpO1xyXG4gIH1cclxuXHJcbiAgb25DYW5jZWwoKSB7XHJcbiAgICB0aGlzLmFkZGVkTWlzc2lvbklucHV0LmVtaXQobnVsbCk7XHJcbiAgfVxyXG5cclxuICBpc0Zvcm1FcnJvcihjb250cm9sKSB7XHJcbiAgICByZXR1cm4gY29udHJvbCAmJiBjb250cm9sLmludmFsaWQgJiYgdGhpcy5lcnJvckZvcm07XHJcbiAgfVxyXG5cclxuICBvblZlcmlmRGF0ZSgpOiBQcm9taXNlPHtcclxuICAgIHN0YXJ0RGF0ZVN0cmluZz86IHN0cmluZztcclxuICAgIGVuZERhdGVTdHJpbmc/OiBzdHJpbmc7XHJcbiAgICBlcnJvcj86IGJvb2xlYW47XHJcbiAgfT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XHJcbiAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMubWlzc2lvbkZvcm0uZ2V0UmF3VmFsdWUoKTtcclxuICAgICAgbGV0IHN0YXJ0RGF0ZVN0cmluZzogc3RyaW5nO1xyXG4gICAgICBsZXQgZW5kRGF0ZVN0cmluZzogc3RyaW5nO1xyXG5cclxuICAgICAgaWYgKGZvcm1WYWx1ZS5zdGFydERhdGUpIHtcclxuICAgICAgICBjb25zdCBkYXRlSG91clN0YXJ0TnVtYmVyID0gZm9ybVZhbHVlLnN0YXJ0RGF0ZSArIHRoaXMubWlzc2lvblRpbWVTdGFydDtcclxuICAgICAgICBjb25zdCBzdGFydERhdGUgPSBEYXRlVGltZS5mcm9tTWlsbGlzKGRhdGVIb3VyU3RhcnROdW1iZXIpO1xyXG4gICAgICAgIHN0YXJ0RGF0ZVN0cmluZyA9IHN0YXJ0RGF0ZS50b0lTTygpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChmb3JtVmFsdWUuZW5kRGF0ZSkge1xyXG4gICAgICAgIGNvbnN0IGRhdGVIb3VyRW5kTnVtYmVyID0gZm9ybVZhbHVlLmVuZERhdGUgKyB0aGlzLm1pc3Npb25UaW1lRW5kO1xyXG4gICAgICAgIGNvbnN0IGVuZERhdGUgPSBEYXRlVGltZS5mcm9tTWlsbGlzKGRhdGVIb3VyRW5kTnVtYmVyKTtcclxuICAgICAgICBlbmREYXRlU3RyaW5nID0gZW5kRGF0ZS50b0lTTygpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgZW5kRGF0ZVN0cmluZyAmJlxyXG4gICAgICAgIHN0YXJ0RGF0ZVN0cmluZyAmJlxyXG4gICAgICAgIGVuZERhdGVTdHJpbmcgPD0gc3RhcnREYXRlU3RyaW5nXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMuZGF0ZUVycm9yID0gdHJ1ZTtcclxuICAgICAgICByZXNvbHZlKHsgZXJyb3I6IHRydWUgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5kYXRlRXJyb3IgPSBmYWxzZTtcclxuICAgICAgICByZXNvbHZlKHsgc3RhcnREYXRlU3RyaW5nLCBlbmREYXRlU3RyaW5nIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uVmVyaWZGb3JtKCkge1xyXG4gICAgaWYgKHRoaXMuZXJyb3JGb3JtICYmIHRoaXMubWlzc2lvbkZvcm0udmFsaWQgJiYgIXRoaXMuZGF0ZUVycm9yKSB7XHJcbiAgICAgIHRoaXMuZXJyb3JGb3JtID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJmb3JtLWNvbnRhaW50ZXJcIiAqbmdJZj1cIm1pc3Npb25Gb3JtXCI+XHJcbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbTtcIj5cclxuICAgICAgICA8aDQ+e3sgJ01pc3Npb24gZGV0YWlscycgfCB0cmFuc2xhdGUgfX08L2g0PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8Zm9ybSAobmdTdWJtaXQpPVwib25TdWJtaXQoKVwiIFtmb3JtR3JvdXBdPVwibWlzc2lvbkZvcm1cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydPcmdhbmlzYXRpb24nIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGRhdGEtdGVzdGlkPVwiZm9ybS1taXNzaW9uLW9yZ2FuaXNhdGlvblwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJvcmdhbmlzYXRpb25cIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiICpuZ0lmPVwiaXNTUFwiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7ICdPcmRlcmVkIGJ5JyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHJlcXVpcmVkIGZvcm1Db250cm9sTmFtZT1cIm9yZGVyZWRPcmdhbmlzYXRpb25JRFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9yZyBvZiBhbGxPcmdzXCIgW25nVmFsdWVdPVwib3JnLmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9yZy5uYW1lIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J0Rlc2NyaXB0aW9uJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwdGlvblwiIHJvd3M9XCIxMFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uVmVyaWZGb3JtKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaXMtaW52YWxpZCcgOiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1snZGVzY3JpcHRpb24nXSl8fCBpc0Zvcm1FcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1snZGVzY3JpcHRpb24nXSl9IFwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tZGVzY3JpcHRpb25cIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmdiLWFsZXJ0IGRhdGEtdGVzdGlkPVwiZm9ybS1taXNzaW9uLWRlc2NyaXB0aW9uLWludmFsaWRcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIiB0eXBlPVwiZGFuZ2VyXCIgKm5nSWY9XCIgdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ2Rlc2NyaXB0aW9uJ10pIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB8fCAgaXNGb3JtRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ2Rlc2NyaXB0aW9uJ10pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7dmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ2Rlc2NyaXB0aW9uJ10pIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snUm9sZScgfCB0cmFuc2xhdGV9fSo8L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByZXF1aXJlZCBmb3JtQ29udHJvbE5hbWU9XCJyb2xlXCIgZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tcm9sZVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uVmVyaWZGb3JtKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaXMtaW52YWxpZCcgOiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1sncm9sZSddKXx8IGlzRm9ybUVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydyb2xlJ10pfSBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCByIG9mIGF2YWlsYWJsZVJvbGVzXCIgW25nVmFsdWVdPVwiclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyByIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nYi1hbGVydCBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1yb2xlLWludmFsaWRcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIiB0eXBlPVwiZGFuZ2VyXCIgKm5nSWY9XCIgdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ3JvbGUnXSkgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICBpc0Zvcm1FcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1sncm9sZSddKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e3ZhbGlkYXRvcnNTZXJ2aWNlLmdldEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydyb2xlJ10pIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCJcclxuICAgICAgICAgICAgKm5nSWY9XCJtaXNzaW9uRm9ybS5nZXQoJ3JvbGUnKS52YWx1ZSAhPT0gJ1ZJU0lUT1JfTVVTRVVNJyAmJiBtaXNzaW9uRm9ybS5nZXQoJ3JvbGUnKS52YWx1ZSAhPT0gJ0dVSURFX01VU0VVTSdcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydEb21haW5zJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCIgKm5nSWY9XCJkb21haW5zXCI+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgbXVsdGlwbGUgZm9ybUNvbnRyb2xOYW1lPVwiZG9tYWluc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGRvbWFpbiBvZiBkb21haW5zXCIgW25nVmFsdWVdPVwiZG9tYWluLmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRvbWFpbi5uYW1lIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J0FjY2VzcyBsZXZlbCcgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHJlcXVpcmVkIGZvcm1Db250cm9sTmFtZT1cImxldmVsXCIgZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tbGV2ZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBsZXZlbCBvZiBhdmFpbGFibGVMZXZlbHNcIiBbbmdWYWx1ZV09XCJsZXZlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBsZXZlbCB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eyAnQXV0aG9yaXplZCBsb2NhdGlvbicgfCB0cmFuc2xhdGUgfX0qPC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCIgKm5nSWY9XCJhdmFpbGFibGVTcGFjZXNcIj5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByZXF1aXJlZCBmb3JtQ29udHJvbE5hbWU9XCJzcGFjZVwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uVmVyaWZGb3JtKClcIiAoY2hhbmdlKT1cIm9uU3BhY2VDbGljaygpXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1zcGFjZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydpcy1pbnZhbGlkJyA6IHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydzcGFjZSddKXx8IGlzRm9ybUVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydzcGFjZSddKX0gXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgc3BhY2Ugb2YgYXZhaWxhYmxlU3BhY2VzXCIgW25nVmFsdWVdPVwic3BhY2UuaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgc3BhY2UubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZ2ItYWxlcnQgZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tc3BhY2UtaW52YWxpZFwiIFtkaXNtaXNzaWJsZV09XCJmYWxzZVwiIHR5cGU9XCJkYW5nZXJcIiAqbmdJZj1cIiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1snc3BhY2UnXSkgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICBpc0Zvcm1FcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1snc3BhY2UnXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3t2YWxpZGF0b3JzU2VydmljZS5nZXRFcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1snc3BhY2UnXSkgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmdiLWFsZXJ0PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIiAqbmdJZj1cIiFhdmFpbGFibGVTcGFjZXNcIj5cclxuICAgICAgICAgICAgICAgIHt7ICdObyBsb2NhdGlvbnMgYXZhaWxhYmxlJyB8IHRyYW5zbGF0ZX19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eyAnQXV0aG9yaXplZCB6b25lJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiICpuZ0lmPVwiem9uZXNGb3JTcGFjZTsgZWxzZSBub1NwYWNlXCI+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwiem9uZVwiIGRhdGEtdGVzdGlkPVwiZm9ybS1taXNzaW9uLXpvbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cImRlZmF1bHRab25lLmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdBbGwgem9uZXMnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgem9uZSBvZiB6b25lc0ZvclNwYWNlXCIgW25nVmFsdWVdPVwiem9uZS5pZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyB6b25lLm5hbWUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNub1NwYWNlPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04IGhpbnQtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJoaW50IGtleXdvcmRzUnVsZXNcIj57eydZb3UgbmVlZCB0byBjaG9vc2UgdGhlIGxvY2F0aW9uIGZpcnN0JyB8IHRyYW5zbGF0ZX19IDwvcD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J0xhbmd1YWdlJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgZm9ybUNvbnRyb2xOYW1lPVwibG9jYWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJudWxsXCI+e3snTm90IGFwcGxpY2FibGUnIHwgdHJhbnNsYXRlfX08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBsb2NhbGUgb2YgbG9jYWxlc1wiIFtuZ1ZhbHVlXT1cImxvY2FsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBsb2NhbGUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIEhhc2h0YWdzIGFyZSBhdmFpbGFibGUgYWZ0ZXIgU3BhY2UgaXMgc2V0IC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J0hhc2h0YWdzJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCIgKm5nSWY9XCJzcGFjZUlELnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImtleXdvcmRzUnVsZXNcIiAqbmdJZj1cImF2YWlsYWJsZUhhc2h0YWdzLmxlbmd0aCA+IDBcIj57eydBdmFpbGFibGUgaGFzaHRhZ3MnIHwgdHJhbnNsYXRlfX0gPC9wPlxyXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJrZXl3b3Jkc1J1bGVzXCIgKm5nSWY9XCJhdmFpbGFibGVIYXNodGFncy5sZW5ndGggPT09IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICB7eydObyBoYXNodGFncyBjcmVhdGVkIGZvciB0aGlzIGxvY2F0aW9uJyB8IHRyYW5zbGF0ZX19IDwvcD5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhdmFpbGFibGVIYXNodGFncy5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwia2V5d29yZHNEaXNwbGF5IG5vLWJvcmRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2V5d29yZHNkaXNwbGF5Q29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGhhc2h0YWcgb2YgYXZhaWxhYmxlSGFzaHRhZ3NcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJoYXNodGFnQWRkZWQoaGFzaHRhZykgPyAna2V5d29yZHNJdGVtIGFkZGVkJyA6ICdrZXl3b3Jkc0l0ZW0nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25IYXNodGFnQ2xpY2soaGFzaHRhZylcIiBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nYlRvb2x0aXA9XCJ7e2hhc2h0YWdBZGRlZChoYXNodGFnKSA/ICgnUmVtb3ZlJ3x0cmFuc2xhdGUpIDogKCdBZGQnfHRyYW5zbGF0ZSkgfX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2hhc2h0YWcubmFtZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwia2V5d29yZHNSdWxlc1wiPnt7J0FkZGVkIGhhc2h0YWdzJyB8IHRyYW5zbGF0ZX19IDwvcD5cclxuICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJrZXl3b3Jkc0Rpc3BsYXlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtleXdvcmRzZGlzcGxheUNvbnRhaW5lclwiICpuZ0lmPVwiYWRkZWRIYXNodGFncy5sZW5ndGg+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImtleXdvcmRzSXRlbVwiICpuZ0Zvcj1cImxldCBoYXNodGFnIG9mIGFkZGVkSGFzaHRhZ3NcIj57eyBoYXNodGFnLm5hbWUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZUJ1dHRvblwiIChjbGljayk9XCJyZW1vdmVIYXNodGFnKGhhc2h0YWcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3Jvc3NJdGVtXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOCBoaW50LWNvbnRhaW5lclwiICpuZ0lmPVwiIXNwYWNlSUQudmFsdWVcIj5cclxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiaGludCBrZXl3b3Jkc1J1bGVzXCI+e3snWW91IG5lZWQgdG8gY2hvb3NlIHRoZSBsb2NhdGlvbiBmaXJzdCcgfCB0cmFuc2xhdGV9fSA8L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydNaXNzaW9uIFN0YXJ0IERhdGUnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHBsYWNlaG9sZGVyPVwiZGQvbW0veXl5eVwiIGZvcm1Db250cm9sTmFtZT1cInN0YXJ0RGF0ZVwiIG5nYkRhdGVwaWNrZXJcclxuICAgICAgICAgICAgICAgICAgICAjZDE9XCJuZ2JEYXRlcGlja2VyXCIgZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tc3RhcnREYXRlXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25WZXJpZkRhdGUoKTtvblZlcmlmRm9ybSgpXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnIDogdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ3N0YXJ0RGF0ZSddKXx8IGlzRm9ybUVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydzdGFydERhdGUnXSl9IFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWFwcGVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGNhbGVuZGFyXCIgKGNsaWNrKT1cImQxLnRvZ2dsZSgpXCIgdHlwZT1cImJ1dHRvblwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZ2ItYWxlcnQgZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tc3RhcnREYXRlLWludmFsaWRcIiBbZGlzbWlzc2libGVdPVwiZmFsc2VcIiB0eXBlPVwiZGFuZ2VyXCIgKm5nSWY9XCIgdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ3N0YXJ0RGF0ZSddKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgIGlzRm9ybUVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydzdGFydERhdGUnXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3t2YWxpZGF0b3JzU2VydmljZS5nZXRFcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1snc3RhcnREYXRlJ10pIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPG5nYi1hbGVydCBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1zdGFydERhdGUtaW52YWxpZC12ZXJpZlwiIFtkaXNtaXNzaWJsZV09XCJmYWxzZVwiIHR5cGU9XCJkYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRhdGVFcnJvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eydlcnJvckZvcm0uZGF0ZV9zdGFydF9lbmQnIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snTWlzc2lvbiBTdGFydCBUaW1lJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGNvbC1zbS04IHRpbWVab25lQ29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICA8bmdiLXRpbWVwaWNrZXIgWyhuZ01vZGVsKV09XCJtaXNzaW9uVGltZVN0YXJ0XCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25WZXJpZkRhdGUoKTtvblZlcmlmRm9ybSgpXCI+PC9uZ2ItdGltZXBpY2tlcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J01pc3Npb24gRW5kIERhdGUnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHBsYWNlaG9sZGVyPVwiZGQvbW0veXl5eVwiIG5nYkRhdGVwaWNrZXIgI2QyPVwibmdiRGF0ZXBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZW5kRGF0ZVwiIGRhdGEtdGVzdGlkPVwiZm9ybS1taXNzaW9uLWVuZERhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cInZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydlbmREYXRlJ10pXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2lzLWludmFsaWQnIDogdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ2VuZERhdGUnXSl8fCBpc0Zvcm1FcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1snZW5kRGF0ZSddKX0gXCJcclxuICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblZlcmlmRGF0ZSgpO29uVmVyaWZGb3JtKClcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1hcHBlbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBjYWxlbmRhclwiIChjbGljayk9XCJkMi50b2dnbGUoKVwiIHR5cGU9XCJidXR0b25cIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bmdiLWFsZXJ0IGRhdGEtdGVzdGlkPVwiZm9ybS1taXNzaW9uLWVuZERhdGUtaW52YWxpZFwiIFtkaXNtaXNzaWJsZV09XCJmYWxzZVwiIHR5cGU9XCJkYW5nZXJcIiAqbmdJZj1cIiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1snZW5kRGF0ZSddKSBcclxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgIGlzRm9ybUVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydlbmREYXRlJ10pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7dmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ2VuZERhdGUnXSkgfFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmdiLWFsZXJ0PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8bmdiLWFsZXJ0IGRhdGEtdGVzdGlkPVwiZm9ybS1taXNzaW9uLWVuZERhdGUtaW52YWxpZC12ZXJpZlwiIFtkaXNtaXNzaWJsZV09XCJmYWxzZVwiIHR5cGU9XCJkYW5nZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRhdGVFcnJvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eydlcnJvckZvcm0uZGF0ZV9lbmRfc3RhcnQnIHxcclxuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgICAgICAgICA8L25nYi1hbGVydD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snTWlzc2lvbiBFbmQgVGltZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBjb2wtc20tOCB0aW1lWm9uZUNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgPG5nYi10aW1lcGlja2VyIFsobmdNb2RlbCldPVwibWlzc2lvblRpbWVFbmRcIiBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCJcclxuICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblZlcmlmRGF0ZSgpO29uVmVyaWZGb3JtKClcIj48L25nYi10aW1lcGlja2VyPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ0bi1jb250cm9sLWRpdiBhY3Rpb24tYnV0dG9uLWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtci0zIGFjdGlvbi1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tc3VibWl0LWJ0blwiIFtuZ0NsYXNzXT1cInsnaXMtaW52YWxpZCcgOiBlcnJvckZvcm0gfVwiPnt7J1NhdmUnIHxcclxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkNhbmNlbCgpXCIgZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tY2FuY2VsLWJ0blwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBhY3Rpb24tYnV0dG9uXCI+e3snQ2FuY2VsJyB8XHJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCIgKm5nSWY9XCJlcnJvckZvcm1cIj5cclxuICAgICAgICAgICAgPG5nYi1hbGVydCBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1pbnZhbGlkXCIgW2Rpc21pc3NpYmxlXT1cImZhbHNlXCIgdHlwZT1cImRhbmdlclwiPlxyXG4gICAgICAgICAgICAgICAge3snZXJyb3JGb3JtLmluZm9CdG4nIHx0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICA8L25nYi1hbGVydD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZm9ybT5cclxuPC9kaXY+Il19