@sumaris-net/ngx-components 2.7.5-rc2 → 2.7.5-rc21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +4 -3
  2. package/esm2022/src/app/core/account/new-token.modal.mjs +7 -9
  3. package/esm2022/src/app/core/account/token.table.mjs +2 -3
  4. package/esm2022/src/app/core/form/properties/properties.table.mjs +1 -1
  5. package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.mjs +9 -10
  6. package/esm2022/src/app/core/services/account.service.mjs +3 -2
  7. package/esm2022/src/app/core/services/model/person.model.mjs +9 -6
  8. package/esm2022/src/app/core/services/model/referential.model.mjs +12 -4
  9. package/esm2022/src/app/core/services/pipes/person-to-string.pipe.mjs +4 -4
  10. package/esm2022/src/app/core/services/platform.service.mjs +37 -16
  11. package/esm2022/src/app/core/table/actions-column.component.mjs +3 -3
  12. package/esm2022/src/app/core/table/testing/table.testing.mjs +1 -1
  13. package/esm2022/src/app/core/table/testing/table2.testing.mjs +1 -1
  14. package/esm2022/src/app/shared/form/field.component.mjs +3 -3
  15. package/esm2022/src/app/shared/functions.mjs +1 -1
  16. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +7 -4
  17. package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +1 -1
  18. package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +6 -3
  19. package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +1 -1
  20. package/esm2022/src/app/shared/material/chips/material.chips.mjs +7 -4
  21. package/esm2022/src/app/shared/material/chips/testing/chips.test.mjs +1 -1
  22. package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +3 -3
  23. package/esm2022/src/app/shared/material/swipe/material.swipe.mjs +6 -3
  24. package/esm2022/src/app/shared/material/swipe/testing/swipe.test.mjs +1 -1
  25. package/esm2022/src/app/shared/material/testing/common.test.mjs +1 -1
  26. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +15 -7
  27. package/esm2022/src/app/shared/pipes/property.pipes.mjs +3 -3
  28. package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +18 -23
  29. package/esm2022/src/app/shared/toolbar/toolbar.mjs +15 -15
  30. package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +4 -3
  31. package/esm2022/src/app/shared/validator/validators.mjs +10 -1
  32. package/esm2022/src/app/social/message/message.form.mjs +1 -1
  33. package/fesm2022/sumaris-net.ngx-components.mjs +194 -140
  34. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  35. package/package.json +1 -1
  36. package/src/app/core/account/new-token.modal.d.ts +1 -1
  37. package/src/app/core/form/text-popover/testing/text-popover.testing.d.ts +3 -1
  38. package/src/app/core/services/model/person.model.d.ts +6 -2
  39. package/src/app/core/services/model/referential.model.d.ts +5 -1
  40. package/src/app/core/services/pipes/person-to-string.pipe.d.ts +3 -1
  41. package/src/app/core/services/platform.service.d.ts +6 -2
  42. package/src/app/shared/functions.d.ts +1 -1
  43. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +3 -2
  44. package/src/app/shared/material/boolean/material.boolean.d.ts +3 -2
  45. package/src/app/shared/material/chips/material.chips.d.ts +3 -2
  46. package/src/app/shared/material/swipe/material.swipe.d.ts +3 -2
  47. package/src/app/shared/named-filter/named-filter-selector.component.d.ts +8 -4
  48. package/src/app/shared/pipes/property.pipes.d.ts +1 -1
  49. package/src/app/shared/storage/storage-explorer.component.d.ts +4 -3
  50. package/src/app/shared/toolbar/toolbar.d.ts +2 -2
  51. package/src/app/shared/validator/validators.d.ts +1 -0
  52. package/src/assets/manifest.json +1 -1
  53. package/src/theme/_mixins.scss +0 -1
  54. package/src/theme/_theme.variables.scss +4 -0
@@ -18,20 +18,22 @@ import { Keyboard } from '@capacitor/keyboard';
18
18
  import { CapacitorPlugins } from '../../shared/capacitor/plugins';
19
19
  import { locale as momentLocale } from 'moment';
20
20
  import { APP_LOGGING_SERVICE } from '../../shared/logging/logging-service.class';
21
+ import { Clipboard } from '@capacitor/clipboard';
21
22
  import * as i0 from "@angular/core";
22
23
  import * as i1 from "@ionic/angular";
23
24
  import * as i2 from "@angular/cdk/platform";
24
- import * as i3 from "@ngx-translate/core";
25
- import * as i4 from "@angular/material-moment-adapter";
26
- import * as i5 from "./storage/entities-storage.service";
27
- import * as i6 from "./local-settings.service";
28
- import * as i7 from "./network.service";
29
- import * as i8 from "./account.service";
30
- import * as i9 from "./config.service";
31
- import * as i10 from "ionic-cache";
32
- import * as i11 from "../../shared/audio/audio";
33
- import * as i12 from "@ionic-native/downloader/ngx";
34
- import * as i13 from "../../../environments/environment.class";
25
+ import * as i3 from "@angular/cdk/clipboard";
26
+ import * as i4 from "@ngx-translate/core";
27
+ import * as i5 from "@angular/material-moment-adapter";
28
+ import * as i6 from "./storage/entities-storage.service";
29
+ import * as i7 from "./local-settings.service";
30
+ import * as i8 from "./network.service";
31
+ import * as i9 from "./account.service";
32
+ import * as i10 from "./config.service";
33
+ import * as i11 from "ionic-cache";
34
+ import * as i12 from "../../shared/audio/audio";
35
+ import * as i13 from "@ionic-native/downloader/ngx";
36
+ import * as i14 from "../../../environments/environment.class";
35
37
  export const AndroidOsEnvironment = Object.freeze({
36
38
  DIRECTORY_DOWNLOADS: 'Download',
37
39
  DIRECTORY_DOWNLOADS_OLD: 'Downloads', // Old name, for older Android version
@@ -50,6 +52,7 @@ export const AndroidOsEnvironment = Object.freeze({
50
52
  export class PlatformService extends StartableService {
51
53
  ionicPlatform;
52
54
  cdkPlatform;
55
+ cdkClipboard;
53
56
  toastController;
54
57
  translate;
55
58
  dateAdapter;
@@ -69,10 +72,11 @@ export class PlatformService extends StartableService {
69
72
  _capacitor;
70
73
  _android;
71
74
  _ios;
72
- constructor(ionicPlatform, cdkPlatform, toastController, translate, dateAdapter, entitiesStorage, settings, networkService, accountService, configService, cache, audioProvider, environment, loggingService, downloader) {
75
+ constructor(ionicPlatform, cdkPlatform, cdkClipboard, toastController, translate, dateAdapter, entitiesStorage, settings, networkService, accountService, configService, cache, audioProvider, environment, loggingService, downloader) {
73
76
  super(ionicPlatform);
74
77
  this.ionicPlatform = ionicPlatform;
75
78
  this.cdkPlatform = cdkPlatform;
79
+ this.cdkClipboard = cdkClipboard;
76
80
  this.toastController = toastController;
77
81
  this.translate = translate;
78
82
  this.dateAdapter = dateAdapter;
@@ -322,6 +326,23 @@ export class PlatformService extends StartableService {
322
326
  return of(undefined);
323
327
  }
324
328
  }
329
+ async copyToClipboard(data, opts) {
330
+ const value = (typeof data === 'string') ? data : data.string;
331
+ if (this.isAndroidCordova()) {
332
+ const writeOptions = (typeof data === 'string') ? { string: value } : data;
333
+ await Clipboard.write(writeOptions);
334
+ }
335
+ else {
336
+ this.cdkClipboard.copy(value);
337
+ }
338
+ // Show toast
339
+ if (opts && isNotNilOrBlank(opts.message)) {
340
+ await Toasts.show(this.toastController, this.translate, {
341
+ type: 'info',
342
+ ...opts,
343
+ });
344
+ }
345
+ }
325
346
  /* -- protected methods -- */
326
347
  configureGlobalCssClass(mobile, win = window) {
327
348
  if (mobile)
@@ -533,13 +554,13 @@ export class PlatformService extends StartableService {
533
554
  console.error('cause', err.details);
534
555
  }
535
556
  }
536
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: PlatformService, deps: [{ token: i1.Platform }, { token: i2.Platform }, { token: i1.ToastController }, { token: i3.TranslateService }, { token: i4.MomentDateAdapter }, { token: i5.EntitiesStorage }, { token: i6.LocalSettingsService }, { token: i7.NetworkService }, { token: i8.AccountService }, { token: i9.ConfigService }, { token: i10.CacheService }, { token: i11.AudioProvider }, { token: ENVIRONMENT }, { token: APP_LOGGING_SERVICE, optional: true }, { token: i12.Downloader, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
557
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: PlatformService, deps: [{ token: i1.Platform }, { token: i2.Platform }, { token: i3.Clipboard }, { token: i1.ToastController }, { token: i4.TranslateService }, { token: i5.MomentDateAdapter }, { token: i6.EntitiesStorage }, { token: i7.LocalSettingsService }, { token: i8.NetworkService }, { token: i9.AccountService }, { token: i10.ConfigService }, { token: i11.CacheService }, { token: i12.AudioProvider }, { token: ENVIRONMENT }, { token: APP_LOGGING_SERVICE, optional: true }, { token: i13.Downloader, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
537
558
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: PlatformService, providedIn: 'root' });
538
559
  }
539
560
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: PlatformService, decorators: [{
540
561
  type: Injectable,
541
562
  args: [{ providedIn: 'root' }]
542
- }], ctorParameters: () => [{ type: i1.Platform }, { type: i2.Platform }, { type: i1.ToastController }, { type: i3.TranslateService }, { type: i4.MomentDateAdapter }, { type: i5.EntitiesStorage }, { type: i6.LocalSettingsService }, { type: i7.NetworkService }, { type: i8.AccountService }, { type: i9.ConfigService }, { type: i10.CacheService }, { type: i11.AudioProvider }, { type: i13.Environment, decorators: [{
563
+ }], ctorParameters: () => [{ type: i1.Platform }, { type: i2.Platform }, { type: i3.Clipboard }, { type: i1.ToastController }, { type: i4.TranslateService }, { type: i5.MomentDateAdapter }, { type: i6.EntitiesStorage }, { type: i7.LocalSettingsService }, { type: i8.NetworkService }, { type: i9.AccountService }, { type: i10.ConfigService }, { type: i11.CacheService }, { type: i12.AudioProvider }, { type: i14.Environment, decorators: [{
543
564
  type: Inject,
544
565
  args: [ENVIRONMENT]
545
566
  }] }, { type: undefined, decorators: [{
@@ -547,7 +568,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImpor
547
568
  }, {
548
569
  type: Inject,
549
570
  args: [APP_LOGGING_SERVICE]
550
- }] }, { type: i12.Downloader, decorators: [{
571
+ }] }, { type: i13.Downloader, decorators: [{
551
572
  type: Optional
552
573
  }] }] });
553
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm0uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9zZXJ2aWNlcy9wbGF0Zm9ybS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVU3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFNUYsT0FBTyxFQUFvQixNQUFNLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUdyRSxPQUFPLEVBQUUsSUFBSSxFQUFjLEVBQUUsRUFBZ0IsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZELE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUVuRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUzRCxPQUFPLEVBQStCLHNCQUFzQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDakYsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFB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QUksZUFBZSxjQUFjLFVBQVUsQ0FBQztZQUNyRCxDQUFDO1lBQ0QsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUNuQixJQUFJLEVBQUUsT0FBTztnQkFDYixRQUFRLEVBQUUsQ0FBQyxDQUFDO2dCQUNaLGVBQWUsRUFBRSxJQUFJO2dCQUNyQixPQUFPO2FBQ1IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLElBQUksTUFBTSxFQUFFLENBQUM7WUFDbEIsSUFBSSxjQUFjLEVBQUUsQ0FBQztnQkFDbkIsT0FBTyxJQUFJLGdCQUFnQixjQUFjLElBQUksQ0FBQztZQUNoRCxDQUFDO1lBQ0QsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QixDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkIsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU87Z0JBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlELENBQUM7SUFDSCxDQUFDO3VHQXZpQlUsZUFBZSx5WEFvQmhCLFdBQVcsYUFDQyxtQkFBbUI7MkdBckI5QixlQUFlLGNBREYsTUFBTTs7MkZBQ25CLGVBQWU7a0JBRDNCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFOzswQkFxQjdCLE1BQU07MkJBQUMsV0FBVzs7MEJBQ2xCLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsbUJBQW1COzswQkFDdEMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBsYXRmb3JtLCBUb2FzdENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBOZXR3b3JrU2VydmljZSB9IGZyb20gJy4vbmV0d29yay5zZXJ2aWNlJztcbmltcG9ydCB7IEF1dGhUb2tlblR5cGUgfSBmcm9tICcuL25ldHdvcmsudHlwZXMnO1xuaW1wb3J0IHsgUGxhdGZvcm1zIH0gZnJvbSAnQGlvbmljL2NvcmUnO1xuaW1wb3J0IHsgTG9jYWxTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuL2xvY2FsLXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2FjaGVTZXJ2aWNlIH0gZnJvbSAnaW9uaWMtY2FjaGUnO1xuaW1wb3J0IHsgQXVkaW9Qcm92aWRlciB9IGZyb20gJy4uLy4uL3NoYXJlZC9hdWRpby9hdWRpbyc7XG5pbXBvcnQgeyBQbGF0Zm9ybSBhcyBDZGtQbGF0Zm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wbGF0Zm9ybSc7XG5cbmltcG9ydCB7IGlzTmlsT3JCbGFuaywgaXNOb3ROaWwsIGlzTm90TmlsT3JCbGFuaywgdG9Cb29sZWFuIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBFbnRpdGllc1N0b3JhZ2UgfSBmcm9tICcuL3N0b3JhZ2UvZW50aXRpZXMtc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IFNob3dUb2FzdE9wdGlvbnMsIFRvYXN0cyB9IGZyb20gJy4uLy4uL3NoYXJlZC90b2FzdC90b2FzdHMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQWNjb3VudFNlcnZpY2UgfSBmcm9tICcuL2FjY291bnQuc2VydmljZSc7XG5pbXBvcnQgeyBmcm9tLCBPYnNlcnZhYmxlLCBvZiwgU3Vic2NyaXB0aW9uLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgc2tpcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQsIEVOVklST05NRU5UIH0gZnJvbSAnLi4vLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50LmNsYXNzJztcbmltcG9ydCB7IENvbmZpZ1NlcnZpY2UgfSBmcm9tICcuL2NvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7IENPUkVfQ09ORklHX09QVElPTlMgfSBmcm9tICcuL2NvbmZpZy9jb3JlLmNvbmZpZyc7XG5pbXBvcnQgeyBNb21lbnREYXRlQWRhcHRlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsLW1vbWVudC1hZGFwdGVyJztcbmltcG9ydCB7IERvd25sb2FkZXIsIERvd25sb2FkUmVxdWVzdCwgTm90aWZpY2F0aW9uVmlzaWJpbGl0eSB9IGZyb20gJ0Bpb25pYy1uYXRpdmUvZG93bmxvYWRlci9uZ3gnO1xuaW1wb3J0IHsgU3RhcnRhYmxlU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9zdGFydGFibGUtc2VydmljZS5jbGFzcyc7XG5pbXBvcnQgeyBpc01vYmlsZSwgaXNXaW5kb3dzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3BsYXRmb3Jtcyc7XG5pbXBvcnQgeyBWZXJzaW9uVXRpbHMgfSBmcm9tICcuLi8uLi9zaGFyZWQvdmVyc2lvbi92ZXJzaW9ucyc7XG5pbXBvcnQgeyBGaWxlc1V0aWxzLCBNaW1lVHlwZXMgfSBmcm9tICcuLi8uLi9zaGFyZWQvZmlsZS9maWxlLnV0aWxzJztcbmltcG9ydCB7IFVyaVV0aWxzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2ZpbGUvdXJpLnV0aWxzJztcbmltcG9ydCB7IFNwbGFzaFNjcmVlbiB9IGZyb20gJ0BjYXBhY2l0b3Ivc3BsYXNoLXNjcmVlbic7XG5pbXBvcnQgeyBTdGF0dXNCYXIgfSBmcm9tICdAY2FwYWNpdG9yL3N0YXR1cy1iYXInO1xuaW1wb3J0IHsgQnJvd3NlciwgT3Blbk9wdGlvbnMgfSBmcm9tICdAY2FwYWNpdG9yL2Jyb3dzZXInO1xuaW1wb3J0IHsgS2V5Ym9hcmQgfSBmcm9tICdAY2FwYWNpdG9yL2tleWJvYXJkJztcbmltcG9ydCB7IENhcGFjaXRvclBsdWdpbnMgfSBmcm9tICcuLi8uLi9zaGFyZWQvY2FwYWNpdG9yL3BsdWdpbnMnO1xuaW1wb3J0IHsgbG9jYWxlIGFzIG1vbWVudExvY2FsZSB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBJTG9nZ2VyLCBJTG9nZ2luZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvbG9nZ2luZy9sb2dnZXIubW9kZWwnO1xuaW1wb3J0IHsgQVBQX0xPR0dJTkdfU0VSVklDRSB9IGZyb20gJy4uLy4uL3NoYXJlZC9sb2dnaW5nL2xvZ2dpbmctc2VydmljZS5jbGFzcyc7XG5cbmV4cG9ydCBjb25zdCBBbmRyb2lkT3NFbnZpcm9ubWVudCA9IE9iamVjdC5mcmVlemUoe1xuICBESVJFQ1RPUllfRE9XTkxPQURTOiAnRG93bmxvYWQnLFxuICBESVJFQ1RPUllfRE9XTkxPQURTX09MRDogJ0Rvd25sb2FkcycsIC8vIE9sZCBuYW1lLCBmb3Igb2xkZXIgQW5kcm9pZCB2ZXJzaW9uXG4gIC8vIFRPRE86IGZpbmQgdmFsdWUgZm9yIHRoaXMuIFNlZSBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9vcy9FbnZpcm9ubWVudCNnZXRFeHRlcm5hbFN0b3JhZ2VTdGF0ZShqYXZhLmlvLkZpbGUpXG4gIC8vIERJUkVDVE9SWV9NVVNJQyxcbiAgLy8gRElSRUNUT1JZX1BPRENBU1RTLFxuICAvLyBESVJFQ1RPUllfUklOR1RPTkVTLFxuICAvLyBESVJFQ1RPUllfQUxBUk1TLFxuICAvLyBESVJFQ1RPUllfTk9USUZJQ0FUSU9OUyxcbiAgLy8gRElSRUNUT1JZX1BJQ1RVUkVTLFxuICAvLyBESVJFQ1RPUllfTU9WSUVTLFxuICAvLyBESVJFQ1RPUllfRENJTSxcbiAgLy8gRElSRUNUT1JZX0RPQ1VNRU5UUyxcbiAgLy8gRElSRUNUT1JZX0FVRElPQk9PS1MsXG59KTtcblxuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBQbGF0Zm9ybVNlcnZpY2UgZXh0ZW5kcyBTdGFydGFibGVTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBfbG9nZ2VyOiBJTG9nZ2VyO1xuICBwcml2YXRlIF9tb2JpbGU6IGJvb2xlYW47XG4gIHByaXZhdGUgX2NvcmRvdmE6IGJvb2xlYW47XG4gIHByaXZhdGUgX2NhcGFjaXRvcjogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfYW5kcm9pZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfaW9zOiBib29sZWFuO1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGlvbmljUGxhdGZvcm06IFBsYXRmb3JtLFxuICAgIHByaXZhdGUgY2RrUGxhdGZvcm06IENka1BsYXRmb3JtLFxuICAgIHByaXZhdGUgdG9hc3RDb250cm9sbGVyOiBUb2FzdENvbnRyb2xsZXIsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkYXRlQWRhcHRlcjogTW9tZW50RGF0ZUFkYXB0ZXIsXG4gICAgcHJpdmF0ZSBlbnRpdGllc1N0b3JhZ2U6IEVudGl0aWVzU3RvcmFnZSxcbiAgICBwcml2YXRlIHNldHRpbmdzOiBMb2NhbFNldHRpbmdzU2VydmljZSxcbiAgICBwcml2YXRlIG5ldHdvcmtTZXJ2aWNlOiBOZXR3b3JrU2VydmljZSxcbiAgICBwcml2YXRlIGFjY291bnRTZXJ2aWNlOiBBY2NvdW50U2VydmljZSxcbiAgICBwcml2YXRlIGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjYWNoZTogQ2FjaGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXVkaW9Qcm92aWRlcjogQXVkaW9Qcm92aWRlcixcbiAgICBASW5qZWN0KEVOVklST05NRU5UKSBwcm90ZWN0ZWQgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50LFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQVBQX0xPR0dJTkdfU0VSVklDRSkgcHJpdmF0ZSBsb2dnaW5nU2VydmljZTogSUxvZ2dpbmdTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZG93bmxvYWRlcjogRG93bmxvYWRlclxuICApIHtcbiAgICBzdXBlcihpb25pY1BsYXRmb3JtKTtcblxuICAgIHRoaXMuX2xvZ2dlciA9IGxvZ2dpbmdTZXJ2aWNlPy5nZXRMb2dnZXIoJ3BsYXRmb3JtJyk7XG4gICAgdGhpcy5fZGVidWcgPSAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoJ1twbGF0Zm9ybV0gQ3JlYXRpbmcgc2VydmljZScpO1xuXG4gICAgaWYgKHRoaXMuX2xvZ2dlcikge1xuICAgICAgdGhpcy5fbG9nZ2VyLmRlYnVnKCdjdG9yJywgJ0NyZWF0aW5nIHNlcnZpY2UnKTtcbiAgICAgIGlvbmljUGxhdGZvcm0ucGF1c2Uuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fbG9nZ2VyLmluZm8oJ2N0b3InLCAnUGF1c2UgYXBwJyk7XG4gICAgICB9KTtcbiAgICAgIGlvbmljUGxhdGZvcm0ucmVzdW1lLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdjdG9yJywgJ1Jlc3VtZSBhcHAnKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIF9kb3dubG9hZGluZ0pvYnM6IE1hcDxzdHJpbmcsIE9ic2VydmFibGU8c3RyaW5nPj4gPSBuZXcgTWFwKCk7XG5cbiAgcHJpdmF0ZSBjaGVja0FwcFZlcnNpb25UaW1lcjogU3Vic2NyaXB0aW9uO1xuXG4gIGlzKHBsYXRmb3JtTmFtZTogUGxhdGZvcm1zKTogYm9vbGVhbiB7XG4gICAgc3dpdGNoIChwbGF0Zm9ybU5hbWUpIHtcbiAgICAgIGNhc2UgJ21vYmlsZSc6XG4gICAgICAgIC8vIEV4Y2x1ZGUgV2luZG93cyB0b3VjaCBzY3JlZW5zIC0gc2VlIHN1bWFyaXMtYXBwIGlzc3VlcyAjMzIzIGFuZCAjMzQ2XG4gICAgICAgIHJldHVybiBpc01vYmlsZSh3aW5kb3cpO1xuICAgICAgY2FzZSAnbW9iaWxld2ViJzpcbiAgICAgICAgLy8gRXhjbHVkZSBXaW5kb3dzIHRvdWNoIHNjcmVlbnMgLSBzZWUgc3VtYXJpcy1hcHAgaXNzdWVzICMzMjMgYW5kICMzNDZcbiAgICAgICAgcmV0dXJuIHRoaXMuaW9uaWNQbGF0Zm9ybS5pcyhwbGF0Zm9ybU5hbWUpICYmICFpc1dpbmRvd3Mod2luZG93KTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLmlvbmljUGxhdGZvcm0uaXMocGxhdGZvcm1OYW1lKTtcbiAgICB9XG4gIH1cblxuICBnZXQgbW9iaWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc05vdE5pbCh0aGlzLl9tb2JpbGUpID8gdGhpcy5fbW9iaWxlIDogdGhpcy5pcygnbW9iaWxlJyk7XG4gIH1cblxuICAvKipcbiAgICogU2F5IGlmIG9wZW5lZCBoYXMgYmVlbiBvcGVuZWQgaW5zaWRlIGFuIEFuZHJvaWQgb3IgaU9zIEFwcC5cbiAgICogVGhpcyBpcyB1c2VkIHRvIGtub3duIGlmIHRoZXJlIGlzIGNvcmRvdmEgZmVhdHVyZXNcbiAgICovXG4gIGlzQ2FwYWNpdG9yKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9jYXBhY2l0b3I7XG4gIH1cblxuICAvKipcbiAgICogU2F5IGlmIG9wZW5lZCBoYXMgYmVlbiBvcGVuZWQgaW5zaWRlIGFuIEFuZHJvaWQgb3IgaU9zIEFwcC5cbiAgICogVGhpcyBpcyB1c2VkIHRvIGtub3duIGlmIHRoZXJlIGlzIGNvcmRvdmEgZmVhdHVyZXNcbiAgICovXG4gIGlzQ29yZG92YSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY29yZG92YTtcbiAgfVxuXG4gIGlzQW5kcm9pZENvcmRvdmEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLl9hbmRyb2lkICYmIHRoaXMuX2NvcmRvdmEpIHx8IGZhbHNlO1xuICB9XG5cbiAgaXNJT1NDb3Jkb3ZhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5faW9zICYmIHRoaXMuX2NvcmRvdmEpIHx8IGZhbHNlO1xuICB9XG5cbiAgaXNJT1MoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lvcyB8fCBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJcyBhIG5hdGl2ZSBBcHAgKGFuZCBOT1QgYSBtb2JpbGUgd2ViKVxuICAgKi9cbiAgaXNBcHAoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNBbmRyb2lkQ29yZG92YSgpIHx8IHRoaXMuaXNJT1NDb3Jkb3ZhKCk7XG4gIH1cblxuICBpc1dlYigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuaXNBcHAoKTtcbiAgfVxuXG4gIGlzTW9iaWxlV2ViKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vYmlsZSAmJiB0aGlzLmlzV2ViKCk7XG4gIH1cblxuICBnZXQgY2FuRG93bmxvYWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZG93bmxvYWRlciAmJiB0aGlzLmlzQW5kcm9pZENvcmRvdmEoKTtcbiAgfVxuXG4gIGdldCBjYW5PcGVuRmlsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7IC8vIFRPRE86IGZpeG1lIHVzaW5nIEBjYXBhY2l0b3IvZmlsZXN5c3RlbSA/XG4gIH1cblxuICB3aWR0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmlvbmljUGxhdGZvcm0ud2lkdGgoKTtcbiAgfVxuXG4gIGhlaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmlvbmljUGxhdGZvcm0uaGVpZ2h0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgbmdPblN0YXJ0KCk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLmFjY291bnRTZXJ2aWNlLnRva2VuVHlwZSA9IHVuZGVmaW5lZDtcbiAgICBjb25zb2xlLmluZm8oJ1twbGF0Zm9ybV0gU3RhcnRpbmcgcGxhdGZvcm0uLi4nKTtcbiAgICB0aGlzLl9sb2dnZXI/LmluZm8oJ25nT25TdGFydCcsICdTdGFydGluZyBwbGF0Zm9ybS4uLicpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX21vYmlsZSA9IHRoaXMuaXMoJ21vYmlsZScpO1xuICAgICAgdGhpcy5fY29yZG92YSA9IHRoaXMuaXMoJ2NvcmRvdmEnKTtcbiAgICAgIHRoaXMuX2NhcGFjaXRvciA9IHRoaXMuaXMoJ2NhcGFjaXRvcicpO1xuICAgICAgdGhpcy5fYW5kcm9pZCA9IHRoaXMuaXMoJ2FuZHJvaWQnKTtcbiAgICAgIHRoaXMuX2lvcyA9IHRoaXMuaXMoJ2lvcycpO1xuXG4gICAgICBjb25zdCBsb2dNZXNzYWdlID0gYERldGVjdGVkIHttb2JpbGU6ICR7dGhpcy5fbW9iaWxlfSwgY29yZG92YTogJHt0aGlzLl9jb3Jkb3ZhfSwgY2FwYWNpdG9yOiAke3RoaXMuX2NhcGFjaXRvcn0sIGFuZHJvaWQ6ICR7dGhpcy5fYW5kcm9pZH0sIGlvczogJHt0aGlzLl9pb3N9fWA7XG4gICAgICBjb25zb2xlLmluZm8oJ1twbGF0Zm9ybV0gJyArIGxvZ01lc3NhZ2UpO1xuICAgICAgdGhpcy5fbG9nZ2VyPy5pbmZvKCduZ09uU3RhcnQnLCBsb2dNZXNzYWdlKTtcblxuICAgICAgLy8gQ29uZmlndXJlIENTUyBjbGFzc1xuICAgICAgdGhpcy5jb25maWd1cmVHbG9iYWxDc3NDbGFzcyh0aGlzLl9tb2JpbGUpO1xuXG4gICAgICAvLyBDb25maWd1cmUgQ2FwYWNpdG9yIHBsdWdpbnNcbiAgICAgIGF3YWl0IHRoaXMuY29uZmlndXJlQ2FwYWNpdG9yUGx1Z2lucygpO1xuXG4gICAgICAvLyBDb25maWd1cmUgdHJhbnNsYXRpb25cbiAgICAgIHRoaXMuY29uZmlndXJlVHJhbnNsYXRlKCk7XG5cbiAgICAgIC8vIENvbmZpZ3VyZSBjYWNoZVxuICAgICAgdGhpcy5jb25maWd1cmVDYWNoZSgpO1xuXG4gICAgICAvLyBTdGFydCByb290IHNlcnZpY2VzXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChbdGhpcy5lbnRpdGllc1N0b3JhZ2UucmVhZHkoKSwgdGhpcy5zZXR0aW5ncy5yZWFkeSgpLCB0aGlzLm5ldHdvcmtTZXJ2aWNlLnJlYWR5KCksIHRoaXMuYXVkaW9Qcm92aWRlci5yZWFkeSgpXSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIHdlYiBhcHAgaGFzIHVwZGF0ZSwgYW5kIHJlbG9hZCBwYWdlIGlmIG5lZWRcbiAgICAgIGlmICh0aGlzLmlzV2ViKCkgJiYgdGhpcy5lbnZpcm9ubWVudC5wcm9kdWN0aW9uKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tBcHBWZXJzaW9uKHsgY2FuUmVsb2FkOiB0cnVlIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgY2FjaGUgY29uZmlndXJhdGlvbiB3aGVuIG5ldHdvcmsgY2hhbmdlZFxuICAgICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgICAgdGhpcy5uZXR3b3JrU2VydmljZS5vbk5ldHdvcmtTdGF0dXNDaGFuZ2VzXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICBza2lwKDEpIC8vIEFscmVhZHkgZG9uZSBvbmNlLCBzbyB3ZSBza2lwIHRoZSBmaXJzdCBldmVudFxuICAgICAgICAgIClcbiAgICAgICAgICAuc3Vic2NyaWJlKCh0eXBlKSA9PiB0aGlzLmNvbmZpZ3VyZUNhY2hlKHR5cGUgIT09ICdub25lJykpXG4gICAgICApO1xuXG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGBbcGxhdGZvcm1dIFN0YXJ0aW5nIHBsYXRmb3JtIFtPS10ge21vYmlsZTogJHt0aGlzLl9tb2JpbGV9LCBjYXBhY2l0b3I6ICR7dGhpcy5fY2FwYWNpdG9yfSwgd2ViOiAke3RoaXMuaXNXZWIoKX0sIGRvd25sb2FkZXI6ICR7dGhpcy5jYW5Eb3dubG9hZH19IGluICR7RGF0ZS5ub3coKSAtIG5vd31tc2BcbiAgICAgICk7XG5cbiAgICAgIC8vIFBhc3MgYXV0aCB0b2tlblxuICAgICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZy5zdWJzY3JpYmUoKGNvbmZpZykgPT4ge1xuICAgICAgICAgIGlmICghY29uZmlnKSByZXR1cm47IC8vIFNraXBcblxuICAgICAgICAgIC8vIFVwZGF0ZSBhdXRoZW50aWNhdGlvbiB0eXBlXG4gICAgICAgICAgY29uc3QgdG9rZW5UeXBlOiBBdXRoVG9rZW5UeXBlID0gY29uZmlnLmdldFByb3BlcnR5KENPUkVfQ09ORklHX09QVElPTlMuQVVUSF9UT0tFTl9UWVBFKSBhcyBBdXRoVG9rZW5UeXBlO1xuICAgICAgICAgIGlmIChpc05vdE5pbE9yQmxhbmsodG9rZW5UeXBlKSAmJiB0aGlzLmFjY291bnRTZXJ2aWNlLnRva2VuVHlwZSAhPT0gdG9rZW5UeXBlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmluZm8oYFtwbGF0Zm9ybV0gVXNpbmcgYXV0aCB0b2tlbiB0eXBlIHske3Rva2VuVHlwZX19YCk7XG4gICAgICAgICAgICB0aGlzLmFjY291bnRTZXJ2aWNlLnRva2VuVHlwZSA9IHRva2VuVHlwZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBFbmFibGUgYXV0aCBBUEkgdXNpbmcgdG9rZW5zXG4gICAgICAgICAgY29uc3QgYXV0aEFwaUVuYWJsZWQgPSBjb25maWcuZ2V0UHJvcGVydHlBc0Jvb2xlYW4oQ09SRV9DT05GSUdfT1BUSU9OUy5BVVRIX0FQSV9UT0tFTl9FTkFCTEVEKTtcbiAgICAgICAgICBpZiAoaXNOb3ROaWwoYXV0aEFwaUVuYWJsZWQpICYmIGF1dGhBcGlFbmFibGVkICE9PSB0aGlzLmFjY291bnRTZXJ2aWNlLmFwaVRva2VuRW5hYmxlZCkge1xuICAgICAgICAgICAgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIFVzaW5nIGF1dGggQVBJIHRva2VucyA/ICR7YXV0aEFwaUVuYWJsZWR9fWApO1xuICAgICAgICAgICAgdGhpcy5hY2NvdW50U2VydmljZS5hcGlUb2tlbkVuYWJsZWQgPSBhdXRoQXBpRW5hYmxlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICBpZiAodGhpcy5fbW9iaWxlKSB7XG4gICAgICAgIC8vIEhpZGUgdGhlIHNwbGFzaHNjcmVlbiAoaWYgbW9iaWxlKSAtIGFmdGVyIDFzIC0gYW5kIHBsYXkgc3RhcnQgc291bmRcbiAgICAgICAgc2V0VGltZW91dChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgU3BsYXNoU2NyZWVuLmhpZGUoKTtcblxuICAgICAgICAgIC8vIFBsYXkgc3RhcnR1cCBzb3VuZFxuICAgICAgICAgIHRoaXMuYXVkaW9Qcm92aWRlci5wbGF5U3RhcnR1cFNvdW5kKCk7XG4gICAgICAgIH0sIDEwMDApO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBuZXcgdmVyc2lvbiwgZXZlcnkgMSBtaW5cbiAgICAgIGNvbnN0IGNoZWNrSW50ZXJ2YWxNcyA9ICh0aGlzLmVudmlyb25tZW50LmNoZWNrQXBwVmVyc2lvbkludGVydmFsSW5TZWNvbmRzIHx8IDApICogMTAwMDtcbiAgICAgIGlmICh0aGlzLmlzV2ViKCkgJiYgdGhpcy5lbnZpcm9ubWVudC5wcm9kdWN0aW9uICYmIGNoZWNrSW50ZXJ2YWxNcyA+IDApIHtcbiAgICAgICAgdGhpcy5jaGVja0FwcFZlcnNpb25UaW1lcj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gdGltZXIoY2hlY2tJbnRlcnZhbE1zLCBjaGVja0ludGVydmFsTXMpLnN1YnNjcmliZSgoXykgPT5cbiAgICAgICAgICB0aGlzLmNoZWNrQXBwVmVyc2lvbih7IHNpbGVudDogdHJ1ZSwgY2FuUmVsb2FkOiBmYWxzZSAvKmRvIE5PVCBhdXRvIHJlbG9hZCwgd2hlbiBhcHAgaXMgc3RhcnRlZCovIH0pXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuY2hlY2tBcHBWZXJzaW9uVGltZXIgPSBzdWJzY3JpcHRpb247XG4gICAgICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgc3Vic2NyaXB0aW9uLmFkZCgoKSA9PiB0aGlzLnVucmVnaXN0ZXJTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBNYW5hZ2Ugc3RhcnR1cCBlcnJvclxuICAgICAgcmV0dXJuIHRoaXMub25TdGFydHVwRXJyb3IoZXJyKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBvcGVuKHVybDogc3RyaW5nLCBvcHRzPzogT3Blbk9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zb2xlLmluZm8oYFtwbGF0Zm9ybV0gT3BlbmluZyBsaW5rOiAke3VybH1gKTtcbiAgICBpZiAodGhpcy5fbW9iaWxlICYmIHRoaXMuX2NhcGFjaXRvcikge1xuICAgICAgYXdhaXQgQnJvd3Nlci5vcGVuKHsgdXJsLCAuLi5vcHRzIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW5kb3cub3Blbih1cmwsIG9wdHM/LndpbmRvd05hbWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldERvd25sb2FkaW5nSm9iKHVyaTogc3RyaW5nKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fZG93bmxvYWRpbmdKb2JzLmdldCh1cmkpO1xuICB9XG5cbiAgZG93bmxvYWQocmVxdWVzdDogeyB1cmk6IHN0cmluZzsgZmlsZW5hbWU/OiBzdHJpbmcgfSAmIFBhcnRpYWw8RG93bmxvYWRSZXF1ZXN0Pik6IE9ic2VydmFibGU8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCFyZXF1ZXN0IHx8ICFyZXF1ZXN0LnVyaSkgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBhcmd1bWVudCAncmVxdWVzdCcgb3IgJ3JlcXVlc3QudXJpJ1wiKTtcblxuICAgIGlmICh0aGlzLmNhbkRvd25sb2FkKSB7XG4gICAgICAvLyBDaGVjayBpZiBub3QgYWxyZWFkeSBkb3dubG9hZGluZyBmaWxlXG4gICAgICBsZXQgam9iJCA9IHRoaXMuX2Rvd25sb2FkaW5nSm9icy5nZXQocmVxdWVzdC51cmkpO1xuICAgICAgaWYgKGpvYiQpIHJldHVybiBqb2IkO1xuXG4gICAgICAvLyBDb21wdXRlIHN1YlBhdGggKGZpbmFsIGZpbGVuYW1lKVxuICAgICAgbGV0IHN1YlBhdGggPVxuICAgICAgICByZXF1ZXN0LmRlc3RpbmF0aW9uSW5FeHRlcm5hbFB1YmxpY0Rpcj8uc3ViUGF0aCB8fFxuICAgICAgICByZXF1ZXN0LmRlc3RpbmF0aW9uSW5FeHRlcm5hbEZpbGVzRGlyPy5zdWJQYXRoIHx8XG4gICAgICAgIHJlcXVlc3QuZmlsZW5hbWUgfHxcbiAgICAgICAgVXJpVXRpbHMuZ2V0RmlsZW5hbWUocmVxdWVzdC51cmkpIHx8XG4gICAgICAgIHJlcXVlc3QudGl0bGUgfHxcbiAgICAgICAgJ2Rvd25sb2FkJztcblxuICAgICAgc3ViUGF0aCA9IHN1YlBhdGhcbiAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgLy8gUmVtb3ZlIHNwYWNlc1xuICAgICAgICAucmVwbGFjZSgvXFxzKy9nLCAnLScpO1xuXG4gICAgICAvLyBGb3JjZSBBUEsgdG8gZmluaXNoIHdpdGggJy5hcGsnXG4gICAgICBpZiAocmVxdWVzdC5taW1lVHlwZSA9PT0gTWltZVR5cGVzLkFORFJPSURfQVBLICYmICFzdWJQYXRoLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoJy5hcGsnKSkge1xuICAgICAgICBzdWJQYXRoICs9ICcuYXBrJztcbiAgICAgIH1cblxuICAgICAgY29uc3QgZG93bmxvYWRSZXF1ZXN0ID0gPERvd25sb2FkUmVxdWVzdD57XG4gICAgICAgIHZpc2libGVJbkRvd25sb2Fkc1VpOiB0cnVlLFxuICAgICAgICBub3RpZmljYXRpb25WaXNpYmlsaXR5OiBOb3RpZmljYXRpb25WaXNpYmlsaXR5LlZpc2libGVOb3RpZnlDb21wbGV0ZWQsXG4gICAgICAgIC4uLnJlcXVlc3QsXG4gICAgICAgIGZpbGVuYW1lOiB1bmRlZmluZWQsIC8vIEZvcmNlIHVuc2V0XG4gICAgICAgIGRlc3RpbmF0aW9uSW5FeHRlcm5hbFB1YmxpY0RpcjogIXJlcXVlc3QuZGVzdGluYXRpb25JbkV4dGVybmFsRmlsZXNEaXJcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgZGlyVHlwZTogQW5kcm9pZE9zRW52aXJvbm1lbnQuRElSRUNUT1JZX0RPV05MT0FEUyxcbiAgICAgICAgICAgICAgLi4ucmVxdWVzdC5kZXN0aW5hdGlvbkluRXh0ZXJuYWxQdWJsaWNEaXIsXG4gICAgICAgICAgICAgIHN1YlBhdGgsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIGRlc3RpbmF0aW9uSW5FeHRlcm5hbEZpbGVzRGlyOiByZXF1ZXN0LmRlc3RpbmF0aW9uSW5FeHRlcm5hbEZpbGVzRGlyXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGRpclR5cGU6IEFuZHJvaWRPc0Vudmlyb25tZW50LkRJUkVDVE9SWV9ET1dOTE9BRFMsXG4gICAgICAgICAgICAgIC4uLnJlcXVlc3QuZGVzdGluYXRpb25JbkV4dGVybmFsRmlsZXNEaXIsXG4gICAgICAgICAgICAgIHN1YlBhdGgsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICB9O1xuXG4gICAgICAvLyBTdGFydCBkb3dubG9hZFxuICAgICAgY29uc29sZS5kZWJ1ZygnW3BsYXRmb3JtXSBEb3dubG9hZGluZywgdXNpbmcgcmVxdWVzdDogJyArIEpTT04uc3RyaW5naWZ5KGRvd25sb2FkUmVxdWVzdCkpO1xuICAgICAgam9iJCA9IGZyb20odGhpcy5kb3dubG9hZGVyLmRvd25sb2FkKGRvd25sb2FkUmVxdWVzdCkpO1xuXG4gICAgICAvLyBSZW1lbWJlciB0aGlzIHJlcXVlc3QgdXJpXG4gICAgICB0aGlzLl9kb3dubG9hZGluZ0pvYnMuc2V0KGRvd25sb2FkUmVxdWVzdC51cmksIGpvYiQpO1xuICAgICAgcmV0dXJuIGpvYiQucGlwZShcbiAgICAgICAgdGFwKChsb2NhdGlvbikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbygnW3BsYXRmb3JtXSBGaWxlIHN1Y2Nlc3NmdWxseSBkb3dubG9hZGVkIGF0OicgKyBsb2NhdGlvbik7XG4gICAgICAgICAgLy8gRm9yZ2V0IGpvYlxuICAgICAgICAgIHRoaXMuX2Rvd25sb2FkaW5nSm9icy5kZWxldGUoZG93bmxvYWRSZXF1ZXN0LnVyaSk7XG4gICAgICAgICAgcmV0dXJuIGxvY2F0aW9uO1xuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignW3BsYXRmb3JtXSBVbmFibGUgdG8gZG93bmxvYWQ6ICcgKyAoKGVyciAmJiBlcnIubWVzc2FnZSkgfHwgZXJyKSk7XG4gICAgICAgICAgLy8gRm9yZ2V0IHRoZSByZXF1ZXN0XG4gICAgICAgICAgdGhpcy5fZG93bmxvYWRpbmdKb2JzLmRlbGV0ZShkb3dubG9hZFJlcXVlc3QudXJpKTtcblxuICAgICAgICAgIC8vIFJldHJ5IHdpdGggYW5vdGhlciBsb2NhdGlvbiAtIGlzc3VlIGluIG9sZGVyIEFuZHJvaWQgdmVyc2lvblxuICAgICAgICAgIGlmIChkb3dubG9hZFJlcXVlc3QuZGVzdGluYXRpb25JbkV4dGVybmFsUHVibGljRGlyPy5kaXJUeXBlID09PSBBbmRyb2lkT3NFbnZpcm9ubWVudC5ESVJFQ1RPUllfRE9XTkxPQURTKSB7XG4gICAgICAgICAgICBkb3dubG9hZFJlcXVlc3QuZGVzdGluYXRpb25JbkV4dGVybmFsUHVibGljRGlyLmRpclR5cGUgPSBBbmRyb2lkT3NFbnZpcm9ubWVudC5ESVJFQ1RPUllfRE9XTkxPQURTX09MRDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRvd25sb2FkKGRvd25sb2FkUmVxdWVzdCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgKGlmIG5vdCBBbmRyb2lkIGFuZCBDYXBhY2l0b3IpOiBvcGVuaW5nIHRoZSBVUklcbiAgICAvLyBUT0RPOiBmaW5kIGEgd2F5IHRvIGRvd25sb2FkIHVuZGVyIGlPUyAoc2VlIGh0dHBzOi8vd3d3LmMtc2hhcnBjb3JuZXIuY29tL2FydGljbGUvaG93LXRvLWRvd25sb2FkLWEtZmlsZS11c2luZy1maWxlLXRyYW5zZmVyLXBsdWdpbi1pbi1pb25pYy0zLylcbiAgICBlbHNlIHtcbiAgICAgIEZpbGVzVXRpbHMuZG93bmxvYWRVcmkocmVxdWVzdC51cmksIHJlcXVlc3QuZmlsZW5hbWUpO1xuICAgICAgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIG1ldGhvZHMgLS0gKi9cblxuICBwcm90ZWN0ZWQgY29uZmlndXJlR2xvYmFsQ3NzQ2xhc3MobW9iaWxlOiBib29sZWFuLCB3aW46IGFueSA9IHdpbmRvdykge1xuICAgIGlmIChtb2JpbGUpIHJldHVybjsgLy8gTm90aGluZyB0byBkb1xuXG4gICAgLy8gV29ya2Fyb3VuZCwgZm9yIE1TIFdpbmRvd3MgdG91Y2ggc2NyZWVuIChkZXRlY3RlZCBhcyBtb2JpbGUsIGJ1dCBmb3JjZWQgYXMgZGVza3RvcClcbiAgICBpZiAoXG4gICAgICAhbW9iaWxlICYmXG4gICAgICAod2luLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudD8uY2xhc3NMaXN0LmNvbnRhaW5zKCdwbHQtbW9iaWxlJykgfHwgd2luLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3Q/LmNvbnRhaW5zKCdwbHQtbW9iaWxld2ViJykpXG4gICAgKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ1twbGF0Zm9ybV0gRm9yY2UgY2xhc3MgbGlzdCB0bzogPGh0bWwgY2xhc3M9XCJwbHQtZGVza3RvcFwiPi4gV29ya2Fyb3VuZCBmb3IgV2luZG93cyB0b3VjaCBzY3JlZW4uJyk7XG4gICAgICB3aW4uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3BsdC1tb2JpbGUnLCAncGx0LW1vYmlsZXdlYicpO1xuICAgICAgd2luLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKCdwbHQtZGVza3RvcCcpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBjb25maWd1cmVDYXBhY2l0b3JQbHVnaW5zKCkge1xuICAgIGlmICghdGhpcy5fY2FwYWNpdG9yKSByZXR1cm47IC8vIFNraXBcblxuICAgIGNvbnNvbGUuaW5mbygnW3BsYXRmb3JtXSBDb25maWd1cmluZyBDYXBhY2l0b3IgcGx1Z2lucy4uLicpO1xuXG4gICAgbGV0IHBsdWdpbjogc3RyaW5nO1xuICAgIHRyeSB7XG4gICAgICBwbHVnaW4gPSBDYXBhY2l0b3JQbHVnaW5zLlN0YXR1c0JhcjtcbiAgICAgIGlmICh0aGlzLmlzQXBwKCkpIHtcbiAgICAgICAgYXdhaXQgU3RhdHVzQmFyLnNldE92ZXJsYXlzV2ViVmlldyh7IG92ZXJsYXk6IGZhbHNlIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBIaWRlIGFjY2Vzc29yeSBiYXIgKGlPUyBvbmx5KVxuICAgICAgaWYgKHRoaXMuaXNJT1MoKSkge1xuICAgICAgICBwbHVnaW4gPSBDYXBhY2l0b3JQbHVnaW5zLktleWJvYXJkO1xuICAgICAgICBhd2FpdCBLZXlib2FyZC5zZXRBY2Nlc3NvcnlCYXJWaXNpYmxlKHsgaXNWaXNpYmxlOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IGxvZ01lc3NhZ2UgPSBgRXJyb3Igd2hpbGUgY29uZmlndXJpbmcgJHtwbHVnaW59IHBsdWdpbjogJHtlcnIubWVzc2FnZSB8fCBlcnJ9XFxuJHtlcnI/Lm9yaWdpbmFsU3RhY2sgfHwgSlNPTi5zdHJpbmdpZnkoZXJyKX1gO1xuICAgICAgY29uc29sZS5lcnJvcignW3BsYXRmb3JtXSAnICsgbG9nTWVzc2FnZSk7XG4gICAgICB0aGlzLl9sb2dnZXI/LmVycm9yKCdjb25maWd1cmVDYXBhY2l0b3JQbHVnaW5zJywgbG9nTWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGNvbmZpZ3VyZVRyYW5zbGF0ZSgpIHtcbiAgICBjb25zb2xlLmluZm8oJ1twbGF0Zm9ybV0gQ29uZmlndXJpbmcgaTE4biAuLi4nKTtcblxuICAgIC8vIHRoaXMgbGFuZ3VhZ2Ugd2lsbCBiZSB1c2VkIGFzIGEgZmFsbGJhY2sgd2hlbiBhIHRyYW5zbGF0aW9uIGlzbid0IGZvdW5kIGluIHRoZSBjdXJyZW50IGxhbmd1YWdlXG4gICAgdGhpcy50cmFuc2xhdGUuc2V0RGVmYXVsdExhbmcodGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0TG9jYWxlKTtcbiAgICAvLyBhcHBseSBsb2NhbGUgaW1tZWRpYXRlbHlcbiAgICB0aGlzLmFwcGx5TG9jYWxlKHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdExvY2FsZSk7XG5cbiAgICAvLyBXaGVuIGxvY2FsZSBjaGFuZ2VzLCBhcHBseSB0byBkYXRlIGFkYXB0ZXJcbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgdGhpcy50cmFuc2xhdGUub25MYW5nQ2hhbmdlLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50LmxhbmcpIHtcbiAgICAgICAgICB0aGlzLmFwcGx5TG9jYWxlKGV2ZW50LmxhbmcpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgdGhpcy5zZXR0aW5ncy5vbkNoYW5nZS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICBpZiAoZGF0YS5sb2NhbGUpIHtcbiAgICAgICAgICAgIGlmIChkYXRhLmxvY2FsZSAhPT0gdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmcpIHtcbiAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGUudXNlKGRhdGEubG9jYWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQXBwbHlpbmcgZGVmYXVsdCwgd2hlbiBzZXR0aW5ncyBoYXMgbm8gbG9jYWxlIHByb3BlcnR5IChob3RmaXggLSBsdWRvdmljLnBlY3F1b3RAZS1pcy5wcm8gLSAxNC8xMS8yMDIxIC0gc2luY2UgdjEuMjAuNDIpXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1twbGF0Zm9ybV0gTm8gbG9jYWxlIGZvdW5kIGluIHNldHRpbmdzOiBhcHBseWluZyBkZWZhdWx0TG9jYWxlOiAnLCB0aGlzLmVudmlyb25tZW50LmRlZmF1bHRMb2NhbGUpO1xuICAgICAgICAgICAgdGhpcy50cmFuc2xhdGUudXNlKHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdExvY2FsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBVc2UgYWNjb3VudCdzIHNldHRpbmdzLCAobGlrZSBsb2NhbGUpLCB3aGVuIGFjY291bnQgaW5oZXJpdGFuY2UgZW5hYmxlZFxuICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICB0aGlzLmFjY291bnRTZXJ2aWNlLm9uTG9naW4uc3Vic2NyaWJlKChhY2NvdW50KSA9PiB7XG4gICAgICAgIGlmIChhY2NvdW50LnNldHRpbmdzICYmIHRoaXMuc2V0dGluZ3Muc2V0dGluZ3MuYWNjb3VudEluaGVyaXRhbmNlKSB7XG4gICAgICAgICAgY29uc3QgYWNjb3VudFNldHRpbmdzID0gYWNjb3VudC5zZXR0aW5ncy5hc0xvY2FsU2V0dGluZ3MoKTtcbiAgICAgICAgICB0aGlzLnNldHRpbmdzLmFwcGx5KGFjY291bnRTZXR0aW5ncyk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhcHBseUxvY2FsZShsb2NhbGU6IHN0cmluZykge1xuICAgIC8vIGZvcmNlICdlbicgYXMgJ2VuX0dCJ1xuICAgIGlmIChsb2NhbGUgPT09ICdlbicpIHtcbiAgICAgIGxvY2FsZSA9ICdlbl9HQic7XG4gICAgfVxuXG4gICAgLy8gY29uZmlnIG1vbWVudCBsaWJcbiAgICB0cnkge1xuICAgICAgbW9tZW50TG9jYWxlKGxvY2FsZSk7XG4gICAgICBjb25zb2xlLmRlYnVnKCdbcGxhdGZvcm1dIFVzZSBsb2NhbGUgeycgKyBsb2NhbGUgKyAnfScpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gSWYgZXJyb3IsIGZhbGxiYWNrIHRvIGVuXG4gICAgICBtb21lbnRMb2NhbGUoJ2VuJyk7XG4gICAgICBjb25zb2xlLndhcm4oJ1twbGF0Zm9ybV0gVW5rbm93biBsb2NhbGUgZm9yIG1vbWVudCBsaWIuIFVzaW5nIGRlZmF1bHQgW2VuXScpO1xuICAgIH1cblxuICAgIC8vIENvbmZpZyBkYXRlIGFkYXB0ZXJcbiAgICB0aGlzLmRhdGVBZGFwdGVyLnNldExvY2FsZShtb21lbnRMb2NhbGUoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29uZmlndXJlQ2FjaGUob25saW5lPzogYm9vbGVhbikge1xuICAgIG9ubGluZSA9IHRvQm9vbGVhbihvbmxpbmUsIHRoaXMuY2FjaGUuaXNPbmxpbmUoKSk7XG4gICAgY29uc3QgY2FjaGVUVEwgPSBvbmxpbmUgPyAzNjAwIC8qIDFoICovIDogMzYwMCAqIDI0ICogMzA7IC8qIDEgbW9udGggKi9cbiAgICBjb25zb2xlLmluZm8oYFtwbGF0Zm9ybV0gQ29uZmlndXJpbmcgY2FjaGUgW09LXSB7b25saW5lOiAke29ubGluZX0sIHRpbWVUb0xpdmU6ICR7Y2FjaGVUVEwgLyAzNjAwfWgsIG9mZmxpbmVJbnZhbGlkYXRlOiBmYWxzZX1gKTtcbiAgICB0aGlzLmNhY2hlLnNldERlZmF1bHRUVEwoY2FjaGVUVEwpO1xuICAgIHRoaXMuY2FjaGUuc2V0T2ZmbGluZUludmFsaWRhdGUoZmFsc2UpOyAvLyBEbyBub3QgaW52YWxpZGF0ZSBjYWNoZSB3aGVuIG9mZmxpbmVcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBjaGVja0FwcFZlcnNpb24ob3B0cz86IHsgY2FuUmVsb2FkPzogYm9vbGVhbjsgc2lsZW50PzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKHRoaXMubmV0d29ya1NlcnZpY2Uub2ZmbGluZSB8fCAhdGhpcy5pc1dlYigpKSByZXR1cm47IC8vIFNraXBcblxuICAgIGNvbnN0IHNpbGVudCA9IG9wdHM/LnNpbGVudCA9PT0gdHJ1ZTtcbiAgICBjb25zdCBwcm9kdWN0aW9uID0gdGhpcy5lbnZpcm9ubWVudC5wcm9kdWN0aW9uO1xuICAgIGNvbnN0IGNhbkF1dG9SZWxvYWQgPSAhb3B0cyB8fCBvcHRzLmNhblJlbG9hZCAhPT0gZmFsc2U7XG5cbiAgICBpZiAoIXNpbGVudCkgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dIENoZWNraW5nIHJlbW90ZSBhcHAgdmVyc2lvbi4uLicpO1xuXG4gICAgY29uc3QgYWN0dWFsVmVyc2lvbiA9IHRoaXMuZW52aXJvbm1lbnQudmVyc2lvbjtcbiAgICBpZiAoaXNOaWxPckJsYW5rKGFjdHVhbFZlcnNpb24pKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiW3BsYXRmb3JtXSBNaXNzaW5nIHJlcXVpcmVkIHZhbHVlIGZvciAnZW52aXJvbm1lbnQudmVyc2lvbicuIENhbm5vdCBjaGVjayByZW1vdGUgYXBwIHZlcnNpb24uXCIpO1xuICAgICAgdGhpcy5jaGVja0FwcFZlcnNpb25UaW1lcj8udW5zdWJzY3JpYmUoKTsgLy8gU3RvcCB0aW1lciBpZiBleGlzdHNcbiAgICAgIHJldHVybjsgLy8gU2tpcFxuICAgIH1cblxuICAgIGNvbnN0IHJlbW90ZVZlcnNpb24gPSBhd2FpdCB0aGlzLm5ldHdvcmtTZXJ2aWNlLmdldEFwcFZlcnNpb24oKTtcbiAgICBpZiAoaXNOaWxPckJsYW5rKHJlbW90ZVZlcnNpb24pKSB7XG4gICAgICBpZiAocHJvZHVjdGlvbiAmJiAhc2lsZW50KSBjb25zb2xlLmVycm9yKCdbcGxhdGZvcm1dIENhbm5vdCBsb2FkIHJlbW90ZSBhcHAgdmVyc2lvbi4gU2tpcHBpbmcgdmVyc2lvbiBjaGVjaycpO1xuICAgICAgdGhpcy5jaGVja0FwcFZlcnNpb25UaW1lcj8udW5zdWJzY3JpYmUoKTsgLy8gU3RvcCB0aW1lciBpZiBleGlzdHNcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoVmVyc2lvblV0aWxzLmlzQ29tcGF0aWJsZShyZW1vdGVWZXJzaW9uLCBhY3R1YWxWZXJzaW9uKSkge1xuICAgICAgaWYgKCFzaWxlbnQpIGNvbnNvbGUuaW5mbyhgW3BsYXRmb3JtXSBDaGVja2luZyByZW1vdGUgYXBwIHZlcnNpb24gW09LXSB7cmVtb3RlOiAnJHtyZW1vdGVWZXJzaW9ufScsIGFjdHVhbDogJyR7YWN0dWFsVmVyc2lvbn0nfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElmIG5ld2VyIHZlcnNpb24gZXhpc3RzXG4gICAgbGV0IHJlbG9hZFBhdGggPSBsb2NhdGlvbi5ocmVmLnJlcGxhY2UoL1smXT92ZXJzaW9uPVswLTkuXSsvZ2ksICcnKTsgLy8gUmVtb3ZlIG9sZCB2ZXJzaW9uIGluIHF1ZXJ5IHBhcmFtc1xuICAgIHJlbG9hZFBhdGggKz0gcmVsb2FkUGF0aC5pbmRleE9mKCc/JykgPT09IC0xID8gJz8nIDogJyYnOyAvLyBBZGQgcXVlcnkgcGFyYW0gc2VwYXJhdG9yXG4gICAgcmVsb2FkUGF0aCArPSAndmVyc2lvbj0nICsgcmVtb3RlVmVyc2lvbjsgLy8gQWRkIHZlcnNpb24gKHRvIGF2b2lkIGEgcmVsb2FkIGluZmluaXRlIGxvb3ApXG5cbiAgICAvLyBBbHJlYWR5IHRyeSB0byByZWxvYWQsIGJ1dCB2ZXJzaW9uIHN0aWxsIGJhZFxuICAgIGlmIChyZWxvYWRQYXRoID09PSBsb2NhdGlvbi5ocmVmKSB7XG4gICAgICBpZiAoY2FuQXV0b1JlbG9hZClcbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICBgW3BsYXRmb3JtXSBSZWxvYWRlZCBwYWdlIGZhaWxlZCwgYmVjYXVzZSB2ZXJzaW9uIHN0aWxsIG1pc21hdGNoISBQbGVhc2UgY2hlY2sgdmVyc2lvbi5hcHB1cCBmaWxlIChleHBlY3RlZCBhcHAgdmVyc2lvbjogJHthY3R1YWxWZXJzaW9ufSlgXG4gICAgICAgICk7XG4gICAgICAvLyBTdG9wIHRpbWVyLCB0byBhdm9pZCBpbmZpbml0ZSBsb29wXG4gICAgICB0aGlzLmNoZWNrQXBwVmVyc2lvblRpbWVyPy51bnN1YnNjcmliZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnNvbGUud2FybihgW3BsYXRmb3JtXSBNb3JlIHJlY2VudCB2ZXJzaW9uIGRldGVjdGVkIChyZW1vdGU6ICR7cmVtb3RlVmVyc2lvbn0sIGFjdHVhbDogJHthY3R1YWxWZXJzaW9ufWApO1xuXG4gICAgLy8gQXV0byByZWxvYWRcbiAgICBpZiAoY2FuQXV0b1JlbG9hZCkge1xuICAgICAgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dIFdpbGwgcmVsb2FkaW5nIGF0ICcgKyByZWxvYWRQYXRoKTtcbiAgICAgIGxvY2F0aW9uLmhyZWYgPSByZWxvYWRQYXRoO1xuICAgICAgLy8gQXBwIHN0b3BcbiAgICB9XG4gICAgLy8gQXNrIHVzZXIgdG8gcmVsb2FkXG4gICAgZWxzZSB7XG4gICAgICAvLyBTdG9wIHRpbWVyLCB0byBhdm9pZCBpbmZpbml0ZSBsb29wXG4gICAgICB0aGlzLmNoZWNrQXBwVmVyc2lvblRpbWVyPy51bnN1YnNjcmliZSgpO1xuXG4gICAgICAvLyBEaXNwbGF5IGEgcmVsb2FkIHRvYXN0XG4gICAgICBhd2FpdCB0aGlzLnNob3dUb2FzdCh7XG4gICAgICAgIG1lc3NhZ2U6ICdDT05GSVJNLlJFTE9BRF9BUFAnLFxuICAgICAgICBtZXNzYWdlUGFyYW1zOiB7IHZlcnNpb246IHJlbW90ZVZlcnNpb24sIG5hbWU6IHRoaXMuZW52aXJvbm1lbnQubmFtZSB9LFxuICAgICAgICB0eXBlOiAnaW5mbycsXG4gICAgICAgIGR1cmF0aW9uOiAtMSxcbiAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLFxuICAgICAgICBidXR0b25zOiBbXG4gICAgICAgICAgLy8gUmVsb2FkIGJ1dHRvblxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRleHQ6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ0NPTU1PTi5CVE5fVVBEQVRFJyksXG4gICAgICAgICAgICBzaWRlOiAnZW5kJyxcbiAgICAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZiA9IHJlbG9hZFBhdGg7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHNob3dUb2FzdChvcHRzOiBTaG93VG9hc3RPcHRpb25zKTogUHJvbWlzZTxIVE1MSW9uVG9hc3RFbGVtZW50PiB7XG4gICAgaWYgKCF0aGlzLnRvYXN0Q29udHJvbGxlcikgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyB0b2FzdENvbnRyb2xsZXIgaW4gY29tcG9uZW50J3MgY29uc3RydWN0b3JcIik7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PlxuICAgICAgVG9hc3RzLnNob3codGhpcy50b2FzdENvbnRyb2xsZXIsIHRoaXMudHJhbnNsYXRlLCB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIG9uV2lsbFByZXNlbnQ6ICh0KSA9PiByZXNvbHZlKHQpLFxuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIG9uU3RhcnR1cEVycm9yKGVycikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1twbGF0Zm9ybV0gRmFpbGVkIHN0YXJ0aW5nIHRoZSBwbGF0Zm9ybSEgJyArIEpTT04uc3RyaW5naWZ5KGVycikpO1xuICAgIGxldCBtZXNzYWdlID0gKGVyciAmJiBlcnIubWVzc2FnZSkgfHwgZXJyO1xuICAgIGNvbnN0IGRldGFpbHNNZXNzYWdlID0gZXJyICYmICgoZXJyLmRldGFpbHMgJiYgZXJyLmRldGFpbHMubWVzc2FnZSkgfHwgZXJyLmRldGFpbHMpO1xuICAgIC8vIFNldCBzcGVjaWZpYyBlcnJvciB3aGVuIEZpcmVmb3ggaXMgaW4gcHJpdmF0ZSBtb2RlIG9yIGhpc3RvcnkgbmV2ZXIgcmVtZW1iZXJlZCAoc2VlIE1hbnRpcyBJZnJlbWVyICM1NjQ0MSlcbiAgICBpZiAoZXJyLmNvZGUgPT09IDExICYmIHRoaXMuY2RrUGxhdGZvcm0uRklSRUZPWCkge1xuICAgICAgbWVzc2FnZSA9ICdFUlJPUi5GSVJFRk9YX05PX1NUT1JBR0UnO1xuICAgIH1cbiAgICBpZiAodGhpcy50cmFuc2xhdGUpIHtcbiAgICAgIG1lc3NhZ2UgPSBhd2FpdCB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KG1lc3NhZ2UpO1xuICAgICAgaWYgKGVyciAmJiBlcnIuY29kZSkge1xuICAgICAgICBtZXNzYWdlICs9IGAge2NvZGU6ICR7ZXJyLmNvZGV9fWA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lc3NhZ2UgPSBgRmF0YWwgZXJyb3I6IFBsZWFzZSBjb250YWN0IHlvdXIgYWRtaW5pc3RyYXRvci5cXG5cXG57Y29kZTogJHsoZXJyICYmIGVyci5jb2RlKSB8fCAnbnVsbCd9LCBtZXNzYWdlOiBcIiR7bWVzc2FnZX1cIn1gO1xuICAgIH1cbiAgICBpZiAodGhpcy50b2FzdENvbnRyb2xsZXIpIHtcbiAgICAgIGlmIChkZXRhaWxzTWVzc2FnZSkge1xuICAgICAgICBtZXNzYWdlICs9IGA8YnIvPjxzbWFsbD4ke2RldGFpbHNNZXNzYWdlfTwvc21hbGw+YDtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuc2hvd1RvYXN0KHtcbiAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgZHVyYXRpb246IC0xLFxuICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWUsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHdpbmRvdykge1xuICAgICAgaWYgKGRldGFpbHNNZXNzYWdlKSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gYFxcblxcbntjYXVzZTogXCIke2RldGFpbHNNZXNzYWdlfVwifWA7XG4gICAgICB9XG4gICAgICB3aW5kb3cuYWxlcnQobWVzc2FnZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobWVzc2FnZSk7XG4gICAgICBpZiAoZXJyICYmIGVyci5kZXRhaWxzKSBjb25zb2xlLmVycm9yKCdjYXVzZScsIGVyci5kZXRhaWxzKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
574
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm0uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9zZXJ2aWNlcy9wbGF0Zm9ybS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVU3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFNUYsT0FBTyxFQUFvQixNQUFNLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUdyRSxPQUFPLEVBQUUsSUFBSSxFQUFjLEVBQUUsRUFBZ0IsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZELE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUVuRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUzRCxPQUFPLEVBQStCLHNCQUFzQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDakYsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFB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TCxDQUFDO2FBQU0sSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNsQixJQUFJLGNBQWMsRUFBRSxDQUFDO2dCQUNuQixPQUFPLElBQUksZ0JBQWdCLGNBQWMsSUFBSSxDQUFDO1lBQ2hELENBQUM7WUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hCLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN2QixJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTztnQkFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUQsQ0FBQztJQUNILENBQUM7dUdBM2pCVSxlQUFlLG1aQXFCaEIsV0FBVyxhQUNDLG1CQUFtQjsyR0F0QjlCLGVBQWUsY0FERixNQUFNOzsyRkFDbkIsZUFBZTtrQkFEM0IsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQXNCN0IsTUFBTTsyQkFBQyxXQUFXOzswQkFDbEIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxtQkFBbUI7OzBCQUN0QyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUGxhdGZvcm0sIFRvYXN0Q29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IE5ldHdvcmtTZXJ2aWNlIH0gZnJvbSAnLi9uZXR3b3JrLnNlcnZpY2UnO1xuaW1wb3J0IHsgQXV0aFRva2VuVHlwZSB9IGZyb20gJy4vbmV0d29yay50eXBlcyc7XG5pbXBvcnQgeyBQbGF0Zm9ybXMgfSBmcm9tICdAaW9uaWMvY29yZSc7XG5pbXBvcnQgeyBMb2NhbFNldHRpbmdzU2VydmljZSB9IGZyb20gJy4vbG9jYWwtc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQgeyBDYWNoZVNlcnZpY2UgfSBmcm9tICdpb25pYy1jYWNoZSc7XG5pbXBvcnQgeyBBdWRpb1Byb3ZpZGVyIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2F1ZGlvL2F1ZGlvJztcbmltcG9ydCB7IFBsYXRmb3JtIGFzIENka1BsYXRmb3JtIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BsYXRmb3JtJztcblxuaW1wb3J0IHsgaXNOaWxPckJsYW5rLCBpc05vdE5pbCwgaXNOb3ROaWxPckJsYW5rLCB0b0Jvb2xlYW4gfSBmcm9tICcuLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7IEVudGl0aWVzU3RvcmFnZSB9IGZyb20gJy4vc3RvcmFnZS9lbnRpdGllcy1zdG9yYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2hvd1RvYXN0T3B0aW9ucywgVG9hc3RzIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3RvYXN0L3RvYXN0cyc7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBBY2NvdW50U2VydmljZSB9IGZyb20gJy4vYWNjb3VudC5zZXJ2aWNlJztcbmltcG9ydCB7IGZyb20sIE9ic2VydmFibGUsIG9mLCBTdWJzY3JpcHRpb24sIHRpbWVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBza2lwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBFbnZpcm9ubWVudCwgRU5WSVJPTk1FTlQgfSBmcm9tICcuLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQuY2xhc3MnO1xuaW1wb3J0IHsgQ29uZmlnU2VydmljZSB9IGZyb20gJy4vY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ09SRV9DT05GSUdfT1BUSU9OUyB9IGZyb20gJy4vY29uZmlnL2NvcmUuY29uZmlnJztcbmltcG9ydCB7IE1vbWVudERhdGVBZGFwdGVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwtbW9tZW50LWFkYXB0ZXInO1xuaW1wb3J0IHsgRG93bmxvYWRlciwgRG93bmxvYWRSZXF1ZXN0LCBOb3RpZmljYXRpb25WaXNpYmlsaXR5IH0gZnJvbSAnQGlvbmljLW5hdGl2ZS9kb3dubG9hZGVyL25neCc7XG5pbXBvcnQgeyBTdGFydGFibGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL3N0YXJ0YWJsZS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7IGlzTW9iaWxlLCBpc1dpbmRvd3MgfSBmcm9tICcuLi8uLi9zaGFyZWQvcGxhdGZvcm1zJztcbmltcG9ydCB7IFZlcnNpb25VdGlscyB9IGZyb20gJy4uLy4uL3NoYXJlZC92ZXJzaW9uL3ZlcnNpb25zJztcbmltcG9ydCB7IEZpbGVzVXRpbHMsIE1pbWVUeXBlcyB9IGZyb20gJy4uLy4uL3NoYXJlZC9maWxlL2ZpbGUudXRpbHMnO1xuaW1wb3J0IHsgVXJpVXRpbHMgfSBmcm9tICcuLi8uLi9zaGFyZWQvZmlsZS91cmkudXRpbHMnO1xuaW1wb3J0IHsgU3BsYXNoU2NyZWVuIH0gZnJvbSAnQGNhcGFjaXRvci9zcGxhc2gtc2NyZWVuJztcbmltcG9ydCB7IFN0YXR1c0JhciB9IGZyb20gJ0BjYXBhY2l0b3Ivc3RhdHVzLWJhcic7XG5pbXBvcnQgeyBCcm93c2VyLCBPcGVuT3B0aW9ucyB9IGZyb20gJ0BjYXBhY2l0b3IvYnJvd3Nlcic7XG5pbXBvcnQgeyBLZXlib2FyZCB9IGZyb20gJ0BjYXBhY2l0b3Iva2V5Ym9hcmQnO1xuaW1wb3J0IHsgQ2FwYWNpdG9yUGx1Z2lucyB9IGZyb20gJy4uLy4uL3NoYXJlZC9jYXBhY2l0b3IvcGx1Z2lucyc7XG5pbXBvcnQgeyBsb2NhbGUgYXMgbW9tZW50TG9jYWxlIH0gZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IElMb2dnZXIsIElMb2dnaW5nU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9sb2dnaW5nL2xvZ2dlci5tb2RlbCc7XG5pbXBvcnQgeyBBUFBfTE9HR0lOR19TRVJWSUNFIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2xvZ2dpbmcvbG9nZ2luZy1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7IENsaXBib2FyZCBhcyBDZGtDbGlwYm9hcmQgfSBmcm9tICdAYW5ndWxhci9jZGsvY2xpcGJvYXJkJztcbmltcG9ydCB7IENsaXBib2FyZCB9IGZyb20gJ0BjYXBhY2l0b3IvY2xpcGJvYXJkJztcbmltcG9ydCB7IFdyaXRlT3B0aW9ucyB9IGZyb20gJ0BjYXBhY2l0b3IvY2xpcGJvYXJkL2Rpc3QvZXNtL2RlZmluaXRpb25zJztcblxuZXhwb3J0IGNvbnN0IEFuZHJvaWRPc0Vudmlyb25tZW50ID0gT2JqZWN0LmZyZWV6ZSh7XG4gIERJUkVDVE9SWV9ET1dOTE9BRFM6ICdEb3dubG9hZCcsXG4gIERJUkVDVE9SWV9ET1dOTE9BRFNfT0xEOiAnRG93bmxvYWRzJywgLy8gT2xkIG5hbWUsIGZvciBvbGRlciBBbmRyb2lkIHZlcnNpb25cbiAgLy8gVE9ETzogZmluZCB2YWx1ZSBmb3IgdGhpcy4gU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL29zL0Vudmlyb25tZW50I2dldEV4dGVybmFsU3RvcmFnZVN0YXRlKGphdmEuaW8uRmlsZSlcbiAgLy8gRElSRUNUT1JZX01VU0lDLFxuICAvLyBESVJFQ1RPUllfUE9EQ0FTVFMsXG4gIC8vIERJUkVDVE9SWV9SSU5HVE9ORVMsXG4gIC8vIERJUkVDVE9SWV9BTEFSTVMsXG4gIC8vIERJUkVDVE9SWV9OT1RJRklDQVRJT05TLFxuICAvLyBESVJFQ1RPUllfUElDVFVSRVMsXG4gIC8vIERJUkVDVE9SWV9NT1ZJRVMsXG4gIC8vIERJUkVDVE9SWV9EQ0lNLFxuICAvLyBESVJFQ1RPUllfRE9DVU1FTlRTLFxuICAvLyBESVJFQ1RPUllfQVVESU9CT09LUyxcbn0pO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIFBsYXRmb3JtU2VydmljZSBleHRlbmRzIFN0YXJ0YWJsZVNlcnZpY2Uge1xuICBwcml2YXRlIF9sb2dnZXI6IElMb2dnZXI7XG4gIHByaXZhdGUgX21vYmlsZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfY29yZG92YTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfY2FwYWNpdG9yOiBib29sZWFuO1xuICBwcml2YXRlIF9hbmRyb2lkOiBib29sZWFuO1xuICBwcml2YXRlIF9pb3M6IGJvb2xlYW47XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaW9uaWNQbGF0Zm9ybTogUGxhdGZvcm0sXG4gICAgcHJpdmF0ZSBjZGtQbGF0Zm9ybTogQ2RrUGxhdGZvcm0sXG4gICAgcHJpdmF0ZSBjZGtDbGlwYm9hcmQ6IENka0NsaXBib2FyZCxcbiAgICBwcml2YXRlIHRvYXN0Q29udHJvbGxlcjogVG9hc3RDb250cm9sbGVyLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGF0ZUFkYXB0ZXI6IE1vbWVudERhdGVBZGFwdGVyLFxuICAgIHByaXZhdGUgZW50aXRpZXNTdG9yYWdlOiBFbnRpdGllc1N0b3JhZ2UsXG4gICAgcHJpdmF0ZSBzZXR0aW5nczogTG9jYWxTZXR0aW5nc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBuZXR3b3JrU2VydmljZTogTmV0d29ya1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBhY2NvdW50U2VydmljZTogQWNjb3VudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2FjaGU6IENhY2hlU2VydmljZSxcbiAgICBwcml2YXRlIGF1ZGlvUHJvdmlkZXI6IEF1ZGlvUHJvdmlkZXIsXG4gICAgQEluamVjdChFTlZJUk9OTUVOVCkgcHJvdGVjdGVkIGVudmlyb25tZW50OiBFbnZpcm9ubWVudCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFQUF9MT0dHSU5HX1NFUlZJQ0UpIHByaXZhdGUgbG9nZ2luZ1NlcnZpY2U6IElMb2dnaW5nU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGRvd25sb2FkZXI6IERvd25sb2FkZXJcbiAgKSB7XG4gICAgc3VwZXIoaW9uaWNQbGF0Zm9ybSk7XG5cbiAgICB0aGlzLl9sb2dnZXIgPSBsb2dnaW5nU2VydmljZT8uZ2V0TG9nZ2VyKCdwbGF0Zm9ybScpO1xuICAgIHRoaXMuX2RlYnVnID0gIWVudmlyb25tZW50LnByb2R1Y3Rpb247XG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKCdbcGxhdGZvcm1dIENyZWF0aW5nIHNlcnZpY2UnKTtcblxuICAgIGlmICh0aGlzLl9sb2dnZXIpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5kZWJ1ZygnY3RvcicsICdDcmVhdGluZyBzZXJ2aWNlJyk7XG4gICAgICBpb25pY1BsYXRmb3JtLnBhdXNlLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuX2xvZ2dlci5pbmZvKCdjdG9yJywgJ1BhdXNlIGFwcCcpO1xuICAgICAgfSk7XG4gICAgICBpb25pY1BsYXRmb3JtLnJlc3VtZS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl9sb2dnZXIuaW5mbygnY3RvcicsICdSZXN1bWUgYXBwJyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBfZG93bmxvYWRpbmdKb2JzOiBNYXA8c3RyaW5nLCBPYnNlcnZhYmxlPHN0cmluZz4+ID0gbmV3IE1hcCgpO1xuXG4gIHByaXZhdGUgY2hlY2tBcHBWZXJzaW9uVGltZXI6IFN1YnNjcmlwdGlvbjtcblxuICBpcyhwbGF0Zm9ybU5hbWU6IFBsYXRmb3Jtcyk6IGJvb2xlYW4ge1xuICAgIHN3aXRjaCAocGxhdGZvcm1OYW1lKSB7XG4gICAgICBjYXNlICdtb2JpbGUnOlxuICAgICAgICAvLyBFeGNsdWRlIFdpbmRvd3MgdG91Y2ggc2NyZWVucyAtIHNlZSBzdW1hcmlzLWFwcCBpc3N1ZXMgIzMyMyBhbmQgIzM0NlxuICAgICAgICByZXR1cm4gaXNNb2JpbGUod2luZG93KTtcbiAgICAgIGNhc2UgJ21vYmlsZXdlYic6XG4gICAgICAgIC8vIEV4Y2x1ZGUgV2luZG93cyB0b3VjaCBzY3JlZW5zIC0gc2VlIHN1bWFyaXMtYXBwIGlzc3VlcyAjMzIzIGFuZCAjMzQ2XG4gICAgICAgIHJldHVybiB0aGlzLmlvbmljUGxhdGZvcm0uaXMocGxhdGZvcm1OYW1lKSAmJiAhaXNXaW5kb3dzKHdpbmRvdyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5pb25pY1BsYXRmb3JtLmlzKHBsYXRmb3JtTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IG1vYmlsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNOb3ROaWwodGhpcy5fbW9iaWxlKSA/IHRoaXMuX21vYmlsZSA6IHRoaXMuaXMoJ21vYmlsZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNheSBpZiBvcGVuZWQgaGFzIGJlZW4gb3BlbmVkIGluc2lkZSBhbiBBbmRyb2lkIG9yIGlPcyBBcHAuXG4gICAqIFRoaXMgaXMgdXNlZCB0byBrbm93biBpZiB0aGVyZSBpcyBjb3Jkb3ZhIGZlYXR1cmVzXG4gICAqL1xuICBpc0NhcGFjaXRvcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fY2FwYWNpdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIFNheSBpZiBvcGVuZWQgaGFzIGJlZW4gb3BlbmVkIGluc2lkZSBhbiBBbmRyb2lkIG9yIGlPcyBBcHAuXG4gICAqIFRoaXMgaXMgdXNlZCB0byBrbm93biBpZiB0aGVyZSBpcyBjb3Jkb3ZhIGZlYXR1cmVzXG4gICAqL1xuICBpc0NvcmRvdmEoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvcmRvdmE7XG4gIH1cblxuICBpc0FuZHJvaWRDb3Jkb3ZhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5fYW5kcm9pZCAmJiB0aGlzLl9jb3Jkb3ZhKSB8fCBmYWxzZTtcbiAgfVxuXG4gIGlzSU9TQ29yZG92YSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMuX2lvcyAmJiB0aGlzLl9jb3Jkb3ZhKSB8fCBmYWxzZTtcbiAgfVxuXG4gIGlzSU9TKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pb3MgfHwgZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogSXMgYSBuYXRpdmUgQXBwIChhbmQgTk9UIGEgbW9iaWxlIHdlYilcbiAgICovXG4gIGlzQXBwKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzQW5kcm9pZENvcmRvdmEoKSB8fCB0aGlzLmlzSU9TQ29yZG92YSgpO1xuICB9XG5cbiAgaXNXZWIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmlzQXBwKCk7XG4gIH1cblxuICBpc01vYmlsZVdlYigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tb2JpbGUgJiYgdGhpcy5pc1dlYigpO1xuICB9XG5cbiAgZ2V0IGNhbkRvd25sb2FkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRvd25sb2FkZXIgJiYgdGhpcy5pc0FuZHJvaWRDb3Jkb3ZhKCk7XG4gIH1cblxuICBnZXQgY2FuT3BlbkZpbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGZhbHNlOyAvLyBUT0RPOiBmaXhtZSB1c2luZyBAY2FwYWNpdG9yL2ZpbGVzeXN0ZW0gP1xuICB9XG5cbiAgd2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5pb25pY1BsYXRmb3JtLndpZHRoKCk7XG4gIH1cblxuICBoZWlnaHQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5pb25pY1BsYXRmb3JtLmhlaWdodCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIG5nT25TdGFydCgpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgdGhpcy5hY2NvdW50U2VydmljZS50b2tlblR5cGUgPSB1bmRlZmluZWQ7XG4gICAgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dIFN0YXJ0aW5nIHBsYXRmb3JtLi4uJyk7XG4gICAgdGhpcy5fbG9nZ2VyPy5pbmZvKCduZ09uU3RhcnQnLCAnU3RhcnRpbmcgcGxhdGZvcm0uLi4nKTtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLl9tb2JpbGUgPSB0aGlzLmlzKCdtb2JpbGUnKTtcbiAgICAgIHRoaXMuX2NvcmRvdmEgPSB0aGlzLmlzKCdjb3Jkb3ZhJyk7XG4gICAgICB0aGlzLl9jYXBhY2l0b3IgPSB0aGlzLmlzKCdjYXBhY2l0b3InKTtcbiAgICAgIHRoaXMuX2FuZHJvaWQgPSB0aGlzLmlzKCdhbmRyb2lkJyk7XG4gICAgICB0aGlzLl9pb3MgPSB0aGlzLmlzKCdpb3MnKTtcblxuICAgICAgY29uc3QgbG9nTWVzc2FnZSA9IGBEZXRlY3RlZCB7bW9iaWxlOiAke3RoaXMuX21vYmlsZX0sIGNvcmRvdmE6ICR7dGhpcy5fY29yZG92YX0sIGNhcGFjaXRvcjogJHt0aGlzLl9jYXBhY2l0b3J9LCBhbmRyb2lkOiAke3RoaXMuX2FuZHJvaWR9LCBpb3M6ICR7dGhpcy5faW9zfX1gO1xuICAgICAgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dICcgKyBsb2dNZXNzYWdlKTtcbiAgICAgIHRoaXMuX2xvZ2dlcj8uaW5mbygnbmdPblN0YXJ0JywgbG9nTWVzc2FnZSk7XG5cbiAgICAgIC8vIENvbmZpZ3VyZSBDU1MgY2xhc3NcbiAgICAgIHRoaXMuY29uZmlndXJlR2xvYmFsQ3NzQ2xhc3ModGhpcy5fbW9iaWxlKTtcblxuICAgICAgLy8gQ29uZmlndXJlIENhcGFjaXRvciBwbHVnaW5zXG4gICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyZUNhcGFjaXRvclBsdWdpbnMoKTtcblxuICAgICAgLy8gQ29uZmlndXJlIHRyYW5zbGF0aW9uXG4gICAgICB0aGlzLmNvbmZpZ3VyZVRyYW5zbGF0ZSgpO1xuXG4gICAgICAvLyBDb25maWd1cmUgY2FjaGVcbiAgICAgIHRoaXMuY29uZmlndXJlQ2FjaGUoKTtcblxuICAgICAgLy8gU3RhcnQgcm9vdCBzZXJ2aWNlc1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMuZW50aXRpZXNTdG9yYWdlLnJlYWR5KCksIHRoaXMuc2V0dGluZ3MucmVhZHkoKSwgdGhpcy5uZXR3b3JrU2VydmljZS5yZWFkeSgpLCB0aGlzLmF1ZGlvUHJvdmlkZXIucmVhZHkoKV0pO1xuXG4gICAgICAvLyBDaGVjayBpZiB3ZWIgYXBwIGhhcyB1cGRhdGUsIGFuZCByZWxvYWQgcGFnZSBpZiBuZWVkXG4gICAgICBpZiAodGhpcy5pc1dlYigpICYmIHRoaXMuZW52aXJvbm1lbnQucHJvZHVjdGlvbikge1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrQXBwVmVyc2lvbih7IGNhblJlbG9hZDogdHJ1ZSB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIGNhY2hlIGNvbmZpZ3VyYXRpb24gd2hlbiBuZXR3b3JrIGNoYW5nZWRcbiAgICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICAgIHRoaXMubmV0d29ya1NlcnZpY2Uub25OZXR3b3JrU3RhdHVzQ2hhbmdlc1xuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgc2tpcCgxKSAvLyBBbHJlYWR5IGRvbmUgb25jZSwgc28gd2Ugc2tpcCB0aGUgZmlyc3QgZXZlbnRcbiAgICAgICAgICApXG4gICAgICAgICAgLnN1YnNjcmliZSgodHlwZSkgPT4gdGhpcy5jb25maWd1cmVDYWNoZSh0eXBlICE9PSAnbm9uZScpKVxuICAgICAgKTtcblxuICAgICAgY29uc29sZS5pbmZvKFxuICAgICAgICBgW3BsYXRmb3JtXSBTdGFydGluZyBwbGF0Zm9ybSBbT0tdIHttb2JpbGU6ICR7dGhpcy5fbW9iaWxlfSwgY2FwYWNpdG9yOiAke3RoaXMuX2NhcGFjaXRvcn0sIHdlYjogJHt0aGlzLmlzV2ViKCl9LCBkb3dubG9hZGVyOiAke3RoaXMuY2FuRG93bmxvYWR9fSBpbiAke0RhdGUubm93KCkgLSBub3d9bXNgXG4gICAgICApO1xuXG4gICAgICAvLyBQYXNzIGF1dGggdG9rZW5cbiAgICAgIHRoaXMucmVnaXN0ZXJTdWJzY3JpcHRpb24oXG4gICAgICAgIHRoaXMuY29uZmlnU2VydmljZS5jb25maWcuc3Vic2NyaWJlKChjb25maWcpID0+IHtcbiAgICAgICAgICBpZiAoIWNvbmZpZykgcmV0dXJuOyAvLyBTa2lwXG5cbiAgICAgICAgICAvLyBVcGRhdGUgYXV0aGVudGljYXRpb24gdHlwZVxuICAgICAgICAgIGNvbnN0IHRva2VuVHlwZTogQXV0aFRva2VuVHlwZSA9IGNvbmZpZy5nZXRQcm9wZXJ0eShDT1JFX0NPTkZJR19PUFRJT05TLkFVVEhfVE9LRU5fVFlQRSkgYXMgQXV0aFRva2VuVHlwZTtcbiAgICAgICAgICBpZiAoaXNOb3ROaWxPckJsYW5rKHRva2VuVHlwZSkgJiYgdGhpcy5hY2NvdW50U2VydmljZS50b2tlblR5cGUgIT09IHRva2VuVHlwZSkge1xuICAgICAgICAgICAgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIFVzaW5nIGF1dGggdG9rZW4gdHlwZSB7JHt0b2tlblR5cGV9fWApO1xuICAgICAgICAgICAgdGhpcy5hY2NvdW50U2VydmljZS50b2tlblR5cGUgPSB0b2tlblR5cGU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRW5hYmxlIGF1dGggQVBJIHVzaW5nIHRva2Vuc1xuICAgICAgICAgIGNvbnN0IGF1dGhBcGlFbmFibGVkID0gY29uZmlnLmdldFByb3BlcnR5QXNCb29sZWFuKENPUkVfQ09ORklHX09QVElPTlMuQVVUSF9BUElfVE9LRU5fRU5BQkxFRCk7XG4gICAgICAgICAgaWYgKGlzTm90TmlsKGF1dGhBcGlFbmFibGVkKSAmJiBhdXRoQXBpRW5hYmxlZCAhPT0gdGhpcy5hY2NvdW50U2VydmljZS5hcGlUb2tlbkVuYWJsZWQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhgW3BsYXRmb3JtXSBVc2luZyBhdXRoIEFQSSB0b2tlbnMgPyAke2F1dGhBcGlFbmFibGVkfX1gKTtcbiAgICAgICAgICAgIHRoaXMuYWNjb3VudFNlcnZpY2UuYXBpVG9rZW5FbmFibGVkID0gYXV0aEFwaUVuYWJsZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgaWYgKHRoaXMuX21vYmlsZSkge1xuICAgICAgICAvLyBIaWRlIHRoZSBzcGxhc2hzY3JlZW4gKGlmIG1vYmlsZSkgLSBhZnRlciAxcyAtIGFuZCBwbGF5IHN0YXJ0IHNvdW5kXG4gICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGF3YWl0IFNwbGFzaFNjcmVlbi5oaWRlKCk7XG5cbiAgICAgICAgICAvLyBQbGF5IHN0YXJ0dXAgc291bmRcbiAgICAgICAgICB0aGlzLmF1ZGlvUHJvdmlkZXIucGxheVN0YXJ0dXBTb3VuZCgpO1xuICAgICAgICB9LCAxMDAwKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgbmV3IHZlcnNpb24sIGV2ZXJ5IDEgbWluXG4gICAgICBjb25zdCBjaGVja0ludGVydmFsTXMgPSAodGhpcy5lbnZpcm9ubWVudC5jaGVja0FwcFZlcnNpb25JbnRlcnZhbEluU2Vjb25kcyB8fCAwKSAqIDEwMDA7XG4gICAgICBpZiAodGhpcy5pc1dlYigpICYmIHRoaXMuZW52aXJvbm1lbnQucHJvZHVjdGlvbiAmJiBjaGVja0ludGVydmFsTXMgPiAwKSB7XG4gICAgICAgIHRoaXMuY2hlY2tBcHBWZXJzaW9uVGltZXI/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRpbWVyKGNoZWNrSW50ZXJ2YWxNcywgY2hlY2tJbnRlcnZhbE1zKS5zdWJzY3JpYmUoKF8pID0+XG4gICAgICAgICAgdGhpcy5jaGVja0FwcFZlcnNpb24oeyBzaWxlbnQ6IHRydWUsIGNhblJlbG9hZDogZmFsc2UgLypkbyBOT1QgYXV0byByZWxvYWQsIHdoZW4gYXBwIGlzIHN0YXJ0ZWQqLyB9KVxuICAgICAgICApO1xuICAgICAgICB0aGlzLmNoZWNrQXBwVmVyc2lvblRpbWVyID0gc3Vic2NyaXB0aW9uO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG4gICAgICAgIHN1YnNjcmlwdGlvbi5hZGQoKCkgPT4gdGhpcy51bnJlZ2lzdGVyU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbikpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gTWFuYWdlIHN0YXJ0dXAgZXJyb3JcbiAgICAgIHJldHVybiB0aGlzLm9uU3RhcnR1cEVycm9yKGVycik7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb3Blbih1cmw6IHN0cmluZywgb3B0cz86IE9wZW5PcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIE9wZW5pbmcgbGluazogJHt1cmx9YCk7XG4gICAgaWYgKHRoaXMuX21vYmlsZSAmJiB0aGlzLl9jYXBhY2l0b3IpIHtcbiAgICAgIGF3YWl0IEJyb3dzZXIub3Blbih7IHVybCwgLi4ub3B0cyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgd2luZG93Lm9wZW4odXJsLCBvcHRzPy53aW5kb3dOYW1lKTtcbiAgICB9XG4gIH1cblxuICBnZXREb3dubG9hZGluZ0pvYih1cmk6IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rvd25sb2FkaW5nSm9icy5nZXQodXJpKTtcbiAgfVxuXG4gIGRvd25sb2FkKHJlcXVlc3Q6IHsgdXJpOiBzdHJpbmc7IGZpbGVuYW1lPzogc3RyaW5nIH0gJiBQYXJ0aWFsPERvd25sb2FkUmVxdWVzdD4pOiBPYnNlcnZhYmxlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghcmVxdWVzdCB8fCAhcmVxdWVzdC51cmkpIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgYXJndW1lbnQgJ3JlcXVlc3QnIG9yICdyZXF1ZXN0LnVyaSdcIik7XG5cbiAgICBpZiAodGhpcy5jYW5Eb3dubG9hZCkge1xuICAgICAgLy8gQ2hlY2sgaWYgbm90IGFscmVhZHkgZG93bmxvYWRpbmcgZmlsZVxuICAgICAgbGV0IGpvYiQgPSB0aGlzLl9kb3dubG9hZGluZ0pvYnMuZ2V0KHJlcXVlc3QudXJpKTtcbiAgICAgIGlmIChqb2IkKSByZXR1cm4gam9iJDtcblxuICAgICAgLy8gQ29tcHV0ZSBzdWJQYXRoIChmaW5hbCBmaWxlbmFtZSlcbiAgICAgIGxldCBzdWJQYXRoID1cbiAgICAgICAgcmVxdWVzdC5kZXN0aW5hdGlvbkluRXh0ZXJuYWxQdWJsaWNEaXI/LnN1YlBhdGggfHxcbiAgICAgICAgcmVxdWVzdC5kZXN0aW5hdGlvbkluRXh0ZXJuYWxGaWxlc0Rpcj8uc3ViUGF0aCB8fFxuICAgICAgICByZXF1ZXN0LmZpbGVuYW1lIHx8XG4gICAgICAgIFVyaVV0aWxzLmdldEZpbGVuYW1lKHJlcXVlc3QudXJpKSB8fFxuICAgICAgICByZXF1ZXN0LnRpdGxlIHx8XG4gICAgICAgICdkb3dubG9hZCc7XG5cbiAgICAgIHN1YlBhdGggPSBzdWJQYXRoXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgIC8vIFJlbW92ZSBzcGFjZXNcbiAgICAgICAgLnJlcGxhY2UoL1xccysvZywgJy0nKTtcblxuICAgICAgLy8gRm9yY2UgQVBLIHRvIGZpbmlzaCB3aXRoICcuYXBrJ1xuICAgICAgaWYgKHJlcXVlc3QubWltZVR5cGUgPT09IE1pbWVUeXBlcy5BTkRST0lEX0FQSyAmJiAhc3ViUGF0aC50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCcuYXBrJykpIHtcbiAgICAgICAgc3ViUGF0aCArPSAnLmFwayc7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRvd25sb2FkUmVxdWVzdCA9IDxEb3dubG9hZFJlcXVlc3Q+e1xuICAgICAgICB2aXNpYmxlSW5Eb3dubG9hZHNVaTogdHJ1ZSxcbiAgICAgICAgbm90aWZpY2F0aW9uVmlzaWJpbGl0eTogTm90aWZpY2F0aW9uVmlzaWJpbGl0eS5WaXNpYmxlTm90aWZ5Q29tcGxldGVkLFxuICAgICAgICAuLi5yZXF1ZXN0LFxuICAgICAgICBmaWxlbmFtZTogdW5kZWZpbmVkLCAvLyBGb3JjZSB1bnNldFxuICAgICAgICBkZXN0aW5hdGlvbkluRXh0ZXJuYWxQdWJsaWNEaXI6ICFyZXF1ZXN0LmRlc3RpbmF0aW9uSW5FeHRlcm5hbEZpbGVzRGlyXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGRpclR5cGU6IEFuZHJvaWRPc0Vudmlyb25tZW50LkRJUkVDVE9SWV9ET1dOTE9BRFMsXG4gICAgICAgICAgICAgIC4uLnJlcXVlc3QuZGVzdGluYXRpb25JbkV4dGVybmFsUHVibGljRGlyLFxuICAgICAgICAgICAgICBzdWJQYXRoLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICBkZXN0aW5hdGlvbkluRXh0ZXJuYWxGaWxlc0RpcjogcmVxdWVzdC5kZXN0aW5hdGlvbkluRXh0ZXJuYWxGaWxlc0RpclxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBkaXJUeXBlOiBBbmRyb2lkT3NFbnZpcm9ubWVudC5ESVJFQ1RPUllfRE9XTkxPQURTLFxuICAgICAgICAgICAgICAuLi5yZXF1ZXN0LmRlc3RpbmF0aW9uSW5FeHRlcm5hbEZpbGVzRGlyLFxuICAgICAgICAgICAgICBzdWJQYXRoLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgfTtcblxuICAgICAgLy8gU3RhcnQgZG93bmxvYWRcbiAgICAgIGNvbnNvbGUuZGVidWcoJ1twbGF0Zm9ybV0gRG93bmxvYWRpbmcsIHVzaW5nIHJlcXVlc3Q6ICcgKyBKU09OLnN0cmluZ2lmeShkb3dubG9hZFJlcXVlc3QpKTtcbiAgICAgIGpvYiQgPSBmcm9tKHRoaXMuZG93bmxvYWRlci5kb3dubG9hZChkb3dubG9hZFJlcXVlc3QpKTtcblxuICAgICAgLy8gUmVtZW1iZXIgdGhpcyByZXF1ZXN0IHVyaVxuICAgICAgdGhpcy5fZG93bmxvYWRpbmdKb2JzLnNldChkb3dubG9hZFJlcXVlc3QudXJpLCBqb2IkKTtcbiAgICAgIHJldHVybiBqb2IkLnBpcGUoXG4gICAgICAgIHRhcCgobG9jYXRpb24pID0+IHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oJ1twbGF0Zm9ybV0gRmlsZSBzdWNjZXNzZnVsbHkgZG93bmxvYWRlZCBhdDonICsgbG9jYXRpb24pO1xuICAgICAgICAgIC8vIEZvcmdldCBqb2JcbiAgICAgICAgICB0aGlzLl9kb3dubG9hZGluZ0pvYnMuZGVsZXRlKGRvd25sb2FkUmVxdWVzdC51cmkpO1xuICAgICAgICAgIHJldHVybiBsb2NhdGlvbjtcbiAgICAgICAgfSksXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1twbGF0Zm9ybV0gVW5hYmxlIHRvIGRvd25sb2FkOiAnICsgKChlcnIgJiYgZXJyLm1lc3NhZ2UpIHx8IGVycikpO1xuICAgICAgICAgIC8vIEZvcmdldCB0aGUgcmVxdWVzdFxuICAgICAgICAgIHRoaXMuX2Rvd25sb2FkaW5nSm9icy5kZWxldGUoZG93bmxvYWRSZXF1ZXN0LnVyaSk7XG5cbiAgICAgICAgICAvLyBSZXRyeSB3aXRoIGFub3RoZXIgbG9jYXRpb24gLSBpc3N1ZSBpbiBvbGRlciBBbmRyb2lkIHZlcnNpb25cbiAgICAgICAgICBpZiAoZG93bmxvYWRSZXF1ZXN0LmRlc3RpbmF0aW9uSW5FeHRlcm5hbFB1YmxpY0Rpcj8uZGlyVHlwZSA9PT0gQW5kcm9pZE9zRW52aXJvbm1lbnQuRElSRUNUT1JZX0RPV05MT0FEUykge1xuICAgICAgICAgICAgZG93bmxvYWRSZXF1ZXN0LmRlc3RpbmF0aW9uSW5FeHRlcm5hbFB1YmxpY0Rpci5kaXJUeXBlID0gQW5kcm9pZE9zRW52aXJvbm1lbnQuRElSRUNUT1JZX0RPV05MT0FEU19PTEQ7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kb3dubG9hZChkb3dubG9hZFJlcXVlc3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIChpZiBub3QgQW5kcm9pZCBhbmQgQ2FwYWNpdG9yKTogb3BlbmluZyB0aGUgVVJJXG4gICAgLy8gVE9ETzogZmluZCBhIHdheSB0byBkb3dubG9hZCB1bmRlciBpT1MgKHNlZSBodHRwczovL3d3dy5jLXNoYXJwY29ybmVyLmNvbS9hcnRpY2xlL2hvdy10by1kb3dubG9hZC1hLWZpbGUtdXNpbmctZmlsZS10cmFuc2Zlci1wbHVnaW4taW4taW9uaWMtMy8pXG4gICAgZWxzZSB7XG4gICAgICBGaWxlc1V0aWxzLmRvd25sb2FkVXJpKHJlcXVlc3QudXJpLCByZXF1ZXN0LmZpbGVuYW1lKTtcbiAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNvcHlUb0NsaXBib2FyZChkYXRhOiBzdHJpbmcgfCBXcml0ZU9wdGlvbnMsIG9wdHM/OiBTaG93VG9hc3RPcHRpb25zKSB7XG4gICAgY29uc3QgdmFsdWUgPSAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSA/IGRhdGEgOiBkYXRhLnN0cmluZztcbiAgICBpZiAodGhpcy5pc0FuZHJvaWRDb3Jkb3ZhKCkpIHtcbiAgICAgIGNvbnN0IHdyaXRlT3B0aW9ucyA9ICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpID8ge3N0cmluZzogdmFsdWV9IDogZGF0YTtcbiAgICAgIGF3YWl0IENsaXBib2FyZC53cml0ZSh3cml0ZU9wdGlvbnMpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMuY2RrQ2xpcGJvYXJkLmNvcHkodmFsdWUpO1xuICAgIH1cblxuICAgIC8vIFNob3cgdG9hc3RcbiAgICBpZiAob3B0cyAmJiBpc05vdE5pbE9yQmxhbmsob3B0cy5tZXNzYWdlKSkge1xuICAgICAgYXdhaXQgVG9hc3RzLnNob3codGhpcy50b2FzdENvbnRyb2xsZXIsIHRoaXMudHJhbnNsYXRlLCB7XG4gICAgICAgIHR5cGU6ICdpbmZvJyxcbiAgICAgICAgLi4ub3B0cyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qIC0tIHByb3RlY3RlZCBtZXRob2RzIC0tICovXG5cbiAgcHJvdGVjdGVkIGNvbmZpZ3VyZUdsb2JhbENzc0NsYXNzKG1vYmlsZTogYm9vbGVhbiwgd2luOiBhbnkgPSB3aW5kb3cpIHtcbiAgICBpZiAobW9iaWxlKSByZXR1cm47IC8vIE5vdGhpbmcgdG8gZG9cblxuICAgIC8vIFdvcmthcm91bmQsIGZvciBNUyBXaW5kb3dzIHRvdWNoIHNjcmVlbiAoZGV0ZWN0ZWQgYXMgbW9iaWxlLCBidXQgZm9yY2VkIGFzIGRlc2t0b3ApXG4gICAgaWYgKFxuICAgICAgIW1vYmlsZSAmJlxuICAgICAgKHdpbi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ/LmNsYXNzTGlzdC5jb250YWlucygncGx0LW1vYmlsZScpIHx8IHdpbi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0Py5jb250YWlucygncGx0LW1vYmlsZXdlYicpKVxuICAgICkge1xuICAgICAgY29uc29sZS53YXJuKCdbcGxhdGZvcm1dIEZvcmNlIGNsYXNzIGxpc3QgdG86IDxodG1sIGNsYXNzPVwicGx0LWRlc2t0b3BcIj4uIFdvcmthcm91bmQgZm9yIFdpbmRvd3MgdG91Y2ggc2NyZWVuLicpO1xuICAgICAgd2luLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdwbHQtbW9iaWxlJywgJ3BsdC1tb2JpbGV3ZWInKTtcbiAgICAgIHdpbi5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgncGx0LWRlc2t0b3AnKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY29uZmlndXJlQ2FwYWNpdG9yUGx1Z2lucygpIHtcbiAgICBpZiAoIXRoaXMuX2NhcGFjaXRvcikgcmV0dXJuOyAvLyBTa2lwXG5cbiAgICBjb25zb2xlLmluZm8oJ1twbGF0Zm9ybV0gQ29uZmlndXJpbmcgQ2FwYWNpdG9yIHBsdWdpbnMuLi4nKTtcblxuICAgIGxldCBwbHVnaW46IHN0cmluZztcbiAgICB0cnkge1xuICAgICAgcGx1Z2luID0gQ2FwYWNpdG9yUGx1Z2lucy5TdGF0dXNCYXI7XG4gICAgICBpZiAodGhpcy5pc0FwcCgpKSB7XG4gICAgICAgIGF3YWl0IFN0YXR1c0Jhci5zZXRPdmVybGF5c1dlYlZpZXcoeyBvdmVybGF5OiBmYWxzZSB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gSGlkZSBhY2Nlc3NvcnkgYmFyIChpT1Mgb25seSlcbiAgICAgIGlmICh0aGlzLmlzSU9TKCkpIHtcbiAgICAgICAgcGx1Z2luID0gQ2FwYWNpdG9yUGx1Z2lucy5LZXlib2FyZDtcbiAgICAgICAgYXdhaXQgS2V5Ym9hcmQuc2V0QWNjZXNzb3J5QmFyVmlzaWJsZSh7IGlzVmlzaWJsZTogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBsb2dNZXNzYWdlID0gYEVycm9yIHdoaWxlIGNvbmZpZ3VyaW5nICR7cGx1Z2lufSBwbHVnaW46ICR7ZXJyLm1lc3NhZ2UgfHwgZXJyfVxcbiR7ZXJyPy5vcmlnaW5hbFN0YWNrIHx8IEpTT04uc3RyaW5naWZ5KGVycil9YDtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1twbGF0Zm9ybV0gJyArIGxvZ01lc3NhZ2UpO1xuICAgICAgdGhpcy5fbG9nZ2VyPy5lcnJvcignY29uZmlndXJlQ2FwYWNpdG9yUGx1Z2lucycsIGxvZ01lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBjb25maWd1cmVUcmFuc2xhdGUoKSB7XG4gICAgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dIENvbmZpZ3VyaW5nIGkxOG4gLi4uJyk7XG5cbiAgICAvLyB0aGlzIGxhbmd1YWdlIHdpbGwgYmUgdXNlZCBhcyBhIGZhbGxiYWNrIHdoZW4gYSB0cmFuc2xhdGlvbiBpc24ndCBmb3VuZCBpbiB0aGUgY3VycmVudCBsYW5ndWFnZVxuICAgIHRoaXMudHJhbnNsYXRlLnNldERlZmF1bHRMYW5nKHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdExvY2FsZSk7XG4gICAgLy8gYXBwbHkgbG9jYWxlIGltbWVkaWF0ZWx5XG4gICAgdGhpcy5hcHBseUxvY2FsZSh0aGlzLmVudmlyb25tZW50LmRlZmF1bHRMb2NhbGUpO1xuXG4gICAgLy8gV2hlbiBsb2NhbGUgY2hhbmdlcywgYXBwbHkgdG8gZGF0ZSBhZGFwdGVyXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIHRoaXMudHJhbnNsYXRlLm9uTGFuZ0NoYW5nZS5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudCAmJiBldmVudC5sYW5nKSB7XG4gICAgICAgICAgdGhpcy5hcHBseUxvY2FsZShldmVudC5sYW5nKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5yZWdpc3RlclN1YnNjcmlwdGlvbihcbiAgICAgIHRoaXMuc2V0dGluZ3Mub25DaGFuZ2Uuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgaWYgKGRhdGEubG9jYWxlKSB7XG4gICAgICAgICAgICBpZiAoZGF0YS5sb2NhbGUgIT09IHRoaXMudHJhbnNsYXRlLmN1cnJlbnRMYW5nKSB7XG4gICAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlLnVzZShkYXRhLmxvY2FsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEFwcGx5aW5nIGRlZmF1bHQsIHdoZW4gc2V0dGluZ3MgaGFzIG5vIGxvY2FsZSBwcm9wZXJ0eSAoaG90Zml4IC0gbHVkb3ZpYy5wZWNxdW90QGUtaXMucHJvIC0gMTQvMTEvMjAyMSAtIHNpbmNlIHYxLjIwLjQyKVxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdbcGxhdGZvcm1dIE5vIGxvY2FsZSBmb3VuZCBpbiBzZXR0aW5nczogYXBwbHlpbmcgZGVmYXVsdExvY2FsZTogJywgdGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0TG9jYWxlKTtcbiAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlLnVzZSh0aGlzLmVudmlyb25tZW50LmRlZmF1bHRMb2NhbGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuXG4gICAgLy8gVXNlIGFjY291bnQncyBzZXR0aW5ncywgKGxpa2UgbG9jYWxlKSwgd2hlbiBhY2NvdW50IGluaGVyaXRhbmNlIGVuYWJsZWRcbiAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKFxuICAgICAgdGhpcy5hY2NvdW50U2VydmljZS5vbkxvZ2luLnN1YnNjcmliZSgoYWNjb3VudCkgPT4ge1xuICAgICAgICBpZiAoYWNjb3VudC5zZXR0aW5ncyAmJiB0aGlzLnNldHRpbmdzLnNldHRpbmdzLmFjY291bnRJbmhlcml0YW5jZSkge1xuICAgICAgICAgIGNvbnN0IGFjY291bnRTZXR0aW5ncyA9IGFjY291bnQuc2V0dGluZ3MuYXNMb2NhbFNldHRpbmdzKCk7XG4gICAgICAgICAgdGhpcy5zZXR0aW5ncy5hcHBseShhY2NvdW50U2V0dGluZ3MpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXBwbHlMb2NhbGUobG9jYWxlOiBzdHJpbmcpIHtcbiAgICAvLyBmb3JjZSAnZW4nIGFzICdlbl9HQidcbiAgICBpZiAobG9jYWxlID09PSAnZW4nKSB7XG4gICAgICBsb2NhbGUgPSAnZW5fR0InO1xuICAgIH1cblxuICAgIC8vIGNvbmZpZyBtb21lbnQgbGliXG4gICAgdHJ5IHtcbiAgICAgIG1vbWVudExvY2FsZShsb2NhbGUpO1xuICAgICAgY29uc29sZS5kZWJ1ZygnW3BsYXRmb3JtXSBVc2UgbG9jYWxlIHsnICsgbG9jYWxlICsgJ30nKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIElmIGVycm9yLCBmYWxsYmFjayB0byBlblxuICAgICAgbW9tZW50TG9jYWxlKCdlbicpO1xuICAgICAgY29uc29sZS53YXJuKCdbcGxhdGZvcm1dIFVua25vd24gbG9jYWxlIGZvciBtb21lbnQgbGliLiBVc2luZyBkZWZhdWx0IFtlbl0nKTtcbiAgICB9XG5cbiAgICAvLyBDb25maWcgZGF0ZSBhZGFwdGVyXG4gICAgdGhpcy5kYXRlQWRhcHRlci5zZXRMb2NhbGUobW9tZW50TG9jYWxlKCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbmZpZ3VyZUNhY2hlKG9ubGluZT86IGJvb2xlYW4pIHtcbiAgICBvbmxpbmUgPSB0b0Jvb2xlYW4ob25saW5lLCB0aGlzLmNhY2hlLmlzT25saW5lKCkpO1xuICAgIGNvbnN0IGNhY2hlVFRMID0gb25saW5lID8gMzYwMCAvKiAxaCAqLyA6IDM2MDAgKiAyNCAqIDMwOyAvKiAxIG1vbnRoICovXG4gICAgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIENvbmZpZ3VyaW5nIGNhY2hlIFtPS10ge29ubGluZTogJHtvbmxpbmV9LCB0aW1lVG9MaXZlOiAke2NhY2hlVFRMIC8gMzYwMH1oLCBvZmZsaW5lSW52YWxpZGF0ZTogZmFsc2V9YCk7XG4gICAgdGhpcy5jYWNoZS5zZXREZWZhdWx0VFRMKGNhY2hlVFRMKTtcbiAgICB0aGlzLmNhY2hlLnNldE9mZmxpbmVJbnZhbGlkYXRlKGZhbHNlKTsgLy8gRG8gbm90IGludmFsaWRhdGUgY2FjaGUgd2hlbiBvZmZsaW5lXG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgY2hlY2tBcHBWZXJzaW9uKG9wdHM/OiB7IGNhblJlbG9hZD86IGJvb2xlYW47IHNpbGVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLm5ldHdvcmtTZXJ2aWNlLm9mZmxpbmUgfHwgIXRoaXMuaXNXZWIoKSkgcmV0dXJuOyAvLyBTa2lwXG5cbiAgICBjb25zdCBzaWxlbnQgPSBvcHRzPy5zaWxlbnQgPT09IHRydWU7XG4gICAgY29uc3QgcHJvZHVjdGlvbiA9IHRoaXMuZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgICBjb25zdCBjYW5BdXRvUmVsb2FkID0gIW9wdHMgfHwgb3B0cy5jYW5SZWxvYWQgIT09IGZhbHNlO1xuXG4gICAgaWYgKCFzaWxlbnQpIGNvbnNvbGUuaW5mbygnW3BsYXRmb3JtXSBDaGVja2luZyByZW1vdGUgYXBwIHZlcnNpb24uLi4nKTtcblxuICAgIGNvbnN0IGFjdHVhbFZlcnNpb24gPSB0aGlzLmVudmlyb25tZW50LnZlcnNpb247XG4gICAgaWYgKGlzTmlsT3JCbGFuayhhY3R1YWxWZXJzaW9uKSkge1xuICAgICAgY29uc29sZS5lcnJvcihcIltwbGF0Zm9ybV0gTWlzc2luZyByZXF1aXJlZCB2YWx1ZSBmb3IgJ2Vudmlyb25tZW50LnZlcnNpb24nLiBDYW5ub3QgY2hlY2sgcmVtb3RlIGFwcCB2ZXJzaW9uLlwiKTtcbiAgICAgIHRoaXMuY2hlY2tBcHBWZXJzaW9uVGltZXI/LnVuc3Vic2NyaWJlKCk7IC8vIFN0b3AgdGltZXIgaWYgZXhpc3RzXG4gICAgICByZXR1cm47IC8vIFNraXBcbiAgICB9XG5cbiAgICBjb25zdCByZW1vdGVWZXJzaW9uID0gYXdhaXQgdGhpcy5uZXR3b3JrU2VydmljZS5nZXRBcHBWZXJzaW9uKCk7XG4gICAgaWYgKGlzTmlsT3JCbGFuayhyZW1vdGVWZXJzaW9uKSkge1xuICAgICAgaWYgKHByb2R1Y3Rpb24gJiYgIXNpbGVudCkgY29uc29sZS5lcnJvcignW3BsYXRmb3JtXSBDYW5ub3QgbG9hZCByZW1vdGUgYXBwIHZlcnNpb24uIFNraXBwaW5nIHZlcnNpb24gY2hlY2snKTtcbiAgICAgIHRoaXMuY2hlY2tBcHBWZXJzaW9uVGltZXI/LnVuc3Vic2NyaWJlKCk7IC8vIFN0b3AgdGltZXIgaWYgZXhpc3RzXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKFZlcnNpb25VdGlscy5pc0NvbXBhdGlibGUocmVtb3RlVmVyc2lvbiwgYWN0dWFsVmVyc2lvbikpIHtcbiAgICAgIGlmICghc2lsZW50KSBjb25zb2xlLmluZm8oYFtwbGF0Zm9ybV0gQ2hlY2tpbmcgcmVtb3RlIGFwcCB2ZXJzaW9uIFtPS10ge3JlbW90ZTogJyR7cmVtb3RlVmVyc2lvbn0nLCBhY3R1YWw6ICcke2FjdHVhbFZlcnNpb259J31gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJZiBuZXdlciB2ZXJzaW9uIGV4aXN0c1xuICAgIGxldCByZWxvYWRQYXRoID0gbG9jYXRpb24uaHJlZi5yZXBsYWNlKC9bJl0/dmVyc2lvbj1bMC05Ll0rL2dpLCAnJyk7IC8vIFJlbW92ZSBvbGQgdmVyc2lvbiBpbiBxdWVyeSBwYXJhbXNcbiAgICByZWxvYWRQYXRoICs9IHJlbG9hZFBhdGguaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJzsgLy8gQWRkIHF1ZXJ5IHBhcmFtIHNlcGFyYXRvclxuICAgIHJlbG9hZFBhdGggKz0gJ3ZlcnNpb249JyArIHJlbW90ZVZlcnNpb247IC8vIEFkZCB2ZXJzaW9uICh0byBhdm9pZCBhIHJlbG9hZCBpbmZpbml0ZSBsb29wKVxuXG4gICAgLy8gQWxyZWFkeSB0cnkgdG8gcmVsb2FkLCBidXQgdmVyc2lvbiBzdGlsbCBiYWRcbiAgICBpZiAocmVsb2FkUGF0aCA9PT0gbG9jYXRpb24uaHJlZikge1xuICAgICAgaWYgKGNhbkF1dG9SZWxvYWQpXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYFtwbGF0Zm9ybV0gUmVsb2FkZWQgcGFnZSBmYWlsZWQsIGJlY2F1c2UgdmVyc2lvbiBzdGlsbCBtaXNtYXRjaCEgUGxlYXNlIGNoZWNrIHZlcnNpb24uYXBwdXAgZmlsZSAoZXhwZWN0ZWQgYXBwIHZlcnNpb246ICR7YWN0dWFsVmVyc2lvbn0pYFxuICAgICAgICApO1xuICAgICAgLy8gU3RvcCB0aW1lciwgdG8gYXZvaWQgaW5maW5pdGUgbG9vcFxuICAgICAgdGhpcy5jaGVja0FwcFZlcnNpb25UaW1lcj8udW5zdWJzY3JpYmUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zb2xlLndhcm4oYFtwbGF0Zm9ybV0gTW9yZSByZWNlbnQgdmVyc2lvbiBkZXRlY3RlZCAocmVtb3RlOiAke3JlbW90ZVZlcnNpb259LCBhY3R1YWw6ICR7YWN0dWFsVmVyc2lvbn1gKTtcblxuICAgIC8vIEF1dG8gcmVsb2FkXG4gICAgaWYgKGNhbkF1dG9SZWxvYWQpIHtcbiAgICAgIGNvbnNvbGUuaW5mbygnW3BsYXRmb3JtXSBXaWxsIHJlbG9hZGluZyBhdCAnICsgcmVsb2FkUGF0aCk7XG4gICAgICBsb2NhdGlvbi5ocmVmID0gcmVsb2FkUGF0aDtcbiAgICAgIC8vIEFwcCBzdG9wXG4gICAgfVxuICAgIC8vIEFzayB1c2VyIHRvIHJlbG9hZFxuICAgIGVsc2Uge1xuICAgICAgLy8gU3RvcCB0aW1lciwgdG8gYXZvaWQgaW5maW5pdGUgbG9vcFxuICAgICAgdGhpcy5jaGVja0FwcFZlcnNpb25UaW1lcj8udW5zdWJzY3JpYmUoKTtcblxuICAgICAgLy8gRGlzcGxheSBhIHJlbG9hZCB0b2FzdFxuICAgICAgYXdhaXQgdGhpcy5zaG93VG9hc3Qoe1xuICAgICAgICBtZXNzYWdlOiAnQ09ORklSTS5SRUxPQURfQVBQJyxcbiAgICAgICAgbWVzc2FnZVBhcmFtczogeyB2ZXJzaW9uOiByZW1vdGVWZXJzaW9uLCBuYW1lOiB0aGlzLmVudmlyb25tZW50Lm5hbWUgfSxcbiAgICAgICAgdHlwZTogJ2luZm8nLFxuICAgICAgICBkdXJhdGlvbjogLTEsXG4gICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgYnV0dG9uczogW1xuICAgICAgICAgIC8vIFJlbG9hZCBidXR0b25cbiAgICAgICAgICB7XG4gICAgICAgICAgICB0ZXh0OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdDT01NT04uQlROX1VQREFURScpLFxuICAgICAgICAgICAgc2lkZTogJ2VuZCcsXG4gICAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWYgPSByZWxvYWRQYXRoO1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzaG93VG9hc3Qob3B0czogU2hvd1RvYXN0T3B0aW9ucyk6IFByb21pc2U8SFRNTElvblRvYXN0RWxlbWVudD4ge1xuICAgIGlmICghdGhpcy50b2FzdENvbnRyb2xsZXIpIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgdG9hc3RDb250cm9sbGVyIGluIGNvbXBvbmVudCdzIGNvbnN0cnVjdG9yXCIpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT5cbiAgICAgIFRvYXN0cy5zaG93KHRoaXMudG9hc3RDb250cm9sbGVyLCB0aGlzLnRyYW5zbGF0ZSwge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBvbldpbGxQcmVzZW50OiAodCkgPT4gcmVzb2x2ZSh0KSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBvblN0YXJ0dXBFcnJvcihlcnIpIHtcbiAgICBjb25zb2xlLmVycm9yKCdbcGxhdGZvcm1dIEZhaWxlZCBzdGFydGluZyB0aGUgcGxhdGZvcm0hICcgKyBKU09OLnN0cmluZ2lmeShlcnIpKTtcbiAgICBsZXQgbWVzc2FnZSA9IChlcnIgJiYgZXJyLm1lc3NhZ2UpIHx8IGVycjtcbiAgICBjb25zdCBkZXRhaWxzTWVzc2FnZSA9IGVyciAmJiAoKGVyci5kZXRhaWxzICYmIGVyci5kZXRhaWxzLm1lc3NhZ2UpIHx8IGVyci5kZXRhaWxzKTtcbiAgICAvLyBTZXQgc3BlY2lmaWMgZXJyb3Igd2hlbiBGaXJlZm94IGlzIGluIHByaXZhdGUgbW9kZSBvciBoaXN0b3J5IG5ldmVyIHJlbWVtYmVyZWQgKHNlZSBNYW50aXMgSWZyZW1lciAjNTY0NDEpXG4gICAgaWYgKGVyci5jb2RlID09PSAxMSAmJiB0aGlzLmNka1BsYXRmb3JtLkZJUkVGT1gpIHtcbiAgICAgIG1lc3NhZ2UgPSAnRVJST1IuRklSRUZPWF9OT19TVE9SQUdFJztcbiAgICB9XG4gICAgaWYgKHRoaXMudHJhbnNsYXRlKSB7XG4gICAgICBtZXNzYWdlID0gYXdhaXQgdGhpcy50cmFuc2xhdGUuaW5zdGFudChtZXNzYWdlKTtcbiAgICAgIGlmIChlcnIgJiYgZXJyLmNvZGUpIHtcbiAgICAgICAgbWVzc2FnZSArPSBgIHtjb2RlOiAke2Vyci5jb2RlfX1gO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBtZXNzYWdlID0gYEZhdGFsIGVycm9yOiBQbGVhc2UgY29udGFjdCB5b3VyIGFkbWluaXN0cmF0b3IuXFxuXFxue2NvZGU6ICR7KGVyciAmJiBlcnIuY29kZSkgfHwgJ251bGwnfSwgbWVzc2FnZTogXCIke21lc3NhZ2V9XCJ9YDtcbiAgICB9XG4gICAgaWYgKHRoaXMudG9hc3RDb250cm9sbGVyKSB7XG4gICAgICBpZiAoZGV0YWlsc01lc3NhZ2UpIHtcbiAgICAgICAgbWVzc2FnZSArPSBgPGJyLz48c21hbGw+JHtkZXRhaWxzTWVzc2FnZX08L3NtYWxsPmA7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLnNob3dUb2FzdCh7XG4gICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgIGR1cmF0aW9uOiAtMSxcbiAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh3aW5kb3cpIHtcbiAgICAgIGlmIChkZXRhaWxzTWVzc2FnZSkge1xuICAgICAgICBtZXNzYWdlICs9IGBcXG5cXG57Y2F1c2U6IFwiJHtkZXRhaWxzTWVzc2FnZX1cIn1gO1xuICAgICAgfVxuICAgICAgd2luZG93LmFsZXJ0KG1lc3NhZ2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgaWYgKGVyciAmJiBlcnIuZGV0YWlscykgY29uc29sZS5lcnJvcignY2F1c2UnLCBlcnIuZGV0YWlscyk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -70,11 +70,11 @@ export class ActionsColumnComponent {
70
70
  this.forward.unsubscribe();
71
71
  }
72
72
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: ActionsColumnComponent, deps: [{ token: i1.MatTable }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
73
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.4", type: ActionsColumnComponent, selector: "app-actions-column", inputs: { matColumnDef: "matColumnDef", style: "style", stickyEnd: "stickyEnd", canCancel: "canCancel", canConfirm: "canConfirm", canDelete: "canDelete", canBackward: "canBackward", canForward: "canForward", canConfirmAndAdd: "canConfirmAndAdd", dirtyIcon: "dirtyIcon", optionsTitle: "optionsTitle", classList: ["class", "classList"], cellTemplate: "cellTemplate" }, outputs: { optionsClick: "optionsClick", cancelOrDeleteClick: "cancelOrDeleteClick", confirmEditCreateClick: "confirmEditCreateClick", confirmAndAddClick: "confirmAndAddClick", backward: "backward", forward: "forward" }, viewQueries: [{ propertyName: "columnDef", first: true, predicate: MatColumnDef, descendants: true }, { propertyName: "matMenuTrigger", first: true, predicate: MatMenuTrigger, descendants: true }], ngImport: i0, template: "<ng-container [matColumnDef]=\"matColumnDef\" [stickyEnd]=\"stickyEnd\" [ngSwitch]=\"style\">\n <ng-container *ngSwitchCase=\"'table'\">\n <th mat-header-cell *matHeaderCellDef [class]=\"classList\" [class.mat-column-sticky]=\"stickyEnd\">\n <button\n mat-icon-button\n *ngIf=\"optionsClick.observers | isNotEmptyArray\"\n [title]=\"optionsTitle | translate\"\n (click)=\"optionsClick.emit($event)\"\n >\n <mat-icon>more_vert</mat-icon>\n </button>\n <ng-content select=\"[matHeader]\"></ng-content>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class]=\"classList\">\n <ng-container *ngIf=\"row.editing; else view\">\n <!-- pending -->\n <ion-spinner *ngIf=\"row.validator?.pending\" name=\"dots\" class=\"center\"></ion-spinner>\n\n <!-- Confirm button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"canConfirm && row.editing && row.validator?.dirty && row.validator?.valid\"\n [title]=\"'COMMON.BTN_APPLY' | translate\"\n (click)=\"confirmEditCreateClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>checkmark</mat-icon>\n </button>\n\n <!-- new row -->\n <ng-container *ngIf=\"row.id === -1; else existingRow\">\n <!-- delete button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"canDelete && row.validator?.invalid\"\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n (click)=\"cancelOrDeleteClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>delete_outline</mat-icon>\n </button>\n\n <!-- add button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"!canForward && canConfirmAndAdd && row.validator?.valid\"\n [title]=\"'COMMON.BTN_ADD' | translate\"\n (click)=\"confirmAndAddClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>add</mat-icon>\n </button>\n\n <!-- next button (invisible - focusable only) -->\n <button\n class=\"mat-row-action-button\"\n style=\"color: transparent; position: absolute; top: 0; margin: 0; padding: 0; width: 0\"\n *ngIf=\"canForward && row.validator?.valid\"\n (focus)=\"this.forward.emit({ event: $event, row: row })\"\n ></button>\n </ng-container>\n\n <!-- existing row -->\n <ng-template #existingRow>\n <!-- cancel button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"canCancel && row.validator?.dirty\"\n [title]=\"'COMMON.BTN_UNDO' | translate\"\n (click)=\"cancelOrDeleteClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>undo</mat-icon>\n </button>\n\n <!-- next button (invisible - focusable only) -->\n <button\n class=\"mat-row-action-button\"\n style=\"color: transparent; position: absolute; top: 0; margin: 0; padding: 0; width: 0\"\n *ngIf=\"canForward && row.validator?.valid\"\n (focus)=\"this.forward.emit({ event: $event, row: row })\"\n ></button>\n </ng-template>\n </ng-container>\n\n <ng-template #view>\n <!-- dirty icon -->\n <ion-icon\n *ngIf=\"dirtyIcon && row.validator?.dirty\"\n [name]=\"dirtyIcon\"\n color=\"accent\"\n class=\"dirty-icon\"\n ></ion-icon>\n\n <!-- backward button (invisible - focusable only) -->\n <button\n mat-icon-button\n class=\"mat-row-action-button\"\n style=\"color: transparent; position: absolute; top: 0; margin: 0; padding: 0; width: 0\"\n *ngIf=\"canBackward\"\n (focus)=\"this.backward.emit({ event: $event, row: row })\"\n ></button>\n </ng-template>\n\n <ng-container *ngTemplateOutlet=\"cellTemplate; context: { $implicit: row }\"></ng-container>\n </td>\n\n <td mat-footer-cell *matFooterCellDef>\n <ng-content select=\"[matFooter]\"></ng-content>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'mat-table'\">\n <mat-header-cell *matHeaderCellDef [class]=\"classList\" [class.mat-column-sticky]=\"stickyEnd\">\n <button\n mat-icon-button\n *ngIf=\"optionsClick.observers | isNotEmptyArray\"\n [title]=\"optionsTitle | translate\"\n (click)=\"optionsClick.emit($event)\"\n >\n <mat-icon>more_vert</mat-icon>\n </button>\n <ng-content select=\"[matHeader]\"></ng-content>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row\" [class]=\"classList\">\n <ng-container *ngIf=\"row.editing; else view\">\n <!-- pending -->\n <ion-spinner *ngIf=\"row.validator?.pending\" name=\"dots\" class=\"center\"></ion-spinner>\n\n <!-- Confirm button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"canConfirm && row.editing && row.validator?.dirty && row.validator?.valid\"\n [title]=\"'COMMON.BTN_APPLY' | translate\"\n (click)=\"confirmEditCreateClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>checkmark</mat-icon>\n </button>\n\n <!-- new row -->\n <ng-container *ngIf=\"row.id === -1; else existingRow\">\n <!-- delete button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"canDelete && row.validator?.invalid\"\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n (click)=\"cancelOrDeleteClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>delete_outline</mat-icon>\n </button>\n\n <!-- add button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"!canForward && canConfirmAndAdd && row.validator?.valid\"\n [title]=\"'COMMON.BTN_ADD' | translate\"\n (click)=\"confirmAndAddClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>add</mat-icon>\n </button>\n\n <!-- next button (invisible - focusable only) -->\n <button\n class=\"mat-row-action-button\"\n style=\"color: transparent; position: absolute; top: 0; margin: 0; padding: 0; width: 0\"\n *ngIf=\"canForward && row.validator?.valid\"\n (focus)=\"this.forward.emit({ event: $event, row: row })\"\n ></button>\n </ng-container>\n\n <!-- existing row -->\n <ng-template #existingRow>\n <!-- cancel button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"canCancel && row.validator?.dirty\"\n [title]=\"'COMMON.BTN_UNDO' | translate\"\n (click)=\"cancelOrDeleteClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>undo</mat-icon>\n </button>\n\n <!-- next button (invisible - focusable only) -->\n <button\n class=\"mat-row-action-button\"\n style=\"color: transparent; position: absolute; top: 0; margin: 0; padding: 0; width: 0\"\n *ngIf=\"canForward && row.validator?.valid\"\n (focus)=\"this.forward.emit({ event: $event, row: row })\"\n ></button>\n </ng-template>\n </ng-container>\n\n <ng-template #view>\n <!-- dirty icon -->\n <ion-icon\n *ngIf=\"dirtyIcon && row.validator?.dirty\"\n [name]=\"dirtyIcon\"\n color=\"accent\"\n class=\"dirty-icon\"\n ></ion-icon>\n\n <!-- backward button (invisible - focusable only) -->\n <button\n mat-icon-button\n class=\"mat-row-action-button\"\n style=\"color: transparent; position: absolute; top: 0; margin: 0; padding: 0; width: 0\"\n *ngIf=\"canBackward\"\n (focus)=\"this.backward.emit({ event: $event, row: row })\"\n ></button>\n </ng-template>\n\n <ng-container *ngTemplateOutlet=\"cellTemplate; context: { $implicit: row }\"></ng-container>\n </mat-cell>\n\n <mat-footer-cell *matFooterCellDef>\n <ng-content select=\"[matFooter]\"></ng-content>\n </mat-footer-cell>\n </ng-container>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i3.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i3.IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "directive", type: i1.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i1.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i1.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i1.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i1.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i1.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i1.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }, { kind: "pipe", type: i7.NotEmptyArrayPipe, name: "isNotEmptyArray" }] });
73
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.4", type: ActionsColumnComponent, selector: "app-actions-column", inputs: { matColumnDef: "matColumnDef", style: "style", stickyEnd: "stickyEnd", canCancel: "canCancel", canConfirm: "canConfirm", canDelete: "canDelete", canBackward: "canBackward", canForward: "canForward", canConfirmAndAdd: "canConfirmAndAdd", dirtyIcon: "dirtyIcon", optionsTitle: "optionsTitle", classList: ["class", "classList"], cellTemplate: "cellTemplate" }, outputs: { optionsClick: "optionsClick", cancelOrDeleteClick: "cancelOrDeleteClick", confirmEditCreateClick: "confirmEditCreateClick", confirmAndAddClick: "confirmAndAddClick", backward: "backward", forward: "forward" }, viewQueries: [{ propertyName: "columnDef", first: true, predicate: MatColumnDef, descendants: true }, { propertyName: "matMenuTrigger", first: true, predicate: MatMenuTrigger, descendants: true }], ngImport: i0, template: "<ng-container [matColumnDef]=\"matColumnDef\" [stickyEnd]=\"stickyEnd\" [ngSwitch]=\"style\">\n <ng-container *ngSwitchCase=\"'table'\">\n <th mat-header-cell *matHeaderCellDef [class]=\"classList\" [class.mat-column-sticky]=\"stickyEnd\">\n <button\n mat-icon-button\n *ngIf=\"optionsClick.observers | isNotEmptyArray\"\n [title]=\"optionsTitle | translate\"\n (click)=\"optionsClick.emit($event)\"\n >\n <mat-icon>more_vert</mat-icon>\n </button>\n <ng-content select=\"[matHeader]\"></ng-content>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class]=\"classList\">\n <ng-container *ngIf=\"row.editing; else view\">\n <!-- pending -->\n <ion-spinner *ngIf=\"row.validator?.pending\" name=\"dots\" class=\"center\"></ion-spinner>\n\n <!-- Confirm button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"canConfirm && row.editing && row.validator?.dirty && row.validator?.valid\"\n [title]=\"'COMMON.BTN_APPLY' | translate\"\n (click)=\"confirmEditCreateClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>checkmark</mat-icon>\n </button>\n\n <!-- new row -->\n <ng-container *ngIf=\"row.id === -1; else existingRow\">\n <!-- delete button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"canDelete && row.validator?.invalid\"\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n (click)=\"cancelOrDeleteClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>delete_outline</mat-icon>\n </button>\n\n <!-- add button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"!canForward && canConfirmAndAdd && row.validator?.valid\"\n [title]=\"'COMMON.BTN_ADD' | translate\"\n (click)=\"confirmAndAddClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>add</mat-icon>\n </button>\n\n <!-- next button (invisible - focusable only) -->\n <button\n class=\"mat-row-action-button\"\n style=\"color: transparent; position: absolute; top: 0; margin: 0; padding: 0; width: 0\"\n *ngIf=\"canForward && row.validator?.valid\"\n (focus)=\"this.forward.emit({ event: $event, row: row })\"\n ></button>\n </ng-container>\n\n <!-- existing row -->\n <ng-template #existingRow>\n <!-- cancel button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"canCancel && row.validator?.dirty\"\n [title]=\"'COMMON.BTN_UNDO' | translate\"\n (click)=\"cancelOrDeleteClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>undo</mat-icon>\n </button>\n\n <!-- next button (invisible - focusable only) -->\n <button\n class=\"mat-row-action-button\"\n style=\"color: transparent; position: absolute; top: 0; margin: 0; padding: 0; width: 0\"\n *ngIf=\"canForward && row.validator?.valid\"\n (focus)=\"this.forward.emit({ event: $event, row: row })\"\n ></button>\n </ng-template>\n </ng-container>\n\n <ng-template #view>\n <!-- dirty icon -->\n <ion-icon\n *ngIf=\"dirtyIcon && row.validator?.dirty\"\n [name]=\"dirtyIcon\"\n color=\"accent\"\n class=\"dirty-icon\"\n ></ion-icon>\n\n <!-- backward button (invisible - focusable only) -->\n <button\n mat-icon-button\n class=\"mat-row-action-button\"\n style=\"color: transparent; position: absolute; top: 0; margin: 0; padding: 0; width: 0\"\n *ngIf=\"canBackward\"\n (focus)=\"this.backward.emit({ event: $event, row: row })\"\n ></button>\n </ng-template>\n\n <ng-container *ngTemplateOutlet=\"cellTemplate; context: { $implicit: row }\"></ng-container>\n </td>\n\n <td mat-footer-cell *matFooterCellDef>\n <ng-content select=\"[matFooter]\"></ng-content>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'mat-table'\">\n <mat-header-cell *matHeaderCellDef [class]=\"classList\" [class.mat-column-sticky]=\"stickyEnd\">\n <button\n mat-icon-button\n *ngIf=\"optionsClick.observed\"\n [title]=\"optionsTitle | translate\"\n (click)=\"optionsClick.emit($event)\"\n >\n <mat-icon>more_vert</mat-icon>\n </button>\n <ng-content select=\"[matHeader]\"></ng-content>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row\" [class]=\"classList\">\n <ng-container *ngIf=\"row.editing; else view\">\n <!-- pending -->\n <ion-spinner *ngIf=\"row.validator?.pending\" name=\"dots\" class=\"center\"></ion-spinner>\n\n <!-- Confirm button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"canConfirm && row.editing && row.validator?.dirty && row.validator?.valid\"\n [title]=\"'COMMON.BTN_APPLY' | translate\"\n (click)=\"confirmEditCreateClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>checkmark</mat-icon>\n </button>\n\n <!-- new row -->\n <ng-container *ngIf=\"row.id === -1; else existingRow\">\n <!-- delete button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"canDelete && row.validator?.invalid\"\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n (click)=\"cancelOrDeleteClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>delete_outline</mat-icon>\n </button>\n\n <!-- add button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"!canForward && canConfirmAndAdd && row.validator?.valid\"\n [title]=\"'COMMON.BTN_ADD' | translate\"\n (click)=\"confirmAndAddClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>add</mat-icon>\n </button>\n\n <!-- next button (invisible - focusable only) -->\n <button\n class=\"mat-row-action-button\"\n style=\"color: transparent; position: absolute; top: 0; margin: 0; padding: 0; width: 0\"\n *ngIf=\"canForward && row.validator?.valid\"\n (focus)=\"this.forward.emit({ event: $event, row: row })\"\n ></button>\n </ng-container>\n\n <!-- existing row -->\n <ng-template #existingRow>\n <!-- cancel button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"canCancel && row.validator?.dirty\"\n [title]=\"'COMMON.BTN_UNDO' | translate\"\n (click)=\"cancelOrDeleteClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>undo</mat-icon>\n </button>\n\n <!-- next button (invisible - focusable only) -->\n <button\n class=\"mat-row-action-button\"\n style=\"color: transparent; position: absolute; top: 0; margin: 0; padding: 0; width: 0\"\n *ngIf=\"canForward && row.validator?.valid\"\n (focus)=\"this.forward.emit({ event: $event, row: row })\"\n ></button>\n </ng-template>\n </ng-container>\n\n <ng-template #view>\n <!-- dirty icon -->\n <ion-icon\n *ngIf=\"dirtyIcon && row.validator?.dirty\"\n [name]=\"dirtyIcon\"\n color=\"accent\"\n class=\"dirty-icon\"\n ></ion-icon>\n\n <!-- backward button (invisible - focusable only) -->\n <button\n mat-icon-button\n class=\"mat-row-action-button\"\n style=\"color: transparent; position: absolute; top: 0; margin: 0; padding: 0; width: 0\"\n *ngIf=\"canBackward\"\n (focus)=\"this.backward.emit({ event: $event, row: row })\"\n ></button>\n </ng-template>\n\n <ng-container *ngTemplateOutlet=\"cellTemplate; context: { $implicit: row }\"></ng-container>\n </mat-cell>\n\n <mat-footer-cell *matFooterCellDef>\n <ng-content select=\"[matFooter]\"></ng-content>\n </mat-footer-cell>\n </ng-container>\n</ng-container>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i3.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i3.IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "directive", type: i1.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i1.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i1.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i1.MatFooterCellDef, selector: "[matFooterCellDef]" }, { kind: "directive", type: i1.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i1.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "directive", type: i1.MatFooterCell, selector: "mat-footer-cell, td[mat-footer-cell]" }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }, { kind: "pipe", type: i7.NotEmptyArrayPipe, name: "isNotEmptyArray" }] });
74
74
  }
75
75
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImport: i0, type: ActionsColumnComponent, decorators: [{
76
76
  type: Component,
77
- args: [{ selector: 'app-actions-column', template: "<ng-container [matColumnDef]=\"matColumnDef\" [stickyEnd]=\"stickyEnd\" [ngSwitch]=\"style\">\n <ng-container *ngSwitchCase=\"'table'\">\n <th mat-header-cell *matHeaderCellDef [class]=\"classList\" [class.mat-column-sticky]=\"stickyEnd\">\n <button\n mat-icon-button\n *ngIf=\"optionsClick.observers | isNotEmptyArray\"\n [title]=\"optionsTitle | translate\"\n (click)=\"optionsClick.emit($event)\"\n >\n <mat-icon>more_vert</mat-icon>\n </button>\n <ng-content select=\"[matHeader]\"></ng-content>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class]=\"classList\">\n <ng-container *ngIf=\"row.editing; else view\">\n <!-- pending -->\n <ion-spinner *ngIf=\"row.validator?.pending\" name=\"dots\" class=\"center\"></ion-spinner>\n\n <!-- Confirm button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"canConfirm && row.editing && row.validator?.dirty && row.validator?.valid\"\n [title]=\"'COMMON.BTN_APPLY' | translate\"\n (click)=\"confirmEditCreateClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>checkmark</mat-icon>\n </button>\n\n <!-- new row -->\n <ng-container *ngIf=\"row.id === -1; else existingRow\">\n <!-- delete button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"canDelete && row.validator?.invalid\"\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n (click)=\"cancelOrDeleteClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>delete_outline</mat-icon>\n </button>\n\n <!-- add button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"!canForward && canConfirmAndAdd && row.validator?.valid\"\n [title]=\"'COMMON.BTN_ADD' | translate\"\n (click)=\"confirmAndAddClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>add</mat-icon>\n </button>\n\n <!-- next button (invisible - focusable only) -->\n <button\n class=\"mat-row-action-button\"\n style=\"color: transparent; position: absolute; top: 0; margin: 0; padding: 0; width: 0\"\n *ngIf=\"canForward && row.validator?.valid\"\n (focus)=\"this.forward.emit({ event: $event, row: row })\"\n ></button>\n </ng-container>\n\n <!-- existing row -->\n <ng-template #existingRow>\n <!-- cancel button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"canCancel && row.validator?.dirty\"\n [title]=\"'COMMON.BTN_UNDO' | translate\"\n (click)=\"cancelOrDeleteClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>undo</mat-icon>\n </button>\n\n <!-- next button (invisible - focusable only) -->\n <button\n class=\"mat-row-action-button\"\n style=\"color: transparent; position: absolute; top: 0; margin: 0; padding: 0; width: 0\"\n *ngIf=\"canForward && row.validator?.valid\"\n (focus)=\"this.forward.emit({ event: $event, row: row })\"\n ></button>\n </ng-template>\n </ng-container>\n\n <ng-template #view>\n <!-- dirty icon -->\n <ion-icon\n *ngIf=\"dirtyIcon && row.validator?.dirty\"\n [name]=\"dirtyIcon\"\n color=\"accent\"\n class=\"dirty-icon\"\n ></ion-icon>\n\n <!-- backward button (invisible - focusable only) -->\n <button\n mat-icon-button\n class=\"mat-row-action-button\"\n style=\"color: transparent; position: absolute; top: 0; margin: 0; padding: 0; width: 0\"\n *ngIf=\"canBackward\"\n (focus)=\"this.backward.emit({ event: $event, row: row })\"\n ></button>\n </ng-template>\n\n <ng-container *ngTemplateOutlet=\"cellTemplate; context: { $implicit: row }\"></ng-container>\n </td>\n\n <td mat-footer-cell *matFooterCellDef>\n <ng-content select=\"[matFooter]\"></ng-content>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'mat-table'\">\n <mat-header-cell *matHeaderCellDef [class]=\"classList\" [class.mat-column-sticky]=\"stickyEnd\">\n <button\n mat-icon-button\n *ngIf=\"optionsClick.observers | isNotEmptyArray\"\n [title]=\"optionsTitle | translate\"\n (click)=\"optionsClick.emit($event)\"\n >\n <mat-icon>more_vert</mat-icon>\n </button>\n <ng-content select=\"[matHeader]\"></ng-content>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row\" [class]=\"classList\">\n <ng-container *ngIf=\"row.editing; else view\">\n <!-- pending -->\n <ion-spinner *ngIf=\"row.validator?.pending\" name=\"dots\" class=\"center\"></ion-spinner>\n\n <!-- Confirm button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"canConfirm && row.editing && row.validator?.dirty && row.validator?.valid\"\n [title]=\"'COMMON.BTN_APPLY' | translate\"\n (click)=\"confirmEditCreateClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>checkmark</mat-icon>\n </button>\n\n <!-- new row -->\n <ng-container *ngIf=\"row.id === -1; else existingRow\">\n <!-- delete button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"canDelete && row.validator?.invalid\"\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n (click)=\"cancelOrDeleteClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>delete_outline</mat-icon>\n </button>\n\n <!-- add button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"!canForward && canConfirmAndAdd && row.validator?.valid\"\n [title]=\"'COMMON.BTN_ADD' | translate\"\n (click)=\"confirmAndAddClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>add</mat-icon>\n </button>\n\n <!-- next button (invisible - focusable only) -->\n <button\n class=\"mat-row-action-button\"\n style=\"color: transparent; position: absolute; top: 0; margin: 0; padding: 0; width: 0\"\n *ngIf=\"canForward && row.validator?.valid\"\n (focus)=\"this.forward.emit({ event: $event, row: row })\"\n ></button>\n </ng-container>\n\n <!-- existing row -->\n <ng-template #existingRow>\n <!-- cancel button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"canCancel && row.validator?.dirty\"\n [title]=\"'COMMON.BTN_UNDO' | translate\"\n (click)=\"cancelOrDeleteClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>undo</mat-icon>\n </button>\n\n <!-- next button (invisible - focusable only) -->\n <button\n class=\"mat-row-action-button\"\n style=\"color: transparent; position: absolute; top: 0; margin: 0; padding: 0; width: 0\"\n *ngIf=\"canForward && row.validator?.valid\"\n (focus)=\"this.forward.emit({ event: $event, row: row })\"\n ></button>\n </ng-template>\n </ng-container>\n\n <ng-template #view>\n <!-- dirty icon -->\n <ion-icon\n *ngIf=\"dirtyIcon && row.validator?.dirty\"\n [name]=\"dirtyIcon\"\n color=\"accent\"\n class=\"dirty-icon\"\n ></ion-icon>\n\n <!-- backward button (invisible - focusable only) -->\n <button\n mat-icon-button\n class=\"mat-row-action-button\"\n style=\"color: transparent; position: absolute; top: 0; margin: 0; padding: 0; width: 0\"\n *ngIf=\"canBackward\"\n (focus)=\"this.backward.emit({ event: $event, row: row })\"\n ></button>\n </ng-template>\n\n <ng-container *ngTemplateOutlet=\"cellTemplate; context: { $implicit: row }\"></ng-container>\n </mat-cell>\n\n <mat-footer-cell *matFooterCellDef>\n <ng-content select=\"[matFooter]\"></ng-content>\n </mat-footer-cell>\n </ng-container>\n</ng-container>\n" }]
77
+ args: [{ selector: 'app-actions-column', template: "<ng-container [matColumnDef]=\"matColumnDef\" [stickyEnd]=\"stickyEnd\" [ngSwitch]=\"style\">\n <ng-container *ngSwitchCase=\"'table'\">\n <th mat-header-cell *matHeaderCellDef [class]=\"classList\" [class.mat-column-sticky]=\"stickyEnd\">\n <button\n mat-icon-button\n *ngIf=\"optionsClick.observers | isNotEmptyArray\"\n [title]=\"optionsTitle | translate\"\n (click)=\"optionsClick.emit($event)\"\n >\n <mat-icon>more_vert</mat-icon>\n </button>\n <ng-content select=\"[matHeader]\"></ng-content>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class]=\"classList\">\n <ng-container *ngIf=\"row.editing; else view\">\n <!-- pending -->\n <ion-spinner *ngIf=\"row.validator?.pending\" name=\"dots\" class=\"center\"></ion-spinner>\n\n <!-- Confirm button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"canConfirm && row.editing && row.validator?.dirty && row.validator?.valid\"\n [title]=\"'COMMON.BTN_APPLY' | translate\"\n (click)=\"confirmEditCreateClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>checkmark</mat-icon>\n </button>\n\n <!-- new row -->\n <ng-container *ngIf=\"row.id === -1; else existingRow\">\n <!-- delete button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"canDelete && row.validator?.invalid\"\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n (click)=\"cancelOrDeleteClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>delete_outline</mat-icon>\n </button>\n\n <!-- add button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"!canForward && canConfirmAndAdd && row.validator?.valid\"\n [title]=\"'COMMON.BTN_ADD' | translate\"\n (click)=\"confirmAndAddClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>add</mat-icon>\n </button>\n\n <!-- next button (invisible - focusable only) -->\n <button\n class=\"mat-row-action-button\"\n style=\"color: transparent; position: absolute; top: 0; margin: 0; padding: 0; width: 0\"\n *ngIf=\"canForward && row.validator?.valid\"\n (focus)=\"this.forward.emit({ event: $event, row: row })\"\n ></button>\n </ng-container>\n\n <!-- existing row -->\n <ng-template #existingRow>\n <!-- cancel button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"canCancel && row.validator?.dirty\"\n [title]=\"'COMMON.BTN_UNDO' | translate\"\n (click)=\"cancelOrDeleteClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>undo</mat-icon>\n </button>\n\n <!-- next button (invisible - focusable only) -->\n <button\n class=\"mat-row-action-button\"\n style=\"color: transparent; position: absolute; top: 0; margin: 0; padding: 0; width: 0\"\n *ngIf=\"canForward && row.validator?.valid\"\n (focus)=\"this.forward.emit({ event: $event, row: row })\"\n ></button>\n </ng-template>\n </ng-container>\n\n <ng-template #view>\n <!-- dirty icon -->\n <ion-icon\n *ngIf=\"dirtyIcon && row.validator?.dirty\"\n [name]=\"dirtyIcon\"\n color=\"accent\"\n class=\"dirty-icon\"\n ></ion-icon>\n\n <!-- backward button (invisible - focusable only) -->\n <button\n mat-icon-button\n class=\"mat-row-action-button\"\n style=\"color: transparent; position: absolute; top: 0; margin: 0; padding: 0; width: 0\"\n *ngIf=\"canBackward\"\n (focus)=\"this.backward.emit({ event: $event, row: row })\"\n ></button>\n </ng-template>\n\n <ng-container *ngTemplateOutlet=\"cellTemplate; context: { $implicit: row }\"></ng-container>\n </td>\n\n <td mat-footer-cell *matFooterCellDef>\n <ng-content select=\"[matFooter]\"></ng-content>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'mat-table'\">\n <mat-header-cell *matHeaderCellDef [class]=\"classList\" [class.mat-column-sticky]=\"stickyEnd\">\n <button\n mat-icon-button\n *ngIf=\"optionsClick.observed\"\n [title]=\"optionsTitle | translate\"\n (click)=\"optionsClick.emit($event)\"\n >\n <mat-icon>more_vert</mat-icon>\n </button>\n <ng-content select=\"[matHeader]\"></ng-content>\n </mat-header-cell>\n <mat-cell *matCellDef=\"let row\" [class]=\"classList\">\n <ng-container *ngIf=\"row.editing; else view\">\n <!-- pending -->\n <ion-spinner *ngIf=\"row.validator?.pending\" name=\"dots\" class=\"center\"></ion-spinner>\n\n <!-- Confirm button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"canConfirm && row.editing && row.validator?.dirty && row.validator?.valid\"\n [title]=\"'COMMON.BTN_APPLY' | translate\"\n (click)=\"confirmEditCreateClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>checkmark</mat-icon>\n </button>\n\n <!-- new row -->\n <ng-container *ngIf=\"row.id === -1; else existingRow\">\n <!-- delete button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"canDelete && row.validator?.invalid\"\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n (click)=\"cancelOrDeleteClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>delete_outline</mat-icon>\n </button>\n\n <!-- add button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"!canForward && canConfirmAndAdd && row.validator?.valid\"\n [title]=\"'COMMON.BTN_ADD' | translate\"\n (click)=\"confirmAndAddClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>add</mat-icon>\n </button>\n\n <!-- next button (invisible - focusable only) -->\n <button\n class=\"mat-row-action-button\"\n style=\"color: transparent; position: absolute; top: 0; margin: 0; padding: 0; width: 0\"\n *ngIf=\"canForward && row.validator?.valid\"\n (focus)=\"this.forward.emit({ event: $event, row: row })\"\n ></button>\n </ng-container>\n\n <!-- existing row -->\n <ng-template #existingRow>\n <!-- cancel button -->\n <button\n mat-icon-button\n color=\"light\"\n *ngIf=\"canCancel && row.validator?.dirty\"\n [title]=\"'COMMON.BTN_UNDO' | translate\"\n (click)=\"cancelOrDeleteClick.emit({ event: $event, row: row })\"\n >\n <mat-icon>undo</mat-icon>\n </button>\n\n <!-- next button (invisible - focusable only) -->\n <button\n class=\"mat-row-action-button\"\n style=\"color: transparent; position: absolute; top: 0; margin: 0; padding: 0; width: 0\"\n *ngIf=\"canForward && row.validator?.valid\"\n (focus)=\"this.forward.emit({ event: $event, row: row })\"\n ></button>\n </ng-template>\n </ng-container>\n\n <ng-template #view>\n <!-- dirty icon -->\n <ion-icon\n *ngIf=\"dirtyIcon && row.validator?.dirty\"\n [name]=\"dirtyIcon\"\n color=\"accent\"\n class=\"dirty-icon\"\n ></ion-icon>\n\n <!-- backward button (invisible - focusable only) -->\n <button\n mat-icon-button\n class=\"mat-row-action-button\"\n style=\"color: transparent; position: absolute; top: 0; margin: 0; padding: 0; width: 0\"\n *ngIf=\"canBackward\"\n (focus)=\"this.backward.emit({ event: $event, row: row })\"\n ></button>\n </ng-template>\n\n <ng-container *ngTemplateOutlet=\"cellTemplate; context: { $implicit: row }\"></ng-container>\n </mat-cell>\n\n <mat-footer-cell *matFooterCellDef>\n <ng-content select=\"[matFooter]\"></ng-content>\n </mat-footer-cell>\n </ng-container>\n</ng-container>\n" }]
78
78
  }], ctorParameters: () => [{ type: i1.MatTable }, { type: i0.ChangeDetectorRef }], propDecorators: { columnDef: [{
79
79
  type: ViewChild,
80
80
  args: [MatColumnDef]
@@ -121,4 +121,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.4", ngImpor
121
121
  }], forward: [{
122
122
  type: Output
123
123
  }] } });
124
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9ucy1jb2x1bW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL3RhYmxlL2FjdGlvbnMtY29sdW1uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS90YWJsZS9hY3Rpb25zLWNvbHVtbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXJJLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLHlCQUF5QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7O0FBTXhELE1BQU0sT0FBTyxzQkFBc0I7SUEyQnZCO0lBQ0E7SUEzQmUsU0FBUyxDQUFlO0lBQ3RCLGNBQWMsQ0FBaUI7SUFFakQsWUFBWSxHQUFHLFNBQVMsQ0FBQztJQUN6QixLQUFLLEdBQTBCLE9BQU8sQ0FBQztJQUN2QyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLFNBQVMsQ0FBVTtJQUNuQixVQUFVLENBQVU7SUFDcEIsU0FBUyxDQUFVO0lBQ25CLFdBQVcsQ0FBVTtJQUNyQixVQUFVLENBQVU7SUFDcEIsZ0JBQWdCLENBQVU7SUFDMUIsU0FBUyxDQUFtQjtJQUM1QixZQUFZLEdBQUcsb0JBQW9CLENBQUM7SUFDN0MsMkRBQTJEO0lBQzNDLFNBQVMsQ0FBUztJQUN6QixZQUFZLENBQW1CO0lBRTlCLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO0lBQ3pDLG1CQUFtQixHQUFHLElBQUksWUFBWSxFQUE0QyxDQUFDO0lBQ25GLHNCQUFzQixHQUFHLElBQUks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OytCQUNFLG9CQUFvQjs2R0FJTCxTQUFTO3NCQUFqQyxTQUFTO3VCQUFDLFlBQVk7Z0JBQ0ksY0FBYztzQkFBeEMsU0FBUzt1QkFBQyxjQUFjO2dCQUVoQixZQUFZO3NCQUFwQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVVLFNBQVM7c0JBQXhCLEtBQUs7dUJBQUMsT0FBTztnQkFDTCxZQUFZO3NCQUFwQixLQUFLO2dCQUVJLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLHNCQUFzQjtzQkFBL0IsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxPQUFPO3NCQUFoQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGFibGVFbGVtZW50IH0gZnJvbSAnQGUtaXMvbmd4LW1hdGVyaWFsLXRhYmxlJztcbmltcG9ydCB7IGlzTmlsLCB0b0Jvb2xlYW4gfSBmcm9tICcuLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7IE1hdENvbHVtbkRlZiwgTWF0VGFibGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBNYXRNZW51VHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtYWN0aW9ucy1jb2x1bW4nLFxuICB0ZW1wbGF0ZVVybDogJy4vYWN0aW9ucy1jb2x1bW4uY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBBY3Rpb25zQ29sdW1uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKE1hdENvbHVtbkRlZikgY29sdW1uRGVmOiBNYXRDb2x1bW5EZWY7XG4gIEBWaWV3Q2hpbGQoTWF0TWVudVRyaWdnZXIpIG1hdE1lbnVUcmlnZ2VyOiBNYXRNZW51VHJpZ2dlcjtcblxuICBASW5wdXQoKSBtYXRDb2x1bW5EZWYgPSAnYWN0aW9ucyc7XG4gIEBJbnB1dCgpIHN0eWxlOiAndGFibGUnIHwgJ21hdC10YWJsZScgPSAndGFibGUnO1xuICBASW5wdXQoKSBzdGlja3lFbmQgPSBmYWxzZTtcbiAgQElucHV0KCkgY2FuQ2FuY2VsOiBib29sZWFuO1xuICBASW5wdXQoKSBjYW5Db25maXJtOiBib29sZWFuO1xuICBASW5wdXQoKSBjYW5EZWxldGU6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGNhbkJhY2t3YXJkOiBib29sZWFuO1xuICBASW5wdXQoKSBjYW5Gb3J3YXJkOiBib29sZWFuO1xuICBASW5wdXQoKSBjYW5Db25maXJtQW5kQWRkOiBib29sZWFuO1xuICBASW5wdXQoKSBkaXJ0eUljb246IGJvb2xlYW4gfCBzdHJpbmc7XG4gIEBJbnB1dCgpIG9wdGlvbnNUaXRsZSA9ICdDT01NT04uQlROX09QVElPTlMnO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWlucHV0LXJlbmFtZVxuICBASW5wdXQoJ2NsYXNzJykgY2xhc3NMaXN0OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICBAT3V0cHV0KCkgb3B0aW9uc0NsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgQE91dHB1dCgpIGNhbmNlbE9yRGVsZXRlQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZXZlbnQ6IEV2ZW50OyByb3c6IFRhYmxlRWxlbWVudDxhbnk+IH0+KCk7XG4gIEBPdXRwdXQoKSBjb25maXJtRWRpdENyZWF0ZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx7IGV2ZW50OiBFdmVudDsgcm93OiBUYWJsZUVsZW1lbnQ8YW55PiB9PigpO1xuICBAT3V0cHV0KCkgY29uZmlybUFuZEFkZENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx7IGV2ZW50OiBFdmVudDsgcm93OiBUYWJsZUVsZW1lbnQ8YW55PiB9PigpO1xuICBAT3V0cHV0KCkgYmFja3dhcmQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZXZlbnQ6IEV2ZW50OyByb3c6IFRhYmxlRWxlbWVudDxhbnk+IH0+KCk7XG4gIEBPdXRwdXQoKSBmb3J3YXJkID0gbmV3IEV2ZW50RW1pdHRlcjx7IGV2ZW50OiBFdmVudDsgcm93OiBUYWJsZUVsZW1lbnQ8YW55PiB9PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdGFibGU6IE1hdFRhYmxlPGFueT4sXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgLy8gVE9ETyBhdXRvIGNvbmZpZ3VyZSB1c2luZyBBcHBUYWJsZSA/IChuZWVkIGEgZm9yd2FyZFJlZigpIGluIHRoZSB0YWJsZSBjb21wb25lbnRcbiAgICAvL0BPcHRpb25hbCgpIHByaXZhdGUgYXBwVGFibGU6IEFwcFRhYmxlPGFueT5cbiAgICBpZiAoIXRhYmxlKSB0aHJvdyBuZXcgRXJyb3IoYFthY3Rpb25zLWNvbHVtbl0gdGhpcyBjb2x1bW4gY29tcG9uZW50IG11c3QgYmUgaW5zaWRlIGEgTWF0VGFibGUgY29tcG9uZW50YCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICB0aGlzLnRhYmxlLmFkZENvbHVtbkRlZih0aGlzLmNvbHVtbkRlZik7XG4gICAgdGhpcy5jYW5DYW5jZWwgPSB0b0Jvb2xlYW4odGhpcy5jYW5DYW5jZWwsIHRoaXMuY2FuY2VsT3JEZWxldGVDbGljay5vYnNlcnZlcnMubGVuZ3RoID4gMCk7XG4gICAgdGhpcy5jYW5Db25maXJtID0gdG9Cb29sZWFuKHRoaXMuY2FuQ29uZmlybSwgdGhpcy5jb25maXJtRWRpdENyZWF0ZUNsaWNrLm9ic2VydmVycy5sZW5ndGggPiAwKTtcbiAgICB0aGlzLmNhbkRlbGV0ZSA9IHRvQm9vbGVhbih0aGlzLmNhbkRlbGV0ZSwgdGhpcy5jYW5jZWxPckRlbGV0ZUNsaWNrLm9ic2VydmVycy5sZW5ndGggPiAwKTtcbiAgICB0aGlzLmNhbkNvbmZpcm1BbmRBZGQgPSB0b0Jvb2xlYW4odGhpcy5jYW5Db25maXJtQW5kQWRkLCB0aGlzLmNvbmZpcm1BbmRBZGRDbGljay5vYnNlcnZlcnMubGVuZ3RoID4gMCk7XG4gICAgdGhpcy5jYW5CYWNrd2FyZCA9IHRvQm9vbGVhbih0aGlzLmNhbkJhY2t3YXJkLCB0aGlzLmJhY2t3YXJkLm9ic2VydmVycy5sZW5ndGggPiAwKTtcbiAgICB0aGlzLmNhbkZvcndhcmQgPSB0b0Jvb2xlYW4odGhpcy5jYW5Gb3J3YXJkLCB0aGlzLmZvcndhcmQub2JzZXJ2ZXJzLmxlbmd0aCA+IDApO1xuICAgIGlmIChpc05pbCh0aGlzLmRpcnR5SWNvbikpIHtcbiAgICAgIHRoaXMuZGlydHlJY29uID0gJ3N0YXInO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMudGFibGUucmVtb3ZlQ29sdW1uRGVmKHRoaXMuY29sdW1uRGVmKTtcbiAgICB0aGlzLm9wdGlvbnNDbGljay5jb21wbGV0ZSgpO1xuICAgIHRoaXMub3B0aW9uc0NsaWNrLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jYW5jZWxPckRlbGV0ZUNsaWNrLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5jYW5jZWxPckRlbGV0ZUNsaWNrLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jb25maXJtQW5kQWRkQ2xpY2suY29tcGxldGUoKTtcbiAgICB0aGlzLmNvbmZpcm1BbmRBZGRDbGljay51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuYmFja3dhcmQuY29tcGxldGUoKTtcbiAgICB0aGlzLmJhY2t3YXJkLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5mb3J3YXJkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5mb3J3YXJkLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgW21hdENvbHVtbkRlZl09XCJtYXRDb2x1bW5EZWZcIiBbc3RpY2t5RW5kXT1cInN0aWNreUVuZFwiIFtuZ1N3aXRjaF09XCJzdHlsZVwiPlxuICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndGFibGUnXCI+XG4gICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBbY2xhc3NdPVwiY2xhc3NMaXN0XCIgW2NsYXNzLm1hdC1jb2x1bW4tc3RpY2t5XT1cInN0aWNreUVuZFwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgKm5nSWY9XCJvcHRpb25zQ2xpY2sub2JzZXJ2ZXJzIHwgaXNOb3RFbXB0eUFycmF5XCJcbiAgICAgICAgW3RpdGxlXT1cIm9wdGlvbnNUaXRsZSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIChjbGljayk9XCJvcHRpb25zQ2xpY2suZW1pdCgkZXZlbnQpXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uPm1vcmVfdmVydDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRIZWFkZXJdXCI+PC9uZy1jb250ZW50PlxuICAgIDwvdGg+XG4gICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIFtjbGFzc109XCJjbGFzc0xpc3RcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyb3cuZWRpdGluZzsgZWxzZSB2aWV3XCI+XG4gICAgICAgIDwhLS0gcGVuZGluZyAtLT5cbiAgICAgICAgPGlvbi1zcGlubmVyICpuZ0lmPVwicm93LnZhbGlkYXRvcj8ucGVuZGluZ1wiIG5hbWU9XCJkb3RzXCIgY2xhc3M9XCJjZW50ZXJcIj48L2lvbi1zcGlubmVyPlxuXG4gICAgICAgIDwhLS0gQ29uZmlybSBidXR0b24gLS0+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICBjb2xvcj1cImxpZ2h0XCJcbiAgICAgICAgICAqbmdJZj1cImNhbkNvbmZpcm0gJiYgcm93LmVkaXRpbmcgJiYgcm93LnZhbGlkYXRvcj8uZGlydHkgJiYgcm93LnZhbGlkYXRvcj8udmFsaWRcIlxuICAgICAgICAgIFt0aXRsZV09XCInQ09NTU9OLkJUTl9BUFBMWScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIChjbGljayk9XCJjb25maXJtRWRpdENyZWF0ZUNsaWNrLmVtaXQoeyBldmVudDogJGV2ZW50LCByb3c6IHJvdyB9KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LWljb24+Y2hlY2ttYXJrPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPCEtLSBuZXcgcm93IC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm93LmlkID09PSAtMTsgZWxzZSBleGlzdGluZ1Jvd1wiPlxuICAgICAgICAgIDwhLS0gZGVsZXRlIGJ1dHRvbiAtLT5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgIGNvbG9yPVwibGlnaHRcIlxuICAgICAgICAgICAgKm5nSWY9XCJjYW5EZWxldGUgJiYgcm93LnZhbGlkYXRvcj8uaW52YWxpZFwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fREVMRVRFJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2FuY2VsT3JEZWxldGVDbGljay5lbWl0KHsgZXZlbnQ6ICRldmVudCwgcm93OiByb3cgfSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5kZWxldGVfb3V0bGluZTwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8IS0tIGFkZCBidXR0b24gLS0+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICBjb2xvcj1cImxpZ2h0XCJcbiAgICAgICAgICAgICpuZ0lmPVwiIWNhbkZvcndhcmQgJiYgY2FuQ29uZmlybUFuZEFkZCAmJiByb3cudmFsaWRhdG9yPy52YWxpZFwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fQUREJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY29uZmlybUFuZEFkZENsaWNrLmVtaXQoeyBldmVudDogJGV2ZW50LCByb3c6IHJvdyB9KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8IS0tIG5leHQgYnV0dG9uIChpbnZpc2libGUgLSBmb2N1c2FibGUgb25seSkgLS0+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJtYXQtcm93LWFjdGlvbi1idXR0b25cIlxuICAgICAgICAgICAgc3R5bGU9XCJjb2xvcjogdHJhbnNwYXJlbnQ7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IHdpZHRoOiAwXCJcbiAgICAgICAgICAgICpuZ0lmPVwiY2FuRm9yd2FyZCAmJiByb3cudmFsaWRhdG9yPy52YWxpZFwiXG4gICAgICAgICAgICAoZm9jdXMpPVwidGhpcy5mb3J3YXJkLmVtaXQoeyBldmVudDogJGV2ZW50LCByb3c6IHJvdyB9KVwiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIGV4aXN0aW5nIHJvdyAtLT5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNleGlzdGluZ1Jvdz5cbiAgICAgICAgICA8IS0tIGNhbmNlbCBidXR0b24gLS0+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICBjb2xvcj1cImxpZ2h0XCJcbiAgICAgICAgICAgICpuZ0lmPVwiY2FuQ2FuY2VsICYmIHJvdy52YWxpZGF0b3I/LmRpcnR5XCJcbiAgICAgICAgICAgIFt0aXRsZV09XCInQ09NTU9OLkJUTl9VTkRPJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2FuY2VsT3JEZWxldGVDbGljay5lbWl0KHsgZXZlbnQ6ICRldmVudCwgcm93OiByb3cgfSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtaWNvbj51bmRvPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDwhLS0gbmV4dCBidXR0b24gKGludmlzaWJsZSAtIGZvY3VzYWJsZSBvbmx5KSAtLT5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cIm1hdC1yb3ctYWN0aW9uLWJ1dHRvblwiXG4gICAgICAgICAgICBzdHlsZT1cImNvbG9yOiB0cmFuc3BhcmVudDsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDA7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgd2lkdGg6IDBcIlxuICAgICAgICAgICAgKm5nSWY9XCJjYW5Gb3J3YXJkICYmIHJvdy52YWxpZGF0b3I/LnZhbGlkXCJcbiAgICAgICAgICAgIChmb2N1cyk9XCJ0aGlzLmZvcndhcmQuZW1pdCh7IGV2ZW50OiAkZXZlbnQsIHJvdzogcm93IH0pXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLXRlbXBsYXRlICN2aWV3PlxuICAgICAgICA8IS0tIGRpcnR5IGljb24gLS0+XG4gICAgICAgIDxpb24taWNvblxuICAgICAgICAgICpuZ0lmPVwiZGlydHlJY29uICYmIHJvdy52YWxpZGF0b3I/LmRpcnR5XCJcbiAgICAgICAgICBbbmFtZV09XCJkaXJ0eUljb25cIlxuICAgICAgICAgIGNvbG9yPVwiYWNjZW50XCJcbiAgICAgICAgICBjbGFzcz1cImRpcnR5LWljb25cIlxuICAgICAgICA+PC9pb24taWNvbj5cblxuICAgICAgICA8IS0tIGJhY2t3YXJkIGJ1dHRvbiAoaW52aXNpYmxlIC0gZm9jdXNhYmxlIG9ubHkpIC0tPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJtYXQtcm93LWFjdGlvbi1idXR0b25cIlxuICAgICAgICAgIHN0eWxlPVwiY29sb3I6IHRyYW5zcGFyZW50OyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyB3aWR0aDogMFwiXG4gICAgICAgICAgKm5nSWY9XCJjYW5CYWNrd2FyZFwiXG4gICAgICAgICAgKGZvY3VzKT1cInRoaXMuYmFja3dhcmQuZW1pdCh7IGV2ZW50OiAkZXZlbnQsIHJvdzogcm93IH0pXCJcbiAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNlbGxUZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHJvdyB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC90ZD5cblxuICAgIDx0ZCBtYXQtZm9vdGVyLWNlbGwgKm1hdEZvb3RlckNlbGxEZWY+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbbWF0Rm9vdGVyXVwiPjwvbmctY29udGVudD5cbiAgICA8L3RkPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbWF0LXRhYmxlJ1wiPlxuICAgIDxtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW2NsYXNzXT1cImNsYXNzTGlzdFwiIFtjbGFzcy5tYXQtY29sdW1uLXN0aWNreV09XCJzdGlja3lFbmRcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICpuZ0lmPVwib3B0aW9uc0NsaWNrLm9ic2VydmVycyB8IGlzTm90RW1wdHlBcnJheVwiXG4gICAgICAgIFt0aXRsZV09XCJvcHRpb25zVGl0bGUgfCB0cmFuc2xhdGVcIlxuICAgICAgICAoY2xpY2spPVwib3B0aW9uc0NsaWNrLmVtaXQoJGV2ZW50KVwiXG4gICAgICA+XG4gICAgICAgIDxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbbWF0SGVhZGVyXVwiPjwvbmctY29udGVudD5cbiAgICA8L21hdC1oZWFkZXItY2VsbD5cbiAgICA8bWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCIgW2NsYXNzXT1cImNsYXNzTGlzdFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvdy5lZGl0aW5nOyBlbHNlIHZpZXdcIj5cbiAgICAgICAgPCEtLSBwZW5kaW5nIC0tPlxuICAgICAgICA8aW9uLXNwaW5uZXIgKm5nSWY9XCJyb3cudmFsaWRhdG9yPy5wZW5kaW5nXCIgbmFtZT1cImRvdHNcIiBjbGFzcz1cImNlbnRlclwiPjwvaW9uLXNwaW5uZXI+XG5cbiAgICAgICAgPCEtLSBDb25maXJtIGJ1dHRvbiAtLT5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgIGNvbG9yPVwibGlnaHRcIlxuICAgICAgICAgICpuZ0lmPVwiY2FuQ29uZmlybSAmJiByb3cuZWRpdGluZyAmJiByb3cudmFsaWRhdG9yPy5kaXJ0eSAmJiByb3cudmFsaWRhdG9yPy52YWxpZFwiXG4gICAgICAgICAgW3RpdGxlXT1cIidDT01NT04uQlROX0FQUExZJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgKGNsaWNrKT1cImNvbmZpcm1FZGl0Q3JlYXRlQ2xpY2suZW1pdCh7IGV2ZW50OiAkZXZlbnQsIHJvdzogcm93IH0pXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxtYXQtaWNvbj5jaGVja21hcms8L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8IS0tIG5ldyByb3cgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyb3cuaWQgPT09IC0xOyBlbHNlIGV4aXN0aW5nUm93XCI+XG4gICAgICAgICAgPCEtLSBkZWxldGUgYnV0dG9uIC0tPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgY29sb3I9XCJsaWdodFwiXG4gICAgICAgICAgICAqbmdJZj1cImNhbkRlbGV0ZSAmJiByb3cudmFsaWRhdG9yPy5pbnZhbGlkXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCInQ09NTU9OLkJUTl9ERUxFVEUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjYW5jZWxPckRlbGV0ZUNsaWNrLmVtaXQoeyBldmVudDogJGV2ZW50LCByb3c6IHJvdyB9KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1pY29uPmRlbGV0ZV9vdXRsaW5lPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDwhLS0gYWRkIGJ1dHRvbiAtLT5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgIGNvbG9yPVwibGlnaHRcIlxuICAgICAgICAgICAgKm5nSWY9XCIhY2FuRm9yd2FyZCAmJiBjYW5Db25maXJtQW5kQWRkICYmIHJvdy52YWxpZGF0b3I/LnZhbGlkXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCInQ09NTU9OLkJUTl9BREQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjb25maXJtQW5kQWRkQ2xpY2suZW1pdCh7IGV2ZW50OiAkZXZlbnQsIHJvdzogcm93IH0pXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDwhLS0gbmV4dCBidXR0b24gKGludmlzaWJsZSAtIGZvY3VzYWJsZSBvbmx5KSAtLT5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cIm1hdC1yb3ctYWN0aW9uLWJ1dHRvblwiXG4gICAgICAgICAgICBzdHlsZT1cImNvbG9yOiB0cmFuc3BhcmVudDsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDA7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgd2lkdGg6IDBcIlxuICAgICAgICAgICAgKm5nSWY9XCJjYW5Gb3J3YXJkICYmIHJvdy52YWxpZGF0b3I/LnZhbGlkXCJcbiAgICAgICAgICAgIChmb2N1cyk9XCJ0aGlzLmZvcndhcmQuZW1pdCh7IGV2ZW50OiAkZXZlbnQsIHJvdzogcm93IH0pXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gZXhpc3Rpbmcgcm93IC0tPlxuICAgICAgICA8bmctdGVtcGxhdGUgI2V4aXN0aW5nUm93PlxuICAgICAgICAgIDwhLS0gY2FuY2VsIGJ1dHRvbiAtLT5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgIGNvbG9yPVwibGlnaHRcIlxuICAgICAgICAgICAgKm5nSWY9XCJjYW5DYW5jZWwgJiYgcm93LnZhbGlkYXRvcj8uZGlydHlcIlxuICAgICAgICAgICAgW3RpdGxlXT1cIidDT01NT04uQlROX1VORE8nIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJjYW5jZWxPckRlbGV0ZUNsaWNrLmVtaXQoeyBldmVudDogJGV2ZW50LCByb3c6IHJvdyB9KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1pY29uPnVuZG88L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPCEtLSBuZXh0IGJ1dHRvbiAoaW52aXNpYmxlIC0gZm9jdXNhYmxlIG9ubHkpIC0tPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwibWF0LXJvdy1hY3Rpb24tYnV0dG9uXCJcbiAgICAgICAgICAgIHN0eWxlPVwiY29sb3I6IHRyYW5zcGFyZW50OyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyB3aWR0aDogMFwiXG4gICAgICAgICAgICAqbmdJZj1cImNhbkZvcndhcmQgJiYgcm93LnZhbGlkYXRvcj8udmFsaWRcIlxuICAgICAgICAgICAgKGZvY3VzKT1cInRoaXMuZm9yd2FyZC5lbWl0KHsgZXZlbnQ6ICRldmVudCwgcm93OiByb3cgfSlcIlxuICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctdGVtcGxhdGUgI3ZpZXc+XG4gICAgICAgIDwhLS0gZGlydHkgaWNvbiAtLT5cbiAgICAgICAgPGlvbi1pY29uXG4gICAgICAgICAgKm5nSWY9XCJkaXJ0eUljb24gJiYgcm93LnZhbGlkYXRvcj8uZGlydHlcIlxuICAgICAgICAgIFtuYW1lXT1cImRpcnR5SWNvblwiXG4gICAgICAgICAgY29sb3I9XCJhY2NlbnRcIlxuICAgICAgICAgIGNsYXNzPVwiZGlydHktaWNvblwiXG4gICAgICAgID48L2lvbi1pY29uPlxuXG4gICAgICAgIDwhLS0gYmFja3dhcmQgYnV0dG9uIChpbnZpc2libGUgLSBmb2N1c2FibGUgb25seSkgLS0+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICBjbGFzcz1cIm1hdC1yb3ctYWN0aW9uLWJ1dHRvblwiXG4gICAgICAgICAgc3R5bGU9XCJjb2xvcjogdHJhbnNwYXJlbnQ7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IHdpZHRoOiAwXCJcbiAgICAgICAgICAqbmdJZj1cImNhbkJhY2t3YXJkXCJcbiAgICAgICAgICAoZm9jdXMpPVwidGhpcy5iYWNrd2FyZC5lbWl0KHsgZXZlbnQ6ICRldmVudCwgcm93OiByb3cgfSlcIlxuICAgICAgICA+PC9idXR0b24+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY2VsbFRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogcm93IH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L21hdC1jZWxsPlxuXG4gICAgPG1hdC1mb290ZXItY2VsbCAqbWF0Rm9vdGVyQ2VsbERlZj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRGb290ZXJdXCI+PC9uZy1jb250ZW50PlxuICAgIDwvbWF0LWZvb3Rlci1jZWxsPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctY29udGFpbmVyPlxuIl19
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9ucy1jb2x1bW4uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL3RhYmxlL2FjdGlvbnMtY29sdW1uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS90YWJsZS9hY3Rpb25zLWNvbHVtbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXJJLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFlBQVksRUFBWSxNQUFNLHlCQUF5QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7O0FBTXhELE1BQU0sT0FBTyxzQkFBc0I7SUEyQnZCO0lBQ0E7SUEzQmUsU0FBUyxDQUFlO0lBQ3RCLGNBQWMsQ0FBaUI7SUFFakQsWUFBWSxHQUFHLFNBQVMsQ0FBQztJQUN6QixLQUFLLEdBQTBCLE9BQU8sQ0FBQztJQUN2QyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLFNBQVMsQ0FBVTtJQUNuQixVQUFVLENBQVU7SUFDcEIsU0FBUyxDQUFVO0lBQ25CLFdBQVcsQ0FBVTtJQUNyQixVQUFVLENBQVU7SUFDcEIsZ0JBQWdCLENBQVU7SUFDMUIsU0FBUyxDQUFtQjtJQUM1QixZQUFZLEdBQUcsb0JBQW9CLENBQUM7SUFDN0MsMkRBQTJEO0lBQzNDLFNBQVMsQ0FBUztJQUN6QixZQUFZLENBQW1CO0lBRTlCLFlBQVksR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO0lBQ3pDLG1CQUFtQixHQUFHLElBQUksWUFBWSxFQUE0QyxDQUFDO0lBQ25GLHNCQUFzQixHQUFHLElBQUks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OytCQUNFLG9CQUFvQjs2R0FJTCxTQUFTO3NCQUFqQyxTQUFTO3VCQUFDLFlBQVk7Z0JBQ0ksY0FBYztzQkFBeEMsU0FBUzt1QkFBQyxjQUFjO2dCQUVoQixZQUFZO3NCQUFwQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUVVLFNBQVM7c0JBQXhCLEtBQUs7dUJBQUMsT0FBTztnQkFDTCxZQUFZO3NCQUFwQixLQUFLO2dCQUVJLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csbUJBQW1CO3NCQUE1QixNQUFNO2dCQUNHLHNCQUFzQjtzQkFBL0IsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxPQUFPO3NCQUFoQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVGFibGVFbGVtZW50IH0gZnJvbSAnQGUtaXMvbmd4LW1hdGVyaWFsLXRhYmxlJztcbmltcG9ydCB7IGlzTmlsLCB0b0Jvb2xlYW4gfSBmcm9tICcuLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7IE1hdENvbHVtbkRlZiwgTWF0VGFibGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBNYXRNZW51VHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL21lbnUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtYWN0aW9ucy1jb2x1bW4nLFxuICB0ZW1wbGF0ZVVybDogJy4vYWN0aW9ucy1jb2x1bW4uY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBBY3Rpb25zQ29sdW1uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBAVmlld0NoaWxkKE1hdENvbHVtbkRlZikgY29sdW1uRGVmOiBNYXRDb2x1bW5EZWY7XG4gIEBWaWV3Q2hpbGQoTWF0TWVudVRyaWdnZXIpIG1hdE1lbnVUcmlnZ2VyOiBNYXRNZW51VHJpZ2dlcjtcblxuICBASW5wdXQoKSBtYXRDb2x1bW5EZWYgPSAnYWN0aW9ucyc7XG4gIEBJbnB1dCgpIHN0eWxlOiAndGFibGUnIHwgJ21hdC10YWJsZScgPSAndGFibGUnO1xuICBASW5wdXQoKSBzdGlja3lFbmQgPSBmYWxzZTtcbiAgQElucHV0KCkgY2FuQ2FuY2VsOiBib29sZWFuO1xuICBASW5wdXQoKSBjYW5Db25maXJtOiBib29sZWFuO1xuICBASW5wdXQoKSBjYW5EZWxldGU6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGNhbkJhY2t3YXJkOiBib29sZWFuO1xuICBASW5wdXQoKSBjYW5Gb3J3YXJkOiBib29sZWFuO1xuICBASW5wdXQoKSBjYW5Db25maXJtQW5kQWRkOiBib29sZWFuO1xuICBASW5wdXQoKSBkaXJ0eUljb246IGJvb2xlYW4gfCBzdHJpbmc7XG4gIEBJbnB1dCgpIG9wdGlvbnNUaXRsZSA9ICdDT01NT04uQlROX09QVElPTlMnO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWlucHV0LXJlbmFtZVxuICBASW5wdXQoJ2NsYXNzJykgY2xhc3NMaXN0OiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNlbGxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICBAT3V0cHV0KCkgb3B0aW9uc0NsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxFdmVudD4oKTtcbiAgQE91dHB1dCgpIGNhbmNlbE9yRGVsZXRlQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZXZlbnQ6IEV2ZW50OyByb3c6IFRhYmxlRWxlbWVudDxhbnk+IH0+KCk7XG4gIEBPdXRwdXQoKSBjb25maXJtRWRpdENyZWF0ZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx7IGV2ZW50OiBFdmVudDsgcm93OiBUYWJsZUVsZW1lbnQ8YW55PiB9PigpO1xuICBAT3V0cHV0KCkgY29uZmlybUFuZEFkZENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx7IGV2ZW50OiBFdmVudDsgcm93OiBUYWJsZUVsZW1lbnQ8YW55PiB9PigpO1xuICBAT3V0cHV0KCkgYmFja3dhcmQgPSBuZXcgRXZlbnRFbWl0dGVyPHsgZXZlbnQ6IEV2ZW50OyByb3c6IFRhYmxlRWxlbWVudDxhbnk+IH0+KCk7XG4gIEBPdXRwdXQoKSBmb3J3YXJkID0gbmV3IEV2ZW50RW1pdHRlcjx7IGV2ZW50OiBFdmVudDsgcm93OiBUYWJsZUVsZW1lbnQ8YW55PiB9PigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdGFibGU6IE1hdFRhYmxlPGFueT4sXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcbiAgKSB7XG4gICAgLy8gVE9ETyBhdXRvIGNvbmZpZ3VyZSB1c2luZyBBcHBUYWJsZSA/IChuZWVkIGEgZm9yd2FyZFJlZigpIGluIHRoZSB0YWJsZSBjb21wb25lbnRcbiAgICAvL0BPcHRpb25hbCgpIHByaXZhdGUgYXBwVGFibGU6IEFwcFRhYmxlPGFueT5cbiAgICBpZiAoIXRhYmxlKSB0aHJvdyBuZXcgRXJyb3IoYFthY3Rpb25zLWNvbHVtbl0gdGhpcyBjb2x1bW4gY29tcG9uZW50IG11c3QgYmUgaW5zaWRlIGEgTWF0VGFibGUgY29tcG9uZW50YCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcbiAgICB0aGlzLnRhYmxlLmFkZENvbHVtbkRlZih0aGlzLmNvbHVtbkRlZik7XG4gICAgdGhpcy5jYW5DYW5jZWwgPSB0b0Jvb2xlYW4odGhpcy5jYW5DYW5jZWwsIHRoaXMuY2FuY2VsT3JEZWxldGVDbGljay5vYnNlcnZlcnMubGVuZ3RoID4gMCk7XG4gICAgdGhpcy5jYW5Db25maXJtID0gdG9Cb29sZWFuKHRoaXMuY2FuQ29uZmlybSwgdGhpcy5jb25maXJtRWRpdENyZWF0ZUNsaWNrLm9ic2VydmVycy5sZW5ndGggPiAwKTtcbiAgICB0aGlzLmNhbkRlbGV0ZSA9IHRvQm9vbGVhbih0aGlzLmNhbkRlbGV0ZSwgdGhpcy5jYW5jZWxPckRlbGV0ZUNsaWNrLm9ic2VydmVycy5sZW5ndGggPiAwKTtcbiAgICB0aGlzLmNhbkNvbmZpcm1BbmRBZGQgPSB0b0Jvb2xlYW4odGhpcy5jYW5Db25maXJtQW5kQWRkLCB0aGlzLmNvbmZpcm1BbmRBZGRDbGljay5vYnNlcnZlcnMubGVuZ3RoID4gMCk7XG4gICAgdGhpcy5jYW5CYWNrd2FyZCA9IHRvQm9vbGVhbih0aGlzLmNhbkJhY2t3YXJkLCB0aGlzLmJhY2t3YXJkLm9ic2VydmVycy5sZW5ndGggPiAwKTtcbiAgICB0aGlzLmNhbkZvcndhcmQgPSB0b0Jvb2xlYW4odGhpcy5jYW5Gb3J3YXJkLCB0aGlzLmZvcndhcmQub2JzZXJ2ZXJzLmxlbmd0aCA+IDApO1xuICAgIGlmIChpc05pbCh0aGlzLmRpcnR5SWNvbikpIHtcbiAgICAgIHRoaXMuZGlydHlJY29uID0gJ3N0YXInO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMudGFibGUucmVtb3ZlQ29sdW1uRGVmKHRoaXMuY29sdW1uRGVmKTtcbiAgICB0aGlzLm9wdGlvbnNDbGljay5jb21wbGV0ZSgpO1xuICAgIHRoaXMub3B0aW9uc0NsaWNrLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jYW5jZWxPckRlbGV0ZUNsaWNrLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5jYW5jZWxPckRlbGV0ZUNsaWNrLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jb25maXJtQW5kQWRkQ2xpY2suY29tcGxldGUoKTtcbiAgICB0aGlzLmNvbmZpcm1BbmRBZGRDbGljay51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuYmFja3dhcmQuY29tcGxldGUoKTtcbiAgICB0aGlzLmJhY2t3YXJkLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5mb3J3YXJkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5mb3J3YXJkLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiIsIjxuZy1jb250YWluZXIgW21hdENvbHVtbkRlZl09XCJtYXRDb2x1bW5EZWZcIiBbc3RpY2t5RW5kXT1cInN0aWNreUVuZFwiIFtuZ1N3aXRjaF09XCJzdHlsZVwiPlxuICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIndGFibGUnXCI+XG4gICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBbY2xhc3NdPVwiY2xhc3NMaXN0XCIgW2NsYXNzLm1hdC1jb2x1bW4tc3RpY2t5XT1cInN0aWNreUVuZFwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgKm5nSWY9XCJvcHRpb25zQ2xpY2sub2JzZXJ2ZXJzIHwgaXNOb3RFbXB0eUFycmF5XCJcbiAgICAgICAgW3RpdGxlXT1cIm9wdGlvbnNUaXRsZSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIChjbGljayk9XCJvcHRpb25zQ2xpY2suZW1pdCgkZXZlbnQpXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uPm1vcmVfdmVydDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRIZWFkZXJdXCI+PC9uZy1jb250ZW50PlxuICAgIDwvdGg+XG4gICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIFtjbGFzc109XCJjbGFzc0xpc3RcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyb3cuZWRpdGluZzsgZWxzZSB2aWV3XCI+XG4gICAgICAgIDwhLS0gcGVuZGluZyAtLT5cbiAgICAgICAgPGlvbi1zcGlubmVyICpuZ0lmPVwicm93LnZhbGlkYXRvcj8ucGVuZGluZ1wiIG5hbWU9XCJkb3RzXCIgY2xhc3M9XCJjZW50ZXJcIj48L2lvbi1zcGlubmVyPlxuXG4gICAgICAgIDwhLS0gQ29uZmlybSBidXR0b24gLS0+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICBjb2xvcj1cImxpZ2h0XCJcbiAgICAgICAgICAqbmdJZj1cImNhbkNvbmZpcm0gJiYgcm93LmVkaXRpbmcgJiYgcm93LnZhbGlkYXRvcj8uZGlydHkgJiYgcm93LnZhbGlkYXRvcj8udmFsaWRcIlxuICAgICAgICAgIFt0aXRsZV09XCInQ09NTU9OLkJUTl9BUFBMWScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgIChjbGljayk9XCJjb25maXJtRWRpdENyZWF0ZUNsaWNrLmVtaXQoeyBldmVudDogJGV2ZW50LCByb3c6IHJvdyB9KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8bWF0LWljb24+Y2hlY2ttYXJrPC9tYXQtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgPCEtLSBuZXcgcm93IC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm93LmlkID09PSAtMTsgZWxzZSBleGlzdGluZ1Jvd1wiPlxuICAgICAgICAgIDwhLS0gZGVsZXRlIGJ1dHRvbiAtLT5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgIGNvbG9yPVwibGlnaHRcIlxuICAgICAgICAgICAgKm5nSWY9XCJjYW5EZWxldGUgJiYgcm93LnZhbGlkYXRvcj8uaW52YWxpZFwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fREVMRVRFJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2FuY2VsT3JEZWxldGVDbGljay5lbWl0KHsgZXZlbnQ6ICRldmVudCwgcm93OiByb3cgfSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5kZWxldGVfb3V0bGluZTwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8IS0tIGFkZCBidXR0b24gLS0+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICBjb2xvcj1cImxpZ2h0XCJcbiAgICAgICAgICAgICpuZ0lmPVwiIWNhbkZvcndhcmQgJiYgY2FuQ29uZmlybUFuZEFkZCAmJiByb3cudmFsaWRhdG9yPy52YWxpZFwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fQUREJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY29uZmlybUFuZEFkZENsaWNrLmVtaXQoeyBldmVudDogJGV2ZW50LCByb3c6IHJvdyB9KVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8IS0tIG5leHQgYnV0dG9uIChpbnZpc2libGUgLSBmb2N1c2FibGUgb25seSkgLS0+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJtYXQtcm93LWFjdGlvbi1idXR0b25cIlxuICAgICAgICAgICAgc3R5bGU9XCJjb2xvcjogdHJhbnNwYXJlbnQ7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IHdpZHRoOiAwXCJcbiAgICAgICAgICAgICpuZ0lmPVwiY2FuRm9yd2FyZCAmJiByb3cudmFsaWRhdG9yPy52YWxpZFwiXG4gICAgICAgICAgICAoZm9jdXMpPVwidGhpcy5mb3J3YXJkLmVtaXQoeyBldmVudDogJGV2ZW50LCByb3c6IHJvdyB9KVwiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIGV4aXN0aW5nIHJvdyAtLT5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNleGlzdGluZ1Jvdz5cbiAgICAgICAgICA8IS0tIGNhbmNlbCBidXR0b24gLS0+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICBjb2xvcj1cImxpZ2h0XCJcbiAgICAgICAgICAgICpuZ0lmPVwiY2FuQ2FuY2VsICYmIHJvdy52YWxpZGF0b3I/LmRpcnR5XCJcbiAgICAgICAgICAgIFt0aXRsZV09XCInQ09NTU9OLkJUTl9VTkRPJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2FuY2VsT3JEZWxldGVDbGljay5lbWl0KHsgZXZlbnQ6ICRldmVudCwgcm93OiByb3cgfSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtaWNvbj51bmRvPC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDwhLS0gbmV4dCBidXR0b24gKGludmlzaWJsZSAtIGZvY3VzYWJsZSBvbmx5KSAtLT5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBjbGFzcz1cIm1hdC1yb3ctYWN0aW9uLWJ1dHRvblwiXG4gICAgICAgICAgICBzdHlsZT1cImNvbG9yOiB0cmFuc3BhcmVudDsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDA7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgd2lkdGg6IDBcIlxuICAgICAgICAgICAgKm5nSWY9XCJjYW5Gb3J3YXJkICYmIHJvdy52YWxpZGF0b3I/LnZhbGlkXCJcbiAgICAgICAgICAgIChmb2N1cyk9XCJ0aGlzLmZvcndhcmQuZW1pdCh7IGV2ZW50OiAkZXZlbnQsIHJvdzogcm93IH0pXCJcbiAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLXRlbXBsYXRlICN2aWV3PlxuICAgICAgICA8IS0tIGRpcnR5IGljb24gLS0+XG4gICAgICAgIDxpb24taWNvblxuICAgICAgICAgICpuZ0lmPVwiZGlydHlJY29uICYmIHJvdy52YWxpZGF0b3I/LmRpcnR5XCJcbiAgICAgICAgICBbbmFtZV09XCJkaXJ0eUljb25cIlxuICAgICAgICAgIGNvbG9yPVwiYWNjZW50XCJcbiAgICAgICAgICBjbGFzcz1cImRpcnR5LWljb25cIlxuICAgICAgICA+PC9pb24taWNvbj5cblxuICAgICAgICA8IS0tIGJhY2t3YXJkIGJ1dHRvbiAoaW52aXNpYmxlIC0gZm9jdXNhYmxlIG9ubHkpIC0tPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJtYXQtcm93LWFjdGlvbi1idXR0b25cIlxuICAgICAgICAgIHN0eWxlPVwiY29sb3I6IHRyYW5zcGFyZW50OyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyB3aWR0aDogMFwiXG4gICAgICAgICAgKm5nSWY9XCJjYW5CYWNrd2FyZFwiXG4gICAgICAgICAgKGZvY3VzKT1cInRoaXMuYmFja3dhcmQuZW1pdCh7IGV2ZW50OiAkZXZlbnQsIHJvdzogcm93IH0pXCJcbiAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNlbGxUZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHJvdyB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPC90ZD5cblxuICAgIDx0ZCBtYXQtZm9vdGVyLWNlbGwgKm1hdEZvb3RlckNlbGxEZWY+XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbbWF0Rm9vdGVyXVwiPjwvbmctY29udGVudD5cbiAgICA8L3RkPlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInbWF0LXRhYmxlJ1wiPlxuICAgIDxtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW2NsYXNzXT1cImNsYXNzTGlzdFwiIFtjbGFzcy5tYXQtY29sdW1uLXN0aWNreV09XCJzdGlja3lFbmRcIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICpuZ0lmPVwib3B0aW9uc0NsaWNrLm9ic2VydmVkXCJcbiAgICAgICAgW3RpdGxlXT1cIm9wdGlvbnNUaXRsZSB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIChjbGljayk9XCJvcHRpb25zQ2xpY2suZW1pdCgkZXZlbnQpXCJcbiAgICAgID5cbiAgICAgICAgPG1hdC1pY29uPm1vcmVfdmVydDwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlttYXRIZWFkZXJdXCI+PC9uZy1jb250ZW50PlxuICAgIDwvbWF0LWhlYWRlci1jZWxsPlxuICAgIDxtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBbY2xhc3NdPVwiY2xhc3NMaXN0XCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicm93LmVkaXRpbmc7IGVsc2Ugdmlld1wiPlxuICAgICAgICA8IS0tIHBlbmRpbmcgLS0+XG4gICAgICAgIDxpb24tc3Bpbm5lciAqbmdJZj1cInJvdy52YWxpZGF0b3I/LnBlbmRpbmdcIiBuYW1lPVwiZG90c1wiIGNsYXNzPVwiY2VudGVyXCI+PC9pb24tc3Bpbm5lcj5cblxuICAgICAgICA8IS0tIENvbmZpcm0gYnV0dG9uIC0tPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgY29sb3I9XCJsaWdodFwiXG4gICAgICAgICAgKm5nSWY9XCJjYW5Db25maXJtICYmIHJvdy5lZGl0aW5nICYmIHJvdy52YWxpZGF0b3I/LmRpcnR5ICYmIHJvdy52YWxpZGF0b3I/LnZhbGlkXCJcbiAgICAgICAgICBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fQVBQTFknIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAoY2xpY2spPVwiY29uZmlybUVkaXRDcmVhdGVDbGljay5lbWl0KHsgZXZlbnQ6ICRldmVudCwgcm93OiByb3cgfSlcIlxuICAgICAgICA+XG4gICAgICAgICAgPG1hdC1pY29uPmNoZWNrbWFyazwvbWF0LWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgIDwhLS0gbmV3IHJvdyAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInJvdy5pZCA9PT0gLTE7IGVsc2UgZXhpc3RpbmdSb3dcIj5cbiAgICAgICAgICA8IS0tIGRlbGV0ZSBidXR0b24gLS0+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICBjb2xvcj1cImxpZ2h0XCJcbiAgICAgICAgICAgICpuZ0lmPVwiY2FuRGVsZXRlICYmIHJvdy52YWxpZGF0b3I/LmludmFsaWRcIlxuICAgICAgICAgICAgW3RpdGxlXT1cIidDT01NT04uQlROX0RFTEVURScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbE9yRGVsZXRlQ2xpY2suZW1pdCh7IGV2ZW50OiAkZXZlbnQsIHJvdzogcm93IH0pXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWljb24+ZGVsZXRlX291dGxpbmU8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPCEtLSBhZGQgYnV0dG9uIC0tPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgY29sb3I9XCJsaWdodFwiXG4gICAgICAgICAgICAqbmdJZj1cIiFjYW5Gb3J3YXJkICYmIGNhbkNvbmZpcm1BbmRBZGQgJiYgcm93LnZhbGlkYXRvcj8udmFsaWRcIlxuICAgICAgICAgICAgW3RpdGxlXT1cIidDT01NT04uQlROX0FERCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNvbmZpcm1BbmRBZGRDbGljay5lbWl0KHsgZXZlbnQ6ICRldmVudCwgcm93OiByb3cgfSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPCEtLSBuZXh0IGJ1dHRvbiAoaW52aXNpYmxlIC0gZm9jdXNhYmxlIG9ubHkpIC0tPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwibWF0LXJvdy1hY3Rpb24tYnV0dG9uXCJcbiAgICAgICAgICAgIHN0eWxlPVwiY29sb3I6IHRyYW5zcGFyZW50OyBwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogMDsgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOyB3aWR0aDogMFwiXG4gICAgICAgICAgICAqbmdJZj1cImNhbkZvcndhcmQgJiYgcm93LnZhbGlkYXRvcj8udmFsaWRcIlxuICAgICAgICAgICAgKGZvY3VzKT1cInRoaXMuZm9yd2FyZC5lbWl0KHsgZXZlbnQ6ICRldmVudCwgcm93OiByb3cgfSlcIlxuICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPCEtLSBleGlzdGluZyByb3cgLS0+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjZXhpc3RpbmdSb3c+XG4gICAgICAgICAgPCEtLSBjYW5jZWwgYnV0dG9uIC0tPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgY29sb3I9XCJsaWdodFwiXG4gICAgICAgICAgICAqbmdJZj1cImNhbkNhbmNlbCAmJiByb3cudmFsaWRhdG9yPy5kaXJ0eVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fVU5ETycgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNhbmNlbE9yRGVsZXRlQ2xpY2suZW1pdCh7IGV2ZW50OiAkZXZlbnQsIHJvdzogcm93IH0pXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWljb24+dW5kbzwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8IS0tIG5leHQgYnV0dG9uIChpbnZpc2libGUgLSBmb2N1c2FibGUgb25seSkgLS0+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgY2xhc3M9XCJtYXQtcm93LWFjdGlvbi1idXR0b25cIlxuICAgICAgICAgICAgc3R5bGU9XCJjb2xvcjogdHJhbnNwYXJlbnQ7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAwOyBtYXJnaW46IDA7IHBhZGRpbmc6IDA7IHdpZHRoOiAwXCJcbiAgICAgICAgICAgICpuZ0lmPVwiY2FuRm9yd2FyZCAmJiByb3cudmFsaWRhdG9yPy52YWxpZFwiXG4gICAgICAgICAgICAoZm9jdXMpPVwidGhpcy5mb3J3YXJkLmVtaXQoeyBldmVudDogJGV2ZW50LCByb3c6IHJvdyB9KVwiXG4gICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjdmlldz5cbiAgICAgICAgPCEtLSBkaXJ0eSBpY29uIC0tPlxuICAgICAgICA8aW9uLWljb25cbiAgICAgICAgICAqbmdJZj1cImRpcnR5SWNvbiAmJiByb3cudmFsaWRhdG9yPy5kaXJ0eVwiXG4gICAgICAgICAgW25hbWVdPVwiZGlydHlJY29uXCJcbiAgICAgICAgICBjb2xvcj1cImFjY2VudFwiXG4gICAgICAgICAgY2xhc3M9XCJkaXJ0eS1pY29uXCJcbiAgICAgICAgPjwvaW9uLWljb24+XG5cbiAgICAgICAgPCEtLSBiYWNrd2FyZCBidXR0b24gKGludmlzaWJsZSAtIGZvY3VzYWJsZSBvbmx5KSAtLT5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwibWF0LXJvdy1hY3Rpb24tYnV0dG9uXCJcbiAgICAgICAgICBzdHlsZT1cImNvbG9yOiB0cmFuc3BhcmVudDsgcG9zaXRpb246IGFic29sdXRlOyB0b3A6IDA7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgd2lkdGg6IDBcIlxuICAgICAgICAgICpuZ0lmPVwiY2FuQmFja3dhcmRcIlxuICAgICAgICAgIChmb2N1cyk9XCJ0aGlzLmJhY2t3YXJkLmVtaXQoeyBldmVudDogJGV2ZW50LCByb3c6IHJvdyB9KVwiXG4gICAgICAgID48L2J1dHRvbj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjZWxsVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiByb3cgfVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvbWF0LWNlbGw+XG5cbiAgICA8bWF0LWZvb3Rlci1jZWxsICptYXRGb290ZXJDZWxsRGVmPlxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW21hdEZvb3Rlcl1cIj48L25nLWNvbnRlbnQ+XG4gICAgPC9tYXQtZm9vdGVyLWNlbGw+XG4gIDwvbmctY29udGFpbmVyPlxuPC9uZy1jb250YWluZXI+XG4iXX0=