@smarterplan/ngx-smarterplan-admin 0.1.39 → 0.1.41

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.
@@ -26,6 +26,7 @@ export class FormMissionComponent {
26
26
  this.missionTimeStart = 12 * 60 * 60000; // midday in milliseconds
27
27
  this.missionTimeEnd = 12 * 60 * 60000;
28
28
  this.addedHashtags = [];
29
+ this.dateError = false;
29
30
  }
30
31
  async ngOnInit() {
31
32
  this.updateUserInfo();
@@ -161,6 +162,13 @@ export class FormMissionComponent {
161
162
  const endDate = DateTime.fromMillis(dateHourEndNumber);
162
163
  endDateString = endDate.toISO();
163
164
  }
165
+ if (endDateString && startDateString && (endDateString < startDateString)) {
166
+ this.dateError = true;
167
+ return;
168
+ }
169
+ else {
170
+ this.dateError = false;
171
+ }
164
172
  const missionInput = {
165
173
  organisationID: formValue.organisationID,
166
174
  orderedOrganisationID: formValue.orderedOrganisationID,
@@ -193,10 +201,10 @@ export class FormMissionComponent {
193
201
  }
194
202
  }
195
203
  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 });
196
- 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\">\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\" 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\"\r\n [class.is-invalid]=\"validatorsService.isControlError(missionForm.controls['description'])\"\r\n data-testid=\"form-mission-description\"></textarea>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-mission-description-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['description'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.controls['description'])\"></span>\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\"\r\n [class.is-invalid]=\"validatorsService.isControlError(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 <span data-testid=\"form-mission-role-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['role'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.controls['role'])\"></span>\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\" (change)=\"onSpaceClick()\"\r\n data-testid=\"form-mission-space\"\r\n [class.is-invalid]=\"validatorsService.isControlError(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 <span data-testid=\"form-mission-space-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['space'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.controls['space'])\"></span>\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\"\r\n [class.is-invalid]=\"validatorsService.isControlError(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 <span data-testid=\"form-mission-startDate-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['startDate'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.controls['startDate'])\"></span>\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}\"></ngb-timepicker>\r\n </div>\r\n </div>\r\n\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 <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 <span data-testid=\"form-mission-endDate-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['endDate'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.controls['endDate'])\"></span>\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}\"></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\" [disabled]=\"missionForm.invalid\"\r\n class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\r\n data-testid=\"form-mission-submit-btn\">{{'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 </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.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: i5.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { 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 } });
204
+ 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\">\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\"\r\n [class.is-invalid]=\"validatorsService.isControlError(missionForm.controls['description'])\"\r\n data-testid=\"form-mission-description\"></textarea>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-mission-description-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['description'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.controls['description'])\"></span>\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\"\r\n [class.is-invalid]=\"validatorsService.isControlError(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 <span data-testid=\"form-mission-role-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['role'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.controls['role'])\"></span>\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\" (change)=\"onSpaceClick()\"\r\n data-testid=\"form-mission-space\"\r\n [class.is-invalid]=\"validatorsService.isControlError(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 <span data-testid=\"form-mission-space-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['space'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.controls['space'])\"></span>\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\"\r\n [class.is-invalid]=\"validatorsService.isControlError(missionForm.controls['startDate'])|| dateError\">\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 <span data-testid=\"form-mission-startDate-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['startDate'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.controls['startDate'])\"></span>\r\n\r\n <span data-testid=\"form-template-startDate-invalid-verif\" translate=\"errorForm.date_start_end\"\r\n *ngIf=\"dateError\"></span>\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}\"></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 <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 <span data-testid=\"form-mission-endDate-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['endDate'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.controls['endDate'])\"></span>\r\n \r\n <span data-testid=\"form-template-endDate-invalid-verif\"\r\n translate=\"errorForm.date_end_start\"\r\n *ngIf=\"dateError\"></span>\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}\"></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\" [disabled]=\"missionForm.invalid\"\r\n class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\r\n data-testid=\"form-mission-submit-btn\">{{'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 </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.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: i5.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { 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 } });
197
205
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: FormMissionComponent, decorators: [{
198
206
  type: Component,
199
- 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\" 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\"\r\n [class.is-invalid]=\"validatorsService.isControlError(missionForm.controls['description'])\"\r\n data-testid=\"form-mission-description\"></textarea>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-mission-description-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['description'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.controls['description'])\"></span>\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\"\r\n [class.is-invalid]=\"validatorsService.isControlError(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 <span data-testid=\"form-mission-role-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['role'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.controls['role'])\"></span>\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\" (change)=\"onSpaceClick()\"\r\n data-testid=\"form-mission-space\"\r\n [class.is-invalid]=\"validatorsService.isControlError(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 <span data-testid=\"form-mission-space-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['space'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.controls['space'])\"></span>\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\"\r\n [class.is-invalid]=\"validatorsService.isControlError(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 <span data-testid=\"form-mission-startDate-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['startDate'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.controls['startDate'])\"></span>\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}\"></ngb-timepicker>\r\n </div>\r\n </div>\r\n\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 <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 <span data-testid=\"form-mission-endDate-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['endDate'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.controls['endDate'])\"></span>\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}\"></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\" [disabled]=\"missionForm.invalid\"\r\n class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\r\n data-testid=\"form-mission-submit-btn\">{{'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 </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"] }]
207
+ 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\"\r\n [class.is-invalid]=\"validatorsService.isControlError(missionForm.controls['description'])\"\r\n data-testid=\"form-mission-description\"></textarea>\r\n <div class=\"invalid-feedback\">\r\n <span data-testid=\"form-mission-description-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['description'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.controls['description'])\"></span>\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\"\r\n [class.is-invalid]=\"validatorsService.isControlError(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 <span data-testid=\"form-mission-role-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['role'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.controls['role'])\"></span>\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\" (change)=\"onSpaceClick()\"\r\n data-testid=\"form-mission-space\"\r\n [class.is-invalid]=\"validatorsService.isControlError(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 <span data-testid=\"form-mission-space-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['space'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.controls['space'])\"></span>\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\"\r\n [class.is-invalid]=\"validatorsService.isControlError(missionForm.controls['startDate'])|| dateError\">\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 <span data-testid=\"form-mission-startDate-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['startDate'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.controls['startDate'])\"></span>\r\n\r\n <span data-testid=\"form-template-startDate-invalid-verif\" translate=\"errorForm.date_start_end\"\r\n *ngIf=\"dateError\"></span>\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}\"></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 <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 <span data-testid=\"form-mission-endDate-invalid\"\r\n [translate]=\"validatorsService.getError(missionForm.controls['endDate'])\"\r\n *ngIf=\" validatorsService.isControlError(missionForm.controls['endDate'])\"></span>\r\n \r\n <span data-testid=\"form-template-endDate-invalid-verif\"\r\n translate=\"errorForm.date_end_start\"\r\n *ngIf=\"dateError\"></span>\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}\"></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\" [disabled]=\"missionForm.invalid\"\r\n class=\"btn btn-outline-primary rounded-pill mr-3 action-button\"\r\n data-testid=\"form-mission-submit-btn\">{{'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 </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"] }]
200
208
  }], 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: [{
201
209
  type: Input
202
210
  }], organisationForMission: [{
@@ -210,4 +218,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImpor
210
218
  }], addedMissionInput: [{
211
219
  type: Output
212
220
  }] } });
213
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1taXNzaW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1hZG1pbi9zcmMvbGliL3VzZXIvZm9ybS1taXNzaW9uL2Zvcm0tbWlzc2lvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi91c2VyL2Zvcm0tbWlzc2lvbi9mb3JtLW1pc3Npb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvRSxPQUFPLEVBRUgsV0FBVyxFQUFVLE1BQU0sRUFDTyxXQUFXLEVBQUUsV0FBVyxFQUNKLGtCQUFrQixFQUMzRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDakMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVDLE9BQU8sRUFBcUIsYUFBYSxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDOzs7Ozs7O0FBUXZILE1BQU0sT0FBTyxvQkFBb0I7SUE0QzdCLFlBQ1ksRUFBZSxFQUNmLFlBQTBCLEVBQzFCLFdBQTRCLEVBQzVCLGFBQTRCLEVBQzVCLG1CQUF3QyxFQUN4QyxXQUF3QixFQUN4QixjQUE4QixFQUM5QixhQUE0QixFQUM3QixpQkFBb0M7UUFSbkMsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUM1QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hD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RyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVELElBQUksU0FBUyxDQUFDLEtBQUssRUFBRTtZQUNqQixZQUFZLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUM7U0FDMUM7UUFDRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUU7WUFDaEIsWUFBWSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO1NBQ3hDO1FBQ0QsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3BCLFlBQVksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7U0FDM0M7UUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxRQUFRO1FBQ0osSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDOztpSEE3UFEsb0JBQW9CO3FHQUFwQixvQkFBb0IsbVRDbEJqQyxtbVpBNk5NOzJGRDNNTyxvQkFBb0I7a0JBTGhDLFNBQVM7K0JBQ0ksa0JBQWtCOzRVQU1uQixhQUFhO3NCQUFyQixLQUFLO2dCQUVHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFNSSxpQkFBaUI7c0JBQTFCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUJ1aWxkZXIsIEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHtcclxuICAgIFpvbmUsIE1pc3Npb24sIE9yZ2FuaXNhdGlvbiwgU3BhY2UsIFJvbGVTdGF0dXMsXHJcbiAgICBMZXZlbFN0YXR1cywgRG9tYWluLCBMb2NhbGUsIEJhc2VVc2VyU2VydmljZSwgRG9tYWluU2VydmljZSxcclxuICAgIE9yZ2FuaXNhdGlvblNlcnZpY2UsIFpvbmVTZXJ2aWNlLCBlbnVtVG9BcnJheSwgRW1haWxTdGF0dXMsXHJcbiAgICBIYXNodGFnLCBTcGFjZVNlcnZpY2UsIExvY2FsZVNlcnZpY2UsIEhhc2h0YWdTZXJ2aWNlLCBzdHJpbmdMb2NhbGVUb0VudW1cclxufSBmcm9tICdAc21hcnRlcnBsYW4vbmd4LXNtYXJ0ZXJwbGFuLWNvcmUnO1xyXG5pbXBvcnQgeyBEYXRlVGltZSB9IGZyb20gXCJsdXhvblwiO1xyXG5pbXBvcnQgeyBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBWYWxpZGF0b3JzU2VydmljZSwgdGV4dFZhbGlkYXRvciwgbm9FbXB0eVZhbGlkYXRvciwgZmxvYXRWYWxpZGF0b3IgfSBmcm9tIFwiQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlXCI7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2xpYi1mb3JtLW1pc3Npb24nLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0tbWlzc2lvbi5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9mb3JtLW1pc3Npb24uY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRm9ybU1pc3Npb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICAgIEBJbnB1dCgpIG1pc3Npb25Ub0VkaXQ6IE1pc3Npb247XHJcblxyXG4gICAgQElucHV0KCkgb3JnYW5pc2F0aW9uRm9yTWlzc2lvbjogT3JnYW5pc2F0aW9uO1xyXG5cclxuICAgIEBJbnB1dCgpIGlzU1A6IGJvb2xlYW47XHJcblxyXG4gICAgQElucHV0KCkgdXNlckZvck1pc3Npb25JRDogc3RyaW5nO1xyXG5cclxuICAgIEBJbnB1dCgpIGN1cnJlbnRVc2VyT3JnYW5pc2F0aW9uOiBPcmdhbmlzYXRpb247XHJcblxyXG4gICAgbWlzc2lvbkZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgICBhdmFpbGFibGVTcGFjZXM6IFNwYWNlW107XHJcblxyXG4gICAgQE91dHB1dCgpIGFkZGVkTWlzc2lvbklucHV0ID0gbmV3IEV2ZW50RW1pdHRlcjxNaXNzaW9uPigpO1xyXG5cclxuICAgIGF2YWlsYWJsZVJvbGVzOiBSb2xlU3RhdHVzW107XHJcblxyXG4gICAgYXZhaWxhYmxlTGV2ZWxzOiBMZXZlbFN0YXR1c1tdO1xyXG5cclxuICAgIGF2YWlsYWJsZUhhc2h0YWdzOiBIYXNodGFnW10gPSBbXTtcclxuXHJcbiAgICBkb21haW5zOiBEb21haW5bXTtcclxuXHJcbiAgICBhbGxPcmdzOiBPcmdhbmlzYXRpb25bXTtcclxuXHJcbiAgICBpc0d1aWRlID0gZmFsc2U7XHJcblxyXG4gICAgem9uZXNGb3JTcGFjZTogWm9uZVtdO1xyXG5cclxuICAgIGRlZmF1bHRab25lOiBab25lO1xyXG5cclxuICAgIG1pc3Npb25UaW1lU3RhcnQ6IG51bWJlciA9IDEyICogNjAgKiA2MDAwMDsgLy8gbWlkZGF5IGluIG1pbGxpc2Vjb25kc1xyXG5cclxuICAgIG1pc3Npb25UaW1lRW5kOiBudW1iZXIgPSAxMiAqIDYwICogNjAwMDA7XHJcblxyXG4gICAgYWRkZWRIYXNodGFnczogSGFzaHRhZ1tdID0gW107XHJcblxyXG4gICAgY3VycmVudExvY2FsZTogTG9jYWxlO1xyXG5cclxuICAgIGxvY2FsZXM6IHN0cmluZ1tdO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgICAgIHByaXZhdGUgc3BhY2VTZXJ2aWNlOiBTcGFjZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSB1c2VyU2VydmljZTogQmFzZVVzZXJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgZG9tYWluU2VydmljZTogRG9tYWluU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIG9yZ2FuaXNhdGlvblNlcnZpY2U6IE9yZ2FuaXNhdGlvblNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSB6b25lU2VydmljZTogWm9uZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBoYXNodGFnU2VydmljZTogSGFzaHRhZ1NlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBsb2NhbGVTZXJ2aWNlOiBMb2NhbGVTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyB2YWxpZGF0b3JzU2VydmljZTogVmFsaWRhdG9yc1NlcnZpY2VcclxuICAgICkgeyB9XHJcblxyXG4gICAgYXN5bmMgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVVc2VySW5mbygpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0RG9tYWlucygpO1xyXG4gICAgICAgIGlmICh0aGlzLmlzU1ApIHtcclxuICAgICAgICAgICAgdGhpcy5hbGxPcmdzID0gYXdhaXQgdGhpcy5vcmdhbmlzYXRpb25TZXJ2aWNlLmxpc3RPcmdhbmlzYXRpb25zKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY3VycmVudExvY2FsZSA9IHN0cmluZ0xvY2FsZVRvRW51bSh0aGlzLmxvY2FsZVNlcnZpY2UuZ2V0TG9jYWxlKCkpOyAvLyB0byBtYXRjaCBlbnVtIExvY2FsZVxyXG4gICAgICAgIHRoaXMubG9jYWxlcyA9IGVudW1Ub0FycmF5KExvY2FsZSk7XHJcbiAgICAgICAgaWYgKHRoaXMubWlzc2lvblRvRWRpdCkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRGb3JtRm9yRWRpdCgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdEVtcHR5Rm9ybSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVVc2VySW5mbygpIHtcclxuICAgICAgICB0aGlzLmF2YWlsYWJsZVJvbGVzID1cclxuICAgICAgICAgICAgdGhpcy51c2VyU2VydmljZS5nZXRBdmFpbGFibGVSb2xlc0ZvckN1cnJlbnRVc2VyKCk7XHJcbiAgICAgICAgdGhpcy5hdmFpbGFibGVMZXZlbHMgPVxyXG4gICAgICAgICAgICB0aGlzLnVzZXJTZXJ2aWNlLmdldEF2YWxhYmxlTGV2ZWxzRm9yQ3VycmVudFVzZXIoKTtcclxuICAgICAgICB0aGlzLmlzR3VpZGUgPSB0aGlzLnVzZXJTZXJ2aWNlLmlzR3VpZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzZXREb21haW5zKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0d1aWRlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRvbWFpbnMgPVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kb21haW5TZXJ2aWNlLmdldERvbWFpbnNGb3JNaXNzaW9uc0Zvck9yZyhcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRVc2VyT3JnYW5pc2F0aW9uLmlkLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5kb21haW5zID0gZG9tYWlucztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2V0SGFzaHRhZ3Moc3BhY2VJRDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5hdmFpbGFibGVIYXNodGFncyA9IGF3YWl0IHRoaXMuaGFzaHRhZ1NlcnZpY2UuZ2V0SGFzaHRhZ3NGb3JTcGFjZShcclxuICAgICAgICAgICAgc3BhY2VJRCxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzcGFjZUlEKCk6IEFic3RyYWN0Q29udHJvbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubWlzc2lvbkZvcm0uZ2V0KFwic3BhY2VcIik7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJvbGUoKTogQWJzdHJhY3RDb250cm9sIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5taXNzaW9uRm9ybS5nZXQoXCJyb2xlXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGluaXRGb3JtRm9yRWRpdCgpIHtcclxuICAgICAgICBsZXQgc3RhcnREYXRlOiBhbnkgPSBudWxsO1xyXG4gICAgICAgIGxldCBlbmREYXRlOiBhbnkgPSBudWxsO1xyXG5cclxuICAgICAgICBjb25zdCBtID0gdGhpcy5taXNzaW9uVG9FZGl0O1xyXG5cclxuICAgICAgICBpZiAobS5zdGFydERhdGVUaW1lKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBEYXRlVGltZS5mcm9tSVNPKG0uc3RhcnREYXRlVGltZSk7XHJcbiAgICAgICAgICAgIHRoaXMubWlzc2lvblRpbWVTdGFydCA9IChkYXRlLmhvdXIgKiA2MCArIGRhdGUubWludXRlKSAqIDYwICogMTAwMDtcclxuICAgICAgICAgICAgc3RhcnREYXRlID0gZGF0ZS50b01pbGxpcygpIC0gdGhpcy5taXNzaW9uVGltZVN0YXJ0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobS5lbmREYXRlVGltZSkge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRlID0gRGF0ZVRpbWUuZnJvbUlTTyhtLmVuZERhdGVUaW1lKTtcclxuICAgICAgICAgICAgdGhpcy5taXNzaW9uVGltZUVuZCA9IChkYXRlLmhvdXIgKiA2MCArIGRhdGUubWludXRlKSAqIDYwICogMTAwMDtcclxuICAgICAgICAgICAgZW5kRGF0ZSA9IGRhdGUudG9NaWxsaXMoKSAtIHRoaXMubWlzc2lvblRpbWVFbmQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnVzZXJGb3JNaXNzaW9uSUQgPSBtLnVzZXJJRDtcclxuICAgICAgICB0aGlzLmF2YWlsYWJsZVNwYWNlcyA9IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLmdldEFsbG93ZWRTcGFjZXNGb3JPcmcoXHJcbiAgICAgICAgICAgIHRoaXMubWlzc2lvblRvRWRpdC5vcmdhbmlzYXRpb25JRCxcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50VXNlck9yZ2FuaXNhdGlvbi5pZCxcclxuICAgICAgICApO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0SGFzaHRhZ3MobS5zcGFjZUlEKTtcclxuICAgICAgICB0aGlzLm1pc3Npb25Gb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICAgIGlkOiBtLmlkLFxyXG4gICAgICAgICAgICBvcmdhbmlzYXRpb246IFt7IHZhbHVlOiBtLm9yZ2FuaXNhdGlvbi5uYW1lLCBkaXNhYmxlZDogdHJ1ZSB9XSxcclxuICAgICAgICAgICAgb3JnYW5pc2F0aW9uSUQ6IG0ub3JnYW5pc2F0aW9uSUQsXHJcbiAgICAgICAgICAgIG9yZGVyZWRPcmdhbmlzYXRpb25JRDogbS5vcmRlcmVkT3JnYW5pc2F0aW9uSUQsXHJcbiAgICAgICAgICAgIHJvbGU6IFttLnJvbGUsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgICBsZXZlbDogW20ubGV2ZWxdLFxyXG4gICAgICAgICAgICBzcGFjZTogW20uc3BhY2VJRCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBbbS5kZXNjcmlwdGlvbixbdGV4dFZhbGlkYXRvcigpLCBub0VtcHR5VmFsaWRhdG9yKCldIF0sXHJcbiAgICAgICAgICAgIGRvbWFpbnM6IFttLmRvbWFpbnNdLFxyXG4gICAgICAgICAgICB6b25lOiBbbS56b25lSURdLFxyXG4gICAgICAgICAgICBsb2NhbGU6IFttLmxvY2FsZV0sXHJcbiAgICAgICAgICAgIHN0YXJ0RGF0ZTogW3N0YXJ0RGF0ZSwgW2Zsb2F0VmFsaWRhdG9yKCldXSxcclxuICAgICAgICAgICAgZW5kRGF0ZTogW2VuZERhdGUsIFtmbG9hdFZhbGlkYXRvcigpXV0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKG0uaGFzaHRhZ3MgJiYgbS5oYXNodGFncy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkZWRIYXNodGFncyA9IHRoaXMuYXZhaWxhYmxlSGFzaHRhZ3MuZmlsdGVyKChoYXNodGFnKSA9PlxyXG4gICAgICAgICAgICAgICAgbS5oYXNodGFncy5pbmNsdWRlcyhoYXNodGFnLmlkKSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMub25TcGFjZUNsaWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TcGFjZUNsaWNrKCkge1xyXG4gICAgICAgIGNvbnN0IHpvbmVzID0gYXdhaXQgdGhpcy56b25lU2VydmljZS5nZXRab25lc0J5U3BhY2UoXHJcbiAgICAgICAgICAgIHRoaXMuc3BhY2VJRC52YWx1ZSxcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMuZGVmYXVsdFpvbmUgPSB6b25lcy5maW5kKCh6b25lKSA9PiAhem9uZS5wYXJlbnRJRCk7XHJcbiAgICAgICAgY29uc3QgaW5kZXhPZkRlZmF1bHRab25lID0gem9uZXMuaW5kZXhPZih0aGlzLmRlZmF1bHRab25lKTtcclxuICAgICAgICB6b25lcy5zcGxpY2UoaW5kZXhPZkRlZmF1bHRab25lLCAxKTtcclxuICAgICAgICB0aGlzLnpvbmVzRm9yU3BhY2UgPSB6b25lcztcclxuICAgICAgICBhd2FpdCB0aGlzLnNldEhhc2h0YWdzKHRoaXMuc3BhY2VJRC52YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5pdEVtcHR5Rm9ybSgpIHtcclxuICAgICAgICB0aGlzLmF2YWlsYWJsZVNwYWNlcyA9IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLmdldEFsbG93ZWRTcGFjZXNGb3JPcmcoXHJcbiAgICAgICAgICAgIHRoaXMub3JnYW5pc2F0aW9uRm9yTWlzc2lvbi5pZCxcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50VXNlck9yZ2FuaXNhdGlvbi5pZCxcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMubWlzc2lvbkZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcclxuICAgICAgICAgICAgcm9sZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgICAgbGV2ZWw6IFtMZXZlbFN0YXR1cy5NSU5JTVVNXSxcclxuICAgICAgICAgICAgb3JnYW5pc2F0aW9uOiBbXHJcbiAgICAgICAgICAgICAgICB7IHZhbHVlOiB0aGlzLm9yZ2FuaXNhdGlvbkZvck1pc3Npb24ubmFtZSwgZGlzYWJsZWQ6IHRydWUgfSxcclxuICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgb3JnYW5pc2F0aW9uSUQ6IHRoaXMub3JnYW5pc2F0aW9uRm9yTWlzc2lvbi5pZCxcclxuICAgICAgICAgICAgb3JkZXJlZE9yZ2FuaXNhdGlvbklEOiB0aGlzLmN1cnJlbnRVc2VyT3JnYW5pc2F0aW9uLmlkLFxyXG4gICAgICAgICAgICBzcGFjZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgICAgem9uZTogWycnXSxcclxuICAgICAgICAgICAgZGVzY3JpcHRpb246IFtcIlwiLCBbdGV4dFZhbGlkYXRvcigpLCBub0VtcHR5VmFsaWRhdG9yKCldXSxcclxuICAgICAgICAgICAgZG9tYWluczogW251bGxdLFxyXG4gICAgICAgICAgICBsb2NhbGU6IFt0aGlzLmN1cnJlbnRMb2NhbGVdLFxyXG4gICAgICAgICAgICBzdGFydERhdGU6IFtudWxsLCBbZmxvYXRWYWxpZGF0b3IoKV1dLFxyXG4gICAgICAgICAgICBlbmREYXRlOiBbbnVsbCwgW2Zsb2F0VmFsaWRhdG9yKCldXSxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkhhc2h0YWdDbGljayhoYXNodGFnOiBIYXNodGFnKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmhhc2h0YWdBZGRlZChoYXNodGFnKSkge1xyXG4gICAgICAgICAgICB0aGlzLmFkZGVkSGFzaHRhZ3MucHVzaChoYXNodGFnKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmFkZGVkSGFzaHRhZ3Muc3BsaWNlKHRoaXMuYWRkZWRIYXNodGFncy5pbmRleE9mKGhhc2h0YWcpLCAxKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaGFzaHRhZ0FkZGVkKGhhc2h0YWc6IEhhc2h0YWcpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICB0aGlzLmFkZGVkSGFzaHRhZ3MuZmluZChcclxuICAgICAgICAgICAgICAgIChfaGFzaHRhZykgPT4gX2hhc2h0YWcuaWQgPT09IGhhc2h0YWcuaWQsXHJcbiAgICAgICAgICAgICkgIT09IHVuZGVmaW5lZFxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlSGFzaHRhZyhoYXNodGFnOiBIYXNodGFnKSB7XHJcbiAgICAgICAgdGhpcy5hZGRlZEhhc2h0YWdzLnNwbGljZSh0aGlzLmFkZGVkSGFzaHRhZ3MuaW5kZXhPZihoYXNodGFnKSwgMSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25TdWJtaXQoKSB7XHJcbiAgICAgICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy5taXNzaW9uRm9ybS52YWx1ZTtcclxuICAgICAgICBpZiAoIXRoaXMubWlzc2lvbkZvcm0udmFsaWQpIHtcclxuICAgICAgICAgICAgLy8gdGhpcyBzaG93cyBlcnJvcnMgaW4gdGhlIGZvcm1cclxuICAgICAgICAgICAgdGhpcy5taXNzaW9uRm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHN0YXJ0RGF0ZVN0cmluZzogc3RyaW5nO1xyXG4gICAgICAgIGxldCBlbmREYXRlU3RyaW5nOiBzdHJpbmc7XHJcbiAgICAgICAgaWYgKGZvcm1WYWx1ZS5zdGFydERhdGUpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZUhvdXJTdGFydE51bWJlciA9IGZvcm1WYWx1ZS5zdGFydERhdGUgKyB0aGlzLm1pc3Npb25UaW1lU3RhcnQ7XHJcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IERhdGVUaW1lLmZyb21NaWxsaXMoZGF0ZUhvdXJTdGFydE51bWJlcik7XHJcbiAgICAgICAgICAgIHN0YXJ0RGF0ZVN0cmluZyA9IHN0YXJ0RGF0ZS50b0lTTygpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZm9ybVZhbHVlLmVuZERhdGUpIHtcclxuICAgICAgICAgICAgY29uc3QgZGF0ZUhvdXJFbmROdW1iZXIgPSBmb3JtVmFsdWUuZW5kRGF0ZSArIHRoaXMubWlzc2lvblRpbWVFbmQ7XHJcbiAgICAgICAgICAgIGNvbnN0IGVuZERhdGUgPSBEYXRlVGltZS5mcm9tTWlsbGlzKGRhdGVIb3VyRW5kTnVtYmVyKTtcclxuICAgICAgICAgICAgZW5kRGF0ZVN0cmluZyA9IGVuZERhdGUudG9JU08oKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgbWlzc2lvbklucHV0OiBNaXNzaW9uID0ge1xyXG4gICAgICAgICAgICBvcmdhbmlzYXRpb25JRDogZm9ybVZhbHVlLm9yZ2FuaXNhdGlvbklELFxyXG4gICAgICAgICAgICBvcmRlcmVkT3JnYW5pc2F0aW9uSUQ6IGZvcm1WYWx1ZS5vcmRlcmVkT3JnYW5pc2F0aW9uSUQsXHJcbiAgICAgICAgICAgIGxldmVsOiBmb3JtVmFsdWUubGV2ZWwsXHJcbiAgICAgICAgICAgIHJvbGU6IGZvcm1WYWx1ZS5yb2xlLFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogZm9ybVZhbHVlLmRlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgICBzdGFydERhdGVUaW1lOiBzdGFydERhdGVTdHJpbmcsXHJcbiAgICAgICAgICAgIGVuZERhdGVUaW1lOiBlbmREYXRlU3RyaW5nLFxyXG4gICAgICAgICAgICBkb21haW5zOiBmb3JtVmFsdWUuZG9tYWlucyxcclxuICAgICAgICAgICAgdXNlcklEOiB0aGlzLnVzZXJGb3JNaXNzaW9uSUQsXHJcbiAgICAgICAgICAgIGVtYWlsU3RhdHVzOiB0aGlzLm1pc3Npb25Ub0VkaXRcclxuICAgICAgICAgICAgICAgID8gdGhpcy5taXNzaW9uVG9FZGl0LmVtYWlsU3RhdHVzXHJcbiAgICAgICAgICAgICAgICA6IEVtYWlsU3RhdHVzLkNSRUFUSU9OX1RPX0RFTElWRVIsXHJcbiAgICAgICAgICAgIGxvY2FsZTogZm9ybVZhbHVlLmxvY2FsZSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIG1pc3Npb25JbnB1dC5oYXNodGFncyA9IHRoaXMuYWRkZWRIYXNodGFncy5tYXAoKGgpID0+IGguaWQpO1xyXG4gICAgICAgIGlmIChmb3JtVmFsdWUuc3BhY2UpIHtcclxuICAgICAgICAgICAgbWlzc2lvbklucHV0LnNwYWNlSUQgPSBmb3JtVmFsdWUuc3BhY2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmb3JtVmFsdWUuem9uZSkge1xyXG4gICAgICAgICAgICBtaXNzaW9uSW5wdXQuem9uZUlEID0gZm9ybVZhbHVlLnpvbmU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm1pc3Npb25Ub0VkaXQpIHtcclxuICAgICAgICAgICAgbWlzc2lvbklucHV0LmlkID0gdGhpcy5taXNzaW9uVG9FZGl0LmlkO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFkZGVkTWlzc2lvbklucHV0LmVtaXQobWlzc2lvbklucHV0KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNhbmNlbCgpIHtcclxuICAgICAgICB0aGlzLmFkZGVkTWlzc2lvbklucHV0LmVtaXQobnVsbCk7XHJcbiAgICB9XHJcblxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJmb3JtLWNvbnRhaW50ZXJcIiAqbmdJZj1cIm1pc3Npb25Gb3JtXCI+XHJcbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbTtcIj5cclxuICAgICAgICA8aDQ+e3sgJ01pc3Npb24gZGV0YWlscycgfCB0cmFuc2xhdGUgfX08L2g0PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8Zm9ybSAobmdTdWJtaXQpPVwib25TdWJtaXQoKVwiIFtmb3JtR3JvdXBdPVwibWlzc2lvbkZvcm1cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydPcmdhbmlzYXRpb24nIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiICBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1vcmdhbmlzYXRpb25cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cIm9yZ2FuaXNhdGlvblwiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCIgKm5nSWY9XCJpc1NQXCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3sgJ09yZGVyZWQgYnknIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcmVxdWlyZWQgZm9ybUNvbnRyb2xOYW1lPVwib3JkZXJlZE9yZ2FuaXNhdGlvbklEXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgb3JnIG9mIGFsbE9yZ3NcIiBbbmdWYWx1ZV09XCJvcmcuaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgb3JnLm5hbWUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snRGVzY3JpcHRpb24nIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXB0aW9uXCIgcm93cz1cIjEwXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJ2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1snZGVzY3JpcHRpb24nXSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZm9ybS1taXNzaW9uLWRlc2NyaXB0aW9uXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tZGVzY3JpcHRpb24taW52YWxpZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0cmFuc2xhdGVdPVwidmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ2Rlc2NyaXB0aW9uJ10pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIgdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ2Rlc2NyaXB0aW9uJ10pXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydSb2xlJyB8IHRyYW5zbGF0ZX19KjwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHJlcXVpcmVkIGZvcm1Db250cm9sTmFtZT1cInJvbGVcIiBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1yb2xlXCJcclxuICAgICAgICAgICAgICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJ2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1sncm9sZSddKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHIgb2YgYXZhaWxhYmxlUm9sZXNcIiBbbmdWYWx1ZV09XCJyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHIgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1yb2xlLWludmFsaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdHJhbnNsYXRlXT1cInZhbGlkYXRvcnNTZXJ2aWNlLmdldEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydyb2xlJ10pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIgdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ3JvbGUnXSlcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiXHJcbiAgICAgICAgICAgICpuZ0lmPVwibWlzc2lvbkZvcm0uZ2V0KCdyb2xlJykudmFsdWUgIT09ICdWSVNJVE9SX01VU0VVTScgJiYgbWlzc2lvbkZvcm0uZ2V0KCdyb2xlJykudmFsdWUgIT09ICdHVUlERV9NVVNFVU0nXCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snRG9tYWlucycgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiICpuZ0lmPVwiZG9tYWluc1wiPlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIG11bHRpcGxlIGZvcm1Db250cm9sTmFtZT1cImRvbWFpbnNcIj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBkb21haW4gb2YgZG9tYWluc1wiIFtuZ1ZhbHVlXT1cImRvbWFpbi5pZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkb21haW4ubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydBY2Nlc3MgbGV2ZWwnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByZXF1aXJlZCBmb3JtQ29udHJvbE5hbWU9XCJsZXZlbFwiIGRhdGEtdGVzdGlkPVwiZm9ybS1taXNzaW9uLWxldmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgbGV2ZWwgb2YgYXZhaWxhYmxlTGV2ZWxzXCIgW25nVmFsdWVdPVwibGV2ZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgbGV2ZWwgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3sgJ0F1dGhvcml6ZWQgbG9jYXRpb24nIHwgdHJhbnNsYXRlIH19KjwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiICpuZ0lmPVwiYXZhaWxhYmxlU3BhY2VzXCI+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcmVxdWlyZWQgZm9ybUNvbnRyb2xOYW1lPVwic3BhY2VcIiAoY2hhbmdlKT1cIm9uU3BhY2VDbGljaygpXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1zcGFjZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwidmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ3NwYWNlJ10pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgc3BhY2Ugb2YgYXZhaWxhYmxlU3BhY2VzXCIgW25nVmFsdWVdPVwic3BhY2UuaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgc3BhY2UubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtdGVzdGlkPVwiZm9ybS1taXNzaW9uLXNwYWNlLWludmFsaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdHJhbnNsYXRlXT1cInZhbGlkYXRvcnNTZXJ2aWNlLmdldEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydzcGFjZSddKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydzcGFjZSddKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCIgKm5nSWY9XCIhYXZhaWxhYmxlU3BhY2VzXCI+XHJcbiAgICAgICAgICAgICAgICB7eyAnTm8gbG9jYXRpb25zIGF2YWlsYWJsZScgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3sgJ0F1dGhvcml6ZWQgem9uZScgfCB0cmFuc2xhdGUgfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIiAqbmdJZj1cInpvbmVzRm9yU3BhY2U7IGVsc2Ugbm9TcGFjZVwiPlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cInpvbmVcIiBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi16b25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbbmdWYWx1ZV09XCJkZWZhdWx0Wm9uZS5pZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAnQWxsIHpvbmVzJyB8IHRyYW5zbGF0ZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHpvbmUgb2Ygem9uZXNGb3JTcGFjZVwiIFtuZ1ZhbHVlXT1cInpvbmUuaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgem9uZS5uYW1lIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9TcGFjZT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOCBoaW50LWNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiaGludCBrZXl3b3Jkc1J1bGVzXCI+e3snWW91IG5lZWQgdG8gY2hvb3NlIHRoZSBsb2NhdGlvbiBmaXJzdCcgfCB0cmFuc2xhdGV9fSA8L3A+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydMYW5ndWFnZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIGZvcm1Db250cm9sTmFtZT1cImxvY2FsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwibnVsbFwiPnt7J05vdCBhcHBsaWNhYmxlJyB8IHRyYW5zbGF0ZX19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgbG9jYWxlIG9mIGxvY2FsZXNcIiBbbmdWYWx1ZV09XCJsb2NhbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgbG9jYWxlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSBIYXNodGFncyBhcmUgYXZhaWxhYmxlIGFmdGVyIFNwYWNlIGlzIHNldCAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydIYXNodGFncycgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiICpuZ0lmPVwic3BhY2VJRC52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJrZXl3b3Jkc1J1bGVzXCIgKm5nSWY9XCJhdmFpbGFibGVIYXNodGFncy5sZW5ndGggPiAwXCI+e3snQXZhaWxhYmxlIGhhc2h0YWdzJyB8IHRyYW5zbGF0ZX19IDwvcD5cclxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwia2V5d29yZHNSdWxlc1wiICpuZ0lmPVwiYXZhaWxhYmxlSGFzaHRhZ3MubGVuZ3RoID09PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3snTm8gaGFzaHRhZ3MgY3JlYXRlZCBmb3IgdGhpcyBsb2NhdGlvbicgfCB0cmFuc2xhdGV9fSA8L3A+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiYXZhaWxhYmxlSGFzaHRhZ3MubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImtleXdvcmRzRGlzcGxheSBuby1ib3JkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImtleXdvcmRzZGlzcGxheUNvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBoYXNodGFnIG9mIGF2YWlsYWJsZUhhc2h0YWdzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiaGFzaHRhZ0FkZGVkKGhhc2h0YWcpID8gJ2tleXdvcmRzSXRlbSBhZGRlZCcgOiAna2V5d29yZHNJdGVtJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uSGFzaHRhZ0NsaWNrKGhhc2h0YWcpXCIgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ2JUb29sdGlwPVwie3toYXNodGFnQWRkZWQoaGFzaHRhZykgPyAoJ1JlbW92ZSd8dHJhbnNsYXRlKSA6ICgnQWRkJ3x0cmFuc2xhdGUpIH19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3toYXNodGFnLm5hbWV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImtleXdvcmRzUnVsZXNcIj57eydBZGRlZCBoYXNodGFncycgfCB0cmFuc2xhdGV9fSA8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwia2V5d29yZHNEaXNwbGF5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrZXl3b3Jkc2Rpc3BsYXlDb250YWluZXJcIiAqbmdJZj1cImFkZGVkSGFzaHRhZ3MubGVuZ3RoPiAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJrZXl3b3Jkc0l0ZW1cIiAqbmdGb3I9XCJsZXQgaGFzaHRhZyBvZiBhZGRlZEhhc2h0YWdzXCI+e3sgaGFzaHRhZy5uYW1lIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VCdXR0b25cIiAoY2xpY2spPVwicmVtb3ZlSGFzaHRhZyhoYXNodGFnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNyb3NzSXRlbVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTggaGludC1jb250YWluZXJcIiAqbmdJZj1cIiFzcGFjZUlELnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImhpbnQga2V5d29yZHNSdWxlc1wiPnt7J1lvdSBuZWVkIHRvIGNob29zZSB0aGUgbG9jYXRpb24gZmlyc3QnIHwgdHJhbnNsYXRlfX0gPC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snTWlzc2lvbiBTdGFydCBEYXRlJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBwbGFjZWhvbGRlcj1cImRkL21tL3l5eXlcIiBmb3JtQ29udHJvbE5hbWU9XCJzdGFydERhdGVcIiBuZ2JEYXRlcGlja2VyXHJcbiAgICAgICAgICAgICAgICAgICAgI2QxPVwibmdiRGF0ZXBpY2tlclwiIGRhdGEtdGVzdGlkPVwiZm9ybS1taXNzaW9uLXN0YXJ0RGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwidmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ3N0YXJ0RGF0ZSddKVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWFwcGVuZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IGNhbGVuZGFyXCIgKGNsaWNrKT1cImQxLnRvZ2dsZSgpXCIgdHlwZT1cImJ1dHRvblwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtdGVzdGlkPVwiZm9ybS1taXNzaW9uLXN0YXJ0RGF0ZS1pbnZhbGlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RyYW5zbGF0ZV09XCJ2YWxpZGF0b3JzU2VydmljZS5nZXRFcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1snc3RhcnREYXRlJ10pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIgdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ3N0YXJ0RGF0ZSddKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snTWlzc2lvbiBTdGFydCBUaW1lJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGNvbC1zbS04IHRpbWVab25lQ29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICA8bmdiLXRpbWVwaWNrZXIgWyhuZ01vZGVsKV09XCJtaXNzaW9uVGltZVN0YXJ0XCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiPjwvbmdiLXRpbWVwaWNrZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snTWlzc2lvbiBFbmQgRGF0ZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcGxhY2Vob2xkZXI9XCJkZC9tbS95eXl5XCIgbmdiRGF0ZXBpY2tlciAjZDI9XCJuZ2JEYXRlcGlja2VyXCJcclxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJlbmREYXRlXCIgZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tZW5kRGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwidmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ2VuZERhdGUnXSlcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1hcHBlbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBjYWxlbmRhclwiIChjbGljayk9XCJkMi50b2dnbGUoKVwiIHR5cGU9XCJidXR0b25cIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1lbmREYXRlLWludmFsaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdHJhbnNsYXRlXT1cInZhbGlkYXRvcnNTZXJ2aWNlLmdldEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydlbmREYXRlJ10pXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIgdmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ2VuZERhdGUnXSlcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J01pc3Npb24gRW5kIFRpbWUnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgY29sLXNtLTggdGltZVpvbmVDb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgIDxuZ2ItdGltZXBpY2tlciBbKG5nTW9kZWwpXT1cIm1pc3Npb25UaW1lRW5kXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiPjwvbmdiLXRpbWVwaWNrZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWNvbnRyb2wtZGl2IGFjdGlvbi1idXR0b24tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIFtkaXNhYmxlZF09XCJtaXNzaW9uRm9ybS5pbnZhbGlkXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1yLTMgYWN0aW9uLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1zdWJtaXQtYnRuXCI+e3snU2F2ZScgfFxyXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIiBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1jYW5jZWwtYnRuXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIGFjdGlvbi1idXR0b25cIj57eydDYW5jZWwnIHxcclxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Zvcm0+XHJcbjwvZGl2PiJdfQ==
221
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1taXNzaW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zbWFydGVycGxhbi1hZG1pbi9zcmMvbGliL3VzZXIvZm9ybS1taXNzaW9uL2Zvcm0tbWlzc2lvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi91c2VyL2Zvcm0tbWlzc2lvbi9mb3JtLW1pc3Npb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUvRSxPQUFPLEVBRUgsV0FBVyxFQUFVLE1BQU0sRUFDTyxXQUFXLEVBQUUsV0FBVyxFQUNKLGtCQUFrQixFQUMzRSxNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDakMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVDLE9BQU8sRUFBcUIsYUFBYSxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDOzs7Ozs7O0FBUXZILE1BQU0sT0FBTyxvQkFBb0I7SUE4QzdCLFlBQ1ksRUFBZSxFQUNmLFlBQTBCLEVBQzFCLFdBQTRCLEVBQzVCLGFBQTRCLEVBQzVCLG1CQUF3QyxFQUN4QyxXQUF3QixFQUN4QixjQUE4QixFQUM5QixhQUE0QixFQUM3QixpQkFBb0M7UUFSbkMsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUM1QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM3QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBdkNyQyxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBTTFELHNCQUFpQixHQUFjLEVBQUUsQ0FBQztRQU1sQyxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBTWhCLHFCQUFnQixHQUFXLEVBQUUsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMseUJBQXlCO1FBRXJFLG1CQUFjLEdBQVcsRUFBRSxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUM7UUFFekMsa0JBQWEsR0FBYyxFQUFFLENBQUM7UUFNOUIsY0FBUyxHQUFZLEtBQUssQ0FBQztJQVl2QixDQUFDO0lBRUwsS0FBSyxDQUFDLFFBQVE7UUFDVixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsTUFBTSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDeEIsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1gsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1NBQ3JFO1FBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyx1QkFBdUI7UUFDaEcsSUFBSSxDQUFDLE9BQU8sR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUMxQjthQUFNO1lBQ0gsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ3hCO0lBQ0wsQ0FBQztJQUVELGNBQWM7UUFDVixJQUFJLENBQUMsY0FBYztZQUNmLElBQUksQ0FBQyxXQUFXLENBQUMsK0JBQStCLEVBQUUsQ0FBQztRQUN2RCxJQUFJLENBQUMsZUFBZTtZQUNoQixJQUFJLENBQUMsV0FBVyxDQUFDLCtCQUErQixFQUFFLENBQUM7UUFDdkQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVTtRQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2YsTUFBTSxPQUFPLEdBQ1QsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLDJCQUEyQixDQUNoRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUNsQyxDQUFDO1lBQ04sSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7U0FDMUI7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUFlO1FBQzdCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQ2xFLE9BQU8sQ0FDVixDQUFDO0lBQ04sQ0FBQztJQUVELElBQUksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELElBQUksSUFBSTtRQUNKLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELEtBQUssQ0FBQyxlQUFlO1FBQ2pCLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQztRQUMxQixJQUFJLE9BQU8sR0FBUSxJQUFJLENBQUM7UUFFeEIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUU3QixJQUFJLENBQUMsQ0FBQyxhQUFhLEVBQUU7WUFDakIsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7WUFDbkUsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7U0FDdkQ7UUFDRCxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUU7WUFDZixNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7WUFDakUsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1NBQ25EO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDakMsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsc0JBQXNCLENBQ2pFLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUNqQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUNsQyxDQUFDO1FBQ0YsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQzdCLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRTtZQUNSLFlBQVksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUM5RCxjQUFjLEVBQUUsQ0FBQyxDQUFDLGNBQWM7WUFDaEMscUJBQXFCLEVBQUUsQ0FBQyxDQUFDLHFCQUFxQjtZQUM5QyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDbkMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNoQixLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDdkMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLGFBQWEsRUFBRSxFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQztZQUNuRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1lBQ3BCLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDaEIsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUNsQixTQUFTLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1lBQzFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUM7U0FDekMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNyQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUMzRCxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQ2xDLENBQUM7U0FDTDtRQUNELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVk7UUFDZCxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUNoRCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FDckIsQ0FBQztRQUNGLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEQsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMzRCxLQUFLLENBQUMsTUFBTSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYTtRQUNmLElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLHNCQUFzQixDQUNqRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsRUFBRSxFQUM5QixJQUFJLENBQUMsdUJBQXVCLENBQUMsRUFBRSxDQUNsQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUM3QixJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUMvQixLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDO1lBQzVCLFlBQVksRUFBRTtnQkFDVixFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7YUFDOUQ7WUFDRCxjQUFjLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEVBQUU7WUFDOUMscUJBQXFCLEVBQUUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEVBQUU7WUFDdEQsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDaEMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ1YsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsYUFBYSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1lBQ3hELE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQztZQUNmLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDNUIsU0FBUyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztZQUNyQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO1NBQ3RDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxjQUFjLENBQUMsT0FBZ0I7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDcEM7YUFBTTtZQUNILElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ3JFO0lBQ0wsQ0FBQztJQUVELFlBQVksQ0FBQyxPQUFnQjtRQUN6QixPQUFPLENBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ25CLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLE9BQU8sQ0FBQyxFQUFFLENBQzNDLEtBQUssU0FBUyxDQUNsQixDQUFDO0lBQ04sQ0FBQztJQUVELGFBQWEsQ0FBQyxPQUFnQjtRQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQsUUFBUTtRQUNKLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRTtZQUN6QixnQ0FBZ0M7WUFDaEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3BDLE9BQU87U0FDVjtRQUNELElBQUksZUFBdUIsQ0FBQztRQUM1QixJQUFJLGFBQXFCLENBQUM7UUFDMUIsSUFBSSxTQUFTLENBQUMsU0FBUyxFQUFFO1lBQ3JCLE1BQU0sbUJBQW1CLEdBQUcsU0FBUyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7WUFDeEUsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQzNELGVBQWUsR0FBRyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDdkM7UUFDRCxJQUFJLFNBQVMsQ0FBQyxPQUFPLEVBQUU7WUFDbkIsTUFBTSxpQkFBaUIsR0FBRyxTQUFTLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7WUFDbEUsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3ZELGFBQWEsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDbkM7UUFFRCxJQUFJLGFBQWEsSUFBSSxlQUFlLElBQUksQ0FBQyxhQUFhLEdBQUcsZUFBZSxDQUFDLEVBQUU7WUFDdkUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDdEIsT0FBTztTQUNWO2FBQU07WUFDSCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztTQUMxQjtRQUVELE1BQU0sWUFBWSxHQUFZO1lBQzFCLGNBQWMsRUFBRSxTQUFTLENBQUMsY0FBYztZQUN4QyxxQkFBcUIsRUFBRSxTQUFTLENBQUMscUJBQXFCO1lBQ3RELEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSztZQUN0QixJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUk7WUFDcEIsV0FBVyxFQUFFLFNBQVMsQ0FBQyxXQUFXO1lBQ2xDLGFBQWEsRUFBRSxlQUFlO1lBQzlCLFdBQVcsRUFBRSxhQUFhO1lBQzFCLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTztZQUMxQixNQUFNLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtZQUM3QixXQUFXLEVBQUUsSUFBSSxDQUFDLGFBQWE7Z0JBQzNCLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVc7Z0JBQ2hDLENBQUMsQ0FBQyxXQUFXLENBQUMsbUJBQW1CO1lBQ3JDLE1BQU0sRUFBRSxTQUFTLENBQUMsTUFBTTtTQUMzQixDQUFDO1FBQ0YsWUFBWSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVELElBQUksU0FBUyxDQUFDLEtBQUssRUFBRTtZQUNqQixZQUFZLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUM7U0FDMUM7UUFDRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUU7WUFDaEIsWUFBWSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO1NBQ3hDO1FBQ0QsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3BCLFlBQVksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7U0FDM0M7UUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxRQUFRO1FBQ0osSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QyxDQUFDOztpSEF0UVEsb0JBQW9CO3FHQUFwQixvQkFBb0IsbVRDbEJqQyx3aWFBb09NOzJGRGxOTyxvQkFBb0I7a0JBTGhDLFNBQVM7K0JBQ0ksa0JBQWtCOzRVQU1uQixhQUFhO3NCQUFyQixLQUFLO2dCQUVHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFNSSxpQkFBaUI7c0JBQTFCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUJ1aWxkZXIsIEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHtcclxuICAgIFpvbmUsIE1pc3Npb24sIE9yZ2FuaXNhdGlvbiwgU3BhY2UsIFJvbGVTdGF0dXMsXHJcbiAgICBMZXZlbFN0YXR1cywgRG9tYWluLCBMb2NhbGUsIEJhc2VVc2VyU2VydmljZSwgRG9tYWluU2VydmljZSxcclxuICAgIE9yZ2FuaXNhdGlvblNlcnZpY2UsIFpvbmVTZXJ2aWNlLCBlbnVtVG9BcnJheSwgRW1haWxTdGF0dXMsXHJcbiAgICBIYXNodGFnLCBTcGFjZVNlcnZpY2UsIExvY2FsZVNlcnZpY2UsIEhhc2h0YWdTZXJ2aWNlLCBzdHJpbmdMb2NhbGVUb0VudW1cclxufSBmcm9tICdAc21hcnRlcnBsYW4vbmd4LXNtYXJ0ZXJwbGFuLWNvcmUnO1xyXG5pbXBvcnQgeyBEYXRlVGltZSB9IGZyb20gXCJsdXhvblwiO1xyXG5pbXBvcnQgeyBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBWYWxpZGF0b3JzU2VydmljZSwgdGV4dFZhbGlkYXRvciwgbm9FbXB0eVZhbGlkYXRvciwgZmxvYXRWYWxpZGF0b3IgfSBmcm9tIFwiQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlXCI7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgICBzZWxlY3RvcjogJ2xpYi1mb3JtLW1pc3Npb24nLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Zvcm0tbWlzc2lvbi5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9mb3JtLW1pc3Npb24uY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRm9ybU1pc3Npb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuICAgIEBJbnB1dCgpIG1pc3Npb25Ub0VkaXQ6IE1pc3Npb247XHJcblxyXG4gICAgQElucHV0KCkgb3JnYW5pc2F0aW9uRm9yTWlzc2lvbjogT3JnYW5pc2F0aW9uO1xyXG5cclxuICAgIEBJbnB1dCgpIGlzU1A6IGJvb2xlYW47XHJcblxyXG4gICAgQElucHV0KCkgdXNlckZvck1pc3Npb25JRDogc3RyaW5nO1xyXG5cclxuICAgIEBJbnB1dCgpIGN1cnJlbnRVc2VyT3JnYW5pc2F0aW9uOiBPcmdhbmlzYXRpb247XHJcblxyXG4gICAgbWlzc2lvbkZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgICBhdmFpbGFibGVTcGFjZXM6IFNwYWNlW107XHJcblxyXG4gICAgQE91dHB1dCgpIGFkZGVkTWlzc2lvbklucHV0ID0gbmV3IEV2ZW50RW1pdHRlcjxNaXNzaW9uPigpO1xyXG5cclxuICAgIGF2YWlsYWJsZVJvbGVzOiBSb2xlU3RhdHVzW107XHJcblxyXG4gICAgYXZhaWxhYmxlTGV2ZWxzOiBMZXZlbFN0YXR1c1tdO1xyXG5cclxuICAgIGF2YWlsYWJsZUhhc2h0YWdzOiBIYXNodGFnW10gPSBbXTtcclxuXHJcbiAgICBkb21haW5zOiBEb21haW5bXTtcclxuXHJcbiAgICBhbGxPcmdzOiBPcmdhbmlzYXRpb25bXTtcclxuXHJcbiAgICBpc0d1aWRlID0gZmFsc2U7XHJcblxyXG4gICAgem9uZXNGb3JTcGFjZTogWm9uZVtdO1xyXG5cclxuICAgIGRlZmF1bHRab25lOiBab25lO1xyXG5cclxuICAgIG1pc3Npb25UaW1lU3RhcnQ6IG51bWJlciA9IDEyICogNjAgKiA2MDAwMDsgLy8gbWlkZGF5IGluIG1pbGxpc2Vjb25kc1xyXG5cclxuICAgIG1pc3Npb25UaW1lRW5kOiBudW1iZXIgPSAxMiAqIDYwICogNjAwMDA7XHJcblxyXG4gICAgYWRkZWRIYXNodGFnczogSGFzaHRhZ1tdID0gW107XHJcblxyXG4gICAgY3VycmVudExvY2FsZTogTG9jYWxlO1xyXG5cclxuICAgIGxvY2FsZXM6IHN0cmluZ1tdO1xyXG5cclxuICAgIGRhdGVFcnJvcjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxyXG4gICAgICAgIHByaXZhdGUgc3BhY2VTZXJ2aWNlOiBTcGFjZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSB1c2VyU2VydmljZTogQmFzZVVzZXJTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgZG9tYWluU2VydmljZTogRG9tYWluU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIG9yZ2FuaXNhdGlvblNlcnZpY2U6IE9yZ2FuaXNhdGlvblNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSB6b25lU2VydmljZTogWm9uZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBoYXNodGFnU2VydmljZTogSGFzaHRhZ1NlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBsb2NhbGVTZXJ2aWNlOiBMb2NhbGVTZXJ2aWNlLFxyXG4gICAgICAgIHB1YmxpYyB2YWxpZGF0b3JzU2VydmljZTogVmFsaWRhdG9yc1NlcnZpY2VcclxuICAgICkgeyB9XHJcblxyXG4gICAgYXN5bmMgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVVc2VySW5mbygpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0RG9tYWlucygpO1xyXG4gICAgICAgIGlmICh0aGlzLmlzU1ApIHtcclxuICAgICAgICAgICAgdGhpcy5hbGxPcmdzID0gYXdhaXQgdGhpcy5vcmdhbmlzYXRpb25TZXJ2aWNlLmxpc3RPcmdhbmlzYXRpb25zKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuY3VycmVudExvY2FsZSA9IHN0cmluZ0xvY2FsZVRvRW51bSh0aGlzLmxvY2FsZVNlcnZpY2UuZ2V0TG9jYWxlKCkpOyAvLyB0byBtYXRjaCBlbnVtIExvY2FsZVxyXG4gICAgICAgIHRoaXMubG9jYWxlcyA9IGVudW1Ub0FycmF5KExvY2FsZSk7XHJcbiAgICAgICAgaWYgKHRoaXMubWlzc2lvblRvRWRpdCkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRGb3JtRm9yRWRpdCgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdEVtcHR5Rm9ybSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVVc2VySW5mbygpIHtcclxuICAgICAgICB0aGlzLmF2YWlsYWJsZVJvbGVzID1cclxuICAgICAgICAgICAgdGhpcy51c2VyU2VydmljZS5nZXRBdmFpbGFibGVSb2xlc0ZvckN1cnJlbnRVc2VyKCk7XHJcbiAgICAgICAgdGhpcy5hdmFpbGFibGVMZXZlbHMgPVxyXG4gICAgICAgICAgICB0aGlzLnVzZXJTZXJ2aWNlLmdldEF2YWxhYmxlTGV2ZWxzRm9yQ3VycmVudFVzZXIoKTtcclxuICAgICAgICB0aGlzLmlzR3VpZGUgPSB0aGlzLnVzZXJTZXJ2aWNlLmlzR3VpZGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzZXREb21haW5zKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0d1aWRlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRvbWFpbnMgPVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kb21haW5TZXJ2aWNlLmdldERvbWFpbnNGb3JNaXNzaW9uc0Zvck9yZyhcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRVc2VyT3JnYW5pc2F0aW9uLmlkLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgdGhpcy5kb21haW5zID0gZG9tYWlucztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2V0SGFzaHRhZ3Moc3BhY2VJRDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5hdmFpbGFibGVIYXNodGFncyA9IGF3YWl0IHRoaXMuaGFzaHRhZ1NlcnZpY2UuZ2V0SGFzaHRhZ3NGb3JTcGFjZShcclxuICAgICAgICAgICAgc3BhY2VJRCxcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBzcGFjZUlEKCk6IEFic3RyYWN0Q29udHJvbCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubWlzc2lvbkZvcm0uZ2V0KFwic3BhY2VcIik7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJvbGUoKTogQWJzdHJhY3RDb250cm9sIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5taXNzaW9uRm9ybS5nZXQoXCJyb2xlXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGluaXRGb3JtRm9yRWRpdCgpIHtcclxuICAgICAgICBsZXQgc3RhcnREYXRlOiBhbnkgPSBudWxsO1xyXG4gICAgICAgIGxldCBlbmREYXRlOiBhbnkgPSBudWxsO1xyXG5cclxuICAgICAgICBjb25zdCBtID0gdGhpcy5taXNzaW9uVG9FZGl0O1xyXG5cclxuICAgICAgICBpZiAobS5zdGFydERhdGVUaW1lKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBEYXRlVGltZS5mcm9tSVNPKG0uc3RhcnREYXRlVGltZSk7XHJcbiAgICAgICAgICAgIHRoaXMubWlzc2lvblRpbWVTdGFydCA9IChkYXRlLmhvdXIgKiA2MCArIGRhdGUubWludXRlKSAqIDYwICogMTAwMDtcclxuICAgICAgICAgICAgc3RhcnREYXRlID0gZGF0ZS50b01pbGxpcygpIC0gdGhpcy5taXNzaW9uVGltZVN0YXJ0O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobS5lbmREYXRlVGltZSkge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRlID0gRGF0ZVRpbWUuZnJvbUlTTyhtLmVuZERhdGVUaW1lKTtcclxuICAgICAgICAgICAgdGhpcy5taXNzaW9uVGltZUVuZCA9IChkYXRlLmhvdXIgKiA2MCArIGRhdGUubWludXRlKSAqIDYwICogMTAwMDtcclxuICAgICAgICAgICAgZW5kRGF0ZSA9IGRhdGUudG9NaWxsaXMoKSAtIHRoaXMubWlzc2lvblRpbWVFbmQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnVzZXJGb3JNaXNzaW9uSUQgPSBtLnVzZXJJRDtcclxuICAgICAgICB0aGlzLmF2YWlsYWJsZVNwYWNlcyA9IGF3YWl0IHRoaXMuc3BhY2VTZXJ2aWNlLmdldEFsbG93ZWRTcGFjZXNGb3JPcmcoXHJcbiAgICAgICAgICAgIHRoaXMubWlzc2lvblRvRWRpdC5vcmdhbmlzYXRpb25JRCxcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50VXNlck9yZ2FuaXNhdGlvbi5pZCxcclxuICAgICAgICApO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0SGFzaHRhZ3MobS5zcGFjZUlEKTtcclxuICAgICAgICB0aGlzLm1pc3Npb25Gb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgICAgICAgIGlkOiBtLmlkLFxyXG4gICAgICAgICAgICBvcmdhbmlzYXRpb246IFt7IHZhbHVlOiBtLm9yZ2FuaXNhdGlvbi5uYW1lLCBkaXNhYmxlZDogdHJ1ZSB9XSxcclxuICAgICAgICAgICAgb3JnYW5pc2F0aW9uSUQ6IG0ub3JnYW5pc2F0aW9uSUQsXHJcbiAgICAgICAgICAgIG9yZGVyZWRPcmdhbmlzYXRpb25JRDogbS5vcmRlcmVkT3JnYW5pc2F0aW9uSUQsXHJcbiAgICAgICAgICAgIHJvbGU6IFttLnJvbGUsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgICBsZXZlbDogW20ubGV2ZWxdLFxyXG4gICAgICAgICAgICBzcGFjZTogW20uc3BhY2VJRCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBbbS5kZXNjcmlwdGlvbiwgW3RleHRWYWxpZGF0b3IoKSwgbm9FbXB0eVZhbGlkYXRvcigpXV0sXHJcbiAgICAgICAgICAgIGRvbWFpbnM6IFttLmRvbWFpbnNdLFxyXG4gICAgICAgICAgICB6b25lOiBbbS56b25lSURdLFxyXG4gICAgICAgICAgICBsb2NhbGU6IFttLmxvY2FsZV0sXHJcbiAgICAgICAgICAgIHN0YXJ0RGF0ZTogW3N0YXJ0RGF0ZSwgW2Zsb2F0VmFsaWRhdG9yKCldXSxcclxuICAgICAgICAgICAgZW5kRGF0ZTogW2VuZERhdGUsIFtmbG9hdFZhbGlkYXRvcigpXV0sXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgaWYgKG0uaGFzaHRhZ3MgJiYgbS5oYXNodGFncy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkZWRIYXNodGFncyA9IHRoaXMuYXZhaWxhYmxlSGFzaHRhZ3MuZmlsdGVyKChoYXNodGFnKSA9PlxyXG4gICAgICAgICAgICAgICAgbS5oYXNodGFncy5pbmNsdWRlcyhoYXNodGFnLmlkKSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5vblNwYWNlQ2xpY2soKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvblNwYWNlQ2xpY2soKSB7XHJcbiAgICAgICAgY29uc3Qgem9uZXMgPSBhd2FpdCB0aGlzLnpvbmVTZXJ2aWNlLmdldFpvbmVzQnlTcGFjZShcclxuICAgICAgICAgICAgdGhpcy5zcGFjZUlELnZhbHVlLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5kZWZhdWx0Wm9uZSA9IHpvbmVzLmZpbmQoKHpvbmUpID0+ICF6b25lLnBhcmVudElEKTtcclxuICAgICAgICBjb25zdCBpbmRleE9mRGVmYXVsdFpvbmUgPSB6b25lcy5pbmRleE9mKHRoaXMuZGVmYXVsdFpvbmUpO1xyXG4gICAgICAgIHpvbmVzLnNwbGljZShpbmRleE9mRGVmYXVsdFpvbmUsIDEpO1xyXG4gICAgICAgIHRoaXMuem9uZXNGb3JTcGFjZSA9IHpvbmVzO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2V0SGFzaHRhZ3ModGhpcy5zcGFjZUlELnZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0RW1wdHlGb3JtKCkge1xyXG4gICAgICAgIHRoaXMuYXZhaWxhYmxlU3BhY2VzID0gYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2UuZ2V0QWxsb3dlZFNwYWNlc0Zvck9yZyhcclxuICAgICAgICAgICAgdGhpcy5vcmdhbmlzYXRpb25Gb3JNaXNzaW9uLmlkLFxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRVc2VyT3JnYW5pc2F0aW9uLmlkLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5taXNzaW9uRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgICAgICByb2xlOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgICBsZXZlbDogW0xldmVsU3RhdHVzLk1JTklNVU1dLFxyXG4gICAgICAgICAgICBvcmdhbmlzYXRpb246IFtcclxuICAgICAgICAgICAgICAgIHsgdmFsdWU6IHRoaXMub3JnYW5pc2F0aW9uRm9yTWlzc2lvbi5uYW1lLCBkaXNhYmxlZDogdHJ1ZSB9LFxyXG4gICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICBvcmdhbmlzYXRpb25JRDogdGhpcy5vcmdhbmlzYXRpb25Gb3JNaXNzaW9uLmlkLFxyXG4gICAgICAgICAgICBvcmRlcmVkT3JnYW5pc2F0aW9uSUQ6IHRoaXMuY3VycmVudFVzZXJPcmdhbmlzYXRpb24uaWQsXHJcbiAgICAgICAgICAgIHNwYWNlOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICAgICAgICB6b25lOiBbJyddLFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogW1wiXCIsIFt0ZXh0VmFsaWRhdG9yKCksIG5vRW1wdHlWYWxpZGF0b3IoKV1dLFxyXG4gICAgICAgICAgICBkb21haW5zOiBbbnVsbF0sXHJcbiAgICAgICAgICAgIGxvY2FsZTogW3RoaXMuY3VycmVudExvY2FsZV0sXHJcbiAgICAgICAgICAgIHN0YXJ0RGF0ZTogW251bGwsIFtmbG9hdFZhbGlkYXRvcigpXV0sXHJcbiAgICAgICAgICAgIGVuZERhdGU6IFtudWxsLCBbZmxvYXRWYWxpZGF0b3IoKV1dLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIG9uSGFzaHRhZ0NsaWNrKGhhc2h0YWc6IEhhc2h0YWcpIHtcclxuICAgICAgICBpZiAoIXRoaXMuaGFzaHRhZ0FkZGVkKGhhc2h0YWcpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkZWRIYXNodGFncy5wdXNoKGhhc2h0YWcpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkZWRIYXNodGFncy5zcGxpY2UodGhpcy5hZGRlZEhhc2h0YWdzLmluZGV4T2YoaGFzaHRhZyksIDEpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBoYXNodGFnQWRkZWQoaGFzaHRhZzogSGFzaHRhZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIHRoaXMuYWRkZWRIYXNodGFncy5maW5kKFxyXG4gICAgICAgICAgICAgICAgKF9oYXNodGFnKSA9PiBfaGFzaHRhZy5pZCA9PT0gaGFzaHRhZy5pZCxcclxuICAgICAgICAgICAgKSAhPT0gdW5kZWZpbmVkXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVIYXNodGFnKGhhc2h0YWc6IEhhc2h0YWcpIHtcclxuICAgICAgICB0aGlzLmFkZGVkSGFzaHRhZ3Muc3BsaWNlKHRoaXMuYWRkZWRIYXNodGFncy5pbmRleE9mKGhhc2h0YWcpLCAxKTtcclxuICAgIH1cclxuXHJcbiAgICBvblN1Ym1pdCgpIHtcclxuICAgICAgICBjb25zdCBmb3JtVmFsdWUgPSB0aGlzLm1pc3Npb25Gb3JtLnZhbHVlO1xyXG4gICAgICAgIGlmICghdGhpcy5taXNzaW9uRm9ybS52YWxpZCkge1xyXG4gICAgICAgICAgICAvLyB0aGlzIHNob3dzIGVycm9ycyBpbiB0aGUgZm9ybVxyXG4gICAgICAgICAgICB0aGlzLm1pc3Npb25Gb3JtLm1hcmtBbGxBc1RvdWNoZWQoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgc3RhcnREYXRlU3RyaW5nOiBzdHJpbmc7XHJcbiAgICAgICAgbGV0IGVuZERhdGVTdHJpbmc6IHN0cmluZztcclxuICAgICAgICBpZiAoZm9ybVZhbHVlLnN0YXJ0RGF0ZSkge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRlSG91clN0YXJ0TnVtYmVyID0gZm9ybVZhbHVlLnN0YXJ0RGF0ZSArIHRoaXMubWlzc2lvblRpbWVTdGFydDtcclxuICAgICAgICAgICAgY29uc3Qgc3RhcnREYXRlID0gRGF0ZVRpbWUuZnJvbU1pbGxpcyhkYXRlSG91clN0YXJ0TnVtYmVyKTtcclxuICAgICAgICAgICAgc3RhcnREYXRlU3RyaW5nID0gc3RhcnREYXRlLnRvSVNPKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmb3JtVmFsdWUuZW5kRGF0ZSkge1xyXG4gICAgICAgICAgICBjb25zdCBkYXRlSG91ckVuZE51bWJlciA9IGZvcm1WYWx1ZS5lbmREYXRlICsgdGhpcy5taXNzaW9uVGltZUVuZDtcclxuICAgICAgICAgICAgY29uc3QgZW5kRGF0ZSA9IERhdGVUaW1lLmZyb21NaWxsaXMoZGF0ZUhvdXJFbmROdW1iZXIpO1xyXG4gICAgICAgICAgICBlbmREYXRlU3RyaW5nID0gZW5kRGF0ZS50b0lTTygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGVuZERhdGVTdHJpbmcgJiYgc3RhcnREYXRlU3RyaW5nICYmIChlbmREYXRlU3RyaW5nIDwgc3RhcnREYXRlU3RyaW5nKSkge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGVFcnJvciA9IHRydWU7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRhdGVFcnJvciA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbWlzc2lvbklucHV0OiBNaXNzaW9uID0ge1xyXG4gICAgICAgICAgICBvcmdhbmlzYXRpb25JRDogZm9ybVZhbHVlLm9yZ2FuaXNhdGlvbklELFxyXG4gICAgICAgICAgICBvcmRlcmVkT3JnYW5pc2F0aW9uSUQ6IGZvcm1WYWx1ZS5vcmRlcmVkT3JnYW5pc2F0aW9uSUQsXHJcbiAgICAgICAgICAgIGxldmVsOiBmb3JtVmFsdWUubGV2ZWwsXHJcbiAgICAgICAgICAgIHJvbGU6IGZvcm1WYWx1ZS5yb2xlLFxyXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogZm9ybVZhbHVlLmRlc2NyaXB0aW9uLFxyXG4gICAgICAgICAgICBzdGFydERhdGVUaW1lOiBzdGFydERhdGVTdHJpbmcsXHJcbiAgICAgICAgICAgIGVuZERhdGVUaW1lOiBlbmREYXRlU3RyaW5nLFxyXG4gICAgICAgICAgICBkb21haW5zOiBmb3JtVmFsdWUuZG9tYWlucyxcclxuICAgICAgICAgICAgdXNlcklEOiB0aGlzLnVzZXJGb3JNaXNzaW9uSUQsXHJcbiAgICAgICAgICAgIGVtYWlsU3RhdHVzOiB0aGlzLm1pc3Npb25Ub0VkaXRcclxuICAgICAgICAgICAgICAgID8gdGhpcy5taXNzaW9uVG9FZGl0LmVtYWlsU3RhdHVzXHJcbiAgICAgICAgICAgICAgICA6IEVtYWlsU3RhdHVzLkNSRUFUSU9OX1RPX0RFTElWRVIsXHJcbiAgICAgICAgICAgIGxvY2FsZTogZm9ybVZhbHVlLmxvY2FsZSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIG1pc3Npb25JbnB1dC5oYXNodGFncyA9IHRoaXMuYWRkZWRIYXNodGFncy5tYXAoKGgpID0+IGguaWQpO1xyXG4gICAgICAgIGlmIChmb3JtVmFsdWUuc3BhY2UpIHtcclxuICAgICAgICAgICAgbWlzc2lvbklucHV0LnNwYWNlSUQgPSBmb3JtVmFsdWUuc3BhY2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChmb3JtVmFsdWUuem9uZSkge1xyXG4gICAgICAgICAgICBtaXNzaW9uSW5wdXQuem9uZUlEID0gZm9ybVZhbHVlLnpvbmU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLm1pc3Npb25Ub0VkaXQpIHtcclxuICAgICAgICAgICAgbWlzc2lvbklucHV0LmlkID0gdGhpcy5taXNzaW9uVG9FZGl0LmlkO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmFkZGVkTWlzc2lvbklucHV0LmVtaXQobWlzc2lvbklucHV0KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkNhbmNlbCgpIHtcclxuICAgICAgICB0aGlzLmFkZGVkTWlzc2lvbklucHV0LmVtaXQobnVsbCk7XHJcbiAgICB9XHJcblxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJmb3JtLWNvbnRhaW50ZXJcIiAqbmdJZj1cIm1pc3Npb25Gb3JtXCI+XHJcbiAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMXJlbTtcIj5cclxuICAgICAgICA8aDQ+e3sgJ01pc3Npb24gZGV0YWlscycgfCB0cmFuc2xhdGUgfX08L2g0PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8Zm9ybSAobmdTdWJtaXQpPVwib25TdWJtaXQoKVwiIFtmb3JtR3JvdXBdPVwibWlzc2lvbkZvcm1cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydPcmdhbmlzYXRpb24nIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGRhdGEtdGVzdGlkPVwiZm9ybS1taXNzaW9uLW9yZ2FuaXNhdGlvblwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJvcmdhbmlzYXRpb25cIj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiICpuZ0lmPVwiaXNTUFwiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7ICdPcmRlcmVkIGJ5JyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHJlcXVpcmVkIGZvcm1Db250cm9sTmFtZT1cIm9yZGVyZWRPcmdhbmlzYXRpb25JRFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9yZyBvZiBhbGxPcmdzXCIgW25nVmFsdWVdPVwib3JnLmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IG9yZy5uYW1lIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J0Rlc2NyaXB0aW9uJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJkZXNjcmlwdGlvblwiIHJvd3M9XCIxMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwidmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ2Rlc2NyaXB0aW9uJ10pXCJcclxuICAgICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1kZXNjcmlwdGlvblwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW52YWxpZC1mZWVkYmFja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtdGVzdGlkPVwiZm9ybS1taXNzaW9uLWRlc2NyaXB0aW9uLWludmFsaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdHJhbnNsYXRlXT1cInZhbGlkYXRvcnNTZXJ2aWNlLmdldEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydkZXNjcmlwdGlvbiddKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydkZXNjcmlwdGlvbiddKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snUm9sZScgfCB0cmFuc2xhdGV9fSo8L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiByZXF1aXJlZCBmb3JtQ29udHJvbE5hbWU9XCJyb2xlXCIgZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tcm9sZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWludmFsaWRdPVwidmFsaWRhdG9yc1NlcnZpY2UuaXNDb250cm9sRXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ3JvbGUnXSlcIj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCByIG9mIGF2YWlsYWJsZVJvbGVzXCIgW25nVmFsdWVdPVwiclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7eyByIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tcm9sZS1pbnZhbGlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RyYW5zbGF0ZV09XCJ2YWxpZGF0b3JzU2VydmljZS5nZXRFcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1sncm9sZSddKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydyb2xlJ10pXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIlxyXG4gICAgICAgICAgICAqbmdJZj1cIm1pc3Npb25Gb3JtLmdldCgncm9sZScpLnZhbHVlICE9PSAnVklTSVRPUl9NVVNFVU0nICYmIG1pc3Npb25Gb3JtLmdldCgncm9sZScpLnZhbHVlICE9PSAnR1VJREVfTVVTRVVNJ1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J0RvbWFpbnMnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIiAqbmdJZj1cImRvbWFpbnNcIj5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBtdWx0aXBsZSBmb3JtQ29udHJvbE5hbWU9XCJkb21haW5zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgZG9tYWluIG9mIGRvbWFpbnNcIiBbbmdWYWx1ZV09XCJkb21haW4uaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZG9tYWluLm5hbWUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snQWNjZXNzIGxldmVsJyB8IHRyYW5zbGF0ZX19PC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCI+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcmVxdWlyZWQgZm9ybUNvbnRyb2xOYW1lPVwibGV2ZWxcIiBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1sZXZlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGxldmVsIG9mIGF2YWlsYWJsZUxldmVsc1wiIFtuZ1ZhbHVlXT1cImxldmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxldmVsIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7ICdBdXRob3JpemVkIGxvY2F0aW9uJyB8IHRyYW5zbGF0ZSB9fSo8L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIiAqbmdJZj1cImF2YWlsYWJsZVNwYWNlc1wiPlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHJlcXVpcmVkIGZvcm1Db250cm9sTmFtZT1cInNwYWNlXCIgKGNoYW5nZSk9XCJvblNwYWNlQ2xpY2soKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tc3BhY2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cInZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydzcGFjZSddKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHNwYWNlIG9mIGF2YWlsYWJsZVNwYWNlc1wiIFtuZ1ZhbHVlXT1cInNwYWNlLmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNwYWNlLm5hbWUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1zcGFjZS1pbnZhbGlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RyYW5zbGF0ZV09XCJ2YWxpZGF0b3JzU2VydmljZS5nZXRFcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1snc3BhY2UnXSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiB2YWxpZGF0b3JzU2VydmljZS5pc0NvbnRyb2xFcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1snc3BhY2UnXSlcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tOFwiICpuZ0lmPVwiIWF2YWlsYWJsZVNwYWNlc1wiPlxyXG4gICAgICAgICAgICAgICAge3sgJ05vIGxvY2F0aW9ucyBhdmFpbGFibGUnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7ICdBdXRob3JpemVkIHpvbmUnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04XCIgKm5nSWY9XCJ6b25lc0ZvclNwYWNlOyBlbHNlIG5vU3BhY2VcIj5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJ6b25lXCIgZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tem9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW25nVmFsdWVdPVwiZGVmYXVsdFpvbmUuaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ0FsbCB6b25lcycgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCB6b25lIG9mIHpvbmVzRm9yU3BhY2VcIiBbbmdWYWx1ZV09XCJ6b25lLmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IHpvbmUubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI25vU3BhY2U+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTggaGludC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImhpbnQga2V5d29yZHNSdWxlc1wiPnt7J1lvdSBuZWVkIHRvIGNob29zZSB0aGUgbG9jYXRpb24gZmlyc3QnIHwgdHJhbnNsYXRlfX0gPC9wPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snTGFuZ3VhZ2UnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBmb3JtQ29udHJvbE5hbWU9XCJsb2NhbGVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cIm51bGxcIj57eydOb3QgYXBwbGljYWJsZScgfCB0cmFuc2xhdGV9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGxvY2FsZSBvZiBsb2NhbGVzXCIgW25nVmFsdWVdPVwibG9jYWxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGxvY2FsZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwhLS0gSGFzaHRhZ3MgYXJlIGF2YWlsYWJsZSBhZnRlciBTcGFjZSBpcyBzZXQgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgcm93XCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1zbS00IGNvbC1mb3JtLWxhYmVsXCI+e3snSGFzaHRhZ3MnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLThcIiAqbmdJZj1cInNwYWNlSUQudmFsdWVcIj5cclxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwia2V5d29yZHNSdWxlc1wiICpuZ0lmPVwiYXZhaWxhYmxlSGFzaHRhZ3MubGVuZ3RoID4gMFwiPnt7J0F2YWlsYWJsZSBoYXNodGFncycgfCB0cmFuc2xhdGV9fSA8L3A+XHJcbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImtleXdvcmRzUnVsZXNcIiAqbmdJZj1cImF2YWlsYWJsZUhhc2h0YWdzLmxlbmd0aCA9PT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7J05vIGhhc2h0YWdzIGNyZWF0ZWQgZm9yIHRoaXMgbG9jYXRpb24nIHwgdHJhbnNsYXRlfX0gPC9wPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImF2YWlsYWJsZUhhc2h0YWdzLmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJrZXl3b3Jkc0Rpc3BsYXkgbm8tYm9yZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrZXl3b3Jkc2Rpc3BsYXlDb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgaGFzaHRhZyBvZiBhdmFpbGFibGVIYXNodGFnc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzXT1cImhhc2h0YWdBZGRlZChoYXNodGFnKSA/ICdrZXl3b3Jkc0l0ZW0gYWRkZWQnIDogJ2tleXdvcmRzSXRlbSdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkhhc2h0YWdDbGljayhoYXNodGFnKVwiIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdiVG9vbHRpcD1cInt7aGFzaHRhZ0FkZGVkKGhhc2h0YWcpID8gKCdSZW1vdmUnfHRyYW5zbGF0ZSkgOiAoJ0FkZCd8dHJhbnNsYXRlKSB9fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aGFzaHRhZy5uYW1lfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJrZXl3b3Jkc1J1bGVzXCI+e3snQWRkZWQgaGFzaHRhZ3MnIHwgdHJhbnNsYXRlfX0gPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImtleXdvcmRzRGlzcGxheVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2V5d29yZHNkaXNwbGF5Q29udGFpbmVyXCIgKm5nSWY9XCJhZGRlZEhhc2h0YWdzLmxlbmd0aD4gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwia2V5d29yZHNJdGVtXCIgKm5nRm9yPVwibGV0IGhhc2h0YWcgb2YgYWRkZWRIYXNodGFnc1wiPnt7IGhhc2h0YWcubmFtZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlQnV0dG9uXCIgKGNsaWNrKT1cInJlbW92ZUhhc2h0YWcoaGFzaHRhZylcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcm9zc0l0ZW1cIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS04IGhpbnQtY29udGFpbmVyXCIgKm5nSWY9XCIhc3BhY2VJRC52YWx1ZVwiPlxyXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJoaW50IGtleXdvcmRzUnVsZXNcIj57eydZb3UgbmVlZCB0byBjaG9vc2UgdGhlIGxvY2F0aW9uIGZpcnN0JyB8IHRyYW5zbGF0ZX19IDwvcD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J01pc3Npb24gU3RhcnQgRGF0ZScgfCB0cmFuc2xhdGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBjb2wtc20tOFwiPlxyXG4gICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcGxhY2Vob2xkZXI9XCJkZC9tbS95eXl5XCIgZm9ybUNvbnRyb2xOYW1lPVwic3RhcnREYXRlXCIgbmdiRGF0ZXBpY2tlclxyXG4gICAgICAgICAgICAgICAgICAgICNkMT1cIm5nYkRhdGVwaWNrZXJcIiBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1zdGFydERhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cInZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydzdGFydERhdGUnXSl8fCBkYXRlRXJyb3JcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cC1hcHBlbmRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBjYWxlbmRhclwiIChjbGljayk9XCJkMS50b2dnbGUoKVwiIHR5cGU9XCJidXR0b25cIj48L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImludmFsaWQtZmVlZGJhY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1zdGFydERhdGUtaW52YWxpZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0cmFuc2xhdGVdPVwidmFsaWRhdG9yc1NlcnZpY2UuZ2V0RXJyb3IobWlzc2lvbkZvcm0uY29udHJvbHNbJ3N0YXJ0RGF0ZSddKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydzdGFydERhdGUnXSlcIj48L3NwYW4+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGRhdGEtdGVzdGlkPVwiZm9ybS10ZW1wbGF0ZS1zdGFydERhdGUtaW52YWxpZC12ZXJpZlwiIHRyYW5zbGF0ZT1cImVycm9yRm9ybS5kYXRlX3N0YXJ0X2VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZGF0ZUVycm9yXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCByb3dcIj5cclxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLXNtLTQgY29sLWZvcm0tbGFiZWxcIj57eydNaXNzaW9uIFN0YXJ0IFRpbWUnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgY29sLXNtLTggdGltZVpvbmVDb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgIDxuZ2ItdGltZXBpY2tlciBbKG5nTW9kZWwpXT1cIm1pc3Npb25UaW1lU3RhcnRcIiBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCI+PC9uZ2ItdGltZXBpY2tlcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J01pc3Npb24gRW5kIERhdGUnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgY29sLXNtLThcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHBsYWNlaG9sZGVyPVwiZGQvbW0veXl5eVwiIG5nYkRhdGVwaWNrZXIgI2QyPVwibmdiRGF0ZXBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZW5kRGF0ZVwiIGRhdGEtdGVzdGlkPVwiZm9ybS1taXNzaW9uLWVuZERhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5pcy1pbnZhbGlkXT1cInZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydlbmREYXRlJ10pXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYXBwZW5kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1zZWNvbmRhcnkgY2FsZW5kYXJcIiAoY2xpY2spPVwiZDIudG9nZ2xlKClcIiB0eXBlPVwiYnV0dG9uXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnZhbGlkLWZlZWRiYWNrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS10ZXN0aWQ9XCJmb3JtLW1pc3Npb24tZW5kRGF0ZS1pbnZhbGlkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3RyYW5zbGF0ZV09XCJ2YWxpZGF0b3JzU2VydmljZS5nZXRFcnJvcihtaXNzaW9uRm9ybS5jb250cm9sc1snZW5kRGF0ZSddKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIHZhbGlkYXRvcnNTZXJ2aWNlLmlzQ29udHJvbEVycm9yKG1pc3Npb25Gb3JtLmNvbnRyb2xzWydlbmREYXRlJ10pXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS10ZXN0aWQ9XCJmb3JtLXRlbXBsYXRlLWVuZERhdGUtaW52YWxpZC12ZXJpZlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGU9XCJlcnJvckZvcm0uZGF0ZV9lbmRfc3RhcnRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJkYXRlRXJyb3JcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHJvd1wiPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tNCBjb2wtZm9ybS1sYWJlbFwiPnt7J01pc3Npb24gRW5kIFRpbWUnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgY29sLXNtLTggdGltZVpvbmVDb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgIDxuZ2ItdGltZXBpY2tlciBbKG5nTW9kZWwpXT1cIm1pc3Npb25UaW1lRW5kXCIgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiPjwvbmdiLXRpbWVwaWNrZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYnRuLWNvbnRyb2wtZGl2IGFjdGlvbi1idXR0b24tY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIFtkaXNhYmxlZF09XCJtaXNzaW9uRm9ybS5pbnZhbGlkXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1yLTMgYWN0aW9uLWJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1zdWJtaXQtYnRuXCI+e3snU2F2ZScgfFxyXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIiBkYXRhLXRlc3RpZD1cImZvcm0tbWlzc2lvbi1jYW5jZWwtYnRuXCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIGFjdGlvbi1idXR0b25cIj57eydDYW5jZWwnIHxcclxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Zvcm0+XHJcbjwvZGl2PiJdfQ==
@@ -0,0 +1,18 @@
1
+ export function dateValidator(befort) {
2
+ return (control) => {
3
+ console.log(control.parent);
4
+ console.log('avant if');
5
+ if (control.parent && control.value && control.value !== '') {
6
+ console.log('dans if');
7
+ const befortControl = control.parent.controls[befort];
8
+ console.log(befortControl);
9
+ console.log(befortControl.value);
10
+ console.log(control.value);
11
+ return { date: control.value };
12
+ }
13
+ else {
14
+ return null;
15
+ }
16
+ };
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tYWRtaW4vc3JjL2xpYi92YWxpZGF0b3JzL2RhdGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sVUFBVSxhQUFhLENBQUMsTUFBTTtJQUNsQyxPQUFPLENBQUMsT0FBd0IsRUFBMkIsRUFBRTtRQUMzRCxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QixPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBQ3ZCLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBRSxPQUFPLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssRUFBRSxFQUFFO1lBRXZELE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDdEIsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFdEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtZQUMxQixPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUNoQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUM1QixPQUFRLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBRTtTQUVsQzthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUM7U0FDYjtJQUNILENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBWYWxpZGF0b3JGbiwgQWJzdHJhY3RDb250cm9sLCBWYWxpZGF0aW9uRXJyb3JzIH0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZGF0ZVZhbGlkYXRvcihiZWZvcnQpOiBWYWxpZGF0b3JGbiB7XHJcbiAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9PiB7XHJcbiAgICBjb25zb2xlLmxvZyhjb250cm9sLnBhcmVudCk7XHJcbiAgICBjb25zb2xlLmxvZygnYXZhbnQgaWYnKVxyXG4gICAgaWYgKGNvbnRyb2wucGFyZW50JiZjb250cm9sLnZhbHVlICYmIGNvbnRyb2wudmFsdWUgIT09ICcnKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgY29uc29sZS5sb2coJ2RhbnMgaWYnKVxyXG4gICAgICAgIGNvbnN0IGJlZm9ydENvbnRyb2wgPSBjb250cm9sLnBhcmVudC5jb250cm9sc1tiZWZvcnRdO1xyXG4gICAgXHJcbiAgICAgICAgY29uc29sZS5sb2coYmVmb3J0Q29udHJvbClcclxuICAgICAgICBjb25zb2xlLmxvZyhiZWZvcnRDb250cm9sLnZhbHVlKVxyXG4gICAgICAgIGNvbnNvbGUubG9nKGNvbnRyb2wudmFsdWUpXHJcbiAgICAgIHJldHVybiAgeyBkYXRlOiBjb250cm9sLnZhbHVlIH0gO1xyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH07XHJcbn0iXX0=