speechrecorderng 3.4.2 → 3.4.4

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.
Files changed (49) hide show
  1. package/esm2020/lib/audio/audio_display.mjs +4 -4
  2. package/esm2020/lib/audio/audio_player.mjs +4 -4
  3. package/esm2020/lib/audio/capture/capture.mjs +119 -105
  4. package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +7 -7
  5. package/esm2020/lib/audio/ui/audio_display_control.mjs +4 -4
  6. package/esm2020/lib/audio/ui/audio_display_scroll_pane.mjs +4 -4
  7. package/esm2020/lib/audio/ui/audiosignal.mjs +4 -4
  8. package/esm2020/lib/audio/ui/container.mjs +4 -4
  9. package/esm2020/lib/audio/ui/livelevel.mjs +4 -4
  10. package/esm2020/lib/audio/ui/scroll_pane_horizontal.mjs +4 -4
  11. package/esm2020/lib/audio/ui/sonagram.mjs +4 -4
  12. package/esm2020/lib/db/inddb.mjs +4 -4
  13. package/esm2020/lib/speechrecorder/project/project.service.mjs +4 -4
  14. package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +4 -4
  15. package/esm2020/lib/speechrecorder/script/script.service.mjs +4 -4
  16. package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +19 -23
  17. package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +2 -1
  18. package/esm2020/lib/speechrecorder/session/controlpanel.mjs +24 -24
  19. package/esm2020/lib/speechrecorder/session/progress.mjs +4 -4
  20. package/esm2020/lib/speechrecorder/session/prompting.mjs +16 -16
  21. package/esm2020/lib/speechrecorder/session/recorder_combi_pane.mjs +4 -4
  22. package/esm2020/lib/speechrecorder/session/recording_list.mjs +4 -4
  23. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +4 -4
  24. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +4 -4
  25. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +4 -4
  26. package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +4 -4
  27. package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +4 -4
  28. package/esm2020/lib/speechrecorder/session/session.service.mjs +4 -4
  29. package/esm2020/lib/speechrecorder/session/session_finished_dialog.mjs +4 -4
  30. package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +4 -4
  31. package/esm2020/lib/speechrecorder/session/warning_bar.mjs +4 -4
  32. package/esm2020/lib/speechrecorder/spruploader.mjs +4 -4
  33. package/esm2020/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +4 -4
  34. package/esm2020/lib/speechrecorderng.component.mjs +4 -4
  35. package/esm2020/lib/speechrecorderng.module.mjs +5 -5
  36. package/esm2020/lib/spr.config.mjs +4 -4
  37. package/esm2020/lib/spr.module.version.mjs +2 -2
  38. package/esm2020/lib/ui/canvas_layer_comp.mjs +4 -4
  39. package/esm2020/lib/ui/message_dialog.mjs +4 -4
  40. package/esm2020/lib/ui/recordingitem_display.mjs +7 -7
  41. package/esm2020/lib/ui/responsive_component.mjs +4 -4
  42. package/esm2020/lib/utils/scrollIntoViewToBottom.mjs +4 -4
  43. package/fesm2015/speechrecorderng.mjs +292 -281
  44. package/fesm2015/speechrecorderng.mjs.map +1 -1
  45. package/fesm2020/speechrecorderng.mjs +292 -281
  46. package/fesm2020/speechrecorderng.mjs.map +1 -1
  47. package/lib/audio/capture/capture.d.ts +2 -0
  48. package/lib/spr.module.version.d.ts +1 -1
  49. package/package.json +14 -14
@@ -246,6 +246,104 @@ export class AudioCapture {
246
246
  console.log("Audio device: Id: " + di.deviceId + " groupId: " + di.groupId + " label: " + di.label + " kind: " + di.kind);
247
247
  }
248
248
  }
249
+ addCaptureInterceptor() {
250
+ const awn = new AudioWorkletNode(this.context, 'capture-interceptor');
251
+ awn.onprocessorerror = (ev) => {
252
+ let msg = 'Unknwon error';
253
+ if (ev instanceof ErrorEvent) {
254
+ msg = ev.message;
255
+ }
256
+ console.error("Capture audio worklet error: " + msg);
257
+ if (this.listener) {
258
+ this.listener.error(msg);
259
+ }
260
+ };
261
+ let awnPt = awn.port;
262
+ if (awnPt) {
263
+ awnPt.onmessage = (ev) => {
264
+ if (this.capturing) {
265
+ let dt = ev.data;
266
+ let chs = dt.chs;
267
+ let adaLen = dt.data.length;
268
+ if (DEBUG_TRACE_LEVEL > 8) {
269
+ console.debug('Received data from worklet: ' + chs + ' ' + dt.len + ' Data chs: ' + adaLen);
270
+ }
271
+ let chunk = new Array(chs);
272
+ const samples = this.framesRecorded * chs;
273
+ if ((AudioStorageType.MEM_ENTIRE_AUTO_NET_CHUNKED === this.audioStorageType || AudioStorageType.MEM_CHUNKED_AUTO_NET_CHUNKED === this.audioStorageType) && this.data && samples > this._maxAutoNetMemStoreSamples) {
274
+ this.data = null;
275
+ }
276
+ //console.debug("Data initialized: "+(this.data!=null));
277
+ for (let ch = 0; ch < chs; ch++) {
278
+ //console.debug("Data ch initialized: "+(this.data !=null && this.data[ch] !=null));
279
+ if (ch < this.channelCount) {
280
+ if (dt.data[ch]) {
281
+ let fa = new Float32Array(dt.data[ch]);
282
+ if (this.data && this.data[ch]) {
283
+ this.data[ch].push(fa);
284
+ }
285
+ chunk[ch] = fa;
286
+ // Use samples of channel 0 to count frames (samples)
287
+ if (ch == 0) {
288
+ this.framesRecorded += fa.length;
289
+ }
290
+ }
291
+ }
292
+ }
293
+ if (this.audioOutStream) {
294
+ try {
295
+ this.audioOutStream.write(chunk);
296
+ // // Random test error:
297
+ // if(Math.random()>0.98) {
298
+ // throw new Error('Test');
299
+ // }
300
+ }
301
+ catch (err) {
302
+ if (err instanceof Error) {
303
+ this.persistError = err;
304
+ }
305
+ else {
306
+ this.persistError = new Error('Error handling recorded audio data');
307
+ }
308
+ console.error("Capture error: " + err);
309
+ try {
310
+ this.stop();
311
+ }
312
+ catch (err2) {
313
+ console.error("Capture next error (ignored): " + err2);
314
+ }
315
+ finally {
316
+ if (this.listener) {
317
+ let errExpl = '';
318
+ if (err instanceof DOMException) {
319
+ errExpl = ': ' + err.name + ': ' + err.message;
320
+ }
321
+ this.listener.error("Could not handle recorded audio data" + errExpl, "Please try to record again.");
322
+ }
323
+ else {
324
+ this.close();
325
+ }
326
+ }
327
+ }
328
+ }
329
+ if (AudioStorageType.DB_CHUNKED === this._audioStorageType && this._persistentAudioStorageTarget) {
330
+ this.store();
331
+ }
332
+ }
333
+ };
334
+ }
335
+ // Tried to fix that Safari does not record the second channel
336
+ // Does not help
337
+ //awn.channelCount=this.channelCount;
338
+ //awn.channelCountMode='explicit';
339
+ //console.debug('Channel count explicitly set to '+this.channelCount);
340
+ this.bufferingNode = awn;
341
+ //this.bufferingNode.channelCount=this.channelCount;
342
+ this._opened = true;
343
+ if (this.listener) {
344
+ this.listener.opened();
345
+ }
346
+ }
249
347
  open(channelCount, selDeviceId, autoGainControlConfigs) {
250
348
  //console.debug("Capture open: ctx state: "+this.context.state);
251
349
  if (this.context.state !== 'running') {
@@ -369,7 +467,7 @@ export class AudioCapture {
369
467
  audio: {
370
468
  deviceId: selDeviceId,
371
469
  channelCount: channelCount,
372
- echoCancellation: false
470
+ //echoCancellation: false
373
471
  },
374
472
  video: false,
375
473
  };
@@ -422,108 +520,21 @@ export class AudioCapture {
422
520
  //const workletFileName = ('file-loader!./interceptor_worklet.js');
423
521
  //const workletFileName = 'http://localhost:4200/assets/interceptor_worklet.js';
424
522
  //console.log(awpStr);
425
- let audioWorkletModuleBlob = new Blob([awpStr], { type: 'text/javascript' });
426
- let audioWorkletModuleBlobUrl = window.URL.createObjectURL(audioWorkletModuleBlob);
427
- this.context.audioWorklet.addModule(audioWorkletModuleBlobUrl).then(() => {
428
- const awn = new AudioWorkletNode(this.context, 'capture-interceptor');
429
- awn.onprocessorerror = (ev) => {
430
- let msg = 'Unknwon error';
431
- if (ev instanceof ErrorEvent) {
432
- msg = ev.message;
433
- }
434
- console.error("Capture audio worklet error: " + msg);
435
- if (this.listener) {
436
- this.listener.error(msg);
437
- }
438
- };
439
- let awnPt = awn.port;
440
- if (awnPt) {
441
- awnPt.onmessage = (ev) => {
442
- if (this.capturing) {
443
- let dt = ev.data;
444
- let chs = dt.chs;
445
- let adaLen = dt.data.length;
446
- if (DEBUG_TRACE_LEVEL > 8) {
447
- console.debug('Received data from worklet: ' + chs + ' ' + dt.len + ' Data chs: ' + adaLen);
448
- }
449
- let chunk = new Array(chs);
450
- const samples = this.framesRecorded * chs;
451
- if ((AudioStorageType.MEM_ENTIRE_AUTO_NET_CHUNKED === this.audioStorageType || AudioStorageType.MEM_CHUNKED_AUTO_NET_CHUNKED === this.audioStorageType) && this.data && samples > this._maxAutoNetMemStoreSamples) {
452
- this.data = null;
453
- }
454
- //console.debug("Data initialized: "+(this.data!=null));
455
- for (let ch = 0; ch < chs; ch++) {
456
- //console.debug("Data ch initialized: "+(this.data !=null && this.data[ch] !=null));
457
- if (ch < this.channelCount) {
458
- if (dt.data[ch]) {
459
- let fa = new Float32Array(dt.data[ch]);
460
- if (this.data && this.data[ch]) {
461
- this.data[ch].push(fa);
462
- }
463
- chunk[ch] = fa;
464
- // Use samples of channel 0 to count frames (samples)
465
- if (ch == 0) {
466
- this.framesRecorded += fa.length;
467
- }
468
- }
469
- }
470
- }
471
- if (this.audioOutStream) {
472
- try {
473
- this.audioOutStream.write(chunk);
474
- // // Random test error:
475
- // if(Math.random()>0.98) {
476
- // throw new Error('Test');
477
- // }
478
- }
479
- catch (err) {
480
- if (err instanceof Error) {
481
- this.persistError = err;
482
- }
483
- else {
484
- this.persistError = new Error('Error handling recorded audio data');
485
- }
486
- console.error("Capture error: " + err);
487
- try {
488
- this.stop();
489
- }
490
- catch (err2) {
491
- console.error("Capture next error (ignored): " + err2);
492
- }
493
- finally {
494
- if (this.listener) {
495
- let errExpl = '';
496
- if (err instanceof DOMException) {
497
- errExpl = ': ' + err.name + ': ' + err.message;
498
- }
499
- this.listener.error("Could not handle recorded audio data" + errExpl, "Please try to record again.");
500
- }
501
- else {
502
- this.close();
503
- }
504
- }
505
- }
506
- }
507
- if (AudioStorageType.DB_CHUNKED === this._audioStorageType && this._persistentAudioStorageTarget) {
508
- this.store();
509
- }
510
- }
511
- };
512
- }
513
- // Tried to fix that Safari does not record the second channel
514
- // Does not help
515
- //awn.channelCount=this.channelCount;
516
- //awn.channelCountMode='explicit';
517
- //console.debug('Channel count explicitly set to '+this.channelCount);
518
- this.bufferingNode = awn;
519
- //this.bufferingNode.channelCount=this.channelCount;
520
- this._opened = true;
521
- if (this.listener) {
522
- this.listener.opened();
523
- }
524
- }).catch((error) => {
525
- console.log('Could not add module ' + error);
526
- });
523
+ if (AudioCapture.captureInterceptorModuleRegistered) {
524
+ // Required capture interceptor module already registered
525
+ this.addCaptureInterceptor();
526
+ }
527
+ else {
528
+ // Register capture interceptor module
529
+ let audioWorkletModuleBlob = new Blob([awpStr], { type: 'text/javascript' });
530
+ let audioWorkletModuleBlobUrl = window.URL.createObjectURL(audioWorkletModuleBlob);
531
+ this.context.audioWorklet.addModule(audioWorkletModuleBlobUrl).then(() => {
532
+ AudioCapture.captureInterceptorModuleRegistered = true;
533
+ this.addCaptureInterceptor();
534
+ }).catch((error) => {
535
+ console.log('Could not add module ' + error);
536
+ });
537
+ }
527
538
  }
528
539
  else if (this.context.createScriptProcessor) {
529
540
  // The ScriptProcessorNode Interface - DEPRECATED Only as fallback
@@ -726,7 +737,9 @@ export class AudioCapture {
726
737
  }
727
738
  }
728
739
  close() {
729
- this.mediaStream.disconnect();
740
+ if (this.mediaStream) {
741
+ this.mediaStream.disconnect();
742
+ }
730
743
  if (this.stream) {
731
744
  const mts = this.stream.getTracks();
732
745
  for (let i = 0; i < mts.length; i++) {
@@ -801,4 +814,5 @@ export class AudioCapture {
801
814
  }
802
815
  AudioCapture.BUFFER_SIZE = 8192;
803
816
  AudioCapture.DEFAULT_MAX_NET_AUTO_MEM_STORE_SAMPLES = 2880000 * 5; // Default 5 minute at 48kHz
804
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwdHVyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9hdWRpby9jYXB0dXJlL2NhcHR1cmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQXlCLFFBQVEsSUFBSSxXQUFXLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUN0SCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDdkMsT0FBTyxFQUFDLG9CQUFvQixFQUErQixNQUFNLHVCQUF1QixDQUFDO0FBR3pGLE1BQU0sQ0FBQyxNQUFNLDBDQUEwQyxHQUFDLEtBQUssQ0FBQztBQUU5RCxNQUFNLGlCQUFpQixHQUFDLENBQUMsQ0FBQztBQUUxQixnQ0FBZ0M7QUFDaEMsd0RBQXdEO0FBQ3hELE1BQU0sTUFBTSxHQUFDLHlFQUF5RTtJQUNsRixJQUFJO0lBQ0osMkJBQTJCO0lBQzNCLDhCQUE4QjtJQUM5QixxRUFBcUU7SUFDckUsb0JBQW9CO0lBQ3BCLG9CQUFvQjtJQUNwQix5QkFBeUI7SUFDekIsdUJBQXVCO0lBQ3ZCLG9CQUFvQjtJQUNwQixJQUFJO0lBQ0osU0FBUztJQUNULElBQUk7SUFDSixhQUFhO0lBQ2IsaUJBQWlCO0lBQ2pCLGtCQUFrQjtJQUNsQixvQkFBb0I7SUFDcEIsUUFBUTtJQUNSLElBQUk7SUFDSixxQ0FBcUM7SUFDckMsNEJBQTRCO0lBQzVCLHdCQUF3QjtJQUN4Qiw2QkFBNkI7SUFDN0IsMEJBQTBCO0lBQzFCLG9DQUFvQztJQUNwQywwQ0FBMEM7SUFDMUMsb0NBQW9DO0lBQ3BDLHlDQUF5QztJQUN6QywyQ0FBMkM7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QyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbEY7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQscUJBQXFCO1FBQ25CLElBQUcsSUFBSSxDQUFDLFlBQVksRUFBQztZQUNuQixPQUFPLElBQUksQ0FBQztTQUNiO2FBQUs7WUFDSixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztTQUM5QjtJQUNILENBQUM7O0FBL3VCTSx3QkFBVyxHQUFXLElBQUksQ0FBQztBQUNWLG1EQUFzQyxHQUFRLE9BQU8sR0FBQyxDQUFDLENBQUMsQ0FBQyw0QkFBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1NlcXVlbmNlQXVkaW9GbG9hdDMyT3V0U3RyZWFtfSBmcm9tIFwiLi4vaW8vc3RyZWFtXCI7XHJcbmltcG9ydCB7QnJvd3NlciwgUGxhdGZvcm0sIFVzZXJBZ2VudEJ1aWxkZXJ9IGZyb20gXCIuLi8uLi91dGlscy91YS1wYXJzZXJcIjtcclxuXHJcbmltcG9ydCB7QXVkaW9TdG9yYWdlVHlwZSwgQXV0b0dhaW5Db250cm9sQ29uZmlnLCBQbGF0Zm9ybSBhcyBDZmdQbGF0Zm9ybX0gZnJvbSBcIi4uLy4uL3NwZWVjaHJlY29yZGVyL3Byb2plY3QvcHJvamVjdFwiO1xyXG5pbXBvcnQge0FycmF5QXVkaW9CdWZmZXJ9IGZyb20gXCIuLi9hcnJheV9hdWRpb19idWZmZXJcIjtcclxuaW1wb3J0IHtVVUlEfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcclxuaW1wb3J0IHtJbmRleGVkRGJBdWRpb0J1ZmZlciwgUGVyc2lzdGVudEF1ZGlvU3RvcmFnZVRhcmdldH0gZnJvbSBcIi4uL2luZGRiX2F1ZGlvX2J1ZmZlclwiO1xyXG5cclxuXHJcbmV4cG9ydCBjb25zdCBDSFJPTUVfQUNUSVZBVEVfRUNIT19DQU5DRUxMQVRJT05fV0lUSF9BR0M9ZmFsc2U7XHJcblxyXG5jb25zdCBERUJVR19UUkFDRV9MRVZFTD0wO1xyXG5cclxuLy8gRGlydHkgd2F5IHRvIGxvYWQgdGhpcyBtb2R1bGVcclxuLy8gQ29weSBjb250ZW50IG9mIGludGVyY2VwdG9yX3dvcmtsZXQuanMgdG8gdGhpcyBzdHJpbmdcclxuY29uc3QgYXdwU3RyPVwiY2xhc3MgQXVkaW9DYXB0dXJlSW50ZXJjZXB0b3JQcm9jZXNzb3IgZXh0ZW5kcyBBdWRpb1dvcmtsZXRQcm9jZXNzb3J7XFxuXCIgK1xyXG4gICAgXCJcXG5cIiArXHJcbiAgICBcIiAgICBCVUZGRVJfUVVBTlRVTVM9NjQ7XFxuXCIgK1xyXG4gICAgXCIgICAgUVVBTlRVTV9GUkFNRV9MRU49MTI4O1xcblwiICtcclxuICAgIFwiICAgIEJVRkZFUl9GUkFNRV9MRU49dGhpcy5RVUFOVFVNX0ZSQU1FX0xFTip0aGlzLkJVRkZFUl9RVUFOVFVNUztcXG5cIiArXHJcbiAgICBcIiAgICBidWZmZXI9bnVsbDtcXG5cIiArXHJcbiAgICBcIiAgICBidWZmZXJQb3M9MDtcXG5cIiArXHJcbiAgICBcIiAgICBidWZmZXJQb3NCeXRlcz0wO1xcblwiICtcclxuICAgIFwiICAgIGNvbnN0cnVjdG9yKCkge1xcblwiICtcclxuICAgIFwiICAgICAgICBzdXBlcigpO1xcblwiICtcclxuICAgIFwiXFxuXCIgK1xyXG4gICAgXCIgICAgfVxcblwiICtcclxuICAgIFwiXFxuXCIgK1xyXG4gICAgXCIgcHJvY2VzcyhcXG5cIiArXHJcbiAgICBcIiAgICAgIGlucHV0cyxcXG5cIiArXHJcbiAgICBcIiAgICAgIG91dHB1dHMsXFxuXCIgK1xyXG4gICAgXCIgICAgICBwYXJhbWV0ZXJzXFxuXCIgK1xyXG4gICAgXCIgICl7XFxuXCIgK1xyXG4gICAgXCJcXG5cIiArXHJcbiAgICBcIiAgICAgbGV0IGlucHV0c0NudD1pbnB1dHMubGVuZ3RoO1xcblwiICtcclxuICAgIFwiICAgICBsZXQgY2hhbm5lbENvdW50PTA7XFxuXCIgK1xyXG4gICAgXCIgICAgIGxldCBpbnB1dExlbj0wO1xcblwiICtcclxuICAgIFwiICAgICBsZXQgaW5wdXRMZW5CeXRlcz0wO1xcblwiICtcclxuICAgIFwiICAgICBpZihpbnB1dHNDbnQ+MCkge1xcblwiICtcclxuICAgIFwiICAgICAgICAgbGV0IGlucHV0MCA9IGlucHV0c1swXTtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIGNoYW5uZWxDb3VudCA9IGlucHV0MC5sZW5ndGg7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICBpZiAoY2hhbm5lbENvdW50ID4gMCkge1xcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIGxldCBpbnB1dDBjaDA9aW5wdXQwWzBdO1xcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIGlucHV0TGVuPWlucHV0MGNoMC5sZW5ndGg7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgaW5wdXRMZW5CeXRlcz1pbnB1dDBjaDAuYnVmZmVyLmxlbmd0aDtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIH1cXG5cIiArXHJcbiAgICBcIiAgICAgfVxcblwiICtcclxuICAgIFwiICAgICBpZiAoIXRoaXMuYnVmZmVyIHx8IHRoaXMuYnVmZmVyLmxlbmd0aCA8IGNoYW5uZWxDb3VudCkge1xcblwiICtcclxuICAgIFwiICAgICAgICAgdGhpcy5idWZmZXIgPSBuZXcgQXJyYXkoY2hhbm5lbENvdW50KTtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIHRoaXMuYnVmZmVyUG9zID0gMFxcblwiICtcclxuICAgIFwiICAgICAgICAgZm9yIChsZXQgYmNoID0gMDsgYmNoIDwgY2hhbm5lbENvdW50OyBiY2grKykge1xcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIHRoaXMuYnVmZmVyW2JjaF0gPSBuZXcgRmxvYXQzMkFycmF5KHRoaXMuQlVGRkVSX0ZSQU1FX0xFTik7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgdGhpcy5idWZmZXJQb3MgPSAwO1xcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIHRoaXMuYnVmZmVyUG9zQnl0ZXM9MDtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIH1cXG5cIiArXHJcbiAgICBcIiAgICAgfVxcblwiICtcclxuICAgIFwiICAgICBsZXQgYnVmQXZhaWwgPSB0aGlzLkJVRkZFUl9GUkFNRV9MRU4gLSB0aGlzLmJ1ZmZlclBvcztcXG5cIiArXHJcbiAgICBcIiAgICAgLy8gY2hlY2sgaWYgYnVmZmVyIGhhcyB0byBiZSB0cmFuc2ZlcnJlZFxcblwiICtcclxuICAgIFwiICAgICBpZiAoaW5wdXRMZW4gPiBidWZBdmFpbCkge1xcblwiICtcclxuICAgIFwiICAgICAgICAgbGV0IGFkYT1uZXcgQXJyYXkoY2hhbm5lbENvdW50KTtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCBjaGFubmVsQ291bnQ7IGNoKyspIHtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICBhZGFbY2hdPXRoaXMuYnVmZmVyW2NoXS5idWZmZXIuc2xpY2UoMCk7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICB9XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2Uoe1xcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIGRhdGE6IGFkYSxcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICBjaHM6IGNoYW5uZWxDb3VudCxcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICBsZW46IHRoaXMuYnVmZmVyUG9zXFxuXCIgK1xyXG4gICAgXCIgICAgICAgICB9LCBhZGEpO1xcblwiICtcclxuICAgIFwiICAgICAgICAgLy8gYnVmZmVyIHRyYW5zZmVycmVkLCByZXNldFxcblwiICtcclxuICAgIFwiICAgICAgICAgdGhpcy5idWZmZXJQb3MgPSAwO1xcblwiICtcclxuICAgIFwiICAgICAgICAgdGhpcy5idWZmZXJQb3NCeXRlcz0wO1xcblwiICtcclxuICAgIFwiICAgICB9XFxuXCIgK1xyXG4gICAgXCJcXG5cIiArXHJcbiAgICBcIiAgICAgZm9yKGxldCBpaT0wO2lpPGlucHV0c0NudDtpaSsrKSB7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgY2hhbm5lbENvdW50OyBjaCsrKSB7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgLy8gTXV0ZSBvdXRwdXRzXFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgLy9vdXRwdXRzW2lpXVtjaF0uZmlsbCgwKTtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICBsZXQgY2hTYW1wbGVzID0gaW5wdXRzW2lpXVtjaF07XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgdGhpcy5idWZmZXJbY2hdLnNldChjaFNhbXBsZXMsdGhpcy5idWZmZXJQb3MpO1xcblwiICtcclxuICAgIFwiICAgICAgICAgfVxcblwiICtcclxuICAgIFwiICAgICAgICAgdGhpcy5idWZmZXJQb3MrPWlucHV0TGVuO1xcblwiICtcclxuICAgIFwiICAgICAgICAgdGhpcy5idWZmZXJQb3NCeXRlcys9aW5wdXRMZW5CeXRlcztcXG5cIiArXHJcbiAgICBcIiAgICAgfVxcblwiICtcclxuICAgIFwiICAgIFxcblwiICtcclxuICAgIFwiICAgICByZXR1cm4gdHJ1ZTtcXG5cIiArXHJcbiAgICBcIiAgfVxcblwiICtcclxuICAgIFwifVxcblwiICtcclxuICAgIFwiXFxuXCIgK1xyXG4gICAgXCJyZWdpc3RlclByb2Nlc3NvcignY2FwdHVyZS1pbnRlcmNlcHRvcicsQXVkaW9DYXB0dXJlSW50ZXJjZXB0b3JQcm9jZXNzb3IpO1xcblwiO1xyXG5cclxuXHJcblxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBdWRpb0NhcHR1cmVMaXN0ZW5lciB7XHJcbiAgb3BlbmVkKCk6IHZvaWQ7XHJcblxyXG4gIHN0YXJ0ZWQoKTogdm9pZDtcclxuXHJcbiAgc3RvcHBlZCgpOiB2b2lkO1xyXG5cclxuICBjbG9zZWQoKTogdm9pZDtcclxuXHJcbiAgZXJyb3IobXNnPzpzdHJpbmcsYWR2aWNlPzpzdHJpbmcpOiB2b2lkO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQXVkaW9DYXB0dXJlIHtcclxuXHJcbiAgZ2V0IG1heEF1dG9OZXRNZW1TdG9yZVNhbXBsZXMoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9tYXhBdXRvTmV0TWVtU3RvcmVTYW1wbGVzO1xyXG4gIH1cclxuXHJcbiAgc2V0IG1heEF1dG9OZXRNZW1TdG9yZVNhbXBsZXModmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy5fbWF4QXV0b05ldE1lbVN0b3JlU2FtcGxlcyA9IHZhbHVlO1xyXG4gIH1cclxuICBzZXQgcmVjVVVJRCh2YWx1ZTogc3RyaW5nfG51bGwpIHtcclxuICAgIHRoaXMuX3JlY1VVSUQgPSB2YWx1ZTtcclxuICB9XHJcbiAgZ2V0IHJlY1VVSUQoKTogc3RyaW5nIHxudWxse1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlY1VVSUQ7XHJcbiAgfVxyXG4gIGdldCBhdWRpb1N0b3JhZ2VUeXBlKCk6IEF1ZGlvU3RvcmFnZVR5cGUge1xyXG4gICAgcmV0dXJuIHRoaXMuX2F1ZGlvU3RvcmFnZVR5cGU7XHJcbiAgfVxyXG5cclxuICBzZXQgYXVkaW9TdG9yYWdlVHlwZSh2YWx1ZTogQXVkaW9TdG9yYWdlVHlwZSkge1xyXG4gICAgdGhpcy5fYXVkaW9TdG9yYWdlVHlwZSA9IHZhbHVlO1xyXG4gIH1cclxuICBnZXQgcGVyc2lzdGVudEF1ZGlvU3RvcmFnZVRhcmdldCgpOiBQZXJzaXN0ZW50QXVkaW9TdG9yYWdlVGFyZ2V0IHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fcGVyc2lzdGVudEF1ZGlvU3RvcmFnZVRhcmdldDtcclxuICB9XHJcblxyXG4gIHNldCBwZXJzaXN0ZW50QXVkaW9TdG9yYWdlVGFyZ2V0KHZhbHVlOiBQZXJzaXN0ZW50QXVkaW9TdG9yYWdlVGFyZ2V0IHwgbnVsbCkge1xyXG4gICAgdGhpcy5fcGVyc2lzdGVudEF1ZGlvU3RvcmFnZVRhcmdldCA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IG9wZW5lZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9vcGVuZWQ7XHJcbiAgfVxyXG5cclxuICBzdGF0aWMgQlVGRkVSX1NJWkU6IG51bWJlciA9IDgxOTI7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9NQVhfTkVUX0FVVE9fTUVNX1NUT1JFX1NBTVBMRVM6bnVtYmVyPTI4ODAwMDAqNTsgLy8gRGVmYXVsdCA1IG1pbnV0ZSBhdCA0OGtIelxyXG4gIHByaXZhdGUgX21heEF1dG9OZXRNZW1TdG9yZVNhbXBsZXM6bnVtYmVyPUF1ZGlvQ2FwdHVyZS5ERUZBVUxUX01BWF9ORVRfQVVUT19NRU1fU1RPUkVfU0FNUExFUztcclxuICBjb250ZXh0OiBBdWRpb0NvbnRleHQ7XHJcbiAgc3RyZWFtITogTWVkaWFTdHJlYW07XHJcbiAgY2hhbm5lbENvdW50ITogbnVtYmVyO1xyXG4gIHByaXZhdGUgX3JlY1VVSUQ6c3RyaW5nfG51bGw9bnVsbDtcclxuICBtZWRpYVN0cmVhbTogYW55O1xyXG4gIGFnY1N0YXR1czpib29sZWFufG51bGw9bnVsbDtcclxuICBidWZmZXJpbmdOb2RlOiBBdWRpb05vZGV8bnVsbD1udWxsO1xyXG4gIGxpc3RlbmVyITogQXVkaW9DYXB0dXJlTGlzdGVuZXI7XHJcbiAgZGF0YTogQXJyYXk8QXJyYXk8RmxvYXQzMkFycmF5Pj58bnVsbD1udWxsO1xyXG4gIGN1cnJlbnRTYW1wbGVSYXRlITogbnVtYmVyO1xyXG4gIG46IE5hdmlnYXRvcjtcclxuICBhdWRpb091dFN0cmVhbTogU2VxdWVuY2VBdWRpb0Zsb2F0MzJPdXRTdHJlYW0gfCBudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSBkaXNjb25uZWN0U3RyZWFtcyA9IHRydWU7XHJcbiAgcHJpdmF0ZSBfb3BlbmVkPWZhbHNlO1xyXG4gIHByaXZhdGUgY2FwdHVyaW5nID0gZmFsc2U7XHJcblxyXG4gIGZyYW1lc1JlY29yZGVkOiBudW1iZXI9MDtcclxuXHJcbiAgcHJpdmF0ZSBfYXVkaW9TdG9yYWdlVHlwZTpBdWRpb1N0b3JhZ2VUeXBlPUF1ZGlvU3RvcmFnZVR5cGUuTUVNX0VOVElSRTtcclxuICBwcml2YXRlIF9wZXJzaXN0ZW50QXVkaW9TdG9yYWdlVGFyZ2V0OlBlcnNpc3RlbnRBdWRpb1N0b3JhZ2VUYXJnZXR8bnVsbD1udWxsO1xyXG5cclxuICBwcml2YXRlIHBlcnNpc3RlZD10cnVlO1xyXG4gIHByaXZhdGUgcGVyc2lzdEVycm9yOkVycm9yfG51bGw9bnVsbDtcclxuICBwcml2YXRlIGluZGRiQXVkaW9CdWZmZXI6SW5kZXhlZERiQXVkaW9CdWZmZXJ8bnVsbD1udWxsO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBBdWRpb0NvbnRleHQpIHtcclxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XHJcbiAgICB0aGlzLm4gPSBuYXZpZ2F0b3I7XHJcbiAgICB0aGlzLmNvbnRleHQuYWRkRXZlbnRMaXN0ZW5lcignc3RhdGVjaGFuZ2UnLCAoZXYpID0+IHtcclxuICAgICAgaWYgKHRoaXMuY29udGV4dC5zdGF0ZSAhPT0gJ3J1bm5pbmcnKSB7XHJcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdERhdGEoKSB7XHJcbiAgICBpZighdGhpcy5fcmVjVVVJRCkge1xyXG4gICAgICB0aGlzLl9yZWNVVUlEID0gVVVJRC5nZW5lcmF0ZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wZXJzaXN0RXJyb3I9bnVsbDtcclxuICAgIC8vY29uc29sZS5kZWJ1ZyhcIkF1ZGlvIGNhcHR1cmUgaW5pdGlhbGl6ZSBzdG9yYWdlIGZvciB0eXBlOiBcIit0aGlzLl9hdWRpb1N0b3JhZ2VUeXBlKTtcclxuICAgIGlmKEF1ZGlvU3RvcmFnZVR5cGUuREJfQ0hVTktFRCA9PT0gdGhpcy5fYXVkaW9TdG9yYWdlVHlwZSAmJiB0aGlzLl9wZXJzaXN0ZW50QXVkaW9TdG9yYWdlVGFyZ2V0ICYmIHRoaXMuX3JlY1VVSUQpIHtcclxuICAgICAgLy9jb25zb2xlLmRlYnVnKFwiQ3JlYXRlIGluZGV4ZWQgZGIgYXVkaW8gYnVmZmVyLlwiKTtcclxuICAgICAgdGhpcy5pbmRkYkF1ZGlvQnVmZmVyID0gbmV3IEluZGV4ZWREYkF1ZGlvQnVmZmVyKHRoaXMuX3BlcnNpc3RlbnRBdWRpb1N0b3JhZ2VUYXJnZXQsIHRoaXMuY2hhbm5lbENvdW50LHRoaXMuY3VycmVudFNhbXBsZVJhdGUsQXVkaW9DYXB0dXJlLkJVRkZFUl9TSVpFLDAsdGhpcy5fcmVjVVVJRClcclxuICAgIH1cclxuICAgIGlmKCEoQXVkaW9TdG9yYWdlVHlwZS5ORVRfQ0hVTktFRCA9PT0gdGhpcy5fYXVkaW9TdG9yYWdlVHlwZSkpIHtcclxuICAgICAgLy8gSW5pdGlhbGl6ZSBhdWRpbyBkYXRhIGFycmF5IGV4Y2VwdCBmb3IgbmV0IGF1ZGlvIGJ1ZmZlciBtb2RlXHJcbiAgICAgIHRoaXMuZGF0YSA9IG5ldyBBcnJheTxBcnJheTxGbG9hdDMyQXJyYXk+PigpO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2hhbm5lbENvdW50OyBpKyspIHtcclxuICAgICAgICB0aGlzLmRhdGEucHVzaChuZXcgQXJyYXk8RmxvYXQzMkFycmF5PigpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5mcmFtZXNSZWNvcmRlZCA9IDA7XHJcbiAgfVxyXG5cclxuICBsaXN0RGV2aWNlcygpIHtcclxuICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpLnRoZW4oKGw6IE1lZGlhRGV2aWNlSW5mb1tdKSA9PiB0aGlzLnByaW50RGV2aWNlcyhsKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGR1bW15U2Vzc2lvbigpOlByb21pc2U8TWVkaWFTdHJlYW0+e1xyXG4gICAgLy8gd29ya2Fyb3VuZCB0byByZXF1ZXN0IHBlcm1pc3Npb25zOlxyXG4gICAgLy8gU3RhcnQgYSBkdW1teSBzZXNzaW9uXHJcbiAgICBsZXQgbWVkaWFTdHJDbnN0cnMgPSA8TWVkaWFTdHJlYW1Db25zdHJhaW50cz57YXVkaW86XHJcbiAgICAgICAge2VjaG9DYW5jZWxhdGlvbjogZmFsc2V9XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKG1lZGlhU3RyQ25zdHJzKTtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBzdG9wQWxsU2Vzc2lvblRyYWNrcyhtZWRpYVN0cmVhbTpNZWRpYVN0cmVhbSl7XHJcbiAgICAgIGxldCBhdHMgPSBtZWRpYVN0cmVhbS5nZXRUcmFja3MoKTtcclxuICAgICAgZm9yIChsZXQgYXRJZHggPSAwOyBhdElkeCA8IGF0cy5sZW5ndGg7IGF0SWR4KyspIHtcclxuICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJTdG9wIGR1bW15IHNlc3Npb24gdHJhY2s6ICNcIiArIGF0SWR4KVxyXG4gICAgICAgIGF0c1thdElkeF0uc3RvcCgpO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuICBkZXZpY2VJbmZvcyhjYjogKGRldmljZUluZm9zOiBNZWRpYURldmljZUluZm9bXSB8IG51bGwpID0+IGFueSwgcmV0cnkgPSB0cnVlLGR1bW15U3RyZWFtPzpNZWRpYVN0cmVhbSkge1xyXG5cclxuICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpLnRoZW4oKGw6IE1lZGlhRGV2aWNlSW5mb1tdKSA9PiB7XHJcbiAgICAgIGxldCBsYWJlbHNBdmFpbGFibGUgPSBmYWxzZTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGRpID0gbFtpXTtcclxuICAgICAgICBpZiAoZGkubGFiZWwpIHtcclxuICAgICAgICAgIGxhYmVsc0F2YWlsYWJsZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICghbGFiZWxzQXZhaWxhYmxlKSB7XHJcbiAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiTWVkaWEgZGV2aWNlIGVudW1lcmF0aW9uOiBObyBsYWJlbHMuXCIpXHJcbiAgICAgICAgaWYgKHJldHJ5KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIlN0YXJ0aW5nIGR1bW15IHNlc3Npb24gdG8gcmVxdWVzdCBhdWRpbyBwZXJtaXNzaW9ucy4uLlwiKVxyXG5cclxuICAgICAgICAgICAgdGhpcy5kdW1teVNlc3Npb24oKS50aGVuKChzOiBNZWRpYVN0cmVhbSkgPT4ge1xyXG4gICAgICAgICAgICAvLyBhbmQgc3RvcCBpdCBpbW1lZGlhdGVseVxyXG5cclxuICAgICAgICAgICAgaWYocykge1xyXG4gICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkdvdCBkdW1teSBzZXNzaW9uIHN0cmVhbTogXCIgKyBzICsgXCIgLlwiKVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJObyBkdW1teSBzdHJlYW1cIilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyByZXRyeSAob25seSBvbmNlKVxyXG4gICAgICAgICAgICB0aGlzLmRldmljZUluZm9zKGNiLCBmYWxzZSxzKTtcclxuICAgICAgICAgIH0scmVhc29uID0+IHtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiRHVtbXkgc2Vzc2lvbiByZWplY3RlZC5cIilcclxuICAgICAgICAgICAgLy8gVE9ETyBlcnJvciBjYWxsYmFja1xyXG4gICAgICAgICAgICBjYihudWxsKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjYihudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gc3VjY2Vzc1xyXG4gICAgICAgIGNiKGwpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKGR1bW15U3RyZWFtKXtcclxuICAgICAgICB0aGlzLnN0b3BBbGxTZXNzaW9uVHJhY2tzKGR1bW15U3RyZWFtKTtcclxuICAgICAgfVxyXG4gICAgfSwocmVhc29uKT0+IHtcclxuICAgICAgLy9yZWplY3RlZFxyXG4gICAgICAvL2NvbnNvbGUuZGVidWcoXCJNZWRpYSBkZXZpY2UgZW51bWVyYXRpb24gcmVqZWN0ZWQuXCIpXHJcbiAgICAgIGlmIChyZXRyeSkge1xyXG4gICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlN0YXJ0aW5nIGR1bW15IHNlc3Npb24gdG8gcmVxdWVzdCBhdWRpbyBwZXJtaXNzaW9ucy4uLlwiKVxyXG4gICAgICAgIHRoaXMuZHVtbXlTZXNzaW9uKCkudGhlbigoczogTWVkaWFTdHJlYW0pID0+IHtcclxuICAgICAgICAgIC8vIGFuZCBzdG9wIGl0IGltbWVkaWF0ZWx5XHJcbiAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJEdW1teSBzZXNzaW9uLlwiKVxyXG4gICAgICAgICAgaWYocykge1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJHb3QgZHVtbXkgc2Vzc2lvbiBzdHJlYW06IFwiICsgcyArIFwiIC5cIilcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJObyBkdW1teSBzdHJlYW1cIilcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIHJldHJ5IChvbmx5IG9uY2UpXHJcbiAgICAgICAgICB0aGlzLmRldmljZUluZm9zKGNiLCBmYWxzZSxzKTtcclxuICAgICAgICB9LCByZWFzb24gPT4ge1xyXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiRHVtbXkgc2Vzc2lvbiByZWplY3RlZC5cIilcclxuICAgICAgICAgIC8vIFRPRE8gZXJyb3IgY2FsbGJhY2tcclxuICAgICAgICAgIGNiKG51bGwpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNiKG51bGwpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKGR1bW15U3RyZWFtKXtcclxuICAgICAgICB0aGlzLnN0b3BBbGxTZXNzaW9uVHJhY2tzKGR1bW15U3RyZWFtKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG5cclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpbnREZXZpY2VzKGw6IE1lZGlhRGV2aWNlSW5mb1tdKTogdm9pZCB7XHJcbiAgICAvL2xldCBzZWxEZXZpY2VJZCA9ICdfX19kdW1teV9fXyc7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGwubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGRpID0gbFtpXTtcclxuICAgICAgY29uc29sZS5sb2coXCJBdWRpbyBkZXZpY2U6IElkOiBcIiArIGRpLmRldmljZUlkICsgXCIgZ3JvdXBJZDogXCIgKyBkaS5ncm91cElkICsgXCIgbGFiZWw6IFwiICsgZGkubGFiZWwgKyBcIiBraW5kOiBcIiArIGRpLmtpbmQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb3BlbihjaGFubmVsQ291bnQ6IG51bWJlciwgc2VsRGV2aWNlSWQ/OiBDb25zdHJhaW5ET01TdHJpbmd8dW5kZWZpbmVkLGF1dG9HYWluQ29udHJvbENvbmZpZ3M/OkFycmF5PEF1dG9HYWluQ29udHJvbENvbmZpZz58bnVsbHx1bmRlZmluZWQpe1xyXG4gICAgLy9jb25zb2xlLmRlYnVnKFwiQ2FwdHVyZSBvcGVuOiBjdHggc3RhdGU6IFwiK3RoaXMuY29udGV4dC5zdGF0ZSk7XHJcbiAgICBpZih0aGlzLmNvbnRleHQuc3RhdGUhPT0ncnVubmluZycpe1xyXG4gICAgICAvL2NvbnNvbGUuZGVidWcoXCJDYXB0dXJlIG9wZW46IFJlc3VtZSBjb250ZXh0XCIpO1xyXG4gICAgICB0aGlzLmNvbnRleHQucmVzdW1lKCkudGhlbigoKT0+e1xyXG4gICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkNhcHR1cmUgb3BlbiAoY3R4IHJlc3VtZWQpOiBjdHggc3RhdGU6IFwiK3RoaXMuY29udGV4dC5zdGF0ZSk7XHJcbiAgICAgICAgdGhpcy5fb3BlbihjaGFubmVsQ291bnQsIHNlbERldmljZUlkLCBhdXRvR2FpbkNvbnRyb2xDb25maWdzKTtcclxuICAgICAgfSlcclxuICAgIH1lbHNle1xyXG4gICAgICB0aGlzLl9vcGVuKGNoYW5uZWxDb3VudCwgc2VsRGV2aWNlSWQsIGF1dG9HYWluQ29udHJvbENvbmZpZ3MpO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIF9vcGVuKGNoYW5uZWxDb3VudDogbnVtYmVyLCBzZWxEZXZpY2VJZD86IENvbnN0cmFpbkRPTVN0cmluZ3x1bmRlZmluZWQsYXV0b0dhaW5Db250cm9sQ29uZmlncz86QXJyYXk8QXV0b0dhaW5Db250cm9sQ29uZmlnPnxudWxsfHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5jaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQ7XHJcbiAgICB0aGlzLmZyYW1lc1JlY29yZGVkID0gMDtcclxuXHJcblxyXG4gICAgLy92YXIgbXNjID0gbmV3IEF1ZGlvU3RyZWFtQ29uc3RyKCk7XHJcbiAgICAvLyB2YXIgbXNjPXt9O1xyXG4gICAgLy9tc2MudmlkZW8gPSBmYWxzZTtcclxuICAgIC8vbXNjLmF1ZGlvID0gdHJ1ZTtcclxuXHJcbiAgICAvLyBDaHJvbWUgYW5kIEZpcmVmb3ggc3RlcmVvIGNoYW5uZWxzIGFyZSBpZGVudGljYWwgISFcclxuICAgIC8vIEFuZCBldmVuIHdvcnNlOiBUaGUgZGF0YSBjb21pbmcgZnJvbSB0aGUgc291cmNlIGlzIGFscmVhZHkgcHJlcHJvY2Vzc2VkIG9uIEZGIGFuZCBDaHJvbWUuIEl0IGNvbnRhaW5zIERTUCBhcnRpZmFjdHMhIVxyXG5cclxuICAgIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTM4NzczN1xyXG4gICAgLy8gVGhlIHdvcmthcm91bmQgdG8gc2V0IHRoZXNlIGNvbnN0cmFpbnRzIGRvZXMgX05PVF8gaGVscDpcclxuICAgIC8vdmFyIG1zYz17YXVkaW86IHtlY2hvQ2FuY2VsbGF0aW9uOiBmYWxzZSxjaGFubmVsQ291bnQ6IDIsIGdvb2dBdWRpb01pcnJvcmluZzogZmFsc2V9LHZpZGVvOiBmYWxzZX07XHJcblxyXG4gICAgLy8gU2FmYXJpIGF0IGxlYXN0IHZlcnNpb24gMTE6IFN1cHBvcnQgZm9yIG1lZGlhIHN0cmVhbXNcclxuICAgIC8vIFRPRE8gdGVzdCBpZiBpbnB1dCBpcyB1bnByb2Nlc3NlZFxyXG5cclxuICAgIGxldCBtc2M6TWVkaWFTdHJlYW1Db25zdHJhaW50cztcclxuICAgIGNvbnNvbGUuaW5mbygnVXNlciBhZ2VudDogJytuYXZpZ2F0b3IudXNlckFnZW50KTtcclxuXHJcblxyXG4gICAgICBsZXQgdWE9VXNlckFnZW50QnVpbGRlci51c2VyQWdlbnQoKTtcclxuXHJcbiAgICAgIC8vIHVhLmNvbXBvbmVudHMuZm9yRWFjaCgoYyk9PntcclxuICAgICAgLy8gICBjb25zb2xlLmluZm8oXCJVQV9Db21wOiBcIitjLnRvU3RyaW5nKCkpO1xyXG4gICAgICAvLyB9KVxyXG5cclxuICAgICBsZXQgYWdjQ2ZnOkF1dG9HYWluQ29udHJvbENvbmZpZ3xudWxsPW51bGw7XHJcblxyXG4gICAgbGV0IGF1dG9HYWluQ29udHJvbD1mYWxzZTtcclxuICAgIGxldCBjaHJvbWVFY2hvQ2FuY2VsbGF0aW9uPWZhbHNlO1xyXG4gICAgaWYoYXV0b0dhaW5Db250cm9sQ29uZmlncyl7XHJcbiAgICAgIGZvcihsZXQgYWdjYyBvZiBhdXRvR2FpbkNvbnRyb2xDb25maWdzKXtcclxuICAgICAgICBpZihhZ2NjLnBsYXRmb3JtPT09Q2ZnUGxhdGZvcm0uQW5kcm9pZCAmJiB1YS5kZXRlY3RlZFBsYXRmb3JtPT09UGxhdGZvcm0uQW5kcm9pZCl7XHJcbiAgICAgICAgICAgIGFnY0NmZz1hZ2NjO1xyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYoYWdjYy5wbGF0Zm9ybT09PUNmZ1BsYXRmb3JtLldpbmRvd3MgJiYgdWEuZGV0ZWN0ZWRQbGF0Zm9ybT09PVBsYXRmb3JtLldpbmRvd3Mpe1xyXG4gICAgICAgICAgYWdjQ2ZnPWFnY2M7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYoYWdjQ2ZnKXtcclxuICAgICAgICAvLyBUT0RPIHVzZSBFWEFDVC9JREVBTCBjb25zdHJhaW50XHJcbiAgICAgICAgYXV0b0dhaW5Db250cm9sPWFnY0NmZy52YWx1ZTtcclxuICAgICAgICBpZihDSFJPTUVfQUNUSVZBVEVfRUNIT19DQU5DRUxMQVRJT05fV0lUSF9BR0Mpe1xyXG4gICAgICAgICAgY2hyb21lRWNob0NhbmNlbGxhdGlvbj1hZ2NDZmcudmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFRPRE8gcXVlcnkgcmVhbCBBR0Mgc3RhdHVzXHJcbiAgICAgICAgdGhpcy5hZ2NTdGF0dXM9YWdjQ2ZnLnZhbHVlO1xyXG4gICAgICB9ZWxzZXtcclxuICAgICAgICB0aGlzLmFnY1N0YXR1cz1mYWxzZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIGRlZmF1bHRcclxuICAgIG1zYyA9IHtcclxuICAgICAgYXVkaW86IHtcclxuICAgICAgICBkZXZpY2VJZDogc2VsRGV2aWNlSWQsXHJcbiAgICAgICAgZWNob0NhbmNlbGxhdGlvbjogZmFsc2UsXHJcbiAgICAgICAgY2hhbm5lbENvdW50OiBjaGFubmVsQ291bnQsXHJcbiAgICAgICAgYXV0b0dhaW5Db250cm9sOiBhdXRvR2FpbkNvbnRyb2xcclxuICAgICAgfSxcclxuICAgICAgdmlkZW86IGZhbHNlXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh1YS5kZXRlY3RlZEJyb3dzZXI9PT1Ccm93c2VyLkVkZ2UpIHtcclxuXHJcbiAgICAgIC8vIE1pY3Jvc29mdCBFZGdlIHNlbmRzIHVubW9kaWZpZWQgYXVkaW9cclxuICAgICAgLy8gVGhlIGNvbnN0cmFpbnQgY2FuIGZvbGxvdyB0aGUgc3BlY2lmaWNhdGlvblxyXG4gICAgICBjb25zb2xlLmluZm8oXCJTZXR0aW5nIG1lZGlhIHRyYWNrIGNvbnN0cmFpbnRzIGZvciBNaWNyb3NvZnQgRWRnZS5cIik7XHJcbiAgICAgIG1zYyA9IHtcclxuICAgICAgICBhdWRpbzoge1xyXG4gICAgICAgICAgZGV2aWNlSWQ6IHNlbERldmljZUlkLFxyXG4gICAgICAgICAgZWNob0NhbmNlbGxhdGlvbjogZmFsc2UsXHJcbiAgICAgICAgICBjaGFubmVsQ291bnQ6IGNoYW5uZWxDb3VudCxcclxuICAgICAgICAgIGF1dG9HYWluQ29udHJvbDogYXV0b0dhaW5Db250cm9sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB2aWRlbzogZmFsc2VcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSBpZiAodWEuZGV0ZWN0ZWRCcm93c2VyPT09QnJvd3Nlci5DaHJvbWUpIHtcclxuICAgICAgLy8gR29vZ2xlIENocm9tZTogd2UgbmVlZCB0byBzd2l0Y2ggb2YgZWFjaCBvZiB0aGUgcHJlcHJvY2Vzc2luZyB1bml0cyBpbmNsdWRpbmcgdGhlXHJcbiAgICAgIGNvbnNvbGUuaW5mbyhcIlNldHRpbmcgbWVkaWEgdHJhY2sgY29uc3RyYWludHMgZm9yIEdvb2dsZSBDaHJvbWUuXCIpO1xyXG5cclxuICAgICAgLy8gQ2hyb21lIDYwIC0+IDYxIGNoYW5nZWRcclxuICAgICAgLy8gaXQgd29ya3Mgbm93IHdpdGhvdXQgbWFuZGF0b3J5L29wdGlvbmFsIHN1Yi1vYmplY3RzXHJcblxyXG5cclxuICAgICAgLy8gUmVxdWlyZXMgYXQgbGVhc3QgQ2hyb21lIDYxXHJcbiAgICAgIG1zYyA9IHtcclxuICAgICAgICBhdWRpbzoge1xyXG4gICAgICAgICAgZGV2aWNlSWQ6IHNlbERldmljZUlkLFxyXG4gICAgICAgICAgY2hhbm5lbENvdW50OiBjaGFubmVsQ291bnQsXHJcbiAgICAgICAgICBlY2hvQ2FuY2VsbGF0aW9uOiB7ZXhhY3Q6Y2hyb21lRWNob0NhbmNlbGxhdGlvbn0sXHJcbiAgICAgICAgICBhdXRvR2FpbkNvbnRyb2w6IHtleGFjdDphdXRvR2FpbkNvbnRyb2x9LFxyXG4gICAgICAgICAgc2FtcGxlU2l6ZTp7bWluOiAxNn0sXHJcbiAgICAgICAgfSxcclxuICAgICAgICB2aWRlbzogZmFsc2UsXHJcbiAgICAgIH1cclxuXHJcbiAgICB9IGVsc2UgaWYgKHVhLmRldGVjdGVkQnJvd3Nlcj09PUJyb3dzZXIuRmlyZWZveCkge1xyXG4gICAgICBjb25zb2xlLmluZm8oXCJTZXR0aW5nIG1lZGlhIHRyYWNrIGNvbnN0cmFpbnRzIGZvciBNb3ppbGxhIEZpcmVmb3guXCIpO1xyXG4gICAgICAvLyBGaXJlZm94XHJcbiAgICAgIG1zYyA9IHtcclxuICAgICAgICBhdWRpbzoge1xyXG4gICAgICAgICAgICBkZXZpY2VJZDogc2VsRGV2aWNlSWQsXHJcbiAgICAgICAgICAgIGNoYW5uZWxDb3VudDogY2hhbm5lbENvdW50LFxyXG4gICAgICAgICAgZWNob0NhbmNlbGxhdGlvbjogZmFsc2UsXHJcbiAgICAgICAgICAgIGF1dG9HYWluQ29udHJvbDogYXV0b0dhaW5Db250cm9sLFxyXG4gICAgICAgICAgbm9pc2VTdXBwcmVzc2lvbjogZmFsc2VcclxuICAgICAgICB9LFxyXG4gICAgICAgIHZpZGVvOiBmYWxzZSxcclxuICAgICAgfVxyXG5cclxuICAgIH0gZWxzZSBpZiAodWEuZGV0ZWN0ZWRCcm93c2VyPT09QnJvd3Nlci5TYWZhcmkpIHtcclxuICAgICAgY29uc29sZS5pbmZvKFwiU2V0dGluZyBtZWRpYSB0cmFjayBjb25zdHJhaW50cyBmb3IgU2FmYXJpIGJyb3dzZXIuXCIpXHJcbiAgICAgIC8vY29uc29sZS5pbmZvKFwiQXBwbHkgd29ya2Fyb3VuZCBmb3IgU2FmYXJpOiBBdm9pZCBkaXNjb25uZWN0IG9mIHN0cmVhbXMuXCIpO1xyXG5cclxuICAgICAgdGhpcy5kaXNjb25uZWN0U3RyZWFtcyA9IHRydWU7XHJcbiAgICAgIG1zYyA9IHtcclxuICAgICAgICBhdWRpbzoge1xyXG4gICAgICAgICAgZGV2aWNlSWQ6IHNlbERldmljZUlkLFxyXG4gICAgICAgICAgY2hhbm5lbENvdW50OiBjaGFubmVsQ291bnQsXHJcbiAgICAgICAgICBlY2hvQ2FuY2VsbGF0aW9uOiBmYWxzZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdmlkZW86IGZhbHNlLFxyXG4gICAgICB9XHJcblxyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIC8vIFRPRE8gZGVmYXVsdCBjb25zdHJhaW50cyBvciBlcnJvciBCcm93c2VyIG5vdCBzdXBwb3J0ZWRcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIGNvbnNvbGUuZGVidWcoXCJBdWRpbyBjYXB0dXJlLCBBR0M6IFwiK3RoaXMuYWdjU3RhdHVzKVxyXG5cclxuXHJcbiAgICBsZXQgdW1wID0gbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEobXNjKTtcclxuICAgIHVtcC50aGVuKChzKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zdHJlYW0gPSBzO1xyXG5cclxuICAgICAgICBsZXQgYVRyYWNrcyA9IHMuZ2V0QXVkaW9UcmFja3MoKTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhVHJhY2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgYVRyYWNrID0gYVRyYWNrc1tpXTtcclxuXHJcbiAgICAgICAgICBjb25zb2xlLmluZm8oXCJUcmFjayBhdWRpbyBpbmZvOiBpZDogXCIgKyBhVHJhY2suaWQgKyBcIiBraW5kOiBcIiArIGFUcmFjay5raW5kICsgXCIgbGFiZWw6IFxcXCJcIiArIGFUcmFjay5sYWJlbCArIFwiXFxcIlwiKTtcclxuICAgICAgICAgIGxldCBtdHJTdHM9YVRyYWNrLmdldFNldHRpbmdzKCk7XHJcblxyXG4gICAgICAgICAgLy8gVHlwZXNjcmlwdCBsaWIuZG9tLnRzIE1lZGlhVHJhY2tTZXR0aW5ncy5jaGFubmVsQ291bnQgaXMgbWlzc2luZ1xyXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21kbi9icm93c2VyLWNvbXBhdC1kYXRhL2Jsb2IvNTQ5M2Q4ZjkzN2UwNWIyZGRiZDQxYjk5ZjViZGZhZDRhMWYyZWQ4NS9hcGkvTWVkaWFUcmFja1NldHRpbmdzLmpzb25cclxuICAgICAgICAgIC8vQHRzLWlnbm9yZVxyXG4gICAgICAgICAgY29uc29sZS5pbmZvKFwiVHJhY2sgYXVkaW8gc2V0dGluZ3M6IENoIGNudDogXCIrbXRyU3RzLmNoYW5uZWxDb3VudCtcIiwgQUdDOiBcIittdHJTdHMuYXV0b0dhaW5Db250cm9sK1wiLCBFY2hvIGNhbmNlbGwuOiBcIittdHJTdHMuZWNob0NhbmNlbGxhdGlvbik7XHJcbiAgICAgICAgICBpZihtdHJTdHMuYXV0b0dhaW5Db250cm9sKXtcclxuICAgICAgICAgICAgdGhpcy5hZ2NTdGF0dXM9bXRyU3RzLmF1dG9HYWluQ29udHJvbDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB2VHJhY2tzID0gcy5nZXRWaWRlb1RyYWNrcygpO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdlRyYWNrcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgbGV0IHZUcmFjayA9IHZUcmFja3NbaV07XHJcbiAgICAgICAgICBjb25zb2xlLmluZm8oXCJUcmFjayB2aWRlbyBpbmZvOiBpZDogXCIgKyB2VHJhY2suaWQgKyBcIiBraW5kOiBcIiArIHZUcmFjay5raW5kICsgXCIgbGFiZWw6IFwiICsgdlRyYWNrLmxhYmVsKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5tZWRpYVN0cmVhbSA9IHRoaXMuY29udGV4dC5jcmVhdGVNZWRpYVN0cmVhbVNvdXJjZShzKTtcclxuICAgICAgICAvLyBzdHJlYW0gY2hhbm5lbCBjb3VudCAoIGlzIGFsd2F5cyAyICEpXHJcbiAgICAgICAgbGV0IHN0cmVhbUNoYW5uZWxDb3VudDogbnVtYmVyID0gdGhpcy5tZWRpYVN0cmVhbS5jaGFubmVsQ291bnQ7XHJcbiAgICAgICAgY29uc29sZS5pbmZvKFwiU3RyZWFtIGNoYW5uZWwgY291bnQ6IFwiK3N0cmVhbUNoYW5uZWxDb3VudCk7XHJcbiAgICAgICAgLy8gaXMgbm90IHNldCEhXHJcbiAgICAgICAgLy90aGlzLmN1cnJlbnRTYW1wbGVSYXRlID0gdGhpcy5tZWRpYVN0cmVhbS5zYW1wbGVSYXRlO1xyXG4gICAgICAgIHRoaXMuY3VycmVudFNhbXBsZVJhdGUgPSB0aGlzLmNvbnRleHQuc2FtcGxlUmF0ZTtcclxuICAgICAgICBjb25zb2xlLmluZm8oXCJTb3VyY2UgYXVkaW8gbm9kZTogY2hhbm5lbHM6IFwiICsgc3RyZWFtQ2hhbm5lbENvdW50ICsgXCIgc2FtcGxlcmF0ZTogXCIgKyB0aGlzLmN1cnJlbnRTYW1wbGVSYXRlKTtcclxuICAgICAgICBpZiAodGhpcy5hdWRpb091dFN0cmVhbSkge1xyXG4gICAgICAgICAgdGhpcy5hdWRpb091dFN0cmVhbS5zZXRGb3JtYXQodGhpcy5jaGFubmVsQ291bnQsIHRoaXMuY3VycmVudFNhbXBsZVJhdGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBXM0MgIC0+IG5ldyBuYW1lIGlzIGNyZWF0ZVNjcmlwdFByb2Nlc3NvclxyXG4gICAgICAgIC8vXHJcbiAgICAgICAgLy8gQWdhaW4gZGVwcmVjYXRlZCwgYnV0IEF1ZGlvV29ya2VyIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gc3RhYmxlIHJlbGVhc2VzIChKdW5lIDIwMTYpXHJcbiAgICAgICAgLy8gQXVkaW9Xb3JrZXIgaXMgbm93IEF1ZGlvV29ya2xldFByb2Nlc3NvciAuLi4gKE1heSAyMDE3KVxyXG5cclxuICAgICAgLy8gVXBkYXRlIDEyLTIwMjA6XHJcbiAgICAgICAvLyBUaGUgU2NyaXB0UHJvY2Vzc29yTm9kZSBJbnRlcmZhY2UgLSBERVBSRUNBVEVEXHJcblxyXG4gICAgICAvLyBVcGRhdGUgMDYtMjAyMVxyXG4gICAgICAvLyAgQXVkaW9Xb3JrbGV0UHJvY2Vzc29yIGlzIGhlcmUgdG8gc3RheS4gV2ViIEF1ZGlvIEFQSSBoYXMgbm93IFJlY29tbWVuZGF0aW9uIHN0YXR1cyAhXHJcblxyXG4gICAgICAgICAgaWYodGhpcy5jb250ZXh0LmF1ZGlvV29ya2xldCl7XHJcbiAgICAgICAgICAgIC8vY29uc3Qgd29ya2xldEZpbGVOYW1lID0gKCdmaWxlLWxvYWRlciEuL2ludGVyY2VwdG9yX3dvcmtsZXQuanMnKTtcclxuICAgICAgICAgICAgLy9jb25zdCB3b3JrbGV0RmlsZU5hbWUgPSAnaHR0cDovL2xvY2FsaG9zdDo0MjAwL2Fzc2V0cy9pbnRlcmNlcHRvcl93b3JrbGV0LmpzJztcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhhd3BTdHIpO1xyXG4gICAgICAgICAgICBsZXQgYXVkaW9Xb3JrbGV0TW9kdWxlQmxvYj0gbmV3IEJsb2IoW2F3cFN0cl0sIHt0eXBlOiAndGV4dC9qYXZhc2NyaXB0J30pO1xyXG5cclxuICAgICAgICAgICAgbGV0IGF1ZGlvV29ya2xldE1vZHVsZUJsb2JVcmw9d2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYXVkaW9Xb3JrbGV0TW9kdWxlQmxvYik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuYXVkaW9Xb3JrbGV0LmFkZE1vZHVsZShhdWRpb1dvcmtsZXRNb2R1bGVCbG9iVXJsKS50aGVuKCgpPT4ge1xyXG4gICAgICAgICAgICAgICAgICBjb25zdCBhd24gPSBuZXcgQXVkaW9Xb3JrbGV0Tm9kZSh0aGlzLmNvbnRleHQsICdjYXB0dXJlLWludGVyY2VwdG9yJyk7XHJcbiAgICAgICAgICAgICAgICAgIGF3bi5vbnByb2Nlc3NvcmVycm9yPShldjpFdmVudCk9PntcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbXNnPSdVbmtud29uIGVycm9yJztcclxuICAgICAgICAgICAgICAgICAgICBpZihldiBpbnN0YW5jZW9mIEVycm9yRXZlbnQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgbXNnPWV2Lm1lc3NhZ2U7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDYXB0dXJlIGF1ZGlvIHdvcmtsZXQgZXJyb3I6IFwiK21zZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5saXN0ZW5lcil7XHJcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVycm9yKG1zZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGxldCBhd25QdCA9IGF3bi5wb3J0O1xyXG4gICAgICAgICAgICAgICAgICBpZiAoYXduUHQpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd25QdC5vbm1lc3NhZ2UgPSAoZXY6IE1lc3NhZ2VFdmVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FwdHVyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkdD1ldi5kYXRhO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hzID0gZHQuY2hzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWRhTGVuID0gZHQuZGF0YS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKERFQlVHX1RSQUNFX0xFVkVMPjgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdSZWNlaXZlZCBkYXRhIGZyb20gd29ya2xldDogJyArY2hzICsgJyAnICsgZHQubGVuICsnIERhdGEgY2hzOiAnK2FkYUxlbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNodW5rID0gbmV3IEFycmF5PEZsb2F0MzJBcnJheT4oY2hzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2FtcGxlcz10aGlzLmZyYW1lc1JlY29yZGVkKmNocztcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoKEF1ZGlvU3RvcmFnZVR5cGUuTUVNX0VOVElSRV9BVVRPX05FVF9DSFVOS0VEPT09dGhpcy5hdWRpb1N0b3JhZ2VUeXBlIHx8IEF1ZGlvU3RvcmFnZVR5cGUuTUVNX0NIVU5LRURfQVVUT19ORVRfQ0hVTktFRD09PXRoaXMuYXVkaW9TdG9yYWdlVHlwZSkgJiYgdGhpcy5kYXRhICYmIHNhbXBsZXM+dGhpcy5fbWF4QXV0b05ldE1lbVN0b3JlU2FtcGxlcyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhPW51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkRhdGEgaW5pdGlhbGl6ZWQ6IFwiKyh0aGlzLmRhdGEhPW51bGwpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoczsgY2grKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkRhdGEgY2ggaW5pdGlhbGl6ZWQ6IFwiKyh0aGlzLmRhdGEgIT1udWxsICYmIHRoaXMuZGF0YVtjaF0gIT1udWxsKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoPHRoaXMuY2hhbm5lbENvdW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHQuZGF0YVtjaF0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZhID0gbmV3IEZsb2F0MzJBcnJheShkdC5kYXRhW2NoXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGEgJiYgdGhpcy5kYXRhW2NoXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVtjaF0ucHVzaChmYSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtbY2hdID0gZmE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBzYW1wbGVzIG9mIGNoYW5uZWwgMCB0byBjb3VudCBmcmFtZXMgKHNhbXBsZXMpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mcmFtZXNSZWNvcmRlZCArPSBmYS5sZW5ndGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYXVkaW9PdXRTdHJlYW0pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hdWRpb091dFN0cmVhbS53cml0ZShjaHVuayk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAvLyBSYW5kb20gdGVzdCBlcnJvcjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmKE1hdGgucmFuZG9tKCk+MC45OCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB0aHJvdyBuZXcgRXJyb3IoJ1Rlc3QnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGVyciBpbnN0YW5jZW9mIEVycm9yKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wZXJzaXN0RXJyb3I9ZXJyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGVyc2lzdEVycm9yPW5ldyBFcnJvcignRXJyb3IgaGFuZGxpbmcgcmVjb3JkZWQgYXVkaW8gZGF0YScpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDYXB0dXJlIGVycm9yOiBcIitlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Y2F0Y2goZXJyMil7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDYXB0dXJlIG5leHQgZXJyb3IgKGlnbm9yZWQpOiBcIitlcnIyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1maW5hbGx5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZXJyRXhwbCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBET01FeGNlcHRpb24pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyckV4cGwgPSAnOiAnICsgZXJyLm5hbWUgKyAnOiAnICsgZXJyLm1lc3NhZ2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZXJyb3IoXCJDb3VsZCBub3QgaGFuZGxlIHJlY29yZGVkIGF1ZGlvIGRhdGFcIiArIGVyckV4cGwsIFwiUGxlYXNlIHRyeSB0byByZWNvcmQgYWdhaW4uXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihBdWRpb1N0b3JhZ2VUeXBlLkRCX0NIVU5LRUQ9PT10aGlzLl9hdWRpb1N0b3JhZ2VUeXBlICYmIHRoaXMuX3BlcnNpc3RlbnRBdWRpb1N0b3JhZ2VUYXJnZXQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgLy8gVHJpZWQgdG8gZml4IHRoYXQgU2FmYXJpIGRvZXMgbm90IHJlY29yZCB0aGUgc2Vjb25kIGNoYW5uZWxcclxuICAgICAgICAgICAgICAgICAgLy8gRG9lcyBub3QgaGVscFxyXG4gICAgICAgICAgICAgICAgICAvL2F3bi5jaGFubmVsQ291bnQ9dGhpcy5jaGFubmVsQ291bnQ7XHJcbiAgICAgICAgICAgICAgICAgIC8vYXduLmNoYW5uZWxDb3VudE1vZGU9J2V4cGxpY2l0JztcclxuICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKCdDaGFubmVsIGNvdW50IGV4cGxpY2l0bHkgc2V0IHRvICcrdGhpcy5jaGFubmVsQ291bnQpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgdGhpcy5idWZmZXJpbmdOb2RlID0gYXduO1xyXG4gICAgICAgICAgICAgICAgICAvL3RoaXMuYnVmZmVyaW5nTm9kZS5jaGFubmVsQ291bnQ9dGhpcy5jaGFubmVsQ291bnQ7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuX29wZW5lZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxpc3RlbmVyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5vcGVuZWQoKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApLmNhdGNoKChlcnJvcjogYW55KT0+e1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDb3VsZCBub3QgYWRkIG1vZHVsZSAnK2Vycm9yKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgfWVsc2UgaWYodGhpcy5jb250ZXh0LmNyZWF0ZVNjcmlwdFByb2Nlc3Nvcikge1xyXG4gICAgICAgICAgICAvLyBUaGUgU2NyaXB0UHJvY2Vzc29yTm9kZSBJbnRlcmZhY2UgLSBERVBSRUNBVEVEIE9ubHkgYXMgZmFsbGJhY2tcclxuICAgICAgICAgICAgLy8gVE9ETyBzaG91bGQgd2UgdXNlIHN0cmVhbUNoYW5uZWxDb3VudCBvciBjaGFubmVsQ291bnQgaGVyZSA/XHJcbiAgICAgICAgICAgIGxldCBzY3JpcHRQcm9jZXNzb3JOb2RlPSB0aGlzLmNvbnRleHQuY3JlYXRlU2NyaXB0UHJvY2Vzc29yKEF1ZGlvQ2FwdHVyZS5CVUZGRVJfU0laRSwgc3RyZWFtQ2hhbm5lbENvdW50LCBzdHJlYW1DaGFubmVsQ291bnQpO1xyXG4gICAgICAgICAgICB0aGlzLmJ1ZmZlcmluZ05vZGU9c2NyaXB0UHJvY2Vzc29yTm9kZTtcclxuICAgICAgICAgICAgbGV0IGMgPSAwO1xyXG4gICAgICAgICAgICBpZihzY3JpcHRQcm9jZXNzb3JOb2RlLm9uYXVkaW9wcm9jZXNzKXtcclxuICAgICAgICAgICAgICBzY3JpcHRQcm9jZXNzb3JOb2RlLm9uYXVkaW9wcm9jZXNzID0gKGU6IEF1ZGlvUHJvY2Vzc2luZ0V2ZW50KSA9PiB7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FwdHVyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgIGxldCBpbkJ1ZmZlciA9IGUuaW5wdXRCdWZmZXI7XHJcbiAgICAgICAgICAgICAgICAgIC8vIG9ubHkgcHJvY2VzcyByZXF1ZXN0ZWQgY291bnQgb2YgY2hhbm5lbHNcclxuICAgICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRCdWZmZXJzID0gbmV3IEFycmF5PEZsb2F0MzJBcnJheT4oY2hhbm5lbENvdW50KTtcclxuICAgICAgICAgICAgICAgICAgZm9yIChsZXQgY2g6IG51bWJlciA9IDA7IGNoIDwgY2hhbm5lbENvdW50OyBjaCsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNoU2FtcGxlcyA9IGluQnVmZmVyLmdldENoYW5uZWxEYXRhKGNoKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY2hTYW1wbGVzQ29weSA9IGNoU2FtcGxlcy5zbGljZSgwKTtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50QnVmZmVyc1tjaF0gPSBjaFNhbXBsZXNDb3B5LnNsaWNlKDApO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuZGF0YSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhW2NoXS5wdXNoKGNoU2FtcGxlc0NvcHkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZihERUJVR19UUkFDRV9MRVZFTD44KXtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXCJQcm9jZXNzIFwiK2NoU2FtcGxlc0NvcHkubGVuZ3RoK1wiIHNhbXBsZXMuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZyYW1lc1JlY29yZGVkICs9IGNoU2FtcGxlc0NvcHkubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIGMrKztcclxuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuYXVkaW9PdXRTdHJlYW0pIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvT3V0U3RyZWFtLndyaXRlKGN1cnJlbnRCdWZmZXJzKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgICAgdGhpcy5fb3BlbmVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5saXN0ZW5lcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5vcGVuZWQoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZXJyb3IoJ0Jyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBhdWRpbyBwcm9jZXNzaW5nIChTY3JpcHRQcm9jZXNzb3Iub25hdWRpb3Byb2Nlc3MgbWV0aG9kIG5vdCBmb3VuZCkhJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVycm9yKCdCcm93c2VyIGRvZXMgbm90IHN1cHBvcnQgYXVkaW8gcHJvY2Vzc2luZyAobmVpdGhlciBBdWRpb1dvcmtsZXRQcm9jZXNzb3Igbm9yIFNjcmlwdFByb2Nlc3NvcikhJyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSwgKGUpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSArIFwiIEVycm9yIG5hbWU6IFwiICtlLm5hbWUpO1xyXG4gICAgICAgICAgaWYgKHRoaXMubGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgaWYoJ05vdEFsbG93ZWRFcnJvcicgPT09IGUubmFtZSl7XHJcbiAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lcnJvcignTm90IGFsbG93ZWQgdG8gdXNlIHlvdXIgbWljcm9waG9uZS4nLCdQbGVhc2UgbWFrZSBzdXJlIHRoYXQgbWljcm9waG9uZSBhY2Nlc3MgaXMgYWxsb3dlZCBmb3IgdGhpcyB3ZWIgcGFnZSBhbmQgcmVsb2FkIHRoZSBwYWdlLicpO1xyXG4gICAgICAgICAgICB9ZWxzZSBpZignTm90UmVhZGFibGVFcnJvcicgPT09IGUubmFtZSl7XHJcbiAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lcnJvcignQ291bGQgbm90IHJlYWQgZnJvbSB5b3VyIGF1ZGlvIGRldmljZS4nLCdQbGVhc2UgbWFrZSBzdXJlIHlvdXIgYXVkaW8gZGV2aWNlIGlzIHdvcmtpbmcuJyk7XHJcbiAgICAgICAgICAgIH1lbHNlIGlmKCdPdmVyY29uc3RyYWluZWRFcnJvcicgPT09IGUubmFtZSl7XHJcbiAgICAgICAgICAgICAgbGV0IGVNc2c9ZS5tc2c/ZS5tc2c6J092ZXJjb25zdHJhaW5lZCBtZWRpYSBkZXZpY2UgcmVxdWVzdCBlcnJvci4nO1xyXG4gICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZXJyb3IoZU1zZyk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lcnJvcigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfc3RhcnQoKXtcclxuICAgIHRoaXMuaW5pdERhdGEoKTtcclxuICAgIGlmICh0aGlzLmF1ZGlvT3V0U3RyZWFtKSB7XHJcbiAgICAgIHRoaXMuYXVkaW9PdXRTdHJlYW0ubmV4dFN0cmVhbSgpXHJcbiAgICB9XHJcbiAgICB0aGlzLmNhcHR1cmluZyA9IHRydWU7XHJcbiAgICBpZih0aGlzLmJ1ZmZlcmluZ05vZGUpIHtcclxuICAgICAgdGhpcy5tZWRpYVN0cmVhbS5jb25uZWN0KHRoaXMuYnVmZmVyaW5nTm9kZSk7XHJcbiAgICAgIHRoaXMuYnVmZmVyaW5nTm9kZS5jb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbik7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5saXN0ZW5lcikge1xyXG4gICAgICB0aGlzLmxpc3RlbmVyLnN0YXJ0ZWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0YXJ0KCkge1xyXG4gICAgY29uc3QgYVN0PXRoaXMuY29udGV4dC5zdGF0ZTtcclxuICAgIGlmKGFTdD09PSdydW5uaW5nJykge1xyXG4gICAgICB0aGlzLl9zdGFydCgpO1xyXG4gICAgfWVsc2V7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJDYXB0dXJlIHN0YXJ0OiBhdWRpbyBjb250ZXh0IG5vdCBydW5uaW5nLCBzdGF0ZTogXCIrYVN0K1wiLCByZXN1bWluZy4uLlwiKTtcclxuICAgICAgdGhpcy5jb250ZXh0LnJlc3VtZSgpLnRoZW4oKCk9PntcclxuICAgICAgICBjb25zb2xlLmRlYnVnKFwiQ2FwdHVyZSBzdGFydDogYXVkaW8gY29udGV4dCByZXN1bWVkLCBzdGFydGluZy4uLlwiKTtcclxuICAgICAgICB0aGlzLl9zdGFydCgpO1xyXG4gICAgICB9KVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3RvcCgpIHtcclxuXHJcbiAgICBpZiAodGhpcy5kaXNjb25uZWN0U3RyZWFtcyAmJiB0aGlzLmJ1ZmZlcmluZ05vZGUpIHtcclxuICAgICAgdGhpcy5tZWRpYVN0cmVhbS5kaXNjb25uZWN0KHRoaXMuYnVmZmVyaW5nTm9kZSk7XHJcbiAgICAgIHRoaXMuYnVmZmVyaW5nTm9kZS5kaXNjb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKHRoaXMuYXVkaW9PdXRTdHJlYW0pIHtcclxuICAgICAgICB0aGlzLmF1ZGlvT3V0U3RyZWFtLmZsdXNoKCk7XHJcbiAgICAgIH1cclxuICAgIH1jYXRjaChlcnIpe1xyXG4gICAgICBjb25zb2xlLmVycm9yKFwiQ291bGQgbm90IGZsdXNoIGNhcHR1cmUgc3RyZWFtLlwiKTtcclxuICAgICB0aHJvdyBlcnI7XHJcbiAgICB9ZmluYWxseSB7XHJcbiAgICAgIHRoaXMuY2FwdHVyaW5nID0gZmFsc2U7XHJcbiAgICAgIGlmICh0aGlzLmluZGRiQXVkaW9CdWZmZXIgJiYgdGhpcy5wZXJzaXN0RXJyb3IpIHtcclxuICAgICAgICAvLyBEZWxldGUgaW52YWxpZCBwZXJzaXN0ZW50IGF1ZGlvIGRhdGEgYW5kIGhvcGUgdGhhdCBpdCB3aWxsIGJlIGNvbXBsZXRlbHkgdXBsb2FkZWQgdG8gdGhlIHNlcnZlclxyXG4gICAgICAgIHRoaXMuaW5kZGJBdWRpb0J1ZmZlci5yZWxlYXNlQXVkaW9EYXRhKCk7XHJcbiAgICAgICAgdGhpcy5pbmRkYkF1ZGlvQnVmZmVyID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5saXN0ZW5lciAmJiAodGhpcy5wZXJzaXN0RXJyb3IgfHwgdGhpcy5wZXJzaXN0ZWQpKSB7XHJcbiAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiU3RvcHBlZCBieSBzdG9wKCkgbWV0aG9kIGNhbGxcIik7XHJcbiAgICAgICAgdGhpcy5saXN0ZW5lci5zdG9wcGVkKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICBzdG9yZSgpe1xyXG4gICAvLyBpZih0aGlzLmRiICYmIHRoaXMucmVjVVVJRCl7XHJcbiAgIC8vICAgIGxldCB0cj0gdGhpcy5kYi50cmFuc2FjdGlvbihTcHJEYi5SRUNPUkRJTkdfRklMRV9DSFVOS1NfT0JKRUNUX1NUT1JFX05BTUUsICdyZWFkd3JpdGUnKTtcclxuICAgLy8gICAgbGV0IHJlY0ZpbGVPYmpTdG9yZSA9IHRyLm9iamVjdFN0b3JlKFNwckRiLlJFQ09SRElOR19GSUxFX0NIVU5LU19PQkpFQ1RfU1RPUkVfTkFNRSk7XHJcbiAgIC8vXHJcbiAgIC8vICAgICAgdHJ5IHtcclxuICAgLy8gICAgICAgIGxldCBjaDBEYXRhPXRoaXMuZGF0YVswXTtcclxuICAgLy8gICAgICAgIGxldCBkYXRhQ2hrQ250PWNoMERhdGEubGVuZ3RoO1xyXG4gICAvLyAgICAgICAgICBsZXQgcG9zID0gMDtcclxuICAgLy8gICAgICAgICAgZm9yIChsZXQgY2hDa0lkeCA9IDA7IGNoQ2tJZHggPCBkYXRhQ2hrQ250OyBjaENrSWR4KyspIHtcclxuICAgLy8gICAgICAgICAgICBsZXQgYnVmTGVuPTA7XHJcbiAgIC8vICAgICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IHRoaXMuY2hhbm5lbENvdW50OyBjaCsrKSB7XHJcbiAgIC8vICAgICAgICAgICAgICBsZXQgY2hDaGsgPSB0aGlzLmRhdGFbY2hdW2NoQ2tJZHhdO1xyXG4gICAvLyAgICAgICAgICAgICAgYnVmTGVuID0gY2hDaGsubGVuZ3RoO1xyXG4gICAvLyAgICAgICAgICAgICAgLy9sZXQgY2FjaGVJZCA9IHV1aWQgKyAnXycgKyBjaCArICdfJyArIGNoQ2tJZHg7XHJcbiAgIC8vICAgICAgICAgICAgICBsZXQgY2hrRGJJZCA9IFt0aGlzLnJlY1VVSUQsIHRoaXMuaW5kRGJDaGtJZHggKyBjaENrSWR4LCBjaF07XHJcbiAgIC8vICAgICAgICAgICAgICBsZXQgY3IgPSByZWNGaWxlT2JqU3RvcmUuYWRkKGNoQ2hrLCBjaGtEYklkKTtcclxuICAgLy8gICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkFkZGVkOiBcIitjaCtcIiBcIisodGhpcy5pbmREYkNoa0lkeCtjaENrSWR4KSk7XHJcbiAgIC8vICAgICAgICAgICAgICBjci5vbnN1Y2Nlc3M9KCk9PntcclxuICAgLy8gICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiU3RvcmVkIGF1ZGlvIGRhdGEgdG8gaW5kZXhlZCBkYlwiKTtcclxuICAgLy8gICAgICAgICAgICAgIH1cclxuICAgLy8gICAgICAgICAgICAgIGNyLm9uZXJyb3I9KCk9PntcclxuICAgLy8gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHN0b3JpbmcgYXVkaW8gZGF0YSB0byBpbmRleGVkIGRiXCIpO1xyXG4gICAvLyAgICAgICAgICAgICAgfVxyXG4gICAvLyAgICAgICAgICAgIH1cclxuICAgLy8gICAgICAgICAgICBwb3MgKz0gYnVmTGVuO1xyXG4gICAvLyAgICAgICAgfVxyXG4gICAvLyAgICAgICAgdGhpcy5pbmREYkNoa0lkeCs9ZGF0YUNoa0NudDtcclxuICAgLy9cclxuICAgLy8gICAgICAgIHRyLm9uZXJyb3IgPSAoZXJyKSA9PiB7XHJcbiAgIC8vICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBjYWNoZSBhdWRpbyBkYXRhIHRvIGluZGV4ZWQgZGI6ICcgKyBlcnIpXHJcbiAgIC8vICAgICAgICB9XHJcbiAgIC8vICAgICAgICB0ci5vbmNvbXBsZXRlID0gKCkgPT4ge1xyXG4gICAvLyAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoJ1RyYW5zZmVycmVkIGNhcHR1cmUgYXVkaW8gZGF0YSB0byBpbmRleGVkIGRiLCBkZWxldGluZyBvcmlnaW5hbCBkYXRhIGZyb20gbWVtb3J5Li4uJyk7XHJcbiAgIC8vXHJcbiAgIC8vICAgICAgICAgIC8vLyBBdWRpbyBkYXRhIHNhdmVkIHRvIGluZGV4IGRiIGRlbGV0ZSBmcm9tIGluIG1lbW9yeSBkYXRhIGFycmF5XHJcbiAgIC8vICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCB0aGlzLmNoYW5uZWxDb3VudDsgY2grKykge1xyXG4gICAvLyAgICAgICAgICAgdGhpcy5kYXRhW2NoXS5zcGxpY2UoMCk7XHJcbiAgIC8vICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiU3BsaWNlZC9yZW1vdmVkIGNoOiBcIitjaCk7XHJcbiAgIC8vICAgICAgICAgIH1cclxuICAgLy9cclxuICAgLy8gICAgICAgICAgdGhpcy5wZXJzaXN0ZWQ9dHJ1ZTtcclxuICAgLy8gICAgICAgICAgaWYodGhpcy5saXN0ZW5lciAmJiAhdGhpcy5jYXB0dXJpbmcpe1xyXG4gICAvLyAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlN0b3BwZWQgYnkgaW5kZXhlZCBkYiBob29rXCIpO1xyXG4gICAvLyAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuc3RvcHBlZCgpO1xyXG4gICAvLyAgICAgICAgICB9XHJcbiAgIC8vICAgICAgICB9XHJcbiAgIC8vICAgICAgICAvLyBDb21taXQgY2h1bmtzXHJcbiAgIC8vICAgICAgICB0aGlzLnBlcnNpc3RlZD1mYWxzZTtcclxuICAgLy8gICAgICAgIHRyLmNvbW1pdCgpO1xyXG4gICAvLyAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAvLyAgICAgICAgY29uc29sZS5lcnJvcignVHJhbnNmZXIgY2FwdHVyZSBhdWRpbyBkYXRhIGVycm9yOiAnK2Vycik7XHJcbiAgIC8vICAgICAgfVxyXG4gICAvLyAgICB9XHJcblxyXG4gICAgLy8gaWYoIXRoaXMuaW5kZGJBdWRpb0J1ZmZlciAmJiB0aGlzLl9wZXJzaXN0ZW50QXVkaW9TdG9yYWdlVGFyZ2V0ICYmIHRoaXMucmVjVVVJRCkge1xyXG4gICAgLy8gICB0aGlzLmluZGRiQXVkaW9CdWZmZXIgPSBuZXcgSW5kZXhlZERiQXVkaW9CdWZmZXIodGhpcy5fcGVyc2lzdGVudEF1ZGlvU3RvcmFnZVRhcmdldCwgdGhpcy5jaGFubmVsQ291bnQsdGhpcy5jdXJyZW50U2FtcGxlUmF0ZSxBdWRpb0NhcHR1cmUuQlVGRkVSX1NJWkUsMCx0aGlzLnJlY1VVSUQpXHJcbiAgICAvLyB9XHJcbiAgICBpZih0aGlzLmluZGRiQXVkaW9CdWZmZXIgJiYgdGhpcy5kYXRhKXtcclxuXHJcbiAgICAgIC8vIFRyeSB0byBhcHBlbmQgdG9cclxuICAgICAgdGhpcy5pbmRkYkF1ZGlvQnVmZmVyLmFwcGVuZFJhd0F1ZGlvRGF0YSh0aGlzLmRhdGEpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZygnVHJhbnNmZXJyZWQgY2FwdHVyZSBhdWRpbyBkYXRhIHRvIGluZGV4ZWQgZGIsIGRlbGV0aW5nIG9yaWdpbmFsIGRhdGEgZnJvbSBtZW1vcnkuLi4nKTtcclxuXHJcbiAgICAgICAgICAvLy8gQXVkaW8gZGF0YSBzYXZlZCB0byBpbmRleCBkYiBkZWxldGUgZnJvbSBpbiBtZW1vcnkgZGF0YSBhcnJheVxyXG4gICAgICAgICAgaWYodGhpcy5kYXRhKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCB0aGlzLmNoYW5uZWxDb3VudDsgY2grKykge1xyXG4gICAgICAgICAgICAgIHRoaXMuZGF0YVtjaF0uc3BsaWNlKDApO1xyXG4gICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlNwbGljZWQvcmVtb3ZlZCBjaDogXCIrY2gpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnBlcnNpc3RlZCA9IHRydWU7XHJcbiAgICAgICAgICBpZiAodGhpcy5saXN0ZW5lciAmJiAhdGhpcy5jYXB0dXJpbmcpIHtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiU3RvcHBlZCBieSBpbmRleGVkIGRiIGhvb2tcIik7XHJcbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuc3RvcHBlZCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sZXJyb3I6KGVycik9PntcclxuICAgICAgICAgIC8vIE9ubHkgbG9nIHRoZSBmaXJzdCBlcnJvclxyXG4gICAgICAgICAgaWYoIXRoaXMucGVyc2lzdEVycm9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMucGVyc2lzdEVycm9yID0gZXJyO1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgcGVyc2lzdGluZyBhdWRpbyBkYXRhOiBcIiArIGVycik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgdGhpcy5wZXJzaXN0ZWQ9ZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgY2xvc2UoKSB7XHJcbiAgICB0aGlzLm1lZGlhU3RyZWFtLmRpc2Nvbm5lY3QoKTtcclxuICAgIGlmICh0aGlzLnN0cmVhbSkge1xyXG4gICAgICBjb25zdCBtdHMgPSB0aGlzLnN0cmVhbS5nZXRUcmFja3MoKTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtdHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBtdHNbaV0uc3RvcCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLl9vcGVuZWQ9ZmFsc2U7XHJcbiAgfVxyXG5cclxuICBhdWRpb0J1ZmZlcigpOiBBdWRpb0J1ZmZlciB8bnVsbHtcclxuICAgIGxldCBhYjogQXVkaW9CdWZmZXJ8bnVsbD1udWxsO1xyXG4gICAgaWYodGhpcy5kYXRhKSB7XHJcbiAgICAgIGxldCBmcmFtZUxlbjogbnVtYmVyID0gMDtcclxuXHJcbiAgICAgIGxldCBjaDBEYXRhID0gdGhpcy5kYXRhWzBdO1xyXG5cclxuICAgICAgZm9yIChsZXQgY2gwQ2hrIG9mIGNoMERhdGEpIHtcclxuICAgICAgICBmcmFtZUxlbiArPSBjaDBDaGsubGVuZ3RoO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGFiID0gdGhpcy5jb250ZXh0LmNyZWF0ZUJ1ZmZlcih0aGlzLmNoYW5uZWxDb3VudCwgZnJhbWVMZW4sIHRoaXMuY29udGV4dC5zYW1wbGVSYXRlKTtcclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgaWYgKGVyci5uYW1lID09PSAnTm90U3VwcG9ydGVkRXJyb3InKSB7XHJcbiAgICAgICAgICAgIGlmIChmcmFtZUxlbiA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgLy8gRW1wdHkgYnVmZmVycyBhcmUgbm90IHN1cHBvcnRlZCBieSBDaHJvbWl1bVxyXG4gICAgICAgICAgICAgIC8vIENyZWF0ZSBkdW1teSBidWZmZXIgd2l0aCBvbmUgc2FtcGxlXHJcbiAgICAgICAgICAgICAgYWIgPSB0aGlzLmNvbnRleHQuY3JlYXRlQnVmZmVyKHRoaXMuY2hhbm5lbENvdW50LCAxLCB0aGlzLmNvbnRleHQuc2FtcGxlUmF0ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChlcnIgaW5zdGFuY2VvZiBSYW5nZUVycm9yKSB7XHJcbiAgICAgICAgICAvLyBPdXQgb2YgbWVtb3J5XHJcbiAgICAgICAgICAvLyBUT0RPIFdoYXQgdG8gZG8gPz9cclxuICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgdGhpcy5jaGFubmVsQ291bnQ7IGNoKyspIHtcclxuICAgICAgICBsZXQgY2hEID0gYWIuZ2V0Q2hhbm5lbERhdGEoY2gpO1xyXG4gICAgICAgIGxldCBwb3MgPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGNoQ2hrIG9mIHRoaXMuZGF0YVtjaF0pIHtcclxuICAgICAgICAgIGxldCBidWZMZW4gPSBjaENoay5sZW5ndGg7XHJcbiAgICAgICAgICBjaEQuc2V0KGNoQ2hrLCBwb3MpO1xyXG4gICAgICAgICAgcG9zICs9IGJ1ZkxlbjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBhYjtcclxuICB9XHJcblxyXG4gIGF1ZGlvQnVmZmVyQXJyYXkoKTpBcnJheUF1ZGlvQnVmZmVyfG51bGx7XHJcbiAgICAgIGxldCBhcnJBYjpBcnJheUF1ZGlvQnVmZmVyfG51bGw9bnVsbDtcclxuICAgICAgaWYodGhpcy5kYXRhKSB7XHJcbiAgICAgICAgYXJyQWI9bmV3IEFycmF5QXVkaW9CdWZmZXIodGhpcy5jaGFubmVsQ291bnQsIHRoaXMuY3VycmVudFNhbXBsZVJhdGUsIHRoaXMuZGF0YSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGFyckFiO1xyXG4gIH1cclxuXHJcbiAgaW5kZGJBdWRpb0J1ZmZlckFycmF5KCk6SW5kZXhlZERiQXVkaW9CdWZmZXJ8bnVsbHtcclxuICAgIGlmKHRoaXMucGVyc2lzdEVycm9yKXtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9ZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluZGRiQXVkaW9CdWZmZXI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbn1cclxuXHJcbiJdfQ==
817
+ AudioCapture.captureInterceptorModuleRegistered = false;
818
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FwdHVyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9hdWRpby9jYXB0dXJlL2NhcHR1cmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQXlCLFFBQVEsSUFBSSxXQUFXLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUN0SCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDdkMsT0FBTyxFQUFDLG9CQUFvQixFQUErQixNQUFNLHVCQUF1QixDQUFDO0FBR3pGLE1BQU0sQ0FBQyxNQUFNLDBDQUEwQyxHQUFDLEtBQUssQ0FBQztBQUU5RCxNQUFNLGlCQUFpQixHQUFDLENBQUMsQ0FBQztBQUUxQixnQ0FBZ0M7QUFDaEMsd0RBQXdEO0FBQ3hELE1BQU0sTUFBTSxHQUFDLHlFQUF5RTtJQUNsRixJQUFJO0lBQ0osMkJBQTJCO0lBQzNCLDhCQUE4QjtJQUM5QixxRUFBcUU7SUFDckUsb0JBQW9CO0lBQ3BCLG9CQUFvQjtJQUNwQix5QkFBeUI7SUFDekIsdUJBQXVCO0lBQ3ZCLG9CQUFvQjtJQUNwQixJQUFJO0lBQ0osU0FBUztJQUNULElBQUk7SUFDSixhQUFhO0lBQ2IsaUJBQWlCO0lBQ2pCLGtCQUFrQjtJQUNsQixvQkFBb0I7SUFDcEIsUUFBUTtJQUNSLElBQUk7SUFDSixxQ0FBcUM7SUFDckMsNEJBQTRCO0lBQzVCLHdCQUF3QjtJQUN4Qiw2QkFBNkI7SUFDN0IsMEJBQTBCO0lBQzFCLG9DQUFvQztJQUNwQywwQ0FBMEM7SUFDMUMsb0NBQW9DO0lBQ3BDLHlDQUF5QztJQUN6QywyQ0FBMkM7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LEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQ3BCLEdBQUcsSUFBSSxNQUFNLENBQUM7aUJBQ2Y7YUFDRjtTQUNGO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsZ0JBQWdCO1FBQ1osSUFBSSxLQUFLLEdBQXVCLElBQUksQ0FBQztRQUNyQyxJQUFHLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDWixLQUFLLEdBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDbEY7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQscUJBQXFCO1FBQ25CLElBQUcsSUFBSSxDQUFDLFlBQVksRUFBQztZQUNuQixPQUFPLElBQUksQ0FBQztTQUNiO2FBQUs7WUFDSixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztTQUM5QjtJQUNILENBQUM7O0FBNXZCTSx3QkFBVyxHQUFXLElBQUksQ0FBQztBQUNWLG1EQUFzQyxHQUFRLE9BQU8sR0FBQyxDQUFDLENBQUMsQ0FBQyw0QkFBNEI7QUFFOUYsK0NBQWtDLEdBQUMsS0FBSyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtTZXF1ZW5jZUF1ZGlvRmxvYXQzMk91dFN0cmVhbX0gZnJvbSBcIi4uL2lvL3N0cmVhbVwiO1xyXG5pbXBvcnQge0Jyb3dzZXIsIFBsYXRmb3JtLCBVc2VyQWdlbnRCdWlsZGVyfSBmcm9tIFwiLi4vLi4vdXRpbHMvdWEtcGFyc2VyXCI7XHJcblxyXG5pbXBvcnQge0F1ZGlvU3RvcmFnZVR5cGUsIEF1dG9HYWluQ29udHJvbENvbmZpZywgUGxhdGZvcm0gYXMgQ2ZnUGxhdGZvcm19IGZyb20gXCIuLi8uLi9zcGVlY2hyZWNvcmRlci9wcm9qZWN0L3Byb2plY3RcIjtcclxuaW1wb3J0IHtBcnJheUF1ZGlvQnVmZmVyfSBmcm9tIFwiLi4vYXJyYXlfYXVkaW9fYnVmZmVyXCI7XHJcbmltcG9ydCB7VVVJRH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzXCI7XHJcbmltcG9ydCB7SW5kZXhlZERiQXVkaW9CdWZmZXIsIFBlcnNpc3RlbnRBdWRpb1N0b3JhZ2VUYXJnZXR9IGZyb20gXCIuLi9pbmRkYl9hdWRpb19idWZmZXJcIjtcclxuXHJcblxyXG5leHBvcnQgY29uc3QgQ0hST01FX0FDVElWQVRFX0VDSE9fQ0FOQ0VMTEFUSU9OX1dJVEhfQUdDPWZhbHNlO1xyXG5cclxuY29uc3QgREVCVUdfVFJBQ0VfTEVWRUw9MDtcclxuXHJcbi8vIERpcnR5IHdheSB0byBsb2FkIHRoaXMgbW9kdWxlXHJcbi8vIENvcHkgY29udGVudCBvZiBpbnRlcmNlcHRvcl93b3JrbGV0LmpzIHRvIHRoaXMgc3RyaW5nXHJcbmNvbnN0IGF3cFN0cj1cImNsYXNzIEF1ZGlvQ2FwdHVyZUludGVyY2VwdG9yUHJvY2Vzc29yIGV4dGVuZHMgQXVkaW9Xb3JrbGV0UHJvY2Vzc29ye1xcblwiICtcclxuICAgIFwiXFxuXCIgK1xyXG4gICAgXCIgICAgQlVGRkVSX1FVQU5UVU1TPTY0O1xcblwiICtcclxuICAgIFwiICAgIFFVQU5UVU1fRlJBTUVfTEVOPTEyODtcXG5cIiArXHJcbiAgICBcIiAgICBCVUZGRVJfRlJBTUVfTEVOPXRoaXMuUVVBTlRVTV9GUkFNRV9MRU4qdGhpcy5CVUZGRVJfUVVBTlRVTVM7XFxuXCIgK1xyXG4gICAgXCIgICAgYnVmZmVyPW51bGw7XFxuXCIgK1xyXG4gICAgXCIgICAgYnVmZmVyUG9zPTA7XFxuXCIgK1xyXG4gICAgXCIgICAgYnVmZmVyUG9zQnl0ZXM9MDtcXG5cIiArXHJcbiAgICBcIiAgICBjb25zdHJ1Y3RvcigpIHtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgc3VwZXIoKTtcXG5cIiArXHJcbiAgICBcIlxcblwiICtcclxuICAgIFwiICAgIH1cXG5cIiArXHJcbiAgICBcIlxcblwiICtcclxuICAgIFwiIHByb2Nlc3MoXFxuXCIgK1xyXG4gICAgXCIgICAgICBpbnB1dHMsXFxuXCIgK1xyXG4gICAgXCIgICAgICBvdXRwdXRzLFxcblwiICtcclxuICAgIFwiICAgICAgcGFyYW1ldGVyc1xcblwiICtcclxuICAgIFwiICApe1xcblwiICtcclxuICAgIFwiXFxuXCIgK1xyXG4gICAgXCIgICAgIGxldCBpbnB1dHNDbnQ9aW5wdXRzLmxlbmd0aDtcXG5cIiArXHJcbiAgICBcIiAgICAgbGV0IGNoYW5uZWxDb3VudD0wO1xcblwiICtcclxuICAgIFwiICAgICBsZXQgaW5wdXRMZW49MDtcXG5cIiArXHJcbiAgICBcIiAgICAgbGV0IGlucHV0TGVuQnl0ZXM9MDtcXG5cIiArXHJcbiAgICBcIiAgICAgaWYoaW5wdXRzQ250PjApIHtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIGxldCBpbnB1dDAgPSBpbnB1dHNbMF07XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICBjaGFubmVsQ291bnQgPSBpbnB1dDAubGVuZ3RoO1xcblwiICtcclxuICAgIFwiICAgICAgICAgaWYgKGNoYW5uZWxDb3VudCA+IDApIHtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICBsZXQgaW5wdXQwY2gwPWlucHV0MFswXTtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICBpbnB1dExlbj1pbnB1dDBjaDAubGVuZ3RoO1xcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIGlucHV0TGVuQnl0ZXM9aW5wdXQwY2gwLmJ1ZmZlci5sZW5ndGg7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICB9XFxuXCIgK1xyXG4gICAgXCIgICAgIH1cXG5cIiArXHJcbiAgICBcIiAgICAgaWYgKCF0aGlzLmJ1ZmZlciB8fCB0aGlzLmJ1ZmZlci5sZW5ndGggPCBjaGFubmVsQ291bnQpIHtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIHRoaXMuYnVmZmVyID0gbmV3IEFycmF5KGNoYW5uZWxDb3VudCk7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICB0aGlzLmJ1ZmZlclBvcyA9IDBcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIGZvciAobGV0IGJjaCA9IDA7IGJjaCA8IGNoYW5uZWxDb3VudDsgYmNoKyspIHtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICB0aGlzLmJ1ZmZlcltiY2hdID0gbmV3IEZsb2F0MzJBcnJheSh0aGlzLkJVRkZFUl9GUkFNRV9MRU4pO1xcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIHRoaXMuYnVmZmVyUG9zID0gMDtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICB0aGlzLmJ1ZmZlclBvc0J5dGVzPTA7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICB9XFxuXCIgK1xyXG4gICAgXCIgICAgIH1cXG5cIiArXHJcbiAgICBcIiAgICAgbGV0IGJ1ZkF2YWlsID0gdGhpcy5CVUZGRVJfRlJBTUVfTEVOIC0gdGhpcy5idWZmZXJQb3M7XFxuXCIgK1xyXG4gICAgXCIgICAgIC8vIGNoZWNrIGlmIGJ1ZmZlciBoYXMgdG8gYmUgdHJhbnNmZXJyZWRcXG5cIiArXHJcbiAgICBcIiAgICAgaWYgKGlucHV0TGVuID4gYnVmQXZhaWwpIHtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIGxldCBhZGE9bmV3IEFycmF5KGNoYW5uZWxDb3VudCk7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgY2hhbm5lbENvdW50OyBjaCsrKSB7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgYWRhW2NoXT10aGlzLmJ1ZmZlcltjaF0uYnVmZmVyLnNsaWNlKDApO1xcblwiICtcclxuICAgIFwiICAgICAgICAgfVxcblwiICtcclxuICAgIFwiICAgICAgICAgdGhpcy5wb3J0LnBvc3RNZXNzYWdlKHtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgICAgICBkYXRhOiBhZGEsXFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgY2hzOiBjaGFubmVsQ291bnQsXFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgbGVuOiB0aGlzLmJ1ZmZlclBvc1xcblwiICtcclxuICAgIFwiICAgICAgICAgfSwgYWRhKTtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIC8vIGJ1ZmZlciB0cmFuc2ZlcnJlZCwgcmVzZXRcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIHRoaXMuYnVmZmVyUG9zID0gMDtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIHRoaXMuYnVmZmVyUG9zQnl0ZXM9MDtcXG5cIiArXHJcbiAgICBcIiAgICAgfVxcblwiICtcclxuICAgIFwiXFxuXCIgK1xyXG4gICAgXCIgICAgIGZvcihsZXQgaWk9MDtpaTxpbnB1dHNDbnQ7aWkrKykge1xcblwiICtcclxuICAgIFwiICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoYW5uZWxDb3VudDsgY2grKykge1xcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIC8vIE11dGUgb3V0cHV0c1xcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIC8vb3V0cHV0c1tpaV1bY2hdLmZpbGwoMCk7XFxuXCIgK1xyXG4gICAgXCIgICAgICAgICAgICAgbGV0IGNoU2FtcGxlcyA9IGlucHV0c1tpaV1bY2hdO1xcblwiICtcclxuICAgIFwiICAgICAgICAgICAgIHRoaXMuYnVmZmVyW2NoXS5zZXQoY2hTYW1wbGVzLHRoaXMuYnVmZmVyUG9zKTtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIH1cXG5cIiArXHJcbiAgICBcIiAgICAgICAgIHRoaXMuYnVmZmVyUG9zKz1pbnB1dExlbjtcXG5cIiArXHJcbiAgICBcIiAgICAgICAgIHRoaXMuYnVmZmVyUG9zQnl0ZXMrPWlucHV0TGVuQnl0ZXM7XFxuXCIgK1xyXG4gICAgXCIgICAgIH1cXG5cIiArXHJcbiAgICBcIiAgICBcXG5cIiArXHJcbiAgICBcIiAgICAgcmV0dXJuIHRydWU7XFxuXCIgK1xyXG4gICAgXCIgIH1cXG5cIiArXHJcbiAgICBcIn1cXG5cIiArXHJcbiAgICBcIlxcblwiICtcclxuICAgIFwicmVnaXN0ZXJQcm9jZXNzb3IoJ2NhcHR1cmUtaW50ZXJjZXB0b3InLEF1ZGlvQ2FwdHVyZUludGVyY2VwdG9yUHJvY2Vzc29yKTtcXG5cIjtcclxuXHJcblxyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaW9DYXB0dXJlTGlzdGVuZXIge1xyXG4gIG9wZW5lZCgpOiB2b2lkO1xyXG5cclxuICBzdGFydGVkKCk6IHZvaWQ7XHJcblxyXG4gIHN0b3BwZWQoKTogdm9pZDtcclxuXHJcbiAgY2xvc2VkKCk6IHZvaWQ7XHJcblxyXG4gIGVycm9yKG1zZz86c3RyaW5nLGFkdmljZT86c3RyaW5nKTogdm9pZDtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEF1ZGlvQ2FwdHVyZSB7XHJcblxyXG4gIGdldCBtYXhBdXRvTmV0TWVtU3RvcmVTYW1wbGVzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fbWF4QXV0b05ldE1lbVN0b3JlU2FtcGxlcztcclxuICB9XHJcblxyXG4gIHNldCBtYXhBdXRvTmV0TWVtU3RvcmVTYW1wbGVzKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIHRoaXMuX21heEF1dG9OZXRNZW1TdG9yZVNhbXBsZXMgPSB2YWx1ZTtcclxuICB9XHJcbiAgc2V0IHJlY1VVSUQodmFsdWU6IHN0cmluZ3xudWxsKSB7XHJcbiAgICB0aGlzLl9yZWNVVUlEID0gdmFsdWU7XHJcbiAgfVxyXG4gIGdldCByZWNVVUlEKCk6IHN0cmluZyB8bnVsbHtcclxuICAgIHJldHVybiB0aGlzLl9yZWNVVUlEO1xyXG4gIH1cclxuICBnZXQgYXVkaW9TdG9yYWdlVHlwZSgpOiBBdWRpb1N0b3JhZ2VUeXBlIHtcclxuICAgIHJldHVybiB0aGlzLl9hdWRpb1N0b3JhZ2VUeXBlO1xyXG4gIH1cclxuXHJcbiAgc2V0IGF1ZGlvU3RvcmFnZVR5cGUodmFsdWU6IEF1ZGlvU3RvcmFnZVR5cGUpIHtcclxuICAgIHRoaXMuX2F1ZGlvU3RvcmFnZVR5cGUgPSB2YWx1ZTtcclxuICB9XHJcbiAgZ2V0IHBlcnNpc3RlbnRBdWRpb1N0b3JhZ2VUYXJnZXQoKTogUGVyc2lzdGVudEF1ZGlvU3RvcmFnZVRhcmdldCB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BlcnNpc3RlbnRBdWRpb1N0b3JhZ2VUYXJnZXQ7XHJcbiAgfVxyXG5cclxuICBzZXQgcGVyc2lzdGVudEF1ZGlvU3RvcmFnZVRhcmdldCh2YWx1ZTogUGVyc2lzdGVudEF1ZGlvU3RvcmFnZVRhcmdldCB8IG51bGwpIHtcclxuICAgIHRoaXMuX3BlcnNpc3RlbnRBdWRpb1N0b3JhZ2VUYXJnZXQgPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIGdldCBvcGVuZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3BlbmVkO1xyXG4gIH1cclxuXHJcbiAgc3RhdGljIEJVRkZFUl9TSVpFOiBudW1iZXIgPSA4MTkyO1xyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERFRkFVTFRfTUFYX05FVF9BVVRPX01FTV9TVE9SRV9TQU1QTEVTOm51bWJlcj0yODgwMDAwKjU7IC8vIERlZmF1bHQgNSBtaW51dGUgYXQgNDhrSHpcclxuICBwcml2YXRlIF9tYXhBdXRvTmV0TWVtU3RvcmVTYW1wbGVzOm51bWJlcj1BdWRpb0NhcHR1cmUuREVGQVVMVF9NQVhfTkVUX0FVVE9fTUVNX1NUT1JFX1NBTVBMRVM7XHJcbiAgcHJpdmF0ZSBzdGF0aWMgY2FwdHVyZUludGVyY2VwdG9yTW9kdWxlUmVnaXN0ZXJlZD1mYWxzZTtcclxuICBjb250ZXh0OiBBdWRpb0NvbnRleHQ7XHJcbiAgc3RyZWFtITogTWVkaWFTdHJlYW07XHJcbiAgY2hhbm5lbENvdW50ITogbnVtYmVyO1xyXG4gIHByaXZhdGUgX3JlY1VVSUQ6c3RyaW5nfG51bGw9bnVsbDtcclxuICBtZWRpYVN0cmVhbTogYW55O1xyXG4gIGFnY1N0YXR1czpib29sZWFufG51bGw9bnVsbDtcclxuICBidWZmZXJpbmdOb2RlOiBBdWRpb05vZGV8bnVsbD1udWxsO1xyXG4gIGxpc3RlbmVyITogQXVkaW9DYXB0dXJlTGlzdGVuZXI7XHJcbiAgZGF0YTogQXJyYXk8QXJyYXk8RmxvYXQzMkFycmF5Pj58bnVsbD1udWxsO1xyXG4gIGN1cnJlbnRTYW1wbGVSYXRlITogbnVtYmVyO1xyXG4gIG46IE5hdmlnYXRvcjtcclxuICBhdWRpb091dFN0cmVhbTogU2VxdWVuY2VBdWRpb0Zsb2F0MzJPdXRTdHJlYW0gfCBudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSBkaXNjb25uZWN0U3RyZWFtcyA9IHRydWU7XHJcbiAgcHJpdmF0ZSBfb3BlbmVkPWZhbHNlO1xyXG4gIHByaXZhdGUgY2FwdHVyaW5nID0gZmFsc2U7XHJcblxyXG4gIGZyYW1lc1JlY29yZGVkOiBudW1iZXI9MDtcclxuXHJcbiAgcHJpdmF0ZSBfYXVkaW9TdG9yYWdlVHlwZTpBdWRpb1N0b3JhZ2VUeXBlPUF1ZGlvU3RvcmFnZVR5cGUuTUVNX0VOVElSRTtcclxuICBwcml2YXRlIF9wZXJzaXN0ZW50QXVkaW9TdG9yYWdlVGFyZ2V0OlBlcnNpc3RlbnRBdWRpb1N0b3JhZ2VUYXJnZXR8bnVsbD1udWxsO1xyXG5cclxuICBwcml2YXRlIHBlcnNpc3RlZD10cnVlO1xyXG4gIHByaXZhdGUgcGVyc2lzdEVycm9yOkVycm9yfG51bGw9bnVsbDtcclxuICBwcml2YXRlIGluZGRiQXVkaW9CdWZmZXI6SW5kZXhlZERiQXVkaW9CdWZmZXJ8bnVsbD1udWxsO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb250ZXh0OiBBdWRpb0NvbnRleHQpIHtcclxuICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XHJcbiAgICB0aGlzLm4gPSBuYXZpZ2F0b3I7XHJcbiAgICB0aGlzLmNvbnRleHQuYWRkRXZlbnRMaXN0ZW5lcignc3RhdGVjaGFuZ2UnLCAoZXYpID0+IHtcclxuICAgICAgaWYgKHRoaXMuY29udGV4dC5zdGF0ZSAhPT0gJ3J1bm5pbmcnKSB7XHJcbiAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5pdERhdGEoKSB7XHJcbiAgICBpZighdGhpcy5fcmVjVVVJRCkge1xyXG4gICAgICB0aGlzLl9yZWNVVUlEID0gVVVJRC5nZW5lcmF0ZSgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wZXJzaXN0RXJyb3I9bnVsbDtcclxuICAgIC8vY29uc29sZS5kZWJ1ZyhcIkF1ZGlvIGNhcHR1cmUgaW5pdGlhbGl6ZSBzdG9yYWdlIGZvciB0eXBlOiBcIit0aGlzLl9hdWRpb1N0b3JhZ2VUeXBlKTtcclxuICAgIGlmKEF1ZGlvU3RvcmFnZVR5cGUuREJfQ0hVTktFRCA9PT0gdGhpcy5fYXVkaW9TdG9yYWdlVHlwZSAmJiB0aGlzLl9wZXJzaXN0ZW50QXVkaW9TdG9yYWdlVGFyZ2V0ICYmIHRoaXMuX3JlY1VVSUQpIHtcclxuICAgICAgLy9jb25zb2xlLmRlYnVnKFwiQ3JlYXRlIGluZGV4ZWQgZGIgYXVkaW8gYnVmZmVyLlwiKTtcclxuICAgICAgdGhpcy5pbmRkYkF1ZGlvQnVmZmVyID0gbmV3IEluZGV4ZWREYkF1ZGlvQnVmZmVyKHRoaXMuX3BlcnNpc3RlbnRBdWRpb1N0b3JhZ2VUYXJnZXQsIHRoaXMuY2hhbm5lbENvdW50LHRoaXMuY3VycmVudFNhbXBsZVJhdGUsQXVkaW9DYXB0dXJlLkJVRkZFUl9TSVpFLDAsdGhpcy5fcmVjVVVJRClcclxuICAgIH1cclxuICAgIGlmKCEoQXVkaW9TdG9yYWdlVHlwZS5ORVRfQ0hVTktFRCA9PT0gdGhpcy5fYXVkaW9TdG9yYWdlVHlwZSkpIHtcclxuICAgICAgLy8gSW5pdGlhbGl6ZSBhdWRpbyBkYXRhIGFycmF5IGV4Y2VwdCBmb3IgbmV0IGF1ZGlvIGJ1ZmZlciBtb2RlXHJcbiAgICAgIHRoaXMuZGF0YSA9IG5ldyBBcnJheTxBcnJheTxGbG9hdDMyQXJyYXk+PigpO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2hhbm5lbENvdW50OyBpKyspIHtcclxuICAgICAgICB0aGlzLmRhdGEucHVzaChuZXcgQXJyYXk8RmxvYXQzMkFycmF5PigpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5mcmFtZXNSZWNvcmRlZCA9IDA7XHJcbiAgfVxyXG5cclxuICBsaXN0RGV2aWNlcygpIHtcclxuICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpLnRoZW4oKGw6IE1lZGlhRGV2aWNlSW5mb1tdKSA9PiB0aGlzLnByaW50RGV2aWNlcyhsKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGR1bW15U2Vzc2lvbigpOlByb21pc2U8TWVkaWFTdHJlYW0+e1xyXG4gICAgLy8gd29ya2Fyb3VuZCB0byByZXF1ZXN0IHBlcm1pc3Npb25zOlxyXG4gICAgLy8gU3RhcnQgYSBkdW1teSBzZXNzaW9uXHJcbiAgICBsZXQgbWVkaWFTdHJDbnN0cnMgPSA8TWVkaWFTdHJlYW1Db25zdHJhaW50cz57YXVkaW86XHJcbiAgICAgICAge2VjaG9DYW5jZWxhdGlvbjogZmFsc2V9XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKG1lZGlhU3RyQ25zdHJzKTtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBzdG9wQWxsU2Vzc2lvblRyYWNrcyhtZWRpYVN0cmVhbTpNZWRpYVN0cmVhbSl7XHJcbiAgICAgIGxldCBhdHMgPSBtZWRpYVN0cmVhbS5nZXRUcmFja3MoKTtcclxuICAgICAgZm9yIChsZXQgYXRJZHggPSAwOyBhdElkeCA8IGF0cy5sZW5ndGg7IGF0SWR4KyspIHtcclxuICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJTdG9wIGR1bW15IHNlc3Npb24gdHJhY2s6ICNcIiArIGF0SWR4KVxyXG4gICAgICAgIGF0c1thdElkeF0uc3RvcCgpO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuICBkZXZpY2VJbmZvcyhjYjogKGRldmljZUluZm9zOiBNZWRpYURldmljZUluZm9bXSB8IG51bGwpID0+IGFueSwgcmV0cnkgPSB0cnVlLGR1bW15U3RyZWFtPzpNZWRpYVN0cmVhbSkge1xyXG5cclxuICAgIG5hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpLnRoZW4oKGw6IE1lZGlhRGV2aWNlSW5mb1tdKSA9PiB7XHJcbiAgICAgIGxldCBsYWJlbHNBdmFpbGFibGUgPSBmYWxzZTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IGRpID0gbFtpXTtcclxuICAgICAgICBpZiAoZGkubGFiZWwpIHtcclxuICAgICAgICAgIGxhYmVsc0F2YWlsYWJsZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICghbGFiZWxzQXZhaWxhYmxlKSB7XHJcbiAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiTWVkaWEgZGV2aWNlIGVudW1lcmF0aW9uOiBObyBsYWJlbHMuXCIpXHJcbiAgICAgICAgaWYgKHJldHJ5KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIlN0YXJ0aW5nIGR1bW15IHNlc3Npb24gdG8gcmVxdWVzdCBhdWRpbyBwZXJtaXNzaW9ucy4uLlwiKVxyXG5cclxuICAgICAgICAgICAgdGhpcy5kdW1teVNlc3Npb24oKS50aGVuKChzOiBNZWRpYVN0cmVhbSkgPT4ge1xyXG4gICAgICAgICAgICAvLyBhbmQgc3RvcCBpdCBpbW1lZGlhdGVseVxyXG5cclxuICAgICAgICAgICAgaWYocykge1xyXG4gICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkdvdCBkdW1teSBzZXNzaW9uIHN0cmVhbTogXCIgKyBzICsgXCIgLlwiKVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJObyBkdW1teSBzdHJlYW1cIilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyByZXRyeSAob25seSBvbmNlKVxyXG4gICAgICAgICAgICB0aGlzLmRldmljZUluZm9zKGNiLCBmYWxzZSxzKTtcclxuICAgICAgICAgIH0scmVhc29uID0+IHtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiRHVtbXkgc2Vzc2lvbiByZWplY3RlZC5cIilcclxuICAgICAgICAgICAgLy8gVE9ETyBlcnJvciBjYWxsYmFja1xyXG4gICAgICAgICAgICBjYihudWxsKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjYihudWxsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gc3VjY2Vzc1xyXG4gICAgICAgIGNiKGwpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKGR1bW15U3RyZWFtKXtcclxuICAgICAgICB0aGlzLnN0b3BBbGxTZXNzaW9uVHJhY2tzKGR1bW15U3RyZWFtKTtcclxuICAgICAgfVxyXG4gICAgfSwocmVhc29uKT0+IHtcclxuICAgICAgLy9yZWplY3RlZFxyXG4gICAgICAvL2NvbnNvbGUuZGVidWcoXCJNZWRpYSBkZXZpY2UgZW51bWVyYXRpb24gcmVqZWN0ZWQuXCIpXHJcbiAgICAgIGlmIChyZXRyeSkge1xyXG4gICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlN0YXJ0aW5nIGR1bW15IHNlc3Npb24gdG8gcmVxdWVzdCBhdWRpbyBwZXJtaXNzaW9ucy4uLlwiKVxyXG4gICAgICAgIHRoaXMuZHVtbXlTZXNzaW9uKCkudGhlbigoczogTWVkaWFTdHJlYW0pID0+IHtcclxuICAgICAgICAgIC8vIGFuZCBzdG9wIGl0IGltbWVkaWF0ZWx5XHJcbiAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJEdW1teSBzZXNzaW9uLlwiKVxyXG4gICAgICAgICAgaWYocykge1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJHb3QgZHVtbXkgc2Vzc2lvbiBzdHJlYW06IFwiICsgcyArIFwiIC5cIilcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJObyBkdW1teSBzdHJlYW1cIilcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIC8vIHJldHJ5IChvbmx5IG9uY2UpXHJcbiAgICAgICAgICB0aGlzLmRldmljZUluZm9zKGNiLCBmYWxzZSxzKTtcclxuICAgICAgICB9LCByZWFzb24gPT4ge1xyXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiRHVtbXkgc2Vzc2lvbiByZWplY3RlZC5cIilcclxuICAgICAgICAgIC8vIFRPRE8gZXJyb3IgY2FsbGJhY2tcclxuICAgICAgICAgIGNiKG51bGwpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNiKG51bGwpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKGR1bW15U3RyZWFtKXtcclxuICAgICAgICB0aGlzLnN0b3BBbGxTZXNzaW9uVHJhY2tzKGR1bW15U3RyZWFtKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG5cclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpbnREZXZpY2VzKGw6IE1lZGlhRGV2aWNlSW5mb1tdKTogdm9pZCB7XHJcbiAgICAvL2xldCBzZWxEZXZpY2VJZCA9ICdfX19kdW1teV9fXyc7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGwubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IGRpID0gbFtpXTtcclxuICAgICAgY29uc29sZS5sb2coXCJBdWRpbyBkZXZpY2U6IElkOiBcIiArIGRpLmRldmljZUlkICsgXCIgZ3JvdXBJZDogXCIgKyBkaS5ncm91cElkICsgXCIgbGFiZWw6IFwiICsgZGkubGFiZWwgKyBcIiBraW5kOiBcIiArIGRpLmtpbmQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkQ2FwdHVyZUludGVyY2VwdG9yKCkge1xyXG4gICAgY29uc3QgYXduID0gbmV3IEF1ZGlvV29ya2xldE5vZGUodGhpcy5jb250ZXh0LCAnY2FwdHVyZS1pbnRlcmNlcHRvcicpO1xyXG4gICAgYXduLm9ucHJvY2Vzc29yZXJyb3IgPSAoZXY6IEV2ZW50KSA9PiB7XHJcbiAgICAgIGxldCBtc2cgPSAnVW5rbndvbiBlcnJvcic7XHJcbiAgICAgIGlmIChldiBpbnN0YW5jZW9mIEVycm9yRXZlbnQpIHtcclxuICAgICAgICBtc2cgPSBldi5tZXNzYWdlO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJDYXB0dXJlIGF1ZGlvIHdvcmtsZXQgZXJyb3I6IFwiICsgbXNnKTtcclxuICAgICAgaWYgKHRoaXMubGlzdGVuZXIpIHtcclxuICAgICAgICB0aGlzLmxpc3RlbmVyLmVycm9yKG1zZyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGxldCBhd25QdCA9IGF3bi5wb3J0O1xyXG4gICAgaWYgKGF3blB0KSB7XHJcbiAgICAgIGF3blB0Lm9ubWVzc2FnZSA9IChldjogTWVzc2FnZUV2ZW50KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuY2FwdHVyaW5nKSB7XHJcbiAgICAgICAgICBsZXQgZHQgPSBldi5kYXRhO1xyXG4gICAgICAgICAgbGV0IGNocyA9IGR0LmNocztcclxuICAgICAgICAgIGxldCBhZGFMZW4gPSBkdC5kYXRhLmxlbmd0aDtcclxuICAgICAgICAgIGlmIChERUJVR19UUkFDRV9MRVZFTCA+IDgpIHtcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZygnUmVjZWl2ZWQgZGF0YSBmcm9tIHdvcmtsZXQ6ICcgKyBjaHMgKyAnICcgKyBkdC5sZW4gKyAnIERhdGEgY2hzOiAnICsgYWRhTGVuKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCBjaHVuayA9IG5ldyBBcnJheTxGbG9hdDMyQXJyYXk+KGNocyk7XHJcbiAgICAgICAgICBjb25zdCBzYW1wbGVzID0gdGhpcy5mcmFtZXNSZWNvcmRlZCAqIGNocztcclxuICAgICAgICAgIGlmICgoQXVkaW9TdG9yYWdlVHlwZS5NRU1fRU5USVJFX0FVVE9fTkVUX0NIVU5LRUQgPT09IHRoaXMuYXVkaW9TdG9yYWdlVHlwZSB8fCBBdWRpb1N0b3JhZ2VUeXBlLk1FTV9DSFVOS0VEX0FVVE9fTkVUX0NIVU5LRUQgPT09IHRoaXMuYXVkaW9TdG9yYWdlVHlwZSkgJiYgdGhpcy5kYXRhICYmIHNhbXBsZXMgPiB0aGlzLl9tYXhBdXRvTmV0TWVtU3RvcmVTYW1wbGVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGF0YSA9IG51bGw7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiRGF0YSBpbml0aWFsaXplZDogXCIrKHRoaXMuZGF0YSE9bnVsbCkpO1xyXG4gICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGNoczsgY2grKykge1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJEYXRhIGNoIGluaXRpYWxpemVkOiBcIisodGhpcy5kYXRhICE9bnVsbCAmJiB0aGlzLmRhdGFbY2hdICE9bnVsbCkpO1xyXG4gICAgICAgICAgICBpZiAoY2ggPCB0aGlzLmNoYW5uZWxDb3VudCkge1xyXG4gICAgICAgICAgICAgIGlmIChkdC5kYXRhW2NoXSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGZhID0gbmV3IEZsb2F0MzJBcnJheShkdC5kYXRhW2NoXSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhICYmIHRoaXMuZGF0YVtjaF0pIHtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhW2NoXS5wdXNoKGZhKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNodW5rW2NoXSA9IGZhO1xyXG4gICAgICAgICAgICAgICAgLy8gVXNlIHNhbXBsZXMgb2YgY2hhbm5lbCAwIHRvIGNvdW50IGZyYW1lcyAoc2FtcGxlcylcclxuICAgICAgICAgICAgICAgIGlmIChjaCA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuZnJhbWVzUmVjb3JkZWQgKz0gZmEubGVuZ3RoO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHRoaXMuYXVkaW9PdXRTdHJlYW0pIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICB0aGlzLmF1ZGlvT3V0U3RyZWFtLndyaXRlKGNodW5rKTtcclxuICAgICAgICAgICAgICAvLyAvLyBSYW5kb20gdGVzdCBlcnJvcjpcclxuICAgICAgICAgICAgICAvLyBpZihNYXRoLnJhbmRvbSgpPjAuOTgpIHtcclxuICAgICAgICAgICAgICAvLyAgIHRocm93IG5ldyBFcnJvcignVGVzdCcpO1xyXG4gICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBlcnNpc3RFcnJvciA9IGVycjtcclxuICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5wZXJzaXN0RXJyb3IgPSBuZXcgRXJyb3IoJ0Vycm9yIGhhbmRsaW5nIHJlY29yZGVkIGF1ZGlvIGRhdGEnKTtcclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDYXB0dXJlIGVycm9yOiBcIiArIGVycik7XHJcbiAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcCgpO1xyXG4gICAgICAgICAgICAgIH0gY2F0Y2ggKGVycjIpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDYXB0dXJlIG5leHQgZXJyb3IgKGlnbm9yZWQpOiBcIiArIGVycjIpO1xyXG4gICAgICAgICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5saXN0ZW5lcikge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgZXJyRXhwbCA9ICcnO1xyXG4gICAgICAgICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRE9NRXhjZXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXJyRXhwbCA9ICc6ICcgKyBlcnIubmFtZSArICc6ICcgKyBlcnIubWVzc2FnZTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVycm9yKFwiQ291bGQgbm90IGhhbmRsZSByZWNvcmRlZCBhdWRpbyBkYXRhXCIgKyBlcnJFeHBsLCBcIlBsZWFzZSB0cnkgdG8gcmVjb3JkIGFnYWluLlwiKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChBdWRpb1N0b3JhZ2VUeXBlLkRCX0NIVU5LRUQgPT09IHRoaXMuX2F1ZGlvU3RvcmFnZVR5cGUgJiYgdGhpcy5fcGVyc2lzdGVudEF1ZGlvU3RvcmFnZVRhcmdldCkge1xyXG4gICAgICAgICAgICB0aGlzLnN0b3JlKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgLy8gVHJpZWQgdG8gZml4IHRoYXQgU2FmYXJpIGRvZXMgbm90IHJlY29yZCB0aGUgc2Vjb25kIGNoYW5uZWxcclxuICAgIC8vIERvZXMgbm90IGhlbHBcclxuICAgIC8vYXduLmNoYW5uZWxDb3VudD10aGlzLmNoYW5uZWxDb3VudDtcclxuICAgIC8vYXduLmNoYW5uZWxDb3VudE1vZGU9J2V4cGxpY2l0JztcclxuICAgIC8vY29uc29sZS5kZWJ1ZygnQ2hhbm5lbCBjb3VudCBleHBsaWNpdGx5IHNldCB0byAnK3RoaXMuY2hhbm5lbENvdW50KTtcclxuXHJcbiAgICB0aGlzLmJ1ZmZlcmluZ05vZGUgPSBhd247XHJcbiAgICAvL3RoaXMuYnVmZmVyaW5nTm9kZS5jaGFubmVsQ291bnQ9dGhpcy5jaGFubmVsQ291bnQ7XHJcbiAgICB0aGlzLl9vcGVuZWQgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMubGlzdGVuZXIpIHtcclxuICAgICAgdGhpcy5saXN0ZW5lci5vcGVuZWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9wZW4oY2hhbm5lbENvdW50OiBudW1iZXIsIHNlbERldmljZUlkPzogQ29uc3RyYWluRE9NU3RyaW5nfHVuZGVmaW5lZCxhdXRvR2FpbkNvbnRyb2xDb25maWdzPzpBcnJheTxBdXRvR2FpbkNvbnRyb2xDb25maWc+fG51bGx8dW5kZWZpbmVkKXtcclxuICAgIC8vY29uc29sZS5kZWJ1ZyhcIkNhcHR1cmUgb3BlbjogY3R4IHN0YXRlOiBcIit0aGlzLmNvbnRleHQuc3RhdGUpO1xyXG4gICAgaWYodGhpcy5jb250ZXh0LnN0YXRlIT09J3J1bm5pbmcnKXtcclxuICAgICAgLy9jb25zb2xlLmRlYnVnKFwiQ2FwdHVyZSBvcGVuOiBSZXN1bWUgY29udGV4dFwiKTtcclxuICAgICAgdGhpcy5jb250ZXh0LnJlc3VtZSgpLnRoZW4oKCk9PntcclxuICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJDYXB0dXJlIG9wZW4gKGN0eCByZXN1bWVkKTogY3R4IHN0YXRlOiBcIit0aGlzLmNvbnRleHQuc3RhdGUpO1xyXG4gICAgICAgIHRoaXMuX29wZW4oY2hhbm5lbENvdW50LCBzZWxEZXZpY2VJZCwgYXV0b0dhaW5Db250cm9sQ29uZmlncyk7XHJcbiAgICAgIH0pXHJcbiAgICB9ZWxzZXtcclxuICAgICAgdGhpcy5fb3BlbihjaGFubmVsQ291bnQsIHNlbERldmljZUlkLCBhdXRvR2FpbkNvbnRyb2xDb25maWdzKTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBfb3BlbihjaGFubmVsQ291bnQ6IG51bWJlciwgc2VsRGV2aWNlSWQ/OiBDb25zdHJhaW5ET01TdHJpbmd8dW5kZWZpbmVkLGF1dG9HYWluQ29udHJvbENvbmZpZ3M/OkFycmF5PEF1dG9HYWluQ29udHJvbENvbmZpZz58bnVsbHx1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuY2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50O1xyXG4gICAgdGhpcy5mcmFtZXNSZWNvcmRlZCA9IDA7XHJcblxyXG5cclxuICAgIC8vdmFyIG1zYyA9IG5ldyBBdWRpb1N0cmVhbUNvbnN0cigpO1xyXG4gICAgLy8gdmFyIG1zYz17fTtcclxuICAgIC8vbXNjLnZpZGVvID0gZmFsc2U7XHJcbiAgICAvL21zYy5hdWRpbyA9IHRydWU7XHJcblxyXG4gICAgLy8gQ2hyb21lIGFuZCBGaXJlZm94IHN0ZXJlbyBjaGFubmVscyBhcmUgaWRlbnRpY2FsICEhXHJcbiAgICAvLyBBbmQgZXZlbiB3b3JzZTogVGhlIGRhdGEgY29taW5nIGZyb20gdGhlIHNvdXJjZSBpcyBhbHJlYWR5IHByZXByb2Nlc3NlZCBvbiBGRiBhbmQgQ2hyb21lLiBJdCBjb250YWlucyBEU1AgYXJ0aWZhY3RzISFcclxuXHJcbiAgICAvLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0zODc3MzdcclxuICAgIC8vIFRoZSB3b3JrYXJvdW5kIHRvIHNldCB0aGVzZSBjb25zdHJhaW50cyBkb2VzIF9OT1RfIGhlbHA6XHJcbiAgICAvL3ZhciBtc2M9e2F1ZGlvOiB7ZWNob0NhbmNlbGxhdGlvbjogZmFsc2UsY2hhbm5lbENvdW50OiAyLCBnb29nQXVkaW9NaXJyb3Jpbmc6IGZhbHNlfSx2aWRlbzogZmFsc2V9O1xyXG5cclxuICAgIC8vIFNhZmFyaSBhdCBsZWFzdCB2ZXJzaW9uIDExOiBTdXBwb3J0IGZvciBtZWRpYSBzdHJlYW1zXHJcbiAgICAvLyBUT0RPIHRlc3QgaWYgaW5wdXQgaXMgdW5wcm9jZXNzZWRcclxuXHJcbiAgICBsZXQgbXNjOk1lZGlhU3RyZWFtQ29uc3RyYWludHM7XHJcbiAgICBjb25zb2xlLmluZm8oJ1VzZXIgYWdlbnQ6ICcrbmF2aWdhdG9yLnVzZXJBZ2VudCk7XHJcblxyXG5cclxuICAgICAgbGV0IHVhPVVzZXJBZ2VudEJ1aWxkZXIudXNlckFnZW50KCk7XHJcblxyXG4gICAgICAvLyB1YS5jb21wb25lbnRzLmZvckVhY2goKGMpPT57XHJcbiAgICAgIC8vICAgY29uc29sZS5pbmZvKFwiVUFfQ29tcDogXCIrYy50b1N0cmluZygpKTtcclxuICAgICAgLy8gfSlcclxuXHJcbiAgICAgbGV0IGFnY0NmZzpBdXRvR2FpbkNvbnRyb2xDb25maWd8bnVsbD1udWxsO1xyXG5cclxuICAgIGxldCBhdXRvR2FpbkNvbnRyb2w9ZmFsc2U7XHJcbiAgICBsZXQgY2hyb21lRWNob0NhbmNlbGxhdGlvbj1mYWxzZTtcclxuICAgIGlmKGF1dG9HYWluQ29udHJvbENvbmZpZ3Mpe1xyXG4gICAgICBmb3IobGV0IGFnY2Mgb2YgYXV0b0dhaW5Db250cm9sQ29uZmlncyl7XHJcbiAgICAgICAgaWYoYWdjYy5wbGF0Zm9ybT09PUNmZ1BsYXRmb3JtLkFuZHJvaWQgJiYgdWEuZGV0ZWN0ZWRQbGF0Zm9ybT09PVBsYXRmb3JtLkFuZHJvaWQpe1xyXG4gICAgICAgICAgICBhZ2NDZmc9YWdjYztcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGFnY2MucGxhdGZvcm09PT1DZmdQbGF0Zm9ybS5XaW5kb3dzICYmIHVhLmRldGVjdGVkUGxhdGZvcm09PT1QbGF0Zm9ybS5XaW5kb3dzKXtcclxuICAgICAgICAgIGFnY0NmZz1hZ2NjO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmKGFnY0NmZyl7XHJcbiAgICAgICAgLy8gVE9ETyB1c2UgRVhBQ1QvSURFQUwgY29uc3RyYWludFxyXG4gICAgICAgIGF1dG9HYWluQ29udHJvbD1hZ2NDZmcudmFsdWU7XHJcbiAgICAgICAgaWYoQ0hST01FX0FDVElWQVRFX0VDSE9fQ0FOQ0VMTEFUSU9OX1dJVEhfQUdDKXtcclxuICAgICAgICAgIGNocm9tZUVjaG9DYW5jZWxsYXRpb249YWdjQ2ZnLnZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBUT0RPIHF1ZXJ5IHJlYWwgQUdDIHN0YXR1c1xyXG4gICAgICAgIHRoaXMuYWdjU3RhdHVzPWFnY0NmZy52YWx1ZTtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgdGhpcy5hZ2NTdGF0dXM9ZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBkZWZhdWx0XHJcbiAgICBtc2MgPSB7XHJcbiAgICAgIGF1ZGlvOiB7XHJcbiAgICAgICAgZGV2aWNlSWQ6IHNlbERldmljZUlkLFxyXG4gICAgICAgIGVjaG9DYW5jZWxsYXRpb246IGZhbHNlLFxyXG4gICAgICAgIGNoYW5uZWxDb3VudDogY2hhbm5lbENvdW50LFxyXG4gICAgICAgIGF1dG9HYWluQ29udHJvbDogYXV0b0dhaW5Db250cm9sXHJcbiAgICAgIH0sXHJcbiAgICAgIHZpZGVvOiBmYWxzZVxyXG4gICAgfTtcclxuXHJcbiAgICBpZiAodWEuZGV0ZWN0ZWRCcm93c2VyPT09QnJvd3Nlci5FZGdlKSB7XHJcblxyXG4gICAgICAvLyBNaWNyb3NvZnQgRWRnZSBzZW5kcyB1bm1vZGlmaWVkIGF1ZGlvXHJcbiAgICAgIC8vIFRoZSBjb25zdHJhaW50IGNhbiBmb2xsb3cgdGhlIHNwZWNpZmljYXRpb25cclxuICAgICAgY29uc29sZS5pbmZvKFwiU2V0dGluZyBtZWRpYSB0cmFjayBjb25zdHJhaW50cyBmb3IgTWljcm9zb2Z0IEVkZ2UuXCIpO1xyXG4gICAgICBtc2MgPSB7XHJcbiAgICAgICAgYXVkaW86IHtcclxuICAgICAgICAgIGRldmljZUlkOiBzZWxEZXZpY2VJZCxcclxuICAgICAgICAgIGVjaG9DYW5jZWxsYXRpb246IGZhbHNlLFxyXG4gICAgICAgICAgY2hhbm5lbENvdW50OiBjaGFubmVsQ291bnQsXHJcbiAgICAgICAgICBhdXRvR2FpbkNvbnRyb2w6IGF1dG9HYWluQ29udHJvbFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdmlkZW86IGZhbHNlXHJcbiAgICAgIH07XHJcbiAgICB9IGVsc2UgaWYgKHVhLmRldGVjdGVkQnJvd3Nlcj09PUJyb3dzZXIuQ2hyb21lKSB7XHJcbiAgICAgIC8vIEdvb2dsZSBDaHJvbWU6IHdlIG5lZWQgdG8gc3dpdGNoIG9mIGVhY2ggb2YgdGhlIHByZXByb2Nlc3NpbmcgdW5pdHMgaW5jbHVkaW5nIHRoZVxyXG4gICAgICBjb25zb2xlLmluZm8oXCJTZXR0aW5nIG1lZGlhIHRyYWNrIGNvbnN0cmFpbnRzIGZvciBHb29nbGUgQ2hyb21lLlwiKTtcclxuXHJcbiAgICAgIC8vIENocm9tZSA2MCAtPiA2MSBjaGFuZ2VkXHJcbiAgICAgIC8vIGl0IHdvcmtzIG5vdyB3aXRob3V0IG1hbmRhdG9yeS9vcHRpb25hbCBzdWItb2JqZWN0c1xyXG5cclxuXHJcbiAgICAgIC8vIFJlcXVpcmVzIGF0IGxlYXN0IENocm9tZSA2MVxyXG4gICAgICBtc2MgPSB7XHJcbiAgICAgICAgYXVkaW86IHtcclxuICAgICAgICAgIGRldmljZUlkOiBzZWxEZXZpY2VJZCxcclxuICAgICAgICAgIGNoYW5uZWxDb3VudDogY2hhbm5lbENvdW50LFxyXG4gICAgICAgICAgZWNob0NhbmNlbGxhdGlvbjoge2V4YWN0OmNocm9tZUVjaG9DYW5jZWxsYXRpb259LFxyXG4gICAgICAgICAgYXV0b0dhaW5Db250cm9sOiB7ZXhhY3Q6YXV0b0dhaW5Db250cm9sfSxcclxuICAgICAgICAgIHNhbXBsZVNpemU6e21pbjogMTZ9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdmlkZW86IGZhbHNlLFxyXG4gICAgICB9XHJcblxyXG4gICAgfSBlbHNlIGlmICh1YS5kZXRlY3RlZEJyb3dzZXI9PT1Ccm93c2VyLkZpcmVmb3gpIHtcclxuICAgICAgY29uc29sZS5pbmZvKFwiU2V0dGluZyBtZWRpYSB0cmFjayBjb25zdHJhaW50cyBmb3IgTW96aWxsYSBGaXJlZm94LlwiKTtcclxuICAgICAgLy8gRmlyZWZveFxyXG4gICAgICBtc2MgPSB7XHJcbiAgICAgICAgYXVkaW86IHtcclxuICAgICAgICAgICAgZGV2aWNlSWQ6IHNlbERldmljZUlkLFxyXG4gICAgICAgICAgICBjaGFubmVsQ291bnQ6IGNoYW5uZWxDb3VudCxcclxuICAgICAgICAgIGVjaG9DYW5jZWxsYXRpb246IGZhbHNlLFxyXG4gICAgICAgICAgICBhdXRvR2FpbkNvbnRyb2w6IGF1dG9HYWluQ29udHJvbCxcclxuICAgICAgICAgIG5vaXNlU3VwcHJlc3Npb246IGZhbHNlXHJcbiAgICAgICAgfSxcclxuICAgICAgICB2aWRlbzogZmFsc2UsXHJcbiAgICAgIH1cclxuXHJcbiAgICB9IGVsc2UgaWYgKHVhLmRldGVjdGVkQnJvd3Nlcj09PUJyb3dzZXIuU2FmYXJpKSB7XHJcbiAgICAgIGNvbnNvbGUuaW5mbyhcIlNldHRpbmcgbWVkaWEgdHJhY2sgY29uc3RyYWludHMgZm9yIFNhZmFyaSBicm93c2VyLlwiKVxyXG4gICAgICAvL2NvbnNvbGUuaW5mbyhcIkFwcGx5IHdvcmthcm91bmQgZm9yIFNhZmFyaTogQXZvaWQgZGlzY29ubmVjdCBvZiBzdHJlYW1zLlwiKTtcclxuXHJcbiAgICAgIHRoaXMuZGlzY29ubmVjdFN0cmVhbXMgPSB0cnVlO1xyXG4gICAgICBtc2MgPSB7XHJcbiAgICAgICAgYXVkaW86IHtcclxuICAgICAgICAgIGRldmljZUlkOiBzZWxEZXZpY2VJZCxcclxuICAgICAgICAgIGNoYW5uZWxDb3VudDogY2hhbm5lbENvdW50LFxyXG4gICAgICAgICAgLy9lY2hvQ2FuY2VsbGF0aW9uOiBmYWxzZVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgdmlkZW86IGZhbHNlLFxyXG4gICAgICB9XHJcblxyXG4gICAgfSBlbHNlIHtcclxuXHJcbiAgICAgIC8vIFRPRE8gZGVmYXVsdCBjb25zdHJhaW50cyBvciBlcnJvciBCcm93c2VyIG5vdCBzdXBwb3J0ZWRcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIGNvbnNvbGUuZGVidWcoXCJBdWRpbyBjYXB0dXJlLCBBR0M6IFwiK3RoaXMuYWdjU3RhdHVzKVxyXG5cclxuICAgIGxldCB1bXAgPSBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYShtc2MpO1xyXG4gICAgdW1wLnRoZW4oKHMpID0+IHtcclxuICAgICAgICB0aGlzLnN0cmVhbSA9IHM7XHJcblxyXG4gICAgICAgIGxldCBhVHJhY2tzID0gcy5nZXRBdWRpb1RyYWNrcygpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFUcmFja3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgIGxldCBhVHJhY2sgPSBhVHJhY2tzW2ldO1xyXG5cclxuICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIlRyYWNrIGF1ZGlvIGluZm86IGlkOiBcIiArIGFUcmFjay5pZCArIFwiIGtpbmQ6IFwiICsgYVRyYWNrLmtpbmQgKyBcIiBsYWJlbDogXFxcIlwiICsgYVRyYWNrLmxhYmVsICsgXCJcXFwiXCIpO1xyXG4gICAgICAgICAgbGV0IG10clN0cz1hVHJhY2suZ2V0U2V0dGluZ3MoKTtcclxuXHJcbiAgICAgICAgICAvLyBUeXBlc2NyaXB0IGxpYi5kb20udHMgTWVkaWFUcmFja1NldHRpbmdzLmNoYW5uZWxDb3VudCBpcyBtaXNzaW5nXHJcbiAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWRuL2Jyb3dzZXItY29tcGF0LWRhdGEvYmxvYi81NDkzZDhmOTM3ZTA1YjJkZGJkNDFiOTlmNWJkZmFkNGExZjJlZDg1L2FwaS9NZWRpYVRyYWNrU2V0dGluZ3MuanNvblxyXG4gICAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgICBjb25zb2xlLmluZm8oXCJUcmFjayBhdWRpbyBzZXR0aW5nczogQ2ggY250OiBcIittdHJTdHMuY2hhbm5lbENvdW50K1wiLCBBR0M6IFwiK210clN0cy5hdXRvR2FpbkNvbnRyb2wrXCIsIEVjaG8gY2FuY2VsbC46IFwiK210clN0cy5lY2hvQ2FuY2VsbGF0aW9uKTtcclxuICAgICAgICAgIGlmKG10clN0cy5hdXRvR2FpbkNvbnRyb2wpe1xyXG4gICAgICAgICAgICB0aGlzLmFnY1N0YXR1cz1tdHJTdHMuYXV0b0dhaW5Db250cm9sO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHZUcmFja3MgPSBzLmdldFZpZGVvVHJhY2tzKCk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2VHJhY2tzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBsZXQgdlRyYWNrID0gdlRyYWNrc1tpXTtcclxuICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIlRyYWNrIHZpZGVvIGluZm86IGlkOiBcIiArIHZUcmFjay5pZCArIFwiIGtpbmQ6IFwiICsgdlRyYWNrLmtpbmQgKyBcIiBsYWJlbDogXCIgKyB2VHJhY2subGFiZWwpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLm1lZGlhU3RyZWFtID0gdGhpcy5jb250ZXh0LmNyZWF0ZU1lZGlhU3RyZWFtU291cmNlKHMpO1xyXG4gICAgICAgIC8vIHN0cmVhbSBjaGFubmVsIGNvdW50ICggaXMgYWx3YXlzIDIgISlcclxuICAgICAgICBsZXQgc3RyZWFtQ2hhbm5lbENvdW50OiBudW1iZXIgPSB0aGlzLm1lZGlhU3RyZWFtLmNoYW5uZWxDb3VudDtcclxuICAgICAgICBjb25zb2xlLmluZm8oXCJTdHJlYW0gY2hhbm5lbCBjb3VudDogXCIrc3RyZWFtQ2hhbm5lbENvdW50KTtcclxuICAgICAgICAvLyBpcyBub3Qgc2V0ISFcclxuICAgICAgICAvL3RoaXMuY3VycmVudFNhbXBsZVJhdGUgPSB0aGlzLm1lZGlhU3RyZWFtLnNhbXBsZVJhdGU7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50U2FtcGxlUmF0ZSA9IHRoaXMuY29udGV4dC5zYW1wbGVSYXRlO1xyXG4gICAgICAgIGNvbnNvbGUuaW5mbyhcIlNvdXJjZSBhdWRpbyBub2RlOiBjaGFubmVsczogXCIgKyBzdHJlYW1DaGFubmVsQ291bnQgKyBcIiBzYW1wbGVyYXRlOiBcIiArIHRoaXMuY3VycmVudFNhbXBsZVJhdGUpO1xyXG4gICAgICAgIGlmICh0aGlzLmF1ZGlvT3V0U3RyZWFtKSB7XHJcbiAgICAgICAgICB0aGlzLmF1ZGlvT3V0U3RyZWFtLnNldEZvcm1hdCh0aGlzLmNoYW5uZWxDb3VudCwgdGhpcy5jdXJyZW50U2FtcGxlUmF0ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFczQyAgLT4gbmV3IG5hbWUgaXMgY3JlYXRlU2NyaXB0UHJvY2Vzc29yXHJcbiAgICAgICAgLy9cclxuICAgICAgICAvLyBBZ2FpbiBkZXByZWNhdGVkLCBidXQgQXVkaW9Xb3JrZXIgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBzdGFibGUgcmVsZWFzZXMgKEp1bmUgMjAxNilcclxuICAgICAgICAvLyBBdWRpb1dvcmtlciBpcyBub3cgQXVkaW9Xb3JrbGV0UHJvY2Vzc29yIC4uLiAoTWF5IDIwMTcpXHJcblxyXG4gICAgICAvLyBVcGRhdGUgMTItMjAyMDpcclxuICAgICAgIC8vIFRoZSBTY3JpcHRQcm9jZXNzb3JOb2RlIEludGVyZmFjZSAtIERFUFJFQ0FURURcclxuXHJcbiAgICAgIC8vIFVwZGF0ZSAwNi0yMDIxXHJcbiAgICAgIC8vICBBdWRpb1dvcmtsZXRQcm9jZXNzb3IgaXMgaGVyZSB0byBzdGF5LiBXZWIgQXVkaW8gQVBJIGhhcyBub3cgUmVjb21tZW5kYXRpb24gc3RhdHVzICFcclxuXHJcbiAgICAgICAgICBpZih0aGlzLmNvbnRleHQuYXVkaW9Xb3JrbGV0KXtcclxuICAgICAgICAgICAgLy9jb25zdCB3b3JrbGV0RmlsZU5hbWUgPSAoJ2ZpbGUtbG9hZGVyIS4vaW50ZXJjZXB0b3Jfd29ya2xldC5qcycpO1xyXG4gICAgICAgICAgICAvL2NvbnN0IHdvcmtsZXRGaWxlTmFtZSA9ICdodHRwOi8vbG9jYWxob3N0OjQyMDAvYXNzZXRzL2ludGVyY2VwdG9yX3dvcmtsZXQuanMnO1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKGF3cFN0cik7XHJcbiAgICAgICAgICAgIGlmKEF1ZGlvQ2FwdHVyZS5jYXB0dXJlSW50ZXJjZXB0b3JNb2R1bGVSZWdpc3RlcmVkKSB7XHJcbiAgICAgICAgICAgICAgLy8gUmVxdWlyZWQgY2FwdHVyZSBpbnRlcmNlcHRvciBtb2R1bGUgYWxyZWFkeSByZWdpc3RlcmVkXHJcbiAgICAgICAgICAgICAgdGhpcy5hZGRDYXB0dXJlSW50ZXJjZXB0b3IoKTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcblxyXG4gICAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGNhcHR1cmUgaW50ZXJjZXB0b3IgbW9kdWxlXHJcbiAgICAgICAgICAgICAgbGV0IGF1ZGlvV29ya2xldE1vZHVsZUJsb2IgPSBuZXcgQmxvYihbYXdwU3RyXSwge3R5cGU6ICd0ZXh0L2phdmFzY3JpcHQnfSk7XHJcblxyXG4gICAgICAgICAgICAgIGxldCBhdWRpb1dvcmtsZXRNb2R1bGVCbG9iVXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYXVkaW9Xb3JrbGV0TW9kdWxlQmxvYik7XHJcblxyXG4gICAgICAgICAgICAgIHRoaXMuY29udGV4dC5hdWRpb1dvcmtsZXQuYWRkTW9kdWxlKGF1ZGlvV29ya2xldE1vZHVsZUJsb2JVcmwpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICBBdWRpb0NhcHR1cmUuY2FwdHVyZUludGVyY2VwdG9yTW9kdWxlUmVnaXN0ZXJlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQ2FwdHVyZUludGVyY2VwdG9yKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgKS5jYXRjaCgoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NvdWxkIG5vdCBhZGQgbW9kdWxlICcgKyBlcnJvcik7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1lbHNlIGlmKHRoaXMuY29udGV4dC5jcmVhdGVTY3JpcHRQcm9jZXNzb3IpIHtcclxuICAgICAgICAgICAgLy8gVGhlIFNjcmlwdFByb2Nlc3Nvck5vZGUgSW50ZXJmYWNlIC0gREVQUkVDQVRFRCBPbmx5IGFzIGZhbGxiYWNrXHJcbiAgICAgICAgICAgIC8vIFRPRE8gc2hvdWxkIHdlIHVzZSBzdHJlYW1DaGFubmVsQ291bnQgb3IgY2hhbm5lbENvdW50IGhlcmUgP1xyXG4gICAgICAgICAgICBsZXQgc2NyaXB0UHJvY2Vzc29yTm9kZT0gdGhpcy5jb250ZXh0LmNyZWF0ZVNjcmlwdFByb2Nlc3NvcihBdWRpb0NhcHR1cmUuQlVGRkVSX1NJWkUsIHN0cmVhbUNoYW5uZWxDb3VudCwgc3RyZWFtQ2hhbm5lbENvdW50KTtcclxuICAgICAgICAgICAgdGhpcy5idWZmZXJpbmdOb2RlPXNjcmlwdFByb2Nlc3Nvck5vZGU7XHJcbiAgICAgICAgICAgIGxldCBjID0gMDtcclxuICAgICAgICAgICAgaWYoc2NyaXB0UHJvY2Vzc29yTm9kZS5vbmF1ZGlvcHJvY2Vzcyl7XHJcbiAgICAgICAgICAgICAgc2NyaXB0UHJvY2Vzc29yTm9kZS5vbmF1ZGlvcHJvY2VzcyA9IChlOiBBdWRpb1Byb2Nlc3NpbmdFdmVudCkgPT4ge1xyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhcHR1cmluZykge1xyXG4gICAgICAgICAgICAgICAgICBsZXQgaW5CdWZmZXIgPSBlLmlucHV0QnVmZmVyO1xyXG4gICAgICAgICAgICAgICAgICAvLyBvbmx5IHByb2Nlc3MgcmVxdWVzdGVkIGNvdW50IG9mIGNoYW5uZWxzXHJcbiAgICAgICAgICAgICAgICAgIGxldCBjdXJyZW50QnVmZmVycyA9IG5ldyBBcnJheTxGbG9hdDMyQXJyYXk+KGNoYW5uZWxDb3VudCk7XHJcbiAgICAgICAgICAgICAgICAgIGZvciAobGV0IGNoOiBudW1iZXIgPSAwOyBjaCA8IGNoYW5uZWxDb3VudDsgY2grKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjaFNhbXBsZXMgPSBpbkJ1ZmZlci5nZXRDaGFubmVsRGF0YShjaCk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNoU2FtcGxlc0NvcHkgPSBjaFNhbXBsZXMuc2xpY2UoMCk7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudEJ1ZmZlcnNbY2hdID0gY2hTYW1wbGVzQ29weS5zbGljZSgwKTtcclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVtjaF0ucHVzaChjaFNhbXBsZXNDb3B5KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYoREVCVUdfVFJBQ0VfTEVWRUw+OCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKFwiUHJvY2VzcyBcIitjaFNhbXBsZXNDb3B5Lmxlbmd0aCtcIiBzYW1wbGVzLlwiKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mcmFtZXNSZWNvcmRlZCArPSBjaFNhbXBsZXNDb3B5Lmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICBjKys7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmF1ZGlvT3V0U3RyZWFtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdWRpb091dFN0cmVhbS53cml0ZShjdXJyZW50QnVmZmVycyk7XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgIHRoaXMuX29wZW5lZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMubGlzdGVuZXIpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIub3BlbmVkKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVycm9yKCdCcm93c2VyIGRvZXMgbm90IHN1cHBvcnQgYXVkaW8gcHJvY2Vzc2luZyAoU2NyaXB0UHJvY2Vzc29yLm9uYXVkaW9wcm9jZXNzIG1ldGhvZCBub3QgZm91bmQpIScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lci5lcnJvcignQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IGF1ZGlvIHByb2Nlc3NpbmcgKG5laXRoZXIgQXVkaW9Xb3JrbGV0UHJvY2Vzc29yIG5vciBTY3JpcHRQcm9jZXNzb3IpIScpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sIChlKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUgKyBcIiBFcnJvciBuYW1lOiBcIiArZS5uYW1lKTtcclxuICAgICAgICAgIGlmICh0aGlzLmxpc3RlbmVyKSB7XHJcbiAgICAgICAgICAgIGlmKCdOb3RBbGxvd2VkRXJyb3InID09PSBlLm5hbWUpe1xyXG4gICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZXJyb3IoJ05vdCBhbGxvd2VkIHRvIHVzZSB5b3VyIG1pY3JvcGhvbmUuJywnUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IG1pY3JvcGhvbmUgYWNjZXNzIGlzIGFsbG93ZWQgZm9yIHRoaXMgd2ViIHBhZ2UgYW5kIHJlbG9hZCB0aGUgcGFnZS4nKTtcclxuICAgICAgICAgICAgfWVsc2UgaWYoJ05vdFJlYWRhYmxlRXJyb3InID09PSBlLm5hbWUpe1xyXG4gICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZXJyb3IoJ0NvdWxkIG5vdCByZWFkIGZyb20geW91ciBhdWRpbyBkZXZpY2UuJywnUGxlYXNlIG1ha2Ugc3VyZSB5b3VyIGF1ZGlvIGRldmljZSBpcyB3b3JraW5nLicpO1xyXG4gICAgICAgICAgICB9ZWxzZSBpZignT3ZlcmNvbnN0cmFpbmVkRXJyb3InID09PSBlLm5hbWUpe1xyXG4gICAgICAgICAgICAgIGxldCBlTXNnPWUubXNnP2UubXNnOidPdmVyY29uc3RyYWluZWQgbWVkaWEgZGV2aWNlIHJlcXVlc3QgZXJyb3IuJztcclxuICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVyLmVycm9yKGVNc2cpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMubGlzdGVuZXIuZXJyb3IoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIClcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3N0YXJ0KCl7XHJcbiAgICB0aGlzLmluaXREYXRhKCk7XHJcbiAgICBpZiAodGhpcy5hdWRpb091dFN0cmVhbSkge1xyXG4gICAgICB0aGlzLmF1ZGlvT3V0U3RyZWFtLm5leHRTdHJlYW0oKVxyXG4gICAgfVxyXG4gICAgdGhpcy5jYXB0dXJpbmcgPSB0cnVlO1xyXG4gICAgaWYodGhpcy5idWZmZXJpbmdOb2RlKSB7XHJcbiAgICAgIHRoaXMubWVkaWFTdHJlYW0uY29ubmVjdCh0aGlzLmJ1ZmZlcmluZ05vZGUpO1xyXG4gICAgICB0aGlzLmJ1ZmZlcmluZ05vZGUuY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMubGlzdGVuZXIpIHtcclxuICAgICAgdGhpcy5saXN0ZW5lci5zdGFydGVkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzdGFydCgpIHtcclxuICAgIGNvbnN0IGFTdD10aGlzLmNvbnRleHQuc3RhdGU7XHJcbiAgICBpZihhU3Q9PT0ncnVubmluZycpIHtcclxuICAgICAgdGhpcy5fc3RhcnQoKTtcclxuICAgIH1lbHNle1xyXG4gICAgICBjb25zb2xlLmRlYnVnKFwiQ2FwdHVyZSBzdGFydDogYXVkaW8gY29udGV4dCBub3QgcnVubmluZywgc3RhdGU6IFwiK2FTdCtcIiwgcmVzdW1pbmcuLi5cIik7XHJcbiAgICAgIHRoaXMuY29udGV4dC5yZXN1bWUoKS50aGVuKCgpPT57XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZyhcIkNhcHR1cmUgc3RhcnQ6IGF1ZGlvIGNvbnRleHQgcmVzdW1lZCwgc3RhcnRpbmcuLi5cIik7XHJcbiAgICAgICAgdGhpcy5fc3RhcnQoKTtcclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHN0b3AoKSB7XHJcblxyXG4gICAgaWYgKHRoaXMuZGlzY29ubmVjdFN0cmVhbXMgJiYgdGhpcy5idWZmZXJpbmdOb2RlKSB7XHJcbiAgICAgIHRoaXMubWVkaWFTdHJlYW0uZGlzY29ubmVjdCh0aGlzLmJ1ZmZlcmluZ05vZGUpO1xyXG4gICAgICB0aGlzLmJ1ZmZlcmluZ05vZGUuZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGlmICh0aGlzLmF1ZGlvT3V0U3RyZWFtKSB7XHJcbiAgICAgICAgdGhpcy5hdWRpb091dFN0cmVhbS5mbHVzaCgpO1xyXG4gICAgICB9XHJcbiAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgY29uc29sZS5lcnJvcihcIkNvdWxkIG5vdCBmbHVzaCBjYXB0dXJlIHN0cmVhbS5cIik7XHJcbiAgICAgdGhyb3cgZXJyO1xyXG4gICAgfWZpbmFsbHkge1xyXG4gICAgICB0aGlzLmNhcHR1cmluZyA9IGZhbHNlO1xyXG4gICAgICBpZiAodGhpcy5pbmRkYkF1ZGlvQnVmZmVyICYmIHRoaXMucGVyc2lzdEVycm9yKSB7XHJcbiAgICAgICAgLy8gRGVsZXRlIGludmFsaWQgcGVyc2lzdGVudCBhdWRpbyBkYXRhIGFuZCBob3BlIHRoYXQgaXQgd2lsbCBiZSBjb21wbGV0ZWx5IHVwbG9hZGVkIHRvIHRoZSBzZXJ2ZXJcclxuICAgICAgICB0aGlzLmluZGRiQXVkaW9CdWZmZXIucmVsZWFzZUF1ZGlvRGF0YSgpO1xyXG4gICAgICAgIHRoaXMuaW5kZGJBdWRpb0J1ZmZlciA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMubGlzdGVuZXIgJiYgKHRoaXMucGVyc2lzdEVycm9yIHx8IHRoaXMucGVyc2lzdGVkKSkge1xyXG4gICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlN0b3BwZWQgYnkgc3RvcCgpIG1ldGhvZCBjYWxsXCIpO1xyXG4gICAgICAgIHRoaXMubGlzdGVuZXIuc3RvcHBlZCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgc3RvcmUoKXtcclxuICAgLy8gaWYodGhpcy5kYiAmJiB0aGlzLnJlY1VVSUQpe1xyXG4gICAvLyAgICBsZXQgdHI9IHRoaXMuZGIudHJhbnNhY3Rpb24oU3ByRGIuUkVDT1JESU5HX0ZJTEVfQ0hVTktTX09CSkVDVF9TVE9SRV9OQU1FLCAncmVhZHdyaXRlJyk7XHJcbiAgIC8vICAgIGxldCByZWNGaWxlT2JqU3RvcmUgPSB0ci5vYmplY3RTdG9yZShTcHJEYi5SRUNPUkRJTkdfRklMRV9DSFVOS1NfT0JKRUNUX1NUT1JFX05BTUUpO1xyXG4gICAvL1xyXG4gICAvLyAgICAgIHRyeSB7XHJcbiAgIC8vICAgICAgICBsZXQgY2gwRGF0YT10aGlzLmRhdGFbMF07XHJcbiAgIC8vICAgICAgICBsZXQgZGF0YUNoa0NudD1jaDBEYXRhLmxlbmd0aDtcclxuICAgLy8gICAgICAgICAgbGV0IHBvcyA9IDA7XHJcbiAgIC8vICAgICAgICAgIGZvciAobGV0IGNoQ2tJZHggPSAwOyBjaENrSWR4IDwgZGF0YUNoa0NudDsgY2hDa0lkeCsrKSB7XHJcbiAgIC8vICAgICAgICAgICAgbGV0IGJ1Zkxlbj0wO1xyXG4gICAvLyAgICAgICAgICAgIGZvciAobGV0IGNoID0gMDsgY2ggPCB0aGlzLmNoYW5uZWxDb3VudDsgY2grKykge1xyXG4gICAvLyAgICAgICAgICAgICAgbGV0IGNoQ2hrID0gdGhpcy5kYXRhW2NoXVtjaENrSWR4XTtcclxuICAgLy8gICAgICAgICAgICAgIGJ1ZkxlbiA9IGNoQ2hrLmxlbmd0aDtcclxuICAgLy8gICAgICAgICAgICAgIC8vbGV0IGNhY2hlSWQgPSB1dWlkICsgJ18nICsgY2ggKyAnXycgKyBjaENrSWR4O1xyXG4gICAvLyAgICAgICAgICAgICAgbGV0IGNoa0RiSWQgPSBbdGhpcy5yZWNVVUlELCB0aGlzLmluZERiQ2hrSWR4ICsgY2hDa0lkeCwgY2hdO1xyXG4gICAvLyAgICAgICAgICAgICAgbGV0IGNyID0gcmVjRmlsZU9ialN0b3JlLmFkZChjaENoaywgY2hrRGJJZCk7XHJcbiAgIC8vICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJBZGRlZDogXCIrY2grXCIgXCIrKHRoaXMuaW5kRGJDaGtJZHgrY2hDa0lkeCkpO1xyXG4gICAvLyAgICAgICAgICAgICAgY3Iub25zdWNjZXNzPSgpPT57XHJcbiAgIC8vICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlN0b3JlZCBhdWRpbyBkYXRhIHRvIGluZGV4ZWQgZGJcIik7XHJcbiAgIC8vICAgICAgICAgICAgICB9XHJcbiAgIC8vICAgICAgICAgICAgICBjci5vbmVycm9yPSgpPT57XHJcbiAgIC8vICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBzdG9yaW5nIGF1ZGlvIGRhdGEgdG8gaW5kZXhlZCBkYlwiKTtcclxuICAgLy8gICAgICAgICAgICAgIH1cclxuICAgLy8gICAgICAgICAgICB9XHJcbiAgIC8vICAgICAgICAgICAgcG9zICs9IGJ1ZkxlbjtcclxuICAgLy8gICAgICAgIH1cclxuICAgLy8gICAgICAgIHRoaXMuaW5kRGJDaGtJZHgrPWRhdGFDaGtDbnQ7XHJcbiAgIC8vXHJcbiAgIC8vICAgICAgICB0ci5vbmVycm9yID0gKGVycikgPT4ge1xyXG4gICAvLyAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gY2FjaGUgYXVkaW8gZGF0YSB0byBpbmRleGVkIGRiOiAnICsgZXJyKVxyXG4gICAvLyAgICAgICAgfVxyXG4gICAvLyAgICAgICAgdHIub25jb21wbGV0ZSA9ICgpID0+IHtcclxuICAgLy8gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKCdUcmFuc2ZlcnJlZCBjYXB0dXJlIGF1ZGlvIGRhdGEgdG8gaW5kZXhlZCBkYiwgZGVsZXRpbmcgb3JpZ2luYWwgZGF0YSBmcm9tIG1lbW9yeS4uLicpO1xyXG4gICAvL1xyXG4gICAvLyAgICAgICAgICAvLy8gQXVkaW8gZGF0YSBzYXZlZCB0byBpbmRleCBkYiBkZWxldGUgZnJvbSBpbiBtZW1vcnkgZGF0YSBhcnJheVxyXG4gICAvLyAgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgdGhpcy5jaGFubmVsQ291bnQ7IGNoKyspIHtcclxuICAgLy8gICAgICAgICAgIHRoaXMuZGF0YVtjaF0uc3BsaWNlKDApO1xyXG4gICAvLyAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlNwbGljZWQvcmVtb3ZlZCBjaDogXCIrY2gpO1xyXG4gICAvLyAgICAgICAgICB9XHJcbiAgIC8vXHJcbiAgIC8vICAgICAgICAgIHRoaXMucGVyc2lzdGVkPXRydWU7XHJcbiAgIC8vICAgICAgICAgIGlmKHRoaXMubGlzdGVuZXIgJiYgIXRoaXMuY2FwdHVyaW5nKXtcclxuICAgLy8gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJTdG9wcGVkIGJ5IGluZGV4ZWQgZGIgaG9va1wiKTtcclxuICAgLy8gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLnN0b3BwZWQoKTtcclxuICAgLy8gICAgICAgICAgfVxyXG4gICAvLyAgICAgICAgfVxyXG4gICAvLyAgICAgICAgLy8gQ29tbWl0IGNodW5rc1xyXG4gICAvLyAgICAgICAgdGhpcy5wZXJzaXN0ZWQ9ZmFsc2U7XHJcbiAgIC8vICAgICAgICB0ci5jb21taXQoKTtcclxuICAgLy8gICAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgLy8gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RyYW5zZmVyIGNhcHR1cmUgYXVkaW8gZGF0YSBlcnJvcjogJytlcnIpO1xyXG4gICAvLyAgICAgIH1cclxuICAgLy8gICAgfVxyXG5cclxuICAgIC8vIGlmKCF0aGlzLmluZGRiQXVkaW9CdWZmZXIgJiYgdGhpcy5fcGVyc2lzdGVudEF1ZGlvU3RvcmFnZVRhcmdldCAmJiB0aGlzLnJlY1VVSUQpIHtcclxuICAgIC8vICAgdGhpcy5pbmRkYkF1ZGlvQnVmZmVyID0gbmV3IEluZGV4ZWREYkF1ZGlvQnVmZmVyKHRoaXMuX3BlcnNpc3RlbnRBdWRpb1N0b3JhZ2VUYXJnZXQsIHRoaXMuY2hhbm5lbENvdW50LHRoaXMuY3VycmVudFNhbXBsZVJhdGUsQXVkaW9DYXB0dXJlLkJVRkZFUl9TSVpFLDAsdGhpcy5yZWNVVUlEKVxyXG4gICAgLy8gfVxyXG4gICAgaWYodGhpcy5pbmRkYkF1ZGlvQnVmZmVyICYmIHRoaXMuZGF0YSl7XHJcblxyXG4gICAgICAvLyBUcnkgdG8gYXBwZW5kIHRvXHJcbiAgICAgIHRoaXMuaW5kZGJBdWRpb0J1ZmZlci5hcHBlbmRSYXdBdWRpb0RhdGEodGhpcy5kYXRhKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoJ1RyYW5zZmVycmVkIGNhcHR1cmUgYXVkaW8gZGF0YSB0byBpbmRleGVkIGRiLCBkZWxldGluZyBvcmlnaW5hbCBkYXRhIGZyb20gbWVtb3J5Li4uJyk7XHJcblxyXG4gICAgICAgICAgLy8vIEF1ZGlvIGRhdGEgc2F2ZWQgdG8gaW5kZXggZGIgZGVsZXRlIGZyb20gaW4gbWVtb3J5IGRhdGEgYXJyYXlcclxuICAgICAgICAgIGlmKHRoaXMuZGF0YSkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgdGhpcy5jaGFubmVsQ291bnQ7IGNoKyspIHtcclxuICAgICAgICAgICAgICB0aGlzLmRhdGFbY2hdLnNwbGljZSgwKTtcclxuICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJTcGxpY2VkL3JlbW92ZWQgY2g6IFwiK2NoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgdGhpcy5wZXJzaXN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgaWYgKHRoaXMubGlzdGVuZXIgJiYgIXRoaXMuY2FwdHVyaW5nKSB7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlN0b3BwZWQgYnkgaW5kZXhlZCBkYiBob29rXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmxpc3RlbmVyLnN0b3BwZWQoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9LGVycm9yOihlcnIpPT57XHJcbiAgICAgICAgICAvLyBPbmx5IGxvZyB0aGUgZmlyc3QgZXJyb3JcclxuICAgICAgICAgIGlmKCF0aGlzLnBlcnNpc3RFcnJvcikge1xyXG4gICAgICAgICAgICB0aGlzLnBlcnNpc3RFcnJvciA9IGVycjtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIHBlcnNpc3RpbmcgYXVkaW8gZGF0YTogXCIgKyBlcnIpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMucGVyc2lzdGVkPWZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGNsb3NlKCkge1xyXG4gICAgaWYodGhpcy5tZWRpYVN0cmVhbSkge1xyXG4gICAgICB0aGlzLm1lZGlhU3RyZWFtLmRpc2Nvbm5lY3QoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnN0cmVhbSkge1xyXG4gICAgICBjb25zdCBtdHMgPSB0aGlzLnN0cmVhbS5nZXRUcmFja3MoKTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtdHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBtdHNbaV0uc3RvcCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLl9vcGVuZWQ9ZmFsc2U7XHJcbiAgfVxyXG5cclxuICBhdWRpb0J1ZmZlcigpOiBBdWRpb0J1ZmZlciB8bnVsbHtcclxuICAgIGxldCBhYjogQXVkaW9CdWZmZXJ8bnVsbD1udWxsO1xyXG4gICAgaWYodGhpcy5kYXRhKSB7XHJcbiAgICAgIGxldCBmcmFtZUxlbjogbnVtYmVyID0gMDtcclxuXHJcbiAgICAgIGxldCBjaDBEYXRhID0gdGhpcy5kYXRhWzBdO1xyXG5cclxuICAgICAgZm9yIChsZXQgY2gwQ2hrIG9mIGNoMERhdGEpIHtcclxuICAgICAgICBmcmFtZUxlbiArPSBjaDBDaGsubGVuZ3RoO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGFiID0gdGhpcy5jb250ZXh0LmNyZWF0ZUJ1ZmZlcih0aGlzLmNoYW5uZWxDb3VudCwgZnJhbWVMZW4sIHRoaXMuY29udGV4dC5zYW1wbGVSYXRlKTtcclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbikge1xyXG4gICAgICAgICAgaWYgKGVyci5uYW1lID09PSAnTm90U3VwcG9ydGVkRXJyb3InKSB7XHJcbiAgICAgICAgICAgIGlmIChmcmFtZUxlbiA9PSAwKSB7XHJcbiAgICAgICAgICAgICAgLy8gRW1wdHkgYnVmZmVycyBhcmUgbm90IHN1cHBvcnRlZCBieSBDaHJvbWl1bVxyXG4gICAgICAgICAgICAgIC8vIENyZWF0ZSBkdW1teSBidWZmZXIgd2l0aCBvbmUgc2FtcGxlXHJcbiAgICAgICAgICAgICAgYWIgPSB0aGlzLmNvbnRleHQuY3JlYXRlQnVmZmVyKHRoaXMuY2hhbm5lbENvdW50LCAxLCB0aGlzLmNvbnRleHQuc2FtcGxlUmF0ZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aHJvdyBlcnI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmIChlcnIgaW5zdGFuY2VvZiBSYW5nZUVycm9yKSB7XHJcbiAgICAgICAgICAvLyBPdXQgb2YgbWVtb3J5XHJcbiAgICAgICAgICAvLyBUT0RPIFdoYXQgdG8gZG8gPz9cclxuICAgICAgICAgIHRocm93IGVycjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhyb3cgZXJyO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBmb3IgKGxldCBjaCA9IDA7IGNoIDwgdGhpcy5jaGFubmVsQ291bnQ7IGNoKyspIHtcclxuICAgICAgICBsZXQgY2hEID0gYWIuZ2V0Q2hhbm5lbERhdGEoY2gpO1xyXG4gICAgICAgIGxldCBwb3MgPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGNoQ2hrIG9mIHRoaXMuZGF0YVtjaF0pIHtcclxuICAgICAgICAgIGxldCBidWZMZW4gPSBjaENoay5sZW5ndGg7XHJcbiAgICAgICAgICBjaEQuc2V0KGNoQ2hrLCBwb3MpO1xyXG4gICAgICAgICAgcG9zICs9IGJ1ZkxlbjtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBhYjtcclxuICB9XHJcblxyXG4gIGF1ZGlvQnVmZmVyQXJyYXkoKTpBcnJheUF1ZGlvQnVmZmVyfG51bGx7XHJcbiAgICAgIGxldCBhcnJBYjpBcnJheUF1ZGlvQnVmZmVyfG51bGw9bnVsbDtcclxuICAgICAgaWYodGhpcy5kYXRhKSB7XHJcbiAgICAgICAgYXJyQWI9bmV3IEFycmF5QXVkaW9CdWZmZXIodGhpcy5jaGFubmVsQ291bnQsIHRoaXMuY3VycmVudFNhbXBsZVJhdGUsIHRoaXMuZGF0YSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGFyckFiO1xyXG4gIH1cclxuXHJcbiAgaW5kZGJBdWRpb0J1ZmZlckFycmF5KCk6SW5kZXhlZERiQXVkaW9CdWZmZXJ8bnVsbHtcclxuICAgIGlmKHRoaXMucGVyc2lzdEVycm9yKXtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9ZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluZGRiQXVkaW9CdWZmZXI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbn1cclxuXHJcbiJdfQ==