@somecat/epub-reader 0.1.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.
- package/README.md +74 -0
- package/dist/core.cjs +201 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.cts +6 -0
- package/dist/core.d.ts +6 -0
- package/dist/core.js +199 -0
- package/dist/core.js.map +1 -0
- package/dist/index.cjs +201 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +199 -0
- package/dist/index.js.map +1 -0
- package/dist/react.cjs +1144 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +33 -0
- package/dist/react.d.ts +33 -0
- package/dist/react.js +1142 -0
- package/dist/react.js.map +1 -0
- package/dist/types-Dc66KVH2.d.cts +58 -0
- package/dist/types-Dc66KVH2.d.ts +58 -0
- package/dist/vue.cjs +0 -0
- package/dist/vue.cjs.map +1 -0
- package/dist/vue.d.cts +107 -0
- package/dist/vue.d.ts +107 -0
- package/dist/vue.js +1700 -0
- package/dist/vue.js.map +1 -0
- package/package.json +73 -0
- package/style.css +482 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/reader.ts","../src/core/icons.ts","../src/react/components/SvgIcon.tsx","../src/react/components/DesktopToolbar.tsx","../src/react/components/DesktopBottomBar.tsx","../src/react/components/TocTree.tsx","../src/react/components/TocDrawer.tsx","../src/react/components/SearchResultList.tsx","../src/react/components/SearchDrawer.tsx","../src/react/components/MobileUI.tsx","../src/react/EBookReader.tsx"],"names":["useMemo","jsx","jsxs","useState","useRef","Fragment","forwardRef","EBookReader","useEffect","useCallback","useImperativeHandle"],"mappings":";;;;;;;AAsBA,IAAM,aAAA,GAAgB,CAAC,QAAA,EAAkB,MAAA,EAAiB,QAAA,KAAsB;AAAA;AAAA;AAAA,gBAAA,EAG9D,MAAA,GAAS,SAAS,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,SAAA,EAIhC,MAAA,GAAS,YAAY,OAAO,CAAA;AAAA,aAAA,EACxB,QAAQ,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAAA,EAOZ,MAAA,GAAS,YAAY,SAAS,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,EAMrC,MAAA,GAAS,2CAA2C,EAAE;AAAA;AAAA,EAExD,YAAY,EAAE;AAAA,CAAA;AAGT,SAAS,iBAAA,CAAkB,SAAA,EAAwB,OAAA,GAA8B,EAAC,EAAsB;AAC7G,EAAA,IAAI,CAAC,SAAA,EAAW,MAAM,IAAI,MAAM,uBAAuB,CAAA;AACvD,EAAA,IAAI,CAAC,eAAe,GAAA,CAAI,cAAc,GAAG,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAEtF,EAAA,MAAM;AAAA,IACJ,UAAU,eAAA,GAAkB,KAAA;AAAA,IAC5B,UAAU,eAAA,GAAkB,GAAA;AAAA,IAC5B,eAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,KAAA;AAAA,IACA,gBAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,MAAiB,EAAC;AACtB,EAAA,IAAI,QAAA,GAAW,eAAA;AACf,EAAA,IAAI,QAAA,GAAW,eAAA;AACf,EAAA,IAAI,WAAA,GAAc,CAAA;AAElB,EAAA,SAAA,CAAU,SAAA,GAAY,EAAA;AAEtB,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,cAAc,CAAA;AACpD,EAAA,MAAA,CAAO,MAAM,OAAA,GAAU,OAAA;AACvB,EAAA,MAAA,CAAO,MAAM,KAAA,GAAQ,MAAA;AACrB,EAAA,MAAA,CAAO,MAAM,MAAA,GAAS,MAAA;AACtB,EAAA,MAAA,CAAO,YAAA,CAAa,UAAU,IAAI,CAAA;AAClC,EAAA,MAAA,CAAO,YAAA,CAAa,OAAO,MAAM,CAAA;AAEjC,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,IAAI,SAAA,EAAW;AACf,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,EAAU,SAAA,EAAW;AACjC,IAAA,MAAA,CAAO,SAAS,SAAA,CAAU,aAAA,CAAc,QAAA,EAAU,QAAA,EAAU,eAAe,CAAC,CAAA;AAC5E,IAAA,qBAAA,CAAsB,MAAM;AAC1B,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,IAAI,SAAA,EAAW;AACf,QAAA,MAAA,CAAO,UAAU,MAAA,IAAS;AAC1B,QAAA,MAAA,CAAO,UAAU,MAAA,IAAS;AAAA,MAC5B,GAAG,EAAE,CAAA;AAAA,IACP,CAAC,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,CAAA,KAAa;AAC/B,IAAA,WAAA,EAAY;AACZ,IAAA,MAAM,SAAU,CAAA,CAAkB,MAAA;AAClC,IAAA,IAAI,MAAA,EAAQ,GAAA,EAAK,aAAA,GAAgB,MAAA,CAAO,GAAG,CAAA;AAAA,EAC7C,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,CAAC,CAAA,KAAa;AACnC,IAAA,MAAM,SAAU,CAAA,CAAkB,MAAA;AAClC,IAAA,UAAA,GAAa,MAAM,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,MAAA,CAAO,gBAAA,CAAiB,QAAQ,UAA2B,CAAA;AAC3D,EAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,cAA+B,CAAA;AAEnE,EAAA,SAAA,CAAU,YAAY,MAAM,CAAA;AAE5B,EAAA,MAAM,MAAA,GAA4B;AAAA,IAChC,MAAM,KAAK,IAAA,EAAM;AACf,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,IAAI,CAAC,IAAA,EAAM;AAEX,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,WAAA,IAAc;AACrB,QAAA,WAAA,EAAA;AAEA,QAAA,MAAM,MAAA,CAAO,OAAO,IAAI,CAAA;AAExB,QAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,EAAM,GAAA,IAAO,EAAC;AACrC,QAAA,GAAA,GAAM,OAAA;AACN,QAAA,KAAA,GAAQ,GAAG,CAAA;AAEX,QAAA,MAAM,MAAA,CAAO,IAAA,GAAO,EAAE,aAAA,EAAe,MAAM,CAAA;AAC3C,QAAA,WAAA,EAAY;AAAA,MACd,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,GAAU,KAAK,CAAA;AACf,QAAA,MAAM,KAAA;AAAA,MACR;AAAA,IACF,CAAA;AAAA,IACA,OAAA,GAAU;AACR,MAAA,IAAI,SAAA,EAAW;AACf,MAAA,SAAA,GAAY,IAAA;AACZ,MAAA,WAAA,EAAA;AACA,MAAA,MAAA,CAAO,mBAAA,CAAoB,QAAQ,UAAU,CAAA;AAC7C,MAAA,MAAA,CAAO,mBAAA,CAAoB,YAAY,cAA+B,CAAA;AACtE,MAAA,SAAA,CAAU,SAAA,GAAY,EAAA;AAAA,IACxB,CAAA;AAAA,IACA,QAAA,GAAW;AACT,MAAA,MAAA,CAAO,MAAA,IAAS;AAAA,IAClB,CAAA;AAAA,IACA,QAAA,GAAW;AACT,MAAA,MAAA,CAAO,OAAA,IAAU;AAAA,IACnB,CAAA;AAAA,IACA,WAAA,GAAc;AACZ,MAAA,MAAA,CAAO,UAAU,WAAA,IAAc;AAAA,IACjC,CAAA;AAAA,IACA,WAAA,GAAc;AACZ,MAAA,MAAA,CAAO,UAAU,WAAA,IAAc;AAAA,IACjC,CAAA;AAAA,IACA,KAAK,MAAA,EAAQ;AACX,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,MAAA,CAAO,OAAO,MAAM,CAAA;AAAA,IACtB,CAAA;AAAA,IACA,aAAa,QAAA,EAAU;AACrB,MAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAC,CAAA;AAC9C,MAAA,MAAA,CAAO,eAAe,IAAI,CAAA;AAAA,IAC5B,CAAA;AAAA,IACA,YAAY,YAAA,EAAc;AACxB,MAAA,QAAA,GAAW,YAAA;AACX,MAAA,WAAA,EAAY;AAAA,IACd,CAAA;AAAA,IACA,YAAY,YAAA,EAAc;AACxB,MAAA,MAAM,IAAA,GAAO,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,EAAA,EAAI,YAAY,CAAC,CAAA;AACrD,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,WAAA,EAAY;AAAA,IACd,CAAA;AAAA,IACA,MAAM,MAAA,CAAO,KAAA,EAAO,IAAA,GAAsB,EAAC,EAAG;AAC5C,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,EAAK;AAC9B,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,MAAA,CAAO,WAAA,IAAc;AACrB,QAAA,OAAO,EAAC;AAAA,MACV;AAEA,MAAA,MAAM,QAAQ,EAAE,WAAA;AAChB,MAAA,MAAM,UAA0B,EAAC;AAEjC,MAAA,IAAI;AACF,QAAA,WAAA,MAAiB,IAAA,IAAQ,OAAO,MAAA,GAAS;AAAA,UACvC,KAAA,EAAO,UAAA;AAAA,UACP,SAAA,EAAW,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA;AAAA,UACjC,eAAA,EAAiB,OAAA,CAAQ,IAAA,CAAK,UAAU,CAAA;AAAA,UACxC,eAAA,EAAiB,OAAA,CAAQ,IAAA,CAAK,eAAe;AAAA,SAC9C,CAAA,IAAK,EAAC,EAAG;AACR,UAAA,IAAI,SAAA,IAAa,KAAA,KAAU,WAAA,EAAa,OAAO,OAAA;AAE/C,UAAA,IAAI,SAAS,MAAA,EAAQ;AACnB,YAAA,gBAAA,GAAmB,EAAE,IAAA,EAAM,IAAA,EAAM,QAAA,EAAU,GAAG,CAAA;AAC9C,YAAA;AAAA,UACF;AAEA,UAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,IAAQ,cAAe,IAAA,EAAc;AACnE,YAAA,MAAM,WAAY,IAAA,CAAa,QAAA;AAC/B,YAAA,IAAI,OAAO,QAAA,KAAa,QAAA,EAAU,gBAAA,GAAmB,EAAE,UAAU,CAAA;AACjE,YAAA;AAAA,UACF;AAEA,UAAA,MAAM,OAAA,GAAU,IAAA;AAChB,UAAA,IAAI,OAAA,EAAS,UAAU,MAAA,EAAQ;AAC7B,YAAA,KAAA,MAAW,GAAA,IAAO,QAAQ,QAAA,EAAU;AAClC,cAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,gBACX,OAAO,OAAA,CAAQ,KAAA;AAAA,gBACf,KAAK,GAAA,EAAK,GAAA;AAAA,gBACV,SAAS,GAAA,EAAK,OAAA;AAAA,gBACd,OAAO,GAAA,EAAK;AAAA,eACb,CAAA;AAAA,YACH;AAAA,UACF,CAAA,MAAA,IAAW,SAAS,GAAA,EAAK;AACvB,YAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,cACX,KAAK,OAAA,CAAQ,GAAA;AAAA,cACb,SAAS,OAAA,CAAQ,OAAA;AAAA,cACjB,OAAO,OAAA,CAAQ;AAAA,aAChB,CAAA;AAAA,UACH;AAAA,QACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,GAAU,KAAK,CAAA;AACf,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,OAAO,OAAA;AAAA,IACT,CAAA;AAAA,IACA,YAAA,GAAe;AACb,MAAA,WAAA,EAAA;AAAA,IACF,CAAA;AAAA,IACA,WAAA,GAAc;AACZ,MAAA,MAAA,CAAO,WAAA,IAAc;AAAA,IACvB,CAAA;AAAA,IACA,MAAA,GAAS;AACP,MAAA,OAAO,GAAA;AAAA,IACT;AAAA,GACF;AAEA,EAAA,OAAA,GAAU,MAAM,CAAA;AAChB,EAAA,OAAO,MAAA;AACT;;;AC3OO,IAAM,KAAA,GAAgC;AAAA,EAC3C,IAAA,EAAM,2HAAA;AAAA,EACN,MAAA,EAAQ,0JAAA;AAAA,EACR,cAAA,EAAgB,mHAAA;AAAA,EAChB,eAAA,EAAiB,iHAAA;AAAA,EACjB,eAAA,EAAiB,kIAAA;AAAA,EACjB,gBAAA,EAAkB,+HAAA;AAAA,EAClB,GAAA,EAAK,oQAAA;AAAA,EACL,IAAA,EAAM,mJAAA;AAAA,EACN,IAAA,EAAM,oHAAA;AAAA,EACN,KAAA,EAAO,4GAAA;AAAA,EACP,CAAA,EAAG,wHAAA;AAAA,EACH,IAAA,EAAM,8HAAA;AAAA,EACN,OAAA,EAAS;AACX,CAAA;ACJO,IAAM,OAAA,GAAU,CAAC,EAAE,IAAA,EAAM,OAAO,EAAA,EAAI,KAAA,GAAQ,cAAA,EAAgB,SAAA,EAAU,KAAoB;AAC/F,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAI,CAAA,IAAK,EAAA;AAEhC,EAAA,MAAM,KAAA,GAAQA,cAAQ,MAAM;AAC1B,IAAA,MAAM,UAAU,OAAO,IAAA,KAAS,QAAA,GAAW,CAAA,EAAG,IAAI,CAAA,EAAA,CAAA,GAAO,IAAA;AACzD,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAA;AAAA,MACP,MAAA,EAAQ,OAAA;AAAA,MACR,KAAA;AAAA,MACA,QAAA,EAAU,OAAA;AAAA,MACV,OAAA,EAAS,cAAA;AAAA,MACT,aAAA,EAAe;AAAA,KACjB;AAAA,EACF,CAAA,EAAG,CAAC,IAAA,EAAM,KAAK,CAAC,CAAA;AAEhB,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,uBACEC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAA,EAAM,4BAAA;AAAA,MACN,OAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAK,MAAA;AAAA,MACL,KAAA;AAAA,MACA,SAAA;AAAA,MACA,uBAAA,EAAyB,EAAE,MAAA,EAAQ,QAAA;AAAS;AAAA,GAC9C;AAEJ,CAAA;ACnBO,IAAM,iBAAiB,CAAC;AAAA,EAC7B,WAAA;AAAA,EACA,cAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,KAA2B;AACzB,EAAA,uBACEC,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,WAAU,mBAAA,EAAoB,OAAA,EAAS,WAAA,EAAa,KAAA,EAAM,gBAC9E,QAAA,kBAAAA,cAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,QAAO,CAAA,EACvB,CAAA;AAAA,sBACAA,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,WAAU,mBAAA,EAAoB,OAAA,EAAS,cAAA,EAAgB,KAAA,EAAM,gBACjF,QAAA,kBAAAA,cAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,UAAS,CAAA,EACzB,CAAA;AAAA,sBACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAwB,CAAA;AAAA,sBACvCA,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,WAAU,mBAAA,EAAoB,OAAA,EAAS,aAAA,EAAe,KAAA,EAAM,sBAChF,QAAA,kBAAAA,cAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,iBAAgB,CAAA,EAChC,CAAA;AAAA,sBACAA,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,WAAU,mBAAA,EAAoB,OAAA,EAAS,UAAA,EAAY,KAAA,EAAM,sBAC7E,QAAA,kBAAAA,cAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,gBAAe,CAAA,EAC/B,CAAA;AAAA,sBACAA,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,WAAU,mBAAA,EAAoB,OAAA,EAAS,UAAA,EAAY,KAAA,EAAM,sBAC7E,QAAA,kBAAAA,cAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,iBAAgB,CAAA,EAChC,CAAA;AAAA,sBACAA,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,WAAU,mBAAA,EAAoB,OAAA,EAAS,aAAA,EAAe,KAAA,EAAM,sBAChF,QAAA,kBAAAA,cAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,kBAAiB,CAAA,EACjC;AAAA,KAAA,EACF,CAAA;AAAA,oBAEAC,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,eAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,qBAAoB,OAAA,EAAS,gBAAA,EAAkB,KAAA,EAAM,cAAA,EACnF,0BAAAA,cAAAA,CAAC,OAAA,EAAA,EAAQ,MAAM,QAAA,GAAW,KAAA,GAAQ,QAAQ,CAAA,EAC5C,CAAA;AAAA,sBACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,uBAAA,EAAwB,CAAA;AAAA,sBACvCA,eAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,mBAAA,EAAoB,SAAS,MAAM,gBAAA,CAAiB,WAAW,EAAE,CAAA,EAAG,OAAM,0BAAA,EACxG,QAAA,kBAAAA,eAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,QAAO,CAAA,EACvB,CAAA;AAAA,sBACAC,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAsB,QAAA,EAAA;AAAA,QAAA,QAAA;AAAA,QAAS;AAAA,OAAA,EAAC,CAAA;AAAA,sBAC/CD,eAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,mBAAA,EAAoB,SAAS,MAAM,gBAAA,CAAiB,WAAW,EAAE,CAAA,EAAG,OAAM,0BAAA,EACxG,QAAA,kBAAAA,eAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,SAAQ,CAAA,EACxB;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA;ACvDO,IAAM,mBAAmB,CAAC;AAAA,EAC/B,MAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,KAA6B;AAC3B,EAAA,uBACEC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA,MAAA,KAAW,OAAA,GAAU,SAAA,IAAa,cAAA,GAAO,MAAA,KAAW,SAAA,GAAY,gCAAA,GAAU,cAAA,EAC7E,CAAA;AAAA,MACC,+BAAeA,cAAAA,CAAC,UAAK,SAAA,EAAU,uBAAA,EAAyB,wBAAa,CAAA,GAAU;AAAA,KAAA,EAClF,CAAA;AAAA,oBACAC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,cAAAA;AAAA,QAAC,OAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,qBAAA;AAAA,UACV,IAAA,EAAK,OAAA;AAAA,UACL,GAAA,EAAK,CAAA;AAAA,UACL,GAAA,EAAK,GAAA;AAAA,UACL,IAAA,EAAM,CAAA;AAAA,UACN,KAAA,EAAO,gBAAA;AAAA,UACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,YAAA,WAAA,EAAY;AACZ,YAAA,YAAA,CAAa,MAAA,CAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,UACrC,CAAA;AAAA,UACA,WAAA,EAAa,CAAC,CAAA,KAAM;AAClB,YAAA,MAAM,CAAA,GAAI,MAAA,CAAQ,CAAA,CAAE,MAAA,CAA4B,KAAK,CAAA;AACrD,YAAA,SAAA,CAAU,CAAC,CAAA;AAAA,UACb,CAAA;AAAA,UACA,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,YAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACvB,YAAA,MAAM,CAAA,GAAI,MAAA,CAAQ,CAAA,CAAE,MAAA,CAA4B,KAAK,CAAA;AACrD,YAAA,YAAA,CAAa,CAAC,CAAA;AAAA,UAChB;AAAA;AAAA,OACF;AAAA,sBACAC,eAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,uBAAA,EAAyB,QAAA,EAAA;AAAA,QAAA,gBAAA;AAAA,QAAiB;AAAA,OAAA,EAAC;AAAA,KAAA,EAC7D;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA;AC/CO,IAAM,OAAA,GAAU,CAAC,EAAE,KAAA,EAAO,UAAS,KAAoB;AAC5D,EAAA,uBACED,eAAC,IAAA,EAAA,EAAG,SAAA,EAAU,0BACX,QAAA,EAAA,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,EAAM,GAAA,KAAQ;AACxB,IAAA,MAAM,GAAA,GAAM,KAAK,IAAA,IAAQ,CAAA,EAAG,KAAK,KAAA,IAAS,MAAM,IAAI,GAAG,CAAA,CAAA;AACvD,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,IAAA,CAAK,QAAA,EAAU,MAAM,CAAA;AACjD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,IAAS,IAAA,CAAK,IAAA,IAAQ,oBAAA;AAEzC,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,uBACEA,eAAC,IAAA,EAAA,EAAa,SAAA,EAAU,0BACtB,QAAA,kBAAAA,cAAAA,CAAC,YAAO,IAAA,EAAK,QAAA,EAAS,WAAU,uBAAA,EAAwB,OAAA,EAAS,MAAM,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,EACtF,QAAA,EAAA,KAAA,EACH,KAHO,GAIT,CAAA;AAAA,IAEJ;AAEA,IAAA,uBACEA,eAAC,IAAA,EAAA,EAAa,SAAA,EAAU,0BACtB,QAAA,kBAAAC,eAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,2BAAA,EACjB,QAAA,EAAA;AAAA,sBAAAD,cAAAA,CAAC,SAAA,EAAA,EAAQ,SAAA,EAAU,2BAAA,EAA6B,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBACtDA,eAAC,OAAA,EAAA,EAAQ,KAAA,EAAO,KAAK,QAAA,IAAY,IAAI,QAAA,EAAoB;AAAA,KAAA,EAC3D,KAJO,GAKT,CAAA;AAAA,EAEJ,CAAC,CAAA,EACH,CAAA;AAEJ,CAAA;AC1BO,IAAM,YAAY,CAAC,EAAE,QAAQ,OAAA,EAAS,GAAA,EAAK,UAAS,KAAsB;AAC/E,EAAA,uBACEC,eAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAW,CAAA,qBAAA,EAAwB,MAAA,GAAS,SAAA,GAAY,EAAE,CAAA,CAAA,EAAI,aAAA,EAAa,CAAC,MAAA,EACjF,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B,QAAA,EAAA,cAAA,EAAE,CAAA;AAAA,sBAC9CA,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,mBAAA,EAAoB,OAAA,EAAS,OAAA,EAC3D,QAAA,kBAAAA,cAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,KAAI,CAAA,EACpB;AAAA,KAAA,EACF,CAAA;AAAA,oBACAA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,2BAAA,EACZ,QAAA,EAAA,GAAA,CAAI,yBACHA,cAAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,GAAA;AAAA,QACP,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,UAAA,QAAA,CAAS,IAAI,CAAA;AACb,UAAA,OAAA,EAAQ;AAAA,QACV;AAAA;AAAA,wBAGFA,cAAAA,CAAC,SAAI,SAAA,EAAU,qBAAA,EAAsB,4CAAK,CAAA,EAE9C;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA;AC5BO,IAAM,gBAAA,GAAmB,CAAC,EAAE,OAAA,EAAS,UAAS,KAA6B;AAChF,EAAA,uBACEA,cAAAA,CAAC,IAAA,EAAA,EAAG,SAAA,EAAU,6BACX,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,EAAG,wBACfA,cAAAA,CAAC,IAAA,EAAA,EAAuC,SAAA,EAAU,6BAChD,QAAA,kBAAAC,eAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,SAAA,EAAU,0BAAA;AAAA,MACV,SAAS,MAAM;AACb,QAAA,IAAI,CAAA,CAAE,GAAA,EAAK,QAAA,CAAS,CAAA,CAAE,GAAG,CAAA;AAAA,MAC3B,CAAA;AAAA,MAEC,QAAA,EAAA;AAAA,QAAA,CAAA,CAAE,KAAA,mBAAQD,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,4BAAA,EAA8B,QAAA,EAAA,CAAA,CAAE,OAAM,CAAA,GAAS,IAAA;AAAA,wBACzEA,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8BAAA,EACZ,QAAA,EAAA,OAAO,CAAA,CAAE,OAAA,KAAY,QAAA,GAClB,CAAA,CAAE,OAAA,GACF,CAAA,EAAG,CAAA,CAAE,SAAS,GAAA,IAAO,EAAE,CAAA,EAAG,CAAA,CAAE,OAAA,EAAS,KAAA,IAAS,EAAE,CAAA,EAAG,CAAA,CAAE,OAAA,EAAS,IAAA,IAAQ,EAAE,CAAA,CAAA,EAC9E;AAAA;AAAA;AAAA,GACF,EAAA,EAdO,GAAG,CAAA,CAAE,GAAA,IAAO,QAAQ,CAAA,CAAA,EAAI,GAAG,CAAA,CAepC,CACD,CAAA,EACH,CAAA;AAEJ,CAAA;ACdO,IAAM,eAAe,CAAC;AAAA,EAC3B,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAA,KAAyB;AACvB,EAAA,uBACEC,eAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAW,CAAA,2BAAA,EAA8B,MAAA,GAAS,SAAA,GAAY,EAAE,CAAA,CAAA,EAAI,aAAA,EAAa,CAAC,MAAA,EACvF,QAAA,EAAA;AAAA,oBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,sBAAAD,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA6B,QAAA,EAAA,cAAA,EAAE,CAAA;AAAA,sBAC9CA,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,mBAAA,EAAoB,OAAA,EAAS,OAAA,EAC3D,QAAA,kBAAAA,cAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,KAAI,CAAA,EACpB;AAAA,KAAA,EACF,CAAA;AAAA,oBACAC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACb,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,cAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAU,qBAAA;AAAA,YACV,WAAA,EAAY,gCAAA;AAAA,YACZ,OAAO,MAAA,CAAO,KAAA;AAAA,YACd,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,cAAA,MAAM,CAAA,GAAI,EAAE,MAAA,CAAO,KAAA;AACnB,cAAA,aAAA,CAAc,CAAC,CAAA;AACf,cAAA,IAAI,CAAC,CAAA,CAAE,IAAA,EAAK,WAAY,EAAE,CAAA;AAAA,YAC5B,CAAA;AAAA,YACA,UAAU,MAAA,KAAW,OAAA;AAAA,YACrB,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,cAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,EAAS,QAAA,CAAS,OAAO,KAAK,CAAA;AAAA,YAC9C;AAAA;AAAA,SACF;AAAA,wBACAA,eAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,mBAAA,EAAoB,SAAS,MAAM,QAAA,CAAS,OAAO,KAAK,CAAA,EAAG,UAAU,MAAA,KAAW,OAAA,EAC9G,0BAAAA,cAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,QAAA,EAAS,CAAA,EACzB;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,eAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EACf,QAAA,EAAA;AAAA,0BAAAD,cAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,UAAA;AAAA,cACL,OAAA,EAAS,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA;AAAA,cACzC,QAAA,EAAU,CAAC,CAAA,KAAM,cAAA,CAAe,EAAE,SAAA,EAAW,CAAA,CAAE,MAAA,CAAO,OAAA,EAAS;AAAA;AAAA,WACjE;AAAA,UAAE;AAAA,SAAA,EAEJ,CAAA;AAAA,wBACAC,eAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EACf,QAAA,EAAA;AAAA,0BAAAD,cAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,UAAA;AAAA,cACL,OAAA,EAAS,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA;AAAA,cAC1C,QAAA,EAAU,CAAC,CAAA,KAAM,cAAA,CAAe,EAAE,UAAA,EAAY,CAAA,CAAE,MAAA,CAAO,OAAA,EAAS;AAAA;AAAA,WAClE;AAAA,UAAE;AAAA,SAAA,EAEJ,CAAA;AAAA,wBACAC,eAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EACf,QAAA,EAAA;AAAA,0BAAAD,cAAAA;AAAA,YAAC,OAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,UAAA;AAAA,cACL,OAAA,EAAS,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA;AAAA,cAC/C,QAAA,EAAU,CAAC,CAAA,KAAM,cAAA,CAAe,EAAE,eAAA,EAAiB,CAAA,CAAE,MAAA,CAAO,OAAA,EAAS;AAAA;AAAA,WACvE;AAAA,UAAE;AAAA,SAAA,EAEJ;AAAA,OAAA,EACF,CAAA;AAAA,sBAEAC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,wBAAAA,gBAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,UAAA,eAAA;AAAA,UAAI,MAAA,CAAO,eAAA;AAAA,UAAgB;AAAA,SAAA,EAAC,CAAA;AAAA,QACjC,OAAO,SAAA,mBAAYD,cAAAA,CAAC,MAAA,EAAA,EAAK,sCAAI,CAAA,GAAU,IAAA;AAAA,QACvC,MAAA,CAAO,SAAA,mBACNA,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,oBAAA,EAAqB,OAAA,EAAS,cAAA,EAAgB,QAAA,EAAA,cAAA,EAE9E,CAAA,GACE;AAAA,OAAA,EACN,CAAA;AAAA,MAEC,MAAA,CAAO,QAAQ,MAAA,mBACdA,eAAC,gBAAA,EAAA,EAAiB,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,QAAA,EAAU,cAAA,EAAgB,oBAErEA,cAAAA,CAAC,SAAI,SAAA,EAAU,qBAAA,EAAuB,iBAAO,KAAA,CAAM,IAAA,EAAK,GAAI,gCAAA,GAAU,sCAAA,EAAS;AAAA,KAAA,EAEnF;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA;AC3DO,IAAM,WAAW,CAAC;AAAA,EACvB,UAAA;AAAA,EACA,WAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA,GAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,mBAAA;AAAA,EACA,oBAAA;AAAA,EACA,cAAA;AAAA,EACA,oBAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,gBAAA;AAAA,EACA;AACF,CAAA,KAAqB;AACnB,EAAA,MAAM,WAAA,GAAc,WAAA,KAAgB,MAAA,GAAS,cAAA,GAAO,gBAAgB,QAAA,GAAW,cAAA,GAAO,WAAA,KAAgB,UAAA,GAAa,iBAAO,WAAA,KAAgB,OAAA,GAAU,cAAA,GAAO,WAAA,KAAgB,SAAS,cAAA,GAAO,EAAA;AAE3L,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIE,eAAgD,IAAI,CAAA;AAClF,EAAA,MAAM,QAAA,GAAWC,aAAsB,IAAI,CAAA;AAE3C,EAAA,MAAM,gBAAA,GAAmB,CAAC,CAAA,EAAqB,IAAA,KAAiB;AAC9D,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,aAAA,CAAc,qBAAA,EAAsB;AAEnD,IAAA,QAAA,CAAS,OAAA,GAAU,MAAA,CAAO,UAAA,CAAW,MAAM;AACzC,MAAA,UAAA,CAAW;AAAA,QACT,IAAA;AAAA,QACA,IAAA,EAAM,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,KAAA,GAAQ;AAAA,OAChC,CAAA;AAAA,IACH,GAAG,GAAG,CAAA;AAAA,EACR,CAAA;AAEA,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,YAAA,CAAa,SAAS,OAAO,CAAA;AAC7B,MAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AAAA,IACrB;AACA,IAAA,UAAA,CAAW,IAAI,CAAA;AAAA,EACjB,CAAA;AAEA,EAAA,uBACEF,gBAAAG,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAAH,gBAAC,KAAA,EAAA,EAAI,SAAA,EAAW,sBAAsB,UAAA,GAAa,YAAA,GAAe,EAAE,CAAA,CAAA,EACjE,QAAA,EAAA;AAAA,MAAA,OAAA,oBACCD,cAAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,uBAAA;AAAA,UACV,KAAA,EAAO;AAAA,YACL,QAAA,EAAU,OAAA;AAAA,YACV,MAAA,EAAQ,MAAA;AAAA;AAAA,YACR,MAAM,OAAA,CAAQ,IAAA;AAAA,YACd,SAAA,EAAW,kBAAA;AAAA,YACX,UAAA,EAAY,iBAAA;AAAA,YACZ,KAAA,EAAO,MAAA;AAAA,YACP,OAAA,EAAS,SAAA;AAAA,YACT,YAAA,EAAc,KAAA;AAAA,YACd,QAAA,EAAU,MAAA;AAAA,YACV,aAAA,EAAe,MAAA;AAAA,YACf,MAAA,EAAQ,GAAA;AAAA,YACR,UAAA,EAAY;AAAA,WACd;AAAA,UAEC,QAAA,EAAA,OAAA,CAAQ;AAAA;AAAA,OACX;AAAA,sBAEFA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,mBAAA;AAAA,UACV,OAAA,EAAS,MAAM,aAAA,CAAc,MAAM,CAAA;AAAA,UACnC,gBAAc,WAAA,KAAgB,MAAA;AAAA,UAC9B,YAAA,EAAc,CAAC,CAAA,KAAM,gBAAA,CAAiB,GAAG,cAAI,CAAA;AAAA,UAC7C,UAAA,EAAY,cAAA;AAAA,UACZ,aAAA,EAAe,cAAA;AAAA,UACf,KAAA,EAAM,cAAA;AAAA,UAEN,QAAA,kBAAAA,cAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,MAAA,EAAO;AAAA;AAAA,OACvB;AAAA,sBACAA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,mBAAA;AAAA,UACV,OAAA,EAAS,MAAM,aAAA,CAAc,QAAQ,CAAA;AAAA,UACrC,gBAAc,WAAA,KAAgB,QAAA;AAAA,UAC9B,YAAA,EAAc,CAAC,CAAA,KAAM,gBAAA,CAAiB,GAAG,cAAI,CAAA;AAAA,UAC7C,UAAA,EAAY,cAAA;AAAA,UACZ,aAAA,EAAe,cAAA;AAAA,UACf,KAAA,EAAM,cAAA;AAAA,UAEN,QAAA,kBAAAA,cAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,QAAA,EAAS;AAAA;AAAA,OACzB;AAAA,sBACAA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,mBAAA;AAAA,UACV,OAAA,EAAS,MAAM,aAAA,CAAc,UAAU,CAAA;AAAA,UACvC,gBAAc,WAAA,KAAgB,UAAA;AAAA,UAC9B,YAAA,EAAc,CAAC,CAAA,KAAM,gBAAA,CAAiB,GAAG,cAAI,CAAA;AAAA,UAC7C,UAAA,EAAY,cAAA;AAAA,UACZ,aAAA,EAAe,cAAA;AAAA,UACf,KAAA,EAAM,cAAA;AAAA,UAEN,QAAA,kBAAAA,cAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,SAAA,EAAU;AAAA;AAAA,OAC1B;AAAA,sBACAA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,mBAAA;AAAA,UACV,OAAA,EAAS,MAAM,aAAA,CAAc,OAAO,CAAA;AAAA,UACpC,gBAAc,WAAA,KAAgB,OAAA;AAAA,UAC9B,YAAA,EAAc,CAAC,CAAA,KAAM,gBAAA,CAAiB,GAAG,cAAI,CAAA;AAAA,UAC7C,UAAA,EAAY,cAAA;AAAA,UACZ,aAAA,EAAe,cAAA;AAAA,UACf,KAAA,EAAM,cAAA;AAAA,UAEN,QAAA,kBAAAA,cAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,KAAA,EAAM;AAAA;AAAA,OACtB;AAAA,sBACAA,cAAAA;AAAA,QAAC,QAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,SAAA,EAAU,mBAAA;AAAA,UACV,OAAA,EAAS,MAAM,aAAA,CAAc,MAAM,CAAA;AAAA,UACnC,gBAAc,WAAA,KAAgB,MAAA;AAAA,UAC9B,YAAA,EAAc,CAAC,CAAA,KAAM,gBAAA,CAAiB,GAAG,cAAI,CAAA;AAAA,UAC7C,UAAA,EAAY,cAAA;AAAA,UACZ,aAAA,EAAe,cAAA;AAAA,UACf,KAAA,EAAM,cAAA;AAAA,UAEN,QAAA,kBAAAA,cAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,MAAA,EAAO;AAAA;AAAA;AACvB,KAAA,EACF,CAAA;AAAA,IAEC,WAAA,mBAAcA,cAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,wBAAA,EAAyB,OAAA,EAAS,cAAc,CAAA,GAAK,IAAA;AAAA,oBAEnFC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,qBAAA,EAAwB,WAAA,GAAc,SAAA,GAAY,EAAE,CAAA,CAAA,EAAI,aAAA,EAAa,CAAC,WAAA,EACpF,QAAA,EAAA;AAAA,sBAAAA,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,4BAAA,EAA8B,QAAA,EAAA,WAAA,EAAY,CAAA;AAAA,wBACzDA,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,mBAAA,EAAoB,OAAA,EAAS,YAAA,EAC3D,QAAA,kBAAAA,cAAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAK,KAAI,CAAA,EACpB;AAAA,OAAA,EACF,CAAA;AAAA,sBACAC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,2BAAA,EACZ,QAAA,EAAA;AAAA,QAAA,WAAA,KAAgB,MAAA,GACf,GAAA,CAAI,MAAA,mBACFD,cAAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,GAAA;AAAA,YACP,QAAA,EAAU,CAAC,IAAA,KAAS;AAClB,cAAA,WAAA,CAAY,IAAI,CAAA;AAChB,cAAA,YAAA,EAAa;AAAA,YACf;AAAA;AAAA,4BAGFA,cAAAA,CAAC,SAAI,SAAA,EAAU,qBAAA,EAAsB,4CAAK,CAAA,GAE1C,IAAA;AAAA,QAEH,WAAA,KAAgB,QAAA,mBACfC,eAAAA,CAAAG,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAH,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,4BAAAD,cAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,qBAAA;AAAA,gBACV,WAAA,EAAY,gCAAA;AAAA,gBACZ,OAAO,MAAA,CAAO,KAAA;AAAA,gBACd,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,kBAAA,MAAM,CAAA,GAAI,EAAE,MAAA,CAAO,KAAA;AACnB,kBAAA,mBAAA,CAAoB,CAAC,CAAA;AACrB,kBAAA,IAAI,CAAC,CAAA,CAAE,IAAA,EAAK,WAAY,EAAE,CAAA;AAAA,gBAC5B,CAAA;AAAA,gBACA,UAAU,MAAA,KAAW,OAAA;AAAA,gBACrB,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,kBAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,EAAS,QAAA,CAAS,OAAO,KAAK,CAAA;AAAA,gBAC9C;AAAA;AAAA,aACF;AAAA,4BACAA,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,WAAU,mBAAA,EAAoB,OAAA,EAAS,MAAM,QAAA,CAAS,OAAO,KAAK,CAAA,EAAG,QAAA,EAAU,MAAA,KAAW,SAAS,QAAA,EAAA,cAAA,EAEzH;AAAA,WAAA,EACF,CAAA;AAAA,0BAEAC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,eAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EACf,QAAA,EAAA;AAAA,8BAAAD,cAAAA;AAAA,gBAAC,OAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,UAAA;AAAA,kBACL,OAAA,EAAS,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA;AAAA,kBACzC,QAAA,EAAU,CAAC,CAAA,KAAM,oBAAA,CAAqB,EAAE,SAAA,EAAW,CAAA,CAAE,MAAA,CAAO,OAAA,EAAS;AAAA;AAAA,eACvE;AAAA,cAAE;AAAA,aAAA,EAEJ,CAAA;AAAA,4BACAC,eAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EACf,QAAA,EAAA;AAAA,8BAAAD,cAAAA;AAAA,gBAAC,OAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,UAAA;AAAA,kBACL,OAAA,EAAS,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA;AAAA,kBAC1C,QAAA,EAAU,CAAC,CAAA,KAAM,oBAAA,CAAqB,EAAE,UAAA,EAAY,CAAA,CAAE,MAAA,CAAO,OAAA,EAAS;AAAA;AAAA,eACxE;AAAA,cAAE;AAAA,aAAA,EAEJ,CAAA;AAAA,4BACAC,eAAAA,CAAC,OAAA,EAAA,EAAM,SAAA,EAAU,qBAAA,EACf,QAAA,EAAA;AAAA,8BAAAD,cAAAA;AAAA,gBAAC,OAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,UAAA;AAAA,kBACL,OAAA,EAAS,OAAA,CAAQ,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA;AAAA,kBAC/C,QAAA,EAAU,CAAC,CAAA,KAAM,oBAAA,CAAqB,EAAE,eAAA,EAAiB,CAAA,CAAE,MAAA,CAAO,OAAA,EAAS;AAAA;AAAA,eAC7E;AAAA,cAAE;AAAA,aAAA,EAEJ;AAAA,WAAA,EACF,CAAA;AAAA,0BAEAC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,4BAAAA,gBAAC,MAAA,EAAA,EAAK,QAAA,EAAA;AAAA,cAAA,eAAA;AAAA,cAAI,MAAA,CAAO,eAAA;AAAA,cAAgB;AAAA,aAAA,EAAC,CAAA;AAAA,YACjC,OAAO,SAAA,mBAAYD,cAAAA,CAAC,MAAA,EAAA,EAAK,sCAAI,CAAA,GAAU,IAAA;AAAA,YACvC,MAAA,CAAO,SAAA,mBACNA,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,oBAAA,EAAqB,OAAA,EAAS,cAAA,EAAgB,QAAA,EAAA,cAAA,EAE9E,CAAA,GACE;AAAA,WAAA,EACN,CAAA;AAAA,UAEC,MAAA,CAAO,QAAQ,MAAA,mBACdA,eAAC,gBAAA,EAAA,EAAiB,OAAA,EAAS,MAAA,CAAO,OAAA,EAAS,QAAA,EAAU,oBAAA,EAAsB,oBAE3EA,cAAAA,CAAC,SAAI,SAAA,EAAU,qBAAA,EAAuB,iBAAO,KAAA,CAAM,IAAA,EAAK,GAAI,gCAAA,GAAU,sCAAA,EAAS;AAAA,SAAA,EAEnF,CAAA,GACE,IAAA;AAAA,QAEH,WAAA,KAAgB,UAAA,mBACfC,eAAAA,CAAAG,mBAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAH,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EACb,QAAA,EAAA;AAAA,4BAAAD,cAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sBAAA,EACb,QAAA,EAAA,MAAA,KAAW,OAAA,GAAU,SAAA,IAAa,cAAA,GAAO,MAAA,KAAW,SAAA,GAAY,gCAAA,GAAU,cAAA,EAC7E,CAAA;AAAA,YACC,YAAA,mBAAeA,cAAAA,CAAC,MAAA,EAAA,EAAM,wBAAa,CAAA,GAAU;AAAA,WAAA,EAChD,CAAA;AAAA,0BACAC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yBAAA,EACb,QAAA,EAAA;AAAA,4BAAAD,cAAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,SAAA,EAAU,qBAAA;AAAA,gBACV,IAAA,EAAK,OAAA;AAAA,gBACL,GAAA,EAAK,CAAA;AAAA,gBACL,GAAA,EAAK,GAAA;AAAA,gBACL,IAAA,EAAM,CAAA;AAAA,gBACN,KAAA,EAAO,gBAAA;AAAA,gBACP,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,kBAAA,WAAA,EAAY;AACZ,kBAAA,YAAA,CAAa,MAAA,CAAO,CAAA,CAAE,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,gBACrC,CAAA;AAAA,gBACA,WAAA,EAAa,CAAC,CAAA,KAAM;AAClB,kBAAA,MAAM,CAAA,GAAI,MAAA,CAAQ,CAAA,CAAE,MAAA,CAA4B,KAAK,CAAA;AACrD,kBAAA,SAAA,CAAU,CAAC,CAAA;AAAA,gBACb,CAAA;AAAA,gBACA,OAAA,EAAS,CAAC,CAAA,KAAM;AACd,kBAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACvB,kBAAA,MAAM,CAAA,GAAI,MAAA,CAAQ,CAAA,CAAE,MAAA,CAA4B,KAAK,CAAA;AACrD,kBAAA,YAAA,CAAa,CAAC,CAAA;AAAA,gBAChB;AAAA;AAAA,aACF;AAAA,4BACAC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,iCAAA,EAAmC,QAAA,EAAA;AAAA,cAAA,gBAAA;AAAA,cAAiB;AAAA,aAAA,EAAC;AAAA,WAAA,EACtE;AAAA,SAAA,EACF,CAAA,GACE,IAAA;AAAA,QAEH,gBAAgB,OAAA,mBACfD,eAAC,QAAA,EAAA,EAAO,IAAA,EAAK,UAAS,SAAA,EAAU,mBAAA,EAAoB,OAAA,EAAS,MAAM,iBAAiB,CAAC,QAAQ,GAC1F,QAAA,EAAA,QAAA,GAAW,gCAAA,GAAU,kCACxB,CAAA,GACE,IAAA;AAAA,QAEH,gBAAgB,MAAA,mBACfC,eAAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qBAAA,EACb,QAAA,EAAA;AAAA,0BAAAD,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,mBAAA,EAAoB,OAAA,EAAS,MAAM,gBAAA,CAAiB,QAAA,GAAW,EAAE,CAAA,EAAG,QAAA,EAAA,IAAA,EAEpG,CAAA;AAAA,0BACAC,eAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,oBAAA,EAAsB,QAAA,EAAA;AAAA,YAAA,QAAA;AAAA,YAAS;AAAA,WAAA,EAAC,CAAA;AAAA,0BAC/CD,cAAAA,CAAC,QAAA,EAAA,EAAO,IAAA,EAAK,QAAA,EAAS,SAAA,EAAU,mBAAA,EAAoB,OAAA,EAAS,MAAM,gBAAA,CAAiB,QAAA,GAAW,EAAE,GAAG,QAAA,EAAA,IAAA,EAEpG;AAAA,SAAA,EACF,CAAA,GACE;AAAA,OAAA,EACN;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ,CAAA;AC9TA,IAAM,gBAAA,GAAmB,GAAA;AACzB,IAAM,cAAA,GAAiB,IAAA;AAEvB,IAAM,KAAA,GAAQ,CAAC,CAAA,EAAW,GAAA,EAAa,GAAA,KAAgB,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,CAAC,CAAC,CAAA;AAErF,IAAM,cAAA,GAAiB,IAAI,KAAA,KAAqC,KAAA,CAAM,OAAO,OAAO,CAAA,CAAE,KAAK,GAAG,CAAA;AAUvF,IAAM,WAAA,GAAcK,gBAAA,CAA0D,SAASC,YAAAA,CAC5F;AAAA,EACE,IAAA;AAAA,EACA,SAAA;AAAA,EACA,KAAA;AAAA,EACA,eAAA,GAAkB,GAAA;AAAA,EAClB,QAAA,EAAU,kBAAA;AAAA,EACV,gBAAA;AAAA,EACA,eAAA,GAAkB,KAAA;AAAA,EAClB,QAAA,EAAU,kBAAA;AAAA,EACV,gBAAA;AAAA,EACA,iBAAA,GAAoB,IAAA;AAAA,EACpB,uBAAuB,EAAE,SAAA,EAAW,OAAO,UAAA,EAAY,KAAA,EAAO,iBAAiB,KAAA,EAAM;AAAA,EACrF,OAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAA,EACA,GAAA,EACA;AACA,EAAA,MAAM,OAAA,GAAUH,aAA8B,IAAI,CAAA;AAClD,EAAA,MAAM,aAAA,GAAgBA,aAA8B,IAAI,CAAA;AACxD,EAAA,MAAM,SAAA,GAAYA,aAAoD,IAAI,CAAA;AAE1E,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAID,eAAiD,MAAM,CAAA;AACnF,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAiB,EAAE,CAAA;AACrD,EAAA,MAAM,CAAC,GAAA,EAAK,MAAM,CAAA,GAAIA,cAAAA,CAAoB,EAAE,CAAA;AAC5C,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC5C,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAIA,eAAS,KAAK,CAAA;AAClD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAIA,eAA8B,IAAI,CAAA;AAC1E,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAS,KAAK,CAAA;AAChD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAAS,CAAC,CAAA;AAEhD,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAIA,eAAS,eAAe,CAAA;AAChF,EAAA,MAAM,CAAC,oBAAA,EAAsB,uBAAuB,CAAA,GAAIA,eAAS,eAAe,CAAA;AAEhF,EAAA,MAAM,WAAW,kBAAA,IAAsB,oBAAA;AACvC,EAAA,MAAM,WAAW,kBAAA,IAAsB,oBAAA;AAEvC,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,cAAAA,CAAsB;AAAA,IAChD,KAAA,EAAO,EAAA;AAAA,IACP,OAAA,EAAS,oBAAA;AAAA,IACT,eAAA,EAAiB,CAAA;AAAA,IACjB,SAAA,EAAW,KAAA;AAAA,IACX,SAAS;AAAC,GACX,CAAA;AAED,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAIA,eAAwC,SAAS,CAAA;AAC7E,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIA,eAAS,KAAK,CAAA;AAC9D,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAIA,eAA6B,IAAI,CAAA;AACvE,EAAA,MAAM,SAAA,GAAYC,aAAO,MAAM,CAAA;AAC/B,EAAA,MAAM,YAAA,GAAeA,YAAAA,iBAAO,IAAI,OAAA,EAAmB,CAAA;AACnD,EAAA,MAAM,UAAA,GAAaA,YAAAA,CAAO,EAAE,MAAA,EAAQ,GAAG,MAAA,EAAQ,CAAA,EAAG,OAAA,EAAS,CAAA,EAAG,UAAU,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,WAAA,EAAa,OAAO,CAAA;AAEjH,EAAA,MAAM,UAAA,GAAaJ,aAAAA,CAAQ,MAAM,IAAA,CAAK,KAAA,CAAA,CAAO,YAAA,EAAc,QAAA,IAAY,CAAA,IAAK,GAAG,CAAA,EAAG,CAAC,YAAY,CAAC,CAAA;AAChG,EAAA,MAAM,gBAAA,GAAmB,YAAY,WAAA,GAAc,UAAA;AACnD,EAAA,MAAM,YAAA,GAAe,YAAA,EAAc,OAAA,EAAS,KAAA,IAAS,EAAA;AAGrD,EAAAQ,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,KAAK,OAAA,CAAQ,OAAA;AACnB,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,EAAA,GAAK,IAAI,cAAA,CAAe,CAAC,OAAA,KAAY;AACzC,MAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA,EAAG,aAAa,KAAA,IAAS,EAAA,CAAG,uBAAsB,CAAE,KAAA;AACvE,MAAA,MAAM,OAAO,CAAA,IAAK,gBAAA,GAAmB,QAAA,GAAW,CAAA,IAAK,iBAAiB,MAAA,GAAS,SAAA;AAC/E,MAAA,SAAA,CAAU,CAAC,IAAA,KAAU,IAAA,KAAS,IAAA,GAAO,OAAO,IAAK,CAAA;AAAA,IACnD,CAAC,CAAA;AACD,IAAA,EAAA,CAAG,QAAQ,EAAE,CAAA;AACb,IAAA,OAAO,MAAM,GAAG,UAAA,EAAW;AAAA,EAC7B,CAAA,EAAG,EAAE,CAAA;AAGL,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,WAAW,QAAA,EAAU;AACzB,IAAA,cAAA,CAAe,IAAI,CAAA;AACnB,IAAA,mBAAA,CAAoB,KAAK,CAAA;AAAA,EAC3B,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AAAA,EACtB,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAEX,EAAA,MAAM,mBAAmBC,iBAAA,CAAY,MAAM,eAAe,IAAI,CAAA,EAAG,EAAE,CAAA;AAEnE,EAAA,MAAM,iBAAA,GAAoBA,iBAAA,CAAY,CAAC,KAAA,KAAuB;AAC5D,IAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,IAAA,cAAA,CAAe,CAAC,IAAA,KAAU,IAAA,KAAS,KAAA,GAAQ,OAAO,KAAM,CAAA;AAAA,EAC1D,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgBA,iBAAA,CAAY,CAAC,CAAA,KAAoB;AACrD,IAAA,IAAI,SAAA,CAAU,YAAY,QAAA,EAAU;AACpC,IAAA,MAAM,IAAI,CAAA,CAAE,MAAA;AACZ,IAAA,IAAI,CAAC,CAAA,EAAG;AACR,IAAA,IAAI,EAAE,OAAA,CAAQ,qBAAqB,KAAK,CAAA,CAAE,OAAA,CAAQ,uBAAuB,CAAA,EAAG;AAC5E,IAAA,IAAI,CAAA,CAAE,OAAA,CAAQ,+EAA+E,CAAA,EAAG;AAChG,IAAA,UAAA,CAAW,QAAQ,QAAA,GAAW,IAAA;AAC9B,IAAA,UAAA,CAAW,QAAQ,KAAA,GAAQ,KAAA;AAC3B,IAAA,UAAA,CAAW,QAAQ,WAAA,GAAc,KAAA;AACjC,IAAA,UAAA,CAAW,OAAA,CAAQ,UAAU,CAAA,CAAE,SAAA;AAC/B,IAAA,UAAA,CAAW,OAAA,CAAQ,SAAS,CAAA,CAAE,OAAA;AAC9B,IAAA,UAAA,CAAW,OAAA,CAAQ,SAAS,CAAA,CAAE,OAAA;AAAA,EAChC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgBA,iBAAA,CAAY,CAAC,CAAA,KAAoB;AACrD,IAAA,IAAI,CAAC,UAAA,CAAW,OAAA,CAAQ,QAAA,EAAU;AAClC,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,UAAA,CAAW,OAAA,CAAQ,MAAA;AAC1C,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,UAAA,CAAW,OAAA,CAAQ,MAAA;AAE1C,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,CAAA,IAAK,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,CAAA,EAAG,UAAA,CAAW,OAAA,CAAQ,KAAA,GAAQ,IAAA;AACrE,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,GAAI,CAAA,EAAG;AAEtB,IAAA,IAAI,KAAK,GAAA,CAAI,EAAE,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AAC/B,MAAA,IAAI,KAAK,GAAA,CAAI,EAAE,KAAK,CAAA,EAAG,UAAA,CAAW,QAAQ,QAAA,GAAW,KAAA;AACrD,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAM,GAAA,EAAK;AACb,MAAA,UAAA,CAAW,QAAQ,WAAA,GAAc,IAAA;AACjC,MAAA,UAAA,CAAW,QAAQ,QAAA,GAAW,KAAA;AAC9B,MAAA,mBAAA,CAAoB,IAAI,CAAA;AACxB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,MAAM,EAAA,EAAI;AACZ,MAAA,UAAA,CAAW,QAAQ,WAAA,GAAc,IAAA;AACjC,MAAA,UAAA,CAAW,QAAQ,QAAA,GAAW,KAAA;AAC9B,MAAA,mBAAA,CAAoB,KAAK,CAAA;AACzB,MAAA,cAAA,CAAe,IAAI,CAAA;AAAA,IACrB;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAeA,iBAAA,CAAY,CAAC,CAAA,KAAoB;AACpD,IAAA,IAAI,SAAA,CAAU,YAAY,QAAA,EAAU;AAClC,MAAA,UAAA,CAAW,QAAQ,QAAA,GAAW,KAAA;AAC9B,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,UAAA,CAAW,QAAQ,WAAA,EAAa;AAClC,MAAA,UAAA,CAAW,QAAQ,QAAA,GAAW,KAAA;AAC9B,MAAA,UAAA,CAAW,QAAQ,KAAA,GAAQ,KAAA;AAC3B,MAAA,UAAA,CAAW,QAAQ,WAAA,GAAc,KAAA;AACjC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,UAAA,CAAW,OAAA,CAAQ,QAAA,EAAU;AAChC,MAAA,UAAA,CAAW,QAAQ,KAAA,GAAQ,KAAA;AAC3B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,UAAA,CAAW,OAAA,CAAQ,MAAA;AAC1C,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,OAAA,GAAU,UAAA,CAAW,OAAA,CAAQ,MAAA;AAC1C,IAAA,MAAM,EAAA,GAAK,CAAA,CAAE,SAAA,GAAY,UAAA,CAAW,OAAA,CAAQ,OAAA;AAC5C,IAAA,MAAM,KAAA,GAAQ,CAAC,UAAA,CAAW,OAAA,CAAQ,KAAA,IAAS,IAAA,CAAK,KAAA,CAAM,EAAA,EAAI,EAAE,CAAA,IAAK,EAAA,IAAM,EAAA,IAAM,GAAA;AAE7E,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,mBAAA,CAAoB,CAAC,IAAA,KAAS;AAC5B,QAAA,MAAM,OAAO,CAAC,IAAA;AACd,QAAA,IAAI,CAAC,IAAA,EAAM,cAAA,CAAe,IAAI,CAAA;AAC9B,QAAA,OAAO,IAAA;AAAA,MACT,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,UAAA,CAAW,QAAQ,QAAA,GAAW,KAAA;AAC9B,IAAA,UAAA,CAAW,QAAQ,KAAA,GAAQ,KAAA;AAAA,EAC7B,CAAA,EAAG,EAAE,CAAA;AAEL,EAAAD,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,IAAA,CAAK,gBAAA,CAAiB,eAAe,aAAa,CAAA;AAClD,IAAA,IAAA,CAAK,gBAAA,CAAiB,eAAe,aAAa,CAAA;AAClD,IAAA,IAAA,CAAK,gBAAA,CAAiB,aAAa,YAAY,CAAA;AAC/C,IAAA,IAAA,CAAK,gBAAA,CAAiB,iBAAiB,YAAY,CAAA;AAEnD,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,mBAAA,CAAoB,eAAe,aAAa,CAAA;AACrD,MAAA,IAAA,CAAK,mBAAA,CAAoB,eAAe,aAAa,CAAA;AACrD,MAAA,IAAA,CAAK,mBAAA,CAAoB,aAAa,YAAY,CAAA;AAClD,MAAA,IAAA,CAAK,mBAAA,CAAoB,iBAAiB,YAAY,CAAA;AAAA,IACxD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,aAAA,EAAe,aAAA,EAAe,YAAY,CAAC,CAAA;AAE/C,EAAA,MAAM,mBAAA,GAAsBC,iBAAA;AAAA,IAC1B,CAAC,IAAA,KAAkB;AACjB,MAAA,IAAI,kBAAA,IAAsB,IAAA,EAAM,uBAAA,CAAwB,IAAI,CAAA;AAC5D,MAAA,gBAAA,GAAmB,IAAI,CAAA;AACvB,MAAA,SAAA,CAAU,OAAA,EAAS,YAAY,IAAI,CAAA;AAAA,IACrC,CAAA;AAAA,IACA,CAAC,oBAAoB,gBAAgB;AAAA,GACvC;AAEA,EAAA,MAAM,mBAAA,GAAsBA,iBAAA;AAAA,IAC1B,CAAC,IAAA,KAAiB;AAChB,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,EAAM,EAAA,EAAI,GAAG,CAAA;AAChC,MAAA,IAAI,kBAAA,IAAsB,IAAA,EAAM,uBAAA,CAAwB,IAAI,CAAA;AAC5D,MAAA,gBAAA,GAAmB,IAAI,CAAA;AACvB,MAAA,SAAA,CAAU,OAAA,EAAS,YAAY,IAAI,CAAA;AAAA,IACrC,CAAA;AAAA,IACA,CAAC,oBAAoB,gBAAgB;AAAA,GACvC;AAEA,EAAA,MAAM,YAAA,GAAeA,kBAAY,MAAM;AACrC,IAAA,UAAA,CAAW,KAAK,CAAA;AAChB,IAAA,aAAA,CAAc,KAAK,CAAA;AAAA,EACrB,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,cAAA,GAAiBA,iBAAA;AAAA,IACrB,OAAO,QAAA,KAAmB;AACxB,MAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,MAAA,IAAI,CAAC,MAAA,EAAQ;AAEb,MAAA,SAAA,CAAU,SAAS,CAAA;AACnB,MAAA,YAAA,CAAa,EAAE,CAAA;AACf,MAAA,MAAA,CAAO,EAAE,CAAA;AACT,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,cAAA,CAAe,CAAC,CAAA;AAChB,MAAA,SAAA,CAAU,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,OAAA,EAAS,EAAC,EAAG,eAAA,EAAiB,CAAA,EAAG,SAAA,EAAW,KAAA,EAAM,CAAE,CAAA;AAEpF,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,CAAO,KAAK,QAAQ,CAAA;AAC1B,QAAA,SAAA,CAAU,OAAO,CAAA;AAAA,MACnB,SAAS,CAAA,EAAQ;AACf,QAAA,SAAA,CAAU,OAAO,CAAA;AACjB,QAAA,YAAA,CAAa,GAAG,OAAA,GAAU,MAAA,CAAO,CAAA,CAAE,OAAO,IAAI,0BAAM,CAAA;AACpD,QAAA,OAAA,GAAU,CAAC,CAAA;AAAA,MACb;AAAA,IACF,CAAA;AAAA,IACA,CAAC,OAAO;AAAA,GACV;AAEA,EAAA,MAAM,SAAA,GAAYA,iBAAA;AAAA,IAChB,OAAO,KAAA,KAAkB;AACvB,MAAA,MAAM,SAAS,SAAA,CAAU,OAAA;AACzB,MAAA,MAAM,UAAA,GAAa,MAAM,IAAA,EAAK;AAE9B,MAAA,SAAA,CAAU,CAAC,IAAA,MAAU;AAAA,QACnB,GAAG,IAAA;AAAA,QACH,KAAA;AAAA,QACA,OAAA,EAAS,UAAA,GAAa,IAAA,CAAK,OAAA,GAAU,EAAC;AAAA,QACtC,eAAA,EAAiB,CAAA;AAAA,QACjB,SAAA,EAAW,QAAQ,UAAU;AAAA,OAC/B,CAAE,CAAA;AAEF,MAAA,IAAI,CAAC,MAAA,IAAU,CAAC,UAAA,EAAY;AAC1B,QAAA,MAAA,EAAQ,WAAA,EAAY;AACpB,QAAA;AAAA,MACF;AAEA,MAAA,MAAA,CAAO,YAAA,EAAa;AACpB,MAAA,IAAI;AACF,QAAA,MAAM,UAAU,MAAM,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,OAAO,OAAO,CAAA;AAC9D,QAAA,SAAA,CAAU,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,SAAS,SAAA,EAAW,KAAA,EAAO,eAAA,EAAiB,GAAA,EAAI,CAAE,CAAA;AAAA,MACpF,SAAS,CAAA,EAAG;AACV,QAAA,SAAA,CAAU,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,SAAA,EAAW,OAAM,CAAE,CAAA;AACnD,QAAA,OAAA,GAAU,CAAC,CAAA;AAAA,MACb;AAAA,IACF,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,MAAA,CAAO,OAAO;AAAA,GAC1B;AAGA,EAAAD,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,OAAO,aAAA,CAAc,OAAA;AAC3B,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,kBAAkB,IAAA,EAAM;AAAA,QACrC,QAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA,EAAS,CAAC,CAAA,KAAM,OAAA,GAAU,CAAC,CAAA;AAAA,QAC3B,OAAA,EAAS,CAAC,CAAA,KAAM,OAAA,GAAU,CAAC,CAAA;AAAA,QAC3B,UAAA,EAAY,CAAC,IAAA,KAAS;AACpB,UAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,UAAA,UAAA,GAAa,IAAI,CAAA;AAAA,QACnB,CAAA;AAAA,QACA,KAAA,EAAO,CAAC,KAAA,KAAU,MAAA,CAAO,KAAK,CAAA;AAAA,QAC9B,gBAAA,EAAkB,CAAC,IAAA,KAAS;AAC1B,UAAA,MAAM,IAAI,IAAA,CAAK,QAAA;AACf,UAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,SAAA,CAAU,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,iBAAiB,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,GAAG,GAAE,CAAE,CAAA;AAAA,QACpG,CAAA;AAAA,QACA,aAAA,EAAe,CAAC,GAAA,KAAQ;AACtB,UAAA,IAAI,YAAA,CAAa,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA,EAAG;AACnC,UAAA,YAAA,CAAa,OAAA,CAAQ,IAAI,GAAG,CAAA;AAC5B,UAAA,GAAA,CAAI,gBAAA,CAAiB,eAAe,aAAa,CAAA;AACjD,UAAA,GAAA,CAAI,gBAAA,CAAiB,eAAe,aAAa,CAAA;AACjD,UAAA,GAAA,CAAI,gBAAA,CAAiB,aAAa,YAAY,CAAA;AAC9C,UAAA,GAAA,CAAI,gBAAA,CAAiB,iBAAiB,YAAY,CAAA;AAAA,QACpD;AAAA,OACD,CAAA;AACD,MAAA,SAAA,CAAU,OAAA,GAAU,MAAA;AACpB,MAAA,SAAA,CAAU,OAAO,CAAA;AAAA,IACnB,SAAS,CAAA,EAAQ;AACf,MAAA,SAAA,CAAU,OAAO,CAAA;AACjB,MAAA,YAAA,CAAa,GAAG,OAAA,GAAU,MAAA,CAAO,CAAA,CAAE,OAAO,IAAI,gCAAO,CAAA;AACrD,MAAA,OAAA,GAAU,CAAC,CAAA;AACX,MAAA;AAAA,IACF;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,CAAU,SAAS,OAAA,EAAQ;AAC3B,MAAA,SAAA,CAAU,OAAA,GAAU,IAAA;AAAA,IACtB,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAA,EAAS,UAAA,EAAY,OAAO,CAAC,CAAA;AAEjC,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,KAAK,eAAe,IAAI,CAAA;AAAA,EAC1B,CAAA,EAAG,CAAC,IAAA,EAAM,cAAc,CAAC,CAAA;AAEzB,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,SAAA,CAAU,OAAA,EAAS,YAAY,QAAQ,CAAA;AAAA,EACzC,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,SAAA,CAAU,OAAA,EAAS,YAAY,QAAQ,CAAA;AAAA,EACzC,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAGb,EAAAA,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,iBAAA,EAAmB;AACxB,IAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAqB;AAC1C,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,WAAA,EAAa,SAAA,CAAU,SAAS,QAAA,EAAS;AACvD,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,YAAA,EAAc,SAAA,CAAU,SAAS,QAAA,EAAS;AACxD,MAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,QAAA,EAAU,YAAA,EAAa;AAAA,IACvC,CAAA;AAEA,IAAA,IAAA,CAAK,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAC9C,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,mBAAA,CAAoB,WAAW,aAAa,CAAA;AAAA,IACnD,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,YAAA,EAAc,iBAAiB,CAAC,CAAA;AAEpC,EAAAE,yBAAA;AAAA,IACE,GAAA;AAAA,IACA,OAAO;AAAA,MACL,QAAA,EAAU,MAAM,SAAA,CAAU,OAAA,EAAS,QAAA,EAAS;AAAA,MAC5C,QAAA,EAAU,MAAM,SAAA,CAAU,OAAA,EAAS,QAAA,EAAS;AAAA,MAC5C,WAAA,EAAa,MAAM,SAAA,CAAU,OAAA,EAAS,WAAA,EAAY;AAAA,MAClD,WAAA,EAAa,MAAM,SAAA,CAAU,OAAA,EAAS,WAAA,EAAY;AAAA,MAClD,MAAM,CAAC,MAAA,KAAW,SAAA,CAAU,OAAA,EAAS,KAAK,MAAM,CAAA;AAAA,MAChD,cAAc,CAAC,IAAA,KAAS,SAAA,CAAU,OAAA,EAAS,aAAa,IAAI,CAAA;AAAA,MAC5D,MAAA,EAAQ,CAAC,CAAA,EAAG,CAAA,KAAO,UAAU,OAAA,GAAU,SAAA,CAAU,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAC,CAAA,GAAI,OAAA,CAAQ,OAAA,CAAQ,EAAE,CAAA;AAAA,MAC1F,YAAA,EAAc,MAAM,SAAA,CAAU,OAAA,EAAS,YAAA,EAAa;AAAA,MACpD,WAAA,EAAa,MAAM,SAAA,CAAU,OAAA,EAAS,WAAA;AAAY,KACpD,CAAA;AAAA,IACA;AAAC,GACH;AAGA,EAAA,MAAM,kBAAkBD,iBAAA,CAAY,MAAM,aAAa,IAAI,CAAA,EAAG,EAAE,CAAA;AAChE,EAAA,MAAM,gBAAA,GAAmBA,kBAAY,CAAC,CAAA,KAAc,eAAe,CAAC,CAAA,EAAG,EAAE,CAAA;AACzE,EAAA,MAAM,aAAA,GAAgBA,iBAAA,CAAY,CAAC,CAAA,KAAc;AAC/C,IAAA,YAAA,CAAa,KAAK,CAAA;AAClB,IAAA,SAAA,CAAU,OAAA,EAAS,YAAA,CAAa,CAAA,GAAI,GAAG,CAAA;AAAA,EACzC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,eAAA,GAAkBA,iBAAA,CAAY,CAAC,IAAA,KAAkB;AACrD,IAAA,IAAI,IAAA,EAAM,SAAA,CAAU,OAAA,EAAS,IAAA,CAAK,IAAI,CAAA;AAAA,EACxC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,wBAAA,GAA2BA,iBAAA,CAAY,CAAC,GAAA,KAAgB;AAC5D,IAAA,IAAI,GAAA,EAAK,SAAA,CAAU,OAAA,EAAS,IAAA,CAAK,GAAG,CAAA;AAAA,EACtC,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,uBACEP,eAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,OAAA;AAAA,MACL,SAAA,EAAW,cAAA,CAAe,cAAA,EAAgB,SAAS,CAAA;AAAA,MACnD,KAAA;AAAA,MACA,YAAA,EAAY,WAAW,MAAA,GAAS,OAAA;AAAA,MAChC,aAAA,EAAa,MAAA;AAAA,MACb,QAAA,EAAU,CAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAD,cAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sBAAA,EAAuB,KAAK,aAAA,EAAe,CAAA;AAAA,QAEzD,MAAA,KAAW,2BACVA,cAAAA;AAAA,UAAC,QAAA;AAAA,UAAA;AAAA,YACC,UAAA,EAAY,gBAAA;AAAA,YACZ,WAAA,EAAa,WAAA;AAAA,YACb,aAAA,EAAe,iBAAA;AAAA,YACf,YAAA,EAAc,gBAAA;AAAA,YACd,GAAA;AAAA,YACA,MAAA;AAAA,YACA,MAAA;AAAA,YACA,SAAA;AAAA,YACA,YAAA;AAAA,YACA,gBAAA;AAAA,YACA,QAAA;AAAA,YACA,QAAA;AAAA,YACA,WAAA,EAAa,eAAA;AAAA,YACb,QAAA,EAAU,CAAC,CAAA,KAAM,KAAK,UAAU,CAAC,CAAA;AAAA,YACjC,mBAAA,EAAqB,CAAC,CAAA,KAAM,SAAA,CAAU,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,KAAA,EAAO,CAAA,EAAE,CAAE,CAAA;AAAA,YACvE,sBAAsB,CAAC,GAAA,KAAQ,SAAA,CAAU,CAAC,UAAU,EAAE,GAAG,IAAA,EAAM,OAAA,EAAS,EAAE,GAAG,IAAA,CAAK,SAAS,GAAG,GAAA,IAAM,CAAE,CAAA;AAAA,YACtG,cAAA,EAAgB,MAAM,SAAA,CAAU,OAAA,EAAS,YAAA,EAAa;AAAA,YACtD,oBAAA,EAAsB,wBAAA;AAAA,YACtB,WAAA,EAAa,eAAA;AAAA,YACb,YAAA,EAAc,gBAAA;AAAA,YACd,SAAA,EAAW,aAAA;AAAA,YACX,YAAA,EAAc,aAAA;AAAA,YACd,gBAAA,EAAkB,mBAAA;AAAA,YAClB,gBAAA,EAAkB;AAAA;AAAA,SACpB,mBAEAC,eAAAA,CAAAG,mBAAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAAJ,cAAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,WAAA,EAAa,MAAM,UAAA,CAAW,IAAI,CAAA;AAAA,cAClC,cAAA,EAAgB,MAAM,aAAA,CAAc,IAAI,CAAA;AAAA,cACxC,aAAA,EAAe,MAAM,SAAA,CAAU,OAAA,EAAS,WAAA,EAAY;AAAA,cACpD,UAAA,EAAY,MAAM,SAAA,CAAU,OAAA,EAAS,QAAA,EAAS;AAAA,cAC9C,UAAA,EAAY,MAAM,SAAA,CAAU,OAAA,EAAS,QAAA,EAAS;AAAA,cAC9C,aAAA,EAAe,MAAM,SAAA,CAAU,OAAA,EAAS,WAAA,EAAY;AAAA,cACpD,QAAA;AAAA,cACA,gBAAA,EAAkB,MAAM,mBAAA,CAAoB,CAAC,QAAQ,CAAA;AAAA,cACrD,QAAA;AAAA,cACA,gBAAA,EAAkB;AAAA;AAAA,WACpB;AAAA,UAAA,CAEE,OAAA,IAAW,+BAAeA,cAAAA,CAAC,SAAI,SAAA,EAAU,uBAAA,EAAwB,SAAS,YAAA,EAAc,CAAA;AAAA,0BAE1FA,cAAAA;AAAA,YAAC,SAAA;AAAA,YAAA;AAAA,cACC,MAAA,EAAQ,OAAA;AAAA,cACR,OAAA,EAAS,MAAM,UAAA,CAAW,KAAK,CAAA;AAAA,cAC/B,GAAA;AAAA,cACA,QAAA,EAAU;AAAA;AAAA,WACZ;AAAA,0BAEAA,cAAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,MAAA,EAAQ,UAAA;AAAA,cACR,OAAA,EAAS,MAAM,aAAA,CAAc,KAAK,CAAA;AAAA,cAClC,MAAA;AAAA,cACA,MAAA;AAAA,cACA,QAAA,EAAU,CAAC,CAAA,KAAM,KAAK,UAAU,CAAC,CAAA;AAAA,cACjC,aAAA,EAAe,CAAC,CAAA,KAAM,SAAA,CAAU,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,KAAA,EAAO,CAAA,EAAE,CAAE,CAAA;AAAA,cACjE,gBAAgB,CAAC,GAAA,KAAQ,SAAA,CAAU,CAAC,UAAU,EAAE,GAAG,IAAA,EAAM,OAAA,EAAS,EAAE,GAAG,IAAA,CAAK,SAAS,GAAG,GAAA,IAAM,CAAE,CAAA;AAAA,cAChG,cAAA,EAAgB,MAAM,SAAA,CAAU,OAAA,EAAS,YAAA,EAAa;AAAA,cACtD,cAAA,EAAgB;AAAA;AAAA,WAClB;AAAA,0BAEAA,cAAAA;AAAA,YAAC,gBAAA;AAAA,YAAA;AAAA,cACC,MAAA;AAAA,cACA,SAAA;AAAA,cACA,YAAA;AAAA,cACA,gBAAA;AAAA,cACA,WAAA,EAAa,eAAA;AAAA,cACb,YAAA,EAAc,gBAAA;AAAA,cACd,SAAA,EAAW,aAAA;AAAA,cACX,YAAA,EAAc;AAAA;AAAA;AAChB,SAAA,EACF;AAAA;AAAA;AAAA,GAEJ;AAEJ,CAAC","file":"react.cjs","sourcesContent":["import 'foliate-js/view.js'\r\nimport type { EBookReaderHandle, EBookReaderOptions, ProgressInfo, SearchOptions, SearchResult, TocItem } from './types.js'\r\n\r\ntype FoliateViewElement = HTMLElement & {\r\n book?: { toc?: TocItem[] }\r\n renderer?: {\r\n prevSection?: () => void\r\n nextSection?: () => void\r\n setStyles?: (css: string) => void\r\n render?: () => void\r\n expand?: () => void\r\n }\r\n open?: (file: File) => Promise<void>\r\n init?: (options?: unknown) => Promise<void>\r\n goLeft?: () => void\r\n goRight?: () => void\r\n goTo?: (target: string) => Promise<void> | void\r\n goToFraction?: (fraction: number) => Promise<void> | void\r\n search?: (options: unknown) => AsyncIterable<unknown>\r\n clearSearch?: () => void\r\n}\r\n\r\nconst getContentCSS = (fontSize: number, isDark: boolean, extraCSS?: string) => `\r\n@namespace epub \"http://www.idpf.org/2007/ops\";\r\nhtml {\r\n color-scheme: ${isDark ? 'dark' : 'light'} !important;\r\n}\r\nbody {\r\n background-color: transparent !important;\r\n color: ${isDark ? '#e0e0e0' : 'black'} !important;\r\n font-size: ${fontSize}% !important;\r\n}\r\np {\r\n line-height: 1.6;\r\n margin-bottom: 1em;\r\n}\r\na {\r\n color: ${isDark ? '#64b5f6' : '#2563eb'} !important;\r\n}\r\nimg {\r\n max-width: 100%;\r\n height: auto;\r\n object-fit: contain;\r\n ${isDark ? 'filter: brightness(0.8) contrast(1.2);' : ''}\r\n}\r\n${extraCSS ?? ''}\r\n`\r\n\r\nexport function createEBookReader(container: HTMLElement, options: EBookReaderOptions = {}): EBookReaderHandle {\r\n if (!container) throw new Error('container is required')\r\n if (!customElements.get('foliate-view')) throw new Error('foliate-view is not defined')\r\n\r\n const {\r\n darkMode: initialDarkMode = false,\r\n fontSize: initialFontSize = 100,\r\n extraContentCSS,\r\n onReady,\r\n onError,\r\n onProgress,\r\n onToc,\r\n onSearchProgress,\r\n onContentLoad,\r\n } = options\r\n\r\n let destroyed = false\r\n let toc: TocItem[] = []\r\n let fontSize = initialFontSize\r\n let darkMode = initialDarkMode\r\n let searchToken = 0\r\n\r\n container.innerHTML = ''\r\n\r\n const viewer = document.createElement('foliate-view') as FoliateViewElement\r\n viewer.style.display = 'block'\r\n viewer.style.width = '100%'\r\n viewer.style.height = '100%'\r\n viewer.setAttribute('margin', '48')\r\n viewer.setAttribute('gap', '0.07')\r\n\r\n const applyStyles = () => {\r\n if (destroyed) return\r\n if (!viewer.renderer?.setStyles) return\r\n viewer.renderer.setStyles(getContentCSS(fontSize, darkMode, extraContentCSS))\r\n requestAnimationFrame(() => {\r\n setTimeout(() => {\r\n if (destroyed) return\r\n viewer.renderer?.render?.()\r\n viewer.renderer?.expand?.()\r\n }, 50)\r\n })\r\n }\r\n\r\n const handleLoad = (e: Event) => {\r\n applyStyles()\r\n const detail = (e as CustomEvent).detail as { doc?: Document } | undefined\r\n if (detail?.doc) onContentLoad?.(detail.doc)\r\n }\r\n\r\n const handleRelocate = (e: Event) => {\r\n const detail = (e as CustomEvent).detail as ProgressInfo\r\n onProgress?.(detail)\r\n }\r\n\r\n viewer.addEventListener('load', handleLoad as EventListener)\r\n viewer.addEventListener('relocate', handleRelocate as EventListener)\r\n\r\n container.appendChild(viewer)\r\n\r\n const handle: EBookReaderHandle = {\r\n async open(file) {\r\n if (destroyed) return\r\n if (!file) return\r\n\r\n try {\r\n viewer.clearSearch?.()\r\n searchToken++\r\n\r\n await viewer.open?.(file)\r\n\r\n const nextToc = viewer.book?.toc ?? []\r\n toc = nextToc\r\n onToc?.(toc)\r\n\r\n await viewer.init?.({ showTextStart: true })\r\n applyStyles()\r\n } catch (error) {\r\n onError?.(error)\r\n throw error\r\n }\r\n },\r\n destroy() {\r\n if (destroyed) return\r\n destroyed = true\r\n searchToken++\r\n viewer.removeEventListener('load', handleLoad)\r\n viewer.removeEventListener('relocate', handleRelocate as EventListener)\r\n container.innerHTML = ''\r\n },\r\n prevPage() {\r\n viewer.goLeft?.()\r\n },\r\n nextPage() {\r\n viewer.goRight?.()\r\n },\r\n prevSection() {\r\n viewer.renderer?.prevSection?.()\r\n },\r\n nextSection() {\r\n viewer.renderer?.nextSection?.()\r\n },\r\n goTo(target) {\r\n if (!target) return\r\n viewer.goTo?.(target)\r\n },\r\n goToFraction(fraction) {\r\n const safe = Math.min(1, Math.max(0, fraction))\r\n viewer.goToFraction?.(safe)\r\n },\r\n setDarkMode(nextDarkMode) {\r\n darkMode = nextDarkMode\r\n applyStyles()\r\n },\r\n setFontSize(nextFontSize) {\r\n const safe = Math.min(300, Math.max(50, nextFontSize))\r\n fontSize = safe\r\n applyStyles()\r\n },\r\n async search(query, opts: SearchOptions = {}) {\r\n const normalized = query.trim()\r\n if (!normalized) {\r\n viewer.clearSearch?.()\r\n return []\r\n }\r\n\r\n const token = ++searchToken\r\n const results: SearchResult[] = []\r\n\r\n try {\r\n for await (const item of viewer.search?.({\r\n query: normalized,\r\n matchCase: Boolean(opts.matchCase),\r\n matchWholeWords: Boolean(opts.wholeWords),\r\n matchDiacritics: Boolean(opts.matchDiacritics),\r\n }) ?? []) {\r\n if (destroyed || token !== searchToken) return results\r\n\r\n if (item === 'done') {\r\n onSearchProgress?.({ done: true, progress: 1 })\r\n break\r\n }\r\n\r\n if (typeof item === 'object' && item && 'progress' in (item as any)) {\r\n const progress = (item as any).progress\r\n if (typeof progress === 'number') onSearchProgress?.({ progress })\r\n continue\r\n }\r\n\r\n const anyItem = item as any\r\n if (anyItem?.subitems?.length) {\r\n for (const sub of anyItem.subitems) {\r\n results.push({\r\n label: anyItem.label,\r\n cfi: sub?.cfi,\r\n excerpt: sub?.excerpt,\r\n title: sub?.title,\r\n })\r\n }\r\n } else if (anyItem?.cfi) {\r\n results.push({\r\n cfi: anyItem.cfi,\r\n excerpt: anyItem.excerpt,\r\n title: anyItem.title,\r\n })\r\n }\r\n }\r\n } catch (error) {\r\n onError?.(error)\r\n throw error\r\n }\r\n\r\n return results\r\n },\r\n cancelSearch() {\r\n searchToken++\r\n },\r\n clearSearch() {\r\n viewer.clearSearch?.()\r\n },\r\n getToc() {\r\n return toc\r\n },\r\n }\r\n\r\n onReady?.(handle)\r\n return handle\r\n}\r\n","export const icons: Record<string, string> = {\n list: '<path d=\"M3 12h18M3 6h18M3 18h18\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n search: '<path d=\"M11 19a8 8 0 1 0 0-16 8 8 0 0 0 0 16zM21 21l-4.35-4.35\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n 'chevron-left': '<path d=\"M15 18l-6-6 6-6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n 'chevron-right': '<path d=\"M9 18l6-6-6-6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n 'chevrons-left': '<path d=\"M11 17l-5-5 5-5M18 17l-5-5 5-5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n 'chevrons-right': '<path d=\"M13 17l5-5-5-5M6 17l5-5-5-5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n sun: '<circle cx=\"12\" cy=\"12\" r=\"5\" stroke=\"currentColor\" stroke-width=\"2\"/><path d=\"M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"/>',\n moon: '<path d=\"M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n plus: '<path d=\"M12 5v14M5 12h14\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n minus: '<path d=\"M5 12h14\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n x: '<path d=\"M18 6L6 18M6 6l12 12\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n type: '<path d=\"M4 7V4h16v3M9 20h6M12 4v16\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>',\n sliders: '<path d=\"M4 21v-7M4 10V3M12 21v-9M12 8V3M20 21v-5M20 12V3M1 14h6M9 8h6M17 16h6\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>'\n}\n","import { useMemo } from 'react'\nimport { icons } from '../../core/icons'\n\nexport type SvgIconProps = {\n name: string\n size?: number | string\n color?: string\n className?: string\n}\n\nexport const SvgIcon = ({ name, size = 24, color = 'currentColor', className }: SvgIconProps) => {\n const iconPath = icons[name] || ''\n\n const style = useMemo(() => {\n const sizeVal = typeof size === 'number' ? `${size}px` : size\n return {\n width: sizeVal,\n height: sizeVal,\n color: color,\n minWidth: sizeVal,\n display: 'inline-block',\n verticalAlign: 'middle',\n }\n }, [size, color])\n\n if (!iconPath) return null\n\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n style={style}\n className={className}\n dangerouslySetInnerHTML={{ __html: iconPath }}\n />\n )\n}\n","import { SvgIcon } from './SvgIcon'\r\n\r\ntype DesktopToolbarProps = {\r\n onToggleToc: () => void\r\n onToggleSearch: () => void\r\n onPrevSection: () => void\r\n onPrevPage: () => void\r\n onNextPage: () => void\r\n onNextSection: () => void\r\n darkMode: boolean\r\n onToggleDarkMode: () => void\r\n fontSize: number\r\n onFontSizeChange: (size: number) => void\r\n}\r\n\r\n/**\r\n * 桌面端工具栏组件\r\n */\r\nexport const DesktopToolbar = ({\r\n onToggleToc,\r\n onToggleSearch,\r\n onPrevSection,\r\n onPrevPage,\r\n onNextPage,\r\n onNextSection,\r\n darkMode,\r\n onToggleDarkMode,\r\n fontSize,\r\n onFontSizeChange,\r\n}: DesktopToolbarProps) => {\r\n return (\r\n <div className=\"ebook-reader__toolbar\">\r\n <div className=\"ebook-reader__panel\">\r\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={onToggleToc} title=\"目录\">\r\n <SvgIcon name=\"list\" />\r\n </button>\r\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={onToggleSearch} title=\"搜索\">\r\n <SvgIcon name=\"search\" />\r\n </button>\r\n <div className=\"ebook-reader__divider\" />\r\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={onPrevSection} title=\"上一章\">\r\n <SvgIcon name=\"chevrons-left\" />\r\n </button>\r\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={onPrevPage} title=\"上一页\">\r\n <SvgIcon name=\"chevron-left\" />\r\n </button>\r\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={onNextPage} title=\"下一页\">\r\n <SvgIcon name=\"chevron-right\" />\r\n </button>\r\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={onNextSection} title=\"下一章\">\r\n <SvgIcon name=\"chevrons-right\" />\r\n </button>\r\n </div>\r\n\r\n <div className=\"ebook-reader__panel\">\r\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={onToggleDarkMode} title=\"主题\">\r\n <SvgIcon name={darkMode ? 'sun' : 'moon'} />\r\n </button>\r\n <div className=\"ebook-reader__divider\" />\r\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={() => onFontSizeChange(fontSize + 10)} title=\"增大字号\">\r\n <SvgIcon name=\"plus\" />\r\n </button>\r\n <div className=\"ebook-reader__font\">{fontSize}%</div>\r\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={() => onFontSizeChange(fontSize - 10)} title=\"减小字号\">\r\n <SvgIcon name=\"minus\" />\r\n </button>\r\n </div>\r\n </div>\r\n )\r\n}\r\n","type DesktopBottomBarProps = {\n status: 'idle' | 'ready' | 'opening' | 'error'\n errorText: string\n sectionLabel: string\n displayedPercent: number\n onSeekStart: () => void\n onSeekChange: (val: number) => void\n onSeekEnd: (val: number) => void\n onSeekCommit: (val: number) => void\n}\n\n/**\n * 桌面端底部栏组件 (进度条)\n */\nexport const DesktopBottomBar = ({\n status,\n errorText,\n sectionLabel,\n displayedPercent,\n onSeekStart,\n onSeekChange,\n onSeekEnd,\n onSeekCommit,\n}: DesktopBottomBarProps) => {\n return (\n <div className=\"ebook-reader__bottom\">\n <div className=\"ebook-reader__bottom-left\">\n <span className=\"ebook-reader__status\">\n {status === 'error' ? errorText || '错误' : status === 'opening' ? '正在打开…' : '就绪'}\n </span>\n {sectionLabel ? <span className=\"ebook-reader__section\">{sectionLabel}</span> : null}\n </div>\n <div className=\"ebook-reader__bottom-right\">\n <input\n className=\"ebook-reader__range\"\n type=\"range\"\n min={0}\n max={100}\n step={1}\n value={displayedPercent}\n onChange={(e) => {\n onSeekStart()\n onSeekChange(Number(e.target.value))\n }}\n onPointerUp={(e) => {\n const v = Number((e.target as HTMLInputElement).value)\n onSeekEnd(v)\n }}\n onKeyUp={(e) => {\n if (e.key !== 'Enter') return\n const v = Number((e.target as HTMLInputElement).value)\n onSeekCommit(v)\n }}\n />\n <span className=\"ebook-reader__percent\">{displayedPercent}%</span>\n </div>\n </div>\n )\n}\n","import type { TocItem } from '../../core/types.js'\r\n\r\ntype TocTreeProps = {\r\n items: TocItem[]\r\n onSelect: (href?: string) => void\r\n}\r\n\r\n/**\r\n * 目录树组件\r\n * 递归渲染目录项\r\n */\r\nexport const TocTree = ({ items, onSelect }: TocTreeProps) => {\r\n return (\r\n <ul className=\"ebook-reader__toc-list\">\r\n {items.map((item, idx) => {\r\n const key = item.href || `${item.label ?? 'item'}-${idx}`\r\n const hasChildren = Boolean(item.subitems?.length)\r\n const label = item.label || item.href || '未命名'\r\n\r\n if (!hasChildren) {\r\n return (\r\n <li key={key} className=\"ebook-reader__toc-item\">\r\n <button type=\"button\" className=\"ebook-reader__toc-btn\" onClick={() => onSelect(item.href)}>\r\n {label}\r\n </button>\r\n </li>\r\n )\r\n }\r\n\r\n return (\r\n <li key={key} className=\"ebook-reader__toc-item\">\r\n <details className=\"ebook-reader__toc-details\">\r\n <summary className=\"ebook-reader__toc-summary\">{label}</summary>\r\n <TocTree items={item.subitems ?? []} onSelect={onSelect} />\r\n </details>\r\n </li>\r\n )\r\n })}\r\n </ul>\r\n )\r\n}\r\n","import type { TocItem } from '../../core/types.js'\nimport { TocTree } from './TocTree'\nimport { SvgIcon } from './SvgIcon'\n\ntype TocDrawerProps = {\n isOpen: boolean\n onClose: () => void\n toc: TocItem[]\n onSelect: (href?: string) => void\n}\n\n/**\n * 目录侧边栏组件\n */\nexport const TocDrawer = ({ isOpen, onClose, toc, onSelect }: TocDrawerProps) => {\n return (\n <aside className={`ebook-reader__drawer ${isOpen ? 'is-open' : ''}`} aria-hidden={!isOpen}>\n <div className=\"ebook-reader__drawer-header\">\n <div className=\"ebook-reader__drawer-title\">目录</div>\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={onClose}>\n <SvgIcon name=\"x\" />\n </button>\n </div>\n <div className=\"ebook-reader__drawer-body\">\n {toc.length ? (\n <TocTree\n items={toc}\n onSelect={(href) => {\n onSelect(href)\n onClose()\n }}\n />\n ) : (\n <div className=\"ebook-reader__empty\">未找到目录</div>\n )}\n </div>\n </aside>\n )\n}\n","import type { SearchResult } from '../../core/types.js'\n\ntype SearchResultListProps = {\n results: SearchResult[]\n onSelect: (cfi: string) => void\n}\n\n/**\n * 搜索结果列表组件\n */\nexport const SearchResultList = ({ results, onSelect }: SearchResultListProps) => {\n return (\n <ul className=\"ebook-reader__search-list\">\n {results.map((r, idx) => (\n <li key={`${r.cfi ?? 'no-cfi'}-${idx}`} className=\"ebook-reader__search-item\">\n <button\n type=\"button\"\n className=\"ebook-reader__search-btn\"\n onClick={() => {\n if (r.cfi) onSelect(r.cfi)\n }}\n >\n {r.label ? <div className=\"ebook-reader__search-label\">{r.label}</div> : null}\n <div className=\"ebook-reader__search-excerpt\">\n {typeof r.excerpt === 'string'\n ? r.excerpt\n : `${r.excerpt?.pre ?? ''}${r.excerpt?.match ?? ''}${r.excerpt?.post ?? ''}`}\n </div>\n </button>\n </li>\n ))}\n </ul>\n )\n}\n","import type { SearchState } from '../types.js'\nimport { SearchResultList } from './SearchResultList'\nimport { SvgIcon } from './SvgIcon'\n\ntype SearchDrawerProps = {\n isOpen: boolean\n onClose: () => void\n status: 'idle' | 'ready' | 'opening' | 'error'\n search: SearchState\n onSearch: (query: string) => void\n onQueryChange: (query: string) => void\n onOptionChange: (opt: Partial<SearchState['options']>) => void\n onCancelSearch: () => void\n onResultSelect: (cfi: string) => void\n}\n\n/**\n * 搜索侧边栏组件\n */\nexport const SearchDrawer = ({\n isOpen,\n onClose,\n status,\n search,\n onSearch,\n onQueryChange,\n onOptionChange,\n onCancelSearch,\n onResultSelect,\n}: SearchDrawerProps) => {\n return (\n <aside className={`ebook-reader__drawer right ${isOpen ? 'is-open' : ''}`} aria-hidden={!isOpen}>\n <div className=\"ebook-reader__drawer-header\">\n <div className=\"ebook-reader__drawer-title\">搜索</div>\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={onClose}>\n <SvgIcon name=\"x\" />\n </button>\n </div>\n <div className=\"ebook-reader__drawer-body\">\n <div className=\"ebook-reader__field\">\n <input\n className=\"ebook-reader__input\"\n placeholder=\"输入关键词\"\n value={search.query}\n onChange={(e) => {\n const v = e.target.value\n onQueryChange(v)\n if (!v.trim()) onSearch('')\n }}\n disabled={status !== 'ready'}\n onKeyDown={(e) => {\n if (e.key === 'Enter') onSearch(search.query)\n }}\n />\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={() => onSearch(search.query)} disabled={status !== 'ready'}>\n <SvgIcon name=\"search\" />\n </button>\n </div>\n\n <div className=\"ebook-reader__checks\">\n <label className=\"ebook-reader__check\">\n <input\n type=\"checkbox\"\n checked={Boolean(search.options.matchCase)}\n onChange={(e) => onOptionChange({ matchCase: e.target.checked })}\n />\n 区分大小写\n </label>\n <label className=\"ebook-reader__check\">\n <input\n type=\"checkbox\"\n checked={Boolean(search.options.wholeWords)}\n onChange={(e) => onOptionChange({ wholeWords: e.target.checked })}\n />\n 全词匹配\n </label>\n <label className=\"ebook-reader__check\">\n <input\n type=\"checkbox\"\n checked={Boolean(search.options.matchDiacritics)}\n onChange={(e) => onOptionChange({ matchDiacritics: e.target.checked })}\n />\n 区分变音\n </label>\n </div>\n\n <div className=\"ebook-reader__meta\">\n <span>进度 {search.progressPercent}%</span>\n {search.searching ? <span>搜索中…</span> : null}\n {search.searching ? (\n <button type=\"button\" className=\"ebook-reader__link\" onClick={onCancelSearch}>\n 取消\n </button>\n ) : null}\n </div>\n\n {search.results.length ? (\n <SearchResultList results={search.results} onSelect={onResultSelect} />\n ) : (\n <div className=\"ebook-reader__empty\">{search.query.trim() ? '无匹配结果' : '请输入关键词'}</div>\n )}\n </div>\n </aside>\n )\n}\n","import { useState, useRef } from 'react'\r\nimport type { TocItem } from '../../core/types.js'\r\nimport type { MobilePanel, SearchState } from '../types.js'\r\nimport { TocTree } from './TocTree'\r\nimport { SearchResultList } from './SearchResultList'\r\nimport { SvgIcon } from './SvgIcon'\r\n\r\ntype MobileUIProps = {\r\n barVisible: boolean\r\n activePanel: MobilePanel | null\r\n onTogglePanel: (panel: MobilePanel) => void\r\n onClosePanel: () => void\r\n \r\n // Data props\r\n toc: TocItem[]\r\n search: SearchState\r\n status: 'idle' | 'ready' | 'opening' | 'error'\r\n errorText: string\r\n sectionLabel: string\r\n displayedPercent: number\r\n darkMode: boolean\r\n fontSize: number\r\n \r\n // Actions\r\n onTocSelect: (href?: string) => void\r\n \r\n onSearch: (query: string) => void\r\n onSearchQueryChange: (query: string) => void\r\n onSearchOptionChange: (opt: Partial<SearchState['options']>) => void\r\n onCancelSearch: () => void\r\n onSearchResultSelect: (cfi: string) => void\r\n \r\n onSeekStart: () => void\r\n onSeekChange: (val: number) => void\r\n onSeekEnd: (val: number) => void\r\n onSeekCommit: (val: number) => void\r\n \r\n onToggleDarkMode: (val: boolean) => void\r\n onFontSizeChange: (val: number) => void\r\n}\r\n\r\n/**\r\n * 移动端 UI 组件\r\n * 包含底部导航栏和弹出面板\r\n */\r\nexport const MobileUI = ({\r\n barVisible,\r\n activePanel,\r\n onTogglePanel,\r\n onClosePanel,\r\n toc,\r\n search,\r\n status,\r\n errorText,\r\n sectionLabel,\r\n displayedPercent,\r\n darkMode,\r\n fontSize,\r\n onTocSelect,\r\n onSearch,\r\n onSearchQueryChange,\r\n onSearchOptionChange,\r\n onCancelSearch,\r\n onSearchResultSelect,\r\n onSeekStart,\r\n onSeekChange,\r\n onSeekEnd,\r\n onSeekCommit,\r\n onToggleDarkMode,\r\n onFontSizeChange,\r\n}: MobileUIProps) => {\r\n const mobileTitle = activePanel === 'menu' ? '目录' : activePanel === 'search' ? '搜索' : activePanel === 'progress' ? '进度' : activePanel === 'theme' ? '明暗' : activePanel === 'font' ? '字号' : ''\r\n\r\n const [tooltip, setTooltip] = useState<{ text: string, left: number } | null>(null)\r\n const timerRef = useRef<number | null>(null)\r\n\r\n const handleTouchStart = (e: React.TouchEvent, text: string) => {\r\n const rect = e.currentTarget.getBoundingClientRect()\r\n // 长按 500ms 后显示提示\r\n timerRef.current = window.setTimeout(() => {\r\n setTooltip({\r\n text,\r\n left: rect.left + rect.width / 2\r\n })\r\n }, 500)\r\n }\r\n\r\n const handleTouchEnd = () => {\r\n if (timerRef.current) {\r\n clearTimeout(timerRef.current)\r\n timerRef.current = null\r\n }\r\n setTooltip(null)\r\n }\r\n\r\n return (\r\n <>\r\n <div className={`ebook-reader__mbar ${barVisible ? 'is-visible' : ''}`}>\r\n {tooltip && (\r\n <div \r\n className=\"ebook-reader__tooltip\" \r\n style={{ \r\n position: 'fixed', \r\n bottom: '60px', // 位于工具栏上方\r\n left: tooltip.left,\r\n transform: 'translateX(-50%)',\r\n background: 'rgba(0,0,0,0.8)',\r\n color: '#fff',\r\n padding: '4px 8px',\r\n borderRadius: '4px',\r\n fontSize: '12px',\r\n pointerEvents: 'none',\r\n zIndex: 1000,\r\n whiteSpace: 'nowrap'\r\n }}\r\n >\r\n {tooltip.text}\r\n </div>\r\n )}\r\n <button \r\n type=\"button\" \r\n className=\"ebook-reader__btn\" \r\n onClick={() => onTogglePanel('menu')} \r\n aria-pressed={activePanel === 'menu'}\r\n onTouchStart={(e) => handleTouchStart(e, '目录')}\r\n onTouchEnd={handleTouchEnd}\r\n onTouchCancel={handleTouchEnd}\r\n title=\"目录\"\r\n >\r\n <SvgIcon name=\"list\" />\r\n </button>\r\n <button \r\n type=\"button\" \r\n className=\"ebook-reader__btn\" \r\n onClick={() => onTogglePanel('search')} \r\n aria-pressed={activePanel === 'search'}\r\n onTouchStart={(e) => handleTouchStart(e, '搜索')}\r\n onTouchEnd={handleTouchEnd}\r\n onTouchCancel={handleTouchEnd}\r\n title=\"搜索\"\r\n >\r\n <SvgIcon name=\"search\" />\r\n </button>\r\n <button \r\n type=\"button\" \r\n className=\"ebook-reader__btn\" \r\n onClick={() => onTogglePanel('progress')} \r\n aria-pressed={activePanel === 'progress'}\r\n onTouchStart={(e) => handleTouchStart(e, '进度')}\r\n onTouchEnd={handleTouchEnd}\r\n onTouchCancel={handleTouchEnd}\r\n title=\"进度\"\r\n >\r\n <SvgIcon name=\"sliders\" />\r\n </button>\r\n <button \r\n type=\"button\" \r\n className=\"ebook-reader__btn\" \r\n onClick={() => onTogglePanel('theme')} \r\n aria-pressed={activePanel === 'theme'}\r\n onTouchStart={(e) => handleTouchStart(e, '明暗')}\r\n onTouchEnd={handleTouchEnd}\r\n onTouchCancel={handleTouchEnd}\r\n title=\"明暗\"\r\n >\r\n <SvgIcon name=\"sun\" />\r\n </button>\r\n <button \r\n type=\"button\" \r\n className=\"ebook-reader__btn\" \r\n onClick={() => onTogglePanel('font')} \r\n aria-pressed={activePanel === 'font'}\r\n onTouchStart={(e) => handleTouchStart(e, '字号')}\r\n onTouchEnd={handleTouchEnd}\r\n onTouchCancel={handleTouchEnd}\r\n title=\"字号\"\r\n >\r\n <SvgIcon name=\"type\" />\r\n </button>\r\n </div>\r\n\r\n {activePanel ? <div className=\"ebook-reader__moverlay\" onClick={onClosePanel} /> : null}\r\n\r\n <div className={`ebook-reader__msheet ${activePanel ? 'is-open' : ''}`} aria-hidden={!activePanel}>\r\n <div className=\"ebook-reader__msheet-header\">\r\n <div className=\"ebook-reader__msheet-title\">{mobileTitle}</div>\r\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={onClosePanel}>\r\n <SvgIcon name=\"x\" />\r\n </button>\r\n </div>\r\n <div className=\"ebook-reader__msheet-body\">\r\n {activePanel === 'menu' ? (\r\n toc.length ? (\r\n <TocTree\r\n items={toc}\r\n onSelect={(href) => {\r\n onTocSelect(href)\r\n onClosePanel()\r\n }}\r\n />\r\n ) : (\r\n <div className=\"ebook-reader__empty\">未找到目录</div>\r\n )\r\n ) : null}\r\n\r\n {activePanel === 'search' ? (\r\n <>\r\n <div className=\"ebook-reader__field\">\r\n <input\r\n className=\"ebook-reader__input\"\r\n placeholder=\"输入关键词\"\r\n value={search.query}\r\n onChange={(e) => {\r\n const v = e.target.value\r\n onSearchQueryChange(v)\r\n if (!v.trim()) onSearch('')\r\n }}\r\n disabled={status !== 'ready'}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') onSearch(search.query)\r\n }}\r\n />\r\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={() => onSearch(search.query)} disabled={status !== 'ready'}>\r\n 搜索\r\n </button>\r\n </div>\r\n\r\n <div className=\"ebook-reader__checks\">\r\n <label className=\"ebook-reader__check\">\r\n <input\r\n type=\"checkbox\"\r\n checked={Boolean(search.options.matchCase)}\r\n onChange={(e) => onSearchOptionChange({ matchCase: e.target.checked })}\r\n />\r\n 区分大小写\r\n </label>\r\n <label className=\"ebook-reader__check\">\r\n <input\r\n type=\"checkbox\"\r\n checked={Boolean(search.options.wholeWords)}\r\n onChange={(e) => onSearchOptionChange({ wholeWords: e.target.checked })}\r\n />\r\n 全词匹配\r\n </label>\r\n <label className=\"ebook-reader__check\">\r\n <input\r\n type=\"checkbox\"\r\n checked={Boolean(search.options.matchDiacritics)}\r\n onChange={(e) => onSearchOptionChange({ matchDiacritics: e.target.checked })}\r\n />\r\n 区分变音\r\n </label>\r\n </div>\r\n\r\n <div className=\"ebook-reader__meta\">\r\n <span>进度 {search.progressPercent}%</span>\r\n {search.searching ? <span>搜索中…</span> : null}\r\n {search.searching ? (\r\n <button type=\"button\" className=\"ebook-reader__link\" onClick={onCancelSearch}>\r\n 取消\r\n </button>\r\n ) : null}\r\n </div>\r\n\r\n {search.results.length ? (\r\n <SearchResultList results={search.results} onSelect={onSearchResultSelect} />\r\n ) : (\r\n <div className=\"ebook-reader__empty\">{search.query.trim() ? '无匹配结果' : '请输入关键词'}</div>\r\n )}\r\n </>\r\n ) : null}\r\n\r\n {activePanel === 'progress' ? (\r\n <>\r\n <div className=\"ebook-reader__meta\">\r\n <span className=\"ebook-reader__status\">\r\n {status === 'error' ? errorText || '错误' : status === 'opening' ? '正在打开…' : '就绪'}\r\n </span>\r\n {sectionLabel ? <span>{sectionLabel}</span> : null}\r\n </div>\r\n <div className=\"ebook-reader__mprogress\">\r\n <input\r\n className=\"ebook-reader__range\"\r\n type=\"range\"\r\n min={0}\r\n max={100}\r\n step={1}\r\n value={displayedPercent}\r\n onChange={(e) => {\r\n onSeekStart()\r\n onSeekChange(Number(e.target.value))\r\n }}\r\n onPointerUp={(e) => {\r\n const v = Number((e.target as HTMLInputElement).value)\r\n onSeekEnd(v)\r\n }}\r\n onKeyUp={(e) => {\r\n if (e.key !== 'Enter') return\r\n const v = Number((e.target as HTMLInputElement).value)\r\n onSeekCommit(v)\r\n }}\r\n />\r\n <div className=\"ebook-reader__mprogress-percent\">{displayedPercent}%</div>\r\n </div>\r\n </>\r\n ) : null}\r\n\r\n {activePanel === 'theme' ? (\r\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={() => onToggleDarkMode(!darkMode)}>\r\n {darkMode ? '切换到亮色' : '切换到暗黑'}\r\n </button>\r\n ) : null}\r\n\r\n {activePanel === 'font' ? (\r\n <div className=\"ebook-reader__mfont\">\r\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={() => onFontSizeChange(fontSize - 10)}>\r\n A-\r\n </button>\r\n <div className=\"ebook-reader__font\">{fontSize}%</div>\r\n <button type=\"button\" className=\"ebook-reader__btn\" onClick={() => onFontSizeChange(fontSize + 10)}>\r\n A+\r\n </button>\r\n </div>\r\n ) : null}\r\n </div>\r\n </div>\r\n </>\r\n )\r\n}\r\n","import { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react'\r\nimport { createEBookReader } from '../core/reader.js'\r\nimport type { ProgressInfo, TocItem } from '../core/types.js'\r\nimport type { EBookReaderReactHandle, EBookReaderReactProps, SearchState, MobilePanel } from './types.js'\r\nimport { DesktopToolbar } from './components/DesktopToolbar'\r\nimport { DesktopBottomBar } from './components/DesktopBottomBar'\r\nimport { TocDrawer } from './components/TocDrawer'\r\nimport { SearchDrawer } from './components/SearchDrawer'\r\nimport { MobileUI } from './components/MobileUI'\r\n\r\nconst MOBILE_MAX_WIDTH = 768\r\nconst WIDE_MIN_WIDTH = 1024\r\n\r\nconst clamp = (n: number, min: number, max: number) => Math.min(max, Math.max(min, n))\r\n\r\nconst mergeClassName = (...parts: Array<string | undefined>) => parts.filter(Boolean).join(' ')\r\n\r\n/**\r\n * EBookReader 组件\r\n *\r\n * 核心阅读器组件,负责:\r\n * 1. 管理核心 Reader 实例 (createEBookReader)\r\n * 2. 管理 UI 状态 (布局、弹窗、搜索状态等)\r\n * 3. 分发事件和数据给子组件 (Desktop/Mobile)\r\n */\r\nexport const EBookReader = forwardRef<EBookReaderReactHandle, EBookReaderReactProps>(function EBookReader(\r\n {\r\n file,\r\n className,\r\n style,\r\n defaultFontSize = 100,\r\n fontSize: controlledFontSize,\r\n onFontSizeChange,\r\n defaultDarkMode = false,\r\n darkMode: controlledDarkMode,\r\n onDarkModeChange,\r\n enableKeyboardNav = true,\r\n defaultSearchOptions = { matchCase: false, wholeWords: false, matchDiacritics: false },\r\n onReady,\r\n onError,\r\n onProgress,\r\n },\r\n ref,\r\n) {\r\n const rootRef = useRef<HTMLDivElement | null>(null)\r\n const viewerHostRef = useRef<HTMLDivElement | null>(null)\r\n const readerRef = useRef<ReturnType<typeof createEBookReader> | null>(null)\r\n\r\n const [status, setStatus] = useState<'idle' | 'ready' | 'opening' | 'error'>('idle')\r\n const [errorText, setErrorText] = useState<string>('')\r\n const [toc, setToc] = useState<TocItem[]>([])\r\n const [tocOpen, setTocOpen] = useState(false)\r\n const [searchOpen, setSearchOpen] = useState(false)\r\n const [progressInfo, setProgressInfo] = useState<ProgressInfo | null>(null)\r\n const [isSeeking, setIsSeeking] = useState(false)\r\n const [seekPercent, setSeekPercent] = useState(0)\r\n\r\n const [uncontrolledFontSize, setUncontrolledFontSize] = useState(defaultFontSize)\r\n const [uncontrolledDarkMode, setUncontrolledDarkMode] = useState(defaultDarkMode)\r\n\r\n const fontSize = controlledFontSize ?? uncontrolledFontSize\r\n const darkMode = controlledDarkMode ?? uncontrolledDarkMode\r\n\r\n const [search, setSearch] = useState<SearchState>({\r\n query: '',\r\n options: defaultSearchOptions,\r\n progressPercent: 0,\r\n searching: false,\r\n results: [],\r\n })\r\n\r\n const [layout, setLayout] = useState<'mobile' | 'default' | 'wide'>('default')\r\n const [mobileBarVisible, setMobileBarVisible] = useState(false)\r\n const [mobilePanel, setMobilePanel] = useState<MobilePanel | null>(null)\r\n const layoutRef = useRef(layout)\r\n const boundDocsRef = useRef(new WeakSet<Document>())\r\n const gestureRef = useRef({ startX: 0, startY: 0, startAt: 0, tracking: false, moved: false, actionTaken: false })\r\n\r\n const percentage = useMemo(() => Math.round((progressInfo?.fraction ?? 0) * 100), [progressInfo])\r\n const displayedPercent = isSeeking ? seekPercent : percentage\r\n const sectionLabel = progressInfo?.tocItem?.label ?? ''\r\n\r\n // 监听容器大小变化,切换布局模式\r\n useEffect(() => {\r\n const el = rootRef.current\r\n if (!el) return\r\n const ro = new ResizeObserver((entries) => {\r\n const w = entries[0]?.contentRect?.width ?? el.getBoundingClientRect().width\r\n const next = w <= MOBILE_MAX_WIDTH ? 'mobile' : w >= WIDE_MIN_WIDTH ? 'wide' : 'default'\r\n setLayout((prev) => (prev === next ? prev : next))\r\n })\r\n ro.observe(el)\r\n return () => ro.disconnect()\r\n }, [])\r\n\r\n // 布局切换时重置移动端面板状态\r\n useEffect(() => {\r\n if (layout === 'mobile') return\r\n setMobilePanel(null)\r\n setMobileBarVisible(false)\r\n }, [layout])\r\n\r\n useEffect(() => {\r\n layoutRef.current = layout\r\n }, [layout])\r\n\r\n const closeMobileSheet = useCallback(() => setMobilePanel(null), [])\r\n\r\n const toggleMobilePanel = useCallback((panel: MobilePanel) => {\r\n setMobileBarVisible(true)\r\n setMobilePanel((prev) => (prev === panel ? null : panel))\r\n }, [])\r\n\r\n const onPointerDown = useCallback((e: PointerEvent) => {\r\n if (layoutRef.current !== 'mobile') return\r\n const t = e.target as HTMLElement | null\r\n if (!t) return\r\n if (t.closest('.ebook-reader__mbar') || t.closest('.ebook-reader__msheet')) return\r\n if (t.closest('a,button,input,textarea,select,label,[role=\"button\"],[contenteditable=\"true\"]')) return\r\n gestureRef.current.tracking = true\r\n gestureRef.current.moved = false\r\n gestureRef.current.actionTaken = false\r\n gestureRef.current.startAt = e.timeStamp\r\n gestureRef.current.startX = e.screenX\r\n gestureRef.current.startY = e.screenY\r\n }, [])\r\n\r\n const onPointerMove = useCallback((e: PointerEvent) => {\r\n if (!gestureRef.current.tracking) return\r\n const dx = e.screenX - gestureRef.current.startX\r\n const dy = e.screenY - gestureRef.current.startY\r\n\r\n if (Math.abs(dx) > 8 || Math.abs(dy) > 8) gestureRef.current.moved = true\r\n if (Math.abs(dy) < 8) return\r\n\r\n if (Math.abs(dy) < Math.abs(dx)) {\r\n if (Math.abs(dx) >= 8) gestureRef.current.tracking = false\r\n return\r\n }\r\n\r\n if (dy <= -24) {\r\n gestureRef.current.actionTaken = true\r\n gestureRef.current.tracking = false\r\n setMobileBarVisible(true)\r\n return\r\n }\r\n if (dy >= 24) {\r\n gestureRef.current.actionTaken = true\r\n gestureRef.current.tracking = false\r\n setMobileBarVisible(false)\r\n setMobilePanel(null)\r\n }\r\n }, [])\r\n\r\n const onPointerEnd = useCallback((e: PointerEvent) => {\r\n if (layoutRef.current !== 'mobile') {\r\n gestureRef.current.tracking = false\r\n return\r\n }\r\n\r\n if (gestureRef.current.actionTaken) {\r\n gestureRef.current.tracking = false\r\n gestureRef.current.moved = false\r\n gestureRef.current.actionTaken = false\r\n return\r\n }\r\n\r\n if (!gestureRef.current.tracking) {\r\n gestureRef.current.moved = false\r\n return\r\n }\r\n\r\n const dx = e.screenX - gestureRef.current.startX\r\n const dy = e.screenY - gestureRef.current.startY\r\n const dt = e.timeStamp - gestureRef.current.startAt\r\n const isTap = !gestureRef.current.moved && Math.hypot(dx, dy) <= 10 && dt <= 300\r\n\r\n if (isTap) {\r\n setMobileBarVisible((prev) => {\r\n const next = !prev\r\n if (!next) setMobilePanel(null)\r\n return next\r\n })\r\n }\r\n\r\n gestureRef.current.tracking = false\r\n gestureRef.current.moved = false\r\n }, [])\r\n\r\n useEffect(() => {\r\n const root = rootRef.current\r\n if (!root) return\r\n root.addEventListener('pointerdown', onPointerDown)\r\n root.addEventListener('pointermove', onPointerMove)\r\n root.addEventListener('pointerup', onPointerEnd)\r\n root.addEventListener('pointercancel', onPointerEnd)\r\n\r\n return () => {\r\n root.removeEventListener('pointerdown', onPointerDown)\r\n root.removeEventListener('pointermove', onPointerMove)\r\n root.removeEventListener('pointerup', onPointerEnd)\r\n root.removeEventListener('pointercancel', onPointerEnd)\r\n }\r\n }, [onPointerDown, onPointerMove, onPointerEnd])\r\n\r\n const setDarkModeInternal = useCallback(\r\n (next: boolean) => {\r\n if (controlledDarkMode == null) setUncontrolledDarkMode(next)\r\n onDarkModeChange?.(next)\r\n readerRef.current?.setDarkMode(next)\r\n },\r\n [controlledDarkMode, onDarkModeChange],\r\n )\r\n\r\n const setFontSizeInternal = useCallback(\r\n (next: number) => {\r\n const safe = clamp(next, 50, 300)\r\n if (controlledFontSize == null) setUncontrolledFontSize(safe)\r\n onFontSizeChange?.(safe)\r\n readerRef.current?.setFontSize(safe)\r\n },\r\n [controlledFontSize, onFontSizeChange],\r\n )\r\n\r\n const closeDrawers = useCallback(() => {\r\n setTocOpen(false)\r\n setSearchOpen(false)\r\n }, [])\r\n\r\n const handleOpenFile = useCallback(\r\n async (nextFile: File) => {\r\n const reader = readerRef.current\r\n if (!reader) return\r\n\r\n setStatus('opening')\r\n setErrorText('')\r\n setToc([])\r\n setProgressInfo(null)\r\n setIsSeeking(false)\r\n setSeekPercent(0)\r\n setSearch((prev) => ({ ...prev, results: [], progressPercent: 0, searching: false }))\r\n\r\n try {\r\n await reader.open(nextFile)\r\n setStatus('ready')\r\n } catch (e: any) {\r\n setStatus('error')\r\n setErrorText(e?.message ? String(e.message) : '打开失败')\r\n onError?.(e)\r\n }\r\n },\r\n [onError],\r\n )\r\n\r\n const runSearch = useCallback(\r\n async (query: string) => {\r\n const reader = readerRef.current\r\n const normalized = query.trim()\r\n\r\n setSearch((prev) => ({\r\n ...prev,\r\n query,\r\n results: normalized ? prev.results : [],\r\n progressPercent: 0,\r\n searching: Boolean(normalized),\r\n }))\r\n\r\n if (!reader || !normalized) {\r\n reader?.clearSearch()\r\n return\r\n }\r\n\r\n reader.cancelSearch()\r\n try {\r\n const results = await reader.search(normalized, search.options)\r\n setSearch((prev) => ({ ...prev, results, searching: false, progressPercent: 100 }))\r\n } catch (e) {\r\n setSearch((prev) => ({ ...prev, searching: false }))\r\n onError?.(e)\r\n }\r\n },\r\n [onError, search.options],\r\n )\r\n\r\n // 初始化阅读器 Core\r\n useEffect(() => {\r\n const host = viewerHostRef.current\r\n if (!host) return\r\n\r\n try {\r\n const reader = createEBookReader(host, {\r\n darkMode,\r\n fontSize,\r\n onReady: (h) => onReady?.(h),\r\n onError: (e) => onError?.(e),\r\n onProgress: (info) => {\r\n setProgressInfo(info)\r\n onProgress?.(info)\r\n },\r\n onToc: (items) => setToc(items),\r\n onSearchProgress: (info) => {\r\n const p = info.progress\r\n if (typeof p === 'number') setSearch((prev) => ({ ...prev, progressPercent: Math.round(p * 100) }))\r\n },\r\n onContentLoad: (doc) => {\r\n if (boundDocsRef.current.has(doc)) return\r\n boundDocsRef.current.add(doc)\r\n doc.addEventListener('pointerdown', onPointerDown)\r\n doc.addEventListener('pointermove', onPointerMove)\r\n doc.addEventListener('pointerup', onPointerEnd)\r\n doc.addEventListener('pointercancel', onPointerEnd)\r\n },\r\n })\r\n readerRef.current = reader\r\n setStatus('ready')\r\n } catch (e: any) {\r\n setStatus('error')\r\n setErrorText(e?.message ? String(e.message) : '初始化失败')\r\n onError?.(e)\r\n return\r\n }\r\n\r\n return () => {\r\n readerRef.current?.destroy()\r\n readerRef.current = null\r\n }\r\n }, [onError, onProgress, onReady])\r\n\r\n useEffect(() => {\r\n if (!file) return\r\n void handleOpenFile(file)\r\n }, [file, handleOpenFile])\r\n\r\n useEffect(() => {\r\n readerRef.current?.setDarkMode(darkMode)\r\n }, [darkMode])\r\n\r\n useEffect(() => {\r\n readerRef.current?.setFontSize(fontSize)\r\n }, [fontSize])\r\n\r\n // 键盘导航\r\n useEffect(() => {\r\n if (!enableKeyboardNav) return\r\n const root = rootRef.current\r\n if (!root) return\r\n\r\n const handleKeyDown = (e: KeyboardEvent) => {\r\n if (e.key === 'ArrowLeft') readerRef.current?.prevPage()\r\n if (e.key === 'ArrowRight') readerRef.current?.nextPage()\r\n if (e.key === 'Escape') closeDrawers()\r\n }\r\n\r\n root.addEventListener('keydown', handleKeyDown)\r\n return () => {\r\n root.removeEventListener('keydown', handleKeyDown)\r\n }\r\n }, [closeDrawers, enableKeyboardNav])\r\n\r\n useImperativeHandle(\r\n ref,\r\n () => ({\r\n prevPage: () => readerRef.current?.prevPage(),\r\n nextPage: () => readerRef.current?.nextPage(),\r\n prevSection: () => readerRef.current?.prevSection(),\r\n nextSection: () => readerRef.current?.nextSection(),\r\n goTo: (target) => readerRef.current?.goTo(target),\r\n goToFraction: (frac) => readerRef.current?.goToFraction(frac),\r\n search: (q, o) => (readerRef.current ? readerRef.current.search(q, o) : Promise.resolve([])),\r\n cancelSearch: () => readerRef.current?.cancelSearch(),\r\n clearSearch: () => readerRef.current?.clearSearch(),\r\n }),\r\n [],\r\n )\r\n\r\n // 子组件回调 Helpers\r\n const handleSeekStart = useCallback(() => setIsSeeking(true), [])\r\n const handleSeekChange = useCallback((v: number) => setSeekPercent(v), [])\r\n const handleSeekEnd = useCallback((v: number) => {\r\n setIsSeeking(false)\r\n readerRef.current?.goToFraction(v / 100)\r\n }, [])\r\n\r\n const handleTocSelect = useCallback((href?: string) => {\r\n if (href) readerRef.current?.goTo(href)\r\n }, [])\r\n\r\n const handleSearchResultSelect = useCallback((cfi: string) => {\r\n if (cfi) readerRef.current?.goTo(cfi)\r\n }, [])\r\n\r\n return (\r\n <div\r\n ref={rootRef}\r\n className={mergeClassName('ebook-reader', className)}\r\n style={style}\r\n data-theme={darkMode ? 'dark' : 'light'}\r\n data-layout={layout}\r\n tabIndex={0}\r\n >\r\n <div className=\"ebook-reader__viewer\" ref={viewerHostRef} />\r\n\r\n {layout === 'mobile' ? (\r\n <MobileUI\r\n barVisible={mobileBarVisible}\r\n activePanel={mobilePanel}\r\n onTogglePanel={toggleMobilePanel}\r\n onClosePanel={closeMobileSheet}\r\n toc={toc}\r\n search={search}\r\n status={status}\r\n errorText={errorText}\r\n sectionLabel={sectionLabel}\r\n displayedPercent={displayedPercent}\r\n darkMode={darkMode}\r\n fontSize={fontSize}\r\n onTocSelect={handleTocSelect}\r\n onSearch={(q) => void runSearch(q)}\r\n onSearchQueryChange={(v) => setSearch((prev) => ({ ...prev, query: v }))}\r\n onSearchOptionChange={(opt) => setSearch((prev) => ({ ...prev, options: { ...prev.options, ...opt } }))}\r\n onCancelSearch={() => readerRef.current?.cancelSearch()}\r\n onSearchResultSelect={handleSearchResultSelect}\r\n onSeekStart={handleSeekStart}\r\n onSeekChange={handleSeekChange}\r\n onSeekEnd={handleSeekEnd}\r\n onSeekCommit={handleSeekEnd}\r\n onToggleDarkMode={setDarkModeInternal}\r\n onFontSizeChange={setFontSizeInternal}\r\n />\r\n ) : (\r\n <>\r\n <DesktopToolbar\r\n onToggleToc={() => setTocOpen(true)}\r\n onToggleSearch={() => setSearchOpen(true)}\r\n onPrevSection={() => readerRef.current?.prevSection()}\r\n onPrevPage={() => readerRef.current?.prevPage()}\r\n onNextPage={() => readerRef.current?.nextPage()}\r\n onNextSection={() => readerRef.current?.nextSection()}\r\n darkMode={darkMode}\r\n onToggleDarkMode={() => setDarkModeInternal(!darkMode)}\r\n fontSize={fontSize}\r\n onFontSizeChange={setFontSizeInternal}\r\n />\r\n\r\n {(tocOpen || searchOpen) && <div className=\"ebook-reader__overlay\" onClick={closeDrawers} />}\r\n\r\n <TocDrawer\r\n isOpen={tocOpen}\r\n onClose={() => setTocOpen(false)}\r\n toc={toc}\r\n onSelect={handleTocSelect}\r\n />\r\n\r\n <SearchDrawer\r\n isOpen={searchOpen}\r\n onClose={() => setSearchOpen(false)}\r\n status={status}\r\n search={search}\r\n onSearch={(q) => void runSearch(q)}\r\n onQueryChange={(v) => setSearch((prev) => ({ ...prev, query: v }))}\r\n onOptionChange={(opt) => setSearch((prev) => ({ ...prev, options: { ...prev.options, ...opt } }))}\r\n onCancelSearch={() => readerRef.current?.cancelSearch()}\r\n onResultSelect={handleSearchResultSelect}\r\n />\r\n\r\n <DesktopBottomBar\r\n status={status}\r\n errorText={errorText}\r\n sectionLabel={sectionLabel}\r\n displayedPercent={displayedPercent}\r\n onSeekStart={handleSeekStart}\r\n onSeekChange={handleSeekChange}\r\n onSeekEnd={handleSeekEnd}\r\n onSeekCommit={handleSeekEnd}\r\n />\r\n </>\r\n )}\r\n </div>\r\n )\r\n})\r\n"]}
|
package/dist/react.d.cts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { CSSProperties } from 'react';
|
|
3
|
+
import { E as EBookReaderHandle, S as SearchOptions, P as ProgressInfo } from './types-Dc66KVH2.cjs';
|
|
4
|
+
|
|
5
|
+
type EBookReaderReactHandle = Pick<EBookReaderHandle, 'prevPage' | 'nextPage' | 'prevSection' | 'nextSection' | 'goTo' | 'goToFraction' | 'search' | 'cancelSearch' | 'clearSearch'>;
|
|
6
|
+
type EBookReaderReactProps = {
|
|
7
|
+
file?: File | null;
|
|
8
|
+
className?: string;
|
|
9
|
+
style?: CSSProperties;
|
|
10
|
+
defaultFontSize?: number;
|
|
11
|
+
fontSize?: number;
|
|
12
|
+
onFontSizeChange?: (fontSize: number) => void;
|
|
13
|
+
defaultDarkMode?: boolean;
|
|
14
|
+
darkMode?: boolean;
|
|
15
|
+
onDarkModeChange?: (darkMode: boolean) => void;
|
|
16
|
+
enableKeyboardNav?: boolean;
|
|
17
|
+
defaultSearchOptions?: SearchOptions;
|
|
18
|
+
onReady?: (handle: EBookReaderHandle) => void;
|
|
19
|
+
onError?: (error: unknown) => void;
|
|
20
|
+
onProgress?: (info: ProgressInfo) => void;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* EBookReader 组件
|
|
25
|
+
*
|
|
26
|
+
* 核心阅读器组件,负责:
|
|
27
|
+
* 1. 管理核心 Reader 实例 (createEBookReader)
|
|
28
|
+
* 2. 管理 UI 状态 (布局、弹窗、搜索状态等)
|
|
29
|
+
* 3. 分发事件和数据给子组件 (Desktop/Mobile)
|
|
30
|
+
*/
|
|
31
|
+
declare const EBookReader: react.ForwardRefExoticComponent<EBookReaderReactProps & react.RefAttributes<EBookReaderReactHandle>>;
|
|
32
|
+
|
|
33
|
+
export { EBookReader, type EBookReaderReactHandle, type EBookReaderReactProps };
|
package/dist/react.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { CSSProperties } from 'react';
|
|
3
|
+
import { E as EBookReaderHandle, S as SearchOptions, P as ProgressInfo } from './types-Dc66KVH2.js';
|
|
4
|
+
|
|
5
|
+
type EBookReaderReactHandle = Pick<EBookReaderHandle, 'prevPage' | 'nextPage' | 'prevSection' | 'nextSection' | 'goTo' | 'goToFraction' | 'search' | 'cancelSearch' | 'clearSearch'>;
|
|
6
|
+
type EBookReaderReactProps = {
|
|
7
|
+
file?: File | null;
|
|
8
|
+
className?: string;
|
|
9
|
+
style?: CSSProperties;
|
|
10
|
+
defaultFontSize?: number;
|
|
11
|
+
fontSize?: number;
|
|
12
|
+
onFontSizeChange?: (fontSize: number) => void;
|
|
13
|
+
defaultDarkMode?: boolean;
|
|
14
|
+
darkMode?: boolean;
|
|
15
|
+
onDarkModeChange?: (darkMode: boolean) => void;
|
|
16
|
+
enableKeyboardNav?: boolean;
|
|
17
|
+
defaultSearchOptions?: SearchOptions;
|
|
18
|
+
onReady?: (handle: EBookReaderHandle) => void;
|
|
19
|
+
onError?: (error: unknown) => void;
|
|
20
|
+
onProgress?: (info: ProgressInfo) => void;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* EBookReader 组件
|
|
25
|
+
*
|
|
26
|
+
* 核心阅读器组件,负责:
|
|
27
|
+
* 1. 管理核心 Reader 实例 (createEBookReader)
|
|
28
|
+
* 2. 管理 UI 状态 (布局、弹窗、搜索状态等)
|
|
29
|
+
* 3. 分发事件和数据给子组件 (Desktop/Mobile)
|
|
30
|
+
*/
|
|
31
|
+
declare const EBookReader: react.ForwardRefExoticComponent<EBookReaderReactProps & react.RefAttributes<EBookReaderReactHandle>>;
|
|
32
|
+
|
|
33
|
+
export { EBookReader, type EBookReaderReactHandle, type EBookReaderReactProps };
|