@firestitch/report 18.6.0 → 18.6.1

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 (31) hide show
  1. package/app/reports/components/component-kpi/component-kpi.component.d.ts +2 -1
  2. package/app/reports/components/component-list/component-list.component.d.ts +0 -1
  3. package/app/reports/components/report-canvas/report-canvas.component.d.ts +1 -0
  4. package/app/reports/components/report-component/report-component.component.d.ts +2 -1
  5. package/app/reports/format.d.ts +2 -2
  6. package/app/reports/interfaces/report.interface.d.ts +1 -0
  7. package/app/reports/option-builder.d.ts +2 -1
  8. package/app/reports/report-url-state.d.ts +1 -0
  9. package/app/reports/services/report-filter-state.service.d.ts +3 -0
  10. package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +7 -4
  11. package/esm2022/app/reports/components/component-list/component-list.component.mjs +6 -28
  12. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +8 -3
  13. package/esm2022/app/reports/components/report-component/report-component.component.mjs +5 -3
  14. package/esm2022/app/reports/dialogs/global-settings/global-settings.component.mjs +2 -2
  15. package/esm2022/app/reports/export/report-export-collector.service.mjs +8 -6
  16. package/esm2022/app/reports/export/report-pdf.service.mjs +7 -6
  17. package/esm2022/app/reports/export/report-pptx.service.mjs +7 -6
  18. package/esm2022/app/reports/format.mjs +13 -7
  19. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  20. package/esm2022/app/reports/option-builder.mjs +16 -1
  21. package/esm2022/app/reports/report-url-state.mjs +5 -1
  22. package/esm2022/app/reports/services/report-filter-state.service.mjs +43 -12
  23. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +11 -4
  24. package/esm2022/app/reports/views/report/report.component.mjs +6 -2
  25. package/fesm2022/{firestitch-report-echarts-B9nl9XKM.mjs → firestitch-report-echarts-Djtmaxj1.mjs} +2 -2
  26. package/fesm2022/{firestitch-report-echarts-B9nl9XKM.mjs.map → firestitch-report-echarts-Djtmaxj1.mjs.map} +1 -1
  27. package/fesm2022/{firestitch-report-firestitch-report-Bb65HEYB.mjs → firestitch-report-firestitch-report-D3zseBZc.mjs} +130 -91
  28. package/fesm2022/firestitch-report-firestitch-report-D3zseBZc.mjs.map +1 -0
  29. package/fesm2022/firestitch-report.mjs +1 -1
  30. package/package.json +1 -1
  31. package/fesm2022/firestitch-report-firestitch-report-Bb65HEYB.mjs.map +0 -1
@@ -4,9 +4,10 @@ import * as i0 from "@angular/core";
4
4
  export declare class ComponentKpiComponent implements OnChanges {
5
5
  component: ReportComponent;
6
6
  data: ComponentData | null;
7
+ readonly ratioPercent: import("@angular/core").InputSignal<boolean>;
7
8
  value: string;
8
9
  label: string;
9
10
  ngOnChanges(): void;
10
11
  static ɵfac: i0.ɵɵFactoryDeclaration<ComponentKpiComponent, never>;
11
- static ɵcmp: i0.ɵɵComponentDeclaration<ComponentKpiComponent, "app-report-component-kpi", never, { "component": { "alias": "component"; "required": false; }; "data": { "alias": "data"; "required": false; }; }, {}, never, never, true, never>;
12
+ static ɵcmp: i0.ɵɵComponentDeclaration<ComponentKpiComponent, "app-report-component-kpi", never, { "component": { "alias": "component"; "required": false; }; "data": { "alias": "data"; "required": false; }; "ratioPercent": { "alias": "ratioPercent"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
12
13
  }
@@ -22,7 +22,6 @@ export declare class ComponentListComponent implements OnInit {
22
22
  private _initListConfig;
23
23
  private _fetch;
24
24
  private _pivotColumns;
25
- private _spansMultipleYears;
26
25
  static ɵfac: i0.ɵɵFactoryDeclaration<ComponentListComponent, never>;
27
26
  static ɵcmp: i0.ɵɵComponentDeclaration<ComponentListComponent, "app-report-component-list", never, { "reportId": { "alias": "reportId"; "required": false; }; "component": { "alias": "component"; "required": false; }; }, {}, never, never, true, never>;
28
27
  }
@@ -59,6 +59,7 @@ export declare class ReportCanvasComponent implements OnChanges, AfterViewInit {
59
59
  get headingSizePx(): number;
60
60
  ngAfterViewInit(): void;
61
61
  get isFlow(): boolean;
62
+ get ratioPercent(): boolean;
62
63
  get activePage(): ReportPage | null;
63
64
  get bands(): ReportHeaderFooter;
64
65
  get masterComponents(): ReportComponent[];
@@ -27,6 +27,7 @@ export declare class ReportComponentComponent implements OnInit, OnChanges {
27
27
  }>;
28
28
  openSettings: EventEmitter<ReportComponentModel>;
29
29
  readonly tokens: import("@angular/core").InputSignal<TextTokenContext>;
30
+ readonly ratioPercent: import("@angular/core").InputSignal<boolean>;
30
31
  readonly removed: import("@angular/core").OutputEmitterRef<number>;
31
32
  readonly textEditing: import("@angular/core").WritableSignal<boolean>;
32
33
  chartComponent: ComponentChartComponent;
@@ -77,6 +78,6 @@ export declare class ReportComponentComponent implements OnInit, OnChanges {
77
78
  private _applyGeometry;
78
79
  private _load;
79
80
  static ɵfac: i0.ɵɵFactoryDeclaration<ReportComponentComponent, never>;
80
- static ɵcmp: i0.ɵɵComponentDeclaration<ReportComponentComponent, "app-report-component", never, { "reportId": { "alias": "reportId"; "required": false; }; "component": { "alias": "component"; "required": false; }; "groups": { "alias": "groups"; "required": false; }; "editMode": { "alias": "editMode"; "required": false; }; "layout": { "alias": "layout"; "required": false; }; "zoom": { "alias": "zoom"; "required": false; }; "snapper": { "alias": "snapper"; "required": false; }; "selected": { "alias": "selected"; "required": false; }; "tokens": { "alias": "tokens"; "required": false; "isSignal": true; }; }, { "selectComponent": "selectComponent"; "positionChanged": "positionChanged"; "flowReorder": "flowReorder"; "openSettings": "openSettings"; "removed": "removed"; }, never, never, true, never>;
81
+ static ɵcmp: i0.ɵɵComponentDeclaration<ReportComponentComponent, "app-report-component", never, { "reportId": { "alias": "reportId"; "required": false; }; "component": { "alias": "component"; "required": false; }; "groups": { "alias": "groups"; "required": false; }; "editMode": { "alias": "editMode"; "required": false; }; "layout": { "alias": "layout"; "required": false; }; "zoom": { "alias": "zoom"; "required": false; }; "snapper": { "alias": "snapper"; "required": false; }; "selected": { "alias": "selected"; "required": false; }; "tokens": { "alias": "tokens"; "required": false; "isSignal": true; }; "ratioPercent": { "alias": "ratioPercent"; "required": false; "isSignal": true; }; }, { "selectComponent": "selectComponent"; "positionChanged": "positionChanged"; "flowReorder": "flowReorder"; "openSettings": "openSettings"; "removed": "removed"; }, never, never, true, never>;
81
82
  }
82
83
  export {};
@@ -1,8 +1,8 @@
1
1
  import { Report } from './interfaces/report.interface';
2
- export declare function formatMeasureValue(value: unknown, format?: string, precision?: number): string;
2
+ export declare function formatMeasureValue(value: unknown, format?: string, precision?: number, ratioPercent?: boolean): string;
3
3
  export declare const AXIS_SEPARATOR_THRESHOLD = 1000;
4
4
  export declare function chartAxisFormatCode(series: (number | null)[][], stacked: boolean): string;
5
- export declare function resolveReportTimezone(report: Pick<Report, 'effectiveTimezone'>): string;
5
+ export declare function resolveReportTimezone(report: Pick<Report, 'effectiveTimezone' | 'timezone'>): string;
6
6
  export declare function formatReportDate(value: unknown, timezone: string): string;
7
7
  export declare function getTimezoneLabel(timezone: string): string;
8
8
  export declare function getZonedNow(timezone: string): Date;
@@ -5,6 +5,7 @@ export interface Report {
5
5
  layout: ReportLayout;
6
6
  timezone: string | null;
7
7
  effectiveTimezone?: string;
8
+ percentFormat?: 'ratio';
8
9
  config: ReportConfig;
9
10
  pageWidth: number;
10
11
  pageHeight: number;
@@ -1,5 +1,5 @@
1
1
  import type { EChartsOption } from 'echarts';
2
- import { AxisChartType, ChartConfig, ChartGranularity, ComponentData, LegendPosition, ReportComponent, WaterfallStepKind } from './interfaces/report.interface';
2
+ import { AxisChartType, ChartConfig, ChartGranularity, ComponentData, LegendPosition, ListConfig, ReportComponent, WaterfallStepKind } from './interfaces/report.interface';
3
3
  export declare function isColorBy(config: ChartConfig): boolean;
4
4
  export declare function colorByColumn(config: ChartConfig): string | undefined;
5
5
  export interface ExtractedChartSeries {
@@ -28,3 +28,4 @@ export declare function buildChartOption(component: ReportComponent, data: Compo
28
28
  export declare function resolveLegendPosition(config: ChartConfig, seriesCount: number, colorBy?: boolean): LegendPosition;
29
29
  export declare function spansMultipleYears(categories: string[]): boolean;
30
30
  export declare function formatPeriodLabel(value: string, granularity: ChartGranularity, multiYear: boolean): string;
31
+ export declare function pivotHeadings(config: ListConfig, data: ComponentData): string[];
@@ -1,5 +1,6 @@
1
1
  import { ParamMap, Params } from '@angular/router';
2
2
  import { FilterGroupValue, ReportFilterType, ReportSort, ReportUrlParams, ReportUrlSnapshot } from './interfaces/report.interface';
3
+ export { GROUP_PARAM_PREFIX } from './report-filter-items';
3
4
  export declare const LIST_SORT_PARAM_PREFIX = "s";
4
5
  export declare const DATE_RANGE_SEPARATOR = "..";
5
6
  export declare const OWNED_PARAM: RegExp;
@@ -38,9 +38,12 @@ export declare class ReportFilterStateService {
38
38
  private _resolvedFields;
39
39
  private _seed;
40
40
  private _restore;
41
+ private _restoreGroups;
42
+ private _restoreListSorts;
41
43
  private _prune;
42
44
  private _withPreset;
43
45
  private _isDefault;
46
+ private _components;
44
47
  private _listComponents;
45
48
  private _sortableColumns;
46
49
  private _defaultValue;
@@ -1,4 +1,4 @@
1
- import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, Input, input } from '@angular/core';
2
2
  import { formatMeasureValue } from '../../format';
3
3
  import * as i0 from "@angular/core";
4
4
  // A single big number: the component's measure aggregated over all (filtered)
@@ -6,6 +6,9 @@ import * as i0 from "@angular/core";
6
6
  export class ComponentKpiComponent {
7
7
  component;
8
8
  data = null;
9
+ // Whether a percent value is a 0-1 ratio (the report's percentFormat). An
10
+ // older server sends it already x100, and it is printed as it came.
11
+ ratioPercent = input(true);
9
12
  value = '—';
10
13
  label = '';
11
14
  ngOnChanges() {
@@ -17,10 +20,10 @@ export class ComponentKpiComponent {
17
20
  return;
18
21
  }
19
22
  const column = config.measure?.column ?? Object.keys(row)[0];
20
- this.value = formatMeasureValue(row[column], config.measure?.format, config.measure?.precision);
23
+ this.value = formatMeasureValue(row[column], config.measure?.format, config.measure?.precision, this.ratioPercent());
21
24
  }
22
25
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentKpiComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
23
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ComponentKpiComponent, isStandalone: true, selector: "app-report-component-kpi", inputs: { component: "component", data: "data" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"kpi\">\n <div class=\"kpi-value\">{{ value }}</div>\n @if (label) {\n <div class=\"kpi-label\">{{ label }}</div>\n }\n</div>\n", styles: [":host{display:block;width:100%;height:100%}.kpi{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px}.kpi .kpi-value{font-size:34px;font-weight:600;color:#1f2933;line-height:1}.kpi .kpi-label{font-size:12px;color:#7b8794}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
26
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ComponentKpiComponent, isStandalone: true, selector: "app-report-component-kpi", inputs: { component: { classPropertyName: "component", publicName: "component", isSignal: false, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: false, isRequired: false, transformFunction: null }, ratioPercent: { classPropertyName: "ratioPercent", publicName: "ratioPercent", isSignal: true, isRequired: false, transformFunction: null } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"kpi\">\n <div class=\"kpi-value\">{{ value }}</div>\n @if (label) {\n <div class=\"kpi-label\">{{ label }}</div>\n }\n</div>\n", styles: [":host{display:block;width:100%;height:100%}.kpi{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px}.kpi .kpi-value{font-size:34px;font-weight:600;color:#1f2933;line-height:1}.kpi .kpi-label{font-size:12px;color:#7b8794}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
24
27
  }
25
28
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentKpiComponent, decorators: [{
26
29
  type: Component,
@@ -30,4 +33,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
30
33
  }], data: [{
31
34
  type: Input
32
35
  }] } });
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWtwaS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvY29tcG9uZW50cy9jb21wb25lbnQta3BpL2NvbXBvbmVudC1rcGkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWtwaS9jb21wb25lbnQta3BpLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBRXJGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7QUFJbEQsOEVBQThFO0FBQzlFLG9EQUFvRDtBQVFwRCxNQUFNLE9BQU8scUJBQXFCO0lBRWhCLFNBQVMsQ0FBa0I7SUFDM0IsSUFBSSxHQUF5QixJQUFJLENBQUM7SUFFM0MsS0FBSyxHQUFHLEdBQUcsQ0FBQztJQUNaLEtBQUssR0FBRyxFQUFFLENBQUM7SUFFWCxXQUFXO1FBQ2hCLE1BQU0sTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLElBQUksRUFBRSxDQUFjLENBQUM7UUFDM0QsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUM7UUFFekMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVCxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztZQUVqQixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLEtBQUssR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNsRyxDQUFDO3dHQXJCVSxxQkFBcUI7NEZBQXJCLHFCQUFxQiwySkNmbEMsbUpBTUE7OzRGRFNhLHFCQUFxQjtrQkFQakMsU0FBUzsrQkFDRSwwQkFBMEIsbUJBR25CLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSTs4QkFJQSxTQUFTO3NCQUF4QixLQUFLO2dCQUNVLElBQUk7c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IGZvcm1hdE1lYXN1cmVWYWx1ZSB9IGZyb20gJy4uLy4uL2Zvcm1hdCc7XG5pbXBvcnQgeyBDb21wb25lbnREYXRhLCBLcGlDb25maWcsIFJlcG9ydENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5cblxuLy8gQSBzaW5nbGUgYmlnIG51bWJlcjogdGhlIGNvbXBvbmVudCdzIG1lYXN1cmUgYWdncmVnYXRlZCBvdmVyIGFsbCAoZmlsdGVyZWQpXG4vLyByb3dzIHNlcnZlci1zaWRlOyB0aGlzIGp1c3QgZm9ybWF0cyB0aGUgb25lIGNlbGwuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcmVwb3J0LWNvbXBvbmVudC1rcGknLFxuICB0ZW1wbGF0ZVVybDogJy4vY29tcG9uZW50LWtwaS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvbXBvbmVudC1rcGkuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudEtwaUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG5cbiAgQElucHV0KCkgcHVibGljIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50O1xuICBASW5wdXQoKSBwdWJsaWMgZGF0YTogQ29tcG9uZW50RGF0YSB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyB2YWx1ZSA9ICfigJQnO1xuICBwdWJsaWMgbGFiZWwgPSAnJztcblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoKTogdm9pZCB7XG4gICAgY29uc3QgY29uZmlnID0gKHRoaXMuY29tcG9uZW50Py5jb25maWcgPz8ge30pIGFzIEtwaUNvbmZpZztcbiAgICB0aGlzLmxhYmVsID0gY29uZmlnLm1lYXN1cmU/LmxhYmVsID8/ICcnO1xuXG4gICAgY29uc3Qgcm93ID0gdGhpcy5kYXRhPy5yb3dzPy5bMF07XG4gICAgaWYgKCFyb3cpIHtcbiAgICAgIHRoaXMudmFsdWUgPSAn4oCUJztcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbHVtbiA9IGNvbmZpZy5tZWFzdXJlPy5jb2x1bW4gPz8gT2JqZWN0LmtleXMocm93KVswXTtcbiAgICB0aGlzLnZhbHVlID0gZm9ybWF0TWVhc3VyZVZhbHVlKHJvd1tjb2x1bW5dLCBjb25maWcubWVhc3VyZT8uZm9ybWF0LCBjb25maWcubWVhc3VyZT8ucHJlY2lzaW9uKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImtwaVwiPlxuICA8ZGl2IGNsYXNzPVwia3BpLXZhbHVlXCI+e3sgdmFsdWUgfX08L2Rpdj5cbiAgQGlmIChsYWJlbCkge1xuICAgIDxkaXYgY2xhc3M9XCJrcGktbGFiZWxcIj57eyBsYWJlbCB9fTwvZGl2PlxuICB9XG48L2Rpdj5cbiJdfQ==
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWtwaS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvY29tcG9uZW50cy9jb21wb25lbnQta3BpL2NvbXBvbmVudC1rcGkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWtwaS9jb21wb25lbnQta3BpLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFhLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU1RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7O0FBSWxELDhFQUE4RTtBQUM5RSxvREFBb0Q7QUFRcEQsTUFBTSxPQUFPLHFCQUFxQjtJQUVoQixTQUFTLENBQWtCO0lBQzNCLElBQUksR0FBeUIsSUFBSSxDQUFDO0lBRWxELDBFQUEwRTtJQUMxRSxvRUFBb0U7SUFDcEQsWUFBWSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVwQyxLQUFLLEdBQUcsR0FBRyxDQUFDO0lBQ1osS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUVYLFdBQVc7UUFDaEIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sSUFBSSxFQUFFLENBQWMsQ0FBQztRQUMzRCxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLEVBQUUsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUV6QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO1lBRWpCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsS0FBSyxHQUFHLGtCQUFrQixDQUM3QixHQUFHLENBQUMsTUFBTSxDQUFDLEVBQ1gsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQ3RCLE1BQU0sQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUN6QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQ3BCLENBQUM7SUFDSixDQUFDO3dHQTlCVSxxQkFBcUI7NEZBQXJCLHFCQUFxQiw2ZkNmbEMsbUpBTUE7OzRGRFNhLHFCQUFxQjtrQkFQakMsU0FBUzsrQkFDRSwwQkFBMEIsbUJBR25CLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSTs4QkFJQSxTQUFTO3NCQUF4QixLQUFLO2dCQUNVLElBQUk7c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBpbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBmb3JtYXRNZWFzdXJlVmFsdWUgfSBmcm9tICcuLi8uLi9mb3JtYXQnO1xuaW1wb3J0IHsgQ29tcG9uZW50RGF0YSwgS3BpQ29uZmlnLCBSZXBvcnRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuXG5cbi8vIEEgc2luZ2xlIGJpZyBudW1iZXI6IHRoZSBjb21wb25lbnQncyBtZWFzdXJlIGFnZ3JlZ2F0ZWQgb3ZlciBhbGwgKGZpbHRlcmVkKVxuLy8gcm93cyBzZXJ2ZXItc2lkZTsgdGhpcyBqdXN0IGZvcm1hdHMgdGhlIG9uZSBjZWxsLlxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXJlcG9ydC1jb21wb25lbnQta3BpJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbXBvbmVudC1rcGkuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jb21wb25lbnQta3BpLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBDb21wb25lbnRLcGlDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuXG4gIEBJbnB1dCgpIHB1YmxpYyBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudDtcbiAgQElucHV0KCkgcHVibGljIGRhdGE6IENvbXBvbmVudERhdGEgfCBudWxsID0gbnVsbDtcblxuICAvLyBXaGV0aGVyIGEgcGVyY2VudCB2YWx1ZSBpcyBhIDAtMSByYXRpbyAodGhlIHJlcG9ydCdzIHBlcmNlbnRGb3JtYXQpLiBBblxuICAvLyBvbGRlciBzZXJ2ZXIgc2VuZHMgaXQgYWxyZWFkeSB4MTAwLCBhbmQgaXQgaXMgcHJpbnRlZCBhcyBpdCBjYW1lLlxuICBwdWJsaWMgcmVhZG9ubHkgcmF0aW9QZXJjZW50ID0gaW5wdXQodHJ1ZSk7XG5cbiAgcHVibGljIHZhbHVlID0gJ+KAlCc7XG4gIHB1YmxpYyBsYWJlbCA9ICcnO1xuXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICBjb25zdCBjb25maWcgPSAodGhpcy5jb21wb25lbnQ/LmNvbmZpZyA/PyB7fSkgYXMgS3BpQ29uZmlnO1xuICAgIHRoaXMubGFiZWwgPSBjb25maWcubWVhc3VyZT8ubGFiZWwgPz8gJyc7XG5cbiAgICBjb25zdCByb3cgPSB0aGlzLmRhdGE/LnJvd3M/LlswXTtcbiAgICBpZiAoIXJvdykge1xuICAgICAgdGhpcy52YWx1ZSA9ICfigJQnO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29sdW1uID0gY29uZmlnLm1lYXN1cmU/LmNvbHVtbiA/PyBPYmplY3Qua2V5cyhyb3cpWzBdO1xuICAgIHRoaXMudmFsdWUgPSBmb3JtYXRNZWFzdXJlVmFsdWUoXG4gICAgICByb3dbY29sdW1uXSxcbiAgICAgIGNvbmZpZy5tZWFzdXJlPy5mb3JtYXQsXG4gICAgICBjb25maWcubWVhc3VyZT8ucHJlY2lzaW9uLFxuICAgICAgdGhpcy5yYXRpb1BlcmNlbnQoKSxcbiAgICApO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwia3BpXCI+XG4gIDxkaXYgY2xhc3M9XCJrcGktdmFsdWVcIj57eyB2YWx1ZSB9fTwvZGl2PlxuICBAaWYgKGxhYmVsKSB7XG4gICAgPGRpdiBjbGFzcz1cImtwaS1sYWJlbFwiPnt7IGxhYmVsIH19PC9kaXY+XG4gIH1cbjwvZGl2PlxuIl19
@@ -3,7 +3,7 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
3
  import { FsListComponent, FsListModule, PaginationStrategy } from '@firestitch/list';
4
4
  import { map } from 'rxjs';
5
5
  import { ReportData } from '../../data/report.data';
6
- import { formatPeriodLabel } from '../../option-builder';
6
+ import { pivotHeadings } from '../../option-builder';
7
7
  import { ReportDatePipe } from '../../pipes/report-date.pipe';
8
8
  import { ReportFilterStateService } from '../../services/report-filter-state.service';
9
9
  import * as i0 from "@angular/core";
@@ -132,34 +132,12 @@ export class ComponentListComponent {
132
132
  };
133
133
  }));
134
134
  }
135
- // A cross-tab's columns, built from the wire. The first is the row key and
136
- // keeps its authored label; the rest are pivot VALUES used as headings. When
137
- // the pivot axis is a time dimension the server sends the grain it bucketed
138
- // at, so a period-start like "2026-01-01" is shown as "Jan 2026" — the same
139
- // formatter the chart's x-axis uses, so a grid and a chart of the same query
140
- // label their periods identically.
135
+ // A cross-tab's columns, built from the wire, headed by pivotHeadings(): the
136
+ // same headings the PDF and PowerPoint exports print.
141
137
  _pivotColumns(data) {
142
138
  const config = (this.component.config ?? {});
143
- const granularity = data.granularity;
144
- const multiYear = this._spansMultipleYears(data.columns ?? []);
145
- return (data.columns ?? []).map((column, index) => {
146
- if (index === 0) {
147
- return { column, label: config.rowBy?.label || column };
148
- }
149
- return {
150
- column,
151
- label: granularity ? formatPeriodLabel(column, granularity, multiYear) : column,
152
- };
153
- });
154
- }
155
- // Whether the period columns cross a year boundary, which decides if the
156
- // formatter appends the year to each heading.
157
- _spansMultipleYears(columns) {
158
- const years = new Set(columns
159
- .map((column) => /^(\d{4})-\d{2}-\d{2}/.exec(column))
160
- .filter(Boolean)
161
- .map((match) => match[1]));
162
- return years.size > 1;
139
+ const headings = pivotHeadings(config, data);
140
+ return (data.columns ?? []).map((column, index) => ({ column, label: headings[index] }));
163
141
  }
164
142
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ComponentListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
165
143
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ComponentListComponent, isStandalone: true, selector: "app-report-component-list", inputs: { reportId: "reportId", component: "component" }, viewQueries: [{ propertyName: "listComponent", first: true, predicate: FsListComponent, descendants: true }], ngImport: i0, template: "@if (truncated()) {\n <div class=\"pivot-truncated\">\n This grid was built from a partial result, so some columns or values may be missing. Narrow it with a filter.\n </div>\n}\n\n<fs-list [config]=\"listConfig\">\n @for (column of columns(); track column.column) {\n <fs-list-column\n [name]=\"column.column\"\n [title]=\"column.label || column.column\"\n [sortable]=\"!pivoted() || $first\">\n <ng-template\n fs-list-cell\n let-row=\"row\">\n @if (column.format === 'date') {\n {{ row[column.column] | fsReportDate: timezone() }}\n } @else {\n {{ row[column.column] }}\n }\n </ng-template>\n </fs-list-column>\n }\n</fs-list>\n", styles: [":host{display:block;width:100%;height:100%;min-height:0}:host ::ng-deep fs-list{display:flex;flex-direction:column;height:100%;min-height:0}:host ::ng-deep fs-list .fs-list-container{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;height:100%}:host ::ng-deep fs-list .fs-list-header-container{flex:0 0 auto}:host ::ng-deep fs-list .fs-list-container .fs-list-table-container{flex:1 1 auto;min-height:0;overflow-y:auto!important}:host ::ng-deep fs-list .fs-list-table thead th{position:sticky;top:0;z-index:1;background-color:#fff}:host ::ng-deep fs-list fs-list-pagination{flex:0 0 auto}:host ::ng-deep fs-list .fs-list-load-more{position:sticky;bottom:0;background-color:#fff}:host ::ng-deep fs-list .fs-list-load-more button{margin-top:0}.pivot-truncated{flex:0 0 auto;padding:8px 12px;margin-bottom:8px;border-radius:4px;background-color:#fff4e5;color:#663c00}\n"], dependencies: [{ kind: "ngmodule", type: FsListModule }, { kind: "component", type: i1.FsListComponent, selector: "fs-list", inputs: ["config", "loaderLines", "cellRowType"], outputs: ["filtersReady"] }, { kind: "directive", type: i1.FsListColumnDirective, selector: "fs-list-column", inputs: ["show", "title", "name", "customizable", "sortable", "sortableDefault", "sortableDirection", "direction", "align", "width", "class"] }, { kind: "directive", type: i1.FsListCellDirective, selector: "[fs-list-cell],[fsListCell]", inputs: ["colspan", "align", "class", "fsListCell", "configTyping"] }, { kind: "pipe", type: ReportDatePipe, name: "fsReportDate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
@@ -178,4 +156,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
178
156
  type: ViewChild,
179
157
  args: [FsListComponent]
180
158
  }] } });
181
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWxpc3QvY29tcG9uZW50LWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWxpc3QvY29tcG9uZW50LWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFVLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWhFLE9BQU8sRUFBRSxlQUFlLEVBQWdCLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRW5HLE9BQU8sRUFBYyxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdkMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBUXBELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM5RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQzs7O0FBR3RGLDhFQUE4RTtBQUM5RSxzRUFBc0U7QUFDdEUsOEVBQThFO0FBQzlFLDRFQUE0RTtBQUM1RSx1RUFBdUU7QUFDdkUsK0RBQStEO0FBWS9ELE1BQU0sT0FBTyxzQkFBc0I7SUFFakIsUUFBUSxDQUFTO0lBQ2pCLFNBQVMsQ0FBa0I7SUFHcEMsYUFBYSxDQUFrQjtJQUUvQixVQUFVLENBQWU7SUFFaEMsMkVBQTJFO0lBQzNF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bEMsU0FBUzsrQkFDRSwyQkFBMkIsbUJBR3BCLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osY0FBYztxQkFDZjs4QkFJZSxRQUFRO3NCQUF2QixLQUFLO2dCQUNVLFNBQVM7c0JBQXhCLEtBQUs7Z0JBR0MsYUFBYTtzQkFEbkIsU0FBUzt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRGVzdHJveVJlZiwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkLCBpbmplY3QsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuXG5pbXBvcnQgeyBGc0xpc3RDb21wb25lbnQsIEZzTGlzdENvbmZpZywgRnNMaXN0TW9kdWxlLCBQYWdpbmF0aW9uU3RyYXRlZ3kgfSBmcm9tICdAZmlyZXN0aXRjaC9saXN0JztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgbWFwIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi8uLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7XG4gIENvbXBvbmVudERhdGEsXG4gIENvbXBvbmVudERhdGFTdGF0ZSxcbiAgTGlzdENvbmZpZyxcbiAgUmVwb3J0Q29tcG9uZW50LFxuICBSZXBvcnRTb3J0LFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZm9ybWF0UGVyaW9kTGFiZWwgfSBmcm9tICcuLi8uLi9vcHRpb24tYnVpbGRlcic7XG5pbXBvcnQgeyBSZXBvcnREYXRlUGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzL3JlcG9ydC1kYXRlLnBpcGUnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlJztcblxuXG4vLyBBIGxpc3QgY29tcG9uZW50OiBhbiBGc0xpc3QgcmVuZGVyZWQgZnJvbSB0aGUgY29tcG9uZW50J3MgY29uZmlnLiBJdCBoYXMgbm9cbi8vIGZpbHRlciBiYXIgb2YgaXRzIG93bjogaXRzIGZpbHRlcnMgYXJlIGdyb3VwLWtleWVkIGxpa2UgZXZlcnkgb3RoZXJcbi8vIGNvbXBvbmVudCdzLCBzbyBjb21wb25lbnQtbGV2ZWwgZ3JvdXBzIHJlbmRlciBpbiB0aGUgY29tcG9uZW50IGhlYWRlciBzdHJpcFxuLy8gKFJlcG9ydENvbXBvbmVudENvbXBvbmVudCkgYW5kIHJlcG9ydC1sZXZlbCBncm91cHMgaW4gdGhlIHJlcG9ydCBiYXIsIGFuZFxuLy8gZXZlcnkgcmVxdWVzdCB0YWtlcyBpdHMgdmFsdWVzIGZyb20gdGhlIHNoYXJlZCBmaWx0ZXItc3RhdGUgc2VydmljZS5cbi8vIFBhZ2luZyBhbmQgc29ydGluZyBhcmUgcHVzaGVkIGludG8gdGhlIFNRTCB3cmFwIHNlcnZlci1zaWRlLlxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXJlcG9ydC1jb21wb25lbnQtbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21wb25lbnQtbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvbXBvbmVudC1saXN0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgRnNMaXN0TW9kdWxlLFxuICAgIFJlcG9ydERhdGVQaXBlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBDb21wb25lbnRMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASW5wdXQoKSBwdWJsaWMgcmVwb3J0SWQ6IG51bWJlcjtcbiAgQElucHV0KCkgcHVibGljIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50O1xuXG4gIEBWaWV3Q2hpbGQoRnNMaXN0Q29tcG9uZW50KVxuICBwdWJsaWMgbGlzdENvbXBvbmVudDogRnNMaXN0Q29tcG9uZW50O1xuXG4gIHB1YmxpYyBsaXN0Q29uZmlnOiBGc0xpc3RDb25maWc7XG5cbiAgLy8gQSBwbGFpbiBsaXN0J3MgY29sdW1ucyBhcmUgYXV0aG9yZWQgYW5kIGZpeGVkIGF0IGluaXQuIEEgY3Jvc3MtdGFiJ3MgYXJlXG4gIC8vIHRoZSBwaXZvdCBkaW1lbnNpb24ncyBWQUxVRVMsIHNvIHRoZXkgYXJyaXZlIHdpdGggdGhlIHJvd3MgYW5kIGNoYW5nZVxuICAvLyB3aGVuZXZlciB0aGUgZmlsdGVycyBkbyDigJQgd2hpY2ggaXMgd2h5IHRoaXMgaXMgYSBzaWduYWwgcmF0aGVyIHRoYW4gdGhlXG4gIC8vIG9uZS1zaG90IHJlYWQgaXQgdXNlZCB0byBiZS5cbiAgcHVibGljIGNvbHVtbnMgPSBzaWduYWw8eyBjb2x1bW46IHN0cmluZzsgbGFiZWw/OiBzdHJpbmc7IGZvcm1hdD86IHN0cmluZyB9W10+KFtdKTtcblxuICAvLyBBIGNyb3NzLXRhYiBzb3J0cyBvbmx5IGJ5IGl0cyByb3cta2V5IGNvbHVtbjogZXZlcnkgb3RoZXIgaGVhZGVyIGlzIGFcbiAgLy8gcGl2b3QgdmFsdWUsIGFuZCB0aGUgc2VydmVyIG9yZGVycyB0aGUgbG9uZyByb3dzIGJlZm9yZSBwaXZvdGluZywgc28gYVxuICAvLyBjbGljayBvbiBcIk1hciAyMDI2XCIgaGFzIG5vdGhpbmcgdG8gb3JkZXIgYnkuXG4gIHB1YmxpYyBwaXZvdGVkID0gc2lnbmFsKGZhbHNlKTtcblxuICAvLyBBIGN1dCByZXN1bHQgaXMgd29yc2UgZm9yIGEgZ3JpZCB0aGFuIGZvciBhIGxpc3Q6IHRoZSBjdXQgbGFuZHMgb24gdGhlIExPTkdcbiAgLy8gcm93cyBiZWZvcmUgdGhlIHJlc2hhcGUsIHNvIGEgcGl2b3QgdmFsdWUgbGl2aW5nIG9ubHkgaW4gdGhlIHRhaWwgdmFuaXNoZXNcbiAgLy8gYXMgYSB3aG9sZSBDT0xVTU4gYW5kIHN0cmFkZGxlZCBjZWxscyBjb21lIGJhY2sgYmxhbmssIGluZGlzdGluZ3Vpc2hhYmxlXG4gIC8vIGZyb20gYSByZWFsIHplcm8uIFRoZSBwYXJlbnQncyB0cnVuY2F0aW9uIGJhbm5lciBuZXZlciBmaXJlcyBmb3IgYSBsaXN0XG4gIC8vIChpdCBvbmx5IHJlbmRlcnMgd2hhdCBfbG9hZCgpIGZldGNoZWQsIHdoaWNoIGxpc3RzIHNraXApLCBzbyB0aGUgd2FybmluZ1xuICAvLyBiZWxvbmdzIGhlcmUuXG4gIHB1YmxpYyB0cnVuY2F0ZWQgPSBzaWduYWwoZmFsc2UpO1xuXG4gIC8vIFRoZSByZXBvcnQncyBlZmZlY3RpdmUgem9uZSwgd2hpY2ggZGF0ZSBjZWxscyByZW5kZXIgaW4uIEluamVjdGVkIHJpZ2h0XG4gIC8vIGhlcmUgcmF0aGVyIHRoYW4gcmVhZCBvZmYgX2ZpbHRlclN0YXRlLCB3aGljaCBpcyBkZWNsYXJlZCBmdXJ0aGVyIGRvd24gYW5kXG4gIC8vIGlzIHN0aWxsIHVuZGVmaW5lZCB3aGlsZSB0aGlzIGluaXRpYWxpemVyIHJ1bnMuXG4gIHB1YmxpYyByZWFkb25seSB0aW1lem9uZSA9IGluamVjdChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UpLnRpbWV6b25lO1xuXG4gIHByaXZhdGUgX3JlcG9ydERhdGEgPSBpbmplY3QoUmVwb3J0RGF0YSk7XG4gIHByaXZhdGUgX2ZpbHRlclN0YXRlID0gaW5qZWN0KFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSk7XG4gIHByaXZhdGUgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbmZpZyA9ICh0aGlzLmNvbXBvbmVudC5jb25maWcgPz8ge30pIGFzIExpc3RDb25maWc7XG4gICAgdGhpcy5waXZvdGVkLnNldCghIWNvbmZpZy5waXZvdEJ5Py5jb2x1bW4pO1xuICAgIHRoaXMuY29sdW1ucy5zZXQoY29uZmlnLmNvbHVtbnMgPz8gW10pO1xuXG4gICAgdGhpcy5faW5pdExpc3RDb25maWcoY29uZmlnKTtcblxuICAgIC8vIEEgY2hhbmdlIHRvIGFueSBncm91cCB0aGlzIGxpc3QncyBmaWx0ZXJzIGJlbG9uZyB0byAoZnJvbSB0aGUgcmVwb3J0IGJhclxuICAgIC8vIG9yIHRoZSBjb21wb25lbnQgaGVhZGVyIHN0cmlwKSByZS1ydW5zIHRoZSBsaXN0LlxuICAgIHRoaXMuX2ZpbHRlclN0YXRlLmNoYW5nZXNGb3IodGhpcy5jb21wb25lbnQpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMubGlzdENvbXBvbmVudD8ucmVsb2FkKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdExpc3RDb25maWcoY29uZmlnOiBMaXN0Q29uZmlnKTogdm9pZCB7XG4gICAgLy8gVGhlIHZpZXdlcidzIGxhc3Qgc29ydCB3aW5zIG92ZXIgdGhlIGF1dGhvcmVkIG9uZSwgc28gYSBsaXN0IHJlY3JlYXRlZFxuICAgIC8vIGluIHRoZSBzYW1lIHNlc3Npb24gKHBhZ2Ugc3dpdGNoLCByZWxvYWQgYWZ0ZXIgYW4gZWRpdCkga2VlcHMgaXQuXG4gICAgY29uc3Qgc29ydDogUmVwb3J0U29ydCB8IHVuZGVmaW5lZCA9IHRoaXMuX2ZpbHRlclN0YXRlLmxpc3RTb3J0KHRoaXMuY29tcG9uZW50LmlkKSA/PyBjb25maWcuc29ydDtcblxuICAgIHRoaXMubGlzdENvbmZpZyA9IHtcbiAgICAgIC8vIEluc2lkZSBhIHJlcG9ydCBjb21wb25lbnQgdGhlIGxpc3QgaXMgYSBjbGVhbiBkYXRhIHBhbmUg4oCUIG5vIHN0YXR1c1xuICAgICAgLy8gYmFyLCBubyByZWxvYWQgYnV0dG9uIChmaWx0ZXIgY2hhbmdlcyBhbHJlYWR5IHJlZmV0Y2gpLlxuICAgICAgc3RhdHVzOiBmYWxzZSxcbiAgICAgIHJlbG9hZDogZmFsc2UsXG4gICAgICAvLyBGc0xpc3QgbmV2ZXIgdG91Y2hlcyB0aGUgVVJMIG9yIHBlcnNpc3RzIHNvcnQvcGFnaW5nIHN0YXRlLiBUaGUgc29ydFxuICAgICAgLy8gcmVhY2hlcyB0aGUgVVJMIHRocm91Z2ggUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIChzZXRMaXN0U29ydCksIGFuZFxuICAgICAgLy8gcGFnaW5nIHN0YXlzIG91dCBvZiBpdC5cbiAgICAgIHF1ZXJ5UGFyYW06IGZhbHNlLFxuICAgICAgcGVyc2lzdDogZmFsc2UsXG4gICAgICBzb3J0OiBzb3J0XG4gICAgICAgID8geyB2YWx1ZTogc29ydC5jb2x1bW4sIGRpcmVjdGlvbjogc29ydC5kaXJlY3Rpb24gPz8gJ2FzYycgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIC8vIExvYWQtbW9yZTogdGhlIGxpc3Qga2VlcHMgYSBmaXhlZCwgc2Nyb2xsYWJsZSBoZWlnaHQgYW5kIGFwcGVuZHMgdGhlXG4gICAgICAvLyBuZXh0IHBhZ2UgaW4gcGxhY2UgaW5zdGVhZCBvZiBzd2FwcGluZyBwYWdlcy4gVGhlIGJ1dHRvbiBpcyBwaW5uZWQgdG9cbiAgICAgIC8vIHRoZSBib3R0b20gb2YgdGhlIHNjcm9sbCBwYW5lIChzZWUgY29tcG9uZW50IFNDU1MpLlxuICAgICAgLy9cbiAgICAgIC8vIFVzZXMgdGhlIE9mZnNldCBzdHJhdGVneSAob2Zmc2V0ICsgbGltaXQpIHJhdGhlciB0aGFuIE1hbnk6IGluXG4gICAgICAvLyBAZmlyZXN0aXRjaC9saXN0IHRoZSBwYWdpbmF0aW9uIHRlbXBsYXRlIHJlc29sdmVzIGBoYXNNYW55U3RyYXRlZ3lgXG4gICAgICAvLyBCRUZPUkUgYGxvYWRNb3JlRW5hYmxlZGAsIGFuZCBNYW55IHJlbmRlcnMgYSBmb3J3YXJkLW9ubHkgcGFnZSBwYWdlciDigJRcbiAgICAgIC8vIHNvIE1hbnkgd291bGQgc3VwcHJlc3MgdGhlIGxvYWQtbW9yZSBidXR0b24gZW50aXJlbHkuIE9mZnNldCArIGxvYWRNb3JlXG4gICAgICAvLyBpcyB0aGUgY29tYmluYXRpb24gdGhhdCBhY3R1YWxseSByZW5kZXJzIGFuZCBhcHBlbmRzLiBgX2ZldGNoYCBhbHJlYWR5XG4gICAgICAvLyBkZXJpdmVzIGBwYWdlYCBmcm9tIGBvZmZzZXRgLCBzbyB0aGUgc2VydmVyLXNpZGUgd3JhcCBpcyB1bmFmZmVjdGVkLlxuICAgICAgcGFnaW5nOiB7XG4gICAgICAgIGxpbWl0OiBjb25maWcucGFnZVNpemUgPz8gMjUsXG4gICAgICAgIHN0cmF0ZWd5OiBQYWdpbmF0aW9uU3RyYXRlZ3kuT2Zmc2V0LFxuICAgICAgfSxcbiAgICAgIGxvYWRNb3JlOiB7XG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGxhYmVsOiAnTG9hZCBtb3JlJyxcbiAgICAgICAgYnV0dG9uVHlwZTogJ3N0cm9rZWQnLFxuICAgICAgfSxcbiAgICAgIGZldGNoOiAocXVlcnk6IGFueSkgPT4gdGhpcy5fZmV0Y2gocXVlcnkpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9mZXRjaChxdWVyeTogYW55KTogT2JzZXJ2YWJsZTx7IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107IHBhZ2luZzogYW55IH0+IHtcbiAgICAvLyBNYW55L2xvYWQtbW9yZSBzZW5kcyBgb2Zmc2V0YCArIGBsaW1pdGAgKG5vdCBgcGFnZWApOyBkZXJpdmUgdGhlIHBhZ2Ugc29cbiAgICAvLyB0aGUgc2VydmVyLXNpZGUgd3JhcCBrZWVwcyB3b3JraW5nIHVuY2hhbmdlZC4gUGFnZSBzdHJhdGVneSBzdGlsbCBzZW5kc1xuICAgIC8vIGBwYWdlYCBkaXJlY3RseS5cbiAgICBjb25zdCBwYWdlU2l6ZSA9IHF1ZXJ5LmxpbWl0ID8/IDI1O1xuICAgIGNvbnN0IHBhZ2UgPSBxdWVyeS5wYWdlXG4gICAgICA/PyAocXVlcnkub2Zmc2V0ICE9IG51bGwgPyBNYXRoLmZsb29yKHF1ZXJ5Lm9mZnNldCAvIHBhZ2VTaXplKSArIDEgOiAxKTtcblxuICAgIGNvbnN0IHN0YXRlOiBDb21wb25lbnREYXRhU3RhdGUgPSB7XG4gICAgICBwYWdlLFxuICAgICAgcGFnZVNpemUsXG4gICAgfTtcblxuICAgIGNvbnN0IG9yZGVyID0gU3RyaW5nKHF1ZXJ5Lm9yZGVyID8/ICcnKTtcbiAgICBpZiAob3JkZXIpIHtcbiAgICAgIGNvbnN0IFtjb2x1bW4sIGRpcmVjdGlvbl0gPSBvcmRlci5zcGxpdCgnLCcpO1xuICAgICAgc3RhdGUuc29ydCA9IHsgY29sdW1uLCBkaXJlY3Rpb246IGRpcmVjdGlvbiA9PT0gJ2Rlc2MnID8gJ2Rlc2MnIDogJ2FzYycgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRMaXN0U29ydCh0aGlzLmNvbXBvbmVudC5pZCwgc3RhdGUuc29ydCA/PyBudWxsKTtcblxuICAgIC8vIE9uZSBzb3VyY2UgZm9yIGZpbHRlciB2YWx1ZXMsIHRoZSBzYW1lIG9uZSBjaGFydHMsIEtQSXMgYW5kIHRoZSBleHBvcnRzXG4gICAgLy8gcmVhZCwgc28gdGhlIGxpc3QgaXMgZmlsdGVyZWQgZXhhY3RseSBhcyBpdHMgaGVhZGVyIHN0cmlwIHNob3dzLlxuICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLl9maWx0ZXJTdGF0ZS5yZXNvbHZlRm9yQ29tcG9uZW50KHRoaXMuY29tcG9uZW50KTtcblxuICAgIHJldHVybiB0aGlzLl9yZXBvcnREYXRhXG4gICAgICAuY29tcG9uZW50RGF0YSh0aGlzLnJlcG9ydElkLCB0aGlzLmNvbXBvbmVudC5pZCwgZmlsdGVycywgc3RhdGUpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChkYXRhOiBDb21wb25lbnREYXRhKSA9PiB7XG4gICAgICAgICAgLy8gQSBjcm9zcy10YWIncyBoZWFkZXJzIGNvbWUgYmFjayB3aXRoIHRoZSByb3dzOiB0aGUgcm93LWtleSBjb2x1bW5cbiAgICAgICAgICAvLyBmaXJzdCwgdGhlbiBvbmUgcGVyIHBpdm90IHZhbHVlLiBSZS1yZWFkIHRoZW0gb24gZXZlcnkgZmV0Y2gsIHNpbmNlXG4gICAgICAgICAgLy8gYSBmaWx0ZXIgY2hhbmdlIGNhbiBhZGQgb3IgcmVtb3ZlIGEgY29sdW1uLlxuICAgICAgICAgIGlmICh0aGlzLnBpdm90ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5zLnNldCh0aGlzLl9waXZvdENvbHVtbnMoZGF0YSkpO1xuICAgICAgICAgICAgdGhpcy50cnVuY2F0ZWQuc2V0KCEhZGF0YS50cnVuY2F0ZWQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhOiBkYXRhLnJvd3MgPz8gW10sXG4gICAgICAgICAgICBwYWdpbmc6IHtcbiAgICAgICAgICAgICAgbGltaXQ6IGRhdGEucGFnaW5nPy5wYWdlU2l6ZSA/PyBzdGF0ZS5wYWdlU2l6ZSxcbiAgICAgICAgICAgICAgcmVjb3JkczogZGF0YS5wYWdpbmc/LnRvdGFsID8/IChkYXRhLnJvd3M/Lmxlbmd0aCA/PyAwKSxcbiAgICAgICAgICAgICAgcGFnZTogZGF0YS5wYWdpbmc/LnBhZ2UgPz8gc3RhdGUucGFnZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gQSBjcm9zcy10YWIncyBjb2x1bW5zLCBidWlsdCBmcm9tIHRoZSB3aXJlLiBUaGUgZmlyc3QgaXMgdGhlIHJvdyBrZXkgYW5kXG4gIC8vIGtlZXBzIGl0cyBhdXRob3JlZCBsYWJlbDsgdGhlIHJlc3QgYXJlIHBpdm90IFZBTFVFUyB1c2VkIGFzIGhlYWRpbmdzLiBXaGVuXG4gIC8vIHRoZSBwaXZvdCBheGlzIGlzIGEgdGltZSBkaW1lbnNpb24gdGhlIHNlcnZlciBzZW5kcyB0aGUgZ3JhaW4gaXQgYnVja2V0ZWRcbiAgLy8gYXQsIHNvIGEgcGVyaW9kLXN0YXJ0IGxpa2UgXCIyMDI2LTAxLTAxXCIgaXMgc2hvd24gYXMgXCJKYW4gMjAyNlwiIOKAlCB0aGUgc2FtZVxuICAvLyBmb3JtYXR0ZXIgdGhlIGNoYXJ0J3MgeC1heGlzIHVzZXMsIHNvIGEgZ3JpZCBhbmQgYSBjaGFydCBvZiB0aGUgc2FtZSBxdWVyeVxuICAvLyBsYWJlbCB0aGVpciBwZXJpb2RzIGlkZW50aWNhbGx5LlxuICBwcml2YXRlIF9waXZvdENvbHVtbnMoZGF0YTogQ29tcG9uZW50RGF0YSk6IHsgY29sdW1uOiBzdHJpbmc7IGxhYmVsPzogc3RyaW5nOyBmb3JtYXQ/OiBzdHJpbmcgfVtdIHtcbiAgICBjb25zdCBjb25maWcgPSAodGhpcy5jb21wb25lbnQuY29uZmlnID8/IHt9KSBhcyBMaXN0Q29uZmlnO1xuICAgIGNvbnN0IGdyYW51bGFyaXR5ID0gZGF0YS5ncmFudWxhcml0eTtcbiAgICBjb25zdCBtdWx0aVllYXIgPSB0aGlzLl9zcGFuc011bHRpcGxlWWVhcnMoZGF0YS5jb2x1bW5zID8/IFtdKTtcblxuICAgIHJldHVybiAoZGF0YS5jb2x1bW5zID8/IFtdKS5tYXAoKGNvbHVtbiwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChpbmRleCA9PT0gMCkge1xuICAgICAgICByZXR1cm4geyBjb2x1bW4sIGxhYmVsOiBjb25maWcucm93Qnk/LmxhYmVsIHx8IGNvbHVtbiB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2x1bW4sXG4gICAgICAgIGxhYmVsOiBncmFudWxhcml0eSA/IGZvcm1hdFBlcmlvZExhYmVsKGNvbHVtbiwgZ3JhbnVsYXJpdHksIG11bHRpWWVhcikgOiBjb2x1bW4sXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLy8gV2hldGhlciB0aGUgcGVyaW9kIGNvbHVtbnMgY3Jvc3MgYSB5ZWFyIGJvdW5kYXJ5LCB3aGljaCBkZWNpZGVzIGlmIHRoZVxuICAvLyBmb3JtYXR0ZXIgYXBwZW5kcyB0aGUgeWVhciB0byBlYWNoIGhlYWRpbmcuXG4gIHByaXZhdGUgX3NwYW5zTXVsdGlwbGVZZWFycyhjb2x1bW5zOiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHllYXJzID0gbmV3IFNldChcbiAgICAgIGNvbHVtbnNcbiAgICAgICAgLm1hcCgoY29sdW1uKSA9PiAvXihcXGR7NH0pLVxcZHsyfS1cXGR7Mn0vLmV4ZWMoY29sdW1uKSlcbiAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAubWFwKChtYXRjaCkgPT4gbWF0Y2hbMV0pLFxuICAgICk7XG5cbiAgICByZXR1cm4geWVhcnMuc2l6ZSA+IDE7XG4gIH1cbn1cbiIsIkBpZiAodHJ1bmNhdGVkKCkpIHtcbiAgPGRpdiBjbGFzcz1cInBpdm90LXRydW5jYXRlZFwiPlxuICAgIFRoaXMgZ3JpZCB3YXMgYnVpbHQgZnJvbSBhIHBhcnRpYWwgcmVzdWx0LCBzbyBzb21lIGNvbHVtbnMgb3IgdmFsdWVzIG1heSBiZSBtaXNzaW5nLiBOYXJyb3cgaXQgd2l0aCBhIGZpbHRlci5cbiAgPC9kaXY+XG59XG5cbjxmcy1saXN0IFtjb25maWddPVwibGlzdENvbmZpZ1wiPlxuICBAZm9yIChjb2x1bW4gb2YgY29sdW1ucygpOyB0cmFjayBjb2x1bW4uY29sdW1uKSB7XG4gICAgPGZzLWxpc3QtY29sdW1uXG4gICAgICBbbmFtZV09XCJjb2x1bW4uY29sdW1uXCJcbiAgICAgIFt0aXRsZV09XCJjb2x1bW4ubGFiZWwgfHwgY29sdW1uLmNvbHVtblwiXG4gICAgICBbc29ydGFibGVdPVwiIXBpdm90ZWQoKSB8fCAkZmlyc3RcIj5cbiAgICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgICBmcy1saXN0LWNlbGxcbiAgICAgICAgbGV0LXJvdz1cInJvd1wiPlxuICAgICAgICBAaWYgKGNvbHVtbi5mb3JtYXQgPT09ICdkYXRlJykge1xuICAgICAgICAgIHt7IHJvd1tjb2x1bW4uY29sdW1uXSB8IGZzUmVwb3J0RGF0ZTogdGltZXpvbmUoKSB9fVxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICB7eyByb3dbY29sdW1uLmNvbHVtbl0gfX1cbiAgICAgICAgfVxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2ZzLWxpc3QtY29sdW1uPlxuICB9XG48L2ZzLWxpc3Q+XG4iXX0=
159
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWxpc3QvY29tcG9uZW50LWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWxpc3QvY29tcG9uZW50LWxpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFVLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRWhFLE9BQU8sRUFBRSxlQUFlLEVBQWdCLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRW5HLE9BQU8sRUFBYyxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdkMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBUXBELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDOUQsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sNENBQTRDLENBQUM7OztBQUd0Riw4RUFBOEU7QUFDOUUsc0VBQXNFO0FBQ3RFLDhFQUE4RTtBQUM5RSw0RUFBNEU7QUFDNUUsdUVBQXVFO0FBQ3ZFLCtEQUErRDtBQVkvRCxNQUFNLE9BQU8sc0JBQXNCO0lBRWpCLFFBQVEsQ0FBUztJQUNqQixTQUFTLENBQWtCO0lBR3BDLGFBQWEsQ0FBa0I7SUFFL0IsVUFBVSxDQUFlO0lBRWhDLDJFQUEyRTtJQUMzRSx3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SUFBSSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDM0YsQ0FBQzt3R0FySlUsc0JBQXNCOzRGQUF0QixzQkFBc0IsOExBS3RCLGVBQWUsZ0RDMUM1QixtdEJBd0JBLHc2QkRTSSxZQUFZLGtqQkFDWixjQUFjOzs0RkFHTCxzQkFBc0I7a0JBWGxDLFNBQVM7K0JBQ0UsMkJBQTJCLG1CQUdwQix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLGNBQWM7cUJBQ2Y7OEJBSWUsUUFBUTtzQkFBdkIsS0FBSztnQkFDVSxTQUFTO3NCQUF4QixLQUFLO2dCQUdDLGFBQWE7c0JBRG5CLFNBQVM7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIERlc3Ryb3lSZWYsIElucHV0LCBPbkluaXQsIFZpZXdDaGlsZCwgaW5qZWN0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcblxuaW1wb3J0IHsgRnNMaXN0Q29tcG9uZW50LCBGc0xpc3RDb25maWcsIEZzTGlzdE1vZHVsZSwgUGFnaW5hdGlvblN0cmF0ZWd5IH0gZnJvbSAnQGZpcmVzdGl0Y2gvbGlzdCc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIG1hcCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBSZXBvcnREYXRhIH0gZnJvbSAnLi4vLi4vZGF0YS9yZXBvcnQuZGF0YSc7XG5pbXBvcnQge1xuICBDb21wb25lbnREYXRhLFxuICBDb21wb25lbnREYXRhU3RhdGUsXG4gIExpc3RDb25maWcsXG4gIFJlcG9ydENvbXBvbmVudCxcbiAgUmVwb3J0U29ydCxcbn0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IHBpdm90SGVhZGluZ3MgfSBmcm9tICcuLi8uLi9vcHRpb24tYnVpbGRlcic7XG5pbXBvcnQgeyBSZXBvcnREYXRlUGlwZSB9IGZyb20gJy4uLy4uL3BpcGVzL3JlcG9ydC1kYXRlLnBpcGUnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVwb3J0LWZpbHRlci1zdGF0ZS5zZXJ2aWNlJztcblxuXG4vLyBBIGxpc3QgY29tcG9uZW50OiBhbiBGc0xpc3QgcmVuZGVyZWQgZnJvbSB0aGUgY29tcG9uZW50J3MgY29uZmlnLiBJdCBoYXMgbm9cbi8vIGZpbHRlciBiYXIgb2YgaXRzIG93bjogaXRzIGZpbHRlcnMgYXJlIGdyb3VwLWtleWVkIGxpa2UgZXZlcnkgb3RoZXJcbi8vIGNvbXBvbmVudCdzLCBzbyBjb21wb25lbnQtbGV2ZWwgZ3JvdXBzIHJlbmRlciBpbiB0aGUgY29tcG9uZW50IGhlYWRlciBzdHJpcFxuLy8gKFJlcG9ydENvbXBvbmVudENvbXBvbmVudCkgYW5kIHJlcG9ydC1sZXZlbCBncm91cHMgaW4gdGhlIHJlcG9ydCBiYXIsIGFuZFxuLy8gZXZlcnkgcmVxdWVzdCB0YWtlcyBpdHMgdmFsdWVzIGZyb20gdGhlIHNoYXJlZCBmaWx0ZXItc3RhdGUgc2VydmljZS5cbi8vIFBhZ2luZyBhbmQgc29ydGluZyBhcmUgcHVzaGVkIGludG8gdGhlIFNRTCB3cmFwIHNlcnZlci1zaWRlLlxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXJlcG9ydC1jb21wb25lbnQtbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21wb25lbnQtbGlzdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NvbXBvbmVudC1saXN0LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgRnNMaXN0TW9kdWxlLFxuICAgIFJlcG9ydERhdGVQaXBlLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBDb21wb25lbnRMaXN0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBASW5wdXQoKSBwdWJsaWMgcmVwb3J0SWQ6IG51bWJlcjtcbiAgQElucHV0KCkgcHVibGljIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50O1xuXG4gIEBWaWV3Q2hpbGQoRnNMaXN0Q29tcG9uZW50KVxuICBwdWJsaWMgbGlzdENvbXBvbmVudDogRnNMaXN0Q29tcG9uZW50O1xuXG4gIHB1YmxpYyBsaXN0Q29uZmlnOiBGc0xpc3RDb25maWc7XG5cbiAgLy8gQSBwbGFpbiBsaXN0J3MgY29sdW1ucyBhcmUgYXV0aG9yZWQgYW5kIGZpeGVkIGF0IGluaXQuIEEgY3Jvc3MtdGFiJ3MgYXJlXG4gIC8vIHRoZSBwaXZvdCBkaW1lbnNpb24ncyBWQUxVRVMsIHNvIHRoZXkgYXJyaXZlIHdpdGggdGhlIHJvd3MgYW5kIGNoYW5nZVxuICAvLyB3aGVuZXZlciB0aGUgZmlsdGVycyBkbyDigJQgd2hpY2ggaXMgd2h5IHRoaXMgaXMgYSBzaWduYWwgcmF0aGVyIHRoYW4gdGhlXG4gIC8vIG9uZS1zaG90IHJlYWQgaXQgdXNlZCB0byBiZS5cbiAgcHVibGljIGNvbHVtbnMgPSBzaWduYWw8eyBjb2x1bW46IHN0cmluZzsgbGFiZWw/OiBzdHJpbmc7IGZvcm1hdD86IHN0cmluZyB9W10+KFtdKTtcblxuICAvLyBBIGNyb3NzLXRhYiBzb3J0cyBvbmx5IGJ5IGl0cyByb3cta2V5IGNvbHVtbjogZXZlcnkgb3RoZXIgaGVhZGVyIGlzIGFcbiAgLy8gcGl2b3QgdmFsdWUsIGFuZCB0aGUgc2VydmVyIG9yZGVycyB0aGUgbG9uZyByb3dzIGJlZm9yZSBwaXZvdGluZywgc28gYVxuICAvLyBjbGljayBvbiBcIk1hciAyMDI2XCIgaGFzIG5vdGhpbmcgdG8gb3JkZXIgYnkuXG4gIHB1YmxpYyBwaXZvdGVkID0gc2lnbmFsKGZhbHNlKTtcblxuICAvLyBBIGN1dCByZXN1bHQgaXMgd29yc2UgZm9yIGEgZ3JpZCB0aGFuIGZvciBhIGxpc3Q6IHRoZSBjdXQgbGFuZHMgb24gdGhlIExPTkdcbiAgLy8gcm93cyBiZWZvcmUgdGhlIHJlc2hhcGUsIHNvIGEgcGl2b3QgdmFsdWUgbGl2aW5nIG9ubHkgaW4gdGhlIHRhaWwgdmFuaXNoZXNcbiAgLy8gYXMgYSB3aG9sZSBDT0xVTU4gYW5kIHN0cmFkZGxlZCBjZWxscyBjb21lIGJhY2sgYmxhbmssIGluZGlzdGluZ3Vpc2hhYmxlXG4gIC8vIGZyb20gYSByZWFsIHplcm8uIFRoZSBwYXJlbnQncyB0cnVuY2F0aW9uIGJhbm5lciBuZXZlciBmaXJlcyBmb3IgYSBsaXN0XG4gIC8vIChpdCBvbmx5IHJlbmRlcnMgd2hhdCBfbG9hZCgpIGZldGNoZWQsIHdoaWNoIGxpc3RzIHNraXApLCBzbyB0aGUgd2FybmluZ1xuICAvLyBiZWxvbmdzIGhlcmUuXG4gIHB1YmxpYyB0cnVuY2F0ZWQgPSBzaWduYWwoZmFsc2UpO1xuXG4gIC8vIFRoZSByZXBvcnQncyBlZmZlY3RpdmUgem9uZSwgd2hpY2ggZGF0ZSBjZWxscyByZW5kZXIgaW4uIEluamVjdGVkIHJpZ2h0XG4gIC8vIGhlcmUgcmF0aGVyIHRoYW4gcmVhZCBvZmYgX2ZpbHRlclN0YXRlLCB3aGljaCBpcyBkZWNsYXJlZCBmdXJ0aGVyIGRvd24gYW5kXG4gIC8vIGlzIHN0aWxsIHVuZGVmaW5lZCB3aGlsZSB0aGlzIGluaXRpYWxpemVyIHJ1bnMuXG4gIHB1YmxpYyByZWFkb25seSB0aW1lem9uZSA9IGluamVjdChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UpLnRpbWV6b25lO1xuXG4gIHByaXZhdGUgX3JlcG9ydERhdGEgPSBpbmplY3QoUmVwb3J0RGF0YSk7XG4gIHByaXZhdGUgX2ZpbHRlclN0YXRlID0gaW5qZWN0KFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSk7XG4gIHByaXZhdGUgX2Rlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbmZpZyA9ICh0aGlzLmNvbXBvbmVudC5jb25maWcgPz8ge30pIGFzIExpc3RDb25maWc7XG4gICAgdGhpcy5waXZvdGVkLnNldCghIWNvbmZpZy5waXZvdEJ5Py5jb2x1bW4pO1xuICAgIHRoaXMuY29sdW1ucy5zZXQoY29uZmlnLmNvbHVtbnMgPz8gW10pO1xuXG4gICAgdGhpcy5faW5pdExpc3RDb25maWcoY29uZmlnKTtcblxuICAgIC8vIEEgY2hhbmdlIHRvIGFueSBncm91cCB0aGlzIGxpc3QncyBmaWx0ZXJzIGJlbG9uZyB0byAoZnJvbSB0aGUgcmVwb3J0IGJhclxuICAgIC8vIG9yIHRoZSBjb21wb25lbnQgaGVhZGVyIHN0cmlwKSByZS1ydW5zIHRoZSBsaXN0LlxuICAgIHRoaXMuX2ZpbHRlclN0YXRlLmNoYW5nZXNGb3IodGhpcy5jb21wb25lbnQpXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMubGlzdENvbXBvbmVudD8ucmVsb2FkKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5pdExpc3RDb25maWcoY29uZmlnOiBMaXN0Q29uZmlnKTogdm9pZCB7XG4gICAgLy8gVGhlIHZpZXdlcidzIGxhc3Qgc29ydCB3aW5zIG92ZXIgdGhlIGF1dGhvcmVkIG9uZSwgc28gYSBsaXN0IHJlY3JlYXRlZFxuICAgIC8vIGluIHRoZSBzYW1lIHNlc3Npb24gKHBhZ2Ugc3dpdGNoLCByZWxvYWQgYWZ0ZXIgYW4gZWRpdCkga2VlcHMgaXQuXG4gICAgY29uc3Qgc29ydDogUmVwb3J0U29ydCB8IHVuZGVmaW5lZCA9IHRoaXMuX2ZpbHRlclN0YXRlLmxpc3RTb3J0KHRoaXMuY29tcG9uZW50LmlkKSA/PyBjb25maWcuc29ydDtcblxuICAgIHRoaXMubGlzdENvbmZpZyA9IHtcbiAgICAgIC8vIEluc2lkZSBhIHJlcG9ydCBjb21wb25lbnQgdGhlIGxpc3QgaXMgYSBjbGVhbiBkYXRhIHBhbmUg4oCUIG5vIHN0YXR1c1xuICAgICAgLy8gYmFyLCBubyByZWxvYWQgYnV0dG9uIChmaWx0ZXIgY2hhbmdlcyBhbHJlYWR5IHJlZmV0Y2gpLlxuICAgICAgc3RhdHVzOiBmYWxzZSxcbiAgICAgIHJlbG9hZDogZmFsc2UsXG4gICAgICAvLyBGc0xpc3QgbmV2ZXIgdG91Y2hlcyB0aGUgVVJMIG9yIHBlcnNpc3RzIHNvcnQvcGFnaW5nIHN0YXRlLiBUaGUgc29ydFxuICAgICAgLy8gcmVhY2hlcyB0aGUgVVJMIHRocm91Z2ggUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIChzZXRMaXN0U29ydCksIGFuZFxuICAgICAgLy8gcGFnaW5nIHN0YXlzIG91dCBvZiBpdC5cbiAgICAgIHF1ZXJ5UGFyYW06IGZhbHNlLFxuICAgICAgcGVyc2lzdDogZmFsc2UsXG4gICAgICBzb3J0OiBzb3J0XG4gICAgICAgID8geyB2YWx1ZTogc29ydC5jb2x1bW4sIGRpcmVjdGlvbjogc29ydC5kaXJlY3Rpb24gPz8gJ2FzYycgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIC8vIExvYWQtbW9yZTogdGhlIGxpc3Qga2VlcHMgYSBmaXhlZCwgc2Nyb2xsYWJsZSBoZWlnaHQgYW5kIGFwcGVuZHMgdGhlXG4gICAgICAvLyBuZXh0IHBhZ2UgaW4gcGxhY2UgaW5zdGVhZCBvZiBzd2FwcGluZyBwYWdlcy4gVGhlIGJ1dHRvbiBpcyBwaW5uZWQgdG9cbiAgICAgIC8vIHRoZSBib3R0b20gb2YgdGhlIHNjcm9sbCBwYW5lIChzZWUgY29tcG9uZW50IFNDU1MpLlxuICAgICAgLy9cbiAgICAgIC8vIFVzZXMgdGhlIE9mZnNldCBzdHJhdGVneSAob2Zmc2V0ICsgbGltaXQpIHJhdGhlciB0aGFuIE1hbnk6IGluXG4gICAgICAvLyBAZmlyZXN0aXRjaC9saXN0IHRoZSBwYWdpbmF0aW9uIHRlbXBsYXRlIHJlc29sdmVzIGBoYXNNYW55U3RyYXRlZ3lgXG4gICAgICAvLyBCRUZPUkUgYGxvYWRNb3JlRW5hYmxlZGAsIGFuZCBNYW55IHJlbmRlcnMgYSBmb3J3YXJkLW9ubHkgcGFnZSBwYWdlciDigJRcbiAgICAgIC8vIHNvIE1hbnkgd291bGQgc3VwcHJlc3MgdGhlIGxvYWQtbW9yZSBidXR0b24gZW50aXJlbHkuIE9mZnNldCArIGxvYWRNb3JlXG4gICAgICAvLyBpcyB0aGUgY29tYmluYXRpb24gdGhhdCBhY3R1YWxseSByZW5kZXJzIGFuZCBhcHBlbmRzLiBgX2ZldGNoYCBhbHJlYWR5XG4gICAgICAvLyBkZXJpdmVzIGBwYWdlYCBmcm9tIGBvZmZzZXRgLCBzbyB0aGUgc2VydmVyLXNpZGUgd3JhcCBpcyB1bmFmZmVjdGVkLlxuICAgICAgcGFnaW5nOiB7XG4gICAgICAgIGxpbWl0OiBjb25maWcucGFnZVNpemUgPz8gMjUsXG4gICAgICAgIHN0cmF0ZWd5OiBQYWdpbmF0aW9uU3RyYXRlZ3kuT2Zmc2V0LFxuICAgICAgfSxcbiAgICAgIGxvYWRNb3JlOiB7XG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGxhYmVsOiAnTG9hZCBtb3JlJyxcbiAgICAgICAgYnV0dG9uVHlwZTogJ3N0cm9rZWQnLFxuICAgICAgfSxcbiAgICAgIGZldGNoOiAocXVlcnk6IGFueSkgPT4gdGhpcy5fZmV0Y2gocXVlcnkpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9mZXRjaChxdWVyeTogYW55KTogT2JzZXJ2YWJsZTx7IGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107IHBhZ2luZzogYW55IH0+IHtcbiAgICAvLyBNYW55L2xvYWQtbW9yZSBzZW5kcyBgb2Zmc2V0YCArIGBsaW1pdGAgKG5vdCBgcGFnZWApOyBkZXJpdmUgdGhlIHBhZ2Ugc29cbiAgICAvLyB0aGUgc2VydmVyLXNpZGUgd3JhcCBrZWVwcyB3b3JraW5nIHVuY2hhbmdlZC4gUGFnZSBzdHJhdGVneSBzdGlsbCBzZW5kc1xuICAgIC8vIGBwYWdlYCBkaXJlY3RseS5cbiAgICBjb25zdCBwYWdlU2l6ZSA9IHF1ZXJ5LmxpbWl0ID8/IDI1O1xuICAgIGNvbnN0IHBhZ2UgPSBxdWVyeS5wYWdlXG4gICAgICA/PyAocXVlcnkub2Zmc2V0ICE9IG51bGwgPyBNYXRoLmZsb29yKHF1ZXJ5Lm9mZnNldCAvIHBhZ2VTaXplKSArIDEgOiAxKTtcblxuICAgIGNvbnN0IHN0YXRlOiBDb21wb25lbnREYXRhU3RhdGUgPSB7XG4gICAgICBwYWdlLFxuICAgICAgcGFnZVNpemUsXG4gICAgfTtcblxuICAgIGNvbnN0IG9yZGVyID0gU3RyaW5nKHF1ZXJ5Lm9yZGVyID8/ICcnKTtcbiAgICBpZiAob3JkZXIpIHtcbiAgICAgIGNvbnN0IFtjb2x1bW4sIGRpcmVjdGlvbl0gPSBvcmRlci5zcGxpdCgnLCcpO1xuICAgICAgc3RhdGUuc29ydCA9IHsgY29sdW1uLCBkaXJlY3Rpb246IGRpcmVjdGlvbiA9PT0gJ2Rlc2MnID8gJ2Rlc2MnIDogJ2FzYycgfTtcbiAgICB9XG5cbiAgICB0aGlzLl9maWx0ZXJTdGF0ZS5zZXRMaXN0U29ydCh0aGlzLmNvbXBvbmVudC5pZCwgc3RhdGUuc29ydCA/PyBudWxsKTtcblxuICAgIC8vIE9uZSBzb3VyY2UgZm9yIGZpbHRlciB2YWx1ZXMsIHRoZSBzYW1lIG9uZSBjaGFydHMsIEtQSXMgYW5kIHRoZSBleHBvcnRzXG4gICAgLy8gcmVhZCwgc28gdGhlIGxpc3QgaXMgZmlsdGVyZWQgZXhhY3RseSBhcyBpdHMgaGVhZGVyIHN0cmlwIHNob3dzLlxuICAgIGNvbnN0IGZpbHRlcnMgPSB0aGlzLl9maWx0ZXJTdGF0ZS5yZXNvbHZlRm9yQ29tcG9uZW50KHRoaXMuY29tcG9uZW50KTtcblxuICAgIHJldHVybiB0aGlzLl9yZXBvcnREYXRhXG4gICAgICAuY29tcG9uZW50RGF0YSh0aGlzLnJlcG9ydElkLCB0aGlzLmNvbXBvbmVudC5pZCwgZmlsdGVycywgc3RhdGUpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChkYXRhOiBDb21wb25lbnREYXRhKSA9PiB7XG4gICAgICAgICAgLy8gQSBjcm9zcy10YWIncyBoZWFkZXJzIGNvbWUgYmFjayB3aXRoIHRoZSByb3dzOiB0aGUgcm93LWtleSBjb2x1bW5cbiAgICAgICAgICAvLyBmaXJzdCwgdGhlbiBvbmUgcGVyIHBpdm90IHZhbHVlLiBSZS1yZWFkIHRoZW0gb24gZXZlcnkgZmV0Y2gsIHNpbmNlXG4gICAgICAgICAgLy8gYSBmaWx0ZXIgY2hhbmdlIGNhbiBhZGQgb3IgcmVtb3ZlIGEgY29sdW1uLlxuICAgICAgICAgIGlmICh0aGlzLnBpdm90ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5jb2x1bW5zLnNldCh0aGlzLl9waXZvdENvbHVtbnMoZGF0YSkpO1xuICAgICAgICAgICAgdGhpcy50cnVuY2F0ZWQuc2V0KCEhZGF0YS50cnVuY2F0ZWQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhOiBkYXRhLnJvd3MgPz8gW10sXG4gICAgICAgICAgICBwYWdpbmc6IHtcbiAgICAgICAgICAgICAgbGltaXQ6IGRhdGEucGFnaW5nPy5wYWdlU2l6ZSA/PyBzdGF0ZS5wYWdlU2l6ZSxcbiAgICAgICAgICAgICAgcmVjb3JkczogZGF0YS5wYWdpbmc/LnRvdGFsID8/IChkYXRhLnJvd3M/Lmxlbmd0aCA/PyAwKSxcbiAgICAgICAgICAgICAgcGFnZTogZGF0YS5wYWdpbmc/LnBhZ2UgPz8gc3RhdGUucGFnZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gQSBjcm9zcy10YWIncyBjb2x1bW5zLCBidWlsdCBmcm9tIHRoZSB3aXJlLCBoZWFkZWQgYnkgcGl2b3RIZWFkaW5ncygpOiB0aGVcbiAgLy8gc2FtZSBoZWFkaW5ncyB0aGUgUERGIGFuZCBQb3dlclBvaW50IGV4cG9ydHMgcHJpbnQuXG4gIHByaXZhdGUgX3Bpdm90Q29sdW1ucyhkYXRhOiBDb21wb25lbnREYXRhKTogeyBjb2x1bW46IHN0cmluZzsgbGFiZWw/OiBzdHJpbmc7IGZvcm1hdD86IHN0cmluZyB9W10ge1xuICAgIGNvbnN0IGNvbmZpZyA9ICh0aGlzLmNvbXBvbmVudC5jb25maWcgPz8ge30pIGFzIExpc3RDb25maWc7XG4gICAgY29uc3QgaGVhZGluZ3MgPSBwaXZvdEhlYWRpbmdzKGNvbmZpZywgZGF0YSk7XG5cbiAgICByZXR1cm4gKGRhdGEuY29sdW1ucyA/PyBbXSkubWFwKChjb2x1bW4sIGluZGV4KSA9PiAoeyBjb2x1bW4sIGxhYmVsOiBoZWFkaW5nc1tpbmRleF0gfSkpO1xuICB9XG59XG4iLCJAaWYgKHRydW5jYXRlZCgpKSB7XG4gIDxkaXYgY2xhc3M9XCJwaXZvdC10cnVuY2F0ZWRcIj5cbiAgICBUaGlzIGdyaWQgd2FzIGJ1aWx0IGZyb20gYSBwYXJ0aWFsIHJlc3VsdCwgc28gc29tZSBjb2x1bW5zIG9yIHZhbHVlcyBtYXkgYmUgbWlzc2luZy4gTmFycm93IGl0IHdpdGggYSBmaWx0ZXIuXG4gIDwvZGl2PlxufVxuXG48ZnMtbGlzdCBbY29uZmlnXT1cImxpc3RDb25maWdcIj5cbiAgQGZvciAoY29sdW1uIG9mIGNvbHVtbnMoKTsgdHJhY2sgY29sdW1uLmNvbHVtbikge1xuICAgIDxmcy1saXN0LWNvbHVtblxuICAgICAgW25hbWVdPVwiY29sdW1uLmNvbHVtblwiXG4gICAgICBbdGl0bGVdPVwiY29sdW1uLmxhYmVsIHx8IGNvbHVtbi5jb2x1bW5cIlxuICAgICAgW3NvcnRhYmxlXT1cIiFwaXZvdGVkKCkgfHwgJGZpcnN0XCI+XG4gICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgZnMtbGlzdC1jZWxsXG4gICAgICAgIGxldC1yb3c9XCJyb3dcIj5cbiAgICAgICAgQGlmIChjb2x1bW4uZm9ybWF0ID09PSAnZGF0ZScpIHtcbiAgICAgICAgICB7eyByb3dbY29sdW1uLmNvbHVtbl0gfCBmc1JlcG9ydERhdGU6IHRpbWV6b25lKCkgfX1cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAge3sgcm93W2NvbHVtbi5jb2x1bW5dIH19XG4gICAgICAgIH1cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9mcy1saXN0LWNvbHVtbj5cbiAgfVxuPC9mcy1saXN0PlxuIl19