@firestitch/report 18.12.0 → 18.14.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 (56) hide show
  1. package/app/reports/components/component-grid/component-grid.component.d.ts +9 -1
  2. package/app/reports/components/component-grid/report-grid-cell.pipe.d.ts +11 -0
  3. package/app/reports/components/report-component/report-component.component.d.ts +0 -1
  4. package/app/reports/data/report-grid-source.d.ts +1 -0
  5. package/app/reports/export/report-export-collector.service.d.ts +8 -1
  6. package/app/reports/export/report-filter-lines.d.ts +2 -0
  7. package/app/reports/export/report-grid-export.d.ts +20 -0
  8. package/app/reports/export/report-pdf.service.d.ts +2 -0
  9. package/app/reports/export/report-pptx.service.d.ts +1 -0
  10. package/app/reports/group-by.d.ts +3 -0
  11. package/app/reports/interfaces/{report-chat-viewer-detail.interface.d.ts → report-chat-viewer-show-rows.interface.d.ts} +1 -1
  12. package/app/reports/interfaces/report-chat-viewer-state.interface.d.ts +2 -2
  13. package/app/reports/interfaces/report-export-snapshot.interface.d.ts +2 -0
  14. package/app/reports/interfaces/report-mark-action.type.d.ts +1 -1
  15. package/app/reports/interfaces/report-temporary-state.interface.d.ts +1 -1
  16. package/app/reports/interfaces/report-viewer-feature.type.d.ts +1 -1
  17. package/app/reports/interfaces/report.interface.d.ts +7 -0
  18. package/app/reports/report-filter-items.d.ts +1 -1
  19. package/app/reports/report-grid-layout.d.ts +9 -2
  20. package/app/reports/services/report-filter-state.service.d.ts +8 -1
  21. package/app/reports/tile-data-state.d.ts +2 -2
  22. package/esm2022/app/reports/components/component-grid/component-grid.component.mjs +70 -8
  23. package/esm2022/app/reports/components/component-grid/report-grid-cell.pipe.mjs +41 -0
  24. package/esm2022/app/reports/components/report-component/report-component.component.mjs +15 -19
  25. package/esm2022/app/reports/data/report-grid-source.mjs +11 -2
  26. package/esm2022/app/reports/data/report.data.mjs +3 -3
  27. package/esm2022/app/reports/export/report-export-collector.service.mjs +72 -7
  28. package/esm2022/app/reports/export/report-filter-lines.mjs +68 -1
  29. package/esm2022/app/reports/export/report-grid-export.mjs +48 -0
  30. package/esm2022/app/reports/export/report-pdf.service.mjs +47 -17
  31. package/esm2022/app/reports/export/report-pptx.service.mjs +48 -4
  32. package/esm2022/app/reports/group-by.mjs +13 -0
  33. package/esm2022/app/reports/interfaces/report-chat-viewer-show-rows.interface.mjs +2 -0
  34. package/esm2022/app/reports/interfaces/report-chat-viewer-state.interface.mjs +1 -1
  35. package/esm2022/app/reports/interfaces/report-export-snapshot.interface.mjs +1 -1
  36. package/esm2022/app/reports/interfaces/report-mark-action.type.mjs +1 -1
  37. package/esm2022/app/reports/interfaces/report-temporary-state.interface.mjs +1 -1
  38. package/esm2022/app/reports/interfaces/report-viewer-feature.type.mjs +1 -1
  39. package/esm2022/app/reports/interfaces/report.interface.mjs +1 -1
  40. package/esm2022/app/reports/mark-click.mjs +2 -2
  41. package/esm2022/app/reports/option-builder.mjs +4 -4
  42. package/esm2022/app/reports/report-filter-items.mjs +9 -7
  43. package/esm2022/app/reports/report-grid-layout.mjs +98 -4
  44. package/esm2022/app/reports/report-viewer-features.mjs +4 -2
  45. package/esm2022/app/reports/services/report-filter-state.service.mjs +125 -39
  46. package/esm2022/app/reports/tile-data-state.mjs +12 -17
  47. package/esm2022/app/reports/views/report/fs-ai-report.component.mjs +2 -2
  48. package/esm2022/app/reports/views/report/report.component.mjs +2 -2
  49. package/fesm2022/{firestitch-report-echarts-CoaGXKET.mjs → firestitch-report-echarts-DMflI6jp.mjs} +2 -2
  50. package/fesm2022/{firestitch-report-echarts-CoaGXKET.mjs.map → firestitch-report-echarts-DMflI6jp.mjs.map} +1 -1
  51. package/fesm2022/{firestitch-report-firestitch-report-CHPA7sla.mjs → firestitch-report-firestitch-report-C94rjx24.mjs} +660 -125
  52. package/fesm2022/firestitch-report-firestitch-report-C94rjx24.mjs.map +1 -0
  53. package/fesm2022/firestitch-report.mjs +1 -1
  54. package/package.json +2 -2
  55. package/esm2022/app/reports/interfaces/report-chat-viewer-detail.interface.mjs +0 -2
  56. package/fesm2022/firestitch-report-firestitch-report-CHPA7sla.mjs.map +0 -1
@@ -2,6 +2,7 @@ import { ItemType, getExcludeName } from '@firestitch/filter';
2
2
  import { format, parseISO } from 'date-fns';
3
3
  import { of } from 'rxjs';
4
4
  import { catchError, map, shareReplay } from 'rxjs/operators';
5
+ import { followsGroupBy } from './group-by';
5
6
  import { filterLineText, matchLineText } from './export/report-filter-lines';
6
7
  import { DAY_SHORT, formatLocalDate, resolveFormatContext } from './format';
7
8
  import { GRANULARITY_OPTIONS, } from './interfaces/report.interface';
@@ -342,11 +343,12 @@ export function listSearchItem(value) {
342
343
  default: value ?? undefined,
343
344
  };
344
345
  }
345
- // Whether the report has a chart the group-by control can re-bucket. A time
346
- // x-axis is the whole qualification: the control changes the grain of that
347
- // axis, and a category axis has no grain to change.
348
- export function hasTimeSeriesChart(report) {
349
- return (report?.pages ?? []).some((page) => (page.components ?? []).some((component) => component.type === 'chart' && component.config?.xAxis?.kind === 'time'));
346
+ // Whether the report has a tile the group-by control can re-bucket: a chart
347
+ // on a time x-axis or a table over a time axis (followsGroupBy). A time axis
348
+ // is the whole qualification: the control changes its grain, and a category
349
+ // axis has no grain to change.
350
+ export function hasGroupByTile(report) {
351
+ return (report?.pages ?? []).some((page) => (page.components ?? []).some(followsGroupBy));
350
352
  }
351
353
  // The grains the report's group-by control offers, named for the viewer. WHICH
352
354
  // of them comes from the report; how they read comes from GRANULARITY_OPTIONS.
@@ -377,7 +379,7 @@ export function groupByFilterItem(report, initial) {
377
379
  // Only an EXPLICIT false hides the control. An absent block means a report
378
380
  // served by a build that predates the control being stored, and every one of
379
381
  // those had one — the backend resolves it the same way (ReportGroupBy).
380
- if (groupBy?.enabled === false || !hasTimeSeriesChart(report)) {
382
+ if (groupBy?.enabled === false || !hasGroupByTile(report)) {
381
383
  return null;
382
384
  }
383
385
  const values = groupByOptions(report);
@@ -492,4 +494,4 @@ function selectQueryValues(raw) {
492
494
  }
493
495
  return String(raw).split(',');
494
496
  }
495
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZpbHRlci1pdGVtcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9yZXBvcnQtZmlsdGVyLWl0ZW1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsUUFBUSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWpGLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRTVDLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHOUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUk1RSxPQUFPLEVBQytCLG1CQUFtQixHQUV4RCxNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUl6RCwyRUFBMkU7QUFDM0UsNEVBQTRFO0FBQzVFLHlFQUF5RTtBQUN6RSxNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQXVDO0lBQ3JFLElBQUksS0FBSyxZQUFZLElBQUksRUFBRSxDQUFDO1FBQzFCLE9BQU8sTUFBTSxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsc0VBQXNFO0lBQ3RFLDhCQUE4QjtJQUM5QixPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztBQUN4RCxDQUFDO0FBR0QsOEVBQThFO0FBQzlFLCtFQUErRTtB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Y2x1ZGVOYW1lIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZmlsdGVyJztcblxuaW1wb3J0IHsgZm9ybWF0LCBwYXJzZUlTTyB9IGZyb20gJ2RhdGUtZm5zJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCwgc2hhcmVSZXBsYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IFJlcG9ydERhdGEgfSBmcm9tICcuL2RhdGEvcmVwb3J0LmRhdGEnO1xuaW1wb3J0IHsgZmlsdGVyTGluZVRleHQsIG1hdGNoTGluZVRleHQgfSBmcm9tICcuL2V4cG9ydC9yZXBvcnQtZmlsdGVyLWxpbmVzJztcbmltcG9ydCB7IERBWV9TSE9SVCwgZm9ybWF0TG9jYWxEYXRlLCByZXNvbHZlRm9ybWF0Q29udGV4dCB9IGZyb20gJy4vZm9ybWF0JztcbmltcG9ydCB7IFJlcG9ydEZpbHRlck1hdGNoIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC1maWx0ZXItbWF0Y2gudHlwZSc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJPcHRpb25QYWlyIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC1maWx0ZXItb3B0aW9uLXBhaXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydFZpZXdlckZlYXR1cmUgfSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LXZpZXdlci1mZWF0dXJlLnR5cGUnO1xuaW1wb3J0IHtcbiAgQ2hhcnRHcmFudWxhcml0eSwgRmlsdGVyR3JvdXBWYWx1ZSwgR1JBTlVMQVJJVFlfT1BUSU9OUywgUmVwb3J0LCBSZXBvcnRGaWx0ZXJHcm91cCwgUmVwb3J0RmlsdGVyTGV2ZWwsXG4gIFJlcG9ydEZpbHRlck9wdGlvbiwgUmVwb3J0RmlsdGVyVHlwZSwgUmVwb3J0TG9jYWxlVGFnLFxufSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBvZmZlcnNFeGNsdWRlIH0gZnJvbSAnLi9yZXBvcnQtdmlld2VyLWZlYXR1cmVzJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLW9wdGlvbnMuc2VydmljZSc7XG5cblxuLy8gQSBkYXRlLXJhbmdlIGJvdW5kYXJ5IGFzIHRoZSBwaWNrZWQgTE9DQUwgY2FsZW5kYXIgZGF5IChubyB0aW1lLCBubyB0eikuXG4vLyBEYXRlLXJhbmdlIGZpbHRlcnMgYXJlIGNhbGVuZGFyLWRheSBzZW1hbnRpY3MsIHNvIHRoZSBib3VuZGFyeSBtdXN0IGNhcnJ5XG4vLyBvbmx5IFktTS1EIOKAlCBuZXZlciBhIHRpbWV6b25lLWJlYXJpbmcgaW5zdGFudCB0aGUgYmFja2VuZCB3b3VsZCBzaGlmdC5cbmV4cG9ydCBmdW5jdGlvbiBkYXRlQm91bmRTdHJpbmcodmFsdWU6IERhdGUgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBmb3JtYXQodmFsdWUsICd5eXl5LU1NLWRkJyk7XG4gIH1cblxuICAvLyBBdXRob3JlZC9yZWxhdGl2ZSBkZWZhdWx0cyBhcnJpdmUgYXMgc3RyaW5ncyBhbHJlYWR5IGluIFktTS1EIGZvcm07XG4gIC8vIGtlZXAganVzdCB0aGUgZGF0ZSBwb3J0aW9uLlxuICByZXR1cm4gdmFsdWUgPyBTdHJpbmcodmFsdWUpLnNsaWNlKDAsIDEwKSA6IHVuZGVmaW5lZDtcbn1cblxuXG4vLyBBIGRhdGUtcmFuZ2UgYm91bmRhcnkgYXMgaXQgc2hvdWxkIFJFQUQgb24gYSBjb3ZlciBwYWdlIOKAlCB0aGUgc2FtZSBjYWxlbmRhclxuLy8gZGF5IGRhdGVCb3VuZFN0cmluZygpIGhhbmRzIHRoZSBzZXJ2ZXIsIHNvIGEgcHJpbnRlZCBwZXJpb2QgY2FuIG5ldmVyIG5hbWUgYVxuLy8gZGlmZmVyZW50IGRheSB0aGFuIHRoZSBudW1iZXJzIHVuZGVyIGl0IHdlcmUgZmlsdGVyZWQgYnkuIFJldHVybnMgbnVsbCB3aGVuXG4vLyB0aGVyZSBpcyBubyBib3VuZGFyeTsgdGhlIGNhbGxlciBzdXBwbGllcyBpdHMgb3duIHBsYWNlaG9sZGVyLlxuLy9cbi8vIFRoZSBwYXJzZSBoYXMgdG8gYmUgcGFyc2VJU08sIG5vdCBgbmV3IERhdGVgOiBgbmV3IERhdGUoJzIwMjYtMDUtMDEnKWAgaXMgVVRDXG4vLyBtaWRuaWdodCwgc28gZm9ybWF0dGluZyBpdCBhbnl3aGVyZSB3ZXN0IG9mIFVUQyBwcmludHMgQXByIDMwLiBwYXJzZUlTTyByZWFkc1xuLy8gYSBiYXJlIFktTS1EIGFzIExPQ0FMIG1pZG5pZ2h0LCB3aGljaCBubyBvZmZzZXQgY2FuIHNoaWZ0LlxuLy9cbi8vIFRoZSBkYXkgaXMgd3JpdHRlbiBpbiB0aGUgcmVwb3J0J3MgbG9jYWxlLCBhcyBpdHMgZGF0ZSBjZWxscyBhcmU6ICdKYW4gNSxcbi8vIDIwMjYnIGluIGVuLVVTLCAnNSBqYW52LiAyMDI2JyBpbiBmci1DQS5cbmV4cG9ydCBmdW5jdGlvbiBkYXRlQm91bmRMYWJlbCh2YWx1ZTogRGF0ZSB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGJvdW5kID0gZGF0ZUJvdW5kU3RyaW5nKHZhbHVlKTtcblxuICBpZiAoIWJvdW5kKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBkYXRlID0gcGFyc2VJU08oYm91bmQpO1xuXG4gIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gU3RyaW5nKHZhbHVlKSA6IGZvcm1hdExvY2FsRGF0ZShkYXRlLCBsb2NhbGUsIERBWV9TSE9SVCk7XG59XG5cblxuLy8gQSBzdG9yZWQgeXl5eS1NTS1kZCBib3VuZGFyeSBhcyBhIGxvY2FsIERhdGUgZm9yIGEgZGF0ZSBwaWNrZXIsIG9yIG51bGwuXG4vLyBwYXJzZUlTTyByZWFkcyBhIGJhcmUgWS1NLUQgYXMgTE9DQUwgbWlkbmlnaHQsIHNvIHRoZSBwaWNrZXIgc2hvd3MgdGhlIGRheVxuLy8gdGhhdCB3YXMgc3RvcmVkLCB3aGF0ZXZlciB0aGUgYnJvd3NlcidzIHpvbmUuXG5leHBvcnQgZnVuY3Rpb24gZGF0ZUZyb21Cb3VuZCh2YWx1ZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IERhdGUgfCBudWxsIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZGF0ZSA9IHBhcnNlSVNPKHZhbHVlLnNsaWNlKDAsIDEwKSk7XG5cbiAgcmV0dXJuIE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkgPyBudWxsIDogZGF0ZTtcbn1cblxuXG4vLyBBIHBpY2tlZCBEYXRlIGFzIGEgeXl5eS1NTS1kZCBib3VuZGFyeSBmb3Igc3RvcmFnZSwgb3IgbnVsbC4gVXNlcyB0aGUgbG9jYWxcbi8vIGNhbGVuZGFyIGRheSAoZm9ybWF0LCBub3QgdG9JU09TdHJpbmcpIHNvIHRoZSBib3VuZGFyeSBpcyB0aGUgZGF5IHRoYXQgd2FzXG4vLyBwaWNrZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIGJyb3dzZXIncyB6b25lLlxuZXhwb3J0IGZ1bmN0aW9uIGRhdGVUb0JvdW5kKHZhbHVlOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmICFOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKVxuICAgID8gZm9ybWF0KHZhbHVlLCAneXl5eS1NTS1kZCcpXG4gICAgOiBudWxsO1xufVxuXG5cbi8vIEEgcmVsYXRpdmUgZGF0ZS1yYW5nZSBwcmVzZXQga2V5IGFzIGEgc2VudGVuY2UtY2FzZSBsYWJlbCwgZGVyaXZlZCBmcm9tIHRoZVxuLy8gY2FtZWxDYXNlIGtleSBpdHNlbGYgKCdsYXN0MTJNb250aHMnIHJlYWRzICdMYXN0IDEyIG1vbnRocycsICd0aGlzV2Vlaydcbi8vIHJlYWRzICdUaGlzIHdlZWsnKSwgc28gbm8gbGlzdCBvZiBwcmVzZXRzIGlzIG1pcnJvcmVkIGhlcmUgYW5kIGEga2V5IHRoZVxuLy8gc2VydmVyIGFkZHMgbGF0ZXIgc3RpbGwgcmVhZHMgc2Vuc2libHkuXG5leHBvcnQgZnVuY3Rpb24gcmVsYXRpdmVMYWJlbChyZWxhdGl2ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgd29yZHMgPSByZWxhdGl2ZVxuICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVowLTldKS9nLCAnJDEgJDInKVxuICAgIC5yZXBsYWNlKC8oXFxkKShbQS1aXSkvZywgJyQxICQyJylcbiAgICAudG9Mb3dlckNhc2UoKTtcblxuICByZXR1cm4gd29yZHMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3Jkcy5zbGljZSgxKTtcbn1cblxuXG4vLyBNYXBzIGEgcmVwb3J0IGZpbHRlciBHUk9VUCB0byBhbiBmcy1maWx0ZXIgY29uZmlnIGl0ZW0sIGFuZCByZWFkcyBmcy1maWx0ZXJcbi8vIHF1ZXJ5IHZhbHVlcyBiYWNrIGludG8gcGVyLWdyb3VwIEZpbHRlckdyb3VwVmFsdWVzLiBTaGFyZWQgYnkgdGhlIHJlcG9ydC1iYXJcbi8vIGZzLWZpbHRlciBhbmQgdGhlIHBlci1jb21wb25lbnQgZnMtZmlsdGVyIHNvIGJvdGggcmVuZGVyIHRocm91Z2ggdGhlIHNhbWVcbi8vIGxpYnJhcnkgYW5kIHdyaXRlIGludG8gUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIGlkZW50aWNhbGx5LiBJdGVtcyBhcmUgbmFtZWRcbi8vIGJ5IHRoZSBncm91cCdzIGlkIChncm91cEl0ZW1OYW1lKSwgc28gdGhlIHF1ZXJ5IGtleXMgbWFwIHN0cmFpZ2h0IGJhY2sgdG9cbi8vIHRoZSBncm91cC4gQSByZXBvcnQgbmV2ZXIgcHV0cyB0aGVzZSBrZXlzIGluIHRoZSBicm93c2VyIFVSTDogZnMtZmlsdGVyJ3Ncbi8vIG93biBxdWVyeS1wYXJhbSBzeW5jaW5nIGlzIG9mZiBpbiBldmVyeSByZXBvcnQgYmFyLlxuXG4vLyBUaGUgcXVlcnkga2V5IGZvciB0aGUgcmVwb3J0J3MgZ3JvdXAtYnkgY29udHJvbC4gRml4ZWQgcmF0aGVyIHRoYW4gZGVyaXZlZFxuLy8gZnJvbSBhbiBpZCBiZWNhdXNlIGEgcmVwb3J0IGhhcyBleGFjdGx5IG9uZSDigJQgYW5kIGl0IGlzIE5PVCBhIGZpbHRlciBncm91cCxcbi8vIHNvIGl0IGlzIHJlYWQgc3RyYWlnaHQgb2ZmIHRoZSBjaGFuZ2UgcXVlcnkgaW5zdGVhZCBvZiB0aHJvdWdoXG4vLyBncm91cFZhbHVlc0Zyb21RdWVyeS4gVGhlIGdyYWluIHRyYXZlbHMgdG8gdGhlIHNlcnZlciBhcyB0aGUgZGF0YSByZXF1ZXN0J3Ncbi8vIGBzdGF0ZS5mcmVxdWVuY3lgLlxuZXhwb3J0IGNvbnN0IEdST1VQX0JZX0lURU0gPSAnZ3JvdXBCeSc7XG5cbi8vIFRoZSB3b3JkIGJlZm9yZSBhIGdyb3VwJ3MgaWQgaW4gdGhlIG5hbWUgb2YgaXRzIGZzLWZpbHRlciBpdGVtIChmaWx0ZXIxMikuXG5jb25zdCBJVEVNX05BTUVfV09SRCA9ICdmaWx0ZXInO1xuXG4vLyBUaGUgZW5kcyBvZiBhbiBmcy1maWx0ZXIgcmFuZ2UgaXRlbTogUmFuZ2Ugd3JpdGVzIDxuYW1lPk1pbiBhbmQgPG5hbWU+TWF4LFxuLy8gRGF0ZVJhbmdlIDxuYW1lPkZyb20gYW5kIDxuYW1lPlRvLlxuZXhwb3J0IHR5cGUgSXRlbVJhbmdlRW5kID0gJ21pbicgfCAnbWF4JyB8ICdmcm9tJyB8ICd0byc7XG5cbi8vIFRoZSBxdWVyeSBrZXkgb2Ygb25lIGVuZCBvZiBhbiBmcy1maWx0ZXIgcmFuZ2UgaXRlbTogdGhlIGl0ZW0ncyBuYW1lIGFuZFxuLy8gdGhlIGVuZCB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgdXBwZXItY2FzZWQgKGZzLWZpbHRlcidzIGdldFJhbmdlTmFtZSksIHNvXG4vLyBmaWx0ZXIxMiBnaXZlcyBmaWx0ZXIxMk1pbiBhbmQgZmlsdGVyMTJGcm9tLlxuZXhwb3J0IGZ1bmN0aW9uIGl0ZW1SYW5nZU5hbWUobmFtZTogc3RyaW5nLCBlbmQ6IEl0ZW1SYW5nZUVuZCk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtuYW1lfSR7ZW5kLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfSR7ZW5kLnNsaWNlKDEpfWA7XG59XG5cbi8vIFRoZSBuYW1lIG9mIGEgZ3JvdXAncyBmcy1maWx0ZXIgaXRlbTogJ2ZpbHRlcicgYW5kIHRoZSBncm91cCdzIGlkLiBUaGUgaWRcbi8vIG5ldmVyIGNoYW5nZXMsIHNvIG5laXRoZXIgYSBuZXcgbGFiZWwgbm9yIGEgbmV3IG5hbWUgbW92ZXMgYSBiYXIncyBrZXlzLFxuLy8gYW5kIG5vIGl0ZW0gbmFtZSBjYW4gdGFrZSBhbm90aGVyIGl0ZW0ncyAoZ3JvdXBCeSwgbWF0Y2gsIGxpc3RTZWFyY2gpLlxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwSXRlbU5hbWUoZ3JvdXA6IFBpY2s8UmVwb3J0RmlsdGVyR3JvdXAsICdpZCc+KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke0lURU1fTkFNRV9XT1JEfSR7Z3JvdXAuaWR9YDtcbn1cblxuLy8gVGhlIGxhYmVsIGEgZ3JvdXAncyBjaGlwIHNob3dzOiBpdHMgb3duLCBlbHNlIGl0cyBmaXJzdCBtZW1iZXIncyBjb2x1bW4uXG5mdW5jdGlvbiBncm91cExhYmVsKGdyb3VwOiBQaWNrPFJlcG9ydEZpbHRlckdyb3VwLCAnbGFiZWwnIHwgJ2ZpbHRlcnMnPik6IHN0cmluZyB7XG4gIHJldHVybiBncm91cC5sYWJlbCB8fCBncm91cC5maWx0ZXJzPy5bMF0/LmZpbHRlckNvbHVtbiB8fCAnJztcbn1cblxuLy8gQSBzZWxlY3QgZ3JvdXAncyBkaXN0aW5jdCBvcHRpb25zLCBhcyB7IG5hbWUsIHZhbHVlIH0gcGFpcnMuIFRoZSBzZXJ2ZXIgc2VuZHNcbi8vIHsgdmFsdWUsIGxhYmVsIH06IHRoZSB2YWx1ZSBpcyB3aGF0IHRoZSBmaWx0ZXIgbWF0Y2hlcyBvbiAoYW4gZW50aXR5J3Mgc3RhYmxlXG4vLyBpZCkgYW5kIHRoZSBsYWJlbCBpcyB3aGF0IHRoZSB2aWV3ZXIgcmVhZHMg4oCUIHNvIGEgcmVuYW1lZCBlbnRpdHkga2VlcHMgaXRzIGlkXG4vLyBhbmQgc2ltcGx5IHNob3dzIGl0cyBuZXcgbmFtZSBoZXJlLiBPcHRpb25zIGNvbWUgZnJvbSB0aGUgZmlyc3QgbWVtYmVyIGZpbHRlclxuLy8gdGhhdCBkZWNsYXJlcyB0aGVtIOKAlCBtZW1iZXJzIGFyZSB0aGUgc2FtZSBkYXRhIHBvaW50LCBzbyBhbnkgbWVtYmVyJ3MgbGlzdFxuLy8gc2VydmVzIHRoZSBncm91cC4gVGhlIGxpc3QgaXMgZmV0Y2hlZCBvbmNlICh0aGUgc2VydmVyIGNhcHMgaXQpIGFuZCByZXBsYXllZFxuLy8gKHNoYXJlUmVwbGF5KSwgc28gcmVwZWF0ZWQgcmVhZHMgbmV2ZXIgcmVmZXRjaC4gVGhpcyBpcyB0aGUgZnVsbCBsaXN0LCBuZXZlclxuLy8gbmFycm93ZWQgYnkgb3RoZXIgZmlsdGVyczogdGhlIHJlcG9ydC1zZXR0aW5ncyBkZWZhdWx0IHBpY2tlciByZWFkcyBpdCAoYW5cbi8vIGF1dGhvciBzZXRzIGEgZGVmYXVsdCBhZ2FpbnN0IHRoZSB3aG9sZSBsaXN0KSwgYW5kIHNvIGRvZXMgdGhlIGV4cG9ydCdzXG4vLyBmaWx0ZXIgd29yZGluZyBmb3IgYSBwaWNrIHRoZSBiYXIgaGFzIG5vdCBuYW1lZC4gVGhlIGJhcnMgcmVhZFxuLy8gUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UgaW5zdGVhZC4gUmV0dXJucyBhbiBlbXB0eSBsaXN0IHdoZW4gbm8gbWVtYmVyXG4vLyBwcm92aWRlcyBvcHRpb25zLlxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRHcm91cE9wdGlvbnMoXG4gIGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgcmVwb3J0RGF0YTogUmVwb3J0RGF0YSxcbiAgcmVwb3J0SWQ6IG51bWJlcixcbik6IE9ic2VydmFibGU8UmVwb3J0RmlsdGVyT3B0aW9uUGFpcltdPiB7XG4gIGNvbnN0IG9wdGlvbkZpbHRlciA9IChncm91cC5maWx0ZXJzID8/IFtdKS5maW5kKChtZW1iZXIpID0+IG1lbWJlci5oYXNPcHRpb25zKTtcbiAgaWYgKCFvcHRpb25GaWx0ZXIpIHtcbiAgICByZXR1cm4gb2YoW10pO1xuICB9XG5cbiAgcmV0dXJuIHJlcG9ydERhdGEuZmlsdGVyT3B0aW9ucyhyZXBvcnRJZCwgb3B0aW9uRmlsdGVyLmlkKVxuICAgIC5waXBlKFxuICAgICAgbWFwKChvcHRpb25zOiBSZXBvcnRGaWx0ZXJPcHRpb25bXSkgPT4gKG9wdGlvbnMgPz8gW10pXG4gICAgICAgIC5tYXAoKG9wdGlvbikgPT4gKHsgbmFtZTogb3B0aW9uLmxhYmVsLCB2YWx1ZTogb3B0aW9uLnZhbHVlIH0pKSksXG4gICAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiBmYWxzZSB9KSxcbiAgICApO1xufVxuXG4vLyBTdG9yZWQgZmlsdGVyIHZhbHVlcyAoaWRzKSBwYWlyZWQgYmFjayB3aXRoIHRoZSBsYWJlbHMgdG8gc2hvdyBmb3IgdGhlbS5cbi8vIEEgc2F2ZWQgZGVmYXVsdCBob2xkcyBvbmx5IHZhbHVlcywgc28gdGhlIG5hbWVzIGhhdmUgdG8gYmUgcmVhZCBiYWNrIG9mZiB0aGVcbi8vIG9wdGlvbiBsaXN0IOKAlCB0aGF0IGluZGlyZWN0aW9uIGlzIGV4YWN0bHkgd2hhdCBzdXJ2aXZlcyBhIHJlbmFtZS4gYGxhYmVsYFxuLy8gbmFtZXMgYSB2YWx1ZSBmaXJzdDogYSBuYW1lIGFscmVhZHkgbGVhcm5lZCAoUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UubGFiZWwpXG4vLyBob2xkcyBmb3IgYSBwaWNrIGEgbmFycm93ZWQgbGlzdCBsZWF2ZXMgb3V0LCBhbmQgd2hlbiBpdCBuYW1lcyBldmVyeSB2YWx1ZVxuLy8gdGhlIGxpc3QgaXMgbm90IHJlYWQgYXQgYWxsLiBBIHZhbHVlIHdpdGggbm8gbmFtZSBhbmQgbm8gbWF0Y2hpbmcgb3B0aW9uXG4vLyAoaXRzIGVudGl0eSB3YXMgZGVsZXRlZCwgc28gaXQgaXMgbm8gbG9uZ2VyIGxpc3RlZCkgZmFsbHMgYmFjayB0byBzaG93aW5nXG4vLyB0aGUgcmF3IHZhbHVlIHJhdGhlciB0aGFuIGRyb3BwaW5nIHRoZSBjaGlwLCB3aGljaCB3b3VsZCBzaWxlbnRseSB3aWRlbiB0aGVcbi8vIGZpbHRlci5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlT3B0aW9uVmFsdWVzKFxuICBvcHRpb25zJDogT2JzZXJ2YWJsZTxSZXBvcnRGaWx0ZXJPcHRpb25QYWlyW10+LFxuICB2YWx1ZXM6IHVua25vd25bXSxcbiAgbGFiZWw6ICh2YWx1ZTogdW5rbm93bikgPT4gc3RyaW5nIHwgbnVsbCA9ICgpID0+IG51bGwsXG4pOiBPYnNlcnZhYmxlPFJlcG9ydEZpbHRlck9wdGlvblBhaXJbXT4ge1xuICBjb25zdCBuYW1lZCA9IChvcHRpb25zOiBSZXBvcnRGaWx0ZXJPcHRpb25QYWlyW10pID0+IHZhbHVlcy5tYXAoKHZhbHVlKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9uID0gb3B0aW9ucy5maW5kKChjYW5kaWRhdGUpID0+IFN0cmluZyhjYW5kaWRhdGUudmFsdWUpID09PSBTdHJpbmcodmFsdWUpKTtcblxuICAgIHJldHVybiB7IG5hbWU6IGxhYmVsKHZhbHVlKSA/PyBvcHRpb24/Lm5hbWUgPz8gU3RyaW5nKHZhbHVlKSwgdmFsdWUgfTtcbiAgfSk7XG5cbiAgcmV0dXJuIHZhbHVlcy5ldmVyeSgodmFsdWUpID0+IGxhYmVsKHZhbHVlKSAhPT0gbnVsbClcbiAgICA/IG9mKG5hbWVkKFtdKSlcbiAgICA6IG9wdGlvbnMkLnBpcGUobWFwKG5hbWVkKSk7XG59XG5cbi8vIFJlYWRzIGEgZ3JvdXAncyBvcHRpb24gbGlzdDsgc2VlIGdyb3VwT3B0aW9uc1JlYWRlcigpLlxuZXhwb3J0IHR5cGUgR3JvdXBPcHRpb25zUmVhZGVyID0gKFxuICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gIHJlcG9ydElkOiBudW1iZXIsXG4pID0+IE9ic2VydmFibGU8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXT47XG5cbi8vIEEgcmVhZGVyIG9mIGVhY2ggZ3JvdXAncyBvcHRpb24gbGlzdCAobG9hZEdyb3VwT3B0aW9ucykgdGhhdCBsb2FkcyBhIGdyb3VwJ3Ncbi8vIGxpc3Qgb25jZSBhbmQgaGFuZHMgZXZlcnkgbGF0ZXIgcmVhZCBvZiB0aGF0IGdyb3VwIHRoZSBzYW1lIHJlcGxheWVkXG4vLyByZXF1ZXN0LCBzbyBldmVyeXRoaW5nIHRoYXQgbmFtZXMgb25lIGdyb3VwJ3MgcGlja3Mg4oCUIHRoZSBjb3ZlcidzIGZpbHRlclxuLy8gbGluZSwgaXRzIHt7ZmlsdGVyLjxpZD59fSB0b2tlbiwgdGhlIG5leHQgcGljayDigJQgc2hhcmVzIG9uZSBmZXRjaC4gQSByZWFkXG4vLyB0aGF0IGZhaWxlZCBpcyBmZXRjaGVkIGFnYWluIGJ5IHRoZSBuZXh0IG9uZSAoc2hhcmVSZXBsYXkgZHJvcHMgYW4gZXJyb3IpLlxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwT3B0aW9uc1JlYWRlcihyZXBvcnREYXRhOiBSZXBvcnREYXRhKTogR3JvdXBPcHRpb25zUmVhZGVyIHtcbiAgY29uc3QgbG9hZGVkID0gbmV3IE1hcDxudW1iZXIsIE9ic2VydmFibGU8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXT4+KCk7XG5cbiAgcmV0dXJuIChncm91cCwgcmVwb3J0SWQpID0+IHtcbiAgICBjb25zdCBvcHRpb25zJCA9IGxvYWRlZC5nZXQoZ3JvdXAuaWQpID8/IGxvYWRHcm91cE9wdGlvbnMoZ3JvdXAsIHJlcG9ydERhdGEsIHJlcG9ydElkKTtcbiAgICBsb2FkZWQuc2V0KGdyb3VwLmlkLCBvcHRpb25zJCk7XG5cbiAgICByZXR1cm4gb3B0aW9ucyQ7XG4gIH07XG59XG5cbi8vIFRoZSBuYW1lcyBvZiBhIHNlbGVjdCBncm91cCdzIHBpY2tzIChrZXB0IG9yIGxlZnQgb3V0KSwgYXMgaXRzIGNoaXBzIGluXG4vLyB0aGUgZmlsdGVyIGJhciBuYW1lIHRoZW0sIGZvciBhIHt7ZmlsdGVyLjxpZD59fSB0b2tlbjogYSBuYW1lIHRoZSBiYXInc1xuLy8gbGlzdHMgdGF1Z2h0IChgbGFiZWxgLCBSZXBvcnRGaWx0ZXJPcHRpb25zU2VydmljZS5sYWJlbCkgZmlyc3QsIGVsc2UgdGhlXG4vLyBncm91cCdzIG9wdGlvbiBsaXN0LiBudWxsIHdoZW4gdGhlIGxpc3QgY291bGQgbm90IGJlIHJlYWQ6IHRoZSB0b2tlbiB0aGVuXG4vLyByZWFkcyB0aGUgZW0gZGFzaCByYXRoZXIgdGhhbiBhIHJvdyBvZiBpZHMuXG5leHBvcnQgZnVuY3Rpb24gcGlja2VkT3B0aW9uTmFtZXMoXG4gIG9wdGlvbnMkOiBPYnNlcnZhYmxlPHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9W10+LFxuICB2YWx1ZXM6IHVua25vd25bXSxcbiAgbGFiZWw6ICh2YWx1ZTogdW5rbm93bikgPT4gc3RyaW5nIHwgbnVsbCA9ICgpID0+IG51bGwsXG4pOiBPYnNlcnZhYmxlPHN0cmluZ1tdIHwgbnVsbD4ge1xuICByZXR1cm4gcmVzb2x2ZU9wdGlvblZhbHVlcyhvcHRpb25zJCwgdmFsdWVzLCBsYWJlbClcbiAgICAucGlwZShcbiAgICAgIG1hcCgob3B0aW9ucyk6IHN0cmluZ1tdIHwgbnVsbCA9PiBvcHRpb25zLm1hcCgob3B0aW9uKSA9PiBvcHRpb24ubmFtZSkpLFxuICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSksXG4gICAgKTtcbn1cblxuLy8gQ2FzZS1pbnNlbnNpdGl2ZSBuYW1lIGZpbHRlciBhcHBsaWVkIHRvIGEgbG9hZGVkIG9wdGlvbiBsaXN0IOKAlCB0aGUgdHlwZWRcbi8vIGtleXdvcmQgaGFzIHRvIGJlIG1hdGNoZWQgaGVyZSBiZWNhdXNlIGZzLWF1dG9jb21wbGV0ZSByZW5kZXJzIHdoYXQgd2UgcmV0dXJuXG4vLyB2ZXJiYXRpbS5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaE9wdGlvbnMoXG4gIG9wdGlvbnMkOiBPYnNlcnZhYmxlPFJlcG9ydEZpbHRlck9wdGlvblBhaXJbXT4sXG4gIGtleXdvcmQ/OiBzdHJpbmcsXG4pOiBPYnNlcnZhYmxlPFJlcG9ydEZpbHRlck9wdGlvblBhaXJbXT4ge1xuICBjb25zdCB0ZXJtID0gKGtleXdvcmQgPz8gJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gIHJldHVybiBvcHRpb25zJC5waXBlKG1hcCgob3B0aW9ucykgPT4gdGVybVxuICAgID8gb3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4gb3B0aW9uLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtKSlcbiAgICA6IG9wdGlvbnMpKTtcbn1cblxuLy8gVGhlIHBhbmVsIHJvdyBvZiBhIHNlbGVjdCB3aG9zZSBsaXN0IHRoZSBzZXJ2ZXIgY3V0IGF0IDUwMC5cbmV4cG9ydCBjb25zdCBPUFRJT05TX1RSVU5DQVRFRF9OT1RFID0gJ1Nob3dpbmcgdGhlIGZpcnN0IDUwMC4gVHlwZSB0byBuYXJyb3cuJztcblxuLy8gVGhlIHBhbmVsIHJvdyBvZiBhIHNlbGVjdCB3aG9zZSBsaXN0IGNvdWxkIG5vdCBiZSByZWFkLiBUaGUgbmV4dCBmb2N1cyBvclxuLy8ga2V5c3Ryb2tlIGFza3MgYWdhaW4uXG5leHBvcnQgY29uc3QgT1BUSU9OU19GQUlMRURfTk9URSA9ICdDb3VsZCBub3QgbG9hZCB0aGUgbGlzdC4nO1xuXG4vLyBCdWlsZCB0aGUgZnMtZmlsdGVyIGNvbmZpZyBpdGVtIGZvciBhIGdyb3VwLCBzZWVkaW5nIGl0cyBkZWZhdWx0IGZyb20gdGhlXG4vLyBjdXJyZW50IHNlc3Npb24gdmFsdWUgc28gYXV0aG9yZWQvcmVsYXRpdmUgZGVmYXVsdHMgc2hvdyBzZWxlY3RlZCBvbiBvcGVuLlxuLy8gQSBzZWxlY3QgbGlzdHMgd2hhdCBgb3B0aW9uc2Agb2ZmZXJzIGZvciBpdCBpbiBgcmVwb3J0YC4gYGZlYXR1cmVzYCBpcyB0aGVcbi8vIHJlcG9ydCdzIHZpZXdlckZlYXR1cmVzOiBhIHNlbGVjdCBvZmZlcnMgJ0V4Y2x1ZGUgdGhlc2UnIGJ5IHRoZSBydWxlIG9mXG4vLyBvZmZlcnNFeGNsdWRlICh0aGUgc2VydmVyIGxpc3RzIGV4Y2x1ZGVWYWx1ZXMgYW5kIG5vIG1lbWJlciBiaW5kcyBzZXZlcmFsXG4vLyBjb2x1bW5zKSwgYW5kIGEgbnVtYmVyIHJhbmdlIGlzIGEgbWluL21heCBjb250cm9sIG9ubHkgd2hlbiBpdCBsaXN0c1xuLy8gbnVtYmVyUmFuZ2UuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVySXRlbUZvckdyb3VwKFxuICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gIG9wdGlvbnM6IFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlLFxuICByZXBvcnQ6IFJlcG9ydCB8IG51bGwsXG4gIGluaXRpYWw/OiBGaWx0ZXJHcm91cFZhbHVlLFxuICBmZWF0dXJlczogcmVhZG9ubHkgUmVwb3J0Vmlld2VyRmVhdHVyZVtdID0gW10sXG4pOiBJRmlsdGVyQ29uZmlnSXRlbSB7XG4gIGNvbnN0IG5hbWUgPSBncm91cEl0ZW1OYW1lKGdyb3VwKTtcbiAgY29uc3QgbGFiZWwgPSBncm91cExhYmVsKGdyb3VwKTtcblxuICBzd2l0Y2ggKGdyb3VwLnR5cGUpIHtcbiAgICBjYXNlICdkYXRlUmFuZ2UnOlxuICAgICAgcmV0dXJuIGRhdGVSYW5nZUZpbHRlckl0ZW0obmFtZSwgbGFiZWwsIGluaXRpYWwpO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIHJldHVybiBzZWxlY3RGaWx0ZXJJdGVtKGdyb3VwLCBsYWJlbCwgb3B0aW9ucywgcmVwb3J0LCBpbml0aWFsLCBvZmZlcnNFeGNsdWRlKGdyb3VwLCBmZWF0dXJlcykpO1xuXG4gICAgY2FzZSAnbnVtYmVyUmFuZ2UnOlxuICAgICAgcmV0dXJuIGZlYXR1cmVzLmluY2x1ZGVzKCdudW1iZXJSYW5nZScpXG4gICAgICAgID8gbnVtYmVyUmFuZ2VGaWx0ZXJJdGVtKGdyb3VwLCBsYWJlbCwgcmVwb3J0LCBpbml0aWFsKVxuICAgICAgICA6IGtleXdvcmRGaWx0ZXJJdGVtKG5hbWUsIGxhYmVsLCBpbml0aWFsKTtcblxuICAgIGNhc2UgJ2tleXdvcmQnOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ga2V5d29yZEZpbHRlckl0ZW0obmFtZSwgbGFiZWwsIGluaXRpYWwpO1xuICB9XG59XG5cbi8vIEEgZGF0ZSByYW5nZSBvcGVucyBvbiBpdHMgZGF5cywgYW5kIGl0cyBjaGlwIHNob3dzIHRoZW0uIEEgcHJlc2V0IHBpY2tlZCBpblxuLy8gdGhlIGRhdGUgcGlja2VyIG9ubHkgc2V0cyB0aGUgZGF5cy5cbmZ1bmN0aW9uIGRhdGVSYW5nZUZpbHRlckl0ZW0obmFtZTogc3RyaW5nLCBsYWJlbDogc3RyaW5nLCBpbml0aWFsPzogRmlsdGVyR3JvdXBWYWx1ZSk6IElGaWx0ZXJDb25maWdJdGVtIHtcbiAgY29uc3QgaGFzRGF5cyA9ICEhKGluaXRpYWw/LnN0YXJ0IHx8IGluaXRpYWw/LmVuZCk7XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIHR5cGU6IEl0ZW1UeXBlLkRhdGVSYW5nZSxcbiAgICBsYWJlbDogeyBmcm9tOiBgJHtsYWJlbH0gRnJvbWAsIHRvOiBgJHtsYWJlbH0gVG9gIH0sXG4gICAgZGVmYXVsdDogaGFzRGF5c1xuICAgICAgPyB7IGZyb206IGluaXRpYWwuc3RhcnQgPz8gdW5kZWZpbmVkLCB0bzogaW5pdGlhbC5lbmQgPz8gdW5kZWZpbmVkIH1cbiAgICAgIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vLyBBIHNlbGVjdCdzIHBpY2tzLCBrZXB0IG9yIGxlZnQgb3V0LiBXaXRoIGBleGNsdWRlYCB0aGUgbGlzdCBoYXMgdGhlXG4vLyAnRXhjbHVkZSB0aGVzZScgcm93LCBhbmQgYSB2YWx1ZSB0aGF0IGxlYXZlcyBvdXQgb3BlbnMgd2l0aCBpdCBvbi4gSXRzIGxpc3Rcbi8vIGlzIHJlYWQgb24gZm9jdXMgYW5kIG9uIGVhY2gga2V5c3Ryb2tlOiB0aGUgb3B0aW9ucyBzZXJ2aWNlIGZldGNoZXMgaXQgd2hlblxuLy8gdGhlIG90aGVyIGZpbHRlcnMgY2hhbmdlZCBzaW5jZSBhbmQgcmVwbGF5cyBpdCBvdGhlcndpc2UsIGFuZCB0eXBpbmdcbi8vIGZpbHRlcnMgaXQgaGVyZS4gQSBsaXN0IHRoZSBzZXJ2ZXIgY3V0LCBvciBvbmUgdGhhdCBjb3VsZCBub3QgYmUgcmVhZCxcbi8vIHNheXMgc28gaW4gYSBwYW5lbCByb3cuXG5mdW5jdGlvbiBzZWxlY3RGaWx0ZXJJdGVtKFxuICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gIGxhYmVsOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlLFxuICByZXBvcnQ6IFJlcG9ydCB8IG51bGwsXG4gIGluaXRpYWw6IEZpbHRlckdyb3VwVmFsdWUgfCB1bmRlZmluZWQsXG4gIGV4Y2x1ZGU6IGJvb2xlYW4sXG4pOiBJRmlsdGVyQ29uZmlnSXRlbSB7XG4gIGNvbnN0IGV4Y2x1ZGluZyA9IGV4Y2x1ZGUgJiYgIWluaXRpYWw/LnZhbHVlcz8ubGVuZ3RoICYmICEhaW5pdGlhbD8uZXhjbHVkZVZhbHVlcz8ubGVuZ3RoO1xuICBjb25zdCBwaWNrcyA9IGV4Y2x1ZGluZyA/IGluaXRpYWwuZXhjbHVkZVZhbHVlcyA6IGluaXRpYWw/LnZhbHVlcztcbiAgY29uc3Qgb3B0aW9ucyQgPSBvcHRpb25zLm9wdGlvbnMoZ3JvdXAsIHJlcG9ydCk7XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBncm91cEl0ZW1OYW1lKGdyb3VwKSxcbiAgICB0eXBlOiBJdGVtVHlwZS5BdXRvQ29tcGxldGVDaGlwcyxcbiAgICBsYWJlbCxcbiAgICBmZXRjaE9uRm9jdXM6IHRydWUsXG4gICAgZXhjbHVkZTogZXhjbHVkZSA/IHt9IDogdW5kZWZpbmVkLFxuICAgIHZhbHVlczogKGtleXdvcmQ/OiBzdHJpbmcpID0+IG1hdGNoT3B0aW9ucyhvcHRpb25zJCwga2V5d29yZCksXG4gICAgcGFuZWxOb3RlOiAoKSA9PiBvcHRpb25zTm90ZShvcHRpb25zLCBncm91cC5pZCksXG4gICAgLy8gU3RvcmVkIHZhbHVlcyBhcmUgaWRzLCBzbyBhIGNoaXAgaXMgbmFtZWQgYnkgYSBuYW1lIGFscmVhZHkgbGVhcm5lZCBvclxuICAgIC8vIG9uY2UgdGhlIG9wdGlvbiBsaXN0IGhhcyBsb2FkZWQg4oCUIGhlbmNlIHRoZSBvYnNlcnZhYmxlIGZvcm0gb2YgYGRlZmF1bHRgLlxuICAgIGRlZmF1bHQ6IHBpY2tzPy5sZW5ndGhcbiAgICAgID8gKCkgPT4gcmVzb2x2ZU9wdGlvblZhbHVlcyhvcHRpb25zJCwgcGlja3MsICh2YWx1ZSkgPT4gb3B0aW9ucy5sYWJlbChncm91cC5pZCwgdmFsdWUpKVxuICAgICAgICAucGlwZShtYXAoKHNlbGVjdGVkKSA9PiAoZXhjbHVkaW5nID8geyBleGNsdWRlOiB0cnVlLCBzZWxlY3RlZCB9IDogc2VsZWN0ZWQpKSlcbiAgICAgIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vLyBUaGUgcGFuZWwgcm93IG9mIGEgc2VsZWN0J3MgbGF0ZXN0IGxpc3Q6IGEgZmFpbHVyZSBmaXJzdCwgdGhlbiBhIGN1dCBsaXN0LlxuZnVuY3Rpb24gb3B0aW9uc05vdGUob3B0aW9uczogUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UsIGdyb3VwSWQ6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICBpZiAob3B0aW9ucy5mYWlsZWQoZ3JvdXBJZCkpIHtcbiAgICByZXR1cm4gT1BUSU9OU19GQUlMRURfTk9URTtcbiAgfVxuXG4gIHJldHVybiBvcHRpb25zLnRydW5jYXRlZChncm91cElkKSA/IE9QVElPTlNfVFJVTkNBVEVEX05PVEUgOiBudWxsO1xufVxuXG4vLyBBIG51bWJlciByYW5nZSdzIGxvdyBhbmQgaGlnaCBlbmRzLCBlaXRoZXIgb25lIG9wZW4uIDAgaXMgYW4gZW5kIGxpa2UgYW55XG4vLyBvdGhlci4gSXRzIGNoaXAgcmVhZHMgYXMgdGhlIGV4cG9ydCBsaW5lcyBkbyAoJ0Ftb3VudDogMCBvciBtb3JlJyxcbi8vICdBbW91bnQ6IDAgdG8gMTAnKTogdGhlIGVuZHMgYXJlIHJlYWQgb2ZmIHRoZSBpdGVtJ3MgcXVlcnkgdGhlIHdheSB0aGVcbi8vIGJhcidzIGNoYW5nZSByZWFkcyB0aGVtLCBhbmQgd29yZGVkIGluIHRoZSByZXBvcnQncyBsb2NhbGUuXG5mdW5jdGlvbiBudW1iZXJSYW5nZUZpbHRlckl0ZW0oXG4gIGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgbGFiZWw6IHN0cmluZyxcbiAgcmVwb3J0OiBSZXBvcnQgfCBudWxsLFxuICBpbml0aWFsPzogRmlsdGVyR3JvdXBWYWx1ZSxcbik6IElGaWx0ZXJDb25maWdJdGVtIHtcbiAgY29uc3QgbmFtZSA9IGdyb3VwSXRlbU5hbWUoZ3JvdXApO1xuICBjb25zdCBtaW4gPSBpbml0aWFsPy5taW4gPz8gdW5kZWZpbmVkO1xuICBjb25zdCBtYXggPSBpbml0aWFsPy5tYXggPz8gdW5kZWZpbmVkO1xuICBjb25zdCBsb2NhbGUgPSByZXNvbHZlRm9ybWF0Q29udGV4dChyZXBvcnQgPz8ge30pLmxvY2FsZTtcblxuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgdHlwZTogSXRlbVR5cGUuUmFuZ2UsXG4gICAgbGFiZWwsXG4gICAgZGVmYXVsdDogbWluICE9PSB1bmRlZmluZWQgfHwgbWF4ICE9PSB1bmRlZmluZWQgPyB7IG1pbiwgbWF4IH0gOiB1bmRlZmluZWQsXG4gICAgY2hpcFRleHQ6IChpdGVtKSA9PiBmaWx0ZXJMaW5lVGV4dChcbiAgICAgIHsgbGFiZWwsIGxldmVsOiBncm91cC5sZXZlbCB9LFxuICAgICAgbnVtYmVyUmFuZ2VGcm9tUXVlcnkoaXRlbS5xdWVyeSwgbmFtZSksXG4gICAgICB7IGxvY2FsZSB9LFxuICAgICAgJ2NoaXAnLFxuICAgICksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGtleXdvcmRGaWx0ZXJJdGVtKG5hbWU6IHN0cmluZywgbGFiZWw6IHN0cmluZywgaW5pdGlhbD86IEZpbHRlckdyb3VwVmFsdWUpOiBJRmlsdGVyQ29uZmlnSXRlbSB7XG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICB0eXBlOiBJdGVtVHlwZS5LZXl3b3JkLFxuICAgIGxhYmVsLFxuICAgIGRlZmF1bHQ6IGluaXRpYWw/LnZhbHVlLFxuICB9O1xufVxuXG4vLyBUaGUgZ3JvdXBzIGEgbWF0Y2ggb2YgJ2FueScgY29tYmluZXM6IHJlcG9ydCBiYXIgZ3JvdXBzIChhIHBhZ2UgZ3JvdXAgb25cbi8vIGl0cyBvd24gcGFnZSBvbmx5KSB0aGF0IGEgdmlld2VyIHBpY2tzIHZhbHVlcywgdGV4dCBvciBhIG51bWJlciByYW5nZSBpbi5cbi8vIERhdGVzLCB0aWxlLW9ubHkgZ3JvdXBzIGFuZCB0aGUgY3Jvc3MtZmlsdGVyIGFsd2F5cyBuYXJyb3cgb24gdGhlaXIgb3duLlxuLy8gVGhlIHNlcnZlciBob2xkcyB0aGUgc2FtZSBydWxlIGFuZCBjaGVja3MgZXZlcnkgaWQgaXQgaXMgc2VudC5cbmNvbnN0IE1BVENIX0FOWV9MRVZFTFM6IHJlYWRvbmx5IFJlcG9ydEZpbHRlckxldmVsW10gPSBbJ3JlcG9ydCcsICdib3RoJywgJ3BhZ2UnXTtcbmNvbnN0IE1BVENIX0FOWV9UWVBFUzogcmVhZG9ubHkgUmVwb3J0RmlsdGVyVHlwZVtdID0gWydzZWxlY3QnLCAna2V5d29yZCcsICdudW1iZXJSYW5nZSddO1xuXG4vLyBXaGV0aGVyIGEgZ3JvdXAgam9pbnMgYSBtYXRjaCBvZiAnYW55JyBvbiBwYWdlIGBwYWdlSWRgLlxuZXhwb3J0IGZ1bmN0aW9uIGlzTWF0Y2hBbnlHcm91cChncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsIHBhZ2VJZDogbnVtYmVyIHwgbnVsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gTUFUQ0hfQU5ZX0xFVkVMUy5pbmNsdWRlcyhncm91cC5sZXZlbClcbiAgICAmJiBNQVRDSF9BTllfVFlQRVMuaW5jbHVkZXMoZ3JvdXAudHlwZSlcbiAgICAmJiAoZ3JvdXAubGV2ZWwgIT09ICdwYWdlJyB8fCAoISFwYWdlSWQgJiYgZ3JvdXAucGFnZUlkID09PSBwYWdlSWQpKTtcbn1cblxuLy8gVGhlIHJlcG9ydCBiYXIncyBncm91cHMgaW4gdGhlaXIgc2F2ZWQgb3JkZXI6IHRoZSByZXBvcnQgYW5kIGJvdGggZ3JvdXBzLFxuLy8gYW5kIHRoZSBwYWdlIGdyb3VwcyBvZiB0aGUgcGFnZSBvbiBzY3JlZW4gKGBwYWdlSWRgKS5cbmV4cG9ydCBmdW5jdGlvbiByZXBvcnRCYXJHcm91cHMocmVwb3J0OiBSZXBvcnQgfCBudWxsLCBwYWdlSWQ6IG51bWJlciB8IG51bGwpOiBSZXBvcnRGaWx0ZXJHcm91cFtdIHtcbiAgcmV0dXJuIChyZXBvcnQ/LmZpbHRlckdyb3VwcyA/PyBbXSlcbiAgICAuZmlsdGVyKChncm91cCkgPT4gZ3JvdXAubGV2ZWwgPT09ICdyZXBvcnQnIHx8IGdyb3VwLmxldmVsID09PSAnYm90aCdcbiAgICAgIHx8IChncm91cC5sZXZlbCA9PT0gJ3BhZ2UnICYmICEhcGFnZUlkICYmIGdyb3VwLnBhZ2VJZCA9PT0gcGFnZUlkKSlcbiAgICAuc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpO1xufVxuXG4vLyBXaGV0aGVyIHRoZSByZXBvcnQgaGFzIGEgZ3JvdXAgc2hvd24gb24gb25lIHBhZ2Ugb25seSwgc28gaXRzIHJlcG9ydCBiYXJcbi8vIGNoYW5nZXMgd2l0aCB0aGUgcGFnZSBvbiBzY3JlZW4uXG5leHBvcnQgZnVuY3Rpb24gaGFzUGFnZUdyb3VwKHJlcG9ydDogUmVwb3J0IHwgbnVsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKHJlcG9ydD8uZmlsdGVyR3JvdXBzID8/IFtdKS5zb21lKChncm91cCkgPT4gZ3JvdXAubGV2ZWwgPT09ICdwYWdlJyk7XG59XG5cbi8vIFRoZSBxdWVyeSBrZXkgb2YgdGhlIHJlcG9ydCBiYXIncyBNYXRjaCBjb250cm9sLiBOb3QgYSBmaWx0ZXIgZ3JvdXA6IGl0XG4vLyBzYXlzIGhvdyB0aGUgZ3JvdXBzIGNvbWJpbmUsIHNvIGl0IGlzIHJlYWQgc3RyYWlnaHQgb2ZmIHRoZSBjaGFuZ2UgcXVlcnkuXG5leHBvcnQgY29uc3QgTUFUQ0hfSVRFTSA9ICdtYXRjaCc7XG5cbmNvbnN0IE1BVENIX09QVElPTlM6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogUmVwb3J0RmlsdGVyTWF0Y2ggfVtdID0gW1xuICB7IG5hbWU6ICdBbGwgZmlsdGVycycsIHZhbHVlOiAnYWxsJyB9LFxuICB7IG5hbWU6ICdBbnkgZmlsdGVyJywgdmFsdWU6ICdhbnknIH0sXG5dO1xuXG4vLyBUaGUgcmVwb3J0IGJhcidzIE1hdGNoIGNvbnRyb2wsIGxhc3QgaW4gdGhlIGJhciwgb3IgbnVsbCB3aGVuIGl0IHdvdWxkIGRvXG4vLyBub3RoaW5nOiB0aGUgc2VydmVyIG11c3Qgc2VydmUgbWF0Y2hBbnksIGFuZCB0aGUgYmFyIG11c3QgaG9sZCB0d28gb3IgbW9yZVxuLy8gZ3JvdXBzIHRoYXQgY29tYmluZSAoYW4gJ2FueScgb3ZlciBvbmUgZ3JvdXAgaXMgdGhhdCBncm91cCkuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hGaWx0ZXJJdGVtKFxuICByZXBvcnQ6IFJlcG9ydCB8IG51bGwsXG4gIGdyb3VwczogUmVwb3J0RmlsdGVyR3JvdXBbXSxcbiAgcGFnZUlkOiBudW1iZXIgfCBudWxsLFxuICBtYXRjaDogUmVwb3J0RmlsdGVyTWF0Y2gsXG4pOiBJRmlsdGVyQ29uZmlnSXRlbSB8IG51bGwge1xuICBjb25zdCBlbGlnaWJsZSA9IGdyb3Vwcy5maWx0ZXIoKGdyb3VwKSA9PiBpc01hdGNoQW55R3JvdXAoZ3JvdXAsIHBhZ2VJZCkpO1xuXG4gIGlmICghcmVwb3J0Py52aWV3ZXJGZWF0dXJlcz8uaW5jbHVkZXMoJ21hdGNoQW55JykgfHwgZWxpZ2libGUubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBNQVRDSF9JVEVNLFxuICAgIHR5cGU6IEl0ZW1UeXBlLlNlbGVjdCxcbiAgICBsYWJlbDogJ01hdGNoJyxcbiAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgdmFsdWVzOiAoKSA9PiBNQVRDSF9PUFRJT05TLFxuICAgIGRlZmF1bHQ6IG1hdGNoLFxuICAgIC8vICdNYXRjaDogYW55IGZpbHRlcicgb3IgJ01hdGNoOiBhbGwgZmlsdGVycycsIGluIHRoZSBleHBvcnQgbGluZXMnIHdvcmRzLlxuICAgIGNoaXBUZXh0OiAoaXRlbSkgPT4gbWF0Y2hMaW5lVGV4dChtYXRjaEZyb21RdWVyeShpdGVtLnF1ZXJ5KSwgJ2NoaXAnKSxcbiAgfTtcbn1cblxuLy8gVGhlIG1hdGNoIGEgY2hhbmdlIHF1ZXJ5IG9mIGEgYmFyIHdpdGggdGhlIE1hdGNoIGNvbnRyb2wgYXNrcyBmb3IuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hGcm9tUXVlcnkocXVlcnk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVwb3J0RmlsdGVyTWF0Y2gge1xuICByZXR1cm4gcXVlcnk/LltNQVRDSF9JVEVNXSA9PT0gJ2FueScgPyAnYW55JyA6ICdhbGwnO1xufVxuXG4vLyBUaGUgcXVlcnkga2V5IG9mIGEgbGlzdCdzIHNlYXJjaCBib3ggaW4gaXRzIGNvbXBvbmVudCBoZWFkZXIuIEZpeGVkIHJhdGhlclxuLy8gdGhhbiBkZXJpdmVkIGZyb20gYW4gaWQgYmVjYXVzZSBhIGhlYWRlciBob2xkcyBhdCBtb3N0IG9uZSwgYW5kIGl0IGlzIE5PVCBhXG4vLyBmaWx0ZXIgZ3JvdXA6IGl0cyB0ZXh0IG5hcnJvd3MgdGhhdCBsaXN0IGFsb25lLCBzbyBpdCBpcyByZWFkIHN0cmFpZ2h0IG9mZlxuLy8gdGhlIGNoYW5nZSBxdWVyeSBhbmQgdHJhdmVscyBhcyB0aGUgbGlzdCdzIG93biBgc3RhdGUuc2VhcmNoYC5cbmV4cG9ydCBjb25zdCBMSVNUX1NFQVJDSF9JVEVNID0gJ2xpc3RTZWFyY2gnO1xuXG4vLyBUaGUgbG9uZ2VzdCBzZWFyY2ggdGhlIHNlcnZlciBhcHBsaWVzIChSZXBvcnRRdWVyeVJ1bm5lcjo6TUFYX1NFQVJDSF9MRU5HVEgpLlxuLy8gVGhlIHZpZXdlciBjdXRzIHRoZSB0ZXh0IHRvIGl0IHRvbywgc28gdGhlIHN0YXRlLCB0aGUgcmVxdWVzdCBhbmQgdGhlIGV4cG9ydFxuLy8gdGl0bGUgYWxsIGNhcnJ5IHRoZSB0ZXh0IHRoYXQgd2FzIGFjdHVhbGx5IHNlYXJjaGVkLlxuZXhwb3J0IGNvbnN0IExJU1RfU0VBUkNIX01BWF9MRU5HVEggPSAxMDA7XG5cbi8vIFRoZSBmcy1maWx0ZXIgY29uZmlnIGl0ZW0gZm9yIGEgbGlzdCdzIHNlYXJjaCBib3gsIHNlZWRlZCB3aXRoIHRoZSB0ZXh0IHRoZVxuLy8gdmlld2VyIGxhc3Qgc2VhcmNoZWQuIGZzLWZpbHRlciBzaG93cyBvbmUgc2VhcmNoIGJveCBwZXIgYmFyIChpdHMgbGFzdFxuLy8ga2V5d29yZCBpdGVtKSwgc28gdGhlIGNhbGxlciBhZGRzIHRoaXMgb25seSB0byBhIGhlYWRlciB3aXRoIG5vIGtleXdvcmRcbi8vIGdyb3VwIG9mIGl0cyBvd24uXG5leHBvcnQgZnVuY3Rpb24gbGlzdFNlYXJjaEl0ZW0odmFsdWU6IHN0cmluZyB8IG51bGwpOiBJRmlsdGVyQ29uZmlnSXRlbSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogSXRlbVR5cGUuS2V5d29yZCxcbiAgICBuYW1lOiBMSVNUX1NFQVJDSF9JVEVNLFxuICAgIGxhYmVsOiAnU2VhcmNoJyxcbiAgICBkZWZhdWx0OiB2YWx1ZSA/PyB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8vIFdoZXRoZXIgdGhlIHJlcG9ydCBoYXMgYSBjaGFydCB0aGUgZ3JvdXAtYnkgY29udHJvbCBjYW4gcmUtYnVja2V0LiBBIHRpbWVcbi8vIHgtYXhpcyBpcyB0aGUgd2hvbGUgcXVhbGlmaWNhdGlvbjogdGhlIGNvbnRyb2wgY2hhbmdlcyB0aGUgZ3JhaW4gb2YgdGhhdFxuLy8gYXhpcywgYW5kIGEgY2F0ZWdvcnkgYXhpcyBoYXMgbm8gZ3JhaW4gdG8gY2hhbmdlLlxuZXhwb3J0IGZ1bmN0aW9uIGhhc1RpbWVTZXJpZXNDaGFydChyZXBvcnQ6IFJlcG9ydCB8IG51bGwpOiBib29sZWFuIHtcbiAgcmV0dXJuIChyZXBvcnQ/LnBhZ2VzID8/IFtdKS5zb21lKChwYWdlKSA9PiAocGFnZS5jb21wb25lbnRzID8/IFtdKS5zb21lKChjb21wb25lbnQpID0+XG4gICAgY29tcG9uZW50LnR5cGUgPT09ICdjaGFydCcgJiYgY29tcG9uZW50LmNvbmZpZz8ueEF4aXM/LmtpbmQgPT09ICd0aW1lJykpO1xufVxuXG4vLyBUaGUgZ3JhaW5zIHRoZSByZXBvcnQncyBncm91cC1ieSBjb250cm9sIG9mZmVycywgbmFtZWQgZm9yIHRoZSB2aWV3ZXIuIFdISUNIXG4vLyBvZiB0aGVtIGNvbWVzIGZyb20gdGhlIHJlcG9ydDsgaG93IHRoZXkgcmVhZCBjb21lcyBmcm9tIEdSQU5VTEFSSVRZX09QVElPTlMuXG4vLyBBbiBlbXB0eSBzdG9yZWQgbGlzdCBtZWFucyBldmVyeSBncmFpbiDigJQgdGhlIHNhbWUgcnVsZSB0aGUgYmFja2VuZCBhcHBsaWVzLlxuZnVuY3Rpb24gZ3JvdXBCeU9wdGlvbnMocmVwb3J0OiBSZXBvcnQpOiB7IHZhbHVlOiBDaGFydEdyYW51bGFyaXR5OyBuYW1lOiBzdHJpbmcgfVtdIHtcbiAgY29uc3QgZ3JhbnVsYXJpdGllcyA9IHJlcG9ydC5jb25maWc/Lmdyb3VwQnk/LmdyYW51bGFyaXRpZXMgPz8gW107XG5cbiAgcmV0dXJuIGdyYW51bGFyaXRpZXMubGVuZ3RoXG4gICAgPyBHUkFOVUxBUklUWV9PUFRJT05TLmZpbHRlcigob3B0aW9uKSA9PiBncmFudWxhcml0aWVzLmluY2x1ZGVzKG9wdGlvbi52YWx1ZSkpXG4gICAgOiBHUkFOVUxBUklUWV9PUFRJT05TO1xufVxuXG4vLyBXaGV0aGVyIGEgZ3JhaW4gaXMgb25lIHRoZSByZXBvcnQncyBjb250cm9sIHN0aWxsIG9mZmVycy4gQSBncmFpbiBpdCBkb2Vzbid0XG4vLyBjYW5ub3Qgc3RheSBpbiBlZmZlY3Q6IHRoZSBhZ2VudCBjYW4gbmFycm93IHRoZSBsaXN0IGF0IGFueSB0aW1lLCBhbmQgYSBjaGFydFxuLy8gbGVmdCBidWNrZXRpbmcgYXQgYSBkcm9wcGVkIGdyYWluIGlzIG9uZSB0aGUgdmlld2VyIGNhbiBuZWl0aGVyIHNlZSBub3IgY2hhbmdlLlxuZXhwb3J0IGZ1bmN0aW9uIGlzR3JhbnVsYXJpdHlPZmZlcmVkKHJlcG9ydDogUmVwb3J0LCBncmFudWxhcml0eTogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwpOiBib29sZWFuIHtcbiAgcmV0dXJuICFncmFudWxhcml0eSB8fCBncm91cEJ5T3B0aW9ucyhyZXBvcnQpLnNvbWUoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09PSBncmFudWxhcml0eSk7XG59XG5cbi8vIFRoZSBmcy1maWx0ZXIgY29uZmlnIGl0ZW0gZm9yIHRoZSByZXBvcnQncyBncm91cC1ieSBjb250cm9sLCBvciBudWxsIHdoZW4gdGhlXG4vLyByZXBvcnQgaGFzIG5vbmUgdG8gc2hvdy5cbi8vXG4vLyBJdCBsZWFkcyB0aGUgc2FtZSBiYXIgdGhlIGZpbHRlcnMgcmVuZGVyIGluLCBidXQgaXQgaXMgTk9UIG9uZTogYSBmaWx0ZXJcbi8vIG5hcnJvd3MgV0hJQ0ggcm93cyBhcmUgY291bnRlZCwgdGhpcyBjaGFuZ2VzIGhvdyB0aGUgc3Vydml2aW5nIHJvd3MgYXJlXG4vLyBCVUNLRVRFRCDigJQgYW5kIGl0IGNvbWVzIGZpcnN0IGJlY2F1c2UgdGhlIGdyYWluIGlzIHdoYXQgYSB2aWV3ZXIgc2V0dGxlc1xuLy8gYmVmb3JlIGRlY2lkaW5nIHdoaWNoIHJvd3MgdGhleSB3YW50LlxuLy8gUGlja2luZyBhIGdyYWluIHNldHMgYSBzZXNzaW9uLXdpZGUgb3ZlcnJpZGUgdGhhdCByaWRlcyBhbG9uZyBpbiBlYWNoIGNoYXJ0J3Ncbi8vIGRhdGEgcmVxdWVzdCwgc28gdGhlIGNoYXJ0cyB0aGVtc2VsdmVzIGFyZSBuZXZlciByZXdyaXR0ZW4uXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBCeUZpbHRlckl0ZW0oXG4gIHJlcG9ydDogUmVwb3J0LFxuICBpbml0aWFsPzogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwsXG4pOiBJRmlsdGVyQ29uZmlnSXRlbSB8IG51bGwge1xuICBjb25zdCBncm91cEJ5ID0gcmVwb3J0LmNvbmZpZz8uZ3JvdXBCeTtcblxuICAvLyBPbmx5IGFuIEVYUExJQ0lUIGZhbHNlIGhpZGVzIHRoZSBjb250cm9sLiBBbiBhYnNlbnQgYmxvY2sgbWVhbnMgYSByZXBvcnRcbiAgLy8gc2VydmVkIGJ5IGEgYnVpbGQgdGhhdCBwcmVkYXRlcyB0aGUgY29udHJvbCBiZWluZyBzdG9yZWQsIGFuZCBldmVyeSBvbmUgb2ZcbiAgLy8gdGhvc2UgaGFkIG9uZSDigJQgdGhlIGJhY2tlbmQgcmVzb2x2ZXMgaXQgdGhlIHNhbWUgd2F5IChSZXBvcnRHcm91cEJ5KS5cbiAgaWYgKGdyb3VwQnk/LmVuYWJsZWQgPT09IGZhbHNlIHx8ICFoYXNUaW1lU2VyaWVzQ2hhcnQocmVwb3J0KSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgdmFsdWVzID0gZ3JvdXBCeU9wdGlvbnMocmVwb3J0KTtcblxuICByZXR1cm4ge1xuICAgIG5hbWU6IEdST1VQX0JZX0lURU0sXG4gICAgdHlwZTogSXRlbVR5cGUuU2VsZWN0LFxuICAgIGxhYmVsOiBncm91cEJ5Py5sYWJlbCB8fCAnR3JvdXAgQnknLFxuICAgIG11bHRpcGxlOiBmYWxzZSxcbiAgICB2YWx1ZXM6ICgpID0+IHZhbHVlcyxcbiAgICBkZWZhdWx0OiBpc0dyYW51bGFyaXR5T2ZmZXJlZChyZXBvcnQsIGluaXRpYWwgPz8gbnVsbCkgPyAoaW5pdGlhbCA/PyB1bmRlZmluZWQpIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vLyBUaGUgZ3JvdXAtYnkgY29udHJvbCdzIGNvbnRyaWJ1dGlvbiB0byB0aGUgdG9vbGJhcidzIGZzLWZpbHRlciBrZXkuIGZzLWZpbHRlclxuLy8gcmVhZHMgaXRzIGNvbmZpZyBvbmNlIGF0IGluaXQsIGFuZCB0aGUgYWdlbnQgY2FuIGNoYW5nZSB0aGUgY29udHJvbCdzIGxhYmVsXG4vLyBvciB0aGUgZ3JhaW5zIGl0IG9mZmVycyDigJQgd2l0aG91dCB0aG9zZSBpbiB0aGUga2V5IHRoZSBiYXIga2VlcHMgcmVuZGVyaW5nXG4vLyB0aGUgY29udHJvbCBpdCB3YXMgY3JlYXRlZCB3aXRoIHVudGlsIGEgZnVsbCBwYWdlIHJlbG9hZC5cbmV4cG9ydCBmdW5jdGlvbiBncm91cEJ5U2lnbmF0dXJlKHJlcG9ydDogUmVwb3J0IHwgbnVsbCk6IHN0cmluZyB7XG4gIGlmICghcmVwb3J0IHx8ICFncm91cEJ5RmlsdGVySXRlbShyZXBvcnQpKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgY29uc3QgZ3JvdXBCeSA9IHJlcG9ydC5jb25maWc/Lmdyb3VwQnk7XG5cbiAgcmV0dXJuIFsnZ3JvdXBCeScsIGdyb3VwQnk/LmxhYmVsID8/ICcnLCAoZ3JvdXBCeT8uZ3JhbnVsYXJpdGllcyA/PyBbXSkuam9pbignLCcpXS5qb2luKCc6Jyk7XG59XG5cbi8vIFJlYWQgYW4gZnMtZmlsdGVyIGNoYW5nZSBxdWVyeSBpbnRvIHBlci1ncm91cCB2YWx1ZXMuIFJldHVybnMgb25lIGVudHJ5IHBlclxuLy8gZ3JvdXAgd2l0aCB0aGUgdmFsdWUgdG8gc3RvcmUgKG9yIG51bGwgdG8gY2xlYXIpIOKAlCBjYWxsZXJzIGZlZWQgdGhlc2UgdG9cbi8vIFJlcG9ydEZpbHRlclN0YXRlU2VydmljZS5zZXRWYWx1ZS5cbmV4cG9ydCBmdW5jdGlvbiBncm91cFZhbHVlc0Zyb21RdWVyeShcbiAgcXVlcnk6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIGdyb3VwczogUmVwb3J0RmlsdGVyR3JvdXBbXSxcbik6IHsgZ3JvdXBJZDogbnVtYmVyOyB2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwgfVtdIHtcbiAgcmV0dXJuIGdyb3Vwcy5tYXAoKGdyb3VwKSA9PiB7XG4gICAgY29uc3QgbmFtZSA9IGdyb3VwSXRlbU5hbWUoZ3JvdXApO1xuXG4gICAgc3dpdGNoIChncm91cC50eXBlKSB7XG4gICAgICBjYXNlICdkYXRlUmFuZ2UnOlxuICAgICAgICByZXR1cm4geyBncm91cElkOiBncm91cC5pZCwgdmFsdWU6IGRhdGVSYW5nZUZyb21RdWVyeShxdWVyeSwgbmFtZSkgfTtcblxuICAgICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgICAgcmV0dXJuIHsgZ3JvdXBJZDogZ3JvdXAuaWQsIHZhbHVlOiBzZWxlY3RGcm9tUXVlcnkocXVlcnksIG5hbWUpIH07XG5cbiAgICAgIGNhc2UgJ251bWJlclJhbmdlJzpcbiAgICAgICAgcmV0dXJuIHsgZ3JvdXBJZDogZ3JvdXAuaWQsIHZhbHVlOiBudW1iZXJSYW5nZUZyb21RdWVyeShxdWVyeSwgbmFtZSkgfTtcblxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCBrZXl3b3JkID0gU3RyaW5nKHF1ZXJ5W25hbWVdID8/ICcnKS50cmltKCk7XG5cbiAgICAgICAgcmV0dXJuIHsgZ3JvdXBJZDogZ3JvdXAuaWQsIHZhbHVlOiBrZXl3b3JkID8geyB2YWx1ZToga2V5d29yZCB9IDogbnVsbCB9O1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbi8vIEEgZGF0ZSByYW5nZSdzIGRheXMgKDxuYW1lPkZyb20sIDxuYW1lPlRvKS5cbmZ1bmN0aW9uIGRhdGVSYW5nZUZyb21RdWVyeShxdWVyeTogUmVjb3JkPHN0cmluZywgYW55PiwgbmFtZTogc3RyaW5nKTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwge1xuICBjb25zdCBzdGFydCA9IHF1ZXJ5W2l0ZW1SYW5nZU5hbWUobmFtZSwgJ2Zyb20nKV07XG4gIGNvbnN0IGVuZCA9IHF1ZXJ5W2l0ZW1SYW5nZU5hbWUobmFtZSwgJ3RvJyldO1xuXG4gIGlmICghc3RhcnQgJiYgIWVuZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0IHx8IG51bGwsIGVuZDogZW5kIHx8IG51bGwgfTtcbn1cblxuLy8gQSBzZWxlY3QncyBwaWNrczoga2VwdCAoPG5hbWU+KSwgb3IgbGVmdCBvdXQgd2hpbGUgaXRzIGV4Y2x1ZGUgcm93IGlzIG9uXG4vLyAoZXhjbHVkZTxOYW1lPikuXG5mdW5jdGlvbiBzZWxlY3RGcm9tUXVlcnkocXVlcnk6IFJlY29yZDxzdHJpbmcsIGFueT4sIG5hbWU6IHN0cmluZyk6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHtcbiAgY29uc3QgZXhjbHVkZVZhbHVlcyA9IHNlbGVjdFF1ZXJ5VmFsdWVzKHF1ZXJ5W2dldEV4Y2x1ZGVOYW1lKG5hbWUpXSk7XG4gIGlmIChleGNsdWRlVmFsdWVzLmxlbmd0aCkge1xuICAgIHJldHVybiB7IGV4Y2x1ZGVWYWx1ZXMgfTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlcyA9IHNlbGVjdFF1ZXJ5VmFsdWVzKHF1ZXJ5W25hbWVdKTtcblxuICByZXR1cm4gdmFsdWVzLmxlbmd0aCA/IHsgdmFsdWVzIH0gOiBudWxsO1xufVxuXG4vLyBBIG51bWJlciByYW5nZSdzIGVuZHMgKDxuYW1lPk1pbiwgPG5hbWU+TWF4KS4gQW4gZW5kIGxlZnQgZW1wdHkgaXMgb3Blbi5cbmZ1bmN0aW9uIG51bWJlclJhbmdlRnJvbVF1ZXJ5KHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBuYW1lOiBzdHJpbmcpOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB7XG4gIGNvbnN0IG1pbiA9IHJhbmdlQm91bmQocXVlcnlbaXRlbVJhbmdlTmFtZShuYW1lLCAnbWluJyldKTtcbiAgY29uc3QgbWF4ID0gcmFuZ2VCb3VuZChxdWVyeVtpdGVtUmFuZ2VOYW1lKG5hbWUsICdtYXgnKV0pO1xuXG4gIGlmIChtaW4gPT09IG51bGwgJiYgbWF4ID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLihtaW4gIT09IG51bGwgPyB7IG1pbiB9IDoge30pLFxuICAgIC4uLihtYXggIT09IG51bGwgPyB7IG1heCB9IDoge30pLFxuICB9O1xufVxuXG4vLyBPbmUgZW5kIG9mIGEgbnVtYmVyIHJhbmdlIGFzIGZzLWZpbHRlcidzIFJhbmdlIHNlbmRzIGl0OiB0aGUgdGV4dCB0eXBlZCBpblxuLy8gaXRzIGlucHV0LiBOdW1iZXIoKSByZWFkcyBhbnkgbm9uLWVtcHR5IHRleHQsIHNvICcwJyBpcyB0aGUgZW5kIDA7IGVtcHR5IG9yXG4vLyB1bnJlYWRhYmxlIHRleHQgaXMgYW4gb3BlbiBlbmQuXG5mdW5jdGlvbiByYW5nZUJvdW5kKHJhdzogdW5rbm93bik6IG51bWJlciB8IG51bGwge1xuICBjb25zdCB0ZXh0ID0gdHlwZW9mIHJhdyA9PT0gJ251bWJlcicgPyBTdHJpbmcocmF3KSA6IFN0cmluZyhyYXcgPz8gJycpLnRyaW0oKTtcbiAgY29uc3QgbnVtYmVyID0gdGV4dCA9PT0gJycgPyBOYU4gOiBOdW1iZXIodGV4dCk7XG5cbiAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShudW1iZXIpID8gbnVtYmVyIDogbnVsbDtcbn1cblxuLy8gQSBncm91cCB2YWx1ZSBhcyB0ZXh0LCB0aGUgc2FtZSBmb3IgdGhlIHNhbWUgdmFsdWUgd2hhdGV2ZXIgaXRzIHNvdXJjZTpcbi8vIGRheXMgYXMgY2FsZW5kYXIgZGF5cywgcGlja3MgYW5kIGVuZHMgYXMgdGV4dCwga2V5d29yZCB0ZXh0IHRyaW1tZWQuIFRoZVxuLy8gdmFsdWUgYSB0aWxlIGhlYWRlciB3YXMgYnVpbHQgd2l0aCBpcyBrZXllZCBvbiBpdCwgc28gYSBoZWFkZXIgaXMgY3JlYXRlZFxuLy8gYWdhaW4gd2hlbiBhbm90aGVyIGJhciBjaGFuZ2VzIGEgZ3JvdXAgaXQgc2hvd3MuXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBWYWx1ZVNpZ25hdHVyZSh2YWx1ZTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFtcbiAgICBkYXRlQm91bmRTdHJpbmcodmFsdWUuc3RhcnQpID8/ICcnLFxuICAgIGRhdGVCb3VuZFN0cmluZyh2YWx1ZS5lbmQpID8/ICcnLFxuICAgICh2YWx1ZS52YWx1ZXMgPz8gW10pLm1hcChTdHJpbmcpLFxuICAgICh2YWx1ZS5leGNsdWRlVmFsdWVzID8/IFtdKS5tYXAoU3RyaW5nKSxcbiAgICAodmFsdWUudmFsdWUgPz8gJycpLnRyaW0oKSxcbiAgICB2YWx1ZS5taW4gPz8gJycsXG4gICAgdmFsdWUubWF4ID8/ICcnLFxuICBdKTtcbn1cblxuLy8gZnMtZmlsdGVyJ3MgQXV0b0NvbXBsZXRlQ2hpcHMgc2VyaWFsaXNlcyBhIG11bHRpLXNlbGVjdCBpbnRvIE9ORSBxdWVyeSB2YWx1ZTpcbi8vIHRoZSBzZWxlY3RlZCB2YWx1ZXMgam9pbmVkIGJ5IFwiLFwiIChpdHMgYHF1ZXJ5YCBnZXR0ZXIgZG9lcyBgLm1hcCh2YWx1ZSkuam9pbignLCcpYCkuXG4vLyBTbyBhIDIrIHNlbGVjdGlvbiBhcnJpdmVzIGFzIHRoZSBzdHJpbmcgXCJhLGJcIiwgbm90IGFuIGFycmF5IOKAlCBzcGxpdHRpbmcgb24gXCIsXCJcbi8vIHJldmVyc2VzIHRoYXQgZmFpdGhmdWxseS4gV2l0aG91dCB0aGlzLCBhIG11bHRpLXNlbGVjdCB3YXMgc2VudCBhcyB0aGUgc2luZ2xlXG4vLyB2YWx1ZSBbXCJhLGJcIl0sIHByb2R1Y2luZyBgY29sIElOICgnYSxiJylgIHNlcnZlci1zaWRlLCB3aGljaCBtYXRjaGVzIG5vdGhpbmcuXG5mdW5jdGlvbiBzZWxlY3RRdWVyeVZhbHVlcyhyYXc6IHVua25vd24pOiB1bmtub3duW10ge1xuICBpZiAoQXJyYXkuaXNBcnJheShyYXcpKSB7XG4gICAgcmV0dXJuIHJhdztcbiAgfVxuXG4gIGlmIChyYXcgPT09IG51bGwgfHwgcmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSAnJykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiBTdHJpbmcocmF3KS5zcGxpdCgnLCcpO1xufVxuIl19
497
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWZpbHRlci1pdGVtcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9yZXBvcnQtZmlsdGVyLWl0ZW1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsUUFBUSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRWpGLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRTVDLE9BQU8sRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHOUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBSTVFLE9BQU8sRUFDK0IsbUJBQW1CLEdBRXhELE1BQU0sK0JBQStCLENBQUM7QUFDdkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBSXpELDJFQUEyRTtBQUMzRSw0RUFBNEU7QUFDNUUseUVBQXlFO0FBQ3pFLE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBdUM7SUFDckUsSUFBSSxLQUFLLFlBQVksSUFBSSxFQUFFLENBQUM7UUFDMUIsT0FBTyxNQUFNLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxzRUFBc0U7SUFDdEUsOEJBQThCO0lBQzlCLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxD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QUssRUFBRSxDQUFDO1FBQ1gsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3BCLGVBQWUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRTtRQUNsQyxlQUFlLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUU7UUFDaEMsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7UUFDaEMsQ0FBQyxLQUFLLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUM7UUFDdkMsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRTtRQUMxQixLQUFLLENBQUMsR0FBRyxJQUFJLEVBQUU7UUFDZixLQUFLLENBQUMsR0FBRyxJQUFJLEVBQUU7S0FDaEIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELGdGQUFnRjtBQUNoRix1RkFBdUY7QUFDdkYsaUZBQWlGO0FBQ2pGLGdGQUFnRjtBQUNoRixnRkFBZ0Y7QUFDaEYsU0FBUyxpQkFBaUIsQ0FBQyxHQUFZO0lBQ3JDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUNwRCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDaEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElGaWx0ZXJDb25maWdJdGVtLCBJdGVtVHlwZSwgZ2V0RXhjbHVkZU5hbWUgfSBmcm9tICdAZmlyZXN0aXRjaC9maWx0ZXInO1xuXG5pbXBvcnQgeyBmb3JtYXQsIHBhcnNlSVNPIH0gZnJvbSAnZGF0ZS1mbnMnO1xuXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwLCBzaGFyZVJlcGxheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgUmVwb3J0RGF0YSB9IGZyb20gJy4vZGF0YS9yZXBvcnQuZGF0YSc7XG5pbXBvcnQgeyBmb2xsb3dzR3JvdXBCeSB9IGZyb20gJy4vZ3JvdXAtYnknO1xuaW1wb3J0IHsgZmlsdGVyTGluZVRleHQsIG1hdGNoTGluZVRleHQgfSBmcm9tICcuL2V4cG9ydC9yZXBvcnQtZmlsdGVyLWxpbmVzJztcbmltcG9ydCB7IERBWV9TSE9SVCwgZm9ybWF0TG9jYWxEYXRlLCByZXNvbHZlRm9ybWF0Q29udGV4dCB9IGZyb20gJy4vZm9ybWF0JztcbmltcG9ydCB7IFJlcG9ydEZpbHRlck1hdGNoIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC1maWx0ZXItbWF0Y2gudHlwZSc7XG5pbXBvcnQgeyBSZXBvcnRGaWx0ZXJPcHRpb25QYWlyIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC1maWx0ZXItb3B0aW9uLXBhaXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJlcG9ydFZpZXdlckZlYXR1cmUgfSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LXZpZXdlci1mZWF0dXJlLnR5cGUnO1xuaW1wb3J0IHtcbiAgQ2hhcnRHcmFudWxhcml0eSwgRmlsdGVyR3JvdXBWYWx1ZSwgR1JBTlVMQVJJVFlfT1BUSU9OUywgUmVwb3J0LCBSZXBvcnRGaWx0ZXJHcm91cCwgUmVwb3J0RmlsdGVyTGV2ZWwsXG4gIFJlcG9ydEZpbHRlck9wdGlvbiwgUmVwb3J0RmlsdGVyVHlwZSwgUmVwb3J0TG9jYWxlVGFnLFxufSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBvZmZlcnNFeGNsdWRlIH0gZnJvbSAnLi9yZXBvcnQtdmlld2VyLWZlYXR1cmVzJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlcy9yZXBvcnQtZmlsdGVyLW9wdGlvbnMuc2VydmljZSc7XG5cblxuLy8gQSBkYXRlLXJhbmdlIGJvdW5kYXJ5IGFzIHRoZSBwaWNrZWQgTE9DQUwgY2FsZW5kYXIgZGF5IChubyB0aW1lLCBubyB0eikuXG4vLyBEYXRlLXJhbmdlIGZpbHRlcnMgYXJlIGNhbGVuZGFyLWRheSBzZW1hbnRpY3MsIHNvIHRoZSBib3VuZGFyeSBtdXN0IGNhcnJ5XG4vLyBvbmx5IFktTS1EIOKAlCBuZXZlciBhIHRpbWV6b25lLWJlYXJpbmcgaW5zdGFudCB0aGUgYmFja2VuZCB3b3VsZCBzaGlmdC5cbmV4cG9ydCBmdW5jdGlvbiBkYXRlQm91bmRTdHJpbmcodmFsdWU6IERhdGUgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgIHJldHVybiBmb3JtYXQodmFsdWUsICd5eXl5LU1NLWRkJyk7XG4gIH1cblxuICAvLyBBdXRob3JlZC9yZWxhdGl2ZSBkZWZhdWx0cyBhcnJpdmUgYXMgc3RyaW5ncyBhbHJlYWR5IGluIFktTS1EIGZvcm07XG4gIC8vIGtlZXAganVzdCB0aGUgZGF0ZSBwb3J0aW9uLlxuICByZXR1cm4gdmFsdWUgPyBTdHJpbmcodmFsdWUpLnNsaWNlKDAsIDEwKSA6IHVuZGVmaW5lZDtcbn1cblxuXG4vLyBBIGRhdGUtcmFuZ2UgYm91bmRhcnkgYXMgaXQgc2hvdWxkIFJFQUQgb24gYSBjb3ZlciBwYWdlIOKAlCB0aGUgc2FtZSBjYWxlbmRhclxuLy8gZGF5IGRhdGVCb3VuZFN0cmluZygpIGhhbmRzIHRoZSBzZXJ2ZXIsIHNvIGEgcHJpbnRlZCBwZXJpb2QgY2FuIG5ldmVyIG5hbWUgYVxuLy8gZGlmZmVyZW50IGRheSB0aGFuIHRoZSBudW1iZXJzIHVuZGVyIGl0IHdlcmUgZmlsdGVyZWQgYnkuIFJldHVybnMgbnVsbCB3aGVuXG4vLyB0aGVyZSBpcyBubyBib3VuZGFyeTsgdGhlIGNhbGxlciBzdXBwbGllcyBpdHMgb3duIHBsYWNlaG9sZGVyLlxuLy9cbi8vIFRoZSBwYXJzZSBoYXMgdG8gYmUgcGFyc2VJU08sIG5vdCBgbmV3IERhdGVgOiBgbmV3IERhdGUoJzIwMjYtMDUtMDEnKWAgaXMgVVRDXG4vLyBtaWRuaWdodCwgc28gZm9ybWF0dGluZyBpdCBhbnl3aGVyZSB3ZXN0IG9mIFVUQyBwcmludHMgQXByIDMwLiBwYXJzZUlTTyByZWFkc1xuLy8gYSBiYXJlIFktTS1EIGFzIExPQ0FMIG1pZG5pZ2h0LCB3aGljaCBubyBvZmZzZXQgY2FuIHNoaWZ0LlxuLy9cbi8vIFRoZSBkYXkgaXMgd3JpdHRlbiBpbiB0aGUgcmVwb3J0J3MgbG9jYWxlLCBhcyBpdHMgZGF0ZSBjZWxscyBhcmU6ICdKYW4gNSxcbi8vIDIwMjYnIGluIGVuLVVTLCAnNSBqYW52LiAyMDI2JyBpbiBmci1DQS5cbmV4cG9ydCBmdW5jdGlvbiBkYXRlQm91bmRMYWJlbCh2YWx1ZTogRGF0ZSB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIGxvY2FsZTogUmVwb3J0TG9jYWxlVGFnKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IGJvdW5kID0gZGF0ZUJvdW5kU3RyaW5nKHZhbHVlKTtcblxuICBpZiAoIWJvdW5kKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBkYXRlID0gcGFyc2VJU08oYm91bmQpO1xuXG4gIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gU3RyaW5nKHZhbHVlKSA6IGZvcm1hdExvY2FsRGF0ZShkYXRlLCBsb2NhbGUsIERBWV9TSE9SVCk7XG59XG5cblxuLy8gQSBzdG9yZWQgeXl5eS1NTS1kZCBib3VuZGFyeSBhcyBhIGxvY2FsIERhdGUgZm9yIGEgZGF0ZSBwaWNrZXIsIG9yIG51bGwuXG4vLyBwYXJzZUlTTyByZWFkcyBhIGJhcmUgWS1NLUQgYXMgTE9DQUwgbWlkbmlnaHQsIHNvIHRoZSBwaWNrZXIgc2hvd3MgdGhlIGRheVxuLy8gdGhhdCB3YXMgc3RvcmVkLCB3aGF0ZXZlciB0aGUgYnJvd3NlcidzIHpvbmUuXG5leHBvcnQgZnVuY3Rpb24gZGF0ZUZyb21Cb3VuZCh2YWx1ZTogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IERhdGUgfCBudWxsIHtcbiAgaWYgKCF2YWx1ZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3QgZGF0ZSA9IHBhcnNlSVNPKHZhbHVlLnNsaWNlKDAsIDEwKSk7XG5cbiAgcmV0dXJuIE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkgPyBudWxsIDogZGF0ZTtcbn1cblxuXG4vLyBBIHBpY2tlZCBEYXRlIGFzIGEgeXl5eS1NTS1kZCBib3VuZGFyeSBmb3Igc3RvcmFnZSwgb3IgbnVsbC4gVXNlcyB0aGUgbG9jYWxcbi8vIGNhbGVuZGFyIGRheSAoZm9ybWF0LCBub3QgdG9JU09TdHJpbmcpIHNvIHRoZSBib3VuZGFyeSBpcyB0aGUgZGF5IHRoYXQgd2FzXG4vLyBwaWNrZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIGJyb3dzZXIncyB6b25lLlxuZXhwb3J0IGZ1bmN0aW9uIGRhdGVUb0JvdW5kKHZhbHVlOiBEYXRlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xuICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmICFOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKVxuICAgID8gZm9ybWF0KHZhbHVlLCAneXl5eS1NTS1kZCcpXG4gICAgOiBudWxsO1xufVxuXG5cbi8vIEEgcmVsYXRpdmUgZGF0ZS1yYW5nZSBwcmVzZXQga2V5IGFzIGEgc2VudGVuY2UtY2FzZSBsYWJlbCwgZGVyaXZlZCBmcm9tIHRoZVxuLy8gY2FtZWxDYXNlIGtleSBpdHNlbGYgKCdsYXN0MTJNb250aHMnIHJlYWRzICdMYXN0IDEyIG1vbnRocycsICd0aGlzV2Vlaydcbi8vIHJlYWRzICdUaGlzIHdlZWsnKSwgc28gbm8gbGlzdCBvZiBwcmVzZXRzIGlzIG1pcnJvcmVkIGhlcmUgYW5kIGEga2V5IHRoZVxuLy8gc2VydmVyIGFkZHMgbGF0ZXIgc3RpbGwgcmVhZHMgc2Vuc2libHkuXG5leHBvcnQgZnVuY3Rpb24gcmVsYXRpdmVMYWJlbChyZWxhdGl2ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgd29yZHMgPSByZWxhdGl2ZVxuICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVowLTldKS9nLCAnJDEgJDInKVxuICAgIC5yZXBsYWNlKC8oXFxkKShbQS1aXSkvZywgJyQxICQyJylcbiAgICAudG9Mb3dlckNhc2UoKTtcblxuICByZXR1cm4gd29yZHMuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3Jkcy5zbGljZSgxKTtcbn1cblxuXG4vLyBNYXBzIGEgcmVwb3J0IGZpbHRlciBHUk9VUCB0byBhbiBmcy1maWx0ZXIgY29uZmlnIGl0ZW0sIGFuZCByZWFkcyBmcy1maWx0ZXJcbi8vIHF1ZXJ5IHZhbHVlcyBiYWNrIGludG8gcGVyLWdyb3VwIEZpbHRlckdyb3VwVmFsdWVzLiBTaGFyZWQgYnkgdGhlIHJlcG9ydC1iYXJcbi8vIGZzLWZpbHRlciBhbmQgdGhlIHBlci1jb21wb25lbnQgZnMtZmlsdGVyIHNvIGJvdGggcmVuZGVyIHRocm91Z2ggdGhlIHNhbWVcbi8vIGxpYnJhcnkgYW5kIHdyaXRlIGludG8gUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlIGlkZW50aWNhbGx5LiBJdGVtcyBhcmUgbmFtZWRcbi8vIGJ5IHRoZSBncm91cCdzIGlkIChncm91cEl0ZW1OYW1lKSwgc28gdGhlIHF1ZXJ5IGtleXMgbWFwIHN0cmFpZ2h0IGJhY2sgdG9cbi8vIHRoZSBncm91cC4gQSByZXBvcnQgbmV2ZXIgcHV0cyB0aGVzZSBrZXlzIGluIHRoZSBicm93c2VyIFVSTDogZnMtZmlsdGVyJ3Ncbi8vIG93biBxdWVyeS1wYXJhbSBzeW5jaW5nIGlzIG9mZiBpbiBldmVyeSByZXBvcnQgYmFyLlxuXG4vLyBUaGUgcXVlcnkga2V5IGZvciB0aGUgcmVwb3J0J3MgZ3JvdXAtYnkgY29udHJvbC4gRml4ZWQgcmF0aGVyIHRoYW4gZGVyaXZlZFxuLy8gZnJvbSBhbiBpZCBiZWNhdXNlIGEgcmVwb3J0IGhhcyBleGFjdGx5IG9uZSDigJQgYW5kIGl0IGlzIE5PVCBhIGZpbHRlciBncm91cCxcbi8vIHNvIGl0IGlzIHJlYWQgc3RyYWlnaHQgb2ZmIHRoZSBjaGFuZ2UgcXVlcnkgaW5zdGVhZCBvZiB0aHJvdWdoXG4vLyBncm91cFZhbHVlc0Zyb21RdWVyeS4gVGhlIGdyYWluIHRyYXZlbHMgdG8gdGhlIHNlcnZlciBhcyB0aGUgZGF0YSByZXF1ZXN0J3Ncbi8vIGBzdGF0ZS5mcmVxdWVuY3lgLlxuZXhwb3J0IGNvbnN0IEdST1VQX0JZX0lURU0gPSAnZ3JvdXBCeSc7XG5cbi8vIFRoZSB3b3JkIGJlZm9yZSBhIGdyb3VwJ3MgaWQgaW4gdGhlIG5hbWUgb2YgaXRzIGZzLWZpbHRlciBpdGVtIChmaWx0ZXIxMikuXG5jb25zdCBJVEVNX05BTUVfV09SRCA9ICdmaWx0ZXInO1xuXG4vLyBUaGUgZW5kcyBvZiBhbiBmcy1maWx0ZXIgcmFuZ2UgaXRlbTogUmFuZ2Ugd3JpdGVzIDxuYW1lPk1pbiBhbmQgPG5hbWU+TWF4LFxuLy8gRGF0ZVJhbmdlIDxuYW1lPkZyb20gYW5kIDxuYW1lPlRvLlxuZXhwb3J0IHR5cGUgSXRlbVJhbmdlRW5kID0gJ21pbicgfCAnbWF4JyB8ICdmcm9tJyB8ICd0byc7XG5cbi8vIFRoZSBxdWVyeSBrZXkgb2Ygb25lIGVuZCBvZiBhbiBmcy1maWx0ZXIgcmFuZ2UgaXRlbTogdGhlIGl0ZW0ncyBuYW1lIGFuZFxuLy8gdGhlIGVuZCB3aXRoIGl0cyBmaXJzdCBsZXR0ZXIgdXBwZXItY2FzZWQgKGZzLWZpbHRlcidzIGdldFJhbmdlTmFtZSksIHNvXG4vLyBmaWx0ZXIxMiBnaXZlcyBmaWx0ZXIxMk1pbiBhbmQgZmlsdGVyMTJGcm9tLlxuZXhwb3J0IGZ1bmN0aW9uIGl0ZW1SYW5nZU5hbWUobmFtZTogc3RyaW5nLCBlbmQ6IEl0ZW1SYW5nZUVuZCk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtuYW1lfSR7ZW5kLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpfSR7ZW5kLnNsaWNlKDEpfWA7XG59XG5cbi8vIFRoZSBuYW1lIG9mIGEgZ3JvdXAncyBmcy1maWx0ZXIgaXRlbTogJ2ZpbHRlcicgYW5kIHRoZSBncm91cCdzIGlkLiBUaGUgaWRcbi8vIG5ldmVyIGNoYW5nZXMsIHNvIG5laXRoZXIgYSBuZXcgbGFiZWwgbm9yIGEgbmV3IG5hbWUgbW92ZXMgYSBiYXIncyBrZXlzLFxuLy8gYW5kIG5vIGl0ZW0gbmFtZSBjYW4gdGFrZSBhbm90aGVyIGl0ZW0ncyAoZ3JvdXBCeSwgbWF0Y2gsIGxpc3RTZWFyY2gpLlxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwSXRlbU5hbWUoZ3JvdXA6IFBpY2s8UmVwb3J0RmlsdGVyR3JvdXAsICdpZCc+KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke0lURU1fTkFNRV9XT1JEfSR7Z3JvdXAuaWR9YDtcbn1cblxuLy8gVGhlIGxhYmVsIGEgZ3JvdXAncyBjaGlwIHNob3dzOiBpdHMgb3duLCBlbHNlIGl0cyBmaXJzdCBtZW1iZXIncyBjb2x1bW4uXG5mdW5jdGlvbiBncm91cExhYmVsKGdyb3VwOiBQaWNrPFJlcG9ydEZpbHRlckdyb3VwLCAnbGFiZWwnIHwgJ2ZpbHRlcnMnPik6IHN0cmluZyB7XG4gIHJldHVybiBncm91cC5sYWJlbCB8fCBncm91cC5maWx0ZXJzPy5bMF0/LmZpbHRlckNvbHVtbiB8fCAnJztcbn1cblxuLy8gQSBzZWxlY3QgZ3JvdXAncyBkaXN0aW5jdCBvcHRpb25zLCBhcyB7IG5hbWUsIHZhbHVlIH0gcGFpcnMuIFRoZSBzZXJ2ZXIgc2VuZHNcbi8vIHsgdmFsdWUsIGxhYmVsIH06IHRoZSB2YWx1ZSBpcyB3aGF0IHRoZSBmaWx0ZXIgbWF0Y2hlcyBvbiAoYW4gZW50aXR5J3Mgc3RhYmxlXG4vLyBpZCkgYW5kIHRoZSBsYWJlbCBpcyB3aGF0IHRoZSB2aWV3ZXIgcmVhZHMg4oCUIHNvIGEgcmVuYW1lZCBlbnRpdHkga2VlcHMgaXRzIGlkXG4vLyBhbmQgc2ltcGx5IHNob3dzIGl0cyBuZXcgbmFtZSBoZXJlLiBPcHRpb25zIGNvbWUgZnJvbSB0aGUgZmlyc3QgbWVtYmVyIGZpbHRlclxuLy8gdGhhdCBkZWNsYXJlcyB0aGVtIOKAlCBtZW1iZXJzIGFyZSB0aGUgc2FtZSBkYXRhIHBvaW50LCBzbyBhbnkgbWVtYmVyJ3MgbGlzdFxuLy8gc2VydmVzIHRoZSBncm91cC4gVGhlIGxpc3QgaXMgZmV0Y2hlZCBvbmNlICh0aGUgc2VydmVyIGNhcHMgaXQpIGFuZCByZXBsYXllZFxuLy8gKHNoYXJlUmVwbGF5KSwgc28gcmVwZWF0ZWQgcmVhZHMgbmV2ZXIgcmVmZXRjaC4gVGhpcyBpcyB0aGUgZnVsbCBsaXN0LCBuZXZlclxuLy8gbmFycm93ZWQgYnkgb3RoZXIgZmlsdGVyczogdGhlIHJlcG9ydC1zZXR0aW5ncyBkZWZhdWx0IHBpY2tlciByZWFkcyBpdCAoYW5cbi8vIGF1dGhvciBzZXRzIGEgZGVmYXVsdCBhZ2FpbnN0IHRoZSB3aG9sZSBsaXN0KSwgYW5kIHNvIGRvZXMgdGhlIGV4cG9ydCdzXG4vLyBmaWx0ZXIgd29yZGluZyBmb3IgYSBwaWNrIHRoZSBiYXIgaGFzIG5vdCBuYW1lZC4gVGhlIGJhcnMgcmVhZFxuLy8gUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UgaW5zdGVhZC4gUmV0dXJucyBhbiBlbXB0eSBsaXN0IHdoZW4gbm8gbWVtYmVyXG4vLyBwcm92aWRlcyBvcHRpb25zLlxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRHcm91cE9wdGlvbnMoXG4gIGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgcmVwb3J0RGF0YTogUmVwb3J0RGF0YSxcbiAgcmVwb3J0SWQ6IG51bWJlcixcbik6IE9ic2VydmFibGU8UmVwb3J0RmlsdGVyT3B0aW9uUGFpcltdPiB7XG4gIGNvbnN0IG9wdGlvbkZpbHRlciA9IChncm91cC5maWx0ZXJzID8/IFtdKS5maW5kKChtZW1iZXIpID0+IG1lbWJlci5oYXNPcHRpb25zKTtcbiAgaWYgKCFvcHRpb25GaWx0ZXIpIHtcbiAgICByZXR1cm4gb2YoW10pO1xuICB9XG5cbiAgcmV0dXJuIHJlcG9ydERhdGEuZmlsdGVyT3B0aW9ucyhyZXBvcnRJZCwgb3B0aW9uRmlsdGVyLmlkKVxuICAgIC5waXBlKFxuICAgICAgbWFwKChvcHRpb25zOiBSZXBvcnRGaWx0ZXJPcHRpb25bXSkgPT4gKG9wdGlvbnMgPz8gW10pXG4gICAgICAgIC5tYXAoKG9wdGlvbikgPT4gKHsgbmFtZTogb3B0aW9uLmxhYmVsLCB2YWx1ZTogb3B0aW9uLnZhbHVlIH0pKSksXG4gICAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiBmYWxzZSB9KSxcbiAgICApO1xufVxuXG4vLyBTdG9yZWQgZmlsdGVyIHZhbHVlcyAoaWRzKSBwYWlyZWQgYmFjayB3aXRoIHRoZSBsYWJlbHMgdG8gc2hvdyBmb3IgdGhlbS5cbi8vIEEgc2F2ZWQgZGVmYXVsdCBob2xkcyBvbmx5IHZhbHVlcywgc28gdGhlIG5hbWVzIGhhdmUgdG8gYmUgcmVhZCBiYWNrIG9mZiB0aGVcbi8vIG9wdGlvbiBsaXN0IOKAlCB0aGF0IGluZGlyZWN0aW9uIGlzIGV4YWN0bHkgd2hhdCBzdXJ2aXZlcyBhIHJlbmFtZS4gYGxhYmVsYFxuLy8gbmFtZXMgYSB2YWx1ZSBmaXJzdDogYSBuYW1lIGFscmVhZHkgbGVhcm5lZCAoUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UubGFiZWwpXG4vLyBob2xkcyBmb3IgYSBwaWNrIGEgbmFycm93ZWQgbGlzdCBsZWF2ZXMgb3V0LCBhbmQgd2hlbiBpdCBuYW1lcyBldmVyeSB2YWx1ZVxuLy8gdGhlIGxpc3QgaXMgbm90IHJlYWQgYXQgYWxsLiBBIHZhbHVlIHdpdGggbm8gbmFtZSBhbmQgbm8gbWF0Y2hpbmcgb3B0aW9uXG4vLyAoaXRzIGVudGl0eSB3YXMgZGVsZXRlZCwgc28gaXQgaXMgbm8gbG9uZ2VyIGxpc3RlZCkgZmFsbHMgYmFjayB0byBzaG93aW5nXG4vLyB0aGUgcmF3IHZhbHVlIHJhdGhlciB0aGFuIGRyb3BwaW5nIHRoZSBjaGlwLCB3aGljaCB3b3VsZCBzaWxlbnRseSB3aWRlbiB0aGVcbi8vIGZpbHRlci5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlT3B0aW9uVmFsdWVzKFxuICBvcHRpb25zJDogT2JzZXJ2YWJsZTxSZXBvcnRGaWx0ZXJPcHRpb25QYWlyW10+LFxuICB2YWx1ZXM6IHVua25vd25bXSxcbiAgbGFiZWw6ICh2YWx1ZTogdW5rbm93bikgPT4gc3RyaW5nIHwgbnVsbCA9ICgpID0+IG51bGwsXG4pOiBPYnNlcnZhYmxlPFJlcG9ydEZpbHRlck9wdGlvblBhaXJbXT4ge1xuICBjb25zdCBuYW1lZCA9IChvcHRpb25zOiBSZXBvcnRGaWx0ZXJPcHRpb25QYWlyW10pID0+IHZhbHVlcy5tYXAoKHZhbHVlKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9uID0gb3B0aW9ucy5maW5kKChjYW5kaWRhdGUpID0+IFN0cmluZyhjYW5kaWRhdGUudmFsdWUpID09PSBTdHJpbmcodmFsdWUpKTtcblxuICAgIHJldHVybiB7IG5hbWU6IGxhYmVsKHZhbHVlKSA/PyBvcHRpb24/Lm5hbWUgPz8gU3RyaW5nKHZhbHVlKSwgdmFsdWUgfTtcbiAgfSk7XG5cbiAgcmV0dXJuIHZhbHVlcy5ldmVyeSgodmFsdWUpID0+IGxhYmVsKHZhbHVlKSAhPT0gbnVsbClcbiAgICA/IG9mKG5hbWVkKFtdKSlcbiAgICA6IG9wdGlvbnMkLnBpcGUobWFwKG5hbWVkKSk7XG59XG5cbi8vIFJlYWRzIGEgZ3JvdXAncyBvcHRpb24gbGlzdDsgc2VlIGdyb3VwT3B0aW9uc1JlYWRlcigpLlxuZXhwb3J0IHR5cGUgR3JvdXBPcHRpb25zUmVhZGVyID0gKFxuICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gIHJlcG9ydElkOiBudW1iZXIsXG4pID0+IE9ic2VydmFibGU8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXT47XG5cbi8vIEEgcmVhZGVyIG9mIGVhY2ggZ3JvdXAncyBvcHRpb24gbGlzdCAobG9hZEdyb3VwT3B0aW9ucykgdGhhdCBsb2FkcyBhIGdyb3VwJ3Ncbi8vIGxpc3Qgb25jZSBhbmQgaGFuZHMgZXZlcnkgbGF0ZXIgcmVhZCBvZiB0aGF0IGdyb3VwIHRoZSBzYW1lIHJlcGxheWVkXG4vLyByZXF1ZXN0LCBzbyBldmVyeXRoaW5nIHRoYXQgbmFtZXMgb25lIGdyb3VwJ3MgcGlja3Mg4oCUIHRoZSBjb3ZlcidzIGZpbHRlclxuLy8gbGluZSwgaXRzIHt7ZmlsdGVyLjxpZD59fSB0b2tlbiwgdGhlIG5leHQgcGljayDigJQgc2hhcmVzIG9uZSBmZXRjaC4gQSByZWFkXG4vLyB0aGF0IGZhaWxlZCBpcyBmZXRjaGVkIGFnYWluIGJ5IHRoZSBuZXh0IG9uZSAoc2hhcmVSZXBsYXkgZHJvcHMgYW4gZXJyb3IpLlxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwT3B0aW9uc1JlYWRlcihyZXBvcnREYXRhOiBSZXBvcnREYXRhKTogR3JvdXBPcHRpb25zUmVhZGVyIHtcbiAgY29uc3QgbG9hZGVkID0gbmV3IE1hcDxudW1iZXIsIE9ic2VydmFibGU8eyBuYW1lOiBzdHJpbmc7IHZhbHVlOiB1bmtub3duIH1bXT4+KCk7XG5cbiAgcmV0dXJuIChncm91cCwgcmVwb3J0SWQpID0+IHtcbiAgICBjb25zdCBvcHRpb25zJCA9IGxvYWRlZC5nZXQoZ3JvdXAuaWQpID8/IGxvYWRHcm91cE9wdGlvbnMoZ3JvdXAsIHJlcG9ydERhdGEsIHJlcG9ydElkKTtcbiAgICBsb2FkZWQuc2V0KGdyb3VwLmlkLCBvcHRpb25zJCk7XG5cbiAgICByZXR1cm4gb3B0aW9ucyQ7XG4gIH07XG59XG5cbi8vIFRoZSBuYW1lcyBvZiBhIHNlbGVjdCBncm91cCdzIHBpY2tzIChrZXB0IG9yIGxlZnQgb3V0KSwgYXMgaXRzIGNoaXBzIGluXG4vLyB0aGUgZmlsdGVyIGJhciBuYW1lIHRoZW0sIGZvciBhIHt7ZmlsdGVyLjxpZD59fSB0b2tlbjogYSBuYW1lIHRoZSBiYXInc1xuLy8gbGlzdHMgdGF1Z2h0IChgbGFiZWxgLCBSZXBvcnRGaWx0ZXJPcHRpb25zU2VydmljZS5sYWJlbCkgZmlyc3QsIGVsc2UgdGhlXG4vLyBncm91cCdzIG9wdGlvbiBsaXN0LiBudWxsIHdoZW4gdGhlIGxpc3QgY291bGQgbm90IGJlIHJlYWQ6IHRoZSB0b2tlbiB0aGVuXG4vLyByZWFkcyB0aGUgZW0gZGFzaCByYXRoZXIgdGhhbiBhIHJvdyBvZiBpZHMuXG5leHBvcnQgZnVuY3Rpb24gcGlja2VkT3B0aW9uTmFtZXMoXG4gIG9wdGlvbnMkOiBPYnNlcnZhYmxlPHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9W10+LFxuICB2YWx1ZXM6IHVua25vd25bXSxcbiAgbGFiZWw6ICh2YWx1ZTogdW5rbm93bikgPT4gc3RyaW5nIHwgbnVsbCA9ICgpID0+IG51bGwsXG4pOiBPYnNlcnZhYmxlPHN0cmluZ1tdIHwgbnVsbD4ge1xuICByZXR1cm4gcmVzb2x2ZU9wdGlvblZhbHVlcyhvcHRpb25zJCwgdmFsdWVzLCBsYWJlbClcbiAgICAucGlwZShcbiAgICAgIG1hcCgob3B0aW9ucyk6IHN0cmluZ1tdIHwgbnVsbCA9PiBvcHRpb25zLm1hcCgob3B0aW9uKSA9PiBvcHRpb24ubmFtZSkpLFxuICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSksXG4gICAgKTtcbn1cblxuLy8gQ2FzZS1pbnNlbnNpdGl2ZSBuYW1lIGZpbHRlciBhcHBsaWVkIHRvIGEgbG9hZGVkIG9wdGlvbiBsaXN0IOKAlCB0aGUgdHlwZWRcbi8vIGtleXdvcmQgaGFzIHRvIGJlIG1hdGNoZWQgaGVyZSBiZWNhdXNlIGZzLWF1dG9jb21wbGV0ZSByZW5kZXJzIHdoYXQgd2UgcmV0dXJuXG4vLyB2ZXJiYXRpbS5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaE9wdGlvbnMoXG4gIG9wdGlvbnMkOiBPYnNlcnZhYmxlPFJlcG9ydEZpbHRlck9wdGlvblBhaXJbXT4sXG4gIGtleXdvcmQ/OiBzdHJpbmcsXG4pOiBPYnNlcnZhYmxlPFJlcG9ydEZpbHRlck9wdGlvblBhaXJbXT4ge1xuICBjb25zdCB0ZXJtID0gKGtleXdvcmQgPz8gJycpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gIHJldHVybiBvcHRpb25zJC5waXBlKG1hcCgob3B0aW9ucykgPT4gdGVybVxuICAgID8gb3B0aW9ucy5maWx0ZXIoKG9wdGlvbikgPT4gb3B0aW9uLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyh0ZXJtKSlcbiAgICA6IG9wdGlvbnMpKTtcbn1cblxuLy8gVGhlIHBhbmVsIHJvdyBvZiBhIHNlbGVjdCB3aG9zZSBsaXN0IHRoZSBzZXJ2ZXIgY3V0IGF0IDUwMC5cbmV4cG9ydCBjb25zdCBPUFRJT05TX1RSVU5DQVRFRF9OT1RFID0gJ1Nob3dpbmcgdGhlIGZpcnN0IDUwMC4gVHlwZSB0byBuYXJyb3cuJztcblxuLy8gVGhlIHBhbmVsIHJvdyBvZiBhIHNlbGVjdCB3aG9zZSBsaXN0IGNvdWxkIG5vdCBiZSByZWFkLiBUaGUgbmV4dCBmb2N1cyBvclxuLy8ga2V5c3Ryb2tlIGFza3MgYWdhaW4uXG5leHBvcnQgY29uc3QgT1BUSU9OU19GQUlMRURfTk9URSA9ICdDb3VsZCBub3QgbG9hZCB0aGUgbGlzdC4nO1xuXG4vLyBCdWlsZCB0aGUgZnMtZmlsdGVyIGNvbmZpZyBpdGVtIGZvciBhIGdyb3VwLCBzZWVkaW5nIGl0cyBkZWZhdWx0IGZyb20gdGhlXG4vLyBjdXJyZW50IHNlc3Npb24gdmFsdWUgc28gYXV0aG9yZWQvcmVsYXRpdmUgZGVmYXVsdHMgc2hvdyBzZWxlY3RlZCBvbiBvcGVuLlxuLy8gQSBzZWxlY3QgbGlzdHMgd2hhdCBgb3B0aW9uc2Agb2ZmZXJzIGZvciBpdCBpbiBgcmVwb3J0YC4gYGZlYXR1cmVzYCBpcyB0aGVcbi8vIHJlcG9ydCdzIHZpZXdlckZlYXR1cmVzOiBhIHNlbGVjdCBvZmZlcnMgJ0V4Y2x1ZGUgdGhlc2UnIGJ5IHRoZSBydWxlIG9mXG4vLyBvZmZlcnNFeGNsdWRlICh0aGUgc2VydmVyIGxpc3RzIGV4Y2x1ZGVWYWx1ZXMgYW5kIG5vIG1lbWJlciBiaW5kcyBzZXZlcmFsXG4vLyBjb2x1bW5zKSwgYW5kIGEgbnVtYmVyIHJhbmdlIGlzIGEgbWluL21heCBjb250cm9sIG9ubHkgd2hlbiBpdCBsaXN0c1xuLy8gbnVtYmVyUmFuZ2UuXG5leHBvcnQgZnVuY3Rpb24gZmlsdGVySXRlbUZvckdyb3VwKFxuICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gIG9wdGlvbnM6IFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlLFxuICByZXBvcnQ6IFJlcG9ydCB8IG51bGwsXG4gIGluaXRpYWw/OiBGaWx0ZXJHcm91cFZhbHVlLFxuICBmZWF0dXJlczogcmVhZG9ubHkgUmVwb3J0Vmlld2VyRmVhdHVyZVtdID0gW10sXG4pOiBJRmlsdGVyQ29uZmlnSXRlbSB7XG4gIGNvbnN0IG5hbWUgPSBncm91cEl0ZW1OYW1lKGdyb3VwKTtcbiAgY29uc3QgbGFiZWwgPSBncm91cExhYmVsKGdyb3VwKTtcblxuICBzd2l0Y2ggKGdyb3VwLnR5cGUpIHtcbiAgICBjYXNlICdkYXRlUmFuZ2UnOlxuICAgICAgcmV0dXJuIGRhdGVSYW5nZUZpbHRlckl0ZW0obmFtZSwgbGFiZWwsIGluaXRpYWwpO1xuXG4gICAgY2FzZSAnc2VsZWN0JzpcbiAgICAgIHJldHVybiBzZWxlY3RGaWx0ZXJJdGVtKGdyb3VwLCBsYWJlbCwgb3B0aW9ucywgcmVwb3J0LCBpbml0aWFsLCBvZmZlcnNFeGNsdWRlKGdyb3VwLCBmZWF0dXJlcykpO1xuXG4gICAgY2FzZSAnbnVtYmVyUmFuZ2UnOlxuICAgICAgcmV0dXJuIGZlYXR1cmVzLmluY2x1ZGVzKCdudW1iZXJSYW5nZScpXG4gICAgICAgID8gbnVtYmVyUmFuZ2VGaWx0ZXJJdGVtKGdyb3VwLCBsYWJlbCwgcmVwb3J0LCBpbml0aWFsKVxuICAgICAgICA6IGtleXdvcmRGaWx0ZXJJdGVtKG5hbWUsIGxhYmVsLCBpbml0aWFsKTtcblxuICAgIGNhc2UgJ2tleXdvcmQnOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ga2V5d29yZEZpbHRlckl0ZW0obmFtZSwgbGFiZWwsIGluaXRpYWwpO1xuICB9XG59XG5cbi8vIEEgZGF0ZSByYW5nZSBvcGVucyBvbiBpdHMgZGF5cywgYW5kIGl0cyBjaGlwIHNob3dzIHRoZW0uIEEgcHJlc2V0IHBpY2tlZCBpblxuLy8gdGhlIGRhdGUgcGlja2VyIG9ubHkgc2V0cyB0aGUgZGF5cy5cbmZ1bmN0aW9uIGRhdGVSYW5nZUZpbHRlckl0ZW0obmFtZTogc3RyaW5nLCBsYWJlbDogc3RyaW5nLCBpbml0aWFsPzogRmlsdGVyR3JvdXBWYWx1ZSk6IElGaWx0ZXJDb25maWdJdGVtIHtcbiAgY29uc3QgaGFzRGF5cyA9ICEhKGluaXRpYWw/LnN0YXJ0IHx8IGluaXRpYWw/LmVuZCk7XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIHR5cGU6IEl0ZW1UeXBlLkRhdGVSYW5nZSxcbiAgICBsYWJlbDogeyBmcm9tOiBgJHtsYWJlbH0gRnJvbWAsIHRvOiBgJHtsYWJlbH0gVG9gIH0sXG4gICAgZGVmYXVsdDogaGFzRGF5c1xuICAgICAgPyB7IGZyb206IGluaXRpYWwuc3RhcnQgPz8gdW5kZWZpbmVkLCB0bzogaW5pdGlhbC5lbmQgPz8gdW5kZWZpbmVkIH1cbiAgICAgIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vLyBBIHNlbGVjdCdzIHBpY2tzLCBrZXB0IG9yIGxlZnQgb3V0LiBXaXRoIGBleGNsdWRlYCB0aGUgbGlzdCBoYXMgdGhlXG4vLyAnRXhjbHVkZSB0aGVzZScgcm93LCBhbmQgYSB2YWx1ZSB0aGF0IGxlYXZlcyBvdXQgb3BlbnMgd2l0aCBpdCBvbi4gSXRzIGxpc3Rcbi8vIGlzIHJlYWQgb24gZm9jdXMgYW5kIG9uIGVhY2gga2V5c3Ryb2tlOiB0aGUgb3B0aW9ucyBzZXJ2aWNlIGZldGNoZXMgaXQgd2hlblxuLy8gdGhlIG90aGVyIGZpbHRlcnMgY2hhbmdlZCBzaW5jZSBhbmQgcmVwbGF5cyBpdCBvdGhlcndpc2UsIGFuZCB0eXBpbmdcbi8vIGZpbHRlcnMgaXQgaGVyZS4gQSBsaXN0IHRoZSBzZXJ2ZXIgY3V0LCBvciBvbmUgdGhhdCBjb3VsZCBub3QgYmUgcmVhZCxcbi8vIHNheXMgc28gaW4gYSBwYW5lbCByb3cuXG5mdW5jdGlvbiBzZWxlY3RGaWx0ZXJJdGVtKFxuICBncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsXG4gIGxhYmVsOiBzdHJpbmcsXG4gIG9wdGlvbnM6IFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlLFxuICByZXBvcnQ6IFJlcG9ydCB8IG51bGwsXG4gIGluaXRpYWw6IEZpbHRlckdyb3VwVmFsdWUgfCB1bmRlZmluZWQsXG4gIGV4Y2x1ZGU6IGJvb2xlYW4sXG4pOiBJRmlsdGVyQ29uZmlnSXRlbSB7XG4gIGNvbnN0IGV4Y2x1ZGluZyA9IGV4Y2x1ZGUgJiYgIWluaXRpYWw/LnZhbHVlcz8ubGVuZ3RoICYmICEhaW5pdGlhbD8uZXhjbHVkZVZhbHVlcz8ubGVuZ3RoO1xuICBjb25zdCBwaWNrcyA9IGV4Y2x1ZGluZyA/IGluaXRpYWwuZXhjbHVkZVZhbHVlcyA6IGluaXRpYWw/LnZhbHVlcztcbiAgY29uc3Qgb3B0aW9ucyQgPSBvcHRpb25zLm9wdGlvbnMoZ3JvdXAsIHJlcG9ydCk7XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBncm91cEl0ZW1OYW1lKGdyb3VwKSxcbiAgICB0eXBlOiBJdGVtVHlwZS5BdXRvQ29tcGxldGVDaGlwcyxcbiAgICBsYWJlbCxcbiAgICBmZXRjaE9uRm9jdXM6IHRydWUsXG4gICAgZXhjbHVkZTogZXhjbHVkZSA/IHt9IDogdW5kZWZpbmVkLFxuICAgIHZhbHVlczogKGtleXdvcmQ/OiBzdHJpbmcpID0+IG1hdGNoT3B0aW9ucyhvcHRpb25zJCwga2V5d29yZCksXG4gICAgcGFuZWxOb3RlOiAoKSA9PiBvcHRpb25zTm90ZShvcHRpb25zLCBncm91cC5pZCksXG4gICAgLy8gU3RvcmVkIHZhbHVlcyBhcmUgaWRzLCBzbyBhIGNoaXAgaXMgbmFtZWQgYnkgYSBuYW1lIGFscmVhZHkgbGVhcm5lZCBvclxuICAgIC8vIG9uY2UgdGhlIG9wdGlvbiBsaXN0IGhhcyBsb2FkZWQg4oCUIGhlbmNlIHRoZSBvYnNlcnZhYmxlIGZvcm0gb2YgYGRlZmF1bHRgLlxuICAgIGRlZmF1bHQ6IHBpY2tzPy5sZW5ndGhcbiAgICAgID8gKCkgPT4gcmVzb2x2ZU9wdGlvblZhbHVlcyhvcHRpb25zJCwgcGlja3MsICh2YWx1ZSkgPT4gb3B0aW9ucy5sYWJlbChncm91cC5pZCwgdmFsdWUpKVxuICAgICAgICAucGlwZShtYXAoKHNlbGVjdGVkKSA9PiAoZXhjbHVkaW5nID8geyBleGNsdWRlOiB0cnVlLCBzZWxlY3RlZCB9IDogc2VsZWN0ZWQpKSlcbiAgICAgIDogdW5kZWZpbmVkLFxuICB9O1xufVxuXG4vLyBUaGUgcGFuZWwgcm93IG9mIGEgc2VsZWN0J3MgbGF0ZXN0IGxpc3Q6IGEgZmFpbHVyZSBmaXJzdCwgdGhlbiBhIGN1dCBsaXN0LlxuZnVuY3Rpb24gb3B0aW9uc05vdGUob3B0aW9uczogUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UsIGdyb3VwSWQ6IG51bWJlcik6IHN0cmluZyB8IG51bGwge1xuICBpZiAob3B0aW9ucy5mYWlsZWQoZ3JvdXBJZCkpIHtcbiAgICByZXR1cm4gT1BUSU9OU19GQUlMRURfTk9URTtcbiAgfVxuXG4gIHJldHVybiBvcHRpb25zLnRydW5jYXRlZChncm91cElkKSA/IE9QVElPTlNfVFJVTkNBVEVEX05PVEUgOiBudWxsO1xufVxuXG4vLyBBIG51bWJlciByYW5nZSdzIGxvdyBhbmQgaGlnaCBlbmRzLCBlaXRoZXIgb25lIG9wZW4uIDAgaXMgYW4gZW5kIGxpa2UgYW55XG4vLyBvdGhlci4gSXRzIGNoaXAgcmVhZHMgYXMgdGhlIGV4cG9ydCBsaW5lcyBkbyAoJ0Ftb3VudDogMCBvciBtb3JlJyxcbi8vICdBbW91bnQ6IDAgdG8gMTAnKTogdGhlIGVuZHMgYXJlIHJlYWQgb2ZmIHRoZSBpdGVtJ3MgcXVlcnkgdGhlIHdheSB0aGVcbi8vIGJhcidzIGNoYW5nZSByZWFkcyB0aGVtLCBhbmQgd29yZGVkIGluIHRoZSByZXBvcnQncyBsb2NhbGUuXG5mdW5jdGlvbiBudW1iZXJSYW5nZUZpbHRlckl0ZW0oXG4gIGdyb3VwOiBSZXBvcnRGaWx0ZXJHcm91cCxcbiAgbGFiZWw6IHN0cmluZyxcbiAgcmVwb3J0OiBSZXBvcnQgfCBudWxsLFxuICBpbml0aWFsPzogRmlsdGVyR3JvdXBWYWx1ZSxcbik6IElGaWx0ZXJDb25maWdJdGVtIHtcbiAgY29uc3QgbmFtZSA9IGdyb3VwSXRlbU5hbWUoZ3JvdXApO1xuICBjb25zdCBtaW4gPSBpbml0aWFsPy5taW4gPz8gdW5kZWZpbmVkO1xuICBjb25zdCBtYXggPSBpbml0aWFsPy5tYXggPz8gdW5kZWZpbmVkO1xuICBjb25zdCBsb2NhbGUgPSByZXNvbHZlRm9ybWF0Q29udGV4dChyZXBvcnQgPz8ge30pLmxvY2FsZTtcblxuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgdHlwZTogSXRlbVR5cGUuUmFuZ2UsXG4gICAgbGFiZWwsXG4gICAgZGVmYXVsdDogbWluICE9PSB1bmRlZmluZWQgfHwgbWF4ICE9PSB1bmRlZmluZWQgPyB7IG1pbiwgbWF4IH0gOiB1bmRlZmluZWQsXG4gICAgY2hpcFRleHQ6IChpdGVtKSA9PiBmaWx0ZXJMaW5lVGV4dChcbiAgICAgIHsgbGFiZWwsIGxldmVsOiBncm91cC5sZXZlbCB9LFxuICAgICAgbnVtYmVyUmFuZ2VGcm9tUXVlcnkoaXRlbS5xdWVyeSwgbmFtZSksXG4gICAgICB7IGxvY2FsZSB9LFxuICAgICAgJ2NoaXAnLFxuICAgICksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGtleXdvcmRGaWx0ZXJJdGVtKG5hbWU6IHN0cmluZywgbGFiZWw6IHN0cmluZywgaW5pdGlhbD86IEZpbHRlckdyb3VwVmFsdWUpOiBJRmlsdGVyQ29uZmlnSXRlbSB7XG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICB0eXBlOiBJdGVtVHlwZS5LZXl3b3JkLFxuICAgIGxhYmVsLFxuICAgIGRlZmF1bHQ6IGluaXRpYWw/LnZhbHVlLFxuICB9O1xufVxuXG4vLyBUaGUgZ3JvdXBzIGEgbWF0Y2ggb2YgJ2FueScgY29tYmluZXM6IHJlcG9ydCBiYXIgZ3JvdXBzIChhIHBhZ2UgZ3JvdXAgb25cbi8vIGl0cyBvd24gcGFnZSBvbmx5KSB0aGF0IGEgdmlld2VyIHBpY2tzIHZhbHVlcywgdGV4dCBvciBhIG51bWJlciByYW5nZSBpbi5cbi8vIERhdGVzLCB0aWxlLW9ubHkgZ3JvdXBzIGFuZCB0aGUgY3Jvc3MtZmlsdGVyIGFsd2F5cyBuYXJyb3cgb24gdGhlaXIgb3duLlxuLy8gVGhlIHNlcnZlciBob2xkcyB0aGUgc2FtZSBydWxlIGFuZCBjaGVja3MgZXZlcnkgaWQgaXQgaXMgc2VudC5cbmNvbnN0IE1BVENIX0FOWV9MRVZFTFM6IHJlYWRvbmx5IFJlcG9ydEZpbHRlckxldmVsW10gPSBbJ3JlcG9ydCcsICdib3RoJywgJ3BhZ2UnXTtcbmNvbnN0IE1BVENIX0FOWV9UWVBFUzogcmVhZG9ubHkgUmVwb3J0RmlsdGVyVHlwZVtdID0gWydzZWxlY3QnLCAna2V5d29yZCcsICdudW1iZXJSYW5nZSddO1xuXG4vLyBXaGV0aGVyIGEgZ3JvdXAgam9pbnMgYSBtYXRjaCBvZiAnYW55JyBvbiBwYWdlIGBwYWdlSWRgLlxuZXhwb3J0IGZ1bmN0aW9uIGlzTWF0Y2hBbnlHcm91cChncm91cDogUmVwb3J0RmlsdGVyR3JvdXAsIHBhZ2VJZDogbnVtYmVyIHwgbnVsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gTUFUQ0hfQU5ZX0xFVkVMUy5pbmNsdWRlcyhncm91cC5sZXZlbClcbiAgICAmJiBNQVRDSF9BTllfVFlQRVMuaW5jbHVkZXMoZ3JvdXAudHlwZSlcbiAgICAmJiAoZ3JvdXAubGV2ZWwgIT09ICdwYWdlJyB8fCAoISFwYWdlSWQgJiYgZ3JvdXAucGFnZUlkID09PSBwYWdlSWQpKTtcbn1cblxuLy8gVGhlIHJlcG9ydCBiYXIncyBncm91cHMgaW4gdGhlaXIgc2F2ZWQgb3JkZXI6IHRoZSByZXBvcnQgYW5kIGJvdGggZ3JvdXBzLFxuLy8gYW5kIHRoZSBwYWdlIGdyb3VwcyBvZiB0aGUgcGFnZSBvbiBzY3JlZW4gKGBwYWdlSWRgKS5cbmV4cG9ydCBmdW5jdGlvbiByZXBvcnRCYXJHcm91cHMocmVwb3J0OiBSZXBvcnQgfCBudWxsLCBwYWdlSWQ6IG51bWJlciB8IG51bGwpOiBSZXBvcnRGaWx0ZXJHcm91cFtdIHtcbiAgcmV0dXJuIChyZXBvcnQ/LmZpbHRlckdyb3VwcyA/PyBbXSlcbiAgICAuZmlsdGVyKChncm91cCkgPT4gZ3JvdXAubGV2ZWwgPT09ICdyZXBvcnQnIHx8IGdyb3VwLmxldmVsID09PSAnYm90aCdcbiAgICAgIHx8IChncm91cC5sZXZlbCA9PT0gJ3BhZ2UnICYmICEhcGFnZUlkICYmIGdyb3VwLnBhZ2VJZCA9PT0gcGFnZUlkKSlcbiAgICAuc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpO1xufVxuXG4vLyBXaGV0aGVyIHRoZSByZXBvcnQgaGFzIGEgZ3JvdXAgc2hvd24gb24gb25lIHBhZ2Ugb25seSwgc28gaXRzIHJlcG9ydCBiYXJcbi8vIGNoYW5nZXMgd2l0aCB0aGUgcGFnZSBvbiBzY3JlZW4uXG5leHBvcnQgZnVuY3Rpb24gaGFzUGFnZUdyb3VwKHJlcG9ydDogUmVwb3J0IHwgbnVsbCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKHJlcG9ydD8uZmlsdGVyR3JvdXBzID8/IFtdKS5zb21lKChncm91cCkgPT4gZ3JvdXAubGV2ZWwgPT09ICdwYWdlJyk7XG59XG5cbi8vIFRoZSBxdWVyeSBrZXkgb2YgdGhlIHJlcG9ydCBiYXIncyBNYXRjaCBjb250cm9sLiBOb3QgYSBmaWx0ZXIgZ3JvdXA6IGl0XG4vLyBzYXlzIGhvdyB0aGUgZ3JvdXBzIGNvbWJpbmUsIHNvIGl0IGlzIHJlYWQgc3RyYWlnaHQgb2ZmIHRoZSBjaGFuZ2UgcXVlcnkuXG5leHBvcnQgY29uc3QgTUFUQ0hfSVRFTSA9ICdtYXRjaCc7XG5cbmNvbnN0IE1BVENIX09QVElPTlM6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogUmVwb3J0RmlsdGVyTWF0Y2ggfVtdID0gW1xuICB7IG5hbWU6ICdBbGwgZmlsdGVycycsIHZhbHVlOiAnYWxsJyB9LFxuICB7IG5hbWU6ICdBbnkgZmlsdGVyJywgdmFsdWU6ICdhbnknIH0sXG5dO1xuXG4vLyBUaGUgcmVwb3J0IGJhcidzIE1hdGNoIGNvbnRyb2wsIGxhc3QgaW4gdGhlIGJhciwgb3IgbnVsbCB3aGVuIGl0IHdvdWxkIGRvXG4vLyBub3RoaW5nOiB0aGUgc2VydmVyIG11c3Qgc2VydmUgbWF0Y2hBbnksIGFuZCB0aGUgYmFyIG11c3QgaG9sZCB0d28gb3IgbW9yZVxuLy8gZ3JvdXBzIHRoYXQgY29tYmluZSAoYW4gJ2FueScgb3ZlciBvbmUgZ3JvdXAgaXMgdGhhdCBncm91cCkuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hGaWx0ZXJJdGVtKFxuICByZXBvcnQ6IFJlcG9ydCB8IG51bGwsXG4gIGdyb3VwczogUmVwb3J0RmlsdGVyR3JvdXBbXSxcbiAgcGFnZUlkOiBudW1iZXIgfCBudWxsLFxuICBtYXRjaDogUmVwb3J0RmlsdGVyTWF0Y2gsXG4pOiBJRmlsdGVyQ29uZmlnSXRlbSB8IG51bGwge1xuICBjb25zdCBlbGlnaWJsZSA9IGdyb3Vwcy5maWx0ZXIoKGdyb3VwKSA9PiBpc01hdGNoQW55R3JvdXAoZ3JvdXAsIHBhZ2VJZCkpO1xuXG4gIGlmICghcmVwb3J0Py52aWV3ZXJGZWF0dXJlcz8uaW5jbHVkZXMoJ21hdGNoQW55JykgfHwgZWxpZ2libGUubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBNQVRDSF9JVEVNLFxuICAgIHR5cGU6IEl0ZW1UeXBlLlNlbGVjdCxcbiAgICBsYWJlbDogJ01hdGNoJyxcbiAgICBtdWx0aXBsZTogZmFsc2UsXG4gICAgdmFsdWVzOiAoKSA9PiBNQVRDSF9PUFRJT05TLFxuICAgIGRlZmF1bHQ6IG1hdGNoLFxuICAgIC8vICdNYXRjaDogYW55IGZpbHRlcicgb3IgJ01hdGNoOiBhbGwgZmlsdGVycycsIGluIHRoZSBleHBvcnQgbGluZXMnIHdvcmRzLlxuICAgIGNoaXBUZXh0OiAoaXRlbSkgPT4gbWF0Y2hMaW5lVGV4dChtYXRjaEZyb21RdWVyeShpdGVtLnF1ZXJ5KSwgJ2NoaXAnKSxcbiAgfTtcbn1cblxuLy8gVGhlIG1hdGNoIGEgY2hhbmdlIHF1ZXJ5IG9mIGEgYmFyIHdpdGggdGhlIE1hdGNoIGNvbnRyb2wgYXNrcyBmb3IuXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hGcm9tUXVlcnkocXVlcnk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVwb3J0RmlsdGVyTWF0Y2gge1xuICByZXR1cm4gcXVlcnk/LltNQVRDSF9JVEVNXSA9PT0gJ2FueScgPyAnYW55JyA6ICdhbGwnO1xufVxuXG4vLyBUaGUgcXVlcnkga2V5IG9mIGEgbGlzdCdzIHNlYXJjaCBib3ggaW4gaXRzIGNvbXBvbmVudCBoZWFkZXIuIEZpeGVkIHJhdGhlclxuLy8gdGhhbiBkZXJpdmVkIGZyb20gYW4gaWQgYmVjYXVzZSBhIGhlYWRlciBob2xkcyBhdCBtb3N0IG9uZSwgYW5kIGl0IGlzIE5PVCBhXG4vLyBmaWx0ZXIgZ3JvdXA6IGl0cyB0ZXh0IG5hcnJvd3MgdGhhdCBsaXN0IGFsb25lLCBzbyBpdCBpcyByZWFkIHN0cmFpZ2h0IG9mZlxuLy8gdGhlIGNoYW5nZSBxdWVyeSBhbmQgdHJhdmVscyBhcyB0aGUgbGlzdCdzIG93biBgc3RhdGUuc2VhcmNoYC5cbmV4cG9ydCBjb25zdCBMSVNUX1NFQVJDSF9JVEVNID0gJ2xpc3RTZWFyY2gnO1xuXG4vLyBUaGUgbG9uZ2VzdCBzZWFyY2ggdGhlIHNlcnZlciBhcHBsaWVzIChSZXBvcnRRdWVyeVJ1bm5lcjo6TUFYX1NFQVJDSF9MRU5HVEgpLlxuLy8gVGhlIHZpZXdlciBjdXRzIHRoZSB0ZXh0IHRvIGl0IHRvbywgc28gdGhlIHN0YXRlLCB0aGUgcmVxdWVzdCBhbmQgdGhlIGV4cG9ydFxuLy8gdGl0bGUgYWxsIGNhcnJ5IHRoZSB0ZXh0IHRoYXQgd2FzIGFjdHVhbGx5IHNlYXJjaGVkLlxuZXhwb3J0IGNvbnN0IExJU1RfU0VBUkNIX01BWF9MRU5HVEggPSAxMDA7XG5cbi8vIFRoZSBmcy1maWx0ZXIgY29uZmlnIGl0ZW0gZm9yIGEgbGlzdCdzIHNlYXJjaCBib3gsIHNlZWRlZCB3aXRoIHRoZSB0ZXh0IHRoZVxuLy8gdmlld2VyIGxhc3Qgc2VhcmNoZWQuIGZzLWZpbHRlciBzaG93cyBvbmUgc2VhcmNoIGJveCBwZXIgYmFyIChpdHMgbGFzdFxuLy8ga2V5d29yZCBpdGVtKSwgc28gdGhlIGNhbGxlciBhZGRzIHRoaXMgb25seSB0byBhIGhlYWRlciB3aXRoIG5vIGtleXdvcmRcbi8vIGdyb3VwIG9mIGl0cyBvd24uXG5leHBvcnQgZnVuY3Rpb24gbGlzdFNlYXJjaEl0ZW0odmFsdWU6IHN0cmluZyB8IG51bGwpOiBJRmlsdGVyQ29uZmlnSXRlbSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogSXRlbVR5cGUuS2V5d29yZCxcbiAgICBuYW1lOiBMSVNUX1NFQVJDSF9JVEVNLFxuICAgIGxhYmVsOiAnU2VhcmNoJyxcbiAgICBkZWZhdWx0OiB2YWx1ZSA/PyB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8vIFdoZXRoZXIgdGhlIHJlcG9ydCBoYXMgYSB0aWxlIHRoZSBncm91cC1ieSBjb250cm9sIGNhbiByZS1idWNrZXQ6IGEgY2hhcnRcbi8vIG9uIGEgdGltZSB4LWF4aXMgb3IgYSB0YWJsZSBvdmVyIGEgdGltZSBheGlzIChmb2xsb3dzR3JvdXBCeSkuIEEgdGltZSBheGlzXG4vLyBpcyB0aGUgd2hvbGUgcXVhbGlmaWNhdGlvbjogdGhlIGNvbnRyb2wgY2hhbmdlcyBpdHMgZ3JhaW4sIGFuZCBhIGNhdGVnb3J5XG4vLyBheGlzIGhhcyBubyBncmFpbiB0byBjaGFuZ2UuXG5leHBvcnQgZnVuY3Rpb24gaGFzR3JvdXBCeVRpbGUocmVwb3J0OiBSZXBvcnQgfCBudWxsKTogYm9vbGVhbiB7XG4gIHJldHVybiAocmVwb3J0Py5wYWdlcyA/PyBbXSkuc29tZSgocGFnZSkgPT4gKHBhZ2UuY29tcG9uZW50cyA/PyBbXSkuc29tZShmb2xsb3dzR3JvdXBCeSkpO1xufVxuXG4vLyBUaGUgZ3JhaW5zIHRoZSByZXBvcnQncyBncm91cC1ieSBjb250cm9sIG9mZmVycywgbmFtZWQgZm9yIHRoZSB2aWV3ZXIuIFdISUNIXG4vLyBvZiB0aGVtIGNvbWVzIGZyb20gdGhlIHJlcG9ydDsgaG93IHRoZXkgcmVhZCBjb21lcyBmcm9tIEdSQU5VTEFSSVRZX09QVElPTlMuXG4vLyBBbiBlbXB0eSBzdG9yZWQgbGlzdCBtZWFucyBldmVyeSBncmFpbiDigJQgdGhlIHNhbWUgcnVsZSB0aGUgYmFja2VuZCBhcHBsaWVzLlxuZnVuY3Rpb24gZ3JvdXBCeU9wdGlvbnMocmVwb3J0OiBSZXBvcnQpOiB7IHZhbHVlOiBDaGFydEdyYW51bGFyaXR5OyBuYW1lOiBzdHJpbmcgfVtdIHtcbiAgY29uc3QgZ3JhbnVsYXJpdGllcyA9IHJlcG9ydC5jb25maWc/Lmdyb3VwQnk/LmdyYW51bGFyaXRpZXMgPz8gW107XG5cbiAgcmV0dXJuIGdyYW51bGFyaXRpZXMubGVuZ3RoXG4gICAgPyBHUkFOVUxBUklUWV9PUFRJT05TLmZpbHRlcigob3B0aW9uKSA9PiBncmFudWxhcml0aWVzLmluY2x1ZGVzKG9wdGlvbi52YWx1ZSkpXG4gICAgOiBHUkFOVUxBUklUWV9PUFRJT05TO1xufVxuXG4vLyBXaGV0aGVyIGEgZ3JhaW4gaXMgb25lIHRoZSByZXBvcnQncyBjb250cm9sIHN0aWxsIG9mZmVycy4gQSBncmFpbiBpdCBkb2Vzbid0XG4vLyBjYW5ub3Qgc3RheSBpbiBlZmZlY3Q6IHRoZSBhZ2VudCBjYW4gbmFycm93IHRoZSBsaXN0IGF0IGFueSB0aW1lLCBhbmQgYSBjaGFydFxuLy8gbGVmdCBidWNrZXRpbmcgYXQgYSBkcm9wcGVkIGdyYWluIGlzIG9uZSB0aGUgdmlld2VyIGNhbiBuZWl0aGVyIHNlZSBub3IgY2hhbmdlLlxuZXhwb3J0IGZ1bmN0aW9uIGlzR3JhbnVsYXJpdHlPZmZlcmVkKHJlcG9ydDogUmVwb3J0LCBncmFudWxhcml0eTogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwpOiBib29sZWFuIHtcbiAgcmV0dXJuICFncmFudWxhcml0eSB8fCBncm91cEJ5T3B0aW9ucyhyZXBvcnQpLnNvbWUoKG9wdGlvbikgPT4gb3B0aW9uLnZhbHVlID09PSBncmFudWxhcml0eSk7XG59XG5cbi8vIFRoZSBmcy1maWx0ZXIgY29uZmlnIGl0ZW0gZm9yIHRoZSByZXBvcnQncyBncm91cC1ieSBjb250cm9sLCBvciBudWxsIHdoZW4gdGhlXG4vLyByZXBvcnQgaGFzIG5vbmUgdG8gc2hvdy5cbi8vXG4vLyBJdCBsZWFkcyB0aGUgc2FtZSBiYXIgdGhlIGZpbHRlcnMgcmVuZGVyIGluLCBidXQgaXQgaXMgTk9UIG9uZTogYSBmaWx0ZXJcbi8vIG5hcnJvd3MgV0hJQ0ggcm93cyBhcmUgY291bnRlZCwgdGhpcyBjaGFuZ2VzIGhvdyB0aGUgc3Vydml2aW5nIHJvd3MgYXJlXG4vLyBCVUNLRVRFRCDigJQgYW5kIGl0IGNvbWVzIGZpcnN0IGJlY2F1c2UgdGhlIGdyYWluIGlzIHdoYXQgYSB2aWV3ZXIgc2V0dGxlc1xuLy8gYmVmb3JlIGRlY2lkaW5nIHdoaWNoIHJvd3MgdGhleSB3YW50LlxuLy8gUGlja2luZyBhIGdyYWluIHNldHMgYSBzZXNzaW9uLXdpZGUgb3ZlcnJpZGUgdGhhdCByaWRlcyBhbG9uZyBpbiBlYWNoIGNoYXJ0J3Ncbi8vIGRhdGEgcmVxdWVzdCwgc28gdGhlIGNoYXJ0cyB0aGVtc2VsdmVzIGFyZSBuZXZlciByZXdyaXR0ZW4uXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBCeUZpbHRlckl0ZW0oXG4gIHJlcG9ydDogUmVwb3J0LFxuICBpbml0aWFsPzogQ2hhcnRHcmFudWxhcml0eSB8IG51bGwsXG4pOiBJRmlsdGVyQ29uZmlnSXRlbSB8IG51bGwge1xuICBjb25zdCBncm91cEJ5ID0gcmVwb3J0LmNvbmZpZz8uZ3JvdXBCeTtcblxuICAvLyBPbmx5IGFuIEVYUExJQ0lUIGZhbHNlIGhpZGVzIHRoZSBjb250cm9sLiBBbiBhYnNlbnQgYmxvY2sgbWVhbnMgYSByZXBvcnRcbiAgLy8gc2VydmVkIGJ5IGEgYnVpbGQgdGhhdCBwcmVkYXRlcyB0aGUgY29udHJvbCBiZWluZyBzdG9yZWQsIGFuZCBldmVyeSBvbmUgb2ZcbiAgLy8gdGhvc2UgaGFkIG9uZSDigJQgdGhlIGJhY2tlbmQgcmVzb2x2ZXMgaXQgdGhlIHNhbWUgd2F5IChSZXBvcnRHcm91cEJ5KS5cbiAgaWYgKGdyb3VwQnk/LmVuYWJsZWQgPT09IGZhbHNlIHx8ICFoYXNHcm91cEJ5VGlsZShyZXBvcnQpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCB2YWx1ZXMgPSBncm91cEJ5T3B0aW9ucyhyZXBvcnQpO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZTogR1JPVVBfQllfSVRFTSxcbiAgICB0eXBlOiBJdGVtVHlwZS5TZWxlY3QsXG4gICAgbGFiZWw6IGdyb3VwQnk/LmxhYmVsIHx8ICdHcm91cCBCeScsXG4gICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgIHZhbHVlczogKCkgPT4gdmFsdWVzLFxuICAgIGRlZmF1bHQ6IGlzR3JhbnVsYXJpdHlPZmZlcmVkKHJlcG9ydCwgaW5pdGlhbCA/PyBudWxsKSA/IChpbml0aWFsID8/IHVuZGVmaW5lZCkgOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8vIFRoZSBncm91cC1ieSBjb250cm9sJ3MgY29udHJpYnV0aW9uIHRvIHRoZSB0b29sYmFyJ3MgZnMtZmlsdGVyIGtleS4gZnMtZmlsdGVyXG4vLyByZWFkcyBpdHMgY29uZmlnIG9uY2UgYXQgaW5pdCwgYW5kIHRoZSBhZ2VudCBjYW4gY2hhbmdlIHRoZSBjb250cm9sJ3MgbGFiZWxcbi8vIG9yIHRoZSBncmFpbnMgaXQgb2ZmZXJzIOKAlCB3aXRob3V0IHRob3NlIGluIHRoZSBrZXkgdGhlIGJhciBrZWVwcyByZW5kZXJpbmdcbi8vIHRoZSBjb250cm9sIGl0IHdhcyBjcmVhdGVkIHdpdGggdW50aWwgYSBmdWxsIHBhZ2UgcmVsb2FkLlxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwQnlTaWduYXR1cmUocmVwb3J0OiBSZXBvcnQgfCBudWxsKTogc3RyaW5nIHtcbiAgaWYgKCFyZXBvcnQgfHwgIWdyb3VwQnlGaWx0ZXJJdGVtKHJlcG9ydCkpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBjb25zdCBncm91cEJ5ID0gcmVwb3J0LmNvbmZpZz8uZ3JvdXBCeTtcblxuICByZXR1cm4gWydncm91cEJ5JywgZ3JvdXBCeT8ubGFiZWwgPz8gJycsIChncm91cEJ5Py5ncmFudWxhcml0aWVzID8/IFtdKS5qb2luKCcsJyldLmpvaW4oJzonKTtcbn1cblxuLy8gUmVhZCBhbiBmcy1maWx0ZXIgY2hhbmdlIHF1ZXJ5IGludG8gcGVyLWdyb3VwIHZhbHVlcy4gUmV0dXJucyBvbmUgZW50cnkgcGVyXG4vLyBncm91cCB3aXRoIHRoZSB2YWx1ZSB0byBzdG9yZSAob3IgbnVsbCB0byBjbGVhcikg4oCUIGNhbGxlcnMgZmVlZCB0aGVzZSB0b1xuLy8gUmVwb3J0RmlsdGVyU3RhdGVTZXJ2aWNlLnNldFZhbHVlLlxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwVmFsdWVzRnJvbVF1ZXJ5KFxuICBxdWVyeTogUmVjb3JkPHN0cmluZywgYW55PixcbiAgZ3JvdXBzOiBSZXBvcnRGaWx0ZXJHcm91cFtdLFxuKTogeyBncm91cElkOiBudW1iZXI7IHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB9W10ge1xuICByZXR1cm4gZ3JvdXBzLm1hcCgoZ3JvdXApID0+IHtcbiAgICBjb25zdCBuYW1lID0gZ3JvdXBJdGVtTmFtZShncm91cCk7XG5cbiAgICBzd2l0Y2ggKGdyb3VwLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2RhdGVSYW5nZSc6XG4gICAgICAgIHJldHVybiB7IGdyb3VwSWQ6IGdyb3VwLmlkLCB2YWx1ZTogZGF0ZVJhbmdlRnJvbVF1ZXJ5KHF1ZXJ5LCBuYW1lKSB9O1xuXG4gICAgICBjYXNlICdzZWxlY3QnOlxuICAgICAgICByZXR1cm4geyBncm91cElkOiBncm91cC5pZCwgdmFsdWU6IHNlbGVjdEZyb21RdWVyeShxdWVyeSwgbmFtZSkgfTtcblxuICAgICAgY2FzZSAnbnVtYmVyUmFuZ2UnOlxuICAgICAgICByZXR1cm4geyBncm91cElkOiBncm91cC5pZCwgdmFsdWU6IG51bWJlclJhbmdlRnJvbVF1ZXJ5KHF1ZXJ5LCBuYW1lKSB9O1xuXG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnN0IGtleXdvcmQgPSBTdHJpbmcocXVlcnlbbmFtZV0gPz8gJycpLnRyaW0oKTtcblxuICAgICAgICByZXR1cm4geyBncm91cElkOiBncm91cC5pZCwgdmFsdWU6IGtleXdvcmQgPyB7IHZhbHVlOiBrZXl3b3JkIH0gOiBudWxsIH07XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cblxuLy8gQSBkYXRlIHJhbmdlJ3MgZGF5cyAoPG5hbWU+RnJvbSwgPG5hbWU+VG8pLlxuZnVuY3Rpb24gZGF0ZVJhbmdlRnJvbVF1ZXJ5KHF1ZXJ5OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCBuYW1lOiBzdHJpbmcpOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB7XG4gIGNvbnN0IHN0YXJ0ID0gcXVlcnlbaXRlbVJhbmdlTmFtZShuYW1lLCAnZnJvbScpXTtcbiAgY29uc3QgZW5kID0gcXVlcnlbaXRlbVJhbmdlTmFtZShuYW1lLCAndG8nKV07XG5cbiAgaWYgKCFzdGFydCAmJiAhZW5kKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4geyBzdGFydDogc3RhcnQgfHwgbnVsbCwgZW5kOiBlbmQgfHwgbnVsbCB9O1xufVxuXG4vLyBBIHNlbGVjdCdzIHBpY2tzOiBrZXB0ICg8bmFtZT4pLCBvciBsZWZ0IG91dCB3aGlsZSBpdHMgZXhjbHVkZSByb3cgaXMgb25cbi8vIChleGNsdWRlPE5hbWU+KS5cbmZ1bmN0aW9uIHNlbGVjdEZyb21RdWVyeShxdWVyeTogUmVjb3JkPHN0cmluZywgYW55PiwgbmFtZTogc3RyaW5nKTogRmlsdGVyR3JvdXBWYWx1ZSB8IG51bGwge1xuICBjb25zdCBleGNsdWRlVmFsdWVzID0gc2VsZWN0UXVlcnlWYWx1ZXMocXVlcnlbZ2V0RXhjbHVkZU5hbWUobmFtZSldKTtcbiAgaWYgKGV4Y2x1ZGVWYWx1ZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHsgZXhjbHVkZVZhbHVlcyB9O1xuICB9XG5cbiAgY29uc3QgdmFsdWVzID0gc2VsZWN0UXVlcnlWYWx1ZXMocXVlcnlbbmFtZV0pO1xuXG4gIHJldHVybiB2YWx1ZXMubGVuZ3RoID8geyB2YWx1ZXMgfSA6IG51bGw7XG59XG5cbi8vIEEgbnVtYmVyIHJhbmdlJ3MgZW5kcyAoPG5hbWU+TWluLCA8bmFtZT5NYXgpLiBBbiBlbmQgbGVmdCBlbXB0eSBpcyBvcGVuLlxuZnVuY3Rpb24gbnVtYmVyUmFuZ2VGcm9tUXVlcnkocXVlcnk6IFJlY29yZDxzdHJpbmcsIGFueT4sIG5hbWU6IHN0cmluZyk6IEZpbHRlckdyb3VwVmFsdWUgfCBudWxsIHtcbiAgY29uc3QgbWluID0gcmFuZ2VCb3VuZChxdWVyeVtpdGVtUmFuZ2VOYW1lKG5hbWUsICdtaW4nKV0pO1xuICBjb25zdCBtYXggPSByYW5nZUJvdW5kKHF1ZXJ5W2l0ZW1SYW5nZU5hbWUobmFtZSwgJ21heCcpXSk7XG5cbiAgaWYgKG1pbiA9PT0gbnVsbCAmJiBtYXggPT09IG51bGwpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uKG1pbiAhPT0gbnVsbCA/IHsgbWluIH0gOiB7fSksXG4gICAgLi4uKG1heCAhPT0gbnVsbCA/IHsgbWF4IH0gOiB7fSksXG4gIH07XG59XG5cbi8vIE9uZSBlbmQgb2YgYSBudW1iZXIgcmFuZ2UgYXMgZnMtZmlsdGVyJ3MgUmFuZ2Ugc2VuZHMgaXQ6IHRoZSB0ZXh0IHR5cGVkIGluXG4vLyBpdHMgaW5wdXQuIE51bWJlcigpIHJlYWRzIGFueSBub24tZW1wdHkgdGV4dCwgc28gJzAnIGlzIHRoZSBlbmQgMDsgZW1wdHkgb3Jcbi8vIHVucmVhZGFibGUgdGV4dCBpcyBhbiBvcGVuIGVuZC5cbmZ1bmN0aW9uIHJhbmdlQm91bmQocmF3OiB1bmtub3duKTogbnVtYmVyIHwgbnVsbCB7XG4gIGNvbnN0IHRleHQgPSB0eXBlb2YgcmF3ID09PSAnbnVtYmVyJyA/IFN0cmluZyhyYXcpIDogU3RyaW5nKHJhdyA/PyAnJykudHJpbSgpO1xuICBjb25zdCBudW1iZXIgPSB0ZXh0ID09PSAnJyA/IE5hTiA6IE51bWJlcih0ZXh0KTtcblxuICByZXR1cm4gTnVtYmVyLmlzRmluaXRlKG51bWJlcikgPyBudW1iZXIgOiBudWxsO1xufVxuXG4vLyBBIGdyb3VwIHZhbHVlIGFzIHRleHQsIHRoZSBzYW1lIGZvciB0aGUgc2FtZSB2YWx1ZSB3aGF0ZXZlciBpdHMgc291cmNlOlxuLy8gZGF5cyBhcyBjYWxlbmRhciBkYXlzLCBwaWNrcyBhbmQgZW5kcyBhcyB0ZXh0LCBrZXl3b3JkIHRleHQgdHJpbW1lZC4gVGhlXG4vLyB2YWx1ZSBhIHRpbGUgaGVhZGVyIHdhcyBidWlsdCB3aXRoIGlzIGtleWVkIG9uIGl0LCBzbyBhIGhlYWRlciBpcyBjcmVhdGVkXG4vLyBhZ2FpbiB3aGVuIGFub3RoZXIgYmFyIGNoYW5nZXMgYSBncm91cCBpdCBzaG93cy5cbmV4cG9ydCBmdW5jdGlvbiBncm91cFZhbHVlU2lnbmF0dXJlKHZhbHVlOiBGaWx0ZXJHcm91cFZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoW1xuICAgIGRhdGVCb3VuZFN0cmluZyh2YWx1ZS5zdGFydCkgPz8gJycsXG4gICAgZGF0ZUJvdW5kU3RyaW5nKHZhbHVlLmVuZCkgPz8gJycsXG4gICAgKHZhbHVlLnZhbHVlcyA/PyBbXSkubWFwKFN0cmluZyksXG4gICAgKHZhbHVlLmV4Y2x1ZGVWYWx1ZXMgPz8gW10pLm1hcChTdHJpbmcpLFxuICAgICh2YWx1ZS52YWx1ZSA/PyAnJykudHJpbSgpLFxuICAgIHZhbHVlLm1pbiA/PyAnJyxcbiAgICB2YWx1ZS5tYXggPz8gJycsXG4gIF0pO1xufVxuXG4vLyBmcy1maWx0ZXIncyBBdXRvQ29tcGxldGVDaGlwcyBzZXJpYWxpc2VzIGEgbXVsdGktc2VsZWN0IGludG8gT05FIHF1ZXJ5IHZhbHVlOlxuLy8gdGhlIHNlbGVjdGVkIHZhbHVlcyBqb2luZWQgYnkgXCIsXCIgKGl0cyBgcXVlcnlgIGdldHRlciBkb2VzIGAubWFwKHZhbHVlKS5qb2luKCcsJylgKS5cbi8vIFNvIGEgMisgc2VsZWN0aW9uIGFycml2ZXMgYXMgdGhlIHN0cmluZyBcImEsYlwiLCBub3QgYW4gYXJyYXkg4oCUIHNwbGl0dGluZyBvbiBcIixcIlxuLy8gcmV2ZXJzZXMgdGhhdCBmYWl0aGZ1bGx5LiBXaXRob3V0IHRoaXMsIGEgbXVsdGktc2VsZWN0IHdhcyBzZW50IGFzIHRoZSBzaW5nbGVcbi8vIHZhbHVlIFtcImEsYlwiXSwgcHJvZHVjaW5nIGBjb2wgSU4gKCdhLGInKWAgc2VydmVyLXNpZGUsIHdoaWNoIG1hdGNoZXMgbm90aGluZy5cbmZ1bmN0aW9uIHNlbGVjdFF1ZXJ5VmFsdWVzKHJhdzogdW5rbm93bik6IHVua25vd25bXSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHJhdykpIHtcbiAgICByZXR1cm4gcmF3O1xuICB9XG5cbiAgaWYgKHJhdyA9PT0gbnVsbCB8fCByYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09ICcnKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIFN0cmluZyhyYXcpLnNwbGl0KCcsJyk7XG59XG4iXX0=
@@ -1,7 +1,15 @@
1
- // A table tile's layouts: the one its config authors, and the canonical key
2
- // two layouts are compared by.
3
- import { canonicalGridLayout } from '@firestitch/grid';
1
+ // A table tile's layouts: the one its config authors, the canonical key two
2
+ // layouts are compared by, and a viewer's layout moved onto a new authored one.
3
+ import { GridControlState, GridGranularity, GridNoteCode, canonicalGridLayout, convertDateFilter, } from '@firestitch/grid';
4
4
  const NO_LAYOUT = {};
5
+ // The report's grains by the grid's name for each.
6
+ export const GRID_GRANULARITIES = {
7
+ day: GridGranularity.Day,
8
+ week: GridGranularity.Week,
9
+ month: GridGranularity.Month,
10
+ quarter: GridGranularity.Quarter,
11
+ year: GridGranularity.Year,
12
+ };
5
13
  // The layout a table tile's config authors, or none.
6
14
  export function authoredGridLayout(component) {
7
15
  return component.config?.layout ?? NO_LAYOUT;
@@ -11,4 +19,90 @@ export function authoredGridLayout(component) {
11
19
  export function gridLayoutKey(layout) {
12
20
  return JSON.stringify(canonicalGridLayout(layout));
13
21
  }
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWdyaWQtbGF5b3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL3JlcG9ydC1ncmlkLWxheW91dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0RUFBNEU7QUFDNUUsK0JBQStCO0FBQy9CLE9BQU8sRUFBYyxtQkFBbUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBS25FLE1BQU0sU0FBUyxHQUFlLEVBQUUsQ0FBQztBQUVqQyxxREFBcUQ7QUFDckQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLFNBQTBCO0lBQzNELE9BQU8sU0FBUyxDQUFDLE1BQU0sRUFBRSxNQUFNLElBQUksU0FBUyxDQUFDO0FBQy9DLENBQUM7QUFFRCwwRUFBMEU7QUFDMUUsK0RBQStEO0FBQy9ELE1BQU0sVUFBVSxhQUFhLENBQUMsTUFBa0I7SUFDOUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDckQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEEgdGFibGUgdGlsZSdzIGxheW91dHM6IHRoZSBvbmUgaXRzIGNvbmZpZyBhdXRob3JzLCBhbmQgdGhlIGNhbm9uaWNhbCBrZXlcbi8vIHR3byBsYXlvdXRzIGFyZSBjb21wYXJlZCBieS5cbmltcG9ydCB7IEdyaWRMYXlvdXQsIGNhbm9uaWNhbEdyaWRMYXlvdXQgfSBmcm9tICdAZmlyZXN0aXRjaC9ncmlkJztcblxuaW1wb3J0IHsgUmVwb3J0Q29tcG9uZW50IH0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuXG5cbmNvbnN0IE5PX0xBWU9VVDogR3JpZExheW91dCA9IHt9O1xuXG4vLyBUaGUgbGF5b3V0IGEgdGFibGUgdGlsZSdzIGNvbmZpZyBhdXRob3JzLCBvciBub25lLlxuZXhwb3J0IGZ1bmN0aW9uIGF1dGhvcmVkR3JpZExheW91dChjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IEdyaWRMYXlvdXQge1xuICByZXR1cm4gY29tcG9uZW50LmNvbmZpZz8ubGF5b3V0ID8/IE5PX0xBWU9VVDtcbn1cblxuLy8gQSBsYXlvdXQncyBjYW5vbmljYWwga2V5OiB0d28gbGF5b3V0cyB0aGF0IGRyYXcgdGhlIHNhbWUgdGFibGUgaGF2ZSB0aGVcbi8vIHNhbWUga2V5LCB3aGF0ZXZlciBvcmRlciBvciBkZWZhdWx0cyB0aGV5IHdlcmUgd3JpdHRlbiB3aXRoLlxuZXhwb3J0IGZ1bmN0aW9uIGdyaWRMYXlvdXRLZXkobGF5b3V0OiBHcmlkTGF5b3V0KTogc3RyaW5nIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGNhbm9uaWNhbEdyaWRMYXlvdXQobGF5b3V0KSk7XG59XG4iXX0=
22
+ // A viewer's layout moved onto the layout authored now, `base` being the key
23
+ // of the authored layout they started from: the new authored layout, with the
24
+ // viewer's own filters and sort (what `base` did not have) kept on the fields
25
+ // it still places. A field the viewer filters takes their filters in place of
26
+ // the authored ones, and a sort they changed replaces the authored sort.
27
+ export function rebasedGridLayout(session, base, authored) {
28
+ const started = JSON.parse(base);
29
+ const viewer = canonicalGridLayout(session);
30
+ const placed = new Set([
31
+ ...(authored.rows ?? []),
32
+ ...(authored.columns ?? []),
33
+ ...(authored.values ?? []),
34
+ ...(authored.details ?? []),
35
+ ].map((placement) => placement.field));
36
+ const startedFilters = new Set((started.filters ?? []).map((filter) => JSON.stringify(filter)));
37
+ const filters = (viewer.filters ?? [])
38
+ .filter((filter) => placed.has(filter.field) && !startedFilters.has(JSON.stringify(filter)));
39
+ const filtered = new Set(filters.map((filter) => filter.field));
40
+ const sorted = JSON.stringify(viewer.sort ?? []) !== JSON.stringify(started.sort ?? []);
41
+ const sort = (viewer.sort ?? []).filter((term) => placed.has(term.field));
42
+ return canonicalGridLayout({
43
+ ...authored,
44
+ filters: [...(authored.filters ?? []).filter((filter) => !filtered.has(filter.field)), ...filters],
45
+ sort: sorted && sort.length ? sort : authored.sort,
46
+ });
47
+ }
48
+ // A table's layout once the grain `field` reads at moves to `granularity` (the
49
+ // report's group-by changed): its column filter on `field` converts to the
50
+ // same days at the new grain when its edges line up, and is taken out
51
+ // otherwise (convertDateFilter), so the read never sends a filter the field no
52
+ // longer offers. `cleared` names the filter taken out and the grain the table
53
+ // now groups by, as fs-grid's status line reads it. A layout with no filter on
54
+ // the field, or one already at the grain, comes back as it is.
55
+ export function grainedGridLayout(layout, field, granularity) {
56
+ const grain = GRID_GRANULARITIES[granularity];
57
+ const filter = (layout.filters ?? []).find((item) => item.field === field);
58
+ if (!filter || (filter.granularity ?? GridGranularity.Day) === grain) {
59
+ return { layout, cleared: null };
60
+ }
61
+ const converted = convertDateFilter(filter, grain);
62
+ const filters = (layout.filters ?? [])
63
+ .map((item) => (item === filter ? converted : item))
64
+ .filter((item) => !!item);
65
+ return { layout: { ...layout, filters }, cleared: converted ? null : { field, granularity: grain } };
66
+ }
67
+ // The notes that leave a filter out of a read, by the filter's index (filters.N...)
68
+ const PRUNED_FILTER_CODES = new Set([
69
+ GridNoteCode.FieldMissing,
70
+ GridNoteCode.CannotFilter,
71
+ GridNoteCode.FilterRefused,
72
+ GridNoteCode.GranularityRefused,
73
+ ]);
74
+ // The notes that leave a sort term out of a read, by the term's index (sort.N...)
75
+ const PRUNED_SORT_CODES = new Set([
76
+ GridNoteCode.FieldMissing,
77
+ GridNoteCode.SortRefused,
78
+ ]);
79
+ // A viewer's layout of a table once its first read is in: the filters and sort
80
+ // terms that read refused (a field the query no longer has, a filter or grain
81
+ // the field no longer takes) are taken out, so the stored session layout holds
82
+ // only what applies. When the author turned filtering off (`filter`, the
83
+ // tile's controls.filter), the viewer's filters give way to the authored ones
84
+ // (`authored`), which a viewer cannot change. The layout comes back as it is
85
+ // when nothing changes.
86
+ export function prunedGridLayout(layout, notes, filter, authored = []) {
87
+ const filters = layout.filters ?? [];
88
+ const sort = layout.sort ?? [];
89
+ const filterIndexes = notedIndexes(notes, 'filters', PRUNED_FILTER_CODES);
90
+ const sortIndexes = notedIndexes(notes, 'sort', PRUNED_SORT_CODES);
91
+ const canFilter = (filter ?? GridControlState.Enabled) === GridControlState.Enabled;
92
+ const keptFilters = canFilter ? filters.filter((_item, index) => !filterIndexes.has(index)) : [...authored];
93
+ const keptSort = sort.filter((_term, index) => !sortIndexes.has(index));
94
+ const isFiltersKept = JSON.stringify(keptFilters) === JSON.stringify(filters);
95
+ return isFiltersKept && keptSort.length === sort.length
96
+ ? layout
97
+ : { ...layout, filters: keptFilters, sort: keptSort };
98
+ }
99
+ // The indexes under `key` (key.N or key.N.part) the notes of `codes` name
100
+ function notedIndexes(notes, key, codes) {
101
+ const pattern = new RegExp(`^${key}\\.(\\d+)(\\.|$)`);
102
+ return new Set(notes
103
+ .filter((note) => codes.has(note.code))
104
+ .map((note) => pattern.exec(note.path ?? ''))
105
+ .filter((match) => !!match)
106
+ .map((match) => Number(match[1])));
107
+ }
108
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LWdyaWQtbGF5b3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FwcC9yZXBvcnRzL3JlcG9ydC1ncmlkLWxheW91dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0RUFBNEU7QUFDNUUsZ0ZBQWdGO0FBQ2hGLE9BQU8sRUFDYyxnQkFBZ0IsRUFBYyxlQUFlLEVBQXdCLFlBQVksRUFDcEcsbUJBQW1CLEVBQUUsaUJBQWlCLEdBQ3ZDLE1BQU0sa0JBQWtCLENBQUM7QUFLMUIsTUFBTSxTQUFTLEdBQWUsRUFBRSxDQUFDO0FBRWpDLG1EQUFtRDtBQUNuRCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBOEM7SUFDM0UsR0FBRyxFQUFFLGVBQWUsQ0FBQyxHQUFHO0lBQ3hCLElBQUksRUFBRSxlQUFlLENBQUMsSUFBSTtJQUMxQixLQUFLLEVBQUUsZUFBZSxDQUFDLEtBQUs7SUFDNUIsT0FBTyxFQUFFLGVBQWUsQ0FBQyxPQUFPO0lBQ2hDLElBQUksRUFBRSxlQUFlLENBQUMsSUFBSTtDQUMzQixDQUFDO0FBRUYscURBQXFEO0FBQ3JELE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxTQUEwQjtJQUMzRCxPQUFPLFNBQVMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxJQUFJLFNBQVMsQ0FBQztBQUMvQyxDQUFDO0FBRUQsMEVBQTBFO0FBQzFFLCtEQUErRDtBQUMvRCxNQUFNLFVBQVUsYUFBYSxDQUFDLE1BQWtCO0lBQzlDLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQ3JELENBQUM7QUFFRCw2RUFBNkU7QUFDN0UsOEVBQThFO0FBQzlFLDhFQUE4RTtBQUM5RSw4RUFBOEU7QUFDOUUseUVBQXlFO0FBQ3pFLE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxPQUFtQixFQUFFLElBQVksRUFBRSxRQUFvQjtJQUN2RixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FB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O1FBQ1IsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUM7QUFDMUQsQ0FBQztBQUVELDBFQUEwRTtBQUMxRSxTQUFTLFlBQVksQ0FBQyxLQUEwQixFQUFFLEdBQVcsRUFBRSxLQUFnQztJQUM3RixNQUFNLE9BQU8sR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEdBQUcsa0JBQWtCLENBQUMsQ0FBQztJQUV0RCxPQUFPLElBQUksR0FBRyxDQUFDLEtBQUs7U0FDakIsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN0QyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztTQUM1QyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQTRCLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQ3BELEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQSB0YWJsZSB0aWxlJ3MgbGF5b3V0czogdGhlIG9uZSBpdHMgY29uZmlnIGF1dGhvcnMsIHRoZSBjYW5vbmljYWwga2V5IHR3b1xuLy8gbGF5b3V0cyBhcmUgY29tcGFyZWQgYnksIGFuZCBhIHZpZXdlcidzIGxheW91dCBtb3ZlZCBvbnRvIGEgbmV3IGF1dGhvcmVkIG9uZS5cbmltcG9ydCB7XG4gIEdyaWRDbGVhcmVkRmlsdGVyLCBHcmlkQ29udHJvbFN0YXRlLCBHcmlkRmlsdGVyLCBHcmlkR3JhbnVsYXJpdHksIEdyaWRMYXlvdXQsIEdyaWROb3RlLCBHcmlkTm90ZUNvZGUsXG4gIGNhbm9uaWNhbEdyaWRMYXlvdXQsIGNvbnZlcnREYXRlRmlsdGVyLFxufSBmcm9tICdAZmlyZXN0aXRjaC9ncmlkJztcblxuaW1wb3J0IHsgQ2hhcnRHcmFudWxhcml0eSwgUmVwb3J0Q29tcG9uZW50IH0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuXG5cbmNvbnN0IE5PX0xBWU9VVDogR3JpZExheW91dCA9IHt9O1xuXG4vLyBUaGUgcmVwb3J0J3MgZ3JhaW5zIGJ5IHRoZSBncmlkJ3MgbmFtZSBmb3IgZWFjaC5cbmV4cG9ydCBjb25zdCBHUklEX0dSQU5VTEFSSVRJRVM6IFJlY29yZDxDaGFydEdyYW51bGFyaXR5LCBHcmlkR3JhbnVsYXJpdHk+ID0ge1xuICBkYXk6IEdyaWRHcmFudWxhcml0eS5EYXksXG4gIHdlZWs6IEdyaWRHcmFudWxhcml0eS5XZWVrLFxuICBtb250aDogR3JpZEdyYW51bGFyaXR5Lk1vbnRoLFxuICBxdWFydGVyOiBHcmlkR3JhbnVsYXJpdHkuUXVhcnRlcixcbiAgeWVhcjogR3JpZEdyYW51bGFyaXR5LlllYXIsXG59O1xuXG4vLyBUaGUgbGF5b3V0IGEgdGFibGUgdGlsZSdzIGNvbmZpZyBhdXRob3JzLCBvciBub25lLlxuZXhwb3J0IGZ1bmN0aW9uIGF1dGhvcmVkR3JpZExheW91dChjb21wb25lbnQ6IFJlcG9ydENvbXBvbmVudCk6IEdyaWRMYXlvdXQge1xuICByZXR1cm4gY29tcG9uZW50LmNvbmZpZz8ubGF5b3V0ID8/IE5PX0xBWU9VVDtcbn1cblxuLy8gQSBsYXlvdXQncyBjYW5vbmljYWwga2V5OiB0d28gbGF5b3V0cyB0aGF0IGRyYXcgdGhlIHNhbWUgdGFibGUgaGF2ZSB0aGVcbi8vIHNhbWUga2V5LCB3aGF0ZXZlciBvcmRlciBvciBkZWZhdWx0cyB0aGV5IHdlcmUgd3JpdHRlbiB3aXRoLlxuZXhwb3J0IGZ1bmN0aW9uIGdyaWRMYXlvdXRLZXkobGF5b3V0OiBHcmlkTGF5b3V0KTogc3RyaW5nIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGNhbm9uaWNhbEdyaWRMYXlvdXQobGF5b3V0KSk7XG59XG5cbi8vIEEgdmlld2VyJ3MgbGF5b3V0IG1vdmVkIG9udG8gdGhlIGxheW91dCBhdXRob3JlZCBub3csIGBiYXNlYCBiZWluZyB0aGUga2V5XG4vLyBvZiB0aGUgYXV0aG9yZWQgbGF5b3V0IHRoZXkgc3RhcnRlZCBmcm9tOiB0aGUgbmV3IGF1dGhvcmVkIGxheW91dCwgd2l0aCB0aGVcbi8vIHZpZXdlcidzIG93biBmaWx0ZXJzIGFuZCBzb3J0ICh3aGF0IGBiYXNlYCBkaWQgbm90IGhhdmUpIGtlcHQgb24gdGhlIGZpZWxkc1xuLy8gaXQgc3RpbGwgcGxhY2VzLiBBIGZpZWxkIHRoZSB2aWV3ZXIgZmlsdGVycyB0YWtlcyB0aGVpciBmaWx0ZXJzIGluIHBsYWNlIG9mXG4vLyB0aGUgYXV0aG9yZWQgb25lcywgYW5kIGEgc29ydCB0aGV5IGNoYW5nZWQgcmVwbGFjZXMgdGhlIGF1dGhvcmVkIHNvcnQuXG5leHBvcnQgZnVuY3Rpb24gcmViYXNlZEdyaWRMYXlvdXQoc2Vzc2lvbjogR3JpZExheW91dCwgYmFzZTogc3RyaW5nLCBhdXRob3JlZDogR3JpZExheW91dCk6IEdyaWRMYXlvdXQge1xuICBjb25zdCBzdGFydGVkID0gSlNPTi5wYXJzZShiYXNlKSBhcyBHcmlkTGF5b3V0O1xuICBjb25zdCB2aWV3ZXIgPSBjYW5vbmljYWxHcmlkTGF5b3V0KHNlc3Npb24pO1xuICBjb25zdCBwbGFjZWQgPSBuZXcgU2V0KFtcbiAgICAuLi4oYXV0aG9yZWQucm93cyA/PyBbXSksXG4gICAgLi4uKGF1dGhvcmVkLmNvbHVtbnMgPz8gW10pLFxuICAgIC4uLihhdXRob3JlZC52YWx1ZXMgPz8gW10pLFxuICAgIC4uLihhdXRob3JlZC5kZXRhaWxzID8/IFtdKSxcbiAgXS5tYXAoKHBsYWNlbWVudCkgPT4gcGxhY2VtZW50LmZpZWxkKSk7XG4gIGNvbnN0IHN0YXJ0ZWRGaWx0ZXJzID0gbmV3IFNldCgoc3RhcnRlZC5maWx0ZXJzID8/IFtdKS5tYXAoKGZpbHRlcikgPT4gSlNPTi5zdHJpbmdpZnkoZmlsdGVyKSkpO1xuICBjb25zdCBmaWx0ZXJzID0gKHZpZXdlci5maWx0ZXJzID8/IFtdKVxuICAgIC5maWx0ZXIoKGZpbHRlcikgPT4gcGxhY2VkLmhhcyhmaWx0ZXIuZmllbGQpICYmICFzdGFydGVkRmlsdGVycy5oYXMoSlNPTi5zdHJpbmdpZnkoZmlsdGVyKSkpO1xuICBjb25zdCBmaWx0ZXJlZCA9IG5ldyBTZXQoZmlsdGVycy5tYXAoKGZpbHRlcikgPT4gZmlsdGVyLmZpZWxkKSk7XG4gIGNvbnN0IHNvcnRlZCA9IEpTT04uc3RyaW5naWZ5KHZpZXdlci5zb3J0ID8/IFtdKSAhPT0gSlNPTi5zdHJpbmdpZnkoc3RhcnRlZC5zb3J0ID8/IFtdKTtcbiAgY29uc3Qgc29ydCA9ICh2aWV3ZXIuc29ydCA/PyBbXSkuZmlsdGVyKCh0ZXJtKSA9PiBwbGFjZWQuaGFzKHRlcm0uZmllbGQpKTtcblxuICByZXR1cm4gY2Fub25pY2FsR3JpZExheW91dCh7XG4gICAgLi4uYXV0aG9yZWQsXG4gICAgZmlsdGVyczogWy4uLihhdXRob3JlZC5maWx0ZXJzID8/IFtdKS5maWx0ZXIoKGZpbHRlcikgPT4gIWZpbHRlcmVkLmhhcyhmaWx0ZXIuZmllbGQpKSwgLi4uZmlsdGVyc10sXG4gICAgc29ydDogc29ydGVkICYmIHNvcnQubGVuZ3RoID8gc29ydCA6IGF1dGhvcmVkLnNvcnQsXG4gIH0pO1xufVxuXG4vLyBBIHRhYmxlJ3MgbGF5b3V0IG9uY2UgdGhlIGdyYWluIGBmaWVsZGAgcmVhZHMgYXQgbW92ZXMgdG8gYGdyYW51bGFyaXR5YCAodGhlXG4vLyByZXBvcnQncyBncm91cC1ieSBjaGFuZ2VkKTogaXRzIGNvbHVtbiBmaWx0ZXIgb24gYGZpZWxkYCBjb252ZXJ0cyB0byB0aGVcbi8vIHNhbWUgZGF5cyBhdCB0aGUgbmV3IGdyYWluIHdoZW4gaXRzIGVkZ2VzIGxpbmUgdXAsIGFuZCBpcyB0YWtlbiBvdXRcbi8vIG90aGVyd2lzZSAoY29udmVydERhdGVGaWx0ZXIpLCBzbyB0aGUgcmVhZCBuZXZlciBzZW5kcyBhIGZpbHRlciB0aGUgZmllbGQgbm9cbi8vIGxvbmdlciBvZmZlcnMuIGBjbGVhcmVkYCBuYW1lcyB0aGUgZmlsdGVyIHRha2VuIG91dCBhbmQgdGhlIGdyYWluIHRoZSB0YWJsZVxuLy8gbm93IGdyb3VwcyBieSwgYXMgZnMtZ3JpZCdzIHN0YXR1cyBsaW5lIHJlYWRzIGl0LiBBIGxheW91dCB3aXRoIG5vIGZpbHRlciBvblxuLy8gdGhlIGZpZWxkLCBvciBvbmUgYWxyZWFkeSBhdCB0aGUgZ3JhaW4sIGNvbWVzIGJhY2sgYXMgaXQgaXMuXG5leHBvcnQgZnVuY3Rpb24gZ3JhaW5lZEdyaWRMYXlvdXQoXG4gIGxheW91dDogR3JpZExheW91dCxcbiAgZmllbGQ6IHN0cmluZyxcbiAgZ3JhbnVsYXJpdHk6IENoYXJ0R3JhbnVsYXJpdHksXG4pOiB7IGxheW91dDogR3JpZExheW91dDsgY2xlYXJlZDogR3JpZENsZWFyZWRGaWx0ZXIgfCBudWxsIH0ge1xuICBjb25zdCBncmFpbiA9IEdSSURfR1JBTlVMQVJJVElFU1tncmFudWxhcml0eV07XG4gIGNvbnN0IGZpbHRlciA9IChsYXlvdXQuZmlsdGVycyA/PyBbXSkuZmluZCgoaXRlbSkgPT4gaXRlbS5maWVsZCA9PT0gZmllbGQpO1xuICBpZiAoIWZpbHRlciB8fCAoZmlsdGVyLmdyYW51bGFyaXR5ID8/IEdyaWRHcmFudWxhcml0eS5EYXkpID09PSBncmFpbikge1xuICAgIHJldHVybiB7IGxheW91dCwgY2xlYXJlZDogbnVsbCB9O1xuICB9XG5cbiAgY29uc3QgY29udmVydGVkID0gY29udmVydERhdGVGaWx0ZXIoZmlsdGVyLCBncmFpbik7XG4gIGNvbnN0IGZpbHRlcnMgPSAobGF5b3V0LmZpbHRlcnMgPz8gW10pXG4gICAgLm1hcCgoaXRlbSkgPT4gKGl0ZW0gPT09IGZpbHRlciA/IGNvbnZlcnRlZCA6IGl0ZW0pKVxuICAgIC5maWx0ZXIoKGl0ZW0pOiBpdGVtIGlzIEdyaWRGaWx0ZXIgPT4gISFpdGVtKTtcblxuICByZXR1cm4geyBsYXlvdXQ6IHsgLi4ubGF5b3V0LCBmaWx0ZXJzIH0sIGNsZWFyZWQ6IGNvbnZlcnRlZCA/IG51bGwgOiB7IGZpZWxkLCBncmFudWxhcml0eTogZ3JhaW4gfSB9O1xufVxuXG4vLyBUaGUgbm90ZXMgdGhhdCBsZWF2ZSBhIGZpbHRlciBvdXQgb2YgYSByZWFkLCBieSB0aGUgZmlsdGVyJ3MgaW5kZXggKGZpbHRlcnMuTi4uLilcbmNvbnN0IFBSVU5FRF9GSUxURVJfQ09ERVM6IFJlYWRvbmx5U2V0PEdyaWROb3RlQ29kZT4gPSBuZXcgU2V0KFtcbiAgR3JpZE5vdGVDb2RlLkZpZWxkTWlzc2luZyxcbiAgR3JpZE5vdGVDb2RlLkNhbm5vdEZpbHRlcixcbiAgR3JpZE5vdGVDb2RlLkZpbHRlclJlZnVzZWQsXG4gIEdyaWROb3RlQ29kZS5HcmFudWxhcml0eVJlZnVzZWQsXG5dKTtcblxuLy8gVGhlIG5vdGVzIHRoYXQgbGVhdmUgYSBzb3J0IHRlcm0gb3V0IG9mIGEgcmVhZCwgYnkgdGhlIHRlcm0ncyBpbmRleCAoc29ydC5OLi4uKVxuY29uc3QgUFJVTkVEX1NPUlRfQ09ERVM6IFJlYWRvbmx5U2V0PEdyaWROb3RlQ29kZT4gPSBuZXcgU2V0KFtcbiAgR3JpZE5vdGVDb2RlLkZpZWxkTWlzc2luZyxcbiAgR3JpZE5vdGVDb2RlLlNvcnRSZWZ1c2VkLFxuXSk7XG5cbi8vIEEgdmlld2VyJ3MgbGF5b3V0IG9mIGEgdGFibGUgb25jZSBpdHMgZmlyc3QgcmVhZCBpcyBpbjogdGhlIGZpbHRlcnMgYW5kIHNvcnRcbi8vIHRlcm1zIHRoYXQgcmVhZCByZWZ1c2VkIChhIGZpZWxkIHRoZSBxdWVyeSBubyBsb25nZXIgaGFzLCBhIGZpbHRlciBvciBncmFpblxuLy8gdGhlIGZpZWxkIG5vIGxvbmdlciB0YWtlcykgYXJlIHRha2VuIG91dCwgc28gdGhlIHN0b3JlZCBzZXNzaW9uIGxheW91dCBob2xkc1xuLy8gb25seSB3aGF0IGFwcGxpZXMuIFdoZW4gdGhlIGF1dGhvciB0dXJuZWQgZmlsdGVyaW5nIG9mZiAoYGZpbHRlcmAsIHRoZVxuLy8gdGlsZSdzIGNvbnRyb2xzLmZpbHRlciksIHRoZSB2aWV3ZXIncyBmaWx0ZXJzIGdpdmUgd2F5IHRvIHRoZSBhdXRob3JlZCBvbmVzXG4vLyAoYGF1dGhvcmVkYCksIHdoaWNoIGEgdmlld2VyIGNhbm5vdCBjaGFuZ2UuIFRoZSBsYXlvdXQgY29tZXMgYmFjayBhcyBpdCBpc1xuLy8gd2hlbiBub3RoaW5nIGNoYW5nZXMuXG5leHBvcnQgZnVuY3Rpb24gcHJ1bmVkR3JpZExheW91dChcbiAgbGF5b3V0OiBHcmlkTGF5b3V0LFxuICBub3RlczogcmVhZG9ubHkgR3JpZE5vdGVbXSxcbiAgZmlsdGVyPzogR3JpZENvbnRyb2xTdGF0ZSxcbiAgYXV0aG9yZWQ6IHJlYWRvbmx5IEdyaWRGaWx0ZXJbXSA9IFtdLFxuKTogR3JpZExheW91dCB7XG4gIGNvbnN0IGZpbHRlcnMgPSBsYXlvdXQuZmlsdGVycyA/PyBbXTtcbiAgY29uc3Qgc29ydCA9IGxheW91dC5zb3J0ID8/IFtdO1xuICBjb25zdCBmaWx0ZXJJbmRleGVzID0gbm90ZWRJbmRleGVzKG5vdGVzLCAnZmlsdGVycycsIFBSVU5FRF9GSUxURVJfQ09ERVMpO1xuICBjb25zdCBzb3J0SW5kZXhlcyA9IG5vdGVkSW5kZXhlcyhub3RlcywgJ3NvcnQnLCBQUlVORURfU09SVF9DT0RFUyk7XG4gIGNvbnN0IGNhbkZpbHRlciA9IChmaWx0ZXIgPz8gR3JpZENvbnRyb2xTdGF0ZS5FbmFibGVkKSA9PT0gR3JpZENvbnRyb2xTdGF0ZS5FbmFibGVkO1xuICBjb25zdCBrZXB0RmlsdGVycyA9IGNhbkZpbHRlciA/IGZpbHRlcnMuZmlsdGVyKChfaXRlbSwgaW5kZXgpID0+ICFmaWx0ZXJJbmRleGVzLmhhcyhpbmRleCkpIDogWy4uLmF1dGhvcmVkXTtcbiAgY29uc3Qga2VwdFNvcnQgPSBzb3J0LmZpbHRlcigoX3Rlcm0sIGluZGV4KSA9PiAhc29ydEluZGV4ZXMuaGFzKGluZGV4KSk7XG4gIGNvbnN0IGlzRmlsdGVyc0tlcHQgPSBKU09OLnN0cmluZ2lmeShrZXB0RmlsdGVycykgPT09IEpTT04uc3RyaW5naWZ5KGZpbHRlcnMpO1xuXG4gIHJldHVybiBpc0ZpbHRlcnNLZXB0ICYmIGtlcHRTb3J0Lmxlbmd0aCA9PT0gc29ydC5sZW5ndGhcbiAgICA/IGxheW91dFxuICAgIDogeyAuLi5sYXlvdXQsIGZpbHRlcnM6IGtlcHRGaWx0ZXJzLCBzb3J0OiBrZXB0U29ydCB9O1xufVxuXG4vLyBUaGUgaW5kZXhlcyB1bmRlciBga2V5YCAoa2V5Lk4gb3Iga2V5Lk4ucGFydCkgdGhlIG5vdGVzIG9mIGBjb2Rlc2AgbmFtZVxuZnVuY3Rpb24gbm90ZWRJbmRleGVzKG5vdGVzOiByZWFkb25seSBHcmlkTm90ZVtdLCBrZXk6IHN0cmluZywgY29kZXM6IFJlYWRvbmx5U2V0PEdyaWROb3RlQ29kZT4pOiBSZWFkb25seVNldDxudW1iZXI+IHtcbiAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAoYF4ke2tleX1cXFxcLihcXFxcZCspKFxcXFwufCQpYCk7XG5cbiAgcmV0dXJuIG5ldyBTZXQobm90ZXNcbiAgICAuZmlsdGVyKChub3RlKSA9PiBjb2Rlcy5oYXMobm90ZS5jb2RlKSlcbiAgICAubWFwKChub3RlKSA9PiBwYXR0ZXJuLmV4ZWMobm90ZS5wYXRoID8/ICcnKSlcbiAgICAuZmlsdGVyKChtYXRjaCk6IG1hdGNoIGlzIFJlZ0V4cEV4ZWNBcnJheSA9PiAhIW1hdGNoKVxuICAgIC5tYXAoKG1hdGNoKSA9PiBOdW1iZXIobWF0Y2hbMV0pKSk7XG59XG4iXX0=
@@ -12,7 +12,8 @@
12
12
  // cascadingOptions narrows a select's list by the other filters of its tile
13
13
  // (ReportFilterOptionsService). drill is a time chart's click down, with
14
14
  // the tile header's breadcrumb and its menu's Drill up and Back to top as the
15
- // way back.
15
+ // way back. grid is a table tile drawn by fs-grid: a server that serves it
16
+ // sends a table only to a viewer that names it.
16
17
  export const VIEWER_FEATURES = [
17
18
  'scopeFilters',
18
19
  'excludeValues',
@@ -21,6 +22,7 @@ export const VIEWER_FEATURES = [
21
22
  'pageScope',
22
23
  'cascadingOptions',
23
24
  'drill',
25
+ 'grid',
24
26
  ];
25
27
  // The features a report offers on this screen: the ones its server serves
26
28
  // (Report.viewerFeatures) that this viewer also implements.
@@ -37,4 +39,4 @@ export function offersExclude(group, features) {
37
39
  && !group.multiColumn
38
40
  && (features ?? []).includes('excludeValues');
39
41
  }
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXZpZXdlci1mZWF0dXJlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9yZXBvcnQtdmlld2VyLWZlYXR1cmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLHdFQUF3RTtBQUN4RSwyRUFBMkU7QUFDM0UsK0VBQStFO0FBQy9FLCtFQUErRTtBQUMvRSw2RUFBNkU7QUFDN0UscUNBQXFDO0FBQ3JDLEVBQUU7QUFDRiwwRUFBMEU7QUFDMUUsMkVBQTJFO0FBQzNFLDJFQUEyRTtBQUMzRSxzRUFBc0U7QUFDdEUsNEVBQTRFO0FBQzVFLHlFQUF5RTtBQUN6RSw4RUFBOEU7QUFDOUUsWUFBWTtBQUNaLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBbUM7SUFDN0QsY0FBYztJQUNkLGVBQWU7SUFDZixhQUFhO0lBQ2IsVUFBVTtJQUNWLFdBQVc7SUFDWCxrQkFBa0I7SUFDbEIsT0FBTztDQUNSLENBQUM7QUFFRiwwRUFBMEU7QUFDMUUsNERBQTREO0FBQzVELE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxNQUF5RDtJQUM3RixPQUFPLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQy9FLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsMEVBQTBFO0FBQzFFLDJFQUEyRTtBQUMzRSwwRUFBMEU7QUFDMUUsZ0VBQWdFO0FBQ2hFLE1BQU0sVUFBVSxhQUFhLENBQzNCLEtBQXNELEVBQ3RELFFBQTJEO0lBRTNELE9BQU8sS0FBSyxDQUFDLElBQUksS0FBSyxRQUFRO1dBQ3pCLENBQUMsS0FBSyxDQUFDLFdBQVc7V0FDbEIsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQ2xELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXBvcnRWaWV3ZXJGZWF0dXJlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC12aWV3ZXItZmVhdHVyZS50eXBlJztcbmltcG9ydCB7IFJlcG9ydEZpbHRlckdyb3VwIH0gZnJvbSAnLi9pbnRlcmZhY2VzL3JlcG9ydC5pbnRlcmZhY2UnO1xuXG5cbi8vIFRoZSB2aWV3ZXIgZmVhdHVyZXMgdGhpcyB2aWV3ZXIgaW1wbGVtZW50czogdGhlIHJlcG9ydCBHRVQgbmFtZXMgdGhlbVxuLy8gKGZlYXR1cmVzPTxjb21tYSBsaXN0PiksIGFuZCB0aGUgc2VydmVyIGFzc2VtYmxlcyB0aGUgcmVwb3J0IGZvciBleGFjdGx5XG4vLyB0aGVzZS4gQSBmZWF0dXJlIGpvaW5zIHRoZSBsaXN0IGluIHRoZSBjaGFuZ2UgdGhhdCBidWlsZHMgaXRzIGNvbnRyb2wsIG5ldmVyXG4vLyBiZWZvcmU6IHRoZSBzZXJ2ZXIgc2VuZHMgYSBncm91cCBvbmx5IGluIGEgc2hhcGUgdGhlIHZpZXdlciBzYXlzIGl0IGNhbiBzaG93XG4vLyBhbmQgY2xlYXIsIGFuZCBhIGxpc3RlZCBmZWF0dXJlIHdpdGhvdXQgaXRzIGNvbnRyb2wgd291bGQgZ2V0IGEgZmlsdGVyIHRoZVxuLy8gdmlld2VyIGNhbiBuZWl0aGVyIHNob3cgbm9yIGNsZWFyLlxuLy9cbi8vIHNjb3BlRmlsdGVycyBuZWVkcyBubyBjb250cm9sIG9mIGl0cyBvd246IGEgc2NvcGUgbWVtYmVyIGlzIGFuIG9yZGluYXJ5XG4vLyBmaWx0ZXIgcm93IG9uIGl0cyB0aWxlLiBleGNsdWRlVmFsdWVzIGlzIGEgc2VsZWN0J3MgJ0V4Y2x1ZGUgdGhlc2UnIHJvdyxcbi8vIG51bWJlclJhbmdlIGl0cyBtaW4vbWF4IGNvbnRyb2wsIG1hdGNoQW55IHRoZSByZXBvcnQgYmFyJ3MgTWF0Y2ggc2VsZWN0LFxuLy8gYW5kIHBhZ2VTY29wZSBzaG93cyBhIHBhZ2UncyBncm91cHMgaW4gdGhlIHJlcG9ydCBiYXIgb2YgdGhhdCBwYWdlLlxuLy8gY2FzY2FkaW5nT3B0aW9ucyBuYXJyb3dzIGEgc2VsZWN0J3MgbGlzdCBieSB0aGUgb3RoZXIgZmlsdGVycyBvZiBpdHMgdGlsZVxuLy8gKFJlcG9ydEZpbHRlck9wdGlvbnNTZXJ2aWNlKS4gZHJpbGwgaXMgYSB0aW1lIGNoYXJ0J3MgY2xpY2sgZG93biwgd2l0aFxuLy8gdGhlIHRpbGUgaGVhZGVyJ3MgYnJlYWRjcnVtYiBhbmQgaXRzIG1lbnUncyBEcmlsbCB1cCBhbmQgQmFjayB0byB0b3AgYXMgdGhlXG4vLyB3YXkgYmFjay5cbmV4cG9ydCBjb25zdCBWSUVXRVJfRkVBVFVSRVM6IHJlYWRvbmx5IFJlcG9ydFZpZXdlckZlYXR1cmVbXSA9IFtcbiAgJ3Njb3BlRmlsdGVycycsXG4gICdleGNsdWRlVmFsdWVzJyxcbiAgJ251bWJlclJhbmdlJyxcbiAgJ21hdGNoQW55JyxcbiAgJ3BhZ2VTY29wZScsXG4gICdjYXNjYWRpbmdPcHRpb25zJyxcbiAgJ2RyaWxsJyxcbl07XG5cbi8vIFRoZSBmZWF0dXJlcyBhIHJlcG9ydCBvZmZlcnMgb24gdGhpcyBzY3JlZW46IHRoZSBvbmVzIGl0cyBzZXJ2ZXIgc2VydmVzXG4vLyAoUmVwb3J0LnZpZXdlckZlYXR1cmVzKSB0aGF0IHRoaXMgdmlld2VyIGFsc28gaW1wbGVtZW50cy5cbmV4cG9ydCBmdW5jdGlvbiBvZmZlcmVkVmlld2VyRmVhdHVyZXMoc2VydmVkOiByZWFkb25seSBSZXBvcnRWaWV3ZXJGZWF0dXJlW10gfCBudWxsIHwgdW5kZWZpbmVkKTogUmVwb3J0Vmlld2VyRmVhdHVyZVtdIHtcbiAgcmV0dXJuIChzZXJ2ZWQgPz8gW10pLmZpbHRlcigoZmVhdHVyZSkgPT4gVklFV0VSX0ZFQVRVUkVTLmluY2x1ZGVzKGZlYXR1cmUpKTtcbn1cblxuLy8gV2hldGhlciBhIHNlbGVjdCBncm91cCBvZmZlcnMgJ0V4Y2x1ZGUgdGhlc2UnOiB0aGUgb25lIHJ1bGUgdGhlIHJlcG9ydCBiYXIsXG4vLyB0aGUgdGlsZSBoZWFkZXJzIGFuZCB0aGUgcmVwb3J0IHNldHRpbmdzJyBkZWZhdWx0IHJvdyBzaGFyZS4gVGhlIHNlcnZlclxuLy8gbXVzdCBzZXJ2ZSBleGNsdWRlVmFsdWVzLCBhbmQgbm8gZW5hYmxlZCBtZW1iZXIgbWF5IGJpbmQgc2V2ZXJhbCBjb2x1bW5zXG4vLyAobXVsdGlDb2x1bW4pLCBzaW5jZSB0aGUgc2VydmVyIGNhbm5vdCBsZWF2ZSB2YWx1ZXMgb3V0IHRoZXJlIChhbiBvbGRlclxuLy8gc2VydmVyIHNlbmRzIG5vIG11bHRpQ29sdW1uLCBhbmQgdGhlIHRvZ2dsZSBzaG93cyBhcyBiZWZvcmUpLlxuZXhwb3J0IGZ1bmN0aW9uIG9mZmVyc0V4Y2x1ZGUoXG4gIGdyb3VwOiBQaWNrPFJlcG9ydEZpbHRlckdyb3VwLCAndHlwZScgfCAnbXVsdGlDb2x1bW4nPixcbiAgZmVhdHVyZXM6IHJlYWRvbmx5IFJlcG9ydFZpZXdlckZlYXR1cmVbXSB8IG51bGwgfCB1bmRlZmluZWQsXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGdyb3VwLnR5cGUgPT09ICdzZWxlY3QnXG4gICAgJiYgIWdyb3VwLm11bHRpQ29sdW1uXG4gICAgJiYgKGZlYXR1cmVzID8/IFtdKS5pbmNsdWRlcygnZXhjbHVkZVZhbHVlcycpO1xufVxuIl19
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwb3J0LXZpZXdlci1mZWF0dXJlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hcHAvcmVwb3J0cy9yZXBvcnQtdmlld2VyLWZlYXR1cmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUlBLHdFQUF3RTtBQUN4RSwyRUFBMkU7QUFDM0UsK0VBQStFO0FBQy9FLCtFQUErRTtBQUMvRSw2RUFBNkU7QUFDN0UscUNBQXFDO0FBQ3JDLEVBQUU7QUFDRiwwRUFBMEU7QUFDMUUsMkVBQTJFO0FBQzNFLDJFQUEyRTtBQUMzRSxzRUFBc0U7QUFDdEUsNEVBQTRFO0FBQzVFLHlFQUF5RTtBQUN6RSw4RUFBOEU7QUFDOUUsMkVBQTJFO0FBQzNFLGdEQUFnRDtBQUNoRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQW1DO0lBQzdELGNBQWM7SUFDZCxlQUFlO0lBQ2YsYUFBYTtJQUNiLFVBQVU7SUFDVixXQUFXO0lBQ1gsa0JBQWtCO0lBQ2xCLE9BQU87SUFDUCxNQUFNO0NBQ1AsQ0FBQztBQUVGLDBFQUEwRTtBQUMxRSw0REFBNEQ7QUFDNUQsTUFBTSxVQUFVLHFCQUFxQixDQUFDLE1BQXlEO0lBQzdGLE9BQU8sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDL0UsQ0FBQztBQUVELDhFQUE4RTtBQUM5RSwwRUFBMEU7QUFDMUUsMkVBQTJFO0FBQzNFLDBFQUEwRTtBQUMxRSxnRUFBZ0U7QUFDaEUsTUFBTSxVQUFVLGFBQWEsQ0FDM0IsS0FBc0QsRUFDdEQsUUFBMkQ7SUFFM0QsT0FBTyxLQUFLLENBQUMsSUFBSSxLQUFLLFFBQVE7V0FDekIsQ0FBQyxLQUFLLENBQUMsV0FBVztXQUNsQixDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUM7QUFDbEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlcG9ydFZpZXdlckZlYXR1cmUgfSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LXZpZXdlci1mZWF0dXJlLnR5cGUnO1xuaW1wb3J0IHsgUmVwb3J0RmlsdGVyR3JvdXAgfSBmcm9tICcuL2ludGVyZmFjZXMvcmVwb3J0LmludGVyZmFjZSc7XG5cblxuLy8gVGhlIHZpZXdlciBmZWF0dXJlcyB0aGlzIHZpZXdlciBpbXBsZW1lbnRzOiB0aGUgcmVwb3J0IEdFVCBuYW1lcyB0aGVtXG4vLyAoZmVhdHVyZXM9PGNvbW1hIGxpc3Q+KSwgYW5kIHRoZSBzZXJ2ZXIgYXNzZW1ibGVzIHRoZSByZXBvcnQgZm9yIGV4YWN0bHlcbi8vIHRoZXNlLiBBIGZlYXR1cmUgam9pbnMgdGhlIGxpc3QgaW4gdGhlIGNoYW5nZSB0aGF0IGJ1aWxkcyBpdHMgY29udHJvbCwgbmV2ZXJcbi8vIGJlZm9yZTogdGhlIHNlcnZlciBzZW5kcyBhIGdyb3VwIG9ubHkgaW4gYSBzaGFwZSB0aGUgdmlld2VyIHNheXMgaXQgY2FuIHNob3dcbi8vIGFuZCBjbGVhciwgYW5kIGEgbGlzdGVkIGZlYXR1cmUgd2l0aG91dCBpdHMgY29udHJvbCB3b3VsZCBnZXQgYSBmaWx0ZXIgdGhlXG4vLyB2aWV3ZXIgY2FuIG5laXRoZXIgc2hvdyBub3IgY2xlYXIuXG4vL1xuLy8gc2NvcGVGaWx0ZXJzIG5lZWRzIG5vIGNvbnRyb2wgb2YgaXRzIG93bjogYSBzY29wZSBtZW1iZXIgaXMgYW4gb3JkaW5hcnlcbi8vIGZpbHRlciByb3cgb24gaXRzIHRpbGUuIGV4Y2x1ZGVWYWx1ZXMgaXMgYSBzZWxlY3QncyAnRXhjbHVkZSB0aGVzZScgcm93LFxuLy8gbnVtYmVyUmFuZ2UgaXRzIG1pbi9tYXggY29udHJvbCwgbWF0Y2hBbnkgdGhlIHJlcG9ydCBiYXIncyBNYXRjaCBzZWxlY3QsXG4vLyBhbmQgcGFnZVNjb3BlIHNob3dzIGEgcGFnZSdzIGdyb3VwcyBpbiB0aGUgcmVwb3J0IGJhciBvZiB0aGF0IHBhZ2UuXG4vLyBjYXNjYWRpbmdPcHRpb25zIG5hcnJvd3MgYSBzZWxlY3QncyBsaXN0IGJ5IHRoZSBvdGhlciBmaWx0ZXJzIG9mIGl0cyB0aWxlXG4vLyAoUmVwb3J0RmlsdGVyT3B0aW9uc1NlcnZpY2UpLiBkcmlsbCBpcyBhIHRpbWUgY2hhcnQncyBjbGljayBkb3duLCB3aXRoXG4vLyB0aGUgdGlsZSBoZWFkZXIncyBicmVhZGNydW1iIGFuZCBpdHMgbWVudSdzIERyaWxsIHVwIGFuZCBCYWNrIHRvIHRvcCBhcyB0aGVcbi8vIHdheSBiYWNrLiBncmlkIGlzIGEgdGFibGUgdGlsZSBkcmF3biBieSBmcy1ncmlkOiBhIHNlcnZlciB0aGF0IHNlcnZlcyBpdFxuLy8gc2VuZHMgYSB0YWJsZSBvbmx5IHRvIGEgdmlld2VyIHRoYXQgbmFtZXMgaXQuXG5leHBvcnQgY29uc3QgVklFV0VSX0ZFQVRVUkVTOiByZWFkb25seSBSZXBvcnRWaWV3ZXJGZWF0dXJlW10gPSBbXG4gICdzY29wZUZpbHRlcnMnLFxuICAnZXhjbHVkZVZhbHVlcycsXG4gICdudW1iZXJSYW5nZScsXG4gICdtYXRjaEFueScsXG4gICdwYWdlU2NvcGUnLFxuICAnY2FzY2FkaW5nT3B0aW9ucycsXG4gICdkcmlsbCcsXG4gICdncmlkJyxcbl07XG5cbi8vIFRoZSBmZWF0dXJlcyBhIHJlcG9ydCBvZmZlcnMgb24gdGhpcyBzY3JlZW46IHRoZSBvbmVzIGl0cyBzZXJ2ZXIgc2VydmVzXG4vLyAoUmVwb3J0LnZpZXdlckZlYXR1cmVzKSB0aGF0IHRoaXMgdmlld2VyIGFsc28gaW1wbGVtZW50cy5cbmV4cG9ydCBmdW5jdGlvbiBvZmZlcmVkVmlld2VyRmVhdHVyZXMoc2VydmVkOiByZWFkb25seSBSZXBvcnRWaWV3ZXJGZWF0dXJlW10gfCBudWxsIHwgdW5kZWZpbmVkKTogUmVwb3J0Vmlld2VyRmVhdHVyZVtdIHtcbiAgcmV0dXJuIChzZXJ2ZWQgPz8gW10pLmZpbHRlcigoZmVhdHVyZSkgPT4gVklFV0VSX0ZFQVRVUkVTLmluY2x1ZGVzKGZlYXR1cmUpKTtcbn1cblxuLy8gV2hldGhlciBhIHNlbGVjdCBncm91cCBvZmZlcnMgJ0V4Y2x1ZGUgdGhlc2UnOiB0aGUgb25lIHJ1bGUgdGhlIHJlcG9ydCBiYXIsXG4vLyB0aGUgdGlsZSBoZWFkZXJzIGFuZCB0aGUgcmVwb3J0IHNldHRpbmdzJyBkZWZhdWx0IHJvdyBzaGFyZS4gVGhlIHNlcnZlclxuLy8gbXVzdCBzZXJ2ZSBleGNsdWRlVmFsdWVzLCBhbmQgbm8gZW5hYmxlZCBtZW1iZXIgbWF5IGJpbmQgc2V2ZXJhbCBjb2x1bW5zXG4vLyAobXVsdGlDb2x1bW4pLCBzaW5jZSB0aGUgc2VydmVyIGNhbm5vdCBsZWF2ZSB2YWx1ZXMgb3V0IHRoZXJlIChhbiBvbGRlclxuLy8gc2VydmVyIHNlbmRzIG5vIG11bHRpQ29sdW1uLCBhbmQgdGhlIHRvZ2dsZSBzaG93cyBhcyBiZWZvcmUpLlxuZXhwb3J0IGZ1bmN0aW9uIG9mZmVyc0V4Y2x1ZGUoXG4gIGdyb3VwOiBQaWNrPFJlcG9ydEZpbHRlckdyb3VwLCAndHlwZScgfCAnbXVsdGlDb2x1bW4nPixcbiAgZmVhdHVyZXM6IHJlYWRvbmx5IFJlcG9ydFZpZXdlckZlYXR1cmVbXSB8IG51bGwgfCB1bmRlZmluZWQsXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGdyb3VwLnR5cGUgPT09ICdzZWxlY3QnXG4gICAgJiYgIWdyb3VwLm11bHRpQ29sdW1uXG4gICAgJiYgKGZlYXR1cmVzID8/IFtdKS5pbmNsdWRlcygnZXhjbHVkZVZhbHVlcycpO1xufVxuIl19