speechrecorderng 3.10.13 → 3.11.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/README.md +1 -1
- package/fesm2022/speechrecorderng.mjs +204 -201
- package/fesm2022/speechrecorderng.mjs.map +1 -1
- package/lib/audio/ui/audio_canvas_layer_comp.d.ts +2 -2
- package/lib/spr.module.version.d.ts +1 -1
- package/lib/ui/canvas_layer_comp.d.ts +1 -1
- package/lib/ui/responsive_component.d.ts +1 -1
- package/package.json +13 -15
- package/esm2022/lib/action/action.mjs +0 -73
- package/esm2022/lib/audio/array_audio_buffer.mjs +0 -164
- package/esm2022/lib/audio/array_audio_buffer_input_stream.mjs +0 -86
- package/esm2022/lib/audio/array_audio_buffer_random_access_stream.mjs +0 -16
- package/esm2022/lib/audio/audio_data_holder.mjs +0 -264
- package/esm2022/lib/audio/audio_display.mjs +0 -118
- package/esm2022/lib/audio/audio_player.mjs +0 -238
- package/esm2022/lib/audio/capture/capture.mjs +0 -855
- package/esm2022/lib/audio/context.mjs +0 -79
- package/esm2022/lib/audio/dsp/level_measure.mjs +0 -517
- package/esm2022/lib/audio/format.mjs +0 -20
- package/esm2022/lib/audio/impl/wavformat.mjs +0 -7
- package/esm2022/lib/audio/impl/wavreader.mjs +0 -144
- package/esm2022/lib/audio/impl/wavwriter.mjs +0 -191
- package/esm2022/lib/audio/inddb_audio_buffer.mjs +0 -508
- package/esm2022/lib/audio/io/stream.mjs +0 -59
- package/esm2022/lib/audio/net_audio_buffer.mjs +0 -293
- package/esm2022/lib/audio/persistor.mjs +0 -81
- package/esm2022/lib/audio/playback/array_audio_buffer_source_node.mjs +0 -126
- package/esm2022/lib/audio/playback/audio_source_node.mjs +0 -18
- package/esm2022/lib/audio/playback/audio_source_worklet_module_loader.mjs +0 -167
- package/esm2022/lib/audio/playback/inddb_audio_buffer_source_node.mjs +0 -167
- package/esm2022/lib/audio/playback/net_audio_buffer_source_node.mjs +0 -218
- package/esm2022/lib/audio/playback/player.mjs +0 -402
- package/esm2022/lib/audio/ui/audio_canvas_layer_comp.mjs +0 -347
- package/esm2022/lib/audio/ui/audio_display_control.mjs +0 -150
- package/esm2022/lib/audio/ui/audio_display_scroll_pane.mjs +0 -146
- package/esm2022/lib/audio/ui/audiosignal.mjs +0 -533
- package/esm2022/lib/audio/ui/common.mjs +0 -19
- package/esm2022/lib/audio/ui/container.mjs +0 -414
- package/esm2022/lib/audio/ui/livelevel.mjs +0 -361
- package/esm2022/lib/audio/ui/scroll_pane_horizontal.mjs +0 -11
- package/esm2022/lib/audio/ui/sonagram.mjs +0 -900
- package/esm2022/lib/db/inddb.mjs +0 -120
- package/esm2022/lib/dsp/utils.mjs +0 -48
- package/esm2022/lib/environment/environment.defaults.mjs +0 -9
- package/esm2022/lib/io/BinaryReader.mjs +0 -93
- package/esm2022/lib/io/BinaryWriter.mjs +0 -80
- package/esm2022/lib/io/stream.mjs +0 -259
- package/esm2022/lib/math/2d/geometry.mjs +0 -28
- package/esm2022/lib/math/complex.mjs +0 -58
- package/esm2022/lib/math/dft.mjs +0 -196
- package/esm2022/lib/media/utils.mjs +0 -14
- package/esm2022/lib/net/uploader.mjs +0 -367
- package/esm2022/lib/recorder_component.mjs +0 -65
- package/esm2022/lib/speechrecorder/project/project.mjs +0 -54
- package/esm2022/lib/speechrecorder/project/project.service.mjs +0 -64
- package/esm2022/lib/speechrecorder/recording.mjs +0 -124
- package/esm2022/lib/speechrecorder/recordings/basic_recording.service.mjs +0 -221
- package/esm2022/lib/speechrecorder/recordings/recordings.service.mjs +0 -1014
- package/esm2022/lib/speechrecorder/script/script.mjs +0 -114
- package/esm2022/lib/speechrecorder/script/script.service.mjs +0 -47
- package/esm2022/lib/speechrecorder/session/audiorecorder.mjs +0 -1179
- package/esm2022/lib/speechrecorder/session/basicrecorder.mjs +0 -676
- package/esm2022/lib/speechrecorder/session/controlpanel.mjs +0 -416
- package/esm2022/lib/speechrecorder/session/item.mjs +0 -30
- package/esm2022/lib/speechrecorder/session/progress.mjs +0 -135
- package/esm2022/lib/speechrecorder/session/prompting.mjs +0 -639
- package/esm2022/lib/speechrecorder/session/recorder_combi_pane.mjs +0 -88
- package/esm2022/lib/speechrecorder/session/recording_file_cache.mjs +0 -195
- package/esm2022/lib/speechrecorder/session/recording_list.mjs +0 -188
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +0 -128
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +0 -114
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +0 -146
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +0 -424
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file.mjs +0 -68
- package/esm2022/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +0 -288
- package/esm2022/lib/speechrecorder/session/session.mjs +0 -2
- package/esm2022/lib/speechrecorder/session/session.service.mjs +0 -69
- package/esm2022/lib/speechrecorder/session/session_finished_dialog.mjs +0 -46
- package/esm2022/lib/speechrecorder/session/sessionmanager.mjs +0 -1385
- package/esm2022/lib/speechrecorder/session/warning_bar.mjs +0 -33
- package/esm2022/lib/speechrecorder/spruploader.mjs +0 -22
- package/esm2022/lib/speechrecorder/startstopsignal/startstopsignal.mjs +0 -2
- package/esm2022/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +0 -57
- package/esm2022/lib/speechrecorderng.component.mjs +0 -392
- package/esm2022/lib/speechrecorderng.module.mjs +0 -97
- package/esm2022/lib/spr.config.mjs +0 -27
- package/esm2022/lib/spr.module.version.mjs +0 -2
- package/esm2022/lib/ui/canvas_layer_comp.mjs +0 -38
- package/esm2022/lib/ui/intersection-observer.directive.mjs +0 -32
- package/esm2022/lib/ui/message_dialog.mjs +0 -51
- package/esm2022/lib/ui/recordingitem_display.mjs +0 -253
- package/esm2022/lib/ui/responsive_component.mjs +0 -24
- package/esm2022/lib/utils/scrollIntoViewToBottom.mjs +0 -23
- package/esm2022/lib/utils/ua-parser.mjs +0 -190
- package/esm2022/lib/utils/utils.mjs +0 -132
- package/esm2022/lib/utils/wake_lock.mjs +0 -114
- package/esm2022/lib/utils/wake_lock_media.mjs +0 -2
- package/esm2022/public-api.mjs +0 -35
- package/esm2022/speechrecorderng.mjs +0 -5
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
import { Component, ViewChild, HostListener, Output, Input, } from '@angular/core';
|
|
2
|
-
import { AudioClipUIContainer } from './container';
|
|
3
|
-
import { Action } from "../../action/action";
|
|
4
|
-
import { Position, Dimension, Rectangle } from "../../math/2d/geometry";
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "./container";
|
|
7
|
-
export class AudioDisplayScrollPane {
|
|
8
|
-
constructor(ref) {
|
|
9
|
-
this.ref = ref;
|
|
10
|
-
this.zoomInAction = new Action('+');
|
|
11
|
-
this.zoomOutAction = new Action('-');
|
|
12
|
-
this.zoomSelectedAction = new Action("Selected");
|
|
13
|
-
this.zoomFitToPanelAction = new Action("Fit to panel");
|
|
14
|
-
this.zoomFixFitToPanelAction = new Action("Fix fit to panel");
|
|
15
|
-
this.spEl = this.ref.nativeElement;
|
|
16
|
-
this.zoomInAction.onAction = (e) => {
|
|
17
|
-
this.ac.fixFitToPanel = false;
|
|
18
|
-
const oldXZoom = this.ac.currentXZoom();
|
|
19
|
-
if (oldXZoom === null) {
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
this.ac.xZoom = oldXZoom * 2;
|
|
23
|
-
let cbr = new Rectangle(new Position(this.spEl.scrollLeft, this.spEl.scrollTop), new Dimension(this.spEl.clientWidth, this.spEl.clientHeight));
|
|
24
|
-
this.ac.clipBounds(cbr);
|
|
25
|
-
this.zoomFitToPanelAction.disabled = false;
|
|
26
|
-
};
|
|
27
|
-
this.zoomOutAction.onAction = (e) => {
|
|
28
|
-
this.ac.fixFitToPanel = false;
|
|
29
|
-
const cbr1 = new Rectangle(new Position((this.spEl.scrollLeft / 2) - this.spEl.clientWidth, this.spEl.scrollTop), new Dimension(this.spEl.clientWidth, this.spEl.clientHeight));
|
|
30
|
-
this.ac.clipBounds(cbr1);
|
|
31
|
-
let oldXZoom = this.ac.currentXZoom();
|
|
32
|
-
if (oldXZoom === null) {
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
this.ac.xZoom = oldXZoom / 2;
|
|
36
|
-
let cbr = new Rectangle(new Position(this.spEl.scrollLeft, this.spEl.scrollTop), new Dimension(this.spEl.clientWidth, this.spEl.clientHeight));
|
|
37
|
-
this.ac.clipBounds(cbr);
|
|
38
|
-
this.zoomFitToPanelAction.disabled = false;
|
|
39
|
-
};
|
|
40
|
-
this.zoomFitToPanelAction.onAction = (e) => {
|
|
41
|
-
this.zoomFitToPanelAction.disabled = true;
|
|
42
|
-
// set container div width to this (viewport) width
|
|
43
|
-
this.ac.ce.style.width = this.spEl.offsetWidth + 'px';
|
|
44
|
-
this.ac.fixFitToPanel = true;
|
|
45
|
-
};
|
|
46
|
-
this.zoomSelectedAction.onAction = (e) => {
|
|
47
|
-
//alert("not implemented yet")
|
|
48
|
-
let s = this.ac.selection;
|
|
49
|
-
if (s) {
|
|
50
|
-
// reset auto fit to panel mode
|
|
51
|
-
this.ac.fixFitToPanel = false;
|
|
52
|
-
// calculate selection length in seconds
|
|
53
|
-
if (this.ac.audioData) {
|
|
54
|
-
let sr = this.ac.audioData.sampleRate;
|
|
55
|
-
let selFrLen = s.endFrame - s.startFrame;
|
|
56
|
-
let selLenInSecs = selFrLen / sr;
|
|
57
|
-
// calculate corresponding xZoom value and apply
|
|
58
|
-
this.ac.xZoom = this.spEl.clientWidth / selLenInSecs;
|
|
59
|
-
// Move viewport to show selection
|
|
60
|
-
let x1 = this.ac.frameToXPixelPosition(s.startFrame);
|
|
61
|
-
if (x1 !== null) {
|
|
62
|
-
this.spEl.scrollLeft = x1;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
this.updateClipBounds();
|
|
66
|
-
this.zoomFitToPanelAction.disabled = false;
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
updateClipBounds() {
|
|
71
|
-
let cbr = new Rectangle(new Position(this.spEl.scrollLeft, this.spEl.scrollTop), new Dimension(this.spEl.clientWidth, this.spEl.clientHeight));
|
|
72
|
-
this.ac.clipBounds(cbr);
|
|
73
|
-
}
|
|
74
|
-
onScroll(se) {
|
|
75
|
-
this.updateClipBounds();
|
|
76
|
-
}
|
|
77
|
-
onResize(event) {
|
|
78
|
-
this.updateClipBounds();
|
|
79
|
-
}
|
|
80
|
-
layout() {
|
|
81
|
-
this.ac.layout();
|
|
82
|
-
}
|
|
83
|
-
selectionChanged(s) {
|
|
84
|
-
this.zoomSelectedAction.disabled = (s == null);
|
|
85
|
-
}
|
|
86
|
-
set audioData(audioData) {
|
|
87
|
-
this.ac.audioData = audioData;
|
|
88
|
-
this.zoomOutAction.disabled = (!audioData);
|
|
89
|
-
this.zoomInAction.disabled = (!audioData);
|
|
90
|
-
}
|
|
91
|
-
set audioClip(audioClip) {
|
|
92
|
-
let audioData = null;
|
|
93
|
-
let sel = null;
|
|
94
|
-
if (audioClip) {
|
|
95
|
-
audioData = audioClip.audioDataHolder;
|
|
96
|
-
sel = audioClip.selection;
|
|
97
|
-
audioClip.addSelectionObserver((clip) => {
|
|
98
|
-
this.zoomSelectedAction.disabled = (clip.selection == null);
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
this.selectionChanged(sel);
|
|
102
|
-
this.ac.audioClip = audioClip;
|
|
103
|
-
this.zoomOutAction.disabled = (!audioData);
|
|
104
|
-
this.zoomInAction.disabled = (!audioData);
|
|
105
|
-
window.setTimeout(() => {
|
|
106
|
-
this.layout();
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
set playFramePosition(framePos) {
|
|
110
|
-
this.ac.playFramePosition = framePos;
|
|
111
|
-
}
|
|
112
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AudioDisplayScrollPane, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
113
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: AudioDisplayScrollPane, selector: "audio-display-scroll-pane", inputs: { audioClip: "audioClip" }, outputs: { zoomInAction: "zoomInAction", zoomOutAction: "zoomOutAction", zoomSelectedAction: "zoomSelectedAction", zoomFitToPanelAction: "zoomFitToPanelAction" }, host: { listeners: { "scroll": "onScroll($event)", "window:resize": "onResize($event)" } }, viewQueries: [{ propertyName: "ac", first: true, predicate: AudioClipUIContainer, descendants: true, static: true }], ngImport: i0, template: `
|
|
114
|
-
|
|
115
|
-
<app-audio #audioSignalContainer (selectionEventEmitter)="selectionChanged($event)"></app-audio>
|
|
116
|
-
|
|
117
|
-
`, isInline: true, styles: [":host{flex:2;width:100%;background:#a9a9a9;box-sizing:border-box;height:100%;position:relative;overflow-x:scroll;overflow-y:auto}\n", "app-audio{margin:0;padding:0;top:0;left:0;width:100%;height:100%;box-sizing:border-box}\n"], dependencies: [{ kind: "component", type: i1.AudioClipUIContainer, selector: "app-audio", inputs: ["audioData", "audioClip"], outputs: ["selectionEventEmitter"] }] }); }
|
|
118
|
-
}
|
|
119
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AudioDisplayScrollPane, decorators: [{
|
|
120
|
-
type: Component,
|
|
121
|
-
args: [{ selector: 'audio-display-scroll-pane', template: `
|
|
122
|
-
|
|
123
|
-
<app-audio #audioSignalContainer (selectionEventEmitter)="selectionChanged($event)"></app-audio>
|
|
124
|
-
|
|
125
|
-
`, styles: [":host{flex:2;width:100%;background:#a9a9a9;box-sizing:border-box;height:100%;position:relative;overflow-x:scroll;overflow-y:auto}\n", "app-audio{margin:0;padding:0;top:0;left:0;width:100%;height:100%;box-sizing:border-box}\n"] }]
|
|
126
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { zoomInAction: [{
|
|
127
|
-
type: Output
|
|
128
|
-
}], zoomOutAction: [{
|
|
129
|
-
type: Output
|
|
130
|
-
}], zoomSelectedAction: [{
|
|
131
|
-
type: Output
|
|
132
|
-
}], zoomFitToPanelAction: [{
|
|
133
|
-
type: Output
|
|
134
|
-
}], ac: [{
|
|
135
|
-
type: ViewChild,
|
|
136
|
-
args: [AudioClipUIContainer, { static: true }]
|
|
137
|
-
}], onScroll: [{
|
|
138
|
-
type: HostListener,
|
|
139
|
-
args: ['scroll', ['$event']]
|
|
140
|
-
}], onResize: [{
|
|
141
|
-
type: HostListener,
|
|
142
|
-
args: ['window:resize', ['$event']]
|
|
143
|
-
}], audioClip: [{
|
|
144
|
-
type: Input
|
|
145
|
-
}] } });
|
|
146
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW9fZGlzcGxheV9zY3JvbGxfcGFuZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9hdWRpby91aS9hdWRpb19kaXNwbGF5X3Njcm9sbF9wYW5lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFBYyxNQUFNLEVBQUUsS0FBSyxHQUN4QyxNQUFNLGVBQWUsQ0FBQTtBQUd0QixPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxhQUFhLENBQUE7QUFDaEQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxRQUFRLEVBQUMsU0FBUyxFQUFFLFNBQVMsRUFBQyxNQUFNLHdCQUF3QixDQUFDOzs7QUFzQ3JFLE1BQU0sT0FBTyxzQkFBc0I7SUFnQmpDLFlBQXFCLEdBQWU7UUFBZixRQUFHLEdBQUgsR0FBRyxDQUFZO1FBWjFCLGlCQUFZLEdBQWMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDMUMsa0JBQWEsR0FBYyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyx1QkFBa0IsR0FBYyxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN2RCx5QkFBb0IsR0FBYyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN2RSw0QkFBdUIsR0FBYyxJQUFJLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBU2hFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUM7UUFFbkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUMvQixJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUE7WUFDN0IsTUFB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LElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUMxQixJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsR0FBQyxTQUFTLENBQUE7UUFDM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEdBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQ3hDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxHQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtRQUNyQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUUsRUFBRTtZQUNsQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbEIsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDO0lBR0QsSUFBSSxpQkFBaUIsQ0FBQyxRQUFlO1FBQ25DLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLEdBQUMsUUFBUSxDQUFDO0lBQ3JDLENBQUM7K0dBN0lVLHNCQUFzQjttR0FBdEIsc0JBQXNCLHdZQVd0QixvQkFBb0IsOERBekNyQjs7OztHQUlUOzs0RkEwQlUsc0JBQXNCO2tCQWxDbEMsU0FBUzsrQkFFRSwyQkFBMkIsWUFFM0I7Ozs7R0FJVDsrRUE4QlMsWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBS0MsRUFBRTtzQkFEVCxTQUFTO3VCQUFDLG9CQUFvQixFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFpRmpELFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBTWxDLFFBQVE7c0JBRFAsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBcUJyQyxTQUFTO3NCQURaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgSG9zdExpc3RlbmVyLCBFbGVtZW50UmVmLCBPdXRwdXQsIElucHV0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXHJcblxyXG5cclxuaW1wb3J0IHtBdWRpb0NsaXBVSUNvbnRhaW5lcn0gZnJvbSAnLi9jb250YWluZXInXHJcbmltcG9ydCB7QWN0aW9ufSBmcm9tIFwiLi4vLi4vYWN0aW9uL2FjdGlvblwiO1xyXG5pbXBvcnQge1Bvc2l0aW9uLERpbWVuc2lvbiwgUmVjdGFuZ2xlfSBmcm9tIFwiLi4vLi4vbWF0aC8yZC9nZW9tZXRyeVwiO1xyXG5pbXBvcnQge0F1ZGlvQ2xpcCwgU2VsZWN0aW9ufSBmcm9tIFwiLi4vcGVyc2lzdG9yXCI7XHJcbmltcG9ydCB7QXVkaW9EYXRhSG9sZGVyfSBmcm9tIFwiLi4vYXVkaW9fZGF0YV9ob2xkZXJcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cclxuICBzZWxlY3RvcjogJ2F1ZGlvLWRpc3BsYXktc2Nyb2xsLXBhbmUnLFxyXG5cclxuICB0ZW1wbGF0ZTogYFxyXG5cclxuICAgIDxhcHAtYXVkaW8gI2F1ZGlvU2lnbmFsQ29udGFpbmVyIChzZWxlY3Rpb25FdmVudEVtaXR0ZXIpPVwic2VsZWN0aW9uQ2hhbmdlZCgkZXZlbnQpXCI+PC9hcHAtYXVkaW8+XHJcblxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbXHJcbiAgICBgOmhvc3Qge1xyXG4gICAgICAgICAgIGZsZXg6IDI7XHJcbiAgICAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgICAgYmFja2dyb3VuZDogZGFya2dyYXk7XHJcbiAgICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgICAgICAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgICAgICAgIG92ZXJmbG93LXg6IHNjcm9sbDtcclxuICAgICAgICAgICBvdmVyZmxvdy15OiBhdXRvO1xyXG4gICAgICAgICB9YCxcclxuICAgIGBhcHAtYXVkaW8ge1xyXG4gICAgIFxyXG4gICAgICAgICBtYXJnaW46IDA7XHJcbiAgICAgICAgIHBhZGRpbmc6IDA7XHJcbiAgICAgICAgIHRvcDogMDtcclxuICAgICAgICAgbGVmdDogMDtcclxuICAgICAgICAgd2lkdGg6IDEwMCU7XHJcbiAgICAgICAgIGhlaWdodDogMTAwJTtcclxuICAgICBcclxuICAgICAgICAgLypwb3NpdGlvbjogYWJzb2x1dGU7Ki9cclxuICAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcclxuICAgICAgIH1gXVxyXG5cclxufSlcclxuZXhwb3J0IGNsYXNzIEF1ZGlvRGlzcGxheVNjcm9sbFBhbmUge1xyXG5cclxuICBwcml2YXRlIHNwRWwhOkhUTUxFbGVtZW50O1xyXG5cclxuICBAT3V0cHV0KCkgem9vbUluQWN0aW9uOkFjdGlvbjx2b2lkPj1uZXcgQWN0aW9uKCcrJyk7XHJcbiAgQE91dHB1dCgpIHpvb21PdXRBY3Rpb246QWN0aW9uPHZvaWQ+PW5ldyBBY3Rpb24oJy0nKTtcclxuICBAT3V0cHV0KCkgem9vbVNlbGVjdGVkQWN0aW9uOkFjdGlvbjx2b2lkPj1uZXcgQWN0aW9uKFwiU2VsZWN0ZWRcIik7XHJcbiAgQE91dHB1dCgpIHpvb21GaXRUb1BhbmVsQWN0aW9uOkFjdGlvbjx2b2lkPj1uZXcgQWN0aW9uKFwiRml0IHRvIHBhbmVsXCIpO1xyXG4gIHpvb21GaXhGaXRUb1BhbmVsQWN0aW9uOkFjdGlvbjx2b2lkPj1uZXcgQWN0aW9uKFwiRml4IGZpdCB0byBwYW5lbFwiKTtcclxuXHJcblxyXG4gIEBWaWV3Q2hpbGQoQXVkaW9DbGlwVUlDb250YWluZXIsIHsgc3RhdGljOiB0cnVlIH0pXHJcbiAgcHJpdmF0ZSBhYyE6IEF1ZGlvQ2xpcFVJQ29udGFpbmVyO1xyXG5cclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKCBwcml2YXRlIHJlZjogRWxlbWVudFJlZikge1xyXG4gICAgICB0aGlzLnNwRWwgPSB0aGlzLnJlZi5uYXRpdmVFbGVtZW50O1xyXG5cclxuICAgICAgdGhpcy56b29tSW5BY3Rpb24ub25BY3Rpb24gPSAoZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5hYy5maXhGaXRUb1BhbmVsID0gZmFsc2VcclxuICAgICAgICAgIGNvbnN0IG9sZFhab29tID0gdGhpcy5hYy5jdXJyZW50WFpvb20oKVxyXG4gICAgICAgICAgaWYob2xkWFpvb20gPT09IG51bGwpe1xyXG4gICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0aGlzLmFjLnhab29tID0gb2xkWFpvb20gKiAyO1xyXG4gICAgICAgICAgbGV0IGNiciA9IG5ldyBSZWN0YW5nbGUobmV3IFBvc2l0aW9uKHRoaXMuc3BFbC5zY3JvbGxMZWZ0LCB0aGlzLnNwRWwuc2Nyb2xsVG9wKSwgbmV3IERpbWVuc2lvbih0aGlzLnNwRWwuY2xpZW50V2lkdGgsIHRoaXMuc3BFbC5jbGllbnRIZWlnaHQpKTtcclxuICAgICAgICAgIHRoaXMuYWMuY2xpcEJvdW5kcyhjYnIpO1xyXG4gICAgICAgICAgdGhpcy56b29tRml0VG9QYW5lbEFjdGlvbi5kaXNhYmxlZD1mYWxzZVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuem9vbU91dEFjdGlvbi5vbkFjdGlvbiA9IChlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmFjLmZpeEZpdFRvUGFuZWwgPSBmYWxzZVxyXG4gICAgICAgICAgY29uc3QgY2JyMSA9IG5ldyBSZWN0YW5nbGUobmV3IFBvc2l0aW9uKCh0aGlzLnNwRWwuc2Nyb2xsTGVmdCAvIDIpIC0gdGhpcy5zcEVsLmNsaWVudFdpZHRoLCB0aGlzLnNwRWwuc2Nyb2xsVG9wKSwgbmV3IERpbWVuc2lvbih0aGlzLnNwRWwuY2xpZW50V2lkdGgsIHRoaXMuc3BFbC5jbGllbnRIZWlnaHQpKTtcclxuICAgICAgICAgIHRoaXMuYWMuY2xpcEJvdW5kcyhjYnIxKTtcclxuICAgICAgICAgIGxldCBvbGRYWm9vbSA9IHRoaXMuYWMuY3VycmVudFhab29tKClcclxuICAgICAgICAgIGlmKG9sZFhab29tID09PSBudWxsKXtcclxuICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmFjLnhab29tID0gb2xkWFpvb20gLyAyO1xyXG5cclxuICAgICAgICAgIGxldCBjYnIgPSBuZXcgUmVjdGFuZ2xlKG5ldyBQb3NpdGlvbih0aGlzLnNwRWwuc2Nyb2xsTGVmdCwgdGhpcy5zcEVsLnNjcm9sbFRvcCksIG5ldyBEaW1lbnNpb24odGhpcy5zcEVsLmNsaWVudFdpZHRoLCB0aGlzLnNwRWwuY2xpZW50SGVpZ2h0KSk7XHJcbiAgICAgICAgICB0aGlzLmFjLmNsaXBCb3VuZHMoY2JyKTtcclxuICAgICAgICAgIHRoaXMuem9vbUZpdFRvUGFuZWxBY3Rpb24uZGlzYWJsZWQ9ZmFsc2VcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy56b29tRml0VG9QYW5lbEFjdGlvbi5vbkFjdGlvbiA9IChlKSA9PiB7XHJcblxyXG4gICAgICAgICAgdGhpcy56b29tRml0VG9QYW5lbEFjdGlvbi5kaXNhYmxlZD10cnVlXHJcblxyXG4gICAgICAgICAgLy8gc2V0IGNvbnRhaW5lciBkaXYgd2lkdGggdG8gdGhpcyAodmlld3BvcnQpIHdpZHRoXHJcbiAgICAgICAgICB0aGlzLmFjLmNlLnN0eWxlLndpZHRoPXRoaXMuc3BFbC5vZmZzZXRXaWR0aCsncHgnO1xyXG5cclxuICAgICAgICAgIHRoaXMuYWMuZml4Rml0VG9QYW5lbD10cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnpvb21TZWxlY3RlZEFjdGlvbi5vbkFjdGlvbiA9IChlKSA9PiB7XHJcbiAgICAgICAgICAvL2FsZXJ0KFwibm90IGltcGxlbWVudGVkIHlldFwiKVxyXG5cclxuICAgICAgICAgIGxldCBzID0gdGhpcy5hYy5zZWxlY3Rpb25cclxuICAgICAgICAgIGlmIChzKSB7XHJcbiAgICAgICAgICAgICAgLy8gcmVzZXQgYXV0byBmaXQgdG8gcGFuZWwgbW9kZVxyXG4gICAgICAgICAgICAgIHRoaXMuYWMuZml4Rml0VG9QYW5lbCA9IGZhbHNlXHJcblxyXG4gICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSBzZWxlY3Rpb24gbGVuZ3RoIGluIHNlY29uZHNcclxuICAgICAgICAgICAgICBpZih0aGlzLmFjLmF1ZGlvRGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgc3IgPSB0aGlzLmFjLmF1ZGlvRGF0YS5zYW1wbGVSYXRlO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgc2VsRnJMZW4gPSBzLmVuZEZyYW1lIC0gcy5zdGFydEZyYW1lO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgc2VsTGVuSW5TZWNzID0gc2VsRnJMZW4gLyBzcjtcclxuICAgICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIGNvcnJlc3BvbmRpbmcgeFpvb20gdmFsdWUgYW5kIGFwcGx5XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuYWMueFpvb20gPSB0aGlzLnNwRWwuY2xpZW50V2lkdGggLyBzZWxMZW5JblNlY3M7XHJcblxyXG4gICAgICAgICAgICAgICAgICAvLyBNb3ZlIHZpZXdwb3J0IHRvIHNob3cgc2VsZWN0aW9uXHJcbiAgICAgICAgICAgICAgICAgIGxldCB4MSA9IHRoaXMuYWMuZnJhbWVUb1hQaXhlbFBvc2l0aW9uKHMuc3RhcnRGcmFtZSk7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh4MSAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5zcEVsLnNjcm9sbExlZnQgPSB4MTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNsaXBCb3VuZHMoKVxyXG4gICAgICAgICAgICAgIHRoaXMuem9vbUZpdFRvUGFuZWxBY3Rpb24uZGlzYWJsZWQgPSBmYWxzZVxyXG4gICAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIHVwZGF0ZUNsaXBCb3VuZHMoKXtcclxuICAgIGxldCBjYnI9bmV3IFJlY3RhbmdsZShuZXcgUG9zaXRpb24odGhpcy5zcEVsLnNjcm9sbExlZnQsdGhpcy5zcEVsLnNjcm9sbFRvcCksIG5ldyBEaW1lbnNpb24odGhpcy5zcEVsLmNsaWVudFdpZHRoLHRoaXMuc3BFbC5jbGllbnRIZWlnaHQpKTtcclxuICAgIHRoaXMuYWMuY2xpcEJvdW5kcyhjYnIpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignc2Nyb2xsJywgWyckZXZlbnQnXSlcclxuICBvblNjcm9sbChzZTogRXZlbnQpIHtcclxuICAgICB0aGlzLnVwZGF0ZUNsaXBCb3VuZHMoKVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXHJcbiAgb25SZXNpemUoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLnVwZGF0ZUNsaXBCb3VuZHMoKVxyXG4gIH1cclxuXHJcbiAgbGF5b3V0KCl7XHJcbiAgICAgICAgICB0aGlzLmFjLmxheW91dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdGlvbkNoYW5nZWQoczpTZWxlY3Rpb258IG51bGwpe1xyXG4gICAgICB0aGlzLnpvb21TZWxlY3RlZEFjdGlvbi5kaXNhYmxlZD0ocz09bnVsbClcclxuICAgIH1cclxuXHJcbiAgc2V0IGF1ZGlvRGF0YShhdWRpb0RhdGE6IEF1ZGlvRGF0YUhvbGRlciB8IG51bGwpIHtcclxuICAgIHRoaXMuYWMuYXVkaW9EYXRhPWF1ZGlvRGF0YTtcclxuICAgICAgdGhpcy56b29tT3V0QWN0aW9uLmRpc2FibGVkPSghYXVkaW9EYXRhKVxyXG4gICAgICB0aGlzLnpvb21JbkFjdGlvbi5kaXNhYmxlZD0oIWF1ZGlvRGF0YSlcclxuICAgIH1cclxuXHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGF1ZGlvQ2xpcChhdWRpb0NsaXA6IEF1ZGlvQ2xpcCB8IG51bGwpIHtcclxuXHJcbiAgICBsZXQgYXVkaW9EYXRhOkF1ZGlvRGF0YUhvbGRlcnxudWxsPW51bGw7XHJcbiAgICBsZXQgc2VsOlNlbGVjdGlvbnxudWxsPW51bGw7XHJcbiAgICBpZihhdWRpb0NsaXApe1xyXG4gICAgICBhdWRpb0RhdGE9YXVkaW9DbGlwLmF1ZGlvRGF0YUhvbGRlcjtcclxuICAgICAgc2VsPWF1ZGlvQ2xpcC5zZWxlY3Rpb247XHJcbiAgICAgIGF1ZGlvQ2xpcC5hZGRTZWxlY3Rpb25PYnNlcnZlcigoY2xpcCk9PntcclxuICAgICAgICB0aGlzLnpvb21TZWxlY3RlZEFjdGlvbi5kaXNhYmxlZD0oY2xpcC5zZWxlY3Rpb249PW51bGwpXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2VkKHNlbClcclxuICAgIHRoaXMuYWMuYXVkaW9DbGlwPWF1ZGlvQ2xpcFxyXG4gICAgdGhpcy56b29tT3V0QWN0aW9uLmRpc2FibGVkPSghYXVkaW9EYXRhKVxyXG4gICAgdGhpcy56b29tSW5BY3Rpb24uZGlzYWJsZWQ9KCFhdWRpb0RhdGEpXHJcbiAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpPT57XHJcbiAgICAgICAgICB0aGlzLmxheW91dCgpO1xyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcblxyXG4gIHNldCBwbGF5RnJhbWVQb3NpdGlvbihmcmFtZVBvczpudW1iZXIpe1xyXG4gICAgdGhpcy5hYy5wbGF5RnJhbWVQb3NpdGlvbj1mcmFtZVBvcztcclxuICB9XHJcblxyXG5cclxufVxyXG5cclxuIl19
|