speechrecorderng 3.4.5 → 3.6.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.
Files changed (37) hide show
  1. package/README.md +1 -1
  2. package/esm2020/lib/audio/audio_player.mjs +13 -26
  3. package/esm2020/lib/audio/capture/capture.mjs +244 -207
  4. package/esm2020/lib/audio/context.mjs +64 -2
  5. package/esm2020/lib/audio/net_audio_buffer.mjs +5 -9
  6. package/esm2020/lib/audio/playback/player.mjs +137 -96
  7. package/esm2020/lib/audio/ui/audio_display_control.mjs +1 -1
  8. package/esm2020/lib/speechrecorder/project/project.mjs +1 -1
  9. package/esm2020/lib/speechrecorder/recordings/basic_recording.service.mjs +9 -8
  10. package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +38 -37
  11. package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +28 -77
  12. package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +9 -2
  13. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +3 -3
  14. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +1 -1
  15. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +44 -47
  16. package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +11 -11
  17. package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +66 -70
  18. package/esm2020/lib/speechrecorderng.component.mjs +8 -14
  19. package/esm2020/lib/spr.module.version.mjs +2 -2
  20. package/fesm2015/speechrecorderng.mjs +682 -610
  21. package/fesm2015/speechrecorderng.mjs.map +1 -1
  22. package/fesm2020/speechrecorderng.mjs +679 -610
  23. package/fesm2020/speechrecorderng.mjs.map +1 -1
  24. package/lib/audio/audio_player.d.ts +0 -1
  25. package/lib/audio/capture/capture.d.ts +5 -4
  26. package/lib/audio/context.d.ts +2 -0
  27. package/lib/audio/net_audio_buffer.d.ts +2 -4
  28. package/lib/audio/playback/player.d.ts +3 -2
  29. package/lib/speechrecorder/project/project.d.ts +1 -0
  30. package/lib/speechrecorder/recordings/basic_recording.service.d.ts +2 -2
  31. package/lib/speechrecorder/recordings/recordings.service.d.ts +8 -8
  32. package/lib/speechrecorder/session/basicrecorder.d.ts +3 -0
  33. package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +1 -0
  34. package/lib/speechrecorder/session/recordingfile/recordingfile-service.d.ts +2 -2
  35. package/lib/speechrecorder/session/sessionmanager.d.ts +1 -0
  36. package/lib/spr.module.version.d.ts +1 -1
  37. package/package.json +1 -1
@@ -1,7 +1,6 @@
1
1
  import { Component, ViewChild, } from '@angular/core';
2
2
  import { AudioDisplayPlayer } from "../../../audio/audio_player";
3
3
  import { AudioDisplayScrollPane } from "../../../audio/ui/audio_display_scroll_pane";
4
- import { AudioContextProvider } from "../../../audio/context";
5
4
  import { AudioClip } from "../../../audio/persistor";
6
5
  import { Selection } from "../../../audio/persistor";
7
6
  import { Action } from "../../../action/action";
@@ -29,7 +28,6 @@ export class RecordingFileViewComponent extends AudioDisplayPlayer {
29
28
  this.ref = ref;
30
29
  this.eRef = eRef;
31
30
  this.dialog = dialog;
32
- //protected _recordingFileId: string | number = null;
33
31
  this.sessionId = null;
34
32
  this.sessionIdFromRoute = null;
35
33
  this.availRecFiles = null;
@@ -38,9 +36,11 @@ export class RecordingFileViewComponent extends AudioDisplayPlayer {
38
36
  this.recordingFileVersion = null;
39
37
  this.routedByQueryParam = false;
40
38
  this.posInList = null;
41
- this.audioFetching = false;
42
- this.naviInfoLoading = false;
43
39
  this.parentE = this.eRef.nativeElement;
40
+ // TODO Should be initialized with false, but this causes in debug mode:
41
+ // ERROR Error: NG0100: ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value: 'false'. Current value: 'true'. Find more at https://angular.io/errors/NG0100
42
+ this.audioFetching = true;
43
+ this.naviInfoLoading = false;
44
44
  this.firstAction = new Action('First');
45
45
  this.firstAction.onAction = () => {
46
46
  this.posInList = 0;
@@ -206,54 +206,51 @@ export class RecordingFileViewComponent extends AudioDisplayPlayer {
206
206
  this.recordingFile = null;
207
207
  this.posInList = null;
208
208
  this.updateActions();
209
- let audioContext = AudioContextProvider.audioContextInstance();
210
- if (audioContext) {
211
- this.audioFetching = true;
212
- this.recordingFileService.fetchSprRecordingFile(audioContext, rfId).subscribe({
213
- next: value => {
214
- this.audioFetching = false;
215
- this.status = 'Audio file loaded.';
216
- let clip = null;
217
- this.recordingFile = value;
218
- if (this.recordingFile) {
219
- let ab = this.recordingFile.audioDataHolder;
220
- if (ab) {
221
- clip = new AudioClip(ab);
222
- let esffsr = null;
223
- let eeffsr = null;
224
- let esr = null;
225
- if (clip.audioDataHolder != null) {
226
- esr = ab.sampleRate;
227
- if (esr != null) {
228
- esffsr = RecordingFileUtil.editStartFrameForSampleRate(this.recordingFile, esr);
229
- eeffsr = RecordingFileUtil.editEndFrameForSampleRate(this.recordingFile, esr);
230
- }
231
- let sel = null;
232
- if (esffsr != null) {
233
- if (eeffsr != null) {
234
- sel = new Selection(ab.sampleRate, esffsr, eeffsr);
235
- }
236
- else {
237
- //let ch0 = ab.getChannelData(0);
238
- let frameLength = ab.frameLen;
239
- sel = new Selection(esr, esffsr, frameLength);
240
- }
209
+ this.audioFetching = true;
210
+ this.recordingFileService.fetchSprRecordingFile(rfId).subscribe({
211
+ next: value => {
212
+ this.audioFetching = false;
213
+ this.status = 'Audio file loaded.';
214
+ let clip = null;
215
+ this.recordingFile = value;
216
+ if (this.recordingFile) {
217
+ let ab = this.recordingFile.audioDataHolder;
218
+ if (ab) {
219
+ clip = new AudioClip(ab);
220
+ let esffsr = null;
221
+ let eeffsr = null;
222
+ let esr = null;
223
+ if (clip.audioDataHolder != null) {
224
+ esr = ab.sampleRate;
225
+ if (esr != null) {
226
+ esffsr = RecordingFileUtil.editStartFrameForSampleRate(this.recordingFile, esr);
227
+ eeffsr = RecordingFileUtil.editEndFrameForSampleRate(this.recordingFile, esr);
228
+ }
229
+ let sel = null;
230
+ if (esffsr != null) {
231
+ if (eeffsr != null) {
232
+ sel = new Selection(ab.sampleRate, esffsr, eeffsr);
241
233
  }
242
- else if (eeffsr != null) {
243
- sel = new Selection(esr, 0, eeffsr);
234
+ else {
235
+ //let ch0 = ab.getChannelData(0);
236
+ let frameLength = ab.frameLen;
237
+ sel = new Selection(esr, esffsr, frameLength);
244
238
  }
245
- clip.selection = sel;
246
239
  }
240
+ else if (eeffsr != null) {
241
+ sel = new Selection(esr, 0, eeffsr);
242
+ }
243
+ clip.selection = sel;
247
244
  }
248
245
  }
249
- this.audioClip = clip;
250
- this.loadedRecfile();
251
- }, error: error1 => {
252
- this.audioFetching = false;
253
- this.status = 'Error loading audio file!';
254
246
  }
255
- });
256
- }
247
+ this.audioClip = clip;
248
+ this.loadedRecfile();
249
+ }, error: error1 => {
250
+ this.audioFetching = false;
251
+ this.status = 'Error loading audio file!';
252
+ }
253
+ });
257
254
  }
258
255
  loadedRecfile() {
259
256
  if (this.recordingFile && !this.sessionId) {
@@ -414,4 +411,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
414
411
  type: ViewChild,
415
412
  args: [AudioDisplayScrollPane]
416
413
  }] } });
417
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5nLWZpbGUtdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvc3BlZWNocmVjb3JkZXIvc2Vzc2lvbi9yZWNvcmRpbmdmaWxlL3JlY29yZGluZy1maWxlLXZpZXcuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsU0FBUyxHQUdWLE1BQU0sZUFBZSxDQUFBO0FBUXRCLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBRS9ELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLDZDQUE2QyxDQUFDO0FBQ25GLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFFbkQsT0FBTyxFQUFDLE1BQU0sRUFBYyxNQUFNLHdCQUF3QixDQUFDO0FBSTNELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGtCQUFrQixDQUFDOzs7Ozs7Ozs7OztBQUduRCxNQUFNLE9BQU8sYUFBYTtDQUV6QjtBQWlERCxNQUFNLE9BQU8sMEJBQTJCLFNBQVEsa0JBQWtCO0lBNEJoRSxZQUFzQixvQkFBMEMsRUFBWSxnQkFBa0MsRUFBWSxjQUE4QixFQUFZLE1BQWEsRUFBVyxLQUFxQixFQUFZLEdBQXNCLEVBQVksSUFBZ0IsRUFBWSxNQUFpQjtRQUMxUyxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQURILHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFBWSxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQVksbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQVksV0FBTSxHQUFOLE1BQU0sQ0FBTztRQUFXLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQVksUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFBWSxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQVksV0FBTSxHQUFOLE1BQU0sQ0FBVztRQTFCNVMscURBQXFEO1FBRXJELGNBQVMsR0FBMEIsSUFBSSxDQUFDO1FBQ3hDLHVCQUFrQixHQUFhLElBQUksQ0FBQztRQUVwQyxrQkFBYSxHQUFzQyxJQUFJLENBQUM7UUFDeEQsYUFBUSxHQUFxQixJQUFJLENBQUM7UUFFbEMsa0JBQWEsR0FBd0IsSUFBSSxDQUFDO1FBQzFDLHlCQUFvQixHQUFhLElBQUksQ0FBQztRQUM5Qix1QkFBa0IsR0FBQyxLQUFLLENBQUM7UUFDakMsY0FBUyxHQUFjLElBQUksQ0FBQztRQVc1QixrQkFBYSxHQUFDLEtBQUssQ0FBQztRQUVwQixvQkFBZSxHQUFDLEtBQUssQ0FBQztRQUlwQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxNQUFNLENBQU8sT0FBTyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEdBQUUsR0FBRSxFQUFFO1lBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUMsQ0FBQyxDQUFDO1lBQ2pCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQ2pDLENBQUMsQ0FBQTtRQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxNQUFNLENBQU8sVUFBVSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUUsR0FBRSxFQUFFLENBQUEsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxNQUFNLENBQU8sTUFBTSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUUsR0FBRSxFQUFFLENBQUEsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQzlDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxNQUFNLENBQU8sTUFBTSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUUsR0FBRSxFQUFFO1lBQzVCLElBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Z0JBQy9DLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2FBQ2hDO1FBQ0gsQ0FBQyxDQUFBO1FBRUQsSUFBSSxDQUFDLGVBQWUsR0FBQyxJQUFJLE1BQU0sQ0FBUyxZQUFZLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsR0FBRSxDQUFDLEVBQUUsRUFBQyxFQUFFLENBQUEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsUUFBUTtRQUNOLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUVuQixDQUFDO0lBRUQsZUFBZTtRQUNiLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQTtRQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFjLEVBQUUsRUFBRTtZQUNsRCxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUN0QyxJQUFJLElBQUksR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDL0IsSUFBSSxJQUFJLEVBQUU7Z0JBQ1QsSUFBSSxDQUFDLGtCQUFrQixHQUFDLElBQUksQ0FBQzthQUM3QjtZQUNELElBQUksS0FBSyxFQUFFO2dCQUNULElBQUksQ0FBQyxrQkFBa0IsR0FBQyxJQUFJLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDekI7UUFDSCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQWMsRUFBRSxFQUFFO1lBQzdDLElBQUksS0FBSyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3RDLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUMvQixJQUFJLElBQUksRUFBRTtnQkFDUixJQUFJLENBQUMsa0JBQWtCLEdBQUMsSUFBSSxDQUFDO2FBQzlCO1lBQ0QsSUFBSSxLQUFLLEVBQUU7Z0JBQ1QsSUFBSSxDQUFDLGtCQUFrQixHQUFDLEtBQUssQ0FBQztnQkFDOUIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN6QjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsc0JBQXNCO1FBQ3RCLHdDQUF3QztRQUN4QyxJQUFJO0lBQ04sQ0FBQztJQUdPLFlBQVksQ0FBQyxJQUFtQjtRQUV0QyxJQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBQztZQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUMsRUFBQyxpQkFBaUIsRUFBQyxJQUFJLEVBQUMsRUFBQyxDQUFDLENBQUE7U0FDekY7YUFBSztZQUNKLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDO1NBQ2hFO0lBQ0gsQ0FBQztJQUVPLHVCQUF1QjtRQUM3QixJQUFHLElBQUksQ0FBQyxTQUFTLElBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDN0MsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekQsSUFBSSxNQUFNLEdBQUcsWUFBWSxDQUFDLGVBQWUsQ0FBQztZQUMxQyxJQUFHLE1BQU0sRUFBRTtnQkFDVCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQzNCO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsU0FBUyxDQUFDLEVBQXVCO1FBQy9CLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztRQUNsQixJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDO1FBQ3ZCLElBQUcsSUFBSSxDQUFDLFNBQVMsSUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUM3QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM5QyxJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQ2xDLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO2dCQUNwQixJQUFHLEdBQUcsQ0FBQyxPQUFPLElBQUcsSUFBSSxFQUFFO29CQUNyQixJQUFJLEdBQUcsQ0FBQyxPQUFPLEtBQUssT0FBTyxFQUFFO3dCQUMzQixNQUFNLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQzt3QkFDN0IsTUFBTTtxQkFDUDtpQkFDRjthQUNGO1NBQ0Y7UUFDRCxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMzQjtJQUNILENBQUM7SUFHRCxRQUFRO1FBQ04sSUFBRyxJQUFJLENBQUMsU0FBUyxJQUFFLElBQUksRUFBRTtZQUN2QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7U0FDbEI7UUFDRCxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQTtJQUNoQyxDQUFDO0lBQ0QsUUFBUTtRQUNOLElBQUcsSUFBSSxDQUFDLFNBQVMsSUFBRSxJQUFJLEVBQUU7WUFDdkIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQ2xCO1FBQ0QsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUE7SUFDaEMsQ0FBQztJQUVPLGNBQWM7UUFDcEIsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDNUMsSUFBSSxHQUFHLEdBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUM7WUFDcEMsSUFBRyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUM7Z0JBQy9FLEdBQUcsR0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUM7YUFDM0M7WUFDRCxJQUFJLEdBQUcsRUFBRTtnQkFDUCxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQTtnQkFDdkMsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRTtvQkFDekMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDdkMsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO3dCQUNsQixJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO3dCQUN4QixJQUFJLEdBQUcsS0FBSyxFQUFFLENBQUMsUUFBUSxFQUFFOzRCQUN2QixPQUFPLElBQUksQ0FBQzt5QkFDYjtxQkFDRjtpQkFDRjthQUNGO2lCQUFJO2dCQUNILElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFBO2dCQUN2QyxLQUFLLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsT0FBTyxFQUFFLElBQUksRUFBRSxFQUFFO29CQUN6QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNyQyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUU7d0JBQ3pDLE9BQU8sSUFBSSxDQUFDO3FCQUNiO2lCQUNGO2FBQ0o7U0FDRjtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLFNBQVM7UUFDZixJQUFJLENBQUMsU0FBUyxHQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsR0FBQyxJQUFJLENBQUM7UUFDbkMsSUFBRyxJQUFJLENBQUMsYUFBYSxFQUFDO1lBQ3BCLElBQUksUUFBUSxHQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQ3ZDLElBQUcsSUFBSSxDQUFDLFNBQVMsSUFBRyxJQUFJLElBQUksUUFBUSxHQUFDLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ25ELElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLElBQUksRUFBRTtvQkFDUixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7b0JBQ3BDLEtBQUssSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO3dCQUNwQixJQUFHLEdBQUcsQ0FBQyxTQUFTLEVBQUUsUUFBUSxFQUFFOzRCQUMxQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7eUJBQ2hDO3FCQUNGO29CQUVELElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxHQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3hEO2FBQ0Y7U0FDRjtRQUVELElBQUcsSUFBSSxDQUFDLGFBQWEsRUFBQztZQUNwQixJQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFDO2dCQUM1QixJQUFJLENBQUMsb0JBQW9CLEdBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUM7YUFDdEQ7aUJBQUk7Z0JBQ0gsSUFBSSxDQUFDLG9CQUFvQixHQUFDLENBQUMsQ0FBQzthQUM3QjtTQUNGO2FBQUk7WUFDSCxJQUFJLENBQUMsb0JBQW9CLEdBQUMsSUFBSSxDQUFDO1NBQ2hDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFBO0lBQ3RCLENBQUM7SUFFUyxXQUFXLENBQUMsSUFBb0I7UUFDeEMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUNoQixJQUFJLENBQUMsU0FBUyxHQUFFLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsYUFBYSxHQUFDLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsU0FBUyxHQUFDLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxZQUFZLEdBQUcsb0JBQW9CLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUMvRCxJQUFHLFlBQVksRUFBRTtZQUNmLElBQUksQ0FBQyxhQUFhLEdBQUMsSUFBSSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxxQkFBcUIsQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUN6RTtnQkFDRSxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUU7b0JBQ1osSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7b0JBQzNCLElBQUksQ0FBQyxNQUFNLEdBQUcsb0JBQW9CLENBQUM7b0JBQ25DLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztvQkFDaEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7b0JBQzNCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTt3QkFDdEIsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLENBQUM7d0JBQzVDLElBQUksRUFBRSxFQUFFOzRCQUNOLElBQUksR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQzs0QkFFekIsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDOzRCQUNsQixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7NEJBQ2xCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQzs0QkFFZixJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksSUFBSSxFQUFFO2dDQUNoQyxHQUFHLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQztnQ0FDcEIsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFO29DQUNmLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDO29DQUNoRixNQUFNLEdBQUcsaUJBQWlCLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQztpQ0FDL0U7Z0NBQ0QsSUFBSSxHQUFHLEdBQXFCLElBQUksQ0FBQztnQ0FDakMsSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFO29DQUNsQixJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7d0NBQ2xCLEdBQUcsR0FBRyxJQUFJLFNBQVMsQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztxQ0FDcEQ7eUNBQU07d0NBQ0wsaUNBQWlDO3dDQUNqQyxJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDO3dDQUM5QixHQUFHLEdBQUcsSUFBSSxTQUFTLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztxQ0FDL0M7aUNBQ0Y7cUNBQU0sSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFO29DQUN6QixHQUFHLEdBQUcsSUFBSSxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztpQ0FDckM7Z0NBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUE7NkJBQ3JCO3lCQUNGO3FCQUNGO29CQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFBO29CQUNyQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBRXZCLENBQUMsRUFBRSxLQUFLLEVBQUMsTUFBTSxDQUFDLEVBQUU7b0JBRXRCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO29CQUMzQixJQUFJLENBQUMsTUFBTSxHQUFHLDJCQUEyQixDQUFDO2dCQUM1QyxDQUFDO2FBQ0YsQ0FBQyxDQUFDO1NBQ0Y7SUFDSCxDQUFDO0lBRVMsYUFBYTtRQUNyQixJQUFHLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ3hDLElBQUksR0FBRyxHQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFBO1lBQ2xDLElBQUcsQ0FBQyxHQUFHLEVBQUM7Z0JBQ04sR0FBRyxHQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQzthQUM3QjtZQUNELElBQUksR0FBRyxFQUFFO2dCQUNQLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDdkI7U0FDRjtRQUVELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFTyxhQUFhO1FBQ25CLElBQUksT0FBTyxHQUFhLElBQUksQ0FBQztRQUM3QixJQUFHLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDckIsT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1NBQ3JDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEdBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFFLElBQUksSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxHQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsR0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUUsSUFBSSxJQUFJLE9BQU8sSUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbEcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFFLElBQUksSUFBSSxPQUFPLElBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3BHLENBQUM7SUFFTyxXQUFXLENBQUMsU0FBeUI7UUFDM0Msc0ZBQXNGO1FBQ3RGLElBQVksU0FBUyxJQUFZLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDL0MsaUNBQWlDO1lBQ2pDLElBQUksQ0FBQyxlQUFlLEdBQUMsSUFBSSxDQUFDO1lBQzFCLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFTLFNBQVMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNyRSx3QkFBd0I7Z0JBQ3hCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQztnQkFDN0Isc0NBQXNDO2dCQUN0QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQ3BGLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxLQUFLLEVBQTJCLENBQUM7b0JBQzFELHNDQUFzQztvQkFDdEMsSUFBSSxLQUFLLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztvQkFDaEMsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUU7d0JBQzdDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDckIsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFOzRCQUNaLCtDQUErQzs0QkFDL0MsSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUM5QixHQUFHLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQzt5QkFDM0I7d0JBQ0QsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQzt3QkFFdEIsSUFBSSxDQUFDLEVBQUUsRUFBRTs0QkFDUCxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDOzRCQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFO2dDQUNuQixFQUFFLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQzs2QkFDakI7eUJBQ0Y7d0JBQ0QsSUFBSSxFQUFFLEVBQUU7NEJBQ04sSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUMzQixJQUFJLFVBQVUsSUFBSSxJQUFJLEVBQUU7Z0NBQ3RCLDBCQUEwQjtnQ0FDMUIsSUFBSSxJQUFJLEdBQUcsSUFBSSxLQUFLLEVBQW9CLENBQUM7Z0NBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0NBQ2YsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztnQ0FDakIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7NkJBQy9CO2lDQUFNO2dDQUNMLHFFQUFxRTtnQ0FDckUsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQ0FDckIsdUVBQXVFO2dDQUN2RSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFO29DQUM3QixPQUFPLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztnQ0FDckMsQ0FBQyxDQUFDLENBQUE7NkJBQ0g7eUJBRUY7NkJBQU07NEJBQ0wsSUFBSSxJQUFJLEdBQUcsSUFBSSxLQUFLLEVBQW9CLENBQUM7NEJBQ3pDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBQ2YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7eUJBQy9CO3FCQUNGO29CQUNELHNEQUFzRDtvQkFDdEQsd0RBQXdEO29CQUN4RCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTt3QkFDckMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQzt3QkFDaEMsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQzt3QkFDaEMsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFOzRCQUNkLElBQUksRUFBRSxJQUFJLElBQUksRUFBRTtnQ0FDZCxPQUFPLENBQUMsQ0FBQzs2QkFDVjtpQ0FBTTtnQ0FDTCxrREFBa0Q7Z0NBQ2xELE9BQU8sQ0FBQyxDQUFDLENBQUM7NkJBQ1g7eUJBQ0Y7NkJBQU07NEJBQ0wsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFO2dDQUNkLGtEQUFrRDtnQ0FDbEQsT0FBTyxDQUFDLENBQUM7NkJBQ1Y7aUNBQU07Z0NBQ0wsNkNBQTZDO2dDQUM3QyxPQUFPLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7NkJBQ3BDO3lCQUNGO29CQUNILENBQUMsQ0FBQyxDQUFDO29CQUNILEtBQUksSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBQzt3QkFDL0IsSUFBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRTs0QkFDL0IsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsY0FBYyxDQUFDOzRCQUNyRCxLQUFLLElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtnQ0FDdEIsRUFBRSxJQUFJLEtBQUssQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDOzZCQUMzQjs0QkFDRCxvQkFBb0I7eUJBQ3JCO3FCQUNKO29CQUNELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQTtvQkFDaEIsSUFBSSxDQUFDLGVBQWUsR0FBQyxLQUFLLENBQUM7b0JBQzNCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQzNCLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7U0FDRjtJQUNMLENBQUM7O3dIQXZYVSwwQkFBMEI7NEdBQTFCLDBCQUEwQixrR0FnQjFCLHNCQUFzQix1RUEzRHZCOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCVDs0RkEwQlUsMEJBQTBCO2tCQS9DdEMsU0FBUzsrQkFFRSx3QkFBd0IsWUFFeEI7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJUOzBTQTJDTyxFQUFFO3NCQURULFNBQVM7dUJBQUMsc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgVmlld0NoaWxkLFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIEFmdGVyVmlld0luaXQsIEVsZW1lbnRSZWYsIE9uSW5pdCxcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5cclxuXHJcbmltcG9ydCB7QWN0aXZhdGVkUm91dGUsIFBhcmFtcywgUm91dGVyfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcblxyXG5cclxuaW1wb3J0IHtSZWNvcmRpbmdGaWxlU2VydmljZX0gZnJvbSBcIi4vcmVjb3JkaW5nZmlsZS1zZXJ2aWNlXCI7XHJcbmltcG9ydCB7TWF0RGlhbG9nfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nXCI7XHJcbmltcG9ydCB7QXVkaW9EaXNwbGF5UGxheWVyfSBmcm9tIFwiLi4vLi4vLi4vYXVkaW8vYXVkaW9fcGxheWVyXCI7XHJcblxyXG5pbXBvcnQge0F1ZGlvRGlzcGxheVNjcm9sbFBhbmV9IGZyb20gXCIuLi8uLi8uLi9hdWRpby91aS9hdWRpb19kaXNwbGF5X3Njcm9sbF9wYW5lXCI7XHJcbmltcG9ydCB7QXVkaW9Db250ZXh0UHJvdmlkZXJ9IGZyb20gXCIuLi8uLi8uLi9hdWRpby9jb250ZXh0XCI7XHJcbmltcG9ydCB7QXVkaW9DbGlwfSBmcm9tIFwiLi4vLi4vLi4vYXVkaW8vcGVyc2lzdG9yXCI7XHJcbmltcG9ydCB7U2VsZWN0aW9ufSBmcm9tIFwiLi4vLi4vLi4vYXVkaW8vcGVyc2lzdG9yXCI7XHJcblxyXG5pbXBvcnQge0FjdGlvbiwgQWN0aW9uRXZlbnR9IGZyb20gXCIuLi8uLi8uLi9hY3Rpb24vYWN0aW9uXCI7XHJcbmltcG9ydCB7U2Vzc2lvblNlcnZpY2V9IGZyb20gXCIuLi9zZXNzaW9uLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtSZWNvcmRpbmdTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vcmVjb3JkaW5ncy9yZWNvcmRpbmdzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtTcHJSZWNvcmRpbmdGaWxlfSBmcm9tIFwiLi4vLi4vcmVjb3JkaW5nXCI7XHJcbmltcG9ydCB7UmVjb3JkaW5nRmlsZVV0aWx9IGZyb20gXCIuL3JlY29yZGluZy1maWxlXCI7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIEl0ZW1jb2RlSW5kZXh7XHJcbiAgW2l0ZW1jb2RlOiBzdHJpbmddOiBBcnJheTxTcHJSZWNvcmRpbmdGaWxlPjtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcblxyXG4gIHNlbGVjdG9yOiAnYXBwLWF1ZGlvZGlzcGxheXBsYXllcicsXHJcblxyXG4gIHRlbXBsYXRlOiBgXHJcblxyXG4gICAgPGF1ZGlvLWRpc3BsYXktc2Nyb2xsLXBhbmUgI2F1ZGlvRGlzcGxheVNjcm9sbFBhbmU+PC9hdWRpby1kaXNwbGF5LXNjcm9sbC1wYW5lPlxyXG4gICAgPGRpdiBjbGFzcz1cImN0cmx2aWV3XCI+XHJcbiAgICAgIDxhcHAtcmVjb3JkaW5nLWZpbGUtbWV0YSBbc2Vzc2lvbklkXT1cInNlc3Npb25JZFwiIFtyZWNvcmRpbmdGaWxlXT1cInJlY29yZGluZ0ZpbGVcIiBbc3RhdGVMb2FkaW5nXT1cImF1ZGlvRmV0Y2hpbmdcIj48L2FwcC1yZWNvcmRpbmctZmlsZS1tZXRhPlxyXG5cclxuICAgIDxhdWRpby1kaXNwbGF5LWNvbnRyb2wgW2F1ZGlvQ2xpcF09XCJhdWRpb0NsaXBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5U3RhcnRBY3Rpb25dPVwicGxheVN0YXJ0QWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxheVNlbGVjdGlvbkFjdGlvbl09XCJwbGF5U2VsZWN0aW9uQWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxheVN0b3BBY3Rpb25dPVwicGxheVN0b3BBY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvUGxheU9uU2VsZWN0VG9nZ2xlQWN0aW9uXT1cImFwPy5hdXRvUGxheU9uU2VsZWN0VG9nZ2xlQWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbem9vbUluQWN0aW9uXT1cInpvb21JbkFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3pvb21PdXRBY3Rpb25dPVwiem9vbU91dEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3pvb21TZWxlY3RlZEFjdGlvbl09XCJ6b29tU2VsZWN0ZWRBY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbem9vbUZpdFRvUGFuZWxBY3Rpb25dPVwiem9vbUZpdFRvUGFuZWxBY3Rpb25cIj48L2F1ZGlvLWRpc3BsYXktY29udHJvbD5cclxuICAgICAgPGFwcC1yZWNvcmRpbmctZmlsZS1uYXZpIFtpdGVtc109XCJhdmFpbFJlY0ZpbGVzPy5sZW5ndGhcIiBbaXRlbVBvc109XCJwb3NJbkxpc3RcIiBbdmVyc2lvbl09XCJyZWNvcmRpbmdGaWxlVmVyc2lvblwiIFt2ZXJzaW9uc109XCJ2ZXJzaW9uc1wiIFtmaXJzdEFjdGlvbl09XCJmaXJzdEFjdGlvblwiIFtwcmV2QWN0aW9uXT1cInByZXZBY3Rpb25cIiBbbmV4dEFjdGlvbl09XCJuZXh0QWN0aW9uXCIgW2xhc3RBY3Rpb25dPVwibGFzdEFjdGlvblwiIFtzZWxlY3RWZXJzaW9uXT1cInRvVmVyc2lvbkFjdGlvblwiIFtuYXZpSW5mb0xvYWRpbmddPVwibmF2aUluZm9Mb2FkaW5nXCI+PC9hcHAtcmVjb3JkaW5nLWZpbGUtbmF2aT5cclxuICAgICAgPC9kaXY+XHJcbiAgYCxcclxuICBzdHlsZXM6IFtcclxuICAgIGA6aG9zdCB7XHJcbiAgICAgICAgICBmbGV4OiAyO1xyXG4gICAgICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICAgICAgICBtaW4taGVpZ2h0OjA7XHJcbiAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgICBwYWRkaW5nOiAyMHB4O1xyXG4gICAgICB6LWluZGV4OiA1O1xyXG4gICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTtcclxuICAgIH1gLGBcclxuICAgICAgICAuY3RybHZpZXd7XHJcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcclxuXHJcbiAgICAgICAgfVxyXG4gICAgYCxgXHJcbiAgICAgIGF1ZGlvLWRpc3BsYXktY29udHJvbHtcclxuXHJcbiAgICAgICAgZmxleDogMztcclxuICAgICAgfVxyXG4gICAgYF1cclxuXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSZWNvcmRpbmdGaWxlVmlld0NvbXBvbmVudCBleHRlbmRzIEF1ZGlvRGlzcGxheVBsYXllciBpbXBsZW1lbnRzIE9uSW5pdCxBZnRlclZpZXdJbml0IHtcclxuXHJcbiAgLy9wcm90ZWN0ZWQgX3JlY29yZGluZ0ZpbGVJZDogc3RyaW5nIHwgbnVtYmVyID0gbnVsbDtcclxuXHJcbiAgc2Vzc2lvbklkOiBzdHJpbmcgfCBudW1iZXIgfCBudWxsPSBudWxsO1xyXG4gIHNlc3Npb25JZEZyb21Sb3V0ZTpzdHJpbmd8bnVsbD1udWxsO1xyXG5cclxuICBhdmFpbFJlY0ZpbGVzOiBBcnJheTxBcnJheTxTcHJSZWNvcmRpbmdGaWxlPj58bnVsbD1udWxsO1xyXG4gIHZlcnNpb25zOiBBcnJheTxudW1iZXI+fG51bGw9bnVsbDtcclxuXHJcbiAgcmVjb3JkaW5nRmlsZTogU3ByUmVjb3JkaW5nRmlsZXxudWxsPW51bGw7XHJcbiAgcmVjb3JkaW5nRmlsZVZlcnNpb246bnVtYmVyfG51bGw9bnVsbDtcclxuICBwcml2YXRlIHJvdXRlZEJ5UXVlcnlQYXJhbT1mYWxzZTtcclxuICBwb3NJbkxpc3Q6IG51bWJlcnxudWxsPW51bGw7XHJcblxyXG5cclxuICBAVmlld0NoaWxkKEF1ZGlvRGlzcGxheVNjcm9sbFBhbmUpXHJcbiAgcHJpdmF0ZSBhYyE6IEF1ZGlvRGlzcGxheVNjcm9sbFBhbmU7XHJcblxyXG4gIGZpcnN0QWN0aW9uOiBBY3Rpb248dm9pZD47XHJcbiAgcHJldkFjdGlvbjogQWN0aW9uPHZvaWQ+O1xyXG4gIG5leHRBY3Rpb246IEFjdGlvbjx2b2lkPjtcclxuICBsYXN0QWN0aW9uOiBBY3Rpb248dm9pZD47XHJcbiAgdG9WZXJzaW9uQWN0aW9uOiBBY3Rpb248bnVtYmVyPjtcclxuICBhdWRpb0ZldGNoaW5nPWZhbHNlO1xyXG5cclxuICBuYXZpSW5mb0xvYWRpbmc9ZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWNvcmRpbmdGaWxlU2VydmljZTogUmVjb3JkaW5nRmlsZVNlcnZpY2UsIHByb3RlY3RlZCByZWNvcmRpbmdTZXJ2aWNlOiBSZWNvcmRpbmdTZXJ2aWNlLCBwcm90ZWN0ZWQgc2Vzc2lvblNlcnZpY2U6IFNlc3Npb25TZXJ2aWNlLCBwcm90ZWN0ZWQgcm91dGVyOlJvdXRlcixwcm90ZWN0ZWQgcm91dGU6IEFjdGl2YXRlZFJvdXRlLCBwcm90ZWN0ZWQgcmVmOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHJvdGVjdGVkIGVSZWY6IEVsZW1lbnRSZWYsIHByb3RlY3RlZCBkaWFsb2c6IE1hdERpYWxvZykge1xyXG4gICAgc3VwZXIocm91dGUsIHJlZiwgZVJlZilcclxuICAgIHRoaXMucGFyZW50RSA9IHRoaXMuZVJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgdGhpcy5maXJzdEFjdGlvbiA9IG5ldyBBY3Rpb248dm9pZD4oJ0ZpcnN0Jyk7XHJcbiAgICB0aGlzLmZpcnN0QWN0aW9uLm9uQWN0aW9uPSAoKT0+e1xyXG4gICAgICB0aGlzLnBvc0luTGlzdD0wO1xyXG4gICAgICB0aGlzLm5hdmlnYXRlVG9SZWNvcmRpbmdGaWxlKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnByZXZBY3Rpb24gPSBuZXcgQWN0aW9uPHZvaWQ+KCdQcmV2aW91cycpO1xyXG4gICAgdGhpcy5wcmV2QWN0aW9uLm9uQWN0aW9uPSAoKT0+dGhpcy5wcmV2RmlsZSgpO1xyXG4gICAgdGhpcy5uZXh0QWN0aW9uID0gbmV3IEFjdGlvbjx2b2lkPignTmV4dCcpO1xyXG4gICAgdGhpcy5uZXh0QWN0aW9uLm9uQWN0aW9uPSAoKT0+dGhpcy5uZXh0RmlsZSgpO1xyXG4gICAgdGhpcy5sYXN0QWN0aW9uID0gbmV3IEFjdGlvbjx2b2lkPignTGFzdCcpO1xyXG4gICAgdGhpcy5sYXN0QWN0aW9uLm9uQWN0aW9uPSAoKT0+e1xyXG4gICAgICBpZih0aGlzLmF2YWlsUmVjRmlsZXMpIHtcclxuICAgICAgICB0aGlzLnBvc0luTGlzdCA9IHRoaXMuYXZhaWxSZWNGaWxlcy5sZW5ndGggLSAxO1xyXG4gICAgICAgIHRoaXMubmF2aWdhdGVUb1JlY29yZGluZ0ZpbGUoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudG9WZXJzaW9uQWN0aW9uPW5ldyBBY3Rpb248bnVtYmVyPignVG8gdmVyc2lvbicpO1xyXG4gICAgdGhpcy50b1ZlcnNpb25BY3Rpb24ub25BY3Rpb249IChhZSk9PnRoaXMudG9WZXJzaW9uKGFlKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgc3VwZXIubmdPbkluaXQoKTtcclxuXHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICBzdXBlci5uZ0FmdGVyVmlld0luaXQoKVxyXG4gICAgdGhpcy5yb3V0ZS5xdWVyeVBhcmFtcy5zdWJzY3JpYmUoKHBhcmFtczogUGFyYW1zKSA9PiB7XHJcbiAgICAgIGxldCByZklkUCA9IHBhcmFtc1sncmVjb3JkaW5nRmlsZUlkJ107XHJcbiAgICAgIGxldCBzSWRQID0gcGFyYW1zWydzZXNzaW9uSWQnXTtcclxuICAgICAgaWYgKHNJZFApIHtcclxuICAgICAgIHRoaXMuc2Vzc2lvbklkRnJvbVJvdXRlPXNJZFA7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHJmSWRQKSB7XHJcbiAgICAgICAgdGhpcy5yb3V0ZWRCeVF1ZXJ5UGFyYW09dHJ1ZTtcclxuICAgICAgICB0aGlzLmxvYWRSZWNGaWxlKHJmSWRQKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnJvdXRlLnBhcmFtcy5zdWJzY3JpYmUoKHBhcmFtczogUGFyYW1zKSA9PiB7XHJcbiAgICAgIGxldCByZklkUCA9IHBhcmFtc1sncmVjb3JkaW5nRmlsZUlkJ107XHJcbiAgICAgIGxldCBzSWRQID0gcGFyYW1zWydzZXNzaW9uSWQnXTtcclxuICAgICAgaWYgKHNJZFApIHtcclxuICAgICAgICB0aGlzLnNlc3Npb25JZEZyb21Sb3V0ZT1zSWRQO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChyZklkUCkge1xyXG4gICAgICAgIHRoaXMucm91dGVkQnlRdWVyeVBhcmFtPWZhbHNlO1xyXG4gICAgICAgIHRoaXMubG9hZFJlY0ZpbGUocmZJZFApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIC8vIGlmKHRoaXMuc2Vzc2lvbklkKXtcclxuICAgIC8vICAgICB0aGlzLmxvYWRTZXNzaW9uKHRoaXMuc2Vzc2lvbklkKTtcclxuICAgIC8vIH1cclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIG5hdmlnYXRlVG9JZChyZklkOm51bWJlcnwgc3RyaW5nKXtcclxuXHJcbiAgICBpZih0aGlzLnJvdXRlZEJ5UXVlcnlQYXJhbSl7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtdLCB7cmVsYXRpdmVUbzogdGhpcy5yb3V0ZSwgcXVlcnlQYXJhbXM6eydyZWNvcmRpbmdGaWxlSWQnOnJmSWR9fSlcclxuICAgIH1lbHNlIHtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuLi8nICsgcmZJZF0sIHtyZWxhdGl2ZVRvOiB0aGlzLnJvdXRlfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG5hdmlnYXRlVG9SZWNvcmRpbmdGaWxlKCl7XHJcbiAgICBpZih0aGlzLnBvc0luTGlzdCE9bnVsbCAmJiB0aGlzLmF2YWlsUmVjRmlsZXMpIHtcclxuICAgICAgbGV0IGxhdGVzdE5leHRSZiA9IHRoaXMuYXZhaWxSZWNGaWxlc1t0aGlzLnBvc0luTGlzdF1bMF07XHJcbiAgICAgIGxldCBsblJmSWQgPSBsYXRlc3ROZXh0UmYucmVjb3JkaW5nRmlsZUlkO1xyXG4gICAgICBpZihsblJmSWQpIHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRlVG9JZChsblJmSWQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b1ZlcnNpb24oYWU6IEFjdGlvbkV2ZW50PG51bWJlcj4pIHtcclxuICAgIGxldCB0b1JmSWQgPSBudWxsO1xyXG4gICAgbGV0IHZlcnNpb24gPSBhZS52YWx1ZTtcclxuICAgIGlmKHRoaXMucG9zSW5MaXN0IT1udWxsICYmIHRoaXMuYXZhaWxSZWNGaWxlcykge1xyXG4gICAgICBsZXQgY1JmcyA9IHRoaXMuYXZhaWxSZWNGaWxlc1t0aGlzLnBvc0luTGlzdF07XHJcbiAgICAgIGxldCBhdmFpbFZlcnNpb25DbnQgPSBjUmZzLmxlbmd0aDtcclxuICAgICAgZm9yIChsZXQgY1JmIG9mIGNSZnMpIHtcclxuICAgICAgICBpZihjUmYudmVyc2lvbiAhPW51bGwpIHtcclxuICAgICAgICAgIGlmIChjUmYudmVyc2lvbiA9PT0gdmVyc2lvbikge1xyXG4gICAgICAgICAgICB0b1JmSWQgPSBjUmYucmVjb3JkaW5nRmlsZUlkO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0b1JmSWQgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLm5hdmlnYXRlVG9JZCh0b1JmSWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHByZXZGaWxlKCkge1xyXG4gICAgaWYodGhpcy5wb3NJbkxpc3QhPW51bGwpIHtcclxuICAgICAgdGhpcy5wb3NJbkxpc3QtLTtcclxuICAgIH1cclxuICAgIHRoaXMubmF2aWdhdGVUb1JlY29yZGluZ0ZpbGUoKVxyXG4gIH1cclxuICBuZXh0RmlsZSgpIHtcclxuICAgIGlmKHRoaXMucG9zSW5MaXN0IT1udWxsKSB7XHJcbiAgICAgIHRoaXMucG9zSW5MaXN0Kys7XHJcbiAgICB9XHJcbiAgICB0aGlzLm5hdmlnYXRlVG9SZWNvcmRpbmdGaWxlKClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcG9zaXRpb25Jbkxpc3QoKTpudW1iZXIgfCBudWxse1xyXG4gICAgaWYgKHRoaXMuYXZhaWxSZWNGaWxlcyAmJiB0aGlzLnJlY29yZGluZ0ZpbGUpIHtcclxuICAgICAgbGV0IGNpYz10aGlzLnJlY29yZGluZ0ZpbGUuaXRlbUNvZGU7XHJcbiAgICAgIGlmKCFjaWMgJiYgdGhpcy5yZWNvcmRpbmdGaWxlLnJlY29yZGluZyAmJiB0aGlzLnJlY29yZGluZ0ZpbGUucmVjb3JkaW5nLml0ZW1jb2RlKXtcclxuICAgICAgICBjaWM9dGhpcy5yZWNvcmRpbmdGaWxlLnJlY29yZGluZy5pdGVtY29kZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoY2ljKSB7XHJcbiAgICAgICAgbGV0IGl0ZW1DbnQgPSB0aGlzLmF2YWlsUmVjRmlsZXMubGVuZ3RoXHJcbiAgICAgICAgZm9yIChsZXQgcmZkaSA9IDA7IHJmZGkgPCBpdGVtQ250OyByZmRpKyspIHtcclxuICAgICAgICAgIGxldCBhclJmID0gdGhpcy5hdmFpbFJlY0ZpbGVzW3JmZGldWzBdO1xyXG4gICAgICAgICAgaWYgKGFyUmYucmVjb3JkaW5nKSB7XHJcbiAgICAgICAgICAgIGxldCBhciA9IGFyUmYucmVjb3JkaW5nO1xyXG4gICAgICAgICAgICBpZiAoY2ljID09PSBhci5pdGVtY29kZSkge1xyXG4gICAgICAgICAgICAgIHJldHVybiByZmRpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBsZXQgaXRlbUNudCA9IHRoaXMuYXZhaWxSZWNGaWxlcy5sZW5ndGhcclxuICAgICAgICBmb3IgKGxldCByZmRpID0gMDsgcmZkaSA8IGl0ZW1DbnQ7IHJmZGkrKykge1xyXG4gICAgICAgICAgbGV0IGFyUmYgPSB0aGlzLmF2YWlsUmVjRmlsZXNbcmZkaV1bMF07XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnJlY29yZGluZ0ZpbGUudXVpZCA9PT0gYXJSZi51dWlkKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIHJmZGk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZVBvcygpe1xyXG4gICAgdGhpcy5wb3NJbkxpc3Q9dGhpcy5wb3NpdGlvbkluTGlzdCgpO1xyXG4gICAgdGhpcy50b1ZlcnNpb25BY3Rpb24uZGlzYWJsZWQ9dHJ1ZTtcclxuICAgIGlmKHRoaXMuYXZhaWxSZWNGaWxlcyl7XHJcbiAgICAgIGxldCBhdlJmc0xlbj10aGlzLmF2YWlsUmVjRmlsZXMubGVuZ3RoO1xyXG4gICAgICBpZih0aGlzLnBvc0luTGlzdCAhPW51bGwgJiYgYXZSZnNMZW4+dGhpcy5wb3NJbkxpc3QpIHtcclxuICAgICAgICBsZXQgYXJmcyA9IHRoaXMuYXZhaWxSZWNGaWxlc1t0aGlzLnBvc0luTGlzdF07XHJcbiAgICAgICAgaWYgKGFyZnMpIHtcclxuICAgICAgICAgIHRoaXMudmVyc2lvbnMgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xyXG4gICAgICAgICAgZm9yIChsZXQgYXJmIG9mIGFyZnMpIHtcclxuICAgICAgICAgICAgaWYoYXJmLnJlY29yZGluZz8uaXRlbWNvZGUpIHtcclxuICAgICAgICAgICAgICB0aGlzLnZlcnNpb25zLnB1c2goYXJmLnZlcnNpb24pXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLnRvVmVyc2lvbkFjdGlvbi5kaXNhYmxlZD0odGhpcy52ZXJzaW9ucy5sZW5ndGg8Mik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYodGhpcy5yZWNvcmRpbmdGaWxlKXtcclxuICAgICAgaWYodGhpcy5yZWNvcmRpbmdGaWxlLnZlcnNpb24pe1xyXG4gICAgICAgIHRoaXMucmVjb3JkaW5nRmlsZVZlcnNpb249dGhpcy5yZWNvcmRpbmdGaWxlLnZlcnNpb247XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHRoaXMucmVjb3JkaW5nRmlsZVZlcnNpb249MDtcclxuICAgICAgfVxyXG4gICAgfWVsc2V7XHJcbiAgICAgIHRoaXMucmVjb3JkaW5nRmlsZVZlcnNpb249bnVsbDtcclxuICAgIH1cclxuICAgIHRoaXMudXBkYXRlQWN0aW9ucygpXHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgbG9hZFJlY0ZpbGUocmZJZDpudW1iZXIgfCBzdHJpbmcpIHtcclxuICAgIHRoaXMuYXA/LnN0b3AoKTtcclxuICAgIHRoaXMuYXVkaW9DbGlwID1udWxsO1xyXG4gICAgdGhpcy5yZWNvcmRpbmdGaWxlPW51bGw7XHJcbiAgICB0aGlzLnBvc0luTGlzdD1udWxsO1xyXG4gICAgdGhpcy51cGRhdGVBY3Rpb25zKCk7XHJcbiAgICBsZXQgYXVkaW9Db250ZXh0ID0gQXVkaW9Db250ZXh0UHJvdmlkZXIuYXVkaW9Db250ZXh0SW5zdGFuY2UoKTtcclxuICAgIGlmKGF1ZGlvQ29udGV4dCkge1xyXG4gICAgICB0aGlzLmF1ZGlvRmV0Y2hpbmc9dHJ1ZTtcclxuICAgICAgdGhpcy5yZWNvcmRpbmdGaWxlU2VydmljZS5mZXRjaFNwclJlY29yZGluZ0ZpbGUoYXVkaW9Db250ZXh0LCByZklkKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIG5leHQ6IHZhbHVlID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLmF1ZGlvRmV0Y2hpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICB0aGlzLnN0YXR1cyA9ICdBdWRpbyBmaWxlIGxvYWRlZC4nO1xyXG4gICAgICAgICAgICAgIGxldCBjbGlwID0gbnVsbDtcclxuICAgICAgICAgICAgICB0aGlzLnJlY29yZGluZ0ZpbGUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5yZWNvcmRpbmdGaWxlKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgYWIgPSB0aGlzLnJlY29yZGluZ0ZpbGUuYXVkaW9EYXRhSG9sZGVyO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFiKSB7XHJcbiAgICAgICAgICAgICAgICAgIGNsaXAgPSBuZXcgQXVkaW9DbGlwKGFiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIGxldCBlc2Zmc3IgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgZWVmZnNyID0gbnVsbDtcclxuICAgICAgICAgICAgICAgICAgbGV0IGVzciA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICAgICAgICBpZiAoY2xpcC5hdWRpb0RhdGFIb2xkZXIgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGVzciA9IGFiLnNhbXBsZVJhdGU7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVzciAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBlc2Zmc3IgPSBSZWNvcmRpbmdGaWxlVXRpbC5lZGl0U3RhcnRGcmFtZUZvclNhbXBsZVJhdGUodGhpcy5yZWNvcmRpbmdGaWxlLCBlc3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgZWVmZnNyID0gUmVjb3JkaW5nRmlsZVV0aWwuZWRpdEVuZEZyYW1lRm9yU2FtcGxlUmF0ZSh0aGlzLnJlY29yZGluZ0ZpbGUsIGVzcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWw6IFNlbGVjdGlvbiB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChlc2Zmc3IgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGVlZmZzciAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbCA9IG5ldyBTZWxlY3Rpb24oYWIuc2FtcGxlUmF0ZSwgZXNmZnNyLCBlZWZmc3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXQgY2gwID0gYWIuZ2V0Q2hhbm5lbERhdGEoMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmcmFtZUxlbmd0aCA9IGFiLmZyYW1lTGVuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWwgPSBuZXcgU2VsZWN0aW9uKGVzciwgZXNmZnNyLCBmcmFtZUxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlZWZmc3IgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgc2VsID0gbmV3IFNlbGVjdGlvbihlc3IsIDAsIGVlZmZzcik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNsaXAuc2VsZWN0aW9uID0gc2VsXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgdGhpcy5hdWRpb0NsaXAgPSBjbGlwXHJcbiAgICAgICAgICAgICAgdGhpcy5sb2FkZWRSZWNmaWxlKCk7XHJcblxyXG4gICAgICAgICAgICB9LCBlcnJvcjplcnJvcjEgPT5cclxuICAgICAge1xyXG4gICAgICAgIHRoaXMuYXVkaW9GZXRjaGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc3RhdHVzID0gJ0Vycm9yIGxvYWRpbmcgYXVkaW8gZmlsZSEnO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBsb2FkZWRSZWNmaWxlKCkge1xyXG4gICAgaWYodGhpcy5yZWNvcmRpbmdGaWxlICYmICF0aGlzLnNlc3Npb25JZCkge1xyXG4gICAgICBsZXQgc0lkPXRoaXMucmVjb3JkaW5nRmlsZS5zZXNzaW9uXHJcbiAgICAgIGlmKCFzSWQpe1xyXG4gICAgICAgIHNJZD10aGlzLnNlc3Npb25JZEZyb21Sb3V0ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoc0lkKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkU2Vzc2lvbihzSWQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVQb3MoKTtcclxuICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlQWN0aW9ucygpe1xyXG4gICAgbGV0IGl0ZW1DbnQ6bnVtYmVyfG51bGw9bnVsbDtcclxuICAgIGlmKHRoaXMuYXZhaWxSZWNGaWxlcykge1xyXG4gICAgICBpdGVtQ250ID0gdGhpcy5hdmFpbFJlY0ZpbGVzLmxlbmd0aDtcclxuICAgIH1cclxuICAgIHRoaXMuZmlyc3RBY3Rpb24uZGlzYWJsZWQ9KHRoaXMucG9zSW5MaXN0PT1udWxsIHx8IHRoaXMucG9zSW5MaXN0ID09IDApO1xyXG4gICAgdGhpcy5wcmV2QWN0aW9uLmRpc2FibGVkPSh0aGlzLnBvc0luTGlzdD09bnVsbCB8fCB0aGlzLnBvc0luTGlzdCA9PSAwKTtcclxuICAgIHRoaXMubmV4dEFjdGlvbi5kaXNhYmxlZD0odGhpcy5wb3NJbkxpc3Q9PW51bGwgfHwgaXRlbUNudD09bnVsbCB8fCB0aGlzLnBvc0luTGlzdCA+PSBpdGVtQ250IC0gMSk7XHJcbiAgICB0aGlzLmxhc3RBY3Rpb24uZGlzYWJsZWQ9KHRoaXMucG9zSW5MaXN0PT1udWxsIHx8IGl0ZW1DbnQ9PW51bGwgfHwgdGhpcy5wb3NJbkxpc3QgPj0gaXRlbUNudCAtIDEpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkU2Vzc2lvbihzZXNzaW9uSWQ6IHN0cmluZ3wgbnVtYmVyKSB7XHJcbiAgICAvLyBsb2FkIHNlc3Npb24gYW5kIHJlY29yZGluZyBmaWxlIG1ldGFkYXRhIG9ubHkgd2hlbiBvbiBpbml0IGFuZCB3aGVuIHNlc3Npb24gY2hhbmdlc1xyXG4gICAgaWYgKDxzdHJpbmc+c2Vzc2lvbklkICE9IDxzdHJpbmc+dGhpcy5zZXNzaW9uSWQpIHtcclxuICAgICAgLy8gdGVsbCBVSSB0aGF0IHdlIGFyZSB3b3JraW5nLi4uXHJcbiAgICAgIHRoaXMubmF2aUluZm9Mb2FkaW5nPXRydWU7XHJcbiAgICAgIHRoaXMuc2Vzc2lvblNlcnZpY2Uuc2Vzc2lvbk9ic2VydmVyKDxzdHJpbmc+c2Vzc2lvbklkKS5zdWJzY3JpYmUoKHMpID0+IHtcclxuICAgICAgICAvLyByZWNlaXZlZCBzZXNzaW9uIGRhdGFcclxuICAgICAgICB0aGlzLnNlc3Npb25JZCA9IHMuc2Vzc2lvbklkO1xyXG4gICAgICAgIC8vIGZldGNoIHJlY29yZGluZyBmaWxlIG1ldGEgZGF0YSBsaXN0XHJcbiAgICAgICAgdGhpcy5yZWNvcmRpbmdTZXJ2aWNlLnNwclJlY29yZGluZ0ZpbGVMaXN0KHMucHJvamVjdCwgcy5zZXNzaW9uSWQpLnN1YnNjcmliZSgocmZkcykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5hdmFpbFJlY0ZpbGVzID0gbmV3IEFycmF5PEFycmF5PFNwclJlY29yZGluZ0ZpbGU+PigpO1xyXG4gICAgICAgICAgLy8gYnVpbGQgc3RydWN0dXJlIGluZGV4ZWQgYnkgaXRlbWNvZGVcclxuICAgICAgICAgIGxldCBpY0lkeCA9IG5ldyBJdGVtY29kZUluZGV4KCk7XHJcbiAgICAgICAgICBmb3IgKGxldCByZmRpID0gMDsgcmZkaSA8IHJmZHMubGVuZ3RoOyByZmRpKyspIHtcclxuICAgICAgICAgICAgbGV0IHJmZCA9IHJmZHNbcmZkaV07XHJcbiAgICAgICAgICAgIGlmIChyZmQuZGF0ZSkge1xyXG4gICAgICAgICAgICAgIC8vIGNvbnZlcnQgZGF0ZSBzdHJpbmcgZm9yIGZhc3RlciBzb3J0aW5nIGxhdGVyXHJcbiAgICAgICAgICAgICAgbGV0IHJmZGQgPSBuZXcgRGF0ZShyZmQuZGF0ZSk7XHJcbiAgICAgICAgICAgICAgcmZkLl9kYXRlQXNEYXRlT2JqID0gcmZkZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgaWMgPSByZmQuaXRlbUNvZGU7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWljKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHIgPSByZmQucmVjb3JkaW5nO1xyXG4gICAgICAgICAgICAgIGlmIChyICYmIHIuaXRlbWNvZGUpIHtcclxuICAgICAgICAgICAgICAgIGljID0gci5pdGVtY29kZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGljKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGV4UmZzRm9ySWMgPSBpY0lkeFtpY107XHJcbiAgICAgICAgICAgICAgaWYgKGV4UmZzRm9ySWMgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgLy8gaXRlbWNvZGUgbm90IHlldCBzdG9yZWRcclxuICAgICAgICAgICAgICAgIGxldCBhcmZkID0gbmV3IEFycmF5PFNwclJlY29yZGluZ0ZpbGU+KCk7XHJcbiAgICAgICAgICAgICAgICBhcmZkLnB1c2gocmZkKTtcclxuICAgICAgICAgICAgICAgIGljSWR4W2ljXSA9IGFyZmQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmF2YWlsUmVjRmlsZXMucHVzaChhcmZkKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gcmVjIGZpbGUgd2l0aCBpdGVtY29kZSBhbHJlYWR5IGV4aXN0cywgYWRkIChwdXNoKSB0aGlzIHZlcnNpb24gLi4uXHJcbiAgICAgICAgICAgICAgICBleFJmc0ZvckljLnB1c2gocmZkKTtcclxuICAgICAgICAgICAgICAgIC8vIC4uLiBhbmQgc29ydCBsYXRlc3QgdmVyc2lvbiAoaGlnaGVzdCB2ZXJzaW9uIG51bWJlcikgdG8gbG93ZXN0IGluZGV4XHJcbiAgICAgICAgICAgICAgICBleFJmc0ZvckljLnNvcnQoKHJmZDEsIHJmZDIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHJmZDIudmVyc2lvbiAtIHJmZDEudmVyc2lvbjtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBsZXQgYXJmZCA9IG5ldyBBcnJheTxTcHJSZWNvcmRpbmdGaWxlPigpO1xyXG4gICAgICAgICAgICAgIGFyZmQucHVzaChyZmQpO1xyXG4gICAgICAgICAgICAgIHRoaXMuYXZhaWxSZWNGaWxlcy5wdXNoKGFyZmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBoYXZlIHVuc29ydGVkIGl0ZW1jb2RlIGluZGV4ZWQgcmVjb3JkaW5nIGZpbGVzIGhlcmVcclxuICAgICAgICAgIC8vIHNvcnQgdGhlbSBvcmRlcmVkIGJ5IGRhdGUgb2YgbGF0ZXN0IHZlcnNpb24gYXNjZW5kaW5nXHJcbiAgICAgICAgICB0aGlzLmF2YWlsUmVjRmlsZXMuc29ydCgocmZzMSwgcmZzMikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgZDEgPSByZnMyWzBdLl9kYXRlQXNEYXRlT2JqO1xyXG4gICAgICAgICAgICBsZXQgZDIgPSByZnMxWzBdLl9kYXRlQXNEYXRlT2JqO1xyXG4gICAgICAgICAgICBpZiAoZDEgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIGlmIChkMiA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gU29ydCBlbnRyaWVzIHdob3NlIGRhdGVzIGFyZSBub3Qgc2V0IHRvIHRoZSBlbmRcclxuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgaWYgKGQyID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIFNvcnQgZW50cmllcyB3aG9zZSBkYXRlcyBhcmUgbm90IHNldCB0byB0aGUgZW5kXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29tcGFyZSBkYXRlIGJ5IHRpbWUgaW4gbWlsbGlzZWNvbmRzIHZhbHVlXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZDIuZ2V0VGltZSgpIC0gZDEuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBmb3IobGV0IGF2UmYgb2YgdGhpcy5hdmFpbFJlY0ZpbGVzKXtcclxuICAgICAgICAgICAgICBpZihhdlJmWzBdICYmIGF2UmZbMF0ucmVjb3JkaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgb3MgPSBhdlJmWzBdLnJlY29yZGluZy5pdGVtY29kZSArICc6IHZlcnNpb25zOiAnO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYXZSZlYgb2YgYXZSZikge1xyXG4gICAgICAgICAgICAgICAgICBvcyArPSBhdlJmVi52ZXJzaW9uICsgJy8nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKG9zKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZVBvcygpXHJcbiAgICAgICAgICB0aGlzLm5hdmlJbmZvTG9hZGluZz1mYWxzZTtcclxuICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICAgIH1cclxuICB9XHJcbn1cclxuXHJcbiJdfQ==
414
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5nLWZpbGUtdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvc3BlZWNocmVjb3JkZXIvc2Vzc2lvbi9yZWNvcmRpbmdmaWxlL3JlY29yZGluZy1maWxlLXZpZXcuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsU0FBUyxHQUdWLE1BQU0sZUFBZSxDQUFBO0FBUXRCLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBRS9ELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLDZDQUE2QyxDQUFDO0FBRW5GLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNuRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFFbkQsT0FBTyxFQUFDLE1BQU0sRUFBYyxNQUFNLHdCQUF3QixDQUFDO0FBSTNELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGtCQUFrQixDQUFDOzs7Ozs7Ozs7OztBQUduRCxNQUFNLE9BQU8sYUFBYTtDQUV6QjtBQWlERCxNQUFNLE9BQU8sMEJBQTJCLFNBQVEsa0JBQWtCO0lBd0JoRSxZQUFzQixvQkFBMEMsRUFBWSxnQkFBa0MsRUFBWSxjQUE4QixFQUFZLE1BQWEsRUFBVyxLQUFxQixFQUFZLEdBQXNCLEVBQVksSUFBZ0IsRUFBWSxNQUFpQjtRQUMxUyxLQUFLLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQURILHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFBWSxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQVksbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQVksV0FBTSxHQUFOLE1BQU0sQ0FBTztRQUFXLFVBQUssR0FBTCxLQUFL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RjtJQUNMLENBQUM7O3dIQXRYVSwwQkFBMEI7NEdBQTFCLDBCQUEwQixrR0FhMUIsc0JBQXNCLHVFQXhEdkI7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJUOzRGQTBCVSwwQkFBMEI7a0JBL0N0QyxTQUFTOytCQUVFLHdCQUF3QixZQUV4Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQlQ7MFNBd0NPLEVBQUU7c0JBRFQsU0FBUzt1QkFBQyxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQWZ0ZXJWaWV3SW5pdCwgRWxlbWVudFJlZiwgT25Jbml0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcblxyXG5cclxuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgUGFyYW1zLCBSb3V0ZXJ9IGZyb20gXCJAYW5ndWxhci9yb3V0ZXJcIjtcclxuXHJcblxyXG5pbXBvcnQge1JlY29yZGluZ0ZpbGVTZXJ2aWNlfSBmcm9tIFwiLi9yZWNvcmRpbmdmaWxlLXNlcnZpY2VcIjtcclxuaW1wb3J0IHtNYXREaWFsb2d9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2dcIjtcclxuaW1wb3J0IHtBdWRpb0Rpc3BsYXlQbGF5ZXJ9IGZyb20gXCIuLi8uLi8uLi9hdWRpby9hdWRpb19wbGF5ZXJcIjtcclxuXHJcbmltcG9ydCB7QXVkaW9EaXNwbGF5U2Nyb2xsUGFuZX0gZnJvbSBcIi4uLy4uLy4uL2F1ZGlvL3VpL2F1ZGlvX2Rpc3BsYXlfc2Nyb2xsX3BhbmVcIjtcclxuaW1wb3J0IHtBdWRpb0NvbnRleHRQcm92aWRlcn0gZnJvbSBcIi4uLy4uLy4uL2F1ZGlvL2NvbnRleHRcIjtcclxuaW1wb3J0IHtBdWRpb0NsaXB9IGZyb20gXCIuLi8uLi8uLi9hdWRpby9wZXJzaXN0b3JcIjtcclxuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gXCIuLi8uLi8uLi9hdWRpby9wZXJzaXN0b3JcIjtcclxuXHJcbmltcG9ydCB7QWN0aW9uLCBBY3Rpb25FdmVudH0gZnJvbSBcIi4uLy4uLy4uL2FjdGlvbi9hY3Rpb25cIjtcclxuaW1wb3J0IHtTZXNzaW9uU2VydmljZX0gZnJvbSBcIi4uL3Nlc3Npb24uc2VydmljZVwiO1xyXG5pbXBvcnQge1JlY29yZGluZ1NlcnZpY2V9IGZyb20gXCIuLi8uLi9yZWNvcmRpbmdzL3JlY29yZGluZ3Muc2VydmljZVwiO1xyXG5pbXBvcnQge1NwclJlY29yZGluZ0ZpbGV9IGZyb20gXCIuLi8uLi9yZWNvcmRpbmdcIjtcclxuaW1wb3J0IHtSZWNvcmRpbmdGaWxlVXRpbH0gZnJvbSBcIi4vcmVjb3JkaW5nLWZpbGVcIjtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgSXRlbWNvZGVJbmRleHtcclxuICBbaXRlbWNvZGU6IHN0cmluZ106IEFycmF5PFNwclJlY29yZGluZ0ZpbGU+O1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHJcbiAgc2VsZWN0b3I6ICdhcHAtYXVkaW9kaXNwbGF5cGxheWVyJyxcclxuXHJcbiAgdGVtcGxhdGU6IGBcclxuXHJcbiAgICA8YXVkaW8tZGlzcGxheS1zY3JvbGwtcGFuZSAjYXVkaW9EaXNwbGF5U2Nyb2xsUGFuZT48L2F1ZGlvLWRpc3BsYXktc2Nyb2xsLXBhbmU+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY3RybHZpZXdcIj5cclxuICAgICAgPGFwcC1yZWNvcmRpbmctZmlsZS1tZXRhIFtzZXNzaW9uSWRdPVwic2Vzc2lvbklkXCIgW3JlY29yZGluZ0ZpbGVdPVwicmVjb3JkaW5nRmlsZVwiIFtzdGF0ZUxvYWRpbmddPVwiYXVkaW9GZXRjaGluZ1wiPjwvYXBwLXJlY29yZGluZy1maWxlLW1ldGE+XHJcblxyXG4gICAgPGF1ZGlvLWRpc3BsYXktY29udHJvbCBbYXVkaW9DbGlwXT1cImF1ZGlvQ2xpcFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYXlTdGFydEFjdGlvbl09XCJwbGF5U3RhcnRBY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5U2VsZWN0aW9uQWN0aW9uXT1cInBsYXlTZWxlY3Rpb25BY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGF5U3RvcEFjdGlvbl09XCJwbGF5U3RvcEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9QbGF5T25TZWxlY3RUb2dnbGVBY3Rpb25dPVwiYXA/LmF1dG9QbGF5T25TZWxlY3RUb2dnbGVBY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt6b29tSW5BY3Rpb25dPVwiem9vbUluQWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbem9vbU91dEFjdGlvbl09XCJ6b29tT3V0QWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbem9vbVNlbGVjdGVkQWN0aW9uXT1cInpvb21TZWxlY3RlZEFjdGlvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFt6b29tRml0VG9QYW5lbEFjdGlvbl09XCJ6b29tRml0VG9QYW5lbEFjdGlvblwiPjwvYXVkaW8tZGlzcGxheS1jb250cm9sPlxyXG4gICAgICA8YXBwLXJlY29yZGluZy1maWxlLW5hdmkgW2l0ZW1zXT1cImF2YWlsUmVjRmlsZXM/Lmxlbmd0aFwiIFtpdGVtUG9zXT1cInBvc0luTGlzdFwiIFt2ZXJzaW9uXT1cInJlY29yZGluZ0ZpbGVWZXJzaW9uXCIgW3ZlcnNpb25zXT1cInZlcnNpb25zXCIgW2ZpcnN0QWN0aW9uXT1cImZpcnN0QWN0aW9uXCIgW3ByZXZBY3Rpb25dPVwicHJldkFjdGlvblwiIFtuZXh0QWN0aW9uXT1cIm5leHRBY3Rpb25cIiBbbGFzdEFjdGlvbl09XCJsYXN0QWN0aW9uXCIgW3NlbGVjdFZlcnNpb25dPVwidG9WZXJzaW9uQWN0aW9uXCIgW25hdmlJbmZvTG9hZGluZ109XCJuYXZpSW5mb0xvYWRpbmdcIj48L2FwcC1yZWNvcmRpbmctZmlsZS1uYXZpPlxyXG4gICAgICA8L2Rpdj5cclxuICBgLFxyXG4gIHN0eWxlczogW1xyXG4gICAgYDpob3N0IHtcclxuICAgICAgICAgIGZsZXg6IDI7XHJcbiAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgICAgICAgIG1pbi1oZWlnaHQ6MDtcclxuICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgICAgIHBhZGRpbmc6IDIwcHg7XHJcbiAgICAgIHotaW5kZXg6IDU7XHJcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xyXG4gICAgfWAsYFxyXG4gICAgICAgIC5jdHJsdmlld3tcclxuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xyXG5cclxuICAgICAgICB9XHJcbiAgICBgLGBcclxuICAgICAgYXVkaW8tZGlzcGxheS1jb250cm9se1xyXG5cclxuICAgICAgICBmbGV4OiAzO1xyXG4gICAgICB9XHJcbiAgICBgXVxyXG5cclxufSlcclxuZXhwb3J0IGNsYXNzIFJlY29yZGluZ0ZpbGVWaWV3Q29tcG9uZW50IGV4dGVuZHMgQXVkaW9EaXNwbGF5UGxheWVyIGltcGxlbWVudHMgT25Jbml0LEFmdGVyVmlld0luaXQge1xyXG5cclxuICBzZXNzaW9uSWQ6IHN0cmluZyB8IG51bWJlciB8IG51bGw9IG51bGw7XHJcbiAgc2Vzc2lvbklkRnJvbVJvdXRlOnN0cmluZ3xudWxsPW51bGw7XHJcblxyXG4gIGF2YWlsUmVjRmlsZXM6IEFycmF5PEFycmF5PFNwclJlY29yZGluZ0ZpbGU+PnxudWxsPW51bGw7XHJcbiAgdmVyc2lvbnM6IEFycmF5PG51bWJlcj58bnVsbD1udWxsO1xyXG5cclxuICByZWNvcmRpbmdGaWxlOiBTcHJSZWNvcmRpbmdGaWxlfG51bGw9bnVsbDtcclxuICByZWNvcmRpbmdGaWxlVmVyc2lvbjpudW1iZXJ8bnVsbD1udWxsO1xyXG4gIHByaXZhdGUgcm91dGVkQnlRdWVyeVBhcmFtPWZhbHNlO1xyXG4gIHBvc0luTGlzdDogbnVtYmVyfG51bGw9bnVsbDtcclxuXHJcbiAgQFZpZXdDaGlsZChBdWRpb0Rpc3BsYXlTY3JvbGxQYW5lKVxyXG4gIHByaXZhdGUgYWMhOiBBdWRpb0Rpc3BsYXlTY3JvbGxQYW5lO1xyXG5cclxuICBmaXJzdEFjdGlvbjogQWN0aW9uPHZvaWQ+O1xyXG4gIHByZXZBY3Rpb246IEFjdGlvbjx2b2lkPjtcclxuICBuZXh0QWN0aW9uOiBBY3Rpb248dm9pZD47XHJcbiAgbGFzdEFjdGlvbjogQWN0aW9uPHZvaWQ+O1xyXG4gIHRvVmVyc2lvbkFjdGlvbjogQWN0aW9uPG51bWJlcj47XHJcbiAgYXVkaW9GZXRjaGluZzpib29sZWFuO1xyXG4gIG5hdmlJbmZvTG9hZGluZzpib29sZWFuO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVjb3JkaW5nRmlsZVNlcnZpY2U6IFJlY29yZGluZ0ZpbGVTZXJ2aWNlLCBwcm90ZWN0ZWQgcmVjb3JkaW5nU2VydmljZTogUmVjb3JkaW5nU2VydmljZSwgcHJvdGVjdGVkIHNlc3Npb25TZXJ2aWNlOiBTZXNzaW9uU2VydmljZSwgcHJvdGVjdGVkIHJvdXRlcjpSb3V0ZXIscHJvdGVjdGVkIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSwgcHJvdGVjdGVkIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByb3RlY3RlZCBlUmVmOiBFbGVtZW50UmVmLCBwcm90ZWN0ZWQgZGlhbG9nOiBNYXREaWFsb2cpIHtcclxuICAgIHN1cGVyKHJvdXRlLCByZWYsIGVSZWYpXHJcbiAgICB0aGlzLnBhcmVudEUgPSB0aGlzLmVSZWYubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICAvLyBUT0RPIFNob3VsZCBiZSBpbml0aWFsaXplZCB3aXRoIGZhbHNlLCBidXQgdGhpcyBjYXVzZXMgaW4gZGVidWcgbW9kZTpcclxuICAgIC8vIEVSUk9SIEVycm9yOiBORzAxMDA6IEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3I6IEV4cHJlc3Npb24gaGFzIGNoYW5nZWQgYWZ0ZXIgaXQgd2FzIGNoZWNrZWQuIFByZXZpb3VzIHZhbHVlOiAnZmFsc2UnLiBDdXJyZW50IHZhbHVlOiAndHJ1ZScuIEZpbmQgbW9yZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vZXJyb3JzL05HMDEwMFxyXG4gICAgdGhpcy5hdWRpb0ZldGNoaW5nPXRydWU7XHJcblxyXG4gICAgdGhpcy5uYXZpSW5mb0xvYWRpbmc9ZmFsc2U7XHJcbiAgICB0aGlzLmZpcnN0QWN0aW9uID0gbmV3IEFjdGlvbjx2b2lkPignRmlyc3QnKTtcclxuICAgIHRoaXMuZmlyc3RBY3Rpb24ub25BY3Rpb249ICgpPT57XHJcbiAgICAgIHRoaXMucG9zSW5MaXN0PTA7XHJcbiAgICAgIHRoaXMubmF2aWdhdGVUb1JlY29yZGluZ0ZpbGUoKTtcclxuICAgIH1cclxuICAgIHRoaXMucHJldkFjdGlvbiA9IG5ldyBBY3Rpb248dm9pZD4oJ1ByZXZpb3VzJyk7XHJcbiAgICB0aGlzLnByZXZBY3Rpb24ub25BY3Rpb249ICgpPT50aGlzLnByZXZGaWxlKCk7XHJcbiAgICB0aGlzLm5leHRBY3Rpb24gPSBuZXcgQWN0aW9uPHZvaWQ+KCdOZXh0Jyk7XHJcbiAgICB0aGlzLm5leHRBY3Rpb24ub25BY3Rpb249ICgpPT50aGlzLm5leHRGaWxlKCk7XHJcbiAgICB0aGlzLmxhc3RBY3Rpb24gPSBuZXcgQWN0aW9uPHZvaWQ+KCdMYXN0Jyk7XHJcbiAgICB0aGlzLmxhc3RBY3Rpb24ub25BY3Rpb249ICgpPT57XHJcbiAgICAgIGlmKHRoaXMuYXZhaWxSZWNGaWxlcykge1xyXG4gICAgICAgIHRoaXMucG9zSW5MaXN0ID0gdGhpcy5hdmFpbFJlY0ZpbGVzLmxlbmd0aCAtIDE7XHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvUmVjb3JkaW5nRmlsZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy50b1ZlcnNpb25BY3Rpb249bmV3IEFjdGlvbjxudW1iZXI+KCdUbyB2ZXJzaW9uJyk7XHJcbiAgICB0aGlzLnRvVmVyc2lvbkFjdGlvbi5vbkFjdGlvbj0gKGFlKT0+dGhpcy50b1ZlcnNpb24oYWUpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgc3VwZXIubmdBZnRlclZpZXdJbml0KClcclxuICAgIHRoaXMucm91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKChwYXJhbXM6IFBhcmFtcykgPT4ge1xyXG4gICAgICBsZXQgcmZJZFAgPSBwYXJhbXNbJ3JlY29yZGluZ0ZpbGVJZCddO1xyXG4gICAgICBsZXQgc0lkUCA9IHBhcmFtc1snc2Vzc2lvbklkJ107XHJcbiAgICAgIGlmIChzSWRQKSB7XHJcbiAgICAgICB0aGlzLnNlc3Npb25JZEZyb21Sb3V0ZT1zSWRQO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChyZklkUCkge1xyXG4gICAgICAgIHRoaXMucm91dGVkQnlRdWVyeVBhcmFtPXRydWU7XHJcbiAgICAgICAgdGhpcy5sb2FkUmVjRmlsZShyZklkUCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgdGhpcy5yb3V0ZS5wYXJhbXMuc3Vic2NyaWJlKChwYXJhbXM6IFBhcmFtcykgPT4ge1xyXG4gICAgICBsZXQgcmZJZFAgPSBwYXJhbXNbJ3JlY29yZGluZ0ZpbGVJZCddO1xyXG4gICAgICBsZXQgc0lkUCA9IHBhcmFtc1snc2Vzc2lvbklkJ107XHJcbiAgICAgIGlmIChzSWRQKSB7XHJcbiAgICAgICAgdGhpcy5zZXNzaW9uSWRGcm9tUm91dGU9c0lkUDtcclxuICAgICAgfVxyXG4gICAgICBpZiAocmZJZFApIHtcclxuICAgICAgICB0aGlzLnJvdXRlZEJ5UXVlcnlQYXJhbT1mYWxzZTtcclxuICAgICAgICB0aGlzLmxvYWRSZWNGaWxlKHJmSWRQKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICAvLyBpZih0aGlzLnNlc3Npb25JZCl7XHJcbiAgICAvLyAgICAgdGhpcy5sb2FkU2Vzc2lvbih0aGlzLnNlc3Npb25JZCk7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0ZVRvSWQocmZJZDpudW1iZXJ8IHN0cmluZyl7XHJcblxyXG4gICAgaWYodGhpcy5yb3V0ZWRCeVF1ZXJ5UGFyYW0pe1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwge3JlbGF0aXZlVG86IHRoaXMucm91dGUsIHF1ZXJ5UGFyYW1zOnsncmVjb3JkaW5nRmlsZUlkJzpyZklkfX0pXHJcbiAgICB9ZWxzZSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnLi4vJyArIHJmSWRdLCB7cmVsYXRpdmVUbzogdGhpcy5yb3V0ZX0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBuYXZpZ2F0ZVRvUmVjb3JkaW5nRmlsZSgpe1xyXG4gICAgaWYodGhpcy5wb3NJbkxpc3QhPW51bGwgJiYgdGhpcy5hdmFpbFJlY0ZpbGVzKSB7XHJcbiAgICAgIGxldCBsYXRlc3ROZXh0UmYgPSB0aGlzLmF2YWlsUmVjRmlsZXNbdGhpcy5wb3NJbkxpc3RdWzBdO1xyXG4gICAgICBsZXQgbG5SZklkID0gbGF0ZXN0TmV4dFJmLnJlY29yZGluZ0ZpbGVJZDtcclxuICAgICAgaWYobG5SZklkKSB7XHJcbiAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvSWQobG5SZklkKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9WZXJzaW9uKGFlOiBBY3Rpb25FdmVudDxudW1iZXI+KSB7XHJcbiAgICBsZXQgdG9SZklkID0gbnVsbDtcclxuICAgIGxldCB2ZXJzaW9uID0gYWUudmFsdWU7XHJcbiAgICBpZih0aGlzLnBvc0luTGlzdCE9bnVsbCAmJiB0aGlzLmF2YWlsUmVjRmlsZXMpIHtcclxuICAgICAgbGV0IGNSZnMgPSB0aGlzLmF2YWlsUmVjRmlsZXNbdGhpcy5wb3NJbkxpc3RdO1xyXG4gICAgICBsZXQgYXZhaWxWZXJzaW9uQ250ID0gY1Jmcy5sZW5ndGg7XHJcbiAgICAgIGZvciAobGV0IGNSZiBvZiBjUmZzKSB7XHJcbiAgICAgICAgaWYoY1JmLnZlcnNpb24gIT1udWxsKSB7XHJcbiAgICAgICAgICBpZiAoY1JmLnZlcnNpb24gPT09IHZlcnNpb24pIHtcclxuICAgICAgICAgICAgdG9SZklkID0gY1JmLnJlY29yZGluZ0ZpbGVJZDtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAodG9SZklkICE9IG51bGwpIHtcclxuICAgICAgdGhpcy5uYXZpZ2F0ZVRvSWQodG9SZklkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBwcmV2RmlsZSgpIHtcclxuICAgIGlmKHRoaXMucG9zSW5MaXN0IT1udWxsKSB7XHJcbiAgICAgIHRoaXMucG9zSW5MaXN0LS07XHJcbiAgICB9XHJcbiAgICB0aGlzLm5hdmlnYXRlVG9SZWNvcmRpbmdGaWxlKClcclxuICB9XHJcbiAgbmV4dEZpbGUoKSB7XHJcbiAgICBpZih0aGlzLnBvc0luTGlzdCE9bnVsbCkge1xyXG4gICAgICB0aGlzLnBvc0luTGlzdCsrO1xyXG4gICAgfVxyXG4gICAgdGhpcy5uYXZpZ2F0ZVRvUmVjb3JkaW5nRmlsZSgpXHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBvc2l0aW9uSW5MaXN0KCk6bnVtYmVyIHwgbnVsbHtcclxuICAgIGlmICh0aGlzLmF2YWlsUmVjRmlsZXMgJiYgdGhpcy5yZWNvcmRpbmdGaWxlKSB7XHJcbiAgICAgIGxldCBjaWM9dGhpcy5yZWNvcmRpbmdGaWxlLml0ZW1Db2RlO1xyXG4gICAgICBpZighY2ljICYmIHRoaXMucmVjb3JkaW5nRmlsZS5yZWNvcmRpbmcgJiYgdGhpcy5yZWNvcmRpbmdGaWxlLnJlY29yZGluZy5pdGVtY29kZSl7XHJcbiAgICAgICAgY2ljPXRoaXMucmVjb3JkaW5nRmlsZS5yZWNvcmRpbmcuaXRlbWNvZGU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNpYykge1xyXG4gICAgICAgIGxldCBpdGVtQ250ID0gdGhpcy5hdmFpbFJlY0ZpbGVzLmxlbmd0aFxyXG4gICAgICAgIGZvciAobGV0IHJmZGkgPSAwOyByZmRpIDwgaXRlbUNudDsgcmZkaSsrKSB7XHJcbiAgICAgICAgICBsZXQgYXJSZiA9IHRoaXMuYXZhaWxSZWNGaWxlc1tyZmRpXVswXTtcclxuICAgICAgICAgIGlmIChhclJmLnJlY29yZGluZykge1xyXG4gICAgICAgICAgICBsZXQgYXIgPSBhclJmLnJlY29yZGluZztcclxuICAgICAgICAgICAgaWYgKGNpYyA9PT0gYXIuaXRlbWNvZGUpIHtcclxuICAgICAgICAgICAgICByZXR1cm4gcmZkaTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgbGV0IGl0ZW1DbnQgPSB0aGlzLmF2YWlsUmVjRmlsZXMubGVuZ3RoXHJcbiAgICAgICAgZm9yIChsZXQgcmZkaSA9IDA7IHJmZGkgPCBpdGVtQ250OyByZmRpKyspIHtcclxuICAgICAgICAgIGxldCBhclJmID0gdGhpcy5hdmFpbFJlY0ZpbGVzW3JmZGldWzBdO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5yZWNvcmRpbmdGaWxlLnV1aWQgPT09IGFyUmYudXVpZCkge1xyXG4gICAgICAgICAgICAgIHJldHVybiByZmRpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVQb3MoKXtcclxuICAgIHRoaXMucG9zSW5MaXN0PXRoaXMucG9zaXRpb25Jbkxpc3QoKTtcclxuICAgIHRoaXMudG9WZXJzaW9uQWN0aW9uLmRpc2FibGVkPXRydWU7XHJcbiAgICBpZih0aGlzLmF2YWlsUmVjRmlsZXMpe1xyXG4gICAgICBsZXQgYXZSZnNMZW49dGhpcy5hdmFpbFJlY0ZpbGVzLmxlbmd0aDtcclxuICAgICAgaWYodGhpcy5wb3NJbkxpc3QgIT1udWxsICYmIGF2UmZzTGVuPnRoaXMucG9zSW5MaXN0KSB7XHJcbiAgICAgICAgbGV0IGFyZnMgPSB0aGlzLmF2YWlsUmVjRmlsZXNbdGhpcy5wb3NJbkxpc3RdO1xyXG4gICAgICAgIGlmIChhcmZzKSB7XHJcbiAgICAgICAgICB0aGlzLnZlcnNpb25zID0gbmV3IEFycmF5PG51bWJlcj4oKTtcclxuICAgICAgICAgIGZvciAobGV0IGFyZiBvZiBhcmZzKSB7XHJcbiAgICAgICAgICAgIGlmKGFyZi5yZWNvcmRpbmc/Lml0ZW1jb2RlKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy52ZXJzaW9ucy5wdXNoKGFyZi52ZXJzaW9uKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy50b1ZlcnNpb25BY3Rpb24uZGlzYWJsZWQ9KHRoaXMudmVyc2lvbnMubGVuZ3RoPDIpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmKHRoaXMucmVjb3JkaW5nRmlsZSl7XHJcbiAgICAgIGlmKHRoaXMucmVjb3JkaW5nRmlsZS52ZXJzaW9uKXtcclxuICAgICAgICB0aGlzLnJlY29yZGluZ0ZpbGVWZXJzaW9uPXRoaXMucmVjb3JkaW5nRmlsZS52ZXJzaW9uO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICB0aGlzLnJlY29yZGluZ0ZpbGVWZXJzaW9uPTA7XHJcbiAgICAgIH1cclxuICAgIH1lbHNle1xyXG4gICAgICB0aGlzLnJlY29yZGluZ0ZpbGVWZXJzaW9uPW51bGw7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZUFjdGlvbnMoKVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGxvYWRSZWNGaWxlKHJmSWQ6bnVtYmVyIHwgc3RyaW5nKSB7XHJcbiAgICB0aGlzLmFwPy5zdG9wKCk7XHJcbiAgICB0aGlzLmF1ZGlvQ2xpcCA9bnVsbDtcclxuICAgIHRoaXMucmVjb3JkaW5nRmlsZT1udWxsO1xyXG4gICAgdGhpcy5wb3NJbkxpc3Q9bnVsbDtcclxuICAgIHRoaXMudXBkYXRlQWN0aW9ucygpO1xyXG4gICAgICB0aGlzLmF1ZGlvRmV0Y2hpbmc9dHJ1ZTtcclxuICAgICAgdGhpcy5yZWNvcmRpbmdGaWxlU2VydmljZS5mZXRjaFNwclJlY29yZGluZ0ZpbGUoIHJmSWQpLnN1YnNjcmliZShcclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgbmV4dDogdmFsdWUgPT4ge1xyXG4gICAgICAgICAgICAgIHRoaXMuYXVkaW9GZXRjaGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gJ0F1ZGlvIGZpbGUgbG9hZGVkLic7XHJcbiAgICAgICAgICAgICAgbGV0IGNsaXAgPSBudWxsO1xyXG4gICAgICAgICAgICAgIHRoaXMucmVjb3JkaW5nRmlsZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLnJlY29yZGluZ0ZpbGUpIHtcclxuICAgICAgICAgICAgICAgIGxldCBhYiA9IHRoaXMucmVjb3JkaW5nRmlsZS5hdWRpb0RhdGFIb2xkZXI7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWIpIHtcclxuICAgICAgICAgICAgICAgICAgY2xpcCA9IG5ldyBBdWRpb0NsaXAoYWIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgbGV0IGVzZmZzciA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBlZWZmc3IgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgZXNyID0gbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICAgIGlmIChjbGlwLmF1ZGlvRGF0YUhvbGRlciAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXNyID0gYWIuc2FtcGxlUmF0ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXNyICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGVzZmZzciA9IFJlY29yZGluZ0ZpbGVVdGlsLmVkaXRTdGFydEZyYW1lRm9yU2FtcGxlUmF0ZSh0aGlzLnJlY29yZGluZ0ZpbGUsIGVzcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICBlZWZmc3IgPSBSZWNvcmRpbmdGaWxlVXRpbC5lZGl0RW5kRnJhbWVGb3JTYW1wbGVSYXRlKHRoaXMucmVjb3JkaW5nRmlsZSwgZXNyKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbDogU2VsZWN0aW9uIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVzZmZzciAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoZWVmZnNyICE9IG51bGwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsID0gbmV3IFNlbGVjdGlvbihhYi5zYW1wbGVSYXRlLCBlc2Zmc3IsIGVlZmZzcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2xldCBjaDAgPSBhYi5nZXRDaGFubmVsRGF0YSgwKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZyYW1lTGVuZ3RoID0gYWIuZnJhbWVMZW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbCA9IG5ldyBTZWxlY3Rpb24oZXNyLCBlc2Zmc3IsIGZyYW1lTGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVlZmZzciAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBzZWwgPSBuZXcgU2VsZWN0aW9uKGVzciwgMCwgZWVmZnNyKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2xpcC5zZWxlY3Rpb24gPSBzZWxcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0aGlzLmF1ZGlvQ2xpcCA9IGNsaXBcclxuICAgICAgICAgICAgICB0aGlzLmxvYWRlZFJlY2ZpbGUoKTtcclxuXHJcbiAgICAgICAgICAgIH0sIGVycm9yOmVycm9yMSA9PlxyXG4gICAgICB7XHJcbiAgICAgICAgdGhpcy5hdWRpb0ZldGNoaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zdGF0dXMgPSAnRXJyb3IgbG9hZGluZyBhdWRpbyBmaWxlISc7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBsb2FkZWRSZWNmaWxlKCkge1xyXG4gICAgaWYodGhpcy5yZWNvcmRpbmdGaWxlICYmICF0aGlzLnNlc3Npb25JZCkge1xyXG4gICAgICBsZXQgc0lkPXRoaXMucmVjb3JkaW5nRmlsZS5zZXNzaW9uXHJcbiAgICAgIGlmKCFzSWQpe1xyXG4gICAgICAgIHNJZD10aGlzLnNlc3Npb25JZEZyb21Sb3V0ZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoc0lkKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkU2Vzc2lvbihzSWQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy51cGRhdGVQb3MoKTtcclxuICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlQWN0aW9ucygpe1xyXG4gICAgbGV0IGl0ZW1DbnQ6bnVtYmVyfG51bGw9bnVsbDtcclxuICAgIGlmKHRoaXMuYXZhaWxSZWNGaWxlcykge1xyXG4gICAgICBpdGVtQ250ID0gdGhpcy5hdmFpbFJlY0ZpbGVzLmxlbmd0aDtcclxuICAgIH1cclxuICAgIHRoaXMuZmlyc3RBY3Rpb24uZGlzYWJsZWQ9KHRoaXMucG9zSW5MaXN0PT1udWxsIHx8IHRoaXMucG9zSW5MaXN0ID09IDApO1xyXG4gICAgdGhpcy5wcmV2QWN0aW9uLmRpc2FibGVkPSh0aGlzLnBvc0luTGlzdD09bnVsbCB8fCB0aGlzLnBvc0luTGlzdCA9PSAwKTtcclxuICAgIHRoaXMubmV4dEFjdGlvbi5kaXNhYmxlZD0odGhpcy5wb3NJbkxpc3Q9PW51bGwgfHwgaXRlbUNudD09bnVsbCB8fCB0aGlzLnBvc0luTGlzdCA+PSBpdGVtQ250IC0gMSk7XHJcbiAgICB0aGlzLmxhc3RBY3Rpb24uZGlzYWJsZWQ9KHRoaXMucG9zSW5MaXN0PT1udWxsIHx8IGl0ZW1DbnQ9PW51bGwgfHwgdGhpcy5wb3NJbkxpc3QgPj0gaXRlbUNudCAtIDEpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkU2Vzc2lvbihzZXNzaW9uSWQ6IHN0cmluZ3wgbnVtYmVyKSB7XHJcbiAgICAvLyBsb2FkIHNlc3Npb24gYW5kIHJlY29yZGluZyBmaWxlIG1ldGFkYXRhIG9ubHkgd2hlbiBvbiBpbml0IGFuZCB3aGVuIHNlc3Npb24gY2hhbmdlc1xyXG4gICAgaWYgKDxzdHJpbmc+c2Vzc2lvbklkICE9IDxzdHJpbmc+dGhpcy5zZXNzaW9uSWQpIHtcclxuICAgICAgLy8gdGVsbCBVSSB0aGF0IHdlIGFyZSB3b3JraW5nLi4uXHJcbiAgICAgIHRoaXMubmF2aUluZm9Mb2FkaW5nPXRydWU7XHJcbiAgICAgIHRoaXMuc2Vzc2lvblNlcnZpY2Uuc2Vzc2lvbk9ic2VydmVyKDxzdHJpbmc+c2Vzc2lvbklkKS5zdWJzY3JpYmUoKHMpID0+IHtcclxuICAgICAgICAvLyByZWNlaXZlZCBzZXNzaW9uIGRhdGFcclxuICAgICAgICB0aGlzLnNlc3Npb25JZCA9IHMuc2Vzc2lvbklkO1xyXG4gICAgICAgIC8vIGZldGNoIHJlY29yZGluZyBmaWxlIG1ldGEgZGF0YSBsaXN0XHJcbiAgICAgICAgdGhpcy5yZWNvcmRpbmdTZXJ2aWNlLnNwclJlY29yZGluZ0ZpbGVMaXN0KHMucHJvamVjdCwgcy5zZXNzaW9uSWQpLnN1YnNjcmliZSgocmZkcykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5hdmFpbFJlY0ZpbGVzID0gbmV3IEFycmF5PEFycmF5PFNwclJlY29yZGluZ0ZpbGU+PigpO1xyXG4gICAgICAgICAgLy8gYnVpbGQgc3RydWN0dXJlIGluZGV4ZWQgYnkgaXRlbWNvZGVcclxuICAgICAgICAgIGxldCBpY0lkeCA9IG5ldyBJdGVtY29kZUluZGV4KCk7XHJcbiAgICAgICAgICBmb3IgKGxldCByZmRpID0gMDsgcmZkaSA8IHJmZHMubGVuZ3RoOyByZmRpKyspIHtcclxuICAgICAgICAgICAgbGV0IHJmZCA9IHJmZHNbcmZkaV07XHJcbiAgICAgICAgICAgIGlmIChyZmQuZGF0ZSkge1xyXG4gICAgICAgICAgICAgIC8vIGNvbnZlcnQgZGF0ZSBzdHJpbmcgZm9yIGZhc3RlciBzb3J0aW5nIGxhdGVyXHJcbiAgICAgICAgICAgICAgbGV0IHJmZGQgPSBuZXcgRGF0ZShyZmQuZGF0ZSk7XHJcbiAgICAgICAgICAgICAgcmZkLl9kYXRlQXNEYXRlT2JqID0gcmZkZDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgaWMgPSByZmQuaXRlbUNvZGU7XHJcblxyXG4gICAgICAgICAgICBpZiAoIWljKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHIgPSByZmQucmVjb3JkaW5nO1xyXG4gICAgICAgICAgICAgIGlmIChyICYmIHIuaXRlbWNvZGUpIHtcclxuICAgICAgICAgICAgICAgIGljID0gci5pdGVtY29kZTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGljKSB7XHJcbiAgICAgICAgICAgICAgbGV0IGV4UmZzRm9ySWMgPSBpY0lkeFtpY107XHJcbiAgICAgICAgICAgICAgaWYgKGV4UmZzRm9ySWMgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgLy8gaXRlbWNvZGUgbm90IHlldCBzdG9yZWRcclxuICAgICAgICAgICAgICAgIGxldCBhcmZkID0gbmV3IEFycmF5PFNwclJlY29yZGluZ0ZpbGU+KCk7XHJcbiAgICAgICAgICAgICAgICBhcmZkLnB1c2gocmZkKTtcclxuICAgICAgICAgICAgICAgIGljSWR4W2ljXSA9IGFyZmQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmF2YWlsUmVjRmlsZXMucHVzaChhcmZkKTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gcmVjIGZpbGUgd2l0aCBpdGVtY29kZSBhbHJlYWR5IGV4aXN0cywgYWRkIChwdXNoKSB0aGlzIHZlcnNpb24gLi4uXHJcbiAgICAgICAgICAgICAgICBleFJmc0ZvckljLnB1c2gocmZkKTtcclxuICAgICAgICAgICAgICAgIC8vIC4uLiBhbmQgc29ydCBsYXRlc3QgdmVyc2lvbiAoaGlnaGVzdCB2ZXJzaW9uIG51bWJlcikgdG8gbG93ZXN0IGluZGV4XHJcbiAgICAgICAgICAgICAgICBleFJmc0ZvckljLnNvcnQoKHJmZDEsIHJmZDIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuIHJmZDIudmVyc2lvbiAtIHJmZDEudmVyc2lvbjtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBsZXQgYXJmZCA9IG5ldyBBcnJheTxTcHJSZWNvcmRpbmdGaWxlPigpO1xyXG4gICAgICAgICAgICAgIGFyZmQucHVzaChyZmQpO1xyXG4gICAgICAgICAgICAgIHRoaXMuYXZhaWxSZWNGaWxlcy5wdXNoKGFyZmQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICAvLyBoYXZlIHVuc29ydGVkIGl0ZW1jb2RlIGluZGV4ZWQgcmVjb3JkaW5nIGZpbGVzIGhlcmVcclxuICAgICAgICAgIC8vIHNvcnQgdGhlbSBvcmRlcmVkIGJ5IGRhdGUgb2YgbGF0ZXN0IHZlcnNpb24gYXNjZW5kaW5nXHJcbiAgICAgICAgICB0aGlzLmF2YWlsUmVjRmlsZXMuc29ydCgocmZzMSwgcmZzMikgPT4ge1xyXG4gICAgICAgICAgICBsZXQgZDEgPSByZnMyWzBdLl9kYXRlQXNEYXRlT2JqO1xyXG4gICAgICAgICAgICBsZXQgZDIgPSByZnMxWzBdLl9kYXRlQXNEYXRlT2JqO1xyXG4gICAgICAgICAgICBpZiAoZDEgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIGlmIChkMiA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gU29ydCBlbnRyaWVzIHdob3NlIGRhdGVzIGFyZSBub3Qgc2V0IHRvIHRoZSBlbmRcclxuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgaWYgKGQyID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIC8vIFNvcnQgZW50cmllcyB3aG9zZSBkYXRlcyBhcmUgbm90IHNldCB0byB0aGUgZW5kXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gQ29tcGFyZSBkYXRlIGJ5IHRpbWUgaW4gbWlsbGlzZWNvbmRzIHZhbHVlXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZDIuZ2V0VGltZSgpIC0gZDEuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgICBmb3IobGV0IGF2UmYgb2YgdGhpcy5hdmFpbFJlY0ZpbGVzKXtcclxuICAgICAgICAgICAgICBpZihhdlJmWzBdICYmIGF2UmZbMF0ucmVjb3JkaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgb3MgPSBhdlJmWzBdLnJlY29yZGluZy5pdGVtY29kZSArICc6IHZlcnNpb25zOiAnO1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYXZSZlYgb2YgYXZSZikge1xyXG4gICAgICAgICAgICAgICAgICBvcyArPSBhdlJmVi52ZXJzaW9uICsgJy8nO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKG9zKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZVBvcygpXHJcbiAgICAgICAgICB0aGlzLm5hdmlJbmZvTG9hZGluZz1mYWxzZTtcclxuICAgICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICAgIH1cclxuICB9XHJcbn1cclxuXHJcbiJdfQ==
@@ -6,6 +6,7 @@ import { UUID } from "../../../utils/utils";
6
6
  import { RecordingFileUtils } from "../../recording";
7
7
  import { AudioBufferSource, AudioDataHolder } from "../../../audio/audio_data_holder";
8
8
  import { BasicRecordingService } from "../../recordings/basic_recording.service";
9
+ import { AudioContextProvider } from "../../../audio/context";
9
10
  import * as i0 from "@angular/core";
10
11
  import * as i1 from "@angular/common/http";
11
12
  import * as i2 from "../../../spr.config";
@@ -71,14 +72,13 @@ export class RecordingFileService extends BasicRecordingService {
71
72
  });
72
73
  }
73
74
  // TODO test
74
- fetchAndApplyRecordingFile(aCtx, recordingFile) {
75
+ fetchAndApplyRecordingFile(recordingFile) {
75
76
  let wobs = new Observable(observer => {
76
77
  if (recordingFile.recordingFileId) {
77
78
  let obs = this.fetchAudiofile(recordingFile.recordingFileId);
78
79
  obs.subscribe({ next: resp => {
79
- // Do not use Promise version, which does not work with Safari 13
80
80
  if (resp.body) {
81
- aCtx.decodeAudioData(resp.body, ab => {
81
+ AudioContextProvider.decodeAudioData(resp.body).then(ab => {
82
82
  let as = new AudioBufferSource(ab);
83
83
  RecordingFileUtils.setAudioData(recordingFile, new AudioDataHolder(as));
84
84
  if (this.debugDelay > 0) {
@@ -91,7 +91,7 @@ export class RecordingFileService extends BasicRecordingService {
91
91
  observer.next(recordingFile);
92
92
  observer.complete();
93
93
  }
94
- });
94
+ }).catch(reason => { observer.error(reason); });
95
95
  }
96
96
  else {
97
97
  observer.error('Received no audio data!');
@@ -131,7 +131,7 @@ export class RecordingFileService extends BasicRecordingService {
131
131
  next: resp => {
132
132
  // Do not use Promise version, which does not work with Safari 13
133
133
  if (resp.body) {
134
- aCtx.decodeAudioData(resp.body, ab => {
134
+ AudioContextProvider.decodeAudioData(resp.body).then(ab => {
135
135
  if (rf) {
136
136
  let as = new AudioBufferSource(ab);
137
137
  RecordingFileUtils.setAudioData(rf, new AudioDataHolder(as));
@@ -149,7 +149,7 @@ export class RecordingFileService extends BasicRecordingService {
149
149
  observer.next(rf);
150
150
  observer.complete();
151
151
  }
152
- });
152
+ }).catch(reason => { observer.error(reason); });
153
153
  }
154
154
  else {
155
155
  observer.error('Received no audio data');
@@ -173,7 +173,7 @@ export class RecordingFileService extends BasicRecordingService {
173
173
  });
174
174
  return wobs;
175
175
  }
176
- fetchSprRecordingFile(aCtx, recordingFileId) {
176
+ fetchSprRecordingFile(recordingFileId) {
177
177
  let wobs = new Observable(observer => {
178
178
  let rf = null;
179
179
  let rfDescrObs = this.sprRecordingFileDescrObserver(recordingFileId);
@@ -190,7 +190,7 @@ export class RecordingFileService extends BasicRecordingService {
190
190
  // TODO use download storage type depending on sample count of file
191
191
  if (rf && rf.samplerate && sampleCnt != null && sampleCnt > this._maxAutoNetMemStoreSamples) {
192
192
  const baseUrl = this.recoFileUrl(recordingFileId);
193
- const obNetAb = this.chunkAudioRequestToNetAudioBuffer(aCtx, baseUrl, 0, rf?.samplerate, BasicRecordingService.DEFAULT_CHUNKED_DOWNLOAD_SECONDS, rf.frames);
193
+ const obNetAb = this.chunkAudioRequestToNetAudioBuffer(baseUrl, 0, rf?.samplerate, BasicRecordingService.DEFAULT_CHUNKED_DOWNLOAD_SECONDS, rf.frames);
194
194
  obNetAb.subscribe({
195
195
  next: (nab) => {
196
196
  let adh = new AudioDataHolder(nab);
@@ -221,7 +221,7 @@ export class RecordingFileService extends BasicRecordingService {
221
221
  rfAudioObs.subscribe({ next: resp => {
222
222
  // Do not use Promise version, which does not work with Safari 13
223
223
  if (resp.body) {
224
- aCtx.decodeAudioData(resp.body, ab => {
224
+ AudioContextProvider.decodeAudioData(resp.body).then(ab => {
225
225
  if (rf) {
226
226
  let as = new AudioBufferSource(ab);
227
227
  let adh = new AudioDataHolder(as);
@@ -240,7 +240,7 @@ export class RecordingFileService extends BasicRecordingService {
240
240
  observer.next(rf);
241
241
  observer.complete();
242
242
  }
243
- });
243
+ }).catch(reason => { observer.error(reason); });
244
244
  }
245
245
  else {
246
246
  observer.error('Received no audio data');
@@ -285,4 +285,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImpo
285
285
  type: Inject,
286
286
  args: [SPEECHRECORDER_CONFIG]
287
287
  }] }]; } });
288
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5nZmlsZS1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL3NwZWVjaHJlY29yZGVyL3Nlc3Npb24vcmVjb3JkaW5nZmlsZS9yZWNvcmRpbmdmaWxlLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFnQyxXQUFXLEVBQWUsTUFBTSxzQkFBc0IsQ0FBQztBQUc5RixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBR2hDLE9BQU8sRUFBQyxPQUFPLEVBQUUscUJBQXFCLEVBQXVCLE1BQU0scUJBQXFCLENBQUM7QUFDekYsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzFDLE9BQU8sRUFBZ0Isa0JBQWtCLEVBQW1CLE1BQU0saUJBQWlCLENBQUM7QUFDcEYsT0FBTyxFQUFDLGlCQUFpQixFQUFFLGVBQWUsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQ3BGLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDBDQUEwQyxDQUFDOzs7O0FBSS9FLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxxQkFBcUI7SUFPN0QsWUFBc0IsSUFBZ0IsRUFBMkMsTUFBNkI7UUFDMUcsS0FBSyxDQUFDLElBQUksRUFBQyxNQUFNLENBQUMsQ0FBQztRQURELFNBQUksR0FBSixJQUFJLENBQVk7UUFBMkMsV0FBTSxHQUFOLE1BQU0sQ0FBdUI7UUFIOUcsa0NBQWtDO1FBQzFCLGVBQVUsR0FBUSxDQUFDLENBQUM7SUFJNUIsQ0FBQztJQUVPLFdBQVcsQ0FBQyxlQUFnQztRQUNsRCxJQUFJLFlBQVksR0FBQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNyRCxJQUFJLE1BQU0sR0FBRyxJ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QXdCO1FBQy9ILElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxXQUFXLEdBQUcsb0JBQW9CLENBQUMsZ0JBQWdCLEdBQUcsR0FBRyxHQUFHLGVBQWUsQ0FBQztRQUM5RixJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEtBQUssT0FBTyxDQUFDLEtBQUssRUFBRTtZQUN4RCwyQkFBMkI7WUFDM0IsMkVBQTJFO1lBQzNFLE1BQU0sR0FBRyxNQUFNLEdBQUcsb0JBQW9CLEdBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ3hEO1FBQ0QsMENBQTBDO1FBQzFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQW1CLE1BQU0sRUFBQyxFQUFDLGNBQWMsRUFBQyxjQUFjLEVBQUMsY0FBYyxFQUFDLGNBQWMsRUFBQyxZQUFZLEVBQUMsWUFBWSxFQUFDLEVBQUMsRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUM7SUFDckwsQ0FBQzs7QUEzUnNCLHFDQUFnQixHQUFHLGVBQWUsQ0FBQTtrSEFGOUMsb0JBQW9CLDRDQU9pQixxQkFBcUI7c0hBUDFELG9CQUFvQjs0RkFBcEIsb0JBQW9CO2tCQURoQyxVQUFVOzswQkFRZ0MsTUFBTTsyQkFBQyxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7SHR0cENsaWVudCwgSHR0cEVycm9yUmVzcG9uc2UsIEh0dHBIZWFkZXJzLCBIdHRwUmVzcG9uc2V9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5cclxuXHJcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSBcInJ4anNcIjtcclxuXHJcblxyXG5pbXBvcnQge0FwaVR5cGUsIFNQRUVDSFJFQ09SREVSX0NPTkZJRywgU3BlZWNoUmVjb3JkZXJDb25maWd9IGZyb20gXCIuLi8uLi8uLi9zcHIuY29uZmlnXCI7XHJcbmltcG9ydCB7VVVJRH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3V0aWxzXCI7XHJcbmltcG9ydCB7UmVjb3JkaW5nRmlsZSwgUmVjb3JkaW5nRmlsZVV0aWxzLCBTcHJSZWNvcmRpbmdGaWxlfSBmcm9tIFwiLi4vLi4vcmVjb3JkaW5nXCI7XHJcbmltcG9ydCB7QXVkaW9CdWZmZXJTb3VyY2UsIEF1ZGlvRGF0YUhvbGRlcn0gZnJvbSBcIi4uLy4uLy4uL2F1ZGlvL2F1ZGlvX2RhdGFfaG9sZGVyXCI7XHJcbmltcG9ydCB7QmFzaWNSZWNvcmRpbmdTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vcmVjb3JkaW5ncy9iYXNpY19yZWNvcmRpbmcuc2VydmljZVwiO1xyXG5cclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIFJlY29yZGluZ0ZpbGVTZXJ2aWNlIGV4dGVuZHMgQmFzaWNSZWNvcmRpbmdTZXJ2aWNle1xyXG5cclxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJFQ09GSUxFX0FQSV9DVFggPSAncmVjb3JkaW5nZmlsZSdcclxuXHJcbiAgLy9wcml2YXRlIGRlYnVnRGVsYXk6bnVtYmVyPTEwMDAwO1xyXG4gIHByaXZhdGUgZGVidWdEZWxheTpudW1iZXI9MDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGh0dHA6IEh0dHBDbGllbnQsIEBJbmplY3QoU1BFRUNIUkVDT1JERVJfQ09ORklHKSBwcm90ZWN0ZWQgY29uZmlnPzogU3BlZWNoUmVjb3JkZXJDb25maWcpIHtcclxuICAgICAgc3VwZXIoaHR0cCxjb25maWcpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWNvRmlsZVVybChyZWNvcmRpbmdGaWxlSWQ6IHN0cmluZyB8IG51bWJlcik6c3RyaW5ne1xyXG4gICAgbGV0IGVuY1JlY2ZpbGVJZD1lbmNvZGVVUklDb21wb25lbnQocmVjb3JkaW5nRmlsZUlkKTtcclxuICAgIGxldCByZWNVcmwgPSB0aGlzLmFwaUVuZFBvaW50ICsgUmVjb3JkaW5nRmlsZVNlcnZpY2UuUkVDT0ZJTEVfQVBJX0NUWCArICcvJyArIGVuY1JlY2ZpbGVJZDtcclxuXHJcbiAgICByZXR1cm4gcmVjVXJsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmZXRjaEF1ZGlvZmlsZShyZWNvcmRpbmdGaWxlSWQ6IHN0cmluZyB8IG51bWJlcik6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEFycmF5QnVmZmVyPj4ge1xyXG4gICAgbGV0IHJlY1VybCA9IHRoaXMucmVjb0ZpbGVVcmwocmVjb3JkaW5nRmlsZUlkKTtcclxuICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5hcGlUeXBlID09PSBBcGlUeXBlLkZJTEVTKSB7XHJcbiAgICAgIC8vIGZvciBkZXZlbG9wbWVudCBhbmQgZGVtb1xyXG4gICAgICAvLyBhcHBlbmQgVVVJRCB0byBtYWtlIHJlcXVlc3QgVVJMIHVuaXF1ZSB0byBhdm9pZCBsb2NhbGhvc3Qgc2VydmVyIGNhY2hpbmdcclxuICAgICAgcmVjVXJsID0gcmVjVXJsICsgJy53YXYnO1xyXG4gICAgfVxyXG4gICAgbGV0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoe1xyXG4gICAgICAnQWNjZXB0JzogJ2F1ZGlvL3dhdidcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHJlY1VybCwge1xyXG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnLFxyXG4gICAgICBoZWFkZXJzOiBoZWFkZXJzLFxyXG4gICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcicsXHJcbiAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy53aXRoQ3JlZGVudGlhbHNcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWNvcmRpbmdGaWxlRGVzY3JPYnNlcnZlcihyZWNvcmRpbmdGaWxlSWQ6IHN0cmluZyB8IG51bWJlcik6IE9ic2VydmFibGU8UmVjb3JkaW5nRmlsZT4ge1xyXG5cclxuICAgIGxldCByZWNVcmwgPSB0aGlzLnJlY29GaWxlVXJsKHJlY29yZGluZ0ZpbGVJZCk7XHJcbiAgICBpZiAodGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcuYXBpVHlwZSA9PT0gQXBpVHlwZS5GSUxFUykge1xyXG4gICAgICAvLyBmb3IgZGV2ZWxvcG1lbnQgYW5kIGRlbW9cclxuICAgICAgLy8gYXBwZW5kIFVVSUQgdG8gbWFrZSByZXF1ZXN0IFVSTCB1bmlxdWUgdG8gYXZvaWQgbG9jYWxob3N0IHNlcnZlciBjYWNoaW5nXHJcbiAgICAgIHJlY1VybCA9IHJlY1VybCArICcuanNvbj9yZXF1ZXN0VVVJRD0nK1VVSUQuZ2VuZXJhdGUoKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFJlY29yZGluZ0ZpbGU+KHJlY1VybCx7IHdpdGhDcmVkZW50aWFsczogdGhpcy53aXRoQ3JlZGVudGlhbHMgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNwclJlY29yZGluZ0ZpbGVEZXNjck9ic2VydmVyKHJlY29yZGluZ0ZpbGVJZDogc3RyaW5nIHwgbnVtYmVyKTogT2JzZXJ2YWJsZTxTcHJSZWNvcmRpbmdGaWxlPiB7XHJcblxyXG4gICAgbGV0IHJlY1VybCA9IHRoaXMucmVjb0ZpbGVVcmwocmVjb3JkaW5nRmlsZUlkKTtcclxuICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5hcGlUeXBlID09PSBBcGlUeXBlLkZJTEVTKSB7XHJcbiAgICAgIC8vIGZvciBkZXZlbG9wbWVudCBhbmQgZGVtb1xyXG4gICAgICAvLyBhcHBlbmQgVVVJRCB0byBtYWtlIHJlcXVlc3QgVVJMIHVuaXF1ZSB0byBhdm9pZCBsb2NhbGhvc3Qgc2VydmVyIGNhY2hpbmdcclxuICAgICAgcmVjVXJsID0gcmVjVXJsICsgJy5qc29uP3JlcXVlc3RVVUlEPScrVVVJRC5nZW5lcmF0ZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8U3ByUmVjb3JkaW5nRmlsZT4ocmVjVXJsLHsgd2l0aENyZWRlbnRpYWxzOiB0aGlzLndpdGhDcmVkZW50aWFscyB9KTtcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIGZldGNoU2Vzc2lvbkF1ZGlvZmlsZUJ5SWQocHJvamVjdE5hbWU6IHN0cmluZywgc2Vzc0lkOiBzdHJpbmcgfCBudW1iZXIsIHJlY29yZGluZ0ZpbGVJZDogc3RyaW5nIHwgbnVtYmVyKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXJyYXlCdWZmZXI+PiB7XHJcblxyXG4gICAgbGV0IHJlY1VybCA9IHRoaXMucmVjb0ZpbGVVcmwocmVjb3JkaW5nRmlsZUlkKTtcclxuICAgIC8vIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5hcGlUeXBlID09PSBBcGlUeXBlLkZJTEVTKSB7XHJcbiAgICAvLyAgIC8vIGZvciBkZXZlbG9wbWVudCBhbmQgZGVtb1xyXG4gICAgLy8gICAvLyBhcHBlbmQgVVVJRCB0byBtYWtlIHJlcXVlc3QgVVJMIHVuaXF1ZSB0byBhdm9pZCBsb2NhbGhvc3Qgc2VydmVyIGNhY2hpbmdcclxuICAgIC8vICAgcmVjVXJsID0gcmVjVXJsICsgJy53YXY/cmVxdWVzdFVVSUQ9JyArIFVVSUQuZ2VuZXJhdGUoKTtcclxuICAgIC8vIH1cclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHJlY1VybCwge1xyXG4gICAgICBvYnNlcnZlOiAncmVzcG9uc2UnLFxyXG4gICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcicsXHJcbiAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy53aXRoQ3JlZGVudGlhbHNcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vIFRPRE8gdGVzdFxyXG5cclxuICBmZXRjaEFuZEFwcGx5UmVjb3JkaW5nRmlsZShhQ3R4OiBBdWRpb0NvbnRleHQsIHJlY29yZGluZ0ZpbGU6U3ByUmVjb3JkaW5nRmlsZSk6T2JzZXJ2YWJsZTxTcHJSZWNvcmRpbmdGaWxlfG51bGw+IHtcclxuXHJcbiAgICBsZXQgd29icyA9IG5ldyBPYnNlcnZhYmxlPFNwclJlY29yZGluZ0ZpbGV8bnVsbD4ob2JzZXJ2ZXI9PntcclxuICAgICAgaWYocmVjb3JkaW5nRmlsZS5yZWNvcmRpbmdGaWxlSWQpIHtcclxuICAgICAgICBsZXQgb2JzID0gdGhpcy5mZXRjaEF1ZGlvZmlsZShyZWNvcmRpbmdGaWxlLnJlY29yZGluZ0ZpbGVJZCk7XHJcblxyXG4gICAgICAgIG9icy5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgIHtuZXh0OnJlc3AgPT4ge1xyXG4gICAgICAgICAgICAgIC8vIERvIG5vdCB1c2UgUHJvbWlzZSB2ZXJzaW9uLCB3aGljaCBkb2VzIG5vdCB3b3JrIHdpdGggU2FmYXJpIDEzXHJcbiAgICAgICAgICAgICAgaWYocmVzcC5ib2R5KSB7XHJcbiAgICAgICAgICAgICAgICBhQ3R4LmRlY29kZUF1ZGlvRGF0YShyZXNwLmJvZHksIGFiID0+IHtcclxuICAgICAgICAgICAgICAgICAgbGV0IGFzPW5ldyBBdWRpb0J1ZmZlclNvdXJjZShhYik7XHJcbiAgICAgICAgICAgICAgICAgIFJlY29yZGluZ0ZpbGVVdGlscy5zZXRBdWRpb0RhdGEocmVjb3JkaW5nRmlsZSxuZXcgQXVkaW9EYXRhSG9sZGVyKGFzKSk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnRGVsYXkgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmVjb3JkaW5nRmlsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuZGVidWdEZWxheSk7XHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChyZWNvcmRpbmdGaWxlKTtcclxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoJ1JlY2VpdmVkIG5vIGF1ZGlvIGRhdGEhJyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvcjooZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSA0MDQpIHtcclxuICAgICAgICAgICAgICAgIC8vIEludGVycHJldCBub3QgYXMgYW4gZXJyb3IsIHRoZSBmaWxlIGlzdCBub3QgcmVjb3JkZWQgeWV0XHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KG51bGwpO1xyXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBhbGwgb3RoZXIgc3RhdGVzIGFyZSBlcnJvcnNcclxuICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBvYnNlcnZlci5lcnJvcigpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gd29icztcclxuICB9XHJcblxyXG4gIGZldGNoUmVjb3JkaW5nRmlsZShhQ3R4OiBBdWRpb0NvbnRleHQsIHJlY29yZGluZ0ZpbGVJZDogc3RyaW5nIHwgbnVtYmVyKTogT2JzZXJ2YWJsZTxSZWNvcmRpbmdGaWxlIHwgbnVsbD4ge1xyXG5cclxuICAgIGxldCB3b2JzID0gbmV3IE9ic2VydmFibGU8UmVjb3JkaW5nRmlsZSB8IG51bGw+KG9ic2VydmVyID0+IHtcclxuICAgICAgbGV0IHJmOiBSZWNvcmRpbmdGaWxlfG51bGwgPSBudWxsO1xyXG4gICAgICBsZXQgcmZEZXNjck9icyA9IHRoaXMucmVjb3JkaW5nRmlsZURlc2NyT2JzZXJ2ZXIocmVjb3JkaW5nRmlsZUlkKTtcclxuICAgICAgcmZEZXNjck9icy5zdWJzY3JpYmUoXHJcbiAgICAgICAgICB7bmV4dDp2YWx1ZSA9PiB7XHJcbiAgICAgICAgcmYgPSB2YWx1ZTtcclxuICAgICAgfSwgZXJyb3I6KGVycm9yKSA9PiB7XHJcbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyb3IpO1xyXG4gICAgICB9LCBjb21wbGV0ZTooKSA9PiB7XHJcbiAgICAgICAgbGV0IHJmQXVkaW9PYnMgPSB0aGlzLmZldGNoQXVkaW9maWxlKHJlY29yZGluZ0ZpbGVJZCk7XHJcbiAgICAgICAgcmZBdWRpb09icy5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogcmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vIERvIG5vdCB1c2UgUHJvbWlzZSB2ZXJzaW9uLCB3aGljaCBkb2VzIG5vdCB3b3JrIHdpdGggU2FmYXJpIDEzXHJcbiAgICAgICAgICAgIGlmIChyZXNwLmJvZHkpIHtcclxuICAgICAgICAgICAgICBhQ3R4LmRlY29kZUF1ZGlvRGF0YShyZXNwLmJvZHksIGFiID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChyZikge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgYXMgPSBuZXcgQXVkaW9CdWZmZXJTb3VyY2UoYWIpO1xyXG4gICAgICAgICAgICAgICAgICBSZWNvcmRpbmdGaWxlVXRpbHMuc2V0QXVkaW9EYXRhKHJmLCBuZXcgQXVkaW9EYXRhSG9sZGVyKGFzKSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcignUmVjb3JkaW5nIGZpbGUgb2JqZWN0IG51bGwnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnRGVsYXkgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHJmKTtcclxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICB9LCB0aGlzLmRlYnVnRGVsYXkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChyZik7XHJcbiAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcignUmVjZWl2ZWQgbm8gYXVkaW8gZGF0YScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSA0MDQpIHtcclxuICAgICAgICAgICAgICAvLyBJbnRlcnByZXQgbm90IGFzIGFuIGVycm9yLCB0aGUgZmlsZSBpc3Qgbm90IHJlY29yZGVkIHlldFxyXG4gICAgICAgICAgICAgIG9ic2VydmVyLm5leHQobnVsbCk7XHJcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vIGFsbCBvdGhlciBzdGF0ZXMgYXJlIGVycm9yc1xyXG4gICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiB3b2JzO1xyXG4gIH1cclxuXHJcbiAgZmV0Y2hTcHJSZWNvcmRpbmdGaWxlKGFDdHg6IEF1ZGlvQ29udGV4dCwgcmVjb3JkaW5nRmlsZUlkOiBzdHJpbmcgfCBudW1iZXIpOiBPYnNlcnZhYmxlPFNwclJlY29yZGluZ0ZpbGUgfCBudWxsPiB7XHJcblxyXG4gICAgbGV0IHdvYnMgPSBuZXcgT2JzZXJ2YWJsZTxTcHJSZWNvcmRpbmdGaWxlIHwgbnVsbD4ob2JzZXJ2ZXIgPT4ge1xyXG4gICAgICBsZXQgcmY6IFNwclJlY29yZGluZ0ZpbGV8bnVsbCA9IG51bGw7XHJcbiAgICAgIGxldCByZkRlc2NyT2JzID0gdGhpcy5zcHJSZWNvcmRpbmdGaWxlRGVzY3JPYnNlcnZlcihyZWNvcmRpbmdGaWxlSWQpO1xyXG4gICAgICByZkRlc2NyT2JzLnN1YnNjcmliZSh7bmV4dDp2YWx1ZSA9PiB7XHJcbiAgICAgICAgcmYgPSB2YWx1ZTtcclxuICAgICAgfVxyXG4gICAgLCBlcnJvcjooZXJyb3IpID0+IHtcclxuICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XHJcbiAgICAgIH0sIGNvbXBsZXRlOigpID0+IHtcclxuICAgICAgICBsZXQgc2FtcGxlQ250OiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgICAgICBpZiAocmYgJiYgcmYuY2hhbm5lbHMgJiYgcmYuZnJhbWVzKSB7XHJcbiAgICAgICAgICBzYW1wbGVDbnQgPSByZi5jaGFubmVscyAqIHJmLmZyYW1lcztcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVE9ETyB1c2UgZG93bmxvYWQgc3RvcmFnZSB0eXBlIGRlcGVuZGluZyBvbiBzYW1wbGUgY291bnQgb2YgZmlsZVxyXG4gICAgICAgIGlmIChyZiAmJiByZi5zYW1wbGVyYXRlICYmIHNhbXBsZUNudCAhPSBudWxsICYmIHNhbXBsZUNudCA+IHRoaXMuX21heEF1dG9OZXRNZW1TdG9yZVNhbXBsZXMpIHtcclxuICAgICAgICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLnJlY29GaWxlVXJsKHJlY29yZGluZ0ZpbGVJZCk7XHJcbiAgICAgICAgICBjb25zdCBvYk5ldEFiID0gdGhpcy5jaHVua0F1ZGlvUmVxdWVzdFRvTmV0QXVkaW9CdWZmZXIoYUN0eCwgYmFzZVVybCwgMCwgcmY/LnNhbXBsZXJhdGUsIEJhc2ljUmVjb3JkaW5nU2VydmljZS5ERUZBVUxUX0NIVU5LRURfRE9XTkxPQURfU0VDT05EUywgcmYuZnJhbWVzKTtcclxuICAgICAgICAgIG9iTmV0QWIuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIG5leHQ6IChuYWIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgbGV0IGFkaCA9IG5ldyBBdWRpb0RhdGFIb2xkZXIobmFiKTtcclxuICAgICAgICAgICAgICAgICAgaWYgKHJmKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgUmVjb3JkaW5nRmlsZVV0aWxzLnNldEF1ZGlvRGF0YShyZiwgYWRoKTtcclxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHJmKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IDQwNCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIEludGVycHJldCBub3QgYXMgYW4gZXJyb3IsIHRoZSBmaWxlIGlzdCBub3QgcmVjb3JkZWQgeWV0XHJcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpXHJcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gYWxsIG90aGVyIHN0YXRlcyBhcmUgZXJyb3JzXHJcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcblxyXG4gICAgICAgICAgbGV0IHJmQXVkaW9PYnMgPSB0aGlzLmZldGNoQXVkaW9maWxlKHJlY29yZGluZ0ZpbGVJZCk7XHJcbiAgICAgICAgICByZkF1ZGlvT2JzLnN1YnNjcmliZShcclxuICAgICAgICAgICAgICB7bmV4dDpyZXNwID0+XHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIC8vIERvIG5vdCB1c2UgUHJvbWlzZSB2ZXJzaW9uLCB3aGljaCBkb2VzIG5vdCB3b3JrIHdpdGggU2FmYXJpIDEzXHJcbiAgICAgICAgICAgIGlmIChyZXNwLmJvZHkpIHtcclxuICAgICAgICAgICAgICBhQ3R4LmRlY29kZUF1ZGlvRGF0YShyZXNwLmJvZHksIGFiID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChyZikge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgYXMgPSBuZXcgQXVkaW9CdWZmZXJTb3VyY2UoYWIpO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgYWRoID0gbmV3IEF1ZGlvRGF0YUhvbGRlcihhcyk7XHJcbiAgICAgICAgICAgICAgICAgIFJlY29yZGluZ0ZpbGVVdGlscy5zZXRBdWRpb0RhdGEocmYsIGFkaCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcignUmVjb3JkaW5nIGZpbGUgb2JqZWN0IG51bGwnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlYnVnRGVsYXkgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHJmKTtcclxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICB9LCB0aGlzLmRlYnVnRGVsYXkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChyZik7XHJcbiAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcignUmVjZWl2ZWQgbm8gYXVkaW8gZGF0YScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgLCBlcnJvcjooZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gNDA0KSB7XHJcbiAgICAgICAgICAgICAgLy8gSW50ZXJwcmV0IG5vdCBhcyBhbiBlcnJvciwgdGhlIGZpbGUgaXN0IG5vdCByZWNvcmRlZCB5ZXRcclxuICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KG51bGwpO1xyXG4gICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKClcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAvLyBhbGwgb3RoZXIgc3RhdGVzIGFyZSBlcnJvcnNcclxuICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gd29icztcclxuICB9XHJcblxyXG4gIHNhdmVFZGl0U2VsZWN0aW9uKHJlY29yZGluZ0ZpbGVJZDogc3RyaW5nIHwgbnVtYmVyLGVkaXRTYW1wbGVSYXRlOm51bWJlcnxudWxsLGVkaXRTdGFydEZyYW1lOm51bWJlcnxudWxsLGVkaXRFbmRGcmFtZTpudW1iZXJ8bnVsbCk6IE9ic2VydmFibGU8U3ByUmVjb3JkaW5nRmlsZSB8IG51bGw+IHtcclxuICAgIGxldCByZWNVcmwgPSB0aGlzLmFwaUVuZFBvaW50ICsgUmVjb3JkaW5nRmlsZVNlcnZpY2UuUkVDT0ZJTEVfQVBJX0NUWCArICcvJyArIHJlY29yZGluZ0ZpbGVJZDtcclxuICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5hcGlUeXBlID09PSBBcGlUeXBlLkZJTEVTKSB7XHJcbiAgICAgIC8vIGZvciBkZXZlbG9wbWVudCBhbmQgZGVtb1xyXG4gICAgICAvLyBhcHBlbmQgVVVJRCB0byBtYWtlIHJlcXVlc3QgVVJMIHVuaXF1ZSB0byBhdm9pZCBsb2NhbGhvc3Qgc2VydmVyIGNhY2hpbmdcclxuICAgICAgcmVjVXJsID0gcmVjVXJsICsgJy5qc29uP3JlcXVlc3RVVUlEPScrVVVJRC5nZW5lcmF0ZSgpO1xyXG4gICAgfVxyXG4gICAgLy9jb25zb2xlLmxvZyhcIlBhdGggcmVxdWVzdCBVUkw6IFwiK3JlY1VybClcclxuICAgIHJldHVybiB0aGlzLmh0dHAucGF0Y2g8U3ByUmVjb3JkaW5nRmlsZT4ocmVjVXJsLHtlZGl0U2FtcGxlUmF0ZTplZGl0U2FtcGxlUmF0ZSxlZGl0U3RhcnRGcmFtZTplZGl0U3RhcnRGcmFtZSxlZGl0RW5kRnJhbWU6ZWRpdEVuZEZyYW1lfSx7IHdpdGhDcmVkZW50aWFsczogdGhpcy53aXRoQ3JlZGVudGlhbHMgfSk7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuXHJcbiJdfQ==
288
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5nZmlsZS1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL3NwZWVjaHJlY29yZGVyL3Nlc3Npb24vcmVjb3JkaW5nZmlsZS9yZWNvcmRpbmdmaWxlLXNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFnQyxXQUFXLEVBQWUsTUFBTSxzQkFBc0IsQ0FBQztBQUc5RixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBR2hDLE9BQU8sRUFBQyxPQUFPLEVBQUUscUJBQXFCLEVBQXVCLE1BQU0scUJBQXFCLENBQUM7QUFDekYsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzFDLE9BQU8sRUFBZ0Isa0JBQWtCLEVBQW1CLE1BQU0saUJBQWlCLENBQUM7QUFDcEYsT0FBTyxFQUFDLGlCQUFpQixFQUFFLGVBQWUsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQ3BGLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBQy9FLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDOzs7O0FBSTVELE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxxQkFBcUI7SUFPN0QsWUFBc0IsSUFBZ0IsRUFBMkMsTUFBNkI7UUFDMUcsS0FBSyxDQUFDLElBQUksRUFBQyxNQUFNLENBQUMsQ0FBQztRQURELFNBQUksR0FBSixJQUFJLENBQVk7UUFBMkMsV0FBTSxHQUFOLE1BQU0sQ0FBdUI7UUFIOUcsa0NBQWtDO1FBQzFCLGVBQVUsR0FBUSxDQUFDLENBQUM7SUFJNUIsQ0FBQztJQUVPLFdBQVcsQ0FBQyxlQUFnQztRQUNsRCxJQUFJLFlBQVksR0FBQyxrQkFB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ZW50IjpbImltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtIdHRwQ2xpZW50LCBIdHRwRXJyb3JSZXNwb25zZSwgSHR0cEhlYWRlcnMsIEh0dHBSZXNwb25zZX0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcblxyXG5cclxuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tIFwicnhqc1wiO1xyXG5cclxuXHJcbmltcG9ydCB7QXBpVHlwZSwgU1BFRUNIUkVDT1JERVJfQ09ORklHLCBTcGVlY2hSZWNvcmRlckNvbmZpZ30gZnJvbSBcIi4uLy4uLy4uL3Nwci5jb25maWdcIjtcclxuaW1wb3J0IHtVVUlEfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvdXRpbHNcIjtcclxuaW1wb3J0IHtSZWNvcmRpbmdGaWxlLCBSZWNvcmRpbmdGaWxlVXRpbHMsIFNwclJlY29yZGluZ0ZpbGV9IGZyb20gXCIuLi8uLi9yZWNvcmRpbmdcIjtcclxuaW1wb3J0IHtBdWRpb0J1ZmZlclNvdXJjZSwgQXVkaW9EYXRhSG9sZGVyfSBmcm9tIFwiLi4vLi4vLi4vYXVkaW8vYXVkaW9fZGF0YV9ob2xkZXJcIjtcclxuaW1wb3J0IHtCYXNpY1JlY29yZGluZ1NlcnZpY2V9IGZyb20gXCIuLi8uLi9yZWNvcmRpbmdzL2Jhc2ljX3JlY29yZGluZy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7QXVkaW9Db250ZXh0UHJvdmlkZXJ9IGZyb20gXCIuLi8uLi8uLi9hdWRpby9jb250ZXh0XCI7XHJcblxyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgUmVjb3JkaW5nRmlsZVNlcnZpY2UgZXh0ZW5kcyBCYXNpY1JlY29yZGluZ1NlcnZpY2V7XHJcblxyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUkVDT0ZJTEVfQVBJX0NUWCA9ICdyZWNvcmRpbmdmaWxlJ1xyXG5cclxuICAvL3ByaXZhdGUgZGVidWdEZWxheTpudW1iZXI9MTAwMDA7XHJcbiAgcHJpdmF0ZSBkZWJ1Z0RlbGF5Om51bWJlcj0wO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaHR0cDogSHR0cENsaWVudCwgQEluamVjdChTUEVFQ0hSRUNPUkRFUl9DT05GSUcpIHByb3RlY3RlZCBjb25maWc/OiBTcGVlY2hSZWNvcmRlckNvbmZpZykge1xyXG4gICAgICBzdXBlcihodHRwLGNvbmZpZyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlY29GaWxlVXJsKHJlY29yZGluZ0ZpbGVJZDogc3RyaW5nIHwgbnVtYmVyKTpzdHJpbmd7XHJcbiAgICBsZXQgZW5jUmVjZmlsZUlkPWVuY29kZVVSSUNvbXBvbmVudChyZWNvcmRpbmdGaWxlSWQpO1xyXG4gICAgbGV0IHJlY1VybCA9IHRoaXMuYXBpRW5kUG9pbnQgKyBSZWNvcmRpbmdGaWxlU2VydmljZS5SRUNPRklMRV9BUElfQ1RYICsgJy8nICsgZW5jUmVjZmlsZUlkO1xyXG5cclxuICAgIHJldHVybiByZWNVcmw7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZldGNoQXVkaW9maWxlKHJlY29yZGluZ0ZpbGVJZDogc3RyaW5nIHwgbnVtYmVyKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXJyYXlCdWZmZXI+PiB7XHJcbiAgICBsZXQgcmVjVXJsID0gdGhpcy5yZWNvRmlsZVVybChyZWNvcmRpbmdGaWxlSWQpO1xyXG4gICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmFwaVR5cGUgPT09IEFwaVR5cGUuRklMRVMpIHtcclxuICAgICAgLy8gZm9yIGRldmVsb3BtZW50IGFuZCBkZW1vXHJcbiAgICAgIC8vIGFwcGVuZCBVVUlEIHRvIG1ha2UgcmVxdWVzdCBVUkwgdW5pcXVlIHRvIGF2b2lkIGxvY2FsaG9zdCBzZXJ2ZXIgY2FjaGluZ1xyXG4gICAgICByZWNVcmwgPSByZWNVcmwgKyAnLndhdic7XHJcbiAgICB9XHJcbiAgICBsZXQgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyh7XHJcbiAgICAgICdBY2NlcHQnOiAnYXVkaW8vd2F2J1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQocmVjVXJsLCB7XHJcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZScsXHJcbiAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXHJcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJyxcclxuICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLndpdGhDcmVkZW50aWFsc1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlY29yZGluZ0ZpbGVEZXNjck9ic2VydmVyKHJlY29yZGluZ0ZpbGVJZDogc3RyaW5nIHwgbnVtYmVyKTogT2JzZXJ2YWJsZTxSZWNvcmRpbmdGaWxlPiB7XHJcblxyXG4gICAgbGV0IHJlY1VybCA9IHRoaXMucmVjb0ZpbGVVcmwocmVjb3JkaW5nRmlsZUlkKTtcclxuICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5hcGlUeXBlID09PSBBcGlUeXBlLkZJTEVTKSB7XHJcbiAgICAgIC8vIGZvciBkZXZlbG9wbWVudCBhbmQgZGVtb1xyXG4gICAgICAvLyBhcHBlbmQgVVVJRCB0byBtYWtlIHJlcXVlc3QgVVJMIHVuaXF1ZSB0byBhdm9pZCBsb2NhbGhvc3Qgc2VydmVyIGNhY2hpbmdcclxuICAgICAgcmVjVXJsID0gcmVjVXJsICsgJy5qc29uP3JlcXVlc3RVVUlEPScrVVVJRC5nZW5lcmF0ZSgpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8UmVjb3JkaW5nRmlsZT4ocmVjVXJsLHsgd2l0aENyZWRlbnRpYWxzOiB0aGlzLndpdGhDcmVkZW50aWFscyB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3ByUmVjb3JkaW5nRmlsZURlc2NyT2JzZXJ2ZXIocmVjb3JkaW5nRmlsZUlkOiBzdHJpbmcgfCBudW1iZXIpOiBPYnNlcnZhYmxlPFNwclJlY29yZGluZ0ZpbGU+IHtcclxuXHJcbiAgICBsZXQgcmVjVXJsID0gdGhpcy5yZWNvRmlsZVVybChyZWNvcmRpbmdGaWxlSWQpO1xyXG4gICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmFwaVR5cGUgPT09IEFwaVR5cGUuRklMRVMpIHtcclxuICAgICAgLy8gZm9yIGRldmVsb3BtZW50IGFuZCBkZW1vXHJcbiAgICAgIC8vIGFwcGVuZCBVVUlEIHRvIG1ha2UgcmVxdWVzdCBVUkwgdW5pcXVlIHRvIGF2b2lkIGxvY2FsaG9zdCBzZXJ2ZXIgY2FjaGluZ1xyXG4gICAgICByZWNVcmwgPSByZWNVcmwgKyAnLmpzb24/cmVxdWVzdFVVSUQ9JytVVUlELmdlbmVyYXRlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxTcHJSZWNvcmRpbmdGaWxlPihyZWNVcmwseyB3aXRoQ3JlZGVudGlhbHM6IHRoaXMud2l0aENyZWRlbnRpYWxzIH0pO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgZmV0Y2hTZXNzaW9uQXVkaW9maWxlQnlJZChwcm9qZWN0TmFtZTogc3RyaW5nLCBzZXNzSWQ6IHN0cmluZyB8IG51bWJlciwgcmVjb3JkaW5nRmlsZUlkOiBzdHJpbmcgfCBudW1iZXIpOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcnJheUJ1ZmZlcj4+IHtcclxuXHJcbiAgICBsZXQgcmVjVXJsID0gdGhpcy5yZWNvRmlsZVVybChyZWNvcmRpbmdGaWxlSWQpO1xyXG4gICAgLy8gaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmFwaVR5cGUgPT09IEFwaVR5cGUuRklMRVMpIHtcclxuICAgIC8vICAgLy8gZm9yIGRldmVsb3BtZW50IGFuZCBkZW1vXHJcbiAgICAvLyAgIC8vIGFwcGVuZCBVVUlEIHRvIG1ha2UgcmVxdWVzdCBVUkwgdW5pcXVlIHRvIGF2b2lkIGxvY2FsaG9zdCBzZXJ2ZXIgY2FjaGluZ1xyXG4gICAgLy8gICByZWNVcmwgPSByZWNVcmwgKyAnLndhdj9yZXF1ZXN0VVVJRD0nICsgVVVJRC5nZW5lcmF0ZSgpO1xyXG4gICAgLy8gfVxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQocmVjVXJsLCB7XHJcbiAgICAgIG9ic2VydmU6ICdyZXNwb25zZScsXHJcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJyxcclxuICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLndpdGhDcmVkZW50aWFsc1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gVE9ETyB0ZXN0XHJcblxyXG4gIGZldGNoQW5kQXBwbHlSZWNvcmRpbmdGaWxlKHJlY29yZGluZ0ZpbGU6U3ByUmVjb3JkaW5nRmlsZSk6T2JzZXJ2YWJsZTxTcHJSZWNvcmRpbmdGaWxlfG51bGw+IHtcclxuXHJcbiAgICBsZXQgd29icyA9IG5ldyBPYnNlcnZhYmxlPFNwclJlY29yZGluZ0ZpbGV8bnVsbD4ob2JzZXJ2ZXI9PntcclxuICAgICAgaWYocmVjb3JkaW5nRmlsZS5yZWNvcmRpbmdGaWxlSWQpIHtcclxuICAgICAgICBsZXQgb2JzID0gdGhpcy5mZXRjaEF1ZGlvZmlsZShyZWNvcmRpbmdGaWxlLnJlY29yZGluZ0ZpbGVJZCk7XHJcblxyXG4gICAgICAgIG9icy5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgIHtuZXh0OnJlc3AgPT4ge1xyXG4gICAgICAgICAgICAgIGlmKHJlc3AuYm9keSkge1xyXG4gICAgICAgICAgICAgICAgQXVkaW9Db250ZXh0UHJvdmlkZXIuZGVjb2RlQXVkaW9EYXRhKHJlc3AuYm9keSkudGhlbihhYiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBhcz1uZXcgQXVkaW9CdWZmZXJTb3VyY2UoYWIpO1xyXG4gICAgICAgICAgICAgICAgICBSZWNvcmRpbmdGaWxlVXRpbHMuc2V0QXVkaW9EYXRhKHJlY29yZGluZ0ZpbGUsbmV3IEF1ZGlvRGF0YUhvbGRlcihhcykpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5kZWJ1Z0RlbGF5ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHJlY29yZGluZ0ZpbGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLmRlYnVnRGVsYXkpO1xyXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmVjb3JkaW5nRmlsZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSkuY2F0Y2gocmVhc29uPT57b2JzZXJ2ZXIuZXJyb3IocmVhc29uKX0pO1xyXG4gICAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoJ1JlY2VpdmVkIG5vIGF1ZGlvIGRhdGEhJyk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBlcnJvcjooZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSA0MDQpIHtcclxuICAgICAgICAgICAgICAgIC8vIEludGVycHJldCBub3QgYXMgYW4gZXJyb3IsIHRoZSBmaWxlIGlzdCBub3QgcmVjb3JkZWQgeWV0XHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KG51bGwpO1xyXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBhbGwgb3RoZXIgc3RhdGVzIGFyZSBlcnJvcnNcclxuICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICBvYnNlcnZlci5lcnJvcigpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gd29icztcclxuICB9XHJcblxyXG4gIGZldGNoUmVjb3JkaW5nRmlsZShhQ3R4OiBBdWRpb0NvbnRleHQsIHJlY29yZGluZ0ZpbGVJZDogc3RyaW5nIHwgbnVtYmVyKTogT2JzZXJ2YWJsZTxSZWNvcmRpbmdGaWxlIHwgbnVsbD4ge1xyXG5cclxuICAgIGxldCB3b2JzID0gbmV3IE9ic2VydmFibGU8UmVjb3JkaW5nRmlsZSB8IG51bGw+KG9ic2VydmVyID0+IHtcclxuICAgICAgbGV0IHJmOiBSZWNvcmRpbmdGaWxlfG51bGwgPSBudWxsO1xyXG4gICAgICBsZXQgcmZEZXNjck9icyA9IHRoaXMucmVjb3JkaW5nRmlsZURlc2NyT2JzZXJ2ZXIocmVjb3JkaW5nRmlsZUlkKTtcclxuICAgICAgcmZEZXNjck9icy5zdWJzY3JpYmUoXHJcbiAgICAgICAgICB7bmV4dDp2YWx1ZSA9PiB7XHJcbiAgICAgICAgcmYgPSB2YWx1ZTtcclxuICAgICAgfSwgZXJyb3I6KGVycm9yKSA9PiB7XHJcbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyb3IpO1xyXG4gICAgICB9LCBjb21wbGV0ZTooKSA9PiB7XHJcbiAgICAgICAgbGV0IHJmQXVkaW9PYnMgPSB0aGlzLmZldGNoQXVkaW9maWxlKHJlY29yZGluZ0ZpbGVJZCk7XHJcbiAgICAgICAgcmZBdWRpb09icy5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgbmV4dDogcmVzcCA9PiB7XHJcbiAgICAgICAgICAgIC8vIERvIG5vdCB1c2UgUHJvbWlzZSB2ZXJzaW9uLCB3aGljaCBkb2VzIG5vdCB3b3JrIHdpdGggU2FmYXJpIDEzXHJcbiAgICAgICAgICAgIGlmIChyZXNwLmJvZHkpIHtcclxuICAgICAgICAgICAgICBBdWRpb0NvbnRleHRQcm92aWRlci5kZWNvZGVBdWRpb0RhdGEocmVzcC5ib2R5KS50aGVuKCBhYiA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmYpIHtcclxuICAgICAgICAgICAgICAgICAgbGV0IGFzID0gbmV3IEF1ZGlvQnVmZmVyU291cmNlKGFiKTtcclxuICAgICAgICAgICAgICAgICAgUmVjb3JkaW5nRmlsZVV0aWxzLnNldEF1ZGlvRGF0YShyZiwgbmV3IEF1ZGlvRGF0YUhvbGRlcihhcykpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoJ1JlY29yZGluZyBmaWxlIG9iamVjdCBudWxsJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kZWJ1Z0RlbGF5ID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChyZik7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgICAgfSwgdGhpcy5kZWJ1Z0RlbGF5KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmYpO1xyXG4gICAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pLmNhdGNoKHJlYXNvbiA9PiB7b2JzZXJ2ZXIuZXJyb3IocmVhc29uKX0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKCdSZWNlaXZlZCBubyBhdWRpbyBkYXRhJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlcnJvcjogKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZXJyb3Iuc3RhdHVzID09IDQwNCkge1xyXG4gICAgICAgICAgICAgIC8vIEludGVycHJldCBub3QgYXMgYW4gZXJyb3IsIHRoZSBmaWxlIGlzdCBub3QgcmVjb3JkZWQgeWV0XHJcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcclxuICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgLy8gYWxsIG90aGVyIHN0YXRlcyBhcmUgZXJyb3JzXHJcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHdvYnM7XHJcbiAgfVxyXG5cclxuICBmZXRjaFNwclJlY29yZGluZ0ZpbGUoIHJlY29yZGluZ0ZpbGVJZDogc3RyaW5nIHwgbnVtYmVyKTogT2JzZXJ2YWJsZTxTcHJSZWNvcmRpbmdGaWxlIHwgbnVsbD4ge1xyXG5cclxuICAgIGxldCB3b2JzID0gbmV3IE9ic2VydmFibGU8U3ByUmVjb3JkaW5nRmlsZSB8IG51bGw+KG9ic2VydmVyID0+IHtcclxuICAgICAgbGV0IHJmOiBTcHJSZWNvcmRpbmdGaWxlfG51bGwgPSBudWxsO1xyXG4gICAgICBsZXQgcmZEZXNjck9icyA9IHRoaXMuc3ByUmVjb3JkaW5nRmlsZURlc2NyT2JzZXJ2ZXIocmVjb3JkaW5nRmlsZUlkKTtcclxuICAgICAgcmZEZXNjck9icy5zdWJzY3JpYmUoe25leHQ6dmFsdWUgPT4ge1xyXG4gICAgICAgIHJmID0gdmFsdWU7XHJcbiAgICAgIH1cclxuICAgICwgZXJyb3I6KGVycm9yKSA9PiB7XHJcbiAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyb3IpO1xyXG4gICAgICB9LCBjb21wbGV0ZTooKSA9PiB7XHJcbiAgICAgICAgbGV0IHNhbXBsZUNudDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgaWYgKHJmICYmIHJmLmNoYW5uZWxzICYmIHJmLmZyYW1lcykge1xyXG4gICAgICAgICAgc2FtcGxlQ250ID0gcmYuY2hhbm5lbHMgKiByZi5mcmFtZXM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFRPRE8gdXNlIGRvd25sb2FkIHN0b3JhZ2UgdHlwZSBkZXBlbmRpbmcgb24gc2FtcGxlIGNvdW50IG9mIGZpbGVcclxuICAgICAgICBpZiAocmYgJiYgcmYuc2FtcGxlcmF0ZSAmJiBzYW1wbGVDbnQgIT0gbnVsbCAmJiBzYW1wbGVDbnQgPiB0aGlzLl9tYXhBdXRvTmV0TWVtU3RvcmVTYW1wbGVzKSB7XHJcbiAgICAgICAgICBjb25zdCBiYXNlVXJsID0gdGhpcy5yZWNvRmlsZVVybChyZWNvcmRpbmdGaWxlSWQpO1xyXG4gICAgICAgICAgY29uc3Qgb2JOZXRBYiA9IHRoaXMuY2h1bmtBdWRpb1JlcXVlc3RUb05ldEF1ZGlvQnVmZmVyKGJhc2VVcmwsIDAsIHJmPy5zYW1wbGVyYXRlLCBCYXNpY1JlY29yZGluZ1NlcnZpY2UuREVGQVVMVF9DSFVOS0VEX0RPV05MT0FEX1NFQ09ORFMsIHJmLmZyYW1lcyk7XHJcbiAgICAgICAgICBvYk5ldEFiLnN1YnNjcmliZShcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBuZXh0OiAobmFiKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBhZGggPSBuZXcgQXVkaW9EYXRhSG9sZGVyKG5hYik7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChyZikge1xyXG4gICAgICAgICAgICAgICAgICAgIFJlY29yZGluZ0ZpbGVVdGlscy5zZXRBdWRpb0RhdGEocmYsIGFkaCk7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChyZik7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb21wbGV0ZTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgaWYgKGVycm9yLnN0YXR1cyA9PSA0MDQpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBJbnRlcnByZXQgbm90IGFzIGFuIGVycm9yLCB0aGUgZmlsZSBpc3Qgbm90IHJlY29yZGVkIHlldFxyXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKVxyXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGFsbCBvdGhlciBzdGF0ZXMgYXJlIGVycm9yc1xyXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICAgIGxldCByZkF1ZGlvT2JzID0gdGhpcy5mZXRjaEF1ZGlvZmlsZShyZWNvcmRpbmdGaWxlSWQpO1xyXG4gICAgICAgICAgcmZBdWRpb09icy5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgICAge25leHQ6cmVzcCA9PlxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICAvLyBEbyBub3QgdXNlIFByb21pc2UgdmVyc2lvbiwgd2hpY2ggZG9lcyBub3Qgd29yayB3aXRoIFNhZmFyaSAxM1xyXG4gICAgICAgICAgICBpZiAocmVzcC5ib2R5KSB7XHJcbiAgICAgICAgICAgICAgQXVkaW9Db250ZXh0UHJvdmlkZXIuZGVjb2RlQXVkaW9EYXRhKHJlc3AuYm9keSkudGhlbiggYWIgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJmKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBhcyA9IG5ldyBBdWRpb0J1ZmZlclNvdXJjZShhYik7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBhZGggPSBuZXcgQXVkaW9EYXRhSG9sZGVyKGFzKTtcclxuICAgICAgICAgICAgICAgICAgUmVjb3JkaW5nRmlsZVV0aWxzLnNldEF1ZGlvRGF0YShyZiwgYWRoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKCdSZWNvcmRpbmcgZmlsZSBvYmplY3QgbnVsbCcpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVidWdEZWxheSA+IDApIHtcclxuICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmYpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgIH0sIHRoaXMuZGVidWdEZWxheSk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHJmKTtcclxuICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9KS5jYXRjaChyZWFzb24gPT4ge29ic2VydmVyLmVycm9yKHJlYXNvbil9KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcignUmVjZWl2ZWQgbm8gYXVkaW8gZGF0YScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgLCBlcnJvcjooZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT0gNDA0KSB7XHJcbiAgICAgICAgICAgICAgLy8gSW50ZXJwcmV0IG5vdCBhcyBhbiBlcnJvciwgdGhlIGZpbGUgaXN0IG5vdCByZWNvcmRlZCB5ZXRcclxuICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KG51bGwpO1xyXG4gICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKClcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAvLyBhbGwgb3RoZXIgc3RhdGVzIGFyZSBlcnJvcnNcclxuICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gd29icztcclxuICB9XHJcblxyXG4gIHNhdmVFZGl0U2VsZWN0aW9uKHJlY29yZGluZ0ZpbGVJZDogc3RyaW5nIHwgbnVtYmVyLGVkaXRTYW1wbGVSYXRlOm51bWJlcnxudWxsLGVkaXRTdGFydEZyYW1lOm51bWJlcnxudWxsLGVkaXRFbmRGcmFtZTpudW1iZXJ8bnVsbCk6IE9ic2VydmFibGU8U3ByUmVjb3JkaW5nRmlsZSB8IG51bGw+IHtcclxuICAgIGxldCByZWNVcmwgPSB0aGlzLmFwaUVuZFBvaW50ICsgUmVjb3JkaW5nRmlsZVNlcnZpY2UuUkVDT0ZJTEVfQVBJX0NUWCArICcvJyArIHJlY29yZGluZ0ZpbGVJZDtcclxuICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5hcGlUeXBlID09PSBBcGlUeXBlLkZJTEVTKSB7XHJcbiAgICAgIC8vIGZvciBkZXZlbG9wbWVudCBhbmQgZGVtb1xyXG4gICAgICAvLyBhcHBlbmQgVVVJRCB0byBtYWtlIHJlcXVlc3QgVVJMIHVuaXF1ZSB0byBhdm9pZCBsb2NhbGhvc3Qgc2VydmVyIGNhY2hpbmdcclxuICAgICAgcmVjVXJsID0gcmVjVXJsICsgJy5qc29uP3JlcXVlc3RVVUlEPScrVVVJRC5nZW5lcmF0ZSgpO1xyXG4gICAgfVxyXG4gICAgLy9jb25zb2xlLmxvZyhcIlBhdGggcmVxdWVzdCBVUkw6IFwiK3JlY1VybClcclxuICAgIHJldHVybiB0aGlzLmh0dHAucGF0Y2g8U3ByUmVjb3JkaW5nRmlsZT4ocmVjVXJsLHtlZGl0U2FtcGxlUmF0ZTplZGl0U2FtcGxlUmF0ZSxlZGl0U3RhcnRGcmFtZTplZGl0U3RhcnRGcmFtZSxlZGl0RW5kRnJhbWU6ZWRpdEVuZEZyYW1lfSx7IHdpdGhDcmVkZW50aWFsczogdGhpcy53aXRoQ3JlZGVudGlhbHMgfSk7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuXHJcbiJdfQ==