ngx-techlify-core 18.75.0 → 18.76.0

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.
@@ -1,50 +1,57 @@
1
1
  import { Component, Inject } from "@angular/core";
2
+ import { DatePipe } from "@angular/common";
2
3
  import { MAT_DIALOG_DATA } from "@angular/material/dialog";
3
4
  import { Validators } from "@angular/forms";
5
+ import { TechlifyFormComponent } from '../../base-model';
6
+ import { FormConfigurationUtilityService } from '../../form-configuration/form-configuration-utility.service';
4
7
  import * as i0 from "@angular/core";
5
8
  import * as i1 from "@angular/material/dialog";
6
9
  import * as i2 from "../../core/form-validator.service";
7
- import * as i3 from "@angular/forms";
8
- import * as i4 from "../entity-file.service";
9
- import * as i5 from "../../core/alert.service";
10
+ import * as i3 from "../entity-file.service";
11
+ import * as i4 from "@angular/forms";
12
+ import * as i5 from "../../form-configuration/form-configuration-form.service";
10
13
  import * as i6 from "@angular/common";
11
- import * as i7 from "../../file-dropper/file-dropper.component";
12
- import * as i8 from "../../document-viewer/document-viewer.component";
13
- import * as i9 from "@angular/material/button";
14
- import * as i10 from "@angular/material/form-field";
15
- import * as i11 from "@angular/material/input";
16
- import * as i12 from "../../tag/techlify-tagger-tag-form-field/techlify-tagger-tag-form-field.component";
17
- const errorMessages = {
18
- url: {
19
- required: "File is required"
20
- },
21
- };
22
- export class EntityFileFormComponent {
23
- constructor(dialogRef, data, formValidatorService, fb, entityFileService, alertService) {
14
+ import * as i7 from "../../form-configuration/form-configuration-for-form/form-configuration-for-form.component";
15
+ import * as i8 from "@angular/material/button";
16
+ import * as i9 from "@angular/material/form-field";
17
+ import * as i10 from "@angular/material/input";
18
+ import * as i11 from "@angular/material/datepicker";
19
+ import * as i12 from "../../file-dropper/file-dropper.component";
20
+ import * as i13 from "../../document-viewer/document-viewer.component";
21
+ import * as i14 from "../../tag/techlify-tagger-tag-form-field/techlify-tagger-tag-form-field.component";
22
+ export class EntityFileFormComponent extends TechlifyFormComponent {
23
+ constructor(dialogRef, data, formValidatorService, service, fb, formConfigService, datePipe) {
24
+ super(formValidatorService, service);
24
25
  this.dialogRef = dialogRef;
25
26
  this.data = data;
26
27
  this.formValidatorService = formValidatorService;
28
+ this.service = service;
27
29
  this.fb = fb;
28
- this.entityFileService = entityFileService;
29
- this.alertService = alertService;
30
+ this.formConfigService = formConfigService;
31
+ this.datePipe = datePipe;
32
+ this.errorMessages = {
33
+ url: {
34
+ required: "File is required"
35
+ },
36
+ expires_on: {
37
+ required: "Expiration is required"
38
+ },
39
+ };
30
40
  this.fileList = [];
31
- this.isSaving = false;
32
- /**
33
- * Should we allow tagging entity-files?
34
- */
35
41
  this.useTechlifyTags = false;
36
42
  this.techlifyTagCategories = [];
43
+ this.isFormConfigurationLoaded = false;
44
+ this.formConfigurationUtilityService = new FormConfigurationUtilityService();
37
45
  this.createForm();
38
46
  }
39
- /** Method to create a form **/
40
47
  createForm() {
41
- //TODO: Finialize and add more validations.
42
- this.entityFileGroup = this.fb.group({
48
+ this.form = this.fb.group({
43
49
  id: [''],
44
50
  title: [''],
45
51
  details: [''],
46
52
  entity_type: [''],
47
53
  entity_id: [],
54
+ expires_on: [''],
48
55
  file: ['', Validators.required],
49
56
  url: ['', Validators.required],
50
57
  file_size: ['', Validators.required],
@@ -52,13 +59,14 @@ export class EntityFileFormComponent {
52
59
  });
53
60
  }
54
61
  ngOnInit() {
62
+ this.initializeFormConfiguration();
55
63
  if (this.data.entity) {
56
- this.entityFileGroup.get('entity_type').setValue(this.data.entity.entity_type);
57
- this.entityFileGroup.get('entity_id').setValue(this.data.entity.entity_id);
64
+ this.form.get('entity_type').setValue(this.data.entity.entity_type);
65
+ this.form.get('entity_id').setValue(this.data.entity.entity_id);
58
66
  }
59
- if (this.data.file) {
60
- this.updateMode = true;
61
- this.entityFileGroup.patchValue(this.data.file);
67
+ if (this.data.model) {
68
+ this.isUpdate = true;
69
+ this.form.patchValue(this.data.model);
62
70
  }
63
71
  if (this.data?.hideTitleAndDetails) {
64
72
  this.hideTitleAndDetails = this.data?.hideTitleAndDetails;
@@ -67,11 +75,10 @@ export class EntityFileFormComponent {
67
75
  this.useTechlifyTags = this.data?.useTechlifyTags;
68
76
  this.techlifyTagCategories = this.data?.techlifyTagCategories;
69
77
  this.techlifyTagConfig = this.data?.techlifyTagConfig;
70
- if (this.data.file?.tags) {
71
- this.entityFileGroup.get('tag_ids').setValue((this.data.file?.tags).map((tag) => tag.id));
78
+ if (this.data.model?.tags) {
79
+ this.form.get('tag_ids').setValue((this.data.model?.tags).map((tag) => tag.id));
72
80
  }
73
81
  }
74
- //File dropper config
75
82
  this.fileConfig = {
76
83
  fileId: "subjectFile",
77
84
  containerId: "subjectFileContainer",
@@ -90,71 +97,64 @@ export class EntityFileFormComponent {
90
97
  }
91
98
  };
92
99
  }
93
- //Method to trigger submit
94
- async submit() {
95
- this.assignmentFileFirstAttempt = true;
96
- if (!this.entityFileGroup.valid) {
97
- return;
98
- }
99
- const model = this.entityFileGroup.value;
100
+ initializeFormConfiguration() {
101
+ this.formConfigurationUtilityService
102
+ .initialize(this.formConfigService, 'entity-file')
103
+ .subscribe({
104
+ next: () => {
105
+ this.isFormConfigurationLoaded = true;
106
+ const expiresOn = this.form.get('expires_on');
107
+ expiresOn?.setValidators(this.formConfigurationUtilityService.getFieldRequired('expires_on')
108
+ ? Validators.required
109
+ : null);
110
+ expiresOn?.updateValueAndValidity();
111
+ }
112
+ });
113
+ }
114
+ submit(model) {
115
+ const payload = { ...(model || this.form.value) };
100
116
  if (this.hideTitleAndDetails) {
101
- model.title = model.file;
117
+ payload.title = payload.file;
102
118
  }
103
- model.tag_ids = model.tag_ids.toString();
104
- const params = {
105
- with: 'creator,tags'
106
- };
107
- this.isSaving = true;
108
- const request = this.updateMode
109
- ? this.entityFileService.update(model, params)
110
- : this.entityFileService.store(model, params);
111
- request.subscribe({
112
- next: (result) => {
113
- this.isSaving = false;
114
- this.dialogRef.close(result.item);
115
- this.alertService.addAlert('File submitted successfully', 'success');
116
- },
117
- error: () => this.isSaving = false
118
- });
119
+ payload.tag_ids = (payload.tag_ids || []).toString();
120
+ payload.expires_on = payload.expires_on
121
+ ? this.datePipe.transform(payload.expires_on, 'yyyy-MM-dd')
122
+ : null;
123
+ super.submit(payload);
124
+ }
125
+ finalisedResponse(response) {
126
+ this.alertService?.addAlert('File submitted successfully', 'success');
127
+ super.finalisedResponse(response);
119
128
  }
120
129
  async fileChanged(event) {
121
130
  this.fileList = event;
122
131
  if (this.fileList.length > 0) {
123
- const result = await this.entityFileService.uploadEntityFile(this.fileList[0], { entity_type: this.entityFileGroup.get('entity_type').value });
124
- this.entityFileGroup.patchValue(result.item);
125
- ;
132
+ const result = await this.service.uploadEntityFile(this.fileList[0], { entity_type: this.getFieldValue('entity_type') });
133
+ this.form.patchValue(result.item);
126
134
  this.fileList = [];
127
135
  }
128
136
  }
129
137
  async removeFile() {
130
- if (this.entityFileGroup.value.file) {
138
+ if (this.getFieldValue('file')) {
131
139
  try {
132
- this.entityFileGroup.patchValue({
140
+ this.form.patchValue({
133
141
  file: "",
134
142
  url: ""
135
143
  });
136
144
  }
137
145
  catch (error) {
138
- this.alertService.addAlert("Unable to remove file, try later", "warn");
146
+ this.alertService?.addAlert("Unable to remove file, try later", "warn");
139
147
  }
140
148
  }
141
149
  }
142
- /**Method to evaluate form fields*/
143
- isFieldValid(field) {
144
- return this.formValidatorService.isFieldValid(field, this.entityFileGroup, this.assignmentFileFirstAttempt);
145
- }
146
- /**Method to find error in form fields*/
147
- getErrorMessage(field) {
148
- return this.formValidatorService.getErrorMessage(field, this.entityFileGroup, errorMessages);
149
- }
150
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EntityFileFormComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.FormValidatorService }, { token: i3.UntypedFormBuilder }, { token: i4.EntityFileService }, { token: i5.AlertService }], target: i0.ɵɵFactoryTarget.Component }); }
151
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: EntityFileFormComponent, selector: "entity-file-form", ngImport: i0, template: "<form [formGroup]=\"entityFileGroup\" (ngSubmit)=\"submit()\">\n <div class=\"d-flex flex-column mat-typography\">\n <div mat-dialog-title class=\"text-center\">\n <div>Entity File</div>\n </div>\n <div mat-dialog-content class=\"d-flex flex-column\">\n <ng-container *ngIf=\"!hideTitleAndDetails\">\n <mat-form-field>\n <input type=\"text\" matInput formControlName=\"title\" placeholder=\"Title\" autocomplete=\"off\">\n </mat-form-field>\n <mat-form-field>\n <textarea matInput formControlName=\"details\" placeholder=\"Details\" autocomplete=\"off\"></textarea>\n </mat-form-field>\n </ng-container>\n <ng-container *ngIf=\"useTechlifyTags\">\n <mat-form-field>\n <mat-label>Tag</mat-label>\n <app-techlify-tagger-tag-form-field\n [categories]=\"techlifyTagCategories\"\n modelType=\"entity-file\"\n formControlName=\"tag_ids\"\n [modelId]=\"entityFileGroup.get('id').value\"\n placeholder=\"Enter new tag\"\n [config]=\"techlifyTagConfig\"\n ></app-techlify-tagger-tag-form-field>\n </mat-form-field>\n </ng-container>\n <ng-template #fileUpload>\n <section class=\"w-100\">\n <div>Entity File*</div>\n <app-file-dropper [config]=\"fileConfig\" (fileChanged)=\"fileChanged($event)\" [fileArray]=\"fileList\">\n </app-file-dropper>\n <div class=\"text-danger\" *ngIf=\"isFieldValid('url')\">\n {{getErrorMessage(\"url\")}}\n </div>\n </section>\n </ng-template>\n <div class=\"w-100 mt-2\" *ngIf=\"entityFileGroup.get('url').value;else fileUpload;\">\n <app-document-viewer [file]=\"entityFileGroup.get('file').value\" [fileUrl]=\"entityFileGroup.get('url').value\"\n [config]=\"this.viewerConfig\" (remove)=\"removeFile()\" [disableEdit]=\"updateMode\">\n </app-document-viewer>\n </div>\n <div class=\"d-flex justify-content-end gap-3 w-100 mt-4 mb-2\">\n <button [disabled]=\"isSaving\" mat-raised-button type=\"button\" (click)=\"dialogRef.close()\">\n Cancel\n </button>\n <button [disabled]=\"isSaving\" mat-raised-button type=\"submit\" color=\"primary\">Save</button>\n </div>\n </div>\n </div>\n</form>\n", styles: [""], dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i7.FileDropperComponent, selector: "app-file-dropper", inputs: ["fileArray", "config", "styles"], outputs: ["fileChanged"] }, { kind: "component", type: i8.DocumentViewerComponent, selector: "app-document-viewer", inputs: ["config", "file", "fileUrl", "disableEdit"], outputs: ["remove"] }, { kind: "component", type: i9.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: i10.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i10.MatLabel, selector: "mat-label" }, { kind: "directive", type: i11.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i12.TechlifyTaggerTagFormFieldComponent, selector: "app-techlify-tagger-tag-form-field", inputs: ["config", "modelType", "modelId", "allTags", "categories", "defaultCreateCategory", "required", "disabled", "value", "placeholder"] }] }); }
150
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EntityFileFormComponent, deps: [{ token: i1.MatDialogRef }, { token: MAT_DIALOG_DATA }, { token: i2.FormValidatorService }, { token: i3.EntityFileService }, { token: i4.UntypedFormBuilder }, { token: i5.FormConfigurationFormService }, { token: i6.DatePipe }], target: i0.ɵɵFactoryTarget.Component }); }
151
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: EntityFileFormComponent, selector: "entity-file-form", providers: [DatePipe], usesInheritance: true, ngImport: i0, template: "<form [formGroup]=\"form\" (ngSubmit)=\"submit()\">\n <div class=\"d-flex flex-column mat-typography\">\n <div mat-dialog-title class=\"d-flex flex-row justify-content-between align-items-center gap-2\">\n <div>Entity File Form</div>\n <app-form-configuration-for-form (click)=\"dialogRef.close()\"\n formCode=\"entity-file\"></app-form-configuration-for-form>\n </div>\n <div mat-dialog-content>\n <div class=\"row g-3\">\n\n <!-- The file's details -->\n <div class=\"col-12 col-md-6 d-flex flex-column\">\n <mat-form-field *ngIf=\"!hideTitleAndDetails\">\n <mat-label>Title</mat-label>\n <input type=\"text\" matInput formControlName=\"title\" placeholder=\"Title\" autocomplete=\"off\">\n </mat-form-field>\n <mat-form-field *ngIf=\"useTechlifyTags\">\n <mat-label>Type</mat-label>\n <app-techlify-tagger-tag-form-field [categories]=\"techlifyTagCategories\" modelType=\"entity-file\"\n formControlName=\"tag_ids\" [modelId]=\"getFieldValue('id')\" placeholder=\"Enter new tag\"\n [config]=\"techlifyTagConfig\"></app-techlify-tagger-tag-form-field>\n </mat-form-field>\n <mat-form-field\n *ngIf=\"isFormConfigurationLoaded && formConfigurationUtilityService.getFieldEnabled('expires_on')\">\n <mat-label>Expires On</mat-label>\n <input matInput [matDatepicker]=\"picker\" placeholder=\"Expires On\" formControlName=\"expires_on\">\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n <mat-error *ngIf=\"isFieldValid('expires_on')\">{{getErrorMessage(\"expires_on\")}}</mat-error>\n </mat-form-field>\n <mat-form-field *ngIf=\"!hideTitleAndDetails\">\n <mat-label>Details</mat-label>\n <textarea matInput formControlName=\"details\" placeholder=\"Details\" autocomplete=\"off\"></textarea>\n </mat-form-field>\n\n <div class=\"d-flex flex-row gap-3 mt-auto pt-2\">\n <button [disabled]=\"isWorking\" mat-raised-button type=\"submit\" color=\"primary\">Save</button>\n <button [disabled]=\"isWorking\" mat-raised-button type=\"button\" (click)=\"closeDialog()\">\n Cancel\n </button>\n </div>\n </div>\n\n <!-- The file itself -->\n <div class=\"col-12 col-md-6\">\n <ng-template #fileUpload>\n <section class=\"w-100\">\n <div>Entity File*</div>\n <app-file-dropper [config]=\"fileConfig\" (fileChanged)=\"fileChanged($event)\" [fileArray]=\"fileList\">\n </app-file-dropper>\n <div class=\"text-danger\" *ngIf=\"isFieldValid('url')\">\n {{getErrorMessage(\"url\")}}\n </div>\n </section>\n </ng-template>\n <div class=\"w-100\" *ngIf=\"getFieldValue('url');else fileUpload;\">\n <app-document-viewer [file]=\"getFieldValue('file')\" [fileUrl]=\"getFieldValue('url')\"\n [config]=\"this.viewerConfig\" (remove)=\"removeFile()\" [disableEdit]=\"isUpdate\">\n </app-document-viewer>\n </div>\n </div>\n\n </div>\n </div>\n </div>\n</form>\n", styles: [""], dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.FormConfigurationForFormComponent, selector: "app-form-configuration-for-form", inputs: ["formCode"] }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "directive", type: i9.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i9.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i11.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i11.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i11.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i12.FileDropperComponent, selector: "app-file-dropper", inputs: ["fileArray", "config", "styles"], outputs: ["fileChanged"] }, { kind: "component", type: i13.DocumentViewerComponent, selector: "app-document-viewer", inputs: ["config", "file", "fileUrl", "disableEdit"], outputs: ["remove"] }, { kind: "component", type: i14.TechlifyTaggerTagFormFieldComponent, selector: "app-techlify-tagger-tag-form-field", inputs: ["config", "modelType", "modelId", "allTags", "categories", "defaultCreateCategory", "required", "disabled", "value", "placeholder"] }] }); }
152
152
  }
153
153
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: EntityFileFormComponent, decorators: [{
154
154
  type: Component,
155
- args: [{ selector: 'entity-file-form', template: "<form [formGroup]=\"entityFileGroup\" (ngSubmit)=\"submit()\">\n <div class=\"d-flex flex-column mat-typography\">\n <div mat-dialog-title class=\"text-center\">\n <div>Entity File</div>\n </div>\n <div mat-dialog-content class=\"d-flex flex-column\">\n <ng-container *ngIf=\"!hideTitleAndDetails\">\n <mat-form-field>\n <input type=\"text\" matInput formControlName=\"title\" placeholder=\"Title\" autocomplete=\"off\">\n </mat-form-field>\n <mat-form-field>\n <textarea matInput formControlName=\"details\" placeholder=\"Details\" autocomplete=\"off\"></textarea>\n </mat-form-field>\n </ng-container>\n <ng-container *ngIf=\"useTechlifyTags\">\n <mat-form-field>\n <mat-label>Tag</mat-label>\n <app-techlify-tagger-tag-form-field\n [categories]=\"techlifyTagCategories\"\n modelType=\"entity-file\"\n formControlName=\"tag_ids\"\n [modelId]=\"entityFileGroup.get('id').value\"\n placeholder=\"Enter new tag\"\n [config]=\"techlifyTagConfig\"\n ></app-techlify-tagger-tag-form-field>\n </mat-form-field>\n </ng-container>\n <ng-template #fileUpload>\n <section class=\"w-100\">\n <div>Entity File*</div>\n <app-file-dropper [config]=\"fileConfig\" (fileChanged)=\"fileChanged($event)\" [fileArray]=\"fileList\">\n </app-file-dropper>\n <div class=\"text-danger\" *ngIf=\"isFieldValid('url')\">\n {{getErrorMessage(\"url\")}}\n </div>\n </section>\n </ng-template>\n <div class=\"w-100 mt-2\" *ngIf=\"entityFileGroup.get('url').value;else fileUpload;\">\n <app-document-viewer [file]=\"entityFileGroup.get('file').value\" [fileUrl]=\"entityFileGroup.get('url').value\"\n [config]=\"this.viewerConfig\" (remove)=\"removeFile()\" [disableEdit]=\"updateMode\">\n </app-document-viewer>\n </div>\n <div class=\"d-flex justify-content-end gap-3 w-100 mt-4 mb-2\">\n <button [disabled]=\"isSaving\" mat-raised-button type=\"button\" (click)=\"dialogRef.close()\">\n Cancel\n </button>\n <button [disabled]=\"isSaving\" mat-raised-button type=\"submit\" color=\"primary\">Save</button>\n </div>\n </div>\n </div>\n</form>\n" }]
155
+ args: [{ selector: 'entity-file-form', providers: [DatePipe], template: "<form [formGroup]=\"form\" (ngSubmit)=\"submit()\">\n <div class=\"d-flex flex-column mat-typography\">\n <div mat-dialog-title class=\"d-flex flex-row justify-content-between align-items-center gap-2\">\n <div>Entity File Form</div>\n <app-form-configuration-for-form (click)=\"dialogRef.close()\"\n formCode=\"entity-file\"></app-form-configuration-for-form>\n </div>\n <div mat-dialog-content>\n <div class=\"row g-3\">\n\n <!-- The file's details -->\n <div class=\"col-12 col-md-6 d-flex flex-column\">\n <mat-form-field *ngIf=\"!hideTitleAndDetails\">\n <mat-label>Title</mat-label>\n <input type=\"text\" matInput formControlName=\"title\" placeholder=\"Title\" autocomplete=\"off\">\n </mat-form-field>\n <mat-form-field *ngIf=\"useTechlifyTags\">\n <mat-label>Type</mat-label>\n <app-techlify-tagger-tag-form-field [categories]=\"techlifyTagCategories\" modelType=\"entity-file\"\n formControlName=\"tag_ids\" [modelId]=\"getFieldValue('id')\" placeholder=\"Enter new tag\"\n [config]=\"techlifyTagConfig\"></app-techlify-tagger-tag-form-field>\n </mat-form-field>\n <mat-form-field\n *ngIf=\"isFormConfigurationLoaded && formConfigurationUtilityService.getFieldEnabled('expires_on')\">\n <mat-label>Expires On</mat-label>\n <input matInput [matDatepicker]=\"picker\" placeholder=\"Expires On\" formControlName=\"expires_on\">\n <mat-datepicker-toggle matSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-datepicker #picker></mat-datepicker>\n <mat-error *ngIf=\"isFieldValid('expires_on')\">{{getErrorMessage(\"expires_on\")}}</mat-error>\n </mat-form-field>\n <mat-form-field *ngIf=\"!hideTitleAndDetails\">\n <mat-label>Details</mat-label>\n <textarea matInput formControlName=\"details\" placeholder=\"Details\" autocomplete=\"off\"></textarea>\n </mat-form-field>\n\n <div class=\"d-flex flex-row gap-3 mt-auto pt-2\">\n <button [disabled]=\"isWorking\" mat-raised-button type=\"submit\" color=\"primary\">Save</button>\n <button [disabled]=\"isWorking\" mat-raised-button type=\"button\" (click)=\"closeDialog()\">\n Cancel\n </button>\n </div>\n </div>\n\n <!-- The file itself -->\n <div class=\"col-12 col-md-6\">\n <ng-template #fileUpload>\n <section class=\"w-100\">\n <div>Entity File*</div>\n <app-file-dropper [config]=\"fileConfig\" (fileChanged)=\"fileChanged($event)\" [fileArray]=\"fileList\">\n </app-file-dropper>\n <div class=\"text-danger\" *ngIf=\"isFieldValid('url')\">\n {{getErrorMessage(\"url\")}}\n </div>\n </section>\n </ng-template>\n <div class=\"w-100\" *ngIf=\"getFieldValue('url');else fileUpload;\">\n <app-document-viewer [file]=\"getFieldValue('file')\" [fileUrl]=\"getFieldValue('url')\"\n [config]=\"this.viewerConfig\" (remove)=\"removeFile()\" [disableEdit]=\"isUpdate\">\n </app-document-viewer>\n </div>\n </div>\n\n </div>\n </div>\n </div>\n</form>\n" }]
156
156
  }], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
157
157
  type: Inject,
158
158
  args: [MAT_DIALOG_DATA]
159
- }] }, { type: i2.FormValidatorService }, { type: i3.UntypedFormBuilder }, { type: i4.EntityFileService }, { type: i5.AlertService }] });
160
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWZpbGUtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdGVjaGxpZnktY29yZS9zcmMvbGliL2VudGl0eS1maWxlcy9lbnRpdHktZmlsZS1mb3JtL2VudGl0eS1maWxlLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRlY2hsaWZ5LWNvcmUvc3JjL2xpYi9lbnRpdHktZmlsZXMvZW50aXR5LWZpbGUtZm9ybS9lbnRpdHktZmlsZS1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBZ0IsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekUsT0FBTyxFQUF3QyxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUFXbEYsTUFBTSxhQUFhLEdBQVE7SUFDekIsR0FBRyxFQUFFO1FBQ0gsUUFBUSxFQUFFLGtCQUFrQjtLQUM3QjtDQUNGLENBQUM7QUFPRixNQUFNLE9BQU8sdUJBQXVCO0lBaUJsQyxZQUNTLFNBQWdELEVBQ3ZCLElBQVMsRUFDakMsb0JBQTBDLEVBQzFDLEVBQXNCLEVBQ3RCLGlCQUFvQyxFQUNwQyxZQUEwQjtRQUwzQixjQUFTLEdBQVQsU0FBUyxDQUF1QztRQUN2QixTQUFJLEdBQUosSUFBSSxDQUFLO1FBQ2pDLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsT0FBRSxHQUFGLEVBQUUsQ0FBb0I7UUFDdEIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQWxCcEMsYUFBUSxHQUFVLEVBQUUsQ0FBQztRQUdyQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRWpCOztXQUVHO1FB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UUFDeEIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUMzQyxLQUFLLEVBQ0wsSUFBSSxDQUFDLGVBQWUsRUFDcEIsSUFBSSxDQUFDLDBCQUEwQixDQUNoQyxDQUFDO0lBQ0osQ0FBQztJQUVELHdDQUF3QztJQUN4QyxlQUFlLENBQUMsS0FBYTtRQUMzQixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQzlDLEtBQUssRUFDTCxJQUFJLENBQUMsZUFBZSxFQUNwQixhQUFhLENBQ2QsQ0FBQztJQUNKLENBQUM7K0dBdEtVLHVCQUF1Qiw4Q0FtQnhCLGVBQWU7bUdBbkJkLHVCQUF1Qix3REN4QnBDLDR6RUFtREE7OzRGRDNCYSx1QkFBdUI7a0JBTG5DLFNBQVM7K0JBQ0Usa0JBQWtCOzswQkF1QnpCLE1BQU07MkJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBJbmplY3QgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgTWF0RGlhbG9nUmVmLCBNQVRfRElBTE9HX0RBVEEgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nXCI7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUdyb3VwLCBVbnR5cGVkRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IEVudGl0eUZpbGVTZXJ2aWNlIH0gZnJvbSAnLi4vZW50aXR5LWZpbGUuc2VydmljZSc7XG5pbXBvcnQgeyBGaWxlRHJvcHBlckNvbmZpZyB9IGZyb20gJy4uLy4uL2ZpbGUtZHJvcHBlci9maWxlLWRyb3BwZXIubW9kZWwnO1xuaW1wb3J0IHsgVmlld2VyQ29uZmlnIH0gZnJvbSAnLi4vLi4vZG9jdW1lbnQtdmlld2VyL3ZpZXdlci1jb25maWcubW9kZWwnO1xuaW1wb3J0IHsgRm9ybVZhbGlkYXRvclNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL2Zvcm0tdmFsaWRhdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uL2NvcmUvYWxlcnQuc2VydmljZVwiO1xuaW1wb3J0IHtcbiAgVGVjaGxpZnlUYWdnZXJUYWdGb3JtQ29uZmlnTW9kZWxcbn0gZnJvbSBcIi4uLy4uL3RhZy90ZWNobGlmeS10YWdnZXItdGFnLWZvcm0tZmllbGQvdGVjaGxpZnktdGFnZ2VyLXRhZy1mb3JtLWNvbmZpZy5tb2RlbFwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5cbmNvbnN0IGVycm9yTWVzc2FnZXM6IGFueSA9IHtcbiAgdXJsOiB7XG4gICAgcmVxdWlyZWQ6IFwiRmlsZSBpcyByZXF1aXJlZFwiXG4gIH0sXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdlbnRpdHktZmlsZS1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2VudGl0eS1maWxlLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9lbnRpdHktZmlsZS1mb3JtLmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBFbnRpdHlGaWxlRm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGVudGl0eUZpbGVHcm91cDogVW50eXBlZEZvcm1Hcm91cDtcbiAgYXNzaWdubWVudEZpbGVGaXJzdEF0dGVtcHQ6IGJvb2xlYW47XG4gIHVwZGF0ZU1vZGU6IGJvb2xlYW47XG4gIGZpbGVDb25maWc6IEZpbGVEcm9wcGVyQ29uZmlnO1xuICBmaWxlTGlzdDogYW55W10gPSBbXTtcbiAgdmlld2VyQ29uZmlnOiBWaWV3ZXJDb25maWc7XG4gIGhpZGVUaXRsZUFuZERldGFpbHM6IGJvb2xlYW47XG4gIGlzU2F2aW5nID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNob3VsZCB3ZSBhbGxvdyB0YWdnaW5nIGVudGl0eS1maWxlcz9cbiAgICovXG4gIHVzZVRlY2hsaWZ5VGFncyA9IGZhbHNlO1xuICB0ZWNobGlmeVRhZ0NhdGVnb3JpZXM6IHN0cmluZ1tdID0gW107XG4gIHRlY2hsaWZ5VGFnQ29uZmlnOiBUZWNobGlmeVRhZ2dlclRhZ0Zvcm1Db25maWdNb2RlbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8RW50aXR5RmlsZUZvcm1Db21wb25lbnQ+LFxuICAgIEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwdWJsaWMgZGF0YTogYW55LFxuICAgIHByaXZhdGUgZm9ybVZhbGlkYXRvclNlcnZpY2U6IEZvcm1WYWxpZGF0b3JTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICBwcml2YXRlIGVudGl0eUZpbGVTZXJ2aWNlOiBFbnRpdHlGaWxlU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuY3JlYXRlRm9ybSgpO1xuICB9XG5cbiAgLyoqIE1ldGhvZCB0byBjcmVhdGUgYSBmb3JtICoqL1xuICBwcml2YXRlIGNyZWF0ZUZvcm0oKSB7XG4gICAgLy9UT0RPOiBGaW5pYWxpemUgYW5kIGFkZCBtb3JlIHZhbGlkYXRpb25zLlxuICAgIHRoaXMuZW50aXR5RmlsZUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XG4gICAgICBpZDogWycnXSxcbiAgICAgIHRpdGxlOiBbJyddLFxuICAgICAgZGV0YWlsczogWycnXSxcbiAgICAgIGVudGl0eV90eXBlOiBbJyddLFxuICAgICAgZW50aXR5X2lkOiBbXSxcbiAgICAgIGZpbGU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICB1cmw6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICBmaWxlX3NpemU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICB0YWdfaWRzOiBbW11dXG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRhLmVudGl0eSkge1xuICAgICAgdGhpcy5lbnRpdHlGaWxlR3JvdXAuZ2V0KCdlbnRpdHlfdHlwZScpLnNldFZhbHVlKHRoaXMuZGF0YS5lbnRpdHkuZW50aXR5X3R5cGUpO1xuICAgICAgdGhpcy5lbnRpdHlGaWxlR3JvdXAuZ2V0KCdlbnRpdHlfaWQnKS5zZXRWYWx1ZSh0aGlzLmRhdGEuZW50aXR5LmVudGl0eV9pZCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRhdGEuZmlsZSkge1xuICAgICAgdGhpcy51cGRhdGVNb2RlID0gdHJ1ZTtcbiAgICAgIHRoaXMuZW50aXR5RmlsZUdyb3VwLnBhdGNoVmFsdWUodGhpcy5kYXRhLmZpbGUpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRhdGE/LmhpZGVUaXRsZUFuZERldGFpbHMpIHtcbiAgICAgIHRoaXMuaGlkZVRpdGxlQW5kRGV0YWlscyA9IHRoaXMuZGF0YT8uaGlkZVRpdGxlQW5kRGV0YWlscztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRhPy51c2VUZWNobGlmeVRhZ3MpIHtcbiAgICAgIHRoaXMudXNlVGVjaGxpZnlUYWdzID0gdGhpcy5kYXRhPy51c2VUZWNobGlmeVRhZ3M7XG4gICAgICB0aGlzLnRlY2hsaWZ5VGFnQ2F0ZWdvcmllcyA9IHRoaXMuZGF0YT8udGVjaGxpZnlUYWdDYXRlZ29yaWVzO1xuICAgICAgdGhpcy50ZWNobGlmeVRhZ0NvbmZpZyA9IHRoaXMuZGF0YT8udGVjaGxpZnlUYWdDb25maWc7XG4gICAgICBpZiAodGhpcy5kYXRhLmZpbGU/LnRhZ3MpIHtcbiAgICAgICAgdGhpcy5lbnRpdHlGaWxlR3JvdXAuZ2V0KCd0YWdfaWRzJykuc2V0VmFsdWUoXG4gICAgICAgICAgKHRoaXMuZGF0YS5maWxlPy50YWdzIGFzIFtdKS5tYXAoKHRhZzogYW55KSA9PiB0YWcuaWQpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy9GaWxlIGRyb3BwZXIgY29uZmlnXG4gICAgdGhpcy5maWxlQ29uZmlnID0ge1xuICAgICAgZmlsZUlkOiBcInN1YmplY3RGaWxlXCIsXG4gICAgICBjb250YWluZXJJZDogXCJzdWJqZWN0RmlsZUNvbnRhaW5lclwiLFxuICAgICAgc3R5bGVzOiB7XG4gICAgICAgIGhlaWdodDogXCIyMDBweFwiXG4gICAgICB9LFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgYWNjZXB0RmlsZTogXCIqXCIsXG4gICAgICBtYXhTaXplOiAxMCxcbiAgICAgIGFjY2VwdEZpbGVUZXh0OiBcIkFsbCBGaWxlc1wiXG4gICAgfTtcblxuICAgIHRoaXMudmlld2VyQ29uZmlnID0ge1xuICAgICAgdmlld2VyU3R5bGU6IHtcbiAgICAgICAgaGVpZ2h0OiAnMjAwcHgnLFxuICAgICAgICB3aWR0aDogJzEwMCUnXG4gICAgICB9XG4gICAgfVxuICB9XG5cblxuICAvL01ldGhvZCB0byB0cmlnZ2VyIHN1Ym1pdFxuICBhc3luYyBzdWJtaXQoKSB7XG4gICAgdGhpcy5hc3NpZ25tZW50RmlsZUZpcnN0QXR0ZW1wdCA9IHRydWU7XG4gICAgaWYgKCF0aGlzLmVudGl0eUZpbGVHcm91cC52YWxpZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtb2RlbCA9IHRoaXMuZW50aXR5RmlsZUdyb3VwLnZhbHVlO1xuXG4gICAgaWYgKHRoaXMuaGlkZVRpdGxlQW5kRGV0YWlscykge1xuICAgICAgbW9kZWwudGl0bGUgPSBtb2RlbC5maWxlO1xuICAgIH1cbiAgICBtb2RlbC50YWdfaWRzID0gbW9kZWwudGFnX2lkcy50b1N0cmluZygpO1xuICAgIGNvbnN0IHBhcmFtczogYW55ID0ge1xuICAgICAgd2l0aDogJ2NyZWF0b3IsdGFncydcbiAgICB9O1xuICAgIHRoaXMuaXNTYXZpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHJlcXVlc3Q6IE9ic2VydmFibGU8YW55PiA9IHRoaXMudXBkYXRlTW9kZVxuICAgICAgPyB0aGlzLmVudGl0eUZpbGVTZXJ2aWNlLnVwZGF0ZShtb2RlbCwgcGFyYW1zKVxuICAgICAgOiB0aGlzLmVudGl0eUZpbGVTZXJ2aWNlLnN0b3JlKG1vZGVsLCBwYXJhbXMpO1xuICAgIHJlcXVlc3Quc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmlzU2F2aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKHJlc3VsdC5pdGVtKTtcbiAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkQWxlcnQoXG4gICAgICAgICAgJ0ZpbGUgc3VibWl0dGVkIHN1Y2Nlc3NmdWxseScsXG4gICAgICAgICAgJ3N1Y2Nlc3MnXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHRoaXMuaXNTYXZpbmcgPSBmYWxzZVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZmlsZUNoYW5nZWQoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuZmlsZUxpc3QgPSBldmVudDtcblxuICAgIGlmICh0aGlzLmZpbGVMaXN0Lmxlbmd0aCA+IDApIHtcblxuICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSBhd2FpdCB0aGlzLmVudGl0eUZpbGVTZXJ2aWNlLnVwbG9hZEVudGl0eUZpbGUoXG4gICAgICAgIHRoaXMuZmlsZUxpc3RbMF0sIHsgZW50aXR5X3R5cGU6IHRoaXMuZW50aXR5RmlsZUdyb3VwLmdldCgnZW50aXR5X3R5cGUnKS52YWx1ZSB9XG4gICAgICApO1xuICAgICAgdGhpcy5lbnRpdHlGaWxlR3JvdXAucGF0Y2hWYWx1ZShyZXN1bHQuaXRlbSk7O1xuICAgICAgdGhpcy5maWxlTGlzdCA9IFtdO1xuICAgIH1cbiAgfVxuXG5cbiAgYXN5bmMgcmVtb3ZlRmlsZSgpIHtcbiAgICBpZiAodGhpcy5lbnRpdHlGaWxlR3JvdXAudmFsdWUuZmlsZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy5lbnRpdHlGaWxlR3JvdXAucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAgZmlsZTogXCJcIixcbiAgICAgICAgICB1cmw6IFwiXCJcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRBbGVydChcIlVuYWJsZSB0byByZW1vdmUgZmlsZSwgdHJ5IGxhdGVyXCIsIFwid2FyblwiKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipNZXRob2QgdG8gZXZhbHVhdGUgZm9ybSBmaWVsZHMqL1xuICBpc0ZpZWxkVmFsaWQoZmllbGQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmZvcm1WYWxpZGF0b3JTZXJ2aWNlLmlzRmllbGRWYWxpZChcbiAgICAgIGZpZWxkLFxuICAgICAgdGhpcy5lbnRpdHlGaWxlR3JvdXAsXG4gICAgICB0aGlzLmFzc2lnbm1lbnRGaWxlRmlyc3RBdHRlbXB0XG4gICAgKTtcbiAgfVxuXG4gIC8qKk1ldGhvZCB0byBmaW5kIGVycm9yIGluIGZvcm0gZmllbGRzKi9cbiAgZ2V0RXJyb3JNZXNzYWdlKGZpZWxkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtVmFsaWRhdG9yU2VydmljZS5nZXRFcnJvck1lc3NhZ2UoXG4gICAgICBmaWVsZCxcbiAgICAgIHRoaXMuZW50aXR5RmlsZUdyb3VwLFxuICAgICAgZXJyb3JNZXNzYWdlc1xuICAgICk7XG4gIH1cblxufVxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJlbnRpdHlGaWxlR3JvdXBcIiAobmdTdWJtaXQpPVwic3VibWl0KClcIj5cbiAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBtYXQtdHlwb2dyYXBoeVwiPlxuICAgIDxkaXYgbWF0LWRpYWxvZy10aXRsZSBjbGFzcz1cInRleHQtY2VudGVyXCI+XG4gICAgICA8ZGl2PkVudGl0eSBGaWxlPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBtYXQtZGlhbG9nLWNvbnRlbnQgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW5cIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaGlkZVRpdGxlQW5kRGV0YWlsc1wiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIiBwbGFjZWhvbGRlcj1cIlRpdGxlXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZGV0YWlsc1wiIHBsYWNlaG9sZGVyPVwiRGV0YWlsc1wiIGF1dG9jb21wbGV0ZT1cIm9mZlwiPjwvdGV4dGFyZWE+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ1c2VUZWNobGlmeVRhZ3NcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgIDxtYXQtbGFiZWw+VGFnPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGFwcC10ZWNobGlmeS10YWdnZXItdGFnLWZvcm0tZmllbGRcbiAgICAgICAgICAgIFtjYXRlZ29yaWVzXT1cInRlY2hsaWZ5VGFnQ2F0ZWdvcmllc1wiXG4gICAgICAgICAgICBtb2RlbFR5cGU9XCJlbnRpdHktZmlsZVwiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0YWdfaWRzXCJcbiAgICAgICAgICAgIFttb2RlbElkXT1cImVudGl0eUZpbGVHcm91cC5nZXQoJ2lkJykudmFsdWVcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciBuZXcgdGFnXCJcbiAgICAgICAgICAgIFtjb25maWddPVwidGVjaGxpZnlUYWdDb25maWdcIlxuICAgICAgICAgID48L2FwcC10ZWNobGlmeS10YWdnZXItdGFnLWZvcm0tZmllbGQ+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZmlsZVVwbG9hZD5cbiAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJ3LTEwMFwiPlxuICAgICAgICAgIDxkaXY+RW50aXR5IEZpbGUqPC9kaXY+XG4gICAgICAgICAgPGFwcC1maWxlLWRyb3BwZXIgW2NvbmZpZ109XCJmaWxlQ29uZmlnXCIgKGZpbGVDaGFuZ2VkKT1cImZpbGVDaGFuZ2VkKCRldmVudClcIiBbZmlsZUFycmF5XT1cImZpbGVMaXN0XCI+XG4gICAgICAgICAgPC9hcHAtZmlsZS1kcm9wcGVyPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiaXNGaWVsZFZhbGlkKCd1cmwnKVwiPlxuICAgICAgICAgICAge3tnZXRFcnJvck1lc3NhZ2UoXCJ1cmxcIil9fVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPGRpdiBjbGFzcz1cInctMTAwIG10LTJcIiAqbmdJZj1cImVudGl0eUZpbGVHcm91cC5nZXQoJ3VybCcpLnZhbHVlO2Vsc2UgZmlsZVVwbG9hZDtcIj5cbiAgICAgICAgPGFwcC1kb2N1bWVudC12aWV3ZXIgW2ZpbGVdPVwiZW50aXR5RmlsZUdyb3VwLmdldCgnZmlsZScpLnZhbHVlXCIgW2ZpbGVVcmxdPVwiZW50aXR5RmlsZUdyb3VwLmdldCgndXJsJykudmFsdWVcIlxuICAgICAgICAgIFtjb25maWddPVwidGhpcy52aWV3ZXJDb25maWdcIiAocmVtb3ZlKT1cInJlbW92ZUZpbGUoKVwiIFtkaXNhYmxlRWRpdF09XCJ1cGRhdGVNb2RlXCI+XG4gICAgICAgIDwvYXBwLWRvY3VtZW50LXZpZXdlcj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGdhcC0zIHctMTAwIG10LTQgbWItMlwiPlxuICAgICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCJpc1NhdmluZ1wiIG1hdC1yYWlzZWQtYnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiZGlhbG9nUmVmLmNsb3NlKClcIj5cbiAgICAgICAgICBDYW5jZWxcbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gW2Rpc2FibGVkXT1cImlzU2F2aW5nXCIgbWF0LXJhaXNlZC1idXR0b24gdHlwZT1cInN1Ym1pdFwiIGNvbG9yPVwicHJpbWFyeVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZm9ybT5cbiJdfQ==
159
+ }] }, { type: i2.FormValidatorService }, { type: i3.EntityFileService }, { type: i4.UntypedFormBuilder }, { type: i5.FormConfigurationFormService }, { type: i6.DatePipe }] });
160
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LWZpbGUtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdGVjaGxpZnktY29yZS9zcmMvbGliL2VudGl0eS1maWxlcy9lbnRpdHktZmlsZS1mb3JtL2VudGl0eS1maWxlLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRlY2hsaWZ5LWNvcmUvc3JjL2xpYi9lbnRpdHktZmlsZXMvZW50aXR5LWZpbGUtZm9ybS9lbnRpdHktZmlsZS1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQWdCLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3pFLE9BQU8sRUFBc0IsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFLaEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFekQsT0FBTyxFQUFFLCtCQUErQixFQUFFLE1BQU0sNkRBQTZELENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUFXOUcsTUFBTSxPQUFPLHVCQUF3QixTQUFRLHFCQUFxQjtJQXVCaEUsWUFDa0IsU0FBZ0QsRUFDaEMsSUFBUyxFQUN0QixvQkFBMEMsRUFDMUMsT0FBMEIsRUFDckMsRUFBc0IsRUFDdEIsaUJBQStDLEVBQy9DLFFBQWtCO1FBRTFCLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxPQUFPLENBQUMsQ0FBQztRQVJyQixjQUFTLEdBQVQsU0FBUyxDQUF1QztRQUNoQyxTQUFJLEdBQUosSUFBSSxDQUFLO1FBQ3RCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsWUFBTyxHQUFQLE9BQU8sQ0FB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QyxJQUFJLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNyQixDQUFDO0lBQ0gsQ0FBQztJQUdELEtBQUssQ0FBQyxVQUFVO1FBQ2QsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDO2dCQUNILElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO29CQUNuQixJQUFJLEVBQUUsRUFBRTtvQkFDUixHQUFHLEVBQUUsRUFBRTtpQkFDUixDQUFDLENBQUM7WUFDTCxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxrQ0FBa0MsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMxRSxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7K0dBcktVLHVCQUF1Qiw4Q0F5QnhCLGVBQWU7bUdBekJkLHVCQUF1QiwyQ0FGdkIsQ0FBQyxRQUFRLENBQUMsaURDbkJ2QixveUdBa0VBOzs0RkQ3Q2EsdUJBQXVCO2tCQU5uQyxTQUFTOytCQUNFLGtCQUFrQixhQUdqQixDQUFDLFFBQVEsQ0FBQzs7MEJBMkJsQixNQUFNOzJCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgTWF0RGlhbG9nUmVmLCBNQVRfRElBTE9HX0RBVEEgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nXCI7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IEVudGl0eUZpbGVTZXJ2aWNlIH0gZnJvbSAnLi4vZW50aXR5LWZpbGUuc2VydmljZSc7XG5pbXBvcnQgeyBGaWxlRHJvcHBlckNvbmZpZyB9IGZyb20gJy4uLy4uL2ZpbGUtZHJvcHBlci9maWxlLWRyb3BwZXIubW9kZWwnO1xuaW1wb3J0IHsgVmlld2VyQ29uZmlnIH0gZnJvbSAnLi4vLi4vZG9jdW1lbnQtdmlld2VyL3ZpZXdlci1jb25maWcubW9kZWwnO1xuaW1wb3J0IHsgRm9ybVZhbGlkYXRvclNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL2Zvcm0tdmFsaWRhdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgVGVjaGxpZnlGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYmFzZS1tb2RlbCc7XG5pbXBvcnQgeyBGb3JtQ29uZmlndXJhdGlvbkZvcm1TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZm9ybS1jb25maWd1cmF0aW9uL2Zvcm0tY29uZmlndXJhdGlvbi1mb3JtLnNlcnZpY2UnO1xuaW1wb3J0IHsgRm9ybUNvbmZpZ3VyYXRpb25VdGlsaXR5U2VydmljZSB9IGZyb20gJy4uLy4uL2Zvcm0tY29uZmlndXJhdGlvbi9mb3JtLWNvbmZpZ3VyYXRpb24tdXRpbGl0eS5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIFRlY2hsaWZ5VGFnZ2VyVGFnRm9ybUNvbmZpZ01vZGVsXG59IGZyb20gXCIuLi8uLi90YWcvdGVjaGxpZnktdGFnZ2VyLXRhZy1mb3JtLWZpZWxkL3RlY2hsaWZ5LXRhZ2dlci10YWctZm9ybS1jb25maWcubW9kZWxcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZW50aXR5LWZpbGUtZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9lbnRpdHktZmlsZS1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZW50aXR5LWZpbGUtZm9ybS5jb21wb25lbnQuY3NzJ10sXG4gIHByb3ZpZGVyczogW0RhdGVQaXBlXVxufSlcbmV4cG9ydCBjbGFzcyBFbnRpdHlGaWxlRm9ybUNvbXBvbmVudCBleHRlbmRzIFRlY2hsaWZ5Rm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgb3ZlcnJpZGUgZXJyb3JNZXNzYWdlczogYW55ID0ge1xuICAgIHVybDoge1xuICAgICAgcmVxdWlyZWQ6IFwiRmlsZSBpcyByZXF1aXJlZFwiXG4gICAgfSxcbiAgICBleHBpcmVzX29uOiB7XG4gICAgICByZXF1aXJlZDogXCJFeHBpcmF0aW9uIGlzIHJlcXVpcmVkXCJcbiAgICB9LFxuICB9O1xuXG4gIGZpbGVDb25maWc6IEZpbGVEcm9wcGVyQ29uZmlnO1xuICBmaWxlTGlzdDogYW55W10gPSBbXTtcbiAgdmlld2VyQ29uZmlnOiBWaWV3ZXJDb25maWc7XG4gIGhpZGVUaXRsZUFuZERldGFpbHM6IGJvb2xlYW47XG5cbiAgdXNlVGVjaGxpZnlUYWdzID0gZmFsc2U7XG4gIHRlY2hsaWZ5VGFnQ2F0ZWdvcmllczogc3RyaW5nW10gPSBbXTtcbiAgdGVjaGxpZnlUYWdDb25maWc6IFRlY2hsaWZ5VGFnZ2VyVGFnRm9ybUNvbmZpZ01vZGVsO1xuXG4gIHB1YmxpYyBmb3JtQ29uZmlndXJhdGlvblV0aWxpdHlTZXJ2aWNlOiBGb3JtQ29uZmlndXJhdGlvblV0aWxpdHlTZXJ2aWNlO1xuICBpc0Zvcm1Db25maWd1cmF0aW9uTG9hZGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIG92ZXJyaWRlIGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPEVudGl0eUZpbGVGb3JtQ29tcG9uZW50PixcbiAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRhdGE6IGFueSxcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZm9ybVZhbGlkYXRvclNlcnZpY2U6IEZvcm1WYWxpZGF0b3JTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBzZXJ2aWNlOiBFbnRpdHlGaWxlU2VydmljZSxcbiAgICBwcml2YXRlIGZiOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBmb3JtQ29uZmlnU2VydmljZTogRm9ybUNvbmZpZ3VyYXRpb25Gb3JtU2VydmljZSxcbiAgICBwcml2YXRlIGRhdGVQaXBlOiBEYXRlUGlwZVxuICApIHtcbiAgICBzdXBlcihmb3JtVmFsaWRhdG9yU2VydmljZSwgc2VydmljZSk7XG4gICAgdGhpcy5mb3JtQ29uZmlndXJhdGlvblV0aWxpdHlTZXJ2aWNlID0gbmV3IEZvcm1Db25maWd1cmF0aW9uVXRpbGl0eVNlcnZpY2UoKTtcbiAgICB0aGlzLmNyZWF0ZUZvcm0oKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRm9ybSgpIHtcbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGlkOiBbJyddLFxuICAgICAgdGl0bGU6IFsnJ10sXG4gICAgICBkZXRhaWxzOiBbJyddLFxuICAgICAgZW50aXR5X3R5cGU6IFsnJ10sXG4gICAgICBlbnRpdHlfaWQ6IFtdLFxuICAgICAgZXhwaXJlc19vbjogWycnXSxcbiAgICAgIGZpbGU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICB1cmw6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICBmaWxlX3NpemU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICB0YWdfaWRzOiBbW11dXG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRpYWxpemVGb3JtQ29uZmlndXJhdGlvbigpO1xuXG4gICAgaWYgKHRoaXMuZGF0YS5lbnRpdHkpIHtcbiAgICAgIHRoaXMuZm9ybS5nZXQoJ2VudGl0eV90eXBlJykuc2V0VmFsdWUodGhpcy5kYXRhLmVudGl0eS5lbnRpdHlfdHlwZSk7XG4gICAgICB0aGlzLmZvcm0uZ2V0KCdlbnRpdHlfaWQnKS5zZXRWYWx1ZSh0aGlzLmRhdGEuZW50aXR5LmVudGl0eV9pZCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmRhdGEubW9kZWwpIHtcbiAgICAgIHRoaXMuaXNVcGRhdGUgPSB0cnVlO1xuICAgICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUodGhpcy5kYXRhLm1vZGVsKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRhPy5oaWRlVGl0bGVBbmREZXRhaWxzKSB7XG4gICAgICB0aGlzLmhpZGVUaXRsZUFuZERldGFpbHMgPSB0aGlzLmRhdGE/LmhpZGVUaXRsZUFuZERldGFpbHM7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGF0YT8udXNlVGVjaGxpZnlUYWdzKSB7XG4gICAgICB0aGlzLnVzZVRlY2hsaWZ5VGFncyA9IHRoaXMuZGF0YT8udXNlVGVjaGxpZnlUYWdzO1xuICAgICAgdGhpcy50ZWNobGlmeVRhZ0NhdGVnb3JpZXMgPSB0aGlzLmRhdGE/LnRlY2hsaWZ5VGFnQ2F0ZWdvcmllcztcbiAgICAgIHRoaXMudGVjaGxpZnlUYWdDb25maWcgPSB0aGlzLmRhdGE/LnRlY2hsaWZ5VGFnQ29uZmlnO1xuICAgICAgaWYgKHRoaXMuZGF0YS5tb2RlbD8udGFncykge1xuICAgICAgICB0aGlzLmZvcm0uZ2V0KCd0YWdfaWRzJykuc2V0VmFsdWUoXG4gICAgICAgICAgKHRoaXMuZGF0YS5tb2RlbD8udGFncyBhcyBbXSkubWFwKCh0YWc6IGFueSkgPT4gdGFnLmlkKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZmlsZUNvbmZpZyA9IHtcbiAgICAgIGZpbGVJZDogXCJzdWJqZWN0RmlsZVwiLFxuICAgICAgY29udGFpbmVySWQ6IFwic3ViamVjdEZpbGVDb250YWluZXJcIixcbiAgICAgIHN0eWxlczoge1xuICAgICAgICBoZWlnaHQ6IFwiMjAwcHhcIlxuICAgICAgfSxcbiAgICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICAgIGFjY2VwdEZpbGU6IFwiKlwiLFxuICAgICAgbWF4U2l6ZTogMTAsXG4gICAgICBhY2NlcHRGaWxlVGV4dDogXCJBbGwgRmlsZXNcIlxuICAgIH07XG5cbiAgICB0aGlzLnZpZXdlckNvbmZpZyA9IHtcbiAgICAgIHZpZXdlclN0eWxlOiB7XG4gICAgICAgIGhlaWdodDogJzIwMHB4JyxcbiAgICAgICAgd2lkdGg6ICcxMDAlJ1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUZvcm1Db25maWd1cmF0aW9uKCkge1xuICAgIHRoaXMuZm9ybUNvbmZpZ3VyYXRpb25VdGlsaXR5U2VydmljZVxuICAgICAgLmluaXRpYWxpemUodGhpcy5mb3JtQ29uZmlnU2VydmljZSwgJ2VudGl0eS1maWxlJylcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pc0Zvcm1Db25maWd1cmF0aW9uTG9hZGVkID0gdHJ1ZTtcblxuICAgICAgICAgIGNvbnN0IGV4cGlyZXNPbiA9IHRoaXMuZm9ybS5nZXQoJ2V4cGlyZXNfb24nKTtcbiAgICAgICAgICBleHBpcmVzT24/LnNldFZhbGlkYXRvcnMoXG4gICAgICAgICAgICB0aGlzLmZvcm1Db25maWd1cmF0aW9uVXRpbGl0eVNlcnZpY2UuZ2V0RmllbGRSZXF1aXJlZCgnZXhwaXJlc19vbicpXG4gICAgICAgICAgICAgID8gVmFsaWRhdG9ycy5yZXF1aXJlZFxuICAgICAgICAgICAgICA6IG51bGxcbiAgICAgICAgICApO1xuICAgICAgICAgIGV4cGlyZXNPbj8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIHN1Ym1pdChtb2RlbD86IGFueSkge1xuICAgIGNvbnN0IHBheWxvYWQgPSB7IC4uLihtb2RlbCB8fCB0aGlzLmZvcm0udmFsdWUpIH07XG5cbiAgICBpZiAodGhpcy5oaWRlVGl0bGVBbmREZXRhaWxzKSB7XG4gICAgICBwYXlsb2FkLnRpdGxlID0gcGF5bG9hZC5maWxlO1xuICAgIH1cblxuICAgIHBheWxvYWQudGFnX2lkcyA9IChwYXlsb2FkLnRhZ19pZHMgfHwgW10pLnRvU3RyaW5nKCk7XG4gICAgcGF5bG9hZC5leHBpcmVzX29uID0gcGF5bG9hZC5leHBpcmVzX29uXG4gICAgICA/IHRoaXMuZGF0ZVBpcGUudHJhbnNmb3JtKHBheWxvYWQuZXhwaXJlc19vbiwgJ3l5eXktTU0tZGQnKVxuICAgICAgOiBudWxsO1xuXG4gICAgc3VwZXIuc3VibWl0KHBheWxvYWQpO1xuICB9XG5cbiAgb3ZlcnJpZGUgZmluYWxpc2VkUmVzcG9uc2UocmVzcG9uc2U6IGFueSkge1xuICAgIHRoaXMuYWxlcnRTZXJ2aWNlPy5hZGRBbGVydChcbiAgICAgICdGaWxlIHN1Ym1pdHRlZCBzdWNjZXNzZnVsbHknLFxuICAgICAgJ3N1Y2Nlc3MnXG4gICAgKTtcbiAgICBzdXBlci5maW5hbGlzZWRSZXNwb25zZShyZXNwb25zZSk7XG4gIH1cblxuICBhc3luYyBmaWxlQ2hhbmdlZChldmVudDogYW55KSB7XG4gICAgdGhpcy5maWxlTGlzdCA9IGV2ZW50O1xuXG4gICAgaWYgKHRoaXMuZmlsZUxpc3QubGVuZ3RoID4gMCkge1xuXG4gICAgICBjb25zdCByZXN1bHQ6IGFueSA9IGF3YWl0IHRoaXMuc2VydmljZS51cGxvYWRFbnRpdHlGaWxlKFxuICAgICAgICB0aGlzLmZpbGVMaXN0WzBdLCB7IGVudGl0eV90eXBlOiB0aGlzLmdldEZpZWxkVmFsdWUoJ2VudGl0eV90eXBlJykgfVxuICAgICAgKTtcbiAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHJlc3VsdC5pdGVtKTtcbiAgICAgIHRoaXMuZmlsZUxpc3QgPSBbXTtcbiAgICB9XG4gIH1cblxuXG4gIGFzeW5jIHJlbW92ZUZpbGUoKSB7XG4gICAgaWYgKHRoaXMuZ2V0RmllbGRWYWx1ZSgnZmlsZScpKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAgZmlsZTogXCJcIixcbiAgICAgICAgICB1cmw6IFwiXCJcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZT8uYWRkQWxlcnQoXCJVbmFibGUgdG8gcmVtb3ZlIGZpbGUsIHRyeSBsYXRlclwiLCBcIndhcm5cIik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbn1cbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIChuZ1N1Ym1pdCk9XCJzdWJtaXQoKVwiPlxuICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIG1hdC10eXBvZ3JhcGh5XCI+XG4gICAgPGRpdiBtYXQtZGlhbG9nLXRpdGxlIGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgPGRpdj5FbnRpdHkgRmlsZSBGb3JtPC9kaXY+XG4gICAgICA8YXBwLWZvcm0tY29uZmlndXJhdGlvbi1mb3ItZm9ybSAoY2xpY2spPVwiZGlhbG9nUmVmLmNsb3NlKClcIlxuICAgICAgICBmb3JtQ29kZT1cImVudGl0eS1maWxlXCI+PC9hcHAtZm9ybS1jb25maWd1cmF0aW9uLWZvci1mb3JtPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgbWF0LWRpYWxvZy1jb250ZW50PlxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTNcIj5cblxuICAgICAgICA8IS0tIFRoZSBmaWxlJ3MgZGV0YWlscyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtNiBkLWZsZXggZmxleC1jb2x1bW5cIj5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCIhaGlkZVRpdGxlQW5kRGV0YWlsc1wiPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD5UaXRsZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIiBwbGFjZWhvbGRlcj1cIlRpdGxlXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCJ1c2VUZWNobGlmeVRhZ3NcIj5cbiAgICAgICAgICAgIDxtYXQtbGFiZWw+VHlwZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPGFwcC10ZWNobGlmeS10YWdnZXItdGFnLWZvcm0tZmllbGQgW2NhdGVnb3JpZXNdPVwidGVjaGxpZnlUYWdDYXRlZ29yaWVzXCIgbW9kZWxUeXBlPVwiZW50aXR5LWZpbGVcIlxuICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ0YWdfaWRzXCIgW21vZGVsSWRdPVwiZ2V0RmllbGRWYWx1ZSgnaWQnKVwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgbmV3IHRhZ1wiXG4gICAgICAgICAgICAgIFtjb25maWddPVwidGVjaGxpZnlUYWdDb25maWdcIj48L2FwcC10ZWNobGlmeS10YWdnZXItdGFnLWZvcm0tZmllbGQ+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGRcbiAgICAgICAgICAgICpuZ0lmPVwiaXNGb3JtQ29uZmlndXJhdGlvbkxvYWRlZCAmJiBmb3JtQ29uZmlndXJhdGlvblV0aWxpdHlTZXJ2aWNlLmdldEZpZWxkRW5hYmxlZCgnZXhwaXJlc19vbicpXCI+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPkV4cGlyZXMgT248L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbbWF0RGF0ZXBpY2tlcl09XCJwaWNrZXJcIiBwbGFjZWhvbGRlcj1cIkV4cGlyZXMgT25cIiBmb3JtQ29udHJvbE5hbWU9XCJleHBpcmVzX29uXCI+XG4gICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFN1ZmZpeCBbZm9yXT1cInBpY2tlclwiPjwvbWF0LWRhdGVwaWNrZXItdG9nZ2xlPlxuICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyICNwaWNrZXI+PC9tYXQtZGF0ZXBpY2tlcj5cbiAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJpc0ZpZWxkVmFsaWQoJ2V4cGlyZXNfb24nKVwiPnt7Z2V0RXJyb3JNZXNzYWdlKFwiZXhwaXJlc19vblwiKX19PC9tYXQtZXJyb3I+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCIhaGlkZVRpdGxlQW5kRGV0YWlsc1wiPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD5EZXRhaWxzPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwiZGV0YWlsc1wiIHBsYWNlaG9sZGVyPVwiRGV0YWlsc1wiIGF1dG9jb21wbGV0ZT1cIm9mZlwiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1yb3cgZ2FwLTMgbXQtYXV0byBwdC0yXCI+XG4gICAgICAgICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCJpc1dvcmtpbmdcIiBtYXQtcmFpc2VkLWJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY29sb3I9XCJwcmltYXJ5XCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiaXNXb3JraW5nXCIgbWF0LXJhaXNlZC1idXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJjbG9zZURpYWxvZygpXCI+XG4gICAgICAgICAgICAgIENhbmNlbFxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gVGhlIGZpbGUgaXRzZWxmIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGNvbC1tZC02XCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNmaWxlVXBsb2FkPlxuICAgICAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJ3LTEwMFwiPlxuICAgICAgICAgICAgICA8ZGl2PkVudGl0eSBGaWxlKjwvZGl2PlxuICAgICAgICAgICAgICA8YXBwLWZpbGUtZHJvcHBlciBbY29uZmlnXT1cImZpbGVDb25maWdcIiAoZmlsZUNoYW5nZWQpPVwiZmlsZUNoYW5nZWQoJGV2ZW50KVwiIFtmaWxlQXJyYXldPVwiZmlsZUxpc3RcIj5cbiAgICAgICAgICAgICAgPC9hcHAtZmlsZS1kcm9wcGVyPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImlzRmllbGRWYWxpZCgndXJsJylcIj5cbiAgICAgICAgICAgICAgICB7e2dldEVycm9yTWVzc2FnZShcInVybFwiKX19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwXCIgKm5nSWY9XCJnZXRGaWVsZFZhbHVlKCd1cmwnKTtlbHNlIGZpbGVVcGxvYWQ7XCI+XG4gICAgICAgICAgICA8YXBwLWRvY3VtZW50LXZpZXdlciBbZmlsZV09XCJnZXRGaWVsZFZhbHVlKCdmaWxlJylcIiBbZmlsZVVybF09XCJnZXRGaWVsZFZhbHVlKCd1cmwnKVwiXG4gICAgICAgICAgICAgIFtjb25maWddPVwidGhpcy52aWV3ZXJDb25maWdcIiAocmVtb3ZlKT1cInJlbW92ZUZpbGUoKVwiIFtkaXNhYmxlRWRpdF09XCJpc1VwZGF0ZVwiPlxuICAgICAgICAgICAgPC9hcHAtZG9jdW1lbnQtdmlld2VyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9mb3JtPlxuIl19