@citolab/qti-components 7.3.0 → 7.3.2

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 (393) hide show
  1. package/cdn/chunks/chunk-2F7QLIQX.js +2 -0
  2. package/cdn/chunks/chunk-2TNA4LAA.js +5 -0
  3. package/cdn/chunks/chunk-3KGTXIVH.js +8 -0
  4. package/cdn/chunks/chunk-3XOKPK45.js +2 -0
  5. package/cdn/chunks/chunk-42P7F3FC.js +73 -0
  6. package/cdn/chunks/chunk-4DVWMPIY.js +1 -0
  7. package/cdn/chunks/chunk-4HPXSOYI.js +8 -0
  8. package/cdn/chunks/chunk-4NRLYCX4.js +1 -0
  9. package/cdn/chunks/chunk-57WZEH27.js +8 -0
  10. package/cdn/chunks/chunk-5EXLLJZQ.js +1 -0
  11. package/cdn/chunks/chunk-5F23N5NY.js +1 -0
  12. package/cdn/chunks/chunk-5PA3GEIX.js +2 -0
  13. package/cdn/chunks/chunk-5TWGFLOQ.js +8 -0
  14. package/cdn/chunks/chunk-65CZNGQC.js +55 -0
  15. package/cdn/chunks/chunk-65EW446C.js +6 -0
  16. package/cdn/chunks/chunk-6BGG2JJR.js +24 -0
  17. package/cdn/chunks/chunk-6IUESNBB.js +8 -0
  18. package/cdn/chunks/chunk-6K2ZYRFF.js +8 -0
  19. package/cdn/chunks/chunk-774W6MHT.js +8 -0
  20. package/cdn/chunks/chunk-7Q4OOYXA.js +1 -0
  21. package/cdn/chunks/chunk-7VGFTHNK.js +1492 -0
  22. package/cdn/chunks/chunk-7WJYJA45.js +59 -0
  23. package/cdn/chunks/chunk-AA47N7CH.js +1 -0
  24. package/cdn/chunks/chunk-AEDTBA25.js +1 -0
  25. package/cdn/chunks/chunk-AZLSV74C.js +8 -0
  26. package/cdn/chunks/chunk-BB7HFL7K.js +1 -0
  27. package/cdn/chunks/chunk-BMOQZEO2.js +1 -0
  28. package/cdn/chunks/chunk-C26NWYVO.js +2 -0
  29. package/cdn/chunks/chunk-CIIKVJF7.js +2 -0
  30. package/cdn/chunks/chunk-CMGZUMGV.js +2 -0
  31. package/cdn/chunks/chunk-D4A6UBNV.js +41 -0
  32. package/cdn/chunks/chunk-DCSFLPLR.js +8 -0
  33. package/cdn/chunks/chunk-DDA3QNFL.js +1 -0
  34. package/cdn/chunks/chunk-DEWOG57H.js +1 -0
  35. package/cdn/chunks/chunk-DHC7PAPQ.js +8 -0
  36. package/cdn/chunks/chunk-DNY4M5BB.js +8 -0
  37. package/cdn/chunks/chunk-DPR3I67K.js +1 -0
  38. package/cdn/chunks/chunk-DQTXWGN5.js +48 -0
  39. package/cdn/chunks/chunk-DTLI3JJ6.js +8 -0
  40. package/cdn/chunks/chunk-DZTNCG5K.js +2 -0
  41. package/cdn/chunks/chunk-E46WIJKQ.js +5 -0
  42. package/cdn/chunks/chunk-ER2TCZX3.js +8 -0
  43. package/cdn/chunks/chunk-EVDUKDZH.js +1 -0
  44. package/cdn/chunks/chunk-EWRXIRZJ.js +8 -0
  45. package/cdn/chunks/chunk-EZJSKOLP.js +5 -0
  46. package/cdn/chunks/chunk-F6VI7SEZ.js +5 -0
  47. package/cdn/chunks/chunk-FGR3JZXL.js +48 -0
  48. package/cdn/chunks/chunk-FREEF447.js +2 -0
  49. package/cdn/chunks/chunk-G66B3SKF.js +2 -0
  50. package/cdn/chunks/chunk-GFVOBN7D.js +8 -0
  51. package/cdn/chunks/chunk-GOXH3AYH.js +5 -0
  52. package/cdn/chunks/chunk-GVKNKCU6.js +1492 -0
  53. package/cdn/chunks/chunk-H3WTP2FL.js +2 -0
  54. package/cdn/chunks/chunk-HE62L5UT.js +1 -0
  55. package/cdn/chunks/chunk-HH6AFB54.js +1492 -0
  56. package/cdn/chunks/chunk-IEHCQ5EK.js +2 -0
  57. package/cdn/chunks/chunk-IEOQ2ZTN.js +3461 -0
  58. package/cdn/chunks/chunk-IPAFN4CK.js +1 -0
  59. package/cdn/chunks/chunk-JHBAY3L2.js +8 -0
  60. package/cdn/chunks/chunk-JKUNDLQR.js +1 -0
  61. package/cdn/chunks/chunk-KLXWDMHE.js +1 -0
  62. package/cdn/chunks/chunk-KP5NLKZ5.js +1 -0
  63. package/cdn/chunks/chunk-KXXIBL5Z.js +8 -0
  64. package/cdn/chunks/chunk-LBB5CUEL.js +8 -0
  65. package/cdn/chunks/chunk-LHAF7DPW.js +2 -0
  66. package/cdn/chunks/chunk-LUNOUEBJ.js +8 -0
  67. package/cdn/chunks/chunk-M3RRG6KY.js +1 -0
  68. package/cdn/chunks/chunk-M4LLTEOD.js +8 -0
  69. package/cdn/chunks/chunk-MH2Z24XO.js +1 -0
  70. package/cdn/chunks/chunk-N3YBYEEI.js +2 -0
  71. package/cdn/chunks/chunk-N5BGKNYJ.js +5 -0
  72. package/cdn/chunks/chunk-NPVEQKUL.js +2 -0
  73. package/cdn/chunks/chunk-ODMQDF6O.js +1 -0
  74. package/cdn/chunks/chunk-OW2KBDBG.js +8 -0
  75. package/cdn/chunks/chunk-PQJD55CB.js +8 -0
  76. package/cdn/chunks/chunk-PUI3LIFH.js +0 -0
  77. package/cdn/chunks/chunk-QHO7IBHQ.js +2 -0
  78. package/cdn/chunks/chunk-QTTXN3LY.js +2 -0
  79. package/cdn/chunks/chunk-RQHP2XKF.js +8 -0
  80. package/cdn/chunks/chunk-RUQA3BBO.js +8 -0
  81. package/cdn/chunks/chunk-RZGOUINM.js +1 -0
  82. package/cdn/chunks/chunk-SAXGGMLU.js +8 -0
  83. package/cdn/chunks/chunk-SDSLRCON.js +1 -0
  84. package/cdn/chunks/chunk-SDWXKOZK.js +8 -0
  85. package/cdn/chunks/chunk-T4K75PFT.js +1 -0
  86. package/cdn/chunks/chunk-TC54XTRL.js +17 -0
  87. package/cdn/chunks/chunk-TDS4LYUD.js +8 -0
  88. package/cdn/chunks/chunk-U5Y5T4ZS.js +17 -0
  89. package/cdn/chunks/chunk-U7DWV6B3.js +5 -0
  90. package/cdn/chunks/chunk-UB5MEEVK.js +8 -0
  91. package/cdn/chunks/chunk-UN2WT4WS.js +2 -0
  92. package/cdn/chunks/chunk-UU5PAEUU.js +1 -0
  93. package/cdn/chunks/chunk-UX37G5GZ.js +8 -0
  94. package/cdn/chunks/chunk-UZYJ2YET.js +1 -0
  95. package/cdn/chunks/chunk-VGNWADCN.js +1 -0
  96. package/cdn/chunks/chunk-VXQNVDBK.js +1 -0
  97. package/cdn/chunks/chunk-W6GUPXZV.js +1492 -0
  98. package/cdn/chunks/chunk-WC5YAZM2.js +5 -0
  99. package/cdn/chunks/chunk-WLTLNYTT.js +8 -0
  100. package/cdn/chunks/chunk-WNRGD6XK.js +1 -0
  101. package/cdn/chunks/chunk-X6XQ42NC.js +1 -0
  102. package/cdn/chunks/chunk-X6XRXEW2.js +2 -0
  103. package/cdn/chunks/chunk-XB37N5IN.js +1 -0
  104. package/cdn/chunks/chunk-XCXGSLM4.js +2 -0
  105. package/cdn/chunks/chunk-XFUCW4CT.js +5 -0
  106. package/cdn/chunks/chunk-XQIN4PIX.js +10 -0
  107. package/cdn/chunks/chunk-XY3YXM26.js +8 -0
  108. package/cdn/chunks/chunk-YGJSWINU.js +1 -0
  109. package/cdn/chunks/chunk-YXM5LVFL.js +1 -0
  110. package/cdn/chunks/chunk-YXZ773BI.js +1 -0
  111. package/cdn/chunks/chunk-YZCE7WOL.js +1 -0
  112. package/cdn/chunks/chunk-ZJK77QYF.js +8 -0
  113. package/cdn/chunks/chunk-ZSLIH67U.js +1 -0
  114. package/cdn/exports/computed-item.context.js +1 -1
  115. package/cdn/exports/computed.context.js +1 -1
  116. package/cdn/exports/config.context.js +1 -1
  117. package/cdn/exports/interaction.js +1 -1
  118. package/cdn/exports/qti-assessment-item.context.js +1 -1
  119. package/cdn/exports/qti-condition-expression.js +1 -1
  120. package/cdn/exports/qti-expression.js +1 -1
  121. package/cdn/exports/session.context.js +1 -1
  122. package/cdn/exports/test.context.js +1 -1
  123. package/cdn/index.global.js +1 -1
  124. package/cdn/index.js +1 -1
  125. package/cdn/qti-components/index.js +1 -1
  126. package/cdn/qti-item/components/item-container.js +1 -1
  127. package/cdn/qti-item/components/item-show-correct-response.js +1 -1
  128. package/cdn/qti-item/components/print-item-variables.js +1 -1
  129. package/cdn/qti-item/components/styles.js +1 -1
  130. package/cdn/qti-item/core/index.js +1 -1
  131. package/cdn/qti-test/components/index.js +1 -1
  132. package/cdn/qti-test/components/styles.js +1 -1
  133. package/cdn/qti-test/components/test-check-item.js +1 -0
  134. package/cdn/qti-test/components/test-container.js +1 -1
  135. package/cdn/qti-test/components/test-end-attempt.js +1 -1
  136. package/cdn/qti-test/components/test-item-link.js +1 -1
  137. package/cdn/qti-test/components/test-navigation.js +1 -1
  138. package/cdn/qti-test/components/test-next.js +1 -1
  139. package/cdn/qti-test/components/test-paging-buttons-stamp.js +1 -1
  140. package/cdn/qti-test/components/test-prev.js +1 -1
  141. package/cdn/qti-test/components/test-print-context.js +1 -1
  142. package/cdn/qti-test/components/test-print-item-variables.js +1 -1
  143. package/cdn/qti-test/components/test-scoring-buttons.js +1 -1
  144. package/cdn/qti-test/components/test-scoring-feedback.js +1 -1
  145. package/cdn/qti-test/components/test-section-buttons-stamp.js +1 -1
  146. package/cdn/qti-test/components/test-section-link.js +1 -1
  147. package/cdn/qti-test/components/test-show-correct-response.js +1 -1
  148. package/cdn/qti-test/components/test-stamp.js +1 -1
  149. package/cdn/qti-test/components/test-view-toggle.js +1 -1
  150. package/cdn/qti-test/components/test-view.js +1 -1
  151. package/cdn/qti-test/core/index.js +1 -1
  152. package/dist/chunks/chunk-24ZEUR6V.js +91 -0
  153. package/dist/chunks/chunk-24ZEUR6V.js.map +1 -0
  154. package/dist/chunks/chunk-25SPL2N7.js +296 -0
  155. package/dist/chunks/chunk-25SPL2N7.js.map +1 -0
  156. package/dist/chunks/chunk-2L6I23IQ.js +308 -0
  157. package/dist/chunks/chunk-2L6I23IQ.js.map +1 -0
  158. package/dist/chunks/chunk-3FIHHFFC.js +307 -0
  159. package/dist/chunks/chunk-3FIHHFFC.js.map +1 -0
  160. package/dist/chunks/chunk-3IAZELYI.js +90 -0
  161. package/dist/chunks/chunk-3IAZELYI.js.map +1 -0
  162. package/dist/chunks/chunk-3YJPKRFS.js +91 -0
  163. package/dist/chunks/chunk-3YJPKRFS.js.map +1 -0
  164. package/dist/chunks/chunk-5AZFPSD4.js +87 -0
  165. package/dist/chunks/chunk-5AZFPSD4.js.map +1 -0
  166. package/dist/chunks/chunk-5OZP32ZZ.js +90 -0
  167. package/dist/chunks/chunk-5OZP32ZZ.js.map +1 -0
  168. package/dist/chunks/chunk-5QGG5BMS.js +45 -0
  169. package/dist/chunks/chunk-5QGG5BMS.js.map +1 -0
  170. package/dist/chunks/chunk-5SU6S5L4.js +94 -0
  171. package/dist/chunks/chunk-5SU6S5L4.js.map +1 -0
  172. package/dist/chunks/chunk-5WHKITF6.js +90 -0
  173. package/dist/chunks/chunk-5WHKITF6.js.map +1 -0
  174. package/dist/chunks/chunk-64JRMFTB.js +93 -0
  175. package/dist/chunks/chunk-64JRMFTB.js.map +1 -0
  176. package/dist/chunks/chunk-6BNGNEZW.js +308 -0
  177. package/dist/chunks/chunk-6BNGNEZW.js.map +1 -0
  178. package/dist/chunks/chunk-6DMR7L77.js +44 -0
  179. package/dist/chunks/chunk-6DMR7L77.js.map +1 -0
  180. package/dist/chunks/chunk-6N4WVDBR.js +95 -0
  181. package/dist/chunks/chunk-6N4WVDBR.js.map +1 -0
  182. package/dist/chunks/chunk-6SGCKTJ6.js +88 -0
  183. package/dist/chunks/chunk-6SGCKTJ6.js.map +1 -0
  184. package/dist/chunks/chunk-6U3U2UIA.js +887 -0
  185. package/dist/chunks/chunk-6U3U2UIA.js.map +1 -0
  186. package/dist/chunks/chunk-745MFIEL.js +238 -0
  187. package/dist/chunks/chunk-745MFIEL.js.map +1 -0
  188. package/dist/chunks/chunk-7NNYV6VG.js +95 -0
  189. package/dist/chunks/chunk-7NNYV6VG.js.map +1 -0
  190. package/dist/chunks/chunk-7OMJMXHK.js +50 -0
  191. package/dist/chunks/chunk-7OMJMXHK.js.map +1 -0
  192. package/dist/chunks/chunk-7YI2I5U2.js +238 -0
  193. package/dist/chunks/chunk-7YI2I5U2.js.map +1 -0
  194. package/dist/chunks/chunk-AOXSRF6N.js +7309 -0
  195. package/dist/chunks/chunk-AOXSRF6N.js.map +1 -0
  196. package/dist/chunks/chunk-B7BLTXGS.js +88 -0
  197. package/dist/chunks/chunk-B7BLTXGS.js.map +1 -0
  198. package/dist/chunks/chunk-BI3RICFC.js +300 -0
  199. package/dist/chunks/chunk-BI3RICFC.js.map +1 -0
  200. package/dist/chunks/chunk-BTZQDUT6.js +44 -0
  201. package/dist/chunks/chunk-BTZQDUT6.js.map +1 -0
  202. package/dist/chunks/chunk-CTPQMLOA.js +88 -0
  203. package/dist/chunks/chunk-CTPQMLOA.js.map +1 -0
  204. package/dist/chunks/chunk-DGPPAIBY.js +307 -0
  205. package/dist/chunks/chunk-DGPPAIBY.js.map +1 -0
  206. package/dist/chunks/chunk-DJ7XZ2UR.js +91 -0
  207. package/dist/chunks/chunk-DJ7XZ2UR.js.map +1 -0
  208. package/dist/chunks/chunk-DLCEFRYR.js +887 -0
  209. package/dist/chunks/chunk-DLCEFRYR.js.map +1 -0
  210. package/dist/chunks/chunk-DLVJXJLB.js +90 -0
  211. package/dist/chunks/chunk-DLVJXJLB.js.map +1 -0
  212. package/dist/chunks/chunk-EVOMGJVT.js +95 -0
  213. package/dist/chunks/chunk-EVOMGJVT.js.map +1 -0
  214. package/dist/chunks/chunk-EYWDGFIX.js +89 -0
  215. package/dist/chunks/chunk-EYWDGFIX.js.map +1 -0
  216. package/dist/chunks/chunk-F5OPIJ4X.js +90 -0
  217. package/dist/chunks/chunk-F5OPIJ4X.js.map +1 -0
  218. package/dist/chunks/chunk-FEXZ676E.js +304 -0
  219. package/dist/chunks/chunk-FEXZ676E.js.map +1 -0
  220. package/dist/chunks/chunk-FH34FO6K.js +238 -0
  221. package/dist/chunks/chunk-FH34FO6K.js.map +1 -0
  222. package/dist/chunks/chunk-FIAJJAPH.js +85 -0
  223. package/dist/chunks/chunk-FIAJJAPH.js.map +1 -0
  224. package/dist/chunks/chunk-FQVFSQFE.js +238 -0
  225. package/dist/chunks/chunk-FQVFSQFE.js.map +1 -0
  226. package/dist/chunks/chunk-G3M2356A.js +889 -0
  227. package/dist/chunks/chunk-G3M2356A.js.map +1 -0
  228. package/dist/chunks/chunk-GA2EWU3T.js +102 -0
  229. package/dist/chunks/chunk-GA2EWU3T.js.map +1 -0
  230. package/dist/chunks/chunk-GEEYD5SH.js +7310 -0
  231. package/dist/chunks/chunk-GEEYD5SH.js.map +1 -0
  232. package/dist/chunks/chunk-GIHLVK5S.js +103 -0
  233. package/dist/chunks/chunk-GIHLVK5S.js.map +1 -0
  234. package/dist/chunks/chunk-GV4LNJKM.js +248 -0
  235. package/dist/chunks/chunk-GV4LNJKM.js.map +1 -0
  236. package/dist/chunks/chunk-H2HBYOZZ.js +90 -0
  237. package/dist/chunks/chunk-H2HBYOZZ.js.map +1 -0
  238. package/dist/chunks/chunk-H6RDLSTK.js +87 -0
  239. package/dist/chunks/chunk-H6RDLSTK.js.map +1 -0
  240. package/dist/chunks/chunk-HIFFHC2Z.js +887 -0
  241. package/dist/chunks/chunk-HIFFHC2Z.js.map +1 -0
  242. package/dist/chunks/chunk-HUQGTGCK.js +91 -0
  243. package/dist/chunks/chunk-HUQGTGCK.js.map +1 -0
  244. package/dist/chunks/chunk-IAZM2LUL.js +87 -0
  245. package/dist/chunks/chunk-IAZM2LUL.js.map +1 -0
  246. package/dist/chunks/chunk-IDRQNT6W.js +86 -0
  247. package/dist/chunks/chunk-IDRQNT6W.js.map +1 -0
  248. package/dist/chunks/chunk-IRKYNGZN.js +90 -0
  249. package/dist/chunks/chunk-IRKYNGZN.js.map +1 -0
  250. package/dist/chunks/chunk-IWQR5TSB.js +43 -0
  251. package/dist/chunks/chunk-IWQR5TSB.js.map +1 -0
  252. package/dist/chunks/chunk-J4RNYEIE.js +85 -0
  253. package/dist/chunks/chunk-J4RNYEIE.js.map +1 -0
  254. package/dist/chunks/chunk-K5F4CT37.js +82 -0
  255. package/dist/chunks/chunk-K5F4CT37.js.map +1 -0
  256. package/dist/chunks/chunk-L7HOSFNE.js +307 -0
  257. package/dist/chunks/chunk-L7HOSFNE.js.map +1 -0
  258. package/dist/chunks/chunk-LBL5YIK7.js +94 -0
  259. package/dist/chunks/chunk-LBL5YIK7.js.map +1 -0
  260. package/dist/chunks/chunk-MGC6UY5C.js +85 -0
  261. package/dist/chunks/chunk-MGC6UY5C.js.map +1 -0
  262. package/dist/chunks/chunk-MK5KU4FM.js +7303 -0
  263. package/dist/chunks/chunk-MK5KU4FM.js.map +1 -0
  264. package/dist/chunks/chunk-MKPVFZUH.js +88 -0
  265. package/dist/chunks/chunk-MKPVFZUH.js.map +1 -0
  266. package/dist/chunks/chunk-MTWSJYVA.js +86 -0
  267. package/dist/chunks/chunk-MTWSJYVA.js.map +1 -0
  268. package/dist/chunks/chunk-NJTIAZBT.js +236 -0
  269. package/dist/chunks/chunk-NJTIAZBT.js.map +1 -0
  270. package/dist/chunks/chunk-O2AQND3R.js +889 -0
  271. package/dist/chunks/chunk-O2AQND3R.js.map +1 -0
  272. package/dist/chunks/chunk-O2SG4LAF.js +294 -0
  273. package/dist/chunks/chunk-O2SG4LAF.js.map +1 -0
  274. package/dist/chunks/chunk-POGGEBHU.js +294 -0
  275. package/dist/chunks/chunk-POGGEBHU.js.map +1 -0
  276. package/dist/chunks/chunk-PRO3U224.js +91 -0
  277. package/dist/chunks/chunk-PRO3U224.js.map +1 -0
  278. package/dist/chunks/chunk-PWLZEXO4.js +89 -0
  279. package/dist/chunks/chunk-PWLZEXO4.js.map +1 -0
  280. package/dist/chunks/chunk-Q7Q24WJK.js +227 -0
  281. package/dist/chunks/chunk-Q7Q24WJK.js.map +1 -0
  282. package/dist/chunks/chunk-QBRVWBMH.js +230 -0
  283. package/dist/chunks/chunk-QBRVWBMH.js.map +1 -0
  284. package/dist/chunks/chunk-R5EYCFY4.js +91 -0
  285. package/dist/chunks/chunk-R5EYCFY4.js.map +1 -0
  286. package/dist/chunks/chunk-RHXLL5D3.js +264 -0
  287. package/dist/chunks/chunk-RHXLL5D3.js.map +1 -0
  288. package/dist/chunks/chunk-SGNRQWTB.js +887 -0
  289. package/dist/chunks/chunk-SGNRQWTB.js.map +1 -0
  290. package/dist/chunks/chunk-SOKWNLL4.js +89 -0
  291. package/dist/chunks/chunk-SOKWNLL4.js.map +1 -0
  292. package/dist/chunks/chunk-TWYN56XO.js +92 -0
  293. package/dist/chunks/chunk-TWYN56XO.js.map +1 -0
  294. package/dist/chunks/chunk-U2662SPQ.js +887 -0
  295. package/dist/chunks/chunk-U2662SPQ.js.map +1 -0
  296. package/dist/chunks/chunk-UNYT7ZNM.js +85 -0
  297. package/dist/chunks/chunk-UNYT7ZNM.js.map +1 -0
  298. package/dist/chunks/chunk-UUZFQW3D.js +889 -0
  299. package/dist/chunks/chunk-UUZFQW3D.js.map +1 -0
  300. package/dist/chunks/chunk-VIBFS7K3.js +229 -0
  301. package/dist/chunks/chunk-VIBFS7K3.js.map +1 -0
  302. package/dist/chunks/chunk-VVPQCJL6.js +264 -0
  303. package/dist/chunks/chunk-VVPQCJL6.js.map +1 -0
  304. package/dist/chunks/chunk-VY73H2OD.js +238 -0
  305. package/dist/chunks/chunk-VY73H2OD.js.map +1 -0
  306. package/dist/chunks/chunk-W7DAMVVM.js +90 -0
  307. package/dist/chunks/chunk-W7DAMVVM.js.map +1 -0
  308. package/dist/chunks/chunk-WTV3RW6F.js +91 -0
  309. package/dist/chunks/chunk-WTV3RW6F.js.map +1 -0
  310. package/dist/chunks/chunk-XB2AUIYM.js +232 -0
  311. package/dist/chunks/chunk-XB2AUIYM.js.map +1 -0
  312. package/dist/chunks/chunk-XBJQTK4U.js +91 -0
  313. package/dist/chunks/chunk-XBJQTK4U.js.map +1 -0
  314. package/dist/chunks/chunk-XH6AMJFY.js +238 -0
  315. package/dist/chunks/chunk-XH6AMJFY.js.map +1 -0
  316. package/dist/chunks/chunk-XNQ4ARRB.js +90 -0
  317. package/dist/chunks/chunk-XNQ4ARRB.js.map +1 -0
  318. package/dist/chunks/chunk-Y5S4XHSH.js +133 -0
  319. package/dist/chunks/chunk-Y5S4XHSH.js.map +1 -0
  320. package/dist/chunks/chunk-YC72WJT5.js +88 -0
  321. package/dist/chunks/chunk-YC72WJT5.js.map +1 -0
  322. package/dist/chunks/chunk-YMQNOCS2.js +246 -0
  323. package/dist/chunks/chunk-YMQNOCS2.js.map +1 -0
  324. package/dist/chunks/chunk-Z6EJ36PR.js +307 -0
  325. package/dist/chunks/chunk-Z6EJ36PR.js.map +1 -0
  326. package/dist/chunks/chunk-ZEEFMPDJ.js +238 -0
  327. package/dist/chunks/chunk-ZEEFMPDJ.js.map +1 -0
  328. package/dist/chunks/chunk-ZGSNDSK3.js +1 -0
  329. package/dist/chunks/chunk-ZGSNDSK3.js.map +1 -0
  330. package/dist/chunks/chunk-ZLULX3V3.js +264 -0
  331. package/dist/chunks/chunk-ZLULX3V3.js.map +1 -0
  332. package/dist/chunks/chunk-ZO6ZTWFN.js +99 -0
  333. package/dist/chunks/chunk-ZO6ZTWFN.js.map +1 -0
  334. package/dist/chunks/chunk-ZSAPTO2I.js +85 -0
  335. package/dist/chunks/chunk-ZSAPTO2I.js.map +1 -0
  336. package/dist/chunks/chunk-ZW6ND3PL.js +307 -0
  337. package/dist/chunks/chunk-ZW6ND3PL.js.map +1 -0
  338. package/dist/exports/computed-item.context.d.ts +1 -1
  339. package/dist/exports/computed.context.d.ts +2 -2
  340. package/dist/exports/interaction.d.ts +1 -1
  341. package/dist/exports/item.context.d.ts +1 -1
  342. package/dist/exports/qti-assessment-item.context.d.ts +1 -1
  343. package/dist/exports/qti-condition-expression.d.ts +1 -1
  344. package/dist/exports/qti-expression.d.ts +1 -1
  345. package/dist/exports/session.context.d.ts +2 -2
  346. package/dist/exports/test.context.d.ts +1 -1
  347. package/dist/exports/variables.d.ts +1 -1
  348. package/dist/index.d.ts +3 -2
  349. package/dist/index.js +19 -16
  350. package/dist/qti-components/index.d.ts +2 -2
  351. package/dist/qti-components/index.js +1 -1
  352. package/dist/qti-components-jsx.d.ts +63 -18
  353. package/dist/qti-item/components/item-show-correct-response.d.ts +1 -1
  354. package/dist/qti-item/components/print-item-variables.d.ts +1 -1
  355. package/dist/qti-item/core/index.d.ts +1 -1
  356. package/dist/qti-loader/index.d.ts +1 -1
  357. package/dist/qti-response-declaration-0TYT5oEz.d.ts +1171 -0
  358. package/dist/qti-response-declaration-B0WM2iOU.d.ts +1113 -0
  359. package/dist/qti-response-declaration-tkYP2TfV.d.ts +1112 -0
  360. package/dist/qti-response-declaration-y-C5AMTr.d.ts +1115 -0
  361. package/dist/qti-test/components/index.d.ts +3 -2
  362. package/dist/qti-test/components/index.js +17 -14
  363. package/dist/qti-test/components/test-check-item.d.ts +16 -0
  364. package/dist/qti-test/components/test-check-item.js +9 -0
  365. package/dist/qti-test/components/test-check-item.js.map +1 -0
  366. package/dist/qti-test/components/test-navigation.d.ts +2 -2
  367. package/dist/qti-test/components/test-navigation.js +1 -1
  368. package/dist/qti-test/components/test-next.d.ts +2 -3
  369. package/dist/qti-test/components/test-next.js +1 -4
  370. package/dist/qti-test/components/test-paging-buttons-stamp.d.ts +3 -0
  371. package/dist/qti-test/components/test-paging-buttons-stamp.js +1 -1
  372. package/dist/qti-test/components/test-prev.d.ts +2 -2
  373. package/dist/qti-test/components/test-prev.js +1 -2
  374. package/dist/qti-test/components/test-print-context.d.ts +2 -2
  375. package/dist/qti-test/components/test-print-item-variables.d.ts +2 -2
  376. package/dist/qti-test/components/test-scoring-buttons.d.ts +2 -2
  377. package/dist/qti-test/components/test-scoring-buttons.js +1 -1
  378. package/dist/qti-test/components/test-scoring-feedback.d.ts +2 -2
  379. package/dist/qti-test/components/test-section-buttons-stamp.d.ts +3 -0
  380. package/dist/qti-test/components/test-section-buttons-stamp.js +1 -1
  381. package/dist/qti-test/components/test-show-correct-response.d.ts +5 -2
  382. package/dist/qti-test/components/test-show-correct-response.js +1 -1
  383. package/dist/qti-test/components/test-stamp.d.ts +8 -2
  384. package/dist/qti-test/components/test-stamp.js +1 -1
  385. package/dist/qti-test/core/index.d.ts +4 -3
  386. package/dist/qti-test/core/index.js +2 -2
  387. package/dist/qti-test-feedback-Bth3dOO1.d.ts +85 -0
  388. package/dist/qti-test-feedback-C6Z0bJMR.d.ts +85 -0
  389. package/dist/qti-test-feedback-CcyKpmkY.d.ts +85 -0
  390. package/dist/qti-test-feedback-D8AwiYTL.d.ts +85 -0
  391. package/dist/vscode.html-custom-data.json +30 -13
  392. package/package.json +6 -5
  393. package/readme.md +4 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/qti-test/core/qti-test.ts","../../src/lib/qti-test/core/mixins/test-navigation.mixin.ts","../../src/lib/qti-test/core/mixins/test-view.mixin.ts","../../src/lib/qti-test/core/test-base.ts","../../src/lib/qti-test/core/mixins/test-processing.mixin.ts","../../src/lib/qti-test/core/qti-assessment-test/qti-assessment-item-ref.ts","../../src/lib/qti-test/core/qti-assessment-test/qti-assessment-section.ts","../../src/lib/qti-test/core/qti-assessment-test/qti-assessment-test.ts","../../src/lib/qti-test/core/qti-assessment-test/qti-test-part.ts","../../src/lib/qti-test/core/qti-assessment-test/qti-test-feedback.ts"],"sourcesContent":["import { html } from 'lit';\nimport { customElement } from 'lit/decorators.js';\n\nimport { TestNavigationMixin, TestViewMixin } from './mixins';\nimport { TestBase } from './test-base';\nimport { TestProcessingMixin } from './mixins/test-processing.mixin';\n\n/**\n * `<qti-test>` is a custom element designed for rendering and interacting with QTI (Question and Test Interoperability) tests.\n *\n * This component leverages several mixins to provide functionality for loading, navigating, processing, and displaying QTI test assessments.\n *\n * ### Example Usage\n *\n * Minimal example including navigation:\n *\n * ```html\n * <qti-test>\n * <test-navigation>\n * <test-container test-url=\"./path/to/assessment.xml\"></test-container>\n * <nav class=\"flex\">\n * <test-prev></test-prev>\n * <test-next></test-next>\n * </nav>\n * </test-navigation>\n * </qti-test>\n * ```\n *\n * Use the following file structure\n * A qti-test loads a QTI3.0 assessmenttest.xml file from a package folder.\n *\n * ```plaintext\n * Root/\n * ├── index.html\n * └── /assets/api/examples/\n * ├── assessmenttest.xml\n * └── imsmanifest.xml\n *\n * ```\n *\n * ### Test components\n *\n * Use test components inside the qti-test component for added functionality.\n * ### Test next\n * `<test-next> | TestNext`\n *\n * ### Test prev\n *\n * `<test-prev> | TestPrev`\n * ### Test components\n *\n * You can use normal class names to style the elements.\n * And you can use the `test-prev` and `test-next` elements to navigate through the test.\n *\n */\n@customElement('qti-test')\nexport class QtiTest extends TestNavigationMixin(TestViewMixin(TestProcessingMixin(TestBase))) {\n // export class QtiTest extends TestLoaderMixin(TestNavigationMixin(TestViewMixin(TestBase))) {\n /**\n * Renders the component's template.\n * Provides a default `<slot>` for content projection.\n */\n async connectedCallback(): Promise<void> {\n super.connectedCallback();\n await this.updateComplete;\n this.dispatchEvent(new CustomEvent('qti-test-connected', { detail: this }));\n }\n render() {\n return html`<slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-test': QtiTest;\n }\n}\n","import { property } from 'lit/decorators.js';\n\nimport { qtiTransformItem } from '../../../qti-transformers';\n\nimport type { QtiAssessmentItemRef, QtiAssessmentSection, QtiAssessmentTest } from '../qti-assessment-test';\nimport type { TestBase } from '../test-base';\n\ntype Constructor<T = {}> = abstract new (...args: any[]) => T;\n\n// Define error types for better error handling\nenum NavigationErrorType {\n ITEM_NOT_FOUND = 'item-not-found',\n SECTION_NOT_FOUND = 'section-not-found',\n LOAD_ERROR = 'load-error',\n NETWORK_ERROR = 'network-error',\n TIMEOUT_ERROR = 'timeout-error'\n}\n\ninterface NavigationError {\n type: NavigationErrorType;\n message: string;\n details?: any;\n itemId?: string;\n sectionId?: string;\n}\n\ndeclare class TestNavigationInterface {}\nexport const TestNavigationMixin = <T extends Constructor<TestBase>>(superClass: T) => {\n abstract class TestNavigationClass extends superClass {\n @property({ type: String }) navigate: 'item' | 'section' | null = null;\n @property({ type: Boolean, attribute: 'cache-transform' }) cacheTransform: boolean = false;\n @property({ type: Number }) requestTimeout: number = 30000; // Default timeout of 30 seconds\n @property({ type: Boolean }) showLoadingIndicators: boolean = true;\n\n protected _testElement: QtiAssessmentTest;\n private _activeRequests: XMLHttpRequest[] = [];\n private _navigationInProgress: boolean = false;\n private _lastError: NavigationError | null = null;\n private _lastNavigationRequestId: string | null = null;\n private _targetNavigation: { type: 'item' | 'section'; id: string } | null = null;\n\n constructor(...args: any[]) {\n super(...args);\n\n // Handle navigation requests\n this.addEventListener(\n 'qti-request-navigation',\n async ({ detail }: CustomEvent<{ type: 'item' | 'section'; id: string }>) => {\n if (!detail?.id) return;\n\n // Track this navigation request's unique identifier\n // Using timestamp and a counter for uniqueness\n const navigationRequestId = `nav_${Date.now()}_${Math.random()}`;\n this._lastNavigationRequestId = navigationRequestId;\n\n try {\n // Set navigation in progress and clear errors\n this._navigationInProgress = true;\n this._lastError = null;\n this._dispatchStatusEvent({ loading: true, type: detail.type, id: detail.id });\n\n // Cancel any pending requests before starting new ones\n this._cancelActiveRequests();\n\n // Store the navigation target for quick navigation\n this._targetNavigation = { type: detail.type, id: detail.id };\n\n if (detail.type === 'item') {\n await this._navigateToItem(detail.id);\n } else if (detail.type === 'section') {\n await this._navigateToSection(detail.id);\n }\n\n // Verify this is still the most recent navigation request\n // If not, we don't need to do anything more as a newer request superseded this one\n if (this._lastNavigationRequestId !== navigationRequestId) {\n console.log('Navigation was superseded by a newer request');\n return;\n }\n } catch (error) {\n // Only process error if this is still the most recent navigation\n if (this._lastNavigationRequestId === navigationRequestId) {\n // Convert error to NavigationError if it's not already\n const navError = this._normalizeError(error, detail.type, detail.id);\n this._lastError = navError;\n\n // Dispatch the error event\n this._dispatchErrorEvent(navError);\n\n console.error(`Navigation error (${navError.type}):`, navError.message, navError.details);\n }\n } finally {\n // Only update navigation status if this is still the active request\n if (this._lastNavigationRequestId === navigationRequestId) {\n // Always mark navigation as completed\n this._navigationInProgress = false;\n this._dispatchStatusEvent({ loading: false, type: detail.type, id: detail.id });\n }\n }\n }\n );\n\n // Handle test connection\n this.addEventListener('qti-assessment-test-connected', (e: CustomEvent<QtiAssessmentTest>) => {\n this._testElement = e.detail;\n this._initializeNavigation();\n });\n }\n\n /**\n * Initialize navigation when test is first connected\n */\n private _initializeNavigation(): void {\n let id: string | undefined;\n\n if (this.navigate === 'section') {\n id = this._testElement.querySelector<QtiAssessmentSection>('qti-assessment-section')?.identifier;\n }\n if (this.navigate === 'item') {\n id =\n this.sessionContext.navItemRefId ??\n this._testElement.querySelector<QtiAssessmentItemRef>('qti-assessment-item-ref')?.identifier;\n }\n if (id) {\n this.dispatchEvent(\n new CustomEvent('qti-request-navigation', {\n detail: { type: this.navigate === 'section' ? 'section' : 'item', id },\n bubbles: true,\n composed: true\n })\n );\n }\n }\n\n public navigateTo(type: 'item' | 'section', id?: string): void {\n // if no id, take the first qti-assessment-item-ref\n if (!id) {\n if (type === 'section') {\n id = this._testElement?.querySelector<QtiAssessmentSection>('qti-assessment-section')?.identifier;\n }\n if (type === 'item') {\n id = this._testElement?.querySelector<QtiAssessmentItemRef>('qti-assessment-item-ref')?.identifier;\n }\n }\n this.dispatchEvent(\n new CustomEvent('qti-request-navigation', {\n detail: { type, id },\n bubbles: true,\n composed: true\n })\n );\n }\n /**\n * Navigates to a specific item\n */\n private async _navigateToItem(itemId: string): Promise<void> {\n const itemRefEl = this._testElement?.querySelector<QtiAssessmentItemRef>(\n `qti-assessment-item-ref[identifier=\"${itemId}\"]`\n );\n\n if (!itemRefEl) {\n throw {\n type: NavigationErrorType.ITEM_NOT_FOUND,\n message: `Item with identifier \"${itemId}\" not found.`,\n itemId\n };\n }\n\n // Update the session context immediately to record navigation intent\n // This ensures we remember the target item even if loading is interrupted\n const navPartId = itemRefEl.closest('qti-test-part')?.identifier;\n const navSectionId = itemRefEl.closest('qti-assessment-section')?.identifier;\n\n // Set loading state and update navigation context first\n this.sessionContext = {\n ...this.sessionContext,\n navPartId,\n navSectionId,\n navItemRefId: itemId,\n navItemLoading: true\n };\n\n // console.log('Navigating to item:', itemId);\n\n // Then attempt to load the item content\n try {\n await this._loadItems([itemId]);\n } finally {\n // Even if loading fails or is interrupted, update loading state\n // This ensures we don't get stuck in a loading state\n this.sessionContext = {\n ...this.sessionContext,\n navItemLoading: false\n };\n }\n }\n\n /**\n * Navigates to a specific section\n */\n private async _navigateToSection(sectionId: string): Promise<void> {\n const sectionRefEl = this._testElement?.querySelector<QtiAssessmentSection>(\n `qti-assessment-section[identifier=\"${sectionId}\"]`\n );\n\n if (!sectionRefEl) {\n throw {\n type: NavigationErrorType.SECTION_NOT_FOUND,\n message: `Section with identifier \"${sectionId}\" not found.`,\n sectionId\n };\n }\n\n // Get navigation context first\n const navPartId = sectionRefEl.closest('qti-test-part')?.identifier;\n\n // Update navigation state before loading items\n this.sessionContext = {\n ...this.sessionContext,\n navPartId,\n navSectionId: sectionId,\n navItemRefId: null,\n navItemLoading: true\n };\n\n // Then attempt to load the section's items\n try {\n const itemIds = this._getSectionItemIds(sectionId);\n await this._loadItems(itemIds);\n } finally {\n // Update loading state even if loading fails or is interrupted\n this.sessionContext = {\n ...this.sessionContext,\n navItemLoading: false\n };\n }\n }\n\n /**\n * Normalize different error types into a consistent NavigationError format\n */\n private _normalizeError(error: any, navigationType: string, id: string): NavigationError {\n // If it's already a NavigationError, return it\n if (error && error.type && Object.values(NavigationErrorType).includes(error.type)) {\n return error as NavigationError;\n }\n\n // For XMLHttpRequest related errors\n if (error instanceof DOMException && error.name === 'AbortError') {\n return {\n type: NavigationErrorType.NETWORK_ERROR,\n message: 'Navigation was cancelled because a new navigation was requested.',\n details: error\n };\n }\n\n // For timeout errors\n if (error.name === 'TimeoutError' || (error.message && error.message.includes('timeout'))) {\n return {\n type: NavigationErrorType.TIMEOUT_ERROR,\n message: 'Request timed out. Please check your network connection.',\n details: error\n };\n }\n\n // For network errors\n if (error instanceof TypeError && error.message.includes('network')) {\n return {\n type: NavigationErrorType.NETWORK_ERROR,\n message: 'A network error occurred. Please check your connection.',\n details: error\n };\n }\n\n // Default to load error for anything else\n return {\n type: NavigationErrorType.LOAD_ERROR,\n message: `Failed to load ${navigationType}: ${id}`,\n details: error,\n itemId: navigationType === 'item' ? id : undefined,\n sectionId: navigationType === 'section' ? id : undefined\n };\n }\n\n /**\n * Dispatch error event to notify the UI\n */\n private _dispatchErrorEvent(error: NavigationError): void {\n this.dispatchEvent(\n new CustomEvent('qti-navigation-error', {\n detail: error,\n bubbles: true,\n composed: true\n })\n );\n }\n\n /**\n * Dispatch status event to indicate loading state\n */\n private _dispatchStatusEvent(status: { loading: boolean; type: string; id: string }): void {\n if (this.showLoadingIndicators) {\n this.dispatchEvent(\n new CustomEvent('qti-navigation-status', {\n detail: status,\n bubbles: true,\n composed: true\n })\n );\n }\n }\n\n /**\n * Cancels all active HTTP requests\n */\n private _cancelActiveRequests(): void {\n if (this._activeRequests.length > 0) {\n console.info(`Cancelling ${this._activeRequests.length} pending requests`);\n this._activeRequests.forEach(request => {\n if (request && request.readyState !== 4) {\n // 4 is DONE\n request.abort();\n }\n });\n this._activeRequests = [];\n }\n }\n\n /**\n * Load items with improved error handling and timeout\n */\n private async _loadItems(\n itemIds: string[]\n ): Promise<{ itemRef: QtiAssessmentItemRef; doc: any; request: XMLHttpRequest }[]> {\n if (!this._testElement || itemIds.length === 0) return;\n\n const itemRefEls = itemIds.map(id =>\n this._testElement!.querySelector<QtiAssessmentItemRef>(`qti-assessment-item-ref[identifier=\"${id}\"]`)\n );\n\n // Check for missing items\n const missingItems = itemRefEls.reduce((missing, el, index) => {\n if (!el) missing.push(itemIds[index]);\n return missing;\n }, [] as string[]);\n\n if (missingItems.length > 0) {\n const error: NavigationError = {\n type: NavigationErrorType.ITEM_NOT_FOUND,\n message: `One or more items not found: ${missingItems.join(', ')}`,\n details: { missingItems }\n };\n throw error;\n }\n\n this._clearLoadedItems();\n // Note: We no longer update navItemLoading here since it's handled in the navigation methods\n\n const itemLoadPromises = itemRefEls.map(async itemRef => {\n if (!itemRef) return null;\n\n // Create a timeout promise\n const timeoutPromise = new Promise((_, reject) => {\n setTimeout(() => {\n reject({\n name: 'TimeoutError',\n message: `Request for item ${itemRef.identifier} timed out after ${this.requestTimeout}ms`\n });\n }, this.requestTimeout);\n });\n\n try {\n const { promise, request } = qtiTransformItem(this.cacheTransform).load(itemRef.href);\n\n // Track the request so it can be cancelled if needed\n if (request instanceof XMLHttpRequest) {\n this._activeRequests.push(request);\n }\n\n // Race the item loading against the timeout\n const apiResult = await Promise.race([promise, timeoutPromise]);\n return {\n itemRef,\n doc: (apiResult as any).htmlDoc(),\n request\n };\n } catch (error) {\n // If this is a cancellation or timeout, don't rethrow\n if (\n (error instanceof DOMException && error.name === 'AbortError') ||\n (error && error.name === 'TimeoutError')\n ) {\n console.log(\n `Request for item ${itemRef.identifier} was ${error.name === 'TimeoutError' ? 'timed out' : 'aborted'}`\n );\n return null;\n }\n\n // For other errors, add item context and rethrow\n error.itemId = itemRef.identifier;\n throw error;\n }\n });\n\n try {\n const results = await Promise.all(itemLoadPromises);\n\n // Filter out any null results (from aborted or timed out requests)\n const validResults = results.filter(result => result !== null);\n\n // Apply loaded docs to item refs\n validResults.forEach(({ itemRef, doc }) => {\n if (itemRef && doc) itemRef.xmlDoc = doc;\n });\n\n // Clear the active requests list after all are complete\n this._activeRequests = [];\n\n // Dispatch test loaded event\n requestAnimationFrame(() => {\n this.dispatchEvent(\n new CustomEvent('qti-test-loaded', {\n detail: validResults.map(({ itemRef }) => ({\n identifier: itemRef?.identifier,\n element: itemRef\n })),\n bubbles: true,\n composed: true\n })\n );\n });\n\n // If no valid results but we had items to load, this is an error\n if (validResults.length === 0 && itemIds.length > 0) {\n throw {\n type: NavigationErrorType.LOAD_ERROR,\n message: 'All item requests failed to load',\n details: { itemIds }\n };\n }\n\n return validResults;\n } catch (error) {\n console.error('Error loading items:', error);\n throw error;\n }\n }\n\n /**\n * Gets all item IDs in a section\n */\n private _getSectionItemIds(navSectionId: string): string[] {\n const sectionRefEl = this._testElement?.querySelector<QtiAssessmentSection>(\n `qti-assessment-section[identifier=\"${navSectionId}\"]`\n );\n\n if (!sectionRefEl) {\n throw {\n type: NavigationErrorType.SECTION_NOT_FOUND,\n message: `Section with identifier \"${navSectionId}\" not found.`,\n sectionId: navSectionId\n };\n }\n\n return Array.from(\n this._testElement!.querySelectorAll<QtiAssessmentItemRef>(\n `qti-assessment-section[identifier=\"${navSectionId}\"] > qti-assessment-item-ref`\n )\n ).map(itemRef => itemRef.identifier);\n }\n\n /**\n * Clears all loaded items\n */\n private _clearLoadedItems(): void {\n const itemRefEls = this._testElement?.querySelectorAll<QtiAssessmentItemRef>(\n `qti-assessment-test qti-assessment-item-ref`\n );\n Array.from(itemRefEls || []).forEach(itemElement => {\n itemElement.xmlDoc = null;\n });\n }\n\n /**\n * Retry the last failed navigation\n */\n public retryNavigation(): void {\n if (this._lastError) {\n const type = this._lastError.itemId ? 'item' : 'section';\n const id = this._lastError.itemId || this._lastError.sectionId;\n\n if (id) {\n this.dispatchEvent(\n new CustomEvent('qti-request-navigation', {\n detail: { type, id },\n bubbles: true,\n composed: true\n })\n );\n }\n } else if (this._targetNavigation) {\n // If we have a target navigation but no error, we can retry that\n this.dispatchEvent(\n new CustomEvent('qti-request-navigation', {\n detail: this._targetNavigation,\n bubbles: true,\n composed: true\n })\n );\n }\n }\n }\n\n return TestNavigationClass as Constructor<TestNavigationInterface> & T;\n};\n","import type { QtiAssessmentItemRef } from '../qti-assessment-test';\nimport type { QtiAssessmentItem } from '../../../qti-components';\nimport type { TestBase } from '../test-base';\n\nexport type View = 'author' | 'candidate' | 'proctor' | 'scorer' | 'testConstructor' | 'tutor' | '';\n\ntype Constructor<T = {}> = abstract new (...args: any[]) => T;\n\ndeclare class TestViewInterface {}\n\nexport const TestViewMixin = <T extends Constructor<TestBase>>(superClass: T) => {\n abstract class TestViewClass extends superClass {\n constructor(...args: any[]) {\n super(...args);\n this.sessionContext = { ...this.sessionContext, view: 'candidate' };\n\n this.addEventListener('on-test-switch-view', (e: CustomEvent<View>) => {\n this.sessionContext = { ...this.sessionContext, view: e.detail };\n this._updateElementView();\n });\n this.addEventListener('qti-assessment-test-connected', () => {\n this._updateElementView();\n });\n this.addEventListener('qti-assessment-item-connected', (e: CustomEvent) => {\n this._updateElementView();\n this._setCorrectResponseVisibility(e.detail);\n });\n }\n\n willUpdate(changedProperties: Map<string | number | symbol, unknown>) {\n super.willUpdate(changedProperties);\n if (changedProperties.has('sessionContext')) {\n this._updateElementView();\n }\n }\n\n // Method to handle view updates for elements based on the current context view\n private _updateElementView() {\n if (this._testElement) {\n const viewElements = Array.from(this._testElement.querySelectorAll('[view]'));\n\n viewElements.forEach((element: HTMLElement) => {\n element.classList.toggle('show', element.getAttribute('view') === this.sessionContext.view);\n });\n\n const assessmentItemRef = this._testElement.querySelector<QtiAssessmentItemRef>(\n `qti-assessment-item-ref[identifier=\"${this.sessionContext.navItemRefId}\"]`\n );\n const assessmentItem = assessmentItemRef?.assessmentItem;\n\n if (assessmentItem) {\n assessmentItem.showCorrectResponse(this.sessionContext.view === 'scorer');\n }\n }\n }\n\n // Event handler for connected QTI assessment items\n private _setCorrectResponseVisibility(assessmentItem: QtiAssessmentItem): void {\n assessmentItem.showCorrectResponse(this.sessionContext.view === 'scorer');\n }\n }\n\n return TestViewClass as Constructor<TestViewInterface> & T;\n};\n","import { provide } from '@lit/context';\nimport { LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\n\nimport { INITIAL_TEST_CONTEXT, testContext } from '../../exports/test.context';\nimport { INITIAL_SESSION_CONTEXT, type SessionContext, sessionContext } from '../../exports/session.context';\n\nimport type { ItemContext } from '../../exports/item.context';\nimport type { TestContext } from '../../exports/test.context';\nimport type { QtiAssessmentItemRef, QtiAssessmentTest } from './qti-assessment-test';\nimport type { QtiAssessmentItem } from '../../qti-components/';\nimport type { OutcomeVariable, VariableDeclaration, VariableValue } from '../../exports/variables';\n\nexport abstract class TestBase extends LitElement {\n @property({ attribute: false, type: Object })\n @provide({ context: testContext })\n public testContext: Readonly<TestContext> = INITIAL_TEST_CONTEXT;\n\n @property({ attribute: false, type: Object })\n @provide({ context: sessionContext })\n public sessionContext: Readonly<SessionContext> = INITIAL_SESSION_CONTEXT;\n\n protected _testElement: QtiAssessmentTest;\n\n updateItemVariables(itemRefID: string, variables: VariableValue<string | string[] | null>[]): void {\n // Update variables in the testContext for the specified itemRefID\n const itemContext = this.testContext.items.find(item => item.identifier === itemRefID);\n if (itemContext) {\n itemContext.variables = itemContext.variables.map(variable => {\n const updatedVariable = variables.find(v => v.identifier === variable.identifier);\n return updatedVariable ? { ...variable, ...updatedVariable } : variable;\n });\n }\n // if the qti-assessment-item-ref has a qti-assessment-item, then update this item as well\n const itemRef = this._testElement.querySelector<QtiAssessmentItemRef>(\n `qti-assessment-item-ref[identifier=\"${itemRefID}\"]`\n );\n if (itemRef && itemRef.assessmentItem) {\n if (itemRef.assessmentItem) {\n itemRef.assessmentItem.variables = variables;\n }\n }\n }\n\n constructor() {\n super();\n\n /**\n * When the test is connected, the items are updated in the test context.\n * An existing context item is updated with the itemRef properties if nessesary.\n */\n this.addEventListener('qti-assessment-test-connected', (e: CustomEvent<QtiAssessmentTest>) => {\n this.testContext = INITIAL_TEST_CONTEXT; // new test, new test context!\n this.sessionContext = INITIAL_SESSION_CONTEXT; // new test, new session context!\n if (this.testContext && this.testContext.items.length > 0) return;\n\n this._testElement = e.detail;\n const items = Array.from(this._testElement.querySelectorAll('qti-assessment-item-ref')).map(itemRef => {\n return {\n href: itemRef.href,\n identifier: itemRef.identifier,\n category: itemRef.category,\n variables: [\n {\n identifier: 'completionStatus',\n value: 'not_attempted',\n type: 'outcome'\n } as OutcomeVariable\n ]\n };\n });\n this.testContext = { ...this.testContext, items };\n });\n\n this.addEventListener('qti-assessment-item-connected', (e: CustomEvent<QtiAssessmentItem>) => {\n const assessmentItem = e.detail as QtiAssessmentItem;\n const assessmentRefId = assessmentItem.closest('qti-assessment-item-ref')?.identifier;\n if (assessmentRefId) {\n assessmentItem.assessmentItemRefId = assessmentRefId;\n }\n this._updateItemInTestContext(e.detail);\n });\n\n this.addEventListener('qti-item-context-updated', (e: CustomEvent<{ itemContext: ItemContext }>) => {\n // const assessmentitem = e.composedPath()[0] as QtiAssessmentItem;\n this._updateItemVariablesInTestContext(e.detail.itemContext.identifier, e.detail.itemContext.variables);\n });\n }\n\n private _updateItemVariablesInTestContext(\n identifier: string,\n variables: readonly VariableDeclaration<string | string[] | null>[]\n ): void {\n // Update the test context with modified variables for the specified item\n this.testContext = {\n ...this.testContext, // Spread existing test context properties\n items: this.testContext.items.map(itemContext => {\n // If the item identifier doesn't match, keep it unchanged\n if (itemContext.identifier !== identifier) {\n return itemContext;\n }\n\n // Update the matching item with new variables\n return {\n ...itemContext, // Keep other properties of the item context\n variables: variables.map(variable => {\n // Find a matching variable in the current item context\n const matchingVariable = itemContext.variables.find(v => v.identifier === variable.identifier);\n\n // Merge matching variable with the new one, or use the new variable if no match\n return matchingVariable ? { ...matchingVariable, ...variable } : variable;\n })\n };\n })\n };\n this.dispatchEvent(\n new CustomEvent('qti-test-context-updated', { detail: this.testContext, bubbles: false, composed: false })\n );\n }\n\n /**\n * Updates the variables of an assessment item in the test context.\n * - Matches the assessment item with the corresponding test context item.\n * - If the item is not found, logs a warning.\n * - Updates variables in the test context if exactly one variable exists.\n * - Otherwise, syncs the assessment item's variables with the test context.\n *\n * @param assessmentItem - The assessment item to update.\n */\n private _updateItemInTestContext = (assessmentItem: QtiAssessmentItem): void => {\n const context = (assessmentItem as any)._context;\n const identifier = context.identifier;\n const fullVariables = context.variables;\n\n // console.log(this._testContext);\n // Find the corresponding item in the test context by identifier\n const itemContext = this.testContext.items.find(i => i?.identifier === identifier);\n\n if (!itemContext) {\n console.warn(`Item IDs between assessment.xml and item.xml should match: ${identifier} is not found!`);\n return;\n }\n\n // Update variables in the test context or sync them to the assessment item\n if (itemContext.variables?.length === 1) {\n // The loaded qti-assessment-item itself has variables which are not in test context yet.\n this._updateItemVariablesInTestContext(identifier, fullVariables);\n } else {\n // Sync the assessment item's variables with the test context\n assessmentItem.variables = [...(itemContext.variables || [])];\n }\n };\n}\n","import type { OutcomeVariable, VariableDeclaration } from '../../../exports/variables';\nimport type { QtiOutcomeProcessing } from '../../../qti-components';\nimport type { TestBase } from '../test-base';\n\ntype Constructor<T = {}> = abstract new (...args: any[]) => T;\n\ndeclare class TestProcessingInterface {\n updateOutcomeVariable(identifier: string, value: string | string[] | undefined): void;\n getOutcome(identifier: string): Readonly<OutcomeVariable>;\n getVariable(identifier: string): Readonly<VariableDeclaration<string | string[] | null>>;\n outcomeProcessing(): boolean;\n}\nexport const TestProcessingMixin = <T extends Constructor<TestBase>>(superClass: T) => {\n abstract class TestProcessingElement extends superClass {\n constructor(...args: any[]) {\n super(...args);\n this.addEventListener('qti-register-variable', (e: CustomEvent<{ variable: any }>) => {\n this.testContext = {\n ...this.testContext,\n testOutcomeVariables: [...(this.testContext.testOutcomeVariables || []), e.detail.variable]\n };\n e.stopPropagation();\n });\n // wordt aangeroepen vanuit de processingtemplate\n this.addEventListener(\n 'qti-set-outcome-value',\n (e: CustomEvent<{ outcomeIdentifier: string; value: string | string[] }>) => {\n const { outcomeIdentifier, value } = e.detail;\n this.updateOutcomeVariable(outcomeIdentifier, value);\n e.stopPropagation();\n }\n );\n }\n\n outcomeProcessing(): boolean {\n const outcomeProcessor = this.querySelector('qti-outcome-processing') as unknown as QtiOutcomeProcessing;\n if (!outcomeProcessor) return false;\n outcomeProcessor?.process();\n return true;\n }\n\n /* --------------------------- ENABLED WHEN UNIT TESTING OUTCOME PROCESSING ------------------------------------ */\n\n public updateOutcomeVariable(identifier: string, value: string | string[] | undefined) {\n const outcomeVariable = this.getOutcome(identifier);\n if (!outcomeVariable) {\n console.warn(`Can not set qti-outcome-identifier: ${identifier}, it is not available`);\n return;\n }\n this.testContext = {\n ...this.testContext,\n testOutcomeVariables: this.testContext.testOutcomeVariables?.map(v => {\n if (v.identifier !== identifier) {\n return v;\n }\n return {\n ...v,\n value: outcomeVariable.cardinality === 'single' ? value : [...v.value, value as string]\n };\n })\n };\n }\n\n public getOutcome(identifier: string): Readonly<OutcomeVariable> {\n return this.getVariable(identifier) as OutcomeVariable;\n }\n public getVariable(identifier: string): Readonly<VariableDeclaration<string | string[] | null>> {\n return this.testContext.testOutcomeVariables?.find(v => v.identifier === identifier) || null;\n }\n /* --------------------------- ENABLED WHEN UNIT TESTING OUTCOME PROCESSING ------------------------------------ */\n }\n\n return TestProcessingElement as Constructor<TestProcessingInterface> & T;\n};\n","import { LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { prepareTemplate } from 'stampino';\n\nimport type { TemplateFunction } from 'stampino';\nimport type { QtiAssessmentItem } from '../../../qti-components';\n\n// Converter function to interpret \"true\" and \"false\" as booleans\nconst stringToBooleanConverter = {\n fromAttribute(value: string): boolean {\n return value === 'true';\n },\n toAttribute(value: boolean): string {\n return value ? 'true' : 'false';\n }\n};\n\n// @customElement('qti-assessment-item-ref')\nexport class QtiAssessmentItemRef extends LitElement {\n @property({ type: String }) category?: string;\n @property({ type: String }) identifier?: string;\n @property({ type: Boolean, converter: stringToBooleanConverter }) required?: boolean;\n @property({ type: Boolean, converter: stringToBooleanConverter }) fixed?: boolean;\n @property({ type: String }) href?: string;\n\n // @consume({ context: computedContext, subscribe: true })\n // private computedContext: ComputedContext;\n\n weigths: Map<string, number> = new Map();\n\n @property({ type: Object, attribute: false })\n xmlDoc!: DocumentFragment; // the XMLDocument\n\n protected createRenderRoot(): HTMLElement | DocumentFragment {\n return this;\n }\n\n get assessmentItem(): QtiAssessmentItem | null {\n return this.renderRoot?.querySelector('qti-assessment-item');\n }\n\n myTemplate: TemplateFunction;\n\n async connectedCallback(): Promise<void> {\n // debugger;\n super.connectedCallback();\n\n /*\n searches for the template element to use in the qti-test component\n can be used to render extra things for an item, like a bookmark, index nummer\n put this in your test-container component\n <template item-ref>\n <div>Extra content</div>\n </template>\n */\n const templateElement = ((this.getRootNode() as any).host as HTMLElement)\n .closest('qti-test')\n .querySelector<HTMLTemplateElement>('template[item-ref]');\n\n if (templateElement) this.myTemplate = prepareTemplate(templateElement);\n\n await this.updateComplete;\n\n this.dispatchEvent(\n new CustomEvent('qti-assessment-item-ref-connected', {\n bubbles: true,\n composed: true,\n detail: { identifier: this.identifier, href: this.href, category: this.category }\n })\n );\n }\n\n render() {\n return this.myTemplate ? this.myTemplate({ xmlDoc: this.xmlDoc }) : this.xmlDoc;\n }\n}\n\nif (!customElements.get('qti-assessment-item-ref')) {\n customElements.define('qti-assessment-item-ref', QtiAssessmentItemRef);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-assessment-item-ref': QtiAssessmentItemRef;\n }\n}\n","import { consume } from '@lit/context';\nimport { html, LitElement } from 'lit';\nimport { property } from 'lit/decorators.js';\n\nimport { testContext } from '../../../exports/test.context';\n\nimport type { TestContext } from '../../../exports/test.context';\n\n// https://www.imsglobal.org/sites/default/files/spec/qti/v3/info/index.html#Root_AssessmentSection\n\nconst stringToBooleanConverter = {\n fromAttribute(value: string): boolean {\n return value === 'true';\n },\n toAttribute(value: boolean): string {\n return value ? 'true' : 'false';\n }\n};\n\nexport class QtiAssessmentSection extends LitElement {\n @property({ type: String }) identifier: string;\n @property({ type: String }) required: string;\n @property({ type: Boolean, converter: stringToBooleanConverter }) fixed: boolean;\n @property({ type: String }) title: string;\n @property({ type: Boolean, converter: stringToBooleanConverter }) visible: boolean;\n @property({ type: Boolean, converter: stringToBooleanConverter, attribute: 'keep-together' }) keepTogether: boolean;\n\n @consume({ context: testContext, subscribe: true })\n public _testContext?: TestContext;\n\n async connectedCallback(): Promise<void> {\n super.connectedCallback();\n await this.updateComplete;\n this.dispatchEvent(\n new Event('qti-assessment-section-connected', {\n bubbles: true,\n composed: true\n })\n );\n }\n\n render() {\n return html`<slot name=\"qti-rubric-block\"></slot><slot></slot>`;\n }\n}\n\nif (!customElements.get('qti-assessment-section')) {\n customElements.define('qti-assessment-section', QtiAssessmentSection);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-assessment-section': QtiAssessmentSection;\n }\n}\n","import { consume } from '@lit/context';\nimport { html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\nimport { testContext } from '../../../exports/test.context';\n\nimport type { TestContext } from '../../../exports/test.context';\n\n@customElement('qti-assessment-test')\nexport class QtiAssessmentTest extends LitElement {\n @property({ type: String }) identifier: string;\n @property({ type: String }) title: string;\n\n @consume({ context: testContext, subscribe: true })\n public _testContext?: TestContext;\n\n async connectedCallback(): Promise<void> {\n super.connectedCallback();\n await this.updateComplete;\n this.dispatchEvent(\n new CustomEvent('qti-assessment-test-connected', {\n detail: this,\n bubbles: true,\n composed: true\n })\n );\n }\n\n render() {\n return html` <slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-assessment-test': QtiAssessmentTest;\n }\n}\n","import { html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n@customElement('qti-test-part')\nexport class QtiTestPart extends LitElement {\n @property({ type: String }) identifier: string = '';\n @property({ type: String }) title: string = '';\n @property({ type: String }) class: string = '';\n\n @property({ type: String, attribute: 'navigation-mode' })\n navigationMode: 'linear' | 'nonlinear' = 'nonlinear';\n\n @property({ type: String, attribute: 'submission-mode' })\n submissionMode: 'individual' | 'simultaneous' = 'individual';\n\n async connectedCallback(): Promise<void> {\n super.connectedCallback();\n await this.updateComplete;\n this.dispatchEvent(\n new Event('qti-test-part-connected', {\n bubbles: true,\n composed: true\n })\n );\n }\n\n render() {\n return html` <slot></slot>`;\n }\n}\n\nif (!customElements.get('qti-test-part')) {\n customElements.define('qti-test-part', QtiTestPart);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-test-part': QtiTestPart;\n }\n}\n","import { customElement } from 'lit/decorators.js';\nimport { css, html } from 'lit';\n\nimport { QtiModalFeedback } from '../../../qti-components';\n\n@customElement('qti-test-feedback')\nexport class QtiTestFeedback extends QtiModalFeedback {\n static styles = css`\n :host {\n color: gray;\n }\n `;\n override render() {\n return html``;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'qti-test-feedback': QtiTestFeedback;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,SAAS,YAAY;AACrB,SAAS,qBAAqB;;;ACD9B,SAAS,gBAAgB;AAUzB,IAAK,sBAAL,kBAAKA,yBAAL;AACE,EAAAA,qBAAA,oBAAiB;AACjB,EAAAA,qBAAA,uBAAoB;AACpB,EAAAA,qBAAA,gBAAa;AACb,EAAAA,qBAAA,mBAAgB;AAChB,EAAAA,qBAAA,mBAAgB;AALb,SAAAA;AAAA,GAAA;AAiBE,IAAM,sBAAsB,CAAkC,eAAkB;AAAA,EACrF,MAAe,4BAA4B,WAAW;AAAA,IAapD,eAAe,MAAa;AAC1B,YAAM,GAAG,IAAI;AAba,sBAAsC;AACP,4BAA0B;AACzD,4BAAyB;AACxB,mCAAiC;AAG9D,WAAQ,kBAAoC,CAAC;AAC7C,WAAQ,wBAAiC;AACzC,WAAQ,aAAqC;AAC7C,WAAQ,2BAA0C;AAClD,WAAQ,oBAAqE;AAM3E,WAAK;AAAA,QACH;AAAA,QACA,OAAO,EAAE,OAAO,MAA6D;AAC3E,cAAI,CAAC,QAAQ,GAAI;AAIjB,gBAAM,sBAAsB,OAAO,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC;AAC9D,eAAK,2BAA2B;AAEhC,cAAI;AAEF,iBAAK,wBAAwB;AAC7B,iBAAK,aAAa;AAClB,iBAAK,qBAAqB,EAAE,SAAS,MAAM,MAAM,OAAO,MAAM,IAAI,OAAO,GAAG,CAAC;AAG7E,iBAAK,sBAAsB;AAG3B,iBAAK,oBAAoB,EAAE,MAAM,OAAO,MAAM,IAAI,OAAO,GAAG;AAE5D,gBAAI,OAAO,SAAS,QAAQ;AAC1B,oBAAM,KAAK,gBAAgB,OAAO,EAAE;AAAA,YACtC,WAAW,OAAO,SAAS,WAAW;AACpC,oBAAM,KAAK,mBAAmB,OAAO,EAAE;AAAA,YACzC;AAIA,gBAAI,KAAK,6BAA6B,qBAAqB;AACzD,sBAAQ,IAAI,8CAA8C;AAC1D;AAAA,YACF;AAAA,UACF,SAAS,OAAO;AAEd,gBAAI,KAAK,6BAA6B,qBAAqB;AAEzD,oBAAM,WAAW,KAAK,gBAAgB,OAAO,OAAO,MAAM,OAAO,EAAE;AACnE,mBAAK,aAAa;AAGlB,mBAAK,oBAAoB,QAAQ;AAEjC,sBAAQ,MAAM,qBAAqB,SAAS,IAAI,MAAM,SAAS,SAAS,SAAS,OAAO;AAAA,YAC1F;AAAA,UACF,UAAE;AAEA,gBAAI,KAAK,6BAA6B,qBAAqB;AAEzD,mBAAK,wBAAwB;AAC7B,mBAAK,qBAAqB,EAAE,SAAS,OAAO,MAAM,OAAO,MAAM,IAAI,OAAO,GAAG,CAAC;AAAA,YAChF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAGA,WAAK,iBAAiB,iCAAiC,CAAC,MAAsC;AAC5F,aAAK,eAAe,EAAE;AACtB,aAAK,sBAAsB;AAAA,MAC7B,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA,IAKQ,wBAA8B;AACpC,UAAI;AAEJ,UAAI,KAAK,aAAa,WAAW;AAC/B,aAAK,KAAK,aAAa,cAAoC,wBAAwB,GAAG;AAAA,MACxF;AACA,UAAI,KAAK,aAAa,QAAQ;AAC5B,aACE,KAAK,eAAe,gBACpB,KAAK,aAAa,cAAoC,yBAAyB,GAAG;AAAA,MACtF;AACA,UAAI,IAAI;AACN,aAAK;AAAA,UACH,IAAI,YAAY,0BAA0B;AAAA,YACxC,QAAQ,EAAE,MAAM,KAAK,aAAa,YAAY,YAAY,QAAQ,GAAG;AAAA,YACrE,SAAS;AAAA,YACT,UAAU;AAAA,UACZ,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,IAEO,WAAW,MAA0B,IAAmB;AAE7D,UAAI,CAAC,IAAI;AACP,YAAI,SAAS,WAAW;AACtB,eAAK,KAAK,cAAc,cAAoC,wBAAwB,GAAG;AAAA,QACzF;AACA,YAAI,SAAS,QAAQ;AACnB,eAAK,KAAK,cAAc,cAAoC,yBAAyB,GAAG;AAAA,QAC1F;AAAA,MACF;AACA,WAAK;AAAA,QACH,IAAI,YAAY,0BAA0B;AAAA,UACxC,QAAQ,EAAE,MAAM,GAAG;AAAA,UACnB,SAAS;AAAA,UACT,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAIA,MAAc,gBAAgB,QAA+B;AAC3D,YAAM,YAAY,KAAK,cAAc;AAAA,QACnC,uCAAuC,MAAM;AAAA,MAC/C;AAEA,UAAI,CAAC,WAAW;AACd,cAAM;AAAA,UACJ,MAAM;AAAA,UACN,SAAS,yBAAyB,MAAM;AAAA,UACxC;AAAA,QACF;AAAA,MACF;AAIA,YAAM,YAAY,UAAU,QAAQ,eAAe,GAAG;AACtD,YAAM,eAAe,UAAU,QAAQ,wBAAwB,GAAG;AAGlE,WAAK,iBAAiB;AAAA,QACpB,GAAG,KAAK;AAAA,QACR;AAAA,QACA;AAAA,QACA,cAAc;AAAA,QACd,gBAAgB;AAAA,MAClB;AAKA,UAAI;AACF,cAAM,KAAK,WAAW,CAAC,MAAM,CAAC;AAAA,MAChC,UAAE;AAGA,aAAK,iBAAiB;AAAA,UACpB,GAAG,KAAK;AAAA,UACR,gBAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAKA,MAAc,mBAAmB,WAAkC;AACjE,YAAM,eAAe,KAAK,cAAc;AAAA,QACtC,sCAAsC,SAAS;AAAA,MACjD;AAEA,UAAI,CAAC,cAAc;AACjB,cAAM;AAAA,UACJ,MAAM;AAAA,UACN,SAAS,4BAA4B,SAAS;AAAA,UAC9C;AAAA,QACF;AAAA,MACF;AAGA,YAAM,YAAY,aAAa,QAAQ,eAAe,GAAG;AAGzD,WAAK,iBAAiB;AAAA,QACpB,GAAG,KAAK;AAAA,QACR;AAAA,QACA,cAAc;AAAA,QACd,cAAc;AAAA,QACd,gBAAgB;AAAA,MAClB;AAGA,UAAI;AACF,cAAM,UAAU,KAAK,mBAAmB,SAAS;AACjD,cAAM,KAAK,WAAW,OAAO;AAAA,MAC/B,UAAE;AAEA,aAAK,iBAAiB;AAAA,UACpB,GAAG,KAAK;AAAA,UACR,gBAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAKQ,gBAAgB,OAAY,gBAAwB,IAA6B;AAEvF,UAAI,SAAS,MAAM,QAAQ,OAAO,OAAO,mBAAmB,EAAE,SAAS,MAAM,IAAI,GAAG;AAClF,eAAO;AAAA,MACT;AAGA,UAAI,iBAAiB,gBAAgB,MAAM,SAAS,cAAc;AAChE,eAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS;AAAA,QACX;AAAA,MACF;AAGA,UAAI,MAAM,SAAS,kBAAmB,MAAM,WAAW,MAAM,QAAQ,SAAS,SAAS,GAAI;AACzF,eAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS;AAAA,QACX;AAAA,MACF;AAGA,UAAI,iBAAiB,aAAa,MAAM,QAAQ,SAAS,SAAS,GAAG;AACnE,eAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,UACT,SAAS;AAAA,QACX;AAAA,MACF;AAGA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,kBAAkB,cAAc,KAAK,EAAE;AAAA,QAChD,SAAS;AAAA,QACT,QAAQ,mBAAmB,SAAS,KAAK;AAAA,QACzC,WAAW,mBAAmB,YAAY,KAAK;AAAA,MACjD;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAKQ,oBAAoB,OAA8B;AACxD,WAAK;AAAA,QACH,IAAI,YAAY,wBAAwB;AAAA,UACtC,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,UAAU;AAAA,QACZ,CAAC;AAAA,MACH;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAKQ,qBAAqB,QAA8D;AACzF,UAAI,KAAK,uBAAuB;AAC9B,aAAK;AAAA,UACH,IAAI,YAAY,yBAAyB;AAAA,YACvC,QAAQ;AAAA,YACR,SAAS;AAAA,YACT,UAAU;AAAA,UACZ,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAKQ,wBAA8B;AACpC,UAAI,KAAK,gBAAgB,SAAS,GAAG;AACnC,gBAAQ,KAAK,cAAc,KAAK,gBAAgB,MAAM,mBAAmB;AACzE,aAAK,gBAAgB,QAAQ,aAAW;AACtC,cAAI,WAAW,QAAQ,eAAe,GAAG;AAEvC,oBAAQ,MAAM;AAAA,UAChB;AAAA,QACF,CAAC;AACD,aAAK,kBAAkB,CAAC;AAAA,MAC1B;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAKA,MAAc,WACZ,SACiF;AACjF,UAAI,CAAC,KAAK,gBAAgB,QAAQ,WAAW,EAAG;AAEhD,YAAM,aAAa,QAAQ;AAAA,QAAI,QAC7B,KAAK,aAAc,cAAoC,uCAAuC,EAAE,IAAI;AAAA,MACtG;AAGA,YAAM,eAAe,WAAW,OAAO,CAAC,SAAS,IAAI,UAAU;AAC7D,YAAI,CAAC,GAAI,SAAQ,KAAK,QAAQ,KAAK,CAAC;AACpC,eAAO;AAAA,MACT,GAAG,CAAC,CAAa;AAEjB,UAAI,aAAa,SAAS,GAAG;AAC3B,cAAM,QAAyB;AAAA,UAC7B,MAAM;AAAA,UACN,SAAS,gCAAgC,aAAa,KAAK,IAAI,CAAC;AAAA,UAChE,SAAS,EAAE,aAAa;AAAA,QAC1B;AACA,cAAM;AAAA,MACR;AAEA,WAAK,kBAAkB;AAGvB,YAAM,mBAAmB,WAAW,IAAI,OAAM,YAAW;AACvD,YAAI,CAAC,QAAS,QAAO;AAGrB,cAAM,iBAAiB,IAAI,QAAQ,CAAC,GAAG,WAAW;AAChD,qBAAW,MAAM;AACf,mBAAO;AAAA,cACL,MAAM;AAAA,cACN,SAAS,oBAAoB,QAAQ,UAAU,oBAAoB,KAAK,cAAc;AAAA,YACxF,CAAC;AAAA,UACH,GAAG,KAAK,cAAc;AAAA,QACxB,CAAC;AAED,YAAI;AACF,gBAAM,EAAE,SAAS,QAAQ,IAAI,iBAAiB,KAAK,cAAc,EAAE,KAAK,QAAQ,IAAI;AAGpF,cAAI,mBAAmB,gBAAgB;AACrC,iBAAK,gBAAgB,KAAK,OAAO;AAAA,UACnC;AAGA,gBAAM,YAAY,MAAM,QAAQ,KAAK,CAAC,SAAS,cAAc,CAAC;AAC9D,iBAAO;AAAA,YACL;AAAA,YACA,KAAM,UAAkB,QAAQ;AAAA,YAChC;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AAEd,cACG,iBAAiB,gBAAgB,MAAM,SAAS,gBAChD,SAAS,MAAM,SAAS,gBACzB;AACA,oBAAQ;AAAA,cACN,oBAAoB,QAAQ,UAAU,QAAQ,MAAM,SAAS,iBAAiB,cAAc,SAAS;AAAA,YACvG;AACA,mBAAO;AAAA,UACT;AAGA,gBAAM,SAAS,QAAQ;AACvB,gBAAM;AAAA,QACR;AAAA,MACF,CAAC;AAED,UAAI;AACF,cAAM,UAAU,MAAM,QAAQ,IAAI,gBAAgB;AAGlD,cAAM,eAAe,QAAQ,OAAO,YAAU,WAAW,IAAI;AAG7D,qBAAa,QAAQ,CAAC,EAAE,SAAS,IAAI,MAAM;AACzC,cAAI,WAAW,IAAK,SAAQ,SAAS;AAAA,QACvC,CAAC;AAGD,aAAK,kBAAkB,CAAC;AAGxB,8BAAsB,MAAM;AAC1B,eAAK;AAAA,YACH,IAAI,YAAY,mBAAmB;AAAA,cACjC,QAAQ,aAAa,IAAI,CAAC,EAAE,QAAQ,OAAO;AAAA,gBACzC,YAAY,SAAS;AAAA,gBACrB,SAAS;AAAA,cACX,EAAE;AAAA,cACF,SAAS;AAAA,cACT,UAAU;AAAA,YACZ,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAGD,YAAI,aAAa,WAAW,KAAK,QAAQ,SAAS,GAAG;AACnD,gBAAM;AAAA,YACJ,MAAM;AAAA,YACN,SAAS;AAAA,YACT,SAAS,EAAE,QAAQ;AAAA,UACrB;AAAA,QACF;AAEA,eAAO;AAAA,MACT,SAAS,OAAO;AACd,gBAAQ,MAAM,wBAAwB,KAAK;AAC3C,cAAM;AAAA,MACR;AAAA,IACF;AAAA;AAAA;AAAA;AAAA,IAKQ,mBAAmB,cAAgC;AACzD,YAAM,eAAe,KAAK,cAAc;AAAA,QACtC,sCAAsC,YAAY;AAAA,MACpD;AAEA,UAAI,CAAC,cAAc;AACjB,cAAM;AAAA,UACJ,MAAM;AAAA,UACN,SAAS,4BAA4B,YAAY;AAAA,UACjD,WAAW;AAAA,QACb;AAAA,MACF;AAEA,aAAO,MAAM;AAAA,QACX,KAAK,aAAc;AAAA,UACjB,sCAAsC,YAAY;AAAA,QACpD;AAAA,MACF,EAAE,IAAI,aAAW,QAAQ,UAAU;AAAA,IACrC;AAAA;AAAA;AAAA;AAAA,IAKQ,oBAA0B;AAChC,YAAM,aAAa,KAAK,cAAc;AAAA,QACpC;AAAA,MACF;AACA,YAAM,KAAK,cAAc,CAAC,CAAC,EAAE,QAAQ,iBAAe;AAClD,oBAAY,SAAS;AAAA,MACvB,CAAC;AAAA,IACH;AAAA;AAAA;AAAA;AAAA,IAKO,kBAAwB;AAC7B,UAAI,KAAK,YAAY;AACnB,cAAM,OAAO,KAAK,WAAW,SAAS,SAAS;AAC/C,cAAM,KAAK,KAAK,WAAW,UAAU,KAAK,WAAW;AAErD,YAAI,IAAI;AACN,eAAK;AAAA,YACH,IAAI,YAAY,0BAA0B;AAAA,cACxC,QAAQ,EAAE,MAAM,GAAG;AAAA,cACnB,SAAS;AAAA,cACT,UAAU;AAAA,YACZ,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF,WAAW,KAAK,mBAAmB;AAEjC,aAAK;AAAA,UACH,IAAI,YAAY,0BAA0B;AAAA,YACxC,QAAQ,KAAK;AAAA,YACb,SAAS;AAAA,YACT,UAAU;AAAA,UACZ,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAle8B;AAAA,IAA3B,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,KADb,oBACe;AAC+B;AAAA,IAA1D,SAAS,EAAE,MAAM,SAAS,WAAW,kBAAkB,CAAC;AAAA,KAF5C,oBAE8C;AAC/B;AAAA,IAA3B,SAAS,EAAE,MAAM,OAAO,CAAC;AAAA,KAHb,oBAGe;AACC;AAAA,IAA5B,SAAS,EAAE,MAAM,QAAQ,CAAC;AAAA,KAJd,oBAIgB;AAie/B,SAAO;AACT;;;ACxfO,IAAM,gBAAgB,CAAkC,eAAkB;AAAA,EAC/E,MAAe,sBAAsB,WAAW;AAAA,IAC9C,eAAe,MAAa;AAC1B,YAAM,GAAG,IAAI;AACb,WAAK,iBAAiB,EAAE,GAAG,KAAK,gBAAgB,MAAM,YAAY;AAElE,WAAK,iBAAiB,uBAAuB,CAAC,MAAyB;AACrE,aAAK,iBAAiB,EAAE,GAAG,KAAK,gBAAgB,MAAM,EAAE,OAAO;AAC/D,aAAK,mBAAmB;AAAA,MAC1B,CAAC;AACD,WAAK,iBAAiB,iCAAiC,MAAM;AAC3D,aAAK,mBAAmB;AAAA,MAC1B,CAAC;AACD,WAAK,iBAAiB,iCAAiC,CAAC,MAAmB;AACzE,aAAK,mBAAmB;AACxB,aAAK,8BAA8B,EAAE,MAAM;AAAA,MAC7C,CAAC;AAAA,IACH;AAAA,IAEA,WAAW,mBAA2D;AACpE,YAAM,WAAW,iBAAiB;AAClC,UAAI,kBAAkB,IAAI,gBAAgB,GAAG;AAC3C,aAAK,mBAAmB;AAAA,MAC1B;AAAA,IACF;AAAA;AAAA,IAGQ,qBAAqB;AAC3B,UAAI,KAAK,cAAc;AACrB,cAAM,eAAe,MAAM,KAAK,KAAK,aAAa,iBAAiB,QAAQ,CAAC;AAE5E,qBAAa,QAAQ,CAAC,YAAyB;AAC7C,kBAAQ,UAAU,OAAO,QAAQ,QAAQ,aAAa,MAAM,MAAM,KAAK,eAAe,IAAI;AAAA,QAC5F,CAAC;AAED,cAAM,oBAAoB,KAAK,aAAa;AAAA,UAC1C,uCAAuC,KAAK,eAAe,YAAY;AAAA,QACzE;AACA,cAAM,iBAAiB,mBAAmB;AAE1C,YAAI,gBAAgB;AAClB,yBAAe,oBAAoB,KAAK,eAAe,SAAS,QAAQ;AAAA,QAC1E;AAAA,MACF;AAAA,IACF;AAAA;AAAA,IAGQ,8BAA8B,gBAAyC;AAC7E,qBAAe,oBAAoB,KAAK,eAAe,SAAS,QAAQ;AAAA,IAC1E;AAAA,EACF;AAEA,SAAO;AACT;;;AC/DA,SAAS,eAAe;AACxB,SAAS,kBAAkB;AAC3B,SAAS,YAAAC,iBAAgB;AAWlB,IAAe,WAAf,cAAgC,WAAW;AAAA,EA+BhD,cAAc;AACZ,UAAM;AA7BR,SAAO,cAAqC;AAI5C,SAAO,iBAA2C;AA6GlD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAQ,2BAA2B,CAAC,mBAA4C;AAC9E,YAAM,UAAW,eAAuB;AACxC,YAAM,aAAa,QAAQ;AAC3B,YAAM,gBAAgB,QAAQ;AAI9B,YAAM,cAAc,KAAK,YAAY,MAAM,KAAK,OAAK,GAAG,eAAe,UAAU;AAEjF,UAAI,CAAC,aAAa;AAChB,gBAAQ,KAAK,8DAA8D,UAAU,gBAAgB;AACrG;AAAA,MACF;AAGA,UAAI,YAAY,WAAW,WAAW,GAAG;AAEvC,aAAK,kCAAkC,YAAY,aAAa;AAAA,MAClE,OAAO;AAEL,uBAAe,YAAY,CAAC,GAAI,YAAY,aAAa,CAAC,CAAE;AAAA,MAC9D;AAAA,IACF;AApGE,SAAK,iBAAiB,iCAAiC,CAAC,MAAsC;AAC5F,WAAK,cAAc;AACnB,WAAK,iBAAiB;AACtB,UAAI,KAAK,eAAe,KAAK,YAAY,MAAM,SAAS,EAAG;AAE3D,WAAK,eAAe,EAAE;AACtB,YAAM,QAAQ,MAAM,KAAK,KAAK,aAAa,iBAAiB,yBAAyB,CAAC,EAAE,IAAI,aAAW;AACrG,eAAO;AAAA,UACL,MAAM,QAAQ;AAAA,UACd,YAAY,QAAQ;AAAA,UACpB,UAAU,QAAQ;AAAA,UAClB,WAAW;AAAA,YACT;AAAA,cACE,YAAY;AAAA,cACZ,OAAO;AAAA,cACP,MAAM;AAAA,YACR;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AACD,WAAK,cAAc,EAAE,GAAG,KAAK,aAAa,MAAM;AAAA,IAClD,CAAC;AAED,SAAK,iBAAiB,iCAAiC,CAAC,MAAsC;AAC5F,YAAM,iBAAiB,EAAE;AACzB,YAAM,kBAAkB,eAAe,QAAQ,yBAAyB,GAAG;AAC3E,UAAI,iBAAiB;AACnB,uBAAe,sBAAsB;AAAA,MACvC;AACA,WAAK,yBAAyB,EAAE,MAAM;AAAA,IACxC,CAAC;AAED,SAAK,iBAAiB,4BAA4B,CAAC,MAAiD;AAElG,WAAK,kCAAkC,EAAE,OAAO,YAAY,YAAY,EAAE,OAAO,YAAY,SAAS;AAAA,IACxG,CAAC;AAAA,EACH;AAAA,EA/DA,oBAAoB,WAAmB,WAA4D;AAEjG,UAAM,cAAc,KAAK,YAAY,MAAM,KAAK,UAAQ,KAAK,eAAe,SAAS;AACrF,QAAI,aAAa;AACf,kBAAY,YAAY,YAAY,UAAU,IAAI,cAAY;AAC5D,cAAM,kBAAkB,UAAU,KAAK,OAAK,EAAE,eAAe,SAAS,UAAU;AAChF,eAAO,kBAAkB,EAAE,GAAG,UAAU,GAAG,gBAAgB,IAAI;AAAA,MACjE,CAAC;AAAA,IACH;AAEA,UAAM,UAAU,KAAK,aAAa;AAAA,MAChC,uCAAuC,SAAS;AAAA,IAClD;AACA,QAAI,WAAW,QAAQ,gBAAgB;AACrC,UAAI,QAAQ,gBAAgB;AAC1B,gBAAQ,eAAe,YAAY;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAAA,EA+CQ,kCACN,YACA,WACM;AAEN,SAAK,cAAc;AAAA,MACjB,GAAG,KAAK;AAAA;AAAA,MACR,OAAO,KAAK,YAAY,MAAM,IAAI,iBAAe;AAE/C,YAAI,YAAY,eAAe,YAAY;AACzC,iBAAO;AAAA,QACT;AAGA,eAAO;AAAA,UACL,GAAG;AAAA;AAAA,UACH,WAAW,UAAU,IAAI,cAAY;AAEnC,kBAAM,mBAAmB,YAAY,UAAU,KAAK,OAAK,EAAE,eAAe,SAAS,UAAU;AAG7F,mBAAO,mBAAmB,EAAE,GAAG,kBAAkB,GAAG,SAAS,IAAI;AAAA,UACnE,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AACA,SAAK;AAAA,MACH,IAAI,YAAY,4BAA4B,EAAE,QAAQ,KAAK,aAAa,SAAS,OAAO,UAAU,MAAM,CAAC;AAAA,IAC3G;AAAA,EACF;AAkCF;AAxIS;AAAA,EAFNC,UAAS,EAAE,WAAW,OAAO,MAAM,OAAO,CAAC;AAAA,EAC3C,QAAQ,EAAE,SAAS,YAAY,CAAC;AAAA,GAFb,SAGb;AAIA;AAAA,EAFNA,UAAS,EAAE,WAAW,OAAO,MAAM,OAAO,CAAC;AAAA,EAC3C,QAAQ,EAAE,SAAS,eAAe,CAAC;AAAA,GANhB,SAOb;;;ACRF,IAAM,sBAAsB,CAAkC,eAAkB;AAAA,EACrF,MAAe,8BAA8B,WAAW;AAAA,IACtD,eAAe,MAAa;AAC1B,YAAM,GAAG,IAAI;AACb,WAAK,iBAAiB,yBAAyB,CAAC,MAAsC;AACpF,aAAK,cAAc;AAAA,UACjB,GAAG,KAAK;AAAA,UACR,sBAAsB,CAAC,GAAI,KAAK,YAAY,wBAAwB,CAAC,GAAI,EAAE,OAAO,QAAQ;AAAA,QAC5F;AACA,UAAE,gBAAgB;AAAA,MACpB,CAAC;AAED,WAAK;AAAA,QACH;AAAA,QACA,CAAC,MAA4E;AAC3E,gBAAM,EAAE,mBAAmB,MAAM,IAAI,EAAE;AACvC,eAAK,sBAAsB,mBAAmB,KAAK;AACnD,YAAE,gBAAgB;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAAA,IAEA,oBAA6B;AAC3B,YAAM,mBAAmB,KAAK,cAAc,wBAAwB;AACpE,UAAI,CAAC,iBAAkB,QAAO;AAC9B,wBAAkB,QAAQ;AAC1B,aAAO;AAAA,IACT;AAAA;AAAA,IAIO,sBAAsB,YAAoB,OAAsC;AACrF,YAAM,kBAAkB,KAAK,WAAW,UAAU;AAClD,UAAI,CAAC,iBAAiB;AACpB,gBAAQ,KAAK,uCAAuC,UAAU,uBAAuB;AACrF;AAAA,MACF;AACA,WAAK,cAAc;AAAA,QACjB,GAAG,KAAK;AAAA,QACR,sBAAsB,KAAK,YAAY,sBAAsB,IAAI,OAAK;AACpE,cAAI,EAAE,eAAe,YAAY;AAC/B,mBAAO;AAAA,UACT;AACA,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,OAAO,gBAAgB,gBAAgB,WAAW,QAAQ,CAAC,GAAG,EAAE,OAAO,KAAe;AAAA,UACxF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IAEO,WAAW,YAA+C;AAC/D,aAAO,KAAK,YAAY,UAAU;AAAA,IACpC;AAAA,IACO,YAAY,YAA6E;AAC9F,aAAO,KAAK,YAAY,sBAAsB,KAAK,OAAK,EAAE,eAAe,UAAU,KAAK;AAAA,IAC1F;AAAA;AAAA,EAEF;AAEA,SAAO;AACT;;;AJjBO,IAAM,UAAN,cAAsB,oBAAoB,cAAc,oBAAoB,QAAQ,CAAC,CAAC,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM7F,MAAM,oBAAmC;AACvC,UAAM,kBAAkB;AACxB,UAAM,KAAK;AACX,SAAK,cAAc,IAAI,YAAY,sBAAsB,EAAE,QAAQ,KAAK,CAAC,CAAC;AAAA,EAC5E;AAAA,EACA,SAAS;AACP,WAAO;AAAA,EACT;AACF;AAda,UAAN;AAAA,EADN,cAAc,UAAU;AAAA,GACZ;;;AKxDb,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,YAAAC,iBAAgB;AACzB,SAAS,uBAAuB;AAMhC,IAAM,2BAA2B;AAAA,EAC/B,cAAc,OAAwB;AACpC,WAAO,UAAU;AAAA,EACnB;AAAA,EACA,YAAY,OAAwB;AAClC,WAAO,QAAQ,SAAS;AAAA,EAC1B;AACF;AAGO,IAAM,uBAAN,cAAmCC,YAAW;AAAA,EAA9C;AAAA;AAUL;AAAA;AAAA,mBAA+B,oBAAI,IAAI;AAAA;AAAA;AAAA,EAK7B,mBAAmD;AAC3D,WAAO;AAAA,EACT;AAAA,EAEA,IAAI,iBAA2C;AAC7C,WAAO,KAAK,YAAY,cAAc,qBAAqB;AAAA,EAC7D;AAAA,EAIA,MAAM,oBAAmC;AAEvC,UAAM,kBAAkB;AAUxB,UAAM,kBAAoB,KAAK,YAAY,EAAU,KAClD,QAAQ,UAAU,EAClB,cAAmC,oBAAoB;AAE1D,QAAI,gBAAiB,MAAK,aAAa,gBAAgB,eAAe;AAEtE,UAAM,KAAK;AAEX,SAAK;AAAA,MACH,IAAI,YAAY,qCAAqC;AAAA,QACnD,SAAS;AAAA,QACT,UAAU;AAAA,QACV,QAAQ,EAAE,YAAY,KAAK,YAAY,MAAM,KAAK,MAAM,UAAU,KAAK,SAAS;AAAA,MAClF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,SAAS;AACP,WAAO,KAAK,aAAa,KAAK,WAAW,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,KAAK;AAAA,EAC3E;AACF;AAxD8B;AAAA,EAA3BC,UAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GADf,qBACiB;AACA;AAAA,EAA3BA,UAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAFf,qBAEiB;AACsC;AAAA,EAAjEA,UAAS,EAAE,MAAM,SAAS,WAAW,yBAAyB,CAAC;AAAA,GAHrD,qBAGuD;AACA;AAAA,EAAjEA,UAAS,EAAE,MAAM,SAAS,WAAW,yBAAyB,CAAC;AAAA,GAJrD,qBAIuD;AACtC;AAAA,EAA3BA,UAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GALf,qBAKiB;AAQ5B;AAAA,EADCA,UAAS,EAAE,MAAM,QAAQ,WAAW,MAAM,CAAC;AAAA,GAZjC,qBAaX;AA8CF,IAAI,CAAC,eAAe,IAAI,yBAAyB,GAAG;AAClD,iBAAe,OAAO,2BAA2B,oBAAoB;AACvE;;;AC/EA,SAAS,eAAe;AACxB,SAAS,QAAAC,OAAM,cAAAC,mBAAkB;AACjC,SAAS,YAAAC,iBAAgB;AAQzB,IAAMC,4BAA2B;AAAA,EAC/B,cAAc,OAAwB;AACpC,WAAO,UAAU;AAAA,EACnB;AAAA,EACA,YAAY,OAAwB;AAClC,WAAO,QAAQ,SAAS;AAAA,EAC1B;AACF;AAEO,IAAM,uBAAN,cAAmCC,YAAW;AAAA,EAWnD,MAAM,oBAAmC;AACvC,UAAM,kBAAkB;AACxB,UAAM,KAAK;AACX,SAAK;AAAA,MACH,IAAI,MAAM,oCAAoC;AAAA,QAC5C,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,SAAS;AACP,WAAOC;AAAA,EACT;AACF;AAxB8B;AAAA,EAA3BC,UAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GADf,qBACiB;AACA;AAAA,EAA3BA,UAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAFf,qBAEiB;AACsC;AAAA,EAAjEA,UAAS,EAAE,MAAM,SAAS,WAAWH,0BAAyB,CAAC;AAAA,GAHrD,qBAGuD;AACtC;AAAA,EAA3BG,UAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAJf,qBAIiB;AACsC;AAAA,EAAjEA,UAAS,EAAE,MAAM,SAAS,WAAWH,0BAAyB,CAAC;AAAA,GALrD,qBAKuD;AAC4B;AAAA,EAA7FG,UAAS,EAAE,MAAM,SAAS,WAAWH,2BAA0B,WAAW,gBAAgB,CAAC;AAAA,GANjF,qBAMmF;AAGvF;AAAA,EADN,QAAQ,EAAE,SAAS,aAAa,WAAW,KAAK,CAAC;AAAA,GARvC,qBASJ;AAkBT,IAAI,CAAC,eAAe,IAAI,wBAAwB,GAAG;AACjD,iBAAe,OAAO,0BAA0B,oBAAoB;AACtE;;;AChDA,SAAS,WAAAI,gBAAe;AACxB,SAAS,QAAAC,OAAM,cAAAC,mBAAkB;AACjC,SAAS,iBAAAC,gBAAe,YAAAC,iBAAgB;AAOjC,IAAM,oBAAN,cAAgCC,YAAW;AAAA,EAOhD,MAAM,oBAAmC;AACvC,UAAM,kBAAkB;AACxB,UAAM,KAAK;AACX,SAAK;AAAA,MACH,IAAI,YAAY,iCAAiC;AAAA,QAC/C,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,SAAS;AACP,WAAOC;AAAA,EACT;AACF;AArB8B;AAAA,EAA3BC,UAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GADf,kBACiB;AACA;AAAA,EAA3BA,UAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAFf,kBAEiB;AAGrB;AAAA,EADNC,SAAQ,EAAE,SAAS,aAAa,WAAW,KAAK,CAAC;AAAA,GAJvC,kBAKJ;AALI,oBAAN;AAAA,EADNC,eAAc,qBAAqB;AAAA,GACvB;;;ACTb,SAAS,QAAAC,OAAM,cAAAC,mBAAkB;AACjC,SAAS,iBAAAC,gBAAe,YAAAC,iBAAgB;AAEjC,IAAM,cAAN,cAA0BC,YAAW;AAAA,EAArC;AAAA;AACuB,sBAAqB;AACrB,iBAAgB;AAChB,iBAAgB;AAG5C,0BAAyC;AAGzC,0BAAgD;AAAA;AAAA,EAEhD,MAAM,oBAAmC;AACvC,UAAM,kBAAkB;AACxB,UAAM,KAAK;AACX,SAAK;AAAA,MACH,IAAI,MAAM,2BAA2B;AAAA,QACnC,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,SAAS;AACP,WAAOC;AAAA,EACT;AACF;AAxB8B;AAAA,EAA3BC,UAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GADf,YACiB;AACA;AAAA,EAA3BA,UAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAFf,YAEiB;AACA;AAAA,EAA3BA,UAAS,EAAE,MAAM,OAAO,CAAC;AAAA,GAHf,YAGiB;AAG5B;AAAA,EADCA,UAAS,EAAE,MAAM,QAAQ,WAAW,kBAAkB,CAAC;AAAA,GAL7C,YAMX;AAGA;AAAA,EADCA,UAAS,EAAE,MAAM,QAAQ,WAAW,kBAAkB,CAAC;AAAA,GAR7C,YASX;AATW,cAAN;AAAA,EADNC,eAAc,eAAe;AAAA,GACjB;AA2Bb,IAAI,CAAC,eAAe,IAAI,eAAe,GAAG;AACxC,iBAAe,OAAO,iBAAiB,WAAW;AACpD;;;AChCA,SAAS,iBAAAC,sBAAqB;AAC9B,SAAS,KAAK,QAAAC,aAAY;AAKnB,IAAM,kBAAN,cAA8B,iBAAiB;AAAA,EAM3C,SAAS;AAChB,WAAOC;AAAA,EACT;AACF;AATa,gBACJ,SAAS;AAAA;AAAA;AAAA;AAAA;AADL,kBAAN;AAAA,EADNC,eAAc,mBAAmB;AAAA,GACrB;","names":["NavigationErrorType","property","property","LitElement","property","LitElement","property","html","LitElement","property","stringToBooleanConverter","LitElement","html","property","consume","html","LitElement","customElement","property","LitElement","html","property","consume","customElement","html","LitElement","customElement","property","LitElement","html","property","customElement","customElement","html","html","customElement"]}
@@ -0,0 +1,91 @@
1
+ import {
2
+ btn,
3
+ dis
4
+ } from "./chunk-5ZHHNEDA.js";
5
+ import {
6
+ watch
7
+ } from "./chunk-ELDMXTUQ.js";
8
+ import {
9
+ computedContext
10
+ } from "./chunk-AZIKAG7K.js";
11
+ import {
12
+ __decorateClass
13
+ } from "./chunk-H2JE6IVU.js";
14
+
15
+ // src/lib/qti-test/components/test-next.ts
16
+ import { css, html, LitElement } from "lit";
17
+ import { customElement, property } from "lit/decorators.js";
18
+ import { consume } from "@lit/context";
19
+ var TestNext = class extends LitElement {
20
+ constructor() {
21
+ super();
22
+ this.disabled = true;
23
+ this._internals = this.attachInternals();
24
+ this._internals.role = "button";
25
+ this._internals.ariaLabel = "Next item";
26
+ this.addEventListener("click", (e) => {
27
+ e.preventDefault();
28
+ if (!this.disabled) this._requestItem(this.sectionItems[this.itemIndex + 1].identifier);
29
+ });
30
+ }
31
+ _handleTestElementChange(_oldValue, newValue) {
32
+ if (newValue) {
33
+ this.disabled = false;
34
+ }
35
+ }
36
+ connectedCallback() {
37
+ super.connectedCallback();
38
+ this.checkDisabled();
39
+ }
40
+ willUpdate(_changedProperties) {
41
+ if (!this.computedContext) return;
42
+ const testPart = this.computedContext?.testParts.find((testPart2) => testPart2.active);
43
+ if (!testPart) return;
44
+ this.sectionItems = testPart.sections.flatMap((section) => section.items);
45
+ this.itemIndex = this.sectionItems.findIndex((item) => item.active);
46
+ this.checkDisabled();
47
+ }
48
+ checkDisabled() {
49
+ this.disabled = !this.computedContext || this.itemIndex < 0 || this.itemIndex >= this.sectionItems?.length - 1;
50
+ }
51
+ _requestItem(identifier) {
52
+ this.dispatchEvent(
53
+ new CustomEvent("qti-request-navigation", {
54
+ composed: true,
55
+ bubbles: true,
56
+ detail: {
57
+ type: "item",
58
+ id: identifier
59
+ }
60
+ })
61
+ );
62
+ }
63
+ render() {
64
+ return html`<slot></slot>`;
65
+ }
66
+ };
67
+ TestNext.styles = css`
68
+ :host {
69
+ ${btn};
70
+ }
71
+ :host([disabled]) {
72
+ ${dis};
73
+ }
74
+ `;
75
+ __decorateClass([
76
+ property({ type: Boolean, reflect: true })
77
+ ], TestNext.prototype, "disabled", 2);
78
+ __decorateClass([
79
+ consume({ context: computedContext, subscribe: true })
80
+ ], TestNext.prototype, "computedContext", 2);
81
+ __decorateClass([
82
+ watch("computedContext")
83
+ ], TestNext.prototype, "_handleTestElementChange", 1);
84
+ TestNext = __decorateClass([
85
+ customElement("test-next")
86
+ ], TestNext);
87
+
88
+ export {
89
+ TestNext
90
+ };
91
+ //# sourceMappingURL=chunk-HUQGTGCK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/qti-test/components/test-next.ts"],"sourcesContent":["import { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\n\nimport * as styles from './styles';\nimport { watch } from '../../decorators';\nimport { computedContext } from '../../exports/computed.context';\n\nimport type { ComputedContext, ComputedItem } from '../../exports/computed.context';\n\n/**\n * Represents a custom element for navigating to the next test item.\n *\n * @remarks\n * This element provides functionality for navigating to the next test item.\n *\n * @example\n * ```html\n * <test-next></test-next>\n * ```\n */\n@customElement('test-next')\nexport class TestNext extends LitElement {\n @property({ type: Boolean, reflect: true })\n public disabled = true;\n\n @consume({ context: computedContext, subscribe: true })\n protected computedContext: ComputedContext;\n\n sectionItems: ComputedItem[];\n itemIndex: number;\n\n @watch('computedContext')\n _handleTestElementChange(_oldValue: ComputedContext, newValue: ComputedContext) {\n if (newValue) {\n this.disabled = false;\n }\n }\n\n static styles = css`\n :host {\n ${styles.btn};\n }\n :host([disabled]) {\n ${styles.dis};\n }\n `;\n private _internals: ElementInternals;\n\n constructor() {\n super();\n\n this._internals = this.attachInternals();\n this._internals.role = 'button';\n this._internals.ariaLabel = 'Next item';\n\n this.addEventListener('click', e => {\n e.preventDefault();\n if (!this.disabled) this._requestItem(this.sectionItems[this.itemIndex + 1].identifier);\n });\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.checkDisabled();\n }\n\n willUpdate(_changedProperties: Map<string | number | symbol, unknown>) {\n if (!this.computedContext) return;\n const testPart = this.computedContext?.testParts.find(testPart => testPart.active);\n if (!testPart) return;\n this.sectionItems = testPart.sections.flatMap(section => section.items);\n this.itemIndex = this.sectionItems.findIndex(item => item.active);\n this.checkDisabled();\n }\n\n checkDisabled() {\n this.disabled = !this.computedContext || this.itemIndex < 0 || this.itemIndex >= this.sectionItems?.length - 1;\n }\n\n protected _requestItem(identifier: string): void {\n this.dispatchEvent(\n new CustomEvent('qti-request-navigation', {\n composed: true,\n bubbles: true,\n detail: {\n type: 'item',\n id: identifier\n }\n })\n );\n }\n\n render() {\n return html`<slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'test-next': TestNext;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAAA,SAAS,KAAK,MAAM,kBAAkB;AACtC,SAAS,eAAe,gBAAgB;AACxC,SAAS,eAAe;AAoBjB,IAAM,WAAN,cAAuB,WAAW;AAAA,EA2BvC,cAAc;AACZ,UAAM;AA1BR,SAAO,WAAW;AA4BhB,SAAK,aAAa,KAAK,gBAAgB;AACvC,SAAK,WAAW,OAAO;AACvB,SAAK,WAAW,YAAY;AAE5B,SAAK,iBAAiB,SAAS,OAAK;AAClC,QAAE,eAAe;AACjB,UAAI,CAAC,KAAK,SAAU,MAAK,aAAa,KAAK,aAAa,KAAK,YAAY,CAAC,EAAE,UAAU;AAAA,IACxF,CAAC;AAAA,EACH;AAAA,EA3BA,yBAAyB,WAA4B,UAA2B;AAC9E,QAAI,UAAU;AACZ,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA,EAyBA,oBAA0B;AACxB,UAAM,kBAAkB;AACxB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,WAAW,oBAA4D;AACrE,QAAI,CAAC,KAAK,gBAAiB;AAC3B,UAAM,WAAW,KAAK,iBAAiB,UAAU,KAAK,CAAAA,cAAYA,UAAS,MAAM;AACjF,QAAI,CAAC,SAAU;AACf,SAAK,eAAe,SAAS,SAAS,QAAQ,aAAW,QAAQ,KAAK;AACtE,SAAK,YAAY,KAAK,aAAa,UAAU,UAAQ,KAAK,MAAM;AAChE,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,gBAAgB;AACd,SAAK,WAAW,CAAC,KAAK,mBAAmB,KAAK,YAAY,KAAK,KAAK,aAAa,KAAK,cAAc,SAAS;AAAA,EAC/G;AAAA,EAEU,aAAa,YAA0B;AAC/C,SAAK;AAAA,MACH,IAAI,YAAY,0BAA0B;AAAA,QACxC,UAAU;AAAA,QACV,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,IAAI;AAAA,QACN;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,SAAS;AACP,WAAO;AAAA,EACT;AACF;AA1Ea,SAiBJ,SAAS;AAAA;AAAA,QAEH,GAAG;AAAA;AAAA;AAAA,QAGH,GAAG;AAAA;AAAA;AApBT;AAAA,EADN,SAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAD/B,SAEJ;AAGG;AAAA,EADT,QAAQ,EAAE,SAAS,iBAAiB,WAAW,KAAK,CAAC;AAAA,GAJ3C,SAKD;AAMV;AAAA,EADC,MAAM,iBAAiB;AAAA,GAVb,SAWX;AAXW,WAAN;AAAA,EADN,cAAc,WAAW;AAAA,GACb;","names":["testPart"]}
@@ -0,0 +1,87 @@
1
+ import {
2
+ btn,
3
+ dis
4
+ } from "./chunk-5ZHHNEDA.js";
5
+ import {
6
+ computedContext
7
+ } from "./chunk-AZIKAG7K.js";
8
+ import {
9
+ __decorateClass
10
+ } from "./chunk-H2JE6IVU.js";
11
+
12
+ // src/lib/qti-test/components/test-next.ts
13
+ import { css, html, LitElement } from "lit";
14
+ import { customElement, property } from "lit/decorators.js";
15
+ import { consume } from "@lit/context";
16
+ var TestNext = class extends LitElement {
17
+ constructor() {
18
+ super();
19
+ this.disabled = false;
20
+ this._internals = this.attachInternals();
21
+ this._internals.role = "button";
22
+ this._internals.ariaLabel = "Next item";
23
+ this.addEventListener("click", (e) => {
24
+ e.preventDefault();
25
+ if (!this.disabled) this._requestItem(this.sectionItems[this.itemIndex + 1].identifier);
26
+ });
27
+ }
28
+ connectedCallback() {
29
+ super.connectedCallback();
30
+ }
31
+ willUpdate(_changedProperties) {
32
+ if (!this.computedContext) return;
33
+ const testPart = this.computedContext?.testParts.find((testPart2) => testPart2.active);
34
+ if (!testPart) return;
35
+ this.sectionItems = testPart.sections.flatMap((section) => section.items);
36
+ this.itemIndex = this.sectionItems.findIndex((item) => item.active);
37
+ }
38
+ checkDisabled() {
39
+ const shouldBeDisabled = !this.computedContext || this.itemIndex < 0 || this.itemIndex >= this.sectionItems?.length - 1;
40
+ if (shouldBeDisabled) {
41
+ this.disabled = true;
42
+ }
43
+ }
44
+ _requestItem(identifier) {
45
+ this.dispatchEvent(
46
+ new CustomEvent("qti-request-navigation", {
47
+ composed: true,
48
+ bubbles: true,
49
+ detail: {
50
+ type: "item",
51
+ id: identifier
52
+ }
53
+ })
54
+ );
55
+ }
56
+ render() {
57
+ return html`<slot></slot>`;
58
+ }
59
+ };
60
+ // @watch('computedContext')
61
+ // _handleTestElementChange(_oldValue: ComputedContext, newValue: ComputedContext) {
62
+ // if (newValue) {
63
+ // this.disabled = false;
64
+ // }
65
+ // }
66
+ TestNext.styles = css`
67
+ :host {
68
+ ${btn};
69
+ }
70
+ :host([disabled]) {
71
+ ${dis};
72
+ }
73
+ `;
74
+ __decorateClass([
75
+ property({ type: Boolean, reflect: true })
76
+ ], TestNext.prototype, "disabled", 2);
77
+ __decorateClass([
78
+ consume({ context: computedContext, subscribe: true })
79
+ ], TestNext.prototype, "computedContext", 2);
80
+ TestNext = __decorateClass([
81
+ customElement("test-next")
82
+ ], TestNext);
83
+
84
+ export {
85
+ TestNext
86
+ };
87
+ //# sourceMappingURL=chunk-IAZM2LUL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/qti-test/components/test-next.ts"],"sourcesContent":["import { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\n\nimport * as styles from './styles';\n// import { watch } from '../../decorators';\nimport { computedContext } from '../../exports/computed.context';\n\nimport type { ComputedContext, ComputedItem } from '../../exports/computed.context';\n\n/**\n * Represents a custom element for navigating to the next test item.\n *\n * @remarks\n * This element provides functionality for navigating to the next test item.\n *\n * @example\n * ```html\n * <test-next></test-next>\n * ```\n */\n@customElement('test-next')\nexport class TestNext extends LitElement {\n @property({ type: Boolean, reflect: true })\n public disabled = false;\n\n @consume({ context: computedContext, subscribe: true })\n protected computedContext: ComputedContext;\n\n sectionItems: ComputedItem[];\n itemIndex: number;\n\n // @watch('computedContext')\n // _handleTestElementChange(_oldValue: ComputedContext, newValue: ComputedContext) {\n // if (newValue) {\n // this.disabled = false;\n // }\n // }\n\n static styles = css`\n :host {\n ${styles.btn};\n }\n :host([disabled]) {\n ${styles.dis};\n }\n `;\n private _internals: ElementInternals;\n\n constructor() {\n super();\n\n this._internals = this.attachInternals();\n this._internals.role = 'button';\n this._internals.ariaLabel = 'Next item';\n\n this.addEventListener('click', e => {\n e.preventDefault();\n if (!this.disabled) this._requestItem(this.sectionItems[this.itemIndex + 1].identifier);\n });\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n // this.checkDisabled();\n }\n\n willUpdate(_changedProperties: Map<string | number | symbol, unknown>) {\n if (!this.computedContext) return;\n const testPart = this.computedContext?.testParts.find(testPart => testPart.active);\n if (!testPart) return;\n this.sectionItems = testPart.sections.flatMap(section => section.items);\n this.itemIndex = this.sectionItems.findIndex(item => item.active);\n // this.checkDisabled();\n }\n\n checkDisabled() {\n const shouldBeDisabled =\n !this.computedContext || this.itemIndex < 0 || this.itemIndex >= this.sectionItems?.length - 1;\n if (shouldBeDisabled) {\n this.disabled = true;\n }\n }\n\n protected _requestItem(identifier: string): void {\n this.dispatchEvent(\n new CustomEvent('qti-request-navigation', {\n composed: true,\n bubbles: true,\n detail: {\n type: 'item',\n id: identifier\n }\n })\n );\n }\n\n render() {\n return html`<slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'test-next': TestNext;\n }\n}\n"],"mappings":";;;;;;;;;;;;AAAA,SAAS,KAAK,MAAM,kBAAkB;AACtC,SAAS,eAAe,gBAAgB;AACxC,SAAS,eAAe;AAoBjB,IAAM,WAAN,cAAuB,WAAW;AAAA,EA2BvC,cAAc;AACZ,UAAM;AA1BR,SAAO,WAAW;AA4BhB,SAAK,aAAa,KAAK,gBAAgB;AACvC,SAAK,WAAW,OAAO;AACvB,SAAK,WAAW,YAAY;AAE5B,SAAK,iBAAiB,SAAS,OAAK;AAClC,QAAE,eAAe;AACjB,UAAI,CAAC,KAAK,SAAU,MAAK,aAAa,KAAK,aAAa,KAAK,YAAY,CAAC,EAAE,UAAU;AAAA,IACxF,CAAC;AAAA,EACH;AAAA,EAEA,oBAA0B;AACxB,UAAM,kBAAkB;AAAA,EAE1B;AAAA,EAEA,WAAW,oBAA4D;AACrE,QAAI,CAAC,KAAK,gBAAiB;AAC3B,UAAM,WAAW,KAAK,iBAAiB,UAAU,KAAK,CAAAA,cAAYA,UAAS,MAAM;AACjF,QAAI,CAAC,SAAU;AACf,SAAK,eAAe,SAAS,SAAS,QAAQ,aAAW,QAAQ,KAAK;AACtE,SAAK,YAAY,KAAK,aAAa,UAAU,UAAQ,KAAK,MAAM;AAAA,EAElE;AAAA,EAEA,gBAAgB;AACd,UAAM,mBACJ,CAAC,KAAK,mBAAmB,KAAK,YAAY,KAAK,KAAK,aAAa,KAAK,cAAc,SAAS;AAC/F,QAAI,kBAAkB;AACpB,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA,EAEU,aAAa,YAA0B;AAC/C,SAAK;AAAA,MACH,IAAI,YAAY,0BAA0B;AAAA,QACxC,UAAU;AAAA,QACV,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,IAAI;AAAA,QACN;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,SAAS;AACP,WAAO;AAAA,EACT;AACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA9Ea,SAiBJ,SAAS;AAAA;AAAA,QAEH,GAAG;AAAA;AAAA;AAAA,QAGH,GAAG;AAAA;AAAA;AApBT;AAAA,EADN,SAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAD/B,SAEJ;AAGG;AAAA,EADT,QAAQ,EAAE,SAAS,iBAAiB,WAAW,KAAK,CAAC;AAAA,GAJ3C,SAKD;AALC,WAAN;AAAA,EADN,cAAc,WAAW;AAAA,GACb;","names":["testPart"]}
@@ -0,0 +1,86 @@
1
+ import {
2
+ computedContext
3
+ } from "./chunk-AZIKAG7K.js";
4
+ import {
5
+ __decorateClass
6
+ } from "./chunk-H2JE6IVU.js";
7
+
8
+ // src/lib/qti-test/components/test-stamp.ts
9
+ import { html, LitElement, nothing } from "lit";
10
+ import { customElement, property, state } from "lit/decorators.js";
11
+ import { prepareTemplate } from "stampino";
12
+ import { consume } from "@lit/context";
13
+ var TestStamp = class extends LitElement {
14
+ constructor() {
15
+ super(...arguments);
16
+ this.debug = false;
17
+ this.stampContext = {
18
+ view: "candidate",
19
+ activeItem: {},
20
+ activeSection: {
21
+ items: []
22
+ },
23
+ activeTestpart: {
24
+ items: []
25
+ },
26
+ test: {}
27
+ };
28
+ }
29
+ createRenderRoot() {
30
+ return this;
31
+ }
32
+ connectedCallback() {
33
+ super.connectedCallback();
34
+ const templateElement = this.querySelector("template");
35
+ if (!templateElement) {
36
+ this.myTemplate = null;
37
+ return;
38
+ }
39
+ this.myTemplate = prepareTemplate(templateElement);
40
+ }
41
+ willUpdate(_changedProperties) {
42
+ const activeTestPart = this.computedContext.testParts.find((testPart) => testPart.active);
43
+ const activeSection = activeTestPart?.sections.find((section) => section.active);
44
+ const activeItem = activeSection?.items.find((item) => item.active);
45
+ const { variables, ...augmentedItem } = activeItem || {};
46
+ const augmentedTestPart = {
47
+ ...activeTestPart,
48
+ items: activeTestPart.sections.flatMap((section) => section.items.map(({ variables: variables2, ...rest }) => rest)),
49
+ sections: activeTestPart.sections.map((section) => ({
50
+ ...section,
51
+ items: section.items.map(({ variables: variables2, ...rest }) => rest)
52
+ }))
53
+ };
54
+ const augmentedSection = { ...activeSection, items: activeSection.items.map(({ variables: variables2, ...rest }) => rest) };
55
+ const { testParts, ...activeTest } = this.computedContext;
56
+ this.stampContext = {
57
+ view: this.computedContext.view,
58
+ activeItem: augmentedItem,
59
+ activeSection: augmentedSection,
60
+ activeTestpart: augmentedTestPart,
61
+ test: activeTest
62
+ };
63
+ }
64
+ render() {
65
+ return html` ${this.debug ? html`<small><pre>${JSON.stringify(this.stampContext, null, 2)}</pre></small>` : nothing}
66
+ ${this.myTemplate ? this.myTemplate(this.stampContext) : nothing}`;
67
+ }
68
+ };
69
+ __decorateClass([
70
+ property({ type: Boolean, reflect: true })
71
+ ], TestStamp.prototype, "debug", 2);
72
+ __decorateClass([
73
+ state(),
74
+ consume({ context: computedContext, subscribe: true })
75
+ ], TestStamp.prototype, "computedContext", 2);
76
+ __decorateClass([
77
+ state()
78
+ ], TestStamp.prototype, "stampContext", 2);
79
+ TestStamp = __decorateClass([
80
+ customElement("test-stamp")
81
+ ], TestStamp);
82
+
83
+ export {
84
+ TestStamp
85
+ };
86
+ //# sourceMappingURL=chunk-IDRQNT6W.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/qti-test/components/test-stamp.ts"],"sourcesContent":["import { html, LitElement, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { prepareTemplate } from 'stampino';\nimport { consume } from '@lit/context';\n\nimport { computedContext } from '../../exports/computed.context';\n\nimport type { View } from '../core/mixins/test-view.mixin';\nimport type { PropertyValues } from 'lit';\nimport type { ComputedContext } from '../../exports/computed.context';\nimport type { TemplateFunction } from 'stampino';\n\n/**\n * A custom web component that renders a test stamp using the Lit framework.\n * This component is deprecated and will be removed in the future.\n * @customElement\n * @extends {LitElement}\n */\n@customElement('test-stamp')\nexport class TestStamp extends LitElement {\n /**\n * Indicates whether the component is in debug mode.\n * When set to `true`, the available objects and properties (i.e.: stampContext) is displayed.\n */\n @property({ type: Boolean, reflect: true })\n public debug = false;\n\n @state()\n @consume({ context: computedContext, subscribe: true })\n private computedContext: ComputedContext;\n\n @state()\n private stampContext: {\n view?: View;\n test?: unknown;\n activeTestpart?: unknown;\n activeSection?: unknown;\n activeItem?: unknown;\n } = {\n view: 'candidate',\n activeItem: {},\n activeSection: {\n items: []\n },\n activeTestpart: {\n items: []\n },\n test: {}\n };\n\n myTemplate: TemplateFunction;\n\n protected createRenderRoot(): HTMLElement | DocumentFragment {\n return this;\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n const templateElement = this.querySelector<HTMLTemplateElement>('template');\n if (!templateElement) {\n this.myTemplate = null;\n return;\n }\n this.myTemplate = prepareTemplate(templateElement);\n }\n\n protected willUpdate(_changedProperties: PropertyValues): void {\n const activeTestPart = this.computedContext.testParts.find(testPart => testPart.active);\n const activeSection = activeTestPart?.sections.find(section => section.active);\n const activeItem = activeSection?.items.find(item => item.active);\n const { variables, ...augmentedItem } = activeItem || {};\n\n const augmentedTestPart = {\n ...activeTestPart,\n items: activeTestPart.sections.flatMap(section => section.items.map(({ variables, ...rest }) => rest)),\n sections: activeTestPart.sections.map(section => ({\n ...section,\n items: section.items.map(({ variables, ...rest }) => rest)\n }))\n };\n\n const augmentedSection = { ...activeSection, items: activeSection.items.map(({ variables, ...rest }) => rest) };\n const { testParts, ...activeTest } = this.computedContext;\n\n this.stampContext = {\n view: this.computedContext.view,\n activeItem: augmentedItem,\n activeSection: augmentedSection,\n activeTestpart: augmentedTestPart,\n test: activeTest\n };\n }\n\n render() {\n // if (!this.stampContext) return nothing;\n return html` ${this.debug ? html`<small><pre>${JSON.stringify(this.stampContext, null, 2)}</pre></small>` : nothing}\n ${this.myTemplate ? this.myTemplate(this.stampContext) : nothing}`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'test-stamp': TestStamp;\n }\n}\n"],"mappings":";;;;;;;;AAAA,SAAS,MAAM,YAAY,eAAe;AAC1C,SAAS,eAAe,UAAU,aAAa;AAC/C,SAAS,uBAAuB;AAChC,SAAS,eAAe;AAgBjB,IAAM,YAAN,cAAwB,WAAW;AAAA,EAAnC;AAAA;AAML,SAAO,QAAQ;AAOf,SAAQ,eAMJ;AAAA,MACF,MAAM;AAAA,MACN,YAAY,CAAC;AAAA,MACb,eAAe;AAAA,QACb,OAAO,CAAC;AAAA,MACV;AAAA,MACA,gBAAgB;AAAA,QACd,OAAO,CAAC;AAAA,MACV;AAAA,MACA,MAAM,CAAC;AAAA,IACT;AAAA;AAAA,EAIU,mBAAmD;AAC3D,WAAO;AAAA,EACT;AAAA,EAEA,oBAA0B;AACxB,UAAM,kBAAkB;AACxB,UAAM,kBAAkB,KAAK,cAAmC,UAAU;AAC1E,QAAI,CAAC,iBAAiB;AACpB,WAAK,aAAa;AAClB;AAAA,IACF;AACA,SAAK,aAAa,gBAAgB,eAAe;AAAA,EACnD;AAAA,EAEU,WAAW,oBAA0C;AAC7D,UAAM,iBAAiB,KAAK,gBAAgB,UAAU,KAAK,cAAY,SAAS,MAAM;AACtF,UAAM,gBAAgB,gBAAgB,SAAS,KAAK,aAAW,QAAQ,MAAM;AAC7E,UAAM,aAAa,eAAe,MAAM,KAAK,UAAQ,KAAK,MAAM;AAChE,UAAM,EAAE,WAAW,GAAG,cAAc,IAAI,cAAc,CAAC;AAEvD,UAAM,oBAAoB;AAAA,MACxB,GAAG;AAAA,MACH,OAAO,eAAe,SAAS,QAAQ,aAAW,QAAQ,MAAM,IAAI,CAAC,EAAE,WAAAA,YAAW,GAAG,KAAK,MAAM,IAAI,CAAC;AAAA,MACrG,UAAU,eAAe,SAAS,IAAI,cAAY;AAAA,QAChD,GAAG;AAAA,QACH,OAAO,QAAQ,MAAM,IAAI,CAAC,EAAE,WAAAA,YAAW,GAAG,KAAK,MAAM,IAAI;AAAA,MAC3D,EAAE;AAAA,IACJ;AAEA,UAAM,mBAAmB,EAAE,GAAG,eAAe,OAAO,cAAc,MAAM,IAAI,CAAC,EAAE,WAAAA,YAAW,GAAG,KAAK,MAAM,IAAI,EAAE;AAC9G,UAAM,EAAE,WAAW,GAAG,WAAW,IAAI,KAAK;AAE1C,SAAK,eAAe;AAAA,MAClB,MAAM,KAAK,gBAAgB;AAAA,MAC3B,YAAY;AAAA,MACZ,eAAe;AAAA,MACf,gBAAgB;AAAA,MAChB,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,SAAS;AAEP,WAAO,QAAQ,KAAK,QAAQ,mBAAmB,KAAK,UAAU,KAAK,cAAc,MAAM,CAAC,CAAC,mBAAmB,OAAO;AAAA,MACjH,KAAK,aAAa,KAAK,WAAW,KAAK,YAAY,IAAI,OAAO;AAAA,EAClE;AACF;AAzES;AAAA,EADN,SAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAL/B,UAMJ;AAIC;AAAA,EAFP,MAAM;AAAA,EACN,QAAQ,EAAE,SAAS,iBAAiB,WAAW,KAAK,CAAC;AAAA,GAT3C,UAUH;AAGA;AAAA,EADP,MAAM;AAAA,GAZI,UAaH;AAbG,YAAN;AAAA,EADN,cAAc,YAAY;AAAA,GACd;","names":["variables"]}
@@ -0,0 +1,90 @@
1
+ import {
2
+ btn,
3
+ dis
4
+ } from "./chunk-5ZHHNEDA.js";
5
+ import {
6
+ watch
7
+ } from "./chunk-ELDMXTUQ.js";
8
+ import {
9
+ computedContext
10
+ } from "./chunk-AZIKAG7K.js";
11
+ import {
12
+ __decorateClass
13
+ } from "./chunk-H2JE6IVU.js";
14
+
15
+ // src/lib/qti-test/components/test-next.ts
16
+ import { css, html, LitElement } from "lit";
17
+ import { customElement, property } from "lit/decorators.js";
18
+ import { consume } from "@lit/context";
19
+ var TestNext = class extends LitElement {
20
+ _handleTestElementChange(_oldValue, newValue) {
21
+ if (newValue) {
22
+ this.disabled = false;
23
+ }
24
+ }
25
+ constructor() {
26
+ super();
27
+ this._internals = this.attachInternals();
28
+ this._internals.role = "button";
29
+ this._internals.ariaLabel = "Next item";
30
+ this.addEventListener("click", (e) => {
31
+ e.preventDefault();
32
+ if (!this.disabled) this._requestItem(this.sectionItems[this.itemIndex + 1].identifier);
33
+ });
34
+ }
35
+ connectedCallback() {
36
+ super.connectedCallback();
37
+ this.checkDisabled();
38
+ }
39
+ willUpdate(_changedProperties) {
40
+ if (!this.computedContext) return;
41
+ const testPart = this.computedContext?.testParts.find((testPart2) => testPart2.active);
42
+ if (!testPart) return;
43
+ this.sectionItems = testPart.sections.flatMap((section) => section.items);
44
+ this.itemIndex = this.sectionItems.findIndex((item) => item.active);
45
+ this.checkDisabled();
46
+ }
47
+ checkDisabled() {
48
+ this.disabled = !this.computedContext || this.itemIndex < 0 || this.itemIndex >= this.sectionItems?.length - 1;
49
+ }
50
+ _requestItem(identifier) {
51
+ this.dispatchEvent(
52
+ new CustomEvent("qti-request-navigation", {
53
+ composed: true,
54
+ bubbles: true,
55
+ detail: {
56
+ type: "item",
57
+ id: identifier
58
+ }
59
+ })
60
+ );
61
+ }
62
+ render() {
63
+ return html`<slot></slot>`;
64
+ }
65
+ };
66
+ TestNext.styles = css`
67
+ :host {
68
+ ${btn};
69
+ }
70
+ :host([disabled]) {
71
+ ${dis};
72
+ }
73
+ `;
74
+ __decorateClass([
75
+ property({ type: Boolean, reflect: true })
76
+ ], TestNext.prototype, "disabled", 2);
77
+ __decorateClass([
78
+ consume({ context: computedContext, subscribe: true })
79
+ ], TestNext.prototype, "computedContext", 2);
80
+ __decorateClass([
81
+ watch("computedContext")
82
+ ], TestNext.prototype, "_handleTestElementChange", 1);
83
+ TestNext = __decorateClass([
84
+ customElement("test-next")
85
+ ], TestNext);
86
+
87
+ export {
88
+ TestNext
89
+ };
90
+ //# sourceMappingURL=chunk-IRKYNGZN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/qti-test/components/test-next.ts"],"sourcesContent":["import { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { consume } from '@lit/context';\n\nimport * as styles from './styles';\nimport { watch } from '../../decorators';\nimport { computedContext } from '../../exports/computed.context';\n\nimport type { ComputedContext, ComputedItem } from '../../exports/computed.context';\n\n/**\n * Represents a custom element for navigating to the next test item.\n *\n * @remarks\n * This element provides functionality for navigating to the next test item.\n *\n * @example\n * ```html\n * <test-next></test-next>\n * ```\n */\n@customElement('test-next')\nexport class TestNext extends LitElement {\n @property({ type: Boolean, reflect: true })\n public disabled!: boolean;\n\n @consume({ context: computedContext, subscribe: true })\n protected computedContext: ComputedContext;\n\n sectionItems: ComputedItem[];\n itemIndex: number;\n\n @watch('computedContext')\n _handleTestElementChange(_oldValue: ComputedContext, newValue: ComputedContext) {\n if (newValue) {\n this.disabled = false;\n }\n }\n\n static styles = css`\n :host {\n ${styles.btn};\n }\n :host([disabled]) {\n ${styles.dis};\n }\n `;\n private _internals: ElementInternals;\n\n constructor() {\n super();\n\n this._internals = this.attachInternals();\n this._internals.role = 'button';\n this._internals.ariaLabel = 'Next item';\n\n this.addEventListener('click', e => {\n e.preventDefault();\n if (!this.disabled) this._requestItem(this.sectionItems[this.itemIndex + 1].identifier);\n });\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n this.checkDisabled();\n }\n\n willUpdate(_changedProperties: Map<string | number | symbol, unknown>) {\n if (!this.computedContext) return;\n const testPart = this.computedContext?.testParts.find(testPart => testPart.active);\n if (!testPart) return;\n this.sectionItems = testPart.sections.flatMap(section => section.items);\n this.itemIndex = this.sectionItems.findIndex(item => item.active);\n this.checkDisabled();\n }\n\n checkDisabled() {\n this.disabled = !this.computedContext || this.itemIndex < 0 || this.itemIndex >= this.sectionItems?.length - 1;\n }\n\n protected _requestItem(identifier: string): void {\n this.dispatchEvent(\n new CustomEvent('qti-request-navigation', {\n composed: true,\n bubbles: true,\n detail: {\n type: 'item',\n id: identifier\n }\n })\n );\n }\n\n render() {\n return html`<slot></slot>`;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'test-next': TestNext;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAAA,SAAS,KAAK,MAAM,kBAAkB;AACtC,SAAS,eAAe,gBAAgB;AACxC,SAAS,eAAe;AAoBjB,IAAM,WAAN,cAAuB,WAAW;AAAA,EAWvC,yBAAyB,WAA4B,UAA2B;AAC9E,QAAI,UAAU;AACZ,WAAK,WAAW;AAAA,IAClB;AAAA,EACF;AAAA,EAYA,cAAc;AACZ,UAAM;AAEN,SAAK,aAAa,KAAK,gBAAgB;AACvC,SAAK,WAAW,OAAO;AACvB,SAAK,WAAW,YAAY;AAE5B,SAAK,iBAAiB,SAAS,OAAK;AAClC,QAAE,eAAe;AACjB,UAAI,CAAC,KAAK,SAAU,MAAK,aAAa,KAAK,aAAa,KAAK,YAAY,CAAC,EAAE,UAAU;AAAA,IACxF,CAAC;AAAA,EACH;AAAA,EAEA,oBAA0B;AACxB,UAAM,kBAAkB;AACxB,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,WAAW,oBAA4D;AACrE,QAAI,CAAC,KAAK,gBAAiB;AAC3B,UAAM,WAAW,KAAK,iBAAiB,UAAU,KAAK,CAAAA,cAAYA,UAAS,MAAM;AACjF,QAAI,CAAC,SAAU;AACf,SAAK,eAAe,SAAS,SAAS,QAAQ,aAAW,QAAQ,KAAK;AACtE,SAAK,YAAY,KAAK,aAAa,UAAU,UAAQ,KAAK,MAAM;AAChE,SAAK,cAAc;AAAA,EACrB;AAAA,EAEA,gBAAgB;AACd,SAAK,WAAW,CAAC,KAAK,mBAAmB,KAAK,YAAY,KAAK,KAAK,aAAa,KAAK,cAAc,SAAS;AAAA,EAC/G;AAAA,EAEU,aAAa,YAA0B;AAC/C,SAAK;AAAA,MACH,IAAI,YAAY,0BAA0B;AAAA,QACxC,UAAU;AAAA,QACV,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,IAAI;AAAA,QACN;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,SAAS;AACP,WAAO;AAAA,EACT;AACF;AA1Ea,SAiBJ,SAAS;AAAA;AAAA,QAEH,GAAG;AAAA;AAAA;AAAA,QAGH,GAAG;AAAA;AAAA;AApBT;AAAA,EADN,SAAS,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA,GAD/B,SAEJ;AAGG;AAAA,EADT,QAAQ,EAAE,SAAS,iBAAiB,WAAW,KAAK,CAAC;AAAA,GAJ3C,SAKD;AAMV;AAAA,EADC,MAAM,iBAAiB;AAAA,GAVb,SAWX;AAXW,WAAN;AAAA,EADN,cAAc,WAAW;AAAA,GACb;","names":["testPart"]}
@@ -0,0 +1,43 @@
1
+ import {
2
+ computedContext
3
+ } from "./chunk-AZIKAG7K.js";
4
+ import {
5
+ __decorateClass
6
+ } from "./chunk-H2JE6IVU.js";
7
+
8
+ // src/lib/qti-test/components/test-section-buttons-stamp.ts
9
+ import { html, LitElement } from "lit";
10
+ import { customElement } from "lit/decorators.js";
11
+ import { prepareTemplate } from "stampino";
12
+ import { consume } from "@lit/context";
13
+ var TestSectionButtonsStamp = class extends LitElement {
14
+ createRenderRoot() {
15
+ return this;
16
+ }
17
+ constructor() {
18
+ super();
19
+ this._internals = this.attachInternals();
20
+ this._internals.ariaLabel = "pagination";
21
+ }
22
+ connectedCallback() {
23
+ super.connectedCallback();
24
+ const templateElement = this.querySelector("template");
25
+ this.myTemplate = prepareTemplate(templateElement);
26
+ }
27
+ render() {
28
+ if (!this.computedContext) return html``;
29
+ const sections = this.computedContext.testParts.flatMap((testPart) => testPart.sections);
30
+ return html` ${sections.map((item) => this.myTemplate({ item }))} `;
31
+ }
32
+ };
33
+ __decorateClass([
34
+ consume({ context: computedContext, subscribe: true })
35
+ ], TestSectionButtonsStamp.prototype, "computedContext", 2);
36
+ TestSectionButtonsStamp = __decorateClass([
37
+ customElement("test-section-buttons-stamp")
38
+ ], TestSectionButtonsStamp);
39
+
40
+ export {
41
+ TestSectionButtonsStamp
42
+ };
43
+ //# sourceMappingURL=chunk-IWQR5TSB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/qti-test/components/test-section-buttons-stamp.ts"],"sourcesContent":["import { html, LitElement } from 'lit';\nimport { customElement } from 'lit/decorators.js';\nimport { prepareTemplate } from 'stampino';\nimport { consume } from '@lit/context';\n\nimport { computedContext } from '../../exports/computed.context';\n\nimport type { ComputedContext } from '../../exports/computed.context';\nimport type { TemplateFunction } from 'stampino';\n\n/**\n * @deprecated test-section-buttons-stamp is deprecated and will be removed in the future.\n */\n@customElement('test-section-buttons-stamp')\nexport class TestSectionButtonsStamp extends LitElement {\n @consume({ context: computedContext, subscribe: true })\n private computedContext: ComputedContext;\n\n myTemplate: TemplateFunction;\n private _internals: ElementInternals;\n\n protected createRenderRoot(): HTMLElement | DocumentFragment {\n return this;\n }\n\n constructor() {\n super();\n this._internals = this.attachInternals();\n this._internals.ariaLabel = 'pagination';\n }\n\n connectedCallback(): void {\n super.connectedCallback();\n const templateElement = this.querySelector<HTMLTemplateElement>('template');\n this.myTemplate = prepareTemplate(templateElement);\n }\n\n render() {\n if (!this.computedContext) return html``;\n const sections = this.computedContext.testParts.flatMap(testPart => testPart.sections);\n\n return html` ${sections.map(item => this.myTemplate({ item }))} `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'test-section-buttons-stamp': TestSectionButtonsStamp;\n }\n}\n"],"mappings":";;;;;;;;AAAA,SAAS,MAAM,kBAAkB;AACjC,SAAS,qBAAqB;AAC9B,SAAS,uBAAuB;AAChC,SAAS,eAAe;AAWjB,IAAM,0BAAN,cAAsC,WAAW;AAAA,EAO5C,mBAAmD;AAC3D,WAAO;AAAA,EACT;AAAA,EAEA,cAAc;AACZ,UAAM;AACN,SAAK,aAAa,KAAK,gBAAgB;AACvC,SAAK,WAAW,YAAY;AAAA,EAC9B;AAAA,EAEA,oBAA0B;AACxB,UAAM,kBAAkB;AACxB,UAAM,kBAAkB,KAAK,cAAmC,UAAU;AAC1E,SAAK,aAAa,gBAAgB,eAAe;AAAA,EACnD;AAAA,EAEA,SAAS;AACP,QAAI,CAAC,KAAK,gBAAiB,QAAO;AAClC,UAAM,WAAW,KAAK,gBAAgB,UAAU,QAAQ,cAAY,SAAS,QAAQ;AAErF,WAAO,QAAQ,SAAS,IAAI,UAAQ,KAAK,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;AAAA,EAChE;AACF;AA3BU;AAAA,EADP,QAAQ,EAAE,SAAS,iBAAiB,WAAW,KAAK,CAAC;AAAA,GAD3C,wBAEH;AAFG,0BAAN;AAAA,EADN,cAAc,4BAA4B;AAAA,GAC9B;","names":[]}