speechrecorderng 3.0.0 → 3.3.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 (142) hide show
  1. package/esm2020/lib/action/action.mjs +2 -1
  2. package/esm2020/lib/audio/array_audio_buffer.mjs +65 -2
  3. package/esm2020/lib/audio/array_audio_buffer_input_stream.mjs +2 -2
  4. package/esm2020/lib/audio/array_audio_buffer_random_access_stream.mjs +16 -0
  5. package/esm2020/lib/audio/audio_data_holder.mjs +203 -48
  6. package/esm2020/lib/audio/audio_display.mjs +10 -34
  7. package/esm2020/lib/audio/audio_player.mjs +18 -45
  8. package/esm2020/lib/audio/capture/capture.mjs +293 -69
  9. package/esm2020/lib/audio/dsp/level_measure.mjs +211 -88
  10. package/esm2020/lib/audio/impl/wavformat.mjs +1 -1
  11. package/esm2020/lib/audio/impl/wavreader.mjs +134 -0
  12. package/esm2020/lib/audio/impl/wavwriter.mjs +10 -9
  13. package/esm2020/lib/audio/inddb_audio_buffer.mjs +508 -0
  14. package/esm2020/lib/audio/net_audio_buffer.mjs +297 -0
  15. package/esm2020/lib/audio/persistor.mjs +8 -2
  16. package/esm2020/lib/audio/playback/array_audio_buffer_source_node.mjs +15 -154
  17. package/esm2020/lib/audio/playback/audio_source_node.mjs +18 -0
  18. package/esm2020/lib/audio/playback/audio_source_worklet_module_loader.mjs +167 -0
  19. package/esm2020/lib/audio/playback/inddb_audio_buffer_source_node.mjs +167 -0
  20. package/esm2020/lib/audio/playback/net_audio_buffer_source_node.mjs +218 -0
  21. package/esm2020/lib/audio/playback/player.mjs +190 -171
  22. package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +35 -76
  23. package/esm2020/lib/audio/ui/audio_display_control.mjs +12 -24
  24. package/esm2020/lib/audio/ui/audio_display_scroll_pane.mjs +14 -45
  25. package/esm2020/lib/audio/ui/audiosignal.mjs +333 -267
  26. package/esm2020/lib/audio/ui/container.mjs +40 -57
  27. package/esm2020/lib/audio/ui/livelevel.mjs +53 -52
  28. package/esm2020/lib/audio/ui/scroll_pane_horizontal.mjs +5 -19
  29. package/esm2020/lib/audio/ui/sonagram.mjs +386 -339
  30. package/esm2020/lib/db/inddb.mjs +120 -0
  31. package/esm2020/lib/io/BinaryReader.mjs +85 -0
  32. package/esm2020/lib/io/stream.mjs +101 -1
  33. package/esm2020/lib/net/uploader.mjs +111 -5
  34. package/esm2020/lib/recorder_component.mjs +59 -1
  35. package/esm2020/lib/speechrecorder/project/project.mjs +10 -1
  36. package/esm2020/lib/speechrecorder/project/project.service.mjs +3 -3
  37. package/esm2020/lib/speechrecorder/recording.mjs +30 -6
  38. package/esm2020/lib/speechrecorder/recordings/basic_recording.service.mjs +213 -0
  39. package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +732 -65
  40. package/esm2020/lib/speechrecorder/script/script.service.mjs +3 -3
  41. package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +358 -184
  42. package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +181 -28
  43. package/esm2020/lib/speechrecorder/session/controlpanel.mjs +47 -129
  44. package/esm2020/lib/speechrecorder/session/item.mjs +13 -1
  45. package/esm2020/lib/speechrecorder/session/progress.mjs +26 -55
  46. package/esm2020/lib/speechrecorder/session/prompting.mjs +33 -176
  47. package/esm2020/lib/speechrecorder/session/recorder_combi_pane.mjs +6 -6
  48. package/esm2020/lib/speechrecorder/session/recording_file_cache.mjs +28 -15
  49. package/esm2020/lib/speechrecorder/session/recording_list.mjs +92 -55
  50. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +9 -13
  51. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +9 -18
  52. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +10 -36
  53. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +10 -37
  54. package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +80 -56
  55. package/esm2020/lib/speechrecorder/session/session.service.mjs +3 -3
  56. package/esm2020/lib/speechrecorder/session/session_finished_dialog.mjs +4 -4
  57. package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +409 -165
  58. package/esm2020/lib/speechrecorder/session/warning_bar.mjs +6 -29
  59. package/esm2020/lib/speechrecorder/spruploader.mjs +3 -3
  60. package/esm2020/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +6 -41
  61. package/esm2020/lib/speechrecorderng.component.mjs +42 -31
  62. package/esm2020/lib/speechrecorderng.module.mjs +5 -5
  63. package/esm2020/lib/spr.config.mjs +3 -3
  64. package/esm2020/lib/spr.module.version.mjs +2 -2
  65. package/esm2020/lib/ui/canvas_layer_comp.mjs +3 -3
  66. package/esm2020/lib/ui/message_dialog.mjs +7 -7
  67. package/esm2020/lib/ui/recordingitem_display.mjs +26 -59
  68. package/esm2020/lib/utils/scrollIntoViewToBottom.mjs +3 -3
  69. package/esm2020/lib/utils/ua-parser.mjs +28 -4
  70. package/esm2020/lib/utils/utils.mjs +29 -1
  71. package/fesm2015/speechrecorderng.mjs +12755 -9195
  72. package/fesm2015/speechrecorderng.mjs.map +1 -1
  73. package/fesm2020/speechrecorderng.mjs +12652 -9101
  74. package/fesm2020/speechrecorderng.mjs.map +1 -1
  75. package/{speechrecorderng.d.ts → index.d.ts} +0 -0
  76. package/lib/audio/array_audio_buffer.d.ts +17 -1
  77. package/lib/audio/array_audio_buffer_random_access_stream.d.ts +9 -0
  78. package/lib/audio/audio_data_holder.d.ts +69 -14
  79. package/lib/audio/audio_display.d.ts +1 -1
  80. package/lib/audio/audio_player.d.ts +3 -7
  81. package/lib/audio/capture/capture.d.ts +24 -4
  82. package/lib/audio/dsp/level_measure.d.ts +2 -23
  83. package/lib/audio/impl/wavformat.d.ts +3 -3
  84. package/lib/audio/impl/wavreader.d.ts +16 -0
  85. package/lib/audio/impl/wavwriter.d.ts +1 -4
  86. package/lib/audio/inddb_audio_buffer.d.ts +68 -0
  87. package/lib/audio/net_audio_buffer.d.ts +59 -0
  88. package/lib/audio/persistor.d.ts +3 -9
  89. package/lib/audio/playback/array_audio_buffer_source_node.d.ts +2 -8
  90. package/lib/audio/playback/audio_source_node.d.ts +10 -0
  91. package/lib/audio/playback/audio_source_worklet_module_loader.d.ts +4 -0
  92. package/lib/audio/playback/inddb_audio_buffer_source_node.d.ts +21 -0
  93. package/lib/audio/playback/net_audio_buffer_source_node.d.ts +27 -0
  94. package/lib/audio/playback/player.d.ts +19 -16
  95. package/lib/audio/ui/audio_canvas_layer_comp.d.ts +3 -3
  96. package/lib/audio/ui/audio_display_control.d.ts +3 -6
  97. package/lib/audio/ui/audio_display_scroll_pane.d.ts +1 -1
  98. package/lib/audio/ui/audiosignal.d.ts +4 -3
  99. package/lib/audio/ui/container.d.ts +1 -1
  100. package/lib/audio/ui/livelevel.d.ts +11 -4
  101. package/lib/audio/ui/scroll_pane_horizontal.d.ts +1 -1
  102. package/lib/audio/ui/sonagram.d.ts +4 -3
  103. package/lib/db/inddb.d.ts +21 -0
  104. package/lib/io/BinaryReader.d.ts +18 -0
  105. package/lib/io/stream.d.ts +18 -0
  106. package/lib/net/uploader.d.ts +20 -2
  107. package/lib/recorder_component.d.ts +5 -0
  108. package/lib/speechrecorder/project/project.d.ts +9 -0
  109. package/lib/speechrecorder/recording.d.ts +8 -2
  110. package/lib/speechrecorder/recordings/basic_recording.service.d.ts +27 -0
  111. package/lib/speechrecorder/recordings/recordings.service.d.ts +21 -6
  112. package/lib/speechrecorder/session/audiorecorder.d.ts +7 -18
  113. package/lib/speechrecorder/session/basicrecorder.d.ts +28 -4
  114. package/lib/speechrecorder/session/controlpanel.d.ts +7 -7
  115. package/lib/speechrecorder/session/item.d.ts +1 -0
  116. package/lib/speechrecorder/session/progress.d.ts +2 -1
  117. package/lib/speechrecorder/session/prompting.d.ts +5 -5
  118. package/lib/speechrecorder/session/recorder_combi_pane.d.ts +1 -1
  119. package/lib/speechrecorder/session/recording_file_cache.d.ts +7 -4
  120. package/lib/speechrecorder/session/recording_list.d.ts +2 -1
  121. package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +1 -1
  122. package/lib/speechrecorder/session/recordingfile/recording-file-navi.component.d.ts +1 -1
  123. package/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.d.ts +1 -1
  124. package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +1 -1
  125. package/lib/speechrecorder/session/recordingfile/recordingfile-service.d.ts +4 -5
  126. package/lib/speechrecorder/session/session_finished_dialog.d.ts +1 -1
  127. package/lib/speechrecorder/session/sessionmanager.d.ts +10 -10
  128. package/lib/speechrecorder/session/warning_bar.d.ts +1 -1
  129. package/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.d.ts +1 -1
  130. package/lib/speechrecorderng.component.d.ts +2 -1
  131. package/lib/spr.module.version.d.ts +1 -1
  132. package/lib/ui/canvas_layer_comp.d.ts +1 -1
  133. package/lib/ui/message_dialog.d.ts +1 -1
  134. package/lib/ui/recordingitem_display.d.ts +3 -2
  135. package/lib/utils/scrollIntoViewToBottom.d.ts +1 -1
  136. package/lib/utils/ua-parser.d.ts +4 -1
  137. package/lib/utils/utils.d.ts +6 -0
  138. package/package.json +5 -4
  139. package/esm2020/lib/math/utils.mjs +0 -14
  140. package/esm2020/lib/utils/css_utils.mjs +0 -7
  141. package/lib/math/utils.d.ts +0 -3
  142. package/lib/utils/css_utils.d.ts +0 -3
@@ -0,0 +1,297 @@
1
+ import { Observable } from "rxjs";
2
+ import { BasicAudioSource } from "./audio_data_holder";
3
+ import { HttpErrorResponse } from "@angular/common/http";
4
+ export class NetAudioBuffer extends BasicAudioSource {
5
+ constructor(_audioContext, _recFileService, _baseUrl, _channelCount, _sampleRate, _chunkFrameLen, _frameLen, _uuid = null, _orgFetchChunkFrameLen = _chunkFrameLen) {
6
+ super();
7
+ this._audioContext = _audioContext;
8
+ this._recFileService = _recFileService;
9
+ this._baseUrl = _baseUrl;
10
+ this._channelCount = _channelCount;
11
+ this._sampleRate = _sampleRate;
12
+ this._chunkFrameLen = _chunkFrameLen;
13
+ this._frameLen = _frameLen;
14
+ this._uuid = _uuid;
15
+ this._orgFetchChunkFrameLen = _orgFetchChunkFrameLen;
16
+ this._chunkCount = 0;
17
+ this._sealed = false;
18
+ }
19
+ get orgFetchChunkFrameLen() {
20
+ return this._orgFetchChunkFrameLen;
21
+ }
22
+ get recFileService() {
23
+ return this._recFileService;
24
+ }
25
+ get audioContext() {
26
+ return this._audioContext;
27
+ }
28
+ get baseUrl() {
29
+ return this._baseUrl;
30
+ }
31
+ get chunkFrameLen() {
32
+ return this._chunkFrameLen;
33
+ }
34
+ get uuid() {
35
+ return this._uuid;
36
+ }
37
+ get channelCount() {
38
+ return this._channelCount;
39
+ }
40
+ sealed() {
41
+ return this._sealed;
42
+ }
43
+ seal() {
44
+ this._sealed = true;
45
+ }
46
+ get sampleRate() {
47
+ return this._sampleRate;
48
+ }
49
+ get frameLen() {
50
+ return this._frameLen;
51
+ }
52
+ get chunkCount() {
53
+ return this._chunkCount;
54
+ }
55
+ releaseAudioData() {
56
+ return new Observable((subscriber) => {
57
+ // nothing to remove
58
+ subscriber.next();
59
+ subscriber.complete();
60
+ });
61
+ }
62
+ toString() {
63
+ return "Indexed db audio buffer. Channels: " + this.channelCount + ", sample rate: " + this.sampleRate + ", chunk frame length: " + this._chunkFrameLen + ", number of chunks: " + this.chunkCount + ", frame length: " + this.frameLen + ", sealed: " + this.sealed();
64
+ }
65
+ static fromChunkAudioBuffer(aCtx, recordingsService, baseUrl, ab, frameLen, orgFetchChunkFrameLen = ab.length) {
66
+ let nab = new NetAudioBuffer(aCtx, recordingsService, baseUrl, ab.numberOfChannels, ab.sampleRate, ab.length, frameLen, null, orgFetchChunkFrameLen);
67
+ nab.ready();
68
+ return nab;
69
+ }
70
+ asyncAudioInputStream() {
71
+ return new NetAudioInputStream(this);
72
+ }
73
+ audioInputStream() {
74
+ return null;
75
+ }
76
+ get duration() {
77
+ return this._frameLen / this._sampleRate;
78
+ }
79
+ get numberOfChannels() {
80
+ return this._channelCount;
81
+ }
82
+ sampleCounts() {
83
+ return this._channelCount * this._frameLen;
84
+ }
85
+ randomAccessAudioStream() {
86
+ return new NetRandomAccessAudioStream(this);
87
+ }
88
+ }
89
+ // export class NetAudioChunk{
90
+ //
91
+ // get orgSampleRate(): number {
92
+ // return this._orgSampleRate;
93
+ // }
94
+ //
95
+ // get orgFrameLen(): number {
96
+ // return this._orgFrameLen;
97
+ // }
98
+ // constructor(private _decodedBuffers:Float32Array[],private _orgSampleRate:number,private _orgFrameLen:number) {
99
+ // }
100
+ // }
101
+ export class NetRandomAccessAudioStream {
102
+ constructor(_netAb) {
103
+ this._netAb = _netAb;
104
+ this._currCi = 0;
105
+ this._ccCache = null;
106
+ }
107
+ chunk(baseUrl, ci, cb, errCb) {
108
+ let startFrame = ci * this._netAb.orgFetchChunkFrameLen;
109
+ this._netAb.recFileService.chunkAudioRequest(this._netAb.audioContext, baseUrl, startFrame, this._netAb.orgFetchChunkFrameLen).subscribe({
110
+ next: (chDl) => {
111
+ if (chDl) {
112
+ const ab = chDl.decodedAudioBuffer;
113
+ const ccChs = ab.numberOfChannels;
114
+ let arrBuf = new Array();
115
+ for (let ch = 0; ch < ccChs; ch++) {
116
+ arrBuf.push(ab.getChannelData(ch));
117
+ }
118
+ cb(arrBuf, chDl.orgFrameLength);
119
+ }
120
+ else {
121
+ cb(null, null);
122
+ }
123
+ },
124
+ complete: () => { },
125
+ error: (errEv) => {
126
+ //NetRandomAccessAudioStream._runningRequests--;
127
+ if (errEv instanceof HttpErrorResponse) {
128
+ if (errEv.status === 404) {
129
+ cb(null, null);
130
+ }
131
+ else {
132
+ console.error("Net audio buffer chunk audio request Http error event: " + errEv.status + ", " + errEv.name + ", " + errEv.message);
133
+ errCb(new Error(errEv.toString()));
134
+ }
135
+ }
136
+ else {
137
+ console.error("Net audio buffer chunk audio request error event: " + errEv.message);
138
+ errCb(new Error(errEv.toString()));
139
+ }
140
+ }
141
+ });
142
+ }
143
+ _fillBufs(ccBufs, orgFrameLen, trgState, srcState) {
144
+ let ccBufsChs = ccBufs.length;
145
+ if (ccBufsChs > 0) {
146
+ let ccBuf0 = ccBufs[0];
147
+ let ccBufsLen = ccBuf0.length;
148
+ //console.debug('IndexedDbAudioBuffer::fillBufs framePos: '+framePos+', srcFramePos: '+srcFramePos+', ccBufsLen: '+ccBufsLen);
149
+ if (trgState.framePos >= srcState.srcFramePos + ccBufsLen) {
150
+ // target frame position is ahead, seek to next source buffer
151
+ //console.debug('IndexedDbAudioBuffer::fillBufs seek to next inddb buffer');
152
+ this._ccCache = null;
153
+ srcState.ci++;
154
+ srcState.ccPos = 0;
155
+ if (orgFrameLen === null) {
156
+ srcState.orgSrcFramePos += ccBufsLen;
157
+ }
158
+ else {
159
+ srcState.orgSrcFramePos += orgFrameLen;
160
+ }
161
+ srcState.srcFramePos += ccBufsLen;
162
+ }
163
+ else {
164
+ // Assuming target frame pos is inside current source buffer
165
+ srcState.ccPos = trgState.framePos - srcState.srcFramePos;
166
+ let ccAvail = ccBufsLen - srcState.ccPos;
167
+ let toCopy = ccBufsLen;
168
+ if (toCopy > ccAvail) {
169
+ toCopy = ccAvail;
170
+ }
171
+ if (toCopy > trgState.frameLen) {
172
+ toCopy = trgState.frameLen;
173
+ }
174
+ for (let ch = 0; ch < ccBufsChs; ch++) {
175
+ for (let si = 0; si < toCopy; si++) {
176
+ trgState.trgBufs[ch][trgState.filled + si] = ccBufs[ch][srcState.ccPos + si];
177
+ }
178
+ }
179
+ trgState.filled += toCopy;
180
+ trgState.frameLen -= toCopy;
181
+ trgState.framePos += toCopy;
182
+ srcState.ccPos += toCopy;
183
+ if (srcState.ccPos >= ccBufsLen) {
184
+ // Invalidate cache
185
+ this._ccCache = null;
186
+ srcState.ci++;
187
+ this._currCi = srcState.ci;
188
+ srcState.ccPos = 0;
189
+ if (orgFrameLen === null) {
190
+ srcState.orgSrcFramePos += ccBufsLen;
191
+ }
192
+ else {
193
+ srcState.orgSrcFramePos += orgFrameLen;
194
+ }
195
+ srcState.srcFramePos += ccBufsLen;
196
+ }
197
+ }
198
+ }
199
+ }
200
+ fillBufs(baseUrl, orgFrameLen, trgState, srcState, cb, cbEnd, cbErr) {
201
+ //console.debug('IndexedDbAudioBuffer::fillBufs: framePos:'+framePos+', frameLen: '+frameLen+', filled: '+filled+', srcFramePos: '+srcFramePos+',ci: '+ci+', ccPos: '+ccPos);
202
+ if (this._ccCache) {
203
+ this._fillBufs(this._ccCache, orgFrameLen, trgState, srcState);
204
+ //console.debug('IndexedDbAudioBuffer::fillBufs frameLen: '+frameLen);
205
+ if (trgState.frameLen === 0) {
206
+ //console.debug('IndexedDbAudioBuffer::fillBufs (framelen==0) call: cbend '+filled);
207
+ cbEnd(trgState.filled);
208
+ }
209
+ else {
210
+ this.fillBufs(baseUrl, orgFrameLen, trgState, srcState, cb, cbEnd, cbErr);
211
+ }
212
+ }
213
+ else {
214
+ this.chunk(baseUrl, srcState.ci, (ccBufs, orgFrameLength) => {
215
+ if (ccBufs) {
216
+ this._currCi = srcState.ci;
217
+ this._ccCache = ccBufs;
218
+ this._fillBufs(ccBufs, orgFrameLength, trgState, srcState);
219
+ //console.debug('IndexedDbAudioBuffer::fillBufs frameLen: '+frameLen);
220
+ if (trgState.frameLen === 0) {
221
+ //console.debug('IndexedDbAudioBuffer::fillBufs (framelen==0) call: cbend '+filled);
222
+ cbEnd(trgState.filled);
223
+ }
224
+ else {
225
+ this.fillBufs(baseUrl, orgFrameLen, trgState, srcState, cb, cbEnd, cbErr);
226
+ }
227
+ }
228
+ else {
229
+ //console.debug('IndexedDbAudioBuffer::fillBufs (chunk not found) call: cbend '+filled);
230
+ cbEnd(trgState.filled);
231
+ }
232
+ }, (err) => {
233
+ cbErr(err);
234
+ });
235
+ }
236
+ }
237
+ framesObs(framePos, frameLen, bufs) {
238
+ return new Observable((subscriber) => {
239
+ // Positioning
240
+ let newCi = Math.floor(framePos / this._netAb.chunkFrameLen);
241
+ if (newCi !== this._currCi) {
242
+ this._currCi = newCi;
243
+ this._ccCache = null;
244
+ }
245
+ let srcFramePos = newCi * this._netAb.chunkFrameLen;
246
+ let trgState = { framePos: framePos, frameLen: frameLen, trgBufs: bufs, filled: 0 };
247
+ let srcState = { orgSrcFramePos: 0, srcFramePos: srcFramePos, ci: newCi, ccPos: 0, ccFilled: 0 };
248
+ this.fillBufs(this._netAb.baseUrl, this._netAb.orgFetchChunkFrameLen, trgState, srcState, (val) => { }, (filled) => {
249
+ subscriber.next(filled);
250
+ subscriber.complete();
251
+ }, err => {
252
+ subscriber.error(err);
253
+ });
254
+ });
255
+ }
256
+ close() {
257
+ this._currCi = 0;
258
+ this._ccCache = null;
259
+ }
260
+ }
261
+ export class NetAudioInputStream {
262
+ constructor(netAb) {
263
+ this.netAb = netAb;
264
+ this.framePos = 0;
265
+ this.netAbStr = new NetRandomAccessAudioStream(netAb);
266
+ }
267
+ close() {
268
+ this.netAbStr.close();
269
+ }
270
+ readObs(buffers) {
271
+ return new Observable(subscr => {
272
+ if (buffers && buffers.length > 0) {
273
+ let fl = buffers[0].length;
274
+ this.netAbStr.framesObs(this.framePos, fl, buffers).subscribe({
275
+ next: (read) => {
276
+ this.framePos += read;
277
+ subscr.next(read);
278
+ },
279
+ complete: () => {
280
+ subscr.complete();
281
+ },
282
+ error: (err) => {
283
+ subscr.error(err);
284
+ }
285
+ });
286
+ }
287
+ else {
288
+ subscr.next(0);
289
+ subscr.complete();
290
+ }
291
+ });
292
+ }
293
+ skipFrames(n) {
294
+ this.framePos += n;
295
+ }
296
+ }
297
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV0X2F1ZGlvX2J1ZmZlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9hdWRpby9uZXRfYXVkaW9fYnVmZmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFaEMsT0FBTyxFQUFjLGdCQUFnQixFQUEwQixNQUFNLHFCQUFxQixDQUFDO0FBRTNGLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBSXZELE1BQU0sT0FBTyxjQUFlLFNBQVEsZ0JBQWdCO0lBeUJsRCxZQUFzQixhQUEwQixFQUM1QixlQUFxQyxFQUNyQyxRQUFlLEVBQ2YsYUFBcUIsRUFDckIsV0FBbUIsRUFDbkIsY0FBcUIsRUFDckIsU0FBZ0IsRUFDaEIsUUFBa0IsSUFBSSxFQUN0Qix5QkFBdUIsY0FBYztRQUN2RCxLQUFLLEVBQUUsQ0FBQztRQVRZLGtCQUFhLEdBQWIsYUFBYSxDQUFhO1FBQzVCLG9CQUFlLEdBQWYsZUFBZSxDQUFzQjtRQUNyQyxhQUFRLEdBQVIsUUFBUSxDQUFPO1FBQ2Ysa0JBQWEsR0FBYixhQUFhLENBQVE7UUFDckIsZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFDbkIsbUJBQWMsR0FBZCxjQUFjLENBQU87UUFDckIsY0FBUyxHQUFULFNBQVMsQ0FBTztRQUNoQixVQUFLLEdBQUwsS0FBSyxDQUFpQjtRQUN0QiwyQkFBc0IsR0FBdEIsc0JBQXNCLENBQWU7UUFYakQsZ0JBQVcsR0FBQyxDQUFDLENBQUM7UUFDZCxZQUFPLEdBQUMsS0FBSyxDQUFDO0lBYXRCLENBQUM7SUFsQ0QsSUFBSSxxQkFBcUI7UUFDdkIsT0FBTyxJQUFJLENBQUMsc0JBQXNCLENBQUM7SUFDckMsQ0FBQztJQUNELElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIs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Q0FBQyxRQUFRLElBQUUsQ0FBQyxDQUFDO0lBQ25CLENBQUM7Q0FHRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtBc3luY0Zsb2F0MzJBcnJheUlucHV0U3RyZWFtLCBGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbX0gZnJvbSBcIi4uL2lvL3N0cmVhbVwiO1xyXG5pbXBvcnQge0F1ZGlvU291cmNlLCBCYXNpY0F1ZGlvU291cmNlLCBSYW5kb21BY2Nlc3NBdWRpb1N0cmVhbX0gZnJvbSBcIi4vYXVkaW9fZGF0YV9ob2xkZXJcIjtcclxuaW1wb3J0IHtSZWNvcmRpbmdTZXJ2aWNlfSBmcm9tIFwiLi4vc3BlZWNocmVjb3JkZXIvcmVjb3JkaW5ncy9yZWNvcmRpbmdzLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtIdHRwRXJyb3JSZXNwb25zZX0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7QmFzaWNSZWNvcmRpbmdTZXJ2aWNlfSBmcm9tIFwiLi4vc3BlZWNocmVjb3JkZXIvcmVjb3JkaW5ncy9iYXNpY19yZWNvcmRpbmcuc2VydmljZVwiO1xyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBOZXRBdWRpb0J1ZmZlciBleHRlbmRzIEJhc2ljQXVkaW9Tb3VyY2UgaW1wbGVtZW50cyBBdWRpb1NvdXJjZXtcclxuXHJcbiAgZ2V0IG9yZ0ZldGNoQ2h1bmtGcmFtZUxlbigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX29yZ0ZldGNoQ2h1bmtGcmFtZUxlbjtcclxuICB9XHJcbiAgZ2V0IHJlY0ZpbGVTZXJ2aWNlKCk6IEJhc2ljUmVjb3JkaW5nU2VydmljZSB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVjRmlsZVNlcnZpY2U7XHJcbiAgfVxyXG4gIGdldCBhdWRpb0NvbnRleHQoKTogQXVkaW9Db250ZXh0IHtcclxuICAgIHJldHVybiB0aGlzLl9hdWRpb0NvbnRleHQ7XHJcbiAgfVxyXG4gIGdldCBiYXNlVXJsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fYmFzZVVybDtcclxuICB9XHJcbiAgZ2V0IGNodW5rRnJhbWVMZW4oKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jaHVua0ZyYW1lTGVuO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHV1aWQoKTogc3RyaW5nfG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuX3V1aWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jaHVua0NvdW50PTA7XHJcbiAgcHJpdmF0ZSBfc2VhbGVkPWZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX2F1ZGlvQ29udGV4dDpBdWRpb0NvbnRleHQsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfcmVjRmlsZVNlcnZpY2U6QmFzaWNSZWNvcmRpbmdTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgX2Jhc2VVcmw6c3RyaW5nLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgX2NoYW5uZWxDb3VudDogbnVtYmVyLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgX3NhbXBsZVJhdGU6IG51bWJlcixcclxuICAgICAgICAgICAgICBwcml2YXRlIF9jaHVua0ZyYW1lTGVuOm51bWJlcixcclxuICAgICAgICAgICAgICBwcml2YXRlIF9mcmFtZUxlbjpudW1iZXIsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfdXVpZDpzdHJpbmd8bnVsbD1udWxsLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgX29yZ0ZldGNoQ2h1bmtGcmFtZUxlbj1fY2h1bmtGcmFtZUxlbikge1xyXG4gICAgc3VwZXIoKTtcclxuXHJcbiAgfVxyXG5cclxuICBnZXQgY2hhbm5lbENvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2hhbm5lbENvdW50O1xyXG4gIH1cclxuXHJcbiAgc2VhbGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlYWxlZDtcclxuICB9XHJcblxyXG4gIHNlYWwoKTp2b2lke1xyXG4gICAgdGhpcy5fc2VhbGVkPXRydWU7XHJcbiAgfVxyXG5cclxuICBnZXQgc2FtcGxlUmF0ZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NhbXBsZVJhdGU7XHJcbiAgfVxyXG5cclxuICBnZXQgZnJhbWVMZW4oKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9mcmFtZUxlbjtcclxuICB9XHJcblxyXG4gIGdldCBjaHVua0NvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2h1bmtDb3VudDtcclxuICB9XHJcblxyXG4gIHJlbGVhc2VBdWRpb0RhdGEoKTpPYnNlcnZhYmxlPHZvaWQ+e1xyXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPHZvaWQ+KChzdWJzY3JpYmVyKT0+e1xyXG4gICAgICAgIC8vIG5vdGhpbmcgdG8gcmVtb3ZlXHJcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KCk7XHJcbiAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b1N0cmluZygpOnN0cmluZ3tcclxuICAgIHJldHVybiBcIkluZGV4ZWQgZGIgYXVkaW8gYnVmZmVyLiBDaGFubmVsczogXCIrdGhpcy5jaGFubmVsQ291bnQrXCIsIHNhbXBsZSByYXRlOiBcIit0aGlzLnNhbXBsZVJhdGUrXCIsIGNodW5rIGZyYW1lIGxlbmd0aDogXCIrdGhpcy5fY2h1bmtGcmFtZUxlbitcIiwgbnVtYmVyIG9mIGNodW5rczogXCIrdGhpcy5jaHVua0NvdW50K1wiLCBmcmFtZSBsZW5ndGg6IFwiK3RoaXMuZnJhbWVMZW4rXCIsIHNlYWxlZDogXCIrdGhpcy5zZWFsZWQoKTtcclxuICB9XHJcblxyXG4gICAgc3RhdGljIGZyb21DaHVua0F1ZGlvQnVmZmVyKGFDdHg6QXVkaW9Db250ZXh0LHJlY29yZGluZ3NTZXJ2aWNlOkJhc2ljUmVjb3JkaW5nU2VydmljZSxiYXNlVXJsOnN0cmluZyxhYjogQXVkaW9CdWZmZXIsZnJhbWVMZW46bnVtYmVyLG9yZ0ZldGNoQ2h1bmtGcmFtZUxlbjpudW1iZXI9YWIubGVuZ3RoKTpOZXRBdWRpb0J1ZmZlciB7XHJcbiAgICAgIGxldCBuYWI9bmV3IE5ldEF1ZGlvQnVmZmVyKGFDdHgscmVjb3JkaW5nc1NlcnZpY2UsYmFzZVVybCxhYi5udW1iZXJPZkNoYW5uZWxzLGFiLnNhbXBsZVJhdGUsYWIubGVuZ3RoLGZyYW1lTGVuLG51bGwsb3JnRmV0Y2hDaHVua0ZyYW1lTGVuKTtcclxuICAgICAgbmFiLnJlYWR5KCk7XHJcbiAgICAgIHJldHVybiBuYWI7XHJcbiAgfVxyXG5cclxuICBhc3luY0F1ZGlvSW5wdXRTdHJlYW0oKTogQXN5bmNGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbSB8IG51bGwge1xyXG4gICAgcmV0dXJuIG5ldyBOZXRBdWRpb0lucHV0U3RyZWFtKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgYXVkaW9JbnB1dFN0cmVhbSgpOiBGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbSB8IG51bGwge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBnZXQgZHVyYXRpb24oKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9mcmFtZUxlbi90aGlzLl9zYW1wbGVSYXRlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG51bWJlck9mQ2hhbm5lbHMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jaGFubmVsQ291bnQ7XHJcbiAgfVxyXG5cclxuICBzYW1wbGVDb3VudHMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jaGFubmVsQ291bnQqdGhpcy5fZnJhbWVMZW47XHJcbiAgfVxyXG5cclxuICByYW5kb21BY2Nlc3NBdWRpb1N0cmVhbSgpOiBSYW5kb21BY2Nlc3NBdWRpb1N0cmVhbSB7XHJcbiAgICByZXR1cm4gbmV3IE5ldFJhbmRvbUFjY2Vzc0F1ZGlvU3RyZWFtKHRoaXMpO1xyXG4gIH1cclxufVxyXG5cclxuLy8gZXhwb3J0IGNsYXNzIE5ldEF1ZGlvQ2h1bmt7XHJcbi8vXHJcbi8vICAgZ2V0IG9yZ1NhbXBsZVJhdGUoKTogbnVtYmVyIHtcclxuLy8gICAgIHJldHVybiB0aGlzLl9vcmdTYW1wbGVSYXRlO1xyXG4vLyAgIH1cclxuLy9cclxuLy8gICBnZXQgb3JnRnJhbWVMZW4oKTogbnVtYmVyIHtcclxuLy8gICAgIHJldHVybiB0aGlzLl9vcmdGcmFtZUxlbjtcclxuLy8gICB9XHJcbi8vICAgY29uc3RydWN0b3IocHJpdmF0ZSBfZGVjb2RlZEJ1ZmZlcnM6RmxvYXQzMkFycmF5W10scHJpdmF0ZSBfb3JnU2FtcGxlUmF0ZTpudW1iZXIscHJpdmF0ZSBfb3JnRnJhbWVMZW46bnVtYmVyKSB7XHJcbi8vICAgfVxyXG4vLyB9XHJcblxyXG5leHBvcnQgY2xhc3MgTmV0UmFuZG9tQWNjZXNzQXVkaW9TdHJlYW0gaW1wbGVtZW50cyBSYW5kb21BY2Nlc3NBdWRpb1N0cmVhbXtcclxuXHJcbiAgcHJpdmF0ZSBfY3VyckNpPTA7XHJcbiAgcHJpdmF0ZSBfY2NDYWNoZTpGbG9hdDMyQXJyYXlbXXxudWxsPW51bGw7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX25ldEFiOk5ldEF1ZGlvQnVmZmVyKSB7fVxyXG5cclxuICBwcml2YXRlIGNodW5rKGJhc2VVcmw6c3RyaW5nLGNpOm51bWJlcixjYjooYnVmczpBcnJheTxGbG9hdDMyQXJyYXk+fG51bGwsb3JnRnJhbWVMZW5ndGg6bnVtYmVyfG51bGwpPT52b2lkLGVyckNiOihlcnI6RXJyb3IpPT52b2lkKXtcclxuXHJcbiAgICBsZXQgc3RhcnRGcmFtZT1jaSp0aGlzLl9uZXRBYi5vcmdGZXRjaENodW5rRnJhbWVMZW47XHJcblxyXG4gICAgdGhpcy5fbmV0QWIucmVjRmlsZVNlcnZpY2UuY2h1bmtBdWRpb1JlcXVlc3QodGhpcy5fbmV0QWIuYXVkaW9Db250ZXh0LGJhc2VVcmwsc3RhcnRGcmFtZSx0aGlzLl9uZXRBYi5vcmdGZXRjaENodW5rRnJhbWVMZW4pLnN1YnNjcmliZShcclxuICAgICAge1xyXG5cclxuICAgICAgICBuZXh0OiAoY2hEbCk9PntcclxuICAgICAgICAgIGlmKGNoRGwpe1xyXG4gICAgICAgICAgICBjb25zdCBhYj1jaERsLmRlY29kZWRBdWRpb0J1ZmZlcjtcclxuICAgICAgICAgICAgY29uc3QgY2NDaHM9YWIubnVtYmVyT2ZDaGFubmVscztcclxuICAgICAgICAgICAgbGV0IGFyckJ1Zj1uZXcgQXJyYXk8RmxvYXQzMkFycmF5PigpO1xyXG4gICAgICAgICAgICBmb3IobGV0IGNoPTA7Y2g8Y2NDaHM7Y2grKyl7XHJcbiAgICAgICAgICAgICAgYXJyQnVmLnB1c2goYWIuZ2V0Q2hhbm5lbERhdGEoY2gpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYihhcnJCdWYsY2hEbC5vcmdGcmFtZUxlbmd0aCk7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgY2IobnVsbCxudWxsKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIGNvbXBsZXRlOiAoKT0+e30sXHJcbiAgICAgICAgZXJyb3I6KGVyckV2KT0+e1xyXG4gICAgICAgICAgLy9OZXRSYW5kb21BY2Nlc3NBdWRpb1N0cmVhbS5fcnVubmluZ1JlcXVlc3RzLS07XHJcbiAgICAgICAgICBpZihlcnJFdiBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlKXtcclxuICAgICAgICAgICBpZihlcnJFdi5zdGF0dXM9PT00MDQpe1xyXG4gICAgICAgICAgICAgY2IobnVsbCxudWxsKTtcclxuICAgICAgICAgICB9IGVsc2V7XHJcbiAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTmV0IGF1ZGlvIGJ1ZmZlciBjaHVuayBhdWRpbyByZXF1ZXN0IEh0dHAgZXJyb3IgZXZlbnQ6IFwiK2VyckV2LnN0YXR1cytcIiwgXCIrZXJyRXYubmFtZStcIiwgXCIrZXJyRXYubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICBlcnJDYihuZXcgRXJyb3IoZXJyRXYudG9TdHJpbmcoKSkpO1xyXG4gICAgICAgICAgIH1cclxuICAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5ldCBhdWRpbyBidWZmZXIgY2h1bmsgYXVkaW8gcmVxdWVzdCBlcnJvciBldmVudDogXCIrZXJyRXYubWVzc2FnZSk7XHJcbiAgICAgICAgICAgIGVyckNiKG5ldyBFcnJvcihlcnJFdi50b1N0cmluZygpKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZmlsbEJ1ZnMoY2NCdWZzOkZsb2F0MzJBcnJheVtdLG9yZ0ZyYW1lTGVuOm51bWJlcnxudWxsLHRyZ1N0YXRlOntmcmFtZVBvczpudW1iZXIsZnJhbWVMZW46bnVtYmVyLHRyZ0J1ZnM6RmxvYXQzMkFycmF5W10sZmlsbGVkOm51bWJlcn0sc3JjU3RhdGU6e29yZ1NyY0ZyYW1lUG9zOm51bWJlcixzcmNGcmFtZVBvczpudW1iZXIsY2k6bnVtYmVyLGNjUG9zOm51bWJlcn0pe1xyXG4gICAgbGV0IGNjQnVmc0Nocz1jY0J1ZnMubGVuZ3RoO1xyXG4gICAgaWYoY2NCdWZzQ2hzPjApIHtcclxuICAgICAgbGV0IGNjQnVmMCA9IGNjQnVmc1swXTtcclxuICAgICAgbGV0IGNjQnVmc0xlbiA9IGNjQnVmMC5sZW5ndGg7XHJcblxyXG4gICAgICAvL2NvbnNvbGUuZGVidWcoJ0luZGV4ZWREYkF1ZGlvQnVmZmVyOjpmaWxsQnVmcyBmcmFtZVBvczogJytmcmFtZVBvcysnLCBzcmNGcmFtZVBvczogJytzcmNGcmFtZVBvcysnLCBjY0J1ZnNMZW46ICcrY2NCdWZzTGVuKTtcclxuICAgICAgaWYgKHRyZ1N0YXRlLmZyYW1lUG9zID49IHNyY1N0YXRlLnNyY0ZyYW1lUG9zICsgY2NCdWZzTGVuKSB7XHJcbiAgICAgICAgLy8gdGFyZ2V0IGZyYW1lIHBvc2l0aW9uIGlzIGFoZWFkLCBzZWVrIHRvIG5leHQgc291cmNlIGJ1ZmZlclxyXG4gICAgICAgIC8vY29uc29sZS5kZWJ1ZygnSW5kZXhlZERiQXVkaW9CdWZmZXI6OmZpbGxCdWZzIHNlZWsgdG8gbmV4dCBpbmRkYiBidWZmZXInKTtcclxuICAgICAgICB0aGlzLl9jY0NhY2hlPW51bGw7XHJcbiAgICAgICAgc3JjU3RhdGUuY2krKztcclxuICAgICAgICBzcmNTdGF0ZS5jY1Bvcz0wO1xyXG4gICAgICAgIGlmKG9yZ0ZyYW1lTGVuPT09bnVsbCl7XHJcbiAgICAgICAgICBzcmNTdGF0ZS5vcmdTcmNGcmFtZVBvcys9Y2NCdWZzTGVuO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgc3JjU3RhdGUub3JnU3JjRnJhbWVQb3MrPW9yZ0ZyYW1lTGVuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzcmNTdGF0ZS5zcmNGcmFtZVBvcys9Y2NCdWZzTGVuO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIEFzc3VtaW5nIHRhcmdldCBmcmFtZSBwb3MgaXMgaW5zaWRlIGN1cnJlbnQgc291cmNlIGJ1ZmZlclxyXG4gICAgICAgIHNyY1N0YXRlLmNjUG9zPXRyZ1N0YXRlLmZyYW1lUG9zLXNyY1N0YXRlLnNyY0ZyYW1lUG9zO1xyXG4gICAgICAgIGxldCBjY0F2YWlsID0gY2NCdWZzTGVuIC0gc3JjU3RhdGUuY2NQb3M7XHJcbiAgICAgICAgbGV0IHRvQ29weSA9IGNjQnVmc0xlbjtcclxuXHJcbiAgICAgICAgaWYgKHRvQ29weSA+IGNjQXZhaWwpIHtcclxuICAgICAgICAgIHRvQ29weSA9IGNjQXZhaWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0b0NvcHkgPiB0cmdTdGF0ZS5mcmFtZUxlbikge1xyXG4gICAgICAgICAgdG9Db3B5ID0gdHJnU3RhdGUuZnJhbWVMZW47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjY0J1ZnNDaHM7IGNoKyspIHtcclxuICAgICAgICAgIGZvciAobGV0IHNpID0gMDsgc2kgPCB0b0NvcHk7IHNpKyspIHtcclxuICAgICAgICAgICAgdHJnU3RhdGUudHJnQnVmc1tjaF1bdHJnU3RhdGUuZmlsbGVkK3NpXSA9IGNjQnVmc1tjaF1bc3JjU3RhdGUuY2NQb3Mrc2ldO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0cmdTdGF0ZS5maWxsZWQgKz0gdG9Db3B5O1xyXG4gICAgICAgIHRyZ1N0YXRlLmZyYW1lTGVuIC09IHRvQ29weTtcclxuICAgICAgICB0cmdTdGF0ZS5mcmFtZVBvcyArPSB0b0NvcHk7XHJcbiAgICAgICAgc3JjU3RhdGUuY2NQb3MgKz0gdG9Db3B5O1xyXG4gICAgICAgIGlmIChzcmNTdGF0ZS5jY1BvcyA+PSBjY0J1ZnNMZW4pIHtcclxuICAgICAgICAgIC8vIEludmFsaWRhdGUgY2FjaGVcclxuICAgICAgICAgIHRoaXMuX2NjQ2FjaGU9bnVsbDtcclxuICAgICAgICAgIHNyY1N0YXRlLmNpKys7XHJcbiAgICAgICAgICB0aGlzLl9jdXJyQ2k9c3JjU3RhdGUuY2k7XHJcbiAgICAgICAgICBzcmNTdGF0ZS5jY1BvcyA9IDA7XHJcbiAgICAgICAgICBpZihvcmdGcmFtZUxlbj09PW51bGwpe1xyXG4gICAgICAgICAgICBzcmNTdGF0ZS5vcmdTcmNGcmFtZVBvcys9Y2NCdWZzTGVuO1xyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHNyY1N0YXRlLm9yZ1NyY0ZyYW1lUG9zKz1vcmdGcmFtZUxlbjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHNyY1N0YXRlLnNyY0ZyYW1lUG9zKz1jY0J1ZnNMZW47XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaWxsQnVmcyhiYXNlVXJsOnN0cmluZyxvcmdGcmFtZUxlbjpudW1iZXJ8bnVsbCx0cmdTdGF0ZTp7ZnJhbWVQb3M6bnVtYmVyLGZyYW1lTGVuOm51bWJlcix0cmdCdWZzOkZsb2F0MzJBcnJheVtdLGZpbGxlZDpudW1iZXJ9LHNyY1N0YXRlOntvcmdTcmNGcmFtZVBvczpudW1iZXIsc3JjRnJhbWVQb3M6bnVtYmVyLGNpOm51bWJlcixjY1BvczpudW1iZXIsY2NGaWxsZWQ6bnVtYmVyfSxjYjooZmlsbGVkOm51bWJlcik9PnZvaWQsY2JFbmQ6KGZpbGxlZDpudW1iZXIpPT52b2lkLGNiRXJyOihlcnI6RXJyb3IpPT52b2lkKXtcclxuICAgIC8vY29uc29sZS5kZWJ1ZygnSW5kZXhlZERiQXVkaW9CdWZmZXI6OmZpbGxCdWZzOiBmcmFtZVBvczonK2ZyYW1lUG9zKycsIGZyYW1lTGVuOiAnK2ZyYW1lTGVuKycsIGZpbGxlZDogJytmaWxsZWQrJywgc3JjRnJhbWVQb3M6ICcrc3JjRnJhbWVQb3MrJyxjaTogJytjaSsnLCBjY1BvczogJytjY1Bvcyk7XHJcbiAgICBpZih0aGlzLl9jY0NhY2hlKXtcclxuICAgICAgdGhpcy5fZmlsbEJ1ZnModGhpcy5fY2NDYWNoZSxvcmdGcmFtZUxlbix0cmdTdGF0ZSxzcmNTdGF0ZSk7XHJcbiAgICAgIC8vY29uc29sZS5kZWJ1ZygnSW5kZXhlZERiQXVkaW9CdWZmZXI6OmZpbGxCdWZzIGZyYW1lTGVuOiAnK2ZyYW1lTGVuKTtcclxuICAgICAgaWYodHJnU3RhdGUuZnJhbWVMZW49PT0wKXtcclxuICAgICAgICAvL2NvbnNvbGUuZGVidWcoJ0luZGV4ZWREYkF1ZGlvQnVmZmVyOjpmaWxsQnVmcyAoZnJhbWVsZW49PTApIGNhbGw6IGNiZW5kICcrZmlsbGVkKTtcclxuICAgICAgICBjYkVuZCh0cmdTdGF0ZS5maWxsZWQpO1xyXG4gICAgICB9ZWxzZSB7XHJcbiAgICAgICAgdGhpcy5maWxsQnVmcyhiYXNlVXJsLCBvcmdGcmFtZUxlbix0cmdTdGF0ZSwgc3JjU3RhdGUsIGNiLCBjYkVuZCwgY2JFcnIpO1xyXG4gICAgICB9XHJcbiAgICB9ZWxzZSB7XHJcbiAgICAgIHRoaXMuY2h1bmsoYmFzZVVybCwgc3JjU3RhdGUuY2ksIChjY0J1ZnMsb3JnRnJhbWVMZW5ndGgpID0+IHtcclxuICAgICAgICBpZiAoY2NCdWZzKSB7XHJcbiAgICAgICAgICB0aGlzLl9jdXJyQ2kgPSBzcmNTdGF0ZS5jaTtcclxuICAgICAgICAgIHRoaXMuX2NjQ2FjaGUgPSBjY0J1ZnM7XHJcblxyXG4gICAgICAgICAgdGhpcy5fZmlsbEJ1ZnMoY2NCdWZzLCBvcmdGcmFtZUxlbmd0aCx0cmdTdGF0ZSwgc3JjU3RhdGUpO1xyXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKCdJbmRleGVkRGJBdWRpb0J1ZmZlcjo6ZmlsbEJ1ZnMgZnJhbWVMZW46ICcrZnJhbWVMZW4pO1xyXG4gICAgICAgICAgaWYgKHRyZ1N0YXRlLmZyYW1lTGVuID09PSAwKSB7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZygnSW5kZXhlZERiQXVkaW9CdWZmZXI6OmZpbGxCdWZzIChmcmFtZWxlbj09MCkgY2FsbDogY2JlbmQgJytmaWxsZWQpO1xyXG4gICAgICAgICAgICBjYkVuZCh0cmdTdGF0ZS5maWxsZWQpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5maWxsQnVmcyhiYXNlVXJsLG9yZ0ZyYW1lTGVuLHRyZ1N0YXRlLCBzcmNTdGF0ZSwgY2IsIGNiRW5kLCBjYkVycik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZygnSW5kZXhlZERiQXVkaW9CdWZmZXI6OmZpbGxCdWZzIChjaHVuayBub3QgZm91bmQpIGNhbGw6IGNiZW5kICcrZmlsbGVkKTtcclxuICAgICAgICAgIGNiRW5kKHRyZ1N0YXRlLmZpbGxlZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCAoZXJyKSA9PiB7XHJcbiAgICAgICAgY2JFcnIoZXJyKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgZnJhbWVzT2JzKGZyYW1lUG9zOm51bWJlcixmcmFtZUxlbjpudW1iZXIsYnVmczpGbG9hdDMyQXJyYXlbXSk6T2JzZXJ2YWJsZTxudW1iZXI+e1xyXG5cclxuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTxudW1iZXI+KChzdWJzY3JpYmVyKT0+e1xyXG4gICAgICAvLyBQb3NpdGlvbmluZ1xyXG4gICAgICBsZXQgbmV3Q2k9TWF0aC5mbG9vcihmcmFtZVBvcy90aGlzLl9uZXRBYi5jaHVua0ZyYW1lTGVuKTtcclxuICAgICAgaWYobmV3Q2khPT10aGlzLl9jdXJyQ2kpe1xyXG4gICAgICAgIHRoaXMuX2N1cnJDaT1uZXdDaTtcclxuICAgICAgICB0aGlzLl9jY0NhY2hlPW51bGw7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IHNyY0ZyYW1lUG9zPW5ld0NpKnRoaXMuX25ldEFiLmNodW5rRnJhbWVMZW47XHJcbiAgICAgIGxldCB0cmdTdGF0ZT17ZnJhbWVQb3M6ZnJhbWVQb3MsZnJhbWVMZW46ZnJhbWVMZW4sdHJnQnVmczpidWZzLGZpbGxlZDowfTtcclxuICAgICAgbGV0IHNyY1N0YXRlPXtvcmdTcmNGcmFtZVBvczowLHNyY0ZyYW1lUG9zOnNyY0ZyYW1lUG9zLGNpOm5ld0NpLGNjUG9zOjAsY2NGaWxsZWQ6MH07XHJcbiAgICAgIHRoaXMuZmlsbEJ1ZnModGhpcy5fbmV0QWIuYmFzZVVybCx0aGlzLl9uZXRBYi5vcmdGZXRjaENodW5rRnJhbWVMZW4sdHJnU3RhdGUsc3JjU3RhdGUsKHZhbCk9Pnt9LChmaWxsZWQ6bnVtYmVyKT0+e1xyXG4gICAgICAgIHN1YnNjcmliZXIubmV4dChmaWxsZWQpO1xyXG4gICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcclxuICAgICAgfSxlcnIgPT4ge1xyXG4gICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyKTtcclxuICAgICAgfSlcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY2xvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jdXJyQ2k9MDtcclxuICAgIHRoaXMuX2NjQ2FjaGU9bnVsbDtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBOZXRBdWRpb0lucHV0U3RyZWFtIGltcGxlbWVudHMgQXN5bmNGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbXtcclxuXHJcbiAgcHJpdmF0ZSBmcmFtZVBvczpudW1iZXI9MDtcclxuICBwcml2YXRlIG5ldEFiU3RyOk5ldFJhbmRvbUFjY2Vzc0F1ZGlvU3RyZWFtO1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbmV0QWI6TmV0QXVkaW9CdWZmZXIpIHtcclxuICAgICAgdGhpcy5uZXRBYlN0cj1uZXcgTmV0UmFuZG9tQWNjZXNzQXVkaW9TdHJlYW0obmV0QWIpO1xyXG4gIH1cclxuXHJcbiAgY2xvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLm5ldEFiU3RyLmNsb3NlKCk7XHJcbiAgfVxyXG5cclxuICByZWFkT2JzKGJ1ZmZlcnM6IEFycmF5PEZsb2F0MzJBcnJheT4pOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xyXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPG51bWJlcj4oc3Vic2NyPT4ge1xyXG4gICAgICBpZiAoYnVmZmVycyAmJiBidWZmZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBsZXQgZmwgPSBidWZmZXJzWzBdLmxlbmd0aDtcclxuICAgICAgICB0aGlzLm5ldEFiU3RyLmZyYW1lc09icyh0aGlzLmZyYW1lUG9zLCBmbCwgYnVmZmVycykuc3Vic2NyaWJlKHtcclxuICAgICAgICAgIG5leHQ6IChyZWFkKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZnJhbWVQb3MgKz0gcmVhZDtcclxuICAgICAgICAgICAgc3Vic2NyLm5leHQocmVhZCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgICAgc3Vic2NyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgICAgc3Vic2NyLmVycm9yKGVycik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgc3Vic2NyLm5leHQoMCk7XHJcbiAgICAgICAgc3Vic2NyLmNvbXBsZXRlKCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2tpcEZyYW1lcyhuOiBudW1iZXIpOnZvaWQge1xyXG4gICAgdGhpcy5mcmFtZVBvcys9bjtcclxuICB9XHJcblxyXG5cclxufVxyXG4iXX0=
@@ -38,9 +38,15 @@ export class AudioClip {
38
38
  }
39
39
  }
40
40
  removeSelectionObserver(selectionObserver) {
41
- this.selectionObservers = this.selectionObservers.filter((obs) => { obs !== selectionObserver; });
41
+ this.selectionObservers = this.selectionObservers.filter((obs) => obs !== selectionObserver);
42
42
  }
43
43
  }
44
+ // export interface Reader {
45
+ // read(data: Blob): AudioClip;
46
+ // }
47
+ // export interface Writer {
48
+ // write(audioData: AudioClip): Blob;
49
+ // }
44
50
  export class Selection {
45
51
  constructor(sampleRate, startFrame, endFrame) {
46
52
  this._sampleRate = sampleRate;
@@ -72,4 +78,4 @@ export class Selection {
72
78
  return "Selection: from: " + this.leftFrame + " to: " + this.rightFrame + " frame. Refers to sample rate :" + this._sampleRate;
73
79
  }
74
80
  }
75
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc2lzdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2F1ZGlvL3BlcnNpc3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxNQUFNLE9BQU8sU0FBUztJQU1wQixZQUFvQixnQkFBZ0M7UUFBaEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFnQjtRQUo1QyxlQUFVLEdBQWdCLElBQUksQ0FBQztRQUN6QixnQkFBVyxHQUFtQixJQUFJLENBQUM7UUFLL0MsSUFBSSxDQUFDLGtCQUFrQixHQUFDLElBQUksS0FBSyxFQUErQixDQUFBO0lBQ2xFLENBQUM7SUFFRCxJQUFJLGVBQWU7UUFDakIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBSSxTQUFTLENBQUMsS0FBcUI7UUFDakMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsNENBQTRDO1FBQzVDLDRDQUE0QztRQUM1QyxvQ0FBb0M7UUFDcEMsY0FBYztRQUNkLE1BQU07UUFDTixLQUFJLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBQztZQUN4QyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7U0FDYjtJQUNILENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksVUFBVSxDQUFDLEtBQXdCO1FBQ3JDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxpQkFBNkMsRUFBQyxJQUFJLEdBQUMsS0FBSztRQUMzRSxJQUFJLGdCQUFnQixHQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUMsRUFBRSxDQUFBLENBQUMsR0FBRyxLQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQTtRQUNuRixJQUFHLENBQUMsZ0JBQWdCLEVBQUU7WUFDcEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1NBQ2hEO1FBQ0QsSUFBRyxJQUFJLEVBQUM7WUFDTixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQTtTQUN4QjtJQUNILENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxpQkFBNkM7UUFDbkUsSUFBSSxDQUFDLGtCQUFrQixHQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUMsRUFBRSxHQUFDLEdBQUcsS0FBRyxpQkFBaUIsQ0FBQSxDQUFBLENBQUMsQ0FBQyxDQUFBO0lBQzFGLENBQUM7Q0FDRjtBQVNELE1BQU0sT0FBTyxTQUFTO0lBS3BCLFlBQVksVUFBaUIsRUFBQyxVQUFpQixFQUFDLFFBQWU7UUFDN0QsSUFBSSxDQUFDLFdBQVcsR0FBQyxVQUFVLENBQUM7UUFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBQyxVQUFVLENBQUE7UUFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBQyxRQUFRLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBQ0QsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFDRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQTtJQUNqRixDQUFDO0lBQ0QsSUFBSSxVQUFVO1FBQ1osT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFBO0lBQ2pGLENBQUM7SUFFRCxNQUFNLENBQUMsY0FBdUM7UUFDNUMsSUFBRyxjQUFjLEVBQUU7WUFDakIsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksY0FBYyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLGNBQWMsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDM0o7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxtQkFBbUIsR0FBQyxJQUFJLENBQUMsU0FBUyxHQUFDLE9BQU8sR0FBQyxJQUFJLENBQUMsVUFBVSxHQUFDLGlDQUFpQyxHQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDdkgsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtMZXZlbEluZm9zfSBmcm9tIFwiLi9kc3AvbGV2ZWxfbWVhc3VyZVwiO1xyXG5pbXBvcnQge0F1ZGlvRGF0YUhvbGRlcn0gZnJvbSBcIi4vYXVkaW9fZGF0YV9ob2xkZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBBdWRpb0NsaXAge1xyXG5cclxuICBwcml2YXRlIF9zZWxlY3Rpb246U2VsZWN0aW9ufG51bGw9bnVsbDtcclxuICAgICAgICBwcml2YXRlIF9sZXZlbEluZm9zOkxldmVsSW5mb3MgfCBudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSBzZWxlY3Rpb25PYnNlcnZlcnM6QXJyYXk8KGF1ZGlvQ2xpcDpBdWRpb0NsaXApPT52b2lkPjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfYXVkaW9EYXRhSG9sZGVyOkF1ZGlvRGF0YUhvbGRlcikge1xyXG5cclxuICAgIHRoaXMuc2VsZWN0aW9uT2JzZXJ2ZXJzPW5ldyBBcnJheTwoYXVkaW9DbGlwOkF1ZGlvQ2xpcCk9PnZvaWQ+KClcclxuICB9XHJcblxyXG4gIGdldCBhdWRpb0RhdGFIb2xkZXIoKTogQXVkaW9EYXRhSG9sZGVyIHtcclxuICAgIHJldHVybiB0aGlzLl9hdWRpb0RhdGFIb2xkZXI7XHJcbiAgfVxyXG5cclxuICBnZXQgc2VsZWN0aW9uKCk6IFNlbGVjdGlvbnxudWxse1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbjtcclxuICB9XHJcblxyXG4gIHNldCBzZWxlY3Rpb24odmFsdWU6IFNlbGVjdGlvbnxudWxsKSB7XHJcbiAgICB0aGlzLl9zZWxlY3Rpb24gPSB2YWx1ZTtcclxuICAgIC8vIGxldCBvYnNDbnQ9dGhpcy5zZWxlY3Rpb25PYnNlcnZlcnMubGVuZ3RoXHJcbiAgICAvLyB0aGlzLnNlbGVjdGlvbk9ic2VydmVycy5mb3JFYWNoKChvYnMpPT4ge1xyXG4gICAgLy8gICBjb25zb2xlLmxvZyhcIkNhbGxpbmcgb2JzZXJ2ZXJcIilcclxuICAgIC8vICAgb2JzKHRoaXMpXHJcbiAgICAvLyB9KTtcclxuICAgIGZvcihsZXQgc2VsT2JzIG9mIHRoaXMuc2VsZWN0aW9uT2JzZXJ2ZXJzKXtcclxuICAgICAgc2VsT2JzKHRoaXMpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbGV2ZWxJbmZvcygpOiBMZXZlbEluZm9zIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fbGV2ZWxJbmZvcztcclxuICB9XHJcblxyXG4gIHNldCBsZXZlbEluZm9zKHZhbHVlOiBMZXZlbEluZm9zIHwgbnVsbCkge1xyXG4gICAgdGhpcy5fbGV2ZWxJbmZvcyA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgYWRkU2VsZWN0aW9uT2JzZXJ2ZXIoc2VsZWN0aW9uT2JzZXJ2ZXI6KGF1ZGlvQ2xpcDpBdWRpb0NsaXApPT52b2lkLGluaXQ9ZmFsc2Upe1xyXG4gICAgbGV0IG9ic0FscmVhZHlJbkxpc3Q9dGhpcy5zZWxlY3Rpb25PYnNlcnZlcnMuZmluZCgob2JzKT0+KG9icz09PXNlbGVjdGlvbk9ic2VydmVyKSlcclxuICAgIGlmKCFvYnNBbHJlYWR5SW5MaXN0KSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uT2JzZXJ2ZXJzLnB1c2goc2VsZWN0aW9uT2JzZXJ2ZXIpXHJcbiAgICB9XHJcbiAgICBpZihpbml0KXtcclxuICAgICAgc2VsZWN0aW9uT2JzZXJ2ZXIodGhpcylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZVNlbGVjdGlvbk9ic2VydmVyKHNlbGVjdGlvbk9ic2VydmVyOihhdWRpb0NsaXA6QXVkaW9DbGlwKT0+dm9pZCl7XHJcbiAgICB0aGlzLnNlbGVjdGlvbk9ic2VydmVycz10aGlzLnNlbGVjdGlvbk9ic2VydmVycy5maWx0ZXIoKG9icyk9PntvYnMhPT1zZWxlY3Rpb25PYnNlcnZlcn0pXHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRlciB7XHJcbiAgcmVhZChkYXRhOiBCbG9iKTogQXVkaW9DbGlwO1xyXG59XHJcbmV4cG9ydCBpbnRlcmZhY2UgV3JpdGVyIHtcclxuICB3cml0ZShhdWRpb0RhdGE6IEF1ZGlvQ2xpcCk6IEJsb2I7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBTZWxlY3Rpb257XHJcbiAgcHJpdmF0ZSBfc2FtcGxlUmF0ZTpudW1iZXI7XHJcbiAgcHJpdmF0ZSBfc3RhcnRGcmFtZTpudW1iZXI7XHJcbiAgcHJpdmF0ZSBfZW5kRnJhbWU6bnVtYmVyO1xyXG5cclxuICBjb25zdHJ1Y3RvcihzYW1wbGVSYXRlOm51bWJlcixzdGFydEZyYW1lOm51bWJlcixlbmRGcmFtZTpudW1iZXIpe1xyXG4gICAgdGhpcy5fc2FtcGxlUmF0ZT1zYW1wbGVSYXRlO1xyXG4gICAgdGhpcy5fc3RhcnRGcmFtZT1zdGFydEZyYW1lXHJcbiAgICB0aGlzLl9lbmRGcmFtZT1lbmRGcmFtZTtcclxuICB9XHJcblxyXG4gIGdldCBzYW1wbGVSYXRlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2FtcGxlUmF0ZTtcclxuICB9XHJcbiAgZ2V0IGVuZEZyYW1lKCk6bnVtYmVye1xyXG4gICAgcmV0dXJuIHRoaXMuX2VuZEZyYW1lO1xyXG4gIH1cclxuICBnZXQgc3RhcnRGcmFtZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0YXJ0RnJhbWU7XHJcbiAgfVxyXG5cclxuICBnZXQgbGVmdEZyYW1lKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKHRoaXMuX3N0YXJ0RnJhbWUgPD0gdGhpcy5fZW5kRnJhbWUpID8gdGhpcy5fc3RhcnRGcmFtZSA6IHRoaXMuX2VuZEZyYW1lXHJcbiAgfVxyXG4gIGdldCByaWdodEZyYW1lKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gKHRoaXMuX3N0YXJ0RnJhbWUgPD0gdGhpcy5fZW5kRnJhbWUpID8gdGhpcy5fZW5kRnJhbWUgOiB0aGlzLl9zdGFydEZyYW1lXHJcbiAgfVxyXG5cclxuICBlcXVhbHMob3RoZXJTZWxlY3Rpb246U2VsZWN0aW9ufG51bGx8dW5kZWZpbmVkKTpib29sZWFue1xyXG4gICAgaWYob3RoZXJTZWxlY3Rpb24pIHtcclxuICAgICAgcmV0dXJuICh0aGlzLl9zYW1wbGVSYXRlID09IG90aGVyU2VsZWN0aW9uLl9zYW1wbGVSYXRlICYmIHRoaXMuX3N0YXJ0RnJhbWUgPT09IG90aGVyU2VsZWN0aW9uLl9zdGFydEZyYW1lICYmIHRoaXMuX2VuZEZyYW1lID09PSBvdGhlclNlbGVjdGlvbi5fZW5kRnJhbWUpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9TdHJpbmcoKXtcclxuICAgIHJldHVybiBcIlNlbGVjdGlvbjogZnJvbTogXCIrdGhpcy5sZWZ0RnJhbWUrXCIgdG86IFwiK3RoaXMucmlnaHRGcmFtZStcIiBmcmFtZS4gUmVmZXJzIHRvIHNhbXBsZSByYXRlIDpcIit0aGlzLl9zYW1wbGVSYXRlO1xyXG4gIH1cclxufVxyXG5cclxuXHJcbiJdfQ==
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVyc2lzdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2F1ZGlvL3BlcnNpc3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxNQUFNLE9BQU8sU0FBUztJQU1wQixZQUFvQixnQkFBZ0M7UUFBaEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFnQjtRQUo1QyxlQUFVLEdBQWdCLElBQUksQ0FBQztRQUN6QixnQkFBVyxHQUFtQixJQUFJLENBQUM7UUFLL0MsSUFBSSxDQUFDLGtCQUFrQixHQUFDLElBQUksS0FBSyxFQUErQixDQUFBO0lBQ2xFLENBQUM7SUFFRCxJQUFJLGVBQWU7UUFDakIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBSSxTQUFTLENBQUMsS0FBcUI7UUFDakMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsNENBQTRDO1FBQzVDLDRDQUE0QztRQUM1QyxvQ0FBb0M7UUFDcEMsY0FBYztRQUNkLE1BQU07UUFDTixLQUFJLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBQztZQUN4QyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7U0FDYjtJQUNILENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksVUFBVSxDQUFDLEtBQXdCO1FBQ3JDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQzNCLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxpQkFBNkMsRUFBQyxJQUFJLEdBQUMsS0FBSztRQUMzRSxJQUFJLGdCQUFnQixHQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUMsRUFBRSxDQUFBLENBQUMsR0FBRyxLQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQTtRQUNuRixJQUFHLENBQUMsZ0JBQWdCLEVBQUU7WUFDcEIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1NBQ2hEO1FBQ0QsSUFBRyxJQUFJLEVBQUM7WUFDTixpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQTtTQUN4QjtJQUNILENBQUM7SUFFRCx1QkFBdUIsQ0FBQyxpQkFBNkM7UUFDbkUsSUFBSSxDQUFDLGtCQUFrQixHQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUMsRUFBRSxDQUFBLEdBQUcsS0FBRyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7Q0FDRjtBQUVELDRCQUE0QjtBQUM1QixpQ0FBaUM7QUFDakMsSUFBSTtBQUNKLDRCQUE0QjtBQUM1Qix1Q0FBdUM7QUFDdkMsSUFBSTtBQUVKLE1BQU0sT0FBTyxTQUFTO0lBS3BCLFlBQVksVUFBaUIsRUFBQyxVQUFpQixFQUFDLFFBQWU7UUFDN0QsSUFBSSxDQUFDLFdBQVcsR0FBQyxVQUFVLENBQUM7UUFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBQyxVQUFVLENBQUE7UUFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBQyxRQUFRLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBQ0QsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFDRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQTtJQUNqRixDQUFDO0lBQ0QsSUFBSSxVQUFVO1FBQ1osT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFBO0lBQ2pGLENBQUM7SUFFRCxNQUFNLENBQUMsY0FBdUM7UUFDNUMsSUFBRyxjQUFjLEVBQUU7WUFDakIsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksY0FBYyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLGNBQWMsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDM0o7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxtQkFBbUIsR0FBQyxJQUFJLENBQUMsU0FBUyxHQUFDLE9BQU8sR0FBQyxJQUFJLENBQUMsVUFBVSxHQUFDLGlDQUFpQyxHQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDdkgsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtMZXZlbEluZm9zfSBmcm9tIFwiLi9kc3AvbGV2ZWxfbWVhc3VyZVwiO1xyXG5pbXBvcnQge0F1ZGlvRGF0YUhvbGRlcn0gZnJvbSBcIi4vYXVkaW9fZGF0YV9ob2xkZXJcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBBdWRpb0NsaXAge1xyXG5cclxuICBwcml2YXRlIF9zZWxlY3Rpb246U2VsZWN0aW9ufG51bGw9bnVsbDtcclxuICAgICAgICBwcml2YXRlIF9sZXZlbEluZm9zOkxldmVsSW5mb3MgfCBudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSBzZWxlY3Rpb25PYnNlcnZlcnM6QXJyYXk8KGF1ZGlvQ2xpcDpBdWRpb0NsaXApPT52b2lkPjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfYXVkaW9EYXRhSG9sZGVyOkF1ZGlvRGF0YUhvbGRlcikge1xyXG5cclxuICAgIHRoaXMuc2VsZWN0aW9uT2JzZXJ2ZXJzPW5ldyBBcnJheTwoYXVkaW9DbGlwOkF1ZGlvQ2xpcCk9PnZvaWQ+KClcclxuICB9XHJcblxyXG4gIGdldCBhdWRpb0RhdGFIb2xkZXIoKTogQXVkaW9EYXRhSG9sZGVyIHtcclxuICAgIHJldHVybiB0aGlzLl9hdWRpb0RhdGFIb2xkZXI7XHJcbiAgfVxyXG5cclxuICBnZXQgc2VsZWN0aW9uKCk6IFNlbGVjdGlvbnxudWxse1xyXG4gICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbjtcclxuICB9XHJcblxyXG4gIHNldCBzZWxlY3Rpb24odmFsdWU6IFNlbGVjdGlvbnxudWxsKSB7XHJcbiAgICB0aGlzLl9zZWxlY3Rpb24gPSB2YWx1ZTtcclxuICAgIC8vIGxldCBvYnNDbnQ9dGhpcy5zZWxlY3Rpb25PYnNlcnZlcnMubGVuZ3RoXHJcbiAgICAvLyB0aGlzLnNlbGVjdGlvbk9ic2VydmVycy5mb3JFYWNoKChvYnMpPT4ge1xyXG4gICAgLy8gICBjb25zb2xlLmxvZyhcIkNhbGxpbmcgb2JzZXJ2ZXJcIilcclxuICAgIC8vICAgb2JzKHRoaXMpXHJcbiAgICAvLyB9KTtcclxuICAgIGZvcihsZXQgc2VsT2JzIG9mIHRoaXMuc2VsZWN0aW9uT2JzZXJ2ZXJzKXtcclxuICAgICAgc2VsT2JzKHRoaXMpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgbGV2ZWxJbmZvcygpOiBMZXZlbEluZm9zIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fbGV2ZWxJbmZvcztcclxuICB9XHJcblxyXG4gIHNldCBsZXZlbEluZm9zKHZhbHVlOiBMZXZlbEluZm9zIHwgbnVsbCkge1xyXG4gICAgdGhpcy5fbGV2ZWxJbmZvcyA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgYWRkU2VsZWN0aW9uT2JzZXJ2ZXIoc2VsZWN0aW9uT2JzZXJ2ZXI6KGF1ZGlvQ2xpcDpBdWRpb0NsaXApPT52b2lkLGluaXQ9ZmFsc2Upe1xyXG4gICAgbGV0IG9ic0FscmVhZHlJbkxpc3Q9dGhpcy5zZWxlY3Rpb25PYnNlcnZlcnMuZmluZCgob2JzKT0+KG9icz09PXNlbGVjdGlvbk9ic2VydmVyKSlcclxuICAgIGlmKCFvYnNBbHJlYWR5SW5MaXN0KSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uT2JzZXJ2ZXJzLnB1c2goc2VsZWN0aW9uT2JzZXJ2ZXIpXHJcbiAgICB9XHJcbiAgICBpZihpbml0KXtcclxuICAgICAgc2VsZWN0aW9uT2JzZXJ2ZXIodGhpcylcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZVNlbGVjdGlvbk9ic2VydmVyKHNlbGVjdGlvbk9ic2VydmVyOihhdWRpb0NsaXA6QXVkaW9DbGlwKT0+dm9pZCl7XHJcbiAgICB0aGlzLnNlbGVjdGlvbk9ic2VydmVycz10aGlzLnNlbGVjdGlvbk9ic2VydmVycy5maWx0ZXIoKG9icyk9Pm9icyE9PXNlbGVjdGlvbk9ic2VydmVyKTtcclxuICB9XHJcbn1cclxuXHJcbi8vIGV4cG9ydCBpbnRlcmZhY2UgUmVhZGVyIHtcclxuLy8gICByZWFkKGRhdGE6IEJsb2IpOiBBdWRpb0NsaXA7XHJcbi8vIH1cclxuLy8gZXhwb3J0IGludGVyZmFjZSBXcml0ZXIge1xyXG4vLyAgIHdyaXRlKGF1ZGlvRGF0YTogQXVkaW9DbGlwKTogQmxvYjtcclxuLy8gfVxyXG5cclxuZXhwb3J0IGNsYXNzIFNlbGVjdGlvbntcclxuICBwcml2YXRlIHJlYWRvbmx5IF9zYW1wbGVSYXRlOm51bWJlcjtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9zdGFydEZyYW1lOm51bWJlcjtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9lbmRGcmFtZTpudW1iZXI7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHNhbXBsZVJhdGU6bnVtYmVyLHN0YXJ0RnJhbWU6bnVtYmVyLGVuZEZyYW1lOm51bWJlcil7XHJcbiAgICB0aGlzLl9zYW1wbGVSYXRlPXNhbXBsZVJhdGU7XHJcbiAgICB0aGlzLl9zdGFydEZyYW1lPXN0YXJ0RnJhbWVcclxuICAgIHRoaXMuX2VuZEZyYW1lPWVuZEZyYW1lO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNhbXBsZVJhdGUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9zYW1wbGVSYXRlO1xyXG4gIH1cclxuICBnZXQgZW5kRnJhbWUoKTpudW1iZXJ7XHJcbiAgICByZXR1cm4gdGhpcy5fZW5kRnJhbWU7XHJcbiAgfVxyXG4gIGdldCBzdGFydEZyYW1lKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fc3RhcnRGcmFtZTtcclxuICB9XHJcblxyXG4gIGdldCBsZWZ0RnJhbWUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAodGhpcy5fc3RhcnRGcmFtZSA8PSB0aGlzLl9lbmRGcmFtZSkgPyB0aGlzLl9zdGFydEZyYW1lIDogdGhpcy5fZW5kRnJhbWVcclxuICB9XHJcbiAgZ2V0IHJpZ2h0RnJhbWUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiAodGhpcy5fc3RhcnRGcmFtZSA8PSB0aGlzLl9lbmRGcmFtZSkgPyB0aGlzLl9lbmRGcmFtZSA6IHRoaXMuX3N0YXJ0RnJhbWVcclxuICB9XHJcblxyXG4gIGVxdWFscyhvdGhlclNlbGVjdGlvbjpTZWxlY3Rpb258bnVsbHx1bmRlZmluZWQpOmJvb2xlYW57XHJcbiAgICBpZihvdGhlclNlbGVjdGlvbikge1xyXG4gICAgICByZXR1cm4gKHRoaXMuX3NhbXBsZVJhdGUgPT0gb3RoZXJTZWxlY3Rpb24uX3NhbXBsZVJhdGUgJiYgdGhpcy5fc3RhcnRGcmFtZSA9PT0gb3RoZXJTZWxlY3Rpb24uX3N0YXJ0RnJhbWUgJiYgdGhpcy5fZW5kRnJhbWUgPT09IG90aGVyU2VsZWN0aW9uLl9lbmRGcmFtZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICB0b1N0cmluZygpe1xyXG4gICAgcmV0dXJuIFwiU2VsZWN0aW9uOiBmcm9tOiBcIit0aGlzLmxlZnRGcmFtZStcIiB0bzogXCIrdGhpcy5yaWdodEZyYW1lK1wiIGZyYW1lLiBSZWZlcnMgdG8gc2FtcGxlIHJhdGUgOlwiK3RoaXMuX3NhbXBsZVJhdGU7XHJcbiAgfVxyXG59XHJcblxyXG5cclxuIl19