@kano/stem-daw 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 +253 -0
- package/dist/chat-actions-54Z6URC4.js +7 -0
- package/dist/chat-actions-54Z6URC4.js.map +1 -0
- package/dist/chunk-56PWIP7O.js +1029 -0
- package/dist/chunk-56PWIP7O.js.map +1 -0
- package/dist/chunk-AAVC7KUW.js +145 -0
- package/dist/chunk-AAVC7KUW.js.map +1 -0
- package/dist/chunk-KCOOE2OP.js +1764 -0
- package/dist/chunk-KCOOE2OP.js.map +1 -0
- package/dist/chunk-LO74ZJ4H.js +23923 -0
- package/dist/chunk-LO74ZJ4H.js.map +1 -0
- package/dist/chunk-OFGZURP6.js +247 -0
- package/dist/chunk-OFGZURP6.js.map +1 -0
- package/dist/chunk-OYNES5W3.js +3085 -0
- package/dist/chunk-OYNES5W3.js.map +1 -0
- package/dist/chunk-QQ5NZTHT.js +336 -0
- package/dist/chunk-QQ5NZTHT.js.map +1 -0
- package/dist/chunk-TBXCZFAY.js +13713 -0
- package/dist/chunk-TBXCZFAY.js.map +1 -0
- package/dist/chunk-U44X6QP5.js +281 -0
- package/dist/chunk-U44X6QP5.js.map +1 -0
- package/dist/chunk-UKMELGZL.js +27 -0
- package/dist/chunk-UKMELGZL.js.map +1 -0
- package/dist/components/DAWView.d.ts +19 -0
- package/dist/components/DAWView.js +11 -0
- package/dist/components/DAWView.js.map +1 -0
- package/dist/daw-controller-BjRWcTol.d.ts +339 -0
- package/dist/engine/daw-controller.d.ts +3 -0
- package/dist/engine/daw-controller.js +5 -0
- package/dist/engine/daw-controller.js.map +1 -0
- package/dist/engine/daw-import-stem-fm-config.d.ts +224 -0
- package/dist/engine/daw-import-stem-fm-config.js +7 -0
- package/dist/engine/daw-import-stem-fm-config.js.map +1 -0
- package/dist/fetchStationTracks-SKFT4V3U.js +3 -0
- package/dist/fetchStationTracks-SKFT4V3U.js.map +1 -0
- package/dist/index.d.ts +308 -0
- package/dist/index.js +332 -0
- package/dist/index.js.map +1 -0
- package/dist/interface-DaRj7RkY.d.ts +66 -0
- package/dist/interfaces-5ZlG0Y4Y.d.ts +549 -0
- package/dist/media-session-XTP6PP7Q.js +3 -0
- package/dist/media-session-XTP6PP7Q.js.map +1 -0
- package/dist/note-detection-PPLM7R2H.js +148 -0
- package/dist/note-detection-PPLM7R2H.js.map +1 -0
- package/dist/sampler-audio-B7MBG3YN.js +3 -0
- package/dist/sampler-audio-B7MBG3YN.js.map +1 -0
- package/dist/sampler-store-QPHANXYP.js +3 -0
- package/dist/sampler-store-QPHANXYP.js.map +1 -0
- package/dist/services/track-search-api.d.ts +152 -0
- package/dist/services/track-search-api.js +4 -0
- package/dist/services/track-search-api.js.map +1 -0
- package/dist/store/daw-auth-store.d.ts +31 -0
- package/dist/store/daw-auth-store.js +3 -0
- package/dist/store/daw-auth-store.js.map +1 -0
- package/dist/store/daw-session-store.d.ts +255 -0
- package/dist/store/daw-session-store.js +3 -0
- package/dist/store/daw-session-store.js.map +1 -0
- package/dist/vite/index.d.ts +46 -0
- package/dist/vite/index.js +94 -0
- package/dist/vite/index.js.map +1 -0
- package/dist/workers/analysis-worker.js +379 -0
- package/dist/workers/buffer-player-processor-202602.lavv8e32-ts.js +1 -0
- package/dist/workers/daw-stem-processor.js +228 -0
- package/dist/workers/manifest.json +10 -0
- package/dist/workers/phase-vocoder3.js +920 -0
- package/dist/workers/realtime-pitch-shift-processor.js +2 -0
- package/package.json +151 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/daw/interfaces.ts","../src/daw/primitives/bar-utils.ts","../src/daw/primitives/tempo-utils.ts","../src/daw/engine/daw-cache.ts","../src/daw/store/daw-session-store.ts"],"names":["i","PitchShiftStrategy","tx","SAMPLE_RATE","uuid","state"],"mappings":";;;;;;AAwBO,IAAM,sBAA8C,GAAA;AAAA,EACvD,aAAe,EAAA,SAAA;AAAA,EACf,WAAa,EAAA,iBAAA;AAAA,EACb,YAAc,EAAA,QAAA;AAAA,EACd,YAAc,EAAA,EAAA;AAClB,EAAA;AAWa,IAAA,SAAA,GAAY,CAAC,CAAsB,KAAA,CAAA,EAAG,EAAE,OAAO,CAAA,CAAA,EAAI,EAAE,SAAS,CAAA,EAAA;AAgBpE,SAAS,uBAAuB,UAK9B,EAAA;AACL,EAAI,IAAA,UAAA,CAAW,MAAW,KAAA,CAAA,EAAU,OAAA,IAAA,CAAA;AACpC,EAAM,MAAA,OAAA,GAAU,UAAW,CAAA,CAAC,CAAE,CAAA,OAAA,CAAA;AAC9B,EAAA,IAAI,QAAW,GAAA,QAAA,CAAA;AACf,EAAA,IAAI,MAAS,GAAA,CAAA,QAAA,CAAA;AACb,EAAM,MAAA,WAAA,uBAAkB,GAAY,EAAA,CAAA;AACpC,EAAA,KAAA,MAAW,KAAK,UAAY,EAAA;AACxB,IAAA,IAAI,CAAE,CAAA,QAAA,GAAW,QAAU,EAAA,QAAA,GAAW,CAAE,CAAA,QAAA,CAAA;AACxC,IAAA,IAAI,CAAE,CAAA,MAAA,GAAS,MAAQ,EAAA,MAAA,GAAS,CAAE,CAAA,MAAA,CAAA;AAClC,IAAY,WAAA,CAAA,GAAA,CAAI,EAAE,SAAS,CAAA,CAAA;AAAA,GAC/B;AACA,EAAA,OAAO,EAAE,OAAA,EAAS,QAAU,EAAA,MAAA,EAAQ,aAAa,KAAM,CAAA,IAAA,CAAK,WAAW,CAAA,CAAE,KAAK,CAAC,CAAA,EAAG,CAAM,KAAA,CAAA,GAAI,CAAC,CAAE,EAAA,CAAA;AACnG,CAAA;AAEa,IAAA,cAAA,GAAiB,CAAC,GAA+B,KAAA;AAC1D,EAAA,MAAM,CAAC,OAAS,EAAA,GAAG,CAAI,GAAA,GAAA,CAAI,MAAM,GAAG,CAAA,CAAA;AACpC,EAAM,MAAA,SAAA,GAAY,QAAS,CAAA,GAAA,EAAK,EAAE,CAAA,CAAA;AAClC,EAAO,OAAA,OAAA,IAAW,CAAC,KAAM,CAAA,SAAS,IAAI,EAAE,OAAA,EAAS,WAAc,GAAA,IAAA,CAAA;AACnE,EAAA;AA8CO,IAAM,WAAwB,GAAA;AAAA,EACjC,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AAAA,EACA,SAAA;AAAA;AACJ,EAAA;AAIO,IAAM,kBAA+B,GAAA;AAAA,EACxC,WAAA;AAAA,EAAM,WAAA;AAAA,EAAM,WAAA;AAAA,EAAM,QAAA;AAAA,EAAK,QAAA;AAAA,EAAK,WAAA;AAAA,EAAM,WAAA;AAAA,EAAM,QAAA;AAAA,EAAK,WAAA;AAAA,EAAM,WAAA;AACvD,EAAA;AA6IO,SAAS,aAAa,EAA4B,EAAA;AACrD,EAAA,MAAM,QAAoB,EAAC,CAAA;AAC3B,EAAA,MAAM,MAAS,GAAA,CAAC,GAAG,EAAA,CAAG,WAAW,CAAA,CAAE,IAAK,CAAA,CAAC,CAAG,EAAA,CAAA,KAAM,CAAE,CAAA,QAAA,GAAW,EAAE,QAAQ,CAAA,CAAA;AACzE,EAAM,MAAA,MAAA,GAAA,CAAU,GAAG,WAAe,IAAA,IAC7B,MAAO,CAAA,CAAC,MAAM,CAAI,GAAA,EAAA,CAAG,gBAAgB,CAAI,GAAA,EAAA,CAAG,UAAU,CACtD,CAAA,IAAA,CAAK,CAAC,CAAG,EAAA,CAAA,KAAM,IAAI,CAAC,CAAA,CAAA;AACzB,EAAA,IAAI,SAAS,EAAG,CAAA,YAAA,CAAA;AAMhB,EAAA,MAAM,SAAY,GAAA,CAAC,EAAY,EAAA,EAAA,EAAY,UAAoB,SAAwB,KAAA;AACnF,IAAA,IAAI,MAAM,EAAI,EAAA,OAAA;AACd,IAAA,IAAI,QAAW,GAAA,EAAA,CAAA;AACf,IAAA,IAAI,WAAwB,GAAA,QAAA,CAAA;AAC5B,IAAA,KAAA,MAAW,MAAM,MAAQ,EAAA;AACrB,MAAA,IAAI,MAAM,QAAU,EAAA,SAAA;AACpB,MAAA,IAAI,MAAM,EAAI,EAAA,MAAA;AACd,MAAA,KAAA,CAAM,IAAK,CAAA;AAAA,QACP,cAAgB,EAAA,QAAA;AAAA,QAChB,YAAc,EAAA,EAAA;AAAA,QACd,WAAA,EAAa,GAAG,gBAAmB,GAAA,QAAA;AAAA,QACnC,QAAU,EAAA,WAAA;AAAA,QACV,SAAW,EAAA,OAAA;AAAA,OACd,CAAA,CAAA;AACD,MAAW,QAAA,GAAA,EAAA,CAAA;AACX,MAAc,WAAA,GAAA,OAAA,CAAA;AAAA,KAClB;AACA,IAAA,IAAI,WAAW,EAAI,EAAA;AACf,MAAA,KAAA,CAAM,IAAK,CAAA;AAAA,QACP,cAAgB,EAAA,QAAA;AAAA,QAChB,YAAc,EAAA,EAAA;AAAA,QACd,WAAA,EAAa,GAAG,gBAAmB,GAAA,QAAA;AAAA,QACnC,QAAU,EAAA,WAAA;AAAA,QACV,SAAA;AAAA,OACH,CAAA,CAAA;AAAA,KACL;AAAA,GACJ,CAAA;AAEA,EAAA,KAAA,MAAW,MAAM,MAAQ,EAAA;AACrB,IAAA,MAAM,YAAY,IAAK,CAAA,GAAA,CAAI,EAAG,CAAA,QAAA,EAAU,GAAG,YAAY,CAAA,CAAA;AACvD,IAAA,MAAM,UAAU,IAAK,CAAA,GAAA,CAAI,EAAG,CAAA,MAAA,EAAQ,GAAG,UAAU,CAAA,CAAA;AACjD,IAAA,IAAI,aAAa,OAAS,EAAA,SAAA;AAC1B,IAAA,IAAI,SAAS,SAAW,EAAA;AAGpB,MAAA,MAAM,QAAqB,GAAA,MAAA,KAAW,EAAG,CAAA,YAAA,GAAe,MAAS,GAAA,MAAA,CAAA;AACjE,MAAU,SAAA,CAAA,MAAA,EAAQ,SAAW,EAAA,QAAA,EAAU,MAAM,CAAA,CAAA;AAAA,KACjD;AACA,IAAS,MAAA,GAAA,IAAA,CAAK,GAAI,CAAA,MAAA,EAAQ,OAAO,CAAA,CAAA;AAAA,GACrC;AACA,EAAI,IAAA,MAAA,GAAS,GAAG,UAAY,EAAA;AACxB,IAAA,MAAM,QAAqB,GAAA,MAAA,KAAW,EAAG,CAAA,YAAA,GAAe,MAAS,GAAA,MAAA,CAAA;AACjE,IAAA,SAAA,CAAU,MAAQ,EAAA,EAAA,CAAG,UAAY,EAAA,QAAA,EAAU,MAAM,CAAA,CAAA;AAAA,GACrD;AAEA,EAAO,OAAA,KAAA,CAAA;AACX,CAAA;AAsHO,IAAM,YAAe,GAAA;AAAA,EACxB,KAAO,EAAA,CAAA;AAAA,EACP,GAAK,EAAA,CAAA;AAAA,EACL,KAAO,EAAA,CAAA;AAAA,EACP,KAAO,EAAA,CAAA;AAAA,EACP,KAAO,EAAA,CAAA;AAAA,EACP,MAAQ,EAAA,CAAA;AAAA,EACR,IAAM,EAAA,CAAA;AAAA,EACN,IAAM,EAAA,CAAA;AAAA,EACN,KAAO,EAAA,CAAA;AAAA,EACP,MAAQ,EAAA,CAAA;AACZ,EAAA;AAIO,IAAM,cAAyC,GAAA;AAAA,EAClD,CAAC,YAAa,CAAA,KAAK,GAAG,OAAA;AAAA,EACtB,CAAC,YAAa,CAAA,GAAG,GAAG,KAAA;AAAA,EACpB,CAAC,YAAa,CAAA,KAAK,GAAG,OAAA;AAAA,EACtB,CAAC,YAAa,CAAA,KAAK,GAAG,OAAA;AAAA,EACtB,CAAC,YAAa,CAAA,KAAK,GAAG,OAAA;AAAA,EACtB,CAAC,YAAa,CAAA,MAAM,GAAG,QAAA;AAAA,EACvB,CAAC,YAAa,CAAA,IAAI,GAAG,MAAA;AAAA,EACrB,CAAC,YAAa,CAAA,IAAI,GAAG,MAAA;AAAA,EACrB,CAAC,YAAa,CAAA,KAAK,GAAG,OAAA;AAAA,EACtB,CAAC,YAAa,CAAA,MAAM,GAAG,QAAA;AAC3B,EAAA;AAEO,IAAM,cAAyC,GAAA;AAAA,EAClD,CAAC,YAAa,CAAA,KAAK,GAAG,SAAA;AAAA,EACtB,CAAC,YAAa,CAAA,GAAG,GAAG,SAAA;AAAA,EACpB,CAAC,YAAa,CAAA,KAAK,GAAG,SAAA;AAAA,EACtB,CAAC,YAAa,CAAA,KAAK,GAAG,SAAA;AAAA,EACtB,CAAC,YAAa,CAAA,KAAK,GAAG,SAAA;AAAA,EACtB,CAAC,YAAa,CAAA,MAAM,GAAG,SAAA;AAAA,EACvB,CAAC,YAAa,CAAA,IAAI,GAAG,SAAA;AAAA,EACrB,CAAC,YAAa,CAAA,IAAI,GAAG,SAAA;AAAA,EACrB,CAAC,YAAa,CAAA,KAAK,GAAG,SAAA;AAAA,EACtB,CAAC,YAAa,CAAA,MAAM,GAAG,SAAA;AAC3B,EAAA;AAkBO,IAAM,WAAwB,GAAA,CAAC,OAAS,EAAA,QAAA,EAAU,QAAQ,OAAO,EAAA;AACjE,IAAM,UAA0B,GAAA,CAAC,SAAW,EAAA,UAAA,EAAY,UAAU,SAAS,EAAA;AAE3E,IAAM,WAAwB,GAAA,CAAC,SAAW,EAAA,SAAA,EAAW,WAAW,SAAS,EAAA;AACzE,IAAM,gBAA6B,GAAA,CAAC,OAAS,EAAA,QAAA,EAAU,QAAQ,OAAO,EAAA;AAEtE,IAAM,qBAAwB,GAAA,CACjC,gBAAmB,GAAA,CAAA,EACnB,YAAe,GAAA,CAAA,EACf,UAAa,GAAA,CAAA,KAEb,UAAW,CAAA,GAAA,CAAI,CAAC,QAAA,EAAU,CAAO,MAAA;AAAA,EAC7B,SAAW,EAAA,CAAA;AAAA,EACX,QAAA;AAAA,EACA,KAAA,EAAO,YAAY,CAAC,CAAA;AAAA,EACpB,MAAQ,EAAA,CAAA;AAAA,EACR,KAAO,EAAA,KAAA;AAAA,EACP,MAAQ,EAAA,KAAA;AAAA,EACR,OAAS,EAAA,IAAA;AAAA,EACT,gBAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAa,EAAC;AAClB,CAAE,CAAA,EAAA;AAcC,SAAS,qBAAA,CACZ,aACA,UACc,EAAA;AACd,EAAA,IAAI,CAAC,WAAa,EAAA,MAAA,IAAU,CAAC,UAAY,EAAA,MAAA,SAAe,EAAC,CAAA;AACzD,EAAA,MAAM,gBAAgB,UAAW,CAAA,GAAA,CAAI,CAAC,CAAM,KAAA,CAAA,CAAE,cAAc,IAAK,CAAA,CAAA;AACjE,EAAA,MAAM,WAA2B,EAAC,CAAA;AAElC,EAAA,KAAA,MAAW,CAAC,SAAA,EAAW,OAAS,EAAA,OAAO,KAAK,WAAa,EAAA;AACrD,IAAA,IAAI,QAAW,GAAA,CAAA,CAAA;AACf,IAAA,IAAI,SAAS,UAAW,CAAA,MAAA,CAAA;AACxB,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,aAAA,CAAc,QAAQ,CAAK,EAAA,EAAA;AAC3C,MAAA,IAAI,aAAc,CAAA,CAAC,CAAK,IAAA,SAAA,GAAY,MAAiB,QAAA,GAAA,CAAA,CAAA;AAAA,KACzD;AACA,IAAA,KAAA,IAAS,IAAI,aAAc,CAAA,MAAA,GAAS,CAAG,EAAA,CAAA,IAAK,GAAG,CAAK,EAAA,EAAA;AAChD,MAAA,IAAI,aAAc,CAAA,CAAC,CAAK,IAAA,OAAA,GAAU,IAAM,EAAA;AAAE,QAAS,MAAA,GAAA,CAAA,CAAA;AAAG,QAAA,MAAA;AAAA,OAAO;AAAA,KACjE;AACA,IAAI,IAAA,MAAA,IAAU,QAAU,EAAA,MAAA,GAAS,QAAW,GAAA,CAAA,CAAA;AAC5C,IAAA,QAAA,CAAS,IAAK,CAAA;AAAA,MACV,IAAM,EAAA,OAAA;AAAA,MACN,KAAO,EAAA,cAAA,CAAe,OAAO,CAAA,IAAK,IAAI,OAAO,CAAA,CAAA;AAAA,MAC7C,QAAA;AAAA,MACA,MAAA;AAAA,KACH,CAAA,CAAA;AAAA,GACL;AACA,EAAO,OAAA,QAAA,CAAA;AACX,CAAA;AAGO,SAAS,sBAAA,CACZ,QACA,EAAA,cAAA,GAA2B,CAAC,YAAA,CAAa,QAAQ,YAAa,CAAA,KAAA,EAAO,YAAa,CAAA,MAAM,CACrE,EAAA;AACnB,EAAA,KAAA,MAAW,KAAK,cAAgB,EAAA;AAC5B,IAAA,MAAM,QAAQ,QAAS,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,SAAS,CAAC,CAAA,CAAA;AAC/C,IAAA,IAAI,OAAc,OAAA,KAAA,CAAA;AAAA,GACtB;AACA,EAAA,OAAO,QAAS,CAAA,MAAA,GAAS,CAAI,GAAA,QAAA,CAAS,CAAC,CAAI,GAAA,IAAA,CAAA;AAC/C,CAAA;;;AC3jBA,IAAM,WAAc,GAAA,IAAA,CAAA;AAoBb,SAAS,WAAA,CAAY,KAAa,UAAmC,EAAA;AACxE,EAAI,IAAA,UAAA,CAAW,MAAW,KAAA,CAAA,EAAU,OAAA,CAAA,CAAA;AACpC,EAAM,MAAA,QAAA,GAAW,IAAK,CAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AAC/B,EAAA,MAAM,OAAO,GAAM,GAAA,QAAA,CAAA;AACnB,EAAI,IAAA,QAAA,IAAY,WAAW,MAAQ,EAAA;AAC/B,IAAA,MAAM,IAAO,GAAA,UAAA,CAAW,UAAW,CAAA,MAAA,GAAS,CAAC,CAAA,CAAA;AAC7C,IAAO,OAAA,IAAA,CAAK,cAAc,IAAK,CAAA,QAAA,CAAA;AAAA,GACnC;AACA,EAAA,MAAM,QAAQ,UAAW,CAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,QAAQ,CAAC,CAAA,CAAA;AAC9C,EAAA,OAAO,KAAK,KAAM,CAAA,KAAA,CAAM,WAAc,GAAA,IAAA,GAAO,MAAM,QAAQ,CAAA,CAAA;AAC/D,CAAA;AAEA,IAAM,eAAA,GAAkB,CAAC,SAAsC,KAAA;AAC3D,EAAA,MAAM,OAAsB,EAAC,CAAA;AAC7B,EAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,SAAU,CAAA,MAAA,GAAS,GAAG,CAAK,EAAA,EAAA;AAC3C,IAAM,MAAA,OAAA,GAAU,UAAU,CAAC,CAAA,CAAA;AAC3B,IAAM,MAAA,IAAA,GAAO,SAAU,CAAA,CAAA,GAAI,CAAC,CAAA,CAAA;AAC5B,IAAA,IAAA,CAAK,IAAK,CAAA;AAAA,MACN,aAAa,OAAQ,CAAA,KAAA;AAAA,MACrB,SAAA,EAAW,KAAK,KAAQ,GAAA,CAAA;AAAA,MACxB,QAAA,EAAU,IAAK,CAAA,KAAA,GAAQ,OAAQ,CAAA,KAAA;AAAA,KAClC,CAAA,CAAA;AAAA,GACL;AACA,EAAO,OAAA,IAAA,CAAA;AACX,CAAA,CAAA;AAEa,IAAA,oBAAA,GAAuB,CAAC,KAAkC,KAAA;AACnE,EAAA,MAAM,YAAY,KAAM,CAAA,MAAA,CAAO,CAAC,CAAM,KAAA,CAAA,CAAE,WAAW,CAAC,CAAA,CAAA;AACpD,EAAA,OAAO,gBAAgB,SAAS,CAAA,CAAA;AACpC,EAAA;AAEA,IAAM,kBAAkB,CACpB,SAAA,EACA,UAAqB,GAAA,WAAA,EACrB,YAAoB,IACV,KAAA;AACV,EAAA,MAAM,IAAI,SAAU,CAAA,MAAA,CAAA;AACpB,EAAA,IAAI,oBAA6B,EAAC,CAAA;AAClC,EAAA,IAAI,CAAI,GAAA,CAAA,CAAA;AAER,EAAA,OAAO,IAAI,CAAG,EAAA;AACV,IAAA,MAAM,YAAe,GAAA,CAAA,CAAA;AACrB,IAAA,IAAI,2BAAoC,EAAC,CAAA;AACzC,IAAA,IAAI,YAAe,GAAA,CAAA,CAAA;AAEnB,IAAA,wBAAA,CAAyB,IAAK,CAAA;AAAA,MAC1B,KAAA,EAAO,SAAU,CAAA,CAAC,CAAE,CAAA,KAAA;AAAA,MACpB,MAAA,EAAQ,SAAU,CAAA,CAAC,CAAE,CAAA,MAAA;AAAA,MACrB,SAAW,EAAA,SAAA,CAAU,CAAC,CAAA,CAAE,KAAQ,GAAA,UAAA;AAAA,KACnC,CAAA,CAAA;AAED,IAAA,IAAI,IAAI,CAAI,GAAA,CAAA,CAAA;AACZ,IAAA,OAAO,KAAK,CAAG,EAAA;AACX,MAAA,MAAM,SAAY,GAAA,SAAA,CACb,KAAM,CAAA,YAAA,EAAc,CAAC,CACrB,CAAA,GAAA;AAAA,QAAI,CAAC,CAAA,EAAG,GAAK,EAAA,GAAA,KACV,MAAM,CAAI,GAAA,GAAA,CAAI,GAAG,CAAA,CAAE,KAAQ,GAAA,GAAA,CAAI,GAAM,GAAA,CAAC,EAAE,KAAQ,GAAA,IAAA;AAAA,OACpD,CACC,MAAM,CAAC,CAAA,CAAA;AAEZ,MAAI,IAAA,SAAA,CAAU,SAAS,CAAG,EAAA;AACtB,QAAA,YAAA,GAAe,IAAK,CAAA,KAAA;AAAA,UAChB,SAAU,CAAA,MAAA,CAAO,CAACA,EAAAA,KAAmBA,OAAM,IAAI,CAAA,CAAE,MAAO,CAAA,CAAC,CAAG,EAAA,CAAA,KAAM,CAAI,GAAA,CAAC,IACnE,SAAU,CAAA,MAAA;AAAA,SAClB,CAAA;AAAA,OACJ;AAEA,MAAA,MAAM,iBAA2B,EAAC,CAAA;AAClC,MAAA,KAAA,IAAS,GAAM,GAAA,CAAA,EAAG,GAAM,GAAA,CAAA,GAAI,cAAc,GAAO,EAAA,EAAA;AAC7C,QAAA,cAAA,CAAe,KAAK,SAAU,CAAA,YAAY,CAAE,CAAA,KAAA,GAAQ,eAAe,GAAG,CAAA,CAAA;AAAA,OAC1E;AAEA,MAAA,IAAI,yBAA4B,GAAA,IAAA,CAAA;AAChC,MAAA,KAAA,IAAS,GAAM,GAAA,CAAA,EAAG,GAAM,GAAA,cAAA,CAAe,QAAQ,GAAO,EAAA,EAAA;AAClD,QAAM,MAAA,SAAA,GAAY,IAAK,CAAA,GAAA,CAAI,cAAe,CAAA,GAAG,IAAI,SAAU,CAAA,YAAA,GAAe,GAAG,CAAA,CAAE,KAAK,CAAA,CAAA;AACpF,QAAA,IAAI,YAAY,SAAW,EAAA;AACvB,UAA4B,yBAAA,GAAA,KAAA,CAAA;AAC5B,UAAA,MAAA;AAAA,SACJ;AAAA,OACJ;AAEA,MAAA,IAAI,yBAA2B,EAAA;AAC3B,QAAA,wBAAA,GAA2B,cAAe,CAAA,GAAA,CAAI,CAAC,EAAA,EAAI,GAAS,MAAA;AAAA,UACxD,KAAO,EAAA,EAAA;AAAA,UACP,MAAQ,EAAA,SAAA,CAAU,YAAe,GAAA,GAAG,CAAE,CAAA,MAAA;AAAA,UACtC,WAAW,EAAK,GAAA,UAAA;AAAA,SAClB,CAAA,CAAA,CAAA;AACF,QAAA,CAAA,EAAA,CAAA;AAAA,OACG,MAAA;AACH,QAAA,MAAA;AAAA,OACJ;AAAA,KACJ;AAEA,IAAoB,iBAAA,GAAA,iBAAA,CAAkB,OAAO,wBAAwB,CAAA,CAAA;AACrE,IAAA,CAAA,GAAI,eAAe,wBAAyB,CAAA,MAAA,CAAA;AAAA,GAChD;AAEA,EAAO,OAAA,iBAAA,CAAA;AACX,CAAA,CAAA;AAEO,IAAM,+BAA+B,CACxC,KAAA,EACA,UAAqB,GAAA,WAAA,EACrB,YAAoB,IACJ,KAAA;AAChB,EAAA,MAAM,YAAY,KAAM,CAAA,MAAA,CAAO,CAAC,CAAM,KAAA,CAAA,CAAE,WAAW,CAAC,CAAA,CAAA;AACpD,EAAA,MAAM,QAAW,GAAA,eAAA,CAAgB,SAAW,EAAA,UAAA,EAAY,SAAS,CAAA,CAAA;AACjE,EAAA,OAAO,gBAAgB,QAAQ,CAAA,CAAA;AACnC,EAAA;AAEa,IAAA,iCAAA,GAAoC,CAC7C,KAAA,EACA,QACS,KAAA;AACT,EAAM,MAAA,IAAA,GAAO,MAAM,QAAQ,CAAA,CAAA;AAC3B,EAAO,OAAA,IAAA,GAAO,KAAK,SAAY,GAAA,CAAA,CAAA,CAAA;AACnC,EAAA;AAEa,IAAA,sCAAA,GAAyC,CAClD,KAAA,EACA,QACS,KAAA;AACT,EAAM,MAAA,IAAA,GAAO,MAAM,QAAQ,CAAA,CAAA;AAC3B,EAAA,OAAO,OAAO,IAAK,CAAA,KAAA,CAAM,IAAK,CAAA,SAAA,GAAY,WAAW,CAAI,GAAA,CAAA,CAAA,CAAA;AAC7D,EAAA;AAKa,IAAA,iBAAA,GAAoB,CAAC,IAAgC,KAAA;AAC9D,EAAI,IAAA,IAAA,CAAK,MAAW,KAAA,CAAA,EAAU,OAAA,CAAA,CAAA;AAC9B,EAAA,MAAM,SAAY,GAAA,IAAA,CAAK,GAAI,CAAA,CAAC,CAAM,KAAA,CAAA,CAAE,QAAQ,CAAA,CAAE,IAAK,CAAA,CAAC,CAAG,EAAA,CAAA,KAAM,IAAI,CAAC,CAAA,CAAA;AAClE,EAAA,MAAM,GAAM,GAAA,IAAA,CAAK,KAAM,CAAA,SAAA,CAAU,SAAS,CAAC,CAAA,CAAA;AAC3C,EAAA,OAAO,SAAU,CAAA,MAAA,GAAS,CAAM,KAAA,CAAA,GAC1B,SAAU,CAAA,GAAG,CACZ,GAAA,CAAA,SAAA,CAAU,GAAM,GAAA,CAAC,CAAI,GAAA,SAAA,CAAU,GAAG,CAAK,IAAA,CAAA,CAAA;AAClD,EAAA;AAKa,IAAA,gBAAA,GAAmB,CAAC,kBAAuC,KAAA;AACpE,EAAI,IAAA,kBAAA,IAAsB,GAAU,OAAA,CAAA,CAAA;AACpC,EAAA,MAAM,qBAAqB,kBAAqB,GAAA,WAAA,CAAA;AAChD,EAAA,MAAM,WAAc,GAAA,CAAA,CAAA;AACpB,EAAA,OAAQ,cAAc,EAAM,GAAA,kBAAA,CAAA;AAChC,EAAA;AAKa,IAAA,gBAAA,GAAmB,CAAC,GAAwB,KAAA;AACrD,EAAI,IAAA,GAAA,IAAO,GAAU,OAAA,CAAA,CAAA;AACrB,EAAA,MAAM,WAAc,GAAA,CAAA,CAAA;AACpB,EAAM,MAAA,kBAAA,GAAsB,cAAc,EAAM,GAAA,GAAA,CAAA;AAChD,EAAO,OAAA,IAAA,CAAK,KAAM,CAAA,kBAAA,GAAqB,WAAW,CAAA,CAAA;AACtD,EAAA;;;AC9Ka,IAAA,mBAAA,GAAsB,CAC/B,eAAA,EACA,cACc,KAAA;AACd,EAAA,MAAM,eAA0C,GAAA;AAAA,IAC5C,CAAC,eAAkB,GAAA,CAAA,EAAG,CAAC,CAAA;AAAA,IACvB,CAAC,iBAAiB,CAAC,CAAA;AAAA,IACnB,CAAC,eAAkB,GAAA,CAAA,EAAG,GAAG,CAAA;AAAA,GAC7B,CAAA;AAEA,EAAI,IAAA,UAAA,GAAa,gBAAgB,CAAC,CAAA,CAAA;AAClC,EAAA,IAAI,QAAW,GAAA,IAAA,CAAK,GAAI,CAAA,eAAA,GAAkB,cAAc,CAAA,CAAA;AAExD,EAAA,KAAA,MAAW,aAAa,eAAiB,EAAA;AACrC,IAAA,MAAM,OAAO,IAAK,CAAA,GAAA,CAAI,SAAU,CAAA,CAAC,IAAI,cAAc,CAAA,CAAA;AACnD,IAAA,IAAI,OAAO,QAAU,EAAA;AACjB,MAAW,QAAA,GAAA,IAAA,CAAA;AACX,MAAa,UAAA,GAAA,SAAA,CAAA;AAAA,KACjB;AAAA,GACJ;AAEA,EAAO,OAAA;AAAA,IACH,eAAA,EAAiB,WAAW,CAAC,CAAA;AAAA,IAC7B,YAAA,EAAc,cAAiB,GAAA,UAAA,CAAW,CAAC,CAAA;AAAA,IAC3C,KAAA,EAAO,WAAW,CAAC,CAAA;AAAA,GACvB,CAAA;AACJ,EAAA;AAMO,IAAM,oBAAuB,GAAA,CAChC,kBACA,EAAA,sBAAA,EACA,KACS,KAAA;AACT,EAAA,OAAQ,qBAAqB,KAAS,GAAA,sBAAA,CAAA;AAC1C,EAAA;AAKa,IAAA,uBAAA,GAA0B,CAAC,YAAiC,KAAA;AACrE,EAAO,OAAA,EAAA,GAAK,IAAK,CAAA,IAAA,CAAK,YAAY,CAAA,CAAA;AACtC,EAAA;AAKa,IAAA,sBAAA,GAAyB,CAAC,SAA8B,KAAA;AACjE,EAAA,OAAO,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,SAAA,GAAY,EAAE,CAAA,CAAA;AACrC,EAAA;AAIA,IAAM,cAA4C,GAAA;AAAA,EAC9C,CAAG,EAAA,CAAA;AAAA,EAAG,IAAM,EAAA,CAAA;AAAA,EAAG,CAAG,EAAA,CAAA;AAAA,EAAG,CAAG,EAAA,CAAA;AAAA,EAAG,IAAM,EAAA,CAAA;AAAA,EAAG,CAAG,EAAA,CAAA;AAAA,EACvC,IAAM,EAAA,CAAA;AAAA,EAAG,CAAG,EAAA,CAAA;AAAA,EAAG,CAAG,EAAA,CAAA;AAAA,EAAG,IAAM,EAAA,EAAA;AAAA,EAAI,CAAG,EAAA,EAAA;AAAA,EAAI,IAAM,EAAA,EAAA;AAChD,EAAA;AAEA,IAAM,cAA4C,GAAA,MAAA,CAAO,OAAQ,CAAA,cAAc,CAAE,CAAA,MAAA;AAAA,EAC7E,CAAC,GAAA,EAAK,CAAC,GAAA,EAAK,KAAK,CAAM,KAAA;AACnB,IAAA,GAAA,CAAI,KAAK,CAAI,GAAA,GAAA,CAAA;AACb,IAAO,OAAA,GAAA,CAAA;AAAA,GACX;AAAA,EACA,EAAC;AACL,EAAA;AAEA,IAAM,yBAAA,GAA4B,CAAC,GAAA,EAAgB,QAAqC,KAAA;AACpF,EAAI,IAAA,SAAA,GAAY,eAAe,GAAG,CAAA,CAAA;AAClC,EAAA,IAAI,aAAa,OAAS,EAAA;AACtB,IAAc,SAAA,GAAA,CAAA,SAAA,GAAY,CAAI,GAAA,EAAA,IAAM,EAAO,IAAA,EAAA,CAAA;AAAA,GAC/C;AACA,EAAO,OAAA,SAAA,CAAA;AACX,CAAA,CAAA;AAEY,IAAA,kBAAA,qBAAAC,mBAAL,KAAA;AACH,EAAAA,oBAAA,SAAU,CAAA,GAAA,SAAA,CAAA;AACV,EAAAA,oBAAA,kBAAmB,CAAA,GAAA,kBAAA,CAAA;AACnB,EAAAA,oBAAA,gBAAiB,CAAA,GAAA,gBAAA,CAAA;AACjB,EAAAA,oBAAA,UAAW,CAAA,GAAA,UAAA,CAAA;AACX,EAAAA,oBAAA,cAAe,CAAA,GAAA,cAAA,CAAA;AALP,EAAAA,OAAAA,mBAAAA,CAAAA;AAAA,CAAA,EAAA,kBAAA,IAAA,EAAA,EAAA;AAYC,IAAA,iBAAA,GAAoB,CAC7B,MACA,EAAA,WAAA,EACA,cACA,QACA,EAAA,aAAA,EACA,cACA,EAAA,QAAA,GAA+B,cACtB,wBAAA;AACT,EAAI,IAAA,CAAC,YAAgB,IAAA,CAAC,cAAkB,IAAA,KAAA,CAAM,YAAY,CAAK,IAAA,KAAA,CAAM,cAAc,CAAA,EAAU,OAAA,CAAA,CAAA;AAE7F,EAAM,MAAA,UAAA,GAAa,mBAAoB,CAAA,YAAA,EAAc,cAAc,CAAA,CAAA;AACnE,EAAM,MAAA,uBAAA,GAA0B,uBAAwB,CAAA,UAAA,CAAW,YAAY,CAAA,CAAA;AAE/E,EAAI,IAAA,QAAA,KAAa,2BAAoC,OAAA,CAAA,CAAA;AACrD,EAAI,IAAA,QAAA,KAAa,cAAiC,qBAAA,OAAO,CAAC,uBAAA,CAAA;AAE1D,EAAM,MAAA,gBAAA,GAAmB,yBAA0B,CAAA,MAAA,EAAQ,WAAW,CAAA,CAAA;AACtE,EAAM,MAAA,eAAA,GAAkB,yBAA0B,CAAA,QAAA,EAAU,aAAa,CAAA,CAAA;AAEzE,EAAA,IAAI,aAAa,gBAAmC,uBAAA;AAChD,IAAA,IAAI,QAAQ,gBAAmB,GAAA,eAAA,CAAA;AAC/B,IAAI,IAAA,KAAA,GAAQ,GAAY,KAAA,IAAA,EAAA,CAAA;AACxB,IAAI,IAAA,KAAA,GAAQ,IAAa,KAAA,IAAA,EAAA,CAAA;AACzB,IAAA,OAAO,CAAC,uBAA0B,GAAA,KAAA,CAAA;AAAA,GACtC;AAGA,EAAA,MAAM,WAAgB,GAAA,CAAA,eAAA,GAAkB,uBAA0B,GAAA,EAAA,IAAM,EAAO,IAAA,EAAA,CAAA;AAC/E,EAAA,MAAM,eAAkB,GAAA;AAAA,IACpB,gBAAA;AAAA,IACE,CAAA,gBAAA,GAAmB,KAAK,EAAO,IAAA,EAAA;AAAA,IAC/B,CAAA,gBAAA,GAAmB,CAAI,GAAA,EAAA,IAAM,EAAO,IAAA,EAAA;AAAA,GAC1C,CAAA;AAEA,EAAA,MAAM,MAAS,GAAA,eAAA,CAAgB,GAAI,CAAA,CAAC,KAAU,KAAA;AAC1C,IAAA,IAAI,IAAI,KAAQ,GAAA,WAAA,CAAA;AAChB,IAAI,IAAA,CAAA,GAAI,GAAQ,CAAA,IAAA,EAAA,CAAA;AAChB,IAAI,IAAA,CAAA,GAAI,IAAS,CAAA,IAAA,EAAA,CAAA;AACjB,IAAA,MAAM,WAAc,GAAA,IAAA,CAAK,GAAI,CAAA,CAAA,GAAI,uBAAuB,CAAA,CAAA;AACxD,IAAO,OAAA;AAAA,MACH,KAAO,EAAA,CAAA;AAAA,MACP,cAAgB,EAAA,KAAA,KAAU,gBAAmB,GAAA,WAAA,GAAc,CAAI,GAAA,WAAA;AAAA,KACnE,CAAA;AAAA,GACH,CAAA,CAAA;AAED,EAAA,MAAM,OAAO,MAAO,CAAA,MAAA;AAAA,IAAO,CAAC,IAAM,EAAA,IAAA,KAC9B,KAAK,cAAiB,GAAA,IAAA,CAAK,iBAAiB,IAAO,GAAA,IAAA;AAAA,GACvD,CAAA;AACA,EAAA,OAAO,IAAK,CAAA,KAAA,CAAA;AAChB,EAAA;AAcA,IAAM,WAA0C,GAAA;AAAA,EAC5C,YAAY,EAAE,MAAA,EAAQ,GAAG,MAAQ,EAAA,GAAA,EAAK,OAAO,IAAK,EAAA;AAAA,EAClD,WAAY,EAAE,MAAA,EAAQ,GAAG,MAAQ,EAAA,GAAA,EAAK,OAAO,IAAK,EAAA;AAAA,EAClD,YAAY,EAAE,MAAA,EAAQ,GAAG,MAAQ,EAAA,GAAA,EAAK,OAAO,IAAK,EAAA;AAAA,EAClD,YAAY,EAAE,MAAA,EAAQ,GAAG,MAAQ,EAAA,GAAA,EAAK,OAAO,IAAK,EAAA;AAAA,EAClD,YAAY,EAAE,MAAA,EAAQ,GAAG,MAAQ,EAAA,GAAA,EAAK,OAAO,IAAK,EAAA;AAAA,EAClD,YAAY,EAAE,MAAA,EAAQ,GAAG,MAAQ,EAAA,GAAA,EAAK,OAAO,IAAK,EAAA;AAAA,EAClD,WAAY,EAAE,MAAA,EAAQ,GAAG,MAAQ,EAAA,GAAA,EAAK,OAAO,IAAK,EAAA;AAAA,EAClD,YAAY,EAAE,MAAA,EAAQ,GAAG,MAAQ,EAAA,GAAA,EAAK,OAAO,IAAK,EAAA;AAAA,EAClD,WAAY,EAAE,MAAA,EAAQ,GAAG,MAAQ,EAAA,GAAA,EAAK,OAAO,IAAK,EAAA;AAAA,EAClD,YAAY,EAAE,MAAA,EAAQ,GAAG,MAAQ,EAAA,GAAA,EAAK,OAAO,IAAK,EAAA;AAAA,EAClD,WAAY,EAAE,MAAA,EAAQ,GAAG,MAAQ,EAAA,GAAA,EAAK,OAAO,IAAK,EAAA;AAAA,EAClD,YAAY,EAAE,MAAA,EAAQ,GAAG,MAAQ,EAAA,GAAA,EAAK,OAAO,IAAK,EAAA;AAAA,EAClD,WAAY,EAAE,MAAA,EAAQ,GAAG,MAAQ,EAAA,GAAA,EAAK,OAAO,IAAK,EAAA;AAAA,EAClD,WAAY,EAAE,MAAA,EAAQ,GAAG,MAAQ,EAAA,GAAA,EAAK,OAAO,IAAK,EAAA;AAAA,EAClD,WAAY,EAAE,MAAA,EAAQ,GAAG,MAAQ,EAAA,GAAA,EAAK,OAAO,IAAK,EAAA;AAAA,EAClD,WAAY,EAAE,MAAA,EAAQ,GAAG,MAAQ,EAAA,GAAA,EAAK,OAAO,IAAK,EAAA;AAAA,EAClD,WAAY,EAAE,MAAA,EAAQ,GAAG,MAAQ,EAAA,GAAA,EAAK,OAAO,IAAK,EAAA;AAAA,EAClD,WAAY,EAAE,MAAA,EAAQ,GAAG,MAAQ,EAAA,GAAA,EAAK,OAAO,IAAK,EAAA;AAAA,EAClD,WAAY,EAAE,MAAA,EAAQ,IAAI,MAAQ,EAAA,GAAA,EAAK,OAAO,KAAM,EAAA;AAAA,EACpD,WAAY,EAAE,MAAA,EAAQ,IAAI,MAAQ,EAAA,GAAA,EAAK,OAAO,KAAM,EAAA;AAAA,EACpD,YAAY,EAAE,MAAA,EAAQ,IAAI,MAAQ,EAAA,GAAA,EAAK,OAAO,KAAM,EAAA;AAAA,EACpD,WAAY,EAAE,MAAA,EAAQ,IAAI,MAAQ,EAAA,GAAA,EAAK,OAAO,KAAM,EAAA;AAAA,EACpD,YAAY,EAAE,MAAA,EAAQ,IAAI,MAAQ,EAAA,GAAA,EAAK,OAAO,KAAM,EAAA;AAAA,EACpD,WAAY,EAAE,MAAA,EAAQ,IAAI,MAAQ,EAAA,GAAA,EAAK,OAAO,KAAM,EAAA;AACxD,CAAA,CAAA;AAEA,IAAM,aAAwC,GAAA;AAAA,EAC1C,IAAM,EAAA,IAAA;AAAA,EAAM,IAAM,EAAA,IAAA;AAAA,EAAM,IAAM,EAAA,IAAA;AAAA,EAAM,IAAM,EAAA,IAAA;AAAA,EAAM,IAAM,EAAA,IAAA;AAC1D,CAAA,CAAA;AAEA,IAAM,sBAAA,GAAyB,CAAC,GAA2B,KAAA;AACvD,EAAO,OAAA,aAAA,CAAc,GAAG,CAAK,IAAA,GAAA,CAAA;AACjC,CAAA,CAAA;AAEa,IAAA,SAAA,GAAY,CAAC,GAAA,EAAgB,QAAgD,KAAA;AACtF,EAAM,MAAA,OAAA,GAAU,uBAAuB,GAAG,CAAA,CAAA;AAC1C,EAAA,MAAM,MAAS,GAAA,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,CAAA;AACrC,EAAO,OAAA,WAAA,CAAY,MAAM,CAAK,IAAA,IAAA,CAAA;AAClC,EAAA;AAEA,IAAM,kBAAgF,EAAC,CAAA;AACvF,KAAA,MAAW,CAAC,CAAG,EAAA,CAAC,KAAK,MAAO,CAAA,OAAA,CAAQ,WAAW,CAAG,EAAA;AAC9C,EAAA,MAAM,CAAC,MAAQ,EAAA,QAAQ,CAAI,GAAA,CAAA,CAAE,MAAM,GAAG,CAAA,CAAA;AACtC,EAAA,MAAM,WAAyC,GAAA;AAAA,IAC3C,IAAM,EAAA,IAAA;AAAA,IAAM,IAAM,EAAA,IAAA;AAAA,IAAM,IAAM,EAAA,IAAA;AAAA,IAAM,IAAM,EAAA,IAAA;AAAA,GAC9C,CAAA;AACA,EAAM,MAAA,QAAA,GAAY,WAAY,CAAA,MAAM,CAAK,IAAA,MAAA,CAAA;AACzC,EAAA,eAAA,CAAgB,EAAE,KAAK,CAAA,GAAI,EAAE,GAAA,EAAK,UAAU,QAAqC,EAAA,CAAA;AACrF,CAAA;AAaa,IAAA,gBAAA,GAAmB,CAAC,CAAA,EAAe,CAAoC,KAAA;AAChF,EAAA,MAAM,UAAU,IAAK,CAAA,GAAA,CAAI,CAAE,CAAA,MAAA,GAAS,EAAE,MAAM,CAAA,CAAA;AAE5C,EAAM,MAAA,WAAA,GAAc,OAAY,KAAA,EAAA,GAAK,CAAI,GAAA,OAAA,CAAA;AAEzC,EAAI,IAAA,CAAA,CAAE,WAAW,CAAE,CAAA,MAAA,IAAU,EAAE,MAAW,KAAA,CAAA,CAAE,QAAe,OAAA,OAAA,CAAA;AAE3D,EAAI,IAAA,CAAA,CAAE,WAAW,CAAE,CAAA,MAAA,IAAU,EAAE,MAAW,KAAA,CAAA,CAAE,QAAe,OAAA,UAAA,CAAA;AAE3D,EAAA,IAAI,EAAE,MAAW,KAAA,CAAA,CAAE,MAAU,IAAA,WAAA,KAAgB,GAAU,OAAA,UAAA,CAAA;AAEvD,EAAA,IAAI,EAAE,MAAW,KAAA,CAAA,CAAE,MAAU,IAAA,WAAA,KAAgB,GAAU,OAAA,UAAA,CAAA;AACvD,EAAO,OAAA,MAAA,CAAA;AACX,EAAA;AAMO,IAAM,YAAe,GAAA,CAAC,GAAgB,EAAA,QAAA,EAA0B,SAAoE,KAAA;AACvI,EAAM,MAAA,IAAA,GAAO,eAAe,GAAG,CAAA,CAAA;AAC/B,EAAA,MAAM,WAAY,IAAO,GAAA,CAAA,GAAI,SAAY,GAAA,EAAA,GAAK,MAAM,EAAM,GAAA,CAAA,CAAA;AAC1D,EAAA,OAAO,EAAE,GAAA,EAAK,cAAe,CAAA,OAAO,GAAG,QAAS,EAAA,CAAA;AACpD,EAAA;AAeO,IAAM,2BAA8B,GAAA,CACvC,QACA,EAAA,aAAA,EACA,cACwB,KAAA;AACxB,EAAA,IAAI,cAAe,CAAA,MAAA,KAAW,CAAG,EAAA,OAAO,EAAC,CAAA;AAEzC,EAAA,MAAM,aAAgB,GAAA,cAAA,CACjB,GAAI,CAAA,CAAA,CAAA,KAAK,UAAU,CAAE,CAAA,GAAA,EAAK,CAAE,CAAA,QAAQ,CAAC,CACrC,CAAA,MAAA,CAAO,CAAC,CAAA,KAAuB,MAAM,IAAI,CAAA,CAAA;AAE9C,EAAA,IAAI,aAAc,CAAA,MAAA,KAAW,CAAG,EAAA,OAAO,EAAC,CAAA;AAGxC,EAAM,MAAA,UAAA,GAAa,cAAc,CAAC,CAAA,CAAA;AAElC,EAAA,MAAM,cAAqC,EAAC,CAAA;AAE5C,EAAA,KAAA,IAAS,EAAK,GAAA,CAAA,EAAA,EAAK,EAAM,IAAA,EAAA,EAAI,EAAM,EAAA,EAAA;AAC/B,IAAM,MAAA,EAAE,KAAK,EAAI,EAAA,QAAA,EAAU,IAAO,GAAA,YAAA,CAAa,QAAU,EAAA,aAAA,EAAe,EAAE,CAAA,CAAA;AAC1E,IAAM,MAAA,EAAA,GAAK,SAAU,CAAA,EAAA,EAAI,EAAE,CAAA,CAAA;AAC3B,IAAA,IAAI,CAAC,EAAI,EAAA,SAAA;AAET,IAAM,MAAA,SAAA,GAAY,gBAAiB,CAAA,UAAA,EAAY,EAAE,CAAA,CAAA;AACjD,IAAA,IAAI,cAAc,MAAQ,EAAA,SAAA;AAE1B,IAAA,MAAM,SAAS,CAAG,EAAA,EAAE,GAAG,EAAO,KAAA,OAAA,GAAU,MAAM,EAAE,CAAA,CAAA,CAAA;AAChD,IAAA,WAAA,CAAY,IAAK,CAAA;AAAA,MACb,SAAW,EAAA,EAAA;AAAA,MACX,SAAW,EAAA,EAAA;AAAA,MACX,cAAgB,EAAA,EAAA;AAAA,MAChB,aAAe,EAAA,EAAA;AAAA,MACf,SAAA;AAAA,MACA,KAAO,EAAA,CAAA,EAAG,EAAK,GAAA,CAAA,GAAI,GAAM,GAAA,EAAE,CAAG,EAAA,EAAE,CAAM,QAAA,EAAA,MAAM,CAAK,EAAA,EAAA,EAAA,CAAG,KAAK,CAAA,CAAA,CAAA;AAAA,KAC5D,CAAA,CAAA;AAAA,GACL;AAEA,EAAM,MAAA,KAAA,GAA0C,EAAE,KAAA,EAAO,CAAG,EAAA,QAAA,EAAU,CAAG,EAAA,QAAA,EAAU,CAAG,EAAA,QAAA,EAAU,CAAG,EAAA,IAAA,EAAM,CAAE,EAAA,CAAA;AAC3G,EAAY,WAAA,CAAA,IAAA,CAAK,CAAC,CAAA,EAAG,CAAM,KAAA;AACvB,IAAA,MAAM,KAAK,KAAM,CAAA,CAAA,CAAE,SAAS,CAAI,GAAA,KAAA,CAAM,EAAE,SAAS,CAAA,CAAA;AACjD,IAAI,IAAA,EAAA,KAAO,GAAU,OAAA,EAAA,CAAA;AACrB,IAAO,OAAA,IAAA,CAAK,IAAI,CAAE,CAAA,SAAS,IAAI,IAAK,CAAA,GAAA,CAAI,EAAE,SAAS,CAAA,CAAA;AAAA,GACtD,CAAA,CAAA;AAED,EAAO,OAAA,WAAA,CAAA;AACX,EAAA;;;ACxSA,IAAM,WAAc,GAAA,gBAAA,CAAA;AAoGpB,eAAe,SAAA,CAAU,UAAkB,IAAsC,EAAA;AAC7E,EAAM,MAAA,GAAA,GAAM,IAAI,WAAY,EAAA,CAAA;AAC5B,EAAM,MAAA,WAAA,GAAc,MAAM,MAAA,CAAO,MAAO,CAAA,SAAA;AAAA,IACpC,KAAA;AAAA,IAAO,GAAA,CAAI,OAAO,QAAQ,CAAA;AAAA,IAAG,QAAA;AAAA,IAAU,KAAA;AAAA,IAAO,CAAC,WAAW,CAAA;AAAA,GAC9D,CAAA;AACA,EAAA,OAAO,OAAO,MAAO,CAAA,SAAA;AAAA,IACjB,EAAE,IAAM,EAAA,QAAA,EAAU,MAAM,UAAY,EAAA,GAAA,EAAS,MAAM,SAAU,EAAA;AAAA,IAC7D,WAAA;AAAA,IACA,EAAE,IAAA,EAAM,SAAW,EAAA,MAAA,EAAQ,GAAI,EAAA;AAAA,IAC/B,KAAA;AAAA,IACA,CAAC,WAAW,SAAS,CAAA;AAAA,GACzB,CAAA;AACJ,CAAA;AAEA,SAAS,YAAY,GAA0B,EAAA;AAC3C,EAAO,OAAA,IAAA,CAAK,OAAO,YAAa,CAAA,GAAG,IAAI,UAAW,CAAA,GAAG,CAAC,CAAC,CAAA,CAAA;AAC3D,CAAA;AAEA,SAAS,YAAY,GAAyB,EAAA;AAC1C,EAAM,MAAA,GAAA,GAAM,KAAK,GAAG,CAAA,CAAA;AACpB,EAAA,MAAM,GAAM,GAAA,IAAI,UAAW,CAAA,GAAA,CAAI,MAAM,CAAA,CAAA;AACrC,EAAS,KAAA,IAAA,CAAA,GAAI,CAAG,EAAA,CAAA,GAAI,GAAI,CAAA,MAAA,EAAQ,CAAK,EAAA,EAAA,GAAA,CAAI,CAAC,CAAA,GAAI,GAAI,CAAA,UAAA,CAAW,CAAC,CAAA,CAAA;AAC9D,EAAO,OAAA,GAAA,CAAA;AACX,CAAA;AAEA,eAAe,cAAA,CAAe,MAAc,QAAwD,EAAA;AAChG,EAAA,MAAM,OAAO,MAAO,CAAA,eAAA,CAAgB,IAAI,UAAA,CAAW,EAAE,CAAC,CAAA,CAAA;AACtD,EAAA,MAAM,KAAK,MAAO,CAAA,eAAA,CAAgB,IAAI,UAAA,CAAW,EAAE,CAAC,CAAA,CAAA;AACpD,EAAA,MAAM,GAAM,GAAA,MAAM,SAAU,CAAA,QAAA,EAAU,IAAI,CAAA,CAAA;AAC1C,EAAM,MAAA,UAAA,GAAa,MAAM,MAAA,CAAO,MAAO,CAAA,OAAA;AAAA,IACnC,EAAE,IAAM,EAAA,SAAA,EAAW,EAAG,EAAA;AAAA,IAAG,GAAA;AAAA,IAAK,IAAI,WAAA,EAAc,CAAA,MAAA,CAAO,IAAI,CAAA;AAAA,GAC/D,CAAA;AACA,EAAO,OAAA;AAAA,IACH,IAAA,EAAM,YAAY,IAAI,CAAA;AAAA,IACtB,EAAA,EAAI,YAAY,EAAE,CAAA;AAAA,IAClB,UAAA,EAAY,YAAY,UAAU,CAAA;AAAA,GACtC,CAAA;AACJ,CAAA;AAEA,eAAe,cAAA,CAAe,KAA+C,QAAmC,EAAA;AAC5G,EAAM,MAAA,IAAA,GAAO,WAAY,CAAA,GAAA,CAAI,IAAI,CAAA,CAAA;AACjC,EAAM,MAAA,EAAA,GAAK,WAAY,CAAA,GAAA,CAAI,EAAE,CAAA,CAAA;AAC7B,EAAM,MAAA,UAAA,GAAa,WAAY,CAAA,GAAA,CAAI,UAAU,CAAA,CAAA;AAC7C,EAAA,MAAM,GAAM,GAAA,MAAM,SAAU,CAAA,QAAA,EAAU,IAAI,CAAA,CAAA;AAC1C,EAAM,MAAA,QAAA,GAAW,MAAM,MAAA,CAAO,MAAO,CAAA,OAAA;AAAA,IACjC,EAAE,IAAM,EAAA,SAAA,EAAW,EAAG,EAAA;AAAA,IAAG,GAAA;AAAA,IAAK,UAAA;AAAA,GAClC,CAAA;AACA,EAAA,OAAO,IAAI,WAAA,EAAc,CAAA,MAAA,CAAO,QAAQ,CAAA,CAAA;AAC5C,CAAA;AAEO,SAAS,YAAY,OAAiC,EAAA;AACzD,EAAI,IAAA;AACA,IAAA,YAAA,CAAa,OAAQ,CAAA,WAAA,EAAa,IAAK,CAAA,SAAA,CAAU,OAAO,CAAC,CAAA,CAAA;AAAA,GACrD,CAAA,MAAA;AAAA,GAER;AACJ,CAAA;AAEO,SAAS,WAAuC,GAAA;AACnD,EAAI,IAAA;AACA,IAAM,MAAA,GAAA,GAAM,YAAa,CAAA,OAAA,CAAQ,WAAW,CAAA,CAAA;AAC5C,IAAI,IAAA,CAAC,KAAY,OAAA,IAAA,CAAA;AACjB,IAAO,OAAA,IAAA,CAAK,MAAM,GAAG,CAAA,CAAA;AAAA,GACjB,CAAA,MAAA;AACJ,IAAO,OAAA,IAAA,CAAA;AAAA,GACX;AACJ,CAAA;AAEO,SAAS,YAAqB,GAAA;AACjC,EAAI,IAAA;AAAE,IAAA,YAAA,CAAa,WAAW,WAAW,CAAA,CAAA;AAAA,GAAW,CAAA,MAAA;AAAA,GAAa;AACrE,CAAA;AAMA,IAAM,OAAU,GAAA,iBAAA,CAAA;AAChB,IAAM,UAAa,GAAA,CAAA,CAAA;AACnB,IAAM,UAAa,GAAA,aAAA,CAAA;AAEnB,SAAS,MAA+B,GAAA;AACpC,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAW,KAAA;AACpC,IAAA,MAAM,GAAM,GAAA,SAAA,CAAU,IAAK,CAAA,OAAA,EAAS,UAAU,CAAA,CAAA;AAC9C,IAAA,GAAA,CAAI,kBAAkB,MAAM;AACxB,MAAA,MAAM,KAAK,GAAI,CAAA,MAAA,CAAA;AACf,MAAA,IAAI,CAAC,EAAA,CAAG,gBAAiB,CAAA,QAAA,CAAS,UAAU,CAAG,EAAA;AAC3C,QAAA,EAAA,CAAG,kBAAkB,UAAU,CAAA,CAAA;AAAA,OACnC;AAAA,KACJ,CAAA;AACA,IAAA,GAAA,CAAI,SAAY,GAAA,MAAM,OAAQ,CAAA,GAAA,CAAI,MAAM,CAAA,CAAA;AACxC,IAAA,GAAA,CAAI,OAAU,GAAA,MAAM,MAAO,CAAA,GAAA,CAAI,KAAK,CAAA,CAAA;AAAA,GACvC,CAAA,CAAA;AACL,CAAA;AAEA,eAAsB,gBAAA,CAAiB,KAAa,IAAkC,EAAA;AAClF,EAAI,IAAA;AACA,IAAM,MAAA,EAAA,GAAK,MAAM,MAAO,EAAA,CAAA;AACxB,IAAA,MAAM,EAAK,GAAA,EAAA,CAAG,WAAY,CAAA,UAAA,EAAY,WAAW,CAAA,CAAA;AACjD,IAAA,EAAA,CAAG,WAAY,CAAA,UAAU,CAAE,CAAA,GAAA,CAAI,MAAM,GAAG,CAAA,CAAA;AACxC,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,GAAA,EAAK,GAAQ,KAAA;AAAE,MAAG,EAAA,CAAA,UAAA,GAAa,MAAM,GAAI,EAAA,CAAA;AAAG,MAAA,EAAA,CAAG,OAAU,GAAA,MAAM,GAAI,CAAA,EAAA,CAAG,KAAK,CAAA,CAAA;AAAA,KAAI,CAAA,CAAA;AAAA,GACpG,CAAA,MAAA;AAAA,GAER;AACJ,CAAA;AAEA,eAAsB,qBAAqB,GAA0C,EAAA;AACjF,EAAI,IAAA;AACA,IAAM,MAAA,EAAA,GAAK,MAAM,MAAO,EAAA,CAAA;AACxB,IAAA,MAAM,EAAK,GAAA,EAAA,CAAG,WAAY,CAAA,UAAA,EAAY,UAAU,CAAA,CAAA;AAChD,IAAA,MAAM,MAAM,EAAG,CAAA,WAAA,CAAY,UAAU,CAAA,CAAE,IAAI,GAAG,CAAA,CAAA;AAC9C,IAAO,OAAA,IAAI,OAAQ,CAAA,CAAC,OAAY,KAAA;AAC5B,MAAA,GAAA,CAAI,SAAY,GAAA,MAAM,OAAQ,CAAA,GAAA,CAAI,UAAU,IAAI,CAAA,CAAA;AAChD,MAAI,GAAA,CAAA,OAAA,GAAU,MAAM,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,KACnC,CAAA,CAAA;AAAA,GACG,CAAA,MAAA;AACJ,IAAO,OAAA,IAAA,CAAA;AAAA,GACX;AACJ,CAAA;AAEA,eAAsB,eAAiC,GAAA;AACnD,EAAI,IAAA;AACA,IAAM,MAAA,EAAA,GAAK,MAAM,MAAO,EAAA,CAAA;AACxB,IAAA,MAAM,EAAK,GAAA,EAAA,CAAG,WAAY,CAAA,UAAA,EAAY,WAAW,CAAA,CAAA;AACjD,IAAG,EAAA,CAAA,WAAA,CAAY,UAAU,CAAA,CAAE,KAAM,EAAA,CAAA;AACjC,IAAM,MAAA,IAAI,OAAc,CAAA,CAAC,GAAQ,KAAA;AAAE,MAAG,EAAA,CAAA,UAAA,GAAa,MAAM,GAAI,EAAA,CAAA;AAAA,KAAI,CAAA,CAAA;AAAA,GAC7D,CAAA,MAAA;AAAA,GAAa;AACzB,CAAA;AAMA,eAAsB,QAA0B,GAAA;AAC5C,EAAa,YAAA,EAAA,CAAA;AACb,EAAA,MAAM,eAAgB,EAAA,CAAA;AAC1B,CAAA;AAMA,IAAM,oBAAuB,GAAA,CAAA,CAAA;AA0DtB,SAAS,sBAAsB,CAAuC,EAAA;AACzE,EAAO,OAAA;AAAA,IACH,IAAI,CAAE,CAAA,EAAA;AAAA,IACN,SAAS,CAAE,CAAA,OAAA;AAAA,IACX,aAAa,CAAE,CAAA,WAAA;AAAA,IACf,eAAe,CAAE,CAAA,aAAA;AAAA,IACjB,sBAAsB,CAAE,CAAA,oBAAA;AAAA,IACxB,eAAe,CAAE,CAAA,aAAA;AAAA,IACjB,oBAAoB,CAAE,CAAA,kBAAA;AAAA,IACtB,aAAa,CAAE,CAAA,WAAA;AAAA,IACf,YAAY,CAAE,CAAA,UAAA;AAAA,IACd,KAAA,EAAO,CAAE,CAAA,KAAA,EAAO,GAAI,CAAA,CAAC,CAAO,MAAA,EAAE,GAAG,CAAA,EAAI,CAAA,CAAA,IAAK,EAAC;AAAA,IAC3C,MAAQ,EAAA,CAAA,CAAE,MAAO,CAAA,GAAA,CAAI,CAAC,CAAuB,MAAA;AAAA,MACzC,aAAe,EAAA,IAAA,CAAK,SAAU,CAAA,CAAA,CAAE,SAAS,CAAA;AAAA,MACzC,QAAU,EAAA,CAAA,CAAE,QAAS,CAAA,GAAA,CAAI,CAAC,EAA0B,MAAA;AAAA,QAChD,WAAW,EAAG,CAAA,SAAA;AAAA,QACd,QAAQ,EAAG,CAAA,MAAA;AAAA,QACX,OAAO,EAAG,CAAA,KAAA;AAAA,QACV,QAAQ,EAAG,CAAA,MAAA;AAAA,QACX,SAAS,EAAG,CAAA,OAAA;AAAA,QACZ,kBAAkB,EAAG,CAAA,gBAAA;AAAA,QACrB,cAAc,EAAG,CAAA,YAAA;AAAA,QACjB,YAAY,EAAG,CAAA,UAAA;AAAA,QACf,WAAa,EAAA,EAAA,CAAG,WAAY,CAAA,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,QAAA,EAAU,CAAE,CAAA,QAAA,EAAU,MAAQ,EAAA,CAAA,CAAE,QAAS,CAAA,CAAA;AAAA,QACnF,gBAAkB,EAAA,EAAA,CAAG,gBAAkB,EAAA,GAAA,CAAI,CAAC,CAAO,MAAA;AAAA,UAC/C,UAAU,CAAE,CAAA,QAAA;AAAA,UAAU,QAAQ,CAAE,CAAA,MAAA;AAAA,UAAQ,YAAY,CAAE,CAAA,UAAA;AAAA,SACxD,CAAA,CAAA;AAAA,QACF,OAAA,EAAS,EAAG,CAAA,OAAA,GAAU,IAAK,CAAA,KAAA,CAAM,KAAK,SAAU,CAAA,EAAA,CAAG,OAAO,CAAC,CAAI,GAAA,KAAA,CAAA;AAAA,OACjE,CAAA,CAAA;AAAA,MACF,QAAQ,CAAE,CAAA,MAAA;AAAA,MACV,OAAO,CAAE,CAAA,KAAA;AAAA,MACT,QAAQ,CAAE,CAAA,MAAA;AAAA,MACV,UAAU,CAAE,CAAA,QAAA;AAAA,MACZ,OAAO,CAAE,CAAA,KAAA;AAAA,MACT,SAAS,CAAE,CAAA,OAAA;AAAA,MACX,aAAa,CAAE,CAAA,WAAA;AAAA,MACf,YAAY,CAAE,CAAA,UAAA;AAAA,MACd,kBAAA,EAAoB,EAAE,kBAAsB,IAAA,CAAA;AAAA,MAC5C,eAAe,CAAE,CAAA,aAAA;AAAA,MACjB,yBAAyB,CAAE,CAAA,uBAAA,KAA4B,KAAQ,GAAA,KAAA,GAAS,EAAE,uBAA2B,IAAA,IAAA;AAAA,MACrG,mBAAA,EAAqB,EAAE,mBAAuB,IAAA,CAAA;AAAA,KAChD,CAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMF,eAAe,CAAE,CAAA,aAAA,IAAiB,CAAE,CAAA,aAAA,CAAc,SAAS,CACrD,GAAA,CAAA,CAAE,aAAc,CAAA,GAAA,CAAI,CAAC,EAAQ,MAAA,EAAE,GAAG,EAAA,GAAK,CACvC,GAAA,KAAA,CAAA;AAAA,GACV,CAAA;AACJ,CAAA;AAIA,eAAsB,aAAA,CAAc,SAA2B,QAAkC,EAAA;AAC7F,EAAA,MAAM,GAAM,GAAA,iBAAA,IAAI,IAAK,EAAA,EAAE,WAAY,EAAA,CAAA;AAEnC,EAAI,IAAA,OAAA,CAAA;AAEJ,EAAI,IAAA,QAAA,IAAY,QAAS,CAAA,MAAA,GAAS,CAAG,EAAA;AACjC,IAAA,MAAM,YAA+B,GAAA;AAAA,MACjC,OAAS,EAAA,oBAAA;AAAA,MACT,SAAW,EAAA,GAAA;AAAA,MACX,SAAW,EAAA,GAAA;AAAA,MACX,OAAA;AAAA,KACJ,CAAA;AACA,IAAA,MAAM,MAAM,MAAM,cAAA,CAAe,KAAK,SAAU,CAAA,YAAY,GAAG,QAAQ,CAAA,CAAA;AACvE,IAAU,OAAA,GAAA;AAAA,MACN,OAAS,EAAA,oBAAA;AAAA,MACT,SAAW,EAAA,GAAA;AAAA,MACX,SAAW,EAAA,GAAA;AAAA,MACX,OAAS,EAAA,KAAA,CAAA;AAAA,MACT,SAAW,EAAA,GAAA;AAAA,KACf,CAAA;AAAA,GACG,MAAA;AACH,IAAU,OAAA,GAAA;AAAA,MACN,OAAS,EAAA,oBAAA;AAAA,MACT,SAAW,EAAA,GAAA;AAAA,MACX,SAAW,EAAA,GAAA;AAAA,MACX,OAAA;AAAA,KACJ,CAAA;AAAA,GACJ;AAEA,EAAA,MAAM,IAAO,GAAA,IAAA,CAAK,SAAU,CAAA,OAAA,EAAS,MAAM,CAAC,CAAA,CAAA;AAC5C,EAAM,MAAA,IAAA,GAAO,IAAI,IAAK,CAAA,CAAC,IAAI,CAAG,EAAA,EAAE,IAAM,EAAA,kBAAA,EAAoB,CAAA,CAAA;AAC1D,EAAA,MAAM,QAAW,GAAA,CAAA,EAAG,OAAQ,CAAA,OAAA,IAAW,UAAU,CAAA,aAAA,CAAA,CAAA;AAEjD,EAAM,MAAA,GAAA,GAAM,GAAI,CAAA,eAAA,CAAgB,IAAI,CAAA,CAAA;AACpC,EAAM,MAAA,CAAA,GAAI,QAAS,CAAA,aAAA,CAAc,GAAG,CAAA,CAAA;AACpC,EAAA,CAAA,CAAE,IAAO,GAAA,GAAA,CAAA;AACT,EAAA,CAAA,CAAE,QAAW,GAAA,QAAA,CAAA;AACb,EAAS,QAAA,CAAA,IAAA,CAAK,YAAY,CAAC,CAAA,CAAA;AAC3B,EAAA,CAAA,CAAE,KAAM,EAAA,CAAA;AACR,EAAS,QAAA,CAAA,IAAA,CAAK,YAAY,CAAC,CAAA,CAAA;AAC3B,EAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA,CAAA;AAC3B,CAAA;AAMA,IAAM,eAAkB,GAAA,qBAAA,CAAA;AACxB,IAAM,kBAAqB,GAAA,CAAA,CAAA;AAC3B,IAAM,aAAgB,GAAA,UAAA,CAAA;AAiBtB,SAAS,aAAsC,GAAA;AAC3C,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAW,KAAA;AACpC,IAAA,MAAM,GAAM,GAAA,SAAA,CAAU,IAAK,CAAA,eAAA,EAAiB,kBAAkB,CAAA,CAAA;AAC9D,IAAA,GAAA,CAAI,kBAAkB,MAAM;AACxB,MAAA,MAAM,KAAK,GAAI,CAAA,MAAA,CAAA;AACf,MAAA,IAAI,CAAC,EAAA,CAAG,gBAAiB,CAAA,QAAA,CAAS,aAAa,CAAG,EAAA;AAC9C,QAAA,EAAA,CAAG,iBAAkB,CAAA,aAAA,EAAe,EAAE,OAAA,EAAS,WAAW,CAAA,CAAA;AAAA,OAC9D;AAAA,KACJ,CAAA;AACA,IAAA,GAAA,CAAI,SAAY,GAAA,MAAM,OAAQ,CAAA,GAAA,CAAI,MAAM,CAAA,CAAA;AACxC,IAAA,GAAA,CAAI,OAAU,GAAA,MAAM,MAAO,CAAA,GAAA,CAAI,KAAK,CAAA,CAAA;AAAA,GACvC,CAAA,CAAA;AACL,CAAA;AAEA,eAAsB,qBAAqB,OAAiD,EAAA;AACxF,EAAA,MAAM,GAAM,GAAA,iBAAA,IAAI,IAAK,EAAA,EAAE,WAAY,EAAA,CAAA;AACnC,EAAA,MAAM,OAA0B,GAAA;AAAA,IAC5B,OAAS,EAAA,oBAAA;AAAA,IACT,SAAW,EAAA,GAAA;AAAA,IACX,SAAW,EAAA,GAAA;AAAA,IACX,OAAA;AAAA,GACJ,CAAA;AAEA,EAAM,MAAA,QAAA,GAAW,QAAQ,MACpB,CAAA,GAAA,CAAI,OAAK,CAAE,CAAA,OAAO,EAClB,MAAO,CAAA,CAAC,MAAmB,CAAC,CAAC,KAAK,CAAE,CAAA,MAAA,GAAS,CAAC,CAC9C,CAAA,KAAA,CAAM,GAAG,CAAC,CAAA,CAAA;AAEf,EAAA,MAAM,IAAoB,GAAA;AAAA,IACtB,IAAI,OAAQ,CAAA,EAAA;AAAA,IACZ,IAAA,EAAM,QAAQ,OAAW,IAAA,cAAA;AAAA,IACzB,SAAW,EAAA,GAAA;AAAA,IACX,SAAW,EAAA,GAAA;AAAA,IACX,UAAA,EAAY,QAAQ,MAAO,CAAA,MAAA;AAAA,IAC3B,WAAa,EAAA,IAAA,CAAK,KAAM,CAAA,OAAA,CAAQ,WAAW,CAAA;AAAA,IAC3C,QAAA;AAAA,GACJ,CAAA;AAEA,EAAA,MAAM,MAAwB,GAAA,EAAE,IAAM,EAAA,IAAA,EAAM,OAAQ,EAAA,CAAA;AAEpD,EAAI,IAAA;AACA,IAAM,MAAA,EAAA,GAAK,MAAM,aAAc,EAAA,CAAA;AAE/B,IAAA,MAAM,QAAW,GAAA,MAAM,IAAI,OAAA,CAAmC,CAAC,OAAY,KAAA;AACvE,MAAA,MAAMC,GAAK,GAAA,EAAA,CAAG,WAAY,CAAA,aAAA,EAAe,UAAU,CAAA,CAAA;AACnD,MAAA,MAAM,MAAMA,GAAG,CAAA,WAAA,CAAY,aAAa,CAAE,CAAA,GAAA,CAAI,QAAQ,EAAE,CAAA,CAAA;AACxD,MAAA,GAAA,CAAI,SAAY,GAAA,MAAM,OAAQ,CAAA,GAAA,CAAI,MAAmC,CAAA,CAAA;AACrE,MAAI,GAAA,CAAA,OAAA,GAAU,MAAM,OAAA,CAAQ,KAAS,CAAA,CAAA,CAAA;AAAA,KACxC,CAAA,CAAA;AACD,IAAA,IAAI,QAAU,EAAA;AACV,MAAK,IAAA,CAAA,SAAA,GAAY,SAAS,IAAK,CAAA,SAAA,CAAA;AAC/B,MAAO,MAAA,CAAA,IAAA,CAAK,SAAY,GAAA,QAAA,CAAS,IAAK,CAAA,SAAA,CAAA;AAAA,KAC1C;AAEA,IAAA,MAAM,EAAK,GAAA,EAAA,CAAG,WAAY,CAAA,aAAA,EAAe,WAAW,CAAA,CAAA;AACpD,IAAA,EAAA,CAAG,WAAY,CAAA,aAAa,CAAE,CAAA,GAAA,CAAI,MAAM,CAAA,CAAA;AACxC,IAAA,MAAM,IAAI,OAAA,CAAc,CAAC,GAAA,EAAK,GAAQ,KAAA;AAAE,MAAG,EAAA,CAAA,UAAA,GAAa,MAAM,GAAI,EAAA,CAAA;AAAG,MAAA,EAAA,CAAG,OAAU,GAAA,MAAM,GAAI,CAAA,EAAA,CAAG,KAAK,CAAA,CAAA;AAAA,KAAI,CAAA,CAAA;AAAA,WACnG,GAAK,EAAA;AACV,IAAQ,OAAA,CAAA,IAAA,CAAK,oCAAoC,GAAG,CAAA,CAAA;AAAA,GACxD;AAEA,EAAO,OAAA,IAAA,CAAA;AACX,CAAA;AAEA,eAAsB,YAAuC,GAAA;AACzD,EAAI,IAAA;AACA,IAAM,MAAA,EAAA,GAAK,MAAM,aAAc,EAAA,CAAA;AAC/B,IAAA,MAAM,EAAK,GAAA,EAAA,CAAG,WAAY,CAAA,aAAA,EAAe,UAAU,CAAA,CAAA;AACnD,IAAM,MAAA,KAAA,GAAQ,EAAG,CAAA,WAAA,CAAY,aAAa,CAAA,CAAA;AAC1C,IAAA,MAAM,GAAM,GAAA,MAAM,IAAI,OAAA,CAAyB,CAAC,OAAY,KAAA;AACxD,MAAM,MAAA,GAAA,GAAM,MAAM,MAAO,EAAA,CAAA;AACzB,MAAA,GAAA,CAAI,SAAY,GAAA,MAAM,OAAQ,CAAA,GAAA,CAAI,MAAyB,CAAA,CAAA;AAC3D,MAAA,GAAA,CAAI,OAAU,GAAA,MAAM,OAAQ,CAAA,EAAE,CAAA,CAAA;AAAA,KACjC,CAAA,CAAA;AACD,IAAO,OAAA,GAAA,CACF,IAAI,CAAK,CAAA,KAAA,CAAA,CAAE,IAAI,CACf,CAAA,IAAA,CAAK,CAAC,CAAA,EAAG,CAAM,KAAA,IAAI,KAAK,CAAE,CAAA,SAAS,CAAE,CAAA,OAAA,EAAY,GAAA,IAAI,KAAK,CAAE,CAAA,SAAS,CAAE,CAAA,OAAA,EAAS,CAAA,CAAA;AAAA,GACjF,CAAA,MAAA;AACJ,IAAA,OAAO,EAAC,CAAA;AAAA,GACZ;AACJ,CAAA;AAEA,eAAsB,uBAAuB,EAA4C,EAAA;AACrF,EAAI,IAAA;AACA,IAAM,MAAA,EAAA,GAAK,MAAM,aAAc,EAAA,CAAA;AAC/B,IAAA,MAAM,EAAK,GAAA,EAAA,CAAG,WAAY,CAAA,aAAA,EAAe,UAAU,CAAA,CAAA;AACnD,IAAA,MAAM,MAAM,EAAG,CAAA,WAAA,CAAY,aAAa,CAAA,CAAE,IAAI,EAAE,CAAA,CAAA;AAChD,IAAO,OAAA,IAAI,OAAQ,CAAA,CAAC,OAAY,KAAA;AAC5B,MAAA,GAAA,CAAI,YAAY,MAAM;AAClB,QAAA,MAAM,SAAS,GAAI,CAAA,MAAA,CAAA;AACnB,QAAQ,OAAA,CAAA,MAAA,EAAQ,QAAQ,IAAI,CAAA,CAAA;AAAA,OAChC,CAAA;AACA,MAAI,GAAA,CAAA,OAAA,GAAU,MAAM,OAAA,CAAQ,IAAI,CAAA,CAAA;AAAA,KACnC,CAAA,CAAA;AAAA,GACG,CAAA,MAAA;AACJ,IAAO,OAAA,IAAA,CAAA;AAAA,GACX;AACJ,CAAA;AAEA,eAAsB,yBAAyB,EAA2B,EAAA;AACtE,EAAI,IAAA;AACA,IAAM,MAAA,EAAA,GAAK,MAAM,aAAc,EAAA,CAAA;AAC/B,IAAA,MAAM,EAAK,GAAA,EAAA,CAAG,WAAY,CAAA,aAAA,EAAe,WAAW,CAAA,CAAA;AACpD,IAAA,EAAA,CAAG,WAAY,CAAA,aAAa,CAAE,CAAA,MAAA,CAAO,EAAE,CAAA,CAAA;AACvC,IAAM,MAAA,IAAI,OAAc,CAAA,CAAC,GAAQ,KAAA;AAAE,MAAG,EAAA,CAAA,UAAA,GAAa,MAAM,GAAI,EAAA,CAAA;AAAA,KAAI,CAAA,CAAA;AAAA,GAC7D,CAAA,MAAA;AAAA,GAAa;AACzB,CAAA;AAGO,SAAS,mBAAmB,IAAwC,EAAA;AACvE,EAAA,OAAO,CAAC,EAAE,IAAA,CAAK,SAAa,IAAA,OAAO,KAAK,SAAc,KAAA,QAAA,CAAA,CAAA;AAC1D,CAAA;AAIA,eAAsB,aAAA,CAAc,MAAY,QAA4C,EAAA;AACxF,EAAM,MAAA,IAAA,GAAO,MAAM,IAAA,CAAK,IAAK,EAAA,CAAA;AAC7B,EAAI,IAAA,MAAA,CAAA;AACJ,EAAI,IAAA;AACA,IAAS,MAAA,GAAA,IAAA,CAAK,MAAM,IAAI,CAAA,CAAA;AAAA,GACpB,CAAA,MAAA;AACJ,IAAM,MAAA,IAAI,MAAM,sCAAsC,CAAA,CAAA;AAAA,GAC1D;AAEA,EAAA,IAAI,GAAM,GAAA,MAAA,CAAA;AAEV,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAY,IAAA,GAAA,KAAQ,IAAM,EAAA;AACzC,IAAM,MAAA,IAAI,MAAM,8CAA8C,CAAA,CAAA;AAAA,GAClE;AACA,EAAI,IAAA,GAAA,CAAI,YAAY,oBAAsB,EAAA;AACtC,IAAA,MAAM,IAAI,KAAM,CAAA,CAAA,6BAAA,EAAgC,IAAI,OAAO,CAAA,WAAA,EAAc,oBAAoB,CAAG,CAAA,CAAA,CAAA,CAAA;AAAA,GACpG;AAEA,EAAI,IAAA,kBAAA,CAAmB,GAAG,CAAG,EAAA;AACzB,IAAA,IAAI,CAAC,QAAU,EAAA;AACX,MAAM,MAAA,IAAI,MAAM,mBAAmB,CAAA,CAAA;AAAA,KACvC;AACA,IAAA,MAAM,MAAM,GAAI,CAAA,SAAA,CAAA;AAChB,IAAI,IAAA,aAAA,CAAA;AACJ,IAAI,IAAA;AACA,MAAgB,aAAA,GAAA,MAAM,cAAe,CAAA,GAAA,EAAK,QAAQ,CAAA,CAAA;AAAA,KAC9C,CAAA,MAAA;AACJ,MAAM,MAAA,IAAI,MAAM,gBAAgB,CAAA,CAAA;AAAA,KACpC;AACA,IAAI,IAAA,KAAA,CAAA;AACJ,IAAI,IAAA;AACA,MAAQ,KAAA,GAAA,IAAA,CAAK,MAAM,aAAa,CAAA,CAAA;AAAA,KAC5B,CAAA,MAAA;AACJ,MAAM,MAAA,IAAI,MAAM,gBAAgB,CAAA,CAAA;AAAA,KACpC;AACA,IAAM,GAAA,GAAA,KAAA,CAAA;AAAA,GACV;AAEA,EAAA,MAAM,UAAU,GAAI,CAAA,OAAA,CAAA;AACpB,EAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAU,EAAA;AACzC,IAAM,MAAA,IAAI,MAAM,4CAA4C,CAAA,CAAA;AAAA,GAChE;AACA,EAAI,IAAA,CAAC,MAAM,OAAQ,CAAA,OAAA,CAAQ,MAAM,CAAK,IAAA,OAAA,CAAQ,MAAO,CAAA,MAAA,KAAW,CAAG,EAAA;AAC/D,IAAM,MAAA,IAAI,MAAM,6CAA6C,CAAA,CAAA;AAAA,GACjE;AAEA,EAAW,KAAA,MAAA,CAAA,IAAK,QAAQ,MAAQ,EAAA;AAC5B,IAAA,IAAI,CAAC,CAAE,CAAA,aAAA,IAAiB,OAAO,CAAA,CAAE,kBAAkB,QAAU,EAAA;AACzD,MAAM,MAAA,IAAI,MAAM,mDAAmD,CAAA,CAAA;AAAA,KACvE;AACA,IAAI,IAAA;AAAE,MAAK,IAAA,CAAA,KAAA,CAAM,EAAE,aAAa,CAAA,CAAA;AAAA,KAAW,CAAA,MAAA;AACvC,MAAM,MAAA,IAAI,MAAM,uDAAuD,CAAA,CAAA;AAAA,KAC3E;AAAA,GACJ;AAEA,EAAO,OAAA,GAAA,CAAA;AACX,CAAA;;;ACrkBA,IAAM,QAAW,GAAA,EAAA,CAAA;AAajB,SAAS,gBAAgB,KAA0C,EAAA;AAC/D,EAAO,OAAA;AAAA,IACH,QAAQ,IAAK,CAAA,KAAA,CAAM,KAAK,SAAU,CAAA,KAAA,CAAM,MAAM,CAAC,CAAA;AAAA,IAC/C,aAAa,KAAM,CAAA,WAAA;AAAA,IACnB,eAAe,KAAM,CAAA,aAAA;AAAA,IACrB,sBAAsB,KAAM,CAAA,oBAAA;AAAA,IAC5B,YAAY,KAAM,CAAA,UAAA,GAAa,EAAE,GAAG,KAAA,CAAM,YAAe,GAAA,IAAA;AAAA,IACzD,SAAS,KAAM,CAAA,OAAA;AAAA,IACf,KAAA,EAAO,MAAM,KAAM,CAAA,GAAA,CAAI,CAAC,CAAO,MAAA,EAAE,GAAG,CAAA,EAAI,CAAA,CAAA;AAAA,GAC5C,CAAA;AACJ,CAAA;AAMA,IAAI,UAAmD,GAAA,IAAA,CAAA;AACvD,IAAI,iBAA0D,GAAA,IAAA,CAAA;AAC9D,IAAM,gBAAmB,GAAA,IAAA,CAAA;AACzB,IAAM,wBAA2B,GAAA,GAAA,CAAA;AAEjC,SAAS,gBAAgB,MAA+B,EAAA;AACpD,EAAI,IAAA,UAAA,eAAyB,UAAU,CAAA,CAAA;AACvC,EAAA,UAAA,GAAa,WAAW,MAAM;AAC1B,IAAA,WAAA,CAAe,qBAAsB,CAAA,kBAAA,CAAmB,QAAS,EAAC,CAAC,CAAA,CAAA;AAAA,KACpE,gBAAgB,CAAA,CAAA;AAEnB,EAAI,IAAA,iBAAA,eAAgC,iBAAiB,CAAA,CAAA;AACrD,EAAA,iBAAA,GAAoB,WAAW,MAAM;AACjC,IAAM,MAAA,CAAA,GAAI,mBAAmB,QAAS,EAAA,CAAA;AACtC,IAAI,IAAA,CAAA,CAAE,MAAO,CAAA,MAAA,GAAS,CAAG,EAAA;AACrB,MAAqB,oBAAA,CAAA,qBAAA,CAAsB,CAAC,CAAC,CAAA,CAAA;AAAA,KACjD;AAAA,KACD,wBAAwB,CAAA,CAAA;AAC/B,CAAA;AAMA,IAAMC,YAAc,GAAA,IAAA,CAAA;AAQpB,SAAS,qBAAA,CAAsB,OAAgB,WAAoC,EAAA;AAC/E,EAAA,IAAI,WAAgB,KAAA,CAAA,EAAU,OAAA,oBAAA,CAAqB,KAAK,CAAA,CAAA;AACxD,EAAA,IAAI,KAAM,CAAA,MAAA,GAAS,CAAG,EAAA,OAAO,qBAAqB,KAAK,CAAA,CAAA;AAEvD,EAAA,MAAM,YAAsB,EAAC,CAAA;AAC7B,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,KAAA,CAAM,QAAQ,CAAK,EAAA,EAAA;AACnC,IAAU,SAAA,CAAA,IAAA,CAAK,MAAM,CAAC,CAAA,CAAE,QAAQ,KAAM,CAAA,CAAA,GAAI,CAAC,CAAA,CAAE,KAAK,CAAA,CAAA;AAAA,GACtD;AACA,EAAA,SAAA,CAAU,IAAK,CAAA,CAAC,CAAG,EAAA,CAAA,KAAM,IAAI,CAAC,CAAA,CAAA;AAC9B,EAAM,MAAA,cAAA,GAAiB,UAAU,IAAK,CAAA,KAAA,CAAM,UAAU,MAAS,GAAA,CAAC,CAAC,CAAK,IAAA,CAAA,CAAA;AAEtE,EAAM,MAAA,eAAA,GAAkB,IAAK,CAAA,KAAA,CAAM,WAAW,CAAA,CAAA;AAC9C,EAAA,MAAM,iBAAiB,WAAc,GAAA,eAAA,CAAA;AACrC,EAAA,MAAM,eAAkB,GAAA,IAAA,CAAK,KAAM,CAAA,cAAA,GAAiB,cAAc,CAAA,CAAA;AAElE,EAAA,MAAM,kBAA2B,EAAC,CAAA;AAClC,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,KAAA,CAAM,QAAQ,CAAK,EAAA,EAAA;AACnC,IAAM,MAAA,QAAA,GAAW,MAAM,CAAC,CAAA,CAAA;AACxB,IAAM,MAAA,QAAA,GAAW,SAAS,KAAQ,GAAA,eAAA,CAAA;AAClC,IAAA,IAAI,WAAW,CAAG,EAAA,SAAA;AAElB,IAAA,MAAM,YAAY,QAAS,CAAA,MAAA,GAAS,IAAI,eAAmB,IAAA,CAAA,GAAI,KAAK,CAAI,GAAA,CAAA,CAAA;AACxE,IAAA,eAAA,CAAgB,IAAK,CAAA;AAAA,MACjB,KAAO,EAAA,QAAA;AAAA,MACP,MAAQ,EAAA,OAAA;AAAA,MACR,WAAW,QAAWA,GAAAA,YAAAA;AAAA,KACzB,CAAA,CAAA;AAAA,GACL;AAEA,EAAM,MAAA,MAAA,GAAS,qBAAqB,eAAe,CAAA,CAAA;AAInD,EAAA,IAAI,MAAO,CAAA,MAAA,GAAS,CAAG,EAAA,OAAO,qBAAqB,KAAK,CAAA,CAAA;AAExD,EAAO,OAAA,MAAA,CAAA;AACX,CAAA;AA8NA,SAAS,iBAAiB,OAAqC,EAAA;AAC3D,EAAI,IAAA,OAAA,CAAQ,MAAU,IAAA,CAAA,EAAU,OAAA,OAAA,CAAA;AAChC,EAAA,MAAM,MAAS,GAAA,CAAC,GAAG,OAAO,CAAE,CAAA,IAAA,CAAK,CAAC,CAAA,EAAG,CAAM,KAAA,CAAA,CAAE,QAAW,GAAA,CAAA,CAAE,QAAQ,CAAA,CAAA;AAClE,EAAA,MAAM,MAAuB,GAAA,CAAC,MAAO,CAAA,CAAC,CAAC,CAAA,CAAA;AACvC,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,MAAA,CAAO,QAAQ,CAAK,EAAA,EAAA;AACpC,IAAA,MAAM,IAAO,GAAA,MAAA,CAAO,MAAO,CAAA,MAAA,GAAS,CAAC,CAAA,CAAA;AACrC,IAAA,IAAI,MAAO,CAAA,CAAC,CAAE,CAAA,QAAA,IAAY,KAAK,MAAQ,EAAA;AACnC,MAAK,IAAA,CAAA,MAAA,GAAS,KAAK,GAAI,CAAA,IAAA,CAAK,QAAQ,MAAO,CAAA,CAAC,EAAE,MAAM,CAAA,CAAA;AAAA,KACjD,MAAA;AACH,MAAO,MAAA,CAAA,IAAA,CAAK,MAAO,CAAA,CAAC,CAAC,CAAA,CAAA;AAAA,KACzB;AAAA,GACJ;AACA,EAAO,OAAA,MAAA,CAAA;AACX,CAAA;AAEA,IAAM,yBAAyB,CAAC,MAAA,EAAoB,oBAChD,MAAO,CAAA,GAAA,CAAI,CAAC,KAAU,KAAA;AAClB,EAAA,MAAM,UAAa,GAAA,mBAAA,CAAoB,eAAiB,EAAA,KAAA,CAAM,eAAe,CAAA,CAAA;AAC7E,EAAO,OAAA;AAAA,IACH,GAAG,KAAA;AAAA,IACH,oBAAoB,UAAW,CAAA,YAAA;AAAA,IAC/B,YAAY,UAAW,CAAA,KAAA;AAAA,GAC3B,CAAA;AACJ,CAAC,CAAA,CAAA;AAOL,SAAS,qBAAA,CACL,cACA,EAAA,aAAA,EACA,cACM,EAAA;AACN,EAAI,IAAA,cAAA,CAAe,MAAW,KAAA,CAAA,EAAU,OAAA,CAAA,CAAA;AAExC,EAAM,MAAA,WAAA,GAAc,qBAAsB,CAAA,cAAA,EAAgB,aAAa,CAAA,CAAA;AACvE,EAAM,MAAA,SAAA,GAAY,uBAAuB,WAAa,EAAA;AAAA,IAClD,YAAa,CAAA,MAAA;AAAA,IACb,YAAa,CAAA,KAAA;AAAA,IACb,YAAa,CAAA,MAAA;AAAA,IACb,YAAa,CAAA,KAAA;AAAA,GAChB,CAAA,CAAA;AACD,EAAI,IAAA,CAAC,WAAkB,OAAA,CAAA,CAAA;AAEvB,EAAM,MAAA,QAAA,GAAW,eAAe,CAAC,CAAA,CAAA;AACjC,EAAA,MAAM,WAAc,GAAA,qBAAA,CAAsB,QAAS,CAAA,WAAA,EAAa,SAAS,UAAU,CAAA,CAAA;AAGnF,EAAA,MAAM,aAAa,CAAC,SAAA,CAAU,MAAM,YAAa,CAAA,MAAA,EAAQ,aAAa,KAAK,CAAA,CAAA;AAC3E,EAAA,IAAI,SAAY,GAAA,IAAA,CAAA;AAChB,EAAA,KAAA,MAAW,KAAK,UAAY,EAAA;AACxB,IAAA,SAAA,GAAY,YAAY,IAAK,CAAA,CAAC,CAAM,KAAA,CAAA,CAAE,SAAS,CAAC,CAAA,CAAA;AAChD,IAAA,IAAI,SAAW,EAAA,MAAA;AAAA,GACnB;AACA,EAAA,IAAI,CAAC,SAAA,EAAuB,SAAA,GAAA,sBAAA,CAAuB,WAAW,CAAA,CAAA;AAC9D,EAAI,IAAA,CAAC,WAAkB,OAAA,CAAA,CAAA;AAGvB,EAAM,MAAA,UAAA,GAAa,QAAS,CAAA,QAAA,CAAS,IAAK,CAAA,CAAC,EAAO,KAAA,EAAA,CAAG,OAAO,CAAA,IAAK,QAAS,CAAA,QAAA,CAAS,CAAC,CAAA,CAAA;AACpF,EAAM,MAAA,iBAAA,GAAoB,UAAW,CAAA,gBAAA,GAAmB,SAAU,CAAA,QAAA,CAAA;AAGlE,EAAM,MAAA,MAAA,GAAS,oBAAoB,SAAU,CAAA,QAAA,CAAA;AAC7C,EAAA,OAAO,KAAK,GAAI,CAAA,CAAA,EAAG,IAAK,CAAA,KAAA,CAAM,MAAM,CAAC,CAAA,CAAA;AACzC,CAAA;AAIO,IAAM,kBAAqB,GAAA,MAAA,CAAwB,CAAC,GAAA,EAAK,GAAS,MAAA;AAAA;AAAA,EAErE,IAAIC,EAAK,EAAA;AAAA,EACT,OAAS,EAAA,cAAA;AAAA,EACT,WAAa,EAAA,CAAA;AAAA,EACb,aAAe,EAAA,CAAA;AAAA,EACf,oBAAsB,EAAA,CAAA;AAAA,EACtB,aAAA,EAAe,CAAC,CAAA,EAAG,CAAC,CAAA;AAAA,EACpB,QAAQ,EAAC;AAAA,EACT,WAAa,EAAA,CAAA;AAAA,EACb,SAAW,EAAA,KAAA;AAAA,EACX,kBAAoB,EAAA,CAAA;AAAA,EACpB,UAAY,EAAA,IAAA;AAAA,EACZ,eAAiB,EAAA,CAAA;AAAA,EACjB,OAAO,EAAC;AAAA,EACR,eAAe,EAAC;AAAA,EAChB,QAAU,EAAA,SAAA;AAAA,EACV,aAAe,EAAA,KAAA;AAAA,EACf,oBAAsB,EAAA,GAAA;AAAA,EACtB,uBAAyB,EAAA,CAAA;AAAA,EACzB,YAAc,EAAA,IAAA;AAAA,EACd,YAAY,EAAC;AAAA,EACb,cAAgB,EAAA,IAAA;AAAA,EAChB,kBAAkB,EAAC;AAAA,EACnB,SAAW,EAAA,IAAA;AAAA,EACX,YAAY,EAAC;AAAA,EACb,YAAY,EAAC;AAAA;AAAA;AAAA;AAAA,EAMb,QAAA,EAAU,CAAC,SAA2C,KAAA;AAClD,IAAA,GAAA,GAAM,QAAS,EAAA,CAAA;AACf,IAAA,MAAM,QAAQ,GAAI,EAAA,CAAA;AAClB,IAAM,MAAA,UAAA,GAAa,oBAAqB,CAAA,SAAA,CAAU,KAAK,CAAA,CAAA;AACvD,IAAA,MAAM,eAAkB,GAAA,SAAA,CAAU,WAAe,IAAA,iBAAA,CAAkB,UAAU,CAAA,CAAA;AAC7E,IAAA,MAAM,SAAY,GAAA,SAAA,CAAU,GAAO,IAAA,gBAAA,CAAiB,eAAe,CAAA,CAAA;AAEnE,IAAM,MAAA,YAAA,GAAe,KAAM,CAAA,MAAA,CAAO,MAAW,KAAA,CAAA,CAAA;AAC7C,IAAM,MAAA,eAAA,GAAkB,YAAe,GAAA,eAAA,GAAkB,KAAM,CAAA,oBAAA,CAAA;AAC/D,IAAM,MAAA,WAAA,GAAc,YAAe,GAAA,SAAA,GAAY,KAAM,CAAA,WAAA,CAAA;AAErD,IAAM,MAAA,UAAA,GAAa,mBAAoB,CAAA,eAAA,EAAiB,eAAe,CAAA,CAAA;AAEvE,IAAA,MAAM,eAAkB,GAAA,iBAAA;AAAA,MACpB,KAAM,CAAA,MAAA,CAAO,CAAC,CAAA,EAAG,OAAO,SAAU,CAAA,GAAA;AAAA,MAClC,KAAM,CAAA,MAAA,CAAO,CAAC,CAAA,EAAG,YAAY,SAAU,CAAA,QAAA;AAAA,MACvC,eAAA;AAAA,MACA,SAAU,CAAA,GAAA;AAAA,MACV,SAAU,CAAA,QAAA;AAAA,MACV,eAAA;AAAA,MAAA,cAAA;AAAA,KAEJ,CAAA;AAEA,IAAA,MAAM,WAAW,SAAU,CAAA,MAAA,GAAS,CAAC,CAAK,IAAA,SAAA,CAAU,oBAAoB,SAAU,CAAA,SAAA,CAAA;AAClF,IAAM,MAAA,aAAA,GAAgB,WAAY,QAAS,CAAA,UAAA,CAAW,GAAG,CAAI,GAAA,QAAA,GAAW,CAAI,CAAA,EAAA,QAAQ,CAAM,CAAA,GAAA,SAAA,CAAA;AAE1F,IAAM,MAAA,WAAA,GAA0C,SAAU,CAAA,WAAA,IAAe,EAAC,CAAA;AAC1E,IAAA,MAAM,aAAgB,GAAA,qBAAA,CAAsB,KAAM,CAAA,MAAA,EAAQ,YAAY,WAAW,CAAA,CAAA;AACjF,IAAM,MAAA,OAAA,GAAU,WAAW,MAAS,GAAA,CAAA,CAAA;AAEpC,IAAA,MAAM,QAAqB,GAAA;AAAA,MACvB,IAAIA,EAAK,EAAA;AAAA,MACT,SAAA;AAAA,MACA,uBAAuB,SAAU,CAAA,OAAA;AAAA,MACjC,UAAA;AAAA,MACA,WAAA;AAAA,MACA,eAAA;AAAA,MACA,SAAA;AAAA,MACA,oBAAoB,UAAW,CAAA,YAAA;AAAA,MAC/B,YAAY,UAAW,CAAA,KAAA;AAAA,MACvB,wBAA0B,EAAA,eAAA;AAAA,MAC1B,KAAK,SAAU,CAAA,GAAA;AAAA,MACf,UAAU,SAAU,CAAA,QAAA;AAAA,MACpB,mBAAqB,EAAA,CAAA;AAAA,MACrB,kBAAoB,EAAA,CAAA;AAAA,MACpB,aAAA,EAAe,EAAE,GAAG,sBAAuB,EAAA;AAAA,MAC3C,uBAAyB,EAAA,IAAA;AAAA,MACzB,QAAU,EAAA,qBAAA,CAAsB,aAAe,EAAA,CAAA,EAAG,OAAO,CAAA;AAAA,MACzD,MAAQ,EAAA,CAAA;AAAA,MACR,KAAO,EAAA,KAAA;AAAA,MACP,MAAQ,EAAA,KAAA;AAAA,MACR,KAAO,EAAA,aAAA;AAAA,MACP,OAAA,EAAS,UAAU,OAAW,IAAA,EAAA;AAAA,MAC9B,WAAa,EAAA,SAAA,CAAU,IAAQ,IAAA,SAAA,CAAU,gBAAoB,IAAA,UAAA;AAAA,MAC7D,UAAA,EAAY,UAAU,iBAAqB,IAAA,SAAA;AAAA,MAC3C,QAAU,EAAA,KAAA;AAAA,KACd,CAAA;AAEA,IAAA,MAAM,aAAgB,GAAA,CAAC,GAAG,KAAA,CAAM,QAAQ,QAAQ,CAAA,CAAA;AAEhD,IAAA,IAAI,YAAc,EAAA;AACd,MAAI,GAAA,CAAA;AAAA,QACA,WAAA;AAAA,QACA,aAAe,EAAA,WAAA;AAAA,QACf,oBAAsB,EAAA,eAAA;AAAA,QACtB,MAAQ,EAAA,aAAA;AAAA,OACX,CAAA,CAAA;AAAA,KACE,MAAA;AACH,MAAA,GAAA,CAAI,EAAE,MAAQ,EAAA,sBAAA,CAAuB,aAAe,EAAA,eAAe,GAAG,CAAA,CAAA;AAAA,KAC1E;AACA,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AACrB,IAAO,OAAA,QAAA,CAAA;AAAA,GACX;AAAA,EAEA,WAAA,EAAa,CAAC,OAAoB,KAAA;AAC9B,IAAA,GAAA,GAAM,QAAS,EAAA,CAAA;AACf,IAAA,MAAM,QAAQ,GAAI,EAAA,CAAA;AAClB,IAAM,MAAA,QAAA,GAAW,MAAM,MAAO,CAAA,MAAA,CAAO,CAAC,CAAM,KAAA,CAAA,CAAE,OAAO,OAAO,CAAA,CAAA;AAE5D,IAAI,IAAA,QAAA,CAAS,WAAW,CAAG,EAAA;AACvB,MAAI,GAAA,CAAA,EAAE,MAAQ,EAAA,EAAI,EAAA,WAAA,EAAa,GAAG,aAAe,EAAA,CAAA,EAAG,oBAAsB,EAAA,CAAA,EAAG,CAAA,CAAA;AAC7E,MAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AACrB,MAAA,OAAA;AAAA,KACJ;AAEA,IAAA,IAAI,KAAM,CAAA,MAAA,CAAO,CAAC,CAAA,EAAG,OAAO,OAAS,EAAA;AACjC,MAAM,MAAA,SAAA,GAAY,SAAS,CAAC,CAAA,CAAA;AAC5B,MAAA,MAAM,kBAAkB,SAAU,CAAA,eAAA,CAAA;AAClC,MAAA,MAAM,cAAc,SAAU,CAAA,SAAA,CAAA;AAC9B,MAAI,GAAA,CAAA;AAAA,QACA,WAAA;AAAA,QACA,aAAe,EAAA,WAAA;AAAA,QACf,oBAAsB,EAAA,eAAA;AAAA,QACtB,MAAA,EAAQ,sBAAuB,CAAA,QAAA,EAAU,eAAe,CAAA;AAAA,OAC3D,CAAA,CAAA;AAAA,KACE,MAAA;AACH,MAAI,GAAA,CAAA,EAAE,MAAQ,EAAA,QAAA,EAAU,CAAA,CAAA;AAAA,KAC5B;AACA,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AAAA,GACzB;AAAA,EAEA,YAAA,EAAc,CAAC,OAAA,EAAiB,QAAqB,KAAA;AACjD,IAAA,GAAA,GAAM,QAAS,EAAA,CAAA;AACf,IAAA,MAAM,QAAQ,GAAI,EAAA,CAAA;AAClB,IAAA,MAAM,MAAS,GAAA,CAAC,GAAG,KAAA,CAAM,MAAM,CAAA,CAAA;AAC/B,IAAA,MAAM,aAAa,MAAO,CAAA,SAAA,CAAU,CAAC,CAAM,KAAA,CAAA,CAAE,OAAO,OAAO,CAAA,CAAA;AAC3D,IAAA,IAAI,eAAe,CAAI,CAAA,EAAA,OAAA;AACvB,IAAA,MAAM,CAAC,KAAK,CAAA,GAAI,MAAO,CAAA,MAAA,CAAO,YAAY,CAAC,CAAA,CAAA;AAC3C,IAAM,MAAA,YAAA,GAAe,KAAK,GAAI,CAAA,CAAA,EAAG,KAAK,GAAI,CAAA,QAAA,EAAU,MAAO,CAAA,MAAM,CAAC,CAAA,CAAA;AAClE,IAAO,MAAA,CAAA,MAAA,CAAO,YAAc,EAAA,CAAA,EAAG,KAAK,CAAA,CAAA;AAEpC,IAAM,MAAA,SAAA,GAAY,OAAO,CAAC,CAAA,CAAA;AAC1B,IAAA,MAAM,WAAc,GAAA,KAAA,CAAM,MAAO,CAAA,CAAC,CAAG,EAAA,EAAA,CAAA;AACrC,IAAI,IAAA,SAAA,CAAU,OAAO,WAAa,EAAA;AAC9B,MAAA,MAAM,kBAAkB,SAAU,CAAA,eAAA,CAAA;AAClC,MAAA,MAAM,cAAc,SAAU,CAAA,SAAA,CAAA;AAC9B,MAAI,GAAA,CAAA;AAAA,QACA,WAAA;AAAA,QACA,aAAe,EAAA,WAAA;AAAA,QACf,oBAAsB,EAAA,eAAA;AAAA,QACtB,MAAA,EAAQ,sBAAuB,CAAA,MAAA,EAAQ,eAAe,CAAA;AAAA,OACzD,CAAA,CAAA;AAAA,KACE,MAAA;AACH,MAAI,GAAA,CAAA,EAAE,QAAQ,CAAA,CAAA;AAAA,KAClB;AACA,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AAAA,GACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,gBAAA,EAAkB,CAAC,MAA6B,KAAA;AAC5C,IAAI,GAAA,CAAA,EAAE,aAAe,EAAA,MAAA,CAAO,GAAI,CAAA,CAAC,EAAQ,MAAA,EAAE,GAAG,EAAA,EAAK,CAAA,CAAA,EAAG,CAAA,CAAA;AACtD,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AAAA,GACzB;AAAA,EAEA,gBAAA,EAAkB,CAAC,MAA6B,KAAA;AAC5C,IAAI,IAAA,MAAA,CAAO,WAAW,CAAG,EAAA,OAAA;AACzB,IAAA,GAAA,CAAI,CAAC,KAAW,MAAA;AAAA,MACZ,aAAe,EAAA,CAAC,GAAG,KAAA,CAAM,eAAe,GAAG,MAAA,CAAO,GAAI,CAAA,CAAC,EAAQ,MAAA,EAAE,GAAG,EAAA,GAAK,CAAC,CAAA;AAAA,KAC5E,CAAA,CAAA,CAAA;AACF,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AAAA,GACzB;AAAA,EAEA,oBAAA,EAAsB,CAAC,KAAkB,KAAA;AACrC,IAAA,GAAA,CAAI,CAAC,KAAU,KAAA;AACX,MAAA,IAAI,QAAQ,CAAK,IAAA,KAAA,IAAS,KAAM,CAAA,aAAA,CAAc,QAAe,OAAA,KAAA,CAAA;AAC7D,MAAM,MAAA,IAAA,GAAO,KAAM,CAAA,aAAA,CAAc,KAAM,EAAA,CAAA;AACvC,MAAK,IAAA,CAAA,MAAA,CAAO,OAAO,CAAC,CAAA,CAAA;AACpB,MAAO,OAAA,EAAE,eAAe,IAAK,EAAA,CAAA;AAAA,KAChC,CAAA,CAAA;AACD,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AAAA,GACzB;AAAA,EAEA,oBAAoB,MAAM;AACtB,IAAA,IAAI,GAAI,EAAA,CAAE,aAAc,CAAA,MAAA,KAAW,CAAG,EAAA,OAAA;AACtC,IAAA,GAAA,CAAI,EAAE,aAAA,EAAe,EAAC,EAAG,CAAA,CAAA;AACzB,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AAAA,GACzB;AAAA;AAAA;AAAA;AAAA,EAMA,oBAAsB,EAAA,CAAC,OAAiB,EAAA,SAAA,EAAmB,GAAgB,KAAA;AAOvE,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AACrB,IAAA,GAAA,CAAI,CAAC,KAAW,MAAA;AAAA,MACZ,MAAA,EAAQ,MAAM,MAAO,CAAA,GAAA;AAAA,QAAI,CAAC,CAAA,KACtB,CAAE,CAAA,EAAA,KAAO,OACH,GAAA;AAAA,UACI,GAAG,CAAA;AAAA,UACH,QAAA,EAAU,EAAE,QAAS,CAAA,GAAA;AAAA,YAAI,CAAC,EAAA,KACtB,EAAG,CAAA,SAAA,KAAc,SACX,GAAA,EAAE,GAAG,EAAA,EAAI,gBAAkB,EAAA,IAAA,CAAK,KAAM,CAAA,GAAG,GACzC,GAAA,EAAA;AAAA,WACV;AAAA,SAEJ,GAAA,CAAA;AAAA,OACV;AAAA,KACF,CAAA,CAAA,CAAA;AAAA,GACN;AAAA,EAEA,WAAa,EAAA,CAAC,OAAiB,EAAA,SAAA,EAAmB,WAAmB,OAAoB,KAAA;AACrF,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AACrB,IAAA,GAAA,CAAI,CAAC,KAAW,MAAA;AAAA,MACZ,MAAQ,EAAA,KAAA,CAAM,MAAO,CAAA,GAAA,CAAI,CAAC,CAAM,KAAA;AAC5B,QAAI,IAAA,CAAA,CAAE,EAAO,KAAA,OAAA,EAAgB,OAAA,CAAA,CAAA;AAC7B,QAAM,MAAA,MAAA,GAAS,CAAE,CAAA,UAAA,CAAW,MAAS,GAAA,CAAA,CAAA;AACrC,QAAO,OAAA;AAAA,UACH,GAAG,CAAA;AAAA,UACH,QAAA,EAAU,EAAE,QAAS,CAAA,GAAA;AAAA,YAAI,CAAC,EAAA,KACtB,EAAG,CAAA,SAAA,KAAc,SACX,GAAA;AAAA,cACI,GAAG,EAAA;AAAA,cACH,YAAA,EAAc,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,IAAA,CAAK,GAAI,CAAA,IAAA,CAAK,KAAM,CAAA,SAAS,CAAG,EAAA,MAAM,CAAC,CAAA;AAAA,cACjE,UAAA,EAAY,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,IAAA,CAAK,GAAI,CAAA,IAAA,CAAK,KAAM,CAAA,OAAO,CAAG,EAAA,MAAM,CAAC,CAAA;AAAA,aAEjE,GAAA,EAAA;AAAA,WACV;AAAA,SACJ,CAAA;AAAA,OACH,CAAA;AAAA,KACH,CAAA,CAAA,CAAA;AAAA,GACN;AAAA,EAEA,qBAAA,EAAuB,CAAC,OAAA,EAAiB,GAAgB,KAAA;AAGrD,IAAA,GAAA,CAAI,CAAC,KAAW,MAAA;AAAA,MACZ,MAAA,EAAQ,MAAM,MAAO,CAAA,GAAA;AAAA,QAAI,CAAC,CAAA,KACtB,CAAE,CAAA,EAAA,KAAO,OACH,GAAA;AAAA,UACI,GAAG,CAAA;AAAA,UACH,QAAU,EAAA,CAAA,CAAE,QAAS,CAAA,GAAA,CAAI,CAAC,EAAQ,MAAA;AAAA,YAC9B,GAAG,EAAA;AAAA,YACH,gBAAA,EAAkB,IAAK,CAAA,KAAA,CAAM,GAAG,CAAA;AAAA,WAClC,CAAA,CAAA;AAAA,SAEN,GAAA,CAAA;AAAA,OACV;AAAA,KACF,CAAA,CAAA,CAAA;AAAA,GACN;AAAA,EAEA,YAAc,EAAA,CAAC,OAAiB,EAAA,SAAA,EAAmB,OAAoB,KAAA;AACnE,IAAA,GAAA,CAAI,CAAC,KAAW,MAAA;AAAA,MACZ,MAAQ,EAAA,KAAA,CAAM,MAAO,CAAA,GAAA,CAAI,CAAC,CAAM,KAAA;AAC5B,QAAI,IAAA,CAAA,CAAE,EAAO,KAAA,OAAA,EAAgB,OAAA,CAAA,CAAA;AAC7B,QAAM,MAAA,MAAA,GAAS,CAAE,CAAA,UAAA,CAAW,MAAS,GAAA,CAAA,CAAA;AACrC,QAAO,OAAA;AAAA,UACH,GAAG,CAAA;AAAA,UACH,QAAU,EAAA,CAAA,CAAE,QAAS,CAAA,GAAA,CAAI,CAAC,EAAQ,MAAA;AAAA,YAC9B,GAAG,EAAA;AAAA,YACH,YAAA,EAAc,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,IAAA,CAAK,GAAI,CAAA,IAAA,CAAK,KAAM,CAAA,SAAS,CAAG,EAAA,MAAM,CAAC,CAAA;AAAA,YACjE,UAAA,EAAY,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,IAAA,CAAK,GAAI,CAAA,IAAA,CAAK,KAAM,CAAA,OAAO,CAAG,EAAA,MAAM,CAAC,CAAA;AAAA,WAC/D,CAAA,CAAA;AAAA,SACN,CAAA;AAAA,OACH,CAAA;AAAA,KACH,CAAA,CAAA,CAAA;AAAA,GACN;AAAA;AAAA;AAAA;AAAA,EAMA,UAAA,EAAY,CAAC,IAAA,KAAiB,GAAI,CAAA,EAAE,SAAS,IAAK,CAAA,IAAA,EAAU,IAAA,cAAA,EAAgB,CAAA;AAAA,EAE5E,aAAa,CAAC,IAAA,KAAsB,IAAI,EAAE,QAAA,EAAU,MAAM,CAAA;AAAA,EAE1D,kBAAkB,CAAC,EAAA,KAAgB,IAAI,EAAE,aAAA,EAAe,IAAI,CAAA;AAAA,EAC5D,mBAAA,EAAqB,MAAM,GAAA,CAAI,CAAC,KAAA,MAAW,EAAE,aAAe,EAAA,CAAC,KAAM,CAAA,aAAA,EAAgB,CAAA,CAAA;AAAA,EAEnF,uBAAA,EAAyB,CAAC,CAAA,KAAM,GAAI,CAAA;AAAA,IAChC,oBAAA,EAAsB,KAAK,GAAI,CAAA,CAAA,EAAG,KAAK,GAAI,CAAA,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,GACnD,CAAA;AAAA,EACD,0BAAA,EAA4B,CAAC,CAAA,KAAM,GAAI,CAAA;AAAA,IACnC,uBAAA,EAAyB,KAAK,GAAI,CAAA,CAAA,EAAG,KAAK,GAAI,CAAA,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,GACtD,CAAA;AAAA,EACD,wBAAA,EAA0B,MAAM,GAAI,CAAA;AAAA,IAChC,oBAAsB,EAAA,GAAA;AAAA,IACtB,uBAAyB,EAAA,CAAA;AAAA,GAC5B,CAAA;AAAA,EACD,2BAA2B,MAAM;AAC7B,IAAA,MAAM,IAAI,GAAI,EAAA,CAAA;AAOd,IAAA,MAAM,UAA0D,EAAC,CAAA;AACjE,IAAI,IAAA,CAAA,CAAE,yBAAyB,GAAK,EAAA;AAGhC,MAAQ,OAAA,CAAA,WAAA,GAAc,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,IAAA,CAAK,IAAI,CAAG,EAAA,CAAA,GAAI,CAAE,CAAA,oBAAoB,CAAC,CAAA,CAAA;AAAA,KAC7E;AACA,IAAI,IAAA,CAAA,CAAE,4BAA4B,CAAG,EAAA;AACjC,MAAQ,OAAA,CAAA,qBAAA,GAAwB,KAAK,GAAI,CAAA,CAAA,EAAG,KAAK,GAAI,CAAA,CAAA,EAAG,CAAE,CAAA,uBAAuB,CAAC,CAAA,CAAA;AAAA,KACtF;AACA,IAAA,IAAI,OAAO,IAAK,CAAA,OAAO,EAAE,MAAW,KAAA,CAAA,SAAU,EAAC,CAAA;AAC/C,IAAA,OAAO,EAAE,OAAQ,EAAA,CAAA;AAAA,GACrB;AAAA,EAEA,iBAAiB,CAAC,IAAA,KAAwB,IAAI,EAAE,YAAA,EAAc,MAAM,CAAA;AAAA,EACpE,aAAA,EAAe,CAAC,MAAiC,KAAA;AAE7C,IAAI,IAAA,MAAA,CAAO,WAAW,CAAG,EAAA;AACrB,MAAA,GAAA,CAAI,EAAE,UAAY,EAAA,EAAI,EAAA,cAAA,EAAgB,MAAM,CAAA,CAAA;AAC5C,MAAA,OAAA;AAAA,KACJ;AACA,IAAM,MAAA,OAAA,GAAU,MAAO,CAAA,CAAC,CAAE,CAAA,OAAA,CAAA;AAC1B,IAAM,MAAA,QAAA,GAAW,MAAO,CAAA,MAAA,CAAO,CAAC,CAAA,KAAM,CAAE,CAAA,OAAA,KAAY,OAAW,IAAA,CAAA,CAAE,MAAS,GAAA,CAAA,CAAE,QAAQ,CAAA,CAAA;AAEpF,IAAM,MAAA,MAAA,uBAAa,GAAgC,EAAA,CAAA;AACnD,IAAA,KAAA,MAAW,KAAK,QAAU,EAAA,MAAA,CAAO,GAAI,CAAA,CAAA,CAAE,WAAW,CAAC,CAAA,CAAA;AACnD,IAAA,MAAM,IAAO,GAAA,KAAA,CAAM,IAAK,CAAA,MAAA,CAAO,QAAQ,CAAA,CAAE,IAAK,CAAA,CAAC,CAAG,EAAA,CAAA,KAAM,CAAE,CAAA,SAAA,GAAY,EAAE,SAAS,CAAA,CAAA;AACjF,IAAI,GAAA,CAAA,EAAE,YAAY,IAAM,EAAA,cAAA,EAAgB,KAAK,CAAC,CAAA,IAAK,MAAM,CAAA,CAAA;AAAA,GAC7D;AAAA,EACA,YAAA,EAAc,CAAC,KAA8B,KAAA;AACzC,IAAI,IAAA,KAAA,CAAM,MAAU,IAAA,KAAA,CAAM,QAAU,EAAA,OAAA;AACpC,IAAM,MAAA,OAAA,GAAU,KAAM,CAAA,UAAA,CAAA;AAEtB,IAAI,IAAA,OAAA,CAAQ,SAAS,CAAK,IAAA,OAAA,CAAQ,CAAC,CAAE,CAAA,OAAA,KAAY,MAAM,OAAS,EAAA;AAC5D,MAAA,GAAA,CAAI,EAAE,UAAY,EAAA,CAAC,KAAK,CAAG,EAAA,cAAA,EAAgB,OAAO,CAAA,CAAA;AAClD,MAAA,OAAA;AAAA,KACJ;AACA,IAAM,MAAA,MAAA,uBAAa,GAAgC,EAAA,CAAA;AACnD,IAAA,KAAA,MAAW,KAAK,OAAS,EAAA,MAAA,CAAO,GAAI,CAAA,CAAA,CAAE,WAAW,CAAC,CAAA,CAAA;AAClD,IAAO,MAAA,CAAA,GAAA,CAAI,KAAM,CAAA,SAAA,EAAW,KAAK,CAAA,CAAA;AACjC,IAAA,MAAM,IAAO,GAAA,KAAA,CAAM,IAAK,CAAA,MAAA,CAAO,QAAQ,CAAA,CAAE,IAAK,CAAA,CAAC,CAAG,EAAA,CAAA,KAAM,CAAE,CAAA,SAAA,GAAY,EAAE,SAAS,CAAA,CAAA;AACjF,IAAI,GAAA,CAAA,EAAE,YAAY,IAAM,EAAA,cAAA,EAAgB,KAAK,CAAC,CAAA,IAAK,MAAM,CAAA,CAAA;AAAA,GAC7D;AAAA,EACA,eAAA,EAAiB,MAAM,GAAI,CAAA,EAAE,YAAY,EAAC,EAAG,cAAgB,EAAA,IAAA,EAAM,CAAA;AAAA,EACnE,iBAAA,EAAmB,CAAC,KAAqC,KAAA;AACrD,IAAA,IAAI,CAAC,KAAA,IAAS,KAAM,CAAA,MAAA,IAAU,MAAM,QAAU,EAAA;AAC1C,MAAA,GAAA,CAAI,EAAE,UAAY,EAAA,EAAI,EAAA,cAAA,EAAgB,MAAM,CAAA,CAAA;AAC5C,MAAA,OAAA;AAAA,KACJ;AACA,IAAA,GAAA,CAAI,EAAE,UAAY,EAAA,CAAC,KAAK,CAAG,EAAA,cAAA,EAAgB,OAAO,CAAA,CAAA;AAAA,GACtD;AAAA,EAEA,mBAAA,EAAqB,CAAC,OAA8B,KAAA;AAChD,IAAI,IAAA,OAAA,CAAQ,WAAW,CAAG,EAAA;AACtB,MAAA,GAAA,CAAI,EAAE,gBAAkB,EAAA,EAAI,EAAA,SAAA,EAAW,MAAM,CAAA,CAAA;AAC7C,MAAA,OAAA;AAAA,KACJ;AACA,IAAM,MAAA,OAAA,GAAU,OAAQ,CAAA,CAAC,CAAE,CAAA,OAAA,CAAA;AAC3B,IAAM,MAAA,QAAA,GAAW,OAAQ,CAAA,MAAA,CAAO,CAAC,CAAA,KAAM,CAAE,CAAA,OAAA,KAAY,OAAW,IAAA,CAAA,CAAE,YAAe,GAAA,CAAA,CAAE,cAAc,CAAA,CAAA;AACjG,IAAM,MAAA,MAAA,uBAAa,GAA4B,EAAA,CAAA;AAC/C,IAAA,KAAA,MAAW,KAAK,QAAU,EAAA,MAAA,CAAO,GAAI,CAAA,CAAA,CAAE,WAAW,CAAC,CAAA,CAAA;AACnD,IAAA,MAAM,IAAO,GAAA,KAAA,CAAM,IAAK,CAAA,MAAA,CAAO,QAAQ,CAAA,CAAE,IAAK,CAAA,CAAC,CAAG,EAAA,CAAA,KAAM,CAAE,CAAA,SAAA,GAAY,EAAE,SAAS,CAAA,CAAA;AACjF,IAAI,GAAA,CAAA,EAAE,kBAAkB,IAAM,EAAA,SAAA,EAAW,KAAK,CAAC,CAAA,IAAK,MAAM,CAAA,CAAA;AAAA,GAC9D;AAAA,EACA,YAAA,EAAc,CAAC,KAAiC,KAAA;AAC5C,IAAA,IAAI,CAAC,KAAO,EAAA;AACR,MAAA,GAAA,CAAI,EAAE,gBAAkB,EAAA,EAAI,EAAA,SAAA,EAAW,MAAM,CAAA,CAAA;AAC7C,MAAA,OAAA;AAAA,KACJ;AACA,IAAA,GAAA,CAAI,EAAE,gBAAkB,EAAA,CAAC,KAAK,CAAG,EAAA,SAAA,EAAW,OAAO,CAAA,CAAA;AAAA,GACvD;AAAA;AAAA,EAGA,UAAU,MAAM;AACZ,IAAA,MAAM,QAAQ,GAAI,EAAA,CAAA;AAClB,IAAM,MAAA,IAAA,GAAO,gBAAgB,KAAK,CAAA,CAAA;AAClC,IAAA,MAAM,KAAQ,GAAA,CAAC,GAAG,KAAA,CAAM,YAAY,IAAI,CAAA,CAAA;AACxC,IAAA,IAAI,KAAM,CAAA,MAAA,GAAS,QAAU,EAAA,KAAA,CAAM,KAAM,EAAA,CAAA;AACzC,IAAA,GAAA,CAAI,EAAE,UAAY,EAAA,KAAA,EAAO,UAAY,EAAA,IAAI,CAAA,CAAA;AAAA,GAC7C;AAAA,EAEA,MAAM,MAAM;AACR,IAAA,MAAM,QAAQ,GAAI,EAAA,CAAA;AAClB,IAAI,IAAA,KAAA,CAAM,UAAW,CAAA,MAAA,KAAW,CAAG,EAAA,OAAA;AACnC,IAAA,MAAM,KAAQ,GAAA,CAAC,GAAG,KAAA,CAAM,UAAU,CAAA,CAAA;AAClC,IAAM,MAAA,IAAA,GAAO,MAAM,GAAI,EAAA,CAAA;AACvB,IAAM,MAAA,QAAA,GAAW,gBAAgB,KAAK,CAAA,CAAA;AACtC,IAAI,GAAA,CAAA;AAAA,MACA,GAAG,IAAA;AAAA,MACH,UAAY,EAAA,KAAA;AAAA,MACZ,UAAY,EAAA,CAAC,GAAG,KAAA,CAAM,YAAY,QAAQ,CAAA;AAAA,KAC7C,CAAA,CAAA;AACD,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AAAA,GACzB;AAAA,EAEA,MAAM,MAAM;AACR,IAAA,MAAM,QAAQ,GAAI,EAAA,CAAA;AAClB,IAAI,IAAA,KAAA,CAAM,UAAW,CAAA,MAAA,KAAW,CAAG,EAAA,OAAA;AACnC,IAAA,MAAM,KAAQ,GAAA,CAAC,GAAG,KAAA,CAAM,UAAU,CAAA,CAAA;AAClC,IAAM,MAAA,IAAA,GAAO,MAAM,GAAI,EAAA,CAAA;AACvB,IAAM,MAAA,QAAA,GAAW,gBAAgB,KAAK,CAAA,CAAA;AACtC,IAAI,GAAA,CAAA;AAAA,MACA,GAAG,IAAA;AAAA,MACH,UAAY,EAAA,CAAC,GAAG,KAAA,CAAM,YAAY,QAAQ,CAAA;AAAA,MAC1C,UAAY,EAAA,KAAA;AAAA,KACf,CAAA,CAAA;AACD,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AAAA,GACzB;AAAA,EAEA,OAAS,EAAA,MAAM,GAAI,EAAA,CAAE,WAAW,MAAS,GAAA,CAAA;AAAA,EACzC,OAAS,EAAA,MAAM,GAAI,EAAA,CAAE,WAAW,MAAS,GAAA,CAAA;AAAA,EAEzC,YAAY,CAAC,OAAA,KAAqB,IAAI,EAAE,SAAA,EAAW,SAAS,CAAA;AAAA,EAE5D,cAAA,EAAgB,CAAC,GAAA,KAAgB,GAAI,CAAA,EAAE,WAAa,EAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA;AAAA,EAEtE,cAAA,EAAgB,CAAC,GAAgB,KAAA;AAC7B,IAAA,MAAM,QAAQ,GAAI,EAAA,CAAA;AAClB,IAAM,MAAA,eAAA,GAAkB,iBAAiB,GAAG,CAAA,CAAA;AAC5C,IAAI,GAAA,CAAA;AAAA,MACA,WAAa,EAAA,GAAA;AAAA,MACb,oBAAsB,EAAA,eAAA;AAAA,MACtB,MAAQ,EAAA,sBAAA,CAAuB,KAAM,CAAA,MAAA,EAAQ,eAAe,CAAA;AAAA,KAC/D,CAAA,CAAA;AAAA,GACL;AAAA,EAEA,uBAAuB,CAAC,IAAA,KAAiB,IAAI,EAAE,kBAAA,EAAoB,MAAM,CAAA;AAAA,EAEzE,eAAe,CAAC,MAAA,KAAW,IAAI,EAAE,UAAA,EAAY,QAAQ,CAAA;AAAA,EAErD,kBAAoB,EAAA,CAAC,CAAc,KAAA,GAAA,CAAI,EAAE,eAAiB,EAAA,IAAA,CAAK,GAAI,CAAA,CAAA,EAAG,IAAK,CAAA,KAAA,CAAM,CAAC,CAAC,GAAG,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWtF,OAAA,EAAS,CAAC,IAAS,KAAA;AACf,IAAA,GAAA,GAAM,QAAS,EAAA,CAAA;AACf,IAAA,MAAM,KAAKA,EAAK,EAAA,CAAA;AAChB,IAAM,MAAA,IAAA,GAAoB,EAAE,GAAG,IAAA,EAAM,IAAI,SAAW,EAAA,IAAA,CAAK,KAAM,EAAA,CAAA;AAC/D,IAAA,GAAA,CAAI,EAAE,KAAO,EAAA,CAAC,GAAG,GAAI,EAAA,CAAE,OAAO,IAAI,CAAA,CAAE,IAAK,CAAA,CAAC,GAAG,CAAM,KAAA,CAAA,CAAE,WAAW,CAAE,CAAA,QAAQ,GAAG,CAAA,CAAA;AAC7E,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AACrB,IAAO,OAAA,EAAA,CAAA;AAAA,GACX;AAAA,EAEA,UAAA,EAAY,CAAC,EAAA,EAAI,KAAU,KAAA;AACvB,IAAM,MAAA,QAAA,GAAW,KAAM,CAAA,KAAA,CAAM,KAAK,CAAC,CAAA,KAAM,CAAE,CAAA,EAAA,KAAO,EAAE,CAAA,CAAA;AACpD,IAAA,IAAI,CAAC,QAAU,EAAA,OAAA;AACf,IAAA,GAAA,GAAM,QAAS,EAAA,CAAA;AACf,IAAI,GAAA,CAAA;AAAA,MACA,KAAA,EAAO,GAAI,EAAA,CAAE,KACR,CAAA,GAAA,CAAI,CAAC,CAAO,KAAA,CAAA,CAAE,EAAO,KAAA,EAAA,GAAK,EAAE,GAAG,GAAG,GAAG,KAAA,EAAU,GAAA,CAAE,CACjD,CAAA,IAAA,CAAK,CAAC,CAAA,EAAG,CAAM,KAAA,CAAA,CAAE,QAAW,GAAA,CAAA,CAAE,QAAQ,CAAA;AAAA,KAC9C,CAAA,CAAA;AACD,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AAAA,GACzB;AAAA,EAEA,UAAA,EAAY,CAAC,EAAO,KAAA;AAChB,IAAI,IAAA,CAAC,GAAI,EAAA,CAAE,KAAM,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,EAAO,KAAA,EAAE,CAAG,EAAA,OAAA;AAC3C,IAAA,GAAA,GAAM,QAAS,EAAA,CAAA;AACf,IAAA,GAAA,CAAI,EAAE,KAAA,EAAO,GAAI,EAAA,CAAE,KAAM,CAAA,MAAA,CAAO,CAAC,CAAA,KAAM,CAAE,CAAA,EAAA,KAAO,EAAE,CAAA,EAAG,CAAA,CAAA;AACrD,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AAAA,GACzB;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAgB,CAAC,OAAA,EAAS,MACtB,KAAA,GAAA,CAAI,CAAC,KAAW,MAAA;AAAA,IACZ,MAAA,EAAQ,MAAM,MAAO,CAAA,GAAA;AAAA,MAAI,CAAC,CACtB,KAAA,CAAA,CAAE,OAAO,OAAU,GAAA,EAAE,GAAG,CAAG,EAAA,MAAA,EAAQ,IAAK,CAAA,GAAA,CAAI,GAAG,IAAK,CAAA,GAAA,CAAI,GAAG,MAAM,CAAC,GAAM,GAAA,CAAA;AAAA,KAC5E;AAAA,GACF,CAAA,CAAA;AAAA,EAEN,eAAe,CAAC,OAAA,EAAS,KACrB,KAAA,GAAA,CAAI,CAAC,KAAW,MAAA;AAAA,IACZ,MAAQ,EAAA,KAAA,CAAM,MAAO,CAAA,GAAA,CAAI,CAAC,CAAO,KAAA,CAAA,CAAE,EAAO,KAAA,OAAA,GAAU,EAAE,GAAG,CAAG,EAAA,KAAA,KAAU,CAAE,CAAA;AAAA,GAC1E,CAAA,CAAA;AAAA,EAEN,gBAAgB,CAAC,OAAA,EAAS,MACtB,KAAA,GAAA,CAAI,CAAC,KAAW,MAAA;AAAA,IACZ,MAAQ,EAAA,KAAA,CAAM,MAAO,CAAA,GAAA,CAAI,CAAC,CAAO,KAAA,CAAA,CAAE,EAAO,KAAA,OAAA,GAAU,EAAE,GAAG,CAAG,EAAA,MAAA,KAAW,CAAE,CAAA;AAAA,GAC3E,CAAA,CAAA;AAAA,EAEN,kBAAkB,CAAC,OAAA,EAAS,QACxB,KAAA,GAAA,CAAI,CAAC,KAAW,MAAA;AAAA,IACZ,MAAQ,EAAA,KAAA,CAAM,MAAO,CAAA,GAAA,CAAI,CAAC,CAAO,KAAA,CAAA,CAAE,EAAO,KAAA,OAAA,GAAU,EAAE,GAAG,CAAG,EAAA,QAAA,KAAa,CAAE,CAAA;AAAA,GAC7E,CAAA,CAAA;AAAA,EAEN,iBAAA,EAAmB,CAAC,OAAA,EAAS,SAAc,KAAA;AACvC,IAAA,GAAA,CAAI,CAAC,KAAW,MAAA;AAAA,MACZ,MAAA,EAAQ,MAAM,MAAO,CAAA,GAAA;AAAA,QAAI,CAAC,CACtB,KAAA,CAAA,CAAE,OAAO,OAAU,GAAA,EAAE,GAAG,CAAG,EAAA,kBAAA,EAAoB,IAAK,CAAA,GAAA,CAAI,KAAK,IAAK,CAAA,GAAA,CAAI,IAAI,SAAS,CAAC,GAAM,GAAA,CAAA;AAAA,OAC9F;AAAA,KACF,CAAA,CAAA,CAAA;AACF,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AAAA,GACzB;AAAA,EAEA,qBAAA,EAAuB,CAAC,OAAA,EAAS,QAAa,KAAA;AAC1C,IAAA,GAAA,CAAI,CAAC,KAAW,MAAA;AAAA,MACZ,MAAA,EAAQ,MAAM,MAAO,CAAA,GAAA;AAAA,QAAI,CAAC,CAAA,KACtB,CAAE,CAAA,EAAA,KAAO,OAAU,GAAA,EAAE,GAAG,CAAA,EAAG,aAAe,EAAA,EAAE,GAAG,QAAA,IAAe,GAAA,CAAA;AAAA,OAClE;AAAA,KACF,CAAA,CAAA,CAAA;AACF,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AAAA,GACzB;AAAA,EAEA,0BAAA,EAA4B,CAAC,OAAA,EAAS,OAAY,KAAA;AAC9C,IAAA,GAAA,CAAI,CAAC,KAAW,MAAA;AAAA,MACZ,MAAA,EAAQ,MAAM,MAAO,CAAA,GAAA;AAAA,QAAI,CAAC,CACtB,KAAA,CAAA,CAAE,EAAO,KAAA,OAAA,GAAU,EAAE,GAAG,CAAA,EAAG,uBAAyB,EAAA,OAAA,EAAY,GAAA,CAAA;AAAA,OACpE;AAAA,KACF,CAAA,CAAA,CAAA;AACF,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AAAA,GACzB;AAAA;AAAA;AAAA;AAAA,EAMA,sBAAA,EAAwB,CAAC,OAAA,EAAS,WAAgB,KAAA;AAC9C,IAAA,GAAA,GAAM,QAAS,EAAA,CAAA;AACf,IAAA,GAAA,CAAI,CAACC,MAAW,MAAA;AAAA,MACZ,MAAQA,EAAAA,MAAAA,CAAM,MAAO,CAAA,GAAA,CAAI,CAAC,CAAM,KAAA;AAC5B,QAAI,IAAA,CAAA,CAAE,EAAO,KAAA,OAAA,EAAgB,OAAA,CAAA,CAAA;AAE7B,QAAM,MAAA,KAAA,GAAQ,EAAE,SAAU,CAAA,KAAA,CAAA;AAC1B,QAAA,IAAI,CAAC,KAAA,IAAS,KAAM,CAAA,MAAA,KAAW,GAAU,OAAA,CAAA,CAAA;AAEzC,QAAM,MAAA,aAAA,GAAgB,qBAAsB,CAAA,KAAA,EAAO,WAAW,CAAA,CAAA;AAG9D,QAAI,IAAA,aAAA,CAAc,MAAS,GAAA,CAAA,EAAU,OAAA,CAAA,CAAA;AAErC,QAAA,MAAM,kBAAqB,GAAA,iBAAA,CAAkB,aAAa,CAAA,IAAK,CAAE,CAAA,eAAA,CAAA;AACjE,QAAA,MAAM,UAAU,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,aAAA,CAAc,SAAS,CAAC,CAAA,CAAA;AAEpD,QAAO,OAAA;AAAA,UACH,GAAG,CAAA;AAAA,UACH,mBAAqB,EAAA,WAAA;AAAA,UACrB,UAAY,EAAA,aAAA;AAAA,UACZ,eAAiB,EAAA,kBAAA;AAAA,UACjB,QAAU,EAAA,CAAA,CAAE,QAAS,CAAA,GAAA,CAAI,CAAC,EAAQ,MAAA;AAAA,YAC9B,GAAG,EAAA;AAAA,YACH,UAAY,EAAA,IAAA,CAAK,GAAI,CAAA,EAAA,CAAG,YAAY,OAAO,CAAA;AAAA,YAC3C,YAAc,EAAA,IAAA,CAAK,GAAI,CAAA,EAAA,CAAG,cAAc,OAAO,CAAA;AAAA,WACjD,CAAA,CAAA;AAAA,SACN,CAAA;AAAA,OACH,CAAA;AAAA,KACH,CAAA,CAAA,CAAA;AAGF,IAAA,MAAM,QAAQ,GAAI,EAAA,CAAA;AAClB,IAAI,IAAA,KAAA,CAAM,uBAAuB,CAAG,EAAA;AAChC,MAAI,GAAA,CAAA,EAAE,QAAQ,sBAAuB,CAAA,KAAA,CAAM,QAAQ,KAAM,CAAA,oBAAoB,GAAG,CAAA,CAAA;AAAA,KACpF;AACA,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AAAA,GACzB;AAAA,EAEA,iBAAA,EAAmB,CAAC,OAAA,EAAS,QAAa,KAAA;AACtC,IAAA,IAAI,CAAC,QAAA,IAAY,QAAS,CAAA,MAAA,GAAS,CAAG,EAAA,OAAA;AACtC,IAAA,GAAA,GAAM,QAAS,EAAA,CAAA;AAEf,IAAM,MAAA,aAAA,GAAgB,qBAAqB,QAAQ,CAAA,CAAA;AACnD,IAAI,IAAA,aAAA,CAAc,SAAS,CAAG,EAAA,OAAA;AAE9B,IAAM,MAAA,kBAAA,GAAqB,kBAAkB,aAAa,CAAA,CAAA;AAC1D,IAAA,IAAI,CAAC,kBAAoB,EAAA,OAAA;AACzB,IAAM,MAAA,YAAA,GAAe,iBAAiB,kBAAkB,CAAA,CAAA;AAExD,IAAA,GAAA,CAAI,CAAC,KAAU,KAAA;AACX,MAAM,MAAA,WAAA,GAAc,MAAM,MAAO,CAAA,MAAA,GAAS,KAAK,KAAM,CAAA,MAAA,CAAO,CAAC,CAAA,CAAE,EAAO,KAAA,OAAA,CAAA;AACtE,MAAM,MAAA,eAAA,GAAkB,WAAc,GAAA,kBAAA,GAAqB,KAAM,CAAA,oBAAA,CAAA;AACjE,MAAA,MAAM,WAAc,GAAA,WAAA,GAAe,YAAgB,IAAA,KAAA,CAAM,cAAe,KAAM,CAAA,WAAA,CAAA;AAE9E,MAAA,MAAM,aAAgB,GAAA,KAAA,CAAM,MAAO,CAAA,GAAA,CAAI,CAAC,CAAM,KAAA;AAC1C,QAAI,IAAA,CAAA,CAAE,EAAO,KAAA,OAAA,EAAgB,OAAA,CAAA,CAAA;AAC7B,QAAA,MAAM,UAAU,IAAK,CAAA,GAAA,CAAI,CAAG,EAAA,aAAA,CAAc,SAAS,CAAC,CAAA,CAAA;AACpD,QAAO,OAAA;AAAA,UACH,GAAG,CAAA;AAAA,UACH,mBAAqB,EAAA,CAAA;AAAA,UACrB,UAAY,EAAA,aAAA;AAAA,UACZ,eAAiB,EAAA,kBAAA;AAAA,UACjB,SAAA,EAAW,gBAAgB,CAAE,CAAA,SAAA;AAAA,UAC7B,WAAW,EAAE,GAAG,CAAE,CAAA,SAAA,EAAW,OAAO,QAAS,EAAA;AAAA,UAC7C,QAAU,EAAA,CAAA,CAAE,QAAS,CAAA,GAAA,CAAI,CAAC,EAAQ,MAAA;AAAA,YAC9B,GAAG,EAAA;AAAA,YACH,UAAY,EAAA,IAAA,CAAK,GAAI,CAAA,EAAA,CAAG,YAAY,OAAO,CAAA;AAAA,YAC3C,YAAc,EAAA,IAAA,CAAK,GAAI,CAAA,EAAA,CAAG,cAAc,OAAO,CAAA;AAAA,WACjD,CAAA,CAAA;AAAA,SACN,CAAA;AAAA,OACH,CAAA,CAAA;AAED,MAAO,OAAA;AAAA,QACH,oBAAsB,EAAA,eAAA;AAAA,QACtB,WAAA;AAAA,QACA,MAAA,EAAQ,sBAAuB,CAAA,aAAA,EAAe,eAAe,CAAA;AAAA,OACjE,CAAA;AAAA,KACH,CAAA,CAAA;AAED,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AAAA,GACzB;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB,CAAC,OAAA,EAAS,WAAW,MACnC,KAAA,GAAA,CAAI,CAAC,KAAW,MAAA;AAAA,IACZ,MAAA,EAAQ,MAAM,MAAO,CAAA,GAAA;AAAA,MAAI,CAAC,CAAA,KACtB,CAAE,CAAA,EAAA,KAAO,OACH,GAAA;AAAA,QACI,GAAG,CAAA;AAAA,QACH,QAAA,EAAU,EAAE,QAAS,CAAA,GAAA;AAAA,UAAI,CAAC,EACtB,KAAA,EAAA,CAAG,cAAc,SACX,GAAA,EAAE,GAAG,EAAI,EAAA,MAAA,EAAQ,IAAK,CAAA,GAAA,CAAI,GAAG,IAAK,CAAA,GAAA,CAAI,GAAG,MAAM,CAAC,GAChD,GAAA,EAAA;AAAA,SACV;AAAA,OAEJ,GAAA,CAAA;AAAA,KACV;AAAA,GACF,CAAA,CAAA;AAAA,EAEN,iBAAiB,CAAC,OAAA,EAAS,WAAW,KAClC,KAAA,GAAA,CAAI,CAAC,KAAW,MAAA;AAAA,IACZ,MAAA,EAAQ,MAAM,MAAO,CAAA,GAAA;AAAA,MAAI,CAAC,CAAA,KACtB,CAAE,CAAA,EAAA,KAAO,OACH,GAAA;AAAA,QACI,GAAG,CAAA;AAAA,QACH,QAAA,EAAU,EAAE,QAAS,CAAA,GAAA;AAAA,UAAI,CAAC,OACtB,EAAG,CAAA,SAAA,KAAc,YAAY,EAAE,GAAG,EAAI,EAAA,KAAA,EAAU,GAAA,EAAA;AAAA,SACpD;AAAA,OAEJ,GAAA,CAAA;AAAA,KACV;AAAA,GACF,CAAA,CAAA;AAAA,EAEN,kBAAkB,CAAC,OAAA,EAAS,WAAW,MACnC,KAAA,GAAA,CAAI,CAAC,KAAW,MAAA;AAAA,IACZ,MAAA,EAAQ,MAAM,MAAO,CAAA,GAAA;AAAA,MAAI,CAAC,CAAA,KACtB,CAAE,CAAA,EAAA,KAAO,OACH,GAAA;AAAA,QACI,GAAG,CAAA;AAAA,QACH,QAAA,EAAU,EAAE,QAAS,CAAA,GAAA;AAAA,UAAI,CAAC,OACtB,EAAG,CAAA,SAAA,KAAc,YAAY,EAAE,GAAG,EAAI,EAAA,MAAA,EAAW,GAAA,EAAA;AAAA,SACrD;AAAA,OAEJ,GAAA,CAAA;AAAA,KACV;AAAA,GACF,CAAA,CAAA;AAAA,EAEN,mBAAmB,CAAC,OAAA,EAAS,WAAW,OACpC,KAAA,GAAA,CAAI,CAAC,KAAW,MAAA;AAAA,IACZ,MAAA,EAAQ,MAAM,MAAO,CAAA,GAAA;AAAA,MAAI,CAAC,CAAA,KACtB,CAAE,CAAA,EAAA,KAAO,OACH,GAAA;AAAA,QACI,GAAG,CAAA;AAAA,QACH,QAAA,EAAU,EAAE,QAAS,CAAA,GAAA;AAAA,UAAI,CAAC,OACtB,EAAG,CAAA,SAAA,KAAc,YAAY,EAAE,GAAG,EAAI,EAAA,OAAA,EAAY,GAAA,EAAA;AAAA,SACtD;AAAA,OAEJ,GAAA,CAAA;AAAA,KACV;AAAA,GACF,CAAA,CAAA;AAAA,EAEN,mBAAmB,CAAC,OAAA,EAAS,WAAW,OACpC,KAAA,GAAA,CAAI,CAAC,KAAW,MAAA;AAAA,IACZ,MAAA,EAAQ,MAAM,MAAO,CAAA,GAAA;AAAA,MAAI,CAAC,CAAA,KACtB,CAAE,CAAA,EAAA,KAAO,OACH,GAAA;AAAA,QACI,GAAG,CAAA;AAAA,QACH,QAAA,EAAU,EAAE,QAAS,CAAA,GAAA;AAAA,UAAI,CAAC,OACtB,EAAG,CAAA,SAAA,KAAc,YAAY,EAAE,GAAG,EAAI,EAAA,OAAA,EAAY,GAAA,EAAA;AAAA,SACtD;AAAA,OAEJ,GAAA,CAAA;AAAA,KACV;AAAA,GACF,CAAA,CAAA;AAAA;AAAA;AAAA;AAAA,EAMN,aAAe,EAAA,CAAC,OAAS,EAAA,SAAA,EAAW,MAAW,KAAA;AAC3C,IAAA,GAAA,GAAM,QAAS,EAAA,CAAA;AACf,IAAA,GAAA,CAAI,CAAC,KAAW,MAAA;AAAA,MACZ,MAAA,EAAQ,MAAM,MAAO,CAAA,GAAA;AAAA,QAAI,CAAC,CAAA,KACtB,CAAE,CAAA,EAAA,KAAO,OACH,GAAA;AAAA,UACI,GAAG,CAAA;AAAA,UACH,QAAU,EAAA,CAAA,CAAE,QAAS,CAAA,GAAA,CAAI,CAAC,EAAO,KAAA;AAC7B,YAAI,IAAA,EAAA,CAAG,SAAc,KAAA,SAAA,EAAkB,OAAA,EAAA,CAAA;AACvC,YAAA,MAAM,SAAS,gBAAiB,CAAA,CAAC,GAAG,EAAG,CAAA,WAAA,EAAa,MAAM,CAAC,CAAA,CAAA;AAC3D,YAAA,OAAO,EAAE,GAAG,EAAI,EAAA,WAAA,EAAa,MAAO,EAAA,CAAA;AAAA,WACvC,CAAA;AAAA,SAEL,GAAA,CAAA;AAAA,OACV;AAAA,KACF,CAAA,CAAA,CAAA;AACF,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AAAA,GACzB;AAAA,EAEA,gBAAkB,EAAA,CAAC,OAAS,EAAA,SAAA,EAAW,WAAgB,KAAA;AACnD,IAAA,GAAA,GAAM,QAAS,EAAA,CAAA;AACf,IAAA,GAAA,CAAI,CAAC,KAAW,MAAA;AAAA,MACZ,MAAA,EAAQ,MAAM,MAAO,CAAA,GAAA;AAAA,QAAI,CAAC,CAAA,KACtB,CAAE,CAAA,EAAA,KAAO,OACH,GAAA;AAAA,UACI,GAAG,CAAA;AAAA,UACH,QAAA,EAAU,EAAE,QAAS,CAAA,GAAA;AAAA,YAAI,CAAC,EACtB,KAAA,EAAA,CAAG,cAAc,SACX,GAAA,EAAE,GAAG,EAAI,EAAA,WAAA,EAAa,EAAG,CAAA,WAAA,CAAY,OAAO,CAAC,CAAA,EAAG,MAAM,CAAM,KAAA,WAAW,GACvE,GAAA,EAAA;AAAA,WACV;AAAA,SAEJ,GAAA,CAAA;AAAA,OACV;AAAA,KACF,CAAA,CAAA,CAAA;AACF,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AAAA,GACzB;AAAA,EAEA,gBAAA,EAAkB,CAAC,OAAA,EAAS,SAAc,KAAA;AACtC,IAAA,GAAA,GAAM,QAAS,EAAA,CAAA;AACf,IAAA,GAAA,CAAI,CAAC,KAAW,MAAA;AAAA,MACZ,MAAA,EAAQ,MAAM,MAAO,CAAA,GAAA;AAAA,QAAI,CAAC,CAAA,KACtB,CAAE,CAAA,EAAA,KAAO,OACH,GAAA;AAAA,UACI,GAAG,CAAA;AAAA,UACH,QAAA,EAAU,EAAE,QAAS,CAAA,GAAA;AAAA,YAAI,CAAC,EACtB,KAAA,EAAA,CAAG,SAAc,KAAA,SAAA,GAAY,EAAE,GAAG,EAAI,EAAA,WAAA,EAAa,EAAC,EAAM,GAAA,EAAA;AAAA,WAC9D;AAAA,SAEJ,GAAA,CAAA;AAAA,OACV;AAAA,KACF,CAAA,CAAA,CAAA;AACF,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AAAA,GACzB;AAAA,EAEA,mBAAqB,EAAA,CAAC,OAAS,EAAA,SAAA,EAAW,OAAY,KAAA;AAClD,IAAA,GAAA,CAAI,CAAC,KAAW,MAAA;AAAA,MACZ,MAAA,EAAQ,MAAM,MAAO,CAAA,GAAA;AAAA,QAAI,CAAC,CAAA,KACtB,CAAE,CAAA,EAAA,KAAO,OACH,GAAA;AAAA,UACI,GAAG,CAAA;AAAA,UACH,QAAA,EAAU,EAAE,QAAS,CAAA,GAAA;AAAA,YAAI,CAAC,EAAA,KACtB,EAAG,CAAA,SAAA,KAAc,SACX,GAAA,EAAE,GAAG,EAAA,EAAI,WAAa,EAAA,gBAAA,CAAiB,OAAO,CAAA,EAC9C,GAAA,EAAA;AAAA,WACV;AAAA,SAEJ,GAAA,CAAA;AAAA,OACV;AAAA,KACF,CAAA,CAAA,CAAA;AAAA,GACN;AAAA,EAEA,cAAgB,EAAA,CAAC,OAAS,EAAA,SAAA,EAAW,GAAQ,KAAA;AACzC,IAAA,GAAA,GAAM,QAAS,EAAA,CAAA;AACf,IAAA,MAAM,QAAQ,GAAI,EAAA,CAAA;AAClB,IAAM,MAAA,KAAA,GAAQ,MAAM,MAAO,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,OAAO,OAAO,CAAA,CAAA;AACvD,IAAA,IAAI,CAAC,KAAO,EAAA,OAAA;AACZ,IAAM,MAAA,EAAA,GAAK,MAAM,QAAS,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,cAAc,SAAS,CAAA,CAAA;AAC/D,IAAA,IAAI,CAAC,EAAI,EAAA,OAAA;AACT,IAAM,MAAA,QAAA,GAAW,IAAK,CAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AAC/B,IAAA,IAAI,QAAY,IAAA,EAAA,CAAG,YAAgB,IAAA,QAAA,IAAY,GAAG,UAAY,EAAA,OAAA;AAC9D,IAAA,MAAM,SAAqB,EAAE,QAAA,EAAU,QAAU,EAAA,MAAA,EAAQ,WAAW,CAAE,EAAA,CAAA;AACtE,IAAA,MAAM,SAAS,gBAAiB,CAAA,CAAC,GAAG,EAAG,CAAA,WAAA,EAAa,MAAM,CAAC,CAAA,CAAA;AAC3D,IAAI,GAAA,CAAA;AAAA,MACA,MAAA,EAAQ,MAAM,MAAO,CAAA,GAAA;AAAA,QAAI,CAAC,CAAA,KACtB,CAAE,CAAA,EAAA,KAAO,OACH,GAAA;AAAA,UACI,GAAG,CAAA;AAAA,UACH,QAAA,EAAU,EAAE,QAAS,CAAA,GAAA;AAAA,YAAI,CAAC,CACtB,KAAA,CAAA,CAAE,SAAc,KAAA,SAAA,GAAY,EAAE,GAAG,CAAA,EAAG,WAAa,EAAA,MAAA,EAAW,GAAA,CAAA;AAAA,WAChE;AAAA,SAEJ,GAAA,CAAA;AAAA,OACV;AAAA,KACH,CAAA,CAAA;AACD,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AAAA,GACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,aAAe,EAAA,CAAC,OAAS,EAAA,SAAA,EAAW,QAAa,KAAA;AAC7C,IAAA,MAAM,QAAQ,GAAI,EAAA,CAAA;AAClB,IAAM,MAAA,KAAA,GAAQ,MAAM,MAAO,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,OAAO,OAAO,CAAA,CAAA;AACvD,IAAA,IAAI,CAAC,KAAO,EAAA,OAAA;AACZ,IAAM,MAAA,EAAA,GAAK,MAAM,QAAS,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,cAAc,SAAS,CAAA,CAAA;AAC/D,IAAA,IAAI,CAAC,EAAI,EAAA,OAAA;AACT,IAAA,IAAI,QAAY,IAAA,EAAA,CAAG,YAAgB,IAAA,QAAA,IAAY,GAAG,UAAY,EAAA,OAAA;AAC9D,IAAM,MAAA,QAAA,GAAW,EAAG,CAAA,WAAA,IAAe,EAAC,CAAA;AAEpC,IAAI,IAAA,QAAA,CAAS,IAAK,CAAA,CAAC,CAAM,KAAA,IAAA,CAAK,IAAI,CAAI,GAAA,QAAQ,CAAI,GAAA,QAAQ,CAAG,EAAA,OAAA;AAC7D,IAAA,GAAA,GAAM,QAAS,EAAA,CAAA;AACf,IAAM,MAAA,MAAA,GAAS,CAAC,GAAG,QAAU,EAAA,QAAQ,CAAE,CAAA,IAAA,CAAK,CAAC,CAAA,EAAG,CAAM,KAAA,CAAA,GAAI,CAAC,CAAA,CAAA;AAC3D,IAAI,GAAA,CAAA;AAAA,MACA,MAAA,EAAQ,GAAI,EAAA,CAAE,MAAO,CAAA,GAAA;AAAA,QAAI,CAAC,CAAA,KACtB,CAAE,CAAA,EAAA,KAAO,OACH,GAAA;AAAA,UACI,GAAG,CAAA;AAAA,UACH,QAAA,EAAU,EAAE,QAAS,CAAA,GAAA;AAAA,YAAI,CAAC,CACtB,KAAA,CAAA,CAAE,SAAc,KAAA,SAAA,GAAY,EAAE,GAAG,CAAA,EAAG,WAAa,EAAA,MAAA,EAAW,GAAA,CAAA;AAAA,WAChE;AAAA,SAEJ,GAAA,CAAA;AAAA,OACV;AAAA,KACH,CAAA,CAAA;AACD,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AAAA,GACzB;AAAA,EAEA,qBAAqB,CAAC,OAAA,EAAS,SAAW,EAAA,MAAA,EAAQ,WAAW,IAAS,KAAA;AAClE,IAAA,MAAM,QAAQ,GAAI,EAAA,CAAA;AAClB,IAAM,MAAA,KAAA,GAAQ,MAAM,MAAO,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,OAAO,OAAO,CAAA,CAAA;AACvD,IAAA,IAAI,CAAC,KAAO,EAAA,OAAA;AACZ,IAAM,MAAA,EAAA,GAAK,MAAM,QAAS,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,cAAc,SAAS,CAAA,CAAA;AAC/D,IAAA,IAAI,CAAC,EAAI,EAAA,OAAA;AACT,IAAI,IAAA,QAAA,EAAc,GAAA,EAAA,CAAE,QAAS,EAAA,CAAA;AAC7B,IAAA,MAAM,OAAU,GAAA,KAAA,CAAM,IAAK,CAAA,IAAI,IAAI,MAAO,CAAA,MAAA;AAAA,MACtC,CAAC,CAAM,KAAA,CAAA,GAAI,EAAG,CAAA,YAAA,IAAgB,IAAI,EAAG,CAAA,UAAA;AAAA,KACxC,CAAC,CAAE,CAAA,IAAA,CAAK,CAAC,CAAG,EAAA,CAAA,KAAM,IAAI,CAAC,CAAA,CAAA;AACxB,IAAI,GAAA,CAAA;AAAA,MACA,MAAA,EAAQ,GAAI,EAAA,CAAE,MAAO,CAAA,GAAA;AAAA,QAAI,CAAC,CAAA,KACtB,CAAE,CAAA,EAAA,KAAO,OACH,GAAA;AAAA,UACI,GAAG,CAAA;AAAA,UACH,QAAA,EAAU,EAAE,QAAS,CAAA,GAAA;AAAA,YAAI,CAAC,CACtB,KAAA,CAAA,CAAE,SAAc,KAAA,SAAA,GAAY,EAAE,GAAG,CAAA,EAAG,WAAa,EAAA,OAAA,EAAY,GAAA,CAAA;AAAA,WACjE;AAAA,SAEJ,GAAA,CAAA;AAAA,OACV;AAAA,KACH,CAAA,CAAA;AACD,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AAAA,GACzB;AAAA,EAEA,gBAAA,EAAkB,CAAC,OAAA,EAAS,SAAc,KAAA;AACtC,IAAA,MAAM,QAAQ,GAAI,EAAA,CAAA;AAClB,IAAM,MAAA,KAAA,GAAQ,MAAM,MAAO,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,OAAO,OAAO,CAAA,CAAA;AACvD,IAAA,IAAI,CAAC,KAAO,EAAA,OAAA;AACZ,IAAM,MAAA,EAAA,GAAK,MAAM,QAAS,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,cAAc,SAAS,CAAA,CAAA;AAC/D,IAAI,IAAA,CAAC,MAAM,CAAC,EAAA,CAAG,eAAe,EAAG,CAAA,WAAA,CAAY,WAAW,CAAG,EAAA,OAAA;AAC3D,IAAA,GAAA,GAAM,QAAS,EAAA,CAAA;AACf,IAAI,GAAA,CAAA;AAAA,MACA,MAAA,EAAQ,GAAI,EAAA,CAAE,MAAO,CAAA,GAAA;AAAA,QAAI,CAAC,CAAA,KACtB,CAAE,CAAA,EAAA,KAAO,OACH,GAAA;AAAA,UACI,GAAG,CAAA;AAAA,UACH,QAAA,EAAU,EAAE,QAAS,CAAA,GAAA;AAAA,YAAI,CAAC,CACtB,KAAA,CAAA,CAAE,SAAc,KAAA,SAAA,GAAY,EAAE,GAAG,CAAG,EAAA,WAAA,EAAa,EAAC,EAAM,GAAA,CAAA;AAAA,WAC5D;AAAA,SAEJ,GAAA,CAAA;AAAA,OACV;AAAA,KACH,CAAA,CAAA;AACD,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AAAA,GACzB;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAoB,EAAA,CAAC,OAAS,EAAA,SAAA,EAAW,MAAW,KAAA;AAChD,IAAA,GAAA,CAAI,CAAC,KAAW,MAAA;AAAA,MACZ,MAAA,EAAQ,MAAM,MAAO,CAAA,GAAA;AAAA,QAAI,CAAC,CAAA,KACtB,CAAE,CAAA,EAAA,KAAO,OACH,GAAA;AAAA,UACI,GAAG,CAAA;AAAA,UACH,QAAA,EAAU,EAAE,QAAS,CAAA,GAAA;AAAA,YAAI,CAAC,EACtB,KAAA,EAAA,CAAG,SAAc,KAAA,SAAA,GACX,EAAE,GAAG,EAAA,EAAI,gBAAkB,EAAA,CAAC,GAAI,EAAG,CAAA,gBAAA,IAAoB,EAAK,EAAA,MAAM,GAClE,GAAA,EAAA;AAAA,WACV;AAAA,SAEJ,GAAA,CAAA;AAAA,OACV;AAAA,KACF,CAAA,CAAA,CAAA;AACF,IAAA,eAAA,CAAgB,KAAK,CAAA,CAAA;AAAA,GACzB;AAAA;AAAA;AAAA;AAAA,EAMA,mBAAmB,MAAM;AACrB,IAAA,MAAM,QAAQ,GAAI,EAAA,CAAA;AAClB,IAAA,IAAI,KAAM,CAAA,MAAA,CAAO,MAAW,KAAA,CAAA,EAAU,OAAA,CAAA,CAAA;AACtC,IAAA,IAAI,MAAS,GAAA,CAAA,CAAA;AACb,IAAW,KAAA,MAAA,CAAA,IAAK,MAAM,MAAQ,EAAA;AAC1B,MAAW,KAAA,MAAA,EAAA,IAAM,EAAE,QAAU,EAAA;AACzB,QAAI,IAAA,CAAC,GAAG,OAAS,EAAA,SAAA;AACjB,QAAA,MAAM,MAAM,EAAG,CAAA,gBAAA,IAAoB,EAAG,CAAA,UAAA,GAAa,GAAG,YAAe,GAAA,CAAA,CAAA,CAAA;AACrE,QAAI,IAAA,GAAA,GAAM,QAAiB,MAAA,GAAA,GAAA,CAAA;AAAA,OAC/B;AAAA,KACJ;AACA,IAAO,OAAA,MAAA,CAAA;AAAA,GACX;AAAA,EAEA,YAAA,EAAc,CAAC,OAAoB,KAAA;AAC/B,IAAO,OAAA,GAAA,GAAM,MAAO,CAAA,IAAA,CAAK,CAAC,CAAM,KAAA,CAAA,CAAE,OAAO,OAAO,CAAA,CAAA;AAAA,GACpD;AAAA,EAEA,UAAA,EAAY,CAAC,OAAA,EAAiB,SAAsB,KAAA;AAChD,IAAM,MAAA,KAAA,GAAQ,KAAM,CAAA,MAAA,CAAO,KAAK,CAAC,CAAA,KAAM,CAAE,CAAA,EAAA,KAAO,OAAO,CAAA,CAAA;AACvD,IAAA,OAAO,OAAO,QAAS,CAAA,IAAA,CAAK,CAAC,EAAO,KAAA,EAAA,CAAG,cAAc,SAAS,CAAA,CAAA;AAAA,GAClE;AACJ,CAAE,CAAA","file":"chunk-KCOOE2OP.js","sourcesContent":["/**\n * Core DAW data model interfaces.\n * Everything operates in bars. The first track sets the master tempo;\n * subsequent tracks are speed-matched automatically.\n */\n\nimport type { AudioSourceSequence } from '@/stem-audio-engine-v3/cache/mp4-sequence';\nimport type { ITrackForSequence, IMusicKey, IMusicTonality, TStemType } from '@/stem-audio-engine-v3/interface';\nimport type { IBarMapping } from './primitives/bar-utils';\nimport type { TempoRatio } from './primitives/tempo-utils';\n\n// ──────────────────────────────────────────────────────────────────────────\n// Pitch engine settings (per-track, user-configurable)\n// ──────────────────────────────────────────────────────────────────────────\n\nexport interface PitchEngineSettings {\n formantOption: 'preserved' | 'shifted';\n pitchOption: 'highSpeed' | 'highQuality' | 'highConsistency';\n engineOption: 'faster' | 'finer';\n /** Pitch delay (ms) inside the Rubberband worklet — controls alignment between\n * instant speed changes and delayed pitch changes. Higher = pitch applies later. */\n pitchDelayMs: number;\n}\n\nexport const DEFAULT_PITCH_SETTINGS: PitchEngineSettings = {\n formantOption: 'shifted',\n pitchOption: 'highConsistency',\n engineOption: 'faster',\n pitchDelayMs: 74,\n};\n\n/** Active tool in the DAW toolbar. */\nexport type DAWToolMode = 'pointer' | 'hand' | 'knife' | 'eraser' | 'resample';\n\n/** Identifies a single stem lane on the timeline. */\nexport interface StemId {\n trackId: string;\n stemIndex: number;\n}\n\nexport const stemIdKey = (s: StemId): string => `${s.trackId}:${s.stemIndex}`;\n\n/** A selected bar range on a stem (supports sub-bar / beat-level precision). */\nexport interface StemSelectionRange {\n trackId: string;\n stemIndex: number;\n /** Start in local bars (fractional — 0.25 = beat 2 of bar 0) */\n startBar: number;\n /** End in local bars (fractional) */\n endBar: number;\n}\n\n/**\n * Compute the union bar range of a set of selections (all expected to be on\n * the same track). Returns null if the array is empty.\n */\nexport function getSelectionBoundsBars(selections: StemSelectionRange[]): {\n trackId: string;\n startBar: number;\n endBar: number;\n stemIndexes: number[];\n} | null {\n if (selections.length === 0) return null;\n const trackId = selections[0].trackId;\n let startBar = Infinity;\n let endBar = -Infinity;\n const stemIndexes = new Set<number>();\n for (const s of selections) {\n if (s.startBar < startBar) startBar = s.startBar;\n if (s.endBar > endBar) endBar = s.endBar;\n stemIndexes.add(s.stemIndex);\n }\n return { trackId, startBar, endBar, stemIndexes: Array.from(stemIndexes).sort((a, b) => a - b) };\n}\n\nexport const parseStemIdKey = (key: string): StemId | null => {\n const [trackId, idx] = key.split(':');\n const stemIndex = parseInt(idx, 10);\n return trackId && !isNaN(stemIndex) ? { trackId, stemIndex } : null;\n};\n\n// ──────────────────────────────────────────────────────────────────────────\n// Session\n// ──────────────────────────────────────────────────────────────────────────\n\nexport interface DAWSession {\n id: string;\n /** User-editable mix/project name */\n mixName: string;\n /** BPM - set by first track, adjustable via metronome */\n masterTempo: number;\n /** The native BPM of the first track — used as the 1x reference */\n originalTempo: number;\n /** Samples per bar at master tempo (48 kHz) */\n masterBarLength48000: number;\n /** Time signature numerator / denominator */\n timeSignature: [number, number];\n /** Ordered list of tracks in the session */\n tracks: DAWTrack[];\n /** Current playhead position in bars (fractional for sub-bar precision) */\n playheadBar: number;\n /** Transport state */\n isPlaying: boolean;\n /** Global speed multiplier (1.0 = normal, set via metronome dial) */\n globalPlaybackRate: number;\n /** Loop region, if enabled */\n loopRegion: { startBar: number; endBar: number } | null;\n /** Bar subdivision factor: 1 = bars only (default), 4 = quarter-note grid, etc.\n * Each bar is split into N equal sub-bars before building the speed/pitch maps. */\n barSubdivisions: number;\n /**\n * Session-level notes / markers placed against the timeline. They sit\n * above the ruler as small emoji + label pills and are purely visual —\n * they have no effect on playback. A note with `endBar === startBar`\n * is a point marker; otherwise it covers the bar range as a section\n * marker.\n */\n notes: SessionNote[];\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// Session notes / markers\n// ──────────────────────────────────────────────────────────────────────────\n\n/** Curated palette of accent colors used by the note pill chrome. */\nexport const NOTE_COLORS: string[] = [\n '#F5C518', // amber\n '#FF6D00', // orange\n '#EF4444', // red\n '#EC4899', // pink\n '#8B5CF6', // violet\n '#3B82F6', // blue\n '#14B8A6', // teal\n '#22C55E', // green\n];\n\n/** Default emoji palette shown in the note editor. Order matters — the\n * first one is the default selection when opening a fresh editor. */\nexport const NOTE_EMOJI_PALETTE: string[] = [\n '🎯', '💖', '🔥', '⭐', '⚡', '🎵', '💡', '✨', '🚀', '🎤',\n];\n\n/** A timeline annotation. Pure visual — never feeds the audio engine. */\nexport interface SessionNote {\n id: string;\n /** Bar position (point note) or start of section (range note). */\n startBar: number;\n /** End bar. Equal to `startBar` for point markers. */\n endBar: number;\n /** Emoji shown in the pill. Single grapheme. */\n emoji: string;\n /** Short user-facing label (\"drop hits\", \"best part\", …). */\n label: string;\n /** Hex accent color for the pill chrome. */\n color: string;\n /** Creation timestamp (ms since epoch). */\n createdAt: number;\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// Track\n// ──────────────────────────────────────────────────────────────────────────\n\nexport interface DAWTrack {\n /** Unique identifier for this track instance */\n id: string;\n /** Original track metadata from the API */\n trackData: ITrackForSequence;\n /** Reference to the MP4 cache layer instance (set at runtime, not in store) */\n audioSourceSequenceId: string;\n\n // ── Beat grid data ──\n /** Bar boundaries computed from the track's beat grid */\n barMapping: IBarMapping[];\n /** Inclusive bar index window for stem composition (defaults: 0 … last bar) */\n trimStartBar?: number;\n trimEndBar?: number;\n /** Musical sections: [startTime, endTime, segmentType] */\n segmentInfo: [number, number, number][];\n /**\n * User-adjustable beat grid offset in beats (fractional).\n * Shifts where the downbeat falls in the audio.\n * +1 = the grid shifts forward by one beat (downbeat is 1 beat later in audio).\n * -0.5 = the grid shifts backward by half a beat.\n * Default 0.\n */\n beatGridOffsetBeats: number;\n\n // ── Speed/pitch matching ──\n /** Track's native bar length in samples */\n nativeBarLength: number;\n /** Native BPM */\n nativeBpm: number;\n /** The speed ratio this track needs to match the master tempo */\n speedRatioToMaster: number;\n /** Tempo ratio bucket (0.5 | 1 | 2) for half/double time handling */\n tempoRatio: TempoRatio;\n /** Pitch correction in semitones to compensate for speed change */\n pitchCorrectionSemitones: number;\n /** Key of the track */\n key: IMusicKey;\n /** Tonality (major/minor) */\n tonality: IMusicTonality;\n\n // ── Per-stem channels ──\n /** Always 4: other, vocals, bass, drums */\n channels: DAWChannel[];\n\n // ── Track-level controls ──\n /** 0.0 to 1.0 */\n volume: number;\n muted: boolean;\n soloed: boolean;\n /** Primary colour from artwork for UI theming */\n color: string;\n /** Artwork URL */\n artwork: string;\n /** Display name */\n displayName: string;\n /** Artist */\n artistName: string;\n\n // ── Transpose ──\n /** User-set transpose offset in semitones (on top of pitchCorrectionSemitones) */\n transposeSemitones: number;\n /** Rubberband/Phaze engine settings for this track's pitch worklet */\n pitchSettings: PitchEngineSettings;\n /** When true, pitch correction varies per bar to compensate per-bar speed changes */\n perBarPitchCompensation: boolean;\n\n // ── UI state ──\n /** Whether the track's stem channels are expanded in the timeline */\n expanded: boolean;\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// Channel (one stem of a track)\n// ──────────────────────────────────────────────────────────────────────────\n\n/** A silenced region within a stem, in bars relative to the track's barMapping. */\nexport interface MuteRegion {\n startBar: number;\n endBar: number;\n}\n\n/** Reason an edge of a {@link StemClip} exists. Lets the renderer use sharp\n * inner corners against split edges to make freshly-sliced clips read as\n * \"cut\" rather than \"two regular clips\". */\nexport type ClipEdge = 'trim' | 'mute' | 'split';\n\n/** A computed visible clip — the non-muted section between mute regions. */\nexport interface StemClip {\n /** Source bar range (relative to barMapping) */\n sourceStartBar: number;\n sourceEndBar: number;\n /** Where this clip sits on the global timeline */\n timelineBar: number;\n /** What produced the start edge of this clip. */\n leftEdge: ClipEdge;\n /** What produced the end edge of this clip. */\n rightEdge: ClipEdge;\n}\n\n/** Clipboard entry for copy/paste. */\nexport interface ClipboardEntry {\n trackId: string;\n stemIndex: number;\n sourceStartBar: number;\n sourceEndBar: number;\n}\n\n/**\n * Compute the visible clips from a channel's trim bounds, mute regions, and\n * split points.\n *\n * SSOT: clip positions are derived deterministically from\n * muteRegions + splitPoints + trim bounds. The audio engine uses the same\n * muteRegions (sent as sample ranges to the worklet), so visuals and playback\n * always agree on what plays where. Split points are PURELY visual/logical —\n * they break a clip into independently-movable pieces but produce no silence.\n */\nexport function computeClips(ch: DAWChannel): StemClip[] {\n const clips: StemClip[] = [];\n const sorted = [...ch.muteRegions].sort((a, b) => a.startBar - b.startBar);\n const splits = (ch.splitPoints ?? [])\n .filter((p) => p > ch.trimStartBar && p < ch.trimEndBar)\n .sort((a, b) => a - b);\n let cursor = ch.trimStartBar;\n\n // Helper: push a clip range, breaking it at every split point that\n // falls strictly inside it. The leftEdge/rightEdge metadata lets the\n // renderer use sharp corners against split edges so a freshly cut\n // clip reads as \"two pieces\" rather than \"two regular clips\".\n const pushRange = (lo: number, hi: number, leftEdge: ClipEdge, rightEdge: ClipEdge) => {\n if (hi <= lo) return;\n let segStart = lo;\n let segLeftEdge: ClipEdge = leftEdge;\n for (const sp of splits) {\n if (sp <= segStart) continue;\n if (sp >= hi) break;\n clips.push({\n sourceStartBar: segStart,\n sourceEndBar: sp,\n timelineBar: ch.timelineStartBar + segStart,\n leftEdge: segLeftEdge,\n rightEdge: 'split',\n });\n segStart = sp;\n segLeftEdge = 'split';\n }\n if (segStart < hi) {\n clips.push({\n sourceStartBar: segStart,\n sourceEndBar: hi,\n timelineBar: ch.timelineStartBar + segStart,\n leftEdge: segLeftEdge,\n rightEdge,\n });\n }\n };\n\n for (const mr of sorted) {\n const muteStart = Math.max(mr.startBar, ch.trimStartBar);\n const muteEnd = Math.min(mr.endBar, ch.trimEndBar);\n if (muteStart >= muteEnd) continue;\n if (cursor < muteStart) {\n // Left edge: trim if this is the first clip in the stem,\n // otherwise mute (it ends where a previous mute region did).\n const leftEdge: ClipEdge = cursor === ch.trimStartBar ? 'trim' : 'mute';\n pushRange(cursor, muteStart, leftEdge, 'mute');\n }\n cursor = Math.max(cursor, muteEnd);\n }\n if (cursor < ch.trimEndBar) {\n const leftEdge: ClipEdge = cursor === ch.trimStartBar ? 'trim' : 'mute';\n pushRange(cursor, ch.trimEndBar, leftEdge, 'trim');\n }\n\n return clips;\n}\n\nexport interface DAWChannel {\n /** 0 = other, 1 = vocals, 2 = bass, 3 = drums */\n stemIndex: number;\n stemType: TStemType;\n /** Display label */\n label: string;\n /** 0.0 to 1.0 */\n volume: number;\n muted: boolean;\n soloed: boolean;\n /** Whether this stem lane is shown in the timeline (false = \"removed\") */\n visible: boolean;\n\n // ── Per-stem timeline positioning (all in bars) ──\n /** Where this stem starts on the global DAW timeline */\n timelineStartBar: number;\n /** First bar index from the source to play (trim in-point, relative to track barMapping) */\n trimStartBar: number;\n /** Last bar index from the source to play (trim out-point, relative to track barMapping) */\n trimEndBar: number;\n /** Silenced bar ranges within this stem (relative to track barMapping) */\n muteRegions: MuteRegion[];\n /**\n * Logical split points in local bars (relative to track barMapping).\n * Splits break the stem visually into independently-movable clips\n * without any audio side effect — the audio engine ignores them\n * entirely. Each value must lie strictly between trimStartBar and\n * trimEndBar (other values are filtered out by `computeClips`).\n */\n splitPoints?: number[];\n /** Bar ranges that have been resampled via the Bar Sampler */\n resampledRegions?: ResampledRegion[];\n /** Per-stem effects state (EQ, Compressor, Reverb, Delay) */\n effects?: import('./engine/stem-effect-chain').StemEffects;\n}\n\n/** Tracks a bar range that was resampled via the Bar Sampler. */\nexport interface ResampledRegion {\n startBar: number;\n endBar: number;\n sliceCount: number;\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// Bar Sampler types\n// ──────────────────────────────────────────────────────────────────────────\n\nexport interface SamplerRegion {\n trackId: string;\n stemIndex: number;\n startBar: number;\n endBar: number;\n}\n\nexport interface SamplerSlice {\n id: string;\n /** Start sample relative to the extracted region buffer */\n sampleStart: number;\n /** End sample relative to the extracted region buffer */\n sampleEnd: number;\n label?: string;\n /** Detected root note via Basic Pitch (MIDI number, e.g. 60 = C4) */\n rootPitchMidi?: number;\n /** Visual colour for pad grid */\n color?: string;\n}\n\nexport interface SamplerSequenceEntry {\n sliceId: string;\n /** Per-hit pitch offset in semitones (-24 to +24) */\n pitchSemitones?: number;\n /** Per-hit gain multiplier (0..2, default 1) */\n gain?: number;\n /** Play slice in reverse */\n reverse?: boolean;\n /** Trim start within slice (0..1 fraction) */\n startOffset?: number;\n /** Trim end within slice (0..1 fraction) */\n endOffset?: number;\n}\n\n/** A single note placed on the Ableton-style piano roll grid. */\nexport interface PianoRollNote {\n id: string;\n /** MIDI pitch (0–127) */\n pitch: number;\n /** Start position in grid steps (0-based, step size depends on grid resolution) */\n startStep: number;\n /** Duration in grid steps (min 1) */\n durationSteps: number;\n /** Velocity 0–127 (default 100) */\n velocity: number;\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// Bar chunk (decoded audio for a single bar of a single stem)\n// ──────────────────────────────────────────────────────────────────────────\n\nexport interface DAWBarChunk {\n /** Index within the track's bar mapping array */\n barIndex: number;\n /** Sample-accurate bar boundaries from the beat grid */\n originalBar: IBarMapping;\n /** Speed ratio required to match master tempo for this specific bar */\n speedRatio: number;\n /** Decoded audio state */\n decoded: {\n audioBuffer: AudioBuffer | null;\n isDecoding: boolean;\n };\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// Segment types (musical sections)\n// ──────────────────────────────────────────────────────────────────────────\n\nexport const SEGMENT_TYPE = {\n START: 0,\n END: 1,\n INTRO: 2,\n OUTRO: 3,\n BREAK: 4,\n BRIDGE: 5,\n INST: 6,\n SOLO: 7,\n VERSE: 8,\n CHORUS: 9,\n} as const;\n\nexport type SegmentTypeValue = (typeof SEGMENT_TYPE)[keyof typeof SEGMENT_TYPE];\n\nexport const SEGMENT_LABELS: Record<number, string> = {\n [SEGMENT_TYPE.START]: 'Start',\n [SEGMENT_TYPE.END]: 'End',\n [SEGMENT_TYPE.INTRO]: 'Intro',\n [SEGMENT_TYPE.OUTRO]: 'Outro',\n [SEGMENT_TYPE.BREAK]: 'Break',\n [SEGMENT_TYPE.BRIDGE]: 'Bridge',\n [SEGMENT_TYPE.INST]: 'Inst',\n [SEGMENT_TYPE.SOLO]: 'Solo',\n [SEGMENT_TYPE.VERSE]: 'Verse',\n [SEGMENT_TYPE.CHORUS]: 'Chorus',\n};\n\nexport const SEGMENT_COLORS: Record<number, string> = {\n [SEGMENT_TYPE.START]: '#6b7280',\n [SEGMENT_TYPE.END]: '#6b7280',\n [SEGMENT_TYPE.INTRO]: '#FFD600',\n [SEGMENT_TYPE.OUTRO]: '#FFD600',\n [SEGMENT_TYPE.BREAK]: '#f59e0b',\n [SEGMENT_TYPE.BRIDGE]: '#06b6d4',\n [SEGMENT_TYPE.INST]: '#14b8a6',\n [SEGMENT_TYPE.SOLO]: '#f97316',\n [SEGMENT_TYPE.VERSE]: '#3b82f6',\n [SEGMENT_TYPE.CHORUS]: '#ef4444',\n};\n\n// ──────────────────────────────────────────────────────────────────────────\n// Audio graph node set per track (runtime only, not serialised)\n// ──────────────────────────────────────────────────────────────────────────\n\nexport interface DAWTrackAudioNodes {\n stemBufferNodes: AudioWorkletNode[]; // 4 (one per stem)\n stemGainNodes: GainNode[]; // 4\n stemAnalyserNodes: AnalyserNode[]; // 4\n trackGainNode: GainNode; // 1\n pitchWorkletNode: AudioWorkletNode | null; // 1 (optional)\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// Helpers\n// ──────────────────────────────────────────────────────────────────────────\n\nexport const STEM_LABELS: string[] = ['Other', 'Vocals', 'Bass', 'Drums'];\nexport const STEM_TYPES: TStemType[] = ['0_other', '1_vocals', '2_bass', '3_drums'];\n\nexport const STEM_COLORS: string[] = ['#FF1493', '#FF6D00', '#2979FF', '#FFEA00'];\nexport const STEM_BUFFER_KEYS: string[] = ['other', 'vocals', 'bass', 'drums'];\n\nexport const createDefaultChannels = (\n timelineStartBar = 0,\n trimStartBar = 0,\n trimEndBar = 0,\n): DAWChannel[] =>\n STEM_TYPES.map((stemType, i) => ({\n stemIndex: i,\n stemType,\n label: STEM_LABELS[i],\n volume: 1.0,\n muted: false,\n soloed: false,\n visible: true,\n timelineStartBar,\n trimStartBar,\n trimEndBar,\n muteRegions: [],\n }));\n\n// ──────────────────────────────────────────────────────────────────────────\n// Section alignment helpers\n// ──────────────────────────────────────────────────────────────────────────\n\nexport interface SectionRange {\n type: number;\n label: string;\n startBar: number;\n endBar: number;\n}\n\n/** Convert segmentInfo timestamps to bar-based section ranges using barMapping. */\nexport function segmentInfoToSections(\n segmentInfo: [number, number, number][],\n barMapping: IBarMapping[],\n): SectionRange[] {\n if (!segmentInfo?.length || !barMapping?.length) return [];\n const barTimestamps = barMapping.map((b) => b.sampleStart / 48000);\n const sections: SectionRange[] = [];\n\n for (const [startTime, endTime, segType] of segmentInfo) {\n let startBar = 0;\n let endBar = barMapping.length;\n for (let i = 0; i < barTimestamps.length; i++) {\n if (barTimestamps[i] <= startTime + 0.01) startBar = i;\n }\n for (let i = barTimestamps.length - 1; i >= 0; i--) {\n if (barTimestamps[i] >= endTime - 0.01) { endBar = i; break; }\n }\n if (endBar <= startBar) endBar = startBar + 1;\n sections.push({\n type: segType,\n label: SEGMENT_LABELS[segType] || `S${segType}`,\n startBar,\n endBar,\n });\n }\n return sections;\n}\n\n/** Find the first section of a given type, or fall back through preferred types. */\nexport function findFirstSectionOfType(\n sections: SectionRange[],\n preferredTypes: number[] = [SEGMENT_TYPE.CHORUS, SEGMENT_TYPE.VERSE, SEGMENT_TYPE.BRIDGE],\n): SectionRange | null {\n for (const t of preferredTypes) {\n const found = sections.find((s) => s.type === t);\n if (found) return found;\n }\n return sections.length > 0 ? sections[0] : null;\n}\n","/**\n * Extracted bar composition primitives - decoupled from AEV3Controller.\n * These are pure functions for converting beat grids to bar boundaries\n * and computing speed ratios for tempo matching.\n */\n\nexport interface IBeat {\n frame: number;\n number: number;\n timestamp: number;\n}\n\nexport interface IBarMapping {\n sampleStart: number;\n sampleEnd: number;\n duration: number;\n}\n\nconst SAMPLE_RATE = 48000;\n\n/**\n * Convert a fractional bar position to a sample offset in the source buffer,\n * respecting per-bar tempo variation encoded in `barMapping`.\n *\n * Each `IBarMapping` entry has its own `(sampleStart, duration)`, so this is\n * piecewise-linear — bar N starts at `barMapping[N].sampleStart` and bar\n * N + frac sits `frac × duration` samples into that entry.\n *\n * IMPORTANT: this is the canonical bar→sample function. The audio scheduler\n * (DAWController) uses it to schedule playback, and the timeline waveform\n * renderer uses it to slice the mipmap. If the renderer used a linear\n * `bar / totalBars × totalSamples` formula instead, the drawn waveform\n * would drift away from the actual audio whenever bars have unequal\n * durations (i.e. for any non-click-track content) — making peaks appear\n * at the wrong position relative to the playhead.\n *\n * Supports beat-level precision (e.g. `2.25` = beat 2 of bar 2).\n */\nexport function barToSample(bar: number, barMapping: IBarMapping[]): number {\n if (barMapping.length === 0) return 0;\n const floorBar = Math.floor(bar);\n const frac = bar - floorBar;\n if (floorBar >= barMapping.length) {\n const last = barMapping[barMapping.length - 1];\n return last.sampleStart + last.duration;\n }\n const entry = barMapping[Math.max(0, floorBar)];\n return Math.round(entry.sampleStart + frac * entry.duration);\n}\n\nconst downbeatsToBars = (downbeats: IBeat[]): IBarMapping[] => {\n const bars: IBarMapping[] = [];\n for (let i = 0; i < downbeats.length - 1; i++) {\n const current = downbeats[i];\n const next = downbeats[i + 1];\n bars.push({\n sampleStart: current.frame,\n sampleEnd: next.frame - 1,\n duration: next.frame - current.frame,\n });\n }\n return bars;\n};\n\nexport const composeBarsFromBeats = (beats: IBeat[]): IBarMapping[] => {\n const downbeats = beats.filter((b) => b.number === 1);\n return downbeatsToBars(downbeats);\n};\n\nconst smoothDownbeats = (\n downbeats: IBeat[],\n sampleRate: number = SAMPLE_RATE,\n threshold: number = 2500\n): IBeat[] => {\n const N = downbeats.length;\n let adjustedDownbeats: IBeat[] = [];\n let i = 0;\n\n while (i < N) {\n const sectionStart = i;\n let sectionAdjustedDownbeats: IBeat[] = [];\n let meanInterval = 0;\n\n sectionAdjustedDownbeats.push({\n frame: downbeats[i].frame,\n number: downbeats[i].number,\n timestamp: downbeats[i].frame / sampleRate,\n });\n\n let j = i + 1;\n while (j <= N) {\n const intervals = downbeats\n .slice(sectionStart, j)\n .map((_, idx, arr) =>\n idx > 0 ? arr[idx].frame - arr[idx - 1].frame : null\n )\n .slice(1);\n\n if (intervals.length > 0) {\n meanInterval = Math.round(\n intervals.filter((i): i is number => i !== null).reduce((a, b) => a + b) /\n intervals.length\n );\n }\n\n const adjustedFrames: number[] = [];\n for (let idx = 0; idx < j - sectionStart; idx++) {\n adjustedFrames.push(downbeats[sectionStart].frame + meanInterval * idx);\n }\n\n let deviationsWithinThreshold = true;\n for (let idx = 0; idx < adjustedFrames.length; idx++) {\n const deviation = Math.abs(adjustedFrames[idx] - downbeats[sectionStart + idx].frame);\n if (deviation > threshold) {\n deviationsWithinThreshold = false;\n break;\n }\n }\n\n if (deviationsWithinThreshold) {\n sectionAdjustedDownbeats = adjustedFrames.map((af, idx) => ({\n frame: af,\n number: downbeats[sectionStart + idx].number,\n timestamp: af / sampleRate,\n }));\n j++;\n } else {\n break;\n }\n }\n\n adjustedDownbeats = adjustedDownbeats.concat(sectionAdjustedDownbeats);\n i = sectionStart + sectionAdjustedDownbeats.length;\n }\n\n return adjustedDownbeats;\n};\n\nexport const composeBarsFromBeatsSmoothed = (\n beats: IBeat[],\n sampleRate: number = SAMPLE_RATE,\n threshold: number = 2500\n): IBarMapping[] => {\n const downbeats = beats.filter((b) => b.number === 1);\n const smoothed = smoothDownbeats(downbeats, sampleRate, threshold);\n return downbeatsToBars(smoothed);\n};\n\nexport const resolveTimeOfDownbeatFromBarIndex = (\n beats: IBeat[],\n barIndex: number\n): number => {\n const beat = beats[barIndex];\n return beat ? beat.timestamp : -1;\n};\n\nexport const resolveSampleLocOfDownbeatFromBarIndex = (\n beats: IBeat[],\n barIndex: number\n): number => {\n const beat = beats[barIndex];\n return beat ? Math.floor(beat.timestamp * SAMPLE_RATE) : -1;\n};\n\n/**\n * Compute the median bar duration from a set of bar mappings, in samples.\n */\nexport const medianBarDuration = (bars: IBarMapping[]): number => {\n if (bars.length === 0) return 0;\n const durations = bars.map((b) => b.duration).sort((a, b) => a - b);\n const mid = Math.floor(durations.length / 2);\n return durations.length % 2 !== 0\n ? durations[mid]\n : (durations[mid - 1] + durations[mid]) / 2;\n};\n\n/**\n * Convert bar duration in samples (at 48 kHz) to BPM, assuming 4/4 time.\n */\nexport const barDurationToBpm = (barDurationSamples: number): number => {\n if (barDurationSamples <= 0) return 0;\n const barDurationSeconds = barDurationSamples / SAMPLE_RATE;\n const beatsPerBar = 4;\n return (beatsPerBar * 60) / barDurationSeconds;\n};\n\n/**\n * Convert BPM to bar duration in samples (at 48 kHz), assuming 4/4 time.\n */\nexport const bpmToBarDuration = (bpm: number): number => {\n if (bpm <= 0) return 0;\n const beatsPerBar = 4;\n const barDurationSeconds = (beatsPerBar * 60) / bpm;\n return Math.round(barDurationSeconds * SAMPLE_RATE);\n};\n","/**\n * Extracted tempo matching and pitch shift primitives.\n * Pure functions for computing speed ratios and pitch corrections\n * when matching a track to a master tempo.\n */\n\nimport type { IMusicKey, IMusicTonality } from '@/stem-audio-engine-v3/interface';\n\nexport type TempoRatio = 0.5 | 1 | 2;\n\nexport interface ITempoMatch {\n targetBarLength: number;\n playbackRate: number;\n ratio: TempoRatio;\n}\n\n/**\n * Given a master bar length and a track's native bar length (both in samples at 48 kHz),\n * find the best tempo match (half, same, or double speed).\n */\nexport const calculateTempoMatch = (\n masterBarLength: number,\n trackBarLength: number\n): ITempoMatch => {\n const possibleLengths: [number, TempoRatio][] = [\n [masterBarLength / 2, 2],\n [masterBarLength, 1],\n [masterBarLength * 2, 0.5],\n ];\n\n let bestTarget = possibleLengths[1];\n let bestDiff = Math.abs(masterBarLength - trackBarLength);\n\n for (const candidate of possibleLengths) {\n const diff = Math.abs(candidate[0] - trackBarLength);\n if (diff < bestDiff) {\n bestDiff = diff;\n bestTarget = candidate;\n }\n }\n\n return {\n targetBarLength: bestTarget[0],\n playbackRate: trackBarLength / bestTarget[0],\n ratio: bestTarget[1],\n };\n};\n\n/**\n * Compute the speed ratio for a single bar to match the master tempo.\n * speedRatio > 1 means the bar must play faster, < 1 means slower.\n */\nexport const computeBarSpeedRatio = (\n barDurationSamples: number,\n targetBarLengthSamples: number,\n ratio: TempoRatio\n): number => {\n return (barDurationSamples / ratio) / targetBarLengthSamples;\n};\n\n/**\n * Convert a playback rate (speed ratio) to the pitch change in semitones.\n */\nexport const playbackRateToSemitones = (playbackRate: number): number => {\n return 12 * Math.log2(playbackRate);\n};\n\n/**\n * Convert a semitone offset to a pitch shift multiplier suitable for worklets.\n */\nexport const semitonesToPitchFactor = (semitones: number): number => {\n return Math.pow(2, semitones / 12);\n};\n\n// ---------- Key matching (extracted from seed-mix-utils) ----------\n\nconst keyToSemitones: Record<IMusicKey, number> = {\n A: 1, 'A#': 2, B: 3, C: 4, 'C#': 5, D: 6,\n 'D#': 7, E: 8, F: 9, 'F#': 10, G: 11, 'G#': 12,\n};\n\nconst semitonesToKey: Record<number, IMusicKey> = Object.entries(keyToSemitones).reduce(\n (acc, [key, value]) => {\n acc[value] = key as IMusicKey;\n return acc;\n },\n {} as Record<number, IMusicKey>\n);\n\nconst convertKeyToRelativeMinor = (key: IMusicKey, tonality: IMusicTonality): number => {\n let semitones = keyToSemitones[key];\n if (tonality === 'major') {\n semitones = ((semitones - 3 + 12) % 12) || 12;\n }\n return semitones;\n};\n\nexport enum PitchShiftStrategy {\n DEFAULT = 'DEFAULT',\n PRESERVE_MIX_KEY = 'PRESERVE_MIX_KEY',\n MATCH_SEED_KEY = 'MATCH_SEED_KEY',\n NO_SHIFT = 'NO_SHIFT',\n KEY_PRESERVE = 'KEY_PRESERVE',\n}\n\n/**\n * Compute the pitch shift (in semitones) needed to harmonically match a track\n * to a reference key, accounting for tempo-induced pitch drift.\n */\nexport const computePitchShift = (\n refKey: IMusicKey,\n refTonality: IMusicTonality,\n refBarLength: number,\n trackKey: IMusicKey,\n trackTonality: IMusicTonality,\n trackBarLength: number,\n strategy: PitchShiftStrategy = PitchShiftStrategy.KEY_PRESERVE,\n): number => {\n if (!refBarLength || !trackBarLength || isNaN(refBarLength) || isNaN(trackBarLength)) return 0;\n\n const tempoMatch = calculateTempoMatch(refBarLength, trackBarLength);\n const semitoneChangeFromTempo = playbackRateToSemitones(tempoMatch.playbackRate);\n\n if (strategy === PitchShiftStrategy.NO_SHIFT) return 0;\n if (strategy === PitchShiftStrategy.KEY_PRESERVE) return -semitoneChangeFromTempo;\n\n const seedKeySemitones = convertKeyToRelativeMinor(refKey, refTonality);\n const mixKeySemitones = convertKeyToRelativeMinor(trackKey, trackTonality);\n\n if (strategy === PitchShiftStrategy.MATCH_SEED_KEY) {\n let shift = seedKeySemitones - mixKeySemitones;\n if (shift > 6) shift -= 12;\n if (shift < -6) shift += 12;\n return -semitoneChangeFromTempo + shift;\n }\n\n // DEFAULT: minimal pitch approach\n const adjustedMix = ((mixKeySemitones + semitoneChangeFromTempo + 12) % 12) || 12;\n const possibleMatches = [\n seedKeySemitones,\n ((seedKeySemitones + 5) % 12) || 12,\n ((seedKeySemitones - 5 + 12) % 12) || 12,\n ];\n\n const shifts = possibleMatches.map((match) => {\n let s = match - adjustedMix;\n if (s > 6) s -= 12;\n if (s < -6) s += 12;\n const totalChange = Math.abs(s + semitoneChangeFromTempo);\n return {\n shift: s,\n weightedChange: match === seedKeySemitones ? totalChange * 1 : totalChange,\n };\n });\n\n const best = shifts.reduce((prev, curr) =>\n curr.weightedChange < prev.weightedChange ? curr : prev\n );\n return best.shift;\n};\n\nexport { keyToSemitones, semitonesToKey };\n\n// ──────────────────────────────────────────────────────────────────────\n// Camelot Wheel\n// ──────────────────────────────────────────────────────────────────────\n\nexport interface CamelotKey {\n number: number; // 1-12\n letter: 'A' | 'B'; // A = minor, B = major\n label: string; // e.g. \"8A\"\n}\n\nconst CAMELOT_MAP: Record<string, CamelotKey> = {\n 'Ab_minor': { number: 1, letter: 'A', label: '1A' },\n 'B_major': { number: 1, letter: 'B', label: '1B' },\n 'Eb_minor': { number: 2, letter: 'A', label: '2A' },\n 'F#_major': { number: 2, letter: 'B', label: '2B' },\n 'Bb_minor': { number: 3, letter: 'A', label: '3A' },\n 'Db_major': { number: 3, letter: 'B', label: '3B' },\n 'F_minor': { number: 4, letter: 'A', label: '4A' },\n 'Ab_major': { number: 4, letter: 'B', label: '4B' },\n 'C_minor': { number: 5, letter: 'A', label: '5A' },\n 'Eb_major': { number: 5, letter: 'B', label: '5B' },\n 'G_minor': { number: 6, letter: 'A', label: '6A' },\n 'Bb_major': { number: 6, letter: 'B', label: '6B' },\n 'D_minor': { number: 7, letter: 'A', label: '7A' },\n 'F_major': { number: 7, letter: 'B', label: '7B' },\n 'A_minor': { number: 8, letter: 'A', label: '8A' },\n 'C_major': { number: 8, letter: 'B', label: '8B' },\n 'E_minor': { number: 9, letter: 'A', label: '9A' },\n 'G_major': { number: 9, letter: 'B', label: '9B' },\n 'B_minor': { number: 10, letter: 'A', label: '10A' },\n 'D_major': { number: 10, letter: 'B', label: '10B' },\n 'F#_minor': { number: 11, letter: 'A', label: '11A' },\n 'A_major': { number: 11, letter: 'B', label: '11B' },\n 'Db_minor': { number: 12, letter: 'A', label: '12A' },\n 'E_major': { number: 12, letter: 'B', label: '12B' },\n};\n\nconst SHARP_TO_FLAT: Record<string, string> = {\n 'A#': 'Bb', 'C#': 'Db', 'D#': 'Eb', 'F#': 'F#', 'G#': 'Ab',\n};\n\nconst normaliseKeyForCamelot = (key: IMusicKey): string => {\n return SHARP_TO_FLAT[key] ?? key;\n};\n\nexport const toCamelot = (key: IMusicKey, tonality: IMusicTonality): CamelotKey | null => {\n const normKey = normaliseKeyForCamelot(key);\n const lookup = `${normKey}_${tonality}`;\n return CAMELOT_MAP[lookup] ?? null;\n};\n\nconst REVERSE_CAMELOT: Record<string, { key: IMusicKey; tonality: IMusicTonality }> = {};\nfor (const [k, v] of Object.entries(CAMELOT_MAP)) {\n const [rawKey, tonality] = k.split('_');\n const flatToSharp: Record<string, IMusicKey> = {\n 'Bb': 'A#', 'Db': 'C#', 'Eb': 'D#', 'Ab': 'G#',\n };\n const musicKey = (flatToSharp[rawKey] ?? rawKey) as IMusicKey;\n REVERSE_CAMELOT[v.label] = { key: musicKey, tonality: tonality as IMusicTonality };\n}\n\nexport type CamelotMatchType = 'exact' | 'adjacent' | 'relative' | 'diagonal' | 'none';\n\n/**\n * Camelot wheel compatibility rules. The 6 compatible positions around any\n * reference X (e.g. 8A) are:\n * • exact: X itself (8A)\n * • adjacent: same letter, ±1 (7A, 9A)\n * • relative: same number, opposite letter (8B)\n * • diagonal: opposite letter, ±1 (energy/mood) (7B, 9B)\n * This yields 6 compatible options regardless of tonality.\n */\nexport const camelotMatchType = (a: CamelotKey, b: CamelotKey): CamelotMatchType => {\n const numDiff = Math.abs(a.number - b.number);\n // Wrap-around: 12 ↔ 1 counts as distance 1\n const wrappedDiff = numDiff === 11 ? 1 : numDiff;\n\n if (a.number === b.number && a.letter === b.letter) return 'exact';\n // Relative key: same number, different letter (Am ↔ C)\n if (a.number === b.number && a.letter !== b.letter) return 'relative';\n // Adjacent: ±1 on the wheel, same letter\n if (a.letter === b.letter && wrappedDiff === 1) return 'adjacent';\n // Diagonal: ±1 on the wheel, opposite letter (energy + mood shift)\n if (a.letter !== b.letter && wrappedDiff === 1) return 'diagonal';\n return 'none';\n};\n\n/**\n * Transpose a key by a number of semitones.\n * Returns the new key and tonality (tonality is preserved).\n */\nexport const transposeKey = (key: IMusicKey, tonality: IMusicTonality, semitones: number): { key: IMusicKey; tonality: IMusicTonality } => {\n const base = keyToSemitones[key]; // 1-12\n const shifted = ((base - 1 + semitones % 12 + 12) % 12) + 1; // keep in 1-12 range\n return { key: semitonesToKey[shifted], tonality };\n};\n\nexport interface TransposeSuggestion {\n semitones: number;\n resultKey: IMusicKey;\n resultTonality: IMusicTonality;\n resultCamelot: CamelotKey;\n matchType: CamelotMatchType;\n label: string; // e.g. \"+2 → Bm (10A)\"\n}\n\n/**\n * Compute suggested transpose values for a track relative to other tracks.\n * Returns suggestions sorted by match quality (exact first) then minimal semitone shift.\n */\nexport const computeTransposeSuggestions = (\n trackKey: IMusicKey,\n trackTonality: IMusicTonality,\n otherTrackKeys: { key: IMusicKey; tonality: IMusicTonality }[],\n): TransposeSuggestion[] => {\n if (otherTrackKeys.length === 0) return [];\n\n const otherCamelots = otherTrackKeys\n .map(t => toCamelot(t.key, t.tonality))\n .filter((c): c is CamelotKey => c !== null);\n\n if (otherCamelots.length === 0) return [];\n\n // Use the first track (master) as primary reference\n const refCamelot = otherCamelots[0];\n\n const suggestions: TransposeSuggestion[] = [];\n\n for (let st = -12; st <= 12; st++) {\n const { key: rk, tonality: rt } = transposeKey(trackKey, trackTonality, st);\n const rc = toCamelot(rk, rt);\n if (!rc) continue;\n\n const matchType = camelotMatchType(refCamelot, rc);\n if (matchType === 'none') continue;\n\n const keyStr = `${rk}${rt === 'minor' ? 'm' : ''}`;\n suggestions.push({\n semitones: st,\n resultKey: rk,\n resultTonality: rt,\n resultCamelot: rc,\n matchType,\n label: `${st > 0 ? '+' : ''}${st} → ${keyStr} (${rc.label})`,\n });\n }\n\n const order: Record<CamelotMatchType, number> = { exact: 0, adjacent: 1, relative: 2, diagonal: 3, none: 4 };\n suggestions.sort((a, b) => {\n const od = order[a.matchType] - order[b.matchType];\n if (od !== 0) return od;\n return Math.abs(a.semitones) - Math.abs(b.semitones);\n });\n\n return suggestions;\n};\n","/**\n * DAW Cache Layer\n *\n * Two tiers:\n * 1. localStorage — lightweight session state (track layout, positions, mute regions, etc.)\n * 2. IndexedDB — heavy audio data (raw fMP4 ArrayBuffers) keyed by URL\n *\n * Normal refresh restores from cache. Hard refresh (Ctrl+Shift+R) clears the\n * in-memory singleton and falls through to a fresh load when localStorage is\n * still present. Call `clearAll()` to nuke everything.\n *\n * Project files (.stem-project) wrap PersistedSession with version + timestamps\n * for portable save/load across machines.\n */\n\nimport type { StemEffects } from './stem-effect-chain';\nimport type { PitchEngineSettings } from '../interfaces';\n\n// ──────────────────────────────────────────────────────────────────────────\n// 1. localStorage — Session State\n// ──────────────────────────────────────────────────────────────────────────\n\nconst SESSION_KEY = 'daw-session-v1';\n\nexport interface PersistedSession {\n id: string;\n mixName: string;\n masterTempo: number;\n originalTempo: number;\n masterBarLength48000: number;\n timeSignature: [number, number];\n globalPlaybackRate: number;\n playheadBar: number;\n loopRegion: { startBar: number; endBar: number } | null;\n /** Session-level timeline annotations (purely visual). */\n notes?: PersistedNote[];\n /** Each entry stores the ITrackForSequence URL + channel layout so the\n * controller can re-download & re-decode audio then restore positions. */\n tracks: PersistedTrack[];\n /**\n * Tracks that have been persisted in the session but not yet\n * decoded into the live store — surfaced in the timeline as\n * deferred rows the user can opt-in to load. On refresh we only\n * eagerly restore the first N entries from `tracks`; everything\n * else lands here so the user can fire them in on demand instead\n * of paying the full multi-track decode cost up-front.\n *\n * Treated as opaque ordered list — the UI renders these in the\n * same order the user last saw them.\n */\n pendingTracks?: PersistedTrack[];\n}\n\nexport interface PersistedNote {\n id: string;\n startBar: number;\n endBar: number;\n emoji: string;\n label: string;\n color: string;\n createdAt: number;\n}\n\nexport interface PersistedTrack {\n /** The original `trackData` needed to re-add via controller */\n trackDataJson: string;\n /** Channel layout to restore after audio is loaded */\n channels: PersistedChannel[];\n volume: number;\n muted: boolean;\n soloed: boolean;\n expanded: boolean;\n /** Display metadata (persisted so project files are self-describing) */\n color?: string;\n artwork?: string;\n displayName?: string;\n artistName?: string;\n /** User transpose offset in semitones */\n transposeSemitones?: number;\n /** Pitch engine configuration */\n pitchSettings?: PitchEngineSettings;\n /** Per-bar pitch compensation for quantized speed changes */\n perBarPitchCompensation?: boolean;\n /** Beat grid offset in beats (fractional) */\n beatGridOffsetBeats?: number;\n}\n\nexport interface PersistedChannel {\n stemIndex: number;\n volume: number;\n muted: boolean;\n soloed: boolean;\n visible: boolean;\n timelineStartBar: number;\n trimStartBar: number;\n trimEndBar: number;\n muteRegions: { startBar: number; endBar: number }[];\n resampledRegions?: { startBar: number; endBar: number; sliceCount: number }[];\n effects?: StemEffects;\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// Project file format (.stem-project)\n// ──────────────────────────────────────────────────────────────────────────\n\nexport interface DAWProjectFile {\n version: 1;\n createdAt: string;\n updatedAt: string;\n session: PersistedSession;\n /** Present when the file is password-protected */\n encrypted?: {\n salt: string;\n iv: string;\n ciphertext: string;\n };\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// Password encryption helpers (AES-256-GCM via Web Crypto)\n// ──────────────────────────────────────────────────────────────────────────\n\nasync function deriveKey(password: string, salt: Uint8Array): Promise<CryptoKey> {\n const enc = new TextEncoder();\n const keyMaterial = await crypto.subtle.importKey(\n 'raw', enc.encode(password), 'PBKDF2', false, ['deriveKey'],\n );\n return crypto.subtle.deriveKey(\n { name: 'PBKDF2', salt, iterations: 100_000, hash: 'SHA-256' },\n keyMaterial,\n { name: 'AES-GCM', length: 256 },\n false,\n ['encrypt', 'decrypt'],\n );\n}\n\nfunction bufToBase64(buf: ArrayBuffer): string {\n return btoa(String.fromCharCode(...new Uint8Array(buf)));\n}\n\nfunction base64ToBuf(b64: string): Uint8Array {\n const bin = atob(b64);\n const buf = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; i++) buf[i] = bin.charCodeAt(i);\n return buf;\n}\n\nasync function encryptPayload(json: string, password: string): Promise<DAWProjectFile['encrypted']> {\n const salt = crypto.getRandomValues(new Uint8Array(16));\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const key = await deriveKey(password, salt);\n const ciphertext = await crypto.subtle.encrypt(\n { name: 'AES-GCM', iv }, key, new TextEncoder().encode(json),\n );\n return {\n salt: bufToBase64(salt),\n iv: bufToBase64(iv),\n ciphertext: bufToBase64(ciphertext),\n };\n}\n\nasync function decryptPayload(enc: NonNullable<DAWProjectFile['encrypted']>, password: string): Promise<string> {\n const salt = base64ToBuf(enc.salt);\n const iv = base64ToBuf(enc.iv);\n const ciphertext = base64ToBuf(enc.ciphertext);\n const key = await deriveKey(password, salt);\n const plainBuf = await crypto.subtle.decrypt(\n { name: 'AES-GCM', iv }, key, ciphertext,\n );\n return new TextDecoder().decode(plainBuf);\n}\n\nexport function saveSession(session: PersistedSession): void {\n try {\n localStorage.setItem(SESSION_KEY, JSON.stringify(session));\n } catch {\n // Storage full or unavailable — silently degrade\n }\n}\n\nexport function loadSession(): PersistedSession | null {\n try {\n const raw = localStorage.getItem(SESSION_KEY);\n if (!raw) return null;\n return JSON.parse(raw) as PersistedSession;\n } catch {\n return null;\n }\n}\n\nexport function clearSession(): void {\n try { localStorage.removeItem(SESSION_KEY); } catch { /* noop */ }\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// 2. IndexedDB — Audio Data Cache\n// ──────────────────────────────────────────────────────────────────────────\n\nconst DB_NAME = 'daw-audio-cache';\nconst DB_VERSION = 1;\nconst STORE_NAME = 'mp4-buffers';\n\nfunction openDB(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(DB_NAME, DB_VERSION);\n req.onupgradeneeded = () => {\n const db = req.result;\n if (!db.objectStoreNames.contains(STORE_NAME)) {\n db.createObjectStore(STORE_NAME);\n }\n };\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\n\nexport async function cacheAudioBuffer(url: string, data: ArrayBuffer): Promise<void> {\n try {\n const db = await openDB();\n const tx = db.transaction(STORE_NAME, 'readwrite');\n tx.objectStore(STORE_NAME).put(data, url);\n await new Promise<void>((res, rej) => { tx.oncomplete = () => res(); tx.onerror = () => rej(tx.error); });\n } catch {\n // IndexedDB unavailable — skip caching\n }\n}\n\nexport async function getCachedAudioBuffer(url: string): Promise<ArrayBuffer | null> {\n try {\n const db = await openDB();\n const tx = db.transaction(STORE_NAME, 'readonly');\n const req = tx.objectStore(STORE_NAME).get(url);\n return new Promise((resolve) => {\n req.onsuccess = () => resolve(req.result ?? null);\n req.onerror = () => resolve(null);\n });\n } catch {\n return null;\n }\n}\n\nexport async function clearAudioCache(): Promise<void> {\n try {\n const db = await openDB();\n const tx = db.transaction(STORE_NAME, 'readwrite');\n tx.objectStore(STORE_NAME).clear();\n await new Promise<void>((res) => { tx.oncomplete = () => res(); });\n } catch { /* noop */ }\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// Combined clear\n// ──────────────────────────────────────────────────────────────────────────\n\nexport async function clearAll(): Promise<void> {\n clearSession();\n await clearAudioCache();\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// 3. Project file export / import (.stem-project)\n// ──────────────────────────────────────────────────────────────────────────\n\nconst PROJECT_FILE_VERSION = 1 as const;\n\ninterface BuildableTrack {\n trackData: unknown;\n channels: Array<{\n stemIndex: number;\n volume: number;\n muted: boolean;\n soloed: boolean;\n visible: boolean;\n timelineStartBar: number;\n trimStartBar: number;\n trimEndBar: number;\n muteRegions: { startBar: number; endBar: number }[];\n resampledRegions?: { startBar: number; endBar: number; sliceCount: number }[];\n effects?: StemEffects;\n }>;\n volume: number;\n muted: boolean;\n soloed: boolean;\n expanded: boolean;\n color: string;\n artwork: string;\n displayName: string;\n artistName: string;\n transposeSemitones?: number;\n pitchSettings?: PitchEngineSettings;\n perBarPitchCompensation?: boolean;\n beatGridOffsetBeats?: number;\n}\n\ninterface BuildableSession {\n id: string;\n mixName: string;\n masterTempo: number;\n originalTempo: number;\n masterBarLength48000: number;\n timeSignature: [number, number];\n globalPlaybackRate: number;\n playheadBar: number;\n loopRegion: { startBar: number; endBar: number } | null;\n notes: PersistedNote[];\n tracks: BuildableTrack[];\n /**\n * Deferred-restore queue. These are already-shaped `PersistedTrack`\n * records (from a previous restoreSession pass) that the user has\n * not yet promoted into the live timeline. They round-trip through\n * localStorage so subsequent refreshes keep showing the same\n * pending list rather than re-introducing tracks the user never\n * asked to load.\n */\n pendingTracks?: PersistedTrack[];\n}\n\n/**\n * Build a PersistedSession snapshot from a DAW session state object.\n * Shared by both schedulePersist (localStorage) and exportProject (file).\n */\nexport function buildPersistedSession(s: BuildableSession): PersistedSession {\n return {\n id: s.id,\n mixName: s.mixName,\n masterTempo: s.masterTempo,\n originalTempo: s.originalTempo,\n masterBarLength48000: s.masterBarLength48000,\n timeSignature: s.timeSignature,\n globalPlaybackRate: s.globalPlaybackRate,\n playheadBar: s.playheadBar,\n loopRegion: s.loopRegion,\n notes: s.notes?.map((n) => ({ ...n })) ?? [],\n tracks: s.tracks.map((t): PersistedTrack => ({\n trackDataJson: JSON.stringify(t.trackData),\n channels: t.channels.map((ch): PersistedChannel => ({\n stemIndex: ch.stemIndex,\n volume: ch.volume,\n muted: ch.muted,\n soloed: ch.soloed,\n visible: ch.visible,\n timelineStartBar: ch.timelineStartBar,\n trimStartBar: ch.trimStartBar,\n trimEndBar: ch.trimEndBar,\n muteRegions: ch.muteRegions.map((r) => ({ startBar: r.startBar, endBar: r.endBar })),\n resampledRegions: ch.resampledRegions?.map((r) => ({\n startBar: r.startBar, endBar: r.endBar, sliceCount: r.sliceCount,\n })),\n effects: ch.effects ? JSON.parse(JSON.stringify(ch.effects)) : undefined,\n })),\n volume: t.volume,\n muted: t.muted,\n soloed: t.soloed,\n expanded: t.expanded,\n color: t.color,\n artwork: t.artwork,\n displayName: t.displayName,\n artistName: t.artistName,\n transposeSemitones: t.transposeSemitones ?? 0,\n pitchSettings: t.pitchSettings,\n perBarPitchCompensation: t.perBarPitchCompensation === false ? false : (t.perBarPitchCompensation ?? true),\n beatGridOffsetBeats: t.beatGridOffsetBeats ?? 0,\n })),\n // Pending tracks are already in PersistedTrack shape; pass\n // them through verbatim so the deferred-load queue survives a\n // refresh. We deep-clone to detach from the store's reference\n // (matches the rest of this function's \"snapshot, not view\"\n // contract).\n pendingTracks: s.pendingTracks && s.pendingTracks.length > 0\n ? s.pendingTracks.map((pt) => ({ ...pt }))\n : undefined,\n };\n}\n\n/** Export the current session as a downloadable .stem-project file.\n * If a password is supplied the session payload is AES-256-GCM encrypted. */\nexport async function exportProject(session: PersistedSession, password?: string): Promise<void> {\n const now = new Date().toISOString();\n\n let project: DAWProjectFile;\n\n if (password && password.length > 0) {\n const innerProject: DAWProjectFile = {\n version: PROJECT_FILE_VERSION,\n createdAt: now,\n updatedAt: now,\n session,\n };\n const enc = await encryptPayload(JSON.stringify(innerProject), password);\n project = {\n version: PROJECT_FILE_VERSION,\n createdAt: now,\n updatedAt: now,\n session: undefined as unknown as PersistedSession,\n encrypted: enc,\n };\n } else {\n project = {\n version: PROJECT_FILE_VERSION,\n createdAt: now,\n updatedAt: now,\n session,\n };\n }\n\n const json = JSON.stringify(project, null, 2);\n const blob = new Blob([json], { type: 'application/json' });\n const filename = `${session.mixName || 'untitled'}.stem-project`;\n\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// 4. Local Project Library (IndexedDB)\n// ──────────────────────────────────────────────────────────────────────────\n\nconst PROJECT_DB_NAME = 'daw-project-library';\nconst PROJECT_DB_VERSION = 1;\nconst PROJECT_STORE = 'projects';\n\nexport interface ProjectMeta {\n id: string;\n name: string;\n createdAt: string;\n updatedAt: string;\n trackCount: number;\n masterTempo: number;\n artworks: string[];\n}\n\ninterface StoredProject {\n meta: ProjectMeta;\n data: DAWProjectFile;\n}\n\nfunction openProjectDB(): Promise<IDBDatabase> {\n return new Promise((resolve, reject) => {\n const req = indexedDB.open(PROJECT_DB_NAME, PROJECT_DB_VERSION);\n req.onupgradeneeded = () => {\n const db = req.result;\n if (!db.objectStoreNames.contains(PROJECT_STORE)) {\n db.createObjectStore(PROJECT_STORE, { keyPath: 'meta.id' });\n }\n };\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error);\n });\n}\n\nexport async function saveProjectToLibrary(session: PersistedSession): Promise<ProjectMeta> {\n const now = new Date().toISOString();\n const project: DAWProjectFile = {\n version: PROJECT_FILE_VERSION,\n createdAt: now,\n updatedAt: now,\n session,\n };\n\n const artworks = session.tracks\n .map(t => t.artwork)\n .filter((a): a is string => !!a && a.length > 0)\n .slice(0, 4);\n\n const meta: ProjectMeta = {\n id: session.id,\n name: session.mixName || 'Untitled Mix',\n createdAt: now,\n updatedAt: now,\n trackCount: session.tracks.length,\n masterTempo: Math.round(session.masterTempo),\n artworks,\n };\n\n const stored: StoredProject = { meta, data: project };\n\n try {\n const db = await openProjectDB();\n // Check if project exists to preserve createdAt\n const existing = await new Promise<StoredProject | undefined>((resolve) => {\n const tx = db.transaction(PROJECT_STORE, 'readonly');\n const req = tx.objectStore(PROJECT_STORE).get(session.id);\n req.onsuccess = () => resolve(req.result as StoredProject | undefined);\n req.onerror = () => resolve(undefined);\n });\n if (existing) {\n meta.createdAt = existing.meta.createdAt;\n stored.data.createdAt = existing.data.createdAt;\n }\n\n const tx = db.transaction(PROJECT_STORE, 'readwrite');\n tx.objectStore(PROJECT_STORE).put(stored);\n await new Promise<void>((res, rej) => { tx.oncomplete = () => res(); tx.onerror = () => rej(tx.error); });\n } catch (err) {\n console.warn('[ProjectLibrary] Failed to save:', err);\n }\n\n return meta;\n}\n\nexport async function listProjects(): Promise<ProjectMeta[]> {\n try {\n const db = await openProjectDB();\n const tx = db.transaction(PROJECT_STORE, 'readonly');\n const store = tx.objectStore(PROJECT_STORE);\n const all = await new Promise<StoredProject[]>((resolve) => {\n const req = store.getAll();\n req.onsuccess = () => resolve(req.result as StoredProject[]);\n req.onerror = () => resolve([]);\n });\n return all\n .map(s => s.meta)\n .sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());\n } catch {\n return [];\n }\n}\n\nexport async function loadProjectFromLibrary(id: string): Promise<DAWProjectFile | null> {\n try {\n const db = await openProjectDB();\n const tx = db.transaction(PROJECT_STORE, 'readonly');\n const req = tx.objectStore(PROJECT_STORE).get(id);\n return new Promise((resolve) => {\n req.onsuccess = () => {\n const stored = req.result as StoredProject | undefined;\n resolve(stored?.data ?? null);\n };\n req.onerror = () => resolve(null);\n });\n } catch {\n return null;\n }\n}\n\nexport async function deleteProjectFromLibrary(id: string): Promise<void> {\n try {\n const db = await openProjectDB();\n const tx = db.transaction(PROJECT_STORE, 'readwrite');\n tx.objectStore(PROJECT_STORE).delete(id);\n await new Promise<void>((res) => { tx.oncomplete = () => res(); });\n } catch { /* noop */ }\n}\n\n/** Returns true if a parsed project file is password-protected. */\nexport function isProjectEncrypted(file: Record<string, unknown>): boolean {\n return !!(file.encrypted && typeof file.encrypted === 'object');\n}\n\n/** Parse and validate a .stem-project file. Throws on invalid data.\n * If the file is encrypted, `password` must be supplied. */\nexport async function importProject(file: File, password?: string): Promise<DAWProjectFile> {\n const text = await file.text();\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n throw new Error('Invalid project file: not valid JSON');\n }\n\n let obj = parsed as Record<string, unknown>;\n\n if (typeof obj !== 'object' || obj === null) {\n throw new Error('Invalid project file: expected a JSON object');\n }\n if (obj.version !== PROJECT_FILE_VERSION) {\n throw new Error(`Unsupported project version: ${obj.version} (expected ${PROJECT_FILE_VERSION})`);\n }\n\n if (isProjectEncrypted(obj)) {\n if (!password) {\n throw new Error('PASSWORD_REQUIRED');\n }\n const enc = obj.encrypted as NonNullable<DAWProjectFile['encrypted']>;\n let decryptedJson: string;\n try {\n decryptedJson = await decryptPayload(enc, password);\n } catch {\n throw new Error('WRONG_PASSWORD');\n }\n let inner: unknown;\n try {\n inner = JSON.parse(decryptedJson);\n } catch {\n throw new Error('WRONG_PASSWORD');\n }\n obj = inner as Record<string, unknown>;\n }\n\n const session = obj.session as PersistedSession | undefined;\n if (!session || typeof session !== 'object') {\n throw new Error('Invalid project file: missing session data');\n }\n if (!Array.isArray(session.tracks) || session.tracks.length === 0) {\n throw new Error('Invalid project file: session has no tracks');\n }\n\n for (const t of session.tracks) {\n if (!t.trackDataJson || typeof t.trackDataJson !== 'string') {\n throw new Error('Invalid project file: track missing trackDataJson');\n }\n try { JSON.parse(t.trackDataJson); } catch {\n throw new Error('Invalid project file: track has corrupt trackDataJson');\n }\n }\n\n return obj as unknown as DAWProjectFile;\n}\n","import { create } from 'zustand';\nimport { v4 as uuid } from 'uuid';\nimport type { ITrackForSequence } from '@/stem-audio-engine-v3/interface';\nimport type { DAWSession, DAWTrack, DAWChannel, StemId, MuteRegion, DAWToolMode, ClipboardEntry, StemSelectionRange, PitchEngineSettings, SessionNote } from '../interfaces';\nimport type { SimilarTracksQueryArgs } from '../services/track-search-api';\nimport type { PersistedTrack } from '../engine/daw-cache';\nimport {\n createDefaultChannels,\n segmentInfoToSections,\n findFirstSectionOfType,\n SEGMENT_TYPE,\n DEFAULT_PITCH_SETTINGS,\n} from '../interfaces';\nimport {\n composeBarsFromBeats,\n medianBarDuration,\n barDurationToBpm,\n bpmToBarDuration,\n type IBeat,\n type IBarMapping,\n} from '../primitives/bar-utils';\nimport { calculateTempoMatch, computePitchShift, PitchShiftStrategy } from '../primitives/tempo-utils';\nimport {\n saveSession as persistSession,\n buildPersistedSession,\n saveProjectToLibrary,\n} from '../engine/daw-cache';\n\n// ──────────────────────────────────────────────────────────────────────────\n// Undo / Redo\n// ──────────────────────────────────────────────────────────────────────────\n\nconst MAX_UNDO = 60;\n\n/** The portion of state that we snapshot for undo/redo. */\ninterface UndoableSnapshot {\n tracks: DAWTrack[];\n masterTempo: number;\n originalTempo: number;\n masterBarLength48000: number;\n loopRegion: { startBar: number; endBar: number } | null;\n mixName: string;\n notes: SessionNote[];\n}\n\nfunction captureSnapshot(state: DAWSessionState): UndoableSnapshot {\n return {\n tracks: JSON.parse(JSON.stringify(state.tracks)),\n masterTempo: state.masterTempo,\n originalTempo: state.originalTempo,\n masterBarLength48000: state.masterBarLength48000,\n loopRegion: state.loopRegion ? { ...state.loopRegion } : null,\n mixName: state.mixName,\n notes: state.notes.map((n) => ({ ...n })),\n };\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// Debounced session persistence\n// ──────────────────────────────────────────────────────────────────────────\n\nlet _saveTimer: ReturnType<typeof setTimeout> | null = null;\nlet _librarySaveTimer: ReturnType<typeof setTimeout> | null = null;\nconst SAVE_DEBOUNCE_MS = 1500;\nconst LIBRARY_SAVE_DEBOUNCE_MS = 10_000;\n\nfunction schedulePersist(_state: DAWSessionState): void {\n if (_saveTimer) clearTimeout(_saveTimer);\n _saveTimer = setTimeout(() => {\n persistSession(buildPersistedSession(useDAWSessionStore.getState()));\n }, SAVE_DEBOUNCE_MS);\n\n if (_librarySaveTimer) clearTimeout(_librarySaveTimer);\n _librarySaveTimer = setTimeout(() => {\n const s = useDAWSessionStore.getState();\n if (s.tracks.length > 0) {\n saveProjectToLibrary(buildPersistedSession(s));\n }\n }, LIBRARY_SAVE_DEBOUNCE_MS);\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// Beat grid offset utility\n// ──────────────────────────────────────────────────────────────────────────\n\nconst SAMPLE_RATE = 48000;\n\n/**\n * Recompute bar mapping from the original beats with an offset applied.\n * The offset is in beats (fractional). For 4/4 time, beat numbers cycle 1–4.\n * An offset of +1 means the original beat 2 becomes the new downbeat.\n * For sub-beat precision, we interpolate between beat frames.\n */\nfunction composeBarsWithOffset(beats: IBeat[], offsetBeats: number): IBarMapping[] {\n if (offsetBeats === 0) return composeBarsFromBeats(beats);\n if (beats.length < 2) return composeBarsFromBeats(beats);\n\n const intervals: number[] = [];\n for (let i = 1; i < beats.length; i++) {\n intervals.push(beats[i].frame - beats[i - 1].frame);\n }\n intervals.sort((a, b) => a - b);\n const medianInterval = intervals[Math.floor(intervals.length / 2)] || 0;\n\n const wholeBeatOffset = Math.floor(offsetBeats);\n const fracBeatOffset = offsetBeats - wholeBeatOffset;\n const frameFracOffset = Math.round(fracBeatOffset * medianInterval);\n\n const offsetBeatsList: IBeat[] = [];\n for (let i = 0; i < beats.length; i++) {\n const origBeat = beats[i];\n const newFrame = origBeat.frame + frameFracOffset;\n if (newFrame < 0) continue;\n\n const shifted = ((origBeat.number - 1 - wholeBeatOffset) % 4 + 4) % 4 + 1;\n offsetBeatsList.push({\n frame: newFrame,\n number: shifted,\n timestamp: newFrame / SAMPLE_RATE,\n });\n }\n\n const result = composeBarsFromBeats(offsetBeatsList);\n\n // Guard: if offset produces fewer than 2 bars, fall back to the un-offset grid\n // to prevent empty bar maps that silence/break the track.\n if (result.length < 2) return composeBarsFromBeats(beats);\n\n return result;\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// Store state & actions\n// ──────────────────────────────────────────────────────────────────────────\n\ninterface DAWSessionState extends DAWSession {\n // ── Mix name ──\n setMixName: (name: string) => void;\n\n // ── Tool mode ──\n toolMode: DAWToolMode;\n setToolMode: (mode: DAWToolMode) => void;\n\n /**\n * \"Composite View\" — purely a render flag. When true, every track's\n * channels collapse to a single shared 4-stem strip on the timeline:\n * all stem-0 lanes share one Y, all stem-1 lanes the next, etc. The\n * canvas naturally layers their waveforms so the user can see the\n * whole arrangement at a glance. Audio routing, mute/solo/transpose\n * state, and the underlying tracks list are completely untouched.\n *\n * Interactive editing (drag-trim, marquee select, slice, drag-move)\n * is disabled while composite view is on — switch it off to edit.\n */\n compositeView: boolean;\n setCompositeView: (on: boolean) => void;\n toggleCompositeView: () => void;\n\n /**\n * User-facing tuning for the `similarTracks` GraphQL query, shared\n * by the Add-Track modal and the Similar-Tracks sidebar so changes\n * in one re-fire the fetch in the other.\n *\n * Two independent axes, each shown as a DJ-style tick fader:\n *\n * • `balance` — 0..1, default 0.5 (centre = \"use both equally\").\n * Drives `genreWeight` as `1 - balance`, so:\n * balance 0 → genreWeight 1 (all musicality, tight genre)\n * balance 0.5 → no override (server default)\n * balance 1 → genreWeight 0 (all vibe, ignore genre)\n *\n * • `popularity` — 0..2, default 1 (centre = server default).\n * Drives `collaborativeStrength` directly:\n * popularity 0 → no engagement boost (deep cuts)\n * popularity 1 → no override\n * popularity 2 → max engagement boost (mainstream)\n *\n * When both knobs are at their defaults the outgoing GraphQL\n * variables are byte-identical to the pre-tuning shape (no\n * `ranking` arg at all).\n */\n similarTracksBalance: number;\n similarTracksPopularity: number;\n\n /** Clamped internally to [0, 1]. */\n setSimilarTracksBalance: (v: number) => void;\n /** Clamped internally to [0, 2]. */\n setSimilarTracksPopularity: (v: number) => void;\n /** Restore both knobs to their untouched/default position. */\n resetSimilarTracksTuning: () => void;\n /** Build the GraphQL args object — `undefined` fields are dropped server-side. */\n getSimilarTracksQueryArgs: () => SimilarTracksQueryArgs;\n\n // ── Selection (per-stem) ──\n selectedStem: StemId | null;\n setSelectedStem: (stem: StemId | null) => void;\n /**\n * Multi-stem selections. All entries must share the same `trackId`\n * (selections are scoped to a single track at a time). Adding a range on\n * a different track replaces the entire set.\n */\n selections: StemSelectionRange[];\n setSelections: (ranges: StemSelectionRange[]) => void;\n addSelection: (range: StemSelectionRange) => void;\n clearSelections: () => void;\n /**\n * Compatibility shim: the \"primary\" (first) selection. Reading this\n * surfaces the first selection range; writing replaces the entire set\n * with either zero or one range. Prefer `selections` for new code.\n */\n selectionRange: StemSelectionRange | null;\n setSelectionRange: (range: StemSelectionRange | null) => void;\n\n // ── Clipboard ──\n /**\n * Multi-stem clipboard. All entries are expected to share a `trackId`\n * (copies a snapshot of one or more stems from a single track).\n */\n clipboardEntries: ClipboardEntry[];\n setClipboardEntries: (entries: ClipboardEntry[]) => void;\n /** Compatibility shim: the first clipboard entry, or null. */\n clipboard: ClipboardEntry | null;\n setClipboard: (entry: ClipboardEntry | null) => void;\n\n // ── Undo / Redo ──\n _undoStack: UndoableSnapshot[];\n _redoStack: UndoableSnapshot[];\n /** Push current state onto the undo stack (call BEFORE making the change). */\n pushUndo: () => void;\n undo: () => void;\n redo: () => void;\n canUndo: () => boolean;\n canRedo: () => boolean;\n\n // ── Track management ──\n addTrack: (trackData: ITrackForSequence) => DAWTrack;\n removeTrack: (trackId: string) => void;\n reorderTrack: (trackId: string, newIndex: number) => void;\n\n // ── Deferred-load queue ──\n /**\n * Tracks that exist in the persisted session but haven't been\n * decoded into the live timeline yet. Populated by\n * `restoreSession` when `eagerLoadCount` is smaller than the\n * persisted tracks list; surfaced in the timeline so the user\n * can opt-in to load them one-by-one (or all at once) instead of\n * paying the full multi-track decode cost on refresh.\n *\n * These are NOT included in undo snapshots — promoting a\n * pending track to a live track is a side-effecting load, not a\n * structural edit, so the undo stack stays focused on\n * user-driven timeline state.\n */\n pendingTracks: PersistedTrack[];\n /** Replace the entire pending list (used by restoreSession). */\n setPendingTracks: (tracks: PersistedTrack[]) => void;\n /** Append more pending tracks to the existing queue. */\n addPendingTracks: (tracks: PersistedTrack[]) => void;\n /** Remove a single pending track by index — called after the\n * promote-to-live action has finished loading audio. */\n removePendingTrackAt: (index: number) => void;\n /** Drop all pending tracks (used when the user clears the session). */\n clearPendingTracks: () => void;\n\n // ── Per-stem timeline editing ──\n setStemTimelineStart: (trackId: string, stemIndex: number, bar: number) => void;\n setStemTrim: (trackId: string, stemIndex: number, trimStart: number, trimEnd: number) => void;\n /** Move all stems of a track together */\n setTrackTimelineStart: (trackId: string, bar: number) => void;\n /** Trim all stems of a track together */\n setTrackTrim: (trackId: string, trimStart: number, trimEnd: number) => void;\n\n // ── Transport ──\n setPlaying: (playing: boolean) => void;\n setPlayheadBar: (bar: number) => void;\n setMasterTempo: (bpm: number) => void;\n setGlobalPlaybackRate: (rate: number) => void;\n setLoopRegion: (region: { startBar: number; endBar: number } | null) => void;\n setBarSubdivisions: (n: number) => void;\n\n // ── Session notes (timeline markers) ──\n /** Add a fully-formed note. Returns its id. Pushes undo. */\n addNote: (note: Omit<SessionNote, 'id' | 'createdAt'>) => string;\n /** Patch a subset of a note's fields. No-op if id is unknown. Pushes undo. */\n updateNote: (id: string, patch: Partial<Omit<SessionNote, 'id' | 'createdAt'>>) => void;\n /** Remove a note by id. No-op if id is unknown. Pushes undo. */\n removeNote: (id: string) => void;\n\n // ── Track controls ──\n setTrackVolume: (trackId: string, volume: number) => void;\n setTrackMuted: (trackId: string, muted: boolean) => void;\n setTrackSoloed: (trackId: string, soloed: boolean) => void;\n setTrackExpanded: (trackId: string, expanded: boolean) => void;\n\n // ── Channel (stem) controls ──\n setChannelVolume: (trackId: string, stemIndex: number, volume: number) => void;\n setChannelMuted: (trackId: string, stemIndex: number, muted: boolean) => void;\n setChannelSoloed: (trackId: string, stemIndex: number, soloed: boolean) => void;\n setChannelVisible: (trackId: string, stemIndex: number, visible: boolean) => void;\n\n // ── Effects ──\n setChannelEffects: (trackId: string, stemIndex: number, effects: import('../engine/stem-effect-chain').StemEffects) => void;\n\n // ── Transpose / Pitch ──\n setTrackTranspose: (trackId: string, semitones: number) => void;\n setTrackPitchSettings: (trackId: string, settings: PitchEngineSettings) => void;\n setPerBarPitchCompensation: (trackId: string, enabled: boolean) => void;\n\n // ── Beat grid alignment ──\n /** Shift a track's beat grid by a fractional beat amount (recomputes barMapping) */\n setTrackBeatGridOffset: (trackId: string, offsetBeats: number) => void;\n /** Replace a track's raw beats array and recompute its bar mapping (used by Beats Lab model switching) */\n replaceTrackBeats: (trackId: string, newBeats: IBeat[]) => void;\n\n // ── Mute regions (silenced sections within a stem) ──\n addMuteRegion: (trackId: string, stemIndex: number, region: MuteRegion) => void;\n removeMuteRegion: (trackId: string, stemIndex: number, regionIndex: number) => void;\n clearMuteRegions: (trackId: string, stemIndex: number) => void;\n /** Replace all mute regions at once without pushing undo (for live drag previews). */\n setMuteRegionsBatch: (trackId: string, stemIndex: number, regions: MuteRegion[]) => void;\n /** Split a stem at a bar position — creates two mute-region-free halves by inserting a mute at the cut point */\n splitStemAtBar: (trackId: string, stemIndex: number, bar: number) => void;\n\n // ── Split points (logical clip boundaries — no audio side effect) ──\n /**\n * Add a single split point at the given local bar (relative to track\n * barMapping). Pushes undo. No-op if the bar is outside the trim window\n * or already a split point (within 0.001-bar tolerance).\n */\n addSplitPoint: (trackId: string, stemIndex: number, localBar: number) => void;\n /**\n * Replace the entire splitPoints array. Used for batch slicing\n * (every-bar / every-beat / every-section) and for undo restore.\n * Pushes undo when `pushUndo` is true.\n */\n setSplitPointsBatch: (trackId: string, stemIndex: number, points: number[], pushUndo?: boolean) => void;\n /** Clear all split points on a stem. Pushes undo. */\n clearSplitPoints: (trackId: string, stemIndex: number) => void;\n\n // ── Resampled regions ──\n addResampledRegion: (trackId: string, stemIndex: number, region: import('../interfaces').ResampledRegion) => void;\n\n // ── Derived ──\n getTimelineLength: () => number;\n getTrackById: (trackId: string) => DAWTrack | undefined;\n getChannel: (trackId: string, stemIndex: number) => DAWChannel | undefined;\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n\n/** Merge overlapping/adjacent mute regions and sort by startBar. */\nfunction mergeMuteRegions(regions: MuteRegion[]): MuteRegion[] {\n if (regions.length <= 1) return regions;\n const sorted = [...regions].sort((a, b) => a.startBar - b.startBar);\n const merged: MuteRegion[] = [sorted[0]];\n for (let i = 1; i < sorted.length; i++) {\n const last = merged[merged.length - 1];\n if (sorted[i].startBar <= last.endBar) {\n last.endBar = Math.max(last.endBar, sorted[i].endBar);\n } else {\n merged.push(sorted[i]);\n }\n }\n return merged;\n}\n\nconst recalculateSpeedRatios = (tracks: DAWTrack[], masterBarLength: number): DAWTrack[] =>\n tracks.map((track) => {\n const tempoMatch = calculateTempoMatch(masterBarLength, track.nativeBarLength);\n return {\n ...track,\n speedRatioToMaster: tempoMatch.playbackRate,\n tempoRatio: tempoMatch.ratio,\n };\n });\n\n// ──────────────────────────────────────────────────────────────────────────\n// Smart alignment: computes where a new track's stems should be placed\n// on the timeline to align musically with existing tracks.\n// ──────────────────────────────────────────────────────────────────────────\n\nfunction computeSmartAlignment(\n existingTracks: DAWTrack[],\n newBarMapping: { sampleStart: number; sampleEnd: number; duration: number }[],\n newSegmentInfo: [number, number, number][],\n): number {\n if (existingTracks.length === 0) return 0;\n\n const newSections = segmentInfoToSections(newSegmentInfo, newBarMapping);\n const newAnchor = findFirstSectionOfType(newSections, [\n SEGMENT_TYPE.CHORUS,\n SEGMENT_TYPE.VERSE,\n SEGMENT_TYPE.BRIDGE,\n SEGMENT_TYPE.INTRO,\n ]);\n if (!newAnchor) return 0;\n\n const refTrack = existingTracks[0];\n const refSections = segmentInfoToSections(refTrack.segmentInfo, refTrack.barMapping);\n\n // Try to match the same section type first, then fall through\n const matchTypes = [newAnchor.type, SEGMENT_TYPE.CHORUS, SEGMENT_TYPE.VERSE];\n let refAnchor = null;\n for (const t of matchTypes) {\n refAnchor = refSections.find((s) => s.type === t);\n if (refAnchor) break;\n }\n if (!refAnchor) refAnchor = findFirstSectionOfType(refSections);\n if (!refAnchor) return 0;\n\n // Reference track's anchor on the timeline — use the first visible channel's position\n const refChannel = refTrack.channels.find((ch) => ch.visible) || refTrack.channels[0];\n const refAnchorTimeline = refChannel.timelineStartBar + refAnchor.startBar;\n\n // Offset new track so its anchor aligns with the reference anchor\n const offset = refAnchorTimeline - newAnchor.startBar;\n return Math.max(0, Math.round(offset));\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n\nexport const useDAWSessionStore = create<DAWSessionState>((set, get) => ({\n // ── Initial state ──\n id: uuid(),\n mixName: 'Untitled Mix',\n masterTempo: 0,\n originalTempo: 0,\n masterBarLength48000: 0,\n timeSignature: [4, 4] as [number, number],\n tracks: [],\n playheadBar: 0,\n isPlaying: false,\n globalPlaybackRate: 1.0,\n loopRegion: null,\n barSubdivisions: 1,\n notes: [] as SessionNote[],\n pendingTracks: [] as PersistedTrack[],\n toolMode: 'pointer' as DAWToolMode,\n compositeView: false,\n similarTracksBalance: 0.5,\n similarTracksPopularity: 1,\n selectedStem: null,\n selections: [],\n selectionRange: null,\n clipboardEntries: [],\n clipboard: null,\n _undoStack: [] as UndoableSnapshot[],\n _redoStack: [] as UndoableSnapshot[],\n\n // ──────────────────────────────────────────────────────────────────\n // Track management\n // ──────────────────────────────────────────────────────────────────\n\n addTrack: (trackData: ITrackForSequence): DAWTrack => {\n get().pushUndo();\n const state = get();\n const barMapping = composeBarsFromBeats(trackData.beats);\n const nativeBarLength = trackData.tempoOrigSz || medianBarDuration(barMapping);\n const nativeBpm = trackData.bpm || barDurationToBpm(nativeBarLength);\n\n const isFirstTrack = state.tracks.length === 0;\n const masterBarLength = isFirstTrack ? nativeBarLength : state.masterBarLength48000;\n const masterTempo = isFirstTrack ? nativeBpm : state.masterTempo;\n\n const tempoMatch = calculateTempoMatch(masterBarLength, nativeBarLength);\n\n const pitchCorrection = computePitchShift(\n state.tracks[0]?.key ?? trackData.key,\n state.tracks[0]?.tonality ?? trackData.tonality,\n masterBarLength,\n trackData.key,\n trackData.tonality,\n nativeBarLength,\n PitchShiftStrategy.KEY_PRESERVE,\n );\n\n const rawColor = trackData.colors?.[0] || trackData.artworkGlowColor || trackData.color1Hex;\n const resolvedColor = rawColor ? (rawColor.startsWith('#') ? rawColor : `#${rawColor}`) : '#5b8def';\n\n const segmentInfo: [number, number, number][] = trackData.segmentInfo ?? [];\n const timelineStart = computeSmartAlignment(state.tracks, barMapping, segmentInfo);\n const trimEnd = barMapping.length - 1;\n\n const newTrack: DAWTrack = {\n id: uuid(),\n trackData,\n audioSourceSequenceId: trackData.trackId,\n barMapping,\n segmentInfo,\n nativeBarLength,\n nativeBpm,\n speedRatioToMaster: tempoMatch.playbackRate,\n tempoRatio: tempoMatch.ratio,\n pitchCorrectionSemitones: pitchCorrection,\n key: trackData.key,\n tonality: trackData.tonality,\n beatGridOffsetBeats: 0,\n transposeSemitones: 0,\n pitchSettings: { ...DEFAULT_PITCH_SETTINGS },\n perBarPitchCompensation: true,\n channels: createDefaultChannels(timelineStart, 0, trimEnd),\n volume: 1.0,\n muted: false,\n soloed: false,\n color: resolvedColor,\n artwork: trackData.artwork || '',\n displayName: trackData.name || trackData.trackDisplayName || 'Untitled',\n artistName: trackData.artistDisplayName || 'Unknown',\n expanded: false,\n };\n\n const updatedTracks = [...state.tracks, newTrack];\n\n if (isFirstTrack) {\n set({\n masterTempo: masterTempo,\n originalTempo: masterTempo,\n masterBarLength48000: masterBarLength,\n tracks: updatedTracks,\n });\n } else {\n set({ tracks: recalculateSpeedRatios(updatedTracks, masterBarLength) });\n }\n schedulePersist(get());\n return newTrack;\n },\n\n removeTrack: (trackId: string) => {\n get().pushUndo();\n const state = get();\n const filtered = state.tracks.filter((t) => t.id !== trackId);\n\n if (filtered.length === 0) {\n set({ tracks: [], masterTempo: 0, originalTempo: 0, masterBarLength48000: 0 });\n schedulePersist(get());\n return;\n }\n\n if (state.tracks[0]?.id === trackId) {\n const newMaster = filtered[0];\n const masterBarLength = newMaster.nativeBarLength;\n const masterTempo = newMaster.nativeBpm;\n set({\n masterTempo,\n originalTempo: masterTempo,\n masterBarLength48000: masterBarLength,\n tracks: recalculateSpeedRatios(filtered, masterBarLength),\n });\n } else {\n set({ tracks: filtered });\n }\n schedulePersist(get());\n },\n\n reorderTrack: (trackId: string, newIndex: number) => {\n get().pushUndo();\n const state = get();\n const tracks = [...state.tracks];\n const currentIdx = tracks.findIndex((t) => t.id === trackId);\n if (currentIdx === -1) return;\n const [track] = tracks.splice(currentIdx, 1);\n const clampedIndex = Math.max(0, Math.min(newIndex, tracks.length));\n tracks.splice(clampedIndex, 0, track);\n\n const newMaster = tracks[0];\n const oldMasterId = state.tracks[0]?.id;\n if (newMaster.id !== oldMasterId) {\n const masterBarLength = newMaster.nativeBarLength;\n const masterTempo = newMaster.nativeBpm;\n set({\n masterTempo,\n originalTempo: masterTempo,\n masterBarLength48000: masterBarLength,\n tracks: recalculateSpeedRatios(tracks, masterBarLength),\n });\n } else {\n set({ tracks });\n }\n schedulePersist(get());\n },\n\n // ──────────────────────────────────────────────────────────────────\n // Deferred-load queue\n //\n // Pending mutations bypass the undo stack on purpose: promoting a\n // pending track is a network/decode operation that the user can\n // always reverse with a normal \"remove track\" (which IS undoable).\n // Conversely, blanking the queue on undo would let the user\n // accidentally \"lose\" tracks they have visible in the deferred\n // list — bad UX.\n //\n // Every mutator still re-persists so the queue survives a refresh\n // and stays in lock-step with the live tracks list.\n // ──────────────────────────────────────────────────────────────────\n\n setPendingTracks: (tracks: PersistedTrack[]) => {\n set({ pendingTracks: tracks.map((pt) => ({ ...pt })) });\n schedulePersist(get());\n },\n\n addPendingTracks: (tracks: PersistedTrack[]) => {\n if (tracks.length === 0) return;\n set((state) => ({\n pendingTracks: [...state.pendingTracks, ...tracks.map((pt) => ({ ...pt }))],\n }));\n schedulePersist(get());\n },\n\n removePendingTrackAt: (index: number) => {\n set((state) => {\n if (index < 0 || index >= state.pendingTracks.length) return state;\n const next = state.pendingTracks.slice();\n next.splice(index, 1);\n return { pendingTracks: next };\n });\n schedulePersist(get());\n },\n\n clearPendingTracks: () => {\n if (get().pendingTracks.length === 0) return;\n set({ pendingTracks: [] });\n schedulePersist(get());\n },\n\n // ──────────────────────────────────────────────────────────────────\n // Per-stem timeline editing\n // ──────────────────────────────────────────────────────────────────\n\n setStemTimelineStart: (trackId: string, stemIndex: number, bar: number) => {\n // Note: we allow negative `timelineStartBar` so that imports from\n // continuous-playback formats (e.g. stem.fm mix-configs, which often\n // start a clip mid-source) can express \"source bar N appears at\n // timeline bar 0\" via `timelineStartBar = -N`. Drag-UI call sites\n // are expected to clamp themselves to >= 0 before invoking this\n // setter (see `DAWTimeline.tsx`).\n schedulePersist(get());\n set((state) => ({\n tracks: state.tracks.map((t) =>\n t.id === trackId\n ? {\n ...t,\n channels: t.channels.map((ch) =>\n ch.stemIndex === stemIndex\n ? { ...ch, timelineStartBar: Math.round(bar) }\n : ch\n ),\n }\n : t\n ),\n }));\n },\n\n setStemTrim: (trackId: string, stemIndex: number, trimStart: number, trimEnd: number) => {\n schedulePersist(get());\n set((state) => ({\n tracks: state.tracks.map((t) => {\n if (t.id !== trackId) return t;\n const maxBar = t.barMapping.length - 1;\n return {\n ...t,\n channels: t.channels.map((ch) =>\n ch.stemIndex === stemIndex\n ? {\n ...ch,\n trimStartBar: Math.max(0, Math.min(Math.round(trimStart), maxBar)),\n trimEndBar: Math.max(0, Math.min(Math.round(trimEnd), maxBar)),\n }\n : ch\n ),\n };\n }),\n }));\n },\n\n setTrackTimelineStart: (trackId: string, bar: number) => {\n // Same rationale as `setStemTimelineStart`: allow negative values for\n // imported configs. Drag-UI callers clamp themselves.\n set((state) => ({\n tracks: state.tracks.map((t) =>\n t.id === trackId\n ? {\n ...t,\n channels: t.channels.map((ch) => ({\n ...ch,\n timelineStartBar: Math.round(bar),\n })),\n }\n : t\n ),\n }));\n },\n\n setTrackTrim: (trackId: string, trimStart: number, trimEnd: number) => {\n set((state) => ({\n tracks: state.tracks.map((t) => {\n if (t.id !== trackId) return t;\n const maxBar = t.barMapping.length - 1;\n return {\n ...t,\n channels: t.channels.map((ch) => ({\n ...ch,\n trimStartBar: Math.max(0, Math.min(Math.round(trimStart), maxBar)),\n trimEndBar: Math.max(0, Math.min(Math.round(trimEnd), maxBar)),\n })),\n };\n }),\n }));\n },\n\n // ──────────────────────────────────────────────────────────────────\n // Transport\n // ──────────────────────────────────────────────────────────────────\n\n setMixName: (name: string) => set({ mixName: name.trim() || 'Untitled Mix' }),\n\n setToolMode: (mode: DAWToolMode) => set({ toolMode: mode }),\n\n setCompositeView: (on: boolean) => set({ compositeView: on }),\n toggleCompositeView: () => set((state) => ({ compositeView: !state.compositeView })),\n\n setSimilarTracksBalance: (v) => set({\n similarTracksBalance: Math.max(0, Math.min(1, v)),\n }),\n setSimilarTracksPopularity: (v) => set({\n similarTracksPopularity: Math.max(0, Math.min(2, v)),\n }),\n resetSimilarTracksTuning: () => set({\n similarTracksBalance: 0.5,\n similarTracksPopularity: 1,\n }),\n getSimilarTracksQueryArgs: () => {\n const s = get();\n // The two sliders snap to their defaults when the user drags\n // them through the centre, so an exact-equality check is safe.\n // When both are at default we send NO `ranking` arg at all so\n // the outgoing request shape matches the pre-tuning version\n // byte-for-byte (production GQL has introspection disabled and\n // may run an older schema rev than staging).\n const ranking: NonNullable<SimilarTracksQueryArgs['ranking']> = {};\n if (s.similarTracksBalance !== 0.5) {\n // balance 0 → genreWeight 1 (all musicality)\n // balance 1 → genreWeight 0 (all vibe)\n ranking.genreWeight = Math.max(0, Math.min(1, 1 - s.similarTracksBalance));\n }\n if (s.similarTracksPopularity !== 1) {\n ranking.collaborativeStrength = Math.max(0, Math.min(2, s.similarTracksPopularity));\n }\n if (Object.keys(ranking).length === 0) return {};\n return { ranking };\n },\n\n setSelectedStem: (stem: StemId | null) => set({ selectedStem: stem }),\n setSelections: (ranges: StemSelectionRange[]) => {\n // Coalesce: keep only ranges on the first range's track.\n if (ranges.length === 0) {\n set({ selections: [], selectionRange: null });\n return;\n }\n const trackId = ranges[0].trackId;\n const filtered = ranges.filter((r) => r.trackId === trackId && r.endBar > r.startBar);\n // De-dupe by stemIndex: a later range on the same stem replaces an earlier one.\n const byStem = new Map<number, StemSelectionRange>();\n for (const r of filtered) byStem.set(r.stemIndex, r);\n const next = Array.from(byStem.values()).sort((a, b) => a.stemIndex - b.stemIndex);\n set({ selections: next, selectionRange: next[0] ?? null });\n },\n addSelection: (range: StemSelectionRange) => {\n if (range.endBar <= range.startBar) return;\n const current = get().selections;\n // Different track? Replace the whole set.\n if (current.length > 0 && current[0].trackId !== range.trackId) {\n set({ selections: [range], selectionRange: range });\n return;\n }\n const byStem = new Map<number, StemSelectionRange>();\n for (const r of current) byStem.set(r.stemIndex, r);\n byStem.set(range.stemIndex, range);\n const next = Array.from(byStem.values()).sort((a, b) => a.stemIndex - b.stemIndex);\n set({ selections: next, selectionRange: next[0] ?? null });\n },\n clearSelections: () => set({ selections: [], selectionRange: null }),\n setSelectionRange: (range: StemSelectionRange | null) => {\n if (!range || range.endBar <= range.startBar) {\n set({ selections: [], selectionRange: null });\n return;\n }\n set({ selections: [range], selectionRange: range });\n },\n\n setClipboardEntries: (entries: ClipboardEntry[]) => {\n if (entries.length === 0) {\n set({ clipboardEntries: [], clipboard: null });\n return;\n }\n const trackId = entries[0].trackId;\n const filtered = entries.filter((e) => e.trackId === trackId && e.sourceEndBar > e.sourceStartBar);\n const byStem = new Map<number, ClipboardEntry>();\n for (const e of filtered) byStem.set(e.stemIndex, e);\n const next = Array.from(byStem.values()).sort((a, b) => a.stemIndex - b.stemIndex);\n set({ clipboardEntries: next, clipboard: next[0] ?? null });\n },\n setClipboard: (entry: ClipboardEntry | null) => {\n if (!entry) {\n set({ clipboardEntries: [], clipboard: null });\n return;\n }\n set({ clipboardEntries: [entry], clipboard: entry });\n },\n\n // ── Undo / Redo ──────────────────────────────────────────────────\n pushUndo: () => {\n const state = get();\n const snap = captureSnapshot(state);\n const stack = [...state._undoStack, snap];\n if (stack.length > MAX_UNDO) stack.shift();\n set({ _undoStack: stack, _redoStack: [] });\n },\n\n undo: () => {\n const state = get();\n if (state._undoStack.length === 0) return;\n const stack = [...state._undoStack];\n const snap = stack.pop()!;\n const redoSnap = captureSnapshot(state);\n set({\n ...snap,\n _undoStack: stack,\n _redoStack: [...state._redoStack, redoSnap],\n });\n schedulePersist(get());\n },\n\n redo: () => {\n const state = get();\n if (state._redoStack.length === 0) return;\n const stack = [...state._redoStack];\n const snap = stack.pop()!;\n const undoSnap = captureSnapshot(state);\n set({\n ...snap,\n _undoStack: [...state._undoStack, undoSnap],\n _redoStack: stack,\n });\n schedulePersist(get());\n },\n\n canUndo: () => get()._undoStack.length > 0,\n canRedo: () => get()._redoStack.length > 0,\n\n setPlaying: (playing: boolean) => set({ isPlaying: playing }),\n\n setPlayheadBar: (bar: number) => set({ playheadBar: Math.max(0, bar) }),\n\n setMasterTempo: (bpm: number) => {\n const state = get();\n const masterBarLength = bpmToBarDuration(bpm);\n set({\n masterTempo: bpm,\n masterBarLength48000: masterBarLength,\n tracks: recalculateSpeedRatios(state.tracks, masterBarLength),\n });\n },\n\n setGlobalPlaybackRate: (rate: number) => set({ globalPlaybackRate: rate }),\n\n setLoopRegion: (region) => set({ loopRegion: region }),\n\n setBarSubdivisions: (n: number) => set({ barSubdivisions: Math.max(1, Math.round(n)) }),\n\n // ──────────────────────────────────────────────────────────────────\n // Session notes (timeline markers)\n //\n // Notes live on the session itself rather than per-track because they\n // describe moments in the listener's experience of the mix, not in any\n // single source recording. They never feed the audio engine — they're\n // pure visual annotation.\n // ──────────────────────────────────────────────────────────────────\n\n addNote: (note) => {\n get().pushUndo();\n const id = uuid();\n const full: SessionNote = { ...note, id, createdAt: Date.now() };\n set({ notes: [...get().notes, full].sort((a, b) => a.startBar - b.startBar) });\n schedulePersist(get());\n return id;\n },\n\n updateNote: (id, patch) => {\n const existing = get().notes.find((n) => n.id === id);\n if (!existing) return;\n get().pushUndo();\n set({\n notes: get().notes\n .map((n) => (n.id === id ? { ...n, ...patch } : n))\n .sort((a, b) => a.startBar - b.startBar),\n });\n schedulePersist(get());\n },\n\n removeNote: (id) => {\n if (!get().notes.some((n) => n.id === id)) return;\n get().pushUndo();\n set({ notes: get().notes.filter((n) => n.id !== id) });\n schedulePersist(get());\n },\n\n // ──────────────────────────────────────────────────────────────────\n // Track controls\n // ──────────────────────────────────────────────────────────────────\n\n setTrackVolume: (trackId, volume) =>\n set((state) => ({\n tracks: state.tracks.map((t) =>\n t.id === trackId ? { ...t, volume: Math.max(0, Math.min(2, volume)) } : t\n ),\n })),\n\n setTrackMuted: (trackId, muted) =>\n set((state) => ({\n tracks: state.tracks.map((t) => (t.id === trackId ? { ...t, muted } : t)),\n })),\n\n setTrackSoloed: (trackId, soloed) =>\n set((state) => ({\n tracks: state.tracks.map((t) => (t.id === trackId ? { ...t, soloed } : t)),\n })),\n\n setTrackExpanded: (trackId, expanded) =>\n set((state) => ({\n tracks: state.tracks.map((t) => (t.id === trackId ? { ...t, expanded } : t)),\n })),\n\n setTrackTranspose: (trackId, semitones) => {\n set((state) => ({\n tracks: state.tracks.map((t) =>\n t.id === trackId ? { ...t, transposeSemitones: Math.max(-12, Math.min(12, semitones)) } : t\n ),\n }));\n schedulePersist(get());\n },\n\n setTrackPitchSettings: (trackId, settings) => {\n set((state) => ({\n tracks: state.tracks.map((t) =>\n t.id === trackId ? { ...t, pitchSettings: { ...settings } } : t\n ),\n }));\n schedulePersist(get());\n },\n\n setPerBarPitchCompensation: (trackId, enabled) => {\n set((state) => ({\n tracks: state.tracks.map((t) =>\n t.id === trackId ? { ...t, perBarPitchCompensation: enabled } : t\n ),\n }));\n schedulePersist(get());\n },\n\n // ──────────────────────────────────────────────────────────────────\n // Beat grid alignment\n // ──────────────────────────────────────────────────────────────────\n\n setTrackBeatGridOffset: (trackId, offsetBeats) => {\n get().pushUndo();\n set((state) => ({\n tracks: state.tracks.map((t) => {\n if (t.id !== trackId) return t;\n\n const beats = t.trackData.beats;\n if (!beats || beats.length === 0) return t;\n\n const newBarMapping = composeBarsWithOffset(beats, offsetBeats);\n\n // Reject the offset if it would produce an empty or single-bar mapping\n if (newBarMapping.length < 2) return t;\n\n const newNativeBarLength = medianBarDuration(newBarMapping) || t.nativeBarLength;\n const trimEnd = Math.max(0, newBarMapping.length - 1);\n\n return {\n ...t,\n beatGridOffsetBeats: offsetBeats,\n barMapping: newBarMapping,\n nativeBarLength: newNativeBarLength,\n channels: t.channels.map((ch) => ({\n ...ch,\n trimEndBar: Math.min(ch.trimEndBar, trimEnd),\n trimStartBar: Math.min(ch.trimStartBar, trimEnd),\n })),\n };\n }),\n }));\n\n // Recalculate speed ratios since nativeBarLength may have changed\n const state = get();\n if (state.masterBarLength48000 > 0) {\n set({ tracks: recalculateSpeedRatios(state.tracks, state.masterBarLength48000) });\n }\n schedulePersist(get());\n },\n\n replaceTrackBeats: (trackId, newBeats) => {\n if (!newBeats || newBeats.length < 2) return;\n get().pushUndo();\n\n const newBarMapping = composeBarsFromBeats(newBeats);\n if (newBarMapping.length < 2) return;\n\n const newNativeBarLength = medianBarDuration(newBarMapping);\n if (!newNativeBarLength) return;\n const newNativeBpm = barDurationToBpm(newNativeBarLength);\n\n set((state) => {\n const isLeadTrack = state.tracks.length > 0 && state.tracks[0].id === trackId;\n const masterBarLength = isLeadTrack ? newNativeBarLength : state.masterBarLength48000;\n const masterTempo = isLeadTrack ? (newNativeBpm || state.masterTempo) : state.masterTempo;\n\n const updatedTracks = state.tracks.map((t) => {\n if (t.id !== trackId) return t;\n const trimEnd = Math.max(0, newBarMapping.length - 1);\n return {\n ...t,\n beatGridOffsetBeats: 0,\n barMapping: newBarMapping,\n nativeBarLength: newNativeBarLength,\n nativeBpm: newNativeBpm || t.nativeBpm,\n trackData: { ...t.trackData, beats: newBeats },\n channels: t.channels.map((ch) => ({\n ...ch,\n trimEndBar: Math.min(ch.trimEndBar, trimEnd),\n trimStartBar: Math.min(ch.trimStartBar, trimEnd),\n })),\n };\n });\n\n return {\n masterBarLength48000: masterBarLength,\n masterTempo: masterTempo,\n tracks: recalculateSpeedRatios(updatedTracks, masterBarLength),\n };\n });\n\n schedulePersist(get());\n },\n\n // ──────────────────────────────────────────────────────────────────\n // Channel (stem) controls\n // ──────────────────────────────────────────────────────────────────\n\n setChannelVolume: (trackId, stemIndex, volume) =>\n set((state) => ({\n tracks: state.tracks.map((t) =>\n t.id === trackId\n ? {\n ...t,\n channels: t.channels.map((ch) =>\n ch.stemIndex === stemIndex\n ? { ...ch, volume: Math.max(0, Math.min(2, volume)) }\n : ch\n ),\n }\n : t\n ),\n })),\n\n setChannelMuted: (trackId, stemIndex, muted) =>\n set((state) => ({\n tracks: state.tracks.map((t) =>\n t.id === trackId\n ? {\n ...t,\n channels: t.channels.map((ch) =>\n ch.stemIndex === stemIndex ? { ...ch, muted } : ch\n ),\n }\n : t\n ),\n })),\n\n setChannelSoloed: (trackId, stemIndex, soloed) =>\n set((state) => ({\n tracks: state.tracks.map((t) =>\n t.id === trackId\n ? {\n ...t,\n channels: t.channels.map((ch) =>\n ch.stemIndex === stemIndex ? { ...ch, soloed } : ch\n ),\n }\n : t\n ),\n })),\n\n setChannelVisible: (trackId, stemIndex, visible) =>\n set((state) => ({\n tracks: state.tracks.map((t) =>\n t.id === trackId\n ? {\n ...t,\n channels: t.channels.map((ch) =>\n ch.stemIndex === stemIndex ? { ...ch, visible } : ch\n ),\n }\n : t\n ),\n })),\n\n setChannelEffects: (trackId, stemIndex, effects) =>\n set((state) => ({\n tracks: state.tracks.map((t) =>\n t.id === trackId\n ? {\n ...t,\n channels: t.channels.map((ch) =>\n ch.stemIndex === stemIndex ? { ...ch, effects } : ch\n ),\n }\n : t\n ),\n })),\n\n // ──────────────────────────────────────────────────────────────────\n // Mute regions\n // ──────────────────────────────────────────────────────────────────\n\n addMuteRegion: (trackId, stemIndex, region) => {\n get().pushUndo();\n set((state) => ({\n tracks: state.tracks.map((t) =>\n t.id === trackId\n ? {\n ...t,\n channels: t.channels.map((ch) => {\n if (ch.stemIndex !== stemIndex) return ch;\n const merged = mergeMuteRegions([...ch.muteRegions, region]);\n return { ...ch, muteRegions: merged };\n }),\n }\n : t\n ),\n }));\n schedulePersist(get());\n },\n\n removeMuteRegion: (trackId, stemIndex, regionIndex) => {\n get().pushUndo();\n set((state) => ({\n tracks: state.tracks.map((t) =>\n t.id === trackId\n ? {\n ...t,\n channels: t.channels.map((ch) =>\n ch.stemIndex === stemIndex\n ? { ...ch, muteRegions: ch.muteRegions.filter((_, i) => i !== regionIndex) }\n : ch\n ),\n }\n : t\n ),\n }));\n schedulePersist(get());\n },\n\n clearMuteRegions: (trackId, stemIndex) => {\n get().pushUndo();\n set((state) => ({\n tracks: state.tracks.map((t) =>\n t.id === trackId\n ? {\n ...t,\n channels: t.channels.map((ch) =>\n ch.stemIndex === stemIndex ? { ...ch, muteRegions: [] } : ch\n ),\n }\n : t\n ),\n }));\n schedulePersist(get());\n },\n\n setMuteRegionsBatch: (trackId, stemIndex, regions) => {\n set((state) => ({\n tracks: state.tracks.map((t) =>\n t.id === trackId\n ? {\n ...t,\n channels: t.channels.map((ch) =>\n ch.stemIndex === stemIndex\n ? { ...ch, muteRegions: mergeMuteRegions(regions) }\n : ch\n ),\n }\n : t\n ),\n }));\n },\n\n splitStemAtBar: (trackId, stemIndex, bar) => {\n get().pushUndo();\n const state = get();\n const track = state.tracks.find((t) => t.id === trackId);\n if (!track) return;\n const ch = track.channels.find((c) => c.stemIndex === stemIndex);\n if (!ch) return;\n const localBar = Math.round(bar);\n if (localBar <= ch.trimStartBar || localBar >= ch.trimEndBar) return;\n const region: MuteRegion = { startBar: localBar, endBar: localBar + 1 };\n const merged = mergeMuteRegions([...ch.muteRegions, region]);\n set({\n tracks: state.tracks.map((t) =>\n t.id === trackId\n ? {\n ...t,\n channels: t.channels.map((c) =>\n c.stemIndex === stemIndex ? { ...c, muteRegions: merged } : c\n ),\n }\n : t\n ),\n });\n schedulePersist(get());\n },\n\n // ──────────────────────────────────────────────────────────────────\n // Split points (logical clip boundaries — pure visual, no audio side\n // effect). The audio engine ignores these entirely; they only feed\n // into computeClips() so the UI knows where to break a stem into\n // independently-movable clips.\n // ──────────────────────────────────────────────────────────────────\n\n addSplitPoint: (trackId, stemIndex, localBar) => {\n const state = get();\n const track = state.tracks.find((t) => t.id === trackId);\n if (!track) return;\n const ch = track.channels.find((c) => c.stemIndex === stemIndex);\n if (!ch) return;\n if (localBar <= ch.trimStartBar || localBar >= ch.trimEndBar) return;\n const existing = ch.splitPoints ?? [];\n // Dedupe within a small tolerance (≈ 1/64 bar)\n if (existing.some((p) => Math.abs(p - localBar) < 0.015625)) return;\n get().pushUndo();\n const merged = [...existing, localBar].sort((a, b) => a - b);\n set({\n tracks: get().tracks.map((t) =>\n t.id === trackId\n ? {\n ...t,\n channels: t.channels.map((c) =>\n c.stemIndex === stemIndex ? { ...c, splitPoints: merged } : c\n ),\n }\n : t\n ),\n });\n schedulePersist(get());\n },\n\n setSplitPointsBatch: (trackId, stemIndex, points, pushUndo = true) => {\n const state = get();\n const track = state.tracks.find((t) => t.id === trackId);\n if (!track) return;\n const ch = track.channels.find((c) => c.stemIndex === stemIndex);\n if (!ch) return;\n if (pushUndo) get().pushUndo();\n const cleaned = Array.from(new Set(points.filter(\n (p) => p > ch.trimStartBar && p < ch.trimEndBar\n ))).sort((a, b) => a - b);\n set({\n tracks: get().tracks.map((t) =>\n t.id === trackId\n ? {\n ...t,\n channels: t.channels.map((c) =>\n c.stemIndex === stemIndex ? { ...c, splitPoints: cleaned } : c\n ),\n }\n : t\n ),\n });\n schedulePersist(get());\n },\n\n clearSplitPoints: (trackId, stemIndex) => {\n const state = get();\n const track = state.tracks.find((t) => t.id === trackId);\n if (!track) return;\n const ch = track.channels.find((c) => c.stemIndex === stemIndex);\n if (!ch || !ch.splitPoints || ch.splitPoints.length === 0) return;\n get().pushUndo();\n set({\n tracks: get().tracks.map((t) =>\n t.id === trackId\n ? {\n ...t,\n channels: t.channels.map((c) =>\n c.stemIndex === stemIndex ? { ...c, splitPoints: [] } : c\n ),\n }\n : t\n ),\n });\n schedulePersist(get());\n },\n\n // ──────────────────────────────────────────────────────────────────\n // Resampled regions\n // ──────────────────────────────────────────────────────────────────\n\n addResampledRegion: (trackId, stemIndex, region) => {\n set((state) => ({\n tracks: state.tracks.map((t) =>\n t.id === trackId\n ? {\n ...t,\n channels: t.channels.map((ch) =>\n ch.stemIndex === stemIndex\n ? { ...ch, resampledRegions: [...(ch.resampledRegions ?? []), region] }\n : ch\n ),\n }\n : t\n ),\n }));\n schedulePersist(get());\n },\n\n // ──────────────────────────────────────────────────────────────────\n // Derived\n // ──────────────────────────────────────────────────────────────────\n\n getTimelineLength: () => {\n const state = get();\n if (state.tracks.length === 0) return 0;\n let maxEnd = 0;\n for (const t of state.tracks) {\n for (const ch of t.channels) {\n if (!ch.visible) continue;\n const end = ch.timelineStartBar + (ch.trimEndBar - ch.trimStartBar + 1);\n if (end > maxEnd) maxEnd = end;\n }\n }\n return maxEnd;\n },\n\n getTrackById: (trackId: string) => {\n return get().tracks.find((t) => t.id === trackId);\n },\n\n getChannel: (trackId: string, stemIndex: number) => {\n const track = get().tracks.find((t) => t.id === trackId);\n return track?.channels.find((ch) => ch.stemIndex === stemIndex);\n },\n}));\n"]}
|