@firestitch/report 18.6.1 → 18.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/app/reports/components/component-chart/component-chart.component.d.ts +6 -7
  2. package/app/reports/components/component-kpi/component-kpi.component.d.ts +8 -9
  3. package/app/reports/components/component-list/component-list.component.d.ts +33 -10
  4. package/app/reports/components/report-canvas/report-canvas.component.d.ts +0 -1
  5. package/app/reports/components/report-component/report-component.component.d.ts +4 -2
  6. package/app/reports/data/report.data.d.ts +2 -1
  7. package/app/reports/dialogs/list-columns/list-columns.component.d.ts +23 -0
  8. package/app/reports/dialogs/report-settings/report-locale-patch.d.ts +5 -0
  9. package/app/reports/dialogs/report-settings/report-settings.component.d.ts +20 -1
  10. package/app/reports/enums/report-chart-color.enum.d.ts +12 -0
  11. package/app/reports/enums/report-chart-data-labels.enum.d.ts +6 -0
  12. package/app/reports/enums/report-chart-date-label.enum.d.ts +5 -0
  13. package/app/reports/enums/report-chart-line-style.enum.d.ts +5 -0
  14. package/app/reports/enums/report-chart-mark-stat.enum.d.ts +6 -0
  15. package/app/reports/enums/report-list-column-format.enum.d.ts +6 -0
  16. package/app/reports/enums/report-number-units.enum.d.ts +6 -0
  17. package/app/reports/enums/report-value-format.enum.d.ts +5 -0
  18. package/app/reports/export/offscreen-chart.d.ts +2 -2
  19. package/app/reports/export/report-export-collector.service.d.ts +12 -9
  20. package/app/reports/export/report-pdf.service.d.ts +1 -0
  21. package/app/reports/export/report-pptx.service.d.ts +17 -0
  22. package/app/reports/format.d.ts +38 -3
  23. package/app/reports/interfaces/report.interface.d.ts +81 -10
  24. package/app/reports/list-config.d.ts +9 -0
  25. package/app/reports/option-builder.d.ts +69 -9
  26. package/app/reports/pipes/report-date.pipe.d.ts +2 -1
  27. package/app/reports/pipes/report-number.pipe.d.ts +8 -0
  28. package/app/reports/report-filter-items.d.ts +5 -2
  29. package/app/reports/report-url-state.d.ts +4 -0
  30. package/app/reports/services/report-filter-state.service.d.ts +26 -2
  31. package/app/reports/theme/palette.d.ts +3 -0
  32. package/app/reports/theme/typography.d.ts +1 -0
  33. package/esm2022/app/reports/components/component-chart/component-chart.component.mjs +19 -20
  34. package/esm2022/app/reports/components/component-kpi/component-kpi.component.mjs +23 -29
  35. package/esm2022/app/reports/components/component-list/component-list.component.mjs +158 -32
  36. package/esm2022/app/reports/components/report-canvas/report-canvas.component.mjs +3 -8
  37. package/esm2022/app/reports/components/report-component/report-component.component.mjs +81 -21
  38. package/esm2022/app/reports/data/report.data.mjs +17 -4
  39. package/esm2022/app/reports/dialogs/list-columns/list-columns.component.mjs +56 -0
  40. package/esm2022/app/reports/dialogs/report-settings/report-locale-patch.mjs +13 -0
  41. package/esm2022/app/reports/dialogs/report-settings/report-settings.component.mjs +137 -15
  42. package/esm2022/app/reports/enums/report-chart-color.enum.mjs +19 -0
  43. package/esm2022/app/reports/enums/report-chart-data-labels.enum.mjs +13 -0
  44. package/esm2022/app/reports/enums/report-chart-date-label.enum.mjs +13 -0
  45. package/esm2022/app/reports/enums/report-chart-line-style.enum.mjs +12 -0
  46. package/esm2022/app/reports/enums/report-chart-mark-stat.enum.mjs +12 -0
  47. package/esm2022/app/reports/enums/report-list-column-format.enum.mjs +14 -0
  48. package/esm2022/app/reports/enums/report-number-units.enum.mjs +14 -0
  49. package/esm2022/app/reports/enums/report-value-format.enum.mjs +13 -0
  50. package/esm2022/app/reports/export/offscreen-chart.mjs +5 -4
  51. package/esm2022/app/reports/export/report-export-collector.service.mjs +95 -40
  52. package/esm2022/app/reports/export/report-pdf.service.mjs +92 -36
  53. package/esm2022/app/reports/export/report-pptx.service.mjs +482 -86
  54. package/esm2022/app/reports/format.mjs +497 -58
  55. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  56. package/esm2022/app/reports/list-config.mjs +74 -0
  57. package/esm2022/app/reports/option-builder.mjs +868 -98
  58. package/esm2022/app/reports/pipes/report-date.pipe.mjs +7 -6
  59. package/esm2022/app/reports/pipes/report-number.pipe.mjs +25 -0
  60. package/esm2022/app/reports/report-filter-items.mjs +28 -3
  61. package/esm2022/app/reports/report-url-state.mjs +56 -15
  62. package/esm2022/app/reports/services/report-filter-state.service.mjs +235 -20
  63. package/esm2022/app/reports/theme/echarts.mjs +8 -2
  64. package/esm2022/app/reports/theme/palette.mjs +19 -1
  65. package/esm2022/app/reports/theme/typography.mjs +4 -1
  66. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +1 -1
  67. package/esm2022/public_api.mjs +9 -1
  68. package/fesm2022/{firestitch-report-echarts-Djtmaxj1.mjs → firestitch-report-echarts-u5ImuZT5.mjs} +9 -3
  69. package/fesm2022/firestitch-report-echarts-u5ImuZT5.mjs.map +1 -0
  70. package/fesm2022/{firestitch-report-firestitch-report-D3zseBZc.mjs → firestitch-report-firestitch-report-Cz-kA_id.mjs} +3221 -660
  71. package/fesm2022/firestitch-report-firestitch-report-Cz-kA_id.mjs.map +1 -0
  72. package/fesm2022/firestitch-report.mjs +1 -1
  73. package/package.json +1 -1
  74. package/public_api.d.ts +8 -0
  75. package/fesm2022/firestitch-report-echarts-Djtmaxj1.mjs.map +0 -1
  76. package/fesm2022/firestitch-report-firestitch-report-D3zseBZc.mjs.map +0 -1
@@ -0,0 +1,19 @@
1
+ // A chart measure's named color. The names follow the report chart palette in
2
+ // order (REPORT_CHART_COLOR_BY_NAME), so blue is the first series' default
3
+ // color and gray the tenth's.
4
+ //
5
+ // Mirrors the server's ChartColorEnum value for value, in the same order.
6
+ export var ReportChartColor;
7
+ (function (ReportChartColor) {
8
+ ReportChartColor["Blue"] = "blue";
9
+ ReportChartColor["Orange"] = "orange";
10
+ ReportChartColor["Red"] = "red";
11
+ ReportChartColor["Teal"] = "teal";
12
+ ReportChartColor["Green"] = "green";
13
+ ReportChartColor["Yellow"] = "yellow";
14
+ ReportChartColor["Purple"] = "purple";
15
+ ReportChartColor["Pink"] = "pink";
16
+ ReportChartColor["Brown"] = "brown";
17
+ ReportChartColor["Gray"] = "gray";
18
+ })(ReportChartColor || (ReportChartColor = {}));
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWNoYXJ0LWNvbG9yLmVudW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvZW51bXMvcmVwb3J0LWNoYXJ0LWNvbG9yLmVudW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsOEVBQThFO0FBQzlFLDJFQUEyRTtBQUMzRSw4QkFBOEI7QUFDOUIsRUFBRTtBQUNGLDBFQUEwRTtBQUMxRSxNQUFNLENBQU4sSUFBWSxnQkFXWDtBQVhELFdBQVksZ0JBQWdCO0lBQzFCLGlDQUFhLENBQUE7SUFDYixxQ0FBaUIsQ0FBQTtJQUNqQiwrQkFBVyxDQUFBO0lBQ1gsaUNBQWEsQ0FBQTtJQUNiLG1DQUFlLENBQUE7SUFDZixxQ0FBaUIsQ0FBQTtJQUNqQixxQ0FBaUIsQ0FBQTtJQUNqQixpQ0FBYSxDQUFBO0lBQ2IsbUNBQWUsQ0FBQTtJQUNmLGlDQUFhLENBQUE7QUFDZixDQUFDLEVBWFcsZ0JBQWdCLEtBQWhCLGdCQUFnQixRQVczQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEEgY2hhcnQgbWVhc3VyZSdzIG5hbWVkIGNvbG9yLiBUaGUgbmFtZXMgZm9sbG93IHRoZSByZXBvcnQgY2hhcnQgcGFsZXR0ZSBpblxuLy8gb3JkZXIgKFJFUE9SVF9DSEFSVF9DT0xPUl9CWV9OQU1FKSwgc28gYmx1ZSBpcyB0aGUgZmlyc3Qgc2VyaWVzJyBkZWZhdWx0XG4vLyBjb2xvciBhbmQgZ3JheSB0aGUgdGVudGgncy5cbi8vXG4vLyBNaXJyb3JzIHRoZSBzZXJ2ZXIncyBDaGFydENvbG9yRW51bSB2YWx1ZSBmb3IgdmFsdWUsIGluIHRoZSBzYW1lIG9yZGVyLlxuZXhwb3J0IGVudW0gUmVwb3J0Q2hhcnRDb2xvciB7XG4gIEJsdWUgPSAnYmx1ZScsXG4gIE9yYW5nZSA9ICdvcmFuZ2UnLFxuICBSZWQgPSAncmVkJyxcbiAgVGVhbCA9ICd0ZWFsJyxcbiAgR3JlZW4gPSAnZ3JlZW4nLFxuICBZZWxsb3cgPSAneWVsbG93JyxcbiAgUHVycGxlID0gJ3B1cnBsZScsXG4gIFBpbmsgPSAncGluaycsXG4gIEJyb3duID0gJ2Jyb3duJyxcbiAgR3JheSA9ICdncmF5Jyxcbn1cbiJdfQ==
@@ -0,0 +1,13 @@
1
+ // Which points of a chart's series print their value beside them: none, every
2
+ // point, only each series' last point, or every point with the overlapping
3
+ // labels hidden (auto). Axis charts only.
4
+ //
5
+ // Mirrors the server's ChartDataLabelsEnum value for value.
6
+ export var ReportChartDataLabels;
7
+ (function (ReportChartDataLabels) {
8
+ ReportChartDataLabels["None"] = "none";
9
+ ReportChartDataLabels["All"] = "all";
10
+ ReportChartDataLabels["Last"] = "last";
11
+ ReportChartDataLabels["Auto"] = "auto";
12
+ })(ReportChartDataLabels || (ReportChartDataLabels = {}));
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWNoYXJ0LWRhdGEtbGFiZWxzLmVudW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3JlcG9ydHMvZW51bXMvcmVwb3J0LWNoYXJ0LWRhdGEtbGFiZWxzLmVudW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsOEVBQThFO0FBQzlFLDJFQUEyRTtBQUMzRSwwQ0FBMEM7QUFDMUMsRUFBRTtBQUNGLDREQUE0RDtBQUM1RCxNQUFNLENBQU4sSUFBWSxxQkFLWDtBQUxELFdBQVkscUJBQXFCO0lBQy9CLHNDQUFhLENBQUE7SUFDYixvQ0FBVyxDQUFBO0lBQ1gsc0NBQWEsQ0FBQTtJQUNiLHNDQUFhLENBQUE7QUFDZixDQUFDLEVBTFcscUJBQXFCLEtBQXJCLHFCQUFxQixRQUtoQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFdoaWNoIHBvaW50cyBvZiBhIGNoYXJ0J3Mgc2VyaWVzIHByaW50IHRoZWlyIHZhbHVlIGJlc2lkZSB0aGVtOiBub25lLCBldmVyeVxuLy8gcG9pbnQsIG9ubHkgZWFjaCBzZXJpZXMnIGxhc3QgcG9pbnQsIG9yIGV2ZXJ5IHBvaW50IHdpdGggdGhlIG92ZXJsYXBwaW5nXG4vLyBsYWJlbHMgaGlkZGVuIChhdXRvKS4gQXhpcyBjaGFydHMgb25seS5cbi8vXG4vLyBNaXJyb3JzIHRoZSBzZXJ2ZXIncyBDaGFydERhdGFMYWJlbHNFbnVtIHZhbHVlIGZvciB2YWx1ZS5cbmV4cG9ydCBlbnVtIFJlcG9ydENoYXJ0RGF0YUxhYmVscyB7XG4gIE5vbmUgPSAnbm9uZScsXG4gIEFsbCA9ICdhbGwnLFxuICBMYXN0ID0gJ2xhc3QnLFxuICBBdXRvID0gJ2F1dG8nLFxufVxuIl19
@@ -0,0 +1,13 @@
1
+ // How a time axis writes its period labels: short ('May', with the year on a
2
+ // second line when the data spans years), long ('May 2026', in the report's
3
+ // locale) or numeric ('2026-05', the same in every locale). A category axis
4
+ // prints its values as they are.
5
+ //
6
+ // Mirrors the server's ChartDateLabelEnum value for value.
7
+ export var ReportChartDateLabel;
8
+ (function (ReportChartDateLabel) {
9
+ ReportChartDateLabel["Short"] = "short";
10
+ ReportChartDateLabel["Long"] = "long";
11
+ ReportChartDateLabel["Numeric"] = "numeric";
12
+ })(ReportChartDateLabel || (ReportChartDateLabel = {}));
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWNoYXJ0LWRhdGUtbGFiZWwuZW51bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9lbnVtcy9yZXBvcnQtY2hhcnQtZGF0ZS1sYWJlbC5lbnVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDZFQUE2RTtBQUM3RSw0RUFBNEU7QUFDNUUsNEVBQTRFO0FBQzVFLGlDQUFpQztBQUNqQyxFQUFFO0FBQ0YsMkRBQTJEO0FBQzNELE1BQU0sQ0FBTixJQUFZLG9CQUlYO0FBSkQsV0FBWSxvQkFBb0I7SUFDOUIsdUNBQWUsQ0FBQTtJQUNmLHFDQUFhLENBQUE7SUFDYiwyQ0FBbUIsQ0FBQTtBQUNyQixDQUFDLEVBSlcsb0JBQW9CLEtBQXBCLG9CQUFvQixRQUkvQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEhvdyBhIHRpbWUgYXhpcyB3cml0ZXMgaXRzIHBlcmlvZCBsYWJlbHM6IHNob3J0ICgnTWF5Jywgd2l0aCB0aGUgeWVhciBvbiBhXG4vLyBzZWNvbmQgbGluZSB3aGVuIHRoZSBkYXRhIHNwYW5zIHllYXJzKSwgbG9uZyAoJ01heSAyMDI2JywgaW4gdGhlIHJlcG9ydCdzXG4vLyBsb2NhbGUpIG9yIG51bWVyaWMgKCcyMDI2LTA1JywgdGhlIHNhbWUgaW4gZXZlcnkgbG9jYWxlKS4gQSBjYXRlZ29yeSBheGlzXG4vLyBwcmludHMgaXRzIHZhbHVlcyBhcyB0aGV5IGFyZS5cbi8vXG4vLyBNaXJyb3JzIHRoZSBzZXJ2ZXIncyBDaGFydERhdGVMYWJlbEVudW0gdmFsdWUgZm9yIHZhbHVlLlxuZXhwb3J0IGVudW0gUmVwb3J0Q2hhcnREYXRlTGFiZWwge1xuICBTaG9ydCA9ICdzaG9ydCcsXG4gIExvbmcgPSAnbG9uZycsXG4gIE51bWVyaWMgPSAnbnVtZXJpYycsXG59XG4iXX0=
@@ -0,0 +1,12 @@
1
+ // How a line series' line is drawn; the server refuses a non-solid line on
2
+ // an area series. The values are ECharts'
3
+ // lineStyle.type values, so the screen takes them as they are.
4
+ //
5
+ // Mirrors the server's ChartLineStyleEnum value for value.
6
+ export var ReportChartLineStyle;
7
+ (function (ReportChartLineStyle) {
8
+ ReportChartLineStyle["Solid"] = "solid";
9
+ ReportChartLineStyle["Dashed"] = "dashed";
10
+ ReportChartLineStyle["Dotted"] = "dotted";
11
+ })(ReportChartLineStyle || (ReportChartLineStyle = {}));
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWNoYXJ0LWxpbmUtc3R5bGUuZW51bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9lbnVtcy9yZXBvcnQtY2hhcnQtbGluZS1zdHlsZS5lbnVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJFQUEyRTtBQUMzRSwwQ0FBMEM7QUFDMUMsK0RBQStEO0FBQy9ELEVBQUU7QUFDRiwyREFBMkQ7QUFDM0QsTUFBTSxDQUFOLElBQVksb0JBSVg7QUFKRCxXQUFZLG9CQUFvQjtJQUM5Qix1Q0FBZSxDQUFBO0lBQ2YseUNBQWlCLENBQUE7SUFDakIseUNBQWlCLENBQUE7QUFDbkIsQ0FBQyxFQUpXLG9CQUFvQixLQUFwQixvQkFBb0IsUUFJL0IiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBIb3cgYSBsaW5lIHNlcmllcycgbGluZSBpcyBkcmF3bjsgdGhlIHNlcnZlciByZWZ1c2VzIGEgbm9uLXNvbGlkIGxpbmUgb25cbi8vIGFuIGFyZWEgc2VyaWVzLiBUaGUgdmFsdWVzIGFyZSBFQ2hhcnRzJ1xuLy8gbGluZVN0eWxlLnR5cGUgdmFsdWVzLCBzbyB0aGUgc2NyZWVuIHRha2VzIHRoZW0gYXMgdGhleSBhcmUuXG4vL1xuLy8gTWlycm9ycyB0aGUgc2VydmVyJ3MgQ2hhcnRMaW5lU3R5bGVFbnVtIHZhbHVlIGZvciB2YWx1ZS5cbmV4cG9ydCBlbnVtIFJlcG9ydENoYXJ0TGluZVN0eWxlIHtcbiAgU29saWQgPSAnc29saWQnLFxuICBEYXNoZWQgPSAnZGFzaGVkJyxcbiAgRG90dGVkID0gJ2RvdHRlZCcsXG59XG4iXX0=
@@ -0,0 +1,12 @@
1
+ // The statistic of a series a chart measure draws as a horizontal line across
2
+ // the plot: its average, median, lowest or highest value.
3
+ //
4
+ // Mirrors the server's ChartMarkStatEnum value for value.
5
+ export var ReportChartMarkStat;
6
+ (function (ReportChartMarkStat) {
7
+ ReportChartMarkStat["Average"] = "average";
8
+ ReportChartMarkStat["Median"] = "median";
9
+ ReportChartMarkStat["Min"] = "min";
10
+ ReportChartMarkStat["Max"] = "max";
11
+ })(ReportChartMarkStat || (ReportChartMarkStat = {}));
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWNoYXJ0LW1hcmstc3RhdC5lbnVtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2VudW1zL3JlcG9ydC1jaGFydC1tYXJrLXN0YXQuZW51bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw4RUFBOEU7QUFDOUUsMERBQTBEO0FBQzFELEVBQUU7QUFDRiwwREFBMEQ7QUFDMUQsTUFBTSxDQUFOLElBQVksbUJBS1g7QUFMRCxXQUFZLG1CQUFtQjtJQUM3QiwwQ0FBbUIsQ0FBQTtJQUNuQix3Q0FBaUIsQ0FBQTtJQUNqQixrQ0FBVyxDQUFBO0lBQ1gsa0NBQVcsQ0FBQTtBQUNiLENBQUMsRUFMVyxtQkFBbUIsS0FBbkIsbUJBQW1CLFFBSzlCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhlIHN0YXRpc3RpYyBvZiBhIHNlcmllcyBhIGNoYXJ0IG1lYXN1cmUgZHJhd3MgYXMgYSBob3Jpem9udGFsIGxpbmUgYWNyb3NzXG4vLyB0aGUgcGxvdDogaXRzIGF2ZXJhZ2UsIG1lZGlhbiwgbG93ZXN0IG9yIGhpZ2hlc3QgdmFsdWUuXG4vL1xuLy8gTWlycm9ycyB0aGUgc2VydmVyJ3MgQ2hhcnRNYXJrU3RhdEVudW0gdmFsdWUgZm9yIHZhbHVlLlxuZXhwb3J0IGVudW0gUmVwb3J0Q2hhcnRNYXJrU3RhdCB7XG4gIEF2ZXJhZ2UgPSAnYXZlcmFnZScsXG4gIE1lZGlhbiA9ICdtZWRpYW4nLFxuICBNaW4gPSAnbWluJyxcbiAgTWF4ID0gJ21heCcsXG59XG4iXX0=
@@ -0,0 +1,14 @@
1
+ // How a list column's cells are shown: a list column's `format`. date renders
2
+ // a raw timestamp as a day in the report's zone and locale; number, percent
3
+ // and currency format the value as a KPI measure does (ReportValueFormat). A
4
+ // column without a format prints its value as it came.
5
+ //
6
+ // Mirrors the server's ListColumnFormatEnum value for value.
7
+ export var ReportListColumnFormat;
8
+ (function (ReportListColumnFormat) {
9
+ ReportListColumnFormat["Date"] = "date";
10
+ ReportListColumnFormat["Number"] = "number";
11
+ ReportListColumnFormat["Percent"] = "percent";
12
+ ReportListColumnFormat["Currency"] = "currency";
13
+ })(ReportListColumnFormat || (ReportListColumnFormat = {}));
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWxpc3QtY29sdW1uLWZvcm1hdC5lbnVtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2VudW1zL3JlcG9ydC1saXN0LWNvbHVtbi1mb3JtYXQuZW51bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw4RUFBOEU7QUFDOUUsNEVBQTRFO0FBQzVFLDZFQUE2RTtBQUM3RSx1REFBdUQ7QUFDdkQsRUFBRTtBQUNGLDZEQUE2RDtBQUM3RCxNQUFNLENBQU4sSUFBWSxzQkFLWDtBQUxELFdBQVksc0JBQXNCO0lBQ2hDLHVDQUFhLENBQUE7SUFDYiwyQ0FBaUIsQ0FBQTtJQUNqQiw2Q0FBbUIsQ0FBQTtJQUNuQiwrQ0FBcUIsQ0FBQTtBQUN2QixDQUFDLEVBTFcsc0JBQXNCLEtBQXRCLHNCQUFzQixRQUtqQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEhvdyBhIGxpc3QgY29sdW1uJ3MgY2VsbHMgYXJlIHNob3duOiBhIGxpc3QgY29sdW1uJ3MgYGZvcm1hdGAuIGRhdGUgcmVuZGVyc1xuLy8gYSByYXcgdGltZXN0YW1wIGFzIGEgZGF5IGluIHRoZSByZXBvcnQncyB6b25lIGFuZCBsb2NhbGU7IG51bWJlciwgcGVyY2VudFxuLy8gYW5kIGN1cnJlbmN5IGZvcm1hdCB0aGUgdmFsdWUgYXMgYSBLUEkgbWVhc3VyZSBkb2VzIChSZXBvcnRWYWx1ZUZvcm1hdCkuIEFcbi8vIGNvbHVtbiB3aXRob3V0IGEgZm9ybWF0IHByaW50cyBpdHMgdmFsdWUgYXMgaXQgY2FtZS5cbi8vXG4vLyBNaXJyb3JzIHRoZSBzZXJ2ZXIncyBMaXN0Q29sdW1uRm9ybWF0RW51bSB2YWx1ZSBmb3IgdmFsdWUuXG5leHBvcnQgZW51bSBSZXBvcnRMaXN0Q29sdW1uRm9ybWF0IHtcbiAgRGF0ZSA9ICdkYXRlJyxcbiAgTnVtYmVyID0gJ251bWJlcicsXG4gIFBlcmNlbnQgPSAncGVyY2VudCcsXG4gIEN1cnJlbmN5ID0gJ2N1cnJlbmN5Jyxcbn1cbiJdfQ==
@@ -0,0 +1,14 @@
1
+ // How a formatted number is abbreviated: a number slot's `units`. thousands
2
+ // writes 1,200 as 1.2K and millions 3,400,000 as 3.4M; auto picks by size
3
+ // (once per chart on a value axis, per value everywhere else); none, like no
4
+ // units at all, writes the full number. Units never apply to a percent.
5
+ //
6
+ // Mirrors the server's NumberUnitsEnum value for value.
7
+ export var ReportNumberUnits;
8
+ (function (ReportNumberUnits) {
9
+ ReportNumberUnits["None"] = "none";
10
+ ReportNumberUnits["Thousands"] = "thousands";
11
+ ReportNumberUnits["Millions"] = "millions";
12
+ ReportNumberUnits["Auto"] = "auto";
13
+ })(ReportNumberUnits || (ReportNumberUnits = {}));
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LW51bWJlci11bml0cy5lbnVtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2VudW1zL3JlcG9ydC1udW1iZXItdW5pdHMuZW51bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0RUFBNEU7QUFDNUUsMEVBQTBFO0FBQzFFLDZFQUE2RTtBQUM3RSx3RUFBd0U7QUFDeEUsRUFBRTtBQUNGLHdEQUF3RDtBQUN4RCxNQUFNLENBQU4sSUFBWSxpQkFLWDtBQUxELFdBQVksaUJBQWlCO0lBQzNCLGtDQUFhLENBQUE7SUFDYiw0Q0FBdUIsQ0FBQTtJQUN2QiwwQ0FBcUIsQ0FBQTtJQUNyQixrQ0FBYSxDQUFBO0FBQ2YsQ0FBQyxFQUxXLGlCQUFpQixLQUFqQixpQkFBaUIsUUFLNUIiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBIb3cgYSBmb3JtYXR0ZWQgbnVtYmVyIGlzIGFiYnJldmlhdGVkOiBhIG51bWJlciBzbG90J3MgYHVuaXRzYC4gdGhvdXNhbmRzXG4vLyB3cml0ZXMgMSwyMDAgYXMgMS4ySyBhbmQgbWlsbGlvbnMgMyw0MDAsMDAwIGFzIDMuNE07IGF1dG8gcGlja3MgYnkgc2l6ZVxuLy8gKG9uY2UgcGVyIGNoYXJ0IG9uIGEgdmFsdWUgYXhpcywgcGVyIHZhbHVlIGV2ZXJ5d2hlcmUgZWxzZSk7IG5vbmUsIGxpa2Ugbm9cbi8vIHVuaXRzIGF0IGFsbCwgd3JpdGVzIHRoZSBmdWxsIG51bWJlci4gVW5pdHMgbmV2ZXIgYXBwbHkgdG8gYSBwZXJjZW50LlxuLy9cbi8vIE1pcnJvcnMgdGhlIHNlcnZlcidzIE51bWJlclVuaXRzRW51bSB2YWx1ZSBmb3IgdmFsdWUuXG5leHBvcnQgZW51bSBSZXBvcnROdW1iZXJVbml0cyB7XG4gIE5vbmUgPSAnbm9uZScsXG4gIFRob3VzYW5kcyA9ICd0aG91c2FuZHMnLFxuICBNaWxsaW9ucyA9ICdtaWxsaW9ucycsXG4gIEF1dG8gPSAnYXV0bycsXG59XG4iXX0=
@@ -0,0 +1,13 @@
1
+ // How a measure's value is shown: a chart measure's and a KPI measure's
2
+ // `format`. The data stays raw; only the renderers format it. percent takes a
3
+ // 0-1 ratio (0.3 reads 30%) when the report's percentFormat is 'ratio', and
4
+ // currency labels the amount in the report's currency (nothing is converted).
5
+ //
6
+ // Mirrors the server's ValueFormatEnum value for value.
7
+ export var ReportValueFormat;
8
+ (function (ReportValueFormat) {
9
+ ReportValueFormat["Number"] = "number";
10
+ ReportValueFormat["Percent"] = "percent";
11
+ ReportValueFormat["Currency"] = "currency";
12
+ })(ReportValueFormat || (ReportValueFormat = {}));
13
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXZhbHVlLWZvcm1hdC5lbnVtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2VudW1zL3JlcG9ydC12YWx1ZS1mb3JtYXQuZW51bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx3RUFBd0U7QUFDeEUsOEVBQThFO0FBQzlFLDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsRUFBRTtBQUNGLHdEQUF3RDtBQUN4RCxNQUFNLENBQU4sSUFBWSxpQkFJWDtBQUpELFdBQVksaUJBQWlCO0lBQzNCLHNDQUFpQixDQUFBO0lBQ2pCLHdDQUFtQixDQUFBO0lBQ25CLDBDQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFKVyxpQkFBaUIsS0FBakIsaUJBQWlCLFFBSTVCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSG93IGEgbWVhc3VyZSdzIHZhbHVlIGlzIHNob3duOiBhIGNoYXJ0IG1lYXN1cmUncyBhbmQgYSBLUEkgbWVhc3VyZSdzXG4vLyBgZm9ybWF0YC4gVGhlIGRhdGEgc3RheXMgcmF3OyBvbmx5IHRoZSByZW5kZXJlcnMgZm9ybWF0IGl0LiBwZXJjZW50IHRha2VzIGFcbi8vIDAtMSByYXRpbyAoMC4zIHJlYWRzIDMwJSkgd2hlbiB0aGUgcmVwb3J0J3MgcGVyY2VudEZvcm1hdCBpcyAncmF0aW8nLCBhbmRcbi8vIGN1cnJlbmN5IGxhYmVscyB0aGUgYW1vdW50IGluIHRoZSByZXBvcnQncyBjdXJyZW5jeSAobm90aGluZyBpcyBjb252ZXJ0ZWQpLlxuLy9cbi8vIE1pcnJvcnMgdGhlIHNlcnZlcidzIFZhbHVlRm9ybWF0RW51bSB2YWx1ZSBmb3IgdmFsdWUuXG5leHBvcnQgZW51bSBSZXBvcnRWYWx1ZUZvcm1hdCB7XG4gIE51bWJlciA9ICdudW1iZXInLFxuICBQZXJjZW50ID0gJ3BlcmNlbnQnLFxuICBDdXJyZW5jeSA9ICdjdXJyZW5jeScsXG59XG4iXX0=
@@ -3,8 +3,9 @@ import { buildChartOption } from '../option-builder';
3
3
  // export needs every page's charts, but the canvas only renders the active
4
4
  // page. ECharts happily initializes against a detached element when given
5
5
  // explicit pixel dimensions; animations are disabled so getDataURL is
6
- // complete synchronously after setOption.
7
- export async function renderChartImage(component, data, width, height, pixelRatio = 3) {
6
+ // complete synchronously after setOption. Its numbers and periods are written
7
+ // in the report's format context, as on screen.
8
+ export async function renderChartImage(component, data, width, height, context, pixelRatio = 3) {
8
9
  // The same tree-shaken echarts build + 'report' theme the live canvas uses.
9
10
  const echarts = (await import('../theme/echarts')).default;
10
11
  const host = document.createElement('div');
@@ -17,7 +18,7 @@ export async function renderChartImage(component, data, width, height, pixelRati
17
18
  });
18
19
  try {
19
20
  chart.setOption({
20
- ...buildChartOption(component, data),
21
+ ...buildChartOption(component, data, context),
21
22
  animation: false,
22
23
  });
23
24
  return chart.getDataURL({
@@ -30,4 +31,4 @@ export async function renderChartImage(component, data, width, height, pixelRati
30
31
  chart.dispose();
31
32
  }
32
33
  }
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2Zmc2NyZWVuLWNoYXJ0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2V4cG9ydC9vZmZzY3JlZW4tY2hhcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHckQseUVBQXlFO0FBQ3pFLDJFQUEyRTtBQUMzRSwwRUFBMEU7QUFDMUUsc0VBQXNFO0FBQ3RFLDBDQUEwQztBQUMxQyxNQUFNLENBQUMsS0FBSyxVQUFVLGdCQUFnQixDQUNwQyxTQUEwQixFQUMxQixJQUFtQixFQUNuQixLQUFhLEVBQ2IsTUFBYyxFQUNkLFVBQVUsR0FBRyxDQUFDO0lBRWQsNEVBQTRFO0lBQzVFLE1BQU0sT0FBTyxHQUFHLENBQUMsTUFBTSxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUUzRCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEdBQUcsS0FBSyxJQUFJLENBQUM7SUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQztJQUVsQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUU7UUFDekMsUUFBUSxFQUFFLFFBQVE7UUFDbEIsS0FBSztRQUNMLE1BQU07S0FDUCxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUM7UUFDSCxLQUFLLENBQUMsU0FBUyxDQUFDO1lBQ2QsR0FBRyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDO1lBQ3BDLFNBQVMsRUFBRSxLQUFLO1NBQ2pCLENBQUMsQ0FBQztRQUVILE9BQU8sS0FBSyxDQUFDLFVBQVUsQ0FBQztZQUN0QixJQUFJLEVBQUUsS0FBSztZQUNYLFVBQVU7WUFDVixlQUFlLEVBQUUsU0FBUztTQUMzQixDQUFDLENBQUM7SUFDTCxDQUFDO1lBQVMsQ0FBQztRQUNULEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNsQixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudERhdGEsIFJlcG9ydENvbXBvbmVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBidWlsZENoYXJ0T3B0aW9uIH0gZnJvbSAnLi4vb3B0aW9uLWJ1aWxkZXInO1xuXG5cbi8vIFJlbmRlcnMgYSBjaGFydCB0byBhIFBORyBkYXRhIFVSTCBXSVRIT1VUIGl0IGJlaW5nIG9uIHNjcmVlbiDigJQgdGhlIFBERlxuLy8gZXhwb3J0IG5lZWRzIGV2ZXJ5IHBhZ2UncyBjaGFydHMsIGJ1dCB0aGUgY2FudmFzIG9ubHkgcmVuZGVycyB0aGUgYWN0aXZlXG4vLyBwYWdlLiBFQ2hhcnRzIGhhcHBpbHkgaW5pdGlhbGl6ZXMgYWdhaW5zdCBhIGRldGFjaGVkIGVsZW1lbnQgd2hlbiBnaXZlblxuLy8gZXhwbGljaXQgcGl4ZWwgZGltZW5zaW9uczsgYW5pbWF0aW9ucyBhcmUgZGlzYWJsZWQgc28gZ2V0RGF0YVVSTCBpc1xuLy8gY29tcGxldGUgc3luY2hyb25vdXNseSBhZnRlciBzZXRPcHRpb24uXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVuZGVyQ2hhcnRJbWFnZShcbiAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsXG4gIGRhdGE6IENvbXBvbmVudERhdGEsXG4gIHdpZHRoOiBudW1iZXIsXG4gIGhlaWdodDogbnVtYmVyLFxuICBwaXhlbFJhdGlvID0gMyxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIC8vIFRoZSBzYW1lIHRyZWUtc2hha2VuIGVjaGFydHMgYnVpbGQgKyAncmVwb3J0JyB0aGVtZSB0aGUgbGl2ZSBjYW52YXMgdXNlcy5cbiAgY29uc3QgZWNoYXJ0cyA9IChhd2FpdCBpbXBvcnQoJy4uL3RoZW1lL2VjaGFydHMnKSkuZGVmYXVsdDtcblxuICBjb25zdCBob3N0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGhvc3Quc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gIGhvc3Quc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDtcblxuICBjb25zdCBjaGFydCA9IGVjaGFydHMuaW5pdChob3N0LCAncmVwb3J0Jywge1xuICAgIHJlbmRlcmVyOiAnY2FudmFzJyxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gIH0pO1xuXG4gIHRyeSB7XG4gICAgY2hhcnQuc2V0T3B0aW9uKHtcbiAgICAgIC4uLmJ1aWxkQ2hhcnRPcHRpb24oY29tcG9uZW50LCBkYXRhKSxcbiAgICAgIGFuaW1hdGlvbjogZmFsc2UsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gY2hhcnQuZ2V0RGF0YVVSTCh7XG4gICAgICB0eXBlOiAncG5nJyxcbiAgICAgIHBpeGVsUmF0aW8sXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjZmZmZmZmJyxcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBjaGFydC5kaXNwb3NlKCk7XG4gIH1cbn1cbiJdfQ==
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2Zmc2NyZWVuLWNoYXJ0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL2V4cG9ydC9vZmZzY3JlZW4tY2hhcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHckQseUVBQXlFO0FBQ3pFLDJFQUEyRTtBQUMzRSwwRUFBMEU7QUFDMUUsc0VBQXNFO0FBQ3RFLDhFQUE4RTtBQUM5RSxnREFBZ0Q7QUFDaEQsTUFBTSxDQUFDLEtBQUssVUFBVSxnQkFBZ0IsQ0FDcEMsU0FBMEIsRUFDMUIsSUFBbUIsRUFDbkIsS0FBYSxFQUNiLE1BQWMsRUFDZCxPQUE0QixFQUM1QixVQUFVLEdBQUcsQ0FBQztJQUVkLDRFQUE0RTtJQUM1RSxNQUFNLE9BQU8sR0FBRyxDQUFDLE1BQU0sTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7SUFFM0QsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxHQUFHLEtBQUssSUFBSSxDQUFDO0lBQ2hDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUM7SUFFbEMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFO1FBQ3pDLFFBQVEsRUFBRSxRQUFRO1FBQ2xCLEtBQUs7UUFDTCxNQUFNO0tBQ1AsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDO1FBQ0gsS0FBSyxDQUFDLFNBQVMsQ0FBQztZQUNkLEdBQUcsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUM7WUFDN0MsU0FBUyxFQUFFLEtBQUs7U0FDakIsQ0FBQyxDQUFDO1FBRUgsT0FBTyxLQUFLLENBQUMsVUFBVSxDQUFDO1lBQ3RCLElBQUksRUFBRSxLQUFLO1lBQ1gsVUFBVTtZQUNWLGVBQWUsRUFBRSxTQUFTO1NBQzNCLENBQUMsQ0FBQztJQUNMLENBQUM7WUFBUyxDQUFDO1FBQ1QsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2xCLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50RGF0YSwgUmVwb3J0Q29tcG9uZW50LCBSZXBvcnRGb3JtYXRDb250ZXh0IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yZXBvcnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IGJ1aWxkQ2hhcnRPcHRpb24gfSBmcm9tICcuLi9vcHRpb24tYnVpbGRlcic7XG5cblxuLy8gUmVuZGVycyBhIGNoYXJ0IHRvIGEgUE5HIGRhdGEgVVJMIFdJVEhPVVQgaXQgYmVpbmcgb24gc2NyZWVuIOKAlCB0aGUgUERGXG4vLyBleHBvcnQgbmVlZHMgZXZlcnkgcGFnZSdzIGNoYXJ0cywgYnV0IHRoZSBjYW52YXMgb25seSByZW5kZXJzIHRoZSBhY3RpdmVcbi8vIHBhZ2UuIEVDaGFydHMgaGFwcGlseSBpbml0aWFsaXplcyBhZ2FpbnN0IGEgZGV0YWNoZWQgZWxlbWVudCB3aGVuIGdpdmVuXG4vLyBleHBsaWNpdCBwaXhlbCBkaW1lbnNpb25zOyBhbmltYXRpb25zIGFyZSBkaXNhYmxlZCBzbyBnZXREYXRhVVJMIGlzXG4vLyBjb21wbGV0ZSBzeW5jaHJvbm91c2x5IGFmdGVyIHNldE9wdGlvbi4gSXRzIG51bWJlcnMgYW5kIHBlcmlvZHMgYXJlIHdyaXR0ZW5cbi8vIGluIHRoZSByZXBvcnQncyBmb3JtYXQgY29udGV4dCwgYXMgb24gc2NyZWVuLlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlbmRlckNoYXJ0SW1hZ2UoXG4gIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICBkYXRhOiBDb21wb25lbnREYXRhLFxuICB3aWR0aDogbnVtYmVyLFxuICBoZWlnaHQ6IG51bWJlcixcbiAgY29udGV4dDogUmVwb3J0Rm9ybWF0Q29udGV4dCxcbiAgcGl4ZWxSYXRpbyA9IDMsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICAvLyBUaGUgc2FtZSB0cmVlLXNoYWtlbiBlY2hhcnRzIGJ1aWxkICsgJ3JlcG9ydCcgdGhlbWUgdGhlIGxpdmUgY2FudmFzIHVzZXMuXG4gIGNvbnN0IGVjaGFydHMgPSAoYXdhaXQgaW1wb3J0KCcuLi90aGVtZS9lY2hhcnRzJykpLmRlZmF1bHQ7XG5cbiAgY29uc3QgaG9zdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBob3N0LnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xuICBob3N0LnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XG5cbiAgY29uc3QgY2hhcnQgPSBlY2hhcnRzLmluaXQoaG9zdCwgJ3JlcG9ydCcsIHtcbiAgICByZW5kZXJlcjogJ2NhbnZhcycsXG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICB9KTtcblxuICB0cnkge1xuICAgIGNoYXJ0LnNldE9wdGlvbih7XG4gICAgICAuLi5idWlsZENoYXJ0T3B0aW9uKGNvbXBvbmVudCwgZGF0YSwgY29udGV4dCksXG4gICAgICBhbmltYXRpb246IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNoYXJ0LmdldERhdGFVUkwoe1xuICAgICAgdHlwZTogJ3BuZycsXG4gICAgICBwaXhlbFJhdGlvLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiAnI2ZmZmZmZicsXG4gICAgfSk7XG4gIH0gZmluYWxseSB7XG4gICAgY2hhcnQuZGlzcG9zZSgpO1xuICB9XG59XG4iXX0=
@@ -1,11 +1,12 @@
1
1
  import { Injectable, inject } from '@angular/core';
2
- import { format } from 'date-fns';
3
2
  import { forkJoin, from, map, of } from 'rxjs';
4
3
  import { catchError, mergeMap, toArray } from 'rxjs/operators';
5
4
  import { ReportData } from '../data/report.data';
6
- import { formatReportDate, getZonedNow, resolveReportTimezone } from '../format';
5
+ import { ReportListColumnFormat } from '../enums/report-list-column-format.enum';
6
+ import { DAY_LONG, formatLocalDate, formatNumber, formatReportDate, hasNumberFormat, resolveReportTimezone, } from '../format';
7
7
  import { GRANULARITY_OPTIONS, } from '../interfaces/report.interface';
8
- import { pivotHeadings } from '../option-builder';
8
+ import { LIST_TOTAL_LABEL, listHiddenColumns, listTotalsLabelColumn } from '../list-config';
9
+ import { pivotColumnSpecs } from '../option-builder';
9
10
  import { dateBoundLabel, loadGroupOptions, resolveOptionValues } from '../report-filter-items';
10
11
  import { ReportFilterStateService } from '../services/report-filter-state.service';
11
12
  import * as i0 from "@angular/core";
@@ -31,52 +32,86 @@ const EXPORT_CONCURRENCY = 3;
31
32
  export function emptyLabel(item) {
32
33
  return item.data ? 'No data' : 'Could not be generated';
33
34
  }
35
+ // A component's title as an exported file prints it. A searched list says so,
36
+ // since its table holds only the matching rows: 'Orders (matching "north")'.
37
+ // An untitled one reads 'Matching "north"'. '' when there is nothing to print.
38
+ // Shared by the PDF and the deck, continuation pages included.
39
+ export function exportTitle(component, search) {
40
+ const title = component.title ?? '';
41
+ if (!search) {
42
+ return title;
43
+ }
44
+ return title ? `${title} (matching "${search}")` : `Matching "${search}"`;
45
+ }
34
46
  // Whether a tile's query failed. A text block has no query, so it never did.
35
47
  export function isFailed(item) {
36
48
  return !item.data && item.component.type !== 'text';
37
49
  }
38
50
  // The lines under the report's name on the PDF title page and the title slide:
39
51
  // the export date, the active filters, then what the numbers are measured in.
40
- // The date is today in the report's zone, the same day its filters resolve
41
- // "today" to.
52
+ // The date always leads (the PowerPoint marks that line as written in the
53
+ // report's locale). It is today in the report's zone, the same day its filters
54
+ // resolve "today" to, written in the report's locale.
42
55
  export function coverLines(collected) {
43
56
  return [
44
- format(getZonedNow(resolveReportTimezone(collected.report)), 'MMMM d, yyyy'),
57
+ formatLocalDate(new Date(), collected.formatContext.locale, DAY_LONG, resolveReportTimezone(collected.report)),
45
58
  ...collected.filterSummary,
46
59
  ...collected.contextLines,
47
60
  ];
48
61
  }
49
- // An exported list cell, reading like the on-screen cell: the SQL already
50
- // carries the formatting, so the value goes out verbatim. A date column is the
51
- // one value the browser renders, and it renders through the same function as
52
- // the screen, in the report's zone.
53
- export function exportCell(value, columnFormat, timezone) {
62
+ // An exported list cell, reading like the on-screen cell, through the same
63
+ // functions as the screen: a date column renders in the report's zone and
64
+ // locale, and a column with number-format keys (a cross-tab's cells through
65
+ // its cellFormat) in the report's locale and currency. Any other value goes
66
+ // out verbatim, and an empty one as ''. CSV never comes through here: its
67
+ // values stay raw.
68
+ export function exportCell(value, column, timezone, context) {
54
69
  if (value === null || value === undefined) {
55
70
  return '';
56
71
  }
57
- return columnFormat === 'date' ? formatReportDate(value, timezone) : String(value);
58
- }
59
- // The columns an exported list table draws. A cross-tab's columns arrive with
60
- // its rows (the row key first, then one per pivot value), since only the
61
- // result knows the pivot values; a plain list draws its configured columns,
62
- // else every column the query returned.
63
- export function listColumns(component, data) {
64
- const config = (component.config ?? {});
65
- if (!config.pivotBy?.column && config.columns?.length) {
66
- return config.columns;
72
+ if (column.format === ReportListColumnFormat.Date) {
73
+ return formatReportDate(value, timezone, context.locale);
67
74
  }
68
- return data.columns.map((column) => ({ column }));
75
+ return hasNumberFormat(column) ? formatNumber(value, column, context, { empty: '' }) : String(value);
69
76
  }
70
- // The heading over each column of listColumns(). A cross-tab is headed as on
71
- // screen, by pivotHeadings(), so its time-pivot headings are formatted periods
72
- // rather than raw period-starts; a plain list's columns keep their configured
73
- // labels.
74
- export function listHeadings(component, data) {
77
+ // The columns an exported list table draws. A cross-tab's arrive with its
78
+ // rows (the row key first, then one per pivot value), since only the result
79
+ // knows the pivot values, and are built by pivotColumnSpecs() as on screen:
80
+ // headed by its periods in the report's locale, each pivot value formatted by
81
+ // cellFormat. A plain list draws its configured columns but the ones the
82
+ // viewer hid (`hidden`, kept to listHiddenColumns, so never all of them),
83
+ // else every column the query returned, as it came.
84
+ export function listColumns(component, data, locale, hidden = []) {
75
85
  const config = (component.config ?? {});
76
86
  if (config.pivotBy?.column) {
77
- return pivotHeadings(config, data);
87
+ return pivotColumnSpecs(config, data, locale);
88
+ }
89
+ if (config.columns?.length) {
90
+ const hiddenNames = listHiddenColumns(config, hidden);
91
+ return config.columns
92
+ .filter((column) => !hiddenNames.includes(column.column))
93
+ .map((column) => ({ ...column, numeric: hasNumberFormat(column) }));
78
94
  }
79
- return listColumns(component, data).map((column) => column.label || column.column);
95
+ return data.columns.map((column) => ({ column, numeric: false }));
96
+ }
97
+ // The heading over each column of listColumns(): a plain list's configured
98
+ // label, else its column; a cross-tab's heading from pivotColumnSpecs().
99
+ export function listHeadings(component, data, locale, hidden = []) {
100
+ return listColumns(component, data, locale, hidden).map((column) => column.label || column.column);
101
+ }
102
+ // An exported list's totals row, one cell per column of listColumns(): each
103
+ // total written like its column's cells, and LIST_TOTAL_LABEL in the first
104
+ // column when that column holds no total (a cross-tab's row key). null when
105
+ // the list has no totals. The CSV never carries one: its rows stay raw.
106
+ export function listTotalsRow(data, columns, timezone, context) {
107
+ const totals = data.totals;
108
+ if (!totals) {
109
+ return null;
110
+ }
111
+ const label = listTotalsLabelColumn(columns, totals);
112
+ return columns.map((column) => (column.column === label
113
+ ? LIST_TOTAL_LABEL
114
+ : exportCell(totals[column.column], column, timezone, context)));
80
115
  }
81
116
  // The last row of an exported list table that stops short of its result: how
82
117
  // many rows the file leaves out and where the whole set can be had. Each
@@ -143,13 +178,16 @@ export class ReportExportCollectorService {
143
178
  pages,
144
179
  filterSummary,
145
180
  contextLines: this._contextLines(report),
181
+ formatContext: this._filterState.formatContext(),
146
182
  };
147
183
  }));
148
184
  }
149
185
  // "Report Period: Jun 12, 2025 – Jun 12, 2026", "Region: North, East" — one
150
186
  // line per filter group that has an active session value, then the group-by
151
187
  // line. The filter bar as the viewer reads it: the PDF and PowerPoint covers
152
- // print it, and the report zip export sends it for its notes file.
188
+ // print it, and the report zip export sends it for its notes file. Dates are
189
+ // written in the report's locale, so the notes name the period as the cover
190
+ // does.
153
191
  //
154
192
  // A select group stores ids, so its line has to be named off the option list
155
193
  // before it can be printed; a date or keyword group already holds its own
@@ -185,32 +223,49 @@ export class ReportExportCollectorService {
185
223
  }
186
224
  _componentData(report, component, listRows) {
187
225
  if (component.type === 'text') {
188
- return of({ component, data: null });
226
+ return of({ component, data: null, hiddenColumns: [] });
189
227
  }
190
228
  const filters = this._filterState.resolveForComponent(component);
191
229
  // A time-series chart carries the viewer's group-by grain so the export
192
230
  // re-buckets exactly as the screen does; lists carry their export paging
193
- // and the viewer's header sort, so the table reads in the screen's order.
231
+ // and the viewer's header sort and search, so the table reads in the
232
+ // screen's order and holds the screen's rows.
194
233
  //
195
234
  // The time-series check deliberately mirrors the server's canonical
196
235
  // ReportQueryRunner::_isTimeSeriesChart, so a product pinned to an older
197
236
  // framework does not re-bucket a non-time chart.
198
237
  const frequency = this._filterState.frequency();
199
238
  const isTimeSeries = component.type === 'chart' && component.config?.xAxis?.kind === 'time';
239
+ const search = component.type === 'list'
240
+ ? this._filterState.listSearch(component.id) ?? undefined
241
+ : undefined;
200
242
  const state = component.type === 'list'
201
- ? { page: 1, pageSize: listRows, sort: this._filterState.listSort(component.id) ?? undefined }
243
+ ? { page: 1, pageSize: listRows, sort: this._filterState.listSort(component.id) ?? undefined, search }
202
244
  : (isTimeSeries && frequency ? { frequency } : {});
245
+ // The table leaves out the columns the viewer hid. The rows are fetched
246
+ // whole, as the screen fetches them, and the renderers drop the cells.
247
+ const hiddenColumns = [...this._filterState.hiddenColumns(component.id)];
203
248
  // handlers: false keeps the app's global error dialog out of this. A failed
204
249
  // tile is reported once, by the export gate, naming the pages it cost —
205
250
  // never as ten stacked modals carrying the database's own wording.
251
+ //
252
+ // A search the server could not apply (searchNote: the list has no text
253
+ // column) narrowed nothing, so the item does not carry it.
206
254
  return this._reportData.componentData(report.id, component.id, filters, state, true, { handlers: false })
207
- .pipe(map((data) => ({ component, data })), catchError(() => of({ component, data: null })));
255
+ .pipe(map((data) => (search && !data?.searchNote
256
+ ? { component, data, search, hiddenColumns }
257
+ : { component, data, hiddenColumns })), catchError(() => of({ component, data: null, hiddenColumns })));
208
258
  }
209
- // The zone the server resolved, as its IANA id. Only the server's value is
210
- // printed: the browser's zone (resolveReportTimezone's fallback for an older
211
- // server) is not what the numbers were measured in.
259
+ // The zone the server resolved, as its IANA id, and the currency it says
260
+ // the report's money is in (a label: nothing is converted). Only the
261
+ // server's values are printed: the browser's zone (resolveReportTimezone's
262
+ // fallback for an older server) is not what the numbers were measured in,
263
+ // and an older server names no currency at all.
212
264
  _contextLines(report) {
213
- return report.effectiveTimezone ? [`Timezone: ${report.effectiveTimezone}`] : [];
265
+ return [
266
+ ...(report.effectiveTimezone ? [`Timezone: ${report.effectiveTimezone}`] : []),
267
+ ...(report.effectiveCurrency ? [`Currency: ${report.effectiveCurrency}`] : []),
268
+ ];
214
269
  }
215
270
  // One select group's line, with its stored ids resolved to the same names the
216
271
  // on-screen chips show — a cover reading "Organization: 8774, 8777" tells the
@@ -228,7 +283,7 @@ export class ReportExportCollectorService {
228
283
  // Rendered off the same calendar day the filter sends to the server, so the
229
284
  // cover's period is the period the numbers behind it were queried for.
230
285
  _date(value) {
231
- return dateBoundLabel(value) ?? '…';
286
+ return dateBoundLabel(value, this._filterState.formatContext().locale) ?? '…';
232
287
  }
233
288
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportExportCollectorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
234
289
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportExportCollectorService });
@@ -236,4 +291,4 @@ export class ReportExportCollectorService {
236
291
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ReportExportCollectorService, decorators: [{
237
292
  type: Injectable
238
293
  }] });
239
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9leHBvcnQvcmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xDLE9BQU8sRUFBYyxRQUFRLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFL0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxXQUFXLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDakYsT0FBTyxFQUdMLG1CQUFtQixHQU1wQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDL0YsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0seUNBQXlDLENBQUM7O0FBaUNuRixnREFBZ0Q7QUFDaEQsRUFBRTtBQUNGLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLDZFQUE2RTtBQUM3RSw4RUFBOEU7QUFDOUUsZ0ZBQWdGO0FBQ2hGLCtFQUErRTtBQUMvRSxZQUFZO0FBQ1osTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7QUFFN0IscUVBQXFFO0FBQ3JFLEVBQUU7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QUUsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUM5RSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxLQUFLLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FDbkYsQ0FBQztJQUNOLENBQUM7SUFFRCw0RUFBNEU7SUFDNUUsdUVBQXVFO0lBQy9ELEtBQUssQ0FBQyxLQUF1QztRQUNuRCxPQUFPLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUM7SUFDdEMsQ0FBQzt3R0FsS1UsNEJBQTRCOzRHQUE1Qiw0QkFBNEI7OzRGQUE1Qiw0QkFBNEI7a0JBRHhDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgZm9ybWF0IH0gZnJvbSAnZGF0ZS1mbnMnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZm9ya0pvaW4sIGZyb20sIG1hcCwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1lcmdlTWFwLCB0b0FycmF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBSZXBvcnREYXRhIH0gZnJvbSAnLi4vZGF0YS9yZXBvcnQuZGF0YSc7XG5pbXBvcnQgeyBmb3JtYXRSZXBvcnREYXRlLCBnZXRab25lZE5vdywgcmVzb2x2ZVJlcG9ydFRpbWV6b25lIH0gZnJvbSAnLi4vZm9ybWF0JztcbmltcG9ydCB7XG4gIENvbXBvbmVudERhdGEsXG4gIENvbXBvbmVudERhdGFTdGF0ZSxcbiAgR1JBTlVMQVJJVFlfT1BUSU9OUyxcbiAgTGlzdENvbmZpZyxcbiAgUmVwb3J0LFxuICBSZXBvcnRDb21wb25lbnQsXG4gIFJlcG9ydEZpbHRlckdyb3VwLFxuICBSZXBvcnRQYWdlLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgcGl2b3RIZWFkaW5ncyB9IGZyb20gJy4uL29wdGlvbi1idWlsZGVyJztcbmltcG9ydCB7IGRhdGVCb3VuZExhYmVsLCBsb2FkR3JvdXBPcHRpb25zLCByZXNvbHZlT3B0aW9uVmFsdWVzIH0gZnJvbSAnLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLXN0YXRlLnNlcnZpY2UnO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGVkQ29tcG9uZW50IHtcbiAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQ7XG4gIC8vIG51bGwgPSBpdHMgcXVlcnkgZmFpbGVkOyBleHBvcnRzIHNob3cgYSBub3RlLiBBbHdheXMgbnVsbCBmb3IgYSB0ZXh0XG4gIC8vIGJsb2NrLCB3aGljaCBoYXMgbm8gcXVlcnkg4oCUIHNlZSBpc0ZhaWxlZCgpLlxuICBkYXRhOiBDb21wb25lbnREYXRhIHwgbnVsbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0ZWRQYWdlIHtcbiAgcGFnZTogUmVwb3J0UGFnZTtcbiAgY29tcG9uZW50czogQ29sbGVjdGVkQ29tcG9uZW50W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGVkUmVwb3J0IHtcbiAgcmVwb3J0OiBSZXBvcnQ7XG4gIHBhZ2VzOiBDb2xsZWN0ZWRQYWdlW107XG4gIC8vIEh1bWFuLXJlYWRhYmxlIGxpbmVzIGRlc2NyaWJpbmcgdGhlIGFjdGl2ZSBmaWx0ZXJzLCBmb3IgdGhlIHRpdGxlIHNsaWRlL3BhZ2UuXG4gIGZpbHRlclN1bW1hcnk6IHN0cmluZ1tdO1xuICAvLyBXaGF0IHRoZSBudW1iZXJzIGFyZSBtZWFzdXJlZCBpbiwgZm9yIHRoZSB0aXRsZSBzbGlkZS9wYWdlOiB0aGUgem9uZSB0aGVcbiAgLy8gc2VydmVyIHJlc29sdmVkIGZvciB0aGUgcmVwb3J0LiBFbXB0eSB3aGVuIHRoZSBzZXJ2ZXIgZG9lcyBub3Qgc2VuZCBvbmUsXG4gIC8vIHJhdGhlciB0aGFuIGEgZ3Vlc3MgdGhhdCB3b3VsZCBiZSB3cm9uZyB3aGVuZXZlciB0aGUgZGVmYXVsdCBhcHBsaWVzLlxuICBjb250ZXh0TGluZXM6IHN0cmluZ1tdO1xufVxuXG4vLyBPbmUgZXhwb3J0ZWQgbGlzdCBjb2x1bW46IHRoZSBjZWxsIGtleSBhbmQgaG93IGl0IGlzIHNob3duLlxuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRMaXN0Q29sdW1uIHtcbiAgY29sdW1uOiBzdHJpbmc7XG4gIGxhYmVsPzogc3RyaW5nO1xuICBmb3JtYXQ/OiBzdHJpbmc7XG59XG5cbi8vIEhvdyBtYW55IHRpbGUgcXVlcmllcyBhbiBleHBvcnQgcnVucyBhdCBvbmNlLlxuLy9cbi8vIE5vdCBhIHBvbGl0ZW5lc3Mgc2V0dGluZyDigJQgaXQgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGRlY2sgYW5kIGEgYnJva2VuXG4vLyBvbmUuIFRoZXNlIHF1ZXJpZXMgYXJlIGhlYXZ5IGFuZCByZWFkIHRoZSBzYW1lIHRhYmxlcywgc28gZmlyaW5nIGFsbCBvZiB0aGVtXG4vLyB0b2dldGhlciBwdXRzIGV2ZXJ5IG9uZSBpbiBjb250ZW50aW9uIGZvciB0aGUgc2FtZSBkYXRhYmFzZSBhdCB0aGUgc2FtZVxuLy8gbW9tZW50IGFuZCB0aGV5IGNyb3NzIHRoZSBzdGF0ZW1lbnQgY2VpbGluZyBhcyBhIGdyb3VwOiBtZWFzdXJlZCBvbiByZXBvcnRcbi8vIDI4LCB0ZW4gdGlsZXMgdGhhdCBlYWNoIGFuc3dlciBpbiA5LTI0cyBydW4gb25lIGFmdGVyIGFub3RoZXIgYWxsIGZhaWxlZCBhdFxuLy8gfjMwcyB3aGVuIHJlbGVhc2VkIHRvZ2V0aGVyLiBDb25jdXJyZW5jeSBidXlzIHdhbGwtY2xvY2sgb25seSB1cCB0byB0aGUgcG9pbnRcbi8vIHdoZXJlIHRoZSBxdWVyaWVzIHN0YXJ0IHRha2luZyBpdCBiYWNrIG9mZiBlYWNoIG90aGVyLCBhbmQgcGFzdCB0aGF0IGl0IGJ1eXNcbi8vIGZhaWx1cmVzLlxuY29uc3QgRVhQT1JUX0NPTkNVUlJFTkNZID0gMztcblxuLy8gV2hhdCBhIGNvbXBvbmVudCB3aXRoIG5vdGhpbmcgdG8gZHJhdyBwcmludHMgaW4gdGhlIGV4cG9ydGVkIGZpbGUuXG4vL1xuLy8gVGhlIHR3byBjYXNlcyBtdXN0IG5vdCByZWFkIGFsaWtlLiBBIHRpbGUgdGhhdCByZXR1cm5lZCBubyByb3dzIGlzIGEgZmluZGluZ1xuLy8gYWJvdXQgdGhlIHBlcmlvZCDigJQgdGhlIHJlcG9ydCB3b3JrZWQgYW5kIHRoZSBhbnN3ZXIgaXMgXCJub25lXCIuIEEgdGlsZSB3aG9zZVxuLy8gcXVlcnkgZmFpbGVkIGlzIGEgaG9sZSBpbiB0aGUgZmlsZSwgYW5kIGNhbGxpbmcgdGhhdCBcIkRhdGEgdW5hdmFpbGFibGVcIiB0ZWxsc1xuLy8gdGhlIHJlYWRlciB0aGUgZGF0YSBkb2VzIG5vdCBleGlzdCB3aGVuIHdoYXQgaGFwcGVuZWQgaXMgdGhhdCBub2JvZHkgbWFuYWdlZFxuLy8gdG8gYXNrIGZvciBpdC4gU2hhcmVkIGJ5IGJvdGggcmVuZGVyZXJzIHNvIHRoZSBQREYgYW5kIHRoZSBkZWNrIGNhbm5vdCBlbmQgdXBcbi8vIGRlc2NyaWJpbmcgdGhlIHNhbWUgaG9sZSB0d28gZGlmZmVyZW50IHdheXMuXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlMYWJlbChpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQpOiBzdHJpbmcge1xuICByZXR1cm4gaXRlbS5kYXRhID8gJ05vIGRhdGEnIDogJ0NvdWxkIG5vdCBiZSBnZW5lcmF0ZWQnO1xufVxuXG4vLyBXaGV0aGVyIGEgdGlsZSdzIHF1ZXJ5IGZhaWxlZC4gQSB0ZXh0IGJsb2NrIGhhcyBubyBxdWVyeSwgc28gaXQgbmV2ZXIgZGlkLlxuZXhwb3J0IGZ1bmN0aW9uIGlzRmFpbGVkKGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCk6IGJvb2xlYW4ge1xuICByZXR1cm4gIWl0ZW0uZGF0YSAmJiBpdGVtLmNvbXBvbmVudC50eXBlICE9PSAndGV4dCc7XG59XG5cbi8vIFRoZSBsaW5lcyB1bmRlciB0aGUgcmVwb3J0J3MgbmFtZSBvbiB0aGUgUERGIHRpdGxlIHBhZ2UgYW5kIHRoZSB0aXRsZSBzbGlkZTpcbi8vIHRoZSBleHBvcnQgZGF0ZSwgdGhlIGFjdGl2ZSBmaWx0ZXJzLCB0aGVuIHdoYXQgdGhlIG51bWJlcnMgYXJlIG1lYXN1cmVkIGluLlxuLy8gVGhlIGRhdGUgaXMgdG9kYXkgaW4gdGhlIHJlcG9ydCdzIHpvbmUsIHRoZSBzYW1lIGRheSBpdHMgZmlsdGVycyByZXNvbHZlXG4vLyBcInRvZGF5XCIgdG8uXG5leHBvcnQgZnVuY3Rpb24gY292ZXJMaW5lcyhjb2xsZWN0ZWQ6IENvbGxlY3RlZFJlcG9ydCk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICBmb3JtYXQoZ2V0Wm9uZWROb3cocmVzb2x2ZVJlcG9ydFRpbWV6b25lKGNvbGxlY3RlZC5yZXBvcnQpKSwgJ01NTU0gZCwgeXl5eScpLFxuICAgIC4uLmNvbGxlY3RlZC5maWx0ZXJTdW1tYXJ5LFxuICAgIC4uLmNvbGxlY3RlZC5jb250ZXh0TGluZXMsXG4gIF07XG59XG5cbi8vIEFuIGV4cG9ydGVkIGxpc3QgY2VsbCwgcmVhZGluZyBsaWtlIHRoZSBvbi1zY3JlZW4gY2VsbDogdGhlIFNRTCBhbHJlYWR5XG4vLyBjYXJyaWVzIHRoZSBmb3JtYXR0aW5nLCBzbyB0aGUgdmFsdWUgZ29lcyBvdXQgdmVyYmF0aW0uIEEgZGF0ZSBjb2x1bW4gaXMgdGhlXG4vLyBvbmUgdmFsdWUgdGhlIGJyb3dzZXIgcmVuZGVycywgYW5kIGl0IHJlbmRlcnMgdGhyb3VnaCB0aGUgc2FtZSBmdW5jdGlvbiBhc1xuLy8gdGhlIHNjcmVlbiwgaW4gdGhlIHJlcG9ydCdzIHpvbmUuXG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0Q2VsbCh2YWx1ZTogdW5rbm93biwgY29sdW1uRm9ybWF0OiBzdHJpbmcgfCB1bmRlZmluZWQsIHRpbWV6b25lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHJldHVybiBjb2x1bW5Gb3JtYXQgPT09ICdkYXRlJyA/IGZvcm1hdFJlcG9ydERhdGUodmFsdWUsIHRpbWV6b25lKSA6IFN0cmluZyh2YWx1ZSk7XG59XG5cbi8vIFRoZSBjb2x1bW5zIGFuIGV4cG9ydGVkIGxpc3QgdGFibGUgZHJhd3MuIEEgY3Jvc3MtdGFiJ3MgY29sdW1ucyBhcnJpdmUgd2l0aFxuLy8gaXRzIHJvd3MgKHRoZSByb3cga2V5IGZpcnN0LCB0aGVuIG9uZSBwZXIgcGl2b3QgdmFsdWUpLCBzaW5jZSBvbmx5IHRoZVxuLy8gcmVzdWx0IGtub3dzIHRoZSBwaXZvdCB2YWx1ZXM7IGEgcGxhaW4gbGlzdCBkcmF3cyBpdHMgY29uZmlndXJlZCBjb2x1bW5zLFxuLy8gZWxzZSBldmVyeSBjb2x1bW4gdGhlIHF1ZXJ5IHJldHVybmVkLlxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RDb2x1bW5zKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCBkYXRhOiBDb21wb25lbnREYXRhKTogRXhwb3J0TGlzdENvbHVtbltdIHtcbiAgY29uc3QgY29uZmlnID0gKGNvbXBvbmVudC5jb25maWcgPz8ge30pIGFzIExpc3RDb25maWc7XG5cbiAgaWYgKCFjb25maWcucGl2b3RCeT8uY29sdW1uICYmIGNvbmZpZy5jb2x1bW5zPy5sZW5ndGgpIHtcbiAgICByZXR1cm4gY29uZmlnLmNvbHVtbnM7XG4gIH1cblxuICByZXR1cm4gZGF0YS5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiAoeyBjb2x1bW4gfSkpO1xufVxuXG4vLyBUaGUgaGVhZGluZyBvdmVyIGVhY2ggY29sdW1uIG9mIGxpc3RDb2x1bW5zKCkuIEEgY3Jvc3MtdGFiIGlzIGhlYWRlZCBhcyBvblxuLy8gc2NyZWVuLCBieSBwaXZvdEhlYWRpbmdzKCksIHNvIGl0cyB0aW1lLXBpdm90IGhlYWRpbmdzIGFyZSBmb3JtYXR0ZWQgcGVyaW9kc1xuLy8gcmF0aGVyIHRoYW4gcmF3IHBlcmlvZC1zdGFydHM7IGEgcGxhaW4gbGlzdCdzIGNvbHVtbnMga2VlcCB0aGVpciBjb25maWd1cmVkXG4vLyBsYWJlbHMuXG5leHBvcnQgZnVuY3Rpb24gbGlzdEhlYWRpbmdzKGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LCBkYXRhOiBDb21wb25lbnREYXRhKTogc3RyaW5nW10ge1xuICBjb25zdCBjb25maWcgPSAoY29tcG9uZW50LmNvbmZpZyA/PyB7fSkgYXMgTGlzdENvbmZpZztcblxuICBpZiAoY29uZmlnLnBpdm90Qnk/LmNvbHVtbikge1xuICAgIHJldHVybiBwaXZvdEhlYWRpbmdzKGNvbmZpZywgZGF0YSk7XG4gIH1cblxuICByZXR1cm4gbGlzdENvbHVtbnMoY29tcG9uZW50LCBkYXRhKS5tYXAoKGNvbHVtbikgPT4gY29sdW1uLmxhYmVsIHx8IGNvbHVtbi5jb2x1bW4pO1xufVxuXG4vLyBUaGUgbGFzdCByb3cgb2YgYW4gZXhwb3J0ZWQgbGlzdCB0YWJsZSB0aGF0IHN0b3BzIHNob3J0IG9mIGl0cyByZXN1bHQ6IGhvd1xuLy8gbWFueSByb3dzIHRoZSBmaWxlIGxlYXZlcyBvdXQgYW5kIHdoZXJlIHRoZSB3aG9sZSBzZXQgY2FuIGJlIGhhZC4gRWFjaFxuLy8gZm9ybWF0IGZldGNoZXMgaXRzIG93biBudW1iZXIgb2Ygcm93cyAoUERGX0xJU1RfUk9XUywgUFBUWF9MSVNUX1JPV1MpLCBhbmRcbi8vIGJvdGggbmFtZSB3aGF0IGlzIGxlZnQgd2l0aCB0aGlzIG9uZSBzZW50ZW5jZS5cbmV4cG9ydCBmdW5jdGlvbiBtb3JlUm93c05vdGljZShyZW1haW5pbmc6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBg4oCmICR7cmVtYWluaW5nfSBtb3JlIHJvdyhzKSDigJQgdXNlIHRoZSBjb21wb25lbnQncyBDU1YgZXhwb3J0IGZvciB0aGUgZnVsbCBkYXRhc2V0YDtcbn1cblxuLy8gVGhlIHBhZ2VzIG9mIGEgY29sbGVjdGVkIHJlcG9ydCB0aGF0IGhhdmUgYXQgbGVhc3Qgb25lIHRpbGUgd2hvc2UgcXVlcnlcbi8vIGZhaWxlZCDigJQgd2hhdCB0aGUgZXhwb3J0IGdhdGUgbmFtZXMgdG8gdGhlIHVzZXIsIGFuZCB3aGF0IG1ha2VzIFwic29tZSBvZiB0aGlzXG4vLyBmaWxlIGlzIG1pc3NpbmdcIiBhIGZhY3QgdGhlIGNhbGxlciBjYW4gYWN0IG9uIHJhdGhlciB0aGFuIGEgdGhpbmcgdGhleSBub3RpY2Vcbi8vIGluIHRoZSBQREYgYWZ0ZXJ3YXJkcy5cbmV4cG9ydCBmdW5jdGlvbiBmYWlsZWRQYWdlTmFtZXMoY29sbGVjdGVkOiBDb2xsZWN0ZWRSZXBvcnQpOiBzdHJpbmdbXSB7XG4gIC8vIE51bWJlcmVkIGJlZm9yZSB0aGUgZmlsdGVyIOKAlCBhbiB1bm5hbWVkIHBhZ2UgNCB0aGF0IGZhaWxlZCBoYXMgdG8gcmVhZFxuICAvLyBcIlBhZ2UgNFwiLCBub3QgXCJQYWdlIDFcIiBiZWNhdXNlIGl0IGhhcHBlbmVkIHRvIGJlIHRoZSBmaXJzdCBmYWlsdXJlLlxuICByZXR1cm4gY29sbGVjdGVkLnBhZ2VzXG4gICAgLm1hcCgocGFnZSwgaW5kZXgpID0+ICh7IHBhZ2UsIG51bWJlcjogaW5kZXggKyAxIH0pKVxuICAgIC5maWx0ZXIoKHsgcGFnZSB9KSA9PiBwYWdlLmNvbXBvbmVudHMuc29tZShpc0ZhaWxlZCkpXG4gICAgLm1hcCgoeyBwYWdlLCBudW1iZXIgfSkgPT4gcGFnZS5wYWdlLm5hbWUgfHwgYFBhZ2UgJHtudW1iZXJ9YCk7XG59XG5cbi8vIEdhdGhlcnMgZXZlcnl0aGluZyBhbiBleHBvcnQgbmVlZHM6IGV2ZXJ5IGNvbXBvbmVudCdzIGRhdGEgYWNyb3NzIEFMTCBwYWdlc1xuLy8gKHRoZSBjYW52YXMgb25seSByZW5kZXJzIHRoZSBhY3RpdmUgcGFnZSwgc28gZXhwb3J0cyBjYW4ndCBzY3JhcGUgdGhlXG4vLyBzY3JlZW4pLCBmZXRjaGVkIGZyZXNoIHdpdGggdGhlIHZpZXdlcidzIGN1cnJlbnQgZmlsdGVyIHN0YXRlLlxuLy9cbi8vIEEgZmFpbGVkIGNvbXBvbmVudCByZXNvbHZlcyB0byBhIG51bGwgYGRhdGFgIHJhdGhlciB0aGFuIGZhaWxpbmcgdGhlIHdob2xlXG4vLyBjb2xsZWN0aW9uIOKAlCBidXQgdGhhdCBpcyBzbyB0aGUgY2FsbGVyIGNhbiBSRVBPUlQgd2hhdCBmYWlsZWQsIG5vdCBzbyBpdCBjYW5cbi8vIGJlIGlnbm9yZWQ6IHNlZSBmYWlsZWRQYWdlTmFtZXMoKSBhbmQgdGhlIGV4cG9ydCBnYXRlIHRoYXQgdXNlcyBpdC5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSZXBvcnRFeHBvcnRDb2xsZWN0b3JTZXJ2aWNlIHtcblxuICBwcml2YXRlIF9yZXBvcnREYXRhID0gaW5qZWN0KFJlcG9ydERhdGEpO1xuICBwcml2YXRlIF9maWx0ZXJTdGF0ZSA9IGluamVjdChSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UpO1xuXG4gIC8vIGxpc3RSb3dzIGlzIGhvdyBtYW55IHJvd3MgZWFjaCBsaXN0IGZldGNoZXM6IHRoZSByZW5kZXJlcidzIG93biBjYXAsIHNpbmNlXG4gIC8vIGEgUERGIHRhYmxlIGNvbnRpbnVlcyBvbnRvIGV4dHJhIHBhZ2VzIGFuZCBhIHNsaWRlIHRhYmxlIGNhbm5vdC5cbiAgcHVibGljIGNvbGxlY3QocmVwb3J0OiBSZXBvcnQsIGxpc3RSb3dzOiBudW1iZXIpOiBPYnNlcnZhYmxlPENvbGxlY3RlZFJlcG9ydD4ge1xuICAgIGNvbnN0IHNsb3RzOiB7IHBhZ2VJbmRleDogbnVtYmVyOyBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCB9W10gPSBbXTtcblxuICAgIHJlcG9ydC5wYWdlcy5mb3JFYWNoKChwYWdlLCBwYWdlSW5kZXgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgY29tcG9uZW50IG9mIHBhZ2UuY29tcG9uZW50cykge1xuICAgICAgICBzbG90cy5wdXNoKHsgcGFnZUluZGV4LCBjb21wb25lbnQgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBUZXh0IGJsb2NrcyBoYXZlIG5vdGhpbmcgdG8gZmV0Y2gg4oCUIHRoZXkgcmlkZSB0aHJvdWdoIHdpdGggbm8gZGF0YS4gVGhlXG4gICAgLy8gaGVhZGVyL2Zvb3RlciAocmVwb3J0Lm1hc3RlcikgaXMgcmVhZCBieSB0aGUgcmVuZGVyZXJzIHN0cmFpZ2h0IG9mZiB0aGVcbiAgICAvLyByZXBvcnQgZm9yIHRoZSBzYW1lIHJlYXNvbi5cblxuICAgIC8vIFJlbGVhc2VkIGEgZmV3IGF0IGEgdGltZSByYXRoZXIgdGhhbiBhbGwgYXQgb25jZS4gbWVyZ2VNYXAgY29tcGxldGVzIG91dFxuICAgIC8vIG9mIG9yZGVyLCBzbyBlYWNoIHJlc3VsdCBjYXJyaWVzIHRoZSBzbG90IGl0IGNhbWUgZnJvbSBhbmQgdGhlIHJvd3MgYXJlXG4gICAgLy8gZmlsZWQgYnkgaW5kZXgg4oCUIHRoZSBkZWNrJ3MgcGFnZSBvcmRlciBjYW4ndCBkZXBlbmQgb24gd2hpY2ggcXVlcnlcbiAgICAvLyBoYXBwZW5lZCB0byBmaW5pc2ggZmlyc3QuXG4gICAgY29uc3QgYWxsJCA9IHNsb3RzLmxlbmd0aFxuICAgICAgPyBmcm9tKHNsb3RzLm1hcCgoc2xvdCwgaW5kZXgpID0+ICh7IHNsb3QsIGluZGV4IH0pKSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgbWVyZ2VNYXAoXG4gICAgICAgICAgICAoeyBzbG90LCBpbmRleCB9KSA9PiB0aGlzLl9jb21wb25lbnREYXRhKHJlcG9ydCwgc2xvdC5jb21wb25lbnQsIGxpc3RSb3dzKVxuICAgICAgICAgICAgICAucGlwZShtYXAoKGl0ZW0pID0+ICh7IGl0ZW0sIGluZGV4IH0pKSksXG4gICAgICAgICAgICBFWFBPUlRfQ09OQ1VSUkVOQ1ksXG4gICAgICAgICAgKSxcbiAgICAgICAgICB0b0FycmF5KCksXG4gICAgICAgIClcbiAgICAgIDogb2YoW10gYXMgeyBpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQ7IGluZGV4OiBudW1iZXIgfVtdKTtcblxuICAgIC8vIFRoZSBzdW1tYXJ5IHJpZGVzIGFsb25nc2lkZSB0aGUgY29tcG9uZW50IGRhdGEgcmF0aGVyIHRoYW4gYmVpbmcgYnVpbHQgYXRcbiAgICAvLyB0aGUgZW5kLCBiZWNhdXNlIG5hbWluZyBhIHNlbGVjdCBmaWx0ZXIncyB2YWx1ZXMgaXMgaXRzZWxmIGEgcmVxdWVzdC5cbiAgICByZXR1cm4gZm9ya0pvaW4oeyBjb2xsZWN0ZWQ6IGFsbCQsIGZpbHRlclN1bW1hcnk6IHRoaXMuZ2V0RmlsdGVyU3VtbWFyeShyZXBvcnQpIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKCh7IGNvbGxlY3RlZCwgZmlsdGVyU3VtbWFyeSB9KSA9PiB7XG4gICAgICAgICAgY29uc3QgcGFnZXM6IENvbGxlY3RlZFBhZ2VbXSA9IHJlcG9ydC5wYWdlcy5tYXAoKHBhZ2UpID0+ICh7IHBhZ2UsIGNvbXBvbmVudHM6IFtdIH0pKTtcblxuICAgICAgICAgIFsuLi5jb2xsZWN0ZWRdXG4gICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5pbmRleCAtIGIuaW5kZXgpXG4gICAgICAgICAgICAuZm9yRWFjaCgoeyBpdGVtLCBpbmRleCB9KSA9PiB7XG4gICAgICAgICAgICAgIHBhZ2VzW3Nsb3RzW2luZGV4XS5wYWdlSW5kZXhdLmNvbXBvbmVudHMucHVzaChpdGVtKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlcG9ydCxcbiAgICAgICAgICAgIHBhZ2VzLFxuICAgICAgICAgICAgZmlsdGVyU3VtbWFyeSxcbiAgICAgICAgICAgIGNvbnRleHRMaW5lczogdGhpcy5fY29udGV4dExpbmVzKHJlcG9ydCksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgLy8gXCJSZXBvcnQgUGVyaW9kOiBKdW4gMTIsIDIwMjUg4oCTIEp1biAxMiwgMjAyNlwiLCBcIlJlZ2lvbjogTm9ydGgsIEVhc3RcIiDigJQgb25lXG4gIC8vIGxpbmUgcGVyIGZpbHRlciBncm91cCB0aGF0IGhhcyBhbiBhY3RpdmUgc2Vzc2lvbiB2YWx1ZSwgdGhlbiB0aGUgZ3JvdXAtYnlcbiAgLy8gbGluZS4gVGhlIGZpbHRlciBiYXIgYXMgdGhlIHZpZXdlciByZWFkcyBpdDogdGhlIFBERiBhbmQgUG93ZXJQb2ludCBjb3ZlcnNcbiAgLy8gcHJpbnQgaXQsIGFuZCB0aGUgcmVwb3J0IHppcCBleHBvcnQgc2VuZHMgaXQgZm9yIGl0cyBub3RlcyBmaWxlLlxuICAvL1xuICAvLyBBIHNlbGVjdCBncm91cCBzdG9yZXMgaWRzLCBzbyBpdHMgbGluZSBoYXMgdG8gYmUgbmFtZWQgb2ZmIHRoZSBvcHRpb24gbGlzdFxuICAvLyBiZWZvcmUgaXQgY2FuIGJlIHByaW50ZWQ7IGEgZGF0ZSBvciBrZXl3b3JkIGdyb3VwIGFscmVhZHkgaG9sZHMgaXRzIG93blxuICAvLyBkaXNwbGF5IHZhbHVlIGFuZCByZXNvbHZlcyBzeW5jaHJvbm91c2x5LlxuICBwdWJsaWMgZ2V0RmlsdGVyU3VtbWFyeShyZXBvcnQ6IFJlcG9ydCk6IE9ic2VydmFibGU8c3RyaW5nW10+IHtcbiAgICBjb25zdCBsaW5lczogT2JzZXJ2YWJsZTxzdHJpbmc+W10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgZ3JvdXAgb2YgcmVwb3J0LmZpbHRlckdyb3VwcyA/PyBbXSkge1xuICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl9maWx0ZXJTdGF0ZS52YWx1ZShncm91cC5pZCk7XG4gICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsYWJlbCA9IGdyb3VwLmxhYmVsIHx8ICdGaWx0ZXInO1xuXG4gICAgICBpZiAodmFsdWUuc3RhcnQgfHwgdmFsdWUuZW5kKSB7XG4gICAgICAgIGxpbmVzLnB1c2gob2YoYCR7bGFiZWx9OiAke3RoaXMuX2RhdGUodmFsdWUuc3RhcnQpfSDigJMgJHt0aGlzLl9kYXRlKHZhbHVlLmVuZCl9YCkpO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZS52YWx1ZXM/Lmxlbmd0aCkge1xuICAgICAgICBsaW5lcy5wdXNoKHRoaXMuX3NlbGVjdExpbmUobGFiZWwsIGdyb3VwLCByZXBvcnQuaWQsIHZhbHVlLnZhbHVlcykpO1xuICAgICAgfSBlbHNlIGlmICh2YWx1ZS52YWx1ZT8udHJpbSgpKSB7XG4gICAgICAgIGxpbmVzLnB1c2gob2YoYCR7bGFiZWx9OiBcIiR7dmFsdWUudmFsdWUudHJpbSgpfVwiYCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBncm91cC1ieSBncmFpbiwgdW5kZXIgdGhlIHJlcG9ydCdzIG93biBuYW1lIGZvciB0aGUgY29udHJvbCDigJQgYSBjb3ZlclxuICAgIC8vIHNoZWV0IHJlYWRpbmcgXCJGcmVxdWVuY3lcIiB3aGVuIHRoZSByZXBvcnQgY2FsbHMgaXQgXCJQZXJpb2RcIiBkZXNjcmliZXMgYVxuICAgIC8vIGNvbnRyb2wgdGhlIHJlYWRlciBjYW5ub3QgZmluZCBvbiBzY3JlZW4uXG4gICAgY29uc3QgZ3JhbnVsYXJpdHkgPSB0aGlzLl9maWx0ZXJTdGF0ZS5mcmVxdWVuY3koKTtcbiAgICBpZiAoZ3JhbnVsYXJpdHkpIHtcbiAgICAgIGNvbnN0IG9wdGlvbiA9IEdSQU5VTEFSSVRZX09QVElPTlMuZmluZCgoaXRlbSkgPT4gaXRlbS52YWx1ZSA9PT0gZ3JhbnVsYXJpdHkpO1xuICAgICAgY29uc3QgbGFiZWwgPSByZXBvcnQuY29uZmlnPy5ncm91cEJ5Py5sYWJlbCB8fCAnR3JvdXAgQnknO1xuICAgICAgbGluZXMucHVzaChvZihgJHtsYWJlbH06ICR7b3B0aW9uPy5uYW1lID8/IGdyYW51bGFyaXR5fWApKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbGluZXMubGVuZ3RoID8gZm9ya0pvaW4obGluZXMpIDogb2YoW10pO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29tcG9uZW50RGF0YShyZXBvcnQ6IFJlcG9ydCwgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIGxpc3RSb3dzOiBudW1iZXIpOiBPYnNlcnZhYmxlPENvbGxlY3RlZENvbXBvbmVudD4ge1xuICAgIGlmIChjb21wb25lbnQudHlwZSA9PT0gJ3RleHQnKSB7XG4gICAgICByZXR1cm4gb2YoeyBjb21wb25lbnQsIGRhdGE6IG51bGwgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMuX2ZpbHRlclN0YXRlLnJlc29sdmVGb3JDb21wb25lbnQoY29tcG9uZW50KTtcbiAgICAvLyBBIHRpbWUtc2VyaWVzIGNoYXJ0IGNhcnJpZXMgdGhlIHZpZXdlcidzIGdyb3VwLWJ5IGdyYWluIHNvIHRoZSBleHBvcnRcbiAgICAvLyByZS1idWNrZXRzIGV4YWN0bHkgYXMgdGhlIHNjcmVlbiBkb2VzOyBsaXN0cyBjYXJyeSB0aGVpciBleHBvcnQgcGFnaW5nXG4gICAgLy8gYW5kIHRoZSB2aWV3ZXIncyBoZWFkZXIgc29ydCwgc28gdGhlIHRhYmxlIHJlYWRzIGluIHRoZSBzY3JlZW4ncyBvcmRlci5cbiAgICAvL1xuICAgIC8vIFRoZSB0aW1lLXNlcmllcyBjaGVjayBkZWxpYmVyYXRlbHkgbWlycm9ycyB0aGUgc2VydmVyJ3MgY2Fub25pY2FsXG4gICAgLy8gUmVwb3J0UXVlcnlSdW5uZXI6Ol9pc1RpbWVTZXJpZXNDaGFydCwgc28gYSBwcm9kdWN0IHBpbm5lZCB0byBhbiBvbGRlclxuICAgIC8vIGZyYW1ld29yayBkb2VzIG5vdCByZS1idWNrZXQgYSBub24tdGltZSBjaGFydC5cbiAgICBjb25zdCBmcmVxdWVuY3kgPSB0aGlzLl9maWx0ZXJTdGF0ZS5mcmVxdWVuY3koKTtcbiAgICBjb25zdCBpc1RpbWVTZXJpZXMgPSBjb21wb25lbnQudHlwZSA9PT0gJ2NoYXJ0JyAmJiBjb21wb25lbnQuY29uZmlnPy54QXhpcz8ua2luZCA9PT0gJ3RpbWUnO1xuICAgIGNvbnN0IHN0YXRlOiBDb21wb25lbnREYXRhU3RhdGUgPSBjb21wb25lbnQudHlwZSA9PT0gJ2xpc3QnXG4gICAgICA/IHsgcGFnZTogMSwgcGFnZVNpemU6IGxpc3RSb3dzLCBzb3J0OiB0aGlzLl9maWx0ZXJTdGF0ZS5saXN0U29ydChjb21wb25lbnQuaWQpID8/IHVuZGVmaW5lZCB9XG4gICAgICA6IChpc1RpbWVTZXJpZXMgJiYgZnJlcXVlbmN5ID8geyBmcmVxdWVuY3kgfSA6IHt9KTtcblxuICAgIC8vIGhhbmRsZXJzOiBmYWxzZSBrZWVwcyB0aGUgYXBwJ3MgZ2xvYmFsIGVycm9yIGRpYWxvZyBvdXQgb2YgdGhpcy4gQSBmYWlsZWRcbiAgICAvLyB0aWxlIGlzIHJlcG9ydGVkIG9uY2UsIGJ5IHRoZSBleHBvcnQgZ2F0ZSwgbmFtaW5nIHRoZSBwYWdlcyBpdCBjb3N0IOKAlFxuICAgIC8vIG5ldmVyIGFzIHRlbiBzdGFja2VkIG1vZGFscyBjYXJyeWluZyB0aGUgZGF0YWJhc2UncyBvd24gd29yZGluZy5cbiAgICByZXR1cm4gdGhpcy5fcmVwb3J0RGF0YS5jb21wb25lbnREYXRhKHJlcG9ydC5pZCwgY29tcG9uZW50LmlkLCBmaWx0ZXJzLCBzdGF0ZSwgdHJ1ZSwgeyBoYW5kbGVyczogZmFsc2UgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGRhdGE6IENvbXBvbmVudERhdGEpID0+ICh7IGNvbXBvbmVudCwgZGF0YSB9KSksXG4gICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YoeyBjb21wb25lbnQsIGRhdGE6IG51bGwgfSkpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFRoZSB6b25lIHRoZSBzZXJ2ZXIgcmVzb2x2ZWQsIGFzIGl0cyBJQU5BIGlkLiBPbmx5IHRoZSBzZXJ2ZXIncyB2YWx1ZSBpc1xuICAvLyBwcmludGVkOiB0aGUgYnJvd3NlcidzIHpvbmUgKHJlc29sdmVSZXBvcnRUaW1lem9uZSdzIGZhbGxiYWNrIGZvciBhbiBvbGRlclxuICAvLyBzZXJ2ZXIpIGlzIG5vdCB3aGF0IHRoZSBudW1iZXJzIHdlcmUgbWVhc3VyZWQgaW4uXG4gIHByaXZhdGUgX2NvbnRleHRMaW5lcyhyZXBvcnQ6IFJlcG9ydCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gcmVwb3J0LmVmZmVjdGl2ZVRpbWV6b25lID8gW2BUaW1lem9uZTogJHtyZXBvcnQuZWZmZWN0aXZlVGltZXpvbmV9YF0gOiBbXTtcbiAgfVxuXG4gIC8vIE9uZSBzZWxlY3QgZ3JvdXAncyBsaW5lLCB3aXRoIGl0cyBzdG9yZWQgaWRzIHJlc29sdmVkIHRvIHRoZSBzYW1lIG5hbWVzIHRoZVxuICAvLyBvbi1zY3JlZW4gY2hpcHMgc2hvdyDigJQgYSBjb3ZlciByZWFkaW5nIFwiT3JnYW5pemF0aW9uOiA4Nzc0LCA4Nzc3XCIgdGVsbHMgdGhlXG4gIC8vIHJlYWRlciBub3RoaW5nIGFib3V0IHdoYXQgdGhlIHJlcG9ydCBjb3ZlcnMuXG4gIC8vXG4gIC8vIFVzZXMgdGhlIHJlcG9ydCBiYXIncyBvd24gbG9hZGVyIGFuZCByZXNvbHZlciBzbyB0aGUgdHdvIGNhbid0IGRyaWZ0LCB3aGljaFxuICAvLyBhbHNvIG1lYW5zIGEgdmFsdWUgd2hvc2UgZW50aXR5IHdhcyBkZWxldGVkIGtlZXBzIHNob3dpbmcgaXRzIHJhdyBpZCByYXRoZXJcbiAgLy8gdGhhbiBkcm9wcGluZyBvZmYgdGhlIGNvdmVyIGFuZCBzaWxlbnRseSB1bmRlcnN0YXRpbmcgdGhlIGZpbHRlci4gQSBmYWlsZWRcbiAgLy8gb3B0aW9uIGZldGNoIGRlZ3JhZGVzIHRoZSB3aG9sZSBsaW5lIHRvIGlkcyBmb3IgdGhlIHNhbWUgcmVhc29uOiBhbiBleHBvcnRcbiAgLy8gbXVzdCBuZXZlciBmYWlsIG9uIGEgY29zbWV0aWMgbG9va3VwLlxuICBwcml2YXRlIF9zZWxlY3RMaW5lKFxuICAgIGxhYmVsOiBzdHJpbmcsXG4gICAgZ3JvdXA6IFJlcG9ydEZpbHRlckdyb3VwLFxuICAgIHJlcG9ydElkOiBudW1iZXIsXG4gICAgdmFsdWVzOiB1bmtub3duW10sXG4gICk6IE9ic2VydmFibGU8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHJlc29sdmVPcHRpb25WYWx1ZXMobG9hZEdyb3VwT3B0aW9ucyhncm91cCwgdGhpcy5fcmVwb3J0RGF0YSwgcmVwb3J0SWQpLCB2YWx1ZXMpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChyZXNvbHZlZCkgPT4gYCR7bGFiZWx9OiAke3Jlc29sdmVkLm1hcCgoaXRlbSkgPT4gaXRlbS5uYW1lKS5qb2luKCcsICcpfWApLFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKGAke2xhYmVsfTogJHt2YWx1ZXMubWFwKChpdGVtKSA9PiBTdHJpbmcoaXRlbSkpLmpvaW4oJywgJyl9YCkpLFxuICAgICAgKTtcbiAgfVxuXG4gIC8vIFJlbmRlcmVkIG9mZiB0aGUgc2FtZSBjYWxlbmRhciBkYXkgdGhlIGZpbHRlciBzZW5kcyB0byB0aGUgc2VydmVyLCBzbyB0aGVcbiAgLy8gY292ZXIncyBwZXJpb2QgaXMgdGhlIHBlcmlvZCB0aGUgbnVtYmVycyBiZWhpbmQgaXQgd2VyZSBxdWVyaWVkIGZvci5cbiAgcHJpdmF0ZSBfZGF0ZSh2YWx1ZTogRGF0ZSB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIHJldHVybiBkYXRlQm91bmRMYWJlbCh2YWx1ZSkgPz8gJ+KApic7XG4gIH1cbn1cbiJdfQ==
294
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9leHBvcnQvcmVwb3J0LWV4cG9ydC1jb2xsZWN0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQWMsUUFBUSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNqRixPQUFPLEVBQ0wsUUFBUSxFQUNSLGVBQWUsRUFDZixZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLGVBQWUsRUFDZixxQkFBcUIsR0FDdEIsTUFBTSxXQUFXLENBQUM7QUFDbkIsT0FBTyxFQUdMLG1CQUFtQixHQVNwQixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxpQkFBaUIsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRixPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQzs7QUF5Q25GLGdEQUFnRDtBQUNoRCxFQUFFO0FBQ0YsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsNkVBQTZF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J0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBmb3JrSm9pbiwgZnJvbSwgbWFwLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWVyZ2VNYXAsIHRvQXJyYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuLi9kYXRhL3JlcG9ydC5kYXRhJztcbmltcG9ydCB7IFJlcG9ydExpc3RDb2x1bW5Gb3JtYXQgfSBmcm9tICcuLi9lbnVtcy9yZXBvcnQtbGlzdC1jb2x1bW4tZm9ybWF0LmVudW0nO1xuaW1wb3J0IHtcbiAgREFZX0xPTkcsXG4gIGZvcm1hdExvY2FsRGF0ZSxcbiAgZm9ybWF0TnVtYmVyLFxuICBmb3JtYXRSZXBvcnREYXRlLFxuICBoYXNOdW1iZXJGb3JtYXQsXG4gIHJlc29sdmVSZXBvcnRUaW1lem9uZSxcbn0gZnJvbSAnLi4vZm9ybWF0JztcbmltcG9ydCB7XG4gIENvbXBvbmVudERhdGEsXG4gIENvbXBvbmVudERhdGFTdGF0ZSxcbiAgR1JBTlVMQVJJVFlfT1BUSU9OUyxcbiAgTGlzdENvbHVtbixcbiAgTGlzdENvbmZpZyxcbiAgUmVwb3J0LFxuICBSZXBvcnRDb21wb25lbnQsXG4gIFJlcG9ydEZpbHRlckdyb3VwLFxuICBSZXBvcnRGb3JtYXRDb250ZXh0LFxuICBSZXBvcnRMb2NhbGVUYWcsXG4gIFJlcG9ydFBhZ2UsXG59IGZyb20gJy4uL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBMSVNUX1RPVEFMX0xBQkVMLCBsaXN0SGlkZGVuQ29sdW1ucywgbGlzdFRvdGFsc0xhYmVsQ29sdW1uIH0gZnJvbSAnLi4vbGlzdC1jb25maWcnO1xuaW1wb3J0IHsgcGl2b3RDb2x1bW5TcGVjcyB9IGZyb20gJy4uL29wdGlvbi1idWlsZGVyJztcbmltcG9ydCB7IGRhdGVCb3VuZExhYmVsLCBsb2FkR3JvdXBPcHRpb25zLCByZXNvbHZlT3B0aW9uVmFsdWVzIH0gZnJvbSAnLi4vcmVwb3J0LWZpbHRlci1pdGVtcyc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLXN0YXRlLnNlcnZpY2UnO1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGVkQ29tcG9uZW50IHtcbiAgY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQ7XG4gIC8vIG51bGwgPSBpdHMgcXVlcnkgZmFpbGVkOyBleHBvcnRzIHNob3cgYSBub3RlLiBBbHdheXMgbnVsbCBmb3IgYSB0ZXh0XG4gIC8vIGJsb2NrLCB3aGljaCBoYXMgbm8gcXVlcnkg4oCUIHNlZSBpc0ZhaWxlZCgpLlxuICBkYXRhOiBDb21wb25lbnREYXRhIHwgbnVsbDtcbiAgLy8gVGhlIHRleHQgYSBsaXN0IHdhcyBzZWFyY2hlZCBieSB3aGVuIGl0IHdhcyBmZXRjaGVkOyBhYnNlbnQgd2hlbiBpdHNcbiAgLy8gc2VhcmNoIGJveCB3YXMgZW1wdHksIGFuZCBmb3IgZXZlcnkgb3RoZXIgY29tcG9uZW50LlxuICBzZWFyY2g/OiBzdHJpbmc7XG4gIC8vIFRoZSBjb25maWcgY29sdW1ucyBhIHZpZXdlciBoaWQgb24gYSBwbGFpbiBsaXN0LCB3aGljaCBpdHMgdGFibGUgbGVhdmVzXG4gIC8vIG91dCAobGlzdENvbHVtbnMpOyBlbXB0eSBmb3IgZXZlcnkgb3RoZXIgY29tcG9uZW50LlxuICBoaWRkZW5Db2x1bW5zOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0ZWRQYWdlIHtcbiAgcGFnZTogUmVwb3J0UGFnZTtcbiAgY29tcG9uZW50czogQ29sbGVjdGVkQ29tcG9uZW50W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGVkUmVwb3J0IHtcbiAgcmVwb3J0OiBSZXBvcnQ7XG4gIHBhZ2VzOiBDb2xsZWN0ZWRQYWdlW107XG4gIC8vIEh1bWFuLXJlYWRhYmxlIGxpbmVzIGRlc2NyaWJpbmcgdGhlIGFjdGl2ZSBmaWx0ZXJzLCBmb3IgdGhlIHRpdGxlIHNsaWRlL3BhZ2UuXG4gIGZpbHRlclN1bW1hcnk6IHN0cmluZ1tdO1xuICAvLyBXaGF0IHRoZSBudW1iZXJzIGFyZSBtZWFzdXJlZCBpbiwgZm9yIHRoZSB0aXRsZSBzbGlkZS9wYWdlOiB0aGUgem9uZSBhbmRcbiAgLy8gdGhlIGN1cnJlbmN5IHRoZSBzZXJ2ZXIgcmVzb2x2ZWQgZm9yIHRoZSByZXBvcnQuIEVhY2ggaXMgbGVmdCBvdXQgd2hlbiB0aGVcbiAgLy8gc2VydmVyIGRvZXMgbm90IHNlbmQgaXQsIHJhdGhlciB0aGFuIGEgZ3Vlc3MgdGhhdCB3b3VsZCBiZSB3cm9uZyB3aGVuZXZlclxuICAvLyB0aGUgZGVmYXVsdCBhcHBsaWVzLlxuICBjb250ZXh0TGluZXM6IHN0cmluZ1tdO1xuICAvLyBIb3cgdGhlIG9wZW4gcmVwb3J0IHdyaXRlcyBpdHMgbnVtYmVycyBhbmQgZGF0ZXMgKGl0cyBsb2NhbGUsIGN1cnJlbmN5XG4gIC8vIGFuZCBwZXJjZW50IGZvcm0pLCByZWFkIG9uY2Ugc28gZXZlcnkgcGFnZSBvZiB0aGUgZmlsZSBhZ3JlZXMuXG4gIGZvcm1hdENvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQ7XG59XG5cbi8vIE9uZSBleHBvcnRlZCBsaXN0IGNvbHVtbjogdGhlIGNlbGwga2V5LCBpdHMgaGVhZGluZyBhbmQgaXRzIGZvcm1hdCwgYW5kXG4vLyB3aGV0aGVyIGl0cyBjZWxscyBhcmUgZm9ybWF0dGVkIG51bWJlcnMsIHdoaWNoIGV2ZXJ5IGV4cG9ydCByaWdodC1hbGlnbnNcbi8vIChoZWFkZXIgaW5jbHVkZWQpIGFzIHRoZSBzY3JlZW4gZG9lcy5cbmV4cG9ydCB0eXBlIEV4cG9ydExpc3RDb2x1bW4gPSBMaXN0Q29sdW1uICYgeyBudW1lcmljOiBib29sZWFuIH07XG5cbi8vIEhvdyBtYW55IHRpbGUgcXVlcmllcyBhbiBleHBvcnQgcnVucyBhdCBvbmNlLlxuLy9cbi8vIE5vdCBhIHBvbGl0ZW5lc3Mgc2V0dGluZyDigJQgaXQgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhIGRlY2sgYW5kIGEgYnJva2VuXG4vLyBvbmUuIFRoZXNlIHF1ZXJpZXMgYXJlIGhlYXZ5IGFuZCByZWFkIHRoZSBzYW1lIHRhYmxlcywgc28gZmlyaW5nIGFsbCBvZiB0aGVtXG4vLyB0b2dldGhlciBwdXRzIGV2ZXJ5IG9uZSBpbiBjb250ZW50aW9uIGZvciB0aGUgc2FtZSBkYXRhYmFzZSBhdCB0aGUgc2FtZVxuLy8gbW9tZW50IGFuZCB0aGV5IGNyb3NzIHRoZSBzdGF0ZW1lbnQgY2VpbGluZyBhcyBhIGdyb3VwOiBtZWFzdXJlZCBvbiByZXBvcnRcbi8vIDI4LCB0ZW4gdGlsZXMgdGhhdCBlYWNoIGFuc3dlciBpbiA5LTI0cyBydW4gb25lIGFmdGVyIGFub3RoZXIgYWxsIGZhaWxlZCBhdFxuLy8gfjMwcyB3aGVuIHJlbGVhc2VkIHRvZ2V0aGVyLiBDb25jdXJyZW5jeSBidXlzIHdhbGwtY2xvY2sgb25seSB1cCB0byB0aGUgcG9pbnRcbi8vIHdoZXJlIHRoZSBxdWVyaWVzIHN0YXJ0IHRha2luZyBpdCBiYWNrIG9mZiBlYWNoIG90aGVyLCBhbmQgcGFzdCB0aGF0IGl0IGJ1eXNcbi8vIGZhaWx1cmVzLlxuY29uc3QgRVhQT1JUX0NPTkNVUlJFTkNZID0gMztcblxuLy8gV2hhdCBhIGNvbXBvbmVudCB3aXRoIG5vdGhpbmcgdG8gZHJhdyBwcmludHMgaW4gdGhlIGV4cG9ydGVkIGZpbGUuXG4vL1xuLy8gVGhlIHR3byBjYXNlcyBtdXN0IG5vdCByZWFkIGFsaWtlLiBBIHRpbGUgdGhhdCByZXR1cm5lZCBubyByb3dzIGlzIGEgZmluZGluZ1xuLy8gYWJvdXQgdGhlIHBlcmlvZCDigJQgdGhlIHJlcG9ydCB3b3JrZWQgYW5kIHRoZSBhbnN3ZXIgaXMgXCJub25lXCIuIEEgdGlsZSB3aG9zZVxuLy8gcXVlcnkgZmFpbGVkIGlzIGEgaG9sZSBpbiB0aGUgZmlsZSwgYW5kIGNhbGxpbmcgdGhhdCBcIkRhdGEgdW5hdmFpbGFibGVcIiB0ZWxsc1xuLy8gdGhlIHJlYWRlciB0aGUgZGF0YSBkb2VzIG5vdCBleGlzdCB3aGVuIHdoYXQgaGFwcGVuZWQgaXMgdGhhdCBub2JvZHkgbWFuYWdlZFxuLy8gdG8gYXNrIGZvciBpdC4gU2hhcmVkIGJ5IGJvdGggcmVuZGVyZXJzIHNvIHRoZSBQREYgYW5kIHRoZSBkZWNrIGNhbm5vdCBlbmQgdXBcbi8vIGRlc2NyaWJpbmcgdGhlIHNhbWUgaG9sZSB0d28gZGlmZmVyZW50IHdheXMuXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlMYWJlbChpdGVtOiBDb2xsZWN0ZWRDb21wb25lbnQpOiBzdHJpbmcge1xuICByZXR1cm4gaXRlbS5kYXRhID8gJ05vIGRhdGEnIDogJ0NvdWxkIG5vdCBiZSBnZW5lcmF0ZWQnO1xufVxuXG4vLyBBIGNvbXBvbmVudCdzIHRpdGxlIGFzIGFuIGV4cG9ydGVkIGZpbGUgcHJpbnRzIGl0LiBBIHNlYXJjaGVkIGxpc3Qgc2F5cyBzbyxcbi8vIHNpbmNlIGl0cyB0YWJsZSBob2xkcyBvbmx5IHRoZSBtYXRjaGluZyByb3dzOiAnT3JkZXJzIChtYXRjaGluZyBcIm5vcnRoXCIpJy5cbi8vIEFuIHVudGl0bGVkIG9uZSByZWFkcyAnTWF0Y2hpbmcgXCJub3J0aFwiJy4gJycgd2hlbiB0aGVyZSBpcyBub3RoaW5nIHRvIHByaW50LlxuLy8gU2hhcmVkIGJ5IHRoZSBQREYgYW5kIHRoZSBkZWNrLCBjb250aW51YXRpb24gcGFnZXMgaW5jbHVkZWQuXG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0VGl0bGUoY29tcG9uZW50OiBSZXBvcnRDb21wb25lbnQsIHNlYXJjaD86IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xuICBjb25zdCB0aXRsZSA9IGNvbXBvbmVudC50aXRsZSA/PyAnJztcblxuICBpZiAoIXNlYXJjaCkge1xuICAgIHJldHVybiB0aXRsZTtcbiAgfVxuXG4gIHJldHVybiB0aXRsZSA/IGAke3RpdGxlfSAobWF0Y2hpbmcgXCIke3NlYXJjaH1cIilgIDogYE1hdGNoaW5nIFwiJHtzZWFyY2h9XCJgO1xufVxuXG4vLyBXaGV0aGVyIGEgdGlsZSdzIHF1ZXJ5IGZhaWxlZC4gQSB0ZXh0IGJsb2NrIGhhcyBubyBxdWVyeSwgc28gaXQgbmV2ZXIgZGlkLlxuZXhwb3J0IGZ1bmN0aW9uIGlzRmFpbGVkKGl0ZW06IENvbGxlY3RlZENvbXBvbmVudCk6IGJvb2xlYW4ge1xuICByZXR1cm4gIWl0ZW0uZGF0YSAmJiBpdGVtLmNvbXBvbmVudC50eXBlICE9PSAndGV4dCc7XG59XG5cbi8vIFRoZSBsaW5lcyB1bmRlciB0aGUgcmVwb3J0J3MgbmFtZSBvbiB0aGUgUERGIHRpdGxlIHBhZ2UgYW5kIHRoZSB0aXRsZSBzbGlkZTpcbi8vIHRoZSBleHBvcnQgZGF0ZSwgdGhlIGFjdGl2ZSBmaWx0ZXJzLCB0aGVuIHdoYXQgdGhlIG51bWJlcnMgYXJlIG1lYXN1cmVkIGluLlxuLy8gVGhlIGRhdGUgYWx3YXlzIGxlYWRzICh0aGUgUG93ZXJQb2ludCBtYXJrcyB0aGF0IGxpbmUgYXMgd3JpdHRlbiBpbiB0aGVcbi8vIHJlcG9ydCdzIGxvY2FsZSkuIEl0IGlzIHRvZGF5IGluIHRoZSByZXBvcnQncyB6b25lLCB0aGUgc2FtZSBkYXkgaXRzIGZpbHRlcnNcbi8vIHJlc29sdmUgXCJ0b2RheVwiIHRvLCB3cml0dGVuIGluIHRoZSByZXBvcnQncyBsb2NhbGUuXG5leHBvcnQgZnVuY3Rpb24gY292ZXJMaW5lcyhjb2xsZWN0ZWQ6IENvbGxlY3RlZFJlcG9ydCk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICBmb3JtYXRMb2NhbERhdGUoXG4gICAgICBuZXcgRGF0ZSgpLFxuICAgICAgY29sbGVjdGVkLmZvcm1hdENvbnRleHQubG9jYWxlLFxuICAgICAgREFZX0xPTkcsXG4gICAgICByZXNvbHZlUmVwb3J0VGltZXpvbmUoY29sbGVjdGVkLnJlcG9ydCksXG4gICAgKSxcbiAgICAuLi5jb2xsZWN0ZWQuZmlsdGVyU3VtbWFyeSxcbiAgICAuLi5jb2xsZWN0ZWQuY29udGV4dExpbmVzLFxuICBdO1xufVxuXG4vLyBBbiBleHBvcnRlZCBsaXN0IGNlbGwsIHJlYWRpbmcgbGlrZSB0aGUgb24tc2NyZWVuIGNlbGwsIHRocm91Z2ggdGhlIHNhbWVcbi8vIGZ1bmN0aW9ucyBhcyB0aGUgc2NyZWVuOiBhIGRhdGUgY29sdW1uIHJlbmRlcnMgaW4gdGhlIHJlcG9ydCdzIHpvbmUgYW5kXG4vLyBsb2NhbGUsIGFuZCBhIGNvbHVtbiB3aXRoIG51bWJlci1mb3JtYXQga2V5cyAoYSBjcm9zcy10YWIncyBjZWxscyB0aHJvdWdoXG4vLyBpdHMgY2VsbEZvcm1hdCkgaW4gdGhlIHJlcG9ydCdzIGxvY2FsZSBhbmQgY3VycmVuY3kuIEFueSBvdGhlciB2YWx1ZSBnb2VzXG4vLyBvdXQgdmVyYmF0aW0sIGFuZCBhbiBlbXB0eSBvbmUgYXMgJycuIENTViBuZXZlciBjb21lcyB0aHJvdWdoIGhlcmU6IGl0c1xuLy8gdmFsdWVzIHN0YXkgcmF3LlxuZXhwb3J0IGZ1bmN0aW9uIGV4cG9ydENlbGwoXG4gIHZhbHVlOiB1bmtub3duLFxuICBjb2x1bW46IExpc3RDb2x1bW4sXG4gIHRpbWV6b25lOiBzdHJpbmcsXG4gIGNvbnRleHQ6IFJlcG9ydEZvcm1hdENvbnRleHQsXG4pOiBzdHJpbmcge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmIChjb2x1bW4uZm9ybWF0ID09PSBSZXBvcnRMaXN0Q29sdW1uRm9ybWF0LkRhdGUpIHtcbiAgICByZXR1cm4gZm9ybWF0UmVwb3J0RGF0ZSh2YWx1ZSwgdGltZXpvbmUsIGNvbnRleHQubG9jYWxlKTtcbiAgfVxuXG4gIHJldHVybiBoYXNOdW1iZXJGb3JtYXQoY29sdW1uKSA/IGZvcm1hdE51bWJlcih2YWx1ZSwgY29sdW1uLCBjb250ZXh0LCB7IGVtcHR5OiAnJyB9KSA6IFN0cmluZyh2YWx1ZSk7XG59XG5cbi8vIFRoZSBjb2x1bW5zIGFuIGV4cG9ydGVkIGxpc3QgdGFibGUgZHJhd3MuIEEgY3Jvc3MtdGFiJ3MgYXJyaXZlIHdpdGggaXRzXG4vLyByb3dzICh0aGUgcm93IGtleSBmaXJzdCwgdGhlbiBvbmUgcGVyIHBpdm90IHZhbHVlKSwgc2luY2Ugb25seSB0aGUgcmVzdWx0XG4vLyBrbm93cyB0aGUgcGl2b3QgdmFsdWVzLCBhbmQgYXJlIGJ1aWx0IGJ5IHBpdm90Q29sdW1uU3BlY3MoKSBhcyBvbiBzY3JlZW46XG4vLyBoZWFkZWQgYnkgaXRzIHBlcmlvZHMgaW4gdGhlIHJlcG9ydCdzIGxvY2FsZSwgZWFjaCBwaXZvdCB2YWx1ZSBmb3JtYXR0ZWQgYnlcbi8vIGNlbGxGb3JtYXQuIEEgcGxhaW4gbGlzdCBkcmF3cyBpdHMgY29uZmlndXJlZCBjb2x1bW5zIGJ1dCB0aGUgb25lcyB0aGVcbi8vIHZpZXdlciBoaWQgKGBoaWRkZW5gLCBrZXB0IHRvIGxpc3RIaWRkZW5Db2x1bW5zLCBzbyBuZXZlciBhbGwgb2YgdGhlbSksXG4vLyBlbHNlIGV2ZXJ5IGNvbHVtbiB0aGUgcXVlcnkgcmV0dXJuZWQsIGFzIGl0IGNhbWUuXG5leHBvcnQgZnVuY3Rpb24gbGlzdENvbHVtbnMoXG4gIGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50LFxuICBkYXRhOiBDb21wb25lbnREYXRhLFxuICBsb2NhbGU6IFJlcG9ydExvY2FsZVRhZyxcbiAgaGlkZGVuOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuKTogRXhwb3J0TGlzdENvbHVtbltdIHtcbiAgY29uc3QgY29uZmlnID0gKGNvbXBvbmVudC5jb25maWcgPz8ge30pIGFzIExpc3RDb25maWc7XG5cbiAgaWYgKGNvbmZpZy5waXZvdEJ5Py5jb2x1bW4pIHtcbiAgICByZXR1cm4gcGl2b3RDb2x1bW5TcGVjcyhjb25maWcsIGRhdGEsIGxvY2FsZSk7XG4gIH1cblxuICBpZiAoY29uZmlnLmNvbHVtbnM/Lmxlbmd0aCkge1xuICAgIGNvbnN0IGhpZGRlbk5hbWVzID0gbGlzdEhpZGRlbkNvbHVtbnMoY29uZmlnLCBoaWRkZW4pO1xuXG4gICAgcmV0dXJuIGNvbmZpZy5jb2x1bW5zXG4gICAgICAuZmlsdGVyKChjb2x1bW4pID0+ICFoaWRkZW5OYW1lcy5pbmNsdWRlcyhjb2x1bW4uY29sdW1uKSlcbiAgICAgIC5tYXAoKGNvbHVtbikgPT4gKHsgLi4uY29sdW1uLCBudW1lcmljOiBoYXNOdW1iZXJGb3JtYXQoY29sdW1uKSB9KSk7XG4gIH1cblxuICByZXR1cm4gZGF0YS5jb2x1bW5zLm1hcCgoY29sdW1uKSA9PiAoeyBjb2x1bW4sIG51bWVyaWM6IGZhbHNlIH0pKTtcbn1cblxuLy8gVGhlIGhlYWRpbmcgb3ZlciBlYWNoIGNvbHVtbiBvZiBsaXN0Q29sdW1ucygpOiBhIHBsYWluIGxpc3QncyBjb25maWd1cmVkXG4vLyBsYWJlbCwgZWxzZSBpdHMgY29sdW1uOyBhIGNyb3NzLXRhYidzIGhlYWRpbmcgZnJvbSBwaXZvdENvbHVtblNwZWNzKCkuXG5leHBvcnQgZnVuY3Rpb24gbGlzdEhlYWRpbmdzKFxuICBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCxcbiAgZGF0YTogQ29tcG9uZW50RGF0YSxcbiAgbG9jYWxlOiBSZXBvcnRMb2NhbGVUYWcsXG4gIGhpZGRlbjogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSxcbik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGxpc3RDb2x1bW5zKGNvbXBvbmVudCwgZGF0YSwgbG9jYWxlLCBoaWRkZW4pLm1hcCgoY29sdW1uKSA9PiBjb2x1bW4ubGFiZWwgfHwgY29sdW1uLmNvbHVtbik7XG59XG5cbi8vIEFuIGV4cG9ydGVkIGxpc3QncyB0b3RhbHMgcm93LCBvbmUgY2VsbCBwZXIgY29sdW1uIG9mIGxpc3RDb2x1bW5zKCk6IGVhY2hcbi8vIHRvdGFsIHdyaXR0ZW4gbGlrZSBpdHMgY29sdW1uJ3MgY2VsbHMsIGFuZCBMSVNUX1RPVEFMX0xBQkVMIGluIHRoZSBmaXJzdFxuLy8gY29sdW1uIHdoZW4gdGhhdCBjb2x1bW4gaG9sZHMgbm8gdG90YWwgKGEgY3Jvc3MtdGFiJ3Mgcm93IGtleSkuIG51bGwgd2hlblxuLy8gdGhlIGxpc3QgaGFzIG5vIHRvdGFscy4gVGhlIENTViBuZXZlciBjYXJyaWVzIG9uZTogaXRzIHJvd3Mgc3RheSByYXcuXG5leHBvcnQgZnVuY3Rpb24gbGlzdFRvdGFsc1JvdyhcbiAgZGF0YTogQ29tcG9uZW50RGF0YSxcbiAgY29sdW1uczogcmVhZG9ubHkgRXhwb3J0TGlzdENvbHVtbltdLFxuICB0aW1lem9uZTogc3RyaW5nLFxuICBjb250ZXh0OiBSZXBvcnRGb3JtYXRDb250ZXh0LFxuKTogc3RyaW5nW10gfCBudWxsIHtcbiAgY29uc3QgdG90YWxzID0gZGF0YS50b3RhbHM7XG5cbiAgaWYgKCF0b3RhbHMpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGxhYmVsID0gbGlzdFRvdGFsc0xhYmVsQ29sdW1uKGNvbHVtbnMsIHRvdGFscyk7XG5cbiAgcmV0dXJuIGNvbHVtbnMubWFwKChjb2x1bW4pID0+IChjb2x1bW4uY29sdW1uID09PSBsYWJlbFxuICAgID8gTElTVF9UT1RBTF9MQUJFTFxuICAgIDogZXhwb3J0Q2VsbCh0b3RhbHNbY29sdW1uLmNvbHVtbl0sIGNvbHVtbiwgdGltZXpvbmUsIGNvbnRleHQpKSk7XG59XG5cbi8vIFRoZSBsYXN0IHJvdyBvZiBhbiBleHBvcnRlZCBsaXN0IHRhYmxlIHRoYXQgc3RvcHMgc2hvcnQgb2YgaXRzIHJlc3VsdDogaG93XG4vLyBtYW55IHJvd3MgdGhlIGZpbGUgbGVhdmVzIG91dCBhbmQgd2hlcmUgdGhlIHdob2xlIHNldCBjYW4gYmUgaGFkLiBFYWNoXG4vLyBmb3JtYXQgZmV0Y2hlcyBpdHMgb3duIG51bWJlciBvZiByb3dzIChQREZfTElTVF9ST1dTLCBQUFRYX0xJU1RfUk9XUyksIGFuZFxuLy8gYm90aCBuYW1lIHdoYXQgaXMgbGVmdCB3aXRoIHRoaXMgb25lIHNlbnRlbmNlLlxuZXhwb3J0IGZ1bmN0aW9uIG1vcmVSb3dzTm90aWNlKHJlbWFpbmluZzogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGDigKYgJHtyZW1haW5pbmd9IG1vcmUgcm93KHMpIOKAlCB1c2UgdGhlIGNvbXBvbmVudCdzIENTViBleHBvcnQgZm9yIHRoZSBmdWxsIGRhdGFzZXRgO1xufVxuXG4vLyBUaGUgcGFnZXMgb2YgYSBjb2xsZWN0ZWQgcmVwb3J0IHRoYXQgaGF2ZSBhdCBsZWFzdCBvbmUgdGlsZSB3aG9zZSBxdWVyeVxuLy8gZmFpbGVkIOKAlCB3aGF0IHRoZSBleHBvcnQgZ2F0ZSBuYW1lcyB0byB0aGUgdXNlciwgYW5kIHdoYXQgbWFrZXMgXCJzb21lIG9mIHRoaXNcbi8vIGZpbGUgaXMgbWlzc2luZ1wiIGEgZmFjdCB0aGUgY2FsbGVyIGNhbiBhY3Qgb24gcmF0aGVyIHRoYW4gYSB0aGluZyB0aGV5IG5vdGljZVxuLy8gaW4gdGhlIFBERiBhZnRlcndhcmRzLlxuZXhwb3J0IGZ1bmN0aW9uIGZhaWxlZFBhZ2VOYW1lcyhjb2xsZWN0ZWQ6IENvbGxlY3RlZFJlcG9ydCk6IHN0cmluZ1tdIHtcbiAgLy8gTnVtYmVyZWQgYmVmb3JlIHRoZSBmaWx0ZXIg4oCUIGFuIHVubmFtZWQgcGFnZSA0IHRoYXQgZmFpbGVkIGhhcyB0byByZWFkXG4gIC8vIFwiUGFnZSA0XCIsIG5vdCBcIlBhZ2UgMVwiIGJlY2F1c2UgaXQgaGFwcGVuZWQgdG8gYmUgdGhlIGZpcnN0IGZhaWx1cmUuXG4gIHJldHVybiBjb2xsZWN0ZWQucGFnZXNcbiAgICAubWFwKChwYWdlLCBpbmRleCkgPT4gKHsgcGFnZSwgbnVtYmVyOiBpbmRleCArIDEgfSkpXG4gICAgLmZpbHRlcigoeyBwYWdlIH0pID0+IHBhZ2UuY29tcG9uZW50cy5zb21lKGlzRmFpbGVkKSlcbiAgICAubWFwKCh7IHBhZ2UsIG51bWJlciB9KSA9PiBwYWdlLnBhZ2UubmFtZSB8fCBgUGFnZSAke251bWJlcn1gKTtcbn1cblxuLy8gR2F0aGVycyBldmVyeXRoaW5nIGFuIGV4cG9ydCBuZWVkczogZXZlcnkgY29tcG9uZW50J3MgZGF0YSBhY3Jvc3MgQUxMIHBhZ2VzXG4vLyAodGhlIGNhbnZhcyBvbmx5IHJlbmRlcnMgdGhlIGFjdGl2ZSBwYWdlLCBzbyBleHBvcnRzIGNhbid0IHNjcmFwZSB0aGVcbi8vIHNjcmVlbiksIGZldGNoZWQgZnJlc2ggd2l0aCB0aGUgdmlld2VyJ3MgY3VycmVudCBmaWx0ZXIgc3RhdGUuXG4vL1xuLy8gQSBmYWlsZWQgY29tcG9uZW50IHJlc29sdmVzIHRvIGEgbnVsbCBgZGF0YWAgcmF0aGVyIHRoYW4gZmFpbGluZyB0aGUgd2hvbGVcbi8vIGNvbGxlY3Rpb24g4oCUIGJ1dCB0aGF0IGlzIHNvIHRoZSBjYWxsZXIgY2FuIFJFUE9SVCB3aGF0IGZhaWxlZCwgbm90IHNvIGl0IGNhblxuLy8gYmUgaWdub3JlZDogc2VlIGZhaWxlZFBhZ2VOYW1lcygpIGFuZCB0aGUgZXhwb3J0IGdhdGUgdGhhdCB1c2VzIGl0LlxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlcG9ydEV4cG9ydENvbGxlY3RvclNlcnZpY2Uge1xuXG4gIHByaXZhdGUgX3JlcG9ydERhdGEgPSBpbmplY3QoUmVwb3J0RGF0YSk7XG4gIHByaXZhdGUgX2ZpbHRlclN0YXRlID0gaW5qZWN0KFJlcG9ydEZpbHRlclN0YXRlU2VydmljZSk7XG5cbiAgLy8gbGlzdFJvd3MgaXMgaG93IG1hbnkgcm93cyBlYWNoIGxpc3QgZmV0Y2hlczogdGhlIHJlbmRlcmVyJ3Mgb3duIGNhcCwgc2luY2VcbiAgLy8gYSBQREYgdGFibGUgY29udGludWVzIG9udG8gZXh0cmEgcGFnZXMgYW5kIGEgc2xpZGUgdGFibGUgY2Fubm90LlxuICBwdWJsaWMgY29sbGVjdChyZXBvcnQ6IFJlcG9ydCwgbGlzdFJvd3M6IG51bWJlcik6IE9ic2VydmFibGU8Q29sbGVjdGVkUmVwb3J0PiB7XG4gICAgY29uc3Qgc2xvdHM6IHsgcGFnZUluZGV4OiBudW1iZXI7IGNvbXBvbmVudDogUmVwb3J0Q29tcG9uZW50IH1bXSA9IFtdO1xuXG4gICAgcmVwb3J0LnBhZ2VzLmZvckVhY2goKHBhZ2UsIHBhZ2VJbmRleCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgcGFnZS5jb21wb25lbnRzKSB7XG4gICAgICAgIHNsb3RzLnB1c2goeyBwYWdlSW5kZXgsIGNvbXBvbmVudCB9KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFRleHQgYmxvY2tzIGhhdmUgbm90aGluZyB0byBmZXRjaCDigJQgdGhleSByaWRlIHRocm91Z2ggd2l0aCBubyBkYXRhLiBUaGVcbiAgICAvLyBoZWFkZXIvZm9vdGVyIChyZXBvcnQubWFzdGVyKSBpcyByZWFkIGJ5IHRoZSByZW5kZXJlcnMgc3RyYWlnaHQgb2ZmIHRoZVxuICAgIC8vIHJlcG9ydCBmb3IgdGhlIHNhbWUgcmVhc29uLlxuXG4gICAgLy8gUmVsZWFzZWQgYSBmZXcgYXQgYSB0aW1lIHJhdGhlciB0aGFuIGFsbCBhdCBvbmNlLiBtZXJnZU1hcCBjb21wbGV0ZXMgb3V0XG4gICAgLy8gb2Ygb3JkZXIsIHNvIGVhY2ggcmVzdWx0IGNhcnJpZXMgdGhlIHNsb3QgaXQgY2FtZSBmcm9tIGFuZCB0aGUgcm93cyBhcmVcbiAgICAvLyBmaWxlZCBieSBpbmRleCDigJQgdGhlIGRlY2sncyBwYWdlIG9yZGVyIGNhbid0IGRlcGVuZCBvbiB3aGljaCBxdWVyeVxuICAgIC8vIGhhcHBlbmVkIHRvIGZpbmlzaCBmaXJzdC5cbiAgICBjb25zdCBhbGwkID0gc2xvdHMubGVuZ3RoXG4gICAgICA/IGZyb20oc2xvdHMubWFwKChzbG90LCBpbmRleCkgPT4gKHsgc2xvdCwgaW5kZXggfSkpKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICBtZXJnZU1hcChcbiAgICAgICAgICAgICh7IHNsb3QsIGluZGV4IH0pID0+IHRoaXMuX2NvbXBvbmVudERhdGEocmVwb3J0LCBzbG90LmNvbXBvbmVudCwgbGlzdFJvd3MpXG4gICAgICAgICAgICAgIC5waXBlKG1hcCgoaXRlbSkgPT4gKHsgaXRlbSwgaW5kZXggfSkpKSxcbiAgICAgICAgICAgIEVYUE9SVF9DT05DVVJSRU5DWSxcbiAgICAgICAgICApLFxuICAgICAgICAgIHRvQXJyYXkoKSxcbiAgICAgICAgKVxuICAgICAgOiBvZihbXSBhcyB7IGl0ZW06IENvbGxlY3RlZENvbXBvbmVudDsgaW5kZXg6IG51bWJlciB9W10pO1xuXG4gICAgLy8gVGhlIHN1bW1hcnkgcmlkZXMgYWxvbmdzaWRlIHRoZSBjb21wb25lbnQgZGF0YSByYXRoZXIgdGhhbiBiZWluZyBidWlsdCBhdFxuICAgIC8vIHRoZSBlbmQsIGJlY2F1c2UgbmFtaW5nIGEgc2VsZWN0IGZpbHRlcidzIHZhbHVlcyBpcyBpdHNlbGYgYSByZXF1ZXN0LlxuICAgIHJldHVybiBmb3JrSm9pbih7IGNvbGxlY3RlZDogYWxsJCwgZmlsdGVyU3VtbWFyeTogdGhpcy5nZXRGaWx0ZXJTdW1tYXJ5KHJlcG9ydCkgfSlcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKHsgY29sbGVjdGVkLCBmaWx0ZXJTdW1tYXJ5IH0pID0+IHtcbiAgICAgICAgICBjb25zdCBwYWdlczogQ29sbGVjdGVkUGFnZVtdID0gcmVwb3J0LnBhZ2VzLm1hcCgocGFnZSkgPT4gKHsgcGFnZSwgY29tcG9uZW50czogW10gfSkpO1xuXG4gICAgICAgICAgWy4uLmNvbGxlY3RlZF1cbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmluZGV4IC0gYi5pbmRleClcbiAgICAgICAgICAgIC5mb3JFYWNoKCh7IGl0ZW0sIGluZGV4IH0pID0+IHtcbiAgICAgICAgICAgICAgcGFnZXNbc2xvdHNbaW5kZXhdLnBhZ2VJbmRleF0uY29tcG9uZW50cy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVwb3J0LFxuICAgICAgICAgICAgcGFnZXMsXG4gICAgICAgICAgICBmaWx0ZXJTdW1tYXJ5LFxuICAgICAgICAgICAgY29udGV4dExpbmVzOiB0aGlzLl9jb250ZXh0TGluZXMocmVwb3J0KSxcbiAgICAgICAgICAgIGZvcm1hdENvbnRleHQ6IHRoaXMuX2ZpbHRlclN0YXRlLmZvcm1hdENvbnRleHQoKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBcIlJlcG9ydCBQZXJpb2Q6IEp1biAxMiwgMjAyNSDigJMgSnVuIDEyLCAyMDI2XCIsIFwiUmVnaW9uOiBOb3J0aCwgRWFzdFwiIOKAlCBvbmVcbiAgLy8gbGluZSBwZXIgZmlsdGVyIGdyb3VwIHRoYXQgaGFzIGFuIGFjdGl2ZSBzZXNzaW9uIHZhbHVlLCB0aGVuIHRoZSBncm91cC1ieVxuICAvLyBsaW5lLiBUaGUgZmlsdGVyIGJhciBhcyB0aGUgdmlld2VyIHJlYWRzIGl0OiB0aGUgUERGIGFuZCBQb3dlclBvaW50IGNvdmVyc1xuICAvLyBwcmludCBpdCwgYW5kIHRoZSByZXBvcnQgemlwIGV4cG9ydCBzZW5kcyBpdCBmb3IgaXRzIG5vdGVzIGZpbGUuIERhdGVzIGFyZVxuICAvLyB3cml0dGVuIGluIHRoZSByZXBvcnQncyBsb2NhbGUsIHNvIHRoZSBub3RlcyBuYW1lIHRoZSBwZXJpb2QgYXMgdGhlIGNvdmVyXG4gIC8vIGRvZXMuXG4gIC8vXG4gIC8vIEEgc2VsZWN0IGdyb3VwIHN0b3JlcyBpZHMsIHNvIGl0cyBsaW5lIGhhcyB0byBiZSBuYW1lZCBvZmYgdGhlIG9wdGlvbiBsaXN0XG4gIC8vIGJlZm9yZSBpdCBjYW4gYmUgcHJpbnRlZDsgYSBkYXRlIG9yIGtleXdvcmQgZ3JvdXAgYWxyZWFkeSBob2xkcyBpdHMgb3duXG4gIC8vIGRpc3BsYXkgdmFsdWUgYW5kIHJlc29sdmVzIHN5bmNocm9ub3VzbHkuXG4gIHB1YmxpYyBnZXRGaWx0ZXJTdW1tYXJ5KHJlcG9ydDogUmVwb3J0KTogT2JzZXJ2YWJsZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IGxpbmVzOiBPYnNlcnZhYmxlPHN0cmluZz5bXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBncm91cCBvZiByZXBvcnQuZmlsdGVyR3JvdXBzID8/IFtdKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX2ZpbHRlclN0YXRlLnZhbHVlKGdyb3VwLmlkKTtcbiAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxhYmVsID0gZ3JvdXAubGFiZWwgfHwgJ0ZpbHRlcic7XG5cbiAgICAgIGlmICh2YWx1ZS5zdGFydCB8fCB2YWx1ZS5lbmQpIHtcbiAgICAgICAgbGluZXMucHVzaChvZihgJHtsYWJlbH06ICR7dGhpcy5fZGF0ZSh2YWx1ZS5zdGFydCl9IOKAkyAke3RoaXMuX2RhdGUodmFsdWUuZW5kKX1gKSk7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlLnZhbHVlcz8ubGVuZ3RoKSB7XG4gICAgICAgIGxpbmVzLnB1c2godGhpcy5fc2VsZWN0TGluZShsYWJlbCwgZ3JvdXAsIHJlcG9ydC5pZCwgdmFsdWUudmFsdWVzKSk7XG4gICAgICB9IGVsc2UgaWYgKHZhbHVlLnZhbHVlPy50cmltKCkpIHtcbiAgICAgICAgbGluZXMucHVzaChvZihgJHtsYWJlbH06IFwiJHt2YWx1ZS52YWx1ZS50cmltKCl9XCJgKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIGdyb3VwLWJ5IGdyYWluLCB1bmRlciB0aGUgcmVwb3J0J3Mgb3duIG5hbWUgZm9yIHRoZSBjb250cm9sIOKAlCBhIGNvdmVyXG4gICAgLy8gc2hlZXQgcmVhZGluZyBcIkZyZXF1ZW5jeVwiIHdoZW4gdGhlIHJlcG9ydCBjYWxscyBpdCBcIlBlcmlvZFwiIGRlc2NyaWJlcyBhXG4gICAgLy8gY29udHJvbCB0aGUgcmVhZGVyIGNhbm5vdCBmaW5kIG9uIHNjcmVlbi5cbiAgICBjb25zdCBncmFudWxhcml0eSA9IHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpO1xuICAgIGlmIChncmFudWxhcml0eSkge1xuICAgICAgY29uc3Qgb3B0aW9uID0gR1JBTlVMQVJJVFlfT1BUSU9OUy5maW5kKChpdGVtKSA9PiBpdGVtLnZhbHVlID09PSBncmFudWxhcml0eSk7XG4gICAgICBjb25zdCBsYWJlbCA9IHJlcG9ydC5jb25maWc/Lmdyb3VwQnk/LmxhYmVsIHx8ICdHcm91cCBCeSc7XG4gICAgICBsaW5lcy5wdXNoKG9mKGAke2xhYmVsfTogJHtvcHRpb24/Lm5hbWUgPz8gZ3JhbnVsYXJpdHl9YCkpO1xuICAgIH1cblxuICAgIHJldHVybiBsaW5lcy5sZW5ndGggPyBmb3JrSm9pbihsaW5lcykgOiBvZihbXSk7XG4gIH1cblxuICBwcml2YXRlIF9jb21wb25lbnREYXRhKHJlcG9ydDogUmVwb3J0LCBjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCwgbGlzdFJvd3M6IG51bWJlcik6IE9ic2VydmFibGU8Q29sbGVjdGVkQ29tcG9uZW50PiB7XG4gICAgaWYgKGNvbXBvbmVudC50eXBlID09PSAndGV4dCcpIHtcbiAgICAgIHJldHVybiBvZih7IGNvbXBvbmVudCwgZGF0YTogbnVsbCwgaGlkZGVuQ29sdW1uczogW10gfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsdGVycyA9IHRoaXMuX2ZpbHRlclN0YXRlLnJlc29sdmVGb3JDb21wb25lbnQoY29tcG9uZW50KTtcbiAgICAvLyBBIHRpbWUtc2VyaWVzIGNoYXJ0IGNhcnJpZXMgdGhlIHZpZXdlcidzIGdyb3VwLWJ5IGdyYWluIHNvIHRoZSBleHBvcnRcbiAgICAvLyByZS1idWNrZXRzIGV4YWN0bHkgYXMgdGhlIHNjcmVlbiBkb2VzOyBsaXN0cyBjYXJyeSB0aGVpciBleHBvcnQgcGFnaW5nXG4gICAgLy8gYW5kIHRoZSB2aWV3ZXIncyBoZWFkZXIgc29ydCBhbmQgc2VhcmNoLCBzbyB0aGUgdGFibGUgcmVhZHMgaW4gdGhlXG4gICAgLy8gc2NyZWVuJ3Mgb3JkZXIgYW5kIGhvbGRzIHRoZSBzY3JlZW4ncyByb3dzLlxuICAgIC8vXG4gICAgLy8gVGhlIHRpbWUtc2VyaWVzIGNoZWNrIGRlbGliZXJhdGVseSBtaXJyb3JzIHRoZSBzZXJ2ZXIncyBjYW5vbmljYWxcbiAgICAvLyBSZXBvcnRRdWVyeVJ1bm5lcjo6X2lzVGltZVNlcmllc0NoYXJ0LCBzbyBhIHByb2R1Y3QgcGlubmVkIHRvIGFuIG9sZGVyXG4gICAgLy8gZnJhbWV3b3JrIGRvZXMgbm90IHJlLWJ1Y2tldCBhIG5vbi10aW1lIGNoYXJ0LlxuICAgIGNvbnN0IGZyZXF1ZW5jeSA9IHRoaXMuX2ZpbHRlclN0YXRlLmZyZXF1ZW5jeSgpO1xuICAgIGNvbnN0IGlzVGltZVNlcmllcyA9IGNvbXBvbmVudC50eXBlID09PSAnY2hhcnQnICYmIGNvbXBvbmVudC5jb25maWc/LnhBeGlzPy5raW5kID09PSAndGltZSc7XG4gICAgY29uc3Qgc2VhcmNoID0gY29tcG9uZW50LnR5cGUgPT09ICdsaXN0J1xuICAgICAgPyB0aGlzLl9maWx0ZXJTdGF0ZS5saXN0U2VhcmNoKGNvbXBvbmVudC5pZCkgPz8gdW5kZWZpbmVkXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzdGF0ZTogQ29tcG9uZW50RGF0YVN0YXRlID0gY29tcG9uZW50LnR5cGUgPT09ICdsaXN0J1xuICAgICAgPyB7IHBhZ2U6IDEsIHBhZ2VTaXplOiBsaXN0Um93cywgc29ydDogdGhpcy5fZmlsdGVyU3RhdGUubGlzdFNvcnQoY29tcG9uZW50LmlkKSA/PyB1bmRlZmluZWQsIHNlYXJjaCB9XG4gICAgICA6IChpc1RpbWVTZXJpZXMgJiYgZnJlcXVlbmN5ID8geyBmcmVxdWVuY3kgfSA6IHt9KTtcbiAgICAvLyBUaGUgdGFibGUgbGVhdmVzIG91dCB0aGUgY29sdW1ucyB0aGUgdmlld2VyIGhpZC4gVGhlIHJvd3MgYXJlIGZldGNoZWRcbiAgICAvLyB3aG9sZSwgYXMgdGhlIHNjcmVlbiBmZXRjaGVzIHRoZW0sIGFuZCB0aGUgcmVuZGVyZXJzIGRyb3AgdGhlIGNlbGxzLlxuICAgIGNvbnN0IGhpZGRlbkNvbHVtbnMgPSBbLi4udGhpcy5fZmlsdGVyU3RhdGUuaGlkZGVuQ29sdW1ucyhjb21wb25lbnQuaWQpXTtcblxuICAgIC8vIGhhbmRsZXJzOiBmYWxzZSBrZWVwcyB0aGUgYXBwJ3MgZ2xvYmFsIGVycm9yIGRpYWxvZyBvdXQgb2YgdGhpcy4gQSBmYWlsZWRcbiAgICAvLyB0aWxlIGlzIHJlcG9ydGVkIG9uY2UsIGJ5IHRoZSBleHBvcnQgZ2F0ZSwgbmFtaW5nIHRoZSBwYWdlcyBpdCBjb3N0IOKAlFxuICAgIC8vIG5ldmVyIGFzIHRlbiBzdGFja2VkIG1vZGFscyBjYXJyeWluZyB0aGUgZGF0YWJhc2UncyBvd24gd29yZGluZy5cbiAgICAvL1xuICAgIC8vIEEgc2VhcmNoIHRoZSBzZXJ2ZXIgY291bGQgbm90IGFwcGx5IChzZWFyY2hOb3RlOiB0aGUgbGlzdCBoYXMgbm8gdGV4dFxuICAgIC8vIGNvbHVtbikgbmFycm93ZWQgbm90aGluZywgc28gdGhlIGl0ZW0gZG9lcyBub3QgY2FycnkgaXQuXG4gICAgcmV0dXJuIHRoaXMuX3JlcG9ydERhdGEuY29tcG9uZW50RGF0YShyZXBvcnQuaWQsIGNvbXBvbmVudC5pZCwgZmlsdGVycywgc3RhdGUsIHRydWUsIHsgaGFuZGxlcnM6IGZhbHNlIH0pXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChkYXRhOiBDb21wb25lbnREYXRhKTogQ29sbGVjdGVkQ29tcG9uZW50ID0+IChzZWFyY2ggJiYgIWRhdGE/LnNlYXJjaE5vdGVcbiAgICAgICAgICA/IHsgY29tcG9uZW50LCBkYXRhLCBzZWFyY2gsIGhpZGRlbkNvbHVtbnMgfVxuICAgICAgICAgIDogeyBjb21wb25lbnQsIGRhdGEsIGhpZGRlbkNvbHVtbnMgfSkpLFxuICAgICAgICBjYXRjaEVycm9yKCgpID0+IG9mKHsgY29tcG9uZW50LCBkYXRhOiBudWxsLCBoaWRkZW5Db2x1bW5zIH0pKSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBUaGUgem9uZSB0aGUgc2VydmVyIHJlc29sdmVkLCBhcyBpdHMgSUFOQSBpZCwgYW5kIHRoZSBjdXJyZW5jeSBpdCBzYXlzXG4gIC8vIHRoZSByZXBvcnQncyBtb25leSBpcyBpbiAoYSBsYWJlbDogbm90aGluZyBpcyBjb252ZXJ0ZWQpLiBPbmx5IHRoZVxuICAvLyBzZXJ2ZXIncyB2YWx1ZXMgYXJlIHByaW50ZWQ6IHRoZSBicm93c2VyJ3Mgem9uZSAocmVzb2x2ZVJlcG9ydFRpbWV6b25lJ3NcbiAgLy8gZmFsbGJhY2sgZm9yIGFuIG9sZGVyIHNlcnZlcikgaXMgbm90IHdoYXQgdGhlIG51bWJlcnMgd2VyZSBtZWFzdXJlZCBpbixcbiAgLy8gYW5kIGFuIG9sZGVyIHNlcnZlciBuYW1lcyBubyBjdXJyZW5jeSBhdCBhbGwuXG4gIHByaXZhdGUgX2NvbnRleHRMaW5lcyhyZXBvcnQ6IFJlcG9ydCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1xuICAgICAgLi4uKHJlcG9ydC5lZmZlY3RpdmVUaW1lem9uZSA/IFtgVGltZXpvbmU6ICR7cmVwb3J0LmVmZmVjdGl2ZVRpbWV6b25lfWBdIDogW10pLFxuICAgICAgLi4uKHJlcG9ydC5lZmZlY3RpdmVDdXJyZW5jeSA/IFtgQ3VycmVuY3k6ICR7cmVwb3J0LmVmZmVjdGl2ZUN1cnJlbmN5fWBdIDogW10pLFxuICAgIF07XG4gIH1cblxuICAvLyBPbmUgc2VsZWN0IGdyb3VwJ3MgbGluZSwgd2l0aCBpdHMgc3RvcmVkIGlkcyByZXNvbHZlZCB0byB0aGUgc2FtZSBuYW1lcyB0aGVcbiAgLy8gb24tc2NyZWVuIGNoaXBzIHNob3cg4oCUIGEgY292ZXIgcmVhZGluZyBcIk9yZ2FuaXphdGlvbjogODc3NCwgODc3N1wiIHRlbGxzIHRoZVxuICAvLyByZWFkZXIgbm90aGluZyBhYm91dCB3aGF0IHRoZSByZXBvcnQgY292ZXJzLlxuICAvL1xuICAvLyBVc2VzIHRoZSByZXBvcnQgYmFyJ3Mgb3duIGxvYWRlciBhbmQgcmVzb2x2ZXIgc28gdGhlIHR3byBjYW4ndCBkcmlmdCwgd2hpY2hcbiAgLy8gYWxzbyBtZWFucyBhIHZhbHVlIHdob3NlIGVudGl0eSB3YXMgZGVsZXRlZCBrZWVwcyBzaG93aW5nIGl0cyByYXcgaWQgcmF0aGVyXG4gIC8vIHRoYW4gZHJvcHBpbmcgb2ZmIHRoZSBjb3ZlciBhbmQgc2lsZW50bHkgdW5kZXJzdGF0aW5nIHRoZSBmaWx0ZXIuIEEgZmFpbGVkXG4gIC8vIG9wdGlvbiBmZXRjaCBkZWdyYWRlcyB0aGUgd2hvbGUgbGluZSB0byBpZHMgZm9yIHRoZSBzYW1lIHJlYXNvbjogYW4gZXhwb3J0XG4gIC8vIG11c3QgbmV2ZXIgZmFpbCBvbiBhIGNvc21ldGljIGxvb2t1cC5cbiAgcHJpdmF0ZSBfc2VsZWN0TGluZShcbiAgICBsYWJlbDogc3RyaW5nLFxuICAgIGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgICByZXBvcnRJZDogbnVtYmVyLFxuICAgIHZhbHVlczogdW5rbm93bltdLFxuICApOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiByZXNvbHZlT3B0aW9uVmFsdWVzKGxvYWRHcm91cE9wdGlvbnMoZ3JvdXAsIHRoaXMuX3JlcG9ydERhdGEsIHJlcG9ydElkKSwgdmFsdWVzKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocmVzb2x2ZWQpID0+IGAke2xhYmVsfTogJHtyZXNvbHZlZC5tYXAoKGl0ZW0pID0+IGl0ZW0ubmFtZSkuam9pbignLCAnKX1gKSxcbiAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihgJHtsYWJlbH06ICR7dmFsdWVzLm1hcCgoaXRlbSkgPT4gU3RyaW5nKGl0ZW0pKS5qb2luKCcsICcpfWApKSxcbiAgICAgICk7XG4gIH1cblxuICAvLyBSZW5kZXJlZCBvZmYgdGhlIHNhbWUgY2FsZW5kYXIgZGF5IHRoZSBmaWx0ZXIgc2VuZHMgdG8gdGhlIHNlcnZlciwgc28gdGhlXG4gIC8vIGNvdmVyJ3MgcGVyaW9kIGlzIHRoZSBwZXJpb2QgdGhlIG51bWJlcnMgYmVoaW5kIGl0IHdlcmUgcXVlcmllZCBmb3IuXG4gIHByaXZhdGUgX2RhdGUodmFsdWU6IERhdGUgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZGF0ZUJvdW5kTGFiZWwodmFsdWUsIHRoaXMuX2ZpbHRlclN0YXRlLmZvcm1hdENvbnRleHQoKS5sb2NhbGUpID8/ICfigKYnO1xuICB9XG59XG4iXX0=