speechrecorderng 2.18.13 → 2.19.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/bundles/speechrecorderng.umd.js +558 -104
- package/bundles/speechrecorderng.umd.js.map +1 -1
- package/esm2015/lib/audio/capture/capture.js +262 -69
- package/esm2015/lib/io/stream.js +8 -7
- package/esm2015/lib/speechrecorder/project/project.js +27 -1
- package/esm2015/lib/speechrecorder/session/sessionmanager.js +35 -8
- package/esm2015/lib/speechrecorderng.component.js +2 -1
- package/esm2015/lib/spr.module.version.js +2 -2
- package/esm2015/lib/ui/livelevel_display.js +24 -4
- package/esm2015/lib/utils/ua-parser.js +166 -0
- package/fesm2015/speechrecorderng.js +526 -95
- package/fesm2015/speechrecorderng.js.map +1 -1
- package/lib/audio/capture/capture.d.ts +6 -3
- package/lib/speechrecorder/project/project.d.ts +25 -0
- package/lib/speechrecorder/session/sessionmanager.d.ts +7 -3
- package/lib/spr.module.version.d.ts +1 -1
- package/lib/ui/livelevel_display.d.ts +4 -1
- package/lib/utils/ua-parser.d.ts +40 -0
- package/package.json +3 -3
|
@@ -1,11 +1,88 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { Browser, Platform, UserAgentBuilder } from "../../utils/ua-parser";
|
|
2
|
+
import { Platform as CfgPlatform } from "../../speechrecorder/project/project";
|
|
3
|
+
export const CHROME_ACTIVATE_ECHO_CANCELLATION_WITH_AGC = false;
|
|
4
|
+
const DEBUG_TRACE_LEVEL = 0;
|
|
5
|
+
const ENABLE_AUDIO_WORKLET = true;
|
|
6
|
+
// Super dirty way to load this module
|
|
7
|
+
// Copy content of interceptor_worklet.js to this string
|
|
8
|
+
const awpStr = "class AudioCaptureInterceptorProcessor extends AudioWorkletProcessor{\n" +
|
|
9
|
+
"\n" +
|
|
10
|
+
" BUFFER_QUANTUMS=64;\n" +
|
|
11
|
+
" QUANTUM_FRAME_LEN=128;\n" +
|
|
12
|
+
" BUFFER_FRAME_LEN=this.QUANTUM_FRAME_LEN*this.BUFFER_QUANTUMS;\n" +
|
|
13
|
+
" buffer=null;\n" +
|
|
14
|
+
" bufferPos=0;\n" +
|
|
15
|
+
" bufferPosBytes=0;\n" +
|
|
16
|
+
" constructor() {\n" +
|
|
17
|
+
" super();\n" +
|
|
18
|
+
"\n" +
|
|
19
|
+
" }\n" +
|
|
20
|
+
"\n" +
|
|
21
|
+
" process(\n" +
|
|
22
|
+
" inputs,\n" +
|
|
23
|
+
" outputs,\n" +
|
|
24
|
+
" parameters\n" +
|
|
25
|
+
" ){\n" +
|
|
26
|
+
"\n" +
|
|
27
|
+
" let inputsCnt=inputs.length;\n" +
|
|
28
|
+
" let channelCount=0;\n" +
|
|
29
|
+
" let inputLen=0;\n" +
|
|
30
|
+
" let inputLenBytes=0;\n" +
|
|
31
|
+
" if(inputsCnt>0) {\n" +
|
|
32
|
+
" let input0 = inputs[0];\n" +
|
|
33
|
+
" channelCount = input0.length;\n" +
|
|
34
|
+
" if (channelCount > 0) {\n" +
|
|
35
|
+
" let input0ch0=input0[0];\n" +
|
|
36
|
+
" inputLen=input0ch0.length;\n" +
|
|
37
|
+
" inputLenBytes=input0ch0.buffer.length;\n" +
|
|
38
|
+
" }\n" +
|
|
39
|
+
" }\n" +
|
|
40
|
+
" if (!this.buffer || this.buffer.length < channelCount) {\n" +
|
|
41
|
+
" this.buffer = new Array(channelCount);\n" +
|
|
42
|
+
" this.bufferPos = 0\n" +
|
|
43
|
+
" for (let bch = 0; bch < channelCount; bch++) {\n" +
|
|
44
|
+
" this.buffer[bch] = new Float32Array(this.BUFFER_FRAME_LEN);\n" +
|
|
45
|
+
" this.bufferPos = 0;\n" +
|
|
46
|
+
" this.bufferPosBytes=0;\n" +
|
|
47
|
+
" }\n" +
|
|
48
|
+
" }\n" +
|
|
49
|
+
" let bufAvail = this.BUFFER_FRAME_LEN - this.bufferPos;\n" +
|
|
50
|
+
" // check if buffer has to be transferred\n" +
|
|
51
|
+
" if (inputLen > bufAvail) {\n" +
|
|
52
|
+
" let ada=new Array(channelCount);\n" +
|
|
53
|
+
" for (let ch = 0; ch < channelCount; ch++) {\n" +
|
|
54
|
+
" ada[ch]=this.buffer[ch].buffer.slice(0);\n" +
|
|
55
|
+
" }\n" +
|
|
56
|
+
" this.port.postMessage({\n" +
|
|
57
|
+
" data: ada,\n" +
|
|
58
|
+
" chs: channelCount,\n" +
|
|
59
|
+
" len: this.bufferPos\n" +
|
|
60
|
+
" }, ada);\n" +
|
|
61
|
+
" // buffer transferred, reset\n" +
|
|
62
|
+
" this.bufferPos = 0;\n" +
|
|
63
|
+
" this.bufferPosBytes=0;\n" +
|
|
64
|
+
" }\n" +
|
|
65
|
+
"\n" +
|
|
66
|
+
" for(let ii=0;ii<inputsCnt;ii++) {\n" +
|
|
67
|
+
" for (let ch = 0; ch < channelCount; ch++) {\n" +
|
|
68
|
+
" // Mute outputs\n" +
|
|
69
|
+
" //outputs[ii][ch].fill(0);\n" +
|
|
70
|
+
" let chSamples = inputs[ii][ch];\n" +
|
|
71
|
+
" this.buffer[ch].set(chSamples,this.bufferPos);\n" +
|
|
72
|
+
" }\n" +
|
|
73
|
+
" this.bufferPos+=inputLen;\n" +
|
|
74
|
+
" this.bufferPosBytes+=inputLenBytes;\n" +
|
|
75
|
+
" }\n" +
|
|
76
|
+
" \n" +
|
|
77
|
+
" return true;\n" +
|
|
78
|
+
" }\n" +
|
|
79
|
+
"}\n" +
|
|
80
|
+
"\n" +
|
|
81
|
+
"registerProcessor('capture-interceptor',AudioCaptureInterceptorProcessor);\n";
|
|
7
82
|
export class AudioCapture {
|
|
8
83
|
constructor(context) {
|
|
84
|
+
this.agcStatus = null;
|
|
85
|
+
this.bufferingNode = null;
|
|
9
86
|
this.audioOutStream = null;
|
|
10
87
|
this.disconnectStreams = true;
|
|
11
88
|
this._opened = false;
|
|
@@ -53,7 +130,7 @@ export class AudioCapture {
|
|
|
53
130
|
if (!labelsAvailable) {
|
|
54
131
|
//console.debug("Media device enumeration: No labels.")
|
|
55
132
|
if (retry) {
|
|
56
|
-
|
|
133
|
+
console.info("Starting dummy session to request audio permissions...");
|
|
57
134
|
this.dummySession().then((s) => {
|
|
58
135
|
// and stop it immediately
|
|
59
136
|
if (s) {
|
|
@@ -118,12 +195,12 @@ export class AudioCapture {
|
|
|
118
195
|
console.log("Audio device: Id: " + di.deviceId + " groupId: " + di.groupId + " label: " + di.label + " kind: " + di.kind);
|
|
119
196
|
}
|
|
120
197
|
}
|
|
121
|
-
open(channelCount, selDeviceId) {
|
|
198
|
+
open(channelCount, selDeviceId, autoGainControlConfigs) {
|
|
122
199
|
this.context.resume().then(() => {
|
|
123
|
-
this._open(channelCount, selDeviceId);
|
|
200
|
+
this._open(channelCount, selDeviceId, autoGainControlConfigs);
|
|
124
201
|
});
|
|
125
202
|
}
|
|
126
|
-
_open(channelCount, selDeviceId) {
|
|
203
|
+
_open(channelCount, selDeviceId, autoGainControlConfigs) {
|
|
127
204
|
this.channelCount = channelCount;
|
|
128
205
|
this.framesRecorded = 0;
|
|
129
206
|
//var msc = new AudioStreamConstr();
|
|
@@ -139,7 +216,48 @@ export class AudioCapture {
|
|
|
139
216
|
// TODO test if input is unprocessed
|
|
140
217
|
let msc;
|
|
141
218
|
console.info('User agent: ' + navigator.userAgent);
|
|
142
|
-
|
|
219
|
+
let ua = UserAgentBuilder.userAgent();
|
|
220
|
+
// ua.components.forEach((c)=>{
|
|
221
|
+
// console.info("UA_Comp: "+c.toString());
|
|
222
|
+
// })
|
|
223
|
+
let agcCfg = null;
|
|
224
|
+
let autoGainControl = false;
|
|
225
|
+
let chromeEchoCancellation = false;
|
|
226
|
+
if (autoGainControlConfigs) {
|
|
227
|
+
for (let agcc of autoGainControlConfigs) {
|
|
228
|
+
if (agcc.platform === CfgPlatform.Android && ua.detectedPlatform === Platform.Android) {
|
|
229
|
+
agcCfg = agcc;
|
|
230
|
+
break;
|
|
231
|
+
}
|
|
232
|
+
if (agcc.platform === CfgPlatform.Windows && ua.detectedPlatform === Platform.Windows) {
|
|
233
|
+
agcCfg = agcc;
|
|
234
|
+
break;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
if (agcCfg) {
|
|
238
|
+
// TODO use EXACT/IDEAL constraint
|
|
239
|
+
autoGainControl = agcCfg.value;
|
|
240
|
+
if (CHROME_ACTIVATE_ECHO_CANCELLATION_WITH_AGC) {
|
|
241
|
+
chromeEchoCancellation = agcCfg.value;
|
|
242
|
+
}
|
|
243
|
+
// TODO query real AGC status
|
|
244
|
+
this.agcStatus = agcCfg.value;
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
this.agcStatus = false;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
// default
|
|
251
|
+
msc = {
|
|
252
|
+
audio: {
|
|
253
|
+
deviceId: selDeviceId,
|
|
254
|
+
echoCancellation: false,
|
|
255
|
+
channelCount: channelCount,
|
|
256
|
+
autoGainControl: autoGainControl
|
|
257
|
+
},
|
|
258
|
+
video: false
|
|
259
|
+
};
|
|
260
|
+
if (ua.detectedBrowser === Browser.Edge) {
|
|
143
261
|
// Microsoft Edge sends unmodified audio
|
|
144
262
|
// The constraint can follow the specification
|
|
145
263
|
console.info("Setting media track constraints for Microsoft Edge.");
|
|
@@ -147,12 +265,13 @@ export class AudioCapture {
|
|
|
147
265
|
audio: {
|
|
148
266
|
deviceId: selDeviceId,
|
|
149
267
|
echoCancellation: false,
|
|
150
|
-
channelCount: channelCount
|
|
268
|
+
channelCount: channelCount,
|
|
269
|
+
autoGainControl: autoGainControl
|
|
151
270
|
},
|
|
152
271
|
video: false
|
|
153
272
|
};
|
|
154
273
|
}
|
|
155
|
-
else if (
|
|
274
|
+
else if (ua.detectedBrowser === Browser.Chrome) {
|
|
156
275
|
// Google Chrome: we need to switch of each of the preprocessing units including the
|
|
157
276
|
console.info("Setting media track constraints for Google Chrome.");
|
|
158
277
|
// Chrome 60 -> 61 changed
|
|
@@ -160,47 +279,38 @@ export class AudioCapture {
|
|
|
160
279
|
// Requires at least Chrome 61
|
|
161
280
|
msc = {
|
|
162
281
|
audio: {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
"googExperimentalEchoCancellation": false,
|
|
169
|
-
"googAutoGainControl": false,
|
|
170
|
-
"googTypingNoiseDetection": false,
|
|
171
|
-
"googNoiseSuppression": false,
|
|
172
|
-
"googHighpassFilter": false,
|
|
173
|
-
"googBeamforming": false
|
|
282
|
+
deviceId: selDeviceId,
|
|
283
|
+
channelCount: channelCount,
|
|
284
|
+
echoCancellation: { exact: chromeEchoCancellation },
|
|
285
|
+
autoGainControl: { exact: autoGainControl },
|
|
286
|
+
sampleSize: { min: 16 },
|
|
174
287
|
},
|
|
175
288
|
video: false,
|
|
176
289
|
};
|
|
177
290
|
}
|
|
178
|
-
else if (
|
|
291
|
+
else if (ua.detectedBrowser === Browser.Firefox) {
|
|
179
292
|
console.info("Setting media track constraints for Mozilla Firefox.");
|
|
180
293
|
// Firefox
|
|
181
294
|
msc = {
|
|
182
295
|
audio: {
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
"mozAutoGainControl": false,
|
|
189
|
-
"noiseSuppression": false,
|
|
190
|
-
"mozNoiseSuppression": false
|
|
296
|
+
deviceId: selDeviceId,
|
|
297
|
+
channelCount: channelCount,
|
|
298
|
+
echoCancellation: false,
|
|
299
|
+
autoGainControl: autoGainControl,
|
|
300
|
+
noiseSuppression: false
|
|
191
301
|
},
|
|
192
302
|
video: false,
|
|
193
303
|
};
|
|
194
304
|
}
|
|
195
|
-
else if (
|
|
305
|
+
else if (ua.detectedBrowser === Browser.Safari) {
|
|
196
306
|
console.info("Setting media track constraints for Safari browser.");
|
|
197
307
|
console.info("Apply workaround for Safari: Avoid disconnect of streams.");
|
|
198
308
|
this.disconnectStreams = false;
|
|
199
309
|
msc = {
|
|
200
310
|
audio: {
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
311
|
+
deviceId: selDeviceId,
|
|
312
|
+
channelCount: channelCount,
|
|
313
|
+
echoCancellation: false
|
|
204
314
|
},
|
|
205
315
|
video: false,
|
|
206
316
|
};
|
|
@@ -208,6 +318,7 @@ export class AudioCapture {
|
|
|
208
318
|
else {
|
|
209
319
|
// TODO default constraints or error Browser not supported
|
|
210
320
|
}
|
|
321
|
+
console.debug("Audio capture, AGC: " + this.agcStatus);
|
|
211
322
|
let ump = navigator.mediaDevices.getUserMedia(msc);
|
|
212
323
|
ump.then((s) => {
|
|
213
324
|
this.stream = s;
|
|
@@ -215,6 +326,11 @@ export class AudioCapture {
|
|
|
215
326
|
for (let i = 0; i < aTracks.length; i++) {
|
|
216
327
|
let aTrack = aTracks[i];
|
|
217
328
|
console.info("Track audio info: id: " + aTrack.id + " kind: " + aTrack.kind + " label: \"" + aTrack.label + "\"");
|
|
329
|
+
let mtrSts = aTrack.getSettings();
|
|
330
|
+
console.info("Track audio settings: Ch cnt: " + mtrSts.channelCount + ", AGC: " + mtrSts.autoGainControl + ", Echo cancell.: " + mtrSts.echoCancellation);
|
|
331
|
+
if (mtrSts.autoGainControl) {
|
|
332
|
+
this.agcStatus = mtrSts.autoGainControl;
|
|
333
|
+
}
|
|
218
334
|
}
|
|
219
335
|
let vTracks = s.getVideoTracks();
|
|
220
336
|
for (let i = 0; i < vTracks.length; i++) {
|
|
@@ -224,6 +340,7 @@ export class AudioCapture {
|
|
|
224
340
|
this.mediaStream = this.context.createMediaStreamSource(s);
|
|
225
341
|
// stream channel count ( is always 2 !)
|
|
226
342
|
let streamChannelCount = this.mediaStream.channelCount;
|
|
343
|
+
console.info("Stream channel count: " + streamChannelCount);
|
|
227
344
|
// is not set!!
|
|
228
345
|
//this.currentSampleRate = this.mediaStream.sampleRate;
|
|
229
346
|
this.currentSampleRate = this.context.sampleRate;
|
|
@@ -233,43 +350,117 @@ export class AudioCapture {
|
|
|
233
350
|
}
|
|
234
351
|
// W3C -> new name is createScriptProcessor
|
|
235
352
|
//
|
|
236
|
-
//
|
|
353
|
+
// Again deprecated, but AudioWorker not yet implemented in stable releases (June 2016)
|
|
237
354
|
// AudioWorker is now AudioWorkletProcessor ... (May 2017)
|
|
238
355
|
// Update 12-2020:
|
|
239
356
|
// The ScriptProcessorNode Interface - DEPRECATED
|
|
240
|
-
|
|
241
|
-
|
|
357
|
+
// Update 06-2021
|
|
358
|
+
// AudioWorkletProcessor is here to stay. Web Audio API has now Recommendation status !
|
|
359
|
+
if (ENABLE_AUDIO_WORKLET && this.context.audioWorklet) {
|
|
360
|
+
//const workletFileName = ('file-loader!./interceptor_worklet.js');
|
|
361
|
+
//const workletFileName = 'http://localhost:4200/assets/interceptor_worklet.js';
|
|
362
|
+
//console.log(awpStr);
|
|
363
|
+
let audioWorkletModuleBlob = new Blob([awpStr], { type: 'text/javascript' });
|
|
364
|
+
let audioWorkletModuleBlobUrl = window.URL.createObjectURL(audioWorkletModuleBlob);
|
|
365
|
+
this.context.audioWorklet.addModule(audioWorkletModuleBlobUrl).then(() => {
|
|
366
|
+
const awn = new AudioWorkletNode(this.context, 'capture-interceptor');
|
|
367
|
+
awn.onprocessorerror = (ev) => {
|
|
368
|
+
let msg = 'Unknwon error';
|
|
369
|
+
if (ev instanceof ErrorEvent) {
|
|
370
|
+
msg = ev.message;
|
|
371
|
+
}
|
|
372
|
+
console.error("Capture audio worklet error: " + msg);
|
|
373
|
+
if (this.listener) {
|
|
374
|
+
this.listener.error(msg);
|
|
375
|
+
}
|
|
376
|
+
};
|
|
377
|
+
let awnPt = awn.port;
|
|
378
|
+
if (awnPt) {
|
|
379
|
+
awnPt.onmessage = (ev) => {
|
|
380
|
+
if (this.capturing) {
|
|
381
|
+
let dt = ev.data;
|
|
382
|
+
let chs = dt.chs;
|
|
383
|
+
let adaLen = dt.data.length;
|
|
384
|
+
if (DEBUG_TRACE_LEVEL > 8) {
|
|
385
|
+
console.debug('Received data from worklet: ' + chs + ' ' + dt.len + ' Data chs: ' + adaLen);
|
|
386
|
+
}
|
|
387
|
+
//let chunkLen = adaLen / chs;
|
|
388
|
+
let chunkLen = adaLen;
|
|
389
|
+
let chunk = new Array(chs);
|
|
390
|
+
for (let ch = 0; ch < chs; ch++) {
|
|
391
|
+
if (this.data && this.data[ch]) {
|
|
392
|
+
let adaPos = ch * chunkLen;
|
|
393
|
+
if (dt.data[ch]) {
|
|
394
|
+
let fa = new Float32Array(dt.data[ch]);
|
|
395
|
+
this.data[ch].push(fa);
|
|
396
|
+
chunk[ch] = fa;
|
|
397
|
+
// Use samples of channel 0 to count frames (samples)
|
|
398
|
+
if (ch == 0) {
|
|
399
|
+
this.framesRecorded += fa.length;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
else {
|
|
403
|
+
if (DEBUG_TRACE_LEVEL > 8) {
|
|
404
|
+
console.debug('Channel ' + ch + ' data not set!!');
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
if (this.audioOutStream) {
|
|
410
|
+
this.audioOutStream.write(chunk);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
this.bufferingNode = awn;
|
|
416
|
+
this._opened = true;
|
|
417
|
+
if (this.listener) {
|
|
418
|
+
this.listener.opened();
|
|
419
|
+
}
|
|
420
|
+
}).catch((error) => {
|
|
421
|
+
console.log('Could not add module ' + error);
|
|
422
|
+
});
|
|
242
423
|
}
|
|
243
|
-
else {
|
|
244
|
-
// The ScriptProcessorNode Interface - DEPRECATED
|
|
245
|
-
//console.debug("Audio script processor implemented!!");
|
|
424
|
+
else if (this.context.createScriptProcessor) {
|
|
425
|
+
// The ScriptProcessorNode Interface - DEPRECATED Only as fallback
|
|
246
426
|
// TODO should we use streamChannelCount or channelCount here ?
|
|
247
|
-
|
|
427
|
+
let scriptProcessorNode = this.context.createScriptProcessor(AudioCapture.BUFFER_SIZE, streamChannelCount, streamChannelCount);
|
|
428
|
+
this.bufferingNode = scriptProcessorNode;
|
|
248
429
|
let c = 0;
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
430
|
+
if (scriptProcessorNode.onaudioprocess) {
|
|
431
|
+
scriptProcessorNode.onaudioprocess = (e) => {
|
|
432
|
+
if (this.capturing) {
|
|
433
|
+
let inBuffer = e.inputBuffer;
|
|
434
|
+
let duration = inBuffer.duration;
|
|
435
|
+
// only process requested count of channels
|
|
436
|
+
let currentBuffers = new Array(channelCount);
|
|
437
|
+
for (let ch = 0; ch < channelCount; ch++) {
|
|
438
|
+
let chSamples = inBuffer.getChannelData(ch);
|
|
439
|
+
let chSamplesCopy = chSamples.slice(0);
|
|
440
|
+
currentBuffers[ch] = chSamplesCopy.slice(0);
|
|
441
|
+
this.data[ch].push(chSamplesCopy);
|
|
442
|
+
if (DEBUG_TRACE_LEVEL > 8) {
|
|
443
|
+
console.debug("Process " + chSamplesCopy.length + " samples.");
|
|
444
|
+
}
|
|
445
|
+
this.framesRecorded += chSamplesCopy.length;
|
|
446
|
+
}
|
|
447
|
+
c++;
|
|
448
|
+
if (this.audioOutStream) {
|
|
449
|
+
this.audioOutStream.write(currentBuffers);
|
|
450
|
+
}
|
|
266
451
|
}
|
|
452
|
+
};
|
|
453
|
+
this._opened = true;
|
|
454
|
+
if (this.listener) {
|
|
455
|
+
this.listener.opened();
|
|
267
456
|
}
|
|
268
|
-
}
|
|
457
|
+
}
|
|
458
|
+
else {
|
|
459
|
+
this.listener.error('Browser does not support audio processing (ScriptProcessor.onaudioprocess method not found)!');
|
|
460
|
+
}
|
|
269
461
|
}
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
this.listener.opened();
|
|
462
|
+
else {
|
|
463
|
+
this.listener.error('Browser does not support audio processing (neither AudioWorkletProcessor nor ScriptProcessor)!');
|
|
273
464
|
}
|
|
274
465
|
}, (e) => {
|
|
275
466
|
console.error(e + " Error name: " + e.name);
|
|
@@ -296,14 +487,16 @@ export class AudioCapture {
|
|
|
296
487
|
this.audioOutStream.nextStream();
|
|
297
488
|
}
|
|
298
489
|
this.capturing = true;
|
|
299
|
-
|
|
300
|
-
|
|
490
|
+
if (this.bufferingNode) {
|
|
491
|
+
this.mediaStream.connect(this.bufferingNode);
|
|
492
|
+
this.bufferingNode.connect(this.context.destination);
|
|
493
|
+
}
|
|
301
494
|
if (this.listener) {
|
|
302
495
|
this.listener.started();
|
|
303
496
|
}
|
|
304
497
|
}
|
|
305
498
|
stop() {
|
|
306
|
-
if (this.disconnectStreams) {
|
|
499
|
+
if (this.disconnectStreams && this.bufferingNode) {
|
|
307
500
|
this.mediaStream.disconnect(this.bufferingNode);
|
|
308
501
|
this.bufferingNode.disconnect(this.context.destination);
|
|
309
502
|
}
|
|
@@ -348,4 +541,4 @@ export class AudioCapture {
|
|
|
348
541
|
}
|
|
349
542
|
}
|
|
350
543
|
AudioCapture.BUFFER_SIZE = 8192;
|
|
351
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwdHVyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9hdWRpby9jYXB0dXJlL2NhcHR1cmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxpQkFBaUI7SUFJckI7UUFDRSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNsQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0NBQ0Y7QUFjRCxNQUFNLE9BQU8sWUFBWTtJQTBCdkIsWUFBWSxPQUFxQjtRQVBqQyxtQkFBYyxHQUF1QyxJQUFJLENBQUM7UUFDbEQsc0JBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLFlBQU8sR0FBQyxLQUFLLENBQUM7UUFDZCxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBRTFCLG1CQUFjLEdBQVMsQ0FBQyxDQUFDO1FBR3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUE1QkQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUE0Qk8sUUFBUTtRQUNkLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxLQUFLLEVBQXVCLENBQUM7UUFDN0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLEVBQWdCLENBQUMsQ0FBQztTQUMzQztRQUNELElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRCxXQUFXO1FBQ1QsU0FBUyxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLElBQUksQ0FBQyxD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TUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7Z0JBQzFCLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNwQixHQUFHLElBQUksTUFBTSxDQUFDO2FBQ2Y7U0FDRjtRQUNELE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQzs7QUE1WU0sd0JBQVcsR0FBVyxJQUFJLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1NlcXVlbmNlQXVkaW9GbG9hdDMyT3V0U3RyZWFtfSBmcm9tIFwiLi4vaW8vc3RyZWFtXCI7XHJcblxyXG5jbGFzcyBBdWRpb1N0cmVhbUNvbnN0ciBpbXBsZW1lbnRzIE1lZGlhU3RyZWFtQ29uc3RyYWludHMge1xyXG4gIGF1ZGlvOiBib29sZWFuO1xyXG4gIHZpZGVvOiBib29sZWFuO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMuYXVkaW8gPSB0cnVlO1xyXG4gICAgdGhpcy52aWRlbyA9IGZhbHNlO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBdWRpb0NhcHR1cmVMaXN0ZW5lciB7XHJcbiAgb3BlbmVkKCk6IHZvaWQ7XHJcblxyXG4gIHN0YXJ0ZWQoKTogdm9pZDtcclxuXHJcbiAgc3RvcHBlZCgpOiB2b2lkO1xyXG5cclxuICBjbG9zZWQoKTogdm9pZDtcclxuXHJcbiAgZXJyb3IobXNnPzpzdHJpbmcsYWR2aWNlPzpzdHJpbmcpOiB2b2lkO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQXVkaW9DYXB0dXJlIHtcclxuICBnZXQgb3BlbmVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX29wZW5lZDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBCVUZGRVJfU0laRTogbnVtYmVyID0gODE5MjtcclxuICBjb250ZXh0OiBBdWRpb0NvbnRleHQ7XHJcbiAgc3RyZWFtITogTWVkaWFTdHJlYW07XHJcbiAgLy9tZWRpYVN0cmVhbTpNZWRpYVN0cmVhbUF1ZGlvU291cmNlTm9kZTtcclxuICAvLyBubyBkLnRzIGZvciBXZWIgYXVkaW8gQVBJIGZvdW5kIHNvIGZhciAodHNkIHF1ZXJ5ICphdWRpbyopIChOb3YgMjAxNSlcclxuICAvLyBUT0RPIHVzZSBBdWRpb1JlY29yZGVyXHJcblxyXG4gIGNoYW5uZWxDb3VudCE6IG51bWJlcjtcclxuICBtZWRpYVN0cmVhbTogYW55O1xyXG4gIGJ1ZmZlcmluZ05vZGU6IGFueTtcclxuICBsaXN0ZW5lciE6IEF1ZGlvQ2FwdHVyZUxpc3RlbmVyO1xyXG4gIGRhdGEhOiBBcnJheTxBcnJheTxGbG9hdDMyQXJyYXk+PjtcclxuICBjdXJyZW50U2FtcGxlUmF0ZSE6IG51bWJlcjtcclxuICBuOiBOYXZpZ2F0b3I7XHJcbiAgYXVkaW9PdXRTdHJlYW06IFNlcXVlbmNlQXVkaW9GbG9hdDMyT3V0U3RyZWFtIHwgbnVsbD1udWxsO1xyXG4gIHByaXZhdGUgZGlzY29ubmVjdFN0cmVhbXMgPSB0cnVlO1xyXG4gIHByaXZhdGUgX29wZW5lZD1mYWxzZTtcclxuICBwcml2YXRlIGNhcHR1cmluZyA9IGZhbHNlO1xyXG5cclxuICBmcmFtZXNSZWNvcmRlZDogbnVtYmVyPTA7XHJcblxyXG4gIGNvbnN0cnVjdG9yKGNvbnRleHQ6IEF1ZGlvQ29udGV4dCkge1xyXG4gICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcclxuICAgIHRoaXMubiA9IG5hdmlnYXRvcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdERhdGEoKSB7XHJcbiAgICB0aGlzLmRhdGEgPSBuZXcgQXJyYXk8QXJyYXk8RmxvYXQzMkFycmF5Pj4oKTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGFubmVsQ291bnQ7IGkrKykge1xyXG4gICAgICB0aGlzLmRhdGEucHVzaChuZXcgQXJyYXk8RmxvYXQzMkFycmF5PigpKTtcclxuICAgIH1cclxuICAgIHRoaXMuZnJhbWVzUmVjb3JkZWQgPSAwO1xyXG4gIH1cclxuXHJcbiAgbGlzdERldmljZXMoKSB7XHJcbiAgICBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmVudW1lcmF0ZURldmljZXMoKS50aGVuKChsOiBNZWRpYURldmljZUluZm9bXSkgPT4gdGhpcy5wcmludERldmljZXMobCkpO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgZHVtbXlTZXNzaW9uKCk6UHJvbWlzZTxNZWRpYVN0cmVhbT57XHJcbiAgICAvLyB3b3JrYXJvdW5kIHRvIHJlcXVlc3QgcGVybWlzc2lvbnM6XHJcbiAgICAvLyBTdGFydCBhIGR1bW15IHNlc3Npb25cclxuICAgIGxldCBtZWRpYVN0ckNuc3RycyA9IDxNZWRpYVN0cmVhbUNvbnN0cmFpbnRzPnthdWRpbzpcclxuICAgICAgICB7ZWNob0NhbmNlbGF0aW9uOiBmYWxzZX1cclxuICAgIH07XHJcbiAgICByZXR1cm4gbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEobWVkaWFTdHJDbnN0cnMpO1xyXG5cclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIHN0b3BBbGxTZXNzaW9uVHJhY2tzKG1lZGlhU3RyZWFtOk1lZGlhU3RyZWFtKXtcclxuICAgICAgbGV0IGF0cyA9IG1lZGlhU3RyZWFtLmdldFRyYWNrcygpO1xyXG4gICAgICBmb3IgKGxldCBhdElkeCA9IDA7IGF0SWR4IDwgYXRzLmxlbmd0aDsgYXRJZHgrKykge1xyXG4gICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlN0b3AgZHVtbXkgc2Vzc2lvbiB0cmFjazogI1wiICsgYXRJZHgpXHJcbiAgICAgICAgYXRzW2F0SWR4XS5zdG9wKCk7XHJcbiAgICAgIH1cclxuICB9XHJcblxyXG4gIGRldmljZUluZm9zKGNiOiAoZGV2aWNlSW5mb3M6IE1lZGlhRGV2aWNlSW5mb1tdIHwgbnVsbCkgPT4gYW55LCByZXRyeSA9IHRydWUsZHVtbXlTdHJlYW0/Ok1lZGlhU3RyZWFtKSB7XHJcblxyXG4gICAgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzKCkudGhlbigobDogTWVkaWFEZXZpY2VJbmZvW10pID0+IHtcclxuICAgICAgbGV0IGxhYmVsc0F2YWlsYWJsZSA9IGZhbHNlO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGwubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgZGkgPSBsW2ldO1xyXG4gICAgICAgIGlmIChkaS5sYWJlbCkge1xyXG4gICAgICAgICAgbGFiZWxzQXZhaWxhYmxlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFsYWJlbHNBdmFpbGFibGUpIHtcclxuICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJNZWRpYSBkZXZpY2UgZW51bWVyYXRpb246IE5vIGxhYmVscy5cIilcclxuICAgICAgICBpZiAocmV0cnkpIHtcclxuICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlN0YXJ0aW5nIGR1bW15IHNlc3Npb24gdG8gcmVxdWVzdCBhdWRpbyBwZXJtaXNzaW9ucy4uLlwiKVxyXG5cclxuICAgICAgICAgICAgdGhpcy5kdW1teVNlc3Npb24oKS50aGVuKChzOiBNZWRpYVN0cmVhbSkgPT4ge1xyXG4gICAgICAgICAgICAvLyBhbmQgc3RvcCBpdCBpbW1lZGlhdGVseVxyXG5cclxuICAgICAgICAgICAgaWYocykge1xyXG4gICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkdvdCBkdW1teSBzZXNzaW9uIHN0cmVhbTogXCIgKyBzICsgXCIgLlwiKVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJObyBkdW1teSBzdHJlYW1cIilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyByZXRyeSAob25seSBvbmNlKVxyXG4gICAgICAgICAgICB0aGlzLmRldmljZUluZm9zKGNiLCBmYWxzZSxzKTtcclxuICAgICAgICAgIH0scmVhc29uID0+IHtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiRHVtbXkgc2Vzc2lvbiByZWplY3RlZC5cIilcclxuICAgICAgICAgICAgLy8gVE9ETyBlcnJvciBjYWxsYmFja1xyXG4gICAgICAgICAgICBjYihudWxsKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjYihudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gc3VjY2Vzc1xyXG4gICAgICAgIGNiKGwpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKGR1bW15U3RyZWFtKXtcclxuICAgICAgICB0aGlzLnN0b3BBbGxTZXNzaW9uVHJhY2tzKGR1bW15U3RyZWFtKTtcclxuICAgICAgfVxyXG4gICAgfSwocmVhc29uKT0+IHtcclxuICAgICAgLy9yZWplY3RlZFxyXG4gICAgICAvL2NvbnNvbGUuZGVidWcoXCJNZWRpYSBkZXZpY2UgZW51bWVyYXRpb24gcmVqZWN0ZWQuXCIpXHJcbiAgICAgIGlmIChyZXRyeSkge1xyXG4gICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlN0YXJ0aW5nIGR1bW15IHNlc3Npb24gdG8gcmVxdWVzdCBhdWRpbyBwZXJtaXNzaW9ucy4uLlwiKVxyXG4gICAgICAgIHRoaXMuZHVtbXlTZXNzaW9uKCkudGhlbigoczogTWVkaWFTdHJlYW0pID0+IHtcclxuICAgICAgICAgIC8vIGFuZCBzdG9wIGl0IGltbWVkaWF0ZWx5XHJcbiAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJEdW1teSBzZXNzaW9uLlwiKVxyXG4gICAgICAgICAgaWYocykge1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJHb3QgZHVtbXkgc2Vzc2lvbiBzdHJlYW06IFwiICsgcyArIFwiIC5cIilcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJObyBkdW1teSBzdHJlYW1cIilcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIHJldHJ5IChvbmx5IG9uY2UpXHJcbiAgICAgICAgICB0aGlzLmRldmljZUluZm9zKGNiLCBmYWxzZSxzKTtcclxuICAgICAgICB9LCByZWFzb24gPT4ge1xyXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiRHVtbXkgc2Vzc2lvbiByZWplY3RlZC5cIilcclxuICAgICAgICAgIC8vIFRPRE8gZXJyb3IgY2FsbGJhY2tcclxuICAgICAgICAgIGNiKG51bGwpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNiKG51bGwpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKGR1bW15U3RyZWFtKXtcclxuICAgICAgICB0aGlzLnN0b3BBbGxTZXNzaW9uVHJhY2tzKGR1bW15U3RyZWFtKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG5cclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpbnREZXZpY2VzKGw6IE1lZGlhRGV2aWNlSW5mb1tdKTogdm9pZCB7XHJcbiAgICBsZXQgc2VsRGV2aWNlSWQgPSAnX19fZHVtbXlfX18nO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGxldCBkaSA9IGxbaV07XHJcblxyXG4gICAgICBjb25zb2xlLmxvZyhcIkF1ZGlvIGRldmljZTogSWQ6IFwiICsgZGkuZGV2aWNlSWQgKyBcIiBncm91cElkOiBcIiArIGRpLmdyb3VwSWQgKyBcIiBsYWJlbDogXCIgKyBkaS5sYWJlbCArIFwiIGtpbmQ6IFwiICsgZGkua2luZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvcGVuKGNoYW5uZWxDb3VudDogbnVtYmVyLCBzZWxEZXZpY2VJZD86IENvbnN0cmFpbkRPTVN0cmluZyl7XHJcbiAgICAgIHRoaXMuY29udGV4dC5yZXN1bWUoKS50aGVuKCgpPT57XHJcbiAgICAgICAgdGhpcy5fb3BlbihjaGFubmVsQ291bnQsc2VsRGV2aWNlSWQpO1xyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgX29wZW4oY2hhbm5lbENvdW50OiBudW1iZXIsIHNlbERldmljZUlkPzogQ29uc3RyYWluRE9NU3RyaW5nKSB7XHJcbiAgICB0aGlzLmNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudDtcclxuICAgIHRoaXMuZnJhbWVzUmVjb3JkZWQgPSAwO1xyXG4gICAgLy92YXIgbXNjID0gbmV3IEF1ZGlvU3RyZWFtQ29uc3RyKCk7XHJcbiAgICAvLyB2YXIgbXNjPXt9O1xyXG4gICAgLy9tc2MudmlkZW8gPSBmYWxzZTtcclxuICAgIC8vbXNjLmF1ZGlvID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBDaHJvbWUgYW5kIEZpcmVmb3ggc3RlcmVvIGNoYW5uZWxzIGFyZSBpZGVudGljYWwgISFcclxuICAgIC8vIEFuZCBldmVuIHdvcnNlOiBUaGUgZGF0YSBjb21pbmcgZnJvbSB0aGUgc291cmNlIGlzIGFscmVhZHkgcHJlcHJvY2Vzc2VkIG9uIEZGIGFuZCBDaHJvbWUuIEl0IGNvbnRhaW5zIERTUCBhcnRpZmFjdHMhIVxyXG5cclxuICAgIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTM4NzczN1xyXG4gICAgLy8gVGhlIHdvcmthcm91bmQgdG8gc2V0IHRoZXNlIGNvbnN0cmFpbnRzIGRvZXMgX05PVF8gaGVscDpcclxuICAgIC8vdmFyIG1zYz17YXVkaW86IHtlY2hvQ2FuY2VsbGF0aW9uOiBmYWxzZSxjaGFubmVsQ291bnQ6IDIsIGdvb2dBdWRpb01pcnJvcmluZzogZmFsc2V9LHZpZGVvOiBmYWxzZX07XHJcblxyXG4gICAgLy8gU2FmYXJpIGF0IGxlYXN0IHZlcnNpb24gMTE6IFN1cHBvcnQgZm9yIG1lZGlhIHN0cmVhbXNcclxuICAgIC8vIFRPRE8gdGVzdCBpZiBpbnB1dCBpcyB1bnByb2Nlc3NlZFxyXG5cclxuICAgIGxldCBtc2M6YW55O1xyXG4gICAgY29uc29sZS5pbmZvKCdVc2VyIGFnZW50OiAnK25hdmlnYXRvci51c2VyQWdlbnQpO1xyXG4gICAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goXCIuKkVkZ2UuKlwiKSkge1xyXG5cclxuICAgICAgLy8gTWljcm9zb2Z0IEVkZ2Ugc2VuZHMgdW5tb2RpZmllZCBhdWRpb1xyXG4gICAgICAvLyBUaGUgY29uc3RyYWludCBjYW4gZm9sbG93IHRoZSBzcGVjaWZpY2F0aW9uXHJcbiAgICAgIGNvbnNvbGUuaW5mbyhcIlNldHRpbmcgbWVkaWEgdHJhY2sgY29uc3RyYWludHMgZm9yIE1pY3Jvc29mdCBFZGdlLlwiKTtcclxuICAgICAgbXNjID0ge1xyXG4gICAgICAgIGF1ZGlvOiB7XHJcbiAgICAgICAgICBkZXZpY2VJZDogc2VsRGV2aWNlSWQsXHJcbiAgICAgICAgICBlY2hvQ2FuY2VsbGF0aW9uOiBmYWxzZSxcclxuICAgICAgICAgIGNoYW5uZWxDb3VudDogY2hhbm5lbENvdW50XHJcbiAgICAgICAgfSxcclxuICAgICAgICB2aWRlbzogZmFsc2VcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSBpZiAobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaChcIi4qQ2hyb21lLipcIikpIHtcclxuICAgICAgLy8gR29vZ2xlIENocm9tZTogd2UgbmVlZCB0byBzd2l0Y2ggb2YgZWFjaCBvZiB0aGUgcHJlcHJvY2Vzc2luZyB1bml0cyBpbmNsdWRpbmcgdGhlXHJcbiAgICAgIGNvbnNvbGUuaW5mbyhcIlNldHRpbmcgbWVkaWEgdHJhY2sgY29uc3RyYWludHMgZm9yIEdvb2dsZSBDaHJvbWUuXCIpO1xyXG5cclxuICAgICAgLy8gQ2hyb21lIDYwIC0+IDYxIGNoYW5nZWRcclxuICAgICAgLy8gaXQgd29ya3Mgbm93IHdpdGhvdXQgbWFuZGF0b3J5L29wdGlvbmFsIHN1Yi1vYmplY3RzXHJcblxyXG5cclxuICAgICAgLy8gUmVxdWlyZXMgYXQgbGVhc3QgQ2hyb21lIDYxXHJcbiAgICAgIG1zYyA9IHtcclxuICAgICAgICBhdWRpbzoge1xyXG4gICAgICAgICAgXCJkZXZpY2VJZFwiOiBzZWxEZXZpY2VJZCxcclxuICAgICAgICAgIFwiY2hhbm5lbENvdW50XCI6IGNoYW5uZWxDb3VudCxcclxuICAgICAgICAgIFwiZWNob0NhbmNlbGxhdGlvblwiOiBmYWxzZSxcclxuICAgICAgICAgIFwiYXV0b0dhaW5Db250cm9sXCI6IGZhbHNlLFxyXG4gICAgICAgICAgXCJnb29nRWNob0NhbmNlbGxhdGlvblwiOiBmYWxzZSxcclxuICAgICAgICAgIFwiZ29vZ0V4cGVyaW1lbnRhbEVjaG9DYW5jZWxsYXRpb25cIjogZmFsc2UsXHJcbiAgICAgICAgICBcImdvb2dBdXRvR2FpbkNvbnRyb2xcIjogZmFsc2UsXHJcbiAgICAgICAgICBcImdvb2dUeXBpbmdOb2lzZURldGVjdGlvblwiOiBmYWxzZSxcclxuICAgICAgICAgIFwiZ29vZ05vaXNlU3VwcHJlc3Npb25cIjogZmFsc2UsXHJcbiAgICAgICAgICBcImdvb2dIaWdocGFzc0ZpbHRlclwiOiBmYWxzZSxcclxuICAgICAgICAgIFwiZ29vZ0JlYW1mb3JtaW5nXCI6IGZhbHNlXHJcbiAgICAgICAgfSxcclxuICAgICAgICB2aWRlbzogZmFsc2UsXHJcbiAgICAgIH1cclxuXHJcbiAgICB9IGVsc2UgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goXCIuKkZpcmVmb3guKlwiKSkge1xyXG4gICAgICBjb25zb2xlLmluZm8oXCJTZXR0aW5nIG1lZGlhIHRyYWNrIGNvbnN0cmFpbnRzIGZvciBNb3ppbGxhIEZpcmVmb3guXCIpO1xyXG4gICAgICAvLyBGaXJlZm94XHJcbiAgICAgIG1zYyA9IHtcclxuICAgICAgICBhdWRpbzoge1xyXG4gICAgICAgICAgICBcImRldmljZUlkXCI6IHNlbERldmljZUlkLFxyXG4gICAgICAgICAgICBcImNoYW5uZWxDb3VudFwiOiBjaGFubmVsQ291bnQsXHJcbiAgICAgICAgICBcImVjaG9DYW5jZWxsYXRpb25cIjogZmFsc2UsXHJcbiAgICAgICAgICAgIFwibW96RWNob0NhbmNlbGxhdGlvblwiOiBmYWxzZSxcclxuICAgICAgICAgICAgXCJhdXRvR2FpbkNvbnRyb2xcIjogZmFsc2UsXHJcbiAgICAgICAgICBcIm1vekF1dG9HYWluQ29udHJvbFwiOiBmYWxzZSxcclxuICAgICAgICAgIFwibm9pc2VTdXBwcmVzc2lvblwiOiBmYWxzZSxcclxuICAgICAgICAgIFwibW96Tm9pc2VTdXBwcmVzc2lvblwiOiBmYWxzZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdmlkZW86IGZhbHNlLFxyXG4gICAgICB9XHJcblxyXG4gICAgfSBlbHNlIGlmIChuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKFwiLipTYWZhcmkuKlwiKSkge1xyXG4gICAgICBjb25zb2xlLmluZm8oXCJTZXR0aW5nIG1lZGlhIHRyYWNrIGNvbnN0cmFpbnRzIGZvciBTYWZhcmkgYnJvd3Nlci5cIilcclxuICAgICAgY29uc29sZS5pbmZvKFwiQXBwbHkgd29ya2Fyb3VuZCBmb3IgU2FmYXJpOiBBdm9pZCBkaXNjb25uZWN0IG9mIHN0cmVhbXMuXCIpO1xyXG4gICAgICB0aGlzLmRpc2Nvbm5lY3RTdHJlYW1zID0gZmFsc2U7XHJcbiAgICAgIG1zYyA9IHtcclxuICAgICAgICBhdWRpbzoge1xyXG4gICAgICAgICAgXCJkZXZpY2VJZFwiOiBzZWxEZXZpY2VJZCxcclxuICAgICAgICAgIFwiY2hhbm5lbENvdW50XCI6IGNoYW5uZWxDb3VudCxcclxuICAgICAgICAgIFwiZWNob0NhbmNlbGxhdGlvblwiOiBmYWxzZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdmlkZW86IGZhbHNlLFxyXG4gICAgICB9XHJcblxyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIC8vIFRPRE8gZGVmYXVsdCBjb25zdHJhaW50cyBvciBlcnJvciBCcm93c2VyIG5vdCBzdXBwb3J0ZWRcclxuICAgIH1cclxuXHJcbiAgICBsZXQgdW1wID0gbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoPE1lZGlhU3RyZWFtQ29uc3RyYWludHM+bXNjKTtcclxuICAgIHVtcC50aGVuKChzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zdHJlYW0gPSBzO1xyXG5cclxuICAgICAgICBsZXQgYVRyYWNrcyA9IHMuZ2V0QXVkaW9UcmFja3MoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhVHJhY2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgYVRyYWNrID0gYVRyYWNrc1tpXTtcclxuXHJcbiAgICAgICAgICBjb25zb2xlLmluZm8oXCJUcmFjayBhdWRpbyBpbmZvOiBpZDogXCIgKyBhVHJhY2suaWQgKyBcIiBraW5kOiBcIiArIGFUcmFjay5raW5kICsgXCIgbGFiZWw6IFxcXCJcIiArIGFUcmFjay5sYWJlbCArIFwiXFxcIlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB2VHJhY2tzID0gcy5nZXRWaWRlb1RyYWNrcygpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdlRyYWNrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IHZUcmFjayA9IHZUcmFja3NbaV07XHJcbiAgICAgICAgICBjb25zb2xlLmluZm8oXCJUcmFjayB2aWRlbyBpbmZvOiBpZDogXCIgKyB2VHJhY2suaWQgKyBcIiBraW5kOiBcIiArIHZUcmFjay5raW5kICsgXCIgbGFiZWw6IFwiICsgdlRyYWNrLmxhYmVsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5tZWRpYVN0cmVhbSA9IHRoaXMuY29udGV4dC5jcmVhdGVNZWRpYVN0cmVhbVNvdXJjZShzKTtcclxuICAgICAgICAvLyBzdHJlYW0gY2hhbm5lbCBjb3VudCAoIGlzIGFsd2F5cyAyICEpXHJcbiAgICAgICAgbGV0IHN0cmVhbUNoYW5uZWxDb3VudDogbnVtYmVyID0gdGhpcy5tZWRpYVN0cmVhbS5jaGFubmVsQ291bnQ7XHJcblxyXG4gICAgICAgIC8vIGlzIG5vdCBzZXQhIVxyXG4gICAgICAgIC8vdGhpcy5jdXJyZW50U2FtcGxlUmF0ZSA9IHRoaXMubWVkaWFTdHJlYW0uc2FtcGxlUmF0ZTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRTYW1wbGVSYXRlID0gdGhpcy5jb250ZXh0LnNhbXBsZVJhdGU7XHJcbiAgICAgICAgY29uc29sZS5pbmZvKFwiU291cmNlIGF1ZGlvIG5vZGU6IGNoYW5uZWxzOiBcIiArIHN0cmVhbUNoYW5uZWxDb3VudCArIFwiIHNhbXBsZXJhdGU6IFwiICsgdGhpcy5jdXJyZW50U2FtcGxlUmF0ZSk7XHJcbiAgICAgICAgaWYgKHRoaXMuYXVkaW9PdXRTdHJlYW0pIHtcclxuICAgICAgICAgIHRoaXMuYXVkaW9PdXRTdHJlYW0uc2V0Rm9ybWF0KHRoaXMuY2hhbm5lbENvdW50LCB0aGlzLmN1cnJlbnRTYW1wbGVSYXRlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVzNDICAtPiBuZXcgbmFtZSBpcyBjcmVhdGVTY3JpcHRQcm9jZXNzb3JcclxuICAgICAgICAvL1xyXG4gICAgICAgIC8vIFRPRE8gQWdhaW4gZGVwcmVjYXRlZCwgYnV0IEF1ZGlvV29ya2VyIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gc3RhYmxlIHJlbGVhc2VzIChKdW5lIDIwMTYpXHJcbiAgICAgICAgLy8gQXVkaW9Xb3JrZXIgaXMgbm93IEF1ZGlvV29ya2xldFByb2Nlc3NvciAuLi4gKE1heSAyMDE3KVxyXG5cclxuICAgICAgLy8gVXBkYXRlIDEyLTIwMjA6XHJcbiAgICAgICAvLyBUaGUgU2NyaXB0UHJvY2Vzc29yTm9kZSBJbnRlcmZhY2UgLSBERVBSRUNBVEVEXHJcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRleHQuY3JlYXRlU2NyaXB0UHJvY2Vzc29yKSB7XHJcbiAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJBdWRpbyBzY3JpcHQgcHJvY2Vzc29yIE5PVCBpbXBsZW1lbnRlZC5cIilcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIFRoZSBTY3JpcHRQcm9jZXNzb3JOb2RlIEludGVyZmFjZSAtIERFUFJFQ0FURURcclxuICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkF1ZGlvIHNjcmlwdCBwcm9jZXNzb3IgaW1wbGVtZW50ZWQhIVwiKTtcclxuXHJcbiAgICAgICAgICAvLyBUT0RPIHNob3VsZCB3ZSB1c2Ugc3RyZWFtQ2hhbm5lbENvdW50IG9yIGNoYW5uZWxDb3VudCBoZXJlID9cclxuICAgICAgICAgIHRoaXMuYnVmZmVyaW5nTm9kZSA9IHRoaXMuY29udGV4dC5jcmVhdGVTY3JpcHRQcm9jZXNzb3IoQXVkaW9DYXB0dXJlLkJVRkZFUl9TSVpFLCBzdHJlYW1DaGFubmVsQ291bnQsIHN0cmVhbUNoYW5uZWxDb3VudCk7XHJcbiAgICAgICAgICBsZXQgYyA9IDA7XHJcbiAgICAgICAgICB0aGlzLmJ1ZmZlcmluZ05vZGUub25hdWRpb3Byb2Nlc3MgPSAoZTogQXVkaW9Qcm9jZXNzaW5nRXZlbnQpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNhcHR1cmluZykge1xyXG4gICAgICAgICAgICAgIC8vIFRPRE8gdXNlIGNoQ250XHJcbiAgICAgICAgICAgICAgbGV0IGluQnVmZmVyID0gZS5pbnB1dEJ1ZmZlcjtcclxuICAgICAgICAgICAgICBsZXQgZHVyYXRpb24gPSBpbkJ1ZmZlci5kdXJhdGlvbjtcclxuICAgICAgICAgICAgICAvLyBvbmx5IHByb2Nlc3MgcmVxdWVzdGVkIGNvdW50IG9mIGNoYW5uZWxzXHJcbiAgICAgICAgICAgICAgbGV0IGN1cnJlbnRCdWZmZXJzID0gbmV3IEFycmF5PEZsb2F0MzJBcnJheT4oY2hhbm5lbENvdW50KTtcclxuICAgICAgICAgICAgICBmb3IgKGxldCBjaDogbnVtYmVyID0gMDsgY2ggPCBjaGFubmVsQ291bnQ7IGNoKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCBjaFNhbXBsZXMgPSBpbkJ1ZmZlci5nZXRDaGFubmVsRGF0YShjaCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgY2hTYW1wbGVzQ29weSA9IGNoU2FtcGxlcy5zbGljZSgwKTtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRCdWZmZXJzW2NoXSA9IGNoU2FtcGxlc0NvcHkuc2xpY2UoMCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFbY2hdLnB1c2goY2hTYW1wbGVzQ29weSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmZyYW1lc1JlY29yZGVkICs9IGNoU2FtcGxlc0NvcHkubGVuZ3RoO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBjKys7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuYXVkaW9PdXRTdHJlYW0pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9PdXRTdHJlYW0ud3JpdGUoY3VycmVudEJ1ZmZlcnMpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9vcGVuZWQ9dHJ1ZTtcclxuICAgICAgICBpZiAodGhpcy5saXN0ZW5lcikge1xyXG5cclxuICAgICAgICAgIHRoaXMubGlzdGVuZXIub3BlbmVkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCAoZSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSArIFwiIEVycm9yIG5hbWU6IFwiICtlLm5hbWUpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5saXN0ZW5lcikge1xyXG4gICAgICAgICAgaWYoJ05vdEFsbG93ZWRFcnJvcicgPT09IGUubmFtZSl7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZXJyb3IoJ05vdCBhbGxvd2VkIHRvIHVzZSB5b3VyIG1pY3JvcGhvbmUuJywnUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IG1pY3JvcGhvbmUgYWNjZXNzIGlzIGFsbG93ZWQgZm9yIHRoaXMgd2ViIHBhZ2UgYW5kIHJlbG9hZCB0aGUgcGFnZS4nKTtcclxuICAgICAgICAgIH1lbHNlIGlmKCdOb3RSZWFkYWJsZUVycm9yJyA9PT0gZS5uYW1lKXtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lcnJvcignQ291bGQgbm90IHJlYWQgZnJvbSB5b3VyIGF1ZGlvIGRldmljZS4nLCdQbGVhc2UgbWFrZSBzdXJlIHlvdXIgYXVkaW8gZGV2aWNlIGlzIHdvcmtpbmcuJyk7XHJcbiAgICAgICAgICB9ZWxzZSBpZignT3ZlcmNvbnN0cmFpbmVkRXJyb3InID09PSBlLm5hbWUpe1xyXG4gICAgICAgICAgICBsZXQgZU1zZz1lLm1zZz9lLm1zZzonT3ZlcmNvbnN0cmFpbmVkIG1lZGlhIGRldmljZSByZXF1ZXN0IGVycm9yLic7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZXJyb3IoZU1zZyk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVycm9yKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBzdGFydCgpIHtcclxuXHJcbiAgICB0aGlzLmluaXREYXRhKCk7XHJcbiAgICBpZiAodGhpcy5hdWRpb091dFN0cmVhbSkge1xyXG4gICAgICB0aGlzLmF1ZGlvT3V0U3RyZWFtLm5leHRTdHJlYW0oKVxyXG4gICAgfVxyXG4gICAgdGhpcy5jYXB0dXJpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5tZWRpYVN0cmVhbS5jb25uZWN0KHRoaXMuYnVmZmVyaW5nTm9kZSk7XHJcbiAgICB0aGlzLmJ1ZmZlcmluZ05vZGUuY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pO1xyXG4gICAgaWYgKHRoaXMubGlzdGVuZXIpIHtcclxuICAgICAgdGhpcy5saXN0ZW5lci5zdGFydGVkKCk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgc3RvcCgpIHtcclxuXHJcbiAgICBpZiAodGhpcy5kaXNjb25uZWN0U3RyZWFtcykge1xyXG4gICAgICB0aGlzLm1lZGlhU3RyZWFtLmRpc2Nvbm5lY3QodGhpcy5idWZmZXJpbmdOb2RlKTtcclxuICAgICAgdGhpcy5idWZmZXJpbmdOb2RlLmRpc2Nvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5hdWRpb091dFN0cmVhbSkge1xyXG4gICAgICB0aGlzLmF1ZGlvT3V0U3RyZWFtLmZsdXNoKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNhcHR1cmluZyA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMubGlzdGVuZXIpIHtcclxuICAgICAgdGhpcy5saXN0ZW5lci5zdG9wcGVkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgY2xvc2UoKSB7XHJcbiAgICB0aGlzLm1lZGlhU3RyZWFtLmRpc2Nvbm5lY3QoKTtcclxuICAgIGlmICh0aGlzLnN0cmVhbSkge1xyXG4gICAgICAvL3RoaXMuc3RyZWFtLnN0b3AoKTtcclxuICAgICAgLy8nTWVkaWFTdHJlYW0uc3RvcCgpJyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gTTQ3LCBhcm91bmQgTm92ZW1iZXIgMjAxNS4gUGxlYXNlIHVzZSAnTWVkaWFTdHJlYW0uYWN0aXZlJyBpbnN0ZWFkLlxyXG4gICAgICAvL3RoaXMuc3RyZWFtLmFjdGl2ZT1mYWxzZTtcclxuICAgICAgdmFyIG10cyA9IHRoaXMuc3RyZWFtLmdldFRyYWNrcygpO1xyXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG10cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIG10c1tpXS5zdG9wKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRoaXMuX29wZW5lZD1mYWxzZTtcclxuICB9XHJcblxyXG4gIGF1ZGlvQnVmZmVyKCk6IEF1ZGlvQnVmZmVyIHtcclxuICAgIHZhciBmcmFtZUxlbjogbnVtYmVyID0gMDtcclxuICAgIHZhciBjaDBEYXRhID0gdGhpcy5kYXRhWzBdO1xyXG5cclxuICAgIGZvciAodmFyIGNoMENoayBvZiBjaDBEYXRhKSB7XHJcbiAgICAgIGZyYW1lTGVuICs9IGNoMENoay5sZW5ndGg7XHJcbiAgICB9XHJcbiAgICB2YXIgYWIgPSB0aGlzLmNvbnRleHQuY3JlYXRlQnVmZmVyKHRoaXMuY2hhbm5lbENvdW50LCBmcmFtZUxlbiwgdGhpcy5jb250ZXh0LnNhbXBsZVJhdGUpO1xyXG4gICAgZm9yICh2YXIgY2ggPSAwOyBjaCA8IHRoaXMuY2hhbm5lbENvdW50OyBjaCsrKSB7XHJcblxyXG4gICAgICB2YXIgY2hEID0gYWIuZ2V0Q2hhbm5lbERhdGEoY2gpO1xyXG4gICAgICB2YXIgcG9zID0gMDtcclxuICAgICAgZm9yICh2YXIgY2hDaGsgb2YgdGhpcy5kYXRhW2NoXSkge1xyXG4gICAgICAgIHZhciBidWZMZW4gPSBjaENoay5sZW5ndGg7XHJcbiAgICAgICAgY2hELnNldChjaENoaywgcG9zKTtcclxuICAgICAgICBwb3MgKz0gYnVmTGVuO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYWI7XHJcbiAgfVxyXG59XHJcblxyXG4iXX0=
|
|
544
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwdHVyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9hdWRpby9jYXB0dXJlL2NhcHR1cmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRSxPQUFPLEVBQXdCLFFBQVEsSUFBSSxXQUFXLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUdwRyxNQUFNLENBQUMsTUFBTSwwQ0FBMEMsR0FBQyxLQUFLLENBQUM7QUFFOUQsTUFBTSxpQkFBaUIsR0FBQyxDQUFDLENBQUM7QUFFMUIsTUFBTSxvQkFBb0IsR0FBQyxJQUFJLENBQUM7QUFFaEMsc0NBQXNDO0FBQ3RDLHdEQUF3RDtBQUN4RCxNQUFNLE1BQU0sR0FBQyx5RUFBeUU7SUFDbEYsSUFBSTtJQUNKLDJCQUEyQjtJQUMzQiw4QkFBOEI7SUFDOUIscUVBQXFFO0lBQ3JFLG9CQUFvQjtJQUNwQixvQkFBb0I7SUFDcEIseUJBQXlCO0lBQ3pCLHVCQUF1QjtJQUN2QixvQkFBb0I7SUFDcEIsSUFBSTtJQUNKLFNBQVM7SUFDVCxJQUFJO0lBQ0osYUFBYTtJQUNiLGlCQUFpQjtJQUNqQixrQkFBa0I7SUFDbEIsb0JBQW9CO0lBQ3BCLFFBQVE7SUFDUixJQUFJO0lBQ0oscUNBQXFDO0lBQ3JDLDRCQUE0QjtJQUM1Qix3QkFBd0I7SUFDeEIsNkJBQTZCO0lBQzdCLDBCQUEwQjtJQUMxQixvQ0FBb0M7SUFDcEMsMENBQTBDO0lBQzFDLG9DQUFvQztJQUNwQyx5Q0FBeUM7SUFDekMsMkNBQTJDO0lBQzNDLHVEQUF1RDtJQUN2RCxjQUFjO0lBQ2QsVUFBVTtJQUNWLGlFQUFpRTtJQUNqRSxtREFBbUQ7SUFDbkQsK0JBQStCO0lBQy9CLDJEQUEyRDtJQUMzRCw0RUFBNEU7SUFDNUUsb0NBQW9DO0lB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QyxDQUFDO1FBQ3pCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFM0IsS0FBSyxJQUFJLE1BQU0sSUFBSSxPQUFPLEVBQUU7WUFDMUIsUUFBUSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUM7U0FDM0I7UUFDRCxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3pGLEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsRUFBRSxFQUFFO1lBRTdDLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDO1lBQ1osS0FBSyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUMvQixJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO2dCQUMxQixHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDcEIsR0FBRyxJQUFJLE1BQU0sQ0FBQzthQUNmO1NBQ0Y7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7O0FBcmdCTSx3QkFBVyxHQUFXLElBQUksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7U2VxdWVuY2VBdWRpb0Zsb2F0MzJPdXRTdHJlYW19IGZyb20gXCIuLi9pby9zdHJlYW1cIjtcclxuaW1wb3J0IHtCcm93c2VyLCBQbGF0Zm9ybSwgVXNlckFnZW50QnVpbGRlcn0gZnJvbSBcIi4uLy4uL3V0aWxzL3VhLXBhcnNlclwiO1xyXG5cclxuaW1wb3J0IHtBdXRvR2FpbkNvbnRyb2xDb25maWcsIFBsYXRmb3JtIGFzIENmZ1BsYXRmb3JtfSBmcm9tIFwiLi4vLi4vc3BlZWNocmVjb3JkZXIvcHJvamVjdC9wcm9qZWN0XCI7XHJcblxyXG5cclxuZXhwb3J0IGNvbnN0IENIUk9NRV9BQ1RJVkFURV9FQ0hPX0NBTkNFTExBVElPTl9XSVRIX0FHQz1mYWxzZTtcclxuXHJcbmNvbnN0IERFQlVHX1RSQUNFX0xFVkVMPTA7XHJcblxyXG5jb25zdCBFTkFCTEVfQVVESU9fV09SS0xFVD10cnVlO1xyXG5cclxuLy8gU3VwZXIgZGlydHkgd2F5IHRvIGxvYWQgdGhpcyBtb2R1bGVcclxuLy8gQ29weSBjb250ZW50IG9mIGludGVyY2VwdG9yX3dvcmtsZXQuanMgdG8gdGhpcyBzdHJpbmdcclxuY29uc3QgYXdwU3RyPVwiY2xhc3MgQXVkaW9DYXB0dXJlSW50ZXJjZXB0b3JQcm9jZXNzb3IgZXh0ZW5kcyBBdWRpb1dvcmtsZXRQcm9jZXNzb3J7XFxuXCIgK1xyXG4gICAgXCJcXG5cIiArXHJcbiAgICBcIiAgICBCVUZGRVJfUVVBTlRVTVM9NjQ7XFxuXCIgK1xyXG4gICAgXCIgICAgUVVBTlRVTV9GUkFNRV9MRU49MTI4O1xcblwiICtcclxuICAgIFwiICAgIEJVRkZFUl9GUkFNRV9MRU49dGhpcy5RVUFOVFVNX0ZSQU1FX0xFTip0aGlzLkJVRkZFUl9RVUFOVFVNUztcXG5cIiArXHJcbiAgICBcIiAgICBidWZmZXI9bnVsbDtcXG5cIiArXHJcbiAgICBcIiAgICBidWZmZXJQb3M9MDtcXG5cIiArXHJcbiAgICBcIiAgICBidWZmZXJQb3NCeXRlcz0wO1xcblwiICtcclxuICAgIFwiICAgIGNvbnN0cnVjdG9yKCkge1xcblwiICtcclxuICAgIFwiICAgICAgICBzdXBlcigpO1xcblwiICtcclxuICAgIFwiXFxuXCIgK1xyXG4gICAgXCIgICAgfVxcblwiICtcclxuICAgIFwiXFxuXCIgK1xyXG4gICAgXCIgcHJvY2VzcyhcXG5cIiArXHJcbiAgICBcIiAgICAgIGlucHV0cyxcXG5cIiArXHJcbiAgICBcIiAgICAgIG91dHB1dHMsXFxuXCIgK1xyXG4gICAgXCIgICAgICBwYXJhbWV0ZXJzXFxuXCIgK1xyXG4gICAgXCIgICl7XFxuXCIgK1xyXG4gICAgXCJcXG5cIiArXHJcbiAgICBcIiAgICAgbGV0IGlucHV0c0NudD1pbnB1dHMubGVuZ3RoO1xcblwiICtcclxuICAgIFwiICAgICBsZXQgY2hhbm5lbENvdW50PTA7XFxuXCIgK1xyXG4gICAgXCIgICAgIGxldCBpbnB1dExlbj0wO1xcblwiICtcclxuICAgIFwiICAgICBsZXQgaW5wdXRMZW5CeXRlcz0wO1xcblwiICtcclxuICAgIFwiICAgICBpZihpbnB1dHNDbnQ+MCkge1xcblwiICtcclxuICAgIFwiICAgICAgICAgbGV0IGlucHV0MCA9IGlucHV0c1swXTtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIGNoYW5uZWxDb3VudCA9IGlucHV0MC5sZW5ndGg7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICBpZiAoY2hhbm5lbENvdW50ID4gMCkge1xcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIGxldCBpbnB1dDBjaDA9aW5wdXQwWzBdO1xcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIGlucHV0TGVuPWlucHV0MGNoMC5sZW5ndGg7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgaW5wdXRMZW5CeXRlcz1pbnB1dDBjaDAuYnVmZmVyLmxlbmd0aDtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIH1cXG5cIiArXHJcbiAgICBcIiAgICAgfVxcblwiICtcclxuICAgIFwiICAgICBpZiAoIXRoaXMuYnVmZmVyIHx8IHRoaXMuYnVmZmVyLmxlbmd0aCA8IGNoYW5uZWxDb3VudCkge1xcblwiICtcclxuICAgIFwiICAgICAgICAgdGhpcy5idWZmZXIgPSBuZXcgQXJyYXkoY2hhbm5lbENvdW50KTtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIHRoaXMuYnVmZmVyUG9zID0gMFxcblwiICtcclxuICAgIFwiICAgICAgICAgZm9yIChsZXQgYmNoID0gMDsgYmNoIDwgY2hhbm5lbENvdW50OyBiY2grKykge1xcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIHRoaXMuYnVmZmVyW2JjaF0gPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuQlVGRkVSX0ZSQU1FX0xFTik7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgdGhpcy5idWZmZXJQb3MgPSAwO1xcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIHRoaXMuYnVmZmVyUG9zQnl0ZXM9MDtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIH1cXG5cIiArXHJcbiAgICBcIiAgICAgfVxcblwiICtcclxuICAgIFwiICAgICBsZXQgYnVmQXZhaWwgPSB0aGlzLkJVRkZFUl9GUkFNRV9MRU4gLSB0aGlzLmJ1ZmZlclBvcztcXG5cIiArXHJcbiAgICBcIiAgICAgLy8gY2hlY2sgaWYgYnVmZmVyIGhhcyB0byBiZSB0cmFuc2ZlcnJlZFxcblwiICtcclxuICAgIFwiICAgICBpZiAoaW5wdXRMZW4gPiBidWZBdmFpbCkge1xcblwiICtcclxuICAgIFwiICAgICAgICAgbGV0IGFkYT1uZXcgQXJyYXkoY2hhbm5lbENvdW50KTtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaGFubmVsQ291bnQ7IGNoKyspIHtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICBhZGFbY2hdPXRoaXMuYnVmZmVyW2NoXS5idWZmZXIuc2xpY2UoMCk7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICB9XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2Uoe1xcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIGRhdGE6IGFkYSxcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICBjaHM6IGNoYW5uZWxDb3VudCxcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICBsZW46IHRoaXMuYnVmZmVyUG9zXFxuXCIgK1xyXG4gICAgXCIgICAgICAgICB9LCBhZGEpO1xcblwiICtcclxuICAgIFwiICAgICAgICAgLy8gYnVmZmVyIHRyYW5zZmVycmVkLCByZXNldFxcblwiICtcclxuICAgIFwiICAgICAgICAgdGhpcy5idWZmZXJQb3MgPSAwO1xcblwiICtcclxuICAgIFwiICAgICAgICAgdGhpcy5idWZmZXJQb3NCeXRlcz0wO1xcblwiICtcclxuICAgIFwiICAgICB9XFxuXCIgK1xyXG4gICAgXCJcXG5cIiArXHJcbiAgICBcIiAgICAgZm9yKGxldCBpaT0wO2lpPGlucHV0c0NudDtpaSsrKSB7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgY2hhbm5lbENvdW50OyBjaCsrKSB7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgLy8gTXV0ZSBvdXRwdXRzXFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgLy9vdXRwdXRzW2lpXVtjaF0uZmlsbCgwKTtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICBsZXQgY2hTYW1wbGVzID0gaW5wdXRzW2lpXVtjaF07XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgdGhpcy5idWZmZXJbY2hdLnNldChjaFNhbXBsZXMsdGhpcy5idWZmZXJQb3MpO1xcblwiICtcclxuICAgIFwiICAgICAgICAgfVxcblwiICtcclxuICAgIFwiICAgICAgICAgdGhpcy5idWZmZXJQb3MrPWlucHV0TGVuO1xcblwiICtcclxuICAgIFwiICAgICAgICAgdGhpcy5idWZmZXJQb3NCeXRlcys9aW5wdXRMZW5CeXRlcztcXG5cIiArXHJcbiAgICBcIiAgICAgfVxcblwiICtcclxuICAgIFwiICAgIFxcblwiICtcclxuICAgIFwiICAgICByZXR1cm4gdHJ1ZTtcXG5cIiArXHJcbiAgICBcIiAgfVxcblwiICtcclxuICAgIFwifVxcblwiICtcclxuICAgIFwiXFxuXCIgK1xyXG4gICAgXCJyZWdpc3RlclByb2Nlc3NvcignY2FwdHVyZS1pbnRlcmNlcHRvcicsQXVkaW9DYXB0dXJlSW50ZXJjZXB0b3JQcm9jZXNzb3IpO1xcblwiO1xyXG5cclxuXHJcblxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBdWRpb0NhcHR1cmVMaXN0ZW5lciB7XHJcbiAgb3BlbmVkKCk6IHZvaWQ7XHJcblxyXG4gIHN0YXJ0ZWQoKTogdm9pZDtcclxuXHJcbiAgc3RvcHBlZCgpOiB2b2lkO1xyXG5cclxuICBjbG9zZWQoKTogdm9pZDtcclxuXHJcbiAgZXJyb3IobXNnPzpzdHJpbmcsYWR2aWNlPzpzdHJpbmcpOiB2b2lkO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQXVkaW9DYXB0dXJlIHtcclxuICBnZXQgb3BlbmVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX29wZW5lZDtcclxuICB9XHJcblxyXG4gIHN0YXRpYyBCVUZGRVJfU0laRTogbnVtYmVyID0gODE5MjtcclxuICBjb250ZXh0OiBBdWRpb0NvbnRleHQ7XHJcbiAgc3RyZWFtITogTWVkaWFTdHJlYW07XHJcbiAgY2hhbm5lbENvdW50ITogbnVtYmVyO1xyXG4gIG1lZGlhU3RyZWFtOiBhbnk7XHJcbiAgYWdjU3RhdHVzOmJvb2xlYW58bnVsbD1udWxsO1xyXG4gIGJ1ZmZlcmluZ05vZGU6IEF1ZGlvTm9kZXxudWxsPW51bGw7XHJcbiAgbGlzdGVuZXIhOiBBdWRpb0NhcHR1cmVMaXN0ZW5lcjtcclxuICBkYXRhITogQXJyYXk8QXJyYXk8RmxvYXQzMkFycmF5Pj47XHJcbiAgY3VycmVudFNhbXBsZVJhdGUhOiBudW1iZXI7XHJcbiAgbjogTmF2aWdhdG9yO1xyXG4gIGF1ZGlvT3V0U3RyZWFtOiBTZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbSB8IG51bGw9bnVsbDtcclxuICBwcml2YXRlIGRpc2Nvbm5lY3RTdHJlYW1zID0gdHJ1ZTtcclxuICBwcml2YXRlIF9vcGVuZWQ9ZmFsc2U7XHJcbiAgcHJpdmF0ZSBjYXB0dXJpbmcgPSBmYWxzZTtcclxuXHJcbiAgZnJhbWVzUmVjb3JkZWQ6IG51bWJlcj0wO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBBdWRpb0NvbnRleHQpIHtcclxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XHJcbiAgICB0aGlzLm4gPSBuYXZpZ2F0b3I7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXREYXRhKCkge1xyXG4gICAgdGhpcy5kYXRhID0gbmV3IEFycmF5PEFycmF5PEZsb2F0MzJBcnJheT4+KCk7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2hhbm5lbENvdW50OyBpKyspIHtcclxuICAgICAgdGhpcy5kYXRhLnB1c2gobmV3IEFycmF5PEZsb2F0MzJBcnJheT4oKSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmZyYW1lc1JlY29yZGVkID0gMDtcclxuICB9XHJcblxyXG4gIGxpc3REZXZpY2VzKCkge1xyXG4gICAgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzKCkudGhlbigobDogTWVkaWFEZXZpY2VJbmZvW10pID0+IHRoaXMucHJpbnREZXZpY2VzKGwpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZHVtbXlTZXNzaW9uKCk6UHJvbWlzZTxNZWRpYVN0cmVhbT57XHJcbiAgICAvLyB3b3JrYXJvdW5kIHRvIHJlcXVlc3QgcGVybWlzc2lvbnM6XHJcbiAgICAvLyBTdGFydCBhIGR1bW15IHNlc3Npb25cclxuICAgIGxldCBtZWRpYVN0ckNuc3RycyA9IDxNZWRpYVN0cmVhbUNvbnN0cmFpbnRzPnthdWRpbzpcclxuICAgICAgICB7ZWNob0NhbmNlbGF0aW9uOiBmYWxzZX1cclxuICAgIH07XHJcbiAgICByZXR1cm4gbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEobWVkaWFTdHJDbnN0cnMpO1xyXG5cclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIHN0b3BBbGxTZXNzaW9uVHJhY2tzKG1lZGlhU3RyZWFtOk1lZGlhU3RyZWFtKXtcclxuICAgICAgbGV0IGF0cyA9IG1lZGlhU3RyZWFtLmdldFRyYWNrcygpO1xyXG4gICAgICBmb3IgKGxldCBhdElkeCA9IDA7IGF0SWR4IDwgYXRzLmxlbmd0aDsgYXRJZHgrKykge1xyXG4gICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlN0b3AgZHVtbXkgc2Vzc2lvbiB0cmFjazogI1wiICsgYXRJZHgpXHJcbiAgICAgICAgYXRzW2F0SWR4XS5zdG9wKCk7XHJcbiAgICAgIH1cclxuICB9XHJcblxyXG4gIGRldmljZUluZm9zKGNiOiAoZGV2aWNlSW5mb3M6IE1lZGlhRGV2aWNlSW5mb1tdIHwgbnVsbCkgPT4gYW55LCByZXRyeSA9IHRydWUsZHVtbXlTdHJlYW0/Ok1lZGlhU3RyZWFtKSB7XHJcblxyXG4gICAgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5lbnVtZXJhdGVEZXZpY2VzKCkudGhlbigobDogTWVkaWFEZXZpY2VJbmZvW10pID0+IHtcclxuICAgICAgbGV0IGxhYmVsc0F2YWlsYWJsZSA9IGZhbHNlO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGwubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgZGkgPSBsW2ldO1xyXG4gICAgICAgIGlmIChkaS5sYWJlbCkge1xyXG4gICAgICAgICAgbGFiZWxzQXZhaWxhYmxlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFsYWJlbHNBdmFpbGFibGUpIHtcclxuICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJNZWRpYSBkZXZpY2UgZW51bWVyYXRpb246IE5vIGxhYmVscy5cIilcclxuICAgICAgICBpZiAocmV0cnkpIHtcclxuICAgICAgICAgICAgY29uc29sZS5pbmZvKFwiU3RhcnRpbmcgZHVtbXkgc2Vzc2lvbiB0byByZXF1ZXN0IGF1ZGlvIHBlcm1pc3Npb25zLi4uXCIpXHJcblxyXG4gICAgICAgICAgICB0aGlzLmR1bW15U2Vzc2lvbigpLnRoZW4oKHM6IE1lZGlhU3RyZWFtKSA9PiB7XHJcbiAgICAgICAgICAgIC8vIGFuZCBzdG9wIGl0IGltbWVkaWF0ZWx5XHJcblxyXG4gICAgICAgICAgICBpZihzKSB7XHJcbiAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiR290IGR1bW15IHNlc3Npb24gc3RyZWFtOiBcIiArIHMgKyBcIiAuXCIpXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIk5vIGR1bW15IHN0cmVhbVwiKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIHJldHJ5IChvbmx5IG9uY2UpXHJcbiAgICAgICAgICAgIHRoaXMuZGV2aWNlSW5mb3MoY2IsIGZhbHNlLHMpO1xyXG4gICAgICAgICAgfSxyZWFzb24gPT4ge1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJEdW1teSBzZXNzaW9uIHJlamVjdGVkLlwiKVxyXG4gICAgICAgICAgICAvLyBUT0RPIGVycm9yIGNhbGxiYWNrXHJcbiAgICAgICAgICAgIGNiKG51bGwpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNiKG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBzdWNjZXNzXHJcbiAgICAgICAgY2IobCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYoZHVtbXlTdHJlYW0pe1xyXG4gICAgICAgIHRoaXMuc3RvcEFsbFNlc3Npb25UcmFja3MoZHVtbXlTdHJlYW0pO1xyXG4gICAgICB9XHJcbiAgICB9LChyZWFzb24pPT4ge1xyXG4gICAgICAvL3JlamVjdGVkXHJcbiAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIk1lZGlhIGRldmljZSBlbnVtZXJhdGlvbiByZWplY3RlZC5cIilcclxuICAgICAgaWYgKHJldHJ5KSB7XHJcbiAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiU3RhcnRpbmcgZHVtbXkgc2Vzc2lvbiB0byByZXF1ZXN0IGF1ZGlvIHBlcm1pc3Npb25zLi4uXCIpXHJcbiAgICAgICAgdGhpcy5kdW1teVNlc3Npb24oKS50aGVuKChzOiBNZWRpYVN0cmVhbSkgPT4ge1xyXG4gICAgICAgICAgLy8gYW5kIHN0b3AgaXQgaW1tZWRpYXRlbHlcclxuICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkR1bW15IHNlc3Npb24uXCIpXHJcbiAgICAgICAgICBpZihzKSB7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkdvdCBkdW1teSBzZXNzaW9uIHN0cmVhbTogXCIgKyBzICsgXCIgLlwiKVxyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIk5vIGR1bW15IHN0cmVhbVwiKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgLy8gcmV0cnkgKG9ubHkgb25jZSlcclxuICAgICAgICAgIHRoaXMuZGV2aWNlSW5mb3MoY2IsIGZhbHNlLHMpO1xyXG4gICAgICAgIH0sIHJlYXNvbiA9PiB7XHJcbiAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJEdW1teSBzZXNzaW9uIHJlamVjdGVkLlwiKVxyXG4gICAgICAgICAgLy8gVE9ETyBlcnJvciBjYWxsYmFja1xyXG4gICAgICAgICAgY2IobnVsbCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY2IobnVsbCk7XHJcbiAgICAgIH1cclxuICAgICAgaWYoZHVtbXlTdHJlYW0pe1xyXG4gICAgICAgIHRoaXMuc3RvcEFsbFNlc3Npb25UcmFja3MoZHVtbXlTdHJlYW0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcblxyXG5cclxuICB9XHJcblxyXG5cclxuICBwcmludERldmljZXMobDogTWVkaWFEZXZpY2VJbmZvW10pOiB2b2lkIHtcclxuICAgIGxldCBzZWxEZXZpY2VJZCA9ICdfX19kdW1teV9fXyc7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGwubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGRpID0gbFtpXTtcclxuXHJcbiAgICAgIGNvbnNvbGUubG9nKFwiQXVkaW8gZGV2aWNlOiBJZDogXCIgKyBkaS5kZXZpY2VJZCArIFwiIGdyb3VwSWQ6IFwiICsgZGkuZ3JvdXBJZCArIFwiIGxhYmVsOiBcIiArIGRpLmxhYmVsICsgXCIga2luZDogXCIgKyBkaS5raW5kKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9wZW4oY2hhbm5lbENvdW50OiBudW1iZXIsIHNlbERldmljZUlkPzogQ29uc3RyYWluRE9NU3RyaW5nfHVuZGVmaW5lZCxhdXRvR2FpbkNvbnRyb2xDb25maWdzPzpBcnJheTxBdXRvR2FpbkNvbnRyb2xDb25maWc+fG51bGx8dW5kZWZpbmVkKXtcclxuICAgICAgdGhpcy5jb250ZXh0LnJlc3VtZSgpLnRoZW4oKCk9PntcclxuICAgICAgICB0aGlzLl9vcGVuKGNoYW5uZWxDb3VudCxzZWxEZXZpY2VJZCxhdXRvR2FpbkNvbnRyb2xDb25maWdzKTtcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIF9vcGVuKGNoYW5uZWxDb3VudDogbnVtYmVyLCBzZWxEZXZpY2VJZD86IENvbnN0cmFpbkRPTVN0cmluZ3x1bmRlZmluZWQsYXV0b0dhaW5Db250cm9sQ29uZmlncz86QXJyYXk8QXV0b0dhaW5Db250cm9sQ29uZmlnPnxudWxsfHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5jaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7XHJcbiAgICB0aGlzLmZyYW1lc1JlY29yZGVkID0gMDtcclxuICAgIC8vdmFyIG1zYyA9IG5ldyBBdWRpb1N0cmVhbUNvbnN0cigpO1xyXG4gICAgLy8gdmFyIG1zYz17fTtcclxuICAgIC8vbXNjLnZpZGVvID0gZmFsc2U7XHJcbiAgICAvL21zYy5hdWRpbyA9IHRydWU7XHJcblxyXG4gICAgLy8gQ2hyb21lIGFuZCBGaXJlZm94IHN0ZXJlbyBjaGFubmVscyBhcmUgaWRlbnRpY2FsICEhXHJcbiAgICAvLyBBbmQgZXZlbiB3b3JzZTogVGhlIGRhdGEgY29taW5nIGZyb20gdGhlIHNvdXJjZSBpcyBhbHJlYWR5IHByZXByb2Nlc3NlZCBvbiBGRiBhbmQgQ2hyb21lLiBJdCBjb250YWlucyBEU1AgYXJ0aWZhY3RzISFcclxuXHJcbiAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zODc3MzdcclxuICAgIC8vIFRoZSB3b3JrYXJvdW5kIHRvIHNldCB0aGVzZSBjb25zdHJhaW50cyBkb2VzIF9OT1RfIGhlbHA6XHJcbiAgICAvL3ZhciBtc2M9e2F1ZGlvOiB7ZWNob0NhbmNlbGxhdGlvbjogZmFsc2UsY2hhbm5lbENvdW50OiAyLCBnb29nQXVkaW9NaXJyb3Jpbmc6IGZhbHNlfSx2aWRlbzogZmFsc2V9O1xyXG5cclxuICAgIC8vIFNhZmFyaSBhdCBsZWFzdCB2ZXJzaW9uIDExOiBTdXBwb3J0IGZvciBtZWRpYSBzdHJlYW1zXHJcbiAgICAvLyBUT0RPIHRlc3QgaWYgaW5wdXQgaXMgdW5wcm9jZXNzZWRcclxuXHJcbiAgICBsZXQgbXNjOk1lZGlhU3RyZWFtQ29uc3RyYWludHM7XHJcbiAgICBjb25zb2xlLmluZm8oJ1VzZXIgYWdlbnQ6ICcrbmF2aWdhdG9yLnVzZXJBZ2VudCk7XHJcblxyXG5cclxuICAgICAgbGV0IHVhPVVzZXJBZ2VudEJ1aWxkZXIudXNlckFnZW50KCk7XHJcblxyXG4gICAgICAvLyB1YS5jb21wb25lbnRzLmZvckVhY2goKGMpPT57XHJcbiAgICAgIC8vICAgY29uc29sZS5pbmZvKFwiVUFfQ29tcDogXCIrYy50b1N0cmluZygpKTtcclxuICAgICAgLy8gfSlcclxuXHJcbiAgICAgbGV0IGFnY0NmZzpBdXRvR2FpbkNvbnRyb2xDb25maWd8bnVsbD1udWxsO1xyXG5cclxuICAgIGxldCBhdXRvR2FpbkNvbnRyb2w9ZmFsc2U7XHJcbiAgICBsZXQgY2hyb21lRWNob0NhbmNlbGxhdGlvbj1mYWxzZTtcclxuICAgIGlmKGF1dG9HYWluQ29udHJvbENvbmZpZ3Mpe1xyXG4gICAgICBmb3IobGV0IGFnY2Mgb2YgYXV0b0dhaW5Db250cm9sQ29uZmlncyl7XHJcbiAgICAgICAgaWYoYWdjYy5wbGF0Zm9ybT09PUNmZ1BsYXRmb3JtLkFuZHJvaWQgJiYgdWEuZGV0ZWN0ZWRQbGF0Zm9ybT09PVBsYXRmb3JtLkFuZHJvaWQpe1xyXG4gICAgICAgICAgICBhZ2NDZmc9YWdjYztcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGFnY2MucGxhdGZvcm09PT1DZmdQbGF0Zm9ybS5XaW5kb3dzICYmIHVhLmRldGVjdGVkUGxhdGZvcm09PT1QbGF0Zm9ybS5XaW5kb3dzKXtcclxuICAgICAgICAgIGFnY0NmZz1hZ2NjO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmKGFnY0NmZyl7XHJcbiAgICAgICAgLy8gVE9ETyB1c2UgRVhBQ1QvSURFQUwgY29uc3RyYWludFxyXG4gICAgICAgIGF1dG9HYWluQ29udHJvbD1hZ2NDZmcudmFsdWU7XHJcbiAgICAgICAgaWYoQ0hST01FX0FDVElWQVRFX0VDSE9fQ0FOQ0VMTEFUSU9OX1dJVEhfQUdDKXtcclxuICAgICAgICAgIGNocm9tZUVjaG9DYW5jZWxsYXRpb249YWdjQ2ZnLnZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBUT0RPIHF1ZXJ5IHJlYWwgQUdDIHN0YXR1c1xyXG4gICAgICAgIHRoaXMuYWdjU3RhdHVzPWFnY0NmZy52YWx1ZTtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgdGhpcy5hZ2NTdGF0dXM9ZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBkZWZhdWx0XHJcbiAgICBtc2MgPSB7XHJcbiAgICAgIGF1ZGlvOiB7XHJcbiAgICAgICAgZGV2aWNlSWQ6IHNlbERldmljZUlkLFxyXG4gICAgICAgIGVjaG9DYW5jZWxsYXRpb246IGZhbHNlLFxyXG4gICAgICAgIGNoYW5uZWxDb3VudDogY2hhbm5lbENvdW50LFxyXG4gICAgICAgIGF1dG9HYWluQ29udHJvbDogYXV0b0dhaW5Db250cm9sXHJcbiAgICAgIH0sXHJcbiAgICAgIHZpZGVvOiBmYWxzZVxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodWEuZGV0ZWN0ZWRCcm93c2VyPT09QnJvd3Nlci5FZGdlKSB7XHJcblxyXG4gICAgICAvLyBNaWNyb3NvZnQgRWRnZSBzZW5kcyB1bm1vZGlmaWVkIGF1ZGlvXHJcbiAgICAgIC8vIFRoZSBjb25zdHJhaW50IGNhbiBmb2xsb3cgdGhlIHNwZWNpZmljYXRpb25cclxuICAgICAgY29uc29sZS5pbmZvKFwiU2V0dGluZyBtZWRpYSB0cmFjayBjb25zdHJhaW50cyBmb3IgTWljcm9zb2Z0IEVkZ2UuXCIpO1xyXG4gICAgICBtc2MgPSB7XHJcbiAgICAgICAgYXVkaW86IHtcclxuICAgICAgICAgIGRldmljZUlkOiBzZWxEZXZpY2VJZCxcclxuICAgICAgICAgIGVjaG9DYW5jZWxsYXRpb246IGZhbHNlLFxyXG4gICAgICAgICAgY2hhbm5lbENvdW50OiBjaGFubmVsQ291bnQsXHJcbiAgICAgICAgICBhdXRvR2FpbkNvbnRyb2w6IGF1dG9HYWluQ29udHJvbFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdmlkZW86IGZhbHNlXHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2UgaWYgKHVhLmRldGVjdGVkQnJvd3Nlcj09PUJyb3dzZXIuQ2hyb21lKSB7XHJcbiAgICAgIC8vIEdvb2dsZSBDaHJvbWU6IHdlIG5lZWQgdG8gc3dpdGNoIG9mIGVhY2ggb2YgdGhlIHByZXByb2Nlc3NpbmcgdW5pdHMgaW5jbHVkaW5nIHRoZVxyXG4gICAgICBjb25zb2xlLmluZm8oXCJTZXR0aW5nIG1lZGlhIHRyYWNrIGNvbnN0cmFpbnRzIGZvciBHb29nbGUgQ2hyb21lLlwiKTtcclxuXHJcbiAgICAgIC8vIENocm9tZSA2MCAtPiA2MSBjaGFuZ2VkXHJcbiAgICAgIC8vIGl0IHdvcmtzIG5vdyB3aXRob3V0IG1hbmRhdG9yeS9vcHRpb25hbCBzdWItb2JqZWN0c1xyXG5cclxuXHJcbiAgICAgIC8vIFJlcXVpcmVzIGF0IGxlYXN0IENocm9tZSA2MVxyXG4gICAgICBtc2MgPSB7XHJcbiAgICAgICAgYXVkaW86IHtcclxuICAgICAgICAgIGRldmljZUlkOiBzZWxEZXZpY2VJZCxcclxuICAgICAgICAgIGNoYW5uZWxDb3VudDogY2hhbm5lbENvdW50LFxyXG4gICAgICAgICAgZWNob0NhbmNlbGxhdGlvbjoge2V4YWN0OmNocm9tZUVjaG9DYW5jZWxsYXRpb259LFxyXG4gICAgICAgICAgYXV0b0dhaW5Db250cm9sOiB7ZXhhY3Q6YXV0b0dhaW5Db250cm9sfSxcclxuICAgICAgICAgIHNhbXBsZVNpemU6e21pbjogMTZ9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdmlkZW86IGZhbHNlLFxyXG4gICAgICB9XHJcblxyXG4gICAgfSBlbHNlIGlmICh1YS5kZXRlY3RlZEJyb3dzZXI9PT1Ccm93c2VyLkZpcmVmb3gpIHtcclxuICAgICAgY29uc29sZS5pbmZvKFwiU2V0dGluZyBtZWRpYSB0cmFjayBjb25zdHJhaW50cyBmb3IgTW96aWxsYSBGaXJlZm94LlwiKTtcclxuICAgICAgLy8gRmlyZWZveFxyXG4gICAgICBtc2MgPSB7XHJcbiAgICAgICAgYXVkaW86IHtcclxuICAgICAgICAgICAgZGV2aWNlSWQ6IHNlbERldmljZUlkLFxyXG4gICAgICAgICAgICBjaGFubmVsQ291bnQ6IGNoYW5uZWxDb3VudCxcclxuICAgICAgICAgIGVjaG9DYW5jZWxsYXRpb246IGZhbHNlLFxyXG4gICAgICAgICAgICBhdXRvR2FpbkNvbnRyb2w6IGF1dG9HYWluQ29udHJvbCxcclxuICAgICAgICAgIG5vaXNlU3VwcHJlc3Npb246IGZhbHNlXHJcbiAgICAgICAgfSxcclxuICAgICAgICB2aWRlbzogZmFsc2UsXHJcbiAgICAgIH1cclxuXHJcbiAgICB9IGVsc2UgaWYgKHVhLmRldGVjdGVkQnJvd3Nlcj09PUJyb3dzZXIuU2FmYXJpKSB7XHJcbiAgICAgIGNvbnNvbGUuaW5mbyhcIlNldHRpbmcgbWVkaWEgdHJhY2sgY29uc3RyYWludHMgZm9yIFNhZmFyaSBicm93c2VyLlwiKVxyXG4gICAgICBjb25zb2xlLmluZm8oXCJBcHBseSB3b3JrYXJvdW5kIGZvciBTYWZhcmk6IEF2b2lkIGRpc2Nvbm5lY3Qgb2Ygc3RyZWFtcy5cIik7XHJcblxyXG4gICAgICB0aGlzLmRpc2Nvbm5lY3RTdHJlYW1zID0gZmFsc2U7XHJcbiAgICAgIG1zYyA9IHtcclxuICAgICAgICBhdWRpbzoge1xyXG4gICAgICAgICAgZGV2aWNlSWQ6IHNlbERldmljZUlkLFxyXG4gICAgICAgICAgY2hhbm5lbENvdW50OiBjaGFubmVsQ291bnQsXHJcbiAgICAgICAgICBlY2hvQ2FuY2VsbGF0aW9uOiBmYWxzZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdmlkZW86IGZhbHNlLFxyXG4gICAgICB9XHJcblxyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIC8vIFRPRE8gZGVmYXVsdCBjb25zdHJhaW50cyBvciBlcnJvciBCcm93c2VyIG5vdCBzdXBwb3J0ZWRcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIGNvbnNvbGUuZGVidWcoXCJBdWRpbyBjYXB0dXJlLCBBR0M6IFwiK3RoaXMuYWdjU3RhdHVzKVxyXG5cclxuXHJcbiAgICBsZXQgdW1wID0gbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEobXNjKTtcclxuICAgIHVtcC50aGVuKChzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zdHJlYW0gPSBzO1xyXG5cclxuICAgICAgICBsZXQgYVRyYWNrcyA9IHMuZ2V0QXVkaW9UcmFja3MoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhVHJhY2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgYVRyYWNrID0gYVRyYWNrc1tpXTtcclxuXHJcbiAgICAgICAgICBjb25zb2xlLmluZm8oXCJUcmFjayBhdWRpbyBpbmZvOiBpZDogXCIgKyBhVHJhY2suaWQgKyBcIiBraW5kOiBcIiArIGFUcmFjay5raW5kICsgXCIgbGFiZWw6IFxcXCJcIiArIGFUcmFjay5sYWJlbCArIFwiXFxcIlwiKTtcclxuICAgICAgICAgIGxldCBtdHJTdHM9YVRyYWNrLmdldFNldHRpbmdzKCk7XHJcbiAgICAgICAgICBjb25zb2xlLmluZm8oXCJUcmFjayBhdWRpbyBzZXR0aW5nczogQ2ggY250OiBcIittdHJTdHMuY2hhbm5lbENvdW50K1wiLCBBR0M6IFwiK210clN0cy5hdXRvR2FpbkNvbnRyb2wrXCIsIEVjaG8gY2FuY2VsbC46IFwiK210clN0cy5lY2hvQ2FuY2VsbGF0aW9uKTtcclxuICAgICAgICAgIGlmKG10clN0cy5hdXRvR2FpbkNvbnRyb2wpe1xyXG4gICAgICAgICAgICB0aGlzLmFnY1N0YXR1cz1tdHJTdHMuYXV0b0dhaW5Db250cm9sO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHZUcmFja3MgPSBzLmdldFZpZGVvVHJhY2tzKCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2VHJhY2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgdlRyYWNrID0gdlRyYWNrc1tpXTtcclxuICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIlRyYWNrIHZpZGVvIGluZm86IGlkOiBcIiArIHZUcmFjay5pZCArIFwiIGtpbmQ6IFwiICsgdlRyYWNrLmtpbmQgKyBcIiBsYWJlbDogXCIgKyB2VHJhY2subGFiZWwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm1lZGlhU3RyZWFtID0gdGhpcy5jb250ZXh0LmNyZWF0ZU1lZGlhU3RyZWFtU291cmNlKHMpO1xyXG4gICAgICAgIC8vIHN0cmVhbSBjaGFubmVsIGNvdW50ICggaXMgYWx3YXlzIDIgISlcclxuICAgICAgICBsZXQgc3RyZWFtQ2hhbm5lbENvdW50OiBudW1iZXIgPSB0aGlzLm1lZGlhU3RyZWFtLmNoYW5uZWxDb3VudDtcclxuICAgICAgICBjb25zb2xlLmluZm8oXCJTdHJlYW0gY2hhbm5lbCBjb3VudDogXCIrc3RyZWFtQ2hhbm5lbENvdW50KTtcclxuICAgICAgICAvLyBpcyBub3Qgc2V0ISFcclxuICAgICAgICAvL3RoaXMuY3VycmVudFNhbXBsZVJhdGUgPSB0aGlzLm1lZGlhU3RyZWFtLnNhbXBsZVJhdGU7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50U2FtcGxlUmF0ZSA9IHRoaXMuY29udGV4dC5zYW1wbGVSYXRlO1xyXG4gICAgICAgIGNvbnNvbGUuaW5mbyhcIlNvdXJjZSBhdWRpbyBub2RlOiBjaGFubmVsczogXCIgKyBzdHJlYW1DaGFubmVsQ291bnQgKyBcIiBzYW1wbGVyYXRlOiBcIiArIHRoaXMuY3VycmVudFNhbXBsZVJhdGUpO1xyXG4gICAgICAgIGlmICh0aGlzLmF1ZGlvT3V0U3RyZWFtKSB7XHJcbiAgICAgICAgICB0aGlzLmF1ZGlvT3V0U3RyZWFtLnNldEZvcm1hdCh0aGlzLmNoYW5uZWxDb3VudCwgdGhpcy5jdXJyZW50U2FtcGxlUmF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFczQyAgLT4gbmV3IG5hbWUgaXMgY3JlYXRlU2NyaXB0UHJvY2Vzc29yXHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyBBZ2FpbiBkZXByZWNhdGVkLCBidXQgQXVkaW9Xb3JrZXIgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBzdGFibGUgcmVsZWFzZXMgKEp1bmUgMjAxNilcclxuICAgICAgICAvLyBBdWRpb1dvcmtlciBpcyBub3cgQXVkaW9Xb3JrbGV0UHJvY2Vzc29yIC4uLiAoTWF5IDIwMTcpXHJcblxyXG4gICAgICAvLyBVcGRhdGUgMTItMjAyMDpcclxuICAgICAgIC8vIFRoZSBTY3JpcHRQcm9jZXNzb3JOb2RlIEludGVyZmFjZSAtIERFUFJFQ0FURURcclxuXHJcbiAgICAgIC8vIFVwZGF0ZSAwNi0yMDIxXHJcbiAgICAgIC8vICBBdWRpb1dvcmtsZXRQcm9jZXNzb3IgaXMgaGVyZSB0byBzdGF5LiBXZWIgQXVkaW8gQVBJIGhhcyBub3cgUmVjb21tZW5kYXRpb24gc3RhdHVzICFcclxuXHJcbiAgICAgICAgICBpZihFTkFCTEVfQVVESU9fV09SS0xFVCAmJiB0aGlzLmNvbnRleHQuYXVkaW9Xb3JrbGV0KXtcclxuICAgICAgICAgICAgLy9jb25zdCB3b3JrbGV0RmlsZU5hbWUgPSAoJ2ZpbGUtbG9hZGVyIS4vaW50ZXJjZXB0b3Jfd29ya2xldC5qcycpO1xyXG4gICAgICAgICAgICAvL2NvbnN0IHdvcmtsZXRGaWxlTmFtZSA9ICdodHRwOi8vbG9jYWxob3N0OjQyMDAvYXNzZXRzL2ludGVyY2VwdG9yX3dvcmtsZXQuanMnO1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKGF3cFN0cik7XHJcbiAgICAgICAgICAgIGxldCBhdWRpb1dvcmtsZXRNb2R1bGVCbG9iPSBuZXcgQmxvYihbYXdwU3RyXSwge3R5cGU6ICd0ZXh0L2phdmFzY3JpcHQnfSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgYXVkaW9Xb3JrbGV0TW9kdWxlQmxvYlVybD13aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTChhdWRpb1dvcmtsZXRNb2R1bGVCbG9iKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5hdWRpb1dvcmtsZXQuYWRkTW9kdWxlKGF1ZGlvV29ya2xldE1vZHVsZUJsb2JVcmwpLnRoZW4oKCk9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGF3biA9IG5ldyBBdWRpb1dvcmtsZXROb2RlKHRoaXMuY29udGV4dCwgJ2NhcHR1cmUtaW50ZXJjZXB0b3InKTtcclxuICAgICAgICAgICAgICAgICAgYXduLm9ucHJvY2Vzc29yZXJyb3I9KGV2OkV2ZW50KT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBtc2c9J1Vua253b24gZXJyb3InO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKGV2IGluc3RhbmNlb2YgRXJyb3JFdmVudCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICBtc2c9ZXYubWVzc2FnZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkNhcHR1cmUgYXVkaW8gd29ya2xldCBlcnJvcjogXCIrbXNnKTtcclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmxpc3RlbmVyKXtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZXJyb3IobXNnKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgbGV0IGF3blB0ID0gYXduLnBvcnQ7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChhd25QdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3blB0Lm9ubWVzc2FnZSA9IChldjogTWVzc2FnZUV2ZW50PGFueT4pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhcHR1cmluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZHQ9ZXYuZGF0YTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNocyA9IGR0LmNocztcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkYUxlbiA9IGR0LmRhdGEubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihERUJVR19UUkFDRV9MRVZFTD44KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZygnUmVjZWl2ZWQgZGF0YSBmcm9tIHdvcmtsZXQ6ICcgK2NocyArICcgJyArIGR0LmxlbiArJyBEYXRhIGNoczogJythZGFMZW4pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vbGV0IGNodW5rTGVuID0gYWRhTGVuIC8gY2hzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2h1bmtMZW4gPSBhZGFMZW47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaHVuayA9IG5ldyBBcnJheTxGbG9hdDMyQXJyYXk+KGNocyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaHM7IGNoKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhICYmIHRoaXMuZGF0YVtjaF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZGFQb3MgPSBjaCAqIGNodW5rTGVuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZHQuZGF0YVtjaF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZhID0gbmV3IEZsb2F0MzJBcnJheShkdC5kYXRhW2NoXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVtjaF0ucHVzaChmYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rW2NoXSA9IGZhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2Ugc2FtcGxlcyBvZiBjaGFubmVsIDAgdG8gY291bnQgZnJhbWVzIChzYW1wbGVzKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZnJhbWVzUmVjb3JkZWQgKz0gZmEubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoREVCVUdfVFJBQ0VfTEVWRUw+OCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ0NoYW5uZWwgJytjaCsnIGRhdGEgbm90IHNldCEhJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYXVkaW9PdXRTdHJlYW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvT3V0U3RyZWFtLndyaXRlKGNodW5rKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgdGhpcy5idWZmZXJpbmdOb2RlID0gYXduO1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLl9vcGVuZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5saXN0ZW5lcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIub3BlbmVkKCk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKS5jYXRjaCgoZXJyb3I6IGFueSk9PntcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnQ291bGQgbm90IGFkZCBtb2R1bGUgJytlcnJvcik7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIH1lbHNlIGlmKHRoaXMuY29udGV4dC5jcmVhdGVTY3JpcHRQcm9jZXNzb3IpIHtcclxuICAgICAgICAgICAgLy8gVGhlIFNjcmlwdFByb2Nlc3Nvck5vZGUgSW50ZXJmYWNlIC0gREVQUkVDQVRFRCBPbmx5IGFzIGZhbGxiYWNrXHJcbiAgICAgICAgICAgIC8vIFRPRE8gc2hvdWxkIHdlIHVzZSBzdHJlYW1DaGFubmVsQ291bnQgb3IgY2hhbm5lbENvdW50IGhlcmUgP1xyXG4gICAgICAgICAgICBsZXQgc2NyaXB0UHJvY2Vzc29yTm9kZT0gdGhpcy5jb250ZXh0LmNyZWF0ZVNjcmlwdFByb2Nlc3NvcihBdWRpb0NhcHR1cmUuQlVGRkVSX1NJWkUsIHN0cmVhbUNoYW5uZWxDb3VudCwgc3RyZWFtQ2hhbm5lbENvdW50KTtcclxuICAgICAgICAgICAgdGhpcy5idWZmZXJpbmdOb2RlPXNjcmlwdFByb2Nlc3Nvck5vZGU7XHJcbiAgICAgICAgICAgIGxldCBjID0gMDtcclxuICAgICAgICAgICAgaWYoc2NyaXB0UHJvY2Vzc29yTm9kZS5vbmF1ZGlvcHJvY2Vzcyl7XHJcbiAgICAgICAgICAgICAgc2NyaXB0UHJvY2Vzc29yTm9kZS5vbmF1ZGlvcHJvY2VzcyA9IChlOiBBdWRpb1Byb2Nlc3NpbmdFdmVudCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhcHR1cmluZykge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgaW5CdWZmZXIgPSBlLmlucHV0QnVmZmVyO1xyXG4gICAgICAgICAgICAgICAgICBsZXQgZHVyYXRpb24gPSBpbkJ1ZmZlci5kdXJhdGlvbjtcclxuICAgICAgICAgICAgICAgICAgLy8gb25seSBwcm9jZXNzIHJlcXVlc3RlZCBjb3VudCBvZiBjaGFubmVsc1xyXG4gICAgICAgICAgICAgICAgICBsZXQgY3VycmVudEJ1ZmZlcnMgPSBuZXcgQXJyYXk8RmxvYXQzMkFycmF5PihjaGFubmVsQ291bnQpO1xyXG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCBjaDogbnVtYmVyID0gMDsgY2ggPCBjaGFubmVsQ291bnQ7IGNoKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY2hTYW1wbGVzID0gaW5CdWZmZXIuZ2V0Q2hhbm5lbERhdGEoY2gpO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjaFNhbXBsZXNDb3B5ID0gY2hTYW1wbGVzLnNsaWNlKDApO1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCdWZmZXJzW2NoXSA9IGNoU2FtcGxlc0NvcHkuc2xpY2UoMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhW2NoXS5wdXNoKGNoU2FtcGxlc0NvcHkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKERFQlVHX1RSQUNFX0xFVkVMPjgpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcIlByb2Nlc3MgXCIrY2hTYW1wbGVzQ29weS5sZW5ndGgrXCIgc2FtcGxlcy5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZnJhbWVzUmVjb3JkZWQgKz0gY2hTYW1wbGVzQ29weS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgYysrO1xyXG4gICAgICAgICAgICAgICAgICBpZiAodGhpcy5hdWRpb091dFN0cmVhbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXVkaW9PdXRTdHJlYW0ud3JpdGUoY3VycmVudEJ1ZmZlcnMpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICB0aGlzLl9vcGVuZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGlmICh0aGlzLmxpc3RlbmVyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLm9wZW5lZCgpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lcnJvcignQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IGF1ZGlvIHByb2Nlc3NpbmcgKFNjcmlwdFByb2Nlc3Nvci5vbmF1ZGlvcHJvY2VzcyBtZXRob2Qgbm90IGZvdW5kKSEnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZXJyb3IoJ0Jyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBhdWRpbyBwcm9jZXNzaW5nIChuZWl0aGVyIEF1ZGlvV29ya2xldFByb2Nlc3NvciBub3IgU2NyaXB0UHJvY2Vzc29yKSEnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LCAoZSkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihlICsgXCIgRXJyb3IgbmFtZTogXCIgK2UubmFtZSk7XHJcbiAgICAgICAgICBpZiAodGhpcy5saXN0ZW5lcikge1xyXG4gICAgICAgICAgICBpZignTm90QWxsb3dlZEVycm9yJyA9PT0gZS5uYW1lKXtcclxuICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVycm9yKCdOb3QgYWxsb3dlZCB0byB1c2UgeW91ciBtaWNyb3Bob25lLicsJ1BsZWFzZSBtYWtlIHN1cmUgdGhhdCBtaWNyb3Bob25lIGFjY2VzcyBpcyBhbGxvd2VkIGZvciB0aGlzIHdlYiBwYWdlIGFuZCByZWxvYWQgdGhlIHBhZ2UuJyk7XHJcbiAgICAgICAgICAgIH1lbHNlIGlmKCdOb3RSZWFkYWJsZUVycm9yJyA9PT0gZS5uYW1lKXtcclxuICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVycm9yKCdDb3VsZCBub3QgcmVhZCBmcm9tIHlvdXIgYXVkaW8gZGV2aWNlLicsJ1BsZWFzZSBtYWtlIHN1cmUgeW91ciBhdWRpbyBkZXZpY2UgaXMgd29ya2luZy4nKTtcclxuICAgICAgICAgICAgfWVsc2UgaWYoJ092ZXJjb25zdHJhaW5lZEVycm9yJyA9PT0gZS5uYW1lKXtcclxuICAgICAgICAgICAgICBsZXQgZU1zZz1lLm1zZz9lLm1zZzonT3ZlcmNvbnN0cmFpbmVkIG1lZGlhIGRldmljZSByZXF1ZXN0IGVycm9yLic7XHJcbiAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lcnJvcihlTXNnKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVycm9yKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBzdGFydCgpIHtcclxuXHJcbiAgICB0aGlzLmluaXREYXRhKCk7XHJcbiAgICBpZiAodGhpcy5hdWRpb091dFN0cmVhbSkge1xyXG4gICAgICB0aGlzLmF1ZGlvT3V0U3RyZWFtLm5leHRTdHJlYW0oKVxyXG4gICAgfVxyXG4gICAgdGhpcy5jYXB0dXJpbmcgPSB0cnVlO1xyXG4gICAgaWYodGhpcy5idWZmZXJpbmdOb2RlKSB7XHJcbiAgICAgIHRoaXMubWVkaWFTdHJlYW0uY29ubmVjdCh0aGlzLmJ1ZmZlcmluZ05vZGUpO1xyXG4gICAgICB0aGlzLmJ1ZmZlcmluZ05vZGUuY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubGlzdGVuZXIpIHtcclxuICAgICAgdGhpcy5saXN0ZW5lci5zdGFydGVkKCk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgc3RvcCgpIHtcclxuXHJcbiAgICBpZiAodGhpcy5kaXNjb25uZWN0U3RyZWFtcyAmJiB0aGlzLmJ1ZmZlcmluZ05vZGUpIHtcclxuICAgICAgdGhpcy5tZWRpYVN0cmVhbS5kaXNjb25uZWN0KHRoaXMuYnVmZmVyaW5nTm9kZSk7XHJcbiAgICAgIHRoaXMuYnVmZmVyaW5nTm9kZS5kaXNjb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuYXVkaW9PdXRTdHJlYW0pIHtcclxuICAgICAgdGhpcy5hdWRpb091dFN0cmVhbS5mbHVzaCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jYXB0dXJpbmcgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLmxpc3RlbmVyKSB7XHJcbiAgICAgIHRoaXMubGlzdGVuZXIuc3RvcHBlZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGNsb3NlKCkge1xyXG4gICAgdGhpcy5tZWRpYVN0cmVhbS5kaXNjb25uZWN0KCk7XHJcbiAgICBpZiAodGhpcy5zdHJlYW0pIHtcclxuICAgICAgLy90aGlzLnN0cmVhbS5zdG9wKCk7XHJcbiAgICAgIC8vJ01lZGlhU3RyZWFtLnN0b3AoKScgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIE00NywgYXJvdW5kIE5vdmVtYmVyIDIwMTUuIFBsZWFzZSB1c2UgJ01lZGlhU3RyZWFtLmFjdGl2ZScgaW5zdGVhZC5cclxuICAgICAgLy90aGlzLnN0cmVhbS5hY3RpdmU9ZmFsc2U7XHJcbiAgICAgIHZhciBtdHMgPSB0aGlzLnN0cmVhbS5nZXRUcmFja3MoKTtcclxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtdHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBtdHNbaV0uc3RvcCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLl9vcGVuZWQ9ZmFsc2U7XHJcbiAgfVxyXG5cclxuICBhdWRpb0J1ZmZlcigpOiBBdWRpb0J1ZmZlciB7XHJcbiAgICB2YXIgZnJhbWVMZW46IG51bWJlciA9IDA7XHJcbiAgICB2YXIgY2gwRGF0YSA9IHRoaXMuZGF0YVswXTtcclxuXHJcbiAgICBmb3IgKHZhciBjaDBDaGsgb2YgY2gwRGF0YSkge1xyXG4gICAgICBmcmFtZUxlbiArPSBjaDBDaGsubGVuZ3RoO1xyXG4gICAgfVxyXG4gICAgdmFyIGFiID0gdGhpcy5jb250ZXh0LmNyZWF0ZUJ1ZmZlcih0aGlzLmNoYW5uZWxDb3VudCwgZnJhbWVMZW4sIHRoaXMuY29udGV4dC5zYW1wbGVSYXRlKTtcclxuICAgIGZvciAodmFyIGNoID0gMDsgY2ggPCB0aGlzLmNoYW5uZWxDb3VudDsgY2grKykge1xyXG5cclxuICAgICAgdmFyIGNoRCA9IGFiLmdldENoYW5uZWxEYXRhKGNoKTtcclxuICAgICAgdmFyIHBvcyA9IDA7XHJcbiAgICAgIGZvciAodmFyIGNoQ2hrIG9mIHRoaXMuZGF0YVtjaF0pIHtcclxuICAgICAgICB2YXIgYnVmTGVuID0gY2hDaGsubGVuZ3RoO1xyXG4gICAgICAgIGNoRC5zZXQoY2hDaGssIHBvcyk7XHJcbiAgICAgICAgcG9zICs9IGJ1ZkxlbjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGFiO1xyXG4gIH1cclxufVxyXG5cclxuIl19
|