schematex 0.2.0 → 0.2.3

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 (200) hide show
  1. package/README.md +1 -1
  2. package/dist/ai/ai-sdk.cjs +85 -0
  3. package/dist/ai/ai-sdk.cjs.map +1 -0
  4. package/dist/ai/ai-sdk.d.cts +30 -0
  5. package/dist/ai/ai-sdk.d.ts +30 -0
  6. package/dist/ai/ai-sdk.js +83 -0
  7. package/dist/ai/ai-sdk.js.map +1 -0
  8. package/dist/ai/index.cjs +60 -0
  9. package/dist/ai/index.cjs.map +1 -0
  10. package/dist/ai/index.d.cts +155 -0
  11. package/dist/ai/index.d.ts +155 -0
  12. package/dist/ai/index.js +23 -0
  13. package/dist/ai/index.js.map +1 -0
  14. package/dist/browser.cjs +22 -21
  15. package/dist/browser.cjs.map +1 -1
  16. package/dist/browser.js +20 -19
  17. package/dist/browser.js.map +1 -1
  18. package/dist/{chunk-HLYA4QBB.js → chunk-2BM3HJSK.js} +545 -101
  19. package/dist/chunk-2BM3HJSK.js.map +1 -0
  20. package/dist/{chunk-ZO77FHBF.cjs → chunk-2JDVJRR3.cjs} +14 -6
  21. package/dist/chunk-2JDVJRR3.cjs.map +1 -0
  22. package/dist/{chunk-TIGP2OEJ.js → chunk-2VNMKOUO.js} +20 -5
  23. package/dist/chunk-2VNMKOUO.js.map +1 -0
  24. package/dist/{chunk-ULERCTGS.cjs → chunk-3YZ6FPQW.cjs} +36 -30
  25. package/dist/chunk-3YZ6FPQW.cjs.map +1 -0
  26. package/dist/{chunk-GEPBET4L.js → chunk-45KP67RR.js} +14 -6
  27. package/dist/chunk-45KP67RR.js.map +1 -0
  28. package/dist/chunk-4QP37LD3.js +1112 -0
  29. package/dist/chunk-4QP37LD3.js.map +1 -0
  30. package/dist/{chunk-HKRYKEOV.cjs → chunk-4S2WILLW.cjs} +4 -4
  31. package/dist/{chunk-HKRYKEOV.cjs.map → chunk-4S2WILLW.cjs.map} +1 -1
  32. package/dist/{chunk-IMHR3S5H.cjs → chunk-5AEN2PLB.cjs} +17 -9
  33. package/dist/chunk-5AEN2PLB.cjs.map +1 -0
  34. package/dist/{chunk-SPIW4VWP.js → chunk-5YYAYW67.js} +3 -3
  35. package/dist/{chunk-SPIW4VWP.js.map → chunk-5YYAYW67.js.map} +1 -1
  36. package/dist/{chunk-CEV3GZA3.cjs → chunk-6LZJTAA3.cjs} +552 -108
  37. package/dist/chunk-6LZJTAA3.cjs.map +1 -0
  38. package/dist/{chunk-IY52OWPG.cjs → chunk-A5D2IMOX.cjs} +18 -10
  39. package/dist/chunk-A5D2IMOX.cjs.map +1 -0
  40. package/dist/{chunk-AMP2FFES.cjs → chunk-B37IKTI7.cjs} +229 -52
  41. package/dist/chunk-B37IKTI7.cjs.map +1 -0
  42. package/dist/{chunk-LKHWBDWZ.cjs → chunk-B6INLQBU.cjs} +17 -11
  43. package/dist/chunk-B6INLQBU.cjs.map +1 -0
  44. package/dist/{chunk-DTMCQXXC.cjs → chunk-COLTVQWR.cjs} +184 -16
  45. package/dist/chunk-COLTVQWR.cjs.map +1 -0
  46. package/dist/{chunk-S6VPECM3.cjs → chunk-D7EHZFK4.cjs} +20 -5
  47. package/dist/chunk-D7EHZFK4.cjs.map +1 -0
  48. package/dist/chunk-DNZFOCV7.js +796 -0
  49. package/dist/chunk-DNZFOCV7.js.map +1 -0
  50. package/dist/{chunk-ZGKEFVJQ.cjs → chunk-E65ITQXV.cjs} +188 -32
  51. package/dist/chunk-E65ITQXV.cjs.map +1 -0
  52. package/dist/{chunk-7WXAAVR3.js → chunk-FCGHV6ZK.js} +17 -9
  53. package/dist/chunk-FCGHV6ZK.js.map +1 -0
  54. package/dist/{chunk-A74ZCP5I.js → chunk-FE6GAUNW.js} +36 -30
  55. package/dist/chunk-FE6GAUNW.js.map +1 -0
  56. package/dist/{chunk-MXJ6FHSY.js → chunk-JDTB7IKL.js} +3 -3
  57. package/dist/{chunk-MXJ6FHSY.js.map → chunk-JDTB7IKL.js.map} +1 -1
  58. package/dist/{chunk-RQX53J6M.js → chunk-LR4X4ZRG.js} +180 -24
  59. package/dist/chunk-LR4X4ZRG.js.map +1 -0
  60. package/dist/{chunk-MRGS54WN.js → chunk-M5B2UUNW.js} +3 -3
  61. package/dist/{chunk-MRGS54WN.js.map → chunk-M5B2UUNW.js.map} +1 -1
  62. package/dist/{chunk-LXNFVHDT.cjs → chunk-MCFQAUQV.cjs} +21 -13
  63. package/dist/chunk-MCFQAUQV.cjs.map +1 -0
  64. package/dist/chunk-MOU5QRZY.cjs +1121 -0
  65. package/dist/chunk-MOU5QRZY.cjs.map +1 -0
  66. package/dist/{chunk-TPA36ULU.js → chunk-OC22GGQN.js} +223 -46
  67. package/dist/chunk-OC22GGQN.js.map +1 -0
  68. package/dist/{chunk-2OIW3MAE.js → chunk-PGALHQFF.js} +3 -3
  69. package/dist/{chunk-2OIW3MAE.js.map → chunk-PGALHQFF.js.map} +1 -1
  70. package/dist/{chunk-3M7QWADF.cjs → chunk-QSQX77S2.cjs} +4 -4
  71. package/dist/{chunk-3M7QWADF.cjs.map → chunk-QSQX77S2.cjs.map} +1 -1
  72. package/dist/{chunk-VP54YPOX.cjs → chunk-QXIGHMH2.cjs} +498 -177
  73. package/dist/chunk-QXIGHMH2.cjs.map +1 -0
  74. package/dist/{chunk-YO4GU6JX.js → chunk-RP5UATRA.js} +175 -7
  75. package/dist/chunk-RP5UATRA.js.map +1 -0
  76. package/dist/{chunk-M6AMNXQ7.js → chunk-S3RBKJM5.js} +478 -157
  77. package/dist/chunk-S3RBKJM5.js.map +1 -0
  78. package/dist/{chunk-JZGFSRVT.js → chunk-SN7NTZI6.js} +9 -7
  79. package/dist/chunk-SN7NTZI6.js.map +1 -0
  80. package/dist/{chunk-L6IHSTPP.js → chunk-U6L3FAML.js} +16 -10
  81. package/dist/chunk-U6L3FAML.js.map +1 -0
  82. package/dist/{chunk-5SH5NUDW.js → chunk-UGCUNADI.js} +21 -13
  83. package/dist/chunk-UGCUNADI.js.map +1 -0
  84. package/dist/chunk-ULYRO2KY.cjs +800 -0
  85. package/dist/chunk-ULYRO2KY.cjs.map +1 -0
  86. package/dist/{chunk-4HPT4BOI.cjs → chunk-WYFXOXVK.cjs} +4 -4
  87. package/dist/{chunk-4HPT4BOI.cjs.map → chunk-WYFXOXVK.cjs.map} +1 -1
  88. package/dist/{chunk-YKO7DY2F.cjs → chunk-X7RPFTTR.cjs} +13 -13
  89. package/dist/{chunk-YKO7DY2F.cjs.map → chunk-X7RPFTTR.cjs.map} +1 -1
  90. package/dist/{chunk-4TS5NB7L.js → chunk-YQANC7HQ.js} +3 -3
  91. package/dist/{chunk-4TS5NB7L.js.map → chunk-YQANC7HQ.js.map} +1 -1
  92. package/dist/{chunk-HAIBAF6J.cjs → chunk-Z3DE6S64.cjs} +10 -8
  93. package/dist/chunk-Z3DE6S64.cjs.map +1 -0
  94. package/dist/{chunk-IQIJ6WW6.js → chunk-ZNDIGQJD.js} +15 -7
  95. package/dist/chunk-ZNDIGQJD.js.map +1 -0
  96. package/dist/{chunk-PIQG2Z5N.cjs → chunk-ZNOD4VZT.cjs} +4 -4
  97. package/dist/{chunk-PIQG2Z5N.cjs.map → chunk-ZNOD4VZT.cjs.map} +1 -1
  98. package/dist/diagrams/blockdiagram/index.cjs +5 -5
  99. package/dist/diagrams/blockdiagram/index.d.cts +1 -1
  100. package/dist/diagrams/blockdiagram/index.d.ts +1 -1
  101. package/dist/diagrams/blockdiagram/index.js +1 -1
  102. package/dist/diagrams/circuit/index.cjs +8 -8
  103. package/dist/diagrams/circuit/index.d.cts +1 -1
  104. package/dist/diagrams/circuit/index.d.ts +1 -1
  105. package/dist/diagrams/circuit/index.js +2 -2
  106. package/dist/diagrams/ecomap/index.cjs +8 -7
  107. package/dist/diagrams/ecomap/index.d.cts +2 -2
  108. package/dist/diagrams/ecomap/index.d.ts +2 -2
  109. package/dist/diagrams/ecomap/index.js +3 -2
  110. package/dist/diagrams/entity/index.cjs +6 -6
  111. package/dist/diagrams/entity/index.d.cts +1 -1
  112. package/dist/diagrams/entity/index.d.ts +1 -1
  113. package/dist/diagrams/entity/index.js +2 -2
  114. package/dist/diagrams/fishbone/index.cjs +8 -8
  115. package/dist/diagrams/fishbone/index.d.cts +1 -1
  116. package/dist/diagrams/fishbone/index.d.ts +1 -1
  117. package/dist/diagrams/fishbone/index.js +2 -2
  118. package/dist/diagrams/flowchart/index.cjs +8 -8
  119. package/dist/diagrams/flowchart/index.d.cts +2 -2
  120. package/dist/diagrams/flowchart/index.d.ts +2 -2
  121. package/dist/diagrams/flowchart/index.js +2 -2
  122. package/dist/diagrams/genogram/index.cjs +10 -9
  123. package/dist/diagrams/genogram/index.d.cts +1 -1
  124. package/dist/diagrams/genogram/index.d.ts +1 -1
  125. package/dist/diagrams/genogram/index.js +3 -2
  126. package/dist/diagrams/ladder/index.cjs +6 -6
  127. package/dist/diagrams/ladder/index.d.cts +1 -1
  128. package/dist/diagrams/ladder/index.d.ts +1 -1
  129. package/dist/diagrams/ladder/index.js +2 -2
  130. package/dist/diagrams/logic/index.cjs +6 -6
  131. package/dist/diagrams/logic/index.d.cts +1 -1
  132. package/dist/diagrams/logic/index.d.ts +1 -1
  133. package/dist/diagrams/logic/index.js +2 -2
  134. package/dist/diagrams/orgchart/index.cjs +7 -7
  135. package/dist/diagrams/orgchart/index.d.cts +5 -2
  136. package/dist/diagrams/orgchart/index.d.ts +5 -2
  137. package/dist/diagrams/orgchart/index.js +2 -2
  138. package/dist/diagrams/pedigree/index.cjs +8 -7
  139. package/dist/diagrams/pedigree/index.d.cts +1 -1
  140. package/dist/diagrams/pedigree/index.d.ts +1 -1
  141. package/dist/diagrams/pedigree/index.js +3 -2
  142. package/dist/diagrams/phylo/index.cjs +7 -7
  143. package/dist/diagrams/phylo/index.d.cts +1 -1
  144. package/dist/diagrams/phylo/index.d.ts +1 -1
  145. package/dist/diagrams/phylo/index.js +2 -2
  146. package/dist/diagrams/sld/index.cjs +6 -6
  147. package/dist/diagrams/sld/index.d.cts +1 -1
  148. package/dist/diagrams/sld/index.d.ts +1 -1
  149. package/dist/diagrams/sld/index.js +2 -2
  150. package/dist/diagrams/sociogram/index.cjs +7 -6
  151. package/dist/diagrams/sociogram/index.d.cts +2 -1
  152. package/dist/diagrams/sociogram/index.d.ts +2 -1
  153. package/dist/diagrams/sociogram/index.js +3 -2
  154. package/dist/diagrams/timing/index.cjs +4 -4
  155. package/dist/diagrams/timing/index.d.cts +1 -1
  156. package/dist/diagrams/timing/index.d.ts +1 -1
  157. package/dist/diagrams/timing/index.js +1 -1
  158. package/dist/diagrams/venn/index.cjs +9 -9
  159. package/dist/diagrams/venn/index.d.cts +1 -1
  160. package/dist/diagrams/venn/index.d.ts +1 -1
  161. package/dist/diagrams/venn/index.js +2 -2
  162. package/dist/{index-ga04CTBI.d.ts → index-C97K-kuw.d.ts} +1 -1
  163. package/dist/{index-SSGpCggE.d.cts → index-lsSaw3E0.d.cts} +1 -1
  164. package/dist/index.cjs +50 -49
  165. package/dist/index.d.cts +2 -2
  166. package/dist/index.d.ts +2 -2
  167. package/dist/index.js +19 -18
  168. package/dist/react.cjs +20 -19
  169. package/dist/react.cjs.map +1 -1
  170. package/dist/react.js +19 -18
  171. package/dist/react.js.map +1 -1
  172. package/dist/{types-BcPhMdHd.d.cts → types-C4LnMEcB.d.cts} +58 -4
  173. package/dist/{types-BcPhMdHd.d.ts → types-C4LnMEcB.d.ts} +58 -4
  174. package/package.json +30 -7
  175. package/dist/chunk-5SH5NUDW.js.map +0 -1
  176. package/dist/chunk-7WXAAVR3.js.map +0 -1
  177. package/dist/chunk-A74ZCP5I.js.map +0 -1
  178. package/dist/chunk-AMP2FFES.cjs.map +0 -1
  179. package/dist/chunk-CEV3GZA3.cjs.map +0 -1
  180. package/dist/chunk-DTMCQXXC.cjs.map +0 -1
  181. package/dist/chunk-GEPBET4L.js.map +0 -1
  182. package/dist/chunk-HAIBAF6J.cjs.map +0 -1
  183. package/dist/chunk-HLYA4QBB.js.map +0 -1
  184. package/dist/chunk-IMHR3S5H.cjs.map +0 -1
  185. package/dist/chunk-IQIJ6WW6.js.map +0 -1
  186. package/dist/chunk-IY52OWPG.cjs.map +0 -1
  187. package/dist/chunk-JZGFSRVT.js.map +0 -1
  188. package/dist/chunk-L6IHSTPP.js.map +0 -1
  189. package/dist/chunk-LKHWBDWZ.cjs.map +0 -1
  190. package/dist/chunk-LXNFVHDT.cjs.map +0 -1
  191. package/dist/chunk-M6AMNXQ7.js.map +0 -1
  192. package/dist/chunk-RQX53J6M.js.map +0 -1
  193. package/dist/chunk-S6VPECM3.cjs.map +0 -1
  194. package/dist/chunk-TIGP2OEJ.js.map +0 -1
  195. package/dist/chunk-TPA36ULU.js.map +0 -1
  196. package/dist/chunk-ULERCTGS.cjs.map +0 -1
  197. package/dist/chunk-VP54YPOX.cjs.map +0 -1
  198. package/dist/chunk-YO4GU6JX.js.map +0 -1
  199. package/dist/chunk-ZGKEFVJQ.cjs.map +0 -1
  200. package/dist/chunk-ZO77FHBF.cjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/diagrams/genogram/parser.ts","../src/diagrams/genogram/layout.ts","../src/diagrams/genogram/symbols.ts","../src/diagrams/genogram/renderer.ts","../src/diagrams/genogram/index.ts"],"names":["line","text","group","fu","EMOTIONAL_REL_TYPES"],"mappings":";;;;AAWO,IAAM,UAAA,GAAN,cAAyB,KAAA,CAAM;AAAA,EACpC,WAAA,CACE,OAAA,EACOA,KAAAA,EACA,MAAA,EACA,MAAA,EACP;AACA,IAAA,KAAA,CAAM,CAAA,KAAA,EAAQA,KAAI,CAAA,MAAA,EAAS,MAAM,KAAK,OAAO;AAAA,SAAA,EAAS,MAAM,CAAA,CAAE,CAAA;AAJvD,IAAA,IAAA,CAAA,IAAA,GAAAA,KAAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AACA,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAGP,IAAA,IAAA,CAAK,IAAA,GAAO,YAAA;AAAA,EACd;AAAA,EANS,IAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAKX;AAIA,IAAM,UAAA,GAA+D;AAAA,EACnE,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,UAAA,EAAW;AAAA,EACjC,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,WAAA,EAAY;AAAA,EAClC,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,SAAA,EAAU;AAAA,EAChC,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,gBAAA,EAAqC;AAAA,EAC1D,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,SAAA,EAAU;AAAA,EAC/B,EAAE,KAAA,EAAO,GAAA,EAAK,IAAA,EAAM,YAAA;AACtB,CAAA;AAEA,IAAM,SAAA,uBAAgB,GAAA,CAAI,CAAC,QAAQ,QAAA,EAAU,SAAA,EAAW,OAAO,CAAC,CAAA;AAChE,IAAM,YAAA,uBAAmB,GAAA,CAAI;AAAA,EAC3B,UAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAC,CAAA;AACD,IAAM,mBAAA,uBAA0B,GAAA,CAAI;AAAA,EAClC,SAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAC,CAAA;AACD,IAAM,WAAA,uBAAkB,GAAA,CAAI;AAAA,EAC1B,MAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,eAAA,uBAAsB,GAAA,CAAI;AAAA,EAC9B,SAAA;AAAA,EAAW,OAAA;AAAA,EAAS,aAAA;AAAA,EAAe,MAAA;AAAA,EAAQ,QAAA;AAAA,EAAU,YAAA;AAAA,EACrD,SAAA;AAAA,EAAW,UAAA;AAAA,EAAY,QAAA;AAAA,EAAU,iBAAA;AAAA,EAAmB,QAAA;AAAA,EACpD,eAAA;AAAA,EAAiB,OAAA;AAAA,EAAS,eAAA;AAAA,EAC1B,SAAA;AAAA,EAAW,QAAA;AAAA,EAAU,UAAA;AAAA,EACrB,OAAA;AAAA,EAAS,gBAAA;AAAA,EAAkB,iBAAA;AAAA,EAAmB,cAAA;AAAA,EAAgB,SAAA;AAAA,EAC9D,cAAA;AAAA,EAAgB,aAAA;AAAA,EAAe,SAAA;AAAA,EAC/B,SAAA;AAAA,EAAW,aAAA;AAAA,EAAe,UAAA;AAAA,EAAY,SAAA;AAAA,EAAW;AACnD,CAAC,CAAA;AAYM,SAAS,cAAcC,KAAAA,EAA0B;AACtD,EAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAChC,EAAA,MAAM,KAAA,GAAqB,EAAE,KAAA,EAAO,QAAA,EAAU,aAAa,CAAA,EAAE;AAE7D,EAAA,oBAAA,CAAqB,KAAK,CAAA;AAG1B,EAAA,MAAM,WAAmC,EAAC;AAC1C,EAAA,MAAM,UAAA,GAAa,gBAAgB,KAAK,CAAA;AACxC,EAAA,IAAI,eAAe,MAAA,EAAW;AAC5B,IAAA,MAAM,IAAI,UAAA,CAAW,aAAA,EAAe,CAAA,EAAG,GAAG,EAAE,CAAA;AAAA,EAC9C;AACA,EAAA,MAAM,aAAA,GAAgB,WAAW,IAAA,EAAK;AACtC,EAAA,IAAI,CAAC,aAAA,CAAc,WAAA,EAAY,CAAE,UAAA,CAAW,UAAU,CAAA,EAAG;AACvD,IAAA,MAAM,IAAI,UAAA;AAAA,MACR,4BAAA;AAAA,MACA,MAAM,WAAA,GAAc,CAAA;AAAA,MACpB,CAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACA,EAAA,MAAM,UAAA,GAAa,aAAA,CAAc,KAAA,CAAM,yBAAyB,CAAA;AAChE,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,QAAA,CAAS,KAAA,GAAQ,WAAW,CAAC,CAAA;AAAA,EAC/B;AACA,EAAA,KAAA,CAAM,WAAA,EAAA;AAGN,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAwB;AACnD,EAAA,MAAM,gBAAgC,EAAC;AACvC,EAAA,MAAM,iBAAA,uBAAwB,GAAA,EAAoB;AAElD,EAAA,oBAAA,CAAqB,KAAK,CAAA;AAE1B,EAAA,OAAO,KAAA,CAAM,WAAA,GAAc,KAAA,CAAM,KAAA,CAAM,MAAA,EAAQ;AAC7C,IAAA,oBAAA,CAAqB,KAAK,CAAA;AAC1B,IAAA,IAAI,KAAA,CAAM,WAAA,IAAe,KAAA,CAAM,KAAA,CAAM,MAAA,EAAQ;AAE7C,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,WAAW,CAAA;AAC9C,IAAA,MAAM,OAAA,GAAU,SAAS,IAAA,EAAK;AAC9B,IAAA,IAAI,OAAA,KAAY,EAAA,IAAM,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAC7C,MAAA,KAAA,CAAM,WAAA,EAAA;AACN,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,cAAA,GAAiB,kBAAkB,OAAO,CAAA;AAChD,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,MAAM,EAAE,QAAQ,aAAA,EAAe,OAAA,EAAS,WAAW,WAAA,EAAa,KAAA,EAAO,SAAQ,GAAI,cAAA;AACnF,MAAA,MAAM,OAAA,GAAU,MAAM,WAAA,GAAc,CAAA;AACpC,MAAA,MAAM,OAAA,GAAU,OAAO,WAAA,EAAY;AACnC,MAAA,MAAM,QAAA,GAAW,UAAU,WAAA,EAAY;AAEvC,MAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA,EAAG;AAChC,QAAA,MAAM,IAAI,UAAA,CAAW,CAAA,oBAAA,EAAuB,MAAM,CAAA,CAAA,CAAA,EAAK,OAAA,EAAS,GAAG,QAAQ,CAAA;AAAA,MAC7E;AACA,MAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA,EAAG;AACjC,QAAA,MAAM,IAAI,UAAA,CAAW,CAAA,oBAAA,EAAuB,SAAS,CAAA,CAAA,CAAA,EAAK,OAAA,EAAS,GAAG,QAAQ,CAAA;AAAA,MAChF;AAEA,MAAA,MAAM,GAAA,GAAoB;AAAA,QACxB,IAAA,EAAM,aAAA;AAAA,QACN,IAAA,EAAM,OAAA;AAAA,QACN,EAAA,EAAI;AAAA,OACN;AACA,MAAA,IAAI,WAAA,MAAiB,WAAA,GAAc,IAAA;AACnC,MAAA,IAAI,OAAA,MAAa,KAAA,GAAQ,OAAA;AACzB,MAAA,aAAA,CAAc,KAAK,GAAG,CAAA;AACtB,MAAA,KAAA,CAAM,WAAA,EAAA;AACN,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,eAAe,OAAO,CAAA;AAC1C,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,EAAE,MAAA,EAAQ,EAAA,EAAI,QAAA,EAAS,GAAI,WAAA;AACjC,MAAA,MAAM,OAAA,GAAU,MAAM,WAAA,GAAc,CAAA;AAGpC,MAAA,MAAM,EAAE,OAAA,EAAS,YAAA,EAAc,OAAO,QAAA,EAAS,GAAI,gBAAgB,QAAQ,CAAA;AAG3E,MAAA,MAAM,EAAE,EAAA,EAAI,OAAA,EAAS,OAAO,UAAA,EAAW,GAAI,yBAAyB,YAAY,CAAA;AAGhF,MAAA,MAAM,OAAA,GAAU,OAAO,WAAA,EAAY;AACnC,MAAA,IAAI,CAAC,cAAA,CAAe,GAAA,CAAI,OAAO,CAAA,EAAG;AAChC,QAAA,MAAM,IAAI,UAAA;AAAA,UACR,uBAAuB,MAAM,CAAA,CAAA,CAAA;AAAA,UAC7B,OAAA;AAAA,UACA,CAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAGA,MAAA,MAAM,QAAA,GAAW,QAAQ,WAAA,EAAY;AACrC,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,eAAA,GAAkB,eAAA,CAAgB,OAAA,EAAS,UAAA,EAAY,SAAS,QAAQ,CAAA;AAC9E,QAAA,cAAA,CAAe,GAAA,CAAI,UAAU,eAAe,CAAA;AAAA,MAC9C,CAAA,MAAA,IAAW,CAAC,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA,EAAG;AACxC,QAAA,MAAM,IAAI,UAAA;AAAA,UACR,uBAAuB,OAAO,CAAA,CAAA,CAAA;AAAA,UAC9B,OAAA;AAAA,UACA,CAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAEA,MAAA,MAAM,GAAA,GAAoB,EAAE,IAAA,EAAM,EAAA,CAAG,MAAM,IAAA,EAAM,OAAA,EAAS,IAAI,QAAA,EAAS;AACvE,MAAA,IAAI,QAAA,MAAc,KAAA,GAAQ,QAAA;AAC1B,MAAA,aAAA,CAAc,KAAK,GAAG,CAAA;AAEtB,MAAA,MAAM,YAAA,GAAe,UAAU,QAAQ,CAAA;AACvC,MAAA,KAAA,CAAM,WAAA,EAAA;AAGN,MAAA,OAAO,KAAA,CAAM,WAAA,GAAc,KAAA,CAAM,KAAA,CAAM,MAAA,EAAQ;AAC7C,QAAA,MAAM,SAAA,GAAY,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,WAAW,CAAA;AAC/C,QAAA,MAAM,YAAA,GAAe,UAAU,IAAA,EAAK;AAEpC,QAAA,IAAI,YAAA,KAAiB,EAAA,IAAM,YAAA,CAAa,UAAA,CAAW,GAAG,CAAA,EAAG;AACvD,UAAA,KAAA,CAAM,WAAA,EAAA;AACN,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,WAAA,GAAc,UAAU,SAAS,CAAA;AACvC,QAAA,IAAI,eAAe,YAAA,EAAc;AAGjC,QAAA,MAAM,YAAA,GAAe,MAAM,WAAA,GAAc,CAAA;AACzC,QAAA,MAAM,EAAE,EAAA,EAAI,OAAA,EAAS,QAAA,EAAS,GAAI,gBAAgB,YAAY,CAAA;AAC9D,QAAA,MAAM,QAAA,GAAW,QAAQ,WAAA,EAAY;AAErC,QAAA,MAAM,UAAA,GAAa,eAAA;AAAA,UACjB,OAAA;AAAA,UACA,QAAA;AAAA,UACA,YAAA;AAAA,UACA;AAAA,SACF;AAGA,QAAA,IAAI,QAAA,EAAU;AACZ,UAAA,KAAA,MAAW,MAAM,mBAAA,EAAqB;AACpC,YAAA,IAAI,WAAA,CAAY,QAAQ,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA,EAAG;AACtC,cAAA,iBAAA,CAAkB,GAAA,CAAI,UAAU,EAAE,CAAA;AAAA,YACpC;AAAA,UACF;AAAA,QACF;AAEA,QAAA,cAAA,CAAe,GAAA,CAAI,UAAU,UAAU,CAAA;AAGvC,QAAA,MAAM,SAAA,GAAY,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AACxC,QAAA,MAAM,MAAA,GAAS,iBAAA,CAAkB,GAAA,CAAI,QAAQ,CAAA;AAC7C,QAAA,MAAM,UACJ,MAAA,KAAW,MAAA,KAAW,SAAA,IAAa,MAAA,KAAW,YAC1C,MAAA,GACA,cAAA;AACN,QAAA,aAAA,CAAc,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,MAAM,SAAA,EAAW,EAAA,EAAI,UAAU,CAAA;AAEnE,QAAA,KAAA,CAAM,WAAA,EAAA;AAAA,MACR;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,MAAM,OAAA,GAAU,MAAM,WAAA,GAAc,CAAA;AACpC,MAAA,MAAM,EAAE,EAAA,EAAI,QAAA,EAAS,GAAI,gBAAgB,OAAO,CAAA;AAChD,MAAA,MAAM,GAAA,GAAM,GAAG,WAAA,EAAY;AAE3B,MAAA,MAAM,UAAA,GAAa,eAAA,CAAgB,EAAA,EAAI,QAAA,EAAU,SAAS,QAAQ,CAAA;AAElE,MAAA,MAAM,QAAA,GAAW,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA;AACvC,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,cAAA,CAAe,GAAA,CAAI,GAAA,EAAK,eAAA,CAAgB,QAAA,EAAU,UAAU,CAAC,CAAA;AAAA,MAC/D,CAAA,MAAO;AACL,QAAA,cAAA,CAAe,GAAA,CAAI,KAAK,UAAU,CAAA;AAAA,MACpC;AAEA,MAAA,KAAA,CAAM,WAAA,EAAA;AAAA,IACR;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAsB;AAC7C,EAAA,KAAA,MAAW,CAAC,QAAA,EAAU,IAAI,CAAA,IAAK,iBAAA,EAAmB;AAChD,IAAA,IAAI,IAAA,KAAS,gBAAA,IAAoB,IAAA,KAAS,gBAAA,EAAkB;AAE1D,MAAA,MAAM,QAAQ,aAAA,CAAc,IAAA;AAAA,QAC1B,CAAC,CAAA,KACC,CAAA,CAAE,EAAA,KAAO,QAAA,KACR,CAAA,CAAE,IAAA,KAAS,cAAA,IACV,CAAA,CAAE,IAAA,KAAS,SAAA,IACX,CAAA,CAAE,IAAA,KAAS,QAAA;AAAA,OACjB;AACA,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAM,QAAA,GAAW,CAAA,EAAG,KAAA,CAAM,IAAI,IAAI,IAAI,CAAA,CAAA;AACtC,QAAA,MAAMC,MAAAA,GAAQ,UAAA,CAAW,GAAA,CAAI,QAAQ,KAAK,EAAC;AAC3C,QAAAA,MAAAA,CAAM,KAAK,QAAQ,CAAA;AACnB,QAAA,UAAA,CAAW,GAAA,CAAI,UAAUA,MAAK,CAAA;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AACA,EAAA,KAAA,MAAW,CAAC,QAAA,EAAU,OAAO,CAAA,IAAK,UAAA,EAAY;AAC5C,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACtC,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AAC3C,MAAA,aAAA,CAAc,IAAA,CAAK;AAAA,QACjB,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,QAAQ,CAAC,CAAA;AAAA,QACf,EAAA,EAAI,OAAA,CAAQ,CAAA,GAAI,CAAC;AAAA,OAClB,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,UAAA;AAAA,IACN,WAAA,EAAa,KAAA,CAAM,IAAA,CAAK,cAAA,CAAe,QAAQ,CAAA;AAAA,IAC/C,aAAA;AAAA,IACA,UAAU,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,CAAE,MAAA,GAAS,IAAI,QAAA,GAAW;AAAA,GAC1D;AACF;AAIA,SAAS,gBAAgB,KAAA,EAAwC;AAC/D,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,WAAW,CAAA;AACtC;AAEA,SAAS,qBAAqB,KAAA,EAA0B;AACtD,EAAA,OAAO,KAAA,CAAM,WAAA,GAAc,KAAA,CAAM,KAAA,CAAM,MAAA,EAAQ;AAC7C,IAAA,MAAM,IAAI,KAAA,CAAM,KAAA,CAAM,KAAA,CAAM,WAAW,EAAE,IAAA,EAAK;AAC9C,IAAA,IAAI,CAAA,KAAM,EAAA,IAAM,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,EAAG;AACjC,MAAA,KAAA,CAAM,WAAA,EAAA;AAAA,IACR,CAAA,MAAO;AACL,MAAA;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,UAAUF,KAAAA,EAAsB;AACvC,EAAA,MAAM,KAAA,GAAQA,KAAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AACjC,EAAA,OAAO,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,CAAE,MAAA,GAAS,CAAA;AACnC;AAgBA,SAAS,kBAAkB,OAAA,EAAwC;AAEjE,EAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA;AAAA,IACpB;AAAA,GACF;AACA,EAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AAEnB,EAAA,MAAM,WAAA,GAAc,CAAC,CAAC,KAAA,CAAM,CAAC,CAAA;AAC7B,EAAA,MAAM,SAAS,WAAA,GAAc,KAAA,CAAM,CAAC,CAAA,GAAI,MAAM,CAAC,CAAA;AAC/C,EAAA,MAAM,gBAAgB,WAAA,GAAc,KAAA,CAAM,CAAC,CAAA,GAAI,MAAM,CAAC,CAAA;AACtD,EAAA,MAAM,IAAA,GAAA,CAAQ,cAAc,KAAA,CAAM,CAAC,IAAI,KAAA,CAAM,CAAC,GAAG,IAAA,EAAK;AAEtD,EAAA,IAAI,CAAC,eAAA,CAAgB,GAAA,CAAI,aAAa,GAAG,OAAO,IAAA;AAGhD,EAAA,MAAM,EAAE,EAAA,EAAI,OAAA,EAAS,KAAA,EAAM,GAAI,kBAAkB,IAAI,CAAA;AACrD,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,2BAA2B,IAAA,CAAK,OAAO,GAAG,OAAO,IAAA;AAElE,EAAA,OAAO,EAAE,MAAA,EAAQ,aAAA,EAAe,OAAA,EAAS,aAAa,KAAA,EAAM;AAC9D;AAEA,SAAS,kBAAkB,GAAA,EAAmD;AAE5E,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,KAAA,CAAM,wCAAwC,CAAA;AACrE,EAAA,IAAI,UAAA,EAAY,OAAO,EAAE,EAAA,EAAI,UAAA,CAAW,CAAC,CAAA,EAAG,KAAA,EAAO,UAAA,CAAW,CAAC,CAAA,EAAE;AACjE,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,KAAA,CAAM,4BAA4B,CAAA;AACrD,EAAA,IAAI,MAAA,SAAe,EAAE,EAAA,EAAI,OAAO,CAAC,CAAA,EAAG,OAAO,IAAA,EAAK;AAChD,EAAA,OAAO,EAAE,EAAA,EAAI,GAAA,CAAI,IAAA,EAAK,EAAG,OAAO,IAAA,EAAK;AACvC;AAEA,SAAS,gBAAgB,QAAA,EAA6D;AAEpF,EAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,qBAAqB,CAAA;AAClD,EAAA,IAAI,KAAA,EAAO,OAAO,EAAE,OAAA,EAAS,KAAA,CAAM,CAAC,CAAA,CAAE,IAAA,EAAK,EAAG,KAAA,EAAO,KAAA,CAAM,CAAC,CAAA,EAAE;AAC9D,EAAA,OAAO,EAAE,OAAA,EAAS,QAAA,EAAU,KAAA,EAAO,IAAA,EAAK;AAC1C;AAEA,SAAS,eAAe,OAAA,EAAqC;AAC3D,EAAA,KAAA,MAAW,MAAM,UAAA,EAAY;AAC3B,IAAA,MAAM,KAAA,GAAQ,eAAA,CAAgB,OAAA,EAAS,EAAA,CAAG,KAAK,CAAA;AAC/C,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,OAAO,EAAE,MAAA,EAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,EAAK,EAAG,EAAA,EAAI,QAAA,EAAU,KAAA,CAAM,KAAA,CAAM,IAAA,EAAK,EAAE;AAAA,IACvE;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,eAAA,CACPA,OACA,EAAA,EACwC;AAExC,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAIA,KAAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,IAAA,IAAIA,KAAAA,CAAK,CAAC,CAAA,KAAM,GAAA,EAAK,YAAA,EAAA;AACrB,IAAA,IAAIA,KAAAA,CAAK,CAAC,CAAA,KAAM,GAAA,EAAK,YAAA,EAAA;AACrB,IAAA,IAAI,eAAe,CAAA,EAAG;AAEtB,IAAA,IAAIA,MAAK,SAAA,CAAU,CAAA,EAAG,IAAI,EAAA,CAAG,MAAM,MAAM,EAAA,EAAI;AAC3C,MAAA,MAAM,OAAOA,KAAAA,CAAK,SAAA,CAAU,CAAA,EAAG,CAAC,EAAE,IAAA,EAAK;AACvC,MAAA,MAAM,QAAQA,KAAAA,CAAK,SAAA,CAAU,IAAI,EAAA,CAAG,MAAM,EAAE,IAAA,EAAK;AACjD,MAAA,IAAI,QAAQ,KAAA,EAAO;AAEjB,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,0BAA0B,CAAA;AACpD,QAAA,IAAI,MAAA,EAAQ,OAAO,EAAE,IAAA,EAAM,KAAA,EAAM;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,yBAAyB,GAAA,EAGhC;AACA,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA;AAClC,EAAA,IAAI,eAAe,EAAA,EAAI;AACrB,IAAA,OAAO,EAAE,EAAA,EAAI,GAAA,CAAI,IAAA,EAAK,EAAG,OAAO,IAAA,EAAK;AAAA,EACvC;AACA,EAAA,MAAM,KAAK,GAAA,CAAI,SAAA,CAAU,CAAA,EAAG,UAAU,EAAE,IAAA,EAAK;AAC7C,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,WAAA,CAAY,GAAG,CAAA;AACtC,EAAA,MAAM,QAAA,GAAW,IAAI,SAAA,CAAU,UAAA,GAAa,GAAG,UAAA,KAAe,EAAA,GAAK,GAAA,CAAI,MAAA,GAAS,UAAU,CAAA;AAC1F,EAAA,OAAO,EAAE,EAAA,EAAI,KAAA,EAAO,QAAA,EAAS;AAC/B;AAEA,SAAS,gBAAgB,OAAA,EAA0D;AACjF,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AACtC,EAAA,IAAI,eAAe,EAAA,EAAI;AACrB,IAAA,OAAO,EAAE,EAAA,EAAI,OAAA,CAAQ,IAAA,EAAK,EAAG,UAAU,IAAA,EAAK;AAAA,EAC9C;AACA,EAAA,MAAM,KAAK,OAAA,CAAQ,SAAA,CAAU,CAAA,EAAG,UAAU,EAAE,IAAA,EAAK;AACjD,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,WAAA,CAAY,GAAG,CAAA;AAC1C,EAAA,MAAM,WAAW,OAAA,CAAQ,SAAA;AAAA,IACvB,UAAA,GAAa,CAAA;AAAA,IACb,UAAA,KAAe,EAAA,GAAK,OAAA,CAAQ,MAAA,GAAS;AAAA,GACvC;AACA,EAAA,OAAO,EAAE,IAAI,QAAA,EAAS;AACxB;AAEA,SAAS,YAAY,QAAA,EAA4B;AAC/C,EAAA,OAAO,UAAA,CAAW,QAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,IAAA,EAAK,CAAE,WAAA,EAAa,CAAA;AAC/D;AAEA,SAAS,WAAW,QAAA,EAA4B;AAC9C,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,IAAI,OAAA,GAAU,EAAA;AACd,EAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,EAAA,KAAA,MAAW,MAAM,QAAA,EAAU;AACzB,IAAA,IAAI,OAAO,GAAA,EAAK,UAAA,EAAA;AAChB,IAAA,IAAI,OAAO,GAAA,EAAK,UAAA,EAAA;AAChB,IAAA,IAAI,EAAA,KAAO,GAAA,IAAO,UAAA,KAAe,CAAA,EAAG;AAClC,MAAA,MAAA,CAAO,KAAK,OAAO,CAAA;AACnB,MAAA,OAAA,GAAU,EAAA;AAAA,IACZ,CAAA,MAAO;AACL,MAAA,OAAA,IAAW,EAAA;AAAA,IACb;AAAA,EACF;AACA,EAAA,IAAI,OAAA,CAAQ,IAAA,EAAK,EAAG,MAAA,CAAO,KAAK,OAAO,CAAA;AACvC,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,eAAA,CACP,EAAA,EACA,QAAA,EACA,OAAA,EACA,QAAA,EACY;AACZ,EAAA,MAAM,UAAA,GAAyB;AAAA,IAC7B,EAAA,EAAI,GAAG,WAAA,EAAY;AAAA,IACnB,KAAA,EAAO,EAAA;AAAA,IACP,GAAA,EAAK,SAAA;AAAA,IACL,MAAA,EAAQ;AAAA,GACV;AAEA,EAAA,IAAI,CAAC,UAAU,OAAO,UAAA;AAEtB,EAAA,MAAM,MAAA,GAAS,WAAW,QAAQ,CAAA;AAElC,EAAA,KAAA,MAAW,YAAY,MAAA,EAAQ;AAC7B,IAAA,MAAM,KAAA,GAAQ,SAAS,IAAA,EAAK;AAC5B,IAAA,MAAM,UAAA,GAAa,MAAM,WAAA,EAAY;AAErC,IAAA,IAAI,SAAA,CAAU,GAAA,CAAI,UAAU,CAAA,EAAG;AAC7B,MAAA,UAAA,CAAW,GAAA,GAAM,UAAA;AAAA,IACnB,CAAA,MAAA,IAAW,YAAA,CAAa,GAAA,CAAI,UAAU,CAAA,EAAG;AACvC,MAAA,UAAA,CAAW,MAAA,GAAS,UAAA;AAAA,IACtB,CAAA,MAAA,IAAW,eAAe,OAAA,EAAS;AACjC,MAAA,IAAI,CAAC,UAAA,CAAW,OAAA,EAAS,UAAA,CAAW,UAAU,EAAC;AAC/C,MAAA,UAAA,CAAW,OAAA,CAAQ,KAAK,cAAc,CAAA;AAAA,IACxC,CAAA,MAAA,IAAW,mBAAA,CAAoB,GAAA,CAAI,UAAU,CAAA,EAAG;AAE9C,MAAA;AAAA,IACF,CAAA,MAAA,IAAW,SAAA,CAAU,IAAA,CAAK,UAAU,CAAA,EAAG;AACrC,MAAA,IAAI,UAAA,CAAW,cAAc,MAAA,EAAW;AACtC,QAAA,UAAA,CAAW,SAAA,GAAY,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AAAA,MAC3C,CAAA,MAAO;AACL,QAAA,UAAA,CAAW,SAAA,GAAY,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AAAA,MAC3C;AAAA,IACF,CAAA,MAAA,IAAW,UAAA,CAAW,UAAA,CAAW,aAAa,CAAA,EAAG;AAC/C,MAAA,UAAA,CAAW,UAAA,GAAa,eAAA;AAAA,QACtB,KAAA,CAAM,SAAA,CAAU,aAAA,CAAc,MAAM,EAAE,IAAA,EAAK;AAAA,QAC3C,OAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA,MAAA,IAAW,KAAA,CAAM,QAAA,CAAS,GAAG,CAAA,EAAG;AAC9B,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA;AAClC,MAAA,MAAM,GAAA,GAAM,MAAM,SAAA,CAAU,CAAA,EAAG,QAAQ,CAAA,CAAE,IAAA,GAAO,WAAA,EAAY;AAC5D,MAAA,MAAM,QAAQ,KAAA,CAAM,SAAA,CAAU,QAAA,GAAW,CAAC,EAAE,IAAA,EAAK;AACjD,MAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,QAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AACjC,QAAA,IAAI,CAAC,KAAA,CAAM,MAAM,CAAA,aAAc,GAAA,GAAM,MAAA;AAAA,MACvC,CAAA,MAAA,IAAW,QAAQ,OAAA,EAAS;AAC1B,QAAA,MAAM,QAAA,GAAW,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AACnC,QAAA,IAAI,CAAC,KAAA,CAAM,QAAQ,CAAA,aAAc,SAAA,GAAY,QAAA;AAAA,MAC/C,CAAA,MAAA,IAAW,QAAQ,OAAA,EAAS;AAC1B,QAAA,UAAA,CAAW,KAAA,GAAQ,KAAA,CAAM,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA;AAAA,MAC/C,CAAA,MAAO;AACL,QAAA,IAAI,CAAC,UAAA,CAAW,UAAA,EAAY,UAAA,CAAW,aAAa,EAAC;AACrD,QAAA,UAAA,CAAW,UAAA,CAAW,GAAG,CAAA,GAAI,KAAA;AAAA,MAC/B;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,UAAA;AAAA,QACR,qBAAqB,KAAK,CAAA,oMAAA,CAAA;AAAA,QAC1B,OAAA;AAAA,QACA,CAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,eAAA,CACP,GAAA,EACA,OAAA,EACA,QAAA,EACa;AACb,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AAChD,EAAA,MAAM,aAA0B,EAAC;AAEjC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,+BAA+B,CAAA;AACxD,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,UAAA;AAAA,QACR,6BAA6B,IAAI,CAAA,6CAAA,CAAA;AAAA,QACjC,OAAA;AAAA,QACA,CAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,GAAG,KAAA,EAAO,QAAQ,CAAA,GAAI,KAAA;AAC5B,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,EAAM,CAAA;AAC1D,IAAA,MAAM,IAAA,GAAO,WAAW,CAAC,CAAA;AACzB,IAAA,MAAM,KAAA,GAAQ,WAAW,CAAC,CAAA;AAE1B,IAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA,EAAG;AAC1B,MAAA,MAAM,IAAI,UAAA;AAAA,QACR,yBAAyB,IAAI,CAAA,0HAAA,CAAA;AAAA,QAC7B,OAAA;AAAA,QACA,CAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAkB,EAAE,KAAA,EAAO,IAAA,EAA4B;AAC7D,IAAA,IAAI,KAAA,OAAY,KAAA,GAAQ,KAAA;AACxB,IAAA,UAAA,CAAW,KAAK,IAAI,CAAA;AAAA,EACtB;AAEA,EAAA,OAAO,UAAA;AACT;AAEA,SAAS,eAAA,CACP,UACA,QAAA,EACY;AACZ,EAAA,OAAO;AAAA,IACL,GAAG,QAAA;AAAA,IACH,KAAK,QAAA,CAAS,GAAA,KAAQ,SAAA,GAAY,QAAA,CAAS,MAAM,QAAA,CAAS,GAAA;AAAA,IAC1D,QAAQ,QAAA,CAAS,MAAA,KAAW,OAAA,GAAU,QAAA,CAAS,SAAS,QAAA,CAAS,MAAA;AAAA,IACjE,SAAA,EAAW,QAAA,CAAS,SAAA,IAAa,QAAA,CAAS,SAAA;AAAA,IAC1C,SAAA,EAAW,QAAA,CAAS,SAAA,IAAa,QAAA,CAAS,SAAA;AAAA,IAC1C,UAAA,EAAY,QAAA,CAAS,UAAA,IAAc,QAAA,CAAS,UAAA;AAAA,IAC5C,UAAA,EAAY;AAAA,MACV,GAAG,QAAA,CAAS,UAAA;AAAA,MACZ,GAAG,QAAA,CAAS;AAAA;AACd,GACF;AACF;;;AC7iBO,SAAS,cAAA,CACd,KACA,MAAA,EACc;AACd,EAAA,MAAM,KAAA,GAAQ,WAAW,GAAG,CAAA;AAC5B,EAAA,iBAAA,CAAkB,KAAK,CAAA;AACvB,EAAA,MAAM,OAAA,GAAU,uBAAA,CAAwB,KAAa,CAAA;AACrD,EAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,OAAA,EAAS,KAAA,EAAO,MAAM,CAAA;AACxD,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,KAAA,EAAO,SAAA,EAAW,MAAM,CAAA;AACnD,EAAA,MAAM,cAAA,GAAiB,qBAAA,CAAsB,GAAA,CAAI,aAAA,EAAe,WAAW,MAAM,CAAA;AACjF,EAAA,OAAO,aAAA,CAAc,WAAW,CAAC,GAAG,OAAO,GAAG,cAAc,CAAA,EAAG,KAAA,EAAO,MAAM,CAAA;AAC9E;AAIA,SAAS,WAAW,GAAA,EAA8B;AAChD,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAwB;AAChD,EAAA,KAAA,MAAW,GAAA,IAAO,IAAI,WAAA,EAAa;AACjC,IAAA,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,EAAA,EAAI,GAAG,CAAA;AAAA,EAC7B;AAEA,EAAA,MAAM,cAA4B,EAAC;AACnC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAoB;AAGxC,EAAA,MAAM,UAAA,GAAa,IAAI,aAAA,CAAc,MAAA;AAAA,IACnC,CAAC,CAAA,KACC,CAAA,CAAE,SAAS,SAAA,IACX,CAAA,CAAE,SAAS,UAAA,IACX,CAAA,CAAE,IAAA,KAAS,WAAA,IACX,EAAE,IAAA,KAAS,SAAA,IACX,EAAE,IAAA,KAAS,YAAA,IACX,EAAE,IAAA,KAAS;AAAA,GACf;AAEA,EAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,IAAA,MAAM,OAAO,CAAA,EAAG,GAAA,CAAI,IAAI,CAAA,CAAA,EAAI,IAAI,EAAE,CAAA,CAAA;AAGlC,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA;AACrC,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA;AACnC,IAAA,IAAI,QAAA;AAEJ,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,IAAI,IAAA,CAAK,GAAA,KAAQ,MAAA,IAAU,IAAA,CAAK,QAAQ,QAAA,EAAU;AAChD,QAAA,QAAA,GAAW,CAAC,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,EAAE,CAAA;AAAA,MAC9B,WAAW,IAAA,CAAK,GAAA,KAAQ,QAAA,IAAY,IAAA,CAAK,QAAQ,MAAA,EAAQ;AACvD,QAAA,QAAA,GAAW,CAAC,GAAA,CAAI,EAAA,EAAI,GAAA,CAAI,IAAI,CAAA;AAAA,MAC9B,CAAA,MAAO;AAEL,QAAA,MAAM,KAAA,GAAQ,KAAK,SAAA,IAAa,IAAA;AAChC,QAAA,MAAM,KAAA,GAAQ,KAAK,SAAA,IAAa,IAAA;AAChC,QAAA,QAAA,GAAW,KAAA,IAAS,KAAA,GAAQ,CAAC,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,EAAE,CAAA,GAAI,CAAC,GAAA,CAAI,EAAA,EAAI,GAAA,CAAI,IAAI,CAAA;AAAA,MACpE;AAAA,IACF,CAAA,MAAO;AACL,MAAA,QAAA,GAAW,CAAC,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,EAAE,CAAA;AAAA,IAC9B;AAGA,IAAA,MAAM,WAAqB,EAAC;AAC5B,IAAA,KAAA,MAAW,CAAA,IAAK,IAAI,aAAA,EAAe;AACjC,MAAA,IAAA,CACG,CAAA,CAAE,IAAA,KAAS,cAAA,IACV,CAAA,CAAE,IAAA,KAAS,SAAA,IACX,CAAA,CAAE,IAAA,KAAS,QAAA,KACb,CAAA,CAAE,IAAA,KAAS,IAAA,EACX;AACA,QAAA,QAAA,CAAS,IAAA,CAAK,EAAE,EAAE,CAAA;AAClB,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,EAAA,EAAI,IAAI,CAAA;AAAA,MACxB;AAAA,IACF;AAGA,IAAA,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACtB,MAAA,MAAM,SAAA,GAAY,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA;AACnC,MAAA,MAAM,SAAA,GAAY,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA;AACnC,MAAA,OAAA,CAAQ,SAAA,EAAW,SAAA,IAAa,IAAA,KAAS,SAAA,EAAW,SAAA,IAAa,IAAA,CAAA;AAAA,IACnE,CAAC,CAAA;AAED,IAAA,WAAA,CAAY,IAAA,CAAK;AAAA,MACf,EAAA,EAAI,IAAA;AAAA,MACJ,QAAA;AAAA,MACA,cAAc,GAAA,CAAI,IAAA;AAAA,MAClB,OAAO,GAAA,CAAI,KAAA;AAAA,MACX;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,EAAE,WAAA,EAAa,WAAA,EAAa,6BAAa,IAAI,GAAA,IAAO,OAAA,EAAQ;AACrE;AAIA,SAAS,kBAAkB,KAAA,EAA0B;AACnD,EAAA,MAAM,EAAE,WAAA,EAAa,WAAA,EAAa,OAAA,EAAS,aAAY,GAAI,KAAA;AAG3D,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,OAAO,MAAA,CAAO,CAAC,OAAO,CAAC,OAAA,CAAQ,GAAA,CAAI,EAAE,CAAC,CAAA;AAEpD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,IAAK,MAAA,CAAO,SAAS,CAAA,EAAG;AAE3C,IAAA,KAAA,MAAW,EAAA,IAAM,MAAA,EAAQ,WAAA,CAAY,GAAA,CAAI,IAAI,CAAC,CAAA;AAC9C,IAAA;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,IAAI,CAAA,EAAG;AAC1B,MAAA,WAAA,CAAY,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,IACzB;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,GAAU,IAAA;AACd,EAAA,OAAO,OAAA,EAAS;AACd,IAAA,OAAA,GAAU,KAAA;AACV,IAAA,KAAA,MAAW,MAAM,WAAA,EAAa;AAE5B,MAAA,MAAM,OAAO,WAAA,CAAY,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AAC3C,MAAA,MAAM,OAAO,WAAA,CAAY,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AAE3C,MAAA,IAAI,UAAA;AACJ,MAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,KAAS,MAAA,EAAW;AAC5C,QAAA,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA;AAChC,QAAA,IAAI,SAAS,UAAA,EAAY;AACvB,UAAA,WAAA,CAAY,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,GAAG,UAAU,CAAA;AAC1C,UAAA,OAAA,GAAU,IAAA;AAAA,QACZ;AACA,QAAA,IAAI,SAAS,UAAA,EAAY;AACvB,UAAA,WAAA,CAAY,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,GAAG,UAAU,CAAA;AAC1C,UAAA,OAAA,GAAU,IAAA;AAAA,QACZ;AAAA,MACF,CAAA,MAAA,IAAW,SAAS,MAAA,EAAW;AAC7B,QAAA,UAAA,GAAa,IAAA;AACb,QAAA,WAAA,CAAY,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,GAAG,UAAU,CAAA;AAC1C,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ,CAAA,MAAA,IAAW,SAAS,MAAA,EAAW;AAC7B,QAAA,UAAA,GAAa,IAAA;AACb,QAAA,WAAA,CAAY,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,GAAG,UAAU,CAAA;AAC1C,QAAA,OAAA,GAAU,IAAA;AAAA,MACZ,CAAA,MAAO;AACL,QAAA;AAAA,MACF;AAGA,MAAA,KAAA,MAAW,OAAA,IAAW,GAAG,QAAA,EAAU;AACjC,QAAA,MAAM,WAAW,UAAA,GAAa,CAAA;AAC9B,QAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA;AACxC,QAAA,IAAI,QAAA,KAAa,MAAA,IAAa,QAAA,GAAW,QAAA,EAAU;AACjD,UAAA,WAAA,CAAY,GAAA,CAAI,SAAS,QAAQ,CAAA;AACjC,UAAA,OAAA,GAAU,IAAA;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,MAAM,MAAA,EAAQ;AACvB,IAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA,EAAG;AACxB,MAAA,WAAA,CAAY,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,IACvB;AAAA,EACF;AACF;AASA,SAAS,uBAAA,CACP,OACA,OAAA,EACqB;AACrB,EAAA,MAAM,EAAE,WAAA,EAAa,WAAA,EAAY,GAAI,KAAA;AAGrC,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAAsB;AAC5C,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,GAAG,CAAA,IAAK,WAAA,EAAa;AACnC,IAAA,MAAME,MAAAA,GAAQ,SAAA,CAAU,GAAA,CAAI,GAAG,KAAK,EAAC;AACrC,IAAAA,MAAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,SAAA,CAAU,GAAA,CAAI,KAAKA,MAAK,CAAA;AAAA,EAC1B;AAEA,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AACpE,EAAA,MAAM,SAA8B,EAAC;AAErC,EAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC/B,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,GAAA,CAAI,MAAM,KAAK,EAAC;AAG1C,IAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,OAAA,EAAS,MAAA,EAAQ,OAAO,WAAW,CAAA;AACnE,IAAA,MAAA,CAAO,KAAK,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAA,EAAS,SAAS,CAAA;AAAA,EACjD;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,eAAA,CACP,OAAA,EACA,OAAA,EACA,KAAA,EACA,WAAA,EACU;AACV,EAAA,IAAI,QAAQ,MAAA,IAAU,CAAA,EAAG,OAAO,CAAC,GAAG,OAAO,CAAA;AAE3C,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,OAAO,CAAA;AAC/B,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAC/B,EAAA,MAAM,UAAoB,EAAC;AAE3B,EAAA,MAAM,UAAU,WAAA,CAAY,MAAA;AAAA,IAC1B,CAAC,EAAA,KAAO,OAAA,CAAQ,GAAA,CAAI,GAAG,QAAA,CAAS,CAAC,CAAC,CAAA,IAAK,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC;AAAA,GACnE;AAGA,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAA0B;AAClD,EAAA,KAAA,MAAW,MAAM,OAAA,EAAS;AACxB,IAAA,KAAA,MAAW,CAAA,IAAK,GAAG,QAAA,EAAU;AAC3B,MAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG;AAClB,QAAA,MAAM,GAAA,GAAM,WAAA,CAAY,GAAA,CAAI,CAAC,KAAK,EAAC;AACnC,QAAA,GAAA,CAAI,KAAK,EAAE,CAAA;AACX,QAAA,WAAA,CAAY,GAAA,CAAI,GAAG,GAAG,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAGA,EAAA,SAAS,qBAAqB,EAAA,EAAkB;AAC9C,IAAA,IAAI,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,EAAG;AACpB,IAAA,OAAA,CAAQ,KAAK,EAAE,CAAA;AACf,IAAA,MAAA,CAAO,IAAI,EAAE,CAAA;AAGb,IAAA,MAAM,GAAA,GAAM,WAAA,CAAY,GAAA,CAAI,EAAE,KAAK,EAAC;AAEpC,IAAA,MAAM,SAAA,GAAY,CAAC,GAAG,GAAG,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AACxC,MAAA,MAAM,SAAS,CAAA,CAAE,YAAA,KAAiB,cAAc,CAAA,CAAE,YAAA,KAAiB,cAAc,CAAA,GAAI,CAAA;AACrF,MAAA,MAAM,SAAS,CAAA,CAAE,YAAA,KAAiB,cAAc,CAAA,CAAE,YAAA,KAAiB,cAAc,CAAA,GAAI,CAAA;AACrF,MAAA,OAAO,MAAA,GAAS,MAAA;AAAA,IAClB,CAAC,CAAA;AAED,IAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,MAAA,MAAM,OAAA,GAAU,EAAA,CAAG,QAAA,CAAS,CAAC,CAAA,KAAM,EAAA,GAAK,EAAA,CAAG,QAAA,CAAS,CAAC,CAAA,GAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAA;AACtE,MAAA,IAAI,CAAC,OAAO,GAAA,CAAI,OAAO,KAAK,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,EAAG;AAChD,QAAA,OAAA,CAAQ,KAAK,OAAO,CAAA;AACpB,QAAA,MAAA,CAAO,IAAI,OAAO,CAAA;AAElB,QAAA,MAAM,UAAA,GAAa,WAAA,CAAY,GAAA,CAAI,OAAO,KAAK,EAAC;AAChD,QAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,UAAA,IAAI,GAAA,CAAI,EAAA,KAAO,EAAA,CAAG,EAAA,EAAI;AACpB,YAAA,MAAM,YAAA,GAAe,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA,KAAM,OAAA,GAAU,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA,GAAI,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA;AACnF,YAAA,oBAAA,CAAqB,YAAY,CAAA;AAAA,UACnC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,MAAM,OAAA,EAAS;AACxB,IAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,EAAA,CAAG,SAAS,CAAC,CAAC,CAAA,IAAK,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG;AAC9D,MAAA,oBAAA,CAAqB,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,IACrC;AACA,IAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,EAAA,CAAG,SAAS,CAAC,CAAC,CAAA,IAAK,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG;AAC9D,MAAA,oBAAA,CAAqB,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,IACrC;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAY,QAAQ,MAAA,CAAO,CAAC,OAAO,CAAC,MAAA,CAAO,GAAA,CAAI,EAAE,CAAC,CAAA;AACxD,EAAA,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACvB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA;AACpC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA;AACpC,IAAA,OAAA,CAAQ,IAAA,EAAM,SAAA,IAAa,IAAA,KAAS,IAAA,EAAM,SAAA,IAAa,IAAA,CAAA;AAAA,EACzD,CAAC,CAAA;AACD,EAAA,KAAA,MAAW,MAAM,SAAA,EAAW;AAC1B,IAAA,OAAA,CAAQ,KAAK,EAAE,CAAA;AACf,IAAA,MAAA,CAAO,IAAI,EAAE,CAAA;AAAA,EACf;AAEA,EAAA,OAAO,OAAA;AACT;AAWA,IAAM,YAAA,GAAe,EAAA;AACrB,IAAM,SAAA,GAAY,CAAA;AAElB,SAAS,eAAA,CACP,WAAA,EACA,KAAA,EACA,MAAA,EAC2B;AAC3B,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAA0B;AAChD,EAAA,MAAM,EAAE,SAAA,EAAW,YAAA,EAAa,GAAI,MAAA;AACpC,EAAA,MAAM,OAAO,SAAA,GAAY,CAAA;AAEzB,EAAA,MAAM,SAAA,GAAY,YAAY,YAAA,GAAe,GAAA;AAE7C,EAAA,MAAM,SAAA,GAAY,YAAY,YAAA,GAAe,GAAA;AAE7C,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,UAAA,GAAa,YAAA,GAAe,YAAY,MAAA,CAAO,YAAA;AAGvE,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,IAAA,MAAM,CAAA,GAAI,GAAA,CAAI,KAAA,GAAQ,QAAA,GAAW,IAAA;AACjC,IAAA,MAAM,WAAW,aAAA,CAAc,GAAA,CAAI,OAAA,EAAS,GAAA,CAAI,OAAO,KAAK,CAAA;AAE5D,IAAA,IAAI,OAAA,GAAU,IAAA;AACd,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA;AACtB,MAAA,IAAI,CAAA,GAAI,GAAG,OAAA,IAAW,SAAA;AAEtB,MAAA,IAAI,GAAA,CAAI,SAAS,QAAA,EAAU;AACzB,QAAA,SAAA,CAAU,IAAI,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,EAAG,EAAE,EAAA,EAAI,GAAA,CAAI,GAAA,CAAI,CAAC,GAAG,CAAA,EAAG,OAAA,EAAS,GAAG,UAAA,EAAY,GAAA,CAAI,OAAO,CAAA;AAClF,QAAA,OAAA,IAAW,SAAA;AACX,QAAA,SAAA,CAAU,IAAI,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,EAAG,EAAE,EAAA,EAAI,GAAA,CAAI,GAAA,CAAI,CAAC,GAAG,CAAA,EAAG,OAAA,EAAS,GAAG,UAAA,EAAY,GAAA,CAAI,OAAO,CAAA;AAAA,MACpF,CAAA,MAAO;AACL,QAAA,SAAA,CAAU,IAAI,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,EAAG,EAAE,EAAA,EAAI,GAAA,CAAI,GAAA,CAAI,CAAC,GAAG,CAAA,EAAG,OAAA,EAAS,GAAG,UAAA,EAAY,GAAA,CAAI,OAAO,CAAA;AAAA,MACpF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,eAAA,CAAgB,SAAA,EAAW,aAAa,MAAM,CAAA;AAG9C,EAAA,0BAAA,CAA2B,SAAA,EAAW,OAAO,MAAM,CAAA;AAGnD,EAAA,eAAA,CAAgB,SAAA,EAAW,aAAa,MAAM,CAAA;AAE9C,EAAA,OAAO,SAAA;AACT;AAQA,SAAS,aAAA,CACP,OAAA,EACA,OAAA,EACA,KAAA,EACW;AACX,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,OAAO,CAAA;AAG/B,EAAA,MAAM,SAAA,uBAAgB,GAAA,EAA0B;AAChD,EAAA,KAAA,MAAW,EAAA,IAAM,MAAM,WAAA,EAAa;AAClC,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA,IAAK,OAAA,CAAQ,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA,EAAG;AAC9D,MAAA,KAAA,MAAW,CAAA,IAAK,GAAG,QAAA,EAAU;AAC3B,QAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,CAAC,KAAK,EAAC;AACjC,QAAA,GAAA,CAAI,KAAK,EAAE,CAAA;AACX,QAAA,SAAA,CAAU,GAAA,CAAI,GAAG,GAAG,CAAA;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAY;AACrC,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,GAAG,CAAA,IAAK,SAAA,EAAW;AACjC,IAAA,IAAI,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,YAAA,CAAa,IAAI,EAAE,CAAA;AAAA,EACzC;AAEA,EAAA,MAAM,WAAsB,EAAC;AAC7B,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAE/B,EAAA,KAAA,MAAW,MAAM,OAAA,EAAS;AACxB,IAAA,IAAI,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,EAAG;AAGpB,IAAA,IAAI,YAAA,CAAa,GAAA,CAAI,EAAE,CAAA,EAAG;AACxB,MAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,EAAE,KAAK,EAAC;AAClC,MAAA,MAAM,MAAA,GAAS,CAAC,GAAG,GAAG,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AACrC,QAAA,MAAM,KAAK,CAAA,CAAE,YAAA,KAAiB,cAAc,CAAA,CAAE,YAAA,KAAiB,cAAc,CAAA,GAAI,CAAA;AACjF,QAAA,MAAM,KAAK,CAAA,CAAE,YAAA,KAAiB,cAAc,CAAA,CAAE,YAAA,KAAiB,cAAc,CAAA,GAAI,CAAA;AACjF,QAAA,OAAO,EAAA,GAAK,EAAA;AAAA,MACd,CAAC,CAAA;AAED,MAAA,KAAA,MAAWC,OAAM,MAAA,EAAQ;AACvB,QAAA,MAAM,OAAA,GAAUA,GAAAA,CAAG,QAAA,CAAS,CAAC,CAAA,KAAM,EAAA,GAAKA,GAAAA,CAAG,QAAA,CAAS,CAAC,CAAA,GAAIA,GAAAA,CAAG,QAAA,CAAS,CAAC,CAAA;AACtE,QAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA,EAAG;AAGxB,UAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,EAAG;AACnB,YAAA,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,GAAA,EAAK,CAAC,OAAA,EAAS,EAAE,CAAA,EAAG,IAAA,EAAMA,GAAAA,CAAG,EAAA,EAAI,CAAA;AACjE,YAAA,MAAA,CAAO,IAAI,OAAO,CAAA;AAClB,YAAA,MAAA,CAAO,IAAI,EAAE,CAAA;AAAA,UACf,CAAA,MAAO;AACL,YAAA,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,GAAA,EAAK,CAAC,EAAA,EAAI,OAAO,CAAA,EAAG,IAAA,EAAMA,GAAAA,CAAG,EAAA,EAAI,CAAA;AACjE,YAAA,MAAA,CAAO,IAAI,OAAO,CAAA;AAAA,UACpB;AAAA,QACF;AAAA,MACF;AACA,MAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,EAAE,CAAA,EAAG;AACnB,QAAA,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,KAAK,CAAC,EAAE,GAAG,CAAA;AAC3C,QAAA,MAAA,CAAO,IAAI,EAAE,CAAA;AAAA,MACf;AACA,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,EAAA,GAAK,MAAM,WAAA,CAAY,IAAA;AAAA,MAC3B,CAAC,CAAA,KAAA,CACE,CAAA,CAAE,SAAS,CAAC,CAAA,KAAM,MAAM,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,KAAM,OAC3C,CAAC,MAAA,CAAO,IAAI,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA,IACzB,CAAC,MAAA,CAAO,IAAI,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA,IACzB,QAAQ,GAAA,CAAI,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA,IACzB,OAAA,CAAQ,IAAI,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC;AAAA,KAC7B;AAEA,IAAA,IAAI,EAAA,EAAI;AACN,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,IAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAK,CAAC,EAAA,CAAG,QAAA,CAAS,CAAC,CAAA,EAAG,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,QACpC,MAAM,EAAA,CAAG;AAAA,OACV,CAAA;AACD,MAAA,MAAA,CAAO,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AACzB,MAAA,MAAA,CAAO,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,QAAA,EAAU,KAAK,CAAC,EAAE,GAAG,CAAA;AAC3C,MAAA,MAAA,CAAO,IAAI,EAAE,CAAA;AAAA,IACf;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAEA,SAAS,0BAAA,CACP,SAAA,EACA,KAAA,EACA,MAAA,EACM;AACN,EAAA,MAAM,SAAA,GAAY,MAAA,CAAO,YAAA,GAAe,MAAA,CAAO,SAAA;AAG/C,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAA0B;AAClD,EAAA,KAAA,MAAW,EAAA,IAAM,MAAM,WAAA,EAAa;AAClC,IAAA,KAAA,MAAW,CAAA,IAAK,GAAG,QAAA,EAAU;AAC3B,MAAA,MAAM,GAAA,GAAM,WAAA,CAAY,GAAA,CAAI,CAAC,KAAK,EAAC;AACnC,MAAA,GAAA,CAAI,KAAK,EAAE,CAAA;AACX,MAAA,WAAA,CAAY,GAAA,CAAI,GAAG,GAAG,CAAA;AAAA,IACxB;AAAA,EACF;AAGA,EAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,CAAA,EAAG,IAAA,EAAA,EAAQ;AACnC,IAAA,KAAA,MAAW,EAAA,IAAM,MAAM,WAAA,EAAa;AAClC,MAAA,IAAI,EAAA,CAAG,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG;AAE9B,MAAA,MAAM,OAAO,SAAA,CAAU,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AACzC,MAAA,MAAM,OAAO,SAAA,CAAU,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AACzC,MAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,EAAM;AAEpB,MAAA,MAAM,UAAA,GAAA,CAAc,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA,IAAK,CAAA;AAGvC,MAAA,MAAM,cAAA,GAAiB,CAAC,GAAG,EAAA,CAAG,QAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACrD,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA;AACpC,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA;AACpC,QAAA,OAAA,CAAQ,IAAA,EAAM,SAAA,IAAa,IAAA,KAAS,IAAA,EAAM,SAAA,IAAa,IAAA,CAAA;AAAA,MACzD,CAAC,CAAA;AAED,MAAA,MAAM,YAAA,GAAe,MAAA,CAAO,YAAA,GAAe,MAAA,CAAO,SAAA;AAClD,MAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAE7B,QAAA,MAAM,OAAiB,EAAC;AACxB,QAAA,KAAA,IAAS,KAAK,CAAA,EAAG,EAAA,GAAK,cAAA,CAAe,MAAA,GAAS,GAAG,EAAA,EAAA,EAAM;AACrD,UAAA,IAAI,GAAA,GAAM,YAAA;AAGV,UAAA,MAAM,SAAA,GAAY,cAAA,CAAe,EAAA,GAAK,CAAC,CAAA;AACvC,UAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,CAAI,SAAS,KAAK,EAAC;AAC/C,UAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,YAAA,MAAM,GAAA,GAAM,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA,KAAM,SAAA,GAAY,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA,GAAI,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA;AAC5E,YAAA,MAAM,IAAA,GAAO,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA;AAC5C,YAAA,MAAM,IAAA,GAAO,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AACtC,YAAA,IAAI,EAAE,MAAM,GAAA,KAAQ,MAAA,IAAW,MAAM,GAAA,KAAQ,QAAA,IAAY,IAAA,EAAM,GAAA,KAAQ,QAAA,CAAA,EAAY;AACjF,cAAA,GAAA,IAAO,SAAA;AAAA,YACT;AAAA,UACF;AAGA,UAAA,MAAM,SAAA,GAAY,eAAe,EAAE,CAAA;AACnC,UAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,CAAI,SAAS,KAAK,EAAC;AAC/C,UAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,YAAA,MAAM,GAAA,GAAM,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA,KAAM,SAAA,GAAY,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA,GAAI,GAAA,CAAI,QAAA,CAAS,CAAC,CAAA;AAC5E,YAAA,MAAM,IAAA,GAAO,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA;AAC5C,YAAA,MAAM,IAAA,GAAO,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AACtC,YAAA,IAAI,IAAA,EAAM,QAAQ,MAAA,IAAW,IAAA,EAAM,QAAQ,QAAA,IAAY,IAAA,EAAM,QAAQ,QAAA,EAAW;AAC9E,cAAA,GAAA,IAAO,SAAA;AAAA,YACT;AAAA,UACF;AAEA,UAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,QACf;AAEA,QAAA,MAAM,UAAA,GAAa,KAAK,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AACjD,QAAA,MAAM,MAAA,GAAS,aAAa,UAAA,GAAa,CAAA;AACzC,QAAA,IAAI,EAAA,GAAK,MAAA;AACT,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,cAAA,CAAe,QAAQ,CAAA,EAAA,EAAK;AAC9C,UAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,cAAA,CAAe,CAAC,CAAC,CAAA;AAC3C,UAAA,IAAI,GAAA,MAAS,CAAA,GAAI,EAAA;AACjB,UAAA,IAAI,CAAA,GAAI,IAAA,CAAK,MAAA,EAAQ,EAAA,IAAM,KAAK,CAAC,CAAA;AAAA,QACnC;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,GAAA,GAAM,SAAA,CAAU,GAAA,CAAI,cAAA,CAAe,CAAC,CAAC,CAAA;AAC3C,QAAA,IAAI,GAAA,MAAS,CAAA,GAAI,UAAA;AAAA,MACnB;AAIA,MAAA,KAAA,MAAW,OAAA,IAAW,GAAG,QAAA,EAAU;AACjC,QAAA,MAAM,QAAA,GAAW,SAAA,CAAU,GAAA,CAAI,OAAO,CAAA;AACtC,QAAA,IAAI,CAAC,QAAA,EAAU;AACf,QAAA,MAAM,QAAA,GAAW,WAAA,CAAY,GAAA,CAAI,OAAO,KAAK,EAAC;AAC9C,QAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,UAAA,MAAM,SAAA,GACJ,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAA,KAAM,OAAA,GACpB,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAA,GAClB,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAA;AACxB,UAAA,MAAM,UAAA,GAAa,SAAA,CAAU,GAAA,CAAI,SAAS,CAAA;AAC1C,UAAA,IAAI,CAAC,UAAA,EAAY;AAEjB,UAAA,MAAM,QAAA,GAAW,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,OAAO,CAAA;AAC9C,UAAA,MAAM,UAAA,GAAa,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA;AAClD,UAAA,IAAI,QAAA,EAAU,QAAQ,MAAA,IAAW,QAAA,EAAU,QAAQ,QAAA,IAAY,UAAA,EAAY,QAAQ,QAAA,EAAW;AAC5F,YAAA,UAAA,CAAW,CAAA,GAAI,SAAS,CAAA,GAAI,SAAA;AAAA,UAC9B,CAAA,MAAO;AACL,YAAA,UAAA,CAAW,CAAA,GAAI,SAAS,CAAA,GAAI,SAAA;AAAA,UAC9B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,eAAA,CACP,SAAA,EACA,WAAA,EACA,MAAA,EACM;AACN,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,SAAA,GAAY,MAAA,CAAO,YAAA;AAEzC,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,OAAA,CAClB,GAAA,CAAI,CAAC,EAAA,KAAO,SAAA,CAAU,GAAA,CAAI,EAAE,CAAC,CAAA,CAC7B,MAAA,CAAO,CAAC,CAAA,KAAyB,MAAM,MAAS,CAAA;AAEnD,IAAA,QAAA,CAAS,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,CAAA,GAAI,EAAE,CAAC,CAAA;AAEjC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,MAAA,MAAM,GAAA,GAAM,SAAS,CAAC,CAAA,CAAE,IAAI,QAAA,CAAS,CAAA,GAAI,CAAC,CAAA,CAAE,CAAA;AAC5C,MAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,QAAA,MAAM,QAAQ,MAAA,GAAS,GAAA;AAEvB,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,UAAA,QAAA,CAAS,CAAC,EAAE,CAAA,IAAK,KAAA;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,GAAO,QAAA;AACX,EAAA,KAAA,MAAW,GAAA,IAAO,SAAA,CAAU,MAAA,EAAO,EAAG;AACpC,IAAA,IAAI,GAAA,CAAI,CAAA,GAAI,IAAA,EAAM,IAAA,GAAO,GAAA,CAAI,CAAA;AAAA,EAC/B;AACA,EAAA,IAAI,IAAA,GAAO,MAAA,CAAO,SAAA,GAAY,CAAA,EAAG;AAC/B,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,SAAA,GAAY,CAAA,GAAI,IAAA;AACrC,IAAA,KAAA,MAAW,GAAA,IAAO,SAAA,CAAU,MAAA,EAAO,EAAG;AACpC,MAAA,GAAA,CAAI,CAAA,IAAK,KAAA;AAAA,IACX;AAAA,EACF;AACF;AAIA,SAAS,YAAA,CACP,KAAA,EACA,SAAA,EACA,MAAA,EACc;AACd,EAAA,MAAM,QAAsB,EAAC;AAC7B,EAAA,MAAM,IAAA,GAAO,OAAO,SAAA,GAAY,CAAA;AAChC,EAAA,MAAM,eAAe,MAAA,CAAO,UAAA,GAAa,IAAI,YAAA,GAAe,SAAA,GAAY,OAAO,YAAA,GAAe,IAAA;AAE9F,EAAA,KAAA,MAAW,EAAA,IAAM,MAAM,WAAA,EAAa;AAClC,IAAA,MAAM,OAAO,SAAA,CAAU,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AACzC,IAAA,MAAM,OAAO,SAAA,CAAU,GAAA,CAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AACzC,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,EAAM;AAEpB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,IAAI,IAAA,GAAO,IAAA;AACzC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,IAAI,IAAA,GAAO,IAAA;AAC1C,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAA,GAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAA;AAC/D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA,GAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAA,GAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAA;AAGhE,IAAA,MAAM,SAAA,GAA0B;AAAA,MAC9B,MAAM,EAAA,CAAG,YAAA;AAAA,MACT,IAAA,EAAM,MAAA;AAAA,MACN,EAAA,EAAI,OAAA;AAAA,MACJ,OAAO,EAAA,CAAG;AAAA,KACZ;AACA,IAAA,MAAM,UAAA,GAAa,CAAA,EAAA,EAAK,OAAA,CAAQ,CAAA,GAAI,IAAI,CAAA,CAAA,EAAI,OAAA,CAAQ,CAAC,CAAA,GAAA,EAAM,QAAA,CAAS,CAAA,GAAI,IAAI,CAAA,CAAA,EAAI,SAAS,CAAC,CAAA,CAAA;AAC1F,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,IAAA,EAAM,MAAA;AAAA,MACN,EAAA,EAAI,OAAA;AAAA,MACJ,YAAA,EAAc,SAAA;AAAA,MACd,IAAA,EAAM;AAAA,KACP,CAAA;AAGD,IAAA,IAAI,EAAA,CAAG,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AAC1B,MAAA,MAAM,IAAA,GAAA,CAAQ,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,CAAA,IAAK,CAAA;AACjC,MAAA,MAAM,UAAU,IAAA,CAAK,CAAA;AACrB,MAAA,MAAM,QAAQ,OAAA,GAAU,YAAA;AAExB,MAAA,MAAM,cAAA,GAAiB,EAAA,CAAG,QAAA,CACvB,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,QACb,EAAA,EAAI,GAAA;AAAA,QACJ,GAAA,EAAK,SAAA,CAAU,GAAA,CAAI,GAAG;AAAA,QACtB,CAAA,CACD,MAAA;AAAA,QACC,CAAC,CAAA,KAA8C,CAAA,CAAE,GAAA,KAAQ;AAAA,OAC3D;AAEF,MAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAEjC,MAAA,cAAA,CAAe,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,GAAA,CAAI,CAAA,GAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA;AAE/C,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,CAAC,CAAA,CAAE,GAAA,CAAI,CAAA;AACpC,MAAA,MAAM,SAAS,cAAA,CAAe,cAAA,CAAe,MAAA,GAAS,CAAC,EAAE,GAAA,CAAI,CAAA;AAG7D,MAAA,MAAM,QAAA,GAAW,KAAK,IAAI,CAAA,CAAA,EAAI,OAAO,CAAA,GAAA,EAAM,IAAI,IAAI,KAAK,CAAA,CAAA;AACxD,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,IAAA,EAAM,EAAA,CAAG,QAAA,CAAS,CAAC,CAAA;AAAA,QACnB,EAAA,EAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAA;AAAA,QACjB,YAAA,EAAc,EAAE,IAAA,EAAM,cAAA,EAAgB,MAAM,EAAA,CAAG,EAAA,EAAI,IAAI,OAAA,EAAQ;AAAA,QAC/D,IAAA,EAAM;AAAA,OACP,CAAA;AAGD,MAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,QAAA,MAAM,OAAA,GAAU,KAAK,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,GAAA,EAAM,MAAM,IAAI,KAAK,CAAA,CAAA;AACxD,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,IAAA,EAAM,EAAA,CAAG,QAAA,CAAS,CAAC,CAAA;AAAA,UACnB,EAAA,EAAI,EAAA,CAAG,QAAA,CAAS,CAAC,CAAA;AAAA,UACjB,YAAA,EAAc,EAAE,IAAA,EAAM,cAAA,EAAgB,MAAM,EAAA,CAAG,EAAA,EAAI,IAAI,UAAA,EAAW;AAAA,UAClE,IAAA,EAAM;AAAA,SACP,CAAA;AAAA,MACH;AAGA,MAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,QAAA,MAAM,QAAA,GAAW,KAAA,CAAM,GAAA,CAAI,CAAA,GAAI,OAAO,UAAA,GAAa,CAAA;AACnD,QAAA,IAAI,SAAA;AACJ,QAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAC/B,UAAA,IAAI,KAAK,GAAA,CAAI,KAAA,CAAM,IAAI,CAAA,GAAI,IAAI,IAAI,CAAA,EAAG;AACpC,YAAA,SAAA,GAAY,KAAK,IAAI,CAAA,CAAA,EAAI,OAAO,CAAA,GAAA,EAAM,IAAI,IAAI,QAAQ,CAAA,CAAA;AAAA,UACxD,CAAA,MAAO;AACL,YAAA,SAAA,GAAY,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,EAAI,KAAK,MAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,GAAA,EAAM,KAAA,CAAM,GAAA,CAAI,CAAC,IAAI,QAAQ,CAAA,CAAA;AAAA,UACvF;AAAA,QACF,CAAA,MAAO;AACL,UAAA,SAAA,GAAY,CAAA,EAAA,EAAK,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,GAAA,EAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAAA,QACpE;AAEA,QAAA,MAAM,QAAQ,kBAAA,CAAmB,KAAA,EAAO,EAAA,CAAG,EAAA,EAAI,MAAM,EAAE,CAAA;AACvD,QAAA,KAAA,CAAM,IAAA,CAAK;AAAA,UACT,MAAM,EAAA,CAAG,EAAA;AAAA,UACT,IAAI,KAAA,CAAM,EAAA;AAAA,UACV,cAAc,KAAA,IAAS;AAAA,YACrB,IAAA,EAAM,cAAA;AAAA,YACN,MAAM,EAAA,CAAG,EAAA;AAAA,YACT,IAAI,KAAA,CAAM;AAAA,WACZ;AAAA,UACA,IAAA,EAAM;AAAA,SACP,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,kBAAA,CACP,KAAA,EACA,KAAA,EACA,OAAA,EAC0B;AAE1B,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AACtC,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,cAAA;AAAA,IACN,IAAA,EAAM,IAAA;AAAA,IACN,EAAA,EAAI;AAAA,GACN;AACF;AAIA,SAAS,aAAA,CACP,SAAA,EACA,KAAA,EACA,KAAA,EACA,MAAA,EACc;AACd,EAAA,MAAM,OAAA,GAAU,EAAA;AAChB,EAAA,MAAM,QAAsB,EAAC;AAE7B,EAAA,KAAA,MAAW,CAAC,EAAA,EAAI,GAAG,CAAA,IAAK,SAAA,EAAW;AACjC,IAAA,MAAM,GAAA,GAAM,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,EAAE,CAAA;AACpC,IAAA,IAAI,CAAC,GAAA,EAAK;AAEV,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,EAAA;AAAA,MACA,CAAA,EAAG,GAAA,CAAI,CAAA,GAAI,MAAA,CAAO,YAAY,CAAA,GAAI,OAAA;AAAA,MAClC,CAAA,EAAG,GAAA,CAAI,CAAA,GAAI,MAAA,CAAO,aAAa,CAAA,GAAI,OAAA;AAAA,MACnC,OAAO,MAAA,CAAO,SAAA;AAAA,MACd,QAAQ,MAAA,CAAO,UAAA;AAAA,MACf,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACrC,GAAG,CAAA;AAAA,IACH,IAAA,EAAM,SAAA,CAAU,CAAA,CAAE,IAAA,EAAM,SAAS,OAAO;AAAA,GAC1C,CAAE,CAAA;AAEF,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,IAAI,IAAA,GAAO,QAAA;AACX,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,CAAA;AACjC,IAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,IAAA,CAAK,UAAU,CAAA;AACnD,IAAA,MAAM,cAAA,GAAiB,UAAU,MAAA,GAAS,GAAA;AAC1C,IAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,IAAA,CAAK,KAAA,EAAO,KAAK,cAAc,CAAA;AAC/D,IAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,CAAA,EAAG,KAAK,cAAc,CAAA;AACjD,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA;AAC7B,IAAA,IAAI,KAAA,GAAQ,MAAM,IAAA,GAAO,KAAA;AACzB,IAAA,IAAI,MAAA,GAAS,MAAM,IAAA,GAAO,MAAA;AAC1B,IAAA,IAAI,IAAA,GAAO,MAAM,IAAA,GAAO,IAAA;AAAA,EAC1B;AAGA,EAAA,IAAI,OAAO,CAAA,EAAG;AACZ,IAAA,MAAM,QAAQ,CAAC,IAAA;AACf,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAA,CAAK,CAAA,IAAK,KAAA;AAAA,IACZ;AACA,IAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,MAAA,IAAA,CAAK,IAAA,GAAO,SAAA,CAAU,IAAA,CAAK,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,IAC3C;AACA,IAAA,IAAA,IAAQ,KAAA;AAAA,EACV;AAEA,EAAA,OAAO;AAAA,IACL,OAAO,IAAA,GAAO,OAAA;AAAA,IACd,MAAA,EAAQ,IAAA,GAAO,OAAA,GAAU,SAAA,GAAY,YAAA,GAAe,EAAA;AAAA,IACpD,KAAA;AAAA,IACA,KAAA,EAAO;AAAA,GACT;AACF;AAEA,SAAS,kBAAkB,GAAA,EAAyB;AAClD,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,EAAA;AAC9B,EAAA,IAAI,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,SAAA,EAAW,OAAO,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,GAAA,CAAI,SAAS,CAAA,MAAA,EAAI,GAAA,CAAI,SAAS,CAAA,CAAA,CAAA;AACrF,EAAA,IAAI,IAAI,SAAA,EAAW,OAAO,GAAG,IAAI,CAAA,KAAA,EAAQ,IAAI,SAAS,CAAA,CAAA,CAAA;AACtD,EAAA,OAAO,IAAA;AACT;AAIA,IAAM,mBAAA,uBAA0B,GAAA,CAAI;AAAA,EAClC,SAAA;AAAA,EAAW,OAAA;AAAA,EAAS,aAAA;AAAA,EAAe,MAAA;AAAA,EAAQ,QAAA;AAAA,EAAU,YAAA;AAAA,EACrD,SAAA;AAAA,EAAW,UAAA;AAAA,EAAY,QAAA;AAAA,EAAU,iBAAA;AAAA,EAAmB,QAAA;AAAA,EACpD,eAAA;AAAA,EAAiB,OAAA;AAAA,EAAS,eAAA;AAAA,EAC1B,SAAA;AAAA,EAAW,QAAA;AAAA,EAAU,UAAA;AAAA,EACrB,OAAA;AAAA,EAAS,gBAAA;AAAA,EAAkB,iBAAA;AAAA,EAAmB,cAAA;AAAA,EAAgB,SAAA;AAAA,EAC9D,cAAA;AAAA,EAAgB,aAAA;AAAA,EAAe,SAAA;AAAA,EAC/B,SAAA;AAAA,EAAW,aAAA;AAAA,EAAe,UAAA;AAAA,EAAY,SAAA;AAAA,EAAW;AACnD,CAAC,CAAA;AAED,SAAS,qBAAA,CACP,aAAA,EACA,SAAA,EACA,MAAA,EACc;AACd,EAAA,MAAM,QAAsB,EAAC;AAC7B,EAAA,MAAM,IAAA,GAAO,OAAO,SAAA,GAAY,CAAA;AAEhC,EAAA,MAAM,aAAA,GAAgB,cAAc,MAAA,CAAO,CAAA,CAAA,KAAK,oBAAoB,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,CAAA;AAE/E,EAAA,KAAA,MAAW,OAAO,aAAA,EAAe;AAC/B,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA;AACnC,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,GAAA,CAAI,GAAA,CAAI,EAAE,CAAA;AACjC,IAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,IAAA,EAAM;AAGpB,IAAA,MAAM,KAAK,IAAA,CAAK,CAAA;AAChB,IAAA,MAAM,KAAK,IAAA,CAAK,CAAA;AAChB,IAAA,MAAM,KAAK,IAAA,CAAK,CAAA;AAChB,IAAA,MAAM,KAAK,IAAA,CAAK,CAAA;AAEhB,IAAA,IAAI,QAAA;AAEJ,IAAA,IAAI,IAAA,CAAK,UAAA,KAAe,IAAA,CAAK,UAAA,EAAY;AAEvC,MAAA,MAAM,IAAA,GAAA,CAAQ,KAAK,EAAA,IAAM,CAAA;AACzB,MAAA,MAAM,MAAA,GAAS,KAAK,IAAA,GAAO,EAAA;AAC3B,MAAA,QAAA,GAAW,CAAA,EAAA,EAAK,EAAE,CAAA,CAAA,EAAI,EAAA,GAAK,IAAI,CAAA,GAAA,EAAM,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,KAAK,IAAI,CAAA,CAAA;AAAA,IACxE,CAAA,MAAO;AAEL,MAAA,MAAM,IAAA,GAAA,CAAQ,KAAK,EAAA,IAAM,CAAA;AACzB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC5B,MAAA,MAAM,MAAA,GAAS,OAAO,IAAA,GAAO,EAAA;AAC7B,MAAA,QAAA,GAAW,CAAA,EAAA,EAAK,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,GAAA,EAAM,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA;AAAA,IAC1D;AAEA,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,IAAI,GAAA,CAAI,EAAA;AAAA,MACR,YAAA,EAAc,GAAA;AAAA,MACd,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,SAAA,CAAU,QAAA,EAAkB,EAAA,EAAY,EAAA,EAAoB;AAEnE,EAAA,OAAO,QAAA,CAAS,OAAA;AAAA,IACd,wBAAA;AAAA,IACA,CAAC,MAAA,EAAQ,IAAA,EAAc,IAAA,KAAiB;AACtC,MAAA,MAAM,CAAA,GAAI,UAAA,CAAW,IAAI,CAAA,GAAI,EAAA;AAC7B,MAAA,MAAM,CAAA,GAAI,UAAA,CAAW,IAAI,CAAA,GAAI,EAAA;AAC7B,MAAA,OAAO,CAAA,EAAG,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA;AAAA,IAClB;AAAA,GACF;AACF;;;ACn2BO,SAAS,sBAAA,CACd,UAAA,EACA,CAAA,EACA,CAAA,EACA,IAAA,EACQ;AACR,EAAA,MAAM,OAAO,IAAA,GAAO,CAAA;AACpB,EAAA,MAAM,OAAA,GAAU;AAAA,IACd,yBAAA;AAAA,IACA,sBAAsB,UAAA,CAAW,GAAA,KAAQ,OAAA,GAAU,SAAA,GAAY,WAAW,GAAG,CAAA;AAAA,GAC/E;AACA,EAAA,IAAI,UAAA,CAAW,MAAA,KAAW,UAAA,EAAY,OAAA,CAAQ,KAAK,6BAA6B,CAAA;AAEhF,EAAA,MAAM,SAAA,GAAY,YAAY,UAAU,CAAA;AACxC,EAAA,MAAM,QAAA,GAAqB,CAAC,KAAA,CAAM,SAAS,CAAC,CAAA;AAG5C,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,OAAA,EAAS,QAAA,CAAS,cAAc,CAAA;AAC3D,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,QAAA,CAAS,IAAA,CAAK,WAAA,CAAY,UAAA,CAAW,GAAA,EAAK,IAAI,CAAC,CAAA;AAC/C,IAAA,OAAA,CAAQ,KAAK,iCAAiC,CAAA;AAAA,EAChD;AAGA,EAAA,QAAA,CAAS,IAAA,CAAK,SAAA,CAAU,UAAA,CAAW,GAAA,EAAK,IAAI,CAAC,CAAA;AAG7C,EAAA,IAAI,UAAA,CAAW,YAAY,MAAA,EAAQ;AACjC,IAAA,KAAA,MAAW,IAAA,IAAQ,WAAW,UAAA,EAAY;AACxC,MAAA,QAAA,CAAS,KAAK,oBAAA,CAAqB,UAAA,CAAW,GAAA,EAAK,IAAA,EAAM,IAAI,CAAC,CAAA;AAAA,IAChE;AAAA,EACF;AAGA,EAAA,IAAI,UAAA,CAAW,WAAW,UAAA,EAAY;AACpC,IAAA,QAAA,CAAS,KAAK,GAAG,eAAA,CAAgB,UAAA,CAAW,GAAA,EAAK,IAAI,CAAC,CAAA;AAAA,EACxD;AAGA,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,GAAA,IAAO,OAAA,CAAQ,UAAU,CAAA;AACtD,EAAA,IAAI,cAAc,MAAA,EAAW;AAC3B,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,IAAA;AAAA,QACE;AAAA,UACE,CAAA,EAAG,CAAA;AAAA,UACH,CAAA,EAAG,CAAA;AAAA,UACH,KAAA,EAAO,wBAAA;AAAA,UACP,aAAA,EAAe,QAAA;AAAA,UACf,WAAA,EAAa;AAAA,SACf;AAAA,QACA,OAAO,SAAS;AAAA;AAClB,KACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AAAA,IACL;AAAA,MACE,KAAA,EAAO,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAA;AAAA,MACvB,sBAAsB,UAAA,CAAW,EAAA;AAAA,MACjC,SAAA,EAAW,CAAA,UAAA,EAAa,CAAC,CAAA,EAAA,EAAK,CAAC,CAAA,CAAA;AAAA,KACjC;AAAA,IACA;AAAA,GACF;AACF;AAEO,SAAS,eAAA,CAAgB,WAAA,EAA2B,kBAAA,GAAqB,KAAA,EAAe;AAC7F,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AACpC,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,IAAA,IAAI,IAAI,UAAA,EAAY;AAClB,MAAA,KAAA,MAAW,IAAA,IAAQ,IAAI,UAAA,EAAY;AACjC,QAAA,WAAA,CAAY,GAAA,CAAI,KAAK,IAAI,CAAA;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,IAAI,WAAA,CAAY,GAAA,CAAI,WAAW,CAAA,EAAG;AAChC,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,EAAA,CAAG,UAAA,EAAY,EAAE,EAAA,EAAI,0CAAyC,EAAG;AAAA,QAC/D,IAAA,CAAK,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,KAAK,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ;AAAA,OACtD,CAAA;AAAA,MACD,EAAA,CAAG,UAAA,EAAY,EAAE,EAAA,EAAI,4CAA2C,EAAG;AAAA,QACjE,IAAA,CAAK,EAAE,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,OAAO,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO;AAAA,OACxD;AAAA,KACH;AAAA,EACF;AAEA,EAAA,IAAI,WAAA,CAAY,GAAA,CAAI,YAAY,CAAA,EAAG;AACjC,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,EAAA,CAAG,UAAA,EAAY,EAAE,EAAA,EAAI,2CAA0C,EAAG;AAAA,QAChE,IAAA,CAAK,EAAE,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,KAAK,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ;AAAA,OACxD,CAAA;AAAA,MACD,EAAA,CAAG,UAAA,EAAY,EAAE,EAAA,EAAI,6CAA4C,EAAG;AAAA,QAClE,IAAA,CAAK,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,OAAO,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO;AAAA,OACtD;AAAA,KACH;AAAA,EACF;AAEA,EAAA,IAAI,WAAA,CAAY,GAAA,CAAI,aAAa,CAAA,EAAG;AAClC,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,EAAA,CAAG,UAAA,EAAY,EAAE,EAAA,EAAI,4CAA2C,EAAG;AAAA,QACjE,IAAA,CAAK,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,OAAO,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO;AAAA,OACxD,CAAA;AAAA,MACD,EAAA,CAAG,UAAA,EAAY,EAAE,EAAA,EAAI,8CAA6C,EAAG;AAAA,QACnE,IAAA,CAAK,EAAE,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,KAAK,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM;AAAA,OACtD;AAAA,KACH;AAAA,EACF;AAEA,EAAA,IAAI,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA,EAAG;AAC9B,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,EAAA,CAAG,UAAA,EAAY,EAAE,EAAA,EAAI,wCAAuC,EAAG;AAAA,QAC7D,IAAA,CAAK,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,KAAK,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO;AAAA,OACrD,CAAA;AAAA,MACD,EAAA,CAAG,UAAA,EAAY,EAAE,EAAA,EAAI,0CAAyC,EAAG;AAAA,QAC/D,IAAA,CAAK,EAAE,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,OAAO,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM;AAAA,OACvD;AAAA,KACH;AAAA,EACF;AAEA,EAAA,IAAI,WAAA,CAAY,GAAA,CAAI,UAAU,CAAA,EAAG;AAC/B,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,EAAA,CAAG,UAAA,EAAY,EAAE,EAAA,EAAI,yCAAwC,EAAG;AAAA,QAC9D,IAAA,CAAK,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,KAAK,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO;AAAA,OACtD,CAAA;AAAA,MACD,EAAA,CAAG,UAAA,EAAY,EAAE,EAAA,EAAI,2CAA0C,EAAG;AAAA,QAChE,IAAA,CAAK,EAAE,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,OAAO,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM;AAAA,OACxD;AAAA,KACH;AAAA,EACF;AAEA,EAAA,IAAI,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA,EAAG;AAC9B,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,EAAA,CAAG,UAAA,EAAY,EAAE,EAAA,EAAI,wCAAuC,EAAG;AAAA,QAC7D,IAAA,CAAK,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,KAAK,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO;AAAA,OACrD,CAAA;AAAA,MACD,EAAA,CAAG,UAAA,EAAY,EAAE,EAAA,EAAI,0CAAyC,EAAG;AAAA,QAC/D,IAAA,CAAK,EAAE,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,OAAO,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM;AAAA,OACvD;AAAA,KACH;AAAA,EACF;AAEA,EAAA,IAAI,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA,EAAG;AAC9B,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,EAAA,CAAG,UAAA,EAAY,EAAE,EAAA,EAAI,wCAAuC,EAAG;AAAA,QAC7D,IAAA,CAAK,EAAE,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,KAAK,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO;AAAA,OACvD,CAAA;AAAA,MACD,EAAA,CAAG,UAAA,EAAY,EAAE,EAAA,EAAI,0CAAyC,EAAG;AAAA,QAC/D,IAAA,CAAK,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,OAAO,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM;AAAA,OACrD;AAAA,KACH;AAAA,EACF;AAEA,EAAA,IAAI,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA,EAAG;AAC9B,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,EAAA,CAAG,UAAA,EAAY,EAAE,EAAA,EAAI,wCAAuC,EAAG;AAAA,QAC7D,IAAA,CAAK,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,OAAO,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO;AAAA,OACvD,CAAA;AAAA,MACD,EAAA,CAAG,UAAA,EAAY,EAAE,EAAA,EAAI,0CAAyC,EAAG;AAAA,QAC/D,IAAA,CAAK,EAAE,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,KAAK,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM;AAAA,OACrD;AAAA,KACH;AAAA,EACF;AAEA,EAAA,IAAI,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA,EAAG;AAC9B,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,EAAA,CAAG,UAAA,EAAY,EAAE,EAAA,EAAI,wCAAuC,EAAG;AAAA,QAC7D,IAAA,CAAK,EAAE,CAAA,EAAG,KAAA,EAAO,CAAA,EAAG,OAAO,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO;AAAA,OACzD,CAAA;AAAA,MACD,EAAA,CAAG,UAAA,EAAY,EAAE,EAAA,EAAI,0CAAyC,EAAG;AAAA,QAC/D,IAAA,CAAK,EAAE,CAAA,EAAG,GAAA,EAAK,CAAA,EAAG,KAAK,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,IAAA,EAAM;AAAA,OACnD;AAAA,KACH;AAAA,EACF;AAEA,EAAA,IAAI,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA,EAAG;AAC9B,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,OAAA;AAAA,QACE;AAAA,UACE,EAAA,EAAI,oCAAA;AAAA,UACJ,YAAA,EAAc,gBAAA;AAAA,UACd,KAAA,EAAO,GAAA;AAAA,UACP,MAAA,EAAQ;AAAA,SACV;AAAA,QACA;AAAA,UACE,IAAA,CAAK;AAAA,YACH,CAAA,EAAG,mCAAA;AAAA,YACH,MAAA,EAAQ,MAAA;AAAA,YACR,cAAA,EAAgB;AAAA,WACjB;AAAA;AACH;AACF,KACF;AAAA,EACF;AAEA,EAAA,IAAI,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC7B,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,OAAA;AAAA,QACE;AAAA,UACE,EAAA,EAAI,mCAAA;AAAA,UACJ,YAAA,EAAc,gBAAA;AAAA,UACd,KAAA,EAAO,GAAA;AAAA,UACP,MAAA,EAAQ;AAAA,SACV;AAAA,QACA;AAAA,UACE,MAAA,CAAO,EAAE,EAAA,EAAI,GAAA,EAAK,EAAA,EAAI,KAAK,CAAA,EAAG,GAAA,EAAK,IAAA,EAAM,MAAA,EAAQ;AAAA;AACnD;AACF,KACF;AAAA,EACF;AAEA,EAAA,IAAI,kBAAA,EAAoB;AACtB,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,GAAG,QAAA,EAAU;AAAA,QACX,EAAA,EAAI,0BAAA;AAAA,QACJ,OAAA,EAAS,WAAA;AAAA,QACT,IAAA,EAAM,IAAA;AAAA,QACN,IAAA,EAAM,GAAA;AAAA,QACN,WAAA,EAAa,GAAA;AAAA,QACb,YAAA,EAAc,GAAA;AAAA,QACd,MAAA,EAAQ;AAAA,OACV,EAAG;AAAA,QACD,KAAK,EAAE,CAAA,EAAG,uBAAA,EAAyB,IAAA,EAAM,QAAQ;AAAA,OAClD;AAAA,KACH;AAAA,EACF;AAEA,EAAA,OAAO,KAAK,QAAQ,CAAA;AACtB;AAIA,SAAS,WAAW,CAAA,EAAmB;AACrC,EAAA,OAAO,CAAA,CAAE,OAAO,CAAC,CAAA,CAAE,aAAY,GAAI,CAAA,CAAE,MAAM,CAAC,CAAA;AAC9C;AAEA,SAAS,YAAY,GAAA,EAAyB;AAC5C,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,GAAA,CAAI,KAAA,IAAS,IAAI,EAAE,CAAA;AAC3C,EAAA,IAAI,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,SAAA,EAAW;AAClC,IAAA,OAAO,GAAG,IAAI,CAAA,EAAA,EAAK,IAAI,SAAS,CAAA,CAAA,EAAI,IAAI,SAAS,CAAA,CAAA,CAAA;AAAA,EACnD;AACA,EAAA,IAAI,IAAI,SAAA,EAAW;AACjB,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAA,EAAK,GAAA,CAAI,SAAS,CAAA,CAAA,CAAA;AAAA,EAClC;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,QAAQ,GAAA,EAAqC;AACpD,EAAA,IAAI,CAAC,GAAA,CAAI,SAAA,EAAW,OAAO,MAAA;AAC3B,EAAA,IAAI,GAAA,CAAI,SAAA,EAAW,OAAO,GAAA,CAAI,YAAY,GAAA,CAAI,SAAA;AAC9C,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,UAAA,EAAY,OAAO,MAAA;AACtC,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,WAAA,CAAY,KAAwB,IAAA,EAAsB;AACjE,EAAA,MAAM,QAAQ,IAAA,GAAO,CAAA;AACrB,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,MAAA;AACH,MAAA,OAAO,IAAA,CAAK;AAAA,QACV,GAAG,CAAC,KAAA;AAAA,QACJ,GAAG,CAAC,KAAA;AAAA,QACJ,OAAO,KAAA,GAAQ,CAAA;AAAA,QACf,QAAQ,KAAA,GAAQ,CAAA;AAAA,QAChB,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH,KAAK,QAAA;AACH,MAAA,OAAO,MAAA,CAAO;AAAA,QACZ,EAAA,EAAI,CAAA;AAAA,QACJ,EAAA,EAAI,CAAA;AAAA,QACJ,CAAA,EAAG,KAAA;AAAA,QACH,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH,KAAK,SAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,WAAA;AAAA,IACL,KAAK,UAAA;AACH,MAAA,OAAO,OAAA,CAAQ;AAAA,QACb,MAAA,EAAQ,CAAA,EAAA,EAAK,CAAC,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAA,EAAI,CAAC,KAAK,CAAA,EAAA,CAAA;AAAA,QACnD,KAAA,EAAO;AAAA,OACR,CAAA;AAAA;AAEP;AAEA,SAAS,SAAA,CAAU,KAAwB,IAAA,EAAsB;AAC/D,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,MAAA;AACH,MAAA,OAAO,IAAA,CAAK;AAAA,QACV,GAAG,CAAC,IAAA;AAAA,QACJ,GAAG,CAAC,IAAA;AAAA,QACJ,OAAO,IAAA,GAAO,CAAA;AAAA,QACd,QAAQ,IAAA,GAAO,CAAA;AAAA,QACf,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH,KAAK,QAAA;AACH,MAAA,OAAO,MAAA,CAAO;AAAA,QACZ,EAAA,EAAI,CAAA;AAAA,QACJ,EAAA,EAAI,CAAA;AAAA,QACJ,CAAA,EAAG,IAAA;AAAA,QACH,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH,KAAK,SAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,WAAA;AAAA,IACL,KAAK,UAAA;AACH,MAAA,OAAO,OAAA,CAAQ;AAAA,QACb,MAAA,EAAQ,CAAA,EAAA,EAAK,CAAC,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAA,EAAI,CAAC,IAAI,CAAA,EAAA,CAAA;AAAA,QAC/C,KAAA,EAAO;AAAA,OACR,CAAA;AAAA;AAEP;AAEA,SAAS,eAAA,CAAgB,KAAwB,IAAA,EAAwB;AACvE,EAAA,MAAM,MAAA,GAAS,GAAA,KAAQ,QAAA,GAAW,IAAA,GAAO,KAAA,GAAQ,IAAA;AACjD,EAAA,OAAO;AAAA,IACL,IAAA,CAAK;AAAA,MACH,IAAI,CAAC,MAAA;AAAA,MACL,IAAI,CAAC,MAAA;AAAA,MACL,EAAA,EAAI,MAAA;AAAA,MACJ,EAAA,EAAI,MAAA;AAAA,MACJ,KAAA,EAAO,kCAAA;AAAA,MACP,MAAA,EAAQ,MAAA;AAAA,MACR,cAAA,EAAgB;AAAA,KACjB,CAAA;AAAA,IACD,IAAA,CAAK;AAAA,MACH,EAAA,EAAI,MAAA;AAAA,MACJ,IAAI,CAAC,MAAA;AAAA,MACL,IAAI,CAAC,MAAA;AAAA,MACL,EAAA,EAAI,MAAA;AAAA,MACJ,KAAA,EAAO,kCAAA;AAAA,MACP,MAAA,EAAQ,MAAA;AAAA,MACR,cAAA,EAAgB;AAAA,KACjB;AAAA,GACH;AACF;AAEA,SAAS,oBAAA,CACP,GAAA,EACA,IAAA,EACA,IAAA,EACQ;AACR,EAAA,MAAM,SAAA,GAAY,KAAK,KAAA,IAAS,MAAA;AAChC,EAAA,MAAM,QAAyC,EAAC;AAEhD,EAAA,IAAI,IAAA,CAAK,SAAS,MAAA,EAAQ;AACxB,IAAA,KAAA,CAAM,IAAA,GAAO,SAAA;AAAA,EACf,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,SAAA,EAAW;AAClC,IAAA,KAAA,CAAM,IAAA,GAAO,0CAAA;AAAA,EACf,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,QAAA,EAAU;AACjC,IAAA,KAAA,CAAM,IAAA,GAAO,yCAAA;AAAA,EACf,CAAA,MAAO;AACL,IAAA,MAAM,UAAA,GAAa,GAAA,KAAQ,QAAA,GAAW,QAAA,GAAW,MAAA;AACjD,IAAA,KAAA,CAAM,WAAW,CAAA,GAAI,CAAA,6BAAA,EAAgC,IAAA,CAAK,IAAI,IAAI,UAAU,CAAA,CAAA,CAAA;AAC5E,IAAA,KAAA,CAAM,IAAA,GAAO,SAAA;AAAA,EACf;AAEA,EAAA,KAAA,CAAM,KAAA,GAAQ,CAAA,+DAAA,EAAkE,IAAA,CAAK,KAAK,CAAA,CAAA;AAE1F,EAAA,QAAQ,GAAA;AAAK,IACX,KAAK,MAAA;AACH,MAAA,OAAO,KAAK,EAAE,CAAA,EAAG,CAAC,IAAA,EAAM,GAAG,CAAC,IAAA,EAAM,KAAA,EAAO,IAAA,GAAO,GAAG,MAAA,EAAQ,IAAA,GAAO,CAAA,EAAG,GAAG,OAAO,CAAA;AAAA,IACjF,KAAK,QAAA;AACH,MAAA,OAAO,MAAA,CAAO,EAAE,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,EAAG,IAAA,EAAM,GAAG,KAAA,EAAO,CAAA;AAAA,IACnD,KAAK,SAAA;AAAA,IACL,KAAK,OAAA;AAAA,IACL,KAAK,WAAA;AAAA,IACL,KAAK,UAAA;AAAA,IACL;AACE,MAAA,OAAO,OAAA,CAAQ;AAAA,QACb,MAAA,EAAQ,CAAA,EAAA,EAAK,CAAC,IAAI,CAAA,CAAA,EAAI,IAAI,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAA,EAAI,CAAC,IAAI,CAAA,EAAA,CAAA;AAAA,QAC/C,GAAG;AAAA,OACJ,CAAA;AAAA;AAEP;;;AC/XO,SAAS,cAAA,CACd,MAAA,EACA,MAAA,EACA,GAAA,EACQ;AACR,EAAA,MAAM,iBAAiB,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,CAAA,KAAK,CAAA,CAAE,aAAa,WAAW,CAAA;AACxE,EAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,MAAA,CAAO,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,CAAA,EAAG,cAAc,CAAA;AACrF,EAAA,MAAM,QAAA,GAAW,YAAY,MAAM,CAAA;AAEnC,EAAA,MAAM,SAAA,GAAY,iBAAA,CAAkB,MAAA,CAAO,KAAK,CAAA;AAGhD,EAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,CAAA,CAAA,KAAK,CAACC,oBAAAA,CAAoB,GAAA,CAAI,CAAA,CAAE,YAAA,CAAa,IAAI,CAAC,CAAA;AAC9F,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,CAAA,CAAA,KAAKA,qBAAoB,GAAA,CAAI,CAAA,CAAE,YAAA,CAAa,IAAI,CAAC,CAAA;AAE5F,EAAA,MAAM,UAAA,GAAa,YAAY,eAAe,CAAA;AAC9C,EAAA,MAAM,cAAA,GAAiB,qBAAqB,cAAc,CAAA;AAC1D,EAAA,MAAM,UAAA,GAAa,YAAY,SAAS,CAAA;AACxC,EAAA,MAAM,UAAA,GAAa,YAAA,CAAa,MAAA,CAAO,KAAA,EAAO,MAAM,CAAA;AACpD,EAAA,MAAM,cAAA,GAAiB,gBAAA,CAAiB,eAAA,EAAiB,MAAM,CAAA;AAE/D,EAAA,MAAM,SAAA,GAAY,OAAO,KAAA,CAAM,MAAA;AAC/B,EAAA,MAAM,WAAW,SAAA,CAAU,IAAA;AAE3B,EAAA,MAAM,UAAA,GAAa,KAAK,QAAA,EAAU,KAAA;AAGlC,EAAA,MAAM,WAAA,GAAc,aAAa,EAAA,GAAK,CAAA;AACtC,EAAA,MAAM,WAAA,GAAc,OAAO,MAAA,GAAS,WAAA;AAEpC,EAAA,MAAM,MAAA,GAAmB;AAAA,IACvB,KAAA,CAAM,UAAA,GAAa,CAAA,UAAA,EAAa,UAAU,KAAK,UAAU,CAAA;AAAA,IACzD,IAAA;AAAA,MACE,CAAA,sBAAA,EAAyB,SAAS,CAAA,oBAAA,EAAuB,QAAQ,CAAA,YAAA;AAAA,KACnE;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,IAAA;AAAA,QACE;AAAA,UACE,CAAA,EAAG,OAAO,KAAA,GAAQ,CAAA;AAAA,UAClB,CAAA,EAAG,EAAA;AAAA,UACH,KAAA,EAAO,0BAAA;AAAA,UACP,aAAA,EAAe,QAAA;AAAA,UACf,WAAA,EAAa,IAAA;AAAA,UACb,aAAA,EAAe,MAAA;AAAA,UACf,eAAe,MAAA,CAAO;AAAA,SACxB;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF;AAGA,EAAA,MAAM,YAAA,GAAe,KAAA;AAAA,IACnB,EAAE,SAAA,EAAW,WAAA,GAAc,IAAI,CAAA,aAAA,EAAgB,WAAW,MAAM,MAAA,EAAU;AAAA,IAC1E,CAAC,UAAA,EAAY,cAAA,EAAgB,GAAG,UAAA,EAAY,YAAY,cAAc;AAAA,GACxE;AACA,EAAA,MAAA,CAAO,KAAK,YAAY,CAAA;AAExB,EAAA,OAAO,OAAA;AAAA,IACL;AAAA,MACE,OAAA,EAAS,CAAA,IAAA,EAAO,MAAA,CAAO,KAAK,IAAI,WAAW,CAAA,CAAA;AAAA,MAC3C,KAAA,EAAO,sCAAA;AAAA,MACP,OAAO,MAAA,CAAO,KAAA;AAAA,MACd,MAAA,EAAQ;AAAA,KACV;AAAA,IACA;AAAA,GACF;AACF;AAMA,SAAS,YAAY,MAAA,EAA8B;AACjD,EAAA,MAAM,CAAA,GAAI,oBAAA,CAAqB,MAAA,CAAO,KAAK,CAAA;AAC3C,EAAA,MAAM,GAAA,GAAM;AAAA,qBAAA,EACS,mBAAA,CAAoB,CAAC,CAAC;AAAA,cAAA,EAC7B,EAAE,EAAE,CAAA;AAAA;AAAA,kCAAA,EAEgB,EAAE,IAAI,CAAA,UAAA,EAAa,EAAE,MAAM,CAAA,gBAAA,EAAmB,aAAa,MAAM,CAAA;AAAA,2DAAA,EACxC,EAAE,QAAQ,CAAA;AAAA,6DAAA,EACR,EAAE,UAAU,CAAA;AAAA,8DAAA,EACX,EAAE,WAAW,CAAA;AAAA,yCAAA,EAClC,OAAO,UAAU,CAAA,aAAA,EAAgB,OAAO,QAAQ,CAAA,+BAAA,EAAkC,EAAE,IAAI,CAAA;AAAA,mCAAA,EAC9F,CAAA,CAAE,OAAO,CAAA,gBAAA,EAAmB,YAAA,CAAa,MAAM,CAAA;AAAA;AAAA,6EAAA,EAEL,CAAA,CAAE,OAAO,CAAA,gBAAA,EAAmB,YAAA,CAAa,MAAM,CAAA;AAAA,iFAAA,EAC3C,CAAA,CAAE,OAAO,CAAA,gBAAA,EAAmB,YAAA,CAAa,MAAM,CAAA;AAAA,4CAAA,EACpF,CAAA,CAAE,YAAY,CAAA,gBAAA,EAAmB,YAAA,CAAa,MAAM,CAAA;AAAA,2CAAA,EACrD,EAAE,aAAa,CAAA;AAAA,uCAAA,EACnB,MAAA,CAAO,UAAU,CAAA,QAAA,EAAW,CAAA,CAAE,IAAI,CAAA;AAAA,kCAAA,EACvC,EAAE,IAAI,CAAA;AAAA,8CAAA,EACM,MAAA,CAAO,UAAU,CAAA,QAAA,EAAW,CAAA,CAAE,IAAI,CAAA;AAAA,2CAAA,EACrC,CAAA,CAAE,IAAI,CAAA,gBAAA,EAAmB,YAAA,CAAa,KAAK,CAAA;AAAA,CAAA;AAEtF,EAAA,OAAO,EAAA,CAAG,OAAA,EAAS,EAAC,EAAG,GAAG,CAAA;AAC5B;AAIA,IAAMA,oBAAAA,uBAA0B,GAAA,CAAY;AAAA,EAC1C,SAAA;AAAA,EAAW,OAAA;AAAA,EAAS,aAAA;AAAA,EAAe,MAAA;AAAA,EAAQ,QAAA;AAAA,EAAU,YAAA;AAAA,EACrD,SAAA;AAAA,EAAW,UAAA;AAAA,EAAY,QAAA;AAAA,EAAU,iBAAA;AAAA,EAAmB,QAAA;AAAA,EACpD,eAAA;AAAA,EAAiB,OAAA;AAAA,EAAS,eAAA;AAAA,EAC1B,SAAA;AAAA,EAAW,QAAA;AAAA,EAAU,UAAA;AAAA,EACrB,OAAA;AAAA,EAAS,gBAAA;AAAA,EAAkB,iBAAA;AAAA,EAAmB,cAAA;AAAA,EAAgB,SAAA;AAAA,EAC9D,cAAA;AAAA,EAAgB,aAAA;AAAA,EAAe,SAAA;AAAA,EAC/B,SAAA;AAAA,EAAW,aAAA;AAAA,EAAe,UAAA;AAAA,EAAY,SAAA;AAAA,EAAW;AACnD,CAAC,CAAA;AAED,SAAS,kBAAkB,IAAA,EAAgC;AAEzD,EAAA,IAAI,CAAC,SAAA,EAAW,OAAA,EAAS,aAAA,EAAe,MAAA,EAAQ,QAAA,EAAU,YAAY,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,EAAG,OAAO,SAAA;AAE/F,EAAA,IAAI,CAAC,SAAA,EAAW,UAAA,EAAY,QAAA,EAAU,iBAAA,EAAmB,QAAQ,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,EAAG,OAAO,SAAA;AAE1F,EAAA,IAAI,CAAC,iBAAiB,OAAA,EAAS,eAAe,EAAE,QAAA,CAAS,IAAI,GAAG,OAAO,SAAA;AAEvE,EAAA,IAAI,CAAC,WAAW,QAAA,EAAU,UAAU,EAAE,QAAA,CAAS,IAAI,GAAG,OAAO,SAAA;AAE7D,EAAA,IAAI,CAAC,OAAA,EAAS,gBAAA,EAAkB,iBAAA,EAAmB,cAAA,EAAgB,SAAS,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,EAAG,OAAO,SAAA;AAErG,EAAA,IAAI,CAAC,gBAAgB,aAAA,EAAe,SAAS,EAAE,QAAA,CAAS,IAAI,GAAG,OAAO,SAAA;AAEtE,EAAA,OAAO,SAAA;AACT;AAEA,SAAS,sBAAsB,IAAA,EAAgC;AAE7D,EAAA,IAAI,CAAC,SAAA,EAAW,UAAA,EAAY,QAAA,EAAU,iBAAA,EAAmB,iBAAiB,eAAe,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,EAAG;AACzG,IAAA,OAAO,4BAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,SAAA,EAAW,iBAAA,EAAmB,UAAU,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,EAAG;AAC7D,IAAA,OAAO,wBAAA;AAAA,EACT;AAEA,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,OAAO,wBAAA;AAAA,EACT;AACA,EAAA,OAAO,EAAA;AACT;AAEA,SAAS,wBAAwB,IAAA,EAAgC;AAE/D,EAAA,IAAI,CAAC,SAAS,eAAA,EAAiB,aAAa,EAAE,QAAA,CAAS,IAAI,GAAG,OAAO,CAAA;AAErE,EAAA,IAAI,CAAC,SAAS,eAAA,EAAiB,MAAA,EAAQ,QAAQ,CAAA,CAAE,QAAA,CAAS,IAAI,CAAA,EAAG,OAAO,CAAA;AACxE,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,qBAAqB,KAAA,EAA6B;AACzD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA,CAAM,EAAE,KAAA,EAAO,oCAAA,EAAqC,EAAG,EAAE,CAAA;AAExF,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,IAAA,GAAO,KAAK,YAAA,CAAa,IAAA;AAC/B,IAAA,MAAM,KAAA,GAAQ,kBAAkB,IAAI,CAAA;AACpC,IAAA,MAAM,SAAA,GAAY,sBAAsB,IAAI,CAAA;AAC5C,IAAA,MAAM,WAAA,GAAc,wBAAwB,IAAI,CAAA;AAChD,IAAA,MAAM,WAAA,GAAc,KAAK,YAAA,CAAa,WAAA;AAEtC,IAAA,MAAM,QAAA,GAAqB;AAAA,MACzB,GAAG,MAAA,EAAQ;AAAA,QACT,GAAG,IAAA,CAAK,IAAA;AAAA,QACR,IAAA,EAAM,MAAA;AAAA,QACN,MAAA,EAAQ,KAAA;AAAA,QACR,cAAA,EAAgB,WAAA;AAAA,QAChB,OAAO,SAAA,IAAa,MAAA;AAAA,QACpB,YAAA,EAAc,cAAc,gCAAA,GAAmC;AAAA,OAChE;AAAA,KACH;AAGA,IAAA,IAAI,IAAA,CAAK,aAAa,KAAA,EAAO;AAC3B,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AAClC,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,QAAA,CAAS,IAAA;AAAA,UACP,IAAA;AAAA,YACE;AAAA,cACE,GAAG,GAAA,CAAI,CAAA;AAAA,cACP,CAAA,EAAG,IAAI,CAAA,GAAI,CAAA;AAAA,cACX,KAAA,EAAO,+BAAA;AAAA,cACP,aAAA,EAAe,QAAA;AAAA,cACf,WAAA,EAAa,IAAA;AAAA,cACb,IAAA,EAAM;AAAA,aACR;AAAA,YACA,KAAK,YAAA,CAAa;AAAA;AACpB,SACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,KAAA;AAAA,QACE;AAAA,UACE,KAAA,EAAO,6DAA6D,IAAI,CAAA,CAAA;AAAA,UACxE,aAAa,IAAA,CAAK,IAAA;AAAA,UAClB,WAAW,IAAA,CAAK,EAAA;AAAA,UAChB,wBAAA,EAA0B;AAAA,SAC5B;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,EAAE,KAAA,EAAO,oCAAA,IAAwC,QAAQ,CAAA;AACxE;AAIA,SAAS,gBAAA,CAAiB,OAAqB,MAAA,EAA8B;AAC3E,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAI,CAAC,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO;AAC9B,IAAA,MAAM,GAAA,GAAM,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AAClC,IAAA,IAAI,CAAC,GAAA,EAAK;AAEV,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,IAAA;AAAA,QACE;AAAA,UACE,GAAG,GAAA,CAAI,CAAA;AAAA,UACP,CAAA,EAAG,IAAI,CAAA,GAAI,CAAA;AAAA,UACX,KAAA,EAAO,+BAAA;AAAA,UACP,aAAA,EAAe,QAAA;AAAA,UACf,WAAA,EAAa,IAAA;AAAA,UACb,eAAe,MAAA,CAAO;AAAA,SACxB;AAAA,QACA,KAAK,YAAA,CAAa;AAAA;AACpB,KACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,EAAE,KAAA,EAAO,gCAAA,IAAoC,MAAM,CAAA;AAClE;AAIA,SAAS,YAAY,KAAA,EAA6B;AAChD,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,OAAA,GAAU,KAAK,YAAA,CAAa,IAAA;AAClC,IAAA,MAAM,QAAA,GAAW,mDAAmD,OAAO,CAAA,CAAA;AAE3E,IAAA,MAAM,QAAA,GAAqB;AAAA,MACzB,EAAA,CAAG,QAAQ,EAAE,CAAA,EAAG,KAAK,IAAA,EAAM,KAAA,EAAO,gCAAgC;AAAA,KACpE;AAGA,IAAA,IAAI,YAAY,UAAA,EAAY;AAC1B,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AAClC,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,QAAA,CAAS,IAAA;AAAA,UACP,GAAG,MAAA,EAAQ;AAAA,YACT,EAAA,EAAI,IAAI,CAAA,GAAI,CAAA;AAAA,YACZ,EAAA,EAAI,IAAI,CAAA,GAAI,CAAA;AAAA,YACZ,EAAA,EAAI,IAAI,CAAA,GAAI,CAAA;AAAA,YACZ,EAAA,EAAI,IAAI,CAAA,GAAI,CAAA;AAAA,YACZ,KAAA,EAAO,iCAAA;AAAA,YACP,MAAA,EAAQ,MAAA;AAAA,YACR,cAAA,EAAgB;AAAA,WACjB,CAAA;AAAA,UACD,GAAG,MAAA,EAAQ;AAAA,YACT,EAAA,EAAI,GAAA,CAAI,CAAA,GAAI,CAAA,GAAI,CAAA;AAAA,YAChB,EAAA,EAAI,IAAI,CAAA,GAAI,CAAA;AAAA,YACZ,EAAA,EAAI,GAAA,CAAI,CAAA,GAAI,CAAA,GAAI,CAAA;AAAA,YAChB,EAAA,EAAI,IAAI,CAAA,GAAI,CAAA;AAAA,YACZ,KAAA,EAAO,iCAAA;AAAA,YACP,MAAA,EAAQ,MAAA;AAAA,YACR,cAAA,EAAgB;AAAA,WACjB;AAAA,SACH;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,YAAY,WAAA,EAAa;AAC3B,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA;AAClC,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,QAAA,CAAS,IAAA;AAAA,UACP,GAAG,MAAA,EAAQ;AAAA,YACT,EAAA,EAAI,IAAI,CAAA,GAAI,CAAA;AAAA,YACZ,EAAA,EAAI,IAAI,CAAA,GAAI,CAAA;AAAA,YACZ,EAAA,EAAI,IAAI,CAAA,GAAI,CAAA;AAAA,YACZ,EAAA,EAAI,IAAI,CAAA,GAAI,CAAA;AAAA,YACZ,KAAA,EAAO,oCAAA;AAAA,YACP,MAAA,EAAQ,MAAA;AAAA,YACR,cAAA,EAAgB;AAAA,WACjB;AAAA,SACH;AAAA,MACF;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,IAAA;AAAA,MACP,KAAA;AAAA,QACE;AAAA,UACE,KAAA,EAAO,QAAA;AAAA,UACP,aAAa,IAAA,CAAK,IAAA;AAAA,UAClB,WAAW,IAAA,CAAK;AAAA,SAClB;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,EAAE,KAAA,EAAO,0BAAA,IAA8B,QAAQ,CAAA;AAC9D;AAEA,SAAS,aACP,QAAA,EACiC;AACjC,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,UAAU,CAAA;AACxC,EAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,GAAS,GAAG,OAAO,IAAA;AACzC,EAAA,MAAM,EAAA,GAAK,UAAA,CAAW,MAAA,CAAO,CAAC,CAAC,CAAA;AAC/B,EAAA,MAAM,EAAA,GAAK,UAAA,CAAW,MAAA,CAAO,CAAC,CAAC,CAAA;AAC/B,EAAA,MAAM,EAAA,GAAK,UAAA,CAAW,MAAA,CAAO,CAAC,CAAC,CAAA;AAC/B,EAAA,MAAM,EAAA,GAAK,UAAA,CAAW,MAAA,CAAO,CAAC,CAAC,CAAA;AAC/B,EAAA,OAAO,EAAE,IAAI,EAAA,GAAK,EAAA,IAAM,GAAG,CAAA,EAAA,CAAI,EAAA,GAAK,MAAM,CAAA,EAAE;AAC9C;AAIA,SAAS,kBAAkB,KAAA,EAAgD;AACzE,EAAA,MAAM,MAAA,uBAAa,GAAA,EAA0B;AAC7C,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,MAAM,IAAA,CAAK,UAAA;AACjB,IAAA,MAAMF,MAAAA,GAAQ,MAAA,CAAO,GAAA,CAAI,GAAG,KAAK,EAAC;AAClC,IAAAA,MAAAA,CAAM,KAAK,IAAI,CAAA;AACf,IAAA,MAAA,CAAO,GAAA,CAAI,KAAKA,MAAK,CAAA;AAAA,EACvB;AACA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,YACP,SAAA,EACU;AACV,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAEpE,EAAA,KAAA,MAAW,UAAU,UAAA,EAAY;AAC/B,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,GAAA,CAAI,MAAM,KAAK,EAAC;AACxC,IAAA,MAAM,eAAyB,EAAC;AAEhC,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,CAAA;AACjC,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,CAAA;AAClC,MAAA,YAAA,CAAa,IAAA;AAAA,QACX,uBAAuB,IAAA,CAAK,UAAA,EAAY,EAAA,EAAI,EAAA,EAAI,KAAK,KAAK;AAAA,OAC5D;AAAA,IACF;AAEA,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,KAAA;AAAA,QACE;AAAA,UACE,KAAA,EAAO,+DAA+D,MAAM,CAAA,CAAA;AAAA,UAC5E,iBAAA,EAAmB;AAAA,SACrB;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAIA,SAAS,YAAA,CACP,OACA,MAAA,EACQ;AACR,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,MAAM,IAAA,CAAK,UAAA;AACjB,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,IAAS,GAAA,CAAI,EAAA;AAC/B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,KAAA,GAAQ,CAAA;AACjC,IAAA,MAAM,SAAS,IAAA,CAAK,CAAA,GAAI,IAAA,CAAK,MAAA,GAAS,IAAI,MAAA,CAAO,QAAA;AAEjD,IAAA,IAAI,SAAA,GAAY,MAAM,MAAA,CAAO,CAAC,EAAE,WAAA,EAAY,GAAI,KAAA,CAAM,KAAA,CAAM,CAAC,CAAA;AAC7D,IAAA,IAAI,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,SAAA,EAAW;AAClC,MAAA,SAAA,IAAa,CAAA,EAAA,EAAK,GAAA,CAAI,SAAS,CAAA,MAAA,EAAI,IAAI,SAAS,CAAA,CAAA,CAAA;AAAA,IAClD,CAAA,MAAA,IAAW,IAAI,SAAA,EAAW;AACxB,MAAA,SAAA,IAAa,CAAA,KAAA,EAAQ,IAAI,SAAS,CAAA,CAAA,CAAA;AAAA,IACpC;AAEA,IAAA,MAAA,CAAO,IAAA;AAAA,MACL,IAAA;AAAA,QACE;AAAA,UACE,CAAA,EAAG,EAAA;AAAA,UACH,CAAA,EAAG,MAAA;AAAA,UACH,KAAA,EAAO,0BAAA;AAAA,UACP,sBAAsB,GAAA,CAAI;AAAA,SAC5B;AAAA,QACA;AAAA;AACF,KACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,EAAE,KAAA,EAAO,2BAAA,IAA+B,MAAM,CAAA;AAC7D;;;ACpZO,IAAM,QAAA,GAA0B;AAAA,EACrC,IAAA,EAAM,UAAA;AAAA,EAEN,OAAOD,KAAAA,EAAuB;AAC5B,IAAA,MAAM,SAAA,GAAYA,KAAAA,CAAK,IAAA,EAAK,CAAE,KAAA,CAAM,IAAI,CAAA,CAAE,CAAC,CAAA,EAAG,IAAA,EAAK,CAAE,WAAA,EAAY,IAAK,EAAA;AACtE,IAAA,OAAO,SAAA,KAAc,UAAA,IAAc,SAAA,CAAU,UAAA,CAAW,WAAW,CAAA;AAAA,EACrE,CAAA;AAAA,EAEA,KAAA,EAAO,aAAA;AAAA,EAEP,MAAA,CAAOA,OAAc,MAAA,EAA+B;AAClD,IAAA,MAAM,GAAA,GAAM,cAAcA,KAAI,CAAA;AAC9B,IAAA,MAAM,YAAA,GAAe;AAAA,MACnB,YAAA,EAAc,EAAA;AAAA,MACd,YAAA,EAAc,GAAA;AAAA,MACd,SAAA,EAAW,EAAA;AAAA,MACX,UAAA,EAAY;AAAA,KACd;AACA,IAAA,MAAM,MAAA,GAAS,cAAA,CAAe,GAAA,EAAK,YAAY,CAAA;AAC/C,IAAA,MAAM,YAAA,GAA6B;AAAA,MACjC,UAAA,EAAY,QAAQ,UAAA,IAAc,sCAAA;AAAA,MAClC,QAAA,EAAU,QAAQ,QAAA,IAAY,EAAA;AAAA,MAC9B,KAAA,EAAO,QAAQ,KAAA,IAAS,SAAA;AAAA,MACxB,OAAA,EAAS,QAAQ,OAAA,IAAW;AAAA,KAC9B;AACA,IAAA,OAAO,cAAA,CAAe,MAAA,EAAQ,YAAA,EAAc,GAAG,CAAA;AAAA,EACjD;AACF","file":"chunk-HLYA4QBB.js","sourcesContent":["import type {\n DiagramAST,\n Individual,\n Relationship,\n RelationshipType,\n Condition,\n ConditionFill,\n} from \"../../core/types\";\n\n// ─── ParseError ─────────────────────────────────────────────\n\nexport class ParseError extends Error {\n constructor(\n message: string,\n public line: number,\n public column: number,\n public source: string\n ) {\n super(`Line ${line}, col ${column}: ${message}\\n → ${source}`);\n this.name = \"ParseError\";\n }\n}\n\n// ─── Couple operators ───────────────────────────────────────\n\nconst COUPLE_OPS: Array<{ token: string; type: RelationshipType }> = [\n { token: \"-x-\", type: \"divorced\" },\n { token: \"-/-\", type: \"separated\" },\n { token: \"-o-\", type: \"engaged\" },\n { token: \"==\", type: \"consanguineous\" as RelationshipType },\n { token: \"--\", type: \"married\" },\n { token: \"~\", type: \"cohabiting\" },\n];\n\nconst VALID_SEX = new Set([\"male\", \"female\", \"unknown\", \"other\"]);\nconst VALID_STATUS = new Set([\n \"deceased\",\n \"stillborn\",\n \"miscarriage\",\n \"abortion\",\n]);\nconst SPECIAL_CHILD_PROPS = new Set([\n \"adopted\",\n \"foster\",\n \"twin-identical\",\n \"twin-fraternal\",\n]);\nconst VALID_FILLS = new Set([\n \"full\",\n \"half-left\",\n \"half-right\",\n \"half-top\",\n \"half-bottom\",\n \"quad-tl\",\n \"quad-tr\",\n \"quad-bl\",\n \"quad-br\",\n \"quarter\",\n \"striped\",\n \"dotted\",\n]);\n\nconst EMOTIONAL_TYPES = new Set([\n \"harmony\", \"close\", \"bestfriends\", \"love\", \"inlove\", \"friendship\",\n \"hostile\", \"conflict\", \"enmity\", \"distant-hostile\", \"cutoff\",\n \"close-hostile\", \"fused\", \"fused-hostile\",\n \"distant\", \"normal\", \"nevermet\",\n \"abuse\", \"physical-abuse\", \"emotional-abuse\", \"sexual-abuse\", \"neglect\",\n \"manipulative\", \"controlling\", \"jealous\",\n \"focused\", \"focused-neg\", \"distrust\", \"admirer\", \"limerence\",\n]);\n\n\n// ─── Parser state ───────────────────────────────────────────\n\ninterface ParserState {\n lines: string[];\n currentLine: number;\n}\n\n// ─── Main entry point ───────────────────────────────────────\n\nexport function parseGenogram(text: string): DiagramAST {\n const rawLines = text.split(\"\\n\");\n const state: ParserState = { lines: rawLines, currentLine: 0 };\n\n skipBlankAndComments(state);\n\n // Parse header\n const metadata: Record<string, string> = {};\n const headerLine = currentLineText(state);\n if (headerLine === undefined) {\n throw new ParseError(\"Empty input\", 1, 1, \"\");\n }\n const headerTrimmed = headerLine.trim();\n if (!headerTrimmed.toLowerCase().startsWith(\"genogram\")) {\n throw new ParseError(\n 'Expected \"genogram\" header',\n state.currentLine + 1,\n 1,\n headerLine\n );\n }\n const titleMatch = headerTrimmed.match(/^genogram\\s+\"([^\"]*)\"$/i);\n if (titleMatch) {\n metadata.title = titleMatch[1];\n }\n state.currentLine++;\n\n // Collect individuals and relationships\n const individualsMap = new Map<string, Individual>();\n const relationships: Relationship[] = [];\n const childSpecialProps = new Map<string, string>();\n\n skipBlankAndComments(state);\n\n while (state.currentLine < state.lines.length) {\n skipBlankAndComments(state);\n if (state.currentLine >= state.lines.length) break;\n\n const lineText = state.lines[state.currentLine];\n const trimmed = lineText.trim();\n if (trimmed === \"\" || trimmed.startsWith(\"#\")) {\n state.currentLine++;\n continue;\n }\n\n // Check for emotional relationship line: `A -TYPE- B` or `A -TYPE-> B`\n const emotionalMatch = detectEmotionalOp(trimmed);\n if (emotionalMatch) {\n const { leftId, emotionalType, rightId: emRightId, directional, label: emLabel } = emotionalMatch;\n const lineNum = state.currentLine + 1;\n const leftKey = leftId.toLowerCase();\n const rightKey = emRightId.toLowerCase();\n\n if (!individualsMap.has(leftKey)) {\n throw new ParseError(`Unknown individual '${leftId}'`, lineNum, 1, lineText);\n }\n if (!individualsMap.has(rightKey)) {\n throw new ParseError(`Unknown individual '${emRightId}'`, lineNum, 1, lineText);\n }\n\n const rel: Relationship = {\n type: emotionalType as RelationshipType,\n from: leftKey,\n to: rightKey,\n };\n if (directional) rel.directional = true;\n if (emLabel) rel.label = emLabel;\n relationships.push(rel);\n state.currentLine++;\n continue;\n }\n\n const coupleMatch = detectCoupleOp(trimmed);\n if (coupleMatch) {\n const { leftId, op, rightRaw } = coupleMatch;\n const lineNum = state.currentLine + 1;\n\n // Extract optional relationship label: quoted string at the end\n const { cleaned: rightCleaned, label: relLabel } = extractRelLabel(rightRaw);\n\n // Parse right side — may have inline props\n const { id: rightId, props: rightProps } = parseIdWithOptionalProps(rightCleaned);\n\n // Ensure left individual exists\n const leftKey = leftId.toLowerCase();\n if (!individualsMap.has(leftKey)) {\n throw new ParseError(\n `Unknown individual '${leftId}'`,\n lineNum,\n 1,\n lineText\n );\n }\n\n // Register right individual if it has inline props or doesn't exist yet\n const rightKey = rightId.toLowerCase();\n if (rightProps) {\n const rightIndividual = buildIndividual(rightId, rightProps, lineNum, lineText);\n individualsMap.set(rightKey, rightIndividual);\n } else if (!individualsMap.has(rightKey)) {\n throw new ParseError(\n `Unknown individual '${rightId}'`,\n lineNum,\n 1,\n lineText\n );\n }\n\n const rel: Relationship = { type: op.type, from: leftKey, to: rightKey };\n if (relLabel) rel.label = relLabel;\n relationships.push(rel);\n\n const coupleIndent = getIndent(lineText);\n state.currentLine++;\n\n // Check for children (indented lines below couple)\n while (state.currentLine < state.lines.length) {\n const childLine = state.lines[state.currentLine];\n const childTrimmed = childLine.trim();\n\n if (childTrimmed === \"\" || childTrimmed.startsWith(\"#\")) {\n state.currentLine++;\n continue;\n }\n\n const childIndent = getIndent(childLine);\n if (childIndent <= coupleIndent) break;\n\n // This is a child line\n const childLineNum = state.currentLine + 1;\n const { id: childId, propsStr } = splitIdAndProps(childTrimmed);\n const childKey = childId.toLowerCase();\n\n const individual = buildIndividual(\n childId,\n propsStr,\n childLineNum,\n childLine\n );\n\n // Check for special child properties (adopted, foster, twin)\n if (propsStr) {\n for (const sp of SPECIAL_CHILD_PROPS) {\n if (propsTokens(propsStr).includes(sp)) {\n childSpecialProps.set(childKey, sp);\n }\n }\n }\n\n individualsMap.set(childKey, individual);\n\n // parent-child relationship: from = \"leftKey+rightKey\"\n const coupleKey = `${leftKey}+${rightKey}`;\n const pcType = childSpecialProps.get(childKey);\n const relType: RelationshipType =\n pcType && (pcType === \"adopted\" || pcType === \"foster\")\n ? pcType\n : \"parent-child\";\n relationships.push({ type: relType, from: coupleKey, to: childKey });\n\n state.currentLine++;\n }\n } else {\n // Individual definition line\n const lineNum = state.currentLine + 1;\n const { id, propsStr } = splitIdAndProps(trimmed);\n const key = id.toLowerCase();\n\n const individual = buildIndividual(id, propsStr, lineNum, lineText);\n\n const existing = individualsMap.get(key);\n if (existing) {\n individualsMap.set(key, mergeIndividual(existing, individual));\n } else {\n individualsMap.set(key, individual);\n }\n\n state.currentLine++;\n }\n }\n\n // Build twin relationships\n const twinGroups = new Map<string, string[]>();\n for (const [childKey, prop] of childSpecialProps) {\n if (prop === \"twin-identical\" || prop === \"twin-fraternal\") {\n // Find which couple this child belongs to\n const pcRel = relationships.find(\n (r) =>\n r.to === childKey &&\n (r.type === \"parent-child\" ||\n r.type === \"adopted\" ||\n r.type === \"foster\")\n );\n if (pcRel) {\n const groupKey = `${pcRel.from}:${prop}`;\n const group = twinGroups.get(groupKey) ?? [];\n group.push(childKey);\n twinGroups.set(groupKey, group);\n }\n }\n }\n for (const [groupKey, members] of twinGroups) {\n const twinType = groupKey.split(\":\")[1] as RelationshipType;\n for (let i = 0; i < members.length - 1; i++) {\n relationships.push({\n type: twinType,\n from: members[i],\n to: members[i + 1],\n });\n }\n }\n\n return {\n type: \"genogram\",\n individuals: Array.from(individualsMap.values()),\n relationships,\n metadata: Object.keys(metadata).length > 0 ? metadata : undefined,\n };\n}\n\n// ─── Helpers ────────────────────────────────────────────────\n\nfunction currentLineText(state: ParserState): string | undefined {\n return state.lines[state.currentLine];\n}\n\nfunction skipBlankAndComments(state: ParserState): void {\n while (state.currentLine < state.lines.length) {\n const t = state.lines[state.currentLine].trim();\n if (t === \"\" || t.startsWith(\"#\")) {\n state.currentLine++;\n } else {\n break;\n }\n }\n}\n\nfunction getIndent(line: string): number {\n const match = line.match(/^(\\s*)/);\n return match ? match[1].length : 0;\n}\n\ninterface CoupleMatch {\n leftId: string;\n op: { token: string; type: RelationshipType };\n rightRaw: string;\n}\n\ninterface EmotionalMatch {\n leftId: string;\n emotionalType: string;\n rightId: string;\n directional: boolean;\n label: string | null;\n}\n\nfunction detectEmotionalOp(trimmed: string): EmotionalMatch | null {\n // Pattern: ID -TYPE- ID or ID -TYPE-> ID, optionally followed by \"label\"\n const match = trimmed.match(\n /^([a-zA-Z][a-zA-Z0-9_-]*)\\s+-([\\w-]+)->(.*)|^([a-zA-Z][a-zA-Z0-9_-]*)\\s+-([\\w-]+)-\\s+(.*)/\n );\n if (!match) return null;\n\n const directional = !!match[1];\n const leftId = directional ? match[1] : match[4];\n const emotionalType = directional ? match[2] : match[5];\n const rest = (directional ? match[3] : match[6]).trim();\n\n if (!EMOTIONAL_TYPES.has(emotionalType)) return null;\n\n // Extract right ID and optional quoted label\n const { id: rightId, label } = extractIdAndLabel(rest);\n if (!rightId || !/^[a-zA-Z][a-zA-Z0-9_-]*$/.test(rightId)) return null;\n\n return { leftId, emotionalType, rightId, directional, label };\n}\n\nfunction extractIdAndLabel(raw: string): { id: string; label: string | null } {\n // ID possibly followed by \"label text\"\n const labelMatch = raw.match(/^([a-zA-Z][a-zA-Z0-9_-]*)\\s+\"([^\"]*)\"$/);\n if (labelMatch) return { id: labelMatch[1], label: labelMatch[2] };\n const idOnly = raw.match(/^([a-zA-Z][a-zA-Z0-9_-]*)$/);\n if (idOnly) return { id: idOnly[1], label: null };\n return { id: raw.trim(), label: null };\n}\n\nfunction extractRelLabel(rightRaw: string): { cleaned: string; label: string | null } {\n // Check for trailing \"label text\" after the individual definition\n const match = rightRaw.match(/^(.*?)\\s+\"([^\"]*)\"$/);\n if (match) return { cleaned: match[1].trim(), label: match[2] };\n return { cleaned: rightRaw, label: null };\n}\n\nfunction detectCoupleOp(trimmed: string): CoupleMatch | null {\n for (const op of COUPLE_OPS) {\n const parts = splitByOperator(trimmed, op.token);\n if (parts) {\n return { leftId: parts.left.trim(), op, rightRaw: parts.right.trim() };\n }\n }\n return null;\n}\n\nfunction splitByOperator(\n line: string,\n op: string\n): { left: string; right: string } | null {\n // Find operator surrounded by spaces or at word boundaries, outside brackets\n let bracketDepth = 0;\n for (let i = 0; i < line.length; i++) {\n if (line[i] === \"[\") bracketDepth++;\n if (line[i] === \"]\") bracketDepth--;\n if (bracketDepth > 0) continue;\n\n if (line.substring(i, i + op.length) === op) {\n const left = line.substring(0, i).trim();\n const right = line.substring(i + op.length).trim();\n if (left && right) {\n // Verify left is a valid ID (no brackets — it's just a reference)\n const leftId = left.match(/^[a-zA-Z][a-zA-Z0-9_-]*$/);\n if (leftId) return { left, right };\n }\n }\n }\n return null;\n}\n\nfunction parseIdWithOptionalProps(raw: string): {\n id: string;\n props: string | null;\n} {\n const bracketIdx = raw.indexOf(\"[\");\n if (bracketIdx === -1) {\n return { id: raw.trim(), props: null };\n }\n const id = raw.substring(0, bracketIdx).trim();\n const endBracket = raw.lastIndexOf(\"]\");\n const propsStr = raw.substring(bracketIdx + 1, endBracket === -1 ? raw.length : endBracket);\n return { id, props: propsStr };\n}\n\nfunction splitIdAndProps(trimmed: string): { id: string; propsStr: string | null } {\n const bracketIdx = trimmed.indexOf(\"[\");\n if (bracketIdx === -1) {\n return { id: trimmed.trim(), propsStr: null };\n }\n const id = trimmed.substring(0, bracketIdx).trim();\n const endBracket = trimmed.lastIndexOf(\"]\");\n const propsStr = trimmed.substring(\n bracketIdx + 1,\n endBracket === -1 ? trimmed.length : endBracket\n );\n return { id, propsStr };\n}\n\nfunction propsTokens(propsStr: string): string[] {\n return splitProps(propsStr).map((t) => t.trim().toLowerCase());\n}\n\nfunction splitProps(propsStr: string): string[] {\n const result: string[] = [];\n let current = \"\";\n let parenDepth = 0;\n\n for (const ch of propsStr) {\n if (ch === \"(\") parenDepth++;\n if (ch === \")\") parenDepth--;\n if (ch === \",\" && parenDepth === 0) {\n result.push(current);\n current = \"\";\n } else {\n current += ch;\n }\n }\n if (current.trim()) result.push(current);\n return result;\n}\n\nfunction buildIndividual(\n id: string,\n propsStr: string | null,\n lineNum: number,\n lineText: string\n): Individual {\n const individual: Individual = {\n id: id.toLowerCase(),\n label: id,\n sex: \"unknown\",\n status: \"alive\",\n };\n\n if (!propsStr) return individual;\n\n const tokens = splitProps(propsStr);\n\n for (const rawToken of tokens) {\n const token = rawToken.trim();\n const tokenLower = token.toLowerCase();\n\n if (VALID_SEX.has(tokenLower)) {\n individual.sex = tokenLower as Individual[\"sex\"];\n } else if (VALID_STATUS.has(tokenLower)) {\n individual.status = tokenLower as Individual[\"status\"];\n } else if (tokenLower === \"index\") {\n if (!individual.markers) individual.markers = [];\n individual.markers.push(\"index-person\");\n } else if (SPECIAL_CHILD_PROPS.has(tokenLower)) {\n // Handled at caller level for relationships\n continue;\n } else if (/^\\d{4}$/.test(tokenLower)) {\n if (individual.birthYear !== undefined) {\n individual.deathYear = parseInt(token, 10);\n } else {\n individual.birthYear = parseInt(token, 10);\n }\n } else if (tokenLower.startsWith(\"conditions:\")) {\n individual.conditions = parseConditions(\n token.substring(\"conditions:\".length).trim(),\n lineNum,\n lineText\n );\n } else if (token.includes(\":\")) {\n const colonIdx = token.indexOf(\":\");\n const key = token.substring(0, colonIdx).trim().toLowerCase();\n const value = token.substring(colonIdx + 1).trim();\n if (key === \"age\") {\n const ageNum = parseInt(value, 10);\n if (!isNaN(ageNum)) individual.age = ageNum;\n } else if (key === \"death\") {\n const deathNum = parseInt(value, 10);\n if (!isNaN(deathNum)) individual.deathYear = deathNum;\n } else if (key === \"label\") {\n individual.label = value.replace(/^\"|\"$/g, \"\");\n } else {\n if (!individual.properties) individual.properties = {};\n individual.properties[key] = value;\n }\n } else {\n throw new ParseError(\n `Unknown property '${token}'. Valid: male, female, unknown, deceased, stillborn, miscarriage, abortion, adopted, foster, twin-identical, twin-fraternal, index, a 4-digit year, conditions:..., age:N, death:YYYY, or key:value`,\n lineNum,\n 1,\n lineText\n );\n }\n }\n\n return individual;\n}\n\nfunction parseConditions(\n raw: string,\n lineNum: number,\n lineText: string\n): Condition[] {\n const parts = raw.split(\"+\").map((s) => s.trim());\n const conditions: Condition[] = [];\n\n for (const part of parts) {\n const match = part.match(/^([a-zA-Z0-9_-]+)\\(([^)]+)\\)$/);\n if (!match) {\n throw new ParseError(\n `Invalid condition format '${part}'. Expected: name(fill) or name(fill, #color)`,\n lineNum,\n 1,\n lineText\n );\n }\n const [, label, innerRaw] = match;\n const innerParts = innerRaw.split(\",\").map((s) => s.trim());\n const fill = innerParts[0];\n const color = innerParts[1]; // optional\n\n if (!VALID_FILLS.has(fill)) {\n throw new ParseError(\n `Invalid fill pattern '${fill}'. Valid: full, half-left, half-right, half-top, half-bottom, quad-tl, quad-tr, quad-bl, quad-br, quarter, striped, dotted`,\n lineNum,\n 1,\n lineText\n );\n }\n const cond: Condition = { label, fill: fill as ConditionFill };\n if (color) cond.color = color;\n conditions.push(cond);\n }\n\n return conditions;\n}\n\nfunction mergeIndividual(\n existing: Individual,\n incoming: Individual\n): Individual {\n return {\n ...existing,\n sex: incoming.sex !== \"unknown\" ? incoming.sex : existing.sex,\n status: incoming.status !== \"alive\" ? incoming.status : existing.status,\n birthYear: incoming.birthYear ?? existing.birthYear,\n deathYear: incoming.deathYear ?? existing.deathYear,\n conditions: incoming.conditions ?? existing.conditions,\n properties: {\n ...existing.properties,\n ...incoming.properties,\n },\n };\n}\n","import type {\n DiagramAST,\n Individual,\n Relationship,\n RelationshipType,\n LayoutConfig,\n LayoutResult,\n LayoutNode,\n LayoutEdge,\n} from \"../../core/types\";\n\n// ─── Internal types ─────────────────────────────────────────\n\ninterface FamilyUnit {\n id: string;\n partners: [string, string];\n relationship: RelationshipType;\n label?: string;\n children: string[];\n}\n\ninterface LayoutGraph {\n individuals: Map<string, Individual>;\n familyUnits: FamilyUnit[];\n generations: Map<string, number>;\n childOf: Map<string, string>; // childId → familyUnitId\n}\n\n// ─── Public API ─────────────────────────────────────────────\n\nexport function layoutGenogram(\n ast: DiagramAST,\n config: LayoutConfig\n): LayoutResult {\n const graph = buildGraph(ast);\n assignGenerations(graph);\n const ordered = orderNodesInGenerations(graph, config);\n const positions = assignPositions(ordered, graph, config);\n const edges = computeEdges(graph, positions, config);\n const emotionalEdges = computeEmotionalEdges(ast.relationships, positions, config);\n return packageResult(positions, [...edges, ...emotionalEdges], graph, config);\n}\n\n// ─── Step 1: Build graph ────────────────────────────────────\n\nfunction buildGraph(ast: DiagramAST): LayoutGraph {\n const individuals = new Map<string, Individual>();\n for (const ind of ast.individuals) {\n individuals.set(ind.id, ind);\n }\n\n const familyUnits: FamilyUnit[] = [];\n const childOf = new Map<string, string>();\n\n // Collect couple relationships and their children\n const coupleRels = ast.relationships.filter(\n (r) =>\n r.type === \"married\" ||\n r.type === \"divorced\" ||\n r.type === \"separated\" ||\n r.type === \"engaged\" ||\n r.type === \"cohabiting\" ||\n r.type === \"consanguineous\"\n );\n\n for (const rel of coupleRels) {\n const fuId = `${rel.from}+${rel.to}`;\n\n // Order partners: male left, female right\n const indA = individuals.get(rel.from);\n const indB = individuals.get(rel.to);\n let partners: [string, string];\n\n if (indA && indB) {\n if (indA.sex === \"male\" && indB.sex === \"female\") {\n partners = [rel.from, rel.to];\n } else if (indA.sex === \"female\" && indB.sex === \"male\") {\n partners = [rel.to, rel.from];\n } else {\n // Same sex or unknown: older left\n const yearA = indA.birthYear ?? 9999;\n const yearB = indB.birthYear ?? 9999;\n partners = yearA <= yearB ? [rel.from, rel.to] : [rel.to, rel.from];\n }\n } else {\n partners = [rel.from, rel.to];\n }\n\n // Find children for this family unit\n const children: string[] = [];\n for (const r of ast.relationships) {\n if (\n (r.type === \"parent-child\" ||\n r.type === \"adopted\" ||\n r.type === \"foster\") &&\n r.from === fuId\n ) {\n children.push(r.to);\n childOf.set(r.to, fuId);\n }\n }\n\n // Sort children by birth year\n children.sort((a, b) => {\n const indChildA = individuals.get(a);\n const indChildB = individuals.get(b);\n return (indChildA?.birthYear ?? 9999) - (indChildB?.birthYear ?? 9999);\n });\n\n familyUnits.push({\n id: fuId,\n partners,\n relationship: rel.type,\n label: rel.label,\n children,\n });\n }\n\n return { individuals, familyUnits, generations: new Map(), childOf };\n}\n\n// ─── Step 2: Assign generations ─────────────────────────────\n\nfunction assignGenerations(graph: LayoutGraph): void {\n const { individuals, familyUnits, childOf, generations } = graph;\n\n // Find roots: individuals not a child of any family unit\n const allIds = Array.from(individuals.keys());\n const roots = allIds.filter((id) => !childOf.has(id));\n\n if (roots.length === 0 && allIds.length > 0) {\n // Fallback: everyone is generation 0\n for (const id of allIds) generations.set(id, 0);\n return;\n }\n\n // BFS from roots\n for (const root of roots) {\n if (!generations.has(root)) {\n generations.set(root, 0);\n }\n }\n\n // Propagate through family units\n let changed = true;\n while (changed) {\n changed = false;\n for (const fu of familyUnits) {\n // Ensure partners are same generation\n const gen0 = generations.get(fu.partners[0]);\n const gen1 = generations.get(fu.partners[1]);\n\n let partnerGen: number;\n if (gen0 !== undefined && gen1 !== undefined) {\n partnerGen = Math.max(gen0, gen1);\n if (gen0 !== partnerGen) {\n generations.set(fu.partners[0], partnerGen);\n changed = true;\n }\n if (gen1 !== partnerGen) {\n generations.set(fu.partners[1], partnerGen);\n changed = true;\n }\n } else if (gen0 !== undefined) {\n partnerGen = gen0;\n generations.set(fu.partners[1], partnerGen);\n changed = true;\n } else if (gen1 !== undefined) {\n partnerGen = gen1;\n generations.set(fu.partners[0], partnerGen);\n changed = true;\n } else {\n continue;\n }\n\n // Children are one generation below\n for (const childId of fu.children) {\n const childGen = partnerGen + 1;\n const existing = generations.get(childId);\n if (existing === undefined || existing < childGen) {\n generations.set(childId, childGen);\n changed = true;\n }\n }\n }\n }\n\n // Assign any remaining unvisited individuals to generation 0\n for (const id of allIds) {\n if (!generations.has(id)) {\n generations.set(id, 0);\n }\n }\n}\n\n// ─── Step 3: Order nodes within generations ─────────────────\n\ninterface OrderedGeneration {\n index: number;\n nodeIds: string[];\n}\n\nfunction orderNodesInGenerations(\n graph: LayoutGraph,\n _config: LayoutConfig\n): OrderedGeneration[] {\n const { generations, familyUnits } = graph;\n\n // Group by generation\n const genGroups = new Map<number, string[]>();\n for (const [id, gen] of generations) {\n const group = genGroups.get(gen) ?? [];\n group.push(id);\n genGroups.set(gen, group);\n }\n\n const genIndices = Array.from(genGroups.keys()).sort((a, b) => a - b);\n const result: OrderedGeneration[] = [];\n\n for (const genIdx of genIndices) {\n const nodeIds = genGroups.get(genIdx) ?? [];\n\n // Build ordering based on family unit structure\n const ordered = orderGeneration(nodeIds, genIdx, graph, familyUnits);\n result.push({ index: genIdx, nodeIds: ordered });\n }\n\n return result;\n}\n\nfunction orderGeneration(\n nodeIds: string[],\n _genIdx: number,\n graph: LayoutGraph,\n familyUnits: FamilyUnit[]\n): string[] {\n if (nodeIds.length <= 1) return [...nodeIds];\n\n const nodeSet = new Set(nodeIds);\n const placed = new Set<string>();\n const ordered: string[] = [];\n\n const fuInGen = familyUnits.filter(\n (fu) => nodeSet.has(fu.partners[0]) || nodeSet.has(fu.partners[1])\n );\n\n // Build adjacency: which family units does each person belong to?\n const personToFUs = new Map<string, FamilyUnit[]>();\n for (const fu of fuInGen) {\n for (const p of fu.partners) {\n if (nodeSet.has(p)) {\n const arr = personToFUs.get(p) ?? [];\n arr.push(fu);\n personToFUs.set(p, arr);\n }\n }\n }\n\n // Place a person and recursively expand their family units\n function placePersonAndExpand(id: string): void {\n if (placed.has(id)) return;\n ordered.push(id);\n placed.add(id);\n\n // Expand all family units this person is in\n const fus = personToFUs.get(id) ?? [];\n // Sort: divorced/separated first (left side), current marriage last (right)\n const sortedFUs = [...fus].sort((a, b) => {\n const scoreA = a.relationship === \"divorced\" || a.relationship === \"separated\" ? 0 : 1;\n const scoreB = b.relationship === \"divorced\" || b.relationship === \"separated\" ? 0 : 1;\n return scoreA - scoreB;\n });\n\n for (const fu of sortedFUs) {\n const partner = fu.partners[0] === id ? fu.partners[1] : fu.partners[0];\n if (!placed.has(partner) && nodeSet.has(partner)) {\n ordered.push(partner);\n placed.add(partner);\n // Recursively expand partner's other relationships\n const partnerFUs = personToFUs.get(partner) ?? [];\n for (const pfu of partnerFUs) {\n if (pfu.id !== fu.id) {\n const otherPartner = pfu.partners[0] === partner ? pfu.partners[1] : pfu.partners[0];\n placePersonAndExpand(otherPartner);\n }\n }\n }\n }\n }\n\n // Start by processing family units — expand connected clusters\n for (const fu of fuInGen) {\n if (!placed.has(fu.partners[0]) && nodeSet.has(fu.partners[0])) {\n placePersonAndExpand(fu.partners[0]);\n }\n if (!placed.has(fu.partners[1]) && nodeSet.has(fu.partners[1])) {\n placePersonAndExpand(fu.partners[1]);\n }\n }\n\n // Place remaining unpartnered individuals (sorted by birth year)\n const remaining = nodeIds.filter((id) => !placed.has(id));\n remaining.sort((a, b) => {\n const indA = graph.individuals.get(a);\n const indB = graph.individuals.get(b);\n return (indA?.birthYear ?? 9999) - (indB?.birthYear ?? 9999);\n });\n for (const id of remaining) {\n ordered.push(id);\n placed.add(id);\n }\n\n return ordered;\n}\n\n// ─── Step 4 & 5: Assign X/Y positions ──────────────────────\n\ninterface NodePosition {\n id: string;\n x: number;\n y: number;\n generation: number;\n}\n\nconst LABEL_HEIGHT = 20;\nconst LABEL_GAP = 6;\n\nfunction assignPositions(\n orderedGens: OrderedGeneration[],\n graph: LayoutGraph,\n config: LayoutConfig\n): Map<string, NodePosition> {\n const positions = new Map<string, NodePosition>();\n const { nodeWidth, nodeSpacingX } = config;\n const half = nodeWidth / 2;\n // Couple gap = space between two partner centers (node edge to edge + line)\n const coupleGap = nodeWidth + nodeSpacingX * 0.6;\n // Family gap = space between separate family units\n const familyGap = nodeWidth + nodeSpacingX * 1.5;\n // Generation Y spacing = node height + label space + vertical gap\n const genStepY = config.nodeHeight + LABEL_HEIGHT + LABEL_GAP + config.nodeSpacingY;\n\n // Pass 1: Initial placement based on generation ordering\n for (const gen of orderedGens) {\n const y = gen.index * genStepY + half;\n const segments = buildSegments(gen.nodeIds, gen.index, graph);\n\n let xCursor = half;\n for (let s = 0; s < segments.length; s++) {\n const seg = segments[s];\n if (s > 0) xCursor += familyGap;\n\n if (seg.type === \"couple\") {\n positions.set(seg.ids[0], { id: seg.ids[0], x: xCursor, y, generation: gen.index });\n xCursor += coupleGap;\n positions.set(seg.ids[1], { id: seg.ids[1], x: xCursor, y, generation: gen.index });\n } else {\n positions.set(seg.ids[0], { id: seg.ids[0], x: xCursor, y, generation: gen.index });\n }\n }\n }\n\n // Pass 2: Resolve overlaps (before centering, so centering uses final positions)\n resolveOverlaps(positions, orderedGens, config);\n\n // Pass 3: Center children under parents (and drag partners)\n centerChildrenUnderParents(positions, graph, config);\n\n // Pass 4: Resolve any new overlaps introduced by centering\n resolveOverlaps(positions, orderedGens, config);\n\n return positions;\n}\n\ninterface Segment {\n type: \"couple\" | \"single\";\n ids: string[];\n fuId?: string;\n}\n\nfunction buildSegments(\n nodeIds: string[],\n _genIdx: number,\n graph: LayoutGraph\n): Segment[] {\n const nodeSet = new Set(nodeIds);\n\n // Find multi-married individuals first\n const personFUs = new Map<string, FamilyUnit[]>();\n for (const fu of graph.familyUnits) {\n if (nodeSet.has(fu.partners[0]) && nodeSet.has(fu.partners[1])) {\n for (const p of fu.partners) {\n const arr = personFUs.get(p) ?? [];\n arr.push(fu);\n personFUs.set(p, arr);\n }\n }\n }\n\n const multiMarried = new Set<string>();\n for (const [id, fus] of personFUs) {\n if (fus.length > 1) multiMarried.add(id);\n }\n\n const segments: Segment[] = [];\n const placed = new Set<string>();\n\n for (const id of nodeIds) {\n if (placed.has(id)) continue;\n\n // Multi-married: place as couple chain (ex-partner, SHARED, current-partner)\n if (multiMarried.has(id)) {\n const fus = personFUs.get(id) ?? [];\n const sorted = [...fus].sort((a, b) => {\n const sa = a.relationship === \"divorced\" || a.relationship === \"separated\" ? 0 : 1;\n const sb = b.relationship === \"divorced\" || b.relationship === \"separated\" ? 0 : 1;\n return sa - sb;\n });\n\n for (const fu of sorted) {\n const partner = fu.partners[0] === id ? fu.partners[1] : fu.partners[0];\n if (!placed.has(partner)) {\n // For first (ex) partner: place partner first, then shared person\n // For subsequent partners: shared already placed, place partner after\n if (!placed.has(id)) {\n segments.push({ type: \"couple\", ids: [partner, id], fuId: fu.id });\n placed.add(partner);\n placed.add(id);\n } else {\n segments.push({ type: \"couple\", ids: [id, partner], fuId: fu.id });\n placed.add(partner);\n }\n }\n }\n if (!placed.has(id)) {\n segments.push({ type: \"single\", ids: [id] });\n placed.add(id);\n }\n continue;\n }\n\n // Regular: check if part of a couple\n const fu = graph.familyUnits.find(\n (f) =>\n (f.partners[0] === id || f.partners[1] === id) &&\n !placed.has(f.partners[0]) &&\n !placed.has(f.partners[1]) &&\n nodeSet.has(f.partners[0]) &&\n nodeSet.has(f.partners[1])\n );\n\n if (fu) {\n segments.push({\n type: \"couple\",\n ids: [fu.partners[0], fu.partners[1]],\n fuId: fu.id,\n });\n placed.add(fu.partners[0]);\n placed.add(fu.partners[1]);\n } else {\n segments.push({ type: \"single\", ids: [id] });\n placed.add(id);\n }\n }\n\n return segments;\n}\n\nfunction centerChildrenUnderParents(\n positions: Map<string, NodePosition>,\n graph: LayoutGraph,\n config: LayoutConfig\n): void {\n const coupleGap = config.nodeSpacingX + config.nodeWidth;\n\n // Build a lookup: personId → family units they're a partner in\n const personToFUs = new Map<string, FamilyUnit[]>();\n for (const fu of graph.familyUnits) {\n for (const p of fu.partners) {\n const arr = personToFUs.get(p) ?? [];\n arr.push(fu);\n personToFUs.set(p, arr);\n }\n }\n\n // Multiple passes to propagate constraints\n for (let pass = 0; pass < 3; pass++) {\n for (const fu of graph.familyUnits) {\n if (fu.children.length === 0) continue;\n\n const posA = positions.get(fu.partners[0]);\n const posB = positions.get(fu.partners[1]);\n if (!posA || !posB) continue;\n\n const parentMidX = (posA.x + posB.x) / 2;\n\n // Re-space children evenly under parent midpoint\n const sortedChildren = [...fu.children].sort((a, b) => {\n const indA = graph.individuals.get(a);\n const indB = graph.individuals.get(b);\n return (indA?.birthYear ?? 9999) - (indB?.birthYear ?? 9999);\n });\n\n const childSpacing = config.nodeSpacingX + config.nodeWidth;\n if (sortedChildren.length > 1) {\n // Calculate per-gap spacing: add room for married-in spouses\n const gaps: number[] = [];\n for (let gi = 0; gi < sortedChildren.length - 1; gi++) {\n let gap = childSpacing;\n\n // If the RIGHT child has a spouse placed to their LEFT\n const nextChild = sortedChildren[gi + 1];\n const nextFUs = personToFUs.get(nextChild) ?? [];\n for (const cfu of nextFUs) {\n const pid = cfu.partners[0] === nextChild ? cfu.partners[1] : cfu.partners[0];\n const cInd = graph.individuals.get(nextChild);\n const pInd = graph.individuals.get(pid);\n if (!(cInd?.sex === \"male\" || (cInd?.sex !== \"female\" && pInd?.sex === \"female\"))) {\n gap += coupleGap;\n }\n }\n\n // If the LEFT child has a spouse placed to their RIGHT\n const currChild = sortedChildren[gi];\n const currFUs = personToFUs.get(currChild) ?? [];\n for (const cfu of currFUs) {\n const pid = cfu.partners[0] === currChild ? cfu.partners[1] : cfu.partners[0];\n const cInd = graph.individuals.get(currChild);\n const pInd = graph.individuals.get(pid);\n if (cInd?.sex === \"male\" || (cInd?.sex !== \"female\" && pInd?.sex === \"female\")) {\n gap += coupleGap;\n }\n }\n\n gaps.push(gap);\n }\n\n const totalWidth = gaps.reduce((s, g) => s + g, 0);\n const startX = parentMidX - totalWidth / 2;\n let cx = startX;\n for (let i = 0; i < sortedChildren.length; i++) {\n const pos = positions.get(sortedChildren[i]);\n if (pos) pos.x = cx;\n if (i < gaps.length) cx += gaps[i];\n }\n } else {\n const pos = positions.get(sortedChildren[0]);\n if (pos) pos.x = parentMidX;\n }\n\n // After placing children, if any child is also a partner in another\n // couple, drag that partner along to maintain couple gap\n for (const childId of fu.children) {\n const childPos = positions.get(childId);\n if (!childPos) continue;\n const childFUs = personToFUs.get(childId) ?? [];\n for (const childFU of childFUs) {\n const partnerId =\n childFU.partners[0] === childId\n ? childFU.partners[1]\n : childFU.partners[0];\n const partnerPos = positions.get(partnerId);\n if (!partnerPos) continue;\n // Keep partner at couple gap distance, on the correct side\n const childInd = graph.individuals.get(childId);\n const partnerInd = graph.individuals.get(partnerId);\n if (childInd?.sex === \"male\" || (childInd?.sex !== \"female\" && partnerInd?.sex === \"female\")) {\n partnerPos.x = childPos.x + coupleGap;\n } else {\n partnerPos.x = childPos.x - coupleGap;\n }\n }\n }\n }\n }\n}\n\nfunction resolveOverlaps(\n positions: Map<string, NodePosition>,\n orderedGens: OrderedGeneration[],\n config: LayoutConfig\n): void {\n const minGap = config.nodeWidth + config.nodeSpacingX;\n\n for (const gen of orderedGens) {\n const genNodes = gen.nodeIds\n .map((id) => positions.get(id))\n .filter((p): p is NodePosition => p !== undefined);\n\n genNodes.sort((a, b) => a.x - b.x);\n\n for (let i = 1; i < genNodes.length; i++) {\n const gap = genNodes[i].x - genNodes[i - 1].x;\n if (gap < minGap) {\n const shift = minGap - gap;\n // Push this and all subsequent nodes right\n for (let j = i; j < genNodes.length; j++) {\n genNodes[j].x += shift;\n }\n }\n }\n }\n\n // Ensure no negative x positions\n let minX = Infinity;\n for (const pos of positions.values()) {\n if (pos.x < minX) minX = pos.x;\n }\n if (minX < config.nodeWidth / 2) {\n const shift = config.nodeWidth / 2 - minX;\n for (const pos of positions.values()) {\n pos.x += shift;\n }\n }\n}\n\n// ─── Step 6: Compute edge paths ─────────────────────────────\n\nfunction computeEdges(\n graph: LayoutGraph,\n positions: Map<string, NodePosition>,\n config: LayoutConfig\n): LayoutEdge[] {\n const edges: LayoutEdge[] = [];\n const half = config.nodeWidth / 2;\n const dropY_offset = config.nodeHeight / 2 + LABEL_HEIGHT + LABEL_GAP + config.nodeSpacingY * 0.35;\n\n for (const fu of graph.familyUnits) {\n const posA = positions.get(fu.partners[0]);\n const posB = positions.get(fu.partners[1]);\n if (!posA || !posB) continue;\n\n const leftPos = posA.x < posB.x ? posA : posB;\n const rightPos = posA.x < posB.x ? posB : posA;\n const leftId = posA.x < posB.x ? fu.partners[0] : fu.partners[1];\n const rightId = posA.x < posB.x ? fu.partners[1] : fu.partners[0];\n\n // Couple line: edge-to-edge\n const coupleRel: Relationship = {\n type: fu.relationship,\n from: leftId,\n to: rightId,\n label: fu.label,\n };\n const couplePath = `M ${leftPos.x + half} ${leftPos.y} L ${rightPos.x - half} ${rightPos.y}`;\n edges.push({\n from: leftId,\n to: rightId,\n relationship: coupleRel,\n path: couplePath,\n });\n\n // Parent-child connections\n if (fu.children.length > 0) {\n const midX = (posA.x + posB.x) / 2;\n const coupleY = posA.y;\n const dropY = coupleY + dropY_offset;\n\n const childPositions = fu.children\n .map((cid) => ({\n id: cid,\n pos: positions.get(cid),\n }))\n .filter(\n (c): c is { id: string; pos: NodePosition } => c.pos !== undefined\n );\n\n if (childPositions.length === 0) continue;\n\n childPositions.sort((a, b) => a.pos.x - b.pos.x);\n\n const leftX = childPositions[0].pos.x;\n const rightX = childPositions[childPositions.length - 1].pos.x;\n\n // Drop line from couple midpoint\n const dropPath = `M ${midX} ${coupleY} L ${midX} ${dropY}`;\n edges.push({\n from: fu.partners[0],\n to: fu.partners[1],\n relationship: { type: \"parent-child\", from: fu.id, to: \"_drop\" },\n path: dropPath,\n });\n\n // Sibship line (horizontal)\n if (childPositions.length > 1) {\n const sibPath = `M ${leftX} ${dropY} L ${rightX} ${dropY}`;\n edges.push({\n from: fu.partners[0],\n to: fu.partners[1],\n relationship: { type: \"parent-child\", from: fu.id, to: \"_sibship\" },\n path: sibPath,\n });\n }\n\n // Vertical lines from sibship to each child\n for (const child of childPositions) {\n const childTop = child.pos.y - config.nodeHeight / 2;\n let childPath: string;\n if (childPositions.length === 1) {\n if (Math.abs(child.pos.x - midX) < 1) {\n childPath = `M ${midX} ${coupleY} L ${midX} ${childTop}`;\n } else {\n childPath = `M ${midX} ${dropY} L ${child.pos.x} ${dropY} L ${child.pos.x} ${childTop}`;\n }\n } else {\n childPath = `M ${child.pos.x} ${dropY} L ${child.pos.x} ${childTop}`;\n }\n\n const pcRel = findParentChildRel(graph, fu.id, child.id);\n edges.push({\n from: fu.id,\n to: child.id,\n relationship: pcRel ?? {\n type: \"parent-child\",\n from: fu.id,\n to: child.id,\n },\n path: childPath,\n });\n }\n }\n }\n\n return edges;\n}\n\nfunction findParentChildRel(\n graph: LayoutGraph,\n _fuId: string,\n childId: string\n): Relationship | undefined {\n // Find from original family unit mapping\n const fuId = graph.childOf.get(childId);\n if (!fuId) return undefined;\n return {\n type: \"parent-child\",\n from: fuId,\n to: childId,\n };\n}\n\n// ─── Step 7: Package result ─────────────────────────────────\n\nfunction packageResult(\n positions: Map<string, NodePosition>,\n edges: LayoutEdge[],\n graph: LayoutGraph,\n config: LayoutConfig\n): LayoutResult {\n const padding = 40;\n const nodes: LayoutNode[] = [];\n\n for (const [id, pos] of positions) {\n const ind = graph.individuals.get(id);\n if (!ind) continue;\n\n nodes.push({\n id,\n x: pos.x - config.nodeWidth / 2 + padding,\n y: pos.y - config.nodeHeight / 2 + padding,\n width: config.nodeWidth,\n height: config.nodeHeight,\n generation: pos.generation,\n individual: ind,\n });\n }\n\n // Shift edges by padding\n const shiftedEdges = edges.map((e) => ({\n ...e,\n path: shiftPath(e.path, padding, padding),\n }));\n\n let maxX = 0;\n let maxY = 0;\n let minX = Infinity;\n for (const node of nodes) {\n const cx = node.x + node.width / 2;\n const labelText = estimateLabelText(node.individual);\n const labelHalfWidth = labelText.length * 3.8;\n const right = Math.max(node.x + node.width, cx + labelHalfWidth);\n const left = Math.min(node.x, cx - labelHalfWidth);\n const bottom = node.y + node.height;\n if (right > maxX) maxX = right;\n if (bottom > maxY) maxY = bottom;\n if (left < minX) minX = left;\n }\n\n // If labels extend beyond left edge, shift everything right\n if (minX < 0) {\n const shift = -minX;\n for (const node of nodes) {\n node.x += shift;\n }\n for (const edge of shiftedEdges) {\n edge.path = shiftPath(edge.path, shift, 0);\n }\n maxX += shift;\n }\n\n return {\n width: maxX + padding,\n height: maxY + padding + LABEL_GAP + LABEL_HEIGHT + 10,\n nodes,\n edges: shiftedEdges,\n };\n}\n\nfunction estimateLabelText(ind: Individual): string {\n const name = ind.label || ind.id;\n if (ind.birthYear && ind.deathYear) return `${name} (${ind.birthYear}–${ind.deathYear})`;\n if (ind.birthYear) return `${name} (b. ${ind.birthYear})`;\n return name;\n}\n\n// ─── Emotional relationship edges ───────────────────────────\n\nconst EMOTIONAL_REL_TYPES = new Set([\n \"harmony\", \"close\", \"bestfriends\", \"love\", \"inlove\", \"friendship\",\n \"hostile\", \"conflict\", \"enmity\", \"distant-hostile\", \"cutoff\",\n \"close-hostile\", \"fused\", \"fused-hostile\",\n \"distant\", \"normal\", \"nevermet\",\n \"abuse\", \"physical-abuse\", \"emotional-abuse\", \"sexual-abuse\", \"neglect\",\n \"manipulative\", \"controlling\", \"jealous\",\n \"focused\", \"focused-neg\", \"distrust\", \"admirer\", \"limerence\",\n]);\n\nfunction computeEmotionalEdges(\n relationships: Relationship[],\n positions: Map<string, NodePosition>,\n config: LayoutConfig\n): LayoutEdge[] {\n const edges: LayoutEdge[] = [];\n const half = config.nodeWidth / 2;\n\n const emotionalRels = relationships.filter(r => EMOTIONAL_REL_TYPES.has(r.type));\n\n for (const rel of emotionalRels) {\n const posA = positions.get(rel.from);\n const posB = positions.get(rel.to);\n if (!posA || !posB) continue;\n\n // Use raw positions (no padding) — packageResult will shift\n const ax = posA.x;\n const ay = posA.y;\n const bx = posB.x;\n const by = posB.y;\n\n let pathData: string;\n\n if (posA.generation === posB.generation) {\n // Same generation: curved path below nodes\n const midX = (ax + bx) / 2;\n const curveY = ay + half + 30;\n pathData = `M ${ax} ${ay + half} Q ${midX} ${curveY} ${bx} ${by + half}`;\n } else {\n // Cross-generation: curved path to the side\n const midY = (ay + by) / 2;\n const maxX = Math.max(ax, bx);\n const curveX = maxX + half + 30;\n pathData = `M ${ax} ${ay} Q ${curveX} ${midY} ${bx} ${by}`;\n }\n\n edges.push({\n from: rel.from,\n to: rel.to,\n relationship: rel,\n path: pathData,\n });\n }\n\n return edges;\n}\n\nfunction shiftPath(pathData: string, dx: number, dy: number): string {\n // Shift all coordinate pairs in the path\n return pathData.replace(\n /([\\d.-]+)\\s+([\\d.-]+)/g,\n (_match, xStr: string, yStr: string) => {\n const x = parseFloat(xStr) + dx;\n const y = parseFloat(yStr) + dy;\n return `${x} ${y}`;\n }\n );\n}\n","import type { Individual, Condition } from \"../../core/types\";\nimport {\n el,\n group,\n rect,\n circle,\n polygon,\n line,\n text,\n title,\n defs,\n pattern,\n path,\n} from \"../../core/svg\";\n\n// ─── Public API ─────────────────────────────────────────────\n\nexport function renderIndividualSymbol(\n individual: Individual,\n x: number,\n y: number,\n size: number\n): string {\n const half = size / 2;\n const classes = [\n \"schematex-genogram-node\",\n `schematex-genogram-${individual.sex === \"other\" ? \"unknown\" : individual.sex}`,\n ];\n if (individual.status === \"deceased\") classes.push(\"schematex-genogram-deceased\");\n\n const titleText = formatTitle(individual);\n const children: string[] = [title(titleText)];\n\n // Index person: outer gold border (concentric shape, slightly larger)\n const isIndex = individual.markers?.includes(\"index-person\");\n if (isIndex) {\n children.push(indexBorder(individual.sex, half));\n classes.push(\"schematex-genogram-index-person\");\n }\n\n // Base shape\n children.push(baseShape(individual.sex, half));\n\n // Condition fills\n if (individual.conditions?.length) {\n for (const cond of individual.conditions) {\n children.push(conditionFillElement(individual.sex, half, cond));\n }\n }\n\n // Deceased overlay\n if (individual.status === \"deceased\") {\n children.push(...deceasedOverlay(individual.sex, half));\n }\n\n // Age display inside node\n const ageToShow = individual.age ?? calcAge(individual);\n if (ageToShow !== undefined) {\n children.push(\n text(\n {\n x: 0,\n y: 5,\n class: \"schematex-genogram-age\",\n \"text-anchor\": \"middle\",\n \"font-size\": \"11\",\n },\n String(ageToShow)\n )\n );\n }\n\n return group(\n {\n class: classes.join(\" \"),\n \"data-individual-id\": individual.id,\n transform: `translate(${x}, ${y})`,\n },\n children\n );\n}\n\nexport function getRequiredDefs(individuals: Individual[], includeArrowMarker = false): string {\n const neededFills = new Set<string>();\n for (const ind of individuals) {\n if (ind.conditions) {\n for (const cond of ind.conditions) {\n neededFills.add(cond.fill);\n }\n }\n }\n\n const children: string[] = [];\n\n if (neededFills.has(\"half-left\")) {\n children.push(\n el(\"clipPath\", { id: \"schematex-genogram-clip-half-left-rect\" }, [\n rect({ x: \"0\", y: \"0\", width: \"50%\", height: \"100%\" }),\n ]),\n el(\"clipPath\", { id: \"schematex-genogram-clip-half-left-circle\" }, [\n rect({ x: \"-50\", y: \"-50\", width: \"50\", height: \"100\" }),\n ])\n );\n }\n\n if (neededFills.has(\"half-right\")) {\n children.push(\n el(\"clipPath\", { id: \"schematex-genogram-clip-half-right-rect\" }, [\n rect({ x: \"50%\", y: \"0\", width: \"50%\", height: \"100%\" }),\n ]),\n el(\"clipPath\", { id: \"schematex-genogram-clip-half-right-circle\" }, [\n rect({ x: \"0\", y: \"-50\", width: \"50\", height: \"100\" }),\n ])\n );\n }\n\n if (neededFills.has(\"half-bottom\")) {\n children.push(\n el(\"clipPath\", { id: \"schematex-genogram-clip-half-bottom-rect\" }, [\n rect({ x: \"0\", y: \"50%\", width: \"100%\", height: \"50%\" }),\n ]),\n el(\"clipPath\", { id: \"schematex-genogram-clip-half-bottom-circle\" }, [\n rect({ x: \"-50\", y: \"0\", width: \"100\", height: \"50\" }),\n ])\n );\n }\n\n if (neededFills.has(\"quarter\")) {\n children.push(\n el(\"clipPath\", { id: \"schematex-genogram-clip-quarter-rect\" }, [\n rect({ x: \"0\", y: \"0\", width: \"50%\", height: \"50%\" }),\n ]),\n el(\"clipPath\", { id: \"schematex-genogram-clip-quarter-circle\" }, [\n rect({ x: \"-50\", y: \"-50\", width: \"50\", height: \"50\" }),\n ])\n );\n }\n\n if (neededFills.has(\"half-top\")) {\n children.push(\n el(\"clipPath\", { id: \"schematex-genogram-clip-half-top-rect\" }, [\n rect({ x: \"0\", y: \"0\", width: \"100%\", height: \"50%\" }),\n ]),\n el(\"clipPath\", { id: \"schematex-genogram-clip-half-top-circle\" }, [\n rect({ x: \"-50\", y: \"-50\", width: \"100\", height: \"50\" }),\n ])\n );\n }\n\n if (neededFills.has(\"quad-tl\")) {\n children.push(\n el(\"clipPath\", { id: \"schematex-genogram-clip-quad-tl-rect\" }, [\n rect({ x: \"0\", y: \"0\", width: \"50%\", height: \"50%\" }),\n ]),\n el(\"clipPath\", { id: \"schematex-genogram-clip-quad-tl-circle\" }, [\n rect({ x: \"-50\", y: \"-50\", width: \"50\", height: \"50\" }),\n ])\n );\n }\n\n if (neededFills.has(\"quad-tr\")) {\n children.push(\n el(\"clipPath\", { id: \"schematex-genogram-clip-quad-tr-rect\" }, [\n rect({ x: \"50%\", y: \"0\", width: \"50%\", height: \"50%\" }),\n ]),\n el(\"clipPath\", { id: \"schematex-genogram-clip-quad-tr-circle\" }, [\n rect({ x: \"0\", y: \"-50\", width: \"50\", height: \"50\" }),\n ])\n );\n }\n\n if (neededFills.has(\"quad-bl\")) {\n children.push(\n el(\"clipPath\", { id: \"schematex-genogram-clip-quad-bl-rect\" }, [\n rect({ x: \"0\", y: \"50%\", width: \"50%\", height: \"50%\" }),\n ]),\n el(\"clipPath\", { id: \"schematex-genogram-clip-quad-bl-circle\" }, [\n rect({ x: \"-50\", y: \"0\", width: \"50\", height: \"50\" }),\n ])\n );\n }\n\n if (neededFills.has(\"quad-br\")) {\n children.push(\n el(\"clipPath\", { id: \"schematex-genogram-clip-quad-br-rect\" }, [\n rect({ x: \"50%\", y: \"50%\", width: \"50%\", height: \"50%\" }),\n ]),\n el(\"clipPath\", { id: \"schematex-genogram-clip-quad-br-circle\" }, [\n rect({ x: \"0\", y: \"0\", width: \"50\", height: \"50\" }),\n ])\n );\n }\n\n if (neededFills.has(\"striped\")) {\n children.push(\n pattern(\n {\n id: \"schematex-genogram-pattern-striped\",\n patternUnits: \"userSpaceOnUse\",\n width: \"4\",\n height: \"4\",\n },\n [\n path({\n d: \"M-1,1 l2,-2 M0,4 l4,-4 M3,5 l2,-2\",\n stroke: \"#333\",\n \"stroke-width\": \"1\",\n }),\n ]\n )\n );\n }\n\n if (neededFills.has(\"dotted\")) {\n children.push(\n pattern(\n {\n id: \"schematex-genogram-pattern-dotted\",\n patternUnits: \"userSpaceOnUse\",\n width: \"6\",\n height: \"6\",\n },\n [\n circle({ cx: \"3\", cy: \"3\", r: \"1\", fill: \"#333\" }),\n ]\n )\n );\n }\n\n if (includeArrowMarker) {\n children.push(\n el(\"marker\", {\n id: \"schematex-genogram-arrow\",\n viewBox: \"0 0 10 10\",\n refX: \"10\",\n refY: \"5\",\n markerWidth: \"6\",\n markerHeight: \"6\",\n orient: \"auto\",\n }, [\n path({ d: \"M 0 0 L 10 5 L 0 10 z\", fill: \"#333\" }),\n ])\n );\n }\n\n return defs(children);\n}\n\n// ─── Internal helpers ───────────────────────────────────────\n\nfunction capitalize(s: string): string {\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction formatTitle(ind: Individual): string {\n const name = capitalize(ind.label || ind.id);\n if (ind.birthYear && ind.deathYear) {\n return `${name} (${ind.birthYear}-${ind.deathYear})`;\n }\n if (ind.birthYear) {\n return `${name} (${ind.birthYear})`;\n }\n return name;\n}\n\nfunction calcAge(ind: Individual): number | undefined {\n if (!ind.birthYear) return undefined;\n if (ind.deathYear) return ind.deathYear - ind.birthYear;\n if (ind.status === \"deceased\") return undefined;\n return undefined;\n}\n\nfunction indexBorder(sex: Individual[\"sex\"], half: number): string {\n const outer = half + 4;\n switch (sex) {\n case \"male\":\n return rect({\n x: -outer,\n y: -outer,\n width: outer * 2,\n height: outer * 2,\n class: \"schematex-genogram-index-border\",\n });\n case \"female\":\n return circle({\n cx: 0,\n cy: 0,\n r: outer,\n class: \"schematex-genogram-index-border\",\n });\n case \"unknown\":\n case \"other\":\n case \"nonbinary\":\n case \"intersex\":\n return polygon({\n points: `0,${-outer} ${outer},0 0,${outer} ${-outer},0`,\n class: \"schematex-genogram-index-border\",\n });\n }\n}\n\nfunction baseShape(sex: Individual[\"sex\"], half: number): string {\n switch (sex) {\n case \"male\":\n return rect({\n x: -half,\n y: -half,\n width: half * 2,\n height: half * 2,\n class: \"schematex-genogram-shape\",\n });\n case \"female\":\n return circle({\n cx: 0,\n cy: 0,\n r: half,\n class: \"schematex-genogram-shape\",\n });\n case \"unknown\":\n case \"other\":\n case \"nonbinary\":\n case \"intersex\":\n return polygon({\n points: `0,${-half} ${half},0 0,${half} ${-half},0`,\n class: \"schematex-genogram-shape\",\n });\n }\n}\n\nfunction deceasedOverlay(sex: Individual[\"sex\"], half: number): string[] {\n const extend = sex === \"female\" ? half * 0.707 : half;\n return [\n line({\n x1: -extend,\n y1: -extend,\n x2: extend,\n y2: extend,\n class: \"schematex-genogram-deceased-mark\",\n stroke: \"#333\",\n \"stroke-width\": \"2\",\n }),\n line({\n x1: extend,\n y1: -extend,\n x2: -extend,\n y2: extend,\n class: \"schematex-genogram-deceased-mark\",\n stroke: \"#333\",\n \"stroke-width\": \"2\",\n }),\n ];\n}\n\nfunction conditionFillElement(\n sex: Individual[\"sex\"],\n half: number,\n cond: Condition\n): string {\n const fillColor = cond.color ?? \"#333\";\n const attrs: Record<string, string | number> = {};\n\n if (cond.fill === \"full\") {\n attrs.fill = fillColor;\n } else if (cond.fill === \"striped\") {\n attrs.fill = \"url(#schematex-genogram-pattern-striped)\";\n } else if (cond.fill === \"dotted\") {\n attrs.fill = \"url(#schematex-genogram-pattern-dotted)\";\n } else {\n const clipSuffix = sex === \"female\" ? \"circle\" : \"rect\";\n attrs[\"clip-path\"] = `url(#schematex-genogram-clip-${cond.fill}-${clipSuffix})`;\n attrs.fill = fillColor;\n }\n\n attrs.class = `schematex-genogram-condition-fill schematex-genogram-condition-${cond.label}`;\n\n switch (sex) {\n case \"male\":\n return rect({ x: -half, y: -half, width: half * 2, height: half * 2, ...attrs });\n case \"female\":\n return circle({ cx: 0, cy: 0, r: half, ...attrs });\n case \"unknown\":\n case \"other\":\n case \"nonbinary\":\n case \"intersex\":\n default:\n return polygon({\n points: `0,${-half} ${half},0 0,${half} ${-half},0`,\n ...attrs,\n });\n }\n}\n","import type { LayoutResult, LayoutNode, LayoutEdge, RenderConfig, DiagramAST, RelationshipType } from \"../../core/types\";\nimport { svgRoot, el, group, text, title, desc } from \"../../core/svg\";\nimport { cssCustomProperties, resolveGenogramTheme, STROKE_WIDTH } from \"../../core/theme\";\nimport { renderIndividualSymbol, getRequiredDefs } from \"./symbols\";\n\n// ─── Public API ─────────────────────────────────────────────\n\nexport function renderGenogram(\n layout: LayoutResult,\n config: RenderConfig,\n ast?: DiagramAST\n): string {\n const hasDirectional = layout.edges.some(e => e.relationship.directional);\n const defsStr = getRequiredDefs(layout.nodes.map((n) => n.individual), hasDirectional);\n const styleStr = buildStyles(config);\n\n const genGroups = groupByGeneration(layout.nodes);\n\n // Separate structural and emotional edges\n const structuralEdges = layout.edges.filter(e => !EMOTIONAL_REL_TYPES.has(e.relationship.type));\n const emotionalEdges = layout.edges.filter(e => EMOTIONAL_REL_TYPES.has(e.relationship.type));\n\n const edgeLayers = renderEdges(structuralEdges);\n const emotionalLayer = renderEmotionalEdges(emotionalEdges);\n const nodeLayers = renderNodes(genGroups);\n const labelLayer = renderLabels(layout.nodes, config);\n const edgeLabelLayer = renderEdgeLabels(structuralEdges, config);\n\n const nodeCount = layout.nodes.length;\n const genCount = genGroups.size;\n\n const chartTitle = ast?.metadata?.title;\n\n // Adjust viewBox and add title offset if title exists\n const titleHeight = chartTitle ? 40 : 0;\n const totalHeight = layout.height + titleHeight;\n\n const layers: string[] = [\n title(chartTitle ? `Genogram: ${chartTitle}` : \"Genogram\"),\n desc(\n `Genogram diagram with ${nodeCount} individuals across ${genCount} generations`\n ),\n defsStr,\n styleStr,\n ];\n\n if (chartTitle) {\n layers.push(\n text(\n {\n x: layout.width / 2,\n y: 28,\n class: \"schematex-genogram-title\",\n \"text-anchor\": \"middle\",\n \"font-size\": \"20\",\n \"font-weight\": \"bold\",\n \"font-family\": config.fontFamily,\n },\n chartTitle\n )\n );\n }\n\n // Wrap content in a group with title offset\n const contentGroup = group(\n { transform: titleHeight > 0 ? `translate(0, ${titleHeight})` : undefined },\n [edgeLayers, emotionalLayer, ...nodeLayers, labelLayer, edgeLabelLayer]\n );\n layers.push(contentGroup);\n\n return svgRoot(\n {\n viewBox: `0 0 ${layout.width} ${totalHeight}`,\n class: \"schematex-diagram schematex-genogram\",\n width: layout.width,\n height: totalHeight,\n },\n layers\n );\n}\n\n// ─── Styles ─────────────────────────────────────────────────\n\n// ─── Theme Resolution ──────────────────────────────────────\n\nfunction buildStyles(config: RenderConfig): string {\n const t = resolveGenogramTheme(config.theme);\n const css = `\n.schematex-genogram {${cssCustomProperties(t)}\n background: ${t.bg};\n}\n.schematex-genogram-shape { fill: ${t.fill}; stroke: ${t.stroke}; stroke-width: ${STROKE_WIDTH.normal}; stroke-linejoin: round; }\n.schematex-genogram-male .schematex-genogram-shape { fill: ${t.maleFill}; }\n.schematex-genogram-female .schematex-genogram-shape { fill: ${t.femaleFill}; }\n.schematex-genogram-unknown .schematex-genogram-shape { fill: ${t.unknownFill}; }\n.schematex-genogram-label { font-family: ${config.fontFamily}; font-size: ${config.fontSize}px; text-anchor: middle; fill: ${t.text}; }\n.schematex-genogram-edge { stroke: ${t.neutral}; stroke-width: ${STROKE_WIDTH.normal}; fill: none; stroke-linecap: round; stroke-linejoin: round; }\n.schematex-genogram-edge-cohabiting path { stroke-dasharray: 6,4; }\n.schematex-genogram-edge-divorced .schematex-genogram-divorce-mark { stroke: ${t.neutral}; stroke-width: ${STROKE_WIDTH.normal}; }\n.schematex-genogram-edge-separated .schematex-genogram-separation-mark { stroke: ${t.neutral}; stroke-width: ${STROKE_WIDTH.normal}; }\n.schematex-genogram-deceased-mark { stroke: ${t.deceasedMark}; stroke-width: ${STROKE_WIDTH.normal}; stroke-linecap: round; }\n.schematex-genogram-condition-fill { fill: ${t.conditionFill}; }\n.schematex-genogram-age { font-family: ${config.fontFamily}; fill: ${t.text}; pointer-events: none; }\n.schematex-genogram-title { fill: ${t.text}; }\n.schematex-genogram-edge-label { font-family: ${config.fontFamily}; fill: ${t.text}; }\n.schematex-genogram-index-border { stroke: ${t.warn}; stroke-width: ${STROKE_WIDTH.thick}; fill: none; }\n`;\n return el(\"style\", {}, css);\n}\n\n// ─── Emotional Relationship Types ───────────────────────────\n\nconst EMOTIONAL_REL_TYPES = new Set<string>([\n \"harmony\", \"close\", \"bestfriends\", \"love\", \"inlove\", \"friendship\",\n \"hostile\", \"conflict\", \"enmity\", \"distant-hostile\", \"cutoff\",\n \"close-hostile\", \"fused\", \"fused-hostile\",\n \"distant\", \"normal\", \"nevermet\",\n \"abuse\", \"physical-abuse\", \"emotional-abuse\", \"sexual-abuse\", \"neglect\",\n \"manipulative\", \"controlling\", \"jealous\",\n \"focused\", \"focused-neg\", \"distrust\", \"admirer\", \"limerence\",\n]);\n\nfunction getEmotionalColor(type: RelationshipType): string {\n // Positive: green\n if ([\"harmony\", \"close\", \"bestfriends\", \"love\", \"inlove\", \"friendship\"].includes(type)) return \"#4caf50\";\n // Negative: red\n if ([\"hostile\", \"conflict\", \"enmity\", \"distant-hostile\", \"cutoff\"].includes(type)) return \"#e53935\";\n // Ambivalent: purple\n if ([\"close-hostile\", \"fused\", \"fused-hostile\"].includes(type)) return \"#9c27b0\";\n // Distance: gray\n if ([\"distant\", \"normal\", \"nevermet\"].includes(type)) return \"#9e9e9e\";\n // Abuse: dark red\n if ([\"abuse\", \"physical-abuse\", \"emotional-abuse\", \"sexual-abuse\", \"neglect\"].includes(type)) return \"#b71c1c\";\n // Control: orange\n if ([\"manipulative\", \"controlling\", \"jealous\"].includes(type)) return \"#e65100\";\n // Special: blue\n return \"#1565c0\";\n}\n\nfunction getEmotionalLineStyle(type: RelationshipType): string {\n // Hostile types: zigzag rendered as stroke-dasharray\n if ([\"hostile\", \"conflict\", \"enmity\", \"distant-hostile\", \"close-hostile\", \"fused-hostile\"].includes(type)) {\n return \"stroke-dasharray: 8,3,2,3;\";\n }\n // Distant types: dashed\n if ([\"distant\", \"distant-hostile\", \"nevermet\"].includes(type)) {\n return \"stroke-dasharray: 6,4;\";\n }\n // Cutoff: gap\n if (type === \"cutoff\") {\n return \"stroke-dasharray: 2,8;\";\n }\n return \"\";\n}\n\nfunction getEmotionalStrokeWidth(type: RelationshipType): number {\n // Fused/best friends: thick (3 lines visually)\n if ([\"fused\", \"fused-hostile\", \"bestfriends\"].includes(type)) return 4;\n // Close/love: medium (2 lines)\n if ([\"close\", \"close-hostile\", \"love\", \"inlove\"].includes(type)) return 3;\n return 2;\n}\n\nfunction renderEmotionalEdges(edges: LayoutEdge[]): string {\n if (edges.length === 0) return group({ class: \"schematex-genogram-emotional-edges\" }, []);\n\n const children: string[] = [];\n for (const edge of edges) {\n const type = edge.relationship.type;\n const color = getEmotionalColor(type);\n const lineStyle = getEmotionalLineStyle(type);\n const strokeWidth = getEmotionalStrokeWidth(type);\n const directional = edge.relationship.directional;\n\n const elements: string[] = [\n el(\"path\", {\n d: edge.path,\n fill: \"none\",\n stroke: color,\n \"stroke-width\": strokeWidth,\n style: lineStyle || undefined,\n \"marker-end\": directional ? \"url(#schematex-genogram-arrow)\" : undefined,\n }),\n ];\n\n // Render label on emotional edge\n if (edge.relationship.label) {\n const mid = pathMidpoint(edge.path);\n if (mid) {\n elements.push(\n text(\n {\n x: mid.x,\n y: mid.y - 6,\n class: \"schematex-genogram-edge-label\",\n \"text-anchor\": \"middle\",\n \"font-size\": \"10\",\n fill: color,\n },\n edge.relationship.label\n )\n );\n }\n }\n\n children.push(\n group(\n {\n class: `schematex-genogram-emotional schematex-genogram-emotional-${type}`,\n \"data-from\": edge.from,\n \"data-to\": edge.to,\n \"data-relationship-type\": type,\n },\n elements\n )\n );\n }\n\n return group({ class: \"schematex-genogram-emotional-edges\" }, children);\n}\n\n// ─── Edge Labels ────────────────────────────────────────────\n\nfunction renderEdgeLabels(edges: LayoutEdge[], config: RenderConfig): string {\n const labels: string[] = [];\n\n for (const edge of edges) {\n if (!edge.relationship.label) continue;\n const mid = pathMidpoint(edge.path);\n if (!mid) continue;\n\n labels.push(\n text(\n {\n x: mid.x,\n y: mid.y - 6,\n class: \"schematex-genogram-edge-label\",\n \"text-anchor\": \"middle\",\n \"font-size\": \"10\",\n \"font-family\": config.fontFamily,\n },\n edge.relationship.label\n )\n );\n }\n\n return group({ class: \"schematex-genogram-edge-labels\" }, labels);\n}\n\n// ─── Edges ──────────────────────────────────────────────────\n\nfunction renderEdges(edges: LayoutEdge[]): string {\n const children: string[] = [];\n\n for (const edge of edges) {\n const relType = edge.relationship.type;\n const cssClass = `schematex-genogram-edge schematex-genogram-edge-${relType}`;\n\n const elements: string[] = [\n el(\"path\", { d: edge.path, class: \"schematex-genogram-edge-path\" }),\n ];\n\n // Divorce markers: two short slashes at midpoint\n if (relType === \"divorced\") {\n const mid = pathMidpoint(edge.path);\n if (mid) {\n elements.push(\n el(\"line\", {\n x1: mid.x - 4,\n y1: mid.y - 6,\n x2: mid.x + 4,\n y2: mid.y + 6,\n class: \"schematex-genogram-divorce-mark\",\n stroke: \"#333\",\n \"stroke-width\": \"2\",\n }),\n el(\"line\", {\n x1: mid.x - 4 + 6,\n y1: mid.y - 6,\n x2: mid.x + 4 + 6,\n y2: mid.y + 6,\n class: \"schematex-genogram-divorce-mark\",\n stroke: \"#333\",\n \"stroke-width\": \"2\",\n })\n );\n }\n }\n\n // Separation marker: single slash\n if (relType === \"separated\") {\n const mid = pathMidpoint(edge.path);\n if (mid) {\n elements.push(\n el(\"line\", {\n x1: mid.x - 4,\n y1: mid.y - 6,\n x2: mid.x + 4,\n y2: mid.y + 6,\n class: \"schematex-genogram-separation-mark\",\n stroke: \"#333\",\n \"stroke-width\": \"2\",\n })\n );\n }\n }\n\n children.push(\n group(\n {\n class: cssClass,\n \"data-from\": edge.from,\n \"data-to\": edge.to,\n },\n elements\n )\n );\n }\n\n return group({ class: \"schematex-genogram-edges\" }, children);\n}\n\nfunction pathMidpoint(\n pathData: string\n): { x: number; y: number } | null {\n const coords = pathData.match(/[\\d.-]+/g);\n if (!coords || coords.length < 4) return null;\n const x1 = parseFloat(coords[0]);\n const y1 = parseFloat(coords[1]);\n const x2 = parseFloat(coords[2]);\n const y2 = parseFloat(coords[3]);\n return { x: (x1 + x2) / 2, y: (y1 + y2) / 2 };\n}\n\n// ─── Nodes ──────────────────────────────────────────────────\n\nfunction groupByGeneration(nodes: LayoutNode[]): Map<number, LayoutNode[]> {\n const groups = new Map<number, LayoutNode[]>();\n for (const node of nodes) {\n const gen = node.generation;\n const group = groups.get(gen) ?? [];\n group.push(node);\n groups.set(gen, group);\n }\n return groups;\n}\n\nfunction renderNodes(\n genGroups: Map<number, LayoutNode[]>\n): string[] {\n const layers: string[] = [];\n const sortedGens = Array.from(genGroups.keys()).sort((a, b) => a - b);\n\n for (const genIdx of sortedGens) {\n const nodes = genGroups.get(genIdx) ?? [];\n const nodeElements: string[] = [];\n\n for (const node of nodes) {\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n nodeElements.push(\n renderIndividualSymbol(node.individual, cx, cy, node.width)\n );\n }\n\n layers.push(\n group(\n {\n class: `schematex-genogram-generation schematex-genogram-generation-${genIdx}`,\n \"data-generation\": genIdx,\n },\n nodeElements\n )\n );\n }\n\n return layers;\n}\n\n// ─── Labels ─────────────────────────────────────────────────\n\nfunction renderLabels(\n nodes: LayoutNode[],\n config: RenderConfig\n): string {\n const labels: string[] = [];\n\n for (const node of nodes) {\n const ind = node.individual;\n const label = ind.label || ind.id;\n const cx = node.x + node.width / 2;\n const labelY = node.y + node.height + 6 + config.fontSize;\n\n let labelText = label.charAt(0).toUpperCase() + label.slice(1);\n if (ind.birthYear && ind.deathYear) {\n labelText += ` (${ind.birthYear}–${ind.deathYear})`;\n } else if (ind.birthYear) {\n labelText += ` (b. ${ind.birthYear})`;\n }\n\n labels.push(\n text(\n {\n x: cx,\n y: labelY,\n class: \"schematex-genogram-label\",\n \"data-individual-id\": ind.id,\n },\n labelText\n )\n );\n }\n\n return group({ class: \"schematex-genogram-labels\" }, labels);\n}\n","import type { DiagramPlugin, RenderConfig } from \"../../core/types\";\nimport { parseGenogram } from \"./parser\";\nimport { layoutGenogram } from \"./layout\";\nimport { renderGenogram } from \"./renderer\";\n\nexport { parseGenogram, ParseError } from \"./parser\";\nexport { layoutGenogram } from \"./layout\";\nexport { renderGenogram } from \"./renderer\";\nexport { renderIndividualSymbol, getRequiredDefs } from \"./symbols\";\n\nexport const genogram: DiagramPlugin = {\n type: \"genogram\",\n\n detect(text: string): boolean {\n const firstLine = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return firstLine === \"genogram\" || firstLine.startsWith(\"genogram \");\n },\n\n parse: parseGenogram,\n\n render(text: string, config?: RenderConfig): string {\n const ast = parseGenogram(text);\n const layoutConfig = {\n nodeSpacingX: 80,\n nodeSpacingY: 100,\n nodeWidth: 40,\n nodeHeight: 40,\n };\n const layout = layoutGenogram(ast, layoutConfig);\n const renderConfig: RenderConfig = {\n fontFamily: config?.fontFamily ?? \"system-ui, -apple-system, sans-serif\",\n fontSize: config?.fontSize ?? 12,\n theme: config?.theme ?? \"default\",\n padding: config?.padding ?? 20,\n };\n return renderGenogram(layout, renderConfig, ast);\n },\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/diagrams/fishbone/parser.ts","../src/diagrams/fishbone/layout.ts","../src/diagrams/fishbone/renderer.ts","../src/diagrams/fishbone/index.ts"],"names":["text","title","line","resolveFishboneTheme","rect","el","group","polygon","desc","defs","svgRoot"],"mappings":"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","file":"chunk-IMHR3S5H.cjs","sourcesContent":["import type {\n FishboneAST,\n FishboneCauseSide,\n FishboneDensity,\n FishboneNode,\n FishboneOrientation,\n FishboneSides,\n} from \"../../core/types\";\n\nexport class FishboneParseError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"FishboneParseError\";\n }\n}\n\ninterface CategoryDef {\n id: string;\n label: string;\n color?: string;\n side?: \"top\" | \"bottom\";\n order?: number;\n}\n\nconst SLOPE_PRESETS: Record<string, number> = {\n gentle: 0.45,\n normal: 0.6,\n steep: 0.75,\n};\n\n/**\n * Fishbone DSL parser.\n *\n * Supports two syntactic styles, mixable in one document:\n *\n * Style A — structured (per 13-FISHBONE-STANDARD §11)\n *\n * fishbone \"Title\"\n * effect \"Problem statement\"\n * category content \"Content\"\n * category tech \"Technical\"\n * content : \"Publishing frequency down\"\n * content : \"Keyword gaps\"\n * - \"No long-tail coverage\"\n * - \"Competitor dominates H1\"\n *\n * Style B — compact shorthand (convenient for quick authoring, AI output)\n *\n * fishbone \"Title\"\n * effect \"Problem statement\"\n * category Content: Publishing frequency down; Content too generic; Keyword gaps\n * category Technical: Core Web Vitals failing; Crawl coverage drop\n *\n * Config directives:\n *\n * config direction = left|right # head orientation (default right)\n * config width = 900\n * config height = 620\n *\n * Lines starting with `#` are comments. Leading whitespace is indentation; a\n * line that begins with `-` (after ≥2 spaces of indent) is a Level-2 sub-cause\n * for the most-recent Level-1 cause.\n */\nexport function parseFishboneDSL(text: string): FishboneAST {\n const rawLines = text.split(/\\r?\\n/);\n\n let title: string | undefined;\n let effect = \"\";\n let orientation: FishboneOrientation = \"ltr\";\n let width: number | undefined;\n let height: number | undefined;\n let sides: FishboneSides | undefined;\n let ribSlope: number | undefined;\n let density: FishboneDensity | undefined;\n let causeSide: FishboneCauseSide | undefined;\n\n const categories: CategoryDef[] = [];\n const causesByCategory = new Map<string, FishboneNode[]>();\n let lastLevel1: FishboneNode | null = null;\n\n let headerSeen = false;\n\n const getCat = (id: string): CategoryDef | undefined =>\n categories.find((c) => c.id === id || c.label === id);\n\n for (let i = 0; i < rawLines.length; i++) {\n const raw = rawLines[i] ?? \"\";\n const line = stripComment(raw).trimEnd();\n if (!line.trim()) continue;\n\n const indent = countIndent(raw);\n const trimmed = line.trim();\n\n // Header: fishbone \"Title\" OR fishbone: \"Title\"\n if (!headerSeen && /^fishbone\\b/i.test(trimmed)) {\n const m = trimmed.match(/^fishbone\\s*:?\\s*(.*)$/i);\n if (m && m[1]) title = stripQuotes(m[1]);\n headerSeen = true;\n continue;\n }\n\n // Sub-cause (Level 2+): starts with \"-\" after indent\n if (indent >= 2 && trimmed.startsWith(\"-\")) {\n if (!lastLevel1) {\n throw new FishboneParseError(\n `Sub-cause at line ${i + 1} has no preceding Level-1 cause: \"${trimmed}\"`\n );\n }\n const subText = stripQuotes(trimmed.slice(1).trim());\n if (!subText) continue;\n lastLevel1.children.push({ label: subText, children: [] });\n continue;\n }\n\n // effect \"...\"\n if (/^effect\\b/i.test(trimmed)) {\n const m = trimmed.match(/^effect\\s*:?\\s*(.*)$/i);\n if (m) effect = stripQuotes(m[1] ?? \"\");\n continue;\n }\n\n // config key = value\n if (/^config\\b/i.test(trimmed)) {\n const m = trimmed.match(/^config\\s+([a-zA-Z]+)\\s*=\\s*(.+)$/i);\n if (m) {\n const key = m[1]!.toLowerCase();\n const val = stripQuotes(m[2]!.trim());\n if (key === \"direction\") {\n orientation = val === \"left\" || val === \"rtl\" ? \"rtl\" : \"ltr\";\n } else if (key === \"width\") {\n const n = Number(val);\n if (Number.isFinite(n)) width = n;\n } else if (key === \"height\") {\n const n = Number(val);\n if (Number.isFinite(n)) height = n;\n } else if (key === \"sides\") {\n const v = val.toLowerCase();\n if (v === \"both\" || v === \"top\" || v === \"bottom\") sides = v;\n } else if (key === \"slope\" || key === \"ribslope\") {\n const preset = SLOPE_PRESETS[val.toLowerCase()];\n if (preset !== undefined) ribSlope = preset;\n else {\n const n = Number(val);\n if (Number.isFinite(n) && n > 0 && n < 3) ribSlope = n;\n }\n } else if (key === \"density\") {\n const v = val.toLowerCase();\n if (v === \"compact\" || v === \"normal\" || v === \"spacious\") density = v;\n } else if (key === \"causeside\" || key === \"cause-side\") {\n const v = val.toLowerCase();\n if (v === \"head\" || v === \"tail\" || v === \"both\") causeSide = v;\n }\n }\n continue;\n }\n\n // category <id> \"<display>\" [color: <hex>]\n if (/^category\\b/i.test(trimmed)) {\n const compact = trimmed.match(/^category\\s+([^:]+?)\\s*:\\s*(.+)$/i);\n const structured = trimmed.match(\n /^category\\s+([a-zA-Z][\\w-]*)\\s+(\"[^\"]*\"|[^\\s[]+)(?:\\s*(\\[.*\\]))?\\s*$/i\n );\n\n if (structured) {\n const id = structured[1]!;\n const label = stripQuotes(structured[2]!);\n const props = parseProps(structured[3] ?? \"\");\n if (!getCat(id)) {\n const sideProp = props[\"side\"]?.toLowerCase();\n const side =\n sideProp === \"top\" || sideProp === \"bottom\" ? sideProp : undefined;\n const orderProp = props[\"order\"];\n const orderNum = orderProp !== undefined ? Number(orderProp) : NaN;\n const order = Number.isFinite(orderNum) ? orderNum : undefined;\n categories.push({ id, label, color: props[\"color\"], side, order });\n causesByCategory.set(id, []);\n }\n lastLevel1 = null;\n continue;\n }\n\n if (compact) {\n const label = stripQuotes(compact[1]!.trim());\n const id = slugify(label);\n const rest = compact[2]!.trim();\n if (!getCat(id)) {\n categories.push({ id, label });\n causesByCategory.set(id, []);\n }\n // split by `;` for compact style causes\n const bucket = causesByCategory.get(id)!;\n for (const part of rest.split(/[;,]/)) {\n const txt = stripQuotes(part.trim());\n if (txt) {\n const node: FishboneNode = { label: txt, children: [] };\n bucket.push(node);\n lastLevel1 = node;\n }\n }\n continue;\n }\n }\n\n // <categoryId> : \"cause\"\n const causeMatch = trimmed.match(/^([a-zA-Z][\\w-]*)\\s*:\\s*(.+)$/);\n if (causeMatch) {\n const catId = causeMatch[1]!;\n const cat = getCat(catId);\n if (!cat) {\n throw new FishboneParseError(\n `Unknown category \"${catId}\" at line ${i + 1}. Declare with \\`category ${catId} \"...\"\\` first.`\n );\n }\n const bucket = causesByCategory.get(cat.id)!;\n const rest = causeMatch[2]!.trim();\n // `cause_text [prop: value]`\n const { text: causeText } = splitTrailingProps(rest);\n const label = stripQuotes(causeText);\n if (!label) continue;\n const node: FishboneNode = { label, children: [] };\n bucket.push(node);\n lastLevel1 = node;\n continue;\n }\n\n // Unknown line — ignore silently to tolerate alien syntax blends\n }\n\n if (!effect) {\n // Fallback: use title as effect\n effect = title ?? \"\";\n }\n\n if (categories.length === 0) {\n throw new FishboneParseError(\n \"Fishbone requires at least one `category`. See docs/reference/13-FISHBONE-STANDARD.md.\"\n );\n }\n\n const majors: FishboneNode[] = categories.map((c) => ({\n label: c.label,\n color: c.color,\n children: causesByCategory.get(c.id) ?? [],\n side: c.side,\n order: c.order,\n }));\n\n return {\n type: \"fishbone\",\n title,\n effect,\n majors,\n orientation,\n width,\n height,\n sides,\n ribSlope,\n density,\n causeSide,\n };\n}\n\n// ─── helpers ─────────────────────────────────────────────────\n\nfunction stripComment(s: string): string {\n let out = \"\";\n let inQuote = false;\n for (const ch of s) {\n if (ch === '\"') inQuote = !inQuote;\n if (ch === \"#\" && !inQuote) break;\n out += ch;\n }\n return out;\n}\n\nfunction stripQuotes(v: string): string {\n const t = v.trim();\n if (t.length >= 2 && t.startsWith('\"') && t.endsWith('\"')) return t.slice(1, -1);\n return t;\n}\n\nfunction countIndent(raw: string): number {\n let n = 0;\n for (const ch of raw) {\n if (ch === \" \") n += 1;\n else if (ch === \"\\t\") n += 2;\n else break;\n }\n return n;\n}\n\nfunction slugify(s: string): string {\n return (\n s\n .toLowerCase()\n .replace(/[^\\w\\u4e00-\\u9fff]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\") || \"cat\"\n );\n}\n\nfunction splitTrailingProps(s: string): { text: string; props: Record<string, string> } {\n const idx = s.lastIndexOf(\"[\");\n if (idx < 0 || !s.trimEnd().endsWith(\"]\")) return { text: s, props: {} };\n const text = s.slice(0, idx).trim();\n const props = parseProps(s.slice(idx));\n return { text, props };\n}\n\nfunction parseProps(raw: string): Record<string, string> {\n const out: Record<string, string> = {};\n const m = raw.match(/^\\[(.*)\\]$/s);\n if (!m) return out;\n const inside = m[1]!;\n for (const part of splitTopLevelCommas(inside)) {\n const [k, ...rest] = part.split(\":\");\n if (!k || rest.length === 0) continue;\n out[k.trim()] = stripQuotes(rest.join(\":\").trim());\n }\n return out;\n}\n\nfunction splitTopLevelCommas(inside: string): string[] {\n const parts: string[] = [];\n let depth = 0;\n let buf = \"\";\n let inQuote = false;\n for (const ch of inside) {\n if (ch === '\"') inQuote = !inQuote;\n if (!inQuote) {\n if (ch === \"[\") depth += 1;\n else if (ch === \"]\") depth -= 1;\n else if (ch === \",\" && depth === 0) {\n parts.push(buf);\n buf = \"\";\n continue;\n }\n }\n buf += ch;\n }\n if (buf.trim()) parts.push(buf);\n return parts;\n}\n","import type { FishboneAST, FishboneCauseSide, FishboneNode } from \"../../core/types\";\nimport { resolveFishboneTheme } from \"../../core/theme\";\n\n/**\n * Fishbone layout engine.\n *\n * Geometric contract (see 13-FISHBONE-STANDARD §5, §9):\n * - Horizontal spine at `spineY`\n * - Effect polygon at right (ltr) or left (rtl) end\n * - Category ribs slant AWAY from the fish head (signature of Ishikawa form)\n * - Ribs are paired top/bottom on the same X column for visual rhythm\n * - Each rib hosts Level-1 causes as short horizontal branches toward the head\n * - Rib length adapts to (max) cause count in its half so headers align\n *\n * This is an optimized v2 layout that improves on the naive fixed-slope design:\n * 1. Dynamic row heights — a Level-1 cause with N sub-causes reserves\n * (baseRow + N·subRow) of vertical space so nothing overlaps.\n * 2. Per-half aligned headers — ribs in the same half share the same outer Y\n * so category pills form a clean visual row.\n * 3. Column-pairing — top and bottom ribs share the same spine X.\n * 4. Smart canvas sizing — derives width/height from content, respecting\n * optional user overrides from `config width = …` / `config height = …`.\n * 5. Label-aware extents — long cause labels extend the canvas rather than\n * clipping, so multi-lingual / verbose content is first-class.\n * 6. Label bboxes exposed for the renderer to build a text-gap mask.\n */\n\n// ─── Public Types ─────────────────────────────────────────────\n\nexport interface FishboneLayoutCause {\n label: string;\n /** Rib index (0 = first category) */\n ribIndex: number;\n /** Slot index on the rib (0 = closest to spine) */\n slotIndex: number;\n /** Cause start point on the rib */\n ribX: number;\n ribY: number;\n /** Horizontal branch end point (label starts just beyond) */\n branchX: number;\n branchY: number;\n /** Label anchor (x where text starts, y baseline) */\n labelX: number;\n labelY: number;\n labelAnchor: \"start\" | \"end\";\n /** Direction this cause branch sticks out: \"head\" = toward head, \"tail\" = toward tail. */\n causeSide: \"head\" | \"tail\";\n /** Sub-causes (Level 2) stacked below the main label */\n subCauses: FishboneLayoutSubCause[];\n}\n\nexport interface FishboneLayoutSubCause {\n label: string;\n x: number;\n y: number;\n tickX1: number;\n tickX2: number;\n tickY: number;\n anchor: \"start\" | \"end\";\n}\n\nexport interface FishboneLayoutRib {\n index: number;\n half: \"top\" | \"bottom\";\n label: string;\n color: string;\n /** Where rib meets spine */\n spineX: number;\n spineY: number;\n /** Far end of rib (where header pill sits) */\n endX: number;\n endY: number;\n /** Header pill geometry */\n headerX: number;\n headerY: number;\n headerW: number;\n headerH: number;\n causes: FishboneLayoutCause[];\n}\n\nexport interface FishboneBBox {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport interface FishboneLayoutResult {\n width: number;\n height: number;\n orientation: \"ltr\" | \"rtl\";\n spineY: number;\n spineStartX: number;\n spineEndX: number;\n tailForkTipTop: { x: number; y: number };\n tailForkTipBot: { x: number; y: number };\n head: {\n x: number; // spine-attached x\n y: number; // spine-attached y (= spineY)\n tipX: number; // pointy tip\n tipY: number;\n w: number;\n h: number;\n label: string;\n };\n ribs: FishboneLayoutRib[];\n /** Label bounding boxes (for text-gap mask) */\n textBBoxes: FishboneBBox[];\n title?: string;\n}\n\n// ─── Geometry constants (tunable, exported for renderer parity) ──\n\nexport const FB_CONST = {\n PADDING: 40,\n HEAD_W: 90,\n HEAD_H: 80,\n TAIL_LEN: 40,\n SPINE_OFFSET_FROM_TAIL: 40, // distance from canvas left to spine start\n RIB_SLOPE: 0.6, // dx/dy — consistent across all ribs\n RIB_BASE_EXTENT_Y: 30, // vertical distance of first slot from spine\n ROW_HEIGHT: 30, // vertical gap between Level-1 slots\n SUB_ROW_HEIGHT: 17,\n BRANCH_LEN: 30, // horizontal Level-1 branch length\n SUB_TICK_LEN: 10,\n HEADER_W: 132,\n HEADER_H: 34,\n HEADER_GAP: 12, // gap between rib endpoint and header pill\n COL_STEP: 130, // spine x gap between adjacent ribs\n COL_FIRST_OFFSET: 170, // first rib's distance from spine start\n LABEL_FONT: 12,\n HEADER_FONT: 14,\n SUB_FONT: 11,\n EFFECT_FONT: 14,\n LABEL_GAP: 6, // gap from branch end to label\n MIN_ROWS_PER_HALF: 4, // aesthetic minimum rib length\n COL_GAP_BETWEEN_LABELS: 18, // min horizontal breathing between adjacent ribs' label columns\n HEAD_PAD_X: 44, // total horizontal padding around effect text inside head\n HEAD_PAD_Y: 20, // min vertical padding around effect text inside head\n TITLE_CLEARANCE: 24, // extra gap between title baseline and top header pill\n} as const;\n\n// ─── Default palette (13-FISHBONE-STANDARD §5.4) ─────────────\n\n\n// ─── Text measurement (CJK-aware approximation) ───────────────\n\nexport function estimateTextWidth(s: string, fontSize: number): number {\n let w = 0;\n for (const ch of s) {\n const cp = ch.codePointAt(0) ?? 0;\n // CJK unified ideographs + kana + Hangul + fullwidth\n const isWide =\n (cp >= 0x3000 && cp <= 0x30ff) ||\n (cp >= 0x3400 && cp <= 0x9fff) ||\n (cp >= 0xac00 && cp <= 0xd7af) ||\n (cp >= 0xff00 && cp <= 0xffef);\n w += fontSize * (isWide ? 1.0 : 0.56);\n }\n return w;\n}\n\n// ─── Density presets ──────────────────────────────────────────\n\ninterface DensityTunables {\n rowHeight: number;\n subRowHeight: number;\n colStep: number;\n headerW: number;\n headerH: number;\n headerGap: number;\n minRowsPerHalf: number;\n colFirstOffset: number;\n}\n\nconst DENSITY: Record<\"compact\" | \"normal\" | \"spacious\", DensityTunables> = {\n compact: {\n rowHeight: 24,\n subRowHeight: 15,\n colStep: 110,\n headerW: 118,\n headerH: 30,\n headerGap: 8,\n minRowsPerHalf: 3,\n colFirstOffset: 140,\n },\n normal: {\n rowHeight: 30,\n subRowHeight: 17,\n colStep: 130,\n headerW: 132,\n headerH: 34,\n headerGap: 12,\n minRowsPerHalf: 4,\n colFirstOffset: 170,\n },\n spacious: {\n rowHeight: 36,\n subRowHeight: 19,\n colStep: 150,\n headerW: 148,\n headerH: 38,\n headerGap: 16,\n minRowsPerHalf: 5,\n colFirstOffset: 200,\n },\n};\n\n// ─── Public API ───────────────────────────────────────────────\n\nexport function layoutFishbone(ast: FishboneAST, opts?: { palette?: readonly string[] }): FishboneLayoutResult {\n const majors = ast.majors.length > 0 ? ast.majors : [];\n const nRibs = majors.length;\n\n const density = ast.density ?? \"normal\";\n const D = DENSITY[density];\n const ribSlope = ast.ribSlope ?? FB_CONST.RIB_SLOPE;\n const causeSideSetting: FishboneCauseSide = ast.causeSide ?? \"head\";\n const sides = ast.sides ?? \"both\";\n\n // Partition ribs into top/bottom halves honoring per-category `side` overrides\n // and the `sides` setting. If a category has an explicit side, use it;\n // otherwise fall back to the global `sides` default (single-sided layouts\n // pin everything to that half; \"both\" alternates declaration order across\n // the two halves as before).\n const topMajors: FishboneNode[] = [];\n const botMajors: FishboneNode[] = [];\n if (sides === \"top\" || sides === \"bottom\") {\n const bucket = sides === \"top\" ? topMajors : botMajors;\n for (const m of majors) {\n if (m.side === \"top\") topMajors.push(m);\n else if (m.side === \"bottom\") botMajors.push(m);\n else bucket.push(m);\n }\n } else {\n const autoPool: FishboneNode[] = [];\n for (const m of majors) {\n if (m.side === \"top\") topMajors.push(m);\n else if (m.side === \"bottom\") botMajors.push(m);\n else autoPool.push(m);\n }\n // Greedy balance — push into whichever half currently has fewer ribs,\n // ties → top (matches the prior \"top gets the extra\" rule).\n for (const m of autoPool) {\n if (topMajors.length <= botMajors.length) topMajors.push(m);\n else botMajors.push(m);\n }\n }\n\n // Respect per-rib `order` (lower = closer to tail). Stable sort within half.\n const byOrder = (a: FishboneNode, b: FishboneNode): number => {\n const ao = a.order ?? Number.POSITIVE_INFINITY;\n const bo = b.order ?? Number.POSITIVE_INFINITY;\n return ao - bo;\n };\n topMajors.sort(byOrder);\n botMajors.sort(byOrder);\n\n const nTop = topMajors.length;\n const nBot = botMajors.length;\n // Keep legacy var names alive\n void nRibs;\n\n // Row count per rib = max(subCauses) for that rib's Level-1 list.\n // Extent per rib = sum of rowHeights for slots 0..n-1.\n const ribRowHeights = (m: FishboneNode): number[] => {\n if (m.children.length === 0) return [];\n return m.children.map(\n (c) => D.rowHeight + c.children.length * D.subRowHeight\n );\n };\n\n const topExtents = topMajors.map((m) =>\n sumOrMin(ribRowHeights(m), D.minRowsPerHalf * D.rowHeight)\n );\n const botExtents = botMajors.map((m) =>\n sumOrMin(ribRowHeights(m), D.minRowsPerHalf * D.rowHeight)\n );\n\n // ── Head sizing (computed early so it can influence half-extent padding) ──\n const effectTextW = estimateTextWidth(ast.effect, FB_CONST.EFFECT_FONT);\n // Grow H proportionally with W to maintain ≈2:1 W:H ratio (avoids flat sliver).\n const rawHeadW = effectTextW + FB_CONST.HEAD_PAD_X;\n const headEffectiveH = Math.max(FB_CONST.HEAD_H, Math.ceil(rawHeadW / 2));\n // At y ± font/2, available width = W * (1 − font/H) due to triangle taper.\n const taperAtText = 1 - FB_CONST.EFFECT_FONT / headEffectiveH;\n const headEffectiveW = Math.max(FB_CONST.HEAD_W, Math.ceil(rawHeadW / taperAtText));\n\n // Head extends ±headEffectiveH/2 from spine — guarantee half extents cover it.\n const minHalfFromHead = Math.ceil(headEffectiveH / 2) + 6;\n\n const topHalfExtent =\n nTop > 0\n ? Math.max(\n minHalfFromHead,\n D.minRowsPerHalf * D.rowHeight,\n ...(topExtents.length ? topExtents : [0])\n )\n : sides === \"bottom\"\n ? Math.max(minHalfFromHead, 0)\n : 0;\n const botHalfExtent =\n nBot > 0\n ? Math.max(\n minHalfFromHead,\n D.minRowsPerHalf * D.rowHeight,\n ...(botExtents.length ? botExtents : [0])\n )\n : sides === \"top\"\n ? Math.max(minHalfFromHead, 0)\n : 0;\n\n const nCols = Math.max(nTop, nBot, 1);\n\n // ── Adaptive column step: widest Level-1 label + branch + gap + breathing ──\n let maxCauseLabelW = 0;\n let maxSubLabelW = 0;\n for (const m of majors) {\n for (const c of m.children) {\n maxCauseLabelW = Math.max(\n maxCauseLabelW,\n estimateTextWidth(c.label, FB_CONST.LABEL_FONT)\n );\n for (const sc of c.children) {\n maxSubLabelW = Math.max(\n maxSubLabelW,\n estimateTextWidth(sc.label, FB_CONST.SUB_FONT)\n );\n }\n }\n }\n // Label column needs to fit the widest Level-1 label AND any Level-2 tick+label\n // that sits under it (sub causes are indented by SUB_TICK_LEN + 4 from labelX).\n const subExtent = maxSubLabelW > 0 ? FB_CONST.SUB_TICK_LEN + 4 + maxSubLabelW : 0;\n const labelColW = Math.max(maxCauseLabelW, subExtent);\n // When causes can sit on both sides, each column must reserve label space on both sides.\n const labelExtentsPerCol = causeSideSetting === \"both\" ? 2 : 1;\n const minColStep =\n FB_CONST.BRANCH_LEN + FB_CONST.LABEL_GAP + labelColW + FB_CONST.COL_GAP_BETWEEN_LABELS;\n const colStep = Math.max(\n D.colStep,\n Math.ceil(minColStep * (labelExtentsPerCol === 2 ? 1.15 : 1))\n );\n\n // ── Canvas sizing ───────────────────────────────────────────\n const spineStartX = FB_CONST.PADDING + FB_CONST.TAIL_LEN + FB_CONST.SPINE_OFFSET_FROM_TAIL;\n const firstRibX = spineStartX + D.colFirstOffset;\n const lastRibX = firstRibX + (nCols - 1) * colStep;\n // Reserve room for the last rib's label column before the head begins.\n const spineEndX = lastRibX + Math.max(40, FB_CONST.BRANCH_LEN + FB_CONST.LABEL_GAP + labelColW + 12);\n\n const headX = spineEndX;\n const headTipXAdj = headX + headEffectiveW;\n\n const width =\n ast.width ?? Math.ceil(headTipXAdj + FB_CONST.PADDING);\n\n const title = ast.title;\n const titleReserve = title ? FB_CONST.TITLE_CLEARANCE + 20 : 0;\n\n const spineY =\n FB_CONST.PADDING + titleReserve + topHalfExtent + D.headerH / 2 + 12;\n\n const height =\n ast.height ??\n Math.ceil(\n spineY + botHalfExtent + D.headerH / 2 + 12 + FB_CONST.PADDING\n );\n\n // ── Ribs ────────────────────────────────────────────────────\n const ribs: FishboneLayoutRib[] = [];\n const palette = opts?.palette ?? resolveFishboneTheme(\"default\").palette;\n const textBBoxes: FishboneBBox[] = [];\n\n const buildHalfRibs = (\n halfMajors: FishboneNode[],\n startIndex: number,\n half: \"top\" | \"bottom\",\n halfExtent: number\n ): void => {\n for (let i = 0; i < halfMajors.length; i++) {\n const major = halfMajors[i]!;\n const globalIdx = startIndex + i;\n const color = major.color ?? palette[globalIdx % palette.length]!;\n const spineX = firstRibX + i * colStep;\n\n // Aligned rib endpoint Y → same for all ribs in half.\n const endY = half === \"top\" ? spineY - halfExtent : spineY + halfExtent;\n const endX = spineX - halfExtent * ribSlope;\n\n // Header pill positioned along the rib's slope extension.\n // The rib direction: for every 1 unit of Y away from spine, X moves -ribSlope.\n const extraDist = D.headerGap + D.headerH / 2;\n const headerCenterY =\n half === \"top\" ? endY - extraDist : endY + extraDist;\n // Continue the slope: pill center X follows the same dx/dy as the rib.\n const headerCenterX = endX - extraDist * ribSlope;\n const headerW = Math.max(\n D.headerW,\n estimateTextWidth(major.label, FB_CONST.HEADER_FONT) + 28\n );\n const headerX = headerCenterX - headerW / 2;\n const headerY = headerCenterY - D.headerH / 2;\n\n textBBoxes.push({\n x: headerX,\n y: headerY,\n w: headerW,\n h: D.headerH,\n });\n\n // Cause slots — cumulative along rib from spine outward.\n const causes: FishboneLayoutCause[] = [];\n let accum = FB_CONST.RIB_BASE_EXTENT_Y; // distance from spine to first slot center\n for (let s = 0; s < major.children.length; s++) {\n const child = major.children[s]!;\n const rowH =\n D.rowHeight + child.children.length * D.subRowHeight;\n // vertical offset for this slot (center of row)\n const slotOffset = accum + rowH / 2 - D.rowHeight / 2;\n const ribY =\n half === \"top\" ? spineY - slotOffset : spineY + slotOffset;\n const ribX = spineX - slotOffset * ribSlope;\n\n // Resolve cause direction for this slot.\n const causeDir: \"head\" | \"tail\" =\n causeSideSetting === \"tail\"\n ? \"tail\"\n : causeSideSetting === \"both\"\n ? s % 2 === 0\n ? \"head\"\n : \"tail\"\n : \"head\";\n\n const branchY = ribY;\n const branchX =\n causeDir === \"head\"\n ? ribX + FB_CONST.BRANCH_LEN\n : ribX - FB_CONST.BRANCH_LEN;\n const labelX =\n causeDir === \"head\"\n ? branchX + FB_CONST.LABEL_GAP\n : branchX - FB_CONST.LABEL_GAP;\n const labelY = branchY;\n const labelAnchor: \"start\" | \"end\" =\n causeDir === \"head\" ? \"start\" : \"end\";\n\n // Text bbox for mask\n const labelW = estimateTextWidth(child.label, FB_CONST.LABEL_FONT);\n textBBoxes.push({\n x: causeDir === \"head\" ? labelX - 2 : labelX - labelW - 2,\n y: labelY - FB_CONST.LABEL_FONT / 2 - 2,\n w: labelW + 4,\n h: FB_CONST.LABEL_FONT + 4,\n });\n\n // Sub-causes stack below the main label\n const subCauses: FishboneLayoutSubCause[] = [];\n for (let si = 0; si < child.children.length; si++) {\n const sub = child.children[si]!;\n const subY = labelY + (si + 1) * D.subRowHeight;\n const tickX1 =\n causeDir === \"head\" ? labelX + 2 : labelX - 2;\n const tickX2 =\n causeDir === \"head\"\n ? tickX1 + FB_CONST.SUB_TICK_LEN\n : tickX1 - FB_CONST.SUB_TICK_LEN;\n const subX =\n causeDir === \"head\" ? tickX2 + 4 : tickX2 - 4;\n subCauses.push({\n label: sub.label,\n x: subX,\n y: subY,\n tickX1,\n tickX2,\n tickY: subY,\n anchor: causeDir === \"head\" ? \"start\" : \"end\",\n });\n const subW = estimateTextWidth(sub.label, FB_CONST.SUB_FONT);\n textBBoxes.push({\n x: causeDir === \"head\" ? subX - 2 : subX - subW - 2,\n y: subY - FB_CONST.SUB_FONT / 2 - 2,\n w: subW + 4,\n h: FB_CONST.SUB_FONT + 4,\n });\n }\n\n causes.push({\n label: child.label,\n ribIndex: globalIdx,\n slotIndex: s,\n ribX,\n ribY,\n branchX,\n branchY,\n labelX,\n labelY,\n labelAnchor,\n causeSide: causeDir,\n subCauses,\n });\n\n accum += rowH;\n }\n\n ribs.push({\n index: globalIdx,\n half,\n label: major.label,\n color,\n spineX,\n spineY,\n endX,\n endY,\n headerX,\n headerY,\n headerW,\n headerH: D.headerH,\n causes,\n });\n }\n };\n\n buildHalfRibs(topMajors, 0, \"top\", topHalfExtent);\n buildHalfRibs(botMajors, nTop, \"bottom\", botHalfExtent);\n\n // ── Head polygon (right-facing default) ─────────────────────\n const head = {\n x: headX,\n y: spineY,\n tipX: headTipXAdj,\n tipY: spineY,\n w: headEffectiveW,\n h: headEffectiveH,\n label: ast.effect,\n };\n\n // Effect label bbox (for mask around it — though usually effect sits in head\n // which has its own fill, we still add it so any crossing line punches out).\n textBBoxes.push({\n x: headX + 4,\n y: spineY - headEffectiveH / 2 + 4,\n w: headEffectiveW - 8,\n h: headEffectiveH - 8,\n });\n\n // Note: rtl (head-on-left) support: mirror transform applied in renderer\n // rather than recomputing coordinates — simpler and visually identical.\n\n return {\n width,\n height,\n orientation: ast.orientation,\n spineY,\n spineStartX,\n spineEndX,\n tailForkTipTop: { x: FB_CONST.PADDING, y: spineY - FB_CONST.TAIL_LEN },\n tailForkTipBot: { x: FB_CONST.PADDING, y: spineY + FB_CONST.TAIL_LEN },\n head,\n ribs,\n textBBoxes,\n title,\n };\n}\n\nfunction sumOrMin(arr: number[], min: number): number {\n if (arr.length === 0) return min;\n const s = arr.reduce((a, b) => a + b, 0);\n return Math.max(s, min);\n}\n","import type { FishboneAST } from \"../../core/types\";\nimport {\n svgRoot,\n group,\n el,\n line as lineEl,\n rect,\n text as textEl,\n polygon,\n title as titleEl,\n desc as descEl,\n defs,\n} from \"../../core/svg\";\nimport { parseFishboneDSL } from \"./parser\";\nimport { layoutFishbone, type FishboneLayoutResult, type FishboneBBox } from \"./layout\";\nimport { resolveFishboneTheme } from \"../../core/theme\";\n\nconst CSS = `\n.sx-fb { background: var(--schematex-fb-bg, #ffffff); font-family: system-ui, -apple-system, \"Segoe UI\", sans-serif; }\n.sx-fb-title { font: 600 16px sans-serif; fill: #111; }\n.sx-fb-spine { stroke: var(--schematex-fb-spine, #141413); stroke-width: 2; stroke-linecap: butt; fill: none; }\n.sx-fb-tail { stroke: var(--schematex-fb-spine, #141413); stroke-width: 2; stroke-linecap: round; fill: none; }\n.sx-fb-head { stroke-width: 0.5; }\n.sx-fb-head-text { font: 500 14px sans-serif; text-anchor: middle; dominant-baseline: central; }\n.sx-fb-rib { stroke-width: 1.5; fill: none; }\n.sx-fb-header-pill { stroke-width: 0.6; }\n.sx-fb-header-text { font: 500 14px sans-serif; text-anchor: middle; dominant-baseline: central; }\n.sx-fb-branch { stroke-width: 0.8; opacity: 0.6; fill: none; }\n.sx-fb-cause-label { font: 400 12px sans-serif; fill: #3d3d3a; dominant-baseline: central; }\n.sx-fb-sub-tick { stroke-width: 0.7; opacity: 0.5; fill: none; }\n.sx-fb-sub-label { font: 400 11px sans-serif; fill: #555; dominant-baseline: central; }\n`.trim();\n\nfunction lighten(hex: string, amount: number): string {\n // amount in [0, 1]; shifts toward white\n const m = hex.match(/^#?([0-9a-f]{6})$/i);\n if (!m) return hex;\n const n = parseInt(m[1]!, 16);\n const r = (n >> 16) & 0xff;\n const g = (n >> 8) & 0xff;\n const b = n & 0xff;\n const rr = Math.round(r + (255 - r) * amount);\n const gg = Math.round(g + (255 - g) * amount);\n const bb = Math.round(b + (255 - b) * amount);\n return `#${[rr, gg, bb].map((v) => v.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\nfunction darken(hex: string, amount: number): string {\n const m = hex.match(/^#?([0-9a-f]{6})$/i);\n if (!m) return hex;\n const n = parseInt(m[1]!, 16);\n const r = (n >> 16) & 0xff;\n const g = (n >> 8) & 0xff;\n const b = n & 0xff;\n const rr = Math.round(r * (1 - amount));\n const gg = Math.round(g * (1 - amount));\n const bb = Math.round(b * (1 - amount));\n return `#${[rr, gg, bb].map((v) => v.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\nfunction randomId(): string {\n return Math.random().toString(36).slice(2, 8);\n}\n\nfunction buildMask(id: string, w: number, h: number, bboxes: FishboneBBox[]): string {\n const base = rect({ x: 0, y: 0, width: w, height: h, fill: \"white\" });\n const holes = bboxes\n .map((b) =>\n rect({\n x: b.x,\n y: b.y,\n width: b.w,\n height: b.h,\n fill: \"black\",\n rx: 2,\n })\n )\n .join(\"\\n\");\n return el(\"mask\", { id, maskUnits: \"userSpaceOnUse\" }, [base, holes]);\n}\n\nfunction renderHead(layout: FishboneLayoutResult, ltr: boolean): string {\n const h = layout.head;\n const tipX = ltr ? h.tipX : h.x - (h.tipX - h.x);\n const leftX = ltr ? h.x : h.x;\n const rightX = ltr ? h.tipX : tipX;\n // Polygon pointing toward head direction\n const points = ltr\n ? `${leftX},${h.y - h.h / 2} ${leftX},${h.y + h.h / 2} ${rightX},${h.y}`\n : `${rightX},${h.y - h.h / 2} ${rightX},${h.y + h.h / 2} ${tipX},${h.y}`;\n const fill = \"#faece7\";\n const stroke = \"#993c1d\";\n // Bias text toward the wide base (35% from base, 65% from tip) so it reads\n // balanced inside the tapering triangle rather than shifted toward the tip.\n const textX = ltr ? leftX + h.w * 0.38 : rightX - h.w * 0.38;\n return group({ class: \"sx-fb-head-g\" }, [\n polygon({\n points,\n class: \"sx-fb-head\",\n fill,\n stroke,\n }),\n textEl(\n {\n x: textX,\n y: h.y,\n class: \"sx-fb-head-text\",\n fill: darken(stroke, 0.3),\n },\n h.label\n ),\n ]);\n}\n\nfunction renderRibs(layout: FishboneLayoutResult, maskUrl: string): string {\n const parts: string[] = [];\n for (const rib of layout.ribs) {\n const pillFill = lighten(rib.color, 0.82);\n const pillStroke = rib.color;\n const headerTextFill = darken(rib.color, 0.3);\n\n // Rib line (with mask to punch out text overlaps)\n parts.push(\n lineEl({\n x1: rib.spineX,\n y1: rib.spineY,\n x2: rib.endX,\n y2: rib.endY,\n class: \"sx-fb-rib\",\n stroke: rib.color,\n mask: maskUrl,\n })\n );\n\n // Extend the rib line to the pill center along the same slope.\n parts.push(\n lineEl({\n x1: rib.endX,\n y1: rib.endY,\n x2: rib.headerX + rib.headerW / 2,\n y2: rib.headerY + rib.headerH / 2,\n class: \"sx-fb-rib\",\n stroke: rib.color,\n })\n );\n\n // Header pill\n parts.push(\n rect({\n x: rib.headerX,\n y: rib.headerY,\n width: rib.headerW,\n height: rib.headerH,\n rx: 8,\n class: \"sx-fb-header-pill\",\n fill: pillFill,\n stroke: pillStroke,\n })\n );\n parts.push(\n textEl(\n {\n x: rib.headerX + rib.headerW / 2,\n y: rib.headerY + rib.headerH / 2,\n class: \"sx-fb-header-text\",\n fill: headerTextFill,\n },\n rib.label\n )\n );\n\n // Branches + labels\n for (const cause of rib.causes) {\n parts.push(\n lineEl({\n x1: cause.ribX,\n y1: cause.ribY,\n x2: cause.branchX,\n y2: cause.branchY,\n class: \"sx-fb-branch\",\n stroke: rib.color,\n mask: maskUrl,\n })\n );\n parts.push(\n textEl(\n {\n x: cause.labelX,\n y: cause.labelY,\n class: \"sx-fb-cause-label\",\n \"text-anchor\": cause.labelAnchor,\n },\n cause.label\n )\n );\n\n // Sub-causes (Level 2)\n for (const sub of cause.subCauses) {\n parts.push(\n lineEl({\n x1: sub.tickX1,\n y1: sub.tickY,\n x2: sub.tickX2,\n y2: sub.tickY,\n class: \"sx-fb-sub-tick\",\n stroke: rib.color,\n })\n );\n parts.push(\n textEl(\n {\n x: sub.x,\n y: sub.y,\n class: \"sx-fb-sub-label\",\n \"text-anchor\": sub.anchor,\n },\n sub.label\n )\n );\n }\n }\n }\n return group({ class: \"sx-fb-ribs\" }, parts);\n}\n\nexport function renderFishboneAST(ast: FishboneAST, options: { theme?: string } = {}): string {\n const themeName = options.theme ?? ast.metadata?.[\"theme\"] ?? \"default\";\n const tokens = resolveFishboneTheme(themeName);\n const layout = layoutFishbone(ast, { palette: tokens.palette });\n const ltr = layout.orientation !== \"rtl\";\n const maskId = `sx-fb-mask-${randomId()}`;\n const maskUrl = `url(#${maskId})`;\n\n const mask = buildMask(maskId, layout.width, layout.height, layout.textBBoxes);\n\n const spine = lineEl({\n x1: layout.spineStartX,\n y1: layout.spineY,\n x2: layout.spineEndX,\n y2: layout.spineY,\n class: \"sx-fb-spine\",\n });\n\n const tailTop = lineEl({\n x1: layout.spineStartX,\n y1: layout.spineY,\n x2: layout.tailForkTipTop.x,\n y2: layout.tailForkTipTop.y,\n class: \"sx-fb-tail\",\n });\n const tailBot = lineEl({\n x1: layout.spineStartX,\n y1: layout.spineY,\n x2: layout.tailForkTipBot.x,\n y2: layout.tailForkTipBot.y,\n class: \"sx-fb-tail\",\n });\n\n const titleBlock = layout.title\n ? textEl(\n {\n x: layout.width / 2,\n y: 28,\n class: \"sx-fb-title\",\n \"text-anchor\": \"middle\",\n },\n layout.title\n )\n : \"\";\n\n const head = renderHead(layout, ltr);\n const ribs = renderRibs(layout, maskUrl);\n\n const inner = [\n titleEl(layout.title ? `${layout.title} — Fishbone diagram` : \"Fishbone diagram\"),\n descEl(\n `Ishikawa cause-and-effect diagram. Effect: ${ast.effect}. ${ast.majors.length} categories.`\n ),\n el(\"style\", {}, CSS),\n defs([mask]),\n titleBlock,\n tailTop,\n tailBot,\n spine,\n head,\n ribs,\n ];\n\n // For RTL (head on left), mirror horizontally via transform.\n if (!ltr) {\n const mirrored = group(\n {\n transform: `translate(${layout.width} 0) scale(-1 1)`,\n },\n [tailTop, tailBot, spine, head, ribs]\n );\n return svgRoot(\n {\n viewBox: `0 0 ${layout.width} ${layout.height}`,\n width: layout.width,\n height: layout.height,\n class: \"sx-fb\",\n role: \"img\",\n },\n [\n titleEl(layout.title ?? \"Fishbone\"),\n descEl(`Ishikawa diagram (head-left). Effect: ${ast.effect}.`),\n el(\"style\", {}, CSS),\n defs([mask]),\n titleBlock,\n mirrored,\n ]\n );\n }\n\n return svgRoot(\n {\n viewBox: `0 0 ${layout.width} ${layout.height}`,\n width: layout.width,\n height: layout.height,\n class: \"sx-fb\",\n role: \"img\",\n },\n inner\n );\n}\n\nexport function renderFishbone(text: string, options: { theme?: string } = {}): string {\n const ast = parseFishboneDSL(text);\n return renderFishboneAST(ast, options);\n}\n","import type { DiagramPlugin } from \"../../core/types\";\nimport { parseFishboneDSL } from \"./parser\";\nimport { renderFishbone } from \"./renderer\";\n\nexport const fishbone: DiagramPlugin = {\n type: \"fishbone\",\n detect(text: string): boolean {\n const first = text.trim().split(\"\\n\")[0]?.trim().toLowerCase() ?? \"\";\n return first.startsWith(\"fishbone\");\n },\n parse: parseFishboneDSL,\n render(text: string): string {\n return renderFishbone(text);\n },\n};\n\nexport { parseFishboneDSL } from \"./parser\";\nexport { renderFishbone, renderFishboneAST } from \"./renderer\";\nexport { layoutFishbone, FB_CONST } from \"./layout\";\n"]}