@workflow/web-shared 5.0.0-beta.23 → 5.0.0-beta.25

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 (94) hide show
  1. package/README.md +2 -10
  2. package/dist/components/event-list-view.d.ts +30 -0
  3. package/dist/components/event-list-view.d.ts.map +1 -1
  4. package/dist/components/event-list-view.js +27 -12
  5. package/dist/components/index.d.ts +4 -3
  6. package/dist/components/index.d.ts.map +1 -1
  7. package/dist/components/index.js +3 -3
  8. package/dist/components/new-trace-viewer/components/copy-button.js +2 -2
  9. package/dist/components/new-trace-viewer/components/event-list.js +2 -2
  10. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +2 -2
  11. package/dist/components/new-trace-viewer/components/span-markers.js +3 -3
  12. package/dist/components/new-trace-viewer/components/split-pane.js +2 -2
  13. package/dist/components/new-trace-viewer/components/timeline.js +2 -2
  14. package/dist/components/new-trace-viewer/trace-viewer.js +4 -4
  15. package/dist/components/run-trace-view.d.ts +5 -7
  16. package/dist/components/run-trace-view.d.ts.map +1 -1
  17. package/dist/components/run-trace-view.js +3 -3
  18. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  19. package/dist/components/sidebar/attribute-panel.js +3 -5
  20. package/dist/components/sidebar/detail-card.js +2 -2
  21. package/dist/components/sidebar/entity-detail-panel.d.ts +6 -10
  22. package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
  23. package/dist/components/sidebar/entity-detail-panel.js +8 -60
  24. package/dist/components/sidebar/events-list.d.ts +3 -1
  25. package/dist/components/sidebar/events-list.d.ts.map +1 -1
  26. package/dist/components/sidebar/events-list.js +31 -9
  27. package/dist/components/sidebar/sidebar-data-context.d.ts +5 -6
  28. package/dist/components/sidebar/sidebar-data-context.d.ts.map +1 -1
  29. package/dist/components/sidebar/sidebar-data-context.js +1 -1
  30. package/dist/components/sidebar/span-detail-merge.d.ts +15 -0
  31. package/dist/components/sidebar/span-detail-merge.d.ts.map +1 -1
  32. package/dist/components/sidebar/span-detail-merge.js +40 -1
  33. package/dist/components/sidebar/use-selected-span-detail.d.ts +16 -0
  34. package/dist/components/sidebar/use-selected-span-detail.d.ts.map +1 -0
  35. package/dist/components/sidebar/use-selected-span-detail.js +93 -0
  36. package/dist/components/ui/alert.js +2 -2
  37. package/dist/components/ui/button.js +2 -2
  38. package/dist/components/ui/card.js +2 -2
  39. package/dist/components/ui/context-card.js +2 -2
  40. package/dist/components/ui/error-card.js +2 -2
  41. package/dist/components/ui/icon-button.js +2 -2
  42. package/dist/components/ui/kbd.js +2 -2
  43. package/dist/components/ui/skeleton.js +2 -2
  44. package/dist/components/ui/tooltip.js +2 -2
  45. package/dist/components/workflow-trace-view.d.ts +6 -7
  46. package/dist/components/workflow-trace-view.d.ts.map +1 -1
  47. package/dist/components/workflow-trace-view.js +3 -6
  48. package/dist/components/workflow-traces/trace-span-construction.d.ts +4 -1
  49. package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -1
  50. package/dist/components/workflow-traces/trace-span-construction.js +69 -29
  51. package/dist/lib/cn.d.ts +10 -0
  52. package/dist/lib/cn.d.ts.map +1 -0
  53. package/dist/lib/cn.js +83 -0
  54. package/dist/lib/event-materialization.d.ts.map +1 -1
  55. package/dist/lib/event-materialization.js +22 -15
  56. package/dist/lib/trace-builder.d.ts.map +1 -1
  57. package/dist/lib/trace-builder.js +3 -3
  58. package/dist/lib/utils.d.ts +0 -2
  59. package/dist/lib/utils.d.ts.map +1 -1
  60. package/dist/lib/utils.js +1 -6
  61. package/package.json +3 -3
  62. package/src/components/event-list-view.tsx +76 -13
  63. package/src/components/index.ts +10 -6
  64. package/src/components/new-trace-viewer/components/copy-button.tsx +1 -1
  65. package/src/components/new-trace-viewer/components/event-list.tsx +1 -1
  66. package/src/components/new-trace-viewer/components/middle-truncate/middle-truncate.tsx +1 -1
  67. package/src/components/new-trace-viewer/components/span-markers.tsx +2 -2
  68. package/src/components/new-trace-viewer/components/split-pane.tsx +1 -1
  69. package/src/components/new-trace-viewer/components/timeline.tsx +1 -1
  70. package/src/components/new-trace-viewer/trace-viewer.tsx +6 -6
  71. package/src/components/run-trace-view.tsx +10 -14
  72. package/src/components/sidebar/attribute-panel.tsx +2 -4
  73. package/src/components/sidebar/detail-card.tsx +1 -1
  74. package/src/components/sidebar/entity-detail-panel.tsx +23 -94
  75. package/src/components/sidebar/events-list.tsx +58 -8
  76. package/src/components/sidebar/sidebar-data-context.tsx +6 -7
  77. package/src/components/sidebar/span-detail-merge.ts +69 -0
  78. package/src/components/sidebar/use-selected-span-detail.ts +146 -0
  79. package/src/components/ui/alert.tsx +1 -1
  80. package/src/components/ui/button.tsx +1 -1
  81. package/src/components/ui/card.tsx +1 -1
  82. package/src/components/ui/context-card.tsx +1 -1
  83. package/src/components/ui/error-card.tsx +1 -1
  84. package/src/components/ui/icon-button.tsx +1 -1
  85. package/src/components/ui/kbd.tsx +1 -1
  86. package/src/components/ui/skeleton.tsx +1 -1
  87. package/src/components/ui/tooltip.tsx +1 -1
  88. package/src/components/workflow-trace-view.tsx +11 -21
  89. package/src/components/workflow-traces/trace-span-construction.test.ts +85 -0
  90. package/src/components/workflow-traces/trace-span-construction.ts +93 -29
  91. package/src/lib/cn.ts +93 -0
  92. package/src/lib/event-materialization.ts +22 -14
  93. package/src/lib/trace-builder.ts +2 -1
  94. package/src/lib/utils.ts +0 -6
@@ -5,7 +5,7 @@
5
5
  * converts each group into an OpenTelemetry-style Span, and returns
6
6
  * a fully-formed Trace ready for the trace viewer.
7
7
  */
8
- import { hookToSpan, runToSpan, stepToSpan, WORKFLOW_LIBRARY, waitToSpan, } from '../components/workflow-traces/trace-span-construction';
8
+ import { getEventTimestamp, hookToSpan, runToSpan, stepToSpan, WORKFLOW_LIBRARY, waitToSpan, } from '../components/workflow-traces/trace-span-construction';
9
9
  import { otelTimeToMs } from '../components/workflow-traces/trace-time-utils';
10
10
  // ---------------------------------------------------------------------------
11
11
  // Event type classifiers
@@ -86,7 +86,7 @@ export function groupEventsByCorrelation(events) {
86
86
  function computeLatestKnownTime(events, run) {
87
87
  let latest = new Date(run.createdAt).getTime();
88
88
  for (const event of events) {
89
- const t = new Date(event.createdAt).getTime();
89
+ const t = (getEventTimestamp(event) ?? new Date(event.createdAt)).getTime();
90
90
  if (t > latest)
91
91
  latest = t;
92
92
  }
@@ -152,4 +152,4 @@ export function buildTrace(run, events, now) {
152
152
  knownDurationMs: Math.max(0, knownDurationMs),
153
153
  };
154
154
  }
155
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2UtYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvdHJhY2UtYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFJSCxPQUFPLEVBQ0wsVUFBVSxFQUNWLFNBQVMsRUFDVCxVQUFVLEVBQ1YsZ0JBQWdCLEVBQ2hCLFVBQVUsR0FDWCxNQUFNLHVEQUF1RCxDQUFDO0FBQy9ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUU5RSw4RUFBOEU7QUFDOUUseUJBQXlCO0FBQ3pCLDhFQUE4RTtBQUU5RSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxTQUFpQixFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBRWhGLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLFNBQWlCLEVBQUUsRUFBRSxDQUNoRCxTQUFTLEtBQUssY0FBYyxJQUFJLFNBQVMsS0FBSyxnQkFBZ0IsQ0FBQztBQUVqRSxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLFNBQWlCLEVBQUUsRUFBRSxDQUN4RCxTQUFTLEtBQUssZUFBZTtJQUM3QixTQUFTLEtBQUssY0FBYztJQUM1QixTQUFTLEtBQUssZUFBZSxDQUFDO0FBRWhDOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxDQUFDLEtBQVksRUFBVyxFQUFFLENBQ3ZELENBQUMsS0FBSyxDQUFDLGFBQWE7SUFDcEIsQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDO1FBQzdCLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUN0QyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUVuQzs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FDakMsTUFBZSxF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LGVBQWUsQ0FDaEIsQ0FBQztJQUNGLE1BQU0sb0JBQW9CLEdBQUcsWUFBWSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUUxRCxpREFBaUQ7SUFDakQsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNyRCxNQUFNLGVBQWUsR0FBRyxlQUFlLENBQUMsT0FBTyxFQUFFLEdBQUcsWUFBWSxDQUFDO0lBRWpFLE9BQU87UUFDTCxPQUFPLEVBQUUsR0FBRyxDQUFDLEtBQUs7UUFDbEIsVUFBVSxFQUFFLEdBQUcsQ0FBQyxLQUFLO1FBQ3JCLEtBQUssRUFBRSxvQkFBb0I7UUFDM0IsU0FBUyxFQUFFO1lBQ1Q7Z0JBQ0UsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLFVBQVUsRUFBRTtvQkFDVixjQUFjLEVBQUUsZ0JBQWdCLENBQUMsSUFBSTtpQkFDdEM7YUFDRjtTQUNGO1FBQ0QsZUFBZSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLGVBQWUsQ0FBQztLQUM5QyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQnVpbGRzIGEgY29tcGxldGUgdHJhY2UgZnJvbSBhIFdvcmtmbG93UnVuIGFuZCBpdHMgRXZlbnRzLlxuICpcbiAqIFRoaXMgbW9kdWxlIGdyb3VwcyByYXcgZXZlbnRzIGJ5IGNvcnJlbGF0aW9uIElEIGFuZCBlbnRpdHkgdHlwZSxcbiAqIGNvbnZlcnRzIGVhY2ggZ3JvdXAgaW50byBhbiBPcGVuVGVsZW1ldHJ5LXN0eWxlIFNwYW4sIGFuZCByZXR1cm5zXG4gKiBhIGZ1bGx5LWZvcm1lZCBUcmFjZSByZWFkeSBmb3IgdGhlIHRyYWNlIHZpZXdlci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEV2ZW50LCBXb3JrZmxvd1J1biB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgdHlwZSB7IFNwYW4gfSBmcm9tICcuLi9jb21wb25lbnRzL3RyYWNlLXZpZXdlci90eXBlcyc7XG5pbXBvcnQge1xuICBob29rVG9TcGFuLFxuICBydW5Ub1NwYW4sXG4gIHN0ZXBUb1NwYW4sXG4gIFdPUktGTE9XX0xJQlJBUlksXG4gIHdhaXRUb1NwYW4sXG59IGZyb20gJy4uL2NvbXBvbmVudHMvd29ya2Zsb3ctdHJhY2VzL3RyYWNlLXNwYW4tY29uc3RydWN0aW9uJztcbmltcG9ydCB7IG90ZWxUaW1lVG9NcyB9IGZyb20gJy4uL2NvbXBvbmVudHMvd29ya2Zsb3ctdHJhY2VzL3RyYWNlLXRpbWUtdXRpbHMnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEV2ZW50IHR5cGUgY2xhc3NpZmllcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgY29uc3QgaXNTdGVwRXZlbnQgPSAoZXZlbnRUeXBlOiBzdHJpbmcpID0+IGV2ZW50VHlwZS5zdGFydHNXaXRoKCdzdGVwXycpO1xuXG5leHBvcnQgY29uc3QgaXNUaW1lckV2ZW50ID0gKGV2ZW50VHlwZTogc3RyaW5nKSA9PlxuICBldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnIHx8IGV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJztcblxuZXhwb3J0IGNvbnN0IGlzSG9va0xpZmVjeWNsZUV2ZW50ID0gKGV2ZW50VHlwZTogc3RyaW5nKSA9PlxuICBldmVudFR5cGUgPT09ICdob29rX3JlY2VpdmVkJyB8fFxuICBldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnIHx8XG4gIGV2ZW50VHlwZSA9PT0gJ2hvb2tfZGlzcG9zZWQnO1xuXG4vKipcbiAqIEV2ZW50cyB0aGF0IGJlbG9uZyB0byB0aGUgcnVuIHJvb3Qgc3BhbiByYXRoZXIgdGhhbiBhIGNoaWxkIGVudGl0eSBzcGFuLlxuICogTWlycm9ycyB0aGUgZmFsbHRocm91Z2ggbG9naWMgaW4ge0BsaW5rIGdyb3VwRXZlbnRzQnlDb3JyZWxhdGlvbn06IGV2ZW50c1xuICogd2l0aG91dCBhIGNvcnJlbGF0aW9uSWQgKHJ1biBsaWZlY3ljbGUpIHBsdXMgY29ycmVsYXRlZCBldmVudHMgdGhhdCBhcmVuJ3RcbiAqIHN0ZXAvdGltZXIvaG9vayBldmVudHMgKGUuZy4gYGF0dHJfc2V0YCwgd2hvc2UgY29ycmVsYXRpb25JZCBpcyBhIGRlZHVwXG4gKiB0b2tlbiByYXRoZXIgdGhhbiBhIGNoaWxkIGVudGl0eSBJRCkuXG4gKi9cbmV4cG9ydCBjb25zdCBpc1J1bkxldmVsRXZlbnQgPSAoZXZlbnQ6IEV2ZW50KTogYm9vbGVhbiA9PlxuICAhZXZlbnQuY29ycmVsYXRpb25JZCB8fFxuICAoIWlzVGltZXJFdmVudChldmVudC5ldmVudFR5cGUpICYmXG4gICAgIWlzSG9va0xpZmVjeWNsZUV2ZW50KGV2ZW50LmV2ZW50VHlwZSkgJiZcbiAgICAhaXNTdGVwRXZlbnQoZXZlbnQuZXZlbnRUeXBlKSk7XG5cbi8qKlxuICogRmlsdGVyIHRoZSByYXcgZXZlbnQgbGlzdCBkb3duIHRvIHRoZSBldmVudHMgZm9yIGEgc2VsZWN0ZWQgc3Bhbi5cbiAqIEZvciB0aGUgcnVuIHJvb3Qgc3BhbiB0aGlzIHJldHVybnMgcnVuLWxldmVsIGV2ZW50cyAoc2VlXG4gKiB7QGxpbmsgaXNSdW5MZXZlbEV2ZW50fSk7IGZvciBjaGlsZCBzcGFucyBpdCByZXR1cm5zIHRoZSBldmVudHNcbiAqIGNvcnJlbGF0ZWQgdG8gdGhhdCBzcGFuJ3MgSUQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJTcGFuUmF3RXZlbnRzKFxuICBldmVudHM6IEV2ZW50W10sXG4gIHJlc291cmNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHNwYW5JZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBFdmVudFtdIHtcbiAgaWYgKHJlc291cmNlID09PSAncnVuJykge1xuICAgIHJldHVybiBldmVudHMuZmlsdGVyKGlzUnVuTGV2ZWxFdmVudCk7XG4gIH1cbiAgaWYgKCFzcGFuSWQpIHJldHVybiBbXTtcbiAgcmV0dXJuIGV2ZW50cy5maWx0ZXIoKGUpID0+IGUuY29ycmVsYXRpb25JZCA9PT0gc3BhbklkKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFdmVudCBncm91cGluZ1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCB0eXBlIEdyb3VwZWRFdmVudHMgPSB7XG4gIGV2ZW50c0J5U3RlcElkOiBNYXA8c3RyaW5nLCBFdmVudFtdPjtcbiAgcnVuTGV2ZWxFdmVudHM6IEV2ZW50W107XG4gIHRpbWVyRXZlbnRzOiBNYXA8c3RyaW5nLCBFdmVudFtdPjtcbiAgaG9va0V2ZW50czogTWFwPHN0cmluZywgRXZlbnRbXT47XG59O1xuXG5mdW5jdGlvbiBwdXNoRXZlbnQoXG4gIG1hcDogTWFwPHN0cmluZywgRXZlbnRbXT4sXG4gIGNvcnJlbGF0aW9uSWQ6IHN0cmluZyxcbiAgZXZlbnQ6IEV2ZW50XG4pIHtcbiAgY29uc3QgZXhpc3RpbmcgPSBtYXAuZ2V0KGNvcnJlbGF0aW9uSWQpO1xuICBpZiAoZXhpc3RpbmcpIHtcbiAgICBleGlzdGluZy5wdXNoKGV2ZW50KTtcbiAgICByZXR1cm47XG4gIH1cbiAgbWFwLnNldChjb3JyZWxhdGlvbklkLCBbZXZlbnRdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwRXZlbnRzQnlDb3JyZWxhdGlvbihldmVudHM6IEV2ZW50W10pOiBHcm91cGVkRXZlbnRzIHtcbiAgY29uc3QgZXZlbnRzQnlTdGVwSWQgPSBuZXcgTWFwPHN0cmluZywgRXZlbnRbXT4oKTtcbiAgY29uc3QgcnVuTGV2ZWxFdmVudHM6IEV2ZW50W10gPSBbXTtcbiAgY29uc3QgdGltZXJFdmVudHMgPSBuZXcgTWFwPHN0cmluZywgRXZlbnRbXT4oKTtcbiAgY29uc3QgaG9va0V2ZW50cyA9IG5ldyBNYXA8c3RyaW5nLCBFdmVudFtdPigpO1xuXG4gIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9IGV2ZW50LmNvcnJlbGF0aW9uSWQ7XG4gICAgaWYgKCFjb3JyZWxhdGlvbklkKSB7XG4gICAgICBydW5MZXZlbEV2ZW50cy5wdXNoKGV2ZW50KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChpc1RpbWVyRXZlbnQoZXZlbnQuZXZlbnRUeXBlKSkge1xuICAgICAgcHVzaEV2ZW50KHRpbWVyRXZlbnRzLCBjb3JyZWxhdGlvbklkLCBldmVudCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNIb29rTGlmZWN5Y2xlRXZlbnQoZXZlbnQuZXZlbnRUeXBlKSkge1xuICAgICAgcHVzaEV2ZW50KGhvb2tFdmVudHMsIGNvcnJlbGF0aW9uSWQsIGV2ZW50KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChpc1N0ZXBFdmVudChldmVudC5ldmVudFR5cGUpKSB7XG4gICAgICBwdXNoRXZlbnQoZXZlbnRzQnlTdGVwSWQsIGNvcnJlbGF0aW9uSWQsIGV2ZW50KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJ1bkxldmVsRXZlbnRzLnB1c2goZXZlbnQpO1xuICB9XG5cbiAgcmV0dXJuIHsgZXZlbnRzQnlTdGVwSWQsIHJ1bkxldmVsRXZlbnRzLCB0aW1lckV2ZW50cywgaG9va0V2ZW50cyB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRyYWNlIGNvbnN0cnVjdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGxhdGVzdCBrbm93biBldmVudCB0aW1lIGZyb20gdGhlIGV2ZW50cyBsaXN0LlxuICogQWN0aXZlIChpbi1wcm9ncmVzcykgY2hpbGQgc3BhbnMgYXJlIGNhcHBlZCBhdCB0aGlzIHRpbWUgaW5zdGVhZCBvZiBgbm93YCxcbiAqIHNvIHRoZXkgb25seSBleHRlbmQgYXMgZmFyIGFzIG91ciBkYXRhIGdvZXMuXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVMYXRlc3RLbm93blRpbWUoZXZlbnRzOiBFdmVudFtdLCBydW46IFdvcmtmbG93UnVuKTogRGF0ZSB7XG4gIGxldCBsYXRlc3QgPSBuZXcgRGF0ZShydW4uY3JlYXRlZEF0KS5nZXRUaW1lKCk7XG4gIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgY29uc3QgdCA9IG5ldyBEYXRlKGV2ZW50LmNyZWF0ZWRBdCkuZ2V0VGltZSgpO1xuICAgIGlmICh0ID4gbGF0ZXN0KSBsYXRlc3QgPSB0O1xuICB9XG4gIHJldHVybiBuZXcgRGF0ZShsYXRlc3QpO1xufVxuXG5mdW5jdGlvbiBidWlsZFNwYW5zKFxuICBydW46IFdvcmtmbG93UnVuLFxuICBncm91cGVkRXZlbnRzOiBHcm91cGVkRXZlbnRzLFxuICBub3c6IERhdGUsXG4gIGxhdGVzdEtub3duVGltZTogRGF0ZVxuKSB7XG4gIC8vIEFjdGl2ZSBjaGlsZCBzcGFucyBjYXAgYXQgbGF0ZXN0S25vd25UaW1lIHNvIHRoZXkgZG9uJ3QgZXh0ZW5kIGludG9cbiAgLy8gdW5rbm93biB0ZXJyaXRvcnkuIEV2ZW4gd2hlbiB0aGUgcnVuIGlzIGNvbXBsZXRlZCwgd2UgbWF5IG5vdCBoYXZlIGxvYWRlZFxuICAvLyBhbGwgZXZlbnRzIHlldCwgc28gYWx3YXlzIHVzZSB0aGUgbGF0ZXN0IGV2ZW50IHdlJ3ZlIGFjdHVhbGx5IHNlZW4uXG4gIGNvbnN0IGNoaWxkTWF4RW5kID0gbGF0ZXN0S25vd25UaW1lO1xuICBjb25zdCBydW5NYXhFbmQgPSBydW4uY29tcGxldGVkQXQgPz8gbm93O1xuXG4gIGNvbnN0IHN0ZXBTcGFucyA9IEFycmF5LmZyb20oZ3JvdXBlZEV2ZW50cy5ldmVudHNCeVN0ZXBJZC52YWx1ZXMoKSlcbiAgICAubWFwKChldmVudHMpID0+IHN0ZXBUb1NwYW4oZXZlbnRzLCBjaGlsZE1heEVuZCkpXG4gICAgLmZpbHRlcigoc3Bhbik6IHNwYW4gaXMgU3BhbiA9PiBzcGFuICE9PSBudWxsKTtcblxuICBjb25zdCBob29rU3BhbnMgPSBBcnJheS5mcm9tKGdyb3VwZWRFdmVudHMuaG9va0V2ZW50cy52YWx1ZXMoKSlcbiAgICAubWFwKChldmVudHMpID0+IGhvb2tUb1NwYW4oZXZlbnRzLCBjaGlsZE1heEVuZCkpXG4gICAgLmZpbHRlcigoc3Bhbik6IHNwYW4gaXMgU3BhbiA9PiBzcGFuICE9PSBudWxsKTtcblxuICBjb25zdCB3YWl0U3BhbnMgPSBBcnJheS5mcm9tKGdyb3VwZWRFdmVudHMudGltZXJFdmVudHMudmFsdWVzKCkpXG4gICAgLm1hcCgoZXZlbnRzKSA9PiB3YWl0VG9TcGFuKGV2ZW50cywgY2hpbGRNYXhFbmQsIHJ1bk1heEVuZCkpXG4gICAgLmZpbHRlcigoc3Bhbik6IHNwYW4gaXMgU3BhbiA9PiBzcGFuICE9PSBudWxsKTtcblxuICByZXR1cm4ge1xuICAgIHJ1blNwYW46IHJ1blRvU3BhbihydW4sIGdyb3VwZWRFdmVudHMucnVuTGV2ZWxFdmVudHMsIG5vdyksXG4gICAgc3BhbnM6IFsuLi5zdGVwU3BhbnMsIC4uLmhvb2tTcGFucywgLi4ud2FpdFNwYW5zXSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY2FzY2FkZVNwYW5zKHJ1blNwYW46IFNwYW4sIHNwYW5zOiBTcGFuW10pIHtcbiAgY29uc3Qgc29ydGVkU3BhbnMgPSBbXG4gICAgcnVuU3BhbixcbiAgICAuLi5zcGFucy5zbGljZSgpLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGFTdGFydCA9IG90ZWxUaW1lVG9NcyhhLnN0YXJ0VGltZSk7XG4gICAgICBjb25zdCBiU3RhcnQgPSBvdGVsVGltZVRvTXMoYi5zdGFydFRpbWUpO1xuICAgICAgcmV0dXJuIGFTdGFydCAtIGJTdGFydDtcbiAgICB9KSxcbiAgXTtcblxuICByZXR1cm4gc29ydGVkU3BhbnMubWFwKChzcGFuLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHBhcmVudFNwYW5JZCA9XG4gICAgICBpbmRleCA9PT0gMCA/IHVuZGVmaW5lZCA6IFN0cmluZyhzb3J0ZWRTcGFuc1tpbmRleCAtIDFdLnNwYW5JZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnNwYW4sXG4gICAgICBwYXJlbnRTcGFuSWQsXG4gICAgfTtcbiAgfSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhY2VXaXRoTWV0YSB7XG4gIHRyYWNlSWQ6IHN0cmluZztcbiAgcm9vdFNwYW5JZDogc3RyaW5nO1xuICBzcGFuczogU3BhbltdO1xuICByZXNvdXJjZXM6IHsgbmFtZTogc3RyaW5nOyBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH1bXTtcbiAgLyoqIER1cmF0aW9uIGluIG1zIGZyb20gdHJhY2Ugc3RhcnQgdG8gdGhlIGxhdGVzdCBrbm93biBldmVudC4gKi9cbiAga25vd25EdXJhdGlvbk1zOiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFRyYWNlKFxuICBydW46IFdvcmtmbG93UnVuLFxuICBldmVudHM6IEV2ZW50W10sXG4gIG5vdzogRGF0ZVxuKTogVHJhY2VXaXRoTWV0YSB7XG4gIGNvbnN0IGdyb3VwZWRFdmVudHMgPSBncm91cEV2ZW50c0J5Q29ycmVsYXRpb24oZXZlbnRzKTtcbiAgY29uc3QgbGF0ZXN0S25vd25UaW1lID0gY29tcHV0ZUxhdGVzdEtub3duVGltZShldmVudHMsIHJ1bik7XG4gIGNvbnN0IHsgcnVuU3Bhbiwgc3BhbnMgfSA9IGJ1aWxkU3BhbnMoXG4gICAgcnVuLFxuICAgIGdyb3VwZWRFdmVudHMsXG4gICAgbm93LFxuICAgIGxhdGVzdEtub3duVGltZVxuICApO1xuICBjb25zdCBzb3J0ZWRDYXNjYWRpbmdTcGFucyA9IGNhc2NhZGVTcGFucyhydW5TcGFuLCBzcGFucyk7XG5cbiAgLy8gQ29tcHV0ZSBrbm93biBkdXJhdGlvbiByZWxhdGl2ZSB0byB0cmFjZSBzdGFydFxuICBjb25zdCB0cmFjZVN0YXJ0TXMgPSBvdGVsVGltZVRvTXMocnVuU3Bhbi5zdGFydFRpbWUpO1xuICBjb25zdCBrbm93bkR1cmF0aW9uTXMgPSBsYXRlc3RLbm93blRpbWUuZ2V0VGltZSgpIC0gdHJhY2VTdGFydE1zO1xuXG4gIHJldHVybiB7XG4gICAgdHJhY2VJZDogcnVuLnJ1bklkLFxuICAgIHJvb3RTcGFuSWQ6IHJ1bi5ydW5JZCxcbiAgICBzcGFuczogc29ydGVkQ2FzY2FkaW5nU3BhbnMsXG4gICAgcmVzb3VyY2VzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICd3b3JrZmxvdycsXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAnc2VydmljZS5uYW1lJzogV09SS0ZMT1dfTElCUkFSWS5uYW1lLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdLFxuICAgIGtub3duRHVyYXRpb25NczogTWF0aC5tYXgoMCwga25vd25EdXJhdGlvbk1zKSxcbiAgfTtcbn1cbiJdfQ==
155
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2UtYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvdHJhY2UtYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFJSCxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDVixTQUFTLEVBQ1QsVUFBVSxFQUNWLGdCQUFnQixFQUNoQixVQUFVLEdBQ1gsTUFBTSx1REFBdUQsQ0FBQztBQUMvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFFOUUsOEVBQThFO0FBQzlFLHlCQUF5QjtBQUN6Qiw4RUFBOEU7QUFFOUUsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsU0FBaUIsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUVoRixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxTQUFpQixFQUFFLEVBQUUsQ0FDaEQsU0FBUyxLQUFLLGNBQWMsSUFBSSxTQUFTLEtBQUssZ0JBQWdCLENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxTQUFpQixFQUFFLEVBQUUsQ0FDeEQsU0FBUyxLQUFLLGVBQWU7SUFDN0IsU0FBUyxLQUFLLGNBQWM7SUFDNUIsU0FBUyxLQUFLLGVBQWUsQ0FBQztBQUVoQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxLQUFZLEVBQVcsRUFBRSxDQUN2RCxDQUFDLEtBQUssQ0FBQyxhQUFhO0lBQ3BCLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUM3QixDQUFDLG9CQUFvQixDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDdEMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFFbkM7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1C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RUFBRSxHQUFHLFVBQVUsQ0FDbkMsR0FBRyxFQUNILGFBQWEsRUFDYixHQUFHLEVBQ0gsZUFBZSxDQUNoQixDQUFDO0lBQ0YsTUFBTSxvQkFBb0IsR0FBRyxZQUFZLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTFELGlEQUFpRDtJQUNqRCxNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sZUFBZSxHQUFHLGVBQWUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxZQUFZLENBQUM7SUFFakUsT0FBTztRQUNMLE9BQU8sRUFBRSxHQUFHLENBQUMsS0FBSztRQUNsQixVQUFVLEVBQUUsR0FBRyxDQUFDLEtBQUs7UUFDckIsS0FBSyxFQUFFLG9CQUFvQjtRQUMzQixTQUFTLEVBQUU7WUFDVDtnQkFDRSxJQUFJLEVBQUUsVUFBVTtnQkFDaEIsVUFBVSxFQUFFO29CQUNWLGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJO2lCQUN0QzthQUNGO1NBQ0Y7UUFDRCxlQUFlLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDO0tBQzlDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCdWlsZHMgYSBjb21wbGV0ZSB0cmFjZSBmcm9tIGEgV29ya2Zsb3dSdW4gYW5kIGl0cyBFdmVudHMuXG4gKlxuICogVGhpcyBtb2R1bGUgZ3JvdXBzIHJhdyBldmVudHMgYnkgY29ycmVsYXRpb24gSUQgYW5kIGVudGl0eSB0eXBlLFxuICogY29udmVydHMgZWFjaCBncm91cCBpbnRvIGFuIE9wZW5UZWxlbWV0cnktc3R5bGUgU3BhbiwgYW5kIHJldHVybnNcbiAqIGEgZnVsbHktZm9ybWVkIFRyYWNlIHJlYWR5IGZvciB0aGUgdHJhY2Ugdmlld2VyLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRXZlbnQsIFdvcmtmbG93UnVuIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCB0eXBlIHsgU3BhbiB9IGZyb20gJy4uL2NvbXBvbmVudHMvdHJhY2Utdmlld2VyL3R5cGVzJztcbmltcG9ydCB7XG4gIGdldEV2ZW50VGltZXN0YW1wLFxuICBob29rVG9TcGFuLFxuICBydW5Ub1NwYW4sXG4gIHN0ZXBUb1NwYW4sXG4gIFdPUktGTE9XX0xJQlJBUlksXG4gIHdhaXRUb1NwYW4sXG59IGZyb20gJy4uL2NvbXBvbmVudHMvd29ya2Zsb3ctdHJhY2VzL3RyYWNlLXNwYW4tY29uc3RydWN0aW9uJztcbmltcG9ydCB7IG90ZWxUaW1lVG9NcyB9IGZyb20gJy4uL2NvbXBvbmVudHMvd29ya2Zsb3ctdHJhY2VzL3RyYWNlLXRpbWUtdXRpbHMnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEV2ZW50IHR5cGUgY2xhc3NpZmllcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgY29uc3QgaXNTdGVwRXZlbnQgPSAoZXZlbnRUeXBlOiBzdHJpbmcpID0+IGV2ZW50VHlwZS5zdGFydHNXaXRoKCdzdGVwXycpO1xuXG5leHBvcnQgY29uc3QgaXNUaW1lckV2ZW50ID0gKGV2ZW50VHlwZTogc3RyaW5nKSA9PlxuICBldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnIHx8IGV2ZW50VHlwZSA9PT0gJ3dhaXRfY29tcGxldGVkJztcblxuZXhwb3J0IGNvbnN0IGlzSG9va0xpZmVjeWNsZUV2ZW50ID0gKGV2ZW50VHlwZTogc3RyaW5nKSA9PlxuICBldmVudFR5cGUgPT09ICdob29rX3JlY2VpdmVkJyB8fFxuICBldmVudFR5cGUgPT09ICdob29rX2NyZWF0ZWQnIHx8XG4gIGV2ZW50VHlwZSA9PT0gJ2hvb2tfZGlzcG9zZWQnO1xuXG4vKipcbiAqIEV2ZW50cyB0aGF0IGJlbG9uZyB0byB0aGUgcnVuIHJvb3Qgc3BhbiByYXRoZXIgdGhhbiBhIGNoaWxkIGVudGl0eSBzcGFuLlxuICogTWlycm9ycyB0aGUgZmFsbHRocm91Z2ggbG9naWMgaW4ge0BsaW5rIGdyb3VwRXZlbnRzQnlDb3JyZWxhdGlvbn06IGV2ZW50c1xuICogd2l0aG91dCBhIGNvcnJlbGF0aW9uSWQgKHJ1biBsaWZlY3ljbGUpIHBsdXMgY29ycmVsYXRlZCBldmVudHMgdGhhdCBhcmVuJ3RcbiAqIHN0ZXAvdGltZXIvaG9vayBldmVudHMgKGUuZy4gYGF0dHJfc2V0YCwgd2hvc2UgY29ycmVsYXRpb25JZCBpcyBhIGRlZHVwXG4gKiB0b2tlbiByYXRoZXIgdGhhbiBhIGNoaWxkIGVudGl0eSBJRCkuXG4gKi9cbmV4cG9ydCBjb25zdCBpc1J1bkxldmVsRXZlbnQgPSAoZXZlbnQ6IEV2ZW50KTogYm9vbGVhbiA9PlxuICAhZXZlbnQuY29ycmVsYXRpb25JZCB8fFxuICAoIWlzVGltZXJFdmVudChldmVudC5ldmVudFR5cGUpICYmXG4gICAgIWlzSG9va0xpZmVjeWNsZUV2ZW50KGV2ZW50LmV2ZW50VHlwZSkgJiZcbiAgICAhaXNTdGVwRXZlbnQoZXZlbnQuZXZlbnRUeXBlKSk7XG5cbi8qKlxuICogRmlsdGVyIHRoZSByYXcgZXZlbnQgbGlzdCBkb3duIHRvIHRoZSBldmVudHMgZm9yIGEgc2VsZWN0ZWQgc3Bhbi5cbiAqIEZvciB0aGUgcnVuIHJvb3Qgc3BhbiB0aGlzIHJldHVybnMgcnVuLWxldmVsIGV2ZW50cyAoc2VlXG4gKiB7QGxpbmsgaXNSdW5MZXZlbEV2ZW50fSk7IGZvciBjaGlsZCBzcGFucyBpdCByZXR1cm5zIHRoZSBldmVudHNcbiAqIGNvcnJlbGF0ZWQgdG8gdGhhdCBzcGFuJ3MgSUQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWx0ZXJTcGFuUmF3RXZlbnRzKFxuICBldmVudHM6IEV2ZW50W10sXG4gIHJlc291cmNlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHNwYW5JZDogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBFdmVudFtdIHtcbiAgaWYgKHJlc291cmNlID09PSAncnVuJykge1xuICAgIHJldHVybiBldmVudHMuZmlsdGVyKGlzUnVuTGV2ZWxFdmVudCk7XG4gIH1cbiAgaWYgKCFzcGFuSWQpIHJldHVybiBbXTtcbiAgcmV0dXJuIGV2ZW50cy5maWx0ZXIoKGUpID0+IGUuY29ycmVsYXRpb25JZCA9PT0gc3BhbklkKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFdmVudCBncm91cGluZ1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmV4cG9ydCB0eXBlIEdyb3VwZWRFdmVudHMgPSB7XG4gIGV2ZW50c0J5U3RlcElkOiBNYXA8c3RyaW5nLCBFdmVudFtdPjtcbiAgcnVuTGV2ZWxFdmVudHM6IEV2ZW50W107XG4gIHRpbWVyRXZlbnRzOiBNYXA8c3RyaW5nLCBFdmVudFtdPjtcbiAgaG9va0V2ZW50czogTWFwPHN0cmluZywgRXZlbnRbXT47XG59O1xuXG5mdW5jdGlvbiBwdXNoRXZlbnQoXG4gIG1hcDogTWFwPHN0cmluZywgRXZlbnRbXT4sXG4gIGNvcnJlbGF0aW9uSWQ6IHN0cmluZyxcbiAgZXZlbnQ6IEV2ZW50XG4pIHtcbiAgY29uc3QgZXhpc3RpbmcgPSBtYXAuZ2V0KGNvcnJlbGF0aW9uSWQpO1xuICBpZiAoZXhpc3RpbmcpIHtcbiAgICBleGlzdGluZy5wdXNoKGV2ZW50KTtcbiAgICByZXR1cm47XG4gIH1cbiAgbWFwLnNldChjb3JyZWxhdGlvbklkLCBbZXZlbnRdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdyb3VwRXZlbnRzQnlDb3JyZWxhdGlvbihldmVudHM6IEV2ZW50W10pOiBHcm91cGVkRXZlbnRzIHtcbiAgY29uc3QgZXZlbnRzQnlTdGVwSWQgPSBuZXcgTWFwPHN0cmluZywgRXZlbnRbXT4oKTtcbiAgY29uc3QgcnVuTGV2ZWxFdmVudHM6IEV2ZW50W10gPSBbXTtcbiAgY29uc3QgdGltZXJFdmVudHMgPSBuZXcgTWFwPHN0cmluZywgRXZlbnRbXT4oKTtcbiAgY29uc3QgaG9va0V2ZW50cyA9IG5ldyBNYXA8c3RyaW5nLCBFdmVudFtdPigpO1xuXG4gIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgY29uc3QgY29ycmVsYXRpb25JZCA9IGV2ZW50LmNvcnJlbGF0aW9uSWQ7XG4gICAgaWYgKCFjb3JyZWxhdGlvbklkKSB7XG4gICAgICBydW5MZXZlbEV2ZW50cy5wdXNoKGV2ZW50KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChpc1RpbWVyRXZlbnQoZXZlbnQuZXZlbnRUeXBlKSkge1xuICAgICAgcHVzaEV2ZW50KHRpbWVyRXZlbnRzLCBjb3JyZWxhdGlvbklkLCBldmVudCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNIb29rTGlmZWN5Y2xlRXZlbnQoZXZlbnQuZXZlbnRUeXBlKSkge1xuICAgICAgcHVzaEV2ZW50KGhvb2tFdmVudHMsIGNvcnJlbGF0aW9uSWQsIGV2ZW50KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChpc1N0ZXBFdmVudChldmVudC5ldmVudFR5cGUpKSB7XG4gICAgICBwdXNoRXZlbnQoZXZlbnRzQnlTdGVwSWQsIGNvcnJlbGF0aW9uSWQsIGV2ZW50KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHJ1bkxldmVsRXZlbnRzLnB1c2goZXZlbnQpO1xuICB9XG5cbiAgcmV0dXJuIHsgZXZlbnRzQnlTdGVwSWQsIHJ1bkxldmVsRXZlbnRzLCB0aW1lckV2ZW50cywgaG9va0V2ZW50cyB9O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFRyYWNlIGNvbnN0cnVjdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGxhdGVzdCBrbm93biBldmVudCB0aW1lIGZyb20gdGhlIGV2ZW50cyBsaXN0LlxuICogQWN0aXZlIChpbi1wcm9ncmVzcykgY2hpbGQgc3BhbnMgYXJlIGNhcHBlZCBhdCB0aGlzIHRpbWUgaW5zdGVhZCBvZiBgbm93YCxcbiAqIHNvIHRoZXkgb25seSBleHRlbmQgYXMgZmFyIGFzIG91ciBkYXRhIGdvZXMuXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVMYXRlc3RLbm93blRpbWUoZXZlbnRzOiBFdmVudFtdLCBydW46IFdvcmtmbG93UnVuKTogRGF0ZSB7XG4gIGxldCBsYXRlc3QgPSBuZXcgRGF0ZShydW4uY3JlYXRlZEF0KS5nZXRUaW1lKCk7XG4gIGZvciAoY29uc3QgZXZlbnQgb2YgZXZlbnRzKSB7XG4gICAgY29uc3QgdCA9IChnZXRFdmVudFRpbWVzdGFtcChldmVudCkgPz8gbmV3IERhdGUoZXZlbnQuY3JlYXRlZEF0KSkuZ2V0VGltZSgpO1xuICAgIGlmICh0ID4gbGF0ZXN0KSBsYXRlc3QgPSB0O1xuICB9XG4gIHJldHVybiBuZXcgRGF0ZShsYXRlc3QpO1xufVxuXG5mdW5jdGlvbiBidWlsZFNwYW5zKFxuICBydW46IFdvcmtmbG93UnVuLFxuICBncm91cGVkRXZlbnRzOiBHcm91cGVkRXZlbnRzLFxuICBub3c6IERhdGUsXG4gIGxhdGVzdEtub3duVGltZTogRGF0ZVxuKSB7XG4gIC8vIEFjdGl2ZSBjaGlsZCBzcGFucyBjYXAgYXQgbGF0ZXN0S25vd25UaW1lIHNvIHRoZXkgZG9uJ3QgZXh0ZW5kIGludG9cbiAgLy8gdW5rbm93biB0ZXJyaXRvcnkuIEV2ZW4gd2hlbiB0aGUgcnVuIGlzIGNvbXBsZXRlZCwgd2UgbWF5IG5vdCBoYXZlIGxvYWRlZFxuICAvLyBhbGwgZXZlbnRzIHlldCwgc28gYWx3YXlzIHVzZSB0aGUgbGF0ZXN0IGV2ZW50IHdlJ3ZlIGFjdHVhbGx5IHNlZW4uXG4gIGNvbnN0IGNoaWxkTWF4RW5kID0gbGF0ZXN0S25vd25UaW1lO1xuICBjb25zdCBydW5NYXhFbmQgPSBydW4uY29tcGxldGVkQXQgPz8gbm93O1xuXG4gIGNvbnN0IHN0ZXBTcGFucyA9IEFycmF5LmZyb20oZ3JvdXBlZEV2ZW50cy5ldmVudHNCeVN0ZXBJZC52YWx1ZXMoKSlcbiAgICAubWFwKChldmVudHMpID0+IHN0ZXBUb1NwYW4oZXZlbnRzLCBjaGlsZE1heEVuZCkpXG4gICAgLmZpbHRlcigoc3Bhbik6IHNwYW4gaXMgU3BhbiA9PiBzcGFuICE9PSBudWxsKTtcblxuICBjb25zdCBob29rU3BhbnMgPSBBcnJheS5mcm9tKGdyb3VwZWRFdmVudHMuaG9va0V2ZW50cy52YWx1ZXMoKSlcbiAgICAubWFwKChldmVudHMpID0+IGhvb2tUb1NwYW4oZXZlbnRzLCBjaGlsZE1heEVuZCkpXG4gICAgLmZpbHRlcigoc3Bhbik6IHNwYW4gaXMgU3BhbiA9PiBzcGFuICE9PSBudWxsKTtcblxuICBjb25zdCB3YWl0U3BhbnMgPSBBcnJheS5mcm9tKGdyb3VwZWRFdmVudHMudGltZXJFdmVudHMudmFsdWVzKCkpXG4gICAgLm1hcCgoZXZlbnRzKSA9PiB3YWl0VG9TcGFuKGV2ZW50cywgY2hpbGRNYXhFbmQsIHJ1bk1heEVuZCkpXG4gICAgLmZpbHRlcigoc3Bhbik6IHNwYW4gaXMgU3BhbiA9PiBzcGFuICE9PSBudWxsKTtcblxuICByZXR1cm4ge1xuICAgIHJ1blNwYW46IHJ1blRvU3BhbihydW4sIGdyb3VwZWRFdmVudHMucnVuTGV2ZWxFdmVudHMsIG5vdyksXG4gICAgc3BhbnM6IFsuLi5zdGVwU3BhbnMsIC4uLmhvb2tTcGFucywgLi4ud2FpdFNwYW5zXSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY2FzY2FkZVNwYW5zKHJ1blNwYW46IFNwYW4sIHNwYW5zOiBTcGFuW10pIHtcbiAgY29uc3Qgc29ydGVkU3BhbnMgPSBbXG4gICAgcnVuU3BhbixcbiAgICAuLi5zcGFucy5zbGljZSgpLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGFTdGFydCA9IG90ZWxUaW1lVG9NcyhhLnN0YXJ0VGltZSk7XG4gICAgICBjb25zdCBiU3RhcnQgPSBvdGVsVGltZVRvTXMoYi5zdGFydFRpbWUpO1xuICAgICAgcmV0dXJuIGFTdGFydCAtIGJTdGFydDtcbiAgICB9KSxcbiAgXTtcblxuICByZXR1cm4gc29ydGVkU3BhbnMubWFwKChzcGFuLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IHBhcmVudFNwYW5JZCA9XG4gICAgICBpbmRleCA9PT0gMCA/IHVuZGVmaW5lZCA6IFN0cmluZyhzb3J0ZWRTcGFuc1tpbmRleCAtIDFdLnNwYW5JZCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnNwYW4sXG4gICAgICBwYXJlbnRTcGFuSWQsXG4gICAgfTtcbiAgfSk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVHJhY2VXaXRoTWV0YSB7XG4gIHRyYWNlSWQ6IHN0cmluZztcbiAgcm9vdFNwYW5JZDogc3RyaW5nO1xuICBzcGFuczogU3BhbltdO1xuICByZXNvdXJjZXM6IHsgbmFtZTogc3RyaW5nOyBhdHRyaWJ1dGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH1bXTtcbiAgLyoqIER1cmF0aW9uIGluIG1zIGZyb20gdHJhY2Ugc3RhcnQgdG8gdGhlIGxhdGVzdCBrbm93biBldmVudC4gKi9cbiAga25vd25EdXJhdGlvbk1zOiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFRyYWNlKFxuICBydW46IFdvcmtmbG93UnVuLFxuICBldmVudHM6IEV2ZW50W10sXG4gIG5vdzogRGF0ZVxuKTogVHJhY2VXaXRoTWV0YSB7XG4gIGNvbnN0IGdyb3VwZWRFdmVudHMgPSBncm91cEV2ZW50c0J5Q29ycmVsYXRpb24oZXZlbnRzKTtcbiAgY29uc3QgbGF0ZXN0S25vd25UaW1lID0gY29tcHV0ZUxhdGVzdEtub3duVGltZShldmVudHMsIHJ1bik7XG4gIGNvbnN0IHsgcnVuU3Bhbiwgc3BhbnMgfSA9IGJ1aWxkU3BhbnMoXG4gICAgcnVuLFxuICAgIGdyb3VwZWRFdmVudHMsXG4gICAgbm93LFxuICAgIGxhdGVzdEtub3duVGltZVxuICApO1xuICBjb25zdCBzb3J0ZWRDYXNjYWRpbmdTcGFucyA9IGNhc2NhZGVTcGFucyhydW5TcGFuLCBzcGFucyk7XG5cbiAgLy8gQ29tcHV0ZSBrbm93biBkdXJhdGlvbiByZWxhdGl2ZSB0byB0cmFjZSBzdGFydFxuICBjb25zdCB0cmFjZVN0YXJ0TXMgPSBvdGVsVGltZVRvTXMocnVuU3Bhbi5zdGFydFRpbWUpO1xuICBjb25zdCBrbm93bkR1cmF0aW9uTXMgPSBsYXRlc3RLbm93blRpbWUuZ2V0VGltZSgpIC0gdHJhY2VTdGFydE1zO1xuXG4gIHJldHVybiB7XG4gICAgdHJhY2VJZDogcnVuLnJ1bklkLFxuICAgIHJvb3RTcGFuSWQ6IHJ1bi5ydW5JZCxcbiAgICBzcGFuczogc29ydGVkQ2FzY2FkaW5nU3BhbnMsXG4gICAgcmVzb3VyY2VzOiBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICd3b3JrZmxvdycsXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICAnc2VydmljZS5uYW1lJzogV09SS0ZMT1dfTElCUkFSWS5uYW1lLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICBdLFxuICAgIGtub3duRHVyYXRpb25NczogTWF0aC5tYXgoMCwga25vd25EdXJhdGlvbk1zKSxcbiAgfTtcbn1cbiJdfQ==
@@ -1,7 +1,5 @@
1
1
  import type { Step } from '@workflow/world';
2
2
  import type { ModelMessage } from 'ai';
3
- import { type ClassValue } from 'clsx';
4
- export declare function cn(...inputs: ClassValue[]): string;
5
3
  /**
6
4
  * Formats a duration in milliseconds to a human-readable string.
7
5
  *
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AACvC,OAAO,EAAE,KAAK,UAAU,EAAQ,MAAM,MAAM,CAAC;AAG7C,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,UAEzC;AAOD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,MAAM,CAgDlE;AAUD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAqCxD;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,GACf,MAAM,CAKR;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,OAAO,GAAG,YAAY,EAAE,GAAG,IAAI,CAmB7E;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,YAAY,EAAE,CAAC;CAC9B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAc/D"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAOvC;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,MAAM,CAgDlE;AAUD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAqCxD;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,GACf,MAAM,CAKR;AAMD;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAExD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,OAAO,GAAG,YAAY,EAAE,GAAG,IAAI,CAmB7E;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,YAAY,EAAE,CAAC;CAC9B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,UAAU,EAAE,CAc/D"}
package/dist/lib/utils.js CHANGED
@@ -1,8 +1,3 @@
1
- import { clsx } from 'clsx';
2
- import { twMerge } from 'tailwind-merge';
3
- export function cn(...inputs) {
4
- return twMerge(clsx(inputs));
5
- }
6
1
  const MS_IN_SECOND = 1000;
7
2
  const MS_IN_MINUTE = 60 * MS_IN_SECOND;
8
3
  const MS_IN_HOUR = 60 * MS_IN_MINUTE;
@@ -172,4 +167,4 @@ export function identifyStreamSteps(steps) {
172
167
  };
173
168
  });
174
169
  }
175
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBbUIsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6QyxNQUFNLFVBQVUsRUFBRSxDQUFDLEdBQUcsTUFBb0I7SUFDeEMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQztBQUMxQixNQUFNLFlBQVksR0FBRyxFQUFFLEdBQUcsWUFBWSxDQUFDO0FBQ3ZDLE1BQU0sVUFBVSxHQUFHLEVBQUUsR0FBRyxZQUFZLENBQUM7QUFDckMsTUFBTSxTQUFTLEdBQUcsRUFBRSxHQUFHLFVBQVUsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEVBQVUsRUFBRSxPQUFPLEdBQUcsS0FBSztJQUN4RCxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNiLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELElBQUksRUFBRSxHQUFHLFlBQVksRUFBRSxDQUFDO1FBQ3RCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakMsT0FBTyxTQUFTLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDNUQsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLFlBQVksQ0FBQyxHQUFHLFlBQVksQ0FBQztJQUUvRCxJQUFJLFNBQVMsR0FBRyxZQUFZLEVBQUUsQ0FBQztRQUM3QixPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQztJQUNwRCxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLElBQUksT0FBTyxFQUFFLENBQUM7UUFDWixJQUFJLFNBQVMsR0FBRyxVQUFVLEVBQUUsQ0FBQztZQUMzQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxZQUFZLENBQUMsQ0FBQztZQUMvQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDO1lBQ2hFLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7UUFDekMsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUM7UUFDOUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztJQUN6QyxDQUFDO0lBRUQsNERBQTREO0lBQzVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUM7SUFDL0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQztJQUNwRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDO0lBRXRFLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUUzQixJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNiLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLENBQUM7SUFDRCxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNkLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFDRCxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNoQixLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFFMUIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUFFRCwwRUFBMEU7QUFDMUUsMEVBQTBFO0FBQzFFLHFFQUFxRTtBQUNyRSxNQUFNLHVCQUF1QixHQUFHLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUU7SUFDL0QscUJBQXFCLEVBQUUsQ0FBQztJQUN4QixxQkFBcUIsRUFBRSxDQUFDO0NBQ3pCLENBQUMsQ0FBQztBQUVIOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxFQUFVO0lBQzlDLElBQUksRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2IsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsSUFBSSxFQUFFLEdBQUcsWUFBWSxFQUFFLENBQUM7UUFDdEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqQyxJQUFJLFNBQVMsR0FBRyxZQUFZLEVBQUUsQ0FBQztZQUM3QixPQUFPLEdBQUcsU0FBUyxJQUFJLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7SUFFOUMsSUFBSSxZQUFZLEdBQUcsWUFBWSxFQUFFLENBQUM7UUFDaEMsT0FBTyxHQUFHLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQztJQUMzRSxDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDLENBQUM7SUFDbEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQztJQUNsRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sT0FBTyxHQUFHLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQyxHQUFHLFlBQVksQ0FBQztJQUU3RCxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7SUFFM0IsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDYixLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBQ0QsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBQ0QsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDaEIsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRTFELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN6QixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUNsQyxXQUFtQixFQUNuQixVQUFrQixFQUNsQixPQUFnQjtJQUVoQixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ1osT0FBTyxRQUFRLFdBQVcsT0FBTyxVQUFVLEdBQUcsQ0FBQztJQUNqRCxDQUFDO0lBQ0QsT0FBTyxRQUFRLFdBQVcsT0FBTyxVQUFVLEVBQUUsQ0FBQztBQUNoRCxDQUFDO0FBRUQsK0VBQStFO0FBQy9FLDBCQUEwQjtBQUMxQiwrRUFBK0U7QUFFL0U7O0dBRUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLFFBQWdCO0lBQzdDLE9BQU8sUUFBUSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLFNBQWtCO0lBQ3BELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDeEQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTlCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDN0IsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsd0NBQXdDO0lBQ3hDLElBQ0UsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLE1BQU0sSUFBSSxHQUFHLENBQUMsRUFDekUsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE9BQU8sUUFBMEIsQ0FBQztBQUNwQyxDQUFDO0FBWUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsS0FBYTtJQUMvQyxPQUFPLEtBQUs7U0FDVCxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDL0MsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDWixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxTQUFTLENBQUM7UUFDbEUsTUFBTSxZQUFZLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUUzRCxPQUFPO1lBQ0wsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixXQUFXLEVBQUUsWUFBWTtZQUN6QixZQUFZO1NBQ2IsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3RlcCB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgdHlwZSB7IE1vZGVsTWVzc2FnZSB9IGZyb20gJ2FpJztcbmltcG9ydCB7IHR5cGUgQ2xhc3NWYWx1ZSwgY2xzeCB9IGZyb20gJ2Nsc3gnO1xuaW1wb3J0IHsgdHdNZXJnZSB9IGZyb20gJ3RhaWx3aW5kLW1lcmdlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNuKC4uLmlucHV0czogQ2xhc3NWYWx1ZVtdKSB7XG4gIHJldHVybiB0d01lcmdlKGNsc3goaW5wdXRzKSk7XG59XG5cbmNvbnN0IE1TX0lOX1NFQ09ORCA9IDEwMDA7XG5jb25zdCBNU19JTl9NSU5VVEUgPSA2MCAqIE1TX0lOX1NFQ09ORDtcbmNvbnN0IE1TX0lOX0hPVVIgPSA2MCAqIE1TX0lOX01JTlVURTtcbmNvbnN0IE1TX0lOX0RBWSA9IDI0ICogTVNfSU5fSE9VUjtcblxuLyoqXG4gKiBGb3JtYXRzIGEgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIHRvIGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nLlxuICpcbiAqIEBwYXJhbSBtcyAtIER1cmF0aW9uIGluIG1pbGxpc2Vjb25kc1xuICogQHBhcmFtIGNvbXBhY3QgLSBJZiB0cnVlLCByZXR1cm5zIGEgY29tcGFjdCBmb3JtYXQgKGUuZy4sIFwiMzgwbXNcIiwgXCIybSAzMHNcIikuXG4gKiAgICAgICAgICAgICAgICAgIElmIGZhbHNlIChkZWZhdWx0KSwgcmV0dXJucyBtdWx0aS1wYXJ0IGZvcm1hdCAoZS5nLiwgXCIxbSAxM3NcIiwgXCIyZCA1aCAzbSAxMnNcIikuXG4gKlxuICogQ29tcGFjdCBmb3JtYXQgKHRpbWVsaW5lIG1hcmtlcnMpOlxuICogLSA8IDFzOiBzaG93cyBtaWxsaXNlY29uZHMgKGUuZy4sIFwiMzgwbXNcIilcbiAqIC0gPCAxbTogc2hvd3Mgc2Vjb25kcyAoZS5nLiwgXCI0NXNcIilcbiAqIC0gPCAxaDogc2hvd3MgbWludXRlcyBhbmQgc2Vjb25kcyAoZS5nLiwgXCIybSAzMHNcIilcbiAqIC0gPj0gMWg6IHNob3dzIGhvdXJzIGFuZCBtaW51dGVzIChlLmcuLCBcIjJoIDMwbVwiKVxuICpcbiAqIEZ1bGwgZm9ybWF0OlxuICogLSA8IDFzOiBzaG93cyBtaWxsaXNlY29uZHMgKGUuZy4sIFwiMzgwbXNcIilcbiAqIC0gPCAxbTogc2hvd3Mgc2Vjb25kcyAoZS5nLiwgXCI0NXNcIilcbiAqIC0gPj0gMW06IHNob3dzIGRlY29tcG9zZWQgZm9ybWF0IHdpdGggd2hvbGUgc2Vjb25kcyAoZS5nLiwgXCIxbSAxM3NcIiwgXCIybSAxM3NcIilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdER1cmF0aW9uKG1zOiBudW1iZXIsIGNvbXBhY3QgPSBmYWxzZSk6IHN0cmluZyB7XG4gIGlmIChtcyA9PT0gMCkge1xuICAgIHJldHVybiAnMHMnO1xuICB9XG5cbiAgaWYgKG1zIDwgTVNfSU5fU0VDT05EKSB7XG4gICAgY29uc3Qgcm91bmRlZE1zID0gTWF0aC5yb3VuZChtcyk7XG4gICAgcmV0dXJuIHJvdW5kZWRNcyA8IE1TX0lOX1NFQ09ORCA/IGAke3JvdW5kZWRNc31tc2AgOiAnMXMnO1xuICB9XG5cbiAgY29uc3Qgcm91bmRlZE1zID0gTWF0aC5yb3VuZChtcyAvIE1TX0lOX1NFQ09ORCkgKiBNU19JTl9TRUNPTkQ7XG5cbiAgaWYgKHJvdW5kZWRNcyA8IE1TX0lOX01JTlVURSkge1xuICAgIHJldHVybiBgJHtNYXRoLmZsb29yKHJvdW5kZWRNcyAvIE1TX0lOX1NFQ09ORCl9c2A7XG4gIH1cblxuICAvLyBDb21wYWN0IGZvcm1hdDogbXVsdGktdW5pdCB3aXRob3V0IGRlY2ltYWxzIChlLmcuIFwiOG0gMjBzXCIsIFwiMmggMzBtXCIpXG4gIGlmIChjb21wYWN0KSB7XG4gICAgaWYgKHJvdW5kZWRNcyA8IE1TX0lOX0hPVVIpIHtcbiAgICAgIGNvbnN0IG0gPSBNYXRoLmZsb29yKHJvdW5kZWRNcyAvIE1TX0lOX01JTlVURSk7XG4gICAgICBjb25zdCBzID0gTWF0aC5mbG9vcigocm91bmRlZE1zICUgTVNfSU5fTUlOVVRFKSAvIE1TX0lOX1NFQ09ORCk7XG4gICAgICByZXR1cm4gcyA+IDAgPyBgJHttfW0gJHtzfXNgIDogYCR7bX1tYDtcbiAgICB9XG4gICAgY29uc3QgaCA9IE1hdGguZmxvb3Iocm91bmRlZE1zIC8gTVNfSU5fSE9VUik7XG4gICAgY29uc3QgbSA9IE1hdGguZmxvb3IoKHJvdW5kZWRNcyAlIE1TX0lOX0hPVVIpIC8gTVNfSU5fTUlOVVRFKTtcbiAgICByZXR1cm4gbSA+IDAgPyBgJHtofWggJHttfW1gIDogYCR7aH1oYDtcbiAgfVxuXG4gIC8vIEZ1bGwgZm9ybWF0OiBkZWNvbXBvc2UgaW50byBsYXJnZXIgdW5pdHMgKyB3aG9sZSBzZWNvbmRzLlxuICBjb25zdCBkYXlzID0gTWF0aC5mbG9vcihyb3VuZGVkTXMgLyBNU19JTl9EQVkpO1xuICBjb25zdCBob3VycyA9IE1hdGguZmxvb3IoKHJvdW5kZWRNcyAlIE1TX0lOX0RBWSkgLyBNU19JTl9IT1VSKTtcbiAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IoKHJvdW5kZWRNcyAlIE1TX0lOX0hPVVIpIC8gTVNfSU5fTUlOVVRFKTtcbiAgY29uc3Qgc2Vjb25kcyA9IE1hdGguZmxvb3IoKHJvdW5kZWRNcyAlIE1TX0lOX01JTlVURSkgLyBNU19JTl9TRUNPTkQpO1xuXG4gIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmIChkYXlzID4gMCkge1xuICAgIHBhcnRzLnB1c2goYCR7ZGF5c31kYCk7XG4gIH1cbiAgaWYgKGhvdXJzID4gMCkge1xuICAgIHBhcnRzLnB1c2goYCR7aG91cnN9aGApO1xuICB9XG4gIGlmIChtaW51dGVzID4gMCkge1xuICAgIHBhcnRzLnB1c2goYCR7bWludXRlc31tYCk7XG4gIH1cbiAgcGFydHMucHVzaChgJHtzZWNvbmRzfXNgKTtcblxuICByZXR1cm4gcGFydHMuam9pbignICcpO1xufVxuXG4vLyBMb2NhbGUtYXdhcmUgZm9ybWF0dGVyIHRoYXQgYWx3YXlzIHJlbmRlcnMgZXhhY3RseSB0d28gZnJhY3Rpb24gZGlnaXRzLlxuLy8gVXNlZCBmb3IgdGhlIHNlY29uZHMgY29tcG9uZW50IG9mIHByZWNpc2UgZHVyYXRpb25zIHNvIHZhbHVlcyBhcmUgbmV2ZXJcbi8vIHNuYXBwZWQgdG8gYSB3aG9sZSBzZWNvbmQgKGFuZCB0aG91c2FuZHMgc2VwYXJhdG9ycyBzdGF5IGNvcnJlY3QpLlxuY29uc3QgcHJlY2lzZVNlY29uZHNGb3JtYXR0ZXIgPSBuZXcgSW50bC5OdW1iZXJGb3JtYXQodW5kZWZpbmVkLCB7XG4gIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogMixcbiAgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiAyLFxufSk7XG5cbi8qKlxuICogRm9ybWF0cyBhIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcyB3aXRob3V0IHNuYXBwaW5nIHRvIHdob2xlIHNlY29uZHMuXG4gKlxuICogVW5saWtlIHtAbGluayBmb3JtYXREdXJhdGlvbn0sIHRoaXMgbmV2ZXIgcm91bmRzIGEgc3ViLW1pbnV0ZSB2YWx1ZSB1cCB0b1xuICogdGhlIG5leHQgd2hvbGUgc2Vjb25kIChlLmcuIDE2MjZtcyByZW5kZXJzIGFzIFwiMS42M3NcIiwgbm90IFwiMnNcIikuXG4gKlxuICogLSA8IDFzOiBzaG93cyB3aG9sZSBtaWxsaXNlY29uZHMgKGUuZy4gXCI2MjZtc1wiKVxuICogLSAxcyDigJMgMW06IHNob3dzIHNlY29uZHMgd2l0aCB0d28gZGVjaW1hbHMgKGUuZy4gXCIxLjYzc1wiLCBcIjQ1LjIwc1wiKVxuICogLSA+PSAxbTogZGVjb21wb3NlcyBpbnRvIGQvaC9tIHdpdGggdHdvLWRlY2ltYWwgc2Vjb25kcyAoZS5nLiBcIjFtIDEzLjQ1c1wiKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RHVyYXRpb25QcmVjaXNlKG1zOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAobXMgPT09IDApIHtcbiAgICByZXR1cm4gJzBzJztcbiAgfVxuXG4gIGlmIChtcyA8IE1TX0lOX1NFQ09ORCkge1xuICAgIGNvbnN0IHJvdW5kZWRNcyA9IE1hdGgucm91bmQobXMpO1xuICAgIGlmIChyb3VuZGVkTXMgPCBNU19JTl9TRUNPTkQpIHtcbiAgICAgIHJldHVybiBgJHtyb3VuZGVkTXN9bXNgO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG5vcm1hbGl6ZWRNcyA9IE1hdGgucm91bmQobXMgLyAxMCkgKiAxMDtcblxuICBpZiAobm9ybWFsaXplZE1zIDwgTVNfSU5fTUlOVVRFKSB7XG4gICAgcmV0dXJuIGAke3ByZWNpc2VTZWNvbmRzRm9ybWF0dGVyLmZvcm1hdChub3JtYWxpemVkTXMgLyBNU19JTl9TRUNPTkQpfXNgO1xuICB9XG5cbiAgY29uc3QgZGF5cyA9IE1hdGguZmxvb3Iobm9ybWFsaXplZE1zIC8gTVNfSU5fREFZKTtcbiAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKChub3JtYWxpemVkTXMgJSBNU19JTl9EQVkpIC8gTVNfSU5fSE9VUik7XG4gIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKChub3JtYWxpemVkTXMgJSBNU19JTl9IT1VSKSAvIE1TX0lOX01JTlVURSk7XG4gIGNvbnN0IHNlY29uZHMgPSAobm9ybWFsaXplZE1zICUgTVNfSU5fTUlOVVRFKSAvIE1TX0lOX1NFQ09ORDtcblxuICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcblxuICBpZiAoZGF5cyA+IDApIHtcbiAgICBwYXJ0cy5wdXNoKGAke2RheXN9ZGApO1xuICB9XG4gIGlmIChob3VycyA+IDApIHtcbiAgICBwYXJ0cy5wdXNoKGAke2hvdXJzfWhgKTtcbiAgfVxuICBpZiAobWludXRlcyA+IDApIHtcbiAgICBwYXJ0cy5wdXNoKGAke21pbnV0ZXN9bWApO1xuICB9XG4gIHBhcnRzLnB1c2goYCR7cHJlY2lzZVNlY29uZHNGb3JtYXR0ZXIuZm9ybWF0KHNlY29uZHMpfXNgKTtcblxuICByZXR1cm4gcGFydHMuam9pbignICcpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmb3JtYXR0ZWQgcGFnaW5hdGlvbiBkaXNwbGF5IHN0cmluZ1xuICogQHBhcmFtIGN1cnJlbnRQYWdlIC0gVGhlIGN1cnJlbnQgcGFnZSBudW1iZXJcbiAqIEBwYXJhbSB0b3RhbFBhZ2VzIC0gVGhlIHRvdGFsIG51bWJlciBvZiBwYWdlcyB2aXNpdGVkIHNvIGZhclxuICogQHBhcmFtIGhhc01vcmUgLSBXaGV0aGVyIHRoZXJlIGFyZSBtb3JlIHBhZ2VzIGF2YWlsYWJsZVxuICogQHJldHVybnMgRm9ybWF0dGVkIHN0cmluZyBsaWtlIFwiUGFnZSAxIG9mIDMrXCIgb3IgXCJQYWdlIDIgb2YgMlwiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWdpbmF0aW9uRGlzcGxheShcbiAgY3VycmVudFBhZ2U6IG51bWJlcixcbiAgdG90YWxQYWdlczogbnVtYmVyLFxuICBoYXNNb3JlOiBib29sZWFuXG4pOiBzdHJpbmcge1xuICBpZiAoaGFzTW9yZSkge1xuICAgIHJldHVybiBgUGFnZSAke2N1cnJlbnRQYWdlfSBvZiAke3RvdGFsUGFnZXN9K2A7XG4gIH1cbiAgcmV0dXJuIGBQYWdlICR7Y3VycmVudFBhZ2V9IG9mICR7dG90YWxQYWdlc31gO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBEdXJhYmxlIEFnZW50IFV0aWxpdGllc1xuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENoZWNrIGlmIGEgc3RlcCBpcyBhIGRvU3RyZWFtU3RlcCAoTExNIGNhbGwgd2l0aCBjb252ZXJzYXRpb24gaW5wdXQpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RvU3RyZWFtU3RlcChzdGVwTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBzdGVwTmFtZS5lbmRzV2l0aCgnLy9kb1N0cmVhbVN0ZXAnKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IHRoZSBjb252ZXJzYXRpb24gZnJvbSBhIGh5ZHJhdGVkIGRvU3RyZWFtU3RlcCBpbnB1dC5cbiAqIGRvU3RyZWFtU3RlcCBzaWduYXR1cmU6IChjb252ZXJzYXRpb25Qcm9tcHQsIG1vZGVsLCB3cml0YWJsZSwgdG9vbHMsIG9wdGlvbnMpXG4gKiBTbyBpbnB1dFswXSBpcyB0aGUgY29udmVyc2F0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdENvbnZlcnNhdGlvbihzdGVwSW5wdXQ6IHVua25vd24pOiBNb2RlbE1lc3NhZ2VbXSB8IG51bGwge1xuICBpZiAoIUFycmF5LmlzQXJyYXkoc3RlcElucHV0KSB8fCBzdGVwSW5wdXQubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBmaXJzdEFyZyA9IHN0ZXBJbnB1dFswXTtcblxuICBpZiAoIUFycmF5LmlzQXJyYXkoZmlyc3RBcmcpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBpdCBsb29rcyBsaWtlIE1vZGVsTWVzc2FnZVtdXG4gIGlmIChcbiAgICAhZmlyc3RBcmcuZXZlcnkoKG1zZykgPT4gbXNnICYmIHR5cGVvZiBtc2cgPT09ICdvYmplY3QnICYmICdyb2xlJyBpbiBtc2cpXG4gICkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGZpcnN0QXJnIGFzIE1vZGVsTWVzc2FnZVtdO1xufVxuXG4vKipcbiAqIEEgZG9TdHJlYW1TdGVwIHdpdGggaXRzIGNvbnZlcnNhdGlvbiBpbnB1dCBleHRyYWN0ZWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHJlYW1TdGVwIHtcbiAgc3RlcElkOiBzdHJpbmc7XG4gIHN0ZXBOYW1lOiBzdHJpbmc7XG4gIGRpc3BsYXlOYW1lOiBzdHJpbmc7XG4gIGNvbnZlcnNhdGlvbjogTW9kZWxNZXNzYWdlW107XG59XG5cbi8qKlxuICogSWRlbnRpZmllcyBhbGwgc3RyZWFtIHN0ZXBzIChkb1N0cmVhbVN0ZXApIGluIGEgcnVuIGFuZCBleHRyYWN0cyB0aGVpciBjb252ZXJzYXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpZnlTdHJlYW1TdGVwcyhzdGVwczogU3RlcFtdKTogU3RyZWFtU3RlcFtdIHtcbiAgcmV0dXJuIHN0ZXBzXG4gICAgLmZpbHRlcigoc3RlcCkgPT4gaXNEb1N0cmVhbVN0ZXAoc3RlcC5zdGVwTmFtZSkpXG4gICAgLm1hcCgoc3RlcCkgPT4ge1xuICAgICAgY29uc3QgZnVuY3Rpb25OYW1lID0gc3RlcC5zdGVwTmFtZS5zcGxpdCgnLy8nKS5wb3AoKSA/PyAndW5rbm93bic7XG4gICAgICBjb25zdCBjb252ZXJzYXRpb24gPSBleHRyYWN0Q29udmVyc2F0aW9uKHN0ZXAuaW5wdXQpID8/IFtdO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdGVwSWQ6IHN0ZXAuc3RlcElkLFxuICAgICAgICBzdGVwTmFtZTogc3RlcC5zdGVwTmFtZSxcbiAgICAgICAgZGlzcGxheU5hbWU6IGZ1bmN0aW9uTmFtZSxcbiAgICAgICAgY29udmVyc2F0aW9uLFxuICAgICAgfTtcbiAgICB9KTtcbn1cbiJdfQ==
170
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQztBQUMxQixNQUFNLFlBQVksR0FBRyxFQUFFLEdBQUcsWUFBWSxDQUFDO0FBQ3ZDLE1BQU0sVUFBVSxHQUFHLEVBQUUsR0FBRyxZQUFZLENBQUM7QUFDckMsTUFBTSxTQUFTLEdBQUcsRUFBRSxHQUFHLFVBQVUsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLEVBQVUsRUFBRSxPQUFPLEdBQUcsS0FBSztJQUN4RCxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNiLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELElBQUksRUFBRSxHQUFHLFlBQVksRUFBRSxDQUFDO1FBQ3RCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakMsT0FBTyxTQUFTLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDNUQsQ0FBQztJQUVELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLFlBQVksQ0FBQyxHQUFHLFlBQVksQ0FBQztJQUUvRCxJQUFJLFNBQVMsR0FBRyxZQUFZLEVBQUUsQ0FBQztRQUM3QixPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQztJQUNwRCxDQUFDO0lBRUQsd0VBQXdFO0lBQ3hFLElBQUksT0FBTyxFQUFFLENBQUM7UUFDWixJQUFJLFNBQVMsR0FBRyxVQUFVLEVBQUUsQ0FBQztZQUMzQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxZ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LENBQUM7U0FDL0MsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7UUFDWixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxTQUFTLENBQUM7UUFDbEUsTUFBTSxZQUFZLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUUzRCxPQUFPO1lBQ0wsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ25CLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixXQUFXLEVBQUUsWUFBWTtZQUN6QixZQUFZO1NBQ2IsQ0FBQztJQUNKLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3RlcCB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgdHlwZSB7IE1vZGVsTWVzc2FnZSB9IGZyb20gJ2FpJztcblxuY29uc3QgTVNfSU5fU0VDT05EID0gMTAwMDtcbmNvbnN0IE1TX0lOX01JTlVURSA9IDYwICogTVNfSU5fU0VDT05EO1xuY29uc3QgTVNfSU5fSE9VUiA9IDYwICogTVNfSU5fTUlOVVRFO1xuY29uc3QgTVNfSU5fREFZID0gMjQgKiBNU19JTl9IT1VSO1xuXG4vKipcbiAqIEZvcm1hdHMgYSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgdG8gYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcuXG4gKlxuICogQHBhcmFtIG1zIC0gRHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzXG4gKiBAcGFyYW0gY29tcGFjdCAtIElmIHRydWUsIHJldHVybnMgYSBjb21wYWN0IGZvcm1hdCAoZS5nLiwgXCIzODBtc1wiLCBcIjJtIDMwc1wiKS5cbiAqICAgICAgICAgICAgICAgICAgSWYgZmFsc2UgKGRlZmF1bHQpLCByZXR1cm5zIG11bHRpLXBhcnQgZm9ybWF0IChlLmcuLCBcIjFtIDEzc1wiLCBcIjJkIDVoIDNtIDEyc1wiKS5cbiAqXG4gKiBDb21wYWN0IGZvcm1hdCAodGltZWxpbmUgbWFya2Vycyk6XG4gKiAtIDwgMXM6IHNob3dzIG1pbGxpc2Vjb25kcyAoZS5nLiwgXCIzODBtc1wiKVxuICogLSA8IDFtOiBzaG93cyBzZWNvbmRzIChlLmcuLCBcIjQ1c1wiKVxuICogLSA8IDFoOiBzaG93cyBtaW51dGVzIGFuZCBzZWNvbmRzIChlLmcuLCBcIjJtIDMwc1wiKVxuICogLSA+PSAxaDogc2hvd3MgaG91cnMgYW5kIG1pbnV0ZXMgKGUuZy4sIFwiMmggMzBtXCIpXG4gKlxuICogRnVsbCBmb3JtYXQ6XG4gKiAtIDwgMXM6IHNob3dzIG1pbGxpc2Vjb25kcyAoZS5nLiwgXCIzODBtc1wiKVxuICogLSA8IDFtOiBzaG93cyBzZWNvbmRzIChlLmcuLCBcIjQ1c1wiKVxuICogLSA+PSAxbTogc2hvd3MgZGVjb21wb3NlZCBmb3JtYXQgd2l0aCB3aG9sZSBzZWNvbmRzIChlLmcuLCBcIjFtIDEzc1wiLCBcIjJtIDEzc1wiKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RHVyYXRpb24obXM6IG51bWJlciwgY29tcGFjdCA9IGZhbHNlKTogc3RyaW5nIHtcbiAgaWYgKG1zID09PSAwKSB7XG4gICAgcmV0dXJuICcwcyc7XG4gIH1cblxuICBpZiAobXMgPCBNU19JTl9TRUNPTkQpIHtcbiAgICBjb25zdCByb3VuZGVkTXMgPSBNYXRoLnJvdW5kKG1zKTtcbiAgICByZXR1cm4gcm91bmRlZE1zIDwgTVNfSU5fU0VDT05EID8gYCR7cm91bmRlZE1zfW1zYCA6ICcxcyc7XG4gIH1cblxuICBjb25zdCByb3VuZGVkTXMgPSBNYXRoLnJvdW5kKG1zIC8gTVNfSU5fU0VDT05EKSAqIE1TX0lOX1NFQ09ORDtcblxuICBpZiAocm91bmRlZE1zIDwgTVNfSU5fTUlOVVRFKSB7XG4gICAgcmV0dXJuIGAke01hdGguZmxvb3Iocm91bmRlZE1zIC8gTVNfSU5fU0VDT05EKX1zYDtcbiAgfVxuXG4gIC8vIENvbXBhY3QgZm9ybWF0OiBtdWx0aS11bml0IHdpdGhvdXQgZGVjaW1hbHMgKGUuZy4gXCI4bSAyMHNcIiwgXCIyaCAzMG1cIilcbiAgaWYgKGNvbXBhY3QpIHtcbiAgICBpZiAocm91bmRlZE1zIDwgTVNfSU5fSE9VUikge1xuICAgICAgY29uc3QgbSA9IE1hdGguZmxvb3Iocm91bmRlZE1zIC8gTVNfSU5fTUlOVVRFKTtcbiAgICAgIGNvbnN0IHMgPSBNYXRoLmZsb29yKChyb3VuZGVkTXMgJSBNU19JTl9NSU5VVEUpIC8gTVNfSU5fU0VDT05EKTtcbiAgICAgIHJldHVybiBzID4gMCA/IGAke219bSAke3N9c2AgOiBgJHttfW1gO1xuICAgIH1cbiAgICBjb25zdCBoID0gTWF0aC5mbG9vcihyb3VuZGVkTXMgLyBNU19JTl9IT1VSKTtcbiAgICBjb25zdCBtID0gTWF0aC5mbG9vcigocm91bmRlZE1zICUgTVNfSU5fSE9VUikgLyBNU19JTl9NSU5VVEUpO1xuICAgIHJldHVybiBtID4gMCA/IGAke2h9aCAke219bWAgOiBgJHtofWhgO1xuICB9XG5cbiAgLy8gRnVsbCBmb3JtYXQ6IGRlY29tcG9zZSBpbnRvIGxhcmdlciB1bml0cyArIHdob2xlIHNlY29uZHMuXG4gIGNvbnN0IGRheXMgPSBNYXRoLmZsb29yKHJvdW5kZWRNcyAvIE1TX0lOX0RBWSk7XG4gIGNvbnN0IGhvdXJzID0gTWF0aC5mbG9vcigocm91bmRlZE1zICUgTVNfSU5fREFZKSAvIE1TX0lOX0hPVVIpO1xuICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcigocm91bmRlZE1zICUgTVNfSU5fSE9VUikgLyBNU19JTl9NSU5VVEUpO1xuICBjb25zdCBzZWNvbmRzID0gTWF0aC5mbG9vcigocm91bmRlZE1zICUgTVNfSU5fTUlOVVRFKSAvIE1TX0lOX1NFQ09ORCk7XG5cbiAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKGRheXMgPiAwKSB7XG4gICAgcGFydHMucHVzaChgJHtkYXlzfWRgKTtcbiAgfVxuICBpZiAoaG91cnMgPiAwKSB7XG4gICAgcGFydHMucHVzaChgJHtob3Vyc31oYCk7XG4gIH1cbiAgaWYgKG1pbnV0ZXMgPiAwKSB7XG4gICAgcGFydHMucHVzaChgJHttaW51dGVzfW1gKTtcbiAgfVxuICBwYXJ0cy5wdXNoKGAke3NlY29uZHN9c2ApO1xuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcgJyk7XG59XG5cbi8vIExvY2FsZS1hd2FyZSBmb3JtYXR0ZXIgdGhhdCBhbHdheXMgcmVuZGVycyBleGFjdGx5IHR3byBmcmFjdGlvbiBkaWdpdHMuXG4vLyBVc2VkIGZvciB0aGUgc2Vjb25kcyBjb21wb25lbnQgb2YgcHJlY2lzZSBkdXJhdGlvbnMgc28gdmFsdWVzIGFyZSBuZXZlclxuLy8gc25hcHBlZCB0byBhIHdob2xlIHNlY29uZCAoYW5kIHRob3VzYW5kcyBzZXBhcmF0b3JzIHN0YXkgY29ycmVjdCkuXG5jb25zdCBwcmVjaXNlU2Vjb25kc0Zvcm1hdHRlciA9IG5ldyBJbnRsLk51bWJlckZvcm1hdCh1bmRlZmluZWQsIHtcbiAgbWluaW11bUZyYWN0aW9uRGlnaXRzOiAyLFxuICBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6IDIsXG59KTtcblxuLyoqXG4gKiBGb3JtYXRzIGEgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIHdpdGhvdXQgc25hcHBpbmcgdG8gd2hvbGUgc2Vjb25kcy5cbiAqXG4gKiBVbmxpa2Uge0BsaW5rIGZvcm1hdER1cmF0aW9ufSwgdGhpcyBuZXZlciByb3VuZHMgYSBzdWItbWludXRlIHZhbHVlIHVwIHRvXG4gKiB0aGUgbmV4dCB3aG9sZSBzZWNvbmQgKGUuZy4gMTYyNm1zIHJlbmRlcnMgYXMgXCIxLjYzc1wiLCBub3QgXCIyc1wiKS5cbiAqXG4gKiAtIDwgMXM6IHNob3dzIHdob2xlIG1pbGxpc2Vjb25kcyAoZS5nLiBcIjYyNm1zXCIpXG4gKiAtIDFzIOKAkyAxbTogc2hvd3Mgc2Vjb25kcyB3aXRoIHR3byBkZWNpbWFscyAoZS5nLiBcIjEuNjNzXCIsIFwiNDUuMjBzXCIpXG4gKiAtID49IDFtOiBkZWNvbXBvc2VzIGludG8gZC9oL20gd2l0aCB0d28tZGVjaW1hbCBzZWNvbmRzIChlLmcuIFwiMW0gMTMuNDVzXCIpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREdXJhdGlvblByZWNpc2UobXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGlmIChtcyA9PT0gMCkge1xuICAgIHJldHVybiAnMHMnO1xuICB9XG5cbiAgaWYgKG1zIDwgTVNfSU5fU0VDT05EKSB7XG4gICAgY29uc3Qgcm91bmRlZE1zID0gTWF0aC5yb3VuZChtcyk7XG4gICAgaWYgKHJvdW5kZWRNcyA8IE1TX0lOX1NFQ09ORCkge1xuICAgICAgcmV0dXJuIGAke3JvdW5kZWRNc31tc2A7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgbm9ybWFsaXplZE1zID0gTWF0aC5yb3VuZChtcyAvIDEwKSAqIDEwO1xuXG4gIGlmIChub3JtYWxpemVkTXMgPCBNU19JTl9NSU5VVEUpIHtcbiAgICByZXR1cm4gYCR7cHJlY2lzZVNlY29uZHNGb3JtYXR0ZXIuZm9ybWF0KG5vcm1hbGl6ZWRNcyAvIE1TX0lOX1NFQ09ORCl9c2A7XG4gIH1cblxuICBjb25zdCBkYXlzID0gTWF0aC5mbG9vcihub3JtYWxpemVkTXMgLyBNU19JTl9EQVkpO1xuICBjb25zdCBob3VycyA9IE1hdGguZmxvb3IoKG5vcm1hbGl6ZWRNcyAlIE1TX0lOX0RBWSkgLyBNU19JTl9IT1VSKTtcbiAgY29uc3QgbWludXRlcyA9IE1hdGguZmxvb3IoKG5vcm1hbGl6ZWRNcyAlIE1TX0lOX0hPVVIpIC8gTVNfSU5fTUlOVVRFKTtcbiAgY29uc3Qgc2Vjb25kcyA9IChub3JtYWxpemVkTXMgJSBNU19JTl9NSU5VVEUpIC8gTVNfSU5fU0VDT05EO1xuXG4gIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGlmIChkYXlzID4gMCkge1xuICAgIHBhcnRzLnB1c2goYCR7ZGF5c31kYCk7XG4gIH1cbiAgaWYgKGhvdXJzID4gMCkge1xuICAgIHBhcnRzLnB1c2goYCR7aG91cnN9aGApO1xuICB9XG4gIGlmIChtaW51dGVzID4gMCkge1xuICAgIHBhcnRzLnB1c2goYCR7bWludXRlc31tYCk7XG4gIH1cbiAgcGFydHMucHVzaChgJHtwcmVjaXNlU2Vjb25kc0Zvcm1hdHRlci5mb3JtYXQoc2Vjb25kcyl9c2ApO1xuXG4gIHJldHVybiBwYXJ0cy5qb2luKCcgJyk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZvcm1hdHRlZCBwYWdpbmF0aW9uIGRpc3BsYXkgc3RyaW5nXG4gKiBAcGFyYW0gY3VycmVudFBhZ2UgLSBUaGUgY3VycmVudCBwYWdlIG51bWJlclxuICogQHBhcmFtIHRvdGFsUGFnZXMgLSBUaGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIHZpc2l0ZWQgc28gZmFyXG4gKiBAcGFyYW0gaGFzTW9yZSAtIFdoZXRoZXIgdGhlcmUgYXJlIG1vcmUgcGFnZXMgYXZhaWxhYmxlXG4gKiBAcmV0dXJucyBGb3JtYXR0ZWQgc3RyaW5nIGxpa2UgXCJQYWdlIDEgb2YgMytcIiBvciBcIlBhZ2UgMiBvZiAyXCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBhZ2luYXRpb25EaXNwbGF5KFxuICBjdXJyZW50UGFnZTogbnVtYmVyLFxuICB0b3RhbFBhZ2VzOiBudW1iZXIsXG4gIGhhc01vcmU6IGJvb2xlYW5cbik6IHN0cmluZyB7XG4gIGlmIChoYXNNb3JlKSB7XG4gICAgcmV0dXJuIGBQYWdlICR7Y3VycmVudFBhZ2V9IG9mICR7dG90YWxQYWdlc30rYDtcbiAgfVxuICByZXR1cm4gYFBhZ2UgJHtjdXJyZW50UGFnZX0gb2YgJHt0b3RhbFBhZ2VzfWA7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIER1cmFibGUgQWdlbnQgVXRpbGl0aWVzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBzdGVwIGlzIGEgZG9TdHJlYW1TdGVwIChMTE0gY2FsbCB3aXRoIGNvbnZlcnNhdGlvbiBpbnB1dClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRG9TdHJlYW1TdGVwKHN0ZXBOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHN0ZXBOYW1lLmVuZHNXaXRoKCcvL2RvU3RyZWFtU3RlcCcpO1xufVxuXG4vKipcbiAqIEV4dHJhY3QgdGhlIGNvbnZlcnNhdGlvbiBmcm9tIGEgaHlkcmF0ZWQgZG9TdHJlYW1TdGVwIGlucHV0LlxuICogZG9TdHJlYW1TdGVwIHNpZ25hdHVyZTogKGNvbnZlcnNhdGlvblByb21wdCwgbW9kZWwsIHdyaXRhYmxlLCB0b29scywgb3B0aW9ucylcbiAqIFNvIGlucHV0WzBdIGlzIHRoZSBjb252ZXJzYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0Q29udmVyc2F0aW9uKHN0ZXBJbnB1dDogdW5rbm93bik6IE1vZGVsTWVzc2FnZVtdIHwgbnVsbCB7XG4gIGlmICghQXJyYXkuaXNBcnJheShzdGVwSW5wdXQpIHx8IHN0ZXBJbnB1dC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IGZpcnN0QXJnID0gc3RlcElucHV0WzBdO1xuXG4gIGlmICghQXJyYXkuaXNBcnJheShmaXJzdEFyZykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIGl0IGxvb2tzIGxpa2UgTW9kZWxNZXNzYWdlW11cbiAgaWYgKFxuICAgICFmaXJzdEFyZy5ldmVyeSgobXNnKSA9PiBtc2cgJiYgdHlwZW9mIG1zZyA9PT0gJ29iamVjdCcgJiYgJ3JvbGUnIGluIG1zZylcbiAgKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gZmlyc3RBcmcgYXMgTW9kZWxNZXNzYWdlW107XG59XG5cbi8qKlxuICogQSBkb1N0cmVhbVN0ZXAgd2l0aCBpdHMgY29udmVyc2F0aW9uIGlucHV0IGV4dHJhY3RlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0cmVhbVN0ZXAge1xuICBzdGVwSWQ6IHN0cmluZztcbiAgc3RlcE5hbWU6IHN0cmluZztcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcbiAgY29udmVyc2F0aW9uOiBNb2RlbE1lc3NhZ2VbXTtcbn1cblxuLyoqXG4gKiBJZGVudGlmaWVzIGFsbCBzdHJlYW0gc3RlcHMgKGRvU3RyZWFtU3RlcCkgaW4gYSBydW4gYW5kIGV4dHJhY3RzIHRoZWlyIGNvbnZlcnNhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGlmeVN0cmVhbVN0ZXBzKHN0ZXBzOiBTdGVwW10pOiBTdHJlYW1TdGVwW10ge1xuICByZXR1cm4gc3RlcHNcbiAgICAuZmlsdGVyKChzdGVwKSA9PiBpc0RvU3RyZWFtU3RlcChzdGVwLnN0ZXBOYW1lKSlcbiAgICAubWFwKChzdGVwKSA9PiB7XG4gICAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBzdGVwLnN0ZXBOYW1lLnNwbGl0KCcvLycpLnBvcCgpID8/ICd1bmtub3duJztcbiAgICAgIGNvbnN0IGNvbnZlcnNhdGlvbiA9IGV4dHJhY3RDb252ZXJzYXRpb24oc3RlcC5pbnB1dCkgPz8gW107XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0ZXBJZDogc3RlcC5zdGVwSWQsXG4gICAgICAgIHN0ZXBOYW1lOiBzdGVwLnN0ZXBOYW1lLFxuICAgICAgICBkaXNwbGF5TmFtZTogZnVuY3Rpb25OYW1lLFxuICAgICAgICBjb252ZXJzYXRpb24sXG4gICAgICB9O1xuICAgIH0pO1xufVxuIl19
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@workflow/web-shared",
3
3
  "description": "Shared components for Workflow Observability UI",
4
- "version": "5.0.0-beta.23",
4
+ "version": "5.0.0-beta.25",
5
5
  "private": false,
6
6
  "files": [
7
7
  "dist",
@@ -55,9 +55,9 @@
55
55
  "streamdown": "2.3.0",
56
56
  "tailwind-merge": "3.5.0",
57
57
  "tailwindcss": "4",
58
- "@workflow/core": "5.0.0-beta.23",
58
+ "@workflow/core": "5.0.0-beta.25",
59
59
  "@workflow/utils": "5.0.0-beta.4",
60
- "@workflow/world": "5.0.0-beta.13"
60
+ "@workflow/world": "5.0.0-beta.14"
61
61
  },
62
62
  "devDependencies": {
63
63
  "@biomejs/biome": "^2.4.4",
@@ -69,6 +69,25 @@ function formatEventTime(date: Date): string {
69
69
  );
70
70
  }
71
71
 
72
+ function parseEventDate(value: unknown): Date | null {
73
+ if (value == null) return null;
74
+
75
+ const date = value instanceof Date ? value : new Date(String(value));
76
+ return Number.isNaN(date.getTime()) ? null : date;
77
+ }
78
+
79
+ function getEffectiveEventDate(
80
+ event: Pick<Event, 'createdAt' | 'occurredAt'>
81
+ ): Date {
82
+ return parseEventDate(event.occurredAt) ?? new Date(event.createdAt);
83
+ }
84
+
85
+ function getEffectiveEventTime(
86
+ event: Pick<Event, 'createdAt' | 'occurredAt'>
87
+ ): number {
88
+ return getEffectiveEventDate(event).getTime();
89
+ }
90
+
72
91
  function formatEventType(eventType: Event['eventType']): string {
73
92
  return eventType
74
93
  .split('_')
@@ -178,7 +197,7 @@ export function buildDurationMap(events: Event[]): Map<string, DurationInfo> {
178
197
  // events for the same correlationId; the queued duration must be measured
179
198
  // against the first one, not the last.
180
199
  const chronological = [...events].sort(
181
- (a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime()
200
+ (a, b) => getEffectiveEventTime(a) - getEffectiveEventTime(b)
182
201
  );
183
202
 
184
203
  const createdTimes = new Map<string, number>();
@@ -187,7 +206,7 @@ export function buildDurationMap(events: Event[]): Map<string, DurationInfo> {
187
206
  const durations = new Map<string, DurationInfo>();
188
207
 
189
208
  for (const event of chronological) {
190
- const ts = new Date(event.createdAt).getTime();
209
+ const ts = getEffectiveEventTime(event);
191
210
  const key = event.correlationId ?? '__run__';
192
211
  const type: string = event.eventType;
193
212
 
@@ -652,7 +671,11 @@ const SORT_OPTIONS = [
652
671
  { value: 'asc' as const, label: 'Oldest' },
653
672
  ];
654
673
 
655
- function RowsSkeleton() {
674
+ function RowsSkeleton({
675
+ showSeparateEventOccurrenceTimestamps = false,
676
+ }: {
677
+ showSeparateEventOccurrenceTimestamps?: boolean;
678
+ }) {
656
679
  return (
657
680
  <div className="flex-1 overflow-hidden">
658
681
  {Array.from({ length: 16 }, (_, i) => (
@@ -689,7 +712,12 @@ function RowsSkeleton() {
689
712
  <div className="w-5 flex-shrink-0 flex items-center justify-center">
690
713
  <Skeleton className="w-5 h-5" style={{ borderRadius: 4 }} />
691
714
  </div>
692
- {/* Time */}
715
+ {showSeparateEventOccurrenceTimestamps && (
716
+ <div className="min-w-0 px-4" style={{ flex: '2 1 0%' }}>
717
+ <Skeleton className="h-3" style={{ width: '70%' }} />
718
+ </div>
719
+ )}
720
+ {/* Created */}
693
721
  <div className="min-w-0 px-4" style={{ flex: '2 1 0%' }}>
694
722
  <Skeleton className="h-3" style={{ width: '70%' }} />
695
723
  </div>
@@ -754,9 +782,11 @@ interface EventsListProps {
754
782
  kind: ExactWorkflowSearchIdKind,
755
783
  signal?: AbortSignal
756
784
  ) => Promise<ExactIdSearchResult>;
785
+ /** Show occurredAt separately instead of folding it into the Created timestamp. */
786
+ showSeparateEventOccurrenceTimestamps?: boolean;
757
787
  }
758
788
 
759
- function EventRow({
789
+ export function EventRow({
760
790
  event,
761
791
  index,
762
792
  isFirst,
@@ -777,6 +807,7 @@ function EventRow({
777
807
  encryptionKey,
778
808
  onEncryptedDataDetected,
779
809
  suppressGroupDimming = false,
810
+ showSeparateEventOccurrenceTimestamps = false,
780
811
  }: {
781
812
  event: Event;
782
813
  index: number;
@@ -799,6 +830,8 @@ function EventRow({
799
830
  onEncryptedDataDetected?: () => void;
800
831
  /** Exact-ID search results should not dim unrelated rows. */
801
832
  suppressGroupDimming?: boolean;
833
+ /** Show occurredAt separately instead of folding it into the Created timestamp. */
834
+ showSeparateEventOccurrenceTimestamps?: boolean;
802
835
  }) {
803
836
  const [isLoading, setIsLoading] = useState(false);
804
837
  const [loadedEventData, setLoadedEventData] = useState<unknown | null>(
@@ -827,6 +860,10 @@ function EventRow({
827
860
 
828
861
  const statusDotColor = getStatusDotColor(event.eventType);
829
862
  const createdAt = new Date(event.createdAt);
863
+ const occurredAt = parseEventDate(event.occurredAt);
864
+ const displayedCreatedAt = showSeparateEventOccurrenceTimestamps
865
+ ? createdAt
866
+ : getEffectiveEventDate(event);
830
867
  const hasExistingEventData = 'eventData' in event && event.eventData != null;
831
868
  const isRun = isRunLevel(event.eventType);
832
869
  const eventName = isRun
@@ -1007,13 +1044,28 @@ function EventRow({
1007
1044
  />
1008
1045
  </div>
1009
1046
 
1010
- {/* Time */}
1047
+ {showSeparateEventOccurrenceTimestamps && (
1048
+ <div
1049
+ className="tabular-nums min-w-0 px-4"
1050
+ style={{ color: 'var(--ds-gray-900)', flex: '2 1 0%' }}
1051
+ >
1052
+ {occurredAt ? (
1053
+ <TimestampTooltip date={occurredAt}>
1054
+ <span>{formatEventTime(occurredAt)}</span>
1055
+ </TimestampTooltip>
1056
+ ) : (
1057
+ '-'
1058
+ )}
1059
+ </div>
1060
+ )}
1061
+
1062
+ {/* Created */}
1011
1063
  <div
1012
1064
  className="tabular-nums min-w-0 px-4"
1013
1065
  style={{ color: 'var(--ds-gray-900)', flex: '2 1 0%' }}
1014
1066
  >
1015
- <TimestampTooltip date={createdAt}>
1016
- <span>{formatEventTime(createdAt)}</span>
1067
+ <TimestampTooltip date={displayedCreatedAt}>
1068
+ <span>{formatEventTime(displayedCreatedAt)}</span>
1017
1069
  </TimestampTooltip>
1018
1070
  </div>
1019
1071
 
@@ -1192,6 +1244,7 @@ function EventListViewInner({
1192
1244
  isDecrypting = false,
1193
1245
  hasEncryptedData: hasEncryptedDataProp = false,
1194
1246
  onExactIdSearch,
1247
+ showSeparateEventOccurrenceTimestamps = false,
1195
1248
  }: EventsListProps) {
1196
1249
  const toast = useToast();
1197
1250
  const [internalSortOrder, setInternalSortOrder] = useState<'asc' | 'desc'>(
@@ -1229,9 +1282,7 @@ function EventListViewInner({
1229
1282
  if (sourceEvents.length === 0) return [];
1230
1283
  const dir = effectiveSortOrder === 'desc' ? -1 : 1;
1231
1284
  return [...sourceEvents].sort(
1232
- (a, b) =>
1233
- dir *
1234
- (new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime())
1285
+ (a, b) => dir * (getEffectiveEventTime(a) - getEffectiveEventTime(b))
1235
1286
  );
1236
1287
  }, [events, effectiveSortOrder, isExactSearchActive, searchResults]);
1237
1288
 
@@ -1645,8 +1696,13 @@ function EventListViewInner({
1645
1696
  >
1646
1697
  <div className="flex-shrink-0" style={{ width: GUTTER_WIDTH }} />
1647
1698
  <div className="w-5 flex-shrink-0" />
1699
+ {showSeparateEventOccurrenceTimestamps && (
1700
+ <div className="min-w-0 px-4" style={{ flex: '2 1 0%' }}>
1701
+ Occurred
1702
+ </div>
1703
+ )}
1648
1704
  <div className="min-w-0 px-4" style={{ flex: '2 1 0%' }}>
1649
- Time
1705
+ Created
1650
1706
  </div>
1651
1707
  <div className="min-w-0 px-4" style={{ flex: '2 1 0%' }}>
1652
1708
  Event Type
@@ -1664,7 +1720,11 @@ function EventListViewInner({
1664
1720
 
1665
1721
  {/* Virtualized event rows or refetching skeleton */}
1666
1722
  {isRefetching || searchLoading ? (
1667
- <RowsSkeleton />
1723
+ <RowsSkeleton
1724
+ showSeparateEventOccurrenceTimestamps={
1725
+ showSeparateEventOccurrenceTimestamps
1726
+ }
1727
+ />
1668
1728
  ) : sortedEvents.length === 0 ? (
1669
1729
  <div
1670
1730
  className="flex flex-1 items-center justify-center px-6 text-center text-sm"
@@ -1720,6 +1780,9 @@ function EventListViewInner({
1720
1780
  encryptionKey={encryptionKey}
1721
1781
  onEncryptedDataDetected={handleEncryptedDataDetected}
1722
1782
  suppressGroupDimming={isExactSearchActive}
1783
+ showSeparateEventOccurrenceTimestamps={
1784
+ showSeparateEventOccurrenceTimestamps
1785
+ }
1723
1786
  />
1724
1787
  );
1725
1788
  }}
@@ -13,18 +13,24 @@ export {
13
13
  ResolveHookModal,
14
14
  useHookActions,
15
15
  } from './hook-actions';
16
+ export { TraceViewerSkeleton } from './new-trace-viewer/components/trace-viewer-skeleton';
16
17
  export { RunTraceView } from './run-trace-view';
17
18
  export { ConversationView } from './sidebar/conversation-view';
18
- export {
19
- SidebarDataProvider,
20
- type SidebarDataContextValue,
21
- } from './sidebar/sidebar-data-context';
22
19
  export type {
23
20
  SelectedSpanInfo,
24
21
  SpanSelectionInfo,
25
22
  } from './sidebar/entity-detail-panel';
23
+ export {
24
+ type SidebarDataContextValue,
25
+ SidebarDataProvider,
26
+ } from './sidebar/sidebar-data-context';
27
+ export type {
28
+ DetailResource,
29
+ FetchSpanDetail,
30
+ } from './sidebar/use-selected-span-detail';
26
31
  export { type StreamChunk, StreamViewer } from './stream-viewer';
27
32
  export type { Span, SpanEvent } from './trace-viewer/types';
33
+ export { NewTraceViewer } from './trace-viewer-new';
28
34
  export {
29
35
  DataInspector,
30
36
  type DataInspectorProps,
@@ -38,5 +44,3 @@ export { LoadMoreButton } from './ui/load-more-button';
38
44
  export { MenuDropdown, type MenuDropdownOption } from './ui/menu-dropdown';
39
45
  export { Spinner } from './ui/spinner';
40
46
  export { WorkflowTraceViewer } from './workflow-trace-view';
41
- export { NewTraceViewer } from './trace-viewer-new';
42
- export { TraceViewerSkeleton } from './new-trace-viewer/components/trace-viewer-skeleton';
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { Check, Copy } from 'lucide-react';
4
4
  import { type JSX, useEffect, useRef, useState } from 'react';
5
- import { cn } from '../../../lib/utils';
5
+ import { cn } from '../../../lib/cn';
6
6
 
7
7
  interface CopyButtonProps {
8
8
  copyText: string;
@@ -1,6 +1,6 @@
1
1
  import { Circle } from 'lucide-react';
2
2
  import { useRef } from 'react';
3
- import { cn } from '../../../lib/utils';
3
+ import { cn } from '../../../lib/cn';
4
4
  import type { Span } from '../types';
5
5
  import { formatDurationPrecise } from '../../trace-viewer/util/timing';
6
6
  import {
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { useCallback, useRef } from 'react';
4
4
  import type { ClipboardEvent, ComponentPropsWithoutRef, JSX } from 'react';
5
- import { cn } from '../../../../lib/utils';
5
+ import { cn } from '../../../../lib/cn';
6
6
  import {
7
7
  getMiddleTruncateCopyText,
8
8
  getMiddleTruncateCopyTextFromSelectionText,
@@ -2,7 +2,7 @@
2
2
 
3
3
  import { ArrowLeft, ArrowRight } from 'lucide-react';
4
4
  import type { ReactNode } from 'react';
5
- import { cn } from '../../../lib/utils';
5
+ import { cn } from '../../../lib/cn';
6
6
  import { TimestampTooltip } from '../../ui/timestamp-tooltip';
7
7
  import type { SpanMarker } from '../utils';
8
8
 
@@ -153,7 +153,7 @@ export function OffscreenMarkerIndicator({
153
153
  onReveal?.(targetMs);
154
154
  }}
155
155
  className={cn(
156
- 'pointer-events-auto absolute top-1/2 z-20 flex h-6 -translate-y-1/2 cursor-pointer items-center rounded-[0.25rem] border border-gray-alpha-400 bg-background-100 shadow-sm hover:bg-gray-100',
156
+ 'pointer-events-auto absolute top-1/2 z-20 flex h-6 -translate-y-1/2 cursor-pointer items-center rounded-[0.25rem] border border-gray-alpha-400 bg-background-100 hover:bg-gray-100',
157
157
  direction === 'right' ? 'right-0 pl-1.5' : 'left-0 pr-1.5'
158
158
  )}
159
159
  >
@@ -10,7 +10,7 @@ import {
10
10
  useRef,
11
11
  useState,
12
12
  } from 'react';
13
- import { cn } from '../../../lib/utils';
13
+ import { cn } from '../../../lib/cn';
14
14
 
15
15
  const GUTTER_PX = 1;
16
16
  const MIN_PX = 50;
@@ -11,7 +11,7 @@ import {
11
11
  useRef,
12
12
  useState,
13
13
  } from 'react';
14
- import { cn } from '../../../lib/utils';
14
+ import { cn } from '../../../lib/cn';
15
15
  import {
16
16
  formatDuration,
17
17
  formatDurationPrecise,
@@ -39,14 +39,14 @@ import {
39
39
  TooltipTrigger,
40
40
  } from '../ui/tooltip';
41
41
  import EventList from './components/event-list';
42
- import { TraceShortcutHelper } from './components/trace-shortcut-helper';
43
- import { ROW_HEIGHT_PX, scrollRowIntoView } from './components/use-row-window';
44
42
  import { SplitPane } from './components/split-pane';
45
43
  import {
46
44
  TIMELINE_PADDING_PX,
47
45
  Timeline,
48
46
  TimelineHeader,
49
47
  } from './components/timeline';
48
+ import { TraceShortcutHelper } from './components/trace-shortcut-helper';
49
+ import { ROW_HEIGHT_PX, scrollRowIntoView } from './components/use-row-window';
50
50
  import { ActiveSpanProvider, useActiveSpan } from './context';
51
51
  import { searchSpans } from './search';
52
52
  import type { TraceWithMeta } from './types';
@@ -822,10 +822,7 @@ function NewTraceViewerContent({
822
822
  run={sidebar.run}
823
823
  onStreamClick={sidebar.onStreamClick}
824
824
  onRunClick={sidebar.onRunClick}
825
- spanDetailData={sidebar.spanDetailData}
826
- spanDetailError={sidebar.spanDetailError}
827
- spanDetailLoading={sidebar.spanDetailLoading}
828
- onSpanSelect={sidebar.onSpanSelect}
825
+ fetchSpanDetail={sidebar.fetchSpanDetail}
829
826
  onWakeUpSleep={sidebar.onWakeUpSleep}
830
827
  onLoadEventData={sidebar.onLoadEventData}
831
828
  onResolveHook={sidebar.onResolveHook}
@@ -833,6 +830,9 @@ function NewTraceViewerContent({
833
830
  onDecrypt={sidebar.onDecrypt}
834
831
  isDecrypting={sidebar.isDecrypting}
835
832
  selectedSpan={selectedSpan}
833
+ showSeparateEventOccurrenceTimestamps={
834
+ sidebar.showSeparateEventOccurrenceTimestamps
835
+ }
836
836
  />
837
837
  </ErrorBoundary>
838
838
  </div>
@@ -1,8 +1,8 @@
1
1
  'use client';
2
2
 
3
- import type { Event, Hook, Step, WorkflowRun } from '@workflow/world';
3
+ import type { Event, Hook, WorkflowRun } from '@workflow/world';
4
4
  import { AlertCircle } from 'lucide-react';
5
- import type { SpanSelectionInfo } from './sidebar/entity-detail-panel';
5
+ import type { FetchSpanDetail } from './sidebar/use-selected-span-detail';
6
6
  import { WorkflowTraceViewer } from './workflow-trace-view';
7
7
 
8
8
  interface RunTraceViewProps {
@@ -10,9 +10,7 @@ interface RunTraceViewProps {
10
10
  events: Event[];
11
11
  isLoading?: boolean;
12
12
  error?: Error | null;
13
- spanDetailData?: WorkflowRun | Step | Hook | Event | null;
14
- spanDetailLoading?: boolean;
15
- spanDetailError?: Error | null;
13
+ fetchSpanDetail: FetchSpanDetail;
16
14
  onWakeUpSleep?: (
17
15
  runId: string,
18
16
  correlationId: string
@@ -25,10 +23,10 @@ interface RunTraceViewProps {
25
23
  onCancelRun?: (runId: string) => Promise<void>;
26
24
  onStreamClick?: (streamId: string) => void;
27
25
  onRunClick?: (runId: string) => void;
28
- onSpanSelect?: (info: SpanSelectionInfo) => void;
29
26
  onLoadMoreSpans?: () => void | Promise<void>;
30
27
  hasMoreSpans?: boolean;
31
28
  isLoadingMoreSpans?: boolean;
29
+ showSeparateEventOccurrenceTimestamps?: boolean;
32
30
  }
33
31
 
34
32
  export function RunTraceView({
@@ -36,18 +34,16 @@ export function RunTraceView({
36
34
  events,
37
35
  isLoading,
38
36
  error,
39
- spanDetailData,
40
- spanDetailLoading,
41
- spanDetailError,
37
+ fetchSpanDetail,
42
38
  onWakeUpSleep,
43
39
  onResolveHook,
44
40
  onCancelRun,
45
41
  onStreamClick,
46
42
  onRunClick,
47
- onSpanSelect,
48
43
  onLoadMoreSpans,
49
44
  hasMoreSpans,
50
45
  isLoadingMoreSpans,
46
+ showSeparateEventOccurrenceTimestamps,
51
47
  }: RunTraceViewProps) {
52
48
  if (error && !run) {
53
49
  return (
@@ -66,18 +62,18 @@ export function RunTraceView({
66
62
  events={events}
67
63
  run={run}
68
64
  isLoading={isLoading}
69
- spanDetailData={spanDetailData}
70
- spanDetailLoading={spanDetailLoading}
71
- spanDetailError={spanDetailError}
65
+ fetchSpanDetail={fetchSpanDetail}
72
66
  onWakeUpSleep={onWakeUpSleep}
73
67
  onResolveHook={onResolveHook}
74
68
  onCancelRun={onCancelRun}
75
69
  onStreamClick={onStreamClick}
76
70
  onRunClick={onRunClick}
77
- onSpanSelect={onSpanSelect}
78
71
  onLoadMoreSpans={onLoadMoreSpans}
79
72
  hasMoreSpans={hasMoreSpans}
80
73
  isLoadingMoreSpans={isLoadingMoreSpans}
74
+ showSeparateEventOccurrenceTimestamps={
75
+ showSeparateEventOccurrenceTimestamps
76
+ }
81
77
  />
82
78
  </div>
83
79
  );