speechrecorderng 3.8.0 → 3.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +0 -1
  2. package/esm2022/lib/audio/audio_display.mjs +3 -3
  3. package/esm2022/lib/audio/audio_player.mjs +3 -3
  4. package/esm2022/lib/audio/ui/audio_canvas_layer_comp.mjs +6 -6
  5. package/esm2022/lib/audio/ui/audio_display_control.mjs +3 -3
  6. package/esm2022/lib/audio/ui/audio_display_scroll_pane.mjs +5 -5
  7. package/esm2022/lib/audio/ui/audiosignal.mjs +3 -3
  8. package/esm2022/lib/audio/ui/container.mjs +3 -3
  9. package/esm2022/lib/audio/ui/livelevel.mjs +5 -5
  10. package/esm2022/lib/audio/ui/scroll_pane_horizontal.mjs +4 -4
  11. package/esm2022/lib/audio/ui/sonagram.mjs +3 -3
  12. package/esm2022/lib/db/inddb.mjs +3 -3
  13. package/esm2022/lib/environment/environment.defaults.mjs +9 -0
  14. package/esm2022/lib/speechrecorder/project/project.service.mjs +3 -3
  15. package/esm2022/lib/speechrecorder/recordings/basic_recording.service.mjs +5 -2
  16. package/esm2022/lib/speechrecorder/recordings/recordings.service.mjs +3 -3
  17. package/esm2022/lib/speechrecorder/script/script.service.mjs +3 -3
  18. package/esm2022/lib/speechrecorder/session/audiorecorder.mjs +8 -8
  19. package/esm2022/lib/speechrecorder/session/controlpanel.mjs +21 -21
  20. package/esm2022/lib/speechrecorder/session/progress.mjs +22 -11
  21. package/esm2022/lib/speechrecorder/session/prompting.mjs +26 -26
  22. package/esm2022/lib/speechrecorder/session/recorder_combi_pane.mjs +5 -5
  23. package/esm2022/lib/speechrecorder/session/recording_list.mjs +5 -5
  24. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +3 -3
  25. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +3 -3
  26. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +3 -3
  27. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +3 -3
  28. package/esm2022/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +3 -3
  29. package/esm2022/lib/speechrecorder/session/session.service.mjs +3 -3
  30. package/esm2022/lib/speechrecorder/session/session_finished_dialog.mjs +3 -3
  31. package/esm2022/lib/speechrecorder/session/sessionmanager.mjs +5 -5
  32. package/esm2022/lib/speechrecorder/session/warning_bar.mjs +3 -3
  33. package/esm2022/lib/speechrecorder/spruploader.mjs +3 -3
  34. package/esm2022/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +5 -5
  35. package/esm2022/lib/speechrecorderng.component.mjs +3 -3
  36. package/esm2022/lib/speechrecorderng.module.mjs +8 -7
  37. package/esm2022/lib/spr.config.mjs +5 -4
  38. package/esm2022/lib/spr.module.version.mjs +2 -2
  39. package/esm2022/lib/ui/canvas_layer_comp.mjs +3 -3
  40. package/esm2022/lib/ui/intersection-observer.directive.mjs +32 -0
  41. package/esm2022/lib/ui/message_dialog.mjs +3 -3
  42. package/esm2022/lib/ui/recordingitem_display.mjs +11 -11
  43. package/esm2022/lib/ui/responsive_component.mjs +3 -3
  44. package/esm2022/lib/utils/scrollIntoViewToBottom.mjs +3 -3
  45. package/esm2022/public-api.mjs +2 -1
  46. package/fesm2022/speechrecorderng.mjs +257 -203
  47. package/fesm2022/speechrecorderng.mjs.map +1 -1
  48. package/lib/environment/environment.defaults.d.ts +8 -0
  49. package/lib/speechrecorder/session/progress.d.ts +4 -1
  50. package/lib/speechrecorderng.module.d.ts +2 -1
  51. package/lib/spr.config.d.ts +1 -0
  52. package/lib/spr.module.version.d.ts +1 -1
  53. package/lib/ui/intersection-observer.directive.d.ts +13 -0
  54. package/package.json +13 -13
  55. package/public-api.d.ts +1 -0
@@ -900,8 +900,8 @@ export class AudioRecorder extends BasicRecorder {
900
900
  this.changeDetectorRef.detectChanges();
901
901
  }
902
902
  }
903
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: AudioRecorder, deps: [{ token: i1.BreakpointObserver }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: i2.MatDialog }, { token: i3.SessionService }, { token: i4.RecordingService }, { token: i5.SpeechRecorderUploader }, { token: SPEECHRECORDER_CONFIG }], target: i0.ɵɵFactoryTarget.Component }); }
904
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: AudioRecorder, selector: "app-audiorecorder", inputs: { projectName: "projectName", dataSaved: "dataSaved" }, host: { listeners: { "window:keypress": "onKeyPress($event)", "window:keydown": "onKeyDown($event)" } }, providers: [SessionService], viewQueries: [{ propertyName: "recorderCombiPane", first: true, predicate: RecorderCombiPane, descendants: true, static: true }, { propertyName: "liveLevelDisplay", first: true, predicate: LevelBar, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
903
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: AudioRecorder, deps: [{ token: i1.BreakpointObserver }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }, { token: i2.MatDialog }, { token: i3.SessionService }, { token: i4.RecordingService }, { token: i5.SpeechRecorderUploader }, { token: SPEECHRECORDER_CONFIG }], target: i0.ɵɵFactoryTarget.Component }); }
904
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.1", type: AudioRecorder, selector: "app-audiorecorder", inputs: { projectName: "projectName", dataSaved: "dataSaved" }, host: { listeners: { "window:keypress": "onKeyPress($event)", "window:keydown": "onKeyDown($event)" } }, providers: [SessionService], viewQueries: [{ propertyName: "recorderCombiPane", first: true, predicate: RecorderCombiPane, descendants: true, static: true }, { propertyName: "liveLevelDisplay", first: true, predicate: LevelBar, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
905
905
  <app-warningbar [show]="isTestSession()" warningText="Test recording only!"></app-warningbar>
906
906
  <app-warningbar [show]="isDefaultAudioTestSession()"
907
907
  warningText="This test uses default audio device! Regular sessions may require a particular audio device (microphone)!"></app-warningbar>
@@ -959,9 +959,9 @@ export class AudioRecorder extends BasicRecorder {
959
959
  [ready]="dataSaved && !isActive()"></app-readystateindicator>
960
960
  </div>
961
961
  </div>
962
- `, isInline: true, styles: [":host{flex:2;background:lightgrey;display:flex;flex-direction:column;margin:0;padding:0;height:100%;min-height:0px;overflow:hidden}\n", ".ricontrols{padding:4px;box-sizing:border-box;height:100%}\n", ".dark{background:darkgray}\n", ".controlpanel{display:flex;flex-direction:row;align-content:center;align-items:center;margin:0;padding:20px;min-height:min-content}\n", ".startstop{width:100%;flex:1 0 30%;align-items:center;text-align:center;align-content:center}\n", ".startstopscreenxs{width:100%;flex:1 0 100%;align-items:center;text-align:center;align-content:center}\n", ".bigbutton{vertical-align:middle;overflow:hidden;text-overflow:clip;white-space:nowrap;letter-spacing:normal;min-width:70px;min-height:50px;border-radius:20px}\n", ".bigbuttonicon{min-width:50px;min-height:50px;font-size:50px}\n", ".bigbuttontext{font-weight:bolder;font-size:14px;vertical-align:middle}\n", ".audioStatusDisplay{display:flex;flex-direction:row;height:100px;min-height:100px}\n", ".audioStatusDisplayXs{display:flex;flex-direction:column;height:125px;min-height:125px}\n"], dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i9.LevelBar, selector: "audio-levelbar", inputs: ["streamingMode", "displayLevelInfos", "state"] }, { kind: "component", type: i10.StatusDisplay, selector: "app-sprstatusdisplay", inputs: ["statusAlertType", "statusMsg", "statusWaiting"] }, { kind: "component", type: i11.RecordingItemControls, selector: "spr-recordingitemcontrols", inputs: ["audioSignalCollapsed", "enableDownload", "peakDbLvl", "agc", "disableAudioDetails", "audioLoaded", "playStartAction", "playStopAction", "displayLevelInfos"], outputs: ["onShowRecordingDetails", "onDownloadRecording"] }, { kind: "component", type: i10.UploadStatus, selector: "app-uploadstatus", inputs: ["value", "awaitNewUpload", "status"] }, { kind: "component", type: i10.WakeLockIndicator, selector: "app-wakelockindicator", inputs: ["screenLocked"] }, { kind: "component", type: i10.ReadyStateIndicator, selector: "app-readystateindicator", inputs: ["ready"] }, { kind: "component", type: i12.WarningBar, selector: "app-warningbar", inputs: ["warningText", "show"] }, { kind: "component", type: i13.RecorderCombiPane, selector: "app-recordercombipane", inputs: ["selectDisabled", "selectedRecordingFile", "audioSignalCollapsed", "displayAudioClip", "playStartAction", "playSelectionAction", "autoPlayOnSelectToggleAction", "playStopAction"], outputs: ["selectedRecordingFileChanged"] }] }); }
962
+ `, isInline: true, styles: [":host{flex:2;background:#d3d3d3;display:flex;flex-direction:column;margin:0;padding:0;height:100%;min-height:0px;overflow:hidden}\n", ".ricontrols{padding:4px;box-sizing:border-box;height:100%}\n", ".dark{background:#a9a9a9}\n", ".controlpanel{display:flex;flex-direction:row;align-content:center;align-items:center;margin:0;padding:20px;min-height:min-content}\n", ".startstop{width:100%;flex:1 0 30%;align-items:center;text-align:center;align-content:center}\n", ".startstopscreenxs{width:100%;flex:1 0 100%;align-items:center;text-align:center;align-content:center}\n", ".bigbutton{vertical-align:middle;overflow:hidden;text-overflow:clip;white-space:nowrap;letter-spacing:normal;min-width:70px;min-height:50px;border-radius:20px}\n", ".bigbuttonicon{min-width:50px;min-height:50px;font-size:50px}\n", ".bigbuttontext{font-weight:bolder;font-size:14px;vertical-align:middle}\n", ".audioStatusDisplay{display:flex;flex-direction:row;height:100px;min-height:100px}\n", ".audioStatusDisplayXs{display:flex;flex-direction:column;height:125px;min-height:125px}\n"], dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i8.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i9.LevelBar, selector: "audio-levelbar", inputs: ["streamingMode", "displayLevelInfos", "state"] }, { kind: "component", type: i10.StatusDisplay, selector: "app-sprstatusdisplay", inputs: ["statusAlertType", "statusMsg", "statusWaiting"] }, { kind: "component", type: i11.RecordingItemControls, selector: "spr-recordingitemcontrols", inputs: ["audioSignalCollapsed", "enableDownload", "peakDbLvl", "agc", "disableAudioDetails", "audioLoaded", "playStartAction", "playStopAction", "displayLevelInfos"], outputs: ["onShowRecordingDetails", "onDownloadRecording"] }, { kind: "component", type: i10.UploadStatus, selector: "app-uploadstatus", inputs: ["value", "awaitNewUpload", "status"] }, { kind: "component", type: i10.WakeLockIndicator, selector: "app-wakelockindicator", inputs: ["screenLocked"] }, { kind: "component", type: i10.ReadyStateIndicator, selector: "app-readystateindicator", inputs: ["ready"] }, { kind: "component", type: i12.WarningBar, selector: "app-warningbar", inputs: ["warningText", "show"] }, { kind: "component", type: i13.RecorderCombiPane, selector: "app-recordercombipane", inputs: ["selectDisabled", "selectedRecordingFile", "audioSignalCollapsed", "displayAudioClip", "playStartAction", "playSelectionAction", "autoPlayOnSelectToggleAction", "playStopAction"], outputs: ["selectedRecordingFileChanged"] }] }); }
963
963
  }
964
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: AudioRecorder, decorators: [{
964
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: AudioRecorder, decorators: [{
965
965
  type: Component,
966
966
  args: [{ selector: 'app-audiorecorder', providers: [SessionService], template: `
967
967
  <app-warningbar [show]="isTestSession()" warningText="Test recording only!"></app-warningbar>
@@ -1021,7 +1021,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImpor
1021
1021
  [ready]="dataSaved && !isActive()"></app-readystateindicator>
1022
1022
  </div>
1023
1023
  </div>
1024
- `, styles: [":host{flex:2;background:lightgrey;display:flex;flex-direction:column;margin:0;padding:0;height:100%;min-height:0px;overflow:hidden}\n", ".ricontrols{padding:4px;box-sizing:border-box;height:100%}\n", ".dark{background:darkgray}\n", ".controlpanel{display:flex;flex-direction:row;align-content:center;align-items:center;margin:0;padding:20px;min-height:min-content}\n", ".startstop{width:100%;flex:1 0 30%;align-items:center;text-align:center;align-content:center}\n", ".startstopscreenxs{width:100%;flex:1 0 100%;align-items:center;text-align:center;align-content:center}\n", ".bigbutton{vertical-align:middle;overflow:hidden;text-overflow:clip;white-space:nowrap;letter-spacing:normal;min-width:70px;min-height:50px;border-radius:20px}\n", ".bigbuttonicon{min-width:50px;min-height:50px;font-size:50px}\n", ".bigbuttontext{font-weight:bolder;font-size:14px;vertical-align:middle}\n", ".audioStatusDisplay{display:flex;flex-direction:row;height:100px;min-height:100px}\n", ".audioStatusDisplayXs{display:flex;flex-direction:column;height:125px;min-height:125px}\n"] }]
1024
+ `, styles: [":host{flex:2;background:#d3d3d3;display:flex;flex-direction:column;margin:0;padding:0;height:100%;min-height:0px;overflow:hidden}\n", ".ricontrols{padding:4px;box-sizing:border-box;height:100%}\n", ".dark{background:#a9a9a9}\n", ".controlpanel{display:flex;flex-direction:row;align-content:center;align-items:center;margin:0;padding:20px;min-height:min-content}\n", ".startstop{width:100%;flex:1 0 30%;align-items:center;text-align:center;align-content:center}\n", ".startstopscreenxs{width:100%;flex:1 0 100%;align-items:center;text-align:center;align-content:center}\n", ".bigbutton{vertical-align:middle;overflow:hidden;text-overflow:clip;white-space:nowrap;letter-spacing:normal;min-width:70px;min-height:50px;border-radius:20px}\n", ".bigbuttonicon{min-width:50px;min-height:50px;font-size:50px}\n", ".bigbuttontext{font-weight:bolder;font-size:14px;vertical-align:middle}\n", ".audioStatusDisplay{display:flex;flex-direction:row;height:100px;min-height:100px}\n", ".audioStatusDisplayXs{display:flex;flex-direction:column;height:125px;min-height:125px}\n"] }]
1025
1025
  }], ctorParameters: () => [{ type: i1.BreakpointObserver }, { type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: i2.MatDialog }, { type: i3.SessionService }, { type: i4.RecordingService }, { type: i5.SpeechRecorderUploader }, { type: i14.SpeechRecorderConfig, decorators: [{
1026
1026
  type: Inject,
1027
1027
  args: [SPEECHRECORDER_CONFIG]
@@ -1162,12 +1162,12 @@ export class AudioRecorderComponent extends RecorderComponent {
1162
1162
  ready() {
1163
1163
  return this.dataSaved && !this.ar.isActive();
1164
1164
  }
1165
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: AudioRecorderComponent, deps: [{ token: i15.ActivatedRoute }, { token: i15.Router }, { token: i0.ChangeDetectorRef }, { token: i3.SessionService }, { token: i16.ProjectService }, { token: i5.SpeechRecorderUploader }], target: i0.ɵɵFactoryTarget.Component }); }
1166
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: AudioRecorderComponent, selector: "app-audiorecorder-comp", providers: [SessionService], viewQueries: [{ propertyName: "ar", first: true, predicate: AudioRecorder, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
1165
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: AudioRecorderComponent, deps: [{ token: i15.ActivatedRoute }, { token: i15.Router }, { token: i0.ChangeDetectorRef }, { token: i3.SessionService }, { token: i16.ProjectService }, { token: i5.SpeechRecorderUploader }], target: i0.ɵɵFactoryTarget.Component }); }
1166
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.1", type: AudioRecorderComponent, selector: "app-audiorecorder-comp", providers: [SessionService], viewQueries: [{ propertyName: "ar", first: true, predicate: AudioRecorder, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
1167
1167
  <app-audiorecorder [projectName]="_project?.name" [dataSaved]="dataSaved"></app-audiorecorder>
1168
1168
  `, isInline: true, styles: [":host{flex:2;display:flex;height:100%;flex-direction:column;min-height:0}\n"], dependencies: [{ kind: "component", type: AudioRecorder, selector: "app-audiorecorder", inputs: ["projectName", "dataSaved"] }] }); }
1169
1169
  }
1170
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: AudioRecorderComponent, decorators: [{
1170
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: AudioRecorderComponent, decorators: [{
1171
1171
  type: Component,
1172
1172
  args: [{ selector: 'app-audiorecorder-comp', providers: [SessionService], template: `
1173
1173
  <app-audiorecorder [projectName]="_project?.name" [dataSaved]="dataSaved"></app-audiorecorder>
@@ -15,15 +15,15 @@ export class StatusDisplay {
15
15
  this.statusMsg = 'Initialize...';
16
16
  this.statusWaiting = false;
17
17
  }
18
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: StatusDisplay, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
19
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: StatusDisplay, selector: "app-sprstatusdisplay", inputs: { statusAlertType: "statusAlertType", statusMsg: "statusMsg", statusWaiting: "statusWaiting" }, ngImport: i0, template: `
18
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: StatusDisplay, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
19
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.1", type: StatusDisplay, selector: "app-sprstatusdisplay", inputs: { statusAlertType: "statusAlertType", statusMsg: "statusMsg", statusWaiting: "statusWaiting" }, ngImport: i0, template: `
20
20
  <p matTooltip="Status">
21
21
  <mat-progress-spinner *ngIf="statusWaiting" color="black" mode="indeterminate" [diameter]="30" [strokeWidth]="5"></mat-progress-spinner><mat-icon *ngIf="statusAlertType==='error'" style="color:red">report_problem</mat-icon>
22
22
  {{statusMsg}}
23
23
  </p>
24
24
  `, isInline: true, styles: [":host{display:inline;text-align:left;font-size:smaller}\n", "p{padding:4px;white-space:nowrap;display:inline-block}\n", "mat-progress-spinner{color:#000;display:inline-block}\n", "span{color:red}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i3.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
25
25
  }
26
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: StatusDisplay, decorators: [{
26
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: StatusDisplay, decorators: [{
27
27
  type: Component,
28
28
  args: [{ selector: 'app-sprstatusdisplay', template: `
29
29
  <p matTooltip="Status">
@@ -94,13 +94,13 @@ export class UploadStatus {
94
94
  get status() {
95
95
  return this._status;
96
96
  }
97
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: UploadStatus, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
98
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: UploadStatus, selector: "app-uploadstatus", inputs: { value: "value", awaitNewUpload: "awaitNewUpload", status: "status" }, ngImport: i0, template: `
97
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: UploadStatus, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
98
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.1", type: UploadStatus, selector: "app-uploadstatus", inputs: { value: "value", awaitNewUpload: "awaitNewUpload", status: "status" }, ngImport: i0, template: `
99
99
  <mat-progress-spinner [mode]="spinnerMode" [color]="colorStatus" [diameter]="30" [strokeWidth]="5" [value]="_value"
100
100
  [matTooltip]="toolTipText"></mat-progress-spinner>
101
101
  `, isInline: true, styles: [":host{text-align:left}\n", "mat-progress-spinner{display:inline-block}\n"], dependencies: [{ kind: "component", type: i3.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
102
102
  }
103
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: UploadStatus, decorators: [{
103
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: UploadStatus, decorators: [{
104
104
  type: Component,
105
105
  args: [{ selector: 'app-uploadstatus', template: `
106
106
  <mat-progress-spinner [mode]="spinnerMode" [color]="colorStatus" [diameter]="30" [strokeWidth]="5" [value]="_value"
@@ -117,12 +117,12 @@ export class ProgressDisplay {
117
117
  constructor() {
118
118
  this.progressMsg = '[itemcode]';
119
119
  }
120
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: ProgressDisplay, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
121
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: ProgressDisplay, selector: "app-sprprogressdisplay", ngImport: i0, template: `
120
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: ProgressDisplay, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
121
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.1", type: ProgressDisplay, selector: "app-sprprogressdisplay", ngImport: i0, template: `
122
122
  <p>{{progressMsg}}</p>
123
123
  `, isInline: true, styles: [":host{flex:1;width:100%;text-align:left}\n"] }); }
124
124
  }
125
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: ProgressDisplay, decorators: [{
125
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: ProgressDisplay, decorators: [{
126
126
  type: Component,
127
127
  args: [{ selector: 'app-sprprogressdisplay', template: `
128
128
  <p>{{progressMsg}}</p>
@@ -219,8 +219,8 @@ export class TransportPanel extends ResponsiveComponent {
219
219
  this.actions.stopNonrecordingAction.perform();
220
220
  }
221
221
  }
222
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: TransportPanel, deps: [{ token: i5.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Component }); }
223
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: TransportPanel, selector: "app-sprtransport", inputs: { readonly: "readonly", actions: "actions", navigationEnabled: "navigationEnabled", pausingEnabled: "pausingEnabled" }, usesInheritance: true, ngImport: i0, template: `
222
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: TransportPanel, deps: [{ token: i5.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Component }); }
223
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.1", type: TransportPanel, selector: "app-sprtransport", inputs: { readonly: "readonly", actions: "actions", navigationEnabled: "navigationEnabled", pausingEnabled: "pausingEnabled" }, usesInheritance: true, ngImport: i0, template: `
224
224
  <button id="bwdBtn" *ngIf="navigationEnabled" (click)="actions.bwdAction.perform()" [disabled]="bwdDisabled()"
225
225
  mat-raised-button class="transport-button-icon">
226
226
  <span><mat-icon>chevron_left</mat-icon></span>
@@ -242,7 +242,7 @@ export class TransportPanel extends ResponsiveComponent {
242
242
 
243
243
  `, isInline: true, styles: [":host{flex:20;align-self:center;width:100%;text-align:center;align-content:center;margin:0}\n", "div{display:inline;flex:0}\n", "button{touch-action:manipulation}\n", ".transport-button-icon{font-size:24px;vertical-align:middle;overflow:hidden;text-overflow:clip;white-space:nowrap}\n", ".transport-button-text{font-size:14px;letter-spacing:normal;vertical-align:baseline}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }] }); }
244
244
  }
245
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: TransportPanel, decorators: [{
245
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: TransportPanel, decorators: [{
246
246
  type: Component,
247
247
  args: [{ selector: 'app-sprtransport', template: `
248
248
  <button id="bwdBtn" *ngIf="navigationEnabled" (click)="actions.bwdAction.perform()" [disabled]="bwdDisabled()"
@@ -281,12 +281,12 @@ export class WakeLockIndicator {
281
281
  set screenLocked(screenLock) {
282
282
  this._screenLocked = screenLock;
283
283
  }
284
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: WakeLockIndicator, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
285
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: WakeLockIndicator, selector: "app-wakelockindicator", inputs: { screenLocked: "screenLocked" }, ngImport: i0, template: `
284
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: WakeLockIndicator, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
285
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.1", type: WakeLockIndicator, selector: "app-wakelockindicator", inputs: { screenLocked: "screenLocked" }, ngImport: i0, template: `
286
286
  <mat-icon *ngIf="_screenLocked">screen_lock_portrait</mat-icon>
287
287
  `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] }); }
288
288
  }
289
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: WakeLockIndicator, decorators: [{
289
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: WakeLockIndicator, decorators: [{
290
290
  type: Component,
291
291
  args: [{ selector: 'app-wakelockindicator', template: `
292
292
  <mat-icon *ngIf="_screenLocked">screen_lock_portrait</mat-icon>
@@ -308,12 +308,12 @@ export class ReadyStateIndicator {
308
308
  get ready() {
309
309
  return this._ready;
310
310
  }
311
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: ReadyStateIndicator, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
312
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: ReadyStateIndicator, selector: "app-readystateindicator", inputs: { ready: "ready" }, ngImport: i0, template: `
311
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: ReadyStateIndicator, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
312
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.1", type: ReadyStateIndicator, selector: "app-readystateindicator", inputs: { ready: "ready" }, ngImport: i0, template: `
313
313
  <mat-icon [matTooltip]="readyStateToolTip">{{hourGlassIconName}}</mat-icon>
314
314
  `, isInline: true, dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] }); }
315
315
  }
316
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: ReadyStateIndicator, decorators: [{
316
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: ReadyStateIndicator, decorators: [{
317
317
  type: Component,
318
318
  args: [{ selector: 'app-readystateindicator', template: `
319
319
  <mat-icon [matTooltip]="readyStateToolTip">{{hourGlassIconName}}</mat-icon>
@@ -336,8 +336,8 @@ export class ControlPanel extends ResponsiveComponent {
336
336
  get ready() {
337
337
  return this._ready;
338
338
  }
339
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: ControlPanel, deps: [{ token: i5.BreakpointObserver }, { token: i7.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
340
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: ControlPanel, selector: "app-sprcontrolpanel", inputs: { readonly: "readonly", transportActions: "transportActions", processing: "processing", statusMsg: "statusMsg", statusAlertType: "statusAlertType", statusWaiting: "statusWaiting", uploadStatus: "uploadStatus", uploadProgress: "uploadProgress", currentRecording: "currentRecording", enableUploadRecordings: "enableUploadRecordings", navigationEnabled: "navigationEnabled", ready: "ready" }, viewQueries: [{ propertyName: "statusDisplay", first: true, predicate: StatusDisplay, descendants: true, static: true }, { propertyName: "transportPanel", first: true, predicate: TransportPanel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
339
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: ControlPanel, deps: [{ token: i5.BreakpointObserver }, { token: i7.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
340
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.1", type: ControlPanel, selector: "app-sprcontrolpanel", inputs: { readonly: "readonly", transportActions: "transportActions", processing: "processing", statusMsg: "statusMsg", statusAlertType: "statusAlertType", statusWaiting: "statusWaiting", uploadStatus: "uploadStatus", uploadProgress: "uploadProgress", currentRecording: "currentRecording", enableUploadRecordings: "enableUploadRecordings", navigationEnabled: "navigationEnabled", ready: "ready" }, viewQueries: [{ propertyName: "statusDisplay", first: true, predicate: StatusDisplay, descendants: true, static: true }, { propertyName: "transportPanel", first: true, predicate: TransportPanel, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
341
341
  <div *ngIf="!screenXs" style="flex-direction: row" >
342
342
  <app-sprstatusdisplay style="flex:0 0 0" [statusMsg]="statusMsg" [statusAlertType]="statusAlertType" [statusWaiting]="statusWaiting"
343
343
  class="hidden-xs"></app-sprstatusdisplay>
@@ -359,7 +359,7 @@ export class ControlPanel extends ResponsiveComponent {
359
359
  </div>
360
360
  `, isInline: true, styles: ["div{align-content:center;align-items:center;margin:0;padding:20px;min-height:min-content}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: StatusDisplay, selector: "app-sprstatusdisplay", inputs: ["statusAlertType", "statusMsg", "statusWaiting"] }, { kind: "component", type: UploadStatus, selector: "app-uploadstatus", inputs: ["value", "awaitNewUpload", "status"] }, { kind: "component", type: TransportPanel, selector: "app-sprtransport", inputs: ["readonly", "actions", "navigationEnabled", "pausingEnabled"] }, { kind: "component", type: ReadyStateIndicator, selector: "app-readystateindicator", inputs: ["ready"] }] }); }
361
361
  }
362
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: ControlPanel, decorators: [{
362
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: ControlPanel, decorators: [{
363
363
  type: Component,
364
364
  args: [{ selector: 'app-sprcontrolpanel', template: `
365
365
  <div *ngIf="!screenXs" style="flex-direction: row" >
@@ -2,15 +2,26 @@ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
2
  import * as i0 from "@angular/core";
3
3
  import * as i1 from "@angular/common";
4
4
  import * as i2 from "@angular/material/icon";
5
- import * as i3 from "../../utils/scrollIntoViewToBottom";
5
+ import * as i3 from "../../ui/intersection-observer.directive";
6
6
  export class Progress {
7
- constructor() {
7
+ constructor(elRef) {
8
+ this.elRef = elRef;
8
9
  this.items = undefined;
9
10
  this.selectedItemIdx = 0;
10
11
  this.enableDownload = false;
11
12
  this.onRowSelect = new EventEmitter();
12
13
  this.onShowDoneAction = new EventEmitter();
13
14
  this.onDownloadDoneAction = new EventEmitter();
15
+ this.isObs = new IntersectionObserver(ise => {
16
+ //console.debug("Intersection changed: ");
17
+ ise.forEach((isee) => {
18
+ //console.debug("Intersection: "+isee.isIntersecting+' '+isee.intersectionRatio);
19
+ if (isee.intersectionRatio < 1) {
20
+ isee.target.scrollIntoView(false);
21
+ this.isObs.unobserve(isee.target);
22
+ }
23
+ });
24
+ }, { root: this.elRef.nativeElement });
14
25
  }
15
26
  set rowSelect(rowIdx) {
16
27
  this.onRowSelect.emit(rowIdx);
@@ -40,8 +51,8 @@ export class Progress {
40
51
  }
41
52
  return cached;
42
53
  }
43
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: Progress, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
44
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: Progress, selector: "app-sprprogress", inputs: { items: "items", selectedItemIdx: "selectedItemIdx", enableDownload: "enableDownload" }, outputs: { onRowSelect: "onRowSelect", rowSelect: "rowSelect", onShowDoneAction: "onShowDoneAction", clickDone: "clickDone", onDownloadDoneAction: "onDownloadDoneAction", clickDownloadDone: "clickDownloadDone" }, ngImport: i0, template: `
54
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: Progress, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
55
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.1", type: Progress, selector: "app-sprprogress", inputs: { items: "items", selectedItemIdx: "selectedItemIdx", enableDownload: "enableDownload" }, outputs: { onRowSelect: "onRowSelect", rowSelect: "rowSelect", onShowDoneAction: "onShowDoneAction", clickDone: "clickDone", onDownloadDoneAction: "onDownloadDoneAction", clickDownloadDone: "clickDownloadDone" }, ngImport: i0, template: `
45
56
 
46
57
  <table class="mat-typography">
47
58
  <thead>
@@ -56,7 +67,7 @@ export class Progress {
56
67
 
57
68
  <tr *ngFor="let item of items; let itIdx=index;"
58
69
  (click)="rowSelect=itIdx" [class.selRow]="itIdx===selectedItemIdx"
59
- [scrollIntoViewToBottom]="itIdx===selectedItemIdx">
70
+ [updateObservation]="{observer:isObs,observe:(itIdx===selectedItemIdx)}">
60
71
  <td>{{itIdx}}</td>
61
72
  <td class="promptDescriptor">{{item.promptAsString}}</td>
62
73
  <td>
@@ -69,9 +80,9 @@ export class Progress {
69
80
 
70
81
  </tbody>
71
82
  </table>
72
- `, isInline: true, styles: [":host{overflow-x:hidden;overflow-y:scroll;padding:10pt;flex:.1 0 content;background:white;min-height:1px}\n", "table{min-height:1px;border-collapse:collapse}table,th,td{border:1px solid lightgrey;padding:.5em}\n", ".selRow{background:lightblue}\n", ".promptDescriptor{max-width:200px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3.ScrollIntoViewDirective, selector: "[scrollIntoViewToBottom]", inputs: ["scrollIntoViewToBottom"] }] }); }
83
+ `, isInline: true, styles: [":host{overflow-x:hidden;overflow-y:scroll;padding:10pt;flex:.1 0 content;background:#fff;min-height:1px}\n", "table{min-height:1px;border-collapse:collapse}table,th,td{border:1px solid lightgrey;padding:.5em}\n", ".selRow{background:#add8e6}\n", ".promptDescriptor{max-width:200px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3.IntersectionObserverDirective, selector: "[updateObservation]", inputs: ["updateObservation"] }] }); }
73
84
  }
74
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: Progress, decorators: [{
85
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.1", ngImport: i0, type: Progress, decorators: [{
75
86
  type: Component,
76
87
  args: [{ selector: 'app-sprprogress', template: `
77
88
 
@@ -88,7 +99,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImpor
88
99
 
89
100
  <tr *ngFor="let item of items; let itIdx=index;"
90
101
  (click)="rowSelect=itIdx" [class.selRow]="itIdx===selectedItemIdx"
91
- [scrollIntoViewToBottom]="itIdx===selectedItemIdx">
102
+ [updateObservation]="{observer:isObs,observe:(itIdx===selectedItemIdx)}">
92
103
  <td>{{itIdx}}</td>
93
104
  <td class="promptDescriptor">{{item.promptAsString}}</td>
94
105
  <td>
@@ -101,8 +112,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImpor
101
112
 
102
113
  </tbody>
103
114
  </table>
104
- `, styles: [":host{overflow-x:hidden;overflow-y:scroll;padding:10pt;flex:.1 0 content;background:white;min-height:1px}\n", "table{min-height:1px;border-collapse:collapse}table,th,td{border:1px solid lightgrey;padding:.5em}\n", ".selRow{background:lightblue}\n", ".promptDescriptor{max-width:200px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}\n"] }]
105
- }], propDecorators: { items: [{
115
+ `, styles: [":host{overflow-x:hidden;overflow-y:scroll;padding:10pt;flex:.1 0 content;background:#fff;min-height:1px}\n", "table{min-height:1px;border-collapse:collapse}table,th,td{border:1px solid lightgrey;padding:.5em}\n", ".selRow{background:#add8e6}\n", ".promptDescriptor{max-width:200px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}\n"] }]
116
+ }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { items: [{
106
117
  type: Input
107
118
  }], selectedItemIdx: [{
108
119
  type: Input
@@ -121,4 +132,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImpor
121
132
  }], clickDownloadDone: [{
122
133
  type: Output
123
134
  }] } });
124
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3Jlc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvc3BlZWNocmVjb3JkZXIvc2Vzc2lvbi9wcm9ncmVzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFBOzs7OztBQWdGcEUsTUFBTSxPQUFPLFFBQVE7SUE1RXJCO1FBNkVXLFVBQUssR0FBd0IsU0FBUyxDQUFDO1FBQ3ZDLG9CQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLG1CQUFjLEdBQVUsS0FBSyxDQUFDO1FBQzdCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQU16QyxxQkFBZ0IsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBUzlDLHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7S0F1QjdEO0lBckNDLElBQ0ksU0FBUyxDQUFDLE1BQWE7UUFDekIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUdELElBQ0ksU0FBUyxDQUFDLE1BQWE7UUFDekIsSUFBRyxJQUFJLENBQUMsS0FBSyxJQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUU7WUFDN0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNwQztJQUNILENBQUM7SUFHRCxJQUNJLGlCQUFpQixDQUFDLE1BQWE7UUFDakMsSUFBRyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUU7WUFDOUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDOUIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUN4QztJQUNILENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxJQUFTO1FBQzVCLElBQUksTUFBTSxHQUFDLElBQUksQ0FBQztRQUNoQixJQUFHLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFDO1lBQ25CLElBQUksT0FBTyxHQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzdCLElBQUcsT0FBTyxHQUFDLENBQUMsRUFBQztnQkFDWCxJQUFJLEVBQUUsR0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUIsSUFBRyxFQUFFLElBQUksRUFBRSxDQUFDLGVBQWUsRUFBRTtvQkFDM0IsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsQ0FBQztpQkFDdkM7YUFDRjtTQUNGO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzs4R0F4Q1UsUUFBUTtrR0FBUixRQUFRLDhXQXhFVDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCVDs7MkZBNENVLFFBQVE7a0JBNUVwQixTQUFTOytCQUVFLGlCQUFpQixZQUVqQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCVDs4QkE2Q1EsS0FBSztzQkFBYixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNO2dCQUVILFNBQVM7c0JBRFosTUFBTTtnQkFLRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBRUgsU0FBUztzQkFEWixNQUFNO2dCQVFHLG9CQUFvQjtzQkFBN0IsTUFBTTtnQkFFSCxpQkFBaUI7c0JBRHBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0fSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQge0l0ZW19IGZyb20gJy4vaXRlbSc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcblxyXG4gIHNlbGVjdG9yOiAnYXBwLXNwcnByb2dyZXNzJyxcclxuXHJcbiAgdGVtcGxhdGU6IGBcclxuXHJcbiAgICA8dGFibGUgY2xhc3M9XCJtYXQtdHlwb2dyYXBoeVwiPlxyXG4gICAgICA8dGhlYWQ+XHJcbiAgICAgIDx0cj5cclxuICAgICAgICA8dGg+IzwvdGg+PCEtLTx0aD5Db2RlPC90aD4tLT5cclxuICAgICAgICA8dGg+UHJvbXB0PC90aD5cclxuICAgICAgICA8dGg+U3RhdHVzPC90aD5cclxuICAgICAgPC90cj5cclxuICAgICAgPC90aGVhZD5cclxuICAgICAgPHRib2R5PlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbXNcIj5cclxuXHJcbiAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zOyBsZXQgaXRJZHg9aW5kZXg7XCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInJvd1NlbGVjdD1pdElkeFwiIFtjbGFzcy5zZWxSb3ddPVwiaXRJZHg9PT1zZWxlY3RlZEl0ZW1JZHhcIlxyXG4gICAgICAgICAgICBbc2Nyb2xsSW50b1ZpZXdUb0JvdHRvbV09XCJpdElkeD09PXNlbGVjdGVkSXRlbUlkeFwiPlxyXG4gICAgICAgICAgPHRkPnt7aXRJZHh9fTwvdGQ+XHJcbiAgICAgICAgICA8dGQgY2xhc3M9XCJwcm9tcHREZXNjcmlwdG9yXCI+e3tpdGVtLnByb21wdEFzU3RyaW5nfX08L3RkPlxyXG4gICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICA8bWF0LWljb24gICpuZ0lmPVwiaXRlbS5pdGVtRG9uZSgpXCI+ZG9uZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDwhLS08bWF0LWljb24gKm5nSWY9XCJsYXRlc3RSZWNvcmRpbmdBdmFpbChpdGVtKT09PWZhbHNlXCIgc3R5bGU9XCJmb250LXNpemU6MC42ZW07d2lkdGg6MC42ZW07aGVpZ2h0OjAuNmVtXCI+Y2xvdWRfZG93bmxvYWQ8L21hdC1pY29uPi0tPlxyXG5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC90cj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8L3Rib2R5PlxyXG4gICAgPC90YWJsZT5cclxuICBgLFxyXG4gIHN0eWxlczogW2A6aG9zdCB7XHJcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XHJcbiAgICBvdmVyZmxvdy15OiBzY3JvbGw7XHJcbiAgICBwYWRkaW5nOiAxMHB0O1xyXG4gICAgLypmbGV4OiAwLjEgMCAzMDBweDtcclxuICAgICAgbWluLXdpZHRoOiAzMDBweDsgKi9cclxuICAgIGZsZXg6IDAuMSAwIGNvbnRlbnQ7XHJcbiAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcclxuICAgIC8qIFdvcmthcm91bmQgZm9yIEZpcmVmb3hcclxuICAgIElmIHRoZSBwcm9ncmVzcyB0YWJsZSBnZXRzIGxvbmcgKHNjcmlwdCB3aXRoIG1hbnkgaXRlbXMpIEZGIGluY3JlYXNlcyB0aGUgaGVpZ2h0IG9mIHRoZSBvdmVyZmxvdyBwcm9ncmVzc0NvbnRhaW5lciBhbmRcclxuICAgIHRoZSB3aG9sZSBhcHAgZG9lcyBub3QgZml0IGludG8gdGhlIHBhZ2UgYW55bW9yZS4gVGhlIGFwcCBvdmVyZmxvd3MgYW5kIHNob3dzIGEgdmVydGljYWwgc2Nyb2xsYmFyIGZvciB0aGUgd2hvbGUgYXBwLlxyXG4gICAgU2VlIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI4NjM2ODMyL2ZpcmVmb3gtb3ZlcmZsb3cteS1ub3Qtd29ya2luZy13aXRoLW5lc3RlZC1mbGV4Ym94XHJcbiAgICAqL1xyXG4gICAgLyogbWluLWhlaWdodDowcHg7ICovXHJcbiAgICBtaW4taGVpZ2h0OiAxcHg7XHJcbiAgfWAsXHJcbiAgICAgIGB0YWJsZSB7XHJcbiAgICAgICAgICAgICBtaW4taGVpZ2h0OiAxcHg7XHJcbiAgICAgICAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xyXG4gICAgICAgICAgICAgICAgIC8qIFRhYmxlcyBkbyBub3QgaGF2ZSBhIG5hdHVyYWwgbWluIHNpemUgKi9cclxuICAgICAgICAgICAgICAgICAvKm1pbi13aWR0aDogMzAwcHg7ICovXHJcbiAgICAgICBcclxuICAgICAgICAgICB9XHJcbiAgICAgICBcclxuICAgICAgICAgICB0YWJsZSwgdGgsIHRkIHtcclxuICAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGxpZ2h0Z3JleTtcclxuICAgICAgICAgICAgIHBhZGRpbmc6IDAuNWVtO1xyXG4gICAgICAgXHJcbiAgICAgICAgICAgfVxyXG4gICAgICAgXHJcbiAgICAgICAgICAgYCwgYFxyXG4gICAgICAuc2VsUm93IHtcclxuICAgICAgICBiYWNrZ3JvdW5kOiBsaWdodGJsdWU7XHJcbiAgICAgIH1cclxuICAgIGAsYC5wcm9tcHREZXNjcmlwdG9ye1xyXG5cclxuICAgICAgbWF4LXdpZHRoOiAyMDBweDtcclxuICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XHJcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XHJcbiAgICB9YF1cclxuXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQcm9ncmVzcyB7XHJcbiAgQElucHV0KCkgaXRlbXM6IEFycmF5PEl0ZW0+fHVuZGVmaW5lZD11bmRlZmluZWQ7XHJcbiAgQElucHV0KCkgc2VsZWN0ZWRJdGVtSWR4ID0gMDtcclxuICBASW5wdXQoKSBlbmFibGVEb3dubG9hZDogYm9vbGVhbj1mYWxzZTtcclxuICBAT3V0cHV0KCkgb25Sb3dTZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcclxuICBAT3V0cHV0KClcclxuICBzZXQgcm93U2VsZWN0KHJvd0lkeDpudW1iZXIpe1xyXG4gICAgdGhpcy5vblJvd1NlbGVjdC5lbWl0KHJvd0lkeCk7XHJcbiAgfVxyXG5cclxuICBAT3V0cHV0KCkgb25TaG93RG9uZUFjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG4gIEBPdXRwdXQoKVxyXG4gIHNldCBjbGlja0RvbmUocm93SWR4Om51bWJlcil7XHJcbiAgICBpZih0aGlzLml0ZW1zICYmdGhpcy5pdGVtc1tyb3dJZHhdICYmIHRoaXMuaXRlbXNbcm93SWR4XS5yZWNzKSB7XHJcbiAgICAgIHRoaXMub25Sb3dTZWxlY3QuZW1pdChyb3dJZHgpO1xyXG4gICAgICB0aGlzLm9uU2hvd0RvbmVBY3Rpb24uZW1pdChyb3dJZHgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQE91dHB1dCgpIG9uRG93bmxvYWREb25lQWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XHJcbiAgQE91dHB1dCgpXHJcbiAgc2V0IGNsaWNrRG93bmxvYWREb25lKHJvd0lkeDpudW1iZXIpe1xyXG4gICAgaWYodGhpcy5pdGVtcyAmJiB0aGlzLml0ZW1zW3Jvd0lkeF0gJiYgdGhpcy5pdGVtc1tyb3dJZHhdLnJlY3MpIHtcclxuICAgICAgdGhpcy5vblJvd1NlbGVjdC5lbWl0KHJvd0lkeCk7XHJcbiAgICAgIHRoaXMub25Eb3dubG9hZERvbmVBY3Rpb24uZW1pdChyb3dJZHgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbGF0ZXN0UmVjb3JkaW5nQXZhaWwoaXRlbTpJdGVtKTpib29sZWFufG51bGx7XHJcbiAgICBsZXQgY2FjaGVkPW51bGw7XHJcbiAgICBpZihpdGVtICYmIGl0ZW0ucmVjcyl7XHJcbiAgICAgIGxldCByZWNzTGVuPWl0ZW0ucmVjcy5sZW5ndGg7XHJcbiAgICAgIGlmKHJlY3NMZW4+MCl7XHJcbiAgICAgICAgbGV0IHJmPWl0ZW0ucmVjc1tyZWNzTGVuLTFdO1xyXG4gICAgICAgIGlmKHJmICYmIHJmLnNlcnZlclBlcnNpc3RlZCkge1xyXG4gICAgICAgICAgY2FjaGVkID0gKHJmLmF1ZGlvRGF0YUhvbGRlciAhPSBudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBjYWNoZWQ7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3Jlc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvc3BlZWNocmVjb3JkZXIvc2Vzc2lvbi9wcm9ncmVzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFBOzs7OztBQWdGaEYsTUFBTSxPQUFPLFFBQVE7SUFFbkIsWUFBb0IsS0FBZ0I7UUFBaEIsVUFBSyxHQUFMLEtBQUssQ0FBVztRQVkzQixVQUFLLEdBQXdCLFNBQVMsQ0FBQztRQUN2QyxvQkFBZSxHQUFHLENBQUMsQ0FBQztRQUNwQixtQkFBYyxHQUFVLEtBQUssQ0FBQztRQUM3QixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFNekMscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQVM5Qyx5QkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBN0IxRCxJQUFJLENBQUMsS0FBSyxHQUFDLElBQUksb0JBQW9CLENBQUMsR0FBRyxDQUFBLEVBQUU7WUFDdkMsMENBQTBDO1lBQzFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUMsRUFBRTtnQkFDbEIsaUZBQWlGO2dCQUNqRixJQUFHLElBQUksQ0FBQyxpQkFBaUIsR0FBQyxDQUFDLEVBQUM7b0JBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNsQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ25DO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLEVBQUMsRUFBQyxJQUFJLEVBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUMsQ0FBQyxDQUFBO0lBQ3BDLENBQUM7SUFLRCxJQUNJLFNBQVMsQ0FBQyxNQUFhO1FBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFHRCxJQUNJLFNBQVMsQ0FBQyxNQUFhO1FBQ3pCLElBQUcsSUFBSSxDQUFDLEtBQUssSUFBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFO1lBQzdELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDcEM7SUFDSCxDQUFDO0lBR0QsSUFDSSxpQkFBaUIsQ0FBQyxNQUFhO1FBQ2pDLElBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFO1lBQzlELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDeEM7SUFDSCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsSUFBUztRQUM1QixJQUFJLE1BQU0sR0FBQyxJQUFJLENBQUM7UUFDaEIsSUFBRyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksRUFBQztZQUNuQixJQUFJLE9BQU8sR0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUM3QixJQUFHLE9BQU8sR0FBQyxDQUFDLEVBQUM7Z0JBQ1gsSUFBSSxFQUFFLEdBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEdBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVCLElBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxlQUFlLEVBQUU7b0JBQzNCLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLENBQUM7aUJBQ3ZDO2FBQ0Y7U0FDRjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7OEdBckRVLFFBQVE7a0dBQVIsUUFBUSw4V0F4RVQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0QlQ7OzJGQTRDVSxRQUFRO2tCQTNFcEIsU0FBUzsrQkFFRSxpQkFBaUIsWUFDakI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0QlQ7K0VBMERRLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTTtnQkFFSCxTQUFTO3NCQURaLE1BQU07Z0JBS0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUVILFNBQVM7c0JBRFosTUFBTTtnQkFRRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBRUgsaUJBQWlCO3NCQURwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHtJdGVtfSBmcm9tICcuL2l0ZW0nO1xyXG5pbXBvcnQge0ludGVyc2VjdGlvbk9ic2VydmVyRGlyZWN0aXZlfSBmcm9tIFwiLi4vLi4vdWkvaW50ZXJzZWN0aW9uLW9ic2VydmVyLmRpcmVjdGl2ZVwiO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG5cclxuICBzZWxlY3RvcjogJ2FwcC1zcHJwcm9ncmVzcycsXHJcbiAgdGVtcGxhdGU6IGBcclxuXHJcbiAgICA8dGFibGUgY2xhc3M9XCJtYXQtdHlwb2dyYXBoeVwiPlxyXG4gICAgICA8dGhlYWQ+XHJcbiAgICAgIDx0cj5cclxuICAgICAgICA8dGg+IzwvdGg+PCEtLTx0aD5Db2RlPC90aD4tLT5cclxuICAgICAgICA8dGg+UHJvbXB0PC90aD5cclxuICAgICAgICA8dGg+U3RhdHVzPC90aD5cclxuICAgICAgPC90cj5cclxuICAgICAgPC90aGVhZD5cclxuICAgICAgPHRib2R5PlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbXNcIj5cclxuXHJcbiAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zOyBsZXQgaXRJZHg9aW5kZXg7XCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInJvd1NlbGVjdD1pdElkeFwiIFtjbGFzcy5zZWxSb3ddPVwiaXRJZHg9PT1zZWxlY3RlZEl0ZW1JZHhcIlxyXG4gICAgICAgICAgICBbdXBkYXRlT2JzZXJ2YXRpb25dPVwie29ic2VydmVyOmlzT2JzLG9ic2VydmU6KGl0SWR4PT09c2VsZWN0ZWRJdGVtSWR4KX1cIj5cclxuICAgICAgICAgIDx0ZD57e2l0SWR4fX08L3RkPlxyXG4gICAgICAgICAgPHRkIGNsYXNzPVwicHJvbXB0RGVzY3JpcHRvclwiPnt7aXRlbS5wcm9tcHRBc1N0cmluZ319PC90ZD5cclxuICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgPG1hdC1pY29uICAqbmdJZj1cIml0ZW0uaXRlbURvbmUoKVwiPmRvbmU8L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8IS0tPG1hdC1pY29uICpuZ0lmPVwibGF0ZXN0UmVjb3JkaW5nQXZhaWwoaXRlbSk9PT1mYWxzZVwiIHN0eWxlPVwiZm9udC1zaXplOjAuNmVtO3dpZHRoOjAuNmVtO2hlaWdodDowLjZlbVwiPmNsb3VkX2Rvd25sb2FkPC9tYXQtaWNvbj4tLT5cclxuXHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPC90Ym9keT5cclxuICAgIDwvdGFibGU+XHJcbiAgYCxcclxuICBzdHlsZXM6IFtgOmhvc3Qge1xyXG4gICAgb3ZlcmZsb3cteDogaGlkZGVuO1xyXG4gICAgb3ZlcmZsb3cteTogc2Nyb2xsO1xyXG4gICAgcGFkZGluZzogMTBwdDtcclxuICAgIC8qZmxleDogMC4xIDAgMzAwcHg7XHJcbiAgICAgIG1pbi13aWR0aDogMzAwcHg7ICovXHJcbiAgICBmbGV4OiAwLjEgMCBjb250ZW50O1xyXG4gICAgYmFja2dyb3VuZDogd2hpdGU7XHJcbiAgICAvKiBXb3JrYXJvdW5kIGZvciBGaXJlZm94XHJcbiAgICBJZiB0aGUgcHJvZ3Jlc3MgdGFibGUgZ2V0cyBsb25nIChzY3JpcHQgd2l0aCBtYW55IGl0ZW1zKSBGRiBpbmNyZWFzZXMgdGhlIGhlaWdodCBvZiB0aGUgb3ZlcmZsb3cgcHJvZ3Jlc3NDb250YWluZXIgYW5kXHJcbiAgICB0aGUgd2hvbGUgYXBwIGRvZXMgbm90IGZpdCBpbnRvIHRoZSBwYWdlIGFueW1vcmUuIFRoZSBhcHAgb3ZlcmZsb3dzIGFuZCBzaG93cyBhIHZlcnRpY2FsIHNjcm9sbGJhciBmb3IgdGhlIHdob2xlIGFwcC5cclxuICAgIFNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yODYzNjgzMi9maXJlZm94LW92ZXJmbG93LXktbm90LXdvcmtpbmctd2l0aC1uZXN0ZWQtZmxleGJveFxyXG4gICAgKi9cclxuICAgIC8qIG1pbi1oZWlnaHQ6MHB4OyAqL1xyXG4gICAgbWluLWhlaWdodDogMXB4O1xyXG4gIH1gLFxyXG4gICAgICBgdGFibGUge1xyXG4gICAgICAgICAgICAgbWluLWhlaWdodDogMXB4O1xyXG4gICAgICAgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcclxuICAgICAgICAgICAgICAgICAvKiBUYWJsZXMgZG8gbm90IGhhdmUgYSBuYXR1cmFsIG1pbiBzaXplICovXHJcbiAgICAgICAgICAgICAgICAgLyptaW4td2lkdGg6IDMwMHB4OyAqL1xyXG4gICAgICAgXHJcbiAgICAgICAgICAgfVxyXG4gICAgICAgXHJcbiAgICAgICAgICAgdGFibGUsIHRoLCB0ZCB7XHJcbiAgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBsaWdodGdyZXk7XHJcbiAgICAgICAgICAgICBwYWRkaW5nOiAwLjVlbTtcclxuICAgICAgIFxyXG4gICAgICAgICAgIH1cclxuICAgICAgIFxyXG4gICAgICAgICAgIGAsIGBcclxuICAgICAgLnNlbFJvdyB7XHJcbiAgICAgICAgYmFja2dyb3VuZDogbGlnaHRibHVlO1xyXG4gICAgICB9XHJcbiAgICBgLGAucHJvbXB0RGVzY3JpcHRvcntcclxuXHJcbiAgICAgIG1heC13aWR0aDogMjAwcHg7XHJcbiAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xyXG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG4gICAgfWBdXHJcblxyXG59KVxyXG5leHBvcnQgY2xhc3MgUHJvZ3Jlc3Mge1xyXG4gIGlzT2JzOkludGVyc2VjdGlvbk9ic2VydmVyO1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxSZWY6RWxlbWVudFJlZikge1xyXG4gICAgdGhpcy5pc09icz1uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoaXNlPT57XHJcbiAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkludGVyc2VjdGlvbiBjaGFuZ2VkOiBcIik7XHJcbiAgICAgIGlzZS5mb3JFYWNoKChpc2VlKT0+e1xyXG4gICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkludGVyc2VjdGlvbjogXCIraXNlZS5pc0ludGVyc2VjdGluZysnICcraXNlZS5pbnRlcnNlY3Rpb25SYXRpbyk7XHJcbiAgICAgICAgaWYoaXNlZS5pbnRlcnNlY3Rpb25SYXRpbzwxKXtcclxuICAgICAgICAgIGlzZWUudGFyZ2V0LnNjcm9sbEludG9WaWV3KGZhbHNlKTtcclxuICAgICAgICAgIHRoaXMuaXNPYnMudW5vYnNlcnZlKGlzZWUudGFyZ2V0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSx7cm9vdDp0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnR9KVxyXG4gIH1cclxuICBASW5wdXQoKSBpdGVtczogQXJyYXk8SXRlbT58dW5kZWZpbmVkPXVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBzZWxlY3RlZEl0ZW1JZHggPSAwO1xyXG4gIEBJbnB1dCgpIGVuYWJsZURvd25sb2FkOiBib29sZWFuPWZhbHNlO1xyXG4gIEBPdXRwdXQoKSBvblJvd1NlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG4gIEBPdXRwdXQoKVxyXG4gIHNldCByb3dTZWxlY3Qocm93SWR4Om51bWJlcil7XHJcbiAgICB0aGlzLm9uUm93U2VsZWN0LmVtaXQocm93SWR4KTtcclxuICB9XHJcblxyXG4gIEBPdXRwdXQoKSBvblNob3dEb25lQWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XHJcbiAgQE91dHB1dCgpXHJcbiAgc2V0IGNsaWNrRG9uZShyb3dJZHg6bnVtYmVyKXtcclxuICAgIGlmKHRoaXMuaXRlbXMgJiZ0aGlzLml0ZW1zW3Jvd0lkeF0gJiYgdGhpcy5pdGVtc1tyb3dJZHhdLnJlY3MpIHtcclxuICAgICAgdGhpcy5vblJvd1NlbGVjdC5lbWl0KHJvd0lkeCk7XHJcbiAgICAgIHRoaXMub25TaG93RG9uZUFjdGlvbi5lbWl0KHJvd0lkeCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBAT3V0cHV0KCkgb25Eb3dubG9hZERvbmVBY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcclxuICBAT3V0cHV0KClcclxuICBzZXQgY2xpY2tEb3dubG9hZERvbmUocm93SWR4Om51bWJlcil7XHJcbiAgICBpZih0aGlzLml0ZW1zICYmIHRoaXMuaXRlbXNbcm93SWR4XSAmJiB0aGlzLml0ZW1zW3Jvd0lkeF0ucmVjcykge1xyXG4gICAgICB0aGlzLm9uUm93U2VsZWN0LmVtaXQocm93SWR4KTtcclxuICAgICAgdGhpcy5vbkRvd25sb2FkRG9uZUFjdGlvbi5lbWl0KHJvd0lkeCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsYXRlc3RSZWNvcmRpbmdBdmFpbChpdGVtOkl0ZW0pOmJvb2xlYW58bnVsbHtcclxuICAgIGxldCBjYWNoZWQ9bnVsbDtcclxuICAgIGlmKGl0ZW0gJiYgaXRlbS5yZWNzKXtcclxuICAgICAgbGV0IHJlY3NMZW49aXRlbS5yZWNzLmxlbmd0aDtcclxuICAgICAgaWYocmVjc0xlbj4wKXtcclxuICAgICAgICBsZXQgcmY9aXRlbS5yZWNzW3JlY3NMZW4tMV07XHJcbiAgICAgICAgaWYocmYgJiYgcmYuc2VydmVyUGVyc2lzdGVkKSB7XHJcbiAgICAgICAgICBjYWNoZWQgPSAocmYuYXVkaW9EYXRhSG9sZGVyICE9IG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNhY2hlZDtcclxuICB9XHJcblxyXG59XHJcbiJdfQ==