@360labs/live-transcribe 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/CHANGELOG.md +41 -0
- package/LICENSE +21 -0
- package/README.md +170 -0
- package/dist/index.d.mts +2689 -0
- package/dist/index.d.ts +2689 -0
- package/dist/index.js +4777 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +4682 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +86 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/EventEmitter.ts","../src/types/config.ts","../src/types/session.ts","../src/types/events.ts","../src/core/BaseTranscriber.ts","../src/utils/exporters/JSONExporter.ts","../src/utils/exporters/TextExporter.ts","../src/utils/exporters/SRTExporter.ts","../src/utils/exporters/VTTExporter.ts","../src/utils/exporters/CSVExporter.ts","../src/core/TranscriptionSession.ts","../src/core/SessionManager.ts","../src/providers/WebSpeechProvider.ts","../src/providers/DeepgramProvider.ts","../src/providers/AssemblyAIProvider.ts","../src/utils/AudioProcessor.ts","../src/utils/VoiceActivityDetector.ts","../src/utils/AudioLevelMonitor.ts","../src/utils/AudioBufferManager.ts","../src/utils/AudioRecorder.ts","../src/utils/StorageAdapter.ts","../src/utils/validators.ts","../src/utils/browserCheck.ts","../src/utils/timing.ts","../src/utils/formatters.ts","../src/utils/languageUtils.ts","../src/utils/helpers.ts","../src/utils/audioUtils.ts","../src/index.ts"],"names":["TranscriptionProvider","AudioEncoding","SessionState","ErrorCode","RECONNECT_DELAY","timeout"],"mappings":";;;AAIO,IAAM,eAAN,MAAwH;AAAA,EAAxH,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,MAAA,uBAAgD,GAAA,EAAI;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAO5D,EAAA,CAA4B,OAAU,QAAA,EAA4B;AAChE,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,EAAG;AAC3B,MAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAA,kBAAO,IAAI,KAAK,CAAA;AAAA,IAClC;AACA,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,CAAG,IAAI,QAAQ,CAAA;AACpC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,GAAA,CAA6B,OAAU,QAAA,EAA4B;AACjE,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AACvC,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,SAAA,CAAU,OAAO,QAAQ,CAAA;AACzB,MAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,QAAA,IAAA,CAAK,MAAA,CAAO,OAAO,KAAK,CAAA;AAAA,MAC1B;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAA,CAA8B,OAAU,QAAA,EAA4B;AAClE,IAAA,MAAM,WAAA,IAAe,IAAI,IAAA,KAAiC;AACxD,MAAA,IAAA,CAAK,GAAA,CAAI,OAAO,WAAyB,CAAA;AACzC,MAAC,QAAA,CAAsB,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAAA,IACzC,CAAA,CAAA;AACA,IAAA,OAAO,IAAA,CAAK,EAAA,CAAG,KAAA,EAAO,WAAW,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOU,IAAA,CAA8B,UAAa,IAAA,EAAuC;AAC1F,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AACvC,IAAA,IAAI,CAAC,SAAA,IAAa,SAAA,CAAU,IAAA,KAAS,CAAA,EAAG;AACtC,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,SAAA,CAAU,QAAQ,CAAA,QAAA,KAAY;AAC5B,MAAA,IAAI;AACF,QAAA,QAAA,CAAS,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,MAC3B,SAAS,KAAA,EAAO;AAEd,QAAA,OAAA,CAAQ,MAAM,CAAA,6BAAA,EAAgC,MAAA,CAAO,KAAK,CAAC,MAAM,KAAK,CAAA;AAAA,MACxE;AAAA,IACF,CAAC,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,mBAA4C,KAAA,EAAiB;AAC3D,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,IAAA,CAAK,MAAA,CAAO,OAAO,KAAK,CAAA;AAAA,IAC1B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAAA,IACpB;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAuC,KAAA,EAAkB;AACvD,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA;AACvC,IAAA,OAAO,SAAA,GAAY,UAAU,IAAA,GAAO,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAA,GAAgC;AAC9B,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AAAA,EACtC;AACF;;;AC/FO,IAAK,qBAAA,qBAAAA,sBAAAA,KAAL;AAEL,EAAAA,uBAAA,cAAA,CAAA,GAAe,YAAA;AAEf,EAAAA,uBAAA,UAAA,CAAA,GAAW,UAAA;AAEX,EAAAA,uBAAA,YAAA,CAAA,GAAa,YAAA;AAEb,EAAAA,uBAAA,QAAA,CAAA,GAAS,QAAA;AARC,EAAA,OAAAA,sBAAAA;AAAA,CAAA,EAAA,qBAAA,IAAA,EAAA;AAcL,IAAK,aAAA,qBAAAC,cAAAA,KAAL;AAEL,EAAAA,eAAA,UAAA,CAAA,GAAW,UAAA;AAEX,EAAAA,eAAA,OAAA,CAAA,GAAQ,OAAA;AAER,EAAAA,eAAA,MAAA,CAAA,GAAO,MAAA;AAEP,EAAAA,eAAA,MAAA,CAAA,GAAO,MAAA;AARG,EAAA,OAAAA,cAAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA;AAkDL,IAAM,oBAAA,GAA8C;AAAA,EACzD,UAAA,EAAY,IAAA;AAAA,EACZ,QAAA,EAAU,CAAA;AAAA,EACV,QAAA,EAAU,EAAA;AAAA,EACV,QAAA,EAAU,UAAA;AACZ;AAKO,IAAM,4BAAA,GAA6D;AAAA,EACxE,QAAA,EAAU,OAAA;AAAA,EACV,cAAA,EAAgB,IAAA;AAAA,EAChB,eAAA,EAAiB,KAAA;AAAA,EACjB,WAAA,EAAa;AACf;;;AC7EO,IAAK,YAAA,qBAAAC,aAAAA,KAAL;AAEL,EAAAA,cAAA,MAAA,CAAA,GAAO,MAAA;AAEP,EAAAA,cAAA,cAAA,CAAA,GAAe,cAAA;AAEf,EAAAA,cAAA,QAAA,CAAA,GAAS,QAAA;AAET,EAAAA,cAAA,QAAA,CAAA,GAAS,QAAA;AAET,EAAAA,cAAA,UAAA,CAAA,GAAW,UAAA;AAEX,EAAAA,cAAA,SAAA,CAAA,GAAU,SAAA;AAEV,EAAAA,cAAA,OAAA,CAAA,GAAQ,OAAA;AAdE,EAAA,OAAAA,aAAAA;AAAA,CAAA,EAAA,YAAA,IAAA,EAAA;AAsDL,IAAM,sBAAA,GAAkD;AAAA,EAC7D,WAAA,EAAa,KAAA;AAAA,EACb,WAAA,EAAa,CAAA;AAAA;AAAA,EACb,cAAA,EAAgB,CAAA;AAAA;AAAA,EAChB,SAAA,EAAW,KAAA;AAAA,EACX,YAAA,EAAc;AAChB;;;AC1DO,IAAK,SAAA,qBAAAC,UAAAA,KAAL;AAEL,EAAAA,WAAA,uBAAA,CAAA,GAAwB,uBAAA;AAExB,EAAAA,WAAA,mBAAA,CAAA,GAAoB,mBAAA;AAEpB,EAAAA,WAAA,uBAAA,CAAA,GAAwB,uBAAA;AAExB,EAAAA,WAAA,0BAAA,CAAA,GAA2B,0BAAA;AAE3B,EAAAA,WAAA,qBAAA,CAAA,GAAsB,qBAAA;AAEtB,EAAAA,WAAA,eAAA,CAAA,GAAgB,eAAA;AAEhB,EAAAA,WAAA,gBAAA,CAAA,GAAiB,gBAAA;AAEjB,EAAAA,WAAA,gBAAA,CAAA,GAAiB,gBAAA;AAEjB,EAAAA,WAAA,iBAAA,CAAA,GAAkB,iBAAA;AAElB,EAAAA,WAAA,eAAA,CAAA,GAAgB,eAAA;AApBN,EAAA,OAAAA,UAAAA;AAAA,CAAA,EAAA,SAAA,IAAA,EAAA;AA0BL,IAAM,kBAAA,GAAN,MAAM,mBAAA,SAA2B,KAAA,CAAM;AAAA,EAQ5C,WAAA,CACE,OAAA,EACA,IAAA,EACA,QAAA,EACA,OAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,oBAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AAGf,IAAA,IAAI,MAAM,iBAAA,EAAmB;AAC3B,MAAA,KAAA,CAAM,iBAAA,CAAkB,MAAM,mBAAkB,CAAA;AAAA,IAClD;AAAA,EACF;AACF;;;ACpCO,IAAe,eAAA,GAAf,cACG,YAAA,CAEV;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBE,YAAY,MAAA,EAA6B;AACvC,IAAA,KAAA,EAAM;AAnBR;AAAA,IAAA,IAAA,CAAU,KAAA,GAAA,MAAA;AAMV;AAAA,IAAA,IAAA,CAAU,iBAAgC,EAAC;AAM3C;AAAA,IAAA,IAAA,CAAU,SAAA,GAAoB,CAAA;AAQ5B,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAG,4BAAA,EAA8B,GAAG,MAAA,EAAO;AAC3D,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAK,kBAAA,EAAmB;AAC/C,IAAA,IAAA,CAAK,cAAA,EAAe;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA;AAAA,EA0DA,QAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAA+B;AAC7B,IAAA,OAAO;AAAA,MACL,GAAG,IAAA,CAAK,eAAA;AAAA,MACR,QAAA,EAAU,KAAK,iBAAA,EAAkB;AAAA,MACjC,WAAW,IAAA,CAAK;AAAA,KAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAA,GAAmC;AACjC,IAAA,IAAI,IAAA,CAAK,cAAA,CAAe,MAAA,KAAW,CAAA,EAAG;AACpC,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,MAAA,CAAO,CAAC,KAAK,KAAA,KAAU,GAAA,GAAM,KAAA,CAAM,UAAA,EAAY,CAAC,CAAA;AACxF,IAAA,MAAM,QAAA,GAAW,IAAI,WAAA,CAAY,WAAW,CAAA;AAC5C,IAAA,MAAM,IAAA,GAAO,IAAI,UAAA,CAAW,QAAQ,CAAA;AACpC,IAAA,IAAI,MAAA,GAAS,CAAA;AAEb,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,cAAA,EAAgB;AACvC,MAAA,IAAA,CAAK,GAAA,CAAI,IAAI,UAAA,CAAW,KAAK,GAAG,MAAM,CAAA;AACtC,MAAA,MAAA,IAAU,KAAA,CAAM,UAAA;AAAA,IAClB;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQU,SAAS,QAAA,EAA8B;AAC/C,IAAA,MAAM,gBAAgB,IAAA,CAAK,KAAA;AAC3B,IAAA,IAAA,CAAK,KAAA,GAAQ,QAAA;AAEb,IAAA,IAAI,QAAA,KAAA,QAAA,iBAAwC,CAAC,IAAA,CAAK,SAAA,EAAW;AAC3D,MAAA,IAAA,CAAK,SAAA,GAAY,KAAK,GAAA,EAAI;AAC1B,MAAA,IAAA,CAAK,eAAA,CAAgB,YAAY,IAAA,CAAK,SAAA;AAAA,IACxC;AAEA,IAAA,IAAI,wCAAyC,QAAA,KAAA,OAAA,cAAqC;AAChF,MAAA,IAAA,CAAK,eAAA,CAAgB,OAAA,GAAU,IAAA,CAAK,GAAA,EAAI;AACxC,MAAA,IAAA,CAAK,eAAA,CAAgB,QAAA,GAAW,IAAA,CAAK,iBAAA,EAAkB;AAAA,IACzD;AAEA,IAAA,IAAI,kBAAkB,QAAA,EAAU;AAC9B,MAAA,IAAA,CAAK,IAAA,CAAK,eAAe,QAAQ,CAAA;AAAA,IACnC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,iBAAiB,MAAA,EAAmC;AAE5D,IAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,IAAA,EAAM;AACjC,MAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,IAAA,EAAK,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AACtE,MAAA,IAAA,CAAK,aAAa,KAAA,CAAM,MAAA;AAAA,IAC1B;AAGA,IAAA,IAAA,CAAK,IAAA,CAAK,cAAc,MAAM,CAAA;AAE9B,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,IAAA,CAAK,IAAA,CAAK,SAAS,MAAM,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,IAAA,CAAK,WAAW,MAAM,CAAA;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,YAAY,KAAA,EAAyC;AAC7D,IAAA,IAAI,kBAAA;AAEJ,IAAA,IAAI,iBAAiB,kBAAA,EAAoB;AACvC,MAAA,kBAAA,GAAqB,KAAA;AAAA,IACvB,CAAA,MAAO;AACL,MAAA,kBAAA,GAAqB,IAAI,kBAAA;AAAA,QACvB,KAAA,CAAM,OAAA;AAAA,QAAA,eAAA;AAAA,QAEN,KAAK,MAAA,CAAO,QAAA;AAAA,QACZ;AAAA,OACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAA,CAAA,OAAA,aAA+B;AACpC,IAAA,IAAA,CAAK,IAAA,CAAK,SAAS,kBAAkB,CAAA;AAAA,EACvC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,cAAA,GAAuB;AAC/B,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,QAAA,EAAU;AACzB,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,6CAAA;AAAA,QAAA,gBAAA;AAAA,OAEF;AAAA,IACF;AAGA,IAAA,MAAM,cAAA,GAA0C,CAAC,UAAA,EAAY,YAAY,CAAA;AACzE,IAAA,IAAI,cAAA,CAAe,SAAS,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,IAAK,CAAC,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ;AACxE,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,CAAA,wBAAA,EAA2B,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA,SAAA,CAAA;AAAA,QAAA,gBAAA;AAAA,QAE/C,KAAK,MAAA,CAAO;AAAA,OACd;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,gBAAgB,IAAA,EAAyB;AACjD,IAAA,IAAA,CAAK,cAAA,CAAe,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,iBAAA,GAA4B;AACpC,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,eAAA,CAAgB,OAAA,IAAW,KAAK,GAAA,EAAI;AACzD,IAAA,OAAO,UAAU,IAAA,CAAK,SAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKU,cAAA,GAAuB;AAC/B,IAAA,IAAA,CAAK,iBAAiB,EAAC;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKU,YAAA,GAAqB;AAC7B,IAAA,IAAA,CAAK,KAAA,GAAA,MAAA;AACL,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA;AACjB,IAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AACjB,IAAA,IAAA,CAAK,iBAAiB,EAAC;AACvB,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAK,kBAAA,EAAmB;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,iBAAA,GAA4B;AAElC,IAAA,OAAO,sCAAA,CAAuC,OAAA,CAAQ,OAAA,EAAS,CAAA,CAAA,KAAK;AAClE,MAAA,MAAM,CAAA,GAAK,IAAA,CAAK,MAAA,EAAO,GAAI,EAAA,GAAM,CAAA;AACjC,MAAA,MAAM,CAAA,GAAI,CAAA,KAAM,GAAA,GAAM,CAAA,GAAK,IAAI,CAAA,GAAO,CAAA;AACtC,MAAA,OAAO,CAAA,CAAE,SAAS,EAAE,CAAA;AAAA,IACtB,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAA,GAAsC;AAC5C,IAAA,OAAO;AAAA,MACL,EAAA,EAAI,KAAK,iBAAA,EAAkB;AAAA,MAC3B,SAAA,EAAW,CAAA;AAAA,MACX,SAAA,EAAW,CAAA;AAAA,MACX,QAAA,EAAU,KAAK,MAAA,CAAO;AAAA,KACxB;AAAA,EACF;AACF;;;ACjSO,IAAM,eAAN,MAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMxB,OAAO,OAAO,OAAA,EAA8B;AAC1C,IAAA,MAAM,UAAA,GAAgC;AAAA,MACpC,OAAA,EAAS,OAAA;AAAA,MACT,OAAA,EAAS;AAAA,QACP,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,QAAQ;AAAC,OACX;AAAA,MACA,UAAA,EAAY,KAAK,GAAA;AAAI,KACvB;AACA,IAAA,OAAO,IAAA,CAAK,UAAU,UAAU,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,YAAA,CAAa,OAAA,EAAsB,MAAA,GAAiB,CAAA,EAAW;AACpE,IAAA,MAAM,UAAA,GAAgC;AAAA,MACpC,OAAA,EAAS,OAAA;AAAA,MACT,OAAA,EAAS;AAAA,QACP,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,QAAQ;AAAC,OACX;AAAA,MACA,UAAA,EAAY,KAAK,GAAA;AAAI,KACvB;AACA,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,UAAA,EAAY,IAAA,EAAM,MAAM,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,MAAM,IAAA,EAAiC;AAC5C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAE5B,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,IAAW,CAAC,KAAK,OAAA,EAAS;AAClC,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AACF;;;ACrDO,IAAM,eAAN,MAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOxB,OAAO,MAAA,CAAO,OAAA,EAAsB,OAAA,GAA6B,EAAC,EAAW;AAC3E,IAAA,MAAM;AAAA,MACJ,iBAAA,GAAoB,KAAA;AAAA,MACpB,eAAA,GAAkB,KAAA;AAAA,MAClB,iBAAA,GAAoB,KAAA;AAAA,MACpB,eAAA,GAAkB;AAAA,KACpB,GAAI,OAAA;AAEJ,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,MAAM,mBAAmB,OAAA,CAAQ,WAAA,CAAY,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA;AAElE,IAAA,KAAA,MAAW,cAAc,gBAAA,EAAkB;AACzC,MAAA,IAAI,IAAA,GAAO,EAAA;AAEX,MAAA,IAAI,iBAAA,IAAqB,WAAW,SAAA,EAAW;AAC7C,QAAA,MAAM,IAAA,GAAO,IAAI,IAAA,CAAK,UAAA,CAAW,SAAS,EAAE,WAAA,EAAY,CAAE,MAAA,CAAO,EAAA,EAAI,CAAC,CAAA;AACtE,QAAA,IAAA,IAAQ,IAAI,IAAI,CAAA,EAAA,CAAA;AAAA,MAClB;AAEA,MAAA,IAAI,eAAA,IAAmB,WAAW,OAAA,EAAS;AACzC,QAAA,IAAA,IAAQ,CAAA,EAAG,WAAW,OAAO,CAAA,EAAA,CAAA;AAAA,MAC/B;AAEA,MAAA,IAAA,IAAQ,UAAA,CAAW,IAAA;AAEnB,MAAA,IAAI,iBAAA,IAAqB,UAAA,CAAW,UAAA,KAAe,MAAA,EAAW;AAC5D,QAAA,IAAA,IAAQ,KAAK,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,UAAA,GAAa,GAAG,CAAC,CAAA,EAAA,CAAA;AAAA,MACtD;AAEA,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACjB;AAEA,IAAA,MAAM,SAAA,GAAY,kBAAkB,MAAA,GAAS,GAAA;AAC7C,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,CAAE,IAAA,EAAK;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,YAAY,OAAA,EAA8B;AAC/C,IAAA,OAAO,OAAA,CAAQ,WAAA,CACZ,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA,CACrB,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAI,CAAA,CACf,IAAA,CAAK,GAAG,EACR,IAAA,EAAK;AAAA,EACV;AACF;;;ACvDO,IAAM,cAAN,MAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMvB,OAAO,OAAO,OAAA,EAA8B;AAC1C,IAAA,MAAM,mBAAmB,OAAA,CAAQ,WAAA,CAAY,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA;AAClE,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,IAAI,cAAA,GAAiB,CAAA;AAGrB,IAAA,IAAI,WAAA,GAAc,CAAA;AAElB,IAAA,KAAA,MAAW,cAAc,gBAAA,EAAkB;AACzC,MAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,IAAA,EAAK,EAAG;AAE7B,MAAA,IAAI,SAAA,GAAY,WAAA;AAChB,MAAA,IAAI,OAAA;AAGJ,MAAA,IAAI,UAAA,CAAW,KAAA,IAAS,UAAA,CAAW,KAAA,CAAM,SAAS,CAAA,EAAG;AACnD,QAAA,SAAA,GAAY,UAAA,CAAW,KAAA,CAAM,CAAC,CAAA,CAAE,KAAA;AAChC,QAAA,OAAA,GAAU,WAAW,KAAA,CAAM,UAAA,CAAW,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAE,GAAA;AAAA,MAC1D,CAAA,MAAO;AAEL,QAAA,MAAM,SAAA,GAAY,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA;AAC/C,QAAA,MAAM,UAAA,GAAc,SAAA,GAAY,GAAA,GAAO,EAAA,GAAK,GAAA;AAC5C,QAAA,OAAA,GAAU,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,GAAI,CAAA;AAAA,MACjD;AAEA,MAAA,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,cAAc,CAAC,CAAA;AACjC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,UAAA,CAAW,SAAS,CAAC,CAAA,KAAA,EAAQ,IAAA,CAAK,UAAA,CAAW,OAAO,CAAC,CAAA,CAAE,CAAA;AAC1E,MAAA,KAAA,CAAM,IAAA,CAAK,WAAW,IAAI,CAAA;AAC1B,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,MAAA,cAAA,EAAA;AACA,MAAA,WAAA,GAAc,OAAA,GAAU,GAAA;AAAA,IAC1B;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAe,WAAW,EAAA,EAAoB;AAC5C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,GAAI,CAAA;AACzC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,IAAI,CAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAO,YAAA,GAAe,OAAQ,EAAE,CAAA;AACrD,IAAA,MAAM,UAAU,YAAA,GAAe,EAAA;AAC/B,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,GAAI,CAAA;AAEzC,IAAA,OAAO,CAAA,EAAG,KAAK,GAAA,CAAI,KAAA,EAAO,CAAC,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,CAAC,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,CAAC,CAAC,IAAI,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,CAAC,CAAC,CAAA,CAAA;AAAA,EAC3G;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAe,GAAA,CAAI,GAAA,EAAa,MAAA,EAAwB;AACtD,IAAA,OAAO,MAAA,CAAO,GAAG,CAAA,CAAE,QAAA,CAAS,QAAQ,GAAG,CAAA;AAAA,EACzC;AACF;;;ACnEO,IAAM,cAAN,MAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMvB,OAAO,OAAO,OAAA,EAA8B;AAC1C,IAAA,MAAM,mBAAmB,OAAA,CAAQ,WAAA,CAAY,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA;AAClE,IAAA,MAAM,KAAA,GAAkB,CAAC,QAAA,EAAU,EAAE,CAAA;AAGrC,IAAA,IAAI,WAAA,GAAc,CAAA;AAElB,IAAA,KAAA,MAAW,cAAc,gBAAA,EAAkB;AACzC,MAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,IAAA,EAAK,EAAG;AAE7B,MAAA,IAAI,SAAA,GAAY,WAAA;AAChB,MAAA,IAAI,OAAA;AAGJ,MAAA,IAAI,UAAA,CAAW,KAAA,IAAS,UAAA,CAAW,KAAA,CAAM,SAAS,CAAA,EAAG;AACnD,QAAA,SAAA,GAAY,UAAA,CAAW,KAAA,CAAM,CAAC,CAAA,CAAE,KAAA;AAChC,QAAA,OAAA,GAAU,WAAW,KAAA,CAAM,UAAA,CAAW,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAE,GAAA;AAAA,MAC1D,CAAA,MAAO;AAEL,QAAA,MAAM,SAAA,GAAY,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA;AAC/C,QAAA,MAAM,UAAA,GAAc,SAAA,GAAY,GAAA,GAAO,EAAA,GAAK,GAAA;AAC5C,QAAA,OAAA,GAAU,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,GAAI,CAAA;AAAA,MACjD;AAEA,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,UAAA,CAAW,SAAS,CAAC,CAAA,KAAA,EAAQ,IAAA,CAAK,UAAA,CAAW,OAAO,CAAC,CAAA,CAAE,CAAA;AAG1E,MAAA,IAAI,WAAW,OAAA,EAAS;AACtB,QAAA,KAAA,CAAM,KAAK,CAAA,GAAA,EAAM,UAAA,CAAW,OAAO,CAAA,CAAA,EAAI,UAAA,CAAW,IAAI,CAAA,CAAE,CAAA;AAAA,MAC1D,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,IAAA,CAAK,WAAW,IAAI,CAAA;AAAA,MAC5B;AAEA,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,MAAA,WAAA,GAAc,OAAA,GAAU,GAAA;AAAA,IAC1B;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,cAAA,CAAe,OAAA,EAAsB,SAAA,GAAoB,KAAA,EAAe;AAC7E,IAAA,MAAM,mBAAmB,OAAA,CAAQ,WAAA,CAAY,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA;AAClE,IAAA,MAAM,KAAA,GAAkB,CAAC,QAAA,EAAU,EAAE,CAAA;AACrC,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,IAAI,WAAA,GAAc,CAAA;AAElB,IAAA,KAAA,MAAW,cAAc,gBAAA,EAAkB;AACzC,MAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,IAAA,EAAK,EAAG;AAE7B,MAAA,IAAI,SAAA,GAAY,WAAA;AAChB,MAAA,IAAI,OAAA;AAEJ,MAAA,IAAI,UAAA,CAAW,KAAA,IAAS,UAAA,CAAW,KAAA,CAAM,SAAS,CAAA,EAAG;AACnD,QAAA,SAAA,GAAY,UAAA,CAAW,KAAA,CAAM,CAAC,CAAA,CAAE,KAAA;AAChC,QAAA,OAAA,GAAU,WAAW,KAAA,CAAM,UAAA,CAAW,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAE,GAAA;AAAA,MAC1D,CAAA,MAAO;AACL,QAAA,MAAM,SAAA,GAAY,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA;AAC/C,QAAA,MAAM,UAAA,GAAc,SAAA,GAAY,GAAA,GAAO,EAAA,GAAK,GAAA;AAC5C,QAAA,OAAA,GAAU,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,GAAI,CAAA;AAAA,MACjD;AAEA,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA;AACtC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,IAAA,CAAK,UAAA,CAAW,SAAS,CAAC,CAAA,KAAA,EAAQ,IAAA,CAAK,UAAA,CAAW,OAAO,CAAC,CAAA,CAAE,CAAA;AAC1E,MAAA,KAAA,CAAM,IAAA,CAAK,WAAW,IAAI,CAAA;AAC1B,MAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAEb,MAAA,SAAA,EAAA;AACA,MAAA,WAAA,GAAc,OAAA,GAAU,GAAA;AAAA,IAC1B;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAe,WAAW,EAAA,EAAoB;AAC5C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,GAAI,CAAA;AACzC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,IAAI,CAAA;AAC5C,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAO,YAAA,GAAe,OAAQ,EAAE,CAAA;AACrD,IAAA,MAAM,UAAU,YAAA,GAAe,EAAA;AAC/B,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,GAAI,CAAA;AAEzC,IAAA,OAAO,CAAA,EAAG,KAAK,GAAA,CAAI,KAAA,EAAO,CAAC,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,CAAC,CAAC,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,CAAC,CAAC,IAAI,IAAA,CAAK,GAAA,CAAI,YAAA,EAAc,CAAC,CAAC,CAAA,CAAA;AAAA,EAC3G;AAAA;AAAA;AAAA;AAAA,EAKA,OAAe,GAAA,CAAI,GAAA,EAAa,MAAA,EAAwB;AACtD,IAAA,OAAO,MAAA,CAAO,GAAG,CAAA,CAAE,QAAA,CAAS,QAAQ,GAAG,CAAA;AAAA,EACzC;AACF;;;AC1GO,IAAM,cAAN,MAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOvB,OAAO,MAAA,CAAO,OAAA,EAAsB,OAAA,GAA4B,EAAC,EAAW;AAC1E,IAAA,MAAM;AAAA,MACJ,SAAA,GAAY,GAAA;AAAA,MACZ,cAAA,GAAiB,IAAA;AAAA,MACjB,UAAU,CAAC,WAAA,EAAa,MAAA,EAAQ,SAAA,EAAW,cAAc,SAAS;AAAA,KACpE,GAAI,OAAA;AAEJ,IAAA,MAAM,OAAiB,EAAC;AAGxB,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAA,GAAA,KAAO,IAAA,CAAK,WAAA,CAAY,GAAA,EAAK,SAAS,CAAC,CAAA,CAAE,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,IAChF;AAGA,IAAA,KAAA,MAAW,UAAA,IAAc,QAAQ,WAAA,EAAa;AAC5C,MAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,CAAA,GAAA,KAAO;AAChC,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,aAAA,CAAc,UAAA,EAAY,GAAG,CAAA;AAChD,QAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,KAAK,GAAG,SAAS,CAAA;AAAA,MAClD,CAAC,CAAA;AACD,MAAA,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,IAClC;AAEA,IAAA,OAAO,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,eAAA,CAAgB,OAAA,EAAsB,OAAA,GAA4B,EAAC,EAAW;AACnF,IAAA,MAAM,eAAA,GAAkB;AAAA,MACtB,aAAa,OAAA,CAAQ,WAAA,CAAY,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,OAAO;AAAA,KACxD;AACA,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,eAAA,EAAiB,OAAO,CAAA;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAe,aAAA,CAAc,UAAA,EAAiC,KAAA,EAA0C;AACtG,IAAA,QAAQ,KAAA;AAAO,MACb,KAAK,WAAA;AACH,QAAA,OAAO,WAAW,SAAA,IAAa,EAAA;AAAA,MACjC,KAAK,MAAA;AACH,QAAA,OAAO,WAAW,IAAA,IAAQ,EAAA;AAAA,MAC5B,KAAK,SAAA;AACH,QAAA,OAAO,UAAA,CAAW,OAAA;AAAA,MACpB,KAAK,YAAA;AACH,QAAA,OAAO,UAAA,CAAW,UAAA,KAAe,MAAA,GAAY,UAAA,CAAW,UAAA,GAAa,EAAA;AAAA,MACvE,KAAK,SAAA;AACH,QAAA,OAAO,WAAW,OAAA,IAAW,EAAA;AAAA,MAC/B,KAAK,UAAA;AACH,QAAA,OAAO,WAAW,QAAA,IAAY,EAAA;AAAA,MAChC,KAAK,WAAA;AACH,QAAA,OAAO,UAAA,CAAW,IAAA,GAAO,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,MAAA,GAAS,CAAA;AAAA,MAChF,KAAK,WAAA;AACH,QAAA,OAAO,UAAA,CAAW,KAAA,GAAQ,CAAC,CAAA,EAAG,KAAA,IAAS,EAAA;AAAA,MACzC,KAAK,SAAA;AACH,QAAA,OAAO,WAAW,KAAA,GAAQ,UAAA,CAAW,MAAM,MAAA,GAAS,CAAC,GAAG,GAAA,IAAO,EAAA;AAAA,MACjE;AACE,QAAA,OAAO,EAAA;AAAA;AACX,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAe,WAAA,CAAY,KAAA,EAAe,SAAA,EAA2B;AAEnE,IAAA,IAAI,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,IAAK,MAAM,QAAA,CAAS,GAAG,CAAA,IAAK,KAAA,CAAM,SAAS,IAAI,CAAA,IAAK,KAAA,CAAM,QAAA,CAAS,IAAI,CAAA,EAAG;AAEpG,MAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,IAAI,CAAA;AACxC,MAAA,OAAO,IAAI,OAAO,CAAA,CAAA,CAAA;AAAA,IACpB;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;AC1EO,IAAM,uBAAN,MAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA8BhC,WAAA,CAAY,QAAA,EAAkC,aAAA,GAA+B,EAAC,EAAG;AAnBjF;AAAA,IAAA,IAAA,CAAQ,cAAqC,EAAC;AAG9C;AAAA,IAAA,IAAA,CAAQ,KAAA,GAAA,MAAA;AAiBN,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,MAAA,GAAS,EAAE,GAAG,sBAAA,EAAwB,GAAG,aAAA,EAAc;AAC5D,IAAA,IAAA,CAAK,EAAA,GAAK,KAAK,iBAAA,EAAkB;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,IAAA,CAAK,KAAA,KAAA,MAAA,eAAmC,IAAA,CAAK,KAAA,KAAA,SAAA,gBAAoC;AACnF,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,+BAAA,EAAkC,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AAAA,IAChE;AAEA,IAAA,IAAA,CAAK,KAAA,GAAA,cAAA;AACL,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,GAAA,EAAI;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,SAAS,KAAA,EAAM;AAC1B,MAAA,IAAA,CAAK,KAAA,GAAA,QAAA;AACL,MAAA,IAAA,CAAK,WAAA,EAAY;AAAA,IACnB,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,KAAA,GAAA,OAAA;AACL,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAI,IAAA,CAAK,KAAA,KAAA,SAAA,kBAAsC,IAAA,CAAK,KAAA,KAAA,MAAA,aAAiC;AACnF,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,KAAA,GAAA,UAAA;AACL,IAAA,IAAA,CAAK,WAAA,EAAY;AAEjB,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,SAAS,IAAA,EAAK;AAAA,IAC3B,CAAA,SAAE;AACA,MAAA,IAAA,CAAK,KAAA,GAAA,SAAA;AAAA,IACP;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAI,KAAK,KAAA,KAAA,QAAA,eAAmC;AAC1C,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AACpB,IAAA,IAAA,CAAK,KAAA,GAAA,QAAA;AACL,IAAA,IAAA,CAAK,WAAA,EAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAe;AACb,IAAA,IAAI,KAAK,KAAA,KAAA,QAAA,eAAmC;AAC1C,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,SAAS,MAAA,EAAO;AACrB,IAAA,IAAA,CAAK,KAAA,GAAA,QAAA;AACL,IAAA,IAAA,CAAK,WAAA,EAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc,MAAA,EAAmC;AAC/C,IAAA,IAAA,CAAK,WAAA,CAAY,KAAK,MAAM,CAAA;AAC5B,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAA,CAAe,YAAqB,KAAA,EAA8B;AAChE,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAO,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA;AAAA,IAC/C;AACA,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,WAAW,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,WAAA,CACT,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,OAAO,CAAA,CACrB,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAI,CAAA,CACf,IAAA,CAAK,GAAG,EACR,IAAA,EAAK;AAAA,EACV;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAyB;AACvB,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAA2B;AACzB,IAAA,MAAM,QAAA,GAA4B;AAAA,MAChC,IAAI,IAAA,CAAK,EAAA;AAAA,MACT,SAAA,EAAW,KAAK,SAAA,IAAa,CAAA;AAAA,MAC7B,OAAA,EAAS,IAAA,CAAK,KAAA,KAAA,SAAA,iBAAqC,IAAA,CAAK,KAAI,GAAI,MAAA;AAAA,MAChE,UAAU,IAAA,CAAK,SAAA,GAAY,KAAK,GAAA,EAAI,GAAI,KAAK,SAAA,GAAY,CAAA;AAAA,MACzD,SAAA,EAAW,KAAK,YAAA,EAAa;AAAA,MAC7B,QAAA,EAAU,IAAA,CAAK,QAAA,CAAS,QAAA;AAAS,KACnC;AAEA,IAAA,OAAO;AAAA,MACL,QAAA;AAAA,MACA,WAAA,EAAa,KAAK,cAAA,EAAe;AAAA,MACjC,QAAA,EAAU,KAAK,WAAA;AAAY,KAC7B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAA,CAAO,SAAuB,MAAA,EAAsB;AAClD,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AAC5C,IAAA,MAAM,WAAA,GAAc,EAAE,WAAA,EAAY;AAClC,IAAA,MAAM,SAAA,GAAY,KAAK,SAAA,EAAU;AAEjC,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,SAAA;AAEJ,IAAA,QAAQ,MAAA;AAAQ,MACd,KAAK,MAAA;AACH,QAAA,IAAA,GAAO,aAAa,MAAA,CAAO,EAAE,UAAU,SAAA,CAAU,QAAA,EAAU,aAAa,CAAA;AACxE,QAAA,QAAA,GAAW,kBAAA;AACX,QAAA,SAAA,GAAY,MAAA;AACZ,QAAA;AAAA,MACF,KAAK,MAAA;AACH,QAAA,IAAA,GAAO,YAAA,CAAa,MAAA,CAAO,WAAA,EAAa,EAAE,CAAA;AAC1C,QAAA,QAAA,GAAW,YAAA;AACX,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,IAAA,GAAO,WAAA,CAAY,OAAO,WAAW,CAAA;AACrC,QAAA,QAAA,GAAW,YAAA;AACX,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,IAAA,GAAO,WAAA,CAAY,OAAO,WAAW,CAAA;AACrC,QAAA,QAAA,GAAW,UAAA;AACX,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA;AAAA,MACF,KAAK,KAAA;AACH,QAAA,IAAA,GAAO,WAAA,CAAY,MAAA,CAAO,WAAA,EAAa,EAAE,CAAA;AACzC,QAAA,QAAA,GAAW,UAAA;AACX,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA;AAAA,MACF;AACE,QAAA,IAAA,GAAO,aAAa,MAAA,CAAO,EAAE,UAAU,SAAA,CAAU,QAAA,EAAU,aAAa,CAAA;AACxE,QAAA,QAAA,GAAW,kBAAA;AACX,QAAA,SAAA,GAAY,MAAA;AAAA;AAGhB,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAA,EAAU,CAAA,WAAA,EAAc,IAAA,CAAK,EAAE,IAAI,SAAS,CAAA,CAAA;AAAA,MAC5C;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAA,GAAmC;AACjC,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,cAAA,CAAe,IAAI,CAAA;AAC5C,IAAA,MAAM,SAAA,GAAY,KAAK,YAAA,EAAa;AACpC,IAAA,MAAM,aAAa,IAAA,CAAK,SAAA,GAAY,KAAK,GAAA,EAAI,GAAI,KAAK,SAAA,GAAY,CAAA;AAGlE,IAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,KAAA,MAAW,KAAK,WAAA,EAAa;AAC3B,MAAA,IAAI,CAAA,CAAE,eAAe,MAAA,EAAW;AAC9B,QAAA,eAAA,IAAmB,CAAA,CAAE,UAAA;AACrB,QAAA,SAAA,EAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAM,iBAAA,GAAoB,SAAA,GAAY,CAAA,GAAI,eAAA,GAAkB,SAAA,GAAY,CAAA;AAGxE,IAAA,MAAM,kBAAkB,UAAA,GAAa,GAAA;AACrC,IAAA,MAAM,YAAA,GAAe,eAAA,GAAkB,CAAA,GAAI,SAAA,GAAY,eAAA,GAAkB,CAAA;AAEzE,IAAA,OAAO;AAAA,MACL,SAAA;AAAA,MACA,iBAAA;AAAA,MACA,YAAA;AAAA,MACA,cAAA,EAAgB,CAAA;AAAA;AAAA,MAChB,UAAA;AAAA,MACA,iBAAiB,WAAA,CAAY;AAAA,KAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,cAAc,EAAC;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAA,GAAuB;AAC7B,IAAA,OAAO,IAAA,CAAK,WAAA,CACT,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,CAAA,CACrB,MAAA,CAAO,CAAC,KAAA,EAAO,CAAA,KAAM;AACpB,MAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,IAAA,CAAK,IAAA,EAAK,CAAE,KAAA,CAAM,KAAK,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA;AACjE,MAAA,OAAO,QAAQ,KAAA,CAAM,MAAA;AAAA,IACvB,GAAG,CAAC,CAAA;AAAA,EACR;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,GAAoB;AAE1B,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,WAAA,GAAc,CAAA,EAAG;AAC/B,MAAA,IAAA,CAAK,gBAAA,GAAmB,WAAW,MAAM;AACvC,QAAA,KAAK,KAAK,IAAA,EAAK;AAAA,MACjB,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA;AAAA,IAC5B;AAGA,IAAA,IAAA,CAAK,iBAAA,EAAkB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,GAA0B;AAChC,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,YAAA,CAAa,KAAK,YAAY,CAAA;AAAA,IAChC;AAEA,IAAA,IAAI,IAAA,CAAK,MAAA,CAAO,cAAA,GAAiB,CAAA,IAAK,KAAK,KAAA,KAAA,QAAA,eAAmC;AAC5E,MAAA,IAAA,CAAK,YAAA,GAAe,WAAW,MAAM;AACnC,QAAA,KAAK,KAAK,IAAA,EAAK;AAAA,MACjB,CAAA,EAAG,IAAA,CAAK,MAAA,CAAO,cAAc,CAAA;AAAA,IAC/B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAA,GAAoB;AAC1B,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,YAAA,CAAa,KAAK,gBAAgB,CAAA;AAClC,MAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA;AAAA,IAC1B;AACA,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,YAAA,CAAa,KAAK,YAAY,CAAA;AAC9B,MAAA,IAAA,CAAK,YAAA,GAAe,MAAA;AAAA,IACtB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAA,GAA4B;AAClC,IAAA,OAAO,UAAA,GAAa,sCAAA,CAAuC,OAAA,CAAQ,OAAA,EAAS,CAAA,CAAA,KAAK;AAC/E,MAAA,MAAM,CAAA,GAAK,IAAA,CAAK,MAAA,EAAO,GAAI,EAAA,GAAM,CAAA;AACjC,MAAA,MAAM,CAAA,GAAI,CAAA,KAAM,GAAA,GAAM,CAAA,GAAK,IAAI,CAAA,GAAO,CAAA;AACtC,MAAA,OAAO,CAAA,CAAE,SAAS,EAAE,CAAA;AAAA,IACtB,CAAC,CAAA;AAAA,EACH;AACF;;;AClUO,IAAM,iBAAN,MAAqB;AAAA;AAAA;AAAA;AAAA;AAAA,EAiB1B,WAAA,CAAY,OAAA,GAAiC,EAAC,EAAG;AAfjD;AAAA,IAAA,IAAA,CAAQ,QAAA,uBAAkD,GAAA,EAAI;AAG9D;AAAA,IAAA,IAAA,CAAQ,eAAA,GAAiC,IAAA;AAavC,IAAA,IAAA,CAAK,aAAA,GAAgB,OAAA,CAAQ,aAAA,IAAiB,EAAC;AAC/C,IAAA,IAAA,CAAK,WAAA,GAAc,QAAQ,WAAA,IAAe,EAAA;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAA,CAAc,UAAkC,MAAA,EAA8C;AAC5F,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,IAAA,IAAQ,IAAA,CAAK,WAAA,EAAa;AAC1C,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,IAAA,CAAK,WAAW,CAAA,SAAA,CAAW,CAAA;AAAA,IAC5E;AAEA,IAAA,MAAM,eAAe,EAAE,GAAG,IAAA,CAAK,aAAA,EAAe,GAAG,MAAA,EAAO;AACxD,IAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,QAAA,EAAU,YAAY,CAAA;AAE/D,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,EAAA,EAAI,OAAO,CAAA;AAGrC,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AACzB,MAAA,IAAA,CAAK,kBAAkB,OAAA,CAAQ,EAAA;AAAA,IACjC;AAEA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,SAAA,EAAgD;AACzD,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA,IAAK,IAAA;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAA,GAAgD;AAC9C,IAAA,IAAI,CAAC,KAAK,eAAA,EAAiB;AACzB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,eAAe,CAAA,IAAK,IAAA;AAAA,EACpD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAiB,SAAA,EAAyB;AACxC,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA,EAAG;AACjC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,SAAS,CAAA,UAAA,CAAY,CAAA;AAAA,IAClD;AACA,IAAA,IAAA,CAAK,eAAA,GAAkB,SAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAA,GAAyC;AACvC,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,cAAc,SAAA,EAAkC;AACpD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAC3C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,OAAA,CAAQ,QAAA,EAAS,KAAA,QAAA,iBACjB,OAAA,CAAQ,UAAS,KAAA,QAAA,eAA+B;AAClD,MAAA,MAAM,QAAQ,IAAA,EAAK;AAAA,IACrB;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,OAAO,SAAS,CAAA;AAG9B,IAAA,IAAI,IAAA,CAAK,oBAAoB,SAAA,EAAW;AACtC,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAEvB,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,QAAA,CAAS,IAAA,GAAO,IAAA,EAAK;AAC5C,MAAA,IAAI,CAAC,UAAU,IAAA,EAAM;AACnB,QAAA,IAAA,CAAK,kBAAkB,SAAA,CAAU,KAAA;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,gBAAA,GAAkC;AACtC,IAAA,MAAM,eAAgC,EAAC;AAEvC,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,QAAA,CAAS,MAAA,EAAO,EAAG;AAC5C,MAAA,MAAM,KAAA,GAAQ,QAAQ,QAAA,EAAS;AAC/B,MAAA,IAAI,mCAAqC,KAAA,KAAA,QAAA,eAAmC;AAC1E,QAAA,YAAA,CAAa,IAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,CAAA;AAAA,MAClC;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,CAAQ,IAAI,YAAY,CAAA;AAE9B,IAAA,IAAA,CAAK,SAAS,KAAA,EAAM;AACpB,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAA,GAAgC;AAC9B,IAAA,IAAI,gBAAA,GAAmB,CAAA;AACvB,IAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,IAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,IAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,IAAA,IAAI,cAAA,GAAiB,CAAA;AAErB,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,QAAA,CAAS,MAAA,EAAO,EAAG;AAC5C,MAAA,MAAM,KAAA,GAAQ,QAAQ,QAAA,EAAS;AAC/B,MAAA,IAAI,KAAA,KAAA,QAAA,eAAmC;AACrC,QAAA,cAAA,EAAA;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,QAAQ,aAAA,EAAc;AACpC,MAAA,gBAAA,IAAoB,KAAA,CAAM,eAAA;AAC1B,MAAA,aAAA,IAAiB,KAAA,CAAM,UAAA;AAEvB,MAAA,IAAI,KAAA,CAAM,oBAAoB,CAAA,EAAG;AAC/B,QAAA,eAAA,IAAmB,KAAA,CAAM,iBAAA;AACzB,QAAA,eAAA,EAAA;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,aAAA,EAAe,KAAK,QAAA,CAAS,IAAA;AAAA,MAC7B,cAAA;AAAA,MACA,gBAAA;AAAA,MACA,aAAA;AAAA,MACA,iBAAA,EAAmB,eAAA,GAAkB,CAAA,GAAI,eAAA,GAAkB,eAAA,GAAkB;AAAA,KAC/E;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAA,CAAc,WAAmB,MAAA,EAAoC;AACnE,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAC3C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,SAAS,CAAA,UAAA,CAAY,CAAA;AAAA,IAClD;AAEA,IAAA,MAAM,UAAA,GAAa,QAAQ,SAAA,EAAU;AACrC,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,UAAU,UAAA,CAAW,QAAA;AAAA,MACrB,aAAa,UAAA,CAAW;AAAA,KAC1B;AAEA,IAAA,IAAI,IAAA;AACJ,IAAA,IAAI,QAAA;AACJ,IAAA,IAAI,SAAA;AAEJ,IAAA,QAAQ,MAAA;AAAQ,MACd,KAAK,MAAA;AACH,QAAA,IAAA,GAAO,YAAA,CAAa,aAAa,WAAW,CAAA;AAC5C,QAAA,QAAA,GAAW,kBAAA;AACX,QAAA,SAAA,GAAY,MAAA;AACZ,QAAA;AAAA,MAEF,KAAK,MAAA;AACH,QAAA,IAAA,GAAO,YAAA,CAAa,OAAO,WAAW,CAAA;AACtC,QAAA,QAAA,GAAW,YAAA;AACX,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA;AAAA,MAEF,KAAK,KAAA;AACH,QAAA,IAAA,GAAO,WAAA,CAAY,OAAO,WAAW,CAAA;AACrC,QAAA,QAAA,GAAW,sBAAA;AACX,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA;AAAA,MAEF,KAAK,KAAA;AACH,QAAA,IAAA,GAAO,WAAA,CAAY,OAAO,WAAW,CAAA;AACrC,QAAA,QAAA,GAAW,UAAA;AACX,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA;AAAA,MAEF,KAAK,KAAA;AACH,QAAA,IAAA,GAAO,WAAA,CAAY,OAAO,WAAW,CAAA;AACrC,QAAA,QAAA,GAAW,UAAA;AACX,QAAA,SAAA,GAAY,KAAA;AACZ,QAAA;AAAA,MAEF;AACE,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,MAAM,CAAA,CAAE,CAAA;AAAA;AAG1D,IAAA,OAAO;AAAA,MACL,MAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAA,EAAU,CAAA,WAAA,EAAc,SAAS,CAAA,CAAA,EAAI,SAAS,CAAA,CAAA;AAAA,MAC9C;AAAA,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAA,CAAc,MAAqB,QAAA,EAAwD;AACzF,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,IAAA,IAAQ,IAAA,CAAK,WAAA,EAAa;AAC1C,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,IAAA,CAAK,WAAW,CAAA,SAAA,CAAW,CAAA;AAAA,IAC5E;AAEA,IAAA,MAAM,UAAU,IAAI,oBAAA,CAAqB,UAAU,IAAA,CAAK,MAAA,IAAU,EAAE,CAAA;AAGpE,IAAA,KAAA,MAAW,UAAA,IAAc,KAAK,WAAA,EAAa;AACzC,MAAA,OAAA,CAAQ,cAAc,UAAU,CAAA;AAAA,IAClC;AAEA,IAAA,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,OAAA,CAAQ,EAAA,EAAI,OAAO,CAAA;AAErC,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,WAAW,SAAA,EAA4B;AACrC,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,SAAS,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAA,GAA0B;AACxB,IAAA,OAAO,KAAK,QAAA,CAAS,IAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,mBAAmB,KAAA,EAA6C;AAC9D,IAAA,OAAO,IAAA,CAAK,gBAAe,CAAE,MAAA,CAAO,aAAW,OAAA,CAAQ,QAAA,OAAe,KAAK,CAAA;AAAA,EAC7E;AACF;;;ACtOO,IAAM,kBAAA,GAAN,MAAM,kBAAA,SAA0B,eAAA,CAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,EA4CrD,YAAY,MAAA,EAAsF;AAChG,IAAA,KAAA,CAAM,EAAE,GAAG,MAAA,EAAQ,QAAA,EAAA,YAAA,qBAA8C,CAAA;AA3CnE;AAAA,IAAA,IAAA,CAAQ,WAAA,GAAwC,IAAA;AAGhD;AAAA,IAAA,IAAA,CAAQ,WAAA,GAAkC,IAAA;AAG1C;AAAA,IAAA,IAAA,CAAQ,YAAA,GAAoC,IAAA;AAG5C;AAAA,IAAA,IAAA,CAAQ,QAAA,GAAgC,IAAA;AAGxC;AAAA,IAAA,IAAA,CAAQ,kBAAA,GAA4D,IAAA;AAGpE;AAAA,IAAA,IAAA,CAAQ,YAAA,GAAwB,KAAA;AAGhC;AAAA,IAAA,IAAA,CAAQ,UAAA,GAAqB,CAAA;AAG7B;AAAA,IAAA,IAAA,CAAiB,UAAA,GAAqB,CAAA;AAAA,EAuBtC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAuB;AACrB,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,OAAO,CAAC,EAAE,MAAA,CAAO,iBAAA,IAAqB,MAAA,CAAO,uBAAA,CAAA;AAAA,EAC/C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG;AACvB,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,iDAAA;AAAA,QAAA,qBAAA;AAAA,QAAA,YAAA;AAAA,OAGF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAA,CAAA,cAAA,oBAAkC;AAEvC,IAAA,IAAI;AAEF,MAAA,MAAM,KAAK,mBAAA,EAAoB;AAG/B,MAAA,MAAM,sBAAA,GAAyB,MAAA,CAAO,iBAAA,IAAqB,MAAA,CAAO,uBAAA;AAClE,MAAA,IAAA,CAAK,WAAA,GAAc,IAAI,sBAAA,EAAuB;AAG9C,MAAA,IAAA,CAAK,YAAY,UAAA,GAAa,IAAA;AAC9B,MAAA,IAAA,CAAK,WAAA,CAAY,cAAA,GAAiB,IAAA,CAAK,MAAA,CAAO,cAAA,IAAkB,IAAA;AAChE,MAAA,IAAA,CAAK,WAAA,CAAY,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,QAAA,IAAY,OAAA;AAChD,MAAA,IAAA,CAAK,YAAY,eAAA,GAAkB,CAAA;AAGnC,MAAA,IAAA,CAAK,kBAAA,EAAmB;AAGxB,MAAA,IAAI,IAAA,CAAK,MAAA,CAAO,eAAA,EAAiB,SAAA,EAAW;AAC1C,QAAA,IAAA,CAAK,yBAAA,EAA0B;AAAA,MACjC;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,YAAY,KAAc,CAAA;AAC/B,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,KAAK,UAAA,EAAW;AAAA,IACxB;AAEA,IAAA,IAAI,KAAK,KAAA,KAAA,QAAA,eAA+B;AACtC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,YAAa,KAAA,EAAM;AACxB,MAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAAA,IACpB,SAAS,KAAA,EAAO;AAEd,MAAA,IAAK,KAAA,CAAgB,OAAA,EAAS,QAAA,CAAS,iBAAiB,CAAA,EAAG;AACzD,QAAA;AAAA,MACF;AACA,MAAA,IAAA,CAAK,YAAY,KAAc,CAAA;AAC/B,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAI,IAAA,CAAK,KAAA,KAAA,SAAA,kBAAkC,IAAA,CAAK,KAAA,KAAA,MAAA,aAA6B;AAC3E,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAA,CAAA,UAAA,gBAA8B;AACnC,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAEpB,IAAA,IAAI;AACF,MAAA,IAAI,KAAK,WAAA,EAAa;AACpB,QAAA,IAAA,CAAK,YAAY,IAAA,EAAK;AAAA,MACxB;AAEA,MAAA,IAAA,CAAK,wBAAA,EAAyB;AAC9B,MAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,MAAA,IAAA,CAAK,QAAA,CAAA,SAAA,eAA6B;AAClC,MAAA,IAAA,CAAK,KAAK,MAAM,CAAA;AAAA,IAClB,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,YAAY,KAAc,CAAA;AAAA,IACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAI,KAAK,KAAA,KAAA,QAAA,eAA+B;AACtC,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAEpB,IAAA,IAAI;AACF,MAAA,IAAI,KAAK,WAAA,EAAa;AACpB,QAAA,IAAA,CAAK,YAAY,IAAA,EAAK;AAAA,MACxB;AACA,MAAA,IAAA,CAAK,QAAA,CAAA,QAAA,cAA4B;AACjC,MAAA,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,IACnB,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,YAAY,KAAc,CAAA;AAAA,IACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAe;AACb,IAAA,IAAI,KAAK,KAAA,KAAA,QAAA,eAA+B;AACtC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,IAAI,KAAK,WAAA,EAAa;AACpB,QAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,MACzB;AACA,MAAA,IAAA,CAAK,QAAA,CAAA,QAAA,cAA4B;AACjC,MAAA,IAAA,CAAK,KAAK,QAAQ,CAAA;AAAA,IACpB,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,YAAY,KAAc,CAAA;AAAA,IACjC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,UAAA,EAA+B;AACvC,IAAA,OAAA,CAAQ,KAAK,+GAA+G,CAAA;AAAA,EAC9H;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAGpB,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,YAAY,IAAA,EAAK;AAAA,MACxB,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,IAAA,CAAK,YAAY,OAAA,GAAU,IAAA;AAC3B,MAAA,IAAA,CAAK,YAAY,KAAA,GAAQ,IAAA;AACzB,MAAA,IAAA,CAAK,YAAY,OAAA,GAAU,IAAA;AAC3B,MAAA,IAAA,CAAK,YAAY,QAAA,GAAW,IAAA;AAC5B,MAAA,IAAA,CAAK,YAAY,aAAA,GAAgB,IAAA;AACjC,MAAA,IAAA,CAAK,YAAY,WAAA,GAAc,IAAA;AAC/B,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACrB;AAGA,IAAA,IAAA,CAAK,wBAAA,EAAyB;AAG9B,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,aAAa,KAAA,EAAM;AAAA,MAChC,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAAA,IAClB;AAGA,IAAA,IAAA,CAAK,eAAA,EAAgB;AAGrB,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAAwC;AACtC,IAAA,OAAO,kBAAA,CAAkB,YAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,kBAAA,GAA2B;AACjC,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AAEvB,IAAA,IAAA,CAAK,WAAA,CAAY,UAAU,MAAY;AACrC,MAAA,IAAA,CAAK,QAAA,CAAA,QAAA,cAA4B;AACjC,MAAA,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,IACnB,CAAA;AAEA,IAAA,IAAA,CAAK,WAAA,CAAY,QAAQ,MAAY;AACnC,MAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,IAC5B,CAAA;AAEA,IAAA,IAAA,CAAK,WAAA,CAAY,OAAA,GAAU,CAAC,KAAA,KAA6C;AACvE,MAAA,IAAA,CAAK,uBAAuB,KAAK,CAAA;AAAA,IACnC,CAAA;AAEA,IAAA,IAAA,CAAK,WAAA,CAAY,QAAA,GAAW,CAAC,KAAA,KAAwC;AACnE,MAAA,IAAA,CAAK,yBAAyB,KAAK,CAAA;AAAA,IACrC,CAAA;AAEA,IAAA,IAAA,CAAK,WAAA,CAAY,gBAAgB,MAAY;AAC3C,MAAA,IAAA,CAAK,KAAK,QAAQ,CAAA;AAAA,IACpB,CAAA;AAEA,IAAA,IAAA,CAAK,WAAA,CAAY,cAAc,MAAY;AACzC,MAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AAAA,IACrB,CAAA;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,yBAAyB,KAAA,EAAqC;AACpE,IAAA,KAAA,IAAS,IAAI,KAAA,CAAM,WAAA,EAAa,IAAI,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AAC7D,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAC9B,MAAA,MAAM,WAAA,GAAc,OAAO,CAAC,CAAA;AAE5B,MAAA,IAAI,CAAC,WAAA,EAAa;AAElB,MAAA,MAAM,mBAAA,GAA2C;AAAA,QAC/C,MAAM,WAAA,CAAY,UAAA;AAAA,QAClB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,YAAY,WAAA,CAAY,UAAA;AAAA,QACxB,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,QACpB,QAAA,EAAU,KAAK,MAAA,CAAO;AAAA,OACxB;AAEA,MAAA,IAAA,CAAK,iBAAiB,mBAAmB,CAAA;AAAA,IAC3C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAA,GAA6B;AAEnC,IAAA,IACE,KAAK,KAAA,KAAA,UAAA,mBACL,IAAA,CAAK,qCACL,IAAA,CAAK,KAAA,KAAA,QAAA,iBACL,KAAK,KAAA,KAAA,OAAA,cACL;AACA,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,IAAA,CAAK,KAAA,KAAA,QAAA,iBAAiC,CAAC,IAAA,CAAK,YAAA,EAAc;AAC5D,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAEpB,MAAA,IAAI,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,UAAA,EAAY;AACrC,QAAA,IAAA,CAAK,UAAA,EAAA;AACL,QAAA,UAAA,CAAW,MAAM;AACf,UAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,KAAA,KAAA,QAAA,eAA+B;AAC1D,YAAA,IAAI;AACF,cAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,YACzB,SAAS,KAAA,EAAO;AACd,cAAA,IAAA,CAAK,YAAY,KAAc,CAAA;AAAA,YACjC;AAAA,UACF;AACA,UAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAAA,QACtB,GAAG,GAAG,CAAA;AAAA,MACR,CAAA,MAAO;AAEL,QAAA,IAAA,CAAK,QAAA,CAAA,SAAA,eAA6B;AAClC,QAAA,IAAA,CAAK,KAAK,MAAM,CAAA;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,KAAA,EAA0C;AACvE,IAAA,IAAI,SAAA;AACJ,IAAA,IAAI,UAAA,GAAa,KAAA;AAEjB,IAAA,QAAQ,MAAM,KAAA;AAAO,MACnB,KAAK,WAAA;AAEH,QAAA,OAAA,CAAQ,KAAK,oBAAoB,CAAA;AACjC,QAAA;AAAA,MAEF,KAAK,eAAA;AAAA,MACL,KAAK,aAAA;AACH,QAAA,SAAA,GAAA,0BAAA;AACA,QAAA,UAAA,GAAa,IAAA;AACb,QAAA;AAAA,MAEF,KAAK,SAAA;AACH,QAAA,SAAA,GAAA,eAAA;AACA,QAAA;AAAA,MAEF,KAAK,SAAA;AAEH,QAAA;AAAA,MAEF,KAAK,qBAAA;AACH,QAAA,SAAA,GAAA,qBAAA;AACA,QAAA,UAAA,GAAa,IAAA;AACb,QAAA;AAAA,MAEF;AACE,QAAA,SAAA,GAAA,gBAAA;AAAA;AAGJ,IAAA,MAAM,QAAQ,IAAI,kBAAA;AAAA,MAChB,KAAA,CAAM,OAAA,IAAW,CAAA,0BAAA,EAA6B,KAAA,CAAM,KAAK,CAAA,CAAA;AAAA,MACzD,SAAA;AAAA,MAAA,YAAA;AAAA,MAEA,EAAE,aAAA,EAAe,KAAA,CAAM,KAAA;AAAM,KAC/B;AAEA,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,IACxB,CAAA,MAAO;AAEL,MAAA,IAAA,CAAK,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,IAC1B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,mBAAA,GAAqC;AACjD,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAsC;AAAA,QAC1C,KAAA,EAAO;AAAA,UACL,gBAAA,EAAkB,IAAA;AAAA,UAClB,gBAAA,EAAkB,IAAA;AAAA,UAClB,eAAA,EAAiB,IAAA;AAAA,UACjB,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,WAAA,EAAa,UAAA,IAAc;AAAA;AACrD,OACF;AAEA,MAAA,IAAA,CAAK,WAAA,GAAc,MAAM,SAAA,CAAU,YAAA,CAAa,aAAa,WAAW,CAAA;AAAA,IAC1E,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,GAAA,GAAM,KAAA;AACZ,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,IAAI,OAAA,IAAW,0BAAA;AAAA,QAAA,0BAAA;AAAA,QAAA,YAAA;AAAA,QAGf;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAA,GAAwB;AAC9B,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,YAAY,SAAA,EAAU,CAAE,QAAQ,CAAA,KAAA,KAAS,KAAA,CAAM,MAAM,CAAA;AAC1D,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACrB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,yBAAA,GAAkC;AACxC,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AAEvB,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,YAAA,GAAe,IAAI,YAAA,EAAa;AACrC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,uBAAA,CAAwB,KAAK,WAAW,CAAA;AACzE,MAAA,IAAA,CAAK,QAAA,GAAW,IAAA,CAAK,YAAA,CAAa,cAAA,EAAe;AACjD,MAAA,IAAA,CAAK,SAAS,OAAA,GAAU,GAAA;AACxB,MAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,QAAQ,CAAA;AAE5B,MAAA,MAAM,SAAA,GAAY,IAAI,UAAA,CAAW,IAAA,CAAK,SAAS,iBAAiB,CAAA;AAEhE,MAAA,IAAA,CAAK,kBAAA,GAAqB,YAAY,MAAM;AAC1C,QAAA,IAAI,IAAA,CAAK,QAAA,IAAY,IAAA,CAAK,KAAA,KAAA,QAAA,eAA+B;AACvD,UAAA,IAAA,CAAK,QAAA,CAAS,qBAAqB,SAAS,CAAA;AAC5C,UAAA,MAAM,OAAA,GAAU,SAAA,CAAU,MAAA,CAAO,CAAC,CAAA,EAAG,MAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,SAAA,CAAU,MAAA;AACjE,UAAA,MAAM,kBAAkB,OAAA,GAAU,GAAA;AAClC,UAAA,IAAA,CAAK,IAAA,CAAK,cAAc,eAAe,CAAA;AAAA,QACzC;AAAA,MACF,GAAG,GAAG,CAAA;AAAA,IACR,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,4CAA4C,KAAK,CAAA;AAAA,IAChE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAA,GAAiC;AACvC,IAAA,IAAI,KAAK,kBAAA,EAAoB;AAC3B,MAAA,aAAA,CAAc,KAAK,kBAAkB,CAAA;AACrC,MAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAAA,IAC5B;AAAA,EACF;AACF,CAAA;AAAA;AAlda,kBAAA,CA0BY,YAAA,GAAqC;AAAA,EAC1D,eAAA,EAAiB,IAAA;AAAA,EACjB,sBAAA,EAAwB,KAAA;AAAA,EACxB,0BAAA,EAA4B,KAAA;AAAA,EAC5B,mBAAA,EAAqB,KAAA;AAAA,EACrB,yBAAA,EAA2B,KAAA;AAAA,EAC3B,kBAAA,EAAoB;AAAA,IAClB,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,OAAA;AAAA,IACpC,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,OAAA;AAAA,IACpC,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,OAAA;AAAA,IACpC,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS;AAAA;AAExC,CAAA;AAtCK,IAAM,iBAAA,GAAN;;;AC/DP,IAAM,eAAA,GAAkB,kCAAA;AAGxB,IAAM,mBAAA,GAAsB,GAAA;AAG5B,IAAM,eAAA,GAAkB,GAAA;AAuEjB,IAAM,iBAAA,GAAN,MAAM,iBAAA,SAAyB,eAAA,CAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,EAiEpD,YAAY,MAAA,EAAsF;AAChG,IAAA,KAAA,CAAM,EAAE,GAAG,MAAA,EAAQ,QAAA,EAAA,UAAA,iBAA0C,CAAA;AAhE/D;AAAA,IAAA,IAAA,CAAQ,MAAA,GAA2B,IAAA;AAGnC;AAAA,IAAA,IAAA,CAAQ,WAAA,GAAkC,IAAA;AAG1C;AAAA,IAAA,IAAA,CAAQ,YAAA,GAAoC,IAAA;AAG5C;AAAA,IAAA,IAAA,CAAQ,SAAA,GAAwC,IAAA;AAGhD;AAAA,IAAA,IAAA,CAAQ,kBAAA,GAA6B,CAAA;AAGrC;AAAA,IAAA,IAAA,CAAiB,UAAA,GAAqB,CAAA;AAGtC;AAAA,IAAA,IAAA,CAAQ,gBAAA,GAAyD,IAAA;AAGjE;AAAA,IAAA,IAAA,CAAQ,iBAAA,GAA2D,IAAA;AAGnE;AAAA,IAAA,IAAA,CAAQ,iBAAA,GAA6B,KAAA;AAGrC;AAAA,IAAA,IAAA,CAAQ,kBAAA,GAA8B,KAAA;AAAA,EAsCtC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAuB;AACrB,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AAEjC,MAAA,OAAO,OAAO,SAAA,KAAc,WAAA;AAAA,IAC9B;AACA,IAAA,OAAO,CAAC,EACN,OAAO,SAAA,KAAc,eACrB,SAAA,CAAU,YAAA,IACV,OAAO,SAAA,CAAU,YAAA,CAAa,YAAA,KAAiB,UAAA,KAC9C,MAAA,CAAO,gBAAiB,MAAA,CAAkE,kBAAA,CAAA,CAAA;AAAA,EAE/F;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ;AACvB,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,8BAAA;AAAA,QAAA,gBAAA;AAAA,QAAA,UAAA;AAAA,OAGF;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG;AACvB,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,wDAAA;AAAA,QAAA,qBAAA;AAAA,QAAA,UAAA;AAAA,OAGF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAA,CAAA,cAAA,oBAAkC;AACvC,IAAA,IAAA,CAAK,iBAAA,GAAoB,KAAA;AACzB,IAAA,IAAA,CAAK,kBAAA,GAAqB,KAAA;AAE1B,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,cAAA,EAAe;AAAA,IAC5B,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,YAAY,KAAc,CAAA;AAC/B,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,KAAK,iBAAA,EAAmB;AAC3C,MAAA,MAAM,KAAK,UAAA,EAAW;AAAA,IACxB;AAEA,IAAA,IAAI,KAAK,KAAA,KAAA,QAAA,eAA+B;AACtC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,mBAAA,EAAoB;AAC/B,MAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,MAAA,IAAA,CAAK,QAAA,CAAA,QAAA,cAA4B;AACjC,MAAA,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,IACnB,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,YAAY,KAAc,CAAA;AAC/B,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAI,IAAA,CAAK,KAAA,KAAA,SAAA,kBAAkC,IAAA,CAAK,KAAA,KAAA,MAAA,aAA6B;AAC3E,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAA,CAAA,UAAA,gBAA8B;AACnC,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAG1B,IAAA,IAAA,CAAK,aAAA,EAAc;AAGnB,IAAA,IAAI,KAAK,MAAA,IAAU,IAAA,CAAK,MAAA,CAAO,UAAA,KAAe,UAAU,IAAA,EAAM;AAC5D,MAAA,IAAI;AACF,QAAA,IAAA,CAAK,MAAA,CAAO,KAAK,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,aAAA,EAAe,CAAC,CAAA;AAExD,QAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,GAAG,CAAC,CAAA;AAAA,MACvD,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,cAAA,EAAe;AAGpB,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAGzB,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,IAAA,CAAK,QAAA,CAAA,SAAA,eAA6B;AAClC,IAAA,IAAA,CAAK,KAAK,MAAM,CAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAI,KAAK,KAAA,KAAA,QAAA,eAA+B;AACtC,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,IAAA,IAAA,CAAK,QAAA,CAAA,QAAA,cAA4B;AACjC,IAAA,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAe;AACb,IAAA,IAAI,KAAK,KAAA,KAAA,QAAA,eAA+B;AACtC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,YAAA,EAAc;AACzC,MAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,IAC5B;AAEA,IAAA,IAAA,CAAK,QAAA,CAAA,QAAA,cAA4B;AACjC,IAAA,IAAA,CAAK,KAAK,QAAQ,CAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,SAAA,EAA8B;AACtC,IAAA,IAAI,IAAA,CAAK,UAAU,IAAA,CAAK,MAAA,CAAO,eAAe,SAAA,CAAU,IAAA,IAAQ,KAAK,KAAA,KAAA,QAAA,eAA+B;AAClG,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,SAAS,CAAA;AAC1B,MAAA,IAAA,CAAK,gBAAgB,SAAS,CAAA;AAAA,IAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAG1B,IAAA,IAAA,CAAK,aAAA,EAAc;AACnB,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,YAAA,CAAa,KAAK,gBAAgB,CAAA;AAClC,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,IAC1B;AAGA,IAAA,IAAA,CAAK,cAAA,EAAe;AAGpB,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAGzB,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,aAAa,KAAA,EAAM;AAAA,MAChC,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,IACtB;AAGA,IAAA,IAAA,CAAK,eAAA,EAAgB;AAGrB,IAAA,IAAA,CAAK,kBAAA,GAAqB,CAAA;AAC1B,IAAA,IAAA,CAAK,iBAAA,GAAoB,KAAA;AAGzB,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAAwC;AACtC,IAAA,OAAO,iBAAA,CAAiB,YAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,iBAAA,GAA4B;AAClC,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,EAAgB;AACnC,IAAA,MAAM,OAAA,GAAW,IAAA,CAAK,MAAA,CAAO,eAAA,IAAmB,EAAC;AAGjD,IAAA,MAAA,CAAO,GAAA,CAAI,OAAA,EAAS,OAAA,CAAQ,KAAA,IAAS,QAAQ,CAAA;AAC7C,IAAA,IAAI,QAAQ,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,SAAA,EAAW,QAAQ,OAAO,CAAA;AAC1D,IAAA,IAAI,QAAQ,IAAA,EAAM,MAAA,CAAO,GAAA,CAAI,MAAA,EAAQ,QAAQ,IAAI,CAAA;AAGjD,IAAA,IAAI,IAAA,CAAK,OAAO,QAAA,EAAU;AACxB,MAAA,MAAA,CAAO,GAAA,CAAI,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAAA,IAC7C;AAGA,IAAA,MAAA,CAAO,GAAA,CAAI,aAAa,MAAA,CAAO,IAAA,CAAK,OAAO,WAAA,IAAe,OAAA,CAAQ,SAAA,IAAa,IAAI,CAAC,CAAA;AACpF,IAAA,MAAA,CAAO,IAAI,iBAAA,EAAmB,MAAA,CAAO,KAAK,MAAA,CAAO,cAAA,IAAkB,IAAI,CAAC,CAAA;AAExE,IAAA,IAAI,OAAA,CAAQ,OAAA,EAAS,MAAA,CAAO,GAAA,CAAI,WAAW,MAAM,CAAA;AACjD,IAAA,IAAI,OAAA,CAAQ,YAAA,EAAc,MAAA,CAAO,GAAA,CAAI,gBAAgB,MAAM,CAAA;AAC3D,IAAA,IAAI,OAAA,CAAQ,cAAc,MAAA,CAAO,GAAA,CAAI,gBAAgB,MAAA,CAAO,OAAA,CAAQ,YAAY,CAAC,CAAA;AACjF,IAAA,IAAI,OAAA,CAAQ,QAAA,EAAU,MAAA,CAAO,GAAA,CAAI,YAAY,MAAM,CAAA;AACnD,IAAA,IAAI,OAAA,CAAQ,WAAA,EAAa,MAAA,CAAO,GAAA,CAAI,gBAAgB,MAAM,CAAA;AAC1D,IAAA,IAAI,OAAA,CAAQ,gBAAgB,MAAA,EAAW,MAAA,CAAO,IAAI,aAAA,EAAe,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAC,CAAA;AAG5F,IAAA,IAAI,OAAA,CAAQ,UAAU,MAAA,EAAQ;AAC5B,MAAA,OAAA,CAAQ,SAAS,OAAA,CAAQ,CAAA,CAAA,KAAK,OAAO,MAAA,CAAO,UAAA,EAAY,CAAC,CAAC,CAAA;AAAA,IAC5D;AACA,IAAA,IAAI,OAAA,CAAQ,QAAQ,MAAA,EAAQ;AAC1B,MAAA,OAAA,CAAQ,OAAO,OAAA,CAAQ,CAAA,CAAA,KAAK,OAAO,MAAA,CAAO,QAAA,EAAU,CAAC,CAAC,CAAA;AAAA,IACxD;AAGA,IAAA,MAAA,CAAO,GAAA,CAAI,YAAY,UAAU,CAAA;AACjC,IAAA,MAAA,CAAO,GAAA,CAAI,eAAe,MAAA,CAAO,IAAA,CAAK,OAAO,WAAA,EAAa,UAAA,IAAc,IAAK,CAAC,CAAA;AAC9E,IAAA,MAAA,CAAO,GAAA,CAAI,YAAY,MAAA,CAAO,IAAA,CAAK,OAAO,WAAA,EAAa,QAAA,IAAY,CAAC,CAAC,CAAA;AAErE,IAAA,OAAO,CAAA,EAAG,eAAe,CAAA,CAAA,EAAI,MAAA,CAAO,UAAU,CAAA,CAAA;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAAA,GAAgC;AAC5C,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,MAAM,GAAA,GAAM,KAAK,iBAAA,EAAkB;AAEnC,MAAA,IAAA,CAAK,MAAA,GAAS,IAAI,SAAA,CAAU,GAAA,EAAK,CAAC,OAAA,EAAS,IAAA,CAAK,MAAA,CAAO,MAAO,CAAC,CAAA;AAC/D,MAAA,IAAA,CAAK,OAAO,UAAA,GAAa,aAAA;AAEzB,MAAA,MAAM,iBAAA,GAAoB,WAAW,MAAM;AACzC,QAAA,MAAA,CAAO,IAAI,kBAAA;AAAA,UACT,8BAAA;AAAA,UAAA,mBAAA;AAAA,UAAA,UAAA;AAAA,SAGD,CAAA;AAAA,MACH,GAAG,GAAK,CAAA;AAER,MAAA,IAAA,CAAK,MAAA,CAAO,SAAS,MAAY;AAC/B,QAAA,YAAA,CAAa,iBAAiB,CAAA;AAC9B,QAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,QAAA,OAAA,EAAQ;AAAA,MACV,CAAA;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,SAAA,GAAY,CAAC,KAAA,KAA8B;AACrD,QAAA,IAAA,CAAK,uBAAuB,KAAK,CAAA;AAAA,MACnC,CAAA;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,OAAA,GAAU,CAAC,KAAA,KAAuB;AAC5C,QAAA,YAAA,CAAa,iBAAiB,CAAA;AAC9B,QAAA,IAAA,CAAK,qBAAqB,KAAK,CAAA;AAC/B,QAAA,MAAA,CAAO,IAAI,kBAAA;AAAA,UACT,4BAAA;AAAA,UAAA,mBAAA;AAAA,UAAA,UAAA;AAAA,SAGD,CAAA;AAAA,MACH,CAAA;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,OAAA,GAAU,CAAC,KAAA,KAA4B;AACjD,QAAA,YAAA,CAAa,iBAAiB,CAAA;AAC9B,QAAA,IAAA,CAAK,qBAAqB,KAAK,CAAA;AAAA,MACjC,CAAA;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAA,GAA4B;AAClC,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AACzB,IAAA,IAAA,CAAK,kBAAA,GAAqB,CAAA;AAC1B,IAAA,IAAA,CAAK,cAAA,EAAe;AAAA,EACtB;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,KAAA,EAA2B;AACxD,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAA2B,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAc,CAAA;AAEhE,MAAA,QAAQ,QAAQ,IAAA;AAAM,QACpB,KAAK,SAAA;AACH,UAAA,IAAA,CAAK,2BAA2B,OAAO,CAAA;AACvC,UAAA;AAAA,QAEF,KAAK,UAAA;AAEH,UAAA;AAAA,QAEF,KAAK,eAAA;AACH,UAAA,IAAA,CAAK,KAAK,QAAQ,CAAA;AAClB,UAAA;AAAA,QAEF,KAAK,cAAA;AACH,UAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AACnB,UAAA;AAAA,QAEF,KAAK,OAAA;AACH,UAAA,IAAA,CAAK,oBAAoB,OAAO,CAAA;AAChC,UAAA;AAAA;AACJ,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,qCAAqC,KAAK,CAAA;AAAA,IAC1D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,2BAA2B,OAAA,EAAgC;AACjE,IAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,EAAS,YAAA,EAAc,MAAA,EAAQ;AAC1C,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,OAAA,CAAQ,YAAA,CAAa,CAAC,CAAA;AAClD,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,QAAA,IAAY,OAAA,CAAQ,YAAA,IAAgB,KAAA;AAG5D,IAAA,IAAI,CAAC,WAAA,CAAY,UAAA,IAAc,CAAC,OAAA,EAAS;AACvC,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,KAAA,GAA4B,WAAA,CAAY,KAAA,EAAO,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,MAC7D,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,QAAQ,GAAI,CAAA;AAAA;AAAA,MAChC,GAAA,EAAK,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,MAAM,GAAI,CAAA;AAAA,MAC5B,YAAY,CAAA,CAAE;AAAA,KAChB,CAAE,CAAA;AAEF,IAAA,MAAM,MAAA,GAA8B;AAAA,MAClC,MAAM,WAAA,CAAY,UAAA;AAAA,MAClB,OAAA;AAAA,MACA,YAAY,WAAA,CAAY,UAAA;AAAA,MACxB,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,KAAA;AAAA,MACA,QAAA,EAAU,KAAK,MAAA,CAAO;AAAA,KACxB;AAEA,IAAA,IAAA,CAAK,iBAAiB,MAAM,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,OAAA,EAAgC;AAC1D,IAAA,IAAI,SAAA,GAAA,gBAAA;AACJ,IAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,KAAA,EAAO,OAAA,IAAW,wBAAA;AAE/C,IAAA,IAAI,YAAA,CAAa,WAAA,EAAY,CAAE,QAAA,CAAS,cAAc,CAAA,IAClD,YAAA,CAAa,WAAA,EAAY,CAAE,QAAA,CAAS,iBAAiB,CAAA,EAAG;AAC1D,MAAA,SAAA,GAAA,uBAAA;AAAA,IACF,WAAW,YAAA,CAAa,WAAA,EAAY,CAAE,QAAA,CAAS,YAAY,CAAA,EAAG;AAC5D,MAAA,SAAA,GAAA,gBAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAQ,IAAI,kBAAA;AAAA,MAChB,YAAA;AAAA,MACA,SAAA;AAAA,MAAA,UAAA;AAAA,MAEA,OAAA,CAAQ;AAAA,KACV;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,MAAA,EAAqB;AAChD,IAAA,IAAI,CAAC,IAAA,CAAK,kBAAA,IAAsB,IAAA,CAAK,kBAAA,GAAqB,KAAK,UAAA,EAAY;AACzE,MAAA,IAAA,CAAK,SAAA,EAAU;AAAA,IACjB,CAAA,MAAO;AACL,MAAA,MAAM,QAAQ,IAAI,kBAAA;AAAA,QAChB,4BAAA;AAAA,QAAA,mBAAA;AAAA,QAAA,UAAA;AAAA,OAGF;AACA,MAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,KAAA,EAAyB;AACpD,IAAA,IAAA,CAAK,iBAAA,GAAoB,KAAA;AAEzB,IAAA,IAAI,CAAC,IAAA,CAAK,kBAAA,IAAsB,IAAA,CAAK,KAAA,KAAA,QAAA,eAA+B;AAElE,MAAA,IAAI,IAAA,CAAK,kBAAA,GAAqB,IAAA,CAAK,UAAA,EAAY;AAC7C,QAAA,IAAA,CAAK,SAAA,EAAU;AAAA,MACjB,CAAA,MAAO;AACL,QAAA,MAAM,QAAQ,IAAI,kBAAA;AAAA,UAChB,CAAA,+BAAA,EAAkC,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,MAAM,MAAM,CAAA,CAAA;AAAA,UAAA,mBAAA;AAAA,UAAA,UAAA;AAAA,SAG9D;AACA,QAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAA,GAAkB;AACxB,IAAA,IAAA,CAAK,kBAAA,EAAA;AACL,IAAA,MAAM,QAAQ,eAAA,GAAkB,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,qBAAqB,CAAC,CAAA;AAEvE,IAAA,IAAA,CAAK,gBAAA,GAAmB,WAAW,YAAY;AAC7C,MAAA,IAAI;AACF,QAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,QAAA,IAAI,KAAK,WAAA,EAAa;AACpB,UAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,QAC5B;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,IAAA,CAAK,kBAAA,GAAqB,IAAA,CAAK,UAAA,EAAY;AAC7C,UAAA,IAAA,CAAK,SAAA,EAAU;AAAA,QACjB,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,YAAY,KAAc,CAAA;AAAA,QACjC;AAAA,MACF;AAAA,IACF,GAAG,KAAK,CAAA;AAAA,EACV;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAA,GAAuB;AAC7B,IAAA,IAAA,CAAK,iBAAA,GAAoB,YAAY,MAAM;AACzC,MAAA,IAAI,KAAK,MAAA,IAAU,IAAA,CAAK,MAAA,CAAO,UAAA,KAAe,UAAU,IAAA,EAAM;AAC5D,QAAA,IAAA,CAAK,MAAA,CAAO,KAAK,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,WAAA,EAAa,CAAC,CAAA;AAAA,MACxD;AAAA,IACF,GAAG,mBAAmB,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAA,GAAsB;AAC5B,IAAA,IAAI,KAAK,iBAAA,EAAmB;AAC1B,MAAA,aAAA,CAAc,KAAK,iBAAiB,CAAA;AACpC,MAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AAAA,IAC3B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,mBAAA,GAAqC;AACjD,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,MAAA,CAAO,WAAA,EAAa,UAAA,IAAc,IAAA;AAE1D,MAAA,IAAA,CAAK,WAAA,GAAc,MAAM,SAAA,CAAU,YAAA,CAAa,YAAA,CAAa;AAAA,QAC3D,KAAA,EAAO;AAAA,UACL,UAAA;AAAA,UACA,YAAA,EAAc,IAAA,CAAK,MAAA,CAAO,WAAA,EAAa,QAAA,IAAY,CAAA;AAAA,UACnD,gBAAA,EAAkB,IAAA;AAAA,UAClB,gBAAA,EAAkB,IAAA;AAAA,UAClB,eAAA,EAAiB;AAAA;AACnB,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,0BAAA;AAAA,QAAA,0BAAA;AAAA,QAAA,UAAA;AAAA,QAGA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAA,GAA6B;AACnC,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AAEvB,IAAA,MAAM,iBAAA,GAAoB,MAAA,CAAO,YAAA,IAC9B,MAAA,CAAkE,kBAAA;AAErE,IAAA,IAAA,CAAK,YAAA,GAAe,IAAI,iBAAA,CAAkB;AAAA,MACxC,UAAA,EAAY,IAAA,CAAK,MAAA,CAAO,WAAA,EAAa,UAAA,IAAc;AAAA,KACpD,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,uBAAA,CAAwB,KAAK,WAAW,CAAA;AAIzE,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,YAAA,CAAa,qBAAA,CAAsB,IAAA,EAAM,GAAG,CAAC,CAAA;AAEnE,IAAA,IAAA,CAAK,SAAA,CAAU,cAAA,GAAiB,CAAC,KAAA,KAAsC;AACrE,MAAA,IAAI,KAAK,KAAA,KAAA,QAAA,eAA+B;AAExC,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,WAAA,CAAY,cAAA,CAAe,CAAC,CAAA;AACpD,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,qBAAA,CAAsB,SAAS,CAAA;AACtD,MAAA,IAAA,CAAK,SAAA,CAAU,UAAU,MAAqB,CAAA;AAAA,IAChD,CAAA;AAEA,IAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,SAAS,CAAA;AAC7B,IAAA,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,IAAA,CAAK,YAAA,CAAa,WAAW,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAA,GAA4B;AAClC,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,IAAA,CAAK,UAAU,UAAA,EAAW;AAC1B,MAAA,IAAA,CAAK,UAAU,cAAA,GAAiB,IAAA;AAChC,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,MAAA,EAAkC;AAC9D,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAA,CAAO,MAAM,CAAA;AAC1C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AAEtC,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AAE7C,MAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,QAAS,CAAA,GAAI,KAAA;AAAA,IACtC;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAA,GAAuB;AAC7B,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,OAAO,MAAA,GAAS,IAAA;AACrB,MAAA,IAAA,CAAK,OAAO,SAAA,GAAY,IAAA;AACxB,MAAA,IAAA,CAAK,OAAO,OAAA,GAAU,IAAA;AACtB,MAAA,IAAA,CAAK,OAAO,OAAA,GAAU,IAAA;AAEtB,MAAA,IAAI,IAAA,CAAK,OAAO,UAAA,KAAe,SAAA,CAAU,QACrC,IAAA,CAAK,MAAA,CAAO,UAAA,KAAe,SAAA,CAAU,UAAA,EAAY;AACnD,QAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAAA,MACpB;AACA,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAAA,IAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAA,GAAwB;AAC9B,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,YAAY,SAAA,EAAU,CAAE,QAAQ,CAAA,KAAA,KAAS,KAAA,CAAM,MAAM,CAAA;AAC1D,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACrB;AAAA,EACF;AACF,CAAA;AAAA;AAxoBa,iBAAA,CAgCY,YAAA,GAAqC;AAAA,EAC1D,eAAA,EAAiB,IAAA;AAAA,EACjB,sBAAA,EAAwB,IAAA;AAAA,EACxB,0BAAA,EAA4B,IAAA;AAAA,EAC5B,mBAAA,EAAqB,IAAA;AAAA,EACrB,yBAAA,EAA2B,IAAA;AAAA,EAC3B,kBAAA,EAAoB;AAAA,IAClB,IAAA;AAAA,IAAM,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,OAAA;AAAA,IACjC,IAAA;AAAA,IAAM,OAAA;AAAA,IAAS,QAAA;AAAA,IACf,IAAA;AAAA,IAAM,OAAA;AAAA,IAAS,OAAA;AAAA,IACf,IAAA;AAAA,IAAM,OAAA;AAAA,IACN,IAAA;AAAA,IAAM,OAAA;AAAA,IACN,IAAA;AAAA,IAAM,OAAA;AAAA,IAAS,OAAA;AAAA,IACf,IAAA;AAAA,IAAM,OAAA;AAAA,IACN,IAAA;AAAA,IAAM,OAAA;AAAA,IACN,IAAA;AAAA,IAAM,OAAA;AAAA,IACN,IAAA;AAAA,IAAM,OAAA;AAAA,IAAS,OAAA;AAAA,IACf,IAAA;AAAA,IAAM,OAAA;AAAA,IACN,IAAA;AAAA,IAAM,OAAA;AAAA,IACN,IAAA;AAAA,IAAM,OAAA;AAAA,IACN,IAAA;AAAA,IAAM,OAAA;AAAA,IACN,IAAA;AAAA,IAAM,OAAA;AAAA,IACN,IAAA;AAAA,IAAM,OAAA;AAAA,IACN,IAAA;AAAA,IAAM,OAAA;AAAA,IACN,IAAA;AAAA,IAAM,OAAA;AAAA,IACN,IAAA;AAAA,IAAM;AAAA;AAEV,CAAA;AA3DK,IAAM,gBAAA,GAAN;;;AC7EP,IAAM,mBAAA,GAAsB,8CAAA;AAG5B,IAAM,iBAAA,GAAoB,yCAAA;AAG1B,IAAM,WAAA,GAAc,IAAA;AAGpB,IAAMC,gBAAAA,GAAkB,GAAA;AA8DjB,IAAM,mBAAA,GAAN,MAAM,mBAAA,SAA2B,eAAA,CAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,EAgDtD,YAAY,MAAA,EAAsF;AAChG,IAAA,KAAA,CAAM,EAAE,GAAG,MAAA,EAAQ,QAAA,EAAA,YAAA,mBAA4C,CAAA;AA/CjE;AAAA,IAAA,IAAA,CAAQ,MAAA,GAA2B,IAAA;AAGnC;AAAA,IAAA,IAAA,CAAQ,WAAA,GAAkC,IAAA;AAG1C;AAAA,IAAA,IAAA,CAAQ,YAAA,GAAoC,IAAA;AAG5C;AAAA,IAAA,IAAA,CAAQ,SAAA,GAAwC,IAAA;AAGhD;AAAA,IAAA,IAAA,CAAQ,YAAA,GAA8B,IAAA;AAGtC;AAAA,IAAA,IAAA,CAAQ,kBAAA,GAA6B,CAAA;AAGrC;AAAA,IAAA,IAAA,CAAiB,UAAA,GAAqB,CAAA;AAGtC;AAAA,IAAA,IAAA,CAAQ,gBAAA,GAAyD,IAAA;AAGjE;AAAA,IAAA,IAAA,CAAQ,iBAAA,GAA6B,KAAA;AAGrC;AAAA,IAAA,IAAA,CAAQ,kBAAA,GAA8B,KAAA;AAGtC;AAAA,IAAA,IAAA,CAAQ,SAAA,GAA2B,IAAA;AAAA,EAkBnC;AAAA;AAAA;AAAA;AAAA,EAKA,WAAA,GAAuB;AACrB,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,OAAO,OAAO,SAAA,KAAc,WAAA,IAAe,OAAO,KAAA,KAAU,WAAA;AAAA,IAC9D;AACA,IAAA,OAAO,CAAC,EACN,OAAO,SAAA,KAAc,WAAA,IACrB,OAAO,KAAA,KAAU,WAAA,IACjB,SAAA,CAAU,YAAA,IACV,OAAO,SAAA,CAAU,YAAA,CAAa,iBAAiB,UAAA,KAC9C,MAAA,CAAO,gBAAiB,MAAA,CAAkE,kBAAA,CAAA,CAAA;AAAA,EAE/F;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,UAAA,GAA4B;AAChC,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,MAAA,EAAQ;AACvB,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,gCAAA;AAAA,QAAA,gBAAA;AAAA,QAAA,YAAA;AAAA,OAGF;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG;AACvB,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,0DAAA;AAAA,QAAA,qBAAA;AAAA,QAAA,YAAA;AAAA,OAGF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAA,CAAA,cAAA,oBAAkC;AACvC,IAAA,IAAA,CAAK,iBAAA,GAAoB,KAAA;AACzB,IAAA,IAAA,CAAK,kBAAA,GAAqB,KAAA;AAE1B,IAAA,IAAI;AAEF,MAAA,IAAA,CAAK,YAAA,GAAe,MAAM,IAAA,CAAK,eAAA,EAAgB;AAG/C,MAAA,MAAM,KAAK,cAAA,EAAe;AAAA,IAC5B,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,YAAY,KAAc,CAAA;AAC/B,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,KAAA,GAAuB;AAC3B,IAAA,IAAI,CAAC,IAAA,CAAK,MAAA,IAAU,CAAC,KAAK,iBAAA,EAAmB;AAC3C,MAAA,MAAM,KAAK,UAAA,EAAW;AAAA,IACxB;AAEA,IAAA,IAAI,KAAK,KAAA,KAAA,QAAA,eAA+B;AACtC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,mBAAA,EAAoB;AAC/B,MAAA,IAAA,CAAK,oBAAA,EAAqB;AAC1B,MAAA,IAAA,CAAK,QAAA,CAAA,QAAA,cAA4B;AACjC,MAAA,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,IACnB,SAAS,KAAA,EAAO;AACd,MAAA,IAAA,CAAK,YAAY,KAAc,CAAA;AAC/B,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAI,IAAA,CAAK,KAAA,KAAA,SAAA,kBAAkC,IAAA,CAAK,KAAA,KAAA,MAAA,aAA6B;AAC3E,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,QAAA,CAAA,UAAA,gBAA8B;AACnC,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAG1B,IAAA,IAAA,CAAK,oBAAA,EAAqB;AAG1B,IAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,GAAG,CAAC,CAAA;AAGrD,IAAA,IAAA,CAAK,cAAA,EAAe;AAGpB,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAGzB,IAAA,IAAA,CAAK,eAAA,EAAgB;AAErB,IAAA,IAAA,CAAK,QAAA,CAAA,SAAA,eAA6B;AAClC,IAAA,IAAA,CAAK,KAAK,MAAM,CAAA;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAI,KAAK,KAAA,KAAA,QAAA,eAA+B;AACtC,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,IAAA,IAAA,CAAK,QAAA,CAAA,QAAA,cAA4B;AACjC,IAAA,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,GAAe;AACb,IAAA,IAAI,KAAK,KAAA,KAAA,QAAA,eAA+B;AACtC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,YAAA,EAAc;AACzC,MAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,IAC5B;AAEA,IAAA,IAAA,CAAK,QAAA,CAAA,QAAA,cAA4B;AACjC,IAAA,IAAA,CAAK,KAAK,QAAQ,CAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,SAAA,EAA8B;AACtC,IAAA,IAAI,IAAA,CAAK,UAAU,IAAA,CAAK,MAAA,CAAO,eAAe,SAAA,CAAU,IAAA,IAAQ,KAAK,KAAA,KAAA,QAAA,eAA+B;AAClG,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,mBAAA,CAAoB,SAAS,CAAA;AACtD,MAAA,IAAA,CAAK,iBAAiB,WAAW,CAAA;AACjC,MAAA,IAAA,CAAK,gBAAgB,SAAS,CAAA;AAAA,IAChC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAA,GAAyB;AAC7B,IAAA,IAAA,CAAK,kBAAA,GAAqB,IAAA;AAG1B,IAAA,IAAI,KAAK,gBAAA,EAAkB;AACzB,MAAA,YAAA,CAAa,KAAK,gBAAgB,CAAA;AAClC,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAAA,IAC1B;AAGA,IAAA,IAAA,CAAK,cAAA,EAAe;AAGpB,IAAA,IAAA,CAAK,mBAAA,EAAoB;AAGzB,IAAA,IAAI,KAAK,YAAA,EAAc;AACrB,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,CAAK,aAAa,KAAA,EAAM;AAAA,MAChC,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,IACtB;AAGA,IAAA,IAAA,CAAK,eAAA,EAAgB;AAGrB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,IAAA,CAAK,kBAAA,GAAqB,CAAA;AAC1B,IAAA,IAAA,CAAK,iBAAA,GAAoB,KAAA;AAGzB,IAAA,IAAA,CAAK,kBAAA,EAAmB;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKA,eAAA,GAAwC;AACtC,IAAA,OAAO,mBAAA,CAAmB,YAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAc,eAAA,GAAmC;AAC/C,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,mBAAA,EAAqB;AAAA,QAChD,MAAA,EAAQ,MAAA;AAAA,QACR,OAAA,EAAS;AAAA,UACP,eAAA,EAAiB,KAAK,MAAA,CAAO,MAAA;AAAA,UAC7B,cAAA,EAAgB;AAAA,SAClB;AAAA,QACA,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,UAAA,EAAY,MAAM;AAAA,OAC1C,CAAA;AAED,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,IAAI,QAAA,CAAS,WAAW,GAAA,EAAK;AAC3B,UAAA,MAAM,IAAI,kBAAA;AAAA,YACR,4BAAA;AAAA,YAAA,uBAAA;AAAA,YAAA,YAAA;AAAA,WAGF;AAAA,QACF;AACA,QAAA,MAAM,IAAI,kBAAA;AAAA,UACR,CAAA,6BAAA,EAAgC,SAAS,UAAU,CAAA,CAAA;AAAA,UAAA,gBAAA;AAAA,UAAA,YAAA;AAAA,SAGrD;AAAA,MACF;AAEA,MAAA,MAAM,IAAA,GAAO,MAAM,QAAA,CAAS,IAAA,EAAK;AACjC,MAAA,OAAO,IAAA,CAAK,KAAA;AAAA,IACd,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,kBAAA,EAAoB;AACvC,QAAA,MAAM,KAAA;AAAA,MACR;AACA,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,wCAAA;AAAA,QAAA,eAAA;AAAA,QAAA,YAAA;AAAA,QAGA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAAA,GAAgC;AAC5C,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,MAAA,MAAM,MAAM,CAAA,EAAG,iBAAiB,gBAAgB,WAAW,CAAA,OAAA,EAAU,KAAK,YAAY,CAAA,CAAA;AAEtF,MAAA,IAAA,CAAK,MAAA,GAAS,IAAI,SAAA,CAAU,GAAG,CAAA;AAE/B,MAAA,MAAM,iBAAA,GAAoB,WAAW,MAAM;AACzC,QAAA,MAAA,CAAO,IAAI,kBAAA;AAAA,UACT,8BAAA;AAAA,UAAA,mBAAA;AAAA,UAAA,YAAA;AAAA,SAGD,CAAA;AAAA,MACH,GAAG,GAAK,CAAA;AAER,MAAA,IAAA,CAAK,MAAA,CAAO,SAAS,MAAY;AAC/B,QAAA,YAAA,CAAa,iBAAiB,CAAA;AAC9B,QAAA,IAAA,CAAK,mBAAA,EAAoB;AACzB,QAAA,OAAA,EAAQ;AAAA,MACV,CAAA;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,SAAA,GAAY,CAAC,KAAA,KAA8B;AACrD,QAAA,IAAA,CAAK,uBAAuB,KAAK,CAAA;AAAA,MACnC,CAAA;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,OAAA,GAAU,CAAC,KAAA,KAAuB;AAC5C,QAAA,YAAA,CAAa,iBAAiB,CAAA;AAC9B,QAAA,IAAA,CAAK,qBAAqB,KAAK,CAAA;AAC/B,QAAA,MAAA,CAAO,IAAI,kBAAA;AAAA,UACT,4BAAA;AAAA,UAAA,mBAAA;AAAA,UAAA,YAAA;AAAA,SAGD,CAAA;AAAA,MACH,CAAA;AAEA,MAAA,IAAA,CAAK,MAAA,CAAO,OAAA,GAAU,CAAC,KAAA,KAA4B;AACjD,QAAA,YAAA,CAAa,iBAAiB,CAAA;AAC9B,QAAA,IAAA,CAAK,qBAAqB,KAAK,CAAA;AAAA,MACjC,CAAA;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAA,GAA4B;AAClC,IAAA,IAAA,CAAK,kBAAA,GAAqB,CAAA;AAAA,EAE5B;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,KAAA,EAA2B;AACxD,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAA6B,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,IAAc,CAAA;AAElE,MAAA,QAAQ,QAAQ,YAAA;AAAc,QAC5B,KAAK,eAAA;AACH,UAAA,IAAA,CAAK,oBAAoB,OAAO,CAAA;AAChC,UAAA;AAAA,QAEF,KAAK,mBAAA;AACH,UAAA,IAAA,CAAK,wBAAwB,OAAO,CAAA;AACpC,UAAA;AAAA,QAEF,KAAK,iBAAA;AACH,UAAA,IAAA,CAAK,sBAAsB,OAAO,CAAA;AAClC,UAAA;AAAA,QAEF,KAAK,mBAAA;AACH,UAAA,IAAA,CAAK,uBAAA,EAAwB;AAC7B,UAAA;AAAA,QAEF,KAAK,OAAA;AACH,UAAA,IAAA,CAAK,sBAAsB,OAAO,CAAA;AAClC,UAAA;AAAA;AACJ,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,uCAAuC,KAAK,CAAA;AAAA,IAC5D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,OAAA,EAAkC;AAC5D,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,UAAA,IAAc,IAAA;AACvC,IAAA,IAAA,CAAK,iBAAA,GAAoB,IAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKQ,wBAAwB,OAAA,EAAkC;AAChE,IAAA,IAAI,CAAC,QAAQ,IAAA,EAAM;AAEnB,IAAA,MAAM,MAAA,GAA8B;AAAA,MAClC,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,OAAA,EAAS,KAAA;AAAA,MACT,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,QAAA,EAAU,KAAK,MAAA,CAAO;AAAA,KACxB;AAEA,IAAA,IAAA,CAAK,iBAAiB,MAAM,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,OAAA,EAAkC;AAC9D,IAAA,IAAI,CAAC,QAAQ,IAAA,EAAM;AAGnB,IAAA,MAAM,KAAA,GAA4B,OAAA,CAAQ,KAAA,EAAO,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,MACzD,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,KAAK,CAAA,CAAE,GAAA;AAAA,MACP,YAAY,CAAA,CAAE;AAAA,KAChB,CAAE,CAAA;AAEF,IAAA,MAAM,MAAA,GAA8B;AAAA,MAClC,MAAM,OAAA,CAAQ,IAAA;AAAA,MACd,OAAA,EAAS,IAAA;AAAA,MACT,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,MACpB,KAAA;AAAA,MACA,QAAA,EAAU,KAAK,MAAA,CAAO;AAAA,KACxB;AAEA,IAAA,IAAA,CAAK,iBAAiB,MAAM,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAA,GAAgC;AACtC,IAAA,IAAA,CAAK,iBAAA,GAAoB,KAAA;AAEzB,IAAA,IAAI,CAAC,KAAK,kBAAA,EAAoB;AAC5B,MAAA,IAAA,CAAK,QAAA,CAAA,SAAA,eAA6B;AAClC,MAAA,IAAA,CAAK,KAAK,MAAM,CAAA;AAAA,IAClB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,OAAA,EAAkC;AAC9D,IAAA,IAAI,SAAA,GAAA,gBAAA;AACJ,IAAA,MAAM,YAAA,GAAe,QAAQ,KAAA,IAAS,0BAAA;AAEtC,IAAA,IAAI,YAAA,CAAa,WAAA,EAAY,CAAE,QAAA,CAAS,cAAc,CAAA,IAClD,YAAA,CAAa,WAAA,EAAY,CAAE,QAAA,CAAS,eAAe,CAAA,EAAG;AACxD,MAAA,SAAA,GAAA,uBAAA;AAAA,IACF,WAAW,YAAA,CAAa,WAAA,EAAY,CAAE,QAAA,CAAS,sBAAsB,CAAA,EAAG;AACtE,MAAA,SAAA,GAAA,gBAAA;AAAA,IACF,WAAW,YAAA,CAAa,WAAA,EAAY,CAAE,QAAA,CAAS,iBAAiB,CAAA,EAAG;AACjE,MAAA,SAAA,GAAA,iBAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAQ,IAAI,kBAAA;AAAA,MAChB,YAAA;AAAA,MACA,SAAA;AAAA,MAAA,YAAA;AAAA,MAEA;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,MAAA,EAAqB;AAChD,IAAA,IAAI,CAAC,IAAA,CAAK,kBAAA,IAAsB,IAAA,CAAK,kBAAA,GAAqB,KAAK,UAAA,EAAY;AACzE,MAAA,IAAA,CAAK,SAAA,EAAU;AAAA,IACjB,CAAA,MAAO;AACL,MAAA,MAAM,QAAQ,IAAI,kBAAA;AAAA,QAChB,4BAAA;AAAA,QAAA,mBAAA;AAAA,QAAA,YAAA;AAAA,OAGF;AACA,MAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,KAAA,EAAyB;AACpD,IAAA,IAAA,CAAK,iBAAA,GAAoB,KAAA;AAEzB,IAAA,IAAI,CAAC,IAAA,CAAK,kBAAA,IAAsB,IAAA,CAAK,KAAA,KAAA,QAAA,eAA+B;AAClE,MAAA,IAAI,IAAA,CAAK,kBAAA,GAAqB,IAAA,CAAK,UAAA,EAAY;AAC7C,QAAA,IAAA,CAAK,SAAA,EAAU;AAAA,MACjB,CAAA,MAAO;AACL,QAAA,MAAM,QAAQ,IAAI,kBAAA;AAAA,UAChB,CAAA,+BAAA,EAAkC,KAAA,CAAM,IAAI,CAAA,CAAA,EAAI,MAAM,MAAM,CAAA,CAAA;AAAA,UAAA,mBAAA;AAAA,UAAA,YAAA;AAAA,SAG9D;AACA,QAAA,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,SAAA,GAAkB;AACxB,IAAA,IAAA,CAAK,kBAAA,EAAA;AACL,IAAA,MAAM,QAAQA,gBAAAA,GAAkB,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,qBAAqB,CAAC,CAAA;AAEvE,IAAA,IAAA,CAAK,gBAAA,GAAmB,WAAW,YAAY;AAC7C,MAAA,IAAI;AAEF,QAAA,IAAA,CAAK,YAAA,GAAe,MAAM,IAAA,CAAK,eAAA,EAAgB;AAC/C,QAAA,MAAM,KAAK,cAAA,EAAe;AAC1B,QAAA,IAAI,KAAK,WAAA,EAAa;AACpB,UAAA,IAAA,CAAK,oBAAA,EAAqB;AAAA,QAC5B;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,IAAA,CAAK,kBAAA,GAAqB,IAAA,CAAK,UAAA,EAAY;AAC7C,UAAA,IAAA,CAAK,SAAA,EAAU;AAAA,QACjB,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,YAAY,KAAc,CAAA;AAAA,QACjC;AAAA,MACF;AAAA,IACF,GAAG,KAAK,CAAA;AAAA,EACV;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,mBAAA,GAAqC;AACjD,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,WAAA,GAAc,MAAM,SAAA,CAAU,YAAA,CAAa,YAAA,CAAa;AAAA,QAC3D,KAAA,EAAO;AAAA,UACL,UAAA,EAAY,WAAA;AAAA,UACZ,YAAA,EAAc,CAAA;AAAA,UACd,gBAAA,EAAkB,IAAA;AAAA,UAClB,gBAAA,EAAkB,IAAA;AAAA,UAClB,eAAA,EAAiB;AAAA;AACnB,OACD,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,0BAAA;AAAA,QAAA,0BAAA;AAAA,QAAA,YAAA;AAAA,QAGA;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAA,GAA6B;AACnC,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AAEvB,IAAA,MAAM,iBAAA,GAAoB,MAAA,CAAO,YAAA,IAC9B,MAAA,CAAkE,kBAAA;AAErE,IAAA,IAAA,CAAK,eAAe,IAAI,iBAAA,CAAkB,EAAE,UAAA,EAAY,aAAa,CAAA;AAErE,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,YAAA,CAAa,uBAAA,CAAwB,KAAK,WAAW,CAAA;AAGzE,IAAA,IAAA,CAAK,YAAY,IAAA,CAAK,YAAA,CAAa,qBAAA,CAAsB,IAAA,EAAM,GAAG,CAAC,CAAA;AAEnE,IAAA,IAAA,CAAK,SAAA,CAAU,cAAA,GAAiB,CAAC,KAAA,KAAsC;AACrE,MAAA,IAAI,KAAK,KAAA,KAAA,QAAA,eAA+B;AAExC,MAAA,MAAM,SAAA,GAAY,KAAA,CAAM,WAAA,CAAY,cAAA,CAAe,CAAC,CAAA;AACpD,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,qBAAA,CAAsB,SAAS,CAAA;AACpD,MAAA,IAAA,CAAK,UAAU,OAAO,CAAA;AAAA,IACxB,CAAA;AAEA,IAAA,MAAA,CAAO,OAAA,CAAQ,KAAK,SAAS,CAAA;AAC7B,IAAA,IAAA,CAAK,SAAA,CAAU,OAAA,CAAQ,IAAA,CAAK,YAAA,CAAa,WAAW,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAA,GAA4B;AAClC,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,IAAA,CAAK,UAAU,UAAA,EAAW;AAC1B,MAAA,IAAA,CAAK,UAAU,cAAA,GAAiB,IAAA;AAChC,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,IACnB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,sBAAsB,YAAA,EAAyC;AACrE,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,YAAA,CAAa,MAAM,CAAA;AAChD,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAE5C,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,EAAG,YAAA,CAAa,CAAC,CAAC,CAAC,CAAA;AAEnD,MAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,QAAS,CAAA,GAAI,KAAA;AAAA,IACtC;AACA,IAAA,OAAO,KAAA,CAAM,MAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAoB,WAAA,EAAkC;AAC5D,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,WAAW,CAAA;AACxC,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,YAAY,CAAA,EAAA,EAAK;AACzC,MAAA,MAAA,IAAU,MAAA,CAAO,YAAA,CAAa,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,IACxC;AACA,IAAA,OAAO,KAAK,MAAM,CAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,WAAA,EAA2B;AAClD,IAAA,IAAI,KAAK,MAAA,IAAU,IAAA,CAAK,MAAA,CAAO,UAAA,KAAe,UAAU,IAAA,EAAM;AAC5D,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,IAAA,CAAK,SAAA,CAAU,EAAE,UAAA,EAAY,WAAA,EAAa,CAAC,CAAA;AAAA,IAC9D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,oBAAA,GAA6B;AACnC,IAAA,IAAI,KAAK,MAAA,IAAU,IAAA,CAAK,MAAA,CAAO,UAAA,KAAe,UAAU,IAAA,EAAM;AAC5D,MAAA,IAAA,CAAK,MAAA,CAAO,KAAK,IAAA,CAAK,SAAA,CAAU,EAAE,iBAAA,EAAmB,IAAA,EAAM,CAAC,CAAA;AAAA,IAC9D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAA,GAAuB;AAC7B,IAAA,IAAI,KAAK,MAAA,EAAQ;AACf,MAAA,IAAA,CAAK,OAAO,MAAA,GAAS,IAAA;AACrB,MAAA,IAAA,CAAK,OAAO,SAAA,GAAY,IAAA;AACxB,MAAA,IAAA,CAAK,OAAO,OAAA,GAAU,IAAA;AACtB,MAAA,IAAA,CAAK,OAAO,OAAA,GAAU,IAAA;AAEtB,MAAA,IAAI,IAAA,CAAK,OAAO,UAAA,KAAe,SAAA,CAAU,QACrC,IAAA,CAAK,MAAA,CAAO,UAAA,KAAe,SAAA,CAAU,UAAA,EAAY;AACnD,QAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAAA,MACpB;AACA,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAAA,IAChB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAA,GAAwB;AAC9B,IAAA,IAAI,KAAK,WAAA,EAAa;AACpB,MAAA,IAAA,CAAK,YAAY,SAAA,EAAU,CAAE,QAAQ,CAAA,KAAA,KAAS,KAAA,CAAM,MAAM,CAAA;AAC1D,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,IACrB;AAAA,EACF;AACF,CAAA;AAAA;AArpBa,mBAAA,CAmCY,YAAA,GAAqC;AAAA,EAC1D,eAAA,EAAiB,IAAA;AAAA,EACjB,sBAAA,EAAwB,IAAA;AAAA,EACxB,0BAAA,EAA4B,IAAA;AAAA,EAC5B,mBAAA,EAAqB,IAAA;AAAA,EACrB,yBAAA,EAA2B,KAAA;AAAA,EAC3B,kBAAA,EAAoB,CAAC,IAAA,EAAM,OAAA,EAAS,SAAS,OAAO;AACtD,CAAA;AA1CK,IAAM,kBAAA,GAAN;;;AClFA,IAAM,iBAAN,MAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM1B,OAAO,sBAAsB,MAAA,EAAkC;AAC7D,IAAA,MAAM,KAAA,GAAQ,IAAI,UAAA,CAAW,MAAA,CAAO,MAAM,CAAA;AAC1C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,IAAI,CAAA,EAAG,MAAA,CAAO,CAAC,CAAC,CAAC,CAAA;AAC7C,MAAA,KAAA,CAAM,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,QAAS,CAAA,GAAI,KAAA;AAAA,IACtC;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,sBAAsB,MAAA,EAAkC;AAC7D,IAAA,MAAM,OAAA,GAAU,IAAI,YAAA,CAAa,MAAA,CAAO,MAAM,CAAA;AAC9C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,MAAA,OAAA,CAAQ,CAAC,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,GAAI,KAAA;AAAA,IAC3B;AACA,IAAA,OAAO,OAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,cAAA,CAAe,MAAA,EAAsB,QAAA,EAAkB,MAAA,EAA8B;AAC1F,IAAA,IAAI,aAAa,MAAA,EAAQ;AACvB,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,QAAQ,MAAA,GAAS,QAAA;AACvB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,SAAS,KAAK,CAAA;AAClD,IAAA,MAAM,MAAA,GAAS,IAAI,YAAA,CAAa,SAAS,CAAA;AAEzC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,EAAW,CAAA,EAAA,EAAK;AAClC,MAAA,MAAM,cAAc,CAAA,GAAI,KAAA;AACxB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,WAAW,CAAA;AACvC,MAAA,MAAM,WAAW,WAAA,GAAc,QAAA;AAE/B,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAQ,CAAA,IAAK,CAAA;AACpC,MAAA,MAAM,OAAA,GAAU,MAAA,CAAO,QAAA,GAAW,CAAC,CAAA,IAAK,OAAA;AAExC,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,OAAA,GAAA,CAAW,OAAA,GAAU,OAAA,IAAW,QAAA;AAAA,IAC9C;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,gBAAA,CAAiB,MAAA,EAAsB,QAAA,EAAkB,MAAA,EAA8B;AAC5F,IAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,QAAQ,QAAA,GAAW,MAAA;AACzB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,SAAS,KAAK,CAAA;AACjD,IAAA,MAAM,MAAA,GAAS,IAAI,YAAA,CAAa,SAAS,CAAA;AAEzC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,EAAW,CAAA,EAAA,EAAK;AAClC,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,CAAA,GAAI,KAAK,CAAA;AACrC,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAA,CAAO,IAAI,CAAA,IAAK,KAAK,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA;AAElE,MAAA,IAAI,GAAA,GAAM,CAAA;AACV,MAAA,MAAM,QAAQ,MAAA,GAAS,QAAA;AACvB,MAAA,KAAA,IAAS,CAAA,GAAI,QAAA,EAAU,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AACtC,QAAA,GAAA,IAAO,OAAO,CAAC,CAAA;AAAA,MACjB;AACA,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,KAAA,GAAQ,CAAA,GAAI,MAAM,KAAA,GAAQ,CAAA;AAAA,IACxC;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,cAAA,CAAe,MAAA,EAAsB,QAAA,EAAkB,MAAA,EAA8B;AAC1F,IAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,MAAA,EAAQ,QAAA,EAAU,MAAM,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,gBAAgB,MAAA,EAAoC;AACzD,IAAA,IAAI,IAAA,GAAO,CAAA;AACX,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,CAAC,CAAC,CAAA;AAC9B,MAAA,IAAI,GAAA,GAAM,MAAM,IAAA,GAAO,GAAA;AAAA,IACzB;AAEA,IAAA,IAAI,SAAS,CAAA,EAAG;AACd,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAAS,IAAI,YAAA,CAAa,MAAA,CAAO,MAAM,CAAA;AAC7C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,GAAI,IAAA;AAAA,IAC1B;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,SAAA,CAAU,MAAA,EAAsB,IAAA,EAA4B;AACjE,IAAA,MAAM,MAAA,GAAS,IAAI,YAAA,CAAa,MAAA,CAAO,MAAM,CAAA;AAC7C,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAA,CAAO,CAAC,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,IACxD;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,OAAO,UAAA,CAAW,OAAA,EAAuB,OAAA,EAAuB,QAAgB,GAAA,EAAmB;AACjG,IAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,QAAQ,MAAM,CAAA;AACtD,IAAA,MAAM,MAAA,GAAS,IAAI,YAAA,CAAa,MAAM,CAAA;AAEtC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,KAAK,CAAA,GAAI,OAAA,CAAQ,MAAA,GAAS,OAAA,CAAQ,CAAC,CAAA,GAAI,CAAA;AAC7C,MAAA,MAAM,KAAK,CAAA,GAAI,OAAA,CAAQ,MAAA,GAAS,OAAA,CAAQ,CAAC,CAAA,GAAI,CAAA;AAC7C,MAAA,MAAA,CAAO,CAAC,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,EAAA,IAAM,CAAA,GAAI,KAAA,CAAA,GAAS,EAAA,GAAK,KAAK,CAAC,CAAA;AAAA,IACrE;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,WAAA,CAAY,WAAA,EAA0B,UAAA,EAAkC;AAC7E,IAAA,MAAM,UAAA,GAAa,cAAc,WAAA,CAAY,UAAA;AAC7C,IAAA,MAAM,WAAW,WAAA,CAAY,gBAAA;AAC7B,IAAA,MAAM,QAAA,GAAW,EAAA;AAGjB,IAAA,MAAM,UAAA,GAAa,WAAA,CAAY,cAAA,CAAe,CAAC,CAAA;AAG/C,IAAA,MAAM,WAAA,GAAc,UAAA,KAAe,WAAA,CAAY,UAAA,GAC3C,IAAA,CAAK,cAAA,CAAe,UAAA,EAAY,WAAA,CAAY,UAAA,EAAY,UAAU,CAAA,GAClE,IAAI,aAAa,UAAU,CAAA;AAG/B,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,qBAAA,CAAsB,WAAW,CAAA;AAGxD,IAAA,MAAM,UAAA,GAAa,SAAA,CAAU,MAAA,IAAU,QAAA,GAAW,CAAA,CAAA;AAClD,IAAA,MAAM,SAAS,IAAA,CAAK,eAAA,CAAgB,UAAA,EAAY,UAAA,EAAY,UAAU,QAAQ,CAAA;AAG9E,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAY,EAAA,GAAK,UAAU,CAAA;AAC3C,IAAA,MAAM,IAAA,GAAO,IAAI,QAAA,CAAS,GAAG,CAAA;AAG7B,IAAA,MAAM,UAAA,GAAa,IAAI,QAAA,CAAS,MAAM,CAAA;AACtC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,MAAA,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,UAAA,CAAW,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,IACzC;AAGA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,IAAA,CAAK,SAAS,EAAA,GAAK,CAAA,GAAI,GAAG,SAAA,CAAU,CAAC,GAAG,IAAI,CAAA;AAAA,IAC9C;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OAAO,eAAA,CAAgB,UAAA,EAAoB,UAAA,EAAoB,UAAkB,QAAA,EAA+B;AAC9G,IAAA,MAAM,MAAA,GAAS,IAAI,WAAA,CAAY,EAAE,CAAA;AACjC,IAAA,MAAM,IAAA,GAAO,IAAI,QAAA,CAAS,MAAM,CAAA;AAEhC,IAAA,MAAM,QAAA,GAAW,UAAA,GAAa,QAAA,IAAY,QAAA,GAAW,CAAA,CAAA;AACrD,IAAA,MAAM,UAAA,GAAa,YAAY,QAAA,GAAW,CAAA,CAAA;AAG1C,IAAA,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,CAAA,EAAG,MAAM,CAAA;AAChC,IAAA,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,EAAA,GAAK,UAAA,EAAY,IAAI,CAAA;AACvC,IAAA,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,CAAA,EAAG,MAAM,CAAA;AAGhC,IAAA,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,EAAA,EAAI,MAAM,CAAA;AACjC,IAAA,IAAA,CAAK,SAAA,CAAU,EAAA,EAAI,EAAA,EAAI,IAAI,CAAA;AAC3B,IAAA,IAAA,CAAK,SAAA,CAAU,EAAA,EAAI,CAAA,EAAG,IAAI,CAAA;AAC1B,IAAA,IAAA,CAAK,SAAA,CAAU,EAAA,EAAI,QAAA,EAAU,IAAI,CAAA;AACjC,IAAA,IAAA,CAAK,SAAA,CAAU,EAAA,EAAI,UAAA,EAAY,IAAI,CAAA;AACnC,IAAA,IAAA,CAAK,SAAA,CAAU,EAAA,EAAI,QAAA,EAAU,IAAI,CAAA;AACjC,IAAA,IAAA,CAAK,SAAA,CAAU,EAAA,EAAI,UAAA,EAAY,IAAI,CAAA;AACnC,IAAA,IAAA,CAAK,SAAA,CAAU,EAAA,EAAI,QAAA,EAAU,IAAI,CAAA;AAGjC,IAAA,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,EAAA,EAAI,MAAM,CAAA;AACjC,IAAA,IAAA,CAAK,SAAA,CAAU,EAAA,EAAI,UAAA,EAAY,IAAI,CAAA;AAEnC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAe,WAAA,CAAY,IAAA,EAAgB,MAAA,EAAgB,MAAA,EAAsB;AAC/E,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,MAAA,IAAA,CAAK,SAAS,MAAA,GAAS,CAAA,EAAG,MAAA,CAAO,UAAA,CAAW,CAAC,CAAC,CAAA;AAAA,IAChD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,YAAA,CAAa,OAAA,EAAuB,UAAA,EAAiC;AAC1E,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,qBAAA,CAAsB,OAAO,CAAA;AACpD,IAAA,MAAM,UAAA,GAAa,UAAU,MAAA,GAAS,CAAA;AACtC,IAAA,MAAM,SAAS,IAAA,CAAK,eAAA,CAAgB,UAAA,EAAY,UAAA,EAAY,GAAG,EAAE,CAAA;AAEjE,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAY,EAAA,GAAK,UAAU,CAAA;AAC3C,IAAA,MAAM,IAAA,GAAO,IAAI,QAAA,CAAS,GAAG,CAAA;AAG7B,IAAA,MAAM,UAAA,GAAa,IAAI,QAAA,CAAS,MAAM,CAAA;AACtC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,MAAA,IAAA,CAAK,QAAA,CAAS,CAAA,EAAG,UAAA,CAAW,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,IACzC;AAGA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,SAAA,CAAU,QAAQ,CAAA,EAAA,EAAK;AACzC,MAAA,IAAA,CAAK,SAAS,EAAA,GAAK,CAAA,GAAI,GAAG,SAAA,CAAU,CAAC,GAAG,IAAI,CAAA;AAAA,IAC9C;AAEA,IAAA,OAAO,GAAA;AAAA,EACT;AACF;;;ACtQO,IAAM,wBAAN,MAA4B;AAAA;AAAA;AAAA;AAAA;AAAA,EAyCjC,WAAA,CAAY,OAAA,GAAsB,EAAC,EAAG;AA9BtC;AAAA,IAAA,IAAA,CAAQ,gBAA0B,EAAC;AAMnC;AAAA,IAAA,IAAA,CAAQ,UAAA,GAAsB,KAAA;AAG9B;AAAA,IAAA,IAAA,CAAQ,eAAA,GAAiC,IAAA;AAGzC;AAAA,IAAA,IAAA,CAAQ,gBAAA,GAAkC,IAAA;AAY1C;AAAA,IAAA,IAAA,CAAQ,eAAA,GAA0B,CAAA;AAOhC,IAAA,IAAA,CAAK,SAAA,GAAY,QAAQ,SAAA,IAAa,IAAA;AACtC,IAAA,IAAA,CAAK,iBAAA,GAAoB,QAAQ,iBAAA,IAAqB,GAAA;AACtD,IAAA,IAAA,CAAK,kBAAA,GAAqB,QAAQ,kBAAA,IAAsB,GAAA;AACxD,IAAA,IAAA,CAAK,WAAA,GAAc,QAAQ,WAAA,IAAe,EAAA;AAC1C,IAAA,IAAA,CAAK,gBAAgB,OAAA,CAAQ,aAAA;AAC7B,IAAA,IAAA,CAAK,cAAc,OAAA,CAAQ,WAAA;AAC3B,IAAA,IAAA,CAAK,iBAAiB,OAAA,CAAQ,cAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,SAAA,EAAkC;AAC7C,IAAA,MAAM,WAAA,GAAc,KAAK,GAAA,EAAI;AAC7B,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,kBAAA,CAAmB,SAAS,CAAA;AAGhD,IAAA,IAAA,CAAK,aAAA,CAAc,KAAK,MAAM,CAAA;AAC9B,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,MAAA,GAAS,IAAA,CAAK,WAAA,EAAa;AAChD,MAAA,IAAA,CAAK,cAAc,KAAA,EAAM;AAAA,IAC3B;AAGA,IAAA,IAAI,KAAK,cAAA,EAAgB;AACvB,MAAA,IAAA,CAAK,eAAe,MAAM,CAAA;AAAA,IAC5B;AAGA,IAAA,MAAM,gBAAA,GAAmB,SAAS,IAAA,CAAK,SAAA;AAEvC,IAAA,IAAI,gBAAA,EAAkB;AAEpB,MAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AAExB,MAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,QAAA,IAAI,IAAA,CAAK,oBAAoB,IAAA,EAAM;AACjC,UAAA,IAAA,CAAK,eAAA,GAAkB,WAAA;AAAA,QACzB,CAAA,MAAA,IAAW,WAAA,GAAc,IAAA,CAAK,eAAA,IAAmB,KAAK,iBAAA,EAAmB;AAEvE,UAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,UAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,UAAA,IAAI,KAAK,aAAA,EAAe;AACtB,YAAA,IAAA,CAAK,aAAA,EAAc;AAAA,UACrB;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AAEvB,MAAA,IAAI,KAAK,UAAA,EAAY;AACnB,QAAA,IAAI,IAAA,CAAK,qBAAqB,IAAA,EAAM;AAClC,UAAA,IAAA,CAAK,gBAAA,GAAmB,WAAA;AAAA,QAC1B,CAAA,MAAA,IAAW,WAAA,GAAc,IAAA,CAAK,gBAAA,IAAoB,KAAK,kBAAA,EAAoB;AAEzE,UAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,UAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,UAAA,IAAI,KAAK,WAAA,EAAa;AACpB,YAAA,IAAA,CAAK,WAAA,EAAY;AAAA,UACnB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,eAAA,GAAkB,WAAA;AACvB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,mBAAmB,MAAA,EAA8B;AAC/C,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,MAAA,GAAA,IAAO,MAAA,CAAO,CAAC,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA;AAAA,IAC7B;AACA,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,MAAA,CAAO,MAAM,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,0BAAA,GAAqC;AACnC,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,MAAA,KAAW,CAAA,EAAG;AACnC,MAAA,OAAO,IAAA,CAAK,SAAA;AAAA,IACd;AAEA,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,IAAA,CAAK,aAAA,CAAc,MAAA;AACnF,IAAA,OAAO,UAAU,GAAA,GAAM,IAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,gBAAgB,EAAC;AACtB,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA;AAClB,IAAA,IAAA,CAAK,eAAA,GAAkB,IAAA;AACvB,IAAA,IAAA,CAAK,gBAAA,GAAmB,IAAA;AACxB,IAAA,IAAA,CAAK,eAAA,GAAkB,CAAA;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,SAAA,EAAyB;AACpC,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,SAAS,CAAC,CAAA;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAA,GAA2B;AACzB,IAAA,IAAI,IAAA,CAAK,aAAA,CAAc,MAAA,KAAW,CAAA,EAAG;AACnC,MAAA,OAAO,CAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAA,EAAG,CAAC,CAAA,GAAI,IAAA,CAAK,aAAA,CAAc,MAAA;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAA,GAA4B;AAC1B,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAa,SAAA,EAIJ;AACP,IAAA,IAAI,SAAA,CAAU,kBAAkB,MAAA,EAAW;AACzC,MAAA,IAAA,CAAK,gBAAgB,SAAA,CAAU,aAAA;AAAA,IACjC;AACA,IAAA,IAAI,SAAA,CAAU,gBAAgB,MAAA,EAAW;AACvC,MAAA,IAAA,CAAK,cAAc,SAAA,CAAU,WAAA;AAAA,IAC/B;AACA,IAAA,IAAI,SAAA,CAAU,mBAAmB,MAAA,EAAW;AAC1C,MAAA,IAAA,CAAK,iBAAiB,SAAA,CAAU,cAAA;AAAA,IAClC;AAAA,EACF;AACF;;;ACtNO,IAAM,oBAAN,MAAwB;AAAA;AAAA;AAAA;AAAA;AAAA,EAiB7B,WAAA,CAAY,OAAA,GAAoC,EAAC,EAAG;AAZpD;AAAA,IAAA,IAAA,CAAQ,YAAA,GAAuB,CAAA;AAG/B;AAAA,IAAA,IAAA,CAAQ,SAAA,GAAoB,CAAA;AAU1B,IAAA,IAAA,CAAK,eAAA,GAAkB,QAAQ,eAAA,IAAmB,GAAA;AAClD,IAAA,IAAA,CAAK,gBAAgB,OAAA,CAAQ,aAAA;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,SAAA,EAAiC;AAC5C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,cAAA,CAAe,SAAS,CAAA;AAGlD,IAAA,IAAA,CAAK,eAAe,IAAA,CAAK,eAAA,GAAkB,KAAK,YAAA,GAAA,CAAgB,CAAA,GAAI,KAAK,eAAA,IAAmB,YAAA;AAG5F,IAAA,IAAI,IAAA,CAAK,YAAA,GAAe,IAAA,CAAK,SAAA,EAAW;AACtC,MAAA,IAAA,CAAK,YAAY,IAAA,CAAK,YAAA;AAAA,IACxB;AAGA,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,IAAA,CAAK,aAAA,CAAc,KAAK,YAAY,CAAA;AAAA,IACtC;AAEA,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAe,MAAA,EAA8B;AAC3C,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,MAAA,GAAA,IAAO,MAAA,CAAO,CAAC,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA;AAAA,IAC7B;AACA,IAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,MAAA,CAAO,MAAM,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,YAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,YAAA,GAAe,CAAA;AACpB,IAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,SAAA,GAAkB;AAChB,IAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAA,GAAsB;AACpB,IAAA,IAAI,IAAA,CAAK,gBAAgB,CAAA,EAAG;AAC1B,MAAA,OAAO,CAAA,QAAA;AAAA,IACT;AACA,IAAA,OAAO,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,YAAY,CAAA;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,WAAW,KAAA,EAAuB;AACvC,IAAA,IAAI,SAAS,CAAA,EAAG;AACd,MAAA,OAAO,CAAA,QAAA;AAAA,IACT;AACA,IAAA,OAAO,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAO,aAAa,EAAA,EAAoB;AACtC,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAA,GAAK,EAAE,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,mBAAmB,MAAA,EAAsB;AACvC,IAAA,IAAA,CAAK,eAAA,GAAkB,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,GAAA,CAAI,CAAA,EAAG,MAAM,CAAC,CAAA;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAA,GAA6B;AAC3B,IAAA,OAAO,IAAA,CAAK,eAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBAAiB,QAAA,EAAuD;AACtE,IAAA,IAAA,CAAK,aAAA,GAAgB,QAAA;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAA,GAA6B;AAC3B,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,eAAe,GAAG,CAAA;AAAA,EAC9C;AACF;;;AClKO,IAAM,qBAAN,MAAyB;AAAA;AAAA;AAAA;AAAA;AAAA,EAoB9B,WAAA,CAAY,aAAqB,GAAA,EAAK;AAftC;AAAA,IAAA,IAAA,CAAQ,SAAyB,EAAC;AAGlC;AAAA,IAAA,IAAA,CAAQ,UAAA,GAAqB,CAAA;AAG7B;AAAA,IAAA,IAAA,CAAQ,SAAA,GAAoB,CAAA;AAG5B;AAAA,IAAA,IAAA,CAAQ,KAAA,GAAgB,CAAA;AAOtB,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAClB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,KAAA,CAAM,UAAU,CAAA;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAA,EAA2B;AAE/B,IAAA,IAAA,CAAK,OAAO,IAAA,CAAK,UAAU,CAAA,GAAI,IAAI,aAAa,KAAK,CAAA;AACrD,IAAA,IAAA,CAAK,UAAA,GAAA,CAAc,IAAA,CAAK,UAAA,GAAa,CAAA,IAAK,IAAA,CAAK,UAAA;AAE/C,IAAA,IAAI,IAAA,CAAK,KAAA,GAAQ,IAAA,CAAK,UAAA,EAAY;AAChC,MAAA,IAAA,CAAK,KAAA,EAAA;AAAA,IACP,CAAA,MAAO;AAEL,MAAA,IAAA,CAAK,SAAA,GAAA,CAAa,IAAA,CAAK,SAAA,GAAY,CAAA,IAAK,IAAA,CAAK,UAAA;AAAA,IAC/C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,SAAA,EAAoC;AACvC,IAAA,MAAM,MAAA,GAAS,cAAc,MAAA,GAAY,IAAA,CAAK,IAAI,SAAA,EAAW,IAAA,CAAK,KAAK,CAAA,GAAI,IAAA,CAAK,KAAA;AAChF,IAAA,MAAM,SAAyB,EAAC;AAEhC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA;AACxC,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,MACnB;AACA,MAAA,IAAA,CAAK,SAAA,GAAA,CAAa,IAAA,CAAK,SAAA,GAAY,CAAA,IAAK,IAAA,CAAK,UAAA;AAAA,IAC/C;AAEA,IAAA,IAAA,CAAK,KAAA,IAAS,MAAA;AACd,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,SAAA,EAAoC;AACvC,IAAA,MAAM,MAAA,GAAS,cAAc,MAAA,GAAY,IAAA,CAAK,IAAI,SAAA,EAAW,IAAA,CAAK,KAAK,CAAA,GAAI,IAAA,CAAK,KAAA;AAChF,IAAA,MAAM,SAAyB,EAAC;AAEhC,IAAA,IAAI,MAAM,IAAA,CAAK,SAAA;AACf,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,EAAQ,CAAA,EAAA,EAAK;AAC/B,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAC7B,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,MAAA,CAAO,KAAK,KAAK,CAAA;AAAA,MACnB;AACA,MAAA,GAAA,GAAA,CAAO,GAAA,GAAM,KAAK,IAAA,CAAK,UAAA;AAAA,IACzB;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,KAAA,CAAM,IAAA,CAAK,UAAU,CAAA;AACvC,IAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAClB,IAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AACjB,IAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AAAA,EACf;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAA,GAA6B;AAC3B,IAAA,OAAO,IAAA,CAAK,KAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAA,GAAkB;AAChB,IAAA,OAAO,IAAA,CAAK,SAAS,IAAA,CAAK,UAAA;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAA,GAAmB;AACjB,IAAA,OAAO,KAAK,KAAA,KAAU,CAAA;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,kBAAkB,MAAA,EAAsC;AACtD,IAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,MAAA,OAAO,IAAI,aAAa,CAAC,CAAA;AAAA,IAC3B;AAEA,IAAA,MAAM,WAAA,GAAc,OAAO,MAAA,CAAO,CAAC,KAAK,KAAA,KAAU,GAAA,GAAM,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AACvE,IAAA,MAAM,MAAA,GAAS,IAAI,YAAA,CAAa,WAAW,CAAA;AAE3C,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAA,CAAO,GAAA,CAAI,OAAO,MAAM,CAAA;AACxB,MAAA,MAAA,IAAU,KAAA,CAAM,MAAA;AAAA,IAClB;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAA,GAAuB;AACrB,IAAA,MAAM,MAAA,GAAS,KAAK,IAAA,EAAK;AACzB,IAAA,OAAO,IAAA,CAAK,kBAAkB,MAAM,CAAA;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAA,GAA0B;AACxB,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,IAAI,MAAM,IAAA,CAAK,SAAA;AACf,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,OAAO,CAAA,EAAA,EAAK;AACnC,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAC7B,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,KAAA,IAAS,KAAA,CAAM,MAAA;AAAA,MACjB;AACA,MAAA,GAAA,GAAA,CAAO,GAAA,GAAM,KAAK,IAAA,CAAK,UAAA;AAAA,IACzB;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAO,OAAA,EAAuB;AAC5B,IAAA,IAAI,OAAA,KAAY,KAAK,UAAA,EAAY;AAEjC,IAAA,MAAM,MAAA,GAAS,KAAK,IAAA,EAAK;AACzB,IAAA,IAAA,CAAK,UAAA,GAAa,OAAA;AAClB,IAAA,IAAA,CAAK,MAAA,GAAS,IAAI,KAAA,CAAM,OAAO,CAAA;AAC/B,IAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAClB,IAAA,IAAA,CAAK,SAAA,GAAY,CAAA;AACjB,IAAA,IAAA,CAAK,KAAA,GAAQ,CAAA;AAGb,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,KAAA,CAAM,CAAC,OAAO,CAAA,EAAG;AAC1C,MAAA,IAAA,CAAK,MAAM,KAAK,CAAA;AAAA,IAClB;AAAA,EACF;AACF;;;AC3LO,IAAM,gBAAN,MAAoB;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBzB,WAAA,CAAY,aAAqB,IAAA,EAAO;AAfxC;AAAA,IAAA,IAAA,CAAQ,cAA8B,EAAC;AAMvC;AAAA,IAAA,IAAA,CAAQ,WAAA,GAAuB,KAAA;AAG/B;AAAA,IAAA,IAAA,CAAQ,SAAA,GAA2B,IAAA;AAOjC,IAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,cAAc,EAAC;AACpB,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,IAAA,IAAA,CAAK,SAAA,GAAY,KAAK,GAAA,EAAI;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAY,SAAA,EAA+B;AACzC,IAAA,IAAI,KAAK,WAAA,EAAa;AAEpB,MAAA,IAAA,CAAK,WAAA,CAAY,IAAA,CAAK,IAAI,YAAA,CAAa,SAAS,CAAC,CAAA;AAAA,IACnD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAA,GAAqB;AACnB,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,IAAA,OAAO,KAAK,gBAAA,EAAiB;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,cAAc,EAAC;AACpB,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAA,CAAO,SAAsB,KAAA,EAAoB;AAC/C,IAAA,MAAM,SAAA,GAAY,KAAK,gBAAA,EAAiB;AAExC,IAAA,IAAI,WAAW,KAAA,EAAO;AACpB,MAAA,OAAO,SAAA,CAAU,MAAA;AAAA,IACnB;AAGA,IAAA,OAAO,cAAA,CAAe,YAAA,CAAa,SAAA,EAAW,IAAA,CAAK,UAAU,CAAA;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,WAAA,GAAsB;AACpB,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,CAAC,KAAK,KAAA,KAAU,GAAA,GAAM,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AAClF,IAAA,OAAO,eAAe,IAAA,CAAK,UAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAA,GAAwB;AACtB,IAAA,OAAO,KAAK,WAAA,CAAY,MAAA;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,WAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAA,GAAwB;AACtB,IAAA,OAAO,IAAA,CAAK,UAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAc,UAAA,EAA0B;AACtC,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,IAAA,CAAK,UAAA,GAAa,UAAA;AAAA,IACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,eAAA,GAA0B;AACxB,IAAA,OAAO,IAAA,CAAK,YAAY,MAAA,CAAO,CAAC,KAAK,KAAA,KAAU,GAAA,GAAM,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AAAA,EACtE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,YAAA,GAA8B;AAC5B,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,cAAA,GAAyB;AACvB,IAAA,IAAI,CAAC,IAAA,CAAK,SAAA,EAAW,OAAO,CAAA;AAC5B,IAAA,OAAO,IAAA,CAAK,GAAA,EAAI,GAAI,IAAA,CAAK,SAAA;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,gBAAA,GAAiC;AACvC,IAAA,IAAI,IAAA,CAAK,WAAA,CAAY,MAAA,KAAW,CAAA,EAAG;AACjC,MAAA,OAAO,IAAI,aAAa,CAAC,CAAA;AAAA,IAC3B;AAEA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,MAAA,CAAO,CAAC,KAAK,KAAA,KAAU,GAAA,GAAM,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA;AACjF,IAAA,MAAM,QAAA,GAAW,IAAI,YAAA,CAAa,WAAW,CAAA;AAE7C,IAAA,IAAI,MAAA,GAAS,CAAA;AACb,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,WAAA,EAAa;AACpC,MAAA,QAAA,CAAS,GAAA,CAAI,OAAO,MAAM,CAAA;AAC1B,MAAA,MAAA,IAAU,KAAA,CAAM,MAAA;AAAA,IAClB;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAA,CAAO,SAAsB,KAAA,EAAa;AACxC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AACjC,IAAA,MAAM,QAAA,GAAW,MAAA,KAAW,KAAA,GAAQ,WAAA,GAAc,0BAAA;AAClD,IAAA,OAAO,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,IAAA,EAAM,UAAU,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,SAAA,CAAU,SAAsB,KAAA,EAAe;AAC7C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA;AAC/B,IAAA,OAAO,GAAA,CAAI,gBAAgB,IAAI,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAA,CAAS,QAAA,GAAmB,WAAA,EAAa,MAAA,GAAsB,KAAA,EAAa;AAC1E,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AACjC,IAAA,MAAM,SAAA,GAAY,MAAA,KAAW,KAAA,GAAQ,MAAA,GAAS,MAAA;AAE9C,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACvC,IAAA,IAAA,CAAK,IAAA,GAAO,GAAA;AACZ,IAAA,IAAA,CAAK,WAAW,QAAA,GAAW,SAAA;AAC3B,IAAA,IAAA,CAAK,KAAA,EAAM;AAGX,IAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAAA,EACzB;AACF;;;ACxKO,IAAM,sBAAN,MAAoD;AAAA;AAAA;AAAA;AAAA;AAAA,EAQzD,WAAA,CAAY,SAAiB,iBAAA,EAAmB;AAC9C,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKQ,OAAO,GAAA,EAAqB;AAClC,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,EAC9B;AAAA,EAEA,MAAM,IAAA,CAAK,GAAA,EAAa,IAAA,EAA8B;AACpD,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,OAAO,YAAA,EAAc;AACzD,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AACA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA;AACtC,IAAA,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,GAAG,GAAG,UAAU,CAAA;AAAA,EACnD;AAAA,EAEA,MAAM,KAAK,GAAA,EAAsC;AAC/C,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,OAAO,YAAA,EAAc;AACzD,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AACA,IAAA,MAAM,OAAO,YAAA,CAAa,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,GAAG,CAAC,CAAA;AAClD,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,EACxB;AAAA,EAEA,MAAM,OAAO,GAAA,EAA4B;AACvC,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,OAAO,YAAA,EAAc;AACzD,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AACA,IAAA,YAAA,CAAa,UAAA,CAAW,IAAA,CAAK,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,EAC1C;AAAA,EAEA,MAAM,IAAA,GAA0B;AAC9B,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,OAAO,YAAA,EAAc;AACzD,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AACA,IAAA,MAAM,OAAiB,EAAC;AACxB,IAAA,MAAM,eAAA,GAAkB,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,CAAA,CAAA;AACtC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAC5C,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,GAAA,CAAI,CAAC,CAAA;AAC9B,MAAA,IAAI,GAAA,EAAK,UAAA,CAAW,eAAe,CAAA,EAAG;AACpC,QAAA,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,SAAA,CAAU,eAAA,CAAgB,MAAM,CAAC,CAAA;AAAA,MACjD;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,GAAA,EAA+B;AAC1C,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,OAAO,YAAA,EAAc;AACzD,MAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAAA,IACjD;AACA,IAAA,OAAO,aAAa,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,GAAG,CAAC,CAAA,KAAM,IAAA;AAAA,EACpD;AACF;AAMO,IAAM,uBAAN,MAAqD;AAAA,EAArD,WAAA,GAAA;AACL,IAAA,IAAA,CAAQ,OAAA,uBAAoC,GAAA,EAAI;AAAA,EAAA;AAAA,EAEhD,MAAM,IAAA,CAAK,GAAA,EAAa,IAAA,EAA8B;AAEpD,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,GAAA,EAAK,IAAA,CAAK,MAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAC,CAAA;AAAA,EACxD;AAAA,EAEA,MAAM,KAAK,GAAA,EAAsC;AAC/C,IAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AACjC,IAAA,IAAI,SAAS,MAAA,EAAW;AACtB,MAAA,OAAO,IAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,EACxC;AAAA,EAEA,MAAM,OAAO,GAAA,EAA4B;AACvC,IAAA,IAAA,CAAK,OAAA,CAAQ,OAAO,GAAG,CAAA;AAAA,EACzB;AAAA,EAEA,MAAM,IAAA,GAA0B;AAC9B,IAAA,OAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAAA,EACvC;AAAA,EAEA,MAAM,OAAO,GAAA,EAA+B;AAC1C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAA,GAAe;AACb,IAAA,OAAO,KAAK,OAAA,CAAQ,IAAA;AAAA,EACtB;AACF;;;ACnHO,SAAS,4BAA4B,MAAA,EAA+C;AACzF,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,MAAM,WAAgC,EAAC;AAGvC,EAAA,IAAI,CAAC,OAAO,QAAA,EAAU;AACpB,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,KAAA,EAAO,UAAA;AAAA,MACP,OAAA,EAAS,sBAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH,CAAA,MAAA,IAAW,CAAC,MAAA,CAAO,MAAA,CAAO,qBAAqB,CAAA,CAAE,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA,EAAG;AAC1E,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,KAAA,EAAO,UAAA;AAAA,MACP,OAAA,EAAS,CAAA,kBAAA,EAAqB,MAAA,CAAO,QAAQ,CAAA,CAAA;AAAA,MAC7C,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,iBAAiB,CAAA,UAAA,iBAAA,YAAA,kBAAiE;AACxF,EAAA,IAAI,OAAO,QAAA,IAAY,cAAA,CAAe,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA,EAAG;AAC/D,IAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AAClB,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS,CAAA,wBAAA,EAA2B,MAAA,CAAO,QAAQ,CAAA,SAAA,CAAA;AAAA,QACnD,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,EAAA,EAAI;AACpC,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,KAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,IAAI,OAAO,QAAA,IAAY,CAAC,oBAAA,CAAqB,MAAA,CAAO,QAAQ,CAAA,EAAG;AAC7D,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,KAAA,EAAO,UAAA;AAAA,MACP,OAAA,EAAS,CAAA,uBAAA,EAA0B,MAAA,CAAO,QAAQ,CAAA,CAAA;AAAA,MAClD,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,OAAO,WAAA,EAAa;AACtB,IAAA,MAAM,eAAA,GAAkB,mBAAA,CAAoB,MAAA,CAAO,WAAW,CAAA;AAC9D,IAAA,MAAA,CAAO,IAAA,CAAK,GAAG,eAAA,CAAgB,MAAM,CAAA;AACrC,IAAA,IAAI,gBAAgB,QAAA,EAAU;AAC5B,MAAA,QAAA,CAAS,IAAA,CAAK,GAAG,eAAA,CAAgB,QAAQ,CAAA;AAAA,IAC3C;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,IACzB,MAAA;AAAA,IACA,QAAA,EAAU,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,QAAA,GAAW;AAAA,GAC7C;AACF;AAOO,SAAS,oBAAoB,MAAA,EAAuC;AACzE,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,MAAM,WAAgC,EAAC;AAGvC,EAAA,IAAI,MAAA,CAAO,eAAe,MAAA,EAAW;AACnC,IAAA,IAAI,MAAA,CAAO,UAAA,GAAa,GAAA,IAAQ,MAAA,CAAO,aAAa,IAAA,EAAO;AACzD,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,KAAA,EAAO,wBAAA;AAAA,QACP,OAAA,EAAS,4CAAA;AAAA,QACT,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,OAAO,UAAA,KAAe,IAAA,IAAS,OAAO,UAAA,KAAe,KAAA,IAAS,MAAA,CAAO,UAAA,KAAe,IAAA,EAAO;AACpG,MAAA,QAAA,CAAS,IAAA,CAAK;AAAA,QACZ,KAAA,EAAO,wBAAA;AAAA,QACP,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,aAAa,MAAA,KAAc,MAAA,CAAO,WAAW,CAAA,IAAK,MAAA,CAAO,WAAW,CAAA,CAAA,EAAI;AACjF,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,KAAA,EAAO,sBAAA;AAAA,MACP,OAAA,EAAS,yBAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,MAAA,CAAO,QAAA,KAAa,MAAA,IAAa,CAAC,CAAC,CAAA,EAAG,EAAA,EAAI,EAAE,CAAA,CAAE,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA,EAAG;AAC3E,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,KAAA,EAAO,sBAAA;AAAA,MACP,OAAA,EAAS,gCAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,MAAA,CAAO,QAAA,KAAa,MAAA,IAAa,CAAC,MAAA,CAAO,MAAA,CAAO,aAAa,CAAA,CAAE,QAAA,CAAS,MAAA,CAAO,QAAQ,CAAA,EAAG;AAC5F,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,KAAA,EAAO,sBAAA;AAAA,MACP,OAAA,EAAS,CAAA,kBAAA,EAAqB,MAAA,CAAO,QAAQ,CAAA,CAAA;AAAA,MAC7C,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,IACzB,MAAA;AAAA,IACA,QAAA,EAAU,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,QAAA,GAAW;AAAA,GAC7C;AACF;AAOO,SAAS,sBAAsB,MAAA,EAAyC;AAC7E,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,MAAM,WAAgC,EAAC;AAGvC,EAAA,IAAI,MAAA,CAAO,WAAA,KAAgB,MAAA,IAAa,MAAA,CAAO,cAAc,CAAA,EAAG;AAC9D,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,KAAA,EAAO,aAAA;AAAA,MACP,OAAA,EAAS,+BAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,MAAA,CAAO,cAAA,KAAmB,MAAA,IAAa,MAAA,CAAO,iBAAiB,CAAA,EAAG;AACpE,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,KAAA,EAAO,gBAAA;AAAA,MACP,OAAA,EAAS,kCAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,MAAA,CAAO,iBAAiB,MAAA,KAAc,MAAA,CAAO,eAAe,CAAA,IAAK,MAAA,CAAO,eAAe,CAAA,CAAA,EAAI;AAC7F,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,KAAA,EAAO,cAAA;AAAA,MACP,OAAA,EAAS,uCAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AAAA,EACH;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,IACzB,MAAA;AAAA,IACA,QAAA,EAAU,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,QAAA,GAAW;AAAA,GAC7C;AACF;AAOO,SAAS,qBAAqB,IAAA,EAAuB;AAE1D,EAAA,MAAM,OAAA,GAAU,gEAAA;AAChB,EAAA,OAAO,OAAA,CAAQ,KAAK,IAAI,CAAA;AAC1B;AAQO,SAAS,cAAA,CAAe,UAAiC,GAAA,EAAgC;AAC9F,EAAA,MAAM,SAA4B,EAAC;AAGnC,EAAA,IAAI,QAAA,KAAA,YAAA,qBAAiD;AACnD,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,MAAA,EAAQ,EAAC,EAAE;AAAA,EACnC;AAEA,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,KAAA,EAAO,QAAA;AAAA,MACP,OAAA,EAAS,2BAA2B,QAAQ,CAAA,CAAA;AAAA,MAC5C,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAO;AAAA,EAChC;AAGA,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAA,UAAA;AAEE,MAAA,IAAI,GAAA,CAAI,SAAS,EAAA,EAAI;AACnB,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,KAAA,EAAO,QAAA;AAAA,UACP,OAAA,EAAS,0CAAA;AAAA,UACT,IAAA,EAAM;AAAA,SACP,CAAA;AAAA,MACH;AACA,MAAA;AAAA,IAEF,KAAA,YAAA;AAEE,MAAA,IAAI,GAAA,CAAI,SAAS,EAAA,EAAI;AACnB,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,KAAA,EAAO,QAAA;AAAA,UACP,OAAA,EAAS,4CAAA;AAAA,UACT,IAAA,EAAM;AAAA,SACP,CAAA;AAAA,MACH;AACA,MAAA;AAAA;AAGJ,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,IACzB;AAAA,GACF;AACF;;;AC1NO,SAAS,cAAA,GAA8B;AAC5C,EAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,cAAc,WAAA,EAAa;AACrE,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,SAAA;AAAA,MACN,OAAA,EAAS,OAAO,OAAA,KAAY,WAAA,GAAc,QAAQ,OAAA,GAAU,SAAA;AAAA,MAC5D,EAAA,EAAI,OAAO,OAAA,KAAY,WAAA,GAAc,QAAQ,QAAA,GAAW,SAAA;AAAA,MACxD,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAEA,EAAA,MAAM,KAAK,SAAA,CAAU,SAAA;AACrB,EAAA,IAAI,IAAA,GAAO,SAAA;AACX,EAAA,IAAI,OAAA,GAAU,SAAA;AAGd,EAAA,IAAI,EAAA,CAAG,QAAA,CAAS,UAAU,CAAA,EAAG;AAC3B,IAAA,IAAA,GAAO,SAAA;AACP,IAAA,OAAA,GAAU,EAAA,CAAG,KAAA,CAAM,qBAAqB,CAAA,GAAI,CAAC,CAAA,IAAK,SAAA;AAAA,EACpD,CAAA,MAAA,IAAW,EAAA,CAAG,QAAA,CAAS,MAAM,CAAA,EAAG;AAC9B,IAAA,IAAA,GAAO,MAAA;AACP,IAAA,OAAA,GAAU,EAAA,CAAG,KAAA,CAAM,iBAAiB,CAAA,GAAI,CAAC,CAAA,IAAK,SAAA;AAAA,EAChD,CAAA,MAAA,IAAW,EAAA,CAAG,QAAA,CAAS,SAAS,CAAA,EAAG;AACjC,IAAA,IAAA,GAAO,QAAA;AACP,IAAA,OAAA,GAAU,EAAA,CAAG,KAAA,CAAM,oBAAoB,CAAA,GAAI,CAAC,CAAA,IAAK,SAAA;AAAA,EACnD,CAAA,MAAA,IAAW,GAAG,QAAA,CAAS,SAAS,KAAK,CAAC,EAAA,CAAG,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC3D,IAAA,IAAA,GAAO,QAAA;AACP,IAAA,OAAA,GAAU,EAAA,CAAG,KAAA,CAAM,qBAAqB,CAAA,GAAI,CAAC,CAAA,IAAK,SAAA;AAAA,EACpD;AAGA,EAAA,IAAI,EAAA,GAAK,SAAA;AACT,EAAA,IAAI,EAAA,CAAG,QAAA,CAAS,SAAS,CAAA,EAAG,EAAA,GAAK,SAAA;AAAA,OAAA,IACxB,EAAA,CAAG,QAAA,CAAS,QAAQ,CAAA,EAAG,EAAA,GAAK,OAAA;AAAA,OAAA,IAC5B,EAAA,CAAG,QAAA,CAAS,OAAO,CAAA,EAAG,EAAA,GAAK,OAAA;AAAA,OAAA,IAC3B,EAAA,CAAG,QAAA,CAAS,SAAS,CAAA,EAAG,EAAA,GAAK,SAAA;AAAA,OAAA,IAC7B,EAAA,CAAG,QAAA,CAAS,KAAK,CAAA,IAAK,EAAA,CAAG,QAAA,CAAS,QAAQ,CAAA,IAAK,EAAA,CAAG,QAAA,CAAS,MAAM,CAAA,EAAG,EAAA,GAAK,KAAA;AAGlF,EAAA,MAAM,QAAA,GAAW,gEAAA,CAAiE,IAAA,CAAK,EAAE,CAAA;AAEzF,EAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,EAAA,EAAI,QAAA,EAAS;AACvC;AAMO,SAAS,wBAAA,GAAyC;AACvD,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,KAAA;AAAA,MACX,OAAA,EAAS,0DAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,CAAC,EAAE,MAAA,CAAO,qBAAqB,MAAA,CAAO,uBAAA,CAAA;AAEzD,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,MAAM,WAAW,CAAC,MAAA,CAAO,iBAAA,IAAqB,CAAC,CAAC,MAAA,CAAO,uBAAA;AACvD,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,IAAA;AAAA,MACX,OAAA,EAAS,WAAW,6BAAA,GAAgC;AAAA,KACtD;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,KAAA;AAAA,IACX,OAAA,EAAS,iDAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AACF;AAMO,SAAS,qBAAA,GAAsC;AACpD,EAAA,MAAM,UAAA,GAAa,OAAO,SAAA,KAAc,WAAA;AAExC,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,IAAA;AAAA,MACX,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,KAAA;AAAA,IACX,OAAA,EAAS,4BAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AACF;AAMO,SAAS,wBAAA,GAAyC;AACvD,EAAA,IAAI,OAAO,cAAc,WAAA,EAAa;AACpC,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,KAAA;AAAA,MACX,OAAA,EAAS,gCAAA;AAAA,MACT,QAAA,EAAU;AAAA,KACZ;AAAA,EACF;AAEA,EAAA,MAAM,kBAAkB,CAAC,EAAE,SAAA,CAAU,YAAA,IAAgB,UAAU,YAAA,CAAa,YAAA,CAAA;AAC5E,EAAA,MAAM,sBAAsB,CAAC,EAAE,SAAA,CAAU,YAAA,IAAgB,UAAU,YAAA,CAAa,gBAAA,CAAA;AAEhF,EAAA,IAAI,mBAAmB,mBAAA,EAAqB;AAC1C,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,IAAA;AAAA,MACX,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAEA,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,IAAA;AAAA,MACX,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,KAAA;AAAA,IACX,OAAA,EAAS,oCAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AACF;AAMO,SAAS,wBAAA,GAAyC;AACvD,EAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,KAAA;AAAA,MACX,OAAA,EAAS;AAAA,KACX;AAAA,EACF;AAEA,EAAA,MAAM,iBAAA,GAAoB,MAAA,CAAO,YAAA,IAC9B,MAAA,CAAkE,kBAAA;AAErE,EAAA,IAAI,iBAAA,EAAmB;AAErB,IAAA,MAAM,UAAA,GAAa,kBAAkB,YAAA,CAAa,SAAA;AAClD,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,IAAA;AAAA,MACX,OAAA,EAAS,aAAa,6CAAA,GAAgD;AAAA,KACxE;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,KAAA;AAAA,IACX,OAAA,EAAS,+BAAA;AAAA,IACT,QAAA,EAAU;AAAA,GACZ;AACF;AAMO,SAAS,0BAAA,GAAkD;AAChE,EAAA,MAAM,UAAU,cAAA,EAAe;AAC/B,EAAA,MAAM,eAAe,wBAAA,EAAyB;AAC9C,EAAA,MAAM,YAAY,qBAAA,EAAsB;AACxC,EAAA,MAAM,eAAe,wBAAA,EAAyB;AAC9C,EAAA,MAAM,eAAe,wBAAA,EAAyB;AAE9C,EAAA,MAAM,kBAA4B,EAAC;AAEnC,EAAA,IAAI,CAAC,aAAa,SAAA,EAAW;AAC3B,IAAA,eAAA,CAAgB,KAAK,mEAAmE,CAAA;AAAA,EAC1F;AAEA,EAAA,IAAI,CAAC,aAAa,SAAA,EAAW;AAC3B,IAAA,eAAA,CAAgB,KAAK,0DAA0D,CAAA;AAAA,EACjF;AAEA,EAAA,IAAI,CAAC,aAAa,SAAA,EAAW;AAC3B,IAAA,eAAA,CAAgB,KAAK,yDAAyD,CAAA;AAAA,EAChF;AAGA,EAAA,MAAM,iBAAA,GAAA,CAAqB,YAAA,CAAa,SAAA,IAAa,SAAA,CAAU,cAAc,YAAA,CAAa,SAAA;AAE1F,EAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,IAAA,eAAA,CAAgB,KAAK,uEAAuE,CAAA;AAAA,EAC9F;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,YAAA;AAAA,IACA,SAAA;AAAA,IACA,YAAA;AAAA,IACA,YAAA;AAAA,IACA,iBAAA;AAAA,IACA;AAAA,GACF;AACF;;;ACvOO,SAAS,QAAA,CACd,MACA,IAAA,EACkC;AAClC,EAAA,IAAI,SAAA,GAAkD,IAAA;AAEtD,EAAA,OAAO,SAAS,aAAa,IAAA,EAA2B;AACtD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,YAAA,CAAa,SAAS,CAAA;AAAA,IACxB;AAEA,IAAA,SAAA,GAAY,WAAW,MAAM;AAC3B,MAAA,IAAA,CAAK,KAAA,CAAM,MAAM,IAAI,CAAA;AACrB,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,GAAG,IAAI,CAAA;AAAA,EACT,CAAA;AACF;AAQO,SAAS,QAAA,CACd,MACA,KAAA,EACkC;AAClC,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,SAAA,GAAkD,IAAA;AAEtD,EAAA,OAAO,SAAS,aAAa,IAAA,EAA2B;AACtD,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,IAAI,GAAA,GAAM,WAAW,KAAA,EAAO;AAC1B,MAAA,OAAA,GAAU,GAAA;AACV,MAAA,IAAA,CAAK,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,IACvB,CAAA,MAAA,IAAW,CAAC,SAAA,EAAW;AACrB,MAAA,MAAM,SAAA,GAAY,SAAS,GAAA,GAAM,OAAA,CAAA;AACjC,MAAA,SAAA,GAAY,WAAW,MAAM;AAC3B,QAAA,OAAA,GAAU,KAAK,GAAA,EAAI;AACnB,QAAA,IAAA,CAAK,KAAA,CAAM,MAAM,IAAI,CAAA;AACrB,QAAA,SAAA,GAAY,IAAA;AAAA,MACd,GAAG,SAAS,CAAA;AAAA,IACd;AAAA,EACF,CAAA;AACF;AAOO,SAAS,MAAM,EAAA,EAA2B;AAC/C,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,EAAE,CAAC,CAAA;AACvD;AASO,SAAS,OAAA,CACd,OAAA,EACA,EAAA,EACA,OAAA,GAAkB,qBAAA,EACN;AACZ,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,SAAA,GAAY,WAAW,MAAM;AACjC,MAAA,MAAA,CAAO,IAAI,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,IAC3B,GAAG,EAAE,CAAA;AAEL,IAAA,OAAA,CACG,KAAK,CAAA,MAAA,KAAU;AACd,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,IAChB,CAAC,CAAA,CACA,KAAA,CAAM,CAAA,KAAA,KAAS;AACd,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,MAAA,CAAO,KAAK,CAAA;AAAA,IACd,CAAC,CAAA;AAAA,EACL,CAAC,CAAA;AACH;AAQA,eAAsB,KAAA,CACpB,EAAA,EACA,OAAA,GAAwB,EAAC,EACb;AACZ,EAAA,MAAM;AAAA,IACJ,WAAA,GAAc,CAAA;AAAA,IACd,KAAA,GAAQ,GAAA;AAAA,IACR,OAAA,GAAU,aAAA;AAAA,IACV,QAAA,GAAW,GAAA;AAAA,IACX,cAAc,MAAM;AAAA,GACtB,GAAI,OAAA;AAEJ,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,YAAA,GAAe,KAAA;AAEnB,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,WAAA,EAAa,OAAA,EAAA,EAAW;AACvD,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,EAAA,EAAG;AAAA,IAClB,SAAS,KAAA,EAAO;AACd,MAAA,SAAA,GAAY,KAAA;AAEZ,MAAA,IAAI,OAAA,KAAY,WAAA,IAAe,CAAC,WAAA,CAAY,KAAK,CAAA,EAAG;AAClD,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,MAAM,YAAY,CAAA;AAGxB,MAAA,IAAI,YAAY,aAAA,EAAe;AAC7B,QAAA,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,YAAA,GAAe,CAAA,EAAG,QAAQ,CAAA;AAAA,MACpD,CAAA,MAAO;AACL,QAAA,YAAA,GAAe,IAAA,CAAK,GAAA,CAAI,YAAA,GAAe,KAAA,EAAO,QAAQ,CAAA;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,SAAA;AACR;AAOO,SAAS,mBAAmB,EAAA,EAA4D;AAC7F,EAAA,IAAI,SAAA;AACJ,EAAA,IAAI,QAAA;AAEJ,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAc,CAAC,SAAS,MAAA,KAAW;AACrD,IAAA,QAAA,GAAW,MAAA;AACX,IAAA,SAAA,GAAY,UAAA,CAAW,SAAS,EAAE,CAAA;AAAA,EACpC,CAAC,CAAA;AAED,EAAA,MAAM,SAAS,MAAY;AACzB,IAAA,YAAA,CAAa,SAAS,CAAA;AACtB,IAAA,QAAA,CAAS,IAAI,KAAA,CAAM,mBAAmB,CAAC,CAAA;AAAA,EACzC,CAAA;AAEA,EAAA,OAAO,EAAE,SAAS,MAAA,EAAO;AAC3B;AASO,SAAS,gBAAA,CACd,EAAA,EACA,QAAA,EACA,SAAA,GAAqB,KAAA,EACT;AACZ,EAAA,IAAI,OAAA,GAAU,KAAA;AACd,EAAA,IAAI,SAAA;AAEJ,EAAA,MAAM,UAAU,YAA2B;AACzC,IAAA,IAAI,OAAA,EAAS;AAEb,IAAA,IAAI;AACF,MAAA,MAAM,EAAA,EAAG;AAAA,IACX,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAAA,IACjD;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,SAAA,GAAY,UAAA,CAAW,SAAS,QAAQ,CAAA;AAAA,IAC1C;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,KAAK,OAAA,EAAQ;AAAA,EACf,CAAA,MAAO;AACL,IAAA,SAAA,GAAY,UAAA,CAAW,SAAS,QAAQ,CAAA;AAAA,EAC1C;AAEA,EAAA,OAAO,MAAY;AACjB,IAAA,OAAA,GAAU,IAAA;AACV,IAAA,YAAA,CAAa,SAAS,CAAA;AAAA,EACxB,CAAA;AACF;;;AC5LO,SAAS,eAAe,EAAA,EAAoB;AACjD,EAAA,IAAI,EAAA,GAAK,GAAG,OAAO,IAAA;AAEnB,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,GAAI,CAAA;AACpC,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AACvC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,GAAU,EAAE,CAAA;AAErC,EAAA,MAAM,mBAAmB,OAAA,GAAU,EAAA;AACnC,EAAA,MAAM,mBAAmB,OAAA,GAAU,EAAA;AAEnC,EAAA,IAAI,QAAQ,CAAA,EAAG;AACb,IAAA,OAAO,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,gBAAgB,CAAA,CAAA,CAAA;AAAA,EACtC;AACA,EAAA,IAAI,UAAU,CAAA,EAAG;AACf,IAAA,OAAO,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,gBAAgB,CAAA,CAAA,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,GAAG,OAAO,CAAA,CAAA,CAAA;AACnB;AAQO,SAAS,eAAA,CAAgB,EAAA,EAAY,MAAA,GAA0B,UAAA,EAAoB;AACxF,EAAA,IAAI,EAAA,GAAK,GAAG,EAAA,GAAK,CAAA;AAEjB,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,GAAI,CAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,IAAI,CAAA;AAC5C,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAO,YAAA,GAAe,OAAQ,EAAE,CAAA;AACrD,EAAA,MAAM,UAAU,YAAA,GAAe,EAAA;AAC/B,EAAA,MAAM,YAAA,GAAe,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,GAAI,CAAA;AAEzC,EAAA,MAAM,GAAA,GAAM,CAAC,CAAA,EAAW,MAAA,GAAiB,CAAA,KAAc,OAAO,CAAC,CAAA,CAAE,QAAA,CAAS,MAAA,EAAQ,GAAG,CAAA;AAErF,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,KAAA;AACH,MAAA,OAAO,GAAG,GAAA,CAAI,KAAK,CAAC,CAAA,CAAA,EAAI,IAAI,OAAO,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,OAAO,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,YAAA,EAAc,CAAC,CAAC,CAAA,CAAA;AAAA,IAE9E,KAAK,KAAA;AACH,MAAA,OAAO,GAAG,GAAA,CAAI,KAAK,CAAC,CAAA,CAAA,EAAI,IAAI,OAAO,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,OAAO,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,YAAA,EAAc,CAAC,CAAC,CAAA,CAAA;AAAA,IAE9E,KAAK,UAAA;AACH,MAAA,IAAI,QAAQ,CAAA,EAAG;AACb,QAAA,OAAO,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,GAAA,CAAI,OAAO,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,OAAO,CAAC,CAAA,CAAA;AAAA,MACjD;AACA,MAAA,OAAO,CAAA,EAAG,OAAO,CAAA,CAAA,EAAI,GAAA,CAAI,OAAO,CAAC,CAAA,CAAA;AAAA,IAEnC,KAAK,KAAA;AACH,MAAA,OAAO,IAAI,IAAA,CAAK,EAAE,CAAA,CAAE,WAAA,EAAY;AAAA,IAElC,KAAK,IAAA;AACH,MAAA,OAAO,OAAO,EAAE,CAAA;AAAA,IAElB;AACE,MAAA,OAAO,OAAO,EAAE,CAAA;AAAA;AAEtB;AAOO,SAAS,iBAAiB,UAAA,EAA4B;AAC3D,EAAA,IAAI,UAAA,GAAa,CAAA,IAAK,UAAA,GAAa,CAAA,EAAG;AACpC,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,KAAA,CAAM,UAAA,GAAa,GAAG,CAAC,CAAA,CAAA,CAAA;AACxC;AAOO,SAAS,eAAe,KAAA,EAAuB;AACpD,EAAA,IAAI,KAAA,GAAQ,GAAG,OAAO,KAAA;AAEtB,EAAA,MAAM,QAAQ,CAAC,GAAA,EAAK,IAAA,EAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AAC1C,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,IAAA,GAAO,KAAA;AAEX,EAAA,OAAO,IAAA,IAAQ,IAAA,IAAQ,SAAA,GAAY,KAAA,CAAM,SAAS,CAAA,EAAG;AACnD,IAAA,IAAA,IAAQ,IAAA;AACR,IAAA,SAAA,EAAA;AAAA,EACF;AAEA,EAAA,OAAO,CAAA,EAAG,IAAA,CAAK,OAAA,CAAQ,SAAA,GAAY,CAAA,GAAI,CAAA,GAAI,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,SAAS,CAAC,CAAA,CAAA;AACnE;AAQO,SAAS,0BAAA,CACd,OAAA,EACA,OAAA,GAA0B,EAAC,EACnB;AACR,EAAA,MAAM;AAAA,IACJ,cAAA,GAAiB,KAAA;AAAA,IACjB,cAAA,GAAiB,KAAA;AAAA,IACjB,gBAAA,GAAmB,KAAA;AAAA,IACnB;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,IAAI,OAAO,MAAA,CAAO,IAAA;AAGlB,IAAA,MAAM,SAAmB,EAAC;AAE1B,IAAA,IAAI,cAAA,IAAkB,OAAO,SAAA,EAAW;AACtC,MAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,MAAA,CAAO,SAAA,EAAW,UAAU,CAAA;AACzD,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAG,CAAA;AAAA,IACzB;AAEA,IAAA,IAAI,OAAO,OAAA,EAAS;AAClB,MAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,IAClC;AAEA,IAAA,IAAI,cAAA,IAAkB,MAAA,CAAO,UAAA,KAAe,MAAA,EAAW;AACrD,MAAA,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,gBAAA,CAAiB,MAAA,CAAO,UAAU,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IACxD;AAGA,IAAA,IAAI,gBAAA,IAAoB,CAAC,MAAA,CAAO,OAAA,EAAS;AACvC,MAAA,IAAA,GAAO,IAAI,IAAI,CAAA,CAAA,CAAA;AAAA,IACjB;AAGA,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,MAAA,GAAS,CAAA,GAAI,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,GAAK,IAAA;AACjE,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACjB;AAEA,EAAA,IAAI,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAG5B,EAAA,IAAI,SAAA,IAAa,MAAA,CAAO,MAAA,GAAS,SAAA,EAAW;AAC1C,IAAA,MAAA,GAAS,MAAA,CAAO,SAAA,CAAU,CAAA,EAAG,SAAA,GAAY,CAAC,CAAA,GAAI,KAAA;AAAA,EAChD;AAEA,EAAA,OAAO,MAAA;AACT;AAQO,SAAS,iBAAA,CAAkB,OAAA,EAAgC,SAAA,GAAqB,IAAA,EAAc;AACnG,EAAA,MAAM,WAAW,SAAA,GAAY,OAAA,CAAQ,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,CAAA,GAAI,OAAA;AAC9D,EAAA,OAAO,QAAA,CAAS,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,CAAE,IAAA,EAAK;AAClD;AAOO,SAAS,aAAa,GAAA,EAAqB;AAChD,EAAA,OAAO,IAAI,cAAA,EAAe;AAC5B;AAQO,SAAS,YAAA,CAAa,MAAc,SAAA,EAA2B;AACpE,EAAA,IAAI,IAAA,CAAK,MAAA,IAAU,SAAA,EAAW,OAAO,IAAA;AACrC,EAAA,OAAO,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,SAAA,GAAY,CAAC,CAAA,GAAI,KAAA;AAC5C;;;AC1LA,IAAM,YAAA,GAAqE;AAAA,EACzE,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAW,YAAY,SAAA,EAAU;AAAA,EAC/C,OAAA,EAAS,EAAE,IAAA,EAAM,cAAA,EAAgB,YAAY,cAAA,EAAe;AAAA,EAC5D,OAAA,EAAS,EAAE,IAAA,EAAM,cAAA,EAAgB,YAAY,cAAA,EAAe;AAAA,EAC5D,OAAA,EAAS,EAAE,IAAA,EAAM,qBAAA,EAAuB,YAAY,qBAAA,EAAsB;AAAA,EAC1E,OAAA,EAAS,EAAE,IAAA,EAAM,kBAAA,EAAoB,YAAY,kBAAA,EAAmB;AAAA,EACpE,OAAA,EAAS,EAAE,IAAA,EAAM,iBAAA,EAAmB,YAAY,iBAAA,EAAkB;AAAA,EAClE,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAW,YAAY,YAAA,EAAU;AAAA,EAC/C,OAAA,EAAS,EAAE,IAAA,EAAM,iBAAA,EAAmB,YAAY,wBAAA,EAAmB;AAAA,EACnE,OAAA,EAAS,EAAE,IAAA,EAAM,kBAAA,EAAoB,YAAY,wBAAA,EAAmB;AAAA,EACpE,QAAA,EAAU,EAAE,IAAA,EAAM,yBAAA,EAA2B,YAAY,+BAAA,EAA0B;AAAA,EACnF,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,YAAY,aAAA,EAAW;AAAA,EAC/C,OAAA,EAAS,EAAE,IAAA,EAAM,iBAAA,EAAmB,YAAY,sBAAA,EAAoB;AAAA,EACpE,OAAA,EAAS,EAAE,IAAA,EAAM,iBAAA,EAAmB,YAAY,sBAAA,EAAoB;AAAA,EACpE,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,YAAY,SAAA,EAAU;AAAA,EAC9C,OAAA,EAAS,EAAE,IAAA,EAAM,kBAAA,EAAoB,YAAY,uBAAA,EAAwB;AAAA,EACzE,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAW,YAAY,UAAA,EAAW;AAAA,EAChD,OAAA,EAAS,EAAE,IAAA,EAAM,iBAAA,EAAmB,YAAY,mBAAA,EAAoB;AAAA,EACpE,IAAA,EAAM,EAAE,IAAA,EAAM,YAAA,EAAc,YAAY,cAAA,EAAY;AAAA,EACpD,OAAA,EAAS,EAAE,IAAA,EAAM,qBAAA,EAAuB,YAAY,uBAAA,EAAqB;AAAA,EACzE,OAAA,EAAS,EAAE,IAAA,EAAM,uBAAA,EAAyB,YAAY,yBAAA,EAAuB;AAAA,EAC7E,IAAA,EAAM,EAAE,IAAA,EAAM,OAAA,EAAS,YAAY,YAAA,EAAa;AAAA,EAChD,OAAA,EAAS,EAAE,IAAA,EAAM,qBAAA,EAAuB,YAAY,wBAAA,EAAyB;AAAA,EAC7E,IAAA,EAAM,EAAE,IAAA,EAAM,UAAA,EAAY,YAAY,oBAAA,EAAM;AAAA,EAC5C,OAAA,EAAS,EAAE,IAAA,EAAM,kBAAA,EAAoB,YAAY,mCAAA,EAAW;AAAA,EAC5D,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,YAAY,oBAAA,EAAM;AAAA,EAC1C,OAAA,EAAS,EAAE,IAAA,EAAM,gBAAA,EAAkB,YAAY,+CAAA,EAAa;AAAA,EAC5D,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAW,YAAY,cAAA,EAAK;AAAA,EAC1C,OAAA,EAAS,EAAE,IAAA,EAAM,sBAAA,EAAwB,YAAY,6BAAA,EAAU;AAAA,EAC/D,OAAA,EAAS,EAAE,IAAA,EAAM,uBAAA,EAAyB,YAAY,6BAAA,EAAU;AAAA,EAChE,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAW,YAAY,4CAAA,EAAU;AAAA,EAC/C,OAAA,EAAS,EAAE,IAAA,EAAM,kBAAA,EAAoB,YAAY,mFAAA,EAAmB;AAAA,EACpE,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,YAAY,4CAAA,EAAU;AAAA,EAC9C,OAAA,EAAS,EAAE,IAAA,EAAM,uBAAA,EAAyB,YAAY,+FAAA,EAAqB;AAAA,EAC3E,IAAA,EAAM,EAAE,IAAA,EAAM,OAAA,EAAS,YAAY,sCAAA,EAAS;AAAA,EAC5C,OAAA,EAAS,EAAE,IAAA,EAAM,eAAA,EAAiB,YAAY,iEAAA,EAAgB;AAAA,EAC9D,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAW,YAAY,cAAA,EAAS;AAAA,EAC9C,OAAA,EAAS,EAAE,IAAA,EAAM,kBAAA,EAAoB,YAAY,2BAAA,EAAmB;AAAA,EACpE,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,YAAY,QAAA,EAAS;AAAA,EAC7C,OAAA,EAAS,EAAE,IAAA,EAAM,iBAAA,EAAmB,YAAY,iBAAA,EAAkB;AAAA,EAClE,IAAA,EAAM,EAAE,IAAA,EAAM,WAAA,EAAa,YAAY,8DAAA,EAAa;AAAA,EACpD,OAAA,EAAS,EAAE,IAAA,EAAM,qBAAA,EAAuB,YAAY,2GAAA,EAAuB;AAAA,EAC3E,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAW,YAAY,SAAA,EAAU;AAAA,EAC/C,OAAA,EAAS,EAAE,IAAA,EAAM,kBAAA,EAAoB,YAAY,mBAAA,EAAoB;AAAA,EACrE,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,YAAY,OAAA,EAAQ;AAAA,EAC5C,OAAA,EAAS,EAAE,IAAA,EAAM,kBAAA,EAAoB,YAAY,iBAAA,EAAkB;AAAA,EACnE,IAAA,EAAM,EAAE,IAAA,EAAM,WAAA,EAAa,YAAY,OAAA,EAAQ;AAAA,EAC/C,OAAA,EAAS,EAAE,IAAA,EAAM,oBAAA,EAAsB,YAAY,eAAA,EAAgB;AAAA,EACnE,IAAA,EAAM,EAAE,IAAA,EAAM,SAAA,EAAW,YAAY,OAAA,EAAQ;AAAA,EAC7C,OAAA,EAAS,EAAE,IAAA,EAAM,mBAAA,EAAqB,YAAY,eAAA;AACpD,CAAA;AAKA,IAAM,kBAAA,GAA8D;AAAA,EAClE,mCAAsC;AAAA,IACpC,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,OAAA;AAAA,IACpC,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,OAAA;AAAA,IACpC,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,OAAA;AAAA,IACpC,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS;AAAA,GACtC;AAAA,EACA,6BAAkC;AAAA,IAChC,IAAA;AAAA,IAAM,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS,OAAA;AAAA,IACjC,IAAA;AAAA,IAAM,OAAA;AAAA,IAAS,QAAA;AAAA,IACf,IAAA;AAAA,IAAM,OAAA;AAAA,IAAS,OAAA;AAAA,IACf,IAAA;AAAA,IAAM,OAAA;AAAA,IACN,IAAA;AAAA,IAAM,OAAA;AAAA,IACN,IAAA;AAAA,IAAM,OAAA;AAAA,IAAS,OAAA;AAAA,IACf,IAAA;AAAA,IAAM,OAAA;AAAA,IACN,IAAA;AAAA,IAAM,OAAA;AAAA,IACN,IAAA;AAAA,IAAM,OAAA;AAAA,IACN,IAAA;AAAA,IAAM,OAAA;AAAA,IAAS,OAAA;AAAA,IACf,IAAA;AAAA,IAAM,OAAA;AAAA,IACN,IAAA;AAAA,IAAM,OAAA;AAAA,IACN,IAAA;AAAA,IAAM,OAAA;AAAA,IACN,IAAA;AAAA,IAAM,OAAA;AAAA,IACN,IAAA;AAAA,IAAM,OAAA;AAAA,IACN,IAAA;AAAA,IAAM,OAAA;AAAA,IACN,IAAA;AAAA,IAAM,OAAA;AAAA,IACN,IAAA;AAAA,IAAM,OAAA;AAAA,IACN,IAAA;AAAA,IAAM;AAAA,GACR;AAAA,EACA,iCAAoC;AAAA,IAClC,IAAA;AAAA,IAAM,OAAA;AAAA,IAAS,OAAA;AAAA,IAAS;AAAA,GAC1B;AAAA,EACA,CAAA,QAAA,gBAAgC;AAClC,CAAA;AAOO,SAAS,sBAAsB,QAAA,EAAiD;AACrF,EAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,QAAQ,CAAA,IAAK,EAAC;AAC/C,EAAA,OAAO,KAAA,CAAM,IAAI,CAAA,IAAA,KAAQ;AACvB,IAAA,MAAM,IAAA,GAAO,aAAa,IAAI,CAAA,IAAK,EAAE,IAAA,EAAM,IAAA,EAAM,YAAY,IAAA,EAAK;AAClE,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,YAAY,IAAA,CAAK,UAAA;AAAA,MACjB;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AACH;AAOO,SAAS,sBAAsB,IAAA,EAAsB;AAC1D,EAAA,IAAI,CAAC,MAAM,OAAO,OAAA;AAGlB,EAAA,MAAM,UAAA,GAAa,KAAK,IAAA,EAAK;AAG7B,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,MAAM,CAAA;AAErC,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AAEtB,IAAA,OAAO,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAY;AAAA,EAC9B;AAGA,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAY;AACtC,EAAA,MAAM,MAAA,GAAS,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAY;AAEpC,EAAA,OAAO,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AAC9B;AAOO,SAAS,gBAAgB,IAAA,EAAsB;AACpD,EAAA,MAAM,UAAA,GAAa,sBAAsB,IAAI,CAAA;AAC7C,EAAA,MAAM,IAAA,GAAO,aAAa,UAAU,CAAA;AACpC,EAAA,OAAO,MAAM,IAAA,IAAQ,IAAA;AACvB;AAOO,SAAS,sBAAsB,IAAA,EAAsB;AAC1D,EAAA,MAAM,UAAA,GAAa,sBAAsB,IAAI,CAAA;AAC7C,EAAA,MAAM,IAAA,GAAO,aAAa,UAAU,CAAA;AACpC,EAAA,OAAO,MAAM,UAAA,IAAc,IAAA;AAC7B;AAMO,SAAS,qBAAA,GAAgC;AAC9C,EAAA,IAAI,OAAO,cAAc,WAAA,EAAa;AACpC,IAAA,OAAO,OAAA;AAAA,EACT;AAEA,EAAA,MAAM,WAAA,GAAc,SAAA,CAAU,QAAA,IAAa,SAAA,CAAwC,YAAA;AACnF,EAAA,OAAO,qBAAA,CAAsB,eAAe,OAAO,CAAA;AACrD;AAQO,SAAS,mBAAA,CAAoB,MAAc,QAAA,EAA0C;AAC1F,EAAA,MAAM,UAAA,GAAa,sBAAsB,IAAI,CAAA;AAC7C,EAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,QAAQ,CAAA,IAAK,EAAC;AAGnD,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,UAAU,CAAA,EAAG;AAClC,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACxC,EAAA,OAAO,SAAA,CAAU,SAAS,QAAQ,CAAA;AACpC;AAQO,SAAS,uBAAA,CAAwB,MAAc,QAAA,EAAyC;AAC7F,EAAA,MAAM,UAAA,GAAa,sBAAsB,IAAI,CAAA;AAC7C,EAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,QAAQ,CAAA,IAAK,EAAC;AAGnD,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,UAAU,CAAA,EAAG;AAClC,IAAA,OAAO,UAAA;AAAA,EACT;AAGA,EAAA,MAAM,QAAA,GAAW,UAAA,CAAW,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACxC,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,QAAQ,CAAA,EAAG;AAChC,IAAA,OAAO,QAAA;AAAA,EACT;AAGA,EAAA,MAAM,KAAA,GAAQ,UAAU,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,UAAA,CAAW,QAAA,GAAW,GAAG,CAAC,CAAA;AAC9D,EAAA,IAAI,KAAA,EAAO;AACT,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,OAAO,UAAU,QAAA,CAAS,OAAO,IAAI,OAAA,GAAW,SAAA,CAAU,CAAC,CAAA,IAAK,OAAA;AAClE;;;ACvOO,SAAS,WAAW,MAAA,EAAyB;AAClD,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,EAAI,CAAE,SAAS,EAAE,CAAA;AACxC,EAAA,MAAM,MAAA,GAAS,KAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,SAAA,CAAU,CAAA,EAAG,CAAC,CAAA;AACxD,EAAA,MAAM,EAAA,GAAK,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA;AACjC,EAAA,OAAO,MAAA,GAAS,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,GAAK,EAAA;AACtC;AAOO,SAAS,UAAa,GAAA,EAAW;AACtC,EAAA,IAAI,GAAA,KAAQ,IAAA,IAAQ,OAAO,GAAA,KAAQ,QAAA,EAAU;AAC3C,IAAA,OAAO,GAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,IAAA,OAAO,GAAA,CAAI,GAAA,CAAI,CAAA,IAAA,KAAQ,SAAA,CAAU,IAAI,CAAC,CAAA;AAAA,EACxC;AAEA,EAAA,IAAI,eAAe,IAAA,EAAM;AACvB,IAAA,OAAO,IAAI,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,CAAA;AAAA,EAC/B;AAEA,EAAA,IAAI,eAAe,WAAA,EAAa;AAC9B,IAAA,OAAO,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,EACpB;AAEA,EAAA,MAAM,SAAS,EAAC;AAChB,EAAA,KAAA,MAAW,OAAO,GAAA,EAAK;AACrB,IAAA,IAAI,OAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAK,GAAA,EAAK,GAAG,CAAA,EAAG;AAClD,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,SAAA,CAAU,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,IAClC;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAOO,SAAS,aAAgD,OAAA,EAA0B;AACxF,EAAA,MAAM,SAAS,EAAC;AAEhB,EAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,IAAA,IAAI,CAAC,GAAA,EAAK;AAEV,IAAA,KAAA,MAAW,OAAO,GAAA,EAAK;AACrB,MAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,eAAe,IAAA,CAAK,GAAA,EAAK,GAAG,CAAA,EAAG;AAErD,MAAA,MAAM,KAAA,GAAQ,IAAI,GAAG,CAAA;AACrB,MAAA,MAAM,QAAA,GAAW,OAAO,GAAc,CAAA;AAEtC,MAAA,IAAI,QAAA,CAAS,KAAK,CAAA,IAAK,QAAA,CAAS,QAAQ,CAAA,EAAG;AACzC,QAAA,MAAA,CAAO,GAAc,CAAA,GAAI,SAAA;AAAA,UACvB,QAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAA,CAAO,GAAc,CAAA,GAAI,KAAA;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAOO,SAAS,WAAW,KAAA,EAA0D;AACnF,EAAA,OAAO,OAAO,KAAA,KAAU,UAAA;AAC1B;AAOO,SAAS,SAAS,KAAA,EAAkD;AACzE,EAAA,OAAO,KAAA,KAAU,QAAQ,OAAO,KAAA,KAAU,YAAY,CAAC,KAAA,CAAM,QAAQ,KAAK,CAAA;AAC5E;AAOO,SAAS,QAAQ,KAAA,EAAyB;AAC/C,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW,OAAO,IAAA;AAClD,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,MAAM,MAAA,KAAW,CAAA;AACvD,EAAA,IAAI,MAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,MAAM,MAAA,KAAW,CAAA;AAClD,EAAA,IAAI,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,OAAO,IAAA,CAAK,KAAK,EAAE,MAAA,KAAW,CAAA;AAC1D,EAAA,OAAO,KAAA;AACT;AAQO,SAAS,IAAA,CACd,KACA,IAAA,EACY;AACZ,EAAA,MAAM,SAAS,EAAC;AAChB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,IAAI,OAAO,SAAA,CAAU,cAAA,CAAe,IAAA,CAAK,GAAA,EAAK,GAAG,CAAA,EAAG;AAClD,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,GAAA,CAAI,GAAG,CAAA;AAAA,IACvB;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAQO,SAAS,IAAA,CACd,KACA,IAAA,EACY;AACZ,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,GAAA,EAAI;AACxB,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,OAAO,OAAO,GAAG,CAAA;AAAA,EACnB;AACA,EAAA,OAAO,MAAA;AACT;AASO,SAAS,OAAA,CACd,SAAA,EACA,QAAA,GAAmB,GAAA,EACnBC,WAAkB,GAAA,EACH;AACf,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,IAAA,MAAM,QAAQ,MAAY;AACxB,MAAA,IAAI,WAAU,EAAG;AACf,QAAA,OAAA,EAAQ;AACR,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,SAAA,GAAYA,QAAAA,EAAS;AACpC,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,+BAA+B,CAAC,CAAA;AACjD,QAAA;AAAA,MACF;AAEA,MAAA,UAAA,CAAW,OAAO,QAAQ,CAAA;AAAA,IAC5B,CAAA;AAEA,IAAA,KAAA,EAAM;AAAA,EACR,CAAC,CAAA;AACH;AAQO,SAAS,OAAA,CACd,OACA,KAAA,EACgB;AAChB,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,MAAA,EAAQ,IAAA,KAAS;AACpC,IAAA,MAAM,GAAA,GAAM,MAAM,IAAI,CAAA;AACtB,IAAA,IAAI,CAAC,MAAA,CAAO,GAAG,CAAA,EAAG;AAChB,MAAA,MAAA,CAAO,GAAG,IAAI,EAAC;AAAA,IACjB;AACA,IAAA,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACrB,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,EAAG,EAAoB,CAAA;AACzB;AASO,SAAS,KAAA,CAAM,KAAA,EAAe,GAAA,EAAa,GAAA,EAAqB;AACrE,EAAA,OAAO,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,KAAA,EAAO,GAAG,GAAG,GAAG,CAAA;AAC3C;AAQO,SAAS,KAAA,CAAM,KAAA,EAAe,QAAA,GAAmB,CAAA,EAAW;AACjE,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,QAAQ,CAAA;AACpC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,MAAM,CAAA,GAAI,MAAA;AACtC;;;AC7LO,SAAS,gBAAA,CAAiB,UAAA,EAAoB,QAAA,EAAkB,QAAA,EAA0B;AAC/F,EAAA,OAAO,aAAa,QAAA,GAAW,QAAA;AACjC;AAQO,SAAS,iBAAA,CAAkB,YAAoB,MAAA,EAA6B;AACjF,EAAA,MAAM,UAAA,GAAa,OAAO,UAAA,IAAc,IAAA;AACxC,EAAA,MAAM,QAAA,GAAW,OAAO,QAAA,IAAY,EAAA;AACpC,EAAA,MAAM,QAAA,GAAW,OAAO,QAAA,IAAY,CAAA;AAEpC,EAAA,MAAM,cAAc,UAAA,GAAa,GAAA;AACjC,EAAA,MAAM,cAAA,GAAkB,UAAA,GAAa,QAAA,GAAW,QAAA,GAAY,CAAA;AAE5D,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,WAAA,GAAc,cAAc,CAAA;AAC/C;AAOO,SAAS,qBAAqB,UAAA,EAA4B;AAE/D,EAAA,MAAM,gBAAgB,UAAA,GAAa,IAAA;AAGnC,EAAA,IAAI,UAAA,GAAa,GAAA;AACjB,EAAA,OAAO,UAAA,GAAa,aAAA,IAAiB,UAAA,GAAa,KAAA,EAAO;AACvD,IAAA,UAAA,IAAc,CAAA;AAAA,EAChB;AAGA,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,GAAA,EAAK,UAAU,CAAA;AACjC;AAOO,SAAS,oBAAoB,IAAA,EAAoC;AACtE,EAAA,MAAM,IAAA,GAAO,IAAI,QAAA,CAAS,IAAI,CAAA;AAG9B,EAAA,IAAI,IAAA,CAAK,cAAc,EAAA,EAAI;AACzB,IAAA,MAAM,OAAO,MAAA,CAAO,YAAA,CAAa,KAAK,QAAA,CAAS,CAAC,GAAG,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,EAAG,KAAK,QAAA,CAAS,CAAC,GAAG,IAAA,CAAK,QAAA,CAAS,CAAC,CAAC,CAAA;AACvG,IAAA,MAAM,OAAO,MAAA,CAAO,YAAA,CAAa,KAAK,QAAA,CAAS,CAAC,GAAG,IAAA,CAAK,QAAA,CAAS,CAAC,CAAA,EAAG,KAAK,QAAA,CAAS,EAAE,GAAG,IAAA,CAAK,QAAA,CAAS,EAAE,CAAC,CAAA;AAEzG,IAAA,IAAI,IAAA,KAAS,MAAA,IAAU,IAAA,KAAS,MAAA,EAAQ;AACtC,MAAA,OAAO,eAAe,IAAI,CAAA;AAAA,IAC5B;AAAA,EACF;AAGA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ;AAAA,GACV;AACF;AAOA,SAAS,eAAe,IAAA,EAAiC;AACvD,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,EAAA,EAAI,IAAI,CAAA;AACxC,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,SAAA,CAAU,EAAA,EAAI,IAAI,CAAA;AAC1C,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,EAAA,EAAI,IAAI,CAAA;AACxC,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,SAAA,CAAU,EAAA,EAAI,IAAI,CAAA;AAExC,IAAA,MAAM,QAAA,GAAW,QAAA,IAAY,UAAA,GAAa,QAAA,IAAY,QAAA,GAAW,CAAA,CAAA,CAAA;AAEjE,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,KAAA;AAAA,MACR,UAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,QAAQ,KAAA,EAAM;AAAA,EACzB;AACF;AAOO,SAAS,aAAa,MAAA,EAA8B;AACzD,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,GAAA,IAAO,MAAA,CAAO,CAAC,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA;AAAA,EAC7B;AACA,EAAA,OAAO,IAAA,CAAK,IAAA,CAAK,GAAA,GAAM,MAAA,CAAO,MAAM,CAAA;AACtC;AAOO,SAAS,cAAc,MAAA,EAA8B;AAC1D,EAAA,IAAI,IAAA,GAAO,CAAA;AACX,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,MAAA,CAAO,CAAC,CAAC,CAAA;AAC9B,IAAA,IAAI,GAAA,GAAM,MAAM,IAAA,GAAO,GAAA;AAAA,EACzB;AACA,EAAA,OAAO,IAAA;AACT;AAOO,SAAS,WAAW,EAAA,EAAoB;AAC7C,EAAA,OAAO,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,EAAA,GAAK,EAAE,CAAA;AAC7B;AAOO,SAAS,WAAW,MAAA,EAAwB;AACjD,EAAA,IAAI,MAAA,IAAU,GAAG,OAAO,CAAA,QAAA;AACxB,EAAA,OAAO,EAAA,GAAK,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAC/B;AAQO,SAAS,SAAA,CAAU,MAAA,EAAsB,SAAA,GAAoB,IAAA,EAAgB;AAClF,EAAA,MAAM,GAAA,GAAM,aAAa,MAAM,CAAA;AAC/B,EAAA,OAAO,GAAA,GAAM,SAAA;AACf;AAOO,SAAS,mBAAA,CAAoB,MAAA,GAAsB,EAAC,EAA0B;AACnF,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,OAAO,UAAA,IAAc,IAAA;AAAA,IACjC,YAAA,EAAc,OAAO,QAAA,IAAY,CAAA;AAAA,IACjC,gBAAA,EAAkB,IAAA;AAAA,IAClB,gBAAA,EAAkB,IAAA;AAAA,IAClB,eAAA,EAAiB;AAAA,GACnB;AACF;AAQO,SAAS,iBAAA,CAAkB,SAAiB,UAAA,EAA4B;AAC7E,EAAA,OAAQ,UAAU,UAAA,GAAc,GAAA;AAClC;AAQO,SAAS,iBAAA,CAAkB,YAAoB,UAAA,EAA4B;AAChF,EAAA,OAAO,IAAA,CAAK,KAAA,CAAO,UAAA,GAAa,GAAA,GAAQ,UAAU,CAAA;AACpD;;;ACjKO,IAAM,OAAA,GAAU;AAKhB,IAAM,YAAA,GAAe;AAsCrB,SAAS,kBAAkB,MAAA,EAAqD;AACrF,EAAA,QAAQ,OAAO,QAAA;AAAU,IACvB,KAAA,YAAA;AACE,MAAA,OAAO,IAAI,kBAAkB,MAAM,CAAA;AAAA,IAErC,KAAA,UAAA;AACE,MAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AAClB,QAAA,MAAM,IAAI,kBAAA;AAAA,UACR,2CAAA;AAAA,UAAA,gBAAA;AAAA,UAAA,UAAA;AAAA,SAGF;AAAA,MACF;AACA,MAAA,OAAO,IAAI,iBAAiB,MAAM,CAAA;AAAA,IAEpC,KAAA,YAAA;AACE,MAAA,IAAI,CAAC,OAAO,MAAA,EAAQ;AAClB,QAAA,MAAM,IAAI,kBAAA;AAAA,UACR,6CAAA;AAAA,UAAA,gBAAA;AAAA,UAAA,YAAA;AAAA,SAGF;AAAA,MACF;AACA,MAAA,OAAO,IAAI,mBAAmB,MAAM,CAAA;AAAA,IAEtC,KAAA,QAAA;AACE,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,gDAAA;AAAA,QAAA,gBAAA;AAAA,OAEF;AAAA,IAEF;AACE,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,CAAA,sBAAA,EAAyB,OAAO,QAAQ,CAAA,CAAA;AAAA,QAAA,gBAAA;AAAA,OAE1C;AAAA;AAEN;AAkBO,SAAS,aAAA,CACd,QACA,aAAA,EACsB;AACtB,EAAA,MAAM,QAAA,GAAW,kBAAkB,MAAM,CAAA;AACzC,EAAA,OAAO,IAAI,oBAAA,CAAqB,QAAA,EAAU,aAAa,CAAA;AACzD;AAoBA,eAAsB,UAAA,CAAW,OAAA,GAA6B,EAAC,EAAkC;AAC/F,EAAA,MAAM;AAAA,IACJ,QAAA,EAAU,iBAAA;AAAA,IACV,MAAA;AAAA,IACA,QAAA,GAAW,OAAA;AAAA,IACX,YAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,cAAA,GAAiB,IAAA;AAAA,IACjB,WAAA,GAAc;AAAA,GAChB,GAAI,OAAA;AAGJ,EAAA,IAAI,QAAA,GAAW,iBAAA;AACf,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,IAAI,MAAA,EAAQ;AAEV,MAAA,QAAA,GAAA,UAAA;AAAA,IACF,CAAA,MAAA,IAAW,OAAO,MAAA,KAAW,WAAA,EAAa;AAExC,MAAA,MAAM,YAAA,GAAe,CAAC,EAAE,MAAA,CAAO,qBAAqB,MAAA,CAAO,uBAAA,CAAA;AAC3D,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,QAAA,GAAA,YAAA;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,IAAI,kBAAA;AAAA,UACR,iFAAA;AAAA,UAAA,qBAAA;AAAA,SAEF;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,kBAAA;AAAA,QACR,mDAAA;AAAA,QAAA,gBAAA;AAAA,OAEF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,mBAAA,GAA2C;AAAA,IAC/C,QAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,aAAA,GAA+B;AAAA,IACnC;AAAA,GACF;AAGA,EAAA,MAAM,WAAA,GAAc,kBAAkB,mBAAmB,CAAA;AACzD,EAAA,MAAM,OAAA,GAAU,IAAI,oBAAA,CAAqB,WAAA,EAAa,aAAa,CAAA;AAGnE,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,WAAA,CAAY,EAAA,CAAG,cAAc,YAAY,CAAA;AAAA,EAC3C;AACA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,WAAA,CAAY,EAAA,CAAG,SAAS,OAAO,CAAA;AAAA,EACjC;AACA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,WAAA,CAAY,EAAA,CAAG,SAAS,OAAO,CAAA;AAAA,EACjC;AACA,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,WAAA,CAAY,EAAA,CAAG,QAAQ,MAAM,CAAA;AAAA,EAC/B;AAGA,EAAA,IAAI;AACF,IAAA,MAAM,YAAY,UAAA,EAAW;AAC7B,IAAA,MAAM,QAAQ,KAAA,EAAM;AAAA,EACtB,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,OAAA,IAAW,iBAAiB,kBAAA,EAAoB;AAClD,MAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,IACf;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AAEA,EAAA,OAAO,OAAA;AACT;AAOO,SAAS,oBAAoB,QAAA,EAA0C;AAC5E,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAA,YAAA;AACE,MAAA,OAAO,IAAI,iBAAA,CAAkB,EAAE,QAAA,EAAU,EAAE,WAAA,EAAY;AAAA,IACzD,KAAA,UAAA;AACE,MAAA,OAAO,IAAI,iBAAiB,EAAE,QAAA,EAAU,QAAQ,MAAA,EAAQ,EAAE,WAAA,EAAY;AAAA,IACxE,KAAA,YAAA;AACE,MAAA,OAAO,IAAI,mBAAmB,EAAE,QAAA,EAAU,QAAQ,MAAA,EAAQ,EAAE,WAAA,EAAY;AAAA,IAC1E;AACE,MAAA,OAAO,KAAA;AAAA;AAEb;AAMO,SAAS,qBAAA,GAAiD;AAC/D,EAAA,MAAM,YAAqC,EAAC;AAE5C,EAAA,IAAI,oDAAsD,EAAG;AAC3D,IAAA,SAAA,CAAU,IAAA,CAAA,YAAA,oBAAuC;AAAA,EACnD;AACA,EAAA,IAAI,8CAAkD,EAAG;AACvD,IAAA,SAAA,CAAU,IAAA,CAAA,UAAA,gBAAmC;AAAA,EAC/C;AACA,EAAA,IAAI,kDAAoD,EAAG;AACzD,IAAA,SAAA,CAAU,IAAA,CAAA,YAAA,kBAAqC;AAAA,EACjD;AAEA,EAAA,OAAO,SAAA;AACT;AAGA,IAAO,aAAA,GAAQ;AAAA,EACb,OAAA;AAAA,EACA,YAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,UAAA;AAAA,EACA,mBAAA;AAAA,EACA,qBAAA;AAAA,EACA,qBAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA,kBAAA;AAAA,EACA,oBAAA;AAAA,EACA;AACF","file":"index.mjs","sourcesContent":["/**\n * Lightweight EventEmitter implementation for browser and Node.js compatibility\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class EventEmitter<TEvents extends Record<string, (...args: any[]) => void> = Record<string, (...args: any[]) => void>> {\n private events: Map<keyof TEvents, Set<Function>> = new Map();\n\n /**\n * Subscribe to an event\n * @param event - Event name to subscribe to\n * @param listener - Callback function\n */\n on<K extends keyof TEvents>(event: K, listener: TEvents[K]): this {\n if (!this.events.has(event)) {\n this.events.set(event, new Set());\n }\n this.events.get(event)!.add(listener);\n return this;\n }\n\n /**\n * Unsubscribe from an event\n * @param event - Event name to unsubscribe from\n * @param listener - Callback function to remove\n */\n off<K extends keyof TEvents>(event: K, listener: TEvents[K]): this {\n const listeners = this.events.get(event);\n if (listeners) {\n listeners.delete(listener);\n if (listeners.size === 0) {\n this.events.delete(event);\n }\n }\n return this;\n }\n\n /**\n * Subscribe to an event for one-time notification\n * @param event - Event name to subscribe to\n * @param listener - Callback function\n */\n once<K extends keyof TEvents>(event: K, listener: TEvents[K]): this {\n const onceWrapper = ((...args: Parameters<TEvents[K]>) => {\n this.off(event, onceWrapper as TEvents[K]);\n (listener as Function).apply(this, args);\n }) as TEvents[K];\n return this.on(event, onceWrapper);\n }\n\n /**\n * Emit an event to all subscribers\n * @param event - Event name to emit\n * @param args - Arguments to pass to listeners\n */\n protected emit<K extends keyof TEvents>(event: K, ...args: Parameters<TEvents[K]>): boolean {\n const listeners = this.events.get(event);\n if (!listeners || listeners.size === 0) {\n return false;\n }\n listeners.forEach(listener => {\n try {\n listener.apply(this, args);\n } catch (error) {\n // Prevent listener errors from breaking event emission\n console.error(`Error in event listener for \"${String(event)}\":`, error);\n }\n });\n return true;\n }\n\n /**\n * Remove all listeners for an event, or all listeners if no event specified\n * @param event - Optional event name\n */\n removeAllListeners<K extends keyof TEvents>(event?: K): this {\n if (event !== undefined) {\n this.events.delete(event);\n } else {\n this.events.clear();\n }\n return this;\n }\n\n /**\n * Get the number of listeners for an event\n * @param event - Event name\n */\n listenerCount<K extends keyof TEvents>(event: K): number {\n const listeners = this.events.get(event);\n return listeners ? listeners.size : 0;\n }\n\n /**\n * Get all event names that have listeners\n */\n eventNames(): (keyof TEvents)[] {\n return Array.from(this.events.keys());\n }\n}\n","/**\n * Supported transcription providers\n */\nexport enum TranscriptionProvider {\n /** Browser-native Web Speech API */\n WebSpeechAPI = 'web-speech',\n /** Deepgram real-time transcription */\n Deepgram = 'deepgram',\n /** AssemblyAI real-time transcription */\n AssemblyAI = 'assemblyai',\n /** Custom provider implementation */\n Custom = 'custom',\n}\n\n/**\n * Audio encoding formats\n */\nexport enum AudioEncoding {\n /** 16-bit signed little-endian linear PCM */\n LINEAR16 = 'linear16',\n /** G.711 mu-law */\n MULAW = 'mulaw',\n /** G.711 A-law */\n ALAW = 'alaw',\n /** Opus encoding */\n OPUS = 'opus',\n}\n\n/**\n * Audio configuration options\n */\nexport interface AudioConfig {\n /** Sample rate in Hz (default: 16000) */\n sampleRate?: number;\n /** Number of audio channels (default: 1) */\n channels?: number;\n /** Bit depth (default: 16) */\n bitDepth?: number;\n /** Audio encoding format */\n encoding?: AudioEncoding;\n}\n\n/**\n * Main configuration for transcription\n */\nexport interface TranscriptionConfig {\n /** The transcription provider to use */\n provider: TranscriptionProvider;\n /** API key for cloud providers (Deepgram, AssemblyAI) */\n apiKey?: string;\n /** Language code (default: 'en-US') */\n language?: string;\n /** Whether to return interim results (default: true) */\n interimResults?: boolean;\n /** Enable profanity filter (default: false) */\n profanityFilter?: boolean;\n /** Enable automatic punctuation (default: true) */\n punctuation?: boolean;\n /** Audio configuration options */\n audioConfig?: AudioConfig;\n /** Provider-specific options */\n providerOptions?: Record<string, unknown>;\n}\n\n/**\n * Default audio configuration values\n */\nexport const DEFAULT_AUDIO_CONFIG: Required<AudioConfig> = {\n sampleRate: 16000,\n channels: 1,\n bitDepth: 16,\n encoding: AudioEncoding.LINEAR16,\n};\n\n/**\n * Default transcription configuration values\n */\nexport const DEFAULT_TRANSCRIPTION_CONFIG: Partial<TranscriptionConfig> = {\n language: 'en-US',\n interimResults: true,\n profanityFilter: false,\n punctuation: true,\n};\n","import type { TranscriptionProvider } from './config';\n\n/**\n * Possible states of a transcription session\n */\nexport enum SessionState {\n /** Session has not started */\n IDLE = 'idle',\n /** Session is initializing (connecting to provider, requesting mic access) */\n INITIALIZING = 'initializing',\n /** Session is actively transcribing */\n ACTIVE = 'active',\n /** Session is paused */\n PAUSED = 'paused',\n /** Session is stopping */\n STOPPING = 'stopping',\n /** Session has stopped */\n STOPPED = 'stopped',\n /** Session encountered an error */\n ERROR = 'error',\n}\n\n/**\n * Configuration options for a transcription session\n */\nexport interface SessionConfig {\n /** Whether to record audio during the session (default: false) */\n recordAudio?: boolean;\n /** Maximum session duration in milliseconds */\n maxDuration?: number;\n /** Auto-stop after silence duration in milliseconds */\n silenceTimeout?: number;\n /** Enable Voice Activity Detection (default: false) */\n enableVAD?: boolean;\n /** VAD sensitivity threshold (0-1, default: 0.5) */\n vadThreshold?: number;\n}\n\n/**\n * Metadata about a transcription session\n */\nexport interface SessionMetadata {\n /** Unique session identifier */\n id: string;\n /** Session start time (Unix timestamp) */\n startTime: number;\n /** Session end time (Unix timestamp) */\n endTime?: number;\n /** Session duration in milliseconds */\n duration?: number;\n /** Total word count in the session */\n wordCount: number;\n /** Provider used for the session */\n provider: TranscriptionProvider;\n}\n\n/**\n * Default session configuration values\n */\nexport const DEFAULT_SESSION_CONFIG: Required<SessionConfig> = {\n recordAudio: false,\n maxDuration: 0, // 0 means no limit\n silenceTimeout: 0, // 0 means no auto-stop\n enableVAD: false,\n vadThreshold: 0.5,\n};\n\n/**\n * Statistics for all managed sessions\n */\nexport interface SessionStats {\n /** Total number of sessions */\n totalSessions: number;\n /** Number of currently active sessions */\n activeSessions: number;\n /** Total number of transcripts across all sessions */\n totalTranscripts: number;\n /** Total duration across all sessions in ms */\n totalDuration: number;\n /** Average confidence score */\n averageConfidence: number;\n}\n\n/**\n * Statistics for a single session\n */\nexport interface SessionStatistics {\n /** Total word count */\n wordCount: number;\n /** Average confidence score */\n averageConfidence: number;\n /** Speaking rate in words per minute */\n speakingRate: number;\n /** Number of silence periods */\n silencePeriods: number;\n /** Total duration in milliseconds */\n durationMs: number;\n /** Number of transcripts */\n transcriptCount: number;\n}\n\n/**\n * Options for merging transcripts\n */\nexport interface MergeOptions {\n /** Separator between transcripts */\n separator?: string;\n /** Include timestamps */\n includeTimestamps?: boolean;\n /** Include speaker labels */\n includeSpeakers?: boolean;\n /** Only include final transcripts */\n finalOnly?: boolean;\n}\n\n/**\n * Supported export formats\n */\nexport type ExportFormat = 'json' | 'text' | 'srt' | 'vtt' | 'csv';\n\n/**\n * Result of exporting a session\n */\nexport interface ExportResult {\n /** Export format used */\n format: ExportFormat;\n /** Exported data */\n data: string | ArrayBuffer;\n /** Suggested filename */\n filename: string;\n /** MIME type */\n mimeType: string;\n}\n\n/**\n * Data structure for importing a session\n */\nexport interface SessionImport {\n /** Session metadata */\n metadata: SessionMetadata;\n /** Transcript results */\n transcripts: import('./transcription').TranscriptionResult[];\n /** Session configuration */\n config: SessionConfig;\n}\n\n/**\n * Full session export data\n */\nexport interface SessionExportData {\n /** Export version */\n version: string;\n /** Session data */\n session: SessionImport;\n /** Export timestamp */\n exportedAt: number;\n}\n\n/**\n * Options for text export\n */\nexport interface TextExportOptions {\n /** Include timestamps */\n includeTimestamps?: boolean;\n /** Include speaker labels */\n includeSpeakers?: boolean;\n /** Include confidence scores */\n includeConfidence?: boolean;\n /** Add paragraph breaks */\n paragraphBreaks?: boolean;\n}\n\n/**\n * Options for CSV export\n */\nexport interface CSVExportOptions {\n /** Column delimiter */\n delimiter?: string;\n /** Include header row */\n includeHeaders?: boolean;\n /** Columns to include */\n columns?: string[];\n}\n","import type { TranscriptionResult } from './transcription';\nimport type { SessionState } from './session';\nimport type { TranscriptionProvider } from './config';\n\n/**\n * Error codes for transcription errors\n */\nexport enum ErrorCode {\n /** Failed to initialize the provider */\n INITIALIZATION_FAILED = 'initialization_failed',\n /** Failed to connect to the transcription service */\n CONNECTION_FAILED = 'connection_failed',\n /** API key invalid or authentication failed */\n AUTHENTICATION_FAILED = 'authentication_failed',\n /** Microphone access was denied by the user */\n MICROPHONE_ACCESS_DENIED = 'microphone_access_denied',\n /** Browser does not support required features */\n UNSUPPORTED_BROWSER = 'unsupported_browser',\n /** Network error during transcription */\n NETWORK_ERROR = 'network_error',\n /** Provider-specific error */\n PROVIDER_ERROR = 'provider_error',\n /** Invalid configuration provided */\n INVALID_CONFIG = 'invalid_config',\n /** Session has expired */\n SESSION_EXPIRED = 'session_expired',\n /** Unknown error occurred */\n UNKNOWN_ERROR = 'unknown_error',\n}\n\n/**\n * Custom error class for transcription errors\n */\nexport class TranscriptionError extends Error {\n /** Error code identifying the type of error */\n public readonly code: ErrorCode;\n /** Provider that generated the error */\n public readonly provider?: TranscriptionProvider;\n /** Additional error details */\n public readonly details?: unknown;\n\n constructor(\n message: string,\n code: ErrorCode,\n provider?: TranscriptionProvider,\n details?: unknown\n ) {\n super(message);\n this.name = 'TranscriptionError';\n this.code = code;\n this.provider = provider;\n this.details = details;\n\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, TranscriptionError);\n }\n }\n}\n\n/**\n * Event map for transcription events\n * Used for type-safe event handling\n */\nexport interface TranscriptionEvents {\n /** Emitted for any transcription result (interim or final) */\n transcript: (result: TranscriptionResult) => void;\n /** Emitted for interim (non-final) transcription results */\n interim: (result: TranscriptionResult) => void;\n /** Emitted for final transcription results */\n final: (result: TranscriptionResult) => void;\n /** Emitted when transcription starts */\n start: () => void;\n /** Emitted when transcription stops */\n stop: () => void;\n /** Emitted when transcription is paused */\n pause: () => void;\n /** Emitted when transcription is resumed */\n resume: () => void;\n /** Emitted when an error occurs */\n error: (error: TranscriptionError) => void;\n /** Emitted when session state changes */\n stateChange: (state: SessionState) => void;\n /** Emitted with current audio level (0-1) */\n audioLevel: (level: number) => void;\n /** Emitted when silence is detected */\n silence: () => void;\n /** Emitted when speech is detected */\n speech: () => void;\n /** Index signature for extensibility */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [key: string]: (...args: any[]) => void;\n}\n\n/**\n * Type for event names\n */\nexport type TranscriptionEventName = keyof TranscriptionEvents;\n","import { EventEmitter } from './EventEmitter';\nimport type {\n TranscriptionConfig,\n TranscriptionResult,\n SessionState,\n SessionMetadata,\n TranscriptionEvents,\n ITranscriptionProvider,\n TranscriptionProvider,\n} from '../types';\nimport {\n SessionState as SessionStateEnum,\n TranscriptionError,\n ErrorCode,\n DEFAULT_TRANSCRIPTION_CONFIG,\n} from '../types';\n\n/**\n * Abstract base class for all transcription providers\n * Provides common functionality including event handling, session management,\n * and audio recording capabilities\n */\nexport abstract class BaseTranscriber\n extends EventEmitter<TranscriptionEvents>\n implements ITranscriptionProvider\n{\n /** Transcription configuration */\n protected config: TranscriptionConfig;\n\n /** Current session state */\n protected state: SessionState = SessionStateEnum.IDLE;\n\n /** Session metadata */\n protected sessionMetadata: SessionMetadata;\n\n /** Recorded audio chunks */\n protected audioRecording: ArrayBuffer[] = [];\n\n /** Session start timestamp */\n protected startTime?: number;\n\n /** Word count in current session */\n protected wordCount: number = 0;\n\n /**\n * Create a new BaseTranscriber instance\n * @param config - Transcription configuration\n */\n constructor(config: TranscriptionConfig) {\n super();\n this.config = { ...DEFAULT_TRANSCRIPTION_CONFIG, ...config };\n this.sessionMetadata = this.initializeMetadata();\n this.validateConfig();\n }\n\n // ==================== Abstract Methods ====================\n\n /**\n * Initialize the provider with configuration\n * Must be implemented by concrete providers\n */\n abstract initialize(): Promise<void>;\n\n /**\n * Start transcription\n * Must be implemented by concrete providers\n */\n abstract start(): Promise<void>;\n\n /**\n * Stop transcription\n * Must be implemented by concrete providers\n */\n abstract stop(): Promise<void>;\n\n /**\n * Pause transcription\n * Must be implemented by concrete providers\n */\n abstract pause(): void;\n\n /**\n * Resume transcription after pause\n * Must be implemented by concrete providers\n */\n abstract resume(): void;\n\n /**\n * Send audio data to the provider\n * Must be implemented by concrete providers\n * @param audioData - Raw audio data\n */\n abstract sendAudio(audioData: ArrayBuffer): void;\n\n /**\n * Check if provider is supported in current environment\n * Must be implemented by concrete providers\n */\n abstract isSupported(): boolean;\n\n /**\n * Clean up resources and connections\n * Must be implemented by concrete providers\n */\n abstract cleanup(): Promise<void>;\n\n // ==================== Public Helper Methods ====================\n\n /**\n * Get the current session state\n */\n getState(): SessionState {\n return this.state;\n }\n\n /**\n * Get session metadata\n */\n getMetadata(): SessionMetadata {\n return {\n ...this.sessionMetadata,\n duration: this.calculateDuration(),\n wordCount: this.wordCount,\n };\n }\n\n /**\n * Get recorded audio data\n * @returns Combined audio data or null if not recording\n */\n getRecording(): ArrayBuffer | null {\n if (this.audioRecording.length === 0) {\n return null;\n }\n\n const totalLength = this.audioRecording.reduce((acc, chunk) => acc + chunk.byteLength, 0);\n const combined = new ArrayBuffer(totalLength);\n const view = new Uint8Array(combined);\n let offset = 0;\n\n for (const chunk of this.audioRecording) {\n view.set(new Uint8Array(chunk), offset);\n offset += chunk.byteLength;\n }\n\n return combined;\n }\n\n // ==================== Protected Helper Methods ====================\n\n /**\n * Update session state and emit state change event\n * @param newState - New session state\n */\n protected setState(newState: SessionState): void {\n const previousState = this.state;\n this.state = newState;\n\n if (newState === SessionStateEnum.ACTIVE && !this.startTime) {\n this.startTime = Date.now();\n this.sessionMetadata.startTime = this.startTime;\n }\n\n if (newState === SessionStateEnum.STOPPED || newState === SessionStateEnum.ERROR) {\n this.sessionMetadata.endTime = Date.now();\n this.sessionMetadata.duration = this.calculateDuration();\n }\n\n if (previousState !== newState) {\n this.emit('stateChange', newState);\n }\n }\n\n /**\n * Handle incoming transcription result\n * @param result - Transcription result from provider\n */\n protected handleTranscript(result: TranscriptionResult): void {\n // Update word count from final results\n if (result.isFinal && result.text) {\n const words = result.text.trim().split(/\\s+/).filter(w => w.length > 0);\n this.wordCount += words.length;\n }\n\n // Emit events\n this.emit('transcript', result);\n\n if (result.isFinal) {\n this.emit('final', result);\n } else {\n this.emit('interim', result);\n }\n }\n\n /**\n * Handle errors and emit error event\n * @param error - Error to handle\n */\n protected handleError(error: Error | TranscriptionError): void {\n let transcriptionError: TranscriptionError;\n\n if (error instanceof TranscriptionError) {\n transcriptionError = error;\n } else {\n transcriptionError = new TranscriptionError(\n error.message,\n ErrorCode.UNKNOWN_ERROR,\n this.config.provider,\n error\n );\n }\n\n this.setState(SessionStateEnum.ERROR);\n this.emit('error', transcriptionError);\n }\n\n /**\n * Validate configuration\n * @throws TranscriptionError if configuration is invalid\n */\n protected validateConfig(): void {\n if (!this.config.provider) {\n throw new TranscriptionError(\n 'Provider must be specified in configuration',\n ErrorCode.INVALID_CONFIG\n );\n }\n\n // Cloud providers require API key\n const cloudProviders: TranscriptionProvider[] = ['deepgram', 'assemblyai'] as TranscriptionProvider[];\n if (cloudProviders.includes(this.config.provider) && !this.config.apiKey) {\n throw new TranscriptionError(\n `API key is required for ${this.config.provider} provider`,\n ErrorCode.INVALID_CONFIG,\n this.config.provider\n );\n }\n }\n\n /**\n * Record audio data if recording is enabled\n * @param data - Audio data to record\n */\n protected recordAudioData(data: ArrayBuffer): void {\n this.audioRecording.push(data.slice(0));\n }\n\n /**\n * Calculate session duration\n * @returns Duration in milliseconds\n */\n protected calculateDuration(): number {\n if (!this.startTime) {\n return 0;\n }\n const endTime = this.sessionMetadata.endTime || Date.now();\n return endTime - this.startTime;\n }\n\n /**\n * Clear recording data\n */\n protected clearRecording(): void {\n this.audioRecording = [];\n }\n\n /**\n * Reset session state for new session\n */\n protected resetSession(): void {\n this.state = SessionStateEnum.IDLE;\n this.startTime = undefined;\n this.wordCount = 0;\n this.audioRecording = [];\n this.sessionMetadata = this.initializeMetadata();\n }\n\n // ==================== Private Helper Methods ====================\n\n /**\n * Generate a unique session ID\n */\n private generateSessionId(): string {\n // Generate UUID v4\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n\n /**\n * Initialize session metadata\n */\n private initializeMetadata(): SessionMetadata {\n return {\n id: this.generateSessionId(),\n startTime: 0,\n wordCount: 0,\n provider: this.config.provider,\n };\n }\n}\n","import type { TranscriptionResult, SessionMetadata, SessionExportData } from '../../types';\n\n/**\n * Session data for JSON export\n */\ninterface SessionData {\n metadata: SessionMetadata;\n transcripts: TranscriptionResult[];\n}\n\n/**\n * Exports transcription sessions to JSON format\n */\nexport class JSONExporter {\n /**\n * Export session to minified JSON string\n * @param session - Session data to export\n * @returns JSON string\n */\n static export(session: SessionData): string {\n const exportData: SessionExportData = {\n version: '1.0.0',\n session: {\n metadata: session.metadata,\n transcripts: session.transcripts,\n config: {},\n },\n exportedAt: Date.now(),\n };\n return JSON.stringify(exportData);\n }\n\n /**\n * Export session to formatted/pretty JSON string\n * @param session - Session data to export\n * @param indent - Indentation spaces (default: 2)\n * @returns Formatted JSON string\n */\n static exportPretty(session: SessionData, indent: number = 2): string {\n const exportData: SessionExportData = {\n version: '1.0.0',\n session: {\n metadata: session.metadata,\n transcripts: session.transcripts,\n config: {},\n },\n exportedAt: Date.now(),\n };\n return JSON.stringify(exportData, null, indent);\n }\n\n /**\n * Parse JSON and validate structure\n * @param json - JSON string to parse\n * @returns Parsed session export data\n */\n static parse(json: string): SessionExportData {\n const data = JSON.parse(json) as SessionExportData;\n\n if (!data.version || !data.session) {\n throw new Error('Invalid session export format');\n }\n\n return data;\n }\n}\n","import type { TranscriptionResult, TextExportOptions } from '../../types';\n\n/**\n * Session data for text export\n */\ninterface SessionData {\n transcripts: TranscriptionResult[];\n}\n\n/**\n * Exports transcription sessions to plain text format\n */\nexport class TextExporter {\n /**\n * Export session transcripts to plain text\n * @param session - Session data to export\n * @param options - Export options\n * @returns Plain text string\n */\n static export(session: SessionData, options: TextExportOptions = {}): string {\n const {\n includeTimestamps = false,\n includeSpeakers = false,\n includeConfidence = false,\n paragraphBreaks = false,\n } = options;\n\n const lines: string[] = [];\n const finalTranscripts = session.transcripts.filter(t => t.isFinal);\n\n for (const transcript of finalTranscripts) {\n let line = '';\n\n if (includeTimestamps && transcript.timestamp) {\n const time = new Date(transcript.timestamp).toISOString().substr(11, 8);\n line += `[${time}] `;\n }\n\n if (includeSpeakers && transcript.speaker) {\n line += `${transcript.speaker}: `;\n }\n\n line += transcript.text;\n\n if (includeConfidence && transcript.confidence !== undefined) {\n line += ` (${Math.round(transcript.confidence * 100)}%)`;\n }\n\n lines.push(line);\n }\n\n const separator = paragraphBreaks ? '\\n\\n' : ' ';\n return lines.join(separator).trim();\n }\n\n /**\n * Export as continuous text without any formatting\n * @param session - Session data to export\n * @returns Plain text string\n */\n static exportPlain(session: SessionData): string {\n return session.transcripts\n .filter(t => t.isFinal)\n .map(t => t.text)\n .join(' ')\n .trim();\n }\n}\n","import type { TranscriptionResult } from '../../types';\n\n/**\n * Session data for SRT export\n */\ninterface SessionData {\n transcripts: TranscriptionResult[];\n}\n\n/**\n * Exports transcription sessions to SRT (SubRip) subtitle format\n */\nexport class SRTExporter {\n /**\n * Export session transcripts to SRT format\n * @param session - Session data to export\n * @returns SRT formatted string\n */\n static export(session: SessionData): string {\n const finalTranscripts = session.transcripts.filter(t => t.isFinal);\n const lines: string[] = [];\n let sequenceNumber = 1;\n\n // Calculate timing based on words or estimate\n let currentTime = 0;\n\n for (const transcript of finalTranscripts) {\n if (!transcript.text.trim()) continue;\n\n let startTime = currentTime;\n let endTime: number;\n\n // Use word timing if available\n if (transcript.words && transcript.words.length > 0) {\n startTime = transcript.words[0].start;\n endTime = transcript.words[transcript.words.length - 1].end;\n } else {\n // Estimate duration based on word count (average ~150 words per minute)\n const wordCount = transcript.text.split(/\\s+/).length;\n const durationMs = (wordCount / 150) * 60 * 1000;\n endTime = startTime + Math.max(durationMs, 1000);\n }\n\n lines.push(String(sequenceNumber));\n lines.push(`${this.formatTime(startTime)} --> ${this.formatTime(endTime)}`);\n lines.push(transcript.text);\n lines.push('');\n\n sequenceNumber++;\n currentTime = endTime + 100; // Small gap between subtitles\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Format milliseconds to SRT timestamp format (HH:MM:SS,mmm)\n * @param ms - Time in milliseconds\n * @returns Formatted timestamp\n */\n private static formatTime(ms: number): string {\n const totalSeconds = Math.floor(ms / 1000);\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n const milliseconds = Math.floor(ms % 1000);\n\n return `${this.pad(hours, 2)}:${this.pad(minutes, 2)}:${this.pad(seconds, 2)},${this.pad(milliseconds, 3)}`;\n }\n\n /**\n * Pad number with leading zeros\n * @param num - Number to pad\n * @param length - Target length\n * @returns Padded string\n */\n private static pad(num: number, length: number): string {\n return String(num).padStart(length, '0');\n }\n}\n","import type { TranscriptionResult } from '../../types';\n\n/**\n * Session data for VTT export\n */\ninterface SessionData {\n transcripts: TranscriptionResult[];\n}\n\n/**\n * Exports transcription sessions to WebVTT subtitle format\n */\nexport class VTTExporter {\n /**\n * Export session transcripts to WebVTT format\n * @param session - Session data to export\n * @returns WebVTT formatted string\n */\n static export(session: SessionData): string {\n const finalTranscripts = session.transcripts.filter(t => t.isFinal);\n const lines: string[] = ['WEBVTT', ''];\n\n // Calculate timing based on words or estimate\n let currentTime = 0;\n\n for (const transcript of finalTranscripts) {\n if (!transcript.text.trim()) continue;\n\n let startTime = currentTime;\n let endTime: number;\n\n // Use word timing if available\n if (transcript.words && transcript.words.length > 0) {\n startTime = transcript.words[0].start;\n endTime = transcript.words[transcript.words.length - 1].end;\n } else {\n // Estimate duration based on word count\n const wordCount = transcript.text.split(/\\s+/).length;\n const durationMs = (wordCount / 150) * 60 * 1000;\n endTime = startTime + Math.max(durationMs, 1000);\n }\n\n lines.push(`${this.formatTime(startTime)} --> ${this.formatTime(endTime)}`);\n\n // Add speaker if available\n if (transcript.speaker) {\n lines.push(`<v ${transcript.speaker}>${transcript.text}`);\n } else {\n lines.push(transcript.text);\n }\n\n lines.push('');\n currentTime = endTime + 100;\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Export with cue identifiers\n * @param session - Session data to export\n * @param cuePrefix - Prefix for cue identifiers\n * @returns WebVTT formatted string with cue IDs\n */\n static exportWithCues(session: SessionData, cuePrefix: string = 'cue'): string {\n const finalTranscripts = session.transcripts.filter(t => t.isFinal);\n const lines: string[] = ['WEBVTT', ''];\n let cueNumber = 1;\n let currentTime = 0;\n\n for (const transcript of finalTranscripts) {\n if (!transcript.text.trim()) continue;\n\n let startTime = currentTime;\n let endTime: number;\n\n if (transcript.words && transcript.words.length > 0) {\n startTime = transcript.words[0].start;\n endTime = transcript.words[transcript.words.length - 1].end;\n } else {\n const wordCount = transcript.text.split(/\\s+/).length;\n const durationMs = (wordCount / 150) * 60 * 1000;\n endTime = startTime + Math.max(durationMs, 1000);\n }\n\n lines.push(`${cuePrefix}-${cueNumber}`);\n lines.push(`${this.formatTime(startTime)} --> ${this.formatTime(endTime)}`);\n lines.push(transcript.text);\n lines.push('');\n\n cueNumber++;\n currentTime = endTime + 100;\n }\n\n return lines.join('\\n');\n }\n\n /**\n * Format milliseconds to WebVTT timestamp format (HH:MM:SS.mmm)\n * @param ms - Time in milliseconds\n * @returns Formatted timestamp\n */\n private static formatTime(ms: number): string {\n const totalSeconds = Math.floor(ms / 1000);\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n const milliseconds = Math.floor(ms % 1000);\n\n return `${this.pad(hours, 2)}:${this.pad(minutes, 2)}:${this.pad(seconds, 2)}.${this.pad(milliseconds, 3)}`;\n }\n\n /**\n * Pad number with leading zeros\n */\n private static pad(num: number, length: number): string {\n return String(num).padStart(length, '0');\n }\n}\n","import type { TranscriptionResult, CSVExportOptions } from '../../types';\n\n/**\n * Session data for CSV export\n */\ninterface SessionData {\n transcripts: TranscriptionResult[];\n}\n\n/**\n * Exports transcription sessions to CSV format\n */\nexport class CSVExporter {\n /**\n * Export session transcripts to CSV format\n * @param session - Session data to export\n * @param options - Export options\n * @returns CSV formatted string\n */\n static export(session: SessionData, options: CSVExportOptions = {}): string {\n const {\n delimiter = ',',\n includeHeaders = true,\n columns = ['timestamp', 'text', 'isFinal', 'confidence', 'speaker'],\n } = options;\n\n const rows: string[] = [];\n\n // Add header row\n if (includeHeaders) {\n rows.push(columns.map(col => this.escapeField(col, delimiter)).join(delimiter));\n }\n\n // Add data rows\n for (const transcript of session.transcripts) {\n const values = columns.map(col => {\n const value = this.getFieldValue(transcript, col);\n return this.escapeField(String(value), delimiter);\n });\n rows.push(values.join(delimiter));\n }\n\n return rows.join('\\n');\n }\n\n /**\n * Export only final transcripts\n * @param session - Session data to export\n * @param options - Export options\n * @returns CSV formatted string\n */\n static exportFinalOnly(session: SessionData, options: CSVExportOptions = {}): string {\n const filteredSession = {\n transcripts: session.transcripts.filter(t => t.isFinal),\n };\n return this.export(filteredSession, options);\n }\n\n /**\n * Get field value from transcript\n * @param transcript - Transcription result\n * @param field - Field name\n * @returns Field value\n */\n private static getFieldValue(transcript: TranscriptionResult, field: string): string | number | boolean {\n switch (field) {\n case 'timestamp':\n return transcript.timestamp || '';\n case 'text':\n return transcript.text || '';\n case 'isFinal':\n return transcript.isFinal;\n case 'confidence':\n return transcript.confidence !== undefined ? transcript.confidence : '';\n case 'speaker':\n return transcript.speaker || '';\n case 'language':\n return transcript.language || '';\n case 'wordCount':\n return transcript.text ? transcript.text.split(/\\s+/).filter(w => w).length : 0;\n case 'startTime':\n return transcript.words?.[0]?.start || '';\n case 'endTime':\n return transcript.words?.[transcript.words.length - 1]?.end || '';\n default:\n return '';\n }\n }\n\n /**\n * Escape field for CSV format\n * @param field - Field value\n * @param delimiter - CSV delimiter\n * @returns Escaped field\n */\n private static escapeField(field: string, delimiter: string): string {\n // Check if field needs quoting\n if (field.includes(delimiter) || field.includes('\"') || field.includes('\\n') || field.includes('\\r')) {\n // Escape quotes by doubling them\n const escaped = field.replace(/\"/g, '\"\"');\n return `\"${escaped}\"`;\n }\n return field;\n }\n}\n","import type {\n ITranscriptionProvider,\n SessionConfig,\n SessionState,\n SessionMetadata,\n TranscriptionResult,\n SessionStatistics,\n ExportFormat,\n ExportResult,\n} from '../types';\nimport { SessionState as SessionStateEnum, DEFAULT_SESSION_CONFIG } from '../types';\nimport { JSONExporter, TextExporter, SRTExporter, VTTExporter, CSVExporter } from '../utils/exporters';\n\n/**\n * Session export data structure\n */\nexport interface SessionExport {\n /** Session metadata */\n metadata: SessionMetadata;\n /** All transcription results */\n transcripts: TranscriptionResult[];\n /** Concatenated final text */\n fullText: string;\n /** Recorded audio data if available */\n audioData?: ArrayBuffer;\n}\n\n/**\n * Manages a transcription session with support for recording and transcript management\n */\nexport class TranscriptionSession {\n /** Unique session identifier */\n public readonly id: string;\n\n /** Transcription provider instance */\n public readonly provider: ITranscriptionProvider;\n\n /** Session configuration */\n private config: Required<SessionConfig>;\n\n /** Collected transcription results */\n private transcripts: TranscriptionResult[] = [];\n\n /** Current session state */\n private state: SessionState = SessionStateEnum.IDLE;\n\n /** Max duration timer */\n private maxDurationTimer?: ReturnType<typeof setTimeout>;\n\n /** Silence timeout timer */\n private silenceTimer?: ReturnType<typeof setTimeout>;\n\n /** Session start timestamp */\n private startTime?: number;\n\n /**\n * Create a new TranscriptionSession\n * @param provider - Transcription provider to use\n * @param sessionConfig - Session configuration options\n */\n constructor(provider: ITranscriptionProvider, sessionConfig: SessionConfig = {}) {\n this.provider = provider;\n this.config = { ...DEFAULT_SESSION_CONFIG, ...sessionConfig };\n this.id = this.generateSessionId();\n }\n\n /**\n * Start the transcription session\n */\n async start(): Promise<void> {\n if (this.state !== SessionStateEnum.IDLE && this.state !== SessionStateEnum.STOPPED) {\n throw new Error(`Cannot start session in state: ${this.state}`);\n }\n\n this.state = SessionStateEnum.INITIALIZING;\n this.startTime = Date.now();\n\n try {\n await this.provider.start();\n this.state = SessionStateEnum.ACTIVE;\n this.setupTimers();\n } catch (error) {\n this.state = SessionStateEnum.ERROR;\n throw error;\n }\n }\n\n /**\n * Stop the transcription session\n */\n async stop(): Promise<void> {\n if (this.state === SessionStateEnum.STOPPED || this.state === SessionStateEnum.IDLE) {\n return;\n }\n\n this.state = SessionStateEnum.STOPPING;\n this.clearTimers();\n\n try {\n await this.provider.stop();\n } finally {\n this.state = SessionStateEnum.STOPPED;\n }\n }\n\n /**\n * Pause the transcription session\n */\n pause(): void {\n if (this.state !== SessionStateEnum.ACTIVE) {\n return;\n }\n\n this.provider.pause();\n this.state = SessionStateEnum.PAUSED;\n this.clearTimers();\n }\n\n /**\n * Resume the transcription session\n */\n resume(): void {\n if (this.state !== SessionStateEnum.PAUSED) {\n return;\n }\n\n this.provider.resume();\n this.state = SessionStateEnum.ACTIVE;\n this.setupTimers();\n }\n\n /**\n * Add a transcription result to the session\n * @param result - Transcription result to add\n */\n addTranscript(result: TranscriptionResult): void {\n this.transcripts.push(result);\n this.resetSilenceTimer();\n }\n\n /**\n * Get transcription results\n * @param finalOnly - If true, return only final results\n */\n getTranscripts(finalOnly: boolean = false): TranscriptionResult[] {\n if (finalOnly) {\n return this.transcripts.filter(t => t.isFinal);\n }\n return [...this.transcripts];\n }\n\n /**\n * Get concatenated text from all final transcripts\n */\n getFullText(): string {\n return this.transcripts\n .filter(t => t.isFinal)\n .map(t => t.text)\n .join(' ')\n .trim();\n }\n\n /**\n * Get the current session state\n */\n getState(): SessionState {\n return this.state;\n }\n\n /**\n * Export session data in raw format\n */\n exportRaw(): SessionExport {\n const metadata: SessionMetadata = {\n id: this.id,\n startTime: this.startTime || 0,\n endTime: this.state === SessionStateEnum.STOPPED ? Date.now() : undefined,\n duration: this.startTime ? Date.now() - this.startTime : 0,\n wordCount: this.getWordCount(),\n provider: this.provider.getState() as unknown as import('../types').TranscriptionProvider,\n };\n\n return {\n metadata,\n transcripts: this.getTranscripts(),\n fullText: this.getFullText(),\n };\n }\n\n /**\n * Export session data in specified format\n * @param format - Export format (json, text, srt, vtt, csv)\n */\n export(format: ExportFormat = 'json'): ExportResult {\n const transcripts = this.getTranscripts(true);\n const sessionData = { transcripts };\n const rawExport = this.exportRaw();\n\n let data: string;\n let mimeType: string;\n let extension: string;\n\n switch (format) {\n case 'json':\n data = JSONExporter.export({ metadata: rawExport.metadata, transcripts });\n mimeType = 'application/json';\n extension = 'json';\n break;\n case 'text':\n data = TextExporter.export(sessionData, {});\n mimeType = 'text/plain';\n extension = 'txt';\n break;\n case 'srt':\n data = SRTExporter.export(sessionData);\n mimeType = 'text/plain';\n extension = 'srt';\n break;\n case 'vtt':\n data = VTTExporter.export(sessionData);\n mimeType = 'text/vtt';\n extension = 'vtt';\n break;\n case 'csv':\n data = CSVExporter.export(sessionData, {});\n mimeType = 'text/csv';\n extension = 'csv';\n break;\n default:\n data = JSONExporter.export({ metadata: rawExport.metadata, transcripts });\n mimeType = 'application/json';\n extension = 'json';\n }\n\n return {\n format,\n data,\n filename: `transcript-${this.id}.${extension}`,\n mimeType,\n };\n }\n\n /**\n * Get session statistics\n */\n getStatistics(): SessionStatistics {\n const transcripts = this.getTranscripts(true);\n const wordCount = this.getWordCount();\n const durationMs = this.startTime ? Date.now() - this.startTime : 0;\n\n // Calculate average confidence\n let totalConfidence = 0;\n let confCount = 0;\n for (const t of transcripts) {\n if (t.confidence !== undefined) {\n totalConfidence += t.confidence;\n confCount++;\n }\n }\n const averageConfidence = confCount > 0 ? totalConfidence / confCount : 0;\n\n // Calculate speaking rate (words per minute)\n const durationMinutes = durationMs / 60000;\n const speakingRate = durationMinutes > 0 ? wordCount / durationMinutes : 0;\n\n return {\n wordCount,\n averageConfidence,\n speakingRate,\n silencePeriods: 0, // Would require VAD tracking\n durationMs,\n transcriptCount: transcripts.length,\n };\n }\n\n /**\n * Clear all transcripts\n */\n clear(): void {\n this.transcripts = [];\n }\n\n /**\n * Get the total word count from final transcripts\n */\n private getWordCount(): number {\n return this.transcripts\n .filter(t => t.isFinal)\n .reduce((count, t) => {\n const words = t.text.trim().split(/\\s+/).filter(w => w.length > 0);\n return count + words.length;\n }, 0);\n }\n\n /**\n * Set up session timers (max duration, silence timeout)\n */\n private setupTimers(): void {\n // Max duration timer\n if (this.config.maxDuration > 0) {\n this.maxDurationTimer = setTimeout(() => {\n void this.stop();\n }, this.config.maxDuration);\n }\n\n // Silence timeout timer\n this.resetSilenceTimer();\n }\n\n /**\n * Reset the silence timeout timer\n */\n private resetSilenceTimer(): void {\n if (this.silenceTimer) {\n clearTimeout(this.silenceTimer);\n }\n\n if (this.config.silenceTimeout > 0 && this.state === SessionStateEnum.ACTIVE) {\n this.silenceTimer = setTimeout(() => {\n void this.stop();\n }, this.config.silenceTimeout);\n }\n }\n\n /**\n * Clear all timers\n */\n private clearTimers(): void {\n if (this.maxDurationTimer) {\n clearTimeout(this.maxDurationTimer);\n this.maxDurationTimer = undefined;\n }\n if (this.silenceTimer) {\n clearTimeout(this.silenceTimer);\n this.silenceTimer = undefined;\n }\n }\n\n /**\n * Generate a unique session ID\n */\n private generateSessionId(): string {\n return 'session-' + 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n }\n}\n","import { TranscriptionSession } from './TranscriptionSession';\nimport type {\n ITranscriptionProvider,\n SessionConfig,\n SessionStats,\n SessionState,\n ExportFormat,\n ExportResult,\n SessionImport,\n} from '../types';\nimport { SessionState as SessionStateEnum } from '../types';\nimport { JSONExporter, TextExporter, SRTExporter, VTTExporter, CSVExporter } from '../utils/exporters';\n\n/**\n * Session manager options\n */\nexport interface SessionManagerOptions {\n /** Default session configuration */\n defaultConfig?: SessionConfig;\n /** Maximum number of concurrent sessions */\n maxSessions?: number;\n}\n\n/**\n * Manages multiple transcription sessions\n */\nexport class SessionManager {\n /** Active sessions map */\n private sessions: Map<string, TranscriptionSession> = new Map();\n\n /** Currently active session ID */\n private activeSessionId: string | null = null;\n\n /** Default session configuration */\n private defaultConfig: SessionConfig;\n\n /** Maximum number of sessions */\n private maxSessions: number;\n\n /**\n * Create a new SessionManager\n * @param options - Manager configuration\n */\n constructor(options: SessionManagerOptions = {}) {\n this.defaultConfig = options.defaultConfig || {};\n this.maxSessions = options.maxSessions || 10;\n }\n\n /**\n * Create a new transcription session\n * @param provider - Transcription provider instance\n * @param config - Session configuration (merged with defaults)\n * @returns New TranscriptionSession instance\n */\n createSession(provider: ITranscriptionProvider, config?: SessionConfig): TranscriptionSession {\n if (this.sessions.size >= this.maxSessions) {\n throw new Error(`Maximum number of sessions (${this.maxSessions}) reached`);\n }\n\n const mergedConfig = { ...this.defaultConfig, ...config };\n const session = new TranscriptionSession(provider, mergedConfig);\n\n this.sessions.set(session.id, session);\n\n // Set as active if no active session\n if (!this.activeSessionId) {\n this.activeSessionId = session.id;\n }\n\n return session;\n }\n\n /**\n * Get session by ID\n * @param sessionId - Session ID\n * @returns TranscriptionSession or null\n */\n getSession(sessionId: string): TranscriptionSession | null {\n return this.sessions.get(sessionId) || null;\n }\n\n /**\n * Get the currently active session\n * @returns Active TranscriptionSession or null\n */\n getActiveSession(): TranscriptionSession | null {\n if (!this.activeSessionId) {\n return null;\n }\n return this.sessions.get(this.activeSessionId) || null;\n }\n\n /**\n * Set the active session\n * @param sessionId - Session ID to make active\n */\n setActiveSession(sessionId: string): void {\n if (!this.sessions.has(sessionId)) {\n throw new Error(`Session ${sessionId} not found`);\n }\n this.activeSessionId = sessionId;\n }\n\n /**\n * Get all sessions\n * @returns Array of all sessions\n */\n getAllSessions(): TranscriptionSession[] {\n return Array.from(this.sessions.values());\n }\n\n /**\n * Delete a session\n * @param sessionId - Session ID to delete\n */\n async deleteSession(sessionId: string): Promise<void> {\n const session = this.sessions.get(sessionId);\n if (!session) {\n return;\n }\n\n // Stop session if active\n if (session.getState() === SessionStateEnum.ACTIVE ||\n session.getState() === SessionStateEnum.PAUSED) {\n await session.stop();\n }\n\n this.sessions.delete(sessionId);\n\n // Clear active session if it was deleted\n if (this.activeSessionId === sessionId) {\n this.activeSessionId = null;\n // Set next available session as active\n const remaining = this.sessions.keys().next();\n if (!remaining.done) {\n this.activeSessionId = remaining.value;\n }\n }\n }\n\n /**\n * Clear all sessions\n */\n async clearAllSessions(): Promise<void> {\n const stopPromises: Promise<void>[] = [];\n\n for (const session of this.sessions.values()) {\n const state = session.getState();\n if (state === SessionStateEnum.ACTIVE || state === SessionStateEnum.PAUSED) {\n stopPromises.push(session.stop());\n }\n }\n\n await Promise.all(stopPromises);\n\n this.sessions.clear();\n this.activeSessionId = null;\n }\n\n /**\n * Get statistics for all sessions\n * @returns Session statistics\n */\n getSessionStats(): SessionStats {\n let totalTranscripts = 0;\n let totalDuration = 0;\n let totalConfidence = 0;\n let confidenceCount = 0;\n let activeSessions = 0;\n\n for (const session of this.sessions.values()) {\n const state = session.getState();\n if (state === SessionStateEnum.ACTIVE) {\n activeSessions++;\n }\n\n const stats = session.getStatistics();\n totalTranscripts += stats.transcriptCount;\n totalDuration += stats.durationMs;\n\n if (stats.averageConfidence > 0) {\n totalConfidence += stats.averageConfidence;\n confidenceCount++;\n }\n }\n\n return {\n totalSessions: this.sessions.size,\n activeSessions,\n totalTranscripts,\n totalDuration,\n averageConfidence: confidenceCount > 0 ? totalConfidence / confidenceCount : 0,\n };\n }\n\n /**\n * Export a session to specified format\n * @param sessionId - Session ID\n * @param format - Export format\n * @returns Export result\n */\n exportSession(sessionId: string, format: ExportFormat): ExportResult {\n const session = this.sessions.get(sessionId);\n if (!session) {\n throw new Error(`Session ${sessionId} not found`);\n }\n\n const exportData = session.exportRaw();\n const sessionData = {\n metadata: exportData.metadata,\n transcripts: exportData.transcripts,\n };\n\n let data: string;\n let mimeType: string;\n let extension: string;\n\n switch (format) {\n case 'json':\n data = JSONExporter.exportPretty(sessionData);\n mimeType = 'application/json';\n extension = 'json';\n break;\n\n case 'text':\n data = TextExporter.export(sessionData);\n mimeType = 'text/plain';\n extension = 'txt';\n break;\n\n case 'srt':\n data = SRTExporter.export(sessionData);\n mimeType = 'application/x-subrip';\n extension = 'srt';\n break;\n\n case 'vtt':\n data = VTTExporter.export(sessionData);\n mimeType = 'text/vtt';\n extension = 'vtt';\n break;\n\n case 'csv':\n data = CSVExporter.export(sessionData);\n mimeType = 'text/csv';\n extension = 'csv';\n break;\n\n default:\n throw new Error(`Unsupported export format: ${format}`);\n }\n\n return {\n format,\n data,\n filename: `transcript-${sessionId}.${extension}`,\n mimeType,\n };\n }\n\n /**\n * Import a session from data\n * @param data - Session import data\n * @param provider - Provider instance for the session\n * @returns Imported session\n */\n importSession(data: SessionImport, provider: ITranscriptionProvider): TranscriptionSession {\n if (this.sessions.size >= this.maxSessions) {\n throw new Error(`Maximum number of sessions (${this.maxSessions}) reached`);\n }\n\n const session = new TranscriptionSession(provider, data.config || {});\n\n // Restore transcripts\n for (const transcript of data.transcripts) {\n session.addTranscript(transcript);\n }\n\n this.sessions.set(session.id, session);\n\n return session;\n }\n\n /**\n * Check if a session exists\n * @param sessionId - Session ID\n * @returns True if session exists\n */\n hasSession(sessionId: string): boolean {\n return this.sessions.has(sessionId);\n }\n\n /**\n * Get session count\n * @returns Number of sessions\n */\n getSessionCount(): number {\n return this.sessions.size;\n }\n\n /**\n * Get sessions by state\n * @param state - Session state to filter by\n * @returns Array of sessions with matching state\n */\n getSessionsByState(state: SessionState): TranscriptionSession[] {\n return this.getAllSessions().filter(session => session.getState() === state);\n }\n}\n","import { BaseTranscriber } from '../core/BaseTranscriber';\nimport type { TranscriptionConfig, TranscriptionResult, ProviderCapabilities } from '../types';\nimport {\n SessionState,\n TranscriptionError,\n ErrorCode,\n TranscriptionProvider,\n} from '../types';\n\n/**\n * Web Speech API type declarations\n */\ndeclare global {\n interface Window {\n SpeechRecognition: typeof SpeechRecognition;\n webkitSpeechRecognition: typeof SpeechRecognition;\n }\n}\n\n/**\n * SpeechRecognition interfaces for TypeScript\n */\ninterface SpeechRecognitionEvent extends Event {\n resultIndex: number;\n results: SpeechRecognitionResultList;\n}\n\ninterface SpeechRecognitionResultList {\n length: number;\n item(index: number): SpeechRecognitionResult;\n [index: number]: SpeechRecognitionResult;\n}\n\ninterface SpeechRecognitionResult {\n length: number;\n item(index: number): SpeechRecognitionAlternative;\n [index: number]: SpeechRecognitionAlternative;\n isFinal: boolean;\n}\n\ninterface SpeechRecognitionAlternative {\n transcript: string;\n confidence: number;\n}\n\ninterface SpeechRecognitionErrorEvent extends Event {\n error: string;\n message: string;\n}\n\ninterface SpeechRecognition extends EventTarget {\n continuous: boolean;\n interimResults: boolean;\n lang: string;\n maxAlternatives: number;\n grammars: unknown;\n onstart: ((this: SpeechRecognition, ev: Event) => void) | null;\n onend: ((this: SpeechRecognition, ev: Event) => void) | null;\n onerror: ((this: SpeechRecognition, ev: SpeechRecognitionErrorEvent) => void) | null;\n onresult: ((this: SpeechRecognition, ev: SpeechRecognitionEvent) => void) | null;\n onspeechstart: ((this: SpeechRecognition, ev: Event) => void) | null;\n onspeechend: ((this: SpeechRecognition, ev: Event) => void) | null;\n onaudiostart: ((this: SpeechRecognition, ev: Event) => void) | null;\n onaudioend: ((this: SpeechRecognition, ev: Event) => void) | null;\n start(): void;\n stop(): void;\n abort(): void;\n}\n\ndeclare let SpeechRecognition: {\n prototype: SpeechRecognition;\n new (): SpeechRecognition;\n};\n\n/**\n * Transcription provider using browser's native Web Speech API\n * Works in Chrome, Edge, and Safari without requiring API keys\n */\nexport class WebSpeechProvider extends BaseTranscriber {\n /** Speech recognition instance */\n private recognition: SpeechRecognition | null = null;\n\n /** Media stream from microphone */\n private mediaStream: MediaStream | null = null;\n\n /** Audio context for analysis */\n private audioContext: AudioContext | null = null;\n\n /** Audio analyser for VAD */\n private analyser: AnalyserNode | null = null;\n\n /** Script processor for audio level monitoring */\n private audioLevelInterval: ReturnType<typeof setInterval> | null = null;\n\n /** Whether recognition is being restarted automatically */\n private isRestarting: boolean = false;\n\n /** Retry count for auto-restart */\n private retryCount: number = 0;\n\n /** Maximum retry attempts */\n private readonly maxRetries: number = 3;\n\n /** Provider capabilities */\n public static readonly capabilities: ProviderCapabilities = {\n supportsInterim: true,\n supportsWordTimestamps: false,\n supportsSpeakerDiarization: false,\n supportsPunctuation: false,\n supportsLanguageDetection: false,\n supportedLanguages: [\n 'en-US', 'en-GB', 'en-AU', 'en-CA', 'en-IN',\n 'es-ES', 'es-MX', 'fr-FR', 'de-DE', 'it-IT',\n 'pt-BR', 'pt-PT', 'ja-JP', 'ko-KR', 'zh-CN',\n 'zh-TW', 'ru-RU', 'ar-SA', 'hi-IN', 'nl-NL',\n ],\n };\n\n /**\n * Create a new WebSpeechProvider\n * @param config - Transcription configuration\n */\n constructor(config: Omit<TranscriptionConfig, 'provider'> & { provider?: TranscriptionProvider }) {\n super({ ...config, provider: TranscriptionProvider.WebSpeechAPI });\n }\n\n /**\n * Check if Web Speech API is supported in the current environment\n */\n isSupported(): boolean {\n if (typeof window === 'undefined') {\n return false;\n }\n return !!(window.SpeechRecognition || window.webkitSpeechRecognition);\n }\n\n /**\n * Initialize the Web Speech API provider\n */\n async initialize(): Promise<void> {\n if (!this.isSupported()) {\n throw new TranscriptionError(\n 'Web Speech API is not supported in this browser',\n ErrorCode.UNSUPPORTED_BROWSER,\n TranscriptionProvider.WebSpeechAPI\n );\n }\n\n this.setState(SessionState.INITIALIZING);\n\n try {\n // Request microphone access first\n await this.getMicrophoneAccess();\n\n // Create speech recognition instance\n const SpeechRecognitionClass = window.SpeechRecognition || window.webkitSpeechRecognition;\n this.recognition = new SpeechRecognitionClass();\n\n // Configure recognition\n this.recognition.continuous = true;\n this.recognition.interimResults = this.config.interimResults ?? true;\n this.recognition.lang = this.config.language || 'en-US';\n this.recognition.maxAlternatives = 1;\n\n // Set up event handlers\n this.setupEventHandlers();\n\n // Set up audio level monitoring if VAD is enabled\n if (this.config.providerOptions?.enableVAD) {\n this.setupAudioLevelMonitoring();\n }\n } catch (error) {\n this.handleError(error as Error);\n throw error;\n }\n }\n\n /**\n * Start transcription\n */\n async start(): Promise<void> {\n if (!this.recognition) {\n await this.initialize();\n }\n\n if (this.state === SessionState.ACTIVE) {\n return;\n }\n\n try {\n this.recognition!.start();\n this.retryCount = 0;\n } catch (error) {\n // Recognition might already be started\n if ((error as Error).message?.includes('already started')) {\n return;\n }\n this.handleError(error as Error);\n throw error;\n }\n }\n\n /**\n * Stop transcription\n */\n async stop(): Promise<void> {\n if (this.state === SessionState.STOPPED || this.state === SessionState.IDLE) {\n return;\n }\n\n this.setState(SessionState.STOPPING);\n this.isRestarting = false;\n\n try {\n if (this.recognition) {\n this.recognition.stop();\n }\n\n this.stopAudioLevelMonitoring();\n this.stopMediaStream();\n\n this.setState(SessionState.STOPPED);\n this.emit('stop');\n } catch (error) {\n this.handleError(error as Error);\n }\n }\n\n /**\n * Pause transcription\n */\n pause(): void {\n if (this.state !== SessionState.ACTIVE) {\n return;\n }\n\n this.isRestarting = false;\n\n try {\n if (this.recognition) {\n this.recognition.stop();\n }\n this.setState(SessionState.PAUSED);\n this.emit('pause');\n } catch (error) {\n this.handleError(error as Error);\n }\n }\n\n /**\n * Resume transcription\n */\n resume(): void {\n if (this.state !== SessionState.PAUSED) {\n return;\n }\n\n try {\n if (this.recognition) {\n this.recognition.start();\n }\n this.setState(SessionState.ACTIVE);\n this.emit('resume');\n } catch (error) {\n this.handleError(error as Error);\n }\n }\n\n /**\n * Send audio data - not supported by Web Speech API\n * @param _audioData - Audio data (unused)\n */\n sendAudio(_audioData: ArrayBuffer): void {\n console.warn('WebSpeechProvider does not support external audio input. Audio data is captured directly from the microphone.');\n }\n\n /**\n * Clean up all resources\n */\n async cleanup(): Promise<void> {\n this.isRestarting = false;\n\n // Stop recognition\n if (this.recognition) {\n try {\n this.recognition.stop();\n } catch {\n // Ignore errors during cleanup\n }\n this.recognition.onstart = null;\n this.recognition.onend = null;\n this.recognition.onerror = null;\n this.recognition.onresult = null;\n this.recognition.onspeechstart = null;\n this.recognition.onspeechend = null;\n this.recognition = null;\n }\n\n // Stop audio monitoring\n this.stopAudioLevelMonitoring();\n\n // Close audio context\n if (this.audioContext) {\n try {\n await this.audioContext.close();\n } catch {\n // Ignore errors\n }\n this.audioContext = null;\n this.analyser = null;\n }\n\n // Stop media stream\n this.stopMediaStream();\n\n // Remove all event listeners\n this.removeAllListeners();\n }\n\n /**\n * Get provider capabilities\n */\n getCapabilities(): ProviderCapabilities {\n return WebSpeechProvider.capabilities;\n }\n\n // ==================== Private Methods ====================\n\n /**\n * Set up event handlers for speech recognition\n */\n private setupEventHandlers(): void {\n if (!this.recognition) return;\n\n this.recognition.onstart = (): void => {\n this.setState(SessionState.ACTIVE);\n this.emit('start');\n };\n\n this.recognition.onend = (): void => {\n this.handleRecognitionEnd();\n };\n\n this.recognition.onerror = (event: SpeechRecognitionErrorEvent): void => {\n this.handleRecognitionError(event);\n };\n\n this.recognition.onresult = (event: SpeechRecognitionEvent): void => {\n this.processRecognitionResult(event);\n };\n\n this.recognition.onspeechstart = (): void => {\n this.emit('speech');\n };\n\n this.recognition.onspeechend = (): void => {\n this.emit('silence');\n };\n }\n\n /**\n * Process speech recognition results\n */\n private processRecognitionResult(event: SpeechRecognitionEvent): void {\n for (let i = event.resultIndex; i < event.results.length; i++) {\n const result = event.results[i];\n const alternative = result[0];\n\n if (!alternative) continue;\n\n const transcriptionResult: TranscriptionResult = {\n text: alternative.transcript,\n isFinal: result.isFinal,\n confidence: alternative.confidence,\n timestamp: Date.now(),\n language: this.config.language,\n };\n\n this.handleTranscript(transcriptionResult);\n }\n }\n\n /**\n * Handle recognition end event\n */\n private handleRecognitionEnd(): void {\n // Don't restart if we're intentionally stopping or paused\n if (\n this.state === SessionState.STOPPING ||\n this.state === SessionState.STOPPED ||\n this.state === SessionState.PAUSED ||\n this.state === SessionState.ERROR\n ) {\n return;\n }\n\n // Auto-restart for continuous mode\n if (this.state === SessionState.ACTIVE && !this.isRestarting) {\n this.isRestarting = true;\n\n if (this.retryCount < this.maxRetries) {\n this.retryCount++;\n setTimeout(() => {\n if (this.recognition && this.state === SessionState.ACTIVE) {\n try {\n this.recognition.start();\n } catch (error) {\n this.handleError(error as Error);\n }\n }\n this.isRestarting = false;\n }, 100);\n } else {\n // Max retries exceeded\n this.setState(SessionState.STOPPED);\n this.emit('stop');\n }\n }\n }\n\n /**\n * Handle recognition errors\n */\n private handleRecognitionError(event: SpeechRecognitionErrorEvent): void {\n let errorCode: ErrorCode;\n let shouldStop = false;\n\n switch (event.error) {\n case 'no-speech':\n // Not a critical error, just log it\n console.warn('No speech detected');\n return;\n\n case 'audio-capture':\n case 'not-allowed':\n errorCode = ErrorCode.MICROPHONE_ACCESS_DENIED;\n shouldStop = true;\n break;\n\n case 'network':\n errorCode = ErrorCode.NETWORK_ERROR;\n break;\n\n case 'aborted':\n // User aborted, not an error\n return;\n\n case 'service-not-allowed':\n errorCode = ErrorCode.UNSUPPORTED_BROWSER;\n shouldStop = true;\n break;\n\n default:\n errorCode = ErrorCode.PROVIDER_ERROR;\n }\n\n const error = new TranscriptionError(\n event.message || `Speech recognition error: ${event.error}`,\n errorCode,\n TranscriptionProvider.WebSpeechAPI,\n { originalError: event.error }\n );\n\n if (shouldStop) {\n this.handleError(error);\n } else {\n // Emit error but continue\n this.emit('error', error);\n }\n }\n\n /**\n * Request microphone access\n */\n private async getMicrophoneAccess(): Promise<void> {\n try {\n const constraints: MediaStreamConstraints = {\n audio: {\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n sampleRate: this.config.audioConfig?.sampleRate || 16000,\n },\n };\n\n this.mediaStream = await navigator.mediaDevices.getUserMedia(constraints);\n } catch (error) {\n const err = error as Error;\n throw new TranscriptionError(\n err.message || 'Microphone access denied',\n ErrorCode.MICROPHONE_ACCESS_DENIED,\n TranscriptionProvider.WebSpeechAPI,\n error\n );\n }\n }\n\n /**\n * Stop media stream tracks\n */\n private stopMediaStream(): void {\n if (this.mediaStream) {\n this.mediaStream.getTracks().forEach(track => track.stop());\n this.mediaStream = null;\n }\n }\n\n /**\n * Set up audio level monitoring for VAD\n */\n private setupAudioLevelMonitoring(): void {\n if (!this.mediaStream) return;\n\n try {\n this.audioContext = new AudioContext();\n const source = this.audioContext.createMediaStreamSource(this.mediaStream);\n this.analyser = this.audioContext.createAnalyser();\n this.analyser.fftSize = 256;\n source.connect(this.analyser);\n\n const dataArray = new Uint8Array(this.analyser.frequencyBinCount);\n\n this.audioLevelInterval = setInterval(() => {\n if (this.analyser && this.state === SessionState.ACTIVE) {\n this.analyser.getByteFrequencyData(dataArray);\n const average = dataArray.reduce((a, b) => a + b, 0) / dataArray.length;\n const normalizedLevel = average / 255;\n this.emit('audioLevel', normalizedLevel);\n }\n }, 100);\n } catch (error) {\n console.warn('Failed to set up audio level monitoring:', error);\n }\n }\n\n /**\n * Stop audio level monitoring\n */\n private stopAudioLevelMonitoring(): void {\n if (this.audioLevelInterval) {\n clearInterval(this.audioLevelInterval);\n this.audioLevelInterval = null;\n }\n }\n}\n","import { BaseTranscriber } from '../core/BaseTranscriber';\nimport type {\n TranscriptionConfig,\n TranscriptionResult,\n Word,\n ProviderCapabilities,\n} from '../types';\nimport {\n SessionState,\n TranscriptionError,\n ErrorCode,\n TranscriptionProvider,\n} from '../types';\n\n/** Deepgram WebSocket API endpoint */\nconst DEEPGRAM_WS_URL = 'wss://api.deepgram.com/v1/listen';\n\n/** Keep-alive interval in milliseconds */\nconst KEEP_ALIVE_INTERVAL = 5000;\n\n/** Initial reconnect delay in milliseconds */\nconst RECONNECT_DELAY = 1000;\n\n/**\n * Deepgram-specific configuration options\n */\nexport interface DeepgramOptions {\n /** Deepgram model to use */\n model?: 'nova-2' | 'nova' | 'enhanced' | 'base';\n /** Model tier */\n tier?: 'nova' | 'enhanced' | 'base';\n /** Model version */\n version?: 'latest' | string;\n /** Enable punctuation */\n punctuate?: boolean;\n /** Enable speaker diarization */\n diarize?: boolean;\n /** Enable multichannel processing */\n multichannel?: boolean;\n /** Number of alternative transcripts */\n alternatives?: number;\n /** Convert numbers to numerals */\n numerals?: boolean;\n /** Search terms to boost */\n search?: string[];\n /** Words to replace */\n replace?: string[];\n /** Keywords to boost */\n keywords?: string[];\n /** Endpointing timeout in milliseconds */\n endpointing?: number;\n /** Enable smart formatting */\n smartFormat?: boolean;\n}\n\n/**\n * Deepgram WebSocket message types\n */\ninterface DeepgramMessage {\n type: string;\n channel?: {\n alternatives: Array<{\n transcript: string;\n confidence: number;\n words?: Array<{\n word: string;\n start: number;\n end: number;\n confidence: number;\n speaker?: number;\n }>;\n }>;\n };\n is_final?: boolean;\n speech_final?: boolean;\n metadata?: {\n request_id: string;\n model_info?: {\n name: string;\n version: string;\n };\n };\n error?: {\n message: string;\n code?: string;\n };\n}\n\n/**\n * Transcription provider using Deepgram's WebSocket streaming API\n * Provides high-accuracy transcription with word-level timestamps\n */\nexport class DeepgramProvider extends BaseTranscriber {\n /** WebSocket connection */\n private socket: WebSocket | null = null;\n\n /** Media stream from microphone */\n private mediaStream: MediaStream | null = null;\n\n /** Audio context for processing */\n private audioContext: AudioContext | null = null;\n\n /** Audio processor node */\n private processor: ScriptProcessorNode | null = null;\n\n /** Connection attempt counter */\n private connectionAttempts: number = 0;\n\n /** Maximum reconnection attempts */\n private readonly maxRetries: number = 3;\n\n /** Reconnection timeout */\n private reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\n\n /** Keep-alive interval */\n private keepAliveInterval: ReturnType<typeof setInterval> | null = null;\n\n /** Flag indicating if connection is ready */\n private isConnectionReady: boolean = false;\n\n /** Flag for intentional close */\n private isIntentionalClose: boolean = false;\n\n /** Provider capabilities */\n public static readonly capabilities: ProviderCapabilities = {\n supportsInterim: true,\n supportsWordTimestamps: true,\n supportsSpeakerDiarization: true,\n supportsPunctuation: true,\n supportsLanguageDetection: true,\n supportedLanguages: [\n 'en', 'en-US', 'en-GB', 'en-AU', 'en-IN',\n 'es', 'es-ES', 'es-419',\n 'fr', 'fr-FR', 'fr-CA',\n 'de', 'de-DE',\n 'it', 'it-IT',\n 'pt', 'pt-BR', 'pt-PT',\n 'nl', 'nl-NL',\n 'ja', 'ja-JP',\n 'ko', 'ko-KR',\n 'zh', 'zh-CN', 'zh-TW',\n 'ru', 'ru-RU',\n 'uk', 'uk-UA',\n 'hi', 'hi-IN',\n 'tr', 'tr-TR',\n 'pl', 'pl-PL',\n 'sv', 'sv-SE',\n 'da', 'da-DK',\n 'no', 'no-NO',\n 'fi', 'fi-FI',\n ],\n };\n\n /**\n * Create a new DeepgramProvider\n * @param config - Transcription configuration with API key\n */\n constructor(config: Omit<TranscriptionConfig, 'provider'> & { provider?: TranscriptionProvider }) {\n super({ ...config, provider: TranscriptionProvider.Deepgram });\n }\n\n /**\n * Check if Deepgram provider is supported\n */\n isSupported(): boolean {\n if (typeof window === 'undefined') {\n // Node.js environment - check for WebSocket\n return typeof WebSocket !== 'undefined';\n }\n return !!(\n typeof WebSocket !== 'undefined' &&\n navigator.mediaDevices &&\n typeof navigator.mediaDevices.getUserMedia === 'function' &&\n (window.AudioContext || (window as unknown as { webkitAudioContext: typeof AudioContext }).webkitAudioContext)\n );\n }\n\n /**\n * Initialize the Deepgram provider\n */\n async initialize(): Promise<void> {\n if (!this.config.apiKey) {\n throw new TranscriptionError(\n 'Deepgram API key is required',\n ErrorCode.INVALID_CONFIG,\n TranscriptionProvider.Deepgram\n );\n }\n\n if (!this.isSupported()) {\n throw new TranscriptionError(\n 'Deepgram provider is not supported in this environment',\n ErrorCode.UNSUPPORTED_BROWSER,\n TranscriptionProvider.Deepgram\n );\n }\n\n this.setState(SessionState.INITIALIZING);\n this.isConnectionReady = false;\n this.isIntentionalClose = false;\n\n try {\n await this.setupWebSocket();\n } catch (error) {\n this.handleError(error as Error);\n throw error;\n }\n }\n\n /**\n * Start transcription\n */\n async start(): Promise<void> {\n if (!this.socket || !this.isConnectionReady) {\n await this.initialize();\n }\n\n if (this.state === SessionState.ACTIVE) {\n return;\n }\n\n try {\n await this.getMicrophoneAccess();\n this.setupAudioProcessing();\n this.setState(SessionState.ACTIVE);\n this.emit('start');\n } catch (error) {\n this.handleError(error as Error);\n throw error;\n }\n }\n\n /**\n * Stop transcription\n */\n async stop(): Promise<void> {\n if (this.state === SessionState.STOPPED || this.state === SessionState.IDLE) {\n return;\n }\n\n this.setState(SessionState.STOPPING);\n this.isIntentionalClose = true;\n\n // Clear keep-alive\n this.stopKeepAlive();\n\n // Send close message to Deepgram\n if (this.socket && this.socket.readyState === WebSocket.OPEN) {\n try {\n this.socket.send(JSON.stringify({ type: 'CloseStream' }));\n // Wait briefly for final results\n await new Promise(resolve => setTimeout(resolve, 500));\n } catch {\n // Ignore send errors during close\n }\n }\n\n // Close WebSocket\n this.closeWebSocket();\n\n // Stop audio processing\n this.stopAudioProcessing();\n\n // Release microphone\n this.stopMediaStream();\n\n this.setState(SessionState.STOPPED);\n this.emit('stop');\n }\n\n /**\n * Pause transcription\n */\n pause(): void {\n if (this.state !== SessionState.ACTIVE) {\n return;\n }\n\n this.stopAudioProcessing();\n this.setState(SessionState.PAUSED);\n this.emit('pause');\n }\n\n /**\n * Resume transcription\n */\n resume(): void {\n if (this.state !== SessionState.PAUSED) {\n return;\n }\n\n if (this.mediaStream && this.audioContext) {\n this.setupAudioProcessing();\n }\n\n this.setState(SessionState.ACTIVE);\n this.emit('resume');\n }\n\n /**\n * Send audio data through WebSocket\n * @param audioData - Raw audio data as ArrayBuffer\n */\n sendAudio(audioData: ArrayBuffer): void {\n if (this.socket && this.socket.readyState === WebSocket.OPEN && this.state === SessionState.ACTIVE) {\n this.socket.send(audioData);\n this.recordAudioData(audioData);\n }\n }\n\n /**\n * Clean up all resources\n */\n async cleanup(): Promise<void> {\n this.isIntentionalClose = true;\n\n // Clear timeouts and intervals\n this.stopKeepAlive();\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n\n // Close WebSocket\n this.closeWebSocket();\n\n // Stop audio processing\n this.stopAudioProcessing();\n\n // Close audio context\n if (this.audioContext) {\n try {\n await this.audioContext.close();\n } catch {\n // Ignore errors\n }\n this.audioContext = null;\n }\n\n // Stop media stream\n this.stopMediaStream();\n\n // Reset state\n this.connectionAttempts = 0;\n this.isConnectionReady = false;\n\n // Remove all listeners\n this.removeAllListeners();\n }\n\n /**\n * Get provider capabilities\n */\n getCapabilities(): ProviderCapabilities {\n return DeepgramProvider.capabilities;\n }\n\n // ==================== Private Methods ====================\n\n /**\n * Build WebSocket URL with query parameters\n */\n private buildWebSocketUrl(): string {\n const params = new URLSearchParams();\n const options = (this.config.providerOptions || {}) as DeepgramOptions;\n\n // Model configuration\n params.set('model', options.model || 'nova-2');\n if (options.version) params.set('version', options.version);\n if (options.tier) params.set('tier', options.tier);\n\n // Language\n if (this.config.language) {\n params.set('language', this.config.language);\n }\n\n // Features\n params.set('punctuate', String(this.config.punctuation ?? options.punctuate ?? true));\n params.set('interim_results', String(this.config.interimResults ?? true));\n\n if (options.diarize) params.set('diarize', 'true');\n if (options.multichannel) params.set('multichannel', 'true');\n if (options.alternatives) params.set('alternatives', String(options.alternatives));\n if (options.numerals) params.set('numerals', 'true');\n if (options.smartFormat) params.set('smart_format', 'true');\n if (options.endpointing !== undefined) params.set('endpointing', String(options.endpointing));\n\n // Keywords and search\n if (options.keywords?.length) {\n options.keywords.forEach(k => params.append('keywords', k));\n }\n if (options.search?.length) {\n options.search.forEach(s => params.append('search', s));\n }\n\n // Audio format\n params.set('encoding', 'linear16');\n params.set('sample_rate', String(this.config.audioConfig?.sampleRate || 16000));\n params.set('channels', String(this.config.audioConfig?.channels || 1));\n\n return `${DEEPGRAM_WS_URL}?${params.toString()}`;\n }\n\n /**\n * Set up WebSocket connection\n */\n private async setupWebSocket(): Promise<void> {\n return new Promise((resolve, reject) => {\n const url = this.buildWebSocketUrl();\n\n this.socket = new WebSocket(url, ['token', this.config.apiKey!]);\n this.socket.binaryType = 'arraybuffer';\n\n const connectionTimeout = setTimeout(() => {\n reject(new TranscriptionError(\n 'WebSocket connection timeout',\n ErrorCode.CONNECTION_FAILED,\n TranscriptionProvider.Deepgram\n ));\n }, 10000);\n\n this.socket.onopen = (): void => {\n clearTimeout(connectionTimeout);\n this.handleWebSocketOpen();\n resolve();\n };\n\n this.socket.onmessage = (event: MessageEvent): void => {\n this.handleWebSocketMessage(event);\n };\n\n this.socket.onerror = (event: Event): void => {\n clearTimeout(connectionTimeout);\n this.handleWebSocketError(event);\n reject(new TranscriptionError(\n 'WebSocket connection error',\n ErrorCode.CONNECTION_FAILED,\n TranscriptionProvider.Deepgram\n ));\n };\n\n this.socket.onclose = (event: CloseEvent): void => {\n clearTimeout(connectionTimeout);\n this.handleWebSocketClose(event);\n };\n });\n }\n\n /**\n * Handle WebSocket open event\n */\n private handleWebSocketOpen(): void {\n this.isConnectionReady = true;\n this.connectionAttempts = 0;\n this.startKeepAlive();\n }\n\n /**\n * Handle incoming WebSocket messages\n */\n private handleWebSocketMessage(event: MessageEvent): void {\n try {\n const message: DeepgramMessage = JSON.parse(event.data as string);\n\n switch (message.type) {\n case 'Results':\n this.processTranscriptionResult(message);\n break;\n\n case 'Metadata':\n // Store metadata if needed\n break;\n\n case 'SpeechStarted':\n this.emit('speech');\n break;\n\n case 'UtteranceEnd':\n this.emit('silence');\n break;\n\n case 'Error':\n this.handleDeepgramError(message);\n break;\n }\n } catch (error) {\n console.error('Failed to parse Deepgram message:', error);\n }\n }\n\n /**\n * Process transcription result from Deepgram\n */\n private processTranscriptionResult(message: DeepgramMessage): void {\n if (!message.channel?.alternatives?.length) {\n return;\n }\n\n const alternative = message.channel.alternatives[0];\n const isFinal = message.is_final ?? message.speech_final ?? false;\n\n // Skip empty results\n if (!alternative.transcript && !isFinal) {\n return;\n }\n\n // Extract words with timing\n const words: Word[] | undefined = alternative.words?.map(w => ({\n text: w.word,\n start: Math.round(w.start * 1000), // Convert to milliseconds\n end: Math.round(w.end * 1000),\n confidence: w.confidence,\n }));\n\n const result: TranscriptionResult = {\n text: alternative.transcript,\n isFinal,\n confidence: alternative.confidence,\n timestamp: Date.now(),\n words,\n language: this.config.language,\n };\n\n this.handleTranscript(result);\n }\n\n /**\n * Handle Deepgram-specific errors\n */\n private handleDeepgramError(message: DeepgramMessage): void {\n let errorCode = ErrorCode.PROVIDER_ERROR;\n const errorMessage = message.error?.message || 'Unknown Deepgram error';\n\n if (errorMessage.toLowerCase().includes('unauthorized') ||\n errorMessage.toLowerCase().includes('invalid api key')) {\n errorCode = ErrorCode.AUTHENTICATION_FAILED;\n } else if (errorMessage.toLowerCase().includes('rate limit')) {\n errorCode = ErrorCode.PROVIDER_ERROR;\n }\n\n const error = new TranscriptionError(\n errorMessage,\n errorCode,\n TranscriptionProvider.Deepgram,\n message.error\n );\n\n this.emit('error', error);\n }\n\n /**\n * Handle WebSocket error\n */\n private handleWebSocketError(_event: Event): void {\n if (!this.isIntentionalClose && this.connectionAttempts < this.maxRetries) {\n this.reconnect();\n } else {\n const error = new TranscriptionError(\n 'WebSocket connection error',\n ErrorCode.CONNECTION_FAILED,\n TranscriptionProvider.Deepgram\n );\n this.handleError(error);\n }\n }\n\n /**\n * Handle WebSocket close\n */\n private handleWebSocketClose(event: CloseEvent): void {\n this.isConnectionReady = false;\n\n if (!this.isIntentionalClose && this.state === SessionState.ACTIVE) {\n // Unexpected close, attempt reconnection\n if (this.connectionAttempts < this.maxRetries) {\n this.reconnect();\n } else {\n const error = new TranscriptionError(\n `WebSocket closed unexpectedly: ${event.code} ${event.reason}`,\n ErrorCode.CONNECTION_FAILED,\n TranscriptionProvider.Deepgram\n );\n this.handleError(error);\n }\n }\n }\n\n /**\n * Attempt to reconnect\n */\n private reconnect(): void {\n this.connectionAttempts++;\n const delay = RECONNECT_DELAY * Math.pow(2, this.connectionAttempts - 1);\n\n this.reconnectTimeout = setTimeout(async () => {\n try {\n await this.setupWebSocket();\n if (this.mediaStream) {\n this.setupAudioProcessing();\n }\n } catch (error) {\n if (this.connectionAttempts < this.maxRetries) {\n this.reconnect();\n } else {\n this.handleError(error as Error);\n }\n }\n }, delay);\n }\n\n /**\n * Start keep-alive interval\n */\n private startKeepAlive(): void {\n this.keepAliveInterval = setInterval(() => {\n if (this.socket && this.socket.readyState === WebSocket.OPEN) {\n this.socket.send(JSON.stringify({ type: 'KeepAlive' }));\n }\n }, KEEP_ALIVE_INTERVAL);\n }\n\n /**\n * Stop keep-alive interval\n */\n private stopKeepAlive(): void {\n if (this.keepAliveInterval) {\n clearInterval(this.keepAliveInterval);\n this.keepAliveInterval = null;\n }\n }\n\n /**\n * Request microphone access\n */\n private async getMicrophoneAccess(): Promise<void> {\n try {\n const sampleRate = this.config.audioConfig?.sampleRate || 16000;\n\n this.mediaStream = await navigator.mediaDevices.getUserMedia({\n audio: {\n sampleRate,\n channelCount: this.config.audioConfig?.channels || 1,\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n },\n });\n } catch (error) {\n throw new TranscriptionError(\n 'Microphone access denied',\n ErrorCode.MICROPHONE_ACCESS_DENIED,\n TranscriptionProvider.Deepgram,\n error\n );\n }\n }\n\n /**\n * Set up audio processing pipeline\n */\n private setupAudioProcessing(): void {\n if (!this.mediaStream) return;\n\n const AudioContextClass = window.AudioContext ||\n (window as unknown as { webkitAudioContext: typeof AudioContext }).webkitAudioContext;\n\n this.audioContext = new AudioContextClass({\n sampleRate: this.config.audioConfig?.sampleRate || 16000,\n });\n\n const source = this.audioContext.createMediaStreamSource(this.mediaStream);\n\n // Use ScriptProcessorNode (deprecated but widely supported)\n // Buffer size of 4096 provides good balance between latency and efficiency\n this.processor = this.audioContext.createScriptProcessor(4096, 1, 1);\n\n this.processor.onaudioprocess = (event: AudioProcessingEvent): void => {\n if (this.state !== SessionState.ACTIVE) return;\n\n const inputData = event.inputBuffer.getChannelData(0);\n const int16Data = this.convertFloat32ToInt16(inputData);\n this.sendAudio(int16Data.buffer as ArrayBuffer);\n };\n\n source.connect(this.processor);\n this.processor.connect(this.audioContext.destination);\n }\n\n /**\n * Stop audio processing\n */\n private stopAudioProcessing(): void {\n if (this.processor) {\n this.processor.disconnect();\n this.processor.onaudioprocess = null;\n this.processor = null;\n }\n }\n\n /**\n * Convert Float32 audio samples to Int16\n */\n private convertFloat32ToInt16(buffer: Float32Array): Int16Array {\n const int16 = new Int16Array(buffer.length);\n for (let i = 0; i < buffer.length; i++) {\n // Clamp value between -1 and 1\n const s = Math.max(-1, Math.min(1, buffer[i]));\n // Convert to 16-bit signed integer\n int16[i] = s < 0 ? s * 0x8000 : s * 0x7fff;\n }\n return int16;\n }\n\n /**\n * Close WebSocket connection\n */\n private closeWebSocket(): void {\n if (this.socket) {\n this.socket.onopen = null;\n this.socket.onmessage = null;\n this.socket.onerror = null;\n this.socket.onclose = null;\n\n if (this.socket.readyState === WebSocket.OPEN ||\n this.socket.readyState === WebSocket.CONNECTING) {\n this.socket.close();\n }\n this.socket = null;\n }\n }\n\n /**\n * Stop media stream tracks\n */\n private stopMediaStream(): void {\n if (this.mediaStream) {\n this.mediaStream.getTracks().forEach(track => track.stop());\n this.mediaStream = null;\n }\n }\n}\n","import { BaseTranscriber } from '../core/BaseTranscriber';\nimport type {\n TranscriptionConfig,\n TranscriptionResult,\n Word,\n ProviderCapabilities,\n} from '../types';\nimport {\n SessionState,\n TranscriptionError,\n ErrorCode,\n TranscriptionProvider,\n} from '../types';\n\n/** AssemblyAI authentication endpoint */\nconst ASSEMBLYAI_AUTH_URL = 'https://api.assemblyai.com/v2/realtime/token';\n\n/** AssemblyAI WebSocket endpoint */\nconst ASSEMBLYAI_WS_URL = 'wss://api.assemblyai.com/v2/realtime/ws';\n\n/** Required sample rate for AssemblyAI */\nconst SAMPLE_RATE = 16000;\n\n/** Reconnect delay in milliseconds */\nconst RECONNECT_DELAY = 1000;\n\n/**\n * AssemblyAI-specific configuration options\n */\nexport interface AssemblyAIOptions {\n /** Keywords to boost recognition */\n wordBoost?: string[];\n /** Boost parameter strength */\n boostParam?: 'low' | 'default' | 'high';\n /** Disable partial (interim) transcripts */\n disablePartialTranscripts?: boolean;\n /** Auto-format text */\n formatText?: boolean;\n /** Enable punctuation */\n punctuate?: boolean;\n /** Include disfluencies (um, uh) */\n disfluencies?: boolean;\n /** Enable multichannel processing */\n multichannel?: boolean;\n /** Enable dual channel processing */\n dualChannel?: boolean;\n /** Enable speaker labels */\n speakerLabels?: boolean;\n /** Expected number of speakers */\n speakersExpected?: number;\n /** Enable entity detection */\n entityDetection?: boolean;\n /** Enable sentiment analysis */\n sentimentAnalysis?: boolean;\n /** Enable auto highlights */\n autoHighlights?: boolean;\n /** Enable content safety detection */\n contentSafety?: boolean;\n}\n\n/**\n * AssemblyAI WebSocket message types\n */\ninterface AssemblyAIMessage {\n message_type: 'SessionBegins' | 'PartialTranscript' | 'FinalTranscript' | 'SessionTerminated' | 'error';\n session_id?: string;\n expires_at?: string;\n text?: string;\n confidence?: number;\n audio_start?: number;\n audio_end?: number;\n created?: string;\n words?: Array<{\n text: string;\n start: number;\n end: number;\n confidence: number;\n speaker?: string;\n }>;\n error?: string;\n}\n\n/**\n * Transcription provider using AssemblyAI's real-time WebSocket API\n * Provides high-accuracy transcription with advanced features\n */\nexport class AssemblyAIProvider extends BaseTranscriber {\n /** WebSocket connection */\n private socket: WebSocket | null = null;\n\n /** Media stream from microphone */\n private mediaStream: MediaStream | null = null;\n\n /** Audio context for processing */\n private audioContext: AudioContext | null = null;\n\n /** Audio processor node */\n private processor: ScriptProcessorNode | null = null;\n\n /** Session token for WebSocket authentication */\n private sessionToken: string | null = null;\n\n /** Connection attempt counter */\n private connectionAttempts: number = 0;\n\n /** Maximum reconnection attempts */\n private readonly maxRetries: number = 3;\n\n /** Reconnection timeout */\n private reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\n\n /** Flag indicating if connection is ready */\n private isConnectionReady: boolean = false;\n\n /** Flag for intentional close */\n private isIntentionalClose: boolean = false;\n\n /** Session ID from AssemblyAI */\n private sessionId: string | null = null;\n\n /** Provider capabilities */\n public static readonly capabilities: ProviderCapabilities = {\n supportsInterim: true,\n supportsWordTimestamps: true,\n supportsSpeakerDiarization: true,\n supportsPunctuation: true,\n supportsLanguageDetection: false,\n supportedLanguages: ['en', 'en-US', 'en-GB', 'en-AU'],\n };\n\n /**\n * Create a new AssemblyAIProvider\n * @param config - Transcription configuration with API key\n */\n constructor(config: Omit<TranscriptionConfig, 'provider'> & { provider?: TranscriptionProvider }) {\n super({ ...config, provider: TranscriptionProvider.AssemblyAI });\n }\n\n /**\n * Check if AssemblyAI provider is supported\n */\n isSupported(): boolean {\n if (typeof window === 'undefined') {\n return typeof WebSocket !== 'undefined' && typeof fetch !== 'undefined';\n }\n return !!(\n typeof WebSocket !== 'undefined' &&\n typeof fetch !== 'undefined' &&\n navigator.mediaDevices &&\n typeof navigator.mediaDevices.getUserMedia === 'function' &&\n (window.AudioContext || (window as unknown as { webkitAudioContext: typeof AudioContext }).webkitAudioContext)\n );\n }\n\n /**\n * Initialize the AssemblyAI provider\n */\n async initialize(): Promise<void> {\n if (!this.config.apiKey) {\n throw new TranscriptionError(\n 'AssemblyAI API key is required',\n ErrorCode.INVALID_CONFIG,\n TranscriptionProvider.AssemblyAI\n );\n }\n\n if (!this.isSupported()) {\n throw new TranscriptionError(\n 'AssemblyAI provider is not supported in this environment',\n ErrorCode.UNSUPPORTED_BROWSER,\n TranscriptionProvider.AssemblyAI\n );\n }\n\n this.setState(SessionState.INITIALIZING);\n this.isConnectionReady = false;\n this.isIntentionalClose = false;\n\n try {\n // Get temporary session token\n this.sessionToken = await this.getSessionToken();\n\n // Set up WebSocket connection\n await this.setupWebSocket();\n } catch (error) {\n this.handleError(error as Error);\n throw error;\n }\n }\n\n /**\n * Start transcription\n */\n async start(): Promise<void> {\n if (!this.socket || !this.isConnectionReady) {\n await this.initialize();\n }\n\n if (this.state === SessionState.ACTIVE) {\n return;\n }\n\n try {\n await this.getMicrophoneAccess();\n this.setupAudioProcessing();\n this.setState(SessionState.ACTIVE);\n this.emit('start');\n } catch (error) {\n this.handleError(error as Error);\n throw error;\n }\n }\n\n /**\n * Stop transcription\n */\n async stop(): Promise<void> {\n if (this.state === SessionState.STOPPED || this.state === SessionState.IDLE) {\n return;\n }\n\n this.setState(SessionState.STOPPING);\n this.isIntentionalClose = true;\n\n // Send terminate message\n this.sendTerminateMessage();\n\n // Wait briefly for final results\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // Close WebSocket\n this.closeWebSocket();\n\n // Stop audio processing\n this.stopAudioProcessing();\n\n // Release microphone\n this.stopMediaStream();\n\n this.setState(SessionState.STOPPED);\n this.emit('stop');\n }\n\n /**\n * Pause transcription\n */\n pause(): void {\n if (this.state !== SessionState.ACTIVE) {\n return;\n }\n\n this.stopAudioProcessing();\n this.setState(SessionState.PAUSED);\n this.emit('pause');\n }\n\n /**\n * Resume transcription\n */\n resume(): void {\n if (this.state !== SessionState.PAUSED) {\n return;\n }\n\n if (this.mediaStream && this.audioContext) {\n this.setupAudioProcessing();\n }\n\n this.setState(SessionState.ACTIVE);\n this.emit('resume');\n }\n\n /**\n * Send audio data through WebSocket\n * @param audioData - Raw audio data as ArrayBuffer\n */\n sendAudio(audioData: ArrayBuffer): void {\n if (this.socket && this.socket.readyState === WebSocket.OPEN && this.state === SessionState.ACTIVE) {\n const base64Audio = this.encodeAudioToBase64(audioData);\n this.sendAudioMessage(base64Audio);\n this.recordAudioData(audioData);\n }\n }\n\n /**\n * Clean up all resources\n */\n async cleanup(): Promise<void> {\n this.isIntentionalClose = true;\n\n // Clear timeouts\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = null;\n }\n\n // Close WebSocket\n this.closeWebSocket();\n\n // Stop audio processing\n this.stopAudioProcessing();\n\n // Close audio context\n if (this.audioContext) {\n try {\n await this.audioContext.close();\n } catch {\n // Ignore errors\n }\n this.audioContext = null;\n }\n\n // Stop media stream\n this.stopMediaStream();\n\n // Reset state\n this.sessionToken = null;\n this.sessionId = null;\n this.connectionAttempts = 0;\n this.isConnectionReady = false;\n\n // Remove all listeners\n this.removeAllListeners();\n }\n\n /**\n * Get provider capabilities\n */\n getCapabilities(): ProviderCapabilities {\n return AssemblyAIProvider.capabilities;\n }\n\n // ==================== Private Methods ====================\n\n /**\n * Get temporary session token from AssemblyAI\n */\n private async getSessionToken(): Promise<string> {\n try {\n const response = await fetch(ASSEMBLYAI_AUTH_URL, {\n method: 'POST',\n headers: {\n 'authorization': this.config.apiKey!,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ expires_in: 3600 }),\n });\n\n if (!response.ok) {\n if (response.status === 401) {\n throw new TranscriptionError(\n 'Invalid AssemblyAI API key',\n ErrorCode.AUTHENTICATION_FAILED,\n TranscriptionProvider.AssemblyAI\n );\n }\n throw new TranscriptionError(\n `Failed to get session token: ${response.statusText}`,\n ErrorCode.PROVIDER_ERROR,\n TranscriptionProvider.AssemblyAI\n );\n }\n\n const data = await response.json() as { token: string };\n return data.token;\n } catch (error) {\n if (error instanceof TranscriptionError) {\n throw error;\n }\n throw new TranscriptionError(\n 'Failed to authenticate with AssemblyAI',\n ErrorCode.NETWORK_ERROR,\n TranscriptionProvider.AssemblyAI,\n error\n );\n }\n }\n\n /**\n * Set up WebSocket connection\n */\n private async setupWebSocket(): Promise<void> {\n return new Promise((resolve, reject) => {\n const url = `${ASSEMBLYAI_WS_URL}?sample_rate=${SAMPLE_RATE}&token=${this.sessionToken}`;\n\n this.socket = new WebSocket(url);\n\n const connectionTimeout = setTimeout(() => {\n reject(new TranscriptionError(\n 'WebSocket connection timeout',\n ErrorCode.CONNECTION_FAILED,\n TranscriptionProvider.AssemblyAI\n ));\n }, 10000);\n\n this.socket.onopen = (): void => {\n clearTimeout(connectionTimeout);\n this.handleWebSocketOpen();\n resolve();\n };\n\n this.socket.onmessage = (event: MessageEvent): void => {\n this.handleWebSocketMessage(event);\n };\n\n this.socket.onerror = (event: Event): void => {\n clearTimeout(connectionTimeout);\n this.handleWebSocketError(event);\n reject(new TranscriptionError(\n 'WebSocket connection error',\n ErrorCode.CONNECTION_FAILED,\n TranscriptionProvider.AssemblyAI\n ));\n };\n\n this.socket.onclose = (event: CloseEvent): void => {\n clearTimeout(connectionTimeout);\n this.handleWebSocketClose(event);\n };\n });\n }\n\n /**\n * Handle WebSocket open event\n */\n private handleWebSocketOpen(): void {\n this.connectionAttempts = 0;\n // AssemblyAI will send SessionBegins message\n }\n\n /**\n * Handle incoming WebSocket messages\n */\n private handleWebSocketMessage(event: MessageEvent): void {\n try {\n const message: AssemblyAIMessage = JSON.parse(event.data as string);\n\n switch (message.message_type) {\n case 'SessionBegins':\n this.handleSessionBegins(message);\n break;\n\n case 'PartialTranscript':\n this.handlePartialTranscript(message);\n break;\n\n case 'FinalTranscript':\n this.handleFinalTranscript(message);\n break;\n\n case 'SessionTerminated':\n this.handleSessionTerminated();\n break;\n\n case 'error':\n this.handleAssemblyAIError(message);\n break;\n }\n } catch (error) {\n console.error('Failed to parse AssemblyAI message:', error);\n }\n }\n\n /**\n * Handle SessionBegins message\n */\n private handleSessionBegins(message: AssemblyAIMessage): void {\n this.sessionId = message.session_id || null;\n this.isConnectionReady = true;\n }\n\n /**\n * Handle partial (interim) transcript\n */\n private handlePartialTranscript(message: AssemblyAIMessage): void {\n if (!message.text) return;\n\n const result: TranscriptionResult = {\n text: message.text,\n isFinal: false,\n confidence: message.confidence,\n timestamp: Date.now(),\n language: this.config.language,\n };\n\n this.handleTranscript(result);\n }\n\n /**\n * Handle final transcript\n */\n private handleFinalTranscript(message: AssemblyAIMessage): void {\n if (!message.text) return;\n\n // Extract words with timing\n const words: Word[] | undefined = message.words?.map(w => ({\n text: w.text,\n start: w.start,\n end: w.end,\n confidence: w.confidence,\n }));\n\n const result: TranscriptionResult = {\n text: message.text,\n isFinal: true,\n confidence: message.confidence,\n timestamp: Date.now(),\n words,\n language: this.config.language,\n };\n\n this.handleTranscript(result);\n }\n\n /**\n * Handle session terminated message\n */\n private handleSessionTerminated(): void {\n this.isConnectionReady = false;\n\n if (!this.isIntentionalClose) {\n this.setState(SessionState.STOPPED);\n this.emit('stop');\n }\n }\n\n /**\n * Handle AssemblyAI-specific errors\n */\n private handleAssemblyAIError(message: AssemblyAIMessage): void {\n let errorCode = ErrorCode.PROVIDER_ERROR;\n const errorMessage = message.error || 'Unknown AssemblyAI error';\n\n if (errorMessage.toLowerCase().includes('unauthorized') ||\n errorMessage.toLowerCase().includes('invalid token')) {\n errorCode = ErrorCode.AUTHENTICATION_FAILED;\n } else if (errorMessage.toLowerCase().includes('insufficient credits')) {\n errorCode = ErrorCode.PROVIDER_ERROR;\n } else if (errorMessage.toLowerCase().includes('session expired')) {\n errorCode = ErrorCode.SESSION_EXPIRED;\n }\n\n const error = new TranscriptionError(\n errorMessage,\n errorCode,\n TranscriptionProvider.AssemblyAI,\n message\n );\n\n this.emit('error', error);\n }\n\n /**\n * Handle WebSocket error\n */\n private handleWebSocketError(_event: Event): void {\n if (!this.isIntentionalClose && this.connectionAttempts < this.maxRetries) {\n this.reconnect();\n } else {\n const error = new TranscriptionError(\n 'WebSocket connection error',\n ErrorCode.CONNECTION_FAILED,\n TranscriptionProvider.AssemblyAI\n );\n this.handleError(error);\n }\n }\n\n /**\n * Handle WebSocket close\n */\n private handleWebSocketClose(event: CloseEvent): void {\n this.isConnectionReady = false;\n\n if (!this.isIntentionalClose && this.state === SessionState.ACTIVE) {\n if (this.connectionAttempts < this.maxRetries) {\n this.reconnect();\n } else {\n const error = new TranscriptionError(\n `WebSocket closed unexpectedly: ${event.code} ${event.reason}`,\n ErrorCode.CONNECTION_FAILED,\n TranscriptionProvider.AssemblyAI\n );\n this.handleError(error);\n }\n }\n }\n\n /**\n * Attempt to reconnect\n */\n private reconnect(): void {\n this.connectionAttempts++;\n const delay = RECONNECT_DELAY * Math.pow(2, this.connectionAttempts - 1);\n\n this.reconnectTimeout = setTimeout(async () => {\n try {\n // Get new token and reconnect\n this.sessionToken = await this.getSessionToken();\n await this.setupWebSocket();\n if (this.mediaStream) {\n this.setupAudioProcessing();\n }\n } catch (error) {\n if (this.connectionAttempts < this.maxRetries) {\n this.reconnect();\n } else {\n this.handleError(error as Error);\n }\n }\n }, delay);\n }\n\n /**\n * Request microphone access\n */\n private async getMicrophoneAccess(): Promise<void> {\n try {\n this.mediaStream = await navigator.mediaDevices.getUserMedia({\n audio: {\n sampleRate: SAMPLE_RATE,\n channelCount: 1,\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n },\n });\n } catch (error) {\n throw new TranscriptionError(\n 'Microphone access denied',\n ErrorCode.MICROPHONE_ACCESS_DENIED,\n TranscriptionProvider.AssemblyAI,\n error\n );\n }\n }\n\n /**\n * Set up audio processing pipeline\n */\n private setupAudioProcessing(): void {\n if (!this.mediaStream) return;\n\n const AudioContextClass = window.AudioContext ||\n (window as unknown as { webkitAudioContext: typeof AudioContext }).webkitAudioContext;\n\n this.audioContext = new AudioContextClass({ sampleRate: SAMPLE_RATE });\n\n const source = this.audioContext.createMediaStreamSource(this.mediaStream);\n\n // Use ScriptProcessorNode for audio processing\n this.processor = this.audioContext.createScriptProcessor(4096, 1, 1);\n\n this.processor.onaudioprocess = (event: AudioProcessingEvent): void => {\n if (this.state !== SessionState.ACTIVE) return;\n\n const inputData = event.inputBuffer.getChannelData(0);\n const pcmData = this.convertFloat32ToPCM16(inputData);\n this.sendAudio(pcmData);\n };\n\n source.connect(this.processor);\n this.processor.connect(this.audioContext.destination);\n }\n\n /**\n * Stop audio processing\n */\n private stopAudioProcessing(): void {\n if (this.processor) {\n this.processor.disconnect();\n this.processor.onaudioprocess = null;\n this.processor = null;\n }\n }\n\n /**\n * Convert Float32 audio samples to PCM16 (Int16)\n */\n private convertFloat32ToPCM16(float32Array: Float32Array): ArrayBuffer {\n const int16 = new Int16Array(float32Array.length);\n for (let i = 0; i < float32Array.length; i++) {\n // Clamp value between -1 and 1\n const s = Math.max(-1, Math.min(1, float32Array[i]));\n // Convert to 16-bit signed integer\n int16[i] = s < 0 ? s * 0x8000 : s * 0x7fff;\n }\n return int16.buffer as ArrayBuffer;\n }\n\n /**\n * Encode ArrayBuffer to base64\n */\n private encodeAudioToBase64(arrayBuffer: ArrayBuffer): string {\n const bytes = new Uint8Array(arrayBuffer);\n let binary = '';\n for (let i = 0; i < bytes.byteLength; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n }\n\n /**\n * Send audio data message\n */\n private sendAudioMessage(base64Audio: string): void {\n if (this.socket && this.socket.readyState === WebSocket.OPEN) {\n this.socket.send(JSON.stringify({ audio_data: base64Audio }));\n }\n }\n\n /**\n * Send terminate session message\n */\n private sendTerminateMessage(): void {\n if (this.socket && this.socket.readyState === WebSocket.OPEN) {\n this.socket.send(JSON.stringify({ terminate_session: true }));\n }\n }\n\n /**\n * Close WebSocket connection\n */\n private closeWebSocket(): void {\n if (this.socket) {\n this.socket.onopen = null;\n this.socket.onmessage = null;\n this.socket.onerror = null;\n this.socket.onclose = null;\n\n if (this.socket.readyState === WebSocket.OPEN ||\n this.socket.readyState === WebSocket.CONNECTING) {\n this.socket.close();\n }\n this.socket = null;\n }\n }\n\n /**\n * Stop media stream tracks\n */\n private stopMediaStream(): void {\n if (this.mediaStream) {\n this.mediaStream.getTracks().forEach(track => track.stop());\n this.mediaStream = null;\n }\n }\n}\n","/**\n * Static utility class for audio processing operations\n * Provides conversion, resampling, and format utilities\n */\nexport class AudioProcessor {\n /**\n * Convert Float32 audio samples to Int16\n * @param buffer - Input Float32Array\n * @returns Int16Array of converted samples\n */\n static convertFloat32ToInt16(buffer: Float32Array): Int16Array {\n const int16 = new Int16Array(buffer.length);\n for (let i = 0; i < buffer.length; i++) {\n const s = Math.max(-1, Math.min(1, buffer[i]));\n int16[i] = s < 0 ? s * 0x8000 : s * 0x7fff;\n }\n return int16;\n }\n\n /**\n * Convert Int16 audio samples to Float32\n * @param buffer - Input Int16Array\n * @returns Float32Array of converted samples\n */\n static convertInt16ToFloat32(buffer: Int16Array): Float32Array {\n const float32 = new Float32Array(buffer.length);\n for (let i = 0; i < buffer.length; i++) {\n float32[i] = buffer[i] / 32768.0;\n }\n return float32;\n }\n\n /**\n * Resample audio buffer to different sample rate\n * Uses linear interpolation\n * @param buffer - Input audio buffer\n * @param fromRate - Source sample rate\n * @param toRate - Target sample rate\n * @returns Resampled Float32Array\n */\n static resampleBuffer(buffer: Float32Array, fromRate: number, toRate: number): Float32Array {\n if (fromRate === toRate) {\n return buffer;\n }\n\n const ratio = toRate / fromRate;\n const newLength = Math.round(buffer.length * ratio);\n const output = new Float32Array(newLength);\n\n for (let i = 0; i < newLength; i++) {\n const srcPosition = i / ratio;\n const srcIndex = Math.floor(srcPosition);\n const fraction = srcPosition - srcIndex;\n\n const sample1 = buffer[srcIndex] || 0;\n const sample2 = buffer[srcIndex + 1] || sample1;\n\n output[i] = sample1 + (sample2 - sample1) * fraction;\n }\n\n return output;\n }\n\n /**\n * Downsample audio buffer (optimized for reducing sample rate)\n * @param buffer - Input audio buffer\n * @param fromRate - Source sample rate\n * @param toRate - Target sample rate\n * @returns Downsampled Float32Array\n */\n static downsampleBuffer(buffer: Float32Array, fromRate: number, toRate: number): Float32Array {\n if (fromRate <= toRate) {\n return buffer;\n }\n\n const ratio = fromRate / toRate;\n const newLength = Math.ceil(buffer.length / ratio);\n const output = new Float32Array(newLength);\n\n for (let i = 0; i < newLength; i++) {\n const startIdx = Math.floor(i * ratio);\n const endIdx = Math.min(Math.floor((i + 1) * ratio), buffer.length);\n\n let sum = 0;\n const count = endIdx - startIdx;\n for (let j = startIdx; j < endIdx; j++) {\n sum += buffer[j];\n }\n output[i] = count > 0 ? sum / count : 0;\n }\n\n return output;\n }\n\n /**\n * Upsample audio buffer (optimized for increasing sample rate)\n * @param buffer - Input audio buffer\n * @param fromRate - Source sample rate\n * @param toRate - Target sample rate\n * @returns Upsampled Float32Array\n */\n static upsampleBuffer(buffer: Float32Array, fromRate: number, toRate: number): Float32Array {\n if (fromRate >= toRate) {\n return buffer;\n }\n\n return this.resampleBuffer(buffer, fromRate, toRate);\n }\n\n /**\n * Normalize audio buffer to peak amplitude of 1.0\n * @param buffer - Input audio buffer\n * @returns Normalized Float32Array\n */\n static normalizeBuffer(buffer: Float32Array): Float32Array {\n let peak = 0;\n for (let i = 0; i < buffer.length; i++) {\n const abs = Math.abs(buffer[i]);\n if (abs > peak) peak = abs;\n }\n\n if (peak === 0) {\n return buffer;\n }\n\n const output = new Float32Array(buffer.length);\n for (let i = 0; i < buffer.length; i++) {\n output[i] = buffer[i] / peak;\n }\n return output;\n }\n\n /**\n * Apply gain to audio buffer\n * @param buffer - Input audio buffer\n * @param gain - Gain multiplier\n * @returns Processed Float32Array\n */\n static applyGain(buffer: Float32Array, gain: number): Float32Array {\n const output = new Float32Array(buffer.length);\n for (let i = 0; i < buffer.length; i++) {\n output[i] = Math.max(-1, Math.min(1, buffer[i] * gain));\n }\n return output;\n }\n\n /**\n * Mix two audio buffers together\n * @param buffer1 - First audio buffer\n * @param buffer2 - Second audio buffer\n * @param ratio - Mix ratio (0-1, where 0.5 is equal mix)\n * @returns Mixed Float32Array\n */\n static mixBuffers(buffer1: Float32Array, buffer2: Float32Array, ratio: number = 0.5): Float32Array {\n const length = Math.max(buffer1.length, buffer2.length);\n const output = new Float32Array(length);\n\n for (let i = 0; i < length; i++) {\n const s1 = i < buffer1.length ? buffer1[i] : 0;\n const s2 = i < buffer2.length ? buffer2[i] : 0;\n output[i] = Math.max(-1, Math.min(1, s1 * (1 - ratio) + s2 * ratio));\n }\n\n return output;\n }\n\n /**\n * Convert AudioBuffer to WAV format\n * @param audioBuffer - Web Audio API AudioBuffer\n * @param sampleRate - Output sample rate (defaults to buffer's sample rate)\n * @returns WAV file as ArrayBuffer\n */\n static bufferToWav(audioBuffer: AudioBuffer, sampleRate?: number): ArrayBuffer {\n const outputRate = sampleRate || audioBuffer.sampleRate;\n const channels = audioBuffer.numberOfChannels;\n const bitDepth = 16;\n\n // Get channel data\n const sourceData = audioBuffer.getChannelData(0);\n\n // Resample if needed\n const channelData = outputRate !== audioBuffer.sampleRate\n ? this.resampleBuffer(sourceData, audioBuffer.sampleRate, outputRate)\n : new Float32Array(sourceData);\n\n // Convert to Int16\n const int16Data = this.convertFloat32ToInt16(channelData);\n\n // Create WAV file\n const dataLength = int16Data.length * (bitDepth / 8);\n const header = this.createWavHeader(dataLength, outputRate, channels, bitDepth);\n\n // Combine header and data\n const wav = new ArrayBuffer(44 + dataLength);\n const view = new DataView(wav);\n\n // Copy header\n const headerView = new DataView(header);\n for (let i = 0; i < 44; i++) {\n view.setUint8(i, headerView.getUint8(i));\n }\n\n // Copy audio data\n for (let i = 0; i < int16Data.length; i++) {\n view.setInt16(44 + i * 2, int16Data[i], true);\n }\n\n return wav;\n }\n\n /**\n * Create WAV file header\n * @param dataLength - Length of audio data in bytes\n * @param sampleRate - Sample rate\n * @param channels - Number of channels\n * @param bitDepth - Bits per sample\n * @returns WAV header as ArrayBuffer\n */\n static createWavHeader(dataLength: number, sampleRate: number, channels: number, bitDepth: number): ArrayBuffer {\n const header = new ArrayBuffer(44);\n const view = new DataView(header);\n\n const byteRate = sampleRate * channels * (bitDepth / 8);\n const blockAlign = channels * (bitDepth / 8);\n\n // RIFF chunk descriptor\n this.writeString(view, 0, 'RIFF');\n view.setUint32(4, 36 + dataLength, true);\n this.writeString(view, 8, 'WAVE');\n\n // fmt sub-chunk\n this.writeString(view, 12, 'fmt ');\n view.setUint32(16, 16, true); // Subchunk1Size (16 for PCM)\n view.setUint16(20, 1, true); // AudioFormat (1 for PCM)\n view.setUint16(22, channels, true);\n view.setUint32(24, sampleRate, true);\n view.setUint32(28, byteRate, true);\n view.setUint16(32, blockAlign, true);\n view.setUint16(34, bitDepth, true);\n\n // data sub-chunk\n this.writeString(view, 36, 'data');\n view.setUint32(40, dataLength, true);\n\n return header;\n }\n\n /**\n * Write string to DataView\n * @param view - DataView to write to\n * @param offset - Byte offset\n * @param string - String to write\n */\n private static writeString(view: DataView, offset: number, string: string): void {\n for (let i = 0; i < string.length; i++) {\n view.setUint8(offset + i, string.charCodeAt(i));\n }\n }\n\n /**\n * Convert raw PCM Float32 array to WAV ArrayBuffer\n * @param samples - Float32Array of audio samples\n * @param sampleRate - Sample rate\n * @returns WAV file as ArrayBuffer\n */\n static float32ToWav(samples: Float32Array, sampleRate: number): ArrayBuffer {\n const int16Data = this.convertFloat32ToInt16(samples);\n const dataLength = int16Data.length * 2;\n const header = this.createWavHeader(dataLength, sampleRate, 1, 16);\n\n const wav = new ArrayBuffer(44 + dataLength);\n const view = new DataView(wav);\n\n // Copy header\n const headerView = new DataView(header);\n for (let i = 0; i < 44; i++) {\n view.setUint8(i, headerView.getUint8(i));\n }\n\n // Copy audio data\n for (let i = 0; i < int16Data.length; i++) {\n view.setInt16(44 + i * 2, int16Data[i], true);\n }\n\n return wav;\n }\n}\n","/**\n * Voice Activity Detection options\n */\nexport interface VADOptions {\n /** Energy threshold for speech detection (0-1, default: 0.01) */\n threshold?: number;\n /** Minimum duration of speech in ms to trigger start (default: 300) */\n minSpeechDuration?: number;\n /** Minimum duration of silence in ms to trigger end (default: 500) */\n minSilenceDuration?: number;\n /** Size of energy history buffer (default: 10) */\n historySize?: number;\n /** Callback when speech starts */\n onSpeechStart?: () => void;\n /** Callback when speech ends */\n onSpeechEnd?: () => void;\n /** Callback for volume level changes */\n onVolumeChange?: (level: number) => void;\n}\n\n/**\n * Voice Activity Detector using energy-based detection\n * Detects speech and silence in audio streams\n */\nexport class VoiceActivityDetector {\n /** Energy threshold for speech detection */\n private threshold: number;\n\n /** Minimum speech duration in ms */\n private minSpeechDuration: number;\n\n /** Minimum silence duration in ms */\n private minSilenceDuration: number;\n\n /** Energy history buffer */\n private energyHistory: number[] = [];\n\n /** History buffer size */\n private historySize: number;\n\n /** Current speaking state */\n private isSpeaking: boolean = false;\n\n /** Speech start time */\n private speechStartTime: number | null = null;\n\n /** Silence start time */\n private silenceStartTime: number | null = null;\n\n /** Speech start callback */\n private onSpeechStart?: () => void;\n\n /** Speech end callback */\n private onSpeechEnd?: () => void;\n\n /** Volume change callback */\n private onVolumeChange?: (level: number) => void;\n\n /** Last processed timestamp */\n private lastProcessTime: number = 0;\n\n /**\n * Create a new VoiceActivityDetector\n * @param options - VAD configuration options\n */\n constructor(options: VADOptions = {}) {\n this.threshold = options.threshold ?? 0.01;\n this.minSpeechDuration = options.minSpeechDuration ?? 300;\n this.minSilenceDuration = options.minSilenceDuration ?? 500;\n this.historySize = options.historySize ?? 10;\n this.onSpeechStart = options.onSpeechStart;\n this.onSpeechEnd = options.onSpeechEnd;\n this.onVolumeChange = options.onVolumeChange;\n }\n\n /**\n * Process audio data and detect voice activity\n * @param audioData - Audio samples as Float32Array\n * @returns Current speaking state\n */\n processAudio(audioData: Float32Array): boolean {\n const currentTime = Date.now();\n const energy = this.calculateRMSEnergy(audioData);\n\n // Update energy history\n this.energyHistory.push(energy);\n if (this.energyHistory.length > this.historySize) {\n this.energyHistory.shift();\n }\n\n // Notify volume change\n if (this.onVolumeChange) {\n this.onVolumeChange(energy);\n }\n\n // Determine if speech or silence based on threshold\n const isAboveThreshold = energy > this.threshold;\n\n if (isAboveThreshold) {\n // Potential speech detected\n this.silenceStartTime = null;\n\n if (!this.isSpeaking) {\n if (this.speechStartTime === null) {\n this.speechStartTime = currentTime;\n } else if (currentTime - this.speechStartTime >= this.minSpeechDuration) {\n // Confirmed speech start\n this.isSpeaking = true;\n this.speechStartTime = null;\n if (this.onSpeechStart) {\n this.onSpeechStart();\n }\n }\n }\n } else {\n // Potential silence detected\n this.speechStartTime = null;\n\n if (this.isSpeaking) {\n if (this.silenceStartTime === null) {\n this.silenceStartTime = currentTime;\n } else if (currentTime - this.silenceStartTime >= this.minSilenceDuration) {\n // Confirmed speech end\n this.isSpeaking = false;\n this.silenceStartTime = null;\n if (this.onSpeechEnd) {\n this.onSpeechEnd();\n }\n }\n }\n }\n\n this.lastProcessTime = currentTime;\n return this.isSpeaking;\n }\n\n /**\n * Calculate RMS (Root Mean Square) energy of audio buffer\n * @param buffer - Audio samples\n * @returns RMS energy value (0-1)\n */\n calculateRMSEnergy(buffer: Float32Array): number {\n let sum = 0;\n for (let i = 0; i < buffer.length; i++) {\n sum += buffer[i] * buffer[i];\n }\n return Math.sqrt(sum / buffer.length);\n }\n\n /**\n * Calculate adaptive threshold based on energy history\n * @returns Adaptive threshold value\n */\n calculateAdaptiveThreshold(): number {\n if (this.energyHistory.length === 0) {\n return this.threshold;\n }\n\n const average = this.energyHistory.reduce((a, b) => a + b, 0) / this.energyHistory.length;\n return average * 1.5 + 0.005; // Add small offset to avoid false positives\n }\n\n /**\n * Reset detector state\n */\n reset(): void {\n this.energyHistory = [];\n this.isSpeaking = false;\n this.speechStartTime = null;\n this.silenceStartTime = null;\n this.lastProcessTime = 0;\n }\n\n /**\n * Update threshold value\n * @param threshold - New threshold (0-1)\n */\n setThreshold(threshold: number): void {\n this.threshold = Math.max(0, Math.min(1, threshold));\n }\n\n /**\n * Get average energy from history\n * @returns Average energy value\n */\n getAverageEnergy(): number {\n if (this.energyHistory.length === 0) {\n return 0;\n }\n return this.energyHistory.reduce((a, b) => a + b, 0) / this.energyHistory.length;\n }\n\n /**\n * Check if speech is currently detected\n * @returns Speaking state\n */\n isSpeechDetected(): boolean {\n return this.isSpeaking;\n }\n\n /**\n * Get current threshold\n * @returns Threshold value\n */\n getThreshold(): number {\n return this.threshold;\n }\n\n /**\n * Update callbacks\n * @param callbacks - New callback functions\n */\n setCallbacks(callbacks: {\n onSpeechStart?: () => void;\n onSpeechEnd?: () => void;\n onVolumeChange?: (level: number) => void;\n }): void {\n if (callbacks.onSpeechStart !== undefined) {\n this.onSpeechStart = callbacks.onSpeechStart;\n }\n if (callbacks.onSpeechEnd !== undefined) {\n this.onSpeechEnd = callbacks.onSpeechEnd;\n }\n if (callbacks.onVolumeChange !== undefined) {\n this.onVolumeChange = callbacks.onVolumeChange;\n }\n }\n}\n","/**\n * Audio level monitor options\n */\nexport interface AudioLevelMonitorOptions {\n /** Smoothing factor for level calculation (0-1, default: 0.8) */\n smoothingFactor?: number;\n /** Callback for level changes */\n onLevelChange?: (level: number) => void;\n}\n\n/**\n * Monitors and reports audio levels with smoothing\n */\nexport class AudioLevelMonitor {\n /** Smoothing factor (0-1, higher = smoother) */\n private smoothingFactor: number;\n\n /** Current smoothed level */\n private currentLevel: number = 0;\n\n /** Peak level since last reset */\n private peakLevel: number = 0;\n\n /** Level change callback */\n private onLevelChange?: (level: number) => void;\n\n /**\n * Create a new AudioLevelMonitor\n * @param options - Monitor configuration\n */\n constructor(options: AudioLevelMonitorOptions = {}) {\n this.smoothingFactor = options.smoothingFactor ?? 0.8;\n this.onLevelChange = options.onLevelChange;\n }\n\n /**\n * Process audio data and update levels\n * @param audioData - Audio samples as Float32Array\n * @returns Current smoothed level\n */\n processAudio(audioData: Float32Array): number {\n const instantLevel = this.calculateLevel(audioData);\n\n // Apply exponential smoothing\n this.currentLevel = this.smoothingFactor * this.currentLevel + (1 - this.smoothingFactor) * instantLevel;\n\n // Update peak\n if (this.currentLevel > this.peakLevel) {\n this.peakLevel = this.currentLevel;\n }\n\n // Notify listener\n if (this.onLevelChange) {\n this.onLevelChange(this.currentLevel);\n }\n\n return this.currentLevel;\n }\n\n /**\n * Calculate RMS level of audio buffer\n * @param buffer - Audio samples\n * @returns Level value (0-1)\n */\n calculateLevel(buffer: Float32Array): number {\n let sum = 0;\n for (let i = 0; i < buffer.length; i++) {\n sum += buffer[i] * buffer[i];\n }\n return Math.sqrt(sum / buffer.length);\n }\n\n /**\n * Get current smoothed level\n * @returns Current level (0-1)\n */\n getCurrentLevel(): number {\n return this.currentLevel;\n }\n\n /**\n * Get peak level since last reset\n * @returns Peak level (0-1)\n */\n getPeakLevel(): number {\n return this.peakLevel;\n }\n\n /**\n * Reset current and peak levels\n */\n reset(): void {\n this.currentLevel = 0;\n this.peakLevel = 0;\n }\n\n /**\n * Reset only the peak level\n */\n resetPeak(): void {\n this.peakLevel = 0;\n }\n\n /**\n * Convert current level to decibels\n * @returns Level in dB (typically -60 to 0)\n */\n getDecibels(): number {\n if (this.currentLevel <= 0) {\n return -Infinity;\n }\n return 20 * Math.log10(this.currentLevel);\n }\n\n /**\n * Convert specific level to decibels\n * @param level - Level value (0-1)\n * @returns Level in dB\n */\n static toDecibels(level: number): number {\n if (level <= 0) {\n return -Infinity;\n }\n return 20 * Math.log10(level);\n }\n\n /**\n * Convert decibels to linear level\n * @param db - Level in decibels\n * @returns Linear level (0-1)\n */\n static fromDecibels(db: number): number {\n return Math.pow(10, db / 20);\n }\n\n /**\n * Set smoothing factor\n * @param factor - Smoothing factor (0-1)\n */\n setSmoothingFactor(factor: number): void {\n this.smoothingFactor = Math.max(0, Math.min(1, factor));\n }\n\n /**\n * Get current smoothing factor\n * @returns Smoothing factor\n */\n getSmoothingFactor(): number {\n return this.smoothingFactor;\n }\n\n /**\n * Set level change callback\n * @param callback - Callback function\n */\n setOnLevelChange(callback: ((level: number) => void) | undefined): void {\n this.onLevelChange = callback;\n }\n\n /**\n * Get level as percentage (0-100)\n * @returns Level percentage\n */\n getLevelPercentage(): number {\n return Math.min(100, this.currentLevel * 100);\n }\n}\n","/**\n * Circular buffer manager for audio chunks\n * Efficiently manages audio data for streaming applications\n */\nexport class AudioBufferManager {\n /** Maximum number of chunks to store */\n private bufferSize: number;\n\n /** Buffer storage */\n private buffer: Float32Array[] = [];\n\n /** Write position */\n private writeIndex: number = 0;\n\n /** Read position */\n private readIndex: number = 0;\n\n /** Number of available chunks */\n private count: number = 0;\n\n /**\n * Create a new AudioBufferManager\n * @param bufferSize - Maximum number of chunks to store\n */\n constructor(bufferSize: number = 100) {\n this.bufferSize = bufferSize;\n this.buffer = new Array(bufferSize);\n }\n\n /**\n * Write a chunk to the buffer\n * @param chunk - Audio data chunk\n */\n write(chunk: Float32Array): void {\n // Copy the chunk to prevent external modification\n this.buffer[this.writeIndex] = new Float32Array(chunk);\n this.writeIndex = (this.writeIndex + 1) % this.bufferSize;\n\n if (this.count < this.bufferSize) {\n this.count++;\n } else {\n // Buffer overflow - move read index\n this.readIndex = (this.readIndex + 1) % this.bufferSize;\n }\n }\n\n /**\n * Read and remove chunks from the buffer\n * @param numChunks - Number of chunks to read (default: all available)\n * @returns Array of audio chunks\n */\n read(numChunks?: number): Float32Array[] {\n const toRead = numChunks !== undefined ? Math.min(numChunks, this.count) : this.count;\n const chunks: Float32Array[] = [];\n\n for (let i = 0; i < toRead; i++) {\n const chunk = this.buffer[this.readIndex];\n if (chunk) {\n chunks.push(chunk);\n }\n this.readIndex = (this.readIndex + 1) % this.bufferSize;\n }\n\n this.count -= toRead;\n return chunks;\n }\n\n /**\n * Read chunks without removing them\n * @param numChunks - Number of chunks to peek (default: all available)\n * @returns Array of audio chunks\n */\n peek(numChunks?: number): Float32Array[] {\n const toPeek = numChunks !== undefined ? Math.min(numChunks, this.count) : this.count;\n const chunks: Float32Array[] = [];\n\n let idx = this.readIndex;\n for (let i = 0; i < toPeek; i++) {\n const chunk = this.buffer[idx];\n if (chunk) {\n chunks.push(chunk);\n }\n idx = (idx + 1) % this.bufferSize;\n }\n\n return chunks;\n }\n\n /**\n * Clear all data from buffer\n */\n clear(): void {\n this.buffer = new Array(this.bufferSize);\n this.writeIndex = 0;\n this.readIndex = 0;\n this.count = 0;\n }\n\n /**\n * Get number of available chunks\n * @returns Number of chunks in buffer\n */\n getAvailableChunks(): number {\n return this.count;\n }\n\n /**\n * Check if buffer is full\n * @returns True if buffer is full\n */\n isFull(): boolean {\n return this.count >= this.bufferSize;\n }\n\n /**\n * Check if buffer is empty\n * @returns True if buffer is empty\n */\n isEmpty(): boolean {\n return this.count === 0;\n }\n\n /**\n * Concatenate multiple chunks into a single buffer\n * @param chunks - Array of audio chunks\n * @returns Single concatenated Float32Array\n */\n concatenateChunks(chunks: Float32Array[]): Float32Array {\n if (chunks.length === 0) {\n return new Float32Array(0);\n }\n\n const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const result = new Float32Array(totalLength);\n\n let offset = 0;\n for (const chunk of chunks) {\n result.set(chunk, offset);\n offset += chunk.length;\n }\n\n return result;\n }\n\n /**\n * Get all data as a single concatenated buffer\n * @returns Concatenated Float32Array\n */\n getAll(): Float32Array {\n const chunks = this.peek();\n return this.concatenateChunks(chunks);\n }\n\n /**\n * Get total number of samples across all chunks\n * @returns Total sample count\n */\n getTotalSamples(): number {\n let total = 0;\n let idx = this.readIndex;\n for (let i = 0; i < this.count; i++) {\n const chunk = this.buffer[idx];\n if (chunk) {\n total += chunk.length;\n }\n idx = (idx + 1) % this.bufferSize;\n }\n return total;\n }\n\n /**\n * Get buffer capacity\n * @returns Maximum number of chunks\n */\n getCapacity(): number {\n return this.bufferSize;\n }\n\n /**\n * Resize the buffer\n * @param newSize - New buffer size\n */\n resize(newSize: number): void {\n if (newSize === this.bufferSize) return;\n\n const chunks = this.read();\n this.bufferSize = newSize;\n this.buffer = new Array(newSize);\n this.writeIndex = 0;\n this.readIndex = 0;\n this.count = 0;\n\n // Re-add chunks that fit in new size\n for (const chunk of chunks.slice(-newSize)) {\n this.write(chunk);\n }\n }\n}\n","import { AudioProcessor } from './AudioProcessor';\n\n/**\n * Audio recording format\n */\nexport type AudioFormat = 'raw' | 'wav';\n\n/**\n * Records audio chunks and exports to various formats\n */\nexport class AudioRecorder {\n /** Recorded audio chunks */\n private audioChunks: Float32Array[] = [];\n\n /** Sample rate */\n private sampleRate: number;\n\n /** Recording state */\n private isRecording: boolean = false;\n\n /** Recording start time */\n private startTime: number | null = null;\n\n /**\n * Create a new AudioRecorder\n * @param sampleRate - Sample rate for recording\n */\n constructor(sampleRate: number = 16000) {\n this.sampleRate = sampleRate;\n }\n\n /**\n * Start recording\n */\n start(): void {\n this.audioChunks = [];\n this.isRecording = true;\n this.startTime = Date.now();\n }\n\n /**\n * Record an audio chunk\n * @param audioData - Audio data to record\n */\n recordChunk(audioData: Float32Array): void {\n if (this.isRecording) {\n // Copy the data to prevent external modification\n this.audioChunks.push(new Float32Array(audioData));\n }\n }\n\n /**\n * Stop recording and return all recorded audio\n * @returns Complete audio as Float32Array\n */\n stop(): Float32Array {\n this.isRecording = false;\n return this.getCombinedAudio();\n }\n\n /**\n * Clear all recorded audio\n */\n clear(): void {\n this.audioChunks = [];\n this.startTime = null;\n }\n\n /**\n * Export recording to specified format\n * @param format - Output format ('raw' or 'wav')\n * @returns Audio data as ArrayBuffer\n */\n export(format: AudioFormat = 'wav'): ArrayBuffer {\n const audioData = this.getCombinedAudio();\n\n if (format === 'raw') {\n return audioData.buffer as ArrayBuffer;\n }\n\n // WAV format\n return AudioProcessor.float32ToWav(audioData, this.sampleRate);\n }\n\n /**\n * Get recording duration in seconds\n * @returns Duration in seconds\n */\n getDuration(): number {\n const totalSamples = this.audioChunks.reduce((sum, chunk) => sum + chunk.length, 0);\n return totalSamples / this.sampleRate;\n }\n\n /**\n * Get number of recorded chunks\n * @returns Chunk count\n */\n getChunkCount(): number {\n return this.audioChunks.length;\n }\n\n /**\n * Check if currently recording\n * @returns Recording state\n */\n getIsRecording(): boolean {\n return this.isRecording;\n }\n\n /**\n * Get sample rate\n * @returns Sample rate\n */\n getSampleRate(): number {\n return this.sampleRate;\n }\n\n /**\n * Set sample rate (only effective before recording starts)\n * @param sampleRate - New sample rate\n */\n setSampleRate(sampleRate: number): void {\n if (!this.isRecording) {\n this.sampleRate = sampleRate;\n }\n }\n\n /**\n * Get total number of recorded samples\n * @returns Sample count\n */\n getTotalSamples(): number {\n return this.audioChunks.reduce((sum, chunk) => sum + chunk.length, 0);\n }\n\n /**\n * Get recording start time\n * @returns Start timestamp or null\n */\n getStartTime(): number | null {\n return this.startTime;\n }\n\n /**\n * Get elapsed recording time in milliseconds\n * @returns Elapsed time in ms\n */\n getElapsedTime(): number {\n if (!this.startTime) return 0;\n return Date.now() - this.startTime;\n }\n\n /**\n * Get combined audio data\n * @returns Concatenated Float32Array\n */\n private getCombinedAudio(): Float32Array {\n if (this.audioChunks.length === 0) {\n return new Float32Array(0);\n }\n\n const totalLength = this.audioChunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const combined = new Float32Array(totalLength);\n\n let offset = 0;\n for (const chunk of this.audioChunks) {\n combined.set(chunk, offset);\n offset += chunk.length;\n }\n\n return combined;\n }\n\n /**\n * Create a Blob from the recording\n * @param format - Output format\n * @returns Blob with audio data\n */\n toBlob(format: AudioFormat = 'wav'): Blob {\n const buffer = this.export(format);\n const mimeType = format === 'wav' ? 'audio/wav' : 'application/octet-stream';\n return new Blob([buffer], { type: mimeType });\n }\n\n /**\n * Create a data URL from the recording\n * @param format - Output format\n * @returns Data URL string\n */\n toDataURL(format: AudioFormat = 'wav'): string {\n const blob = this.toBlob(format);\n return URL.createObjectURL(blob);\n }\n\n /**\n * Download the recording\n * @param filename - Output filename\n * @param format - Output format\n */\n download(filename: string = 'recording', format: AudioFormat = 'wav'): void {\n const url = this.toDataURL(format);\n const extension = format === 'wav' ? '.wav' : '.raw';\n\n const link = document.createElement('a');\n link.href = url;\n link.download = filename + extension;\n link.click();\n\n // Clean up\n URL.revokeObjectURL(url);\n }\n}\n","/**\n * Interface for storage adapters\n * Provides abstraction for different storage backends\n */\nexport interface StorageAdapter {\n /**\n * Save data to storage\n * @param key - Storage key\n * @param data - Data to store\n */\n save(key: string, data: unknown): Promise<void>;\n\n /**\n * Load data from storage\n * @param key - Storage key\n * @returns Stored data or null if not found\n */\n load(key: string): Promise<unknown | null>;\n\n /**\n * Delete data from storage\n * @param key - Storage key\n */\n delete(key: string): Promise<void>;\n\n /**\n * List all keys in storage\n * @returns Array of keys\n */\n list(): Promise<string[]>;\n\n /**\n * Check if key exists in storage\n * @param key - Storage key\n * @returns True if key exists\n */\n exists(key: string): Promise<boolean>;\n}\n\n/**\n * Storage adapter using browser localStorage\n * Suitable for small data (<5MB)\n */\nexport class LocalStorageAdapter implements StorageAdapter {\n /** Prefix for all keys */\n private prefix: string;\n\n /**\n * Create a new LocalStorageAdapter\n * @param prefix - Key prefix (default: 'live-transcribe')\n */\n constructor(prefix: string = 'live-transcribe') {\n this.prefix = prefix;\n }\n\n /**\n * Get prefixed key\n */\n private getKey(key: string): string {\n return `${this.prefix}:${key}`;\n }\n\n async save(key: string, data: unknown): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) {\n throw new Error('localStorage is not available');\n }\n const serialized = JSON.stringify(data);\n localStorage.setItem(this.getKey(key), serialized);\n }\n\n async load(key: string): Promise<unknown | null> {\n if (typeof window === 'undefined' || !window.localStorage) {\n throw new Error('localStorage is not available');\n }\n const data = localStorage.getItem(this.getKey(key));\n if (data === null) {\n return null;\n }\n return JSON.parse(data) as unknown;\n }\n\n async delete(key: string): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) {\n throw new Error('localStorage is not available');\n }\n localStorage.removeItem(this.getKey(key));\n }\n\n async list(): Promise<string[]> {\n if (typeof window === 'undefined' || !window.localStorage) {\n throw new Error('localStorage is not available');\n }\n const keys: string[] = [];\n const prefixWithColon = `${this.prefix}:`;\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(prefixWithColon)) {\n keys.push(key.substring(prefixWithColon.length));\n }\n }\n return keys;\n }\n\n async exists(key: string): Promise<boolean> {\n if (typeof window === 'undefined' || !window.localStorage) {\n throw new Error('localStorage is not available');\n }\n return localStorage.getItem(this.getKey(key)) !== null;\n }\n}\n\n/**\n * In-memory storage adapter\n * Useful for testing or temporary storage\n */\nexport class MemoryStorageAdapter implements StorageAdapter {\n private storage: Map<string, unknown> = new Map();\n\n async save(key: string, data: unknown): Promise<void> {\n // Deep clone to prevent reference issues\n this.storage.set(key, JSON.parse(JSON.stringify(data)));\n }\n\n async load(key: string): Promise<unknown | null> {\n const data = this.storage.get(key);\n if (data === undefined) {\n return null;\n }\n // Return a deep clone\n return JSON.parse(JSON.stringify(data)) as unknown;\n }\n\n async delete(key: string): Promise<void> {\n this.storage.delete(key);\n }\n\n async list(): Promise<string[]> {\n return Array.from(this.storage.keys());\n }\n\n async exists(key: string): Promise<boolean> {\n return this.storage.has(key);\n }\n\n /**\n * Clear all data\n */\n clear(): void {\n this.storage.clear();\n }\n\n /**\n * Get storage size\n */\n size(): number {\n return this.storage.size;\n }\n}\n","import type { TranscriptionConfig, AudioConfig, SessionConfig } from '../types';\nimport { TranscriptionProvider, AudioEncoding } from '../types';\n\n/**\n * Validation error details\n */\nexport interface ValidationError {\n /** Field that failed validation */\n field: string;\n /** Error message */\n message: string;\n /** Error code */\n code: string;\n}\n\n/**\n * Validation warning details\n */\nexport interface ValidationWarning {\n /** Field with warning */\n field: string;\n /** Warning message */\n message: string;\n}\n\n/**\n * Result of validation\n */\nexport interface ValidationResult {\n /** Whether validation passed */\n valid: boolean;\n /** List of errors */\n errors: ValidationError[];\n /** List of warnings */\n warnings?: ValidationWarning[];\n}\n\n/**\n * Validate transcription configuration\n * @param config - Configuration to validate\n * @returns Validation result\n */\nexport function validateTranscriptionConfig(config: TranscriptionConfig): ValidationResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n // Check provider\n if (!config.provider) {\n errors.push({\n field: 'provider',\n message: 'Provider is required',\n code: 'REQUIRED_FIELD',\n });\n } else if (!Object.values(TranscriptionProvider).includes(config.provider)) {\n errors.push({\n field: 'provider',\n message: `Invalid provider: ${config.provider}`,\n code: 'INVALID_PROVIDER',\n });\n }\n\n // Check API key for cloud providers\n const cloudProviders = [TranscriptionProvider.Deepgram, TranscriptionProvider.AssemblyAI];\n if (config.provider && cloudProviders.includes(config.provider)) {\n if (!config.apiKey) {\n errors.push({\n field: 'apiKey',\n message: `API key is required for ${config.provider} provider`,\n code: 'REQUIRED_API_KEY',\n });\n } else if (config.apiKey.length < 10) {\n warnings.push({\n field: 'apiKey',\n message: 'API key seems too short',\n });\n }\n }\n\n // Validate language code\n if (config.language && !validateLanguageCode(config.language)) {\n errors.push({\n field: 'language',\n message: `Invalid language code: ${config.language}`,\n code: 'INVALID_LANGUAGE',\n });\n }\n\n // Validate audio config if provided\n if (config.audioConfig) {\n const audioValidation = validateAudioConfig(config.audioConfig);\n errors.push(...audioValidation.errors);\n if (audioValidation.warnings) {\n warnings.push(...audioValidation.warnings);\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings: warnings.length > 0 ? warnings : undefined,\n };\n}\n\n/**\n * Validate audio configuration\n * @param config - Audio config to validate\n * @returns Validation result\n */\nexport function validateAudioConfig(config: AudioConfig): ValidationResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n // Validate sample rate\n if (config.sampleRate !== undefined) {\n if (config.sampleRate < 8000 || config.sampleRate > 48000) {\n errors.push({\n field: 'audioConfig.sampleRate',\n message: 'Sample rate must be between 8000 and 48000',\n code: 'INVALID_SAMPLE_RATE',\n });\n } else if (config.sampleRate !== 16000 && config.sampleRate !== 44100 && config.sampleRate !== 48000) {\n warnings.push({\n field: 'audioConfig.sampleRate',\n message: 'Non-standard sample rate may not be supported by all providers',\n });\n }\n }\n\n // Validate channels\n if (config.channels !== undefined && (config.channels < 1 || config.channels > 2)) {\n errors.push({\n field: 'audioConfig.channels',\n message: 'Channels must be 1 or 2',\n code: 'INVALID_CHANNELS',\n });\n }\n\n // Validate bit depth\n if (config.bitDepth !== undefined && ![8, 16, 24].includes(config.bitDepth)) {\n errors.push({\n field: 'audioConfig.bitDepth',\n message: 'Bit depth must be 8, 16, or 24',\n code: 'INVALID_BIT_DEPTH',\n });\n }\n\n // Validate encoding\n if (config.encoding !== undefined && !Object.values(AudioEncoding).includes(config.encoding)) {\n errors.push({\n field: 'audioConfig.encoding',\n message: `Invalid encoding: ${config.encoding}`,\n code: 'INVALID_ENCODING',\n });\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings: warnings.length > 0 ? warnings : undefined,\n };\n}\n\n/**\n * Validate session configuration\n * @param config - Session config to validate\n * @returns Validation result\n */\nexport function validateSessionConfig(config: SessionConfig): ValidationResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationWarning[] = [];\n\n // Validate maxDuration\n if (config.maxDuration !== undefined && config.maxDuration < 0) {\n errors.push({\n field: 'maxDuration',\n message: 'Max duration must be positive',\n code: 'INVALID_MAX_DURATION',\n });\n }\n\n // Validate silenceTimeout\n if (config.silenceTimeout !== undefined && config.silenceTimeout < 0) {\n errors.push({\n field: 'silenceTimeout',\n message: 'Silence timeout must be positive',\n code: 'INVALID_SILENCE_TIMEOUT',\n });\n }\n\n // Validate VAD threshold\n if (config.vadThreshold !== undefined && (config.vadThreshold < 0 || config.vadThreshold > 1)) {\n errors.push({\n field: 'vadThreshold',\n message: 'VAD threshold must be between 0 and 1',\n code: 'INVALID_VAD_THRESHOLD',\n });\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings: warnings.length > 0 ? warnings : undefined,\n };\n}\n\n/**\n * Validate BCP-47 language code\n * @param code - Language code to validate\n * @returns True if valid\n */\nexport function validateLanguageCode(code: string): boolean {\n // Basic BCP-47 pattern\n const pattern = /^[a-z]{2,3}(-[A-Z]{2})?(-[A-Za-z]{4})?(-[A-Z]{2}|-[0-9]{3})?$/i;\n return pattern.test(code);\n}\n\n/**\n * Validate API key format for a provider\n * @param provider - Transcription provider\n * @param key - API key to validate\n * @returns Validation result\n */\nexport function validateApiKey(provider: TranscriptionProvider, key?: string): ValidationResult {\n const errors: ValidationError[] = [];\n\n // Web Speech API doesn't need API key\n if (provider === TranscriptionProvider.WebSpeechAPI) {\n return { valid: true, errors: [] };\n }\n\n if (!key) {\n errors.push({\n field: 'apiKey',\n message: `API key is required for ${provider}`,\n code: 'MISSING_API_KEY',\n });\n return { valid: false, errors };\n }\n\n // Provider-specific validation\n switch (provider) {\n case TranscriptionProvider.Deepgram:\n // Deepgram keys are typically 40 characters\n if (key.length < 20) {\n errors.push({\n field: 'apiKey',\n message: 'Deepgram API key appears to be too short',\n code: 'INVALID_API_KEY_FORMAT',\n });\n }\n break;\n\n case TranscriptionProvider.AssemblyAI:\n // AssemblyAI keys are typically 32 characters\n if (key.length < 20) {\n errors.push({\n field: 'apiKey',\n message: 'AssemblyAI API key appears to be too short',\n code: 'INVALID_API_KEY_FORMAT',\n });\n }\n break;\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n","/**\n * Browser information\n */\nexport interface BrowserInfo {\n /** Browser name */\n name: string;\n /** Browser version */\n version: string;\n /** Operating system */\n os: string;\n /** Whether device is mobile */\n isMobile: boolean;\n}\n\n/**\n * Support check result\n */\nexport interface SupportCheck {\n /** Whether feature is supported */\n supported: boolean;\n /** Details about support status */\n details: string;\n /** Fallback recommendation if not supported */\n fallback?: string;\n}\n\n/**\n * Full compatibility report\n */\nexport interface CompatibilityReport {\n /** Browser information */\n browser: BrowserInfo;\n /** Web Speech API support */\n webSpeechAPI: SupportCheck;\n /** WebSocket support */\n webSocket: SupportCheck;\n /** Media devices support */\n mediaDevices: SupportCheck;\n /** Audio context support */\n audioContext: SupportCheck;\n /** Overall compatibility */\n overallCompatible: boolean;\n /** Recommendations for improvement */\n recommendations: string[];\n}\n\n/**\n * Get browser information\n * @returns Browser info object\n */\nexport function getBrowserInfo(): BrowserInfo {\n if (typeof window === 'undefined' || typeof navigator === 'undefined') {\n return {\n name: 'Node.js',\n version: typeof process !== 'undefined' ? process.version : 'unknown',\n os: typeof process !== 'undefined' ? process.platform : 'unknown',\n isMobile: false,\n };\n }\n\n const ua = navigator.userAgent;\n let name = 'Unknown';\n let version = 'unknown';\n\n // Detect browser\n if (ua.includes('Firefox/')) {\n name = 'Firefox';\n version = ua.match(/Firefox\\/(\\d+\\.\\d+)/)?.[1] || 'unknown';\n } else if (ua.includes('Edg/')) {\n name = 'Edge';\n version = ua.match(/Edg\\/(\\d+\\.\\d+)/)?.[1] || 'unknown';\n } else if (ua.includes('Chrome/')) {\n name = 'Chrome';\n version = ua.match(/Chrome\\/(\\d+\\.\\d+)/)?.[1] || 'unknown';\n } else if (ua.includes('Safari/') && !ua.includes('Chrome')) {\n name = 'Safari';\n version = ua.match(/Version\\/(\\d+\\.\\d+)/)?.[1] || 'unknown';\n }\n\n // Detect OS\n let os = 'Unknown';\n if (ua.includes('Windows')) os = 'Windows';\n else if (ua.includes('Mac OS')) os = 'macOS';\n else if (ua.includes('Linux')) os = 'Linux';\n else if (ua.includes('Android')) os = 'Android';\n else if (ua.includes('iOS') || ua.includes('iPhone') || ua.includes('iPad')) os = 'iOS';\n\n // Detect mobile\n const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(ua);\n\n return { name, version, os, isMobile };\n}\n\n/**\n * Check Web Speech API support\n * @returns Support check result\n */\nexport function checkWebSpeechAPISupport(): SupportCheck {\n if (typeof window === 'undefined') {\n return {\n supported: false,\n details: 'Web Speech API is only available in browser environments',\n fallback: 'Use Deepgram or AssemblyAI provider in Node.js',\n };\n }\n\n const hasSupport = !!(window.SpeechRecognition || window.webkitSpeechRecognition);\n\n if (hasSupport) {\n const isWebkit = !window.SpeechRecognition && !!window.webkitSpeechRecognition;\n return {\n supported: true,\n details: isWebkit ? 'Supported via webkit prefix' : 'Fully supported',\n };\n }\n\n return {\n supported: false,\n details: 'Web Speech API is not supported in this browser',\n fallback: 'Use Deepgram or AssemblyAI provider instead',\n };\n}\n\n/**\n * Check WebSocket support\n * @returns Support check result\n */\nexport function checkWebSocketSupport(): SupportCheck {\n const hasSupport = typeof WebSocket !== 'undefined';\n\n if (hasSupport) {\n return {\n supported: true,\n details: 'WebSocket is fully supported',\n };\n }\n\n return {\n supported: false,\n details: 'WebSocket is not supported',\n fallback: 'Upgrade to a modern browser',\n };\n}\n\n/**\n * Check media devices support\n * @returns Support check result\n */\nexport function checkMediaDevicesSupport(): SupportCheck {\n if (typeof navigator === 'undefined') {\n return {\n supported: false,\n details: 'Navigator API is not available',\n fallback: 'Run in a browser environment',\n };\n }\n\n const hasGetUserMedia = !!(navigator.mediaDevices && navigator.mediaDevices.getUserMedia);\n const hasEnumerateDevices = !!(navigator.mediaDevices && navigator.mediaDevices.enumerateDevices);\n\n if (hasGetUserMedia && hasEnumerateDevices) {\n return {\n supported: true,\n details: 'Full media devices support',\n };\n }\n\n if (hasGetUserMedia) {\n return {\n supported: true,\n details: 'getUserMedia supported, enumerateDevices not available',\n };\n }\n\n return {\n supported: false,\n details: 'Media devices API is not supported',\n fallback: 'Use HTTPS and a modern browser',\n };\n}\n\n/**\n * Check AudioContext support\n * @returns Support check result\n */\nexport function checkAudioContextSupport(): SupportCheck {\n if (typeof window === 'undefined') {\n return {\n supported: false,\n details: 'AudioContext is only available in browser environments',\n };\n }\n\n const AudioContextClass = window.AudioContext ||\n (window as unknown as { webkitAudioContext: typeof AudioContext }).webkitAudioContext;\n\n if (AudioContextClass) {\n // Check for AudioWorklet support\n const hasWorklet = 'audioWorklet' in AudioContext.prototype;\n return {\n supported: true,\n details: hasWorklet ? 'Full AudioContext support with AudioWorklet' : 'AudioContext supported (no AudioWorklet)',\n };\n }\n\n return {\n supported: false,\n details: 'AudioContext is not supported',\n fallback: 'Use a modern browser',\n };\n}\n\n/**\n * Get comprehensive compatibility report\n * @returns Full compatibility report\n */\nexport function getFullCompatibilityReport(): CompatibilityReport {\n const browser = getBrowserInfo();\n const webSpeechAPI = checkWebSpeechAPISupport();\n const webSocket = checkWebSocketSupport();\n const mediaDevices = checkMediaDevicesSupport();\n const audioContext = checkAudioContextSupport();\n\n const recommendations: string[] = [];\n\n if (!webSpeechAPI.supported) {\n recommendations.push('Consider using Chrome, Edge, or Safari for Web Speech API support');\n }\n\n if (!mediaDevices.supported) {\n recommendations.push('Ensure HTTPS is enabled and grant microphone permissions');\n }\n\n if (!audioContext.supported) {\n recommendations.push('Update to a modern browser for audio processing support');\n }\n\n // Overall compatibility requires at least one transcription method\n const overallCompatible = (webSpeechAPI.supported || webSocket.supported) && mediaDevices.supported;\n\n if (browser.isMobile) {\n recommendations.push('Mobile support may vary; consider testing on desktop for best results');\n }\n\n return {\n browser,\n webSpeechAPI,\n webSocket,\n mediaDevices,\n audioContext,\n overallCompatible,\n recommendations,\n };\n}\n","/**\n * Retry options\n */\nexport interface RetryOptions {\n /** Maximum number of attempts (default: 3) */\n maxAttempts?: number;\n /** Initial delay in ms (default: 1000) */\n delay?: number;\n /** Backoff strategy (default: 'exponential') */\n backoff?: 'linear' | 'exponential';\n /** Maximum delay in ms (default: 30000) */\n maxDelay?: number;\n /** Function to determine if should retry */\n shouldRetry?: (error: unknown) => boolean;\n}\n\n/**\n * Create a debounced function\n * @param func - Function to debounce\n * @param wait - Wait time in ms\n * @returns Debounced function\n */\nexport function debounce<T extends (...args: unknown[]) => unknown>(\n func: T,\n wait: number\n): (...args: Parameters<T>) => void {\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n return function debounced(...args: Parameters<T>): void {\n if (timeoutId) {\n clearTimeout(timeoutId);\n }\n\n timeoutId = setTimeout(() => {\n func.apply(null, args);\n timeoutId = null;\n }, wait);\n };\n}\n\n/**\n * Create a throttled function\n * @param func - Function to throttle\n * @param limit - Minimum interval in ms\n * @returns Throttled function\n */\nexport function throttle<T extends (...args: unknown[]) => unknown>(\n func: T,\n limit: number\n): (...args: Parameters<T>) => void {\n let lastRun = 0;\n let timeoutId: ReturnType<typeof setTimeout> | null = null;\n\n return function throttled(...args: Parameters<T>): void {\n const now = Date.now();\n\n if (now - lastRun >= limit) {\n lastRun = now;\n func.apply(null, args);\n } else if (!timeoutId) {\n const remaining = limit - (now - lastRun);\n timeoutId = setTimeout(() => {\n lastRun = Date.now();\n func.apply(null, args);\n timeoutId = null;\n }, remaining);\n }\n };\n}\n\n/**\n * Async sleep utility\n * @param ms - Milliseconds to sleep\n * @returns Promise that resolves after delay\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * Add timeout to a promise\n * @param promise - Promise to wrap\n * @param ms - Timeout in milliseconds\n * @param message - Error message on timeout\n * @returns Promise that rejects if timeout exceeded\n */\nexport function timeout<T>(\n promise: Promise<T>,\n ms: number,\n message: string = 'Operation timed out'\n): Promise<T> {\n return new Promise((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n reject(new Error(message));\n }, ms);\n\n promise\n .then(result => {\n clearTimeout(timeoutId);\n resolve(result);\n })\n .catch(error => {\n clearTimeout(timeoutId);\n reject(error);\n });\n });\n}\n\n/**\n * Retry a function with backoff\n * @param fn - Async function to retry\n * @param options - Retry options\n * @returns Promise with result\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n options: RetryOptions = {}\n): Promise<T> {\n const {\n maxAttempts = 3,\n delay = 1000,\n backoff = 'exponential',\n maxDelay = 30000,\n shouldRetry = () => true,\n } = options;\n\n let lastError: unknown;\n let currentDelay = delay;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n if (attempt === maxAttempts || !shouldRetry(error)) {\n break;\n }\n\n await sleep(currentDelay);\n\n // Calculate next delay\n if (backoff === 'exponential') {\n currentDelay = Math.min(currentDelay * 2, maxDelay);\n } else {\n currentDelay = Math.min(currentDelay + delay, maxDelay);\n }\n }\n }\n\n throw lastError;\n}\n\n/**\n * Create a cancellable timeout\n * @param ms - Timeout in milliseconds\n * @returns Object with promise and cancel function\n */\nexport function cancellableTimeout(ms: number): { promise: Promise<void>; cancel: () => void } {\n let timeoutId: ReturnType<typeof setTimeout>;\n let rejectFn: (reason?: unknown) => void;\n\n const promise = new Promise<void>((resolve, reject) => {\n rejectFn = reject;\n timeoutId = setTimeout(resolve, ms);\n });\n\n const cancel = (): void => {\n clearTimeout(timeoutId);\n rejectFn(new Error('Timeout cancelled'));\n };\n\n return { promise, cancel };\n}\n\n/**\n * Execute function at regular intervals\n * @param fn - Function to execute\n * @param interval - Interval in ms\n * @param immediate - Execute immediately on start\n * @returns Function to stop the interval\n */\nexport function setIntervalAsync(\n fn: () => Promise<void>,\n interval: number,\n immediate: boolean = false\n): () => void {\n let stopped = false;\n let timeoutId: ReturnType<typeof setTimeout>;\n\n const execute = async (): Promise<void> => {\n if (stopped) return;\n\n try {\n await fn();\n } catch (error) {\n console.error('Interval function error:', error);\n }\n\n if (!stopped) {\n timeoutId = setTimeout(execute, interval);\n }\n };\n\n if (immediate) {\n void execute();\n } else {\n timeoutId = setTimeout(execute, interval);\n }\n\n return (): void => {\n stopped = true;\n clearTimeout(timeoutId);\n };\n}\n","import type { TranscriptionResult } from '../types';\n\n/**\n * Timestamp format options\n */\nexport type TimestampFormat = 'srt' | 'vtt' | 'readable' | 'iso' | 'ms';\n\n/**\n * Display options for transcript formatting\n */\nexport interface DisplayOptions {\n /** Show timestamps */\n showTimestamps?: boolean;\n /** Show confidence scores */\n showConfidence?: boolean;\n /** Highlight interim results */\n highlightInterim?: boolean;\n /** Maximum text length */\n maxLength?: number;\n}\n\n/**\n * Format duration in milliseconds to readable string\n * @param ms - Duration in milliseconds\n * @returns Formatted string (e.g., \"2m 30s\")\n */\nexport function formatDuration(ms: number): string {\n if (ms < 0) return '0s';\n\n const seconds = Math.floor(ms / 1000);\n const minutes = Math.floor(seconds / 60);\n const hours = Math.floor(minutes / 60);\n\n const remainingMinutes = minutes % 60;\n const remainingSeconds = seconds % 60;\n\n if (hours > 0) {\n return `${hours}h ${remainingMinutes}m`;\n }\n if (minutes > 0) {\n return `${minutes}m ${remainingSeconds}s`;\n }\n return `${seconds}s`;\n}\n\n/**\n * Format timestamp to specified format\n * @param ms - Time in milliseconds\n * @param format - Output format\n * @returns Formatted timestamp\n */\nexport function formatTimestamp(ms: number, format: TimestampFormat = 'readable'): string {\n if (ms < 0) ms = 0;\n\n const totalSeconds = Math.floor(ms / 1000);\n const hours = Math.floor(totalSeconds / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = totalSeconds % 60;\n const milliseconds = Math.floor(ms % 1000);\n\n const pad = (n: number, length: number = 2): string => String(n).padStart(length, '0');\n\n switch (format) {\n case 'srt':\n return `${pad(hours)}:${pad(minutes)}:${pad(seconds)},${pad(milliseconds, 3)}`;\n\n case 'vtt':\n return `${pad(hours)}:${pad(minutes)}:${pad(seconds)}.${pad(milliseconds, 3)}`;\n\n case 'readable':\n if (hours > 0) {\n return `${hours}:${pad(minutes)}:${pad(seconds)}`;\n }\n return `${minutes}:${pad(seconds)}`;\n\n case 'iso':\n return new Date(ms).toISOString();\n\n case 'ms':\n return String(ms);\n\n default:\n return String(ms);\n }\n}\n\n/**\n * Format confidence score as percentage\n * @param confidence - Confidence value (0-1)\n * @returns Formatted percentage string\n */\nexport function formatConfidence(confidence: number): string {\n if (confidence < 0 || confidence > 1) {\n return 'N/A';\n }\n return `${Math.round(confidence * 100)}%`;\n}\n\n/**\n * Format file size in bytes to human-readable string\n * @param bytes - Size in bytes\n * @returns Formatted size string\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes < 0) return '0 B';\n\n const units = ['B', 'KB', 'MB', 'GB', 'TB'];\n let unitIndex = 0;\n let size = bytes;\n\n while (size >= 1024 && unitIndex < units.length - 1) {\n size /= 1024;\n unitIndex++;\n }\n\n return `${size.toFixed(unitIndex > 0 ? 1 : 0)} ${units[unitIndex]}`;\n}\n\n/**\n * Format transcripts for display\n * @param results - Transcription results\n * @param options - Display options\n * @returns Formatted string\n */\nexport function formatTranscriptForDisplay(\n results: TranscriptionResult[],\n options: DisplayOptions = {}\n): string {\n const {\n showTimestamps = false,\n showConfidence = false,\n highlightInterim = false,\n maxLength,\n } = options;\n\n const parts: string[] = [];\n\n for (const result of results) {\n let text = result.text;\n\n // Add prefix markers\n const prefix: string[] = [];\n\n if (showTimestamps && result.timestamp) {\n const time = formatTimestamp(result.timestamp, 'readable');\n prefix.push(`[${time}]`);\n }\n\n if (result.speaker) {\n prefix.push(`${result.speaker}:`);\n }\n\n if (showConfidence && result.confidence !== undefined) {\n prefix.push(`(${formatConfidence(result.confidence)})`);\n }\n\n // Format text\n if (highlightInterim && !result.isFinal) {\n text = `*${text}*`;\n }\n\n // Combine\n const line = prefix.length > 0 ? `${prefix.join(' ')} ${text}` : text;\n parts.push(line);\n }\n\n let output = parts.join('\\n');\n\n // Truncate if needed\n if (maxLength && output.length > maxLength) {\n output = output.substring(0, maxLength - 3) + '...';\n }\n\n return output;\n}\n\n/**\n * Format transcript as plain text\n * @param results - Transcription results\n * @param finalOnly - Only include final results\n * @returns Plain text string\n */\nexport function formatAsPlainText(results: TranscriptionResult[], finalOnly: boolean = true): string {\n const filtered = finalOnly ? results.filter(r => r.isFinal) : results;\n return filtered.map(r => r.text).join(' ').trim();\n}\n\n/**\n * Format number with thousand separators\n * @param num - Number to format\n * @returns Formatted string\n */\nexport function formatNumber(num: number): string {\n return num.toLocaleString();\n}\n\n/**\n * Truncate text with ellipsis\n * @param text - Text to truncate\n * @param maxLength - Maximum length\n * @returns Truncated text\n */\nexport function truncateText(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n return text.substring(0, maxLength - 3) + '...';\n}\n","import { TranscriptionProvider } from '../types';\n\n/**\n * Language information\n */\nexport interface LanguageInfo {\n /** Language code (e.g., 'en-US') */\n code: string;\n /** English name */\n name: string;\n /** Native name */\n nativeName: string;\n /** Provider that supports this language */\n provider: TranscriptionProvider;\n}\n\n/**\n * Common language codes with their names\n */\nconst LANGUAGE_MAP: Record<string, { name: string; nativeName: string }> = {\n 'en': { name: 'English', nativeName: 'English' },\n 'en-US': { name: 'English (US)', nativeName: 'English (US)' },\n 'en-GB': { name: 'English (UK)', nativeName: 'English (UK)' },\n 'en-AU': { name: 'English (Australia)', nativeName: 'English (Australia)' },\n 'en-CA': { name: 'English (Canada)', nativeName: 'English (Canada)' },\n 'en-IN': { name: 'English (India)', nativeName: 'English (India)' },\n 'es': { name: 'Spanish', nativeName: 'Español' },\n 'es-ES': { name: 'Spanish (Spain)', nativeName: 'Español (España)' },\n 'es-MX': { name: 'Spanish (Mexico)', nativeName: 'Español (México)' },\n 'es-419': { name: 'Spanish (Latin America)', nativeName: 'Español (Latinoamérica)' },\n 'fr': { name: 'French', nativeName: 'Français' },\n 'fr-FR': { name: 'French (France)', nativeName: 'Français (France)' },\n 'fr-CA': { name: 'French (Canada)', nativeName: 'Français (Canada)' },\n 'de': { name: 'German', nativeName: 'Deutsch' },\n 'de-DE': { name: 'German (Germany)', nativeName: 'Deutsch (Deutschland)' },\n 'it': { name: 'Italian', nativeName: 'Italiano' },\n 'it-IT': { name: 'Italian (Italy)', nativeName: 'Italiano (Italia)' },\n 'pt': { name: 'Portuguese', nativeName: 'Português' },\n 'pt-BR': { name: 'Portuguese (Brazil)', nativeName: 'Português (Brasil)' },\n 'pt-PT': { name: 'Portuguese (Portugal)', nativeName: 'Português (Portugal)' },\n 'nl': { name: 'Dutch', nativeName: 'Nederlands' },\n 'nl-NL': { name: 'Dutch (Netherlands)', nativeName: 'Nederlands (Nederland)' },\n 'ja': { name: 'Japanese', nativeName: '日本語' },\n 'ja-JP': { name: 'Japanese (Japan)', nativeName: '日本語 (日本)' },\n 'ko': { name: 'Korean', nativeName: '한국어' },\n 'ko-KR': { name: 'Korean (Korea)', nativeName: '한국어 (대한민국)' },\n 'zh': { name: 'Chinese', nativeName: '中文' },\n 'zh-CN': { name: 'Chinese (Simplified)', nativeName: '中文 (简体)' },\n 'zh-TW': { name: 'Chinese (Traditional)', nativeName: '中文 (繁體)' },\n 'ru': { name: 'Russian', nativeName: 'Русский' },\n 'ru-RU': { name: 'Russian (Russia)', nativeName: 'Русский (Россия)' },\n 'ar': { name: 'Arabic', nativeName: 'العربية' },\n 'ar-SA': { name: 'Arabic (Saudi Arabia)', nativeName: 'العربية (السعودية)' },\n 'hi': { name: 'Hindi', nativeName: 'हिन्दी' },\n 'hi-IN': { name: 'Hindi (India)', nativeName: 'हिन्दी (भारत)' },\n 'tr': { name: 'Turkish', nativeName: 'Türkçe' },\n 'tr-TR': { name: 'Turkish (Turkey)', nativeName: 'Türkçe (Türkiye)' },\n 'pl': { name: 'Polish', nativeName: 'Polski' },\n 'pl-PL': { name: 'Polish (Poland)', nativeName: 'Polski (Polska)' },\n 'uk': { name: 'Ukrainian', nativeName: 'Українська' },\n 'uk-UA': { name: 'Ukrainian (Ukraine)', nativeName: 'Українська (Україна)' },\n 'sv': { name: 'Swedish', nativeName: 'Svenska' },\n 'sv-SE': { name: 'Swedish (Sweden)', nativeName: 'Svenska (Sverige)' },\n 'da': { name: 'Danish', nativeName: 'Dansk' },\n 'da-DK': { name: 'Danish (Denmark)', nativeName: 'Dansk (Danmark)' },\n 'no': { name: 'Norwegian', nativeName: 'Norsk' },\n 'no-NO': { name: 'Norwegian (Norway)', nativeName: 'Norsk (Norge)' },\n 'fi': { name: 'Finnish', nativeName: 'Suomi' },\n 'fi-FI': { name: 'Finnish (Finland)', nativeName: 'Suomi (Suomi)' },\n};\n\n/**\n * Languages supported by each provider\n */\nconst PROVIDER_LANGUAGES: Record<TranscriptionProvider, string[]> = {\n [TranscriptionProvider.WebSpeechAPI]: [\n 'en-US', 'en-GB', 'en-AU', 'en-CA', 'en-IN',\n 'es-ES', 'es-MX', 'fr-FR', 'de-DE', 'it-IT',\n 'pt-BR', 'pt-PT', 'ja-JP', 'ko-KR', 'zh-CN',\n 'zh-TW', 'ru-RU', 'ar-SA', 'hi-IN', 'nl-NL',\n ],\n [TranscriptionProvider.Deepgram]: [\n 'en', 'en-US', 'en-GB', 'en-AU', 'en-IN',\n 'es', 'es-ES', 'es-419',\n 'fr', 'fr-FR', 'fr-CA',\n 'de', 'de-DE',\n 'it', 'it-IT',\n 'pt', 'pt-BR', 'pt-PT',\n 'nl', 'nl-NL',\n 'ja', 'ja-JP',\n 'ko', 'ko-KR',\n 'zh', 'zh-CN', 'zh-TW',\n 'ru', 'ru-RU',\n 'uk', 'uk-UA',\n 'hi', 'hi-IN',\n 'tr', 'tr-TR',\n 'pl', 'pl-PL',\n 'sv', 'sv-SE',\n 'da', 'da-DK',\n 'no', 'no-NO',\n 'fi', 'fi-FI',\n ],\n [TranscriptionProvider.AssemblyAI]: [\n 'en', 'en-US', 'en-GB', 'en-AU',\n ],\n [TranscriptionProvider.Custom]: [],\n};\n\n/**\n * Get supported languages for a provider\n * @param provider - Transcription provider\n * @returns Array of language info\n */\nexport function getSupportedLanguages(provider: TranscriptionProvider): LanguageInfo[] {\n const codes = PROVIDER_LANGUAGES[provider] || [];\n return codes.map(code => {\n const info = LANGUAGE_MAP[code] || { name: code, nativeName: code };\n return {\n code,\n name: info.name,\n nativeName: info.nativeName,\n provider,\n };\n });\n}\n\n/**\n * Normalize language code to standard format\n * @param code - Language code to normalize\n * @returns Normalized code\n */\nexport function normalizeLanguageCode(code: string): string {\n if (!code) return 'en-US';\n\n // Handle common variations\n const normalized = code.trim();\n\n // Split into parts\n const parts = normalized.split(/[-_]/);\n\n if (parts.length === 1) {\n // Just language code\n return parts[0].toLowerCase();\n }\n\n // Language and region\n const language = parts[0].toLowerCase();\n const region = parts[1].toUpperCase();\n\n return `${language}-${region}`;\n}\n\n/**\n * Get human-readable language name\n * @param code - Language code\n * @returns Language name or code if unknown\n */\nexport function getLanguageName(code: string): string {\n const normalized = normalizeLanguageCode(code);\n const info = LANGUAGE_MAP[normalized];\n return info?.name || code;\n}\n\n/**\n * Get native language name\n * @param code - Language code\n * @returns Native name or code if unknown\n */\nexport function getNativeLanguageName(code: string): string {\n const normalized = normalizeLanguageCode(code);\n const info = LANGUAGE_MAP[normalized];\n return info?.nativeName || code;\n}\n\n/**\n * Detect browser language\n * @returns Detected language code\n */\nexport function detectBrowserLanguage(): string {\n if (typeof navigator === 'undefined') {\n return 'en-US';\n }\n\n const browserLang = navigator.language || (navigator as { userLanguage?: string }).userLanguage;\n return normalizeLanguageCode(browserLang || 'en-US');\n}\n\n/**\n * Check if language is supported by provider\n * @param code - Language code\n * @param provider - Transcription provider\n * @returns True if supported\n */\nexport function isLanguageSupported(code: string, provider: TranscriptionProvider): boolean {\n const normalized = normalizeLanguageCode(code);\n const supported = PROVIDER_LANGUAGES[provider] || [];\n\n // Check exact match\n if (supported.includes(normalized)) {\n return true;\n }\n\n // Check base language\n const baseLang = normalized.split('-')[0];\n return supported.includes(baseLang);\n}\n\n/**\n * Get best matching language for provider\n * @param code - Preferred language code\n * @param provider - Transcription provider\n * @returns Best matching language code or default\n */\nexport function getBestMatchingLanguage(code: string, provider: TranscriptionProvider): string {\n const normalized = normalizeLanguageCode(code);\n const supported = PROVIDER_LANGUAGES[provider] || [];\n\n // Check exact match\n if (supported.includes(normalized)) {\n return normalized;\n }\n\n // Check base language match\n const baseLang = normalized.split('-')[0];\n if (supported.includes(baseLang)) {\n return baseLang;\n }\n\n // Find any match with same base language\n const match = supported.find(s => s.startsWith(baseLang + '-'));\n if (match) {\n return match;\n }\n\n // Default to en-US or first supported\n return supported.includes('en-US') ? 'en-US' : (supported[0] || 'en-US');\n}\n","/**\n * Generate a unique ID\n * @param prefix - Optional prefix\n * @returns Unique ID string\n */\nexport function generateId(prefix?: string): string {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 9);\n const id = `${timestamp}-${random}`;\n return prefix ? `${prefix}-${id}` : id;\n}\n\n/**\n * Deep clone an object\n * @param obj - Object to clone\n * @returns Cloned object\n */\nexport function deepClone<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(item => deepClone(item)) as unknown as T;\n }\n\n if (obj instanceof Date) {\n return new Date(obj.getTime()) as unknown as T;\n }\n\n if (obj instanceof ArrayBuffer) {\n return obj.slice(0) as unknown as T;\n }\n\n const cloned = {} as T;\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n cloned[key] = deepClone(obj[key]);\n }\n }\n return cloned;\n}\n\n/**\n * Deep merge multiple objects\n * @param objects - Objects to merge\n * @returns Merged object\n */\nexport function mergeDeep<T extends Record<string, unknown>>(...objects: Partial<T>[]): T {\n const result = {} as T;\n\n for (const obj of objects) {\n if (!obj) continue;\n\n for (const key in obj) {\n if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;\n\n const value = obj[key];\n const existing = result[key as keyof T];\n\n if (isObject(value) && isObject(existing)) {\n result[key as keyof T] = mergeDeep(\n existing as Record<string, unknown>,\n value as Record<string, unknown>\n ) as T[keyof T];\n } else {\n result[key as keyof T] = value as T[keyof T];\n }\n }\n }\n\n return result;\n}\n\n/**\n * Check if value is a function\n * @param value - Value to check\n * @returns True if function\n */\nexport function isFunction(value: unknown): value is (...args: unknown[]) => unknown {\n return typeof value === 'function';\n}\n\n/**\n * Check if value is a plain object\n * @param value - Value to check\n * @returns True if object\n */\nexport function isObject(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * Check if value is empty\n * @param value - Value to check\n * @returns True if empty\n */\nexport function isEmpty(value: unknown): boolean {\n if (value === null || value === undefined) return true;\n if (typeof value === 'string') return value.length === 0;\n if (Array.isArray(value)) return value.length === 0;\n if (isObject(value)) return Object.keys(value).length === 0;\n return false;\n}\n\n/**\n * Pick specific properties from object\n * @param obj - Source object\n * @param keys - Keys to pick\n * @returns New object with selected keys\n */\nexport function pick<T extends Record<string, unknown>, K extends keyof T>(\n obj: T,\n keys: K[]\n): Pick<T, K> {\n const result = {} as Pick<T, K>;\n for (const key of keys) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n result[key] = obj[key];\n }\n }\n return result;\n}\n\n/**\n * Omit specific properties from object\n * @param obj - Source object\n * @param keys - Keys to omit\n * @returns New object without selected keys\n */\nexport function omit<T extends Record<string, unknown>, K extends keyof T>(\n obj: T,\n keys: K[]\n): Omit<T, K> {\n const result = { ...obj };\n for (const key of keys) {\n delete result[key];\n }\n return result;\n}\n\n/**\n * Create a promise that resolves after a condition is met\n * @param condition - Function that returns true when condition is met\n * @param interval - Check interval in ms\n * @param timeout - Maximum wait time in ms\n * @returns Promise that resolves when condition is met\n */\nexport function waitFor(\n condition: () => boolean,\n interval: number = 100,\n timeout: number = 5000\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const startTime = Date.now();\n\n const check = (): void => {\n if (condition()) {\n resolve();\n return;\n }\n\n if (Date.now() - startTime > timeout) {\n reject(new Error('Timeout waiting for condition'));\n return;\n }\n\n setTimeout(check, interval);\n };\n\n check();\n });\n}\n\n/**\n * Group array items by key\n * @param array - Array to group\n * @param keyFn - Function to get key from item\n * @returns Grouped object\n */\nexport function groupBy<T, K extends string | number>(\n array: T[],\n keyFn: (item: T) => K\n): Record<K, T[]> {\n return array.reduce((result, item) => {\n const key = keyFn(item);\n if (!result[key]) {\n result[key] = [];\n }\n result[key].push(item);\n return result;\n }, {} as Record<K, T[]>);\n}\n\n/**\n * Ensure value is within range\n * @param value - Value to clamp\n * @param min - Minimum value\n * @param max - Maximum value\n * @returns Clamped value\n */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Round number to specified decimal places\n * @param value - Number to round\n * @param decimals - Number of decimal places\n * @returns Rounded number\n */\nexport function round(value: number, decimals: number = 0): number {\n const factor = Math.pow(10, decimals);\n return Math.round(value * factor) / factor;\n}\n","import type { AudioConfig } from '../types';\n\n/**\n * Audio format information\n */\nexport interface AudioFormatInfo {\n /** Detected format */\n format: string;\n /** Sample rate in Hz */\n sampleRate?: number;\n /** Number of channels */\n channels?: number;\n /** Bit depth */\n bitDepth?: number;\n /** Duration in seconds */\n duration?: number;\n}\n\n/**\n * Calculate audio bitrate\n * @param sampleRate - Sample rate in Hz\n * @param bitDepth - Bits per sample\n * @param channels - Number of channels\n * @returns Bitrate in bits per second\n */\nexport function calculateBitrate(sampleRate: number, bitDepth: number, channels: number): number {\n return sampleRate * bitDepth * channels;\n}\n\n/**\n * Estimate audio file size\n * @param durationMs - Duration in milliseconds\n * @param config - Audio configuration\n * @returns Estimated size in bytes\n */\nexport function estimateAudioSize(durationMs: number, config: AudioConfig): number {\n const sampleRate = config.sampleRate || 16000;\n const bitDepth = config.bitDepth || 16;\n const channels = config.channels || 1;\n\n const durationSec = durationMs / 1000;\n const bytesPerSecond = (sampleRate * bitDepth * channels) / 8;\n\n return Math.ceil(durationSec * bytesPerSecond);\n}\n\n/**\n * Get optimal buffer size for sample rate\n * @param sampleRate - Sample rate in Hz\n * @returns Optimal buffer size (power of 2)\n */\nexport function getOptimalBufferSize(sampleRate: number): number {\n // Target ~20ms of audio per buffer for low latency\n const targetSamples = sampleRate * 0.02;\n\n // Round up to nearest power of 2\n let bufferSize = 256;\n while (bufferSize < targetSamples && bufferSize < 16384) {\n bufferSize *= 2;\n }\n\n // Ensure minimum of 256 for stability\n return Math.max(256, bufferSize);\n}\n\n/**\n * Validate and detect audio format from ArrayBuffer\n * @param data - Audio data\n * @returns Audio format information\n */\nexport function validateAudioFormat(data: ArrayBuffer): AudioFormatInfo {\n const view = new DataView(data);\n\n // Check for WAV format\n if (data.byteLength >= 44) {\n const riff = String.fromCharCode(view.getUint8(0), view.getUint8(1), view.getUint8(2), view.getUint8(3));\n const wave = String.fromCharCode(view.getUint8(8), view.getUint8(9), view.getUint8(10), view.getUint8(11));\n\n if (riff === 'RIFF' && wave === 'WAVE') {\n return parseWavHeader(view);\n }\n }\n\n // Check for raw PCM (heuristic)\n return {\n format: 'raw',\n };\n}\n\n/**\n * Parse WAV header\n * @param view - DataView of WAV file\n * @returns Audio format information\n */\nfunction parseWavHeader(view: DataView): AudioFormatInfo {\n try {\n const channels = view.getUint16(22, true);\n const sampleRate = view.getUint32(24, true);\n const bitDepth = view.getUint16(34, true);\n const dataSize = view.getUint32(40, true);\n\n const duration = dataSize / (sampleRate * channels * (bitDepth / 8));\n\n return {\n format: 'wav',\n sampleRate,\n channels,\n bitDepth,\n duration,\n };\n } catch {\n return { format: 'wav' };\n }\n}\n\n/**\n * Calculate RMS (Root Mean Square) of audio buffer\n * @param buffer - Audio samples\n * @returns RMS value (0-1)\n */\nexport function calculateRMS(buffer: Float32Array): number {\n let sum = 0;\n for (let i = 0; i < buffer.length; i++) {\n sum += buffer[i] * buffer[i];\n }\n return Math.sqrt(sum / buffer.length);\n}\n\n/**\n * Calculate peak amplitude of audio buffer\n * @param buffer - Audio samples\n * @returns Peak value (0-1)\n */\nexport function calculatePeak(buffer: Float32Array): number {\n let peak = 0;\n for (let i = 0; i < buffer.length; i++) {\n const abs = Math.abs(buffer[i]);\n if (abs > peak) peak = abs;\n }\n return peak;\n}\n\n/**\n * Convert decibels to linear amplitude\n * @param db - Value in decibels\n * @returns Linear amplitude\n */\nexport function dbToLinear(db: number): number {\n return Math.pow(10, db / 20);\n}\n\n/**\n * Convert linear amplitude to decibels\n * @param linear - Linear amplitude\n * @returns Value in decibels\n */\nexport function linearToDb(linear: number): number {\n if (linear <= 0) return -Infinity;\n return 20 * Math.log10(linear);\n}\n\n/**\n * Check if audio data contains silence\n * @param buffer - Audio samples\n * @param threshold - Silence threshold (default: 0.001)\n * @returns True if mostly silence\n */\nexport function isSilence(buffer: Float32Array, threshold: number = 0.001): boolean {\n const rms = calculateRMS(buffer);\n return rms < threshold;\n}\n\n/**\n * Get audio constraints for getUserMedia\n * @param config - Audio configuration\n * @returns MediaStreamConstraints for audio\n */\nexport function getAudioConstraints(config: AudioConfig = {}): MediaTrackConstraints {\n return {\n sampleRate: config.sampleRate || 16000,\n channelCount: config.channels || 1,\n echoCancellation: true,\n noiseSuppression: true,\n autoGainControl: true,\n };\n}\n\n/**\n * Calculate audio duration from samples\n * @param samples - Number of samples\n * @param sampleRate - Sample rate in Hz\n * @returns Duration in milliseconds\n */\nexport function samplesToDuration(samples: number, sampleRate: number): number {\n return (samples / sampleRate) * 1000;\n}\n\n/**\n * Calculate samples from duration\n * @param durationMs - Duration in milliseconds\n * @param sampleRate - Sample rate in Hz\n * @returns Number of samples\n */\nexport function durationToSamples(durationMs: number, sampleRate: number): number {\n return Math.round((durationMs / 1000) * sampleRate);\n}\n","/**\n * Live Transcribe - Professional live speech transcription library\n * @module live-transcribe\n */\n\n// Core exports\nexport { EventEmitter } from './core/EventEmitter';\nexport { BaseTranscriber } from './core/BaseTranscriber';\nexport { TranscriptionSession, type SessionExport } from './core/TranscriptionSession';\nexport { SessionManager, type SessionManagerOptions } from './core/SessionManager';\n\n// Provider exports\nexport { WebSpeechProvider } from './providers/WebSpeechProvider';\nexport { DeepgramProvider, type DeepgramOptions } from './providers/DeepgramProvider';\nexport { AssemblyAIProvider, type AssemblyAIOptions } from './providers/AssemblyAIProvider';\n\n// Type exports\nexport * from './types';\n\n// Utility exports\nexport * from './utils';\n\n// Import types for factory functions\nimport type {\n TranscriptionConfig,\n SessionConfig,\n ITranscriptionProvider,\n TranscriptionResult,\n} from './types';\nimport {\n TranscriptionProvider,\n TranscriptionError,\n ErrorCode,\n} from './types';\nimport { WebSpeechProvider } from './providers/WebSpeechProvider';\nimport { DeepgramProvider } from './providers/DeepgramProvider';\nimport { AssemblyAIProvider } from './providers/AssemblyAIProvider';\nimport { TranscriptionSession } from './core/TranscriptionSession';\nimport { SessionManager } from './core/SessionManager';\nimport { BaseTranscriber } from './core/BaseTranscriber';\n\n/**\n * Library version\n */\nexport const VERSION = '0.1.0';\n\n/**\n * Library name\n */\nexport const LIBRARY_NAME = 'live-transcribe';\n\n/**\n * Quick start options for simplified initialization\n */\nexport interface QuickStartOptions {\n /** Transcription provider (default: auto-detect) */\n provider?: TranscriptionProvider;\n /** API key for cloud providers */\n apiKey?: string;\n /** Language code (default: 'en-US') */\n language?: string;\n /** Callback for transcript events */\n onTranscript?: (result: TranscriptionResult) => void;\n /** Callback for error events */\n onError?: (error: TranscriptionError) => void;\n /** Callback when transcription starts */\n onStart?: () => void;\n /** Callback when transcription stops */\n onStop?: () => void;\n /** Enable interim results (default: true) */\n interimResults?: boolean;\n /** Enable audio recording */\n recordAudio?: boolean;\n}\n\n/**\n * Create a transcription provider instance\n * @param config - Transcription configuration\n * @returns Configured provider instance\n * @example\n * ```typescript\n * const provider = createTranscriber({\n * provider: TranscriptionProvider.WebSpeechAPI,\n * language: 'en-US'\n * });\n * ```\n */\nexport function createTranscriber(config: TranscriptionConfig): ITranscriptionProvider {\n switch (config.provider) {\n case TranscriptionProvider.WebSpeechAPI:\n return new WebSpeechProvider(config);\n\n case TranscriptionProvider.Deepgram:\n if (!config.apiKey) {\n throw new TranscriptionError(\n 'API key is required for Deepgram provider',\n ErrorCode.INVALID_CONFIG,\n TranscriptionProvider.Deepgram\n );\n }\n return new DeepgramProvider(config);\n\n case TranscriptionProvider.AssemblyAI:\n if (!config.apiKey) {\n throw new TranscriptionError(\n 'API key is required for AssemblyAI provider',\n ErrorCode.INVALID_CONFIG,\n TranscriptionProvider.AssemblyAI\n );\n }\n return new AssemblyAIProvider(config);\n\n case TranscriptionProvider.Custom:\n throw new TranscriptionError(\n 'Custom provider requires manual implementation',\n ErrorCode.INVALID_CONFIG\n );\n\n default:\n throw new TranscriptionError(\n `Unsupported provider: ${config.provider}`,\n ErrorCode.INVALID_CONFIG\n );\n }\n}\n\n/**\n * Create a transcription session with a configured provider\n * @param config - Transcription configuration\n * @param sessionConfig - Optional session configuration\n * @returns Configured TranscriptionSession\n * @example\n * ```typescript\n * const session = createSession({\n * provider: TranscriptionProvider.Deepgram,\n * apiKey: 'your-api-key',\n * language: 'en-US'\n * }, {\n * recordAudio: true\n * });\n * ```\n */\nexport function createSession(\n config: TranscriptionConfig,\n sessionConfig?: SessionConfig\n): TranscriptionSession {\n const provider = createTranscriber(config);\n return new TranscriptionSession(provider, sessionConfig);\n}\n\n/**\n * Quick start transcription with minimal configuration\n * Auto-detects the best available provider and handles initialization\n * @param options - Quick start options\n * @returns Ready-to-use TranscriptionSession\n * @example\n * ```typescript\n * const session = await quickStart({\n * language: 'en-US',\n * onTranscript: (result) => console.log(result.text),\n * onError: (error) => console.error(error)\n * });\n *\n * // Session is already started and transcribing\n * // Stop when done:\n * await session.stop();\n * ```\n */\nexport async function quickStart(options: QuickStartOptions = {}): Promise<TranscriptionSession> {\n const {\n provider: requestedProvider,\n apiKey,\n language = 'en-US',\n onTranscript,\n onError,\n onStart,\n onStop,\n interimResults = true,\n recordAudio = false,\n } = options;\n\n // Auto-detect provider if not specified\n let provider = requestedProvider;\n if (!provider) {\n if (apiKey) {\n // If API key provided, default to Deepgram\n provider = TranscriptionProvider.Deepgram;\n } else if (typeof window !== 'undefined') {\n // Browser without API key: use Web Speech API\n const hasWebSpeech = !!(window.SpeechRecognition || window.webkitSpeechRecognition);\n if (hasWebSpeech) {\n provider = TranscriptionProvider.WebSpeechAPI;\n } else {\n throw new TranscriptionError(\n 'No speech recognition available. Provide an API key for Deepgram or AssemblyAI.',\n ErrorCode.UNSUPPORTED_BROWSER\n );\n }\n } else {\n throw new TranscriptionError(\n 'Provider must be specified in Node.js environment',\n ErrorCode.INVALID_CONFIG\n );\n }\n }\n\n // Create configuration\n const transcriptionConfig: TranscriptionConfig = {\n provider,\n apiKey,\n language,\n interimResults,\n };\n\n const sessionConfig: SessionConfig = {\n recordAudio,\n };\n\n // Create provider and session\n const transcriber = createTranscriber(transcriptionConfig) as BaseTranscriber;\n const session = new TranscriptionSession(transcriber, sessionConfig);\n\n // Set up event handlers\n if (onTranscript) {\n transcriber.on('transcript', onTranscript);\n }\n if (onError) {\n transcriber.on('error', onError);\n }\n if (onStart) {\n transcriber.on('start', onStart);\n }\n if (onStop) {\n transcriber.on('stop', onStop);\n }\n\n // Initialize and start\n try {\n await transcriber.initialize();\n await session.start();\n } catch (error) {\n if (onError && error instanceof TranscriptionError) {\n onError(error);\n }\n throw error;\n }\n\n return session;\n}\n\n/**\n * Check if a specific provider is supported in the current environment\n * @param provider - Provider to check\n * @returns True if provider is supported\n */\nexport function isProviderSupported(provider: TranscriptionProvider): boolean {\n switch (provider) {\n case TranscriptionProvider.WebSpeechAPI:\n return new WebSpeechProvider({ provider }).isSupported();\n case TranscriptionProvider.Deepgram:\n return new DeepgramProvider({ provider, apiKey: 'test' }).isSupported();\n case TranscriptionProvider.AssemblyAI:\n return new AssemblyAIProvider({ provider, apiKey: 'test' }).isSupported();\n default:\n return false;\n }\n}\n\n/**\n * Get list of supported providers in current environment\n * @returns Array of supported providers\n */\nexport function getSupportedProviders(): TranscriptionProvider[] {\n const providers: TranscriptionProvider[] = [];\n\n if (isProviderSupported(TranscriptionProvider.WebSpeechAPI)) {\n providers.push(TranscriptionProvider.WebSpeechAPI);\n }\n if (isProviderSupported(TranscriptionProvider.Deepgram)) {\n providers.push(TranscriptionProvider.Deepgram);\n }\n if (isProviderSupported(TranscriptionProvider.AssemblyAI)) {\n providers.push(TranscriptionProvider.AssemblyAI);\n }\n\n return providers;\n}\n\n// Default export for convenience\nexport default {\n VERSION,\n LIBRARY_NAME,\n createTranscriber,\n createSession,\n quickStart,\n isProviderSupported,\n getSupportedProviders,\n TranscriptionProvider,\n WebSpeechProvider,\n DeepgramProvider,\n AssemblyAIProvider,\n TranscriptionSession,\n SessionManager,\n};\n"]}
|