persian-data-grid 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. package/OFL.txt +93 -0
  2. package/README.md +179 -22
  3. package/dist/ERPTableGroupRow-E5Q6FYDS.js +125 -0
  4. package/dist/ERPTableGroupRow-E5Q6FYDS.js.map +1 -0
  5. package/dist/ERPTableGroupRow-F2IPDYL5.cjs +131 -0
  6. package/dist/ERPTableGroupRow-F2IPDYL5.cjs.map +1 -0
  7. package/dist/GridPlugin-Bewn0X51.d.ts +57 -0
  8. package/dist/GridPlugin-DewWufGZ.d.cts +57 -0
  9. package/dist/GridPresenceService-GEH6535Q.js +3 -0
  10. package/dist/GridPresenceService-GEH6535Q.js.map +1 -0
  11. package/dist/GridPresenceService-RDN5FXHQ.cjs +12 -0
  12. package/dist/GridPresenceService-RDN5FXHQ.cjs.map +1 -0
  13. package/dist/GridSession-CeIfVFck.d.ts +2625 -0
  14. package/dist/GridSession-CmQn2RnL.d.cts +2625 -0
  15. package/dist/GridSyncService-3JQLEY65.cjs +12 -0
  16. package/dist/GridSyncService-3JQLEY65.cjs.map +1 -0
  17. package/dist/GridSyncService-GECXGEKL.js +3 -0
  18. package/dist/GridSyncService-GECXGEKL.js.map +1 -0
  19. package/dist/PdfRenderer-B9FJaCo_.d.cts +22 -0
  20. package/dist/PdfRenderer-bN7ca_Aj.d.ts +22 -0
  21. package/dist/RemoteApi-CCQxiSf1.d.cts +28 -0
  22. package/dist/RemoteApi-CCQxiSf1.d.ts +28 -0
  23. package/dist/SelectImpl-NM4O4IGW.js +447 -0
  24. package/dist/SelectImpl-NM4O4IGW.js.map +1 -0
  25. package/dist/SelectImpl-W2EI4T7O.cjs +453 -0
  26. package/dist/SelectImpl-W2EI4T7O.cjs.map +1 -0
  27. package/dist/UITableController-C71LXBiX.d.ts +678 -0
  28. package/dist/UITableController-CIwnHIw8.d.cts +678 -0
  29. package/dist/VazirmatnPdfRenderer-CpCqA-Wh.d.cts +96 -0
  30. package/dist/VazirmatnPdfRenderer-D46smncn.d.ts +96 -0
  31. package/dist/adapters/arian-erp.cjs +89 -0
  32. package/dist/adapters/arian-erp.cjs.map +1 -0
  33. package/dist/adapters/arian-erp.d.cts +62 -0
  34. package/dist/adapters/arian-erp.d.ts +62 -0
  35. package/dist/adapters/arian-erp.js +79 -0
  36. package/dist/adapters/arian-erp.js.map +1 -0
  37. package/dist/appendAtEnd-RHIQRG2W.cjs +35 -0
  38. package/dist/appendAtEnd-RHIQRG2W.cjs.map +1 -0
  39. package/dist/appendAtEnd-TJEABLGD.js +33 -0
  40. package/dist/appendAtEnd-TJEABLGD.js.map +1 -0
  41. package/dist/applyImportedRows-C2fWYoPy.d.cts +135 -0
  42. package/dist/applyImportedRows-Cqh_N_0k.d.ts +135 -0
  43. package/dist/applyRowVisibilityHandler-Q64ZFC7A.cjs +86 -0
  44. package/dist/applyRowVisibilityHandler-Q64ZFC7A.cjs.map +1 -0
  45. package/dist/applyRowVisibilityHandler-ZLZXQEGY.js +84 -0
  46. package/dist/applyRowVisibilityHandler-ZLZXQEGY.js.map +1 -0
  47. package/dist/broadcastChannelTransport-FHUMV76O.cjs +12 -0
  48. package/dist/broadcastChannelTransport-FHUMV76O.cjs.map +1 -0
  49. package/dist/broadcastChannelTransport-MIH53VNZ.js +3 -0
  50. package/dist/broadcastChannelTransport-MIH53VNZ.js.map +1 -0
  51. package/dist/callbackRemoteApi-BYLjmSI6.d.ts +51 -0
  52. package/dist/callbackRemoteApi-Cv26MmSD.d.cts +51 -0
  53. package/dist/cellRenderContext-BaNh4qn_.d.ts +42 -0
  54. package/dist/cellRenderContext-DvngkptV.d.cts +42 -0
  55. package/dist/chunk-27ALJSZP.js +12187 -0
  56. package/dist/chunk-27ALJSZP.js.map +1 -0
  57. package/dist/chunk-3HP3HQCW.cjs +688 -0
  58. package/dist/chunk-3HP3HQCW.cjs.map +1 -0
  59. package/dist/chunk-3Y3KKGEC.js +3 -0
  60. package/dist/chunk-3Y3KKGEC.js.map +1 -0
  61. package/dist/chunk-52LFOPXD.cjs +588 -0
  62. package/dist/chunk-52LFOPXD.cjs.map +1 -0
  63. package/dist/chunk-5ALMNLUR.cjs +1408 -0
  64. package/dist/chunk-5ALMNLUR.cjs.map +1 -0
  65. package/dist/chunk-5HKVMPBD.js +937 -0
  66. package/dist/chunk-5HKVMPBD.js.map +1 -0
  67. package/dist/chunk-72IVAOTK.cjs +38 -0
  68. package/dist/chunk-72IVAOTK.cjs.map +1 -0
  69. package/dist/chunk-77UXAJII.js +112 -0
  70. package/dist/chunk-77UXAJII.js.map +1 -0
  71. package/dist/chunk-7GWV5HGO.js +36 -0
  72. package/dist/chunk-7GWV5HGO.js.map +1 -0
  73. package/dist/chunk-7T6AWRPU.js +581 -0
  74. package/dist/chunk-7T6AWRPU.js.map +1 -0
  75. package/dist/chunk-AU3RDJYQ.js +243 -0
  76. package/dist/chunk-AU3RDJYQ.js.map +1 -0
  77. package/dist/chunk-CILNIWYW.cjs +100 -0
  78. package/dist/chunk-CILNIWYW.cjs.map +1 -0
  79. package/dist/chunk-CMQ4VLCW.cjs +840 -0
  80. package/dist/chunk-CMQ4VLCW.cjs.map +1 -0
  81. package/dist/chunk-DFFP7SJ6.cjs +257 -0
  82. package/dist/chunk-DFFP7SJ6.cjs.map +1 -0
  83. package/dist/chunk-E2J533UH.cjs +53 -0
  84. package/dist/chunk-E2J533UH.cjs.map +1 -0
  85. package/dist/chunk-EBV6HGZB.cjs +33 -0
  86. package/dist/chunk-EBV6HGZB.cjs.map +1 -0
  87. package/dist/chunk-F4PYOYHR.js +112 -0
  88. package/dist/chunk-F4PYOYHR.js.map +1 -0
  89. package/dist/chunk-F6EMC75A.cjs +34 -0
  90. package/dist/chunk-F6EMC75A.cjs.map +1 -0
  91. package/dist/chunk-GKE33FOJ.js +32 -0
  92. package/dist/chunk-GKE33FOJ.js.map +1 -0
  93. package/dist/chunk-GQEDLUMB.js +168 -0
  94. package/dist/chunk-GQEDLUMB.js.map +1 -0
  95. package/dist/chunk-HLOHWFOA.js +645 -0
  96. package/dist/chunk-HLOHWFOA.js.map +1 -0
  97. package/dist/chunk-IMPCRWYP.cjs +251 -0
  98. package/dist/chunk-IMPCRWYP.cjs.map +1 -0
  99. package/dist/chunk-IPPIXOVQ.js +317 -0
  100. package/dist/chunk-IPPIXOVQ.js.map +1 -0
  101. package/dist/chunk-J4XJ4UBC.js +1404 -0
  102. package/dist/chunk-J4XJ4UBC.js.map +1 -0
  103. package/dist/chunk-J7CPPFXT.cjs +89 -0
  104. package/dist/chunk-J7CPPFXT.cjs.map +1 -0
  105. package/dist/chunk-JOICD47Q.cjs +41 -0
  106. package/dist/chunk-JOICD47Q.cjs.map +1 -0
  107. package/dist/chunk-KCNTKYUY.js +206 -0
  108. package/dist/chunk-KCNTKYUY.js.map +1 -0
  109. package/dist/chunk-KHMG6EI2.js +13 -0
  110. package/dist/chunk-KHMG6EI2.js.map +1 -0
  111. package/dist/chunk-KMRURD5J.cjs +15 -0
  112. package/dist/chunk-KMRURD5J.cjs.map +1 -0
  113. package/dist/chunk-KRJG3KMP.cjs +174 -0
  114. package/dist/chunk-KRJG3KMP.cjs.map +1 -0
  115. package/dist/chunk-LY27YAXE.cjs +208 -0
  116. package/dist/chunk-LY27YAXE.cjs.map +1 -0
  117. package/dist/chunk-MT3KLB2Q.cjs +944 -0
  118. package/dist/chunk-MT3KLB2Q.cjs.map +1 -0
  119. package/dist/chunk-MUQQKPWR.js +84 -0
  120. package/dist/chunk-MUQQKPWR.js.map +1 -0
  121. package/dist/chunk-N7SJTINL.cjs +4 -0
  122. package/dist/chunk-N7SJTINL.cjs.map +1 -0
  123. package/dist/chunk-NB5GCGHL.js +833 -0
  124. package/dist/chunk-NB5GCGHL.js.map +1 -0
  125. package/dist/chunk-NQUVAJQA.js +298 -0
  126. package/dist/chunk-NQUVAJQA.js.map +1 -0
  127. package/dist/chunk-NTV2UUAJ.cjs +149 -0
  128. package/dist/chunk-NTV2UUAJ.cjs.map +1 -0
  129. package/dist/chunk-PJQWHF6T.js +31 -0
  130. package/dist/chunk-PJQWHF6T.js.map +1 -0
  131. package/dist/chunk-PQY54EL5.js +248 -0
  132. package/dist/chunk-PQY54EL5.js.map +1 -0
  133. package/dist/chunk-Q7TBBUTX.cjs +110 -0
  134. package/dist/chunk-Q7TBBUTX.cjs.map +1 -0
  135. package/dist/chunk-QZN7R2WP.cjs +114 -0
  136. package/dist/chunk-QZN7R2WP.cjs.map +1 -0
  137. package/dist/chunk-RKVSJU46.js +35 -0
  138. package/dist/chunk-RKVSJU46.js.map +1 -0
  139. package/dist/chunk-SVO62ZV2.js +50 -0
  140. package/dist/chunk-SVO62ZV2.js.map +1 -0
  141. package/dist/chunk-SX4VQXAA.cjs +114 -0
  142. package/dist/chunk-SX4VQXAA.cjs.map +1 -0
  143. package/dist/chunk-SZ7BLAY3.js +92 -0
  144. package/dist/chunk-SZ7BLAY3.js.map +1 -0
  145. package/dist/chunk-TN4MG6FY.js +112 -0
  146. package/dist/chunk-TN4MG6FY.js.map +1 -0
  147. package/dist/chunk-UC7PHDM6.cjs +331 -0
  148. package/dist/chunk-UC7PHDM6.cjs.map +1 -0
  149. package/dist/chunk-UXVLYUUW.js +108 -0
  150. package/dist/chunk-UXVLYUUW.js.map +1 -0
  151. package/dist/chunk-VBAZ77Q4.js +932 -0
  152. package/dist/chunk-VBAZ77Q4.js.map +1 -0
  153. package/dist/chunk-VSAFQTW5.cjs +319 -0
  154. package/dist/chunk-VSAFQTW5.cjs.map +1 -0
  155. package/dist/chunk-VYJQ2HTA.cjs +936 -0
  156. package/dist/chunk-VYJQ2HTA.cjs.map +1 -0
  157. package/dist/chunk-W5256BJ4.js +56 -0
  158. package/dist/chunk-W5256BJ4.js.map +1 -0
  159. package/dist/chunk-WTHTVKVI.cjs +12299 -0
  160. package/dist/chunk-WTHTVKVI.cjs.map +1 -0
  161. package/dist/chunk-WUMOSOEK.cjs +62 -0
  162. package/dist/chunk-WUMOSOEK.cjs.map +1 -0
  163. package/dist/chunk-XLRE2J25.js +140 -0
  164. package/dist/chunk-XLRE2J25.js.map +1 -0
  165. package/dist/chunk-Z4QPZ3Z3.cjs +114 -0
  166. package/dist/chunk-Z4QPZ3Z3.cjs.map +1 -0
  167. package/dist/createEngineGridQuery-BBkud5oE.d.ts +939 -0
  168. package/dist/createEngineGridQuery-D-fgO_jg.d.cts +939 -0
  169. package/dist/date-picker-jalali.cjs +263 -0
  170. package/dist/date-picker-jalali.cjs.map +1 -0
  171. package/dist/date-picker-jalali.d.cts +62 -0
  172. package/dist/date-picker-jalali.d.ts +62 -0
  173. package/dist/date-picker-jalali.js +256 -0
  174. package/dist/date-picker-jalali.js.map +1 -0
  175. package/dist/finance.cjs +205 -0
  176. package/dist/finance.cjs.map +1 -0
  177. package/dist/finance.d.cts +90 -0
  178. package/dist/finance.d.ts +90 -0
  179. package/dist/finance.js +157 -0
  180. package/dist/finance.js.map +1 -0
  181. package/dist/foldedColumn-IHDT4ARZ.cjs +66 -0
  182. package/dist/foldedColumn-IHDT4ARZ.cjs.map +1 -0
  183. package/dist/foldedColumn-TFURUKFG.js +64 -0
  184. package/dist/foldedColumn-TFURUKFG.js.map +1 -0
  185. package/dist/headless.cjs +729 -0
  186. package/dist/headless.cjs.map +1 -0
  187. package/dist/headless.d.cts +508 -0
  188. package/dist/headless.d.ts +508 -0
  189. package/dist/headless.js +226 -0
  190. package/dist/headless.js.map +1 -0
  191. package/dist/index-DN8M8Jkq.d.cts +14 -0
  192. package/dist/index-DmzL-F_o.d.ts +14 -0
  193. package/dist/index.cjs +8060 -11409
  194. package/dist/index.cjs.map +1 -1
  195. package/dist/index.d.cts +457 -2305
  196. package/dist/index.d.ts +457 -2305
  197. package/dist/index.js +7302 -11084
  198. package/dist/index.js.map +1 -1
  199. package/dist/locales/ar.cjs +12 -0
  200. package/dist/locales/ar.cjs.map +1 -0
  201. package/dist/locales/ar.d.cts +6 -0
  202. package/dist/locales/ar.d.ts +6 -0
  203. package/dist/locales/ar.js +3 -0
  204. package/dist/locales/ar.js.map +1 -0
  205. package/dist/locales/en.cjs +12 -0
  206. package/dist/locales/en.cjs.map +1 -0
  207. package/dist/locales/en.d.cts +6 -0
  208. package/dist/locales/en.d.ts +6 -0
  209. package/dist/locales/en.js +3 -0
  210. package/dist/locales/en.js.map +1 -0
  211. package/dist/locales/fa.cjs +12 -0
  212. package/dist/locales/fa.cjs.map +1 -0
  213. package/dist/locales/fa.d.cts +6 -0
  214. package/dist/locales/fa.d.ts +6 -0
  215. package/dist/locales/fa.js +3 -0
  216. package/dist/locales/fa.js.map +1 -0
  217. package/dist/locales/index.cjs +51 -0
  218. package/dist/locales/index.cjs.map +1 -0
  219. package/dist/locales/index.d.cts +5 -0
  220. package/dist/locales/index.d.ts +5 -0
  221. package/dist/locales/index.js +6 -0
  222. package/dist/locales/index.js.map +1 -0
  223. package/dist/memoryRecords-AWDKUJ2F.cjs +50 -0
  224. package/dist/memoryRecords-AWDKUJ2F.cjs.map +1 -0
  225. package/dist/memoryRecords-OJTGXLRH.js +47 -0
  226. package/dist/memoryRecords-OJTGXLRH.js.map +1 -0
  227. package/dist/pagedFooterTotals-DXCGDO6F.cjs +27 -0
  228. package/dist/pagedFooterTotals-DXCGDO6F.cjs.map +1 -0
  229. package/dist/pagedFooterTotals-ORWKUNE7.js +25 -0
  230. package/dist/pagedFooterTotals-ORWKUNE7.js.map +1 -0
  231. package/dist/pagedKit-MFGAJFSK.cjs +134 -0
  232. package/dist/pagedKit-MFGAJFSK.cjs.map +1 -0
  233. package/dist/pagedKit-WYWY4LRV.js +127 -0
  234. package/dist/pagedKit-WYWY4LRV.js.map +1 -0
  235. package/dist/pagedSearch-HCPJW7VM.js +38 -0
  236. package/dist/pagedSearch-HCPJW7VM.js.map +1 -0
  237. package/dist/pagedSearch-U3WCG4GN.cjs +42 -0
  238. package/dist/pagedSearch-U3WCG4GN.cjs.map +1 -0
  239. package/dist/plugins/csv.cjs +124 -0
  240. package/dist/plugins/csv.cjs.map +1 -0
  241. package/dist/plugins/csv.d.cts +44 -0
  242. package/dist/plugins/csv.d.ts +44 -0
  243. package/dist/plugins/csv.js +120 -0
  244. package/dist/plugins/csv.js.map +1 -0
  245. package/dist/plugins/excel.cjs +52 -0
  246. package/dist/plugins/excel.cjs.map +1 -0
  247. package/dist/plugins/excel.d.cts +14 -0
  248. package/dist/plugins/excel.d.ts +14 -0
  249. package/dist/plugins/excel.js +7 -0
  250. package/dist/plugins/excel.js.map +1 -0
  251. package/dist/plugins/pdf/fonts/vazirmatn.cjs +50 -0
  252. package/dist/plugins/pdf/fonts/vazirmatn.cjs.map +1 -0
  253. package/dist/plugins/pdf/fonts/vazirmatn.d.cts +24 -0
  254. package/dist/plugins/pdf/fonts/vazirmatn.d.ts +24 -0
  255. package/dist/plugins/pdf/fonts/vazirmatn.js +39 -0
  256. package/dist/plugins/pdf/fonts/vazirmatn.js.map +1 -0
  257. package/dist/plugins/pdf.cjs +24 -0
  258. package/dist/plugins/pdf.cjs.map +1 -0
  259. package/dist/plugins/pdf.d.cts +21 -0
  260. package/dist/plugins/pdf.d.ts +21 -0
  261. package/dist/plugins/pdf.js +7 -0
  262. package/dist/plugins/pdf.js.map +1 -0
  263. package/dist/presence.cjs +56 -0
  264. package/dist/presence.cjs.map +1 -0
  265. package/dist/presence.d.cts +17 -0
  266. package/dist/presence.d.ts +17 -0
  267. package/dist/presence.js +54 -0
  268. package/dist/presence.js.map +1 -0
  269. package/dist/rebuildRowVisibility-66EAZ356.cjs +21 -0
  270. package/dist/rebuildRowVisibility-66EAZ356.cjs.map +1 -0
  271. package/dist/rebuildRowVisibility-6TYM5BP2.js +19 -0
  272. package/dist/rebuildRowVisibility-6TYM5BP2.js.map +1 -0
  273. package/dist/styles.css +1440 -0
  274. package/dist/sync.cjs +148 -0
  275. package/dist/sync.cjs.map +1 -0
  276. package/dist/sync.d.cts +17 -0
  277. package/dist/sync.d.ts +17 -0
  278. package/dist/sync.js +146 -0
  279. package/dist/sync.js.map +1 -0
  280. package/dist/types-D__47BKv.d.cts +23 -0
  281. package/dist/types-D__47BKv.d.ts +23 -0
  282. package/package.json +185 -29
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../infrastructure/Repositories/paged/PagedIndexedDbTableRepository.ts","../infrastructure/Repositories/paged/PagedLocalTableRepository.ts","../infrastructure/Repositories/paged/PagedCachedTableRepository.ts"],"names":["Cell","RowId","ColumnId","CellValue","Row","RowState","Collection","Table","Pagination","req"],"mappings":";;;;;;AAyGA,IAAM,OAAA,GAAU,cAAA;AAOhB,SAAS,WAAA,CAAY,OAAA,EAAiB,UAAA,EAAoB,KAAA,EAAuB;AAC/E,EAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,UAAU,KAAK,KAAK,CAAA,CAAA;AAC5C;AAEA,SAAS,YAAY,GAAA,EAAkB;AACrC,EAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,OAAO,GAAG,QAAA,EAAS;AAC3C,EAAA,MAAM,CAAA,GAAI,OAAO,GAAG,CAAA;AACpB,EAAA,OAAO,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA;AAClC;AAGA,SAAS,cAAc,KAAA,EAAsC;AAC3D,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,IAAA;AACtC,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,MAAA,CAAO,SAAS,KAAK,CAAA;AAC3D,EAAA,IAAI,KAAA,YAAiB,MAAM,OAAO,CAAC,OAAO,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA;AAC/D,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,MAAM,MAAA,GAAS,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,aAAa,CAAA;AAC9E,EAAA,IAAI,KAAA,YAAiB,aAAa,OAAO,IAAA;AACzC,EAAA,IAAI,WAAA,CAAY,MAAA,CAAO,KAAK,CAAA,EAAG,OAAO,IAAA;AACtC,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,aAAa,OAAA,EAAiC;AACrD,EAAA,IAAI,OAAO,OAAA,KAAY,QAAA,IAAY,OAAA,CAAQ,MAAA,GAAS,GAAG,OAAO,OAAA;AAC9D,EAAA,IAAI,OAAO,YAAY,QAAA,IAAY,MAAA,CAAO,SAAS,OAAO,CAAA,EAAG,OAAO,MAAA,CAAO,OAAO,CAAA;AAClF,EAAA,OAAO,IAAA;AACT;AAEO,IAAM,gCAAN,MAAuE;AAAA,EAG5E,WAAA,GAAc;AACZ,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,MAAA,EAAO;AAAA,EAC/B;AAAA,EAEQ,OAAO,EAAA,EAA8B;AAC3C,IAAA,EAAA,CAAG,kBAAkB,MAAM;AACzB,MAAA,EAAA,CAAG,KAAA,EAAM;AACT,MAAA,OAAA,CAAQ,KAAK,uCAAuC,CAAA;AAEpD,MAAA,IAAA,CAAK,SAAA,GAAY,KAAK,MAAA,EAAO;AAAA,IAC/B,CAAA;AACA,IAAA,OAAO,EAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,MAAA,GAA+B;AACrC,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,MAAM,OAAA,GAAU,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA;AACtC,MAAA,OAAA,CAAQ,YAAY,MAAM,OAAA,CAAQ,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAC,CAAA;AAC7D,MAAA,OAAA,CAAQ,OAAA,GAAU,MAAM,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AAAA,IAC9C,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,KAAA,GAA8B;AAC1C,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA,EAEQ,UAAU,SAAA,EAA2B;AAC3C,IAAA,OAAO,SAAA;AAAA,EACT;AAAA,EAEQ,UAAU,SAAA,EAA2B;AAC3C,IAAA,OAAO,GAAG,SAAS,CAAA,MAAA,CAAA;AAAA,EACrB;AAAA,EAEA,MAAc,YAAA,CAAa,EAAA,EAAiB,SAAA,EAAyC;AACnF,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AACrC,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AACrC,IAAA,IAAI,EAAA,CAAG,iBAAiB,QAAA,CAAS,IAAI,KAAK,EAAA,CAAG,gBAAA,CAAiB,QAAA,CAAS,IAAI,CAAA,EAAG;AAC5E,MAAA,OAAO,EAAA;AAAA,IACT;AAEA,IAAA,MAAM,WAAA,GAAc,GAAG,OAAA,GAAU,CAAA;AACjC,IAAA,EAAA,CAAG,KAAA,EAAM;AACT,IAAA,MAAM,QAAQ,MAAM,IAAI,OAAA,CAAqB,CAAC,SAAS,MAAA,KAAW;AAChE,MAAA,MAAM,GAAA,GAAM,SAAA,CAAU,IAAA,CAAK,OAAA,EAAS,WAAW,CAAA;AAC/C,MAAA,GAAA,CAAI,eAAA,GAAkB,CAAC,KAAA,KAAiC;AACtD,QAAA,MAAM,QAAA,GAAY,MAAM,MAAA,CAA4B,MAAA;AACpD,QAAA,IAAI,CAAC,QAAA,CAAS,gBAAA,CAAiB,QAAA,CAAS,IAAI,CAAA,EAAG;AAC7C,UAAA,QAAA,CAAS,iBAAA,CAAkB,IAAA,EAAM,EAAE,OAAA,EAAS,MAAM,CAAA;AAAA,QACpD;AACA,QAAA,IAAI,CAAC,QAAA,CAAS,gBAAA,CAAiB,QAAA,CAAS,IAAI,CAAA,EAAG;AAC7C,UAAA,MAAM,WAAW,QAAA,CAAS,iBAAA,CAAkB,MAAM,EAAE,OAAA,EAAS,MAAM,CAAA;AACnE,UAAA,QAAA,CAAS,YAAY,uBAAA,EAAyB,CAAC,SAAA,EAAW,YAAA,EAAc,WAAW,CAAA,EAAG;AAAA,YACpF,MAAA,EAAQ;AAAA,WACT,CAAA;AACD,UAAA,QAAA,CAAS,YAAY,SAAA,EAAW,SAAA,EAAW,EAAE,MAAA,EAAQ,OAAO,CAAA;AAAA,QAC9D;AAAA,MACF,CAAA;AACA,MAAA,GAAA,CAAI,YAAY,MAAM,OAAA,CAAQ,KAAK,MAAA,CAAO,GAAA,CAAI,MAAM,CAAC,CAAA;AACrD,MAAA,GAAA,CAAI,OAAA,GAAU,MAAM,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAAA,IACtC,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,SAAA,GAAY,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA;AACtC,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAIQ,YAAA,CAAa,SAAiB,GAAA,EAA+B;AACnE,IAAA,OAAO;AAAA,MACL,IAAI,WAAA,CAAY,OAAA,EAAS,IAAI,UAAA,EAAY,GAAA,CAAI,GAAG,KAAK,CAAA;AAAA,MACrD,OAAA;AAAA,MACA,KAAA,EAAO,IAAI,EAAA,CAAG,KAAA;AAAA,MACd,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,SAAA,EAAW,YAAY,GAAG,CAAA;AAAA,MAC1B,QAAA,EAAU,IAAI,QAAA,CAAS,KAAA;AAAA,MACvB,qBAAqB,GAAA,CAAI,mBAAA;AAAA,MACzB,mBAAmB,GAAA,CAAI,iBAAA;AAAA,MACvB,KAAA,EAAO,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,UAAS,CAAE,OAAA,EAAS,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,KAAA,EAAO,IAAI,CAAA,MAAO;AAAA,QAClE,KAAA;AAAA,QACA,KAAA,EAAO,KAAK,QAAA,EAAS;AAAA,QACrB,aAAA,EAAe,IAAA,CAAK,gBAAA,EAAiB,CAAE,KAAA;AAAA,QACvC,OAAA,EAAS,KAAK,UAAA;AAAW,OAC3B,CAAE;AAAA,KACJ;AAAA,EACF;AAAA,EAEQ,eAAe,CAAA,EAA6B;AAClD,IAAA,MAAM,KAAA,uBAAY,GAAA,EAAkB;AACpC,IAAA,CAAA,CAAE,KAAA,CAAM,QAAQ,CAAA,CAAA,KAAK;AACnB,MAAA,KAAA,CAAM,GAAA;AAAA,QACJ,CAAA,CAAE,KAAA;AAAA,QACF,IAAIA,sBAAA;AAAA,UACF,IAAIC,uBAAA,CAAM,CAAA,CAAE,KAAK,CAAA;AAAA,UACjB,IAAIC,0BAAA,CAAS,CAAA,CAAE,KAAK,CAAA;AAAA,UACpB,IAAIC,2BAAA,CAAU,CAAA,CAAE,KAAK,CAAA;AAAA,UACrB,IAAIA,2BAAA,CAAU,CAAA,CAAE,aAAa,CAAA;AAAA,UAC7B,IAAIA,2BAAA,CAAU,CAAA,CAAE,OAAO;AAAA;AACzB,OACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAM,YAAA,uBAAmB,GAAA,EAAY;AACrC,IAAA,IAAI,EAAE,QAAA,KAAA,QAAA,iBAAoC;AACxC,MAAA,CAAA,CAAE,KAAA,CAAM,QAAQ,CAAA,CAAA,KAAK;AACnB,QAAA,IAAI,EAAE,KAAA,KAAU,CAAA,CAAE,eAAe,YAAA,CAAa,GAAA,CAAI,EAAE,KAAK,CAAA;AAAA,MAC3D,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,IAAIC,qBAAA;AAAA,MACT,IAAIH,uBAAA,CAAM,CAAA,CAAE,KAAK,CAAA;AAAA,MACjB,KAAA;AAAA,MACA,IAAII,0BAAA,CAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,MACvB,YAAA;AAAA,MACA,CAAA,CAAE,mBAAA;AAAA,MACF,CAAA,CAAE,UAAA;AAAA,MACF,CAAA,CAAE;AAAA,KACJ;AAAA,EACF;AAAA,EAEQ,gBAAgB,GAAA,EAA0C;AAChE,IAAA,OAAO;AAAA,MACL,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,cAAc,GAAA,CAAI,YAAA;AAAA,MAClB,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,iBAAiB,GAAA,CAAI,eAAA;AAAA,MACrB,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,oBAAoB,GAAA,CAAI,kBAAA;AAAA,MACxB,oBAAoB,GAAA,CAAI,kBAAA;AAAA,MACxB,kBAAkB,GAAA,CAAI,gBAAA;AAAA,MACtB,qBAAqB,GAAA,CAAI,mBAAA;AAAA,MACzB,SAAS,GAAA,CAAI,OAAA;AAAA,MACb,QAAQ,GAAA,CAAI,MAAA;AAAA,MACZ,WAAW,GAAA,CAAI,SAAA;AAAA,MACf,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,eAAe,GAAA,CAAI,aAAA;AAAA,MACnB,UAAU,GAAA,CAAI,QAAA;AAAA,MACd,OAAO,GAAA,CAAI,KAAA;AAAA,MACX,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,YAAY,GAAA,CAAI;AAAA,KAClB;AAAA,EACF;AAAA,EAEQ,kBAAA,CACN,KAAA,EACA,iBAAA,EACA,QAAA,EACqB;AACrB,IAAA,MAAM,EAAA,GAAK,YAAA,CAAa,KAAA,CAAM,EAAE,CAAA;AAChC,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uEAAA,EAA0E,OAAO,KAAA,CAAM,EAAE,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IAC/G;AAEA,IAAA,MAAM,UAAA,GAAa,MAAM,aAAA,EAAc;AACvC,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,uBAAA,EAAwB,IAAK,SAAA;AAClD,IAAA,MAAM,cAA0C,EAAC;AACjD,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,GAAG,CAAA,IAAK,KAAA,CAAM,gBAAe,EAAG;AAChD,MAAA,WAAA,CAAY,IAAA,CAAK;AAAA,QACf,IAAA;AAAA,QACA,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,YAAW,CAAE,MAAA,EAAQ,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,IAAA,CAAK,eAAA,CAAgB,CAAC,CAAC;AAAA,OAChF,CAAA;AAAA,IACH;AAMA,IAAA,MAAM,eAAuC,EAAC;AAC9C,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAI,wBAAA,GAA2B,KAAA;AAC/B,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,GAAG,CAAA,IAAK,KAAA,CAAM,gBAAe,EAAG;AAChD,MAAA,MAAM,IAAA,GAAO,GAAA,CAAI,OAAA,EAAQ,CAAE,IAAA;AAC3B,MAAA,IAAI,IAAA,KAAS,MAAA,EAAQ,YAAA,CAAa,IAAI,CAAA,GAAI,IAAA;AAAA,WAAA,IACjC,IAAA,GAAO,GAAG,wBAAA,GAA2B,IAAA;AAC9C,MAAA,OAAA,IAAW,IAAA;AAAA,IACb;AAOA,IAAA,MAAM,yBAAA,GAA4B,wBAAA;AAClC,IAAA,MAAM,SAAA,GAAY,yBAAA,GACb,YAAA,CAAa,MAAM,CAAA,IAAK,CAAA,GACzB,iBAAA,IAAqB,IAAA,CAAK,GAAA,CAAI,UAAA,CAAW,SAAA,EAAW,OAAO,CAAA;AAE/D,IAAA,MAAM,qBAAA,GAAgD;AAAA,MACpD,GAAI,QAAA,EAAU,qBAAA,IAAyB,EAAC;AAAA,MACxC,GAAG,YAAA;AAAA,MACH,CAAC,MAAM,GAAG;AAAA,KACZ;AAEA,IAAA,IAAI,yBAAA,EAA2B;AAG7B,MAAA,KAAA,MAAW,CAAC,IAAA,EAAM,GAAG,CAAA,IAAK,KAAA,CAAM,gBAAe,EAAG;AAChD,QAAA,qBAAA,CAAsB,IAAI,CAAA,GAAI,GAAA,CAAI,OAAA,EAAQ,CAAE,IAAA;AAAA,MAC9C;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,EAAA;AAAA,MACA,IAAA,EAAM,MAAA;AAAA,MACN,gBAAA,EAAkB,MAAA;AAAA,MAClB,IAAA,EAAM,WAAW,IAAA,IAAQ,CAAA;AAAA,MACzB,QAAA,EAAU,WAAW,QAAA,IAAY,EAAA;AAAA,MACjC,SAAA;AAAA,MACA,qBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,kBAAA,CACN,IAAA,EACA,QAAA,EACA,IAAA,EACA,QAAA,EACO;AACP,IAAA,MAAM,aAAA,uBAAoB,GAAA,EAAwB;AAClD,IAAA,MAAM,MAAA,GAAS,KAAK,gBAAA,IAAoB,SAAA;AAExC,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,WAAA,IAAe,EAAC,EAAG;AAC5C,MAAA,MAAM,MAAA,uBAAa,GAAA,EAA0B;AAC7C,MAAA,KAAA,MAAW,CAAA,IAAK,OAAA,CAAQ,OAAA,IAAW,EAAC,EAAG;AAErC,QAAA,MAAA,CAAO,GAAA,CAAI,CAAA,CAAE,SAAA,EAAW,CAAiB,CAAA;AAAA,MAC3C;AACA,MAAA,aAAA,CAAc,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,IAAIC,4BAAA,CAAW,OAAA,CAAQ,IAAA,kBAAM,IAAI,GAAA,EAAI,EAAG,MAAM,CAAC,CAAA;AAAA,IACjF;AAEA,IAAA,IAAI,CAAC,aAAA,CAAc,GAAA,CAAI,MAAM,CAAA,EAAG;AAC9B,MAAA,aAAA,CAAc,GAAA,CAAI,MAAA,EAAQ,IAAIA,4BAAA,CAAW,MAAA,kBAAQ,IAAI,GAAA,EAAI,kBAAG,IAAI,GAAA,EAAK,CAAC,CAAA;AAAA,IACxE;AAEA,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,MAAA,MAAM,IAAA,GAAO,IAAI,UAAA,IAAc,MAAA;AAC/B,MAAA,IAAI,UAAA,GAAa,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AACvC,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,UAAA,GAAa,IAAIA,6BAAW,IAAA,kBAAM,IAAI,KAAI,kBAAG,IAAI,KAAK,CAAA;AACtD,QAAA,aAAA,CAAc,GAAA,CAAI,MAAM,UAAU,CAAA;AAAA,MACpC;AACA,MAAA,UAAA,CAAW,SAAQ,CAAE,GAAA,CAAI,GAAA,CAAI,EAAA,CAAG,OAAO,GAAG,CAAA;AAAA,IAC5C;AAMA,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,qBAAA,GAAwB,MAAM,KAAK,IAAA,CAAK,SAAA;AAC3D,IAAA,OAAO,IAAIC,uBAAA;AAAA,MACT,IAAA,CAAK,EAAA;AAAA,MACL,aAAA;AAAA,MACA,IAAIC,4BAAA,CAAW,IAAA,EAAM,QAAA,EAAU,KAAK,CAAA;AAAA,MACpC,IAAA;AAAA,MACA;AAAA,KACF,CAAE,cAAc,IAAI,CAAA;AAAA,EACtB;AAAA,EAEA,MAAc,QAAA,CACZ,EAAA,EACA,SAAA,EACA,OAAA,EAC6D;AAC7D,IAAA,MAAM,GAAA,GAAM,aAAa,OAAO,CAAA;AAChC,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AACzC,IAAA,IAAI,CAAC,EAAA,CAAG,gBAAA,CAAiB,QAAA,CAAS,QAAQ,GAAG,OAAO,IAAA;AAEpD,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,WAAA,CAAY,QAAA,EAAU,UAAU,CAAA;AAC9C,MAAA,MAAM,MAAM,EAAA,CAAG,WAAA,CAAY,QAAQ,CAAA,CAAE,IAAI,GAAG,CAAA;AAC5C,MAAA,GAAA,CAAI,SAAA,GAAY,MAAM,OAAA,CAAS,GAAA,CAAI,UAA0D,IAAI,CAAA;AACjG,MAAA,GAAA,CAAI,OAAA,GAAU,MAAM,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAAA,IACtC,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,SAAS,IAAA,EAAkF;AACjG,IAAA,OAAO,EAAE,MAAA,IAAU,IAAA,CAAA,IAAU,IAAA,CAA6B,IAAA,KAAS,MAAA;AAAA,EACrE;AAAA,EAEA,MAAc,aAAA,CACZ,EAAA,EACA,SAAA,EACA,MAAA,EAC8B;AAC9B,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,gBAAA,IAAoB,MAAA,CAAO,gBAAA,IAAoB,SAAA;AACrE,IAAA,MAAM,UAAiB,EAAC;AACxB,IAAA,MAAM,cAA0C,EAAC;AAEjD,IAAA,KAAA,MAAW,CAAA,IAAK,MAAA,CAAO,WAAA,IAAe,EAAC,EAAG;AACxC,MAAA,MAAM,IAAA,GAAO,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,IAAA,IAAQ,MAAA;AACjC,MAAA,WAAA,CAAY,KAAK,EAAE,IAAA,EAAM,OAAA,EAAS,IAAI,CAAA;AACtC,MAAA,KAAA,MAAW,CAAA,IAAK,CAAA,CAAE,IAAA,IAAQ,EAAC,EAAG;AAC5B,QAAA,OAAA,CAAQ,IAAA;AAAA,UACN,KAAK,cAAA,CAAe;AAAA,YAClB,EAAA,EAAI,WAAA,CAAY,MAAA,CAAO,EAAA,EAAI,CAAA,CAAE,cAAc,CAAA,CAAE,OAAA,IAAW,IAAA,EAAM,CAAA,CAAE,KAAK,CAAA;AAAA,YACrE,SAAS,MAAA,CAAO,EAAA;AAAA,YAChB,OAAO,CAAA,CAAE,KAAA;AAAA,YACT,UAAA,EAAY,CAAA,CAAE,UAAA,IAAc,CAAA,CAAE,OAAA,IAAW,IAAA;AAAA,YACzC,SAAA,EAAW,CAAA;AAAA,YACX,UAAU,CAAA,CAAE,QAAA;AAAA,YACZ,qBAAqB,CAAA,CAAE,mBAAA;AAAA,YACvB,mBAAmB,CAAA,CAAE,iBAAA;AAAA,YACrB,OAAO,CAAA,CAAE;AAAA,WACV;AAAA,SACH;AAAA,MACF;AAAA,IACF;AAGA,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AAAA,IAE3B;AAEA,IAAA,MAAM,IAAA,GAA4B;AAAA,MAChC,IAAI,MAAA,CAAO,EAAA;AAAA,MACX,IAAA,EAAM,MAAA;AAAA,MACN,gBAAA,EAAkB,MAAA;AAAA,MAClB,IAAA,EAAM,CAAA;AAAA,MACN,QAAA,EAAU,EAAA;AAAA,MACV,WAAW,OAAA,CAAQ,MAAA;AAAA,MACnB;AAAA,KACF;AAEA,IAAA,EAAA,GAAK,MAAM,IAAA,CAAK,YAAA,CAAa,EAAA,EAAI,SAAS,CAAA;AAC1C,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,EAAA,EAAI,SAAA,EAAW,IAAI,CAAA;AACtC,IAAA,MAAM,KAAK,OAAA,CAAQ,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,IAAI,OAAO,CAAA;AACpD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,OAAA,CAAQ,EAAA,EAAiB,SAAA,EAAmB,IAAA,EAA0C;AAC5F,IAAA,MAAM,EAAA,GAAK,YAAA,CAAa,IAAA,CAAK,EAAE,CAAA;AAC/B,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,OAAA,CAAQ,IAAA,CAAK,6DAAA,EAA+D,IAAA,EAAM,EAAE,CAAA;AACpF,MAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,IACzB;AAGA,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI;AACF,MAAA,SAAA,GAAY,IAAA,CAAK,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,GAAG,IAAA,EAAM,EAAA,EAAI,CAAC,CAAA;AAAA,IACxD,SAAS,CAAA,EAAG;AACV,MAAA,OAAA,CAAQ,IAAA,CAAK,qEAAqE,CAAC,CAAA;AACnF,MAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,IACzB;AACA,IAAA,SAAA,CAAU,EAAA,GAAK,EAAA;AAEf,IAAA,IAAI,CAAC,aAAA,CAAc,SAAA,CAAU,EAAE,CAAA,EAAG;AAChC,MAAA,OAAA,CAAQ,IAAA,CAAK,yEAAA,EAA2E,SAAA,CAAU,EAAE,CAAA;AACpG,MAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,IACzB;AAEA,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,MAAM,KAAK,EAAA,CAAG,WAAA,CAAY,KAAK,SAAA,CAAU,SAAS,GAAG,WAAW,CAAA;AAChE,MAAA,EAAA,CAAG,YAAY,IAAA,CAAK,SAAA,CAAU,SAAS,CAAC,CAAA,CAAE,IAAI,SAAS,CAAA;AACvD,MAAA,EAAA,CAAG,UAAA,GAAa,MAAM,OAAA,EAAQ;AAC9B,MAAA,EAAA,CAAG,OAAA,GAAU,MAAM,MAAA,CAAO,EAAA,CAAG,KAAK,CAAA;AAAA,IACpC,CAAC,CAAA;AAAA,EACH;AAAA,EAEQ,OAAA,CACN,EAAA,EACA,SAAA,EACA,OAAA,EACA,IAAA,EACe;AACf,IAAA,MAAM,GAAA,GAAM,aAAa,OAAO,CAAA;AAChC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAA,CAAQ,IAAA,CAAK,oEAAoE,OAAO,CAAA;AACxF,MAAA,OAAO,QAAQ,OAAA,EAAQ;AAAA,IACzB;AAEA,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,MAAM,KAAK,EAAA,CAAG,WAAA,CAAY,KAAK,SAAA,CAAU,SAAS,GAAG,WAAW,CAAA;AAChE,MAAA,MAAM,KAAK,EAAA,CAAG,WAAA,CAAY,IAAA,CAAK,SAAA,CAAU,SAAS,CAAC,CAAA;AACnD,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,GAAA,EAAK,GAAG,CAAA;AACzC,QAAA,IAAI,CAAC,aAAA,CAAc,MAAA,CAAO,EAAE,CAAA,EAAG;AAE/B,QAAA,MAAM,YAAY,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAC,CAAA;AACnD,QAAA,SAAA,CAAU,KAAK,MAAA,CAAO,EAAA;AACtB,QAAA,SAAA,CAAU,OAAA,GAAU,GAAA;AACpB,QAAA,EAAA,CAAG,IAAI,SAAS,CAAA;AAAA,MAClB;AACA,MAAA,EAAA,CAAG,UAAA,GAAa,MAAM,OAAA,EAAQ;AAC9B,MAAA,EAAA,CAAG,OAAA,GAAU,MAAM,MAAA,CAAO,EAAA,CAAG,KAAK,CAAA;AAAA,IACpC,CAAC,CAAA;AAAA,EACH;AAAA;AAAA,EAGQ,aAAA,CACN,EAAA,EACA,SAAA,EACA,OAAA,EACe;AACf,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,QAAQ,OAAA,EAAQ;AACjD,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,MAAM,KAAK,EAAA,CAAG,WAAA,CAAY,KAAK,SAAA,CAAU,SAAS,GAAG,WAAW,CAAA;AAChE,MAAA,MAAM,KAAK,EAAA,CAAG,WAAA,CAAY,IAAA,CAAK,SAAA,CAAU,SAAS,CAAC,CAAA;AACnD,MAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,QAAA,IAAI,CAAC,aAAA,CAAc,MAAA,CAAO,EAAE,CAAA,EAAG;AAC/B,QAAA,EAAA,CAAG,IAAI,IAAA,CAAK,KAAA,CAAM,KAAK,SAAA,CAAU,MAAM,CAAC,CAAwB,CAAA;AAAA,MAClE;AACA,MAAA,EAAA,CAAG,UAAA,GAAa,MAAM,OAAA,EAAQ;AAC9B,MAAA,EAAA,CAAG,OAAA,GAAU,MAAM,MAAA,CAAO,EAAA,CAAG,KAAK,CAAA;AAAA,IACpC,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,qBAAA,CACZ,EAAA,EACA,SAAA,EACA,OAAA,EACe;AACf,IAAA,MAAM,GAAA,GAAM,aAAa,OAAO,CAAA;AAChC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAA,CAAQ,IAAA,CAAK,0EAA0E,OAAO,CAAA;AAC9F,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AACzC,IAAA,IAAI,CAAC,EAAA,CAAG,gBAAA,CAAiB,QAAA,CAAS,QAAQ,CAAA,EAAG;AAE7C,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,WAAA,CAAY,QAAA,EAAU,WAAW,CAAA;AAC/C,MAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,WAAA,CAAY,QAAQ,CAAA;AAGrC,MAAA,MAAM,cAAc,MAAM;AACxB,QAAA,MAAM,GAAA,GAAM,MAAM,UAAA,EAAW;AAC7B,QAAA,GAAA,CAAI,YAAY,MAAM;AACpB,UAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,UAAA,IAAI,CAAC,MAAA,EAAQ;AACb,UAAA,MAAM,MAAM,MAAA,CAAO,KAAA;AACnB,UAAA,IAAI,OAAO,GAAA,CAAI,OAAO,CAAA,KAAM,GAAA,SAAY,MAAA,EAAO;AAC/C,UAAA,MAAA,CAAO,QAAA,EAAS;AAAA,QAClB,CAAA;AAAA,MACF,CAAA;AAEA,MAAA,IAAI;AACF,QAAA,IAAI,MAAM,UAAA,CAAW,QAAA,CAAS,SAAS,CAAA,IAAK,aAAA,CAAc,GAAG,CAAA,EAAG;AAC9D,UAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA;AACnC,UAAA,MAAM,MAAM,KAAA,CAAM,UAAA,CAAW,WAAA,CAAY,IAAA,CAAK,GAAG,CAAC,CAAA;AAClD,UAAA,GAAA,CAAI,YAAY,MAAM;AACpB,YAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,YAAA,IAAI,CAAC,MAAA,EAAQ;AACb,YAAA,MAAA,CAAO,MAAA,EAAO;AACd,YAAA,MAAA,CAAO,QAAA,EAAS;AAAA,UAClB,CAAA;AACA,UAAA,GAAA,CAAI,UAAU,MAAM;AAClB,YAAA,WAAA,EAAY;AAAA,UACd,CAAA;AAAA,QACF,CAAA,MAAO;AACL,UAAA,WAAA,EAAY;AAAA,QACd;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAA,WAAA,EAAY;AAAA,MACd;AAEA,MAAA,EAAA,CAAG,UAAA,GAAa,MAAM,OAAA,EAAQ;AAC9B,MAAA,EAAA,CAAG,OAAA,GAAU,MAAM,MAAA,CAAO,EAAA,CAAG,KAAK,CAAA;AAAA,IACpC,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAc,YACZ,EAAA,EACA,SAAA,EACA,SACA,UAAA,EACA,OAAA,EAIA,YAAY,GAAA,EACG;AACf,IAAA,MAAM,GAAA,GAAM,aAAa,OAAO,CAAA;AAChC,IAAA,IAAI,CAAC,GAAA,EAAK;AAEV,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AACzC,IAAA,IAAI,CAAC,EAAA,CAAG,gBAAA,CAAiB,QAAA,CAAS,QAAQ,CAAA,EAAG;AAI7C,IAAA,MAAM,WAAW,UAAA,KAAe,IAAA;AAChC,IAAA,IAAI,UAAiC,EAAC;AACtC,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAI,OAAA,GAAU,KAAA;AAEd,IAAA,MAAM,QAAQ,YAAY;AACxB,MAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,IAAK,OAAA,EAAS;AACrC,MAAA,MAAM,KAAA,GAAQ,OAAA;AACd,MAAA,OAAA,GAAU,EAAC;AACX,MAAA,MAAM,IAAA,GAAO,OAAA;AACb,MAAA,OAAA,IAAW,KAAA,CAAM,MAAA;AACjB,MAAA,IAAK,MAAM,OAAA,CAAQ,KAAA,EAAO,IAAI,CAAA,KAAO,OAAO,OAAA,GAAU,IAAA;AAAA,IACxD,CAAA;AAEA,IAAA,MAAM,YAAA,GAAe,OAAO,MAAA,KAAuC;AACjE,MAAA,IAAI,MAAA,EAAQ,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAA;AAC/B,MAAA,IAAI,OAAA,CAAQ,MAAA,IAAU,SAAA,EAAW,MAAM,KAAA,EAAM;AAAA,IAC/C,CAAA;AAEA,IAAA,IAAI,YAAY,UAAA,EAAY;AAC1B,MAAA,MAAM,aAAa,MACjB,IAAI,OAAA,CAAc,CAAC,SAAS,MAAA,KAAW;AACrC,QAAA,MAAM,EAAA,GAAK,EAAA,CAAG,WAAA,CAAY,QAAA,EAAU,UAAU,CAAA;AAC9C,QAAA,MAAM,QAAQ,EAAA,CAAG,WAAA,CAAY,QAAQ,CAAA,CAAE,MAAM,uBAAuB,CAAA;AAEpE,QAAA,MAAM,QAAQ,WAAA,CAAY,KAAA;AAAA,UACxB,CAAC,GAAA,EAAK,UAAA,EAAY,MAAA,CAAO,gBAAgB,CAAA;AAAA,UACzC,CAAC,GAAA,EAAK,UAAA,EAAY,MAAA,CAAO,gBAAgB;AAAA,SAC3C;AACA,QAAA,MAAM,GAAA,GAAM,KAAA,CAAM,UAAA,CAAW,KAAK,CAAA;AAClC,QAAA,GAAA,CAAI,YAAY,YAAY;AAC1B,UAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,UAAA,IAAI,CAAC,UAAU,OAAA,EAAS;AACtB,YAAA,MAAM,KAAA,EAAM;AACZ,YAAA,OAAA,EAAQ;AACR,YAAA;AAAA,UACF;AACA,UAAA,MAAM,YAAA,CAAa,OAAO,KAA4B,CAAA;AACtD,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,MAAM,KAAA,EAAM;AACZ,YAAA,OAAA,EAAQ;AACR,YAAA;AAAA,UACF;AACA,UAAA,MAAA,CAAO,QAAA,EAAS;AAAA,QAClB,CAAA;AACA,QAAA,GAAA,CAAI,OAAA,GAAU,MAAM,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAAA,MACtC,CAAC,CAAA;AAEH,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,EAAW;AACjB,QAAA;AAAA,MACF,CAAA,CAAA,MAAQ;AAEN,QAAA,OAAA,GAAU,EAAC;AACX,QAAA,OAAA,GAAU,CAAA;AACV,QAAA,OAAA,GAAU,KAAA;AAAA,MACZ;AAAA,IACF;AAGA,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,WAAA,CAAY,QAAA,EAAU,UAAU,CAAA;AAC9C,MAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,WAAA,CAAY,QAAQ,CAAA;AACrC,MAAA,MAAM,GAAA,GAAM,MAAM,UAAA,EAAW;AAC7B,MAAA,GAAA,CAAI,YAAY,YAAY;AAC1B,QAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,QAAA,IAAI,CAAC,UAAU,OAAA,EAAS;AACtB,UAAA,MAAM,KAAA,EAAM;AACZ,UAAA,OAAA,EAAQ;AACR,UAAA;AAAA,QACF;AACA,QAAA,MAAM,SAAS,MAAA,CAAO,KAAA;AACtB,QAAA,IAAI,MAAA,CAAO,OAAO,OAAO,CAAA,KAAM,QAAQ,CAAC,UAAA,IAAc,MAAA,CAAO,UAAA,KAAe,UAAA,CAAA,EAAa;AACvF,UAAA,MAAM,aAAa,MAAM,CAAA;AACzB,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,MAAM,KAAA,EAAM;AACZ,YAAA,OAAA,EAAQ;AACR,YAAA;AAAA,UACF;AAAA,QACF;AACA,QAAA,MAAA,CAAO,QAAA,EAAS;AAAA,MAClB,CAAA;AACA,MAAA,GAAA,CAAI,OAAA,GAAU,MAAM,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAAA,IACtC,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAc,aAAA,CACZ,EAAA,EACA,WACA,OAAA,EACA,UAAA,EACA,MACA,QAAA,EACgB;AAChB,IAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAA,CAAI,IAAA,GAAO,KAAK,QAAQ,CAAA;AAC/C,IAAA,MAAM,SAAgC,EAAC;AAEvC,IAAA,MAAM,IAAA,CAAK,WAAA;AAAA,MACT,EAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA,OAAO,SAAS,WAAA,KAAgB;AAE9B,QAAA,IAAI,cAAc,OAAA,CAAQ,MAAA,GAAS,KAAA,IAAS,MAAA,CAAO,SAAS,QAAA,EAAU;AACpE,UAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,YAAA,MAAM,MAAM,WAAA,GAAc,CAAA;AAC1B,YAAA,IAAI,GAAA,IAAO,KAAA,IAAS,GAAA,GAAM,KAAA,GAAQ,QAAA,EAAU;AAC1C,cAAA,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAA;AACtB,cAAA,IAAI,MAAA,CAAO,MAAA,KAAW,QAAA,EAAU,OAAO,KAAA;AAAA,YACzC;AAAA,UACF;AAAA,QACF;AACA,QAAA,IAAI,WAAA,GAAc,KAAA,GAAQ,QAAA,EAAU,OAAO,KAAA;AAAA,MAC7C,CAAA;AAAA,MACA,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,GAAG;AAAA,KACxB;AAEA,IAAA,OAAO,OAAO,GAAA,CAAI,CAAA,CAAA,KAAK,IAAA,CAAK,cAAA,CAAe,CAAC,CAAC,CAAA;AAAA,EAC/C;AAAA,EAEA,MAAc,kBAAA,CACZ,EAAA,EACA,SAAA,EACA,OAAA,EACgC;AAChC,IAAA,MAAM,GAAA,GAAM,aAAa,OAAO,CAAA;AAChC,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAElB,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AACzC,IAAA,IAAI,CAAC,EAAA,CAAG,gBAAA,CAAiB,SAAS,QAAQ,CAAA,SAAU,EAAC;AAErD,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,WAAA,CAAY,QAAA,EAAU,UAAU,CAAA;AAC9C,MAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,WAAA,CAAY,QAAQ,CAAA;AAErC,MAAA,IAAI,MAAM,UAAA,CAAW,QAAA,CAAS,SAAS,CAAA,IAAK,aAAA,CAAc,GAAG,CAAA,EAAG;AAC9D,QAAA,IAAI;AACF,UAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,SAAS,CAAA;AACnC,UAAA,MAAMC,OAAM,KAAA,CAAM,MAAA,CAAO,WAAA,CAAY,IAAA,CAAK,GAAG,CAAC,CAAA;AAC9C,UAAAA,KAAI,SAAA,GAAY,MAAM,QAASA,IAAAA,CAAI,MAAA,IAAoC,EAAE,CAAA;AACzE,UAAAA,IAAAA,CAAI,OAAA,GAAU,MAAM,MAAA,CAAOA,KAAI,KAAK,CAAA;AACpC,UAAA;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAEA,MAAA,MAAM,GAAA,GAAM,MAAM,MAAA,EAAO;AACzB,MAAA,GAAA,CAAI,YAAY,MAAM;AACpB,QAAA,MAAM,GAAA,GAAO,GAAA,CAAI,MAAA,IAAoC,EAAC;AACtD,QAAA,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,CAAA,KAAK,MAAA,CAAO,EAAE,OAAO,CAAA,KAAM,GAAG,CAAC,CAAA;AAAA,MACpD,CAAA;AACA,MAAA,GAAA,CAAI,OAAA,GAAU,MAAM,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAAA,IACtC,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAc,UAAA,CACZ,EAAA,EACA,SAAA,EACA,OAAA,EACyD;AACzD,IAAA,MAAM,GAAA,GAAM,aAAa,OAAO,CAAA;AAChC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6DAAA,EAAgE,MAAA,CAAO,OAAO,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IACpG;AAEA,IAAA,IAAI,OAAA,GAAU,MAAM,IAAA,CAAK,KAAA,EAAM,CAAE,IAAA,CAAK,CAAA,CAAA,KAAK,IAAA,CAAK,YAAA,CAAa,CAAA,EAAG,SAAS,CAAC,CAAA;AAC1E,IAAA,IAAI,MAAM,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,EAAS,WAAW,GAAG,CAAA;AACrD,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,GAAG,CAAA,UAAA,CAAY,CAAA;AAAA,IAC1C;AACA,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AACtB,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,aAAA,CAAc,OAAA,EAAS,WAAW,GAAG,CAAA;AACjE,MAAA,OAAA,GAAU,MAAM,KAAK,KAAA,EAAM;AAC3B,MAAA,OAAO,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,QAAA,EAAS;AAAA,IACvC;AACA,IAAA,IAAI,GAAA,CAAI,qBAAqB,CAAA,EAAG;AAK9B,MAAA,MAAM,WAAW,MAAM,IAAA,CAAK,6BAAA,CAA8B,OAAA,EAAS,WAAW,GAAG,CAAA;AACjF,MAAA,OAAA,GAAU,MAAM,KAAK,KAAA,EAAM;AAC3B,MAAA,OAAO,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,QAAA,EAAS;AAAA,IACvC;AACA,IAAA,OAAO,EAAE,EAAA,EAAI,OAAA,EAAS,IAAA,EAAM,GAAA,EAAI;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAc,6BAAA,CACZ,EAAA,EACA,SAAA,EACA,IAAA,EAC8B;AAC9B,IAAA,EAAA,GAAK,MAAM,IAAA,CAAK,YAAA,CAAa,EAAA,EAAI,SAAS,CAAA;AAC1C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAEzC,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,WAAA,CAAY,QAAA,EAAU,WAAW,CAAA;AAC/C,MAAA,MAAM,KAAA,GAAQ,EAAA,CAAG,WAAA,CAAY,QAAQ,CAAA;AACrC,MAAA,MAAM,KAAA,GAAQ,CAAC,GAAA,KAAwB;AACrC,QAAA,MAAM,GAAA,GAAM,IAAI,UAAA,EAAW;AAC3B,QAAA,GAAA,CAAI,YAAY,MAAM;AACpB,UAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,UAAA,IAAI,CAAC,MAAA,EAAQ;AACb,UAAA,MAAM,MAAM,MAAA,CAAO,KAAA;AAInB,UAAA,MAAM,QAAA,GAAW,OAAO,GAAA,CAAI,EAAA,KAAO,QAAA,GAAW,IAAI,EAAA,CAAG,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,GAAS,CAAA;AAC1E,UAAA,IAAI,MAAA,CAAO,IAAI,OAAO,CAAA,MAAO,KAAK,EAAA,IAAM,EAAA,CAAA,IAAO,aAAa,CAAA,EAAG;AAC7D,YAAA,MAAM,IAAA,GAAO,EAAE,GAAG,GAAA,EAAK,EAAA,EAAI,WAAA,CAAY,GAAA,CAAI,OAAA,EAAS,GAAA,CAAI,UAAA,EAAY,GAAA,CAAI,KAAK,CAAA,EAAE;AAC/E,YAAA,MAAA,CAAO,MAAA,EAAO;AACd,YAAA,KAAA,CAAM,IAAI,IAAA,CAAK,KAAA,CAAM,KAAK,SAAA,CAAU,IAAI,CAAC,CAAwB,CAAA;AAAA,UACnE;AACA,UAAA,MAAA,CAAO,QAAA,EAAS;AAAA,QAClB,CAAA;AACA,QAAA,GAAA,CAAI,OAAA,GAAU,MAAM,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAAA,MACtC,CAAA;AACA,MAAA,KAAA,CAAM,KAAK,CAAA;AACX,MAAA,EAAA,CAAG,UAAA,GAAa,MAAM,OAAA,EAAQ;AAC9B,MAAA,EAAA,CAAG,OAAA,GAAU,MAAM,MAAA,CAAO,EAAA,CAAG,KAAK,CAAA;AAAA,IACpC,CAAC,CAAA;AAGD,IAAA,MAAM,SAAiC,EAAC;AACxC,IAAA,MAAM,IAAA,CAAK,WAAA;AAAA,MACT,EAAA;AAAA,MACA,SAAA;AAAA,MACA,KAAK,EAAA,IAAM,EAAA;AAAA,MACX,IAAA;AAAA,MACA,OAAM,OAAA,KAAW;AACf,QAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,UAAA,MAAA,CAAO,IAAI,UAAU,CAAA,GAAA,CAAK,OAAO,GAAA,CAAI,UAAU,KAAK,CAAA,IAAK,CAAA;AAAA,QAC3D;AAAA,MACF;AAAA,KACF;AAEA,IAAA,MAAM,IAAA,GAA4B;AAAA,MAChC,GAAG,IAAA;AAAA,MACH,gBAAA,EAAkB,CAAA;AAAA,MAClB,qBAAA,EAAuB,MAAA;AAAA,MACvB,WAAW,MAAA,CAAO,IAAA,CAAK,oBAAoB,SAAS,CAAA,IAAK,KAAK,SAAA,IAAa;AAAA,KAC7E;AACA,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,EAAA,EAAI,SAAA,EAAW,IAAI,CAAA;AACtC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAIA,MAAM,OAAA,CAAQ,SAAA,EAAmB,OAAA,EAAiC;AAChE,IAAA,MAAM,GAAA,GAAM,aAAa,OAAO,CAAA;AAChC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0DAAA,EAA6D,MAAA,CAAO,OAAO,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IACjG;AAEA,IAAA,IAAI,EAAA,GAAK,MAAM,IAAA,CAAK,KAAA,EAAM;AAC1B,IAAA,EAAA,GAAK,MAAM,IAAA,CAAK,YAAA,CAAa,EAAA,EAAI,SAAS,CAAA;AAC1C,IAAA,MAAM,EAAE,EAAA,EAAI,EAAA,EAAI,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,UAAA,CAAW,EAAA,EAAI,SAAA,EAAW,GAAG,CAAA;AACjE,IAAA,MAAM,IAAA,GAAO,KAAK,IAAA,IAAQ,CAAA;AAC1B,IAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAY,EAAA;AAClC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,aAAA;AAAA,MACtB,EAAA;AAAA,MACA,SAAA;AAAA,MACA,GAAA;AAAA,MACA,KAAK,gBAAA,IAAoB,SAAA;AAAA,MACzB,IAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAO,IAAA,CAAK,kBAAA,CAAmB,IAAA,EAAM,IAAA,EAAM,MAAM,QAAQ,CAAA;AAAA,EAC3D;AAAA,EAEA,MAAM,IAAA,CAAK,SAAA,EAAmB,KAAA,EAA6B;AACzD,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,KAAA,EAAO,EAAE,CAAA;AAClC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAA,CAAQ,IAAA,CAAK,gEAAA,EAAkE,KAAA,EAAO,EAAE,CAAA;AACxF,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,EAAA,GAAK,MAAM,IAAA,CAAK,KAAA,EAAM;AAC1B,IAAA,EAAA,GAAK,MAAM,IAAA,CAAK,YAAA,CAAa,EAAA,EAAI,SAAS,CAAA;AAE1C,IAAA,IAAI,aAAA,GAAgB,KAAA,CAAM,aAAA,EAAc,CAAE,SAAA;AAC1C,IAAA,IAAI,YAAA,GAA2C,IAAA;AAC/C,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,IAAA,CAAK,QAAA,CAAS,EAAA,EAAI,WAAW,GAAG,CAAA;AAClD,MAAA,IAAI,GAAA,IAAO,CAAC,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AAC9B,QAAA,YAAA,GAAe,GAAA;AACf,QAAA,aAAA,GAAgB,IAAA,CAAK,GAAA,CAAI,aAAA,EAAe,GAAA,CAAI,SAAS,CAAA;AAAA,MACvD;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAGA,IAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,eAAe,KAAA,CAAM,aAAA,GAAgB,SAAS,CAAA;AAGzE,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,kBAAA,CAAmB,KAAA,EAAO,WAAW,YAAY,CAAA;AACnE,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,EAAA,EAAI,SAAA,EAAW,IAAI,CAAA;AAEtC,IAAA,MAAM,OAAc,EAAC;AACrB,IAAA,KAAA,MAAW,GAAA,IAAO,KAAA,CAAM,cAAA,EAAe,CAAE,QAAO,EAAG;AACjD,MAAA,IAAA,CAAK,KAAK,GAAG,GAAA,CAAI,OAAA,EAAQ,CAAE,QAAQ,CAAA;AAAA,IACrC;AACA,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,EAAA,EAAI,SAAA,EAAW,KAAK,IAAI,CAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,UAAA,CAAW,SAAA,EAAmB,KAAA,EAA6B;AAC/D,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,KAAA,EAAO,EAAE,CAAA;AAClC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAA,CAAQ,IAAA,CAAK,sEAAA,EAAwE,KAAA,EAAO,EAAE,CAAA;AAC9F,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,EAAA,GAAK,MAAM,IAAA,CAAK,KAAA,EAAM;AAC1B,IAAA,EAAA,GAAK,MAAM,IAAA,CAAK,YAAA,CAAa,EAAA,EAAI,SAAS,CAAA;AAI1C,IAAA,IAAI,kBAAyC,EAAC;AAC9C,IAAA,IAAI;AACF,MAAA,MAAM,MAAM,MAAM,IAAA,CAAK,QAAA,CAAS,EAAA,EAAI,WAAW,GAAG,CAAA;AAClD,MAAA,IAAI,GAAA,IAAO,CAAC,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,EAAG;AAC9B,QAAA,MAAM,MAAA,GAAS,IAAI,gBAAA,IAAoB,SAAA;AAIvC,QAAA,MAAM,QAAA,uBAAe,GAAA,EAAY;AACjC,QAAA,KAAA,MAAW,GAAA,IAAO,KAAA,CAAM,cAAA,EAAe,CAAE,QAAO,EAAG;AACjD,UAAA,IAAI,GAAA,CAAI,SAAQ,CAAE,IAAA,GAAO,GAAG,QAAA,CAAS,GAAA,CAAI,GAAA,CAAI,iBAAA,EAAmB,CAAA;AAAA,QAClE;AACA,QAAA,MAAM,aAAa,MAAM,IAAA,CAAK,kBAAA,CAAmB,EAAA,EAAI,WAAW,GAAG,CAAA;AACnE,QAAA,eAAA,GAAkB,UAAA,CAAW,MAAA;AAAA,UAC3B,CAAA,CAAA,KAAK,EAAE,UAAA,KAAe,MAAA,IAAU,CAAC,QAAA,CAAS,GAAA,CAAI,EAAE,UAAU;AAAA,SAC5D;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAEA,IAAA,MAAM,OAAc,EAAC;AACrB,IAAA,KAAA,MAAW,GAAA,IAAO,KAAA,CAAM,cAAA,EAAe,CAAE,QAAO,EAAG;AACjD,MAAA,IAAA,CAAK,KAAK,GAAG,GAAA,CAAI,OAAA,EAAQ,CAAE,QAAQ,CAAA;AAAA,IACrC;AAEA,IAAA,MAAM,IAAA,CAAK,qBAAA,CAAsB,EAAA,EAAI,SAAA,EAAW,GAAG,CAAA;AACnD,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,kBAAA,CAAmB,KAAA,EAAO,KAAK,MAAM,CAAA;AACvD,IAAA,IAAA,CAAK,IAAA,GAAO,CAAA;AACZ,IAAA,IAAA,CAAK,gBAAA,GAAmB,CAAA;AAExB,IAAA,MAAM,iBAAyC,EAAC;AAChD,IAAA,KAAA,MAAW,OAAO,eAAA,EAAiB;AACjC,MAAA,cAAA,CAAe,IAAI,UAAU,CAAA,GAAA,CAAK,eAAe,GAAA,CAAI,UAAU,KAAK,CAAA,IAAK,CAAA;AAAA,IAC3E;AACA,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA,EAAG;AAC1D,MAAA,IAAA,CAAK,qBAAA,GAAwB,IAAA,CAAK,qBAAA,IAAyB,EAAC;AAC5D,MAAA,IAAA,CAAK,qBAAA,CAAsB,IAAI,CAAA,GAAI,KAAA;AAAA,IACrC;AACA,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,EAAA,EAAI,SAAA,EAAW,IAAI,CAAA;AACtC,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,EAAA,EAAI,SAAA,EAAW,KAAK,IAAI,CAAA;AAC3C,IAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,MAAA,MAAM,IAAA,CAAK,aAAA,CAAc,EAAA,EAAI,SAAA,EAAW,eAAe,CAAA;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,MAAM,QAAA,CACJ,SAAA,EACA,OAAA,EACA,MACA,QAAA,EACuB;AACvB,IAAA,MAAM,GAAA,GAAM,aAAa,OAAO,CAAA;AAChC,IAAA,IAAI,CAAC,GAAA,EAAK;AAER,MAAA,OAAA,CAAQ,IAAA,CAAK,qEAAqE,OAAO,CAAA;AACzF,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,IAAI,EAAA,GAAK,MAAM,IAAA,CAAK,KAAA,EAAM;AAC1B,IAAA,EAAA,GAAK,MAAM,IAAA,CAAK,YAAA,CAAa,EAAA,EAAI,SAAS,CAAA;AAC1C,IAAA,MAAM,EAAE,EAAA,EAAI,EAAA,EAAI,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,UAAA,CAAW,EAAA,EAAI,SAAA,EAAW,GAAG,CAAA;AACjE,IAAA,MAAM,IAAA,GAAO,QAAA,IAAY,IAAA,CAAK,QAAA,IAAY,EAAA;AAC1C,IAAA,MAAM,aAAa,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,GAAI,IAAA,CAAK,IAAI,CAAA,EAAG,IAAI,CAAC,CAAC,CAAA;AACzF,IAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,IAAA,EAAM,UAAU,CAAC,CAAA;AAEvD,IAAA,MAAM,MAAA,GAAS,KAAK,gBAAA,IAAoB,SAAA;AACxC,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,aAAA;AAAA,MACtB,EAAA;AAAA,MACA,SAAA;AAAA,MACA,GAAA;AAAA,MACA,MAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAGA,IAAA,MAAM,cAAc,IAAA,CAAK,qBAAA,GAAwB,MAAM,CAAA,IAAK,KAAK,SAAA,IAAa,CAAA;AAC9E,IAAA,MAAM,mBAAmB,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,KAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,WAAW,IAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAI,CAAC,CAAC,CAAA;AAC5F,IAAA,MAAM,kBAAA,GAAqB,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,QAAA,EAAU,gBAAgB,CAAC,CAAA;AAE3E,IAAA,IAAI,QAAA,GAAW,IAAA;AACf,IAAA,IAAI,uBAAuB,QAAA,EAAU;AACnC,MAAA,QAAA,GAAW,MAAM,KAAK,aAAA,CAAc,EAAA,EAAI,WAAW,GAAA,EAAK,MAAA,EAAQ,oBAAoB,IAAI,CAAA;AAAA,IAC1F;AAEA,IAAA,IAAA,CAAK,IAAA,GAAO,kBAAA;AACZ,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,EAAA,EAAI,SAAA,EAAW,IAAI,CAAA;AACtC,IAAA,OAAO,IAAA,CAAK,kBAAA,CAAmB,IAAA,EAAM,QAAA,EAAU,oBAAoB,IAAI,CAAA;AAAA,EACzE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,mBAAA,CACJ,SAAA,EACA,OAAA,EACA,UAAA,EACuB;AACvB,IAAA,MAAM,GAAA,GAAM,aAAa,OAAO,CAAA;AAChC,IAAA,IAAI,CAAC,KAAK,OAAO,IAAA;AAEjB,IAAA,IAAI,EAAA,GAAK,MAAM,IAAA,CAAK,KAAA,EAAM;AAC1B,IAAA,EAAA,GAAK,MAAM,IAAA,CAAK,YAAA,CAAa,EAAA,EAAI,SAAS,CAAA;AAC1C,IAAA,MAAM,EAAE,EAAA,EAAI,EAAA,EAAI,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,UAAA,CAAW,EAAA,EAAI,SAAA,EAAW,GAAG,CAAA;AAEjE,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa,IAAA,CAAK,OAAK,CAAA,CAAE,IAAA,KAAS,UAAU,CAAA,EAAG;AACvD,MAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,yEAAA,EAA4E,UAAU,CAAA,CAAA,CAAG,CAAA;AACtG,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAY,EAAA;AAClC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,qBAAA,GAAwB,UAAU,CAAA,IAAK,CAAA;AAC1D,IAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,aAAA,CAAc,IAAI,SAAA,EAAW,GAAA,EAAK,UAAA,EAAY,CAAA,EAAG,QAAQ,CAAA;AAEjF,IAAA,IAAA,CAAK,gBAAA,GAAmB,UAAA;AACxB,IAAA,IAAA,CAAK,IAAA,GAAO,CAAA;AACZ,IAAA,IAAA,CAAK,SAAA,GAAY,KAAA;AACjB,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,EAAA,EAAI,SAAA,EAAW,IAAI,CAAA;AAEtC,IAAA,OAAO,IAAA,CAAK,kBAAA,CAAmB,IAAA,EAAM,IAAA,EAAM,GAAG,QAAQ,CAAA;AAAA,EACxD;AAAA,EAEA,MAAM,UAAA,CACJ,SAAA,EACA,OAAA,EACA,kBAAmC,QAAA,EACnB;AAChB,IAAA,MAAM,GAAA,GAAM,aAAa,OAAO,CAAA;AAChC,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAElB,IAAA,IAAI,EAAA,GAAK,MAAM,IAAA,CAAK,KAAA,EAAM;AAC1B,IAAA,EAAA,GAAK,MAAM,IAAA,CAAK,YAAA,CAAa,EAAA,EAAI,SAAS,CAAA;AAC1C,IAAA,MAAM,EAAE,EAAA,EAAI,EAAA,EAAI,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,UAAA,CAAW,EAAA,EAAI,SAAA,EAAW,GAAG,CAAA;AACjE,IAAA,MAAM,UAAU,MAAM,IAAA,CAAK,kBAAA,CAAmB,EAAA,EAAI,WAAW,GAAG,CAAA;AAChE,IAAA,IAAI,OAAO,OAAA,CAAQ,GAAA,CAAI,OAAK,IAAA,CAAK,cAAA,CAAe,CAAC,CAAC,CAAA;AAElD,IAAA,IAAI,oBAAoB,KAAA,EAAO;AAC7B,MAAA,OAAO,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,YAAY,CAAC,CAAA,GAAI,WAAA,CAAY,CAAC,CAAC,CAAA;AAAA,IAC5D;AACA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,eAAe,CAAA,EAAG;AAClC,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,eAAe,CAAA;AACnC,MAAA,IAAA,GAAO,KAAK,MAAA,CAAO,CAAA,CAAA,KAAK,IAAI,GAAA,CAAI,CAAA,CAAE,UAAU,CAAC,CAAA;AAAA,IAC/C,CAAA,MAAO;AACL,MAAA,MAAM,MAAA,GAAS,KAAK,gBAAA,IAAoB,SAAA;AACxC,MAAA,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,eAAe,MAAM,CAAA;AAAA,IACjD;AACA,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,YAAY,CAAC,CAAA,GAAI,WAAA,CAAY,CAAC,CAAC,CAAA;AAAA,EAC5D;AAAA,EAEA,MAAM,YAAA,CACJ,SAAA,EACA,OAAA,EACA,kBAAmC,QAAA,EAChB;AACnB,IAAA,MAAM,GAAA,GAAM,aAAa,OAAO,CAAA;AAChC,IAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAElB,IAAA,IAAI,EAAA,GAAK,MAAM,IAAA,CAAK,KAAA,EAAM;AAC1B,IAAA,EAAA,GAAK,MAAM,IAAA,CAAK,YAAA,CAAa,EAAA,EAAI,SAAS,CAAA;AAC1C,IAAA,MAAM,EAAE,EAAA,EAAI,EAAA,EAAI,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,UAAA,CAAW,EAAA,EAAI,SAAA,EAAW,GAAG,CAAA;AACjE,IAAA,IAAI,UAAU,MAAM,IAAA,CAAK,kBAAA,CAAmB,EAAA,EAAI,WAAW,GAAG,CAAA;AAE9D,IAAA,IAAI,oBAAoB,KAAA,EAAO,CAE/B,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,eAAe,CAAA,EAAG;AACzC,MAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,eAAe,CAAA;AACnC,MAAA,OAAA,GAAU,QAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,IAAI,GAAA,CAAI,CAAA,CAAE,UAAU,CAAC,CAAA;AAAA,IACrD,CAAA,MAAO;AACL,MAAA,MAAM,MAAA,GAAS,KAAK,gBAAA,IAAoB,SAAA;AACxC,MAAA,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,eAAe,MAAM,CAAA;AAAA,IACvD;AAEA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,SAAA,GAAY,EAAE,SAAS,CAAA;AAChD,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,KAAK,CAAA;AAAA,EACjC;AAAA,EAEA,UAAA,CAAW,QAAgB,SAAA,EAAyB;AAAA,EAEpD;AAAA,EAEA,MAAM,KAAA,CAAM,MAAA,EAAgB,SAAA,EAAkC;AAAA,EAE9D;AAAA,EAEA,MAAM,MAAA,CAAO,SAAA,EAAmB,OAAA,EAAmC;AACjE,IAAA,MAAM,GAAA,GAAM,aAAa,OAAO,CAAA;AAChC,IAAA,IAAI,CAAC,KAAK,OAAO,KAAA;AACjB,IAAA,MAAM,EAAA,GAAK,MAAM,IAAA,CAAK,KAAA,EAAM;AAC5B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AACzC,IAAA,IAAI,CAAC,EAAA,CAAG,gBAAA,CAAiB,QAAA,CAAS,QAAQ,GAAG,OAAO,KAAA;AAEpD,IAAA,OAAO,IAAI,QAAQ,CAAA,OAAA,KAAW;AAC5B,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,WAAA,CAAY,QAAA,EAAU,UAAU,CAAA;AAC9C,MAAA,MAAM,MAAM,EAAA,CAAG,WAAA,CAAY,QAAQ,CAAA,CAAE,IAAI,GAAG,CAAA;AAC5C,MAAA,GAAA,CAAI,YAAY,MAAM,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAC,CAAA;AACjD,MAAA,GAAA,CAAI,OAAA,GAAU,MAAM,OAAA,CAAQ,KAAK,CAAA;AAAA,IACnC,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,MAAA,CAAO,SAAA,EAAmB,OAAA,EAAgC;AAC9D,IAAA,MAAM,GAAA,GAAM,aAAa,OAAO,CAAA;AAChC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAA,CAAQ,IAAA,CAAK,mEAAmE,OAAO,CAAA;AACvF,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,EAAA,GAAK,MAAM,IAAA,CAAK,KAAA,EAAM;AAC1B,IAAA,IAAI,CAAC,GAAG,gBAAA,CAAiB,QAAA,CAAS,KAAK,SAAA,CAAU,SAAS,CAAC,CAAA,EAAG;AAC9D,IAAA,EAAA,GAAK,MAAM,IAAA,CAAK,YAAA,CAAa,EAAA,EAAI,SAAS,CAAA;AAE1C,IAAA,MAAM,IAAA,CAAK,qBAAA,CAAsB,EAAA,EAAI,SAAA,EAAW,GAAG,CAAA;AAEnD,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,MAAA,MAAM,KAAK,EAAA,CAAG,WAAA,CAAY,KAAK,SAAA,CAAU,SAAS,GAAG,WAAW,CAAA;AAChE,MAAA,EAAA,CAAG,YAAY,IAAA,CAAK,SAAA,CAAU,SAAS,CAAC,CAAA,CAAE,OAAO,GAAG,CAAA;AACpD,MAAA,EAAA,CAAG,UAAA,GAAa,MAAM,OAAA,EAAQ;AAC9B,MAAA,EAAA,CAAG,OAAA,GAAU,MAAM,MAAA,CAAO,EAAA,CAAG,KAAK,CAAA;AAAA,IACpC,CAAC,CAAA;AAAA,EACH;AAAA,EAEA,MAAM,UAAA,CAAW,SAAA,EAAmB,OAAA,EAAgC;AAClE,IAAA,MAAM,GAAA,GAAM,aAAa,OAAO,CAAA;AAChC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAA,CAAQ,IAAA,CAAK,uEAAuE,OAAO,CAAA;AAC3F,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,EAAA,GAAK,MAAM,IAAA,CAAK,KAAA,EAAM;AAC1B,IAAA,IAAI,CAAC,GAAG,gBAAA,CAAiB,QAAA,CAAS,KAAK,SAAA,CAAU,SAAS,CAAC,CAAA,EAAG;AAC9D,IAAA,EAAA,GAAK,MAAM,IAAA,CAAK,YAAA,CAAa,EAAA,EAAI,SAAS,CAAA;AAE1C,IAAA,MAAM,MAAM,MAAM,IAAA,CAAK,QAAA,CAAS,EAAA,EAAI,WAAW,GAAG,CAAA;AAClD,IAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,GAAG,CAAA,UAAA,CAAY,CAAA;AAElD,IAAA,MAAM,IAAA,CAAK,qBAAA,CAAsB,EAAA,EAAI,SAAA,EAAW,GAAG,CAAA;AAEnD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,GAC3B,IAAI,gBAAA,IAAoB,GAAA,CAAI,gBAAA,IAAoB,SAAA,GACjD,GAAA,CAAI,gBAAA;AAER,IAAA,MAAM,IAAA,GAA4B;AAAA,MAChC,EAAA,EAAI,GAAA;AAAA,MACJ,IAAA,EAAM,MAAA;AAAA,MACN,gBAAA,EAAkB,MAAA;AAAA,MAClB,IAAA,EAAM,CAAA;AAAA,MACN,UAAU,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,GAAI,EAAA,GAAK,IAAI,QAAA,IAAY,EAAA;AAAA,MACpD,SAAA,EAAW,CAAA;AAAA,MACX,WAAA,EAAa,KAAK,QAAA,CAAS,GAAG,IAC1B,EAAC,GAAA,CACA,GAAA,CAAI,WAAA,IAAe,EAAC,EAAG,IAAI,CAAA,CAAA,MAAM,EAAE,MAAM,CAAA,CAAE,IAAA,EAAM,SAAS,CAAA,CAAE,OAAA,IAAW,EAAC,EAAE,CAAE;AAAA,KACnF;AACA,IAAA,MAAM,IAAA,CAAK,OAAA,CAAQ,EAAA,EAAI,SAAA,EAAW,IAAI,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,kBACJ,SAAA,EACA,OAAA,EACA,kBAAmC,QAAA,EACnC,OAAA,EAUA,YAAY,GAAA,EACG;AACf,IAAA,MAAM,GAAA,GAAM,aAAa,OAAO,CAAA;AAChC,IAAA,IAAI,CAAC,GAAA,EAAK;AAEV,IAAA,IAAI,EAAA,GAAK,MAAM,IAAA,CAAK,KAAA,EAAM;AAC1B,IAAA,EAAA,GAAK,MAAM,IAAA,CAAK,YAAA,CAAa,EAAA,EAAI,SAAS,CAAA;AAC1C,IAAA,MAAM,EAAE,EAAA,EAAI,EAAA,EAAI,IAAA,EAAK,GAAI,MAAM,IAAA,CAAK,UAAA,CAAW,EAAA,EAAI,SAAA,EAAW,GAAG,CAAA;AACjE,IAAA,MAAM,MAAA,GAAS,KAAK,gBAAA,IAAoB,SAAA;AACxC,IAAA,MAAM,UAAA,GACJ,eAAA,KAAoB,QAAA,GAAW,MAAA,GAAS,IAAA;AAE1C,IAAA,IAAI,eAAe,IAAA,EAAM;AAIvB,MAAA,MAAM,UAAA,GAAa,OACjB,OAAA,EACA,WAAA,KAEA,OAAA;AAAA,QACE,OAAA,CAAQ,IAAI,CAAA,CAAA,MAAM;AAAA,UAChB,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,YAAY,CAAA,CAAE,UAAA;AAAA,UACd,WAAW,CAAA,CAAE,SAAA;AAAA,UACb,UAAU,CAAA,CAAE,QAAA;AAAA,UACZ,OAAO,MAAA,CAAO,WAAA;AAAA,YACZ,EAAE,KAAA,CAAM,GAAA,CAAI,OAAK,CAAC,CAAA,CAAE,OAAO,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,eAAe,CAAA,CAAE,aAAA,EAAe,SAAS,CAAA,CAAE,OAAA,EAAS,CAAC;AAAA;AACpG,SACF,CAAE,CAAA;AAAA,QACF;AAAA,OACF;AACF,MAAA,MAAM,KAAK,WAAA,CAAY,EAAA,EAAI,WAAW,GAAA,EAAK,UAAA,EAAY,YAAY,SAAS,CAAA;AAC5E,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,UAAU,eAAA,KAAoB,KAAA,GAAQ,IAAA,GAAO,IAAI,IAAI,eAA2B,CAAA;AACtF,IAAA,MAAM,IAAA,CAAK,WAAA;AAAA,MACT,EAAA;AAAA,MACA,SAAA;AAAA,MACA,GAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAO,SAAS,WAAA,KAAgB;AAC9B,QAAA,MAAM,QAAA,GAAW,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,QAAQ,GAAA,CAAI,CAAA,CAAE,UAAU,CAAC,CAAA,GAAI,OAAA;AAC5E,QAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAC3B,QAAA,OAAO,OAAA;AAAA,UACL,QAAA,CAAS,IAAI,CAAA,CAAA,MAAM;AAAA,YACjB,OAAO,CAAA,CAAE,KAAA;AAAA,YACT,YAAY,CAAA,CAAE,UAAA;AAAA,YACd,WAAW,CAAA,CAAE,SAAA;AAAA,YACb,UAAU,CAAA,CAAE,QAAA;AAAA,YACZ,OAAO,MAAA,CAAO,WAAA;AAAA,cACZ,EAAE,KAAA,CAAM,GAAA,CAAI,OAAK,CAAC,CAAA,CAAE,OAAO,EAAE,KAAA,EAAO,CAAA,CAAE,KAAA,EAAO,eAAe,CAAA,CAAE,aAAA,EAAe,SAAS,CAAA,CAAE,OAAA,EAAS,CAAC;AAAA;AACpG,WACF,CAAE,CAAA;AAAA,UACF;AAAA,SACF;AAAA,MACF,CAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cAAA,CACJ,SAAA,EACA,OAAA,EACA,MAAA,EAKC;AACD,IAAA,MAAM,GAAA,GAAM,aAAa,OAAO,CAAA;AAChC,IAAA,IAAI,CAAC,GAAA,IAAO,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAC/B,MAAA,OAAO,EAAE,WAAA,EAAa,CAAA,EAAG,WAAA,EAAa,CAAA,EAAG,WAAW,CAAA,EAAE;AAAA,IACxD;AACA,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,MAAM,CAAA;AAC7B,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,IAAA,MAAM,SAAA,GAAY,CAAC,MAAA,EAA6B,WAAA,KAAsC;AACpF,MAAA,IAAI,OAAO,QAAA,KAAA,KAAA,cAAiC;AAC1C,QAAA,WAAA,CAAY,OAAO,WAAA,CAAY,GAAA,EAAK,OAAO,UAAA,EAAY,MAAA,CAAO,KAAK,CAAC,CAAA;AACpE,QAAA,WAAA,IAAe,CAAA;AACf,QAAA;AAAA,MACF;AACA,MAAA,IAAI,OAAO,QAAA,KAAA,QAAA,gBAAmC;AAC5C,QAAA;AAAA,MACF;AACA,MAAA,MAAA,CAAO,QAAA,GAAA,QAAA;AAGP,MAAA,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,GAAG,CAAA,EAAG,aAAA,EAAe,CAAA,CAAE,KAAA,EAAM,CAAE,CAAA;AACvE,MAAA,WAAA,CAAY,IAAI,IAAA,CAAK,KAAA,CAAM,KAAK,SAAA,CAAU,MAAM,CAAC,CAAwB,CAAA;AACzE,MAAA,WAAA,IAAe,CAAA;AAAA,IACjB,CAAA;AAEA,IAAA,IAAI,EAAA,GAAK,MAAM,IAAA,CAAK,KAAA,EAAM;AAC1B,IAAA,EAAA,GAAK,MAAM,IAAA,CAAK,YAAA,CAAa,EAAA,EAAI,SAAS,CAAA;AAC1C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAEzC,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,WAAA,CAAY,CAAC,QAAA,EAAU,KAAK,SAAA,CAAU,SAAS,CAAC,CAAA,EAAG,WAAW,CAAA;AAC5E,MAAA,MAAM,WAAA,GAAc,EAAA,CAAG,WAAA,CAAY,QAAQ,CAAA;AAK3C,MAAA,MAAM,aAAa,MAAM;AACvB,QAAA,MAAM,OAAA,GAAU,GAAG,WAAA,CAAY,IAAA,CAAK,UAAU,SAAS,CAAC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA;AACjE,QAAA,OAAA,CAAQ,YAAY,MAAM;AACxB,UAAA,MAAM,OAAO,OAAA,CAAQ,MAAA;AACrB,UAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ;AAChC,YAAA,MAAM,MAAA,GAAS,KAAK,gBAAA,IAAoB,SAAA;AACxC,YAAA,MAAM,cACJ,IAAA,CAAK,qBAAA,GAAwB,MAAM,CAAA,IAAK,KAAK,SAAA,IAAa,CAAA;AAC5D,YAAA,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,WAAA,GAAc,cAAc,WAAW,CAAA;AAC/D,YAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,YAAA,IAAI,KAAK,qBAAA,EAAuB;AAC9B,cAAA,IAAA,CAAK,qBAAA,CAAsB,MAAM,CAAA,GAAI,SAAA;AAAA,YACvC;AACA,YAAA,EAAA,CAAG,WAAA,CAAY,IAAA,CAAK,SAAA,CAAU,SAAS,CAAC,CAAA,CAAE,GAAA;AAAA,cACxC,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC;AAAA,aACjC;AAAA,UACF;AAAA,QACF,CAAA;AACA,QAAA,OAAA,CAAQ,OAAA,GAAU,MAAM,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA;AAAA,MAC9C,CAAA;AAEA,MAAA,MAAM,cAAc,MAAM;AACxB,QAAA,MAAM,GAAA,GAAM,YAAY,UAAA,EAAW;AACnC,QAAA,GAAA,CAAI,YAAY,MAAM;AACpB,UAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,UAAA,IAAI,CAAC,MAAA,EAAQ;AACX,YAAA,UAAA,EAAW;AACX,YAAA;AAAA,UACF;AACA,UAAA,MAAM,SAAS,MAAA,CAAO,KAAA;AACtB,UAAA,IAAI,MAAA,CAAO,OAAO,OAAO,CAAA,KAAM,OAAO,MAAA,CAAO,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA,EAAG;AAC9D,YAAA,SAAA,CAAU,QAAQ,WAAW,CAAA;AAAA,UAC/B;AACA,UAAA,MAAA,CAAO,QAAA,EAAS;AAAA,QAClB,CAAA;AACA,QAAA,GAAA,CAAI,OAAA,GAAU,MAAM,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAAA,MACtC,CAAA;AAEA,MAAA,MAAM,aAAa,MAAM;AACvB,QAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,KAAA,CAAM,SAAS,CAAA;AACzC,QAAA,MAAM,MAAM,KAAA,CAAM,UAAA,CAAW,WAAA,CAAY,IAAA,CAAK,GAAG,CAAC,CAAA;AAClD,QAAA,GAAA,CAAI,YAAY,MAAM;AACpB,UAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,UAAA,IAAI,CAAC,MAAA,EAAQ;AACX,YAAA,UAAA,EAAW;AACX,YAAA;AAAA,UACF;AACA,UAAA,MAAM,SAAS,MAAA,CAAO,KAAA;AACtB,UAAA,IAAI,OAAO,GAAA,CAAI,MAAA,CAAO,KAAK,CAAA,EAAG,SAAA,CAAU,QAAQ,WAAW,CAAA;AAC3D,UAAA,MAAA,CAAO,QAAA,EAAS;AAAA,QAClB,CAAA;AACA,QAAA,GAAA,CAAI,OAAA,GAAU,MAAM,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AAAA,MACtC,CAAA;AAEA,MAAA,IAAI;AACF,QAAA,IAAI,WAAA,CAAY,UAAA,CAAW,QAAA,CAAS,SAAS,CAAA,EAAG;AAC9C,UAAA,UAAA,EAAW;AAAA,QACb,CAAA,MAAO;AACL,UAAA,WAAA,EAAY;AAAA,QACd;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAA,WAAA,EAAY;AAAA,MACd;AAEA,MAAA,EAAA,CAAG,UAAA,GAAa,MAAM,OAAA,EAAQ;AAC9B,MAAA,EAAA,CAAG,OAAA,GAAU,MAAM,MAAA,CAAO,EAAA,CAAG,KAAK,CAAA;AAClC,MAAA,EAAA,CAAG,OAAA,GAAU,MAAM,MAAA,CAAO,EAAA,CAAG,SAAS,IAAI,KAAA,CAAM,wBAAwB,CAAC,CAAA;AAAA,IAC3E,CAAC,CAAA;AAED,IAAA,OAAO,EAAE,WAAA,EAAa,WAAA,EAAa,SAAA,EAAU;AAAA,EAC/C;AAAA,EAEA,MAAM,UAAA,CAAW,SAAA,EAAmB,OAAA,EAAiB,MAAA,EAAiC;AACpF,IAAA,MAAM,GAAA,GAAM,aAAa,OAAO,CAAA;AAChC,IAAA,IAAI,CAAC,GAAA,IAAO,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AACjC,IAAA,IAAI,EAAA,GAAK,MAAM,IAAA,CAAK,KAAA,EAAM;AAC1B,IAAA,EAAA,GAAK,MAAM,IAAA,CAAK,YAAA,CAAa,EAAA,EAAI,SAAS,CAAA;AAC1C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AACzC,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,MAAM,CAAA;AAE7B,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,OAAA,EAAS,MAAA,KAAW;AAC3C,MAAA,MAAM,EAAA,GAAK,EAAA,CAAG,WAAA,CAAY,CAAC,QAAA,EAAU,KAAK,SAAA,CAAU,SAAS,CAAC,CAAA,EAAG,WAAW,CAAA;AAC5E,MAAA,MAAM,QAAA,GAAW,EAAA,CAAG,WAAA,CAAY,QAAQ,CAAA;AAGxC,MAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,KAA0B;AACvC,QAAA,MAAM,aAAa,MAAM;AACvB,UAAA,MAAM,GAAA,GAAM,MAAM,KAAA,CAAM,SAAS,EAAE,UAAA,CAAW,WAAA,CAAY,IAAA,CAAK,GAAG,CAAC,CAAA;AACnE,UAAA,GAAA,CAAI,YAAY,MAAM;AACpB,YAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,YAAA,IAAI,CAAC,MAAA,EAAQ;AACb,YAAA,MAAM,MAAM,MAAA,CAAO,KAAA;AACnB,YAAA,IAAI,OAAO,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA,SAAU,MAAA,EAAO;AACzC,YAAA,MAAA,CAAO,QAAA,EAAS;AAAA,UAClB,CAAA;AAAA,QACF,CAAA;AACA,QAAA,IAAI;AACF,UAAA,IAAI,KAAA,CAAM,UAAA,CAAW,QAAA,CAAS,SAAS,GAAG,UAAA,EAAW;AAAA,2BACpC,KAAK,CAAA;AAAA,QACxB,CAAA,CAAA,MAAQ;AACN,UAAA,WAAA,CAAY,KAAK,CAAA;AAAA,QACnB;AAAA,MACF,CAAA;AACA,MAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAA0B;AAC7C,QAAA,MAAM,GAAA,GAAM,MAAM,UAAA,EAAW;AAC7B,QAAA,GAAA,CAAI,YAAY,MAAM;AACpB,UAAA,MAAM,SAAS,GAAA,CAAI,MAAA;AACnB,UAAA,IAAI,CAAC,MAAA,EAAQ;AACb,UAAA,MAAM,MAAM,MAAA,CAAO,KAAA;AACnB,UAAA,IAAI,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA,KAAM,GAAA,IAAO,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA,EAAG,MAAA,CAAO,MAAA,EAAO;AACxE,UAAA,MAAA,CAAO,QAAA,EAAS;AAAA,QAClB,CAAA;AAAA,MACF,CAAA;AACA,MAAA,KAAA,CAAM,QAAQ,CAAA;AACd,MAAA,MAAM,OAAA,GAAU,GAAG,WAAA,CAAY,IAAA,CAAK,UAAU,SAAS,CAAC,CAAA,CAAE,GAAA,CAAI,GAAG,CAAA;AACjE,MAAA,OAAA,CAAQ,YAAY,MAAM;AACxB,QAAA,MAAM,OAAO,OAAA,CAAQ,MAAA;AACrB,QAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,IAAA,KAAS,MAAA,EAAQ;AAChC,UAAA,IAAA,CAAK,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,EAAA,CAAI,KAAK,SAAA,IAAa,CAAA,IAAK,OAAO,MAAM,CAAA;AAClE,UAAA,EAAA,CAAG,WAAA,CAAY,IAAA,CAAK,SAAA,CAAU,SAAS,CAAC,CAAA,CAAE,GAAA;AAAA,YACxC,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC;AAAA,WACjC;AAAA,QACF;AAAA,MACF,CAAA;AACA,MAAA,EAAA,CAAG,UAAA,GAAa,MAAM,OAAA,EAAQ;AAC9B,MAAA,EAAA,CAAG,OAAA,GAAU,MAAM,MAAA,CAAO,EAAA,CAAG,KAAK,CAAA;AAAA,IACpC,CAAC,CAAA;AAAA,EACH;AACF;;;ACj8CO,IAAM,4BAAN,MAAmE;AAAA,EAAnE,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,MAAA,uBAAa,GAAA,EAAmB;AAAA,EAAA;AAAA,EAExC,MAAM,MAAA,CAAO,MAAA,EAAgB,QAAA,EAAoC;AAC/D,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,OAAA,CAAQ,MAAA,EAAgB,QAAA,EAAkC;AAC9D,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA;AACtC,IAAA,IAAI,CAAC,KAAA,EAAO,MAAM,IAAI,KAAA,CAAM,CAAA,MAAA,EAAS,QAAQ,CAAA,0BAAA,CAA4B,CAAA;AACzE,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAA,CAAK,MAAA,EAAgB,KAAA,EAA6B;AACtD,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,KAAK,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,UAAA,CAAW,MAAA,EAAgB,KAAA,EAA6B;AAC5D,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,EAAA,EAAI,KAAK,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,QAAA,CACJ,MAAA,EACA,QAAA,EACA,OACA,SAAA,EACuB;AACvB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA;AACtC,IAAA,OAAO,KAAA,IAAS,IAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,mBAAA,CACJ,MAAA,EACA,QAAA,EACA,UAAA,EACuB;AACvB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA;AACtC,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,IAAA,KAAA,CAAM,oBAAoB,UAAU,CAAA;AACpC,IAAA,KAAA,CAAM,WAAW,CAAC,CAAA;AAClB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,UAAA,CACJ,MAAA,EACA,QAAA,EACA,kBAAmC,QAAA,EACnB;AAChB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA;AACtC,IAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,IAAA,OAAO,KAAA,CAAM,QAAQ,eAAe,CAAA;AAAA,EACtC;AAAA,EAEA,MAAM,YAAA,CACJ,MAAA,EACA,QAAA,EACA,kBAAmC,QAAA,EAChB;AACnB,IAAA,MAAM,OAAO,MAAM,IAAA,CAAK,UAAA,CAAW,MAAA,EAAQ,UAAU,eAAe,CAAA;AACpE,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,GAAG,KAAK,CAAA;AAAA,EACjC;AAAA,EAEA,UAAA,CAAW,QAAgB,QAAA,EAAwB;AACjD,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,QAAQ,CAAA;AAAA,EAC7B;AAAA,EAEA,MAAM,KAAA,GAAuB;AAAA,EAE7B;AAAA,EAEA,MAAM,MAAA,CAAO,MAAA,EAAgB,QAAA,EAAiC;AAC5D,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,QAAQ,CAAA;AAAA,EAC7B;AAAA,EAEA,MAAM,UAAA,CAAW,MAAA,EAAgB,QAAA,EAAiC;AAChE,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,QAAQ,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,iBAAA,CACJ,MAAA,EACA,QAAA,EACA,iBACA,OAAA,EAUe;AACf,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA;AACtC,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,eAAe,CAAA;AAC1C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK;AAC5B,MAAA,MAAM,QAAsF,EAAC;AAC7F,MAAA,KAAA,MAAW,CAAC,OAAO,IAAI,CAAA,IAAK,EAAE,QAAA,EAAS,CAAE,SAAQ,EAAG;AAClD,QAAA,KAAA,CAAM,KAAK,CAAA,GAAI,EAAE,KAAA,EAAO,KAAK,QAAA,EAAS,EAAG,aAAA,EAAe,IAAA,CAAK,kBAAiB,CAAE,KAAA,EAAO,OAAA,EAAS,IAAA,CAAK,YAAW,EAAE;AAAA,MACpH;AACA,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,EAAE,EAAA,CAAG,KAAA;AAAA,QACZ,UAAA,EAAY,EAAE,aAAA,EAAc;AAAA,QAC5B,SAAA,EAAW,OAAO,CAAA,CAAE,OAAA,CAAQ,OAAO,CAAA,EAAG,QAAA,MAAc,CAAC,CAAA;AAAA,QACrD,QAAA,EAAU,EAAE,QAAA,CAAS,KAAA;AAAA,QACrB;AAAA,OACF;AAAA,IACF,CAAC,CAAA;AACD,IAAA,MAAM,OAAA,CAAQ,SAAS,CAAC,CAAA;AAAA,EAC1B;AAAA,EAEA,MAAM,UAAA,GAA4B;AAAA,EAElC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cAAA,CACJ,MAAA,EACA,QAAA,EACA,MAAA,EAKC;AACD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA;AACtC,IAAA,IAAI,CAAC,KAAA,IAAS,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AACjC,MAAA,OAAO,EAAE,WAAA,EAAa,CAAA,EAAG,WAAA,EAAa,CAAA,EAAG,WAAW,CAAA,EAAE;AAAA,IACxD;AAEA,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,MAAM,CAAA;AAC7B,IAAA,IAAI,WAAA,GAAc,CAAA;AAClB,IAAA,IAAI,WAAA,GAAc,CAAA;AAElB,IAAA,KAAA,MAAW,GAAA,IAAO,KAAA,CAAM,cAAA,EAAe,CAAE,QAAO,EAAG;AACjD,MAAA,KAAA,MAAW,GAAA,IAAO,MAAM,IAAA,CAAK,GAAA,CAAI,SAAQ,CAAE,MAAA,EAAQ,CAAA,EAAG;AACpD,QAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,EAAA,CAAG,KAAK,CAAA,EAAG;AAC/B,QAAA,IAAI,GAAA,CAAI,SAAS,KAAA,KAAA,KAAA,cAA8B;AAC7C,UAAA,GAAA,CAAI,OAAA,EAAQ,CAAE,MAAA,CAAO,GAAA,CAAI,GAAG,KAAK,CAAA;AACjC,UAAA,WAAA,IAAe,CAAA;AACf,UAAA;AAAA,QACF;AACA,QAAA,IAAI,GAAA,CAAI,SAAS,KAAA,KAAA,QAAA,gBAAgC;AACjD,QAAA,GAAA,CAAI,QAAA,GAAW,IAAIJ,0BAAA,CAAA,QAAA,eAA6B;AAChD,QAAA,GAAA,CAAI,kBAAA,CAAmB,IAAIH,0BAAA,CAAS,UAAU,CAAC,CAAA;AAC/C,QAAA,WAAA,IAAe,CAAA;AAAA,MACjB;AAAA,IACF;AAEA,IAAA,MAAM,CAAA,GAAI,MAAM,aAAA,EAAc;AAC9B,IAAA,MAAM,YAAY,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,CAAE,SAAA,GAAY,cAAc,WAAW,CAAA;AACrE,IAAA,KAAA,CAAM,aAAA,CAAc,IAAIM,4BAAA,CAAW,CAAA,CAAE,MAAM,CAAA,CAAE,QAAA,EAAU,SAAS,CAAC,CAAA;AAEjE,IAAA,OAAO,EAAE,WAAA,EAAa,WAAA,EAAa,SAAA,EAAU;AAAA,EAC/C;AACF;;;AChLA,SAAS,gBAAgB,QAAA,EAAuC;AAC9D,EAAA,OAAO,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,CAAS,MAAA,GAAS,CAAA;AAC3D;AASO,IAAM,6BAAN,MAAoE;AAAA,EAOzE,WAAA,GAAc;AAJd,IAAA,IAAA,CAAQ,YAAA,uBAAmB,GAAA,EAA2B;AAEtD;AAAA,IAAA,IAAA,CAAQ,UAAA,uBAAiB,GAAA,EAAY;AAGnC,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,yBAAA,EAA0B;AAC/C,IAAA,IAAA,CAAK,WAAA,GAAc,IAAI,6BAAA,EAA8B;AAAA,EACvD;AAAA,EAEQ,QAAA,CAAS,OAAe,QAAA,EAA0B;AACxD,IAAA,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAA;AAAA,EAC9B;AAAA,EAEQ,QAAA,CAAS,OAAe,QAAA,EAA2B;AACzD,IAAA,OAAO,KAAK,UAAA,CAAW,GAAA,CAAI,KAAK,QAAA,CAAS,KAAA,EAAO,QAAQ,CAAC,CAAA;AAAA,EAC3D;AAAA,EAEQ,MAAA,CAAO,OAAe,QAAA,EAAwB;AACpD,IAAA,IAAA,CAAK,WAAW,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,QAAQ,CAAC,CAAA;AAAA,EACvD;AAAA,EAEQ,cAAA,CAAe,KAAA,EAAe,QAAA,EAAkB,IAAA,EAAiC;AACvF,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,QAAQ,CAAA;AACzC,IAAA,MAAM,OAAO,IAAA,CAAK,YAAA,CAAa,IAAI,GAAG,CAAA,IAAK,QAAQ,OAAA,EAAQ;AAC3D,IAAA,MAAM,OAAO,IAAA,CACV,KAAA,CAAM,MAAM,MAAS,CAAA,CACrB,KAAK,YAAY;AAChB,MAAA,IAAI,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA,EAAG;AAC9B,MAAA,MAAM,IAAA,EAAK;AAAA,IACb,CAAC,CAAA,CACA,KAAA,CAAM,CAAA,GAAA,KAAO;AACZ,MAAA,OAAA,CAAQ,KAAA,CAAM,yDAAyD,GAAG,CAAA;AAAA,IAC5E,CAAC,CAAA;AACH,IAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AAAA,EACjC;AAAA,EAEA,MAAM,KAAA,CAAM,KAAA,EAAe,QAAA,EAAiC;AAC1D,IAAA,IAAI,CAAC,eAAA,CAAgB,QAAQ,CAAA,EAAG;AAChC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,QAAQ,CAAA;AACzC,IAAA,OAAO,KAAK,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,IAAK,QAAQ,OAAA,EAAQ,CAAA;AAAA,EACvD;AAAA,EAEA,MAAM,OAAA,CAAQ,KAAA,EAAe,QAAA,EAAkC;AAC7D,IAAA,IAAI,CAAC,eAAA,CAAgB,QAAQ,CAAA,EAAG;AAC9B,MAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,IAC1E;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,OAAO,QAAQ,CAAA;AAE3B,IAAA,IAAI,MAAM,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,KAAA,EAAO,QAAQ,CAAA,EAAG;AAChD,MAAA,OAAO,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,KAAA,EAAO,QAAQ,CAAA;AAAA,IAC/C;AACA,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,QAAQ,CAAA;AAChC,IAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,OAAO,QAAQ,CAAA;AAC5D,IAAA,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA;AACtC,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,MAAM,IAAA,CAAK,KAAA,EAAe,KAAA,EAA6B;AACrD,IAAA,IAAI,CAAC,eAAA,CAAgB,KAAA,EAAO,EAAE,CAAA,EAAG;AAC/B,MAAA,OAAA,CAAQ,IAAA,CAAK,6DAAA,EAA+D,KAAA,EAAO,EAAE,CAAA;AACrF,MAAA;AAAA,IACF;AACA,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,KAAA,CAAM,EAAE,CAAA,EAAG;AAClC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA;AAItC,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAM,UAAA,CAAW,KAAA,EAAe,KAAA,EAA6B;AAC3D,IAAA,IAAI,CAAC,eAAA,CAAgB,KAAA,EAAO,EAAE,CAAA,EAAG;AAC/B,MAAA,OAAA,CAAQ,IAAA,CAAK,mEAAA,EAAqE,KAAA,EAAO,EAAE,CAAA;AAC3F,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,EAAO,KAAA,CAAM,EAAE,CAAA;AAC3B,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,KAAA,CAAM,EAAE,CAAA;AAChC,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,UAAA,CAAW,KAAA,EAAO,KAAK,CAAA;AAC9C,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,aAAA,EAAc,CAAE,QAAA;AACvC,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,WAAA,CAAY,SAAS,KAAA,EAAO,KAAA,CAAM,EAAA,EAAI,CAAA,EAAG,QAAQ,CAAA;AAC9E,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,IAAA,CAAK,kBAAA,CAAmB,OAAO,SAAS,CAAA;AACxC,IAAA,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAA,EAAO,SAAS,CAAA;AAAA,EAC5C;AAAA,EAEA,MAAM,QAAA,CACJ,KAAA,EACA,QAAA,EACA,MACA,QAAA,EACuB;AAEvB,IAAA,IAAI,CAAC,gBAAgB,QAAQ,CAAA,IAAK,KAAK,QAAA,CAAS,KAAA,EAAO,QAAQ,CAAA,EAAG;AAChE,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,QAAQ,CAAA;AAEhC,IAAA,IAAI,QAAA,GAAyB,IAAA;AAC7B,IAAA,IAAI,MAAM,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,KAAA,EAAO,QAAQ,CAAA,EAAG;AAChD,MAAA,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,OAAO,QAAQ,CAAA;AACvD,MAAA,MAAM,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,KAAA,EAAO,QAAQ,CAAA;AAAA,IAC7C;AAEA,IAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAK,WAAA,CAAY,SAAS,KAAA,EAAO,QAAA,EAAU,MAAM,QAAQ,CAAA;AAC7E,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,kBAAA,CAAmB,UAAU,KAAK,CAAA;AAIvC,MAAA,MAAM,UAAA,GAAa,SAAS,uBAAA,EAAwB;AACpD,MAAA,MAAM,UAAA,GAAa,MAAM,uBAAA,EAAwB;AACjD,MAAA,IAAI,eAAe,UAAA,EAAY;AAC7B,QAAA,MAAM,SAAA,GAAY,QAAA,CAAS,aAAA,EAAc,CAAE,SAAA;AAC3C,QAAA,MAAM,GAAA,GAAM,MAAM,aAAA,EAAc;AAChC,QAAA,IAAI,SAAA,GAAY,IAAI,SAAA,EAAW;AAC7B,UAAA,KAAA,CAAM,aAAA,CAAc,IAAIA,4BAAA,CAAW,GAAA,CAAI,MAAM,GAAA,CAAI,QAAA,EAAU,SAAS,CAAC,CAAA;AACrE,UAAA,MAAM,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA;AAAA,QAC1C;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA;AACtC,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,mBAAA,CACJ,KAAA,EACA,QAAA,EACA,UAAA,EACuB;AACvB,IAAA,IAAI,CAAC,gBAAgB,QAAQ,CAAA,IAAK,KAAK,QAAA,CAAS,KAAA,EAAO,QAAQ,CAAA,EAAG,OAAO,IAAA;AAEzE,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,QAAQ,CAAA;AAGhC,IAAA,IAAI,QAAA,GAAyB,IAAA;AAC7B,IAAA,IAAI,MAAM,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,KAAA,EAAO,QAAQ,CAAA,EAAG;AAChD,MAAA,QAAA,GAAW,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,OAAO,QAAQ,CAAA;AACvD,MAAA,MAAM,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,KAAA,EAAO,QAAQ,CAAA;AAAA,IAC7C;AAEA,IAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,YAAY,mBAAA,CAAoB,KAAA,EAAO,UAAU,UAAU,CAAA;AACpF,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAO,QAAA;AAAA,IACT;AAEA,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,IAAA,CAAK,kBAAA,CAAmB,UAAU,KAAK,CAAA;AAAA,IACzC;AAEA,IAAA,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA;AACtC,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAGQ,kBAAA,CAAmB,MAAa,EAAA,EAAiB;AACvD,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,GAAG,CAAA,IAAK,IAAA,CAAK,gBAAe,EAAG;AAC/C,MAAA,MAAM,MAAA,GAAS,EAAA,CAAG,cAAA,EAAe,CAAE,IAAI,IAAI,CAAA;AAC3C,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,MAAM,IAAA,GAAO,OAAO,UAAA,EAAW;AAC/B,MAAA,IAAA,CAAK,KAAA,EAAM;AACX,MAAA,KAAA,MAAW,CAAC,KAAA,EAAO,MAAM,CAAA,IAAK,GAAA,CAAI,YAAW,EAAG;AAC9C,QAAA,IAAA,CAAK,GAAA,CAAI,OAAO,MAAsB,CAAA;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,CACJ,KAAA,EACA,QAAA,EACA,eAAA,EACgB;AAChB,IAAA,IAAI,CAAC,eAAA,CAAgB,QAAQ,CAAA,IAAK,IAAA,CAAK,SAAS,KAAA,EAAO,QAAQ,CAAA,EAAG,OAAO,EAAC;AAC1E,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,QAAQ,CAAA;AAChC,IAAA,IAAI,MAAM,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,KAAA,EAAO,QAAQ,CAAA,EAAG;AAChD,MAAA,MAAM,UAAU,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,OAAO,QAAQ,CAAA;AAC5D,MAAA,MAAM,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,KAAA,EAAO,OAAO,CAAA;AAAA,IAC5C;AACA,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,UAAA,CAAW,KAAA,EAAO,UAAU,eAAe,CAAA;AAAA,EACrE;AAAA,EAEA,MAAM,YAAA,CACJ,KAAA,EACA,QAAA,EACA,eAAA,EACmB;AACnB,IAAA,IAAI,CAAC,eAAA,CAAgB,QAAQ,CAAA,IAAK,IAAA,CAAK,SAAS,KAAA,EAAO,QAAQ,CAAA,EAAG,OAAO,EAAC;AAC1E,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,QAAQ,CAAA;AAChC,IAAA,IAAI,MAAM,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,KAAA,EAAO,QAAQ,CAAA,EAAG;AAChD,MAAA,MAAM,UAAU,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,OAAO,QAAQ,CAAA;AAC5D,MAAA,MAAM,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,KAAA,EAAO,OAAO,CAAA;AAAA,IAC5C;AACA,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,YAAA,CAAa,KAAA,EAAO,UAAU,eAAe,CAAA;AAAA,EACvE;AAAA,EAEA,UAAA,CAAW,OAAe,QAAA,EAAwB;AAChD,IAAA,IAAI,CAAC,eAAA,CAAgB,QAAQ,CAAA,EAAG;AAChC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,QAAQ,CAAA;AACzC,IAAA,IAAA,CAAK,UAAA,CAAW,IAAI,GAAG,CAAA;AAEvB,IAAA,IAAA,CAAK,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,OAAA,CAAQ,SAAS,CAAA;AAC5C,IAAA,IAAA,CAAK,SAAA,CAAU,UAAA,CAAW,KAAA,EAAO,QAAQ,CAAA;AAAA,EAC3C;AAAA,EAEA,MAAM,MAAA,CAAO,KAAA,EAAe,QAAA,EAAiC;AAC3D,IAAA,IAAI,CAAC,eAAA,CAAgB,QAAQ,CAAA,EAAG;AAChC,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,QAAQ,CAAA;AAChC,IAAA,IAAA,CAAK,SAAA,CAAU,UAAA,CAAW,KAAA,EAAO,QAAQ,CAAA;AACzC,IAAA,IAAA,CAAK,WAAW,GAAA,CAAI,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,QAAQ,CAAC,CAAA;AAClD,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,KAAA,EAAO,QAAQ,CAAA;AAAA,EAC/C;AAAA,EAEA,MAAM,UAAA,CAAW,KAAA,EAAe,QAAA,EAAiC;AAC/D,IAAA,IAAI,CAAC,gBAAgB,QAAQ,CAAA,IAAK,KAAK,QAAA,CAAS,KAAA,EAAO,QAAQ,CAAA,EAAG;AAClE,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,QAAQ,CAAA;AAChC,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,UAAA,CAAW,KAAA,EAAO,QAAQ,CAAA;AACjD,IAAA,IAAA,CAAK,SAAA,CAAU,UAAA,CAAW,KAAA,EAAO,QAAQ,CAAA;AACzC,IAAA,MAAM,QAAQ,MAAM,IAAA,CAAK,YAAY,QAAA,CAAS,KAAA,EAAO,UAAU,CAAC,CAAA;AAChE,IAAA,IAAI,OAAO,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,EACnD;AAAA,EAEA,MAAM,MAAA,CAAO,KAAA,EAAe,QAAA,EAAoC;AAC9D,IAAA,IAAI,CAAC,eAAA,CAAgB,QAAQ,CAAA,EAAG,OAAO,KAAA;AACvC,IAAA,IAAI,MAAM,IAAA,CAAK,SAAA,CAAU,OAAO,KAAA,EAAO,QAAQ,GAAG,OAAO,IAAA;AACzD,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,KAAA,EAAO,QAAQ,CAAA;AAAA,EAChD;AAAA;AAAA,EAGA,MAAM,iBAAA,CACJ,KAAA,EACA,QAAA,EACA,eAAA,EACA,SACA,SAAA,EACe;AACf,IAAA,IAAI,CAAC,gBAAgB,QAAQ,CAAA,IAAK,KAAK,QAAA,CAAS,KAAA,EAAO,QAAQ,CAAA,EAAG;AAClE,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,QAAQ,CAAA;AAEhC,IAAA,IAAI,MAAM,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,KAAA,EAAO,QAAQ,CAAA,EAAG;AAChD,MAAA,MAAM,UAAU,MAAM,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,OAAO,QAAQ,CAAA;AAC5D,MAAA,MAAM,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,KAAA,EAAO,OAAO,CAAA;AAAA,IAC5C;AACA,IAAA,MAAM,KAAK,WAAA,CAAY,iBAAA,CAAkB,OAAO,QAAA,EAAU,eAAA,EAAiB,SAAS,SAAS,CAAA;AAAA,EAC/F;AAAA,EAEA,MAAM,UAAA,CAAW,KAAA,EAAe,QAAA,EAAkB,MAAA,EAAiC;AACjF,IAAA,IAAI,CAAC,gBAAgB,QAAQ,CAAA,IAAK,KAAK,QAAA,CAAS,KAAA,EAAO,QAAQ,CAAA,EAAG;AAClE,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,QAAQ,CAAA;AAChC,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,UAAA,CAAW,KAAA,EAAO,UAAU,MAAM,CAAA;AAAA,EAC3D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAA,CACJ,KAAA,EACA,QAAA,EACA,MAAA,EAKC;AACD,IAAA,IAAI,CAAC,eAAA,CAAgB,QAAQ,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,KAAA,EAAO,QAAQ,CAAA,IAAK,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AACvF,MAAA,OAAO,EAAE,WAAA,EAAa,CAAA,EAAG,WAAA,EAAa,CAAA,EAAG,WAAW,CAAA,EAAE;AAAA,IACxD;AACA,IAAA,MAAM,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,QAAQ,CAAA;AAChC,IAAA,MAAM,SAAS,MAAM,IAAA,CAAK,YAAY,cAAA,CAAe,KAAA,EAAO,UAAU,MAAM,CAAA;AAG5E,IAAA,MAAM,YAAY,MAAM,IAAA,CAAK,YAAY,QAAA,CAAS,KAAA,EAAO,UAAU,CAAC,CAAA;AACpE,IAAA,IAAI,WAAW,MAAM,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,OAAO,SAAS,CAAA;AACzD,IAAA,OAAO,MAAA;AAAA,EACT;AACF","file":"chunk-5ALMNLUR.cjs","sourcesContent":["// adapters/infra/indexedDbTableRepository.ts\r\n\r\nimport { WindowedTableRepository } from '../../../application/ports/TableRepository';\r\nimport { ColumnSchema } from '../../../domain/types/ColumnSchema';\r\nimport { Cell } from '../../../domain/entities/Cell';\r\nimport { Collection } from '../../../domain/entities/Collection';\r\nimport { Row } from '../../../domain/entities/Row';\r\nimport { CollectionScope, Table } from '../../../domain/entities/Table';\r\nimport {\r\n CellValue,\r\n ColumnId,\r\n Pagination,\r\n RowId,\r\n RowState,\r\n RowStateEnum,\r\n} from '../../../domain/value-objects';\r\n\r\n// ─── Serialization ────────────────────────────────────────────────────────────\r\n\r\ninterface SerializedCell {\r\n colId: string;\r\n value: unknown;\r\n originalValue: unknown;\r\n display: unknown;\r\n}\r\n\r\ninterface SerializedRowRecord {\r\n id: string;\r\n tableId: string;\r\n rowId: number;\r\n collection: string;\r\n sortIndex: number;\r\n rowState: RowStateEnum;\r\n visibilityCondition: Record<string, boolean>;\r\n isSaveDescription: boolean;\r\n cells: SerializedCell[];\r\n}\r\n\r\n/** Plain column fields only — IndexedDB cannot clone functions. */\r\ntype PersistedColumnSchema = {\r\n fieldName: string;\r\n fieldCaption: string;\r\n fieldType: ColumnSchema['fieldType'];\r\n fieldCollection?: string;\r\n order?: number;\r\n editable?: boolean;\r\n isUnique?: boolean;\r\n noCache?: boolean;\r\n expandable?: boolean;\r\n enableDeleteButton?: boolean;\r\n enableExpandButton?: boolean;\r\n enableMoveButton?: boolean;\r\n enableOptionsButton?: boolean;\r\n disable?: boolean;\r\n hidden?: boolean;\r\n className?: string;\r\n visibility: ColumnSchema['visibility'];\r\n selectOptions?: { label: string; value: string | number }[];\r\n minWidth?: number;\r\n style?: ColumnSchema['style'];\r\n popUpWidth?: number;\r\n labelValue?: ColumnSchema['labelValue'];\r\n};\r\n\r\ninterface SerializedCollectionMeta {\r\n name: string;\r\n columns: PersistedColumnSchema[];\r\n}\r\n\r\ninterface SerializedTableMeta {\r\n id: string;\r\n kind: 'meta';\r\n activeCollection: string;\r\n page: number;\r\n pageSize: number;\r\n /** Total rows of the ACTIVE collection (drives pagination). */\r\n totalRows: number;\r\n /** Exact row count per collection name — lets each collection keep its own pagination. */\r\n totalRowsByCollection?: Record<string, number>;\r\n /** 2 = row record keys are collection-scoped (table::collection::rowId). */\r\n recordKeyVersion?: number;\r\n collections: SerializedCollectionMeta[];\r\n}\r\n\r\n/** Legacy blob format (pre page-window) — migrated on read. */\r\ninterface LegacySerializedTable {\r\n id: string;\r\n pages?: string[];\r\n collections: Array<{\r\n name?: string;\r\n type?: string;\r\n rows: Array<{\r\n rowId: number;\r\n cells: SerializedCell[];\r\n rowState: RowStateEnum;\r\n visibilityCondition: Record<string, boolean>;\r\n collection?: string;\r\n rowType?: string;\r\n isSaveDescription: boolean;\r\n }>;\r\n }>;\r\n activeCollection?: string;\r\n activeDetailType?: string;\r\n}\r\n\r\nconst DB_NAME = 'ERP_TABLE_DB';\r\n\r\n/**\r\n * Row record key is COLLECTION-SCOPED: different collections legitimately hold\r\n * rows with the same server PK (e.g. CashStatementId 21 vs TankhahStatementId\r\n * 21). A bare `table::rowId` key made them overwrite each other in IndexedDB.\r\n */\r\nfunction rowRecordId(tableId: string, collection: string, rowId: number): string {\r\n return `${tableId}::${collection}::${rowId}`;\r\n}\r\n\r\nfunction sortIndexOf(row: Row): number {\r\n const raw = row.getCell('index')?.getValue();\r\n const n = Number(raw);\r\n return Number.isFinite(n) ? n : 0;\r\n}\r\n\r\n/** IndexedDB rejects undefined/null/NaN/Infinity/objects as keys. */\r\nfunction isValidIdbKey(value: unknown): value is IDBValidKey {\r\n if (typeof value === 'string') return true;\r\n if (typeof value === 'number') return Number.isFinite(value);\r\n if (value instanceof Date) return !Number.isNaN(value.getTime());\r\n if (Array.isArray(value)) return value.length > 0 && value.every(isValidIdbKey);\r\n if (value instanceof ArrayBuffer) return true;\r\n if (ArrayBuffer.isView(value)) return true;\r\n return false;\r\n}\r\n\r\nfunction asTableIdKey(tableId: unknown): string | null {\r\n if (typeof tableId === 'string' && tableId.length > 0) return tableId;\r\n if (typeof tableId === 'number' && Number.isFinite(tableId)) return String(tableId);\r\n return null;\r\n}\r\n\r\nexport class PagedIndexedDbTableRepository implements WindowedTableRepository {\r\n private dbPromise: Promise<IDBDatabase>;\r\n\r\n constructor() {\r\n this.dbPromise = this.initDb();\r\n }\r\n\r\n private bindDb(db: IDBDatabase): IDBDatabase {\r\n db.onversionchange = () => {\r\n db.close();\r\n console.warn('DB version changed, connection closed');\r\n // Next getDb() must reopen at the new version\r\n this.dbPromise = this.initDb();\r\n };\r\n return db;\r\n }\r\n\r\n /**\r\n * Open at the *existing* DB version (no fixed version number).\r\n * ensureStores() bumps version only when new object stores are needed.\r\n * A fixed open(version) would throw VersionError after lazy upgrades.\r\n */\r\n private initDb(): Promise<IDBDatabase> {\r\n return new Promise((resolve, reject) => {\r\n const request = indexedDB.open(DB_NAME);\r\n request.onsuccess = () => resolve(this.bindDb(request.result));\r\n request.onerror = () => reject(request.error);\r\n });\r\n }\r\n\r\n private async getDb(): Promise<IDBDatabase> {\r\n return this.dbPromise;\r\n }\r\n\r\n private metaStore(storeName: string): string {\r\n return storeName;\r\n }\r\n\r\n private rowsStore(storeName: string): string {\r\n return `${storeName}__rows`;\r\n }\r\n\r\n private async ensureStores(db: IDBDatabase, storeName: string): Promise<IDBDatabase> {\r\n const meta = this.metaStore(storeName);\r\n const rows = this.rowsStore(storeName);\r\n if (db.objectStoreNames.contains(meta) && db.objectStoreNames.contains(rows)) {\r\n return db;\r\n }\r\n\r\n const nextVersion = db.version + 1;\r\n db.close();\r\n const newDb = await new Promise<IDBDatabase>((resolve, reject) => {\r\n const req = indexedDB.open(DB_NAME, nextVersion);\r\n req.onupgradeneeded = (event: IDBVersionChangeEvent) => {\r\n const upgraded = (event.target as IDBOpenDBRequest).result;\r\n if (!upgraded.objectStoreNames.contains(meta)) {\r\n upgraded.createObjectStore(meta, { keyPath: 'id' });\r\n }\r\n if (!upgraded.objectStoreNames.contains(rows)) {\r\n const rowStore = upgraded.createObjectStore(rows, { keyPath: 'id' });\r\n rowStore.createIndex('byTableCollectionSort', ['tableId', 'collection', 'sortIndex'], {\r\n unique: false,\r\n });\r\n rowStore.createIndex('byTable', 'tableId', { unique: false });\r\n }\r\n };\r\n req.onsuccess = () => resolve(this.bindDb(req.result));\r\n req.onerror = () => reject(req.error);\r\n });\r\n\r\n this.dbPromise = Promise.resolve(newDb);\r\n return newDb;\r\n }\r\n\r\n // ─── Row (de)serialization ──────────────────────────────────────────────────\r\n\r\n private serializeRow(tableId: string, row: Row): SerializedRowRecord {\r\n return {\r\n id: rowRecordId(tableId, row.collection, row.id.value),\r\n tableId,\r\n rowId: row.id.value,\r\n collection: row.collection,\r\n sortIndex: sortIndexOf(row),\r\n rowState: row.rowState.value,\r\n visibilityCondition: row.visibilityCondition,\r\n isSaveDescription: row.isSaveDescription,\r\n cells: Array.from(row.getCells().entries()).map(([colId, cell]) => ({\r\n colId,\r\n value: cell.getValue(),\r\n originalValue: cell.getOriginalValue().value,\r\n display: cell.getDisplay(),\r\n })),\r\n };\r\n }\r\n\r\n private deserializeRow(r: SerializedRowRecord): Row {\r\n const cells = new Map<string, Cell>();\r\n r.cells.forEach(c => {\r\n cells.set(\r\n c.colId,\r\n new Cell(\r\n new RowId(r.rowId),\r\n new ColumnId(c.colId),\r\n new CellValue(c.value),\r\n new CellValue(c.originalValue),\r\n new CellValue(c.display),\r\n ),\r\n );\r\n });\r\n\r\n const changeFields = new Set<string>();\r\n if (r.rowState === RowStateEnum.Modified) {\r\n r.cells.forEach(c => {\r\n if (c.value !== c.originalValue) changeFields.add(c.colId);\r\n });\r\n }\r\n\r\n return new Row(\r\n new RowId(r.rowId),\r\n cells,\r\n new RowState(r.rowState),\r\n changeFields,\r\n r.visibilityCondition,\r\n r.collection,\r\n r.isSaveDescription,\r\n );\r\n }\r\n\r\n private serializeColumn(col: ColumnSchema): PersistedColumnSchema {\r\n return {\r\n fieldName: col.fieldName,\r\n fieldCaption: col.fieldCaption,\r\n fieldType: col.fieldType,\r\n fieldCollection: col.fieldCollection,\r\n order: col.order,\r\n editable: col.editable,\r\n isUnique: col.isUnique,\r\n noCache: col.noCache,\r\n expandable: col.expandable,\r\n enableDeleteButton: col.enableDeleteButton,\r\n enableExpandButton: col.enableExpandButton,\r\n enableMoveButton: col.enableMoveButton,\r\n enableOptionsButton: col.enableOptionsButton,\r\n disable: col.disable,\r\n hidden: col.hidden,\r\n className: col.className,\r\n visibility: col.visibility,\r\n selectOptions: col.selectOptions,\r\n minWidth: col.minWidth,\r\n style: col.style,\r\n popUpWidth: col.popUpWidth,\r\n labelValue: col.labelValue,\r\n };\r\n }\r\n\r\n private buildMetaFromTable(\r\n table: Table,\r\n totalRowsOverride?: number,\r\n existing?: SerializedTableMeta | null,\r\n ): SerializedTableMeta {\r\n const id = asTableIdKey(table.id);\r\n if (!id) {\r\n throw new Error(`[PagedIndexedDbTableRepository] Cannot persist meta: invalid table.id (${String(table.id)})`);\r\n }\r\n\r\n const pagination = table.getPagination();\r\n const active = table.getActiveCollectionName() || 'default';\r\n const collections: SerializedCollectionMeta[] = [];\r\n for (const [name, col] of table.getCollections()) {\r\n collections.push({\r\n name,\r\n columns: Array.from(col.getColumns().values()).map(c => this.serializeColumn(c)),\r\n });\r\n }\r\n\r\n // Per-collection counts from the RAM window. The window only holds the\r\n // ACTIVE collection's page; other collections' Maps are empty here.\r\n // Only the ACTIVE count may be overwritten — a zero window count of an\r\n // inactive collection must never clobber its persisted total.\r\n const windowCounts: Record<string, number> = {};\r\n let counted = 0;\r\n let otherCollectionsHaveRows = false;\r\n for (const [name, col] of table.getCollections()) {\r\n const size = col.getRows().size;\r\n if (name === active) windowCounts[name] = size;\r\n else if (size > 0) otherCollectionsHaveRows = true;\r\n counted += size;\r\n }\r\n\r\n // Multi-collection FULL SEED (initial replaceAll): every collection Map\r\n // holds ALL its rows, so the ACTIVE collection's pagination total must be\r\n // ITS OWN count — never the grand total across collections. A page window\r\n // (save path) holds no rows of other collections and keeps the\r\n // override/Math.max behaviour below.\r\n const isFullMultiCollectionSeed = otherCollectionsHaveRows;\r\n const totalRows = isFullMultiCollectionSeed\r\n ? (windowCounts[active] ?? 0)\r\n : totalRowsOverride ?? Math.max(pagination.totalRows, counted);\r\n\r\n const totalRowsByCollection: Record<string, number> = {\r\n ...(existing?.totalRowsByCollection ?? {}),\r\n ...windowCounts,\r\n [active]: totalRows,\r\n };\r\n\r\n if (isFullMultiCollectionSeed) {\r\n // Full seed: every collection Map is complete — per-collection totals\r\n // are exact counts of their own Maps.\r\n for (const [name, col] of table.getCollections()) {\r\n totalRowsByCollection[name] = col.getRows().size;\r\n }\r\n }\r\n\r\n return {\r\n id,\r\n kind: 'meta',\r\n activeCollection: active,\r\n page: pagination.page || 1,\r\n pageSize: pagination.pageSize || 10,\r\n totalRows,\r\n totalRowsByCollection,\r\n collections,\r\n };\r\n }\r\n\r\n private buildTableFromPage(\r\n meta: SerializedTableMeta,\r\n pageRows: Row[],\r\n page: number,\r\n pageSize: number,\r\n ): Table {\r\n const collectionMap = new Map<string, Collection>();\r\n const active = meta.activeCollection || 'default';\r\n\r\n for (const colMeta of meta.collections ?? []) {\r\n const colMap = new Map<string, ColumnSchema>();\r\n for (const c of colMeta.columns ?? []) {\r\n // Persisted columns are plain data; live handlers are reattached from config/RAM\r\n colMap.set(c.fieldName, c as ColumnSchema);\r\n }\r\n collectionMap.set(colMeta.name, new Collection(colMeta.name, new Map(), colMap));\r\n }\r\n\r\n if (!collectionMap.has(active)) {\r\n collectionMap.set(active, new Collection(active, new Map(), new Map()));\r\n }\r\n\r\n for (const row of pageRows) {\r\n const name = row.collection || active;\r\n let collection = collectionMap.get(name);\r\n if (!collection) {\r\n collection = new Collection(name, new Map(), new Map());\r\n collectionMap.set(name, collection);\r\n }\r\n collection.getRows().set(row.id.value, row);\r\n }\r\n\r\n // Pagination total = ACTIVE collection's own count. meta.totalRows may\r\n // transiently hold a grand total after a full multi-collection seed —\r\n // reading it directly made the FIRST render's paginator show every\r\n // collection's rows summed together.\r\n const total = meta.totalRowsByCollection?.[active] ?? meta.totalRows;\r\n return new Table(\r\n meta.id,\r\n collectionMap,\r\n new Pagination(page, pageSize, total),\r\n null,\r\n active,\r\n ).setPageWindow(true);\r\n }\r\n\r\n private async readMeta(\r\n db: IDBDatabase,\r\n storeName: string,\r\n tableId: string,\r\n ): Promise<SerializedTableMeta | LegacySerializedTable | null> {\r\n const key = asTableIdKey(tableId);\r\n if (!key) return null;\r\n\r\n const metaName = this.metaStore(storeName);\r\n if (!db.objectStoreNames.contains(metaName)) return null;\r\n\r\n return new Promise((resolve, reject) => {\r\n const tx = db.transaction(metaName, 'readonly');\r\n const req = tx.objectStore(metaName).get(key);\r\n req.onsuccess = () => resolve((req.result as SerializedTableMeta | LegacySerializedTable) ?? null);\r\n req.onerror = () => reject(req.error);\r\n });\r\n }\r\n\r\n private isLegacy(data: SerializedTableMeta | LegacySerializedTable): data is LegacySerializedTable {\r\n return !('kind' in data) || (data as SerializedTableMeta).kind !== 'meta';\r\n }\r\n\r\n private async migrateLegacy(\r\n db: IDBDatabase,\r\n storeName: string,\r\n legacy: LegacySerializedTable,\r\n ): Promise<SerializedTableMeta> {\r\n const active = legacy.activeCollection ?? legacy.activeDetailType ?? 'default';\r\n const allRows: Row[] = [];\r\n const collections: SerializedCollectionMeta[] = [];\r\n\r\n for (const c of legacy.collections ?? []) {\r\n const name = c.name ?? c.type ?? active;\r\n collections.push({ name, columns: [] });\r\n for (const r of c.rows ?? []) {\r\n allRows.push(\r\n this.deserializeRow({\r\n id: rowRecordId(legacy.id, r.collection ?? r.rowType ?? name, r.rowId),\r\n tableId: legacy.id,\r\n rowId: r.rowId,\r\n collection: r.collection ?? r.rowType ?? name,\r\n sortIndex: 0,\r\n rowState: r.rowState,\r\n visibilityCondition: r.visibilityCondition,\r\n isSaveDescription: r.isSaveDescription,\r\n cells: r.cells,\r\n }),\r\n );\r\n }\r\n }\r\n\r\n // Fix sortIndex from cell values after deserialize\r\n for (const row of allRows) {\r\n // already in row via cells\r\n }\r\n\r\n const meta: SerializedTableMeta = {\r\n id: legacy.id,\r\n kind: 'meta',\r\n activeCollection: active,\r\n page: 1,\r\n pageSize: 10,\r\n totalRows: allRows.length,\r\n collections,\r\n };\r\n\r\n db = await this.ensureStores(db, storeName);\r\n await this.putMeta(db, storeName, meta);\r\n await this.putRows(db, storeName, legacy.id, allRows);\r\n return meta;\r\n }\r\n\r\n private putMeta(db: IDBDatabase, storeName: string, meta: SerializedTableMeta): Promise<void> {\r\n const id = asTableIdKey(meta.id);\r\n if (!id) {\r\n console.warn('[PagedIndexedDbTableRepository] putMeta skipped: invalid id', meta?.id);\r\n return Promise.resolve();\r\n }\r\n\r\n // JSON round-trip strips functions; re-assert id because undefined keys are dropped\r\n let cloneable: SerializedTableMeta;\r\n try {\r\n cloneable = JSON.parse(JSON.stringify({ ...meta, id })) as SerializedTableMeta;\r\n } catch (e) {\r\n console.warn('[PagedIndexedDbTableRepository] putMeta skipped: not serializable', e);\r\n return Promise.resolve();\r\n }\r\n cloneable.id = id;\r\n\r\n if (!isValidIdbKey(cloneable.id)) {\r\n console.warn('[PagedIndexedDbTableRepository] putMeta skipped: id not a valid IDB key', cloneable.id);\r\n return Promise.resolve();\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const tx = db.transaction(this.metaStore(storeName), 'readwrite');\r\n tx.objectStore(this.metaStore(storeName)).put(cloneable);\r\n tx.oncomplete = () => resolve();\r\n tx.onerror = () => reject(tx.error);\r\n });\r\n }\r\n\r\n private putRows(\r\n db: IDBDatabase,\r\n storeName: string,\r\n tableId: string,\r\n rows: Row[],\r\n ): Promise<void> {\r\n const key = asTableIdKey(tableId);\r\n if (!key) {\r\n console.warn('[PagedIndexedDbTableRepository] putRows skipped: invalid tableId', tableId);\r\n return Promise.resolve();\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n const tx = db.transaction(this.rowsStore(storeName), 'readwrite');\r\n const os = tx.objectStore(this.rowsStore(storeName));\r\n for (const row of rows) {\r\n const record = this.serializeRow(key, row);\r\n if (!isValidIdbKey(record.id)) continue;\r\n // Ensure plain cloneable payload\r\n const cloneable = JSON.parse(JSON.stringify(record)) as SerializedRowRecord;\r\n cloneable.id = record.id;\r\n cloneable.tableId = key;\r\n os.put(cloneable);\r\n }\r\n tx.oncomplete = () => resolve();\r\n tx.onerror = () => reject(tx.error);\r\n });\r\n }\r\n\r\n /** Put already-serialized row records directly (no domain Row round-trip). */\r\n private putRowRecords(\r\n db: IDBDatabase,\r\n storeName: string,\r\n records: SerializedRowRecord[],\r\n ): Promise<void> {\r\n if (records.length === 0) return Promise.resolve();\r\n return new Promise((resolve, reject) => {\r\n const tx = db.transaction(this.rowsStore(storeName), 'readwrite');\r\n const os = tx.objectStore(this.rowsStore(storeName));\r\n for (const record of records) {\r\n if (!isValidIdbKey(record.id)) continue;\r\n os.put(JSON.parse(JSON.stringify(record)) as SerializedRowRecord);\r\n }\r\n tx.oncomplete = () => resolve();\r\n tx.onerror = () => reject(tx.error);\r\n });\r\n }\r\n\r\n private async deleteAllRowsForTable(\r\n db: IDBDatabase,\r\n storeName: string,\r\n tableId: string,\r\n ): Promise<void> {\r\n const key = asTableIdKey(tableId);\r\n if (!key) {\r\n console.warn('[PagedIndexedDbTableRepository] deleteAllRows skipped: invalid tableId', tableId);\r\n return;\r\n }\r\n\r\n const rowsName = this.rowsStore(storeName);\r\n if (!db.objectStoreNames.contains(rowsName)) return;\r\n\r\n return new Promise((resolve, reject) => {\r\n const tx = db.transaction(rowsName, 'readwrite');\r\n const store = tx.objectStore(rowsName);\r\n\r\n // Prefer index; fall back to full scan if index/key range fails\r\n const runFullScan = () => {\r\n const req = store.openCursor();\r\n req.onsuccess = () => {\r\n const cursor = req.result;\r\n if (!cursor) return;\r\n const row = cursor.value as SerializedRowRecord;\r\n if (String(row.tableId) === key) cursor.delete();\r\n cursor.continue();\r\n };\r\n };\r\n\r\n try {\r\n if (store.indexNames.contains('byTable') && isValidIdbKey(key)) {\r\n const index = store.index('byTable');\r\n const req = index.openCursor(IDBKeyRange.only(key));\r\n req.onsuccess = () => {\r\n const cursor = req.result;\r\n if (!cursor) return;\r\n cursor.delete();\r\n cursor.continue();\r\n };\r\n req.onerror = () => {\r\n runFullScan();\r\n };\r\n } else {\r\n runFullScan();\r\n }\r\n } catch {\r\n runFullScan();\r\n }\r\n\r\n tx.oncomplete = () => resolve();\r\n tx.onerror = () => reject(tx.error);\r\n });\r\n }\r\n\r\n /**\r\n * Single cursor pass over the byTableCollectionSort index, yielding batches.\r\n * The index gives collection-sorted order — no in-memory sort needed.\r\n * Falls back to a full scan when the index is missing (legacy stores).\r\n * onBatch may return false to stop early.\r\n */\r\n private async iterateRows(\r\n db: IDBDatabase,\r\n storeName: string,\r\n tableId: string,\r\n collection: string | null,\r\n onBatch: (\r\n records: SerializedRowRecord[],\r\n ordinalBase: number,\r\n ) => Promise<boolean | void>,\r\n batchSize = 500,\r\n ): Promise<void> {\r\n const key = asTableIdKey(tableId);\r\n if (!key) return;\r\n\r\n const rowsName = this.rowsStore(storeName);\r\n if (!db.objectStoreNames.contains(rowsName)) return;\r\n\r\n // Collection filter applied in-memory per batch (null = all collections).\r\n // Records from the index arrive already collection-sorted.\r\n const useIndex = collection !== null;\r\n let pending: SerializedRowRecord[] = [];\r\n let ordinal = 0;\r\n let stopped = false;\r\n\r\n const flush = async () => {\r\n if (pending.length === 0 || stopped) return;\r\n const batch = pending;\r\n pending = [];\r\n const base = ordinal;\r\n ordinal += batch.length;\r\n if ((await onBatch(batch, base)) === false) stopped = true;\r\n };\r\n\r\n const batchOrDefer = async (record: SerializedRowRecord | null) => {\r\n if (record) pending.push(record);\r\n if (pending.length >= batchSize) await flush();\r\n };\r\n\r\n if (useIndex && collection) {\r\n const runIndexed = () =>\r\n new Promise<void>((resolve, reject) => {\r\n const tx = db.transaction(rowsName, 'readonly');\r\n const index = tx.objectStore(rowsName).index('byTableCollectionSort');\r\n // Infinity is not a valid IndexedDB key — use safe numeric bounds\r\n const range = IDBKeyRange.bound(\r\n [key, collection, Number.MIN_SAFE_INTEGER],\r\n [key, collection, Number.MAX_SAFE_INTEGER],\r\n );\r\n const req = index.openCursor(range);\r\n req.onsuccess = async () => {\r\n const cursor = req.result;\r\n if (!cursor || stopped) {\r\n await flush();\r\n resolve();\r\n return;\r\n }\r\n await batchOrDefer(cursor.value as SerializedRowRecord);\r\n if (stopped) {\r\n await flush();\r\n resolve();\r\n return;\r\n }\r\n cursor.continue();\r\n };\r\n req.onerror = () => reject(req.error);\r\n });\r\n\r\n try {\r\n await runIndexed();\r\n return;\r\n } catch {\r\n // Index missing/corrupt — fall through to full scan below.\r\n pending = [];\r\n ordinal = 0;\r\n stopped = false;\r\n }\r\n }\r\n\r\n // Fallback: full scan (also serves collectionScope = 'all' / null collection)\r\n await new Promise<void>((resolve, reject) => {\r\n const tx = db.transaction(rowsName, 'readonly');\r\n const store = tx.objectStore(rowsName);\r\n const req = store.openCursor();\r\n req.onsuccess = async () => {\r\n const cursor = req.result;\r\n if (!cursor || stopped) {\r\n await flush();\r\n resolve();\r\n return;\r\n }\r\n const record = cursor.value as SerializedRowRecord;\r\n if (String(record.tableId) === key && (!collection || record.collection === collection)) {\r\n await batchOrDefer(record);\r\n if (stopped) {\r\n await flush();\r\n resolve();\r\n return;\r\n }\r\n }\r\n cursor.continue();\r\n };\r\n req.onerror = () => reject(req.error);\r\n });\r\n }\r\n\r\n /**\r\n * Page-window read via cursor + offset on the sorted index.\r\n * Only `pageSize` records cross the heap — not the whole collection.\r\n */\r\n private async queryPageRows(\r\n db: IDBDatabase,\r\n storeName: string,\r\n tableId: string,\r\n collection: string,\r\n page: number,\r\n pageSize: number,\r\n ): Promise<Row[]> {\r\n const start = Math.max(0, (page - 1) * pageSize);\r\n const picked: SerializedRowRecord[] = [];\r\n\r\n await this.iterateRows(\r\n db,\r\n storeName,\r\n tableId,\r\n collection,\r\n async (records, ordinalBase) => {\r\n // Batch overlaps the page window?\r\n if (ordinalBase + records.length > start && picked.length < pageSize) {\r\n for (let i = 0; i < records.length; i++) {\r\n const pos = ordinalBase + i;\r\n if (pos >= start && pos < start + pageSize) {\r\n picked.push(records[i]);\r\n if (picked.length === pageSize) return false; // early stop\r\n }\r\n }\r\n }\r\n if (ordinalBase > start + pageSize) return false;\r\n },\r\n Math.max(pageSize, 500),\r\n );\r\n\r\n return picked.map(r => this.deserializeRow(r));\r\n }\r\n\r\n private async queryAllRowRecords(\r\n db: IDBDatabase,\r\n storeName: string,\r\n tableId: string,\r\n ): Promise<SerializedRowRecord[]> {\r\n const key = asTableIdKey(tableId);\r\n if (!key) return [];\r\n\r\n const rowsName = this.rowsStore(storeName);\r\n if (!db.objectStoreNames.contains(rowsName)) return [];\r\n\r\n return new Promise((resolve, reject) => {\r\n const tx = db.transaction(rowsName, 'readonly');\r\n const store = tx.objectStore(rowsName);\r\n\r\n if (store.indexNames.contains('byTable') && isValidIdbKey(key)) {\r\n try {\r\n const index = store.index('byTable');\r\n const req = index.getAll(IDBKeyRange.only(key));\r\n req.onsuccess = () => resolve((req.result as SerializedRowRecord[]) ?? []);\r\n req.onerror = () => reject(req.error);\r\n return;\r\n } catch {\r\n /* fall through */\r\n }\r\n }\r\n\r\n const req = store.getAll();\r\n req.onsuccess = () => {\r\n const all = (req.result as SerializedRowRecord[]) ?? [];\r\n resolve(all.filter(r => String(r.tableId) === key));\r\n };\r\n req.onerror = () => reject(req.error);\r\n });\r\n }\r\n\r\n private async ensureMeta(\r\n db: IDBDatabase,\r\n storeName: string,\r\n tableId: string,\r\n ): Promise<{ db: IDBDatabase; meta: SerializedTableMeta }> {\r\n const key = asTableIdKey(tableId);\r\n if (!key) {\r\n throw new Error(`[PagedIndexedDbTableRepository] ensureMeta: invalid tableId (${String(tableId)})`);\r\n }\r\n\r\n let current = await this.getDb().then(d => this.ensureStores(d, storeName));\r\n let raw = await this.readMeta(current, storeName, key);\r\n if (!raw) {\r\n throw new Error(`Table ${key} not found`);\r\n }\r\n if (this.isLegacy(raw)) {\r\n const migrated = await this.migrateLegacy(current, storeName, raw);\r\n current = await this.getDb();\r\n return { db: current, meta: migrated };\r\n }\r\n if (raw.recordKeyVersion !== 2) {\r\n // Pre-collection-scoped-keys format: row records were stored under\r\n // `table::rowId`, so rows of different collections sharing a server PK\r\n // had already clobbered each other. Re-key existing records once, then\r\n // continue at v2.\r\n const migrated = await this.migrateToCollectionScopedKeys(current, storeName, raw);\r\n current = await this.getDb();\r\n return { db: current, meta: migrated };\r\n }\r\n return { db: current, meta: raw };\r\n }\r\n\r\n /**\r\n * One-time re-key: `table::rowId` → `table::collection::rowId`.\r\n * Old-format records may collide (same PK in different collections overwrote\r\n * each other); after re-keying, per-collection counts in meta are re-derived\r\n * from the actual records so pagination stops being scrambled.\r\n */\r\n private async migrateToCollectionScopedKeys(\r\n db: IDBDatabase,\r\n storeName: string,\r\n meta: SerializedTableMeta,\r\n ): Promise<SerializedTableMeta> {\r\n db = await this.ensureStores(db, storeName);\r\n const rowsName = this.rowsStore(storeName);\r\n\r\n await new Promise<void>((resolve, reject) => {\r\n const tx = db.transaction(rowsName, 'readwrite');\r\n const store = tx.objectStore(rowsName);\r\n const rekey = (src: IDBObjectStore) => {\r\n const req = src.openCursor();\r\n req.onsuccess = () => {\r\n const cursor = req.result;\r\n if (!cursor) return;\r\n const rec = cursor.value as SerializedRowRecord;\r\n // Old format `table::rowId` has exactly 2 '::' segments; the new\r\n // collection-scoped key has 3. (Old ids DO contain '::', so a\r\n // substring check is wrong.)\r\n const segments = typeof rec.id === 'string' ? rec.id.split('::').length : 0;\r\n if (String(rec.tableId) === (meta.id ?? '') && segments === 2) {\r\n const rec2 = { ...rec, id: rowRecordId(rec.tableId, rec.collection, rec.rowId) };\r\n cursor.delete();\r\n store.put(JSON.parse(JSON.stringify(rec2)) as SerializedRowRecord);\r\n }\r\n cursor.continue();\r\n };\r\n req.onerror = () => reject(req.error);\r\n };\r\n rekey(store);\r\n tx.oncomplete = () => resolve();\r\n tx.onerror = () => reject(tx.error);\r\n });\r\n\r\n // Recount every collection from actual persisted records (cursor-based).\r\n const counts: Record<string, number> = {};\r\n await this.iterateRows(\r\n db,\r\n storeName,\r\n meta.id ?? '',\r\n null,\r\n async records => {\r\n for (const rec of records) {\r\n counts[rec.collection] = (counts[rec.collection] ?? 0) + 1;\r\n }\r\n },\r\n );\r\n\r\n const next: SerializedTableMeta = {\r\n ...meta,\r\n recordKeyVersion: 2,\r\n totalRowsByCollection: counts,\r\n totalRows: counts[meta.activeCollection || 'default'] ?? meta.totalRows ?? 0,\r\n };\r\n await this.putMeta(db, storeName, next);\r\n return next;\r\n }\r\n\r\n // ─── TableRepository ────────────────────────────────────────────────────────\r\n\r\n async getById(storeName: string, tableId: string): Promise<Table> {\r\n const key = asTableIdKey(tableId);\r\n if (!key) {\r\n throw new Error(`[PagedIndexedDbTableRepository] getById: invalid tableId (${String(tableId)})`);\r\n }\r\n\r\n let db = await this.getDb();\r\n db = await this.ensureStores(db, storeName);\r\n const { db: d2, meta } = await this.ensureMeta(db, storeName, key);\r\n const page = meta.page || 1;\r\n const pageSize = meta.pageSize || 10;\r\n const rows = await this.queryPageRows(\r\n d2,\r\n storeName,\r\n key,\r\n meta.activeCollection || 'default',\r\n page,\r\n pageSize,\r\n );\r\n return this.buildTableFromPage(meta, rows, page, pageSize);\r\n }\r\n\r\n async save(storeName: string, table: Table): Promise<void> {\r\n const key = asTableIdKey(table?.id);\r\n if (!key) {\r\n console.warn('[PagedIndexedDbTableRepository] save skipped: invalid table.id', table?.id);\r\n return;\r\n }\r\n\r\n let db = await this.getDb();\r\n db = await this.ensureStores(db, storeName);\r\n\r\n let existingTotal = table.getPagination().totalRows;\r\n let existingMeta: SerializedTableMeta | null = null;\r\n try {\r\n const raw = await this.readMeta(db, storeName, key);\r\n if (raw && !this.isLegacy(raw)) {\r\n existingMeta = raw;\r\n existingTotal = Math.max(existingTotal, raw.totalRows);\r\n }\r\n } catch {\r\n /* first save */\r\n }\r\n\r\n // Prefer explicit pagination.totalRows from domain (add/delete update it).\r\n const totalRows = Math.max(existingTotal, table.getPagination().totalRows);\r\n // Pass existing meta so other collections' persisted row counts survive a\r\n // save from the page window (which holds no rows of other collections).\r\n const meta = this.buildMetaFromTable(table, totalRows, existingMeta);\r\n await this.putMeta(db, storeName, meta);\r\n\r\n const rows: Row[] = [];\r\n for (const col of table.getCollections().values()) {\r\n rows.push(...col.getRows().values());\r\n }\r\n await this.putRows(db, storeName, key, rows);\r\n }\r\n\r\n async replaceAll(storeName: string, table: Table): Promise<void> {\r\n const key = asTableIdKey(table?.id);\r\n if (!key) {\r\n console.warn('[PagedIndexedDbTableRepository] replaceAll skipped: invalid table.id', table?.id);\r\n return;\r\n }\r\n\r\n let db = await this.getDb();\r\n db = await this.ensureStores(db, storeName);\r\n\r\n // Other collections' rows must SURVIVE a replace of the active collection.\r\n // Keep their persisted records + counts and re-put them after the wipe.\r\n let survivorRecords: SerializedRowRecord[] = [];\r\n try {\r\n const raw = await this.readMeta(db, storeName, key);\r\n if (raw && !this.isLegacy(raw)) {\r\n const active = raw.activeCollection || 'default';\r\n // Collections fully present in the incoming table are re-seeded below\r\n // (bootstrap passes ALL collections) — their stale records must NOT be\r\n // resurrected after the wipe, or counts/rows get scrambled again.\r\n const incoming = new Set<string>();\r\n for (const col of table.getCollections().values()) {\r\n if (col.getRows().size > 0) incoming.add(col.getCollectionName());\r\n }\r\n const allRecords = await this.queryAllRowRecords(db, storeName, key);\r\n survivorRecords = allRecords.filter(\r\n r => r.collection !== active && !incoming.has(r.collection),\r\n );\r\n }\r\n } catch {\r\n /* first write — nothing to preserve */\r\n }\r\n\r\n const rows: Row[] = [];\r\n for (const col of table.getCollections().values()) {\r\n rows.push(...col.getRows().values());\r\n }\r\n\r\n await this.deleteAllRowsForTable(db, storeName, key);\r\n const meta = this.buildMetaFromTable(table, rows.length);\r\n meta.page = 1;\r\n meta.recordKeyVersion = 2;\r\n // Re-apply exact counts of surviving collections (window holds only the active one)\r\n const survivorCounts: Record<string, number> = {};\r\n for (const rec of survivorRecords) {\r\n survivorCounts[rec.collection] = (survivorCounts[rec.collection] ?? 0) + 1;\r\n }\r\n for (const [name, count] of Object.entries(survivorCounts)) {\r\n meta.totalRowsByCollection = meta.totalRowsByCollection ?? {};\r\n meta.totalRowsByCollection[name] = count;\r\n }\r\n await this.putMeta(db, storeName, meta);\r\n await this.putRows(db, storeName, key, rows);\r\n if (survivorRecords.length > 0) {\r\n await this.putRowRecords(db, storeName, survivorRecords);\r\n }\r\n }\r\n\r\n async loadPage(\r\n storeName: string,\r\n tableId: string,\r\n page: number,\r\n pageSize?: number,\r\n ): Promise<Table | null> {\r\n const key = asTableIdKey(tableId);\r\n if (!key) {\r\n // Leaving page / unmount — do not throw, do not touch IDB\r\n console.warn('[PagedIndexedDbTableRepository] loadPage skipped: invalid tableId', tableId);\r\n return null;\r\n }\r\n\r\n let db = await this.getDb();\r\n db = await this.ensureStores(db, storeName);\r\n const { db: d2, meta } = await this.ensureMeta(db, storeName, key);\r\n const size = pageSize ?? meta.pageSize ?? 10;\r\n const totalPages = Math.max(1, Math.ceil(Math.max(0, meta.totalRows) / Math.max(1, size)));\r\n const safePage = Math.max(1, Math.min(page, totalPages));\r\n\r\n const active = meta.activeCollection || 'default';\r\n const rows = await this.queryPageRows(\r\n d2,\r\n storeName,\r\n key,\r\n active,\r\n safePage,\r\n size,\r\n );\r\n\r\n // meta.totalRows is the ACTIVE collection's total; fall back for legacy metas\r\n const activeTotal = meta.totalRowsByCollection?.[active] ?? meta.totalRows ?? 0;\r\n const activeTotalPages = Math.max(1, Math.ceil(Math.max(0, activeTotal) / Math.max(1, size)));\r\n const collectionSafePage = Math.max(1, Math.min(safePage, activeTotalPages));\r\n\r\n let pageRows = rows;\r\n if (collectionSafePage !== safePage) {\r\n pageRows = await this.queryPageRows(d2, storeName, key, active, collectionSafePage, size);\r\n }\r\n\r\n meta.page = collectionSafePage;\r\n meta.pageSize = size;\r\n await this.putMeta(d2, storeName, meta);\r\n return this.buildTableFromPage(meta, pageRows, collectionSafePage, size);\r\n }\r\n\r\n /**\r\n * Persist the new active collection (page back to 1) and return a RAM window\r\n * holding page 1 of that collection only. Rows of other collections stay\r\n * untouched in IndexedDB — the returned Table contains no other-collection rows.\r\n */\r\n async setActiveCollection(\r\n storeName: string,\r\n tableId: string,\r\n collection: string,\r\n ): Promise<Table | null> {\r\n const key = asTableIdKey(tableId);\r\n if (!key) return null;\r\n\r\n let db = await this.getDb();\r\n db = await this.ensureStores(db, storeName);\r\n const { db: d2, meta } = await this.ensureMeta(db, storeName, key);\r\n\r\n if (!meta.collections?.some(c => c.name === collection)) {\r\n console.warn(`[PagedIndexedDbTableRepository] setActiveCollection: unknown collection \"${collection}\"`);\r\n return null;\r\n }\r\n\r\n const pageSize = meta.pageSize || 10;\r\n const total = meta.totalRowsByCollection?.[collection] ?? 0;\r\n const rows = await this.queryPageRows(d2, storeName, key, collection, 1, pageSize);\r\n\r\n meta.activeCollection = collection;\r\n meta.page = 1;\r\n meta.totalRows = total;\r\n await this.putMeta(d2, storeName, meta);\r\n\r\n return this.buildTableFromPage(meta, rows, 1, pageSize);\r\n }\r\n\r\n async getAllRows(\r\n storeName: string,\r\n tableId: string,\r\n collectionScope: CollectionScope = 'active',\r\n ): Promise<Row[]> {\r\n const key = asTableIdKey(tableId);\r\n if (!key) return [];\r\n\r\n let db = await this.getDb();\r\n db = await this.ensureStores(db, storeName);\r\n const { db: d2, meta } = await this.ensureMeta(db, storeName, key);\r\n const records = await this.queryAllRowRecords(d2, storeName, key);\r\n let rows = records.map(r => this.deserializeRow(r));\r\n\r\n if (collectionScope === 'all') {\r\n return rows.sort((a, b) => sortIndexOf(a) - sortIndexOf(b));\r\n }\r\n if (Array.isArray(collectionScope)) {\r\n const set = new Set(collectionScope);\r\n rows = rows.filter(r => set.has(r.collection));\r\n } else {\r\n const active = meta.activeCollection || 'default';\r\n rows = rows.filter(r => r.collection === active);\r\n }\r\n return rows.sort((a, b) => sortIndexOf(a) - sortIndexOf(b));\r\n }\r\n\r\n async getAllRowIds(\r\n storeName: string,\r\n tableId: string,\r\n collectionScope: CollectionScope = 'active',\r\n ): Promise<number[]> {\r\n const key = asTableIdKey(tableId);\r\n if (!key) return [];\r\n\r\n let db = await this.getDb();\r\n db = await this.ensureStores(db, storeName);\r\n const { db: d2, meta } = await this.ensureMeta(db, storeName, key);\r\n let records = await this.queryAllRowRecords(d2, storeName, key);\r\n\r\n if (collectionScope === 'all') {\r\n // keep all\r\n } else if (Array.isArray(collectionScope)) {\r\n const set = new Set(collectionScope);\r\n records = records.filter(r => set.has(r.collection));\r\n } else {\r\n const active = meta.activeCollection || 'default';\r\n records = records.filter(r => r.collection === active);\r\n }\r\n\r\n records.sort((a, b) => a.sortIndex - b.sortIndex);\r\n return records.map(r => r.rowId);\r\n }\r\n\r\n clearLocal(_store: string, _tableKey: string): void {\r\n // IndexedDB has no RAM window\r\n }\r\n\r\n async flush(_store: string, _tableKey: string): Promise<void> {\r\n // Direct IDB writes are awaited; nothing to flush\r\n }\r\n\r\n async exists(storeName: string, tableId: string): Promise<boolean> {\r\n const key = asTableIdKey(tableId);\r\n if (!key) return false;\r\n const db = await this.getDb();\r\n const metaName = this.metaStore(storeName);\r\n if (!db.objectStoreNames.contains(metaName)) return false;\r\n\r\n return new Promise(resolve => {\r\n const tx = db.transaction(metaName, 'readonly');\r\n const req = tx.objectStore(metaName).get(key);\r\n req.onsuccess = () => resolve(Boolean(req.result));\r\n req.onerror = () => resolve(false);\r\n });\r\n }\r\n\r\n async delete(storeName: string, tableId: string): Promise<void> {\r\n const key = asTableIdKey(tableId);\r\n if (!key) {\r\n console.warn('[PagedIndexedDbTableRepository] delete skipped: invalid tableId', tableId);\r\n return;\r\n }\r\n\r\n let db = await this.getDb();\r\n if (!db.objectStoreNames.contains(this.metaStore(storeName))) return;\r\n db = await this.ensureStores(db, storeName);\r\n\r\n await this.deleteAllRowsForTable(db, storeName, key);\r\n\r\n await new Promise<void>((resolve, reject) => {\r\n const tx = db.transaction(this.metaStore(storeName), 'readwrite');\r\n tx.objectStore(this.metaStore(storeName)).delete(key);\r\n tx.oncomplete = () => resolve();\r\n tx.onerror = () => reject(tx.error);\r\n });\r\n }\r\n\r\n async resetTable(storeName: string, tableId: string): Promise<void> {\r\n const key = asTableIdKey(tableId);\r\n if (!key) {\r\n console.warn('[PagedIndexedDbTableRepository] resetTable skipped: invalid tableId', tableId);\r\n return;\r\n }\r\n\r\n let db = await this.getDb();\r\n if (!db.objectStoreNames.contains(this.metaStore(storeName))) return;\r\n db = await this.ensureStores(db, storeName);\r\n\r\n const raw = await this.readMeta(db, storeName, key);\r\n if (!raw) throw new Error(`Table ${key} not found`);\r\n\r\n await this.deleteAllRowsForTable(db, storeName, key);\r\n\r\n const active = this.isLegacy(raw)\r\n ? (raw.activeCollection ?? raw.activeDetailType ?? 'default')\r\n : raw.activeCollection;\r\n\r\n const meta: SerializedTableMeta = {\r\n id: key,\r\n kind: 'meta',\r\n activeCollection: active,\r\n page: 1,\r\n pageSize: this.isLegacy(raw) ? 10 : raw.pageSize || 10,\r\n totalRows: 0,\r\n collections: this.isLegacy(raw)\r\n ? []\r\n : (raw.collections ?? []).map(c => ({ name: c.name, columns: c.columns ?? [] })),\r\n };\r\n await this.putMeta(db, storeName, meta);\r\n }\r\n\r\n /**\r\n * Port: stream serialized row records in bounded batches (cursor over the\r\n * sorted index). 'active' → index cursor on the active collection;\r\n * 'all'/array → full scan filtered in-memory per batch. Heap = one batch.\r\n */\r\n async iterateRowRecords(\r\n storeName: string,\r\n tableId: string,\r\n collectionScope: CollectionScope = 'active',\r\n onBatch: (\r\n records: {\r\n rowId: number;\r\n collection: string;\r\n sortIndex: number;\r\n rowState: string;\r\n cells: Record<string, { value: unknown; originalValue: unknown; display: unknown }>;\r\n }[],\r\n ordinalBase: number,\r\n ) => Promise<boolean | void>,\r\n batchSize = 500,\r\n ): Promise<void> {\r\n const key = asTableIdKey(tableId);\r\n if (!key) return;\r\n\r\n let db = await this.getDb();\r\n db = await this.ensureStores(db, storeName);\r\n const { db: d2, meta } = await this.ensureMeta(db, storeName, key);\r\n const active = meta.activeCollection || 'default';\r\n const collection =\r\n collectionScope === 'active' ? active : null; // 'all' / array → full scan + filter\r\n\r\n if (collection !== null) {\r\n // Normalize to the port contract: cells as colId → cell Record (raw\r\n // StoredRowRecord keeps cells as an array — that shape broke consumers\r\n // like grid search and the Excel column scan).\r\n const normalized = async (\r\n records: SerializedRowRecord[],\r\n ordinalBase: number,\r\n ): Promise<boolean | void> =>\r\n onBatch(\r\n records.map(r => ({\r\n rowId: r.rowId,\r\n collection: r.collection,\r\n sortIndex: r.sortIndex,\r\n rowState: r.rowState,\r\n cells: Object.fromEntries(\r\n r.cells.map(c => [c.colId, { value: c.value, originalValue: c.originalValue, display: c.display }]),\r\n ),\r\n })),\r\n ordinalBase,\r\n );\r\n await this.iterateRows(d2, storeName, key, collection, normalized, batchSize);\r\n return;\r\n }\r\n\r\n const allowed = collectionScope === 'all' ? null : new Set(collectionScope as string[]);\r\n await this.iterateRows(\r\n d2,\r\n storeName,\r\n key,\r\n null,\r\n async (records, ordinalBase) => {\r\n const filtered = allowed ? records.filter(r => allowed.has(r.collection)) : records;\r\n if (filtered.length === 0) return;\r\n return onBatch(\r\n filtered.map(r => ({\r\n rowId: r.rowId,\r\n collection: r.collection,\r\n sortIndex: r.sortIndex,\r\n rowState: r.rowState,\r\n cells: Object.fromEntries(\r\n r.cells.map(c => [c.colId, { value: c.value, originalValue: c.originalValue, display: c.display }]),\r\n ),\r\n })),\r\n ordinalBase,\r\n );\r\n },\r\n batchSize,\r\n );\r\n }\r\n\r\n /**\r\n * Bulk soft/hard delete directly on persisted records in ONE readwrite\r\n * transaction — cursor over the `byTable` index (no full hydration, heap\r\n * stays O(1)). `Added` → hard delete; others → cursor.update to Deleted;\r\n * already-Deleted → untouched. Never goes through replaceAll.\r\n */\r\n async softDeleteRows(\r\n storeName: string,\r\n tableId: string,\r\n rowIds: number[],\r\n ): Promise<{\r\n softDeleted: number;\r\n hardRemoved: number;\r\n remaining: number;\r\n }> {\r\n const key = asTableIdKey(tableId);\r\n if (!key || rowIds.length === 0) {\r\n return { softDeleted: 0, hardRemoved: 0, remaining: 0 };\r\n }\r\n const wanted = new Set(rowIds);\r\n let softDeleted = 0;\r\n let hardRemoved = 0;\r\n let remaining = 0;\r\n\r\n const deleteOne = (record: SerializedRowRecord, recordStore: IDBObjectStore): void => {\r\n if (record.rowState === RowStateEnum.Added) {\r\n recordStore.delete(rowRecordId(key, record.collection, record.rowId));\r\n hardRemoved += 1;\r\n return;\r\n }\r\n if (record.rowState === RowStateEnum.Deleted) {\r\n return; // already deleted — no restore on bulk delete\r\n }\r\n record.rowState = RowStateEnum.Deleted;\r\n // Strip per-cell change markers: after a bulk delete the row is fully\r\n // Deleted — value-vs-original diffing must not resurrect change flags.\r\n record.cells = record.cells.map(c => ({ ...c, originalValue: c.value }));\r\n recordStore.put(JSON.parse(JSON.stringify(record)) as SerializedRowRecord);\r\n softDeleted += 1;\r\n };\r\n\r\n let db = await this.getDb();\r\n db = await this.ensureStores(db, storeName);\r\n const rowsName = this.rowsStore(storeName);\r\n\r\n await new Promise<void>((resolve, reject) => {\r\n const tx = db.transaction([rowsName, this.metaStore(storeName)], 'readwrite');\r\n const recordStore = tx.objectStore(rowsName);\r\n\r\n // Runs AFTER the cursor pass finished (counts are final): update meta\r\n // within the SAME transaction — O(1), no scan. Chained from cursor\r\n // completion so it never races the delete/update callbacks.\r\n const finishMeta = () => {\r\n const metaReq = tx.objectStore(this.metaStore(storeName)).get(key);\r\n metaReq.onsuccess = () => {\r\n const meta = metaReq.result as SerializedTableMeta | undefined;\r\n if (meta && meta.kind === 'meta') {\r\n const active = meta.activeCollection || 'default';\r\n const activeTotal =\r\n meta.totalRowsByCollection?.[active] ?? meta.totalRows ?? 0;\r\n remaining = Math.max(0, activeTotal - softDeleted - hardRemoved);\r\n meta.totalRows = remaining;\r\n if (meta.totalRowsByCollection) {\r\n meta.totalRowsByCollection[active] = remaining;\r\n }\r\n tx.objectStore(this.metaStore(storeName)).put(\r\n JSON.parse(JSON.stringify(meta)) as SerializedTableMeta,\r\n );\r\n }\r\n };\r\n metaReq.onerror = () => reject(metaReq.error);\r\n };\r\n\r\n const runFullScan = () => {\r\n const req = recordStore.openCursor();\r\n req.onsuccess = () => {\r\n const cursor = req.result;\r\n if (!cursor) {\r\n finishMeta();\r\n return;\r\n }\r\n const record = cursor.value as SerializedRowRecord;\r\n if (String(record.tableId) === key && wanted.has(record.rowId)) {\r\n deleteOne(record, recordStore);\r\n }\r\n cursor.continue();\r\n };\r\n req.onerror = () => reject(req.error);\r\n };\r\n\r\n const runIndexed = () => {\r\n const index = recordStore.index('byTable');\r\n const req = index.openCursor(IDBKeyRange.only(key));\r\n req.onsuccess = () => {\r\n const cursor = req.result;\r\n if (!cursor) {\r\n finishMeta();\r\n return;\r\n }\r\n const record = cursor.value as SerializedRowRecord;\r\n if (wanted.has(record.rowId)) deleteOne(record, recordStore);\r\n cursor.continue();\r\n };\r\n req.onerror = () => reject(req.error);\r\n };\r\n\r\n try {\r\n if (recordStore.indexNames.contains('byTable')) {\r\n runIndexed();\r\n } else {\r\n runFullScan();\r\n }\r\n } catch {\r\n runFullScan();\r\n }\r\n\r\n tx.oncomplete = () => resolve();\r\n tx.onerror = () => reject(tx.error);\r\n tx.onabort = () => reject(tx.error ?? new Error('softDeleteRows aborted'));\r\n });\r\n\r\n return { softDeleted, hardRemoved, remaining };\r\n }\r\n\r\n async removeRows(storeName: string, tableId: string, rowIds: number[]): Promise<void> {\r\n const key = asTableIdKey(tableId);\r\n if (!key || rowIds.length === 0) return;\r\n let db = await this.getDb();\r\n db = await this.ensureStores(db, storeName);\r\n const rowsName = this.rowsStore(storeName);\r\n const wanted = new Set(rowIds);\r\n\r\n await new Promise<void>((resolve, reject) => {\r\n const tx = db.transaction([rowsName, this.metaStore(storeName)], 'readwrite');\r\n const rowStore = tx.objectStore(rowsName);\r\n // Row keys are collection-scoped — hard-removal by id must sweep every\r\n // collection (cursor over the byTable index, no full hydration).\r\n const sweep = (store: IDBObjectStore) => {\r\n const runIndexed = () => {\r\n const req = store.index('byTable').openCursor(IDBKeyRange.only(key));\r\n req.onsuccess = () => {\r\n const cursor = req.result;\r\n if (!cursor) return;\r\n const rec = cursor.value as SerializedRowRecord;\r\n if (wanted.has(rec.rowId)) cursor.delete();\r\n cursor.continue();\r\n };\r\n };\r\n try {\r\n if (store.indexNames.contains('byTable')) runIndexed();\r\n else runFullScan(store);\r\n } catch {\r\n runFullScan(store);\r\n }\r\n };\r\n const runFullScan = (store: IDBObjectStore) => {\r\n const req = store.openCursor();\r\n req.onsuccess = () => {\r\n const cursor = req.result;\r\n if (!cursor) return;\r\n const rec = cursor.value as SerializedRowRecord;\r\n if (String(rec.tableId) === key && wanted.has(rec.rowId)) cursor.delete();\r\n cursor.continue();\r\n };\r\n };\r\n sweep(rowStore);\r\n const metaReq = tx.objectStore(this.metaStore(storeName)).get(key);\r\n metaReq.onsuccess = () => {\r\n const meta = metaReq.result as SerializedTableMeta | undefined;\r\n if (meta && meta.kind === 'meta') {\r\n meta.totalRows = Math.max(0, (meta.totalRows ?? 0) - rowIds.length);\r\n tx.objectStore(this.metaStore(storeName)).put(\r\n JSON.parse(JSON.stringify(meta)) as SerializedTableMeta,\r\n );\r\n }\r\n };\r\n tx.oncomplete = () => resolve();\r\n tx.onerror = () => reject(tx.error);\r\n });\r\n }\r\n}\r\n","// adapters/infra/localTableRepository.ts\r\n\r\nimport { WindowedTableRepository } from '../../../application/ports/TableRepository';\r\nimport { CollectionScope } from '../../../domain/entities/Table';\r\nimport { Row } from '../../../domain/entities/Row';\r\nimport { Table } from '../../../domain/entities/Table';\r\nimport {\r\n ColumnId,\r\n Pagination,\r\n RowState,\r\n RowStateEnum,\r\n} from '../../../domain/value-objects';\r\n\r\n/**\r\n * RAM window only — holds at most the current page of rows for each table.\r\n * IndexedDB is the source of truth; this never stores the full dataset.\r\n */\r\nexport class PagedLocalTableRepository implements WindowedTableRepository {\r\n private tables = new Map<string, Table>();\r\n\r\n async exists(_store: string, tableKey: string): Promise<boolean> {\r\n return this.tables.has(tableKey);\r\n }\r\n\r\n async getById(_store: string, tableKey: string): Promise<Table> {\r\n const table = this.tables.get(tableKey);\r\n if (!table) throw new Error(`Table ${tableKey} not found in local window`);\r\n return table;\r\n }\r\n\r\n async save(_store: string, table: Table): Promise<void> {\r\n this.tables.set(table.id, table);\r\n }\r\n\r\n async replaceAll(_store: string, table: Table): Promise<void> {\r\n this.tables.set(table.id, table);\r\n }\r\n\r\n async loadPage(\r\n _store: string,\r\n tableKey: string,\r\n _page: number,\r\n _pageSize?: number,\r\n ): Promise<Table | null> {\r\n const table = this.tables.get(tableKey);\r\n return table ?? null;\r\n }\r\n\r\n /**\r\n * RAM window: a switch replaces the window with the one returned by the\r\n * IndexedDB layer, so nothing to persist here — just keep the new table.\r\n */\r\n async setActiveCollection(\r\n _store: string,\r\n tableKey: string,\r\n collection: string,\r\n ): Promise<Table | null> {\r\n const table = this.tables.get(tableKey);\r\n if (!table) return null;\r\n table.setActiveCollection(collection);\r\n table.changePage(1);\r\n return table;\r\n }\r\n\r\n async getAllRows(\r\n _store: string,\r\n tableKey: string,\r\n collectionScope: CollectionScope = 'active',\r\n ): Promise<Row[]> {\r\n const table = this.tables.get(tableKey);\r\n if (!table) return [];\r\n return table.getRows(collectionScope);\r\n }\r\n\r\n async getAllRowIds(\r\n _store: string,\r\n tableKey: string,\r\n collectionScope: CollectionScope = 'active',\r\n ): Promise<number[]> {\r\n const rows = await this.getAllRows(_store, tableKey, collectionScope);\r\n return rows.map(r => r.id.value);\r\n }\r\n\r\n clearLocal(_store: string, tableKey: string): void {\r\n this.tables.delete(tableKey);\r\n }\r\n\r\n async flush(): Promise<void> {\r\n /* sync RAM — nothing to flush */\r\n }\r\n\r\n async delete(_store: string, tableKey: string): Promise<void> {\r\n this.tables.delete(tableKey);\r\n }\r\n\r\n async resetTable(_store: string, tableKey: string): Promise<void> {\r\n this.tables.delete(tableKey);\r\n }\r\n\r\n /**\r\n * RAM window only — streams the current page's rows as a single batch.\r\n * (The full dataset lives in IndexedDB, not here.)\r\n */\r\n async iterateRowRecords(\r\n _store: string,\r\n tableKey: string,\r\n collectionScope: CollectionScope,\r\n onBatch: (\r\n records: {\r\n rowId: number;\r\n collection: string;\r\n sortIndex: number;\r\n rowState: string;\r\n cells: Record<string, { value: unknown; originalValue: unknown; display: unknown }>;\r\n }[],\r\n ordinalBase: number,\r\n ) => Promise<boolean | void>,\r\n ): Promise<void> {\r\n const table = this.tables.get(tableKey);\r\n if (!table) return;\r\n const rows = table.getRows(collectionScope);\r\n const records = rows.map(r => {\r\n const cells: Record<string, { value: unknown; originalValue: unknown; display: unknown }> = {};\r\n for (const [colId, cell] of r.getCells().entries()) {\r\n cells[colId] = { value: cell.getValue(), originalValue: cell.getOriginalValue().value, display: cell.getDisplay() };\r\n }\r\n return {\r\n rowId: r.id.value,\r\n collection: r.getCollection(),\r\n sortIndex: Number(r.getCell('index')?.getValue() ?? 0),\r\n rowState: r.rowState.value as string,\r\n cells,\r\n };\r\n });\r\n await onBatch(records, 0);\r\n }\r\n\r\n async removeRows(): Promise<void> {\r\n /* RAM window: caller already removed from Table Map */\r\n }\r\n\r\n /**\r\n * RAM-window bulk delete (Memory Iron Rule compliant): only the current\r\n * page's rows are mutated — Added hard-removed, others soft-deleted via\r\n * domain Row state; already-Deleted untouched. Remaining counts come from\r\n * pagination totals minus this operation's effects (no full-dataset scan).\r\n */\r\n async softDeleteRows(\r\n _store: string,\r\n tableKey: string,\r\n rowIds: number[],\r\n ): Promise<{\r\n softDeleted: number;\r\n hardRemoved: number;\r\n remaining: number;\r\n }> {\r\n const table = this.tables.get(tableKey);\r\n if (!table || rowIds.length === 0) {\r\n return { softDeleted: 0, hardRemoved: 0, remaining: 0 };\r\n }\r\n\r\n const wanted = new Set(rowIds);\r\n let softDeleted = 0;\r\n let hardRemoved = 0;\r\n\r\n for (const col of table.getCollections().values()) {\r\n for (const row of Array.from(col.getRows().values())) {\r\n if (!wanted.has(row.id.value)) continue;\r\n if (row.rowState.value === RowStateEnum.Added) {\r\n col.getRows().delete(row.id.value);\r\n hardRemoved += 1;\r\n continue;\r\n }\r\n if (row.rowState.value === RowStateEnum.Deleted) continue;\r\n row.rowState = new RowState(RowStateEnum.Deleted);\r\n row.updateChangeFields(new ColumnId('RowState'));\r\n softDeleted += 1;\r\n }\r\n }\r\n\r\n const p = table.getPagination();\r\n const remaining = Math.max(0, p.totalRows - softDeleted - hardRemoved);\r\n table.setPagination(new Pagination(p.page, p.pageSize, remaining));\r\n\r\n return { softDeleted, hardRemoved, remaining };\r\n }\r\n}\r\n","// adapters/infra/cachedTableRepository.ts\r\nimport { WindowedTableRepository } from '../../../application/ports/TableRepository';\r\nimport { ColumnSchema } from '../../../domain/types/ColumnSchema';\r\nimport { CollectionScope } from '../../../domain/entities/Table';\r\nimport { Row } from '../../../domain/entities/Row';\r\nimport { Table } from '../../../domain/entities/Table';\r\nimport { Pagination } from '../../../domain/value-objects';\r\nimport { PagedIndexedDbTableRepository } from './PagedIndexedDbTableRepository';\r\nimport { PagedLocalTableRepository } from './PagedLocalTableRepository';\r\n\r\nfunction isValidTableKey(tableKey: unknown): tableKey is string {\r\n return typeof tableKey === 'string' && tableKey.length > 0;\r\n}\r\n\r\n/**\r\n * RAM = current page window only.\r\n * IndexedDB = source of truth for all rows.\r\n *\r\n * After `clearLocal` (page leave / dispose), all IDB ops for that table are\r\n * skipped until the table is opened again via getById/replaceAll.\r\n */\r\nexport class PagedCachedTableRepository implements WindowedTableRepository {\r\n private localRepo: PagedLocalTableRepository;\r\n private indexedRepo: PagedIndexedDbTableRepository;\r\n private persistChain = new Map<string, Promise<void>>();\r\n /** Tables closed by dispose — block further IDB rebuild/load until reopened */\r\n private closedKeys = new Set<string>();\r\n\r\n constructor() {\r\n this.localRepo = new PagedLocalTableRepository();\r\n this.indexedRepo = new PagedIndexedDbTableRepository();\r\n }\r\n\r\n private queueKey(store: string, tableKey: string): string {\r\n return `${store}::${tableKey}`;\r\n }\r\n\r\n private isClosed(store: string, tableKey: string): boolean {\r\n return this.closedKeys.has(this.queueKey(store, tableKey));\r\n }\r\n\r\n private reopen(store: string, tableKey: string): void {\r\n this.closedKeys.delete(this.queueKey(store, tableKey));\r\n }\r\n\r\n private enqueuePersist(store: string, tableKey: string, task: () => Promise<void>): void {\r\n const key = this.queueKey(store, tableKey);\r\n const prev = this.persistChain.get(key) ?? Promise.resolve();\r\n const next = prev\r\n .catch(() => undefined)\r\n .then(async () => {\r\n if (this.closedKeys.has(key)) return; // aborted by dispose\r\n await task();\r\n })\r\n .catch(err => {\r\n console.error('[PagedCachedTableRepository] IndexedDB persist failed', err);\r\n });\r\n this.persistChain.set(key, next);\r\n }\r\n\r\n async flush(store: string, tableKey: string): Promise<void> {\r\n if (!isValidTableKey(tableKey)) return;\r\n const key = this.queueKey(store, tableKey);\r\n await (this.persistChain.get(key) ?? Promise.resolve());\r\n }\r\n\r\n async getById(store: string, tableKey: string): Promise<Table> {\r\n if (!isValidTableKey(tableKey)) {\r\n throw new Error('[PagedCachedTableRepository] getById: invalid tableKey');\r\n }\r\n // Opening again after dispose\r\n this.reopen(store, tableKey);\r\n\r\n if (await this.localRepo.exists(store, tableKey)) {\r\n return this.localRepo.getById(store, tableKey);\r\n }\r\n await this.flush(store, tableKey);\r\n const table = await this.indexedRepo.getById(store, tableKey);\r\n await this.localRepo.save(store, table);\r\n return table;\r\n }\r\n\r\n async save(store: string, table: Table): Promise<void> {\r\n if (!isValidTableKey(table?.id)) {\r\n console.warn('[PagedCachedTableRepository] save skipped: invalid table.id', table?.id);\r\n return;\r\n }\r\n if (this.isClosed(store, table.id)) {\r\n return; // page left — do not rebuild IDB\r\n }\r\n\r\n await this.localRepo.save(store, table);\r\n\r\n // Await meta+page rows to IDB so pagination/totalRows stay correct after add/delete.\r\n // Page window is small — safe for typing compared to full-table blob.\r\n await this.indexedRepo.save(store, table);\r\n }\r\n\r\n async replaceAll(store: string, table: Table): Promise<void> {\r\n if (!isValidTableKey(table?.id)) {\r\n console.warn('[PagedCachedTableRepository] replaceAll skipped: invalid table.id', table?.id);\r\n return;\r\n }\r\n // Full seed / reopen always clears the disposed flag\r\n this.reopen(store, table.id);\r\n await this.flush(store, table.id);\r\n await this.indexedRepo.replaceAll(store, table);\r\n const pageSize = table.getPagination().pageSize;\r\n const pageTable = await this.indexedRepo.loadPage(store, table.id, 1, pageSize);\r\n if (!pageTable) return;\r\n this.restoreLiveColumns(table, pageTable);\r\n await this.localRepo.save(store, pageTable);\r\n }\r\n\r\n async loadPage(\r\n store: string,\r\n tableKey: string,\r\n page: number,\r\n pageSize?: number,\r\n ): Promise<Table | null> {\r\n // Leaving the page / null tableKey — stop quietly, never touch IDB\r\n if (!isValidTableKey(tableKey) || this.isClosed(store, tableKey)) {\r\n return null;\r\n }\r\n\r\n await this.flush(store, tableKey);\r\n\r\n let previous: Table | null = null;\r\n if (await this.localRepo.exists(store, tableKey)) {\r\n previous = await this.localRepo.getById(store, tableKey);\r\n await this.indexedRepo.save(store, previous);\r\n }\r\n\r\n const table = await this.indexedRepo.loadPage(store, tableKey, page, pageSize);\r\n if (!table) {\r\n return previous;\r\n }\r\n\r\n if (previous) {\r\n this.restoreLiveColumns(previous, table);\r\n // Keep the higher totalRows of the SAME active collection only.\r\n // (previous may come from a different collection after a switch —\r\n // its total must not leak into the newly loaded collection's pagination.)\r\n const prevActive = previous.getActiveCollectionName();\r\n const nextActive = table.getActiveCollectionName();\r\n if (prevActive === nextActive) {\r\n const prevTotal = previous.getPagination().totalRows;\r\n const cur = table.getPagination();\r\n if (prevTotal > cur.totalRows) {\r\n table.setPagination(new Pagination(cur.page, cur.pageSize, prevTotal));\r\n await this.indexedRepo.save(store, table);\r\n }\r\n }\r\n }\r\n\r\n await this.localRepo.save(store, table);\r\n return table;\r\n }\r\n\r\n /**\r\n * Collection switch: swap the RAM window with page 1 of the NEW collection\r\n * (loaded from IndexedDB) and persist the switch in meta. Rows of other\r\n * collections are never touched.\r\n */\r\n async setActiveCollection(\r\n store: string,\r\n tableKey: string,\r\n collection: string,\r\n ): Promise<Table | null> {\r\n if (!isValidTableKey(tableKey) || this.isClosed(store, tableKey)) return null;\r\n\r\n await this.flush(store, tableKey);\r\n\r\n // Push unsaved edits of the CURRENT window down to IndexedDB first\r\n let previous: Table | null = null;\r\n if (await this.localRepo.exists(store, tableKey)) {\r\n previous = await this.localRepo.getById(store, tableKey);\r\n await this.indexedRepo.save(store, previous);\r\n }\r\n\r\n const table = await this.indexedRepo.setActiveCollection(store, tableKey, collection);\r\n if (!table) {\r\n return previous; // unknown collection — keep the current window\r\n }\r\n\r\n if (previous) {\r\n this.restoreLiveColumns(previous, table);\r\n }\r\n\r\n await this.localRepo.save(store, table);\r\n return table;\r\n }\r\n\r\n /** ColumnSchema holds functions — never come back from IndexedDB; keep RAM handlers. */\r\n private restoreLiveColumns(from: Table, to: Table): void {\r\n for (const [name, col] of from.getCollections()) {\r\n const target = to.getCollections().get(name);\r\n if (!target) continue;\r\n const dest = target.getColumns();\r\n dest.clear();\r\n for (const [field, schema] of col.getColumns()) {\r\n dest.set(field, schema as ColumnSchema);\r\n }\r\n }\r\n }\r\n\r\n async getAllRows(\r\n store: string,\r\n tableKey: string,\r\n collectionScope?: CollectionScope,\r\n ): Promise<Row[]> {\r\n if (!isValidTableKey(tableKey) || this.isClosed(store, tableKey)) return [];\r\n await this.flush(store, tableKey);\r\n if (await this.localRepo.exists(store, tableKey)) {\r\n const current = await this.localRepo.getById(store, tableKey);\r\n await this.indexedRepo.save(store, current);\r\n }\r\n return this.indexedRepo.getAllRows(store, tableKey, collectionScope);\r\n }\r\n\r\n async getAllRowIds(\r\n store: string,\r\n tableKey: string,\r\n collectionScope?: CollectionScope,\r\n ): Promise<number[]> {\r\n if (!isValidTableKey(tableKey) || this.isClosed(store, tableKey)) return [];\r\n await this.flush(store, tableKey);\r\n if (await this.localRepo.exists(store, tableKey)) {\r\n const current = await this.localRepo.getById(store, tableKey);\r\n await this.indexedRepo.save(store, current);\r\n }\r\n return this.indexedRepo.getAllRowIds(store, tableKey, collectionScope);\r\n }\r\n\r\n clearLocal(store: string, tableKey: string): void {\r\n if (!isValidTableKey(tableKey)) return;\r\n const key = this.queueKey(store, tableKey);\r\n this.closedKeys.add(key);\r\n // Cancel queued persists — in-flight tasks check closedKeys\r\n this.persistChain.set(key, Promise.resolve());\r\n this.localRepo.clearLocal(store, tableKey);\r\n }\r\n\r\n async delete(store: string, tableKey: string): Promise<void> {\r\n if (!isValidTableKey(tableKey)) return;\r\n await this.flush(store, tableKey);\r\n this.localRepo.clearLocal(store, tableKey);\r\n this.closedKeys.add(this.queueKey(store, tableKey));\r\n await this.indexedRepo.delete(store, tableKey);\r\n }\r\n\r\n async resetTable(store: string, tableKey: string): Promise<void> {\r\n if (!isValidTableKey(tableKey) || this.isClosed(store, tableKey)) return;\r\n await this.flush(store, tableKey);\r\n await this.indexedRepo.resetTable(store, tableKey);\r\n this.localRepo.clearLocal(store, tableKey);\r\n const empty = await this.indexedRepo.loadPage(store, tableKey, 1);\r\n if (empty) await this.localRepo.save(store, empty);\r\n }\r\n\r\n async exists(store: string, tableKey: string): Promise<boolean> {\r\n if (!isValidTableKey(tableKey)) return false;\r\n if (await this.localRepo.exists(store, tableKey)) return true;\r\n return this.indexedRepo.exists(store, tableKey);\r\n }\r\n\r\n /** Stream row records in batches (never the whole dataset in heap). */\r\n async iterateRowRecords(\r\n store: string,\r\n tableKey: string,\r\n collectionScope: CollectionScope,\r\n onBatch: Parameters<WindowedTableRepository['iterateRowRecords']>[3],\r\n batchSize?: number,\r\n ): Promise<void> {\r\n if (!isValidTableKey(tableKey) || this.isClosed(store, tableKey)) return;\r\n await this.flush(store, tableKey);\r\n // Push unsaved RAM-window edits down so streaming sees them.\r\n if (await this.localRepo.exists(store, tableKey)) {\r\n const current = await this.localRepo.getById(store, tableKey);\r\n await this.indexedRepo.save(store, current);\r\n }\r\n await this.indexedRepo.iterateRowRecords(store, tableKey, collectionScope, onBatch, batchSize);\r\n }\r\n\r\n async removeRows(store: string, tableKey: string, rowIds: number[]): Promise<void> {\r\n if (!isValidTableKey(tableKey) || this.isClosed(store, tableKey)) return;\r\n await this.flush(store, tableKey);\r\n await this.indexedRepo.removeRows(store, tableKey, rowIds);\r\n }\r\n\r\n /**\r\n * Bulk delete straight on IndexedDB records (Memory Iron Rule: no full\r\n * hydration, no replaceAll). After the persisted delete, the RAM window is\r\n * reloaded from IndexedDB so pagination/rows stay consistent.\r\n */\r\n async softDeleteRows(\r\n store: string,\r\n tableKey: string,\r\n rowIds: number[],\r\n ): Promise<{\r\n softDeleted: number;\r\n hardRemoved: number;\r\n remaining: number;\r\n }> {\r\n if (!isValidTableKey(tableKey) || this.isClosed(store, tableKey) || rowIds.length === 0) {\r\n return { softDeleted: 0, hardRemoved: 0, remaining: 0 };\r\n }\r\n await this.flush(store, tableKey);\r\n const result = await this.indexedRepo.softDeleteRows(store, tableKey, rowIds);\r\n // Re-derive the RAM window from the new SoT state (O(pageSize) heap);\r\n // pageSize comes from persisted meta.\r\n const pageTable = await this.indexedRepo.loadPage(store, tableKey, 1);\r\n if (pageTable) await this.localRepo.save(store, pageTable);\r\n return result;\r\n }\r\n}\r\n"]}