@jsverse/transloco 7.5.1 → 7.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { Inject, Injectable, Optional } from '@angular/core';
1
+ import { DestroyRef, inject, Inject, Injectable, Optional, } from '@angular/core';
2
2
  import { BehaviorSubject, catchError, combineLatest, EMPTY, forkJoin, from, map, of, retry, shareReplay, Subject, switchMap, tap, } from 'rxjs';
3
3
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
4
  import { DefaultLoader, TRANSLOCO_LOADER, } from './transloco.loader';
@@ -37,6 +37,7 @@ export class TranslocoService {
37
37
  events = new Subject();
38
38
  events$ = this.events.asObservable();
39
39
  config;
40
+ destroyRef = inject(DestroyRef);
40
41
  constructor(loader, parser, missingHandler, interceptor, userConfig, fallbackStrategy) {
41
42
  this.loader = loader;
42
43
  this.parser = parser;
@@ -58,11 +59,21 @@ export class TranslocoService {
58
59
  /**
59
60
  * When we have a failure, we want to define the next language that succeeded as the active
60
61
  */
61
- this.events$.pipe(takeUntilDestroyed()).subscribe((e) => {
62
+ this.events$.subscribe((e) => {
62
63
  if (e.type === 'translationLoadSuccess' && e.wasFailure) {
63
64
  this.setActiveLang(e.payload.langName);
64
65
  }
65
66
  });
67
+ this.destroyRef.onDestroy(() => {
68
+ // Complete subjects to release observers if users forget to unsubscribe manually.
69
+ // This is important in server-side rendering.
70
+ this.lang.complete();
71
+ this.events.complete();
72
+ // As a root provider, this service is destroyed with when the application is destroyed.
73
+ // Cached values retain `this`, causing circular references that block garbage collection,
74
+ // leading to memory leaks during server-side rendering.
75
+ this.cache.clear();
76
+ });
66
77
  }
67
78
  getDefaultLang() {
68
79
  return this.defaultLang;
@@ -144,7 +155,7 @@ export class TranslocoService {
144
155
  console.error(`Error while trying to load "${path}"`, error);
145
156
  }
146
157
  return this.handleFailure(path, options);
147
- }), shareReplay(1));
158
+ }), shareReplay(1), takeUntilDestroyed(this.destroyRef));
148
159
  this.cache.set(path, load$);
149
160
  return load$;
150
161
  }
@@ -426,13 +437,6 @@ export class TranslocoService {
426
437
  }
427
438
  this.config.scopeMapping[scope] = alias;
428
439
  }
429
- ngOnDestroy() {
430
- // Caretaker note: since this is the root provider, it'll be destroyed when the `NgModuleRef.destroy()` is run.
431
- // Cached values capture `this`, thus leading to a circular reference and preventing the `TranslocoService` from
432
- // being GC'd. This would lead to a memory leak when server-side rendering is used since the service is created
433
- // and destroyed per each HTTP request, but any service is not getting GC'd.
434
- this.cache.clear();
435
- }
436
440
  isLoadedTranslation(lang) {
437
441
  return size(this.getTranslation(lang));
438
442
  }
@@ -574,4 +578,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImpor
574
578
  type: Inject,
575
579
  args: [TRANSLOCO_FALLBACK_STRATEGY]
576
580
  }] }] });
577
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsb2NvLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3RyYW5zbG9jby9zcmMvbGliL3RyYW5zbG9jby5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFhLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4RSxPQUFPLEVBQ0wsZUFBZSxFQUNmLFVBQVUsRUFDVixhQUFhLEVBQ2IsS0FBSyxFQUNMLFFBQVEsRUFDUixJQUFJLEVBQ0osR0FBRyxFQUVILEVBQUUsRUFDRixLQUFLLEVBQ0wsV0FBVyxFQUNYLE9BQU8sRUFDUCxTQUFTLEVBQ1QsR0FBRyxHQUNKLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFaEUsT0FBTyxFQUNMLGFBQWEsRUFDYixnQkFBZ0IsR0FFakIsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsb0JBQW9CLEdBRXJCLE1BQU0sd0JBQXdCLENBQUM7QUFjaEMsT0FBTyxFQUNMLE9BQU8sRUFDUCxPQUFPLEVBQ1AsS0FBSyxFQUNMLGFBQWEsRUFDYixRQUFRLEVBQ1IsSUFBSSxFQUNKLFdBQVcsRUFDWCxTQUFTLEdBQ1YsTUFBTSxXQUFXLENBQUM7QUFDbkIsT0FBTyxFQUFFLGdCQUFnQixFQUFtQixNQUFNLG9CQUFvQixDQUFDO0FBQ3ZFLE9BQU8sRUFDTCx5QkFBeUIsR0FHMUIsTUFBTSw2QkFBNkIsQ0FBQztBQUNyQyxPQUFPLEVBQ0wscUJBQXFCLEdBRXRCLE1BQU0seUJBQXlCLENBQUM7QUFDakMsT0FBTyxFQUNMLDJCQUEyQixHQUU1QixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFDTCxlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUNoQixtQkFBbUIsR0FDcEIsTUFBTSxVQUFVLENBQUM7QUFD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amVjdCwgSW5qZWN0YWJsZSwgT25EZXN0cm95LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBjYXRjaEVycm9yLFxuICBjb21iaW5lTGF0ZXN0LFxuICBFTVBUWSxcbiAgZm9ya0pvaW4sXG4gIGZyb20sXG4gIG1hcCxcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIHJldHJ5LFxuICBzaGFyZVJlcGxheSxcbiAgU3ViamVjdCxcbiAgc3dpdGNoTWFwLFxuICB0YXAsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5pbXBvcnQge1xuICBEZWZhdWx0TG9hZGVyLFxuICBUUkFOU0xPQ09fTE9BREVSLFxuICBUcmFuc2xvY29Mb2FkZXIsXG59IGZyb20gJy4vdHJhbnNsb2NvLmxvYWRlcic7XG5pbXBvcnQge1xuICBUUkFOU0xPQ09fVFJBTlNQSUxFUixcbiAgVHJhbnNsb2NvVHJhbnNwaWxlcixcbn0gZnJvbSAnLi90cmFuc2xvY28udHJhbnNwaWxlcic7XG5pbXBvcnQge1xuICBBdmFpbGFibGVMYW5ncyxcbiAgSGFzaE1hcCxcbiAgSW5saW5lTG9hZGVyLFxuICBMYW5nRGVmaW5pdGlvbixcbiAgTG9hZE9wdGlvbnMsXG4gIFNldFRyYW5zbGF0aW9uT3B0aW9ucyxcbiAgVHJhbnNsYXRlT2JqZWN0UGFyYW1zLFxuICBUcmFuc2xhdGVQYXJhbXMsXG4gIFRyYW5zbGF0aW9uLFxuICBUcmFuc2xvY29FdmVudHMsXG4gIFRyYW5zbG9jb1Njb3BlLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7XG4gIGZsYXR0ZW4sXG4gIGlzRW1wdHksXG4gIGlzTmlsLFxuICBpc1Njb3BlT2JqZWN0LFxuICBpc1N0cmluZyxcbiAgc2l6ZSxcbiAgdG9DYW1lbENhc2UsXG4gIHVuZmxhdHRlbixcbn0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IFRSQU5TTE9DT19DT05GSUcsIFRyYW5zbG9jb0NvbmZpZyB9IGZyb20gJy4vdHJhbnNsb2NvLmNvbmZpZyc7XG5pbXBvcnQge1xuICBUUkFOU0xPQ09fTUlTU0lOR19IQU5ETEVSLFxuICBUcmFuc2xvY29NaXNzaW5nSGFuZGxlcixcbiAgVHJhbnNsb2NvTWlzc2luZ0hhbmRsZXJEYXRhLFxufSBmcm9tICcuL3RyYW5zbG9jby1taXNzaW5nLWhhbmRsZXInO1xuaW1wb3J0IHtcbiAgVFJBTlNMT0NPX0lOVEVSQ0VQVE9SLFxuICBUcmFuc2xvY29JbnRlcmNlcHRvcixcbn0gZnJvbSAnLi90cmFuc2xvY28uaW50ZXJjZXB0b3InO1xuaW1wb3J0IHtcbiAgVFJBTlNMT0NPX0ZBTExCQUNLX1NUUkFURUdZLFxuICBUcmFuc2xvY29GYWxsYmFja1N0cmF0ZWd5LFxufSBmcm9tICcuL3RyYW5zbG9jby1mYWxsYmFjay1zdHJhdGVneSc7XG5pbXBvcnQge1xuICBnZXRFdmVudFBheWxvYWQsXG4gIGdldExhbmdGcm9tU2NvcGUsXG4gIGdldFNjb3BlRnJvbUxhbmcsXG4gIHJlc29sdmVJbmxpbmVMb2FkZXIsXG59IGZyb20gJy4vc2hhcmVkJztcbmltcG9ydCB7IGdldEZhbGxiYWNrc0xvYWRlcnMgfSBmcm9tICcuL2dldC1mYWxsYmFja3MtbG9hZGVycyc7XG5pbXBvcnQgeyByZXNvbHZlTG9hZGVyIH0gZnJvbSAnLi9yZXNvbHZlLWxvYWRlcic7XG5cbmxldCBzZXJ2aWNlOiBUcmFuc2xvY29TZXJ2aWNlO1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlPFQgPSBzdHJpbmc+KFxuICBrZXk6IFRyYW5zbGF0ZVBhcmFtcyxcbiAgcGFyYW1zOiBIYXNoTWFwID0ge30sXG4gIGxhbmc/OiBzdHJpbmcsXG4pOiBUIHtcbiAgcmV0dXJuIHNlcnZpY2UudHJhbnNsYXRlPFQ+KGtleSwgcGFyYW1zLCBsYW5nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZU9iamVjdDxUPihcbiAga2V5OiBUcmFuc2xhdGVQYXJhbXMsXG4gIHBhcmFtczogSGFzaE1hcCA9IHt9LFxuICBsYW5nPzogc3RyaW5nLFxuKTogVCB8IFRbXSB7XG4gIHJldHVybiBzZXJ2aWNlLnRyYW5zbGF0ZU9iamVjdDxUPihrZXksIHBhcmFtcywgbGFuZyk7XG59XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgVHJhbnNsb2NvU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIGxhbmdDaGFuZ2VzJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuXG4gIHByaXZhdGUgdHJhbnNsYXRpb25zID0gbmV3IE1hcDxzdHJpbmcsIFRyYW5zbGF0aW9uPigpO1xuICBwcml2YXRlIGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE9ic2VydmFibGU8VHJhbnNsYXRpb24+PigpO1xuICBwcml2YXRlIGZpcnN0RmFsbGJhY2tMYW5nOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZGVmYXVsdExhbmcgPSAnJztcbiAgcHJpdmF0ZSBhdmFpbGFibGVMYW5nczogQXZhaWxhYmxlTGFuZ3MgPSBbXTtcbiAgcHJpdmF0ZSBpc1Jlc29sdmVkTWlzc2luZ09uY2UgPSBmYWxzZTtcbiAgcHJpdmF0ZSBsYW5nOiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPjtcbiAgcHJpdmF0ZSBmYWlsZWRMYW5ncyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIGV2ZW50cyA9IG5ldyBTdWJqZWN0PFRyYW5zbG9jb0V2ZW50cz4oKTtcblxuICBldmVudHMkID0gdGhpcy5ldmVudHMuYXNPYnNlcnZhYmxlKCk7XG4gIHJlYWRvbmx5IGNvbmZpZzogVHJhbnNsb2NvQ29uZmlnICYge1xuICAgIHNjb3BlTWFwcGluZz86IEhhc2hNYXA8c3RyaW5nPjtcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFRSQU5TTE9DT19MT0FERVIpIHByaXZhdGUgbG9hZGVyOiBUcmFuc2xvY29Mb2FkZXIsXG4gICAgQEluamVjdChUUkFOU0xPQ09fVFJBTlNQSUxFUikgcHJpdmF0ZSBwYXJzZXI6IFRyYW5zbG9jb1RyYW5zcGlsZXIsXG4gICAgQEluamVjdChUUkFOU0xPQ09fTUlTU0lOR19IQU5ETEVSKVxuICAgIHByaXZhdGUgbWlzc2luZ0hhbmRsZXI6IFRyYW5zbG9jb01pc3NpbmdIYW5kbGVyLFxuICAgIEBJbmplY3QoVFJBTlNMT0NPX0lOVEVSQ0VQVE9SKSBwcml2YXRlIGludGVyY2VwdG9yOiBUcmFuc2xvY29JbnRlcmNlcHRvcixcbiAgICBASW5qZWN0KFRSQU5TTE9DT19DT05GSUcpIHVzZXJDb25maWc6IFRyYW5zbG9jb0NvbmZpZyxcbiAgICBASW5qZWN0KFRSQU5TTE9DT19GQUxMQkFDS19TVFJBVEVHWSlcbiAgICBwcml2YXRlIGZhbGxiYWNrU3RyYXRlZ3k6IFRyYW5zbG9jb0ZhbGxiYWNrU3RyYXRlZ3ksXG4gICkge1xuICAgIGlmICghdGhpcy5sb2FkZXIpIHtcbiAgICAgIHRoaXMubG9hZGVyID0gbmV3IERlZmF1bHRMb2FkZXIodGhpcy50cmFuc2xhdGlvbnMpO1xuICAgIH1cbiAgICBzZXJ2aWNlID0gdGhpcztcbiAgICB0aGlzLmNvbmZpZyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodXNlckNvbmZpZykpO1xuXG4gICAgdGhpcy5zZXRBdmFpbGFibGVMYW5ncyh0aGlzLmNvbmZpZy5hdmFpbGFibGVMYW5ncyB8fCBbXSk7XG4gICAgdGhpcy5zZXRGYWxsYmFja0xhbmdGb3JNaXNzaW5nVHJhbnNsYXRpb24odGhpcy5jb25maWcpO1xuICAgIHRoaXMuc2V0RGVmYXVsdExhbmcodGhpcy5jb25maWcuZGVmYXVsdExhbmcpO1xuICAgIHRoaXMubGFuZyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPih0aGlzLmdldERlZmF1bHRMYW5nKCkpO1xuICAgIC8vIERvbid0IHVzZSBkaXN0aW5jdFVudGlsQ2hhbmdlZCBhcyB3ZSBuZWVkIHRoZSBhYmlsaXR5IHRvIHVwZGF0ZVxuICAgIC8vIHRoZSB2YWx1ZSB3aGVuIHVzaW5nIHNldFRyYW5zbGF0aW9uIG9yIHNldFRyYW5zbGF0aW9uS2V5c1xuICAgIHRoaXMubGFuZ0NoYW5nZXMkID0gdGhpcy5sYW5nLmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgLyoqXG4gICAgICogV2hlbiB3ZSBoYXZlIGEgZmFpbHVyZSwgd2Ugd2FudCB0byBkZWZpbmUgdGhlIG5leHQgbGFuZ3VhZ2UgdGhhdCBzdWNjZWVkZWQgYXMgdGhlIGFjdGl2ZVxuICAgICAqL1xuICAgIHRoaXMuZXZlbnRzJC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCgpKS5zdWJzY3JpYmUoKGUpID0+IHtcbiAgICAgIGlmIChlLnR5cGUgPT09ICd0cmFuc2xhdGlvbkxvYWRTdWNjZXNzJyAmJiBlLndhc0ZhaWx1cmUpIHtcbiAgICAgICAgdGhpcy5zZXRBY3RpdmVMYW5nKGUucGF5bG9hZC5sYW5nTmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXREZWZhdWx0TGFuZygpIHtcbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0TGFuZztcbiAgfVxuXG4gIHNldERlZmF1bHRMYW5nKGxhbmc6IHN0cmluZykge1xuICAgIHRoaXMuZGVmYXVsdExhbmcgPSBsYW5nO1xuICB9XG5cbiAgZ2V0QWN0aXZlTGFuZygpIHtcbiAgICByZXR1cm4gdGhpcy5sYW5nLmdldFZhbHVlKCk7XG4gIH1cblxuICBzZXRBY3RpdmVMYW5nKGxhbmc6IHN0cmluZykge1xuICAgIHRoaXMucGFyc2VyLm9uTGFuZ0NoYW5nZWQ/LihsYW5nKTtcbiAgICB0aGlzLmxhbmcubmV4dChsYW5nKTtcbiAgICB0aGlzLmV2ZW50cy5uZXh0KHtcbiAgICAgIHR5cGU6ICdsYW5nQ2hhbmdlZCcsXG4gICAgICBwYXlsb2FkOiBnZXRFdmVudFBheWxvYWQobGFuZyksXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRBdmFpbGFibGVMYW5ncyhsYW5nczogQXZhaWxhYmxlTGFuZ3MpIHtcbiAgICB0aGlzLmF2YWlsYWJsZUxhbmdzID0gbGFuZ3M7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgYXZhaWxhYmxlIGxhbmd1YWdlcy5cbiAgICpcbiAgICogQHJldHVybnNcbiAgICogQW4gYXJyYXkgb2YgdGhlIGF2YWlsYWJsZSBsYW5ndWFnZXMuIENhbiBiZSBlaXRoZXIgYSBgc3RyaW5nW11gIG9yIGEgYHsgaWQ6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W11gXG4gICAqIGRlcGVuZGluZyBvbiBob3cgdGhlIGF2YWlsYWJsZSBsYW5ndWFnZXMgYXJlIHNldCBpbiB5b3VyIG1vZHVsZS5cbiAgICovXG4gIGdldEF2YWlsYWJsZUxhbmdzKCkge1xuICAgIHJldHVybiB0aGlzLmF2YWlsYWJsZUxhbmdzO1xuICB9XG5cbiAgbG9hZChwYXRoOiBzdHJpbmcsIG9wdGlvbnM6IExvYWRPcHRpb25zID0ge30pOiBPYnNlcnZhYmxlPFRyYW5zbGF0aW9uPiB7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5jYWNoZS5nZXQocGF0aCk7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG5cbiAgICBsZXQgbG9hZFRyYW5zbGF0aW9uOiBPYnNlcnZhYmxlPFxuICAgICAgVHJhbnNsYXRpb24gfCB7IHRyYW5zbGF0aW9uOiBUcmFuc2xhdGlvbjsgbGFuZzogc3RyaW5nIH1bXVxuICAgID47XG4gICAgY29uc3QgaXNTY29wZSA9IHRoaXMuX2lzTGFuZ1Njb3BlZChwYXRoKTtcbiAgICBsZXQgc2NvcGU6IHN0cmluZztcbiAgICBpZiAoaXNTY29wZSkge1xuICAgICAgc2NvcGUgPSBnZXRTY29wZUZyb21MYW5nKHBhdGgpO1xuICAgIH1cblxuICAgIGNvbnN0IGxvYWRlcnNPcHRpb25zID0ge1xuICAgICAgcGF0aCxcbiAgICAgIG1haW5Mb2FkZXI6IHRoaXMubG9hZGVyLFxuICAgICAgaW5saW5lTG9hZGVyOiBvcHRpb25zLmlubGluZUxvYWRlcixcbiAgICAgIGRhdGE6IGlzU2NvcGUgPyB7IHNjb3BlOiBzY29wZSEgfSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMudXNlRmFsbGJhY2tUcmFuc2xhdGlvbihwYXRoKSkge1xuICAgICAgLy8gaWYgdGhlIHBhdGggaXMgc2NvcGUgdGhlIGZhbGxiYWNrIHNob3VsZCBiZSBgc2NvcGUvZmFsbGJhY2tMYW5nYDtcbiAgICAgIGNvbnN0IGZhbGxiYWNrID0gaXNTY29wZVxuICAgICAgICA/IGAke3Njb3BlIX0vJHt0aGlzLmZpcnN0RmFsbGJhY2tMYW5nfWBcbiAgICAgICAgOiB0aGlzLmZpcnN0RmFsbGJhY2tMYW5nO1xuXG4gICAgICBjb25zdCBsb2FkZXJzID0gZ2V0RmFsbGJhY2tzTG9hZGVycyh7XG4gICAgICAgIC4uLmxvYWRlcnNPcHRpb25zLFxuICAgICAgICBmYWxsYmFja1BhdGg6IGZhbGxiYWNrISxcbiAgICAgIH0pO1xuICAgICAgbG9hZFRyYW5zbGF0aW9uID0gZm9ya0pvaW4obG9hZGVycyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGxvYWRlciA9IHJlc29sdmVMb2FkZXIobG9hZGVyc09wdGlvbnMpO1xuICAgICAgbG9hZFRyYW5zbGF0aW9uID0gZnJvbShsb2FkZXIpO1xuICAgIH1cblxuICAgIGNvbnN0IGxvYWQkID0gbG9hZFRyYW5zbGF0aW9uLnBpcGUoXG4gICAgICByZXRyeSh0aGlzLmNvbmZpZy5mYWlsZWRSZXRyaWVzKSxcbiAgICAgIHRhcCgodHJhbnNsYXRpb24pID0+IHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodHJhbnNsYXRpb24pKSB7XG4gICAgICAgICAgdHJhbnNsYXRpb24uZm9yRWFjaCgodCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzKHQubGFuZywgdC50cmFuc2xhdGlvbik7XG4gICAgICAgICAgICAvLyBTYXZlIHRoZSBmYWxsYmFjayBpbiBjYWNoZSBzbyB3ZSdsbCBub3QgY3JlYXRlIGEgcmVkdW5kYW50IHJlcXVlc3RcbiAgICAgICAgICAgIGlmICh0LmxhbmcgIT09IHBhdGgpIHtcbiAgICAgICAgICAgICAgdGhpcy5jYWNoZS5zZXQodC5sYW5nLCBvZih7fSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhhbmRsZVN1Y2Nlc3MocGF0aCwgdHJhbnNsYXRpb24pO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLnByb2RNb2RlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGxvYWQgXCIke3BhdGh9XCJgLCBlcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVGYWlsdXJlKHBhdGgsIG9wdGlvbnMpO1xuICAgICAgfSksXG4gICAgICBzaGFyZVJlcGxheSgxKSxcbiAgICApO1xuXG4gICAgdGhpcy5jYWNoZS5zZXQocGF0aCwgbG9hZCQpO1xuXG4gICAgcmV0dXJuIGxvYWQkO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGluc3RhbnQgdHJhbnNsYXRlZCB2YWx1ZSBvZiBhIGtleVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiB0cmFuc2xhdGU8c3RyaW5nPignaGVsbG8nKVxuICAgKiB0cmFuc2xhdGUoJ2hlbGxvJywgeyB2YWx1ZTogJ3ZhbHVlJyB9KVxuICAgKiB0cmFuc2xhdGU8c3RyaW5nW10+KFsnaGVsbG8nLCAna2V5J10pXG4gICAqIHRyYW5zbGF0ZSgnaGVsbG8nLCB7IH0sICdlbicpXG4gICAqIHRyYW5zbGF0ZSgnc2NvcGUuc29tZUtleScsIHsgfSwgJ2VuJylcbiAgICovXG4gIHRyYW5zbGF0ZTxUID0gc3RyaW5nPihcbiAgICBrZXk6IFRyYW5zbGF0ZVBhcmFtcyxcbiAgICBwYXJhbXM6IEhhc2hNYXAgPSB7fSxcbiAgICBsYW5nID0gdGhpcy5nZXRBY3RpdmVMYW5nKCksXG4gICk6IFQge1xuICAgIGlmICgha2V5KSByZXR1cm4ga2V5IGFzIGFueTtcblxuICAgIGNvbnN0IHsgc2NvcGUsIHJlc29sdmVMYW5nIH0gPSB0aGlzLnJlc29sdmVMYW5nQW5kU2NvcGUobGFuZyk7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICByZXR1cm4ga2V5Lm1hcCgoaykgPT5cbiAgICAgICAgdGhpcy50cmFuc2xhdGUoc2NvcGUgPyBgJHtzY29wZX0uJHtrfWAgOiBrLCBwYXJhbXMsIHJlc29sdmVMYW5nKSxcbiAgICAgICkgYXMgYW55O1xuICAgIH1cblxuICAgIGtleSA9IHNjb3BlID8gYCR7c2NvcGV9LiR7a2V5fWAgOiBrZXk7XG5cbiAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHRoaXMuZ2V0VHJhbnNsYXRpb24ocmVzb2x2ZUxhbmcpO1xuICAgIGNvbnN0IHZhbHVlID0gdHJhbnNsYXRpb25ba2V5XTtcblxuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVNaXNzaW5nS2V5KGtleSwgdmFsdWUsIHBhcmFtcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucGFyc2VyLnRyYW5zcGlsZSh7XG4gICAgICB2YWx1ZSxcbiAgICAgIHBhcmFtcyxcbiAgICAgIHRyYW5zbGF0aW9uLFxuICAgICAga2V5LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRyYW5zbGF0ZWQgdmFsdWUgb2YgYSBrZXkgYXMgb2JzZXJ2YWJsZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBzZWxlY3RUcmFuc2xhdGU8c3RyaW5nPignaGVsbG8nKS5zdWJzY3JpYmUodmFsdWUgPT4gLi4uKVxuICAgKiBzZWxlY3RUcmFuc2xhdGU8c3RyaW5nPignaGVsbG8nLCB7fSwgJ2VzJykuc3Vic2NyaWJlKHZhbHVlID0+IC4uLilcbiAgICogc2VsZWN0VHJhbnNsYXRlPHN0cmluZz4oJ2hlbGxvJywge30sICd0b2RvcycpLnN1YnNjcmliZSh2YWx1ZSA9PiAuLi4pXG4gICAqIHNlbGVjdFRyYW5zbGF0ZTxzdHJpbmc+KCdoZWxsbycsIHt9LCB7IHNjb3BlOiAndG9kb3MnIH0pLnN1YnNjcmliZSh2YWx1ZSA9PiAuLi4pXG4gICAqXG4gICAqL1xuICBzZWxlY3RUcmFuc2xhdGU8VCA9IGFueT4oXG4gICAga2V5OiBUcmFuc2xhdGVQYXJhbXMsXG4gICAgcGFyYW1zPzogSGFzaE1hcCxcbiAgICBsYW5nPzogc3RyaW5nIHwgVHJhbnNsb2NvU2NvcGUgfCBUcmFuc2xvY29TY29wZVtdLFxuICAgIF9pc09iamVjdCA9IGZhbHNlLFxuICApOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICBsZXQgaW5saW5lTG9hZGVyOiBJbmxpbmVMb2FkZXIgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgbG9hZCA9IChsYW5nOiBzdHJpbmcsIG9wdGlvbnM/OiBMb2FkT3B0aW9ucykgPT5cbiAgICAgIHRoaXMubG9hZChsYW5nLCBvcHRpb25zKS5waXBlKFxuICAgICAgICBtYXAoKCkgPT5cbiAgICAgICAgICBfaXNPYmplY3RcbiAgICAgICAgICAgID8gdGhpcy50cmFuc2xhdGVPYmplY3Qoa2V5LCBwYXJhbXMsIGxhbmcpXG4gICAgICAgICAgICA6IHRoaXMudHJhbnNsYXRlKGtleSwgcGFyYW1zLCBsYW5nKSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgaWYgKGlzTmlsKGxhbmcpKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYW5nQ2hhbmdlcyQucGlwZShzd2l0Y2hNYXAoKGxhbmcpID0+IGxvYWQobGFuZykpKTtcbiAgICB9XG5cbiAgICBsYW5nID0gQXJyYXkuaXNBcnJheShsYW5nKSA/IGxhbmdbMF0gOiBsYW5nO1xuICAgIGlmIChpc1Njb3BlT2JqZWN0KGxhbmcpKSB7XG4gICAgICAvLyBpdCdzIGEgc2NvcGUgb2JqZWN0LlxuICAgICAgY29uc3QgcHJvdmlkZXJTY29wZSA9IGxhbmc7XG4gICAgICBsYW5nID0gcHJvdmlkZXJTY29wZS5zY29wZTtcbiAgICAgIGlubGluZUxvYWRlciA9IHJlc29sdmVJbmxpbmVMb2FkZXIocHJvdmlkZXJTY29wZSwgcHJvdmlkZXJTY29wZS5zY29wZSk7XG4gICAgfVxuXG4gICAgbGFuZyA9IGxhbmcgYXMgc3RyaW5nO1xuICAgIGlmICh0aGlzLmlzTGFuZyhsYW5nKSB8fCB0aGlzLmlzU2NvcGVXaXRoTGFuZyhsYW5nKSkge1xuICAgICAgcmV0dXJuIGxvYWQobGFuZyk7XG4gICAgfVxuICAgIC8vIGl0J3MgYSBzY29wZVxuICAgIGNvbnN0IHNjb3BlID0gbGFuZztcbiAgICByZXR1cm4gdGhpcy5sYW5nQ2hhbmdlcyQucGlwZShcbiAgICAgIHN3aXRjaE1hcCgobGFuZykgPT4gbG9hZChgJHtzY29wZX0vJHtsYW5nfWAsIHsgaW5saW5lTG9hZGVyIH0pKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHNjb3BlIHdpdGggbGFuZ1xuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiB0b2Rvcy9lbiA9PiB0cnVlXG4gICAqIHRvZG9zID0+IGZhbHNlXG4gICAqL1xuICBwcml2YXRlIGlzU2NvcGVXaXRoTGFuZyhsYW5nOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5pc0xhbmcoZ2V0TGFuZ0Zyb21TY29wZShsYW5nKSk7XG4gIH1cblxuICAvKipcbiAgICogVHJhbnNsYXRlIHRoZSBnaXZlbiBwYXRoIHRoYXQgcmV0dXJucyBhbiBvYmplY3RcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogc2VydmljZS50cmFuc2xhdGVPYmplY3QoJ3BhdGgudG8ub2JqZWN0JywgeydzdWJwYXRoJzogeyB2YWx1ZTogJ3NvbWVWYWx1ZSd9fSkgPT4gcmV0dXJucyB0cmFuc2xhdGVkIG9iamVjdFxuICAgKlxuICAgKi9cbiAgdHJhbnNsYXRlT2JqZWN0PFQgPSBhbnk+KGtleTogc3RyaW5nLCBwYXJhbXM/OiBIYXNoTWFwLCBsYW5nPzogc3RyaW5nKTogVDtcbiAgdHJhbnNsYXRlT2JqZWN0PFQgPSBhbnk+KGtleTogc3RyaW5nW10sIHBhcmFtcz86IEhhc2hNYXAsIGxhbmc/OiBzdHJpbmcpOiBUW107XG4gIHRyYW5zbGF0ZU9iamVjdDxUID0gYW55PihcbiAgICBrZXk6IFRyYW5zbGF0ZVBhcmFtcyxcbiAgICBwYXJhbXM/OiBIYXNoTWFwLFxuICAgIGxhbmc/OiBzdHJpbmcsXG4gICk6IFQgfCBUW107XG4gIHRyYW5zbGF0ZU9iamVjdDxUID0gYW55PihcbiAgICBrZXk6IEhhc2hNYXAgfCBNYXA8c3RyaW5nLCBIYXNoTWFwPixcbiAgICBwYXJhbXM/OiBudWxsLFxuICAgIGxhbmc/OiBzdHJpbmcsXG4gICk6IFRbXTtcbiAgdHJhbnNsYXRlT2JqZWN0PFQgPSBhbnk+KFxuICAgIGtleTogVHJhbnNsYXRlT2JqZWN0UGFyYW1zLFxuICAgIHBhcmFtczogSGFzaE1hcCB8IG51bGwgPSB7fSxcbiAgICBsYW5nID0gdGhpcy5nZXRBY3RpdmVMYW5nKCksXG4gICk6IFQgfCBUW10ge1xuICAgIGlmIChpc1N0cmluZyhrZXkpIHx8IEFycmF5LmlzQXJyYXkoa2V5KSkge1xuICAgICAgY29uc3QgeyByZXNvbHZlTGFuZywgc2NvcGUgfSA9IHRoaXMucmVzb2x2ZUxhbmdBbmRTY29wZShsYW5nKTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGtleSkpIHtcbiAgICAgICAgcmV0dXJuIGtleS5tYXAoKGspID0+XG4gICAgICAgICAgdGhpcy50cmFuc2xhdGVPYmplY3QoXG4gICAgICAgICAgICBzY29wZSA/IGAke3Njb3BlfS4ke2t9YCA6IGssXG4gICAgICAgICAgICBwYXJhbXMhLFxuICAgICAgICAgICAgcmVzb2x2ZUxhbmcsXG4gICAgICAgICAgKSxcbiAgICAgICAgKSBhcyBhbnk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gdGhpcy5nZXRUcmFuc2xhdGlvbihyZXNvbHZlTGFuZyk7XG4gICAgICBrZXkgPSBzY29wZSA/IGAke3Njb3BlfS4ke2tleX1gIDoga2V5O1xuXG4gICAgICBjb25zdCB2YWx1ZSA9IHVuZmxhdHRlbih0aGlzLmdldE9iamVjdEJ5S2V5KHRyYW5zbGF0aW9uLCBrZXkpKTtcbiAgICAgIC8qIElmIGFuIGVtcHR5IG9iamVjdCB3YXMgcmV0dXJuZWQgd2Ugd2FudCB0byB0cnkgYW5kIHRyYW5zbGF0ZSB0aGUga2V5IGFzIGEgc3RyaW5nIGFuZCBub3QgYW4gb2JqZWN0ICovXG4gICAgICByZXR1cm4gaXNFbXB0eSh2YWx1ZSlcbiAgICAgICAgPyB0aGlzLnRyYW5zbGF0ZShrZXksIHBhcmFtcyEsIGxhbmcpXG4gICAgICAgIDogdGhpcy5wYXJzZXIudHJhbnNwaWxlKHsgdmFsdWUsIHBhcmFtczogcGFyYW1zISwgdHJhbnNsYXRpb24sIGtleSB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB0cmFuc2xhdGlvbnM6IFRbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgW19rZXksIF9wYXJhbXNdIG9mIHRoaXMuZ2V0RW50cmllcyhrZXkpKSB7XG4gICAgICB0cmFuc2xhdGlvbnMucHVzaCh0aGlzLnRyYW5zbGF0ZU9iamVjdChfa2V5LCBfcGFyYW1zLCBsYW5nKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zbGF0aW9ucztcbiAgfVxuXG4gIHNlbGVjdFRyYW5zbGF0ZU9iamVjdDxUID0gYW55PihcbiAgICBrZXk6IHN0cmluZyxcbiAgICBwYXJhbXM/OiBIYXNoTWFwLFxuICAgIGxhbmc/OiBzdHJpbmcsXG4gICk6IE9ic2VydmFibGU8VD47XG4gIHNlbGVjdFRyYW5zbGF0ZU9iamVjdDxUID0gYW55PihcbiAgICBrZXk6IHN0cmluZ1tdLFxuICAgIHBhcmFtcz86IEhhc2hNYXAsXG4gICAgbGFuZz86IHN0cmluZyxcbiAgKTogT2JzZXJ2YWJsZTxUW10+O1xuICBzZWxlY3RUcmFuc2xhdGVPYmplY3Q8VCA9IGFueT4oXG4gICAga2V5OiBUcmFuc2xhdGVQYXJhbXMsXG4gICAgcGFyYW1zPzogSGFzaE1hcCxcbiAgICBsYW5nPzogc3RyaW5nLFxuICApOiBPYnNlcnZhYmxlPFQ+IHwgT2JzZXJ2YWJsZTxUW10+O1xuICBzZWxlY3RUcmFuc2xhdGVPYmplY3Q8VCA9IGFueT4oXG4gICAga2V5OiBIYXNoTWFwIHwgTWFwPHN0cmluZywgSGFzaE1hcD4sXG4gICAgcGFyYW1zPzogbnVsbCxcbiAgICBsYW5nPzogc3RyaW5nLFxuICApOiBPYnNlcnZhYmxlPFRbXT47XG4gIHNlbGVjdFRyYW5zbGF0ZU9iamVjdDxUID0gYW55PihcbiAgICBrZXk6IFRyYW5zbGF0ZU9iamVjdFBhcmFtcyxcbiAgICBwYXJhbXM/OiBIYXNoTWFwIHwgbnVsbCxcbiAgICBsYW5nPzogc3RyaW5nLFxuICApOiBPYnNlcnZhYmxlPFQ+IHwgT2JzZXJ2YWJsZTxUW10+IHtcbiAgICBpZiAoaXNTdHJpbmcoa2V5KSB8fCBBcnJheS5pc0FycmF5KGtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbGVjdFRyYW5zbGF0ZTxUPihrZXksIHBhcmFtcyEsIGxhbmcsIHRydWUpO1xuICAgIH1cblxuICAgIGNvbnN0IFtbZmlyc3RLZXksIGZpcnN0UGFyYW1zXSwgLi4ucmVzdF0gPSB0aGlzLmdldEVudHJpZXMoa2V5KTtcblxuICAgIC8qIEluIG9yZGVyIHRvIGF2b2lkIHN1YnNjcmliaW5nIG11bHRpcGxlIHRpbWVzIHRvIHRoZSBsb2FkIGxhbmd1YWdlIGV2ZW50IGJ5IGNhbGxpbmcgc2VsZWN0VHJhbnNsYXRlT2JqZWN0IGZvciBlYWNoIHBhaXIsXG4gICAgICogd2UgbGlzdGVuIHRvIHdoZW4gdGhlIGZpcnN0IGtleSBoYXMgYmVlbiB0cmFuc2xhdGVkICh0aGUgbGFuZ3VhZ2UgaXMgbG9hZGVkKSBhbmQgdHJhbnNsYXRlIHRoZSByZXN0IHN5bmNocm9ub3VzbHkgKi9cbiAgICByZXR1cm4gdGhpcy5zZWxlY3RUcmFuc2xhdGVPYmplY3Q8VD4oZmlyc3RLZXksIGZpcnN0UGFyYW1zLCBsYW5nKS5waXBlKFxuICAgICAgbWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSBbdmFsdWVdO1xuICAgICAgICBmb3IgKGNvbnN0IFtfa2V5LCBfcGFyYW1zXSBvZiByZXN0KSB7XG4gICAgICAgICAgdHJhbnNsYXRpb25zLnB1c2godGhpcy50cmFuc2xhdGVPYmplY3Q8VD4oX2tleSwgX3BhcmFtcywgbGFuZykpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0aW9ucztcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbiBvYmplY3Qgb2YgdHJhbnNsYXRpb25zIGZvciBhIGdpdmVuIGxhbmd1YWdlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGdldFRyYW5zbGF0aW9uKClcbiAgICogZ2V0VHJhbnNsYXRpb24oJ2VuJylcbiAgICogZ2V0VHJhbnNsYXRpb24oJ2FkbWluLXBhZ2UvZW4nKVxuICAgKi9cbiAgZ2V0VHJhbnNsYXRpb24oKTogTWFwPHN0cmluZywgVHJhbnNsYXRpb24+O1xuICBnZXRUcmFuc2xhdGlvbihsYW5nT3JTY29wZTogc3RyaW5nKTogVHJhbnNsYXRpb247XG4gIGdldFRyYW5zbGF0aW9uKGxhbmdPclNjb3BlPzogc3RyaW5nKTogTWFwPHN0cmluZywgVHJhbnNsYXRpb24+IHwgVHJhbnNsYXRpb24ge1xuICAgIGlmIChsYW5nT3JTY29wZSkge1xuICAgICAgaWYgKHRoaXMuaXNMYW5nKGxhbmdPclNjb3BlKSkge1xuICAgICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGlvbnMuZ2V0KGxhbmdPclNjb3BlKSB8fCB7fTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYSBzY29wZSwgYnVpbGQgdGhlIHNjb3BlIHZhbHVlIGZyb20gdGhlIHRyYW5zbGF0aW9uIG9iamVjdFxuICAgICAgICBjb25zdCB7IHNjb3BlLCByZXNvbHZlTGFuZyB9ID0gdGhpcy5yZXNvbHZlTGFuZ0FuZFNjb3BlKGxhbmdPclNjb3BlKTtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSB0aGlzLnRyYW5zbGF0aW9ucy5nZXQocmVzb2x2ZUxhbmcpIHx8IHt9O1xuXG4gICAgICAgIHJldHVybiB0aGlzLmdldE9iamVjdEJ5S2V5KHRyYW5zbGF0aW9uLCBzY29wZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudHJhbnNsYXRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgYW4gb2JqZWN0IG9mIHRyYW5zbGF0aW9ucyBmb3IgYSBnaXZlbiBsYW5ndWFnZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBzZWxlY3RUcmFuc2xhdGlvbigpLnN1YnNjcmliZSgpIC0gd2lsbCByZXR1cm4gdGhlIGN1cnJlbnQgbGFuZyB0cmFuc2xhdGlvblxuICAgKiBzZWxlY3RUcmFuc2xhdGlvbignZXMnKS5zdWJzY3JpYmUoKVxuICAgKiBzZWxlY3RUcmFuc2xhdGlvbignYWRtaW4tcGFnZScpLnN1YnNjcmliZSgpIC0gd2lsbCByZXR1cm4gdGhlIGN1cnJlbnQgbGFuZyBzY29wZSB0cmFuc2xhdGlvblxuICAgKiBzZWxlY3RUcmFuc2xhdGlvbignYWRtaW4tcGFnZS9lcycpLnN1YnNjcmliZSgpXG4gICAqL1xuICBzZWxlY3RUcmFuc2xhdGlvbihsYW5nPzogc3RyaW5nKTogT2JzZXJ2YWJsZTxUcmFuc2xhdGlvbj4ge1xuICAgIGxldCBsYW5ndWFnZSQgPSB0aGlzLmxhbmdDaGFuZ2VzJDtcbiAgICBpZiAobGFuZykge1xuICAgICAgY29uc3Qgc2NvcGVMYW5nU3BlY2lmaWVkID0gZ2V0TGFuZ0Zyb21TY29wZShsYW5nKSAhPT0gbGFuZztcbiAgICAgIGlmICh0aGlzLmlzTGFuZyhsYW5nKSB8fCBzY29wZUxhbmdTcGVjaWZpZWQpIHtcbiAgICAgICAgbGFuZ3VhZ2UkID0gb2YobGFuZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsYW5ndWFnZSQgPSB0aGlzLmxhbmdDaGFuZ2VzJC5waXBlKFxuICAgICAgICAgIG1hcCgoY3VycmVudExhbmcpID0+IGAke2xhbmd9LyR7Y3VycmVudExhbmd9YCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGxhbmd1YWdlJC5waXBlKFxuICAgICAgc3dpdGNoTWFwKChsYW5ndWFnZSkgPT5cbiAgICAgICAgdGhpcy5sb2FkKGxhbmd1YWdlKS5waXBlKG1hcCgoKSA9PiB0aGlzLmdldFRyYW5zbGF0aW9uKGxhbmd1YWdlKSkpLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgb3IgbWVyZ2UgYSBnaXZlbiB0cmFuc2xhdGlvbiBvYmplY3QgdG8gY3VycmVudCBsYW5nXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIHNldFRyYW5zbGF0aW9uKHsgLi4uIH0pXG4gICAqIHNldFRyYW5zbGF0aW9uKHsgLi4uIH0sICdlbicpXG4gICAqIHNldFRyYW5zbGF0aW9uKHsgLi4uIH0sICdlcycsIHsgbWVyZ2U6IGZhbHNlIH0gKVxuICAgKiBzZXRUcmFuc2xhdGlvbih7IC4uLiB9LCAndG9kb3MvZW4nLCB7IG1lcmdlOiBmYWxzZSB9IClcbiAgICovXG4gIHNldFRyYW5zbGF0aW9uKFxuICAgIHRyYW5zbGF0aW9uOiBUcmFuc2xhdGlvbixcbiAgICBsYW5nID0gdGhpcy5nZXRBY3RpdmVMYW5nKCksXG4gICAgb3B0aW9uczogU2V0VHJhbnNsYXRpb25PcHRpb25zID0ge30sXG4gICkge1xuICAgIGNvbnN0IGRlZmF1bHRzID0geyBtZXJnZTogdHJ1ZSwgZW1pdENoYW5nZTogdHJ1ZSB9O1xuICAgIGNvbnN0IG1lcmdlZE9wdGlvbnMgPSB7IC4uLmRlZmF1bHRzLCAuLi5vcHRpb25zIH07XG4gICAgY29uc3Qgc2NvcGUgPSBnZXRTY29wZUZyb21MYW5nKGxhbmcpO1xuXG4gICAgLyoqXG4gICAgICogSWYgdGhpcyBpc24ndCBhIHNjb3BlIHdlIHVzZSB0aGUgd2hvbGUgdHJhbnNsYXRpb24gYXMgaXNcbiAgICAgKiBvdGhlcndpc2Ugd2UgbmVlZCB0byBmbGF0IHRoZSBzY29wZSBhbmQgdXNlIGl0XG4gICAgICovXG4gICAgbGV0IGZsYXR0ZW5TY29wZU9yVHJhbnNsYXRpb24gPSB0cmFuc2xhdGlvbjtcblxuICAgIC8vIE1lcmdlZCB0aGUgc2NvcGVkIGxhbmd1YWdlIGludG8gdGhlIGFjdGl2ZSBsYW5ndWFnZVxuICAgIGlmIChzY29wZSkge1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRNYXBwZWRTY29wZShzY29wZSk7XG4gICAgICBmbGF0dGVuU2NvcGVPclRyYW5zbGF0aW9uID0gZmxhdHRlbih7IFtrZXldOiB0cmFuc2xhdGlvbiB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50TGFuZyA9IHNjb3BlID8gZ2V0TGFuZ0Zyb21TY29wZShsYW5nKSA6IGxhbmc7XG5cbiAgICBjb25zdCBtZXJnZWRUcmFuc2xhdGlvbiA9IHtcbiAgICAgIC4uLihtZXJnZWRPcHRpb25zLm1lcmdlICYmIHRoaXMuZ2V0VHJhbnNsYXRpb24oY3VycmVudExhbmcpKSxcbiAgICAgIC4uLmZsYXR0ZW5TY29wZU9yVHJhbnNsYXRpb24sXG4gICAgfTtcblxuICAgIGNvbnN0IGZsYXR0ZW5UcmFuc2xhdGlvbiA9IHRoaXMuY29uZmlnLmZsYXR0ZW4hLmFvdFxuICAgICAgPyBtZXJnZWRUcmFuc2xhdGlvblxuICAgICAgOiBmbGF0dGVuKG1lcmdlZFRyYW5zbGF0aW9uKTtcbiAgICBjb25zdCB3aXRoSG9vayA9IHRoaXMuaW50ZXJjZXB0b3IucHJlU2F2ZVRyYW5zbGF0aW9uKFxuICAgICAgZmxhdHRlblRyYW5zbGF0aW9uLFxuICAgICAgY3VycmVudExhbmcsXG4gICAgKTtcbiAgICB0aGlzLnRyYW5zbGF0aW9ucy5zZXQoY3VycmVudExhbmcsIHdpdGhIb29rKTtcbiAgICBtZXJnZWRPcHRpb25zLmVtaXRDaGFuZ2UgJiYgdGhpcy5zZXRBY3RpdmVMYW5nKHRoaXMuZ2V0QWN0aXZlTGFuZygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRyYW5zbGF0aW9uIGtleSB3aXRoIGdpdmVuIHZhbHVlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIHNldFRyYW5zbGF0aW9uS2V5KCdrZXknLCAndmFsdWUnKVxuICAgKiBzZXRUcmFuc2xhdGlvbktleSgna2V5Lm5lc3RlZCcsICd2YWx1ZScpXG4gICAqIHNldFRyYW5zbGF0aW9uS2V5KCdrZXkubmVzdGVkJywgJ3ZhbHVlJywgJ2VuJylcbiAgICogc2V0VHJhbnNsYXRpb25LZXkoJ2tleS5uZXN0ZWQnLCAndmFsdWUnLCAnZW4nLCB7IGVtaXRDaGFuZ2U6IGZhbHNlIH0gKVxuICAgKi9cbiAgc2V0VHJhbnNsYXRpb25LZXkoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiBPbWl0PFNldFRyYW5zbGF0aW9uT3B0aW9ucywgJ21lcmdlJz4gPSB7fSxcbiAgKSB7XG4gICAgY29uc3QgbGFuZyA9IG9wdGlvbnMubGFuZyB8fCB0aGlzLmdldEFjdGl2ZUxhbmcoKTtcbiAgICBjb25zdCB3aXRoSG9vayA9IHRoaXMuaW50ZXJjZXB0b3IucHJlU2F2ZVRyYW5zbGF0aW9uS2V5KGtleSwgdmFsdWUsIGxhbmcpO1xuICAgIGNvbnN0IG5ld1ZhbHVlID0ge1xuICAgICAgW2tleV06IHdpdGhIb29rLFxuICAgIH07XG5cbiAgICB0aGlzLnNldFRyYW5zbGF0aW9uKG5ld1ZhbHVlLCBsYW5nLCB7IC4uLm9wdGlvbnMsIG1lcmdlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGZhbGxiYWNrIGxhbmcgZm9yIHRoZSBjdXJyZW50bHkgYWN0aXZlIGxhbmd1YWdlXG4gICAqIEBwYXJhbSBmYWxsYmFja0xhbmdcbiAgICovXG4gIHNldEZhbGxiYWNrTGFuZ0Zvck1pc3NpbmdUcmFuc2xhdGlvbih7XG4gICAgZmFsbGJhY2tMYW5nLFxuICB9OiBQaWNrPFRyYW5zbG9jb0NvbmZpZywgJ2ZhbGxiYWNrTGFuZyc+KSB7XG4gICAgY29uc3QgbGFuZyA9IEFycmF5LmlzQXJyYXkoZmFsbGJhY2tMYW5nKSA/IGZhbGxiYWNrTGFuZ1swXSA6IGZhbGxiYWNrTGFuZztcbiAgICBpZiAoZmFsbGJhY2tMYW5nICYmIHRoaXMudXNlRmFsbGJhY2tUcmFuc2xhdGlvbihsYW5nKSkge1xuICAgICAgdGhpcy5maXJzdEZhbGxiYWNrTGFuZyA9IGxhbmchO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9oYW5kbGVNaXNzaW5nS2V5KGtleTogc3RyaW5nLCB2YWx1ZTogYW55LCBwYXJhbXM/OiBIYXNoTWFwKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnLm1pc3NpbmdIYW5kbGVyIS5hbGxvd0VtcHR5ICYmIHZhbHVlID09PSAnJykge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5pc1Jlc29sdmVkTWlzc2luZ09uY2UgJiYgdGhpcy51c2VGYWxsYmFja1RyYW5zbGF0aW9uKCkpIHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gc2V0IGl0IHRvIHRydWUgdG8gcHJldmVudCBhIGxvb3BcbiAgICAgIHRoaXMuaXNSZXNvbHZlZE1pc3NpbmdPbmNlID0gdHJ1ZTtcbiAgICAgIGNvbnN0IGZhbGxiYWNrVmFsdWUgPSB0aGlzLnRyYW5zbGF0ZShcbiAgICAgICAga2V5LFxuICAgICAgICBwYXJhbXMsXG4gICAgICAgIHRoaXMuZmlyc3RGYWxsYmFja0xhbmchLFxuICAgICAgKTtcbiAgICAgIHRoaXMuaXNSZXNvbHZlZE1pc3NpbmdPbmNlID0gZmFsc2U7XG5cbiAgICAgIHJldHVybiBmYWxsYmFja1ZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLm1pc3NpbmdIYW5kbGVyLmhhbmRsZShcbiAgICAgIGtleSxcbiAgICAgIHRoaXMuZ2V0TWlzc2luZ0hhbmRsZXJEYXRhKCksXG4gICAgICBwYXJhbXMsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9pc0xhbmdTY29wZWQobGFuZzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXZhaWxhYmxlTGFuZ3NJZHMoKS5pbmRleE9mKGxhbmcpID09PSAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSBnaXZlbiBzdHJpbmcgaXMgb25lIG9mIHRoZSBzcGVjaWZpZWQgYXZhaWxhYmxlIGxhbmd1YWdlcy5cbiAgICogQHJldHVybnNcbiAgICogVHJ1ZSBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGlzIGFuIGF2YWlsYWJsZSBsYW5ndWFnZS5cbiAgICogRmFsc2UgaWYgdGhlIGdpdmVuIHN0cmluZyBpcyBub3QgYW4gYXZhaWxhYmxlIGxhbmd1YWdlLlxuICAgKi9cbiAgaXNMYW5nKGxhbmc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldEF2YWlsYWJsZUxhbmdzSWRzKCkuaW5kZXhPZihsYW5nKSAhPT0gLTE7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqXG4gICAqIFdlIGFsd2F5cyB3YW50IHRvIG1ha2Ugc3VyZSB0aGUgZ2xvYmFsIGxhbmcgaXMgbG9hZGVkXG4gICAqIGJlZm9yZSBsb2FkaW5nIHRoZSBzY29wZSBzaW5jZSB5b3UgY2FuIGFjY2VzcyBib3RoIHZpYSB0aGUgcGlwZS9kaXJlY3RpdmUuXG4gICAqL1xuICBfbG9hZERlcGVuZGVuY2llcyhcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgaW5saW5lTG9hZGVyPzogSW5saW5lTG9hZGVyLFxuICApOiBPYnNlcnZhYmxlPFRyYW5zbGF0aW9uIHwgVHJhbnNsYXRpb25bXT4ge1xuICAgIGNvbnN0IG1haW5MYW5nID0gZ2V0TGFuZ0Zyb21TY29wZShwYXRoKTtcblxuICAgIGlmICh0aGlzLl9pc0xhbmdTY29wZWQocGF0aCkgJiYgIXRoaXMuaXNMb2FkZWRUcmFuc2xhdGlvbihtYWluTGFuZykpIHtcbiAgICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgdGhpcy5sb2FkKG1haW5MYW5nKSxcbiAgICAgICAgdGhpcy5sb2FkKHBhdGgsIHsgaW5saW5lTG9hZGVyIH0pLFxuICAgICAgXSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmxvYWQocGF0aCwgeyBpbmxpbmVMb2FkZXIgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfY29tcGxldGVTY29wZVdpdGhMYW5nKGxhbmdPclNjb3BlOiBzdHJpbmcpIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLl9pc0xhbmdTY29wZWQobGFuZ09yU2NvcGUpICYmXG4gICAgICAhdGhpcy5pc0xhbmcoZ2V0TGFuZ0Zyb21TY29wZShsYW5nT3JTY29wZSkpXG4gICAgKSB7XG4gICAgICByZXR1cm4gYCR7bGFuZ09yU2NvcGV9LyR7dGhpcy5nZXRBY3RpdmVMYW5nKCl9YDtcbiAgICB9XG4gICAgcmV0dXJuIGxhbmdPclNjb3BlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX3NldFNjb3BlQWxpYXMoc2NvcGU6IHN0cmluZywgYWxpYXM6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5jb25maWcuc2NvcGVNYXBwaW5nKSB7XG4gICAgICB0aGlzLmNvbmZpZy5zY29wZU1hcHBpbmcgPSB7fTtcbiAgICB9XG4gICAgdGhpcy5jb25maWcuc2NvcGVNYXBwaW5nW3Njb3BlXSA9IGFsaWFzO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgLy8gQ2FyZXRha2VyIG5vdGU6IHNpbmNlIHRoaXMgaXMgdGhlIHJvb3QgcHJvdmlkZXIsIGl0J2xsIGJlIGRlc3Ryb3llZCB3aGVuIHRoZSBgTmdNb2R1bGVSZWYuZGVzdHJveSgpYCBpcyBydW4uXG4gICAgLy8gQ2FjaGVkIHZhbHVlcyBjYXB0dXJlIGB0aGlzYCwgdGh1cyBsZWFkaW5nIHRvIGEgY2lyY3VsYXIgcmVmZXJlbmNlIGFuZCBwcmV2ZW50aW5nIHRoZSBgVHJhbnNsb2NvU2VydmljZWAgZnJvbVxuICAgIC8vIGJlaW5nIEdDJ2QuIFRoaXMgd291bGQgbGVhZCB0byBhIG1lbW9yeSBsZWFrIHdoZW4gc2VydmVyLXNpZGUgcmVuZGVyaW5nIGlzIHVzZWQgc2luY2UgdGhlIHNlcnZpY2UgaXMgY3JlYXRlZFxuICAgIC8vIGFuZCBkZXN0cm95ZWQgcGVyIGVhY2ggSFRUUCByZXF1ZXN0LCBidXQgYW55IHNlcnZpY2UgaXMgbm90IGdldHRpbmcgR0MnZC5cbiAgICB0aGlzLmNhY2hlLmNsZWFyKCk7XG4gIH1cblxuICBwcml2YXRlIGlzTG9hZGVkVHJhbnNsYXRpb24obGFuZzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHNpemUodGhpcy5nZXRUcmFuc2xhdGlvbihsYW5nKSk7XG4gIH1cblxuICBwcml2YXRlIGdldEF2YWlsYWJsZUxhbmdzSWRzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBmaXJzdCA9IHRoaXMuZ2V0QXZhaWxhYmxlTGFuZ3MoKVswXTtcblxuICAgIGlmIChpc1N0cmluZyhmaXJzdCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEF2YWlsYWJsZUxhbmdzKCkgYXMgc3RyaW5nW107XG4gICAgfVxuXG4gICAgcmV0dXJuICh0aGlzLmdldEF2YWlsYWJsZUxhbmdzKCkgYXMgTGFuZ0RlZmluaXRpb25bXSkubWFwKChsKSA9PiBsLmlkKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWlzc2luZ0hhbmRsZXJEYXRhKCk6IFRyYW5zbG9jb01pc3NpbmdIYW5kbGVyRGF0YSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgYWN0aXZlTGFuZzogdGhpcy5nZXRBY3RpdmVMYW5nKCksXG4gICAgICBhdmFpbGFibGVMYW5nczogdGhpcy5hdmFpbGFibGVMYW5ncyxcbiAgICAgIGRlZmF1bHRMYW5nOiB0aGlzLmRlZmF1bHRMYW5nLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVXNlIGEgZmFsbGJhY2sgdHJhbnNsYXRpb24gc2V0IGZvciBtaXNzaW5nIGtleXMgb2YgdGhlIHByaW1hcnkgbGFuZ3VhZ2VcbiAgICogVGhpcyBpcyB1bnJlbGF0ZWQgdG8gdGhlIGZhbGxiYWNrIGxhbmd1YWdlICh3aGljaCBjaGFuZ2VzIHRoZSBhY3RpdmUgbGFuZ3VhZ2UpXG4gICAqL1xuICBwcml2YXRlIHVzZUZhbGxiYWNrVHJhbnNsYXRpb24obGFuZz86IHN0cmluZykge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmNvbmZpZy5taXNzaW5nSGFuZGxlciEudXNlRmFsbGJhY2tUcmFuc2xhdGlvbiAmJlxuICAgICAgbGFuZyAhPT0gdGhpcy5maXJzdEZhbGxiYWNrTGFuZ1xuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVN1Y2Nlc3MobGFuZzogc3RyaW5nLCB0cmFuc2xhdGlvbjogVHJhbnNsYXRpb24pIHtcbiAgICB0aGlzLnNldFRyYW5zbGF0aW9uKHRyYW5zbGF0aW9uLCBsYW5nLCB7IGVtaXRDaGFuZ2U6IGZhbHNlIH0pO1xuICAgIHRoaXMuZXZlbnRzLm5leHQoe1xuICAgICAgd2FzRmFpbHVyZTogISF0aGlzLmZhaWxlZExhbmdzLnNpemUsXG4gICAgICB0eXBlOiAndHJhbnNsYXRpb25Mb2FkU3VjY2VzcycsXG4gICAgICBwYXlsb2FkOiBnZXRFdmVudFBheWxvYWQobGFuZyksXG4gICAgfSk7XG4gICAgdGhpcy5mYWlsZWRMYW5ncy5mb3JFYWNoKChsKSA9PiB0aGlzLmNhY2hlLmRlbGV0ZShsKSk7XG4gICAgdGhpcy5mYWlsZWRMYW5ncy5jbGVhcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVGYWlsdXJlKGxhbmc6IHN0cmluZywgbG9hZE9wdGlvbnM6IExvYWRPcHRpb25zKSB7XG4gICAgLy8gV2hlbiBzdGFydGluZyB0byBsb2FkIGEgZmlyc3QgY2hvaWNlIGxhbmd1YWdlLCBpbml0aWFsaXplXG4gICAgLy8gdGhlIGZhaWxlZCBjb3VudGVyIGFuZCByZXNvbHZlIHRoZSBmYWxsYmFjayBsYW5ncy5cbiAgICBpZiAoaXNOaWwobG9hZE9wdGlvbnMuZmFpbGVkQ291bnRlcikpIHtcbiAgICAgIGxvYWRPcHRpb25zLmZhaWxlZENvdW50ZXIgPSAwO1xuXG4gICAgICBpZiAoIWxvYWRPcHRpb25zLmZhbGxiYWNrTGFuZ3MpIHtcbiAgICAgICAgbG9hZE9wdGlvbnMuZmFsbGJhY2tMYW5ncyA9IHRoaXMuZmFsbGJhY2tTdHJhdGVneS5nZXROZXh0TGFuZ3MobGFuZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3BsaXR0ZWQgPSBsYW5nLnNwbGl0KCcvJyk7XG4gICAgY29uc3QgZmFsbGJhY2tzID0gbG9hZE9wdGlvbnMuZmFsbGJhY2tMYW5ncztcbiAgICBjb25zdCBuZXh0TGFuZyA9IGZhbGxiYWNrcyFbbG9hZE9wdGlvbnMuZmFpbGVkQ291bnRlciFdO1xuICAgIHRoaXMuZmFpbGVkTGFuZ3MuYWRkKGxhbmcpO1xuXG4gICAgLy8gVGhpcyBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGEgbG9hZGVkIGZhbGxiYWNrIGxhbmd1YWdlIGlzIHJlcXVlc3RlZCBhZ2FpblxuICAgIGlmICh0aGlzLmNhY2hlLmhhcyhuZXh0TGFuZykpIHtcbiAgICAgIHRoaXMuaGFuZGxlU3VjY2VzcyhuZXh0TGFuZywgdGhpcy5nZXRUcmFuc2xhdGlvbihuZXh0TGFuZykpO1xuICAgICAgcmV0dXJuIEVNUFRZO1xuICAgIH1cblxuICAgIGNvbnN0IGlzRmFsbGJhY2tMYW5nID0gbmV4dExhbmcgPT09IHNwbGl0dGVkW3NwbGl0dGVkLmxlbmd0aCAtIDFdO1xuXG4gICAgaWYgKCFuZXh0TGFuZyB8fCBpc0ZhbGxiYWNrTGFuZykge1xuICAgICAgbGV0IG1zZyA9IGBVbmFibGUgdG8gbG9hZCB0cmFuc2xhdGlvbiBhbmQgYWxsIHRoZSBmYWxsYmFjayBsYW5ndWFnZXNgO1xuICAgICAgaWYgKHNwbGl0dGVkLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgbXNnICs9IGAsIGRpZCB5b3UgbWlzc3BlbGxlZCB0aGUgc2NvcGUgbmFtZT9gO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICB9XG5cbiAgICBsZXQgcmVzb2x2ZUxhbmcgPSBuZXh0TGFuZztcbiAgICAvLyBpZiBpdCdzIHNjb3BlZCBsYW5nXG4gICAgaWYgKHNwbGl0dGVkLmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gcmVzb2x2ZSBpdCB0bzpcbiAgICAgIC8vIHRvZG9zL2xhbmdOb3RFeGlzdHMgPT4gdG9kb3MvbmV4dExhbmdcbiAgICAgIHNwbGl0dGVkW3NwbGl0dGVkLmxlbmd0aCAtIDFdID0gbmV4dExhbmc7XG4gICAgICByZXNvbHZlTGFuZyA9IHNwbGl0dGVkLmpvaW4oJy8nKTtcbiAgICB9XG5cbiAgICBsb2FkT3B0aW9ucy5mYWlsZWRDb3VudGVyISsrO1xuICAgIHRoaXMuZXZlbnRzLm5leHQoe1xuICAgICAgdHlwZTogJ3RyYW5zbGF0aW9uTG9hZEZhaWx1cmUnLFxuICAgICAgcGF5bG9hZDogZ2V0RXZlbnRQYXlsb2FkKGxhbmcpLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMubG9hZChyZXNvbHZlTGFuZywgbG9hZE9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNYXBwZWRTY29wZShzY29wZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IHNjb3BlTWFwcGluZyA9IHt9LCBzY29wZXMgPSB7IGtlZXBDYXNpbmc6IGZhbHNlIH0gfSA9IHRoaXMuY29uZmlnO1xuICAgIHJldHVybiAoXG4gICAgICBzY29wZU1hcHBpbmdbc2NvcGVdIHx8IChzY29wZXMua2VlcENhc2luZyA/IHNjb3BlIDogdG9DYW1lbENhc2Uoc2NvcGUpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSWYgbGFuZyBpcyBzY29wZSB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBmb2xsb3dpbmcgY2FzZXM6XG4gICAqIHRvZG9zL2VzID0+IGluIHRoaXMgY2FzZSB3ZSBzaG91bGQgdGFrZSBgZXNgIGFzIGxhbmdcbiAgICogdG9kb3MgPT4gaW4gdGhpcyBjYXNlIHdlIHNob3VsZCBzZXQgdGhlIGFjdGl2ZSBsYW5nIGFzIGxhbmdcbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUxhbmdBbmRTY29wZShsYW5nOiBzdHJpbmcpIHtcbiAgICBsZXQgcmVzb2x2ZUxhbmcgPSBsYW5nO1xuICAgIGxldCBzY29wZTtcblxuICAgIGlmICh0aGlzLl9pc0xhbmdTY29wZWQobGFuZykpIHtcbiAgICAgIC8vIGVuIGZvciBleGFtcGxlXG4gICAgICBjb25zdCBsYW5nRnJvbVNjb3BlID0gZ2V0TGFuZ0Zyb21TY29wZShsYW5nKTtcbiAgICAgIC8vIGVuIGlzIGxhbmdcbiAgICAgIGNvbnN0IGhhc0xhbmcgPSB0aGlzLmlzTGFuZyhsYW5nRnJvbVNjb3BlKTtcbiAgICAgIC8vIHRha2UgZW5cbiAgICAgIHJlc29sdmVMYW5nID0gaGFzTGFuZyA/IGxhbmdGcm9tU2NvcGUgOiB0aGlzLmdldEFjdGl2ZUxhbmcoKTtcbiAgICAgIC8vIGZpbmQgdGhlIHNjb3BlXG4gICAgICBzY29wZSA9IHRoaXMuZ2V0TWFwcGVkU2NvcGUoaGFzTGFuZyA/IGdldFNjb3BlRnJvbUxhbmcobGFuZykgOiBsYW5nKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBzY29wZSwgcmVzb2x2ZUxhbmcgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T2JqZWN0QnlLZXkodHJhbnNsYXRpb246IFRyYW5zbGF0aW9uLCBrZXk/OiBzdHJpbmcpIHtcbiAgICBjb25zdCByZXN1bHQ6IFRyYW5zbGF0aW9uID0ge307XG4gICAgY29uc3QgcHJlZml4ID0gYCR7a2V5fS5gO1xuXG4gICAgZm9yIChjb25zdCBjdXJyZW50S2V5IGluIHRyYW5zbGF0aW9uKSB7XG4gICAgICBpZiAoY3VycmVudEtleS5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICAgICAgcmVzdWx0W2N1cnJlbnRLZXkucmVwbGFjZShwcmVmaXgsICcnKV0gPSB0cmFuc2xhdGlvbltjdXJyZW50S2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbnRyaWVzKGtleTogSGFzaE1hcCB8IE1hcDxzdHJpbmcsIEhhc2hNYXA+KSB7XG4gICAgcmV0dXJuIGtleSBpbnN0YW5jZW9mIE1hcCA/IGtleS5lbnRyaWVzKCkgOiBPYmplY3QuZW50cmllcyhrZXkpO1xuICB9XG59XG4iXX0=
581
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsb2NvLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3RyYW5zbG9jby9zcmMvbGliL3RyYW5zbG9jby5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxVQUFVLEVBQ1YsTUFBTSxFQUNOLE1BQU0sRUFDTixVQUFVLEVBQ1YsUUFBUSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxlQUFlLEVBQ2YsVUFBVSxFQUNWLGFBQWEsRUFDYixLQUFLLEVBQ0wsUUFBUSxFQUNSLElBQUksRUFDSixHQUFHLEVBRUgsRUFBRSxFQUNGLEtBQUssRUFDTCxXQUFXLEVBQ1gsT0FBTyxFQUNQLFNBQVMsRUFDVCxHQUFHLEdBQ0osTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUVoRSxPQUFPLEVBQ0wsYUFBYSxFQUNiLGdCQUFnQixHQUVqQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFDTCxvQkFBb0IsR0FFckIsTUFBTSx3QkFBd0IsQ0FBQztBQWNoQyxPQUFPLEVBQ0wsT0FBTyxFQUNQLE9BQU8sRUFDUCxLQUFLLEVBQ0wsYUFBYSxFQUNiLFFBQVEsRUFDUixJQUFJLEVBQ0osV0FBVyxFQUNYLFNBQVMsR0FDVixNQUFNLFdBQVcsQ0FBQztBQUNuQixPQUFPLEVBQUUsZ0JBQWdCLEVBQW1CLE1BQU0sb0JBQW9CLENBQUM7QUFDdkUsT0FBTyxFQUNMLHlCQUF5QixHQUcxQixNQUFNLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFDTCxxQkFBcUIsR0FFdEIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQ0wsMkJBQTJCLEdBRTVCLE1BQU0sK0JBQStCLENBQUM7QUFDdkMsT0FBTyxFQUNMLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLG1CQUFtQixHQUNw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QU0sRUFBRTs7MEJBc0I3QixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGdCQUFnQjs7MEJBQ25DLE1BQU07MkJBQUMsb0JBQW9COzswQkFDM0IsTUFBTTsyQkFBQyx5QkFBeUI7OzBCQUVoQyxNQUFNOzJCQUFDLHFCQUFxQjs7MEJBQzVCLE1BQU07MkJBQUMsZ0JBQWdCOzswQkFDdkIsTUFBTTsyQkFBQywyQkFBMkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEZXN0cm95UmVmLFxuICBpbmplY3QsXG4gIEluamVjdCxcbiAgSW5qZWN0YWJsZSxcbiAgT3B0aW9uYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBjYXRjaEVycm9yLFxuICBjb21iaW5lTGF0ZXN0LFxuICBFTVBUWSxcbiAgZm9ya0pvaW4sXG4gIGZyb20sXG4gIG1hcCxcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIHJldHJ5LFxuICBzaGFyZVJlcGxheSxcbiAgU3ViamVjdCxcbiAgc3dpdGNoTWFwLFxuICB0YXAsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5pbXBvcnQge1xuICBEZWZhdWx0TG9hZGVyLFxuICBUUkFOU0xPQ09fTE9BREVSLFxuICBUcmFuc2xvY29Mb2FkZXIsXG59IGZyb20gJy4vdHJhbnNsb2NvLmxvYWRlcic7XG5pbXBvcnQge1xuICBUUkFOU0xPQ09fVFJBTlNQSUxFUixcbiAgVHJhbnNsb2NvVHJhbnNwaWxlcixcbn0gZnJvbSAnLi90cmFuc2xvY28udHJhbnNwaWxlcic7XG5pbXBvcnQge1xuICBBdmFpbGFibGVMYW5ncyxcbiAgSGFzaE1hcCxcbiAgSW5saW5lTG9hZGVyLFxuICBMYW5nRGVmaW5pdGlvbixcbiAgTG9hZE9wdGlvbnMsXG4gIFNldFRyYW5zbGF0aW9uT3B0aW9ucyxcbiAgVHJhbnNsYXRlT2JqZWN0UGFyYW1zLFxuICBUcmFuc2xhdGVQYXJhbXMsXG4gIFRyYW5zbGF0aW9uLFxuICBUcmFuc2xvY29FdmVudHMsXG4gIFRyYW5zbG9jb1Njb3BlLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7XG4gIGZsYXR0ZW4sXG4gIGlzRW1wdHksXG4gIGlzTmlsLFxuICBpc1Njb3BlT2JqZWN0LFxuICBpc1N0cmluZyxcbiAgc2l6ZSxcbiAgdG9DYW1lbENhc2UsXG4gIHVuZmxhdHRlbixcbn0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IFRSQU5TTE9DT19DT05GSUcsIFRyYW5zbG9jb0NvbmZpZyB9IGZyb20gJy4vdHJhbnNsb2NvLmNvbmZpZyc7XG5pbXBvcnQge1xuICBUUkFOU0xPQ09fTUlTU0lOR19IQU5ETEVSLFxuICBUcmFuc2xvY29NaXNzaW5nSGFuZGxlcixcbiAgVHJhbnNsb2NvTWlzc2luZ0hhbmRsZXJEYXRhLFxufSBmcm9tICcuL3RyYW5zbG9jby1taXNzaW5nLWhhbmRsZXInO1xuaW1wb3J0IHtcbiAgVFJBTlNMT0NPX0lOVEVSQ0VQVE9SLFxuICBUcmFuc2xvY29JbnRlcmNlcHRvcixcbn0gZnJvbSAnLi90cmFuc2xvY28uaW50ZXJjZXB0b3InO1xuaW1wb3J0IHtcbiAgVFJBTlNMT0NPX0ZBTExCQUNLX1NUUkFURUdZLFxuICBUcmFuc2xvY29GYWxsYmFja1N0cmF0ZWd5LFxufSBmcm9tICcuL3RyYW5zbG9jby1mYWxsYmFjay1zdHJhdGVneSc7XG5pbXBvcnQge1xuICBnZXRFdmVudFBheWxvYWQsXG4gIGdldExhbmdGcm9tU2NvcGUsXG4gIGdldFNjb3BlRnJvbUxhbmcsXG4gIHJlc29sdmVJbmxpbmVMb2FkZXIsXG59IGZyb20gJy4vc2hhcmVkJztcbmltcG9ydCB7IGdldEZhbGxiYWNrc0xvYWRlcnMgfSBmcm9tICcuL2dldC1mYWxsYmFja3MtbG9hZGVycyc7XG5pbXBvcnQgeyByZXNvbHZlTG9hZGVyIH0gZnJvbSAnLi9yZXNvbHZlLWxvYWRlcic7XG5cbmxldCBzZXJ2aWNlOiBUcmFuc2xvY29TZXJ2aWNlO1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlPFQgPSBzdHJpbmc+KFxuICBrZXk6IFRyYW5zbGF0ZVBhcmFtcyxcbiAgcGFyYW1zOiBIYXNoTWFwID0ge30sXG4gIGxhbmc/OiBzdHJpbmcsXG4pOiBUIHtcbiAgcmV0dXJuIHNlcnZpY2UudHJhbnNsYXRlPFQ+KGtleSwgcGFyYW1zLCBsYW5nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zbGF0ZU9iamVjdDxUPihcbiAga2V5OiBUcmFuc2xhdGVQYXJhbXMsXG4gIHBhcmFtczogSGFzaE1hcCA9IHt9LFxuICBsYW5nPzogc3RyaW5nLFxuKTogVCB8IFRbXSB7XG4gIHJldHVybiBzZXJ2aWNlLnRyYW5zbGF0ZU9iamVjdDxUPihrZXksIHBhcmFtcywgbGFuZyk7XG59XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgVHJhbnNsb2NvU2VydmljZSB7XG4gIGxhbmdDaGFuZ2VzJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuXG4gIHByaXZhdGUgdHJhbnNsYXRpb25zID0gbmV3IE1hcDxzdHJpbmcsIFRyYW5zbGF0aW9uPigpO1xuICBwcml2YXRlIGNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE9ic2VydmFibGU8VHJhbnNsYXRpb24+PigpO1xuICBwcml2YXRlIGZpcnN0RmFsbGJhY2tMYW5nOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZGVmYXVsdExhbmcgPSAnJztcbiAgcHJpdmF0ZSBhdmFpbGFibGVMYW5nczogQXZhaWxhYmxlTGFuZ3MgPSBbXTtcbiAgcHJpdmF0ZSBpc1Jlc29sdmVkTWlzc2luZ09uY2UgPSBmYWxzZTtcbiAgcHJpdmF0ZSBsYW5nOiBCZWhhdmlvclN1YmplY3Q8c3RyaW5nPjtcbiAgcHJpdmF0ZSBmYWlsZWRMYW5ncyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIGV2ZW50cyA9IG5ldyBTdWJqZWN0PFRyYW5zbG9jb0V2ZW50cz4oKTtcblxuICBldmVudHMkID0gdGhpcy5ldmVudHMuYXNPYnNlcnZhYmxlKCk7XG4gIHJlYWRvbmx5IGNvbmZpZzogVHJhbnNsb2NvQ29uZmlnICYge1xuICAgIHNjb3BlTWFwcGluZz86IEhhc2hNYXA8c3RyaW5nPjtcbiAgfTtcblxuICBwcml2YXRlIGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChUUkFOU0xPQ09fTE9BREVSKSBwcml2YXRlIGxvYWRlcjogVHJhbnNsb2NvTG9hZGVyLFxuICAgIEBJbmplY3QoVFJBTlNMT0NPX1RSQU5TUElMRVIpIHByaXZhdGUgcGFyc2VyOiBUcmFuc2xvY29UcmFuc3BpbGVyLFxuICAgIEBJbmplY3QoVFJBTlNMT0NPX01JU1NJTkdfSEFORExFUilcbiAgICBwcml2YXRlIG1pc3NpbmdIYW5kbGVyOiBUcmFuc2xvY29NaXNzaW5nSGFuZGxlcixcbiAgICBASW5qZWN0KFRSQU5TTE9DT19JTlRFUkNFUFRPUikgcHJpdmF0ZSBpbnRlcmNlcHRvcjogVHJhbnNsb2NvSW50ZXJjZXB0b3IsXG4gICAgQEluamVjdChUUkFOU0xPQ09fQ09ORklHKSB1c2VyQ29uZmlnOiBUcmFuc2xvY29Db25maWcsXG4gICAgQEluamVjdChUUkFOU0xPQ09fRkFMTEJBQ0tfU1RSQVRFR1kpXG4gICAgcHJpdmF0ZSBmYWxsYmFja1N0cmF0ZWd5OiBUcmFuc2xvY29GYWxsYmFja1N0cmF0ZWd5LFxuICApIHtcbiAgICBpZiAoIXRoaXMubG9hZGVyKSB7XG4gICAgICB0aGlzLmxvYWRlciA9IG5ldyBEZWZhdWx0TG9hZGVyKHRoaXMudHJhbnNsYXRpb25zKTtcbiAgICB9XG4gICAgc2VydmljZSA9IHRoaXM7XG4gICAgdGhpcy5jb25maWcgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHVzZXJDb25maWcpKTtcblxuICAgIHRoaXMuc2V0QXZhaWxhYmxlTGFuZ3ModGhpcy5jb25maWcuYXZhaWxhYmxlTGFuZ3MgfHwgW10pO1xuICAgIHRoaXMuc2V0RmFsbGJhY2tMYW5nRm9yTWlzc2luZ1RyYW5zbGF0aW9uKHRoaXMuY29uZmlnKTtcbiAgICB0aGlzLnNldERlZmF1bHRMYW5nKHRoaXMuY29uZmlnLmRlZmF1bHRMYW5nKTtcbiAgICB0aGlzLmxhbmcgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4odGhpcy5nZXREZWZhdWx0TGFuZygpKTtcbiAgICAvLyBEb24ndCB1c2UgZGlzdGluY3RVbnRpbENoYW5nZWQgYXMgd2UgbmVlZCB0aGUgYWJpbGl0eSB0byB1cGRhdGVcbiAgICAvLyB0aGUgdmFsdWUgd2hlbiB1c2luZyBzZXRUcmFuc2xhdGlvbiBvciBzZXRUcmFuc2xhdGlvbktleXNcbiAgICB0aGlzLmxhbmdDaGFuZ2VzJCA9IHRoaXMubGFuZy5hc09ic2VydmFibGUoKTtcblxuICAgIC8qKlxuICAgICAqIFdoZW4gd2UgaGF2ZSBhIGZhaWx1cmUsIHdlIHdhbnQgdG8gZGVmaW5lIHRoZSBuZXh0IGxhbmd1YWdlIHRoYXQgc3VjY2VlZGVkIGFzIHRoZSBhY3RpdmVcbiAgICAgKi9cbiAgICB0aGlzLmV2ZW50cyQuc3Vic2NyaWJlKChlKSA9PiB7XG4gICAgICBpZiAoZS50eXBlID09PSAndHJhbnNsYXRpb25Mb2FkU3VjY2VzcycgJiYgZS53YXNGYWlsdXJlKSB7XG4gICAgICAgIHRoaXMuc2V0QWN0aXZlTGFuZyhlLnBheWxvYWQubGFuZ05hbWUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5kZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiB7XG4gICAgICAvLyBDb21wbGV0ZSBzdWJqZWN0cyB0byByZWxlYXNlIG9ic2VydmVycyBpZiB1c2VycyBmb3JnZXQgdG8gdW5zdWJzY3JpYmUgbWFudWFsbHkuXG4gICAgICAvLyBUaGlzIGlzIGltcG9ydGFudCBpbiBzZXJ2ZXItc2lkZSByZW5kZXJpbmcuXG4gICAgICB0aGlzLmxhbmcuY29tcGxldGUoKTtcbiAgICAgIHRoaXMuZXZlbnRzLmNvbXBsZXRlKCk7XG4gICAgICAvLyBBcyBhIHJvb3QgcHJvdmlkZXIsIHRoaXMgc2VydmljZSBpcyBkZXN0cm95ZWQgd2l0aCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBkZXN0cm95ZWQuXG4gICAgICAvLyBDYWNoZWQgdmFsdWVzIHJldGFpbiBgdGhpc2AsIGNhdXNpbmcgY2lyY3VsYXIgcmVmZXJlbmNlcyB0aGF0IGJsb2NrIGdhcmJhZ2UgY29sbGVjdGlvbixcbiAgICAgIC8vIGxlYWRpbmcgdG8gbWVtb3J5IGxlYWtzIGR1cmluZyBzZXJ2ZXItc2lkZSByZW5kZXJpbmcuXG4gICAgICB0aGlzLmNhY2hlLmNsZWFyKCk7XG4gICAgfSk7XG4gIH1cblxuICBnZXREZWZhdWx0TGFuZygpIHtcbiAgICByZXR1cm4gdGhpcy5kZWZhdWx0TGFuZztcbiAgfVxuXG4gIHNldERlZmF1bHRMYW5nKGxhbmc6IHN0cmluZykge1xuICAgIHRoaXMuZGVmYXVsdExhbmcgPSBsYW5nO1xuICB9XG5cbiAgZ2V0QWN0aXZlTGFuZygpIHtcbiAgICByZXR1cm4gdGhpcy5sYW5nLmdldFZhbHVlKCk7XG4gIH1cblxuICBzZXRBY3RpdmVMYW5nKGxhbmc6IHN0cmluZykge1xuICAgIHRoaXMucGFyc2VyLm9uTGFuZ0NoYW5nZWQ/LihsYW5nKTtcbiAgICB0aGlzLmxhbmcubmV4dChsYW5nKTtcbiAgICB0aGlzLmV2ZW50cy5uZXh0KHtcbiAgICAgIHR5cGU6ICdsYW5nQ2hhbmdlZCcsXG4gICAgICBwYXlsb2FkOiBnZXRFdmVudFBheWxvYWQobGFuZyksXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBzZXRBdmFpbGFibGVMYW5ncyhsYW5nczogQXZhaWxhYmxlTGFuZ3MpIHtcbiAgICB0aGlzLmF2YWlsYWJsZUxhbmdzID0gbGFuZ3M7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgYXZhaWxhYmxlIGxhbmd1YWdlcy5cbiAgICpcbiAgICogQHJldHVybnNcbiAgICogQW4gYXJyYXkgb2YgdGhlIGF2YWlsYWJsZSBsYW5ndWFnZXMuIENhbiBiZSBlaXRoZXIgYSBgc3RyaW5nW11gIG9yIGEgYHsgaWQ6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W11gXG4gICAqIGRlcGVuZGluZyBvbiBob3cgdGhlIGF2YWlsYWJsZSBsYW5ndWFnZXMgYXJlIHNldCBpbiB5b3VyIG1vZHVsZS5cbiAgICovXG4gIGdldEF2YWlsYWJsZUxhbmdzKCkge1xuICAgIHJldHVybiB0aGlzLmF2YWlsYWJsZUxhbmdzO1xuICB9XG5cbiAgbG9hZChwYXRoOiBzdHJpbmcsIG9wdGlvbnM6IExvYWRPcHRpb25zID0ge30pOiBPYnNlcnZhYmxlPFRyYW5zbGF0aW9uPiB7XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5jYWNoZS5nZXQocGF0aCk7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG5cbiAgICBsZXQgbG9hZFRyYW5zbGF0aW9uOiBPYnNlcnZhYmxlPFxuICAgICAgVHJhbnNsYXRpb24gfCB7IHRyYW5zbGF0aW9uOiBUcmFuc2xhdGlvbjsgbGFuZzogc3RyaW5nIH1bXVxuICAgID47XG4gICAgY29uc3QgaXNTY29wZSA9IHRoaXMuX2lzTGFuZ1Njb3BlZChwYXRoKTtcbiAgICBsZXQgc2NvcGU6IHN0cmluZztcbiAgICBpZiAoaXNTY29wZSkge1xuICAgICAgc2NvcGUgPSBnZXRTY29wZUZyb21MYW5nKHBhdGgpO1xuICAgIH1cblxuICAgIGNvbnN0IGxvYWRlcnNPcHRpb25zID0ge1xuICAgICAgcGF0aCxcbiAgICAgIG1haW5Mb2FkZXI6IHRoaXMubG9hZGVyLFxuICAgICAgaW5saW5lTG9hZGVyOiBvcHRpb25zLmlubGluZUxvYWRlcixcbiAgICAgIGRhdGE6IGlzU2NvcGUgPyB7IHNjb3BlOiBzY29wZSEgfSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMudXNlRmFsbGJhY2tUcmFuc2xhdGlvbihwYXRoKSkge1xuICAgICAgLy8gaWYgdGhlIHBhdGggaXMgc2NvcGUgdGhlIGZhbGxiYWNrIHNob3VsZCBiZSBgc2NvcGUvZmFsbGJhY2tMYW5nYDtcbiAgICAgIGNvbnN0IGZhbGxiYWNrID0gaXNTY29wZVxuICAgICAgICA/IGAke3Njb3BlIX0vJHt0aGlzLmZpcnN0RmFsbGJhY2tMYW5nfWBcbiAgICAgICAgOiB0aGlzLmZpcnN0RmFsbGJhY2tMYW5nO1xuXG4gICAgICBjb25zdCBsb2FkZXJzID0gZ2V0RmFsbGJhY2tzTG9hZGVycyh7XG4gICAgICAgIC4uLmxvYWRlcnNPcHRpb25zLFxuICAgICAgICBmYWxsYmFja1BhdGg6IGZhbGxiYWNrISxcbiAgICAgIH0pO1xuICAgICAgbG9hZFRyYW5zbGF0aW9uID0gZm9ya0pvaW4obG9hZGVycyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGxvYWRlciA9IHJlc29sdmVMb2FkZXIobG9hZGVyc09wdGlvbnMpO1xuICAgICAgbG9hZFRyYW5zbGF0aW9uID0gZnJvbShsb2FkZXIpO1xuICAgIH1cblxuICAgIGNvbnN0IGxvYWQkID0gbG9hZFRyYW5zbGF0aW9uLnBpcGUoXG4gICAgICByZXRyeSh0aGlzLmNvbmZpZy5mYWlsZWRSZXRyaWVzKSxcbiAgICAgIHRhcCgodHJhbnNsYXRpb24pID0+IHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodHJhbnNsYXRpb24pKSB7XG4gICAgICAgICAgdHJhbnNsYXRpb24uZm9yRWFjaCgodCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVTdWNjZXNzKHQubGFuZywgdC50cmFuc2xhdGlvbik7XG4gICAgICAgICAgICAvLyBTYXZlIHRoZSBmYWxsYmFjayBpbiBjYWNoZSBzbyB3ZSdsbCBub3QgY3JlYXRlIGEgcmVkdW5kYW50IHJlcXVlc3RcbiAgICAgICAgICAgIGlmICh0LmxhbmcgIT09IHBhdGgpIHtcbiAgICAgICAgICAgICAgdGhpcy5jYWNoZS5zZXQodC5sYW5nLCBvZih7fSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhhbmRsZVN1Y2Nlc3MocGF0aCwgdHJhbnNsYXRpb24pO1xuICAgICAgfSksXG4gICAgICBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuY29uZmlnLnByb2RNb2RlKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGxvYWQgXCIke3BhdGh9XCJgLCBlcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVGYWlsdXJlKHBhdGgsIG9wdGlvbnMpO1xuICAgICAgfSksXG4gICAgICBzaGFyZVJlcGxheSgxKSxcbiAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpLFxuICAgICk7XG5cbiAgICB0aGlzLmNhY2hlLnNldChwYXRoLCBsb2FkJCk7XG5cbiAgICByZXR1cm4gbG9hZCQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgaW5zdGFudCB0cmFuc2xhdGVkIHZhbHVlIG9mIGEga2V5XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIHRyYW5zbGF0ZTxzdHJpbmc+KCdoZWxsbycpXG4gICAqIHRyYW5zbGF0ZSgnaGVsbG8nLCB7IHZhbHVlOiAndmFsdWUnIH0pXG4gICAqIHRyYW5zbGF0ZTxzdHJpbmdbXT4oWydoZWxsbycsICdrZXknXSlcbiAgICogdHJhbnNsYXRlKCdoZWxsbycsIHsgfSwgJ2VuJylcbiAgICogdHJhbnNsYXRlKCdzY29wZS5zb21lS2V5JywgeyB9LCAnZW4nKVxuICAgKi9cbiAgdHJhbnNsYXRlPFQgPSBzdHJpbmc+KFxuICAgIGtleTogVHJhbnNsYXRlUGFyYW1zLFxuICAgIHBhcmFtczogSGFzaE1hcCA9IHt9LFxuICAgIGxhbmcgPSB0aGlzLmdldEFjdGl2ZUxhbmcoKSxcbiAgKTogVCB7XG4gICAgaWYgKCFrZXkpIHJldHVybiBrZXkgYXMgYW55O1xuXG4gICAgY29uc3QgeyBzY29wZSwgcmVzb2x2ZUxhbmcgfSA9IHRoaXMucmVzb2x2ZUxhbmdBbmRTY29wZShsYW5nKTtcblxuICAgIGlmIChBcnJheS5pc0FycmF5KGtleSkpIHtcbiAgICAgIHJldHVybiBrZXkubWFwKChrKSA9PlxuICAgICAgICB0aGlzLnRyYW5zbGF0ZShzY29wZSA/IGAke3Njb3BlfS4ke2t9YCA6IGssIHBhcmFtcywgcmVzb2x2ZUxhbmcpLFxuICAgICAgKSBhcyBhbnk7XG4gICAgfVxuXG4gICAga2V5ID0gc2NvcGUgPyBgJHtzY29wZX0uJHtrZXl9YCA6IGtleTtcblxuICAgIGNvbnN0IHRyYW5zbGF0aW9uID0gdGhpcy5nZXRUcmFuc2xhdGlvbihyZXNvbHZlTGFuZyk7XG4gICAgY29uc3QgdmFsdWUgPSB0cmFuc2xhdGlvbltrZXldO1xuXG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2hhbmRsZU1pc3NpbmdLZXkoa2V5LCB2YWx1ZSwgcGFyYW1zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wYXJzZXIudHJhbnNwaWxlKHtcbiAgICAgIHZhbHVlLFxuICAgICAgcGFyYW1zLFxuICAgICAgdHJhbnNsYXRpb24sXG4gICAgICBrZXksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdHJhbnNsYXRlZCB2YWx1ZSBvZiBhIGtleSBhcyBvYnNlcnZhYmxlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIHNlbGVjdFRyYW5zbGF0ZTxzdHJpbmc+KCdoZWxsbycpLnN1YnNjcmliZSh2YWx1ZSA9PiAuLi4pXG4gICAqIHNlbGVjdFRyYW5zbGF0ZTxzdHJpbmc+KCdoZWxsbycsIHt9LCAnZXMnKS5zdWJzY3JpYmUodmFsdWUgPT4gLi4uKVxuICAgKiBzZWxlY3RUcmFuc2xhdGU8c3RyaW5nPignaGVsbG8nLCB7fSwgJ3RvZG9zJykuc3Vic2NyaWJlKHZhbHVlID0+IC4uLilcbiAgICogc2VsZWN0VHJhbnNsYXRlPHN0cmluZz4oJ2hlbGxvJywge30sIHsgc2NvcGU6ICd0b2RvcycgfSkuc3Vic2NyaWJlKHZhbHVlID0+IC4uLilcbiAgICpcbiAgICovXG4gIHNlbGVjdFRyYW5zbGF0ZTxUID0gYW55PihcbiAgICBrZXk6IFRyYW5zbGF0ZVBhcmFtcyxcbiAgICBwYXJhbXM/OiBIYXNoTWFwLFxuICAgIGxhbmc/OiBzdHJpbmcgfCBUcmFuc2xvY29TY29wZSB8IFRyYW5zbG9jb1Njb3BlW10sXG4gICAgX2lzT2JqZWN0ID0gZmFsc2UsXG4gICk6IE9ic2VydmFibGU8VD4ge1xuICAgIGxldCBpbmxpbmVMb2FkZXI6IElubGluZUxvYWRlciB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBsb2FkID0gKGxhbmc6IHN0cmluZywgb3B0aW9ucz86IExvYWRPcHRpb25zKSA9PlxuICAgICAgdGhpcy5sb2FkKGxhbmcsIG9wdGlvbnMpLnBpcGUoXG4gICAgICAgIG1hcCgoKSA9PlxuICAgICAgICAgIF9pc09iamVjdFxuICAgICAgICAgICAgPyB0aGlzLnRyYW5zbGF0ZU9iamVjdChrZXksIHBhcmFtcywgbGFuZylcbiAgICAgICAgICAgIDogdGhpcy50cmFuc2xhdGUoa2V5LCBwYXJhbXMsIGxhbmcpLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICBpZiAoaXNOaWwobGFuZykpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhbmdDaGFuZ2VzJC5waXBlKHN3aXRjaE1hcCgobGFuZykgPT4gbG9hZChsYW5nKSkpO1xuICAgIH1cblxuICAgIGxhbmcgPSBBcnJheS5pc0FycmF5KGxhbmcpID8gbGFuZ1swXSA6IGxhbmc7XG4gICAgaWYgKGlzU2NvcGVPYmplY3QobGFuZykpIHtcbiAgICAgIC8vIGl0J3MgYSBzY29wZSBvYmplY3QuXG4gICAgICBjb25zdCBwcm92aWRlclNjb3BlID0gbGFuZztcbiAgICAgIGxhbmcgPSBwcm92aWRlclNjb3BlLnNjb3BlO1xuICAgICAgaW5saW5lTG9hZGVyID0gcmVzb2x2ZUlubGluZUxvYWRlcihwcm92aWRlclNjb3BlLCBwcm92aWRlclNjb3BlLnNjb3BlKTtcbiAgICB9XG5cbiAgICBsYW5nID0gbGFuZyBhcyBzdHJpbmc7XG4gICAgaWYgKHRoaXMuaXNMYW5nKGxhbmcpIHx8IHRoaXMuaXNTY29wZVdpdGhMYW5nKGxhbmcpKSB7XG4gICAgICByZXR1cm4gbG9hZChsYW5nKTtcbiAgICB9XG4gICAgLy8gaXQncyBhIHNjb3BlXG4gICAgY29uc3Qgc2NvcGUgPSBsYW5nO1xuICAgIHJldHVybiB0aGlzLmxhbmdDaGFuZ2VzJC5waXBlKFxuICAgICAgc3dpdGNoTWFwKChsYW5nKSA9PiBsb2FkKGAke3Njb3BlfS8ke2xhbmd9YCwgeyBpbmxpbmVMb2FkZXIgfSkpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciB0aGUgc2NvcGUgd2l0aCBsYW5nXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIHRvZG9zL2VuID0+IHRydWVcbiAgICogdG9kb3MgPT4gZmFsc2VcbiAgICovXG4gIHByaXZhdGUgaXNTY29wZVdpdGhMYW5nKGxhbmc6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmlzTGFuZyhnZXRMYW5nRnJvbVNjb3BlKGxhbmcpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2xhdGUgdGhlIGdpdmVuIHBhdGggdGhhdCByZXR1cm5zIGFuIG9iamVjdFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiBzZXJ2aWNlLnRyYW5zbGF0ZU9iamVjdCgncGF0aC50by5vYmplY3QnLCB7J3N1YnBhdGgnOiB7IHZhbHVlOiAnc29tZVZhbHVlJ319KSA9PiByZXR1cm5zIHRyYW5zbGF0ZWQgb2JqZWN0XG4gICAqXG4gICAqL1xuICB0cmFuc2xhdGVPYmplY3Q8VCA9IGFueT4oa2V5OiBzdHJpbmcsIHBhcmFtcz86IEhhc2hNYXAsIGxhbmc/OiBzdHJpbmcpOiBUO1xuICB0cmFuc2xhdGVPYmplY3Q8VCA9IGFueT4oa2V5OiBzdHJpbmdbXSwgcGFyYW1zPzogSGFzaE1hcCwgbGFuZz86IHN0cmluZyk6IFRbXTtcbiAgdHJhbnNsYXRlT2JqZWN0PFQgPSBhbnk+KFxuICAgIGtleTogVHJhbnNsYXRlUGFyYW1zLFxuICAgIHBhcmFtcz86IEhhc2hNYXAsXG4gICAgbGFuZz86IHN0cmluZyxcbiAgKTogVCB8IFRbXTtcbiAgdHJhbnNsYXRlT2JqZWN0PFQgPSBhbnk+KFxuICAgIGtleTogSGFzaE1hcCB8IE1hcDxzdHJpbmcsIEhhc2hNYXA+LFxuICAgIHBhcmFtcz86IG51bGwsXG4gICAgbGFuZz86IHN0cmluZyxcbiAgKTogVFtdO1xuICB0cmFuc2xhdGVPYmplY3Q8VCA9IGFueT4oXG4gICAga2V5OiBUcmFuc2xhdGVPYmplY3RQYXJhbXMsXG4gICAgcGFyYW1zOiBIYXNoTWFwIHwgbnVsbCA9IHt9LFxuICAgIGxhbmcgPSB0aGlzLmdldEFjdGl2ZUxhbmcoKSxcbiAgKTogVCB8IFRbXSB7XG4gICAgaWYgKGlzU3RyaW5nKGtleSkgfHwgQXJyYXkuaXNBcnJheShrZXkpKSB7XG4gICAgICBjb25zdCB7IHJlc29sdmVMYW5nLCBzY29wZSB9ID0gdGhpcy5yZXNvbHZlTGFuZ0FuZFNjb3BlKGxhbmcpO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoa2V5KSkge1xuICAgICAgICByZXR1cm4ga2V5Lm1hcCgoaykgPT5cbiAgICAgICAgICB0aGlzLnRyYW5zbGF0ZU9iamVjdChcbiAgICAgICAgICAgIHNjb3BlID8gYCR7c2NvcGV9LiR7a31gIDogayxcbiAgICAgICAgICAgIHBhcmFtcyEsXG4gICAgICAgICAgICByZXNvbHZlTGFuZyxcbiAgICAgICAgICApLFxuICAgICAgICApIGFzIGFueTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdHJhbnNsYXRpb24gPSB0aGlzLmdldFRyYW5zbGF0aW9uKHJlc29sdmVMYW5nKTtcbiAgICAgIGtleSA9IHNjb3BlID8gYCR7c2NvcGV9LiR7a2V5fWAgOiBrZXk7XG5cbiAgICAgIGNvbnN0IHZhbHVlID0gdW5mbGF0dGVuKHRoaXMuZ2V0T2JqZWN0QnlLZXkodHJhbnNsYXRpb24sIGtleSkpO1xuICAgICAgLyogSWYgYW4gZW1wdHkgb2JqZWN0IHdhcyByZXR1cm5lZCB3ZSB3YW50IHRvIHRyeSBhbmQgdHJhbnNsYXRlIHRoZSBrZXkgYXMgYSBzdHJpbmcgYW5kIG5vdCBhbiBvYmplY3QgKi9cbiAgICAgIHJldHVybiBpc0VtcHR5KHZhbHVlKVxuICAgICAgICA/IHRoaXMudHJhbnNsYXRlKGtleSwgcGFyYW1zISwgbGFuZylcbiAgICAgICAgOiB0aGlzLnBhcnNlci50cmFuc3BpbGUoeyB2YWx1ZSwgcGFyYW1zOiBwYXJhbXMhLCB0cmFuc2xhdGlvbiwga2V5IH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHRyYW5zbGF0aW9uczogVFtdID0gW107XG4gICAgZm9yIChjb25zdCBbX2tleSwgX3BhcmFtc10gb2YgdGhpcy5nZXRFbnRyaWVzKGtleSkpIHtcbiAgICAgIHRyYW5zbGF0aW9ucy5wdXNoKHRoaXMudHJhbnNsYXRlT2JqZWN0KF9rZXksIF9wYXJhbXMsIGxhbmcpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJhbnNsYXRpb25zO1xuICB9XG5cbiAgc2VsZWN0VHJhbnNsYXRlT2JqZWN0PFQgPSBhbnk+KFxuICAgIGtleTogc3RyaW5nLFxuICAgIHBhcmFtcz86IEhhc2hNYXAsXG4gICAgbGFuZz86IHN0cmluZyxcbiAgKTogT2JzZXJ2YWJsZTxUPjtcbiAgc2VsZWN0VHJhbnNsYXRlT2JqZWN0PFQgPSBhbnk+KFxuICAgIGtleTogc3RyaW5nW10sXG4gICAgcGFyYW1zPzogSGFzaE1hcCxcbiAgICBsYW5nPzogc3RyaW5nLFxuICApOiBPYnNlcnZhYmxlPFRbXT47XG4gIHNlbGVjdFRyYW5zbGF0ZU9iamVjdDxUID0gYW55PihcbiAgICBrZXk6IFRyYW5zbGF0ZVBhcmFtcyxcbiAgICBwYXJhbXM/OiBIYXNoTWFwLFxuICAgIGxhbmc/OiBzdHJpbmcsXG4gICk6IE9ic2VydmFibGU8VD4gfCBPYnNlcnZhYmxlPFRbXT47XG4gIHNlbGVjdFRyYW5zbGF0ZU9iamVjdDxUID0gYW55PihcbiAgICBrZXk6IEhhc2hNYXAgfCBNYXA8c3RyaW5nLCBIYXNoTWFwPixcbiAgICBwYXJhbXM/OiBudWxsLFxuICAgIGxhbmc/OiBzdHJpbmcsXG4gICk6IE9ic2VydmFibGU8VFtdPjtcbiAgc2VsZWN0VHJhbnNsYXRlT2JqZWN0PFQgPSBhbnk+KFxuICAgIGtleTogVHJhbnNsYXRlT2JqZWN0UGFyYW1zLFxuICAgIHBhcmFtcz86IEhhc2hNYXAgfCBudWxsLFxuICAgIGxhbmc/OiBzdHJpbmcsXG4gICk6IE9ic2VydmFibGU8VD4gfCBPYnNlcnZhYmxlPFRbXT4ge1xuICAgIGlmIChpc1N0cmluZyhrZXkpIHx8IEFycmF5LmlzQXJyYXkoa2V5KSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0VHJhbnNsYXRlPFQ+KGtleSwgcGFyYW1zISwgbGFuZywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgY29uc3QgW1tmaXJzdEtleSwgZmlyc3RQYXJhbXNdLCAuLi5yZXN0XSA9IHRoaXMuZ2V0RW50cmllcyhrZXkpO1xuXG4gICAgLyogSW4gb3JkZXIgdG8gYXZvaWQgc3Vic2NyaWJpbmcgbXVsdGlwbGUgdGltZXMgdG8gdGhlIGxvYWQgbGFuZ3VhZ2UgZXZlbnQgYnkgY2FsbGluZyBzZWxlY3RUcmFuc2xhdGVPYmplY3QgZm9yIGVhY2ggcGFpcixcbiAgICAgKiB3ZSBsaXN0ZW4gdG8gd2hlbiB0aGUgZmlyc3Qga2V5IGhhcyBiZWVuIHRyYW5zbGF0ZWQgKHRoZSBsYW5ndWFnZSBpcyBsb2FkZWQpIGFuZCB0cmFuc2xhdGUgdGhlIHJlc3Qgc3luY2hyb25vdXNseSAqL1xuICAgIHJldHVybiB0aGlzLnNlbGVjdFRyYW5zbGF0ZU9iamVjdDxUPihmaXJzdEtleSwgZmlyc3RQYXJhbXMsIGxhbmcpLnBpcGUoXG4gICAgICBtYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IHRyYW5zbGF0aW9ucyA9IFt2YWx1ZV07XG4gICAgICAgIGZvciAoY29uc3QgW19rZXksIF9wYXJhbXNdIG9mIHJlc3QpIHtcbiAgICAgICAgICB0cmFuc2xhdGlvbnMucHVzaCh0aGlzLnRyYW5zbGF0ZU9iamVjdDxUPihfa2V5LCBfcGFyYW1zLCBsYW5nKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJhbnNsYXRpb25zO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGFuIG9iamVjdCBvZiB0cmFuc2xhdGlvbnMgZm9yIGEgZ2l2ZW4gbGFuZ3VhZ2VcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogZ2V0VHJhbnNsYXRpb24oKVxuICAgKiBnZXRUcmFuc2xhdGlvbignZW4nKVxuICAgKiBnZXRUcmFuc2xhdGlvbignYWRtaW4tcGFnZS9lbicpXG4gICAqL1xuICBnZXRUcmFuc2xhdGlvbigpOiBNYXA8c3RyaW5nLCBUcmFuc2xhdGlvbj47XG4gIGdldFRyYW5zbGF0aW9uKGxhbmdPclNjb3BlOiBzdHJpbmcpOiBUcmFuc2xhdGlvbjtcbiAgZ2V0VHJhbnNsYXRpb24obGFuZ09yU2NvcGU/OiBzdHJpbmcpOiBNYXA8c3RyaW5nLCBUcmFuc2xhdGlvbj4gfCBUcmFuc2xhdGlvbiB7XG4gICAgaWYgKGxhbmdPclNjb3BlKSB7XG4gICAgICBpZiAodGhpcy5pc0xhbmcobGFuZ09yU2NvcGUpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0aW9ucy5nZXQobGFuZ09yU2NvcGUpIHx8IHt9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyBpcyBhIHNjb3BlLCBidWlsZCB0aGUgc2NvcGUgdmFsdWUgZnJvbSB0aGUgdHJhbnNsYXRpb24gb2JqZWN0XG4gICAgICAgIGNvbnN0IHsgc2NvcGUsIHJlc29sdmVMYW5nIH0gPSB0aGlzLnJlc29sdmVMYW5nQW5kU2NvcGUobGFuZ09yU2NvcGUpO1xuICAgICAgICBjb25zdCB0cmFuc2xhdGlvbiA9IHRoaXMudHJhbnNsYXRpb25zLmdldChyZXNvbHZlTGFuZykgfHwge307XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlLZXkodHJhbnNsYXRpb24sIHNjb3BlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhbiBvYmplY3Qgb2YgdHJhbnNsYXRpb25zIGZvciBhIGdpdmVuIGxhbmd1YWdlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIHNlbGVjdFRyYW5zbGF0aW9uKCkuc3Vic2NyaWJlKCkgLSB3aWxsIHJldHVybiB0aGUgY3VycmVudCBsYW5nIHRyYW5zbGF0aW9uXG4gICAqIHNlbGVjdFRyYW5zbGF0aW9uKCdlcycpLnN1YnNjcmliZSgpXG4gICAqIHNlbGVjdFRyYW5zbGF0aW9uKCdhZG1pbi1wYWdlJykuc3Vic2NyaWJlKCkgLSB3aWxsIHJldHVybiB0aGUgY3VycmVudCBsYW5nIHNjb3BlIHRyYW5zbGF0aW9uXG4gICAqIHNlbGVjdFRyYW5zbGF0aW9uKCdhZG1pbi1wYWdlL2VzJykuc3Vic2NyaWJlKClcbiAgICovXG4gIHNlbGVjdFRyYW5zbGF0aW9uKGxhbmc/OiBzdHJpbmcpOiBPYnNlcnZhYmxlPFRyYW5zbGF0aW9uPiB7XG4gICAgbGV0IGxhbmd1YWdlJCA9IHRoaXMubGFuZ0NoYW5nZXMkO1xuICAgIGlmIChsYW5nKSB7XG4gICAgICBjb25zdCBzY29wZUxhbmdTcGVjaWZpZWQgPSBnZXRMYW5nRnJvbVNjb3BlKGxhbmcpICE9PSBsYW5nO1xuICAgICAgaWYgKHRoaXMuaXNMYW5nKGxhbmcpIHx8IHNjb3BlTGFuZ1NwZWNpZmllZCkge1xuICAgICAgICBsYW5ndWFnZSQgPSBvZihsYW5nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxhbmd1YWdlJCA9IHRoaXMubGFuZ0NoYW5nZXMkLnBpcGUoXG4gICAgICAgICAgbWFwKChjdXJyZW50TGFuZykgPT4gYCR7bGFuZ30vJHtjdXJyZW50TGFuZ31gKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGFuZ3VhZ2UkLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKGxhbmd1YWdlKSA9PlxuICAgICAgICB0aGlzLmxvYWQobGFuZ3VhZ2UpLnBpcGUobWFwKCgpID0+IHRoaXMuZ2V0VHJhbnNsYXRpb24obGFuZ3VhZ2UpKSksXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBvciBtZXJnZSBhIGdpdmVuIHRyYW5zbGF0aW9uIG9iamVjdCB0byBjdXJyZW50IGxhbmdcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogc2V0VHJhbnNsYXRpb24oeyAuLi4gfSlcbiAgICogc2V0VHJhbnNsYXRpb24oeyAuLi4gfSwgJ2VuJylcbiAgICogc2V0VHJhbnNsYXRpb24oeyAuLi4gfSwgJ2VzJywgeyBtZXJnZTogZmFsc2UgfSApXG4gICAqIHNldFRyYW5zbGF0aW9uKHsgLi4uIH0sICd0b2Rvcy9lbicsIHsgbWVyZ2U6IGZhbHNlIH0gKVxuICAgKi9cbiAgc2V0VHJhbnNsYXRpb24oXG4gICAgdHJhbnNsYXRpb246IFRyYW5zbGF0aW9uLFxuICAgIGxhbmcgPSB0aGlzLmdldEFjdGl2ZUxhbmcoKSxcbiAgICBvcHRpb25zOiBTZXRUcmFuc2xhdGlvbk9wdGlvbnMgPSB7fSxcbiAgKSB7XG4gICAgY29uc3QgZGVmYXVsdHMgPSB7IG1lcmdlOiB0cnVlLCBlbWl0Q2hhbmdlOiB0cnVlIH07XG4gICAgY29uc3QgbWVyZ2VkT3B0aW9ucyA9IHsgLi4uZGVmYXVsdHMsIC4uLm9wdGlvbnMgfTtcbiAgICBjb25zdCBzY29wZSA9IGdldFNjb3BlRnJvbUxhbmcobGFuZyk7XG5cbiAgICAvKipcbiAgICAgKiBJZiB0aGlzIGlzbid0IGEgc2NvcGUgd2UgdXNlIHRoZSB3aG9sZSB0cmFuc2xhdGlvbiBhcyBpc1xuICAgICAqIG90aGVyd2lzZSB3ZSBuZWVkIHRvIGZsYXQgdGhlIHNjb3BlIGFuZCB1c2UgaXRcbiAgICAgKi9cbiAgICBsZXQgZmxhdHRlblNjb3BlT3JUcmFuc2xhdGlvbiA9IHRyYW5zbGF0aW9uO1xuXG4gICAgLy8gTWVyZ2VkIHRoZSBzY29wZWQgbGFuZ3VhZ2UgaW50byB0aGUgYWN0aXZlIGxhbmd1YWdlXG4gICAgaWYgKHNjb3BlKSB7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmdldE1hcHBlZFNjb3BlKHNjb3BlKTtcbiAgICAgIGZsYXR0ZW5TY29wZU9yVHJhbnNsYXRpb24gPSBmbGF0dGVuKHsgW2tleV06IHRyYW5zbGF0aW9uIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRMYW5nID0gc2NvcGUgPyBnZXRMYW5nRnJvbVNjb3BlKGxhbmcpIDogbGFuZztcblxuICAgIGNvbnN0IG1lcmdlZFRyYW5zbGF0aW9uID0ge1xuICAgICAgLi4uKG1lcmdlZE9wdGlvbnMubWVyZ2UgJiYgdGhpcy5nZXRUcmFuc2xhdGlvbihjdXJyZW50TGFuZykpLFxuICAgICAgLi4uZmxhdHRlblNjb3BlT3JUcmFuc2xhdGlvbixcbiAgICB9O1xuXG4gICAgY29uc3QgZmxhdHRlblRyYW5zbGF0aW9uID0gdGhpcy5jb25maWcuZmxhdHRlbiEuYW90XG4gICAgICA/IG1lcmdlZFRyYW5zbGF0aW9uXG4gICAgICA6IGZsYXR0ZW4obWVyZ2VkVHJhbnNsYXRpb24pO1xuICAgIGNvbnN0IHdpdGhIb29rID0gdGhpcy5pbnRlcmNlcHRvci5wcmVTYXZlVHJhbnNsYXRpb24oXG4gICAgICBmbGF0dGVuVHJhbnNsYXRpb24sXG4gICAgICBjdXJyZW50TGFuZyxcbiAgICApO1xuICAgIHRoaXMudHJhbnNsYXRpb25zLnNldChjdXJyZW50TGFuZywgd2l0aEhvb2spO1xuICAgIG1lcmdlZE9wdGlvbnMuZW1pdENoYW5nZSAmJiB0aGlzLnNldEFjdGl2ZUxhbmcodGhpcy5nZXRBY3RpdmVMYW5nKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdHJhbnNsYXRpb24ga2V5IHdpdGggZ2l2ZW4gdmFsdWVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogc2V0VHJhbnNsYXRpb25LZXkoJ2tleScsICd2YWx1ZScpXG4gICAqIHNldFRyYW5zbGF0aW9uS2V5KCdrZXkubmVzdGVkJywgJ3ZhbHVlJylcbiAgICogc2V0VHJhbnNsYXRpb25LZXkoJ2tleS5uZXN0ZWQnLCAndmFsdWUnLCAnZW4nKVxuICAgKiBzZXRUcmFuc2xhdGlvbktleSgna2V5Lm5lc3RlZCcsICd2YWx1ZScsICdlbicsIHsgZW1pdENoYW5nZTogZmFsc2UgfSApXG4gICAqL1xuICBzZXRUcmFuc2xhdGlvbktleShcbiAgICBrZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IE9taXQ8U2V0VHJhbnNsYXRpb25PcHRpb25zLCAnbWVyZ2UnPiA9IHt9LFxuICApIHtcbiAgICBjb25zdCBsYW5nID0gb3B0aW9ucy5sYW5nIHx8IHRoaXMuZ2V0QWN0aXZlTGFuZygpO1xuICAgIGNvbnN0IHdpdGhIb29rID0gdGhpcy5pbnRlcmNlcHRvci5wcmVTYXZlVHJhbnNsYXRpb25LZXkoa2V5LCB2YWx1ZSwgbGFuZyk7XG4gICAgY29uc3QgbmV3VmFsdWUgPSB7XG4gICAgICBba2V5XTogd2l0aEhvb2ssXG4gICAgfTtcblxuICAgIHRoaXMuc2V0VHJhbnNsYXRpb24obmV3VmFsdWUsIGxhbmcsIHsgLi4ub3B0aW9ucywgbWVyZ2U6IHRydWUgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZmFsbGJhY2sgbGFuZyBmb3IgdGhlIGN1cnJlbnRseSBhY3RpdmUgbGFuZ3VhZ2VcbiAgICogQHBhcmFtIGZhbGxiYWNrTGFuZ1xuICAgKi9cbiAgc2V0RmFsbGJhY2tMYW5nRm9yTWlzc2luZ1RyYW5zbGF0aW9uKHtcbiAgICBmYWxsYmFja0xhbmcsXG4gIH06IFBpY2s8VHJhbnNsb2NvQ29uZmlnLCAnZmFsbGJhY2tMYW5nJz4pIHtcbiAgICBjb25zdCBsYW5nID0gQXJyYXkuaXNBcnJheShmYWxsYmFja0xhbmcpID8gZmFsbGJhY2tMYW5nWzBdIDogZmFsbGJhY2tMYW5nO1xuICAgIGlmIChmYWxsYmFja0xhbmcgJiYgdGhpcy51c2VGYWxsYmFja1RyYW5zbGF0aW9uKGxhbmcpKSB7XG4gICAgICB0aGlzLmZpcnN0RmFsbGJhY2tMYW5nID0gbGFuZyE7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX2hhbmRsZU1pc3NpbmdLZXkoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksIHBhcmFtcz86IEhhc2hNYXApIHtcbiAgICBpZiAodGhpcy5jb25maWcubWlzc2luZ0hhbmRsZXIhLmFsbG93RW1wdHkgJiYgdmFsdWUgPT09ICcnKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmlzUmVzb2x2ZWRNaXNzaW5nT25jZSAmJiB0aGlzLnVzZUZhbGxiYWNrVHJhbnNsYXRpb24oKSkge1xuICAgICAgLy8gV2UgbmVlZCB0byBzZXQgaXQgdG8gdHJ1ZSB0byBwcmV2ZW50IGEgbG9vcFxuICAgICAgdGhpcy5pc1Jlc29sdmVkTWlzc2luZ09uY2UgPSB0cnVlO1xuICAgICAgY29uc3QgZmFsbGJhY2tWYWx1ZSA9IHRoaXMudHJhbnNsYXRlKFxuICAgICAgICBrZXksXG4gICAgICAgIHBhcmFtcyxcbiAgICAgICAgdGhpcy5maXJzdEZhbGxiYWNrTGFuZyEsXG4gICAgICApO1xuICAgICAgdGhpcy5pc1Jlc29sdmVkTWlzc2luZ09uY2UgPSBmYWxzZTtcblxuICAgICAgcmV0dXJuIGZhbGxiYWNrVmFsdWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMubWlzc2luZ0hhbmRsZXIuaGFuZGxlKFxuICAgICAga2V5LFxuICAgICAgdGhpcy5nZXRNaXNzaW5nSGFuZGxlckRhdGEoKSxcbiAgICAgIHBhcmFtcyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX2lzTGFuZ1Njb3BlZChsYW5nOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBdmFpbGFibGVMYW5nc0lkcygpLmluZGV4T2YobGFuZykgPT09IC0xO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBpZiBhIGdpdmVuIHN0cmluZyBpcyBvbmUgb2YgdGhlIHNwZWNpZmllZCBhdmFpbGFibGUgbGFuZ3VhZ2VzLlxuICAgKiBAcmV0dXJuc1xuICAgKiBUcnVlIGlmIHRoZSBnaXZlbiBzdHJpbmcgaXMgYW4gYXZhaWxhYmxlIGxhbmd1YWdlLlxuICAgKiBGYWxzZSBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGlzIG5vdCBhbiBhdmFpbGFibGUgbGFuZ3VhZ2UuXG4gICAqL1xuICBpc0xhbmcobGFuZzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QXZhaWxhYmxlTGFuZ3NJZHMoKS5pbmRleE9mKGxhbmcpICE9PSAtMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICpcbiAgICogV2UgYWx3YXlzIHdhbnQgdG8gbWFrZSBzdXJlIHRoZSBnbG9iYWwgbGFuZyBpcyBsb2FkZWRcbiAgICogYmVmb3JlIGxvYWRpbmcgdGhlIHNjb3BlIHNpbmNlIHlvdSBjYW4gYWNjZXNzIGJvdGggdmlhIHRoZSBwaXBlL2RpcmVjdGl2ZS5cbiAgICovXG4gIF9sb2FkRGVwZW5kZW5jaWVzKFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBpbmxpbmVMb2FkZXI/OiBJbmxpbmVMb2FkZXIsXG4gICk6IE9ic2VydmFibGU8VHJhbnNsYXRpb24gfCBUcmFuc2xhdGlvbltdPiB7XG4gICAgY29uc3QgbWFpbkxhbmcgPSBnZXRMYW5nRnJvbVNjb3BlKHBhdGgpO1xuXG4gICAgaWYgKHRoaXMuX2lzTGFuZ1Njb3BlZChwYXRoKSAmJiAhdGhpcy5pc0xvYWRlZFRyYW5zbGF0aW9uKG1haW5MYW5nKSkge1xuICAgICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICB0aGlzLmxvYWQobWFpbkxhbmcpLFxuICAgICAgICB0aGlzLmxvYWQocGF0aCwgeyBpbmxpbmVMb2FkZXIgfSksXG4gICAgICBdKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubG9hZChwYXRoLCB7IGlubGluZUxvYWRlciB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9jb21wbGV0ZVNjb3BlV2l0aExhbmcobGFuZ09yU2NvcGU6IHN0cmluZykge1xuICAgIGlmIChcbiAgICAgIHRoaXMuX2lzTGFuZ1Njb3BlZChsYW5nT3JTY29wZSkgJiZcbiAgICAgICF0aGlzLmlzTGFuZyhnZXRMYW5nRnJvbVNjb3BlKGxhbmdPclNjb3BlKSlcbiAgICApIHtcbiAgICAgIHJldHVybiBgJHtsYW5nT3JTY29wZX0vJHt0aGlzLmdldEFjdGl2ZUxhbmcoKX1gO1xuICAgIH1cbiAgICByZXR1cm4gbGFuZ09yU2NvcGU7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfc2V0U2NvcGVBbGlhcyhzY29wZTogc3RyaW5nLCBhbGlhczogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZy5zY29wZU1hcHBpbmcpIHtcbiAgICAgIHRoaXMuY29uZmlnLnNjb3BlTWFwcGluZyA9IHt9O1xuICAgIH1cbiAgICB0aGlzLmNvbmZpZy5zY29wZU1hcHBpbmdbc2NvcGVdID0gYWxpYXM7XG4gIH1cblxuICBwcml2YXRlIGlzTG9hZGVkVHJhbnNsYXRpb24obGFuZzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHNpemUodGhpcy5nZXRUcmFuc2xhdGlvbihsYW5nKSk7XG4gIH1cblxuICBwcml2YXRlIGdldEF2YWlsYWJsZUxhbmdzSWRzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBmaXJzdCA9IHRoaXMuZ2V0QXZhaWxhYmxlTGFuZ3MoKVswXTtcblxuICAgIGlmIChpc1N0cmluZyhmaXJzdCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEF2YWlsYWJsZUxhbmdzKCkgYXMgc3RyaW5nW107XG4gICAgfVxuXG4gICAgcmV0dXJuICh0aGlzLmdldEF2YWlsYWJsZUxhbmdzKCkgYXMgTGFuZ0RlZmluaXRpb25bXSkubWFwKChsKSA9PiBsLmlkKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWlzc2luZ0hhbmRsZXJEYXRhKCk6IFRyYW5zbG9jb01pc3NpbmdIYW5kbGVyRGF0YSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuY29uZmlnLFxuICAgICAgYWN0aXZlTGFuZzogdGhpcy5nZXRBY3RpdmVMYW5nKCksXG4gICAgICBhdmFpbGFibGVMYW5nczogdGhpcy5hdmFpbGFibGVMYW5ncyxcbiAgICAgIGRlZmF1bHRMYW5nOiB0aGlzLmRlZmF1bHRMYW5nLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVXNlIGEgZmFsbGJhY2sgdHJhbnNsYXRpb24gc2V0IGZvciBtaXNzaW5nIGtleXMgb2YgdGhlIHByaW1hcnkgbGFuZ3VhZ2VcbiAgICogVGhpcyBpcyB1bnJlbGF0ZWQgdG8gdGhlIGZhbGxiYWNrIGxhbmd1YWdlICh3aGljaCBjaGFuZ2VzIHRoZSBhY3RpdmUgbGFuZ3VhZ2UpXG4gICAqL1xuICBwcml2YXRlIHVzZUZhbGxiYWNrVHJhbnNsYXRpb24obGFuZz86IHN0cmluZykge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmNvbmZpZy5taXNzaW5nSGFuZGxlciEudXNlRmFsbGJhY2tUcmFuc2xhdGlvbiAmJlxuICAgICAgbGFuZyAhPT0gdGhpcy5maXJzdEZhbGxiYWNrTGFuZ1xuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVN1Y2Nlc3MobGFuZzogc3RyaW5nLCB0cmFuc2xhdGlvbjogVHJhbnNsYXRpb24pIHtcbiAgICB0aGlzLnNldFRyYW5zbGF0aW9uKHRyYW5zbGF0aW9uLCBsYW5nLCB7IGVtaXRDaGFuZ2U6IGZhbHNlIH0pO1xuICAgIHRoaXMuZXZlbnRzLm5leHQoe1xuICAgICAgd2FzRmFpbHVyZTogISF0aGlzLmZhaWxlZExhbmdzLnNpemUsXG4gICAgICB0eXBlOiAndHJhbnNsYXRpb25Mb2FkU3VjY2VzcycsXG4gICAgICBwYXlsb2FkOiBnZXRFdmVudFBheWxvYWQobGFuZyksXG4gICAgfSk7XG4gICAgdGhpcy5mYWlsZWRMYW5ncy5mb3JFYWNoKChsKSA9PiB0aGlzLmNhY2hlLmRlbGV0ZShsKSk7XG4gICAgdGhpcy5mYWlsZWRMYW5ncy5jbGVhcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVGYWlsdXJlKGxhbmc6IHN0cmluZywgbG9hZE9wdGlvbnM6IExvYWRPcHRpb25zKSB7XG4gICAgLy8gV2hlbiBzdGFydGluZyB0byBsb2FkIGEgZmlyc3QgY2hvaWNlIGxhbmd1YWdlLCBpbml0aWFsaXplXG4gICAgLy8gdGhlIGZhaWxlZCBjb3VudGVyIGFuZCByZXNvbHZlIHRoZSBmYWxsYmFjayBsYW5ncy5cbiAgICBpZiAoaXNOaWwobG9hZE9wdGlvbnMuZmFpbGVkQ291bnRlcikpIHtcbiAgICAgIGxvYWRPcHRpb25zLmZhaWxlZENvdW50ZXIgPSAwO1xuXG4gICAgICBpZiAoIWxvYWRPcHRpb25zLmZhbGxiYWNrTGFuZ3MpIHtcbiAgICAgICAgbG9hZE9wdGlvbnMuZmFsbGJhY2tMYW5ncyA9IHRoaXMuZmFsbGJhY2tTdHJhdGVneS5nZXROZXh0TGFuZ3MobGFuZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3BsaXR0ZWQgPSBsYW5nLnNwbGl0KCcvJyk7XG4gICAgY29uc3QgZmFsbGJhY2tzID0gbG9hZE9wdGlvbnMuZmFsbGJhY2tMYW5ncztcbiAgICBjb25zdCBuZXh0TGFuZyA9IGZhbGxiYWNrcyFbbG9hZE9wdGlvbnMuZmFpbGVkQ291bnRlciFdO1xuICAgIHRoaXMuZmFpbGVkTGFuZ3MuYWRkKGxhbmcpO1xuXG4gICAgLy8gVGhpcyBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGEgbG9hZGVkIGZhbGxiYWNrIGxhbmd1YWdlIGlzIHJlcXVlc3RlZCBhZ2FpblxuICAgIGlmICh0aGlzLmNhY2hlLmhhcyhuZXh0TGFuZykpIHtcbiAgICAgIHRoaXMuaGFuZGxlU3VjY2VzcyhuZXh0TGFuZywgdGhpcy5nZXRUcmFuc2xhdGlvbihuZXh0TGFuZykpO1xuICAgICAgcmV0dXJuIEVNUFRZO1xuICAgIH1cblxuICAgIGNvbnN0IGlzRmFsbGJhY2tMYW5nID0gbmV4dExhbmcgPT09IHNwbGl0dGVkW3NwbGl0dGVkLmxlbmd0aCAtIDFdO1xuXG4gICAgaWYgKCFuZXh0TGFuZyB8fCBpc0ZhbGxiYWNrTGFuZykge1xuICAgICAgbGV0IG1zZyA9IGBVbmFibGUgdG8gbG9hZCB0cmFuc2xhdGlvbiBhbmQgYWxsIHRoZSBmYWxsYmFjayBsYW5ndWFnZXNgO1xuICAgICAgaWYgKHNwbGl0dGVkLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgbXNnICs9IGAsIGRpZCB5b3UgbWlzc3BlbGxlZCB0aGUgc2NvcGUgbmFtZT9gO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICB9XG5cbiAgICBsZXQgcmVzb2x2ZUxhbmcgPSBuZXh0TGFuZztcbiAgICAvLyBpZiBpdCdzIHNjb3BlZCBsYW5nXG4gICAgaWYgKHNwbGl0dGVkLmxlbmd0aCA+IDEpIHtcbiAgICAgIC8vIFdlIG5lZWQgdG8gcmVzb2x2ZSBpdCB0bzpcbiAgICAgIC8vIHRvZG9zL2xhbmdOb3RFeGlzdHMgPT4gdG9kb3MvbmV4dExhbmdcbiAgICAgIHNwbGl0dGVkW3NwbGl0dGVkLmxlbmd0aCAtIDFdID0gbmV4dExhbmc7XG4gICAgICByZXNvbHZlTGFuZyA9IHNwbGl0dGVkLmpvaW4oJy8nKTtcbiAgICB9XG5cbiAgICBsb2FkT3B0aW9ucy5mYWlsZWRDb3VudGVyISsrO1xuICAgIHRoaXMuZXZlbnRzLm5leHQoe1xuICAgICAgdHlwZTogJ3RyYW5zbGF0aW9uTG9hZEZhaWx1cmUnLFxuICAgICAgcGF5bG9hZDogZ2V0RXZlbnRQYXlsb2FkKGxhbmcpLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMubG9hZChyZXNvbHZlTGFuZywgbG9hZE9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRNYXBwZWRTY29wZShzY29wZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCB7IHNjb3BlTWFwcGluZyA9IHt9LCBzY29wZXMgPSB7IGtlZXBDYXNpbmc6IGZhbHNlIH0gfSA9IHRoaXMuY29uZmlnO1xuICAgIHJldHVybiAoXG4gICAgICBzY29wZU1hcHBpbmdbc2NvcGVdIHx8IChzY29wZXMua2VlcENhc2luZyA/IHNjb3BlIDogdG9DYW1lbENhc2Uoc2NvcGUpKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogSWYgbGFuZyBpcyBzY29wZSB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBmb2xsb3dpbmcgY2FzZXM6XG4gICAqIHRvZG9zL2VzID0+IGluIHRoaXMgY2FzZSB3ZSBzaG91bGQgdGFrZSBgZXNgIGFzIGxhbmdcbiAgICogdG9kb3MgPT4gaW4gdGhpcyBjYXNlIHdlIHNob3VsZCBzZXQgdGhlIGFjdGl2ZSBsYW5nIGFzIGxhbmdcbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUxhbmdBbmRTY29wZShsYW5nOiBzdHJpbmcpIHtcbiAgICBsZXQgcmVzb2x2ZUxhbmcgPSBsYW5nO1xuICAgIGxldCBzY29wZTtcblxuICAgIGlmICh0aGlzLl9pc0xhbmdTY29wZWQobGFuZykpIHtcbiAgICAgIC8vIGVuIGZvciBleGFtcGxlXG4gICAgICBjb25zdCBsYW5nRnJvbVNjb3BlID0gZ2V0TGFuZ0Zyb21TY29wZShsYW5nKTtcbiAgICAgIC8vIGVuIGlzIGxhbmdcbiAgICAgIGNvbnN0IGhhc0xhbmcgPSB0aGlzLmlzTGFuZyhsYW5nRnJvbVNjb3BlKTtcbiAgICAgIC8vIHRha2UgZW5cbiAgICAgIHJlc29sdmVMYW5nID0gaGFzTGFuZyA/IGxhbmdGcm9tU2NvcGUgOiB0aGlzLmdldEFjdGl2ZUxhbmcoKTtcbiAgICAgIC8vIGZpbmQgdGhlIHNjb3BlXG4gICAgICBzY29wZSA9IHRoaXMuZ2V0TWFwcGVkU2NvcGUoaGFzTGFuZyA/IGdldFNjb3BlRnJvbUxhbmcobGFuZykgOiBsYW5nKTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBzY29wZSwgcmVzb2x2ZUxhbmcgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T2JqZWN0QnlLZXkodHJhbnNsYXRpb246IFRyYW5zbGF0aW9uLCBrZXk/OiBzdHJpbmcpIHtcbiAgICBjb25zdCByZXN1bHQ6IFRyYW5zbGF0aW9uID0ge307XG4gICAgY29uc3QgcHJlZml4ID0gYCR7a2V5fS5gO1xuXG4gICAgZm9yIChjb25zdCBjdXJyZW50S2V5IGluIHRyYW5zbGF0aW9uKSB7XG4gICAgICBpZiAoY3VycmVudEtleS5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICAgICAgcmVzdWx0W2N1cnJlbnRLZXkucmVwbGFjZShwcmVmaXgsICcnKV0gPSB0cmFuc2xhdGlvbltjdXJyZW50S2V5XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbnRyaWVzKGtleTogSGFzaE1hcCB8IE1hcDxzdHJpbmcsIEhhc2hNYXA+KSB7XG4gICAgcmV0dXJuIGtleSBpbnN0YW5jZW9mIE1hcCA/IGtleS5lbnRyaWVzKCkgOiBPYmplY3QuZW50cmllcyhrZXkpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,99 @@
1
+ import { assertInInjectionContext, computed, inject, Injector, isSignal, runInInjectionContext, } from '@angular/core';
2
+ import { toObservable, toSignal } from '@angular/core/rxjs-interop';
3
+ import { switchMap } from 'rxjs';
4
+ import { TRANSLOCO_SCOPE } from './transloco-scope';
5
+ import { TranslocoService } from './transloco.service';
6
+ /**
7
+ * Gets the translated value of a key as Signal
8
+ *
9
+ * @example
10
+ * text = translateSignal('hello');
11
+ * textList = translateSignal(['green', 'blue']);
12
+ * textVar = translateSignal('hello', { variable: 'world' });
13
+ * textSpanish = translateSignal('hello', { variable: 'world' }, 'es');
14
+ * textTodosScope = translateSignal('hello', { variable: 'world' }, { scope: 'todos' });
15
+ *
16
+ * @example
17
+ * dynamicKey = signal('hello');
18
+ * dynamicParam = signal({ variable: 'world' });
19
+ * text = translateSignal(this.dynamicKey, this.dynamicParam);
20
+ *
21
+ */
22
+ export function translateSignal(key, params, lang, injector) {
23
+ if (!injector) {
24
+ assertInInjectionContext(translateSignal);
25
+ }
26
+ injector ??= inject(Injector);
27
+ const result = runInInjectionContext(injector, () => {
28
+ const service = inject(TranslocoService);
29
+ const scope = resolveScope(lang);
30
+ return toObservable(computerKeysAndParams(key, params)).pipe(switchMap((dynamic) => service.selectTranslate(dynamic.key, dynamic.params, scope)));
31
+ });
32
+ return toSignal(result, { initialValue: Array.isArray(key) ? [''] : '' });
33
+ }
34
+ /**
35
+ * Gets the translated object of a key as Signal
36
+ *
37
+ * @example
38
+ * object = translateObjectSignal('nested.object');
39
+ * title = object().title;
40
+ *
41
+ * @example
42
+ * dynamicKey = signal('nested.object');
43
+ * dynamicParam = signal({ variable: 'world' });
44
+ * object = translateObjectSignal(this.dynamicKey, this.dynamicParam);
45
+ */
46
+ export function translateObjectSignal(key, params, lang, injector) {
47
+ if (!injector) {
48
+ assertInInjectionContext(translateObjectSignal);
49
+ }
50
+ injector ??= inject(Injector);
51
+ const result = runInInjectionContext(injector, () => {
52
+ const service = inject(TranslocoService);
53
+ const scope = resolveScope(lang);
54
+ return toObservable(computerKeysAndParams(key, params)).pipe(switchMap((dynamic) => service.selectTranslateObject(dynamic.key, dynamic.params, scope)));
55
+ });
56
+ return toSignal(result, { initialValue: Array.isArray(key) ? [] : {} });
57
+ }
58
+ function computerParams(params) {
59
+ if (isSignal(params)) {
60
+ return computed(() => params());
61
+ }
62
+ return computed(() => {
63
+ return Object.entries(params).reduce((acc, [key, value]) => {
64
+ acc[key] = isSignal(value) ? value() : value;
65
+ return acc;
66
+ }, {});
67
+ });
68
+ }
69
+ function computerKeys(keys) {
70
+ if (Array.isArray(keys)) {
71
+ return computed(() => keys.map((key) => (isSignal(key) ? key() : key)));
72
+ }
73
+ return computed(() => keys());
74
+ }
75
+ function isSignalKey(key) {
76
+ return Array.isArray(key) ? key.some(isSignal) : isSignal(key);
77
+ }
78
+ function isSignalParams(params) {
79
+ return params
80
+ ? isSignal(params) || Object.values(params).some(isSignal)
81
+ : false;
82
+ }
83
+ function computerKeysAndParams(key, params) {
84
+ const computedKeys = isSignalKey(key)
85
+ ? computerKeys(key)
86
+ : computed(() => key);
87
+ const computedParams = isSignalParams(params)
88
+ ? computerParams(params)
89
+ : computed(() => params);
90
+ return computed(() => ({ key: computedKeys(), params: computedParams() }));
91
+ }
92
+ function resolveScope(scope) {
93
+ if (typeof scope === 'undefined' || scope === '') {
94
+ const translocoScope = inject(TRANSLOCO_SCOPE, { optional: true });
95
+ return translocoScope ?? undefined;
96
+ }
97
+ return scope;
98
+ }
99
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsb2NvLnNpZ25hbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvdHJhbnNsb2NvL3NyYy9saWIvdHJhbnNsb2NvLnNpZ25hbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLFFBQVEsRUFDUixNQUFNLEVBQ04sUUFBUSxFQUNSLFFBQVEsRUFDUixxQkFBcUIsR0FFdEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRWpDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQWlCdkQ7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsR0FBTSxFQUNOLE1BQThCLEVBQzlCLElBQWdCLEVBQ2hCLFFBQW1CO0lBRW5CLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLHdCQUF3QixDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFDRCxRQUFRLEtBQUssTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzlCLE1BQU0sTUFBTSxHQUFHLHFCQUFxQixDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUU7UUFDbEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDekMsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pDLE9BQU8sWUFBWSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDMUQsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FDcEIsT0FBTyxD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O0lBQ3JDLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBhc3NlcnRJbkluamVjdGlvbkNvbnRleHQsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIEluamVjdG9yLFxuICBpc1NpZ25hbCxcbiAgcnVuSW5JbmplY3Rpb25Db250ZXh0LFxuICBTaWduYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdG9PYnNlcnZhYmxlLCB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IHN3aXRjaE1hcCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBUUkFOU0xPQ09fU0NPUEUgfSBmcm9tICcuL3RyYW5zbG9jby1zY29wZSc7XG5pbXBvcnQgeyBUcmFuc2xvY29TZXJ2aWNlIH0gZnJvbSAnLi90cmFuc2xvY28uc2VydmljZSc7XG5pbXBvcnQgeyBIYXNoTWFwLCBUcmFuc2xhdGlvbiwgVHJhbnNsb2NvU2NvcGUgfSBmcm9tICcuL3R5cGVzJztcblxudHlwZSBTY29wZVR5cGUgPSBzdHJpbmcgfCBUcmFuc2xvY29TY29wZSB8IFRyYW5zbG9jb1Njb3BlW107XG50eXBlIFNpZ25hbEtleSA9IFNpZ25hbDxzdHJpbmc+IHwgU2lnbmFsPHN0cmluZ1tdPiB8IFNpZ25hbDxzdHJpbmc+W107XG50eXBlIFRyYW5zbGF0ZVNpZ25hbEtleSA9IHN0cmluZyB8IHN0cmluZ1tdIHwgU2lnbmFsS2V5O1xudHlwZSBUcmFuc2xhdGVTaWduYWxQYXJhbXMgPVxuICB8IEhhc2hNYXBcbiAgfCBIYXNoTWFwPFNpZ25hbDxzdHJpbmc+PlxuICB8IFNpZ25hbDxIYXNoTWFwPjtcbnR5cGUgVHJhbnNsYXRlU2lnbmFsUmVmPFQ+ID0gVCBleHRlbmRzIHVua25vd25bXSB8IFNpZ25hbDxzdHJpbmdbXT5cbiAgPyBTaWduYWw8c3RyaW5nW10+XG4gIDogU2lnbmFsPHN0cmluZz47XG50eXBlIFRyYW5zbGF0ZU9iamVjdFNpZ25hbFJlZjxUPiA9IFQgZXh0ZW5kcyB1bmtub3duW10gfCBTaWduYWw8c3RyaW5nW10+XG4gID8gU2lnbmFsPFRyYW5zbGF0aW9uW10+XG4gIDogU2lnbmFsPFRyYW5zbGF0aW9uPjtcblxuLyoqXG4gKiBHZXRzIHRoZSB0cmFuc2xhdGVkIHZhbHVlIG9mIGEga2V5IGFzIFNpZ25hbFxuICpcbiAqIEBleGFtcGxlXG4gKiB0ZXh0ID0gdHJhbnNsYXRlU2lnbmFsKCdoZWxsbycpO1xuICogdGV4dExpc3QgPSB0cmFuc2xhdGVTaWduYWwoWydncmVlbicsICdibHVlJ10pO1xuICogdGV4dFZhciA9IHRyYW5zbGF0ZVNpZ25hbCgnaGVsbG8nLCB7IHZhcmlhYmxlOiAnd29ybGQnIH0pO1xuICogdGV4dFNwYW5pc2ggPSB0cmFuc2xhdGVTaWduYWwoJ2hlbGxvJywgeyB2YXJpYWJsZTogJ3dvcmxkJyB9LCAnZXMnKTtcbiAqIHRleHRUb2Rvc1Njb3BlID0gdHJhbnNsYXRlU2lnbmFsKCdoZWxsbycsIHsgdmFyaWFibGU6ICd3b3JsZCcgfSwgeyBzY29wZTogJ3RvZG9zJyB9KTtcbiAqXG4gKiBAZXhhbXBsZVxuICogZHluYW1pY0tleSA9IHNpZ25hbCgnaGVsbG8nKTtcbiAqIGR5bmFtaWNQYXJhbSA9IHNpZ25hbCh7IHZhcmlhYmxlOiAnd29ybGQnIH0pO1xuICogdGV4dCA9IHRyYW5zbGF0ZVNpZ25hbCh0aGlzLmR5bmFtaWNLZXksIHRoaXMuZHluYW1pY1BhcmFtKTtcbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2xhdGVTaWduYWw8VCBleHRlbmRzIFRyYW5zbGF0ZVNpZ25hbEtleT4oXG4gIGtleTogVCxcbiAgcGFyYW1zPzogVHJhbnNsYXRlU2lnbmFsUGFyYW1zLFxuICBsYW5nPzogU2NvcGVUeXBlLFxuICBpbmplY3Rvcj86IEluamVjdG9yLFxuKTogVHJhbnNsYXRlU2lnbmFsUmVmPFQ+IHtcbiAgaWYgKCFpbmplY3Rvcikge1xuICAgIGFzc2VydEluSW5qZWN0aW9uQ29udGV4dCh0cmFuc2xhdGVTaWduYWwpO1xuICB9XG4gIGluamVjdG9yID8/PSBpbmplY3QoSW5qZWN0b3IpO1xuICBjb25zdCByZXN1bHQgPSBydW5JbkluamVjdGlvbkNvbnRleHQoaW5qZWN0b3IsICgpID0+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gaW5qZWN0KFRyYW5zbG9jb1NlcnZpY2UpO1xuICAgIGNvbnN0IHNjb3BlID0gcmVzb2x2ZVNjb3BlKGxhbmcpO1xuICAgIHJldHVybiB0b09ic2VydmFibGUoY29tcHV0ZXJLZXlzQW5kUGFyYW1zKGtleSwgcGFyYW1zKSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoZHluYW1pYykgPT5cbiAgICAgICAgc2VydmljZS5zZWxlY3RUcmFuc2xhdGUoZHluYW1pYy5rZXksIGR5bmFtaWMucGFyYW1zLCBzY29wZSksXG4gICAgICApLFxuICAgICk7XG4gIH0pO1xuICByZXR1cm4gdG9TaWduYWwocmVzdWx0LCB7IGluaXRpYWxWYWx1ZTogQXJyYXkuaXNBcnJheShrZXkpID8gWycnXSA6ICcnIH0pO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIHRyYW5zbGF0ZWQgb2JqZWN0IG9mIGEga2V5IGFzIFNpZ25hbFxuICpcbiAqIEBleGFtcGxlXG4gKiBvYmplY3QgPSB0cmFuc2xhdGVPYmplY3RTaWduYWwoJ25lc3RlZC5vYmplY3QnKTtcbiAqIHRpdGxlID0gb2JqZWN0KCkudGl0bGU7XG4gKlxuICogQGV4YW1wbGVcbiAqIGR5bmFtaWNLZXkgPSBzaWduYWwoJ25lc3RlZC5vYmplY3QnKTtcbiAqIGR5bmFtaWNQYXJhbSA9IHNpZ25hbCh7IHZhcmlhYmxlOiAnd29ybGQnIH0pO1xuICogb2JqZWN0ID0gdHJhbnNsYXRlT2JqZWN0U2lnbmFsKHRoaXMuZHluYW1pY0tleSwgdGhpcy5keW5hbWljUGFyYW0pO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNsYXRlT2JqZWN0U2lnbmFsPFQgZXh0ZW5kcyBUcmFuc2xhdGVTaWduYWxLZXk+KFxuICBrZXk6IFQsXG4gIHBhcmFtcz86IFRyYW5zbGF0ZVNpZ25hbFBhcmFtcyxcbiAgbGFuZz86IFNjb3BlVHlwZSxcbiAgaW5qZWN0b3I/OiBJbmplY3Rvcixcbik6IFRyYW5zbGF0ZU9iamVjdFNpZ25hbFJlZjxUPiB7XG4gIGlmICghaW5qZWN0b3IpIHtcbiAgICBhc3NlcnRJbkluamVjdGlvbkNvbnRleHQodHJhbnNsYXRlT2JqZWN0U2lnbmFsKTtcbiAgfVxuICBpbmplY3RvciA/Pz0gaW5qZWN0KEluamVjdG9yKTtcbiAgY29uc3QgcmVzdWx0ID0gcnVuSW5JbmplY3Rpb25Db250ZXh0KGluamVjdG9yLCAoKSA9PiB7XG4gICAgY29uc3Qgc2VydmljZSA9IGluamVjdChUcmFuc2xvY29TZXJ2aWNlKTtcbiAgICBjb25zdCBzY29wZSA9IHJlc29sdmVTY29wZShsYW5nKTtcbiAgICByZXR1cm4gdG9PYnNlcnZhYmxlKGNvbXB1dGVyS2V5c0FuZFBhcmFtcyhrZXksIHBhcmFtcykpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKGR5bmFtaWMpID0+XG4gICAgICAgIHNlcnZpY2Uuc2VsZWN0VHJhbnNsYXRlT2JqZWN0KFxuICAgICAgICAgIGR5bmFtaWMua2V5LFxuICAgICAgICAgIGR5bmFtaWMucGFyYW1zLFxuICAgICAgICAgIHNjb3BlIGFzIHN0cmluZyxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKTtcbiAgfSk7XG4gIHJldHVybiB0b1NpZ25hbChyZXN1bHQsIHsgaW5pdGlhbFZhbHVlOiBBcnJheS5pc0FycmF5KGtleSkgPyBbXSA6IHt9IH0pO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlclBhcmFtcyhwYXJhbXM6IEhhc2hNYXA8U2lnbmFsPHN0cmluZz4+IHwgU2lnbmFsPEhhc2hNYXA+KSB7XG4gIGlmIChpc1NpZ25hbChwYXJhbXMpKSB7XG4gICAgcmV0dXJuIGNvbXB1dGVkKCgpID0+IHBhcmFtcygpKTtcbiAgfVxuICByZXR1cm4gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhwYXJhbXMpLnJlZHVjZSgoYWNjLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGFjY1trZXldID0gaXNTaWduYWwodmFsdWUpID8gdmFsdWUoKSA6IHZhbHVlO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyBIYXNoTWFwKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVyS2V5cyhcbiAga2V5czogU2lnbmFsPHN0cmluZz4gfCBTaWduYWw8c3RyaW5nW10+IHwgU2lnbmFsPHN0cmluZz5bXSxcbikge1xuICBpZiAoQXJyYXkuaXNBcnJheShrZXlzKSkge1xuICAgIHJldHVybiBjb21wdXRlZCgoKSA9PiBrZXlzLm1hcCgoa2V5KSA9PiAoaXNTaWduYWwoa2V5KSA/IGtleSgpIDoga2V5KSkpO1xuICB9XG4gIHJldHVybiBjb21wdXRlZCgoKSA9PiBrZXlzKCkpO1xufVxuXG5mdW5jdGlvbiBpc1NpZ25hbEtleShrZXk6IFRyYW5zbGF0ZVNpZ25hbEtleSk6IGtleSBpcyBTaWduYWxLZXkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShrZXkpID8ga2V5LnNvbWUoaXNTaWduYWwpIDogaXNTaWduYWwoa2V5KTtcbn1cblxuZnVuY3Rpb24gaXNTaWduYWxQYXJhbXMoXG4gIHBhcmFtcz86IEhhc2hNYXAsXG4pOiBwYXJhbXMgaXMgSGFzaE1hcDxTaWduYWw8c3RyaW5nPj4gfCBTaWduYWw8SGFzaE1hcD4ge1xuICByZXR1cm4gcGFyYW1zXG4gICAgPyBpc1NpZ25hbChwYXJhbXMpIHx8IE9iamVjdC52YWx1ZXMocGFyYW1zKS5zb21lKGlzU2lnbmFsKVxuICAgIDogZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVyS2V5c0FuZFBhcmFtcyhcbiAga2V5OiBUcmFuc2xhdGVTaWduYWxLZXksXG4gIHBhcmFtcz86IFRyYW5zbGF0ZVNpZ25hbFBhcmFtcyxcbikge1xuICBjb25zdCBjb21wdXRlZEtleXMgPSBpc1NpZ25hbEtleShrZXkpXG4gICAgPyBjb21wdXRlcktleXMoa2V5KVxuICAgIDogY29tcHV0ZWQoKCkgPT4ga2V5KTtcbiAgY29uc3QgY29tcHV0ZWRQYXJhbXMgPSBpc1NpZ25hbFBhcmFtcyhwYXJhbXMpXG4gICAgPyBjb21wdXRlclBhcmFtcyhwYXJhbXMpXG4gICAgOiBjb21wdXRlZCgoKSA9PiBwYXJhbXMpO1xuICByZXR1cm4gY29tcHV0ZWQoKCkgPT4gKHsga2V5OiBjb21wdXRlZEtleXMoKSwgcGFyYW1zOiBjb21wdXRlZFBhcmFtcygpIH0pKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVNjb3BlKHNjb3BlPzogU2NvcGVUeXBlKSB7XG4gIGlmICh0eXBlb2Ygc2NvcGUgPT09ICd1bmRlZmluZWQnIHx8IHNjb3BlID09PSAnJykge1xuICAgIGNvbnN0IHRyYW5zbG9jb1Njb3BlID0gaW5qZWN0KFRSQU5TTE9DT19TQ09QRSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgICByZXR1cm4gdHJhbnNsb2NvU2NvcGUgPz8gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBzY29wZTtcbn1cbiJdfQ==
@@ -2,7 +2,7 @@ import { inject, Injectable, InjectionToken, Injector } from '@angular/core';
2
2
  import { getValue, isDefined, isObject, isString, setValue } from './helpers';
3
3
  import { defaultConfig, TRANSLOCO_CONFIG, } from './transloco.config';
4
4
  import * as i0 from "@angular/core";
5
- export const TRANSLOCO_TRANSPILER = new InjectionToken('TRANSLOCO_TRANSPILER');
5
+ export const TRANSLOCO_TRANSPILER = new InjectionToken(typeof ngDevMode !== 'undefined' && ngDevMode ? 'TRANSLOCO_TRANSPILER' : '');
6
6
  export class DefaultTranspiler {
7
7
  config = inject(TRANSLOCO_CONFIG, { optional: true }) ?? defaultConfig;
8
8
  get interpolationMatcher() {
@@ -145,4 +145,4 @@ export class FunctionalTranspiler extends DefaultTranspiler {
145
145
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.9", ngImport: i0, type: FunctionalTranspiler, decorators: [{
146
146
  type: Injectable
147
147
  }] });
148
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsb2NvLnRyYW5zcGlsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3RyYW5zbG9jby9zcmMvbGliL3RyYW5zbG9jby50cmFuc3BpbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHN0UsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDOUUsT0FBTyxFQUNMLGFBQWEsRUFDYixnQkFBZ0IsR0FFakIsTUFBTSxvQkFBb0IsQ0FBQzs7QUFFNUIsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxjQUFjLENBQ3BELHNCQUFzQixDQUN2QixDQUFDO0FBZ0JGLE1BQU0sT0FBTyxpQkFBaUI7SUFDbEIsTUFBTSxHQUNkLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxJQUFJLGFBQWEsQ0FBQztJQUVoRSxJQUFjLG9CQUFvQjtRQUNoQyxPQUFPLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVELFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQW1CO1FBQ2pFLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDcEIsSUFBSSxVQUFrQyxDQUFDO1lBQ3ZDLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQztZQUV4QixPQUNFLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQ25FLENBQUM7Z0JBQ0QsTUFBTSxDQUFDLEtBQUssRUFB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RUFBRSxJQUFZLEVBQUUsRUFBRTtnQkFDcEQsSUFBSSxDQUFDO29CQUNILE1BQU0sSUFBSSxHQUNSLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO29CQUVsQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDbEQsQ0FBQztnQkFBQyxPQUFPLENBQVUsRUFBRSxDQUFDO29CQUNwQixJQUFJLE9BQU8sR0FBRywwQkFBMEIsS0FBSzt3SEFDK0QsWUFBWSxjQUFjLENBQUM7b0JBQ3ZJLElBQUssQ0FBVyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsRUFBRSxDQUFDO3dCQUN2RCxPQUFPLEdBQUcsc0JBQXNCLFlBQVksMkRBQTJELENBQUM7b0JBQzFHLENBQUM7b0JBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDM0IsQ0FBQztZQUNILENBQUMsQ0FDRixDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7dUdBOUJVLG9CQUFvQjsyR0FBcEIsb0JBQW9COzsyRkFBcEIsb0JBQW9CO2tCQURoQyxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgSGFzaE1hcCwgVHJhbnNsYXRpb24gfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGdldFZhbHVlLCBpc0RlZmluZWQsIGlzT2JqZWN0LCBpc1N0cmluZywgc2V0VmFsdWUgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHtcbiAgZGVmYXVsdENvbmZpZyxcbiAgVFJBTlNMT0NPX0NPTkZJRyxcbiAgVHJhbnNsb2NvQ29uZmlnLFxufSBmcm9tICcuL3RyYW5zbG9jby5jb25maWcnO1xuXG5leHBvcnQgY29uc3QgVFJBTlNMT0NPX1RSQU5TUElMRVIgPSBuZXcgSW5qZWN0aW9uVG9rZW48VHJhbnNsb2NvVHJhbnNwaWxlcj4oXG4gICdUUkFOU0xPQ09fVFJBTlNQSUxFUicsXG4pO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zbG9jb1RyYW5zcGlsZXIge1xuICB0cmFuc3BpbGUocGFyYW1zOiBUcmFuc3BpbGVQYXJhbXMpOiBhbnk7XG5cbiAgb25MYW5nQ2hhbmdlZD8obGFuZzogc3RyaW5nKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc3BpbGVQYXJhbXM8ViA9IHVua25vd24+IHtcbiAgdmFsdWU6IFY7XG4gIHBhcmFtcz86IEhhc2hNYXA7XG4gIHRyYW5zbGF0aW9uOiBUcmFuc2xhdGlvbjtcbiAga2V5OiBzdHJpbmc7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEZWZhdWx0VHJhbnNwaWxlciBpbXBsZW1lbnRzIFRyYW5zbG9jb1RyYW5zcGlsZXIge1xuICBwcm90ZWN0ZWQgY29uZmlnID1cbiAgICBpbmplY3QoVFJBTlNMT0NPX0NPTkZJRywgeyBvcHRpb25hbDogdHJ1ZSB9KSA/PyBkZWZhdWx0Q29uZmlnO1xuXG4gIHByb3RlY3RlZCBnZXQgaW50ZXJwb2xhdGlvbk1hdGNoZXIoKSB7XG4gICAgcmV0dXJuIHJlc29sdmVNYXRjaGVyKHRoaXMuY29uZmlnKTtcbiAgfVxuXG4gIHRyYW5zcGlsZSh7IHZhbHVlLCBwYXJhbXMgPSB7fSwgdHJhbnNsYXRpb24sIGtleSB9OiBUcmFuc3BpbGVQYXJhbXMpOiBhbnkge1xuICAgIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgIGxldCBwYXJhbU1hdGNoOiBSZWdFeHBFeGVjQXJyYXkgfCBudWxsO1xuICAgICAgbGV0IHBhcnNlZFZhbHVlID0gdmFsdWU7XG5cbiAgICAgIHdoaWxlIChcbiAgICAgICAgKHBhcmFtTWF0Y2ggPSB0aGlzLmludGVycG9sYXRpb25NYXRjaGVyLmV4ZWMocGFyc2VkVmFsdWUpKSAhPT0gbnVsbFxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IFttYXRjaCwgcGFyYW1WYWx1ZV0gPSBwYXJhbU1hdGNoO1xuICAgICAgICBwYXJzZWRWYWx1ZSA9IHBhcnNlZFZhbHVlLnJlcGxhY2UobWF0Y2gsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBtYXRjaCA9IHBhcmFtVmFsdWUudHJpbSgpO1xuXG4gICAgICAgICAgY29uc3QgcGFyYW0gPSBnZXRWYWx1ZShwYXJhbXMsIG1hdGNoKTtcbiAgICAgICAgICBpZiAoaXNEZWZpbmVkKHBhcmFtKSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcmFtO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBpc0RlZmluZWQodHJhbnNsYXRpb25bbWF0Y2hdKVxuICAgICAgICAgICAgPyB0aGlzLnRyYW5zcGlsZSh7XG4gICAgICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uLFxuICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdHJhbnNsYXRpb25bbWF0Y2hdLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgOiAnJztcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwYXJzZWRWYWx1ZTtcbiAgICB9IGVsc2UgaWYgKHBhcmFtcykge1xuICAgICAgaWYgKGlzT2JqZWN0KHZhbHVlKSkge1xuICAgICAgICB2YWx1ZSA9IHRoaXMuaGFuZGxlT2JqZWN0KHtcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBwYXJhbXMsXG4gICAgICAgICAgdHJhbnNsYXRpb24sXG4gICAgICAgICAga2V5LFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUgPSB0aGlzLmhhbmRsZUFycmF5KHsgdmFsdWUsIHBhcmFtcywgdHJhbnNsYXRpb24sIGtleSB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogY29uc3QgZW4gPSB7XG4gICAqICBhOiB7XG4gICAqICAgIGI6IHtcbiAgICogICAgICBjOiBcIkhlbGxvIHt7IHZhbHVlIH19XCJcbiAgICogICAgfVxuICAgKiAgfVxuICAgKiB9XG4gICAqXG4gICAqIGNvbnN0IHBhcmFtcyA9ICB7XG4gICAqICBcImIuY1wiOiB7IHZhbHVlOiBcIlRyYW5zbG9jbyBcIn1cbiAgICogfVxuICAgKlxuICAgKiBzZXJ2aWNlLnNlbGVjdFRyYW5zbGF0ZSgnYScsIHBhcmFtcyk7XG4gICAqXG4gICAqIC8vIHRoZSBmaXJzdCBwYXJhbSB3aWxsIGJlIHRoZSByZXN1bHQgb2YgYGVuLmFgLlxuICAgKiAvLyB0aGUgc2Vjb25kIHBhcmFtIHdpbGwgYmUgYHBhcmFtc2AuXG4gICAqIHBhcnNlci50cmFuc3BpbGUodmFsdWUsIHBhcmFtcywge30pO1xuICAgKlxuICAgKlxuICAgKi9cbiAgcHJvdGVjdGVkIGhhbmRsZU9iamVjdCh7XG4gICAgdmFsdWUsXG4gICAgcGFyYW1zID0ge30sXG4gICAgdHJhbnNsYXRpb24sXG4gICAga2V5LFxuICB9OiBUcmFuc3BpbGVQYXJhbXM8UmVjb3JkPGFueSwgYW55Pj4pIHtcbiAgICBsZXQgcmVzdWx0ID0gdmFsdWU7XG5cbiAgICBPYmplY3Qua2V5cyhwYXJhbXMpLmZvckVhY2goKHApID0+IHtcbiAgICAgIC8vIHRyYW5zcGlsZSB0aGUgdmFsdWUgPT4gXCJIZWxsbyBUcmFuc2xvY29cIlxuICAgICAgY29uc3QgdHJhbnNwaWxlZCA9IHRoaXMudHJhbnNwaWxlKHtcbiAgICAgICAgLy8gZ2V0IHRoZSB2YWx1ZSBvZiBcImIuY1wiIGluc2lkZSBcImFcIiA9PiBcIkhlbGxvIHt7IHZhbHVlIH19XCJcbiAgICAgICAgdmFsdWU6IGdldFZhbHVlKHJlc3VsdCwgcCksXG4gICAgICAgIC8vIGdldCB0aGUgcGFyYW1zIG9mIFwiYi5jXCIgPT4geyB2YWx1ZTogXCJUcmFuc2xvY29cIiB9XG4gICAgICAgIHBhcmFtczogZ2V0VmFsdWUocGFyYW1zLCBwKSxcbiAgICAgICAgdHJhbnNsYXRpb24sXG4gICAgICAgIGtleSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBzZXQgXCJiLmNcIiB0byBgdHJhbnNwaWxlZGBcbiAgICAgIHJlc3VsdCA9IHNldFZhbHVlKHJlc3VsdCwgcCwgdHJhbnNwaWxlZCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZUFycmF5KHsgdmFsdWUsIC4uLnJlc3QgfTogVHJhbnNwaWxlUGFyYW1zPHVua25vd25bXT4pIHtcbiAgICByZXR1cm4gdmFsdWUubWFwKCh2KSA9PlxuICAgICAgdGhpcy50cmFuc3BpbGUoe1xuICAgICAgICB2YWx1ZTogdixcbiAgICAgICAgLi4ucmVzdCxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZU1hdGNoZXIoY29uZmlnOiBUcmFuc2xvY29Db25maWcpOiBSZWdFeHAge1xuICBjb25zdCBbc3RhcnQsIGVuZF0gPSBjb25maWcuaW50ZXJwb2xhdGlvbjtcblxuICByZXR1cm4gbmV3IFJlZ0V4cChgJHtzdGFydH0oW14ke3N0YXJ0fSR7ZW5kfV0qPykke2VuZH1gLCAnZycpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zbG9jb1RyYW5zcGlsZXJGdW5jdGlvbiB7XG4gIHRyYW5zcGlsZSguLi5hcmdzOiBzdHJpbmdbXSk6IGFueTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEZ1bmN0aW9uQXJncyhhcmdzU3RyaW5nOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHNwbGl0dGVkID0gYXJnc1N0cmluZyA/IGFyZ3NTdHJpbmcuc3BsaXQoJywnKSA6IFtdO1xuICBjb25zdCBhcmdzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3BsaXR0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgdmFsdWUgPSBzcGxpdHRlZFtpXS50cmltKCk7XG4gICAgd2hpbGUgKHZhbHVlW3ZhbHVlLmxlbmd0aCAtIDFdID09PSAnXFxcXCcpIHtcbiAgICAgIGkrKztcbiAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgnXFxcXCcsICcsJykgKyBzcGxpdHRlZFtpXTtcbiAgICB9XG4gICAgYXJncy5wdXNoKHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiBhcmdzO1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25hbFRyYW5zcGlsZXJcbiAgZXh0ZW5kcyBEZWZhdWx0VHJhbnNwaWxlclxuICBpbXBsZW1lbnRzIFRyYW5zbG9jb1RyYW5zcGlsZXJcbntcbiAgcHJvdGVjdGVkIGluamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcblxuICB0cmFuc3BpbGUoeyB2YWx1ZSwgLi4ucmVzdCB9OiBUcmFuc3BpbGVQYXJhbXMpIHtcbiAgICBsZXQgdHJhbnNwaWxlZCA9IHZhbHVlO1xuICAgIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgIHRyYW5zcGlsZWQgPSB2YWx1ZS5yZXBsYWNlKFxuICAgICAgICAvXFxbXFxbXFxzKihcXHcrKVxcKCguKj8pXFwpXFxzKl1dL2csXG4gICAgICAgIChtYXRjaDogc3RyaW5nLCBmdW5jdGlvbk5hbWU6IHN0cmluZywgYXJnczogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGZ1bmM6IFRyYW5zbG9jb1RyYW5zcGlsZXJGdW5jdGlvbiA9XG4gICAgICAgICAgICAgIHRoaXMuaW5qZWN0b3IuZ2V0KGZ1bmN0aW9uTmFtZSk7XG5cbiAgICAgICAgICAgIHJldHVybiBmdW5jLnRyYW5zcGlsZSguLi5nZXRGdW5jdGlvbkFyZ3MoYXJncykpO1xuICAgICAgICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlID0gYFRoZXJlIGlzIGFuIGVycm9yIGluOiAnJHt2YWx1ZX0nLiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhhdCB0aGUgeW91IHVzZWQgdGhlIHJpZ2h0IHN5bnRheCBpbiB5b3VyIHRyYW5zbGF0aW9uIGFuZCB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiAke2Z1bmN0aW9uTmFtZX0gaXMgY29ycmVjdC5gO1xuICAgICAgICAgICAgaWYgKChlIGFzIEVycm9yKS5tZXNzYWdlLmluY2x1ZGVzKCdOdWxsSW5qZWN0b3JFcnJvcicpKSB7XG4gICAgICAgICAgICAgIG1lc3NhZ2UgPSBgWW91IGFyZSB1c2luZyB0aGUgJyR7ZnVuY3Rpb25OYW1lfScgZnVuY3Rpb24gaW4geW91ciB0cmFuc2xhdGlvbiBidXQgbm8gcHJvdmlkZXIgd2FzIGZvdW5kIWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIudHJhbnNwaWxlKHsgdmFsdWU6IHRyYW5zcGlsZWQsIC4uLnJlc3QgfSk7XG4gIH1cbn1cbiJdfQ==
148
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsb2NvLnRyYW5zcGlsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3RyYW5zbG9jby9zcmMvbGliL3RyYW5zbG9jby50cmFuc3BpbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHN0UsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDOUUsT0FBTyxFQUNMLGFBQWEsRUFDYixnQkFBZ0IsR0FFakIsTUFBTSxvQkFBb0IsQ0FBQzs7QUFFNUIsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxjQUFjLENBQ3BELE9BQU8sU0FBUyxLQUFLLFdBQVcsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQzVFLENBQUM7QUFnQkYsTUFBTSxPQUFPLGlCQUFpQjtJQUNsQixNQUFNLEdBQ2QsTUFBTSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksYUFBYSxDQUFDO0lBRWhFLElBQWMsb0JBQW9CO1FBQ2hDLE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBbUI7UUFDakUsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNwQixJQUFJLFVBQWtDLENBQUM7WUFDdkMsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBRXhCLE9BQ0UsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUks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VUFBVSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQ3hCLDZCQUE2QixFQUM3QixDQUFDLEtBQWEsRUFBRSxZQUFvQixFQUFFLElBQVksRUFBRSxFQUFFO2dCQUNwRCxJQUFJLENBQUM7b0JBQ0gsTUFBTSxJQUFJLEdBQ1IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBRWxDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNsRCxDQUFDO2dCQUFDLE9BQU8sQ0FBVSxFQUFFLENBQUM7b0JBQ3BCLElBQUksT0FBTyxHQUFHLDBCQUEwQixLQUFLO3dIQUMrRCxZQUFZLGNBQWMsQ0FBQztvQkFDdkksSUFBSyxDQUFXLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUM7d0JBQ3ZELE9BQU8sR0FBRyxzQkFBc0IsWUFBWSwyREFBMkQsQ0FBQztvQkFDMUcsQ0FBQztvQkFDRCxNQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMzQixDQUFDO1lBQ0gsQ0FBQyxDQUNGLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxHQUFHLElBQUksRUFBRSxDQUFDLENBQUM7SUFDekQsQ0FBQzt1R0E5QlUsb0JBQW9COzJHQUFwQixvQkFBb0I7OzJGQUFwQixvQkFBb0I7a0JBRGhDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBIYXNoTWFwLCBUcmFuc2xhdGlvbiB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgZ2V0VmFsdWUsIGlzRGVmaW5lZCwgaXNPYmplY3QsIGlzU3RyaW5nLCBzZXRWYWx1ZSB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQge1xuICBkZWZhdWx0Q29uZmlnLFxuICBUUkFOU0xPQ09fQ09ORklHLFxuICBUcmFuc2xvY29Db25maWcsXG59IGZyb20gJy4vdHJhbnNsb2NvLmNvbmZpZyc7XG5cbmV4cG9ydCBjb25zdCBUUkFOU0xPQ09fVFJBTlNQSUxFUiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxUcmFuc2xvY29UcmFuc3BpbGVyPihcbiAgdHlwZW9mIG5nRGV2TW9kZSAhPT0gJ3VuZGVmaW5lZCcgJiYgbmdEZXZNb2RlID8gJ1RSQU5TTE9DT19UUkFOU1BJTEVSJyA6ICcnLFxuKTtcblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2xvY29UcmFuc3BpbGVyIHtcbiAgdHJhbnNwaWxlKHBhcmFtczogVHJhbnNwaWxlUGFyYW1zKTogYW55O1xuXG4gIG9uTGFuZ0NoYW5nZWQ/KGxhbmc6IHN0cmluZyk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNwaWxlUGFyYW1zPFYgPSB1bmtub3duPiB7XG4gIHZhbHVlOiBWO1xuICBwYXJhbXM/OiBIYXNoTWFwO1xuICB0cmFuc2xhdGlvbjogVHJhbnNsYXRpb247XG4gIGtleTogc3RyaW5nO1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGVmYXVsdFRyYW5zcGlsZXIgaW1wbGVtZW50cyBUcmFuc2xvY29UcmFuc3BpbGVyIHtcbiAgcHJvdGVjdGVkIGNvbmZpZyA9XG4gICAgaW5qZWN0KFRSQU5TTE9DT19DT05GSUcsIHsgb3B0aW9uYWw6IHRydWUgfSkgPz8gZGVmYXVsdENvbmZpZztcblxuICBwcm90ZWN0ZWQgZ2V0IGludGVycG9sYXRpb25NYXRjaGVyKCkge1xuICAgIHJldHVybiByZXNvbHZlTWF0Y2hlcih0aGlzLmNvbmZpZyk7XG4gIH1cblxuICB0cmFuc3BpbGUoeyB2YWx1ZSwgcGFyYW1zID0ge30sIHRyYW5zbGF0aW9uLCBrZXkgfTogVHJhbnNwaWxlUGFyYW1zKTogYW55IHtcbiAgICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICBsZXQgcGFyYW1NYXRjaDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbDtcbiAgICAgIGxldCBwYXJzZWRWYWx1ZSA9IHZhbHVlO1xuXG4gICAgICB3aGlsZSAoXG4gICAgICAgIChwYXJhbU1hdGNoID0gdGhpcy5pbnRlcnBvbGF0aW9uTWF0Y2hlci5leGVjKHBhcnNlZFZhbHVlKSkgIT09IG51bGxcbiAgICAgICkge1xuICAgICAgICBjb25zdCBbbWF0Y2gsIHBhcmFtVmFsdWVdID0gcGFyYW1NYXRjaDtcbiAgICAgICAgcGFyc2VkVmFsdWUgPSBwYXJzZWRWYWx1ZS5yZXBsYWNlKG1hdGNoLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgbWF0Y2ggPSBwYXJhbVZhbHVlLnRyaW0oKTtcblxuICAgICAgICAgIGNvbnN0IHBhcmFtID0gZ2V0VmFsdWUocGFyYW1zLCBtYXRjaCk7XG4gICAgICAgICAgaWYgKGlzRGVmaW5lZChwYXJhbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gaXNEZWZpbmVkKHRyYW5zbGF0aW9uW21hdGNoXSlcbiAgICAgICAgICAgID8gdGhpcy50cmFuc3BpbGUoe1xuICAgICAgICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGlvbixcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRyYW5zbGF0aW9uW21hdGNoXSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIDogJyc7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyc2VkVmFsdWU7XG4gICAgfSBlbHNlIGlmIChwYXJhbXMpIHtcbiAgICAgIGlmIChpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAgICAgdmFsdWUgPSB0aGlzLmhhbmRsZU9iamVjdCh7XG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgIHRyYW5zbGF0aW9uLFxuICAgICAgICAgIGtleSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlID0gdGhpcy5oYW5kbGVBcnJheSh7IHZhbHVlLCBwYXJhbXMsIHRyYW5zbGF0aW9uLCBrZXkgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqIGNvbnN0IGVuID0ge1xuICAgKiAgYToge1xuICAgKiAgICBiOiB7XG4gICAqICAgICAgYzogXCJIZWxsbyB7eyB2YWx1ZSB9fVwiXG4gICAqICAgIH1cbiAgICogIH1cbiAgICogfVxuICAgKlxuICAgKiBjb25zdCBwYXJhbXMgPSAge1xuICAgKiAgXCJiLmNcIjogeyB2YWx1ZTogXCJUcmFuc2xvY28gXCJ9XG4gICAqIH1cbiAgICpcbiAgICogc2VydmljZS5zZWxlY3RUcmFuc2xhdGUoJ2EnLCBwYXJhbXMpO1xuICAgKlxuICAgKiAvLyB0aGUgZmlyc3QgcGFyYW0gd2lsbCBiZSB0aGUgcmVzdWx0IG9mIGBlbi5hYC5cbiAgICogLy8gdGhlIHNlY29uZCBwYXJhbSB3aWxsIGJlIGBwYXJhbXNgLlxuICAgKiBwYXJzZXIudHJhbnNwaWxlKHZhbHVlLCBwYXJhbXMsIHt9KTtcbiAgICpcbiAgICpcbiAgICovXG4gIHByb3RlY3RlZCBoYW5kbGVPYmplY3Qoe1xuICAgIHZhbHVlLFxuICAgIHBhcmFtcyA9IHt9LFxuICAgIHRyYW5zbGF0aW9uLFxuICAgIGtleSxcbiAgfTogVHJhbnNwaWxlUGFyYW1zPFJlY29yZDxhbnksIGFueT4+KSB7XG4gICAgbGV0IHJlc3VsdCA9IHZhbHVlO1xuXG4gICAgT2JqZWN0LmtleXMocGFyYW1zKS5mb3JFYWNoKChwKSA9PiB7XG4gICAgICAvLyB0cmFuc3BpbGUgdGhlIHZhbHVlID0+IFwiSGVsbG8gVHJhbnNsb2NvXCJcbiAgICAgIGNvbnN0IHRyYW5zcGlsZWQgPSB0aGlzLnRyYW5zcGlsZSh7XG4gICAgICAgIC8vIGdldCB0aGUgdmFsdWUgb2YgXCJiLmNcIiBpbnNpZGUgXCJhXCIgPT4gXCJIZWxsbyB7eyB2YWx1ZSB9fVwiXG4gICAgICAgIHZhbHVlOiBnZXRWYWx1ZShyZXN1bHQsIHApLFxuICAgICAgICAvLyBnZXQgdGhlIHBhcmFtcyBvZiBcImIuY1wiID0+IHsgdmFsdWU6IFwiVHJhbnNsb2NvXCIgfVxuICAgICAgICBwYXJhbXM6IGdldFZhbHVlKHBhcmFtcywgcCksXG4gICAgICAgIHRyYW5zbGF0aW9uLFxuICAgICAgICBrZXksXG4gICAgICB9KTtcblxuICAgICAgLy8gc2V0IFwiYi5jXCIgdG8gYHRyYW5zcGlsZWRgXG4gICAgICByZXN1bHQgPSBzZXRWYWx1ZShyZXN1bHQsIHAsIHRyYW5zcGlsZWQpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVBcnJheSh7IHZhbHVlLCAuLi5yZXN0IH06IFRyYW5zcGlsZVBhcmFtczx1bmtub3duW10+KSB7XG4gICAgcmV0dXJuIHZhbHVlLm1hcCgodikgPT5cbiAgICAgIHRoaXMudHJhbnNwaWxlKHtcbiAgICAgICAgdmFsdWU6IHYsXG4gICAgICAgIC4uLnJlc3QsXG4gICAgICB9KSxcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVNYXRjaGVyKGNvbmZpZzogVHJhbnNsb2NvQ29uZmlnKTogUmVnRXhwIHtcbiAgY29uc3QgW3N0YXJ0LCBlbmRdID0gY29uZmlnLmludGVycG9sYXRpb247XG5cbiAgcmV0dXJuIG5ldyBSZWdFeHAoYCR7c3RhcnR9KFteJHtzdGFydH0ke2VuZH1dKj8pJHtlbmR9YCwgJ2cnKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUcmFuc2xvY29UcmFuc3BpbGVyRnVuY3Rpb24ge1xuICB0cmFuc3BpbGUoLi4uYXJnczogc3RyaW5nW10pOiBhbnk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGdW5jdGlvbkFyZ3MoYXJnc1N0cmluZzogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBzcGxpdHRlZCA9IGFyZ3NTdHJpbmcgPyBhcmdzU3RyaW5nLnNwbGl0KCcsJykgOiBbXTtcbiAgY29uc3QgYXJncyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0dGVkLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IHZhbHVlID0gc3BsaXR0ZWRbaV0udHJpbSgpO1xuICAgIHdoaWxlICh2YWx1ZVt2YWx1ZS5sZW5ndGggLSAxXSA9PT0gJ1xcXFwnKSB7XG4gICAgICBpKys7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoJ1xcXFwnLCAnLCcpICsgc3BsaXR0ZWRbaV07XG4gICAgfVxuICAgIGFyZ3MucHVzaCh2YWx1ZSk7XG4gIH1cblxuICByZXR1cm4gYXJncztcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZ1bmN0aW9uYWxUcmFuc3BpbGVyXG4gIGV4dGVuZHMgRGVmYXVsdFRyYW5zcGlsZXJcbiAgaW1wbGVtZW50cyBUcmFuc2xvY29UcmFuc3BpbGVyXG57XG4gIHByb3RlY3RlZCBpbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG5cbiAgdHJhbnNwaWxlKHsgdmFsdWUsIC4uLnJlc3QgfTogVHJhbnNwaWxlUGFyYW1zKSB7XG4gICAgbGV0IHRyYW5zcGlsZWQgPSB2YWx1ZTtcbiAgICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICB0cmFuc3BpbGVkID0gdmFsdWUucmVwbGFjZShcbiAgICAgICAgL1xcW1xcW1xccyooXFx3KylcXCgoLio/KVxcKVxccypdXS9nLFxuICAgICAgICAobWF0Y2g6IHN0cmluZywgZnVuY3Rpb25OYW1lOiBzdHJpbmcsIGFyZ3M6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBmdW5jOiBUcmFuc2xvY29UcmFuc3BpbGVyRnVuY3Rpb24gPVxuICAgICAgICAgICAgICB0aGlzLmluamVjdG9yLmdldChmdW5jdGlvbk5hbWUpO1xuXG4gICAgICAgICAgICByZXR1cm4gZnVuYy50cmFuc3BpbGUoLi4uZ2V0RnVuY3Rpb25BcmdzKGFyZ3MpKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBUaGVyZSBpcyBhbiBlcnJvciBpbjogJyR7dmFsdWV9Jy4gXG4gICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrIHRoYXQgdGhlIHlvdSB1c2VkIHRoZSByaWdodCBzeW50YXggaW4geW91ciB0cmFuc2xhdGlvbiBhbmQgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gb2YgJHtmdW5jdGlvbk5hbWV9IGlzIGNvcnJlY3QuYDtcbiAgICAgICAgICAgIGlmICgoZSBhcyBFcnJvcikubWVzc2FnZS5pbmNsdWRlcygnTnVsbEluamVjdG9yRXJyb3InKSkge1xuICAgICAgICAgICAgICBtZXNzYWdlID0gYFlvdSBhcmUgdXNpbmcgdGhlICcke2Z1bmN0aW9uTmFtZX0nIGZ1bmN0aW9uIGluIHlvdXIgdHJhbnNsYXRpb24gYnV0IG5vIHByb3ZpZGVyIHdhcyBmb3VuZCFgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLnRyYW5zcGlsZSh7IHZhbHVlOiB0cmFuc3BpbGVkLCAuLi5yZXN0IH0pO1xuICB9XG59XG4iXX0=
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3RyYW5zbG9jby9zcmMvbGliL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBIYXNoTWFwPFQgPSBhbnk+ID0gUmVjb3JkPHN0cmluZywgVD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZGVkRXZlbnQge1xuICB0eXBlOiAndHJhbnNsYXRpb25Mb2FkU3VjY2Vzcyc7XG4gIHdhc0ZhaWx1cmU6IGJvb2xlYW47XG4gIHBheWxvYWQ6IHtcbiAgICBzY29wZTogc3RyaW5nIHwgbnVsbDtcbiAgICBsYW5nTmFtZTogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZhaWxlZEV2ZW50IHtcbiAgdHlwZTogJ3RyYW5zbGF0aW9uTG9hZEZhaWx1cmUnO1xuICBwYXlsb2FkOiBMb2FkZWRFdmVudFsncGF5bG9hZCddO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExhbmdDaGFuZ2VkRXZlbnQge1xuICB0eXBlOiAnbGFuZ0NoYW5nZWQnO1xuICBwYXlsb2FkOiBMb2FkZWRFdmVudFsncGF5bG9hZCddO1xufVxuXG5leHBvcnQgdHlwZSBUcmFuc2xvY29FdmVudHMgPSBMb2FkZWRFdmVudCB8IEZhaWxlZEV2ZW50IHwgTGFuZ0NoYW5nZWRFdmVudDtcbmV4cG9ydCB0eXBlIFRyYW5zbGF0aW9uID0gSGFzaE1hcDtcbmV4cG9ydCB0eXBlIFRyYW5zbGF0ZVBhcmFtcyA9IHN0cmluZyB8IHN0cmluZ1tdO1xuZXhwb3J0IHR5cGUgVHJhbnNsYXRlT2JqZWN0UGFyYW1zID1cbiAgfCBUcmFuc2xhdGVQYXJhbXNcbiAgfCBIYXNoTWFwXG4gIHwgTWFwPHN0cmluZywgSGFzaE1hcD47XG5leHBvcnQgaW50ZXJmYWNlIExhbmdEZWZpbml0aW9uIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbn1cbmV4cG9ydCB0eXBlIEF2YWlsYWJsZUxhbmdzID0gc3RyaW5nW10gfCBMYW5nRGVmaW5pdGlvbltdO1xuZXhwb3J0IGludGVyZmFjZSBTZXRUcmFuc2xhdGlvbk9wdGlvbnMge1xuICBsYW5nPzogc3RyaW5nO1xuICBtZXJnZT86IGJvb2xlYW47XG4gIGVtaXRDaGFuZ2U/OiBib29sZWFuO1xufVxuZXhwb3J0IGludGVyZmFjZSBQcm92aWRlclNjb3BlIHtcbiAgc2NvcGU6IHN0cmluZztcbiAgbG9hZGVyPzogSW5saW5lTG9hZGVyO1xuICBhbGlhcz86IHN0cmluZztcbn1cbmV4cG9ydCB0eXBlIE9yQXJyYXk8VD4gPSBUIHwgVFtdO1xuZXhwb3J0IHR5cGUgVHJhbnNsb2NvU2NvcGUgPSBQcm92aWRlclNjb3BlIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xuZXhwb3J0IHR5cGUgSW5saW5lTG9hZGVyID0gSGFzaE1hcDwoKSA9PiBQcm9taXNlPFRyYW5zbGF0aW9uPj47XG5leHBvcnQgaW50ZXJmYWNlIExvYWRPcHRpb25zIHtcbiAgZmFsbGJhY2tMYW5ncz86IHN0cmluZ1tdIHwgbnVsbDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBmYWlsZWRDb3VudGVyPzogbnVtYmVyO1xuICBpbmxpbmVMb2FkZXI/OiBJbmxpbmVMb2FkZXI7XG59XG4iXX0=
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3RyYW5zbG9jby9zcmMvbGliL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBIYXNoTWFwPFQgPSBhbnk+ID0gUmVjb3JkPHN0cmluZywgVD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9hZGVkRXZlbnQge1xuICB0eXBlOiAndHJhbnNsYXRpb25Mb2FkU3VjY2Vzcyc7XG4gIHdhc0ZhaWx1cmU6IGJvb2xlYW47XG4gIHBheWxvYWQ6IHtcbiAgICBzY29wZTogc3RyaW5nIHwgbnVsbDtcbiAgICBsYW5nTmFtZTogc3RyaW5nO1xuICB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZhaWxlZEV2ZW50IHtcbiAgdHlwZTogJ3RyYW5zbGF0aW9uTG9hZEZhaWx1cmUnO1xuICBwYXlsb2FkOiBMb2FkZWRFdmVudFsncGF5bG9hZCddO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExhbmdDaGFuZ2VkRXZlbnQge1xuICB0eXBlOiAnbGFuZ0NoYW5nZWQnO1xuICBwYXlsb2FkOiBMb2FkZWRFdmVudFsncGF5bG9hZCddO1xufVxuXG5leHBvcnQgdHlwZSBUcmFuc2xvY29FdmVudHMgPSBMb2FkZWRFdmVudCB8IEZhaWxlZEV2ZW50IHwgTGFuZ0NoYW5nZWRFdmVudDtcbmV4cG9ydCB0eXBlIFRyYW5zbGF0aW9uID0gSGFzaE1hcDtcbmV4cG9ydCB0eXBlIFRyYW5zbGF0ZVBhcmFtcyA9IHN0cmluZyB8IHN0cmluZ1tdO1xuZXhwb3J0IHR5cGUgVHJhbnNsYXRlT2JqZWN0UGFyYW1zID1cbiAgfCBUcmFuc2xhdGVQYXJhbXNcbiAgfCBIYXNoTWFwXG4gIHwgTWFwPHN0cmluZywgSGFzaE1hcD47XG5leHBvcnQgaW50ZXJmYWNlIExhbmdEZWZpbml0aW9uIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbn1cbmV4cG9ydCB0eXBlIEF2YWlsYWJsZUxhbmdzID0gc3RyaW5nW10gfCBMYW5nRGVmaW5pdGlvbltdO1xuZXhwb3J0IGludGVyZmFjZSBTZXRUcmFuc2xhdGlvbk9wdGlvbnMge1xuICBsYW5nPzogc3RyaW5nO1xuICBtZXJnZT86IGJvb2xlYW47XG4gIGVtaXRDaGFuZ2U/OiBib29sZWFuO1xufVxuZXhwb3J0IGludGVyZmFjZSBQcm92aWRlclNjb3BlIHtcbiAgc2NvcGU6IHN0cmluZztcbiAgbG9hZGVyPzogSW5saW5lTG9hZGVyO1xuICBhbGlhcz86IHN0cmluZztcbn1cbmV4cG9ydCB0eXBlIE9yQXJyYXk8VD4gPSBUIHwgVFtdO1xuZXhwb3J0IHR5cGUgVHJhbnNsb2NvU2NvcGUgPSBQcm92aWRlclNjb3BlIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xuZXhwb3J0IHR5cGUgSW5saW5lTG9hZGVyID0gSGFzaE1hcDwoKSA9PiBQcm9taXNlPFRyYW5zbGF0aW9uPj47XG5leHBvcnQgaW50ZXJmYWNlIExvYWRPcHRpb25zIHtcbiAgZmFsbGJhY2tMYW5ncz86IHN0cmluZ1tdIHwgbnVsbDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBmYWlsZWRDb3VudGVyPzogbnVtYmVyO1xuICBpbmxpbmVMb2FkZXI/OiBJbmxpbmVMb2FkZXI7XG59XG5cbi8qKiBAaW50ZXJuYWwgKi9cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgLy8gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFwcGxpY2F0aW9uIGlzIG9wZXJhdGluZyBpbiBkZXZlbG9wbWVudCBtb2RlLlxuICAvLyBgbmdEZXZNb2RlYCBpcyBhIGdsb2JhbCBmbGFnIHNldCBieSBBbmd1bGFyIENMSS5cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci1jbGkvYmxvYi85Yjg4M2ZlMjg4NjJjOTY3MjBjNzg5OWI0MzExNzRlOWI0N2FkN2U0L3BhY2thZ2VzL2FuZ3VsYXIvYnVpbGQvc3JjL3Rvb2xzL2VzYnVpbGQvYXBwbGljYXRpb24tY29kZS1idW5kbGUudHMjTDYwNFxuICBjb25zdCBuZ0Rldk1vZGU6IGJvb2xlYW47XG59XG4iXX0=