@workflow/web-shared 5.0.0-beta.2 → 5.0.0-beta.20

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 (321) hide show
  1. package/dist/components/error-boundary.js +1 -1
  2. package/dist/components/event-list-view.d.ts +16 -1
  3. package/dist/components/event-list-view.d.ts.map +1 -1
  4. package/dist/components/event-list-view.js +196 -85
  5. package/dist/components/hook-actions.js +1 -1
  6. package/dist/components/index.d.ts +4 -0
  7. package/dist/components/index.d.ts.map +1 -1
  8. package/dist/components/index.js +5 -1
  9. package/dist/components/new-trace-viewer/components/copy-button.d.ts +9 -0
  10. package/dist/components/new-trace-viewer/components/copy-button.d.ts.map +1 -0
  11. package/dist/components/new-trace-viewer/components/copy-button.js +27 -0
  12. package/dist/components/new-trace-viewer/components/event-list.d.ts +10 -0
  13. package/dist/components/new-trace-viewer/components/event-list.d.ts.map +1 -0
  14. package/dist/components/new-trace-viewer/components/event-list.js +46 -0
  15. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts +18 -0
  16. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.d.ts.map +1 -0
  17. package/dist/components/new-trace-viewer/components/middle-truncate/copy-selection.js +54 -0
  18. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts +20 -0
  19. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.d.ts.map +1 -0
  20. package/dist/components/new-trace-viewer/components/middle-truncate/middle-truncate.js +81 -0
  21. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts +25 -0
  22. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts.map +1 -0
  23. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +101 -0
  24. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts +20 -0
  25. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.d.ts.map +1 -0
  26. package/dist/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.js +114 -0
  27. package/dist/components/new-trace-viewer/components/span-markers.d.ts +46 -0
  28. package/dist/components/new-trace-viewer/components/span-markers.d.ts.map +1 -0
  29. package/dist/components/new-trace-viewer/components/span-markers.js +85 -0
  30. package/dist/components/new-trace-viewer/components/split-pane.d.ts +15 -0
  31. package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +1 -0
  32. package/dist/components/new-trace-viewer/components/split-pane.js +105 -0
  33. package/dist/components/new-trace-viewer/components/timeline.d.ts +36 -0
  34. package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -0
  35. package/dist/components/new-trace-viewer/components/timeline.js +254 -0
  36. package/dist/components/new-trace-viewer/components/timeline.module.css +46 -0
  37. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.d.ts +2 -0
  38. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.d.ts.map +1 -0
  39. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.js +19 -0
  40. package/dist/components/new-trace-viewer/components/use-row-window.d.ts +34 -0
  41. package/dist/components/new-trace-viewer/components/use-row-window.d.ts.map +1 -0
  42. package/dist/components/new-trace-viewer/components/use-row-window.js +107 -0
  43. package/dist/components/new-trace-viewer/context.d.ts +15 -0
  44. package/dist/components/new-trace-viewer/context.d.ts.map +1 -0
  45. package/dist/components/new-trace-viewer/context.js +47 -0
  46. package/dist/components/new-trace-viewer/icons.d.ts +6 -0
  47. package/dist/components/new-trace-viewer/icons.d.ts.map +1 -0
  48. package/dist/components/new-trace-viewer/icons.js +15 -0
  49. package/dist/components/new-trace-viewer/search.d.ts +19 -0
  50. package/dist/components/new-trace-viewer/search.d.ts.map +1 -0
  51. package/dist/components/new-trace-viewer/search.js +134 -0
  52. package/dist/components/new-trace-viewer/trace-viewer.d.ts +11 -0
  53. package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -0
  54. package/dist/components/new-trace-viewer/trace-viewer.js +462 -0
  55. package/dist/components/new-trace-viewer/types.d.ts +3 -0
  56. package/dist/components/new-trace-viewer/types.d.ts.map +1 -0
  57. package/dist/components/new-trace-viewer/types.js +2 -0
  58. package/dist/components/new-trace-viewer/utils.d.ts +61 -0
  59. package/dist/components/new-trace-viewer/utils.d.ts.map +1 -0
  60. package/dist/components/new-trace-viewer/utils.js +345 -0
  61. package/dist/components/run-trace-view.js +1 -1
  62. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  63. package/dist/components/sidebar/attribute-panel.js +129 -102
  64. package/dist/components/sidebar/attributes-block.d.ts +28 -0
  65. package/dist/components/sidebar/attributes-block.d.ts.map +1 -0
  66. package/dist/components/sidebar/attributes-block.js +81 -0
  67. package/dist/components/sidebar/conversation-view.js +1 -1
  68. package/dist/components/sidebar/copyable-data-block.d.ts +1 -0
  69. package/dist/components/sidebar/copyable-data-block.d.ts.map +1 -1
  70. package/dist/components/sidebar/copyable-data-block.js +16 -15
  71. package/dist/components/sidebar/detail-card.d.ts +5 -6
  72. package/dist/components/sidebar/detail-card.d.ts.map +1 -1
  73. package/dist/components/sidebar/detail-card.js +32 -16
  74. package/dist/components/sidebar/entity-detail-panel.d.ts +1 -3
  75. package/dist/components/sidebar/entity-detail-panel.d.ts.map +1 -1
  76. package/dist/components/sidebar/entity-detail-panel.js +17 -35
  77. package/dist/components/sidebar/events-list.d.ts +3 -1
  78. package/dist/components/sidebar/events-list.d.ts.map +1 -1
  79. package/dist/components/sidebar/events-list.js +36 -22
  80. package/dist/components/sidebar/resolve-hook-modal.js +1 -1
  81. package/dist/components/sidebar/sidebar-data-context.d.ts +29 -0
  82. package/dist/components/sidebar/sidebar-data-context.d.ts.map +1 -0
  83. package/dist/components/sidebar/sidebar-data-context.js +19 -0
  84. package/dist/components/sidebar/span-detail-merge.d.ts +16 -0
  85. package/dist/components/sidebar/span-detail-merge.d.ts.map +1 -0
  86. package/dist/components/sidebar/span-detail-merge.js +53 -0
  87. package/dist/components/stream-viewer.d.ts +1 -1
  88. package/dist/components/stream-viewer.d.ts.map +1 -1
  89. package/dist/components/stream-viewer.js +3 -27
  90. package/dist/components/trace-viewer/components/map.js +1 -1
  91. package/dist/components/trace-viewer/components/markers.js +1 -1
  92. package/dist/components/trace-viewer/components/node.d.ts.map +1 -1
  93. package/dist/components/trace-viewer/components/node.js +2 -1
  94. package/dist/components/trace-viewer/components/search-input.js +1 -1
  95. package/dist/components/trace-viewer/components/search.js +1 -1
  96. package/dist/components/trace-viewer/components/span-content.js +1 -1
  97. package/dist/components/trace-viewer/components/span-detail-panel.js +1 -1
  98. package/dist/components/trace-viewer/components/span-segments.js +1 -1
  99. package/dist/components/trace-viewer/components/span-strategies.js +1 -1
  100. package/dist/components/trace-viewer/components/ui.js +1 -1
  101. package/dist/components/trace-viewer/components/zoom-button.js +1 -1
  102. package/dist/components/trace-viewer/components/zoom-icons.js +1 -1
  103. package/dist/components/trace-viewer/context.js +1 -1
  104. package/dist/components/trace-viewer/index.js +1 -1
  105. package/dist/components/trace-viewer/trace-viewer.js +1 -1
  106. package/dist/components/trace-viewer/trace-viewer.module.css +4 -4
  107. package/dist/components/trace-viewer/types.js +1 -1
  108. package/dist/components/trace-viewer/util/constants.js +1 -1
  109. package/dist/components/trace-viewer/util/scrollbar-width.js +1 -1
  110. package/dist/components/trace-viewer/util/timing.d.ts +3 -3
  111. package/dist/components/trace-viewer/util/timing.d.ts.map +1 -1
  112. package/dist/components/trace-viewer/util/timing.js +8 -11
  113. package/dist/components/trace-viewer/util/tree.js +1 -1
  114. package/dist/components/trace-viewer/util/use-immediate-style.js +1 -1
  115. package/dist/components/trace-viewer/util/use-streaming-spans.js +1 -1
  116. package/dist/components/trace-viewer/util/use-trackpad-zoom.js +1 -1
  117. package/dist/components/trace-viewer/worker.js +1 -1
  118. package/dist/components/trace-viewer-new.d.ts +14 -0
  119. package/dist/components/trace-viewer-new.d.ts.map +1 -0
  120. package/dist/components/trace-viewer-new.js +21 -0
  121. package/dist/components/ui/alert.js +1 -1
  122. package/dist/components/ui/button.d.ts +10 -0
  123. package/dist/components/ui/button.d.ts.map +1 -0
  124. package/dist/components/ui/button.js +46 -0
  125. package/dist/components/ui/card.js +1 -1
  126. package/dist/components/ui/context-card.d.ts +47 -0
  127. package/dist/components/ui/context-card.d.ts.map +1 -0
  128. package/dist/components/ui/context-card.js +471 -0
  129. package/dist/components/ui/data-inspector.d.ts +22 -0
  130. package/dist/components/ui/data-inspector.d.ts.map +1 -1
  131. package/dist/components/ui/data-inspector.js +103 -13
  132. package/dist/components/ui/decrypt-button.js +1 -1
  133. package/dist/components/ui/error-card.js +1 -1
  134. package/dist/components/ui/error-stack-block.d.ts +17 -10
  135. package/dist/components/ui/error-stack-block.d.ts.map +1 -1
  136. package/dist/components/ui/error-stack-block.js +49 -30
  137. package/dist/components/ui/icon-button.d.ts +19 -0
  138. package/dist/components/ui/icon-button.d.ts.map +1 -0
  139. package/dist/components/ui/icon-button.js +29 -0
  140. package/dist/components/ui/inspector-theme.d.ts +9 -10
  141. package/dist/components/ui/inspector-theme.d.ts.map +1 -1
  142. package/dist/components/ui/inspector-theme.js +39 -72
  143. package/dist/components/ui/kbd.d.ts +6 -0
  144. package/dist/components/ui/kbd.d.ts.map +1 -0
  145. package/dist/components/ui/kbd.js +6 -0
  146. package/dist/components/ui/load-more-button.js +1 -1
  147. package/dist/components/ui/menu-dropdown.js +1 -1
  148. package/dist/components/ui/skeleton.js +1 -1
  149. package/dist/components/ui/spinner.js +1 -1
  150. package/dist/components/ui/timestamp-tooltip.d.ts +34 -1
  151. package/dist/components/ui/timestamp-tooltip.d.ts.map +1 -1
  152. package/dist/components/ui/timestamp-tooltip.js +80 -132
  153. package/dist/components/ui/tooltip.d.ts +10 -0
  154. package/dist/components/ui/tooltip.d.ts.map +1 -0
  155. package/dist/components/ui/tooltip.js +12 -0
  156. package/dist/components/workflow-trace-view.d.ts +1 -3
  157. package/dist/components/workflow-trace-view.d.ts.map +1 -1
  158. package/dist/components/workflow-trace-view.js +11 -13
  159. package/dist/components/workflow-traces/event-colors.d.ts +1 -0
  160. package/dist/components/workflow-traces/event-colors.d.ts.map +1 -1
  161. package/dist/components/workflow-traces/event-colors.js +12 -1
  162. package/dist/components/workflow-traces/trace-colors.js +1 -1
  163. package/dist/components/workflow-traces/trace-span-construction.d.ts +2 -2
  164. package/dist/components/workflow-traces/trace-span-construction.d.ts.map +1 -1
  165. package/dist/components/workflow-traces/trace-span-construction.js +19 -5
  166. package/dist/components/workflow-traces/trace-time-utils.js +1 -1
  167. package/dist/hooks/use-dark-mode.js +1 -1
  168. package/dist/hooks/use-intersection-observer.d.ts +17 -0
  169. package/dist/hooks/use-intersection-observer.d.ts.map +1 -0
  170. package/dist/hooks/use-intersection-observer.js +29 -0
  171. package/dist/hooks/use-load-more-on-scroll.d.ts +21 -0
  172. package/dist/hooks/use-load-more-on-scroll.d.ts.map +1 -0
  173. package/dist/hooks/use-load-more-on-scroll.js +28 -0
  174. package/dist/hooks/use-reduced-motion.d.ts +10 -0
  175. package/dist/hooks/use-reduced-motion.d.ts.map +1 -0
  176. package/dist/hooks/use-reduced-motion.js +29 -0
  177. package/dist/index.d.ts +3 -1
  178. package/dist/index.d.ts.map +1 -1
  179. package/dist/index.js +3 -2
  180. package/dist/lib/event-analysis.js +1 -1
  181. package/dist/lib/event-materialization.js +1 -1
  182. package/dist/lib/exact-event-search-id.d.ts +25 -0
  183. package/dist/lib/exact-event-search-id.d.ts.map +1 -0
  184. package/dist/lib/exact-event-search-id.js +39 -0
  185. package/dist/lib/hydration.d.ts +6 -0
  186. package/dist/lib/hydration.d.ts.map +1 -1
  187. package/dist/lib/hydration.js +154 -2
  188. package/dist/lib/stream-display.d.ts +18 -0
  189. package/dist/lib/stream-display.d.ts.map +1 -0
  190. package/dist/lib/stream-display.js +30 -0
  191. package/dist/lib/toast.js +1 -1
  192. package/dist/lib/trace-builder.d.ts +15 -0
  193. package/dist/lib/trace-builder.d.ts.map +1 -1
  194. package/dist/lib/trace-builder.js +29 -3
  195. package/dist/lib/utils.d.ts +20 -9
  196. package/dist/lib/utils.d.ts.map +1 -1
  197. package/dist/lib/utils.js +74 -31
  198. package/dist/lib/zstd-browser-decoder.d.ts +7 -0
  199. package/dist/lib/zstd-browser-decoder.d.ts.map +1 -0
  200. package/dist/lib/zstd-browser-decoder.js +41 -0
  201. package/dist/styles.css +484 -1
  202. package/package.json +10 -5
  203. package/src/components/event-list-view.tsx +279 -104
  204. package/src/components/index.ts +7 -0
  205. package/src/components/new-trace-viewer/components/copy-button.tsx +68 -0
  206. package/src/components/new-trace-viewer/components/event-list.tsx +136 -0
  207. package/src/components/new-trace-viewer/components/middle-truncate/copy-selection.ts +114 -0
  208. package/src/components/new-trace-viewer/components/middle-truncate/middle-truncate.tsx +157 -0
  209. package/src/components/new-trace-viewer/components/middle-truncate/truncate.ts +132 -0
  210. package/src/components/new-trace-viewer/components/middle-truncate/use-middle-truncate.ts +167 -0
  211. package/src/components/new-trace-viewer/components/span-markers.tsx +173 -0
  212. package/src/components/new-trace-viewer/components/split-pane.tsx +198 -0
  213. package/src/components/new-trace-viewer/components/timeline.module.css +46 -0
  214. package/src/components/new-trace-viewer/components/timeline.tsx +744 -0
  215. package/src/components/new-trace-viewer/components/trace-viewer-skeleton.tsx +94 -0
  216. package/src/components/new-trace-viewer/components/use-row-window.ts +140 -0
  217. package/src/components/new-trace-viewer/context.tsx +90 -0
  218. package/src/components/new-trace-viewer/icons.tsx +79 -0
  219. package/src/components/new-trace-viewer/search.ts +178 -0
  220. package/src/components/new-trace-viewer/trace-viewer.tsx +843 -0
  221. package/src/components/new-trace-viewer/types.ts +2 -0
  222. package/src/components/new-trace-viewer/utils.test.ts +182 -0
  223. package/src/components/new-trace-viewer/utils.ts +519 -0
  224. package/src/components/sidebar/attribute-panel.tsx +194 -240
  225. package/src/components/sidebar/attributes-block.tsx +173 -0
  226. package/src/components/sidebar/copyable-data-block.tsx +49 -27
  227. package/src/components/sidebar/detail-card.tsx +119 -59
  228. package/src/components/sidebar/entity-detail-panel.tsx +55 -111
  229. package/src/components/sidebar/events-list.tsx +85 -96
  230. package/src/components/sidebar/sidebar-data-context.tsx +62 -0
  231. package/src/components/sidebar/span-detail-merge.ts +65 -0
  232. package/src/components/stream-viewer.tsx +18 -40
  233. package/src/components/trace-viewer/components/node.tsx +3 -2
  234. package/src/components/trace-viewer/trace-viewer.module.css +4 -4
  235. package/src/components/trace-viewer/util/timing.ts +7 -11
  236. package/src/components/trace-viewer-new.tsx +55 -0
  237. package/src/components/ui/button.tsx +68 -0
  238. package/src/components/ui/context-card.tsx +784 -0
  239. package/src/components/ui/data-inspector.tsx +244 -22
  240. package/src/components/ui/error-stack-block.tsx +84 -55
  241. package/src/components/ui/icon-button.tsx +53 -0
  242. package/src/components/ui/inspector-theme.ts +39 -81
  243. package/src/components/ui/kbd.tsx +21 -0
  244. package/src/components/ui/timestamp-tooltip.tsx +132 -194
  245. package/src/components/ui/tooltip.tsx +47 -0
  246. package/src/components/workflow-trace-view.tsx +19 -15
  247. package/src/components/workflow-traces/event-colors.ts +12 -0
  248. package/src/components/workflow-traces/trace-span-construction.ts +24 -5
  249. package/src/hooks/use-intersection-observer.ts +57 -0
  250. package/src/hooks/use-load-more-on-scroll.ts +49 -0
  251. package/src/hooks/use-reduced-motion.ts +34 -0
  252. package/src/index.ts +9 -0
  253. package/src/lib/exact-event-search-id.ts +67 -0
  254. package/src/lib/hydration.ts +166 -1
  255. package/src/lib/stream-display.ts +48 -0
  256. package/src/lib/trace-builder.ts +34 -2
  257. package/src/lib/utils.ts +83 -31
  258. package/src/lib/zstd-browser-decoder.ts +42 -0
  259. package/src/styles.css +484 -1
  260. package/dist/components/error-boundary.js.map +0 -1
  261. package/dist/components/event-list-view.js.map +0 -1
  262. package/dist/components/hook-actions.js.map +0 -1
  263. package/dist/components/index.js.map +0 -1
  264. package/dist/components/run-trace-view.js.map +0 -1
  265. package/dist/components/sidebar/attribute-panel.js.map +0 -1
  266. package/dist/components/sidebar/conversation-view.js.map +0 -1
  267. package/dist/components/sidebar/copyable-data-block.js.map +0 -1
  268. package/dist/components/sidebar/detail-card.js.map +0 -1
  269. package/dist/components/sidebar/entity-detail-panel.js.map +0 -1
  270. package/dist/components/sidebar/events-list.js.map +0 -1
  271. package/dist/components/sidebar/resolve-hook-modal.js.map +0 -1
  272. package/dist/components/stream-viewer.js.map +0 -1
  273. package/dist/components/trace-viewer/components/map.js.map +0 -1
  274. package/dist/components/trace-viewer/components/markers.js.map +0 -1
  275. package/dist/components/trace-viewer/components/node.js.map +0 -1
  276. package/dist/components/trace-viewer/components/search-input.js.map +0 -1
  277. package/dist/components/trace-viewer/components/search.js.map +0 -1
  278. package/dist/components/trace-viewer/components/span-content.js.map +0 -1
  279. package/dist/components/trace-viewer/components/span-detail-panel.js.map +0 -1
  280. package/dist/components/trace-viewer/components/span-segments.js.map +0 -1
  281. package/dist/components/trace-viewer/components/span-strategies.js.map +0 -1
  282. package/dist/components/trace-viewer/components/ui.js.map +0 -1
  283. package/dist/components/trace-viewer/components/zoom-button.js.map +0 -1
  284. package/dist/components/trace-viewer/components/zoom-icons.js.map +0 -1
  285. package/dist/components/trace-viewer/context.js.map +0 -1
  286. package/dist/components/trace-viewer/index.js.map +0 -1
  287. package/dist/components/trace-viewer/trace-viewer.js.map +0 -1
  288. package/dist/components/trace-viewer/types.js.map +0 -1
  289. package/dist/components/trace-viewer/util/constants.js.map +0 -1
  290. package/dist/components/trace-viewer/util/scrollbar-width.js.map +0 -1
  291. package/dist/components/trace-viewer/util/timing.js.map +0 -1
  292. package/dist/components/trace-viewer/util/tree.js.map +0 -1
  293. package/dist/components/trace-viewer/util/use-immediate-style.js.map +0 -1
  294. package/dist/components/trace-viewer/util/use-streaming-spans.js.map +0 -1
  295. package/dist/components/trace-viewer/util/use-trackpad-zoom.js.map +0 -1
  296. package/dist/components/trace-viewer/worker.js.map +0 -1
  297. package/dist/components/ui/alert.js.map +0 -1
  298. package/dist/components/ui/card.js.map +0 -1
  299. package/dist/components/ui/data-inspector.js.map +0 -1
  300. package/dist/components/ui/decrypt-button.js.map +0 -1
  301. package/dist/components/ui/error-card.js.map +0 -1
  302. package/dist/components/ui/error-stack-block.js.map +0 -1
  303. package/dist/components/ui/inspector-theme.js.map +0 -1
  304. package/dist/components/ui/load-more-button.js.map +0 -1
  305. package/dist/components/ui/menu-dropdown.js.map +0 -1
  306. package/dist/components/ui/skeleton.js.map +0 -1
  307. package/dist/components/ui/spinner.js.map +0 -1
  308. package/dist/components/ui/timestamp-tooltip.js.map +0 -1
  309. package/dist/components/workflow-trace-view.js.map +0 -1
  310. package/dist/components/workflow-traces/event-colors.js.map +0 -1
  311. package/dist/components/workflow-traces/trace-colors.js.map +0 -1
  312. package/dist/components/workflow-traces/trace-span-construction.js.map +0 -1
  313. package/dist/components/workflow-traces/trace-time-utils.js.map +0 -1
  314. package/dist/hooks/use-dark-mode.js.map +0 -1
  315. package/dist/index.js.map +0 -1
  316. package/dist/lib/event-analysis.js.map +0 -1
  317. package/dist/lib/event-materialization.js.map +0 -1
  318. package/dist/lib/hydration.js.map +0 -1
  319. package/dist/lib/toast.js.map +0 -1
  320. package/dist/lib/trace-builder.js.map +0 -1
  321. package/dist/lib/utils.js.map +0 -1
@@ -12,7 +12,9 @@ import { createContext, useContext, useEffect, useMemo, useRef, useState, } from
12
12
  import { ObjectInspector, ObjectLabel, ObjectName, ObjectRootLabel, ObjectValue, } from 'react-inspector';
13
13
  import { useDarkMode } from '../../hooks/use-dark-mode';
14
14
  import { ENCRYPTED_DISPLAY_NAME } from '../../lib/hydration';
15
+ import { formatArrayBufferViewForDisplay, } from '../../lib/stream-display';
15
16
  import { inspectorThemeDark, inspectorThemeExtendedDark, inspectorThemeExtendedLight, inspectorThemeLight, } from './inspector-theme';
17
+ import { Button } from './button';
16
18
  import { Spinner } from './spinner';
17
19
  // ---------------------------------------------------------------------------
18
20
  // StreamRef / ClassInstanceRef type detection
@@ -21,6 +23,27 @@ import { Spinner } from './spinner';
21
23
  const STREAM_REF_TYPE = '__workflow_stream_ref__';
22
24
  const CLASS_INSTANCE_REF_TYPE = '__workflow_class_instance_ref__';
23
25
  const RUN_REF_TYPE = '__workflow_run_ref__';
26
+ const BYTES_DISPLAY_TYPE = '__workflow_bytes_display__';
27
+ function deserializeChunkText(text) {
28
+ try {
29
+ const parsed = JSON.parse(text);
30
+ if (typeof parsed === 'string') {
31
+ return parsed;
32
+ }
33
+ return JSON.stringify(parsed, null, 2);
34
+ }
35
+ catch {
36
+ return text;
37
+ }
38
+ }
39
+ function parseChunkData(text) {
40
+ try {
41
+ return JSON.parse(text);
42
+ }
43
+ catch {
44
+ return text;
45
+ }
46
+ }
24
47
  function isStreamRef(value) {
25
48
  if (value === null || typeof value !== 'object')
26
49
  return false;
@@ -34,6 +57,12 @@ function isRunRef(value) {
34
57
  const desc = Object.getOwnPropertyDescriptor(value, '__type');
35
58
  return desc?.value === RUN_REF_TYPE;
36
59
  }
60
+ export function isBytesDisplay(value) {
61
+ if (value === null || typeof value !== 'object')
62
+ return false;
63
+ const desc = Object.getOwnPropertyDescriptor(value, '__type');
64
+ return desc?.value === BYTES_DISPLAY_TYPE;
65
+ }
37
66
  function isClassInstanceRef(value) {
38
67
  return (value !== null &&
39
68
  typeof value === 'object' &&
@@ -53,16 +82,10 @@ export const RunClickContext = createContext(undefined);
53
82
  function EncryptedInlineLabel() {
54
83
  const ctx = useContext(DecryptClickContext);
55
84
  if (ctx) {
56
- return (_jsxs("button", { type: "button", className: "inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[11px] cursor-pointer", style: {
57
- backgroundColor: 'var(--ds-gray-100)',
58
- color: 'var(--ds-gray-700)',
59
- border: '1px solid var(--ds-gray-400)',
60
- fontStyle: 'italic',
61
- opacity: ctx.isDecrypting ? 0.6 : 1,
62
- }, disabled: ctx.isDecrypting, onClick: (e) => {
85
+ return (_jsxs(Button, { size: "xs", className: "align-baseline gap-x-1", disabled: ctx.isDecrypting, onClick: (e) => {
63
86
  e.stopPropagation();
64
87
  ctx.onDecrypt();
65
- }, title: "Click to decrypt", children: [ctx.isDecrypting ? (_jsx(Spinner, { size: 12 })) : (_jsx(Lock, { className: "h-3 w-3", style: { display: 'inline', flexShrink: 0 } })), _jsx("span", { children: ctx.isDecrypting ? 'Decrypting…' : 'Decrypt' })] }));
88
+ }, children: [ctx.isDecrypting ? (_jsx(Spinner, { size: 10 })) : (_jsx(Lock, { className: "h-3 w-3" })), _jsx("span", { children: "Decrypt" })] }));
66
89
  }
67
90
  return (_jsxs("span", { style: { color: 'var(--ds-gray-600)', fontStyle: 'italic' }, children: [_jsx(Lock, { className: "h-3 w-3", style: {
68
91
  display: 'inline',
@@ -101,6 +124,29 @@ function RunRefInline({ runRef }) {
101
124
  // Extended theme context (for colors react-inspector doesn't support natively)
102
125
  // ---------------------------------------------------------------------------
103
126
  const ExtendedThemeContext = createContext(inspectorThemeExtendedLight);
127
+ function DecodedBytesChunk({ decodedText, source, }) {
128
+ const [selectedView, setSelectedView] = useState('decoded');
129
+ const parsed = parseChunkData(decodedText);
130
+ return (_jsxs("div", { className: "min-w-0", children: [selectedView === 'decoded' ? (_jsx("div", { className: "min-w-0", children: typeof parsed === 'string' ? (_jsx("span", { className: "whitespace-pre-wrap break-words", style: { color: 'var(--ds-gray-1000)' }, children: deserializeChunkText(parsed) })) : (_jsx(DataInspector, { data: parsed, expandLevel: 1 })) })) : (_jsx(DecodedBytesInspector, { decodedText: decodedText, source: source })), _jsx("div", { className: "mt-2 flex", children: _jsxs("div", { className: "inline-flex overflow-hidden rounded border", style: { borderColor: 'var(--ds-gray-400)' }, title: `${source.type} decoded as ${source.encoding.toUpperCase()} text. Switch to Bytes to inspect the summarized raw value.`, children: [_jsx("button", { type: "button", className: "h-5 px-1.5 text-[10px] font-medium", style: {
131
+ backgroundColor: selectedView === 'decoded'
132
+ ? 'var(--ds-gray-200)'
133
+ : 'var(--ds-gray-100)',
134
+ color: 'var(--ds-gray-900)',
135
+ }, onClick: () => setSelectedView('decoded'), "aria-pressed": selectedView === 'decoded', "aria-label": "Show decoded text", children: "Decoded" }), _jsx("button", { type: "button", className: "h-5 border-l px-1.5 text-[10px] font-medium", style: {
136
+ borderColor: 'var(--ds-gray-400)',
137
+ backgroundColor: selectedView === 'bytes'
138
+ ? 'var(--ds-gray-200)'
139
+ : 'var(--ds-gray-100)',
140
+ color: 'var(--ds-gray-900)',
141
+ }, onClick: () => setSelectedView('bytes'), "aria-pressed": selectedView === 'bytes', "aria-label": "Show raw bytes summary", children: "Bytes" })] }) })] }));
142
+ }
143
+ function DecodedBytesInspector({ decodedText, source, }) {
144
+ const [expanded, setExpanded] = useState(false);
145
+ return (_jsxs("div", { className: "font-mono", children: [_jsxs("button", { type: "button", className: "flex max-w-full items-start gap-1 text-left", style: { color: 'var(--ds-gray-1000)' }, onClick: () => setExpanded((value) => !value), title: `${source.type} decoded as ${source.encoding.toUpperCase()} text`, children: [_jsx("span", { className: "select-none", style: { color: 'var(--ds-gray-700)' }, children: expanded ? '▼' : '▶' }), _jsx("span", { className: "min-w-0 break-words", children: source.rawSummary })] }), expanded && (_jsxs("div", { className: "mt-1 pl-5", children: [_jsx("span", { style: { color: 'var(--ds-gray-700)' }, children: "decoded: " }), _jsx("span", { className: "whitespace-pre-wrap break-words", style: { color: 'var(--ds-green-900)' }, children: JSON.stringify(decodedText) })] }))] }));
146
+ }
147
+ function BytesDisplayLabel({ name, display, }) {
148
+ return (_jsxs("div", { className: "inline-block min-w-0 align-top", children: [name != null && _jsx(ObjectName, { name: name }), name != null && _jsx("span", { children: ": " }), display.decodedFrom ? (_jsx(DecodedBytesChunk, { decodedText: display.text, source: display.decodedFrom })) : (_jsx("span", { className: "whitespace-pre-wrap break-words", style: { color: 'var(--ds-gray-1000)' }, children: display.text }))] }));
149
+ }
104
150
  // ---------------------------------------------------------------------------
105
151
  // Custom nodeRenderer
106
152
  // ---------------------------------------------------------------------------
@@ -117,6 +163,9 @@ const ExtendedThemeContext = createContext(inspectorThemeExtendedLight);
117
163
  */
118
164
  function NodeRenderer({ depth, name, data, isNonenumerable, }) {
119
165
  const extendedTheme = useContext(ExtendedThemeContext);
166
+ if (isBytesDisplay(data)) {
167
+ return _jsx(BytesDisplayLabel, { name: name, display: data });
168
+ }
120
169
  // Encrypted marker → flat label with Lock icon, clickable when onDecrypt is available
121
170
  if (data !== null &&
122
171
  typeof data === 'object' &&
@@ -172,20 +221,52 @@ function makeOpaqueRef(ref) {
172
221
  }
173
222
  return opaque;
174
223
  }
224
+ function makeBytesDisplay(display) {
225
+ const opaque = Object.create(null);
226
+ Object.defineProperty(opaque, '__type', {
227
+ value: BYTES_DISPLAY_TYPE,
228
+ enumerable: false,
229
+ });
230
+ Object.defineProperty(opaque, 'text', {
231
+ value: display.text,
232
+ enumerable: false,
233
+ });
234
+ Object.defineProperty(opaque, 'decodedFrom', {
235
+ value: display.decodedFrom,
236
+ enumerable: false,
237
+ });
238
+ return opaque;
239
+ }
175
240
  /**
176
- * Recursively walk data and replace RunRef/StreamRef objects with
241
+ * Recursively walk data and replace RunRef/StreamRef/typed array objects with
177
242
  * non-expandable versions so ObjectInspector doesn't show their internals.
178
243
  * Only recurses into plain objects and arrays to avoid stripping class
179
- * instances (Date, Error, Map, Set, URL, Headers, etc.) that have their
180
- * own rendering in NodeRenderer.
244
+ * instances (Date, Error, URL, Headers, etc.) that have their own rendering in
245
+ * NodeRenderer. Map and Set containers are preserved while their contents are
246
+ * prepared for display.
247
+ *
248
+ * Exported for testing the typed-array detection path used by hydrated
249
+ * AI agent stream chunks (e.g. `{ delta: new Uint8Array(...) }`).
181
250
  */
182
- function collapseRefs(data) {
251
+ export function collapseRefs(data) {
183
252
  if (data === null || typeof data !== 'object')
184
253
  return data;
254
+ if (ArrayBuffer.isView(data) && !(data instanceof DataView)) {
255
+ return makeBytesDisplay(formatArrayBufferViewForDisplay(data));
256
+ }
185
257
  if (isRunRef(data) || isStreamRef(data))
186
258
  return makeOpaqueRef(data);
187
259
  if (Array.isArray(data))
188
260
  return data.map(collapseRefs);
261
+ if (data instanceof Map) {
262
+ return new Map(Array.from(data.entries(), ([key, value]) => [
263
+ collapseRefs(key),
264
+ collapseRefs(value),
265
+ ]));
266
+ }
267
+ if (data instanceof Set) {
268
+ return new Set(Array.from(data.values(), collapseRefs));
269
+ }
189
270
  // Only recurse into plain objects — leave class instances untouched
190
271
  const proto = Object.getPrototypeOf(data);
191
272
  if (proto !== Object.prototype && proto !== null)
@@ -235,9 +316,18 @@ function useStableInspectorData(next) {
235
316
  function isObjectLike(value) {
236
317
  return typeof value === 'object' && value !== null;
237
318
  }
319
+ function isSameBytesDisplay(a, b) {
320
+ return (a.text === b.text &&
321
+ a.decodedFrom?.type === b.decodedFrom?.type &&
322
+ a.decodedFrom?.encoding === b.decodedFrom?.encoding &&
323
+ a.decodedFrom?.rawSummary === b.decodedFrom?.rawSummary);
324
+ }
238
325
  function isDeepEqual(a, b, seen = new WeakMap()) {
239
326
  if (Object.is(a, b))
240
327
  return true;
328
+ if (isBytesDisplay(a) || isBytesDisplay(b)) {
329
+ return isBytesDisplay(a) && isBytesDisplay(b) && isSameBytesDisplay(a, b);
330
+ }
241
331
  if (a instanceof Date && b instanceof Date) {
242
332
  return a.getTime() === b.getTime();
243
333
  }
@@ -293,4 +383,4 @@ function isDeepEqual(a, b, seen = new WeakMap()) {
293
383
  }
294
384
  return true;
295
385
  }
296
- //# sourceMappingURL=data-inspector.js.map
386
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1pbnNwZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy91aS9kYXRhLWluc3BlY3Rvci50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOztBQUViOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUNMLGFBQWEsRUFDYixVQUFVLEVBQ1YsU0FBUyxFQUNULE9BQU8sRUFDUCxNQUFNLEVBQ04sUUFBUSxHQUNULE1BQU0sT0FBTyxDQUFDO0FBQ2YsT0FBTyxFQUNMLGVBQWUsRUFDZixXQUFXLEVBQ1gsVUFBVSxFQUNWLGVBQWUsRUFDZixXQUFXLEdBQ1osTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDeEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDN0QsT0FBTyxFQUdMLCtCQUErQixHQUNoQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFFTCxrQkFBa0IsRUFDbEIsMEJBQTBCLEVBQzFCLDJCQUEyQixFQUMzQixtQkFBbUIsR0FDcEIsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFcEMsOEVBQThFO0FBQzlFLDhDQUE4QztBQUM5Qyx3REFBd0Q7QUFDeEQsOEVBQThFO0FBRTlFLE1BQU0sZUFBZSxHQUFHLHlCQUF5QixDQUFDO0FBQ2xELE1BQU0sdUJBQXVCLEdBQUcsaUNBQWlDLENBQUM7QUFDbEUsTUFBTSxZQUFZLEdBQUcsc0JBQXNCLENBQUM7QUFDNUMsTUFBTSxrQkFBa0IsR0FBRyw0QkFBNEIsQ0FBQztBQWtCeEQsU0FBUyxvQkFBb0IsQ0FBQyxJQUFZ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QztJQUNkLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0IsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLEtBQUssQ0FBQyxNQUFNO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFFaEQsS0FBSyxNQUFNLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDekMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIGNsaWVudCc7XG5cbi8qKlxuICogUmV1c2FibGUgZGF0YSBpbnNwZWN0b3IgY29tcG9uZW50IGJ1aWx0IG9uIHJlYWN0LWluc3BlY3Rvci5cbiAqXG4gKiBBbGwgZGF0YSByZW5kZXJpbmcgaW4gdGhlIG8xMXkgVUkgc2hvdWxkIHVzZSB0aGlzIGNvbXBvbmVudCB0byBlbnN1cmVcbiAqIGNvbnNpc3RlbnQgdGhlbWluZywgY3VzdG9tIHR5cGUgaGFuZGxpbmcgKFN0cmVhbVJlZiwgQ2xhc3NJbnN0YW5jZVJlZiksXG4gKiBhbmQgZXhwYW5kIGJlaGF2aW9yLlxuICovXG5cbmltcG9ydCB7IExvY2sgfSBmcm9tICdsdWNpZGUtcmVhY3QnO1xuaW1wb3J0IHtcbiAgY3JlYXRlQ29udGV4dCxcbiAgdXNlQ29udGV4dCxcbiAgdXNlRWZmZWN0LFxuICB1c2VNZW1vLFxuICB1c2VSZWYsXG4gIHVzZVN0YXRlLFxufSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge1xuICBPYmplY3RJbnNwZWN0b3IsXG4gIE9iamVjdExhYmVsLFxuICBPYmplY3ROYW1lLFxuICBPYmplY3RSb290TGFiZWwsXG4gIE9iamVjdFZhbHVlLFxufSBmcm9tICdyZWFjdC1pbnNwZWN0b3InO1xuaW1wb3J0IHsgdXNlRGFya01vZGUgfSBmcm9tICcuLi8uLi9ob29rcy91c2UtZGFyay1tb2RlJztcbmltcG9ydCB7IEVOQ1JZUFRFRF9ESVNQTEFZX05BTUUgfSBmcm9tICcuLi8uLi9saWIvaHlkcmF0aW9uJztcbmltcG9ydCB7XG4gIHR5cGUgRGVjb2RlZFN0cmVhbUNodW5rU291cmNlLFxuICB0eXBlIEZvcm1hdHRlZFN0cmVhbUNodW5rRGlzcGxheSxcbiAgZm9ybWF0QXJyYXlCdWZmZXJWaWV3Rm9yRGlzcGxheSxcbn0gZnJvbSAnLi4vLi4vbGliL3N0cmVhbS1kaXNwbGF5JztcbmltcG9ydCB7XG4gIHR5cGUgSW5zcGVjdG9yVGhlbWVFeHRlbmRlZCxcbiAgaW5zcGVjdG9yVGhlbWVEYXJrLFxuICBpbnNwZWN0b3JUaGVtZUV4dGVuZGVkRGFyayxcbiAgaW5zcGVjdG9yVGhlbWVFeHRlbmRlZExpZ2h0LFxuICBpbnNwZWN0b3JUaGVtZUxpZ2h0LFxufSBmcm9tICcuL2luc3BlY3Rvci10aGVtZSc7XG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tICcuL2J1dHRvbic7XG5pbXBvcnQgeyBTcGlubmVyIH0gZnJvbSAnLi9zcGlubmVyJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdHJlYW1SZWYgLyBDbGFzc0luc3RhbmNlUmVmIHR5cGUgZGV0ZWN0aW9uXG4vLyAoaW5saW5lIHRvIGF2b2lkIGNpcmN1bGFyIGRlcHMgd2l0aCBoeWRyYXRpb24gbW9kdWxlKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNvbnN0IFNUUkVBTV9SRUZfVFlQRSA9ICdfX3dvcmtmbG93X3N0cmVhbV9yZWZfXyc7XG5jb25zdCBDTEFTU19JTlNUQU5DRV9SRUZfVFlQRSA9ICdfX3dvcmtmbG93X2NsYXNzX2luc3RhbmNlX3JlZl9fJztcbmNvbnN0IFJVTl9SRUZfVFlQRSA9ICdfX3dvcmtmbG93X3J1bl9yZWZfXyc7XG5jb25zdCBCWVRFU19ESVNQTEFZX1RZUEUgPSAnX193b3JrZmxvd19ieXRlc19kaXNwbGF5X18nO1xuXG5pbnRlcmZhY2UgU3RyZWFtUmVmIHtcbiAgX190eXBlOiB0eXBlb2YgU1RSRUFNX1JFRl9UWVBFO1xuICBzdHJlYW1JZDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgUnVuUmVmIHtcbiAgX190eXBlOiB0eXBlb2YgUlVOX1JFRl9UWVBFO1xuICBydW5JZDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQnl0ZXNEaXNwbGF5IHtcbiAgX190eXBlOiB0eXBlb2YgQllURVNfRElTUExBWV9UWVBFO1xuICB0ZXh0OiBzdHJpbmc7XG4gIGRlY29kZWRGcm9tPzogRGVjb2RlZFN0cmVhbUNodW5rU291cmNlO1xufVxuXG5mdW5jdGlvbiBkZXNlcmlhbGl6ZUNodW5rVGV4dCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UodGV4dCk7XG4gICAgaWYgKHR5cGVvZiBwYXJzZWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcGFyc2VkO1xuICAgIH1cbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyc2VkLCBudWxsLCAyKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VDaHVua0RhdGEodGV4dDogc3RyaW5nKTogdW5rbm93biB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGV4dCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzU3RyZWFtUmVmKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgU3RyZWFtUmVmIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgLy8gQ2hlY2sgYm90aCBlbnVtZXJhYmxlIGFuZCBub24tZW51bWVyYWJsZSBfX3R5cGUgKG9wYXF1ZSByZWZzIHVzZSBub24tZW51bWVyYWJsZSlcbiAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsICdfX3R5cGUnKTtcbiAgcmV0dXJuIGRlc2M/LnZhbHVlID09PSBTVFJFQU1fUkVGX1RZUEU7XG59XG5cbmZ1bmN0aW9uIGlzUnVuUmVmKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUnVuUmVmIHtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsICdfX3R5cGUnKTtcbiAgcmV0dXJuIGRlc2M/LnZhbHVlID09PSBSVU5fUkVGX1RZUEU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0J5dGVzRGlzcGxheSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIEJ5dGVzRGlzcGxheSB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCAnX190eXBlJyk7XG4gIHJldHVybiBkZXNjPy52YWx1ZSA9PT0gQllURVNfRElTUExBWV9UWVBFO1xufVxuXG5mdW5jdGlvbiBpc0NsYXNzSW5zdGFuY2VSZWYodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyB7XG4gIF9fdHlwZTogc3RyaW5nO1xuICBjbGFzc05hbWU6IHN0cmluZztcbiAgY2xhc3NJZDogc3RyaW5nO1xuICBkYXRhOiB1bmtub3duO1xufSB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgJ19fdHlwZScgaW4gdmFsdWUgJiZcbiAgICAodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLl9fdHlwZSA9PT0gQ0xBU1NfSU5TVEFOQ0VfUkVGX1RZUEVcbiAgKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTdHJlYW0gY2xpY2sgY29udGV4dCAocGFzc2VkIHRocm91Z2ggZnJvbSB0aGUgcGFuZWwpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDb250ZXh0IGZvciBwYXNzaW5nIHN0cmVhbSBjbGljayBoYW5kbGVycyBkb3duIHRvIERhdGFJbnNwZWN0b3IgaW5zdGFuY2VzLlxuICogRXhwb3J0ZWQgc28gdGhhdCBwYXJlbnQgY29tcG9uZW50cyAoZS5nLiwgQXR0cmlidXRlUGFuZWwpIGNhbiBwcm92aWRlIHRoZSBoYW5kbGVyLlxuICovXG5leHBvcnQgY29uc3QgU3RyZWFtQ2xpY2tDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxcbiAgKChzdHJlYW1JZDogc3RyaW5nKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuPih1bmRlZmluZWQpO1xuXG4vKipcbiAqIENvbnRleHQgZm9yIHBhc3NpbmcgYSBkZWNyeXB0IGhhbmRsZXIgZG93biB0byBEYXRhSW5zcGVjdG9yIGluc3RhbmNlcy5cbiAqIFdoZW4gcHJvdmlkZWQsIGVuY3J5cHRlZCBtYXJrZXJzIGJlY29tZSBjbGlja2FibGUgYnV0dG9ucyB0aGF0IHRyaWdnZXIgZGVjcnlwdGlvbi5cbiAqL1xuZXhwb3J0IHR5cGUgRGVjcnlwdENsaWNrQ29udGV4dFZhbHVlID0ge1xuICBvbkRlY3J5cHQ6ICgpID0+IHZvaWQ7XG4gIGlzRGVjcnlwdGluZzogYm9vbGVhbjtcbiAgaGFzRW5jcnlwdGVkRGF0YT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgY29uc3QgRGVjcnlwdENsaWNrQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8XG4gIERlY3J5cHRDbGlja0NvbnRleHRWYWx1ZSB8IHVuZGVmaW5lZFxuPih1bmRlZmluZWQpO1xuXG5leHBvcnQgY29uc3QgUnVuQ2xpY2tDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxcbiAgKChydW5JZDogc3RyaW5nKSA9PiB2b2lkKSB8IHVuZGVmaW5lZFxuPih1bmRlZmluZWQpO1xuXG5mdW5jdGlvbiBFbmNyeXB0ZWRJbmxpbmVMYWJlbCgpIHtcbiAgY29uc3QgY3R4ID0gdXNlQ29udGV4dChEZWNyeXB0Q2xpY2tDb250ZXh0KTtcbiAgaWYgKGN0eCkge1xuICAgIHJldHVybiAoXG4gICAgICA8QnV0dG9uXG4gICAgICAgIHNpemU9XCJ4c1wiXG4gICAgICAgIGNsYXNzTmFtZT1cImFsaWduLWJhc2VsaW5lIGdhcC14LTFcIlxuICAgICAgICBkaXNhYmxlZD17Y3R4LmlzRGVjcnlwdGluZ31cbiAgICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGN0eC5vbkRlY3J5cHQoKTtcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAge2N0eC5pc0RlY3J5cHRpbmcgPyAoXG4gICAgICAgICAgPFNwaW5uZXIgc2l6ZT17MTB9IC8+XG4gICAgICAgICkgOiAoXG4gICAgICAgICAgPExvY2sgY2xhc3NOYW1lPVwiaC0zIHctM1wiIC8+XG4gICAgICAgICl9XG4gICAgICAgIDxzcGFuPkRlY3J5cHQ8L3NwYW4+XG4gICAgICA8L0J1dHRvbj5cbiAgICApO1xuICB9XG4gIHJldHVybiAoXG4gICAgPHNwYW4gc3R5bGU9e3sgY29sb3I6ICd2YXIoLS1kcy1ncmF5LTYwMCknLCBmb250U3R5bGU6ICdpdGFsaWMnIH19PlxuICAgICAgPExvY2tcbiAgICAgICAgY2xhc3NOYW1lPVwiaC0zIHctM1wiXG4gICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgZGlzcGxheTogJ2lubGluZScsXG4gICAgICAgICAgdmVydGljYWxBbGlnbjogJ21pZGRsZScsXG4gICAgICAgICAgbWFyZ2luUmlnaHQ6ICczcHgnLFxuICAgICAgICAgIG1hcmdpblRvcDogJy0xcHgnLFxuICAgICAgICB9fVxuICAgICAgLz5cbiAgICAgIEVuY3J5cHRlZFxuICAgIDwvc3Bhbj5cbiAgKTtcbn1cbmZ1bmN0aW9uIFN0cmVhbVJlZklubGluZSh7IHN0cmVhbVJlZiB9OiB7IHN0cmVhbVJlZjogU3RyZWFtUmVmIH0pIHtcbiAgY29uc3Qgb25TdHJlYW1DbGljayA9IHVzZUNvbnRleHQoU3RyZWFtQ2xpY2tDb250ZXh0KTtcbiAgY29uc3QgW2hvdmVyZWQsIHNldEhvdmVyZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICByZXR1cm4gKFxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0xIHB4LTEuNSBweS0wLjUgcm91bmRlZCB0ZXh0LVsxMHB4XSBmb250LW1vbm8gY3Vyc29yLXBvaW50ZXIgdW5kZXJsaW5lIGRlY29yYXRpb24tdHJhbnNwYXJlbnQgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBob3ZlcmVkID8gJ3ZhcigtLWRzLWJsdWUtMjAwKScgOiAndmFyKC0tZHMtYmx1ZS0xMDApJyxcbiAgICAgICAgY29sb3I6ICd2YXIoLS1kcy1ibHVlLTkwMCknLFxuICAgICAgICBib3JkZXI6ICcxcHggc29saWQgdmFyKC0tZHMtYmx1ZS0zMDApJyxcbiAgICAgIH19XG4gICAgICBvbk1vdXNlRW50ZXI9eygpID0+IHNldEhvdmVyZWQodHJ1ZSl9XG4gICAgICBvbk1vdXNlTGVhdmU9eygpID0+IHNldEhvdmVyZWQoZmFsc2UpfVxuICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgb25TdHJlYW1DbGljaz8uKHN0cmVhbVJlZi5zdHJlYW1JZCk7XG4gICAgICB9fVxuICAgICAgdGl0bGU9e2BWaWV3IHN0cmVhbTogJHtzdHJlYW1SZWYuc3RyZWFtSWR9YH1cbiAgICA+XG4gICAgICA8c3Bhbj7wn5OhPC9zcGFuPlxuICAgICAgPHNwYW4+e3N0cmVhbVJlZi5zdHJlYW1JZH08L3NwYW4+XG4gICAgPC9idXR0b24+XG4gICk7XG59XG5cbmZ1bmN0aW9uIFJ1blJlZklubGluZSh7IHJ1blJlZiB9OiB7IHJ1blJlZjogUnVuUmVmIH0pIHtcbiAgY29uc3Qgb25SdW5DbGljayA9IHVzZUNvbnRleHQoUnVuQ2xpY2tDb250ZXh0KTtcbiAgY29uc3QgW2hvdmVyZWQsIHNldEhvdmVyZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICByZXR1cm4gKFxuICAgIDxidXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0xIHB4LTEuNSBweS0wLjUgcm91bmRlZCB0ZXh0LVsxMHB4XSBmb250LW1vbm8gY3Vyc29yLXBvaW50ZXIgdW5kZXJsaW5lIGRlY29yYXRpb24tdHJhbnNwYXJlbnQgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgc3R5bGU9e3tcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBob3ZlcmVkXG4gICAgICAgICAgPyAndmFyKC0tZHMtcHVycGxlLTIwMCknXG4gICAgICAgICAgOiAndmFyKC0tZHMtcHVycGxlLTEwMCknLFxuICAgICAgICBjb2xvcjogJ3ZhcigtLWRzLXB1cnBsZS05MDApJyxcbiAgICAgICAgYm9yZGVyOiAnMXB4IHNvbGlkIHZhcigtLWRzLXB1cnBsZS0zMDApJyxcbiAgICAgIH19XG4gICAgICBvbk1vdXNlRW50ZXI9eygpID0+IHNldEhvdmVyZWQodHJ1ZSl9XG4gICAgICBvbk1vdXNlTGVhdmU9eygpID0+IHNldEhvdmVyZWQoZmFsc2UpfVxuICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgb25SdW5DbGljaz8uKHJ1blJlZi5ydW5JZCk7XG4gICAgICB9fVxuICAgICAgdGl0bGU9e2BWaWV3IHJ1bjogJHtydW5SZWYucnVuSWR9YH1cbiAgICA+XG4gICAgICA8c3Bhbj57cnVuUmVmLnJ1bklkfTwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFeHRlbmRlZCB0aGVtZSBjb250ZXh0IChmb3IgY29sb3JzIHJlYWN0LWluc3BlY3RvciBkb2Vzbid0IHN1cHBvcnQgbmF0aXZlbHkpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuY29uc3QgRXh0ZW5kZWRUaGVtZUNvbnRleHQgPSBjcmVhdGVDb250ZXh0PEluc3BlY3RvclRoZW1lRXh0ZW5kZWQ+KFxuICBpbnNwZWN0b3JUaGVtZUV4dGVuZGVkTGlnaHRcbik7XG5cbmZ1bmN0aW9uIERlY29kZWRCeXRlc0NodW5rKHtcbiAgZGVjb2RlZFRleHQsXG4gIHNvdXJjZSxcbn06IHtcbiAgZGVjb2RlZFRleHQ6IHN0cmluZztcbiAgc291cmNlOiBEZWNvZGVkU3RyZWFtQ2h1bmtTb3VyY2U7XG59KSB7XG4gIGNvbnN0IFtzZWxlY3RlZFZpZXcsIHNldFNlbGVjdGVkVmlld10gPSB1c2VTdGF0ZTwnZGVjb2RlZCcgfCAnYnl0ZXMnPihcbiAgICAnZGVjb2RlZCdcbiAgKTtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VDaHVua0RhdGEoZGVjb2RlZFRleHQpO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJtaW4tdy0wXCI+XG4gICAgICB7c2VsZWN0ZWRWaWV3ID09PSAnZGVjb2RlZCcgPyAoXG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWluLXctMFwiPlxuICAgICAgICAgIHt0eXBlb2YgcGFyc2VkID09PSAnc3RyaW5nJyA/IChcbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cIndoaXRlc3BhY2UtcHJlLXdyYXAgYnJlYWstd29yZHNcIlxuICAgICAgICAgICAgICBzdHlsZT17eyBjb2xvcjogJ3ZhcigtLWRzLWdyYXktMTAwMCknIH19XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHtkZXNlcmlhbGl6ZUNodW5rVGV4dChwYXJzZWQpfVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8RGF0YUluc3BlY3RvciBkYXRhPXtwYXJzZWR9IGV4cGFuZExldmVsPXsxfSAvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgKSA6IChcbiAgICAgICAgPERlY29kZWRCeXRlc0luc3BlY3RvciBkZWNvZGVkVGV4dD17ZGVjb2RlZFRleHR9IHNvdXJjZT17c291cmNlfSAvPlxuICAgICAgKX1cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMiBmbGV4XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBvdmVyZmxvdy1oaWRkZW4gcm91bmRlZCBib3JkZXJcIlxuICAgICAgICAgIHN0eWxlPXt7IGJvcmRlckNvbG9yOiAndmFyKC0tZHMtZ3JheS00MDApJyB9fVxuICAgICAgICAgIHRpdGxlPXtgJHtzb3VyY2UudHlwZX0gZGVjb2RlZCBhcyAke3NvdXJjZS5lbmNvZGluZy50b1VwcGVyQ2FzZSgpfSB0ZXh0LiBTd2l0Y2ggdG8gQnl0ZXMgdG8gaW5zcGVjdCB0aGUgc3VtbWFyaXplZCByYXcgdmFsdWUuYH1cbiAgICAgICAgPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC01IHB4LTEuNSB0ZXh0LVsxMHB4XSBmb250LW1lZGl1bVwiXG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRWaWV3ID09PSAnZGVjb2RlZCdcbiAgICAgICAgICAgICAgICAgID8gJ3ZhcigtLWRzLWdyYXktMjAwKSdcbiAgICAgICAgICAgICAgICAgIDogJ3ZhcigtLWRzLWdyYXktMTAwKScsXG4gICAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tZHMtZ3JheS05MDApJyxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRTZWxlY3RlZFZpZXcoJ2RlY29kZWQnKX1cbiAgICAgICAgICAgIGFyaWEtcHJlc3NlZD17c2VsZWN0ZWRWaWV3ID09PSAnZGVjb2RlZCd9XG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2hvdyBkZWNvZGVkIHRleHRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIERlY29kZWRcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtNSBib3JkZXItbCBweC0xLjUgdGV4dC1bMTBweF0gZm9udC1tZWRpdW1cIlxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6ICd2YXIoLS1kcy1ncmF5LTQwMCknLFxuICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRWaWV3ID09PSAnYnl0ZXMnXG4gICAgICAgICAgICAgICAgICA/ICd2YXIoLS1kcy1ncmF5LTIwMCknXG4gICAgICAgICAgICAgICAgICA6ICd2YXIoLS1kcy1ncmF5LTEwMCknLFxuICAgICAgICAgICAgICBjb2xvcjogJ3ZhcigtLWRzLWdyYXktOTAwKScsXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0U2VsZWN0ZWRWaWV3KCdieXRlcycpfVxuICAgICAgICAgICAgYXJpYS1wcmVzc2VkPXtzZWxlY3RlZFZpZXcgPT09ICdieXRlcyd9XG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2hvdyByYXcgYnl0ZXMgc3VtbWFyeVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgQnl0ZXNcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKTtcbn1cblxuZnVuY3Rpb24gRGVjb2RlZEJ5dGVzSW5zcGVjdG9yKHtcbiAgZGVjb2RlZFRleHQsXG4gIHNvdXJjZSxcbn06IHtcbiAgZGVjb2RlZFRleHQ6IHN0cmluZztcbiAgc291cmNlOiBEZWNvZGVkU3RyZWFtQ2h1bmtTb3VyY2U7XG59KSB7XG4gIGNvbnN0IFtleHBhbmRlZCwgc2V0RXhwYW5kZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmb250LW1vbm9cIj5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIGNsYXNzTmFtZT1cImZsZXggbWF4LXctZnVsbCBpdGVtcy1zdGFydCBnYXAtMSB0ZXh0LWxlZnRcIlxuICAgICAgICBzdHlsZT17eyBjb2xvcjogJ3ZhcigtLWRzLWdyYXktMTAwMCknIH19XG4gICAgICAgIG9uQ2xpY2s9eygpID0+IHNldEV4cGFuZGVkKCh2YWx1ZSkgPT4gIXZhbHVlKX1cbiAgICAgICAgdGl0bGU9e2Ake3NvdXJjZS50eXBlfSBkZWNvZGVkIGFzICR7c291cmNlLmVuY29kaW5nLnRvVXBwZXJDYXNlKCl9IHRleHRgfVxuICAgICAgPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJzZWxlY3Qtbm9uZVwiIHN0eWxlPXt7IGNvbG9yOiAndmFyKC0tZHMtZ3JheS03MDApJyB9fT5cbiAgICAgICAgICB7ZXhwYW5kZWQgPyAn4pa8JyA6ICfilrYnfVxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1pbi13LTAgYnJlYWstd29yZHNcIj57c291cmNlLnJhd1N1bW1hcnl9PC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgICB7ZXhwYW5kZWQgJiYgKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTEgcGwtNVwiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPXt7IGNvbG9yOiAndmFyKC0tZHMtZ3JheS03MDApJyB9fT5kZWNvZGVkOiA8L3NwYW4+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cIndoaXRlc3BhY2UtcHJlLXdyYXAgYnJlYWstd29yZHNcIlxuICAgICAgICAgICAgc3R5bGU9e3sgY29sb3I6ICd2YXIoLS1kcy1ncmVlbi05MDApJyB9fVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtKU09OLnN0cmluZ2lmeShkZWNvZGVkVGV4dCl9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbmZ1bmN0aW9uIEJ5dGVzRGlzcGxheUxhYmVsKHtcbiAgbmFtZSxcbiAgZGlzcGxheSxcbn06IHtcbiAgbmFtZT86IHN0cmluZztcbiAgZGlzcGxheTogQnl0ZXNEaXNwbGF5O1xufSkge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiaW5saW5lLWJsb2NrIG1pbi13LTAgYWxpZ24tdG9wXCI+XG4gICAgICB7bmFtZSAhPSBudWxsICYmIDxPYmplY3ROYW1lIG5hbWU9e25hbWV9IC8+fVxuICAgICAge25hbWUgIT0gbnVsbCAmJiA8c3Bhbj46IDwvc3Bhbj59XG4gICAgICB7ZGlzcGxheS5kZWNvZGVkRnJvbSA/IChcbiAgICAgICAgPERlY29kZWRCeXRlc0NodW5rXG4gICAgICAgICAgZGVjb2RlZFRleHQ9e2Rpc3BsYXkudGV4dH1cbiAgICAgICAgICBzb3VyY2U9e2Rpc3BsYXkuZGVjb2RlZEZyb219XG4gICAgICAgIC8+XG4gICAgICApIDogKFxuICAgICAgICA8c3BhblxuICAgICAgICAgIGNsYXNzTmFtZT1cIndoaXRlc3BhY2UtcHJlLXdyYXAgYnJlYWstd29yZHNcIlxuICAgICAgICAgIHN0eWxlPXt7IGNvbG9yOiAndmFyKC0tZHMtZ3JheS0xMDAwKScgfX1cbiAgICAgICAgPlxuICAgICAgICAgIHtkaXNwbGF5LnRleHR9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ3VzdG9tIG5vZGVSZW5kZXJlclxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogRXh0ZW5kcyB0aGUgZGVmYXVsdCByZWFjdC1pbnNwZWN0b3Igbm9kZVJlbmRlcmVyIHdpdGggc3BlY2lhbCBoYW5kbGluZ1xuICogZm9yIENsYXNzSW5zdGFuY2VSZWYsIFN0cmVhbVJlZiwgYW5kIERhdGUgdHlwZXMuXG4gKlxuICogcmVhY3QtaW5zcGVjdG9yIHJlbmRlcnMgRGF0ZSBpbnN0YW5jZXMgYXMgdW5zdHlsZWQgcGxhaW4gdGV4dCAobm8gdGhlbWVcbiAqIGtleSBleGlzdHMgZm9yIHRoZW0pLCBzbyB3ZSBpbnRlcmNlcHQgaGVyZSBhbmQgYXBwbHkgdGhlIG1hZ2VudGEgY29sb3JcbiAqIGZyb20gb3VyIGV4dGVuZGVkIHRoZW1lIOKAlCBtYXRjaGluZyBOb2RlLmpzIHV0aWwuaW5zcGVjdCgpJ3MgZGF0ZSBzdHlsZS5cbiAqXG4gKiBEZWZhdWx0IG5vZGVSZW5kZXJlciByZWZlcmVuY2U6XG4gKiBodHRwczovL2dpdGh1Yi5jb20vc3Rvcnlib29ranMvcmVhY3QtaW5zcGVjdG9yL2Jsb2IvbWFpbi9SRUFETUUubWQjbm9kZXJlbmRlcmVyXG4gKi9cbmZ1bmN0aW9uIE5vZGVSZW5kZXJlcih7XG4gIGRlcHRoLFxuICBuYW1lLFxuICBkYXRhLFxuICBpc05vbmVudW1lcmFibGUsXG59OiB7XG4gIGRlcHRoOiBudW1iZXI7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIGRhdGE6IHVua25vd247XG4gIGlzTm9uZW51bWVyYWJsZT86IGJvb2xlYW47XG4gIGV4cGFuZGVkPzogYm9vbGVhbjtcbn0pIHtcbiAgY29uc3QgZXh0ZW5kZWRUaGVtZSA9IHVzZUNvbnRleHQoRXh0ZW5kZWRUaGVtZUNvbnRleHQpO1xuXG4gIGlmIChpc0J5dGVzRGlzcGxheShkYXRhKSkge1xuICAgIHJldHVybiA8Qnl0ZXNEaXNwbGF5TGFiZWwgbmFtZT17bmFtZX0gZGlzcGxheT17ZGF0YX0gLz47XG4gIH1cblxuICAvLyBFbmNyeXB0ZWQgbWFya2VyIOKGkiBmbGF0IGxhYmVsIHdpdGggTG9jayBpY29uLCBjbGlja2FibGUgd2hlbiBvbkRlY3J5cHQgaXMgYXZhaWxhYmxlXG4gIGlmIChcbiAgICBkYXRhICE9PSBudWxsICYmXG4gICAgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgZGF0YS5jb25zdHJ1Y3Rvcj8ubmFtZSA9PT0gRU5DUllQVEVEX0RJU1BMQVlfTkFNRVxuICApIHtcbiAgICBjb25zdCBsYWJlbCA9IDxFbmNyeXB0ZWRJbmxpbmVMYWJlbCAvPjtcbiAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgIHJldHVybiBsYWJlbDtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIDxzcGFuPlxuICAgICAgICB7bmFtZSAhPSBudWxsICYmIDxPYmplY3ROYW1lIG5hbWU9e25hbWV9IC8+fVxuICAgICAgICB7bmFtZSAhPSBudWxsICYmIDxzcGFuPjogPC9zcGFuPn1cbiAgICAgICAge2xhYmVsfVxuICAgICAgPC9zcGFuPlxuICAgICk7XG4gIH1cblxuICAvLyBTdHJlYW1SZWYg4oaSIGlubGluZSBjbGlja2FibGUgYmFkZ2VcbiAgaWYgKGlzU3RyZWFtUmVmKGRhdGEpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxzcGFuPlxuICAgICAgICB7bmFtZSAhPSBudWxsICYmIDxPYmplY3ROYW1lIG5hbWU9e25hbWV9IC8+fVxuICAgICAgICB7bmFtZSAhPSBudWxsICYmIDxzcGFuPjogPC9zcGFuPn1cbiAgICAgICAgPFN0cmVhbVJlZklubGluZSBzdHJlYW1SZWY9e2RhdGF9IC8+XG4gICAgICA8L3NwYW4+XG4gICAgKTtcbiAgfVxuXG4gIC8vIFJ1blJlZiDihpIgaW5saW5lIGNsaWNrYWJsZSBiYWRnZSBsaW5raW5nIHRvIHRoZSB0YXJnZXQgcnVuXG4gIGlmIChpc1J1blJlZihkYXRhKSkge1xuICAgIHJldHVybiAoXG4gICAgICA8c3Bhbj5cbiAgICAgICAge25hbWUgIT0gbnVsbCAmJiA8T2JqZWN0TmFtZSBuYW1lPXtuYW1lfSAvPn1cbiAgICAgICAge25hbWUgIT0gbnVsbCAmJiA8c3Bhbj46IDwvc3Bhbj59XG4gICAgICAgIDxSdW5SZWZJbmxpbmUgcnVuUmVmPXtkYXRhfSAvPlxuICAgICAgPC9zcGFuPlxuICAgICk7XG4gIH1cblxuICAvLyBDbGFzc0luc3RhbmNlUmVmIOKGkiBzaG93IGNsYXNzTmFtZSBhcyB0eXBlLCBkYXRhIGFzIHRoZSBpbnNwZWN0YWJsZSB2YWx1ZVxuICBpZiAoaXNDbGFzc0luc3RhbmNlUmVmKGRhdGEpKSB7XG4gICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICByZXR1cm4gPE9iamVjdFJvb3RMYWJlbCBuYW1lPXtkYXRhLmNsYXNzTmFtZX0gZGF0YT17ZGF0YS5kYXRhfSAvPjtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIDxzcGFuPlxuICAgICAgICB7bmFtZSAhPSBudWxsICYmIDxPYmplY3ROYW1lIG5hbWU9e25hbWV9IC8+fVxuICAgICAgICB7bmFtZSAhPSBudWxsICYmIDxzcGFuPjogPC9zcGFuPn1cbiAgICAgICAgPHNwYW4gc3R5bGU9e3sgZm9udFN0eWxlOiAnaXRhbGljJyB9fT57ZGF0YS5jbGFzc05hbWV9IDwvc3Bhbj5cbiAgICAgICAgPE9iamVjdFZhbHVlIG9iamVjdD17ZGF0YS5kYXRhfSAvPlxuICAgICAgPC9zcGFuPlxuICAgICk7XG4gIH1cblxuICAvLyBEYXRlIOKGkiBtYWdlbnRhIGNvbG9yIChOb2RlLmpzOiAnZGF0ZScg4oaSICdtYWdlbnRhJylcbiAgLy8gcmVhY3QtaW5zcGVjdG9yIGhhcyBubyBPQkpFQ1RfVkFMVUVfREFURV9DT0xPUiB0aGVtZSBrZXksIHNvIHdlIGhhbmRsZSBpdCBoZXJlLlxuICBpZiAoZGF0YSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICBjb25zdCBkYXRlU3RyID0gZGF0YS50b0lTT1N0cmluZygpO1xuICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPHNwYW4gc3R5bGU9e3sgY29sb3I6IGV4dGVuZGVkVGhlbWUuT0JKRUNUX1ZBTFVFX0RBVEVfQ09MT1IgfX0+XG4gICAgICAgICAge2RhdGVTdHJ9XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAoXG4gICAgICA8c3Bhbj5cbiAgICAgICAge25hbWUgIT0gbnVsbCAmJiA8T2JqZWN0TmFtZSBuYW1lPXtuYW1lfSAvPn1cbiAgICAgICAge25hbWUgIT0gbnVsbCAmJiA8c3Bhbj46IDwvc3Bhbj59XG4gICAgICAgIDxzcGFuIHN0eWxlPXt7IGNvbG9yOiBleHRlbmRlZFRoZW1lLk9CSkVDVF9WQUxVRV9EQVRFX0NPTE9SIH19PlxuICAgICAgICAgIHtkYXRlU3RyfVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L3NwYW4+XG4gICAgKTtcbiAgfVxuXG4gIC8vIERlZmF1bHQgcmVuZGVyaW5nIChzYW1lIGFzIHJlYWN0LWluc3BlY3RvcidzIGJ1aWx0LWluKVxuICBpZiAoZGVwdGggPT09IDApIHtcbiAgICByZXR1cm4gPE9iamVjdFJvb3RMYWJlbCBuYW1lPXtuYW1lfSBkYXRhPXtkYXRhfSAvPjtcbiAgfVxuICByZXR1cm4gKFxuICAgIDxPYmplY3RMYWJlbCBuYW1lPXtuYW1lfSBkYXRhPXtkYXRhfSBpc05vbmVudW1lcmFibGU9e2lzTm9uZW51bWVyYWJsZX0gLz5cbiAgKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWJsaWMgY29tcG9uZW50XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDcmVhdGUgYSBub24tZXhwYW5kYWJsZSB3cmFwcGVyIHRoYXQgY2FycmllcyByZWYgZGF0YSBhcyBub24tZW51bWVyYWJsZVxuICogcHJvcGVydGllcy4gT2JqZWN0SW5zcGVjdG9yIHdvbid0IHJlbmRlciBjaGlsZHJlbiBmb3Igb2JqZWN0cyB3aXRoIG5vXG4gKiBlbnVtZXJhYmxlIGtleXMsIGJ1dCBvdXIgTm9kZVJlbmRlcmVyIGNhbiBzdGlsbCBkZXRlY3QgdGhlbS5cbiAqL1xuZnVuY3Rpb24gbWFrZU9wYXF1ZVJlZihyZWY6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdW5rbm93biB7XG4gIGNvbnN0IG9wYXF1ZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlZikpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3BhcXVlLCBrZXksIHsgdmFsdWUsIGVudW1lcmFibGU6IGZhbHNlIH0pO1xuICB9XG4gIHJldHVybiBvcGFxdWU7XG59XG5cbmZ1bmN0aW9uIG1ha2VCeXRlc0Rpc3BsYXkoZGlzcGxheTogRm9ybWF0dGVkU3RyZWFtQ2h1bmtEaXNwbGF5KTogdW5rbm93biB7XG4gIGNvbnN0IG9wYXF1ZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvcGFxdWUsICdfX3R5cGUnLCB7XG4gICAgdmFsdWU6IEJZVEVTX0RJU1BMQVlfVFlQRSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvcGFxdWUsICd0ZXh0Jywge1xuICAgIHZhbHVlOiBkaXNwbGF5LnRleHQsXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkob3BhcXVlLCAnZGVjb2RlZEZyb20nLCB7XG4gICAgdmFsdWU6IGRpc3BsYXkuZGVjb2RlZEZyb20sXG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gIH0pO1xuICByZXR1cm4gb3BhcXVlO1xufVxuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IHdhbGsgZGF0YSBhbmQgcmVwbGFjZSBSdW5SZWYvU3RyZWFtUmVmL3R5cGVkIGFycmF5IG9iamVjdHMgd2l0aFxuICogbm9uLWV4cGFuZGFibGUgdmVyc2lvbnMgc28gT2JqZWN0SW5zcGVjdG9yIGRvZXNuJ3Qgc2hvdyB0aGVpciBpbnRlcm5hbHMuXG4gKiBPbmx5IHJlY3Vyc2VzIGludG8gcGxhaW4gb2JqZWN0cyBhbmQgYXJyYXlzIHRvIGF2b2lkIHN0cmlwcGluZyBjbGFzc1xuICogaW5zdGFuY2VzIChEYXRlLCBFcnJvciwgVVJMLCBIZWFkZXJzLCBldGMuKSB0aGF0IGhhdmUgdGhlaXIgb3duIHJlbmRlcmluZyBpblxuICogTm9kZVJlbmRlcmVyLiBNYXAgYW5kIFNldCBjb250YWluZXJzIGFyZSBwcmVzZXJ2ZWQgd2hpbGUgdGhlaXIgY29udGVudHMgYXJlXG4gKiBwcmVwYXJlZCBmb3IgZGlzcGxheS5cbiAqXG4gKiBFeHBvcnRlZCBmb3IgdGVzdGluZyB0aGUgdHlwZWQtYXJyYXkgZGV0ZWN0aW9uIHBhdGggdXNlZCBieSBoeWRyYXRlZFxuICogQUkgYWdlbnQgc3RyZWFtIGNodW5rcyAoZS5nLiBgeyBkZWx0YTogbmV3IFVpbnQ4QXJyYXkoLi4uKSB9YCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsYXBzZVJlZnMoZGF0YTogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAoZGF0YSA9PT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHJldHVybiBkYXRhO1xuICBpZiAoQXJyYXlCdWZmZXIuaXNWaWV3KGRhdGEpICYmICEoZGF0YSBpbnN0YW5jZW9mIERhdGFWaWV3KSkge1xuICAgIHJldHVybiBtYWtlQnl0ZXNEaXNwbGF5KGZvcm1hdEFycmF5QnVmZmVyVmlld0ZvckRpc3BsYXkoZGF0YSkpO1xuICB9XG4gIGlmIChpc1J1blJlZihkYXRhKSB8fCBpc1N0cmVhbVJlZihkYXRhKSlcbiAgICByZXR1cm4gbWFrZU9wYXF1ZVJlZihkYXRhIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkgcmV0dXJuIGRhdGEubWFwKGNvbGxhcHNlUmVmcyk7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgTWFwKSB7XG4gICAgcmV0dXJuIG5ldyBNYXAoXG4gICAgICBBcnJheS5mcm9tKGRhdGEuZW50cmllcygpLCAoW2tleSwgdmFsdWVdKSA9PiBbXG4gICAgICAgIGNvbGxhcHNlUmVmcyhrZXkpLFxuICAgICAgICBjb2xsYXBzZVJlZnModmFsdWUpLFxuICAgICAgXSlcbiAgICApO1xuICB9XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgcmV0dXJuIG5ldyBTZXQoQXJyYXkuZnJvbShkYXRhLnZhbHVlcygpLCBjb2xsYXBzZVJlZnMpKTtcbiAgfVxuICAvLyBPbmx5IHJlY3Vyc2UgaW50byBwbGFpbiBvYmplY3RzIOKAlCBsZWF2ZSBjbGFzcyBpbnN0YW5jZXMgdW50b3VjaGVkXG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGRhdGEpO1xuICBpZiAocHJvdG8gIT09IE9iamVjdC5wcm90b3R5cGUgJiYgcHJvdG8gIT09IG51bGwpIHJldHVybiBkYXRhO1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XG4gICAgcmVzdWx0W2tleV0gPSBjb2xsYXBzZVJlZnModmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YUluc3BlY3RvclByb3BzIHtcbiAgLyoqIFRoZSBkYXRhIHRvIGluc3BlY3QgKi9cbiAgZGF0YTogdW5rbm93bjtcbiAgLyoqIEluaXRpYWwgZXhwYW5kIGRlcHRoIChkZWZhdWx0OiAyKSAqL1xuICBleHBhbmRMZXZlbD86IG51bWJlcjtcbiAgLyoqIE9wdGlvbmFsIG5hbWUgZm9yIHRoZSByb290IG5vZGUgKi9cbiAgbmFtZT86IHN0cmluZztcbiAgLyoqIENhbGxiYWNrIHdoZW4gYSBzdHJlYW0gcmVmZXJlbmNlIGlzIGNsaWNrZWQgKi9cbiAgb25TdHJlYW1DbGljaz86IChzdHJlYW1JZDogc3RyaW5nKSA9PiB2b2lkO1xuICAvKiogQ2FsbGJhY2sgd2hlbiBhIHJ1biByZWZlcmVuY2UgaXMgY2xpY2tlZCAqL1xuICBvblJ1bkNsaWNrPzogKHJ1bklkOiBzdHJpbmcpID0+IHZvaWQ7XG4gIC8qKiBDYWxsYmFjayB3aGVuIGFuIGVuY3J5cHRlZCBtYXJrZXIgaXMgY2xpY2tlZCAodHJpZ2dlcnMgZGVjcnlwdGlvbikgKi9cbiAgb25EZWNyeXB0PzogKCkgPT4gdm9pZDtcbiAgLyoqIFdoZXRoZXIgZGVjcnlwdGlvbiBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MgKi9cbiAgaXNEZWNyeXB0aW5nPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIERhdGFJbnNwZWN0b3Ioe1xuICBkYXRhLFxuICBleHBhbmRMZXZlbCA9IDIsXG4gIG5hbWUsXG4gIG9uU3RyZWFtQ2xpY2ssXG4gIG9uUnVuQ2xpY2ssXG4gIG9uRGVjcnlwdCxcbiAgaXNEZWNyeXB0aW5nID0gZmFsc2UsXG59OiBEYXRhSW5zcGVjdG9yUHJvcHMpIHtcbiAgY29uc3QgY29sbGFwc2VkRGF0YSA9IHVzZU1lbW8oKCkgPT4gY29sbGFwc2VSZWZzKGRhdGEpLCBbZGF0YV0pO1xuICBjb25zdCBzdGFibGVEYXRhID0gdXNlU3RhYmxlSW5zcGVjdG9yRGF0YShjb2xsYXBzZWREYXRhKTtcbiAgY29uc3QgW2luaXRpYWxFeHBhbmRMZXZlbCwgc2V0SW5pdGlhbEV4cGFuZExldmVsXSA9IHVzZVN0YXRlKGV4cGFuZExldmVsKTtcbiAgY29uc3QgaXNEYXJrID0gdXNlRGFya01vZGUoKTtcbiAgY29uc3QgZXh0ZW5kZWRUaGVtZSA9IGlzRGFya1xuICAgID8gaW5zcGVjdG9yVGhlbWVFeHRlbmRlZERhcmtcbiAgICA6IGluc3BlY3RvclRoZW1lRXh0ZW5kZWRMaWdodDtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIC8vIHJlYWN0LWluc3BlY3RvciByZWFwcGxpZXMgZXhwYW5kTGV2ZWwgb24gZXZlcnkgZGF0YSBjaGFuZ2UsIHdoaWNoIGNhblxuICAgIC8vIHJlb3BlbiBwYXRocyB0aGUgdXNlciBtYW51YWxseSBjb2xsYXBzZWQuIEFwcGx5IGl0IG9ubHkgb24gbW91bnQuXG4gICAgc2V0SW5pdGlhbEV4cGFuZExldmVsKDApO1xuICB9LCBbXSk7XG5cbiAgY29uc3QgY29udGVudCA9IChcbiAgICA8RXh0ZW5kZWRUaGVtZUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2V4dGVuZGVkVGhlbWV9PlxuICAgICAgPE9iamVjdEluc3BlY3RvclxuICAgICAgICBkYXRhPXtzdGFibGVEYXRhfVxuICAgICAgICBuYW1lPXtuYW1lfVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHJlYWN0LWluc3BlY3RvciBhY2NlcHRzIHRoZW1lIG9iamVjdHMgYXQgcnVudGltZSBkZXNwaXRlXG4gICAgICAgIC8vIHR5cGVzIGRlY2xhcmluZyBzdHJpbmcgb25seSDigJQgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9zdG9yeWJvb2tqcy9yZWFjdC1pbnNwZWN0b3IvYmxvYi9tYWluL1JFQURNRS5tZCN0aGVtZVxuICAgICAgICB0aGVtZT17aXNEYXJrID8gaW5zcGVjdG9yVGhlbWVEYXJrIDogaW5zcGVjdG9yVGhlbWVMaWdodH1cbiAgICAgICAgZXhwYW5kTGV2ZWw9e2luaXRpYWxFeHBhbmRMZXZlbH1cbiAgICAgICAgbm9kZVJlbmRlcmVyPXtOb2RlUmVuZGVyZXJ9XG4gICAgICAvPlxuICAgIDwvRXh0ZW5kZWRUaGVtZUNvbnRleHQuUHJvdmlkZXI+XG4gICk7XG5cbiAgbGV0IHdyYXBwZWQgPSBjb250ZW50O1xuXG4gIGlmIChvblN0cmVhbUNsaWNrKSB7XG4gICAgd3JhcHBlZCA9IChcbiAgICAgIDxTdHJlYW1DbGlja0NvbnRleHQuUHJvdmlkZXIgdmFsdWU9e29uU3RyZWFtQ2xpY2t9PlxuICAgICAgICB7d3JhcHBlZH1cbiAgICAgIDwvU3RyZWFtQ2xpY2tDb250ZXh0LlByb3ZpZGVyPlxuICAgICk7XG4gIH1cbiAgaWYgKG9uUnVuQ2xpY2spIHtcbiAgICB3cmFwcGVkID0gKFxuICAgICAgPFJ1bkNsaWNrQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17b25SdW5DbGlja30+XG4gICAgICAgIHt3cmFwcGVkfVxuICAgICAgPC9SdW5DbGlja0NvbnRleHQuUHJvdmlkZXI+XG4gICAgKTtcbiAgfVxuICBpZiAob25EZWNyeXB0KSB7XG4gICAgd3JhcHBlZCA9IChcbiAgICAgIDxEZWNyeXB0Q2xpY2tDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt7IG9uRGVjcnlwdCwgaXNEZWNyeXB0aW5nIH19PlxuICAgICAgICB7d3JhcHBlZH1cbiAgICAgIDwvRGVjcnlwdENsaWNrQ29udGV4dC5Qcm92aWRlcj5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHdyYXBwZWQ7XG59XG5cbmZ1bmN0aW9uIHVzZVN0YWJsZUluc3BlY3RvckRhdGE8VD4obmV4dDogVCk6IFQge1xuICBjb25zdCBwcmV2aW91c1JlZiA9IHVzZVJlZjxUPihuZXh0KTtcbiAgaWYgKCFpc0RlZXBFcXVhbChwcmV2aW91c1JlZi5jdXJyZW50LCBuZXh0KSkge1xuICAgIHByZXZpb3VzUmVmLmN1cnJlbnQgPSBuZXh0O1xuICB9XG4gIHJldHVybiBwcmV2aW91c1JlZi5jdXJyZW50O1xufVxuXG5mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiBpc1NhbWVCeXRlc0Rpc3BsYXkoYTogQnl0ZXNEaXNwbGF5LCBiOiBCeXRlc0Rpc3BsYXkpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBhLnRleHQgPT09IGIudGV4dCAmJlxuICAgIGEuZGVjb2RlZEZyb20/LnR5cGUgPT09IGIuZGVjb2RlZEZyb20/LnR5cGUgJiZcbiAgICBhLmRlY29kZWRGcm9tPy5lbmNvZGluZyA9PT0gYi5kZWNvZGVkRnJvbT8uZW5jb2RpbmcgJiZcbiAgICBhLmRlY29kZWRGcm9tPy5yYXdTdW1tYXJ5ID09PSBiLmRlY29kZWRGcm9tPy5yYXdTdW1tYXJ5XG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzRGVlcEVxdWFsKGE6IHVua25vd24sIGI6IHVua25vd24sIHNlZW4gPSBuZXcgV2Vha01hcCgpKTogYm9vbGVhbiB7XG4gIGlmIChPYmplY3QuaXMoYSwgYikpIHJldHVybiB0cnVlO1xuXG4gIGlmIChpc0J5dGVzRGlzcGxheShhKSB8fCBpc0J5dGVzRGlzcGxheShiKSkge1xuICAgIHJldHVybiBpc0J5dGVzRGlzcGxheShhKSAmJiBpc0J5dGVzRGlzcGxheShiKSAmJiBpc1NhbWVCeXRlc0Rpc3BsYXkoYSwgYik7XG4gIH1cblxuICBpZiAoYSBpbnN0YW5jZW9mIERhdGUgJiYgYiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gYS5nZXRUaW1lKCkgPT09IGIuZ2V0VGltZSgpO1xuICB9XG5cbiAgaWYgKGEgaW5zdGFuY2VvZiBSZWdFeHAgJiYgYiBpbnN0YW5jZW9mIFJlZ0V4cCkge1xuICAgIHJldHVybiBhLnNvdXJjZSA9PT0gYi5zb3VyY2UgJiYgYS5mbGFncyA9PT0gYi5mbGFncztcbiAgfVxuXG4gIGlmIChhIGluc3RhbmNlb2YgTWFwICYmIGIgaW5zdGFuY2VvZiBNYXApIHtcbiAgICBpZiAoYS5zaXplICE9PSBiLnNpemUpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBhLmVudHJpZXMoKSkge1xuICAgICAgaWYgKCFiLmhhcyhrZXkpIHx8ICFpc0RlZXBFcXVhbCh2YWx1ZSwgYi5nZXQoa2V5KSwgc2VlbikpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoYSBpbnN0YW5jZW9mIFNldCAmJiBiIGluc3RhbmNlb2YgU2V0KSB7XG4gICAgaWYgKGEuc2l6ZSAhPT0gYi5zaXplKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBhLnZhbHVlcygpKSB7XG4gICAgICBpZiAoIWIuaGFzKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmICghaXNPYmplY3RMaWtlKGEpIHx8ICFpc09iamVjdExpa2UoYikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoc2Vlbi5nZXQoYSkgPT09IGIpIHJldHVybiB0cnVlO1xuICBzZWVuLnNldChhLCBiKTtcblxuICBjb25zdCBhSXNBcnJheSA9IEFycmF5LmlzQXJyYXkoYSk7XG4gIGNvbnN0IGJJc0FycmF5ID0gQXJyYXkuaXNBcnJheShiKTtcbiAgaWYgKGFJc0FycmF5ICE9PSBiSXNBcnJheSkgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChhSXNBcnJheSAmJiBiSXNBcnJheSkge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGlmICghaXNEZWVwRXF1YWwoYVtpXSwgYltpXSwgc2VlbikpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBhS2V5cyA9IE9iamVjdC5rZXlzKGEpO1xuICBjb25zdCBiS2V5cyA9IE9iamVjdC5rZXlzKGIpO1xuICBpZiAoYUtleXMubGVuZ3RoICE9PSBiS2V5cy5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBhS2V5cykge1xuICAgIGlmICghT2JqZWN0Lmhhc093bihiLCBrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKCFpc0RlZXBFcXVhbChhW2tleV0sIGJba2V5XSwgc2VlbikpIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuIl19
@@ -9,4 +9,4 @@ const STYLES = `.wf-decrypt-btn{appearance:none;-webkit-appearance:none;border:n
9
9
  export function DecryptButton({ decrypted = false, loading = false, onClick, }) {
10
10
  return (_jsxs(_Fragment, { children: [_jsx("style", { dangerouslySetInnerHTML: { __html: STYLES } }), _jsxs("button", { type: "button", onClick: decrypted ? undefined : onClick, disabled: decrypted || loading, className: `wf-decrypt-btn ${decrypted ? 'wf-decrypt-done' : 'wf-decrypt-idle'}`, children: [loading ? (_jsx(Spinner, { size: 14 })) : decrypted ? (_jsxs("svg", { width: 14, height: 14, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("rect", { x: "3", y: "11", width: "18", height: "11", rx: "2", ry: "2" }), _jsx("path", { d: "M7 11V7a5 5 0 0 1 9.9-1" })] })) : (_jsxs("svg", { width: 14, height: 14, viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("rect", { x: "3", y: "11", width: "18", height: "11", rx: "2", ry: "2" }), _jsx("path", { d: "M7 11V7a5 5 0 0 1 10 0v4" })] })), loading ? 'Decrypting…' : decrypted ? 'Decrypted' : 'Decrypt'] })] }));
11
11
  }
12
- //# sourceMappingURL=decrypt-button.js.map
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjcnlwdC1idXR0b24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy91aS9kZWNyeXB0LWJ1dHRvbi50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOztBQUViLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFcEMsTUFBTSxNQUFNLEdBQUcsMmxCQUEybEIsQ0FBQztBQVczbUI7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxFQUM1QixTQUFTLEdBQUcsS0FBSyxFQUNqQixPQUFPLEdBQUcsS0FBSyxFQUNmLE9BQU8sR0FDWTtJQUNuQixPQUFPLENBQ0wsOEJBQ0UsZ0JBQU8sdUJBQXVCLEVBQUUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUksRUFDdEQsa0JBQ0UsSUFBSSxFQUFDLFFBQVEsRUFDYixPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFDeEMsUUFBUSxFQUFFLFNBQVMsSUFBSSxPQUFPLEVBQzlCLFNBQVMsRUFBRSxrQkFBa0IsU0FBUyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsYUFFL0UsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUNULEtBQUMsT0FBTyxJQUFDLElBQUksRUFBRSxFQUFFLEdBQUksQ0FDdEIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUNkLGVBQ0UsS0FBSyxFQUFFLEVBQUUsRUFDVCxNQUFNLEVBQUUsRUFBRSxFQUNWLE9BQU8sRUFBQyxXQUFXLEVBQ25CLElBQUksRUFBQyxNQUFNLEVBQ1gsTUFBTSxFQUFDLGNBQWMsRUFDckIsV0FBVyxFQUFFLENBQUMsRUFDZCxhQUFhLEVBQUMsT0FBTyxFQUNyQixjQUFjLEVBQUMsT0FBTyxhQUV0QixlQUFNLENBQUMsRUFBQyxHQUFHLEVBQUMsQ0FBQyxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsSUFBSSxFQUFDLE1BQU0sRUFBQyxJQUFJLEVBQUMsRUFBRSxFQUFDLEdBQUcsRUFBQyxFQUFFLEVBQUMsR0FBRyxHQUFHLEVBQzFELGVBQU0sQ0FBQyxFQUFDLHlCQUF5QixHQUFHLElBQ2hDLENBQ1AsQ0FBQyxDQUFDLENBQUMsQ0FDRixlQUNFLEtBQUssRUFBRSxFQUFFLEVBQ1QsTUFBTSxFQUFFLEVBQUUsRUFDVixPQUFPLEVBQUMsV0FBVyxFQUNuQixJQUFJLEVBQUMsTUFBTSxFQUNYLE1BQU0sRUFBQyxjQUFjLEVBQ3JCLFdBQVcsRUFBRSxDQUFDLEVBQ2QsYUFBYSxFQUFDLE9BQU8sRUFDckIsY0FBYyxFQUFDLE9BQU8sYUFFdEIsZUFBTSxDQUFDLEVBQUMsR0FBRyxFQUFDLENBQUMsRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLElBQUksRUFBQyxNQUFNLEVBQUMsSUFBSSxFQUFDLEVBQUUsRUFBQyxHQUFHLEVBQUMsRUFBRSxFQUFDLEdBQUcsR0FBRyxFQUMxRCxlQUFNLENBQUMsRUFBQywwQkFBMEIsR0FBRyxJQUNqQyxDQUNQLEVBQ0EsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQ3ZELElBQ1IsQ0FDSixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcblxuaW1wb3J0IHsgU3Bpbm5lciB9IGZyb20gJy4vc3Bpbm5lcic7XG5cbmNvbnN0IFNUWUxFUyA9IGAud2YtZGVjcnlwdC1idG57YXBwZWFyYW5jZTpub25lOy13ZWJraXQtYXBwZWFyYW5jZTpub25lO2JvcmRlcjpub25lO2Rpc3BsYXk6aW5saW5lLWZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7aGVpZ2h0OjQwcHg7cGFkZGluZzowIDEycHg7Ym9yZGVyLXJhZGl1czo2cHg7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwO2xpbmUtaGVpZ2h0OjIwcHg7Y3Vyc29yOnBvaW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwO2dhcDo2cHg7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIDE1MG1zfS53Zi1kZWNyeXB0LWlkbGV7Y29sb3I6dmFyKC0tZHMtZ3JheS0xMDAwKTtiYWNrZ3JvdW5kOnZhcigtLWRzLWJhY2tncm91bmQtMTAwKTtib3gtc2hhZG93OjAgMCAwIDFweCB2YXIoLS1kcy1ncmF5LTQwMCl9LndmLWRlY3J5cHQtaWRsZTpob3ZlcntiYWNrZ3JvdW5kOnZhcigtLWRzLWdyYXktYWxwaGEtMjAwKX0ud2YtZGVjcnlwdC1kb25le2NvbG9yOnZhcigtLWRzLWdyZWVuLTkwMCk7YmFja2dyb3VuZDp2YXIoLS1kcy1ncmVlbi0xMDApO2JveC1zaGFkb3c6MCAwIDAgMXB4IHZhcigtLWRzLWdyZWVuLTQwMCk7Y3Vyc29yOmRlZmF1bHR9YDtcblxuaW50ZXJmYWNlIERlY3J5cHRCdXR0b25Qcm9wcyB7XG4gIC8qKiBXaGV0aGVyIGFuIGVuY3J5cHRpb24ga2V5IGhhcyBiZWVuIG9idGFpbmVkIChkZWNyeXB0aW9uIGlzIGFjdGl2ZSkuICovXG4gIGRlY3J5cHRlZD86IGJvb2xlYW47XG4gIC8qKiBXaGV0aGVyIHRoZSBrZXkgaXMgY3VycmVudGx5IGJlaW5nIGZldGNoZWQuICovXG4gIGxvYWRpbmc/OiBib29sZWFuO1xuICAvKiogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRvIGluaXRpYXRlIGRlY3J5cHRpb24uICovXG4gIG9uQ2xpY2s/OiAoKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIERlY3J5cHQvRGVjcnlwdGVkIGJ1dHRvbiB1c2luZyBHZWlzdCBzZWNvbmRhcnkgc3R5bGUuXG4gKiBUaHJlZSBzdGF0ZXM6IGlkbGUgKHNlY29uZGFyeSBncmF5KSwgZGVjcnlwdGluZyAoc3Bpbm5lciksIGRlY3J5cHRlZCAoZ3JlZW4gc3VjY2VzcykuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBEZWNyeXB0QnV0dG9uKHtcbiAgZGVjcnlwdGVkID0gZmFsc2UsXG4gIGxvYWRpbmcgPSBmYWxzZSxcbiAgb25DbGljayxcbn06IERlY3J5cHRCdXR0b25Qcm9wcykge1xuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICA8c3R5bGUgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3sgX19odG1sOiBTVFlMRVMgfX0gLz5cbiAgICAgIDxidXR0b25cbiAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgIG9uQ2xpY2s9e2RlY3J5cHRlZCA/IHVuZGVmaW5lZCA6IG9uQ2xpY2t9XG4gICAgICAgIGRpc2FibGVkPXtkZWNyeXB0ZWQgfHwgbG9hZGluZ31cbiAgICAgICAgY2xhc3NOYW1lPXtgd2YtZGVjcnlwdC1idG4gJHtkZWNyeXB0ZWQgPyAnd2YtZGVjcnlwdC1kb25lJyA6ICd3Zi1kZWNyeXB0LWlkbGUnfWB9XG4gICAgICA+XG4gICAgICAgIHtsb2FkaW5nID8gKFxuICAgICAgICAgIDxTcGlubmVyIHNpemU9ezE0fSAvPlxuICAgICAgICApIDogZGVjcnlwdGVkID8gKFxuICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgIHdpZHRoPXsxNH1cbiAgICAgICAgICAgIGhlaWdodD17MTR9XG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICBzdHJva2VXaWR0aD17Mn1cbiAgICAgICAgICAgIHN0cm9rZUxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICBzdHJva2VMaW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cmVjdCB4PVwiM1wiIHk9XCIxMVwiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxMVwiIHJ4PVwiMlwiIHJ5PVwiMlwiIC8+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTcgMTFWN2E1IDUgMCAwIDEgOS45LTFcIiAvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgIHdpZHRoPXsxNH1cbiAgICAgICAgICAgIGhlaWdodD17MTR9XG4gICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICBzdHJva2VXaWR0aD17Mn1cbiAgICAgICAgICAgIHN0cm9rZUxpbmVjYXA9XCJyb3VuZFwiXG4gICAgICAgICAgICBzdHJva2VMaW5lam9pbj1cInJvdW5kXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cmVjdCB4PVwiM1wiIHk9XCIxMVwiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxMVwiIHJ4PVwiMlwiIHJ5PVwiMlwiIC8+XG4gICAgICAgICAgICA8cGF0aCBkPVwiTTcgMTFWN2E1IDUgMCAwIDEgMTAgMHY0XCIgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgKX1cbiAgICAgICAge2xvYWRpbmcgPyAnRGVjcnlwdGluZ+KApicgOiBkZWNyeXB0ZWQgPyAnRGVjcnlwdGVkJyA6ICdEZWNyeXB0J31cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvPlxuICApO1xufVxuIl19
@@ -14,4 +14,4 @@ export function ErrorCard({ title, className, details = 'Unknown error', }) {
14
14
  color: 'var(--ds-red-900)',
15
15
  }, children: details }) }))] }) }));
16
16
  }
17
- //# sourceMappingURL=error-card.js.map
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3ItY2FyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3VpL2Vycm9yLWNhcmQudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVksQ0FBQzs7QUFFYixPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN4RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQVdyQzs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLEVBQ3hCLEtBQUssRUFDTCxTQUFTLEVBQ1QsT0FBTyxHQUFHLGVBQWUsR0FDVjtJQUNmLE1BQU0sQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXBELE9BQU8sQ0FDTCxjQUFLLFNBQVMsRUFBQyw0QkFBNEIsWUFDekMsZUFDRSxTQUFTLEVBQUUsRUFBRSxDQUNYLHVEQUF1RCxFQUN2RCxTQUFTLENBQ1YsRUFDRCxLQUFLLEVBQUUsRUFBRSxVQUFVLEVBQUUsbUJBQW1CLEVBQUUsYUFFMUMsa0JBQ0UsSUFBSSxFQUFDLFFBQVEsRUFDYixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQ3pDLFNBQVMsRUFBQyxzRkFBc0YsRUFDaEcsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLG1CQUFtQixFQUFFLGFBRXJDLGVBQUssU0FBUyxFQUFDLHlCQUF5QixhQUN0QyxLQUFDLFdBQVcsSUFBQyxTQUFTLEVBQUMsa0JBQWtCLEdBQUcsRUFDNUMsZUFBTSxTQUFTLEVBQUMscUJBQXFCLFlBQUUsS0FBSyxHQUFRLElBQ2hELEVBQ04sZUFBSyxTQUFTLEVBQUMsc0NBQXNDLGFBQ25ELGVBQU0sU0FBUyxFQUFDLFNBQVMsc0NBQTZCLEVBQ3RELEtBQUMsV0FBVyxJQUNWLFNBQVMsRUFBRSxFQUFFLENBQ1gsMkNBQTJDLEVBQzNDLFVBQVUsSUFBSSxZQUFZLENBQzNCLEdBQ0QsSUFDRSxJQUNDLEVBRVIsVUFBVSxJQUFJLE9BQU8sSUFBSSxDQUN4QixjQUNFLFNBQVMsRUFBQyxXQUFXLEVBQ3JCLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSw2QkFBNkIsRUFBRSxZQUVuRCxjQUNFLFNBQVMsRUFBQyxxRkFBcUYsRUFDL0YsS0FBSyxFQUFFOzRCQUNMLFVBQVUsRUFBRSxtQkFBbUI7NEJBQy9CLEtBQUssRUFBRSxtQkFBbUI7eUJBQzNCLFlBRUEsT0FBTyxHQUNKLEdBQ0YsQ0FDUCxJQUNHLEdBQ0YsQ0FDUCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgY2xpZW50JztcblxuaW1wb3J0IHsgQWxlcnRDaXJjbGUsIENoZXZyb25Eb3duIH0gZnJvbSAnbHVjaWRlLXJlYWN0JztcbmltcG9ydCB7IHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi9saWIvdXRpbHMnO1xuXG5pbnRlcmZhY2UgRXJyb3JDYXJkUHJvcHMge1xuICAvKiogVGl0bGUgc2hvd24gaW4gdGhlIGhlYWRlciAqL1xuICB0aXRsZTogc3RyaW5nO1xuICAvKiogRXJyb3IgbWVzc2FnZSBvciBkZXRhaWxzIHRvIHNob3cgd2hlbiBleHBhbmRlZCAqL1xuICBkZXRhaWxzPzogc3RyaW5nO1xuICAvKiogQWRkaXRpb25hbCBjbGFzcyBuYW1lcyAqL1xuICBjbGFzc05hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBjb2xsYXBzaWJsZSBlcnJvciBjYXJkIHRoYXQgc2hvd3MgYSB0aXRsZSB3aXRoIGFuIGVycm9yIGljb24sXG4gKiBhbmQgZXhwYW5kcyB0byByZXZlYWwgZGV0YWlscyB3aGVuIGNsaWNrZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBFcnJvckNhcmQoe1xuICB0aXRsZSxcbiAgY2xhc3NOYW1lLFxuICBkZXRhaWxzID0gJ1Vua25vd24gZXJyb3InLFxufTogRXJyb3JDYXJkUHJvcHMpIHtcbiAgY29uc3QgW2lzRXhwYW5kZWQsIHNldElzRXhwYW5kZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktY2VudGVyIHctZnVsbFwiPlxuICAgICAgPGRpdlxuICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICdyb3VuZGVkLWxnIGJvcmRlciBib3JkZXItcmVkLTQwMCB3LWZ1bGwgbWF4LXctWzgwMHB4XScsXG4gICAgICAgICAgY2xhc3NOYW1lXG4gICAgICAgICl9XG4gICAgICAgIHN0eWxlPXt7IGJhY2tncm91bmQ6ICd2YXIoLS1kcy1yZWQtMTAwKScgfX1cbiAgICAgID5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldElzRXhwYW5kZWQoIWlzRXhwYW5kZWQpfVxuICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBweC00IHB5LTMgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0yIHRleHQtbGVmdCB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgc3R5bGU9e3sgY29sb3I6ICd2YXIoLS1kcy1yZWQtOTAwKScgfX1cbiAgICAgICAgPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxBbGVydENpcmNsZSBjbGFzc05hbWU9XCJoLTQgdy00IHNocmluay0wXCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtIHRleHQtc21cIj57dGl0bGV9PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEuNSBvcGFjaXR5LTcwXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXhzXCI+Q2xpY2sgdG8gc2hvdyBkZXRhaWxzPC9zcGFuPlxuICAgICAgICAgICAgPENoZXZyb25Eb3duXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgJ2gtNCB3LTQgdHJhbnNpdGlvbi10cmFuc2Zvcm0gZHVyYXRpb24tMjAwJyxcbiAgICAgICAgICAgICAgICBpc0V4cGFuZGVkICYmICdyb3RhdGUtMTgwJ1xuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAge2lzRXhwYW5kZWQgJiYgZGV0YWlscyAmJiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwicHgtNCBwYi0zXCJcbiAgICAgICAgICAgIHN0eWxlPXt7IGJvcmRlclRvcDogJzFweCBzb2xpZCB2YXIoLS1kcy1yZWQtNDAwKScgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cHJlXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm10LTMgcC0zIHJvdW5kZWQtbWQgdGV4dC14cyBmb250LW1vbm8gd2hpdGVzcGFjZS1wcmUtd3JhcCBicmVhay13b3JkcyBvdmVyZmxvdy1hdXRvXCJcbiAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAndmFyKC0tZHMtcmVkLTIwMCknLFxuICAgICAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tZHMtcmVkLTkwMCknLFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7ZGV0YWlsc31cbiAgICAgICAgICAgIDwvcHJlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICk7XG59XG4iXX0=
@@ -1,18 +1,25 @@
1
+ export type StructuredErrorRecord = Record<string, unknown> & {
2
+ message?: string;
3
+ stack?: string;
4
+ };
5
+ /**
6
+ * Check whether `value` looks like a structured error object we can render
7
+ * with the error block. Some persisted workflow errors only include a
8
+ * `message`, while runtime errors usually also include `stack`.
9
+ */
10
+ export declare function isStructuredError(value: unknown): value is StructuredErrorRecord;
1
11
  /**
2
- * Check whether `value` looks like a structured error object with a `stack`
3
- * field that we can render as pre-formatted text.
12
+ * Narrower guard kept for callers that specifically need a stack trace.
4
13
  */
5
- export declare function isStructuredErrorWithStack(value: unknown): value is Record<string, unknown> & {
14
+ export declare function isStructuredErrorWithStack(value: unknown): value is StructuredErrorRecord & {
6
15
  stack: string;
7
16
  };
8
17
  /**
9
- * Renders an error with a `stack` field as a visually distinct error block.
10
- * Shows the error message with an alert icon at the top, separated from
11
- * the stack trace below.
18
+ * Renders a structured error as a visually distinct error block. Shows the
19
+ * error message with an alert icon at the top, separated from the stack trace
20
+ * or full message below.
12
21
  */
13
- export declare function ErrorStackBlock({ value, }: {
14
- value: Record<string, unknown> & {
15
- stack: string;
16
- };
22
+ export declare function ErrorStackBlock({ value }: {
23
+ value: StructuredErrorRecord;
17
24
  }): import("react/jsx-runtime").JSX.Element;
18
25
  //# sourceMappingURL=error-stack-block.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"error-stack-block.d.ts","sourceRoot":"","sources":["../../../src/components/ui/error-stack-block.tsx"],"names":[],"mappings":"AAKA;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAOtD;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAC9B,KAAK,GACN,EAAE;IACD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACpD,2CA6DA"}
1
+ {"version":3,"file":"error-stack-block.d.ts","sourceRoot":"","sources":["../../../src/components/ui/error-stack-block.tsx"],"names":[],"mappings":"AAKA,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,qBAAqB,CAOhC;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,qBAAqB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAKpD;AAiBD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,qBAAqB,CAAA;CAAE,2CA6D1E"}
@@ -1,49 +1,68 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { AlertCircle, Copy } from 'lucide-react';
4
- import { useToast } from '../../lib/toast';
3
+ import { AlertCircle } from 'lucide-react';
4
+ import { CopyButton } from '../new-trace-viewer/components/copy-button';
5
5
  /**
6
- * Check whether `value` looks like a structured error object with a `stack`
7
- * field that we can render as pre-formatted text.
6
+ * Check whether `value` looks like a structured error object we can render
7
+ * with the error block. Some persisted workflow errors only include a
8
+ * `message`, while runtime errors usually also include `stack`.
8
9
  */
9
- export function isStructuredErrorWithStack(value) {
10
+ export function isStructuredError(value) {
10
11
  return (value != null &&
11
12
  typeof value === 'object' &&
12
- 'stack' in value &&
13
+ (typeof value.message === 'string' ||
14
+ typeof value.stack === 'string'));
15
+ }
16
+ /**
17
+ * Narrower guard kept for callers that specifically need a stack trace.
18
+ */
19
+ export function isStructuredErrorWithStack(value) {
20
+ return (isStructuredError(value) &&
13
21
  typeof value.stack === 'string');
14
22
  }
15
23
  /**
16
- * Renders an error with a `stack` field as a visually distinct error block.
17
- * Shows the error message with an alert icon at the top, separated from
18
- * the stack trace below.
24
+ * Pull a short, single-line title out of an error message.
25
+ *
26
+ * Workflow's structured error messages are multi-line — the first line is
27
+ * the headline (`Failed to serialize step return value`) and the rest are
28
+ * `╰▶ hint:` / `╰▶ docs:` framed details. The full message belongs in the
29
+ * body of the error block; the title should just be the headline so the
30
+ * card stays scannable.
19
31
  */
20
- export function ErrorStackBlock({ value, }) {
21
- const toast = useToast();
22
- const stack = value.stack;
32
+ function deriveTitle(message) {
33
+ const firstLine = message.split('\n').find((line) => line.trim().length > 0) ?? message;
34
+ return firstLine.trim();
35
+ }
36
+ /**
37
+ * Renders a structured error as a visually distinct error block. Shows the
38
+ * error message with an alert icon at the top, separated from the stack trace
39
+ * or full message below.
40
+ */
41
+ export function ErrorStackBlock({ value }) {
42
+ const stack = typeof value.stack === 'string' ? value.stack : undefined;
23
43
  const message = typeof value.message === 'string' ? value.message : undefined;
24
- const copyText = message ? `${message}\n\n${stack}` : stack;
44
+ const body = stack ?? message ?? '';
45
+ // V8's `Error.stack` already starts with `Name: message`; message-only
46
+ // errors use the message as the body so long single-line failures remain
47
+ // readable even when the header truncates.
48
+ const title = message ? deriveTitle(message) : deriveTitle(body);
49
+ const copyText = message && stack && !stack.includes(message)
50
+ ? `${message}\n\n${stack}`
51
+ : body;
25
52
  return (_jsxs("div", { className: "relative overflow-hidden rounded-md border", style: {
26
53
  borderColor: 'var(--ds-red-400)',
27
54
  background: 'var(--ds-red-100)',
28
- }, children: [_jsx("button", { type: "button", "aria-label": "Copy error", title: "Copy", className: "!absolute !right-2 !top-2 !flex !h-6 !w-6 !items-center !justify-center !rounded-md !border transition-transform transition-colors duration-100 hover:!bg-[var(--ds-red-200)] active:!scale-95", style: {
29
- borderColor: 'var(--ds-red-400)',
30
- background: 'var(--ds-red-100)',
31
- color: 'var(--ds-red-900)',
32
- }, onClick: () => {
33
- navigator.clipboard
34
- .writeText(copyText)
35
- .then(() => {
36
- toast.success('Copied to clipboard');
37
- })
38
- .catch(() => {
39
- toast.error('Failed to copy');
40
- });
41
- }, children: _jsx(Copy, { size: 12 }) }), message && (_jsxs("div", { className: "flex items-start gap-2 px-3 py-2.5 pr-10", style: {
55
+ }, children: [_jsx(CopyButton, { copyText: copyText, ariaLabel: "Copy error", className: "absolute right-2 top-2 flex h-6 w-6 items-center justify-center rounded-md border border-red-400 bg-red-100 p-0 text-red-900 transition-transform transition-colors duration-100 hover:bg-red-200 active:scale-95" }), title && (_jsxs("div", { className: "flex items-center gap-2 px-3 py-2.5 pr-10", style: {
42
56
  color: 'var(--ds-red-900)',
43
57
  borderBottom: '1px solid var(--ds-red-400)',
44
- }, children: [_jsx(AlertCircle, { className: "h-4 w-4 shrink-0", style: { marginTop: 1 } }), _jsx("p", { className: "text-xs font-semibold m-0 break-words", children: message })] })), _jsx("pre", { className: "px-3 py-2.5 text-xs font-mono whitespace-pre-wrap break-words overflow-auto m-0", style: {
58
+ }, children: [_jsx(AlertCircle, { className: "h-4 w-4 shrink-0" }), _jsx("p", { className: "text-xs font-semibold m-0 truncate",
59
+ // The full message or stack is in the body below; the header just
60
+ // shows the first line, single-line, with overflow
61
+ // ellipsised so a long title doesn't push the copy button or
62
+ // wrap into the framed hint/docs lines.
63
+ title: message, children: title })] })), body && (_jsx("pre", { className: "px-3 py-2.5 text-xs font-mono whitespace-pre-wrap break-words overflow-auto m-0", style: {
45
64
  color: 'var(--ds-red-900)',
46
65
  background: 'var(--ds-red-200)',
47
- }, children: stack })] }));
66
+ }, children: body }))] }));
48
67
  }
49
- //# sourceMappingURL=error-stack-block.js.map
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3Itc3RhY2stYmxvY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy91aS9lcnJvci1zdGFjay1ibG9jay50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWSxDQUFDOztBQUViLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBT3hFOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQy9CLEtBQWM7SUFFZCxPQUFPLENBQ0wsS0FBSyxJQUFJLElBQUk7UUFDYixPQUFPLEtBQUssS0FBSyxRQUFRO1FBQ3pCLENBQUMsT0FBUSxLQUFpQyxDQUFDLE9BQU8sS0FBSyxRQUFRO1lBQzdELE9BQVEsS0FBaUMsQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQ2hFLENBQUM7QUFDSixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQ3hDLEtBQWM7SUFFZCxPQUFPLENBQ0wsaUJBQWlCLENBQUMsS0FBSyxDQUFDO1FBQ3hCLE9BQVEsS0FBK0IsQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUMzRCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBUyxXQUFXLENBQUMsT0FBZTtJQUNsQyxNQUFNLFNBQVMsR0FDYixPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxPQUFPLENBQUM7SUFDeEUsT0FBTyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDMUIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLEVBQUUsS0FBSyxFQUFvQztJQUN6RSxNQUFNLEtBQUssR0FBRyxPQUFPLEtBQUssQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDeEUsTUFBTSxPQUFPLEdBQUcsT0FBTyxLQUFLLENBQUMsT0FBTyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzlFLE1BQU0sSUFBSSxHQUFHLEtBQUssSUFBSSxPQUFPLElBQUksRUFBRSxDQUFDO0lBQ3BDLHVFQUF1RTtJQUN2RSx5RUFBeUU7SUFDekUsMkNBQTJDO0lBQzNDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakUsTUFBTSxRQUFRLEdBQ1osT0FBTyxJQUFJLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQzFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sT0FBTyxLQUFLLEVBQUU7UUFDMUIsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUVYLE9BQU8sQ0FDTCxlQUNFLFNBQVMsRUFBQyw0Q0FBNEMsRUFDdEQsS0FBSyxFQUFFO1lBQ0wsV0FBVyxFQUFFLG1CQUFtQjtZQUNoQyxVQUFVLEVBQUUsbUJBQW1CO1NBQ2hDLGFBRUQsS0FBQyxVQUFVLElBQ1QsUUFBUSxFQUFFLFFBQVEsRUFDbEIsU0FBUyxFQUFDLFlBQVksRUFDdEIsU0FBUyxFQUFDLG1OQUFtTixHQUM3TixFQUVELEtBQUssSUFBSSxDQUNSLGVBQ0UsU0FBUyxFQUFDLDJDQUEyQyxFQUNyRCxLQUFLLEVBQUU7b0JBQ0wsS0FBSyxFQUFFLG1CQUFtQjtvQkFDMUIsWUFBWSxFQUFFLDZCQUE2QjtpQkFDNUMsYUFFRCxLQUFDLFdBQVcsSUFBQyxTQUFTLEVBQUMsa0JBQWtCLEdBQUcsRUFDNUMsWUFDRSxTQUFTLEVBQUMsb0NBQW9DO3dCQUM5QyxrRUFBa0U7d0JBQ2xFLG1EQUFtRDt3QkFDbkQsNkRBQTZEO3dCQUM3RCx3Q0FBd0M7d0JBQ3hDLEtBQUssRUFBRSxPQUFPLFlBRWIsS0FBSyxHQUNKLElBQ0EsQ0FDUCxFQUNBLElBQUksSUFBSSxDQUNQLGNBQ0UsU0FBUyxFQUFDLGlGQUFpRixFQUMzRixLQUFLLEVBQUU7b0JBQ0wsS0FBSyxFQUFFLG1CQUFtQjtvQkFDMUIsVUFBVSxFQUFFLG1CQUFtQjtpQkFDaEMsWUFFQSxJQUFJLEdBQ0QsQ0FDUCxJQUNHLENBQ1AsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIGNsaWVudCc7XG5cbmltcG9ydCB7IEFsZXJ0Q2lyY2xlIH0gZnJvbSAnbHVjaWRlLXJlYWN0JztcbmltcG9ydCB7IENvcHlCdXR0b24gfSBmcm9tICcuLi9uZXctdHJhY2Utdmlld2VyL2NvbXBvbmVudHMvY29weS1idXR0b24nO1xuXG5leHBvcnQgdHlwZSBTdHJ1Y3R1cmVkRXJyb3JSZWNvcmQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiAmIHtcbiAgbWVzc2FnZT86IHN0cmluZztcbiAgc3RhY2s/OiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgYHZhbHVlYCBsb29rcyBsaWtlIGEgc3RydWN0dXJlZCBlcnJvciBvYmplY3Qgd2UgY2FuIHJlbmRlclxuICogd2l0aCB0aGUgZXJyb3IgYmxvY2suIFNvbWUgcGVyc2lzdGVkIHdvcmtmbG93IGVycm9ycyBvbmx5IGluY2x1ZGUgYVxuICogYG1lc3NhZ2VgLCB3aGlsZSBydW50aW1lIGVycm9ycyB1c3VhbGx5IGFsc28gaW5jbHVkZSBgc3RhY2tgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJ1Y3R1cmVkRXJyb3IoXG4gIHZhbHVlOiB1bmtub3duXG4pOiB2YWx1ZSBpcyBTdHJ1Y3R1cmVkRXJyb3JSZWNvcmQge1xuICByZXR1cm4gKFxuICAgIHZhbHVlICE9IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgKHR5cGVvZiAodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLm1lc3NhZ2UgPT09ICdzdHJpbmcnIHx8XG4gICAgICB0eXBlb2YgKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5zdGFjayA9PT0gJ3N0cmluZycpXG4gICk7XG59XG5cbi8qKlxuICogTmFycm93ZXIgZ3VhcmQga2VwdCBmb3IgY2FsbGVycyB0aGF0IHNwZWNpZmljYWxseSBuZWVkIGEgc3RhY2sgdHJhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cnVjdHVyZWRFcnJvcldpdGhTdGFjayhcbiAgdmFsdWU6IHVua25vd25cbik6IHZhbHVlIGlzIFN0cnVjdHVyZWRFcnJvclJlY29yZCAmIHsgc3RhY2s6IHN0cmluZyB9IHtcbiAgcmV0dXJuIChcbiAgICBpc1N0cnVjdHVyZWRFcnJvcih2YWx1ZSkgJiZcbiAgICB0eXBlb2YgKHZhbHVlIGFzIFN0cnVjdHVyZWRFcnJvclJlY29yZCkuc3RhY2sgPT09ICdzdHJpbmcnXG4gICk7XG59XG5cbi8qKlxuICogUHVsbCBhIHNob3J0LCBzaW5nbGUtbGluZSB0aXRsZSBvdXQgb2YgYW4gZXJyb3IgbWVzc2FnZS5cbiAqXG4gKiBXb3JrZmxvdydzIHN0cnVjdHVyZWQgZXJyb3IgbWVzc2FnZXMgYXJlIG11bHRpLWxpbmUg4oCUIHRoZSBmaXJzdCBsaW5lIGlzXG4gKiB0aGUgaGVhZGxpbmUgKGBGYWlsZWQgdG8gc2VyaWFsaXplIHN0ZXAgcmV0dXJuIHZhbHVlYCkgYW5kIHRoZSByZXN0IGFyZVxuICogYOKVsOKWtiBoaW50OmAgLyBg4pWw4pa2IGRvY3M6YCBmcmFtZWQgZGV0YWlscy4gVGhlIGZ1bGwgbWVzc2FnZSBiZWxvbmdzIGluIHRoZVxuICogYm9keSBvZiB0aGUgZXJyb3IgYmxvY2s7IHRoZSB0aXRsZSBzaG91bGQganVzdCBiZSB0aGUgaGVhZGxpbmUgc28gdGhlXG4gKiBjYXJkIHN0YXlzIHNjYW5uYWJsZS5cbiAqL1xuZnVuY3Rpb24gZGVyaXZlVGl0bGUobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZmlyc3RMaW5lID1cbiAgICBtZXNzYWdlLnNwbGl0KCdcXG4nKS5maW5kKChsaW5lKSA9PiBsaW5lLnRyaW0oKS5sZW5ndGggPiAwKSA/PyBtZXNzYWdlO1xuICByZXR1cm4gZmlyc3RMaW5lLnRyaW0oKTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgc3RydWN0dXJlZCBlcnJvciBhcyBhIHZpc3VhbGx5IGRpc3RpbmN0IGVycm9yIGJsb2NrLiBTaG93cyB0aGVcbiAqIGVycm9yIG1lc3NhZ2Ugd2l0aCBhbiBhbGVydCBpY29uIGF0IHRoZSB0b3AsIHNlcGFyYXRlZCBmcm9tIHRoZSBzdGFjayB0cmFjZVxuICogb3IgZnVsbCBtZXNzYWdlIGJlbG93LlxuICovXG5leHBvcnQgZnVuY3Rpb24gRXJyb3JTdGFja0Jsb2NrKHsgdmFsdWUgfTogeyB2YWx1ZTogU3RydWN0dXJlZEVycm9yUmVjb3JkIH0pIHtcbiAgY29uc3Qgc3RhY2sgPSB0eXBlb2YgdmFsdWUuc3RhY2sgPT09ICdzdHJpbmcnID8gdmFsdWUuc3RhY2sgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IG1lc3NhZ2UgPSB0eXBlb2YgdmFsdWUubWVzc2FnZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS5tZXNzYWdlIDogdW5kZWZpbmVkO1xuICBjb25zdCBib2R5ID0gc3RhY2sgPz8gbWVzc2FnZSA/PyAnJztcbiAgLy8gVjgncyBgRXJyb3Iuc3RhY2tgIGFscmVhZHkgc3RhcnRzIHdpdGggYE5hbWU6IG1lc3NhZ2VgOyBtZXNzYWdlLW9ubHlcbiAgLy8gZXJyb3JzIHVzZSB0aGUgbWVzc2FnZSBhcyB0aGUgYm9keSBzbyBsb25nIHNpbmdsZS1saW5lIGZhaWx1cmVzIHJlbWFpblxuICAvLyByZWFkYWJsZSBldmVuIHdoZW4gdGhlIGhlYWRlciB0cnVuY2F0ZXMuXG4gIGNvbnN0IHRpdGxlID0gbWVzc2FnZSA/IGRlcml2ZVRpdGxlKG1lc3NhZ2UpIDogZGVyaXZlVGl0bGUoYm9keSk7XG4gIGNvbnN0IGNvcHlUZXh0ID1cbiAgICBtZXNzYWdlICYmIHN0YWNrICYmICFzdGFjay5pbmNsdWRlcyhtZXNzYWdlKVxuICAgICAgPyBgJHttZXNzYWdlfVxcblxcbiR7c3RhY2t9YFxuICAgICAgOiBib2R5O1xuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPVwicmVsYXRpdmUgb3ZlcmZsb3ctaGlkZGVuIHJvdW5kZWQtbWQgYm9yZGVyXCJcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIGJvcmRlckNvbG9yOiAndmFyKC0tZHMtcmVkLTQwMCknLFxuICAgICAgICBiYWNrZ3JvdW5kOiAndmFyKC0tZHMtcmVkLTEwMCknLFxuICAgICAgfX1cbiAgICA+XG4gICAgICA8Q29weUJ1dHRvblxuICAgICAgICBjb3B5VGV4dD17Y29weVRleHR9XG4gICAgICAgIGFyaWFMYWJlbD1cIkNvcHkgZXJyb3JcIlxuICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSByaWdodC0yIHRvcC0yIGZsZXggaC02IHctNiBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXJlZC00MDAgYmctcmVkLTEwMCBwLTAgdGV4dC1yZWQtOTAwIHRyYW5zaXRpb24tdHJhbnNmb3JtIHRyYW5zaXRpb24tY29sb3JzIGR1cmF0aW9uLTEwMCBob3ZlcjpiZy1yZWQtMjAwIGFjdGl2ZTpzY2FsZS05NVwiXG4gICAgICAvPlxuXG4gICAgICB7dGl0bGUgJiYgKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcHgtMyBweS0yLjUgcHItMTBcIlxuICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICBjb2xvcjogJ3ZhcigtLWRzLXJlZC05MDApJyxcbiAgICAgICAgICAgIGJvcmRlckJvdHRvbTogJzFweCBzb2xpZCB2YXIoLS1kcy1yZWQtNDAwKScsXG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIDxBbGVydENpcmNsZSBjbGFzc05hbWU9XCJoLTQgdy00IHNocmluay0wXCIgLz5cbiAgICAgICAgICA8cFxuICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIG0tMCB0cnVuY2F0ZVwiXG4gICAgICAgICAgICAvLyBUaGUgZnVsbCBtZXNzYWdlIG9yIHN0YWNrIGlzIGluIHRoZSBib2R5IGJlbG93OyB0aGUgaGVhZGVyIGp1c3RcbiAgICAgICAgICAgIC8vIHNob3dzIHRoZSBmaXJzdCBsaW5lLCBzaW5nbGUtbGluZSwgd2l0aCBvdmVyZmxvd1xuICAgICAgICAgICAgLy8gZWxsaXBzaXNlZCBzbyBhIGxvbmcgdGl0bGUgZG9lc24ndCBwdXNoIHRoZSBjb3B5IGJ1dHRvbiBvclxuICAgICAgICAgICAgLy8gd3JhcCBpbnRvIHRoZSBmcmFtZWQgaGludC9kb2NzIGxpbmVzLlxuICAgICAgICAgICAgdGl0bGU9e21lc3NhZ2V9XG4gICAgICAgICAgPlxuICAgICAgICAgICAge3RpdGxlfVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgICAge2JvZHkgJiYgKFxuICAgICAgICA8cHJlXG4gICAgICAgICAgY2xhc3NOYW1lPVwicHgtMyBweS0yLjUgdGV4dC14cyBmb250LW1vbm8gd2hpdGVzcGFjZS1wcmUtd3JhcCBicmVhay13b3JkcyBvdmVyZmxvdy1hdXRvIG0tMFwiXG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIGNvbG9yOiAndmFyKC0tZHMtcmVkLTkwMCknLFxuICAgICAgICAgICAgYmFja2dyb3VuZDogJ3ZhcigtLWRzLXJlZC0yMDApJyxcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAge2JvZHl9XG4gICAgICAgIDwvcHJlPlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cbiJdfQ==
@@ -0,0 +1,19 @@
1
+ import { type VariantProps } from 'class-variance-authority';
2
+ import * as React from 'react';
3
+ declare const iconButtonVariants: (props?: ({
4
+ variant?: "muted" | "tertiary" | null | undefined;
5
+ size?: "small" | "tiny" | null | undefined;
6
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string;
7
+ export type IconButtonProps = Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'type'> & VariantProps<typeof iconButtonVariants> & {
8
+ 'aria-label': string;
9
+ type?: 'button' | 'submit' | 'reset';
10
+ };
11
+ export declare const IconButton: React.ForwardRefExoticComponent<Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "type"> & VariantProps<(props?: ({
12
+ variant?: "muted" | "tertiary" | null | undefined;
13
+ size?: "small" | "tiny" | null | undefined;
14
+ } & import("class-variance-authority/types").ClassProp) | undefined) => string> & {
15
+ 'aria-label': string;
16
+ type?: "button" | "submit" | "reset";
17
+ } & React.RefAttributes<HTMLButtonElement>>;
18
+ export { iconButtonVariants };
19
+ //# sourceMappingURL=icon-button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icon-button.d.ts","sourceRoot":"","sources":["../../../src/components/ui/icon-button.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,QAAA,MAAM,kBAAkB;;;8EAyBvB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,IAAI,CAChC,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAC7C,MAAM,CACP,GACC,YAAY,CAAC,OAAO,kBAAkB,CAAC,GAAG;IACxC,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;CACtC,CAAC;AAEJ,eAAO,MAAM,UAAU;;;;kBAJL,MAAM;WACb,QAAQ,GAAG,QAAQ,GAAG,OAAO;2CAYvC,CAAC;AAGF,OAAO,EAAE,kBAAkB,EAAE,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { cva } from 'class-variance-authority';
3
+ import * as React from 'react';
4
+ import { cn } from '../../lib/utils';
5
+ const iconButtonVariants = cva([
6
+ 'm-0 inline-flex shrink-0 appearance-none items-center justify-center border-0 bg-transparent p-0 align-baseline font-inherit no-underline [background:none] [-webkit-appearance:none] [-webkit-tap-highlight-color:transparent]',
7
+ 'transition-colors duration-150 ease-in-out',
8
+ 'enabled:cursor-pointer disabled:cursor-not-allowed disabled:opacity-40',
9
+ 'focus-visible:outline focus-visible:outline-2 focus-visible:outline-[var(--ds-focus-color)] focus-visible:outline-offset-2',
10
+ ], {
11
+ variants: {
12
+ variant: {
13
+ tertiary: 'text-gray-900 enabled:hover:bg-gray-alpha-200 enabled:hover:text-gray-1000 enabled:active:bg-gray-alpha-200 focus-visible:text-gray-1000',
14
+ muted: 'text-gray-900 enabled:hover:bg-gray-alpha-200 enabled:hover:text-gray-1000 enabled:active:bg-gray-alpha-200 focus-visible:text-gray-1000',
15
+ },
16
+ size: {
17
+ tiny: 'h-6 w-6 rounded-[4px] [&_svg]:h-4 [&_svg]:w-4',
18
+ small: 'h-8 w-8 rounded-md [&_svg]:h-4 [&_svg]:w-4',
19
+ },
20
+ },
21
+ defaultVariants: {
22
+ variant: 'tertiary',
23
+ size: 'tiny',
24
+ },
25
+ });
26
+ export const IconButton = React.forwardRef(({ className, variant, size, type = 'button', ...props }, ref) => (_jsx("button", { ref: ref, type: type, className: cn(iconButtonVariants({ variant, size, className })), ...props })));
27
+ IconButton.displayName = 'IconButton';
28
+ export { iconButtonVariants };
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi1idXR0b24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy91aS9pY29uLWJ1dHRvbi50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxHQUFHLEVBQXFCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEUsT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDL0IsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXJDLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUM1QjtJQUNFLGlPQUFpTztJQUNqTyw0Q0FBNEM7SUFDNUMsd0VBQXdFO0lBQ3hFLDRIQUE0SDtDQUM3SCxFQUNEO0lBQ0UsUUFBUSxFQUFFO1FBQ1IsT0FBTyxFQUFFO1lBQ1AsUUFBUSxFQUNOLDBJQUEwSTtZQUM1SSxLQUFLLEVBQ0gsMElBQTBJO1NBQzdJO1FBQ0QsSUFBSSxFQUFFO1lBQ0osSUFBSSxFQUFFLCtDQUErQztZQUNyRCxLQUFLLEVBQUUsNENBQTRDO1NBQ3BEO0tBQ0Y7SUFDRCxlQUFlLEVBQUU7UUFDZixPQUFPLEVBQUUsVUFBVTtRQUNuQixJQUFJLEVBQUUsTUFBTTtLQUNiO0NBQ0YsQ0FDRixDQUFDO0FBV0YsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQ3hDLENBQUMsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsUUFBUSxFQUFFLEdBQUcsS0FBSyxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUNoRSxpQkFDRSxHQUFHLEVBQUUsR0FBRyxFQUNSLElBQUksRUFBRSxJQUFJLEVBQ1YsU0FBUyxFQUFFLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxLQUMzRCxLQUFLLEdBQ1QsQ0FDSCxDQUNGLENBQUM7QUFDRixVQUFVLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQztBQUV0QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGN2YSwgdHlwZSBWYXJpYW50UHJvcHMgfSBmcm9tICdjbGFzcy12YXJpYW5jZS1hdXRob3JpdHknO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuLi8uLi9saWIvdXRpbHMnO1xuXG5jb25zdCBpY29uQnV0dG9uVmFyaWFudHMgPSBjdmEoXG4gIFtcbiAgICAnbS0wIGlubGluZS1mbGV4IHNocmluay0wIGFwcGVhcmFuY2Utbm9uZSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYm9yZGVyLTAgYmctdHJhbnNwYXJlbnQgcC0wIGFsaWduLWJhc2VsaW5lIGZvbnQtaW5oZXJpdCBuby11bmRlcmxpbmUgW2JhY2tncm91bmQ6bm9uZV0gWy13ZWJraXQtYXBwZWFyYW5jZTpub25lXSBbLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50XScsXG4gICAgJ3RyYW5zaXRpb24tY29sb3JzIGR1cmF0aW9uLTE1MCBlYXNlLWluLW91dCcsXG4gICAgJ2VuYWJsZWQ6Y3Vyc29yLXBvaW50ZXIgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOm9wYWNpdHktNDAnLFxuICAgICdmb2N1cy12aXNpYmxlOm91dGxpbmUgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLTIgZm9jdXMtdmlzaWJsZTpvdXRsaW5lLVt2YXIoLS1kcy1mb2N1cy1jb2xvcildIGZvY3VzLXZpc2libGU6b3V0bGluZS1vZmZzZXQtMicsXG4gIF0sXG4gIHtcbiAgICB2YXJpYW50czoge1xuICAgICAgdmFyaWFudDoge1xuICAgICAgICB0ZXJ0aWFyeTpcbiAgICAgICAgICAndGV4dC1ncmF5LTkwMCBlbmFibGVkOmhvdmVyOmJnLWdyYXktYWxwaGEtMjAwIGVuYWJsZWQ6aG92ZXI6dGV4dC1ncmF5LTEwMDAgZW5hYmxlZDphY3RpdmU6YmctZ3JheS1hbHBoYS0yMDAgZm9jdXMtdmlzaWJsZTp0ZXh0LWdyYXktMTAwMCcsXG4gICAgICAgIG11dGVkOlxuICAgICAgICAgICd0ZXh0LWdyYXktOTAwIGVuYWJsZWQ6aG92ZXI6YmctZ3JheS1hbHBoYS0yMDAgZW5hYmxlZDpob3Zlcjp0ZXh0LWdyYXktMTAwMCBlbmFibGVkOmFjdGl2ZTpiZy1ncmF5LWFscGhhLTIwMCBmb2N1cy12aXNpYmxlOnRleHQtZ3JheS0xMDAwJyxcbiAgICAgIH0sXG4gICAgICBzaXplOiB7XG4gICAgICAgIHRpbnk6ICdoLTYgdy02IHJvdW5kZWQtWzRweF0gWyZfc3ZnXTpoLTQgWyZfc3ZnXTp3LTQnLFxuICAgICAgICBzbWFsbDogJ2gtOCB3LTggcm91bmRlZC1tZCBbJl9zdmddOmgtNCBbJl9zdmddOnctNCcsXG4gICAgICB9LFxuICAgIH0sXG4gICAgZGVmYXVsdFZhcmlhbnRzOiB7XG4gICAgICB2YXJpYW50OiAndGVydGlhcnknLFxuICAgICAgc2l6ZTogJ3RpbnknLFxuICAgIH0sXG4gIH1cbik7XG5cbmV4cG9ydCB0eXBlIEljb25CdXR0b25Qcm9wcyA9IE9taXQ8XG4gIFJlYWN0LkJ1dHRvbkhUTUxBdHRyaWJ1dGVzPEhUTUxCdXR0b25FbGVtZW50PixcbiAgJ3R5cGUnXG4+ICZcbiAgVmFyaWFudFByb3BzPHR5cGVvZiBpY29uQnV0dG9uVmFyaWFudHM+ICYge1xuICAgICdhcmlhLWxhYmVsJzogc3RyaW5nO1xuICAgIHR5cGU/OiAnYnV0dG9uJyB8ICdzdWJtaXQnIHwgJ3Jlc2V0JztcbiAgfTtcblxuZXhwb3J0IGNvbnN0IEljb25CdXR0b24gPSBSZWFjdC5mb3J3YXJkUmVmPEhUTUxCdXR0b25FbGVtZW50LCBJY29uQnV0dG9uUHJvcHM+KFxuICAoeyBjbGFzc05hbWUsIHZhcmlhbnQsIHNpemUsIHR5cGUgPSAnYnV0dG9uJywgLi4ucHJvcHMgfSwgcmVmKSA9PiAoXG4gICAgPGJ1dHRvblxuICAgICAgcmVmPXtyZWZ9XG4gICAgICB0eXBlPXt0eXBlfVxuICAgICAgY2xhc3NOYW1lPXtjbihpY29uQnV0dG9uVmFyaWFudHMoeyB2YXJpYW50LCBzaXplLCBjbGFzc05hbWUgfSkpfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbik7XG5JY29uQnV0dG9uLmRpc3BsYXlOYW1lID0gJ0ljb25CdXR0b24nO1xuXG5leHBvcnQgeyBpY29uQnV0dG9uVmFyaWFudHMgfTtcbiJdfQ==
@@ -1,17 +1,16 @@
1
1
  /**
2
2
  * Shared theme configuration for react-inspector's ObjectInspector.
3
3
  *
4
- * Color choices are inspired by Node.js `util.inspect()` ANSI stylizing:
5
- * - property names: unstyled (default foreground dark text on light, light text on dark)
6
- * - strings / symbols: green
7
- * - numbers / booleans / bigint: yellow
8
- * - null: bold (foreground)
9
- * - undefined: grey
10
- * - regexp: red
11
- * - functions (special): cyan
12
- * - date: magenta
4
+ * Colors follow Geist's Shiki JSON palette so the inspector reads the same
5
+ * as highlighted code blocks across the product:
6
+ * - property names / punctuation: --ds-gray-1000 (default foreground)
7
+ * - strings / numbers / booleans: --ds-green-900
8
+ * - null / undefined: --ds-gray-900 (muted)
9
+ * - regexp / function: --ds-purple-900
10
+ * - date: --ds-pink-900
13
11
  *
14
- * See: https://github.com/nodejs/node/blob/main/lib/internal/util/inspect.js
12
+ * Because the `--ds-*` tokens adapt to theme automatically, the light and
13
+ * dark objects are intentionally identical.
15
14
  */
16
15
  export interface InspectorThemeExtended {
17
16
  /** Color for Date values (Node: 'magenta') */
@@ -1 +1 @@
1
- {"version":3,"file":"inspector-theme.d.ts","sourceRoot":"","sources":["../../../src/components/ui/inspector-theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAOH,MAAM,WAAW,sBAAsB;IACrC,8CAA8C;IAC9C,uBAAuB,EAAE,MAAM,CAAC;CACjC;AAED,eAAO,MAAM,2BAA2B,EAAE,sBAEzC,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,sBAExC,CAAC;AA2BF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2C/B,CAAC;AAMF,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2C9B,CAAC"}
1
+ {"version":3,"file":"inspector-theme.d.ts","sourceRoot":"","sources":["../../../src/components/ui/inspector-theme.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAOH,MAAM,WAAW,sBAAsB;IACrC,8CAA8C;IAC9C,uBAAuB,EAAE,MAAM,CAAC;CACjC;AAED,eAAO,MAAM,2BAA2B,EAAE,sBAEzC,CAAC;AAEF,eAAO,MAAM,0BAA0B,EAAE,sBAExC,CAAC;AAwEF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAa,CAAC;AAM9C,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAa,CAAC"}