@tolle_/tolle-ui 18.3.1 → 18.3.3

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.
@@ -11,14 +11,18 @@ export class AlertDialogDynamicComponent {
11
11
  * content panel plays its exit animation before the overlay is torn down.
12
12
  */
13
13
  closing = false;
14
+ /**
15
+ * Result recorded by the action/cancel buttons' `confirmed`/`cancelled`
16
+ * outputs, which fire *before* the button drives the dialog closed. The
17
+ * single close path (`onOpenChange`) then reads it, so a confirm reports
18
+ * `true` instead of racing with the button's own `false` close signal.
19
+ */
20
+ result = false;
14
21
  onOpenChange(open) {
15
22
  if (!open) {
16
- this.close(false);
23
+ this.dialogRef.close(this.result);
17
24
  }
18
25
  }
19
- close(result) {
20
- this.dialogRef.close(result);
21
- }
22
26
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AlertDialogDynamicComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
23
27
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: AlertDialogDynamicComponent, isStandalone: true, selector: "tolle-alert-dialog-dynamic", ngImport: i0, template: `
24
28
  <tolle-alert-dialog [open]="!closing" (openChange)="onOpenChange($event)">
@@ -30,10 +34,10 @@ export class AlertDialogDynamicComponent {
30
34
  </tolle-alert-dialog-description>
31
35
  </tolle-alert-dialog-header>
32
36
  <tolle-alert-dialog-footer>
33
- <tolle-alert-dialog-cancel (click)="close(false)">
37
+ <tolle-alert-dialog-cancel (cancelled)="result = false">
34
38
  <tolle-button variant="outline">{{ config.cancelText || 'Cancel' }}</tolle-button>
35
39
  </tolle-alert-dialog-cancel>
36
- <tolle-alert-dialog-action (click)="close(true)">
40
+ <tolle-alert-dialog-action (confirmed)="result = true">
37
41
  <tolle-button [variant]="config.variant === 'destructive' ? 'destructive' : 'default'">
38
42
  {{ config.actionText || 'Continue' }}
39
43
  </tolle-button>
@@ -66,10 +70,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
66
70
  </tolle-alert-dialog-description>
67
71
  </tolle-alert-dialog-header>
68
72
  <tolle-alert-dialog-footer>
69
- <tolle-alert-dialog-cancel (click)="close(false)">
73
+ <tolle-alert-dialog-cancel (cancelled)="result = false">
70
74
  <tolle-button variant="outline">{{ config.cancelText || 'Cancel' }}</tolle-button>
71
75
  </tolle-alert-dialog-cancel>
72
- <tolle-alert-dialog-action (click)="close(true)">
76
+ <tolle-alert-dialog-action (confirmed)="result = true">
73
77
  <tolle-button [variant]="config.variant === 'destructive' ? 'destructive' : 'default'">
74
78
  {{ config.actionText || 'Continue' }}
75
79
  </tolle-button>
@@ -79,4 +83,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
79
83
  </tolle-alert-dialog>
80
84
  `, styles: [":host{display:block}\n"] }]
81
85
  }] });
82
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQtZGlhbG9nLWR5bmFtaWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9hbGVydC1kaWFsb2ctZHluYW1pYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBMEIsTUFBTSxlQUFlLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsMkJBQTJCLEVBQzNCLDBCQUEwQixFQUMxQix5QkFBeUIsRUFDekIsK0JBQStCLEVBQy9CLDBCQUEwQixFQUMxQiwwQkFBMEIsRUFDMUIsMEJBQTBCLEVBQzNCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDOztBQTBDckQsTUFBTSxPQUFPLDJCQUEyQjtJQUN0QyxNQUFNLENBQXFCO0lBQzNCLFNBQVMsQ0FBa0I7SUFFM0I7OztPQUdHO0lBQ0gsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUVoQixZQUFZLENBQUMsSUFBYTtRQUN4QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLE1BQWU7UUFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0IsQ0FBQzt3R0FsQlUsMkJBQTJCOzRGQUEzQiwyQkFBMkIsc0ZBdkI1Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJULCtGQWhDQyxZQUFZLCtCQUNaLG9CQUFvQiwwR0FDcEIsMkJBQTJCLGtHQUMzQiwwQkFBMEIseUZBQzFCLHlCQUF5Qix3RkFDekIsK0JBQStCLDhGQUMvQiwwQkFBMEIseUZBQzFCLDBCQUEwQiw4RkFDMUIsMEJBQTBCLDhGQUMxQixlQUFlOzs0RkF5Qk4sMkJBQTJCO2tCQXZDdkMsU0FBUzsrQkFDRSw0QkFBNEIsY0FFMUIsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osb0JBQW9CO3dCQUNwQiwyQkFBMkI7d0JBQzNCLDBCQUEwQjt3QkFDMUIseUJBQXlCO3dCQUN6QiwrQkFBK0I7d0JBQy9CLDBCQUEwQjt3QkFDMUIsMEJBQTBCO3dCQUMxQiwwQkFBMEI7d0JBQzFCLGVBQWU7cUJBQ2hCLFlBQ1M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCVCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0LCBpbmplY3QsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFsZXJ0RGlhbG9nQ29tcG9uZW50LFxuICBBbGVydERpYWxvZ0NvbnRlbnRDb21wb25lbnQsXG4gIEFsZXJ0RGlhbG9nSGVhZGVyQ29tcG9uZW50LFxuICBBbGVydERpYWxvZ1RpdGxlQ29tcG9uZW50LFxuICBBbGVydERpYWxvZ0Rlc2NyaXB0aW9uQ29tcG9uZW50LFxuICBBbGVydERpYWxvZ0Zvb3RlckNvbXBvbmVudCxcbiAgQWxlcnREaWFsb2dDYW5jZWxDb21wb25lbnQsXG4gIEFsZXJ0RGlhbG9nQWN0aW9uQ29tcG9uZW50XG59IGZyb20gJy4vYWxlcnQtZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICcuL2J1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgQWxlcnREaWFsb2dDb25maWcsIEFsZXJ0RGlhbG9nUmVmIH0gZnJvbSAnLi9hbGVydC1kaWFsb2cudHlwZXMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1hbGVydC1kaWFsb2ctZHluYW1pYycsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgQWxlcnREaWFsb2dDb21wb25lbnQsXG4gICAgQWxlcnREaWFsb2dDb250ZW50Q29tcG9uZW50LFxuICAgIEFsZXJ0RGlhbG9nSGVhZGVyQ29tcG9uZW50LFxuICAgIEFsZXJ0RGlhbG9nVGl0bGVDb21wb25lbnQsXG4gICAgQWxlcnREaWFsb2dEZXNjcmlwdGlvbkNvbXBvbmVudCxcbiAgICBBbGVydERpYWxvZ0Zvb3RlckNvbXBvbmVudCxcbiAgICBBbGVydERpYWxvZ0NhbmNlbENvbXBvbmVudCxcbiAgICBBbGVydERpYWxvZ0FjdGlvbkNvbXBvbmVudCxcbiAgICBCdXR0b25Db21wb25lbnRcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8dG9sbGUtYWxlcnQtZGlhbG9nIFtvcGVuXT1cIiFjbG9zaW5nXCIgKG9wZW5DaGFuZ2UpPVwib25PcGVuQ2hhbmdlKCRldmVudClcIj5cbiAgICAgICAgPHRvbGxlLWFsZXJ0LWRpYWxvZy1jb250ZW50IFtzaXplXT1cImNvbmZpZy5zaXplIHx8ICdsZydcIj5cbiAgICAgICAgICA8dG9sbGUtYWxlcnQtZGlhbG9nLWhlYWRlcj5cbiAgICAgICAgICAgIDx0b2xsZS1hbGVydC1kaWFsb2ctdGl0bGU+e3sgY29uZmlnLnRpdGxlIH19PC90b2xsZS1hbGVydC1kaWFsb2ctdGl0bGU+XG4gICAgICAgICAgICA8dG9sbGUtYWxlcnQtZGlhbG9nLWRlc2NyaXB0aW9uPlxuICAgICAgICAgICAgICB7eyBjb25maWcuZGVzY3JpcHRpb24gfX1cbiAgICAgICAgICAgIDwvdG9sbGUtYWxlcnQtZGlhbG9nLWRlc2NyaXB0aW9uPlxuICAgICAgICAgIDwvdG9sbGUtYWxlcnQtZGlhbG9nLWhlYWRlcj5cbiAgICAgICAgICA8dG9sbGUtYWxlcnQtZGlhbG9nLWZvb3Rlcj5cbiAgICAgICAgICAgIDx0b2xsZS1hbGVydC1kaWFsb2ctY2FuY2VsIChjbGljayk9XCJjbG9zZShmYWxzZSlcIj5cbiAgICAgICAgICAgICAgPHRvbGxlLWJ1dHRvbiB2YXJpYW50PVwib3V0bGluZVwiPnt7IGNvbmZpZy5jYW5jZWxUZXh0IHx8ICdDYW5jZWwnIH19PC90b2xsZS1idXR0b24+XG4gICAgICAgICAgICA8L3RvbGxlLWFsZXJ0LWRpYWxvZy1jYW5jZWw+XG4gICAgICAgICAgICA8dG9sbGUtYWxlcnQtZGlhbG9nLWFjdGlvbiAoY2xpY2spPVwiY2xvc2UodHJ1ZSlcIj5cbiAgICAgICAgICAgICAgPHRvbGxlLWJ1dHRvbiBbdmFyaWFudF09XCJjb25maWcudmFyaWFudCA9PT0gJ2Rlc3RydWN0aXZlJyA/ICdkZXN0cnVjdGl2ZScgOiAnZGVmYXVsdCdcIj5cbiAgICAgICAgICAgICAgICB7eyBjb25maWcuYWN0aW9uVGV4dCB8fCAnQ29udGludWUnIH19XG4gICAgICAgICAgICAgIDwvdG9sbGUtYnV0dG9uPlxuICAgICAgICAgICAgPC90b2xsZS1hbGVydC1kaWFsb2ctYWN0aW9uPlxuICAgICAgICAgIDwvdG9sbGUtYWxlcnQtZGlhbG9nLWZvb3Rlcj5cbiAgICAgICAgPC90b2xsZS1hbGVydC1kaWFsb2ctY29udGVudD5cbiAgICA8L3RvbGxlLWFsZXJ0LWRpYWxvZz5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBBbGVydERpYWxvZ0R5bmFtaWNDb21wb25lbnQge1xuICBjb25maWchOiBBbGVydERpYWxvZ0NvbmZpZztcbiAgZGlhbG9nUmVmITogQWxlcnREaWFsb2dSZWY7XG5cbiAgLyoqXG4gICAqIFNldCBieSBgQWxlcnREaWFsb2dTZXJ2aWNlYCBvbmNlIHRoZSBkaWFsb2cncyByZXN1bHQgaXMgcmVhZHksIHNvIHRoZVxuICAgKiBjb250ZW50IHBhbmVsIHBsYXlzIGl0cyBleGl0IGFuaW1hdGlvbiBiZWZvcmUgdGhlIG92ZXJsYXkgaXMgdG9ybiBkb3duLlxuICAgKi9cbiAgY2xvc2luZyA9IGZhbHNlO1xuXG4gIG9uT3BlbkNoYW5nZShvcGVuOiBib29sZWFuKSB7XG4gICAgaWYgKCFvcGVuKSB7XG4gICAgICB0aGlzLmNsb3NlKGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBjbG9zZShyZXN1bHQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmRpYWxvZ1JlZi5jbG9zZShyZXN1bHQpO1xuICB9XG59XG4iXX0=
86
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQtZGlhbG9nLWR5bmFtaWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9hbGVydC1kaWFsb2ctZHluYW1pYy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBMEIsTUFBTSxlQUFlLENBQUM7QUFDbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsMkJBQTJCLEVBQzNCLDBCQUEwQixFQUMxQix5QkFBeUIsRUFDekIsK0JBQStCLEVBQy9CLDBCQUEwQixFQUMxQiwwQkFBMEIsRUFDMUIsMEJBQTBCLEVBQzNCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDOztBQTBDckQsTUFBTSxPQUFPLDJCQUEyQjtJQUN0QyxNQUFNLENBQXFCO0lBQzNCLFNBQVMsQ0FBa0I7SUFFM0I7OztPQUdHO0lBQ0gsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUVoQjs7Ozs7T0FLRztJQUNILE1BQU0sR0FBRyxLQUFLLENBQUM7SUFFZixZQUFZLENBQUMsSUFBYTtRQUN4QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsQ0FBQztJQUNILENBQUM7d0dBdEJVLDJCQUEyQjs0RkFBM0IsMkJBQTJCLHNGQXZCNUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCVCwrRkFoQ0MsWUFBWSwrQkFDWixvQkFBb0IsMEdBQ3BCLDJCQUEyQixrR0FDM0IsMEJBQTBCLHlGQUMxQix5QkFBeUIsd0ZBQ3pCLCtCQUErQiw4RkFDL0IsMEJBQTBCLHlGQUMxQiwwQkFBMEIsOEZBQzFCLDBCQUEwQiw4RkFDMUIsZUFBZTs7NEZBeUJOLDJCQUEyQjtrQkF2Q3ZDLFNBQVM7K0JBQ0UsNEJBQTRCLGNBRTFCLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLG9CQUFvQjt3QkFDcEIsMkJBQTJCO3dCQUMzQiwwQkFBMEI7d0JBQzFCLHlCQUF5Qjt3QkFDekIsK0JBQStCO3dCQUMvQiwwQkFBMEI7d0JBQzFCLDBCQUEwQjt3QkFDMUIsMEJBQTBCO3dCQUMxQixlQUFlO3FCQUNoQixZQUNTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQlQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEluamVjdCwgaW5qZWN0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBBbGVydERpYWxvZ0NvbXBvbmVudCxcbiAgQWxlcnREaWFsb2dDb250ZW50Q29tcG9uZW50LFxuICBBbGVydERpYWxvZ0hlYWRlckNvbXBvbmVudCxcbiAgQWxlcnREaWFsb2dUaXRsZUNvbXBvbmVudCxcbiAgQWxlcnREaWFsb2dEZXNjcmlwdGlvbkNvbXBvbmVudCxcbiAgQWxlcnREaWFsb2dGb290ZXJDb21wb25lbnQsXG4gIEFsZXJ0RGlhbG9nQ2FuY2VsQ29tcG9uZW50LFxuICBBbGVydERpYWxvZ0FjdGlvbkNvbXBvbmVudFxufSBmcm9tICcuL2FsZXJ0LWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi9idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IEFsZXJ0RGlhbG9nQ29uZmlnLCBBbGVydERpYWxvZ1JlZiB9IGZyb20gJy4vYWxlcnQtZGlhbG9nLnR5cGVzJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtYWxlcnQtZGlhbG9nLWR5bmFtaWMnLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEFsZXJ0RGlhbG9nQ29tcG9uZW50LFxuICAgIEFsZXJ0RGlhbG9nQ29udGVudENvbXBvbmVudCxcbiAgICBBbGVydERpYWxvZ0hlYWRlckNvbXBvbmVudCxcbiAgICBBbGVydERpYWxvZ1RpdGxlQ29tcG9uZW50LFxuICAgIEFsZXJ0RGlhbG9nRGVzY3JpcHRpb25Db21wb25lbnQsXG4gICAgQWxlcnREaWFsb2dGb290ZXJDb21wb25lbnQsXG4gICAgQWxlcnREaWFsb2dDYW5jZWxDb21wb25lbnQsXG4gICAgQWxlcnREaWFsb2dBY3Rpb25Db21wb25lbnQsXG4gICAgQnV0dG9uQ29tcG9uZW50XG4gIF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPHRvbGxlLWFsZXJ0LWRpYWxvZyBbb3Blbl09XCIhY2xvc2luZ1wiIChvcGVuQ2hhbmdlKT1cIm9uT3BlbkNoYW5nZSgkZXZlbnQpXCI+XG4gICAgICAgIDx0b2xsZS1hbGVydC1kaWFsb2ctY29udGVudCBbc2l6ZV09XCJjb25maWcuc2l6ZSB8fCAnbGcnXCI+XG4gICAgICAgICAgPHRvbGxlLWFsZXJ0LWRpYWxvZy1oZWFkZXI+XG4gICAgICAgICAgICA8dG9sbGUtYWxlcnQtZGlhbG9nLXRpdGxlPnt7IGNvbmZpZy50aXRsZSB9fTwvdG9sbGUtYWxlcnQtZGlhbG9nLXRpdGxlPlxuICAgICAgICAgICAgPHRvbGxlLWFsZXJ0LWRpYWxvZy1kZXNjcmlwdGlvbj5cbiAgICAgICAgICAgICAge3sgY29uZmlnLmRlc2NyaXB0aW9uIH19XG4gICAgICAgICAgICA8L3RvbGxlLWFsZXJ0LWRpYWxvZy1kZXNjcmlwdGlvbj5cbiAgICAgICAgICA8L3RvbGxlLWFsZXJ0LWRpYWxvZy1oZWFkZXI+XG4gICAgICAgICAgPHRvbGxlLWFsZXJ0LWRpYWxvZy1mb290ZXI+XG4gICAgICAgICAgICA8dG9sbGUtYWxlcnQtZGlhbG9nLWNhbmNlbCAoY2FuY2VsbGVkKT1cInJlc3VsdCA9IGZhbHNlXCI+XG4gICAgICAgICAgICAgIDx0b2xsZS1idXR0b24gdmFyaWFudD1cIm91dGxpbmVcIj57eyBjb25maWcuY2FuY2VsVGV4dCB8fCAnQ2FuY2VsJyB9fTwvdG9sbGUtYnV0dG9uPlxuICAgICAgICAgICAgPC90b2xsZS1hbGVydC1kaWFsb2ctY2FuY2VsPlxuICAgICAgICAgICAgPHRvbGxlLWFsZXJ0LWRpYWxvZy1hY3Rpb24gKGNvbmZpcm1lZCk9XCJyZXN1bHQgPSB0cnVlXCI+XG4gICAgICAgICAgICAgIDx0b2xsZS1idXR0b24gW3ZhcmlhbnRdPVwiY29uZmlnLnZhcmlhbnQgPT09ICdkZXN0cnVjdGl2ZScgPyAnZGVzdHJ1Y3RpdmUnIDogJ2RlZmF1bHQnXCI+XG4gICAgICAgICAgICAgICAge3sgY29uZmlnLmFjdGlvblRleHQgfHwgJ0NvbnRpbnVlJyB9fVxuICAgICAgICAgICAgICA8L3RvbGxlLWJ1dHRvbj5cbiAgICAgICAgICAgIDwvdG9sbGUtYWxlcnQtZGlhbG9nLWFjdGlvbj5cbiAgICAgICAgICA8L3RvbGxlLWFsZXJ0LWRpYWxvZy1mb290ZXI+XG4gICAgICAgIDwvdG9sbGUtYWxlcnQtZGlhbG9nLWNvbnRlbnQ+XG4gICAgPC90b2xsZS1hbGVydC1kaWFsb2c+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgQWxlcnREaWFsb2dEeW5hbWljQ29tcG9uZW50IHtcbiAgY29uZmlnITogQWxlcnREaWFsb2dDb25maWc7XG4gIGRpYWxvZ1JlZiE6IEFsZXJ0RGlhbG9nUmVmO1xuXG4gIC8qKlxuICAgKiBTZXQgYnkgYEFsZXJ0RGlhbG9nU2VydmljZWAgb25jZSB0aGUgZGlhbG9nJ3MgcmVzdWx0IGlzIHJlYWR5LCBzbyB0aGVcbiAgICogY29udGVudCBwYW5lbCBwbGF5cyBpdHMgZXhpdCBhbmltYXRpb24gYmVmb3JlIHRoZSBvdmVybGF5IGlzIHRvcm4gZG93bi5cbiAgICovXG4gIGNsb3NpbmcgPSBmYWxzZTtcblxuICAvKipcbiAgICogUmVzdWx0IHJlY29yZGVkIGJ5IHRoZSBhY3Rpb24vY2FuY2VsIGJ1dHRvbnMnIGBjb25maXJtZWRgL2BjYW5jZWxsZWRgXG4gICAqIG91dHB1dHMsIHdoaWNoIGZpcmUgKmJlZm9yZSogdGhlIGJ1dHRvbiBkcml2ZXMgdGhlIGRpYWxvZyBjbG9zZWQuIFRoZVxuICAgKiBzaW5nbGUgY2xvc2UgcGF0aCAoYG9uT3BlbkNoYW5nZWApIHRoZW4gcmVhZHMgaXQsIHNvIGEgY29uZmlybSByZXBvcnRzXG4gICAqIGB0cnVlYCBpbnN0ZWFkIG9mIHJhY2luZyB3aXRoIHRoZSBidXR0b24ncyBvd24gYGZhbHNlYCBjbG9zZSBzaWduYWwuXG4gICAqL1xuICByZXN1bHQgPSBmYWxzZTtcblxuICBvbk9wZW5DaGFuZ2Uob3BlbjogYm9vbGVhbikge1xuICAgIGlmICghb3Blbikge1xuICAgICAgdGhpcy5kaWFsb2dSZWYuY2xvc2UodGhpcy5yZXN1bHQpO1xuICAgIH1cbiAgfVxufVxuIl19
@@ -2,9 +2,14 @@ import { Subject } from 'rxjs';
2
2
  export class AlertDialogRef {
3
3
  _afterClosed = new Subject();
4
4
  afterClosed$ = this._afterClosed.asObservable();
5
+ /** Guards against the dialog's several close paths racing to emit twice. */
6
+ closed = false;
5
7
  close(result = false) {
8
+ if (this.closed)
9
+ return;
10
+ this.closed = true;
6
11
  this._afterClosed.next(result);
7
12
  this._afterClosed.complete();
8
13
  }
9
14
  }
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQtZGlhbG9nLnR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9hbGVydC1kaWFsb2cudHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBYyxNQUFNLE1BQU0sQ0FBQztBQWEzQyxNQUFNLE9BQU8sY0FBYztJQUNOLFlBQVksR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO0lBQ3ZELFlBQVksR0FBd0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUVyRSxLQUFLLENBQUMsU0FBa0IsS0FBSztRQUN6QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2pDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuZXhwb3J0IHR5cGUgQWxlcnREaWFsb2dTaXplID0gJ3hzJyB8ICdzbScgfCAnbWQnIHwgJ2xnJyB8ICd4bCcgfCAnMnhsJyB8ICdmdWxsJyB8ICdmaXQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFsZXJ0RGlhbG9nQ29uZmlnIHtcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgY2FuY2VsVGV4dD86IHN0cmluZztcbiAgICBhY3Rpb25UZXh0Pzogc3RyaW5nO1xuICAgIHZhcmlhbnQ/OiAnZGVmYXVsdCcgfCAnZGVzdHJ1Y3RpdmUnO1xuICAgIHNpemU/OiBBbGVydERpYWxvZ1NpemU7XG59XG5cbmV4cG9ydCBjbGFzcyBBbGVydERpYWxvZ1JlZiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfYWZ0ZXJDbG9zZWQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICAgIGFmdGVyQ2xvc2VkJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuX2FmdGVyQ2xvc2VkLmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgY2xvc2UocmVzdWx0OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fYWZ0ZXJDbG9zZWQubmV4dChyZXN1bHQpO1xuICAgICAgICB0aGlzLl9hZnRlckNsb3NlZC5jb21wbGV0ZSgpO1xuICAgIH1cbn1cbiJdfQ==
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQtZGlhbG9nLnR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9hbGVydC1kaWFsb2cudHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBYyxNQUFNLE1BQU0sQ0FBQztBQWEzQyxNQUFNLE9BQU8sY0FBYztJQUNOLFlBQVksR0FBRyxJQUFJLE9BQU8sRUFBVyxDQUFDO0lBQ3ZELFlBQVksR0FBd0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUVyRSw0RUFBNEU7SUFDcEUsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUV2QixLQUFLLENBQUMsU0FBa0IsS0FBSztRQUN6QixJQUFJLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTztRQUN4QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2pDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuZXhwb3J0IHR5cGUgQWxlcnREaWFsb2dTaXplID0gJ3hzJyB8ICdzbScgfCAnbWQnIHwgJ2xnJyB8ICd4bCcgfCAnMnhsJyB8ICdmdWxsJyB8ICdmaXQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFsZXJ0RGlhbG9nQ29uZmlnIHtcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgY2FuY2VsVGV4dD86IHN0cmluZztcbiAgICBhY3Rpb25UZXh0Pzogc3RyaW5nO1xuICAgIHZhcmlhbnQ/OiAnZGVmYXVsdCcgfCAnZGVzdHJ1Y3RpdmUnO1xuICAgIHNpemU/OiBBbGVydERpYWxvZ1NpemU7XG59XG5cbmV4cG9ydCBjbGFzcyBBbGVydERpYWxvZ1JlZiB7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfYWZ0ZXJDbG9zZWQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICAgIGFmdGVyQ2xvc2VkJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMuX2FmdGVyQ2xvc2VkLmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgLyoqIEd1YXJkcyBhZ2FpbnN0IHRoZSBkaWFsb2cncyBzZXZlcmFsIGNsb3NlIHBhdGhzIHJhY2luZyB0byBlbWl0IHR3aWNlLiAqL1xuICAgIHByaXZhdGUgY2xvc2VkID0gZmFsc2U7XG5cbiAgICBjbG9zZShyZXN1bHQ6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHJldHVybjtcbiAgICAgICAgdGhpcy5jbG9zZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLl9hZnRlckNsb3NlZC5uZXh0KHJlc3VsdCk7XG4gICAgICAgIHRoaXMuX2FmdGVyQ2xvc2VkLmNvbXBsZXRlKCk7XG4gICAgfVxufVxuIl19
@@ -18,6 +18,8 @@ export class RangeCalendarComponent {
18
18
  rangeSelect = new EventEmitter(); // Emits whenever selection changes
19
19
  currentView = 'date';
20
20
  viewDate = new Date();
21
+ /** Which visible month the quick pickers are editing; always 0 in the single-month view. */
22
+ pickerMonthIndex = 0;
21
23
  // The Range Value
22
24
  value = { start: null, end: null };
23
25
  weekDays = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];
@@ -57,19 +59,27 @@ export class RangeCalendarComponent {
57
59
  return {
58
60
  date: monthDate,
59
61
  days: eachDayOfInterval({ start: startOfWeek(startOfMonth(monthDate)), end: endOfWeek(endOfMonth(monthDate)) }),
60
- label: format(monthDate, 'MMMM yyyy'),
61
62
  };
62
63
  });
63
64
  }
64
65
  generateYears() {
65
- const currentYear = this.viewDate.getFullYear();
66
+ const currentYear = this.pickerDate.getFullYear();
66
67
  this.years = Array.from({ length: 16 }, (_, i) => currentYear - 6 + i);
67
68
  }
68
- setView(view) {
69
+ /** The month the quick pickers act on — `viewDate` shifted to the clicked panel. */
70
+ get pickerDate() {
71
+ return addMonths(this.viewDate, this.pickerMonthIndex);
72
+ }
73
+ /** `monthIndex` is the index of the visible month whose header was clicked. */
74
+ setView(view, monthIndex = 0) {
75
+ this.pickerMonthIndex = view === 'date' ? 0 : monthIndex;
69
76
  this.currentView = view;
70
77
  if (view === 'year')
71
78
  this.generateYears();
72
79
  }
80
+ headerBtnClass(view) {
81
+ return cn('text-sm font-semibold px-2 py-1 rounded transition-colors', this.currentView === view ? 'bg-secondary text-secondary-foreground' : 'hover:bg-accent hover:text-accent-foreground');
82
+ }
73
83
  prev() {
74
84
  if (this.currentView === 'date') {
75
85
  this.viewDate = subMonths(this.viewDate, 1);
@@ -194,12 +204,19 @@ export class RangeCalendarComponent {
194
204
  btn?.focus();
195
205
  }
196
206
  selectMonth(monthIndex) {
197
- this.viewDate = setMonth(this.viewDate, monthIndex);
198
- this.currentView = 'date';
199
- this.generateDays();
207
+ this.applyPickerDate(setMonth(this.pickerDate, monthIndex));
200
208
  }
201
209
  selectYear(year) {
202
- this.viewDate = setYear(this.viewDate, year);
210
+ this.applyPickerDate(setYear(this.pickerDate, year));
211
+ }
212
+ /**
213
+ * Re-anchors the view so the panel the picker was opened from lands on `date`,
214
+ * then returns to the day grid. In the single-month view the offset is 0, so
215
+ * this is just "show that month".
216
+ */
217
+ applyPickerDate(date) {
218
+ this.viewDate = startOfMonth(subMonths(date, this.pickerMonthIndex));
219
+ this.pickerMonthIndex = 0;
203
220
  this.currentView = 'date';
204
221
  this.generateDays();
205
222
  }
@@ -270,8 +287,40 @@ export class RangeCalendarComponent {
270
287
  ], usesOnChanges: true, ngImport: i0, template: `
271
288
  <div [class]="cn('text-popover-foreground inline-block min-w-fit', bordered ? 'p-3 border rounded-md bg-background shadow-sm' : '', class)">
272
289
 
290
+ <!-- ===== Month / year quick pickers (shared by the single- and multi-month views) ===== -->
291
+ <ng-container *ngIf="currentView !== 'date'">
292
+ <div class="flex items-center justify-between pt-1 pb-4 gap-2">
293
+ <div class="flex items-center gap-1">
294
+ <button type="button" (click)="setView('month', pickerMonthIndex)" [class]="headerBtnClass('month')">
295
+ {{ pickerDate | date: 'MMMM' }}
296
+ </button>
297
+ <button type="button" (click)="setView('year', pickerMonthIndex)" [class]="headerBtnClass('year')">
298
+ {{ pickerDate | date: 'yyyy' }}
299
+ </button>
300
+ </div>
301
+ <div class="flex items-center space-x-1">
302
+ <button type="button" (click)="prev()" [class]="navBtnClass" aria-label="Previous"><i class="ri-arrow-left-s-line text-lg"></i></button>
303
+ <button type="button" (click)="next()" [class]="navBtnClass" aria-label="Next"><i class="ri-arrow-right-s-line text-lg"></i></button>
304
+ </div>
305
+ </div>
306
+
307
+ <div *ngIf="currentView === 'month'" class="grid grid-cols-3 gap-2 w-64 animate-in fade-in zoom-in-95 duration-200">
308
+ <button *ngFor="let month of months; let i = index" type="button" (click)="selectMonth(i)"
309
+ [class]="cn('text-sm py-2.5 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors', i === pickerDate.getMonth() ? 'bg-primary text-primary-foreground' : '')">
310
+ {{ month }}
311
+ </button>
312
+ </div>
313
+
314
+ <div *ngIf="currentView === 'year'" class="grid grid-cols-4 gap-2 w-64 animate-in fade-in zoom-in-95 duration-200">
315
+ <button *ngFor="let year of years" type="button" (click)="selectYear(year)"
316
+ [class]="cn('text-sm py-2 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors', year === pickerDate.getFullYear() ? 'bg-primary text-primary-foreground' : '')">
317
+ {{ year }}
318
+ </button>
319
+ </div>
320
+ </ng-container>
321
+
273
322
  <!-- ===== Multi-month view (side-by-side, shared range) ===== -->
274
- <div *ngIf="numberOfMonths > 1" class="flex flex-col gap-4 sm:flex-row">
323
+ <div *ngIf="currentView === 'date' && numberOfMonths > 1" class="flex flex-col gap-4 sm:flex-row">
275
324
  <div *ngFor="let m of visibleMonths; let idx = index" class="space-y-2">
276
325
  <div class="flex items-center justify-between pt-1 pb-2">
277
326
  <button *ngIf="idx === 0" type="button" (click)="prev()" [class]="navBtnClass" aria-label="Previous month">
@@ -279,7 +328,12 @@ export class RangeCalendarComponent {
279
328
  </button>
280
329
  <span *ngIf="idx !== 0" class="h-7 w-7"></span>
281
330
 
282
- <div class="text-sm font-semibold">{{ m.label }}</div>
331
+ <!-- Each panel's month and year open the quick pickers for that panel,
332
+ so a two-month view jumps the same way the single-month one does. -->
333
+ <div class="flex items-center gap-1">
334
+ <button type="button" (click)="setView('month', idx)" [class]="headerBtnClass('month')">{{ m.date | date: 'MMMM' }}</button>
335
+ <button type="button" (click)="setView('year', idx)" [class]="headerBtnClass('year')">{{ m.date | date: 'yyyy' }}</button>
336
+ </div>
283
337
 
284
338
  <button *ngIf="idx === visibleMonths.length - 1" type="button" (click)="next()" [class]="navBtnClass" aria-label="Next month">
285
339
  <i class="ri-arrow-right-s-line text-lg"></i>
@@ -313,16 +367,14 @@ export class RangeCalendarComponent {
313
367
  </div>
314
368
  </div>
315
369
 
316
- <!-- ===== Single-month view (with month / year quick pickers) ===== -->
317
- <ng-container *ngIf="numberOfMonths <= 1">
370
+ <!-- ===== Single-month view ===== -->
371
+ <ng-container *ngIf="currentView === 'date' && numberOfMonths <= 1">
318
372
  <div class="flex items-center justify-between pt-1 pb-4 gap-2">
319
373
  <div class="flex items-center gap-1">
320
- <button type="button" (click)="setView('month')"
321
- [class]="cn('text-sm font-semibold px-2 py-1 rounded transition-colors', currentView === 'month' ? 'bg-secondary text-secondary-foreground' : 'hover:bg-accent hover:text-accent-foreground')">
374
+ <button type="button" (click)="setView('month')" [class]="headerBtnClass('month')">
322
375
  {{ viewDate | date: 'MMMM' }}
323
376
  </button>
324
- <button type="button" (click)="setView('year')"
325
- [class]="cn('text-sm font-semibold px-2 py-1 rounded transition-colors', currentView === 'year' ? 'bg-secondary text-secondary-foreground' : 'hover:bg-accent hover:text-accent-foreground')">
377
+ <button type="button" (click)="setView('year')" [class]="headerBtnClass('year')">
326
378
  {{ viewDate | date: 'yyyy' }}
327
379
  </button>
328
380
  </div>
@@ -332,7 +384,7 @@ export class RangeCalendarComponent {
332
384
  </div>
333
385
  </div>
334
386
 
335
- <div *ngIf="currentView === 'date'" class="space-y-2 animate-in fade-in zoom-in-95 duration-200">
387
+ <div class="space-y-2 animate-in fade-in zoom-in-95 duration-200">
336
388
  <div class="grid grid-cols-7 gap-y-1 w-full">
337
389
  <span *ngFor="let day of weekDays" class="text-[0.8rem] text-muted-foreground font-normal text-center w-9">
338
390
  {{ day }}
@@ -354,20 +406,6 @@ export class RangeCalendarComponent {
354
406
  </button>
355
407
  </div>
356
408
  </div>
357
-
358
- <div *ngIf="currentView === 'month'" class="grid grid-cols-3 gap-2 w-64 animate-in fade-in zoom-in-95 duration-200">
359
- <button *ngFor="let month of months; let i = index" type="button" (click)="selectMonth(i)"
360
- [class]="cn('text-sm py-2.5 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors', i === viewDate.getMonth() ? 'bg-primary text-primary-foreground' : '')">
361
- {{ month }}
362
- </button>
363
- </div>
364
-
365
- <div *ngIf="currentView === 'year'" class="grid grid-cols-4 gap-2 w-64 animate-in fade-in zoom-in-95 duration-200">
366
- <button *ngFor="let year of years" type="button" (click)="selectYear(year)"
367
- [class]="cn('text-sm py-2 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors', year === viewDate.getFullYear() ? 'bg-primary text-primary-foreground' : '')">
368
- {{ year }}
369
- </button>
370
- </div>
371
409
  </ng-container>
372
410
  </div>
373
411
  `, isInline: true, styles: [":host{display:block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }] });
@@ -383,8 +421,40 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
383
421
  ], template: `
384
422
  <div [class]="cn('text-popover-foreground inline-block min-w-fit', bordered ? 'p-3 border rounded-md bg-background shadow-sm' : '', class)">
385
423
 
424
+ <!-- ===== Month / year quick pickers (shared by the single- and multi-month views) ===== -->
425
+ <ng-container *ngIf="currentView !== 'date'">
426
+ <div class="flex items-center justify-between pt-1 pb-4 gap-2">
427
+ <div class="flex items-center gap-1">
428
+ <button type="button" (click)="setView('month', pickerMonthIndex)" [class]="headerBtnClass('month')">
429
+ {{ pickerDate | date: 'MMMM' }}
430
+ </button>
431
+ <button type="button" (click)="setView('year', pickerMonthIndex)" [class]="headerBtnClass('year')">
432
+ {{ pickerDate | date: 'yyyy' }}
433
+ </button>
434
+ </div>
435
+ <div class="flex items-center space-x-1">
436
+ <button type="button" (click)="prev()" [class]="navBtnClass" aria-label="Previous"><i class="ri-arrow-left-s-line text-lg"></i></button>
437
+ <button type="button" (click)="next()" [class]="navBtnClass" aria-label="Next"><i class="ri-arrow-right-s-line text-lg"></i></button>
438
+ </div>
439
+ </div>
440
+
441
+ <div *ngIf="currentView === 'month'" class="grid grid-cols-3 gap-2 w-64 animate-in fade-in zoom-in-95 duration-200">
442
+ <button *ngFor="let month of months; let i = index" type="button" (click)="selectMonth(i)"
443
+ [class]="cn('text-sm py-2.5 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors', i === pickerDate.getMonth() ? 'bg-primary text-primary-foreground' : '')">
444
+ {{ month }}
445
+ </button>
446
+ </div>
447
+
448
+ <div *ngIf="currentView === 'year'" class="grid grid-cols-4 gap-2 w-64 animate-in fade-in zoom-in-95 duration-200">
449
+ <button *ngFor="let year of years" type="button" (click)="selectYear(year)"
450
+ [class]="cn('text-sm py-2 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors', year === pickerDate.getFullYear() ? 'bg-primary text-primary-foreground' : '')">
451
+ {{ year }}
452
+ </button>
453
+ </div>
454
+ </ng-container>
455
+
386
456
  <!-- ===== Multi-month view (side-by-side, shared range) ===== -->
387
- <div *ngIf="numberOfMonths > 1" class="flex flex-col gap-4 sm:flex-row">
457
+ <div *ngIf="currentView === 'date' && numberOfMonths > 1" class="flex flex-col gap-4 sm:flex-row">
388
458
  <div *ngFor="let m of visibleMonths; let idx = index" class="space-y-2">
389
459
  <div class="flex items-center justify-between pt-1 pb-2">
390
460
  <button *ngIf="idx === 0" type="button" (click)="prev()" [class]="navBtnClass" aria-label="Previous month">
@@ -392,7 +462,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
392
462
  </button>
393
463
  <span *ngIf="idx !== 0" class="h-7 w-7"></span>
394
464
 
395
- <div class="text-sm font-semibold">{{ m.label }}</div>
465
+ <!-- Each panel's month and year open the quick pickers for that panel,
466
+ so a two-month view jumps the same way the single-month one does. -->
467
+ <div class="flex items-center gap-1">
468
+ <button type="button" (click)="setView('month', idx)" [class]="headerBtnClass('month')">{{ m.date | date: 'MMMM' }}</button>
469
+ <button type="button" (click)="setView('year', idx)" [class]="headerBtnClass('year')">{{ m.date | date: 'yyyy' }}</button>
470
+ </div>
396
471
 
397
472
  <button *ngIf="idx === visibleMonths.length - 1" type="button" (click)="next()" [class]="navBtnClass" aria-label="Next month">
398
473
  <i class="ri-arrow-right-s-line text-lg"></i>
@@ -426,16 +501,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
426
501
  </div>
427
502
  </div>
428
503
 
429
- <!-- ===== Single-month view (with month / year quick pickers) ===== -->
430
- <ng-container *ngIf="numberOfMonths <= 1">
504
+ <!-- ===== Single-month view ===== -->
505
+ <ng-container *ngIf="currentView === 'date' && numberOfMonths <= 1">
431
506
  <div class="flex items-center justify-between pt-1 pb-4 gap-2">
432
507
  <div class="flex items-center gap-1">
433
- <button type="button" (click)="setView('month')"
434
- [class]="cn('text-sm font-semibold px-2 py-1 rounded transition-colors', currentView === 'month' ? 'bg-secondary text-secondary-foreground' : 'hover:bg-accent hover:text-accent-foreground')">
508
+ <button type="button" (click)="setView('month')" [class]="headerBtnClass('month')">
435
509
  {{ viewDate | date: 'MMMM' }}
436
510
  </button>
437
- <button type="button" (click)="setView('year')"
438
- [class]="cn('text-sm font-semibold px-2 py-1 rounded transition-colors', currentView === 'year' ? 'bg-secondary text-secondary-foreground' : 'hover:bg-accent hover:text-accent-foreground')">
511
+ <button type="button" (click)="setView('year')" [class]="headerBtnClass('year')">
439
512
  {{ viewDate | date: 'yyyy' }}
440
513
  </button>
441
514
  </div>
@@ -445,7 +518,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
445
518
  </div>
446
519
  </div>
447
520
 
448
- <div *ngIf="currentView === 'date'" class="space-y-2 animate-in fade-in zoom-in-95 duration-200">
521
+ <div class="space-y-2 animate-in fade-in zoom-in-95 duration-200">
449
522
  <div class="grid grid-cols-7 gap-y-1 w-full">
450
523
  <span *ngFor="let day of weekDays" class="text-[0.8rem] text-muted-foreground font-normal text-center w-9">
451
524
  {{ day }}
@@ -467,20 +540,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
467
540
  </button>
468
541
  </div>
469
542
  </div>
470
-
471
- <div *ngIf="currentView === 'month'" class="grid grid-cols-3 gap-2 w-64 animate-in fade-in zoom-in-95 duration-200">
472
- <button *ngFor="let month of months; let i = index" type="button" (click)="selectMonth(i)"
473
- [class]="cn('text-sm py-2.5 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors', i === viewDate.getMonth() ? 'bg-primary text-primary-foreground' : '')">
474
- {{ month }}
475
- </button>
476
- </div>
477
-
478
- <div *ngIf="currentView === 'year'" class="grid grid-cols-4 gap-2 w-64 animate-in fade-in zoom-in-95 duration-200">
479
- <button *ngFor="let year of years" type="button" (click)="selectYear(year)"
480
- [class]="cn('text-sm py-2 rounded-md hover:bg-accent hover:text-accent-foreground transition-colors', year === viewDate.getFullYear() ? 'bg-primary text-primary-foreground' : '')">
481
- {{ year }}
482
- </button>
483
- </div>
484
543
  </ng-container>
485
544
  </div>
486
545
  `, styles: [":host{display:block}\n"] }]
@@ -495,4 +554,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
495
554
  }], rangeSelect: [{
496
555
  type: Output
497
556
  }] } });
498
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UtY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9yYW5nZS1jYWxlbmRhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQW9DLFVBQVUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFpQyxNQUFNLGVBQWUsQ0FBQztBQUNwSixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFDTCxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUN2RCxXQUFXLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFDdEQsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQ3pELFFBQVEsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUMvQyxNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sWUFBWSxDQUFDOzs7QUF3SGhDLE1BQU0sT0FBTyxzQkFBc0I7SUE2QmI7SUFBZ0M7SUE1QjNDLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDWCxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFDbEM7a0VBQzhEO0lBQ3JELFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDekIscUVBQXFFO0lBQzVELGNBQWMsR0FBRyxDQUFDLENBQUM7SUFDbEIsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFhLENBQUMsQ0FBQyxtQ0FBbUM7SUFFMUYsV0FBVyxHQUE4QixNQUFNLENBQUM7SUFDaEQsUUFBUSxHQUFTLElBQUksSUFBSSxFQUFFLENBQUM7SUFFNUIsa0JBQWtC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O2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIGZvcndhcmRSZWYsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBDaGFuZ2VEZXRlY3RvclJlZiwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIGFkZERheXMsIGFkZE1vbnRocywgc3ViTW9udGhzLCBzdGFydE9mTW9udGgsIGVuZE9mTW9udGgsXG4gIHN0YXJ0T2ZXZWVrLCBlbmRPZldlZWssIGVhY2hEYXlPZkludGVydmFsLCBpc1NhbWVNb250aCxcbiAgaXNTYW1lRGF5LCBpc1RvZGF5LCBzZXRNb250aCwgc2V0WWVhciwgYWRkWWVhcnMsIHN1YlllYXJzLFxuICBpc0JlZm9yZSwgc3RhcnRPZkRheSwgaXNXaXRoaW5JbnRlcnZhbCwgZm9ybWF0XG59IGZyb20gJ2RhdGUtZm5zJztcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi91dGlscy9jbic7XG5pbXBvcnQge0RhdGVSYW5nZX0gZnJvbSAnLi90eXBlcy9kYXRlLXJhbmdlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndG9sbGUtcmFuZ2UtY2FsZW5kYXInLFxuICBzdHlsZXM6IFsnOmhvc3QgeyBkaXNwbGF5OiBibG9jazsgfSddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBSYW5nZUNhbGVuZGFyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgW2NsYXNzXT1cImNuKCd0ZXh0LXBvcG92ZXItZm9yZWdyb3VuZCBpbmxpbmUtYmxvY2sgbWluLXctZml0JywgYm9yZGVyZWQgPyAncC0zIGJvcmRlciByb3VuZGVkLW1kIGJnLWJhY2tncm91bmQgc2hhZG93LXNtJyA6ICcnLCBjbGFzcylcIj5cblxuICAgICAgPCEtLSA9PT09PSBNdWx0aS1tb250aCB2aWV3IChzaWRlLWJ5LXNpZGUsIHNoYXJlZCByYW5nZSkgPT09PT0gLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwibnVtYmVyT2ZNb250aHMgPiAxXCIgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC00IHNtOmZsZXgtcm93XCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG0gb2YgdmlzaWJsZU1vbnRoczsgbGV0IGlkeCA9IGluZGV4XCIgY2xhc3M9XCJzcGFjZS15LTJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB0LTEgcGItMlwiPlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImlkeCA9PT0gMFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwicHJldigpXCIgW2NsYXNzXT1cIm5hdkJ0bkNsYXNzXCIgYXJpYS1sYWJlbD1cIlByZXZpb3VzIG1vbnRoXCI+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwicmktYXJyb3ctbGVmdC1zLWxpbmUgdGV4dC1sZ1wiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpZHggIT09IDBcIiBjbGFzcz1cImgtNyB3LTdcIj48L3NwYW4+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGRcIj57eyBtLmxhYmVsIH19PC9kaXY+XG5cbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJpZHggPT09IHZpc2libGVNb250aHMubGVuZ3RoIC0gMVwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwibmV4dCgpXCIgW2NsYXNzXT1cIm5hdkJ0bkNsYXNzXCIgYXJpYS1sYWJlbD1cIk5leHQgbW9udGhcIj5cbiAgICAgICAgICAgICAgPGkgY2xhc3M9XCJyaS1hcnJvdy1yaWdodC1zLWxpbmUgdGV4dC1sZ1wiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpZHggIT09IHZpc2libGVNb250aHMubGVuZ3RoIC0gMVwiIGNsYXNzPVwiaC03IHctN1wiPjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJncmlkIGdyaWQtY29scy03IGdhcC15LTFcIj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBkYXkgb2Ygd2Vla0RheXNcIiBjbGFzcz1cInRleHQtWzAuOHJlbV0gdGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGZvbnQtbm9ybWFsIHRleHQtY2VudGVyIHctOVwiPnt7IGRheSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHJvbGU9XCJncmlkXCIgY2xhc3M9XCJncmlkIGdyaWQtY29scy03IGdhcC15LTFcIiAoa2V5ZG93bik9XCJvbkdyaWRLZXlkb3duKCRldmVudClcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRhdGUgb2YgbS5kYXlzXCI+XG4gICAgICAgICAgICAgIDwhLS0gT25seSB0aGUgbW9udGgncyBvd24gZGF5cyBhcmUgcmVuZGVyZWQ7IGFkamFjZW50LW1vbnRoIGRheXMgYXJlXG4gICAgICAgICAgICAgICAgICAgYmxhbmsgc3BhY2VycyBzbyBlYWNoIGNhbGVuZGFyIGluIGEgbXVsdGktbW9udGggdmlldyBpcyBzZWxmLWNvbnRhaW5lZC4gLS0+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAqbmdJZj1cImlzQ3VycmVudE1vbnRoKGRhdGUsIG0uZGF0ZSk7IGVsc2UgcGFkXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtZGF0ZV09XCJmbXRLZXkoZGF0ZSlcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChkYXRlKVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCIoZGF0ZSB8IGRhdGU6J2Z1bGxEYXRlJylcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3REYXRlKGRhdGUpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNEYXRlRGlzYWJsZWQoZGF0ZSlcIlxuICAgICAgICAgICAgICAgIFtjbGFzc109XCJnZXREYXlDbGFzcyhkYXRlLCBtLmRhdGUpXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7IGRhdGUgfCBkYXRlOiAnZCcgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcGFkPjxzcGFuIGNsYXNzPVwiaC05IHctOVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj48L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gPT09PT0gU2luZ2xlLW1vbnRoIHZpZXcgKHdpdGggbW9udGggLyB5ZWFyIHF1aWNrIHBpY2tlcnMpID09PT09IC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm51bWJlck9mTW9udGhzIDw9IDFcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBwdC0xIHBiLTQgZ2FwLTJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTFcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzZXRWaWV3KCdtb250aCcpXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImNuKCd0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgcHgtMiBweS0xIHJvdW5kZWQgdHJhbnNpdGlvbi1jb2xvcnMnLCBjdXJyZW50VmlldyA9PT0gJ21vbnRoJyA/ICdiZy1zZWNvbmRhcnkgdGV4dC1zZWNvbmRhcnktZm9yZWdyb3VuZCcgOiAnaG92ZXI6YmctYWNjZW50IGhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQnKVwiPlxuICAgICAgICAgICAgICB7eyB2aWV3RGF0ZSB8IGRhdGU6ICdNTU1NJyB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwic2V0VmlldygneWVhcicpXCJcbiAgICAgICAgICAgICAgW2NsYXNzXT1cImNuKCd0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgcHgtMiBweS0xIHJvdW5kZWQgdHJhbnNpdGlvbi1jb2xvcnMnLCBjdXJyZW50VmlldyA9PT0gJ3llYXInID8gJ2JnLXNlY29uZGFyeSB0ZXh0LXNlY29uZGFyeS1mb3JlZ3JvdW5kJyA6ICdob3ZlcjpiZy1hY2NlbnQgaG92ZXI6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCcpXCI+XG4gICAgICAgICAgICAgIHt7IHZpZXdEYXRlIHwgZGF0ZTogJ3l5eXknIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0xXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwicHJldigpXCIgW2NsYXNzXT1cIm5hdkJ0bkNsYXNzXCIgYXJpYS1sYWJlbD1cIlByZXZpb3VzIG1vbnRoXCI+PGkgY2xhc3M9XCJyaS1hcnJvdy1sZWZ0LXMtbGluZSB0ZXh0LWxnXCI+PC9pPjwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm5leHQoKVwiIFtjbGFzc109XCJuYXZCdG5DbGFzc1wiIGFyaWEtbGFiZWw9XCJOZXh0IG1vbnRoXCI+PGkgY2xhc3M9XCJyaS1hcnJvdy1yaWdodC1zLWxpbmUgdGV4dC1sZ1wiPjwvaT48L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cImN1cnJlbnRWaWV3ID09PSAnZGF0ZSdcIiBjbGFzcz1cInNwYWNlLXktMiBhbmltYXRlLWluIGZhZGUtaW4gem9vbS1pbi05NSBkdXJhdGlvbi0yMDBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtNyBnYXAteS0xIHctZnVsbFwiPlxuICAgICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IGRheSBvZiB3ZWVrRGF5c1wiIGNsYXNzPVwidGV4dC1bMC44cmVtXSB0ZXh0LW11dGVkLWZvcmVncm91bmQgZm9udC1ub3JtYWwgdGV4dC1jZW50ZXIgdy05XCI+XG4gICAgICAgICAgICAgIHt7IGRheSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgcm9sZT1cImdyaWRcIiBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTcgZ2FwLXktMSB3LWZ1bGxcIiAoa2V5ZG93bik9XCJvbkdyaWRLZXlkb3duKCRldmVudClcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGRhdGUgb2YgZGF5c0luTW9udGhcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS1kYXRlXT1cImZtdEtleShkYXRlKVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChkYXRlKVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGRhdGUgfCBkYXRlOidmdWxsRGF0ZScpXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdERhdGUoZGF0ZSlcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNEYXRlRGlzYWJsZWQoZGF0ZSlcIlxuICAgICAgICAgICAgICBbY2xhc3NdPVwiZ2V0RGF5Q2xhc3MoZGF0ZSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBkYXRlIHwgZGF0ZTogJ2QnIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cImN1cnJlbnRWaWV3ID09PSAnbW9udGgnXCIgY2xhc3M9XCJncmlkIGdyaWQtY29scy0zIGdhcC0yIHctNjQgYW5pbWF0ZS1pbiBmYWRlLWluIHpvb20taW4tOTUgZHVyYXRpb24tMjAwXCI+XG4gICAgICAgICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgbW9udGggb2YgbW9udGhzOyBsZXQgaSA9IGluZGV4XCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzZWxlY3RNb250aChpKVwiXG4gICAgICAgICAgICBbY2xhc3NdPVwiY24oJ3RleHQtc20gcHktMi41IHJvdW5kZWQtbWQgaG92ZXI6YmctYWNjZW50IGhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQgdHJhbnNpdGlvbi1jb2xvcnMnLCBpID09PSB2aWV3RGF0ZS5nZXRNb250aCgpID8gJ2JnLXByaW1hcnkgdGV4dC1wcmltYXJ5LWZvcmVncm91bmQnIDogJycpXCI+XG4gICAgICAgICAgICB7eyBtb250aCB9fVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwiY3VycmVudFZpZXcgPT09ICd5ZWFyJ1wiIGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtNCBnYXAtMiB3LTY0IGFuaW1hdGUtaW4gZmFkZS1pbiB6b29tLWluLTk1IGR1cmF0aW9uLTIwMFwiPlxuICAgICAgICAgIDxidXR0b24gKm5nRm9yPVwibGV0IHllYXIgb2YgeWVhcnNcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInNlbGVjdFllYXIoeWVhcilcIlxuICAgICAgICAgICAgW2NsYXNzXT1cImNuKCd0ZXh0LXNtIHB5LTIgcm91bmRlZC1tZCBob3ZlcjpiZy1hY2NlbnQgaG92ZXI6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCB0cmFuc2l0aW9uLWNvbG9ycycsIHllYXIgPT09IHZpZXdEYXRlLmdldEZ1bGxZZWFyKCkgPyAnYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCcgOiAnJylcIj5cbiAgICAgICAgICAgIHt7IHllYXIgfX1cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBSYW5nZUNhbGVuZGFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgQElucHV0KCkgY2xhc3MgPSAnJztcbiAgQElucHV0KCkgZGlzYWJsZVBhc3REYXRlcyA9IGZhbHNlO1xuICAvKiogUmVuZGVycyB0aGUgY2FsZW5kYXIncyBvd24gYm9yZGVyL2JhY2tncm91bmQvc2hhZG93LiBTZXQgYGZhbHNlYCBpbnNpZGUgYVxuICAgKiBjYXJkL3BvcG92ZXIgdGhhdCBhbHJlYWR5IHByb3ZpZGVzIGNocm9tZS4gQGRlZmF1bHQgdHJ1ZSAqL1xuICBASW5wdXQoKSBib3JkZXJlZCA9IHRydWU7XG4gIC8qKiBOdW1iZXIgb2YgY29uc2VjdXRpdmUgbW9udGhzIHJlbmRlcmVkIHNpZGUgYnkgc2lkZS4gQGRlZmF1bHQgMSAqL1xuICBASW5wdXQoKSBudW1iZXJPZk1vbnRocyA9IDE7XG4gIEBPdXRwdXQoKSByYW5nZVNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZVJhbmdlPigpOyAvLyBFbWl0cyB3aGVuZXZlciBzZWxlY3Rpb24gY2hhbmdlc1xuXG4gIGN1cnJlbnRWaWV3OiAnZGF0ZScgfCAnbW9udGgnIHwgJ3llYXInID0gJ2RhdGUnO1xuICB2aWV3RGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCk7XG5cbiAgLy8gVGhlIFJhbmdlIFZhbHVlXG4gIHZhbHVlOiBEYXRlUmFuZ2UgPSB7IHN0YXJ0OiBudWxsLCBlbmQ6IG51bGwgfTtcblxuICB3ZWVrRGF5cyA9IFsnU3UnLCAnTW8nLCAnVHUnLCAnV2UnLCAnVGgnLCAnRnInLCAnU2EnXTtcbiAgZGF5c0luTW9udGg6IERhdGVbXSA9IFtdO1xuICAvKiogR3JpZHMgZm9yIGVhY2ggdmlzaWJsZSBtb250aCAobXVsdGktbW9udGggdmlldykuICovXG4gIHZpc2libGVNb250aHM6IHsgZGF0ZTogRGF0ZTsgZGF5czogRGF0ZVtdOyBsYWJlbDogc3RyaW5nIH1bXSA9IFtdO1xuICBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ107XG4gIHllYXJzOiBudW1iZXJbXSA9IFtdO1xuXG4gIG5hdkJ0bkNsYXNzID0gY24oJ2gtNyB3LTcgYmctdHJhbnNwYXJlbnQgcC0wIG9wYWNpdHktNTAgaG92ZXI6b3BhY2l0eS0xMDAgYm9yZGVyIGJvcmRlci1pbnB1dCByb3VuZGVkLW1kIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGhvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIHRyYW5zaXRpb24tYWxsIGZvY3VzLXZpc2libGU6b3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6cmluZy0yIGZvY3VzLXZpc2libGU6cmluZy1yaW5nJyk7XG5cbiAgb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4ge307XG4gIG9uQ2hhbmdlOiAodmFsdWU6IERhdGVSYW5nZSkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICBwcm90ZWN0ZWQgY24gPSBjbjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgZWw6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+KSB7fVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZ2VuZXJhdGVEYXlzKCk7XG4gICAgdGhpcy5nZW5lcmF0ZVllYXJzKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgLy8gUmVidWlsZCB0aGUgbW9udGggZ3JpZHMgd2hlbiB0aGUgdmlzaWJsZS1tb250aCBjb3VudCBjaGFuZ2VzIGFmdGVyIGluaXRcbiAgICAvLyAoZS5nLiBhIGBbbnVtYmVyT2ZNb250aHNdYCB0b2dnbGUpLCBzbyBzaW5nbGUg4oeEIG11bHRpLW1vbnRoIGlzIHJlYWN0aXZlLlxuICAgIGlmIChjaGFuZ2VzWydudW1iZXJPZk1vbnRocyddICYmICFjaGFuZ2VzWydudW1iZXJPZk1vbnRocyddLmZpcnN0Q2hhbmdlKSB7XG4gICAgICB0aGlzLmdlbmVyYXRlRGF5cygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLSBEYXRlIEdlbmVyYXRpb24gTG9naWMgKFNhbWUgYXMgQ2FsZW5kYXIpIC0tLVxuICBnZW5lcmF0ZURheXMoKSB7XG4gICAgY29uc3Qgc3RhcnQgPSBzdGFydE9mV2VlayhzdGFydE9mTW9udGgodGhpcy52aWV3RGF0ZSkpO1xuICAgIGNvbnN0IGVuZCA9IGVuZE9mV2VlayhlbmRPZk1vbnRoKHRoaXMudmlld0RhdGUpKTtcbiAgICB0aGlzLmRheXNJbk1vbnRoID0gZWFjaERheU9mSW50ZXJ2YWwoeyBzdGFydCwgZW5kIH0pO1xuXG4gICAgLy8gTXVsdGktbW9udGggZ3JpZHM6IHZpZXdEYXRlIGlzIHRoZSBsZWZ0bW9zdCBtb250aCwgdGhlbiBOLTEgY29uc2VjdXRpdmUuXG4gICAgY29uc3QgY291bnQgPSBNYXRoLm1heCgxLCB0aGlzLm51bWJlck9mTW9udGhzKTtcbiAgICB0aGlzLnZpc2libGVNb250aHMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoXywgaSkgPT4ge1xuICAgICAgY29uc3QgbW9udGhEYXRlID0gYWRkTW9udGhzKHRoaXMudmlld0RhdGUsIGkpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0ZTogbW9udGhEYXRlLFxuICAgICAgICBkYXlzOiBlYWNoRGF5T2ZJbnRlcnZhbCh7IHN0YXJ0OiBzdGFydE9mV2VlayhzdGFydE9mTW9udGgobW9udGhEYXRlKSksIGVuZDogZW5kT2ZXZWVrKGVuZE9mTW9udGgobW9udGhEYXRlKSkgfSksXG4gICAgICAgIGxhYmVsOiBmb3JtYXQobW9udGhEYXRlLCAnTU1NTSB5eXl5JyksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgZ2VuZXJhdGVZZWFycygpIHtcbiAgICBjb25zdCBjdXJyZW50WWVhciA9IHRoaXMudmlld0RhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICB0aGlzLnllYXJzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMTYgfSwgKF8sIGkpID0+IGN1cnJlbnRZZWFyIC0gNiArIGkpO1xuICB9XG5cbiAgc2V0Vmlldyh2aWV3OiAnZGF0ZScgfCAnbW9udGgnIHwgJ3llYXInKSB7XG4gICAgdGhpcy5jdXJyZW50VmlldyA9IHZpZXc7XG4gICAgaWYgKHZpZXcgPT09ICd5ZWFyJykgdGhpcy5nZW5lcmF0ZVllYXJzKCk7XG4gIH1cblxuICBwcmV2KCkge1xuICAgIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSAnZGF0ZScpIHtcbiAgICAgIHRoaXMudmlld0RhdGUgPSBzdWJNb250aHModGhpcy52aWV3RGF0ZSwgMSk7XG4gICAgICB0aGlzLmdlbmVyYXRlRGF5cygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ3llYXInKSB7XG4gICAgICB0aGlzLnZpZXdEYXRlID0gc3ViWWVhcnModGhpcy52aWV3RGF0ZSwgMTYpO1xuICAgICAgdGhpcy5nZW5lcmF0ZVllYXJzKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSAnbW9udGgnKSB7XG4gICAgICB0aGlzLnZpZXdEYXRlID0gc3ViWWVhcnModGhpcy52aWV3RGF0ZSwgMSk7XG4gICAgfVxuICB9XG5cbiAgbmV4dCgpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ2RhdGUnKSB7XG4gICAgICB0aGlzLnZpZXdEYXRlID0gYWRkTW9udGhzKHRoaXMudmlld0RhdGUsIDEpO1xuICAgICAgdGhpcy5nZW5lcmF0ZURheXMoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICd5ZWFyJykge1xuICAgICAgdGhpcy52aWV3RGF0ZSA9IGFkZFllYXJzKHRoaXMudmlld0RhdGUsIDE2KTtcbiAgICAgIHRoaXMuZ2VuZXJhdGVZZWFycygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ21vbnRoJykge1xuICAgICAgdGhpcy52aWV3RGF0ZSA9IGFkZFllYXJzKHRoaXMudmlld0RhdGUsIDEpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLSBSYW5nZSBTZWxlY3Rpb24gTG9naWMgLS0tXG5cbiAgc2VsZWN0RGF0ZShkYXRlOiBEYXRlKSB7XG4gICAgaWYgKHRoaXMuaXNEYXRlRGlzYWJsZWQoZGF0ZSkpIHJldHVybjtcblxuICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gdGhpcy52YWx1ZTtcblxuICAgIC8vIDEuIElmIHN0YXJ0IGV4aXN0cyBidXQgZW5kIGRvZXNuJ3RcbiAgICBpZiAoc3RhcnQgJiYgIWVuZCkge1xuICAgICAgaWYgKGlzQmVmb3JlKGRhdGUsIHN0YXJ0KSkge1xuICAgICAgICAvLyBVc2VyIGNsaWNrZWQgZWFybGllciBkYXRlIC0+IFJlc2V0IHN0YXJ0XG4gICAgICAgIHRoaXMudmFsdWUgPSB7IHN0YXJ0OiBkYXRlLCBlbmQ6IG51bGwgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVzZXIgY2xpY2tlZCBsYXRlciBkYXRlIC0+IENvbXBsZXRlIHJhbmdlXG4gICAgICAgIHRoaXMudmFsdWUgPSB7IHN0YXJ0LCBlbmQ6IGRhdGUgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gMi4gSWYgbmVpdGhlciBleGlzdCBPUiBib3RoIGV4aXN0IChyZXNldClcbiAgICBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSB7IHN0YXJ0OiBkYXRlLCBlbmQ6IG51bGwgfTtcbiAgICB9XG5cbiAgICAvLyBPbmx5IHJlLWFuY2hvciB0aGUgdmlldyB3aGVuIHRoZSBjbGlja2VkIGRheSBpc24ndCBhbHJlYWR5IG9uIGEgdmlzaWJsZSBtb250aFxuICAgIC8vIChzbyBjbGlja2luZyB0aGUgcmlnaHQtaGFuZCBtb250aCBpbiBhIDItbW9udGggdmlldyBkb2Vzbid0IGp1bXAgdGhlIGNhbGVuZGFyKS5cbiAgICBjb25zdCBvblZpc2libGVNb250aCA9IHRoaXMudmlzaWJsZU1vbnRocy5zb21lKChtKSA9PiBpc1NhbWVNb250aChkYXRlLCBtLmRhdGUpKTtcbiAgICBpZiAoIW9uVmlzaWJsZU1vbnRoKSB7XG4gICAgICB0aGlzLnZpZXdEYXRlID0gc3RhcnRPZk1vbnRoKGRhdGUpO1xuICAgICAgdGhpcy5nZW5lcmF0ZURheXMoKTtcbiAgICB9XG5cbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICAgIHRoaXMucmFuZ2VTZWxlY3QuZW1pdCh0aGlzLnZhbHVlKTtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICB9XG5cbiAgLy8gLS0tIEdyaWQga2V5Ym9hcmQgbmF2aWdhdGlvbiAoZGF0ZSB2aWV3IG9ubHkpIC0tLVxuXG4gIC8qKlxuICAgKiBBcnJvdyBrZXlzIG1vdmUgYnkgZGF5L3dlZWssIEhvbWUvRW5kIHRvIHdlZWsgZWRnZXMsIFBhZ2VVcC9QYWdlRG93biBieVxuICAgKiBtb250aC4gRW50ZXIvU3BhY2UgYXJlIGxlZnQgdG8gdGhlIG5hdGl2ZSBkYXkgPGJ1dHRvbj4uIFRoZSBmb2N1c2VkIGRheSBpc1xuICAgKiByZWFkIGZyb20gaXRzIGBkYXRhLWRhdGVgIGtleSwgc28gbmF2aWdhdGlvbiBpcyBpbmRlcGVuZGVudCBvZiBncmlkIGxheW91dFxuICAgKiAoYWRqYWNlbnQtbW9udGggZGF5cyBhcmVuJ3QgcmVuZGVyZWQgaW4gdGhlIG11bHRpLW1vbnRoIHZpZXcpLlxuICAgKi9cbiAgb25HcmlkS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmICh0aGlzLm51bWJlck9mTW9udGhzIDw9IDEgJiYgdGhpcy5jdXJyZW50VmlldyAhPT0gJ2RhdGUnKSByZXR1cm47XG5cbiAgICBjb25zdCBrZXkgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoJ2RhdGEtZGF0ZScpO1xuICAgIGlmICgha2V5KSByZXR1cm47XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMua2V5VG9EYXRlKGtleSk7XG5cbiAgICBsZXQgbmV4dDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdBcnJvd0xlZnQnOiBuZXh0ID0gYWRkRGF5cyhjdXJyZW50LCAtMSk7IGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6IG5leHQgPSBhZGREYXlzKGN1cnJlbnQsIDEpOyBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93VXAnOiBuZXh0ID0gYWRkRGF5cyhjdXJyZW50LCAtNyk7IGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dEb3duJzogbmV4dCA9IGFkZERheXMoY3VycmVudCwgNyk7IGJyZWFrO1xuICAgICAgY2FzZSAnSG9tZSc6IG5leHQgPSBzdGFydE9mV2VlayhjdXJyZW50KTsgYnJlYWs7XG4gICAgICBjYXNlICdFbmQnOiBuZXh0ID0gZW5kT2ZXZWVrKGN1cnJlbnQpOyBicmVhaztcbiAgICAgIGNhc2UgJ1BhZ2VVcCc6IG5leHQgPSBzdWJNb250aHMoY3VycmVudCwgMSk7IGJyZWFrO1xuICAgICAgY2FzZSAnUGFnZURvd24nOiBuZXh0ID0gYWRkTW9udGhzKGN1cnJlbnQsIDEpOyBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHJldHVybjtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMuZm9jdXNEYXkobmV4dCk7XG4gIH1cblxuICBwcml2YXRlIGZvY3VzRGF5KGRhdGU6IERhdGUpIHtcbiAgICBjb25zdCBzZWxlY3RvciA9IGBbZGF0YS1kYXRlPVwiJHt0aGlzLmZtdEtleShkYXRlKX1cIl1gO1xuICAgIGxldCBidG4gPSB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcikgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgIGlmIChidG4pIHsgYnRuLmZvY3VzKCk7IHJldHVybjsgfVxuXG4gICAgLy8gVGFyZ2V0IGRheSBpc24ndCBjdXJyZW50bHkgcmVuZGVyZWQg4oaSIHBhZ2UgdGhlIHZpZXcgdG93YXJkIGl0LCB0aGVuIHJldHJ5LlxuICAgIGlmICh0aGlzLm51bWJlck9mTW9udGhzID4gMSkge1xuICAgICAgdGhpcy52aWV3RGF0ZSA9IGlzQmVmb3JlKGRhdGUsIHRoaXMudmlzaWJsZU1vbnRoc1swXS5kYXRlKVxuICAgICAgICA/IHN1Yk1vbnRocyh0aGlzLnZpZXdEYXRlLCAxKVxuICAgICAgICA6IGFkZE1vbnRocyh0aGlzLnZpZXdEYXRlLCAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52aWV3RGF0ZSA9IHN0YXJ0T2ZNb250aChkYXRlKTtcbiAgICB9XG4gICAgdGhpcy5nZW5lcmF0ZURheXMoKTtcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgYnRuID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBidG4/LmZvY3VzKCk7XG4gIH1cblxuICBzZWxlY3RNb250aChtb250aEluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLnZpZXdEYXRlID0gc2V0TW9udGgodGhpcy52aWV3RGF0ZSwgbW9udGhJbmRleCk7XG4gICAgdGhpcy5jdXJyZW50VmlldyA9ICdkYXRlJztcbiAgICB0aGlzLmdlbmVyYXRlRGF5cygpO1xuICB9XG5cbiAgc2VsZWN0WWVhcih5ZWFyOiBudW1iZXIpIHtcbiAgICB0aGlzLnZpZXdEYXRlID0gc2V0WWVhcih0aGlzLnZpZXdEYXRlLCB5ZWFyKTtcbiAgICB0aGlzLmN1cnJlbnRWaWV3ID0gJ2RhdGUnO1xuICAgIHRoaXMuZ2VuZXJhdGVEYXlzKCk7XG4gIH1cblxuICAvLyAtLS0gVmlzdWFsIFN0eWxpbmcgZm9yIFJhbmdlIC0tLVxuXG4gIGlzU2VsZWN0ZWQoZGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gdGhpcy52YWx1ZTtcbiAgICByZXR1cm4gISEoKHN0YXJ0ICYmIGlzU2FtZURheShkYXRlLCBzdGFydCkpIHx8IChlbmQgJiYgaXNTYW1lRGF5KGRhdGUsIGVuZCkpKTtcbiAgfVxuXG4gIC8qKiBUcnVlIHdoZW4gYGRhdGVgIGJlbG9uZ3MgdG8gYHJlZk1vbnRoYCAodXNlZCB0byBibGFuayBvdXQgYWRqYWNlbnQtbW9udGggY2VsbHMpLiAqL1xuICBpc0N1cnJlbnRNb250aChkYXRlOiBEYXRlLCByZWZNb250aDogRGF0ZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1NhbWVNb250aChkYXRlLCByZWZNb250aCk7XG4gIH1cblxuICAvKiogU3RhYmxlLCB0aW1lem9uZS1zYWZlIGBkYXRhLWRhdGVgIGtleSB1c2VkIHRvIGxvY2F0ZSBkYXkgYnV0dG9ucyBmb3IgZm9jdXMuICovXG4gIGZtdEtleShkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZm9ybWF0KGRhdGUsICd5eXl5LU1NLWRkJyk7XG4gIH1cblxuICBwcml2YXRlIGtleVRvRGF0ZShrZXk6IHN0cmluZyk6IERhdGUge1xuICAgIGNvbnN0IFt5LCBtLCBkXSA9IGtleS5zcGxpdCgnLScpLm1hcChOdW1iZXIpO1xuICAgIHJldHVybiBuZXcgRGF0ZSh5LCBtIC0gMSwgZCk7XG4gIH1cblxuICBnZXREYXlDbGFzcyhkYXRlOiBEYXRlLCByZWZNb250aDogRGF0ZSA9IHRoaXMudmlld0RhdGUpIHtcbiAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHRoaXMudmFsdWU7XG4gICAgY29uc3QgaXNPdXRzaWRlID0gIWlzU2FtZU1vbnRoKGRhdGUsIHJlZk1vbnRoKTtcbiAgICBjb25zdCBpc0Rpc2FibGVkID0gdGhpcy5pc0RhdGVEaXNhYmxlZChkYXRlKTtcblxuICAgIC8vIFJhbmdlIENoZWNrc1xuICAgIGNvbnN0IGlzU3RhcnQgPSBzdGFydCAmJiBpc1NhbWVEYXkoZGF0ZSwgc3RhcnQpO1xuICAgIGNvbnN0IGlzRW5kID0gZW5kICYmIGlzU2FtZURheShkYXRlLCBlbmQpO1xuICAgIGNvbnN0IGlzSW5zaWRlID0gc3RhcnQgJiYgZW5kICYmIGlzV2l0aGluSW50ZXJ2YWwoZGF0ZSwgeyBzdGFydCwgZW5kIH0pO1xuICAgIGNvbnN0IGlzVG9kYXlEYXRlID0gaXNUb2RheShkYXRlKTtcblxuICAgIHJldHVybiBjbihcbiAgICAgIC8vIEJhc2U6IGgtOSB3LTksIGJ1dCB3ZSByZW1vdmUgbWFyZ2lucy9yb3VuZGluZyBmb3IgdGhlICdzdHJpcCcgZWZmZWN0XG4gICAgICAnaC05IHctOSBwLTAgZm9udC1ub3JtYWwgdGV4dC1zbSB0cmFuc2l0aW9uLWFsbCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByZWxhdGl2ZSB6LTEwIGZvY3VzLXZpc2libGU6b3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6cmluZy0yIGZvY3VzLXZpc2libGU6cmluZy1yaW5nJyxcblxuICAgICAgLy8gRGVmYXVsdCBTdGF0ZSAoTm90IHNlbGVjdGVkLCBOb3QgZGlzYWJsZWQpXG4gICAgICAhaXNJbnNpZGUgJiYgIWlzU3RhcnQgJiYgIWlzRW5kICYmICFpc0Rpc2FibGVkICYmICdob3ZlcjpiZy1hY2NlbnQgaG92ZXI6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCByb3VuZGVkLW1kJyxcblxuICAgICAgLy8gVGhlIFwiQ2Fwc1wiOiBTdGFydCBhbmQgRW5kXG4gICAgICAoaXNTdGFydCB8fCBpc0VuZCkgJiYgJ2JnLXByaW1hcnkgdGV4dC1wcmltYXJ5LWZvcmVncm91bmQgaG92ZXI6YmctcHJpbWFyeSBob3Zlcjp0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCBmb2N1czpiZy1wcmltYXJ5IGZvY3VzOnRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kJyxcblxuICAgICAgLy8gVGhlIFwiU3RyaXBcIjogRGF0ZXMgYmV0d2VlbiBzdGFydCBhbmQgZW5kXG4gICAgICBpc0luc2lkZSAmJiAhaXNTdGFydCAmJiAhaXNFbmQgJiYgJ2JnLWFjY2VudCB0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIHJvdW5kZWQtbm9uZScsXG5cbiAgICAgIC8vIENvbm5lY3RpbmcgdGhlIENhcHMgdG8gdGhlIFN0cmlwIChSZWN0YW5ndWxhciBpbnNpZGUgZWRnZXMpXG4gICAgICBpc1N0YXJ0ICYmIGVuZCAmJiAncm91bmRlZC1sLW1kIHJvdW5kZWQtci1ub25lJyxcbiAgICAgIGlzRW5kICYmIHN0YXJ0ICYmICdyb3VuZGVkLXItbWQgcm91bmRlZC1sLW5vbmUnLFxuICAgICAgLy8gSWYgbm8gZW5kIGRhdGUgeWV0LCBTdGFydCBzaG91bGQgYmUgZnVsbHkgcm91bmRlZFxuICAgICAgaXNTdGFydCAmJiAhZW5kICYmICdyb3VuZGVkLW1kJyxcblxuICAgICAgLy8gTXV0ZWQvRGlzYWJsZWQgbG9naWNcbiAgICAgICFpc0luc2lkZSAmJiBpc1RvZGF5RGF0ZSAmJiAhaXNTdGFydCAmJiAhaXNFbmQgJiYgJ2JnLWFjY2VudC81MCB0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIHJvdW5kZWQtbWQnLFxuICAgICAgKGlzT3V0c2lkZSB8fCBpc0Rpc2FibGVkKSAmJiAndGV4dC1tdXRlZC1mb3JlZ3JvdW5kIG9wYWNpdHktNTAnLFxuICAgICAgaXNEaXNhYmxlZCAmJiAnY3Vyc29yLW5vdC1hbGxvd2VkJ1xuICAgICk7XG4gIH1cblxuICBpc0RhdGVEaXNhYmxlZChkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZVBhc3REYXRlcyA/IGlzQmVmb3JlKGRhdGUsIHN0YXJ0T2ZEYXkobmV3IERhdGUoKSkpIDogZmFsc2U7XG4gIH1cblxuICAvLyAtLS0gQ1ZBIEltcGxlbWVudGF0aW9uIC0tLVxuICB3cml0ZVZhbHVlKHZhbDogRGF0ZVJhbmdlIHwgbnVsbCk6IHZvaWQge1xuICAgIGlmICh2YWwpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWw7XG4gICAgICBpZiAodmFsLnN0YXJ0KSB0aGlzLnZpZXdEYXRlID0gdmFsLnN0YXJ0O1xuICAgICAgdGhpcy5nZW5lcmF0ZURheXMoKTtcbiAgICAgIHRoaXMuZ2VuZXJhdGVZZWFycygpO1xuICAgIH1cbiAgfVxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHsgdGhpcy5vbkNoYW5nZSA9IGZuOyB9XG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHsgdGhpcy5vblRvdWNoZWQgPSBmbjsgfVxufVxuIl19
557
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UtY2FsZW5kYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdG9sbGUvc3JjL2xpYi9yYW5nZS1jYWxlbmRhci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQW9DLFVBQVUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFpQyxNQUFNLGVBQWUsQ0FBQztBQUNwSixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFDTCxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUN2RCxXQUFXLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFDdEQsU0FBUyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQ3pELFFBQVEsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUMvQyxNQUFNLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sWUFBWSxDQUFDOzs7QUE2SWhDLE1BQU0sT0FBTyxzQkFBc0I7SUErQmI7SUFBZ0M7SUE5QjNDLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDWCxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFDbEM7a0VBQzhEO0lBQ3JELFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDekIscUVBQXFFO0lBQzVELGNBQWMsR0FBRyxDQUFDLENBQUM7SUFDbEIsV0FBVyxHQUFHLElBQUksWUFBWSxFQUFhLENBQUMsQ0FBQyxtQ0FBbUM7SUFFMUYsV0FBVyxHQUE4QixNQUFNLENBQUM7SUFDaEQsUUFBUSxHQUFTLElBQUksSUFBSSxFQUFFLENBQUM7SUFDNUIsNEZBQTRG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U0FDRiwrQ0FDUzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRIVCwrRkFwSVMsWUFBWTs7NEZBc0lYLHNCQUFzQjtrQkExSWxDLFNBQVM7K0JBQ0Usc0JBQXNCLGNBRXBCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxhQUNaO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHVCQUF1QixDQUFDOzRCQUNyRCxLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRixZQUNTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEhUOytHQUdRLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIE9uQ2hhbmdlcywgU2ltcGxlQ2hhbmdlcywgZm9yd2FyZFJlZiwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIENoYW5nZURldGVjdG9yUmVmLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgYWRkRGF5cywgYWRkTW9udGhzLCBzdWJNb250aHMsIHN0YXJ0T2ZNb250aCwgZW5kT2ZNb250aCxcbiAgc3RhcnRPZldlZWssIGVuZE9mV2VlaywgZWFjaERheU9mSW50ZXJ2YWwsIGlzU2FtZU1vbnRoLFxuICBpc1NhbWVEYXksIGlzVG9kYXksIHNldE1vbnRoLCBzZXRZZWFyLCBhZGRZZWFycywgc3ViWWVhcnMsXG4gIGlzQmVmb3JlLCBzdGFydE9mRGF5LCBpc1dpdGhpbkludGVydmFsLCBmb3JtYXRcbn0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuL3V0aWxzL2NuJztcbmltcG9ydCB7RGF0ZVJhbmdlfSBmcm9tICcuL3R5cGVzL2RhdGUtcmFuZ2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd0b2xsZS1yYW5nZS1jYWxlbmRhcicsXG4gIHN0eWxlczogWyc6aG9zdCB7IGRpc3BsYXk6IGJsb2NrOyB9J10sXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFJhbmdlQ2FsZW5kYXJDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBbY2xhc3NdPVwiY24oJ3RleHQtcG9wb3Zlci1mb3JlZ3JvdW5kIGlubGluZS1ibG9jayBtaW4tdy1maXQnLCBib3JkZXJlZCA/ICdwLTMgYm9yZGVyIHJvdW5kZWQtbWQgYmctYmFja2dyb3VuZCBzaGFkb3ctc20nIDogJycsIGNsYXNzKVwiPlxuXG4gICAgICA8IS0tID09PT09IE1vbnRoIC8geWVhciBxdWljayBwaWNrZXJzIChzaGFyZWQgYnkgdGhlIHNpbmdsZS0gYW5kIG11bHRpLW1vbnRoIHZpZXdzKSA9PT09PSAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXJyZW50VmlldyAhPT0gJ2RhdGUnXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcHQtMSBwYi00IGdhcC0yXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwic2V0VmlldygnbW9udGgnLCBwaWNrZXJNb250aEluZGV4KVwiIFtjbGFzc109XCJoZWFkZXJCdG5DbGFzcygnbW9udGgnKVwiPlxuICAgICAgICAgICAgICB7eyBwaWNrZXJEYXRlIHwgZGF0ZTogJ01NTU0nIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzZXRWaWV3KCd5ZWFyJywgcGlja2VyTW9udGhJbmRleClcIiBbY2xhc3NdPVwiaGVhZGVyQnRuQ2xhc3MoJ3llYXInKVwiPlxuICAgICAgICAgICAgICB7eyBwaWNrZXJEYXRlIHwgZGF0ZTogJ3l5eXknIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0xXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwicHJldigpXCIgW2NsYXNzXT1cIm5hdkJ0bkNsYXNzXCIgYXJpYS1sYWJlbD1cIlByZXZpb3VzXCI+PGkgY2xhc3M9XCJyaS1hcnJvdy1sZWZ0LXMtbGluZSB0ZXh0LWxnXCI+PC9pPjwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm5leHQoKVwiIFtjbGFzc109XCJuYXZCdG5DbGFzc1wiIGFyaWEtbGFiZWw9XCJOZXh0XCI+PGkgY2xhc3M9XCJyaS1hcnJvdy1yaWdodC1zLWxpbmUgdGV4dC1sZ1wiPjwvaT48L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cImN1cnJlbnRWaWV3ID09PSAnbW9udGgnXCIgY2xhc3M9XCJncmlkIGdyaWQtY29scy0zIGdhcC0yIHctNjQgYW5pbWF0ZS1pbiBmYWRlLWluIHpvb20taW4tOTUgZHVyYXRpb24tMjAwXCI+XG4gICAgICAgICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgbW9udGggb2YgbW9udGhzOyBsZXQgaSA9IGluZGV4XCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzZWxlY3RNb250aChpKVwiXG4gICAgICAgICAgICBbY2xhc3NdPVwiY24oJ3RleHQtc20gcHktMi41IHJvdW5kZWQtbWQgaG92ZXI6YmctYWNjZW50IGhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQgdHJhbnNpdGlvbi1jb2xvcnMnLCBpID09PSBwaWNrZXJEYXRlLmdldE1vbnRoKCkgPyAnYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCcgOiAnJylcIj5cbiAgICAgICAgICAgIHt7IG1vbnRoIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgKm5nSWY9XCJjdXJyZW50VmlldyA9PT0gJ3llYXInXCIgY2xhc3M9XCJncmlkIGdyaWQtY29scy00IGdhcC0yIHctNjQgYW5pbWF0ZS1pbiBmYWRlLWluIHpvb20taW4tOTUgZHVyYXRpb24tMjAwXCI+XG4gICAgICAgICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgeWVhciBvZiB5ZWFyc1wiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwic2VsZWN0WWVhcih5ZWFyKVwiXG4gICAgICAgICAgICBbY2xhc3NdPVwiY24oJ3RleHQtc20gcHktMiByb3VuZGVkLW1kIGhvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIHRyYW5zaXRpb24tY29sb3JzJywgeWVhciA9PT0gcGlja2VyRGF0ZS5nZXRGdWxsWWVhcigpID8gJ2JnLXByaW1hcnkgdGV4dC1wcmltYXJ5LWZvcmVncm91bmQnIDogJycpXCI+XG4gICAgICAgICAgICB7eyB5ZWFyIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gPT09PT0gTXVsdGktbW9udGggdmlldyAoc2lkZS1ieS1zaWRlLCBzaGFyZWQgcmFuZ2UpID09PT09IC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImN1cnJlbnRWaWV3ID09PSAnZGF0ZScgJiYgbnVtYmVyT2ZNb250aHMgPiAxXCIgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC00IHNtOmZsZXgtcm93XCI+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG0gb2YgdmlzaWJsZU1vbnRoczsgbGV0IGlkeCA9IGluZGV4XCIgY2xhc3M9XCJzcGFjZS15LTJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB0LTEgcGItMlwiPlxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImlkeCA9PT0gMFwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwicHJldigpXCIgW2NsYXNzXT1cIm5hdkJ0bkNsYXNzXCIgYXJpYS1sYWJlbD1cIlByZXZpb3VzIG1vbnRoXCI+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwicmktYXJyb3ctbGVmdC1zLWxpbmUgdGV4dC1sZ1wiPjwvaT5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpZHggIT09IDBcIiBjbGFzcz1cImgtNyB3LTdcIj48L3NwYW4+XG5cbiAgICAgICAgICAgIDwhLS0gRWFjaCBwYW5lbCdzIG1vbnRoIGFuZCB5ZWFyIG9wZW4gdGhlIHF1aWNrIHBpY2tlcnMgZm9yIHRoYXQgcGFuZWwsXG4gICAgICAgICAgICAgICAgIHNvIGEgdHdvLW1vbnRoIHZpZXcganVtcHMgdGhlIHNhbWUgd2F5IHRoZSBzaW5nbGUtbW9udGggb25lIGRvZXMuIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzZXRWaWV3KCdtb250aCcsIGlkeClcIiBbY2xhc3NdPVwiaGVhZGVyQnRuQ2xhc3MoJ21vbnRoJylcIj57eyBtLmRhdGUgfCBkYXRlOiAnTU1NTScgfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInNldFZpZXcoJ3llYXInLCBpZHgpXCIgW2NsYXNzXT1cImhlYWRlckJ0bkNsYXNzKCd5ZWFyJylcIj57eyBtLmRhdGUgfCBkYXRlOiAneXl5eScgfX08L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaWR4ID09PSB2aXNpYmxlTW9udGhzLmxlbmd0aCAtIDFcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm5leHQoKVwiIFtjbGFzc109XCJuYXZCdG5DbGFzc1wiIGFyaWEtbGFiZWw9XCJOZXh0IG1vbnRoXCI+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwicmktYXJyb3ctcmlnaHQtcy1saW5lIHRleHQtbGdcIj48L2k+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiaWR4ICE9PSB2aXNpYmxlTW9udGhzLmxlbmd0aCAtIDFcIiBjbGFzcz1cImgtNyB3LTdcIj48L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtNyBnYXAteS0xXCI+XG4gICAgICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgZGF5IG9mIHdlZWtEYXlzXCIgY2xhc3M9XCJ0ZXh0LVswLjhyZW1dIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBmb250LW5vcm1hbCB0ZXh0LWNlbnRlciB3LTlcIj57eyBkYXkgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiByb2xlPVwiZ3JpZFwiIGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtNyBnYXAteS0xXCIgKGtleWRvd24pPVwib25HcmlkS2V5ZG93bigkZXZlbnQpXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkYXRlIG9mIG0uZGF5c1wiPlxuICAgICAgICAgICAgICA8IS0tIE9ubHkgdGhlIG1vbnRoJ3Mgb3duIGRheXMgYXJlIHJlbmRlcmVkOyBhZGphY2VudC1tb250aCBkYXlzIGFyZVxuICAgICAgICAgICAgICAgICAgIGJsYW5rIHNwYWNlcnMgc28gZWFjaCBjYWxlbmRhciBpbiBhIG11bHRpLW1vbnRoIHZpZXcgaXMgc2VsZi1jb250YWluZWQuIC0tPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpc0N1cnJlbnRNb250aChkYXRlLCBtLmRhdGUpOyBlbHNlIHBhZFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWRhdGVdPVwiZm10S2V5KGRhdGUpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cImlzU2VsZWN0ZWQoZGF0ZSlcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGRhdGUgfCBkYXRlOidmdWxsRGF0ZScpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF0ZShkYXRlKVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzRGF0ZURpc2FibGVkKGRhdGUpXCJcbiAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZ2V0RGF5Q2xhc3MoZGF0ZSwgbS5kYXRlKVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyBkYXRlIHwgZGF0ZTogJ2QnIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3BhZD48c3BhbiBjbGFzcz1cImgtOSB3LTlcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tID09PT09IFNpbmdsZS1tb250aCB2aWV3ID09PT09IC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1cnJlbnRWaWV3ID09PSAnZGF0ZScgJiYgbnVtYmVyT2ZNb250aHMgPD0gMVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHB0LTEgcGItNCBnYXAtMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInNldFZpZXcoJ21vbnRoJylcIiBbY2xhc3NdPVwiaGVhZGVyQnRuQ2xhc3MoJ21vbnRoJylcIj5cbiAgICAgICAgICAgICAge3sgdmlld0RhdGUgfCBkYXRlOiAnTU1NTScgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInNldFZpZXcoJ3llYXInKVwiIFtjbGFzc109XCJoZWFkZXJCdG5DbGFzcygneWVhcicpXCI+XG4gICAgICAgICAgICAgIHt7IHZpZXdEYXRlIHwgZGF0ZTogJ3l5eXknIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0xXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwicHJldigpXCIgW2NsYXNzXT1cIm5hdkJ0bkNsYXNzXCIgYXJpYS1sYWJlbD1cIlByZXZpb3VzIG1vbnRoXCI+PGkgY2xhc3M9XCJyaS1hcnJvdy1sZWZ0LXMtbGluZSB0ZXh0LWxnXCI+PC9pPjwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cIm5leHQoKVwiIFtjbGFzc109XCJuYXZCdG5DbGFzc1wiIGFyaWEtbGFiZWw9XCJOZXh0IG1vbnRoXCI+PGkgY2xhc3M9XCJyaS1hcnJvdy1yaWdodC1zLWxpbmUgdGV4dC1sZ1wiPjwvaT48L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNwYWNlLXktMiBhbmltYXRlLWluIGZhZGUtaW4gem9vbS1pbi05NSBkdXJhdGlvbi0yMDBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBncmlkLWNvbHMtNyBnYXAteS0xIHctZnVsbFwiPlxuICAgICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IGRheSBvZiB3ZWVrRGF5c1wiIGNsYXNzPVwidGV4dC1bMC44cmVtXSB0ZXh0LW11dGVkLWZvcmVncm91bmQgZm9udC1ub3JtYWwgdGV4dC1jZW50ZXIgdy05XCI+XG4gICAgICAgICAgICAgIHt7IGRheSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgcm9sZT1cImdyaWRcIiBjbGFzcz1cImdyaWQgZ3JpZC1jb2xzLTcgZ2FwLXktMSB3LWZ1bGxcIiAoa2V5ZG93bik9XCJvbkdyaWRLZXlkb3duKCRldmVudClcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGRhdGUgb2YgZGF5c0luTW9udGhcIlxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS1kYXRlXT1cImZtdEtleShkYXRlKVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNTZWxlY3RlZChkYXRlKVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiKGRhdGUgfCBkYXRlOidmdWxsRGF0ZScpXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdERhdGUoZGF0ZSlcIlxuICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNEYXRlRGlzYWJsZWQoZGF0ZSlcIlxuICAgICAgICAgICAgICBbY2xhc3NdPVwiZ2V0RGF5Q2xhc3MoZGF0ZSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7eyBkYXRlIHwgZGF0ZTogJ2QnIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgYFxufSlcbmV4cG9ydCBjbGFzcyBSYW5nZUNhbGVuZGFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgQElucHV0KCkgY2xhc3MgPSAnJztcbiAgQElucHV0KCkgZGlzYWJsZVBhc3REYXRlcyA9IGZhbHNlO1xuICAvKiogUmVuZGVycyB0aGUgY2FsZW5kYXIncyBvd24gYm9yZGVyL2JhY2tncm91bmQvc2hhZG93LiBTZXQgYGZhbHNlYCBpbnNpZGUgYVxuICAgKiBjYXJkL3BvcG92ZXIgdGhhdCBhbHJlYWR5IHByb3ZpZGVzIGNocm9tZS4gQGRlZmF1bHQgdHJ1ZSAqL1xuICBASW5wdXQoKSBib3JkZXJlZCA9IHRydWU7XG4gIC8qKiBOdW1iZXIgb2YgY29uc2VjdXRpdmUgbW9udGhzIHJlbmRlcmVkIHNpZGUgYnkgc2lkZS4gQGRlZmF1bHQgMSAqL1xuICBASW5wdXQoKSBudW1iZXJPZk1vbnRocyA9IDE7XG4gIEBPdXRwdXQoKSByYW5nZVNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZVJhbmdlPigpOyAvLyBFbWl0cyB3aGVuZXZlciBzZWxlY3Rpb24gY2hhbmdlc1xuXG4gIGN1cnJlbnRWaWV3OiAnZGF0ZScgfCAnbW9udGgnIHwgJ3llYXInID0gJ2RhdGUnO1xuICB2aWV3RGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCk7XG4gIC8qKiBXaGljaCB2aXNpYmxlIG1vbnRoIHRoZSBxdWljayBwaWNrZXJzIGFyZSBlZGl0aW5nOyBhbHdheXMgMCBpbiB0aGUgc2luZ2xlLW1vbnRoIHZpZXcuICovXG4gIHBpY2tlck1vbnRoSW5kZXggPSAwO1xuXG4gIC8vIFRoZSBSYW5nZSBWYWx1ZVxuICB2YWx1ZTogRGF0ZVJhbmdlID0geyBzdGFydDogbnVsbCwgZW5kOiBudWxsIH07XG5cbiAgd2Vla0RheXMgPSBbJ1N1JywgJ01vJywgJ1R1JywgJ1dlJywgJ1RoJywgJ0ZyJywgJ1NhJ107XG4gIGRheXNJbk1vbnRoOiBEYXRlW10gPSBbXTtcbiAgLyoqIEdyaWRzIGZvciBlYWNoIHZpc2libGUgbW9udGggKG11bHRpLW1vbnRoIHZpZXcpLiAqL1xuICB2aXNpYmxlTW9udGhzOiB7IGRhdGU6IERhdGU7IGRheXM6IERhdGVbXSB9W10gPSBbXTtcbiAgbW9udGhzID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYyddO1xuICB5ZWFyczogbnVtYmVyW10gPSBbXTtcblxuICBuYXZCdG5DbGFzcyA9IGNuKCdoLTcgdy03IGJnLXRyYW5zcGFyZW50IHAtMCBvcGFjaXR5LTUwIGhvdmVyOm9wYWNpdHktMTAwIGJvcmRlciBib3JkZXItaW5wdXQgcm91bmRlZC1tZCBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBob3ZlcjpiZy1hY2NlbnQgaG92ZXI6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCB0cmFuc2l0aW9uLWFsbCBmb2N1cy12aXNpYmxlOm91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMiBmb2N1cy12aXNpYmxlOnJpbmctcmluZycpO1xuXG4gIG9uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICBvbkNoYW5nZTogKHZhbHVlOiBEYXRlUmFuZ2UpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgcHJvdGVjdGVkIGNuID0gY247XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIGVsOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50Pikge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmdlbmVyYXRlRGF5cygpO1xuICAgIHRoaXMuZ2VuZXJhdGVZZWFycygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIC8vIFJlYnVpbGQgdGhlIG1vbnRoIGdyaWRzIHdoZW4gdGhlIHZpc2libGUtbW9udGggY291bnQgY2hhbmdlcyBhZnRlciBpbml0XG4gICAgLy8gKGUuZy4gYSBgW251bWJlck9mTW9udGhzXWAgdG9nZ2xlKSwgc28gc2luZ2xlIOKHhCBtdWx0aS1tb250aCBpcyByZWFjdGl2ZS5cbiAgICBpZiAoY2hhbmdlc1snbnVtYmVyT2ZNb250aHMnXSAmJiAhY2hhbmdlc1snbnVtYmVyT2ZNb250aHMnXS5maXJzdENoYW5nZSkge1xuICAgICAgdGhpcy5nZW5lcmF0ZURheXMoKTtcbiAgICB9XG4gIH1cblxuICAvLyAtLS0gRGF0ZSBHZW5lcmF0aW9uIExvZ2ljIChTYW1lIGFzIENhbGVuZGFyKSAtLS1cbiAgZ2VuZXJhdGVEYXlzKCkge1xuICAgIGNvbnN0IHN0YXJ0ID0gc3RhcnRPZldlZWsoc3RhcnRPZk1vbnRoKHRoaXMudmlld0RhdGUpKTtcbiAgICBjb25zdCBlbmQgPSBlbmRPZldlZWsoZW5kT2ZNb250aCh0aGlzLnZpZXdEYXRlKSk7XG4gICAgdGhpcy5kYXlzSW5Nb250aCA9IGVhY2hEYXlPZkludGVydmFsKHsgc3RhcnQsIGVuZCB9KTtcblxuICAgIC8vIE11bHRpLW1vbnRoIGdyaWRzOiB2aWV3RGF0ZSBpcyB0aGUgbGVmdG1vc3QgbW9udGgsIHRoZW4gTi0xIGNvbnNlY3V0aXZlLlxuICAgIGNvbnN0IGNvdW50ID0gTWF0aC5tYXgoMSwgdGhpcy5udW1iZXJPZk1vbnRocyk7XG4gICAgdGhpcy52aXNpYmxlTW9udGhzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogY291bnQgfSwgKF8sIGkpID0+IHtcbiAgICAgIGNvbnN0IG1vbnRoRGF0ZSA9IGFkZE1vbnRocyh0aGlzLnZpZXdEYXRlLCBpKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRhdGU6IG1vbnRoRGF0ZSxcbiAgICAgICAgZGF5czogZWFjaERheU9mSW50ZXJ2YWwoeyBzdGFydDogc3RhcnRPZldlZWsoc3RhcnRPZk1vbnRoKG1vbnRoRGF0ZSkpLCBlbmQ6IGVuZE9mV2VlayhlbmRPZk1vbnRoKG1vbnRoRGF0ZSkpIH0pLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGdlbmVyYXRlWWVhcnMoKSB7XG4gICAgY29uc3QgY3VycmVudFllYXIgPSB0aGlzLnBpY2tlckRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICB0aGlzLnllYXJzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMTYgfSwgKF8sIGkpID0+IGN1cnJlbnRZZWFyIC0gNiArIGkpO1xuICB9XG5cbiAgLyoqIFRoZSBtb250aCB0aGUgcXVpY2sgcGlja2VycyBhY3Qgb24g4oCUIGB2aWV3RGF0ZWAgc2hpZnRlZCB0byB0aGUgY2xpY2tlZCBwYW5lbC4gKi9cbiAgZ2V0IHBpY2tlckRhdGUoKTogRGF0ZSB7XG4gICAgcmV0dXJuIGFkZE1vbnRocyh0aGlzLnZpZXdEYXRlLCB0aGlzLnBpY2tlck1vbnRoSW5kZXgpO1xuICB9XG5cbiAgLyoqIGBtb250aEluZGV4YCBpcyB0aGUgaW5kZXggb2YgdGhlIHZpc2libGUgbW9udGggd2hvc2UgaGVhZGVyIHdhcyBjbGlja2VkLiAqL1xuICBzZXRWaWV3KHZpZXc6ICdkYXRlJyB8ICdtb250aCcgfCAneWVhcicsIG1vbnRoSW5kZXggPSAwKSB7XG4gICAgdGhpcy5waWNrZXJNb250aEluZGV4ID0gdmlldyA9PT0gJ2RhdGUnID8gMCA6IG1vbnRoSW5kZXg7XG4gICAgdGhpcy5jdXJyZW50VmlldyA9IHZpZXc7XG4gICAgaWYgKHZpZXcgPT09ICd5ZWFyJykgdGhpcy5nZW5lcmF0ZVllYXJzKCk7XG4gIH1cblxuICBoZWFkZXJCdG5DbGFzcyh2aWV3OiAnbW9udGgnIHwgJ3llYXInKSB7XG4gICAgcmV0dXJuIGNuKFxuICAgICAgJ3RleHQtc20gZm9udC1zZW1pYm9sZCBweC0yIHB5LTEgcm91bmRlZCB0cmFuc2l0aW9uLWNvbG9ycycsXG4gICAgICB0aGlzLmN1cnJlbnRWaWV3ID09PSB2aWV3ID8gJ2JnLXNlY29uZGFyeSB0ZXh0LXNlY29uZGFyeS1mb3JlZ3JvdW5kJyA6ICdob3ZlcjpiZy1hY2NlbnQgaG92ZXI6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCdcbiAgICApO1xuICB9XG5cbiAgcHJldigpIHtcbiAgICBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ2RhdGUnKSB7XG4gICAgICB0aGlzLnZpZXdEYXRlID0gc3ViTW9udGhzKHRoaXMudmlld0RhdGUsIDEpO1xuICAgICAgdGhpcy5nZW5lcmF0ZURheXMoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICd5ZWFyJykge1xuICAgICAgdGhpcy52aWV3RGF0ZSA9IHN1YlllYXJzKHRoaXMudmlld0RhdGUsIDE2KTtcbiAgICAgIHRoaXMuZ2VuZXJhdGVZZWFycygpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5jdXJyZW50VmlldyA9PT0gJ21vbnRoJykge1xuICAgICAgdGhpcy52aWV3RGF0ZSA9IHN1YlllYXJzKHRoaXMudmlld0RhdGUsIDEpO1xuICAgIH1cbiAgfVxuXG4gIG5leHQoKSB7XG4gICAgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICdkYXRlJykge1xuICAgICAgdGhpcy52aWV3RGF0ZSA9IGFkZE1vbnRocyh0aGlzLnZpZXdEYXRlLCAxKTtcbiAgICAgIHRoaXMuZ2VuZXJhdGVEYXlzKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRWaWV3ID09PSAneWVhcicpIHtcbiAgICAgIHRoaXMudmlld0RhdGUgPSBhZGRZZWFycyh0aGlzLnZpZXdEYXRlLCAxNik7XG4gICAgICB0aGlzLmdlbmVyYXRlWWVhcnMoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFZpZXcgPT09ICdtb250aCcpIHtcbiAgICAgIHRoaXMudmlld0RhdGUgPSBhZGRZZWFycyh0aGlzLnZpZXdEYXRlLCAxKTtcbiAgICB9XG4gIH1cblxuICAvLyAtLS0gUmFuZ2UgU2VsZWN0aW9uIExvZ2ljIC0tLVxuXG4gIHNlbGVjdERhdGUoZGF0ZTogRGF0ZSkge1xuICAgIGlmICh0aGlzLmlzRGF0ZURpc2FibGVkKGRhdGUpKSByZXR1cm47XG5cbiAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHRoaXMudmFsdWU7XG5cbiAgICAvLyAxLiBJZiBzdGFydCBleGlzdHMgYnV0IGVuZCBkb2Vzbid0XG4gICAgaWYgKHN0YXJ0ICYmICFlbmQpIHtcbiAgICAgIGlmIChpc0JlZm9yZShkYXRlLCBzdGFydCkpIHtcbiAgICAgICAgLy8gVXNlciBjbGlja2VkIGVhcmxpZXIgZGF0ZSAtPiBSZXNldCBzdGFydFxuICAgICAgICB0aGlzLnZhbHVlID0geyBzdGFydDogZGF0ZSwgZW5kOiBudWxsIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBVc2VyIGNsaWNrZWQgbGF0ZXIgZGF0ZSAtPiBDb21wbGV0ZSByYW5nZVxuICAgICAgICB0aGlzLnZhbHVlID0geyBzdGFydCwgZW5kOiBkYXRlIH07XG4gICAgICB9XG4gICAgfVxuICAgIC8vIDIuIElmIG5laXRoZXIgZXhpc3QgT1IgYm90aCBleGlzdCAocmVzZXQpXG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0geyBzdGFydDogZGF0ZSwgZW5kOiBudWxsIH07XG4gICAgfVxuXG4gICAgLy8gT25seSByZS1hbmNob3IgdGhlIHZpZXcgd2hlbiB0aGUgY2xpY2tlZCBkYXkgaXNuJ3QgYWxyZWFkeSBvbiBhIHZpc2libGUgbW9udGhcbiAgICAvLyAoc28gY2xpY2tpbmcgdGhlIHJpZ2h0LWhhbmQgbW9udGggaW4gYSAyLW1vbnRoIHZpZXcgZG9lc24ndCBqdW1wIHRoZSBjYWxlbmRhcikuXG4gICAgY29uc3Qgb25WaXNpYmxlTW9udGggPSB0aGlzLnZpc2libGVNb250aHMuc29tZSgobSkgPT4gaXNTYW1lTW9udGgoZGF0ZSwgbS5kYXRlKSk7XG4gICAgaWYgKCFvblZpc2libGVNb250aCkge1xuICAgICAgdGhpcy52aWV3RGF0ZSA9IHN0YXJ0T2ZNb250aChkYXRlKTtcbiAgICAgIHRoaXMuZ2VuZXJhdGVEYXlzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgICB0aGlzLnJhbmdlU2VsZWN0LmVtaXQodGhpcy52YWx1ZSk7XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgfVxuXG4gIC8vIC0tLSBHcmlkIGtleWJvYXJkIG5hdmlnYXRpb24gKGRhdGUgdmlldyBvbmx5KSAtLS1cblxuICAvKipcbiAgICogQXJyb3cga2V5cyBtb3ZlIGJ5IGRheS93ZWVrLCBIb21lL0VuZCB0byB3ZWVrIGVkZ2VzLCBQYWdlVXAvUGFnZURvd24gYnlcbiAgICogbW9udGguIEVudGVyL1NwYWNlIGFyZSBsZWZ0IHRvIHRoZSBuYXRpdmUgZGF5IDxidXR0b24+LiBUaGUgZm9jdXNlZCBkYXkgaXNcbiAgICogcmVhZCBmcm9tIGl0cyBgZGF0YS1kYXRlYCBrZXksIHNvIG5hdmlnYXRpb24gaXMgaW5kZXBlbmRlbnQgb2YgZ3JpZCBsYXlvdXRcbiAgICogKGFkamFjZW50LW1vbnRoIGRheXMgYXJlbid0IHJlbmRlcmVkIGluIHRoZSBtdWx0aS1tb250aCB2aWV3KS5cbiAgICovXG4gIG9uR3JpZEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBpZiAodGhpcy5udW1iZXJPZk1vbnRocyA8PSAxICYmIHRoaXMuY3VycmVudFZpZXcgIT09ICdkYXRlJykgcmV0dXJuO1xuXG4gICAgY29uc3Qga2V5ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuZ2V0QXR0cmlidXRlKCdkYXRhLWRhdGUnKTtcbiAgICBpZiAoIWtleSkgcmV0dXJuO1xuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmtleVRvRGF0ZShrZXkpO1xuXG4gICAgbGV0IG5leHQ6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnQXJyb3dMZWZ0JzogbmV4dCA9IGFkZERheXMoY3VycmVudCwgLTEpOyBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOiBuZXh0ID0gYWRkRGF5cyhjdXJyZW50LCAxKTsgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd1VwJzogbmV4dCA9IGFkZERheXMoY3VycmVudCwgLTcpOyBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6IG5leHQgPSBhZGREYXlzKGN1cnJlbnQsIDcpOyBicmVhaztcbiAgICAgIGNhc2UgJ0hvbWUnOiBuZXh0ID0gc3RhcnRPZldlZWsoY3VycmVudCk7IGJyZWFrO1xuICAgICAgY2FzZSAnRW5kJzogbmV4dCA9IGVuZE9mV2VlayhjdXJyZW50KTsgYnJlYWs7XG4gICAgICBjYXNlICdQYWdlVXAnOiBuZXh0ID0gc3ViTW9udGhzKGN1cnJlbnQsIDEpOyBicmVhaztcbiAgICAgIGNhc2UgJ1BhZ2VEb3duJzogbmV4dCA9IGFkZE1vbnRocyhjdXJyZW50LCAxKTsgYnJlYWs7XG4gICAgICBkZWZhdWx0OiByZXR1cm47XG4gICAgfVxuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmZvY3VzRGF5KG5leHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBmb2N1c0RheShkYXRlOiBEYXRlKSB7XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBgW2RhdGEtZGF0ZT1cIiR7dGhpcy5mbXRLZXkoZGF0ZSl9XCJdYDtcbiAgICBsZXQgYnRuID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAoYnRuKSB7IGJ0bi5mb2N1cygpOyByZXR1cm47IH1cblxuICAgIC8vIFRhcmdldCBkYXkgaXNuJ3QgY3VycmVudGx5IHJlbmRlcmVkIOKGkiBwYWdlIHRoZSB2aWV3IHRvd2FyZCBpdCwgdGhlbiByZXRyeS5cbiAgICBpZiAodGhpcy5udW1iZXJPZk1vbnRocyA+IDEpIHtcbiAgICAgIHRoaXMudmlld0RhdGUgPSBpc0JlZm9yZShkYXRlLCB0aGlzLnZpc2libGVNb250aHNbMF0uZGF0ZSlcbiAgICAgICAgPyBzdWJNb250aHModGhpcy52aWV3RGF0ZSwgMSlcbiAgICAgICAgOiBhZGRNb250aHModGhpcy52aWV3RGF0ZSwgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmlld0RhdGUgPSBzdGFydE9mTW9udGgoZGF0ZSk7XG4gICAgfVxuICAgIHRoaXMuZ2VuZXJhdGVEYXlzKCk7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIGJ0biA9IHRoaXMuZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG4gICAgYnRuPy5mb2N1cygpO1xuICB9XG5cbiAgc2VsZWN0TW9udGgobW9udGhJbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy5hcHBseVBpY2tlckRhdGUoc2V0TW9udGgodGhpcy5waWNrZXJEYXRlLCBtb250aEluZGV4KSk7XG4gIH1cblxuICBzZWxlY3RZZWFyKHllYXI6IG51bWJlcikge1xuICAgIHRoaXMuYXBwbHlQaWNrZXJEYXRlKHNldFllYXIodGhpcy5waWNrZXJEYXRlLCB5ZWFyKSk7XG4gIH1cblxuICAvKipcbiAgICogUmUtYW5jaG9ycyB0aGUgdmlldyBzbyB0aGUgcGFuZWwgdGhlIHBpY2tlciB3YXMgb3BlbmVkIGZyb20gbGFuZHMgb24gYGRhdGVgLFxuICAgKiB0aGVuIHJldHVybnMgdG8gdGhlIGRheSBncmlkLiBJbiB0aGUgc2luZ2xlLW1vbnRoIHZpZXcgdGhlIG9mZnNldCBpcyAwLCBzb1xuICAgKiB0aGlzIGlzIGp1c3QgXCJzaG93IHRoYXQgbW9udGhcIi5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlQaWNrZXJEYXRlKGRhdGU6IERhdGUpIHtcbiAgICB0aGlzLnZpZXdEYXRlID0gc3RhcnRPZk1vbnRoKHN1Yk1vbnRocyhkYXRlLCB0aGlzLnBpY2tlck1vbnRoSW5kZXgpKTtcbiAgICB0aGlzLnBpY2tlck1vbnRoSW5kZXggPSAwO1xuICAgIHRoaXMuY3VycmVudFZpZXcgPSAnZGF0ZSc7XG4gICAgdGhpcy5nZW5lcmF0ZURheXMoKTtcbiAgfVxuXG4gIC8vIC0tLSBWaXN1YWwgU3R5bGluZyBmb3IgUmFuZ2UgLS0tXG5cbiAgaXNTZWxlY3RlZChkYXRlOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyBzdGFydCwgZW5kIH0gPSB0aGlzLnZhbHVlO1xuICAgIHJldHVybiAhISgoc3RhcnQgJiYgaXNTYW1lRGF5KGRhdGUsIHN0YXJ0KSkgfHwgKGVuZCAmJiBpc1NhbWVEYXkoZGF0ZSwgZW5kKSkpO1xuICB9XG5cbiAgLyoqIFRydWUgd2hlbiBgZGF0ZWAgYmVsb25ncyB0byBgcmVmTW9udGhgICh1c2VkIHRvIGJsYW5rIG91dCBhZGphY2VudC1tb250aCBjZWxscykuICovXG4gIGlzQ3VycmVudE1vbnRoKGRhdGU6IERhdGUsIHJlZk1vbnRoOiBEYXRlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzU2FtZU1vbnRoKGRhdGUsIHJlZk1vbnRoKTtcbiAgfVxuXG4gIC8qKiBTdGFibGUsIHRpbWV6b25lLXNhZmUgYGRhdGEtZGF0ZWAga2V5IHVzZWQgdG8gbG9jYXRlIGRheSBidXR0b25zIGZvciBmb2N1cy4gKi9cbiAgZm10S2V5KGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIHJldHVybiBmb3JtYXQoZGF0ZSwgJ3l5eXktTU0tZGQnKTtcbiAgfVxuXG4gIHByaXZhdGUga2V5VG9EYXRlKGtleTogc3RyaW5nKTogRGF0ZSB7XG4gICAgY29uc3QgW3ksIG0sIGRdID0ga2V5LnNwbGl0KCctJykubWFwKE51bWJlcik7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHksIG0gLSAxLCBkKTtcbiAgfVxuXG4gIGdldERheUNsYXNzKGRhdGU6IERhdGUsIHJlZk1vbnRoOiBEYXRlID0gdGhpcy52aWV3RGF0ZSkge1xuICAgIGNvbnN0IHsgc3RhcnQsIGVuZCB9ID0gdGhpcy52YWx1ZTtcbiAgICBjb25zdCBpc091dHNpZGUgPSAhaXNTYW1lTW9udGgoZGF0ZSwgcmVmTW9udGgpO1xuICAgIGNvbnN0IGlzRGlzYWJsZWQgPSB0aGlzLmlzRGF0ZURpc2FibGVkKGRhdGUpO1xuXG4gICAgLy8gUmFuZ2UgQ2hlY2tzXG4gICAgY29uc3QgaXNTdGFydCA9IHN0YXJ0ICYmIGlzU2FtZURheShkYXRlLCBzdGFydCk7XG4gICAgY29uc3QgaXNFbmQgPSBlbmQgJiYgaXNTYW1lRGF5KGRhdGUsIGVuZCk7XG4gICAgY29uc3QgaXNJbnNpZGUgPSBzdGFydCAmJiBlbmQgJiYgaXNXaXRoaW5JbnRlcnZhbChkYXRlLCB7IHN0YXJ0LCBlbmQgfSk7XG4gICAgY29uc3QgaXNUb2RheURhdGUgPSBpc1RvZGF5KGRhdGUpO1xuXG4gICAgcmV0dXJuIGNuKFxuICAgICAgLy8gQmFzZTogaC05IHctOSwgYnV0IHdlIHJlbW92ZSBtYXJnaW5zL3JvdW5kaW5nIGZvciB0aGUgJ3N0cmlwJyBlZmZlY3RcbiAgICAgICdoLTkgdy05IHAtMCBmb250LW5vcm1hbCB0ZXh0LXNtIHRyYW5zaXRpb24tYWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJlbGF0aXZlIHotMTAgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpyaW5nLTIgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcnLFxuXG4gICAgICAvLyBEZWZhdWx0IFN0YXRlIChOb3Qgc2VsZWN0ZWQsIE5vdCBkaXNhYmxlZClcbiAgICAgICFpc0luc2lkZSAmJiAhaXNTdGFydCAmJiAhaXNFbmQgJiYgIWlzRGlzYWJsZWQgJiYgJ2hvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIHJvdW5kZWQtbWQnLFxuXG4gICAgICAvLyBUaGUgXCJDYXBzXCI6IFN0YXJ0IGFuZCBFbmRcbiAgICAgIChpc1N0YXJ0IHx8IGlzRW5kKSAmJiAnYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCBob3ZlcjpiZy1wcmltYXJ5IGhvdmVyOnRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kIGZvY3VzOmJnLXByaW1hcnkgZm9jdXM6dGV4dC1wcmltYXJ5LWZvcmVncm91bmQnLFxuXG4gICAgICAvLyBUaGUgXCJTdHJpcFwiOiBEYXRlcyBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmRcbiAgICAgIGlzSW5zaWRlICYmICFpc1N0YXJ0ICYmICFpc0VuZCAmJiAnYmctYWNjZW50IHRleHQtYWNjZW50LWZvcmVncm91bmQgcm91bmRlZC1ub25lJyxcblxuICAgICAgLy8gQ29ubmVjdGluZyB0aGUgQ2FwcyB0byB0aGUgU3RyaXAgKFJlY3Rhbmd1bGFyIGluc2lkZSBlZGdlcylcbiAgICAgIGlzU3RhcnQgJiYgZW5kICYmICdyb3VuZGVkLWwtbWQgcm91bmRlZC1yLW5vbmUnLFxuICAgICAgaXNFbmQgJiYgc3RhcnQgJiYgJ3JvdW5kZWQtci1tZCByb3VuZGVkLWwtbm9uZScsXG4gICAgICAvLyBJZiBubyBlbmQgZGF0ZSB5ZXQsIFN0YXJ0IHNob3VsZCBiZSBmdWxseSByb3VuZGVkXG4gICAgICBpc1N0YXJ0ICYmICFlbmQgJiYgJ3JvdW5kZWQtbWQnLFxuXG4gICAgICAvLyBNdXRlZC9EaXNhYmxlZCBsb2dpY1xuICAgICAgIWlzSW5zaWRlICYmIGlzVG9kYXlEYXRlICYmICFpc1N0YXJ0ICYmICFpc0VuZCAmJiAnYmctYWNjZW50LzUwIHRleHQtYWNjZW50LWZvcmVncm91bmQgcm91bmRlZC1tZCcsXG4gICAgICAoaXNPdXRzaWRlIHx8IGlzRGlzYWJsZWQpICYmICd0ZXh0LW11dGVkLWZvcmVncm91bmQgb3BhY2l0eS01MCcsXG4gICAgICBpc0Rpc2FibGVkICYmICdjdXJzb3Itbm90LWFsbG93ZWQnXG4gICAgKTtcbiAgfVxuXG4gIGlzRGF0ZURpc2FibGVkKGRhdGU6IERhdGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlUGFzdERhdGVzID8gaXNCZWZvcmUoZGF0ZSwgc3RhcnRPZkRheShuZXcgRGF0ZSgpKSkgOiBmYWxzZTtcbiAgfVxuXG4gIC8vIC0tLSBDVkEgSW1wbGVtZW50YXRpb24gLS0tXG4gIHdyaXRlVmFsdWUodmFsOiBEYXRlUmFuZ2UgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHZhbCkge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbDtcbiAgICAgIGlmICh2YWwuc3RhcnQpIHRoaXMudmlld0RhdGUgPSB2YWwuc3RhcnQ7XG4gICAgICB0aGlzLmdlbmVyYXRlRGF5cygpO1xuICAgICAgdGhpcy5nZW5lcmF0ZVllYXJzKCk7XG4gICAgfVxuICB9XG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQgeyB0aGlzLm9uQ2hhbmdlID0gZm47IH1cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQgeyB0aGlzLm9uVG91Y2hlZCA9IGZuOyB9XG59XG4iXX0=