speechrecorderng 3.9.7 → 3.9.9
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 +478 -12
- package/esm2022/lib/action/action.mjs +1 -1
- package/esm2022/lib/audio/array_audio_buffer.mjs +1 -1
- package/esm2022/lib/audio/array_audio_buffer_input_stream.mjs +1 -1
- package/esm2022/lib/audio/audio_data_holder.mjs +1 -1
- package/esm2022/lib/audio/audio_display.mjs +4 -4
- package/esm2022/lib/audio/audio_player.mjs +4 -4
- package/esm2022/lib/audio/capture/capture.mjs +1 -1
- package/esm2022/lib/audio/context.mjs +1 -1
- package/esm2022/lib/audio/dsp/level_measure.mjs +5 -4
- package/esm2022/lib/audio/impl/wavreader.mjs +1 -1
- package/esm2022/lib/audio/impl/wavwriter.mjs +1 -1
- package/esm2022/lib/audio/inddb_audio_buffer.mjs +1 -1
- package/esm2022/lib/audio/io/stream.mjs +1 -1
- package/esm2022/lib/audio/net_audio_buffer.mjs +1 -1
- package/esm2022/lib/audio/persistor.mjs +1 -1
- package/esm2022/lib/audio/playback/array_audio_buffer_source_node.mjs +1 -1
- package/esm2022/lib/audio/playback/audio_source_node.mjs +1 -1
- package/esm2022/lib/audio/playback/audio_source_worklet_module_loader.mjs +1 -1
- package/esm2022/lib/audio/playback/inddb_audio_buffer_source_node.mjs +1 -1
- package/esm2022/lib/audio/playback/net_audio_buffer_source_node.mjs +1 -1
- package/esm2022/lib/audio/playback/player.mjs +1 -1
- package/esm2022/lib/audio/ui/audio_canvas_layer_comp.mjs +7 -7
- package/esm2022/lib/audio/ui/audio_display_control.mjs +4 -4
- package/esm2022/lib/audio/ui/audio_display_scroll_pane.mjs +4 -4
- package/esm2022/lib/audio/ui/audiosignal.mjs +4 -4
- package/esm2022/lib/audio/ui/container.mjs +4 -4
- package/esm2022/lib/audio/ui/livelevel.mjs +4 -4
- package/esm2022/lib/audio/ui/scroll_pane_horizontal.mjs +3 -3
- package/esm2022/lib/audio/ui/sonagram.mjs +4 -4
- package/esm2022/lib/db/inddb.mjs +4 -4
- package/esm2022/lib/dsp/utils.mjs +1 -1
- package/esm2022/lib/io/BinaryReader.mjs +1 -1
- package/esm2022/lib/io/BinaryWriter.mjs +1 -1
- package/esm2022/lib/io/stream.mjs +1 -1
- package/esm2022/lib/math/complex.mjs +1 -1
- package/esm2022/lib/math/dft.mjs +1 -1
- package/esm2022/lib/net/uploader.mjs +1 -1
- package/esm2022/lib/recorder_component.mjs +1 -1
- package/esm2022/lib/speechrecorder/project/project.mjs +1 -1
- package/esm2022/lib/speechrecorder/project/project.service.mjs +4 -4
- package/esm2022/lib/speechrecorder/recording.mjs +1 -1
- package/esm2022/lib/speechrecorder/recordings/basic_recording.service.mjs +1 -1
- package/esm2022/lib/speechrecorder/recordings/recordings.service.mjs +4 -4
- package/esm2022/lib/speechrecorder/script/script.mjs +1 -1
- package/esm2022/lib/speechrecorder/script/script.service.mjs +4 -4
- package/esm2022/lib/speechrecorder/session/audiorecorder.mjs +7 -7
- package/esm2022/lib/speechrecorder/session/basicrecorder.mjs +1 -1
- package/esm2022/lib/speechrecorder/session/controlpanel.mjs +22 -22
- package/esm2022/lib/speechrecorder/session/item.mjs +1 -1
- package/esm2022/lib/speechrecorder/session/progress.mjs +4 -4
- package/esm2022/lib/speechrecorder/session/prompting.mjs +16 -16
- package/esm2022/lib/speechrecorder/session/recorder_combi_pane.mjs +3 -3
- package/esm2022/lib/speechrecorder/session/recording_file_cache.mjs +1 -1
- package/esm2022/lib/speechrecorder/session/recording_list.mjs +4 -4
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +4 -4
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +4 -4
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +4 -4
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +4 -4
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file.mjs +1 -1
- package/esm2022/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +4 -4
- package/esm2022/lib/speechrecorder/session/session.service.mjs +4 -4
- package/esm2022/lib/speechrecorder/session/session_finished_dialog.mjs +3 -3
- package/esm2022/lib/speechrecorder/session/sessionmanager.mjs +4 -4
- package/esm2022/lib/speechrecorder/session/warning_bar.mjs +4 -4
- package/esm2022/lib/speechrecorder/spruploader.mjs +4 -4
- package/esm2022/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +4 -4
- package/esm2022/lib/speechrecorderng.component.mjs +4 -4
- package/esm2022/lib/speechrecorderng.module.mjs +9 -13
- package/esm2022/lib/spr.config.mjs +3 -3
- package/esm2022/lib/spr.module.version.mjs +2 -2
- package/esm2022/lib/ui/canvas_layer_comp.mjs +4 -4
- package/esm2022/lib/ui/intersection-observer.directive.mjs +4 -4
- package/esm2022/lib/ui/message_dialog.mjs +3 -3
- package/esm2022/lib/ui/recordingitem_display.mjs +7 -7
- package/esm2022/lib/ui/responsive_component.mjs +3 -3
- package/esm2022/lib/utils/scrollIntoViewToBottom.mjs +4 -4
- package/esm2022/lib/utils/ua-parser.mjs +1 -1
- package/esm2022/lib/utils/utils.mjs +1 -1
- package/esm2022/lib/utils/wake_lock.mjs +1 -1
- package/fesm2022/speechrecorderng.mjs +171 -174
- package/fesm2022/speechrecorderng.mjs.map +1 -1
- package/lib/speechrecorderng.module.d.ts +11 -12
- package/lib/spr.module.version.d.ts +1 -1
- package/package.json +13 -13
package/README.md
CHANGED
|
@@ -1,23 +1,489 @@
|
|
|
1
|
-
#
|
|
1
|
+
# SpeechRecorderNg
|
|
2
2
|
|
|
3
|
+
A Speech Recording Tool implemented as an Angular 17 module.
|
|
3
4
|
|
|
4
|
-
##
|
|
5
|
+
## Migrate from version 2.x.x to 3.x.x
|
|
6
|
+
For backwards compatibility to server REST API v1 set the property `apiVersion: 1` in your environment file.
|
|
5
7
|
|
|
6
|
-
|
|
7
|
-
> Note: Don't forget to add `--project speechrecorderng` or else it will be added to the default project in your `angular.json` file.
|
|
8
|
+
## Integrate SpeechRecorder module to your web application
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
### Install NPM package
|
|
11
|
+
Speechrecorder module is available as NPM package.
|
|
12
|
+
Add `"speechrecorderng": "3.9.8"` to the `dependencies` array property in the `package.json` file of your application. Run `npm install` to install the package.
|
|
13
|
+
### Module integration
|
|
14
|
+
Add SpeechRecorderNg module to imports property of your `AppModule` annotation. The module main component `SpeechRecorder` should be activated by an Angular route.
|
|
10
15
|
|
|
11
|
-
|
|
16
|
+
#### Example `app.module.ts`
|
|
17
|
+
```
|
|
18
|
+
import { BrowserModule } from '@angular/platform-browser';
|
|
19
|
+
import { NgModule } from '@angular/core';
|
|
12
20
|
|
|
13
|
-
|
|
21
|
+
import { AppComponent } from './app.component';
|
|
22
|
+
import {SpeechrecorderngComponent, SpeechRecorderConfig, SpeechrecorderngModule} from 'speechrecorderng'
|
|
23
|
+
import {RouterModule, Routes} from '@angular/router';
|
|
24
|
+
import {BrowserAnimationsModule} from "@angular/platform-browser/animations";
|
|
25
|
+
import {MdButtonModule, MdDialogModule, MdIconModule, MdMenuModule, MdToolbarModule} from "@angular/material";
|
|
14
26
|
|
|
15
|
-
|
|
27
|
+
const MY_APP_ROUTES: Routes = [
|
|
28
|
+
{ path: 'spr', component: SpeechrecorderngComponent}
|
|
29
|
+
];
|
|
16
30
|
|
|
17
|
-
|
|
31
|
+
const SPR_CFG:SpeechRecorderConfig={
|
|
32
|
+
apiEndPoint: '/myapppath/api/v1'
|
|
33
|
+
}
|
|
18
34
|
|
|
19
|
-
|
|
35
|
+
@NgModule({
|
|
36
|
+
declarations: [
|
|
37
|
+
AppComponent
|
|
38
|
+
],
|
|
39
|
+
imports: [
|
|
40
|
+
RouterModule.forRoot(MY_APP_ROUTES),BrowserModule,BrowserAnimationsModule,SpeechrecorderngModule.forRoot(SPR_CFG)
|
|
41
|
+
],
|
|
42
|
+
providers: [],
|
|
43
|
+
bootstrap: [AppComponent]
|
|
44
|
+
})
|
|
45
|
+
export class AppModule { }
|
|
46
|
+
```
|
|
20
47
|
|
|
21
|
-
|
|
48
|
+
### HTML/CSS integration
|
|
49
|
+
Speechrecorder is intended to run in a layout which always fits to the browser viewport without scrollbars. The subject should not be distracted from performing the recording session.
|
|
50
|
+
Therefore the module should be embedded in HTML page with 100% height and without padding or margin.
|
|
51
|
+
At least the CSS properties `margin-top`,`margin-bottom`,`padding-top`,`padding-bottom` should be zero and `height` should be `100%` for the DOM elements `html` and `body`
|
|
52
|
+
#### Example `index.html`
|
|
53
|
+
```
|
|
54
|
+
<!doctype html>
|
|
55
|
+
<html lang="en" style="height:100%;margin:0;padding:0">
|
|
56
|
+
<head>
|
|
57
|
+
<meta charset="utf-8">
|
|
58
|
+
<title>My application</title>
|
|
59
|
+
<base href="/">
|
|
60
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
61
|
+
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
|
|
62
|
+
</head>
|
|
63
|
+
<body style="height:100%;margin:0;padding:0">
|
|
64
|
+
<app-root class="mat-typography"></app-root>
|
|
65
|
+
</body>
|
|
66
|
+
</html>
|
|
67
|
+
```
|
|
68
|
+
The SpeechRecorder component will appear in the Angular `router-outlet` element, if a route for the `SpeechRecorder` component is matched.
|
|
69
|
+
|
|
70
|
+
#### Example `app.component.html` with Material Design menubar
|
|
71
|
+
```
|
|
72
|
+
<md-toolbar color="primary">
|
|
73
|
+
|
|
74
|
+
<button md-button [mdMenuTriggerFor]="menu">
|
|
75
|
+
<md-icon>menu</md-icon>
|
|
76
|
+
</button>
|
|
77
|
+
<md-menu #menu="mdMenu" yPosition="below" [overlapTrigger]="false">
|
|
78
|
+
<button md-menu-item [mdMenuTriggerFor]="helpMenu">Help</button>
|
|
79
|
+
<md-menu #helpMenu="mdMenu" xPosition="after" [overlapTrigger]="false">
|
|
80
|
+
<p>My application</p>
|
|
81
|
+
</md-menu>
|
|
82
|
+
</md-menu>
|
|
83
|
+
<span>My Application</span>
|
|
84
|
+
</md-toolbar>
|
|
85
|
+
<router-outlet></router-outlet>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
### Deployment on the server
|
|
89
|
+
See [Angular Deployment/Server Configuration](https://angular.io/guide/deployment#server-configuration) for details.
|
|
22
90
|
|
|
23
|
-
To
|
|
91
|
+
To distinguish between the REST API base paths and the path for the web application the application should not be deployed to the top level directory of your Web-server.
|
|
92
|
+
Choose an arbitrary base path for the app e.g. `/wsr/ng/dist/` and build the app accordingly:
|
|
93
|
+
```
|
|
94
|
+
ng build --base-href=/wsr/ng/dist/ --prod
|
|
95
|
+
```
|
|
96
|
+
Copy the dist folder to ```/wsr/ng/``` on your Web-Server and setup the fallback configuration for this path in your Web-Server.
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
### Server REST API
|
|
101
|
+
|
|
102
|
+
SpeechRecorder requires a HTTP server providing a REST API. The server code is not part of this package.
|
|
103
|
+
The package only contains a minimal file structure for testing. The files reside in `src/test`.
|
|
104
|
+
|
|
105
|
+
Versions 2.x.x of WebSpeechRecorderNg use the REST API version v1, Versions 3.x.x may use API version v1 and v2. Set environment property apiVersion accordingly (default: `apiVersion: 1`)
|
|
106
|
+
|
|
107
|
+
## Configuration
|
|
108
|
+
|
|
109
|
+
By default the API Endpoint ({apiEndPoint}) is an empty string, the API is then expected to be relative to the base path of the application.
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
## SpeechRecorder REST API description
|
|
113
|
+
|
|
114
|
+
### Entity Project
|
|
115
|
+
|
|
116
|
+
REST Path: GET {apiEndPoint}project/{projectId}
|
|
117
|
+
|
|
118
|
+
Content-type: application/json
|
|
119
|
+
|
|
120
|
+
Example for Mono recordings:
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
{
|
|
124
|
+
"name": "My project",
|
|
125
|
+
"audioFormat" : {
|
|
126
|
+
"channels": 1
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
### Entity Session
|
|
131
|
+
|
|
132
|
+
Current recording session data.
|
|
133
|
+
|
|
134
|
+
REST Path: GET {apiEndPoint}session/{sessionId}
|
|
135
|
+
|
|
136
|
+
Content-type: application/json
|
|
137
|
+
|
|
138
|
+
Properties:
|
|
139
|
+
* sessionId: number: Unique ID of the session
|
|
140
|
+
* script: number: Unique ID of recording script
|
|
141
|
+
|
|
142
|
+
Example:
|
|
143
|
+
```
|
|
144
|
+
{
|
|
145
|
+
"sessionId": "2",
|
|
146
|
+
"project": "My project",
|
|
147
|
+
"script": "1245"
|
|
148
|
+
}
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
During the session the application will try to update the session object on the server by HTTP PATCH requests.
|
|
152
|
+
The session properties status,loadedDate,startedTrainingDate,startedDate,completedDate and restartedDate
|
|
153
|
+
will be patched accordingly to the session events.
|
|
154
|
+
|
|
155
|
+
REST Path: PATCH {apiEndPoint}session/{sessionId}
|
|
156
|
+
|
|
157
|
+
Content-type: application/json
|
|
158
|
+
|
|
159
|
+
Properties (only changed properties are set):
|
|
160
|
+
* status: enum: "CREATED" | "LOADED" | "STARTED_TRAINING" | "STARTED" | "COMPLETED" status of the session
|
|
161
|
+
* loadedDate: string: date/time when session was loaded
|
|
162
|
+
* startedTrainingDate: string: date/time when a training section was started
|
|
163
|
+
* startedDate: string: date/time of recording start
|
|
164
|
+
* completedDate: string: date/time of session completed
|
|
165
|
+
* restartedDate: string: date/time of a session restart (continue)
|
|
166
|
+
|
|
167
|
+
For example when the session and script is loaded successfully, this PATCH request might be sent:
|
|
168
|
+
```
|
|
169
|
+
{"status":"LOADED","loadedDate":"2020-03-25T12:52:12.616Z"}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
### Entity Script
|
|
173
|
+
|
|
174
|
+
Recording script controls recording session procedure.
|
|
175
|
+
|
|
176
|
+
REST Path: GET {apiEndPoint}script/{scriptId}
|
|
177
|
+
|
|
178
|
+
Content-type: application/json
|
|
179
|
+
|
|
180
|
+
Properties:
|
|
181
|
+
* type: script: constant: Must be `"script"`
|
|
182
|
+
* scriptId: number: Unique ID of the script
|
|
183
|
+
* sections: array: Array of recording session sections
|
|
184
|
+
|
|
185
|
+
### Embedded entity Section
|
|
186
|
+
|
|
187
|
+
Properties:
|
|
188
|
+
* name: Optional name of section
|
|
189
|
+
* mode: enum: `MANUAL`, `AUTOPROGRESS` or `AUTORECORDING`
|
|
190
|
+
* promptUnits: array: List of prompt units.
|
|
191
|
+
* training: boolean: Section is intended as training for the subject. The recording items of a training section are ignored when the completeness of the session (each prompt item is recorded) is checked.
|
|
192
|
+
|
|
193
|
+
### Embedded entity Prompt Unit
|
|
194
|
+
|
|
195
|
+
Properties:
|
|
196
|
+
|
|
197
|
+
* recpromptId: Unique ID of this recording prompt
|
|
198
|
+
* itemcode: string: In the scope of the script unique identifier of an recording item
|
|
199
|
+
* mediaitems: array: List of media items for this prompt. Currently only a single mediaitem element in the array is supported.
|
|
200
|
+
|
|
201
|
+
### Embedded entity Media item
|
|
202
|
+
|
|
203
|
+
Properties (supported properties only):
|
|
204
|
+
* text: string: Text to prompt
|
|
205
|
+
|
|
206
|
+
Example script:
|
|
207
|
+
```
|
|
208
|
+
{
|
|
209
|
+
"type": "script",
|
|
210
|
+
"scriptId": "1245",
|
|
211
|
+
"sections": [
|
|
212
|
+
{
|
|
213
|
+
"mode": "MANUAL",
|
|
214
|
+
"name": "Introduction",
|
|
215
|
+
"groups": [
|
|
216
|
+
{
|
|
217
|
+
"promptItems": [
|
|
218
|
+
{
|
|
219
|
+
"itemcode": "I0",
|
|
220
|
+
"mediaitems": [
|
|
221
|
+
{
|
|
222
|
+
"text": "Willkommen bei der IPS-Sprachaufnahme!"
|
|
223
|
+
}
|
|
224
|
+
],
|
|
225
|
+
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
"itemcode": "I1",
|
|
229
|
+
"mediaitems": [
|
|
230
|
+
{
|
|
231
|
+
"text": "Hier steht der Prompt; ein kurzer Text, den Sie lesen, eine Frage, die Sie beantworten oder ein Bild, das Sie beschreiben sollen."
|
|
232
|
+
}
|
|
233
|
+
],
|
|
234
|
+
|
|
235
|
+
}
|
|
236
|
+
]
|
|
237
|
+
}
|
|
238
|
+
],
|
|
239
|
+
"training": false
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
"mode": "AUTOPROGRESS",
|
|
243
|
+
"name": "Recording Session",
|
|
244
|
+
"groups": [
|
|
245
|
+
{
|
|
246
|
+
"promptItems": [
|
|
247
|
+
{
|
|
248
|
+
"itemcode": "N0",
|
|
249
|
+
"recduration": 10000,
|
|
250
|
+
"mediaitems": [
|
|
251
|
+
{
|
|
252
|
+
"text": "What's your name?"
|
|
253
|
+
}
|
|
254
|
+
],
|
|
255
|
+
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
"itemcode": "S0",
|
|
259
|
+
"mediaitems": [
|
|
260
|
+
{
|
|
261
|
+
"text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit."
|
|
262
|
+
}
|
|
263
|
+
],
|
|
264
|
+
|
|
265
|
+
}
|
|
266
|
+
]
|
|
267
|
+
}
|
|
268
|
+
]
|
|
269
|
+
}
|
|
270
|
+
]
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### Recording file
|
|
276
|
+
|
|
277
|
+
SpeechRecorder stores the recording in browser memory first. The recordings are then uploaded to the server as binary encoded WAVE files.
|
|
278
|
+
|
|
279
|
+
Path: POST {apiEndPoint}session/{sessionId}/recfile/{itemcode}
|
|
280
|
+
|
|
281
|
+
Content-Type: audio/wav
|
|
282
|
+
|
|
283
|
+
There might be multiple uploads for one recording item, when the subject repeats a recording. The server is responsible to handle this uploads.
|
|
284
|
+
The server should apply a unique identifier for each uploaded recording file. Subsequent recording uploads for the same itemcode should get different IDs and should be stored with a version number starting with zero.
|
|
285
|
+
A GET request to the URL should return the latest upload.
|
|
286
|
+
|
|
287
|
+
### Start a recording session
|
|
288
|
+
|
|
289
|
+
The default routing path to start a recording session is `/spr/session/{sessionId}`. If you call this router link from your Angular application
|
|
290
|
+
WebSpeechRecorderNg should start and will try to load the session data from the REST API first.
|
|
291
|
+
|
|
292
|
+
## GUI components to view and edit your recording database
|
|
293
|
+
|
|
294
|
+
### Edit or view recording files
|
|
295
|
+
To edit a selection of a recording file call the router link:
|
|
296
|
+
`/spr/db/recordingfile/{recordingFileId}`
|
|
297
|
+
|
|
298
|
+
To only view a recording file:
|
|
299
|
+
`/spr/db/recordingfile/_view/{recordingFileId}`
|
|
300
|
+
|
|
301
|
+
|
|
302
|
+
The application will send in both modes the following requests to the REST API:
|
|
303
|
+
|
|
304
|
+
1. Recording file meta data
|
|
305
|
+
|
|
306
|
+
Path: POST {apiEndPoint}recordingfile/{recordingFileId}
|
|
307
|
+
|
|
308
|
+
Accept: application/json
|
|
309
|
+
|
|
310
|
+
```
|
|
311
|
+
{
|
|
312
|
+
"recordingFileId": "5678",
|
|
313
|
+
"session": 2,
|
|
314
|
+
"version": 0,
|
|
315
|
+
"recording": {
|
|
316
|
+
"itemcode": "N0",
|
|
317
|
+
"recduration": 10000,
|
|
318
|
+
|
|
319
|
+
"recinstructions": {
|
|
320
|
+
"recinstructions": "Please answer:"
|
|
321
|
+
},
|
|
322
|
+
"mediaitems": [
|
|
323
|
+
{
|
|
324
|
+
"annotationTemplate": false,
|
|
325
|
+
"autoplay": false,
|
|
326
|
+
"mimetype": "text/plain",
|
|
327
|
+
"text": "What's your name?"
|
|
328
|
+
}
|
|
329
|
+
]
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
2. The recording file itself:
|
|
335
|
+
|
|
336
|
+
(Same URL however it requests an audio MIME type )
|
|
337
|
+
|
|
338
|
+
Path: POST {apiEndPoint}recordingfile/{recordingFileId}
|
|
339
|
+
|
|
340
|
+
Accept: audio/wav
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
and optional to navigate through recording files of the same session:
|
|
344
|
+
|
|
345
|
+
3. Session data of this recording file
|
|
346
|
+
|
|
347
|
+
REST Path: GET {apiEndPoint}session/{sessionId}
|
|
348
|
+
|
|
349
|
+
Content-type: application/json
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
4. The recording file list of the session if the session ID could be retrieved:
|
|
353
|
+
|
|
354
|
+
REST Path: GET {apiEndPoint}project/{projectId}/session/{sessionId}/recfile
|
|
355
|
+
|
|
356
|
+
Content-type: application/json
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
A server response might look like this:
|
|
360
|
+
|
|
361
|
+
```
|
|
362
|
+
[ {
|
|
363
|
+
"recordingFileId": "1234",
|
|
364
|
+
"session": 2,
|
|
365
|
+
"date" : "2020-05-01T20:03:00.456+01:00",
|
|
366
|
+
"recording" : {
|
|
367
|
+
"mediaitems" : [ {
|
|
368
|
+
"annotationTemplate" : true,
|
|
369
|
+
"text" : "Heute ist schönes Frühlingswetter!"
|
|
370
|
+
} ],
|
|
371
|
+
"itemcode" : "demo_99",
|
|
372
|
+
"recduration" : 4000,
|
|
373
|
+
"recinstructions" : {
|
|
374
|
+
"recinstructions" : "Please read:"
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
},
|
|
378
|
+
{
|
|
379
|
+
"recordingFileId": "5678",
|
|
380
|
+
"session": 2,
|
|
381
|
+
"date" : "2020-06-10T20:04:44.123+01:00",
|
|
382
|
+
"version": 0,
|
|
383
|
+
"recording": {
|
|
384
|
+
"itemcode": "N0",
|
|
385
|
+
"recduration": 10000,
|
|
386
|
+
|
|
387
|
+
"recinstructions": {
|
|
388
|
+
"recinstructions": "Please answer:"
|
|
389
|
+
},
|
|
390
|
+
"mediaitems": [
|
|
391
|
+
{
|
|
392
|
+
"annotationTemplate": false,
|
|
393
|
+
"autoplay": false,
|
|
394
|
+
"mimetype": "text/plain",
|
|
395
|
+
"text": "What's your name?"
|
|
396
|
+
}
|
|
397
|
+
]
|
|
398
|
+
}
|
|
399
|
+
},
|
|
400
|
+
{
|
|
401
|
+
"recordingFileId": "9999",
|
|
402
|
+
"session": 2,
|
|
403
|
+
"date" : "2020-06-15T 18:05:19.000+01:00",
|
|
404
|
+
"version": 1,
|
|
405
|
+
"recording": {
|
|
406
|
+
"itemcode": "N0",
|
|
407
|
+
"recduration": 10000,
|
|
408
|
+
|
|
409
|
+
"recinstructions": {
|
|
410
|
+
"recinstructions": "Please answer:"
|
|
411
|
+
},
|
|
412
|
+
"mediaitems": [
|
|
413
|
+
{
|
|
414
|
+
"annotationTemplate": false,
|
|
415
|
+
"autoplay": false,
|
|
416
|
+
"mimetype": "text/plain",
|
|
417
|
+
"text": "What's your name?"
|
|
418
|
+
}
|
|
419
|
+
]
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
]
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
5. Get the recording file:
|
|
426
|
+
Path: GET {apiEndPoint}project/{projectId}/session/{sessionId}/recfile
|
|
427
|
+
Accept: audio/wav
|
|
428
|
+
|
|
429
|
+
Content-type: audio/wav
|
|
430
|
+
|
|
431
|
+
API v2 extension:
|
|
432
|
+
The server must be able to deliver sections of a recording file as a valid WAVE file.
|
|
433
|
+
The section will be selected by the query parameters `startFrame` for the start position and `frameLength` for the length of the section.
|
|
434
|
+
The client will not send this queries with API v1.
|
|
435
|
+
|
|
436
|
+
Path: GET {apiEndPoint}project/{projectId}/session/{sessionId}/recfile?startFrame={startFrame}&frameLength={frameLength}
|
|
437
|
+
Accept: audio/wav
|
|
438
|
+
|
|
439
|
+
Content-type: audio/wav
|
|
440
|
+
|
|
441
|
+
6. Save edit selection:
|
|
442
|
+
|
|
443
|
+
Path: PATCH {apiEndPoint}recordingfile/{recordingFileId}
|
|
444
|
+
|
|
445
|
+
Accept: application/json
|
|
446
|
+
|
|
447
|
+
Sends `editSampleRate`,`editStartFrame` and `editEndFrame` sample position properties of the selection, for example:
|
|
448
|
+
|
|
449
|
+
```
|
|
450
|
+
{
|
|
451
|
+
"editSampleRate": 48000,
|
|
452
|
+
"editStartFrame":182360,
|
|
453
|
+
"editEndFrame":303934
|
|
454
|
+
}
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
or null values to remove the edit selection:
|
|
458
|
+
|
|
459
|
+
```
|
|
460
|
+
{
|
|
461
|
+
"editSampleRate": null,
|
|
462
|
+
"editStartFrame":null,
|
|
463
|
+
"editEndFrame":null
|
|
464
|
+
}
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
|
|
468
|
+
### Development server
|
|
469
|
+
|
|
470
|
+
Run `ng serve` for a development server.
|
|
471
|
+
Navigate to `http://localhost:4200/spr/session/2` start a demo recording session.
|
|
472
|
+
Or edit/view a test recording file ID 1234 from the demo database:
|
|
473
|
+
`http://localhost:4200/spr/db/recordingfile/1234`
|
|
474
|
+
|
|
475
|
+
The app will automatically reload if you change any of the source files.
|
|
476
|
+
|
|
477
|
+
### Build
|
|
478
|
+
|
|
479
|
+
Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `-prod` flag for a production build.
|
|
480
|
+
|
|
481
|
+
|
|
482
|
+
### Build module
|
|
483
|
+
|
|
484
|
+
Run `npm run build_module` to build the module. The build artifacts will be stored in the `dist/speechrecorderng` directory.
|
|
485
|
+
|
|
486
|
+
|
|
487
|
+
### Clean dist
|
|
488
|
+
|
|
489
|
+
Remove folder `dist`.
|
|
@@ -70,4 +70,4 @@ export class Action {
|
|
|
70
70
|
}
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2FjdGlvbi9hY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0ksTUFBTSxPQUFPLFdBQVc7SUFDcEIsSUFBSSxLQUFLO1FBQ0wsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxZQUFvQixTQUFjLElBQUk7UUFBbEIsV0FBTSxHQUFOLE1BQU0sQ0FBWTtJQUV0QyxDQUFDO0NBQ0o7QUFNRCxNQUFNLE9BQU8sTUFBTTtJQUNmLElBQUksS0FBSztRQUNMLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBU0QsWUFBWSxJQUFXLEVBQUMsUUFBYSxJQUFJO1FBTHpDLGNBQVMsR0FBQyxJQUFJLENBQUM7UUFDUCxjQUFTLEdBQTZCLElBQUksQ0FBQztRQUsvQyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNsQixJQUFJLENBQUMsTUFBTSxHQUFDLEtBQUssQ0FBQTtRQUNqQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksS0FBSyxFQUEwQixDQUFDO1FBQ3JELElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDSixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDdEIsQ0FBQztJQUdELElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxRQUFRLENBQUMsS0FBaUM7UUFDMUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUVVLGlCQUFpQixDQUFDLFFBQWMsSUFBSTtRQUMzQyxXQUFXO1FBQ1gsT0FBTyxJQUFJLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsT0FBTyxDQUFDLFFBQWMsSUFBSTtRQUN0QixJQUFJLENBQUMsTUFBTSxHQUFDLEtBQUssQ0FBQTtRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkMsSUFBSSxFQUFFLEdBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ3BDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkIsQ0FBQztJQUNMLENBQUM7SUFFRCxJQUFJLFFBQVEsQ0FBQyxRQUFnQjtRQUMxQiw2REFBNkQ7UUFDNUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7UUFDMUIsS0FBSyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDMUIsQ0FBQyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ2hDLENBQUM7UUFDRCxnREFBZ0Q7UUFDaEQsc0NBQXNDO0lBQzFDLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDUixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDMUIsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFzQixFQUFFLGVBQXdCO1FBQ3ZELElBQUksSUFBSSxFQUFFLENBQUM7WUFDUCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7Z0JBQzlCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN6QixJQUFJLGVBQWUsRUFBRSxDQUFDO29CQUNsQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRTt3QkFDeEMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUNuQixDQUFDLENBQUMsQ0FBQztnQkFDUCxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRUQsYUFBYSxDQUFDLElBQXFCO1FBQy9CLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ1QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0MsQ0FBQztJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbIlxyXG4gICAgZXhwb3J0IGNsYXNzIEFjdGlvbkV2ZW50PFQ+IHtcclxuICAgICAgICBnZXQgdmFsdWUoKTogVHxudWxsIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF92YWx1ZTpUfG51bGw9bnVsbCkge1xyXG5cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBBY3Rpb25FdmVudExpc3RlbmVyPFQ+e1xyXG4gICAgICAgIChhZTpBY3Rpb25FdmVudDxUPik6dm9pZDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgY2xhc3MgQWN0aW9uPFQ+IHtcclxuICAgICAgICBnZXQgdmFsdWUoKTogVHxudWxsIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfbmFtZTpzdHJpbmc7XHJcbiAgICAgICAgcHJpdmF0ZSBfdmFsdWU6VHxudWxsO1xyXG4gICAgICAgIF9kaXNhYmxlZD10cnVlO1xyXG4gICAgICAgIHByaXZhdGUgX29uQWN0aW9uOkFjdGlvbkV2ZW50TGlzdGVuZXI8VD58bnVsbD1udWxsO1xyXG4gICAgICAgIGxpc3RlbmVyczpBcnJheTxBY3Rpb25FdmVudExpc3RlbmVyPFQ+PjtcclxuICAgICAgICBwcml2YXRlIGNvbnRyb2xzOkhUTUxJbnB1dEVsZW1lbnRbXTtcclxuXHJcbiAgICAgICAgY29uc3RydWN0b3IobmFtZTpzdHJpbmcsdmFsdWU6VHxudWxsPW51bGwpIHtcclxuICAgICAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlPXZhbHVlXHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzID0gbmV3IEFycmF5PEFjdGlvbkV2ZW50TGlzdGVuZXI8VD4+KCk7XHJcbiAgICAgICAgICAgIHRoaXMuY29udHJvbHMgPSBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdldCBuYW1lKCk6c3RyaW5nIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25hbWU7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICAgICAgZ2V0IG9uQWN0aW9uKCk6QWN0aW9uRXZlbnRMaXN0ZW5lcjxUPnxudWxsIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29uQWN0aW9uO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2V0IG9uQWN0aW9uKHZhbHVlOkFjdGlvbkV2ZW50TGlzdGVuZXI8VD58bnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLl9vbkFjdGlvbiA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHJvdGVjdGVkICBjcmVhdGVBY3Rpb25FdmVudCh2YWx1ZTogVHxudWxsPW51bGwpOkFjdGlvbkV2ZW50PFQ+IHtcclxuICAgICAgICAgICAgLy8gZGVmYXVsdDpcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBBY3Rpb25FdmVudCh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwZXJmb3JtKHZhbHVlOiBUfG51bGw9bnVsbCk6dm9pZCB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZhbHVlPXZhbHVlXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiB0aGlzLl9vbkFjdGlvbikge1xyXG4gICAgICAgICAgICAgICAgbGV0IGFlPXRoaXMuY3JlYXRlQWN0aW9uRXZlbnQodmFsdWUpXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkFjdGlvbihhZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNldCBkaXNhYmxlZChkaXNhYmxlZDpib29sZWFuKSB7XHJcbiAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiQWN0aW9uOiBcIit0aGlzLl9uYW1lK1wiIGRpc2FibGVkOiBcIitkaXNhYmxlZClcclxuICAgICAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBkaXNhYmxlZDtcclxuICAgICAgICAgICAgZm9yIChsZXQgYyBvZiB0aGlzLmNvbnRyb2xzKSB7XHJcbiAgICAgICAgICAgICAgICBjLmRpc2FibGVkID0gdGhpcy5fZGlzYWJsZWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy9sZXQgZGlzU3RyPXRoaXMuZGlzYWJsZWQ/XCJkaXNhYmxlZFwiOlwiZW5hYmxlZFwiO1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKHRoaXMuX25hbWUrXCI6IFwiK2Rpc1N0cik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBnZXQgZGlzYWJsZWQoKTpib29sZWFuIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYWRkQ29udHJvbChjdHJsOiBIVE1MSW5wdXRFbGVtZW50LCBhY3Rpb25FdmVudE5hbWU/OiBzdHJpbmcpIHtcclxuICAgICAgICAgICAgaWYgKGN0cmwpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2xzLmluZGV4T2YoY3RybCkgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY3RybC5kaXNhYmxlZCA9IHRoaXMuZGlzYWJsZWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9scy5wdXNoKGN0cmwpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25FdmVudE5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY3RybC5hZGRFdmVudExpc3RlbmVyKGFjdGlvbkV2ZW50TmFtZSwgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wZXJmb3JtKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVtb3ZlQ29udHJvbChjdHJsOkhUTUxJbnB1dEVsZW1lbnQpIHtcclxuICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuY29udHJvbHMuaW5kZXhPZihjdHJsKTtcclxuICAgICAgICAgICAgaWYgKGkgPj0gMCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9scyA9IHRoaXMuY29udHJvbHMuc3BsaWNlKGksIDEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuIl19
|
|
@@ -161,4 +161,4 @@ export class ArrayAudioBuffer extends BasicAudioSource {
|
|
|
161
161
|
return new ArrayAudioBufferRandomAccessStream(this);
|
|
162
162
|
}
|
|
163
163
|
}
|
|
164
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXlfYXVkaW9fYnVmZmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2F1ZGlvL2FycmF5X2F1ZGlvX2J1ZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsZ0JBQWdCLEVBQTBCLE1BQU0scUJBQXFCLENBQUM7QUFFOUUsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNoQyxPQUFPLEVBQUMsa0NBQWtDLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUM3RixPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUc5RSxNQUFNLE9BQU8sZ0JBQWlCLFNBQVEsZ0JBQWdCO0lBT3BELFlBQW9CLGFBQXFCLEVBQVUsV0FBbUIsRUFBVSxLQUFpQztRQUMvRyxLQUFLLEVBQUUsQ0FBQztRQURVLGtCQUFhLEdBQWIsYUFBYSxDQUFRO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFBVSxVQUFLLEdBQUwsS0FBSyxDQUE0QjtRQUx6RyxnQkFBVyxHQUFDLENBQUMsQ0FBQztRQUNkLGNBQVMsR0FBUSxDQUFDLENBQUM7UUFDbkIsY0FBUyxHQUFRLENBQUMsQ0FBQztRQUNuQixZQUFPLEdBQUMsS0FBSyxDQUFDO1FBSXBCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRU8sY0FBYztRQUNwQixJQUFJLENBQUMsU0FBUyxHQUFDLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsV0FBVyxHQUFDLENBQUMsQ0FBQztRQUNuQixJQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFDLENBQUMsRUFBRTtZQUN0QixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNCLEtBQUssSUFBSSxNQUFNLElBQUksT0FBTyxFQUFFO2dCQUMxQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQzthQUNqQztTQUNGO1FBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBQyxJQUFJLENBQUMsU0FBUyxHQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDakQsQ0FBQztJQUVELElBQUk7UUFDRixJQUFJLENBQUMsT0FBTyxHQUFDLElBQUksQ0FBQztJQUNwQixDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxXQUF1QixFQUFDLGNBQWMsR0FBQyxJQUFJO1FBQ2hFLElBQUksR0FBb0IsQ0FBQztRQUN6QixJQUFJLEdBQUcsR0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUM7UUFDckMsSUFBSSxXQUFXLEdBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztRQUNuQyx1REFBdUQ7UUFDdkQsSUFBSSxRQUFRLEdBQUMsQ0FBQyxDQUFDO1FBQ2YsSUFBSSxJQUFJLEdBQUMsSUFBSSxLQUFLLENBQXNCLEdBQUcsQ0FBQyxDQUFDO1FBQzdDLEtBQUksSUFBSSxFQUFFLEdBQUMsQ0FBQyxFQUFDLEVBQUUsR0FBQyxHQUFHLEVBQUMsRUFBRSxFQUFFLEVBQUU7WUFDeEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFDLElBQUksS0FBSyxFQUFnQixDQUFDO1NBQ3BDO1FBQ0QsSUFBSSxNQUFNLEdBQUMsV0FBVyxHQUFDLFFBQVEsQ0FBQztRQUM5QixPQUFNLE1BQU0sR0FBQyxDQUFDLEVBQUM7WUFFYixJQUFJLFdBQVcsR0FBQyxjQUFjLENBQUM7WUFDL0IsSUFBRyxXQUFXLEdBQUMsTUFBTSxFQUFDO2dCQUNwQix1QkFBdUI7Z0JBQ3ZCLFdBQVcsR0FBQyxNQUFNLENBQUM7YUFDcEI7WUFDRCxLQUFJLElBQUksRUFBRSxHQUFDLENBQUMsRUFBQyxFQUFFLEdBQUMsR0FBRyxFQUFDLEVBQUUsRUFBRSxFQUFFO2dCQUN4QixJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxRQUFRLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQzthQUN2RjtZQUNELFFBQVEsSUFBRSxXQUFXLENBQUM7WUFDdEIsTUFBTSxJQUFFLFdBQVcsQ0FBQztTQUNyQjtRQUNILEdBQUcsR0FBQyxJQUFJLGdCQUFnQixDQUFDLEdBQUcsRUFBQyxXQUFXLENBQUMsVUFBVSxFQUFDLElBQUksQ0FBQyxDQUFDO1FBQzFELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELGlCQUFpQixDQUFDLFdBQXVCO1FBQ3ZDLElBQUksR0FBRyxHQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQztRQUNyQyxJQUFHLElBQUksQ0FBQyxhQUFhLEtBQUksR0FBRyxFQUFDO1lBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLEdBQUMsR0FBRyxHQUFDLDRDQUE0QyxHQUFDLElBQUksQ0FBQyxhQUFhLEdBQUMsMkNBQTJDLENBQUMsQ0FBQztTQUNySztRQUNELElBQUksRUFBRSxHQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUM7UUFDOUIsSUFBRyxFQUFFLEtBQUcsSUFBSSxDQUFDLFdBQVcsRUFBQztZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxHQUFDLEVBQUUsR0FBQyw4Q0FBOEMsR0FBQyxJQUFJLENBQUMsV0FBVyxHQUFDLDJCQUEyQixDQUFDLENBQUM7U0FDL0o7UUFFRCxLQUFJLElBQUksRUFBRSxHQUFDLENBQUMsRUFBQyxFQUFFLEdBQUMsR0FBRyxFQUFDLEVBQUUsRUFBRSxFQUFFO1lBQ3hCLElBQUksU0FBUyxHQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDckQscUVBQXFFO1lBQ3JFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1NBQ2hDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFHRCxJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUVELE1BQU0sQ0FBQyxRQUFlLEVBQUMsUUFBZSxFQUFDLElBQW1CO1FBRXhELElBQUksVUFBVSxHQUFDLENBQUMsQ0FBQztRQUNqQixJQUFJLFdBQVcsR0FBQyxRQUFRLENBQUM7UUFDekIsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixJQUFJLElBQUksR0FBQyxDQUFDLENBQUM7UUFDWCxJQUFJLE1BQU0sR0FBQyxDQUFDLENBQUM7UUFDYixJQUFJLEVBQUUsR0FBQyxDQUFDLENBQUM7UUFFVCxPQUFNLE1BQU0sR0FBQyxRQUFRLElBQUksRUFBRSxHQUFDLElBQUksQ0FBQyxXQUFXLEVBQUM7WUFDM0MsZ0JBQWdCO1lBQ2hCLElBQUksR0FBRyxHQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwQixJQUFJLEtBQUssR0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO1lBQ3JCLElBQUksYUFBYSxHQUFDLFVBQVUsR0FBQyxLQUFLLENBQUM7WUFFbkMsSUFBRyxXQUFXLElBQUUsVUFBVSxJQUFJLFdBQVcsR0FBQyxhQUFhLEVBQUM7Z0JBQ3RELElBQUksSUFBSSxHQUFDLFFBQVEsR0FBQyxNQUFNLENBQUM7Z0JBQ3pCLElBQUksR0FBQyxXQUFXLEdBQUMsVUFBVSxDQUFDO2dCQUM1QixJQUFHLElBQUksR0FBQyxJQUFJLEdBQUMsS0FBSyxFQUFDO29CQUNqQixJQUFJLEdBQUMsS0FBSyxHQUFDLElBQUksQ0FBQztpQkFDakI7Z0JBQ0QsS0FBSSxJQUFJLEVBQUUsR0FBQyxDQUFDLEVBQUMsRUFBRSxHQUFDLElBQUksQ0FBQyxNQUFNLEVBQUMsRUFBRSxFQUFFLEVBQUM7b0JBQy9CLElBQUksRUFBRSxHQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBRXpCLEtBQUksSUFBSSxDQUFDLEdBQUMsQ0FBQyxFQUFDLENBQUMsR0FBQyxJQUFJLEVBQUMsQ0FBQyxFQUFFLEVBQUM7d0JBQ3JCLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLEdBQUMsQ0FBQyxDQUFDLEdBQUMsRUFBRSxDQUFDLElBQUksR0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDL0I7aUJBQ0Y7Z0JBQ0QsTUFBTSxJQUFFLElBQUksQ0FBQztnQkFDYixXQUFXLElBQUUsSUFBSSxDQUFDO2dCQUNsQixJQUFJLElBQUUsSUFBSSxDQUFDO2dCQUNYLFVBQVUsSUFBRSxJQUFJLENBQUM7Z0JBQ2pCLElBQUcsSUFBSSxJQUFFLEtBQUssRUFBQztvQkFDYixVQUFVLEdBQUMsYUFBYSxDQUFDO29CQUN6QixJQUFJLEdBQUMsQ0FBQyxDQUFDO29CQUNQLEVBQUUsRUFBRSxDQUFDO2lCQUNOO2FBRUY7aUJBQUk7Z0JBQ0gsYUFBYTtnQkFDYixVQUFVLEdBQUMsYUFBYSxDQUFDO2dCQUN6QixJQUFJLEdBQUMsQ0FBQyxDQUFDO2dCQUNQLEVBQUUsRUFBRSxDQUFDO2FBQ047U0FDRjtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUVELHFCQUFxQjtRQUNuQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxPQUFPLElBQUksMkJBQTJCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUVELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFBSSxnQkFBZ0I7UUFDbEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFFRCxnQkFBZ0I7UUFDVixPQUFPLElBQUksVUFBVSxDQUFPLFVBQVUsQ0FBQyxFQUFFO1lBQ3pDLCtGQUErRjtZQUMvRix5QkFBeUI7WUFDekIseUJBQXlCO1lBQ3pCLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQixVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFMUIsQ0FBQyxDQUFDLENBQUM7SUFFTCxDQUFDO0lBRUQsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLGFBQWEsR0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzNDLENBQUM7SUFFRCx1QkFBdUI7UUFDdEIsT0FBTyxJQUFJLGtDQUFrQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3JELENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QmFzaWNBdWRpb1NvdXJjZSwgUmFuZG9tQWNjZXNzQXVkaW9TdHJlYW19IGZyb20gXCIuL2F1ZGlvX2RhdGFfaG9sZGVyXCI7XHJcbmltcG9ydCB7QXN5bmNGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbSwgRmxvYXQzMkFycmF5SW5wdXRTdHJlYW19IGZyb20gXCIuLi9pby9zdHJlYW1cIjtcclxuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge0FycmF5QXVkaW9CdWZmZXJSYW5kb21BY2Nlc3NTdHJlYW19IGZyb20gXCIuL2FycmF5X2F1ZGlvX2J1ZmZlcl9yYW5kb21fYWNjZXNzX3N0cmVhbVwiO1xyXG5pbXBvcnQge0FycmF5QXVkaW9CdWZmZXJJbnB1dFN0cmVhbX0gZnJvbSBcIi4vYXJyYXlfYXVkaW9fYnVmZmVyX2lucHV0X3N0cmVhbVwiO1xyXG5cclxuXHJcbmV4cG9ydCBjbGFzcyBBcnJheUF1ZGlvQnVmZmVyIGV4dGVuZHMgQmFzaWNBdWRpb1NvdXJjZXtcclxuXHJcbiAgcHJpdmF0ZSBfY2h1bmtDb3VudD0wO1xyXG4gIHByaXZhdGUgX2ZyYW1lTGVuOm51bWJlcj0wO1xyXG4gIHByaXZhdGUgX2R1cmF0aW9uOm51bWJlcj0wO1xyXG4gIHByaXZhdGUgX3NlYWxlZD1mYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfY2hhbm5lbENvdW50OiBudW1iZXIsIHByaXZhdGUgX3NhbXBsZVJhdGU6IG51bWJlciwgcHJpdmF0ZSBfZGF0YTogQXJyYXk8QXJyYXk8RmxvYXQzMkFycmF5Pj4pIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLnVwZGF0ZUZyYW1lTGVuKCk7XHJcbiAgICB0aGlzLnJlYWR5KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUZyYW1lTGVuKCl7XHJcbiAgICB0aGlzLl9mcmFtZUxlbj0wO1xyXG4gICAgdGhpcy5fY2h1bmtDb3VudD0wO1xyXG4gICAgaWYodGhpcy5fZGF0YS5sZW5ndGg+MCkge1xyXG4gICAgICBsZXQgY2gwRGF0YSA9IHRoaXMuZGF0YVswXTtcclxuICAgICAgZm9yIChsZXQgY2gwQ2hrIG9mIGNoMERhdGEpIHtcclxuICAgICAgICB0aGlzLl9jaHVua0NvdW50Kys7XHJcbiAgICAgICAgdGhpcy5fZnJhbWVMZW4gKz0gY2gwQ2hrLmxlbmd0aDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5fZHVyYXRpb249dGhpcy5fZnJhbWVMZW4vdGhpcy5fc2FtcGxlUmF0ZTtcclxuICB9XHJcblxyXG4gIHNlYWwoKXtcclxuICAgIHRoaXMuX3NlYWxlZD10cnVlO1xyXG4gIH1cclxuXHJcbiAgc2VhbGVkKCk6Ym9vbGVhbntcclxuICAgIHJldHVybiB0aGlzLl9zZWFsZWQ7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZnJvbUF1ZGlvQnVmZmVyKGF1ZGlvQnVmZmVyOkF1ZGlvQnVmZmVyLGNodW5rRnJhbWVTaXplPTgxOTIpOkFycmF5QXVkaW9CdWZmZXJ7XHJcbiAgICBsZXQgYWFiOkFycmF5QXVkaW9CdWZmZXI7XHJcbiAgICBsZXQgY2hzPWF1ZGlvQnVmZmVyLm51bWJlck9mQ2hhbm5lbHM7XHJcbiAgICBsZXQgZnJhbWVMZW5ndGg9YXVkaW9CdWZmZXIubGVuZ3RoO1xyXG4gICAgLy9sZXQgY2h1bmtzU2l6ZT1NYXRoLmNlaWwoZnJhbWVMZW5ndGgvY2h1bmtGcmFtZVNpemUpO1xyXG4gICAgbGV0IGZyYW1lUG9zPTA7XHJcbiAgICBsZXQgZGF0YT1uZXcgQXJyYXk8QXJyYXk8RmxvYXQzMkFycmF5Pj4oY2hzKTtcclxuICAgIGZvcihsZXQgY2g9MDtjaDxjaHM7Y2grKykge1xyXG4gICAgICBkYXRhW2NoXT1uZXcgQXJyYXk8RmxvYXQzMkFycmF5PigpO1xyXG4gICAgfVxyXG4gICAgbGV0IHRvQ29weT1mcmFtZUxlbmd0aC1mcmFtZVBvcztcclxuICAgICAgd2hpbGUodG9Db3B5PjApe1xyXG5cclxuICAgICAgICBsZXQgdG9Db3B5Q2h1bms9Y2h1bmtGcmFtZVNpemU7XHJcbiAgICAgICAgaWYodG9Db3B5Q2h1bms+dG9Db3B5KXtcclxuICAgICAgICAgIC8vIGxhc3QgY2h1bmssIHRoZSByZXN0XHJcbiAgICAgICAgICB0b0NvcHlDaHVuaz10b0NvcHk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvcihsZXQgY2g9MDtjaDxjaHM7Y2grKykge1xyXG4gICAgICAgICAgZGF0YVtjaF0ucHVzaChhdWRpb0J1ZmZlci5nZXRDaGFubmVsRGF0YShjaCkuc2xpY2UoZnJhbWVQb3MsIGZyYW1lUG9zICsgdG9Db3B5Q2h1bmspKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZnJhbWVQb3MrPXRvQ29weUNodW5rO1xyXG4gICAgICAgIHRvQ29weS09dG9Db3B5Q2h1bms7XHJcbiAgICAgIH1cclxuICAgIGFhYj1uZXcgQXJyYXlBdWRpb0J1ZmZlcihjaHMsYXVkaW9CdWZmZXIuc2FtcGxlUmF0ZSxkYXRhKTtcclxuICAgIHJldHVybiBhYWI7XHJcbiAgfVxyXG5cclxuICBhcHBlbmRBdWRpb0J1ZmZlcihhdWRpb0J1ZmZlcjpBdWRpb0J1ZmZlcil7XHJcbiAgICBsZXQgY2hzPWF1ZGlvQnVmZmVyLm51bWJlck9mQ2hhbm5lbHM7XHJcbiAgICBpZih0aGlzLl9jaGFubmVsQ291bnQhPT0gY2hzKXtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYXBwZW5kIGF1ZGlvIGJ1ZmZlciB3aXRoICcrY2hzKycgY2hhbm5lbHMgdG8gdGhpcyBhcnJheSBhdWRpbyBidWZmZXIgd2l0aCAnK3RoaXMuX2NoYW5uZWxDb3VudCsnIGNoYW5uZWxzLiBOdW1iZXIgb2YgY2hhbm5lbHMgbXVzdCBtYXRjaC4nKTtcclxuICAgIH1cclxuICAgIGxldCBzcj1hdWRpb0J1ZmZlci5zYW1wbGVSYXRlO1xyXG4gICAgaWYoc3IhPT10aGlzLl9zYW1wbGVSYXRlKXtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYXBwZW5kIGF1ZGlvIGJ1ZmZlciB3aXRoIHNhbXBsZXJhdGUgJytzcisnIHRvIHRoaXMgYXJyYXkgYXVkaW8gYnVmZmVyIHdpdGggc2FtcGxlcmF0ZSAnK3RoaXMuX3NhbXBsZVJhdGUrJy4gU2FtcGxlcmF0ZXMgbXVzdCBtYXRjaC4nKTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IobGV0IGNoPTA7Y2g8Y2hzO2NoKyspIHtcclxuICAgICAgbGV0IGNoQWJTbGljZT1hdWRpb0J1ZmZlci5nZXRDaGFubmVsRGF0YShjaCkuc2xpY2UoKTtcclxuICAgICAgLy9jb25zb2xlLmRlYnVnKFwiQXBwZW5kIGF1ZGlvIGJ1ZmZlciBjaDogXCIrY2grXCI6IFwiK2NoQWJTbGljZS5sZW5ndGgpO1xyXG4gICAgICB0aGlzLl9kYXRhW2NoXS5wdXNoKGNoQWJTbGljZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnVwZGF0ZUZyYW1lTGVuKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0IGNoYW5uZWxDb3VudCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NoYW5uZWxDb3VudDtcclxuICB9XHJcblxyXG4gIGZyYW1lcyhmcmFtZVBvczpudW1iZXIsZnJhbWVMZW46bnVtYmVyLGJ1ZnM6RmxvYXQzMkFycmF5W10pOm51bWJlcntcclxuXHJcbiAgICBsZXQgY2NGcmFtZVBvcz0wO1xyXG4gICAgbGV0IHRyZ0ZyYW1lUG9zPWZyYW1lUG9zO1xyXG4gICAgbGV0IGNoMERhdGEgPSB0aGlzLmRhdGFbMF07XHJcbiAgICBsZXQgY1Bvcz0wO1xyXG4gICAgbGV0IGZpbGxlZD0wO1xyXG4gICAgbGV0IGNpPTA7XHJcblxyXG4gICAgd2hpbGUoZmlsbGVkPGZyYW1lTGVuICYmIGNpPHRoaXMuX2NodW5rQ291bnQpe1xyXG4gICAgICAvLyBDdXJyZW50IGNodW5rXHJcbiAgICAgIGxldCBjYzA9Y2gwRGF0YVtjaV07XHJcbiAgICAgIGxldCBjY0xlbj1jYzAubGVuZ3RoO1xyXG4gICAgICBsZXQgY2NGcmFtZUVuZFBvcz1jY0ZyYW1lUG9zK2NjTGVuO1xyXG5cclxuICAgICAgaWYodHJnRnJhbWVQb3M+PWNjRnJhbWVQb3MgJiYgdHJnRnJhbWVQb3M8Y2NGcmFtZUVuZFBvcyl7XHJcbiAgICAgICAgbGV0IHRvQ3A9ZnJhbWVMZW4tZmlsbGVkO1xyXG4gICAgICAgIGNQb3M9dHJnRnJhbWVQb3MtY2NGcmFtZVBvcztcclxuICAgICAgICBpZihjUG9zK3RvQ3A+Y2NMZW4pe1xyXG4gICAgICAgICAgdG9DcD1jY0xlbi1jUG9zO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IobGV0IGNoPTA7Y2g8YnVmcy5sZW5ndGg7Y2grKyl7XHJcbiAgICAgICAgICBsZXQgY2M9dGhpcy5kYXRhW2NoXVtjaV07XHJcblxyXG4gICAgICAgICAgZm9yKGxldCBpPTA7aTx0b0NwO2krKyl7XHJcbiAgICAgICAgICAgIGJ1ZnNbY2hdW2ZpbGxlZCtpXT1jY1tjUG9zK2ldO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBmaWxsZWQrPXRvQ3A7XHJcbiAgICAgICAgdHJnRnJhbWVQb3MrPXRvQ3A7XHJcbiAgICAgICAgY1Bvcys9dG9DcDtcclxuICAgICAgICBjY0ZyYW1lUG9zKz10b0NwO1xyXG4gICAgICAgIGlmKGNQb3M+PWNjTGVuKXtcclxuICAgICAgICAgIGNjRnJhbWVQb3M9Y2NGcmFtZUVuZFBvcztcclxuICAgICAgICAgIGNQb3M9MDtcclxuICAgICAgICAgIGNpKys7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgLy8gbmV4dCBjaHVua1xyXG4gICAgICAgIGNjRnJhbWVQb3M9Y2NGcmFtZUVuZFBvcztcclxuICAgICAgICBjUG9zPTA7XHJcbiAgICAgICAgY2krKztcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZpbGxlZDtcclxuICB9XHJcblxyXG4gIGdldCBzYW1wbGVSYXRlKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2FtcGxlUmF0ZTtcclxuICB9XHJcblxyXG4gIGdldCBmcmFtZUxlbigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZyYW1lTGVuO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNodW5rQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jaHVua0NvdW50O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRhdGEoKTogQXJyYXk8QXJyYXk8RmxvYXQzMkFycmF5Pj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RhdGE7XHJcbiAgfVxyXG5cclxuICBhc3luY0F1ZGlvSW5wdXRTdHJlYW0oKTogQXN5bmNGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbSB8IG51bGwge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBhdWRpb0lucHV0U3RyZWFtKCk6IEZsb2F0MzJBcnJheUlucHV0U3RyZWFtIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gbmV3IEFycmF5QXVkaW9CdWZmZXJJbnB1dFN0cmVhbSh0aGlzKTtcclxuICB9XHJcblxyXG4gIGdldCBkdXJhdGlvbigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2R1cmF0aW9uO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG51bWJlck9mQ2hhbm5lbHMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jaGFubmVsQ291bnQ7XHJcbiAgfVxyXG5cclxuICByZWxlYXNlQXVkaW9EYXRhKCk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZTx2b2lkPihzdWJzY3JpYmVyID0+IHtcclxuICAgICAgICAvLyBObyBwZXJzaXN0ZW50IHJlc3BlY3RpdmVseSBhc3luYyBkZWxldGFibGUgc3RvcmFnZSwgdGhleSBzaG91bGQgYmUgZmluYWxseSByZW1vdmVkIGJ5IHRoZSBHQ1xyXG4gICAgICAgIC8vdGhpcy5fYXVkaW9CdWZmZXI9bnVsbDtcclxuICAgICAgICAvL3RoaXMuX2FycmF5QnVmZmVyPW51bGw7XHJcbiAgICAgICAgc3Vic2NyaWJlci5uZXh0KCk7XHJcbiAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xyXG5cclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIHNhbXBsZUNvdW50cygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NoYW5uZWxDb3VudCp0aGlzLl9mcmFtZUxlbjtcclxuICB9XHJcblxyXG4gIHJhbmRvbUFjY2Vzc0F1ZGlvU3RyZWFtKCk6IFJhbmRvbUFjY2Vzc0F1ZGlvU3RyZWFtIHtcclxuICAgcmV0dXJuIG5ldyBBcnJheUF1ZGlvQnVmZmVyUmFuZG9tQWNjZXNzU3RyZWFtKHRoaXMpO1xyXG4gIH1cclxuXHJcbn1cclxuIl19
|
|
164
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXlfYXVkaW9fYnVmZmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2F1ZGlvL2FycmF5X2F1ZGlvX2J1ZmZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsZ0JBQWdCLEVBQTBCLE1BQU0scUJBQXFCLENBQUM7QUFFOUUsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNoQyxPQUFPLEVBQUMsa0NBQWtDLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUM3RixPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUc5RSxNQUFNLE9BQU8sZ0JBQWlCLFNBQVEsZ0JBQWdCO0lBT3BELFlBQW9CLGFBQXFCLEVBQVUsV0FBbUIsRUFBVSxLQUFpQztRQUMvRyxLQUFLLEVBQUUsQ0FBQztRQURVLGtCQUFhLEdBQWIsYUFBYSxDQUFRO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFBVSxVQUFLLEdBQUwsS0FBSyxDQUE0QjtRQUx6RyxnQkFBVyxHQUFDLENBQUMsQ0FBQztRQUNkLGNBQVMsR0FBUSxDQUFDLENBQUM7UUFDbkIsY0FBUyxHQUFRLENBQUMsQ0FBQztRQUNuQixZQUFPLEdBQUMsS0FBSyxDQUFDO1FBSXBCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixDQUFDO0lBRU8sY0FBYztRQUNwQixJQUFJLENBQUMsU0FBUyxHQUFDLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsV0FBVyxHQUFDLENBQUMsQ0FBQztRQUNuQixJQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0Is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LFdBQVcsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLDJCQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDeEIsQ0FBQztJQUVELElBQUksZ0JBQWdCO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBRUQsZ0JBQWdCO1FBQ1YsT0FBTyxJQUFJLFVBQVUsQ0FBTyxVQUFVLENBQUMsRUFBRTtZQUN6QywrRkFBK0Y7WUFDL0YseUJBQXlCO1lBQ3pCLHlCQUF5QjtZQUN6QixVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEIsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBRTFCLENBQUMsQ0FBQyxDQUFDO0lBRUwsQ0FBQztJQUVELFlBQVk7UUFDVixPQUFPLElBQUksQ0FBQyxhQUFhLEdBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMzQyxDQUFDO0lBRUQsdUJBQXVCO1FBQ3RCLE9BQU8sSUFBSSxrQ0FBa0MsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNyRCxDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0Jhc2ljQXVkaW9Tb3VyY2UsIFJhbmRvbUFjY2Vzc0F1ZGlvU3RyZWFtfSBmcm9tIFwiLi9hdWRpb19kYXRhX2hvbGRlclwiO1xyXG5pbXBvcnQge0FzeW5jRmxvYXQzMkFycmF5SW5wdXRTdHJlYW0sIEZsb2F0MzJBcnJheUlucHV0U3RyZWFtfSBmcm9tIFwiLi4vaW8vc3RyZWFtXCI7XHJcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtBcnJheUF1ZGlvQnVmZmVyUmFuZG9tQWNjZXNzU3RyZWFtfSBmcm9tIFwiLi9hcnJheV9hdWRpb19idWZmZXJfcmFuZG9tX2FjY2Vzc19zdHJlYW1cIjtcclxuaW1wb3J0IHtBcnJheUF1ZGlvQnVmZmVySW5wdXRTdHJlYW19IGZyb20gXCIuL2FycmF5X2F1ZGlvX2J1ZmZlcl9pbnB1dF9zdHJlYW1cIjtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgQXJyYXlBdWRpb0J1ZmZlciBleHRlbmRzIEJhc2ljQXVkaW9Tb3VyY2V7XHJcblxyXG4gIHByaXZhdGUgX2NodW5rQ291bnQ9MDtcclxuICBwcml2YXRlIF9mcmFtZUxlbjpudW1iZXI9MDtcclxuICBwcml2YXRlIF9kdXJhdGlvbjpudW1iZXI9MDtcclxuICBwcml2YXRlIF9zZWFsZWQ9ZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2NoYW5uZWxDb3VudDogbnVtYmVyLCBwcml2YXRlIF9zYW1wbGVSYXRlOiBudW1iZXIsIHByaXZhdGUgX2RhdGE6IEFycmF5PEFycmF5PEZsb2F0MzJBcnJheT4+KSB7XHJcbiAgICBzdXBlcigpO1xyXG4gICAgdGhpcy51cGRhdGVGcmFtZUxlbigpO1xyXG4gICAgdGhpcy5yZWFkeSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVGcmFtZUxlbigpe1xyXG4gICAgdGhpcy5fZnJhbWVMZW49MDtcclxuICAgIHRoaXMuX2NodW5rQ291bnQ9MDtcclxuICAgIGlmKHRoaXMuX2RhdGEubGVuZ3RoPjApIHtcclxuICAgICAgbGV0IGNoMERhdGEgPSB0aGlzLmRhdGFbMF07XHJcbiAgICAgIGZvciAobGV0IGNoMENoayBvZiBjaDBEYXRhKSB7XHJcbiAgICAgICAgdGhpcy5fY2h1bmtDb3VudCsrO1xyXG4gICAgICAgIHRoaXMuX2ZyYW1lTGVuICs9IGNoMENoay5sZW5ndGg7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuX2R1cmF0aW9uPXRoaXMuX2ZyYW1lTGVuL3RoaXMuX3NhbXBsZVJhdGU7XHJcbiAgfVxyXG5cclxuICBzZWFsKCl7XHJcbiAgICB0aGlzLl9zZWFsZWQ9dHJ1ZTtcclxuICB9XHJcblxyXG4gIHNlYWxlZCgpOmJvb2xlYW57XHJcbiAgICByZXR1cm4gdGhpcy5fc2VhbGVkO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIGZyb21BdWRpb0J1ZmZlcihhdWRpb0J1ZmZlcjpBdWRpb0J1ZmZlcixjaHVua0ZyYW1lU2l6ZT04MTkyKTpBcnJheUF1ZGlvQnVmZmVye1xyXG4gICAgbGV0IGFhYjpBcnJheUF1ZGlvQnVmZmVyO1xyXG4gICAgbGV0IGNocz1hdWRpb0J1ZmZlci5udW1iZXJPZkNoYW5uZWxzO1xyXG4gICAgbGV0IGZyYW1lTGVuZ3RoPWF1ZGlvQnVmZmVyLmxlbmd0aDtcclxuICAgIC8vbGV0IGNodW5rc1NpemU9TWF0aC5jZWlsKGZyYW1lTGVuZ3RoL2NodW5rRnJhbWVTaXplKTtcclxuICAgIGxldCBmcmFtZVBvcz0wO1xyXG4gICAgbGV0IGRhdGE9bmV3IEFycmF5PEFycmF5PEZsb2F0MzJBcnJheT4+KGNocyk7XHJcbiAgICBmb3IobGV0IGNoPTA7Y2g8Y2hzO2NoKyspIHtcclxuICAgICAgZGF0YVtjaF09bmV3IEFycmF5PEZsb2F0MzJBcnJheT4oKTtcclxuICAgIH1cclxuICAgIGxldCB0b0NvcHk9ZnJhbWVMZW5ndGgtZnJhbWVQb3M7XHJcbiAgICAgIHdoaWxlKHRvQ29weT4wKXtcclxuXHJcbiAgICAgICAgbGV0IHRvQ29weUNodW5rPWNodW5rRnJhbWVTaXplO1xyXG4gICAgICAgIGlmKHRvQ29weUNodW5rPnRvQ29weSl7XHJcbiAgICAgICAgICAvLyBsYXN0IGNodW5rLCB0aGUgcmVzdFxyXG4gICAgICAgICAgdG9Db3B5Q2h1bms9dG9Db3B5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IobGV0IGNoPTA7Y2g8Y2hzO2NoKyspIHtcclxuICAgICAgICAgIGRhdGFbY2hdLnB1c2goYXVkaW9CdWZmZXIuZ2V0Q2hhbm5lbERhdGEoY2gpLnNsaWNlKGZyYW1lUG9zLCBmcmFtZVBvcyArIHRvQ29weUNodW5rKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZyYW1lUG9zKz10b0NvcHlDaHVuaztcclxuICAgICAgICB0b0NvcHktPXRvQ29weUNodW5rO1xyXG4gICAgICB9XHJcbiAgICBhYWI9bmV3IEFycmF5QXVkaW9CdWZmZXIoY2hzLGF1ZGlvQnVmZmVyLnNhbXBsZVJhdGUsZGF0YSk7XHJcbiAgICByZXR1cm4gYWFiO1xyXG4gIH1cclxuXHJcbiAgYXBwZW5kQXVkaW9CdWZmZXIoYXVkaW9CdWZmZXI6QXVkaW9CdWZmZXIpe1xyXG4gICAgbGV0IGNocz1hdWRpb0J1ZmZlci5udW1iZXJPZkNoYW5uZWxzO1xyXG4gICAgaWYodGhpcy5fY2hhbm5lbENvdW50IT09IGNocyl7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFwcGVuZCBhdWRpbyBidWZmZXIgd2l0aCAnK2NocysnIGNoYW5uZWxzIHRvIHRoaXMgYXJyYXkgYXVkaW8gYnVmZmVyIHdpdGggJyt0aGlzLl9jaGFubmVsQ291bnQrJyBjaGFubmVscy4gTnVtYmVyIG9mIGNoYW5uZWxzIG11c3QgbWF0Y2guJyk7XHJcbiAgICB9XHJcbiAgICBsZXQgc3I9YXVkaW9CdWZmZXIuc2FtcGxlUmF0ZTtcclxuICAgIGlmKHNyIT09dGhpcy5fc2FtcGxlUmF0ZSl7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGFwcGVuZCBhdWRpbyBidWZmZXIgd2l0aCBzYW1wbGVyYXRlICcrc3IrJyB0byB0aGlzIGFycmF5IGF1ZGlvIGJ1ZmZlciB3aXRoIHNhbXBsZXJhdGUgJyt0aGlzLl9zYW1wbGVSYXRlKycuIFNhbXBsZXJhdGVzIG11c3QgbWF0Y2guJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZm9yKGxldCBjaD0wO2NoPGNocztjaCsrKSB7XHJcbiAgICAgIGxldCBjaEFiU2xpY2U9YXVkaW9CdWZmZXIuZ2V0Q2hhbm5lbERhdGEoY2gpLnNsaWNlKCk7XHJcbiAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkFwcGVuZCBhdWRpbyBidWZmZXIgY2g6IFwiK2NoK1wiOiBcIitjaEFiU2xpY2UubGVuZ3RoKTtcclxuICAgICAgdGhpcy5fZGF0YVtjaF0ucHVzaChjaEFiU2xpY2UpO1xyXG4gICAgfVxyXG4gICAgdGhpcy51cGRhdGVGcmFtZUxlbigpO1xyXG4gIH1cclxuXHJcblxyXG4gIGdldCBjaGFubmVsQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jaGFubmVsQ291bnQ7XHJcbiAgfVxyXG5cclxuICBmcmFtZXMoZnJhbWVQb3M6bnVtYmVyLGZyYW1lTGVuOm51bWJlcixidWZzOkZsb2F0MzJBcnJheVtdKTpudW1iZXJ7XHJcblxyXG4gICAgbGV0IGNjRnJhbWVQb3M9MDtcclxuICAgIGxldCB0cmdGcmFtZVBvcz1mcmFtZVBvcztcclxuICAgIGxldCBjaDBEYXRhID0gdGhpcy5kYXRhWzBdO1xyXG4gICAgbGV0IGNQb3M9MDtcclxuICAgIGxldCBmaWxsZWQ9MDtcclxuICAgIGxldCBjaT0wO1xyXG5cclxuICAgIHdoaWxlKGZpbGxlZDxmcmFtZUxlbiAmJiBjaTx0aGlzLl9jaHVua0NvdW50KXtcclxuICAgICAgLy8gQ3VycmVudCBjaHVua1xyXG4gICAgICBsZXQgY2MwPWNoMERhdGFbY2ldO1xyXG4gICAgICBsZXQgY2NMZW49Y2MwLmxlbmd0aDtcclxuICAgICAgbGV0IGNjRnJhbWVFbmRQb3M9Y2NGcmFtZVBvcytjY0xlbjtcclxuXHJcbiAgICAgIGlmKHRyZ0ZyYW1lUG9zPj1jY0ZyYW1lUG9zICYmIHRyZ0ZyYW1lUG9zPGNjRnJhbWVFbmRQb3Mpe1xyXG4gICAgICAgIGxldCB0b0NwPWZyYW1lTGVuLWZpbGxlZDtcclxuICAgICAgICBjUG9zPXRyZ0ZyYW1lUG9zLWNjRnJhbWVQb3M7XHJcbiAgICAgICAgaWYoY1Bvcyt0b0NwPmNjTGVuKXtcclxuICAgICAgICAgIHRvQ3A9Y2NMZW4tY1BvcztcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yKGxldCBjaD0wO2NoPGJ1ZnMubGVuZ3RoO2NoKyspe1xyXG4gICAgICAgICAgbGV0IGNjPXRoaXMuZGF0YVtjaF1bY2ldO1xyXG5cclxuICAgICAgICAgIGZvcihsZXQgaT0wO2k8dG9DcDtpKyspe1xyXG4gICAgICAgICAgICBidWZzW2NoXVtmaWxsZWQraV09Y2NbY1BvcytpXTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZmlsbGVkKz10b0NwO1xyXG4gICAgICAgIHRyZ0ZyYW1lUG9zKz10b0NwO1xyXG4gICAgICAgIGNQb3MrPXRvQ3A7XHJcbiAgICAgICAgY2NGcmFtZVBvcys9dG9DcDtcclxuICAgICAgICBpZihjUG9zPj1jY0xlbil7XHJcbiAgICAgICAgICBjY0ZyYW1lUG9zPWNjRnJhbWVFbmRQb3M7XHJcbiAgICAgICAgICBjUG9zPTA7XHJcbiAgICAgICAgICBjaSsrO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIC8vIG5leHQgY2h1bmtcclxuICAgICAgICBjY0ZyYW1lUG9zPWNjRnJhbWVFbmRQb3M7XHJcbiAgICAgICAgY1Bvcz0wO1xyXG4gICAgICAgIGNpKys7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmaWxsZWQ7XHJcbiAgfVxyXG5cclxuICBnZXQgc2FtcGxlUmF0ZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NhbXBsZVJhdGU7XHJcbiAgfVxyXG5cclxuICBnZXQgZnJhbWVMZW4oKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9mcmFtZUxlbjtcclxuICB9XHJcblxyXG4gIGdldCBjaHVua0NvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2h1bmtDb3VudDtcclxuICB9XHJcblxyXG4gIGdldCBkYXRhKCk6IEFycmF5PEFycmF5PEZsb2F0MzJBcnJheT4+IHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRhO1xyXG4gIH1cclxuXHJcbiAgYXN5bmNBdWRpb0lucHV0U3RyZWFtKCk6IEFzeW5jRmxvYXQzMkFycmF5SW5wdXRTdHJlYW0gfCBudWxsIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgYXVkaW9JbnB1dFN0cmVhbSgpOiBGbG9hdDMyQXJyYXlJbnB1dFN0cmVhbSB8IG51bGwge1xyXG4gICAgcmV0dXJuIG5ldyBBcnJheUF1ZGlvQnVmZmVySW5wdXRTdHJlYW0odGhpcyk7XHJcbiAgfVxyXG5cclxuICBnZXQgZHVyYXRpb24oKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9kdXJhdGlvbjtcclxuICB9XHJcblxyXG4gIGdldCBudW1iZXJPZkNoYW5uZWxzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2hhbm5lbENvdW50O1xyXG4gIH1cclxuXHJcbiAgcmVsZWFzZUF1ZGlvRGF0YSgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGU8dm9pZD4oc3Vic2NyaWJlciA9PiB7XHJcbiAgICAgICAgLy8gTm8gcGVyc2lzdGVudCByZXNwZWN0aXZlbHkgYXN5bmMgZGVsZXRhYmxlIHN0b3JhZ2UsIHRoZXkgc2hvdWxkIGJlIGZpbmFsbHkgcmVtb3ZlZCBieSB0aGUgR0NcclxuICAgICAgICAvL3RoaXMuX2F1ZGlvQnVmZmVyPW51bGw7XHJcbiAgICAgICAgLy90aGlzLl9hcnJheUJ1ZmZlcj1udWxsO1xyXG4gICAgICAgIHN1YnNjcmliZXIubmV4dCgpO1xyXG4gICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcclxuXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBzYW1wbGVDb3VudHMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9jaGFubmVsQ291bnQqdGhpcy5fZnJhbWVMZW47XHJcbiAgfVxyXG5cclxuICByYW5kb21BY2Nlc3NBdWRpb1N0cmVhbSgpOiBSYW5kb21BY2Nlc3NBdWRpb1N0cmVhbSB7XHJcbiAgIHJldHVybiBuZXcgQXJyYXlBdWRpb0J1ZmZlclJhbmRvbUFjY2Vzc1N0cmVhbSh0aGlzKTtcclxuICB9XHJcblxyXG59XHJcbiJdfQ==
|
|
@@ -83,4 +83,4 @@ export class ArrayAudioBufferInputStream {
|
|
|
83
83
|
return this._framePos;
|
|
84
84
|
}
|
|
85
85
|
}
|
|
86
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
86
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXlfYXVkaW9fYnVmZmVyX2lucHV0X3N0cmVhbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9hdWRpby9hcnJheV9hdWRpb19idWZmZXJfaW5wdXRfc3RyZWFtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sT0FBTywyQkFBMkI7SUFNdEMsWUFBb0IsZ0JBQWlDO1FBQWpDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBaUI7UUFKN0MsY0FBUyxHQUFDLENBQUMsQ0FBQztRQUNaLGtCQUFhLEdBQUMsQ0FBQyxDQUFDO1FBQ2hCLGFBQVEsR0FBQyxDQUFDLENBQUM7UUFDWCxRQUFHLEdBQUMsS0FBSyxDQUFDO1FBRWhCLGtHQUFrRztJQUNwRyxDQUFDO0lBRUQsS0FBSztJQUNMLENBQUM7SUFFRCxVQUFVLENBQUMsQ0FBUTtRQUNqQixJQUFJLE1BQU0sR0FBQyxDQUFDLENBQUM7UUFDYixJQUFHLElBQUksQ0FBQyxRQUFRLElBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ25ELElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDO1lBQ2hCLElBQUksTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNmLE1BQU0sS0FBSyxDQUFDLGtDQUFrQyxHQUFHLE1BQU0sR0FBRyxVQUFVLENBQUMsQ0FBQTtZQUN2RSxDQUFDO1FBQ0gsQ0FBQzthQUFLLENBQUM7WUFDTCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUM3RCxJQUFJLFlBQVksR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1lBQ3BDLElBQUksZ0JBQWdCLEdBQUcsWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7WUFDekQsSUFBSSxDQUFD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O1FBQzlELElBQUcsSUFBSSxDQUFDLFNBQVMsR0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFDLENBQUM7WUFDaEQsT0FBTyxDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsR0FBQyxJQUFJLENBQUMsU0FBUyxHQUFDLDhCQUE4QixHQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNySSxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBSUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RmxvYXQzMkFycmF5SW5wdXRTdHJlYW19IGZyb20gXCIuLi9pby9zdHJlYW1cIjtcclxuaW1wb3J0IHtBcnJheUF1ZGlvQnVmZmVyfSBmcm9tIFwiLi9hcnJheV9hdWRpb19idWZmZXJcIjtcclxuZXhwb3J0IGNsYXNzIEFycmF5QXVkaW9CdWZmZXJJbnB1dFN0cmVhbSBpbXBsZW1lbnRzIEZsb2F0MzJBcnJheUlucHV0U3RyZWFte1xyXG5cclxuICBwcml2YXRlIF9mcmFtZVBvcz0wO1xyXG4gIHByaXZhdGUgY2h1bmtGcmFtZVBvcz0wO1xyXG4gIHByaXZhdGUgY2h1bmtJZHg9MDtcclxuICBwcml2YXRlIGVvZD1mYWxzZTtcclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFycmF5QXVkaW9CdWZmZXI6QXJyYXlBdWRpb0J1ZmZlcikge1xyXG4gICAgLy9jb25zb2xlLmRlYnVnKFwiQXJyYXkgYXVkaW8gaW5wdXQgc3RyZWFtIGFycmF5IGF1ZGlvIGJ1ZmZlciBmcmFtZXM6IFwiK2FycmF5QXVkaW9CdWZmZXIuZnJhbWVMZW4pO1xyXG4gIH1cclxuXHJcbiAgY2xvc2UoKTogdm9pZCB7XHJcbiAgfVxyXG5cclxuICBza2lwRnJhbWVzKG46bnVtYmVyKXtcclxuICAgIGxldCB0b1NraXA9bjtcclxuICAgIGlmKHRoaXMuY2h1bmtJZHg+PXRoaXMuYXJyYXlBdWRpb0J1ZmZlci5jaHVua0NvdW50KSB7XHJcbiAgICAgIHRoaXMuZW9kID0gdHJ1ZTtcclxuICAgICAgaWYgKHRvU2tpcCA+IDApIHtcclxuICAgICAgICB0aHJvdyBFcnJvcignU2tpcCBvdXQgb2YgYm91bmRzOiBDYW5ub3Qgc2tpcCAnICsgdG9Ta2lwICsgJyBmcmFtZXMuJylcclxuICAgICAgfVxyXG4gICAgfWVsc2Uge1xyXG4gICAgICBsZXQgY2h1bmtCdWYwID0gdGhpcy5hcnJheUF1ZGlvQnVmZmVyLmRhdGFbMF1bdGhpcy5jaHVua0lkeF07XHJcbiAgICAgIGxldCBjaHVua0J1ZnNMZW4gPSBjaHVua0J1ZjAubGVuZ3RoO1xyXG4gICAgICBsZXQgY3VyckJ1ZlNraXBwYWJsZSA9IGNodW5rQnVmc0xlbiAtIHRoaXMuY2h1bmtGcmFtZVBvcztcclxuICAgICAgaWYgKG4gPj0gY3VyckJ1ZlNraXBwYWJsZSkge1xyXG4gICAgICAgIHRoaXMuX2ZyYW1lUG9zICs9IGN1cnJCdWZTa2lwcGFibGU7XHJcbiAgICAgICAgdG9Ta2lwIC09IGN1cnJCdWZTa2lwcGFibGU7XHJcbiAgICAgICAgdGhpcy5jaHVua0lkeCsrXHJcbiAgICAgICAgdGhpcy5jaHVua0ZyYW1lUG9zID0gMDtcclxuICAgICAgICBpZiAodGhpcy5jaHVua0lkeCA8IHRoaXMuYXJyYXlBdWRpb0J1ZmZlci5jaHVua0NvdW50KSB7XHJcbiAgICAgICAgICB0aGlzLnNraXBGcmFtZXModG9Ta2lwKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgaWYgKHRvU2tpcCA+IDApIHtcclxuICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1NraXAgb3V0IG9mIGJvdW5kczogQ2Fubm90IHNraXAgJyArIHRvU2tpcCArICcgZnJhbWVzLicpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRvU2tpcCAtPSBuO1xyXG4gICAgICAgIHRoaXMuY2h1bmtGcmFtZVBvcyArPSBuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWFkKGJ1ZmZlcnM6IEFycmF5PEZsb2F0MzJBcnJheT4pOiBudW1iZXIge1xyXG4gICAgbGV0IHJlYWQ9MDtcclxuXHJcbiAgICBsZXQgdG9SZWFkPWJ1ZmZlcnNbMF0ubGVuZ3RoO1xyXG5cclxuICAgICAgd2hpbGUocmVhZDx0b1JlYWQgJiYgIXRoaXMuZW9kKXtcclxuICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJDaHVuayBcIit0aGlzLmNodW5rSWR4K1wiIG9mIFwiK3RoaXMuYXJyYXlBdWRpb0J1ZmZlci5jaHVua0NvdW50K1wiIGNodW5rcy5cIilcclxuICAgICAgICBpZih0aGlzLmNodW5rSWR4Pj10aGlzLmFycmF5QXVkaW9CdWZmZXIuY2h1bmtDb3VudCkge1xyXG4gICAgICAgICAgdGhpcy5lb2QgPSB0cnVlO1xyXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiQXJyYXkgYXVkaW8gaW5wdXQgc3RyZWFtIGVuZCBvZiBkYXRhIHJlYWQgZnJhbWVzOiBcIit0aGlzLmZyYW1lUG9zKTtcclxuICAgICAgICB9ZWxzZSB7XHJcbiAgICAgICAgICBsZXQgY2h1bmtCdWYwID0gdGhpcy5hcnJheUF1ZGlvQnVmZmVyLmRhdGFbMF1bdGhpcy5jaHVua0lkeF07XHJcbiAgICAgICAgICBsZXQgY2h1bmtCdWZzTGVuID0gY2h1bmtCdWYwLmxlbmd0aDtcclxuICAgICAgICAgIGNvbnN0IGNodW5rQnVmQXZhaWwgPSBjaHVua0J1ZnNMZW4gLSB0aGlzLmNodW5rRnJhbWVQb3M7XHJcbiAgICAgICAgICBsZXQgciA9IGNodW5rQnVmQXZhaWw7XHJcbiAgICAgICAgICBpZiAociA+IHRvUmVhZCAtIHJlYWQpIHtcclxuICAgICAgICAgICAgciA9IHRvUmVhZCAtIHJlYWQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgYnVmZmVycy5sZW5ndGg7IGNoKyspIHtcclxuICAgICAgICAgICAgbGV0IGNoQ2h1bmtCdWY9dGhpcy5hcnJheUF1ZGlvQnVmZmVyLmRhdGFbY2hdW3RoaXMuY2h1bmtJZHhdO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBiaSA9IDA7IGJpIDwgcjsgYmkrKykge1xyXG4gICAgICAgICAgICAgIGJ1ZmZlcnNbY2hdW3JlYWQgKyBiaV0gPSBjaENodW5rQnVmW3RoaXMuY2h1bmtGcmFtZVBvcyArIGJpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmVhZCArPSByO1xyXG5cclxuICAgICAgICAgIHRoaXMuY2h1bmtGcmFtZVBvcyArPSByO1xyXG4gICAgICAgICAgaWYgKHRoaXMuY2h1bmtGcmFtZVBvcyA+PSBjaHVua0J1ZnNMZW4pIHtcclxuICAgICAgICAgICAgdGhpcy5jaHVua0lkeCsrO1xyXG4gICAgICAgICAgICB0aGlzLmNodW5rRnJhbWVQb3MgPSAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgdGhpcy5fZnJhbWVQb3MrPXJlYWQ7XHJcbiAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlJlYWQ6IFwiK3JlYWQrXCIsIGZyYW1lIHBvczogXCIrdGhpcy5mcmFtZVBvcylcclxuICAgIGlmKHRoaXMuX2ZyYW1lUG9zPnRoaXMuYXJyYXlBdWRpb0J1ZmZlci5mcmFtZUxlbil7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJBcnJheSBhdWRpbyBpbnB1dCBzdHJlYW0gZnJhbWUgcG9zOiBcIit0aGlzLl9mcmFtZVBvcytcIiBncmVhdGVyIHRoZW4gZnJhbWUgbGVuZ3RoOiBcIit0aGlzLmFycmF5QXVkaW9CdWZmZXIuZnJhbWVMZW4pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlYWQ7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIGdldCBmcmFtZVBvcygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZyYW1lUG9zO1xyXG4gIH1cclxuXHJcbn1cclxuIl19
|