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,64 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Created by klausj on 17.06.2017.
|
|
3
|
-
*/
|
|
4
|
-
import { Inject, Injectable } from '@angular/core';
|
|
5
|
-
import { ApiType, SPEECHRECORDER_CONFIG } from "../../spr.config";
|
|
6
|
-
import { UUID } from "../../utils/utils";
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "@angular/common/http";
|
|
9
|
-
import * as i2 from "@angular/common";
|
|
10
|
-
import * as i3 from "../../spr.config";
|
|
11
|
-
export class ProjectService {
|
|
12
|
-
static { this.PROJECT_API_CTX = 'project'; }
|
|
13
|
-
constructor(http, platformLocation, config) {
|
|
14
|
-
this.http = http;
|
|
15
|
-
this.platformLocation = platformLocation;
|
|
16
|
-
this.config = config;
|
|
17
|
-
this.withCredentials = false;
|
|
18
|
-
console.log("Base Href: " + platformLocation.getBaseHrefFromDOM());
|
|
19
|
-
let apiEndPoint = '';
|
|
20
|
-
if (config && config.apiEndPoint) {
|
|
21
|
-
apiEndPoint = config.apiEndPoint;
|
|
22
|
-
}
|
|
23
|
-
if (apiEndPoint !== '') {
|
|
24
|
-
apiEndPoint = apiEndPoint + '/';
|
|
25
|
-
}
|
|
26
|
-
if (config != null && config.withCredentials != null) {
|
|
27
|
-
this.withCredentials = config.withCredentials;
|
|
28
|
-
}
|
|
29
|
-
this.projectCtxUrl = apiEndPoint + ProjectService.PROJECT_API_CTX;
|
|
30
|
-
}
|
|
31
|
-
appendRequestUUIDForDevelopmentServer(url) {
|
|
32
|
-
let resUrl = url;
|
|
33
|
-
if (this.config && this.config.apiType === ApiType.FILES) {
|
|
34
|
-
// for development and demo
|
|
35
|
-
// append UUID to make request URL unique to avoid localhost server caching
|
|
36
|
-
resUrl = resUrl + '.json?requestUUID=' + UUID.generate();
|
|
37
|
-
}
|
|
38
|
-
return resUrl;
|
|
39
|
-
}
|
|
40
|
-
projectUrl(id) {
|
|
41
|
-
let encPrjId = encodeURIComponent(id);
|
|
42
|
-
return this.appendRequestUUIDForDevelopmentServer(this.projectCtxUrl + '/' + encPrjId);
|
|
43
|
-
}
|
|
44
|
-
projectResourceUrl(projectId, relResourcePath) {
|
|
45
|
-
let encPrjId = encodeURIComponent(projectId);
|
|
46
|
-
// Use encodeURI here since the relatice resource path from recording scripts is already a URI
|
|
47
|
-
// encodeURIComponent function would encode the slashes and fetching the resource would fail
|
|
48
|
-
let encRelResPath = encodeURI(relResourcePath);
|
|
49
|
-
return this.projectCtxUrl + '/' + encPrjId + '/' + encRelResPath;
|
|
50
|
-
}
|
|
51
|
-
projectObservable(id) {
|
|
52
|
-
let prjUrl = this.projectUrl(id);
|
|
53
|
-
return this.http.get(prjUrl, { withCredentials: this.withCredentials });
|
|
54
|
-
}
|
|
55
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ProjectService, deps: [{ token: i1.HttpClient }, { token: i2.PlatformLocation }, { token: SPEECHRECORDER_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
56
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ProjectService }); }
|
|
57
|
-
}
|
|
58
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ProjectService, decorators: [{
|
|
59
|
-
type: Injectable
|
|
60
|
-
}], ctorParameters: () => [{ type: i1.HttpClient }, { type: i2.PlatformLocation }, { type: i3.SpeechRecorderConfig, decorators: [{
|
|
61
|
-
type: Inject,
|
|
62
|
-
args: [SPEECHRECORDER_CONFIG]
|
|
63
|
-
}] }] });
|
|
64
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL3NwZWVjaHJlY29yZGVyL3Byb2plY3QvcHJvamVjdC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFakQsT0FBTyxFQUFDLE9BQU8sRUFBRSxxQkFBcUIsRUFBdUIsTUFBTSxrQkFBa0IsQ0FBQztBQUV0RixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7Ozs7O0FBT3ZDLE1BQU0sT0FBTyxjQUFjO2FBQ0Ysb0JBQWUsR0FBQyxTQUFTLEFBQVYsQ0FBVTtJQUloRCxZQUFvQixJQUFlLEVBQVMsZ0JBQWlDLEVBQXdDLE1BQTRCO1FBQTdILFNBQUksR0FBSixJQUFJLENBQVc7UUFBUyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWlCO1FBQXdDLFdBQU0sR0FBTixNQUFNLENBQXNCO1FBRmhJLG9CQUFlLEdBQVMsS0FBSyxDQUFDO1FBSTdDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxHQUFDLGdCQUFnQixDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztRQUVqRSxJQUFJLFdBQVcsR0FBRyxFQUFFLENBQUE7UUFFcEIsSUFBRyxNQUFNLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2hDLFdBQVcsR0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQ2pDLENBQUM7UUFDRCxJQUFHLFdBQVcsS0FBSyxFQUFFLEVBQUMsQ0FBQztZQUNyQixXQUFXLEdBQUMsV0FBVyxHQUFDLEdBQUcsQ0FBQTtRQUM3QixDQUFDO1FBQ0QsSUFBRyxNQUFNLElBQUUsSUFBSSxJQUFJLE1BQU0sQ0FBQyxlQUFlLElBQUUsSUFBSSxFQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLGVBQWUsR0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDO1FBQzlDLENBQUM7UUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLFdBQVcsR0FBRyxjQUFjLENBQUMsZUFBZSxDQUFDO0lBRXBFLENBQUM7SUFFTyxxQ0FBcUMsQ0FBQyxHQUFVO1FBQ3RELElBQUksTUFBTSxHQUFDLEdBQUcsQ0FBQztRQUNmLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDekQsMkJBQTJCO1lBQzNCLDJFQUEyRTtZQUMzRSxNQUFNLEdBQUcsTUFBTSxHQUFHLG9CQUFvQixHQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUE7SUFDZixDQUFDO0lBRUQsVUFBVSxDQUFDLEVBQVM7UUFDbEIsSUFBSSxRQUFRLEdBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEMsT0FBTyxJQUFJLENBQUMscUNBQXFDLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVELGtCQUFrQixDQUFDLFNBQWlCLEVBQUMsZUFBc0I7UUFDekQsSUFBSSxRQUFRLEdBQUMsa0JBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDM0MsOEZBQThGO1FBQzlGLDRGQUE0RjtRQUM1RixJQUFJLGFBQWEsR0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDN0MsT0FBTyxJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsR0FBRyxRQUFRLEdBQUUsR0FBRyxHQUFDLGFBQWEsQ0FBQztJQUNoRSxDQUFDO0lBRUQsaUJBQWlCLENBQUMsRUFBUztRQUN6QixJQUFJLE1BQU0sR0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzlCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQVUsTUFBTSxFQUFDLEVBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUMsQ0FBQyxDQUFBO0lBQy9FLENBQUM7K0dBbkRTLGNBQWMsNEVBSzZELHFCQUFxQjttSEFMaEcsY0FBYzs7NEZBQWQsY0FBYztrQkFEMUIsVUFBVTs7MEJBTXNFLE1BQU07MkJBQUMscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIENyZWF0ZWQgYnkga2xhdXNqIG9uIDE3LjA2LjIwMTcuXHJcbiAqL1xyXG5pbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuaW1wb3J0IHtBcGlUeXBlLCBTUEVFQ0hSRUNPUkRFUl9DT05GSUcsIFNwZWVjaFJlY29yZGVyQ29uZmlnfSBmcm9tIFwiLi4vLi4vc3ByLmNvbmZpZ1wiO1xyXG5pbXBvcnQge1Byb2plY3R9IGZyb20gXCIuL3Byb2plY3RcIjtcclxuaW1wb3J0IHtVVUlEfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcclxuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge1BsYXRmb3JtTG9jYXRpb259IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuXHJcblxyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgUHJvamVjdFNlcnZpY2Uge1xyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPSkVDVF9BUElfQ1RYPSdwcm9qZWN0J1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvamVjdEN0eFVybDpzdHJpbmc7XHJcbiAgcHJpdmF0ZSByZWFkb25seSB3aXRoQ3JlZGVudGlhbHM6Ym9vbGVhbj1mYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOkh0dHBDbGllbnQscHJpdmF0ZSBwbGF0Zm9ybUxvY2F0aW9uOlBsYXRmb3JtTG9jYXRpb24sQEluamVjdChTUEVFQ0hSRUNPUkRFUl9DT05GSUcpIHByaXZhdGUgY29uZmlnPzpTcGVlY2hSZWNvcmRlckNvbmZpZykge1xyXG5cclxuICAgIGNvbnNvbGUubG9nKFwiQmFzZSBIcmVmOiBcIitwbGF0Zm9ybUxvY2F0aW9uLmdldEJhc2VIcmVmRnJvbURPTSgpKTtcclxuXHJcbiAgICBsZXQgYXBpRW5kUG9pbnQgPSAnJ1xyXG5cclxuICAgIGlmKGNvbmZpZyAmJiBjb25maWcuYXBpRW5kUG9pbnQpIHtcclxuICAgICAgYXBpRW5kUG9pbnQ9Y29uZmlnLmFwaUVuZFBvaW50O1xyXG4gICAgfVxyXG4gICAgaWYoYXBpRW5kUG9pbnQgIT09ICcnKXtcclxuICAgICAgYXBpRW5kUG9pbnQ9YXBpRW5kUG9pbnQrJy8nXHJcbiAgICB9XHJcbiAgICBpZihjb25maWchPW51bGwgJiYgY29uZmlnLndpdGhDcmVkZW50aWFscyE9bnVsbCl7XHJcbiAgICAgIHRoaXMud2l0aENyZWRlbnRpYWxzPWNvbmZpZy53aXRoQ3JlZGVudGlhbHM7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5wcm9qZWN0Q3R4VXJsID0gYXBpRW5kUG9pbnQgKyBQcm9qZWN0U2VydmljZS5QUk9KRUNUX0FQSV9DVFg7XHJcblxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhcHBlbmRSZXF1ZXN0VVVJREZvckRldmVsb3BtZW50U2VydmVyKHVybDpzdHJpbmcpOnN0cmluZ3tcclxuICAgIGxldCByZXNVcmw9dXJsO1xyXG4gICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmFwaVR5cGUgPT09IEFwaVR5cGUuRklMRVMpIHtcclxuICAgICAgLy8gZm9yIGRldmVsb3BtZW50IGFuZCBkZW1vXHJcbiAgICAgIC8vIGFwcGVuZCBVVUlEIHRvIG1ha2UgcmVxdWVzdCBVUkwgdW5pcXVlIHRvIGF2b2lkIGxvY2FsaG9zdCBzZXJ2ZXIgY2FjaGluZ1xyXG4gICAgICByZXNVcmwgPSByZXNVcmwgKyAnLmpzb24/cmVxdWVzdFVVSUQ9JytVVUlELmdlbmVyYXRlKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzVXJsXHJcbiAgfVxyXG5cclxuICBwcm9qZWN0VXJsKGlkOnN0cmluZyk6c3RyaW5ne1xyXG4gICAgbGV0IGVuY1ByaklkPWVuY29kZVVSSUNvbXBvbmVudChpZCk7XHJcbiAgICByZXR1cm4gdGhpcy5hcHBlbmRSZXF1ZXN0VVVJREZvckRldmVsb3BtZW50U2VydmVyKHRoaXMucHJvamVjdEN0eFVybCArICcvJyArIGVuY1ByaklkKTtcclxuICB9XHJcblxyXG4gIHByb2plY3RSZXNvdXJjZVVybChwcm9qZWN0SWQ6IHN0cmluZyxyZWxSZXNvdXJjZVBhdGg6c3RyaW5nKTpzdHJpbmd7XHJcbiAgICBsZXQgZW5jUHJqSWQ9ZW5jb2RlVVJJQ29tcG9uZW50KHByb2plY3RJZCk7XHJcbiAgICAvLyBVc2UgZW5jb2RlVVJJIGhlcmUgc2luY2UgdGhlIHJlbGF0aWNlIHJlc291cmNlIHBhdGggZnJvbSByZWNvcmRpbmcgc2NyaXB0cyBpcyBhbHJlYWR5IGEgVVJJXHJcbiAgICAvLyBlbmNvZGVVUklDb21wb25lbnQgZnVuY3Rpb24gd291bGQgZW5jb2RlIHRoZSBzbGFzaGVzIGFuZCBmZXRjaGluZyB0aGUgcmVzb3VyY2Ugd291bGQgZmFpbFxyXG4gICAgbGV0IGVuY1JlbFJlc1BhdGg9ZW5jb2RlVVJJKHJlbFJlc291cmNlUGF0aCk7XHJcbiAgICByZXR1cm4gdGhpcy5wcm9qZWN0Q3R4VXJsICsgJy8nICsgZW5jUHJqSWQgKycvJytlbmNSZWxSZXNQYXRoO1xyXG4gIH1cclxuXHJcbiAgcHJvamVjdE9ic2VydmFibGUoaWQ6c3RyaW5nKTpPYnNlcnZhYmxlPFByb2plY3Q+e1xyXG4gICAgbGV0IHByalVybD10aGlzLnByb2plY3RVcmwoaWQpO1xyXG4gICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PFByb2plY3Q+KHByalVybCx7d2l0aENyZWRlbnRpYWxzOiB0aGlzLndpdGhDcmVkZW50aWFsc30pXHJcbiAgIH1cclxuXHJcbn1cclxuXHJcblxyXG4iXX0=
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import { UUID } from '../utils/utils';
|
|
2
|
-
export class RecordingFileDescriptorImpl {
|
|
3
|
-
constructor() { }
|
|
4
|
-
}
|
|
5
|
-
export class RecordingFile {
|
|
6
|
-
constructor(uuid, sessionId, audioDataHolder) {
|
|
7
|
-
this.recordingFileId = null;
|
|
8
|
-
this.uuid = null;
|
|
9
|
-
this.serverPersisted = false;
|
|
10
|
-
this.date = null;
|
|
11
|
-
this._dateAsDateObj = null;
|
|
12
|
-
this.startedDate = null;
|
|
13
|
-
this._startedAsDateObj = null;
|
|
14
|
-
this.audioDataHolder = null;
|
|
15
|
-
this.session = null;
|
|
16
|
-
this.channels = null;
|
|
17
|
-
this.frames = null;
|
|
18
|
-
this.samplerate = null;
|
|
19
|
-
this.timeLength = null;
|
|
20
|
-
this.editSampleRate = null;
|
|
21
|
-
this.editStartFrame = null;
|
|
22
|
-
this.editEndFrame = null;
|
|
23
|
-
this.session = sessionId;
|
|
24
|
-
this.audioDataHolder = audioDataHolder;
|
|
25
|
-
if (audioDataHolder) {
|
|
26
|
-
this.frames = audioDataHolder.frameLen;
|
|
27
|
-
this.timeLength = audioDataHolder.duration;
|
|
28
|
-
}
|
|
29
|
-
this.uuid = uuid;
|
|
30
|
-
}
|
|
31
|
-
filenameString() {
|
|
32
|
-
let fns = '';
|
|
33
|
-
if (this.session) {
|
|
34
|
-
fns += this.session;
|
|
35
|
-
fns += '_';
|
|
36
|
-
}
|
|
37
|
-
fns += this.uuid;
|
|
38
|
-
return fns;
|
|
39
|
-
}
|
|
40
|
-
equals(otherRecordingFile) {
|
|
41
|
-
if (otherRecordingFile !== null) {
|
|
42
|
-
if (otherRecordingFile === this) {
|
|
43
|
-
return true;
|
|
44
|
-
}
|
|
45
|
-
if (otherRecordingFile.uuid === this.uuid) {
|
|
46
|
-
return true;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
return false;
|
|
50
|
-
}
|
|
51
|
-
toString() {
|
|
52
|
-
return 'Recording file: UUID: ' + this.uuid + ', session: ' + this.session;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
export class SprRecordingFile extends RecordingFile {
|
|
56
|
-
constructor(sessionId, itemcode, version, audioDataHolder) {
|
|
57
|
-
super(UUID.generate(), sessionId, audioDataHolder);
|
|
58
|
-
this.session = sessionId;
|
|
59
|
-
this.itemCode = itemcode;
|
|
60
|
-
this.version = version;
|
|
61
|
-
}
|
|
62
|
-
recordingFileDone() {
|
|
63
|
-
return (this.serverPersisted === true) || (this.audioDataHolder != null);
|
|
64
|
-
}
|
|
65
|
-
filenameString() {
|
|
66
|
-
let fns = '';
|
|
67
|
-
if (this.session) {
|
|
68
|
-
fns += this.session;
|
|
69
|
-
fns += '_';
|
|
70
|
-
}
|
|
71
|
-
if (this.itemCode) {
|
|
72
|
-
fns += this.itemCode;
|
|
73
|
-
fns += '_';
|
|
74
|
-
}
|
|
75
|
-
fns += this.uuid;
|
|
76
|
-
return fns;
|
|
77
|
-
}
|
|
78
|
-
toString() {
|
|
79
|
-
return 'Recording file: UUID: ' + this.uuid + ', session: ' + this.session + ', itemcode: ' + this.itemCode + ', version: ' + this.version + ', UUID: ' + this.uuid;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
export class RecordingFileUtils {
|
|
83
|
-
static equals(recordinFile, otherRecordingFile) {
|
|
84
|
-
if (recordinFile && otherRecordingFile) {
|
|
85
|
-
if (otherRecordingFile === recordinFile) {
|
|
86
|
-
return true;
|
|
87
|
-
}
|
|
88
|
-
if (otherRecordingFile.uuid === recordinFile.uuid) {
|
|
89
|
-
return true;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
return false;
|
|
93
|
-
}
|
|
94
|
-
static setAudioData(rf, audioDataHolder) {
|
|
95
|
-
rf.audioDataHolder = audioDataHolder;
|
|
96
|
-
if (audioDataHolder) {
|
|
97
|
-
if (rf.samplerate == null) {
|
|
98
|
-
rf.samplerate = audioDataHolder.sampleRate;
|
|
99
|
-
}
|
|
100
|
-
if (rf.frames == null) {
|
|
101
|
-
rf.frames = audioDataHolder.frameLen;
|
|
102
|
-
}
|
|
103
|
-
rf.timeLength = audioDataHolder.duration;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
static sampleCount(rf) {
|
|
107
|
-
if (rf.audioDataHolder) {
|
|
108
|
-
return rf.audioDataHolder.sampleCounts();
|
|
109
|
-
}
|
|
110
|
-
else {
|
|
111
|
-
return 0;
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
static expireAudioData(rf) {
|
|
115
|
-
let expiredSamples = 0;
|
|
116
|
-
if (rf && rf.audioDataHolder) {
|
|
117
|
-
expiredSamples = rf.audioDataHolder.sampleCounts();
|
|
118
|
-
rf.audioDataHolder.releaseAudioData();
|
|
119
|
-
rf.audioDataHolder = null;
|
|
120
|
-
}
|
|
121
|
-
return expiredSamples;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL3NwZWVjaHJlY29yZGVyL3JlY29yZGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFlckMsTUFBTSxPQUFPLDJCQUEyQjtJQU10QyxnQkFBZSxDQUFDO0NBQ2pCO0FBRUQsTUFBTSxPQUFPLGFBQWE7SUFrQnhCLFlBQVksSUFBVyxFQUFDLFNBQXVCLEVBQUMsZUFBb0M7UUFqQnBGLG9CQUFlLEdBQTBCLElBQUksQ0FBQztRQUM5QyxTQUFJLEdBQWEsSUFBSSxDQUFDO1FBQ3RCLG9CQUFlLEdBQUMsS0FBSyxDQUFDO1FBQ3RCLFNBQUksR0FBYyxJQUFJLENBQUM7UUFDdkIsbUJBQWMsR0FBVyxJQUFJLENBQUM7UUFDOUIsZ0JBQVcsR0FBYyxJQUFJLENBQUM7UUFDOUIsc0JBQWlCLEdBQVksSUFBSSxDQUFDO1FBQ2xDLG9CQUFlLEdBQXNCLElBQUksQ0FBQztRQUMxQyxZQUFPLEdBQW9CLElBQUksQ0FBQztRQUNoQyxhQUFRLEdBQWEsSUFBSSxDQUFDO1FBQzFCLFdBQU0sR0FBYSxJQUFJLENBQUM7UUFDeEIsZUFBVSxHQUFhLElBQUksQ0FBQztRQUM1QixlQUFVLEdBQWEsSUFBSSxDQUFDO1FBQzVCLG1CQUFjLEdBQWEsSUFBSSxDQUFDO1FBQ2hDLG1CQUFjLEdBQWEsSUFBSSxDQUFBO1FBQy9CLGlCQUFZLEdBQWEsSUFBSSxDQUFBO1FBRzNCLElBQUksQ0FBQyxPQUFPLEdBQUMsU0FBUyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxlQUFlLEdBQUMsZUFBZSxDQUFBO1FBQ3BDLElBQUcsZUFBZSxFQUFDLENBQUM7WUFDbEIsSUFBSSxDQUFDLE1BQU0sR0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDO1lBQ3JDLElBQUksQ0FB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WyJpbXBvcnQgeyBVVUlEIH0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnXHJcbmltcG9ydCB7UHJvbXB0SXRlbX0gZnJvbSBcIi4vc2NyaXB0L3NjcmlwdFwiO1xyXG5pbXBvcnQge0F1ZGlvRGF0YUhvbGRlcn0gZnJvbSBcIi4uL2F1ZGlvL2F1ZGlvX2RhdGFfaG9sZGVyXCI7XHJcblxyXG4vLyBUT0RPIEkgdGhpbmsgdGhlIGludGVyZmFjZS9jbGFzcyBzdHJ1Y3R1cmUgbmVlZHMgc29tZSByZWZhY3RvcmluZ1xyXG4vLyBUaGUgcXVlc3Rpb24gaW4gZ2VuZXJhbCBpcyBob3cgdG8gZmV0Y2ggYW4gb2JqZWN0IG9mIGEgY2xhc3MgKHdpdGggbWVtYmVyIG1ldGhvZHMpXHJcbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzUwNDUyNDMxL2FuZ3VsYXItNi1odHRwY2xpZW50LXJldHVybi1pbnN0YW5jZS1vZi1jbGFzc1xyXG4vLyBBbmd1bGFyIEhUVFBDbGllbnQgc2VlbXMgdG8gc2ltcGx5XHJcbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ3NDk5MzI0L2FuZ3VsYXItNS1tb2RlbHMtaHR0cGNsaWVudC10eXBlLWNhc3RpbmdcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVjb3JkaW5nRmlsZURlc2NyaXB0b3Ige1xyXG4gIHJlY29yZGluZzpQcm9tcHRJdGVtO1xyXG4gIHZlcnNpb246bnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmVjb3JkaW5nRmlsZURlc2NyaXB0b3JJbXBsIHtcclxuICByZWNvcmRpbmchOlByb21wdEl0ZW07XHJcbiAgdmVyc2lvbiE6bnVtYmVyO1xyXG4gIGZyYW1lcz86bnVtYmVyO1xyXG4gIHNhbXBsZXJhdGU/Om51bWJlcjtcclxuICBjaGFubmVscz86IG51bWJlcjtcclxuICBjb25zdHJ1Y3RvcigpIHt9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBSZWNvcmRpbmdGaWxlIHtcclxuICByZWNvcmRpbmdGaWxlSWQ6IHN0cmluZyB8IG51bWJlciB8IG51bGw9IG51bGw7XHJcbiAgdXVpZDpzdHJpbmd8bnVsbD1udWxsO1xyXG4gIHNlcnZlclBlcnNpc3RlZD1mYWxzZTtcclxuICBkYXRlOiBzdHJpbmd8bnVsbD1udWxsO1xyXG4gIF9kYXRlQXNEYXRlT2JqOkRhdGV8bnVsbD1udWxsO1xyXG4gIHN0YXJ0ZWREYXRlOiBzdHJpbmd8bnVsbD1udWxsO1xyXG4gIF9zdGFydGVkQXNEYXRlT2JqPzpEYXRlfG51bGw9bnVsbDtcclxuICBhdWRpb0RhdGFIb2xkZXI6QXVkaW9EYXRhSG9sZGVyfG51bGw9bnVsbDtcclxuICBzZXNzaW9uOnN0cmluZ3xudW1iZXJ8bnVsbD1udWxsO1xyXG4gIGNoYW5uZWxzOm51bWJlcnxudWxsPW51bGw7XHJcbiAgZnJhbWVzOm51bWJlcnxudWxsPW51bGw7XHJcbiAgc2FtcGxlcmF0ZTpudW1iZXJ8bnVsbD1udWxsO1xyXG4gIHRpbWVMZW5ndGg6bnVtYmVyfG51bGw9bnVsbDtcclxuICBlZGl0U2FtcGxlUmF0ZTpudW1iZXJ8bnVsbD1udWxsO1xyXG4gIGVkaXRTdGFydEZyYW1lOm51bWJlcnxudWxsPW51bGxcclxuICBlZGl0RW5kRnJhbWU6bnVtYmVyfG51bGw9bnVsbFxyXG5cclxuICBjb25zdHJ1Y3Rvcih1dWlkOnN0cmluZyxzZXNzaW9uSWQ6c3RyaW5nfG51bWJlcixhdWRpb0RhdGFIb2xkZXI6QXVkaW9EYXRhSG9sZGVyfG51bGwpIHtcclxuICAgIHRoaXMuc2Vzc2lvbj1zZXNzaW9uSWQ7XHJcbiAgICB0aGlzLmF1ZGlvRGF0YUhvbGRlcj1hdWRpb0RhdGFIb2xkZXJcclxuICAgIGlmKGF1ZGlvRGF0YUhvbGRlcil7XHJcbiAgICAgIHRoaXMuZnJhbWVzPWF1ZGlvRGF0YUhvbGRlci5mcmFtZUxlbjtcclxuICAgICAgdGhpcy50aW1lTGVuZ3RoPWF1ZGlvRGF0YUhvbGRlci5kdXJhdGlvbjtcclxuICAgIH1cclxuICAgIHRoaXMudXVpZD11dWlkO1xyXG4gIH1cclxuXHJcbiAgZmlsZW5hbWVTdHJpbmcoKTpzdHJpbmd7XHJcbiAgICBsZXQgZm5zOnN0cmluZz0nJztcclxuICAgIGlmKHRoaXMuc2Vzc2lvbil7XHJcbiAgICAgIGZucys9dGhpcy5zZXNzaW9uO1xyXG4gICAgICBmbnMrPSdfJztcclxuICAgIH1cclxuICAgIGZucys9dGhpcy51dWlkO1xyXG4gICAgcmV0dXJuIGZucztcclxuICB9XHJcblxyXG4gIGVxdWFscyhvdGhlclJlY29yZGluZ0ZpbGU6UmVjb3JkaW5nRmlsZXxudWxsKTpib29sZWFue1xyXG4gICAgaWYob3RoZXJSZWNvcmRpbmdGaWxlIT09bnVsbCkge1xyXG4gICAgICBpZiAob3RoZXJSZWNvcmRpbmdGaWxlID09PSB0aGlzKSB7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG90aGVyUmVjb3JkaW5nRmlsZS51dWlkID09PSB0aGlzLnV1aWQpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9TdHJpbmcoKTpzdHJpbmd7XHJcbiAgICByZXR1cm4gJ1JlY29yZGluZyBmaWxlOiBVVUlEOiAnK3RoaXMudXVpZCsnLCBzZXNzaW9uOiAnK3RoaXMuc2Vzc2lvbjtcclxuICB9XHJcblxyXG59XHJcblxyXG4gICAgZXhwb3J0IGNsYXNzIFNwclJlY29yZGluZ0ZpbGUgZXh0ZW5kcyBSZWNvcmRpbmdGaWxlIGltcGxlbWVudHMgIFJlY29yZGluZ0ZpbGVEZXNjcmlwdG9ye1xyXG5cclxuICAgICAgaXRlbUNvZGU6c3RyaW5nO1xyXG5cclxuICAgICAgcmVjb3JkaW5nITpQcm9tcHRJdGVtO1xyXG4gICAgICB2ZXJzaW9uITpudW1iZXI7XHJcblxyXG4gICAgICBjb25zdHJ1Y3RvcihzZXNzaW9uSWQ6c3RyaW5nfG51bWJlcixpdGVtY29kZTpzdHJpbmcsdmVyc2lvbjpudW1iZXIsYXVkaW9EYXRhSG9sZGVyOkF1ZGlvRGF0YUhvbGRlcnxudWxsKSB7XHJcbiAgICAgICAgICBzdXBlcihVVUlELmdlbmVyYXRlKCksc2Vzc2lvbklkLGF1ZGlvRGF0YUhvbGRlcik7XHJcbiAgICAgICAgICB0aGlzLnNlc3Npb249c2Vzc2lvbklkO1xyXG4gICAgICAgICAgdGhpcy5pdGVtQ29kZT1pdGVtY29kZTtcclxuICAgICAgICAgIHRoaXMudmVyc2lvbj12ZXJzaW9uO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZWNvcmRpbmdGaWxlRG9uZSgpOmJvb2xlYW57XHJcbiAgICAgICAgcmV0dXJuICh0aGlzLnNlcnZlclBlcnNpc3RlZD09PXRydWUpIHx8ICh0aGlzLmF1ZGlvRGF0YUhvbGRlciE9bnVsbCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGZpbGVuYW1lU3RyaW5nKCk6c3RyaW5ne1xyXG4gICAgICAgIGxldCBmbnM6c3RyaW5nPScnO1xyXG4gICAgICAgIGlmKHRoaXMuc2Vzc2lvbil7XHJcbiAgICAgICAgICAgIGZucys9dGhpcy5zZXNzaW9uO1xyXG4gICAgICAgICAgICBmbnMrPSdfJztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYodGhpcy5pdGVtQ29kZSl7XHJcbiAgICAgICAgICBmbnMrPXRoaXMuaXRlbUNvZGU7XHJcbiAgICAgICAgICBmbnMrPSdfJztcclxuICAgICAgICB9XHJcbiAgICAgICAgZm5zKz10aGlzLnV1aWQ7XHJcbiAgICAgICAgcmV0dXJuIGZucztcclxuICAgICAgfVxyXG5cclxuICAgICAgdG9TdHJpbmcoKTpzdHJpbmd7XHJcbiAgICAgICAgcmV0dXJuICdSZWNvcmRpbmcgZmlsZTogVVVJRDogJyt0aGlzLnV1aWQrJywgc2Vzc2lvbjogJyt0aGlzLnNlc3Npb24rJywgaXRlbWNvZGU6ICcrdGhpcy5pdGVtQ29kZSsnLCB2ZXJzaW9uOiAnK3RoaXMudmVyc2lvbisnLCBVVUlEOiAnK3RoaXMudXVpZDtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgY2xhc3MgUmVjb3JkaW5nRmlsZVV0aWxze1xyXG5cclxuICAgICAgc3RhdGljIGVxdWFscyhyZWNvcmRpbkZpbGU6UmVjb3JkaW5nRmlsZXxudWxsLG90aGVyUmVjb3JkaW5nRmlsZTpSZWNvcmRpbmdGaWxlfG51bGwpOmJvb2xlYW57XHJcbiAgICAgICAgaWYocmVjb3JkaW5GaWxlICYmIG90aGVyUmVjb3JkaW5nRmlsZSl7XHJcbiAgICAgICAgICBpZiAob3RoZXJSZWNvcmRpbmdGaWxlID09PSByZWNvcmRpbkZpbGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAob3RoZXJSZWNvcmRpbmdGaWxlLnV1aWQgPT09IHJlY29yZGluRmlsZS51dWlkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHN0YXRpYyBzZXRBdWRpb0RhdGEocmY6UmVjb3JkaW5nRmlsZSxhdWRpb0RhdGFIb2xkZXI6QXVkaW9EYXRhSG9sZGVyfG51bGwpe1xyXG4gICAgICAgICAgcmYuYXVkaW9EYXRhSG9sZGVyPWF1ZGlvRGF0YUhvbGRlcjtcclxuICAgICAgICAgIGlmKGF1ZGlvRGF0YUhvbGRlcikge1xyXG4gICAgICAgICAgICBpZihyZi5zYW1wbGVyYXRlPT1udWxsKXtcclxuICAgICAgICAgICAgICByZi5zYW1wbGVyYXRlPWF1ZGlvRGF0YUhvbGRlci5zYW1wbGVSYXRlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHJmLmZyYW1lcz09bnVsbCkge1xyXG4gICAgICAgICAgICAgIHJmLmZyYW1lcyA9IGF1ZGlvRGF0YUhvbGRlci5mcmFtZUxlbjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZi50aW1lTGVuZ3RoPWF1ZGlvRGF0YUhvbGRlci5kdXJhdGlvbjtcclxuICAgICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgc3RhdGljIHNhbXBsZUNvdW50KHJmOlJlY29yZGluZ0ZpbGUpOm51bWJlcntcclxuICAgICAgICBpZihyZi5hdWRpb0RhdGFIb2xkZXIpe1xyXG4gICAgICAgICAgcmV0dXJuIHJmLmF1ZGlvRGF0YUhvbGRlci5zYW1wbGVDb3VudHMoKTtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBzdGF0aWMgZXhwaXJlQXVkaW9EYXRhKHJmOlJlY29yZGluZ0ZpbGUpOm51bWJlcntcclxuICAgICAgICBsZXQgZXhwaXJlZFNhbXBsZXM9MDtcclxuICAgICAgICBpZihyZiAmJiByZi5hdWRpb0RhdGFIb2xkZXIpe1xyXG4gICAgICAgICAgZXhwaXJlZFNhbXBsZXM9cmYuYXVkaW9EYXRhSG9sZGVyLnNhbXBsZUNvdW50cygpO1xyXG4gICAgICAgICAgcmYuYXVkaW9EYXRhSG9sZGVyLnJlbGVhc2VBdWRpb0RhdGEoKVxyXG4gICAgICAgICAgcmYuYXVkaW9EYXRhSG9sZGVyPW51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBleHBpcmVkU2FtcGxlcztcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuIl19
|
|
@@ -1,221 +0,0 @@
|
|
|
1
|
-
var BasicRecordingService_1;
|
|
2
|
-
import { __decorate, __param } from "tslib";
|
|
3
|
-
import { HttpHeaders } from "@angular/common/http";
|
|
4
|
-
import { Inject } from "@angular/core";
|
|
5
|
-
import { ApiType, SPEECHRECORDER_CONFIG } from "../../spr.config";
|
|
6
|
-
import { Observable } from "rxjs";
|
|
7
|
-
import { NetAudioBuffer } from "../../audio/net_audio_buffer";
|
|
8
|
-
import { UUID } from "../../utils/utils";
|
|
9
|
-
import { WavReader } from "../../audio/impl/wavreader";
|
|
10
|
-
import { AudioContextProvider } from "../../audio/context";
|
|
11
|
-
export class ChunkDownload {
|
|
12
|
-
get orgPCMAudioFormat() {
|
|
13
|
-
return this._orgPCMAudioFormat;
|
|
14
|
-
}
|
|
15
|
-
get orgFrameLength() {
|
|
16
|
-
return this._orgFrameLength;
|
|
17
|
-
}
|
|
18
|
-
get decodedAudioBuffer() {
|
|
19
|
-
return this._decodedAudioBuffer;
|
|
20
|
-
}
|
|
21
|
-
constructor(_orgPCMAudioFormat, _orgFrameLength, _decodedAudioBuffer) {
|
|
22
|
-
this._orgPCMAudioFormat = _orgPCMAudioFormat;
|
|
23
|
-
this._orgFrameLength = _orgFrameLength;
|
|
24
|
-
this._decodedAudioBuffer = _decodedAudioBuffer;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
let BasicRecordingService = class BasicRecordingService {
|
|
28
|
-
static { BasicRecordingService_1 = this; }
|
|
29
|
-
// iPad 9th generation, iOS 15.7.1, sometimes:
|
|
30
|
-
// Failed to load resource: WebKit hat einen internen Fehler festgestellt
|
|
31
|
-
// Firefox on Windows crashes
|
|
32
|
-
static { this.DEFAULT_CHUNKED_DOWNLOAD_SECONDS = 10; }
|
|
33
|
-
static { this.DEFAULT_MAX_NET_AUTO_MEM_STORE_SAMPLES = 2880000 * 5; } // Default 5 minutes one channel at 48kHz
|
|
34
|
-
constructor(http, config) {
|
|
35
|
-
this.http = http;
|
|
36
|
-
this.config = config;
|
|
37
|
-
this._maxAutoNetMemStoreSamples = Number.MAX_SAFE_INTEGER;
|
|
38
|
-
this.withCredentials = false;
|
|
39
|
-
this.apiEndPoint = '';
|
|
40
|
-
if (config && config.apiEndPoint) {
|
|
41
|
-
this.apiEndPoint = config.apiEndPoint;
|
|
42
|
-
}
|
|
43
|
-
if (this.apiEndPoint !== '') {
|
|
44
|
-
this.apiEndPoint = this.apiEndPoint + '/';
|
|
45
|
-
}
|
|
46
|
-
if (config != null && config.withCredentials != null) {
|
|
47
|
-
this.withCredentials = config.withCredentials;
|
|
48
|
-
}
|
|
49
|
-
if (config && config.apiVersion > 1) {
|
|
50
|
-
this._maxAutoNetMemStoreSamples = BasicRecordingService_1.DEFAULT_MAX_NET_AUTO_MEM_STORE_SAMPLES;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
audioRequestByURL(audioBaseUrl, audioURLSearchParams) {
|
|
54
|
-
let audioUrl = audioBaseUrl;
|
|
55
|
-
if (this.config && this.config.apiType === ApiType.FILES) {
|
|
56
|
-
// for development and demo
|
|
57
|
-
audioUrl = audioUrl + '.wav';
|
|
58
|
-
// append UUID to make request URL unique to avoid localhost server caching
|
|
59
|
-
audioURLSearchParams.set('requestUUID', UUID.generate());
|
|
60
|
-
//audioUrl = audioUrl + '.wav?requestUUID=' + UUID.generate();
|
|
61
|
-
}
|
|
62
|
-
audioUrl = audioUrl + '?' + audioURLSearchParams.toString();
|
|
63
|
-
let headers = new HttpHeaders();
|
|
64
|
-
headers = headers.set('Accept', 'audio/wav');
|
|
65
|
-
return this.http.get(audioUrl, {
|
|
66
|
-
headers: headers,
|
|
67
|
-
observe: 'response',
|
|
68
|
-
responseType: 'arraybuffer',
|
|
69
|
-
withCredentials: this.withCredentials
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
chunkAudioRequest(baseAudioUrl, startFrame = 0, frameLength) {
|
|
73
|
-
let ausps = new URLSearchParams();
|
|
74
|
-
ausps.set('startFrame', startFrame.toString());
|
|
75
|
-
ausps.set('frameLength', frameLength.toString());
|
|
76
|
-
if (this.config && this.config.apiType === ApiType.FILES) {
|
|
77
|
-
// for development and demo
|
|
78
|
-
// append UUID to make request URL unique to avoid localhost server caching
|
|
79
|
-
//audioUrl = audioUrl + '.wav?requestUUID=' + UUID.generate();
|
|
80
|
-
ausps.set('requestUUID', UUID.generate());
|
|
81
|
-
}
|
|
82
|
-
let obs = new Observable(observer => {
|
|
83
|
-
this.audioRequestByURL(baseAudioUrl, ausps).subscribe({
|
|
84
|
-
next: resp => {
|
|
85
|
-
// Do not use Promise version, which does not work with Safari 13 (13.0.5)
|
|
86
|
-
if (resp.body) {
|
|
87
|
-
//console.debug("chunkAudioRequest: observer.closed: "+observer.closed);
|
|
88
|
-
//console.debug("Audio file bytes: "+resp.body.byteLength);
|
|
89
|
-
// Check original audio format
|
|
90
|
-
let wr = new WavReader(resp.body);
|
|
91
|
-
const pcmFmt = wr.readFormat();
|
|
92
|
-
const orgFl = wr.frameLength();
|
|
93
|
-
// if(pcmFmt){
|
|
94
|
-
// console.debug("Original WAVE format of download chunk: "+pcmFmt);
|
|
95
|
-
// }else{
|
|
96
|
-
// console.error("Could not read WAVE format of original download chunk!");
|
|
97
|
-
// }
|
|
98
|
-
// if(orgFl){
|
|
99
|
-
// console.debug("Original frame length of download chunk: "+orgFl);
|
|
100
|
-
// }else{
|
|
101
|
-
// console.error("Could not read WAVE format of original download chunk!");
|
|
102
|
-
// }
|
|
103
|
-
if (pcmFmt && orgFl) {
|
|
104
|
-
AudioContextProvider.decodeAudioData(resp.body).then((ab) => {
|
|
105
|
-
//console.debug("Decoded audio chunk frames: "+ab.length);
|
|
106
|
-
let chDl = new ChunkDownload(pcmFmt, orgFl, ab);
|
|
107
|
-
observer.next(chDl);
|
|
108
|
-
observer.complete();
|
|
109
|
-
}).catch(error => {
|
|
110
|
-
//if(error instanceof HttpErrorResponse) {
|
|
111
|
-
// if (error.status == 404) {
|
|
112
|
-
// // Interpret not as an error, the file ist not recorded yet
|
|
113
|
-
// observer.next(null);
|
|
114
|
-
// observer.complete()
|
|
115
|
-
// } else {
|
|
116
|
-
// // all other states are errors
|
|
117
|
-
console.error("Recordings service chunkAudioRequest error decoding audio data: " + error.name + ": " + error.message);
|
|
118
|
-
observer.error(error);
|
|
119
|
-
// }
|
|
120
|
-
// }
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
else {
|
|
124
|
-
const errMsg = 'Could not parse audio header for format and/or frame length of download.';
|
|
125
|
-
console.error(errMsg);
|
|
126
|
-
observer.error(errMsg);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
const errMsg = 'Fetching audio file: response has no body';
|
|
131
|
-
console.error(errMsg);
|
|
132
|
-
observer.error(errMsg);
|
|
133
|
-
}
|
|
134
|
-
}, error: (error) => {
|
|
135
|
-
// all other states are errors
|
|
136
|
-
//const errMsg='Fetching audio file HTTP error: '+error;
|
|
137
|
-
//console.error(errMsg);
|
|
138
|
-
observer.error(error);
|
|
139
|
-
//observer.complete();
|
|
140
|
-
}
|
|
141
|
-
});
|
|
142
|
-
});
|
|
143
|
-
return obs;
|
|
144
|
-
}
|
|
145
|
-
chunkAudioRequestToNetAudioBuffer(baseAudioUrl, startFrame = 0, orgSampleRate, seconds, frames) {
|
|
146
|
-
//let audioUrl=baseAudioUrl+'?startFrame='+startFrame+'&frameLength='+frameLength;
|
|
147
|
-
//let audioUrl=new URL(baseAudioUrl);
|
|
148
|
-
// if(orgSampleRate!=null && frameLength%orgSampleRate>0){
|
|
149
|
-
// const errMsg='frameLength must be equal or multiple of original samplerate.';
|
|
150
|
-
// console.error(errMsg+' ('+frameLength+'%'+orgSampleRate+'=='+(frameLength%orgSampleRate)+')');
|
|
151
|
-
// throw Error(errMsg)
|
|
152
|
-
// }
|
|
153
|
-
let frameLength = orgSampleRate * Math.round(seconds);
|
|
154
|
-
let ausps = new URLSearchParams();
|
|
155
|
-
ausps.set('startFrame', startFrame.toString());
|
|
156
|
-
ausps.set('frameLength', frameLength.toString());
|
|
157
|
-
if (this.config && this.config.apiType === ApiType.FILES) {
|
|
158
|
-
// for development and demo
|
|
159
|
-
// append UUID to make request URL unique to avoid localhost server caching
|
|
160
|
-
//audioUrl = audioUrl + '.wav?requestUUID=' + UUID.generate();
|
|
161
|
-
ausps.set('requestUUID', UUID.generate());
|
|
162
|
-
}
|
|
163
|
-
let obs = new Observable(subscriber => {
|
|
164
|
-
this.audioRequestByURL(baseAudioUrl, ausps).subscribe({ next: (resp) => {
|
|
165
|
-
// Do not use Promise version, which does not work with Safari 13 (13.0.5)
|
|
166
|
-
if (resp.body) {
|
|
167
|
-
//console.debug("chunkAudioRequestTonetAb: subscriber.closed: "+subscriber.closed);
|
|
168
|
-
//console.debug("chunkAudioRequestTonetAb: Audio file bytes: "+resp.body.byteLength);
|
|
169
|
-
AudioContextProvider.decodeAudioData(resp.body).then(ab => {
|
|
170
|
-
//console.debug("chunkAudioRequestTonetAb: Decoded audio chunk frames for netAb: "+ab.length);
|
|
171
|
-
//console.debug("chunkAudioRequestTonetAb: Create netAb ab from chunk ab...");
|
|
172
|
-
if (frames === null) {
|
|
173
|
-
subscriber.error(new Error('Could not get frame length from recording file object'));
|
|
174
|
-
}
|
|
175
|
-
else {
|
|
176
|
-
let fl = frames;
|
|
177
|
-
if (ab.sampleRate !== orgSampleRate) {
|
|
178
|
-
if (orgSampleRate && frames) {
|
|
179
|
-
fl = Math.round(ab.sampleRate * frames / orgSampleRate);
|
|
180
|
-
//console.debug("Platform sr: "+ab.sampleRate+", file sr: "+orgSampleRate+", decoded/org frame length: "+fl+"/"+frames+", ab.length: "+ab.length);
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
let nab = NetAudioBuffer.fromChunkAudioBuffer(this, baseAudioUrl, ab, fl, frameLength);
|
|
184
|
-
//let rp=new ReadyProvider();
|
|
185
|
-
//nab.readyProvider=rp;
|
|
186
|
-
//rp.ready();
|
|
187
|
-
nab.ready();
|
|
188
|
-
if (nab.frameLen < frameLength) {
|
|
189
|
-
//console.debug("chunkAudioRequestTonetAb: Built netAb ab from chunk ab: First chunk shorter tha frameLength ("+netAbAudioBuffer.frameLen+"<"+frameLength+"), assuming end of data, sealing netAb ab.");
|
|
190
|
-
nab.seal();
|
|
191
|
-
}
|
|
192
|
-
subscriber.next(nab);
|
|
193
|
-
subscriber.complete();
|
|
194
|
-
}
|
|
195
|
-
}).catch(error => {
|
|
196
|
-
console.error('chunkAudioRequestToNetAb: error: ' + error);
|
|
197
|
-
//if(error instanceof HttpErrorResponse) {
|
|
198
|
-
subscriber.error(error);
|
|
199
|
-
//}
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
else {
|
|
203
|
-
console.error('chunkAudioRequestToNetAb: Fetching audio file: response has no body');
|
|
204
|
-
subscriber.error('chunkAudioRequestToNetAb: Fetching audio file: response has no body');
|
|
205
|
-
}
|
|
206
|
-
},
|
|
207
|
-
error: (error) => {
|
|
208
|
-
console.error('chunkAudioRequestToNetAb: error: ' + error);
|
|
209
|
-
subscriber.error(error);
|
|
210
|
-
//subscriber.complete();
|
|
211
|
-
}
|
|
212
|
-
});
|
|
213
|
-
});
|
|
214
|
-
return obs;
|
|
215
|
-
}
|
|
216
|
-
};
|
|
217
|
-
BasicRecordingService = BasicRecordingService_1 = __decorate([
|
|
218
|
-
__param(1, Inject(SPEECHRECORDER_CONFIG))
|
|
219
|
-
], BasicRecordingService);
|
|
220
|
-
export { BasicRecordingService };
|
|
221
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzaWNfcmVjb3JkaW5nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvc3BlZWNocmVjb3JkZXIvcmVjb3JkaW5ncy9iYXNpY19yZWNvcmRpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBYyxXQUFXLEVBQWdCLE1BQU0sc0JBQXNCLENBQUM7QUFDN0UsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLEVBQUMsT0FBTyxFQUFFLHFCQUFxQixFQUF1QixNQUFNLGtCQUFrQixDQUFDO0FBQ3RGLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDaEMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQzVELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUN2QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFFckQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFekQsTUFBTSxPQUFPLGFBQWE7SUFDeEIsSUFBSSxpQkFBaUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUM7SUFDakMsQ0FBQztJQUVELElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUksa0JBQWtCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDO0lBQ2xDLENBQUM7SUFDRCxZQUFvQixrQkFBaUMsRUFBUyxlQUFzQixFQUFTLG1CQUErQjtRQUF4Ryx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQWU7UUFBUyxvQkFBZSxHQUFmLGVBQWUsQ0FBTztRQUFTLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBWTtJQUFFLENB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QUMsS0FBSyxDQUFDLHFFQUFxRSxDQUFDLENBQUM7d0JBQ3JGLFVBQVUsQ0FBQyxLQUFLLENBQUMscUVBQXFFLENBQUMsQ0FBQztvQkFDNUYsQ0FBQztnQkFDTCxDQUFDO2dCQUNELEtBQUssRUFBQyxDQUFDLEtBQUssRUFBRSxFQUFFO29CQUNaLE9BQU8sQ0FBQyxLQUFLLENBQUMsbUNBQW1DLEdBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3pELFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3hCLHdCQUF3QjtnQkFDNUIsQ0FBQzthQUNKLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDOztBQXhNUSxxQkFBcUI7SUFVVyxXQUFBLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO0dBVjdELHFCQUFxQixDQTBNakMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50LCBIdHRwSGVhZGVycywgSHR0cFJlc3BvbnNlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7SW5qZWN0fSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0FwaVR5cGUsIFNQRUVDSFJFQ09SREVSX0NPTkZJRywgU3BlZWNoUmVjb3JkZXJDb25maWd9IGZyb20gXCIuLi8uLi9zcHIuY29uZmlnXCI7XHJcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtOZXRBdWRpb0J1ZmZlcn0gZnJvbSBcIi4uLy4uL2F1ZGlvL25ldF9hdWRpb19idWZmZXJcIjtcclxuaW1wb3J0IHtVVUlEfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcclxuaW1wb3J0IHtXYXZSZWFkZXJ9IGZyb20gXCIuLi8uLi9hdWRpby9pbXBsL3dhdnJlYWRlclwiO1xyXG5pbXBvcnQge1BDTUF1ZGlvRm9ybWF0fSBmcm9tIFwiLi4vLi4vYXVkaW8vZm9ybWF0XCI7XHJcbmltcG9ydCB7QXVkaW9Db250ZXh0UHJvdmlkZXJ9IGZyb20gXCIuLi8uLi9hdWRpby9jb250ZXh0XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ2h1bmtEb3dubG9hZHtcclxuICBnZXQgb3JnUENNQXVkaW9Gb3JtYXQoKTogUENNQXVkaW9Gb3JtYXQge1xyXG4gICAgcmV0dXJuIHRoaXMuX29yZ1BDTUF1ZGlvRm9ybWF0O1xyXG4gIH1cclxuXHJcbiAgZ2V0IG9yZ0ZyYW1lTGVuZ3RoKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3JnRnJhbWVMZW5ndGg7XHJcbiAgfVxyXG5cclxuICBnZXQgZGVjb2RlZEF1ZGlvQnVmZmVyKCk6IEF1ZGlvQnVmZmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVkQXVkaW9CdWZmZXI7XHJcbiAgfVxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX29yZ1BDTUF1ZGlvRm9ybWF0OlBDTUF1ZGlvRm9ybWF0LHByaXZhdGUgX29yZ0ZyYW1lTGVuZ3RoOm51bWJlcixwcml2YXRlIF9kZWNvZGVkQXVkaW9CdWZmZXI6QXVkaW9CdWZmZXIpe31cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEJhc2ljUmVjb3JkaW5nU2VydmljZXtcclxuICAvLyBpUGFkIDl0aCBnZW5lcmF0aW9uLCBpT1MgMTUuNy4xLCBzb21ldGltZXM6XHJcbiAgLy8gRmFpbGVkIHRvIGxvYWQgcmVzb3VyY2U6IFdlYktpdCBoYXQgZWluZW4gaW50ZXJuZW4gRmVobGVyIGZlc3RnZXN0ZWxsdFxyXG4gIC8vIEZpcmVmb3ggb24gV2luZG93cyBjcmFzaGVzXHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0NIVU5LRURfRE9XTkxPQURfU0VDT05EUzpudW1iZXI9MTA7XHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBERUZBVUxUX01BWF9ORVRfQVVUT19NRU1fU1RPUkVfU0FNUExFUzpudW1iZXI9Mjg4MDAwMCo1OyAvLyBEZWZhdWx0IDUgbWludXRlcyBvbmUgY2hhbm5lbCBhdCA0OGtIelxyXG4gIHByb3RlY3RlZCBfbWF4QXV0b05ldE1lbVN0b3JlU2FtcGxlczpudW1iZXI9TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XHJcbiAgICBwcm90ZWN0ZWQgYXBpRW5kUG9pbnQ6IHN0cmluZztcclxuICAgIHByb3RlY3RlZCB3aXRoQ3JlZGVudGlhbHM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaHR0cDogSHR0cENsaWVudCwgQEluamVjdChTUEVFQ0hSRUNPUkRFUl9DT05GSUcpIHByb3RlY3RlZCBjb25maWc/OiBTcGVlY2hSZWNvcmRlckNvbmZpZykge1xyXG4gICAgICAgIHRoaXMuYXBpRW5kUG9pbnQgPSAnJ1xyXG5cclxuICAgICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5hcGlFbmRQb2ludCkge1xyXG4gICAgICAgICAgICB0aGlzLmFwaUVuZFBvaW50ID0gY29uZmlnLmFwaUVuZFBvaW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5hcGlFbmRQb2ludCAhPT0gJycpIHtcclxuICAgICAgICAgICAgdGhpcy5hcGlFbmRQb2ludCA9IHRoaXMuYXBpRW5kUG9pbnQgKyAnLydcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsICYmIGNvbmZpZy53aXRoQ3JlZGVudGlhbHMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLndpdGhDcmVkZW50aWFscyA9IGNvbmZpZy53aXRoQ3JlZGVudGlhbHM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGNvbmZpZyAmJiBjb25maWcuYXBpVmVyc2lvbj4xKXtcclxuICAgICAgICAgIHRoaXMuX21heEF1dG9OZXRNZW1TdG9yZVNhbXBsZXM9QmFzaWNSZWNvcmRpbmdTZXJ2aWNlLkRFRkFVTFRfTUFYX05FVF9BVVRPX01FTV9TVE9SRV9TQU1QTEVTO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgYXVkaW9SZXF1ZXN0QnlVUkwoYXVkaW9CYXNlVXJsOnN0cmluZyxhdWRpb1VSTFNlYXJjaFBhcmFtczpVUkxTZWFyY2hQYXJhbXMpOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBcnJheUJ1ZmZlcj4+IHtcclxuICAgICAgICBsZXQgYXVkaW9Vcmw9YXVkaW9CYXNlVXJsO1xyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5hcGlUeXBlID09PSBBcGlUeXBlLkZJTEVTKSB7XHJcbiAgICAgICAgICAgIC8vIGZvciBkZXZlbG9wbWVudCBhbmQgZGVtb1xyXG4gICAgICAgICAgICBhdWRpb1VybD1hdWRpb1VybCsnLndhdic7XHJcbiAgICAgICAgICAgIC8vIGFwcGVuZCBVVUlEIHRvIG1ha2UgcmVxdWVzdCBVUkwgdW5pcXVlIHRvIGF2b2lkIGxvY2FsaG9zdCBzZXJ2ZXIgY2FjaGluZ1xyXG4gICAgICAgICAgICBhdWRpb1VSTFNlYXJjaFBhcmFtcy5zZXQoJ3JlcXVlc3RVVUlEJyxVVUlELmdlbmVyYXRlKCkpO1xyXG4gICAgICAgICAgICAvL2F1ZGlvVXJsID0gYXVkaW9VcmwgKyAnLndhdj9yZXF1ZXN0VVVJRD0nICsgVVVJRC5nZW5lcmF0ZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXVkaW9Vcmw9YXVkaW9VcmwrJz8nK2F1ZGlvVVJMU2VhcmNoUGFyYW1zLnRvU3RyaW5nKCk7XHJcblxyXG4gICAgICAgIGxldCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcbiAgICAgICAgaGVhZGVycyA9IGhlYWRlcnMuc2V0KCdBY2NlcHQnLCAnYXVkaW8vd2F2Jyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYXVkaW9VcmwsIHtcclxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyxcclxuICAgICAgICAgICAgb2JzZXJ2ZTogJ3Jlc3BvbnNlJyxcclxuICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnYXJyYXlidWZmZXInLFxyXG4gICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMud2l0aENyZWRlbnRpYWxzXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIHB1YmxpYyBjaHVua0F1ZGlvUmVxdWVzdChiYXNlQXVkaW9Vcmw6c3RyaW5nLHN0YXJ0RnJhbWU6bnVtYmVyPTAsZnJhbWVMZW5ndGg6bnVtYmVyKTogT2JzZXJ2YWJsZTxDaHVua0Rvd25sb2FkfG51bGw+IHtcclxuXHJcbiAgICAgICAgbGV0IGF1c3BzPW5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcclxuICAgICAgICBhdXNwcy5zZXQoJ3N0YXJ0RnJhbWUnLHN0YXJ0RnJhbWUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgYXVzcHMuc2V0KCdmcmFtZUxlbmd0aCcsZnJhbWVMZW5ndGgudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmFwaVR5cGUgPT09IEFwaVR5cGUuRklMRVMpIHtcclxuICAgICAgICAgICAgLy8gZm9yIGRldmVsb3BtZW50IGFuZCBkZW1vXHJcbiAgICAgICAgICAgIC8vIGFwcGVuZCBVVUlEIHRvIG1ha2UgcmVxdWVzdCBVUkwgdW5pcXVlIHRvIGF2b2lkIGxvY2FsaG9zdCBzZXJ2ZXIgY2FjaGluZ1xyXG4gICAgICAgICAgICAvL2F1ZGlvVXJsID0gYXVkaW9VcmwgKyAnLndhdj9yZXF1ZXN0VVVJRD0nICsgVVVJRC5nZW5lcmF0ZSgpO1xyXG4gICAgICAgICAgICBhdXNwcy5zZXQoJ3JlcXVlc3RVVUlEJyxVVUlELmdlbmVyYXRlKCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IG9icz1uZXcgT2JzZXJ2YWJsZTxDaHVua0Rvd25sb2FkfG51bGw+KG9ic2VydmVyPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmF1ZGlvUmVxdWVzdEJ5VVJMKGJhc2VBdWRpb1VybCxhdXNwcykuc3Vic2NyaWJlKFxyXG4gICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIG5leHQ6IHJlc3AgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgdXNlIFByb21pc2UgdmVyc2lvbiwgd2hpY2ggZG9lcyBub3Qgd29yayB3aXRoIFNhZmFyaSAxMyAoMTMuMC41KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcC5ib2R5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJjaHVua0F1ZGlvUmVxdWVzdDogb2JzZXJ2ZXIuY2xvc2VkOiBcIitvYnNlcnZlci5jbG9zZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiQXVkaW8gZmlsZSBieXRlczogXCIrcmVzcC5ib2R5LmJ5dGVMZW5ndGgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIG9yaWdpbmFsIGF1ZGlvIGZvcm1hdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdyID0gbmV3IFdhdlJlYWRlcihyZXNwLmJvZHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGNtRm10ID0gd3IucmVhZEZvcm1hdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JnRmwgPSB3ci5mcmFtZUxlbmd0aCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYocGNtRm10KXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgY29uc29sZS5kZWJ1ZyhcIk9yaWdpbmFsIFdBVkUgZm9ybWF0IG9mIGRvd25sb2FkIGNodW5rOiBcIitwY21GbXQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGNvbnNvbGUuZXJyb3IoXCJDb3VsZCBub3QgcmVhZCBXQVZFIGZvcm1hdCBvZiBvcmlnaW5hbCBkb3dubG9hZCBjaHVuayFcIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZihvcmdGbCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGNvbnNvbGUuZGVidWcoXCJPcmlnaW5hbCBmcmFtZSBsZW5ndGggb2YgZG93bmxvYWQgY2h1bms6IFwiK29yZ0ZsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBjb25zb2xlLmVycm9yKFwiQ291bGQgbm90IHJlYWQgV0FWRSBmb3JtYXQgb2Ygb3JpZ2luYWwgZG93bmxvYWQgY2h1bmshXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwY21GbXQgJiYgb3JnRmwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Db250ZXh0UHJvdmlkZXIuZGVjb2RlQXVkaW9EYXRhKHJlc3AuYm9keSkudGhlbigoYWIpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiRGVjb2RlZCBhdWRpbyBjaHVuayBmcmFtZXM6IFwiK2FiLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoRGwgPSBuZXcgQ2h1bmtEb3dubG9hZChwY21GbXQsIG9yZ0ZsLCBhYik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChjaERsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZihlcnJvciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGVycm9yLnN0YXR1cyA9PSA0MDQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIC8vIEludGVycHJldCBub3QgYXMgYW4gZXJyb3IsIHRoZSBmaWxlIGlzdCBub3QgcmVjb3JkZWQgeWV0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBvYnNlcnZlci5uZXh0KG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgb2JzZXJ2ZXIuY29tcGxldGUoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAvLyBhbGwgb3RoZXIgc3RhdGVzIGFyZSBlcnJvcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUmVjb3JkaW5ncyBzZXJ2aWNlIGNodW5rQXVkaW9SZXF1ZXN0IGVycm9yIGRlY29kaW5nIGF1ZGlvIGRhdGE6IFwiICsgZXJyb3IubmFtZSArIFwiOiBcIiArIGVycm9yLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyTXNnID0gJ0NvdWxkIG5vdCBwYXJzZSBhdWRpbyBoZWFkZXIgZm9yIGZvcm1hdCBhbmQvb3IgZnJhbWUgbGVuZ3RoIG9mIGRvd25sb2FkLic7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJNc2cpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGVyck1zZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJNc2cgPSAnRmV0Y2hpbmcgYXVkaW8gZmlsZTogcmVzcG9uc2UgaGFzIG5vIGJvZHknO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJNc2cpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyTXNnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIGVycm9yOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBvdGhlciBzdGF0ZXMgYXJlIGVycm9yc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zdCBlcnJNc2c9J0ZldGNoaW5nIGF1ZGlvIGZpbGUgSFRUUCBlcnJvcjogJytlcnJvcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5lcnJvcihlcnJNc2cpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9vYnNlcnZlci5jb21wbGV0ZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG9icztcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJvdGVjdGVkIGNodW5rQXVkaW9SZXF1ZXN0VG9OZXRBdWRpb0J1ZmZlcihiYXNlQXVkaW9Vcmw6IHN0cmluZywgc3RhcnRGcmFtZTogbnVtYmVyID0gMCwgb3JnU2FtcGxlUmF0ZTogbnVtYmVyLCBzZWNvbmRzOm51bWJlcixmcmFtZXM6IG51bWJlciB8IG51bGwpOiBPYnNlcnZhYmxlPE5ldEF1ZGlvQnVmZmVyIHwgbnVsbD4ge1xyXG4gICAgICAgIC8vbGV0IGF1ZGlvVXJsPWJhc2VBdWRpb1VybCsnP3N0YXJ0RnJhbWU9JytzdGFydEZyYW1lKycmZnJhbWVMZW5ndGg9JytmcmFtZUxlbmd0aDtcclxuICAgICAgICAvL2xldCBhdWRpb1VybD1uZXcgVVJMKGJhc2VBdWRpb1VybCk7XHJcbiAgICAgICAgLy8gaWYob3JnU2FtcGxlUmF0ZSE9bnVsbCAmJiBmcmFtZUxlbmd0aCVvcmdTYW1wbGVSYXRlPjApe1xyXG4gICAgICAgIC8vICAgY29uc3QgZXJyTXNnPSdmcmFtZUxlbmd0aCBtdXN0IGJlIGVxdWFsIG9yIG11bHRpcGxlIG9mIG9yaWdpbmFsIHNhbXBsZXJhdGUuJztcclxuICAgICAgICAvLyAgIGNvbnNvbGUuZXJyb3IoZXJyTXNnKycgKCcrZnJhbWVMZW5ndGgrJyUnK29yZ1NhbXBsZVJhdGUrJz09JysoZnJhbWVMZW5ndGglb3JnU2FtcGxlUmF0ZSkrJyknKTtcclxuICAgICAgICAvLyAgIHRocm93IEVycm9yKGVyck1zZylcclxuICAgICAgICAvLyB9XHJcbiAgICAgICAgbGV0IGZyYW1lTGVuZ3RoOm51bWJlcj1vcmdTYW1wbGVSYXRlKk1hdGgucm91bmQoc2Vjb25kcyk7XHJcbiAgICAgICAgbGV0IGF1c3BzPW5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcclxuICAgICAgICBhdXNwcy5zZXQoJ3N0YXJ0RnJhbWUnLHN0YXJ0RnJhbWUudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgYXVzcHMuc2V0KCdmcmFtZUxlbmd0aCcsZnJhbWVMZW5ndGgudG9TdHJpbmcoKSk7XHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmFwaVR5cGUgPT09IEFwaVR5cGUuRklMRVMpIHtcclxuICAgICAgICAgICAgLy8gZm9yIGRldmVsb3BtZW50IGFuZCBkZW1vXHJcbiAgICAgICAgICAgIC8vIGFwcGVuZCBVVUlEIHRvIG1ha2UgcmVxdWVzdCBVUkwgdW5pcXVlIHRvIGF2b2lkIGxvY2FsaG9zdCBzZXJ2ZXIgY2FjaGluZ1xyXG4gICAgICAgICAgICAvL2F1ZGlvVXJsID0gYXVkaW9VcmwgKyAnLndhdj9yZXF1ZXN0VVVJRD0nICsgVVVJRC5nZW5lcmF0ZSgpO1xyXG4gICAgICAgICAgICBhdXNwcy5zZXQoJ3JlcXVlc3RVVUlEJyxVVUlELmdlbmVyYXRlKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgb2JzPW5ldyBPYnNlcnZhYmxlPE5ldEF1ZGlvQnVmZmVyfG51bGw+KHN1YnNjcmliZXI9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYXVkaW9SZXF1ZXN0QnlVUkwoYmFzZUF1ZGlvVXJsLGF1c3BzKS5zdWJzY3JpYmUoe25leHQ6KHJlc3ApID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgdXNlIFByb21pc2UgdmVyc2lvbiwgd2hpY2ggZG9lcyBub3Qgd29yayB3aXRoIFNhZmFyaSAxMyAoMTMuMC41KVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwLmJvZHkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiY2h1bmtBdWRpb1JlcXVlc3RUb25ldEFiOiBzdWJzY3JpYmVyLmNsb3NlZDogXCIrc3Vic2NyaWJlci5jbG9zZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJjaHVua0F1ZGlvUmVxdWVzdFRvbmV0QWI6IEF1ZGlvIGZpbGUgYnl0ZXM6IFwiK3Jlc3AuYm9keS5ieXRlTGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Db250ZXh0UHJvdmlkZXIuZGVjb2RlQXVkaW9EYXRhKHJlc3AuYm9keSkudGhlbihhYiA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiY2h1bmtBdWRpb1JlcXVlc3RUb25ldEFiOiBEZWNvZGVkIGF1ZGlvIGNodW5rIGZyYW1lcyBmb3IgbmV0QWI6IFwiK2FiLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiY2h1bmtBdWRpb1JlcXVlc3RUb25ldEFiOiBDcmVhdGUgbmV0QWIgYWIgZnJvbSBjaHVuayBhYi4uLlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihmcmFtZXM9PT1udWxsKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihuZXcgRXJyb3IoJ0NvdWxkIG5vdCBnZXQgZnJhbWUgbGVuZ3RoIGZyb20gcmVjb3JkaW5nIGZpbGUgb2JqZWN0JykpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZsID0gZnJhbWVzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWIuc2FtcGxlUmF0ZSAhPT0gb3JnU2FtcGxlUmF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yZ1NhbXBsZVJhdGUgJiYgZnJhbWVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmwgPSBNYXRoLnJvdW5kKGFiLnNhbXBsZVJhdGUgKiBmcmFtZXMgLyBvcmdTYW1wbGVSYXRlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJQbGF0Zm9ybSBzcjogXCIrYWIuc2FtcGxlUmF0ZStcIiwgZmlsZSBzcjogXCIrb3JnU2FtcGxlUmF0ZStcIiwgZGVjb2RlZC9vcmcgZnJhbWUgbGVuZ3RoOiBcIitmbCtcIi9cIitmcmFtZXMrXCIsIGFiLmxlbmd0aDogXCIrYWIubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5hYiA9IE5ldEF1ZGlvQnVmZmVyLmZyb21DaHVua0F1ZGlvQnVmZmVyKHRoaXMsYmFzZUF1ZGlvVXJsLCBhYiwgZmwsZnJhbWVMZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2xldCBycD1uZXcgUmVhZHlQcm92aWRlcigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL25hYi5yZWFkeVByb3ZpZGVyPXJwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3JwLnJlYWR5KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hYi5yZWFkeSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFiLmZyYW1lTGVuIDwgZnJhbWVMZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcImNodW5rQXVkaW9SZXF1ZXN0VG9uZXRBYjogQnVpbHQgbmV0QWIgYWIgZnJvbSBjaHVuayBhYjogRmlyc3QgY2h1bmsgc2hvcnRlciB0aGEgZnJhbWVMZW5ndGggKFwiK25ldEFiQXVkaW9CdWZmZXIuZnJhbWVMZW4rXCI8XCIrZnJhbWVMZW5ndGgrXCIpLCBhc3N1bWluZyBlbmQgb2YgZGF0YSwgc2VhbGluZyBuZXRBYiBhYi5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWIuc2VhbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChuYWIpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGVycm9yID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdjaHVua0F1ZGlvUmVxdWVzdFRvTmV0QWI6IGVycm9yOiAnK2Vycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmKGVycm9yIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL31cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignY2h1bmtBdWRpb1JlcXVlc3RUb05ldEFiOiBGZXRjaGluZyBhdWRpbyBmaWxlOiByZXNwb25zZSBoYXMgbm8gYm9keScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKCdjaHVua0F1ZGlvUmVxdWVzdFRvTmV0QWI6IEZldGNoaW5nIGF1ZGlvIGZpbGU6IHJlc3BvbnNlIGhhcyBubyBib2R5Jyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGVycm9yOihlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2NodW5rQXVkaW9SZXF1ZXN0VG9OZXRBYjogZXJyb3I6ICcrZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gb2JzO1xyXG4gICAgfVxyXG5cclxufVxyXG4iXX0=
|