@firestitch/report 18.7.0 → 18.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/app/reports/components/component-kpi/component-kpi.component.d.ts +12 -3
  2. package/app/reports/components/component-kpi/components/sparkline/sparkline.component.d.ts +8 -0
  3. package/app/reports/components/component-list/component-list.component.d.ts +7 -1
  4. package/app/reports/components/component-note/component-note.component.d.ts +12 -0
  5. package/app/reports/components/report-canvas/report-canvas.component.d.ts +0 -9
  6. package/app/reports/components/report-component/report-component.component.d.ts +2 -11
  7. package/app/reports/data/report.data.d.ts +0 -2
  8. package/app/reports/dialogs/component-settings/component-settings.component.d.ts +34 -2
  9. package/app/reports/dialogs/report-settings/report-settings.component.d.ts +0 -1
  10. package/app/reports/enums/report-change-polarity.enum.d.ts +5 -0
  11. package/app/reports/enums/report-kpi-trend.enum.d.ts +5 -0
  12. package/app/reports/export/report-export-collector.service.d.ts +27 -1
  13. package/app/reports/export/report-pdf.service.d.ts +5 -0
  14. package/app/reports/export/report-pptx.service.d.ts +7 -0
  15. package/app/reports/format.d.ts +27 -1
  16. package/app/reports/interfaces/report-chat-viewer-filter.interface.d.ts +2 -0
  17. package/app/reports/interfaces/report.interface.d.ts +124 -4
  18. package/app/reports/kpi-card.d.ts +48 -0
  19. package/app/reports/layout.d.ts +0 -9
  20. package/app/reports/list-config.d.ts +8 -1
  21. package/app/reports/option-builder.d.ts +7 -0
  22. package/app/reports/output-notes.d.ts +14 -0
  23. package/app/reports/pipes/report-output.pipe.d.ts +10 -0
  24. package/app/reports/services/report-filter-state.service.d.ts +1 -0
  25. package/app/reports/theme/palette.d.ts +3 -0
  26. package/app/reports/theme/typography.d.ts +1 -0
  27. package/esm2022/app/reports/components/component-chart/component-chart.component.mjs +8 -4
  28. package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +50 -17
  29. package/esm2022/app/reports/components/component-kpi/components/sparkline/sparkline.component.mjs +19 -0
  30. package/esm2022/app/reports/components/component-list/component-list.component.mjs +66 -6
  31. package/esm2022/app/reports/components/component-note/component-note.component.mjs +30 -0
  32. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +7 -56
  33. package/esm2022/app/reports/components/report-component/report-component.component.mjs +21 -82
  34. package/esm2022/app/reports/data/report.data.mjs +5 -5
  35. package/esm2022/app/reports/dialogs/component-settings/component-settings.component.mjs +133 -13
  36. package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +4 -8
  37. package/esm2022/app/reports/enums/report-change-polarity.enum.mjs +11 -0
  38. package/esm2022/app/reports/enums/report-kpi-trend.enum.mjs +10 -0
  39. package/esm2022/app/reports/export/report-export-collector.service.mjs +101 -10
  40. package/esm2022/app/reports/export/report-pdf.service.mjs +249 -40
  41. package/esm2022/app/reports/export/report-pptx.service.mjs +312 -49
  42. package/esm2022/app/reports/format.mjs +423 -2
  43. package/esm2022/app/reports/interfaces/report-chat-viewer-filter.interface.mjs +1 -1
  44. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  45. package/esm2022/app/reports/kpi-card.mjs +174 -0
  46. package/esm2022/app/reports/layout.mjs +1 -46
  47. package/esm2022/app/reports/list-config.mjs +33 -1
  48. package/esm2022/app/reports/option-builder.mjs +624 -54
  49. package/esm2022/app/reports/output-notes.mjs +158 -0
  50. package/esm2022/app/reports/pipes/report-output.pipe.mjs +28 -0
  51. package/esm2022/app/reports/services/report-filter-state.service.mjs +40 -3
  52. package/esm2022/app/reports/theme/palette.mjs +17 -1
  53. package/esm2022/app/reports/theme/typography.mjs +5 -1
  54. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +2 -2
  55. package/esm2022/app/reports/views/report/report.component.mjs +3 -4
  56. package/esm2022/public_api.mjs +2 -1
  57. package/fesm2022/{firestitch-report-echarts-u5ImuZT5.mjs → firestitch-report-echarts-qCBE3LqM.mjs} +2 -2
  58. package/fesm2022/{firestitch-report-echarts-u5ImuZT5.mjs.map → firestitch-report-echarts-qCBE3LqM.mjs.map} +1 -1
  59. package/fesm2022/{firestitch-report-firestitch-report-Cz-kA_id.mjs → firestitch-report-firestitch-report-DbsWbE-j.mjs} +2574 -487
  60. package/fesm2022/firestitch-report-firestitch-report-DbsWbE-j.mjs.map +1 -0
  61. package/fesm2022/firestitch-report.mjs +1 -1
  62. package/package.json +1 -1
  63. package/public_api.d.ts +1 -0
  64. package/fesm2022/firestitch-report-firestitch-report-Cz-kA_id.mjs.map +0 -1
@@ -0,0 +1,158 @@
1
+ import { comparisonNoteText, comparisonOffsetLabel, formatDayWindow, kpiNoteText, windowNoteText, windowText, } from './format';
2
+ // Between the current window and each prior one on the windows line.
3
+ const WINDOWS_SEPARATOR = ' · ';
4
+ // Ranks and shares are computed after the viewer's filters, never before.
5
+ const FILTERED_ROWS_SENTENCE = 'Computed over the rows the filters keep.';
6
+ const ROLE_LEADS = {
7
+ current: 'Value',
8
+ prior: 'Prior value',
9
+ change: 'Change',
10
+ percent_change: 'Percent change',
11
+ };
12
+ // The note's lines, in order: the windows, then the comparison's notes and a
13
+ // KPI's delta note, then the windowed values' descriptions and notes. A line is never repeated (two
14
+ // windowed values often share a note). Empty when the data has none of the
15
+ // keys, or none of the parts asked for.
16
+ export function componentNoteLines(data, context, parts = {}) {
17
+ if (!data) {
18
+ return [];
19
+ }
20
+ const lines = [
21
+ parts.windows === false ? '' : componentWindowsLine(data, context),
22
+ ...comparisonNotes(data.comparison),
23
+ kpiNote(data.kpi, data.comparison),
24
+ ...(parts.windowDescriptions ? windowDescriptions(data, context.locale) : []),
25
+ ...(parts.windowNotes === false ? [] : windowNotes(data, context.locale)),
26
+ ];
27
+ return [...new Set(lines.filter((line) => !!line))];
28
+ }
29
+ // What one output column holds, for its header's tooltip: the windows a
30
+ // compared value covers, a rank's or a share's scope, and how a windowed value
31
+ // was computed. A cross-tab cell column reads its measure's meaning through
32
+ // cellMeasures. '' for a plain column.
33
+ export function outputColumnNote(column, data, locale) {
34
+ const alias = data?.cellMeasures?.[column] ?? column;
35
+ const output = data?.outputs?.[alias];
36
+ if (!output) {
37
+ return '';
38
+ }
39
+ return [
40
+ comparisonSentence(output, data.comparison, locale),
41
+ rankSentence(output),
42
+ shareSentence(output),
43
+ windowSentences(data.windows?.[alias], locale, data),
44
+ ]
45
+ .filter((sentence) => !!sentence)
46
+ .join(' ');
47
+ }
48
+ // 'Sep 1 – 15, 2026 · vs previous month: Aug 1 – 15, 2026'. A comparison
49
+ // with no current window yet has no line (its no_window note says so); a
50
+ // component without a comparison shows its timeframe's days. '' when the data
51
+ // has neither. The note's first line, and the PDF and PowerPoint exports'
52
+ // subtitle under a chart's or a list's title.
53
+ export function componentWindowsLine(data, context) {
54
+ const comparison = data.comparison;
55
+ if (comparison) {
56
+ return comparison.current ? comparisonWindowsLine(comparison, comparison.current, context.locale) : '';
57
+ }
58
+ return data.timeframe ? formatDayWindow(data.timeframe, context.timezone, context.locale) : '';
59
+ }
60
+ function comparisonWindowsLine(comparison, currentWindow, locale) {
61
+ const current = formatDayWindow(currentWindow, comparison.timezone, locale);
62
+ const priors = (comparison.offsets ?? []).map((offset, index) => {
63
+ return priorWindowText(offset, comparison.priors?.[index], comparison.timezone, locale);
64
+ });
65
+ return [current, ...priors]
66
+ .filter((part) => !!part)
67
+ .join(WINDOWS_SEPARATOR);
68
+ }
69
+ // One prior lane: 'vs previous month: Aug 1 – 15, 2026', or its label alone
70
+ // when the server sends no window for it.
71
+ function priorWindowText(offset, prior, timezone, locale) {
72
+ const label = comparisonOffsetLabel(offset);
73
+ const days = prior ? formatDayWindow(prior, timezone, locale) : '';
74
+ return days ? `${label}: ${days}` : label;
75
+ }
76
+ function comparisonNotes(comparison) {
77
+ return (comparison?.notes ?? []).map((code) => comparisonNoteText(code, comparison));
78
+ }
79
+ // Why a KPI card's delta reads as it does ('No baseline: the previous period
80
+ // has no data.'), naming the baseline by what the first lane compares against.
81
+ function kpiNote(kpi, comparison) {
82
+ return kpi?.note ? kpiNoteText(kpi.note, comparison?.offsets?.[0]?.against) : '';
83
+ }
84
+ // One line per windowed value, named by its column when there are several.
85
+ function windowDescriptions(data, locale) {
86
+ const windows = Object.entries(data.windows ?? {});
87
+ return windows.map(([alias, meta]) => {
88
+ const text = windowText(meta, locale, data.granularity);
89
+ return windows.length > 1 ? `${alias}: ${text}` : text;
90
+ });
91
+ }
92
+ function windowNotes(data, locale) {
93
+ return Object.values(data.windows ?? {})
94
+ .flatMap((meta) => (meta.notes ?? []).map((code) => windowNoteText(code, meta, locale, data.granularity)));
95
+ }
96
+ // A compared column's windows. In range mode every row compares the same two
97
+ // windows, so they are named; in series and as-of modes each row compares its
98
+ // own period, so only the lane is.
99
+ function comparisonSentence(output, comparison, locale) {
100
+ if (!output.role || !comparison) {
101
+ return '';
102
+ }
103
+ const offset = comparison.offsets?.[(output.offset ?? 1) - 1] ?? null;
104
+ const current = comparison.current ? formatDayWindow(comparison.current, comparison.timezone, locale) : '';
105
+ const priorWindow = comparison.priors?.[(output.offset ?? 1) - 1];
106
+ const prior = priorWindow ? formatDayWindow(priorWindow, comparison.timezone, locale) : '';
107
+ if (comparison.mode === 'range' && current && (output.role === 'current' || prior)) {
108
+ return rangeSentence(output.role, current, prior, offset);
109
+ }
110
+ return output.role === 'current' || !offset ? '' : `${ROLE_LEADS[output.role]} ${comparisonOffsetLabel(offset)}.`;
111
+ }
112
+ function rangeSentence(role, current, prior, offset) {
113
+ switch (role) {
114
+ case 'current':
115
+ return `Value for ${current}.`;
116
+ case 'prior':
117
+ return offset ? `Prior value for ${prior} (${comparisonOffsetLabel(offset)}).` : `Prior value for ${prior}.`;
118
+ default:
119
+ return `${ROLE_LEADS[role]} from ${prior} to ${current}.`;
120
+ }
121
+ }
122
+ // 'Rank by Revenue, 1 being the largest, within each Region. Tied values share
123
+ // a rank (1, 1, 3).'
124
+ function rankSentence(output) {
125
+ const rank = output.kind === 'rank' ? output.rank : null;
126
+ if (!rank) {
127
+ return '';
128
+ }
129
+ const end = rank.direction === 'asc' ? 'smallest' : 'largest';
130
+ const scope = rank.within?.length ? `within each ${joinNames(rank.within)}` : 'across all rows';
131
+ const ties = rank.method === 'dense' ? '1, 1, 2' : '1, 1, 3';
132
+ return `Rank by ${output.measure}, 1 being the ${end}, ${scope}. Tied values share a rank (${ties}). `
133
+ + FILTERED_ROWS_SENTENCE;
134
+ }
135
+ // 'Share of the total Revenue within each Region.'
136
+ function shareSentence(output) {
137
+ const share = output.kind === 'share' ? output.share : null;
138
+ if (!share) {
139
+ return '';
140
+ }
141
+ const scope = share.within?.length ? ` within each ${joinNames(share.within)}` : '';
142
+ return `Share of the total ${output.measure}${scope}. ${FILTERED_ROWS_SENTENCE}`;
143
+ }
144
+ // A windowed column: what it is, then why it reads as it does.
145
+ function windowSentences(meta, locale, data) {
146
+ if (!meta) {
147
+ return '';
148
+ }
149
+ const notes = (meta.notes ?? []).map((code) => windowNoteText(code, meta, locale, data.granularity));
150
+ return [`${windowText(meta, locale, data.granularity)}.`, ...notes].join(' ');
151
+ }
152
+ // 'Region', 'Region and Channel', 'Region, Channel and Plan'.
153
+ function joinNames(names) {
154
+ return names.length > 1
155
+ ? `${names.slice(0, -1).join(', ')} and ${names[names.length - 1]}`
156
+ : names.join('');
157
+ }
158
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0cHV0LW5vdGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL291dHB1dC1ub3Rlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLHFCQUFxQixFQUNyQixlQUFlLEVBQ2YsV0FBVyxFQUNYLGNBQWMsRUFDZCxVQUFVLEdBQ1gsTUFBTSxVQUFVLENBQUM7QUE4Q2xCLHFFQUFxRTtBQUNyRSxNQUFNLGlCQUFpQixHQUFHLEtBQUssQ0FBQztBQUVoQywwRUFBMEU7QUFDMUUsTUFBTSxzQkFBc0IsR0FBRywwQ0FBMEMsQ0FBQztBQUUxRSxNQUFNLFVBQVUsR0FBK0I7SUFDN0MsT0FBTyxFQUFFLE9BQU87SUFDaEIsS0FBSyxFQUFFLGFBQWE7SUFDcEIsTUFBTSxFQUFFLFFBQVE7SUFDaEIsY0FBYyxFQUFFLGdCQUFnQjtDQUNqQyxDQUFDO0FBRUYsNkVBQTZFO0FBQzdFLG9HQUFvRztBQUNwRywyRUFBMkU7QUFDM0Usd0NBQXdDO0FBQ3hDLE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsSUFBMEMsRUFDMUMsT0FBNkIsRUFDN0IsUUFBNEIsRUFBRTtJQUU5QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRztRQUNaLEtBQUssQ0FBQyxPQUFPLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7UUFDbEUsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNuQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ2xDLEdBQUcsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLElBQUks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QUFHLENBQUMsQ0FBQyxFQUFFO1FBQ25FLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBjb21wYXJpc29uTm90ZVRleHQsXG4gIGNvbXBhcmlzb25PZmZzZXRMYWJlbCxcbiAgZm9ybWF0RGF5V2luZG93LFxuICBrcGlOb3RlVGV4dCxcbiAgd2luZG93Tm90ZVRleHQsXG4gIHdpbmRvd1RleHQsXG59IGZyb20gJy4vZm9ybWF0JztcbmltcG9ydCB7XG4gIENvbXBhcmlzb25PZmZzZXQsXG4gIENvbXBhcmlzb25XaW5kb3csXG4gIENvbXBvbmVudENvbXBhcmlzb24sXG4gIENvbXBvbmVudERhdGEsXG4gIENvbXBvbmVudEtwaSxcbiAgT3V0cHV0TWV0YSxcbiAgT3V0cHV0Um9sZSxcbiAgUmVwb3J0TG9jYWxlVGFnLFxuICBXaW5kb3dNZXRhLFxufSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5cblxuLy8gVGhlIG5vdGVzIGEgY29tcG9uZW50IHNob3dzIGFib3V0IHRoZSBudW1iZXJzIGl0IGRyYXdzOiB3aGljaCBkYXlzIGFcbi8vIGNvbXBhcmlzb24gY29tcGFyZXMsIHdoeSBpdCByZWFkcyBhcyBpdCBkb2VzLCBhbmQgaG93IGl0cyB3aW5kb3dlZCB2YWx1ZXNcbi8vIHdlcmUgY29tcHV0ZWQuIFRoZSBzZXJ2ZXIgc2VuZHMgd2luZG93cywgZmllbGRzIGFuZCBjb2RlczsgZXZlcnkgc2VudGVuY2UgaXNcbi8vIHdvcmRlZCBoZXJlLCB0aHJvdWdoIGZvcm1hdC50cywgaW4gRW5nbGlzaCB3aXRoIHRoZSBkYXlzIGluIHRoZSByZXBvcnQnc1xuLy8gbG9jYWxlLiBBIGNvbXBvbmVudCB3aG9zZSBkYXRhIGNhcnJpZXMgbm9uZSBvZiB0aG9zZSBrZXlzIGhhcyBubyBub3RlLlxuXG4vLyBUaGUgQ29tcG9uZW50RGF0YSBrZXlzIGEgbm90ZSByZWFkcy5cbmV4cG9ydCB0eXBlIENvbXBvbmVudE5vdGVEYXRhID0gUGljazxcbiAgQ29tcG9uZW50RGF0YSxcbiAgJ2NvbXBhcmlzb24nIHwgJ3RpbWVmcmFtZScgfCAnb3V0cHV0cycgfCAnY2VsbE1lYXN1cmVzJyB8ICd3aW5kb3dzJyB8ICdncmFudWxhcml0eScgfCAna3BpJ1xuPjtcblxuLy8gVGhlIHJlcG9ydCB0aGUgbm90ZSBpcyB3cml0dGVuIGZvcjogaXRzIGxvY2FsZSwgYW5kIHRoZSB6b25lIGEgdGltZWZyYW1lJ3Ncbi8vIGN1dCB0aW1lIHJlYWRzIGluIChhIGNvbXBhcmlzb24gbmFtZXMgaXRzIG93bikuXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudE5vdGVDb250ZXh0IHtcbiAgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWc7XG4gIHRpbWV6b25lOiBzdHJpbmc7XG59XG5cbi8vIFdoaWNoIHBhcnRzIG9mIHRoZSBub3RlIGEgY29tcG9uZW50IHNob3dzLiBPbWl0dGVkLCBhIHBhcnQgaXMgc2hvd24sIGV4Y2VwdFxuLy8gdGhlIHdpbmRvdyBkZXNjcmlwdGlvbnMsIHdoaWNoIGEgY2hhcnQncyB0b29sdGlwcyBhbmQgYSBsaXN0J3MgaGVhZGVycyBjYXJyeVxuLy8gaW5zdGVhZC5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50Tm90ZVBhcnRzIHtcbiAgLy8gVGhlIGRheXMgdGhlIGNvbXBvbmVudCByZWFkczogaXRzIGNvbXBhcmlzb24ncyBjdXJyZW50IGFuZCBwcmlvciB3aW5kb3dzLFxuICAvLyBlbHNlIGl0cyB0aW1lZnJhbWUncyBkYXlzLlxuICB3aW5kb3dzPzogYm9vbGVhbjtcbiAgLy8gV2hhdCBlYWNoIHdpbmRvd2VkIHZhbHVlIGlzICgnUm9sbGluZyAzLW1vbnRoIHRvdGFsLCBTZXAgMSDigJMgMzAsIDIwMjYnKS5cbiAgd2luZG93RGVzY3JpcHRpb25zPzogYm9vbGVhbjtcbiAgLy8gV2h5IHRoZSB3aW5kb3dlZCB2YWx1ZXMgcmVhZCBhcyB0aGV5IGRvLlxuICB3aW5kb3dOb3Rlcz86IGJvb2xlYW47XG59XG5cbi8vIEJldHdlZW4gdGhlIGN1cnJlbnQgd2luZG93IGFuZCBlYWNoIHByaW9yIG9uZSBvbiB0aGUgd2luZG93cyBsaW5lLlxuY29uc3QgV0lORE9XU19TRVBBUkFUT1IgPSAnIMK3ICc7XG5cbi8vIFJhbmtzIGFuZCBzaGFyZXMgYXJlIGNvbXB1dGVkIGFmdGVyIHRoZSB2aWV3ZXIncyBmaWx0ZXJzLCBuZXZlciBiZWZvcmUuXG5jb25zdCBGSUxURVJFRF9ST1dTX1NFTlRFTkNFID0gJ0NvbXB1dGVkIG92ZXIgdGhlIHJvd3MgdGhlIGZpbHRlcnMga2VlcC4nO1xuXG5jb25zdCBST0xFX0xFQURTOiBSZWNvcmQ8T3V0cHV0Um9sZSwgc3RyaW5nPiA9IHtcbiAgY3VycmVudDogJ1ZhbHVlJyxcbiAgcHJpb3I6ICdQcmlvciB2YWx1ZScsXG4gIGNoYW5nZTogJ0NoYW5nZScsXG4gIHBlcmNlbnRfY2hhbmdlOiAnUGVyY2VudCBjaGFuZ2UnLFxufTtcblxuLy8gVGhlIG5vdGUncyBsaW5lcywgaW4gb3JkZXI6IHRoZSB3aW5kb3dzLCB0aGVuIHRoZSBjb21wYXJpc29uJ3Mgbm90ZXMgYW5kIGFcbi8vIEtQSSdzIGRlbHRhIG5vdGUsIHRoZW4gdGhlIHdpbmRvd2VkIHZhbHVlcycgZGVzY3JpcHRpb25zIGFuZCBub3Rlcy4gQSBsaW5lIGlzIG5ldmVyIHJlcGVhdGVkICh0d29cbi8vIHdpbmRvd2VkIHZhbHVlcyBvZnRlbiBzaGFyZSBhIG5vdGUpLiBFbXB0eSB3aGVuIHRoZSBkYXRhIGhhcyBub25lIG9mIHRoZVxuLy8ga2V5cywgb3Igbm9uZSBvZiB0aGUgcGFydHMgYXNrZWQgZm9yLlxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvbmVudE5vdGVMaW5lcyhcbiAgZGF0YTogQ29tcG9uZW50Tm90ZURhdGEgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBjb250ZXh0OiBDb21wb25lbnROb3RlQ29udGV4dCxcbiAgcGFydHM6IENvbXBvbmVudE5vdGVQYXJ0cyA9IHt9LFxuKTogc3RyaW5nW10ge1xuICBpZiAoIWRhdGEpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBsaW5lcyA9IFtcbiAgICBwYXJ0cy53aW5kb3dzID09PSBmYWxzZSA/ICcnIDogY29tcG9uZW50V2luZG93c0xpbmUoZGF0YSwgY29udGV4dCksXG4gICAgLi4uY29tcGFyaXNvbk5vdGVzKGRhdGEuY29tcGFyaXNvbiksXG4gICAga3BpTm90ZShkYXRhLmtwaSwgZGF0YS5jb21wYXJpc29uKSxcbiAgICAuLi4ocGFydHMud2luZG93RGVzY3JpcHRpb25zID8gd2luZG93RGVzY3JpcHRpb25zKGRhdGEsIGNvbnRleHQubG9jYWxlKSA6IFtdKSxcbiAgICAuLi4ocGFydHMud2luZG93Tm90ZXMgPT09IGZhbHNlID8gW10gOiB3aW5kb3dOb3RlcyhkYXRhLCBjb250ZXh0LmxvY2FsZSkpLFxuICBdO1xuXG4gIHJldHVybiBbLi4ubmV3IFNldChsaW5lcy5maWx0ZXIoKGxpbmUpID0+ICEhbGluZSkpXTtcbn1cblxuLy8gV2hhdCBvbmUgb3V0cHV0IGNvbHVtbiBob2xkcywgZm9yIGl0cyBoZWFkZXIncyB0b29sdGlwOiB0aGUgd2luZG93cyBhXG4vLyBjb21wYXJlZCB2YWx1ZSBjb3ZlcnMsIGEgcmFuaydzIG9yIGEgc2hhcmUncyBzY29wZSwgYW5kIGhvdyBhIHdpbmRvd2VkIHZhbHVlXG4vLyB3YXMgY29tcHV0ZWQuIEEgY3Jvc3MtdGFiIGNlbGwgY29sdW1uIHJlYWRzIGl0cyBtZWFzdXJlJ3MgbWVhbmluZyB0aHJvdWdoXG4vLyBjZWxsTWVhc3VyZXMuICcnIGZvciBhIHBsYWluIGNvbHVtbi5cbmV4cG9ydCBmdW5jdGlvbiBvdXRwdXRDb2x1bW5Ob3RlKFxuICBjb2x1bW46IHN0cmluZyxcbiAgZGF0YTogQ29tcG9uZW50Tm90ZURhdGEgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbik6IHN0cmluZyB7XG4gIGNvbnN0IGFsaWFzID0gZGF0YT8uY2VsbE1lYXN1cmVzPy5bY29sdW1uXSA/PyBjb2x1bW47XG4gIGNvbnN0IG91dHB1dCA9IGRhdGE/Lm91dHB1dHM/LlthbGlhc107XG5cbiAgaWYgKCFvdXRwdXQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIGNvbXBhcmlzb25TZW50ZW5jZShvdXRwdXQsIGRhdGEuY29tcGFyaXNvbiwgbG9jYWxlKSxcbiAgICByYW5rU2VudGVuY2Uob3V0cHV0KSxcbiAgICBzaGFyZVNlbnRlbmNlKG91dHB1dCksXG4gICAgd2luZG93U2VudGVuY2VzKGRhdGEud2luZG93cz8uW2FsaWFzXSwgbG9jYWxlLCBkYXRhKSxcbiAgXVxuICAgIC5maWx0ZXIoKHNlbnRlbmNlKSA9PiAhIXNlbnRlbmNlKVxuICAgIC5qb2luKCcgJyk7XG59XG5cbi8vICdTZXAgMSDigJMgMTUsIDIwMjYgwrcgdnMgcHJldmlvdXMgbW9udGg6IEF1ZyAxIOKAkyAxNSwgMjAyNicuIEEgY29tcGFyaXNvblxuLy8gd2l0aCBubyBjdXJyZW50IHdpbmRvdyB5ZXQgaGFzIG5vIGxpbmUgKGl0cyBub193aW5kb3cgbm90ZSBzYXlzIHNvKTsgYVxuLy8gY29tcG9uZW50IHdpdGhvdXQgYSBjb21wYXJpc29uIHNob3dzIGl0cyB0aW1lZnJhbWUncyBkYXlzLiAnJyB3aGVuIHRoZSBkYXRhXG4vLyBoYXMgbmVpdGhlci4gVGhlIG5vdGUncyBmaXJzdCBsaW5lLCBhbmQgdGhlIFBERiBhbmQgUG93ZXJQb2ludCBleHBvcnRzJ1xuLy8gc3VidGl0bGUgdW5kZXIgYSBjaGFydCdzIG9yIGEgbGlzdCdzIHRpdGxlLlxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvbmVudFdpbmRvd3NMaW5lKGRhdGE6IENvbXBvbmVudE5vdGVEYXRhLCBjb250ZXh0OiBDb21wb25lbnROb3RlQ29udGV4dCk6IHN0cmluZyB7XG4gIGNvbnN0IGNvbXBhcmlzb24gPSBkYXRhLmNvbXBhcmlzb247XG5cbiAgaWYgKGNvbXBhcmlzb24pIHtcbiAgICByZXR1cm4gY29tcGFyaXNvbi5jdXJyZW50ID8gY29tcGFyaXNvbldpbmRvd3NMaW5lKGNvbXBhcmlzb24sIGNvbXBhcmlzb24uY3VycmVudCwgY29udGV4dC5sb2NhbGUpIDogJyc7XG4gIH1cblxuICByZXR1cm4gZGF0YS50aW1lZnJhbWUgPyBmb3JtYXREYXlXaW5kb3coZGF0YS50aW1lZnJhbWUsIGNvbnRleHQudGltZXpvbmUsIGNvbnRleHQubG9jYWxlKSA6ICcnO1xufVxuXG5mdW5jdGlvbiBjb21wYXJpc29uV2luZG93c0xpbmUoXG4gIGNvbXBhcmlzb246IENvbXBvbmVudENvbXBhcmlzb24sXG4gIGN1cnJlbnRXaW5kb3c6IENvbXBhcmlzb25XaW5kb3csXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgY3VycmVudCA9IGZvcm1hdERheVdpbmRvdyhjdXJyZW50V2luZG93LCBjb21wYXJpc29uLnRpbWV6b25lLCBsb2NhbGUpO1xuICBjb25zdCBwcmlvcnMgPSAoY29tcGFyaXNvbi5vZmZzZXRzID8/IFtdKS5tYXAoKG9mZnNldCwgaW5kZXgpID0+IHtcbiAgICByZXR1cm4gcHJpb3JXaW5kb3dUZXh0KG9mZnNldCwgY29tcGFyaXNvbi5wcmlvcnM/LltpbmRleF0sIGNvbXBhcmlzb24udGltZXpvbmUsIGxvY2FsZSk7XG4gIH0pO1xuXG4gIHJldHVybiBbY3VycmVudCwgLi4ucHJpb3JzXVxuICAgIC5maWx0ZXIoKHBhcnQpID0+ICEhcGFydClcbiAgICAuam9pbihXSU5ET1dTX1NFUEFSQVRPUik7XG59XG5cbi8vIE9uZSBwcmlvciBsYW5lOiAndnMgcHJldmlvdXMgbW9udGg6IEF1ZyAxIOKAkyAxNSwgMjAyNicsIG9yIGl0cyBsYWJlbCBhbG9uZVxuLy8gd2hlbiB0aGUgc2VydmVyIHNlbmRzIG5vIHdpbmRvdyBmb3IgaXQuXG5mdW5jdGlvbiBwcmlvcldpbmRvd1RleHQoXG4gIG9mZnNldDogQ29tcGFyaXNvbk9mZnNldCxcbiAgcHJpb3I6IENvbXBhcmlzb25XaW5kb3cgfCB1bmRlZmluZWQsXG4gIHRpbWV6b25lOiBzdHJpbmcsXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuKTogc3RyaW5nIHtcbiAgY29uc3QgbGFiZWwgPSBjb21wYXJpc29uT2Zmc2V0TGFiZWwob2Zmc2V0KTtcbiAgY29uc3QgZGF5cyA9IHByaW9yID8gZm9ybWF0RGF5V2luZG93KHByaW9yLCB0aW1lem9uZSwgbG9jYWxlKSA6ICcnO1xuXG4gIHJldHVybiBkYXlzID8gYCR7bGFiZWx9OiAke2RheXN9YCA6IGxhYmVsO1xufVxuXG5mdW5jdGlvbiBjb21wYXJpc29uTm90ZXMoY29tcGFyaXNvbjogQ29tcG9uZW50Q29tcGFyaXNvbiB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmdbXSB7XG4gIHJldHVybiAoY29tcGFyaXNvbj8ubm90ZXMgPz8gW10pLm1hcCgoY29kZSkgPT4gY29tcGFyaXNvbk5vdGVUZXh0KGNvZGUsIGNvbXBhcmlzb24pKTtcbn1cblxuLy8gV2h5IGEgS1BJIGNhcmQncyBkZWx0YSByZWFkcyBhcyBpdCBkb2VzICgnTm8gYmFzZWxpbmU6IHRoZSBwcmV2aW91cyBwZXJpb2Rcbi8vIGhhcyBubyBkYXRhLicpLCBuYW1pbmcgdGhlIGJhc2VsaW5lIGJ5IHdoYXQgdGhlIGZpcnN0IGxhbmUgY29tcGFyZXMgYWdhaW5zdC5cbmZ1bmN0aW9uIGtwaU5vdGUoXG4gIGtwaTogQ29tcG9uZW50S3BpIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgY29tcGFyaXNvbjogQ29tcG9uZW50Q29tcGFyaXNvbiB8IG51bGwgfCB1bmRlZmluZWQsXG4pOiBzdHJpbmcge1xuICByZXR1cm4ga3BpPy5ub3RlID8ga3BpTm90ZVRleHQoa3BpLm5vdGUsIGNvbXBhcmlzb24/Lm9mZnNldHM/LlswXT8uYWdhaW5zdCkgOiAnJztcbn1cblxuLy8gT25lIGxpbmUgcGVyIHdpbmRvd2VkIHZhbHVlLCBuYW1lZCBieSBpdHMgY29sdW1uIHdoZW4gdGhlcmUgYXJlIHNldmVyYWwuXG5mdW5jdGlvbiB3aW5kb3dEZXNjcmlwdGlvbnMoZGF0YTogQ29tcG9uZW50Tm90ZURhdGEsIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnKTogc3RyaW5nW10ge1xuICBjb25zdCB3aW5kb3dzID0gT2JqZWN0LmVudHJpZXMoZGF0YS53aW5kb3dzID8/IHt9KTtcblxuICByZXR1cm4gd2luZG93cy5tYXAoKFthbGlhcywgbWV0YV0pID0+IHtcbiAgICBjb25zdCB0ZXh0ID0gd2luZG93VGV4dChtZXRhLCBsb2NhbGUsIGRhdGEuZ3JhbnVsYXJpdHkpO1xuXG4gICAgcmV0dXJuIHdpbmRvd3MubGVuZ3RoID4gMSA/IGAke2FsaWFzfTogJHt0ZXh0fWAgOiB0ZXh0O1xuICB9KTtcbn1cblxuZnVuY3Rpb24gd2luZG93Tm90ZXMoZGF0YTogQ29tcG9uZW50Tm90ZURhdGEsIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnKTogc3RyaW5nW10ge1xuICByZXR1cm4gT2JqZWN0LnZhbHVlcyhkYXRhLndpbmRvd3MgPz8ge30pXG4gICAgLmZsYXRNYXAoKG1ldGEpID0+IChtZXRhLm5vdGVzID8/IFtdKS5tYXAoKGNvZGUpID0+IHdpbmRvd05vdGVUZXh0KGNvZGUsIG1ldGEsIGxvY2FsZSwgZGF0YS5ncmFudWxhcml0eSkpKTtcbn1cblxuLy8gQSBjb21wYXJlZCBjb2x1bW4ncyB3aW5kb3dzLiBJbiByYW5nZSBtb2RlIGV2ZXJ5IHJvdyBjb21wYXJlcyB0aGUgc2FtZSB0d29cbi8vIHdpbmRvd3MsIHNvIHRoZXkgYXJlIG5hbWVkOyBpbiBzZXJpZXMgYW5kIGFzLW9mIG1vZGVzIGVhY2ggcm93IGNvbXBhcmVzIGl0c1xuLy8gb3duIHBlcmlvZCwgc28gb25seSB0aGUgbGFuZSBpcy5cbmZ1bmN0aW9uIGNvbXBhcmlzb25TZW50ZW5jZShcbiAgb3V0cHV0OiBPdXRwdXRNZXRhLFxuICBjb21wYXJpc29uOiBDb21wb25lbnRDb21wYXJpc29uIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcsXG4pOiBzdHJpbmcge1xuICBpZiAoIW91dHB1dC5yb2xlIHx8ICFjb21wYXJpc29uKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3Qgb2Zmc2V0ID0gY29tcGFyaXNvbi5vZmZzZXRzPy5bKG91dHB1dC5vZmZzZXQgPz8gMSkgLSAxXSA/PyBudWxsO1xuICBjb25zdCBjdXJyZW50ID0gY29tcGFyaXNvbi5jdXJyZW50ID8gZm9ybWF0RGF5V2luZG93KGNvbXBhcmlzb24uY3VycmVudCwgY29tcGFyaXNvbi50aW1lem9uZSwgbG9jYWxlKSA6ICcnO1xuICBjb25zdCBwcmlvcldpbmRvdyA9IGNvbXBhcmlzb24ucHJpb3JzPy5bKG91dHB1dC5vZmZzZXQgPz8gMSkgLSAxXTtcbiAgY29uc3QgcHJpb3IgPSBwcmlvcldpbmRvdyA/IGZvcm1hdERheVdpbmRvdyhwcmlvcldpbmRvdywgY29tcGFyaXNvbi50aW1lem9uZSwgbG9jYWxlKSA6ICcnO1xuXG4gIGlmIChjb21wYXJpc29uLm1vZGUgPT09ICdyYW5nZScgJiYgY3VycmVudCAmJiAob3V0cHV0LnJvbGUgPT09ICdjdXJyZW50JyB8fCBwcmlvcikpIHtcbiAgICByZXR1cm4gcmFuZ2VTZW50ZW5jZShvdXRwdXQucm9sZSwgY3VycmVudCwgcHJpb3IsIG9mZnNldCk7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0LnJvbGUgPT09ICdjdXJyZW50JyB8fCAhb2Zmc2V0ID8gJycgOiBgJHtST0xFX0xFQURTW291dHB1dC5yb2xlXX0gJHtjb21wYXJpc29uT2Zmc2V0TGFiZWwob2Zmc2V0KX0uYDtcbn1cblxuZnVuY3Rpb24gcmFuZ2VTZW50ZW5jZShyb2xlOiBPdXRwdXRSb2xlLCBjdXJyZW50OiBzdHJpbmcsIHByaW9yOiBzdHJpbmcsIG9mZnNldDogQ29tcGFyaXNvbk9mZnNldCB8IG51bGwpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHJvbGUpIHtcbiAgICBjYXNlICdjdXJyZW50JzpcbiAgICAgIHJldHVybiBgVmFsdWUgZm9yICR7Y3VycmVudH0uYDtcbiAgICBjYXNlICdwcmlvcic6XG4gICAgICByZXR1cm4gb2Zmc2V0ID8gYFByaW9yIHZhbHVlIGZvciAke3ByaW9yfSAoJHtjb21wYXJpc29uT2Zmc2V0TGFiZWwob2Zmc2V0KX0pLmAgOiBgUHJpb3IgdmFsdWUgZm9yICR7cHJpb3J9LmA7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBgJHtST0xFX0xFQURTW3JvbGVdfSBmcm9tICR7cHJpb3J9IHRvICR7Y3VycmVudH0uYDtcbiAgfVxufVxuXG4vLyAnUmFuayBieSBSZXZlbnVlLCAxIGJlaW5nIHRoZSBsYXJnZXN0LCB3aXRoaW4gZWFjaCBSZWdpb24uIFRpZWQgdmFsdWVzIHNoYXJlXG4vLyBhIHJhbmsgKDEsIDEsIDMpLidcbmZ1bmN0aW9uIHJhbmtTZW50ZW5jZShvdXRwdXQ6IE91dHB1dE1ldGEpOiBzdHJpbmcge1xuICBjb25zdCByYW5rID0gb3V0cHV0LmtpbmQgPT09ICdyYW5rJyA/IG91dHB1dC5yYW5rIDogbnVsbDtcblxuICBpZiAoIXJhbmspIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCBlbmQgPSByYW5rLmRpcmVjdGlvbiA9PT0gJ2FzYycgPyAnc21hbGxlc3QnIDogJ2xhcmdlc3QnO1xuICBjb25zdCBzY29wZSA9IHJhbmsud2l0aGluPy5sZW5ndGggPyBgd2l0aGluIGVhY2ggJHtqb2luTmFtZXMocmFuay53aXRoaW4pfWAgOiAnYWNyb3NzIGFsbCByb3dzJztcbiAgY29uc3QgdGllcyA9IHJhbmsubWV0aG9kID09PSAnZGVuc2UnID8gJzEsIDEsIDInIDogJzEsIDEsIDMnO1xuXG4gIHJldHVybiBgUmFuayBieSAke291dHB1dC5tZWFzdXJlfSwgMSBiZWluZyB0aGUgJHtlbmR9LCAke3Njb3BlfS4gVGllZCB2YWx1ZXMgc2hhcmUgYSByYW5rICgke3RpZXN9KS4gYFxuICAgICsgRklMVEVSRURfUk9XU19TRU5URU5DRTtcbn1cblxuLy8gJ1NoYXJlIG9mIHRoZSB0b3RhbCBSZXZlbnVlIHdpdGhpbiBlYWNoIFJlZ2lvbi4nXG5mdW5jdGlvbiBzaGFyZVNlbnRlbmNlKG91dHB1dDogT3V0cHV0TWV0YSk6IHN0cmluZyB7XG4gIGNvbnN0IHNoYXJlID0gb3V0cHV0LmtpbmQgPT09ICdzaGFyZScgPyBvdXRwdXQuc2hhcmUgOiBudWxsO1xuXG4gIGlmICghc2hhcmUpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCBzY29wZSA9IHNoYXJlLndpdGhpbj8ubGVuZ3RoID8gYCB3aXRoaW4gZWFjaCAke2pvaW5OYW1lcyhzaGFyZS53aXRoaW4pfWAgOiAnJztcblxuICByZXR1cm4gYFNoYXJlIG9mIHRoZSB0b3RhbCAke291dHB1dC5tZWFzdXJlfSR7c2NvcGV9LiAke0ZJTFRFUkVEX1JPV1NfU0VOVEVOQ0V9YDtcbn1cblxuLy8gQSB3aW5kb3dlZCBjb2x1bW46IHdoYXQgaXQgaXMsIHRoZW4gd2h5IGl0IHJlYWRzIGFzIGl0IGRvZXMuXG5mdW5jdGlvbiB3aW5kb3dTZW50ZW5jZXMoXG4gIG1ldGE6IFdpbmRvd01ldGEgfCB1bmRlZmluZWQsXG4gIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnLFxuICBkYXRhOiBDb21wb25lbnROb3RlRGF0YSxcbik6IHN0cmluZyB7XG4gIGlmICghbWV0YSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGNvbnN0IG5vdGVzID0gKG1ldGEubm90ZXMgPz8gW10pLm1hcCgoY29kZSkgPT4gd2luZG93Tm90ZVRleHQoY29kZSwgbWV0YSwgbG9jYWxlLCBkYXRhLmdyYW51bGFyaXR5KSk7XG5cbiAgcmV0dXJuIFtgJHt3aW5kb3dUZXh0KG1ldGEsIGxvY2FsZSwgZGF0YS5ncmFudWxhcml0eSl9LmAsIC4uLm5vdGVzXS5qb2luKCcgJyk7XG59XG5cbi8vICdSZWdpb24nLCAnUmVnaW9uIGFuZCBDaGFubmVsJywgJ1JlZ2lvbiwgQ2hhbm5lbCBhbmQgUGxhbicuXG5mdW5jdGlvbiBqb2luTmFtZXMobmFtZXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5hbWVzLmxlbmd0aCA+IDFcbiAgICA/IGAke25hbWVzLnNsaWNlKDAsIC0xKS5qb2luKCcsICcpfSBhbmQgJHtuYW1lc1tuYW1lcy5sZW5ndGggLSAxXX1gXG4gICAgOiBuYW1lcy5qb2luKCcnKTtcbn1cbiJdfQ==
@@ -0,0 +1,28 @@
1
+ import { Pipe } from '@angular/core';
2
+ import { formatOutputValue } from '../format';
3
+ import * as i0 from "@angular/core";
4
+ // A list cell (or a totals cell) of an output column, written by what it holds:
5
+ // a prior or a change in its measure's format, a signed percent change, a
6
+ // change of a rate in points, a rank as a whole number, a share as a percent.
7
+ // It reads the whole row, since a change looks up its prior beside it to tell
8
+ // a missing baseline ('—') from a zero one ('n/a'). An empty value reads ''.
9
+ export class ReportOutputPipe {
10
+ transform(row, column, output, context) {
11
+ return formatOutputValue(row?.[column.column], output.output, column, context, {
12
+ measureSpec: output.measureSpec,
13
+ prior: output.priorAlias && row ? row[output.priorAlias] : undefined,
14
+ floor: output.floor,
15
+ empty: '',
16
+ });
17
+ }
18
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportOutputPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
19
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: ReportOutputPipe, isStandalone: true, name: "fsReportOutput" });
20
+ }
21
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportOutputPipe, decorators: [{
22
+ type: Pipe,
23
+ args: [{
24
+ name: 'fsReportOutput',
25
+ standalone: true,
26
+ }]
27
+ }] });
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LW91dHB1dC5waXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL3BpcGVzL3JlcG9ydC1vdXRwdXQucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUVwRCxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sV0FBVyxDQUFDOztBQUtwRSxnRkFBZ0Y7QUFDaEYsMEVBQTBFO0FBQzFFLDhFQUE4RTtBQUM5RSw4RUFBOEU7QUFDOUUsNkVBQTZFO0FBSzdFLE1BQU0sT0FBTyxnQkFBZ0I7SUFFcEIsU0FBUyxDQUNkLEdBQStDLEVBQy9DLE1BQWtCLEVBQ2xCLE1BQXdCLEVBQ3hCLE9BQTRCO1FBRTVCLE9BQU8saUJBQWlCLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRTtZQUM3RSxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7WUFDL0IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ3BFLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztZQUNuQixLQUFLLEVBQUUsRUFBRTtTQUNWLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBZFUsZ0JBQWdCO3NHQUFoQixnQkFBZ0I7OzRGQUFoQixnQkFBZ0I7a0JBSjVCLElBQUk7bUJBQUM7b0JBQ0osSUFBSSxFQUFFLGdCQUFnQjtvQkFDdEIsVUFBVSxFQUFFLElBQUk7aUJBQ2pCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUGlwZSwgUGlwZVRyYW5zZm9ybSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBGb3JtYXR0ZWRPdXRwdXRWYWx1ZSwgZm9ybWF0T3V0cHV0VmFsdWUgfSBmcm9tICcuLi9mb3JtYXQnO1xuaW1wb3J0IHsgTGlzdENvbHVtbiwgUmVwb3J0Rm9ybWF0Q29udGV4dCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBMaXN0T3V0cHV0Q29sdW1uIH0gZnJvbSAnLi4vbGlzdC1jb25maWcnO1xuXG5cbi8vIEEgbGlzdCBjZWxsIChvciBhIHRvdGFscyBjZWxsKSBvZiBhbiBvdXRwdXQgY29sdW1uLCB3cml0dGVuIGJ5IHdoYXQgaXQgaG9sZHM6XG4vLyBhIHByaW9yIG9yIGEgY2hhbmdlIGluIGl0cyBtZWFzdXJlJ3MgZm9ybWF0LCBhIHNpZ25lZCBwZXJjZW50IGNoYW5nZSwgYVxuLy8gY2hhbmdlIG9mIGEgcmF0ZSBpbiBwb2ludHMsIGEgcmFuayBhcyBhIHdob2xlIG51bWJlciwgYSBzaGFyZSBhcyBhIHBlcmNlbnQuXG4vLyBJdCByZWFkcyB0aGUgd2hvbGUgcm93LCBzaW5jZSBhIGNoYW5nZSBsb29rcyB1cCBpdHMgcHJpb3IgYmVzaWRlIGl0IHRvIHRlbGxcbi8vIGEgbWlzc2luZyBiYXNlbGluZSAoJ+KAlCcpIGZyb20gYSB6ZXJvIG9uZSAoJ24vYScpLiBBbiBlbXB0eSB2YWx1ZSByZWFkcyAnJy5cbkBQaXBlKHtcbiAgbmFtZTogJ2ZzUmVwb3J0T3V0cHV0JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgUmVwb3J0T3V0cHV0UGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuXG4gIHB1YmxpYyB0cmFuc2Zvcm0oXG4gICAgcm93OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgY29sdW1uOiBMaXN0Q29sdW1uLFxuICAgIG91dHB1dDogTGlzdE91dHB1dENvbHVtbixcbiAgICBjb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuICApOiBGb3JtYXR0ZWRPdXRwdXRWYWx1ZSB7XG4gICAgcmV0dXJuIGZvcm1hdE91dHB1dFZhbHVlKHJvdz8uW2NvbHVtbi5jb2x1bW5dLCBvdXRwdXQub3V0cHV0LCBjb2x1bW4sIGNvbnRleHQsIHtcbiAgICAgIG1lYXN1cmVTcGVjOiBvdXRwdXQubWVhc3VyZVNwZWMsXG4gICAgICBwcmlvcjogb3V0cHV0LnByaW9yQWxpYXMgJiYgcm93ID8gcm93W291dHB1dC5wcmlvckFsaWFzXSA6IHVuZGVmaW5lZCxcbiAgICAgIGZsb29yOiBvdXRwdXQuZmxvb3IsXG4gICAgICBlbXB0eTogJycsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==