@firestitch/report 18.17.0 → 18.17.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.
@@ -1,7 +1,10 @@
1
1
  import { GridFieldType, GridFormat, GridUnits, } from '@firestitch/grid';
2
+ import { ReportChartDateLabel } from '../../enums/report-chart-date-label.enum';
2
3
  import { ReportNumberUnits } from '../../enums/report-number-units.enum';
3
4
  import { ReportValueFormat } from '../../enums/report-value-format.enum';
4
5
  import { formatNumber, formatOutputValue, formatReportDate, numberFormat } from '../../format';
6
+ import { formatPeriodLabel } from '../../option-builder';
7
+ import { GRID_GRANULARITIES } from '../../report-grid-layout';
5
8
  const VALUE_FORMATS = {
6
9
  [GridFormat.Number]: ReportValueFormat.Number,
7
10
  [GridFormat.Percent]: ReportValueFormat.Percent,
@@ -20,9 +23,10 @@ const NO = 'No';
20
23
  // A grid tile's formatter: every value written as the report writes it on
21
24
  // a list today. An output number reads through formatOutputValue with what
22
25
  // the report line says the output holds (a change is signed, a missing prior
23
- // reads as the list's dash); a plain number through formatNumber; a date in
24
- // the report's locale, an instant in its zone. The placement's format,
25
- // precision and units win over the field's.
26
+ // reads as the list's dash); a plain number through formatNumber; a key's
27
+ // digits as they are; a date at its grain in the report's locale, an instant
28
+ // in its zone. The placement's format, precision and units win over the
29
+ // field's.
26
30
  export function reportGridFormatter(context) {
27
31
  return {
28
32
  format: (value, field, placement) => formatGridValue(context, value, field, placement),
@@ -37,6 +41,7 @@ function formatGridValue(context, value, field, placement) {
37
41
  case GridFieldType.Number:
38
42
  return formatGridNumber(context, value, field, placement);
39
43
  case GridFieldType.Date:
44
+ return formatGridDate(context, value, field, placement);
40
45
  case GridFieldType.Datetime:
41
46
  return formatReportDate(value, context.timezone, context.format.locale);
42
47
  case GridFieldType.Boolean:
@@ -46,12 +51,29 @@ function formatGridValue(context, value, field, placement) {
46
51
  }
47
52
  }
48
53
  function formatGridNumber(context, value, field, placement) {
54
+ // A key, such as a client's id, is a name: its digits print as they are, never grouped
55
+ if (field.identifier && !isAggregate(placement)) {
56
+ return String(value);
57
+ }
49
58
  const spec = numberSpec(field, placement);
50
59
  const output = isAggregate(placement) ? null : context.report?.outputs?.[field.name];
51
60
  return output
52
61
  ? formatOutputValue(value, output, spec, context.format).text
53
62
  : formatNumber(value, spec, context.format);
54
63
  }
64
+ // A calendar date at the grain it prints at: the placement's, else the
65
+ // field's own, which on a time axis is the report's group-by. A quarter reads
66
+ // "Q3 2023", a month "Jul 2023" and a year "2023", as the report's charts
67
+ // label them, rather than as their first day; a week, like a chart's, reads as
68
+ // the day it starts. A day reads as the report writes a date.
69
+ function formatGridDate(context, value, field, placement) {
70
+ const granularity = placement?.granularity ?? field.granularities?.[0];
71
+ const chartGranularity = Object.keys(GRID_GRANULARITIES)
72
+ .find((name) => GRID_GRANULARITIES[name] === granularity);
73
+ return chartGranularity && chartGranularity !== 'day' && typeof value === 'string'
74
+ ? formatPeriodLabel(value.slice(0, 10), chartGranularity, false, context.format.locale, ReportChartDateLabel.Long)
75
+ : formatReportDate(value, context.timezone, context.format.locale);
76
+ }
55
77
  // The format, precision and units a number is written with: the placement's,
56
78
  // else the field's.
57
79
  function numberSpec(field, placement) {
@@ -91,4 +113,4 @@ function readGridNumber(context, text, field, placement) {
91
113
  function decimalMark(locale) {
92
114
  return numberFormat(locale, {}).formatToParts(1.5).find((part) => part.type === 'decimal')?.value ?? '.';
93
115
  }
94
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWdyaWQtZm9ybWF0dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWdyaWQvcmVwb3J0LWdyaWQtZm9ybWF0dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDa0IsYUFBYSxFQUFFLFVBQVUsRUFBNEIsU0FBUyxHQUN0RixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBZ0IvRixNQUFNLGFBQWEsR0FBb0Q7SUFDckUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsaUJBQWlCLENBQUMsTUFBTTtJQUM3QyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxPQUFPO0lBQy9DLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLFFBQVE7Q0FDbEQsQ0FBQztBQUVGLE1BQU0sWUFBWSxHQUFtRDtJQUNuRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO0lBQ3hDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLFNBQVM7SUFDbEQsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsaUJBQWlCLENBQUMsUUFBUTtJQUNoRCxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJO0NBQ3pDLENBQUM7QUFFRixpRkFBaUY7QUFDakYsTUFBTSxhQUFhLEdBQXFDLEVBQUUsQ0FBQyxFQUFF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QUFDO0lBQ3pELE1BQU0sTUFBTSxHQUFHLE9BQU87U0FDbkIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBRTlGLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDN0IsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxVQUFVLENBQUMsT0FBTyxDQUFDO0lBRTdFLE9BQU8sU0FBUyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDMUUsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLE1BQWM7SUFDakMsT0FBTyxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLEVBQUUsS0FBSyxJQUFJLEdBQUcsQ0FBQztBQUMzRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgR3JpZERldGFpbCwgR3JpZEZpZWxkLCBHcmlkRmllbGRUeXBlLCBHcmlkRm9ybWF0LCBHcmlkRm9ybWF0dGVyLCBHcmlkTGV2ZWwsIEdyaWRVbml0cywgR3JpZFZhbHVlLFxufSBmcm9tICdAZmlyZXN0aXRjaC9ncmlkJztcblxuaW1wb3J0IHsgUmVwb3J0TnVtYmVyVW5pdHMgfSBmcm9tICcuLi8uLi9lbnVtcy9yZXBvcnQtbnVtYmVyLXVuaXRzLmVudW0nO1xuaW1wb3J0IHsgUmVwb3J0VmFsdWVGb3JtYXQgfSBmcm9tICcuLi8uLi9lbnVtcy9yZXBvcnQtdmFsdWUtZm9ybWF0LmVudW0nO1xuaW1wb3J0IHsgZm9ybWF0TnVtYmVyLCBmb3JtYXRPdXRwdXRWYWx1ZSwgZm9ybWF0UmVwb3J0RGF0ZSwgbnVtYmVyRm9ybWF0IH0gZnJvbSAnLi4vLi4vZm9ybWF0JztcbmltcG9ydCB7IFJlcG9ydEdyaWRSZXBvcnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC1ncmlkLXJlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTnVtYmVyRm9ybWF0U3BlYywgUmVwb3J0Rm9ybWF0Q29udGV4dCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5cblxudHlwZSBHcmlkUGxhY2VtZW50ID0gR3JpZFZhbHVlIHwgR3JpZERldGFpbCB8IEdyaWRMZXZlbDtcblxuLy8gV2hhdCBhIGdyaWQgdGlsZSBpcyB3cml0dGVuIHdpdGg6IHRoZSByZXBvcnQncyBsb2NhbGUsIGN1cnJlbmN5IGFuZFxuLy8gcGVyY2VudCBmb3JtLCB0aGUgem9uZSBpdHMgaW5zdGFudHMgcmVhZCBpbiwgYW5kIHRoZSByZXBvcnQgbGluZSBvZiBpdHNcbi8vIGxhdGVzdCByZWFkICh3aGF0IGVhY2ggb3V0cHV0IGZpZWxkIGhvbGRzKS5cbmV4cG9ydCBpbnRlcmZhY2UgUmVwb3J0R3JpZEZvcm1hdENvbnRleHQge1xuICBmb3JtYXQ6IFJlcG9ydEZvcm1hdENvbnRleHQ7XG4gIHRpbWV6b25lOiBzdHJpbmc7XG4gIHJlcG9ydDogUmVwb3J0R3JpZFJlcG9ydCB8IG51bGw7XG59XG5cbmNvbnN0IFZBTFVFX0ZPUk1BVFM6IFJlYWRvbmx5PFJlY29yZDxHcmlkRm9ybWF0LCBSZXBvcnRWYWx1ZUZvcm1hdD4+ID0ge1xuICBbR3JpZEZvcm1hdC5OdW1iZXJdOiBSZXBvcnRWYWx1ZUZvcm1hdC5OdW1iZXIsXG4gIFtHcmlkRm9ybWF0LlBlcmNlbnRdOiBSZXBvcnRWYWx1ZUZvcm1hdC5QZXJjZW50LFxuICBbR3JpZEZvcm1hdC5DdXJyZW5jeV06IFJlcG9ydFZhbHVlRm9ybWF0LkN1cnJlbmN5LFxufTtcblxuY29uc3QgTlVNQkVSX1VOSVRTOiBSZWFkb25seTxSZWNvcmQ8R3JpZFVuaXRzLCBSZXBvcnROdW1iZXJVbml0cz4+ID0ge1xuICBbR3JpZFVuaXRzLk5vbmVdOiBSZXBvcnROdW1iZXJVbml0cy5Ob25lLFxuICBbR3JpZFVuaXRzLlRob3VzYW5kc106IFJlcG9ydE51bWJlclVuaXRzLlRob3VzYW5kcyxcbiAgW0dyaWRVbml0cy5NaWxsaW9uc106IFJlcG9ydE51bWJlclVuaXRzLk1pbGxpb25zLFxuICBbR3JpZFVuaXRzLkF1dG9dOiBSZXBvcnROdW1iZXJVbml0cy5BdXRvLFxufTtcblxuLy8gV2hhdCBhbiBhYmJyZXZpYXRlZCBudW1iZXIncyBzdWZmaXggbXVsdGlwbGllcyBpdCBieSwgd2hlbiBhIHZpZXdlciB0eXBlcyBvbmUuXG5jb25zdCBVTklUX1NVRkZJWEVTOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBudW1iZXI+PiA9IHsgazogMWUzLCBtOiAxZTYgfTtcblxuY29uc3QgWUVTID0gJ1llcyc7XG5jb25zdCBOTyA9ICdObyc7XG5cbi8vIEEgZ3JpZCB0aWxlJ3MgZm9ybWF0dGVyOiBldmVyeSB2YWx1ZSB3cml0dGVuIGFzIHRoZSByZXBvcnQgd3JpdGVzIGl0IG9uXG4vLyBhIGxpc3QgdG9kYXkuIEFuIG91dHB1dCBudW1iZXIgcmVhZHMgdGhyb3VnaCBmb3JtYXRPdXRwdXRWYWx1ZSB3aXRoIHdoYXRcbi8vIHRoZSByZXBvcnQgbGluZSBzYXlzIHRoZSBvdXRwdXQgaG9sZHMgKGEgY2hhbmdlIGlzIHNpZ25lZCwgYSBtaXNzaW5nIHByaW9yXG4vLyByZWFkcyBhcyB0aGUgbGlzdCdzIGRhc2gpOyBhIHBsYWluIG51bWJlciB0aHJvdWdoIGZvcm1hdE51bWJlcjsgYSBkYXRlIGluXG4vLyB0aGUgcmVwb3J0J3MgbG9jYWxlLCBhbiBpbnN0YW50IGluIGl0cyB6b25lLiBUaGUgcGxhY2VtZW50J3MgZm9ybWF0LFxuLy8gcHJlY2lzaW9uIGFuZCB1bml0cyB3aW4gb3ZlciB0aGUgZmllbGQncy5cbmV4cG9ydCBmdW5jdGlvbiByZXBvcnRHcmlkRm9ybWF0dGVyKGNvbnRleHQ6IFJlcG9ydEdyaWRGb3JtYXRDb250ZXh0KTogR3JpZEZvcm1hdHRlciB7XG4gIHJldHVybiB7XG4gICAgZm9ybWF0OiAodmFsdWUsIGZpZWxkLCBwbGFjZW1lbnQpID0+IGZvcm1hdEdyaWRWYWx1ZShjb250ZXh0LCB2YWx1ZSwgZmllbGQsIHBsYWNlbWVudCksXG4gICAgdG9OdW1iZXI6ICh0ZXh0LCBmaWVsZCwgcGxhY2VtZW50KSA9PiByZWFkR3JpZE51bWJlcihjb250ZXh0LCB0ZXh0LCBmaWVsZCwgcGxhY2VtZW50KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0R3JpZFZhbHVlKFxuICBjb250ZXh0OiBSZXBvcnRHcmlkRm9ybWF0Q29udGV4dCxcbiAgdmFsdWU6IHVua25vd24sXG4gIGZpZWxkOiBHcmlkRmllbGQsXG4gIHBsYWNlbWVudD86IEdyaWRQbGFjZW1lbnQsXG4pOiBzdHJpbmcge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBzd2l0Y2ggKGZpZWxkLnR5cGUpIHtcbiAgICBjYXNlIEdyaWRGaWVsZFR5cGUuTnVtYmVyOlxuICAgICAgcmV0dXJuIGZvcm1hdEdyaWROdW1iZXIoY29udGV4dCwgdmFsdWUsIGZpZWxkLCBwbGFjZW1lbnQpO1xuICAgIGNhc2UgR3JpZEZpZWxkVHlwZS5EYXRlOlxuICAgIGNhc2UgR3JpZEZpZWxkVHlwZS5EYXRldGltZTpcbiAgICAgIHJldHVybiBmb3JtYXRSZXBvcnREYXRlKHZhbHVlLCBjb250ZXh0LnRpbWV6b25lLCBjb250ZXh0LmZvcm1hdC5sb2NhbGUpO1xuICAgIGNhc2UgR3JpZEZpZWxkVHlwZS5Cb29sZWFuOlxuICAgICAgcmV0dXJuIHZhbHVlID8gWUVTIDogTk87XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBvcHRpb25MYWJlbCh2YWx1ZSwgZmllbGQpID8/IFN0cmluZyh2YWx1ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZm9ybWF0R3JpZE51bWJlcihcbiAgY29udGV4dDogUmVwb3J0R3JpZEZvcm1hdENvbnRleHQsXG4gIHZhbHVlOiB1bmtub3duLFxuICBmaWVsZDogR3JpZEZpZWxkLFxuICBwbGFjZW1lbnQ/OiBHcmlkUGxhY2VtZW50LFxuKTogc3RyaW5nIHtcbiAgY29uc3Qgc3BlYyA9IG51bWJlclNwZWMoZmllbGQsIHBsYWNlbWVudCk7XG4gIGNvbnN0IG91dHB1dCA9IGlzQWdncmVnYXRlKHBsYWNlbWVudCkgPyBudWxsIDogY29udGV4dC5yZXBvcnQ/Lm91dHB1dHM/LltmaWVsZC5uYW1lXTtcblxuICByZXR1cm4gb3V0cHV0XG4gICAgPyBmb3JtYXRPdXRwdXRWYWx1ZSh2YWx1ZSwgb3V0cHV0LCBzcGVjLCBjb250ZXh0LmZvcm1hdCkudGV4dFxuICAgIDogZm9ybWF0TnVtYmVyKHZhbHVlLCBzcGVjLCBjb250ZXh0LmZvcm1hdCk7XG59XG5cbi8vIFRoZSBmb3JtYXQsIHByZWNpc2lvbiBhbmQgdW5pdHMgYSBudW1iZXIgaXMgd3JpdHRlbiB3aXRoOiB0aGUgcGxhY2VtZW50J3MsXG4vLyBlbHNlIHRoZSBmaWVsZCdzLlxuZnVuY3Rpb24gbnVtYmVyU3BlYyhmaWVsZDogR3JpZEZpZWxkLCBwbGFjZW1lbnQ/OiBHcmlkUGxhY2VtZW50KTogTnVtYmVyRm9ybWF0U3BlYyB7XG4gIGNvbnN0IHBsYWNlZCA9IHBsYWNlbWVudCBhcyBHcmlkVmFsdWUgfCBHcmlkRGV0YWlsIHwgdW5kZWZpbmVkO1xuICBjb25zdCBmb3JtYXQgPSBwbGFjZWQ/LmZvcm1hdCA/PyBmaWVsZC5mb3JtYXQ7XG4gIGNvbnN0IHByZWNpc2lvbiA9IHBsYWNlZD8ucHJlY2lzaW9uID8/IGZpZWxkLnByZWNpc2lvbjtcbiAgY29uc3QgdW5pdHMgPSBwbGFjZWQ/LnVuaXRzID8/IGZpZWxkLnVuaXRzO1xuXG4gIHJldHVybiB7XG4gICAgLi4uKGZvcm1hdCA/IHsgZm9ybWF0OiBWQUxVRV9GT1JNQVRTW2Zvcm1hdF0gfSA6IHt9KSxcbiAgICAuLi4odHlwZW9mIHByZWNpc2lvbiA9PT0gJ251bWJlcicgPyB7IHByZWNpc2lvbiB9IDoge30pLFxuICAgIC4uLih1bml0cyA/IHsgdW5pdHM6IE5VTUJFUl9VTklUU1t1bml0c10gfSA6IHt9KSxcbiAgfTtcbn1cblxuLy8gQSB2YWx1ZSBwbGFjZW1lbnQgaXMgYW4gYWdncmVnYXRlIG9mIHRoZSBmaWVsZCwgbm90IHRoZSBvdXRwdXQgaXRzZWxmLlxuZnVuY3Rpb24gaXNBZ2dyZWdhdGUocGxhY2VtZW50PzogR3JpZFBsYWNlbWVudCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISEocGxhY2VtZW50IGFzIEdyaWRWYWx1ZSB8IHVuZGVmaW5lZCk/LmFnZ3JlZ2F0aW9uO1xufVxuXG5mdW5jdGlvbiBvcHRpb25MYWJlbCh2YWx1ZTogdW5rbm93biwgZmllbGQ6IEdyaWRGaWVsZCk6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gZmllbGQub3B0aW9ucz8uZmluZCgob3B0aW9uKSA9PiBvcHRpb24ua2V5ID09PSB2YWx1ZSk/LmxhYmVsID8/IG51bGw7XG59XG5cbi8vIEEgbnVtYmVyIGEgdmlld2VyIHR5cGVkLCByZWFkIGluIHRoZSByZXBvcnQncyBsb2NhbGU6IGl0cyBncm91cGluZyBkcm9wcGVkLFxuLy8gaXRzIGRlY2ltYWwgbWFyayByZWFkLCBhIEsgb3IgTSBzdWZmaXggbXVsdGlwbGllZCBvdXQsIGFuZCBhIHBlcmNlbnQgb2YgYVxuLy8gcmF0aW8tcGVyY2VudCByZXBvcnQgcmVhZCBiYWNrIHRvIGl0cyByYXRpby4gbnVsbCB3aGVuIGl0IGlzIG5vIG51bWJlci5cbmZ1bmN0aW9uIHJlYWRHcmlkTnVtYmVyKFxuICBjb250ZXh0OiBSZXBvcnRHcmlkRm9ybWF0Q29udGV4dCxcbiAgdGV4dDogc3RyaW5nLFxuICBmaWVsZDogR3JpZEZpZWxkLFxuICBwbGFjZW1lbnQ/OiBHcmlkVmFsdWUgfCBHcmlkRGV0YWlsLFxuKTogbnVtYmVyIHwgbnVsbCB7XG4gIGNvbnN0IGRlY2ltYWwgPSBkZWNpbWFsTWFyayhjb250ZXh0LmZvcm1hdC5sb2NhbGUpO1xuICBjb25zdCB0cmltbWVkID0gdGV4dC50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgbXVsdGlwbGllciA9IFVOSVRfU1VGRklYRVNbdHJpbW1lZC5zbGljZSgtMSldID8/IDE7XG4gIGNvbnN0IGRpZ2l0cyA9IHRyaW1tZWRcbiAgICAuc3BsaXQoZGVjaW1hbCkubWFwKChwYXJ0KSA9PiBwYXJ0LnJlcGxhY2UoL1teMC05LV0vZywgJycpKS5qb2luKCcuJyk7XG4gIGNvbnN0IG51bWJlciA9IGRpZ2l0cyAmJiBkaWdpdHMgIT09ICctJyAmJiBkaWdpdHMgIT09ICcuJyA/IE51bWJlcihkaWdpdHMpICogbXVsdGlwbGllciA6IE5hTjtcblxuICBpZiAoIU51bWJlci5pc0Zpbml0ZShudW1iZXIpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBpc1BlcmNlbnQgPSAocGxhY2VtZW50Py5mb3JtYXQgPz8gZmllbGQuZm9ybWF0KSA9PT0gR3JpZEZvcm1hdC5QZXJjZW50O1xuXG4gIHJldHVybiBpc1BlcmNlbnQgJiYgY29udGV4dC5mb3JtYXQucmF0aW9QZXJjZW50ID8gbnVtYmVyIC8gMTAwIDogbnVtYmVyO1xufVxuXG5mdW5jdGlvbiBkZWNpbWFsTWFyayhsb2NhbGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBudW1iZXJGb3JtYXQobG9jYWxlLCB7fSkuZm9ybWF0VG9QYXJ0cygxLjUpLmZpbmQoKHBhcnQpID0+IHBhcnQudHlwZSA9PT0gJ2RlY2ltYWwnKT8udmFsdWUgPz8gJy4nO1xufVxuIl19
116
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWdyaWQtZm9ybWF0dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2NvbXBvbmVudHMvY29tcG9uZW50LWdyaWQvcmVwb3J0LWdyaWQtZm9ybWF0dGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDa0IsYUFBYSxFQUFFLFVBQVUsRUFBNEIsU0FBUyxHQUN0RixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRy9GLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBYzlELE1BQU0sYUFBYSxHQUFvRDtJQUNyRSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxNQUFNO0lBQzdDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLGlCQUFpQixDQUFDLE9BQU87SUFDL0MsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsaUJBQWlCLENBQUMsUUFBUTtDQUNsRCxDQUFDO0FBRUYsTUFBTSxZQUFZLEdBQW1EO0lBQ25FLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLGlCQUFpQixDQUFDLElBQUk7SUFDeEMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsU0FBUztJQUNsRCxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxRQUFRO0lBQ2hELENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLGlCQUFpQixDQUFDLElBQUk7Q0FDekMsQ0FBQztBQUVGLGlGQUFpRjtBQUNqRixNQUFNLGFBQWEsR0FBcUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUUzRSxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUM7QUFDbEIsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBRWhCLDBFQUEwRTtBQUMxRSwyRUFBMkU7QUFDM0UsNkVBQTZFO0FBQzdFLDBFQUEwRTtBQUMxRSw2RUFBNkU7QUFDN0Usd0VBQXdFO0FBQ3hFLFdBQVc7QUFDWCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsT0FBZ0M7SUFDbEUsT0FBTztRQUNMLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDO1FBQ3RGLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDO0tBQ3RGLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxlQUFlLENBQ3RCLE9BQWdDLEVBQ2hDLEtBQWMsRUFDZCxLQUFnQixFQUNoQixTQUF5QjtJQUV6QixJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDMUQsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsUUFBUSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbkIsS0FBSyxhQUFhLENBQUMsTUFBTTtZQUN2QixPQUFPLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzVELEtBQUssYUFBYSxDQUFDLElBQUk7WUFDckIsT0FBTyxjQUFjLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDMUQsS0FBSyxhQUFhLENBQUMsUUFBUTtZQUN6QixPQUFPLGdCQUFnQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUUsS0FBSyxhQUFhLENBQUMsT0FBTztZQUN4QixPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDMUI7WUFDRSxPQUFPLFdBQVcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RELENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FDdkIsT0FBZ0MsRUFDaEMsS0FBYyxFQUNkLEtBQWdCLEVBQ2hCLFNBQXlCO0lBRXpCLHVGQUF1RjtJQUN2RixJQUFJLEtBQUssQ0FBQyxVQUFVLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUNoRCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMxQyxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFckYsT0FBTyxNQUFNO1FBQ1gsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJO1FBQzdELENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDaEQsQ0FBQztBQUVELHVFQUF1RTtBQUN2RSw4RUFBOEU7QUFDOUUsMEVBQTBFO0FBQzFFLCtFQUErRTtBQUMvRSw4REFBOEQ7QUFDOUQsU0FBUyxjQUFjLENBQ3JCLE9BQWdDLEVBQ2hDLEtBQWMsRUFDZCxLQUFnQixFQUNoQixTQUF5QjtJQUV6QixNQUFNLFdBQVcsR0FBSSxTQUFnRCxFQUFFLFdBQVcsSUFBSSxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0csTUFBTSxnQkFBZ0IsR0FBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUF3QjtTQUM3RSxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLFdBQVcsQ0FBQyxDQUFDO0lBRTVELE9BQU8sZ0JBQWdCLElBQUksZ0JBQWdCLEtBQUssS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFDaEYsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxvQkFBb0IsQ0FBQyxJQUFJLENBQUM7UUFDbEgsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdkUsQ0FBQztBQUVELDZFQUE2RTtBQUM3RSxvQkFBb0I7QUFDcEIsU0FBUyxVQUFVLENBQUMsS0FBZ0IsRUFBRSxTQUF5QjtJQUM3RCxNQUFNLE1BQU0sR0FBRyxTQUErQyxDQUFDO0lBQy9ELE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUM5QyxNQUFNLFNBQVMsR0FBRyxNQUFNLEVBQUUsU0FBUyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUM7SUFDdkQsTUFBTSxLQUFLLEdBQUcsTUFBTSxFQUFFLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDO0lBRTNDLE9BQU87UUFDTCxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3BELEdBQUcsQ0FBQyxPQUFPLFNBQVMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN2RCxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQ2pELENBQUM7QUFDSixDQUFDO0FBRUQseUVBQXlFO0FBQ3pFLFNBQVMsV0FBVyxDQUFDLFNBQXlCO0lBQzVDLE9BQU8sQ0FBQyxDQUFFLFNBQW1DLEVBQUUsV0FBVyxDQUFDO0FBQzdELENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxLQUFjLEVBQUUsS0FBZ0I7SUFDbkQsT0FBTyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxLQUFLLENBQUMsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDO0FBQzlFLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsNEVBQTRFO0FBQzVFLDBFQUEwRTtBQUMxRSxTQUFTLGNBQWMsQ0FDckIsT0FBZ0MsRUFDaEMsSUFBWSxFQUNaLEtBQWdCLEVBQ2hCLFNBQWtDO0lBRWxDLE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25ELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUMxQyxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pELE1BQU0sTUFBTSxHQUFHLE9BQU87U0FDbkIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBRTlGLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDN0IsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxVQUFVLENBQUMsT0FBTyxDQUFDO0lBRTdFLE9BQU8sU0FBUyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDMUUsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLE1BQWM7SUFDakMsT0FBTyxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLEVBQUUsS0FBSyxJQUFJLEdBQUcsQ0FBQztBQUMzRyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgR3JpZERldGFpbCwgR3JpZEZpZWxkLCBHcmlkRmllbGRUeXBlLCBHcmlkRm9ybWF0LCBHcmlkRm9ybWF0dGVyLCBHcmlkTGV2ZWwsIEdyaWRVbml0cywgR3JpZFZhbHVlLFxufSBmcm9tICdAZmlyZXN0aXRjaC9ncmlkJztcblxuaW1wb3J0IHsgUmVwb3J0Q2hhcnREYXRlTGFiZWwgfSBmcm9tICcuLi8uLi9lbnVtcy9yZXBvcnQtY2hhcnQtZGF0ZS1sYWJlbC5lbnVtJztcbmltcG9ydCB7IFJlcG9ydE51bWJlclVuaXRzIH0gZnJvbSAnLi4vLi4vZW51bXMvcmVwb3J0LW51bWJlci11bml0cy5lbnVtJztcbmltcG9ydCB7IFJlcG9ydFZhbHVlRm9ybWF0IH0gZnJvbSAnLi4vLi4vZW51bXMvcmVwb3J0LXZhbHVlLWZvcm1hdC5lbnVtJztcbmltcG9ydCB7IGZvcm1hdE51bWJlciwgZm9ybWF0T3V0cHV0VmFsdWUsIGZvcm1hdFJlcG9ydERhdGUsIG51bWJlckZvcm1hdCB9IGZyb20gJy4uLy4uL2Zvcm1hdCc7XG5pbXBvcnQgeyBSZXBvcnRHcmlkUmVwb3J0IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9yZXBvcnQtZ3JpZC1yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IENoYXJ0R3JhbnVsYXJpdHksIE51bWJlckZvcm1hdFNwZWMsIFJlcG9ydEZvcm1hdENvbnRleHQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgZm9ybWF0UGVyaW9kTGFiZWwgfSBmcm9tICcuLi8uLi9vcHRpb24tYnVpbGRlcic7XG5pbXBvcnQgeyBHUklEX0dSQU5VTEFSSVRJRVMgfSBmcm9tICcuLi8uLi9yZXBvcnQtZ3JpZC1sYXlvdXQnO1xuXG5cbnR5cGUgR3JpZFBsYWNlbWVudCA9IEdyaWRWYWx1ZSB8IEdyaWREZXRhaWwgfCBHcmlkTGV2ZWw7XG5cbi8vIFdoYXQgYSBncmlkIHRpbGUgaXMgd3JpdHRlbiB3aXRoOiB0aGUgcmVwb3J0J3MgbG9jYWxlLCBjdXJyZW5jeSBhbmRcbi8vIHBlcmNlbnQgZm9ybSwgdGhlIHpvbmUgaXRzIGluc3RhbnRzIHJlYWQgaW4sIGFuZCB0aGUgcmVwb3J0IGxpbmUgb2YgaXRzXG4vLyBsYXRlc3QgcmVhZCAod2hhdCBlYWNoIG91dHB1dCBmaWVsZCBob2xkcykuXG5leHBvcnQgaW50ZXJmYWNlIFJlcG9ydEdyaWRGb3JtYXRDb250ZXh0IHtcbiAgZm9ybWF0OiBSZXBvcnRGb3JtYXRDb250ZXh0O1xuICB0aW1lem9uZTogc3RyaW5nO1xuICByZXBvcnQ6IFJlcG9ydEdyaWRSZXBvcnQgfCBudWxsO1xufVxuXG5jb25zdCBWQUxVRV9GT1JNQVRTOiBSZWFkb25seTxSZWNvcmQ8R3JpZEZvcm1hdCwgUmVwb3J0VmFsdWVGb3JtYXQ+PiA9IHtcbiAgW0dyaWRGb3JtYXQuTnVtYmVyXTogUmVwb3J0VmFsdWVGb3JtYXQuTnVtYmVyLFxuICBbR3JpZEZvcm1hdC5QZXJjZW50XTogUmVwb3J0VmFsdWVGb3JtYXQuUGVyY2VudCxcbiAgW0dyaWRGb3JtYXQuQ3VycmVuY3ldOiBSZXBvcnRWYWx1ZUZvcm1hdC5DdXJyZW5jeSxcbn07XG5cbmNvbnN0IE5VTUJFUl9VTklUUzogUmVhZG9ubHk8UmVjb3JkPEdyaWRVbml0cywgUmVwb3J0TnVtYmVyVW5pdHM+PiA9IHtcbiAgW0dyaWRVbml0cy5Ob25lXTogUmVwb3J0TnVtYmVyVW5pdHMuTm9uZSxcbiAgW0dyaWRVbml0cy5UaG91c2FuZHNdOiBSZXBvcnROdW1iZXJVbml0cy5UaG91c2FuZHMsXG4gIFtHcmlkVW5pdHMuTWlsbGlvbnNdOiBSZXBvcnROdW1iZXJVbml0cy5NaWxsaW9ucyxcbiAgW0dyaWRVbml0cy5BdXRvXTogUmVwb3J0TnVtYmVyVW5pdHMuQXV0byxcbn07XG5cbi8vIFdoYXQgYW4gYWJicmV2aWF0ZWQgbnVtYmVyJ3Mgc3VmZml4IG11bHRpcGxpZXMgaXQgYnksIHdoZW4gYSB2aWV3ZXIgdHlwZXMgb25lLlxuY29uc3QgVU5JVF9TVUZGSVhFUzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgbnVtYmVyPj4gPSB7IGs6IDFlMywgbTogMWU2IH07XG5cbmNvbnN0IFlFUyA9ICdZZXMnO1xuY29uc3QgTk8gPSAnTm8nO1xuXG4vLyBBIGdyaWQgdGlsZSdzIGZvcm1hdHRlcjogZXZlcnkgdmFsdWUgd3JpdHRlbiBhcyB0aGUgcmVwb3J0IHdyaXRlcyBpdCBvblxuLy8gYSBsaXN0IHRvZGF5LiBBbiBvdXRwdXQgbnVtYmVyIHJlYWRzIHRocm91Z2ggZm9ybWF0T3V0cHV0VmFsdWUgd2l0aCB3aGF0XG4vLyB0aGUgcmVwb3J0IGxpbmUgc2F5cyB0aGUgb3V0cHV0IGhvbGRzIChhIGNoYW5nZSBpcyBzaWduZWQsIGEgbWlzc2luZyBwcmlvclxuLy8gcmVhZHMgYXMgdGhlIGxpc3QncyBkYXNoKTsgYSBwbGFpbiBudW1iZXIgdGhyb3VnaCBmb3JtYXROdW1iZXI7IGEga2V5J3Ncbi8vIGRpZ2l0cyBhcyB0aGV5IGFyZTsgYSBkYXRlIGF0IGl0cyBncmFpbiBpbiB0aGUgcmVwb3J0J3MgbG9jYWxlLCBhbiBpbnN0YW50XG4vLyBpbiBpdHMgem9uZS4gVGhlIHBsYWNlbWVudCdzIGZvcm1hdCwgcHJlY2lzaW9uIGFuZCB1bml0cyB3aW4gb3ZlciB0aGVcbi8vIGZpZWxkJ3MuXG5leHBvcnQgZnVuY3Rpb24gcmVwb3J0R3JpZEZvcm1hdHRlcihjb250ZXh0OiBSZXBvcnRHcmlkRm9ybWF0Q29udGV4dCk6IEdyaWRGb3JtYXR0ZXIge1xuICByZXR1cm4ge1xuICAgIGZvcm1hdDogKHZhbHVlLCBmaWVsZCwgcGxhY2VtZW50KSA9PiBmb3JtYXRHcmlkVmFsdWUoY29udGV4dCwgdmFsdWUsIGZpZWxkLCBwbGFjZW1lbnQpLFxuICAgIHRvTnVtYmVyOiAodGV4dCwgZmllbGQsIHBsYWNlbWVudCkgPT4gcmVhZEdyaWROdW1iZXIoY29udGV4dCwgdGV4dCwgZmllbGQsIHBsYWNlbWVudCksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEdyaWRWYWx1ZShcbiAgY29udGV4dDogUmVwb3J0R3JpZEZvcm1hdENvbnRleHQsXG4gIHZhbHVlOiB1bmtub3duLFxuICBmaWVsZDogR3JpZEZpZWxkLFxuICBwbGFjZW1lbnQ/OiBHcmlkUGxhY2VtZW50LFxuKTogc3RyaW5nIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09ICcnKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgc3dpdGNoIChmaWVsZC50eXBlKSB7XG4gICAgY2FzZSBHcmlkRmllbGRUeXBlLk51bWJlcjpcbiAgICAgIHJldHVybiBmb3JtYXRHcmlkTnVtYmVyKGNvbnRleHQsIHZhbHVlLCBmaWVsZCwgcGxhY2VtZW50KTtcbiAgICBjYXNlIEdyaWRGaWVsZFR5cGUuRGF0ZTpcbiAgICAgIHJldHVybiBmb3JtYXRHcmlkRGF0ZShjb250ZXh0LCB2YWx1ZSwgZmllbGQsIHBsYWNlbWVudCk7XG4gICAgY2FzZSBHcmlkRmllbGRUeXBlLkRhdGV0aW1lOlxuICAgICAgcmV0dXJuIGZvcm1hdFJlcG9ydERhdGUodmFsdWUsIGNvbnRleHQudGltZXpvbmUsIGNvbnRleHQuZm9ybWF0LmxvY2FsZSk7XG4gICAgY2FzZSBHcmlkRmllbGRUeXBlLkJvb2xlYW46XG4gICAgICByZXR1cm4gdmFsdWUgPyBZRVMgOiBOTztcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIG9wdGlvbkxhYmVsKHZhbHVlLCBmaWVsZCkgPz8gU3RyaW5nKHZhbHVlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JtYXRHcmlkTnVtYmVyKFxuICBjb250ZXh0OiBSZXBvcnRHcmlkRm9ybWF0Q29udGV4dCxcbiAgdmFsdWU6IHVua25vd24sXG4gIGZpZWxkOiBHcmlkRmllbGQsXG4gIHBsYWNlbWVudD86IEdyaWRQbGFjZW1lbnQsXG4pOiBzdHJpbmcge1xuICAvLyBBIGtleSwgc3VjaCBhcyBhIGNsaWVudCdzIGlkLCBpcyBhIG5hbWU6IGl0cyBkaWdpdHMgcHJpbnQgYXMgdGhleSBhcmUsIG5ldmVyIGdyb3VwZWRcbiAgaWYgKGZpZWxkLmlkZW50aWZpZXIgJiYgIWlzQWdncmVnYXRlKHBsYWNlbWVudCkpIHtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxuXG4gIGNvbnN0IHNwZWMgPSBudW1iZXJTcGVjKGZpZWxkLCBwbGFjZW1lbnQpO1xuICBjb25zdCBvdXRwdXQgPSBpc0FnZ3JlZ2F0ZShwbGFjZW1lbnQpID8gbnVsbCA6IGNvbnRleHQucmVwb3J0Py5vdXRwdXRzPy5bZmllbGQubmFtZV07XG5cbiAgcmV0dXJuIG91dHB1dFxuICAgID8gZm9ybWF0T3V0cHV0VmFsdWUodmFsdWUsIG91dHB1dCwgc3BlYywgY29udGV4dC5mb3JtYXQpLnRleHRcbiAgICA6IGZvcm1hdE51bWJlcih2YWx1ZSwgc3BlYywgY29udGV4dC5mb3JtYXQpO1xufVxuXG4vLyBBIGNhbGVuZGFyIGRhdGUgYXQgdGhlIGdyYWluIGl0IHByaW50cyBhdDogdGhlIHBsYWNlbWVudCdzLCBlbHNlIHRoZVxuLy8gZmllbGQncyBvd24sIHdoaWNoIG9uIGEgdGltZSBheGlzIGlzIHRoZSByZXBvcnQncyBncm91cC1ieS4gQSBxdWFydGVyIHJlYWRzXG4vLyBcIlEzIDIwMjNcIiwgYSBtb250aCBcIkp1bCAyMDIzXCIgYW5kIGEgeWVhciBcIjIwMjNcIiwgYXMgdGhlIHJlcG9ydCdzIGNoYXJ0c1xuLy8gbGFiZWwgdGhlbSwgcmF0aGVyIHRoYW4gYXMgdGhlaXIgZmlyc3QgZGF5OyBhIHdlZWssIGxpa2UgYSBjaGFydCdzLCByZWFkcyBhc1xuLy8gdGhlIGRheSBpdCBzdGFydHMuIEEgZGF5IHJlYWRzIGFzIHRoZSByZXBvcnQgd3JpdGVzIGEgZGF0ZS5cbmZ1bmN0aW9uIGZvcm1hdEdyaWREYXRlKFxuICBjb250ZXh0OiBSZXBvcnRHcmlkRm9ybWF0Q29udGV4dCxcbiAgdmFsdWU6IHVua25vd24sXG4gIGZpZWxkOiBHcmlkRmllbGQsXG4gIHBsYWNlbWVudD86IEdyaWRQbGFjZW1lbnQsXG4pOiBzdHJpbmcge1xuICBjb25zdCBncmFudWxhcml0eSA9IChwbGFjZW1lbnQgYXMgR3JpZERldGFpbCB8IEdyaWRMZXZlbCB8IHVuZGVmaW5lZCk/LmdyYW51bGFyaXR5ID8/IGZpZWxkLmdyYW51bGFyaXRpZXM/LlswXTtcbiAgY29uc3QgY2hhcnRHcmFudWxhcml0eSA9IChPYmplY3Qua2V5cyhHUklEX0dSQU5VTEFSSVRJRVMpIGFzIENoYXJ0R3JhbnVsYXJpdHlbXSlcbiAgICAuZmluZCgobmFtZSkgPT4gR1JJRF9HUkFOVUxBUklUSUVTW25hbWVdID09PSBncmFudWxhcml0eSk7XG5cbiAgcmV0dXJuIGNoYXJ0R3JhbnVsYXJpdHkgJiYgY2hhcnRHcmFudWxhcml0eSAhPT0gJ2RheScgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJ1xuICAgID8gZm9ybWF0UGVyaW9kTGFiZWwodmFsdWUuc2xpY2UoMCwgMTApLCBjaGFydEdyYW51bGFyaXR5LCBmYWxzZSwgY29udGV4dC5mb3JtYXQubG9jYWxlLCBSZXBvcnRDaGFydERhdGVMYWJlbC5Mb25nKVxuICAgIDogZm9ybWF0UmVwb3J0RGF0ZSh2YWx1ZSwgY29udGV4dC50aW1lem9uZSwgY29udGV4dC5mb3JtYXQubG9jYWxlKTtcbn1cblxuLy8gVGhlIGZvcm1hdCwgcHJlY2lzaW9uIGFuZCB1bml0cyBhIG51bWJlciBpcyB3cml0dGVuIHdpdGg6IHRoZSBwbGFjZW1lbnQncyxcbi8vIGVsc2UgdGhlIGZpZWxkJ3MuXG5mdW5jdGlvbiBudW1iZXJTcGVjKGZpZWxkOiBHcmlkRmllbGQsIHBsYWNlbWVudD86IEdyaWRQbGFjZW1lbnQpOiBOdW1iZXJGb3JtYXRTcGVjIHtcbiAgY29uc3QgcGxhY2VkID0gcGxhY2VtZW50IGFzIEdyaWRWYWx1ZSB8IEdyaWREZXRhaWwgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGZvcm1hdCA9IHBsYWNlZD8uZm9ybWF0ID8/IGZpZWxkLmZvcm1hdDtcbiAgY29uc3QgcHJlY2lzaW9uID0gcGxhY2VkPy5wcmVjaXNpb24gPz8gZmllbGQucHJlY2lzaW9uO1xuICBjb25zdCB1bml0cyA9IHBsYWNlZD8udW5pdHMgPz8gZmllbGQudW5pdHM7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi4oZm9ybWF0ID8geyBmb3JtYXQ6IFZBTFVFX0ZPUk1BVFNbZm9ybWF0XSB9IDoge30pLFxuICAgIC4uLih0eXBlb2YgcHJlY2lzaW9uID09PSAnbnVtYmVyJyA/IHsgcHJlY2lzaW9uIH0gOiB7fSksXG4gICAgLi4uKHVuaXRzID8geyB1bml0czogTlVNQkVSX1VOSVRTW3VuaXRzXSB9IDoge30pLFxuICB9O1xufVxuXG4vLyBBIHZhbHVlIHBsYWNlbWVudCBpcyBhbiBhZ2dyZWdhdGUgb2YgdGhlIGZpZWxkLCBub3QgdGhlIG91dHB1dCBpdHNlbGYuXG5mdW5jdGlvbiBpc0FnZ3JlZ2F0ZShwbGFjZW1lbnQ/OiBHcmlkUGxhY2VtZW50KTogYm9vbGVhbiB7XG4gIHJldHVybiAhIShwbGFjZW1lbnQgYXMgR3JpZFZhbHVlIHwgdW5kZWZpbmVkKT8uYWdncmVnYXRpb247XG59XG5cbmZ1bmN0aW9uIG9wdGlvbkxhYmVsKHZhbHVlOiB1bmtub3duLCBmaWVsZDogR3JpZEZpZWxkKTogc3RyaW5nIHwgbnVsbCB7XG4gIHJldHVybiBmaWVsZC5vcHRpb25zPy5maW5kKChvcHRpb24pID0+IG9wdGlvbi5rZXkgPT09IHZhbHVlKT8ubGFiZWwgPz8gbnVsbDtcbn1cblxuLy8gQSBudW1iZXIgYSB2aWV3ZXIgdHlwZWQsIHJlYWQgaW4gdGhlIHJlcG9ydCdzIGxvY2FsZTogaXRzIGdyb3VwaW5nIGRyb3BwZWQsXG4vLyBpdHMgZGVjaW1hbCBtYXJrIHJlYWQsIGEgSyBvciBNIHN1ZmZpeCBtdWx0aXBsaWVkIG91dCwgYW5kIGEgcGVyY2VudCBvZiBhXG4vLyByYXRpby1wZXJjZW50IHJlcG9ydCByZWFkIGJhY2sgdG8gaXRzIHJhdGlvLiBudWxsIHdoZW4gaXQgaXMgbm8gbnVtYmVyLlxuZnVuY3Rpb24gcmVhZEdyaWROdW1iZXIoXG4gIGNvbnRleHQ6IFJlcG9ydEdyaWRGb3JtYXRDb250ZXh0LFxuICB0ZXh0OiBzdHJpbmcsXG4gIGZpZWxkOiBHcmlkRmllbGQsXG4gIHBsYWNlbWVudD86IEdyaWRWYWx1ZSB8IEdyaWREZXRhaWwsXG4pOiBudW1iZXIgfCBudWxsIHtcbiAgY29uc3QgZGVjaW1hbCA9IGRlY2ltYWxNYXJrKGNvbnRleHQuZm9ybWF0LmxvY2FsZSk7XG4gIGNvbnN0IHRyaW1tZWQgPSB0ZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBtdWx0aXBsaWVyID0gVU5JVF9TVUZGSVhFU1t0cmltbWVkLnNsaWNlKC0xKV0gPz8gMTtcbiAgY29uc3QgZGlnaXRzID0gdHJpbW1lZFxuICAgIC5zcGxpdChkZWNpbWFsKS5tYXAoKHBhcnQpID0+IHBhcnQucmVwbGFjZSgvW14wLTktXS9nLCAnJykpLmpvaW4oJy4nKTtcbiAgY29uc3QgbnVtYmVyID0gZGlnaXRzICYmIGRpZ2l0cyAhPT0gJy0nICYmIGRpZ2l0cyAhPT0gJy4nID8gTnVtYmVyKGRpZ2l0cykgKiBtdWx0aXBsaWVyIDogTmFOO1xuXG4gIGlmICghTnVtYmVyLmlzRmluaXRlKG51bWJlcikpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGlzUGVyY2VudCA9IChwbGFjZW1lbnQ/LmZvcm1hdCA/PyBmaWVsZC5mb3JtYXQpID09PSBHcmlkRm9ybWF0LlBlcmNlbnQ7XG5cbiAgcmV0dXJuIGlzUGVyY2VudCAmJiBjb250ZXh0LmZvcm1hdC5yYXRpb1BlcmNlbnQgPyBudW1iZXIgLyAxMDAgOiBudW1iZXI7XG59XG5cbmZ1bmN0aW9uIGRlY2ltYWxNYXJrKGxvY2FsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIG51bWJlckZvcm1hdChsb2NhbGUsIHt9KS5mb3JtYXRUb1BhcnRzKDEuNSkuZmluZCgocGFydCkgPT4gcGFydC50eXBlID09PSAnZGVjaW1hbCcpPy52YWx1ZSA/PyAnLic7XG59XG4iXX0=
@@ -2,7 +2,7 @@
2
2
  // readGridTable() reads (GridTable) as heading rows, body rows and a total
3
3
  // row of plain cells, and the lines its notes add. Pure, so both renderers
4
4
  // draw one table one way.
5
- import { GridRowKind } from '@firestitch/grid';
5
+ import { GridRowKind, headingLabel } from '@firestitch/grid';
6
6
  import { gridFilterLineText } from './report-filter-lines';
7
7
  // The most pivot columns a file draws, from the first.
8
8
  export const GRID_EXPORT_COLUMNS = 60;
@@ -27,11 +27,12 @@ export function gridExportTable(table) {
27
27
  };
28
28
  }
29
29
  // The lines a table adds under its box: the screen's notes, the pivot
30
- // columns it leaves out, and each column filter of the layout it was read in.
30
+ // columns it leaves out, and each column filter of the layout it was read in,
31
+ // its field named as its column is headed.
31
32
  export function gridExportNotes(table, layout, locale) {
32
33
  const fields = new Map(table.fields.map((field) => [field.name, field]));
33
34
  const filters = (layout.filters ?? [])
34
- .map((filter) => gridFilterLineText(fields.get(filter.field)?.label ?? filter.field, filter, fields.get(filter.field), locale))
35
+ .map((filter) => gridFilterLineText(headingLabel(table.fields, layout, filter.field), filter, fields.get(filter.field), locale))
35
36
  .filter((text) => !!text);
36
37
  return [
37
38
  ...table.notes,
@@ -45,4 +46,4 @@ function headingText(heading) {
45
46
  function exportCell(text, bold, indent, numeric, colSpan = 1, rowSpan = 1) {
46
47
  return { text, colSpan, rowSpan, bold, indent, numeric };
47
48
  }
48
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWdyaWQtZXhwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2V4cG9ydC9yZXBvcnQtZ3JpZC1leHBvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0VBQWtFO0FBQ2xFLDJFQUEyRTtBQUMzRSwyRUFBMkU7QUFDM0UsMEJBQTBCO0FBQzFCLE9BQU8sRUFBYyxXQUFXLEVBQStCLE1BQU0sa0JBQWtCLENBQUM7QUFJeEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHM0QsdURBQXVEO0FBQ3ZELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztBQXlCdEMsNEVBQTRFO0FBQzVFLG1EQUFtRDtBQUNuRCxNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQWdCO0lBQzlDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUQsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRO1NBQzNGLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUM7U0FDeEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO1NBQ25DLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FB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LFVBQVUsQ0FBQyxJQUFZLEVBQUUsSUFBYSxFQUFFLE1BQWMsRUFBRSxPQUFnQixFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsT0FBTyxHQUFHLENBQUM7SUFDekcsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDM0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEEgdGFibGUgdGlsZSBhcyB0aGUgUERGIGFuZCB0aGUgZGVjayBkcmF3IGl0OiB0aGUgcHJpbnRlZCB0YWJsZVxuLy8gcmVhZEdyaWRUYWJsZSgpIHJlYWRzIChHcmlkVGFibGUpIGFzIGhlYWRpbmcgcm93cywgYm9keSByb3dzIGFuZCBhIHRvdGFsXG4vLyByb3cgb2YgcGxhaW4gY2VsbHMsIGFuZCB0aGUgbGluZXMgaXRzIG5vdGVzIGFkZC4gUHVyZSwgc28gYm90aCByZW5kZXJlcnNcbi8vIGRyYXcgb25lIHRhYmxlIG9uZSB3YXkuXG5pbXBvcnQgeyBHcmlkTGF5b3V0LCBHcmlkUm93S2luZCwgR3JpZFRhYmxlLCBHcmlkVGFibGVIZWFkaW5nIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZ3JpZCc7XG5cbmltcG9ydCB7IFJlcG9ydEZvcm1hdENvbnRleHQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuXG5pbXBvcnQgeyBncmlkRmlsdGVyTGluZVRleHQgfSBmcm9tICcuL3JlcG9ydC1maWx0ZXItbGluZXMnO1xuXG5cbi8vIFRoZSBtb3N0IHBpdm90IGNvbHVtbnMgYSBmaWxlIGRyYXdzLCBmcm9tIHRoZSBmaXJzdC5cbmV4cG9ydCBjb25zdCBHUklEX0VYUE9SVF9DT0xVTU5TID0gNjA7XG5cbi8vIE9uZSBjZWxsIG9mIGFuIGV4cG9ydGVkIHRhYmxlLiBBIGhlYWRpbmcgY2VsbCBzcGFucyB3aGF0IHRoZSBzY3JlZW4nc1xuLy8gaGVhZGVyIHNwYW5zOyBhIGdyb3VwLCB0b3RhbCBvciBlbXBoYXNpemVkIChzdWJ0b3RhbCwgdG90YWwpIGNlbGwgaXMgYm9sZDtcbi8vIGEgZ3JvdXAncyBsYWJlbCBzdGVwcyBpbiBieSBpdHMgZGVwdGguXG5leHBvcnQgaW50ZXJmYWNlIEdyaWRFeHBvcnRDZWxsIHtcbiAgdGV4dDogc3RyaW5nO1xuICBjb2xTcGFuOiBudW1iZXI7XG4gIHJvd1NwYW46IG51bWJlcjtcbiAgYm9sZDogYm9vbGVhbjtcbiAgaW5kZW50OiBudW1iZXI7XG4gIG51bWVyaWM6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3JpZEV4cG9ydFRhYmxlIHtcbiAgLy8gSGVhZGluZyByb3dzIHRvcCBmaXJzdCwgZWFjaCBob2xkaW5nIG9ubHkgdGhlIGNlbGxzIHRoYXQgc3RhcnQgb24gaXRcbiAgaGVhZDogR3JpZEV4cG9ydENlbGxbXVtdO1xuICBib2R5OiBHcmlkRXhwb3J0Q2VsbFtdW107XG4gIGZvb3Q6IEdyaWRFeHBvcnRDZWxsW10gfCBudWxsO1xuICAvLyBPbmUgcGVyIHRhYmxlIGNvbHVtbjogaXQgaG9sZHMgZm9ybWF0dGVkIG51bWJlcnMsIHJpZ2h0LWFsaWduZWRcbiAgbnVtZXJpYzogYm9vbGVhbltdO1xuICAvLyBMaW5lcyBwYXN0IHRoZSByb3cgY2FwLCB3aGljaCB0aGUgbW9yZVJvd3NOb3RpY2Ugcm93IGNvdW50c1xuICBtb3JlUm93czogbnVtYmVyO1xufVxuXG4vLyBUaGUgdGFibGUncyBoZWFkaW5nLCBib2R5IGFuZCB0b3RhbCByb3cgYXMgY2VsbHMuIEEgZ3JvdXAncyBsYWJlbCBjYXJyaWVzXG4vLyBpdHMgcm93IGNvdW50IGFmdGVyIGl0LCBhcyB0aGUgc2NyZWVuIHdyaXRlcyBpdC5cbmV4cG9ydCBmdW5jdGlvbiBncmlkRXhwb3J0VGFibGUodGFibGU6IEdyaWRUYWJsZSk6IEdyaWRFeHBvcnRUYWJsZSB7XG4gIGNvbnN0IG51bWVyaWMgPSB0YWJsZS5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubnVtZXJpYyk7XG4gIGNvbnN0IGhlYWQgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBNYXRoLm1heCgxLCB0YWJsZS5oZWFkaW5nUm93cykgfSwgKF8sIHJvdykgPT4gdGFibGUuaGVhZGluZ3NcbiAgICAuZmlsdGVyKChoZWFkaW5nKSA9PiBoZWFkaW5nLnJvdyA9PT0gcm93KVxuICAgIC5zb3J0KChhLCBiKSA9PiBhLmNvbHVtbiAtIGIuY29sdW1uKVxuICAgIC5tYXAoKGhlYWRpbmcpID0+IGV4cG9ydENlbGwoaGVhZGluZ1RleHQoaGVhZGluZyksIHRydWUsIDAsIGhlYWRpbmcubnVtZXJpYywgaGVhZGluZy5jb2x1bW5TcGFuLCBoZWFkaW5nLnJvd1NwYW4pKSk7XG4gIGNvbnN0IGxpbmUgPSAocm93OiBHcmlkVGFibGVbJ3Jvd3MnXVtudW1iZXJdKSA9PiByb3cuY2VsbHMubWFwKChjZWxsLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGlzTGFiZWwgPSBpbmRleCA9PT0gMCAmJiB0YWJsZS5ncm91cENvbHVtbjtcblxuICAgIHJldHVybiBleHBvcnRDZWxsKFxuICAgICAgaXNMYWJlbCAmJiByb3cuY291bnQgPyBgJHtjZWxsLnRleHR9ICgke3Jvdy5jb3VudH0pYCA6IGNlbGwudGV4dCxcbiAgICAgIHJvdy5raW5kICE9PSBHcmlkUm93S2luZC5EZXRhaWwgfHwgISF0YWJsZS5jb2x1bW5zW2luZGV4XT8uZW1waGFzaXMsXG4gICAgICBpc0xhYmVsID8gcm93LmRlcHRoIDogMCxcbiAgICAgIG51bWVyaWNbaW5kZXhdID8/IGZhbHNlLFxuICAgICk7XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgaGVhZCxcbiAgICBib2R5OiB0YWJsZS5yb3dzLm1hcChsaW5lKSxcbiAgICBmb290OiB0YWJsZS50b3RhbFJvdyA/IGxpbmUodGFibGUudG90YWxSb3cpIDogbnVsbCxcbiAgICBudW1lcmljLFxuICAgIG1vcmVSb3dzOiB0YWJsZS5tb3JlUm93cyxcbiAgfTtcbn1cblxuLy8gVGhlIGxpbmVzIGEgdGFibGUgYWRkcyB1bmRlciBpdHMgYm94OiB0aGUgc2NyZWVuJ3Mgbm90ZXMsIHRoZSBwaXZvdFxuLy8gY29sdW1ucyBpdCBsZWF2ZXMgb3V0LCBhbmQgZWFjaCBjb2x1bW4gZmlsdGVyIG9mIHRoZSBsYXlvdXQgaXQgd2FzIHJlYWQgaW4uXG5leHBvcnQgZnVuY3Rpb24gZ3JpZEV4cG9ydE5vdGVzKHRhYmxlOiBHcmlkVGFibGUsIGxheW91dDogR3JpZExheW91dCwgbG9jYWxlOiBSZXBvcnRGb3JtYXRDb250ZXh0Wydsb2NhbGUnXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZmllbGRzID0gbmV3IE1hcCh0YWJsZS5maWVsZHMubWFwKChmaWVsZCkgPT4gW2ZpZWxkLm5hbWUsIGZpZWxkXSkpO1xuICBjb25zdCBmaWx0ZXJzID0gKGxheW91dC5maWx0ZXJzID8/IFtdKVxuICAgIC5tYXAoKGZpbHRlcikgPT4gZ3JpZEZpbHRlckxpbmVUZXh0KGZpZWxkcy5nZXQoZmlsdGVyLmZpZWxkKT8ubGFiZWwgPz8gZmlsdGVyLmZpZWxkLCBmaWx0ZXIsIGZpZWxkcy5nZXQoZmlsdGVyLmZpZWxkKSwgbG9jYWxlKSlcbiAgICAuZmlsdGVyKCh0ZXh0KTogdGV4dCBpcyBzdHJpbmcgPT4gISF0ZXh0KTtcblxuICByZXR1cm4gW1xuICAgIC4uLnRhYmxlLm5vdGVzLFxuICAgIC4uLih0YWJsZS5zaG93bkNvbHVtbnMgPCB0YWJsZS5jb2x1bW5Db3VudCA/IFtgU2hvd2luZyB0aGUgZmlyc3QgJHt0YWJsZS5zaG93bkNvbHVtbnN9IG9mICR7dGFibGUuY29sdW1uQ291bnR9IGNvbHVtbnNgXSA6IFtdKSxcbiAgICAuLi5maWx0ZXJzLFxuICBdO1xufVxuXG5mdW5jdGlvbiBoZWFkaW5nVGV4dChoZWFkaW5nOiBHcmlkVGFibGVIZWFkaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGhlYWRpbmcuaGludCA/IGAke2hlYWRpbmcubGFiZWx9ICgke2hlYWRpbmcuaGludH0pYCA6IGhlYWRpbmcubGFiZWw7XG59XG5cbmZ1bmN0aW9uIGV4cG9ydENlbGwodGV4dDogc3RyaW5nLCBib2xkOiBib29sZWFuLCBpbmRlbnQ6IG51bWJlciwgbnVtZXJpYzogYm9vbGVhbiwgY29sU3BhbiA9IDEsIHJvd1NwYW4gPSAxKTogR3JpZEV4cG9ydENlbGwge1xuICByZXR1cm4geyB0ZXh0LCBjb2xTcGFuLCByb3dTcGFuLCBib2xkLCBpbmRlbnQsIG51bWVyaWMgfTtcbn1cbiJdfQ==
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWdyaWQtZXhwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2V4cG9ydC9yZXBvcnQtZ3JpZC1leHBvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0VBQWtFO0FBQ2xFLDJFQUEyRTtBQUMzRSwyRUFBMkU7QUFDM0UsMEJBQTBCO0FBQzFCLE9BQU8sRUFBYyxXQUFXLEVBQStCLFlBQVksRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBSXRHLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRzNELHVEQUF1RDtBQUN2RCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLENBQUM7QUF5QnRDLDRFQUE0RTtBQUM1RSxtREFBbUQ7QUFDbkQsTUFBTSxVQUFVLGVBQWUsQ0FBQyxLQUFnQjtJQUM5QyxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUTtTQUMzRixNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDO1NBQ3hDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztTQUNuQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FB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QUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsSUFBWSxFQUFFLElBQWEsRUFBRSxNQUFjLEVBQUUsT0FBZ0IsRUFBRSxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sR0FBRyxDQUFDO0lBQ3pHLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQzNELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBIHRhYmxlIHRpbGUgYXMgdGhlIFBERiBhbmQgdGhlIGRlY2sgZHJhdyBpdDogdGhlIHByaW50ZWQgdGFibGVcbi8vIHJlYWRHcmlkVGFibGUoKSByZWFkcyAoR3JpZFRhYmxlKSBhcyBoZWFkaW5nIHJvd3MsIGJvZHkgcm93cyBhbmQgYSB0b3RhbFxuLy8gcm93IG9mIHBsYWluIGNlbGxzLCBhbmQgdGhlIGxpbmVzIGl0cyBub3RlcyBhZGQuIFB1cmUsIHNvIGJvdGggcmVuZGVyZXJzXG4vLyBkcmF3IG9uZSB0YWJsZSBvbmUgd2F5LlxuaW1wb3J0IHsgR3JpZExheW91dCwgR3JpZFJvd0tpbmQsIEdyaWRUYWJsZSwgR3JpZFRhYmxlSGVhZGluZywgaGVhZGluZ0xhYmVsIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZ3JpZCc7XG5cbmltcG9ydCB7IFJlcG9ydEZvcm1hdENvbnRleHQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuXG5pbXBvcnQgeyBncmlkRmlsdGVyTGluZVRleHQgfSBmcm9tICcuL3JlcG9ydC1maWx0ZXItbGluZXMnO1xuXG5cbi8vIFRoZSBtb3N0IHBpdm90IGNvbHVtbnMgYSBmaWxlIGRyYXdzLCBmcm9tIHRoZSBmaXJzdC5cbmV4cG9ydCBjb25zdCBHUklEX0VYUE9SVF9DT0xVTU5TID0gNjA7XG5cbi8vIE9uZSBjZWxsIG9mIGFuIGV4cG9ydGVkIHRhYmxlLiBBIGhlYWRpbmcgY2VsbCBzcGFucyB3aGF0IHRoZSBzY3JlZW4nc1xuLy8gaGVhZGVyIHNwYW5zOyBhIGdyb3VwLCB0b3RhbCBvciBlbXBoYXNpemVkIChzdWJ0b3RhbCwgdG90YWwpIGNlbGwgaXMgYm9sZDtcbi8vIGEgZ3JvdXAncyBsYWJlbCBzdGVwcyBpbiBieSBpdHMgZGVwdGguXG5leHBvcnQgaW50ZXJmYWNlIEdyaWRFeHBvcnRDZWxsIHtcbiAgdGV4dDogc3RyaW5nO1xuICBjb2xTcGFuOiBudW1iZXI7XG4gIHJvd1NwYW46IG51bWJlcjtcbiAgYm9sZDogYm9vbGVhbjtcbiAgaW5kZW50OiBudW1iZXI7XG4gIG51bWVyaWM6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3JpZEV4cG9ydFRhYmxlIHtcbiAgLy8gSGVhZGluZyByb3dzIHRvcCBmaXJzdCwgZWFjaCBob2xkaW5nIG9ubHkgdGhlIGNlbGxzIHRoYXQgc3RhcnQgb24gaXRcbiAgaGVhZDogR3JpZEV4cG9ydENlbGxbXVtdO1xuICBib2R5OiBHcmlkRXhwb3J0Q2VsbFtdW107XG4gIGZvb3Q6IEdyaWRFeHBvcnRDZWxsW10gfCBudWxsO1xuICAvLyBPbmUgcGVyIHRhYmxlIGNvbHVtbjogaXQgaG9sZHMgZm9ybWF0dGVkIG51bWJlcnMsIHJpZ2h0LWFsaWduZWRcbiAgbnVtZXJpYzogYm9vbGVhbltdO1xuICAvLyBMaW5lcyBwYXN0IHRoZSByb3cgY2FwLCB3aGljaCB0aGUgbW9yZVJvd3NOb3RpY2Ugcm93IGNvdW50c1xuICBtb3JlUm93czogbnVtYmVyO1xufVxuXG4vLyBUaGUgdGFibGUncyBoZWFkaW5nLCBib2R5IGFuZCB0b3RhbCByb3cgYXMgY2VsbHMuIEEgZ3JvdXAncyBsYWJlbCBjYXJyaWVzXG4vLyBpdHMgcm93IGNvdW50IGFmdGVyIGl0LCBhcyB0aGUgc2NyZWVuIHdyaXRlcyBpdC5cbmV4cG9ydCBmdW5jdGlvbiBncmlkRXhwb3J0VGFibGUodGFibGU6IEdyaWRUYWJsZSk6IEdyaWRFeHBvcnRUYWJsZSB7XG4gIGNvbnN0IG51bWVyaWMgPSB0YWJsZS5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubnVtZXJpYyk7XG4gIGNvbnN0IGhlYWQgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBNYXRoLm1heCgxLCB0YWJsZS5oZWFkaW5nUm93cykgfSwgKF8sIHJvdykgPT4gdGFibGUuaGVhZGluZ3NcbiAgICAuZmlsdGVyKChoZWFkaW5nKSA9PiBoZWFkaW5nLnJvdyA9PT0gcm93KVxuICAgIC5zb3J0KChhLCBiKSA9PiBhLmNvbHVtbiAtIGIuY29sdW1uKVxuICAgIC5tYXAoKGhlYWRpbmcpID0+IGV4cG9ydENlbGwoaGVhZGluZ1RleHQoaGVhZGluZyksIHRydWUsIDAsIGhlYWRpbmcubnVtZXJpYywgaGVhZGluZy5jb2x1bW5TcGFuLCBoZWFkaW5nLnJvd1NwYW4pKSk7XG4gIGNvbnN0IGxpbmUgPSAocm93OiBHcmlkVGFibGVbJ3Jvd3MnXVtudW1iZXJdKSA9PiByb3cuY2VsbHMubWFwKChjZWxsLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGlzTGFiZWwgPSBpbmRleCA9PT0gMCAmJiB0YWJsZS5ncm91cENvbHVtbjtcblxuICAgIHJldHVybiBleHBvcnRDZWxsKFxuICAgICAgaXNMYWJlbCAmJiByb3cuY291bnQgPyBgJHtjZWxsLnRleHR9ICgke3Jvdy5jb3VudH0pYCA6IGNlbGwudGV4dCxcbiAgICAgIHJvdy5raW5kICE9PSBHcmlkUm93S2luZC5EZXRhaWwgfHwgISF0YWJsZS5jb2x1bW5zW2luZGV4XT8uZW1waGFzaXMsXG4gICAgICBpc0xhYmVsID8gcm93LmRlcHRoIDogMCxcbiAgICAgIG51bWVyaWNbaW5kZXhdID8/IGZhbHNlLFxuICAgICk7XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgaGVhZCxcbiAgICBib2R5OiB0YWJsZS5yb3dzLm1hcChsaW5lKSxcbiAgICBmb290OiB0YWJsZS50b3RhbFJvdyA/IGxpbmUodGFibGUudG90YWxSb3cpIDogbnVsbCxcbiAgICBudW1lcmljLFxuICAgIG1vcmVSb3dzOiB0YWJsZS5tb3JlUm93cyxcbiAgfTtcbn1cblxuLy8gVGhlIGxpbmVzIGEgdGFibGUgYWRkcyB1bmRlciBpdHMgYm94OiB0aGUgc2NyZWVuJ3Mgbm90ZXMsIHRoZSBwaXZvdFxuLy8gY29sdW1ucyBpdCBsZWF2ZXMgb3V0LCBhbmQgZWFjaCBjb2x1bW4gZmlsdGVyIG9mIHRoZSBsYXlvdXQgaXQgd2FzIHJlYWQgaW4sXG4vLyBpdHMgZmllbGQgbmFtZWQgYXMgaXRzIGNvbHVtbiBpcyBoZWFkZWQuXG5leHBvcnQgZnVuY3Rpb24gZ3JpZEV4cG9ydE5vdGVzKHRhYmxlOiBHcmlkVGFibGUsIGxheW91dDogR3JpZExheW91dCwgbG9jYWxlOiBSZXBvcnRGb3JtYXRDb250ZXh0Wydsb2NhbGUnXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZmllbGRzID0gbmV3IE1hcCh0YWJsZS5maWVsZHMubWFwKChmaWVsZCkgPT4gW2ZpZWxkLm5hbWUsIGZpZWxkXSkpO1xuICBjb25zdCBmaWx0ZXJzID0gKGxheW91dC5maWx0ZXJzID8/IFtdKVxuICAgIC5tYXAoKGZpbHRlcikgPT4gZ3JpZEZpbHRlckxpbmVUZXh0KGhlYWRpbmdMYWJlbCh0YWJsZS5maWVsZHMsIGxheW91dCwgZmlsdGVyLmZpZWxkKSwgZmlsdGVyLCBmaWVsZHMuZ2V0KGZpbHRlci5maWVsZCksIGxvY2FsZSkpXG4gICAgLmZpbHRlcigodGV4dCk6IHRleHQgaXMgc3RyaW5nID0+ICEhdGV4dCk7XG5cbiAgcmV0dXJuIFtcbiAgICAuLi50YWJsZS5ub3RlcyxcbiAgICAuLi4odGFibGUuc2hvd25Db2x1bW5zIDwgdGFibGUuY29sdW1uQ291bnQgPyBbYFNob3dpbmcgdGhlIGZpcnN0ICR7dGFibGUuc2hvd25Db2x1bW5zfSBvZiAke3RhYmxlLmNvbHVtbkNvdW50fSBjb2x1bW5zYF0gOiBbXSksXG4gICAgLi4uZmlsdGVycyxcbiAgXTtcbn1cblxuZnVuY3Rpb24gaGVhZGluZ1RleHQoaGVhZGluZzogR3JpZFRhYmxlSGVhZGluZyk6IHN0cmluZyB7XG4gIHJldHVybiBoZWFkaW5nLmhpbnQgPyBgJHtoZWFkaW5nLmxhYmVsfSAoJHtoZWFkaW5nLmhpbnR9KWAgOiBoZWFkaW5nLmxhYmVsO1xufVxuXG5mdW5jdGlvbiBleHBvcnRDZWxsKHRleHQ6IHN0cmluZywgYm9sZDogYm9vbGVhbiwgaW5kZW50OiBudW1iZXIsIG51bWVyaWM6IGJvb2xlYW4sIGNvbFNwYW4gPSAxLCByb3dTcGFuID0gMSk6IEdyaWRFeHBvcnRDZWxsIHtcbiAgcmV0dXJuIHsgdGV4dCwgY29sU3Bhbiwgcm93U3BhbiwgYm9sZCwgaW5kZW50LCBudW1lcmljIH07XG59XG4iXX0=
@@ -4,7 +4,7 @@ import * as echarts from 'echarts/core';
4
4
  export { echarts as default };
5
5
  import { LabelLayout } from 'echarts/features';
6
6
  import { CanvasRenderer } from 'echarts/renderers';
7
- import { R as REPORT_CHART_COLORS_CSS, a as REPORT_CHART_FONT_FAMILY, b as REPORT_AXIS_LABEL_FONT_SIZE } from './firestitch-report-firestitch-report-DgeCapUH.mjs';
7
+ import { R as REPORT_CHART_COLORS_CSS, a as REPORT_CHART_FONT_FAMILY, b as REPORT_AXIS_LABEL_FONT_SIZE } from './firestitch-report-firestitch-report-DRkNBMic.mjs';
8
8
 
9
9
  // Tree-shaken ECharts build for the reports renderer: only the chart types and
10
10
  // components the option-builder emits are registered, keeping the lazy chunk
@@ -63,4 +63,4 @@ echarts.registerTheme('report', {
63
63
  axisLabel: { color: '#52606d', fontSize: REPORT_AXIS_LABEL_FONT_SIZE },
64
64
  },
65
65
  });
66
- //# sourceMappingURL=firestitch-report-echarts-7AUAX6RO.mjs.map
66
+ //# sourceMappingURL=firestitch-report-echarts-rzMA7zhn.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"firestitch-report-echarts-7AUAX6RO.mjs","sources":["../../src/app/reports/theme/echarts.ts"],"sourcesContent":["// Tree-shaken ECharts build for the reports renderer: only the chart types and\n// components the option-builder emits are registered, keeping the lazy chunk\n// lean. Loaded on demand by ngx-echarts via provideEchartsCore — see\n// REPORT_ECHARTS_PROVIDERS in reports-echarts.provider.ts.\n//\n// The canvas renderer (not SVG) is deliberate: chart.getDataURL() needs it for\n// the high-res images the PPT/PDF exports will use.\n\nimport { BarChart, LineChart, PieChart } from 'echarts/charts';\nimport {\n DatasetComponent,\n GridComponent,\n LegendComponent,\n MarkAreaComponent,\n MarkLineComponent,\n TooltipComponent,\n} from 'echarts/components';\nimport * as echarts from 'echarts/core';\nimport { LabelLayout } from 'echarts/features';\nimport { CanvasRenderer } from 'echarts/renderers';\n\nimport { REPORT_CHART_COLORS_CSS } from './palette';\nimport { REPORT_AXIS_LABEL_FONT_SIZE, REPORT_CHART_FONT_FAMILY } from './typography';\n\necharts.use([\n BarChart,\n LineChart,\n PieChart,\n GridComponent,\n TooltipComponent,\n LegendComponent,\n DatasetComponent,\n // Reference lines and statistic lines (markLine), reference bands\n // (markArea), and the overlap hiding of 'auto' data labels (LabelLayout).\n MarkLineComponent,\n MarkAreaComponent,\n LabelLayout,\n CanvasRenderer,\n]);\n\n// The house theme — the single place report chart \"standards\" live (palette,\n// typography, tooltip styling). Polished defaults now; refined in the polish\n// phase.\necharts.registerTheme('report', {\n color: REPORT_CHART_COLORS_CSS,\n textStyle: {\n fontFamily: REPORT_CHART_FONT_FAMILY,\n },\n title: {\n textStyle: { color: '#1f2933', fontSize: 14, fontWeight: 600 },\n },\n legend: {\n textStyle: { color: '#52606d', fontSize: 11 },\n },\n tooltip: {\n backgroundColor: 'rgba(31, 41, 51, 0.92)',\n borderWidth: 0,\n textStyle: { color: '#fff', fontSize: 12 },\n },\n categoryAxis: {\n axisLine: { lineStyle: { color: '#cbd2d9' } },\n axisTick: { show: false },\n axisLabel: { color: '#52606d', fontSize: REPORT_AXIS_LABEL_FONT_SIZE },\n splitLine: { show: false },\n },\n valueAxis: {\n axisLine: { show: false },\n axisLabel: { color: '#52606d', fontSize: REPORT_AXIS_LABEL_FONT_SIZE },\n splitLine: { lineStyle: { color: '#e4e7eb' } },\n },\n timeAxis: {\n axisLine: { lineStyle: { color: '#cbd2d9' } },\n axisLabel: { color: '#52606d', fontSize: REPORT_AXIS_LABEL_FONT_SIZE },\n },\n});\n\nexport default echarts;\n"],"names":[],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAkBA,OAAO,CAAC,GAAG,CAAC;IACV,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,aAAa;IACb,gBAAgB;IAChB,eAAe;IACf,gBAAgB;;;IAGhB,iBAAiB;IACjB,iBAAiB;IACjB,WAAW;IACX,cAAc;AACf,CAAA,CAAC,CAAC;AAEH;AACA;AACA;AACA,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE;AAC9B,IAAA,KAAK,EAAE,uBAAuB;AAC9B,IAAA,SAAS,EAAE;AACT,QAAA,UAAU,EAAE,wBAAwB;AACrC,KAAA;AACD,IAAA,KAAK,EAAE;AACL,QAAA,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;AAC/D,KAAA;AACD,IAAA,MAAM,EAAE;QACN,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;AAC9C,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,eAAe,EAAE,wBAAwB;AACzC,QAAA,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;AAC3C,KAAA;AACD,IAAA,YAAY,EAAE;QACZ,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;AAC7C,QAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QACzB,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,2BAA2B,EAAE;AACtE,QAAA,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;AAC3B,KAAA;AACD,IAAA,SAAS,EAAE;AACT,QAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QACzB,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,2BAA2B,EAAE;QACtE,SAAS,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;AAC/C,KAAA;AACD,IAAA,QAAQ,EAAE;QACR,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;QAC7C,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,2BAA2B,EAAE;AACvE,KAAA;AACF,CAAA,CAAC"}
1
+ {"version":3,"file":"firestitch-report-echarts-rzMA7zhn.mjs","sources":["../../src/app/reports/theme/echarts.ts"],"sourcesContent":["// Tree-shaken ECharts build for the reports renderer: only the chart types and\n// components the option-builder emits are registered, keeping the lazy chunk\n// lean. Loaded on demand by ngx-echarts via provideEchartsCore — see\n// REPORT_ECHARTS_PROVIDERS in reports-echarts.provider.ts.\n//\n// The canvas renderer (not SVG) is deliberate: chart.getDataURL() needs it for\n// the high-res images the PPT/PDF exports will use.\n\nimport { BarChart, LineChart, PieChart } from 'echarts/charts';\nimport {\n DatasetComponent,\n GridComponent,\n LegendComponent,\n MarkAreaComponent,\n MarkLineComponent,\n TooltipComponent,\n} from 'echarts/components';\nimport * as echarts from 'echarts/core';\nimport { LabelLayout } from 'echarts/features';\nimport { CanvasRenderer } from 'echarts/renderers';\n\nimport { REPORT_CHART_COLORS_CSS } from './palette';\nimport { REPORT_AXIS_LABEL_FONT_SIZE, REPORT_CHART_FONT_FAMILY } from './typography';\n\necharts.use([\n BarChart,\n LineChart,\n PieChart,\n GridComponent,\n TooltipComponent,\n LegendComponent,\n DatasetComponent,\n // Reference lines and statistic lines (markLine), reference bands\n // (markArea), and the overlap hiding of 'auto' data labels (LabelLayout).\n MarkLineComponent,\n MarkAreaComponent,\n LabelLayout,\n CanvasRenderer,\n]);\n\n// The house theme — the single place report chart \"standards\" live (palette,\n// typography, tooltip styling). Polished defaults now; refined in the polish\n// phase.\necharts.registerTheme('report', {\n color: REPORT_CHART_COLORS_CSS,\n textStyle: {\n fontFamily: REPORT_CHART_FONT_FAMILY,\n },\n title: {\n textStyle: { color: '#1f2933', fontSize: 14, fontWeight: 600 },\n },\n legend: {\n textStyle: { color: '#52606d', fontSize: 11 },\n },\n tooltip: {\n backgroundColor: 'rgba(31, 41, 51, 0.92)',\n borderWidth: 0,\n textStyle: { color: '#fff', fontSize: 12 },\n },\n categoryAxis: {\n axisLine: { lineStyle: { color: '#cbd2d9' } },\n axisTick: { show: false },\n axisLabel: { color: '#52606d', fontSize: REPORT_AXIS_LABEL_FONT_SIZE },\n splitLine: { show: false },\n },\n valueAxis: {\n axisLine: { show: false },\n axisLabel: { color: '#52606d', fontSize: REPORT_AXIS_LABEL_FONT_SIZE },\n splitLine: { lineStyle: { color: '#e4e7eb' } },\n },\n timeAxis: {\n axisLine: { lineStyle: { color: '#cbd2d9' } },\n axisLabel: { color: '#52606d', fontSize: REPORT_AXIS_LABEL_FONT_SIZE },\n },\n});\n\nexport default echarts;\n"],"names":[],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAkBA,OAAO,CAAC,GAAG,CAAC;IACV,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,aAAa;IACb,gBAAgB;IAChB,eAAe;IACf,gBAAgB;;;IAGhB,iBAAiB;IACjB,iBAAiB;IACjB,WAAW;IACX,cAAc;AACf,CAAA,CAAC,CAAC;AAEH;AACA;AACA;AACA,OAAO,CAAC,aAAa,CAAC,QAAQ,EAAE;AAC9B,IAAA,KAAK,EAAE,uBAAuB;AAC9B,IAAA,SAAS,EAAE;AACT,QAAA,UAAU,EAAE,wBAAwB;AACrC,KAAA;AACD,IAAA,KAAK,EAAE;AACL,QAAA,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE;AAC/D,KAAA;AACD,IAAA,MAAM,EAAE;QACN,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE;AAC9C,KAAA;AACD,IAAA,OAAO,EAAE;AACP,QAAA,eAAe,EAAE,wBAAwB;AACzC,QAAA,WAAW,EAAE,CAAC;QACd,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;AAC3C,KAAA;AACD,IAAA,YAAY,EAAE;QACZ,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;AAC7C,QAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QACzB,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,2BAA2B,EAAE;AACtE,QAAA,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;AAC3B,KAAA;AACD,IAAA,SAAS,EAAE;AACT,QAAA,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QACzB,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,2BAA2B,EAAE;QACtE,SAAS,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;AAC/C,KAAA;AACD,IAAA,QAAQ,EAAE;QACR,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;QAC7C,SAAS,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,2BAA2B,EAAE;AACvE,KAAA;AACF,CAAA,CAAC"}
@@ -50,7 +50,7 @@ import * as i1$5 from '@angular/cdk/drag-drop';
50
50
  import { moveItemInArray, DragDropModule } from '@angular/cdk/drag-drop';
51
51
  import * as i3$1 from '@firestitch/zoom-pan';
52
52
  import { FsZoomPanComponent, FsZoomPanModule } from '@firestitch/zoom-pan';
53
- import { GridFieldType, GridGranularity, canonicalGridLayout, convertDateFilter, GridNoteCode, GridControlState, GridFormat, GridUnits, FsGridComponent, FsGridCellDirective, GridRowKind, readGridTable } from '@firestitch/grid';
53
+ import { GridFieldType, GridGranularity, canonicalGridLayout, convertDateFilter, GridNoteCode, GridControlState, GridFormat, GridUnits, FsGridComponent, FsGridCellDirective, GridRowKind, headingLabel, readGridTable } from '@firestitch/grid';
54
54
  import { parseISO, isValid, addDays, min, max, startOfDay, isLastDayOfMonth, endOfMonth, addMonths, addYears, addQuarters, addWeeks, formatISO, format, startOfYear, startOfQuarter, startOfMonth, subMonths, subDays, subWeeks, startOfWeek, endOfWeek } from 'date-fns';
55
55
  import { toZonedTime } from 'date-fns-tz';
56
56
  import { MatProgressSpinner } from '@angular/material/progress-spinner';
@@ -9743,9 +9743,10 @@ const NO = 'No';
9743
9743
  // A grid tile's formatter: every value written as the report writes it on
9744
9744
  // a list today. An output number reads through formatOutputValue with what
9745
9745
  // the report line says the output holds (a change is signed, a missing prior
9746
- // reads as the list's dash); a plain number through formatNumber; a date in
9747
- // the report's locale, an instant in its zone. The placement's format,
9748
- // precision and units win over the field's.
9746
+ // reads as the list's dash); a plain number through formatNumber; a key's
9747
+ // digits as they are; a date at its grain in the report's locale, an instant
9748
+ // in its zone. The placement's format, precision and units win over the
9749
+ // field's.
9749
9750
  function reportGridFormatter(context) {
9750
9751
  return {
9751
9752
  format: (value, field, placement) => formatGridValue(context, value, field, placement),
@@ -9760,6 +9761,7 @@ function formatGridValue(context, value, field, placement) {
9760
9761
  case GridFieldType.Number:
9761
9762
  return formatGridNumber(context, value, field, placement);
9762
9763
  case GridFieldType.Date:
9764
+ return formatGridDate(context, value, field, placement);
9763
9765
  case GridFieldType.Datetime:
9764
9766
  return formatReportDate(value, context.timezone, context.format.locale);
9765
9767
  case GridFieldType.Boolean:
@@ -9769,12 +9771,29 @@ function formatGridValue(context, value, field, placement) {
9769
9771
  }
9770
9772
  }
9771
9773
  function formatGridNumber(context, value, field, placement) {
9774
+ // A key, such as a client's id, is a name: its digits print as they are, never grouped
9775
+ if (field.identifier && !isAggregate(placement)) {
9776
+ return String(value);
9777
+ }
9772
9778
  const spec = numberSpec(field, placement);
9773
9779
  const output = isAggregate(placement) ? null : context.report?.outputs?.[field.name];
9774
9780
  return output
9775
9781
  ? formatOutputValue(value, output, spec, context.format).text
9776
9782
  : formatNumber(value, spec, context.format);
9777
9783
  }
9784
+ // A calendar date at the grain it prints at: the placement's, else the
9785
+ // field's own, which on a time axis is the report's group-by. A quarter reads
9786
+ // "Q3 2023", a month "Jul 2023" and a year "2023", as the report's charts
9787
+ // label them, rather than as their first day; a week, like a chart's, reads as
9788
+ // the day it starts. A day reads as the report writes a date.
9789
+ function formatGridDate(context, value, field, placement) {
9790
+ const granularity = placement?.granularity ?? field.granularities?.[0];
9791
+ const chartGranularity = Object.keys(GRID_GRANULARITIES)
9792
+ .find((name) => GRID_GRANULARITIES[name] === granularity);
9793
+ return chartGranularity && chartGranularity !== 'day' && typeof value === 'string'
9794
+ ? formatPeriodLabel(value.slice(0, 10), chartGranularity, false, context.format.locale, ReportChartDateLabel.Long)
9795
+ : formatReportDate(value, context.timezone, context.format.locale);
9796
+ }
9778
9797
  // The format, precision and units a number is written with: the placement's,
9779
9798
  // else the field's.
9780
9799
  function numberSpec(field, placement) {
@@ -14700,11 +14719,12 @@ function gridExportTable(table) {
14700
14719
  };
14701
14720
  }
14702
14721
  // The lines a table adds under its box: the screen's notes, the pivot
14703
- // columns it leaves out, and each column filter of the layout it was read in.
14722
+ // columns it leaves out, and each column filter of the layout it was read in,
14723
+ // its field named as its column is headed.
14704
14724
  function gridExportNotes(table, layout, locale) {
14705
14725
  const fields = new Map(table.fields.map((field) => [field.name, field]));
14706
14726
  const filters = (layout.filters ?? [])
14707
- .map((filter) => gridFilterLineText(fields.get(filter.field)?.label ?? filter.field, filter, fields.get(filter.field), locale))
14727
+ .map((filter) => gridFilterLineText(headingLabel(table.fields, layout, filter.field), filter, fields.get(filter.field), locale))
14708
14728
  .filter((text) => !!text);
14709
14729
  return [
14710
14730
  ...table.notes,
@@ -15391,7 +15411,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
15391
15411
  // in the report's format context, as on screen.
15392
15412
  async function renderChartImage(component, data, width, height, context, pixelRatio = 3) {
15393
15413
  // The same tree-shaken echarts build + 'report' theme the live canvas uses.
15394
- const echarts = (await import('./firestitch-report-echarts-7AUAX6RO.mjs')).default;
15414
+ const echarts = (await import('./firestitch-report-echarts-rzMA7zhn.mjs')).default;
15395
15415
  const host = document.createElement('div');
15396
15416
  host.style.width = `${width}px`;
15397
15417
  host.style.height = `${height}px`;
@@ -18878,7 +18898,7 @@ class FsAiReportComponent {
18878
18898
  ReportAiChatData,
18879
18899
  { provide: FsAiChatData, useExisting: ReportAiChatData },
18880
18900
  // Tree-shaken ECharts core + the 'report' house theme, loaded lazily.
18881
- provideEchartsCore({ echarts: () => import('./firestitch-report-echarts-7AUAX6RO.mjs').then((module) => module.default) }),
18901
+ provideEchartsCore({ echarts: () => import('./firestitch-report-echarts-rzMA7zhn.mjs').then((module) => module.default) }),
18882
18902
  // The bar's date pickers start their weeks on Monday and list the built-in
18883
18903
  // presets; a preset only sets the days.
18884
18904
  provideReportDatePicker(),
@@ -18902,7 +18922,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
18902
18922
  ReportAiChatData,
18903
18923
  { provide: FsAiChatData, useExisting: ReportAiChatData },
18904
18924
  // Tree-shaken ECharts core + the 'report' house theme, loaded lazily.
18905
- provideEchartsCore({ echarts: () => import('./firestitch-report-echarts-7AUAX6RO.mjs').then((module) => module.default) }),
18925
+ provideEchartsCore({ echarts: () => import('./firestitch-report-echarts-rzMA7zhn.mjs').then((module) => module.default) }),
18906
18926
  // The bar's date pickers start their weeks on Monday and list the built-in
18907
18927
  // presets; a preset only sets the days.
18908
18928
  provideReportDatePicker(),
@@ -18995,4 +19015,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
18995
19015
  */
18996
19016
 
18997
19017
  export { FsAiReportsComponent as F, GRANULARITY_OPTIONS as G, REPORT_CHART_COLORS_CSS as R, REPORT_CHART_FONT_FAMILY as a, REPORT_AXIS_LABEL_FONT_SIZE as b, FsAiReportComponent as c, ReportData as d, ReportService as e, ReportFilterStateService as f, ReportNodeType as g, ReportState as h, ReportValueFormat as i, ReportValueFormula as j, ReportListColumnFormat as k, ReportNumberUnits as l, ReportChartDataLabels as m, ReportChartColor as n, ReportChartLineStyle as o, ReportChartMarkStat as p, ReportChartDateLabel as q, ReportChangePolarity as r };
18998
- //# sourceMappingURL=firestitch-report-firestitch-report-DgeCapUH.mjs.map
19018
+ //# sourceMappingURL=firestitch-report-firestitch-report-DRkNBMic.mjs.map