@kungal/ui-core 2.57.1 → 2.58.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/twScales.generated.ts","../src/cn.ts","../src/variants.ts","../src/rounded.ts","../src/controlSize.ts","../src/motionPhysics.generated.ts","../src/locale/translate.ts","../src/locale/zh-CN.json","../src/locale/zh-CN.ts","../src/shortcut.ts","../src/menu.ts","../src/splitPane.ts","../src/random.ts","../src/decodeIfEncoded.ts","../src/avatarFallbackImage.ts","../src/avatarFallback.ts","../src/chat/constants.ts","../src/chat/entities.ts","../src/chat/markdown.ts","../src/chat/album.ts","../src/chat/grouping.ts","../src/icons-data.ts","../src/icons.ts"],"names":["extendTailwindMerge","clsx","ranges","out","contentEnd","i"],"mappings":";;;;;;;;AAKO,IAAM,aAAA,GAAgB;AAAA,EAC3B,QAAQ,CAAC,UAAA,EAAY,QAAA,EAAU,QAAA,EAAU,YAAY,QAAQ,CAAA;AAAA,EAC7D,MAAA,EAAQ,CAAC,QAAA,EAAU,QAAA,EAAU,QAAQ,CAAA;AAAA,EACrC,IAAA,EAAM,CAAC,gBAAA,EAAkB,QAAA,EAAU,WAAW,cAAc,CAAA;AAAA,EAC5D,OAAA,EAAS,CAAC,QAAA,EAAU,cAAA,EAAgB,iBAAiB,UAAA,EAAY,aAAA,EAAe,OAAA,EAAS,OAAA,EAAS,MAAM,CAAA;AAAA,EACxG,GAAG,CAAC,WAAA,EAAa,aAAA,EAAe,WAAA,EAAa,eAAe,YAAY,CAAA;AAAA,EACxE,QAAA,EAAU,CAAC,UAAA,EAAY,UAAA,EAAY,YAAY,UAAU;AAC3D,CAAA;;;ACSA,IAAM,UAAUA,iCAAA,CAAoB;AAAA,EAClC,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO;AAAA,MACL,MAAA,EAAQ,CAAC,GAAG,aAAA,CAAc,MAAM,CAAA;AAAA,MAChC,MAAA,EAAQ,CAAC,GAAG,aAAA,CAAc,MAAM,CAAA;AAAA,MAChC,IAAA,EAAM,CAAC,GAAG,aAAA,CAAc,IAAI,CAAA;AAAA,MAC5B,OAAA,EAAS,CAAC,GAAG,aAAA,CAAc,OAAO;AAAA,KACpC;AAAA;AAAA;AAAA,IAGA,WAAA,EAAa;AAAA,MACX,CAAA,EAAG,CAAC,EAAE,CAAA,EAAG,CAAC,GAAG,aAAA,CAAc,CAAC,CAAA,EAAG,CAAA;AAAA,MAC/B,QAAA,EAAU,CAAC,EAAE,QAAA,EAAU,CAAC,GAAG,aAAA,CAAc,QAAQ,CAAA,EAAG;AAAA;AACtD;AAEJ,CAAC,CAAA;AAKM,IAAM,KAAK,CAAA,GAAI,MAAA,KAAiC,OAAA,CAAQC,SAAA,CAAK,MAAM,CAAC;;;AC5B3E,IAAM,KAAA,GAA0D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAU9D,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,8DAAA;AAAA,IACT,OAAA,EAAS,8DAAA;AAAA,IACT,SAAA,EAAW,kEAAA;AAAA,IACX,OAAA,EAAS,8DAAA;AAAA,IACT,OAAA,EAAS,8DAAA;AAAA,IACT,MAAA,EAAQ,4DAAA;AAAA,IACR,IAAA,EAAM;AAAA,GACR;AAAA;AAAA;AAAA;AAAA,EAIA,QAAA,EAAU;AAAA,IACR,OAAA,EAAS,sCAAA;AAAA,IACT,OAAA,EAAS,wDAAA;AAAA,IACT,SAAA,EAAW,4DAAA;AAAA,IACX,OAAA,EAAS,wDAAA;AAAA,IACT,OAAA,EAAS,wDAAA;AAAA,IACT,MAAA,EAAQ,sDAAA;AAAA,IACR,IAAA,EAAM;AAAA,GACR;AAAA,EACA,KAAA,EAAO;AAAA,IACL,OAAA,EAAS,8DAAA;AAAA,IACT,OAAA,EAAS,gFAAA;AAAA,IACT,SAAA,EAAW,oFAAA;AAAA,IACX,OAAA,EAAS,gFAAA;AAAA,IACT,OAAA,EAAS,gFAAA;AAAA,IACT,MAAA,EAAQ,8EAAA;AAAA,IACR,IAAA,EAAM;AAAA,GACR;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,OAAA,EAAS,2DAAA;AAAA,IACT,OAAA,EAAS,2DAAA;AAAA,IACT,SAAA,EAAW,+DAAA;AAAA,IACX,OAAA,EAAS,2DAAA;AAAA,IACT,OAAA,EAAS,2DAAA;AAAA,IACT,MAAA,EAAQ,yDAAA;AAAA,IACR,IAAA,EAAM;AAAA,GACR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAA,EAAQ;AAAA,IACN,OAAA,EAAS,0FAAA;AAAA,IACT,OAAA,EAAS,0FAAA;AAAA,IACT,SAAA,EAAW,gGAAA;AAAA,IACX,OAAA,EAAS,0FAAA;AAAA,IACT,OAAA,EAAS,0FAAA;AAAA,IACT,MAAA,EAAQ,uFAAA;AAAA,IACR,IAAA,EAAM;AAAA;AAEV,CAAA;AAEO,IAAM,oBAAoB,CAC/B,OAAA,EACA,UACW,KAAA,CAAM,OAAO,EAAE,KAAK;AAK1B,IAAM,YAAA,GAA2C;AAAA,EACtD,OAAA,EAAS,YAAA;AAAA,EACT,OAAA,EAAS,YAAA;AAAA,EACT,SAAA,EAAW,cAAA;AAAA,EACX,OAAA,EAAS,YAAA;AAAA,EACT,OAAA,EAAS,YAAA;AAAA,EACT,MAAA,EAAQ,WAAA;AAAA,EACR,IAAA,EAAM;AACR;AAeO,IAAM,iBAAA,GAAgD;AAAA,EAC3D,OAAA,EAAS,YAAA;AAAA,EACT,OAAA,EAAS,YAAA;AAAA,EACT,SAAA,EAAW,cAAA;AAAA,EACX,OAAA,EAAS,YAAA;AAAA,EACT,OAAA,EAAS,YAAA;AAAA,EACT,MAAA,EAAQ,WAAA;AAAA,EACR,IAAA,EAAM;AACR;AAIO,IAAM,iBAAA,GAAgD;AAAA,EAC3D,OAAA,EAAS,yBAAA;AAAA,EACT,OAAA,EAAS,yBAAA;AAAA,EACT,SAAA,EAAW,2BAAA;AAAA,EACX,OAAA,EAAS,yBAAA;AAAA,EACT,OAAA,EAAS,yBAAA;AAAA,EACT,MAAA,EAAQ,wBAAA;AAAA,EACR,IAAA,EAAM;AACR;AAGO,IAAM,eAAA,GAA8C;AAAA,EACzD,OAAA,EAAS,oCAAA;AAAA,EACT,OAAA,EAAS,oCAAA;AAAA,EACT,SAAA,EAAW,wCAAA;AAAA,EACX,OAAA,EAAS,oCAAA;AAAA,EACT,OAAA,EAAS,oCAAA;AAAA,EACT,MAAA,EAAQ,kCAAA;AAAA,EACR,IAAA,EAAM;AACR;AAEO,IAAM,cAAA,GAA6C;AAAA,EACxD,OAAA,EAAS,iBAAA;AAAA,EACT,OAAA,EAAS,mBAAA;AAAA,EACT,SAAA,EAAW,qBAAA;AAAA,EACX,OAAA,EAAS,mBAAA;AAAA,EACT,OAAA,EAAS,mBAAA;AAAA,EACT,MAAA,EAAQ,kBAAA;AAAA,EACR,IAAA,EAAM;AACR;AAEO,IAAM,gBAAA,GAA+C;AAAA,EAC1D,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,gBAAA;AAAA,EACT,SAAA,EAAW,kBAAA;AAAA,EACX,OAAA,EAAS,gBAAA;AAAA,EACT,OAAA,EAAS,gBAAA;AAAA,EACT,MAAA,EAAQ,eAAA;AAAA,EACR,IAAA,EAAM;AACR;AAOO,IAAM,cAAA,GAA6C;AAAA,EACxD,OAAA,EAAS,oDAAA;AAAA,EACT,OAAA,EAAS,oDAAA;AAAA,EACT,SAAA,EAAW,wDAAA;AAAA,EACX,OAAA,EAAS,oDAAA;AAAA,EACT,OAAA,EAAS,oDAAA;AAAA,EACT,MAAA,EAAQ,kDAAA;AAAA,EACR,IAAA,EAAM;AACR;AAWO,IAAM,mBAAA,GAAkD;AAAA,EAC7D,OAAA,EAAS,iEAAA;AAAA,EACT,OAAA,EAAS,iEAAA;AAAA,EACT,SAAA,EAAW,mEAAA;AAAA,EACX,OAAA,EAAS,iEAAA;AAAA,EACT,OAAA,EAAS,iEAAA;AAAA,EACT,MAAA,EAAQ,gEAAA;AAAA,EACR,IAAA,EAAM;AACR;AAaO,IAAM,yBAAA,GAAwD;AAAA,EACnE,OAAA,EAAS,kDAAA;AAAA,EACT,OAAA,EAAS,kDAAA;AAAA,EACT,SAAA,EAAW,oDAAA;AAAA,EACX,OAAA,EAAS,kDAAA;AAAA,EACT,OAAA,EAAS,kDAAA;AAAA,EACT,MAAA,EAAQ,iDAAA;AAAA,EACR,IAAA,EAAM;AACR;AAIO,IAAM,gBAAA,GAA+C;AAAA,EAC1D,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,SAAA,EAAW,gBAAA;AAAA,EACX,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS,cAAA;AAAA,EACT,MAAA,EAAQ,aAAA;AAAA,EACR,IAAA,EAAM;AACR;;;AC9NO,IAAM,iBAAA,GAAkD;AAAA,EAC7D,IAAA,EAAM,kBAAA;AAAA,EACN,EAAA,EAAI,gBAAA;AAAA,EACJ,EAAA,EAAI,gBAAA;AAAA,EACJ,EAAA,EAAI,gBAAA;AAAA,EACJ,IAAA,EAAM;AACR;AAKO,IAAM,mBAAA,GAAoC;AAU1C,IAAM,iBAAiB,CAC5B,IAAA,EACA,UACA,aAAA,GAA8B,mBAAA,KACb,QAAQ,QAAA,IAAY;AAWhC,IAAM,uBAAuB,CAAC,OAAA,KACnC,kBAAkB,OAAA,KAAY,MAAA,GAAS,OAAO,OAAO;;;AC9BhD,IAAM,qBAAA,GAAmD;AAAA,EAC9D,EAAA,EAAI,qBAAA;AAAA,EACJ,EAAA,EAAI,uBAAA;AAAA,EACJ,EAAA,EAAI,mBAAA;AAAA,EACJ,EAAA,EAAI,uBAAA;AAAA,EACJ,EAAA,EAAI;AACN;AAgBO,IAAM,uBAAA,GAAqD;AAAA,EAChE,EAAA,EAAI,iBAAA;AAAA,EACJ,EAAA,EAAI,iBAAA;AAAA,EACJ,EAAA,EAAI,iBAAA;AAAA,EACJ,EAAA,EAAI,iBAAA;AAAA,EACJ,EAAA,EAAI;AACN;AAeO,IAAM,uBAAA,GAA+D;AAAA,EAC1E,EAAA,EAAI,EAAE,GAAA,EAAK,QAAA,EAAU,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,SAAA,EAAU;AAAA,EACvF,EAAA,EAAI,EAAE,GAAA,EAAK,UAAA,EAAY,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,OAAA,EAAQ;AAAA,EACzF,EAAA,EAAI,EAAE,GAAA,EAAK,QAAA,EAAU,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,OAAA,EAAQ;AAAA,EACnF,EAAA,EAAI,EAAE,GAAA,EAAK,QAAA,EAAU,GAAA,EAAK,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,IAAA,EAAM,WAAA,EAAa,GAAA,EAAK,SAAA,EAAU;AAAA,EAC3F,EAAA,EAAI,EAAE,GAAA,EAAK,QAAA,EAAU,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,SAAA,EAAW,GAAA,EAAK,OAAA;AAC7E;AAOO,IAAM,kBAAA,GAAgD;AAAA,EAC3D,EAAA,EAAI,qBAAA;AAAA,EACJ,EAAA,EAAI,mBAAA;AAAA,EACJ,EAAA,EAAI,mBAAA;AAAA,EACJ,EAAA,EAAI,qBAAA;AAAA,EACJ,EAAA,EAAI;AACN;;;AC/DO,IAAM,mBAAA,GAAsB;AAAA,EACjC,aAAA,EAAe,EAAA;AAAA,EACf,WAAA,EAAa,GAAA;AAAA,EACb,SAAA,EAAW,IAAA;AAAA,EACX,UAAA,EAAY,IAAA;AAAA,EACZ,cAAA,EAAgB,GAAA;AAAA,EAChB,UAAA,EAAY,IAAA;AAAA,EACZ,WAAA,EAAa,GAAA;AAAA,EACb,YAAA,EAAc,GAAA;AAAA,EACd,WAAA,EAAa,GAAA;AAAA,EACb,YAAA,EAAc,IAAA;AAAA,EACd,eAAA,EAAiB,GAAA;AAAA,EACjB,gBAAA,EAAkB,IAAA;AAAA,EAClB,cAAA,EAAgB,CAAA;AAAA,EAChB,YAAA,EAAc,GAAA;AAAA,EACd,eAAA,EAAiB,IAAA;AAAA,EACjB,YAAA,EAAc,GAAA;AAAA,EACd,iBAAA,EAAmB,IAAA;AAAA,EACnB,kBAAA,EAAoB;AACtB;AAUO,IAAM,yBAAA,GAA4B;AAAA,EACvC,kBAAA,EAAoB,IAAA;AAAA,EACpB,aAAA,EAAe,GAAA;AAAA,EACf,eAAA,EAAiB;AACnB;;;ACnCO,IAAM,mBAAA,GAAsB,CACjC,QAAA,EACA,IAAA,EACA,MAAA,KACW;AACX,EAAA,MAAM,CAAC,SAAA,EAAW,GAAG,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AACvC,EAAA,MAAM,KAAA,GAAQ,SAAS,SAAS,CAAA;AAChC,EAAA,MAAM,QAAA,GAAW,QAAQ,GAAG,CAAA;AAE5B,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAGhC,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA,EAAc;AACzC,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,iCAAiC,IAAI,CAAA,wDAAA;AAAA,OACvC;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,QAAQ,OAAO,QAAA;AACpB,EAAA,OAAO,QAAA,CAAS,OAAA;AAAA,IAAQ,YAAA;AAAA,IAAc,CAAC,GAAA,EAAK,IAAA,KAC1C,MAAA,CAAO,IAAI,CAAA,KAAM,MAAA,GAAY,GAAA,GAAM,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC;AAAA,GACxD;AACF;;;ACjCA,IAAA,aAAA,GAAA;AAAA,EACE,IAAA,EAAQ,MAAA;AAAA,EACR,IAAA,EAAQ,OAAA;AAAA,EACR,QAAA,EAAY;AAAA,IACV,KAAA,EAAS;AAAA,MACP,KAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAAW,IAAA;AAAA,MACX,MAAA,EAAU;AAAA,KACZ;AAAA,IACA,YAAA,EAAgB;AAAA,MACd,KAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAAW,MAAA;AAAA,MACX,QAAA,EAAY;AAAA,KACd;AAAA,IACA,MAAA,EAAU;AAAA,MACR,WAAA,EAAe;AAAA,KACjB;AAAA,IACA,WAAA,EAAe;AAAA,MACb,KAAA,EAAS;AAAA,KACX;AAAA,IACA,MAAA,EAAU;AAAA,MACR,KAAA,EAAS,IAAA;AAAA,MACT,KAAA,EAAS;AAAA,KACX;AAAA,IACA,QAAA,EAAY;AAAA,MACV,KAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAQ,KAAA;AAAA,MACR,GAAA,EAAO,MAAA;AAAA,MACP,IAAA,EAAQ;AAAA,KACV;AAAA,IACA,IAAA,EAAQ;AAAA,MACN,WAAA,EAAe,OAAA;AAAA,MACf,GAAA,EAAO,GAAA;AAAA,MACP,YAAA,EAAgB,SAAA;AAAA,MAChB,KAAA,EAAS,IAAA;AAAA,MACT,SAAA,EAAa,IAAA;AAAA,MACb,aAAA,EAAiB,SAAA;AAAA,MACjB,MAAA,EAAU,KAAA;AAAA,MACV,cAAA,EAAkB,OAAA;AAAA,MAClB,KAAA,EAAS,IAAA;AAAA,MACT,KAAA,EAAS,aAAA;AAAA,MACT,KAAA,EAAS,IAAA;AAAA,MACT,KAAA,EAAS,KAAA;AAAA,MACT,QAAA,EAAY,IAAA;AAAA,MACZ,KAAA,EAAS,OAAA;AAAA,MACT,OAAA,EAAW,MAAA;AAAA,MACX,cAAA,EAAkB,MAAA;AAAA,MAClB,oBAAA,EAAwB,mBAAA;AAAA,MACxB,WAAA,EAAe,eAAA;AAAA,MACf,SAAA,EAAa,QAAA;AAAA,MACb,MAAA,EAAU,KAAA;AAAA,MACV,KAAA,EAAS,KAAA;AAAA,MACT,SAAA,EAAa,cAAA;AAAA,MACb,QAAA,EAAY,YAAA;AAAA,MACZ,SAAA,EAAa,IAAA;AAAA,MACb,aAAA,EAAiB,mBAAA;AAAA,MACjB,IAAA,EAAQ,IAAA;AAAA,MACR,OAAA,EAAW;AAAA,KACb;AAAA,IACA,YAAA,EAAgB;AAAA,MACd,WAAA,EAAe,MAAA;AAAA,MACf,IAAA,EAAQ,IAAA;AAAA,MACR,IAAA,EAAQ,IAAA;AAAA,MACR,MAAA,EAAU,MAAA;AAAA,MACV,gBAAA,EAAoB,MAAA;AAAA,MACpB,eAAA,EAAmB,WAAA;AAAA,MACnB,OAAA,EAAW,WAAA;AAAA,MACX,SAAA,EAAa,WAAA;AAAA,MACb,OAAA,EAAW,MAAA;AAAA,MACX,WAAA,EAAe,MAAA;AAAA,MACf,UAAA,EAAc,MAAA;AAAA,MACd,SAAA,EAAa,gBAAA;AAAA,MACb,SAAA,EAAa,cAAA;AAAA,MACb,QAAA,EAAY;AAAA,KACd;AAAA,IACA,QAAA,EAAY;AAAA,MACV,KAAA,EAAS,MAAA;AAAA,MACT,KAAA,EAAS,IAAA;AAAA,MACT,KAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAQ,IAAA;AAAA,MACR,MAAA,EAAU,KAAA;AAAA,MACV,IAAA,EAAQ,IAAA;AAAA,MACR,GAAA,EAAO,IAAA;AAAA,MACP,KAAA,EAAS,MAAA;AAAA,MACT,MAAA,EAAU,IAAA;AAAA,MACV,MAAA,EAAU,IAAA;AAAA,MACV,KAAA,EAAS,MAAA;AAAA,MACT,aAAA,EAAiB,MAAA;AAAA,MACjB,cAAA,EAAkB;AAAA,KACpB;AAAA,IACA,UAAA,EAAc;AAAA,MACZ,KAAA,EAAS,MAAA;AAAA,MACT,OAAA,EAAW,eAAA;AAAA,MACX,KAAA,EAAS;AAAA,KACX;AAAA,IACA,WAAA,EAAe;AAAA,MACb,KAAA,EAAS,MAAA;AAAA,MACT,WAAA,EAAe,gCAAA;AAAA,MACf,MAAA,EAAU,IAAA;AAAA,MACV,MAAA,EAAU,IAAA;AAAA,MACV,KAAA,EAAS,IAAA;AAAA,MACT,MAAA,EAAU;AAAA,KACZ;AAAA,IACA,WAAA,EAAe;AAAA,MACb,YAAA,EAAgB,eAAA;AAAA,MAChB,kBAAA,EAAsB,wBAAA;AAAA,MACtB,YAAA,EAAgB,qBAAA;AAAA,MAChB,YAAA,EAAgB,eAAA;AAAA,MAChB,UAAA,EAAc,eAAA;AAAA,MACd,aAAA,EAAiB,wBAAA;AAAA,MACjB,YAAA,EAAgB,wBAAA;AAAA,MAChB,YAAA,EAAgB,gBAAA;AAAA,MAChB,aAAA,EAAiB,qBAAA;AAAA,MACjB,kBAAA,EAAsB,iBAAA;AAAA,MACtB,YAAA,EAAgB;AAAA,KAClB;AAAA,IACA,UAAA,EAAc;AAAA,MACZ,OAAA,EAAW,KAAA;AAAA,MACX,IAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAQ,IAAA;AAAA,MACR,MAAA,EAAU;AAAA,KACZ;AAAA,IACA,UAAA,EAAc;AAAA,MACZ,MAAA,EAAU,OAAA;AAAA,MACV,GAAA,EAAO,cAAA;AAAA,MACP,OAAA,EAAW,eAAA;AAAA,MACX,IAAA,EAAQ;AAAA,KACV;AAAA,IACA,IAAA,EAAQ;AAAA,MACN,MAAA,EAAU;AAAA,KACZ;AAAA,IACA,cAAA,EAAkB;AAAA,MAChB,WAAA,EAAe,KAAA;AAAA,MACf,KAAA,EAAS,SAAA;AAAA,MACT,QAAA,EAAY,KAAA;AAAA,MACZ,OAAA,EAAW,MAAA;AAAA,MACX,KAAA,EAAS,IAAA;AAAA,MACT,UAAA,EAAc,IAAA;AAAA,MACd,QAAA,EAAY,IAAA;AAAA,MACZ,SAAA,EAAa,IAAA;AAAA,MACb,WAAA,EAAe;AAAA,KACjB;AAAA,IACA,IAAA,EAAQ;AAAA,MACN,MAAA,EAAU,KAAA;AAAA,MACV,OAAA,EAAW,aAAA;AAAA,MACX,OAAA,EAAW;AAAA,KACb;AAAA,IACA,UAAA,EAAc;AAAA,MACZ,cAAA,EAAkB,OAAA;AAAA,MAClB,gBAAA,EAAoB,OAAA;AAAA,MACpB,eAAA,EAAmB,OAAA;AAAA,MACnB,KAAA,EAAS,IAAA;AAAA,MACT,KAAA,EAAS,IAAA;AAAA,MACT,KAAA,EAAS,IAAA;AAAA,MACT,QAAA,EAAY,KAAA;AAAA,MACZ,QAAA,EAAY,KAAA;AAAA,MACZ,QAAA,EAAY,UAAA;AAAA,MACZ,QAAA,EAAY,UAAA;AAAA,MACZ,OAAA,EAAW,iBAAA;AAAA,MACX,SAAA,EAAa,GAAA;AAAA,MACb,QAAA,EAAY,GAAA;AAAA,MACZ,UAAA,EAAc,KAAA;AAAA,MACd,SAAA,EAAa;AAAA,KACf;AAAA,IACA,MAAA,EAAU;AAAA,MACR,KAAA,EAAS;AAAA,KACX;AAAA,IACA,SAAA,EAAa;AAAA,MACX,OAAA,EAAW,MAAA;AAAA,MACX,QAAA,EAAY;AAAA,KACd;AAAA,IACA,UAAA,EAAc;AAAA,MACZ,QAAA,EAAY;AAAA,KACd;AAAA,IACA,KAAA,EAAS;AAAA,MACP,KAAA,EAAS,IAAA;AAAA,MACT,MAAA,EAAU,MAAA;AAAA,MACV,IAAA,EAAQ;AAAA,KACV;AAAA,IACA,GAAA,EAAO;AAAA,MACL,OAAA,EAAW,MAAA;AAAA,MACX,GAAA,EAAO,KAAA;AAAA,MACP,MAAA,EAAU,QAAA;AAAA,MACV,KAAA,EAAS,OAAA;AAAA,MACT,OAAA,EAAW,SAAA;AAAA,MACX,IAAA,EAAQ,WAAA;AAAA,MACR,KAAA,EAAS,IAAA;AAAA,MACT,MAAA,EAAU,KAAA;AAAA,MACV,SAAA,EAAa,IAAA;AAAA,MACb,MAAA,EAAU,IAAA;AAAA,MACV,GAAA,EAAO,KAAA;AAAA,MACP,KAAA,EAAS,IAAA;AAAA,MACT,EAAA,EAAM,KAAA;AAAA,MACN,IAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAQ,KAAA;AAAA,MACR,KAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAU,MAAA;AAAA,MACV,QAAA,EAAY,MAAA;AAAA,MACZ,IAAA,EAAQ,MAAA;AAAA,MACR,GAAA,EAAO,KAAA;AAAA,MACP,IAAA,EAAQ,IAAA;AAAA,MACR,IAAA,EAAQ;AAAA,KACV;AAAA,IACA,QAAA,EAAY;AAAA,MACV,KAAA,EAAS,OAAA;AAAA,MACT,KAAA,EAAS,IAAA;AAAA,MACT,IAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAQ,gBAAA;AAAA,MACR,MAAA,EAAU,IAAA;AAAA,MACV,OAAA,EAAW,IAAA;AAAA,MACX,UAAA,EAAc,UAAA;AAAA,MACd,WAAA,EAAe,UAAA;AAAA,MACf,KAAA,EAAS,YAAA;AAAA,MACT,QAAA,EAAY;AAAA,KACd;AAAA,IACA,eAAA,EAAmB;AAAA,MACjB,IAAA,EAAQ;AAAA,KACV;AAAA,IACA,OAAA,EAAW;AAAA,MACT,WAAA,EAAe;AAAA,KACjB;AAAA,IACA,IAAA,EAAQ;AAAA,MACN,KAAA,EAAS;AAAA,KACX;AAAA,IACA,OAAA,EAAW;AAAA,MACT,KAAA,EAAS;AAAA,KACX;AAAA,IACA,KAAA,EAAS;AAAA,MACP,KAAA,EAAS;AAAA,KACX;AAAA,IACA,IAAA,EAAQ;AAAA,MACN,WAAA,EAAe;AAAA,KACjB;AAAA,IACA,WAAA,EAAe;AAAA,MACb,SAAA,EAAa,IAAA;AAAA,MACb,SAAA,EAAa;AAAA,KACf;AAAA,IACA,UAAA,EAAc;AAAA,MACZ,GAAA,EAAO,MAAA;AAAA,MACP,IAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAQ,KAAA;AAAA,MACR,IAAA,EAAQ,YAAA;AAAA,MACR,UAAA,EAAc,OAAA;AAAA,MACd,SAAA,EAAa,SAAA;AAAA,MACb,SAAA,EAAa,OAAA;AAAA,MACb,IAAA,EAAQ;AAAA,KACV;AAAA,IACA,QAAA,EAAY;AAAA,MACV,KAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAS;AAAA,KACX;AAAA,IACA,QAAA,EAAY;AAAA,MACV,KAAA,EAAS;AAAA,KACX;AAAA,IACA,MAAA,EAAU;AAAA,MACR,iBAAA,EAAqB,KAAA;AAAA,MACrB,QAAA,EAAY,MAAA;AAAA,MACZ,OAAA,EAAW,MAAA;AAAA,MACX,KAAA,EAAS,IAAA;AAAA,MACT,YAAA,EAAgB;AAAA,KAClB;AAAA,IACA,SAAA,EAAa;AAAA,MACX,MAAA,EAAU;AAAA,KACZ;AAAA,IACA,OAAA,EAAW;AAAA,MACT,QAAA,EAAY,MAAA;AAAA,MACZ,MAAA,EAAU;AAAA,KACZ;AAAA,IACA,KAAA,EAAS;AAAA,MACP,SAAA,EAAa,aAAA;AAAA,MACb,OAAA,EAAW,cAAA;AAAA,MACX,OAAA,EAAW,aAAA;AAAA,MACX,KAAA,EAAS;AAAA,KACX;AAAA,IACA,QAAA,EAAY;AAAA,MACV,GAAA,EAAO,UAAA;AAAA,MACP,SAAA,EAAa;AAAA,KACf;AAAA,IACA,aAAA,EAAiB;AAAA,MACf,IAAA,EAAQ,IAAA;AAAA,MACR,GAAA,EAAO,IAAA;AAAA,MACP,KAAA,EAAS,IAAA;AAAA,MACT,SAAA,EAAa,IAAA;AAAA,MACb,KAAA,EAAS,IAAA;AAAA,MACT,MAAA,EAAU,IAAA;AAAA,MACV,SAAA,EAAa;AAAA,KACf;AAAA,IACA,MAAA,EAAU;AAAA,MACR,QAAA,EAAY,MAAA;AAAA,MACZ,SAAA,EAAa,MAAA;AAAA,MACb,MAAA,EAAU,IAAA;AAAA,MACV,OAAA,EAAW;AAAA;AACb;AAEJ,CAAA;;;AC7RO,IAAM,iBAAA,GAAuC;;;ACoCpD,IAAM,OAAA,GAAkC;AAAA,EACtC,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,SAAA;AAAA,EACN,OAAA,EAAS,SAAA;AAAA,EACT,GAAA,EAAK,KAAA;AAAA,EACL,MAAA,EAAQ,KAAA;AAAA,EACR,GAAA,EAAK,KAAA;AAAA,EACL,KAAA,EAAO,OAAA;AAAA,EACP,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,MAAA;AAAA,EACL,OAAA,EAAS,MAAA;AAAA,EACT,KAAA,EAAO,MAAA;AAAA,EACP,GAAA,EAAK,MAAA;AAAA,EACL,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ,OAAA;AAAA,EACR,GAAA,EAAK,QAAA;AAAA,EACL,MAAA,EAAQ,QAAA;AAAA,EACR,SAAA,EAAW,WAAA;AAAA,EACX,GAAA,EAAK,QAAA;AAAA,EACL,MAAA,EAAQ,QAAA;AAAA,EACR,GAAA,EAAK,KAAA;AAAA,EACL,KAAA,EAAO,OAAA;AAAA,EACP,QAAA,EAAU,OAAA;AAAA,EACV,EAAA,EAAI,SAAA;AAAA,EACJ,OAAA,EAAS,SAAA;AAAA,EACT,IAAA,EAAM,WAAA;AAAA,EACN,SAAA,EAAW,WAAA;AAAA,EACX,IAAA,EAAM,WAAA;AAAA,EACN,SAAA,EAAW,WAAA;AAAA,EACX,KAAA,EAAO,YAAA;AAAA,EACP,UAAA,EAAY,YAAA;AAAA,EACZ,MAAA,EAAQ,QAAA;AAAA,EACR,IAAA,EAAM,QAAA;AAAA,EACN,QAAA,EAAU,UAAA;AAAA,EACV,IAAA,EAAM,UAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM;AACR,CAAA;AAMA,IAAM,cAAA,GAAwD;AAAA,EAC5D,KAAA,EAAO,CAAC,SAAA,EAAW,KAAA,EAAO,SAAS,MAAM,CAAA;AAAA,EACzC,KAAA,EAAO,CAAC,SAAA,EAAW,MAAA,EAAQ,OAAO,OAAO;AAC3C,CAAA;AAIA,IAAM,KAAA,GAAoC;AAAA,EACxC,OAAA,EAAS,EAAE,KAAA,EAAO,GAAA,EAAK,OAAO,MAAA,EAAQ,MAAA,EAAQ,MAAM,SAAA,EAAU;AAAA,EAC9D,GAAA,EAAK,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,CAAC,CAAA,KAAO,CAAA,KAAM,OAAA,GAAU,QAAA,GAAW,KAAA,EAAO;AAAA,EACnF,KAAA,EAAO,EAAE,KAAA,EAAO,GAAA,EAAK,OAAO,OAAA,EAAS,MAAA,EAAQ,MAAM,OAAA,EAAQ;AAAA,EAC3D,IAAA,EAAM,EAAE,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,CAAC,CAAA,KAAO,CAAA,KAAM,OAAA,GAAU,SAAA,GAAY,MAAA,EAAQ;AAAA,EACtF,KAAA,EAAO,EAAE,KAAA,EAAO,GAAA,EAAK,OAAO,OAAA,EAAS,MAAA,EAAQ,MAAM,OAAA,EAAQ;AAAA,EAC3D,MAAA,EAAQ,EAAE,KAAA,EAAO,KAAA,EAAO,OAAO,KAAA,EAAO,MAAA,EAAQ,MAAM,QAAA,EAAS;AAAA,EAC7D,SAAA,EAAW,EAAE,KAAA,EAAO,GAAA,EAAK,OAAO,WAAA,EAAa,MAAA,EAAQ,MAAM,WAAA,EAAY;AAAA,EACvE,MAAA,EAAQ,EAAE,KAAA,EAAO,GAAA,EAAK,OAAO,KAAA,EAAO,MAAA,EAAQ,MAAM,QAAA,EAAS;AAAA,EAC3D,GAAA,EAAK,EAAE,KAAA,EAAO,GAAA,EAAK,OAAO,KAAA,EAAO,MAAA,EAAQ,MAAM,KAAA,EAAM;AAAA,EACrD,KAAA,EAAO,EAAE,KAAA,EAAO,OAAA,EAAS,OAAO,OAAA,EAAS,MAAA,EAAQ,MAAM,OAAA,EAAQ;AAAA,EAC/D,OAAA,EAAS,EAAE,KAAA,EAAO,GAAA,EAAK,OAAO,GAAA,EAAK,MAAA,EAAQ,MAAM,IAAA,EAAK;AAAA,EACtD,SAAA,EAAW,EAAE,KAAA,EAAO,GAAA,EAAK,OAAO,GAAA,EAAK,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,EAC1D,SAAA,EAAW,EAAE,KAAA,EAAO,GAAA,EAAK,OAAO,GAAA,EAAK,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,EAC1D,UAAA,EAAY,EAAE,KAAA,EAAO,GAAA,EAAK,OAAO,GAAA,EAAK,MAAA,EAAQ,MAAM,OAAA,EAAQ;AAAA,EAC5D,MAAA,EAAQ,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAO,MAAA,EAAQ,MAAA,EAAQ,MAAM,QAAA,EAAS;AAAA,EAC/D,QAAA,EAAU,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAO,MAAA,EAAQ,MAAA,EAAQ,MAAM,UAAA,EAAW;AAAA,EACnE,IAAA,EAAM,EAAE,KAAA,EAAO,MAAA,EAAQ,OAAO,MAAA,EAAQ,MAAA,EAAQ,MAAM,MAAA,EAAO;AAAA,EAC3D,GAAA,EAAK,EAAE,KAAA,EAAO,KAAA,EAAO,OAAO,KAAA,EAAO,MAAA,EAAQ,MAAM,KAAA,EAAM;AAAA,EACvD,GAAA,EAAK,EAAE,KAAA,EAAO,GAAA,EAAK,OAAO,GAAA,EAAK,MAAA,EAAQ,MAAM,MAAA;AAC/C,CAAA;AAEA,IAAM,YAAA,GAAe,CAAC,KAAA,KAA0B;AAC9C,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,WAAA,EAAa,CAAA;AACzC,EAAA,IAAI,OAAO,OAAO,KAAA;AAClB,EAAA,IAAI,cAAc,IAAA,CAAK,KAAK,CAAA,EAAG,OAAO,MAAM,WAAA,EAAY;AACxD,EAAA,OAAO,KAAA,CAAM,MAAA,KAAW,CAAA,GAAI,KAAA,CAAM,aAAY,GAAI,KAAA;AACpD,CAAA;AAIA,IAAM,UAAA,GAAa,CAAC,KAAA,KAA4B;AAC9C,EAAA,IAAI,KAAA,KAAU,GAAA,EAAK,OAAO,CAAC,GAAG,CAAA;AAC9B,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA;AACnC,EAAA,MAAM,OAAO,OAAA,GAAU,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAC5C,EAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AAC3C,EAAA,OAAO,OAAA,GAAU,CAAC,GAAG,IAAA,EAAM,GAAG,CAAA,GAAI,IAAA;AACpC,CAAA;AAIO,IAAM,gBAAA,GAAmB,CAAC,IAAA,KAC/B,IAAA,CACG,IAAA,EAAK,CACL,KAAA,CAAM,KAAK,CAAA,CACX,MAAA,CAAO,OAAO,CAAA,CACd,GAAA,CAAI,CAAC,KAAA,KAAU,UAAA,CAAW,KAAK,CAAA,CAAE,GAAA,CAAI,YAAY,CAAC,CAAA,CAClD,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,MAAA,GAAS,CAAC;AAKhC,IAAM,kBAAA,GAAqB,CAChC,IAAA,EACA,QAAA,KACuB;AACvB,EAAA,MAAM,KAAA,GAAQ,eAAe,QAAQ,CAAA;AACrC,EAAA,OAAO,gBAAA,CAAiB,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,KAAA,KAAU;AAC3C,IAAA,MAAM,WAAW,KAAA,CAAM,GAAA;AAAA,MAAI,CAAC,GAAA,KAC1B,GAAA,KAAQ,QAAS,QAAA,KAAa,OAAA,GAAU,SAAS,SAAA,GAAa;AAAA,KAChE;AACA,IAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,CAAC,MAAM,QAAA,CAAS,QAAA,CAAS,CAAC,CAAC,CAAA;AAC1D,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAC,KAAA,CAAM,QAAA,CAAS,CAAC,CAAA,IAAK,QAAA,CAAS,OAAA,CAAQ,CAAC,MAAM,CAAC,CAAA;AACtF,IAAA,OAAO,CAAC,GAAG,SAAA,EAAW,GAAG,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,GAAA,KAAQ;AAC1C,MAAA,MAAM,KAAA,GAAQ,MAAM,GAAG,CAAA;AACvB,MAAA,OAAO,QACH,EAAE,GAAA,EAAK,OAAO,KAAA,CAAM,QAAQ,GAAG,MAAA,EAAQ,KAAA,CAAM,MAAA,CAAO,QAAQ,GAAE,GAC9D,EAAE,KAAK,KAAA,EAAO,GAAA,EAAK,QAAQ,IAAA,EAAK;AAAA,IACtC,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAKO,IAAM,iBAAA,GAAoB,CAAC,IAAA,EAAc,QAAA,KAC9C,kBAAA,CAAmB,IAAA,EAAM,QAAQ,CAAA,CAC9B,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAK,CAAA,CAAE,IAAA,CAAK,QAAA,KAAa,OAAA,GAAU,EAAA,GAAK,GAAG,CAAC,CAAA,CAC9E,IAAA,CAAK,GAAG;AAIN,IAAM,gBAAA,GAAmB,CAC9B,QAAA,EACA,IAAA,EACA,IAAA,KAEA,QAAA,CACG,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAO,CAAA,CAAE,MAAA,GAAS,IAAA,CAAK,CAAA,CAAE,MAAM,CAAA,GAAI,CAAA,CAAE,KAAM,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAChF,IAAA,CAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAG;;;ACpLd,IAAM,0BAAA,GAA6B,CACxC,OAAA,KACQ;AACR,EAAA,MAAM,MAAW,EAAC;AAClB,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,IAAA,GAAO,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA;AAC/B,IAAA,IAAI,MAAM,IAAA,KAAS,WAAA,KAAgB,CAAC,IAAA,IAAQ,IAAA,CAAK,SAAS,WAAA,CAAA,EAAc;AACxE,IAAA,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,EAChB;AACA,EAAA,OAAO,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,CAAG,IAAA,KAAS,WAAA,EAAa,GAAA,CAAI,GAAA,EAAI;AACxE,EAAA,OAAO,GAAA;AACT;;;ACAO,IAAM,mBAAA,GAAsB,CACjC,GAAA,EACA,EAAE,GAAA,EAAK,GAAA,EAAK,UAAA,GAAa,EAAC,EAAG,aAAA,GAAgB,CAAA,EAAG,IAAA,EAAK,KAC1C;AACX,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,GAAG,CAAA;AAC5B,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,GAAG,CAAA;AAC5B,EAAA,MAAM,OAAA,GAAU,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,GAAA,EAAK,EAAE,GAAG,EAAE,CAAA;AAC9C,EAAA,IAAI,IAAA,GAAO,OAAA;AACX,EAAA,IAAI,YAAA,GAAe,QAAA;AACnB,EAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,IAAA,IAAI,KAAA,GAAQ,EAAA,IAAM,KAAA,GAAQ,EAAA,EAAI;AAC9B,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,OAAO,CAAA;AACzC,IAAA,IAAI,QAAA,IAAY,aAAA,IAAiB,QAAA,GAAW,YAAA,EAAc;AACxD,MAAA,IAAA,GAAO,KAAA;AACP,MAAA,YAAA,GAAe,QAAA;AAAA,IACjB;AAAA,EACF;AACA,EAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,CAAK,IAAA,CAAK,IAAA,GAAO,IAAI,CAAA,KAAM,IAAA,CAAK,IAAA,CAAK,OAAA,GAAU,IAAI,CAAA,EAAG,IAAA,GAAO,OAAA;AACvF,EAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AACxB;;;ACpCO,IAAM,SAAA,GAAY,CAAC,UAAA,EAAoB,UAAA,KAC5C,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO,IAAK,UAAA,GAAa,UAAA,GAAa,CAAA,CAAA,GAAK,UAAU;;;ACAhE,IAAM,eAAA,GAAkB,CAAC,IAAA,KAAyB;AACvD,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,mBAAmB,IAAI,CAAA;AACvC,IAAA,OAAO,OAAA,KAAY,OAAO,OAAA,GAAU,IAAA;AAAA,EACtC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;ACMO,IAAM,mBAAA,GACX;;;ACNF,IAAM,IAAA,GAAO,CAAC,KAAA,KAA0B;AACtC,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,CAAA,GAAK,IAAA,CAAK,KAAK,CAAA,EAAG,EAAE,IAAI,KAAA,CAAM,UAAA,CAAW,CAAC,CAAA,KAAO,CAAA;AAAA,EACnD;AACA,EAAA,OAAO,CAAA;AACT,CAAA;AAeO,IAAM,qBAAqB,CAAC,IAAA,GAAO,EAAA,EAAI,IAAA,GAA0B,EAAC,KACvE,IAAA,CAAK,MAAA,GAAS,CAAA,GAAK,KAAK,IAAA,CAAK,IAAI,IAAI,IAAA,CAAK,MAAM,KAAK,mBAAA,GAAuB;AAQvE,IAAM,gBAAA,GAAmB,CAAC,EAAA,GAAK,EAAA,KAAe,mBAAmB,EAAE;;;ACrCnE,IAAM,mBAAA,GAAsB;AAE5B,IAAM,oBAAA,GAAuB;AAE7B,IAAM,wBAAA,GAA2B;AAEjC,IAAM,uBAAA,GAA0B;;;ACFvC,IAAM,WAAA,uBAAuC,GAAA,CAAuB;AAAA,EAClE,MAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAC,CAAA;AAGD,IAAM,6BAAkC,IAAI,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAK,CAAC,CAAA;AAI/D,IAAM,6BAAkC,IAAI,GAAA,CAAI,CAAC,WAAA,EAAa,SAAA,EAAW,KAAK,CAAC,CAAA;AAGxE,IAAM,2BAAA,uBAAuD,GAAA,CAAI;AAAA,EACtE,KAAA;AAAA,EACA;AACF,CAAC;AAKD,IAAM,aAAA,GAA8C;AAAA,EAClD,YAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA;AACA,IAAM,IAAA,GAAO,CAAC,IAAA,KAAiB,aAAA,CAAc,QAAQ,IAAyB,CAAA;AAE9E,IAAM,eAAA,GAAkB,CAAC,IAAA,KAAiB,IAAA,IAAQ,SAAU,IAAA,IAAQ,KAAA;AACpE,IAAM,cAAA,GAAiB,CAAC,IAAA,KAAiB,IAAA,IAAQ,SAAU,IAAA,IAAQ,KAAA;AAGnE,IAAM,UAAA,GAAa,CAAC,IAAA,EAAc,KAAA,KAChC,QAAQ,CAAA,IACR,KAAA,GAAQ,KAAK,MAAA,IACb,eAAA,CAAgB,KAAK,UAAA,CAAW,KAAA,GAAQ,CAAC,CAAC,CAAA,IAC1C,eAAe,IAAA,CAAK,UAAA,CAAW,KAAK,CAAC,CAAA;AAQvC,IAAM,aAAA,GAAgB,CAAC,CAAA,EAAU,CAAA,KAC/B,EAAE,KAAA,GAAQ,CAAA,CAAE,SAAS,CAAA,CAAE,GAAA,GAAM,EAAE,GAAA,IAAO,IAAA,CAAK,EAAE,MAAA,CAAO,IAAI,IAAI,IAAA,CAAK,CAAA,CAAE,OAAO,IAAI,CAAA;AAEhF,IAAM,WAAA,GAAc,CAAC,CAAA,EAAkB,MAAA,EAAgB,MAAA,KAAkC;AACvF,EAAA,MAAM,MAAqB,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,QAAQ,MAAA,EAAO;AAC1D,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,SAAA,EAAW,GAAA,CAAI,UAAU,CAAA,CAAE,OAAA;AAC1C,EAAA,IAAI,CAAA,CAAE,IAAA,KAAS,WAAA,EAAa,GAAA,CAAI,MAAM,CAAA,CAAE,GAAA;AACxC,EAAA,IAAI,EAAE,IAAA,KAAS,KAAA,IAAS,EAAE,QAAA,EAAU,GAAA,CAAI,WAAW,CAAA,CAAE,QAAA;AACrD,EAAA,OAAO,GAAA;AACT,CAAA;AAIA,IAAM,YAAA,uBAAwC,GAAA,CAAI;AAAA,EAChD,MAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,aAAA,GAAgB,CAAC,MAAA,KAA6B;AAClD,EAAA,MAAM,MAAe,EAAC;AACtB,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAmB;AACpC,EAAA,KAAA,MAAW,KAAK,CAAC,GAAG,MAAM,CAAA,CAAE,IAAA,CAAK,aAAa,CAAA,EAAG;AAC/C,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,GAAA,CAAI,CAAA,CAAE,MAAA,CAAO,IAAI,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,MAAA,CAAO,IAAI,CAAA,GAAI,MAAA;AACzE,IAAA,IAAI,IAAA,IAAQ,CAAA,CAAE,KAAA,IAAS,IAAA,CAAK,GAAA,EAAK;AAC/B,MAAA,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,EAAK,EAAE,GAAG,CAAA;AACnC,MAAA;AAAA,IACF;AACA,IAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AACV,IAAA,IAAI,YAAA,CAAa,GAAA,CAAI,CAAA,CAAE,MAAA,CAAO,IAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,MAAA,CAAO,IAAA,EAAM,CAAC,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,GAAA;AACT,CAAA;AAMA,IAAM,aAAA,GAAgB,CAAC,MAAA,EAAiB,MAAA,KAA6B;AACnE,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,GAAG,CAAC,CAAA;AACnD,EAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,KAAM;AAC3B,IAAA,MAAM,QAAQ,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,IAAI,CAAA,CAAE,KAAA,IAAS,CAAA,GAAI,CAAA,CAAE,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAC/E,IAAA,MAAM,MAAA,GAAS,CAAC,CAAA,CAAE,KAAA,EAAO,GAAG,IAAI,GAAA,CAAI,KAAK,CAAA,EAAG,CAAA,CAAE,GAAG,CAAA;AACjD,IAAA,OAAO,OAAO,KAAA,CAAM,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,MAAO,EAAE,MAAA,EAAQ,EAAE,MAAA,EAAQ,KAAA,EAAO,OAAO,CAAC,CAAA,EAAI,KAAI,CAAE,CAAA;AAAA,EACvF,CAAC,CAAA;AACH,CAAA;AA0BO,IAAM,wBAAA,GAA2B,CACtC,IAAA,EACA,QAAA,KACoB;AACpB,EAAA,IAAI,CAAC,QAAA,EAAU,MAAA,IAAU,CAAC,IAAA,SAAa,EAAC;AAExC,EAAA,IAAI,SAAkB,EAAC;AACvB,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,IAAI,CAAC,CAAA,IAAK,CAAC,YAAY,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA,EAAG;AACpC,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,CAAA,CAAE,MAAM,CAAA,IAAK,CAAC,MAAA,CAAO,SAAA,CAAU,CAAA,CAAE,MAAM,CAAA,EAAG;AAChE,IAAA,IAAI,CAAA,CAAE,MAAA,GAAS,CAAA,IAAK,CAAA,CAAE,UAAU,CAAA,EAAG;AACnC,IAAA,IAAI,CAAA,CAAE,SAAS,WAAA,KAAgB,OAAO,EAAE,GAAA,KAAQ,QAAA,IAAY,CAAC,CAAA,CAAE,GAAA,CAAA,EAAM;AACrE,IAAA,IAAI,CAAA,CAAE,SAAS,SAAA,KAAc,OAAO,EAAE,OAAA,KAAY,QAAA,IAAY,CAAC,CAAA,CAAE,OAAA,CAAA,EAAU;AAC3E,IAAA,IAAI,QAAQ,CAAA,CAAE,MAAA;AACd,IAAA,IAAI,GAAA,GAAM,KAAK,GAAA,CAAI,CAAA,CAAE,SAAS,CAAA,CAAE,MAAA,EAAQ,KAAK,MAAM,CAAA;AACnD,IAAA,IAAI,SAAS,GAAA,EAAK;AAClB,IAAA,IAAI,UAAA,CAAW,IAAA,EAAM,KAAK,CAAA,EAAG,KAAA,IAAS,CAAA;AACtC,IAAA,IAAI,UAAA,CAAW,IAAA,EAAM,GAAG,CAAA,EAAG,GAAA,IAAO,CAAA;AAElC,IAAA,IAAI,CAAA,CAAE,IAAA,KAAS,YAAA,EAAc,OAAO,GAAA,GAAM,SAAS,IAAA,CAAK,GAAA,GAAM,CAAC,CAAA,KAAM,IAAA,EAAM,GAAA,EAAA;AAC3E,IAAA,IAAI,KAAA,GAAQ,KAAK,MAAA,CAAO,IAAA,CAAK,EAAE,MAAA,EAAQ,CAAA,EAAG,KAAA,EAAO,GAAA,EAAK,CAAA;AAAA,EACxD;AAIA,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAa;AAC5B,IAAA,IAAI,YAAA,CAAa,GAAA,CAAI,CAAA,CAAE,MAAA,CAAO,IAAI,CAAA,EAAG;AACnC,MAAA,OAAO,CAAA,CAAE,QAAQ,CAAA,CAAE,GAAA,IAAO,KAAK,CAAA,CAAE,KAAK,CAAA,KAAM,IAAA,EAAM,CAAA,CAAE,KAAA,EAAA;AACpD,MAAA,OAAO,CAAA,CAAE,GAAA,GAAM,CAAA,CAAE,KAAA,IAAS,IAAA,CAAK,EAAE,GAAA,GAAM,CAAC,CAAA,KAAM,IAAA,EAAM,CAAA,CAAE,GAAA,EAAA;AAAA,IACxD;AACA,IAAA,OAAO,CAAA,CAAE,QAAQ,CAAA,CAAE,GAAA;AAAA,EACrB,CAAA;AACA,EAAA,MAAM,IAAA,GAAO,CAACC,OAAAA,KAA6B;AACzC,IAAA,MAAM,QAAQA,OAAAA,CAAO,MAAA,CAAO,OAAO,CAAA,CAAE,KAAK,aAAa,CAAA;AACvD,IAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAa;AAC5B,MAAA,IAAI,CAAA,GAAI,CAAA;AACR,MAAA,OAAO,CAAA,GAAI,MAAM,MAAA,IAAU,aAAA,CAAc,MAAM,CAAC,CAAA,EAAI,CAAC,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA;AAC7D,MAAA,KAAA,CAAM,MAAA,CAAO,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAA,IACtB,CAAA;AAEA,IAAA,MAAMC,OAAe,EAAC;AACtB,IAAA,MAAM,QAAiB,EAAC;AACxB,IAAA,OAAO,MAAM,MAAA,EAAQ;AACnB,MAAA,MAAM,CAAA,GAAI,MAAM,KAAA,EAAM;AACtB,MAAA,OAAO,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAG,GAAA,IAAO,CAAA,CAAE,KAAA,EAAO,KAAA,CAAM,GAAA,EAAI;AAC1E,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACrC,MAAA,IAAI,MAAA,IAAU,CAAA,CAAE,GAAA,GAAM,MAAA,CAAO,GAAA,EAAK;AAEhC,QAAA,MAAM,IAAA,GAAc,EAAE,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,OAAO,MAAA,CAAO,GAAA,EAAK,GAAA,EAAK,CAAA,CAAE,GAAA,EAAI;AACtE,QAAA,IAAI,OAAA,CAAQ,IAAI,CAAA,EAAG,OAAA,CAAQ,IAAI,CAAA;AAC/B,QAAA,CAAA,CAAE,MAAM,MAAA,CAAO,GAAA;AACf,QAAA,IAAI,CAAC,OAAA,CAAQ,CAAC,CAAA,EAAG;AAEjB,QAAA,IAAI,KAAA,CAAM,UAAU,aAAA,CAAc,CAAA,EAAG,MAAM,CAAC,CAAE,IAAI,CAAA,EAAG;AACnD,UAAA,OAAA,CAAQ,CAAC,CAAA;AACT,UAAA;AAAA,QACF;AAAA,MACF;AACA,MAAA,MAAM,UAAU,KAAA,CAAM,IAAA;AAAA,QACpB,CAAC,CAAA,KACC,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,OAAO,IAAI,CAAA,IAC5B,CAAA,CAAE,MAAA,CAAO,IAAA,KAAS,CAAA,CAAE,OAAO,IAAA,IAC1B,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,MAAA,CAAO,IAAI,KAAK,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,MAAA,CAAO,IAAI;AAAA,OAClE;AACA,MAAA,IAAI,OAAA,EAAS;AACb,MAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACZ,MAAAA,IAAAA,CAAI,KAAK,CAAC,CAAA;AAAA,IACZ;AACA,IAAA,OAAOA,IAAAA;AAAA,EACT,CAAA;AAIA,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,CAAO,IAAA,KAAS,YAAY,CAAC,CAAA;AACxE,EAAA,MAAM,MAAA,GAAS,aAAA,CAAc,MAAA,CAAO,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,MAAA,CAAO,IAAA,KAAS,YAAY,CAAC,CAAA;AACjF,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,CAAC,GAAG,MAAA,EAAQ,GAAG,aAAA,CAAc,MAAA,EAAQ,MAAM,CAAC,CAAC,CAAA;AAE9D,EAAA,OAAO,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,KAAM,WAAA,CAAY,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,KAAA,EAAO,CAAA,CAAE,GAAA,GAAM,CAAA,CAAE,KAAK,CAAC,CAAA;AACvE;AAiBA,IAAM,OAAA,GAAU,CAAC,IAAA,KACf,IAAA,EAAM,IAAA,KAAS,YAAY,2BAAA,CAA4B,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA;AAM7E,IAAM,gBAAA,GAAmB,CAAC,KAAA,KAAgD;AACxE,EAAA,MAAM,MAAyB,EAAC;AAChC,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,IAAA,EAAM,CAAA,KAAM;AACzB,IAAA,IAAI,IAAA,CAAK,SAAS,QAAA,EAAU;AAC1B,MAAA,GAAA,CAAI,IAAA,CAAK,EAAE,GAAG,IAAA,EAAM,UAAU,gBAAA,CAAiB,IAAA,CAAK,QAAQ,CAAA,EAAG,CAAA;AAC/D,MAAA;AAAA,IACF;AACA,IAAA,IAAI,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,IAAA;AACvB,IAAA,IAAI,OAAA,CAAQ,MAAM,CAAA,GAAI,CAAC,CAAC,CAAA,IAAK,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,EAAG;AAClD,MAAA,IAAA,GAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AACnB,MAAA,MAAA,IAAU,CAAA;AAAA,IACZ;AACA,IAAA,IAAI,OAAA,CAAQ,KAAA,CAAM,CAAA,GAAI,CAAC,CAAC,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,IAAI,CAAA,EAAG,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAG,EAAE,CAAA;AACzE,IAAA,IAAI,IAAA,MAAU,IAAA,CAAK,EAAE,MAAM,MAAA,EAAQ,IAAA,EAAM,QAAQ,CAAA;AAAA,EACnD,CAAC,CAAA;AACD,EAAA,OAAO,GAAA;AACT,CAAA;AAOO,IAAM,sBAAA,GAAyB,CACpC,IAAA,EACA,QAAA,KACsB;AACtB,EAAA,MAAM,IAAA,GAA0B;AAAA,IAC9B,IAAA,EAAM,QAAA;AAAA,IACN,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,CAAA,EAAG,MAAA,EAAQ,KAAK,MAAA,EAAO;AAAA,IACvD,UAAU;AAAC,GACb;AACA,EAAA,MAAM,KAAA,GAAoE;AAAA,IACxE,EAAE,IAAA,EAAM,IAAA,EAAM,KAAK,IAAA,CAAK,MAAA,EAAQ,QAAQ,CAAA;AAAE,GAC5C;AACA,EAAA,MAAM,OAAA,GAAU,CAAC,KAAA,EAA+B,EAAA,KAAe;AAC7D,IAAA,IAAI,EAAA,GAAK,MAAM,MAAA,EAAQ;AACrB,MAAA,KAAA,CAAM,IAAA,CAAK,SAAS,IAAA,CAAK;AAAA,QACvB,IAAA,EAAM,MAAA;AAAA,QACN,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,QAAQ,EAAE,CAAA;AAAA,QACjC,QAAQ,KAAA,CAAM;AAAA,OACf,CAAA;AAAA,IACH;AACA,IAAA,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,QAAQ,EAAE,CAAA;AAAA,EAC1C,CAAA;AACA,EAAA,MAAM,QAAQ,MAAM;AAClB,IAAA,MAAM,KAAA,GAAQ,MAAM,GAAA,EAAI;AACxB,IAAA,OAAA,CAAQ,KAAA,EAAO,MAAM,GAAG,CAAA;AACxB,IAAA,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAG,SAAS,KAAA,CAAM,GAAA;AAAA,EAC1C,CAAA;AAEA,EAAA,KAAA,MAAW,MAAA,IAAU,wBAAA,CAAyB,IAAA,EAAM,QAAQ,CAAA,EAAG;AAC7D,IAAA,MAAM,QAAQ,MAAA,CAAO,MAAA;AACrB,IAAA,OAAO,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,SAAS,CAAC,CAAA,CAAG,GAAA,IAAO,KAAA,EAAO,KAAA,EAAM;AACxE,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACrC,IAAA,OAAA,CAAQ,QAAQ,KAAK,CAAA;AACrB,IAAA,MAAM,OAA0B,EAAE,IAAA,EAAM,UAAU,MAAA,EAAQ,QAAA,EAAU,EAAC,EAAE;AACvE,IAAA,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAC9B,IAAA,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,GAAA,EAAK,QAAQ,MAAA,CAAO,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,KAAA,EAAM;AAC/B,EAAA,OAAA,CAAQ,KAAA,CAAM,CAAC,CAAA,EAAI,IAAA,CAAK,MAAM,CAAA;AAE9B,EAAA,OAAO,gBAAA,CAAiB,KAAK,QAAQ,CAAA;AACvC;AAGO,IAAM,kBAAkB,CAAC,KAAA,KAC9B,MACG,GAAA,CAAI,CAAC,MAAO,CAAA,CAAE,IAAA,KAAS,MAAA,GAAS,CAAA,CAAE,OAAO,eAAA,CAAgB,CAAA,CAAE,QAAQ,CAAE,CAAA,CACrE,KAAK,EAAE;AAOL,IAAM,oBAAA,GAAuB,CAClC,IAAA,EACA,QAAA,EACA,OACA,GAAA,KACgD;AAChD,EAAA,IAAI,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,KAAA,EAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AACnD,EAAA,IAAI,EAAA,GAAK,KAAK,GAAA,CAAI,IAAA,EAAM,KAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,MAAM,CAAC,CAAA;AAClD,EAAA,IAAI,UAAA,CAAW,IAAA,EAAM,IAAI,CAAA,EAAG,IAAA,IAAQ,CAAA;AACpC,EAAA,IAAI,UAAA,CAAW,IAAA,EAAM,EAAE,CAAA,EAAG,EAAA,IAAM,CAAA;AAChC,EAAA,MAAM,UAAU,wBAAA,CAAyB,IAAA,EAAM,QAAQ,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAA,KAAM;AACtE,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,CAAE,QAAQ,IAAI,CAAA;AACjC,IAAA,MAAM,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,MAAA,GAAS,CAAA,CAAE,QAAQ,EAAE,CAAA;AAC1C,IAAA,OAAO,CAAA,GAAI,CAAA,GAAI,CAAC,EAAE,GAAG,CAAA,EAAG,MAAA,EAAQ,CAAA,GAAI,IAAA,EAAM,MAAA,EAAQ,CAAA,GAAI,CAAA,EAAG,IAAI,EAAC;AAAA,EAChE,CAAC,CAAA;AACD,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAA,EAAM,EAAE,CAAA;AAClC,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,UAAU,wBAAA,CAAyB,MAAA,EAAQ,OAAO,CAAA,EAAE;AAC7E;;;ACpTA,IAAM,KAAA,GAAiE;AAAA,EACrE,CAAC,MAAM,MAAM,CAAA;AAAA,EACb,CAAC,MAAM,QAAQ,CAAA;AAAA,EACf,CAAC,MAAM,WAAW,CAAA;AAAA,EAClB,CAAC,MAAM,eAAe,CAAA;AAAA,EACtB,CAAC,MAAM,SAAS;AAClB,CAAA;AACA,IAAM,YAAA,GAAe,IAAI,GAAA,CAAI,KAAA,CAAM,IAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM,CAAC,CAAA,EAAG,CAAC,CAAC,CAAC,CAAA;AAC1D,IAAM,UAAA,uBAAiB,GAAA,CAAI,CAAC,KAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC,CAAA;AACpD,IAAM,YAAA,mBAAe,IAAI,GAAA,CAAI,CAAC,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAA,EAAK,GAAG,CAAC,CAAA;AACrE,IAAM,QAAA,GAAW,qBAAA;AACjB,IAAM,OAAA,GAAU,iBAAA;AAEhB,IAAM,YAAA,GAAe,CAAC,CAAA,EAAW,CAAA,EAAW,GAAA,KAAgB;AAC1D,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,IAAI,CAAA,GAAI,GAAA,IAAO,EAAE,CAAA,GAAI,CAAC,MAAM,IAAA,EAAM,CAAA,EAAA;AACzC,EAAA,OAAO,CAAA;AACT,CAAA;AAKA,IAAM,YAAA,GAAe,CAAC,CAAA,EAAW,CAAA,EAAW,IAAA,KAAiB;AAC3D,EAAA,OAAO,CAAA,IAAK,KAAK,CAAA,GAAI,CAAA,CAAE,UAAU,CAAA,CAAE,CAAC,CAAA,KAAM,IAAA,EAAM,CAAA,IAAK,IAAA;AACrD,EAAA,OAAO,EAAE,CAAC,CAAA;AACZ,CAAA;AAMA,IAAM,QAAA,GAAW,CAAC,CAAA,EAAW,CAAA,EAAW,GAAA,KAAgB;AACtD,EAAA,MAAM,CAAA,GAAI,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAChC,EAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AACd,EAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,IAAK,EAAA;AAClB,EAAA,MAAM,OAAA,GACJ,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,GAAA,IAAO,MAAM,GAAA,GAC5B,IAAA,GACA,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,aAAa,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,EAAE,CAAA,KAAM,CAAA,IAAK,aAAa,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,KAAM,CAAA,CAAA;AAC9F,EAAA,OAAO,EAAE,CAAA,EAAG,CAAA,EAAG,OAAA,EAAQ;AACzB,CAAA;AAGA,IAAM,UAAA,GAAa,CAAC,CAAA,EAAW,CAAA,EAAW,GAAA,KAAgB;AACxD,EAAA,MAAM,EAAE,CAAA,EAAG,OAAA,KAAY,QAAA,CAAS,CAAA,EAAG,GAAG,GAAG,CAAA;AACzC,EAAA,OAAO,CAAA,IAAK,WAAW,CAAA,GAAI,CAAA,KAAM,KAAK,CAAA,GAAI,CAAA,GAAI,GAAA,GAAM,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA;AAC9D,CAAA;AAaA,IAAM,gBAAgB,CACpB,CAAA,EACA,IAAA,EACA,GAAA,EACA,QACA,OAAA,KACW;AACX,EAAA,IAAI,CAAA,GAAI,IAAA;AACR,EAAA,OAAO,IAAI,GAAA,EAAK;AACd,IAAA,IAAI,CAAA,CAAE,CAAC,CAAA,KAAM,IAAA,EAAM;AACjB,MAAA,MAAM,CAAA,GAAI,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAChC,MAAA,CAAA,IAAK,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,WAAW,CAAA,GAAI,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA;AACnD,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAA,GAAI,OAAO,MAAA,IAAU,GAAA,IAAO,EAAE,UAAA,CAAW,MAAA,EAAQ,CAAC,CAAA,EAAG,OAAO,CAAA;AAChE,IAAA,CAAA,EAAA;AAAA,EACF;AACA,EAAA,OAAO,EAAA;AACT,CAAA;AAIA,IAAM,WAAA,GAAc,CAAC,CAAA,EAAW,OAAA,EAAiB,aAAA,KAAmC;AAClF,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,EAAE,MAAA,EAAQ;AACnB,IAAA,IAAI,CAAA,CAAE,CAAC,CAAA,KAAM,IAAA,EAAM;AACjB,MAAA,GAAA,IAAO,EAAE,CAAC,CAAA;AACV,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,MAAM,CAAA,GAAI,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,EAAE,MAAM,CAAA;AACrC,IAAA,MAAM,IAAA,GAAO,CAAA,GAAI,CAAA,GAAI,CAAA,CAAE,MAAA,GAAS,EAAE,CAAA,GAAI,CAAC,CAAA,GAAI,aAAA,GAAgB,OAAA,GAAU,EAAA;AACrE,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,GAAA,IAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AACpB,MAAA,CAAA,IAAK,CAAA;AAAA,IACP,CAAA,MAAA,IAAW,CAAA,GAAI,CAAA,KAAM,CAAA,EAAG;AACtB,MAAA,GAAA,IAAO,IAAA,CAAK,MAAA,CAAA,CAAQ,CAAA,GAAI,CAAA,IAAK,CAAC,CAAA,GAAI,OAAA;AAClC,MAAA,CAAA,IAAK,CAAA,GAAI,CAAA;AAAA,IACX,CAAA,MAAO;AACL,MAAA,GAAA,IAAO,IAAA,CAAK,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AACxB,MAAA,CAAA,IAAK,CAAA;AAAA,IACP;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT,CAAA;AAEA,IAAM,SAAA,GAAY,CAAC,CAAA,EAAW,CAAA,EAAW,GAAA,KAAgC;AACvE,EAAA,IAAI,CAAA,CAAE,CAAC,CAAA,KAAM,GAAA,EAAK,OAAO,IAAA;AACzB,EAAA,MAAM,QAAQ,aAAA,CAAc,CAAA,EAAG,IAAI,CAAA,EAAG,GAAA,EAAK,KAAK,GAAG,CAAA;AACnD,EAAA,IAAI,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,OAAO,IAAA;AAC3B,EAAA,OAAO,EAAE,KAAK,KAAA,GAAQ,CAAA,EAAG,cAAc,CAAA,GAAI,CAAA,EAAG,YAAY,KAAA,EAAM;AAClE,CAAA;AAEA,IAAM,QAAA,GAAW,CAAC,CAAA,EAAW,CAAA,EAAW,GAAA,KAAgC;AACtE,EAAA,IAAI,CAAC,CAAA,CAAE,UAAA,CAAW,KAAA,EAAO,CAAC,GAAG,OAAO,IAAA;AACpC,EAAA,MAAM,OAAO,CAAA,GAAI,CAAA;AACjB,EAAA,MAAM,QAAQ,aAAA,CAAc,CAAA,EAAG,IAAA,EAAM,GAAA,EAAK,OAAO,GAAG,CAAA;AACpD,EAAA,IAAI,KAAA,GAAQ,GAAG,OAAO,IAAA;AACtB,EAAA,MAAM,OAAA,GAAU,CAAC,IAAA,KACf,KAAA,GAAQ,IAAA,IAAQ,CAAA,CAAE,KAAA,GAAQ,CAAC,CAAA,KAAM,IAAA,GAAO,KAAA,GAAQ,CAAA,GAAI,KAAA;AACtD,EAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAA;AAC/B,EAAA,IAAI,EAAA,IAAM,CAAA,IAAK,EAAA,GAAK,KAAA,IAAS,QAAA,CAAS,IAAA,CAAK,CAAA,CAAE,KAAA,CAAM,IAAA,EAAM,EAAE,CAAC,CAAA,EAAG;AAC7D,IAAA,MAAMC,WAAAA,GAAa,OAAA,CAAQ,EAAA,GAAK,CAAC,CAAA;AACjC,IAAA,IAAIA,WAAAA,GAAa,KAAK,CAAA,EAAG;AACvB,MAAA,MAAM,QAAA,GAAW,CAAA,CAAE,KAAA,CAAM,IAAA,EAAM,EAAE,CAAA,IAAK,MAAA;AACtC,MAAA,OAAO,EAAE,KAAK,KAAA,GAAQ,CAAA,EAAG,cAAc,EAAA,GAAK,CAAA,EAAG,UAAA,EAAAA,WAAAA,EAAY,QAAA,EAAS;AAAA,IACtE;AAAA,EAEF;AACA,EAAA,MAAM,UAAA,GAAa,QAAQ,IAAI,CAAA;AAC/B,EAAA,IAAI,UAAA,IAAc,MAAM,OAAO,IAAA;AAC/B,EAAA,OAAO,EAAE,GAAA,EAAK,KAAA,GAAQ,CAAA,EAAG,YAAA,EAAc,MAAM,UAAA,EAAW;AAC1D,CAAA;AASA,IAAM,SAAA,GAAY,CAAC,CAAA,EAAW,CAAA,EAAW,GAAA,KAAiC;AACxE,EAAA,IAAI,CAAA,CAAE,CAAC,CAAA,KAAM,GAAA,EAAK,OAAO,IAAA;AACzB,EAAA,IAAI,IAAI,CAAA,GAAI,CAAA;AACZ,EAAA,OAAO,IAAI,GAAA,EAAK;AACd,IAAA,IAAI,CAAA,CAAE,CAAC,CAAA,KAAM,IAAA,EAAM;AACjB,MAAA,CAAA,GAAI,UAAA,CAAW,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AACxB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAA,CAAE,CAAC,CAAA,KAAM,GAAA,EAAK,OAAO,IAAA;AACzB,IAAA,IAAI,CAAA,CAAE,CAAC,CAAA,KAAM,GAAA,IAAO,EAAE,CAAA,GAAI,CAAC,MAAM,GAAA,EAAK;AACpC,MAAA,IAAI,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,OAAO,IAAA;AACxB,MAAA,MAAM,QAAQ,aAAA,CAAc,CAAA,EAAG,IAAI,CAAA,EAAG,GAAA,EAAK,KAAK,GAAG,CAAA;AACnD,MAAA,IAAI,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,OAAO,IAAA;AAC3B,MAAA,OAAO;AAAA,QACL,KAAK,KAAA,GAAQ,CAAA;AAAA,QACb,YAAY,CAAA,GAAI,CAAA;AAAA,QAChB,QAAA,EAAU,CAAA;AAAA,QACV,MAAA,EAAQ,YAAY,CAAA,CAAE,KAAA,CAAM,IAAI,CAAA,EAAG,KAAK,CAAA,EAAG,GAAA,EAAK,IAAI;AAAA,OACtD;AAAA,IACF;AACA,IAAA,MAAM,GAAA,GAAM,SAAS,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,IAAK,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AACtD,IAAA,CAAA,GAAI,GAAA,GAAM,GAAA,CAAI,GAAA,GAAM,CAAA,GAAI,CAAA;AAAA,EAC1B;AACA,EAAA,OAAO,IAAA;AACT,CAAA;AAGA,IAAM,OAAA,GAAU,CAAC,CAAA,EAAW,CAAA,EAAW,GAAA,KAAgB;AACrD,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,IAAI,GAAA,IAAO,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,EAAG,CAAA,EAAA;AACzC,EAAA,OAAO,CAAA;AACT,CAAA;AAEA,IAAM,cAAA,GAAiB,CAAC,CAAA,EAAW,IAAA,EAAc,KAAa,MAAA,KAAmB;AAC/E,EAAA,IAAI,CAAA,GAAI,IAAA;AACR,EAAA,OAAO,IAAI,GAAA,EAAK;AACd,IAAA,IAAI,CAAA,CAAE,CAAC,CAAA,KAAM,IAAA,EAAM;AACjB,MAAA,CAAA,GAAI,UAAA,CAAW,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AACxB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,CAAC,CAAE,CAAA,EAAG;AACzB,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA;AAC7B,MAAA,IAAI,GAAA,KAAQ,KAAK,CAAA,GAAI,IAAA,IAAQ,EAAE,UAAA,CAAW,MAAA,EAAQ,CAAC,CAAA,EAAG,OAAO,CAAA;AAC7D,MAAA,CAAA,IAAK,GAAA;AACL,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,IAAK,SAAA,CAAU,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,IAAK,SAAA,CAAU,CAAA,EAAG,GAAG,GAAG,CAAA;AAC/E,IAAA,CAAA,GAAI,IAAA,GAAO,IAAA,CAAK,GAAA,GAAM,CAAA,GAAI,CAAA;AAAA,EAC5B;AACA,EAAA,OAAO,EAAA;AACT,CAAA;AAMO,IAAM,oBAAA,GAAuB,CAAC,MAAA,KAAyC;AAC5E,EAAA,IAAI,IAAA,GAAO,EAAA;AACX,EAAA,MAAM,WAA4B,EAAC;AACnC,EAAA,MAAM,cAAkC,EAAC;AACzC,EAAA,IAAI,WAAA,GAAc,IAAA;AAClB,EAAA,IAAI,UAAA,GAAa,KAAA;AACjB,EAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,IAAI,YAAY,WAAA,CAAY,IAAA,CAAK,CAAC,UAAA,EAAY,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,EAC5D,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,KAAA,EAAe,GAAA,KAAgB;AACjD,IAAA,IAAI,CAAA,GAAI,KAAA;AACR,IAAA,OAAO,IAAI,GAAA,EAAK;AACd,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,WAAA,GAAc,KAAA;AACd,QAAA,UAAA,GAAa,IAAA,CAAK,MAAA;AAClB,QAAA,UAAA,GAAa,KAAA;AACb,QAAA,IAAI,IAAI,CAAA,IAAK,GAAA,IAAO,OAAO,UAAA,CAAW,IAAA,EAAM,CAAC,CAAA,EAAG;AAC9C,UAAA,UAAA,GAAa,IAAA;AACb,UAAA,CAAA,IAAK,CAAA;AAAA,QACP,CAAA,MAAA,IAAW,MAAA,CAAO,CAAC,CAAA,KAAM,GAAA,KAAQ,CAAA,GAAI,CAAA,KAAM,GAAA,IAAO,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,KAAM,IAAA,CAAA,EAAO;AACzE,UAAA,UAAA,GAAa,IAAA;AACb,UAAA,CAAA,IAAK,CAAA;AAAA,QACP;AACA,QAAA,IAAI,MAAA,CAAO,CAAC,CAAA,KAAM,IAAA,IAAQ,MAAA,CAAO,CAAA,GAAI,YAAA,CAAa,MAAA,EAAQ,CAAA,EAAG,GAAG,CAAC,CAAA,KAAM,KAAK,CAAA,IAAK,CAAA;AACjF,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,MAAM,EAAE,GAAG,CAAA,EAAG,IAAA,EAAM,SAAQ,GAAI,QAAA,CAAS,MAAA,EAAQ,CAAA,EAAG,GAAG,CAAA;AACvD,QAAA,IAAI,CAAC,OAAA,EAAS;AACZ,UAAA,IAAA,IAAQ,IAAA,CAAK,OAAO,CAAC,CAAA;AACrB,UAAA,CAAA,IAAK,CAAA;AAAA,QACP,WAAW,CAAA,GAAI,CAAA,KAAM,CAAA,IAAK,CAAA,GAAI,IAAI,GAAA,EAAK;AACrC,UAAA,IAAA,IAAQ,IAAA,CAAK,MAAA,CAAA,CAAQ,CAAA,GAAI,CAAA,IAAK,CAAC,CAAA,GAAI,IAAA;AACnC,UAAA,CAAA,IAAK,CAAA,GAAI,CAAA;AAAA,QACX,CAAA,MAAO;AACL,UAAA,IAAA,IAAQ,IAAA,CAAK,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AACzB,UAAA,CAAA,IAAK,CAAA;AAAA,QACP;AACA,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,MAAM,IAAA,EAAM;AACd,QAAA,OAAA,EAAQ;AACR,QAAA,IAAA,IAAQ,IAAA;AACR,QAAA,WAAA,GAAc,IAAA;AACd,QAAA,CAAA,EAAA;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,MAAA,EAAQ,CAAA,EAAG,GAAG,CAAA;AACnC,MAAA,MAAM,OAAO,GAAA,GAAM,IAAA,GAAO,SAAA,CAAU,MAAA,EAAQ,GAAG,GAAG,CAAA;AAClD,MAAA,MAAM,OAAO,GAAA,IAAO,IAAA;AACpB,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,QAAA,IAAA,IAAQ,WAAA;AAAA,UACN,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,YAAA,EAAc,KAAK,UAAU,CAAA;AAAA,UAC/C,GAAA;AAAA,UACA,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,KAAM;AAAA,SAC9B;AACA,QAAA,MAAM,MAAA,GAAwB;AAAA,UAC5B,IAAA,EAAM,MAAM,KAAA,GAAQ,MAAA;AAAA,UACpB,MAAA;AAAA,UACA,MAAA,EAAQ,KAAK,MAAA,GAAS;AAAA,SACxB;AACA,QAAA,IAAI,IAAA,CAAK,QAAA,EAAU,MAAA,CAAO,QAAA,GAAW,IAAA,CAAK,QAAA;AAC1C,QAAA,QAAA,CAAS,KAAK,MAAM,CAAA;AACpB,QAAA,CAAA,GAAI,IAAA,CAAK,GAAA;AACT,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,GAAO,SAAA,CAAU,MAAA,EAAQ,CAAA,EAAG,GAAG,CAAA;AACrC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,QAAA,UAAA,CAAW,IAAA,CAAK,UAAA,EAAY,IAAA,CAAK,QAAQ,CAAA;AACzC,QAAA,MAAM,MAAA,GAAS,KAAK,MAAA,GAAS,MAAA;AAC7B,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA;AACzC,QAAA,IAAI,SAAS,CAAA,EAAG;AACd,UAAA,QAAA,CAAS,IAAA;AAAA,YACP,UACI,EAAE,IAAA,EAAM,WAAW,MAAA,EAAQ,MAAA,EAAQ,SAAS,OAAA,CAAQ,CAAC,CAAA,EAAE,GACvD,EAAE,IAAA,EAAM,WAAA,EAAa,QAAQ,MAAA,EAAQ,GAAA,EAAK,KAAK,MAAA;AAAO,WAC5D;AAAA,QACF;AACA,QAAA,CAAA,GAAI,IAAA,CAAK,GAAA;AACT,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,EAAG;AAErB,QAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,MAAA,EAAQ,CAAA,EAAG,GAAG,CAAA;AAClC,QAAA,IAAI,QAAQ,CAAA,EAAG;AACb,UAAA,IAAA,IAAQ,CAAA,CAAE,OAAO,GAAG,CAAA;AACpB,UAAA,CAAA,IAAK,GAAA;AACL,UAAA;AAAA,QACF;AACA,QAAA,MAAM,CAAC,MAAA,EAAQ,IAAI,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA,KAAM,CAAA,CAAE,CAAC,MAAM,CAAC,CAAA;AACrD,QAAA,MAAM,QAAQ,cAAA,CAAe,MAAA,EAAQ,CAAA,GAAI,CAAA,EAAG,KAAK,MAAM,CAAA;AACvD,QAAA,IAAI,KAAA,GAAQ,IAAI,CAAA,EAAG;AACjB,UAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,UAAA,UAAA,CAAW,CAAA,GAAI,GAAG,KAAK,CAAA;AACvB,UAAA,MAAM,MAAA,GAAS,KAAK,MAAA,GAAS,MAAA;AAC7B,UAAA,IAAI,MAAA,GAAS,GAAG,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAQ,CAAA;AACtD,UAAA,CAAA,GAAI,KAAA,GAAQ,CAAA;AAAA,QACd,CAAA,MAAO;AACL,UAAA,IAAA,IAAQ,MAAA;AACR,UAAA,CAAA,IAAK,CAAA;AAAA,QACP;AACA,QAAA;AAAA,MACF;AAEA,MAAA,IAAA,IAAQ,CAAA;AACR,MAAA,CAAA,EAAA;AAAA,IACF;AAAA,EACF,CAAA;AAEA,EAAA,UAAA,CAAW,CAAA,EAAG,OAAO,MAAM,CAAA;AAC3B,EAAA,OAAA,EAAQ;AAGR,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,CAAY,QAAQ,CAAA,EAAA,EAAK;AAC3C,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,CAAC,CAAA,CAAG,CAAC,CAAA;AAC/B,IAAA,IAAI,GAAA,GAAM,WAAA,CAAY,CAAC,CAAA,CAAG,CAAC,CAAA;AAC3B,IAAA,OAAO,CAAA,GAAI,CAAA,GAAI,WAAA,CAAY,MAAA,IAAU,WAAA,CAAY,CAAA,GAAI,CAAC,CAAA,CAAG,CAAC,CAAA,KAAM,GAAA,GAAM,CAAA,EAAG;AACvE,MAAA,GAAA,GAAM,WAAA,CAAY,EAAE,CAAC,CAAA,CAAG,CAAC,CAAA;AAAA,IAC3B;AACA,IAAA,IAAI,GAAA,GAAM,KAAA,EAAO,QAAA,CAAS,IAAA,CAAK,EAAE,IAAA,EAAM,YAAA,EAAc,MAAA,EAAQ,KAAA,EAAO,MAAA,EAAQ,GAAA,GAAM,KAAA,EAAO,CAAA;AAAA,EAC3F;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,wBAAA,CAAyB,IAAA,EAAM,QAAQ,CAAA,EAAE;AACpE;AAyCO,IAAM,qBAAA,GAAwB,CACnC,IAAA,EACA,QAAA,KACW;AAKX,EAAA,MAAM,WAAA,GAAA,CAAe,YAAY,EAAC,EAAG,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,KAAK,CAAA;AACnE,EAAA,MAAM,KAAA,GAAQ,wBAAA,CAAyB,IAAA,EAAM,WAAW,CAAA;AACxD,EAAA,MAAM,KAAA,GAAQ,CAAC,CAAA,KACb,KAAA,CAAM,KAAK,CAAC,CAAA,KAAA,CAAO,EAAE,IAAA,KAAS,MAAA,IAAU,EAAE,IAAA,KAAS,KAAA,KAAU,EAAE,MAAA,IAAU,CAAA,IAAK,IAAI,CAAA,CAAE,MAAA,GAAS,EAAE,MAAM,CAAA;AACvG,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAAc,IAAA,CAAK,CAAC,CAAA,KAAM,IAAA,IAAQ,CAAC,KAAA,CAAM,CAAC,CAAA;AAC3D,EAAA,MAAM,SAA0B,EAAC;AACjC,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,CAAA,CAAE,SAAS,YAAA,EAAc;AAC7B,IAAA,MAAM,GAAA,GAAM,CAAA,CAAE,MAAA,GAAS,CAAA,CAAE,MAAA;AACzB,IAAA,IAAI,EAAE,CAAA,CAAE,MAAA,KAAW,CAAA,IAAK,QAAQ,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,CAAA,IAAM,EAAE,GAAA,KAAQ,IAAA,CAAK,MAAA,IAAU,OAAA,CAAQ,GAAG,CAAA,CAAA,EAAI;AAC1F,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA;AACrC,IAAA,IAAI,IAAA,IAAQ,IAAA,CAAK,MAAA,GAAS,IAAA,CAAK,MAAA,GAAS,CAAA,KAAM,CAAA,CAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,GAAS,GAAA,GAAM,IAAA,CAAK,MAAA;AAAA,SAC5E,MAAA,CAAO,IAAA,CAAK,EAAE,GAAG,GAAG,CAAA;AAAA,EAC3B;AACA,EAAA,MAAM,IAAA,GAAO,yBAAyB,IAAA,EAAM;AAAA,IAC1C,GAAG,WAAA,CAAY,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,YAAY,CAAA;AAAA,IACpD,GAAG;AAAA,GACJ,CAAA;AAED,EAAA,MAAM,IAAA,GAAmB,EAAE,MAAA,EAAQ,IAAA,EAAM,KAAA,EAAO,CAAA,EAAG,GAAA,EAAK,IAAA,CAAK,MAAA,EAAQ,QAAA,EAAU,EAAC,EAAE;AAClF,EAAA,MAAM,KAAA,GAAsB,CAAC,IAAI,CAAA;AACjC,EAAA,KAAA,MAAW,UAAU,IAAA,EAAM;AACzB,IAAA,MAAM,IAAA,GAAmB;AAAA,MACvB,MAAA;AAAA,MACA,OAAO,MAAA,CAAO,MAAA;AAAA,MACd,GAAA,EAAK,MAAA,CAAO,MAAA,GAAS,MAAA,CAAO,MAAA;AAAA,MAC5B,UAAU;AAAC,KACb;AACA,IAAA,OAAO,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAG,GAAA,IAAO,IAAA,CAAK,KAAA,EAAO,KAAA,CAAM,GAAA,EAAI;AACjF,IAAA,KAAA,CAAM,MAAM,MAAA,GAAS,CAAC,CAAA,CAAG,QAAA,CAAS,KAAK,IAAI,CAAA;AAC3C,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACjB;AAEA,EAAA,MAAM,QAAgB,EAAC;AACvB,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,EAAW,MAAA,GAAS,KAAA,KAAU,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,EAAG,MAAA,EAAQ,CAAA;AAClF,EAAA,MAAM,GAAA,GAAM,CAAC,EAAA,EAAY,GAAA,EAAc,YACrC,KAAA,CAAM,IAAA,CAAK,EAAE,IAAA,EAAM,OAAO,EAAA,EAAI,GAAA,EAAK,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAA;AAC7D,EAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,EAAA,MAAM,QAAA,GAAW,CAAC,IAAA,EAAc,EAAA,EAAY,OAAA,KAAqB;AAC/D,IAAA,KAAA,IAAS,CAAA,GAAI,IAAA,EAAM,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC9B,MAAA,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAI,MAAA,EAAQ,OAAO,CAAA;AAG7B,MAAA,IAAI,KAAK,CAAC,CAAA,KAAM,QAAQ,UAAA,GAAa,CAAA,OAAQ,IAAI,CAAA;AAAA,IACnD;AAAA,EACF,CAAA;AACA,EAAA,MAAM,OAAA,GAAU,CAAC,IAAA,EAAc,EAAA,EAAY,GAAA,KAAiB;AAC1D,IAAA,KAAA,IAAS,CAAA,GAAI,IAAA,EAAM,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,MAAS,IAAA,CAAK,CAAC,CAAA,EAAI,GAAA,EAAK,KAAK,CAAA;AAAA,EAC1D,CAAA;AAEA,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,EAAkB,OAAA,KAAqB;AACnD,IAAA,IAAI,SAAS,IAAA,CAAK,KAAA;AAClB,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,MAAA,QAAA,CAAS,MAAA,EAAQ,KAAA,CAAM,KAAA,EAAO,OAAO,CAAA;AACrC,MAAA,UAAA,CAAW,OAAO,OAAO,CAAA;AACzB,MAAA,MAAA,GAAS,KAAA,CAAM,GAAA;AAAA,IACjB;AACA,IAAA,QAAA,CAAS,MAAA,EAAQ,IAAA,CAAK,GAAA,EAAK,OAAO,CAAA;AAAA,EACpC,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,EAAkB,OAAA,KAAqB;AACzD,IAAA,MAAM,IAAI,IAAA,CAAK,MAAA;AACf,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,GAAA,CAAI,CAAA,CAAE,IAAI,CAAA;AACpC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,IAAA,CAAK,IAAI,CAAA;AACT,MAAA,IAAA,CAAK,MAAM,OAAO,CAAA;AAClB,MAAA,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IACjB,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,MAAA,EAAQ;AAC5B,MAAA,IAAA,CAAK,GAAG,CAAA;AACR,MAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,GAAA,EAAK,MAAM,CAAA;AACpC,MAAA,IAAA,CAAK,GAAG,CAAA;AAAA,IACV,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,KAAA,EAAO;AAC3B,MAAA,MAAM,QAAA,GAAW,EAAE,QAAA,IAAY,QAAA,CAAS,KAAK,CAAA,CAAE,QAAQ,CAAA,GAAI,CAAA,CAAE,QAAA,GAAW,EAAA;AACxE,MAAA,IAAA,CAAK,SAAS,QAAQ;AAAA,CAAI,CAAA;AAC1B,MAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,GAAA,EAAK,KAAK,CAAA;AACnC,MAAA,IAAA,CAAK,OAAO,CAAA;AAAA,IACd,WAAW,CAAA,CAAE,IAAA,KAAS,WAAA,IAAe,CAAA,CAAE,SAAS,SAAA,EAAW;AACzD,MAAA,IAAA,CAAK,GAAG,CAAA;AACR,MAAA,IAAA,CAAK,MAAM,IAAI,CAAA;AACf,MAAA,IAAA,CAAK,MAAM,IAAI,CAAA;AACf,MAAA,MAAM,MAAA,GAAS,EAAE,IAAA,KAAS,SAAA,GAAY,WAAW,CAAA,CAAE,OAAO,KAAK,CAAA,CAAE,GAAA;AACjE,MAAA,KAAA,MAAW,EAAA,IAAM,MAAA,EAAQ,GAAA,CAAI,EAAA,EAAI,OAAO,KAAK,CAAA;AAC7C,MAAA,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,IAChB,CAAA,MAAA,IAAW,CAAA,CAAE,IAAA,KAAS,YAAA,EAAc;AAClC,MAAA,IAAA,CAAK,IAAI,CAAA;AACT,MAAA,UAAA,EAAA;AACA,MAAA,IAAA,CAAK,MAAM,OAAO,CAAA;AAClB,MAAA,UAAA,EAAA;AAAA,IACF,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,IACpB;AAAA,EACF,CAAA;AAEA,EAAA,IAAA,CAAK,MAAM,KAAK,CAAA;AAChB,EAAA,OAAO,UAAU,KAAK,CAAA;AACxB;AAEA,IAAM,KAAA,GAAQ,CAAC,CAAA,EAAqB,EAAA,EAAY,GAAA,KAC9C,CAAA,EAAG,IAAA,KAAS,KAAA,IAAS,CAAA,CAAE,EAAA,KAAO,EAAA,IAAM,CAAA,CAAE,GAAA,KAAQ,GAAA;AAEhD,IAAM,SAAA,GAAY,CAAC,CAAA,KACjB,CAAA,KAAM,MAAA,GAAY,MAAA,GAAY,CAAA,CAAE,IAAA,KAAS,MAAA,GAAS,CAAA,CAAE,CAAA,CAAE,CAAC,IAAI,CAAA,CAAE,EAAA;AAI/D,IAAM,WAAA,GAAc,CAAC,KAAA,EAAe,IAAA,KAAqC;AACvE,EAAA,KAAA,IAAS,CAAA,GAAI,IAAA,EAAM,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,IAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAQ;AACrB,MAAA,MAAM,CAAA,GAAI,CAAC,GAAG,CAAA,CAAE,CAAC,EAAE,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,KAAO,IAAI,CAAA;AAC3C,MAAA,IAAI,CAAA,KAAM,QAAW,OAAO,CAAA;AAAA,IAC9B,CAAA,MAAA,IAAW,CAAA,CAAE,MAAA,IAAU,CAAA,CAAE,OAAO,IAAA,EAAM;AACpC,MAAA,OAAO,CAAA,CAAE,EAAA;AAAA,IACX;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT,CAAA;AAEA,IAAM,gBAAA,GAAmB,CAAC,GAAA,KAAgB;AACxC,EAAA,IAAI,CAAA,GAAI,IAAI,MAAA,GAAS,CAAA;AACrB,EAAA,OAAO,CAAA,IAAK,CAAA,IAAK,GAAA,CAAI,CAAC,MAAM,IAAA,EAAM,CAAA,EAAA;AAClC,EAAA,OAAO,IAAI,CAAC,CAAA;AACd,CAAA;AAIA,IAAM,aAAA,GAAgB,CAAC,KAAA,EAAe,CAAA,EAAW,KAAc,GAAA,KAAyB;AACtF,EAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,EAAA,IAAI,IAAA,KAAS,QAAW,OAAO,KAAA;AAC/B,EAAA,IAAI,IAAA,CAAK,IAAA,KAAS,KAAA,IAAS,IAAA,CAAK,QAAQ,OAAO,IAAA;AAC/C,EAAA,MAAM,CAAA,GAAI,KAAK,IAAA,KAAS,MAAA,GAAS,KAAK,CAAA,CAAE,CAAC,IAAK,IAAA,CAAK,EAAA;AACnD,EAAA,IAAI,QAAQ,MAAA,EAAQ,OAAO,CAAA,MAAO,GAAA,KAAQ,QAAQ,GAAA,GAAM,GAAA,CAAA;AACxD,EAAA,IAAI,KAAK,IAAA,KAAS,MAAA,EAAQ,OAAO,YAAA,CAAa,IAAI,CAAC,CAAA;AACnD,EAAA,IAAI,MAAM,GAAA,IAAO,CAAA,KAAM,GAAA,IAAO,CAAA,KAAM,KAAK,OAAO,IAAA;AAChD,EAAA,OAAO,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,KAAM,gBAAA,CAAiB,GAAG,CAAA,KAAM,CAAA,IAAK,WAAA,CAAY,KAAA,EAAO,CAAA,GAAI,CAAC,CAAA,KAAM,CAAA,CAAA;AAC5F,CAAA;AAEA,IAAM,SAAA,GAAY,CAAC,KAAA,KAA0B;AAE3C,EAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,EAAGC,EAAAA,KAAM;AACtB,IAAA,IAAI,CAAA,CAAE,SAAS,KAAA,EAAO;AACtB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAMA,EAAAA,GAAI,CAAC,CAAA;AACxB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAMA,EAAAA,GAAI,CAAC,CAAA;AACxB,IAAA,IAAI,CAAA,CAAE,QAAQ,MAAA,EAAQ;AACpB,MAAA,IAAI,UAAA,CAAW,GAAA,CAAI,CAAA,CAAE,EAAE,CAAA,EAAG;AAGxB,QAAA,MAAM,aACJ,IAAA,EAAM,IAAA,KAAS,MAAA,GACX,IAAA,CAAK,EAAE,QAAA,CAAS,CAAA,CAAE,EAAE,CAAA,GACpB,SAAS,MAAA,IAAa,CAAC,KAAK,MAAA,IAAU,IAAA,CAAK,OAAO,CAAA,CAAE,EAAA;AAC1D,QAAA,CAAA,CAAE,MAAA,GAAS,UAAA,IAAc,SAAA,CAAU,IAAI,MAAM,CAAA,CAAE,EAAA;AAAA,MACjD,CAAA,MAAA,IAAW,CAAA,CAAE,EAAA,KAAO,GAAA,EAAK;AACvB,QAAA,CAAA,CAAE,MAAA,GAAS,IAAA;AAAA,MACb,CAAA,MAAA,IAAW,CAAA,CAAE,EAAA,KAAO,GAAA,EAAK;AACvB,QAAA,CAAA,CAAE,SAAS,CAAA,CAAE,OAAA;AAAA,MACf,CAAA,MAAA,IAAW,CAAA,CAAE,EAAA,KAAO,GAAA,EAAK;AACvB,QAAA,CAAA,CAAE,MAAA,GAAS,IAAA,EAAM,IAAA,KAAS,KAAA,IAAS,KAAK,EAAA,KAAO,GAAA;AAAA,MACjD;AAAA,IACF,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,MAAA,EAAQ;AAC3B,MAAA,CAAA,CAAE,MAAA,GAAS,EAAE,EAAA,KAAO,GAAA;AAAA,IACtB,CAAA,MAAA,IAAW,CAAA,CAAE,GAAA,KAAQ,KAAA,EAAO;AAC1B,MAAA,CAAA,CAAE,MAAA,GAAS,EAAE,EAAA,KAAO,GAAA;AAAA,IACtB,CAAA,MAAA,IAAW,CAAA,CAAE,EAAA,KAAO,GAAA,EAAK;AAEvB,MAAA,IAAI,CAAA,GAAIA,EAAAA;AACR,MAAA,OAAO,MAAM,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,EAAG,GAAA,EAAK,KAAK,CAAA,EAAG,CAAA,EAAA;AACxC,MAAA,IAAI,CAAA,GAAIA,EAAAA;AACR,MAAA,OAAO,MAAM,KAAA,CAAM,CAAA,GAAI,CAAC,CAAA,EAAG,GAAA,EAAK,KAAK,CAAA,EAAG,CAAA,EAAA;AACxC,MAAA,CAAA,CAAE,MAAA,GAAS,CAAA,GAAI,CAAA,GAAI,CAAA,IAAK,CAAA;AAAA,IAC1B;AAAA,EACF,CAAC,CAAA;AAOD,EAAA,IAAI,SAAA,GAAY,IAAA;AAChB,EAAA,IAAI,WAAA,GAAc,KAAA;AAClB,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,OAAO,CAAA,GAAI,MAAM,MAAA,EAAQ;AACvB,IAAA,MAAM,CAAA,GAAI,MAAM,CAAC,CAAA;AACjB,IAAA,MAAM,OAAA,GAAU,EAAE,IAAA,KAAS,MAAA,GAAS,EAAE,MAAA,KAAW,IAAA,GAAO,EAAE,GAAA,KAAQ,KAAA;AAClE,IAAA,MAAM,OAAA,GAAU,aAAa,CAAC,OAAA;AAC9B,IAAA,MAAM,UAAU,WAAA,IAAe,OAAA;AAC/B,IAAA,WAAA,GAAc,KAAA;AACd,IAAA,IAAI,CAAC,SAAS,SAAA,GAAY,KAAA;AAC1B,IAAA,IAAI,CAAA,CAAE,SAAS,MAAA,EAAQ;AACrB,MAAA,GAAA,IAAO,CAAA,CAAE,CAAA;AACT,MAAA,WAAA,GAAc,OAAA,IAAW,EAAE,CAAA,KAAM,IAAA;AACjC,MAAA,CAAA,EAAA;AACA,MAAA;AAAA,IACF;AACA,IAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,MAAA,IAAU,OAAA,EAAS;AAC/B,MAAA,IAAI,CAAA,GAAI,CAAA;AACR,MAAA,OAAO,MAAM,KAAA,CAAM,CAAC,CAAA,EAAG,IAAA,EAAM,MAAM,CAAA,EAAG,CAAA,EAAA;AACtC,MAAA,IAAI,MAAM,KAAA,CAAM,CAAC,GAAG,GAAA,EAAK,MAAM,GAAG,GAAA,IAAO,IAAA;AAAA,IAC3C;AACA,IAAA,IAAI,CAAA,CAAE,OAAO,IAAA,EAAM;AACjB,MAAA,IAAI,CAAA,GAAI,CAAA;AACR,MAAA,OAAO,MAAM,KAAA,CAAM,CAAC,GAAG,IAAA,EAAM,CAAA,CAAE,GAAG,CAAA,EAAG,CAAA,EAAA;AACrC,MAAA,GAAA,IAAO,IAAA,CAAK,MAAA,CAAO,aAAA,CAAc,KAAA,EAAO,CAAA,EAAG,CAAA,CAAE,GAAA,EAAK,GAAG,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAA,CAAA,GAAK,IAAI,CAAC,CAAA;AAC5E,MAAA,CAAA,GAAI,CAAA;AACJ,MAAA;AAAA,IACF;AACA,IAAA,GAAA,IAAO,EAAE,MAAA,GAAS,CAAA,EAAA,EAAK,CAAA,CAAE,EAAE,KAAK,CAAA,CAAE,EAAA;AAClC,IAAA,IAAI,EAAE,GAAA,KAAQ,MAAA,IAAU,CAAA,CAAE,EAAA,KAAO,MAAM,SAAA,GAAY,IAAA;AACnD,IAAA,CAAA,EAAA;AAAA,EACF;AACA,EAAA,OAAO,GAAA;AACT,CAAA;;;AClmBO,IAAM,mBAAA,GAAsB;AAAA,EACjC,GAAA,EAAK,CAAA;AAAA,EACL,KAAA,EAAO,CAAA;AAAA,EACP,MAAA,EAAQ,CAAA;AAAA,EACR,IAAA,EAAM;AACR;AA0BA,IAAM,EAAE,KAAK,CAAA,EAAG,KAAA,EAAO,GAAG,MAAA,EAAQ,CAAA,EAAG,IAAA,EAAM,CAAA,EAAE,GAAI,mBAAA;AACjD,IAAM,GAAA,GAAM,CAAC,EAAA,KAAiB,EAAA,CAAG,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA;AAC1D,IAAM,KAAA,GAAQ,CAAC,CAAA,EAAW,GAAA,EAAa,GAAA,KAAgB,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,CAAA,EAAG,GAAG,CAAA;AAErF,IAAM,OAAO,CAAC,CAAA,EAAW,CAAA,EAAW,KAAA,EAAe,QAAgB,KAAA,MAAmB;AAAA,EACpF,CAAA;AAAA,EACA,CAAA;AAAA,EACA,KAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,CAAA;AAEA,IAAM,gBAAgB,CACpB,MAAA,EACA,YAAA,EACA,QAAA,EACA,UACA,OAAA,KACuB;AACvB,EAAA,MAAM,SAAA,GAAa,WAAW,CAAA,GAAK,CAAA;AACnC,EAAA,MAAM,UAAU,MAAA,CAAO,GAAA;AAAA,IAAI,CAAC,CAAA,KAC1B,YAAA,GAAe,GAAA,GAAM,KAAA,CAAM,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA,GAAI,KAAA,CAAM,CAAA,EAAG,MAAA,EAAQ,CAAC;AAAA,GAC7D;AACA,EAAA,MAAM,QAAQ,OAAA,CAAQ,MAAA;AACtB,EAAA,MAAM,WAAsD,EAAC;AAC7D,EAAA,MAAM,IAAA,GAAO,CAAC,MAAA,KAAqB;AACjC,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AAChC,MAAA,MAAM,CAAA,GAAA,CAAK,QAAA,GAAA,CAAY,CAAA,GAAI,CAAA,IAAK,OAAA,IAAW,GAAA,CAAI,OAAA,CAAQ,KAAA,CAAM,MAAA,EAAQ,MAAA,GAAS,CAAC,CAAC,CAAA;AAChF,MAAA,MAAA,IAAU,CAAA;AACV,MAAA,OAAO,CAAA;AAAA,IACT,CAAC,CAAA;AACD,IAAA,QAAA,CAAS,IAAA,CAAK,EAAE,MAAA,EAAQ,OAAA,EAAS,CAAA;AAAA,EACnC,CAAA;AAEA,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,KAAU,KAAA,EAAO,KAAA,EAAA,EAAS;AAC5C,IAAA,MAAM,SAAS,KAAA,GAAQ,KAAA;AACvB,IAAA,IAAI,KAAA,IAAS,KAAK,MAAA,IAAU,CAAA,OAAQ,CAAC,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,EACrD;AACA,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,KAAA,GAAQ,GAAG,KAAA,EAAA,EAAS;AAC9C,IAAA,KAAA,IAAS,MAAA,GAAS,CAAA,EAAG,MAAA,GAAS,KAAA,GAAQ,OAAO,MAAA,EAAA,EAAU;AACrD,MAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,GAAQ,MAAA;AAC9B,MAAA,IAAI,KAAA,IAAS,KAAK,MAAA,KAAW,YAAA,GAAe,OAAO,CAAA,GAAI,CAAA,CAAA,IAAM,SAAS,CAAA,EAAG;AACvE,QAAA,IAAA,CAAK,CAAC,KAAA,EAAO,MAAA,EAAQ,KAAK,CAAC,CAAA;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AACA,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,KAAA,GAAQ,GAAG,KAAA,EAAA,EAAS;AAC9C,IAAA,KAAA,IAAS,MAAA,GAAS,CAAA,EAAG,MAAA,GAAS,KAAA,GAAQ,OAAO,MAAA,EAAA,EAAU;AACrD,MAAA,KAAA,IAAS,QAAQ,CAAA,EAAG,KAAA,GAAQ,KAAA,GAAQ,KAAA,GAAQ,QAAQ,KAAA,EAAA,EAAS;AAC3D,QAAA,MAAM,MAAA,GAAS,KAAA,GAAQ,KAAA,GAAQ,MAAA,GAAS,KAAA;AACxC,QAAA,IAAI,SAAS,CAAA,IAAK,MAAA,IAAU,KAAK,KAAA,IAAS,CAAA,IAAK,UAAU,CAAA,EAAG;AAC1D,UAAA,IAAA,CAAK,CAAC,KAAA,EAAO,MAAA,EAAQ,KAAA,EAAO,MAAM,CAAC,CAAA;AAAA,QACrC;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAKA,EAAA,IAAI,CAAC,SAAS,MAAA,EAAQ;AACpB,IAAA,IAAA,CAAK,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,KAAK,IAAA,CAAK,KAAA,GAAQ,CAAC,CAAA,EAAE,EAAG,CAAC,CAAA,EAAG,CAAA,KAAM,KAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAA,GAAI,CAAC,CAAC,CAAC,CAAA;AAAA,EACzF;AACA,EAAA,IAAI,IAAA,GAAO,SAAS,CAAC,CAAA;AACrB,EAAA,IAAI,QAAA,GAAW,QAAA;AACf,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAQ,GAAI,OAAA;AAC5B,IAAA,MAAM,QAAQ,GAAA,CAAI,OAAO,CAAA,GAAI,OAAA,IAAW,OAAO,MAAA,GAAS,CAAA,CAAA;AACxD,IAAA,MAAM,WAAW,IAAA,CAAK,GAAA,CAAI,GAAG,OAAO,CAAA,GAAI,WAAW,GAAA,GAAM,CAAA;AACzD,IAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAA,IAAK,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,GAAK,CAAC,IAAI,GAAA,GAAM,CAAA;AAC5E,IAAA,MAAM,OAAO,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,SAAS,IAAI,QAAA,GAAW,QAAA;AACtD,IAAA,IAAI,OAAO,QAAA,EAAU;AACnB,MAAA,IAAA,GAAO,OAAA;AACP,MAAA,QAAA,GAAW,IAAA;AAAA,IACb;AAAA,EACF;AAEA,EAAA,MAAM,QAA4B,EAAC;AACnC,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,CAAC,IAAA,EAAM,GAAA,KAAQ;AACjC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,OAAA,CAAQ,GAAG,CAAA;AACnC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AACpC,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,IAAA,EAAM,GAAA,EAAA,EAAO;AACnC,MAAA,MAAM,SACH,GAAA,KAAQ,CAAA,GAAI,IAAI,CAAA,KAChB,GAAA,KAAQ,KAAK,MAAA,CAAO,MAAA,GAAS,IAAI,CAAA,GAAI,CAAA,CAAA,IACrC,QAAQ,CAAA,GAAI,CAAA,GAAI,MAChB,GAAA,KAAQ,IAAA,GAAO,IAAI,CAAA,GAAI,CAAA,CAAA;AAC1B,MAAA,MAAM,KAAA,GACJ,GAAA,KAAQ,IAAA,GAAO,CAAA,GAAI,QAAA,GAAW,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAK,UAAU,CAAA;AAC3E,MAAA,KAAA,CAAM,KAAK,IAAA,CAAK,CAAA,EAAG,GAAG,KAAA,EAAO,MAAA,EAAQ,KAAK,CAAC,CAAA;AAC3C,MAAA,CAAA,IAAK,KAAA,GAAQ,OAAA;AACb,MAAA,KAAA,EAAA;AAAA,IACF;AACA,IAAA,CAAA,IAAK,MAAA,GAAS,OAAA;AAAA,EAChB,CAAC,CAAA;AACD,EAAA,OAAO,KAAA;AACT,CAAA;AAMO,IAAM,kBAAA,GAAqB,CAChC,KAAA,EACA,OAAA,GAA+B,EAAC,KACT;AACvB,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,GAAA;AACrC,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,GAAA;AACrC,EAAA,MAAM,CAAA,GAAI,QAAQ,OAAA,IAAW,CAAA;AAC7B,EAAA,MAAM,SAAA,GAAY,QAAA;AAClB,EAAA,MAAM,CAAA,GAAI,KAAA,CAAM,GAAA,CAAI,CAAC,MAAO,CAAA,CAAE,KAAA,GAAQ,CAAA,IAAK,CAAA,CAAE,SAAS,CAAA,GAAI,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,SAAS,CAAE,CAAA;AACjF,EAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AACZ,EAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,GAAA,CAAI,CAAC,MAAO,CAAA,GAAI,GAAA,GAAM,GAAA,GAAM,CAAA,GAAI,GAAA,GAAM,GAAA,GAAM,GAAI,CAAA,CAAE,KAAK,EAAE,CAAA;AAEzE,EAAA,MAAM,YAAA,GAAA,CAAgB,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AACpC,EAAA,MAAM,eAAe,QAAA,GAAW,SAAA;AAEhC,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,MAAM,CAAA,EAAG;AACX,IAAA,KAAA,GAAQ,EAAC;AAAA,EACX,CAAA,MAAA,IAAW,MAAM,CAAA,EAAG;AAClB,IAAA,KAAA,GAAQ,CAAC,IAAA,CAAK,CAAA,EAAG,CAAA,EAAG,QAAA,EAAU,QAAA,GAAW,CAAA,CAAE,CAAC,CAAA,EAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,EAChE,CAAA,MAAA,IAAW,KAAK,CAAA,IAAK,CAAA,CAAE,KAAK,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA,EAAG;AACzC,IAAA,KAAA,GAAQ,aAAA,CAAc,CAAA,EAAG,YAAA,EAAc,QAAA,EAAU,UAAU,CAAC,CAAA;AAAA,EAC9D,CAAA,MAAA,IAAW,MAAM,CAAA,EAAG;AAClB,IAAA,MAAM,CAAC,EAAA,EAAI,EAAE,CAAA,GAAI,CAAA;AACjB,IAAA,IAAI,UAAU,IAAA,IAAQ,YAAA,GAAe,MAAM,YAAA,IAAgB,EAAA,GAAK,KAAK,GAAA,EAAK;AACxE,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,QAAA,GAAW,EAAA,EAAI,QAAA,GAAW,EAAA,EAAA,CAAK,SAAA,GAAY,CAAA,IAAK,CAAC,CAAC,CAAA;AAChF,MAAA,KAAA,GAAQ,CAAC,IAAA,CAAK,CAAA,EAAG,GAAG,QAAA,EAAU,CAAA,EAAG,IAAI,CAAA,GAAI,CAAC,GAAG,IAAA,CAAK,CAAA,EAAG,IAAI,CAAA,EAAG,QAAA,EAAU,GAAG,CAAA,GAAI,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,IACrF,CAAA,MAAA,IAAW,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,IAAA,EAAM;AAC3C,MAAA,MAAM,CAAA,GAAA,CAAK,WAAW,CAAA,IAAK,CAAA;AAC3B,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,IAAI,EAAA,EAAI,CAAA,GAAI,EAAA,EAAI,SAAS,CAAC,CAAA;AACxD,MAAA,KAAA,GAAQ,CAAC,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA,GAAI,CAAC,GAAG,IAAA,CAAK,CAAA,GAAI,GAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,GAAI,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,IACvE,CAAA,MAAO;AACL,MAAA,MAAM,KAAK,IAAA,CAAK,GAAA;AAAA,QACd,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,OAAO,QAAA,GAAW,CAAA,CAAA,EAAA,CAAK,QAAA,GAAW,CAAA,IAAK,EAAA,IAAM,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,GAAG,CAAC,CAAA;AAAA,QAClF,QAAA,GAAW,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,WAAW,GAAG;AAAA,OAC1C;AACA,MAAA,MAAM,EAAA,GAAK,WAAW,EAAA,GAAK,CAAA;AAC3B,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAE,CAAC,CAAC,CAAA;AACpE,MAAA,KAAA,GAAQ,CAAC,IAAA,CAAK,CAAA,EAAG,GAAG,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA,GAAI,CAAC,GAAG,IAAA,CAAK,EAAA,GAAK,GAAG,CAAA,EAAG,EAAA,EAAI,GAAG,CAAA,GAAI,CAAA,GAAI,CAAC,CAAC,CAAA;AAAA,IAC1E;AAAA,EACF,CAAA,MAAA,IAAW,MAAM,CAAA,EAAG;AAClB,IAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA,GAAI,CAAA;AACrB,IAAA,IAAI,KAAA,CAAM,CAAC,CAAA,KAAM,GAAA,EAAK;AACpB,MAAA,MAAM,EAAA,GAAK,SAAA;AACX,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAA,CAAK,SAAA,GAAY,CAAA,IAAK,CAAA,EAAI,EAAA,IAAM,QAAA,GAAW,CAAA,CAAA,IAAO,EAAA,GAAK,GAAG,CAAC,CAAA;AACtF,MAAA,MAAM,EAAA,GAAK,KAAK,EAAA,GAAK,CAAA;AACrB,MAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,IAAA,CAAK,MAAM,IAAA,CAAK,GAAA,CAAA,CAAK,QAAA,GAAW,CAAA,IAAK,GAAG,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAE,CAAC,CAAC,CAAA;AACxF,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,KAAK,EAAE,CAAA,EAAG,QAAA,GAAW,CAAA,GAAI,EAAE,CAAA;AAC1D,MAAA,KAAA,GAAQ;AAAA,QACN,KAAK,CAAA,EAAG,CAAA,EAAG,IAAI,EAAA,EAAI,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,QAC5B,KAAK,EAAA,GAAK,CAAA,EAAG,GAAG,EAAA,EAAI,EAAA,EAAI,IAAI,CAAC,CAAA;AAAA,QAC7B,IAAA,CAAK,KAAK,CAAA,EAAG,EAAA,GAAK,GAAG,EAAA,EAAI,EAAA,EAAI,IAAI,CAAC;AAAA,OACpC;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,WAAW,EAAA,EAAA,CAAK,SAAA,GAAY,CAAA,IAAK,IAAI,CAAC,CAAA;AACrE,MAAA,MAAM,EAAA,GAAA,CAAM,WAAW,CAAA,IAAK,CAAA;AAC5B,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,SAAA,GAAY,KAAK,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,IAAI,EAAA,GAAK,EAAA,EAAI,EAAA,GAAK,EAAE,CAAC,CAAC,CAAA;AAC9E,MAAA,MAAM,EAAA,GAAK,WAAW,EAAA,GAAK,CAAA;AAC3B,MAAA,KAAA,GAAQ;AAAA,QACN,KAAK,CAAA,EAAG,CAAA,EAAG,UAAU,EAAA,EAAI,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,QAClC,KAAK,CAAA,EAAG,EAAA,GAAK,GAAG,EAAA,EAAI,EAAA,EAAI,IAAI,CAAC,CAAA;AAAA,QAC7B,IAAA,CAAK,KAAK,CAAA,EAAG,EAAA,GAAK,GAAG,EAAA,EAAI,EAAA,EAAI,IAAI,CAAC;AAAA,OACpC;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAM,CAAC,EAAA,EAAI,EAAA,EAAI,EAAA,EAAI,EAAE,CAAA,GAAI,CAAA;AACzB,IAAA,IAAI,KAAA,CAAM,CAAC,CAAA,KAAM,GAAA,EAAK;AACpB,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,WAAW,EAAA,EAAA,CAAK,SAAA,GAAY,CAAA,IAAK,IAAI,CAAC,CAAA;AACrE,MAAA,MAAM,CAAA,GAAI,KAAK,KAAA,CAAA,CAAO,QAAA,GAAW,IAAI,CAAA,KAAM,EAAA,GAAK,KAAK,EAAA,CAAG,CAAA;AACxD,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,KAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAA,CAAK,QAAA,GAAW,IAAI,CAAA,IAAK,GAAA,EAAK,CAAA,GAAI,EAAE,CAAC,CAAC,CAAA;AACpF,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,QAAA,EAAA,CAAW,QAAA,GAAW,CAAA,GAAI,CAAA,IAAK,IAAA,EAAM,CAAA,GAAI,EAAE,CAAC,CAAA;AAC3E,MAAA,MAAM,EAAA,GAAK,QAAA,GAAW,EAAA,GAAK,EAAA,GAAK,CAAA,GAAI,CAAA;AACpC,MAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,SAAA,GAAY,EAAA,GAAK,GAAG,CAAC,CAAA;AACzC,MAAA,KAAA,GAAQ;AAAA,QACN,KAAK,CAAA,EAAG,CAAA,EAAG,UAAU,EAAA,EAAI,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,QAClC,KAAK,CAAA,EAAG,EAAA,GAAK,GAAG,EAAA,EAAI,EAAA,EAAI,IAAI,CAAC,CAAA;AAAA,QAC7B,KAAK,EAAA,GAAK,CAAA,EAAG,KAAK,CAAA,EAAG,EAAA,EAAI,IAAI,CAAC,CAAA;AAAA,QAC9B,IAAA,CAAK,EAAA,GAAK,CAAA,GAAI,EAAA,GAAK,CAAA,EAAG,KAAK,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,CAAA,GAAI,CAAC;AAAA,OAC7C;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,CAAA,GAAI,SAAA;AACV,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,IAAI,EAAA,EAAA,CAAK,QAAA,GAAW,CAAA,IAAK,GAAG,CAAC,CAAA;AAC5D,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAA,CAAO,SAAA,GAAY,CAAA,GAAI,CAAA,KAAM,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,EAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAA;AACrE,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAE,CAAA;AAC5B,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,EAAE,CAAA;AAC5B,MAAA,MAAM,EAAA,GAAK,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,CAAA,GAAI,CAAA;AAC7B,MAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,IAAA,CAAK,IAAI,QAAA,GAAW,EAAA,GAAK,CAAA,EAAG,CAAC,CAAC,CAAA;AAC5D,MAAA,KAAA,GAAQ;AAAA,QACN,KAAK,CAAA,EAAG,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,QAC3B,KAAK,EAAA,GAAK,CAAA,EAAG,GAAG,EAAA,EAAI,EAAA,EAAI,IAAI,CAAC,CAAA;AAAA,QAC7B,KAAK,EAAA,GAAK,CAAA,EAAG,KAAK,CAAA,EAAG,EAAA,EAAI,IAAI,CAAC,CAAA;AAAA,QAC9B,IAAA,CAAK,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,EAAA,GAAK,IAAI,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,CAAA,GAAI,CAAC;AAAA,OAC7C;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,IACrD,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,GAAG,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,CAAA,GAAI,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,IACvD;AAAA,GACF;AACF;;;ACpPO,IAAM,iBAAA,GAAoB,CAAC,OAAA,KAChC,OAAA,CAAQ,iBAAA,GAAoB,CAAA,EAAA,EAAK,OAAA,CAAQ,iBAAiB,CAAA,CAAA,GAAK,CAAA,EAAA,EAAK,OAAA,CAAQ,EAAE,CAAA;AAEhF,IAAM,GAAA,GAAM,CAAC,CAAA,KAAc,MAAA,CAAO,CAAC,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAEpD,IAAM,aAAA,uBAAoB,GAAA,EAAiC;AAMpD,IAAM,aAAA,GAAgB,CAAC,IAAA,EAAY,QAAA,KAA8B;AACtE,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,OAAO,GAAG,IAAA,CAAK,WAAA,EAAa,CAAA,CAAA,EAAI,IAAI,IAAA,CAAK,QAAA,EAAS,GAAI,CAAC,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,IAAA,CAAK,OAAA,EAAS,CAAC,CAAA,CAAA;AAAA,EACjF;AACA,EAAA,IAAI,GAAA,GAAM,aAAA,CAAc,GAAA,CAAI,QAAQ,CAAA;AACpC,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,GAAA,GAAM,IAAI,IAAA,CAAK,cAAA,CAAe,OAAA,EAAS;AAAA,MACrC,QAAA;AAAA,MACA,IAAA,EAAM,SAAA;AAAA,MACN,KAAA,EAAO,SAAA;AAAA,MACP,GAAA,EAAK;AAAA,KACN,CAAA;AACD,IAAA,aAAA,CAAc,GAAA,CAAI,UAAU,GAAG,CAAA;AAAA,EACjC;AACA,EAAA,MAAM,QAAQ,MAAA,CAAO,WAAA,CAAY,GAAA,CAAI,aAAA,CAAc,IAAI,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,KAAK,CAAC,CAAC,CAAA;AACtF,EAAA,OAAO,CAAA,EAAG,MAAM,IAAI,CAAA,CAAA,EAAI,MAAM,KAAK,CAAA,CAAA,EAAI,MAAM,GAAG,CAAA,CAAA;AAClD;AAwCA,IAAM,mBAAA,GAAsB,CAAC,QAAA,KAC3B,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAI,CAAA,IAAK,QAAA,CAAS,CAAC,CAAA;AAOrC,IAAM,oBAAA,GAAuB,CAClC,QAAA,EACA,OAAA,KACwB;AACxB,EAAA,MAAM,QAAA,GAAA,CAAY,OAAA,CAAQ,WAAA,IAAe,GAAA,IAAO,GAAA;AAChD,EAAA,MAAM,WAAgC,EAAC;AACvC,EAAA,IAAI,aAAA,GAAgB,QAAQ,WAAA,IAAe,IAAA;AAC3C,EAAA,IAAI,IAAA,GACF,IAAA;AAEF,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,IAAI,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,QAAA,GAAW,IAAA;AAC9B,IAAA,IAAA,GAAO,IAAA;AAAA,EACT,CAAA;AAEA,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,CAAS,QAAQ,CAAA,EAAA,EAAK;AACxC,IAAA,MAAM,OAAA,GAAU,SAAS,CAAC,CAAA;AAC1B,IAAA,MAAM,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA;AACxC,IAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,MAAA,CAAO,MAAM,EAAE,CAAA,GAAI,IAAI,EAAE,CAAA;AAC/C,IAAA,MAAM,GAAA,GAAM,aAAA,CAAc,IAAA,EAAM,OAAA,CAAQ,QAAQ,CAAA;AAEhD,IAAA,IAAI,OAAA,GAAU,QAAA,CAAS,QAAA,CAAS,MAAA,GAAS,CAAC,CAAA;AAG1C,IAAA,IAAI,CAAC,OAAA,IAAW,GAAA,GAAM,OAAA,CAAQ,GAAA,EAAK;AACjC,MAAA,UAAA,EAAW;AACX,MAAA,OAAA,GAAU,EAAE,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,EAAC,EAAE;AAChC,MAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AAAA,IACvB;AAEA,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,SAAA,KAAc,OAAA,CAAQ,aAAA;AAC1C,IAAA,IACE,CAAC,aAAA,IACD,CAAC,GAAA,IACD,OAAA,CAAQ,MAAM,OAAA,CAAQ,WAAA,IACtB,OAAA,CAAQ,GAAA,GAAM,CAAA,EACd;AACA,MAAA,UAAA,EAAW;AACX,MAAA,OAAA,CAAQ,KAAK,IAAA,CAAK,EAAE,MAAM,QAAA,EAAU,GAAA,EAAK,UAAU,CAAA;AACnD,MAAA,aAAA,GAAgB,IAAA;AAAA,IAClB;AAEA,IAAA,IAAI,OAAA,CAAQ,SAAS,SAAA,EAAW;AAC9B,MAAA,UAAA,EAAW;AACX,MAAA,OAAA,CAAQ,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,SAAA,EAAW,KAAK,iBAAA,CAAkB,OAAO,CAAA,EAAG,OAAA,EAAS,CAAA;AAC/E,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,GAAQ,CAAC,OAAO,CAAA;AACpB,IAAA,IAAI,OAAA,CAAQ,kBAAkB,IAAA,EAAM;AAClC,MAAA,OACE,KAAA,CAAM,MAAA,GAAS,oBAAA,IACf,CAAA,GAAI,CAAA,GAAI,QAAA,CAAS,MAAA,IACjB,QAAA,CAAS,CAAA,GAAI,CAAC,CAAA,CAAG,IAAA,KAAS,SAAA,IAC1B,SAAS,CAAA,GAAI,CAAC,CAAA,CAAG,cAAA,KAAmB,OAAA,CAAQ,cAAA,IAC5C,QAAA,CAAS,CAAA,GAAI,CAAC,CAAA,CAAG,SAAA,KAAc,OAAA,CAAQ,SAAA,EACvC;AACA,QAAA,KAAA,GAAQ,CAAC,GAAG,KAAA,EAAO,QAAA,CAAS,EAAE,CAAC,CAAE,CAAA;AAAA,MACnC;AAAA,IACF;AAEA,IAAA,MAAM,SAAA,GACJ,SAAS,IAAA,IAAQ,IAAA,CAAK,WAAW,OAAA,CAAQ,SAAA,IAAa,EAAA,GAAK,IAAA,CAAK,EAAA,IAAM,QAAA;AACxE,IAAA,IAAI,CAAC,WAAW,UAAA,EAAW;AAE3B,IAAA,MAAM,GAAA,GAAoD;AAAA,MACxD,IAAA,EAAM,SAAA;AAAA,MACN,GAAA,EAAK,kBAAkB,OAAO,CAAA;AAAA,MAC9B,SAAS,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,mBAAA,CAAoB,KAAK,CAAA,GAAI,OAAA;AAAA,MACzD,QAAA,EAAU,KAAA;AAAA,MACV,GAAA;AAAA,MACA,YAAY,CAAC,SAAA;AAAA,MACb,QAAA,EAAU;AAAA,KACZ;AACA,IAAA,OAAA,CAAQ,IAAA,CAAK,KAAK,GAAG,CAAA;AACrB,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACnC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA;AACzC,IAAA,IAAA,GAAO,EAAE,MAAA,EAAQ,OAAA,CAAQ,SAAA,EAAW,EAAA,EAAI,MAAA,CAAO,KAAA,CAAM,MAAM,CAAA,GAAI,EAAA,GAAK,MAAA,EAAQ,GAAA,EAAI;AAAA,EAClF;AACA,EAAA,UAAA,EAAW;AACX,EAAA,OAAO,QAAA;AACT;;;AC/JO,IAAM,iBAAA,GAAiD;AAAA,EAC5D,UAAA,EAAY,EAAC,MAAA,EAAO,oIAAA,EAAgJ;AAAA,EACpK,cAAA,EAAgB,EAAC,MAAA,EAAO,+HAAA,EAA2I;AAAA,EACnK,aAAA,EAAe,EAAC,MAAA,EAAO,wKAAA,EAA0L;AAAA,EACjN,qBAAA,EAAuB,EAAC,MAAA,EAAO,oKAAA,EAAsL;AAAA,EACrN,iBAAA,EAAmB,EAAC,MAAA,EAAO,yKAAA,EAA2L;AAAA,EACtN,uBAAA,EAAyB,EAAC,MAAA,EAAO,wMAAA,EAAoN;AAAA,EACrP,sBAAA,EAAwB,EAAC,MAAA,EAAO,8HAAA,EAA0I;AAAA,EAC1K,qBAAA,EAAuB,EAAC,MAAA,EAAO,+HAAA,EAA2I;AAAA,EAC1K,qBAAA,EAAuB,EAAC,MAAA,EAAO,4HAAA,EAAwI;AAAA,EACvK,uBAAA,EAAyB,EAAC,MAAA,EAAO,4IAAA,EAAwJ;AAAA,EACzL,sBAAA,EAAwB,EAAC,MAAA,EAAO,6IAAA,EAAyJ;AAAA,EACzL,oBAAA,EAAsB,EAAC,MAAA,EAAO,sIAAA,EAAkJ;AAAA,EAChL,mBAAA,EAAqB,EAAC,MAAA,EAAO,qIAAA,EAAiJ;AAAA,EAC9K,aAAA,EAAe,EAAC,MAAA,EAAO,gIAAA,EAA4I;AAAA,EACnK,cAAA,EAAgB,EAAC,MAAA,EAAO,wHAAA,EAAoI;AAAA,EAC5J,eAAA,EAAiB,EAAC,MAAA,EAAO,8KAAA,EAA0L;AAAA,EACnN,gBAAA,EAAkB,EAAC,MAAA,EAAO,qLAAA,EAAuM;AAAA,EACjO,iBAAA,EAAmB,EAAC,MAAA,EAAO,8KAAA,EAAgM;AAAA,EAC3N,kBAAA,EAAoB,EAAC,MAAA,EAAO,8LAAA,EAA4M;AAAA,EACxO,mBAAA,EAAqB,EAAC,MAAA,EAAO,4LAAA,EAA0M;AAAA,EACvO,oBAAA,EAAsB,EAAC,MAAA,EAAO,sQAAA,EAAsR;AAAA,EACpT,sBAAA,EAAwB,EAAC,MAAA,EAAO,4LAAA,EAAwM;AAAA,EACxO,iBAAA,EAAmB,EAAC,MAAA,EAAO,gMAAA,EAA8M;AAAA,EACzO,aAAA,EAAe,EAAC,MAAA,EAAO,sOAAA,EAA8P;AAAA,EACrR,iBAAA,EAAmB,EAAC,MAAA,EAAO,wMAAA,EAAgO;AAAA,EAC3P,iBAAA,EAAmB,EAAC,MAAA,EAAO,sNAAA,EAAwO;AAAA,EACnQ,YAAA,EAAc,EAAC,MAAA,EAAO,2PAAA,EAA6Q;AAAA,EACnS,gBAAA,EAAkB,EAAC,MAAA,EAAO,oWAAA,EAAkX;AAAA,EAC5Y,eAAA,EAAiB,EAAC,MAAA,EAAO,uKAAA,EAAyL;AAAA,EAClN,eAAA,EAAiB,EAAC,MAAA,EAAO,4IAAA,EAAwJ;AAAA,EACjL,cAAA,EAAgB,EAAC,MAAA,EAAO,sQAAA,EAAkR;AAAA,EAC1S,cAAA,EAAgB,EAAC,MAAA,EAAO,kKAAA,EAAoL;AAAA,EAC5M,oBAAA,EAAsB,EAAC,MAAA,EAAO,mJAAA,EAA+J;AAAA,EAC7L,qBAAA,EAAuB,EAAC,MAAA,EAAO,sKAAA,EAAwL;AAAA,EACvN,cAAA,EAAgB,EAAC,MAAA,EAAO,0KAAA,EAAwL;AAAA,EAChN,cAAA,EAAgB,EAAC,MAAA,EAAO,2WAAA,EAAuX;AAAA,EAC/Y,eAAA,EAAiB,EAAC,MAAA,EAAO,yPAAA,EAAqQ;AAAA,EAC9R,YAAA,EAAc,EAAC,MAAA,EAAO,kUAAA,EAA8U;AAAA,EACpW,gBAAA,EAAkB,EAAC,MAAA,EAAO,wPAAA,EAAoQ;AAAA,EAC9R,gBAAA,EAAkB,EAAC,MAAA,EAAO,mNAAA,EAA+N;AAAA,EACzP,aAAA,EAAe,EAAC,MAAA,EAAO,kQAAA,EAA8Q;AAAA,EACrS,YAAA,EAAc,EAAC,MAAA,EAAO,gLAAA,EAAkM;AAAA,EACxN,kBAAA,EAAoB,EAAC,MAAA,EAAO,yOAAA,EAAqP;AAAA,EACjR,wBAAA,EAA0B,EAAC,MAAA,EAAO,yPAAA,EAAqQ;AAAA,EACvS,mBAAA,EAAqB,EAAC,MAAA,EAAO,kNAAA,EAAgO;AAAA,EAC7P,cAAA,EAAgB,EAAC,MAAA,EAAO,sPAAA,EAAoR;AAAA,EAC5S,gBAAA,EAAkB,EAAC,MAAA,EAAO,8LAAA,EAAgN;AAAA,EAC1O,aAAA,EAAe,EAAC,MAAA,EAAO,yQAAA,EAAqR;AAAA,EAC5S,iBAAA,EAAmB,EAAC,MAAA,EAAO,sRAAA,EAAkS;AAAA,EAC7T,gBAAA,EAAkB,EAAC,MAAA,EAAO,uNAAA,EAA6O;AAAA,EACvQ,aAAA,EAAe,EAAC,MAAA,EAAO,gNAAA,EAAsO;AAAA,EAC7P,kBAAA,EAAoB,EAAC,MAAA,EAAO,mRAAA,EAAiS;AAAA,EAC7T,8BAAA,EAAgC,EAAC,MAAA,EAAO,wbAAA;AAC1C,CAAA;;;AC9CA,IAAM,WAAW,IAAI,GAAA,CAAyB,MAAA,CAAO,OAAA,CAAQ,iBAAiB,CAAC,CAAA;AAExE,IAAM,eAAA,GAAkB,CAAC,IAAA,EAAc,IAAA,KAA4B;AACxE,EAAA,QAAA,CAAS,GAAA,CAAI,MAAM,IAAI,CAAA;AACzB;AAIO,IAAM,gBAAA,GAAmB,CAC9B,KAAA,KACS;AACT,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,CAAA,IAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG,QAAA,CAAS,GAAA,CAAI,IAAA,EAAM,IAAI,CAAA;AAC3E;AAEO,IAAM,UAAA,GAAa,CAAC,IAAA,KACzB,QAAA,CAAS,IAAI,IAAI;AAEZ,IAAM,UAAA,GAAa,CAAC,IAAA,KAA0B,QAAA,CAAS,IAAI,IAAI","file":"index.cjs","sourcesContent":["// AUTO-GENERATED by scripts/gen-tw-scales.mjs from @kungal/ui-tokens — do not edit.\n//\n// The Tailwind scale names KunUI mints itself. `cn()` feeds them to\n// tailwind-merge, which otherwise cannot parse them and silently keeps two\n// conflicting classes.\nexport const KUN_TW_SCALES = {\n radius: ['kun-full', 'kun-lg', 'kun-md', 'kun-none', 'kun-sm'],\n shadow: ['kun-lg', 'kun-md', 'kun-sm'],\n ease: ['kun-emphasized', 'kun-in', 'kun-out', 'kun-standard'],\n animate: ['bounce', 'bounceInDown', 'bounceInRight', 'fadeInUp', 'fadeOutDown', 'shake', 'swing', 'tada'],\n z: ['kun-alert', 'kun-message', 'kun-modal', 'kun-popover', 'kun-sticky'],\n duration: ['kun-base', 'kun-exit', 'kun-fast', 'kun-slow'],\n} as const\n","import { clsx, type ClassValue } from 'clsx'\nimport { extendTailwindMerge } from 'tailwind-merge'\nimport { KUN_TW_SCALES } from './twScales.generated'\n\n// tailwind-merge only ships Tailwind's OWN scales, so every name KunUI mints in\n// `@theme` / `@utility` was invisible to it and got passed through untouched:\n// `cn('rounded-kun-md', 'rounded-full')` returned both classes and left CSS\n// source order to pick the winner. Measured, a consumer passing\n// `classNames.trigger: 'rounded-full'` to KunSelect still rendered a 12px\n// radius — the documented \"your class wins\" contract was false for the whole\n// `rounded-kun-*`, `shadow-kun-*`, `z-kun-*`, `ease-kun-*` and `duration-kun-*`\n// surface.\n//\n// `shadow-kun-*` failed worse than the rest. The shadow COLOUR group's\n// validator accepts any non-arbitrary word, so `shadow-kun-md` was classified\n// as a colour: it resolved against `shadow-primary/20` and the box-shadow was\n// the class that got dropped.\n//\n// The scale names are generated from tokens.css (`pnpm gen`) because a drifted\n// hand-written list fails silently — nothing errors, the classes just stop\n// merging again.\nconst twMerge = extendTailwindMerge({\n extend: {\n theme: {\n radius: [...KUN_TW_SCALES.radius],\n shadow: [...KUN_TW_SCALES.shadow],\n ease: [...KUN_TW_SCALES.ease],\n animate: [...KUN_TW_SCALES.animate],\n },\n // z-index and transition-duration are not Tailwind v4 theme namespaces —\n // these are `@utility` blocks, so they extend the class group directly.\n classGroups: {\n z: [{ z: [...KUN_TW_SCALES.z] }],\n duration: [{ duration: [...KUN_TW_SCALES.duration] }],\n },\n },\n})\n\n// Merge Tailwind class names with conflict resolution. Framework-agnostic:\n// the Vue and React layers both import this so \"last class wins\" semantics\n// are identical everywhere.\nexport const cn = (...inputs: ClassValue[]): string => twMerge(clsx(inputs))\n\nexport type { ClassValue }\n","import type { KunUIVariant, KunUIColor } from './types'\n\n// Single source of truth for the variant × color → Tailwind class table.\n// Button / Badge / Chip / Tab / Info / Progress etc. (in every framework\n// layer) consume this so the 7 × 7 matrix lives in exactly one place.\n//\n// All keys MUST be static string literals so the Tailwind JIT picks them\n// up — never construct class names with template strings at runtime.\n// Every entry carries an explicit `border` WIDTH so the outline variant\n// `bordered` actually renders — `border-{color}` alone sets only the\n// color and paints nothing in Tailwind v4. Filled / light variants use a\n// transparent border of the same width so switching variants never shifts the\n// box by a pixel.\nconst TABLE: Record<KunUIVariant, Record<KunUIColor, string>> = {\n // Filled buttons keep white text in BOTH modes, so the fill must stay dark\n // enough for contrast. The dark color scale is inverted (`-500`/`-600` become\n // LIGHT in dark mode), so a plain `bg-{color}` renders pale — worst on the\n // light hues (info ≈ L88%, default/secondary ≈ L65–72%). Each entry pins a\n // `dark:bg-{color}-{n}` that lands every color at a consistent ~L44–55% so the\n // whole row reads as one saturated tier with legible white text.\n // Foreground: the dark hues take white; the light hues (success / warning /\n // info) are light in BOTH modes, so white text fails WCAG on them (~1.5–3.4:1)\n // — they take dark text (≈6–18:1). See kunSolidFgClasses.\n solid: {\n default: 'border border-transparent bg-default text-default-foreground',\n primary: 'border border-transparent bg-primary text-primary-foreground',\n secondary: 'border border-transparent bg-secondary text-secondary-foreground',\n success: 'border border-transparent bg-success text-success-foreground',\n warning: 'border border-transparent bg-warning text-warning-foreground',\n danger: 'border border-transparent bg-danger text-danger-foreground',\n info: 'border border-transparent bg-info text-info-foreground',\n },\n // `{c}-text`, not the fill: a fill used as text measured 1.75–4.42:1 on the\n // light page. The generator holds `{c}-text` at 4.5:1 on the page, on cards\n // and on the hue's 20% tint, so the hover fill and a flat chip stay readable.\n bordered: {\n default: 'border border-default bg-transparent',\n primary: 'border border-primary bg-transparent text-primary-text',\n secondary: 'border border-secondary bg-transparent text-secondary-text',\n success: 'border border-success bg-transparent text-success-text',\n warning: 'border border-warning bg-transparent text-warning-text',\n danger: 'border border-danger bg-transparent text-danger-text',\n info: 'border border-info bg-transparent text-info-text',\n },\n light: {\n default: 'border border-transparent bg-transparent hover:bg-default/20',\n primary: 'border border-transparent bg-transparent text-primary-text hover:bg-primary/20',\n secondary: 'border border-transparent bg-transparent text-secondary-text hover:bg-secondary/20',\n success: 'border border-transparent bg-transparent text-success-text hover:bg-success/20',\n warning: 'border border-transparent bg-transparent text-warning-text hover:bg-warning/20',\n danger: 'border border-transparent bg-transparent text-danger-text hover:bg-danger/20',\n info: 'border border-transparent bg-transparent text-info-text hover:bg-info/20',\n },\n flat: {\n default: 'border border-transparent bg-default/20 text-default-text',\n primary: 'border border-transparent bg-primary/20 text-primary-text',\n secondary: 'border border-transparent bg-secondary/20 text-secondary-text',\n success: 'border border-transparent bg-success/20 text-success-text',\n warning: 'border border-transparent bg-warning/20 text-warning-text',\n danger: 'border border-transparent bg-danger/20 text-danger-text',\n info: 'border border-transparent bg-info/20 text-info-text',\n },\n // Same fill logic as `solid` (see note above) plus a COLORED glow. The glow\n // needs both a size (`shadow-lg` — the geometry) AND a tint (`shadow-{color}/40`\n // — sets --tw-shadow-color): a color utility alone leaves --tw-shadow empty, so\n // the button rendered with NO shadow at all. `overflow-hidden` on the button\n // doesn't clip its own outset box-shadow, so the glow shows.\n shadow: {\n default: 'border border-transparent shadow-lg shadow-default/40 bg-default text-default-foreground',\n primary: 'border border-transparent shadow-lg shadow-primary/40 bg-primary text-primary-foreground',\n secondary: 'border border-transparent shadow-lg shadow-secondary/40 bg-secondary text-secondary-foreground',\n success: 'border border-transparent shadow-lg shadow-success/40 bg-success text-success-foreground',\n warning: 'border border-transparent shadow-lg shadow-warning/40 bg-warning text-warning-foreground',\n danger: 'border border-transparent shadow-lg shadow-danger/40 bg-danger text-danger-foreground',\n info: 'border border-transparent shadow-lg shadow-info/40 bg-info text-info-foreground',\n },\n}\n\nexport const kunVariantClasses = (\n variant: KunUIVariant,\n color: KunUIColor\n): string => TABLE[variant][color]\n\n// Static maps for narrower use cases (just the fill color, just the text\n// color, etc.) — same JIT-safety requirement: keys must be literals.\n\nexport const kunBgClasses: Record<KunUIColor, string> = {\n default: 'bg-default',\n primary: 'bg-primary',\n secondary: 'bg-secondary',\n success: 'bg-success',\n warning: 'bg-warning',\n danger: 'bg-danger',\n info: 'bg-info',\n}\n\n// ─── Solid fills (a colored fill that carries text / icons) ──────────────────\n// Each semantic color ships a paired on-color token — `--color-{c}` (the vivid\n// fill) + `--color-{c}-foreground` (the text that stays legible on it) — both\n// generated in OKLCH and WCAG-AA-verified in BOTH light and dark by\n// scripts/gen-tokens.mjs (the build fails if any pair regresses). So a solid is\n// just `bg-{c} text-{c}-foreground`: no per-color white/black guess, no `dark:`\n// pin (the tokens are mode-correct by construction). Medium hues land white,\n// the bright hues (magenta/green/cyan/amber) land a refined dark tint.\n// Reach for these — NOT plain `kunBgClasses` — whenever a colored fill carries a\n// foreground. `kunBgClasses` stays for tints / bars / dots that carry no text.\n\n/** Just the fill. Pair with {@link kunSolidFgClasses} when the fill and its text\n * live on different elements. */\nexport const kunSolidBgClasses: Record<KunUIColor, string> = {\n default: 'bg-default',\n primary: 'bg-primary',\n secondary: 'bg-secondary',\n success: 'bg-success',\n warning: 'bg-warning',\n danger: 'bg-danger',\n info: 'bg-info',\n}\n\n/** The generated on-color that stays legible on the matching solid fill in both\n * modes (white on medium hues, a dark hue-tint on the bright ones). */\nexport const kunSolidFgClasses: Record<KunUIColor, string> = {\n default: 'text-default-foreground',\n primary: 'text-primary-foreground',\n secondary: 'text-secondary-foreground',\n success: 'text-success-foreground',\n warning: 'text-warning-foreground',\n danger: 'text-danger-foreground',\n info: 'text-info-foreground',\n}\n\n/** Fill + matching foreground — the common case (text sits on the fill). */\nexport const kunSolidClasses: Record<KunUIColor, string> = {\n default: 'bg-default text-default-foreground',\n primary: 'bg-primary text-primary-foreground',\n secondary: 'bg-secondary text-secondary-foreground',\n success: 'bg-success text-success-foreground',\n warning: 'bg-warning text-warning-foreground',\n danger: 'bg-danger text-danger-foreground',\n info: 'bg-info text-info-foreground',\n}\n\nexport const kunTextClasses: Record<KunUIColor, string> = {\n default: 'text-foreground',\n primary: 'text-primary-text',\n secondary: 'text-secondary-text',\n success: 'text-success-text',\n warning: 'text-warning-text',\n danger: 'text-danger-text',\n info: 'text-info-text',\n}\n\nexport const kunBorderClasses: Record<KunUIColor, string> = {\n default: 'border-default',\n primary: 'border-primary',\n secondary: 'border-secondary',\n success: 'border-success',\n warning: 'border-warning',\n danger: 'border-danger',\n info: 'border-info',\n}\n\n/**\n * @deprecated Use {@link kunFocusRingClasses} (or {@link kunFocusRingWithinClasses}\n * for composite widgets). This mixed `:focus` + `:focus-within` so a mouse click\n * lit the ring, and used a different opacity from the rest of the library.\n */\nexport const kunRingClasses: Record<KunUIColor, string> = {\n default: 'focus-within:ring-default/40 focus:ring-default/40',\n primary: 'focus-within:ring-primary/40 focus:ring-primary/40',\n secondary: 'focus-within:ring-secondary/40 focus:ring-secondary/40',\n success: 'focus-within:ring-success/40 focus:ring-success/40',\n warning: 'focus-within:ring-warning/40 focus:ring-warning/40',\n danger: 'focus-within:ring-danger/40 focus:ring-danger/40',\n info: 'focus-within:ring-info/40 focus:ring-info/40',\n}\n\n/**\n * Unified focus ring — ONE recipe for every directly-focusable control (inputs,\n * textarea, select trigger, buttons, checkbox/radio, links, tabs, menu items…).\n * Keyboard focus only (`:focus-visible`, so a mouse click on a button shows no\n * ring; text fields still show it on click via the browser's focus-visible\n * heuristic). A flush 2px ring in the control's semantic color at 50% — replaces\n * the old scatter of `:focus`/`:focus-within` × `ring-1|2|4` × `/25|/40|/50|full`.\n * Pair with `border-kun` at rest; on an invalid control use the `danger` entry.\n */\nexport const kunFocusRingClasses: Record<KunUIColor, string> = {\n default: 'outline-none focus-visible:ring-2 focus-visible:ring-default/50',\n primary: 'outline-none focus-visible:ring-2 focus-visible:ring-primary/50',\n secondary: 'outline-none focus-visible:ring-2 focus-visible:ring-secondary/50',\n success: 'outline-none focus-visible:ring-2 focus-visible:ring-success/50',\n warning: 'outline-none focus-visible:ring-2 focus-visible:ring-warning/50',\n danger: 'outline-none focus-visible:ring-2 focus-visible:ring-danger/50',\n info: 'outline-none focus-visible:ring-2 focus-visible:ring-info/50',\n}\n\n/**\n * Composite-widget variant of {@link kunFocusRingClasses}: the focusable element\n * is an inner `<input>` but the ring should sit on the WRAPPER. Put this on the\n * wrapper and give the inner input `outline-none` (and no ring of its own) so\n * there's exactly one indicator. Used by KunNumberInput / KunTagInput.\n *\n * Uses `focus-within` (not `has-[:focus-visible]`): for a text-field wrapper the\n * two are equivalent — a text input matches `:focus-visible` on click too — and\n * `focus-within` is a native variant that reliably compiles, whereas the\n * `has-[:focus-visible]` arbitrary variant isn't extracted from this TS source.\n */\nexport const kunFocusRingWithinClasses: Record<KunUIColor, string> = {\n default: 'focus-within:ring-2 focus-within:ring-default/50',\n primary: 'focus-within:ring-2 focus-within:ring-primary/50',\n secondary: 'focus-within:ring-2 focus-within:ring-secondary/50',\n success: 'focus-within:ring-2 focus-within:ring-success/50',\n warning: 'focus-within:ring-2 focus-within:ring-warning/50',\n danger: 'focus-within:ring-2 focus-within:ring-danger/50',\n info: 'focus-within:ring-2 focus-within:ring-info/50',\n}\n\n// Very light tint of the semantic color — \"selected card\" backgrounds in\n// RadioGroup and any \"barely there\" colored fill. Keys are static literals.\nexport const kunSoftBgClasses: Record<KunUIColor, string> = {\n default: 'bg-default/5',\n primary: 'bg-primary/5',\n secondary: 'bg-secondary/5',\n success: 'bg-success/5',\n warning: 'bg-warning/5',\n danger: 'bg-danger/5',\n info: 'bg-info/5',\n}\n","import type { KunUIRounded } from './types'\n\n// Static class map for the 5-bucket Kun radius system. All keys are literal\n// strings so the Tailwind JIT picks them up — the `rounded-kun-*` utilities\n// come from the --radius-kun-* tokens shipped by @kungal/ui-tokens.\nexport const kunRoundedClasses: Record<KunUIRounded, string> = {\n none: 'rounded-kun-none',\n sm: 'rounded-kun-sm',\n md: 'rounded-kun-md',\n lg: 'rounded-kun-lg',\n full: 'rounded-kun-full',\n}\n\n// Global default radius bucket (matches the source layer's behaviour where\n// the un-configured fallback is 'md'). A render layer's config provider may\n// override this per subtree.\nexport const KUN_DEFAULT_ROUNDED: KunUIRounded = 'md'\n\n// Pure precedence resolver for a component's effective radius:\n// prop > component built-in fallback > app/provider default\n//\n// This is the framework-agnostic core of the original Vue\n// `useResolvedRounded` composable. Each render layer wraps it in its own\n// reactivity primitive:\n// Vue: computed(() => resolveRounded(props.rounded, fallback, cfg.rounded))\n// React: useMemo(() => resolveRounded(rounded, fallback, cfg.rounded), [...])\nexport const resolveRounded = (\n prop: KunUIRounded | undefined,\n fallback: KunUIRounded | undefined,\n configDefault: KunUIRounded = KUN_DEFAULT_ROUNDED\n): KunUIRounded => prop ?? fallback ?? configDefault\n\n// A floating panel has no correct `full`. `border-radius: 9999px` on an n-row\n// listbox is not a pill — CSS Backgrounds 3 §5.5 scales every corner by\n// min(side / sum of its radii), so the used radius is half the short side. A\n// measured 80x116 KunSelect popup rendered 40px corners and pushed its option\n// labels inward; the docs' own FilterBar example prescribed `rounded=\"full\"`\n// and shipped that. `full` means \"pill\", and a pill is only defined for a\n// single-line control. So a trigger + panel component keeps `full` on the\n// trigger and resolves the panel to `lg`, the bucket --radius-kun-lg documents\n// as \"containers / floating panels\". Every other bucket passes through.\nexport const kunPanelRoundedClass = (rounded: KunUIRounded): string =>\n kunRoundedClasses[rounded === 'full' ? 'lg' : rounded]\n","import type { KunUISize } from './types'\n\n// The single source of truth for the size of every text-like form control —\n// Button, Input, Select, DatePicker, Textarea, TagInput. They reference this so\n// they share one scale and line up in a row.\n//\n// Padding-driven (not fixed-height): height = font line-height + 2·py + border.\n// `md` is the anchor (~38px, the modern default). px:py is a clean 2:1 (xs/sm a\n// touch looser); horizontal padding grows faster than vertical from md→xl, so a\n// bigger control gets wider, not flatter. Approx heights with a 1px border and\n// text line-heights 16 / 20 / 20 / 24 / 28:\n// xs ≈ 26 · sm ≈ 34 · md ≈ 38 · lg ≈ 46 · xl ≈ 54\nexport const kunControlSizeClasses: Record<KunUISize, string> = {\n xs: 'text-xs px-2.5 py-1',\n sm: 'text-sm px-3.5 py-1.5',\n md: 'text-sm px-4 py-2',\n lg: 'text-base px-5 py-2.5',\n xl: 'text-lg px-6 py-3',\n}\n\n// Icon-only buttons: a fixed SQUARE whose side equals the text-button height at\n// the same size, so an icon button lines up with text buttons in a row.\n//\n// Why this exists: kunControlSizeClasses is padding-driven (height = line-height\n// + 2·py + border). A text label contributes a full line-box (≈1.5em), but a lone\n// 1em icon does not — with the same padding the icon button would come out\n// shorter and break the row. Mainstream libraries dodge this by giving buttons a\n// fixed height and making the icon button a square of that height (shadcn\n// `size-9`, HeroUI/Chakra/Ant `isIconOnly`/`.ant-btn-icon-only`). We do the same,\n// ONLY for icon-only, keeping the icon at its natural 1em centered in the box.\n//\n// Sides MUST equal the kunControlSizeClasses heights (incl. the 1px border every\n// variant carries): xs 26 · sm 34 · md 38 · lg 46 · xl 54. (size-* is border-box,\n// so the value already accounts for the icon button's own 1px border.)\nexport const kunControlSquareClasses: Record<KunUISize, string> = {\n xs: 'size-[26px] p-0',\n sm: 'size-[34px] p-0',\n md: 'size-[38px] p-0',\n lg: 'size-[46px] p-0',\n xl: 'size-[54px] p-0',\n}\n\nexport interface KunSelectionSize {\n box: string // the square: checkbox box / radio indicator outer ring\n dot: string // radio's inner filled dot (unused by checkbox)\n check: string // checkbox's check glyph (unused by radio)\n text: string // the adjacent label\n gap: string // box ↔ label spacing\n}\n\n// The shared scale for selection controls — KunCheckBox and KunRadioGroup use\n// identical box sizes (every major library does this), so a checkbox and a radio\n// of the same size match. The box is ≈ 0.5× the text-control height and ≈ 1.2–1.4×\n// the label font, so it sits optically level with the label beside it.\n// Box px by size: 12 / 14 / 16 / 20 / 24.\nexport const kunSelectionSizeClasses: Record<KunUISize, KunSelectionSize> = {\n xs: { box: 'size-3', dot: 'size-1.5', check: 'size-2', text: 'text-xs', gap: 'gap-1.5' },\n sm: { box: 'size-3.5', dot: 'size-1.5', check: 'size-2.5', text: 'text-sm', gap: 'gap-2' },\n md: { box: 'size-4', dot: 'size-2', check: 'size-3', text: 'text-sm', gap: 'gap-2' },\n lg: { box: 'size-5', dot: 'size-2.5', check: 'size-3.5', text: 'text-base', gap: 'gap-2.5' },\n xl: { box: 'size-6', dot: 'size-3', check: 'size-4', text: 'text-lg', gap: 'gap-3' },\n}\n\n// The single source of truth for chip / tag pills — a standalone KunChip and the\n// tags inside KunTagInput share it, so a tag looks identical either way. A\n// compact sub-scale (~0.7× the form-control height): vertical padding is tighter\n// than kunControlSizeClasses because a chip is text + tight padding, not a tap\n// target. Pair with `gap-1` + `rounded-full`.\nexport const kunChipSizeClasses: Record<KunUISize, string> = {\n xs: 'px-2 py-0.5 text-xs',\n sm: 'px-2 py-1 text-xs',\n md: 'px-3 py-1 text-sm',\n lg: 'px-4 py-1.5 text-sm',\n xl: 'px-6 py-2 text-base',\n}\n","// AUTO-GENERATED by scripts/gen-motion.mjs from\n// packages/ui-tokens/scripts/motion-physics.mjs — do not edit.\n\n/**\n * The ballistic model behind `KunShatter`, as data — outward impulse, air\n * drag (`1 − (1−t)^dragExponent`), gravity as a t² acceleration — sampled\n * into `keyframeSteps` linear keyframes per shard. The same manifest\n * generates `KunShatterPhysics` in the kun_ui_tokens pub package, so the\n * web and Flutter renditions of the motion cannot drift. Tune the feel in\n * the manifest, never inline in a component.\n */\nexport const KUN_SHATTER_PHYSICS = {\n keyframeSteps: 16,\n reachFactor: 0.5,\n launchMin: 0.32,\n launchSpan: 0.55,\n verticalFactor: 0.8,\n gravityMin: 0.85,\n gravitySpan: 0.5,\n dragExponent: 1.7,\n scaleEndMin: 0.8,\n scaleEndSpan: 0.16,\n fadeOutStartMin: 0.5,\n fadeOutStartSpan: 0.18,\n settleExponent: 2,\n fadeInWindow: 0.4,\n staggerFraction: 0.22,\n staggerCapMs: 120,\n defaultDurationMs: 1100,\n defaultRotationDeg: 140,\n} as const\n\n/**\n * Drag-to-dismiss on a bottom sheet, as data: dismiss on release when the\n * sheet moved down and either the release velocity exceeds `closeVelocity`\n * (px/ms) or the offset reaches `closeDistanceRatio` of the panel height\n * (capped at the viewport); an upward drag of d px moves the panel\n * `rubberBandLimit × (1 − e^(−d / rubberBandLimit))`. The same manifest\n * generates `KunSwipeDismissPhysics` in kun_ui_tokens.\n */\nexport const KUN_SWIPE_DISMISS_PHYSICS = {\n closeDistanceRatio: 0.25,\n closeVelocity: 0.4,\n rubberBandLimit: 32,\n} as const\n","import type { KunMessagePath, KunMessages } from './types'\n\n// Resolve one message and substitute its `{name}` placeholders. Framework-free\n// on purpose: each render layer binds it to however that layer holds the\n// active locale.\n//\n// A `{name}` with no matching param is left as written rather than blanked —\n// a missing interpolation should be visible in the UI, not silently produce a\n// half-sentence.\nexport const translateKunMessage = (\n messages: KunMessages,\n path: KunMessagePath,\n params?: Record<string, string | number>\n): string => {\n const [namespace, key] = path.split('.') as [keyof KunMessages, string]\n const group = messages[namespace] as Record<string, string> | undefined\n const template = group?.[key]\n\n if (typeof template !== 'string') {\n // NODE_ENV, not import.meta.env.DEV: Vite folds the latter to false when it\n // builds a consuming package, which strips the warning from the bundle.\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `[KunUI] no locale message at \"${path}\". A custom locale must supply every key in KunMessages.`\n )\n }\n return path\n }\n\n if (!params) return template\n return template.replace(/\\{(\\w+)\\}/g, (raw, name: string) =>\n params[name] === undefined ? raw : String(params[name])\n )\n}\n","{\n \"name\": \"简体中文\",\n \"code\": \"zh-CN\",\n \"messages\": {\n \"alert\": {\n \"title\": \"确认\",\n \"confirm\": \"确定\",\n \"cancel\": \"取消\"\n },\n \"autocomplete\": {\n \"clear\": \"清除\",\n \"loading\": \"加载中…\",\n \"noResult\": \"无匹配项\"\n },\n \"avatar\": {\n \"unknownUser\": \"未知用户\"\n },\n \"avatarGroup\": {\n \"label\": \"{count} 位用户\"\n },\n \"banner\": {\n \"label\": \"公告\",\n \"close\": \"关闭公告\"\n },\n \"carousel\": {\n \"label\": \"轮播\",\n \"prev\": \"上一张\",\n \"next\": \"下一张\",\n \"nav\": \"轮播导航\",\n \"goto\": \"跳到第 {index} 张\"\n },\n \"chat\": {\n \"deletedUser\": \"已注销用户\",\n \"you\": \"你\",\n \"senderPrefix\": \"{name}:\",\n \"today\": \"今天\",\n \"yesterday\": \"昨天\",\n \"unreadDivider\": \"以下为未读消息\",\n \"edited\": \"已编辑\",\n \"deletedMessage\": \"消息已删除\",\n \"photo\": \"图片\",\n \"album\": \"{count} 张图片\",\n \"media\": \"媒体\",\n \"draft\": \"草稿:\",\n \"messages\": \"消息\",\n \"empty\": \"还没有消息\",\n \"loading\": \"加载中…\",\n \"scrollToBottom\": \"回到底部\",\n \"scrollToBottomUnread\": \"回到底部,{count} 条新消息\",\n \"unreadCount\": \"{count} 条未读消息\",\n \"mentioned\": \"有人提到了你\",\n \"pinned\": \"已置顶\",\n \"muted\": \"已静音\",\n \"photoFrom\": \"{name} 发送的图片\",\n \"openLink\": \"打开链接 {url}\",\n \"reactions\": \"回应\",\n \"reactionCount\": \"{label},{count} 人\",\n \"back\": \"返回\",\n \"members\": \"{count} 位成员\"\n },\n \"chatComposer\": {\n \"placeholder\": \"发消息…\",\n \"send\": \"发送\",\n \"save\": \"保存\",\n \"attach\": \"添加图片\",\n \"removeAttachment\": \"移除附件\",\n \"retryAttachment\": \"上传失败,点击重试\",\n \"replyTo\": \"回复 {name}\",\n \"quoteFrom\": \"引用 {name}\",\n \"editing\": \"编辑消息\",\n \"cancelReply\": \"取消回复\",\n \"cancelEdit\": \"取消编辑\",\n \"remaining\": \"还可输入 {count} 字\",\n \"overLimit\": \"超出 {count} 字\",\n \"dropHint\": \"松开以添加图片\"\n },\n \"chatMenu\": {\n \"label\": \"消息操作\",\n \"reply\": \"回复\",\n \"quote\": \"引用\",\n \"copy\": \"复制\",\n \"copied\": \"已复制\",\n \"edit\": \"编辑\",\n \"pin\": \"置顶\",\n \"unpin\": \"取消置顶\",\n \"delete\": \"删除\",\n \"report\": \"举报\",\n \"retry\": \"重新发送\",\n \"moreReactions\": \"更多回应\",\n \"fewerReactions\": \"收起回应\"\n },\n \"chatPinned\": {\n \"label\": \"置顶消息\",\n \"indexed\": \"置顶消息 #{index}\",\n \"unpin\": \"取消置顶\"\n },\n \"chatRequest\": {\n \"title\": \"消息请求\",\n \"description\": \"{name} 想给你发消息。接受之前,对方看不到你是否已读。\",\n \"accept\": \"接受\",\n \"delete\": \"删除\",\n \"block\": \"拉黑\",\n \"report\": \"举报\"\n },\n \"chatService\": {\n \"groupCreated\": \"{actor} 创建了群组\",\n \"groupCreatedTitled\": \"{actor} 创建了群组「{title}」\",\n \"membersAdded\": \"{actor} 邀请了 {users}\",\n \"memberJoined\": \"{actor} 加入了群组\",\n \"memberLeft\": \"{actor} 退出了群组\",\n \"memberRemoved\": \"{actor} 将 {user} 移出了群组\",\n \"titleChanged\": \"{actor} 将群名改为「{title}」\",\n \"photoChanged\": \"{actor} 更换了群头像\",\n \"messagePinned\": \"{actor} 置顶了「{text}」\",\n \"messagePinnedMedia\": \"{actor} 置顶了一条消息\",\n \"joinedByLink\": \"{actor} 通过邀请链接加入了群组\"\n },\n \"chatStatus\": {\n \"sending\": \"发送中\",\n \"sent\": \"已发送\",\n \"read\": \"已读\",\n \"failed\": \"发送失败,点击重试\"\n },\n \"chatTyping\": {\n \"typing\": \"正在输入…\",\n \"one\": \"{name} 正在输入…\",\n \"several\": \"{names} 正在输入…\",\n \"many\": \"{name} 等 {count} 人正在输入…\"\n },\n \"chip\": {\n \"remove\": \"移除\"\n },\n \"commandPalette\": {\n \"placeholder\": \"搜索…\",\n \"empty\": \"输入关键字搜索\",\n \"noResult\": \"无结果\",\n \"loading\": \"加载中…\",\n \"close\": \"关闭\",\n \"hintSelect\": \"选择\",\n \"hintOpen\": \"打开\",\n \"hintClose\": \"关闭\",\n \"resultCount\": \"{count} 条结果\"\n },\n \"copy\": {\n \"copied\": \"已复制\",\n \"success\": \"{text} 复制成功\",\n \"failure\": \"{text} 复制失败! 请更换更现代的浏览器!\"\n },\n \"datePicker\": {\n \"placeholderDay\": \"请选择日期\",\n \"placeholderMonth\": \"请选择月份\",\n \"placeholderYear\": \"请选择年份\",\n \"clear\": \"清空\",\n \"today\": \"今天\",\n \"close\": \"关闭\",\n \"prevYear\": \"上一年\",\n \"nextYear\": \"下一年\",\n \"prevPage\": \"上一{unit}\",\n \"nextPage\": \"下一{unit}\",\n \"zoomOut\": \"{label} — 返回上一级\",\n \"unitMonth\": \"月\",\n \"unitYear\": \"年\",\n \"unitDecade\": \"个十年\",\n \"monthCell\": \"{year}年{month}\"\n },\n \"drawer\": {\n \"close\": \"关闭抽屉\"\n },\n \"fileInput\": {\n \"trigger\": \"选择文件\",\n \"selected\": \"已选 {count} 个文件\"\n },\n \"filePicker\": {\n \"tooLarge\": \"{name} 超过大小限制 ({size})\"\n },\n \"input\": {\n \"clear\": \"清除\",\n \"reveal\": \"显示密码\",\n \"hide\": \"隐藏密码\"\n },\n \"kbd\": {\n \"control\": \"Ctrl\",\n \"alt\": \"Alt\",\n \"option\": \"Option\",\n \"shift\": \"Shift\",\n \"command\": \"Command\",\n \"meta\": \"Windows 键\",\n \"enter\": \"回车\",\n \"escape\": \"Esc\",\n \"backspace\": \"退格\",\n \"delete\": \"删除\",\n \"tab\": \"Tab\",\n \"space\": \"空格\",\n \"up\": \"上箭头\",\n \"down\": \"下箭头\",\n \"left\": \"左箭头\",\n \"right\": \"右箭头\",\n \"pageUp\": \"向上翻页\",\n \"pageDown\": \"向下翻页\",\n \"home\": \"Home\",\n \"end\": \"End\",\n \"plus\": \"加号\",\n \"then\": \"然后\"\n },\n \"lightbox\": {\n \"label\": \"图片查看器\",\n \"close\": \"关闭\",\n \"prev\": \"上一张\",\n \"next\": \"下一张\",\n \"goto\": \"跳转到第 {index} 张\",\n \"zoomIn\": \"放大\",\n \"zoomOut\": \"缩小\",\n \"rotateLeft\": \"向左旋转 90°\",\n \"rotateRight\": \"向右旋转 90°\",\n \"reset\": \"重置缩放/旋转/位置\",\n \"download\": \"下载\"\n },\n \"lightboxGallery\": {\n \"view\": \"查看大图\"\n },\n \"loading\": {\n \"description\": \"正在摸鱼中...咕咕咕\"\n },\n \"loli\": {\n \"close\": \"关闭\"\n },\n \"message\": {\n \"close\": \"关闭\"\n },\n \"modal\": {\n \"close\": \"关闭\"\n },\n \"null\": {\n \"description\": \"莲说这里什么都没有\"\n },\n \"numberInput\": {\n \"decrement\": \"减少\",\n \"increment\": \"增加\"\n },\n \"pagination\": {\n \"nav\": \"分页导航\",\n \"prev\": \"上一页\",\n \"next\": \"下一页\",\n \"page\": \"第 {page} 页\",\n \"hintBefore\": \"您可以使用\",\n \"hintAfter\": \"来进行快速翻页\",\n \"jumpLabel\": \"跳转到页数\",\n \"jump\": \"跳转\"\n },\n \"pinInput\": {\n \"label\": \"验证码\",\n \"digit\": \"{label} 第 {index} 位\"\n },\n \"reaction\": {\n \"label\": \"点赞\"\n },\n \"select\": {\n \"searchPlaceholder\": \"搜索…\",\n \"noResult\": \"无匹配项\",\n \"loading\": \"加载中…\",\n \"clear\": \"清除\",\n \"removeOption\": \"移除 {label}\"\n },\n \"splitPane\": {\n \"handle\": \"调整分栏宽度\"\n },\n \"spoiler\": {\n \"copyCode\": \"复制代码\",\n \"reveal\": \"剧透内容,点击或按回车显示\"\n },\n \"steps\": {\n \"completed\": \"已完成:{title}\",\n \"current\": \"当前步骤:{title}\",\n \"pending\": \"未开始:{title}\",\n \"error\": \"出错:{title}\"\n },\n \"tagInput\": {\n \"tag\": \"标签 {tag}\",\n \"removeTag\": \"移除标签 {tag}\"\n },\n \"textSelection\": {\n \"copy\": \"复制\",\n \"cut\": \"剪切\",\n \"paste\": \"粘贴\",\n \"selectAll\": \"全选\",\n \"share\": \"分享\",\n \"lookUp\": \"查询\",\n \"searchWeb\": \"搜索\"\n },\n \"upload\": {\n \"imageAlt\": \"上传图片\",\n \"cropTitle\": \"裁剪图片\",\n \"cancel\": \"取消\",\n \"confirm\": \"确定\"\n }\n }\n}\n","import raw from './zh-CN.json'\nimport type { KunMessageCatalog } from './types'\n\n// KunUI's built-in default. The strings are the ones the components used to\n// hold inline, reproduced verbatim, so adopting the locale system changed no\n// rendered output.\n//\n// The catalog is JSON rather than a TypeScript literal because one file feeds\n// both the web bundle and the generated kun_ui_messages pub package, and a\n// Node generator can read JSON without evaluating TypeScript. The annotation\n// below is what type-checks it: a key missing from KunMessages fails the build.\nexport const KUN_CATALOG_ZH_CN: KunMessageCatalog = raw\n","// Keyboard-shortcut display: the parser, the per-platform labels and the\n// modifier order behind KunKbd, KunTooltip's `shortcut` and the menu items'\n// `shortcut`. Display only — binding the key is the app's job.\n//\n// The grammar is aria-keyshortcuts' (`+` joins a chord, whitespace separates a\n// sequence) plus `Mod`, the key that is ⌘ on Apple and Ctrl everywhere else,\n// the same abstraction as tinykeys' `$mod`, ProseMirror's `Mod-` and GitHub\n// Primer's KeybindingHint. Names are case-insensitive and take the common\n// aliases, so `cmd+shift+p` and `Shift+Mod+P` resolve to the same chord.\n\nexport type KunShortcutPlatform = 'apple' | 'other'\n\n/** Keys whose spoken name comes from the locale (`kbd.<name>`) rather than\n * from the label: a glyph such as ⌘ or ↑, or an abbreviation such as Esc. */\nexport type KunKbdKeyName =\n | 'control'\n | 'alt'\n | 'option'\n | 'shift'\n | 'command'\n | 'meta'\n | 'enter'\n | 'escape'\n | 'backspace'\n | 'delete'\n | 'tab'\n | 'space'\n | 'up'\n | 'down'\n | 'left'\n | 'right'\n | 'pageUp'\n | 'pageDown'\n | 'home'\n | 'end'\n | 'plus'\n\nexport interface KunShortcutKey {\n /** Canonical key: `Control`, `Alt`, `Shift`, `Meta`, `Enter`, `ArrowUp`, `K`, `+`… */\n key: string\n /** What the key shows on this platform: `⌘`, `Ctrl`, `K`. */\n label: string\n /** The locale key (under `kbd`) a screen reader hears instead of `label`;\n * null when the label reads as itself (a letter, a digit, F5). */\n spoken: KunKbdKeyName | null\n}\n\nconst ALIASES: Record<string, string> = {\n mod: 'Mod',\n ctrl: 'Control',\n control: 'Control',\n alt: 'Alt',\n option: 'Alt',\n opt: 'Alt',\n shift: 'Shift',\n meta: 'Meta',\n cmd: 'Meta',\n command: 'Meta',\n super: 'Meta',\n win: 'Meta',\n enter: 'Enter',\n return: 'Enter',\n esc: 'Escape',\n escape: 'Escape',\n backspace: 'Backspace',\n del: 'Delete',\n delete: 'Delete',\n tab: 'Tab',\n space: 'Space',\n spacebar: 'Space',\n up: 'ArrowUp',\n arrowup: 'ArrowUp',\n down: 'ArrowDown',\n arrowdown: 'ArrowDown',\n left: 'ArrowLeft',\n arrowleft: 'ArrowLeft',\n right: 'ArrowRight',\n arrowright: 'ArrowRight',\n pageup: 'PageUp',\n pgup: 'PageUp',\n pagedown: 'PageDown',\n pgdn: 'PageDown',\n home: 'Home',\n end: 'End',\n plus: '+',\n}\n\n// Apple's Human Interface Guidelines list modifiers as Control, Option, Shift,\n// Command (⌃⌥⇧⌘). Elsewhere this follows Primer's KeybindingHint: Ctrl, Win,\n// Alt, Shift. A chord is sorted into that order whatever order it was written\n// in, so one command table renders consistently.\nconst MODIFIER_ORDER: Record<KunShortcutPlatform, string[]> = {\n apple: ['Control', 'Alt', 'Shift', 'Meta'],\n other: ['Control', 'Meta', 'Alt', 'Shift'],\n}\n\ntype KeyDisplay = { apple: string; other: string; spoken: (p: KunShortcutPlatform) => KunKbdKeyName }\n\nconst NAMED: Record<string, KeyDisplay> = {\n Control: { apple: '⌃', other: 'Ctrl', spoken: () => 'control' },\n Alt: { apple: '⌥', other: 'Alt', spoken: (p) => (p === 'apple' ? 'option' : 'alt') },\n Shift: { apple: '⇧', other: 'Shift', spoken: () => 'shift' },\n Meta: { apple: '⌘', other: 'Win', spoken: (p) => (p === 'apple' ? 'command' : 'meta') },\n Enter: { apple: '↩', other: 'Enter', spoken: () => 'enter' },\n Escape: { apple: 'Esc', other: 'Esc', spoken: () => 'escape' },\n Backspace: { apple: '⌫', other: 'Backspace', spoken: () => 'backspace' },\n Delete: { apple: '⌦', other: 'Del', spoken: () => 'delete' },\n Tab: { apple: '⇥', other: 'Tab', spoken: () => 'tab' },\n Space: { apple: 'Space', other: 'Space', spoken: () => 'space' },\n ArrowUp: { apple: '↑', other: '↑', spoken: () => 'up' },\n ArrowDown: { apple: '↓', other: '↓', spoken: () => 'down' },\n ArrowLeft: { apple: '←', other: '←', spoken: () => 'left' },\n ArrowRight: { apple: '→', other: '→', spoken: () => 'right' },\n PageUp: { apple: 'PgUp', other: 'PgUp', spoken: () => 'pageUp' },\n PageDown: { apple: 'PgDn', other: 'PgDn', spoken: () => 'pageDown' },\n Home: { apple: 'Home', other: 'Home', spoken: () => 'home' },\n End: { apple: 'End', other: 'End', spoken: () => 'end' },\n '+': { apple: '+', other: '+', spoken: () => 'plus' },\n}\n\nconst canonicalKey = (token: string): string => {\n const alias = ALIASES[token.toLowerCase()]\n if (alias) return alias\n if (/^f\\d{1,2}$/i.test(token)) return token.toUpperCase()\n return token.length === 1 ? token.toUpperCase() : token\n}\n\n// `Mod++` is Mod and the plus key, and a lone `+` is the plus key: a `+` that\n// has nothing after it is a key, not a joiner.\nconst splitChord = (chord: string): string[] => {\n if (chord === '+') return ['+']\n const plusKey = chord.endsWith('++')\n const body = plusKey ? chord.slice(0, -2) : chord\n const keys = body.split('+').filter(Boolean)\n return plusKey ? [...keys, '+'] : keys\n}\n\n/** Parse a shortcut into its chords of canonical key names, `Mod` unresolved:\n * `'Shift+cmd+Z'` → `[['Shift', 'Meta', 'Z']]`, `'G G'` → `[['G'], ['G']]`. */\nexport const parseKunShortcut = (keys: string): string[][] =>\n keys\n .trim()\n .split(/\\s+/)\n .filter(Boolean)\n .map((chord) => splitChord(chord).map(canonicalKey))\n .filter((chord) => chord.length > 0)\n\n/** Resolve a shortcut for one platform: `Mod` becomes Meta on Apple and\n * Control elsewhere, repeated modifiers collapse, modifiers are sorted into\n * the platform's order, and every key carries its label and spoken name. */\nexport const resolveKunShortcut = (\n keys: string,\n platform: KunShortcutPlatform\n): KunShortcutKey[][] => {\n const order = MODIFIER_ORDER[platform]\n return parseKunShortcut(keys).map((chord) => {\n const resolved = chord.map((key) =>\n key === 'Mod' ? (platform === 'apple' ? 'Meta' : 'Control') : key\n )\n const modifiers = order.filter((m) => resolved.includes(m))\n const rest = resolved.filter((k, i) => !order.includes(k) && resolved.indexOf(k) === i)\n return [...modifiers, ...rest].map((key) => {\n const named = NAMED[key]\n return named\n ? { key, label: named[platform], spoken: named.spoken(platform) }\n : { key, label: key, spoken: null }\n })\n })\n}\n\n/** One-line form, as a menu shows it: `⇧⌘Z` on Apple (no joiner, the macOS\n * menu convention) and `Ctrl+Shift+Z` elsewhere; chords of a sequence are\n * separated by a space. */\nexport const formatKunShortcut = (keys: string, platform: KunShortcutPlatform): string =>\n resolveKunShortcut(keys, platform)\n .map((chord) => chord.map((k) => k.label).join(platform === 'apple' ? '' : '+'))\n .join(' ')\n\n/** What a screen reader should hear: `Command Shift Z`, chords of a sequence\n * joined by the locale's \"then\". `name` maps a spoken key to its word. */\nexport const speakKunShortcut = (\n sequence: KunShortcutKey[][],\n name: (key: KunKbdKeyName) => string,\n then: string\n): string =>\n sequence\n .map((chord) => chord.map((k) => (k.spoken ? name(k.spoken) : k.label)).join(' '))\n .join(` ${then} `)\n","// The menu entry list behind KunContextMenu and KunDropdown, framework-free so\n// the Flutter port collapses separators the same way.\n\n/** Drop separators that would render as stray lines: leading, trailing, and\n * all but the first of a run. An app filters one command table per context\n * (no \"Delete\" for a post you do not own) and its separators have to follow;\n * React Spectrum S2 hides the same three cases. */\nexport const normalizeKunMenuSeparators = <T extends { type?: string }>(\n entries: readonly T[]\n): T[] => {\n const out: T[] = []\n for (const entry of entries) {\n const last = out[out.length - 1]\n if (entry.type === 'separator' && (!last || last.type === 'separator')) continue\n out.push(entry)\n }\n while (out.length && out[out.length - 1]!.type === 'separator') out.pop()\n return out\n}\n","// The width rule behind KunSplitPane's divider, framework-free so the Flutter\n// port snaps to the same widths.\n\nexport interface KunSplitSizeOptions {\n min: number\n max: number\n /** Widths the divider is pulled to when it comes within `snapThreshold`. */\n snapPoints?: readonly number[]\n snapThreshold?: number\n /** The width a keyboard step starts from. A snap may not cancel or reverse\n * that step: with a 5 px step inside an 8 px threshold, the divider would\n * otherwise never leave a snap point. A drag leaves it unset, so the\n * divider sticks to a snap point until the pointer pulls clear. */\n from?: number\n}\n\n/** Clamp a requested width into [min, max], pull it to the nearest snap point\n * within the threshold, and round it to a whole pixel. */\nexport const resolveKunSplitSize = (\n raw: number,\n { min, max, snapPoints = [], snapThreshold = 8, from }: KunSplitSizeOptions\n): number => {\n const lo = Math.min(min, max)\n const hi = Math.max(min, max)\n const clamped = Math.min(Math.max(raw, lo), hi)\n let best = clamped\n let bestDistance = Infinity\n for (const point of snapPoints) {\n if (point < lo || point > hi) continue\n const distance = Math.abs(point - clamped)\n if (distance <= snapThreshold && distance < bestDistance) {\n best = point\n bestDistance = distance\n }\n }\n if (from !== undefined && Math.sign(best - from) !== Math.sign(clamped - from)) best = clamped\n return Math.round(best)\n}\n","// Generate a random integer within an inclusive [lower, upper] range.\nexport const randomNum = (lowerValue: number, upperValue: number): number =>\n Math.floor(Math.random() * (upperValue - lowerValue + 1) + lowerValue)\n","// Decode a possibly percent-encoded string, returning the original when it\n// is not encoded (or when decoding throws on malformed input).\nexport const decodeIfEncoded = (text: string): string => {\n try {\n const decoded = decodeURIComponent(text)\n return decoded !== text ? decoded : text\n } catch {\n return text\n }\n}\n","// AUTO-GENERATED — do not edit by hand.\n// The terminal avatar fallback, inlined as a base64 webp data URI (128x128,\n// 5318 B) so it needs ZERO consumer setup and makes NO network request — the\n// same no-fetch policy as the bundled icons and KunNull's mascot.\n//\n// This is what renders when the host has configured no avatar pool AND when a\n// pool URL itself fails to load. It is a data URI on purpose: the incident it\n// exists for is a CDN path that 404'd for every avatar-less account across\n// six sites at once, so the LAST fallback in the chain must not be reachable\n// over a network at all.\n//\n// Source: the first official KUN Galgame sticker (image hash d52ac5fb…), the\n// site's de-facto mascot.\n/* eslint-disable */\n/* prettier-ignore */\nexport const KUN_AVATAR_FALLBACK =\n 'data:image/webp;base64,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'\n","import { KUN_AVATAR_FALLBACK } from './avatarFallbackImage'\n\n// The predecessor of this file hardcoded `https://sticker.kungal.com` plus a\n// `/stickers/KUNgal{pack}/{n}.webp` path and a pack/per-pack count. That path\n// addressed a POSITION IN A MUTABLE COLLECTION on a site KunUI does not own,\n// so when that site stopped serving static files every avatar-less account\n// across six consumers 404'd at once. A URL that names another service does\n// not belong in a component library: the host supplies the pool\n// (`useKunUIConfig().avatarFallbackPool`), KunUI only chooses from it.\n\nconst hash = (value: string): number => {\n let h = 0\n for (let i = 0; i < value.length; i++) {\n h = (Math.imul(h, 31) + value.charCodeAt(i)) >>> 0\n }\n return h\n}\n\n/**\n * Deterministically pick one image from an avatar fallback pool.\n *\n * The same `seed` always yields the same entry on server and client, so there\n * is no hydration mismatch and no framework state is needed.\n *\n * `pool` is treated as a FIXED-LENGTH array: the index is\n * `hash(seed) % pool.length`, so adding or removing an entry re-assigns every\n * seed, while replacing one entry in place moves only the seeds that land on\n * it. Pool providers should edit slots rather than resize.\n *\n * An empty pool returns the bundled data URI, which cannot fail to load.\n */\nexport const pickAvatarFallback = (seed = '', pool: readonly string[] = []): string =>\n pool.length > 0 ? (pool[hash(seed) % pool.length] ?? KUN_AVATAR_FALLBACK) : KUN_AVATAR_FALLBACK\n\n/**\n * @deprecated Renamed to `pickAvatarFallback`, which takes the pool the host\n * configured. This alias no longer returns a sticker URL — it returns the\n * bundled fallback for any input, because the host it used to point at stopped\n * serving those files. Pass a pool, or read the resolved image off KunAvatar.\n */\nexport const getRandomSticker = (id = ''): string => pickAvatarFallback(id)\n","// Chat limits and timings shared with the server and the Flutter port.\n\n/** Longest message text, in UTF-16 code units (Telegram's value). */\nexport const KUN_CHAT_TEXT_LIMIT = 4096\n/** Most photos one album can hold. */\nexport const KUN_CHAT_ALBUM_LIMIT = 10\n/** A client sends at most one typing notification per this many ms. */\nexport const KUN_CHAT_TYPING_INTERVAL = 5000\n/** A typing notification not renewed within this many ms has expired. */\nexport const KUN_CHAT_TYPING_TIMEOUT = 6000\n","import type { KunChatEntity, KunChatEntityType } from './types.ts'\n\n// Entities → a render tree. This file is the specification the Flutter port\n// copies line for line, so every rule is spelled out and none depends on a\n// JavaScript quirk: offsets are UTF-16 code units, which is what both\n// `String.prototype.slice` and Dart's `String.substring` index.\n\nconst KNOWN_TYPES: ReadonlySet<string> = new Set<KunChatEntityType>([\n 'bold',\n 'italic',\n 'underline',\n 'strikethrough',\n 'spoiler',\n 'code',\n 'pre',\n 'blockquote',\n 'text_link',\n 'mention',\n 'url',\n])\n\n/** Types whose content is literal: nothing may nest inside them. */\nconst LEAF_TYPES: ReadonlySet<string> = new Set(['code', 'pre'])\n\n/** Types rendered as links. A link inside a link is invalid HTML (`<a>` in\n * `<a>`), so the inner one is dropped. */\nconst LINK_TYPES: ReadonlySet<string> = new Set(['text_link', 'mention', 'url'])\n\n/** Types that break the line around themselves. */\nexport const KUN_CHAT_BLOCK_ENTITY_TYPES: ReadonlySet<string> = new Set([\n 'pre',\n 'blockquote',\n])\n\n// Tie-break for entities covering the exact same range: the earlier type is\n// the outer one. Blocks outermost, links outside formatting (a link keeps its\n// whole styled label clickable), code innermost.\nconst NESTING_ORDER: readonly KunChatEntityType[] = [\n 'blockquote',\n 'pre',\n 'text_link',\n 'mention',\n 'url',\n 'spoiler',\n 'bold',\n 'italic',\n 'underline',\n 'strikethrough',\n 'code',\n]\nconst rank = (type: string) => NESTING_ORDER.indexOf(type as KunChatEntityType)\n\nconst isHighSurrogate = (code: number) => code >= 0xd800 && code <= 0xdbff\nconst isLowSurrogate = (code: number) => code >= 0xdc00 && code <= 0xdfff\n\n/** Whether `index` falls between the two halves of a surrogate pair. */\nconst splitsPair = (text: string, index: number) =>\n index > 0 &&\n index < text.length &&\n isHighSurrogate(text.charCodeAt(index - 1)) &&\n isLowSurrogate(text.charCodeAt(index))\n\ninterface Range {\n entity: KunChatEntity\n start: number\n end: number\n}\n\nconst compareRanges = (a: Range, b: Range) =>\n a.start - b.start || b.end - a.end || rank(a.entity.type) - rank(b.entity.type)\n\nconst cleanEntity = (e: KunChatEntity, offset: number, length: number): KunChatEntity => {\n const out: KunChatEntity = { type: e.type, offset, length }\n if (e.type === 'mention') out.user_id = e.user_id\n if (e.type === 'text_link') out.url = e.url\n if (e.type === 'pre' && e.language) out.language = e.language\n return out\n}\n\n/** Inline formatting: no link, no block, no literal content. Touching runs of\n * one type are one run, and a line break at either end draws nothing. */\nconst FORMAT_TYPES: ReadonlySet<string> = new Set([\n 'bold',\n 'italic',\n 'underline',\n 'strikethrough',\n 'spoiler',\n])\n\nconst mergeTouching = (ranges: Range[]): Range[] => {\n const out: Range[] = []\n const last = new Map<string, Range>()\n for (const r of [...ranges].sort(compareRanges)) {\n const prev = FORMAT_TYPES.has(r.entity.type) ? last.get(r.entity.type) : undefined\n if (prev && r.start <= prev.end) {\n prev.end = Math.max(prev.end, r.end)\n continue\n }\n out.push(r)\n if (FORMAT_TYPES.has(r.entity.type)) last.set(r.entity.type, r)\n }\n return out\n}\n\n// A quote is a block, so it must sit outside every inline entity: anything\n// that straddles a quote boundary is cut there. `quotes` must be the quotes\n// that survive nesting: cutting at one that is later dropped leaves a cut\n// with no cause, which the next pass merges away.\nconst splitAtQuotes = (ranges: Range[], quotes: Range[]): Range[] => {\n const cuts = quotes.flatMap((r) => [r.start, r.end])\n return ranges.flatMap((r) => {\n const inner = cuts.filter((c) => c > r.start && c < r.end).sort((a, b) => a - b)\n const points = [r.start, ...new Set(inner), r.end]\n return points.slice(1).map((end, i) => ({ entity: r.entity, start: points[i]!, end }))\n })\n}\n\n/**\n * Make an entity list safe to render, without ever changing `text`:\n *\n * 1. Drop unknown types, non-integer or negative positions, empty ranges, a\n * `text_link` without a `url` and a `mention` without a `user_id`; clamp\n * the end to the text. Widen a range that would cut a surrogate pair (an\n * emoji) in half. Pull a blockquote's end in over trailing line breaks.\n * 2. Merge touching or overlapping runs of one inline format (bold, italic,\n * underline, strikethrough, spoiler).\n * 3. Settle the blockquotes among themselves (steps 5 and 6, quotes only),\n * then cut every other entity at the boundaries of a quote that survived,\n * so quotes are always outermost.\n * 4. Pull the ends of an inline format in over line breaks, which draw\n * nothing there (a blockquote's end, before step 3).\n * 5. Order by start, then longer first, then by nesting order; split an\n * entity that partially crosses another at the boundary, so every pair\n * nests or is disjoint.\n * 6. Drop what cannot nest: anything inside `code`/`pre`, a type inside the\n * same type, a link inside a link.\n *\n * The result is a fixed point: normalizing it again changes nothing. The\n * server already guarantees most of this; the client does it anyway so a bad\n * row renders instead of throwing.\n */\nexport const normalizeKunChatEntities = (\n text: string,\n entities: readonly KunChatEntity[] | null | undefined\n): KunChatEntity[] => {\n if (!entities?.length || !text) return []\n\n let ranges: Range[] = []\n for (const e of entities) {\n if (!e || !KNOWN_TYPES.has(e.type)) continue\n if (!Number.isInteger(e.offset) || !Number.isInteger(e.length)) continue\n if (e.offset < 0 || e.length <= 0) continue\n if (e.type === 'text_link' && (typeof e.url !== 'string' || !e.url)) continue\n if (e.type === 'mention' && (typeof e.user_id !== 'string' || !e.user_id)) continue\n let start = e.offset\n let end = Math.min(e.offset + e.length, text.length)\n if (start >= end) continue\n if (splitsPair(text, start)) start -= 1\n if (splitsPair(text, end)) end += 1\n // Before the cuts below, which must see the quote's final boundaries.\n if (e.type === 'blockquote') while (end > start && text[end - 1] === '\\n') end--\n if (start < end) ranges.push({ entity: e, start, end })\n }\n\n // Every piece made from here on, the crossing splits included, is trimmed,\n // or normalizing twice would trim what the first pass left.\n const trimmed = (r: Range) => {\n if (FORMAT_TYPES.has(r.entity.type)) {\n while (r.start < r.end && text[r.start] === '\\n') r.start++\n while (r.end > r.start && text[r.end - 1] === '\\n') r.end--\n }\n return r.start < r.end\n }\n const nest = (ranges: Range[]): Range[] => {\n const queue = ranges.filter(trimmed).sort(compareRanges)\n const enqueue = (r: Range) => {\n let i = 0\n while (i < queue.length && compareRanges(queue[i]!, r) <= 0) i++\n queue.splice(i, 0, r)\n }\n\n const out: Range[] = []\n const stack: Range[] = []\n while (queue.length) {\n const r = queue.shift()!\n while (stack.length && stack[stack.length - 1]!.end <= r.start) stack.pop()\n const parent = stack[stack.length - 1]\n if (parent && r.end > parent.end) {\n // Crosses the parent's end: keep the part inside, requeue the rest.\n const rest: Range = { entity: r.entity, start: parent.end, end: r.end }\n if (trimmed(rest)) enqueue(rest)\n r.end = parent.end\n if (!trimmed(r)) continue\n // Shorter now, it may sort after entities still waiting.\n if (queue.length && compareRanges(r, queue[0]!) > 0) {\n enqueue(r)\n continue\n }\n }\n const blocked = stack.some(\n (a) =>\n LEAF_TYPES.has(a.entity.type) ||\n a.entity.type === r.entity.type ||\n (LINK_TYPES.has(a.entity.type) && LINK_TYPES.has(r.entity.type))\n )\n if (blocked) continue\n stack.push(r)\n out.push(r)\n }\n return out\n }\n\n // Everything else is cut at the quotes' boundaries, so only a quote can\n // hold a quote: nesting the quotes alone settles which ones survive.\n const quotes = nest(ranges.filter((r) => r.entity.type === 'blockquote'))\n const inline = mergeTouching(ranges.filter((r) => r.entity.type !== 'blockquote'))\n const out = nest([...quotes, ...splitAtQuotes(inline, quotes)])\n\n return out.map((r) => cleanEntity(r.entity, r.start, r.end - r.start))\n}\n\nexport interface KunChatTextLeaf {\n kind: 'text'\n text: string\n /** Where `text` starts in the message text, in UTF-16 code units. */\n offset: number\n}\n\nexport interface KunChatEntityNode {\n kind: 'entity'\n entity: KunChatEntity\n children: KunChatTextNode[]\n}\n\nexport type KunChatTextNode = KunChatTextLeaf | KunChatEntityNode\n\nconst isBlock = (node: KunChatTextNode | undefined) =>\n node?.kind === 'entity' && KUN_CHAT_BLOCK_ENTITY_TYPES.has(node.entity.type)\n\n// A block (pre, blockquote) already starts and ends a line, so the `\\n` that\n// separates it from the surrounding text would render as an extra blank line.\n// Drop exactly one line break on each side — the text keeps it; only the tree\n// omits it.\nconst trimAroundBlocks = (nodes: KunChatTextNode[]): KunChatTextNode[] => {\n const out: KunChatTextNode[] = []\n nodes.forEach((node, i) => {\n if (node.kind === 'entity') {\n out.push({ ...node, children: trimAroundBlocks(node.children) })\n return\n }\n let { text, offset } = node\n if (isBlock(nodes[i - 1]) && text.startsWith('\\n')) {\n text = text.slice(1)\n offset += 1\n }\n if (isBlock(nodes[i + 1]) && text.endsWith('\\n')) text = text.slice(0, -1)\n if (text) out.push({ kind: 'text', text, offset })\n })\n return out\n}\n\n/**\n * Turn `text` + `entities` into a tree: entity nodes whose children are text\n * leaves and nested entity nodes, in document order. The entities are\n * normalized first (see `normalizeKunChatEntities`), so any input renders.\n */\nexport const buildKunChatEntityTree = (\n text: string,\n entities: readonly KunChatEntity[] | null | undefined\n): KunChatTextNode[] => {\n const root: KunChatEntityNode = {\n kind: 'entity',\n entity: { type: 'bold', offset: 0, length: text.length },\n children: [],\n }\n const stack: { node: KunChatEntityNode; end: number; cursor: number }[] = [\n { node: root, end: text.length, cursor: 0 },\n ]\n const flushTo = (frame: (typeof stack)[number], to: number) => {\n if (to > frame.cursor) {\n frame.node.children.push({\n kind: 'text',\n text: text.slice(frame.cursor, to),\n offset: frame.cursor,\n })\n }\n frame.cursor = Math.max(frame.cursor, to)\n }\n const close = () => {\n const frame = stack.pop()!\n flushTo(frame, frame.end)\n stack[stack.length - 1]!.cursor = frame.end\n }\n\n for (const entity of normalizeKunChatEntities(text, entities)) {\n const start = entity.offset\n while (stack.length > 1 && stack[stack.length - 1]!.end <= start) close()\n const parent = stack[stack.length - 1]!\n flushTo(parent, start)\n const node: KunChatEntityNode = { kind: 'entity', entity, children: [] }\n parent.node.children.push(node)\n stack.push({ node, end: start + entity.length, cursor: start })\n }\n while (stack.length > 1) close()\n flushTo(stack[0]!, text.length)\n\n return trimAroundBlocks(root.children)\n}\n\n/** The plain text of a subtree, as rendered (block-adjacent breaks omitted). */\nexport const kunChatTreeText = (nodes: readonly KunChatTextNode[]): string =>\n nodes\n .map((n) => (n.kind === 'text' ? n.text : kunChatTreeText(n.children)))\n .join('')\n\n/**\n * The part of a message from `start` to `end` (UTF-16 code units), with the\n * entities clipped to it and shifted to start at 0 — what a partial quote\n * carries. The range is widened rather than split through an emoji.\n */\nexport const sliceKunChatEntities = (\n text: string,\n entities: readonly KunChatEntity[] | null | undefined,\n start: number,\n end: number\n): { text: string; entities: KunChatEntity[] } => {\n let from = Math.max(0, Math.min(start, text.length))\n let to = Math.max(from, Math.min(end, text.length))\n if (splitsPair(text, from)) from -= 1\n if (splitsPair(text, to)) to += 1\n const clipped = normalizeKunChatEntities(text, entities).flatMap((e) => {\n const s = Math.max(e.offset, from)\n const t = Math.min(e.offset + e.length, to)\n return t > s ? [{ ...e, offset: s - from, length: t - s }] : []\n })\n const sliced = text.slice(from, to)\n return { text: sliced, entities: normalizeKunChatEntities(sliced, clipped) }\n}\n","import type { KunChatEntity, KunChatFormattedText } from './types.ts'\nimport { normalizeKunChatEntities } from './entities.ts'\n\n// Composer shortcuts ↔ entities. The composer is a plain textarea: what the\n// user types is parsed into `{ text, entities }` on send, and editing a sent\n// message formats it back. `formatKunChatMarkdown` is the inverse of\n// `parseKunChatMarkdown` — `parse(format(m))` returns `m` — for every message\n// except the few shapes the syntax cannot spell, listed on `format` below.\n//\n// The syntax, all of it:\n//\n// **bold** __italic__ ++underline++ ~~strikethrough~~ ||spoiler||\n// `code` ```lang⏎ pre ⏎``` [label](https://…) [label](mention:42)\n// > quoted line (at the start of a line; consecutive lines form one quote)\n//\n// Markers work inside words — Chinese has no spaces to anchor them to — and\n// only need non-empty content. A marker is exactly two characters: `***` is\n// text, as in TDLib's parser. A marker without a partner stays literal text.\n//\n// Escaping. A run of k backslashes before a special character stands for\n// ⌊k/2⌋ backslashes, and escapes that character when k is odd. Before\n// anything else a backslash is literal. In text, ` [ ] are always special,\n// and * _ + ~ | are special only next to their own twin (backslashes in\n// between don't count) — a lone one can never be a marker, so `a\\_b`,\n// `C:\\Users` and `¯\\_(ツ)_/¯` keep their backslashes. Inside `code` and a pre\n// block the only special character is `, inside a link target it is ). A line\n// whose text starts with backslashes and then `>` loses one backslash: `\\>`\n// is how a line starts with a literal `>`.\n\nconst PAIRS: ReadonlyArray<readonly [string, KunChatEntity['type']]> = [\n ['**', 'bold'],\n ['__', 'italic'],\n ['++', 'underline'],\n ['~~', 'strikethrough'],\n ['||', 'spoiler'],\n]\nconst PAIR_BY_TYPE = new Map(PAIRS.map(([m, t]) => [t, m]))\nconst PAIR_CHARS = new Set(['*', '_', '+', '~', '|'])\nconst TEXT_SPECIAL = new Set(['*', '_', '+', '~', '|', '`', '[', ']'])\nconst LANGUAGE = /^[A-Za-z0-9_+#.-]*$/\nconst MENTION = /^mention:(\\d+)$/\n\nconst backslashRun = (s: string, i: number, end: number) => {\n let k = 0\n while (i + k < end && s[i + k] === '\\\\') k++\n return k\n}\n\n/** The nearest character from `i` in direction `step` that is not a\n * backslash — the whole source, not just the current range, so a marker's\n * neighbour counts. */\nconst nonBackslash = (s: string, i: number, step: 1 | -1) => {\n while (i >= 0 && i < s.length && s[i] === '\\\\') i += step\n return s[i]\n}\n\n/** At the backslash run starting at `i`: its length, and whether it is\n * followed by a special character (and so escapes it when odd). The\n * character after the run is read past `end`: a run that ends a range sits\n * right before the range's closing marker, and the writer doubled it. */\nconst escapeAt = (s: string, i: number, end: number) => {\n const k = backslashRun(s, i, end)\n const j = i + k\n const c = s[j] ?? ''\n const special =\n c === '`' || c === '[' || c === ']'\n ? true\n : PAIR_CHARS.has(c) && (nonBackslash(s, i - 1, -1) === c || nonBackslash(s, j + 1, 1) === c)\n return { k, c, special }\n}\n\n/** Where scanning resumes after the backslash run at `i`. */\nconst skipEscape = (s: string, i: number, end: number) => {\n const { k, special } = escapeAt(s, i, end)\n return i + (special && k % 2 === 1 && i + k < end ? k + 1 : k)\n}\n\n\ninterface RawSpan {\n /** Index just past the closing marker. */\n end: number\n contentStart: number\n contentEnd: number\n language?: string\n}\n\n/** The next unescaped `closer` at or after `from`, in a raw context whose\n * only special character is `special`; -1 when there is none. */\nconst findRawCloser = (\n s: string,\n from: number,\n end: number,\n closer: string,\n special: string\n): number => {\n let p = from\n while (p < end) {\n if (s[p] === '\\\\') {\n const k = backslashRun(s, p, end)\n p += s[p + k] === special && k % 2 === 1 ? k + 1 : k\n continue\n }\n if (p + closer.length <= end && s.startsWith(closer, p)) return p\n p++\n }\n return -1\n}\n\n/** Undo raw-context escaping: backslash runs before `special` halve. A run\n * at the very end counts as before `special` when the closer follows it. */\nconst unescapeRaw = (s: string, special: string, closerFollows: boolean): string => {\n let out = ''\n let p = 0\n while (p < s.length) {\n if (s[p] !== '\\\\') {\n out += s[p]\n p++\n continue\n }\n const k = backslashRun(s, p, s.length)\n const next = p + k < s.length ? s[p + k] : closerFollows ? special : ''\n if (next !== special) {\n out += '\\\\'.repeat(k)\n p += k\n } else if (k % 2 === 1) {\n out += '\\\\'.repeat((k - 1) / 2) + special\n p += k + 1\n } else {\n out += '\\\\'.repeat(k / 2)\n p += k\n }\n }\n return out\n}\n\nconst matchCode = (s: string, i: number, end: number): RawSpan | null => {\n if (s[i] !== '`') return null\n const close = findRawCloser(s, i + 1, end, '`', '`')\n if (close <= i + 1) return null\n return { end: close + 1, contentStart: i + 1, contentEnd: close }\n}\n\nconst matchPre = (s: string, i: number, end: number): RawSpan | null => {\n if (!s.startsWith('```', i)) return null\n const open = i + 3\n const close = findRawCloser(s, open, end, '```', '`')\n if (close < 0) return null\n const trimEnd = (from: number) =>\n close > from && s[close - 1] === '\\n' ? close - 1 : close\n const nl = s.indexOf('\\n', open)\n if (nl >= 0 && nl < close && LANGUAGE.test(s.slice(open, nl))) {\n const contentEnd = trimEnd(nl + 1)\n if (contentEnd > nl + 1) {\n const language = s.slice(open, nl) || undefined\n return { end: close + 3, contentStart: nl + 1, contentEnd, language }\n }\n // \"```go⏎```\" is a block whose one line is \"go\", not an empty Go block.\n }\n const contentEnd = trimEnd(open)\n if (contentEnd <= open) return null\n return { end: close + 3, contentStart: open, contentEnd }\n}\n\ninterface LinkSpan {\n end: number\n labelStart: number\n labelEnd: number\n target: string\n}\n\nconst matchLink = (s: string, i: number, end: number): LinkSpan | null => {\n if (s[i] !== '[') return null\n let p = i + 1\n while (p < end) {\n if (s[p] === '\\\\') {\n p = skipEscape(s, p, end)\n continue\n }\n // A later `[` owns the `](` we would find: this one is literal text.\n if (s[p] === '[') return null\n if (s[p] === ']' && s[p + 1] === '(') {\n if (p === i + 1) return null\n const close = findRawCloser(s, p + 2, end, ')', ')')\n if (close <= p + 2) return null\n return {\n end: close + 1,\n labelStart: i + 1,\n labelEnd: p,\n target: unescapeRaw(s.slice(p + 2, close), ')', true),\n }\n }\n const raw = matchPre(s, p, end) ?? matchCode(s, p, end)\n p = raw ? raw.end : p + 1\n }\n return null\n}\n\n/** Length of the run of `s[i]` starting at `i`. */\nconst charRun = (s: string, i: number, end: number) => {\n let k = 1\n while (i + k < end && s[i + k] === s[i]) k++\n return k\n}\n\nconst findPairCloser = (s: string, from: number, end: number, marker: string) => {\n let p = from\n while (p < end) {\n if (s[p] === '\\\\') {\n p = skipEscape(s, p, end)\n continue\n }\n if (PAIR_CHARS.has(s[p]!)) {\n const run = charRun(s, p, end)\n if (run === 2 && p > from && s.startsWith(marker, p)) return p\n p += run\n continue\n }\n // Code, pre blocks and links are opaque: a marker inside one of them\n // cannot close a pair that started outside.\n const atom = matchPre(s, p, end) ?? matchCode(s, p, end) ?? matchLink(s, p, end)\n p = atom ? atom.end : p + 1\n }\n return -1\n}\n\n/**\n * Parse composer input into message text and entities. Never throws: input\n * that is not valid shortcut syntax stays literal text.\n */\nexport const parseKunChatMarkdown = (source: string): KunChatFormattedText => {\n let text = ''\n const entities: KunChatEntity[] = []\n const quotedLines: [number, number][] = []\n let atLineStart = true\n let lineQuoted = false\n let lineOffset = 0\n\n const endLine = () => {\n if (lineQuoted) quotedLines.push([lineOffset, text.length])\n }\n\n const parseRange = (start: number, end: number) => {\n let i = start\n while (i < end) {\n if (atLineStart) {\n atLineStart = false\n lineOffset = text.length\n lineQuoted = false\n if (i + 2 <= end && source.startsWith('> ', i)) {\n lineQuoted = true\n i += 2\n } else if (source[i] === '>' && (i + 1 === end || source[i + 1] === '\\n')) {\n lineQuoted = true\n i += 1\n }\n if (source[i] === '\\\\' && source[i + backslashRun(source, i, end)] === '>') i += 1\n continue\n }\n\n const c = source[i]!\n if (c === '\\\\') {\n const { k, c: next, special } = escapeAt(source, i, end)\n if (!special) {\n text += '\\\\'.repeat(k)\n i += k\n } else if (k % 2 === 1 && i + k < end) {\n text += '\\\\'.repeat((k - 1) / 2) + next\n i += k + 1\n } else {\n text += '\\\\'.repeat(k / 2)\n i += k\n }\n continue\n }\n\n if (c === '\\n') {\n endLine()\n text += '\\n'\n atLineStart = true\n i++\n continue\n }\n\n const raw = matchPre(source, i, end)\n const code = raw ? null : matchCode(source, i, end)\n const span = raw ?? code\n if (span) {\n const offset = text.length\n text += unescapeRaw(\n source.slice(span.contentStart, span.contentEnd),\n '`',\n source[span.contentEnd] === '`'\n )\n const entity: KunChatEntity = {\n type: raw ? 'pre' : 'code',\n offset,\n length: text.length - offset,\n }\n if (span.language) entity.language = span.language\n entities.push(entity)\n i = span.end\n continue\n }\n\n const link = matchLink(source, i, end)\n if (link) {\n const offset = text.length\n parseRange(link.labelStart, link.labelEnd)\n const length = text.length - offset\n const mention = link.target.match(MENTION)\n if (length > 0) {\n entities.push(\n mention\n ? { type: 'mention', offset, length, user_id: mention[1] }\n : { type: 'text_link', offset, length, url: link.target }\n )\n }\n i = link.end\n continue\n }\n\n if (PAIR_CHARS.has(c)) {\n // Exactly two: `***` or `****` is not a marker, it is text.\n const run = charRun(source, i, end)\n if (run !== 2) {\n text += c.repeat(run)\n i += run\n continue\n }\n const [marker, type] = PAIRS.find(([m]) => m[0] === c)!\n const close = findPairCloser(source, i + 2, end, marker)\n if (close > i + 2) {\n const offset = text.length\n parseRange(i + 2, close)\n const length = text.length - offset\n if (length > 0) entities.push({ type, offset, length })\n i = close + 2\n } else {\n text += marker\n i += 2\n }\n continue\n }\n\n text += c\n i++\n }\n }\n\n parseRange(0, source.length)\n endLine()\n\n // Consecutive quoted lines form one quote, the line breaks between included.\n for (let q = 0; q < quotedLines.length; q++) {\n const start = quotedLines[q]![0]\n let end = quotedLines[q]![1]\n while (q + 1 < quotedLines.length && quotedLines[q + 1]![0] === end + 1) {\n end = quotedLines[++q]![1]\n }\n if (end > start) entities.push({ type: 'blockquote', offset: start, length: end - start })\n }\n\n return { text, entities: normalizeKunChatEntities(text, entities) }\n}\n\n\ntype Context = 'text' | 'code' | 'pre' | 'url'\n\ninterface LitAtom {\n kind: 'lit'\n ch: string\n ctx: Context\n /** Inside a link label, where a literal `[` must be escaped. */\n inLabel: boolean\n escape: boolean\n}\ninterface MarkAtom {\n kind: 'mark'\n s: string\n /** The parser jumps over it without a line-start check: a pair's closing\n * marker, and a link's `](`…`)` (whose target atoms are `url`). */\n closer?: boolean\n}\ntype Atom = LitAtom | MarkAtom\n\ninterface FormatNode {\n entity: KunChatEntity | null\n start: number\n end: number\n children: FormatNode[]\n}\n\n/**\n * Turn message text + entities back into composer input — for editing a sent\n * message, or restoring a draft. Parsing the result gives back the same text\n * and (normalized) entities, except for what the syntax cannot spell:\n *\n * - `url` entities are dropped; the server detects links again on save.\n * - A blockquote is dropped unless it starts and ends at line breaks that\n * are text — not inside a code span or pre block.\n * - Blockquotes on consecutive lines are written, and come back, as one.\n * - A `pre` language with characters outside `A-Z a-z 0-9 _ + # . -` is\n * dropped, as is a `text_link` whose URL is itself `mention:<digits>`.\n */\nexport const formatKunChatMarkdown = (\n text: string,\n entities: readonly KunChatEntity[] | null | undefined\n): string => {\n // A quote is spelled as `> ` lines, so it needs a line break on each side\n // that the parser reads as text — not one inside a code span or pre block.\n // Quotes that cannot be spelled go, and the rest is normalized again from\n // the original entities, so whatever those quotes had cut apart joins up.\n const withoutUrls = (entities ?? []).filter((e) => e.type !== 'url')\n const first = normalizeKunChatEntities(text, withoutUrls)\n const inRaw = (i: number) =>\n first.some((r) => (r.type === 'code' || r.type === 'pre') && r.offset <= i && i < r.offset + r.length)\n const breakAt = (i: number) => text[i] === '\\n' && !inRaw(i)\n const quotes: KunChatEntity[] = []\n for (const q of first) {\n if (q.type !== 'blockquote') continue\n const end = q.offset + q.length\n if (!(q.offset === 0 || breakAt(q.offset - 1)) || !(end === text.length || breakAt(end))) continue\n const prev = quotes[quotes.length - 1]\n if (prev && prev.offset + prev.length + 1 === q.offset) prev.length = end - prev.offset\n else quotes.push({ ...q })\n }\n const list = normalizeKunChatEntities(text, [\n ...withoutUrls.filter((e) => e.type !== 'blockquote'),\n ...quotes,\n ])\n\n const root: FormatNode = { entity: null, start: 0, end: text.length, children: [] }\n const stack: FormatNode[] = [root]\n for (const entity of list) {\n const node: FormatNode = {\n entity,\n start: entity.offset,\n end: entity.offset + entity.length,\n children: [],\n }\n while (stack.length > 1 && stack[stack.length - 1]!.end <= node.start) stack.pop()\n stack[stack.length - 1]!.children.push(node)\n stack.push(node)\n }\n\n const atoms: Atom[] = []\n const mark = (s: string, closer = false) => atoms.push({ kind: 'mark', s, closer })\n const lit = (ch: string, ctx: Context, inLabel: boolean) =>\n atoms.push({ kind: 'lit', ch, ctx, inLabel, escape: false })\n let quoteDepth = 0\n\n const emitText = (from: number, to: number, inLabel: boolean) => {\n for (let i = from; i < to; i++) {\n lit(text[i]!, 'text', inLabel)\n // A normalized quote never ends in a line break, so every break inside\n // one is followed by another quoted line.\n if (text[i] === '\\n' && quoteDepth > 0) mark('> ')\n }\n }\n const emitRaw = (from: number, to: number, ctx: Context) => {\n for (let i = from; i < to; i++) lit(text[i]!, ctx, false)\n }\n\n const walk = (node: FormatNode, inLabel: boolean) => {\n let cursor = node.start\n for (const child of node.children) {\n emitText(cursor, child.start, inLabel)\n emitEntity(child, inLabel)\n cursor = child.end\n }\n emitText(cursor, node.end, inLabel)\n }\n\n const emitEntity = (node: FormatNode, inLabel: boolean) => {\n const e = node.entity!\n const pair = PAIR_BY_TYPE.get(e.type)\n if (pair) {\n mark(pair)\n walk(node, inLabel)\n mark(pair, true)\n } else if (e.type === 'code') {\n mark('`')\n emitRaw(node.start, node.end, 'code')\n mark('`')\n } else if (e.type === 'pre') {\n const language = e.language && LANGUAGE.test(e.language) ? e.language : ''\n mark(`\\`\\`\\`${language}\\n`)\n emitRaw(node.start, node.end, 'pre')\n mark('\\n```')\n } else if (e.type === 'text_link' || e.type === 'mention') {\n mark('[')\n walk(node, true)\n mark('](', true)\n const target = e.type === 'mention' ? `mention:${e.user_id}` : e.url!\n for (const ch of target) lit(ch, 'url', false)\n mark(')', true)\n } else if (e.type === 'blockquote') {\n mark('> ')\n quoteDepth++\n walk(node, inLabel)\n quoteDepth--\n } else {\n walk(node, inLabel)\n }\n }\n\n walk(root, false)\n return serialize(atoms)\n}\n\nconst isLit = (a: Atom | undefined, ch: string, ctx: Context): a is LitAtom =>\n a?.kind === 'lit' && a.ch === ch && a.ctx === ctx\n\nconst firstChar = (a: Atom | undefined) =>\n a === undefined ? undefined : a.kind === 'mark' ? a.s[0] : a.ch\n\n/** The first character after atom `from` that is not a backslash, as it\n * will be written. */\nconst rawCharFrom = (atoms: Atom[], from: number): string | undefined => {\n for (let i = from; i < atoms.length; i++) {\n const a = atoms[i]!\n if (a.kind === 'mark') {\n const c = [...a.s].find((ch) => ch !== '\\\\')\n if (c !== undefined) return c\n } else if (a.escape || a.ch !== '\\\\') {\n return a.ch\n }\n }\n return undefined\n}\n\nconst lastNonBackslash = (out: string) => {\n let i = out.length - 1\n while (i >= 0 && out[i] === '\\\\') i--\n return out[i]\n}\n\n/** Whether a backslash run written before atom `j` would be read as an\n * escape — mirrors the parser's `escapeAt` — in which case it is doubled. */\nconst beforeSpecial = (atoms: Atom[], j: number, ctx: Context, out: string): boolean => {\n const next = atoms[j]\n if (next === undefined) return false\n if (next.kind === 'lit' && next.escape) return true\n const c = next.kind === 'mark' ? next.s[0]! : next.ch\n if (ctx !== 'text') return c === (ctx === 'url' ? ')' : '`')\n if (next.kind === 'mark') return TEXT_SPECIAL.has(c)\n if (c === '`' || c === '[' || c === ']') return true\n return PAIR_CHARS.has(c) && (lastNonBackslash(out) === c || rawCharFrom(atoms, j + 1) === c)\n}\n\nconst serialize = (atoms: Atom[]): string => {\n // Which literals need a backslash.\n atoms.forEach((a, i) => {\n if (a.kind !== 'lit') return\n const prev = atoms[i - 1]\n const next = atoms[i + 1]\n if (a.ctx === 'text') {\n if (PAIR_CHARS.has(a.ch)) {\n // No two active copies of a pair character may touch, or they would\n // read as a marker.\n const prevActive =\n prev?.kind === 'mark'\n ? prev.s.endsWith(a.ch)\n : prev !== undefined && !prev.escape && prev.ch === a.ch\n a.escape = prevActive || firstChar(next) === a.ch\n } else if (a.ch === '`') {\n a.escape = true\n } else if (a.ch === '[') {\n a.escape = a.inLabel\n } else if (a.ch === ']') {\n a.escape = next?.kind === 'lit' && next.ch === '('\n }\n } else if (a.ctx === 'code') {\n a.escape = a.ch === '`'\n } else if (a.ctx === 'url') {\n a.escape = a.ch === ')'\n } else if (a.ch === '`') {\n // In a pre block only three backticks in a row can close it.\n let s = i\n while (isLit(atoms[s - 1], '`', 'pre')) s--\n let e = i\n while (isLit(atoms[e + 1], '`', 'pre')) e++\n a.escape = e - s + 1 >= 3\n }\n })\n\n // The parser's `atLineStart`, tracked over the atoms rather than read off\n // the output: a line break that ends a link label is followed in the source\n // by `](…)`, and the parser checks the line start after it. Reading the\n // output lost the text after `[⏎](mention:12)` when it began `\\>` or `>`.\n // After a `> ` prefix the parser checks only the very next character.\n let lineStart = true\n let afterPrefix = false\n let out = ''\n let i = 0\n while (i < atoms.length) {\n const a = atoms[i]!\n const skipped = a.kind === 'mark' ? a.closer === true : a.ctx === 'url'\n const checked = lineStart && !skipped\n const leading = afterPrefix || checked\n afterPrefix = false\n if (!skipped) lineStart = false\n if (a.kind === 'mark') {\n out += a.s\n afterPrefix = checked && a.s === '> '\n i++\n continue\n }\n if (a.ctx === 'text' && leading) {\n let j = i\n while (isLit(atoms[j], '\\\\', 'text')) j++\n if (isLit(atoms[j], '>', 'text')) out += '\\\\'\n }\n if (a.ch === '\\\\') {\n let j = i\n while (isLit(atoms[j], '\\\\', a.ctx)) j++\n out += '\\\\'.repeat(beforeSpecial(atoms, j, a.ctx, out) ? 2 * (j - i) : j - i)\n i = j\n continue\n }\n out += a.escape ? `\\\\${a.ch}` : a.ch\n if (a.ctx === 'text' && a.ch === '\\n') lineStart = true\n i++\n }\n return out\n}\n","// Telegram's album mosaic, ported from Telegram Desktop's grouped_layout.cpp\n// by way of tweb's groupedLayout.ts, constant for constant. Not telegram-tt's\n// copy: it passes a maxHeight into the 5+ case, so the 4/3 target height\n// never applies and five photos lay out differently from every other client.\n//\n// The output is in layout units; a renderer divides by `width` / `height` and\n// places each tile by percentage, so the mosaic scales to any bubble width\n// with no measuring.\n\nexport interface KunChatAlbumSize {\n width: number\n height: number\n}\n\n/** Which outer edges of the mosaic a tile touches — its rounded corners. */\nexport const KUN_CHAT_ALBUM_SIDE = {\n top: 1,\n right: 2,\n bottom: 4,\n left: 8,\n} as const\n\nexport interface KunChatAlbumTile {\n x: number\n y: number\n width: number\n height: number\n /** Bitmask of `KUN_CHAT_ALBUM_SIDE`. */\n sides: number\n}\n\nexport interface KunChatAlbumLayout {\n width: number\n height: number\n tiles: KunChatAlbumTile[]\n}\n\nexport interface KunChatAlbumOptions {\n /** Default 420, tweb's desktop bubble width. */\n maxWidth?: number\n /** Narrowest tile. Default 100. */\n minWidth?: number\n /** Gap between tiles. Default 2. */\n spacing?: number\n}\n\nconst { top: T, right: R, bottom: B, left: L } = KUN_CHAT_ALBUM_SIDE\nconst sum = (xs: number[]) => xs.reduce((a, b) => a + b, 0)\nconst clamp = (v: number, min: number, max: number) => Math.min(Math.max(v, min), max)\n\nconst tile = (x: number, y: number, width: number, height: number, sides: number) => ({\n x,\n y,\n width,\n height,\n sides,\n})\n\nconst layoutComplex = (\n ratios: number[],\n averageRatio: number,\n maxWidth: number,\n minWidth: number,\n spacing: number\n): KunChatAlbumTile[] => {\n const maxHeight = (maxWidth * 4) / 3\n const cropped = ratios.map((r) =>\n averageRatio > 1.1 ? clamp(r, 1, 2.75) : clamp(r, 0.6667, 1)\n )\n const count = cropped.length\n const attempts: { counts: number[]; heights: number[] }[] = []\n const push = (counts: number[]) => {\n let offset = 0\n const heights = counts.map((c) => {\n const h = (maxWidth - (c - 1) * spacing) / sum(cropped.slice(offset, offset + c))\n offset += c\n return h\n })\n attempts.push({ counts, heights })\n }\n\n for (let first = 1; first !== count; first++) {\n const second = count - first\n if (first <= 3 && second <= 3) push([first, second])\n }\n for (let first = 1; first < count - 1; first++) {\n for (let second = 1; second < count - first; second++) {\n const third = count - first - second\n if (first <= 3 && second <= (averageRatio < 0.85 ? 4 : 3) && third <= 3) {\n push([first, second, third])\n }\n }\n }\n for (let first = 1; first < count - 1; first++) {\n for (let second = 1; second < count - first; second++) {\n for (let third = 1; third < count - first - second; third++) {\n const fourth = count - first - second - third\n if (first <= 3 && second <= 3 && third <= 3 && fourth <= 3) {\n push([first, second, third, fourth])\n }\n }\n }\n }\n\n // More than 12 photos leave no split of rows of at most three (tweb throws\n // there). Albums hold 10, but a bad row must render: fall back to rows of\n // three.\n if (!attempts.length) {\n push(Array.from({ length: Math.ceil(count / 3) }, (_, i) => Math.min(3, count - i * 3)))\n }\n let best = attempts[0]!\n let bestDiff = Infinity\n for (const attempt of attempts) {\n const { counts, heights } = attempt\n const total = sum(heights) + spacing * (counts.length - 1)\n const tooShort = Math.min(...heights) < minWidth ? 1.5 : 1\n const topHeavy = counts.some((c, i) => i > 0 && counts[i - 1]! > c) ? 1.5 : 1\n const diff = Math.abs(total - maxHeight) * tooShort * topHeavy\n if (diff < bestDiff) {\n best = attempt\n bestDiff = diff\n }\n }\n\n const tiles: KunChatAlbumTile[] = []\n let index = 0\n let y = 0\n best.counts.forEach((cols, row) => {\n const lineHeight = best.heights[row]!\n const height = Math.round(lineHeight)\n let x = 0\n for (let col = 0; col < cols; col++) {\n const sides =\n (row === 0 ? T : 0) |\n (row === best.counts.length - 1 ? B : 0) |\n (col === 0 ? L : 0) |\n (col === cols - 1 ? R : 0)\n const width =\n col === cols - 1 ? maxWidth - x : Math.round(cropped[index]! * lineHeight)\n tiles.push(tile(x, y, width, height, sides))\n x += width + spacing\n index++\n }\n y += height + spacing\n })\n return tiles\n}\n\n/**\n * Lay out an album of 1–10 photos as Telegram does. Sizes with a zero or\n * missing side are treated as square.\n */\nexport const layoutKunChatAlbum = (\n sizes: readonly KunChatAlbumSize[],\n options: KunChatAlbumOptions = {}\n): KunChatAlbumLayout => {\n const maxWidth = options.maxWidth ?? 420\n const minWidth = options.minWidth ?? 100\n const s = options.spacing ?? 2\n const maxHeight = maxWidth\n const r = sizes.map((z) => (z.width > 0 && z.height > 0 ? z.width / z.height : 1))\n const n = r.length\n const shape = r.map((x) => (x > 1.2 ? 'w' : x < 0.8 ? 'n' : 'q')).join('')\n // The `+ 1` is in Telegram Desktop too.\n const averageRatio = (1 + sum(r)) / n\n const maxSizeRatio = maxWidth / maxHeight\n\n let tiles: KunChatAlbumTile[]\n if (n === 0) {\n tiles = []\n } else if (n === 1) {\n tiles = [tile(0, 0, maxWidth, maxWidth / r[0]!, T | R | B | L)]\n } else if (n >= 5 || r.some((x) => x > 2)) {\n tiles = layoutComplex(r, averageRatio, maxWidth, minWidth, s)\n } else if (n === 2) {\n const [r0, r1] = r as [number, number]\n if (shape === 'ww' && averageRatio > 1.4 * maxSizeRatio && r1 - r0 < 0.2) {\n const h = Math.round(Math.min(maxWidth / r0, maxWidth / r1, (maxHeight - s) / 2))\n tiles = [tile(0, 0, maxWidth, h, L | T | R), tile(0, h + s, maxWidth, h, L | B | R)]\n } else if (shape === 'ww' || shape === 'qq') {\n const w = (maxWidth - s) / 2\n const h = Math.round(Math.min(w / r0, w / r1, maxHeight))\n tiles = [tile(0, 0, w, h, T | L | B), tile(w + s, 0, w, h, T | R | B)]\n } else {\n const w2 = Math.min(\n Math.round(Math.max(0.4 * (maxWidth - s), (maxWidth - s) / r0 / (1 / r0 + 1 / r1))),\n maxWidth - s - Math.round(minWidth * 1.5)\n )\n const w1 = maxWidth - w2 - s\n const h = Math.min(maxHeight, Math.round(Math.min(w1 / r0, w2 / r1)))\n tiles = [tile(0, 0, w1, h, T | L | B), tile(w1 + s, 0, w2, h, T | R | B)]\n }\n } else if (n === 3) {\n const [r0, r1, r2] = r as [number, number, number]\n if (shape[0] === 'n') {\n const h0 = maxHeight\n const h2 = Math.round(Math.min((maxHeight - s) / 2, (r1 * (maxWidth - s)) / (r2 + r1)))\n const h1 = h0 - h2 - s\n const wR = Math.max(minWidth, Math.round(Math.min((maxWidth - s) / 2, h2 * r2, h1 * r1)))\n const wL = Math.min(Math.round(h0 * r0), maxWidth - s - wR)\n tiles = [\n tile(0, 0, wL, h0, T | L | B),\n tile(wL + s, 0, wR, h1, T | R),\n tile(wL + s, h1 + s, wR, h2, B | R),\n ]\n } else {\n const h0 = Math.round(Math.min(maxWidth / r0, (maxHeight - s) * 0.66))\n const w1 = (maxWidth - s) / 2\n const h1 = Math.min(maxHeight - h0 - s, Math.round(Math.min(w1 / r1, w1 / r2)))\n const w2 = maxWidth - w1 - s\n tiles = [\n tile(0, 0, maxWidth, h0, L | T | R),\n tile(0, h0 + s, w1, h1, B | L),\n tile(w1 + s, h0 + s, w2, h1, B | R),\n ]\n }\n } else {\n const [r0, r1, r2, r3] = r as [number, number, number, number]\n if (shape[0] === 'w') {\n const h0 = Math.round(Math.min(maxWidth / r0, (maxHeight - s) * 0.66))\n const h = Math.round((maxWidth - 2 * s) / (r1 + r2 + r3))\n const w0 = Math.max(minWidth, Math.round(Math.min((maxWidth - 2 * s) * 0.4, h * r1)))\n const w2 = Math.round(Math.max(minWidth, (maxWidth - 2 * s) * 0.33, h * r3))\n const w1 = maxWidth - w0 - w2 - 2 * s\n const h1 = Math.min(maxHeight - h0 - s, h)\n tiles = [\n tile(0, 0, maxWidth, h0, L | T | R),\n tile(0, h0 + s, w0, h1, B | L),\n tile(w0 + s, h0 + s, w1, h1, B),\n tile(w0 + s + w1 + s, h0 + s, w2, h1, R | B),\n ]\n } else {\n const h = maxHeight\n const w0 = Math.round(Math.min(h * r0, (maxWidth - s) * 0.6))\n const w = Math.round((maxHeight - 2 * s) / (1 / r1 + 1 / r2 + 1 / r3))\n const h0 = Math.round(w / r1)\n const h1 = Math.round(w / r2)\n const h2 = h - h0 - h1 - 2 * s\n const w1 = Math.max(minWidth, Math.min(maxWidth - w0 - s, w))\n tiles = [\n tile(0, 0, w0, h, T | L | B),\n tile(w0 + s, 0, w1, h0, T | R),\n tile(w0 + s, h0 + s, w1, h1, R),\n tile(w0 + s, h0 + h1 + 2 * s, w1, h2, B | R),\n ]\n }\n }\n\n return {\n width: Math.max(0, ...tiles.map((t) => t.x + t.width)),\n height: Math.max(0, ...tiles.map((t) => t.y + t.height)),\n tiles,\n }\n}\n","import type { KunChatMessage } from './types.ts'\nimport { KUN_CHAT_ALBUM_LIMIT } from './constants.ts'\n\n// The message list's row model, as data: day sections, sender groups, albums\n// merged into one row, and the unread divider. The Vue list renders it, the\n// Flutter port computes the same rows from the same function.\n\n/** The row identity of a message: its `client_message_id` when it has one, so\n * a pending message keeps its row when the server confirms it. */\nexport const kunChatMessageKey = (message: KunChatMessage): string =>\n message.client_message_id ? `c:${message.client_message_id}` : `m:${message.id}`\n\nconst pad = (n: number) => String(n).padStart(2, '0')\n\nconst dayFormatters = new Map<string, Intl.DateTimeFormat>()\n\n/**\n * `YYYY-MM-DD` of an instant, in `timeZone` (an IANA name) or, when omitted,\n * the runtime's own zone. Keys sort chronologically as strings.\n */\nexport const kunChatDayKey = (date: Date, timeZone?: string): string => {\n if (!timeZone) {\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`\n }\n let fmt = dayFormatters.get(timeZone)\n if (!fmt) {\n fmt = new Intl.DateTimeFormat('en-CA', {\n timeZone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n })\n dayFormatters.set(timeZone, fmt)\n }\n const parts = Object.fromEntries(fmt.formatToParts(date).map((p) => [p.type, p.value]))\n return `${parts.year}-${parts.month}-${parts.day}`\n}\n\nexport type KunChatListRow =\n | { type: 'unread'; key: string }\n | { type: 'service'; key: string; message: KunChatMessage }\n | {\n type: 'message'\n key: string\n /** The message the row acts as: an album's first message with a\n * caption, else its first; the message itself otherwise. */\n message: KunChatMessage\n /** Every message the row shows — an album's photos, in order. */\n messages: KunChatMessage[]\n own: boolean\n /** First of consecutive messages from one sender: the name goes here. */\n groupStart: boolean\n /** Last of the run: the avatar and the bubble tail go here. */\n groupEnd: boolean\n }\n\nexport interface KunChatDaySection {\n /** `YYYY-MM-DD` in the list's time zone. */\n key: string\n /** The first message's instant, for formatting the date pill. */\n date: Date\n rows: KunChatListRow[]\n}\n\nexport interface KunChatGroupOptions {\n currentUserId: string\n /** The viewer's read cursor when the conversation was opened. The unread\n * divider goes above the first later message someone else sent. */\n lastReadSeq?: number | null\n /** Longest gap, in seconds, inside one sender group. Default 600\n * (telegram-tt's `GROUP_INTERVAL_SECONDS`). */\n groupWindow?: number\n /** IANA time zone for day boundaries; the runtime's zone when omitted. */\n timeZone?: string\n}\n\nconst albumRepresentative = (messages: KunChatMessage[]) =>\n messages.find((m) => m.text) ?? messages[0]!\n\n/**\n * Arrange messages — already in display order — into day sections and rows.\n * A sender group breaks on another sender, a new day, a gap longer than\n * `groupWindow`, the unread divider, and any service message.\n */\nexport const groupKunChatMessages = (\n messages: readonly KunChatMessage[],\n options: KunChatGroupOptions\n): KunChatDaySection[] => {\n const windowMs = (options.groupWindow ?? 600) * 1000\n const sections: KunChatDaySection[] = []\n let dividerPlaced = options.lastReadSeq == null\n let prev: { sender: string; at: number; row: Extract<KunChatListRow, { type: 'message' }> } | null =\n null\n\n const closeGroup = () => {\n if (prev) prev.row.groupEnd = true\n prev = null\n }\n\n for (let i = 0; i < messages.length; i++) {\n const message = messages[i]!\n const at = Date.parse(message.created_at)\n const date = new Date(Number.isNaN(at) ? 0 : at)\n const key = kunChatDayKey(date, options.timeZone)\n\n let section = sections[sections.length - 1]\n // Only ever forward: a pending message stamped by a slow local clock\n // joins the current day instead of reopening an earlier one.\n if (!section || key > section.key) {\n closeGroup()\n section = { key, date, rows: [] }\n sections.push(section)\n }\n\n const own = message.sender_id === options.currentUserId\n if (\n !dividerPlaced &&\n !own &&\n message.seq > options.lastReadSeq! &&\n message.seq > 0\n ) {\n closeGroup()\n section.rows.push({ type: 'unread', key: 'unread' })\n dividerPlaced = true\n }\n\n if (message.kind === 'service') {\n closeGroup()\n section.rows.push({ type: 'service', key: kunChatMessageKey(message), message })\n continue\n }\n\n let group = [message]\n if (message.media_group_id != null) {\n while (\n group.length < KUN_CHAT_ALBUM_LIMIT &&\n i + 1 < messages.length &&\n messages[i + 1]!.kind === 'message' &&\n messages[i + 1]!.media_group_id === message.media_group_id &&\n messages[i + 1]!.sender_id === message.sender_id\n ) {\n group = [...group, messages[++i]!]\n }\n }\n\n const continues =\n prev !== null && prev.sender === message.sender_id && at - prev.at <= windowMs\n if (!continues) closeGroup()\n\n const row: Extract<KunChatListRow, { type: 'message' }> = {\n type: 'message',\n key: kunChatMessageKey(message),\n message: group.length > 1 ? albumRepresentative(group) : message,\n messages: group,\n own,\n groupStart: !continues,\n groupEnd: false,\n }\n section.rows.push(row)\n const last = group[group.length - 1]!\n const lastAt = Date.parse(last.created_at)\n prev = { sender: message.sender_id, at: Number.isNaN(lastAt) ? at : lastAt, row }\n }\n closeGroup()\n return sections\n}\n","// AUTO-GENERATED by scripts/gen-icons.mjs — do not edit by hand.\n// Regenerate: pnpm --filter @kungal/ui-core gen:icons\nimport type { KunIconData } from './icons'\n\n// SVG data for the icons KunUI components render, bundled inline so the\n// library never fetches an icon at runtime. Bodies use currentColor.\nexport const KUN_BUNDLED_ICONS: Record<string, KunIconData> = {\n \"lucide:x\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M18 6L6 18M6 6l12 12\\\"/>\"},\n \"lucide:check\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M20 6L9 17l-5-5\\\"/>\"},\n \"lucide:info\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"M12 16v-4m0-4h.01\\\"/></g>\"},\n \"lucide:circle-check\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"m9 12l2 2l4-4\\\"/></g>\"},\n \"lucide:circle-x\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"m15 9l-6 6m0-6l6 6\\\"/></g>\"},\n \"lucide:triangle-alert\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m21.73 18l-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3M12 9v4m0 4h.01\\\"/>\"},\n \"lucide:chevron-right\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m9 18l6-6l-6-6\\\"/>\"},\n \"lucide:chevron-left\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m15 18l-6-6l6-6\\\"/>\"},\n \"lucide:chevron-down\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m6 9l6 6l6-6\\\"/>\"},\n \"lucide:chevrons-right\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m6 17l5-5l-5-5m7 10l5-5l-5-5\\\"/>\"},\n \"lucide:chevrons-left\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m11 17l-5-5l5-5m7 10l-5-5l5-5\\\"/>\"},\n \"lucide:arrow-right\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M5 12h14m-7-7l7 7l-7 7\\\"/>\"},\n \"lucide:arrow-left\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m12 19l-7-7l7-7m7 7H5\\\"/>\"},\n \"lucide:plus\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M5 12h14m-7-7v14\\\"/>\"},\n \"lucide:minus\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M5 12h14\\\"/>\"},\n \"lucide:upload\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M12 3v12m5-7l-5-5l-5 5m14 7v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\\\"/>\"},\n \"lucide:zoom-in\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"/><path d=\\\"m21 21l-4.35-4.35M11 8v6m-3-3h6\\\"/></g>\"},\n \"lucide:zoom-out\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"/><path d=\\\"m21 21l-4.35-4.35M8 11h6\\\"/></g>\"},\n \"lucide:rotate-cw\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\\\"/><path d=\\\"M21 3v5h-5\\\"/></g>\"},\n \"lucide:rotate-ccw\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M3 12a9 9 0 1 0 9-9a9.75 9.75 0 0 0-6.74 2.74L3 8\\\"/><path d=\\\"M3 3v5h5\\\"/></g>\"},\n \"lucide:refresh-ccw\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M21 12a9 9 0 0 0-9-9a9.75 9.75 0 0 0-6.74 2.74L3 8\\\"/><path d=\\\"M3 3v5h5m-5 4a9 9 0 0 0 9 9a9.75 9.75 0 0 0 6.74-2.74L21 16\\\"/><path d=\\\"M16 16h5v5\\\"/></g>\"},\n \"lucide:external-link\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M15 3h6v6m-11 5L21 3m-3 10v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\\\"/>\"},\n \"lucide:download\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M12 15V3m9 12v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\\\"/><path d=\\\"m7 10l5 5l5-5\\\"/></g>\"},\n \"lucide:copy\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><rect width=\\\"14\\\" height=\\\"14\\\" x=\\\"8\\\" y=\\\"8\\\" rx=\\\"2\\\" ry=\\\"2\\\"/><path d=\\\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\\\"/></g>\"},\n \"lucide:calendar\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M8 2v4m8-4v4\\\"/><rect width=\\\"18\\\" height=\\\"18\\\" x=\\\"3\\\" y=\\\"4\\\" rx=\\\"2\\\"/><path d=\\\"M3 10h18\\\"/></g>\"},\n \"lucide:lollipop\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"/><path d=\\\"m21 21l-4.3-4.3M11 11a2 2 0 0 0 4 0a4 4 0 0 0-8 0a6 6 0 0 0 12 0\\\"/></g>\"},\n \"lucide:eye\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M2.062 12.348a1 1 0 0 1 0-.696a10.75 10.75 0 0 1 19.876 0a1 1 0 0 1 0 .696a10.75 10.75 0 0 1-19.876 0\\\"/><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"3\\\"/></g>\"},\n \"lucide:eye-off\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575a1 1 0 0 1 0 .696a10.8 10.8 0 0 1-1.444 2.49m-6.41-.679a3 3 0 0 1-4.242-4.242\\\"/><path d=\\\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151a1 1 0 0 1 0-.696a10.75 10.75 0 0 1 4.446-5.143M2 2l20 20\\\"/></g>\"},\n \"lucide:search\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"m21 21l-4.34-4.34\\\"/><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"/></g>\"},\n \"lucide:filter\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M22 3H2l8 9.46V19l4 2v-8.54z\\\"/>\"},\n \"lucide:heart\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M2 9.5a5.5 5.5 0 0 1 9.591-3.676a.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5\\\"/>\"},\n \"lucide:clock\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"M12 6v6l4 2\\\"/></g>\"},\n \"lucide:check-check\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M18 6L7 17l-5-5m20-2l-7.5 7.5L13 16\\\"/>\"},\n \"lucide:circle-alert\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"M12 8v4m0 4h.01\\\"/></g>\"},\n \"lucide:reply\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M20 18v-2a4 4 0 0 0-4-4H4\\\"/><path d=\\\"m9 17l-5-5l5-5\\\"/></g>\"},\n \"lucide:quote\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M16 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2a1 1 0 0 1 1 1v1a2 2 0 0 1-2 2a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1a6 6 0 0 0 6-6V5a2 2 0 0 0-2-2zM5 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2a1 1 0 0 1 1 1v1a2 2 0 0 1-2 2a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1a6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z\\\"/>\"},\n \"lucide:pencil\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497zM15 5l4 4\\\"/>\"},\n \"lucide:pin\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M12 17v5M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1a2 2 0 0 0 0-4H8a2 2 0 0 0 0 4a1 1 0 0 1 1 1z\\\"/>\"},\n \"lucide:pin-off\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M12 17v5m3-12.66V7a1 1 0 0 1 1-1a2 2 0 0 0 0-4H7.89M2 2l20 20M9 9v1.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h11\\\"/>\"},\n \"lucide:trash-2\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M10 11v6m4-6v6m5-11v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6M3 6h18M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\\\"/>\"},\n \"lucide:flag\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M4 22V4a1 1 0 0 1 .4-.8A6 6 0 0 1 8 2c3 0 5 2 7.333 2q2 0 3.067-.8A1 1 0 0 1 20 4v10a1 1 0 0 1-.4.8A6 6 0 0 1 16 16c-3 0-5-2-8-2a6 6 0 0 0-4 1.528\\\"/>\"},\n \"lucide:ban\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"M4.929 4.929L19.07 19.071\\\"/></g>\"},\n \"lucide:paperclip\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m16 6l-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551\\\"/>\"},\n \"lucide:send-horizontal\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M3.714 3.048a.498.498 0 0 0-.683.627l2.843 7.627a2 2 0 0 1 0 1.396l-2.842 7.627a.498.498 0 0 0 .682.627l18-8.5a.5.5 0 0 0 0-.904zM6 12h16\\\"/>\"},\n \"lucide:smile-plus\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M22 11v1a10 10 0 1 1-9-10\\\"/><path d=\\\"M8 14s1.5 2 4 2s4-2 4-2M9 9h.01M15 9h.01M16 5h6m-3-3v6\\\"/></g>\"},\n \"lucide:image\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><rect width=\\\"18\\\" height=\\\"18\\\" x=\\\"3\\\" y=\\\"3\\\" rx=\\\"2\\\" ry=\\\"2\\\"/><circle cx=\\\"9\\\" cy=\\\"9\\\" r=\\\"2\\\"/><path d=\\\"m21 15l-3.086-3.086a2 2 0 0 0-2.828 0L6 21\\\"/></g>\"},\n \"lucide:at-sign\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"4\\\"/><path d=\\\"M16 8v5a3 3 0 0 0 6 0v-1a10 10 0 1 0-4 8\\\"/></g>\"},\n \"lucide:bell\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M10.268 21a2 2 0 0 0 3.464 0m-10.47-5.674A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326\\\"/>\"},\n \"lucide:bell-off\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M10.268 21a2 2 0 0 0 3.464 0M17 17H4a1 1 0 0 1-.74-1.673C4.59 13.956 6 12.499 6 8a6 6 0 0 1 .258-1.742M2 2l20 20M8.668 3.01A6 6 0 0 1 18 8c0 2.687.77 4.653 1.707 6.05\\\"/>\"},\n \"lucide:archive\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><rect width=\\\"20\\\" height=\\\"5\\\" x=\\\"2\\\" y=\\\"3\\\" rx=\\\"1\\\"/><path d=\\\"M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8m-10 4h4\\\"/></g>\"},\n \"lucide:mail\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"m22 7l-8.991 5.727a2 2 0 0 1-2.009 0L2 7\\\"/><rect width=\\\"20\\\" height=\\\"16\\\" x=\\\"2\\\" y=\\\"4\\\" rx=\\\"2\\\"/></g>\"},\n \"lucide:mail-open\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M21.2 8.4c.5.38.8.97.8 1.6v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V10a2 2 0 0 1 .8-1.6l8-6a2 2 0 0 1 2.4 0z\\\"/><path d=\\\"m22 10l-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 10\\\"/></g>\"},\n \"svg-spinners:90-ring-with-bg\": {\"body\":\"<path fill=\\\"currentColor\\\" d=\\\"M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z\\\" opacity=\\\".25\\\"/><path fill=\\\"currentColor\\\" d=\\\"M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z\\\"><animateTransform attributeName=\\\"transform\\\" dur=\\\"0.75s\\\" repeatCount=\\\"indefinite\\\" type=\\\"rotate\\\" values=\\\"0 12 12;360 12 12\\\"/></path>\"},\n}\n","import { KUN_BUNDLED_ICONS } from './icons-data'\n\n// Iconify-compatible icon shape: `body` is the inner SVG markup (using\n// `currentColor`), rendered into a `0 0 width height` viewBox (default 24).\nexport interface KunIconData {\n body: string\n width?: number\n height?: number\n}\n\n// The registry is SEEDED with KunUI's bundled internal icons (referenced via\n// the data import, so it is never tree-shaken away — no side-effect needed).\n// Consumers add their own icons with registerKunIcon(s). KunIcon renders from\n// this registry and NEVER fetches from a network/API.\nconst registry = new Map<string, KunIconData>(Object.entries(KUN_BUNDLED_ICONS))\n\nexport const registerKunIcon = (name: string, data: KunIconData): void => {\n registry.set(name, data)\n}\n\n// Bulk register — pass a Record<name, data>, e.g. icons extracted from\n// `@iconify-json/*` at build time, or your own custom SVGs.\nexport const registerKunIcons = (\n icons: Record<string, KunIconData>\n): void => {\n for (const [name, data] of Object.entries(icons)) registry.set(name, data)\n}\n\nexport const getKunIcon = (name: string): KunIconData | undefined =>\n registry.get(name)\n\nexport const hasKunIcon = (name: string): boolean => registry.has(name)\n"]}
1
+ {"version":3,"sources":["../src/twScales.generated.ts","../src/cn.ts","../src/variants.ts","../src/rounded.ts","../src/controlSize.ts","../src/motionPhysics.generated.ts","../src/locale/translate.ts","../src/locale/zh-CN.json","../src/locale/zh-CN.ts","../src/shortcut.ts","../src/menu.ts","../src/splitPane.ts","../src/random.ts","../src/decodeIfEncoded.ts","../src/avatarFallbackImage.ts","../src/avatarFallback.ts","../src/chat/constants.ts","../src/chat/entities.ts","../src/chat/markdown.ts","../src/chat/album.ts","../src/chat/grouping.ts","../src/icons-data.ts","../src/icons.ts"],"names":["extendTailwindMerge","clsx","ranges","out","contentEnd","i"],"mappings":"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","file":"index.cjs","sourcesContent":["// AUTO-GENERATED by scripts/gen-tw-scales.mjs from @kungal/ui-tokens — do not edit.\n//\n// The Tailwind scale names KunUI mints itself. `cn()` feeds them to\n// tailwind-merge, which otherwise cannot parse them and silently keeps two\n// conflicting classes.\nexport const KUN_TW_SCALES = {\n radius: ['kun-full', 'kun-lg', 'kun-md', 'kun-none', 'kun-sm'],\n shadow: ['kun-lg', 'kun-md', 'kun-sm'],\n ease: ['kun-emphasized', 'kun-in', 'kun-out', 'kun-standard'],\n animate: ['bounce', 'bounceInDown', 'bounceInRight', 'fadeInUp', 'fadeOutDown', 'shake', 'swing', 'tada'],\n z: ['kun-alert', 'kun-message', 'kun-modal', 'kun-popover', 'kun-sticky'],\n duration: ['kun-base', 'kun-exit', 'kun-fast', 'kun-slow'],\n} as const\n","import { clsx, type ClassValue } from 'clsx'\nimport { extendTailwindMerge } from 'tailwind-merge'\nimport { KUN_TW_SCALES } from './twScales.generated'\n\n// tailwind-merge only ships Tailwind's OWN scales, so every name KunUI mints in\n// `@theme` / `@utility` was invisible to it and got passed through untouched:\n// `cn('rounded-kun-md', 'rounded-full')` returned both classes and left CSS\n// source order to pick the winner. Measured, a consumer passing\n// `classNames.trigger: 'rounded-full'` to KunSelect still rendered a 12px\n// radius — the documented \"your class wins\" contract was false for the whole\n// `rounded-kun-*`, `shadow-kun-*`, `z-kun-*`, `ease-kun-*` and `duration-kun-*`\n// surface.\n//\n// `shadow-kun-*` failed worse than the rest. The shadow COLOUR group's\n// validator accepts any non-arbitrary word, so `shadow-kun-md` was classified\n// as a colour: it resolved against `shadow-primary/20` and the box-shadow was\n// the class that got dropped.\n//\n// The scale names are generated from tokens.css (`pnpm gen`) because a drifted\n// hand-written list fails silently — nothing errors, the classes just stop\n// merging again.\nconst twMerge = extendTailwindMerge({\n extend: {\n theme: {\n radius: [...KUN_TW_SCALES.radius],\n shadow: [...KUN_TW_SCALES.shadow],\n ease: [...KUN_TW_SCALES.ease],\n animate: [...KUN_TW_SCALES.animate],\n },\n // z-index and transition-duration are not Tailwind v4 theme namespaces —\n // these are `@utility` blocks, so they extend the class group directly.\n classGroups: {\n z: [{ z: [...KUN_TW_SCALES.z] }],\n duration: [{ duration: [...KUN_TW_SCALES.duration] }],\n },\n },\n})\n\n// Merge Tailwind class names with conflict resolution. Framework-agnostic:\n// the Vue and React layers both import this so \"last class wins\" semantics\n// are identical everywhere.\nexport const cn = (...inputs: ClassValue[]): string => twMerge(clsx(inputs))\n\nexport type { ClassValue }\n","import type { KunUIVariant, KunUIColor } from './types'\n\n// Single source of truth for the variant × color → Tailwind class table.\n// Button / Badge / Chip / Tab / Info / Progress etc. (in every framework\n// layer) consume this so the 7 × 7 matrix lives in exactly one place.\n//\n// All keys MUST be static string literals so the Tailwind JIT picks them\n// up — never construct class names with template strings at runtime.\n// Every entry carries an explicit `border` WIDTH so the outline variant\n// `bordered` actually renders — `border-{color}` alone sets only the\n// color and paints nothing in Tailwind v4. Filled / light variants use a\n// transparent border of the same width so switching variants never shifts the\n// box by a pixel.\nconst TABLE: Record<KunUIVariant, Record<KunUIColor, string>> = {\n // Filled buttons keep white text in BOTH modes, so the fill must stay dark\n // enough for contrast. The dark color scale is inverted (`-500`/`-600` become\n // LIGHT in dark mode), so a plain `bg-{color}` renders pale — worst on the\n // light hues (info ≈ L88%, default/secondary ≈ L65–72%). Each entry pins a\n // `dark:bg-{color}-{n}` that lands every color at a consistent ~L44–55% so the\n // whole row reads as one saturated tier with legible white text.\n // Foreground: the dark hues take white; the light hues (success / warning /\n // info) are light in BOTH modes, so white text fails WCAG on them (~1.5–3.4:1)\n // — they take dark text (≈6–18:1). See kunSolidFgClasses.\n solid: {\n default: 'border border-transparent bg-default text-default-foreground',\n primary: 'border border-transparent bg-primary text-primary-foreground',\n secondary: 'border border-transparent bg-secondary text-secondary-foreground',\n success: 'border border-transparent bg-success text-success-foreground',\n warning: 'border border-transparent bg-warning text-warning-foreground',\n danger: 'border border-transparent bg-danger text-danger-foreground',\n info: 'border border-transparent bg-info text-info-foreground',\n },\n // `{c}-text`, not the fill: a fill used as text measured 1.75–4.42:1 on the\n // light page. The generator holds `{c}-text` at 4.5:1 on the page, on cards\n // and on the hue's 20% tint, so the hover fill and a flat chip stay readable.\n bordered: {\n default: 'border border-default bg-transparent',\n primary: 'border border-primary bg-transparent text-primary-text',\n secondary: 'border border-secondary bg-transparent text-secondary-text',\n success: 'border border-success bg-transparent text-success-text',\n warning: 'border border-warning bg-transparent text-warning-text',\n danger: 'border border-danger bg-transparent text-danger-text',\n info: 'border border-info bg-transparent text-info-text',\n },\n light: {\n default: 'border border-transparent bg-transparent hover:bg-default/20',\n primary: 'border border-transparent bg-transparent text-primary-text hover:bg-primary/20',\n secondary: 'border border-transparent bg-transparent text-secondary-text hover:bg-secondary/20',\n success: 'border border-transparent bg-transparent text-success-text hover:bg-success/20',\n warning: 'border border-transparent bg-transparent text-warning-text hover:bg-warning/20',\n danger: 'border border-transparent bg-transparent text-danger-text hover:bg-danger/20',\n info: 'border border-transparent bg-transparent text-info-text hover:bg-info/20',\n },\n flat: {\n default: 'border border-transparent bg-default/20 text-default-text',\n primary: 'border border-transparent bg-primary/20 text-primary-text',\n secondary: 'border border-transparent bg-secondary/20 text-secondary-text',\n success: 'border border-transparent bg-success/20 text-success-text',\n warning: 'border border-transparent bg-warning/20 text-warning-text',\n danger: 'border border-transparent bg-danger/20 text-danger-text',\n info: 'border border-transparent bg-info/20 text-info-text',\n },\n // Same fill logic as `solid` (see note above) plus a COLORED glow. The glow\n // needs both a size (`shadow-lg` — the geometry) AND a tint (`shadow-{color}/40`\n // — sets --tw-shadow-color): a color utility alone leaves --tw-shadow empty, so\n // the button rendered with NO shadow at all. `overflow-hidden` on the button\n // doesn't clip its own outset box-shadow, so the glow shows.\n shadow: {\n default: 'border border-transparent shadow-lg shadow-default/40 bg-default text-default-foreground',\n primary: 'border border-transparent shadow-lg shadow-primary/40 bg-primary text-primary-foreground',\n secondary: 'border border-transparent shadow-lg shadow-secondary/40 bg-secondary text-secondary-foreground',\n success: 'border border-transparent shadow-lg shadow-success/40 bg-success text-success-foreground',\n warning: 'border border-transparent shadow-lg shadow-warning/40 bg-warning text-warning-foreground',\n danger: 'border border-transparent shadow-lg shadow-danger/40 bg-danger text-danger-foreground',\n info: 'border border-transparent shadow-lg shadow-info/40 bg-info text-info-foreground',\n },\n}\n\nexport const kunVariantClasses = (\n variant: KunUIVariant,\n color: KunUIColor\n): string => TABLE[variant][color]\n\n// Static maps for narrower use cases (just the fill color, just the text\n// color, etc.) — same JIT-safety requirement: keys must be literals.\n\nexport const kunBgClasses: Record<KunUIColor, string> = {\n default: 'bg-default',\n primary: 'bg-primary',\n secondary: 'bg-secondary',\n success: 'bg-success',\n warning: 'bg-warning',\n danger: 'bg-danger',\n info: 'bg-info',\n}\n\n// ─── Solid fills (a colored fill that carries text / icons) ──────────────────\n// Each semantic color ships a paired on-color token — `--color-{c}` (the vivid\n// fill) + `--color-{c}-foreground` (the text that stays legible on it) — both\n// generated in OKLCH and WCAG-AA-verified in BOTH light and dark by\n// scripts/gen-tokens.mjs (the build fails if any pair regresses). So a solid is\n// just `bg-{c} text-{c}-foreground`: no per-color white/black guess, no `dark:`\n// pin (the tokens are mode-correct by construction). Medium hues land white,\n// the bright hues (magenta/green/cyan/amber) land a refined dark tint.\n// Reach for these — NOT plain `kunBgClasses` — whenever a colored fill carries a\n// foreground. `kunBgClasses` stays for tints / bars / dots that carry no text.\n\n/** Just the fill. Pair with {@link kunSolidFgClasses} when the fill and its text\n * live on different elements. */\nexport const kunSolidBgClasses: Record<KunUIColor, string> = {\n default: 'bg-default',\n primary: 'bg-primary',\n secondary: 'bg-secondary',\n success: 'bg-success',\n warning: 'bg-warning',\n danger: 'bg-danger',\n info: 'bg-info',\n}\n\n/** The generated on-color that stays legible on the matching solid fill in both\n * modes (white on medium hues, a dark hue-tint on the bright ones). */\nexport const kunSolidFgClasses: Record<KunUIColor, string> = {\n default: 'text-default-foreground',\n primary: 'text-primary-foreground',\n secondary: 'text-secondary-foreground',\n success: 'text-success-foreground',\n warning: 'text-warning-foreground',\n danger: 'text-danger-foreground',\n info: 'text-info-foreground',\n}\n\n/** Fill + matching foreground — the common case (text sits on the fill). */\nexport const kunSolidClasses: Record<KunUIColor, string> = {\n default: 'bg-default text-default-foreground',\n primary: 'bg-primary text-primary-foreground',\n secondary: 'bg-secondary text-secondary-foreground',\n success: 'bg-success text-success-foreground',\n warning: 'bg-warning text-warning-foreground',\n danger: 'bg-danger text-danger-foreground',\n info: 'bg-info text-info-foreground',\n}\n\nexport const kunTextClasses: Record<KunUIColor, string> = {\n default: 'text-foreground',\n primary: 'text-primary-text',\n secondary: 'text-secondary-text',\n success: 'text-success-text',\n warning: 'text-warning-text',\n danger: 'text-danger-text',\n info: 'text-info-text',\n}\n\nexport const kunBorderClasses: Record<KunUIColor, string> = {\n default: 'border-default',\n primary: 'border-primary',\n secondary: 'border-secondary',\n success: 'border-success',\n warning: 'border-warning',\n danger: 'border-danger',\n info: 'border-info',\n}\n\n/**\n * @deprecated Use {@link kunFocusRingClasses} (or {@link kunFocusRingWithinClasses}\n * for composite widgets). This mixed `:focus` + `:focus-within` so a mouse click\n * lit the ring, and used a different opacity from the rest of the library.\n */\nexport const kunRingClasses: Record<KunUIColor, string> = {\n default: 'focus-within:ring-default/40 focus:ring-default/40',\n primary: 'focus-within:ring-primary/40 focus:ring-primary/40',\n secondary: 'focus-within:ring-secondary/40 focus:ring-secondary/40',\n success: 'focus-within:ring-success/40 focus:ring-success/40',\n warning: 'focus-within:ring-warning/40 focus:ring-warning/40',\n danger: 'focus-within:ring-danger/40 focus:ring-danger/40',\n info: 'focus-within:ring-info/40 focus:ring-info/40',\n}\n\n/**\n * Unified focus ring — ONE recipe for every directly-focusable control (inputs,\n * textarea, select trigger, buttons, checkbox/radio, links, tabs, menu items…).\n * Keyboard focus only (`:focus-visible`, so a mouse click on a button shows no\n * ring; text fields still show it on click via the browser's focus-visible\n * heuristic). A flush 2px ring in the control's semantic color at 50% — replaces\n * the old scatter of `:focus`/`:focus-within` × `ring-1|2|4` × `/25|/40|/50|full`.\n * Pair with `border-kun` at rest; on an invalid control use the `danger` entry.\n */\nexport const kunFocusRingClasses: Record<KunUIColor, string> = {\n default: 'outline-none focus-visible:ring-2 focus-visible:ring-default/50',\n primary: 'outline-none focus-visible:ring-2 focus-visible:ring-primary/50',\n secondary: 'outline-none focus-visible:ring-2 focus-visible:ring-secondary/50',\n success: 'outline-none focus-visible:ring-2 focus-visible:ring-success/50',\n warning: 'outline-none focus-visible:ring-2 focus-visible:ring-warning/50',\n danger: 'outline-none focus-visible:ring-2 focus-visible:ring-danger/50',\n info: 'outline-none focus-visible:ring-2 focus-visible:ring-info/50',\n}\n\n/**\n * Composite-widget variant of {@link kunFocusRingClasses}: the focusable element\n * is an inner `<input>` but the ring should sit on the WRAPPER. Put this on the\n * wrapper and give the inner input `outline-none` (and no ring of its own) so\n * there's exactly one indicator. Used by KunNumberInput / KunTagInput.\n *\n * Uses `focus-within` (not `has-[:focus-visible]`): for a text-field wrapper the\n * two are equivalent — a text input matches `:focus-visible` on click too — and\n * `focus-within` is a native variant that reliably compiles, whereas the\n * `has-[:focus-visible]` arbitrary variant isn't extracted from this TS source.\n */\nexport const kunFocusRingWithinClasses: Record<KunUIColor, string> = {\n default: 'focus-within:ring-2 focus-within:ring-default/50',\n primary: 'focus-within:ring-2 focus-within:ring-primary/50',\n secondary: 'focus-within:ring-2 focus-within:ring-secondary/50',\n success: 'focus-within:ring-2 focus-within:ring-success/50',\n warning: 'focus-within:ring-2 focus-within:ring-warning/50',\n danger: 'focus-within:ring-2 focus-within:ring-danger/50',\n info: 'focus-within:ring-2 focus-within:ring-info/50',\n}\n\n// Very light tint of the semantic color — \"selected card\" backgrounds in\n// RadioGroup and any \"barely there\" colored fill. Keys are static literals.\nexport const kunSoftBgClasses: Record<KunUIColor, string> = {\n default: 'bg-default/5',\n primary: 'bg-primary/5',\n secondary: 'bg-secondary/5',\n success: 'bg-success/5',\n warning: 'bg-warning/5',\n danger: 'bg-danger/5',\n info: 'bg-info/5',\n}\n","import type { KunUIRounded } from './types'\n\n// Static class map for the 5-bucket Kun radius system. All keys are literal\n// strings so the Tailwind JIT picks them up — the `rounded-kun-*` utilities\n// come from the --radius-kun-* tokens shipped by @kungal/ui-tokens.\nexport const kunRoundedClasses: Record<KunUIRounded, string> = {\n none: 'rounded-kun-none',\n sm: 'rounded-kun-sm',\n md: 'rounded-kun-md',\n lg: 'rounded-kun-lg',\n full: 'rounded-kun-full',\n}\n\n// Global default radius bucket (matches the source layer's behaviour where\n// the un-configured fallback is 'md'). A render layer's config provider may\n// override this per subtree.\nexport const KUN_DEFAULT_ROUNDED: KunUIRounded = 'md'\n\n// Pure precedence resolver for a component's effective radius:\n// prop > component built-in fallback > app/provider default\n//\n// This is the framework-agnostic core of the original Vue\n// `useResolvedRounded` composable. Each render layer wraps it in its own\n// reactivity primitive:\n// Vue: computed(() => resolveRounded(props.rounded, fallback, cfg.rounded))\n// React: useMemo(() => resolveRounded(rounded, fallback, cfg.rounded), [...])\nexport const resolveRounded = (\n prop: KunUIRounded | undefined,\n fallback: KunUIRounded | undefined,\n configDefault: KunUIRounded = KUN_DEFAULT_ROUNDED\n): KunUIRounded => prop ?? fallback ?? configDefault\n\n// A floating panel has no correct `full`. `border-radius: 9999px` on an n-row\n// listbox is not a pill — CSS Backgrounds 3 §5.5 scales every corner by\n// min(side / sum of its radii), so the used radius is half the short side. A\n// measured 80x116 KunSelect popup rendered 40px corners and pushed its option\n// labels inward; the docs' own FilterBar example prescribed `rounded=\"full\"`\n// and shipped that. `full` means \"pill\", and a pill is only defined for a\n// single-line control. So a trigger + panel component keeps `full` on the\n// trigger and resolves the panel to `lg`, the bucket --radius-kun-lg documents\n// as \"containers / floating panels\". Every other bucket passes through.\nexport const kunPanelRoundedClass = (rounded: KunUIRounded): string =>\n kunRoundedClasses[rounded === 'full' ? 'lg' : rounded]\n","import type { KunUISize } from './types'\n\n// The single source of truth for the size of every text-like form control —\n// Button, Input, Select, DatePicker, Textarea, TagInput. They reference this so\n// they share one scale and line up in a row.\n//\n// Padding-driven (not fixed-height): height = font line-height + 2·py + border.\n// `md` is the anchor (~38px, the modern default). px:py is a clean 2:1 (xs/sm a\n// touch looser); horizontal padding grows faster than vertical from md→xl, so a\n// bigger control gets wider, not flatter. Approx heights with a 1px border and\n// text line-heights 16 / 20 / 20 / 24 / 28:\n// xs ≈ 26 · sm ≈ 34 · md ≈ 38 · lg ≈ 46 · xl ≈ 54\nexport const kunControlSizeClasses: Record<KunUISize, string> = {\n xs: 'text-xs px-2.5 py-1',\n sm: 'text-sm px-3.5 py-1.5',\n md: 'text-sm px-4 py-2',\n lg: 'text-base px-5 py-2.5',\n xl: 'text-lg px-6 py-3',\n}\n\n// Icon-only buttons: a fixed SQUARE whose side equals the text-button height at\n// the same size, so an icon button lines up with text buttons in a row.\n//\n// Why this exists: kunControlSizeClasses is padding-driven (height = line-height\n// + 2·py + border). A text label contributes a full line-box (≈1.5em), but a lone\n// 1em icon does not — with the same padding the icon button would come out\n// shorter and break the row. Mainstream libraries dodge this by giving buttons a\n// fixed height and making the icon button a square of that height (shadcn\n// `size-9`, HeroUI/Chakra/Ant `isIconOnly`/`.ant-btn-icon-only`). We do the same,\n// ONLY for icon-only, keeping the icon at its natural 1em centered in the box.\n//\n// Sides MUST equal the kunControlSizeClasses heights (incl. the 1px border every\n// variant carries): xs 26 · sm 34 · md 38 · lg 46 · xl 54. (size-* is border-box,\n// so the value already accounts for the icon button's own 1px border.)\nexport const kunControlSquareClasses: Record<KunUISize, string> = {\n xs: 'size-[26px] p-0',\n sm: 'size-[34px] p-0',\n md: 'size-[38px] p-0',\n lg: 'size-[46px] p-0',\n xl: 'size-[54px] p-0',\n}\n\nexport interface KunSelectionSize {\n box: string // the square: checkbox box / radio indicator outer ring\n dot: string // radio's inner filled dot (unused by checkbox)\n check: string // checkbox's check glyph (unused by radio)\n text: string // the adjacent label\n gap: string // box ↔ label spacing\n}\n\n// The shared scale for selection controls — KunCheckBox and KunRadioGroup use\n// identical box sizes (every major library does this), so a checkbox and a radio\n// of the same size match. The box is ≈ 0.5× the text-control height and ≈ 1.2–1.4×\n// the label font, so it sits optically level with the label beside it.\n// Box px by size: 12 / 14 / 16 / 20 / 24.\nexport const kunSelectionSizeClasses: Record<KunUISize, KunSelectionSize> = {\n xs: { box: 'size-3', dot: 'size-1.5', check: 'size-2', text: 'text-xs', gap: 'gap-1.5' },\n sm: { box: 'size-3.5', dot: 'size-1.5', check: 'size-2.5', text: 'text-sm', gap: 'gap-2' },\n md: { box: 'size-4', dot: 'size-2', check: 'size-3', text: 'text-sm', gap: 'gap-2' },\n lg: { box: 'size-5', dot: 'size-2.5', check: 'size-3.5', text: 'text-base', gap: 'gap-2.5' },\n xl: { box: 'size-6', dot: 'size-3', check: 'size-4', text: 'text-lg', gap: 'gap-3' },\n}\n\n// The single source of truth for chip / tag pills — a standalone KunChip and the\n// tags inside KunTagInput share it, so a tag looks identical either way. A\n// compact sub-scale (~0.7× the form-control height): vertical padding is tighter\n// than kunControlSizeClasses because a chip is text + tight padding, not a tap\n// target. Pair with `gap-1` + `rounded-full`.\nexport const kunChipSizeClasses: Record<KunUISize, string> = {\n xs: 'px-2 py-0.5 text-xs',\n sm: 'px-2 py-1 text-xs',\n md: 'px-3 py-1 text-sm',\n lg: 'px-4 py-1.5 text-sm',\n xl: 'px-6 py-2 text-base',\n}\n","// AUTO-GENERATED by scripts/gen-motion.mjs from\n// packages/ui-tokens/scripts/motion-physics.mjs — do not edit.\n\n/**\n * The ballistic model behind `KunShatter`, as data — outward impulse, air\n * drag (`1 − (1−t)^dragExponent`), gravity as a t² acceleration — sampled\n * into `keyframeSteps` linear keyframes per shard. The same manifest\n * generates `KunShatterPhysics` in the kun_ui_tokens pub package, so the\n * web and Flutter renditions of the motion cannot drift. Tune the feel in\n * the manifest, never inline in a component.\n */\nexport const KUN_SHATTER_PHYSICS = {\n keyframeSteps: 16,\n reachFactor: 0.5,\n launchMin: 0.32,\n launchSpan: 0.55,\n verticalFactor: 0.8,\n gravityMin: 0.85,\n gravitySpan: 0.5,\n dragExponent: 1.7,\n scaleEndMin: 0.8,\n scaleEndSpan: 0.16,\n fadeOutStartMin: 0.5,\n fadeOutStartSpan: 0.18,\n settleExponent: 2,\n fadeInWindow: 0.4,\n staggerFraction: 0.22,\n staggerCapMs: 120,\n defaultDurationMs: 1100,\n defaultRotationDeg: 140,\n} as const\n\n/**\n * Drag-to-dismiss on a bottom sheet, as data: dismiss on release when the\n * sheet moved down and either the release velocity exceeds `closeVelocity`\n * (px/ms) or the offset reaches `closeDistanceRatio` of the panel height\n * (capped at the viewport); an upward drag of d px moves the panel\n * `rubberBandLimit × (1 − e^(−d / rubberBandLimit))`. The same manifest\n * generates `KunSwipeDismissPhysics` in kun_ui_tokens.\n */\nexport const KUN_SWIPE_DISMISS_PHYSICS = {\n closeDistanceRatio: 0.25,\n closeVelocity: 0.4,\n rubberBandLimit: 32,\n} as const\n","import type { KunMessagePath, KunMessages } from './types'\n\n// Resolve one message and substitute its `{name}` placeholders. Framework-free\n// on purpose: each render layer binds it to however that layer holds the\n// active locale.\n//\n// A `{name}` with no matching param is left as written rather than blanked —\n// a missing interpolation should be visible in the UI, not silently produce a\n// half-sentence.\nexport const translateKunMessage = (\n messages: KunMessages,\n path: KunMessagePath,\n params?: Record<string, string | number>\n): string => {\n const [namespace, key] = path.split('.') as [keyof KunMessages, string]\n const group = messages[namespace] as Record<string, string> | undefined\n const template = group?.[key]\n\n if (typeof template !== 'string') {\n // NODE_ENV, not import.meta.env.DEV: Vite folds the latter to false when it\n // builds a consuming package, which strips the warning from the bundle.\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n `[KunUI] no locale message at \"${path}\". A custom locale must supply every key in KunMessages.`\n )\n }\n return path\n }\n\n if (!params) return template\n return template.replace(/\\{(\\w+)\\}/g, (raw, name: string) =>\n params[name] === undefined ? raw : String(params[name])\n )\n}\n","{\n \"name\": \"简体中文\",\n \"code\": \"zh-CN\",\n \"messages\": {\n \"alert\": {\n \"title\": \"确认\",\n \"confirm\": \"确定\",\n \"cancel\": \"取消\"\n },\n \"autocomplete\": {\n \"clear\": \"清除\",\n \"loading\": \"加载中…\",\n \"noResult\": \"无匹配项\"\n },\n \"avatar\": {\n \"unknownUser\": \"未知用户\"\n },\n \"avatarGroup\": {\n \"label\": \"{count} 位用户\"\n },\n \"banner\": {\n \"label\": \"公告\",\n \"close\": \"关闭公告\"\n },\n \"carousel\": {\n \"label\": \"轮播\",\n \"prev\": \"上一张\",\n \"next\": \"下一张\",\n \"nav\": \"轮播导航\",\n \"goto\": \"跳到第 {index} 张\"\n },\n \"chat\": {\n \"deletedUser\": \"已注销用户\",\n \"you\": \"你\",\n \"senderPrefix\": \"{name}:\",\n \"today\": \"今天\",\n \"yesterday\": \"昨天\",\n \"unreadDivider\": \"以下为未读消息\",\n \"edited\": \"已编辑\",\n \"deletedMessage\": \"消息已删除\",\n \"photo\": \"图片\",\n \"album\": \"{count} 张图片\",\n \"media\": \"媒体\",\n \"draft\": \"草稿:\",\n \"messages\": \"消息\",\n \"empty\": \"还没有消息\",\n \"loading\": \"加载中…\",\n \"scrollToBottom\": \"回到底部\",\n \"scrollToBottomUnread\": \"回到底部,{count} 条新消息\",\n \"unreadCount\": \"{count} 条未读消息\",\n \"mentioned\": \"有人提到了你\",\n \"pinned\": \"已置顶\",\n \"muted\": \"已静音\",\n \"photoFrom\": \"{name} 发送的图片\",\n \"openLink\": \"打开链接 {url}\",\n \"reactions\": \"回应\",\n \"reactionCount\": \"{label},{count} 人\",\n \"back\": \"返回\",\n \"members\": \"{count} 位成员\"\n },\n \"chatComposer\": {\n \"placeholder\": \"发消息…\",\n \"send\": \"发送\",\n \"save\": \"保存\",\n \"attach\": \"添加图片\",\n \"removeAttachment\": \"移除附件\",\n \"retryAttachment\": \"上传失败,点击重试\",\n \"replyTo\": \"回复 {name}\",\n \"quoteFrom\": \"引用 {name}\",\n \"editing\": \"编辑消息\",\n \"cancelReply\": \"取消回复\",\n \"cancelEdit\": \"取消编辑\",\n \"remaining\": \"还可输入 {count} 字\",\n \"overLimit\": \"超出 {count} 字\",\n \"dropHint\": \"松开以添加图片\"\n },\n \"chatMenu\": {\n \"label\": \"消息操作\",\n \"reply\": \"回复\",\n \"quote\": \"引用\",\n \"copy\": \"复制\",\n \"copied\": \"已复制\",\n \"edit\": \"编辑\",\n \"pin\": \"置顶\",\n \"unpin\": \"取消置顶\",\n \"delete\": \"删除\",\n \"report\": \"举报\",\n \"retry\": \"重新发送\",\n \"moreReactions\": \"更多回应\",\n \"fewerReactions\": \"收起回应\"\n },\n \"chatPinned\": {\n \"label\": \"置顶消息\",\n \"indexed\": \"置顶消息 #{index}\",\n \"unpin\": \"取消置顶\"\n },\n \"chatRequest\": {\n \"title\": \"消息请求\",\n \"description\": \"{name} 想给你发消息。接受之前,对方看不到你是否已读。\",\n \"accept\": \"接受\",\n \"delete\": \"删除\",\n \"block\": \"拉黑\",\n \"report\": \"举报\"\n },\n \"chatService\": {\n \"groupCreated\": \"{actor} 创建了群组\",\n \"groupCreatedTitled\": \"{actor} 创建了群组「{title}」\",\n \"membersAdded\": \"{actor} 邀请了 {users}\",\n \"memberJoined\": \"{actor} 加入了群组\",\n \"memberLeft\": \"{actor} 退出了群组\",\n \"memberRemoved\": \"{actor} 将 {user} 移出了群组\",\n \"titleChanged\": \"{actor} 将群名改为「{title}」\",\n \"photoChanged\": \"{actor} 更换了群头像\",\n \"messagePinned\": \"{actor} 置顶了「{text}」\",\n \"messagePinnedMedia\": \"{actor} 置顶了一条消息\",\n \"joinedByLink\": \"{actor} 通过邀请链接加入了群组\"\n },\n \"chatStatus\": {\n \"sending\": \"发送中\",\n \"sent\": \"已发送\",\n \"read\": \"已读\",\n \"failed\": \"发送失败,点击重试\"\n },\n \"chatTyping\": {\n \"typing\": \"正在输入…\",\n \"one\": \"{name} 正在输入…\",\n \"several\": \"{names} 正在输入…\",\n \"many\": \"{name} 等 {count} 人正在输入…\"\n },\n \"chip\": {\n \"remove\": \"移除\"\n },\n \"commandPalette\": {\n \"placeholder\": \"搜索…\",\n \"empty\": \"输入关键字搜索\",\n \"noResult\": \"无结果\",\n \"loading\": \"加载中…\",\n \"close\": \"关闭\",\n \"hintSelect\": \"选择\",\n \"hintOpen\": \"打开\",\n \"hintClose\": \"关闭\",\n \"resultCount\": \"{count} 条结果\",\n \"remove\": \"移除\",\n \"clear\": \"清除\"\n },\n \"copy\": {\n \"copied\": \"已复制\",\n \"success\": \"{text} 复制成功\",\n \"failure\": \"{text} 复制失败! 请更换更现代的浏览器!\"\n },\n \"datePicker\": {\n \"placeholderDay\": \"请选择日期\",\n \"placeholderMonth\": \"请选择月份\",\n \"placeholderYear\": \"请选择年份\",\n \"clear\": \"清空\",\n \"today\": \"今天\",\n \"close\": \"关闭\",\n \"prevYear\": \"上一年\",\n \"nextYear\": \"下一年\",\n \"prevPage\": \"上一{unit}\",\n \"nextPage\": \"下一{unit}\",\n \"zoomOut\": \"{label} — 返回上一级\",\n \"unitMonth\": \"月\",\n \"unitYear\": \"年\",\n \"unitDecade\": \"个十年\",\n \"monthCell\": \"{year}年{month}\"\n },\n \"drawer\": {\n \"close\": \"关闭抽屉\"\n },\n \"fileInput\": {\n \"trigger\": \"选择文件\",\n \"selected\": \"已选 {count} 个文件\"\n },\n \"filePicker\": {\n \"tooLarge\": \"{name} 超过大小限制 ({size})\"\n },\n \"input\": {\n \"clear\": \"清除\",\n \"reveal\": \"显示密码\",\n \"hide\": \"隐藏密码\"\n },\n \"kbd\": {\n \"control\": \"Ctrl\",\n \"alt\": \"Alt\",\n \"option\": \"Option\",\n \"shift\": \"Shift\",\n \"command\": \"Command\",\n \"meta\": \"Windows 键\",\n \"enter\": \"回车\",\n \"escape\": \"Esc\",\n \"backspace\": \"退格\",\n \"delete\": \"删除\",\n \"tab\": \"Tab\",\n \"space\": \"空格\",\n \"up\": \"上箭头\",\n \"down\": \"下箭头\",\n \"left\": \"左箭头\",\n \"right\": \"右箭头\",\n \"pageUp\": \"向上翻页\",\n \"pageDown\": \"向下翻页\",\n \"home\": \"Home\",\n \"end\": \"End\",\n \"plus\": \"加号\",\n \"then\": \"然后\"\n },\n \"lightbox\": {\n \"label\": \"图片查看器\",\n \"close\": \"关闭\",\n \"prev\": \"上一张\",\n \"next\": \"下一张\",\n \"goto\": \"跳转到第 {index} 张\",\n \"zoomIn\": \"放大\",\n \"zoomOut\": \"缩小\",\n \"rotateLeft\": \"向左旋转 90°\",\n \"rotateRight\": \"向右旋转 90°\",\n \"reset\": \"重置缩放/旋转/位置\",\n \"download\": \"下载\"\n },\n \"lightboxGallery\": {\n \"view\": \"查看大图\"\n },\n \"loading\": {\n \"description\": \"正在摸鱼中...咕咕咕\"\n },\n \"loli\": {\n \"close\": \"关闭\"\n },\n \"message\": {\n \"close\": \"关闭\"\n },\n \"modal\": {\n \"close\": \"关闭\"\n },\n \"null\": {\n \"description\": \"莲说这里什么都没有\"\n },\n \"numberInput\": {\n \"decrement\": \"减少\",\n \"increment\": \"增加\"\n },\n \"pagination\": {\n \"nav\": \"分页导航\",\n \"prev\": \"上一页\",\n \"next\": \"下一页\",\n \"page\": \"第 {page} 页\",\n \"hintBefore\": \"您可以使用\",\n \"hintAfter\": \"来进行快速翻页\",\n \"jumpLabel\": \"跳转到页数\",\n \"jump\": \"跳转\"\n },\n \"pinInput\": {\n \"label\": \"验证码\",\n \"digit\": \"{label} 第 {index} 位\"\n },\n \"reaction\": {\n \"label\": \"点赞\"\n },\n \"select\": {\n \"searchPlaceholder\": \"搜索…\",\n \"noResult\": \"无匹配项\",\n \"loading\": \"加载中…\",\n \"clear\": \"清除\",\n \"removeOption\": \"移除 {label}\"\n },\n \"splitPane\": {\n \"handle\": \"调整分栏宽度\"\n },\n \"spoiler\": {\n \"copyCode\": \"复制代码\",\n \"reveal\": \"剧透内容,点击或按回车显示\"\n },\n \"steps\": {\n \"completed\": \"已完成:{title}\",\n \"current\": \"当前步骤:{title}\",\n \"pending\": \"未开始:{title}\",\n \"error\": \"出错:{title}\"\n },\n \"tagInput\": {\n \"tag\": \"标签 {tag}\",\n \"removeTag\": \"移除标签 {tag}\"\n },\n \"textSelection\": {\n \"copy\": \"复制\",\n \"cut\": \"剪切\",\n \"paste\": \"粘贴\",\n \"selectAll\": \"全选\",\n \"share\": \"分享\",\n \"lookUp\": \"查询\",\n \"searchWeb\": \"搜索\"\n },\n \"upload\": {\n \"imageAlt\": \"上传图片\",\n \"cropTitle\": \"裁剪图片\",\n \"cancel\": \"取消\",\n \"confirm\": \"确定\"\n }\n }\n}\n","import raw from './zh-CN.json'\nimport type { KunMessageCatalog } from './types'\n\n// KunUI's built-in default. The strings are the ones the components used to\n// hold inline, reproduced verbatim, so adopting the locale system changed no\n// rendered output.\n//\n// The catalog is JSON rather than a TypeScript literal because one file feeds\n// both the web bundle and the generated kun_ui_messages pub package, and a\n// Node generator can read JSON without evaluating TypeScript. The annotation\n// below is what type-checks it: a key missing from KunMessages fails the build.\nexport const KUN_CATALOG_ZH_CN: KunMessageCatalog = raw\n","// Keyboard-shortcut display: the parser, the per-platform labels and the\n// modifier order behind KunKbd, KunTooltip's `shortcut` and the menu items'\n// `shortcut`. Display only — binding the key is the app's job.\n//\n// The grammar is aria-keyshortcuts' (`+` joins a chord, whitespace separates a\n// sequence) plus `Mod`, the key that is ⌘ on Apple and Ctrl everywhere else,\n// the same abstraction as tinykeys' `$mod`, ProseMirror's `Mod-` and GitHub\n// Primer's KeybindingHint. Names are case-insensitive and take the common\n// aliases, so `cmd+shift+p` and `Shift+Mod+P` resolve to the same chord.\n\nexport type KunShortcutPlatform = 'apple' | 'other'\n\n/** Keys whose spoken name comes from the locale (`kbd.<name>`) rather than\n * from the label: a glyph such as ⌘ or ↑, or an abbreviation such as Esc. */\nexport type KunKbdKeyName =\n | 'control'\n | 'alt'\n | 'option'\n | 'shift'\n | 'command'\n | 'meta'\n | 'enter'\n | 'escape'\n | 'backspace'\n | 'delete'\n | 'tab'\n | 'space'\n | 'up'\n | 'down'\n | 'left'\n | 'right'\n | 'pageUp'\n | 'pageDown'\n | 'home'\n | 'end'\n | 'plus'\n\nexport interface KunShortcutKey {\n /** Canonical key: `Control`, `Alt`, `Shift`, `Meta`, `Enter`, `ArrowUp`, `K`, `+`… */\n key: string\n /** What the key shows on this platform: `⌘`, `Ctrl`, `K`. */\n label: string\n /** The locale key (under `kbd`) a screen reader hears instead of `label`;\n * null when the label reads as itself (a letter, a digit, F5). */\n spoken: KunKbdKeyName | null\n}\n\nconst ALIASES: Record<string, string> = {\n mod: 'Mod',\n ctrl: 'Control',\n control: 'Control',\n alt: 'Alt',\n option: 'Alt',\n opt: 'Alt',\n shift: 'Shift',\n meta: 'Meta',\n cmd: 'Meta',\n command: 'Meta',\n super: 'Meta',\n win: 'Meta',\n enter: 'Enter',\n return: 'Enter',\n esc: 'Escape',\n escape: 'Escape',\n backspace: 'Backspace',\n del: 'Delete',\n delete: 'Delete',\n tab: 'Tab',\n space: 'Space',\n spacebar: 'Space',\n up: 'ArrowUp',\n arrowup: 'ArrowUp',\n down: 'ArrowDown',\n arrowdown: 'ArrowDown',\n left: 'ArrowLeft',\n arrowleft: 'ArrowLeft',\n right: 'ArrowRight',\n arrowright: 'ArrowRight',\n pageup: 'PageUp',\n pgup: 'PageUp',\n pagedown: 'PageDown',\n pgdn: 'PageDown',\n home: 'Home',\n end: 'End',\n plus: '+',\n}\n\n// Apple's Human Interface Guidelines list modifiers as Control, Option, Shift,\n// Command (⌃⌥⇧⌘). Elsewhere this follows Primer's KeybindingHint: Ctrl, Win,\n// Alt, Shift. A chord is sorted into that order whatever order it was written\n// in, so one command table renders consistently.\nconst MODIFIER_ORDER: Record<KunShortcutPlatform, string[]> = {\n apple: ['Control', 'Alt', 'Shift', 'Meta'],\n other: ['Control', 'Meta', 'Alt', 'Shift'],\n}\n\ntype KeyDisplay = { apple: string; other: string; spoken: (p: KunShortcutPlatform) => KunKbdKeyName }\n\nconst NAMED: Record<string, KeyDisplay> = {\n Control: { apple: '⌃', other: 'Ctrl', spoken: () => 'control' },\n Alt: { apple: '⌥', other: 'Alt', spoken: (p) => (p === 'apple' ? 'option' : 'alt') },\n Shift: { apple: '⇧', other: 'Shift', spoken: () => 'shift' },\n Meta: { apple: '⌘', other: 'Win', spoken: (p) => (p === 'apple' ? 'command' : 'meta') },\n Enter: { apple: '↩', other: 'Enter', spoken: () => 'enter' },\n Escape: { apple: 'Esc', other: 'Esc', spoken: () => 'escape' },\n Backspace: { apple: '⌫', other: 'Backspace', spoken: () => 'backspace' },\n Delete: { apple: '⌦', other: 'Del', spoken: () => 'delete' },\n Tab: { apple: '⇥', other: 'Tab', spoken: () => 'tab' },\n Space: { apple: 'Space', other: 'Space', spoken: () => 'space' },\n ArrowUp: { apple: '↑', other: '↑', spoken: () => 'up' },\n ArrowDown: { apple: '↓', other: '↓', spoken: () => 'down' },\n ArrowLeft: { apple: '←', other: '←', spoken: () => 'left' },\n ArrowRight: { apple: '→', other: '→', spoken: () => 'right' },\n PageUp: { apple: 'PgUp', other: 'PgUp', spoken: () => 'pageUp' },\n PageDown: { apple: 'PgDn', other: 'PgDn', spoken: () => 'pageDown' },\n Home: { apple: 'Home', other: 'Home', spoken: () => 'home' },\n End: { apple: 'End', other: 'End', spoken: () => 'end' },\n '+': { apple: '+', other: '+', spoken: () => 'plus' },\n}\n\nconst canonicalKey = (token: string): string => {\n const alias = ALIASES[token.toLowerCase()]\n if (alias) return alias\n if (/^f\\d{1,2}$/i.test(token)) return token.toUpperCase()\n return token.length === 1 ? token.toUpperCase() : token\n}\n\n// `Mod++` is Mod and the plus key, and a lone `+` is the plus key: a `+` that\n// has nothing after it is a key, not a joiner.\nconst splitChord = (chord: string): string[] => {\n if (chord === '+') return ['+']\n const plusKey = chord.endsWith('++')\n const body = plusKey ? chord.slice(0, -2) : chord\n const keys = body.split('+').filter(Boolean)\n return plusKey ? [...keys, '+'] : keys\n}\n\n/** Parse a shortcut into its chords of canonical key names, `Mod` unresolved:\n * `'Shift+cmd+Z'` → `[['Shift', 'Meta', 'Z']]`, `'G G'` → `[['G'], ['G']]`. */\nexport const parseKunShortcut = (keys: string): string[][] =>\n keys\n .trim()\n .split(/\\s+/)\n .filter(Boolean)\n .map((chord) => splitChord(chord).map(canonicalKey))\n .filter((chord) => chord.length > 0)\n\n/** Resolve a shortcut for one platform: `Mod` becomes Meta on Apple and\n * Control elsewhere, repeated modifiers collapse, modifiers are sorted into\n * the platform's order, and every key carries its label and spoken name. */\nexport const resolveKunShortcut = (\n keys: string,\n platform: KunShortcutPlatform\n): KunShortcutKey[][] => {\n const order = MODIFIER_ORDER[platform]\n return parseKunShortcut(keys).map((chord) => {\n const resolved = chord.map((key) =>\n key === 'Mod' ? (platform === 'apple' ? 'Meta' : 'Control') : key\n )\n const modifiers = order.filter((m) => resolved.includes(m))\n const rest = resolved.filter((k, i) => !order.includes(k) && resolved.indexOf(k) === i)\n return [...modifiers, ...rest].map((key) => {\n const named = NAMED[key]\n return named\n ? { key, label: named[platform], spoken: named.spoken(platform) }\n : { key, label: key, spoken: null }\n })\n })\n}\n\n/** One-line form, as a menu shows it: `⇧⌘Z` on Apple (no joiner, the macOS\n * menu convention) and `Ctrl+Shift+Z` elsewhere; chords of a sequence are\n * separated by a space. */\nexport const formatKunShortcut = (keys: string, platform: KunShortcutPlatform): string =>\n resolveKunShortcut(keys, platform)\n .map((chord) => chord.map((k) => k.label).join(platform === 'apple' ? '' : '+'))\n .join(' ')\n\n/** What a screen reader should hear: `Command Shift Z`, chords of a sequence\n * joined by the locale's \"then\". `name` maps a spoken key to its word. */\nexport const speakKunShortcut = (\n sequence: KunShortcutKey[][],\n name: (key: KunKbdKeyName) => string,\n then: string\n): string =>\n sequence\n .map((chord) => chord.map((k) => (k.spoken ? name(k.spoken) : k.label)).join(' '))\n .join(` ${then} `)\n","// The menu entry list behind KunContextMenu and KunDropdown, framework-free so\n// the Flutter port collapses separators the same way.\n\n/** Drop separators that would render as stray lines: leading, trailing, and\n * all but the first of a run. An app filters one command table per context\n * (no \"Delete\" for a post you do not own) and its separators have to follow;\n * React Spectrum S2 hides the same three cases. */\nexport const normalizeKunMenuSeparators = <T extends { type?: string }>(\n entries: readonly T[]\n): T[] => {\n const out: T[] = []\n for (const entry of entries) {\n const last = out[out.length - 1]\n if (entry.type === 'separator' && (!last || last.type === 'separator')) continue\n out.push(entry)\n }\n while (out.length && out[out.length - 1]!.type === 'separator') out.pop()\n return out\n}\n","// The width rule behind KunSplitPane's divider, framework-free so the Flutter\n// port snaps to the same widths.\n\nexport interface KunSplitSizeOptions {\n min: number\n max: number\n /** Widths the divider is pulled to when it comes within `snapThreshold`. */\n snapPoints?: readonly number[]\n snapThreshold?: number\n /** The width a keyboard step starts from. A snap may not cancel or reverse\n * that step: with a 5 px step inside an 8 px threshold, the divider would\n * otherwise never leave a snap point. A drag leaves it unset, so the\n * divider sticks to a snap point until the pointer pulls clear. */\n from?: number\n}\n\n/** Clamp a requested width into [min, max], pull it to the nearest snap point\n * within the threshold, and round it to a whole pixel. */\nexport const resolveKunSplitSize = (\n raw: number,\n { min, max, snapPoints = [], snapThreshold = 8, from }: KunSplitSizeOptions\n): number => {\n const lo = Math.min(min, max)\n const hi = Math.max(min, max)\n const clamped = Math.min(Math.max(raw, lo), hi)\n let best = clamped\n let bestDistance = Infinity\n for (const point of snapPoints) {\n if (point < lo || point > hi) continue\n const distance = Math.abs(point - clamped)\n if (distance <= snapThreshold && distance < bestDistance) {\n best = point\n bestDistance = distance\n }\n }\n if (from !== undefined && Math.sign(best - from) !== Math.sign(clamped - from)) best = clamped\n return Math.round(best)\n}\n","// Generate a random integer within an inclusive [lower, upper] range.\nexport const randomNum = (lowerValue: number, upperValue: number): number =>\n Math.floor(Math.random() * (upperValue - lowerValue + 1) + lowerValue)\n","// Decode a possibly percent-encoded string, returning the original when it\n// is not encoded (or when decoding throws on malformed input).\nexport const decodeIfEncoded = (text: string): string => {\n try {\n const decoded = decodeURIComponent(text)\n return decoded !== text ? decoded : text\n } catch {\n return text\n }\n}\n","// AUTO-GENERATED — do not edit by hand.\n// The terminal avatar fallback, inlined as a base64 webp data URI (128x128,\n// 5318 B) so it needs ZERO consumer setup and makes NO network request — the\n// same no-fetch policy as the bundled icons and KunNull's mascot.\n//\n// This is what renders when the host has configured no avatar pool AND when a\n// pool URL itself fails to load. It is a data URI on purpose: the incident it\n// exists for is a CDN path that 404'd for every avatar-less account across\n// six sites at once, so the LAST fallback in the chain must not be reachable\n// over a network at all.\n//\n// Source: the first official KUN Galgame sticker (image hash d52ac5fb…), the\n// site's de-facto mascot.\n/* eslint-disable */\n/* prettier-ignore */\nexport const KUN_AVATAR_FALLBACK =\n 'data:image/webp;base64,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'\n","import { KUN_AVATAR_FALLBACK } from './avatarFallbackImage'\n\n// The predecessor of this file hardcoded `https://sticker.kungal.com` plus a\n// `/stickers/KUNgal{pack}/{n}.webp` path and a pack/per-pack count. That path\n// addressed a POSITION IN A MUTABLE COLLECTION on a site KunUI does not own,\n// so when that site stopped serving static files every avatar-less account\n// across six consumers 404'd at once. A URL that names another service does\n// not belong in a component library: the host supplies the pool\n// (`useKunUIConfig().avatarFallbackPool`), KunUI only chooses from it.\n\nconst hash = (value: string): number => {\n let h = 0\n for (let i = 0; i < value.length; i++) {\n h = (Math.imul(h, 31) + value.charCodeAt(i)) >>> 0\n }\n return h\n}\n\n/**\n * Deterministically pick one image from an avatar fallback pool.\n *\n * The same `seed` always yields the same entry on server and client, so there\n * is no hydration mismatch and no framework state is needed.\n *\n * `pool` is treated as a FIXED-LENGTH array: the index is\n * `hash(seed) % pool.length`, so adding or removing an entry re-assigns every\n * seed, while replacing one entry in place moves only the seeds that land on\n * it. Pool providers should edit slots rather than resize.\n *\n * An empty pool returns the bundled data URI, which cannot fail to load.\n */\nexport const pickAvatarFallback = (seed = '', pool: readonly string[] = []): string =>\n pool.length > 0 ? (pool[hash(seed) % pool.length] ?? KUN_AVATAR_FALLBACK) : KUN_AVATAR_FALLBACK\n\n/**\n * @deprecated Renamed to `pickAvatarFallback`, which takes the pool the host\n * configured. This alias no longer returns a sticker URL — it returns the\n * bundled fallback for any input, because the host it used to point at stopped\n * serving those files. Pass a pool, or read the resolved image off KunAvatar.\n */\nexport const getRandomSticker = (id = ''): string => pickAvatarFallback(id)\n","// Chat limits and timings shared with the server and the Flutter port.\n\n/** Longest message text, in UTF-16 code units (Telegram's value). */\nexport const KUN_CHAT_TEXT_LIMIT = 4096\n/** Most photos one album can hold. */\nexport const KUN_CHAT_ALBUM_LIMIT = 10\n/** A client sends at most one typing notification per this many ms. */\nexport const KUN_CHAT_TYPING_INTERVAL = 5000\n/** A typing notification not renewed within this many ms has expired. */\nexport const KUN_CHAT_TYPING_TIMEOUT = 6000\n","import type { KunChatEntity, KunChatEntityType } from './types.ts'\n\n// Entities → a render tree. This file is the specification the Flutter port\n// copies line for line, so every rule is spelled out and none depends on a\n// JavaScript quirk: offsets are UTF-16 code units, which is what both\n// `String.prototype.slice` and Dart's `String.substring` index.\n\nconst KNOWN_TYPES: ReadonlySet<string> = new Set<KunChatEntityType>([\n 'bold',\n 'italic',\n 'underline',\n 'strikethrough',\n 'spoiler',\n 'code',\n 'pre',\n 'blockquote',\n 'text_link',\n 'mention',\n 'url',\n])\n\n/** Types whose content is literal: nothing may nest inside them. */\nconst LEAF_TYPES: ReadonlySet<string> = new Set(['code', 'pre'])\n\n/** Types rendered as links. A link inside a link is invalid HTML (`<a>` in\n * `<a>`), so the inner one is dropped. */\nconst LINK_TYPES: ReadonlySet<string> = new Set(['text_link', 'mention', 'url'])\n\n/** Types that break the line around themselves. */\nexport const KUN_CHAT_BLOCK_ENTITY_TYPES: ReadonlySet<string> = new Set([\n 'pre',\n 'blockquote',\n])\n\n// Tie-break for entities covering the exact same range: the earlier type is\n// the outer one. Blocks outermost, links outside formatting (a link keeps its\n// whole styled label clickable), code innermost.\nconst NESTING_ORDER: readonly KunChatEntityType[] = [\n 'blockquote',\n 'pre',\n 'text_link',\n 'mention',\n 'url',\n 'spoiler',\n 'bold',\n 'italic',\n 'underline',\n 'strikethrough',\n 'code',\n]\nconst rank = (type: string) => NESTING_ORDER.indexOf(type as KunChatEntityType)\n\nconst isHighSurrogate = (code: number) => code >= 0xd800 && code <= 0xdbff\nconst isLowSurrogate = (code: number) => code >= 0xdc00 && code <= 0xdfff\n\n/** Whether `index` falls between the two halves of a surrogate pair. */\nconst splitsPair = (text: string, index: number) =>\n index > 0 &&\n index < text.length &&\n isHighSurrogate(text.charCodeAt(index - 1)) &&\n isLowSurrogate(text.charCodeAt(index))\n\ninterface Range {\n entity: KunChatEntity\n start: number\n end: number\n}\n\nconst compareRanges = (a: Range, b: Range) =>\n a.start - b.start || b.end - a.end || rank(a.entity.type) - rank(b.entity.type)\n\nconst cleanEntity = (e: KunChatEntity, offset: number, length: number): KunChatEntity => {\n const out: KunChatEntity = { type: e.type, offset, length }\n if (e.type === 'mention') out.user_id = e.user_id\n if (e.type === 'text_link') out.url = e.url\n if (e.type === 'pre' && e.language) out.language = e.language\n return out\n}\n\n/** Inline formatting: no link, no block, no literal content. Touching runs of\n * one type are one run, and a line break at either end draws nothing. */\nconst FORMAT_TYPES: ReadonlySet<string> = new Set([\n 'bold',\n 'italic',\n 'underline',\n 'strikethrough',\n 'spoiler',\n])\n\nconst mergeTouching = (ranges: Range[]): Range[] => {\n const out: Range[] = []\n const last = new Map<string, Range>()\n for (const r of [...ranges].sort(compareRanges)) {\n const prev = FORMAT_TYPES.has(r.entity.type) ? last.get(r.entity.type) : undefined\n if (prev && r.start <= prev.end) {\n prev.end = Math.max(prev.end, r.end)\n continue\n }\n out.push(r)\n if (FORMAT_TYPES.has(r.entity.type)) last.set(r.entity.type, r)\n }\n return out\n}\n\n// A quote is a block, so it must sit outside every inline entity: anything\n// that straddles a quote boundary is cut there. `quotes` must be the quotes\n// that survive nesting: cutting at one that is later dropped leaves a cut\n// with no cause, which the next pass merges away.\nconst splitAtQuotes = (ranges: Range[], quotes: Range[]): Range[] => {\n const cuts = quotes.flatMap((r) => [r.start, r.end])\n return ranges.flatMap((r) => {\n const inner = cuts.filter((c) => c > r.start && c < r.end).sort((a, b) => a - b)\n const points = [r.start, ...new Set(inner), r.end]\n return points.slice(1).map((end, i) => ({ entity: r.entity, start: points[i]!, end }))\n })\n}\n\n/**\n * Make an entity list safe to render, without ever changing `text`:\n *\n * 1. Drop unknown types, non-integer or negative positions, empty ranges, a\n * `text_link` without a `url` and a `mention` without a `user_id`; clamp\n * the end to the text. Widen a range that would cut a surrogate pair (an\n * emoji) in half. Pull a blockquote's end in over trailing line breaks.\n * 2. Merge touching or overlapping runs of one inline format (bold, italic,\n * underline, strikethrough, spoiler).\n * 3. Settle the blockquotes among themselves (steps 5 and 6, quotes only),\n * then cut every other entity at the boundaries of a quote that survived,\n * so quotes are always outermost.\n * 4. Pull the ends of an inline format in over line breaks, which draw\n * nothing there (a blockquote's end, before step 3).\n * 5. Order by start, then longer first, then by nesting order; split an\n * entity that partially crosses another at the boundary, so every pair\n * nests or is disjoint.\n * 6. Drop what cannot nest: anything inside `code`/`pre`, a type inside the\n * same type, a link inside a link.\n *\n * The result is a fixed point: normalizing it again changes nothing. The\n * server already guarantees most of this; the client does it anyway so a bad\n * row renders instead of throwing.\n */\nexport const normalizeKunChatEntities = (\n text: string,\n entities: readonly KunChatEntity[] | null | undefined\n): KunChatEntity[] => {\n if (!entities?.length || !text) return []\n\n let ranges: Range[] = []\n for (const e of entities) {\n if (!e || !KNOWN_TYPES.has(e.type)) continue\n if (!Number.isInteger(e.offset) || !Number.isInteger(e.length)) continue\n if (e.offset < 0 || e.length <= 0) continue\n if (e.type === 'text_link' && (typeof e.url !== 'string' || !e.url)) continue\n if (e.type === 'mention' && (typeof e.user_id !== 'string' || !e.user_id)) continue\n let start = e.offset\n let end = Math.min(e.offset + e.length, text.length)\n if (start >= end) continue\n if (splitsPair(text, start)) start -= 1\n if (splitsPair(text, end)) end += 1\n // Before the cuts below, which must see the quote's final boundaries.\n if (e.type === 'blockquote') while (end > start && text[end - 1] === '\\n') end--\n if (start < end) ranges.push({ entity: e, start, end })\n }\n\n // Every piece made from here on, the crossing splits included, is trimmed,\n // or normalizing twice would trim what the first pass left.\n const trimmed = (r: Range) => {\n if (FORMAT_TYPES.has(r.entity.type)) {\n while (r.start < r.end && text[r.start] === '\\n') r.start++\n while (r.end > r.start && text[r.end - 1] === '\\n') r.end--\n }\n return r.start < r.end\n }\n const nest = (ranges: Range[]): Range[] => {\n const queue = ranges.filter(trimmed).sort(compareRanges)\n const enqueue = (r: Range) => {\n let i = 0\n while (i < queue.length && compareRanges(queue[i]!, r) <= 0) i++\n queue.splice(i, 0, r)\n }\n\n const out: Range[] = []\n const stack: Range[] = []\n while (queue.length) {\n const r = queue.shift()!\n while (stack.length && stack[stack.length - 1]!.end <= r.start) stack.pop()\n const parent = stack[stack.length - 1]\n if (parent && r.end > parent.end) {\n // Crosses the parent's end: keep the part inside, requeue the rest.\n const rest: Range = { entity: r.entity, start: parent.end, end: r.end }\n if (trimmed(rest)) enqueue(rest)\n r.end = parent.end\n if (!trimmed(r)) continue\n // Shorter now, it may sort after entities still waiting.\n if (queue.length && compareRanges(r, queue[0]!) > 0) {\n enqueue(r)\n continue\n }\n }\n const blocked = stack.some(\n (a) =>\n LEAF_TYPES.has(a.entity.type) ||\n a.entity.type === r.entity.type ||\n (LINK_TYPES.has(a.entity.type) && LINK_TYPES.has(r.entity.type))\n )\n if (blocked) continue\n stack.push(r)\n out.push(r)\n }\n return out\n }\n\n // Everything else is cut at the quotes' boundaries, so only a quote can\n // hold a quote: nesting the quotes alone settles which ones survive.\n const quotes = nest(ranges.filter((r) => r.entity.type === 'blockquote'))\n const inline = mergeTouching(ranges.filter((r) => r.entity.type !== 'blockquote'))\n const out = nest([...quotes, ...splitAtQuotes(inline, quotes)])\n\n return out.map((r) => cleanEntity(r.entity, r.start, r.end - r.start))\n}\n\nexport interface KunChatTextLeaf {\n kind: 'text'\n text: string\n /** Where `text` starts in the message text, in UTF-16 code units. */\n offset: number\n}\n\nexport interface KunChatEntityNode {\n kind: 'entity'\n entity: KunChatEntity\n children: KunChatTextNode[]\n}\n\nexport type KunChatTextNode = KunChatTextLeaf | KunChatEntityNode\n\nconst isBlock = (node: KunChatTextNode | undefined) =>\n node?.kind === 'entity' && KUN_CHAT_BLOCK_ENTITY_TYPES.has(node.entity.type)\n\n// A block (pre, blockquote) already starts and ends a line, so the `\\n` that\n// separates it from the surrounding text would render as an extra blank line.\n// Drop exactly one line break on each side — the text keeps it; only the tree\n// omits it.\nconst trimAroundBlocks = (nodes: KunChatTextNode[]): KunChatTextNode[] => {\n const out: KunChatTextNode[] = []\n nodes.forEach((node, i) => {\n if (node.kind === 'entity') {\n out.push({ ...node, children: trimAroundBlocks(node.children) })\n return\n }\n let { text, offset } = node\n if (isBlock(nodes[i - 1]) && text.startsWith('\\n')) {\n text = text.slice(1)\n offset += 1\n }\n if (isBlock(nodes[i + 1]) && text.endsWith('\\n')) text = text.slice(0, -1)\n if (text) out.push({ kind: 'text', text, offset })\n })\n return out\n}\n\n/**\n * Turn `text` + `entities` into a tree: entity nodes whose children are text\n * leaves and nested entity nodes, in document order. The entities are\n * normalized first (see `normalizeKunChatEntities`), so any input renders.\n */\nexport const buildKunChatEntityTree = (\n text: string,\n entities: readonly KunChatEntity[] | null | undefined\n): KunChatTextNode[] => {\n const root: KunChatEntityNode = {\n kind: 'entity',\n entity: { type: 'bold', offset: 0, length: text.length },\n children: [],\n }\n const stack: { node: KunChatEntityNode; end: number; cursor: number }[] = [\n { node: root, end: text.length, cursor: 0 },\n ]\n const flushTo = (frame: (typeof stack)[number], to: number) => {\n if (to > frame.cursor) {\n frame.node.children.push({\n kind: 'text',\n text: text.slice(frame.cursor, to),\n offset: frame.cursor,\n })\n }\n frame.cursor = Math.max(frame.cursor, to)\n }\n const close = () => {\n const frame = stack.pop()!\n flushTo(frame, frame.end)\n stack[stack.length - 1]!.cursor = frame.end\n }\n\n for (const entity of normalizeKunChatEntities(text, entities)) {\n const start = entity.offset\n while (stack.length > 1 && stack[stack.length - 1]!.end <= start) close()\n const parent = stack[stack.length - 1]!\n flushTo(parent, start)\n const node: KunChatEntityNode = { kind: 'entity', entity, children: [] }\n parent.node.children.push(node)\n stack.push({ node, end: start + entity.length, cursor: start })\n }\n while (stack.length > 1) close()\n flushTo(stack[0]!, text.length)\n\n return trimAroundBlocks(root.children)\n}\n\n/** The plain text of a subtree, as rendered (block-adjacent breaks omitted). */\nexport const kunChatTreeText = (nodes: readonly KunChatTextNode[]): string =>\n nodes\n .map((n) => (n.kind === 'text' ? n.text : kunChatTreeText(n.children)))\n .join('')\n\n/**\n * The part of a message from `start` to `end` (UTF-16 code units), with the\n * entities clipped to it and shifted to start at 0 — what a partial quote\n * carries. The range is widened rather than split through an emoji.\n */\nexport const sliceKunChatEntities = (\n text: string,\n entities: readonly KunChatEntity[] | null | undefined,\n start: number,\n end: number\n): { text: string; entities: KunChatEntity[] } => {\n let from = Math.max(0, Math.min(start, text.length))\n let to = Math.max(from, Math.min(end, text.length))\n if (splitsPair(text, from)) from -= 1\n if (splitsPair(text, to)) to += 1\n const clipped = normalizeKunChatEntities(text, entities).flatMap((e) => {\n const s = Math.max(e.offset, from)\n const t = Math.min(e.offset + e.length, to)\n return t > s ? [{ ...e, offset: s - from, length: t - s }] : []\n })\n const sliced = text.slice(from, to)\n return { text: sliced, entities: normalizeKunChatEntities(sliced, clipped) }\n}\n","import type { KunChatEntity, KunChatFormattedText } from './types.ts'\nimport { normalizeKunChatEntities } from './entities.ts'\n\n// Composer shortcuts ↔ entities. The composer is a plain textarea: what the\n// user types is parsed into `{ text, entities }` on send, and editing a sent\n// message formats it back. `formatKunChatMarkdown` is the inverse of\n// `parseKunChatMarkdown` — `parse(format(m))` returns `m` — for every message\n// except the few shapes the syntax cannot spell, listed on `format` below.\n//\n// The syntax, all of it:\n//\n// **bold** __italic__ ++underline++ ~~strikethrough~~ ||spoiler||\n// `code` ```lang⏎ pre ⏎``` [label](https://…) [label](mention:42)\n// > quoted line (at the start of a line; consecutive lines form one quote)\n//\n// Markers work inside words — Chinese has no spaces to anchor them to — and\n// only need non-empty content. A marker is exactly two characters: `***` is\n// text, as in TDLib's parser. A marker without a partner stays literal text.\n//\n// Escaping. A run of k backslashes before a special character stands for\n// ⌊k/2⌋ backslashes, and escapes that character when k is odd. Before\n// anything else a backslash is literal. In text, ` [ ] are always special,\n// and * _ + ~ | are special only next to their own twin (backslashes in\n// between don't count) — a lone one can never be a marker, so `a\\_b`,\n// `C:\\Users` and `¯\\_(ツ)_/¯` keep their backslashes. Inside `code` and a pre\n// block the only special character is `, inside a link target it is ). A line\n// whose text starts with backslashes and then `>` loses one backslash: `\\>`\n// is how a line starts with a literal `>`.\n\nconst PAIRS: ReadonlyArray<readonly [string, KunChatEntity['type']]> = [\n ['**', 'bold'],\n ['__', 'italic'],\n ['++', 'underline'],\n ['~~', 'strikethrough'],\n ['||', 'spoiler'],\n]\nconst PAIR_BY_TYPE = new Map(PAIRS.map(([m, t]) => [t, m]))\nconst PAIR_CHARS = new Set(['*', '_', '+', '~', '|'])\nconst TEXT_SPECIAL = new Set(['*', '_', '+', '~', '|', '`', '[', ']'])\nconst LANGUAGE = /^[A-Za-z0-9_+#.-]*$/\nconst MENTION = /^mention:(\\d+)$/\n\nconst backslashRun = (s: string, i: number, end: number) => {\n let k = 0\n while (i + k < end && s[i + k] === '\\\\') k++\n return k\n}\n\n/** The nearest character from `i` in direction `step` that is not a\n * backslash — the whole source, not just the current range, so a marker's\n * neighbour counts. */\nconst nonBackslash = (s: string, i: number, step: 1 | -1) => {\n while (i >= 0 && i < s.length && s[i] === '\\\\') i += step\n return s[i]\n}\n\n/** At the backslash run starting at `i`: its length, and whether it is\n * followed by a special character (and so escapes it when odd). The\n * character after the run is read past `end`: a run that ends a range sits\n * right before the range's closing marker, and the writer doubled it. */\nconst escapeAt = (s: string, i: number, end: number) => {\n const k = backslashRun(s, i, end)\n const j = i + k\n const c = s[j] ?? ''\n const special =\n c === '`' || c === '[' || c === ']'\n ? true\n : PAIR_CHARS.has(c) && (nonBackslash(s, i - 1, -1) === c || nonBackslash(s, j + 1, 1) === c)\n return { k, c, special }\n}\n\n/** Where scanning resumes after the backslash run at `i`. */\nconst skipEscape = (s: string, i: number, end: number) => {\n const { k, special } = escapeAt(s, i, end)\n return i + (special && k % 2 === 1 && i + k < end ? k + 1 : k)\n}\n\n\ninterface RawSpan {\n /** Index just past the closing marker. */\n end: number\n contentStart: number\n contentEnd: number\n language?: string\n}\n\n/** The next unescaped `closer` at or after `from`, in a raw context whose\n * only special character is `special`; -1 when there is none. */\nconst findRawCloser = (\n s: string,\n from: number,\n end: number,\n closer: string,\n special: string\n): number => {\n let p = from\n while (p < end) {\n if (s[p] === '\\\\') {\n const k = backslashRun(s, p, end)\n p += s[p + k] === special && k % 2 === 1 ? k + 1 : k\n continue\n }\n if (p + closer.length <= end && s.startsWith(closer, p)) return p\n p++\n }\n return -1\n}\n\n/** Undo raw-context escaping: backslash runs before `special` halve. A run\n * at the very end counts as before `special` when the closer follows it. */\nconst unescapeRaw = (s: string, special: string, closerFollows: boolean): string => {\n let out = ''\n let p = 0\n while (p < s.length) {\n if (s[p] !== '\\\\') {\n out += s[p]\n p++\n continue\n }\n const k = backslashRun(s, p, s.length)\n const next = p + k < s.length ? s[p + k] : closerFollows ? special : ''\n if (next !== special) {\n out += '\\\\'.repeat(k)\n p += k\n } else if (k % 2 === 1) {\n out += '\\\\'.repeat((k - 1) / 2) + special\n p += k + 1\n } else {\n out += '\\\\'.repeat(k / 2)\n p += k\n }\n }\n return out\n}\n\nconst matchCode = (s: string, i: number, end: number): RawSpan | null => {\n if (s[i] !== '`') return null\n const close = findRawCloser(s, i + 1, end, '`', '`')\n if (close <= i + 1) return null\n return { end: close + 1, contentStart: i + 1, contentEnd: close }\n}\n\nconst matchPre = (s: string, i: number, end: number): RawSpan | null => {\n if (!s.startsWith('```', i)) return null\n const open = i + 3\n const close = findRawCloser(s, open, end, '```', '`')\n if (close < 0) return null\n const trimEnd = (from: number) =>\n close > from && s[close - 1] === '\\n' ? close - 1 : close\n const nl = s.indexOf('\\n', open)\n if (nl >= 0 && nl < close && LANGUAGE.test(s.slice(open, nl))) {\n const contentEnd = trimEnd(nl + 1)\n if (contentEnd > nl + 1) {\n const language = s.slice(open, nl) || undefined\n return { end: close + 3, contentStart: nl + 1, contentEnd, language }\n }\n // \"```go⏎```\" is a block whose one line is \"go\", not an empty Go block.\n }\n const contentEnd = trimEnd(open)\n if (contentEnd <= open) return null\n return { end: close + 3, contentStart: open, contentEnd }\n}\n\ninterface LinkSpan {\n end: number\n labelStart: number\n labelEnd: number\n target: string\n}\n\nconst matchLink = (s: string, i: number, end: number): LinkSpan | null => {\n if (s[i] !== '[') return null\n let p = i + 1\n while (p < end) {\n if (s[p] === '\\\\') {\n p = skipEscape(s, p, end)\n continue\n }\n // A later `[` owns the `](` we would find: this one is literal text.\n if (s[p] === '[') return null\n if (s[p] === ']' && s[p + 1] === '(') {\n if (p === i + 1) return null\n const close = findRawCloser(s, p + 2, end, ')', ')')\n if (close <= p + 2) return null\n return {\n end: close + 1,\n labelStart: i + 1,\n labelEnd: p,\n target: unescapeRaw(s.slice(p + 2, close), ')', true),\n }\n }\n const raw = matchPre(s, p, end) ?? matchCode(s, p, end)\n p = raw ? raw.end : p + 1\n }\n return null\n}\n\n/** Length of the run of `s[i]` starting at `i`. */\nconst charRun = (s: string, i: number, end: number) => {\n let k = 1\n while (i + k < end && s[i + k] === s[i]) k++\n return k\n}\n\nconst findPairCloser = (s: string, from: number, end: number, marker: string) => {\n let p = from\n while (p < end) {\n if (s[p] === '\\\\') {\n p = skipEscape(s, p, end)\n continue\n }\n if (PAIR_CHARS.has(s[p]!)) {\n const run = charRun(s, p, end)\n if (run === 2 && p > from && s.startsWith(marker, p)) return p\n p += run\n continue\n }\n // Code, pre blocks and links are opaque: a marker inside one of them\n // cannot close a pair that started outside.\n const atom = matchPre(s, p, end) ?? matchCode(s, p, end) ?? matchLink(s, p, end)\n p = atom ? atom.end : p + 1\n }\n return -1\n}\n\n/**\n * Parse composer input into message text and entities. Never throws: input\n * that is not valid shortcut syntax stays literal text.\n */\nexport const parseKunChatMarkdown = (source: string): KunChatFormattedText => {\n let text = ''\n const entities: KunChatEntity[] = []\n const quotedLines: [number, number][] = []\n let atLineStart = true\n let lineQuoted = false\n let lineOffset = 0\n\n const endLine = () => {\n if (lineQuoted) quotedLines.push([lineOffset, text.length])\n }\n\n const parseRange = (start: number, end: number) => {\n let i = start\n while (i < end) {\n if (atLineStart) {\n atLineStart = false\n lineOffset = text.length\n lineQuoted = false\n if (i + 2 <= end && source.startsWith('> ', i)) {\n lineQuoted = true\n i += 2\n } else if (source[i] === '>' && (i + 1 === end || source[i + 1] === '\\n')) {\n lineQuoted = true\n i += 1\n }\n if (source[i] === '\\\\' && source[i + backslashRun(source, i, end)] === '>') i += 1\n continue\n }\n\n const c = source[i]!\n if (c === '\\\\') {\n const { k, c: next, special } = escapeAt(source, i, end)\n if (!special) {\n text += '\\\\'.repeat(k)\n i += k\n } else if (k % 2 === 1 && i + k < end) {\n text += '\\\\'.repeat((k - 1) / 2) + next\n i += k + 1\n } else {\n text += '\\\\'.repeat(k / 2)\n i += k\n }\n continue\n }\n\n if (c === '\\n') {\n endLine()\n text += '\\n'\n atLineStart = true\n i++\n continue\n }\n\n const raw = matchPre(source, i, end)\n const code = raw ? null : matchCode(source, i, end)\n const span = raw ?? code\n if (span) {\n const offset = text.length\n text += unescapeRaw(\n source.slice(span.contentStart, span.contentEnd),\n '`',\n source[span.contentEnd] === '`'\n )\n const entity: KunChatEntity = {\n type: raw ? 'pre' : 'code',\n offset,\n length: text.length - offset,\n }\n if (span.language) entity.language = span.language\n entities.push(entity)\n i = span.end\n continue\n }\n\n const link = matchLink(source, i, end)\n if (link) {\n const offset = text.length\n parseRange(link.labelStart, link.labelEnd)\n const length = text.length - offset\n const mention = link.target.match(MENTION)\n if (length > 0) {\n entities.push(\n mention\n ? { type: 'mention', offset, length, user_id: mention[1] }\n : { type: 'text_link', offset, length, url: link.target }\n )\n }\n i = link.end\n continue\n }\n\n if (PAIR_CHARS.has(c)) {\n // Exactly two: `***` or `****` is not a marker, it is text.\n const run = charRun(source, i, end)\n if (run !== 2) {\n text += c.repeat(run)\n i += run\n continue\n }\n const [marker, type] = PAIRS.find(([m]) => m[0] === c)!\n const close = findPairCloser(source, i + 2, end, marker)\n if (close > i + 2) {\n const offset = text.length\n parseRange(i + 2, close)\n const length = text.length - offset\n if (length > 0) entities.push({ type, offset, length })\n i = close + 2\n } else {\n text += marker\n i += 2\n }\n continue\n }\n\n text += c\n i++\n }\n }\n\n parseRange(0, source.length)\n endLine()\n\n // Consecutive quoted lines form one quote, the line breaks between included.\n for (let q = 0; q < quotedLines.length; q++) {\n const start = quotedLines[q]![0]\n let end = quotedLines[q]![1]\n while (q + 1 < quotedLines.length && quotedLines[q + 1]![0] === end + 1) {\n end = quotedLines[++q]![1]\n }\n if (end > start) entities.push({ type: 'blockquote', offset: start, length: end - start })\n }\n\n return { text, entities: normalizeKunChatEntities(text, entities) }\n}\n\n\ntype Context = 'text' | 'code' | 'pre' | 'url'\n\ninterface LitAtom {\n kind: 'lit'\n ch: string\n ctx: Context\n /** Inside a link label, where a literal `[` must be escaped. */\n inLabel: boolean\n escape: boolean\n}\ninterface MarkAtom {\n kind: 'mark'\n s: string\n /** The parser jumps over it without a line-start check: a pair's closing\n * marker, and a link's `](`…`)` (whose target atoms are `url`). */\n closer?: boolean\n}\ntype Atom = LitAtom | MarkAtom\n\ninterface FormatNode {\n entity: KunChatEntity | null\n start: number\n end: number\n children: FormatNode[]\n}\n\n/**\n * Turn message text + entities back into composer input — for editing a sent\n * message, or restoring a draft. Parsing the result gives back the same text\n * and (normalized) entities, except for what the syntax cannot spell:\n *\n * - `url` entities are dropped; the server detects links again on save.\n * - A blockquote is dropped unless it starts and ends at line breaks that\n * are text — not inside a code span or pre block.\n * - Blockquotes on consecutive lines are written, and come back, as one.\n * - A `pre` language with characters outside `A-Z a-z 0-9 _ + # . -` is\n * dropped, as is a `text_link` whose URL is itself `mention:<digits>`.\n */\nexport const formatKunChatMarkdown = (\n text: string,\n entities: readonly KunChatEntity[] | null | undefined\n): string => {\n // A quote is spelled as `> ` lines, so it needs a line break on each side\n // that the parser reads as text — not one inside a code span or pre block.\n // Quotes that cannot be spelled go, and the rest is normalized again from\n // the original entities, so whatever those quotes had cut apart joins up.\n const withoutUrls = (entities ?? []).filter((e) => e.type !== 'url')\n const first = normalizeKunChatEntities(text, withoutUrls)\n const inRaw = (i: number) =>\n first.some((r) => (r.type === 'code' || r.type === 'pre') && r.offset <= i && i < r.offset + r.length)\n const breakAt = (i: number) => text[i] === '\\n' && !inRaw(i)\n const quotes: KunChatEntity[] = []\n for (const q of first) {\n if (q.type !== 'blockquote') continue\n const end = q.offset + q.length\n if (!(q.offset === 0 || breakAt(q.offset - 1)) || !(end === text.length || breakAt(end))) continue\n const prev = quotes[quotes.length - 1]\n if (prev && prev.offset + prev.length + 1 === q.offset) prev.length = end - prev.offset\n else quotes.push({ ...q })\n }\n const list = normalizeKunChatEntities(text, [\n ...withoutUrls.filter((e) => e.type !== 'blockquote'),\n ...quotes,\n ])\n\n const root: FormatNode = { entity: null, start: 0, end: text.length, children: [] }\n const stack: FormatNode[] = [root]\n for (const entity of list) {\n const node: FormatNode = {\n entity,\n start: entity.offset,\n end: entity.offset + entity.length,\n children: [],\n }\n while (stack.length > 1 && stack[stack.length - 1]!.end <= node.start) stack.pop()\n stack[stack.length - 1]!.children.push(node)\n stack.push(node)\n }\n\n const atoms: Atom[] = []\n const mark = (s: string, closer = false) => atoms.push({ kind: 'mark', s, closer })\n const lit = (ch: string, ctx: Context, inLabel: boolean) =>\n atoms.push({ kind: 'lit', ch, ctx, inLabel, escape: false })\n let quoteDepth = 0\n\n const emitText = (from: number, to: number, inLabel: boolean) => {\n for (let i = from; i < to; i++) {\n lit(text[i]!, 'text', inLabel)\n // A normalized quote never ends in a line break, so every break inside\n // one is followed by another quoted line.\n if (text[i] === '\\n' && quoteDepth > 0) mark('> ')\n }\n }\n const emitRaw = (from: number, to: number, ctx: Context) => {\n for (let i = from; i < to; i++) lit(text[i]!, ctx, false)\n }\n\n const walk = (node: FormatNode, inLabel: boolean) => {\n let cursor = node.start\n for (const child of node.children) {\n emitText(cursor, child.start, inLabel)\n emitEntity(child, inLabel)\n cursor = child.end\n }\n emitText(cursor, node.end, inLabel)\n }\n\n const emitEntity = (node: FormatNode, inLabel: boolean) => {\n const e = node.entity!\n const pair = PAIR_BY_TYPE.get(e.type)\n if (pair) {\n mark(pair)\n walk(node, inLabel)\n mark(pair, true)\n } else if (e.type === 'code') {\n mark('`')\n emitRaw(node.start, node.end, 'code')\n mark('`')\n } else if (e.type === 'pre') {\n const language = e.language && LANGUAGE.test(e.language) ? e.language : ''\n mark(`\\`\\`\\`${language}\\n`)\n emitRaw(node.start, node.end, 'pre')\n mark('\\n```')\n } else if (e.type === 'text_link' || e.type === 'mention') {\n mark('[')\n walk(node, true)\n mark('](', true)\n const target = e.type === 'mention' ? `mention:${e.user_id}` : e.url!\n for (const ch of target) lit(ch, 'url', false)\n mark(')', true)\n } else if (e.type === 'blockquote') {\n mark('> ')\n quoteDepth++\n walk(node, inLabel)\n quoteDepth--\n } else {\n walk(node, inLabel)\n }\n }\n\n walk(root, false)\n return serialize(atoms)\n}\n\nconst isLit = (a: Atom | undefined, ch: string, ctx: Context): a is LitAtom =>\n a?.kind === 'lit' && a.ch === ch && a.ctx === ctx\n\nconst firstChar = (a: Atom | undefined) =>\n a === undefined ? undefined : a.kind === 'mark' ? a.s[0] : a.ch\n\n/** The first character after atom `from` that is not a backslash, as it\n * will be written. */\nconst rawCharFrom = (atoms: Atom[], from: number): string | undefined => {\n for (let i = from; i < atoms.length; i++) {\n const a = atoms[i]!\n if (a.kind === 'mark') {\n const c = [...a.s].find((ch) => ch !== '\\\\')\n if (c !== undefined) return c\n } else if (a.escape || a.ch !== '\\\\') {\n return a.ch\n }\n }\n return undefined\n}\n\nconst lastNonBackslash = (out: string) => {\n let i = out.length - 1\n while (i >= 0 && out[i] === '\\\\') i--\n return out[i]\n}\n\n/** Whether a backslash run written before atom `j` would be read as an\n * escape — mirrors the parser's `escapeAt` — in which case it is doubled. */\nconst beforeSpecial = (atoms: Atom[], j: number, ctx: Context, out: string): boolean => {\n const next = atoms[j]\n if (next === undefined) return false\n if (next.kind === 'lit' && next.escape) return true\n const c = next.kind === 'mark' ? next.s[0]! : next.ch\n if (ctx !== 'text') return c === (ctx === 'url' ? ')' : '`')\n if (next.kind === 'mark') return TEXT_SPECIAL.has(c)\n if (c === '`' || c === '[' || c === ']') return true\n return PAIR_CHARS.has(c) && (lastNonBackslash(out) === c || rawCharFrom(atoms, j + 1) === c)\n}\n\nconst serialize = (atoms: Atom[]): string => {\n // Which literals need a backslash.\n atoms.forEach((a, i) => {\n if (a.kind !== 'lit') return\n const prev = atoms[i - 1]\n const next = atoms[i + 1]\n if (a.ctx === 'text') {\n if (PAIR_CHARS.has(a.ch)) {\n // No two active copies of a pair character may touch, or they would\n // read as a marker.\n const prevActive =\n prev?.kind === 'mark'\n ? prev.s.endsWith(a.ch)\n : prev !== undefined && !prev.escape && prev.ch === a.ch\n a.escape = prevActive || firstChar(next) === a.ch\n } else if (a.ch === '`') {\n a.escape = true\n } else if (a.ch === '[') {\n a.escape = a.inLabel\n } else if (a.ch === ']') {\n a.escape = next?.kind === 'lit' && next.ch === '('\n }\n } else if (a.ctx === 'code') {\n a.escape = a.ch === '`'\n } else if (a.ctx === 'url') {\n a.escape = a.ch === ')'\n } else if (a.ch === '`') {\n // In a pre block only three backticks in a row can close it.\n let s = i\n while (isLit(atoms[s - 1], '`', 'pre')) s--\n let e = i\n while (isLit(atoms[e + 1], '`', 'pre')) e++\n a.escape = e - s + 1 >= 3\n }\n })\n\n // The parser's `atLineStart`, tracked over the atoms rather than read off\n // the output: a line break that ends a link label is followed in the source\n // by `](…)`, and the parser checks the line start after it. Reading the\n // output lost the text after `[⏎](mention:12)` when it began `\\>` or `>`.\n // After a `> ` prefix the parser checks only the very next character.\n let lineStart = true\n let afterPrefix = false\n let out = ''\n let i = 0\n while (i < atoms.length) {\n const a = atoms[i]!\n const skipped = a.kind === 'mark' ? a.closer === true : a.ctx === 'url'\n const checked = lineStart && !skipped\n const leading = afterPrefix || checked\n afterPrefix = false\n if (!skipped) lineStart = false\n if (a.kind === 'mark') {\n out += a.s\n afterPrefix = checked && a.s === '> '\n i++\n continue\n }\n if (a.ctx === 'text' && leading) {\n let j = i\n while (isLit(atoms[j], '\\\\', 'text')) j++\n if (isLit(atoms[j], '>', 'text')) out += '\\\\'\n }\n if (a.ch === '\\\\') {\n let j = i\n while (isLit(atoms[j], '\\\\', a.ctx)) j++\n out += '\\\\'.repeat(beforeSpecial(atoms, j, a.ctx, out) ? 2 * (j - i) : j - i)\n i = j\n continue\n }\n out += a.escape ? `\\\\${a.ch}` : a.ch\n if (a.ctx === 'text' && a.ch === '\\n') lineStart = true\n i++\n }\n return out\n}\n","// Telegram's album mosaic, ported from Telegram Desktop's grouped_layout.cpp\n// by way of tweb's groupedLayout.ts, constant for constant. Not telegram-tt's\n// copy: it passes a maxHeight into the 5+ case, so the 4/3 target height\n// never applies and five photos lay out differently from every other client.\n//\n// The output is in layout units; a renderer divides by `width` / `height` and\n// places each tile by percentage, so the mosaic scales to any bubble width\n// with no measuring.\n\nexport interface KunChatAlbumSize {\n width: number\n height: number\n}\n\n/** Which outer edges of the mosaic a tile touches — its rounded corners. */\nexport const KUN_CHAT_ALBUM_SIDE = {\n top: 1,\n right: 2,\n bottom: 4,\n left: 8,\n} as const\n\nexport interface KunChatAlbumTile {\n x: number\n y: number\n width: number\n height: number\n /** Bitmask of `KUN_CHAT_ALBUM_SIDE`. */\n sides: number\n}\n\nexport interface KunChatAlbumLayout {\n width: number\n height: number\n tiles: KunChatAlbumTile[]\n}\n\nexport interface KunChatAlbumOptions {\n /** Default 420, tweb's desktop bubble width. */\n maxWidth?: number\n /** Narrowest tile. Default 100. */\n minWidth?: number\n /** Gap between tiles. Default 2. */\n spacing?: number\n}\n\nconst { top: T, right: R, bottom: B, left: L } = KUN_CHAT_ALBUM_SIDE\nconst sum = (xs: number[]) => xs.reduce((a, b) => a + b, 0)\nconst clamp = (v: number, min: number, max: number) => Math.min(Math.max(v, min), max)\n\nconst tile = (x: number, y: number, width: number, height: number, sides: number) => ({\n x,\n y,\n width,\n height,\n sides,\n})\n\nconst layoutComplex = (\n ratios: number[],\n averageRatio: number,\n maxWidth: number,\n minWidth: number,\n spacing: number\n): KunChatAlbumTile[] => {\n const maxHeight = (maxWidth * 4) / 3\n const cropped = ratios.map((r) =>\n averageRatio > 1.1 ? clamp(r, 1, 2.75) : clamp(r, 0.6667, 1)\n )\n const count = cropped.length\n const attempts: { counts: number[]; heights: number[] }[] = []\n const push = (counts: number[]) => {\n let offset = 0\n const heights = counts.map((c) => {\n const h = (maxWidth - (c - 1) * spacing) / sum(cropped.slice(offset, offset + c))\n offset += c\n return h\n })\n attempts.push({ counts, heights })\n }\n\n for (let first = 1; first !== count; first++) {\n const second = count - first\n if (first <= 3 && second <= 3) push([first, second])\n }\n for (let first = 1; first < count - 1; first++) {\n for (let second = 1; second < count - first; second++) {\n const third = count - first - second\n if (first <= 3 && second <= (averageRatio < 0.85 ? 4 : 3) && third <= 3) {\n push([first, second, third])\n }\n }\n }\n for (let first = 1; first < count - 1; first++) {\n for (let second = 1; second < count - first; second++) {\n for (let third = 1; third < count - first - second; third++) {\n const fourth = count - first - second - third\n if (first <= 3 && second <= 3 && third <= 3 && fourth <= 3) {\n push([first, second, third, fourth])\n }\n }\n }\n }\n\n // More than 12 photos leave no split of rows of at most three (tweb throws\n // there). Albums hold 10, but a bad row must render: fall back to rows of\n // three.\n if (!attempts.length) {\n push(Array.from({ length: Math.ceil(count / 3) }, (_, i) => Math.min(3, count - i * 3)))\n }\n let best = attempts[0]!\n let bestDiff = Infinity\n for (const attempt of attempts) {\n const { counts, heights } = attempt\n const total = sum(heights) + spacing * (counts.length - 1)\n const tooShort = Math.min(...heights) < minWidth ? 1.5 : 1\n const topHeavy = counts.some((c, i) => i > 0 && counts[i - 1]! > c) ? 1.5 : 1\n const diff = Math.abs(total - maxHeight) * tooShort * topHeavy\n if (diff < bestDiff) {\n best = attempt\n bestDiff = diff\n }\n }\n\n const tiles: KunChatAlbumTile[] = []\n let index = 0\n let y = 0\n best.counts.forEach((cols, row) => {\n const lineHeight = best.heights[row]!\n const height = Math.round(lineHeight)\n let x = 0\n for (let col = 0; col < cols; col++) {\n const sides =\n (row === 0 ? T : 0) |\n (row === best.counts.length - 1 ? B : 0) |\n (col === 0 ? L : 0) |\n (col === cols - 1 ? R : 0)\n const width =\n col === cols - 1 ? maxWidth - x : Math.round(cropped[index]! * lineHeight)\n tiles.push(tile(x, y, width, height, sides))\n x += width + spacing\n index++\n }\n y += height + spacing\n })\n return tiles\n}\n\n/**\n * Lay out an album of 1–10 photos as Telegram does. Sizes with a zero or\n * missing side are treated as square.\n */\nexport const layoutKunChatAlbum = (\n sizes: readonly KunChatAlbumSize[],\n options: KunChatAlbumOptions = {}\n): KunChatAlbumLayout => {\n const maxWidth = options.maxWidth ?? 420\n const minWidth = options.minWidth ?? 100\n const s = options.spacing ?? 2\n const maxHeight = maxWidth\n const r = sizes.map((z) => (z.width > 0 && z.height > 0 ? z.width / z.height : 1))\n const n = r.length\n const shape = r.map((x) => (x > 1.2 ? 'w' : x < 0.8 ? 'n' : 'q')).join('')\n // The `+ 1` is in Telegram Desktop too.\n const averageRatio = (1 + sum(r)) / n\n const maxSizeRatio = maxWidth / maxHeight\n\n let tiles: KunChatAlbumTile[]\n if (n === 0) {\n tiles = []\n } else if (n === 1) {\n tiles = [tile(0, 0, maxWidth, maxWidth / r[0]!, T | R | B | L)]\n } else if (n >= 5 || r.some((x) => x > 2)) {\n tiles = layoutComplex(r, averageRatio, maxWidth, minWidth, s)\n } else if (n === 2) {\n const [r0, r1] = r as [number, number]\n if (shape === 'ww' && averageRatio > 1.4 * maxSizeRatio && r1 - r0 < 0.2) {\n const h = Math.round(Math.min(maxWidth / r0, maxWidth / r1, (maxHeight - s) / 2))\n tiles = [tile(0, 0, maxWidth, h, L | T | R), tile(0, h + s, maxWidth, h, L | B | R)]\n } else if (shape === 'ww' || shape === 'qq') {\n const w = (maxWidth - s) / 2\n const h = Math.round(Math.min(w / r0, w / r1, maxHeight))\n tiles = [tile(0, 0, w, h, T | L | B), tile(w + s, 0, w, h, T | R | B)]\n } else {\n const w2 = Math.min(\n Math.round(Math.max(0.4 * (maxWidth - s), (maxWidth - s) / r0 / (1 / r0 + 1 / r1))),\n maxWidth - s - Math.round(minWidth * 1.5)\n )\n const w1 = maxWidth - w2 - s\n const h = Math.min(maxHeight, Math.round(Math.min(w1 / r0, w2 / r1)))\n tiles = [tile(0, 0, w1, h, T | L | B), tile(w1 + s, 0, w2, h, T | R | B)]\n }\n } else if (n === 3) {\n const [r0, r1, r2] = r as [number, number, number]\n if (shape[0] === 'n') {\n const h0 = maxHeight\n const h2 = Math.round(Math.min((maxHeight - s) / 2, (r1 * (maxWidth - s)) / (r2 + r1)))\n const h1 = h0 - h2 - s\n const wR = Math.max(minWidth, Math.round(Math.min((maxWidth - s) / 2, h2 * r2, h1 * r1)))\n const wL = Math.min(Math.round(h0 * r0), maxWidth - s - wR)\n tiles = [\n tile(0, 0, wL, h0, T | L | B),\n tile(wL + s, 0, wR, h1, T | R),\n tile(wL + s, h1 + s, wR, h2, B | R),\n ]\n } else {\n const h0 = Math.round(Math.min(maxWidth / r0, (maxHeight - s) * 0.66))\n const w1 = (maxWidth - s) / 2\n const h1 = Math.min(maxHeight - h0 - s, Math.round(Math.min(w1 / r1, w1 / r2)))\n const w2 = maxWidth - w1 - s\n tiles = [\n tile(0, 0, maxWidth, h0, L | T | R),\n tile(0, h0 + s, w1, h1, B | L),\n tile(w1 + s, h0 + s, w2, h1, B | R),\n ]\n }\n } else {\n const [r0, r1, r2, r3] = r as [number, number, number, number]\n if (shape[0] === 'w') {\n const h0 = Math.round(Math.min(maxWidth / r0, (maxHeight - s) * 0.66))\n const h = Math.round((maxWidth - 2 * s) / (r1 + r2 + r3))\n const w0 = Math.max(minWidth, Math.round(Math.min((maxWidth - 2 * s) * 0.4, h * r1)))\n const w2 = Math.round(Math.max(minWidth, (maxWidth - 2 * s) * 0.33, h * r3))\n const w1 = maxWidth - w0 - w2 - 2 * s\n const h1 = Math.min(maxHeight - h0 - s, h)\n tiles = [\n tile(0, 0, maxWidth, h0, L | T | R),\n tile(0, h0 + s, w0, h1, B | L),\n tile(w0 + s, h0 + s, w1, h1, B),\n tile(w0 + s + w1 + s, h0 + s, w2, h1, R | B),\n ]\n } else {\n const h = maxHeight\n const w0 = Math.round(Math.min(h * r0, (maxWidth - s) * 0.6))\n const w = Math.round((maxHeight - 2 * s) / (1 / r1 + 1 / r2 + 1 / r3))\n const h0 = Math.round(w / r1)\n const h1 = Math.round(w / r2)\n const h2 = h - h0 - h1 - 2 * s\n const w1 = Math.max(minWidth, Math.min(maxWidth - w0 - s, w))\n tiles = [\n tile(0, 0, w0, h, T | L | B),\n tile(w0 + s, 0, w1, h0, T | R),\n tile(w0 + s, h0 + s, w1, h1, R),\n tile(w0 + s, h0 + h1 + 2 * s, w1, h2, B | R),\n ]\n }\n }\n\n return {\n width: Math.max(0, ...tiles.map((t) => t.x + t.width)),\n height: Math.max(0, ...tiles.map((t) => t.y + t.height)),\n tiles,\n }\n}\n","import type { KunChatMessage } from './types.ts'\nimport { KUN_CHAT_ALBUM_LIMIT } from './constants.ts'\n\n// The message list's row model, as data: day sections, sender groups, albums\n// merged into one row, and the unread divider. The Vue list renders it, the\n// Flutter port computes the same rows from the same function.\n\n/** The row identity of a message: its `client_message_id` when it has one, so\n * a pending message keeps its row when the server confirms it. */\nexport const kunChatMessageKey = (message: KunChatMessage): string =>\n message.client_message_id ? `c:${message.client_message_id}` : `m:${message.id}`\n\nconst pad = (n: number) => String(n).padStart(2, '0')\n\nconst dayFormatters = new Map<string, Intl.DateTimeFormat>()\n\n/**\n * `YYYY-MM-DD` of an instant, in `timeZone` (an IANA name) or, when omitted,\n * the runtime's own zone. Keys sort chronologically as strings.\n */\nexport const kunChatDayKey = (date: Date, timeZone?: string): string => {\n if (!timeZone) {\n return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`\n }\n let fmt = dayFormatters.get(timeZone)\n if (!fmt) {\n fmt = new Intl.DateTimeFormat('en-CA', {\n timeZone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n })\n dayFormatters.set(timeZone, fmt)\n }\n const parts = Object.fromEntries(fmt.formatToParts(date).map((p) => [p.type, p.value]))\n return `${parts.year}-${parts.month}-${parts.day}`\n}\n\nexport type KunChatListRow =\n | { type: 'unread'; key: string }\n | { type: 'service'; key: string; message: KunChatMessage }\n | {\n type: 'message'\n key: string\n /** The message the row acts as: an album's first message with a\n * caption, else its first; the message itself otherwise. */\n message: KunChatMessage\n /** Every message the row shows — an album's photos, in order. */\n messages: KunChatMessage[]\n own: boolean\n /** First of consecutive messages from one sender: the name goes here. */\n groupStart: boolean\n /** Last of the run: the avatar and the bubble tail go here. */\n groupEnd: boolean\n }\n\nexport interface KunChatDaySection {\n /** `YYYY-MM-DD` in the list's time zone. */\n key: string\n /** The first message's instant, for formatting the date pill. */\n date: Date\n rows: KunChatListRow[]\n}\n\nexport interface KunChatGroupOptions {\n currentUserId: string\n /** The viewer's read cursor when the conversation was opened. The unread\n * divider goes above the first later message someone else sent. */\n lastReadSeq?: number | null\n /** Longest gap, in seconds, inside one sender group. Default 600\n * (telegram-tt's `GROUP_INTERVAL_SECONDS`). */\n groupWindow?: number\n /** IANA time zone for day boundaries; the runtime's zone when omitted. */\n timeZone?: string\n}\n\nconst albumRepresentative = (messages: KunChatMessage[]) =>\n messages.find((m) => m.text) ?? messages[0]!\n\n/**\n * Arrange messages — already in display order — into day sections and rows.\n * A sender group breaks on another sender, a new day, a gap longer than\n * `groupWindow`, the unread divider, and any service message.\n */\nexport const groupKunChatMessages = (\n messages: readonly KunChatMessage[],\n options: KunChatGroupOptions\n): KunChatDaySection[] => {\n const windowMs = (options.groupWindow ?? 600) * 1000\n const sections: KunChatDaySection[] = []\n let dividerPlaced = options.lastReadSeq == null\n let prev: { sender: string; at: number; row: Extract<KunChatListRow, { type: 'message' }> } | null =\n null\n\n const closeGroup = () => {\n if (prev) prev.row.groupEnd = true\n prev = null\n }\n\n for (let i = 0; i < messages.length; i++) {\n const message = messages[i]!\n const at = Date.parse(message.created_at)\n const date = new Date(Number.isNaN(at) ? 0 : at)\n const key = kunChatDayKey(date, options.timeZone)\n\n let section = sections[sections.length - 1]\n // Only ever forward: a pending message stamped by a slow local clock\n // joins the current day instead of reopening an earlier one.\n if (!section || key > section.key) {\n closeGroup()\n section = { key, date, rows: [] }\n sections.push(section)\n }\n\n const own = message.sender_id === options.currentUserId\n if (\n !dividerPlaced &&\n !own &&\n message.seq > options.lastReadSeq! &&\n message.seq > 0\n ) {\n closeGroup()\n section.rows.push({ type: 'unread', key: 'unread' })\n dividerPlaced = true\n }\n\n if (message.kind === 'service') {\n closeGroup()\n section.rows.push({ type: 'service', key: kunChatMessageKey(message), message })\n continue\n }\n\n let group = [message]\n if (message.media_group_id != null) {\n while (\n group.length < KUN_CHAT_ALBUM_LIMIT &&\n i + 1 < messages.length &&\n messages[i + 1]!.kind === 'message' &&\n messages[i + 1]!.media_group_id === message.media_group_id &&\n messages[i + 1]!.sender_id === message.sender_id\n ) {\n group = [...group, messages[++i]!]\n }\n }\n\n const continues =\n prev !== null && prev.sender === message.sender_id && at - prev.at <= windowMs\n if (!continues) closeGroup()\n\n const row: Extract<KunChatListRow, { type: 'message' }> = {\n type: 'message',\n key: kunChatMessageKey(message),\n message: group.length > 1 ? albumRepresentative(group) : message,\n messages: group,\n own,\n groupStart: !continues,\n groupEnd: false,\n }\n section.rows.push(row)\n const last = group[group.length - 1]!\n const lastAt = Date.parse(last.created_at)\n prev = { sender: message.sender_id, at: Number.isNaN(lastAt) ? at : lastAt, row }\n }\n closeGroup()\n return sections\n}\n","// AUTO-GENERATED by scripts/gen-icons.mjs — do not edit by hand.\n// Regenerate: pnpm --filter @kungal/ui-core gen:icons\nimport type { KunIconData } from './icons'\n\n// SVG data for the icons KunUI components render, bundled inline so the\n// library never fetches an icon at runtime. Bodies use currentColor.\nexport const KUN_BUNDLED_ICONS: Record<string, KunIconData> = {\n \"lucide:x\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M18 6L6 18M6 6l12 12\\\"/>\"},\n \"lucide:check\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M20 6L9 17l-5-5\\\"/>\"},\n \"lucide:info\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"M12 16v-4m0-4h.01\\\"/></g>\"},\n \"lucide:circle-check\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"m9 12l2 2l4-4\\\"/></g>\"},\n \"lucide:circle-x\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"m15 9l-6 6m0-6l6 6\\\"/></g>\"},\n \"lucide:triangle-alert\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m21.73 18l-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3M12 9v4m0 4h.01\\\"/>\"},\n \"lucide:chevron-right\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m9 18l6-6l-6-6\\\"/>\"},\n \"lucide:chevron-left\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m15 18l-6-6l6-6\\\"/>\"},\n \"lucide:chevron-down\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m6 9l6 6l6-6\\\"/>\"},\n \"lucide:chevrons-right\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m6 17l5-5l-5-5m7 10l5-5l-5-5\\\"/>\"},\n \"lucide:chevrons-left\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m11 17l-5-5l5-5m7 10l-5-5l5-5\\\"/>\"},\n \"lucide:arrow-right\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M5 12h14m-7-7l7 7l-7 7\\\"/>\"},\n \"lucide:arrow-left\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m12 19l-7-7l7-7m7 7H5\\\"/>\"},\n \"lucide:plus\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M5 12h14m-7-7v14\\\"/>\"},\n \"lucide:minus\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M5 12h14\\\"/>\"},\n \"lucide:upload\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M12 3v12m5-7l-5-5l-5 5m14 7v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\\\"/>\"},\n \"lucide:zoom-in\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"/><path d=\\\"m21 21l-4.35-4.35M11 8v6m-3-3h6\\\"/></g>\"},\n \"lucide:zoom-out\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"/><path d=\\\"m21 21l-4.35-4.35M8 11h6\\\"/></g>\"},\n \"lucide:rotate-cw\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8\\\"/><path d=\\\"M21 3v5h-5\\\"/></g>\"},\n \"lucide:rotate-ccw\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M3 12a9 9 0 1 0 9-9a9.75 9.75 0 0 0-6.74 2.74L3 8\\\"/><path d=\\\"M3 3v5h5\\\"/></g>\"},\n \"lucide:refresh-ccw\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M21 12a9 9 0 0 0-9-9a9.75 9.75 0 0 0-6.74 2.74L3 8\\\"/><path d=\\\"M3 3v5h5m-5 4a9 9 0 0 0 9 9a9.75 9.75 0 0 0 6.74-2.74L21 16\\\"/><path d=\\\"M16 16h5v5\\\"/></g>\"},\n \"lucide:external-link\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M15 3h6v6m-11 5L21 3m-3 10v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\\\"/>\"},\n \"lucide:download\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M12 15V3m9 12v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\\\"/><path d=\\\"m7 10l5 5l5-5\\\"/></g>\"},\n \"lucide:copy\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><rect width=\\\"14\\\" height=\\\"14\\\" x=\\\"8\\\" y=\\\"8\\\" rx=\\\"2\\\" ry=\\\"2\\\"/><path d=\\\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\\\"/></g>\"},\n \"lucide:calendar\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M8 2v4m8-4v4\\\"/><rect width=\\\"18\\\" height=\\\"18\\\" x=\\\"3\\\" y=\\\"4\\\" rx=\\\"2\\\"/><path d=\\\"M3 10h18\\\"/></g>\"},\n \"lucide:lollipop\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"/><path d=\\\"m21 21l-4.3-4.3M11 11a2 2 0 0 0 4 0a4 4 0 0 0-8 0a6 6 0 0 0 12 0\\\"/></g>\"},\n \"lucide:eye\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M2.062 12.348a1 1 0 0 1 0-.696a10.75 10.75 0 0 1 19.876 0a1 1 0 0 1 0 .696a10.75 10.75 0 0 1-19.876 0\\\"/><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"3\\\"/></g>\"},\n \"lucide:eye-off\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575a1 1 0 0 1 0 .696a10.8 10.8 0 0 1-1.444 2.49m-6.41-.679a3 3 0 0 1-4.242-4.242\\\"/><path d=\\\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151a1 1 0 0 1 0-.696a10.75 10.75 0 0 1 4.446-5.143M2 2l20 20\\\"/></g>\"},\n \"lucide:search\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"m21 21l-4.34-4.34\\\"/><circle cx=\\\"11\\\" cy=\\\"11\\\" r=\\\"8\\\"/></g>\"},\n \"lucide:filter\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M22 3H2l8 9.46V19l4 2v-8.54z\\\"/>\"},\n \"lucide:heart\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M2 9.5a5.5 5.5 0 0 1 9.591-3.676a.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5\\\"/>\"},\n \"lucide:clock\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"M12 6v6l4 2\\\"/></g>\"},\n \"lucide:check-check\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M18 6L7 17l-5-5m20-2l-7.5 7.5L13 16\\\"/>\"},\n \"lucide:circle-alert\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"M12 8v4m0 4h.01\\\"/></g>\"},\n \"lucide:reply\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M20 18v-2a4 4 0 0 0-4-4H4\\\"/><path d=\\\"m9 17l-5-5l5-5\\\"/></g>\"},\n \"lucide:quote\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M16 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2a1 1 0 0 1 1 1v1a2 2 0 0 1-2 2a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1a6 6 0 0 0 6-6V5a2 2 0 0 0-2-2zM5 3a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2a1 1 0 0 1 1 1v1a2 2 0 0 1-2 2a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1a6 6 0 0 0 6-6V5a2 2 0 0 0-2-2z\\\"/>\"},\n \"lucide:pencil\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497zM15 5l4 4\\\"/>\"},\n \"lucide:pin\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M12 17v5M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1a2 2 0 0 0 0-4H8a2 2 0 0 0 0 4a1 1 0 0 1 1 1z\\\"/>\"},\n \"lucide:pin-off\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M12 17v5m3-12.66V7a1 1 0 0 1 1-1a2 2 0 0 0 0-4H7.89M2 2l20 20M9 9v1.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h11\\\"/>\"},\n \"lucide:trash-2\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M10 11v6m4-6v6m5-11v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6M3 6h18M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\\\"/>\"},\n \"lucide:flag\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M4 22V4a1 1 0 0 1 .4-.8A6 6 0 0 1 8 2c3 0 5 2 7.333 2q2 0 3.067-.8A1 1 0 0 1 20 4v10a1 1 0 0 1-.4.8A6 6 0 0 1 16 16c-3 0-5-2-8-2a6 6 0 0 0-4 1.528\\\"/>\"},\n \"lucide:ban\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"10\\\"/><path d=\\\"M4.929 4.929L19.07 19.071\\\"/></g>\"},\n \"lucide:paperclip\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"m16 6l-8.414 8.586a2 2 0 0 0 2.829 2.829l8.414-8.586a4 4 0 1 0-5.657-5.657l-8.379 8.551a6 6 0 1 0 8.485 8.485l8.379-8.551\\\"/>\"},\n \"lucide:send-horizontal\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M3.714 3.048a.498.498 0 0 0-.683.627l2.843 7.627a2 2 0 0 1 0 1.396l-2.842 7.627a.498.498 0 0 0 .682.627l18-8.5a.5.5 0 0 0 0-.904zM6 12h16\\\"/>\"},\n \"lucide:smile-plus\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M22 11v1a10 10 0 1 1-9-10\\\"/><path d=\\\"M8 14s1.5 2 4 2s4-2 4-2M9 9h.01M15 9h.01M16 5h6m-3-3v6\\\"/></g>\"},\n \"lucide:image\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><rect width=\\\"18\\\" height=\\\"18\\\" x=\\\"3\\\" y=\\\"3\\\" rx=\\\"2\\\" ry=\\\"2\\\"/><circle cx=\\\"9\\\" cy=\\\"9\\\" r=\\\"2\\\"/><path d=\\\"m21 15l-3.086-3.086a2 2 0 0 0-2.828 0L6 21\\\"/></g>\"},\n \"lucide:at-sign\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><circle cx=\\\"12\\\" cy=\\\"12\\\" r=\\\"4\\\"/><path d=\\\"M16 8v5a3 3 0 0 0 6 0v-1a10 10 0 1 0-4 8\\\"/></g>\"},\n \"lucide:bell\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M10.268 21a2 2 0 0 0 3.464 0m-10.47-5.674A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326\\\"/>\"},\n \"lucide:bell-off\": {\"body\":\"<path fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\" d=\\\"M10.268 21a2 2 0 0 0 3.464 0M17 17H4a1 1 0 0 1-.74-1.673C4.59 13.956 6 12.499 6 8a6 6 0 0 1 .258-1.742M2 2l20 20M8.668 3.01A6 6 0 0 1 18 8c0 2.687.77 4.653 1.707 6.05\\\"/>\"},\n \"lucide:archive\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><rect width=\\\"20\\\" height=\\\"5\\\" x=\\\"2\\\" y=\\\"3\\\" rx=\\\"1\\\"/><path d=\\\"M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8m-10 4h4\\\"/></g>\"},\n \"lucide:mail\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"m22 7l-8.991 5.727a2 2 0 0 1-2.009 0L2 7\\\"/><rect width=\\\"20\\\" height=\\\"16\\\" x=\\\"2\\\" y=\\\"4\\\" rx=\\\"2\\\"/></g>\"},\n \"lucide:mail-open\": {\"body\":\"<g fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" stroke-width=\\\"2\\\"><path d=\\\"M21.2 8.4c.5.38.8.97.8 1.6v10a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V10a2 2 0 0 1 .8-1.6l8-6a2 2 0 0 1 2.4 0z\\\"/><path d=\\\"m22 10l-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 10\\\"/></g>\"},\n \"svg-spinners:90-ring-with-bg\": {\"body\":\"<path fill=\\\"currentColor\\\" d=\\\"M12,1A11,11,0,1,0,23,12,11,11,0,0,0,12,1Zm0,19a8,8,0,1,1,8-8A8,8,0,0,1,12,20Z\\\" opacity=\\\".25\\\"/><path fill=\\\"currentColor\\\" d=\\\"M10.14,1.16a11,11,0,0,0-9,8.92A1.59,1.59,0,0,0,2.46,12,1.52,1.52,0,0,0,4.11,10.7a8,8,0,0,1,6.66-6.61A1.42,1.42,0,0,0,12,2.69h0A1.57,1.57,0,0,0,10.14,1.16Z\\\"><animateTransform attributeName=\\\"transform\\\" dur=\\\"0.75s\\\" repeatCount=\\\"indefinite\\\" type=\\\"rotate\\\" values=\\\"0 12 12;360 12 12\\\"/></path>\"},\n}\n","import { KUN_BUNDLED_ICONS } from './icons-data'\n\n// Iconify-compatible icon shape: `body` is the inner SVG markup (using\n// `currentColor`), rendered into a `0 0 width height` viewBox (default 24).\nexport interface KunIconData {\n body: string\n width?: number\n height?: number\n}\n\n// The registry is SEEDED with KunUI's bundled internal icons (referenced via\n// the data import, so it is never tree-shaken away — no side-effect needed).\n// Consumers add their own icons with registerKunIcon(s). KunIcon renders from\n// this registry and NEVER fetches from a network/API.\nconst registry = new Map<string, KunIconData>(Object.entries(KUN_BUNDLED_ICONS))\n\nexport const registerKunIcon = (name: string, data: KunIconData): void => {\n registry.set(name, data)\n}\n\n// Bulk register — pass a Record<name, data>, e.g. icons extracted from\n// `@iconify-json/*` at build time, or your own custom SVGs.\nexport const registerKunIcons = (\n icons: Record<string, KunIconData>\n): void => {\n for (const [name, data] of Object.entries(icons)) registry.set(name, data)\n}\n\nexport const getKunIcon = (name: string): KunIconData | undefined =>\n registry.get(name)\n\nexport const hasKunIcon = (name: string): boolean => registry.has(name)\n"]}