speechrecorderng 3.6.0 → 3.8.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.
- package/esm2022/lib/action/action.mjs +73 -0
- package/{esm2020 → esm2022}/lib/audio/array_audio_buffer.mjs +163 -163
- package/{esm2020 → esm2022}/lib/audio/array_audio_buffer_input_stream.mjs +85 -85
- package/{esm2020 → esm2022}/lib/audio/array_audio_buffer_random_access_stream.mjs +15 -15
- package/esm2022/lib/audio/audio_data_holder.mjs +264 -0
- package/{esm2020 → esm2022}/lib/audio/audio_display.mjs +93 -93
- package/{esm2020 → esm2022}/lib/audio/audio_player.mjs +213 -213
- package/esm2022/lib/audio/capture/capture.mjs +855 -0
- package/esm2022/lib/audio/context.mjs +79 -0
- package/{esm2020 → esm2022}/lib/audio/dsp/level_measure.mjs +515 -515
- package/{esm2020 → esm2022}/lib/audio/format.mjs +16 -16
- package/esm2022/lib/audio/impl/wavformat.mjs +6 -0
- package/{esm2020 → esm2022}/lib/audio/impl/wavreader.mjs +133 -133
- package/esm2022/lib/audio/impl/wavwriter.mjs +105 -0
- package/esm2022/lib/audio/inddb_audio_buffer.mjs +508 -0
- package/{esm2020 → esm2022}/lib/audio/io/stream.mjs +58 -58
- package/esm2022/lib/audio/net_audio_buffer.mjs +293 -0
- package/{esm2020 → esm2022}/lib/audio/persistor.mjs +80 -80
- package/{esm2020 → esm2022}/lib/audio/playback/array_audio_buffer_source_node.mjs +125 -125
- package/esm2022/lib/audio/playback/audio_source_node.mjs +18 -0
- package/esm2022/lib/audio/playback/audio_source_worklet_module_loader.mjs +167 -0
- package/{esm2020 → esm2022}/lib/audio/playback/inddb_audio_buffer_source_node.mjs +166 -166
- package/{esm2020 → esm2022}/lib/audio/playback/net_audio_buffer_source_node.mjs +217 -217
- package/esm2022/lib/audio/playback/player.mjs +402 -0
- package/esm2022/lib/audio/ui/audio_canvas_layer_comp.mjs +347 -0
- package/{esm2020 → esm2022}/lib/audio/ui/audio_display_control.mjs +65 -65
- package/{esm2020 → esm2022}/lib/audio/ui/audio_display_scroll_pane.mjs +139 -139
- package/{esm2020 → esm2022}/lib/audio/ui/audiosignal.mjs +524 -524
- package/{esm2020 → esm2022}/lib/audio/ui/common.mjs +18 -18
- package/esm2022/lib/audio/ui/container.mjs +414 -0
- package/{esm2020 → esm2022}/lib/audio/ui/livelevel.mjs +352 -352
- package/esm2022/lib/audio/ui/scroll_pane_horizontal.mjs +11 -0
- package/esm2022/lib/audio/ui/sonagram.mjs +900 -0
- package/esm2022/lib/db/inddb.mjs +120 -0
- package/esm2022/lib/dsp/utils.mjs +48 -0
- package/{esm2020 → esm2022}/lib/io/BinaryReader.mjs +84 -84
- package/esm2022/lib/io/BinaryWriter.mjs +74 -0
- package/{esm2020 → esm2022}/lib/io/stream.mjs +258 -258
- package/{esm2020 → esm2022}/lib/math/2d/geometry.mjs +27 -27
- package/esm2022/lib/math/complex.mjs +58 -0
- package/{esm2020 → esm2022}/lib/math/dft.mjs +195 -195
- package/{esm2020 → esm2022}/lib/media/utils.mjs +13 -13
- package/esm2022/lib/net/uploader.mjs +367 -0
- package/{esm2020 → esm2022}/lib/recorder_component.mjs +64 -64
- package/esm2022/lib/speechrecorder/project/project.mjs +49 -0
- package/esm2022/lib/speechrecorder/project/project.service.mjs +64 -0
- package/{esm2020 → esm2022}/lib/speechrecorder/recording.mjs +123 -123
- package/esm2022/lib/speechrecorder/recordings/basic_recording.service.mjs +218 -0
- package/esm2022/lib/speechrecorder/recordings/recordings.service.mjs +1014 -0
- package/{esm2020 → esm2022}/lib/speechrecorder/script/script.mjs +114 -114
- package/{esm2020 → esm2022}/lib/speechrecorder/script/script.service.mjs +47 -47
- package/esm2022/lib/speechrecorder/session/audiorecorder.mjs +1179 -0
- package/esm2022/lib/speechrecorder/session/basicrecorder.mjs +668 -0
- package/esm2022/lib/speechrecorder/session/controlpanel.mjs +416 -0
- package/{esm2020 → esm2022}/lib/speechrecorder/session/item.mjs +29 -29
- package/{esm2020 → esm2022}/lib/speechrecorder/session/progress.mjs +69 -69
- package/{esm2020 → esm2022}/lib/speechrecorder/session/prompting.mjs +571 -571
- package/{esm2020 → esm2022}/lib/speechrecorder/session/recorder_combi_pane.mjs +65 -65
- package/esm2022/lib/speechrecorder/session/recording_file_cache.mjs +195 -0
- package/{esm2020 → esm2022}/lib/speechrecorder/session/recording_list.mjs +103 -103
- package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +63 -63
- package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +51 -51
- package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +104 -104
- package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +381 -381
- package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file.mjs +67 -67
- package/esm2022/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +288 -0
- package/{esm2020 → esm2022}/lib/speechrecorder/session/session.mjs +1 -1
- package/esm2022/lib/speechrecorder/session/session.service.mjs +69 -0
- package/{esm2020 → esm2022}/lib/speechrecorder/session/session_finished_dialog.mjs +29 -29
- package/esm2022/lib/speechrecorder/session/sessionmanager.mjs +1386 -0
- package/{esm2020 → esm2022}/lib/speechrecorder/session/warning_bar.mjs +28 -28
- package/{esm2020 → esm2022}/lib/speechrecorder/spruploader.mjs +22 -22
- package/{esm2020 → esm2022}/lib/speechrecorder/startstopsignal/startstopsignal.mjs +1 -1
- package/esm2022/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +57 -0
- package/{esm2020 → esm2022}/lib/speechrecorderng.component.mjs +388 -388
- package/{esm2020 → esm2022}/lib/speechrecorderng.module.mjs +100 -100
- package/{esm2020 → esm2022}/lib/spr.config.mjs +26 -26
- package/{esm2020 → esm2022}/lib/spr.module.version.mjs +2 -2
- package/{esm2020 → esm2022}/lib/ui/canvas_layer_comp.mjs +38 -38
- package/{esm2020 → esm2022}/lib/ui/message_dialog.mjs +30 -30
- package/esm2022/lib/ui/recordingitem_display.mjs +253 -0
- package/{esm2020 → esm2022}/lib/ui/responsive_component.mjs +24 -24
- package/{esm2020 → esm2022}/lib/utils/scrollIntoViewToBottom.mjs +23 -23
- package/esm2022/lib/utils/ua-parser.mjs +190 -0
- package/esm2022/lib/utils/utils.mjs +105 -0
- package/esm2022/lib/utils/wake_lock.mjs +114 -0
- package/{esm2020 → esm2022}/lib/utils/wake_lock_media.mjs +1 -1
- package/{esm2020 → esm2022}/public-api.mjs +33 -33
- package/{esm2020 → esm2022}/speechrecorderng.mjs +4 -4
- package/{fesm2020 → fesm2022}/speechrecorderng.mjs +16518 -16454
- package/fesm2022/speechrecorderng.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/action/action.d.ts +27 -27
- package/lib/audio/array_audio_buffer.d.ts +31 -31
- package/lib/audio/array_audio_buffer_input_stream.d.ts +14 -14
- package/lib/audio/array_audio_buffer_random_access_stream.d.ts +9 -9
- package/lib/audio/audio_data_holder.d.ts +84 -84
- package/lib/audio/audio_display.d.ts +36 -36
- package/lib/audio/audio_player.d.ts +47 -47
- package/lib/audio/capture/capture.d.ts +67 -67
- package/lib/audio/context.d.ts +6 -6
- package/lib/audio/dsp/level_measure.d.ts +60 -60
- package/lib/audio/format.d.ts +11 -11
- package/lib/audio/impl/wavformat.d.ts +5 -5
- package/lib/audio/impl/wavreader.d.ts +16 -16
- package/lib/audio/impl/wavwriter.d.ts +13 -13
- package/lib/audio/inddb_audio_buffer.d.ts +68 -68
- package/lib/audio/io/stream.d.ts +28 -28
- package/lib/audio/net_audio_buffer.d.ts +57 -57
- package/lib/audio/persistor.d.ts +29 -29
- package/lib/audio/playback/array_audio_buffer_source_node.d.ts +18 -18
- package/lib/audio/playback/audio_source_node.d.ts +10 -10
- package/lib/audio/playback/audio_source_worklet_module_loader.d.ts +4 -4
- package/lib/audio/playback/inddb_audio_buffer_source_node.d.ts +21 -21
- package/lib/audio/playback/net_audio_buffer_source_node.d.ts +27 -27
- package/lib/audio/playback/player.d.ts +65 -65
- package/lib/audio/ui/audio_canvas_layer_comp.d.ts +68 -68
- package/lib/audio/ui/audio_display_control.d.ts +25 -25
- package/lib/audio/ui/audio_display_scroll_pane.d.ts +26 -26
- package/lib/audio/ui/audiosignal.d.ts +30 -30
- package/lib/audio/ui/common.d.ts +11 -11
- package/lib/audio/ui/container.d.ts +63 -63
- package/lib/audio/ui/livelevel.d.ts +60 -60
- package/lib/audio/ui/scroll_pane_horizontal.d.ts +5 -5
- package/lib/audio/ui/sonagram.d.ts +37 -37
- package/lib/db/inddb.d.ts +21 -21
- package/lib/dsp/utils.d.ts +19 -19
- package/lib/io/BinaryReader.d.ts +18 -18
- package/lib/io/BinaryWriter.d.ts +15 -15
- package/lib/io/stream.d.ts +59 -59
- package/lib/math/2d/geometry.d.ts +18 -18
- package/lib/math/complex.d.ts +17 -17
- package/lib/math/dft.d.ts +22 -22
- package/lib/media/utils.d.ts +3 -3
- package/lib/net/uploader.d.ts +81 -81
- package/lib/recorder_component.d.ts +16 -16
- package/lib/speechrecorder/project/project.d.ts +59 -59
- package/lib/speechrecorder/project/project.service.d.ts +21 -21
- package/lib/speechrecorder/recording.d.ts +51 -51
- package/lib/speechrecorder/recordings/basic_recording.service.d.ts +27 -27
- package/lib/speechrecorder/recordings/recordings.service.d.ts +48 -48
- package/lib/speechrecorder/script/script.d.ts +80 -79
- package/lib/speechrecorder/script/script.service.d.ts +16 -16
- package/lib/speechrecorder/session/audiorecorder.d.ts +122 -122
- package/lib/speechrecorder/session/basicrecorder.d.ts +139 -139
- package/lib/speechrecorder/session/controlpanel.d.ts +109 -107
- package/lib/speechrecorder/session/item.d.ts +12 -12
- package/lib/speechrecorder/session/progress.d.ts +17 -17
- package/lib/speechrecorder/session/prompting.d.ts +121 -121
- package/lib/speechrecorder/session/recorder_combi_pane.d.ts +32 -32
- package/lib/speechrecorder/session/recording_file_cache.d.ts +33 -33
- package/lib/speechrecorder/session/recording_list.d.ts +24 -24
- package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +15 -15
- package/lib/speechrecorder/session/recordingfile/recording-file-navi.component.d.ts +20 -20
- package/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.d.ts +31 -31
- package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +55 -55
- package/lib/speechrecorder/session/recordingfile/recording-file.d.ts +7 -7
- package/lib/speechrecorder/session/recordingfile/recordingfile-service.d.ts +24 -24
- package/lib/speechrecorder/session/session.d.ts +15 -15
- package/lib/speechrecorder/session/session.service.d.ts +20 -20
- package/lib/speechrecorder/session/session_finished_dialog.d.ts +10 -10
- package/lib/speechrecorder/session/sessionmanager.d.ts +129 -123
- package/lib/speechrecorder/session/warning_bar.d.ts +8 -8
- package/lib/speechrecorder/spruploader.d.ts +11 -11
- package/lib/speechrecorder/startstopsignal/startstopsignal.d.ts +10 -10
- package/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.d.ts +11 -11
- package/lib/speechrecorderng.component.d.ts +61 -61
- package/lib/speechrecorderng.module.d.ts +56 -56
- package/lib/spr.config.d.ts +17 -17
- package/lib/spr.module.version.d.ts +1 -1
- package/lib/ui/canvas_layer_comp.d.ts +13 -13
- package/lib/ui/message_dialog.d.ts +10 -10
- package/lib/ui/recordingitem_display.d.ts +84 -84
- package/lib/ui/responsive_component.d.ts +9 -9
- package/lib/utils/scrollIntoViewToBottom.d.ts +9 -9
- package/lib/utils/ua-parser.d.ts +43 -43
- package/lib/utils/utils.d.ts +19 -19
- package/lib/utils/wake_lock.d.ts +23 -23
- package/lib/utils/wake_lock_media.d.ts +1 -1
- package/package.json +17 -23
- package/public-api.d.ts +33 -33
- package/esm2020/lib/action/action.mjs +0 -73
- package/esm2020/lib/audio/audio_data_holder.mjs +0 -264
- package/esm2020/lib/audio/capture/capture.mjs +0 -855
- package/esm2020/lib/audio/context.mjs +0 -79
- package/esm2020/lib/audio/impl/wavformat.mjs +0 -6
- package/esm2020/lib/audio/impl/wavwriter.mjs +0 -105
- package/esm2020/lib/audio/inddb_audio_buffer.mjs +0 -508
- package/esm2020/lib/audio/net_audio_buffer.mjs +0 -293
- package/esm2020/lib/audio/playback/audio_source_node.mjs +0 -18
- package/esm2020/lib/audio/playback/audio_source_worklet_module_loader.mjs +0 -167
- package/esm2020/lib/audio/playback/player.mjs +0 -402
- package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +0 -347
- package/esm2020/lib/audio/ui/container.mjs +0 -414
- package/esm2020/lib/audio/ui/scroll_pane_horizontal.mjs +0 -11
- package/esm2020/lib/audio/ui/sonagram.mjs +0 -900
- package/esm2020/lib/db/inddb.mjs +0 -120
- package/esm2020/lib/dsp/utils.mjs +0 -48
- package/esm2020/lib/io/BinaryWriter.mjs +0 -74
- package/esm2020/lib/math/complex.mjs +0 -58
- package/esm2020/lib/net/uploader.mjs +0 -367
- package/esm2020/lib/speechrecorder/project/project.mjs +0 -49
- package/esm2020/lib/speechrecorder/project/project.service.mjs +0 -64
- package/esm2020/lib/speechrecorder/recordings/basic_recording.service.mjs +0 -216
- package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +0 -1014
- package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +0 -1179
- package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +0 -666
- package/esm2020/lib/speechrecorder/session/controlpanel.mjs +0 -409
- package/esm2020/lib/speechrecorder/session/recording_file_cache.mjs +0 -195
- package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +0 -288
- package/esm2020/lib/speechrecorder/session/session.service.mjs +0 -69
- package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +0 -1333
- package/esm2020/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +0 -57
- package/esm2020/lib/ui/recordingitem_display.mjs +0 -253
- package/esm2020/lib/utils/ua-parser.mjs +0 -190
- package/esm2020/lib/utils/utils.mjs +0 -105
- package/esm2020/lib/utils/wake_lock.mjs +0 -114
- package/fesm2015/speechrecorderng.mjs +0 -17708
- package/fesm2015/speechrecorderng.mjs.map +0 -1
- package/fesm2020/speechrecorderng.mjs.map +0 -1
|
@@ -1,259 +1,259 @@
|
|
|
1
|
-
import { Observable } from "rxjs";
|
|
2
|
-
export class EditFloat32ArrayInputStream {
|
|
3
|
-
constructor(_srcInputStream, offset = 0, length) {
|
|
4
|
-
this._srcInputStream = _srcInputStream;
|
|
5
|
-
this.offset = offset;
|
|
6
|
-
this.length = length;
|
|
7
|
-
this.framePos = 0;
|
|
8
|
-
this.readFrames = 0;
|
|
9
|
-
if (this.offset < 0) {
|
|
10
|
-
throw Error('Parameter offset must be undefined or greater or equal zero.');
|
|
11
|
-
}
|
|
12
|
-
if (this.length !== undefined && this.length < 0) {
|
|
13
|
-
throw Error('Parameter length must be undefined or greater or equal zero.');
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
skipToOffset() {
|
|
17
|
-
if (this.framePos == 0 && this.offset > 0) {
|
|
18
|
-
this._srcInputStream.skipFrames(this.offset);
|
|
19
|
-
this.framePos += this.offset;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
read(buffers) {
|
|
23
|
-
this.skipToOffset();
|
|
24
|
-
let read = 0;
|
|
25
|
-
if (this.length === undefined) {
|
|
26
|
-
read = this._srcInputStream.read(buffers);
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
if (buffers.length > 0) {
|
|
30
|
-
let bufsCh0 = buffers[0];
|
|
31
|
-
let bufsLen = bufsCh0.length;
|
|
32
|
-
let avail = this.length - this.readFrames;
|
|
33
|
-
if (avail > 0) {
|
|
34
|
-
if (avail > bufsLen) {
|
|
35
|
-
read = this._srcInputStream.read(buffers);
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
// temporary buffers required
|
|
39
|
-
let tmpBufs = new Array(buffers.length);
|
|
40
|
-
for (let ch = 0; ch < buffers.length; ch++) {
|
|
41
|
-
tmpBufs[ch] = new Float32Array(avail);
|
|
42
|
-
}
|
|
43
|
-
read = this._srcInputStream.read(tmpBufs);
|
|
44
|
-
for (let ch = 0; ch < buffers.length; ch++) {
|
|
45
|
-
buffers[ch].set(tmpBufs[ch]);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
this.readFrames += read;
|
|
52
|
-
this.framePos += read;
|
|
53
|
-
return read;
|
|
54
|
-
}
|
|
55
|
-
skipFrames(n) {
|
|
56
|
-
this.skipToOffset();
|
|
57
|
-
if (this.length === undefined) {
|
|
58
|
-
this._srcInputStream.skipFrames(n);
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
let avail = this.length - this.readFrames;
|
|
62
|
-
if (avail > 0) {
|
|
63
|
-
if (avail >= n) {
|
|
64
|
-
this._srcInputStream.skipFrames(n);
|
|
65
|
-
this.readFrames += n;
|
|
66
|
-
this.framePos += n;
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
throw Error('Tried to skip out of bounds.');
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
close() {
|
|
75
|
-
this._srcInputStream.close();
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
export class AsyncEditFloat32ArrayInputStream {
|
|
79
|
-
constructor(_srcInputStream, offset = 0, length) {
|
|
80
|
-
this._srcInputStream = _srcInputStream;
|
|
81
|
-
this.offset = offset;
|
|
82
|
-
this.length = length;
|
|
83
|
-
this.framePos = 0;
|
|
84
|
-
this.readFrames = 0;
|
|
85
|
-
if (this.offset < 0) {
|
|
86
|
-
throw Error('Parameter offset must be undefined or greater or equal zero.');
|
|
87
|
-
}
|
|
88
|
-
if (this.length !== undefined && this.length < 0) {
|
|
89
|
-
throw Error('Parameter length must be undefined or greater or equal zero.');
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
skipToOffset() {
|
|
93
|
-
if (this.framePos == 0 && this.offset > 0) {
|
|
94
|
-
this._srcInputStream.skipFrames(this.offset);
|
|
95
|
-
this.framePos += this.offset;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
readObs(buffers) {
|
|
99
|
-
return new Observable(subscriber => {
|
|
100
|
-
this.skipToOffset();
|
|
101
|
-
if (this.length === undefined) {
|
|
102
|
-
this._srcInputStream.readObs(buffers).subscribe(subscriber);
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
if (buffers.length > 0) {
|
|
106
|
-
let bufsCh0 = buffers[0];
|
|
107
|
-
let bufsLen = bufsCh0.length;
|
|
108
|
-
let avail = this.length - this.readFrames;
|
|
109
|
-
if (avail > 0) {
|
|
110
|
-
if (avail > bufsLen) {
|
|
111
|
-
this._srcInputStream.readObs(buffers).subscribe({
|
|
112
|
-
next: (read) => {
|
|
113
|
-
this.readFrames += read;
|
|
114
|
-
this.framePos += read;
|
|
115
|
-
subscriber.next(read);
|
|
116
|
-
}, complete: () => {
|
|
117
|
-
subscriber.complete();
|
|
118
|
-
}
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
else {
|
|
122
|
-
// temporary buffers required
|
|
123
|
-
let tmpBufs = new Array(buffers.length);
|
|
124
|
-
for (let ch = 0; ch < buffers.length; ch++) {
|
|
125
|
-
tmpBufs[ch] = new Float32Array(avail);
|
|
126
|
-
}
|
|
127
|
-
this._srcInputStream.readObs(tmpBufs).subscribe({
|
|
128
|
-
next: (read) => {
|
|
129
|
-
for (let ch = 0; ch < buffers.length; ch++) {
|
|
130
|
-
buffers[ch].set(tmpBufs[ch]);
|
|
131
|
-
}
|
|
132
|
-
this.readFrames += read;
|
|
133
|
-
this.framePos += read;
|
|
134
|
-
subscriber.next(read);
|
|
135
|
-
}, complete: () => {
|
|
136
|
-
subscriber.complete();
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
// end of stream
|
|
143
|
-
subscriber.next(0);
|
|
144
|
-
subscriber.complete();
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
else {
|
|
148
|
-
subscriber.next(0);
|
|
149
|
-
subscriber.complete();
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
skipFrames(n) {
|
|
155
|
-
this.skipToOffset();
|
|
156
|
-
if (this.length === undefined) {
|
|
157
|
-
this._srcInputStream.skipFrames(n);
|
|
158
|
-
}
|
|
159
|
-
else {
|
|
160
|
-
let avail = this.length - this.readFrames;
|
|
161
|
-
if (avail > 0) {
|
|
162
|
-
if (avail >= n) {
|
|
163
|
-
this._srcInputStream.skipFrames(n);
|
|
164
|
-
this.readFrames += n;
|
|
165
|
-
this.framePos += n;
|
|
166
|
-
}
|
|
167
|
-
else {
|
|
168
|
-
throw Error('Tried to skip out of bounds.');
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
close() {
|
|
174
|
-
this._srcInputStream.close();
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
export class Float32ArrayChunkerOutStream {
|
|
178
|
-
constructor(outStream) {
|
|
179
|
-
this.outStream = outStream;
|
|
180
|
-
this.bufs = new Array();
|
|
181
|
-
this._channels = 0;
|
|
182
|
-
this._chunkSize = 0;
|
|
183
|
-
this.filled = 0;
|
|
184
|
-
this.receivedFrames = 0;
|
|
185
|
-
this.sentFrames = 0;
|
|
186
|
-
}
|
|
187
|
-
createBuffers() {
|
|
188
|
-
this.bufs = new Array(this._channels);
|
|
189
|
-
for (let ch = 0; ch < this._channels; ch++) {
|
|
190
|
-
this.bufs[ch] = new Float32Array(this._chunkSize);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
set chunkSize(chunkSize) {
|
|
194
|
-
this._chunkSize = chunkSize;
|
|
195
|
-
this.createBuffers();
|
|
196
|
-
}
|
|
197
|
-
get chunkSize() {
|
|
198
|
-
return this._chunkSize;
|
|
199
|
-
}
|
|
200
|
-
set channels(channels) {
|
|
201
|
-
this._channels = channels;
|
|
202
|
-
this.createBuffers();
|
|
203
|
-
}
|
|
204
|
-
get channels() {
|
|
205
|
-
return this._channels;
|
|
206
|
-
}
|
|
207
|
-
available() {
|
|
208
|
-
return this._chunkSize - this.filled;
|
|
209
|
-
}
|
|
210
|
-
write(buffers) {
|
|
211
|
-
let copied = 0;
|
|
212
|
-
if (buffers.length > 0) {
|
|
213
|
-
let buffersLen = buffers[0].length;
|
|
214
|
-
this.receivedFrames += buffersLen;
|
|
215
|
-
let avail = buffersLen;
|
|
216
|
-
// Fill out buffers until all values copied
|
|
217
|
-
while (avail > 0) {
|
|
218
|
-
let toFill = this._chunkSize - this.filled;
|
|
219
|
-
if (toFill > avail) {
|
|
220
|
-
toFill = avail;
|
|
221
|
-
}
|
|
222
|
-
let sliceEnd = copied + toFill;
|
|
223
|
-
// Firefox on Android sends only the first channel
|
|
224
|
-
for (let ch = 0; ch < buffersLen; ch++) {
|
|
225
|
-
if (buffers[ch]) {
|
|
226
|
-
let cpPrt = buffers[ch].slice(copied, sliceEnd);
|
|
227
|
-
let buf = this.bufs[ch];
|
|
228
|
-
buf.set(cpPrt, this.filled);
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
copied += toFill;
|
|
232
|
-
avail -= toFill;
|
|
233
|
-
this.filled += toFill;
|
|
234
|
-
if (this.filled == this._chunkSize) {
|
|
235
|
-
this.outStream.write(this.bufs);
|
|
236
|
-
this.sentFrames += this.filled;
|
|
237
|
-
this.filled = 0;
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
return copied;
|
|
242
|
-
}
|
|
243
|
-
flush() {
|
|
244
|
-
if (this.filled > 0) {
|
|
245
|
-
let restBufs = new Array(this._channels);
|
|
246
|
-
for (let ch = 0; ch < this._channels; ch++) {
|
|
247
|
-
restBufs[ch] = this.bufs[ch].slice(0, this.filled);
|
|
248
|
-
}
|
|
249
|
-
this.outStream.write(restBufs);
|
|
250
|
-
this.outStream.flush();
|
|
251
|
-
this.sentFrames += this.filled;
|
|
252
|
-
this.filled = 0;
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
close() {
|
|
256
|
-
this.outStream.close();
|
|
257
|
-
}
|
|
258
|
-
}
|
|
1
|
+
import { Observable } from "rxjs";
|
|
2
|
+
export class EditFloat32ArrayInputStream {
|
|
3
|
+
constructor(_srcInputStream, offset = 0, length) {
|
|
4
|
+
this._srcInputStream = _srcInputStream;
|
|
5
|
+
this.offset = offset;
|
|
6
|
+
this.length = length;
|
|
7
|
+
this.framePos = 0;
|
|
8
|
+
this.readFrames = 0;
|
|
9
|
+
if (this.offset < 0) {
|
|
10
|
+
throw Error('Parameter offset must be undefined or greater or equal zero.');
|
|
11
|
+
}
|
|
12
|
+
if (this.length !== undefined && this.length < 0) {
|
|
13
|
+
throw Error('Parameter length must be undefined or greater or equal zero.');
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
skipToOffset() {
|
|
17
|
+
if (this.framePos == 0 && this.offset > 0) {
|
|
18
|
+
this._srcInputStream.skipFrames(this.offset);
|
|
19
|
+
this.framePos += this.offset;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
read(buffers) {
|
|
23
|
+
this.skipToOffset();
|
|
24
|
+
let read = 0;
|
|
25
|
+
if (this.length === undefined) {
|
|
26
|
+
read = this._srcInputStream.read(buffers);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
if (buffers.length > 0) {
|
|
30
|
+
let bufsCh0 = buffers[0];
|
|
31
|
+
let bufsLen = bufsCh0.length;
|
|
32
|
+
let avail = this.length - this.readFrames;
|
|
33
|
+
if (avail > 0) {
|
|
34
|
+
if (avail > bufsLen) {
|
|
35
|
+
read = this._srcInputStream.read(buffers);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
// temporary buffers required
|
|
39
|
+
let tmpBufs = new Array(buffers.length);
|
|
40
|
+
for (let ch = 0; ch < buffers.length; ch++) {
|
|
41
|
+
tmpBufs[ch] = new Float32Array(avail);
|
|
42
|
+
}
|
|
43
|
+
read = this._srcInputStream.read(tmpBufs);
|
|
44
|
+
for (let ch = 0; ch < buffers.length; ch++) {
|
|
45
|
+
buffers[ch].set(tmpBufs[ch]);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
this.readFrames += read;
|
|
52
|
+
this.framePos += read;
|
|
53
|
+
return read;
|
|
54
|
+
}
|
|
55
|
+
skipFrames(n) {
|
|
56
|
+
this.skipToOffset();
|
|
57
|
+
if (this.length === undefined) {
|
|
58
|
+
this._srcInputStream.skipFrames(n);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
let avail = this.length - this.readFrames;
|
|
62
|
+
if (avail > 0) {
|
|
63
|
+
if (avail >= n) {
|
|
64
|
+
this._srcInputStream.skipFrames(n);
|
|
65
|
+
this.readFrames += n;
|
|
66
|
+
this.framePos += n;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
throw Error('Tried to skip out of bounds.');
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
close() {
|
|
75
|
+
this._srcInputStream.close();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
export class AsyncEditFloat32ArrayInputStream {
|
|
79
|
+
constructor(_srcInputStream, offset = 0, length) {
|
|
80
|
+
this._srcInputStream = _srcInputStream;
|
|
81
|
+
this.offset = offset;
|
|
82
|
+
this.length = length;
|
|
83
|
+
this.framePos = 0;
|
|
84
|
+
this.readFrames = 0;
|
|
85
|
+
if (this.offset < 0) {
|
|
86
|
+
throw Error('Parameter offset must be undefined or greater or equal zero.');
|
|
87
|
+
}
|
|
88
|
+
if (this.length !== undefined && this.length < 0) {
|
|
89
|
+
throw Error('Parameter length must be undefined or greater or equal zero.');
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
skipToOffset() {
|
|
93
|
+
if (this.framePos == 0 && this.offset > 0) {
|
|
94
|
+
this._srcInputStream.skipFrames(this.offset);
|
|
95
|
+
this.framePos += this.offset;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
readObs(buffers) {
|
|
99
|
+
return new Observable(subscriber => {
|
|
100
|
+
this.skipToOffset();
|
|
101
|
+
if (this.length === undefined) {
|
|
102
|
+
this._srcInputStream.readObs(buffers).subscribe(subscriber);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
if (buffers.length > 0) {
|
|
106
|
+
let bufsCh0 = buffers[0];
|
|
107
|
+
let bufsLen = bufsCh0.length;
|
|
108
|
+
let avail = this.length - this.readFrames;
|
|
109
|
+
if (avail > 0) {
|
|
110
|
+
if (avail > bufsLen) {
|
|
111
|
+
this._srcInputStream.readObs(buffers).subscribe({
|
|
112
|
+
next: (read) => {
|
|
113
|
+
this.readFrames += read;
|
|
114
|
+
this.framePos += read;
|
|
115
|
+
subscriber.next(read);
|
|
116
|
+
}, complete: () => {
|
|
117
|
+
subscriber.complete();
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
// temporary buffers required
|
|
123
|
+
let tmpBufs = new Array(buffers.length);
|
|
124
|
+
for (let ch = 0; ch < buffers.length; ch++) {
|
|
125
|
+
tmpBufs[ch] = new Float32Array(avail);
|
|
126
|
+
}
|
|
127
|
+
this._srcInputStream.readObs(tmpBufs).subscribe({
|
|
128
|
+
next: (read) => {
|
|
129
|
+
for (let ch = 0; ch < buffers.length; ch++) {
|
|
130
|
+
buffers[ch].set(tmpBufs[ch]);
|
|
131
|
+
}
|
|
132
|
+
this.readFrames += read;
|
|
133
|
+
this.framePos += read;
|
|
134
|
+
subscriber.next(read);
|
|
135
|
+
}, complete: () => {
|
|
136
|
+
subscriber.complete();
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
// end of stream
|
|
143
|
+
subscriber.next(0);
|
|
144
|
+
subscriber.complete();
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
subscriber.next(0);
|
|
149
|
+
subscriber.complete();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
skipFrames(n) {
|
|
155
|
+
this.skipToOffset();
|
|
156
|
+
if (this.length === undefined) {
|
|
157
|
+
this._srcInputStream.skipFrames(n);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
let avail = this.length - this.readFrames;
|
|
161
|
+
if (avail > 0) {
|
|
162
|
+
if (avail >= n) {
|
|
163
|
+
this._srcInputStream.skipFrames(n);
|
|
164
|
+
this.readFrames += n;
|
|
165
|
+
this.framePos += n;
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
throw Error('Tried to skip out of bounds.');
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
close() {
|
|
174
|
+
this._srcInputStream.close();
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
export class Float32ArrayChunkerOutStream {
|
|
178
|
+
constructor(outStream) {
|
|
179
|
+
this.outStream = outStream;
|
|
180
|
+
this.bufs = new Array();
|
|
181
|
+
this._channels = 0;
|
|
182
|
+
this._chunkSize = 0;
|
|
183
|
+
this.filled = 0;
|
|
184
|
+
this.receivedFrames = 0;
|
|
185
|
+
this.sentFrames = 0;
|
|
186
|
+
}
|
|
187
|
+
createBuffers() {
|
|
188
|
+
this.bufs = new Array(this._channels);
|
|
189
|
+
for (let ch = 0; ch < this._channels; ch++) {
|
|
190
|
+
this.bufs[ch] = new Float32Array(this._chunkSize);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
set chunkSize(chunkSize) {
|
|
194
|
+
this._chunkSize = chunkSize;
|
|
195
|
+
this.createBuffers();
|
|
196
|
+
}
|
|
197
|
+
get chunkSize() {
|
|
198
|
+
return this._chunkSize;
|
|
199
|
+
}
|
|
200
|
+
set channels(channels) {
|
|
201
|
+
this._channels = channels;
|
|
202
|
+
this.createBuffers();
|
|
203
|
+
}
|
|
204
|
+
get channels() {
|
|
205
|
+
return this._channels;
|
|
206
|
+
}
|
|
207
|
+
available() {
|
|
208
|
+
return this._chunkSize - this.filled;
|
|
209
|
+
}
|
|
210
|
+
write(buffers) {
|
|
211
|
+
let copied = 0;
|
|
212
|
+
if (buffers.length > 0) {
|
|
213
|
+
let buffersLen = buffers[0].length;
|
|
214
|
+
this.receivedFrames += buffersLen;
|
|
215
|
+
let avail = buffersLen;
|
|
216
|
+
// Fill out buffers until all values copied
|
|
217
|
+
while (avail > 0) {
|
|
218
|
+
let toFill = this._chunkSize - this.filled;
|
|
219
|
+
if (toFill > avail) {
|
|
220
|
+
toFill = avail;
|
|
221
|
+
}
|
|
222
|
+
let sliceEnd = copied + toFill;
|
|
223
|
+
// Firefox on Android sends only the first channel
|
|
224
|
+
for (let ch = 0; ch < buffersLen; ch++) {
|
|
225
|
+
if (buffers[ch]) {
|
|
226
|
+
let cpPrt = buffers[ch].slice(copied, sliceEnd);
|
|
227
|
+
let buf = this.bufs[ch];
|
|
228
|
+
buf.set(cpPrt, this.filled);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
copied += toFill;
|
|
232
|
+
avail -= toFill;
|
|
233
|
+
this.filled += toFill;
|
|
234
|
+
if (this.filled == this._chunkSize) {
|
|
235
|
+
this.outStream.write(this.bufs);
|
|
236
|
+
this.sentFrames += this.filled;
|
|
237
|
+
this.filled = 0;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return copied;
|
|
242
|
+
}
|
|
243
|
+
flush() {
|
|
244
|
+
if (this.filled > 0) {
|
|
245
|
+
let restBufs = new Array(this._channels);
|
|
246
|
+
for (let ch = 0; ch < this._channels; ch++) {
|
|
247
|
+
restBufs[ch] = this.bufs[ch].slice(0, this.filled);
|
|
248
|
+
}
|
|
249
|
+
this.outStream.write(restBufs);
|
|
250
|
+
this.outStream.flush();
|
|
251
|
+
this.sentFrames += this.filled;
|
|
252
|
+
this.filled = 0;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
close() {
|
|
256
|
+
this.outStream.close();
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
259
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2lvL3N0cmVhbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBY2hDLE1BQU0sT0FBTywyQkFBMkI7SUFHdEMsWUFBb0IsZUFBdUMsRUFBUyxTQUFjLENBQUMsRUFBUyxNQUF3QjtRQUFoRyxvQkFBZSxHQUFmLGVBQWUsQ0FBd0I7UUFBUyxXQUFNLEdBQU4sTUFBTSxDQUFTO1FBQVMsV0FBTSxHQUFOLE1BQU0sQ0FBa0I7UUFGNUcsYUFBUSxHQUFDLENBQUMsQ0FBQztRQUNYLGVBQVUsR0FBQyxDQUFDLENBQUM7UUFFbkIsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFDLENBQUMsRUFBQztZQUNkLE1BQU0sS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7U0FDL0U7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUcsU0FBUyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUMsQ0FBQyxFQUFDO1lBQzNDLE1BQU0sS0FBSyxDQUFDLDhEQUE4RCxDQUFDLENBQUM7U0FDN0U7SUFDSCxDQUFDO0lBRU8sWUFBWTtRQUNsQixJQUFHLElBQUksQ0FBQyxRQUFRLElBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUMsQ0FBQyxFQUFDO1lBQ25DLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM3QyxJQUFJLENBQUMsUUFBUSxJQUFFLElBQUksQ0FBQyxNQUFNLENBQUM7U0FDNUI7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLE9BQTRCO1FBQy9CLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLElBQUksR0FBQyxDQUFDLENBQUM7UUFDWCxJQUFHLElBQUksQ0FBQyxN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QUksQ0FBQyxDQUFDO29CQUNoQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUM7b0JBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2lCQUVqQjthQUNGO1NBQ0Y7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsS0FBSztRQUNILElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkIsSUFBSSxRQUFRLEdBQUcsSUFBSSxLQUFLLENBQWUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3ZELEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsRUFBRSxFQUFFO2dCQUMxQyxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNwRDtZQUNELElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1NBQ2pCO0lBQ0gsQ0FBQztJQUdELEtBQUs7UUFDSCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3pCLENBQUM7Q0FHRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSBcInJ4anNcIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRmxvYXQzMkFycmF5SW5wdXRTdHJlYW17XHJcbiAgcmVhZChidWZmZXJzOiBBcnJheTxGbG9hdDMyQXJyYXk+KTogbnVtYmVyO1xyXG4gIHNraXBGcmFtZXMobjpudW1iZXIpOnZvaWQ7XHJcbiAgY2xvc2UoKTp2b2lkO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEFzeW5jRmxvYXQzMkFycmF5SW5wdXRTdHJlYW17XHJcbiAgcmVhZE9icyhidWZmZXJzOiBBcnJheTxGbG9hdDMyQXJyYXk+KTpPYnNlcnZhYmxlPG51bWJlcj47XHJcbiAgc2tpcEZyYW1lcyhuOm51bWJlcik6dm9pZDtcclxuICBjbG9zZSgpOnZvaWQ7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBFZGl0RmxvYXQzMkFycmF5SW5wdXRTdHJlYW0gaW1wbGVtZW50cyBGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbXtcclxuICBwcml2YXRlIGZyYW1lUG9zPTA7XHJcbiAgcHJpdmF0ZSByZWFkRnJhbWVzPTA7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfc3JjSW5wdXRTdHJlYW06RmxvYXQzMkFycmF5SW5wdXRTdHJlYW0scHJpdmF0ZSBvZmZzZXQ6bnVtYmVyPTAscHJpdmF0ZSBsZW5ndGg/Om51bWJlcnx1bmRlZmluZWQpIHtcclxuICAgIGlmICh0aGlzLm9mZnNldDwwKXtcclxuICAgICAgICB0aHJvdyBFcnJvcignUGFyYW1ldGVyIG9mZnNldCBtdXN0IGJlIHVuZGVmaW5lZCBvciBncmVhdGVyIG9yIGVxdWFsIHplcm8uJyk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5sZW5ndGghPT11bmRlZmluZWQgJiYgdGhpcy5sZW5ndGg8MCl7XHJcbiAgICAgIHRocm93IEVycm9yKCdQYXJhbWV0ZXIgbGVuZ3RoIG11c3QgYmUgdW5kZWZpbmVkIG9yIGdyZWF0ZXIgb3IgZXF1YWwgemVyby4nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2tpcFRvT2Zmc2V0KCl7XHJcbiAgICBpZih0aGlzLmZyYW1lUG9zPT0wICYmIHRoaXMub2Zmc2V0PjApe1xyXG4gICAgICB0aGlzLl9zcmNJbnB1dFN0cmVhbS5za2lwRnJhbWVzKHRoaXMub2Zmc2V0KTtcclxuICAgICAgdGhpcy5mcmFtZVBvcys9dGhpcy5vZmZzZXQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWFkKGJ1ZmZlcnM6IEFycmF5PEZsb2F0MzJBcnJheT4pOiBudW1iZXJ7XHJcbiAgICB0aGlzLnNraXBUb09mZnNldCgpO1xyXG4gICAgbGV0IHJlYWQ9MDtcclxuICAgIGlmKHRoaXMubGVuZ3RoPT09dW5kZWZpbmVkKXtcclxuICAgICAgcmVhZCA9IHRoaXMuX3NyY0lucHV0U3RyZWFtLnJlYWQoYnVmZmVycyk7XHJcbiAgICB9ZWxzZSB7XHJcbiAgICAgIGlmIChidWZmZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBsZXQgYnVmc0NoMCA9IGJ1ZmZlcnNbMF07XHJcbiAgICAgICAgbGV0IGJ1ZnNMZW4gPSBidWZzQ2gwLmxlbmd0aDtcclxuICAgICAgICBsZXQgYXZhaWwgPSB0aGlzLmxlbmd0aCAtIHRoaXMucmVhZEZyYW1lcztcclxuICAgICAgICBpZiAoYXZhaWwgPiAwKSB7XHJcbiAgICAgICAgICBpZiAoYXZhaWwgPiBidWZzTGVuKSB7XHJcbiAgICAgICAgICAgIHJlYWQgPSB0aGlzLl9zcmNJbnB1dFN0cmVhbS5yZWFkKGJ1ZmZlcnMpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gdGVtcG9yYXJ5IGJ1ZmZlcnMgcmVxdWlyZWRcclxuICAgICAgICAgICAgbGV0IHRtcEJ1ZnMgPSBuZXcgQXJyYXk8RmxvYXQzMkFycmF5PihidWZmZXJzLmxlbmd0aCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBidWZmZXJzLmxlbmd0aDsgY2grKykge1xyXG4gICAgICAgICAgICAgIHRtcEJ1ZnNbY2hdID0gbmV3IEZsb2F0MzJBcnJheShhdmFpbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmVhZCA9IHRoaXMuX3NyY0lucHV0U3RyZWFtLnJlYWQodG1wQnVmcyk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBidWZmZXJzLmxlbmd0aDsgY2grKykge1xyXG4gICAgICAgICAgICAgIGJ1ZmZlcnNbY2hdLnNldCh0bXBCdWZzW2NoXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMucmVhZEZyYW1lcys9cmVhZDtcclxuICAgIHRoaXMuZnJhbWVQb3MrPXJlYWQ7XHJcbiAgICByZXR1cm4gcmVhZDtcclxuICB9XHJcblxyXG4gIHNraXBGcmFtZXMobjpudW1iZXIpOnZvaWR7XHJcbiAgICB0aGlzLnNraXBUb09mZnNldCgpO1xyXG4gICAgaWYodGhpcy5sZW5ndGg9PT11bmRlZmluZWQpe1xyXG4gICAgICB0aGlzLl9zcmNJbnB1dFN0cmVhbS5za2lwRnJhbWVzKG4pO1xyXG4gICAgfWVsc2Uge1xyXG4gICAgICBsZXQgYXZhaWwgPSB0aGlzLmxlbmd0aCAtIHRoaXMucmVhZEZyYW1lcztcclxuICAgICAgaWYgKGF2YWlsID4gMCkge1xyXG4gICAgICAgIGlmIChhdmFpbCA+PSBuKSB7XHJcbiAgICAgICAgICB0aGlzLl9zcmNJbnB1dFN0cmVhbS5za2lwRnJhbWVzKG4pO1xyXG4gICAgICAgICAgdGhpcy5yZWFkRnJhbWVzICs9IG47XHJcbiAgICAgICAgICB0aGlzLmZyYW1lUG9zICs9IG47XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRocm93IEVycm9yKCdUcmllZCB0byBza2lwIG91dCBvZiBib3VuZHMuJylcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsb3NlKCk6dm9pZHtcclxuICAgIHRoaXMuX3NyY0lucHV0U3RyZWFtLmNsb3NlKCk7XHJcbiAgfVxyXG59XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIEFzeW5jRWRpdEZsb2F0MzJBcnJheUlucHV0U3RyZWFtIGltcGxlbWVudHMgQXN5bmNGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbXtcclxuICBwcml2YXRlIGZyYW1lUG9zPTA7XHJcbiAgcHJpdmF0ZSByZWFkRnJhbWVzPTA7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfc3JjSW5wdXRTdHJlYW06QXN5bmNGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbSxwcml2YXRlIG9mZnNldDpudW1iZXI9MCxwcml2YXRlIGxlbmd0aD86bnVtYmVyfHVuZGVmaW5lZCkge1xyXG4gICAgaWYgKHRoaXMub2Zmc2V0PDApe1xyXG4gICAgICB0aHJvdyBFcnJvcignUGFyYW1ldGVyIG9mZnNldCBtdXN0IGJlIHVuZGVmaW5lZCBvciBncmVhdGVyIG9yIGVxdWFsIHplcm8uJyk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5sZW5ndGghPT11bmRlZmluZWQgJiYgdGhpcy5sZW5ndGg8MCl7XHJcbiAgICAgIHRocm93IEVycm9yKCdQYXJhbWV0ZXIgbGVuZ3RoIG11c3QgYmUgdW5kZWZpbmVkIG9yIGdyZWF0ZXIgb3IgZXF1YWwgemVyby4nKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2tpcFRvT2Zmc2V0KCl7XHJcbiAgICBpZih0aGlzLmZyYW1lUG9zPT0wICYmIHRoaXMub2Zmc2V0PjApe1xyXG4gICAgICB0aGlzLl9zcmNJbnB1dFN0cmVhbS5za2lwRnJhbWVzKHRoaXMub2Zmc2V0KTtcclxuICAgICAgdGhpcy5mcmFtZVBvcys9dGhpcy5vZmZzZXQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWFkT2JzKGJ1ZmZlcnM6IEFycmF5PEZsb2F0MzJBcnJheT4pOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xyXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlPG51bWJlcj4oc3Vic2NyaWJlcj0+e1xyXG4gICAgICB0aGlzLnNraXBUb09mZnNldCgpO1xyXG4gICAgICBpZih0aGlzLmxlbmd0aD09PXVuZGVmaW5lZCl7XHJcbiAgICAgICAgdGhpcy5fc3JjSW5wdXRTdHJlYW0ucmVhZE9icyhidWZmZXJzKS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7XHJcbiAgICAgIH1lbHNlIHtcclxuICAgICAgICBpZiAoYnVmZmVycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBsZXQgYnVmc0NoMCA9IGJ1ZmZlcnNbMF07XHJcbiAgICAgICAgICBsZXQgYnVmc0xlbiA9IGJ1ZnNDaDAubGVuZ3RoO1xyXG4gICAgICAgICAgbGV0IGF2YWlsID0gdGhpcy5sZW5ndGggLSB0aGlzLnJlYWRGcmFtZXM7XHJcbiAgICAgICAgICBpZiAoYXZhaWwgPiAwKSB7XHJcbiAgICAgICAgICAgIGlmIChhdmFpbCA+IGJ1ZnNMZW4pIHtcclxuICAgICAgICAgICAgICB0aGlzLl9zcmNJbnB1dFN0cmVhbS5yZWFkT2JzKGJ1ZmZlcnMpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgICBuZXh0OiAocmVhZCk9PntcclxuICAgICAgICAgICAgICAgICAgdGhpcy5yZWFkRnJhbWVzKz1yZWFkO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmZyYW1lUG9zKz1yZWFkO1xyXG4gICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQocmVhZCk7XHJcbiAgICAgICAgICAgICAgICB9LGNvbXBsZXRlOigpPT57XHJcbiAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIC8vIHRlbXBvcmFyeSBidWZmZXJzIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgbGV0IHRtcEJ1ZnMgPSBuZXcgQXJyYXk8RmxvYXQzMkFycmF5PihidWZmZXJzLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGJ1ZmZlcnMubGVuZ3RoOyBjaCsrKSB7XHJcbiAgICAgICAgICAgICAgICB0bXBCdWZzW2NoXSA9IG5ldyBGbG9hdDMyQXJyYXkoYXZhaWwpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0aGlzLl9zcmNJbnB1dFN0cmVhbS5yZWFkT2JzKHRtcEJ1ZnMpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgICBuZXh0OihyZWFkKT0+e1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGJ1ZmZlcnMubGVuZ3RoOyBjaCsrKSB7XHJcbiAgICAgICAgICAgICAgICAgIGJ1ZmZlcnNbY2hdLnNldCh0bXBCdWZzW2NoXSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWRGcmFtZXMrPXJlYWQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZyYW1lUG9zKz1yZWFkO1xyXG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHJlYWQpO1xyXG4gICAgICAgICAgICAgIH0sY29tcGxldGU6KCk9PntcclxuICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgLy8gZW5kIG9mIHN0cmVhbVxyXG4gICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoMCk7XHJcbiAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHN1YnNjcmliZXIubmV4dCgwKTtcclxuICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2tpcEZyYW1lcyhuOm51bWJlcik6dm9pZHtcclxuICAgIHRoaXMuc2tpcFRvT2Zmc2V0KCk7XHJcbiAgICBpZih0aGlzLmxlbmd0aD09PXVuZGVmaW5lZCl7XHJcbiAgICAgIHRoaXMuX3NyY0lucHV0U3RyZWFtLnNraXBGcmFtZXMobik7XHJcbiAgICB9ZWxzZSB7XHJcbiAgICAgIGxldCBhdmFpbCA9IHRoaXMubGVuZ3RoIC0gdGhpcy5yZWFkRnJhbWVzO1xyXG4gICAgICBpZiAoYXZhaWwgPiAwKSB7XHJcbiAgICAgICAgaWYgKGF2YWlsID49IG4pIHtcclxuICAgICAgICAgIHRoaXMuX3NyY0lucHV0U3RyZWFtLnNraXBGcmFtZXMobik7XHJcbiAgICAgICAgICB0aGlzLnJlYWRGcmFtZXMgKz0gbjtcclxuICAgICAgICAgIHRoaXMuZnJhbWVQb3MgKz0gbjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhyb3cgRXJyb3IoJ1RyaWVkIHRvIHNraXAgb3V0IG9mIGJvdW5kcy4nKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2xvc2UoKTp2b2lke1xyXG4gICAgdGhpcy5fc3JjSW5wdXRTdHJlYW0uY2xvc2UoKTtcclxuICB9XHJcblxyXG59XHJcblxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBGbG9hdDMyQXJyYXlPdXRTdHJlYW0ge1xyXG5cclxuICB3cml0ZShidWZmZXJzOiBBcnJheTxGbG9hdDMyQXJyYXk+KTogbnVtYmVyO1xyXG5cclxuICBmbHVzaCgpOiB2b2lkO1xyXG5cclxuICBjbG9zZSgpOiB2b2lkO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRmxvYXQzMkFycmF5Q2h1bmtlck91dFN0cmVhbSBpbXBsZW1lbnRzIEZsb2F0MzJBcnJheU91dFN0cmVhbSB7XHJcblxyXG4gIHByaXZhdGUgYnVmcyA9IG5ldyBBcnJheTxGbG9hdDMyQXJyYXk+KCk7XHJcbiAgcHJpdmF0ZSBmaWxsZWQ6IG51bWJlcjtcclxuXHJcbiAgcHJpdmF0ZSBfY2hhbm5lbHM6IG51bWJlcj0wO1xyXG4gIHByaXZhdGUgX2NodW5rU2l6ZTogbnVtYmVyPTA7XHJcblxyXG4gIHByaXZhdGUgcmVjZWl2ZWRGcmFtZXM6IG51bWJlcjtcclxuICBwcml2YXRlIHNlbnRGcmFtZXM6IG51bWJlcjtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBvdXRTdHJlYW06IEZsb2F0MzJBcnJheU91dFN0cmVhbSkge1xyXG4gICAgdGhpcy5maWxsZWQgPSAwO1xyXG4gICAgdGhpcy5yZWNlaXZlZEZyYW1lcyA9IDA7XHJcbiAgICB0aGlzLnNlbnRGcmFtZXMgPSAwO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGVCdWZmZXJzKCkge1xyXG4gICAgdGhpcy5idWZzID0gbmV3IEFycmF5PEZsb2F0MzJBcnJheT4odGhpcy5fY2hhbm5lbHMpO1xyXG4gICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IHRoaXMuX2NoYW5uZWxzOyBjaCsrKSB7XHJcbiAgICAgIHRoaXMuYnVmc1tjaF0gPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuX2NodW5rU2l6ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZXQgY2h1bmtTaXplKGNodW5rU2l6ZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9jaHVua1NpemUgPSBjaHVua1NpemU7XHJcbiAgICB0aGlzLmNyZWF0ZUJ1ZmZlcnMoKTtcclxuICB9XHJcblxyXG4gIGdldCBjaHVua1NpemUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jaHVua1NpemU7XHJcbiAgfVxyXG5cclxuICBzZXQgY2hhbm5lbHMoY2hhbm5lbHM6IG51bWJlcikge1xyXG4gICAgdGhpcy5fY2hhbm5lbHMgPSBjaGFubmVscztcclxuICAgIHRoaXMuY3JlYXRlQnVmZmVycygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNoYW5uZWxzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2hhbm5lbHM7XHJcbiAgfVxyXG5cclxuXHJcbiAgYXZhaWxhYmxlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2h1bmtTaXplLXRoaXMuZmlsbGVkO1xyXG4gIH1cclxuXHJcbiAgd3JpdGUoYnVmZmVyczogQXJyYXk8RmxvYXQzMkFycmF5Pik6IG51bWJlciB7XHJcblxyXG4gICAgbGV0IGNvcGllZCA9IDA7XHJcbiAgICBpZihidWZmZXJzLmxlbmd0aD4wKSB7XHJcbiAgICAgIGxldCBidWZmZXJzTGVuID0gYnVmZmVyc1swXS5sZW5ndGg7XHJcbiAgICAgIHRoaXMucmVjZWl2ZWRGcmFtZXMgKz0gYnVmZmVyc0xlbjtcclxuICAgICAgbGV0IGF2YWlsID0gYnVmZmVyc0xlbjtcclxuICAgICAgLy8gRmlsbCBvdXQgYnVmZmVycyB1bnRpbCBhbGwgdmFsdWVzIGNvcGllZFxyXG5cclxuICAgICAgd2hpbGUgKGF2YWlsID4gMCkge1xyXG4gICAgICAgIGxldCB0b0ZpbGwgPSB0aGlzLl9jaHVua1NpemUgLSB0aGlzLmZpbGxlZDtcclxuICAgICAgICBpZiAodG9GaWxsID4gYXZhaWwpIHtcclxuICAgICAgICAgIHRvRmlsbCA9IGF2YWlsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgc2xpY2VFbmQgPSBjb3BpZWQgKyB0b0ZpbGw7XHJcblxyXG4gICAgICAgIC8vIEZpcmVmb3ggb24gQW5kcm9pZCBzZW5kcyBvbmx5IHRoZSBmaXJzdCBjaGFubmVsXHJcbiAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGJ1ZmZlcnNMZW47IGNoKyspIHtcclxuICAgICAgICAgIGlmKGJ1ZmZlcnNbY2hdKSB7XHJcbiAgICAgICAgICAgIGxldCBjcFBydCA9IGJ1ZmZlcnNbY2hdLnNsaWNlKGNvcGllZCwgc2xpY2VFbmQpO1xyXG4gICAgICAgICAgICBsZXQgYnVmID0gdGhpcy5idWZzW2NoXTtcclxuICAgICAgICAgICAgYnVmLnNldChjcFBydCwgdGhpcy5maWxsZWQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb3BpZWQgKz0gdG9GaWxsO1xyXG4gICAgICAgIGF2YWlsIC09IHRvRmlsbDtcclxuICAgICAgICB0aGlzLmZpbGxlZCArPSB0b0ZpbGw7XHJcbiAgICAgICAgaWYgKHRoaXMuZmlsbGVkID09IHRoaXMuX2NodW5rU2l6ZSkge1xyXG4gICAgICAgICAgdGhpcy5vdXRTdHJlYW0ud3JpdGUodGhpcy5idWZzKTtcclxuICAgICAgICAgIHRoaXMuc2VudEZyYW1lcyArPSB0aGlzLmZpbGxlZDtcclxuICAgICAgICAgIHRoaXMuZmlsbGVkID0gMDtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY29waWVkO1xyXG4gIH1cclxuXHJcbiAgZmx1c2goKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5maWxsZWQgPiAwKSB7XHJcbiAgICAgIGxldCByZXN0QnVmcyA9IG5ldyBBcnJheTxGbG9hdDMyQXJyYXk+KHRoaXMuX2NoYW5uZWxzKTtcclxuICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IHRoaXMuX2NoYW5uZWxzOyBjaCsrKSB7XHJcbiAgICAgICAgcmVzdEJ1ZnNbY2hdID0gdGhpcy5idWZzW2NoXS5zbGljZSgwLCB0aGlzLmZpbGxlZCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5vdXRTdHJlYW0ud3JpdGUocmVzdEJ1ZnMpO1xyXG4gICAgICB0aGlzLm91dFN0cmVhbS5mbHVzaCgpO1xyXG4gICAgICB0aGlzLnNlbnRGcmFtZXMgKz0gdGhpcy5maWxsZWQ7XHJcbiAgICAgIHRoaXMuZmlsbGVkID0gMDtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBjbG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMub3V0U3RyZWFtLmNsb3NlKCk7XHJcbiAgfVxyXG5cclxuXHJcbn1cclxuIl19
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
export class Position {
|
|
2
|
-
constructor(left, top) {
|
|
3
|
-
this.left = left;
|
|
4
|
-
this.top = top;
|
|
5
|
-
}
|
|
6
|
-
toString() {
|
|
7
|
-
return this.left + "," + this.top;
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
export class Dimension {
|
|
11
|
-
constructor(width, height) {
|
|
12
|
-
this.width = width;
|
|
13
|
-
this.height = height;
|
|
14
|
-
}
|
|
15
|
-
toString() {
|
|
16
|
-
return this.width + "x" + this.height;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
export class Rectangle {
|
|
20
|
-
constructor(position, dimension) {
|
|
21
|
-
this.position = position;
|
|
22
|
-
this.dimension = dimension;
|
|
23
|
-
}
|
|
24
|
-
toString() {
|
|
25
|
-
return this.position + ":" + this.dimension;
|
|
26
|
-
}
|
|
27
|
-
}
|
|
1
|
+
export class Position {
|
|
2
|
+
constructor(left, top) {
|
|
3
|
+
this.left = left;
|
|
4
|
+
this.top = top;
|
|
5
|
+
}
|
|
6
|
+
toString() {
|
|
7
|
+
return this.left + "," + this.top;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
export class Dimension {
|
|
11
|
+
constructor(width, height) {
|
|
12
|
+
this.width = width;
|
|
13
|
+
this.height = height;
|
|
14
|
+
}
|
|
15
|
+
toString() {
|
|
16
|
+
return this.width + "x" + this.height;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export class Rectangle {
|
|
20
|
+
constructor(position, dimension) {
|
|
21
|
+
this.position = position;
|
|
22
|
+
this.dimension = dimension;
|
|
23
|
+
}
|
|
24
|
+
toString() {
|
|
25
|
+
return this.position + ":" + this.dimension;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
28
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvbWV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvbWF0aC8yZC9nZW9tZXRyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sUUFBUTtJQUNuQixZQUFtQixJQUFXLEVBQVEsR0FBVTtRQUE3QixTQUFJLEdBQUosSUFBSSxDQUFPO1FBQVEsUUFBRyxHQUFILEdBQUcsQ0FBTztJQUVoRCxDQUFDO0lBQ0QsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLElBQUksR0FBQyxHQUFHLEdBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQTtJQUMvQixDQUFDO0NBQ0Y7QUFHRCxNQUFNLE9BQU8sU0FBUztJQUNwQixZQUFtQixLQUFZLEVBQVEsTUFBYTtRQUFqQyxVQUFLLEdBQUwsS0FBSyxDQUFPO1FBQVEsV0FBTSxHQUFOLE1BQU0sQ0FBTztJQUVwRCxDQUFDO0lBQ0QsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssR0FBQyxHQUFHLEdBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQTtJQUNuQyxDQUFDO0NBQ0Y7QUFHRCxNQUFNLE9BQU8sU0FBUztJQUVwQixZQUFtQixRQUFpQixFQUFRLFNBQW1CO1FBQTVDLGFBQVEsR0FBUixRQUFRLENBQVM7UUFBUSxjQUFTLEdBQVQsU0FBUyxDQUFVO0lBRS9ELENBQUM7SUFDRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsUUFBUSxHQUFDLEdBQUcsR0FBQyxJQUFJLENBQUMsU0FBUyxDQUFBO0lBQ3pDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBQb3NpdGlvbntcclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbGVmdDpudW1iZXIscHVibGljIHRvcDpudW1iZXIpe1xyXG5cclxuICB9XHJcbiAgdG9TdHJpbmcoKTpzdHJpbmd7XHJcbiAgICByZXR1cm4gdGhpcy5sZWZ0K1wiLFwiK3RoaXMudG9wXHJcbiAgfVxyXG59XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIERpbWVuc2lvbiB7XHJcbiAgY29uc3RydWN0b3IocHVibGljIHdpZHRoOm51bWJlcixwdWJsaWMgaGVpZ2h0Om51bWJlcil7XHJcblxyXG4gIH1cclxuICB0b1N0cmluZygpOnN0cmluZ3tcclxuICAgIHJldHVybiB0aGlzLndpZHRoK1wieFwiK3RoaXMuaGVpZ2h0XHJcbiAgfVxyXG59XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFJlY3RhbmdsZXtcclxuXHJcbiAgY29uc3RydWN0b3IocHVibGljIHBvc2l0aW9uOlBvc2l0aW9uLHB1YmxpYyBkaW1lbnNpb246RGltZW5zaW9uKXtcclxuXHJcbiAgfVxyXG4gIHRvU3RyaW5nKCk6c3RyaW5ne1xyXG4gICAgcmV0dXJuIHRoaXMucG9zaXRpb24rXCI6XCIrdGhpcy5kaW1lbnNpb25cclxuICB9XHJcbn1cclxuIl19
|