@firestitch/report 18.12.0 → 18.13.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.
- package/app/reports/components/component-grid/component-grid.component.d.ts +5 -1
- package/app/reports/components/component-grid/report-grid-cell.pipe.d.ts +11 -0
- package/app/reports/components/report-component/report-component.component.d.ts +0 -1
- package/app/reports/export/report-export-collector.service.d.ts +8 -1
- package/app/reports/export/report-filter-lines.d.ts +2 -0
- package/app/reports/export/report-grid-export.d.ts +20 -0
- package/app/reports/export/report-pdf.service.d.ts +2 -0
- package/app/reports/export/report-pptx.service.d.ts +1 -0
- package/app/reports/group-by.d.ts +3 -0
- package/app/reports/interfaces/report-export-snapshot.interface.d.ts +2 -0
- package/app/reports/interfaces/report.interface.d.ts +7 -0
- package/app/reports/report-filter-items.d.ts +1 -1
- package/app/reports/report-grid-layout.d.ts +8 -2
- package/app/reports/services/report-filter-state.service.d.ts +8 -1
- package/app/reports/tile-data-state.d.ts +2 -2
- package/esm2022/app/reports/components/component-grid/component-grid.component.mjs +34 -7
- package/esm2022/app/reports/components/component-grid/report-grid-cell.pipe.mjs +41 -0
- package/esm2022/app/reports/components/report-component/report-component.component.mjs +15 -19
- package/esm2022/app/reports/data/report.data.mjs +3 -3
- package/esm2022/app/reports/export/report-export-collector.service.mjs +72 -7
- package/esm2022/app/reports/export/report-filter-lines.mjs +68 -1
- package/esm2022/app/reports/export/report-grid-export.mjs +48 -0
- package/esm2022/app/reports/export/report-pdf.service.mjs +47 -17
- package/esm2022/app/reports/export/report-pptx.service.mjs +48 -4
- package/esm2022/app/reports/group-by.mjs +13 -0
- package/esm2022/app/reports/interfaces/report-export-snapshot.interface.mjs +1 -1
- package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
- package/esm2022/app/reports/report-filter-items.mjs +9 -7
- package/esm2022/app/reports/report-grid-layout.mjs +57 -4
- package/esm2022/app/reports/services/report-filter-state.service.mjs +124 -38
- package/esm2022/app/reports/tile-data-state.mjs +12 -17
- package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +2 -2
- package/esm2022/app/reports/views/report/report.component.mjs +2 -2
- package/fesm2022/{firestitch-report-echarts-CoaGXKET.mjs → firestitch-report-echarts-EecIloKo.mjs} +2 -2
- package/fesm2022/{firestitch-report-echarts-CoaGXKET.mjs.map → firestitch-report-echarts-EecIloKo.mjs.map} +1 -1
- package/fesm2022/{firestitch-report-firestitch-report-CHPA7sla.mjs → firestitch-report-firestitch-report-DbdLxQSE.mjs} +566 -116
- package/fesm2022/firestitch-report-firestitch-report-DbdLxQSE.mjs.map +1 -0
- package/fesm2022/firestitch-report.mjs +1 -1
- package/package.json +2 -2
- package/fesm2022/firestitch-report-firestitch-report-CHPA7sla.mjs.map +0 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { GridFieldType, GridGranularity } from '@firestitch/grid';
|
|
1
2
|
import { forkJoin, of } from 'rxjs';
|
|
2
3
|
import { catchError, map } from 'rxjs/operators';
|
|
3
4
|
import { crumbedTitle, drillCrumbLabels } from '../drill-crumbs';
|
|
@@ -21,6 +22,10 @@ export const MATCH_ANY_LINE = 'Filters in the report bar: match any';
|
|
|
21
22
|
export const MATCH_ALL_CHIP = 'Match: all filters';
|
|
22
23
|
// A group's label when it has none.
|
|
23
24
|
const UNLABELED_GROUP = 'Filter';
|
|
25
|
+
// How many picks a column filter's line names before 'and N more'.
|
|
26
|
+
const GRID_FILTER_NAMED = 10;
|
|
27
|
+
// What a blank key reads as in a column filter's line.
|
|
28
|
+
const GRID_BLANK_KEY = '(blank)';
|
|
24
29
|
// The label of the group-by line when the report names no control.
|
|
25
30
|
const GROUP_BY_LABEL = 'Group By';
|
|
26
31
|
// One filter group's value as text ('Region: West, East'), or null when the
|
|
@@ -239,4 +244,66 @@ function pageName(report, pageId) {
|
|
|
239
244
|
}
|
|
240
245
|
return report.pages[index].name || `Page ${index + 1}`;
|
|
241
246
|
}
|
|
242
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZpbHRlci1saW5lcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9leHBvcnQvcmVwb3J0LWZpbHRlci1saW5lcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsUUFBUSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpELE9BQU8sRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBTzlELE9BQU8sRUFFTCxtQkFBbUIsR0FLcEIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLDJFQUEyRTtBQUMzRSw0REFBNEQ7QUFDNUQsNEVBQTRFO0FBQzVFLHlFQUF5RTtBQUN6RSw0RUFBNEU7QUFHNUUsMEVBQTBFO0FBQzFFLHNFQUFzRTtBQUN0RSxvQkFBb0I7QUFDcEIsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLG1CQUFtQixDQUFDO0FBQ2xELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxzQ0FBc0MsQ0FBQztBQUVyRSwyRUFBMkU7QUFDM0UseUJBQXlCO0FBQ3pCLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxvQkFBb0IsQ0FBQztBQUVuRCxvQ0FBb0M7QUFDcEMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBRWpDLG1FQUFtRTtBQUNuRSxNQUFNLGNBQWMsR0FB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LFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFekYsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDZCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLFFBQVEsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO0FBQ3pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlLCBmb3JrSm9pbiwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgY3J1bWJlZFRpdGxlLCBkcmlsbENydW1iTGFiZWxzIH0gZnJvbSAnLi4vZHJpbGwtY3J1bWJzJztcbmltcG9ydCB7IGZvcm1hdERheVJhbmdlLCBmb3JtYXRQbGFpbk51bWJlciB9IGZyb20gJy4uL2Zvcm1hdCc7XG5pbXBvcnQgeyBSZXBvcnREcmlsbFN0ZXAgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1kcmlsbC1zdGVwLmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRFeHBvcnRMaW5lIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtZXhwb3J0LWxpbmUuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydEV4cG9ydExpbmVzSW5wdXQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1leHBvcnQtbGluZXMtaW5wdXQuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlckxpbmVDb250ZXh0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQtZmlsdGVyLWxpbmUtY29udGV4dC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyTGluZUZvcm0gfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1maWx0ZXItbGluZS1mb3JtLnR5cGUnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyTWF0Y2ggfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1maWx0ZXItbWF0Y2gudHlwZSc7XG5pbXBvcnQge1xuICBGaWx0ZXJHcm91cFZhbHVlLFxuICBHUkFOVUxBUklUWV9PUFRJT05TLFxuICBSZXBvcnQsXG4gIFJlcG9ydENvbXBvbmVudCxcbiAgUmVwb3J0RmlsdGVyR3JvdXAsXG4gIFJlcG9ydEZvcm1hdENvbnRleHQsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBkYXRlQm91bmRMYWJlbCwgZGF0ZUJvdW5kU3RyaW5nLCByZWxhdGl2ZUxhYmVsIH0gZnJvbSAnLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQgeyBpc1RpbGUgfSBmcm9tICcuLi9yZXBvcnQtdGlsZSc7XG5pbXBvcnQgeyBmaW5pdGVOdW1iZXIgfSBmcm9tICcuLi9yZXBvcnQtc3RhdGUnO1xuXG5cbi8vIFRoZSB3b3JkcyBhIGZpbGUgdXNlcyBmb3Igd2hhdCB0aGUgc2NyZWVuIGhlbGQ6IGVhY2ggZmlsdGVyJ3MgdmFsdWUsIHRoZVxuLy8gZ3JvdXAtYnkgZ3JhaW4sIGEgZHJpbGxlZCB0aWxlIGFuZCB0aGUgbWF0Y2guIFRoZSBQREYgYW5kXG4vLyBQb3dlclBvaW50IGNvdmVycyBwcmludCB0aGVzZSBsaW5lcywgYW5kIHRoZSB6aXAgc2VuZHMgdGhlbSAoZmlsdGVyTGluZXMsXG4vLyB3aXRoIGZpbHRlclN1bW1hcnkgYXMgdGhlaXIgdGV4dCBmb3IgYW4gb2xkZXIgc2VydmVyKSwgc28gZXZlcnkgZXhwb3J0XG4vLyB3b3JkcyBvbmUgZmlsdGVyIG9uZSB3YXkuIFB1cmUsIHNvIHRoZSBub2RlIGhhcm5lc3MgY2hlY2tzIGV2ZXJ5IHdvcmRpbmcuXG5cblxuLy8gVGhlIG1hdGNoIHdoaWxlIHRoZSByZXBvcnQgYmFyJ3MgZmlsdGVycyBjb21iaW5lIHdpdGggJ2FueSc6IHRoZSBjaGlwJ3Ncbi8vIHdvcmRzLCBhbmQgdGhlIGNvdmVyJ3MgbGluZS4gVGhlIHppcCdzIG5vdGVzIGNhcnJ5IHRoZSBzZXJ2ZXIncyBvd25cbi8vIHNlbnRlbmNlIGluc3RlYWQuXG5leHBvcnQgY29uc3QgTUFUQ0hfQU5ZX0NISVAgPSAnTWF0Y2g6IGFueSBmaWx0ZXInO1xuZXhwb3J0IGNvbnN0IE1BVENIX0FOWV9MSU5FID0gJ0ZpbHRlcnMgaW4gdGhlIHJlcG9ydCBiYXI6IG1hdGNoIGFueSc7XG5cbi8vIFRoZSByZXBvcnQgYmFyJ3MgTWF0Y2ggY2hpcCB3aGlsZSB0aGUgZmlsdGVycyBjb21iaW5lIHdpdGggJ2FsbCcuIEEgZmlsZVxuLy8gcHJpbnRzIG5vIGxpbmUgZm9yIGl0LlxuZXhwb3J0IGNvbnN0IE1BVENIX0FMTF9DSElQID0gJ01hdGNoOiBhbGwgZmlsdGVycyc7XG5cbi8vIEEgZ3JvdXAncyBsYWJlbCB3aGVuIGl0IGhhcyBub25lLlxuY29uc3QgVU5MQUJFTEVEX0dST1VQID0gJ0ZpbHRlcic7XG5cbi8vIFRoZSBsYWJlbCBvZiB0aGUgZ3JvdXAtYnkgbGluZSB3aGVuIHRoZSByZXBvcnQgbmFtZXMgbm8gY29udHJvbC5cbmNvbnN0IEdST1VQX0JZX0xBQkVMID0gJ0dyb3VwIEJ5JztcblxuXG4vLyBPbmUgZmlsdGVyIGdyb3VwJ3MgdmFsdWUgYXMgdGV4dCAoJ1JlZ2lvbjogV2VzdCwgRWFzdCcpLCBvciBudWxsIHdoZW4gdGhlXG4vLyB2YWx1ZSBob2xkcyBub3RoaW5nLiBWYWx1ZXMgbGVmdCBvdXQgc2F5IHNvIGJlZm9yZSB0aGUgbGFiZWw6ICdFeGNsdWRlXG4vLyBSZWdpb246IFdlc3QsIEVhc3QnLiAnY2hpcCcgaXMgdGhlIHNob3J0IGZvcm07ICdsaW5lJyBhZGRzIHdoYXQgYSBmaWxlXG4vLyByZWFkZXIgY2Fubm90IHNlZSBvbiBzY3JlZW46XG4vLyAtIGV4Y2x1ZGU6ICdFeGNsdWRlIFJlZ2lvbjogV2VzdCwgRWFzdCAocm93cyB3aXRoIG5vIFJlZ2lvbiBhcmUga2VwdCknLCBvclxuLy8gICAnLi4uIGFyZSBsZWZ0IG91dCcgd2hlbiB0aGUgYmxhbmsgbGFiZWwgKGNvbnRleHQuYmxhbmtMYWJlbCkgaXMgb25lIG9mXG4vLyAgIHRoZSB2YWx1ZXMgbGVmdCBvdXQuIFdpdGhvdXQgYSBrbm93biBibGFuayBsYWJlbCB0aGUgbGluZSBzYXlzIG5vdGhpbmdcbi8vICAgYWJvdXQgdGhlIGJsYW5rIHJvd3M7XG4vLyAtIHJhbmdlOiAnQW1vdW50OiAxMCB0byA1MCAoYm90aCBpbmNsdWRlZCknOyBhbiBvcGVuIGVuZCByZWFkcyAnMTAgb3Jcbi8vICAgbW9yZScgb3IgJzUwIG9yIGxlc3MnIGluIGJvdGggZm9ybXM7XG4vLyAtIGEgbGl2ZSBwcmVzZXQ6ICdSZXBvcnQgUGVyaW9kOiBMYXN0IDMwIGRheXMgKFNlcCAzIOKAkyBPY3QgMiwgMjAyNiknO1xuLy8gLSBhIHBhZ2UgZ3JvdXA6ICdDb2hvcnQgKHBhZ2UgXCJSZXRlbnRpb25cIiBvbmx5KTogMjAyNScuXG4vLyBOdW1iZXJzIGFuZCBkYXRlcyBhcmUgd3JpdHRlbiBpbiB0aGUgcmVwb3J0J3MgbG9jYWxlLCBhbmQgMCBpcyBhIG51bWJlclxuLy8gbGlrZSBhbnkgb3RoZXIuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyTGluZVRleHQoXG4gIGdyb3VwOiBQaWNrPFJlcG9ydEZpbHRlckdyb3VwLCAnbGFiZWwnIHwgJ2xldmVsJz4sXG4gIHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgY29udGV4dDogUmVwb3J0RmlsdGVyTGluZUNvbnRleHQsXG4gIGZvcm06IFJlcG9ydEZpbHRlckxpbmVGb3JtLFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGxhYmVsID0gZ3JvdXAubGFiZWwgfHwgVU5MQUJFTEVEX0dST1VQO1xuICBjb25zdCB0ZXh0ID0gdmFsdWUgPyB2YWx1ZVRleHQobGFiZWwsIHZhbHVlLCBjb250ZXh0LCBmb3JtKSA6IG51bGw7XG5cbiAgaWYgKHRleHQgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHBhZ2VPbmx5ID0gZm9ybSA9PT0gJ2xpbmUnICYmIGdyb3VwLmxldmVsID09PSAncGFnZScgJiYgY29udGV4dC5wYWdlTmFtZTtcbiAgY29uc3QgbmFtZSA9IHBhZ2VPbmx5ID8gYCR7bGFiZWx9IChwYWdlIFwiJHtjb250ZXh0LnBhZ2VOYW1lfVwiIG9ubHkpYCA6IGxhYmVsO1xuXG4gIHJldHVybiBgJHtleGNsdWRlcyh2YWx1ZSkgPyAnRXhjbHVkZSAnIDogJyd9JHtuYW1lfTogJHt0ZXh0fWA7XG59XG5cbi8vIFRoZSB3b3JkcyBvZiBvbmUgZmlsdGVyJ3MgdmFsdWUgYXMgaXRzIGNoaXAgcmVhZHMgdGhlbSBhZnRlciB0aGUgbGFiZWxcbi8vICgnV2VzdCwgRWFzdCcsICcwIHRvIDEwJywgJzAgb3IgbW9yZScsICc1MCBvciBsZXNzJyksIG9yIG51bGwgd2hlbiB0aGVcbi8vIHZhbHVlIGhvbGRzIG5vdGhpbmcuIFZhbHVlcyBsZWZ0IG91dCByZWFkIGFzIHRoZWlyIG5hbWVzOiBmaWx0ZXJMaW5lVGV4dFxuLy8gcHV0cyAnRXhjbHVkZScgYmVmb3JlIHRoZSBsYWJlbCwgYW5kIGEge3tmaWx0ZXIuPGlkPn19IHRva2VuIHJlYWRzIHRoZW0gYXNcbi8vICdBbGwgZXhjZXB0IFdlc3QnLiBUaGUgb25lIHNvdXJjZSBvZiB0aGVzZSB3b3Jkcywgc28gdGhlIGNoaXAsIGEgZmlsZSdzXG4vLyBjb3ZlciBhbmQgYSB0b2tlbiBuZXZlciB3b3JkIGEgdmFsdWUgdHdvIHdheXMuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyQ2hpcFZhbHVlVGV4dChcbiAgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBjb250ZXh0OiBSZXBvcnRGaWx0ZXJMaW5lQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gdmFsdWUgPyB2YWx1ZVRleHQoJycsIHZhbHVlLCBjb250ZXh0LCAnY2hpcCcpIDogbnVsbDtcbn1cblxuLy8gV2hldGhlciBhIHZhbHVlIGlzIHdvcmRlZCBhcyB2YWx1ZXMgbGVmdCBvdXQ6IHRoZSBzYW1lIG9yZGVyIHZhbHVlVGV4dFxuLy8gcmVhZHMgYSB2YWx1ZSBpbiwgc28gYSB2YWx1ZSB3aXRoIGRheXMgb3Iga2VwdCBwaWNrcyBpcyBuZXZlciBvbmUuXG5leHBvcnQgZnVuY3Rpb24gZXhjbHVkZXModmFsdWU6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIXZhbHVlICYmICF2YWx1ZS5zdGFydCAmJiAhdmFsdWUuZW5kICYmICF2YWx1ZS52YWx1ZXM/Lmxlbmd0aCAmJiAhIXZhbHVlLmV4Y2x1ZGVWYWx1ZXM/Lmxlbmd0aDtcbn1cblxuLy8gVGhlIHBpY2tzIGEgdmFsdWUgbmFtZXMsIGtlcHQgb3IgbGVmdCBvdXQsIGluIHBpY2sgb3JkZXI6IHdoYXQgYSBzZWxlY3Qnc1xuLy8gbmFtZXMgYXJlIHJlYWQgZm9yLiBOb25lIGZvciBhIGRhdGUgcmFuZ2UuXG5leHBvcnQgZnVuY3Rpb24gdmFsdWVQaWNrcyh2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQpOiB1bmtub3duW10ge1xuICBpZiAoIXZhbHVlIHx8IHZhbHVlLnN0YXJ0IHx8IHZhbHVlLmVuZCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZS52YWx1ZXM/Lmxlbmd0aCA/IHZhbHVlLnZhbHVlcyA6IHZhbHVlLmV4Y2x1ZGVWYWx1ZXMgPz8gW107XG59XG5cbi8vIFRoZSBtYXRjaCBhcyB0ZXh0IHdoaWxlIGl0IGlzICdhbnknLCBlbHNlIG51bGw7IHRoZSBjaGlwIGFsc28gd29yZHMgJ2FsbCcuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hMaW5lVGV4dChtYXRjaDogUmVwb3J0RmlsdGVyTWF0Y2ggfCBudWxsIHwgdW5kZWZpbmVkLCBmb3JtOiBSZXBvcnRGaWx0ZXJMaW5lRm9ybSk6IHN0cmluZyB8IG51bGwge1xuICBpZiAobWF0Y2ggIT09ICdhbnknKSB7XG4gICAgcmV0dXJuIGZvcm0gPT09ICdjaGlwJyAmJiBtYXRjaCA9PT0gJ2FsbCcgPyBNQVRDSF9BTExfQ0hJUCA6IG51bGw7XG4gIH1cblxuICByZXR1cm4gZm9ybSA9PT0gJ2NoaXAnID8gTUFUQ0hfQU5ZX0NISVAgOiBNQVRDSF9BTllfTElORTtcbn1cblxuLy8gQSBkcmlsbGVkIHRpbGUncyBsaW5lOiBpdHMgdGl0bGUgYW5kIHRoZSBicmVhZGNydW1iIG9mIGl0cyBwYXRoLCBpbiB0aGVcbi8vIHJlcG9ydCdzIGxvY2FsZSAoJ1JldmVudWUgYnkgUGVyaW9kIOKAuiAyMDI2IOKAuiBRMycpLlxuZXhwb3J0IGZ1bmN0aW9uIGRyaWxsTGluZVRleHQoXG4gIGNvbXBvbmVudDogUGljazxSZXBvcnRDb21wb25lbnQsICd0aXRsZSc+LFxuICBwYXRoOiByZWFkb25seSBSZXBvcnREcmlsbFN0ZXBbXSxcbiAgZm9ybWF0Q29udGV4dDogUGljazxSZXBvcnRGb3JtYXRDb250ZXh0LCAnbG9jYWxlJz4sXG4pOiBzdHJpbmcge1xuICByZXR1cm4gY3J1bWJlZFRpdGxlKGNvbXBvbmVudC50aXRsZSwgZHJpbGxDcnVtYkxhYmVscyhwYXRoLCBmb3JtYXRDb250ZXh0KSk7XG59XG5cbi8vIFRoZSBmaWx0ZXIgbGluZXMgb2YgYW4gZXhwb3J0LCBpbiBvcmRlcjogb25lIHBlciBmaWx0ZXIgZ3JvdXAgd2l0aCBhXG4vLyB2YWx1ZSAodGhlIHJlcG9ydCdzIGdyb3VwIG9yZGVyKSwgdGhlIGdyb3VwLWJ5IGxpbmUsIHRoZW4gb25lIHBlciBkcmlsbGVkXG4vLyBjaGFydCAocGFnZSBvcmRlcikuIEEgVGhpcyBQYWdlIGV4cG9ydCAoaW5wdXQucGFnZUlkKSBsaXN0cyBvbmx5IHRoZVxuLy8gZ3JvdXBzIHRoYXQgcmVhY2ggYSB0aWxlIG9mIHRoYXQgcGFnZSwgYW5kIG9ubHkgdGhhdCBwYWdlJ3MgZHJpbGxlZFxuLy8gY2hhcnRzLiBBIHNlbGVjdCdzIG5hbWVzIGFyZSBhIHJlcXVlc3QsIHNvIHRoZSBsaW5lcyBhcnJpdmUgdG9nZXRoZXIgb25jZVxuLy8gZXZlcnkgbmFtZSBpcyBrbm93bjsgYSBmYWlsZWQgbmFtZSByZWFkIHdyaXRlcyB0aGUgcGlja3MgYXMgdGhleSBhcmVcbi8vIHN0b3JlZC5cbmV4cG9ydCBmdW5jdGlvbiBleHBvcnRMaW5lcyhpbnB1dDogUmVwb3J0RXhwb3J0TGluZXNJbnB1dCk6IE9ic2VydmFibGU8UmVwb3J0RXhwb3J0TGluZVtdPiB7XG4gIGNvbnN0IGdyb3VwcyQgPSBleHBvcnRHcm91cHMoaW5wdXQucmVwb3J0LCBpbnB1dC5wYWdlSWQpXG4gICAgLm1hcCgoZ3JvdXApID0+IGdyb3VwTGluZShncm91cCwgaW5wdXQpKTtcbiAgY29uc3QgcmVzdCA9IFtncm91cEJ5TGluZShpbnB1dCksIC4uLmRyaWxsTGluZXMoaW5wdXQpXVxuICAgIC5maWx0ZXIoKGxpbmUpOiBsaW5lIGlzIFJlcG9ydEV4cG9ydExpbmUgPT4gbGluZSAhPT0gbnVsbCk7XG5cbiAgcmV0dXJuIChncm91cHMkLmxlbmd0aCA/IGZvcmtKb2luKGdyb3VwcyQpIDogb2YoW10pKVxuICAgIC5waXBlKFxuICAgICAgbWFwKChsaW5lcykgPT4gW1xuICAgICAgICAuLi5saW5lcy5maWx0ZXIoKGxpbmUpOiBsaW5lIGlzIFJlcG9ydEV4cG9ydExpbmUgPT4gbGluZSAhPT0gbnVsbCksXG4gICAgICAgIC4uLnJlc3QsXG4gICAgICBdKSxcbiAgICApO1xufVxuXG4vLyBUaGUgZ3JvdXBzIGFuIGV4cG9ydCdzIGxpbmVzIG1heSBuYW1lOiBldmVyeSBncm91cCwgb3IgZm9yIGEgVGhpcyBQYWdlXG4vLyBleHBvcnQgdGhlIGdyb3VwcyB3aXRoIGEgbWVtYmVyIHRpbGUgb24gdGhhdCBwYWdlLiBBIHBhZ2UgZ3JvdXAgcmVhY2hlc1xuLy8gb25seSBpdHMgb3duIHBhZ2UuXG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0R3JvdXBzKHJlcG9ydDogUmVwb3J0LCBwYWdlSWQ6IG51bWJlciB8IG51bGwpOiBSZXBvcnRGaWx0ZXJHcm91cFtdIHtcbiAgY29uc3QgZ3JvdXBzID0gcmVwb3J0LmZpbHRlckdyb3VwcyA/PyBbXTtcblxuICBpZiAoIXBhZ2VJZCkge1xuICAgIHJldHVybiBncm91cHM7XG4gIH1cblxuICBjb25zdCBwYWdlID0gKHJlcG9ydC5wYWdlcyA/PyBbXSkuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT09IHBhZ2VJZCk7XG4gIGNvbnN0IHRpbGVJZHMgPSAocGFnZT8uY29tcG9uZW50cyA/PyBbXSlcbiAgICAuZmlsdGVyKChjb21wb25lbnQpID0+IGlzVGlsZShjb21wb25lbnQpKVxuICAgIC5tYXAoKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LmlkKTtcblxuICByZXR1cm4gZ3JvdXBzLmZpbHRlcigoZ3JvdXApID0+IChncm91cC5sZXZlbCAhPT0gJ3BhZ2UnIHx8IGdyb3VwLnBhZ2VJZCA9PT0gcGFnZUlkKVxuICAgICYmIGdyb3VwTWVtYmVySWRzKGdyb3VwKS5zb21lKChjb21wb25lbnRJZCkgPT4gdGlsZUlkcy5pbmNsdWRlcyhjb21wb25lbnRJZCkpKTtcbn1cblxuLy8gVGhlIHRleHQgYWZ0ZXIgdGhlIGxhYmVsLCBvciBudWxsIHdoZW4gdGhlIHZhbHVlIGhvbGRzIG5vdGhpbmcuXG5mdW5jdGlvbiB2YWx1ZVRleHQoXG4gIGxhYmVsOiBzdHJpbmcsXG4gIHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlLFxuICBjb250ZXh0OiBSZXBvcnRGaWx0ZXJMaW5lQ29udGV4dCxcbiAgZm9ybTogUmVwb3J0RmlsdGVyTGluZUZvcm0sXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHZhbHVlLnN0YXJ0IHx8IHZhbHVlLmVuZCkge1xuICAgIHJldHVybiBkYXRlVGV4dCh2YWx1ZSwgY29udGV4dCwgZm9ybSk7XG4gIH1cblxuICBpZiAodmFsdWUudmFsdWVzPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gcGlja05hbWVzKHZhbHVlLnZhbHVlcywgY29udGV4dCkuam9pbignLCAnKTtcbiAgfVxuXG4gIGlmICh2YWx1ZS5leGNsdWRlVmFsdWVzPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gZXhjbHVkZVRleHQobGFiZWwsIHZhbHVlLmV4Y2x1ZGVWYWx1ZXMsIGNvbnRleHQsIGZvcm0pO1xuICB9XG5cbiAgY29uc3Qga2V5d29yZCA9IHR5cGVvZiB2YWx1ZS52YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS52YWx1ZS50cmltKCkgOiAnJztcblxuICByZXR1cm4gcmFuZ2VUZXh0KHZhbHVlLCBjb250ZXh0LCBmb3JtKSA/PyAoa2V5d29yZCA/IGBcIiR7a2V5d29yZH1cImAgOiBudWxsKTtcbn1cblxuLy8gQSBkYXRlIHJhbmdlOiBhIGxpdmUgcHJlc2V0IGJ5IGl0cyBuYW1lICh3aXRoIGl0cyBkYXlzIGluIGEgbGluZSksIGVsc2Vcbi8vIGl0cyB0d28gZGF5cyAoJ+KApicgZm9yIGFuIG9wZW4gZW5kKS5cbmZ1bmN0aW9uIGRhdGVUZXh0KHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlLCBjb250ZXh0OiBSZXBvcnRGaWx0ZXJMaW5lQ29udGV4dCwgZm9ybTogUmVwb3J0RmlsdGVyTGluZUZvcm0pOiBzdHJpbmcge1xuICBpZiAoY29udGV4dC5wcmVzZXQpIHtcbiAgICBjb25zdCBuYW1lID0gcmVsYXRpdmVMYWJlbChjb250ZXh0LnByZXNldCk7XG4gICAgY29uc3QgZGF5cyA9IGZvcm0gPT09ICdsaW5lJ1xuICAgICAgPyBmb3JtYXREYXlSYW5nZShkYXRlQm91bmRTdHJpbmcodmFsdWUuc3RhcnQpLCBkYXRlQm91bmRTdHJpbmcodmFsdWUuZW5kKSwgY29udGV4dC5sb2NhbGUpXG4gICAgICA6ICcnO1xuXG4gICAgcmV0dXJuIGRheXMgPyBgJHtuYW1lfSAoJHtkYXlzfSlgIDogbmFtZTtcbiAgfVxuXG4gIHJldHVybiBgJHtkYXRlQm91bmRMYWJlbCh2YWx1ZS5zdGFydCwgY29udGV4dC5sb2NhbGUpID8/ICfigKYnfSDigJMgJHtkYXRlQm91bmRMYWJlbCh2YWx1ZS5lbmQsIGNvbnRleHQubG9jYWxlKSA/PyAn4oCmJ31gO1xufVxuXG4vLyBUaGUgdmFsdWVzIGEgc2VsZWN0IGxlYXZlcyBvdXQuIEEgbGluZSBzYXlzIHdoYXQgaGFwcGVucyB0byB0aGUgcm93cyB3aXRoXG4vLyBubyB2YWx1ZTogdGhleSBzdGF5LCB1bmxlc3MgdGhlIGdyb3VwJ3MgYmxhbmsgbGFiZWwgaXMgb25lIG9mIHRoZSB2YWx1ZXNcbi8vIGxlZnQgb3V0LiBXaGlsZSB0aGUgYmxhbmsgbGFiZWwgaXMgdW5rbm93biAodW5kZWZpbmVkKSB0aGUgbGluZSBzYXlzXG4vLyBub3RoaW5nIGFib3V0IHRoZW06IGEgYmxhbmsgbGFiZWwgYW1vbmcgdGhlIHBpY2tzIHdvdWxkIG1ha2UgJ2FyZSBrZXB0J1xuLy8gZmFsc2UuXG5mdW5jdGlvbiBleGNsdWRlVGV4dChcbiAgbGFiZWw6IHN0cmluZyxcbiAgdmFsdWVzOiB1bmtub3duW10sXG4gIGNvbnRleHQ6IFJlcG9ydEZpbHRlckxpbmVDb250ZXh0LFxuICBmb3JtOiBSZXBvcnRGaWx0ZXJMaW5lRm9ybSxcbik6IHN0cmluZyB7XG4gIGNvbnN0IHRleHQgPSBwaWNrTmFtZXModmFsdWVzLCBjb250ZXh0KS5qb2luKCcsICcpO1xuICBjb25zdCBibGFua0xhYmVsID0gY29udGV4dC5ibGFua0xhYmVsO1xuXG4gIGlmIChmb3JtID09PSAnY2hpcCcgfHwgYmxhbmtMYWJlbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICBjb25zdCBibGFuayA9IGJsYW5rTGFiZWwgIT09IG51bGwgJiYgdmFsdWVzLnNvbWUoKHZhbHVlKSA9PiBTdHJpbmcodmFsdWUpID09PSBibGFua0xhYmVsKTtcblxuICByZXR1cm4gYCR7dGV4dH0gKHJvd3Mgd2l0aCBubyAke2xhYmVsfSAke2JsYW5rID8gJ2FyZSBsZWZ0IG91dCcgOiAnYXJlIGtlcHQnfSlgO1xufVxuXG4vLyBBIG51bWJlciByYW5nZSdzIGVuZHMgaW4gdGhlIHJlcG9ydCdzIGxvY2FsZSwgb3IgbnVsbCB3aXRoIG5laXRoZXIuXG5mdW5jdGlvbiByYW5nZVRleHQodmFsdWU6IEZpbHRlckdyb3VwVmFsdWUsIGNvbnRleHQ6IFJlcG9ydEZpbHRlckxpbmVDb250ZXh0LCBmb3JtOiBSZXBvcnRGaWx0ZXJMaW5lRm9ybSk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBtaW4gPSBmaW5pdGVOdW1iZXIodmFsdWUubWluKTtcbiAgY29uc3QgbWF4ID0gZmluaXRlTnVtYmVyKHZhbHVlLm1heCk7XG4gIGNvbnN0IHdyaXRlID0gKGVuZDogbnVtYmVyKSA9PiBmb3JtYXRQbGFpbk51bWJlcihlbmQsIGNvbnRleHQubG9jYWxlKTtcblxuICBpZiAobWluICE9PSB1bmRlZmluZWQgJiYgbWF4ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gYCR7d3JpdGUobWluKX0gdG8gJHt3cml0ZShtYXgpfSR7Zm9ybSA9PT0gJ2xpbmUnID8gJyAoYm90aCBpbmNsdWRlZCknIDogJyd9YDtcbiAgfVxuXG4gIGlmIChtaW4gIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBgJHt3cml0ZShtaW4pfSBvciBtb3JlYDtcbiAgfVxuXG4gIHJldHVybiBtYXggIT09IHVuZGVmaW5lZCA/IGAke3dyaXRlKG1heCl9IG9yIGxlc3NgIDogbnVsbDtcbn1cblxuLy8gVGhlIHBpY2tzJyBuYW1lczogdGhlIG9uZXMgdGhlIGNhbGxlciByZXNvbHZlZCwgZWxzZSBlYWNoIHBpY2sgYXMgc3RvcmVkLlxuZnVuY3Rpb24gcGlja05hbWVzKHZhbHVlczogdW5rbm93bltdLCBjb250ZXh0OiBSZXBvcnRGaWx0ZXJMaW5lQ29udGV4dCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgbmFtZXMgPSBjb250ZXh0Lm5hbWVzO1xuXG4gIHJldHVybiB2YWx1ZXMubWFwKCh2YWx1ZSwgaW5kZXgpID0+IG5hbWVzPy5baW5kZXhdID8/IFN0cmluZyh2YWx1ZSkpO1xufVxuXG4vLyBPbmUgZ3JvdXAncyBsaW5lLCBvbmNlIGl0cyBwaWNrcyBhcmUgbmFtZWQuIEFuIGV4Y2x1ZGUgbGluZSBzYXlzIHdoYXRcbi8vIGhhcHBlbnMgdG8gdGhlIGJsYW5rIHJvd3MgZnJvbSB0aGUgZ3JvdXAncyBibGFuayBsYWJlbCwgd2hpY2ggdGhlIHNlcnZlclxuLy8gc2VuZHMgb24gYSBzZWxlY3QgZ3JvdXAgKG51bGw6IGJsYW5rIHJvd3MgaGF2ZSBub25lKS4gQW4gb2xkZXIgc2VydmVyXG4vLyBzZW5kcyBub25lLCBhbmQgdGhlIGxpbmUgdGhlbiBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlbS5cbmZ1bmN0aW9uIGdyb3VwTGluZShncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsIGlucHV0OiBSZXBvcnRFeHBvcnRMaW5lc0lucHV0KTogT2JzZXJ2YWJsZTxSZXBvcnRFeHBvcnRMaW5lIHwgbnVsbD4ge1xuICBjb25zdCBzbmFwc2hvdCA9IGlucHV0LnNuYXBzaG90O1xuICBjb25zdCB2YWx1ZSA9IHNuYXBzaG90LnZhbHVlc1tncm91cC5pZF07XG5cbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiBvZihudWxsKTtcbiAgfVxuXG4gIGNvbnN0IHBpY2tzID0gdmFsdWVQaWNrcyh2YWx1ZSk7XG4gIGNvbnN0IG5hbWVzJCA9IHBpY2tzLmxlbmd0aFxuICAgID8gaW5wdXQubmFtZXMoZ3JvdXAsIHBpY2tzKS5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpKVxuICAgIDogb2YobnVsbCk7XG5cbiAgcmV0dXJuIG5hbWVzJC5waXBlKFxuICAgIG1hcCgobmFtZXMpOiBSZXBvcnRFeHBvcnRMaW5lIHwgbnVsbCA9PiB7XG4gICAgICBjb25zdCB0ZXh0ID0gZmlsdGVyTGluZVRleHQoZ3JvdXAsIHZhbHVlLCB7XG4gICAgICAgIGxvY2FsZTogc25hcHNob3QuZm9ybWF0Q29udGV4dC5sb2NhbGUsXG4gICAgICAgIG5hbWVzLFxuICAgICAgICBwcmVzZXQ6IHNuYXBzaG90LnByZXNldHNbZ3JvdXAuaWRdID8/IG51bGwsXG4gICAgICAgIHBhZ2VOYW1lOiBwYWdlTmFtZShpbnB1dC5yZXBvcnQsIGdyb3VwLnBhZ2VJZCksXG4gICAgICAgIGJsYW5rTGFiZWw6IGdyb3VwLmJsYW5rTGFiZWwsXG4gICAgICB9LCAnbGluZScpO1xuXG4gICAgICByZXR1cm4gdGV4dCA/IHsga2luZDogJ2dyb3VwJywgdGV4dCwgZ3JvdXBJZDogZ3JvdXAuaWQgfSA6IG51bGw7XG4gICAgfSksXG4gICk7XG59XG5cbi8vIFRoZSBncm91cC1ieSBncmFpbiB1bmRlciB0aGUgcmVwb3J0J3Mgb3duIG5hbWUgZm9yIHRoZSBjb250cm9sLCBvciBudWxsXG4vLyB3aGlsZSBubyBncmFpbiBpcyBwaWNrZWQuXG5mdW5jdGlvbiBncm91cEJ5TGluZShpbnB1dDogUmVwb3J0RXhwb3J0TGluZXNJbnB1dCk6IFJlcG9ydEV4cG9ydExpbmUgfCBudWxsIHtcbiAgY29uc3QgZnJlcXVlbmN5ID0gaW5wdXQuc25hcHNob3QuZnJlcXVlbmN5O1xuXG4gIGlmICghZnJlcXVlbmN5KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBvcHRpb24gPSBHUkFOVUxBUklUWV9PUFRJT05TLmZpbmQoKGl0ZW0pID0+IGl0ZW0udmFsdWUgPT09IGZyZXF1ZW5jeSk7XG4gIGNvbnN0IGxhYmVsID0gaW5wdXQucmVwb3J0LmNvbmZpZz8uZ3JvdXBCeT8ubGFiZWwgfHwgR1JPVVBfQllfTEFCRUw7XG5cbiAgcmV0dXJuIHsga2luZDogJ2dyb3VwQnknLCB0ZXh0OiBgJHtsYWJlbH06ICR7b3B0aW9uPy5uYW1lID8/IGZyZXF1ZW5jeX1gIH07XG59XG5cbi8vIE9uZSBsaW5lIHBlciBkcmlsbGVkIGNoYXJ0IG9mIHRoZSBleHBvcnQncyBwYWdlcywgd2hpbGUgdGhlIHNlcnZlciBkcmlsbHMuXG5mdW5jdGlvbiBkcmlsbExpbmVzKGlucHV0OiBSZXBvcnRFeHBvcnRMaW5lc0lucHV0KTogUmVwb3J0RXhwb3J0TGluZVtdIHtcbiAgY29uc3QgeyByZXBvcnQsIHNuYXBzaG90LCBwYWdlSWQgfSA9IGlucHV0O1xuXG4gIGlmICghc25hcHNob3QuZmVhdHVyZXMuaW5jbHVkZXMoJ2RyaWxsJykpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gKHJlcG9ydC5wYWdlcyA/PyBbXSlcbiAgICAuZmlsdGVyKChwYWdlKSA9PiAhcGFnZUlkIHx8IHBhZ2UuaWQgPT09IHBhZ2VJZClcbiAgICAuZmxhdE1hcCgocGFnZSkgPT4gcGFnZS5jb21wb25lbnRzID8/IFtdKVxuICAgIC5maWx0ZXIoKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LnR5cGUgPT09ICdjaGFydCcgJiYgISFzbmFwc2hvdC5zdGF0ZS50aWxlcz8uW2NvbXBvbmVudC5pZF0/LmRyaWxsPy5sZW5ndGgpXG4gICAgLm1hcCgoY29tcG9uZW50KTogUmVwb3J0RXhwb3J0TGluZSA9PiAoe1xuICAgICAga2luZDogJ2RyaWxsJyxcbiAgICAgIHRleHQ6IGRyaWxsTGluZVRleHQoXG4gICAgICAgIHsgdGl0bGU6IGlucHV0LnRpdGxlcz8uW2NvbXBvbmVudC5pZF0gPz8gY29tcG9uZW50LnRpdGxlIH0sXG4gICAgICAgIHNuYXBzaG90LnN0YXRlLnRpbGVzW2NvbXBvbmVudC5pZF0uZHJpbGwsXG4gICAgICAgIHNuYXBzaG90LmZvcm1hdENvbnRleHQsXG4gICAgICApLFxuICAgICAgY29tcG9uZW50SWQ6IGNvbXBvbmVudC5pZCxcbiAgICB9KSk7XG59XG5cbi8vIFRoZSB0aWxlcyBhIGdyb3VwJ3MgbWVtYmVycyBzaXQgb246IHRoZSBzZXJ2ZXIncyBsaXN0LCBlbHNlIHRoZSB0aWxlcyBvZlxuLy8gaXRzIGVuYWJsZWQgbWVtYmVycyAoYW4gb2xkZXIgc2VydmVyKS5cbmZ1bmN0aW9uIGdyb3VwTWVtYmVySWRzKGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCk6IG51bWJlcltdIHtcbiAgcmV0dXJuIGdyb3VwLmNvbXBvbmVudElkc1xuICAgID8/IChncm91cC5maWx0ZXJzID8/IFtdKS5maWx0ZXIoKG1lbWJlcikgPT4gbWVtYmVyLmVuYWJsZWQpLm1hcCgobWVtYmVyKSA9PiBtZW1iZXIuY29tcG9uZW50SWQpO1xufVxuXG4vLyBBIHBhZ2UncyBuYW1lIGFzIHRoZSBleHBvcnQgbmFtZXMgaXQgKCdQYWdlIDInIHdoZW4gaXQgaGFzIG5vbmUpLCBvciBudWxsXG4vLyBmb3Igbm8gcGFnZS5cbmZ1bmN0aW9uIHBhZ2VOYW1lKHJlcG9ydDogUmVwb3J0LCBwYWdlSWQ6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgaW5kZXggPSBwYWdlSWQgPyAocmVwb3J0LnBhZ2VzID8/IFtdKS5maW5kSW5kZXgoKHBhZ2UpID0+IHBhZ2UuaWQgPT09IHBhZ2VJZCkgOiAtMTtcblxuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gcmVwb3J0LnBhZ2VzW2luZGV4XS5uYW1lIHx8IGBQYWdlICR7aW5kZXggKyAxfWA7XG59XG4iXX0=
|
|
247
|
+
// One column filter of a table as a file prints it: 'Region: East, West',
|
|
248
|
+
// 'Exclude Region: North (rows with no Region are kept)', 'Customer: contains
|
|
249
|
+
// "smith"', 'Amount: 10 to 50 (both included)', 'Ordered: Jan 2026 to Mar
|
|
250
|
+
// 2026'. A key reads as its option's label, a blank key as (blank), known
|
|
251
|
+
// from the null key itself; past GRID_FILTER_NAMED picks the rest are
|
|
252
|
+
// counted. An exclude says what happens to the rows with no value: kept,
|
|
253
|
+
// unless a blank key is among the keys left out. Null for a filter that
|
|
254
|
+
// holds nothing.
|
|
255
|
+
export function gridFilterLineText(label, filter, field, locale) {
|
|
256
|
+
const exclude = !!filter.exclude;
|
|
257
|
+
const blanks = (excluded) => (exclude ? ` (rows with no ${label} ${excluded ? 'are left out' : 'are kept'})` : '');
|
|
258
|
+
const line = (text, excluded = false) => `${exclude ? 'Exclude ' : ''}${label}: ${text}${blanks(excluded)}`;
|
|
259
|
+
if (filter.keys?.length) {
|
|
260
|
+
const names = filter.keys.slice(0, GRID_FILTER_NAMED).map((key) => gridKeyName(key, field));
|
|
261
|
+
const more = filter.keys.length - names.length;
|
|
262
|
+
return line(`${names.join(', ')}${more > 0 ? ` and ${more} more` : ''}`, filter.keys.some((key) => key === null));
|
|
263
|
+
}
|
|
264
|
+
const contains = (filter.contains ?? '').trim();
|
|
265
|
+
if (contains) {
|
|
266
|
+
return `${label}: ${exclude ? 'doesn\'t contain' : 'contains'} "${contains}"${blanks(false)}`;
|
|
267
|
+
}
|
|
268
|
+
const isDate = field?.type === GridFieldType.Date;
|
|
269
|
+
const write = (end) => (isDate
|
|
270
|
+
? gridDateText(String(end), filter.granularity ?? field?.granularities?.[0], locale)
|
|
271
|
+
: formatPlainNumber(Number(end), locale));
|
|
272
|
+
const has = (end) => end !== undefined && end !== null && end !== '';
|
|
273
|
+
if (has(filter.from) && has(filter.to)) {
|
|
274
|
+
return line(`${write(filter.from)} to ${write(filter.to)}${exclude || isDate ? '' : ' (both included)'}`);
|
|
275
|
+
}
|
|
276
|
+
if (has(filter.from)) {
|
|
277
|
+
return line(`${write(filter.from)} ${isDate ? 'or later' : 'or more'}`);
|
|
278
|
+
}
|
|
279
|
+
return has(filter.to) ? line(`${write(filter.to)} ${isDate ? 'or earlier' : 'or less'}`) : null;
|
|
280
|
+
}
|
|
281
|
+
// A key as a column filter's line names it: its option's label, else itself.
|
|
282
|
+
function gridKeyName(key, field) {
|
|
283
|
+
if (key === null) {
|
|
284
|
+
return GRID_BLANK_KEY;
|
|
285
|
+
}
|
|
286
|
+
return field?.options?.find((option) => option.key !== null && String(option.key) === String(key))?.label ?? String(key);
|
|
287
|
+
}
|
|
288
|
+
// A date end at the grain the filter reads: 'Jan 2026', 'Q1 2026', '2026',
|
|
289
|
+
// else the day.
|
|
290
|
+
function gridDateText(value, granularity, locale) {
|
|
291
|
+
const match = /^(\d{4})-(\d{2})/.exec(value);
|
|
292
|
+
if (!match) {
|
|
293
|
+
return value;
|
|
294
|
+
}
|
|
295
|
+
const year = Number(match[1]);
|
|
296
|
+
const month = Number(match[2]);
|
|
297
|
+
switch (granularity) {
|
|
298
|
+
case GridGranularity.Year:
|
|
299
|
+
return String(year);
|
|
300
|
+
case GridGranularity.Quarter:
|
|
301
|
+
return `Q${Math.ceil(month / 3)} ${year}`;
|
|
302
|
+
case GridGranularity.Month:
|
|
303
|
+
return new Intl.DateTimeFormat(locale, { month: 'short', year: 'numeric', timeZone: 'UTC' })
|
|
304
|
+
.format(new Date(Date.UTC(year, month - 1, 1)));
|
|
305
|
+
default:
|
|
306
|
+
return dateBoundLabel(value, locale) ?? value;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZpbHRlci1saW5lcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9leHBvcnQvcmVwb3J0LWZpbHRlci1saW5lcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWEsYUFBYSxFQUFjLGVBQWUsRUFBVyxNQUFNLGtCQUFrQixDQUFDO0FBRWxHLE9BQU8sRUFBYyxRQUFRLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFakQsT0FBTyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFPOUQsT0FBTyxFQUVMLG1CQUFtQixHQUtwQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3hGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHL0MsMkVBQTJFO0FBQzNFLDREQUE0RDtBQUM1RCw0RUFBNEU7QUFDNUUseUVBQXlFO0FBQ3pFLDRFQUE0RTtBQUc1RSwwRUFBMEU7QUFDMUUsc0VBQXNFO0FBQ3RFLG9CQUFvQjtBQUNwQixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsbUJBQW1CLENBQUM7QUFDbEQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLHNDQUFzQyxDQUFDO0FBRXJFLDJFQUEyRTtBQUMzRSx5QkFBeUI7QUFDekIsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLG9CQUFvQixDQUFDO0FBRW5ELG9DQUFvQztBQUNwQyxNQUFN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QUFDLEtBQUs7WUFDeEIsT0FBTyxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQztpQkFDekYsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BEO1lBQ0UsT0FBTyxjQUFjLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQztJQUNsRCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdyaWRGaWVsZCwgR3JpZEZpZWxkVHlwZSwgR3JpZEZpbHRlciwgR3JpZEdyYW51bGFyaXR5LCBHcmlkS2V5IH0gZnJvbSAnQGZpcmVzdGl0Y2gvZ3JpZCc7XG5cbmltcG9ydCB7IE9ic2VydmFibGUsIGZvcmtKb2luLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBjcnVtYmVkVGl0bGUsIGRyaWxsQ3J1bWJMYWJlbHMgfSBmcm9tICcuLi9kcmlsbC1jcnVtYnMnO1xuaW1wb3J0IHsgZm9ybWF0RGF5UmFuZ2UsIGZvcm1hdFBsYWluTnVtYmVyIH0gZnJvbSAnLi4vZm9ybWF0JztcbmltcG9ydCB7IFJlcG9ydERyaWxsU3RlcCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LWRyaWxsLXN0ZXAuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydEV4cG9ydExpbmUgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1leHBvcnQtbGluZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0RXhwb3J0TGluZXNJbnB1dCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LWV4cG9ydC1saW5lcy1pbnB1dC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyTGluZUNvbnRleHQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC1maWx0ZXItbGluZS1jb250ZXh0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJMaW5lRm9ybSB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LWZpbHRlci1saW5lLWZvcm0udHlwZSc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJNYXRjaCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LWZpbHRlci1tYXRjaC50eXBlJztcbmltcG9ydCB7XG4gIEZpbHRlckdyb3VwVmFsdWUsXG4gIEdSQU5VTEFSSVRZX09QVElPTlMsXG4gIFJlcG9ydCxcbiAgUmVwb3J0Q29tcG9uZW50LFxuICBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgUmVwb3J0Rm9ybWF0Q29udGV4dCxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IGRhdGVCb3VuZExhYmVsLCBkYXRlQm91bmRTdHJpbmcsIHJlbGF0aXZlTGFiZWwgfSBmcm9tICcuLi9yZXBvcnQtZmlsdGVyLWl0ZW1zJztcbmltcG9ydCB7IGlzVGlsZSB9IGZyb20gJy4uL3JlcG9ydC10aWxlJztcbmltcG9ydCB7IGZpbml0ZU51bWJlciB9IGZyb20gJy4uL3JlcG9ydC1zdGF0ZSc7XG5cblxuLy8gVGhlIHdvcmRzIGEgZmlsZSB1c2VzIGZvciB3aGF0IHRoZSBzY3JlZW4gaGVsZDogZWFjaCBmaWx0ZXIncyB2YWx1ZSwgdGhlXG4vLyBncm91cC1ieSBncmFpbiwgYSBkcmlsbGVkIHRpbGUgYW5kIHRoZSBtYXRjaC4gVGhlIFBERiBhbmRcbi8vIFBvd2VyUG9pbnQgY292ZXJzIHByaW50IHRoZXNlIGxpbmVzLCBhbmQgdGhlIHppcCBzZW5kcyB0aGVtIChmaWx0ZXJMaW5lcyxcbi8vIHdpdGggZmlsdGVyU3VtbWFyeSBhcyB0aGVpciB0ZXh0IGZvciBhbiBvbGRlciBzZXJ2ZXIpLCBzbyBldmVyeSBleHBvcnRcbi8vIHdvcmRzIG9uZSBmaWx0ZXIgb25lIHdheS4gUHVyZSwgc28gdGhlIG5vZGUgaGFybmVzcyBjaGVja3MgZXZlcnkgd29yZGluZy5cblxuXG4vLyBUaGUgbWF0Y2ggd2hpbGUgdGhlIHJlcG9ydCBiYXIncyBmaWx0ZXJzIGNvbWJpbmUgd2l0aCAnYW55JzogdGhlIGNoaXAnc1xuLy8gd29yZHMsIGFuZCB0aGUgY292ZXIncyBsaW5lLiBUaGUgemlwJ3Mgbm90ZXMgY2FycnkgdGhlIHNlcnZlcidzIG93blxuLy8gc2VudGVuY2UgaW5zdGVhZC5cbmV4cG9ydCBjb25zdCBNQVRDSF9BTllfQ0hJUCA9ICdNYXRjaDogYW55IGZpbHRlcic7XG5leHBvcnQgY29uc3QgTUFUQ0hfQU5ZX0xJTkUgPSAnRmlsdGVycyBpbiB0aGUgcmVwb3J0IGJhcjogbWF0Y2ggYW55JztcblxuLy8gVGhlIHJlcG9ydCBiYXIncyBNYXRjaCBjaGlwIHdoaWxlIHRoZSBmaWx0ZXJzIGNvbWJpbmUgd2l0aCAnYWxsJy4gQSBmaWxlXG4vLyBwcmludHMgbm8gbGluZSBmb3IgaXQuXG5leHBvcnQgY29uc3QgTUFUQ0hfQUxMX0NISVAgPSAnTWF0Y2g6IGFsbCBmaWx0ZXJzJztcblxuLy8gQSBncm91cCdzIGxhYmVsIHdoZW4gaXQgaGFzIG5vbmUuXG5jb25zdCBVTkxBQkVMRURfR1JPVVAgPSAnRmlsdGVyJztcblxuLy8gSG93IG1hbnkgcGlja3MgYSBjb2x1bW4gZmlsdGVyJ3MgbGluZSBuYW1lcyBiZWZvcmUgJ2FuZCBOIG1vcmUnLlxuY29uc3QgR1JJRF9GSUxURVJfTkFNRUQgPSAxMDtcblxuLy8gV2hhdCBhIGJsYW5rIGtleSByZWFkcyBhcyBpbiBhIGNvbHVtbiBmaWx0ZXIncyBsaW5lLlxuY29uc3QgR1JJRF9CTEFOS19LRVkgPSAnKGJsYW5rKSc7XG5cbi8vIFRoZSBsYWJlbCBvZiB0aGUgZ3JvdXAtYnkgbGluZSB3aGVuIHRoZSByZXBvcnQgbmFtZXMgbm8gY29udHJvbC5cbmNvbnN0IEdST1VQX0JZX0xBQkVMID0gJ0dyb3VwIEJ5JztcblxuXG4vLyBPbmUgZmlsdGVyIGdyb3VwJ3MgdmFsdWUgYXMgdGV4dCAoJ1JlZ2lvbjogV2VzdCwgRWFzdCcpLCBvciBudWxsIHdoZW4gdGhlXG4vLyB2YWx1ZSBob2xkcyBub3RoaW5nLiBWYWx1ZXMgbGVmdCBvdXQgc2F5IHNvIGJlZm9yZSB0aGUgbGFiZWw6ICdFeGNsdWRlXG4vLyBSZWdpb246IFdlc3QsIEVhc3QnLiAnY2hpcCcgaXMgdGhlIHNob3J0IGZvcm07ICdsaW5lJyBhZGRzIHdoYXQgYSBmaWxlXG4vLyByZWFkZXIgY2Fubm90IHNlZSBvbiBzY3JlZW46XG4vLyAtIGV4Y2x1ZGU6ICdFeGNsdWRlIFJlZ2lvbjogV2VzdCwgRWFzdCAocm93cyB3aXRoIG5vIFJlZ2lvbiBhcmUga2VwdCknLCBvclxuLy8gICAnLi4uIGFyZSBsZWZ0IG91dCcgd2hlbiB0aGUgYmxhbmsgbGFiZWwgKGNvbnRleHQuYmxhbmtMYWJlbCkgaXMgb25lIG9mXG4vLyAgIHRoZSB2YWx1ZXMgbGVmdCBvdXQuIFdpdGhvdXQgYSBrbm93biBibGFuayBsYWJlbCB0aGUgbGluZSBzYXlzIG5vdGhpbmdcbi8vICAgYWJvdXQgdGhlIGJsYW5rIHJvd3M7XG4vLyAtIHJhbmdlOiAnQW1vdW50OiAxMCB0byA1MCAoYm90aCBpbmNsdWRlZCknOyBhbiBvcGVuIGVuZCByZWFkcyAnMTAgb3Jcbi8vICAgbW9yZScgb3IgJzUwIG9yIGxlc3MnIGluIGJvdGggZm9ybXM7XG4vLyAtIGEgbGl2ZSBwcmVzZXQ6ICdSZXBvcnQgUGVyaW9kOiBMYXN0IDMwIGRheXMgKFNlcCAzIOKAkyBPY3QgMiwgMjAyNiknO1xuLy8gLSBhIHBhZ2UgZ3JvdXA6ICdDb2hvcnQgKHBhZ2UgXCJSZXRlbnRpb25cIiBvbmx5KTogMjAyNScuXG4vLyBOdW1iZXJzIGFuZCBkYXRlcyBhcmUgd3JpdHRlbiBpbiB0aGUgcmVwb3J0J3MgbG9jYWxlLCBhbmQgMCBpcyBhIG51bWJlclxuLy8gbGlrZSBhbnkgb3RoZXIuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyTGluZVRleHQoXG4gIGdyb3VwOiBQaWNrPFJlcG9ydEZpbHRlckdyb3VwLCAnbGFiZWwnIHwgJ2xldmVsJz4sXG4gIHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgY29udGV4dDogUmVwb3J0RmlsdGVyTGluZUNvbnRleHQsXG4gIGZvcm06IFJlcG9ydEZpbHRlckxpbmVGb3JtLFxuKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGxhYmVsID0gZ3JvdXAubGFiZWwgfHwgVU5MQUJFTEVEX0dST1VQO1xuICBjb25zdCB0ZXh0ID0gdmFsdWUgPyB2YWx1ZVRleHQobGFiZWwsIHZhbHVlLCBjb250ZXh0LCBmb3JtKSA6IG51bGw7XG5cbiAgaWYgKHRleHQgPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IHBhZ2VPbmx5ID0gZm9ybSA9PT0gJ2xpbmUnICYmIGdyb3VwLmxldmVsID09PSAncGFnZScgJiYgY29udGV4dC5wYWdlTmFtZTtcbiAgY29uc3QgbmFtZSA9IHBhZ2VPbmx5ID8gYCR7bGFiZWx9IChwYWdlIFwiJHtjb250ZXh0LnBhZ2VOYW1lfVwiIG9ubHkpYCA6IGxhYmVsO1xuXG4gIHJldHVybiBgJHtleGNsdWRlcyh2YWx1ZSkgPyAnRXhjbHVkZSAnIDogJyd9JHtuYW1lfTogJHt0ZXh0fWA7XG59XG5cbi8vIFRoZSB3b3JkcyBvZiBvbmUgZmlsdGVyJ3MgdmFsdWUgYXMgaXRzIGNoaXAgcmVhZHMgdGhlbSBhZnRlciB0aGUgbGFiZWxcbi8vICgnV2VzdCwgRWFzdCcsICcwIHRvIDEwJywgJzAgb3IgbW9yZScsICc1MCBvciBsZXNzJyksIG9yIG51bGwgd2hlbiB0aGVcbi8vIHZhbHVlIGhvbGRzIG5vdGhpbmcuIFZhbHVlcyBsZWZ0IG91dCByZWFkIGFzIHRoZWlyIG5hbWVzOiBmaWx0ZXJMaW5lVGV4dFxuLy8gcHV0cyAnRXhjbHVkZScgYmVmb3JlIHRoZSBsYWJlbCwgYW5kIGEge3tmaWx0ZXIuPGlkPn19IHRva2VuIHJlYWRzIHRoZW0gYXNcbi8vICdBbGwgZXhjZXB0IFdlc3QnLiBUaGUgb25lIHNvdXJjZSBvZiB0aGVzZSB3b3Jkcywgc28gdGhlIGNoaXAsIGEgZmlsZSdzXG4vLyBjb3ZlciBhbmQgYSB0b2tlbiBuZXZlciB3b3JkIGEgdmFsdWUgdHdvIHdheXMuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVyQ2hpcFZhbHVlVGV4dChcbiAgdmFsdWU6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkLFxuICBjb250ZXh0OiBSZXBvcnRGaWx0ZXJMaW5lQ29udGV4dCxcbik6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gdmFsdWUgPyB2YWx1ZVRleHQoJycsIHZhbHVlLCBjb250ZXh0LCAnY2hpcCcpIDogbnVsbDtcbn1cblxuLy8gV2hldGhlciBhIHZhbHVlIGlzIHdvcmRlZCBhcyB2YWx1ZXMgbGVmdCBvdXQ6IHRoZSBzYW1lIG9yZGVyIHZhbHVlVGV4dFxuLy8gcmVhZHMgYSB2YWx1ZSBpbiwgc28gYSB2YWx1ZSB3aXRoIGRheXMgb3Iga2VwdCBwaWNrcyBpcyBuZXZlciBvbmUuXG5leHBvcnQgZnVuY3Rpb24gZXhjbHVkZXModmFsdWU6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIXZhbHVlICYmICF2YWx1ZS5zdGFydCAmJiAhdmFsdWUuZW5kICYmICF2YWx1ZS52YWx1ZXM/Lmxlbmd0aCAmJiAhIXZhbHVlLmV4Y2x1ZGVWYWx1ZXM/Lmxlbmd0aDtcbn1cblxuLy8gVGhlIHBpY2tzIGEgdmFsdWUgbmFtZXMsIGtlcHQgb3IgbGVmdCBvdXQsIGluIHBpY2sgb3JkZXI6IHdoYXQgYSBzZWxlY3Qnc1xuLy8gbmFtZXMgYXJlIHJlYWQgZm9yLiBOb25lIGZvciBhIGRhdGUgcmFuZ2UuXG5leHBvcnQgZnVuY3Rpb24gdmFsdWVQaWNrcyh2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQpOiB1bmtub3duW10ge1xuICBpZiAoIXZhbHVlIHx8IHZhbHVlLnN0YXJ0IHx8IHZhbHVlLmVuZCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZS52YWx1ZXM/Lmxlbmd0aCA/IHZhbHVlLnZhbHVlcyA6IHZhbHVlLmV4Y2x1ZGVWYWx1ZXMgPz8gW107XG59XG5cbi8vIFRoZSBtYXRjaCBhcyB0ZXh0IHdoaWxlIGl0IGlzICdhbnknLCBlbHNlIG51bGw7IHRoZSBjaGlwIGFsc28gd29yZHMgJ2FsbCcuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hMaW5lVGV4dChtYXRjaDogUmVwb3J0RmlsdGVyTWF0Y2ggfCBudWxsIHwgdW5kZWZpbmVkLCBmb3JtOiBSZXBvcnRGaWx0ZXJMaW5lRm9ybSk6IHN0cmluZyB8IG51bGwge1xuICBpZiAobWF0Y2ggIT09ICdhbnknKSB7XG4gICAgcmV0dXJuIGZvcm0gPT09ICdjaGlwJyAmJiBtYXRjaCA9PT0gJ2FsbCcgPyBNQVRDSF9BTExfQ0hJUCA6IG51bGw7XG4gIH1cblxuICByZXR1cm4gZm9ybSA9PT0gJ2NoaXAnID8gTUFUQ0hfQU5ZX0NISVAgOiBNQVRDSF9BTllfTElORTtcbn1cblxuLy8gQSBkcmlsbGVkIHRpbGUncyBsaW5lOiBpdHMgdGl0bGUgYW5kIHRoZSBicmVhZGNydW1iIG9mIGl0cyBwYXRoLCBpbiB0aGVcbi8vIHJlcG9ydCdzIGxvY2FsZSAoJ1JldmVudWUgYnkgUGVyaW9kIOKAuiAyMDI2IOKAuiBRMycpLlxuZXhwb3J0IGZ1bmN0aW9uIGRyaWxsTGluZVRleHQoXG4gIGNvbXBvbmVudDogUGljazxSZXBvcnRDb21wb25lbnQsICd0aXRsZSc+LFxuICBwYXRoOiByZWFkb25seSBSZXBvcnREcmlsbFN0ZXBbXSxcbiAgZm9ybWF0Q29udGV4dDogUGljazxSZXBvcnRGb3JtYXRDb250ZXh0LCAnbG9jYWxlJz4sXG4pOiBzdHJpbmcge1xuICByZXR1cm4gY3J1bWJlZFRpdGxlKGNvbXBvbmVudC50aXRsZSwgZHJpbGxDcnVtYkxhYmVscyhwYXRoLCBmb3JtYXRDb250ZXh0KSk7XG59XG5cbi8vIFRoZSBmaWx0ZXIgbGluZXMgb2YgYW4gZXhwb3J0LCBpbiBvcmRlcjogb25lIHBlciBmaWx0ZXIgZ3JvdXAgd2l0aCBhXG4vLyB2YWx1ZSAodGhlIHJlcG9ydCdzIGdyb3VwIG9yZGVyKSwgdGhlIGdyb3VwLWJ5IGxpbmUsIHRoZW4gb25lIHBlciBkcmlsbGVkXG4vLyBjaGFydCAocGFnZSBvcmRlcikuIEEgVGhpcyBQYWdlIGV4cG9ydCAoaW5wdXQucGFnZUlkKSBsaXN0cyBvbmx5IHRoZVxuLy8gZ3JvdXBzIHRoYXQgcmVhY2ggYSB0aWxlIG9mIHRoYXQgcGFnZSwgYW5kIG9ubHkgdGhhdCBwYWdlJ3MgZHJpbGxlZFxuLy8gY2hhcnRzLiBBIHNlbGVjdCdzIG5hbWVzIGFyZSBhIHJlcXVlc3QsIHNvIHRoZSBsaW5lcyBhcnJpdmUgdG9nZXRoZXIgb25jZVxuLy8gZXZlcnkgbmFtZSBpcyBrbm93bjsgYSBmYWlsZWQgbmFtZSByZWFkIHdyaXRlcyB0aGUgcGlja3MgYXMgdGhleSBhcmVcbi8vIHN0b3JlZC5cbmV4cG9ydCBmdW5jdGlvbiBleHBvcnRMaW5lcyhpbnB1dDogUmVwb3J0RXhwb3J0TGluZXNJbnB1dCk6IE9ic2VydmFibGU8UmVwb3J0RXhwb3J0TGluZVtdPiB7XG4gIGNvbnN0IGdyb3VwcyQgPSBleHBvcnRHcm91cHMoaW5wdXQucmVwb3J0LCBpbnB1dC5wYWdlSWQpXG4gICAgLm1hcCgoZ3JvdXApID0+IGdyb3VwTGluZShncm91cCwgaW5wdXQpKTtcbiAgY29uc3QgcmVzdCA9IFtncm91cEJ5TGluZShpbnB1dCksIC4uLmRyaWxsTGluZXMoaW5wdXQpXVxuICAgIC5maWx0ZXIoKGxpbmUpOiBsaW5lIGlzIFJlcG9ydEV4cG9ydExpbmUgPT4gbGluZSAhPT0gbnVsbCk7XG5cbiAgcmV0dXJuIChncm91cHMkLmxlbmd0aCA/IGZvcmtKb2luKGdyb3VwcyQpIDogb2YoW10pKVxuICAgIC5waXBlKFxuICAgICAgbWFwKChsaW5lcykgPT4gW1xuICAgICAgICAuLi5saW5lcy5maWx0ZXIoKGxpbmUpOiBsaW5lIGlzIFJlcG9ydEV4cG9ydExpbmUgPT4gbGluZSAhPT0gbnVsbCksXG4gICAgICAgIC4uLnJlc3QsXG4gICAgICBdKSxcbiAgICApO1xufVxuXG4vLyBUaGUgZ3JvdXBzIGFuIGV4cG9ydCdzIGxpbmVzIG1heSBuYW1lOiBldmVyeSBncm91cCwgb3IgZm9yIGEgVGhpcyBQYWdlXG4vLyBleHBvcnQgdGhlIGdyb3VwcyB3aXRoIGEgbWVtYmVyIHRpbGUgb24gdGhhdCBwYWdlLiBBIHBhZ2UgZ3JvdXAgcmVhY2hlc1xuLy8gb25seSBpdHMgb3duIHBhZ2UuXG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0R3JvdXBzKHJlcG9ydDogUmVwb3J0LCBwYWdlSWQ6IG51bWJlciB8IG51bGwpOiBSZXBvcnRGaWx0ZXJHcm91cFtdIHtcbiAgY29uc3QgZ3JvdXBzID0gcmVwb3J0LmZpbHRlckdyb3VwcyA/PyBbXTtcblxuICBpZiAoIXBhZ2VJZCkge1xuICAgIHJldHVybiBncm91cHM7XG4gIH1cblxuICBjb25zdCBwYWdlID0gKHJlcG9ydC5wYWdlcyA/PyBbXSkuZmluZCgoY2FuZGlkYXRlKSA9PiBjYW5kaWRhdGUuaWQgPT09IHBhZ2VJZCk7XG4gIGNvbnN0IHRpbGVJZHMgPSAocGFnZT8uY29tcG9uZW50cyA/PyBbXSlcbiAgICAuZmlsdGVyKChjb21wb25lbnQpID0+IGlzVGlsZShjb21wb25lbnQpKVxuICAgIC5tYXAoKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LmlkKTtcblxuICByZXR1cm4gZ3JvdXBzLmZpbHRlcigoZ3JvdXApID0+IChncm91cC5sZXZlbCAhPT0gJ3BhZ2UnIHx8IGdyb3VwLnBhZ2VJZCA9PT0gcGFnZUlkKVxuICAgICYmIGdyb3VwTWVtYmVySWRzKGdyb3VwKS5zb21lKChjb21wb25lbnRJZCkgPT4gdGlsZUlkcy5pbmNsdWRlcyhjb21wb25lbnRJZCkpKTtcbn1cblxuLy8gVGhlIHRleHQgYWZ0ZXIgdGhlIGxhYmVsLCBvciBudWxsIHdoZW4gdGhlIHZhbHVlIGhvbGRzIG5vdGhpbmcuXG5mdW5jdGlvbiB2YWx1ZVRleHQoXG4gIGxhYmVsOiBzdHJpbmcsXG4gIHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlLFxuICBjb250ZXh0OiBSZXBvcnRGaWx0ZXJMaW5lQ29udGV4dCxcbiAgZm9ybTogUmVwb3J0RmlsdGVyTGluZUZvcm0sXG4pOiBzdHJpbmcgfCBudWxsIHtcbiAgaWYgKHZhbHVlLnN0YXJ0IHx8IHZhbHVlLmVuZCkge1xuICAgIHJldHVybiBkYXRlVGV4dCh2YWx1ZSwgY29udGV4dCwgZm9ybSk7XG4gIH1cblxuICBpZiAodmFsdWUudmFsdWVzPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gcGlja05hbWVzKHZhbHVlLnZhbHVlcywgY29udGV4dCkuam9pbignLCAnKTtcbiAgfVxuXG4gIGlmICh2YWx1ZS5leGNsdWRlVmFsdWVzPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gZXhjbHVkZVRleHQobGFiZWwsIHZhbHVlLmV4Y2x1ZGVWYWx1ZXMsIGNvbnRleHQsIGZvcm0pO1xuICB9XG5cbiAgY29uc3Qga2V5d29yZCA9IHR5cGVvZiB2YWx1ZS52YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS52YWx1ZS50cmltKCkgOiAnJztcblxuICByZXR1cm4gcmFuZ2VUZXh0KHZhbHVlLCBjb250ZXh0LCBmb3JtKSA/PyAoa2V5d29yZCA/IGBcIiR7a2V5d29yZH1cImAgOiBudWxsKTtcbn1cblxuLy8gQSBkYXRlIHJhbmdlOiBhIGxpdmUgcHJlc2V0IGJ5IGl0cyBuYW1lICh3aXRoIGl0cyBkYXlzIGluIGEgbGluZSksIGVsc2Vcbi8vIGl0cyB0d28gZGF5cyAoJ+KApicgZm9yIGFuIG9wZW4gZW5kKS5cbmZ1bmN0aW9uIGRhdGVUZXh0KHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlLCBjb250ZXh0OiBSZXBvcnRGaWx0ZXJMaW5lQ29udGV4dCwgZm9ybTogUmVwb3J0RmlsdGVyTGluZUZvcm0pOiBzdHJpbmcge1xuICBpZiAoY29udGV4dC5wcmVzZXQpIHtcbiAgICBjb25zdCBuYW1lID0gcmVsYXRpdmVMYWJlbChjb250ZXh0LnByZXNldCk7XG4gICAgY29uc3QgZGF5cyA9IGZvcm0gPT09ICdsaW5lJ1xuICAgICAgPyBmb3JtYXREYXlSYW5nZShkYXRlQm91bmRTdHJpbmcodmFsdWUuc3RhcnQpLCBkYXRlQm91bmRTdHJpbmcodmFsdWUuZW5kKSwgY29udGV4dC5sb2NhbGUpXG4gICAgICA6ICcnO1xuXG4gICAgcmV0dXJuIGRheXMgPyBgJHtuYW1lfSAoJHtkYXlzfSlgIDogbmFtZTtcbiAgfVxuXG4gIHJldHVybiBgJHtkYXRlQm91bmRMYWJlbCh2YWx1ZS5zdGFydCwgY29udGV4dC5sb2NhbGUpID8/ICfigKYnfSDigJMgJHtkYXRlQm91bmRMYWJlbCh2YWx1ZS5lbmQsIGNvbnRleHQubG9jYWxlKSA/PyAn4oCmJ31gO1xufVxuXG4vLyBUaGUgdmFsdWVzIGEgc2VsZWN0IGxlYXZlcyBvdXQuIEEgbGluZSBzYXlzIHdoYXQgaGFwcGVucyB0byB0aGUgcm93cyB3aXRoXG4vLyBubyB2YWx1ZTogdGhleSBzdGF5LCB1bmxlc3MgdGhlIGdyb3VwJ3MgYmxhbmsgbGFiZWwgaXMgb25lIG9mIHRoZSB2YWx1ZXNcbi8vIGxlZnQgb3V0LiBXaGlsZSB0aGUgYmxhbmsgbGFiZWwgaXMgdW5rbm93biAodW5kZWZpbmVkKSB0aGUgbGluZSBzYXlzXG4vLyBub3RoaW5nIGFib3V0IHRoZW06IGEgYmxhbmsgbGFiZWwgYW1vbmcgdGhlIHBpY2tzIHdvdWxkIG1ha2UgJ2FyZSBrZXB0J1xuLy8gZmFsc2UuXG5mdW5jdGlvbiBleGNsdWRlVGV4dChcbiAgbGFiZWw6IHN0cmluZyxcbiAgdmFsdWVzOiB1bmtub3duW10sXG4gIGNvbnRleHQ6IFJlcG9ydEZpbHRlckxpbmVDb250ZXh0LFxuICBmb3JtOiBSZXBvcnRGaWx0ZXJMaW5lRm9ybSxcbik6IHN0cmluZyB7XG4gIGNvbnN0IHRleHQgPSBwaWNrTmFtZXModmFsdWVzLCBjb250ZXh0KS5qb2luKCcsICcpO1xuICBjb25zdCBibGFua0xhYmVsID0gY29udGV4dC5ibGFua0xhYmVsO1xuXG4gIGlmIChmb3JtID09PSAnY2hpcCcgfHwgYmxhbmtMYWJlbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICBjb25zdCBibGFuayA9IGJsYW5rTGFiZWwgIT09IG51bGwgJiYgdmFsdWVzLnNvbWUoKHZhbHVlKSA9PiBTdHJpbmcodmFsdWUpID09PSBibGFua0xhYmVsKTtcblxuICByZXR1cm4gYCR7dGV4dH0gKHJvd3Mgd2l0aCBubyAke2xhYmVsfSAke2JsYW5rID8gJ2FyZSBsZWZ0IG91dCcgOiAnYXJlIGtlcHQnfSlgO1xufVxuXG4vLyBBIG51bWJlciByYW5nZSdzIGVuZHMgaW4gdGhlIHJlcG9ydCdzIGxvY2FsZSwgb3IgbnVsbCB3aXRoIG5laXRoZXIuXG5mdW5jdGlvbiByYW5nZVRleHQodmFsdWU6IEZpbHRlckdyb3VwVmFsdWUsIGNvbnRleHQ6IFJlcG9ydEZpbHRlckxpbmVDb250ZXh0LCBmb3JtOiBSZXBvcnRGaWx0ZXJMaW5lRm9ybSk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBtaW4gPSBmaW5pdGVOdW1iZXIodmFsdWUubWluKTtcbiAgY29uc3QgbWF4ID0gZmluaXRlTnVtYmVyKHZhbHVlLm1heCk7XG4gIGNvbnN0IHdyaXRlID0gKGVuZDogbnVtYmVyKSA9PiBmb3JtYXRQbGFpbk51bWJlcihlbmQsIGNvbnRleHQubG9jYWxlKTtcblxuICBpZiAobWluICE9PSB1bmRlZmluZWQgJiYgbWF4ICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gYCR7d3JpdGUobWluKX0gdG8gJHt3cml0ZShtYXgpfSR7Zm9ybSA9PT0gJ2xpbmUnID8gJyAoYm90aCBpbmNsdWRlZCknIDogJyd9YDtcbiAgfVxuXG4gIGlmIChtaW4gIT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBgJHt3cml0ZShtaW4pfSBvciBtb3JlYDtcbiAgfVxuXG4gIHJldHVybiBtYXggIT09IHVuZGVmaW5lZCA/IGAke3dyaXRlKG1heCl9IG9yIGxlc3NgIDogbnVsbDtcbn1cblxuLy8gVGhlIHBpY2tzJyBuYW1lczogdGhlIG9uZXMgdGhlIGNhbGxlciByZXNvbHZlZCwgZWxzZSBlYWNoIHBpY2sgYXMgc3RvcmVkLlxuZnVuY3Rpb24gcGlja05hbWVzKHZhbHVlczogdW5rbm93bltdLCBjb250ZXh0OiBSZXBvcnRGaWx0ZXJMaW5lQ29udGV4dCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgbmFtZXMgPSBjb250ZXh0Lm5hbWVzO1xuXG4gIHJldHVybiB2YWx1ZXMubWFwKCh2YWx1ZSwgaW5kZXgpID0+IG5hbWVzPy5baW5kZXhdID8/IFN0cmluZyh2YWx1ZSkpO1xufVxuXG4vLyBPbmUgZ3JvdXAncyBsaW5lLCBvbmNlIGl0cyBwaWNrcyBhcmUgbmFtZWQuIEFuIGV4Y2x1ZGUgbGluZSBzYXlzIHdoYXRcbi8vIGhhcHBlbnMgdG8gdGhlIGJsYW5rIHJvd3MgZnJvbSB0aGUgZ3JvdXAncyBibGFuayBsYWJlbCwgd2hpY2ggdGhlIHNlcnZlclxuLy8gc2VuZHMgb24gYSBzZWxlY3QgZ3JvdXAgKG51bGw6IGJsYW5rIHJvd3MgaGF2ZSBub25lKS4gQW4gb2xkZXIgc2VydmVyXG4vLyBzZW5kcyBub25lLCBhbmQgdGhlIGxpbmUgdGhlbiBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlbS5cbmZ1bmN0aW9uIGdyb3VwTGluZShncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsIGlucHV0OiBSZXBvcnRFeHBvcnRMaW5lc0lucHV0KTogT2JzZXJ2YWJsZTxSZXBvcnRFeHBvcnRMaW5lIHwgbnVsbD4ge1xuICBjb25zdCBzbmFwc2hvdCA9IGlucHV0LnNuYXBzaG90O1xuICBjb25zdCB2YWx1ZSA9IHNuYXBzaG90LnZhbHVlc1tncm91cC5pZF07XG5cbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiBvZihudWxsKTtcbiAgfVxuXG4gIGNvbnN0IHBpY2tzID0gdmFsdWVQaWNrcyh2YWx1ZSk7XG4gIGNvbnN0IG5hbWVzJCA9IHBpY2tzLmxlbmd0aFxuICAgID8gaW5wdXQubmFtZXMoZ3JvdXAsIHBpY2tzKS5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpKVxuICAgIDogb2YobnVsbCk7XG5cbiAgcmV0dXJuIG5hbWVzJC5waXBlKFxuICAgIG1hcCgobmFtZXMpOiBSZXBvcnRFeHBvcnRMaW5lIHwgbnVsbCA9PiB7XG4gICAgICBjb25zdCB0ZXh0ID0gZmlsdGVyTGluZVRleHQoZ3JvdXAsIHZhbHVlLCB7XG4gICAgICAgIGxvY2FsZTogc25hcHNob3QuZm9ybWF0Q29udGV4dC5sb2NhbGUsXG4gICAgICAgIG5hbWVzLFxuICAgICAgICBwcmVzZXQ6IHNuYXBzaG90LnByZXNldHNbZ3JvdXAuaWRdID8/IG51bGwsXG4gICAgICAgIHBhZ2VOYW1lOiBwYWdlTmFtZShpbnB1dC5yZXBvcnQsIGdyb3VwLnBhZ2VJZCksXG4gICAgICAgIGJsYW5rTGFiZWw6IGdyb3VwLmJsYW5rTGFiZWwsXG4gICAgICB9LCAnbGluZScpO1xuXG4gICAgICByZXR1cm4gdGV4dCA/IHsga2luZDogJ2dyb3VwJywgdGV4dCwgZ3JvdXBJZDogZ3JvdXAuaWQgfSA6IG51bGw7XG4gICAgfSksXG4gICk7XG59XG5cbi8vIFRoZSBncm91cC1ieSBncmFpbiB1bmRlciB0aGUgcmVwb3J0J3Mgb3duIG5hbWUgZm9yIHRoZSBjb250cm9sLCBvciBudWxsXG4vLyB3aGlsZSBubyBncmFpbiBpcyBwaWNrZWQuXG5mdW5jdGlvbiBncm91cEJ5TGluZShpbnB1dDogUmVwb3J0RXhwb3J0TGluZXNJbnB1dCk6IFJlcG9ydEV4cG9ydExpbmUgfCBudWxsIHtcbiAgY29uc3QgZnJlcXVlbmN5ID0gaW5wdXQuc25hcHNob3QuZnJlcXVlbmN5O1xuXG4gIGlmICghZnJlcXVlbmN5KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBvcHRpb24gPSBHUkFOVUxBUklUWV9PUFRJT05TLmZpbmQoKGl0ZW0pID0+IGl0ZW0udmFsdWUgPT09IGZyZXF1ZW5jeSk7XG4gIGNvbnN0IGxhYmVsID0gaW5wdXQucmVwb3J0LmNvbmZpZz8uZ3JvdXBCeT8ubGFiZWwgfHwgR1JPVVBfQllfTEFCRUw7XG5cbiAgcmV0dXJuIHsga2luZDogJ2dyb3VwQnknLCB0ZXh0OiBgJHtsYWJlbH06ICR7b3B0aW9uPy5uYW1lID8/IGZyZXF1ZW5jeX1gIH07XG59XG5cbi8vIE9uZSBsaW5lIHBlciBkcmlsbGVkIGNoYXJ0IG9mIHRoZSBleHBvcnQncyBwYWdlcywgd2hpbGUgdGhlIHNlcnZlciBkcmlsbHMuXG5mdW5jdGlvbiBkcmlsbExpbmVzKGlucHV0OiBSZXBvcnRFeHBvcnRMaW5lc0lucHV0KTogUmVwb3J0RXhwb3J0TGluZVtdIHtcbiAgY29uc3QgeyByZXBvcnQsIHNuYXBzaG90LCBwYWdlSWQgfSA9IGlucHV0O1xuXG4gIGlmICghc25hcHNob3QuZmVhdHVyZXMuaW5jbHVkZXMoJ2RyaWxsJykpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICByZXR1cm4gKHJlcG9ydC5wYWdlcyA/PyBbXSlcbiAgICAuZmlsdGVyKChwYWdlKSA9PiAhcGFnZUlkIHx8IHBhZ2UuaWQgPT09IHBhZ2VJZClcbiAgICAuZmxhdE1hcCgocGFnZSkgPT4gcGFnZS5jb21wb25lbnRzID8/IFtdKVxuICAgIC5maWx0ZXIoKGNvbXBvbmVudCkgPT4gY29tcG9uZW50LnR5cGUgPT09ICdjaGFydCcgJiYgISFzbmFwc2hvdC5zdGF0ZS50aWxlcz8uW2NvbXBvbmVudC5pZF0/LmRyaWxsPy5sZW5ndGgpXG4gICAgLm1hcCgoY29tcG9uZW50KTogUmVwb3J0RXhwb3J0TGluZSA9PiAoe1xuICAgICAga2luZDogJ2RyaWxsJyxcbiAgICAgIHRleHQ6IGRyaWxsTGluZVRleHQoXG4gICAgICAgIHsgdGl0bGU6IGlucHV0LnRpdGxlcz8uW2NvbXBvbmVudC5pZF0gPz8gY29tcG9uZW50LnRpdGxlIH0sXG4gICAgICAgIHNuYXBzaG90LnN0YXRlLnRpbGVzW2NvbXBvbmVudC5pZF0uZHJpbGwsXG4gICAgICAgIHNuYXBzaG90LmZvcm1hdENvbnRleHQsXG4gICAgICApLFxuICAgICAgY29tcG9uZW50SWQ6IGNvbXBvbmVudC5pZCxcbiAgICB9KSk7XG59XG5cbi8vIFRoZSB0aWxlcyBhIGdyb3VwJ3MgbWVtYmVycyBzaXQgb246IHRoZSBzZXJ2ZXIncyBsaXN0LCBlbHNlIHRoZSB0aWxlcyBvZlxuLy8gaXRzIGVuYWJsZWQgbWVtYmVycyAoYW4gb2xkZXIgc2VydmVyKS5cbmZ1bmN0aW9uIGdyb3VwTWVtYmVySWRzKGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCk6IG51bWJlcltdIHtcbiAgcmV0dXJuIGdyb3VwLmNvbXBvbmVudElkc1xuICAgID8/IChncm91cC5maWx0ZXJzID8/IFtdKS5maWx0ZXIoKG1lbWJlcikgPT4gbWVtYmVyLmVuYWJsZWQpLm1hcCgobWVtYmVyKSA9PiBtZW1iZXIuY29tcG9uZW50SWQpO1xufVxuXG4vLyBBIHBhZ2UncyBuYW1lIGFzIHRoZSBleHBvcnQgbmFtZXMgaXQgKCdQYWdlIDInIHdoZW4gaXQgaGFzIG5vbmUpLCBvciBudWxsXG4vLyBmb3Igbm8gcGFnZS5cbmZ1bmN0aW9uIHBhZ2VOYW1lKHJlcG9ydDogUmVwb3J0LCBwYWdlSWQ6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgaW5kZXggPSBwYWdlSWQgPyAocmVwb3J0LnBhZ2VzID8/IFtdKS5maW5kSW5kZXgoKHBhZ2UpID0+IHBhZ2UuaWQgPT09IHBhZ2VJZCkgOiAtMTtcblxuICBpZiAoaW5kZXggPCAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gcmVwb3J0LnBhZ2VzW2luZGV4XS5uYW1lIHx8IGBQYWdlICR7aW5kZXggKyAxfWA7XG59XG5cblxuLy8gT25lIGNvbHVtbiBmaWx0ZXIgb2YgYSB0YWJsZSBhcyBhIGZpbGUgcHJpbnRzIGl0OiAnUmVnaW9uOiBFYXN0LCBXZXN0Jyxcbi8vICdFeGNsdWRlIFJlZ2lvbjogTm9ydGggKHJvd3Mgd2l0aCBubyBSZWdpb24gYXJlIGtlcHQpJywgJ0N1c3RvbWVyOiBjb250YWluc1xuLy8gXCJzbWl0aFwiJywgJ0Ftb3VudDogMTAgdG8gNTAgKGJvdGggaW5jbHVkZWQpJywgJ09yZGVyZWQ6IEphbiAyMDI2IHRvIE1hclxuLy8gMjAyNicuIEEga2V5IHJlYWRzIGFzIGl0cyBvcHRpb24ncyBsYWJlbCwgYSBibGFuayBrZXkgYXMgKGJsYW5rKSwga25vd25cbi8vIGZyb20gdGhlIG51bGwga2V5IGl0c2VsZjsgcGFzdCBHUklEX0ZJTFRFUl9OQU1FRCBwaWNrcyB0aGUgcmVzdCBhcmVcbi8vIGNvdW50ZWQuIEFuIGV4Y2x1ZGUgc2F5cyB3aGF0IGhhcHBlbnMgdG8gdGhlIHJvd3Mgd2l0aCBubyB2YWx1ZToga2VwdCxcbi8vIHVubGVzcyBhIGJsYW5rIGtleSBpcyBhbW9uZyB0aGUga2V5cyBsZWZ0IG91dC4gTnVsbCBmb3IgYSBmaWx0ZXIgdGhhdFxuLy8gaG9sZHMgbm90aGluZy5cbmV4cG9ydCBmdW5jdGlvbiBncmlkRmlsdGVyTGluZVRleHQoXG4gIGxhYmVsOiBzdHJpbmcsXG4gIGZpbHRlcjogR3JpZEZpbHRlcixcbiAgZmllbGQ6IEdyaWRGaWVsZCB8IHVuZGVmaW5lZCxcbiAgbG9jYWxlOiBSZXBvcnRGb3JtYXRDb250ZXh0Wydsb2NhbGUnXSxcbik6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBleGNsdWRlID0gISFmaWx0ZXIuZXhjbHVkZTtcbiAgY29uc3QgYmxhbmtzID0gKGV4Y2x1ZGVkOiBib29sZWFuKSA9PiAoZXhjbHVkZSA/IGAgKHJvd3Mgd2l0aCBubyAke2xhYmVsfSAke2V4Y2x1ZGVkID8gJ2FyZSBsZWZ0IG91dCcgOiAnYXJlIGtlcHQnfSlgIDogJycpO1xuICBjb25zdCBsaW5lID0gKHRleHQ6IHN0cmluZywgZXhjbHVkZWQgPSBmYWxzZSkgPT4gYCR7ZXhjbHVkZSA/ICdFeGNsdWRlICcgOiAnJ30ke2xhYmVsfTogJHt0ZXh0fSR7YmxhbmtzKGV4Y2x1ZGVkKX1gO1xuXG4gIGlmIChmaWx0ZXIua2V5cz8ubGVuZ3RoKSB7XG4gICAgY29uc3QgbmFtZXMgPSBmaWx0ZXIua2V5cy5zbGljZSgwLCBHUklEX0ZJTFRFUl9OQU1FRCkubWFwKChrZXkpID0+IGdyaWRLZXlOYW1lKGtleSwgZmllbGQpKTtcbiAgICBjb25zdCBtb3JlID0gZmlsdGVyLmtleXMubGVuZ3RoIC0gbmFtZXMubGVuZ3RoO1xuXG4gICAgcmV0dXJuIGxpbmUoYCR7bmFtZXMuam9pbignLCAnKX0ke21vcmUgPiAwID8gYCBhbmQgJHttb3JlfSBtb3JlYCA6ICcnfWAsIGZpbHRlci5rZXlzLnNvbWUoKGtleSkgPT4ga2V5ID09PSBudWxsKSk7XG4gIH1cblxuICBjb25zdCBjb250YWlucyA9IChmaWx0ZXIuY29udGFpbnMgPz8gJycpLnRyaW0oKTtcbiAgaWYgKGNvbnRhaW5zKSB7XG4gICAgcmV0dXJuIGAke2xhYmVsfTogJHtleGNsdWRlID8gJ2RvZXNuXFwndCBjb250YWluJyA6ICdjb250YWlucyd9IFwiJHtjb250YWluc31cIiR7YmxhbmtzKGZhbHNlKX1gO1xuICB9XG5cbiAgY29uc3QgaXNEYXRlID0gZmllbGQ/LnR5cGUgPT09IEdyaWRGaWVsZFR5cGUuRGF0ZTtcbiAgY29uc3Qgd3JpdGUgPSAoZW5kOiBudW1iZXIgfCBzdHJpbmcpID0+IChpc0RhdGVcbiAgICA/IGdyaWREYXRlVGV4dChTdHJpbmcoZW5kKSwgZmlsdGVyLmdyYW51bGFyaXR5ID8/IGZpZWxkPy5ncmFudWxhcml0aWVzPy5bMF0sIGxvY2FsZSlcbiAgICA6IGZvcm1hdFBsYWluTnVtYmVyKE51bWJlcihlbmQpLCBsb2NhbGUpKTtcbiAgY29uc3QgaGFzID0gKGVuZDogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkKTogZW5kIGlzIG51bWJlciB8IHN0cmluZyA9PiBlbmQgIT09IHVuZGVmaW5lZCAmJiBlbmQgIT09IG51bGwgJiYgZW5kICE9PSAnJztcblxuICBpZiAoaGFzKGZpbHRlci5mcm9tKSAmJiBoYXMoZmlsdGVyLnRvKSkge1xuICAgIHJldHVybiBsaW5lKGAke3dyaXRlKGZpbHRlci5mcm9tKX0gdG8gJHt3cml0ZShmaWx0ZXIudG8pfSR7ZXhjbHVkZSB8fCBpc0RhdGUgPyAnJyA6ICcgKGJvdGggaW5jbHVkZWQpJ31gKTtcbiAgfVxuXG4gIGlmIChoYXMoZmlsdGVyLmZyb20pKSB7XG4gICAgcmV0dXJuIGxpbmUoYCR7d3JpdGUoZmlsdGVyLmZyb20pfSAke2lzRGF0ZSA/ICdvciBsYXRlcicgOiAnb3IgbW9yZSd9YCk7XG4gIH1cblxuICByZXR1cm4gaGFzKGZpbHRlci50bykgPyBsaW5lKGAke3dyaXRlKGZpbHRlci50byl9ICR7aXNEYXRlID8gJ29yIGVhcmxpZXInIDogJ29yIGxlc3MnfWApIDogbnVsbDtcbn1cblxuLy8gQSBrZXkgYXMgYSBjb2x1bW4gZmlsdGVyJ3MgbGluZSBuYW1lcyBpdDogaXRzIG9wdGlvbidzIGxhYmVsLCBlbHNlIGl0c2VsZi5cbmZ1bmN0aW9uIGdyaWRLZXlOYW1lKGtleTogR3JpZEtleSwgZmllbGQ6IEdyaWRGaWVsZCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGlmIChrZXkgPT09IG51bGwpIHtcbiAgICByZXR1cm4gR1JJRF9CTEFOS19LRVk7XG4gIH1cblxuICByZXR1cm4gZmllbGQ/Lm9wdGlvbnM/LmZpbmQoKG9wdGlvbikgPT4gb3B0aW9uLmtleSAhPT0gbnVsbCAmJiBTdHJpbmcob3B0aW9uLmtleSkgPT09IFN0cmluZyhrZXkpKT8ubGFiZWwgPz8gU3RyaW5nKGtleSk7XG59XG5cbi8vIEEgZGF0ZSBlbmQgYXQgdGhlIGdyYWluIHRoZSBmaWx0ZXIgcmVhZHM6ICdKYW4gMjAyNicsICdRMSAyMDI2JywgJzIwMjYnLFxuLy8gZWxzZSB0aGUgZGF5LlxuZnVuY3Rpb24gZ3JpZERhdGVUZXh0KHZhbHVlOiBzdHJpbmcsIGdyYW51bGFyaXR5OiBHcmlkR3JhbnVsYXJpdHkgfCB1bmRlZmluZWQsIGxvY2FsZTogUmVwb3J0Rm9ybWF0Q29udGV4dFsnbG9jYWxlJ10pOiBzdHJpbmcge1xuICBjb25zdCBtYXRjaCA9IC9eKFxcZHs0fSktKFxcZHsyfSkvLmV4ZWModmFsdWUpO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgY29uc3QgeWVhciA9IE51bWJlcihtYXRjaFsxXSk7XG4gIGNvbnN0IG1vbnRoID0gTnVtYmVyKG1hdGNoWzJdKTtcblxuICBzd2l0Y2ggKGdyYW51bGFyaXR5KSB7XG4gICAgY2FzZSBHcmlkR3JhbnVsYXJpdHkuWWVhcjpcbiAgICAgIHJldHVybiBTdHJpbmcoeWVhcik7XG4gICAgY2FzZSBHcmlkR3JhbnVsYXJpdHkuUXVhcnRlcjpcbiAgICAgIHJldHVybiBgUSR7TWF0aC5jZWlsKG1vbnRoIC8gMyl9ICR7eWVhcn1gO1xuICAgIGNhc2UgR3JpZEdyYW51bGFyaXR5Lk1vbnRoOlxuICAgICAgcmV0dXJuIG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZSwgeyBtb250aDogJ3Nob3J0JywgeWVhcjogJ251bWVyaWMnLCB0aW1lWm9uZTogJ1VUQycgfSlcbiAgICAgICAgLmZvcm1hdChuZXcgRGF0ZShEYXRlLlVUQyh5ZWFyLCBtb250aCAtIDEsIDEpKSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBkYXRlQm91bmRMYWJlbCh2YWx1ZSwgbG9jYWxlKSA/PyB2YWx1ZTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
// A table tile as the PDF and the deck draw it: the printed table
|
|
2
|
+
// readGridTable() reads (GridTable) as heading rows, body rows and a total
|
|
3
|
+
// row of plain cells, and the lines its notes add. Pure, so both renderers
|
|
4
|
+
// draw one table one way.
|
|
5
|
+
import { GridRowKind } from '@firestitch/grid';
|
|
6
|
+
import { gridFilterLineText } from './report-filter-lines';
|
|
7
|
+
// The most pivot columns a file draws, from the first.
|
|
8
|
+
export const GRID_EXPORT_COLUMNS = 60;
|
|
9
|
+
// The table's heading, body and total row as cells. A group's label carries
|
|
10
|
+
// its row count after it, as the screen writes it.
|
|
11
|
+
export function gridExportTable(table) {
|
|
12
|
+
const numeric = table.columns.map((column) => column.numeric);
|
|
13
|
+
const head = Array.from({ length: Math.max(1, table.headingRows) }, (_, row) => table.headings
|
|
14
|
+
.filter((heading) => heading.row === row)
|
|
15
|
+
.sort((a, b) => a.column - b.column)
|
|
16
|
+
.map((heading) => exportCell(headingText(heading), true, 0, heading.numeric, heading.columnSpan, heading.rowSpan)));
|
|
17
|
+
const line = (row) => row.cells.map((cell, index) => {
|
|
18
|
+
const isLabel = index === 0 && table.groupColumn;
|
|
19
|
+
return exportCell(isLabel && row.count ? `${cell.text} (${row.count})` : cell.text, row.kind !== GridRowKind.Detail || !!table.columns[index]?.emphasis, isLabel ? row.depth : 0, numeric[index] ?? false);
|
|
20
|
+
});
|
|
21
|
+
return {
|
|
22
|
+
head,
|
|
23
|
+
body: table.rows.map(line),
|
|
24
|
+
foot: table.totalRow ? line(table.totalRow) : null,
|
|
25
|
+
numeric,
|
|
26
|
+
moreRows: table.moreRows,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
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.
|
|
31
|
+
export function gridExportNotes(table, layout, locale) {
|
|
32
|
+
const fields = new Map(table.fields.map((field) => [field.name, field]));
|
|
33
|
+
const filters = (layout.filters ?? [])
|
|
34
|
+
.map((filter) => gridFilterLineText(fields.get(filter.field)?.label ?? filter.field, filter, fields.get(filter.field), locale))
|
|
35
|
+
.filter((text) => !!text);
|
|
36
|
+
return [
|
|
37
|
+
...table.notes,
|
|
38
|
+
...(table.shownColumns < table.columnCount ? [`Showing the first ${table.shownColumns} of ${table.columnCount} columns`] : []),
|
|
39
|
+
...filters,
|
|
40
|
+
];
|
|
41
|
+
}
|
|
42
|
+
function headingText(heading) {
|
|
43
|
+
return heading.hint ? `${heading.label} (${heading.hint})` : heading.label;
|
|
44
|
+
}
|
|
45
|
+
function exportCell(text, bold, indent, numeric, colSpan = 1, rowSpan = 1) {
|
|
46
|
+
return { text, colSpan, rowSpan, bold, indent, numeric };
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWdyaWQtZXhwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2V4cG9ydC9yZXBvcnQtZ3JpZC1leHBvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsa0VBQWtFO0FBQ2xFLDJFQUEyRTtBQUMzRSwyRUFBMkU7QUFDM0UsMEJBQTBCO0FBQzFCLE9BQU8sRUFBYyxXQUFXLEVBQStCLE1BQU0sa0JBQWtCLENBQUM7QUFJeEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHM0QsdURBQXVEO0FBQ3ZELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEVBQUUsQ0FBQztBQXlCdEMsNEVBQTRFO0FBQzVFLG1EQUFtRDtBQUNuRCxNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQWdCO0lBQzlDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUQsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxRQUFRO1NBQzNGLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUM7U0FDeEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO1NBQ25DLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FB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LFVBQVUsQ0FBQyxJQUFZLEVBQUUsSUFBYSxFQUFFLE1BQWMsRUFBRSxPQUFnQixFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsT0FBTyxHQUFHLENBQUM7SUFDekcsT0FBTyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLENBQUM7QUFDM0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEEgdGFibGUgdGlsZSBhcyB0aGUgUERGIGFuZCB0aGUgZGVjayBkcmF3IGl0OiB0aGUgcHJpbnRlZCB0YWJsZVxuLy8gcmVhZEdyaWRUYWJsZSgpIHJlYWRzIChHcmlkVGFibGUpIGFzIGhlYWRpbmcgcm93cywgYm9keSByb3dzIGFuZCBhIHRvdGFsXG4vLyByb3cgb2YgcGxhaW4gY2VsbHMsIGFuZCB0aGUgbGluZXMgaXRzIG5vdGVzIGFkZC4gUHVyZSwgc28gYm90aCByZW5kZXJlcnNcbi8vIGRyYXcgb25lIHRhYmxlIG9uZSB3YXkuXG5pbXBvcnQgeyBHcmlkTGF5b3V0LCBHcmlkUm93S2luZCwgR3JpZFRhYmxlLCBHcmlkVGFibGVIZWFkaW5nIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZ3JpZCc7XG5cbmltcG9ydCB7IFJlcG9ydEZvcm1hdENvbnRleHQgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuXG5pbXBvcnQgeyBncmlkRmlsdGVyTGluZVRleHQgfSBmcm9tICcuL3JlcG9ydC1maWx0ZXItbGluZXMnO1xuXG5cbi8vIFRoZSBtb3N0IHBpdm90IGNvbHVtbnMgYSBmaWxlIGRyYXdzLCBmcm9tIHRoZSBmaXJzdC5cbmV4cG9ydCBjb25zdCBHUklEX0VYUE9SVF9DT0xVTU5TID0gNjA7XG5cbi8vIE9uZSBjZWxsIG9mIGFuIGV4cG9ydGVkIHRhYmxlLiBBIGhlYWRpbmcgY2VsbCBzcGFucyB3aGF0IHRoZSBzY3JlZW4nc1xuLy8gaGVhZGVyIHNwYW5zOyBhIGdyb3VwLCB0b3RhbCBvciBlbXBoYXNpemVkIChzdWJ0b3RhbCwgdG90YWwpIGNlbGwgaXMgYm9sZDtcbi8vIGEgZ3JvdXAncyBsYWJlbCBzdGVwcyBpbiBieSBpdHMgZGVwdGguXG5leHBvcnQgaW50ZXJmYWNlIEdyaWRFeHBvcnRDZWxsIHtcbiAgdGV4dDogc3RyaW5nO1xuICBjb2xTcGFuOiBudW1iZXI7XG4gIHJvd1NwYW46IG51bWJlcjtcbiAgYm9sZDogYm9vbGVhbjtcbiAgaW5kZW50OiBudW1iZXI7XG4gIG51bWVyaWM6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3JpZEV4cG9ydFRhYmxlIHtcbiAgLy8gSGVhZGluZyByb3dzIHRvcCBmaXJzdCwgZWFjaCBob2xkaW5nIG9ubHkgdGhlIGNlbGxzIHRoYXQgc3RhcnQgb24gaXRcbiAgaGVhZDogR3JpZEV4cG9ydENlbGxbXVtdO1xuICBib2R5OiBHcmlkRXhwb3J0Q2VsbFtdW107XG4gIGZvb3Q6IEdyaWRFeHBvcnRDZWxsW10gfCBudWxsO1xuICAvLyBPbmUgcGVyIHRhYmxlIGNvbHVtbjogaXQgaG9sZHMgZm9ybWF0dGVkIG51bWJlcnMsIHJpZ2h0LWFsaWduZWRcbiAgbnVtZXJpYzogYm9vbGVhbltdO1xuICAvLyBMaW5lcyBwYXN0IHRoZSByb3cgY2FwLCB3aGljaCB0aGUgbW9yZVJvd3NOb3RpY2Ugcm93IGNvdW50c1xuICBtb3JlUm93czogbnVtYmVyO1xufVxuXG4vLyBUaGUgdGFibGUncyBoZWFkaW5nLCBib2R5IGFuZCB0b3RhbCByb3cgYXMgY2VsbHMuIEEgZ3JvdXAncyBsYWJlbCBjYXJyaWVzXG4vLyBpdHMgcm93IGNvdW50IGFmdGVyIGl0LCBhcyB0aGUgc2NyZWVuIHdyaXRlcyBpdC5cbmV4cG9ydCBmdW5jdGlvbiBncmlkRXhwb3J0VGFibGUodGFibGU6IEdyaWRUYWJsZSk6IEdyaWRFeHBvcnRUYWJsZSB7XG4gIGNvbnN0IG51bWVyaWMgPSB0YWJsZS5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubnVtZXJpYyk7XG4gIGNvbnN0IGhlYWQgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiBNYXRoLm1heCgxLCB0YWJsZS5oZWFkaW5nUm93cykgfSwgKF8sIHJvdykgPT4gdGFibGUuaGVhZGluZ3NcbiAgICAuZmlsdGVyKChoZWFkaW5nKSA9PiBoZWFkaW5nLnJvdyA9PT0gcm93KVxuICAgIC5zb3J0KChhLCBiKSA9PiBhLmNvbHVtbiAtIGIuY29sdW1uKVxuICAgIC5tYXAoKGhlYWRpbmcpID0+IGV4cG9ydENlbGwoaGVhZGluZ1RleHQoaGVhZGluZyksIHRydWUsIDAsIGhlYWRpbmcubnVtZXJpYywgaGVhZGluZy5jb2x1bW5TcGFuLCBoZWFkaW5nLnJvd1NwYW4pKSk7XG4gIGNvbnN0IGxpbmUgPSAocm93OiBHcmlkVGFibGVbJ3Jvd3MnXVtudW1iZXJdKSA9PiByb3cuY2VsbHMubWFwKChjZWxsLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGlzTGFiZWwgPSBpbmRleCA9PT0gMCAmJiB0YWJsZS5ncm91cENvbHVtbjtcblxuICAgIHJldHVybiBleHBvcnRDZWxsKFxuICAgICAgaXNMYWJlbCAmJiByb3cuY291bnQgPyBgJHtjZWxsLnRleHR9ICgke3Jvdy5jb3VudH0pYCA6IGNlbGwudGV4dCxcbiAgICAgIHJvdy5raW5kICE9PSBHcmlkUm93S2luZC5EZXRhaWwgfHwgISF0YWJsZS5jb2x1bW5zW2luZGV4XT8uZW1waGFzaXMsXG4gICAgICBpc0xhYmVsID8gcm93LmRlcHRoIDogMCxcbiAgICAgIG51bWVyaWNbaW5kZXhdID8/IGZhbHNlLFxuICAgICk7XG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgaGVhZCxcbiAgICBib2R5OiB0YWJsZS5yb3dzLm1hcChsaW5lKSxcbiAgICBmb290OiB0YWJsZS50b3RhbFJvdyA/IGxpbmUodGFibGUudG90YWxSb3cpIDogbnVsbCxcbiAgICBudW1lcmljLFxuICAgIG1vcmVSb3dzOiB0YWJsZS5tb3JlUm93cyxcbiAgfTtcbn1cblxuLy8gVGhlIGxpbmVzIGEgdGFibGUgYWRkcyB1bmRlciBpdHMgYm94OiB0aGUgc2NyZWVuJ3Mgbm90ZXMsIHRoZSBwaXZvdFxuLy8gY29sdW1ucyBpdCBsZWF2ZXMgb3V0LCBhbmQgZWFjaCBjb2x1bW4gZmlsdGVyIG9mIHRoZSBsYXlvdXQgaXQgd2FzIHJlYWQgaW4uXG5leHBvcnQgZnVuY3Rpb24gZ3JpZEV4cG9ydE5vdGVzKHRhYmxlOiBHcmlkVGFibGUsIGxheW91dDogR3JpZExheW91dCwgbG9jYWxlOiBSZXBvcnRGb3JtYXRDb250ZXh0Wydsb2NhbGUnXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZmllbGRzID0gbmV3IE1hcCh0YWJsZS5maWVsZHMubWFwKChmaWVsZCkgPT4gW2ZpZWxkLm5hbWUsIGZpZWxkXSkpO1xuICBjb25zdCBmaWx0ZXJzID0gKGxheW91dC5maWx0ZXJzID8/IFtdKVxuICAgIC5tYXAoKGZpbHRlcikgPT4gZ3JpZEZpbHRlckxpbmVUZXh0KGZpZWxkcy5nZXQoZmlsdGVyLmZpZWxkKT8ubGFiZWwgPz8gZmlsdGVyLmZpZWxkLCBmaWx0ZXIsIGZpZWxkcy5nZXQoZmlsdGVyLmZpZWxkKSwgbG9jYWxlKSlcbiAgICAuZmlsdGVyKCh0ZXh0KTogdGV4dCBpcyBzdHJpbmcgPT4gISF0ZXh0KTtcblxuICByZXR1cm4gW1xuICAgIC4uLnRhYmxlLm5vdGVzLFxuICAgIC4uLih0YWJsZS5zaG93bkNvbHVtbnMgPCB0YWJsZS5jb2x1bW5Db3VudCA/IFtgU2hvd2luZyB0aGUgZmlyc3QgJHt0YWJsZS5zaG93bkNvbHVtbnN9IG9mICR7dGFibGUuY29sdW1uQ291bnR9IGNvbHVtbnNgXSA6IFtdKSxcbiAgICAuLi5maWx0ZXJzLFxuICBdO1xufVxuXG5mdW5jdGlvbiBoZWFkaW5nVGV4dChoZWFkaW5nOiBHcmlkVGFibGVIZWFkaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGhlYWRpbmcuaGludCA/IGAke2hlYWRpbmcubGFiZWx9ICgke2hlYWRpbmcuaGludH0pYCA6IGhlYWRpbmcubGFiZWw7XG59XG5cbmZ1bmN0aW9uIGV4cG9ydENlbGwodGV4dDogc3RyaW5nLCBib2xkOiBib29sZWFuLCBpbmRlbnQ6IG51bWJlciwgbnVtZXJpYzogYm9vbGVhbiwgY29sU3BhbiA9IDEsIHJvd1NwYW4gPSAxKTogR3JpZEV4cG9ydENlbGwge1xuICByZXR1cm4geyB0ZXh0LCBjb2xTcGFuLCByb3dTcGFuLCBib2xkLCBpbmRlbnQsIG51bWVyaWMgfTtcbn1cbiJdfQ==
|